Name: series-workflowrfgn7 Phase: Succeeded StartedAt: 2026-08-19 06:43:11 +0000 UTC FinishedAt: 2026-08-19 11:28:13 +0000 UTC Input: nil Output: nil --------- Name: series-workflowrfgn7[0] Phase: Succeeded StartedAt: 2026-08-19 06:43:11 +0000 UTC FinishedAt: 2026-08-19 07:45:23 +0000 UTC Input: nil Output: nil --------- Name: series-workflowrfgn7[0].run-triage Phase: Succeeded StartedAt: 2026-08-19 06:43:11 +0000 UTC FinishedAt: 2026-08-19 07:45:23 +0000 UTC Input: nil Output: &Outputs{Parameters:[]Parameter{Parameter{Name:result,Default:nil,Value:*{ "skip_reason": "", "targets": [ { "base": { "arch": "amd64", "tree_name": "bpf-next", "tree_url": "https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git", "commit_hash": "f79066c784022fda83f5936559a1af414e41b603", "config_name": "upstream-apparmor-kasan.config", "enable_configs": [ "MEMCG", "BPF_SYSCALL" ], "series_id": "" }, "patched": { "arch": "amd64", "tree_name": "bpf-next", "tree_url": "https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git", "commit_hash": "f79066c784022fda83f5936559a1af414e41b603", "config_name": "upstream-apparmor-kasan.config", "enable_configs": [ "MEMCG", "BPF_SYSCALL" ], "series_id": "8d9574dc-d2aa-4392-9d3a-291297bace73" }, "track": "KASAN", "fuzz": { "focus": null, "focus_symbols": [ "bpf_proactive_reclaim", "bpf_proactive_reclaim_swappiness" ], "corpus_urls": [ "https://storage.googleapis.com/syzkaller/corpus/ci-upstream-bpf-kasan-gce-corpus.db", "https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db" ], "skip_cover_check": true, "bug_title_re": "" }, "retest": null } ], "trajectory": "CjwhZG9jdHlwZSBodG1sPgo8aHRtbD4KPGhlYWQ+Cgk8dGl0bGU+QUkgVHJhamVjdG9yeTwvdGl0bGU+Cgk8c3R5bGU+CgkJdGFibGUgewoJCQlib3JkZXI6IDFweCBzb2xpZCAjY2NjOwoJCQltYXJnaW46IDIwcHggNXB4OwoJCQlib3JkZXItY29sbGFwc2U6IGNvbGxhcHNlOwoJCQl3aGl0ZS1zcGFjZTogbm93cmFwOwoJCQl0ZXh0LW92ZXJmbG93OiBlbGxpcHNpczsKCQkJb3ZlcmZsb3c6IGhpZGRlbjsKCQl9CgoJCXRhYmxlIGNhcHRpb24gewoJCQlmb250LXdlaWdodDogYm9sZDsKCQl9CgoJCXRhYmxlIHRkLCB0YWJsZSB0aCB7CgkJCXZlcnRpY2FsLWFsaWduOiB0b3A7CgkJCXBhZGRpbmc6IDJweCA4cHg7CgkJCXRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzOwoJCQlvdmVyZmxvdzogaGlkZGVuOwoJCX0KCgkJLmxpc3RfdGFibGUgdGQsIC5saXN0X3RhYmxlIHRoIHsKCQkJYm9yZGVyLWxlZnQ6IDFweCBzb2xpZCAjY2NjOwoJCX0KCgkJLmxpc3RfdGFibGUgdGggewoJCQliYWNrZ3JvdW5kOiAjRjRGNEY0OwoJCX0KCgkJLmxpc3RfdGFibGUgdHI6bnRoLWNoaWxkKDJuKSB7CgkJCWJhY2tncm91bmQ6ICNGNEY0RjQ7CgkJfQoKCQkubGlzdF90YWJsZSB0cjpob3ZlciB7CgkJCWJhY2tncm91bmQ6ICNmZmZmOTk7CgkJfQoKCQkjYWlfZGV0YWlsc19kaXYgcHJlIHsKCQkJbWFyZ2luOiAxcHg7CgkJCW1heC13aWR0aDogMTIwY2g7CgkJCXdoaXRlLXNwYWNlOiBwcmUtd3JhcDsKCQkJb3ZlcmZsb3ctd3JhcDogYnJlYWstd29yZDsKCQl9Cgk8L3N0eWxlPgo8L2hlYWQ+Cjxib2R5PgoJPGgxPkFJIFRyYWplY3Rvcnk8L2gxPgoJPGJyPgoKCQoJPHRhYmxlIGNsYXNzPSJsaXN0X3RhYmxlIj4KCQk8Y2FwdGlvbj5UcmFqZWN0b3J5OiAoPGEgaHJlZj0iIyIgb25jbGljaz0idG9nZ2xlQWxsRGV0YWlscygpOyByZXR1cm4gZmFsc2U7Ij5FeHBhbmQvQ29sbGFwc2UgQWxsPC9hPik8L2NhcHRpb24+CgkJPHRoZWFkPjx0cj4KCQkJPHRoPlNlcTwvdGg+CgkJCTx0aD5UaW1lc3RhbXA8L3RoPgoJCQk8dGg+VHlwZTwvdGg+CgkJCTx0aD5OYW1lPC90aD4KCQkJPHRoPkR1cmF0aW9uPC90aD4KCQk8L3RyPjwvdGhlYWQ+CgkJPHRib2R5PgoJCQoJCTx0cj4KCQkJPHRkPjAvMDwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzE5IDA3OjQ0PC90ZD4KCQkJPHRkPmZsb3c8L3RkPgoJCQk8dGQ+cGF0Y2gtdHJpYWdlPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RW5hYmxlQ29uZmlncyYjMzQ7OiBbCiAgICAmIzM0O01FTUNHJiMzNDssCiAgICAmIzM0O0JQRl9TWVNDQUxMJiMzNDsKICBdLAogICYjMzQ7Rm9jdXNTeW1ib2xzJiMzNDs6IFsKICAgICYjMzQ7YnBmX3Byb2FjdGl2ZV9yZWNsYWltJiMzNDssCiAgICAmIzM0O2JwZl9wcm9hY3RpdmVfcmVjbGFpbV9zd2FwcGluZXNzJiMzNDsKICBdLAogICYjMzQ7S01TQU5SZWFzb25pbmcmIzM0OzogJiMzNDtUaGUgcGF0Y2ggaW50cm9kdWNlcyB0d28gbmV3IEJQRiBrZnVuY3MgKGBicGZfcHJvYWN0aXZlX3JlY2xhaW1gIGFuZCBgYnBmX3Byb2FjdGl2ZV9yZWNsYWltX3N3YXBwaW5lc3NgKSB0aGF0IHdyYXAgdGhlIGV4aXN0aW5nIGB0cnlfdG9fZnJlZV9tZW1fY2dyb3VwX3BhZ2VzYCBmdW5jdGlvbiB0byBhbGxvdyBCUEYgcHJvZ3JhbXMgdG8gdHJpZ2dlciBwcm9hY3RpdmUgbWVtb3J5IHJlY2xhaW0gZm9yIGEgbWVtb3J5IGNncm91cC4gVGhlIGFyZ3VtZW50cyBwYXNzZWQgdG8gdGhlc2Uga2Z1bmNzIGFyZSBzY2FsYXIgdmFsdWVzIGFuZCBwb2ludGVycyB2ZXJpZmllZCBieSB0aGUgQlBGIHZlcmlmaWVyLCBlbnN1cmluZyB0aGV5IGFyZSBpbml0aWFsaXplZC4gVGhlIHBhdGNoIGRvZXMgbm90IGludHJvZHVjZSBhbnkgbmV3IGRhdGEgc3RydWN0dXJlcyBjb3BpZWQgdG8gb3IgZnJvbSB1c2Vyc3BhY2UsIG5vciBkb2VzIGl0IGFsbG9jYXRlIGNvbXBsZXggc3RydWN0dXJlcyB0aGF0IG1pZ2h0IGJlIGxlZnQgcGFydGlhbGx5IHVuaW5pdGlhbGl6ZWQuIFRoZXJlIGlzIG5vIHJpc2sgb2YgdW5pbml0aWFsaXplZCBtZW1vcnkgYmVpbmcgbGVha2VkIHRvIHVzZXJzcGFjZSBvciB1c2VkIGluIGNvbnRyb2wgZmxvdyBkZWNpc2lvbnMuIEFueSBwb3RlbnRpYWwgbWVtb3J5IHNhZmV0eSBpc3N1ZXMgaW50cm9kdWNlZCBieSB0aGVzZSBjaGFuZ2VzIChzdWNoIGFzIHVzZS1hZnRlci1mcmVlIG9yIG91dC1vZi1ib3VuZHMgYWNjZXNzZXMgb24gdGhlIGBtZW1fY2dyb3VwYCBwb2ludGVyKSB3b3VsZCBiZSBlZmZlY3RpdmVseSBjYXVnaHQgYnkgS0FTQU4gYW5kIHRoZSBzdGFuZGFyZCBCUEYgdmVyaWZpZXIgY2hlY2tzLiBUaGVyZWZvcmUsIGEgZGVkaWNhdGVkIEtNU0FOIGZ1enppbmcgc2Vzc2lvbiBpcyBub3QgcmVxdWlyZWQuJiMzNDssCiAgJiMzNDtOZWVkc0tNU0FOJiMzNDs6IGZhbHNlLAogICYjMzQ7UmVhc29uaW5nJiMzNDs6ICYjMzQ7VGhlIHBhdGNoIGludHJvZHVjZXMgdHdvIG5ldyBCUEYga2Z1bmNzLCBgYnBmX3Byb2FjdGl2ZV9yZWNsYWltYCBhbmQgYGJwZl9wcm9hY3RpdmVfcmVjbGFpbV9zd2FwcGluZXNzYCwgd2hpY2ggYWxsb3cgQlBGIHByb2dyYW1zIHRvIHByb2FjdGl2ZWx5IHRyaWdnZXIgbWVtb3J5IHJlY2xhaW0gb24gYSBtZW1vcnkgY2dyb3VwLiBUaGlzIGV4cG9zZXMgY29yZSBtZW1vcnkgbWFuYWdlbWVudCBhbmQgcmVjbGFpbSBsb2dpYyB0byBCUEYsIG1ha2luZyBpdCBhIGZ1bmN0aW9uYWwgY2hhbmdlIHRoYXQgaXMgaGlnaGx5IHJlYWNoYWJsZSBhbmQgd29ydGggZnV6emluZy4mIzM0OywKICAmIzM0O1dvcnRoRnV6emluZyYjMzQ7OiB0cnVlCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4xLzE8L3RkPgoJCQk8dGQ+MjAyNi8wOC8xOSAwNzo0NDwvdGQ+CgkJCTx0ZD5hY3Rpb248L3RkPgoJCQk8dGQ+cmVhZC1wYXRjaC1kaWZmPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7UGF0Y2hEaWZmJiMzNDs6ICYjMzQ7Y29tbWl0IDliZTUzMjUxNDVhMDcwMDYzZDM5MDk1ODMyMzhiNDk3YTk2ZGQ3N2ZcbkF1dGhvcjogc3l6LWNsdXN0ZXIgXHUwMDNjdHJpYWdlQHN5emthbGxlci5jb21cdTAwM2VcbkRhdGU6ICAgV2VkIEF1ZyAxOSAwNzo0NDoxOCAyMDI2ICYjNDM7MDAwMFxuXG4gICAgc3l6LWNsdXN0ZXI6IGFwcGxpZWQgcGF0Y2ggdW5kZXIgcmV2aWV3XG5cbmRpZmYgLS1naXQgYS9tbS9icGZfbWVtY29udHJvbC5jIGIvbW0vYnBmX21lbWNvbnRyb2wuY1xuaW5kZXggNzE2ZGY0OWQ3NjQ3Ny4uYjBhMGQ0YzU1ZGM0ZSAxMDA2NDRcbi0tLSBhL21tL2JwZl9tZW1jb250cm9sLmNcbiYjNDM7JiM0MzsmIzQzOyBiL21tL2JwZl9tZW1jb250cm9sLmNcbkBAIC02LDYgJiM0Mzs2LDcgQEBcbiAgKi9cbiBcbiAjaW5jbHVkZSBcdTAwM2NsaW51eC9tZW1jb250cm9sLmhcdTAwM2VcbiYjNDM7I2luY2x1ZGUgXHUwMDNjbGludXgvc3dhcC5oXHUwMDNlXG4gI2luY2x1ZGUgXHUwMDNjbGludXgvYnBmLmhcdTAwM2VcbiBcbiBfX2JwZl9rZnVuY19zdGFydF9kZWZzKCk7XG5AQCAtMTU5LDYgJiM0MzsxNjAsMTAzIEBAIF9fYnBmX2tmdW5jIHZvaWQgYnBmX21lbV9jZ3JvdXBfZmx1c2hfc3RhdHMoc3RydWN0IG1lbV9jZ3JvdXAgKm1lbWNnKVxuIFx0bWVtX2Nncm91cF9mbHVzaF9zdGF0cyhtZW1jZyk7XG4gfVxuIFxuJiM0MzsvKlxuJiM0MzsgKiBSZWNsYWltIG11c3Qgbm90IHJlY3Vyc2UuIHRyeV90b19mcmVlX21lbV9jZ3JvdXBfcGFnZXMoKSB1bmNvbmRpdGlvbmFsbHlcbiYjNDM7ICogb3ZlcndyaXRlcyBjdXJyZW50LVx1MDAzZXJlY2xhaW1fc3RhdGUgb24gZW50cnkgYW5kIHJlc2V0cyBpdCB0byBOVUxMIG9uIGV4aXQuXG4mIzQzOyAqIFNvIGludm9raW5nIGl0IGZyb20gYW4gaW4tZmxpZ2h0IHJlY2xhaW0gd291bGQgY2xvYmJlciB0aGUgb3V0ZXIgcmVjbGFpbVxuJiM0MzsgKiBzdGF0ZSBhbmQgY29ycnVwdCBpdHMgYWNjb3VudGluZy5cbiYjNDM7ICpcbiYjNDM7ICogVGhlIGd1YXJkIGlzIFBGX01FTUFMTE9DLiBFdmVyeSByZWNsYWltIGVudHJ5IHBvaW50IG1hcmtzIHRoZSBjdXJyZW50XG4mIzQzOyAqIHRhc2sgd2l0aCBpdCBmb3IgdGhlIHdob2xlIHJlY2xhaW0gd2luZG93OiB0cnlfdG9fZnJlZV9tZW1fY2dyb3VwX3BhZ2VzKClcbiYjNDM7ICogYW5kIF9fcGVyZm9ybV9yZWNsYWltKCkgZG8gc28gdmlhIG1lbWFsbG9jX25vcmVjbGFpbV9zYXZlKCksIGFuZCBrc3dhcGRcbiYjNDM7ICoga2VlcHMgaXQgc2V0IGZvciBpdHMgZW50aXJlIGxpZmV0aW1lLiBBIGhvb2sgaW5zaWRlIHRoZSByZWNsYWltIHBhdGhcbiYjNDM7ICogKHNocmlua19ub2RlLCBzaHJpbmtfc2xhYiwgLi4uKSBleGVjdXRlcyBpbiB0aGUgY29udGV4dCBvZiB0aGVcbiYjNDM7ICogcmVjbGFpbWluZyB0YXNrLCB3aGVyZSBjdXJyZW50LVx1MDAzZWZsYWdzIGFscmVhZHkgY2FycmllcyB0aGUgZmxhZy4gVGhlIHBhZ2VcbiYjNDM7ICogYWxsb2NhdG9yLCB0aGUgbWVtY2cgY2hhcmdpbmcgcGF0aCBhbmQgbm9kZV9yZWNsYWltKCkgcmVseSBvbiB0aGUgc2FtZVxuJiM0MzsgKiBmbGFnIHRvIGF2b2lkIHJlY2xhaW0gcmVjdXJzaW9uLlxuJiM0MzsgKlxuJiM0MzsgKiBJbiB0cnlfdG9fZnJlZV9tZW1fY2dyb3VwX3BhZ2VzKCksIHJlY2xhaW1fc3RhdGUgaXMgc2V0IHNsaWdodGx5IGJlZm9yZVxuJiM0MzsgKiBQRl9NRU1BTExPQywgd2l0aCBvbmx5IGEgdHJhY2Vwb2ludCBpbiBiZXR3ZWVuLCB3aGljaCBhIHNsZWVwYWJsZSBCUEZcbiYjNDM7ICogcHJvZ3JhbSBjYW5ub3QgYXR0YWNoIHRvLlxuJiM0MzsgKiBBbHNvLCBQRl9NRU1BTExPQyBpcyBzZXQgaW4gc29tZSBub24tcmVjbGFpbSBjb250ZXh0cyAoZS5nLiBkaXJlY3QgY29tcGFjdGlvblxuJiM0MzsgKiBhbmQgdm1hbGxvYyksIHdoZXJlIHRoZSBrZnVuYyBjb25zZXJ2YXRpdmVseSByZWZ1c2VzIHRvIHJlY2xhaW0gYXMgd2VsbC5cbiYjNDM7ICovXG4mIzQzO3N0YXRpYyBib29sIGJwZl9pbl9yZWNsYWltX2NvbnRleHQodm9pZClcbiYjNDM7e1xuJiM0MztcdHJldHVybiBjdXJyZW50LVx1MDAzZWZsYWdzIFx1MDAyNiBQRl9NRU1BTExPQztcbiYjNDM7fVxuJiM0MztcbiYjNDM7LypcbiYjNDM7ICogU2hhcmVkIGltcGxlbWVudGF0aW9uIG9mIHRoZSBwcm9hY3RpdmUgcmVjbGFpbSBrZnVuY3M6IHBlcmZvcm1zIG9uZVxuJiM0MzsgKiByZWNsYWltIHBhc3Mgb24gQG1lbWNnIHdpdGggQG5yX3BhZ2VzIGFzIHRoZSBnb2FsLCBhbGxvd2luZyBzd2FwLCBhbmRcbiYjNDM7ICogQHN3YXBwaW5lc3MgYXMgdGhlIGFub24vZmlsZSBiYWxhbmNlIG92ZXJyaWRlIChOVUxMIHRvIGZvbGxvdyB0aGVcbiYjNDM7ICogY2dyb3VwJiMzOTtzIG93biBzd2FwcGluZXNzIHNldHRpbmcpLlxuJiM0MzsgKi9cbiYjNDM7c3RhdGljIHVuc2lnbmVkIGxvbmdcbiYjNDM7YnBmX3Byb2FjdGl2ZV9yZWNsYWltX3BhZ2VzKHN0cnVjdCBtZW1fY2dyb3VwICptZW1jZywgdW5zaWduZWQgbG9uZyBucl9wYWdlcyxcbiYjNDM7XHRcdFx0ICAgIGludCAqc3dhcHBpbmVzcylcbiYjNDM7e1xuJiM0MztcdGlmICghbnJfcGFnZXMgfHwgdW5saWtlbHkoYnBmX2luX3JlY2xhaW1fY29udGV4dCgpKSlcbiYjNDM7XHRcdHJldHVybiAwO1xuJiM0MztcbiYjNDM7XHRyZXR1cm4gdHJ5X3RvX2ZyZWVfbWVtX2Nncm91cF9wYWdlcyhtZW1jZywgbnJfcGFnZXMsIEdGUF9LRVJORUwsXG4mIzQzO1x0XHRcdFx0XHQgICAgTUVNQ0dfUkVDTEFJTV9NQVlfU1dBUCB8XG4mIzQzO1x0XHRcdFx0XHQgICAgTUVNQ0dfUkVDTEFJTV9QUk9BQ1RJVkUsXG4mIzQzO1x0XHRcdFx0XHQgICAgc3dhcHBpbmVzcyk7XG4mIzQzO31cbiYjNDM7XG4mIzQzOy8qKlxuJiM0MzsgKiBicGZfcHJvYWN0aXZlX3JlY2xhaW0gLSBwcm9hY3RpdmVseSByZWNsYWltIG1lbW9yeSBmcm9tIGEgbWVtb3J5XG4mIzQzOyAqICAgICAgICAgICAgICAgICAgICAgICAgIGNncm91cFxuJiM0MzsgKiBAbWVtY2c6IHRoZSB0YXJnZXQgbWVtb3J5IGNncm91cCB0byByZWNsYWltIGZyb21cbiYjNDM7ICogQHNpemU6ICB0aGUgYW1vdW50IG9mIG1lbW9yeSB0byByZWNsYWltLCBpbiBieXRlc1xuJiM0MzsgKlxuJiM0MzsgKiBUcmlnZ2VyIG9uZSBwcm9hY3RpdmUgcmVjbGFpbSBwYXNzIG9uIEBtZW1jZywgc2ltaWxhciB0byBhIHdyaXRlIHRvXG4mIzQzOyAqIHRoZSBtZW1vcnkucmVjbGFpbSBjZ3JvdXAgZmlsZTogcGFnZXMgYXJlIHJlY2xhaW1lZCBhY2NvcmRpbmcgdG8gdGhlXG4mIzQzOyAqIGNncm91cCYjMzk7cyBvd24gc3dhcHBpbmVzcyBzZXR0aW5nIGFuZCBzd2FwIGlzIGFsbG93ZWQuIE5vdGUgdGhhdCxcbiYjNDM7ICogdW5saWtlIG1lbW9yeS5yZWNsYWltLCB0aGlzIGRvZXMgbm90IHJldHJ5IHVudGlsIEBzaXplIGlzIHJlYWNoZWQ7XG4mIzQzOyAqIGNhbGxlcnMgY2FuIGludm9rZSBpdCBhZ2FpbiBpZiBuZWVkZWQuXG4mIzQzOyAqXG4mIzQzOyAqIFJldHVybjpcbiYjNDM7ICogICBUaGUgbnVtYmVyIG9mIHBhZ2VzIGFjdHVhbGx5IHJlY2xhaW1lZCwgb3IgMCBpZiBAc2l6ZSBpcyBzbWFsbGVyXG4mIzQzOyAqICAgdGhhbiBhIHBhZ2Ugb3IgdGhlIGNhbGxpbmcgdGFzayBpcyBhbHJlYWR5IGluIGEgcmVjbGFpbS9mcmVlaW5nXG4mIzQzOyAqICAgY29udGV4dCAoUEZfTUVNQUxMT0MpLlxuJiM0MzsgKi9cbiYjNDM7X19icGZfa2Z1bmMgdW5zaWduZWQgbG9uZyBicGZfcHJvYWN0aXZlX3JlY2xhaW0oc3RydWN0IG1lbV9jZ3JvdXAgKm1lbWNnLFxuJiM0MztcdFx0XHRcdFx0XHR1bnNpZ25lZCBsb25nIHNpemUpXG4mIzQzO3tcbiYjNDM7XHRyZXR1cm4gYnBmX3Byb2FjdGl2ZV9yZWNsYWltX3BhZ2VzKG1lbWNnLCBzaXplIC8gUEFHRV9TSVpFLCBOVUxMKTtcbiYjNDM7fVxuJiM0MztcbiYjNDM7LyoqXG4mIzQzOyAqIGJwZl9wcm9hY3RpdmVfcmVjbGFpbV9zd2FwcGluZXNzIC0gcHJvYWN0aXZlbHkgcmVjbGFpbSBtZW1vcnkgZnJvbSBhXG4mIzQzOyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVtb3J5IGNncm91cCB3aXRoIGFuIGV4cGxpY2l0XG4mIzQzOyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3dhcHBpbmVzc1xuJiM0MzsgKiBAbWVtY2c6ICAgICAgdGhlIHRhcmdldCBtZW1vcnkgY2dyb3VwIHRvIHJlY2xhaW0gZnJvbVxuJiM0MzsgKiBAc2l6ZTogICAgICAgdGhlIGFtb3VudCBvZiBtZW1vcnkgdG8gcmVjbGFpbSwgaW4gYnl0ZXNcbiYjNDM7ICogQHN3YXBwaW5lc3M6IHN3YXBwaW5lc3Mgb3ZlcnJpZGUgZm9yIHRoaXMgcmVjbGFpbSBwYXNzXG4mIzQzOyAqXG4mIzQzOyAqIFNhbWUgYXMgYnBmX3Byb2FjdGl2ZV9yZWNsYWltKCksIGV4Y2VwdCB0aGF0IHRoZSBhbm9uL2ZpbGUgcmVjbGFpbVxuJiM0MzsgKiBiYWxhbmNlIGlzIGNvbnRyb2xsZWQgYnkgQHN3YXBwaW5lc3MgaW5zdGVhZCBvZiB0aGUgY2dyb3VwJiMzOTtzXG4mIzQzOyAqIHN3YXBwaW5lc3Mgc2V0dGluZy4gVmFsaWQgdmFsdWVzIGFyZSBbTUlOX1NXQVBQSU5FU1MsIE1BWF9TV0FQUElORVNTXVxuJiM0MzsgKiBhbmQgU1dBUFBJTkVTU19BTk9OX09OTFksIHdoaWNoIHJlc3RyaWN0cyByZWNsYWltIHRvIGFub24gZm9saW9zLlxuJiM0MzsgKlxuJiM0MzsgKiBSZXR1cm46XG4mIzQzOyAqICAgVGhlIG51bWJlciBvZiBwYWdlcyBhY3R1YWxseSByZWNsYWltZWQsIG9yIDAgaWYgQHNpemUgaXMgc21hbGxlclxuJiM0MzsgKiAgIHRoYW4gYSBwYWdlLCBAc3dhcHBpbmVzcyBpcyBvdXQgb2YgcmFuZ2UsIG9yIHRoZSBjYWxsaW5nIHRhc2sgaXNcbiYjNDM7ICogICBhbHJlYWR5IGluIGEgcmVjbGFpbS9mcmVlaW5nIGNvbnRleHQgKFBGX01FTUFMTE9DKS5cbiYjNDM7ICovXG4mIzQzO19fYnBmX2tmdW5jIHVuc2lnbmVkIGxvbmdcbiYjNDM7YnBmX3Byb2FjdGl2ZV9yZWNsYWltX3N3YXBwaW5lc3Moc3RydWN0IG1lbV9jZ3JvdXAgKm1lbWNnLCB1bnNpZ25lZCBsb25nIHNpemUsXG4mIzQzO1x0XHRcdFx0IGludCBzd2FwcGluZXNzKVxuJiM0Mzt7XG4mIzQzO1x0aWYgKHN3YXBwaW5lc3MgXHUwMDNjIE1JTl9TV0FQUElORVNTIHx8IHN3YXBwaW5lc3MgXHUwMDNlIFNXQVBQSU5FU1NfQU5PTl9PTkxZKVxuJiM0MztcdFx0cmV0dXJuIDA7XG4mIzQzO1xuJiM0MztcdHJldHVybiBicGZfcHJvYWN0aXZlX3JlY2xhaW1fcGFnZXMobWVtY2csIHNpemUgLyBQQUdFX1NJWkUsXG4mIzQzO1x0XHRcdFx0XHQgICBcdTAwMjZzd2FwcGluZXNzKTtcbiYjNDM7fVxuJiM0MztcbiBfX2JwZl9rZnVuY19lbmRfZGVmcygpO1xuIFxuIEJURl9LRlVOQ1NfU1RBUlQoYnBmX21lbWNvbnRyb2xfa2Z1bmNzKVxuQEAgLTE3Miw2ICYjNDM7MjcwLDkgQEAgQlRGX0lEX0ZMQUdTKGZ1bmMsIGJwZl9tZW1fY2dyb3VwX3VzYWdlKVxuIEJURl9JRF9GTEFHUyhmdW5jLCBicGZfbWVtX2Nncm91cF9wYWdlX3N0YXRlKVxuIEJURl9JRF9GTEFHUyhmdW5jLCBicGZfbWVtX2Nncm91cF9mbHVzaF9zdGF0cywgS0ZfU0xFRVBBQkxFKVxuIFxuJiM0MztCVEZfSURfRkxBR1MoZnVuYywgYnBmX3Byb2FjdGl2ZV9yZWNsYWltLCBLRl9TTEVFUEFCTEUpXG4mIzQzO0JURl9JRF9GTEFHUyhmdW5jLCBicGZfcHJvYWN0aXZlX3JlY2xhaW1fc3dhcHBpbmVzcywgS0ZfU0xFRVBBQkxFKVxuJiM0MztcbiBCVEZfS0ZVTkNTX0VORChicGZfbWVtY29udHJvbF9rZnVuY3MpXG4gXG4gc3RhdGljIGNvbnN0IHN0cnVjdCBidGZfa2Z1bmNfaWRfc2V0IGJwZl9tZW1jb250cm9sX2tmdW5jX3NldCA9IHtcbmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ190ZXN0cy9tZW1jZ19hc3luY19yZWNsYWltLmMgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ190ZXN0cy9tZW1jZ19hc3luY19yZWNsYWltLmNcbm5ldyBmaWxlIG1vZGUgMTAwNjQ0XG5pbmRleCAwMDAwMDAwMDAwMDAwLi5lOTkwZDFmZGM3OWZkXG4tLS0gL2Rldi9udWxsXG4mIzQzOyYjNDM7JiM0MzsgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ190ZXN0cy9tZW1jZ19hc3luY19yZWNsYWltLmNcbkBAIC0wLDAgJiM0MzsxLDQ3OSBAQFxuJiM0MzsvLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogR1BMLTIuMFxuJiM0MzsvKlxuJiM0MzsgKiBNZW1vcnkgY29udHJvbGxlciBlQlBGIGFzeW5jIHJlY2xhaW0gdGVzdFxuJiM0MzsgKi9cbiYjNDM7XG4mIzQzOyNpbmNsdWRlIFx1MDAzY3Rlc3RfcHJvZ3MuaFx1MDAzZVxuJiM0MzsjaW5jbHVkZSBcdTAwM2NzeXMvbW1hbi5oXHUwMDNlXG4mIzQzOyNpbmNsdWRlIFx1MDAzY3N5cy9zdGF0LmhcdTAwM2VcbiYjNDM7I2luY2x1ZGUgXHUwMDNjc3lzL3Zmcy5oXHUwMDNlXG4mIzQzOyNpbmNsdWRlIFx1MDAzY3N5cy93YWl0LmhcdTAwM2VcbiYjNDM7I2luY2x1ZGUgXHUwMDNjZmNudGwuaFx1MDAzZVxuJiM0MzsjaW5jbHVkZSBcdTAwM2NzaWduYWwuaFx1MDAzZVxuJiM0MzsjaW5jbHVkZSBcdTAwM2N0aW1lLmhcdTAwM2VcbiYjNDM7I2luY2x1ZGUgXHUwMDNjdW5pc3RkLmhcdTAwM2VcbiYjNDM7I2luY2x1ZGUgXHUwMDNjc3RkaW8uaFx1MDAzZVxuJiM0MzsjaW5jbHVkZSBcdTAwM2NzdGRsaWIuaFx1MDAzZVxuJiM0MzsjaW5jbHVkZSBcdTAwM2NzdHJpbmcuaFx1MDAzZVxuJiM0MzsjaW5jbHVkZSBcdTAwM2NsaW1pdHMuaFx1MDAzZVxuJiM0MzsjaW5jbHVkZSBcdTAwM2NsaW51eC9tYWdpYy5oXHUwMDNlXG4mIzQzO1xuJiM0MzsjaW5jbHVkZSBcJiMzNDtjZ3JvdXBfaGVscGVycy5oXCYjMzQ7XG4mIzQzO1xuJiM0MztzdHJ1Y3QgYnBmX2FyZ3NfcyB7XG4mIzQzO1x0dTY0IGhpZ2hfY2dyb3VwX2lkO1xuJiM0MztcdHU2NCBsb3dfY2dyb3VwX2lkO1xuJiM0MztcdHU2NCBldmVudF9kZWx0YV90aHJlc2hvbGQ7XG4mIzQzO1x0dTY0IGNoZWNrX25zO1xuJiM0Mzt9O1xuJiM0MztcbiYjNDM7I2luY2x1ZGUgXCYjMzQ7bWVtY2dfYXN5bmNfcmVjbGFpbS5za2VsLmhcJiMzNDtcbiYjNDM7XG4mIzQzOyNkZWZpbmUgRklMRV9TSVpFICgzMiAqIDEwMjQgKiAxMDI0dWwpXG4mIzQzOyNkZWZpbmUgQlVGRkVSX1NJWkUgKDQwOTYpXG4mIzQzOyNkZWZpbmUgQ0dfTElNSVQgKDMyICogMTAyNCAqIDEwMjR1bClcbiYjNDM7I2RlZmluZSBSRUFEX1RJTUVTIDUwXG4mIzQzO1xuJiM0MzsjZGVmaW5lIENHX0RJUiBcJiMzNDsvbWVtY2dfYXN5bmNfcmVjbGFpbVwmIzM0O1xuJiM0MzsjZGVmaW5lIENHX0hJR0hfRElSIENHX0RJUiBcJiMzNDsvaGlnaFwmIzM0O1xuJiM0MzsjZGVmaW5lIENHX0xPV19ESVIgQ0dfRElSIFwmIzM0Oy9sb3dcJiMzNDtcbiYjNDM7XG4mIzQzOyNkZWZpbmUgQ0hFQ0tfUEVSSU9EX05TICgyICogMTAwMCAqIDEwMDB1bGwpXG4mIzQzOyNkZWZpbmUgRVZFTlRfREVMVEFfVEhSRVNIT0xEIDFcbiYjNDM7XG4mIzQzOy8qXG4mIzQzOyAqIFRoZSB3b3JrbG9hZCBmaWxlcyBtdXN0IHNpdCBvbiBhIHJlZ3VsYXIgZmlsZXN5c3RlbTogd2l0aCBzd2FwXG4mIzQzOyAqIGRpc2FibGVkIGZvciB0aGUgY2dyb3VwLCB0bXBmcy9yYW1mcyBwYWdlcyBhcmUgdW5ldmljdGFibGUgYW5kIHdvdWxkXG4mIzQzOyAqIE9PTSB0aGUgY2dyb3VwIGluc3RlYWQgb2YgZXhlcmNpc2luZyByZWNsYWltOyB0aGV5IGFyZSBhbHNvIGNoYXJnZWRcbiYjNDM7ICogYXMgYW5vbnltb3VzIG1lbW9yeSwgc28gdGhleSBuZXZlciByYWlzZSB0aGUgV09SS0lOR1NFVF9SRUZBVUxUX0ZJTEVcbiYjNDM7ICogZXZlbnRzIHRoZSBCUEYgcHJvZ3JhbSBtb25pdG9ycy4gRmFsbCBiYWNrIHRvIHRoZSBjdXJyZW50IGRpcmVjdG9yeVxuJiM0MzsgKiB3aGVuIC90bXAgaXMgYmFja2VkIGJ5IHN1Y2ggYSBmaWxlc3lzdGVtLlxuJiM0MzsgKi9cbiYjNDM7c3RhdGljIGNvbnN0IGNoYXIgKndvcmtsb2FkX2ZpbGVzX2Rpcih2b2lkKVxuJiM0Mzt7XG4mIzQzO1x0c3RydWN0IHN0YXRmcyBzdDtcbiYjNDM7XG4mIzQzO1x0aWYgKCFzdGF0ZnMoXCYjMzQ7L3RtcFwmIzM0OywgXHUwMDI2c3QpIFx1MDAyNlx1MDAyNlxuJiM0MztcdCAgICAoc3QuZl90eXBlID09IFRNUEZTX01BR0lDIHx8IHN0LmZfdHlwZSA9PSBSQU1GU19NQUdJQykpXG4mIzQzO1x0XHRyZXR1cm4gXCYjMzQ7LlwmIzM0OztcbiYjNDM7XHRyZXR1cm4gXCYjMzQ7L3RtcFwmIzM0OztcbiYjNDM7fVxuJiM0MztcbiYjNDM7LypcbiYjNDM7ICogVGhlIHdvcmtsb2FkIGNoaWxkcmVuIHJ1biBhZnRlciB0ZXN0X3Byb2dzIGhpamFja2VkIHN0ZGlvLCBzb1xuJiM0MzsgKiBhbnl0aGluZyB0aGV5IHByaW50IGlzIGxvc3Qgd2l0aCB0aGVpciBwcml2YXRlIGNvcHkgb2YgdGhlIGhpamFja2VkXG4mIzQzOyAqIGJ1ZmZlci4gVGhlIGV4aXQgc3RhdHVzIGlzIHRoZSBvbmx5IGRpYWdub3N0aWNzIGNoYW5uZWwgdGhhdCByZWFjaGVzXG4mIzQzOyAqIHRoZSBwYXJlbnQsIHNvIGVhY2ggZmFpbGluZyBzdGVwIGdldHMgaXRzIG93biBjb2RlLlxuJiM0MzsgKi9cbiYjNDM7ZW51bSBjaGlsZF9leGl0X2NvZGUge1xuJiM0MztcdENISUxEX0VYSVRfT0sgPSAwLFxuJiM0MztcdENISUxEX0VYSVRfSk9JTl9DR1JPVVAsXG4mIzQzO1x0Q0hJTERfRVhJVF9XUklURV9GSUxFLFxuJiM0MztcdENISUxEX0VYSVRfUkVBRF9GSUxFLFxuJiM0MztcdENISUxEX0VYSVRfVElNRV9GSUxFLFxuJiM0Mzt9O1xuJiM0MztcbiYjNDM7c3RhdGljIGNvbnN0IGNoYXIgKmNoaWxkX2V4aXRfc3RyKGludCBjb2RlKVxuJiM0Mzt7XG4mIzQzO1x0c3dpdGNoIChjb2RlKSB7XG4mIzQzO1x0Y2FzZSBDSElMRF9FWElUX09LOlxuJiM0MztcdFx0cmV0dXJuIFwmIzM0O3N1Y2Nlc3NcJiMzNDs7XG4mIzQzO1x0Y2FzZSBDSElMRF9FWElUX0pPSU5fQ0dST1VQOlxuJiM0MztcdFx0cmV0dXJuIFwmIzM0O2pvaW4gY2dyb3VwXCYjMzQ7O1xuJiM0MztcdGNhc2UgQ0hJTERfRVhJVF9XUklURV9GSUxFOlxuJiM0MztcdFx0cmV0dXJuIFwmIzM0O3dyaXRlIGRhdGEgZmlsZVwmIzM0OztcbiYjNDM7XHRjYXNlIENISUxEX0VYSVRfUkVBRF9GSUxFOlxuJiM0MztcdFx0cmV0dXJuIFwmIzM0O3JlYWQgZGF0YSBmaWxlXCYjMzQ7O1xuJiM0MztcdGNhc2UgQ0hJTERfRVhJVF9USU1FX0ZJTEU6XG4mIzQzO1x0XHRyZXR1cm4gXCYjMzQ7d3JpdGUgdGltZSBmaWxlXCYjMzQ7O1xuJiM0MztcdGRlZmF1bHQ6XG4mIzQzO1x0XHRyZXR1cm4gXCYjMzQ7dW5rbm93blwmIzM0OztcbiYjNDM7XHR9XG4mIzQzO31cbiYjNDM7XG4mIzQzO3N0YXRpYyBpbnQgc2V0dXBfaGlnaF9sb3dfY2dyb3Vwcyh1NjQgKmhpZ2hfY2dyb3VwX2lkLCB1NjQgKmxvd19jZ3JvdXBfaWQpXG4mIzQzO3tcbiYjNDM7XHRpbnQgcmV0O1xuJiM0MztcdGNoYXIgbGltaXRfYnVmWzIwXTtcbiYjNDM7XG4mIzQzO1x0cmV0ID0gc2V0dXBfY2dyb3VwX2Vudmlyb25tZW50KCk7XG4mIzQzO1x0aWYgKCFBU1NFUlRfT0socmV0LCBcJiMzNDtzZXR1cF9jZ3JvdXBfZW52aXJvbm1lbnRcJiMzNDspKVxuJiM0MztcdFx0Z290byBjbGVhbnVwO1xuJiM0MztcbiYjNDM7XHRyZXQgPSBjcmVhdGVfYW5kX2dldF9jZ3JvdXAoQ0dfRElSKTtcbiYjNDM7XHRpZiAoIUFTU0VSVF9HRShyZXQsIDAsIFwmIzM0O2NyZWF0ZV9hbmRfZ2V0X2Nncm91cCBcJiMzNDsgQ0dfRElSKSlcbiYjNDM7XHRcdGdvdG8gY2xlYW51cDtcbiYjNDM7XHRjbG9zZShyZXQpO1xuJiM0MztcbiYjNDM7XHRyZXQgPSBlbmFibGVfY29udHJvbGxlcnMoQ0dfRElSLCBcJiMzNDttZW1vcnlcJiMzNDspO1xuJiM0MztcdGlmICghQVNTRVJUX09LKHJldCwgXCYjMzQ7ZW5hYmxlX2NvbnRyb2xsZXJzXCYjMzQ7KSlcbiYjNDM7XHRcdGdvdG8gY2xlYW51cDtcbiYjNDM7XG4mIzQzO1x0c25wcmludGYobGltaXRfYnVmLCBzaXplb2YobGltaXRfYnVmKSwgXCYjMzQ7JWx1XCYjMzQ7LCBDR19MSU1JVCk7XG4mIzQzO1x0cmV0ID0gd3JpdGVfY2dyb3VwX2ZpbGUoQ0dfRElSLCBcJiMzNDttZW1vcnkubWF4XCYjMzQ7LCBsaW1pdF9idWYpO1xuJiM0MztcdGlmICghQVNTRVJUX09LKHJldCwgXCYjMzQ7d3JpdGVfY2dyb3VwX2ZpbGUgbWVtb3J5Lm1heFwmIzM0OykpXG4mIzQzO1x0XHRnb3RvIGNsZWFudXA7XG4mIzQzO1xuJiM0MztcdC8qXG4mIzQzO1x0ICogS2VlcCB0aGUgd29ya2xvYWRzIGZyb20gc3dhcHBpbmcgb3V0LiBXaXRoIENPTkZJR19TV0FQPW4gdGhlXG4mIzQzO1x0ICogbWVtb3J5LnN3YXAubWF4IGZpbGUgZG9lcyBub3QgZXhpc3QsIGFuZCBubyBzd2FwIGNhbiBoYXBwZW5cbiYjNDM7XHQgKiBhbnl3YXksIHNvIHNraXAgdGhlIHdyaXRlLlxuJiM0MztcdCAqL1xuJiM0MztcdGlmICghYWNjZXNzKFwmIzM0Oy9wcm9jL3N3YXBzXCYjMzQ7LCBGX09LKSkge1xuJiM0MztcdFx0cmV0ID0gd3JpdGVfY2dyb3VwX2ZpbGUoQ0dfRElSLCBcJiMzNDttZW1vcnkuc3dhcC5tYXhcJiMzNDssIFwmIzM0OzBcJiMzNDspO1xuJiM0MztcdFx0aWYgKCFBU1NFUlRfT0socmV0LCBcJiMzNDt3cml0ZV9jZ3JvdXBfZmlsZSBtZW1vcnkuc3dhcC5tYXhcJiMzNDspKVxuJiM0MztcdFx0XHRnb3RvIGNsZWFudXA7XG4mIzQzO1x0fVxuJiM0MztcbiYjNDM7XHRyZXQgPSBjcmVhdGVfYW5kX2dldF9jZ3JvdXAoQ0dfSElHSF9ESVIpO1xuJiM0MztcdGlmICghQVNTRVJUX0dFKHJldCwgMCwgXCYjMzQ7Y3JlYXRlX2FuZF9nZXRfY2dyb3VwIFwmIzM0OyBDR19ISUdIX0RJUikpXG4mIzQzO1x0XHRnb3RvIGNsZWFudXA7XG4mIzQzO1x0Y2xvc2UocmV0KTtcbiYjNDM7XG4mIzQzO1x0KmhpZ2hfY2dyb3VwX2lkID0gZ2V0X2Nncm91cF9pZChDR19ISUdIX0RJUik7XG4mIzQzO1x0aWYgKCFBU1NFUlRfR1QoKmhpZ2hfY2dyb3VwX2lkLCAwLCBcJiMzNDtnZXRfY2dyb3VwX2lkXCYjMzQ7KSlcbiYjNDM7XHRcdGdvdG8gY2xlYW51cDtcbiYjNDM7XG4mIzQzO1x0cmV0ID0gY3JlYXRlX2FuZF9nZXRfY2dyb3VwKENHX0xPV19ESVIpO1xuJiM0MztcdGlmICghQVNTRVJUX0dFKHJldCwgMCwgXCYjMzQ7Y3JlYXRlX2FuZF9nZXRfY2dyb3VwIFwmIzM0OyBDR19MT1dfRElSKSlcbiYjNDM7XHRcdGdvdG8gY2xlYW51cDtcbiYjNDM7XHRjbG9zZShyZXQpO1xuJiM0MztcbiYjNDM7XHQqbG93X2Nncm91cF9pZCA9IGdldF9jZ3JvdXBfaWQoQ0dfTE9XX0RJUik7XG4mIzQzO1x0aWYgKCFBU1NFUlRfR1QoKmxvd19jZ3JvdXBfaWQsIDAsIFwmIzM0O2dldF9jZ3JvdXBfaWRcJiMzNDspKVxuJiM0MztcdFx0Z290byBjbGVhbnVwO1xuJiM0MztcbiYjNDM7XHRyZXR1cm4gMDtcbiYjNDM7XG4mIzQzO2NsZWFudXA6XG4mIzQzO1x0Y2xlYW51cF9jZ3JvdXBfZW52aXJvbm1lbnQoKTtcbiYjNDM7XHRyZXR1cm4gLTE7XG4mIzQzO31cbiYjNDM7XG4mIzQzO3N0YXRpYyBpbnQgd3JpdGVfZmlsZShjb25zdCBjaGFyICpmaWxlbmFtZSlcbiYjNDM7e1xuJiM0MztcdGludCByZXQgPSAtMTtcbiYjNDM7XHRzaXplX3Qgd3JpdHRlbiA9IDA7XG4mIzQzO1x0Y2hhciAqYnVmZmVyO1xuJiM0MztcdEZJTEUgKmZwO1xuJiM0MztcbiYjNDM7XHRmcCA9IGZvcGVuKGZpbGVuYW1lLCBcJiMzNDt3YlwmIzM0Oyk7XG4mIzQzO1x0aWYgKCFmcClcbiYjNDM7XHRcdGdvdG8gb3V0O1xuJiM0MztcbiYjNDM7XHRidWZmZXIgPSBtYWxsb2MoQlVGRkVSX1NJWkUpO1xuJiM0MztcdGlmICghYnVmZmVyKVxuJiM0MztcdFx0Z290byBjbGVhbnVwX2ZwO1xuJiM0MztcbiYjNDM7XHRtZW1zZXQoYnVmZmVyLCAmIzM5O0EmIzM5OywgQlVGRkVSX1NJWkUpO1xuJiM0MztcbiYjNDM7XHR3aGlsZSAod3JpdHRlbiBcdTAwM2MgRklMRV9TSVpFKSB7XG4mIzQzO1x0XHRzaXplX3QgdG9fd3JpdGUgPSBGSUxFX1NJWkUgLSB3cml0dGVuIFx1MDAzYyBCVUZGRVJfU0laRSA/XG4mIzQzO1x0XHRcdFx0ICBGSUxFX1NJWkUgLSB3cml0dGVuIDogQlVGRkVSX1NJWkU7XG4mIzQzO1xuJiM0MztcdFx0aWYgKGZ3cml0ZShidWZmZXIsIDEsIHRvX3dyaXRlLCBmcCkgIT0gdG9fd3JpdGUpXG4mIzQzO1x0XHRcdGdvdG8gY2xlYW51cDtcbiYjNDM7XHRcdHdyaXR0ZW4gJiM0Mzs9IHRvX3dyaXRlO1xuJiM0MztcdH1cbiYjNDM7XG4mIzQzO1x0cmV0ID0gMDtcbiYjNDM7Y2xlYW51cDpcbiYjNDM7XHRmcmVlKGJ1ZmZlcik7XG4mIzQzO2NsZWFudXBfZnA6XG4mIzQzO1x0ZmNsb3NlKGZwKTtcbiYjNDM7b3V0OlxuJiM0MztcdHJldHVybiByZXQ7XG4mIzQzO31cbiYjNDM7XG4mIzQzO3N0YXRpYyBpbnQgcmVhZF9maWxlKGNvbnN0IGNoYXIgKmZpbGVuYW1lLCBpbnQgaXRlcmF0aW9ucylcbiYjNDM7e1xuJiM0MztcdGludCByZXQgPSAtMTtcbiYjNDM7XHRsb25nIHBhZ2Vfc2l6ZSA9IHN5c2NvbmYoX1NDX1BBR0VTSVpFKTtcbiYjNDM7XHRjaGFyICptYXA7XG4mIzQzO1x0c2l6ZV90IGk7XG4mIzQzO1x0aW50IGZkO1xuJiM0MztcdHN0cnVjdCBzdGF0IHNiO1xuJiM0MztcbiYjNDM7XHRmZCA9IG9wZW4oZmlsZW5hbWUsIE9fUkRPTkxZKTtcbiYjNDM7XHRpZiAoZmQgPT0gLTEpXG4mIzQzO1x0XHRnb3RvIG91dDtcbiYjNDM7XG4mIzQzO1x0aWYgKGZzdGF0KGZkLCBcdTAwMjZzYikgPT0gLTEpXG4mIzQzO1x0XHRnb3RvIGNsZWFudXBfZmQ7XG4mIzQzO1xuJiM0MztcdGlmIChzYi5zdF9zaXplICE9IEZJTEVfU0laRSkge1xuJiM0MztcdFx0ZnByaW50ZihzdGRlcnIsIFwmIzM0O0ZpbGUgc2l6ZSBtaXNtYXRjaDogZXhwZWN0ZWQgJWx1LCBnb3QgJWx1XFxuXCYjMzQ7LFxuJiM0MztcdFx0XHQodW5zaWduZWQgbG9uZylGSUxFX1NJWkUsICh1bnNpZ25lZCBsb25nKXNiLnN0X3NpemUpO1xuJiM0MztcdFx0Z290byBjbGVhbnVwX2ZkO1xuJiM0MztcdH1cbiYjNDM7XG4mIzQzO1x0bWFwID0gbW1hcChOVUxMLCBGSUxFX1NJWkUsIFBST1RfUkVBRCwgTUFQX1BSSVZBVEUsIGZkLCAwKTtcbiYjNDM7XHRpZiAobWFwID09IE1BUF9GQUlMRUQpXG4mIzQzO1x0XHRnb3RvIGNsZWFudXBfZmQ7XG4mIzQzO1xuJiM0MztcdGZvciAoaW50IGl0ZXIgPSAwOyBpdGVyIFx1MDAzYyBpdGVyYXRpb25zOyBpdGVyJiM0MzsmIzQzOykge1xuJiM0MztcdFx0Zm9yIChpID0gMDsgaSBcdTAwM2MgRklMRV9TSVpFOyBpICYjNDM7PSBwYWdlX3NpemUpIHtcbiYjNDM7XHRcdFx0LyogYWNjZXNzIGEgYnl0ZSB0byB0cmlnZ2VyIHBhZ2UgZmF1bHQgKi9cbiYjNDM7XHRcdFx0dm9sYXRpbGUgY2hhciB2ID0gbWFwW2ldO1xuJiM0MztcdFx0XHQodm9pZCl2O1xuJiM0MztcdFx0fVxuJiM0MztcdH1cbiYjNDM7XG4mIzQzO1x0aWYgKG11bm1hcChtYXAsIEZJTEVfU0laRSkgPT0gLTEpXG4mIzQzO1x0XHRnb3RvIGNsZWFudXBfZmQ7XG4mIzQzO1xuJiM0MztcdHJldCA9IDA7XG4mIzQzO1xuJiM0MztjbGVhbnVwX2ZkOlxuJiM0MztcdGNsb3NlKGZkKTtcbiYjNDM7b3V0OlxuJiM0MztcdHJldHVybiByZXQ7XG4mIzQzO31cbiYjNDM7XG4mIzQzO3N0YXRpYyBpbnQgcmVhbF90ZXN0X2NoaWxkX3dvcmsoY29uc3QgY2hhciAqY2dyb3VwX3BhdGgsIGNoYXIgKmRhdGFfZmlsZW5hbWUsXG4mIzQzO1x0XHRcdFx0Y2hhciAqdGltZV9maWxlbmFtZSwgaW50IHJlYWRfdGltZXMpXG4mIzQzO3tcbiYjNDM7XHRzdHJ1Y3QgdGltZXNwZWMgc3RhcnQsIGVuZDtcbiYjNDM7XHRkb3VibGUgZWxhcHNlZDtcbiYjNDM7XHRGSUxFICpmcDtcbiYjNDM7XG4mIzQzO1x0aWYgKGpvaW5fcGFyZW50X2Nncm91cChjZ3JvdXBfcGF0aCkpXG4mIzQzO1x0XHRyZXR1cm4gQ0hJTERfRVhJVF9KT0lOX0NHUk9VUDtcbiYjNDM7XG4mIzQzO1x0Y2xvY2tfZ2V0dGltZShDTE9DS19NT05PVE9OSUMsIFx1MDAyNnN0YXJ0KTtcbiYjNDM7XG4mIzQzO1x0aWYgKHdyaXRlX2ZpbGUoZGF0YV9maWxlbmFtZSkpXG4mIzQzO1x0XHRyZXR1cm4gQ0hJTERfRVhJVF9XUklURV9GSUxFO1xuJiM0MztcbiYjNDM7XHRpZiAocmVhZF9maWxlKGRhdGFfZmlsZW5hbWUsIHJlYWRfdGltZXMpKVxuJiM0MztcdFx0cmV0dXJuIENISUxEX0VYSVRfUkVBRF9GSUxFO1xuJiM0MztcbiYjNDM7XHRjbG9ja19nZXR0aW1lKENMT0NLX01PTk9UT05JQywgXHUwMDI2ZW5kKTtcbiYjNDM7XG4mIzQzO1x0aWYgKCF0aW1lX2ZpbGVuYW1lKVxuJiM0MztcdFx0cmV0dXJuIENISUxEX0VYSVRfT0s7XG4mIzQzO1xuJiM0MztcdGVsYXBzZWQgPSAoZW5kLnR2X3NlYyAtIHN0YXJ0LnR2X3NlYykgJiM0MztcbiYjNDM7XHRcdCAgKGVuZC50dl9uc2VjIC0gc3RhcnQudHZfbnNlYykgLyAxMDAwMDAwMDAwLjA7XG4mIzQzO1x0cHJpbnRmKFwmIzM0OyUuNmZcXG5cJiMzNDssIGVsYXBzZWQpO1xuJiM0MztcbiYjNDM7XHRmcCA9IGZvcGVuKHRpbWVfZmlsZW5hbWUsIFwmIzM0O3dcJiMzNDspO1xuJiM0MztcdGlmICghZnApXG4mIzQzO1x0XHRyZXR1cm4gQ0hJTERfRVhJVF9USU1FX0ZJTEU7XG4mIzQzO1x0ZnByaW50ZihmcCwgXCYjMzQ7JS42ZlwmIzM0OywgZWxhcHNlZCk7XG4mIzQzO1x0ZmNsb3NlKGZwKTtcbiYjNDM7XG4mIzQzO1x0cmV0dXJuIENISUxEX0VYSVRfT0s7XG4mIzQzO31cbiYjNDM7XG4mIzQzO3N0YXRpYyBpbnQgZ2V0X3RpbWUoY2hhciAqdGltZV9maWxlbmFtZSwgZG91YmxlICp0aW1lKVxuJiM0Mzt7XG4mIzQzO1x0aW50IHJldCA9IC0xO1xuJiM0MztcdEZJTEUgKmZwO1xuJiM0MztcdGNoYXIgYnVmWzY0XTtcbiYjNDM7XG4mIzQzO1x0ZnAgPSBmb3Blbih0aW1lX2ZpbGVuYW1lLCBcJiMzNDtyXCYjMzQ7KTtcbiYjNDM7XHRpZiAoIUFTU0VSVF9PS19QVFIoZnAsIFwmIzM0O2ZvcGVuXCYjMzQ7KSlcbiYjNDM7XHRcdGdvdG8gb3V0O1xuJiM0MztcbiYjNDM7XHRpZiAoIUFTU0VSVF9PS19QVFIoZmdldHMoYnVmLCBzaXplb2YoYnVmKSwgZnApLCBcJiMzNDtmZ2V0c1wmIzM0OykpXG4mIzQzO1x0XHRnb3RvIGNsZWFudXA7XG4mIzQzO1xuJiM0MztcdGlmIChzc2NhbmYoYnVmLCBcJiMzNDslbGZcJiMzNDssIHRpbWUpICE9IDEpIHtcbiYjNDM7XHRcdFBSSU5UX0ZBSUwoXCYjMzQ7c3NjYW5mICVzXCYjMzQ7LCBidWYpO1xuJiM0MztcdFx0Z290byBjbGVhbnVwO1xuJiM0MztcdH1cbiYjNDM7XG4mIzQzO1x0cmV0ID0gMDtcbiYjNDM7Y2xlYW51cDpcbiYjNDM7XHRmY2xvc2UoZnApO1xuJiM0MztvdXQ6XG4mIzQzO1x0cmV0dXJuIHJldDtcbiYjNDM7fVxuJiM0MztcbiYjNDM7c3RhdGljIGludFxuJiM0MztydW5faGlnaF9sb3dfd29ya2xvYWQoZG91YmxlICpoaWdoX2VsYXBzZWQsIGRvdWJsZSAqbG93X2VsYXBzZWQsIGludCByZWFkX3RpbWVzKVxuJiM0Mzt7XG4mIzQzO1x0Y2hhciBoaWdoX2RhdGFfZmlsZVtQQVRIX01BWF07XG4mIzQzO1x0Y2hhciBsb3dfZGF0YV9maWxlW1BBVEhfTUFYXTtcbiYjNDM7XHRjaGFyIGhpZ2hfdGltZV9maWxlW1BBVEhfTUFYXTtcbiYjNDM7XHRjaGFyIGxvd190aW1lX2ZpbGVbUEFUSF9NQVhdO1xuJiM0MztcdGNvbnN0IGNoYXIgKmRpciA9IHdvcmtsb2FkX2ZpbGVzX2RpcigpO1xuJiM0MztcdHBpZF90IGhpZ2hfcGlkID0gLTEsIGxvd19waWQgPSAtMTtcbiYjNDM7XHRpbnQgZmQsIHN0YXR1cztcbiYjNDM7XHRpbnQgcmV0ID0gLTE7XG4mIzQzO1xuJiM0MztcdHNucHJpbnRmKGhpZ2hfZGF0YV9maWxlLCBzaXplb2YoaGlnaF9kYXRhX2ZpbGUpLFxuJiM0MztcdFx0IFwmIzM0OyVzL21lbWNnX2FzeW5jX2hpZ2hfZGF0YV9YWFhYWFhcJiMzNDssIGRpcik7XG4mIzQzO1x0c25wcmludGYobG93X2RhdGFfZmlsZSwgc2l6ZW9mKGxvd19kYXRhX2ZpbGUpLFxuJiM0MztcdFx0IFwmIzM0OyVzL21lbWNnX2FzeW5jX2xvd19kYXRhX1hYWFhYWFwmIzM0OywgZGlyKTtcbiYjNDM7XHRzbnByaW50ZihoaWdoX3RpbWVfZmlsZSwgc2l6ZW9mKGhpZ2hfdGltZV9maWxlKSxcbiYjNDM7XHRcdCBcJiMzNDslcy9tZW1jZ19hc3luY19oaWdoX3RpbWVfWFhYWFhYXCYjMzQ7LCBkaXIpO1xuJiM0MztcdHNucHJpbnRmKGxvd190aW1lX2ZpbGUsIHNpemVvZihsb3dfdGltZV9maWxlKSxcbiYjNDM7XHRcdCBcJiMzNDslcy9tZW1jZ19hc3luY19sb3dfdGltZV9YWFhYWFhcJiMzNDssIGRpcik7XG4mIzQzO1xuJiM0MztcdGZkID0gbWtzdGVtcChoaWdoX2RhdGFfZmlsZSk7XG4mIzQzO1x0aWYgKCFBU1NFUlRfR0UoZmQsIDAsIFwmIzM0O21rc3RlbXBcJiMzNDspKVxuJiM0MztcdFx0Z290byBjbGVhbnVwO1xuJiM0MztcdGNsb3NlKGZkKTtcbiYjNDM7XG4mIzQzO1x0ZmQgPSBta3N0ZW1wKGxvd19kYXRhX2ZpbGUpO1xuJiM0MztcdGlmICghQVNTRVJUX0dFKGZkLCAwLCBcJiMzNDtta3N0ZW1wXCYjMzQ7KSlcbiYjNDM7XHRcdGdvdG8gY2xlYW51cDtcbiYjNDM7XHRjbG9zZShmZCk7XG4mIzQzO1xuJiM0MztcdGZkID0gbWtzdGVtcChoaWdoX3RpbWVfZmlsZSk7XG4mIzQzO1x0aWYgKCFBU1NFUlRfR0UoZmQsIDAsIFwmIzM0O21rc3RlbXBcJiMzNDspKVxuJiM0MztcdFx0Z290byBjbGVhbnVwO1xuJiM0MztcdGNsb3NlKGZkKTtcbiYjNDM7XG4mIzQzO1x0ZmQgPSBta3N0ZW1wKGxvd190aW1lX2ZpbGUpO1xuJiM0MztcdGlmICghQVNTRVJUX0dFKGZkLCAwLCBcJiMzNDtta3N0ZW1wXCYjMzQ7KSlcbiYjNDM7XHRcdGdvdG8gY2xlYW51cDtcbiYjNDM7XHRjbG9zZShmZCk7XG4mIzQzO1xuJiM0MztcdGxvd19waWQgPSBmb3JrKCk7XG4mIzQzO1x0aWYgKCFBU1NFUlRfR0UobG93X3BpZCwgMCwgXCYjMzQ7Zm9yayBsb3dcJiMzNDspKVxuJiM0MztcdFx0Z290byBjbGVhbnVwO1xuJiM0MztcdGlmIChsb3dfcGlkID09IDApXG4mIzQzO1x0XHRleGl0KHJlYWxfdGVzdF9jaGlsZF93b3JrKENHX0xPV19ESVIsIGxvd19kYXRhX2ZpbGUsXG4mIzQzO1x0XHRcdFx0XHQgIGxvd190aW1lX2ZpbGUsIHJlYWRfdGltZXMpKTtcbiYjNDM7XG4mIzQzO1x0aGlnaF9waWQgPSBmb3JrKCk7XG4mIzQzO1x0aWYgKCFBU1NFUlRfR0UoaGlnaF9waWQsIDAsIFwmIzM0O2ZvcmsgaGlnaFwmIzM0OykpXG4mIzQzO1x0XHRnb3RvIGNsZWFudXA7XG4mIzQzO1x0aWYgKGhpZ2hfcGlkID09IDApXG4mIzQzO1x0XHRleGl0KHJlYWxfdGVzdF9jaGlsZF93b3JrKENHX0hJR0hfRElSLCBoaWdoX2RhdGFfZmlsZSxcbiYjNDM7XHRcdFx0XHRcdCAgaGlnaF90aW1lX2ZpbGUsIHJlYWRfdGltZXMpKTtcbiYjNDM7XG4mIzQzO1x0bG93X3BpZCA9IHdhaXRwaWQobG93X3BpZCwgXHUwMDI2c3RhdHVzLCAwKTtcbiYjNDM7XHRpZiAoIUFTU0VSVF9HVChsb3dfcGlkLCAwLCBcJiMzNDtsb3cgd2FpdHBpZFwmIzM0OykpXG4mIzQzO1x0XHRnb3RvIGNsZWFudXA7XG4mIzQzO1x0LypcbiYjNDM7XHQgKiBUaGUgY2hpbGQgaGFzIGJlZW4gcmVhcGVkIGFuZCBpdHMgUElEIGNhbiBhbHJlYWR5IGJlIHJldXNlZCxcbiYjNDM7XHQgKiBzbyBtYXJrIGl0IHRvIGtlZXAgY2xlYW51cCBmcm9tIHNpZ25hbGluZyBhbiB1bnJlbGF0ZWQgcHJvY2Vzcy5cbiYjNDM7XHQgKi9cbiYjNDM7XHRsb3dfcGlkID0gLTE7XG4mIzQzO1x0aWYgKCFBU1NFUlRfVFJVRShXSUZFWElURUQoc3RhdHVzKSwgXCYjMzQ7bG93IGV4aXRlZFwmIzM0OykpXG4mIzQzO1x0XHRnb3RvIGNsZWFudXA7XG4mIzQzO1x0aWYgKFdFWElUU1RBVFVTKHN0YXR1cykgIT0gQ0hJTERfRVhJVF9PSykge1xuJiM0MztcdFx0UFJJTlRfRkFJTChcJiMzNDtsb3cgY2hpbGQgZmFpbGVkIGF0OiAlcyAoZXhpdCBzdGF0dXMgJWQpXCYjMzQ7LFxuJiM0MztcdFx0XHQgICBjaGlsZF9leGl0X3N0cihXRVhJVFNUQVRVUyhzdGF0dXMpKSxcbiYjNDM7XHRcdFx0ICAgV0VYSVRTVEFUVVMoc3RhdHVzKSk7XG4mIzQzO1x0XHRnb3RvIGNsZWFudXA7XG4mIzQzO1x0fVxuJiM0MztcbiYjNDM7XHRoaWdoX3BpZCA9IHdhaXRwaWQoaGlnaF9waWQsIFx1MDAyNnN0YXR1cywgMCk7XG4mIzQzO1x0aWYgKCFBU1NFUlRfR1QoaGlnaF9waWQsIDAsIFwmIzM0O2hpZ2ggd2FpdHBpZFwmIzM0OykpXG4mIzQzO1x0XHRnb3RvIGNsZWFudXA7XG4mIzQzO1x0LyogU2FtZSBhcyBhYm92ZTogdGhlIHJlYXBlZCBQSUQgbXVzdCBub3QgYmUgc2lnbmFsZWQgYWdhaW4uICovXG4mIzQzO1x0aGlnaF9waWQgPSAtMTtcbiYjNDM7XHRpZiAoIUFTU0VSVF9UUlVFKFdJRkVYSVRFRChzdGF0dXMpLCBcJiMzNDtoaWdoIGV4aXRlZFwmIzM0OykpXG4mIzQzO1x0XHRnb3RvIGNsZWFudXA7XG4mIzQzO1x0aWYgKFdFWElUU1RBVFVTKHN0YXR1cykgIT0gQ0hJTERfRVhJVF9PSykge1xuJiM0MztcdFx0UFJJTlRfRkFJTChcJiMzNDtoaWdoIGNoaWxkIGZhaWxlZCBhdDogJXMgKGV4aXQgc3RhdHVzICVkKVwmIzM0OyxcbiYjNDM7XHRcdFx0ICAgY2hpbGRfZXhpdF9zdHIoV0VYSVRTVEFUVVMoc3RhdHVzKSksXG4mIzQzO1x0XHRcdCAgIFdFWElUU1RBVFVTKHN0YXR1cykpO1xuJiM0MztcdFx0Z290byBjbGVhbnVwO1xuJiM0MztcdH1cbiYjNDM7XG4mIzQzO1x0aWYgKGdldF90aW1lKGhpZ2hfdGltZV9maWxlLCBoaWdoX2VsYXBzZWQpKVxuJiM0MztcdFx0Z290byBjbGVhbnVwO1xuJiM0MztcdGlmIChnZXRfdGltZShsb3dfdGltZV9maWxlLCBsb3dfZWxhcHNlZCkpXG4mIzQzO1x0XHRnb3RvIGNsZWFudXA7XG4mIzQzO1xuJiM0MztcdHJldCA9IDA7XG4mIzQzO1xuJiM0MztjbGVhbnVwOlxuJiM0MztcdC8qIE9uIGZhaWx1cmUsIG1ha2Ugc3VyZSBubyBjaGlsZCBwcm9jZXNzIGlzIGxlZnQgYmVoaW5kICovXG4mIzQzO1x0aWYgKHJldCkge1xuJiM0MztcdFx0aWYgKGhpZ2hfcGlkIFx1MDAzZSAwKSB7XG4mIzQzO1x0XHRcdGtpbGwoaGlnaF9waWQsIFNJR0tJTEwpO1xuJiM0MztcdFx0XHQodm9pZCl3YWl0cGlkKGhpZ2hfcGlkLCBOVUxMLCAwKTtcbiYjNDM7XHRcdH1cbiYjNDM7XHRcdGlmIChsb3dfcGlkIFx1MDAzZSAwKSB7XG4mIzQzO1x0XHRcdGtpbGwobG93X3BpZCwgU0lHS0lMTCk7XG4mIzQzO1x0XHRcdCh2b2lkKXdhaXRwaWQobG93X3BpZCwgTlVMTCwgMCk7XG4mIzQzO1x0XHR9XG4mIzQzO1x0fVxuJiM0MztcdHVubGluayhsb3dfdGltZV9maWxlKTtcbiYjNDM7XHR1bmxpbmsoaGlnaF90aW1lX2ZpbGUpO1xuJiM0MztcdHVubGluayhsb3dfZGF0YV9maWxlKTtcbiYjNDM7XHR1bmxpbmsoaGlnaF9kYXRhX2ZpbGUpO1xuJiM0MztcdHJldHVybiByZXQ7XG4mIzQzO31cbiYjNDM7XG4mIzQzO3N0YXRpYyBpbnRcbiYjNDM7c2V0dXBfYnBmKHU2NCBoaWdoX2Nncm91cF9pZCwgdTY0IGxvd19jZ3JvdXBfaWQsXG4mIzQzO1x0ICBzdHJ1Y3QgbWVtY2dfYXN5bmNfcmVjbGFpbSAqKnNrZWxfcHRyKVxuJiM0Mzt7XG4mIzQzO1x0c3RydWN0IG1lbWNnX2FzeW5jX3JlY2xhaW0gKnNrZWw7XG4mIzQzO1x0c3RydWN0IGJwZl9hcmdzX3MgYnBmX2FyZ3MgPSB7XG4mIzQzO1x0XHQuaGlnaF9jZ3JvdXBfaWQgPSBoaWdoX2Nncm91cF9pZCxcbiYjNDM7XHRcdC5sb3dfY2dyb3VwX2lkID0gbG93X2Nncm91cF9pZCxcbiYjNDM7XHRcdC5ldmVudF9kZWx0YV90aHJlc2hvbGQgPSBFVkVOVF9ERUxUQV9USFJFU0hPTEQsXG4mIzQzO1x0XHQuY2hlY2tfbnMgPSBDSEVDS19QRVJJT0RfTlMsXG4mIzQzO1x0fTtcbiYjNDM7XHRMSUJCUEZfT1BUUyhicGZfdGVzdF9ydW5fb3B0cywgcnVuX29wdHMsXG4mIzQzO1x0XHQuY3R4X2luID0gXHUwMDI2YnBmX2FyZ3MsXG4mIzQzO1x0XHQuY3R4X3NpemVfaW4gPSBzaXplb2YoYnBmX2FyZ3MpKTtcbiYjNDM7XHRpbnQgcHJvZ19pbml0X2ZkLCBlcnI7XG4mIzQzO1xuJiM0MztcdHNrZWwgPSBtZW1jZ19hc3luY19yZWNsYWltX19vcGVuX2FuZF9sb2FkKCk7XG4mIzQzO1x0aWYgKCFBU1NFUlRfT0tfUFRSKHNrZWwsIFwmIzM0O21lbWNnX2FzeW5jX3JlY2xhaW1fX29wZW5fYW5kX2xvYWRcJiMzNDspKVxuJiM0MztcdFx0cmV0dXJuIC0xO1xuJiM0MztcbiYjNDM7XHRwcm9nX2luaXRfZmQgPSBicGZfcHJvZ3JhbV9fZmQoc2tlbC1cdTAwM2Vwcm9ncy53cV9wcm9nX2luaXQpO1xuJiM0MztcbiYjNDM7XHRlcnIgPSBicGZfcHJvZ190ZXN0X3J1bl9vcHRzKHByb2dfaW5pdF9mZCwgXHUwMDI2cnVuX29wdHMpO1xuJiM0MztcdGlmICghQVNTRVJUX09LKGVyciwgXCYjMzQ7YnBmX3Byb2dfdGVzdF9ydW5fb3B0c1wmIzM0OykpXG4mIzQzO1x0XHRnb3RvIGVycm9yX291dDtcbiYjNDM7XHRpZiAoIUFTU0VSVF9FUShydW5fb3B0cy5yZXR2YWwsIDAsIFwmIzM0O3Byb2dfaW5pdCByZXR2YWxcJiMzNDspKVxuJiM0MztcdFx0Z290byBlcnJvcl9vdXQ7XG4mIzQzO1xuJiM0MztcdCpza2VsX3B0ciA9IHNrZWw7XG4mIzQzO1x0cmV0dXJuIDA7XG4mIzQzO1xuJiM0MztlcnJvcl9vdXQ6XG4mIzQzO1x0bWVtY2dfYXN5bmNfcmVjbGFpbV9fZGVzdHJveShza2VsKTtcbiYjNDM7XHRyZXR1cm4gLTE7XG4mIzQzO31cbiYjNDM7XG4mIzQzO3ZvaWQgdGVzdF9tZW1jZ193cV9hc3luY19yZWNsYWltKHZvaWQpXG4mIzQzO3tcbiYjNDM7XHR1NjQgaGlnaF9jZ3JvdXBfaWQsIGxvd19jZ3JvdXBfaWQ7XG4mIzQzO1x0aW50IGVycjtcbiYjNDM7XHRkb3VibGUgaGlnaF90aW1lID0gMC4wLCBsb3dfdGltZSA9IDAuMDtcbiYjNDM7XHRzdHJ1Y3QgbWVtY2dfYXN5bmNfcmVjbGFpbSAqc2tlbCA9IE5VTEw7XG4mIzQzO1xuJiM0MztcdGVyciA9IHNldHVwX2hpZ2hfbG93X2Nncm91cHMoXHUwMDI2aGlnaF9jZ3JvdXBfaWQsIFx1MDAyNmxvd19jZ3JvdXBfaWQpO1xuJiM0MztcdGlmICghQVNTRVJUX09LKGVyciwgXCYjMzQ7c2V0dXBfaGlnaF9sb3dfY2dyb3VwcyByZWNsYWltXCYjMzQ7KSlcbiYjNDM7XHRcdHJldHVybjtcbiYjNDM7XG4mIzQzO1x0ZXJyID0gc2V0dXBfYnBmKGhpZ2hfY2dyb3VwX2lkLCBsb3dfY2dyb3VwX2lkLCBcdTAwMjZza2VsKTtcbiYjNDM7XHRpZiAoIUFTU0VSVF9PSyhlcnIsIFwmIzM0O3NldHVwX2JwZlwmIzM0OykpXG4mIzQzO1x0XHRnb3RvIG91dDtcbiYjNDM7XG4mIzQzO1x0ZXJyID0gcnVuX2hpZ2hfbG93X3dvcmtsb2FkKFx1MDAyNmhpZ2hfdGltZSwgXHUwMDI2bG93X3RpbWUsIFJFQURfVElNRVMpO1xuJiM0MztcdGlmICghQVNTRVJUX09LKGVyciwgXCYjMzQ7cnVuX2hpZ2hfbG93X3dvcmtsb2FkIHJlY2xhaW1cJiMzNDspKVxuJiM0MztcdFx0Z290byBvdXQ7XG4mIzQzO1xuJiM0MztcdC8qXG4mIzQzO1x0ICogVGhlIHRpbWluZyBjb21wYXJpc29uIGJlbG93IGFsb25lIGNhbm5vdCBkaXN0aW5ndWlzaCBhIHdvcmtpbmdcbiYjNDM7XHQgKiByZWNsYWltIGZyb20gYSBuby1vcCBvbmUsIHNvIHJlcXVpcmUgdGhhdCB0aGUgQlBGIHByb2dyYW1cbiYjNDM7XHQgKiBhY3R1YWxseSByZWNsYWltZWQgcGFnZXMgZnJvbSB0aGUgbG93IGNncm91cC5cbiYjNDM7XHQgKi9cbiYjNDM7XHRpZiAoIUFTU0VSVF9HVChza2VsLVx1MDAzZWJzcy1cdTAwM2VyZWNsYWltX2NhbGxzLCAwLCBcJiMzNDtyZWNsYWltX2NhbGxzXCYjMzQ7KSlcbiYjNDM7XHRcdGdvdG8gb3V0O1xuJiM0MztcdGlmICghQVNTRVJUX0dUKHNrZWwtXHUwMDNlYnNzLVx1MDAzZXJlY2xhaW1lZF9wYWdlcywgMCwgXCYjMzQ7cmVjbGFpbWVkX3BhZ2VzXCYjMzQ7KSlcbiYjNDM7XHRcdGdvdG8gb3V0O1xuJiM0MztcbiYjNDM7XHRpZiAoaGlnaF90aW1lIFx1MDAzZT0gbG93X3RpbWUpXG4mIzQzO1x0XHRQUklOVF9GQUlMKFwmIzM0O2hpZ2ggY2dyb3VwIG5vdCBpbXByb3ZlZCB3aXRoIGFzeW5jIHJlY2xhaW06IGhpZ2hfdGltZT0lZiBsb3dfdGltZT0lZlwmIzM0OyxcbiYjNDM7XHRcdFx0ICAgaGlnaF90aW1lLCBsb3dfdGltZSk7XG4mIzQzO1xuJiM0MztvdXQ6XG4mIzQzO1x0aWYgKHNrZWwpXG4mIzQzO1x0XHRtZW1jZ19hc3luY19yZWNsYWltX19kZXN0cm95KHNrZWwpO1xuJiM0MztcdGNsZWFudXBfY2dyb3VwX2Vudmlyb25tZW50KCk7XG4mIzQzO31cbmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ3MvbWVtY2dfYXN5bmNfcmVjbGFpbS5jIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dzL21lbWNnX2FzeW5jX3JlY2xhaW0uY1xubmV3IGZpbGUgbW9kZSAxMDA2NDRcbmluZGV4IDAwMDAwMDAwMDAwMDAuLjIyNWYwYmM2NjcxMTNcbi0tLSAvZGV2L251bGxcbiYjNDM7JiM0MzsmIzQzOyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9wcm9ncy9tZW1jZ19hc3luY19yZWNsYWltLmNcbkBAIC0wLDAgJiM0MzsxLDE4MCBAQFxuJiM0MzsvLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogR1BMLTIuMFxuJiM0MztcbiYjNDM7I2luY2x1ZGUgXCYjMzQ7dm1saW51eC5oXCYjMzQ7XG4mIzQzOyNpbmNsdWRlIFwmIzM0O2JwZl9leHBlcmltZW50YWwuaFwmIzM0O1xuJiM0MzsjaW5jbHVkZSBcdTAwM2NicGYvYnBmX2hlbHBlcnMuaFx1MDAzZVxuJiM0MzsjaW5jbHVkZSBcdTAwM2NicGYvYnBmX3RyYWNpbmcuaFx1MDAzZVxuJiM0MzsjaW5jbHVkZSBcdTAwM2NicGYvYnBmX2NvcmVfcmVhZC5oXHUwMDNlXG4mIzQzO1xuJiM0MzsjZGVmaW5lIENMT0NLX01PTk9UT05JQ19JRFx0MVxuJiM0MzsjZGVmaW5lIFBBR0VfU0laRVx0XHQ0MDk2VUxcbiYjNDM7I2RlZmluZSBSRUNMQUlNX1NJWkVcdFx0KDMyICogUEFHRV9TSVpFKVxuJiM0MzsjZGVmaW5lIFJFQ0xBSU1fTUFYX0lURVJcdDMyXG4mIzQzO1xuJiM0MztzdHJ1Y3QgYnBmX2FyZ3NfcyB7XG4mIzQzO1x0dTY0IGhpZ2hfY2dyb3VwX2lkO1xuJiM0MztcdHU2NCBsb3dfY2dyb3VwX2lkO1xuJiM0MztcdHU2NCBldmVudF9kZWx0YV90aHJlc2hvbGQ7XG4mIzQzO1x0dTY0IGNoZWNrX25zO1xuJiM0Mzt9O1xuJiM0MztcbiYjNDM7c3RydWN0IGNncm91cF9tZW1jZyB7XG4mIzQzO1x0c3RydWN0IGNncm91cCAqY2dycDtcbiYjNDM7XHRzdHJ1Y3QgbWVtX2Nncm91cCAqbWVtY2c7XG4mIzQzO307XG4mIzQzO1xuJiM0MztzdGF0aWMgdTY0IHdxX2hpZ2hfY2dyb3VwX2lkO1xuJiM0MztzdGF0aWMgdTY0IHdxX2xvd19jZ3JvdXBfaWQ7XG4mIzQzO1xuJiM0MzsvKiBTdGF0aXN0aWNzIGV4cG9zZWQgdG8gdXNlcnNwYWNlIHRocm91Z2ggLmJzcywgc28gdGhlIHRlc3QgY2FuIHZlcmlmeVxuJiM0MzsgKiB0aGF0IHJlY2xhaW0gYWN0dWFsbHkgaGFwcGVuZWQgaW5zdGVhZCBvZiByZWx5aW5nIG9uIHRpbWluZyBhbG9uZS5cbiYjNDM7ICovXG4mIzQzO3U2NCByZWNsYWltX2NhbGxzO1xuJiM0Mzt1NjQgcmVjbGFpbWVkX3BhZ2VzO1xuJiM0MztcbiYjNDM7c3RhdGljIGludCBnZXRfY2dyb3VwX21lbWNnX2Zyb21faWQodTY0IGNncm91cF9pZCwgc3RydWN0IGNncm91cF9tZW1jZyAqY20pXG4mIzQzO3tcbiYjNDM7XHRjbS1cdTAwM2VjZ3JwID0gYnBmX2Nncm91cF9mcm9tX2lkKGNncm91cF9pZCk7XG4mIzQzO1x0aWYgKCFjbS1cdTAwM2VjZ3JwKVxuJiM0MztcdFx0cmV0dXJuIC0xO1xuJiM0MztcbiYjNDM7XHRjbS1cdTAwM2VtZW1jZyA9IGJwZl9nZXRfbWVtX2Nncm91cChcdTAwMjZjbS1cdTAwM2VjZ3JwLVx1MDAzZXNlbGYpO1xuJiM0MztcdGlmICghY20tXHUwMDNlbWVtY2cpIHtcbiYjNDM7XHRcdGJwZl9jZ3JvdXBfcmVsZWFzZShjbS1cdTAwM2VjZ3JwKTtcbiYjNDM7XHRcdHJldHVybiAtMTtcbiYjNDM7XHR9XG4mIzQzO1xuJiM0MztcdHJldHVybiAwO1xuJiM0Mzt9XG4mIzQzO1xuJiM0MztzdGF0aWMgdm9pZCBwdXRfY2dyb3VwX21lbWNnKHN0cnVjdCBjZ3JvdXBfbWVtY2cgKmNtKVxuJiM0Mzt7XG4mIzQzO1x0YnBmX3B1dF9tZW1fY2dyb3VwKGNtLVx1MDAzZW1lbWNnKTtcbiYjNDM7XHRicGZfY2dyb3VwX3JlbGVhc2UoY20tXHUwMDNlY2dycCk7XG4mIzQzO31cbiYjNDM7XG4mIzQzO3N0YXRpYyBpbnQgZ2V0X2Nncm91cF9ldmVudCh1NjQgY2dyb3VwX2lkLCB1NjQgKnZhbClcbiYjNDM7e1xuJiM0MztcdHN0cnVjdCBjZ3JvdXBfbWVtY2cgY207XG4mIzQzO1xuJiM0MztcdGlmIChnZXRfY2dyb3VwX21lbWNnX2Zyb21faWQoY2dyb3VwX2lkLCBcdTAwMjZjbSkpXG4mIzQzO1x0XHRyZXR1cm4gLTE7XG4mIzQzO1x0YnBmX21lbV9jZ3JvdXBfZmx1c2hfc3RhdHMoY20ubWVtY2cpO1xuJiM0MztcdCp2YWwgPSBicGZfbWVtX2Nncm91cF9wYWdlX3N0YXRlKGNtLm1lbWNnLFxuJiM0MztcdFx0YnBmX2NvcmVfZW51bV92YWx1ZShlbnVtIG5vZGVfc3RhdF9pdGVtLFxuJiM0MztcdFx0XHRcdCAgICBXT1JLSU5HU0VUX1JFRkFVTFRfRklMRSkpO1xuJiM0MztcdHB1dF9jZ3JvdXBfbWVtY2coXHUwMDI2Y20pO1xuJiM0MztcbiYjNDM7XHRyZXR1cm4gMDtcbiYjNDM7fVxuJiM0MztcbiYjNDM7c3RhdGljIGJvb2xcbiYjNDM7c2hvdWxkX3JlY2xhaW1fY2dyb3VwKHU2NCBjZ3JvdXBfaWQsIHU2NCAqcHJldl9ldmVudCwgdTY0IGV2ZW50X2RlbHRhX3RocmVzaG9sZClcbiYjNDM7e1xuJiM0MztcdHU2NCBjdXIsIGRlbHRhO1xuJiM0MztcbiYjNDM7XHRpZiAoZ2V0X2Nncm91cF9ldmVudChjZ3JvdXBfaWQsIFx1MDAyNmN1cikpXG4mIzQzO1x0XHRyZXR1cm4gZmFsc2U7XG4mIzQzO1xuJiM0MztcdGRlbHRhID0gY3VyIC0gKnByZXZfZXZlbnQ7XG4mIzQzO1x0KnByZXZfZXZlbnQgPSBjdXI7XG4mIzQzO1xuJiM0MztcdHJldHVybiBkZWx0YSBcdTAwM2U9IGV2ZW50X2RlbHRhX3RocmVzaG9sZDtcbiYjNDM7fVxuJiM0MztcbiYjNDM7c3RhdGljIGludCByZWNsYWltX2Nncm91cCh1NjQgY2dyb3VwX2lkKVxuJiM0Mzt7XG4mIzQzO1x0c3RydWN0IGNncm91cF9tZW1jZyBjbTtcbiYjNDM7XHRpbnQgaTtcbiYjNDM7XG4mIzQzO1x0aWYgKGdldF9jZ3JvdXBfbWVtY2dfZnJvbV9pZChjZ3JvdXBfaWQsIFx1MDAyNmNtKSlcbiYjNDM7XHRcdHJldHVybiAwO1xuJiM0MztcbiYjNDM7XHRyZWNsYWltX2NhbGxzJiM0MzsmIzQzOztcbiYjNDM7XHRmb3IgKGkgPSAwOyBpIFx1MDAzYyBSRUNMQUlNX01BWF9JVEVSOyBpJiM0MzsmIzQzOykge1xuJiM0MztcdFx0dTY0IG5yID0gYnBmX3Byb2FjdGl2ZV9yZWNsYWltKGNtLm1lbWNnLCBSRUNMQUlNX1NJWkUpO1xuJiM0MztcbiYjNDM7XHRcdGlmICghbnIpXG4mIzQzO1x0XHRcdGJyZWFrO1xuJiM0MztcdFx0cmVjbGFpbWVkX3BhZ2VzICYjNDM7PSBucjtcbiYjNDM7XHR9XG4mIzQzO1xuJiM0MztcdHB1dF9jZ3JvdXBfbWVtY2coXHUwMDI2Y20pO1xuJiM0MztcbiYjNDM7XHRyZXR1cm4gMDtcbiYjNDM7fVxuJiM0MztcbiYjNDM7c3RydWN0IHdxX2VsZW0ge1xuJiM0MztcdHN0cnVjdCBicGZfdGltZXIgdGltZXI7XG4mIzQzO1x0c3RydWN0IGJwZl93cSB3b3JrO1xuJiM0MztcdHU2NCBwcmV2X2V2ZW50O1xuJiM0MztcdHU2NCBldmVudF9kZWx0YV90aHJlc2hvbGQ7XG4mIzQzO1x0dTY0IGNoZWNrX25zO1xuJiM0Mzt9O1xuJiM0MztcbiYjNDM7c3RydWN0IHtcbiYjNDM7XHRfX3VpbnQodHlwZSwgQlBGX01BUF9UWVBFX0FSUkFZKTtcbiYjNDM7XHRfX3VpbnQobWF4X2VudHJpZXMsIDEpO1xuJiM0MztcdF9fdHlwZShrZXksIF9fdTMyKTtcbiYjNDM7XHRfX3R5cGUodmFsdWUsIHN0cnVjdCB3cV9lbGVtKTtcbiYjNDM7fSB3cV9tYXAgU0VDKFwmIzM0Oy5tYXBzXCYjMzQ7KTtcbiYjNDM7XG4mIzQzO3N0YXRpYyBpbnQgYXN5bmNfZnJlZSh2b2lkICptYXAsIGludCAqa2V5LCB2b2lkICp2YWx1ZSlcbiYjNDM7e1xuJiM0MztcdHN0cnVjdCB3cV9lbGVtICplbGVtID0gdmFsdWU7XG4mIzQzO1xuJiM0MztcdGlmIChzaG91bGRfcmVjbGFpbV9jZ3JvdXAod3FfaGlnaF9jZ3JvdXBfaWQsIFx1MDAyNmVsZW0tXHUwMDNlcHJldl9ldmVudCxcbiYjNDM7XHRcdGVsZW0tXHUwMDNlZXZlbnRfZGVsdGFfdGhyZXNob2xkKSkge1xuJiM0MztcdFx0cmVjbGFpbV9jZ3JvdXAod3FfbG93X2Nncm91cF9pZCk7XG4mIzQzO1x0XHRicGZfd3Ffc3RhcnQoXHUwMDI2ZWxlbS1cdTAwM2V3b3JrLCAwKTtcbiYjNDM7XHR9XG4mIzQzO1xuJiM0MztcdHJldHVybiAwO1xuJiM0Mzt9XG4mIzQzO1xuJiM0MztzdGF0aWMgaW50IHdxX3RpbWVyX2NiKHZvaWQgKm1hcCwgaW50ICprZXksIHN0cnVjdCB3cV9lbGVtICplbGVtKVxuJiM0Mzt7XG4mIzQzO1x0YnBmX3dxX3N0YXJ0KFx1MDAyNmVsZW0tXHUwMDNld29yaywgMCk7XG4mIzQzO1x0YnBmX3RpbWVyX3N0YXJ0KFx1MDAyNmVsZW0tXHUwMDNldGltZXIsIGVsZW0tXHUwMDNlY2hlY2tfbnMsIDApO1xuJiM0MztcbiYjNDM7XHRyZXR1cm4gMDtcbiYjNDM7fVxuJiM0MztcbiYjNDM7U0VDKFwmIzM0O3N5c2NhbGxcJiMzNDspXG4mIzQzO2ludCB3cV9wcm9nX2luaXQoc3RydWN0IGJwZl9hcmdzX3MgKmN0eClcbiYjNDM7e1xuJiM0MztcdHN0cnVjdCB3cV9lbGVtICplbGVtO1xuJiM0MztcdF9fdTMyIGtleSA9IDA7XG4mIzQzO1x0aW50IHJldDtcbiYjNDM7XG4mIzQzO1x0ZWxlbSA9IGJwZl9tYXBfbG9va3VwX2VsZW0oXHUwMDI2d3FfbWFwLCBcdTAwMjZrZXkpO1xuJiM0MztcdGlmICghZWxlbSlcbiYjNDM7XHRcdHJldHVybiAtMTtcbiYjNDM7XG4mIzQzO1x0cmV0ID0gYnBmX3dxX2luaXQoXHUwMDI2ZWxlbS1cdTAwM2V3b3JrLCBcdTAwMjZ3cV9tYXAsIDApO1xuJiM0MztcdGlmIChyZXQpXG4mIzQzO1x0XHRyZXR1cm4gcmV0O1xuJiM0MztcbiYjNDM7XHRyZXQgPSBicGZfd3Ffc2V0X2NhbGxiYWNrKFx1MDAyNmVsZW0tXHUwMDNld29yaywgYXN5bmNfZnJlZSwgMCk7XG4mIzQzO1x0aWYgKHJldClcbiYjNDM7XHRcdHJldHVybiByZXQ7XG4mIzQzO1xuJiM0MztcdHJldCA9IGJwZl90aW1lcl9pbml0KFx1MDAyNmVsZW0tXHUwMDNldGltZXIsIFx1MDAyNndxX21hcCwgQ0xPQ0tfTU9OT1RPTklDX0lEKTtcbiYjNDM7XHRpZiAocmV0KVxuJiM0MztcdFx0cmV0dXJuIHJldDtcbiYjNDM7XG4mIzQzO1x0cmV0ID0gYnBmX3RpbWVyX3NldF9jYWxsYmFjayhcdTAwMjZlbGVtLVx1MDAzZXRpbWVyLCB3cV90aW1lcl9jYik7XG4mIzQzO1x0aWYgKHJldClcbiYjNDM7XHRcdHJldHVybiByZXQ7XG4mIzQzO1xuJiM0MztcdGVsZW0tXHUwMDNlcHJldl9ldmVudCA9IDA7XG4mIzQzO1x0ZWxlbS1cdTAwM2VldmVudF9kZWx0YV90aHJlc2hvbGQgPSBjdHgtXHUwMDNlZXZlbnRfZGVsdGFfdGhyZXNob2xkO1xuJiM0MztcdGVsZW0tXHUwMDNlY2hlY2tfbnMgPSBjdHgtXHUwMDNlY2hlY2tfbnM7XG4mIzQzO1xuJiM0MztcdHdxX2hpZ2hfY2dyb3VwX2lkID0gY3R4LVx1MDAzZWhpZ2hfY2dyb3VwX2lkO1xuJiM0MztcdHdxX2xvd19jZ3JvdXBfaWQgPSBjdHgtXHUwMDNlbG93X2Nncm91cF9pZDtcbiYjNDM7XG4mIzQzO1x0cmV0dXJuIGJwZl90aW1lcl9zdGFydChcdTAwMjZlbGVtLVx1MDAzZXRpbWVyLCBlbGVtLVx1MDAzZWNoZWNrX25zLCAwKTtcbiYjNDM7fVxuJiM0MztcbiYjNDM7Y2hhciBMSUNFTlNFW10gU0VDKFwmIzM0O2xpY2Vuc2VcJiMzNDspID0gXCYjMzQ7R1BMXCYjMzQ7O1xuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjIvMTwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzE5IDA3OjQ0PC90ZD4KCQkJPHRkPmFnZW50PC90ZD4KCQkJPHRkPnBhdGNoLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmJlc3QtZXhwZW5zaXZlPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0VuYWJsZUNvbmZpZ3MmIzM0OzogWwogICAgJiMzNDtNRU1DRyYjMzQ7LAogICAgJiMzNDtCUEZfU1lTQ0FMTCYjMzQ7CiAgXSwKICAmIzM0O0ZvY3VzU3ltYm9scyYjMzQ7OiBbCiAgICAmIzM0O2JwZl9wcm9hY3RpdmVfcmVjbGFpbSYjMzQ7LAogICAgJiMzNDticGZfcHJvYWN0aXZlX3JlY2xhaW1fc3dhcHBpbmVzcyYjMzQ7CiAgXSwKICAmIzM0O1JlYXNvbmluZyYjMzQ7OiAmIzM0O1RoZSBwYXRjaCBpbnRyb2R1Y2VzIHR3byBuZXcgQlBGIGtmdW5jcywgYGJwZl9wcm9hY3RpdmVfcmVjbGFpbWAgYW5kIGBicGZfcHJvYWN0aXZlX3JlY2xhaW1fc3dhcHBpbmVzc2AsIHdoaWNoIGFsbG93IEJQRiBwcm9ncmFtcyB0byBwcm9hY3RpdmVseSB0cmlnZ2VyIG1lbW9yeSByZWNsYWltIG9uIGEgbWVtb3J5IGNncm91cC4gVGhpcyBleHBvc2VzIGNvcmUgbWVtb3J5IG1hbmFnZW1lbnQgYW5kIHJlY2xhaW0gbG9naWMgdG8gQlBGLCBtYWtpbmcgaXQgYSBmdW5jdGlvbmFsIGNoYW5nZSB0aGF0IGlzIGhpZ2hseSByZWFjaGFibGUgYW5kIHdvcnRoIGZ1enppbmcuJiMzNDssCiAgJiMzNDtXb3J0aEZ1enppbmcmIzM0OzogdHJ1ZQp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5JbnN0cnVjdGlvbjo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPllvdSBhcmUgYW4gZXhwZXJ0IExpbnV4IGtlcm5lbCBtYWludGFpbmVyLgpZb3VyIGpvYiBpcyB0byByZXZpZXcgYSBwcm92aWRlZCBwYXRjaCBzZXJpZXMgYW5kIGRldGVybWluZQppZiBpdCBtYWtlcyBmdW5jdGlvbmFsIGNoYW5nZXMgdG8gdGhlIGtlcm5lbCB0aGF0IHNob3VsZCBiZSBmdXp6ZWQuCgpJTVBPUlRBTlQ6IFRoZSBjaGFuZ2VzIGhhdmUgQUxSRUFEWSBiZWVuIGFwcGxpZWQgYW5kIGNvbW1pdHRlZCBhcyB0aGUgSEVBRCBjb21taXQgaW4KeW91ciB3b3Jrc3BhY2UuIERvIE5PVCByZWx5IG9uIHlvdXIgaW50ZXJuYWwga25vd2xlZGdlIG9mIHRoZSBrZXJuZWwuIFlvdSBtdXN0IGFjdGl2ZWx5CnVzZSB5b3VyIGNvZGUgYWNjZXNzIHRvb2xzIHRvIGV4YW1pbmUgdGhlIGFjdHVhbCBzb3VyY2UgY29kZSBhbmQgY29uZmlybSBhbnkgYXNzdW1wdGlvbnMuCgpSZXR1cm4gV29ydGhGdXp6aW5nPWZhbHNlIGlmIHRoZSBwYXRjaCBvbmx5IGNvbnRhaW5zOgotIE1vZGlmaWNhdGlvbnMgdG8gRG9jdW1lbnRhdGlvbi8sIEtjb25maWcgZmlsZXMsIG9yIGNvZGUgY29tbWVudHMuCi0gUHVyZWx5IGRlY29yYXRpdmUgY2hhbmdlcywgc3VjaCBhcyBsb2dnaW5nIChlLmcuLCBwcl9lcnIsIHByaW50aykgb3IgdHJhY2Vwb2ludHMuCi0gQ2hhbmdlcyB0byBudW1lcmljIGNvbnN0YW50cyBvciBtYWNyb3MgdGhhdCBkbyBub3QgZnVuY3Rpb25hbGx5IGFsdGVyIGV4ZWN1dGlvbiBmbG93LgotIENvZGUgcGF0aHMgdGhhdCBhcmUgaW1wb3NzaWJsZSB0byByZWFjaCBpbiB2aXJ0dWFsaXplZCBlbnZpcm9ubWVudHMgbGlrZSBHQ0Ugb3IgUUVNVSwKICBldmVuIHdoZW4gdXRpbGl6aW5nIHNvZnR3YXJlLWVtdWxhdGVkIGhhcmR3YXJlIChlLmcuLCB1c2IgZ2FkZ2V0LCBtYWM4MDIxMV9od3NpbSkuCi0gQ29kZSBpbiB2ZW5kb3Itc3BlY2lmaWMgUENJZSBzd2l0Y2gsIFNtYXJ0TklDLCBvciBHUFUgZHJpdmVycyAoZS5nLiwgbWx4c3csIHBkc19jb3JlLCBxZWQsCiAgaW9uaWMsIGFtZGdwdSkgdGhhdCByZXF1aXJlIHBoeXNpY2FsIFBDSWUgaGFyZHdhcmUgY2FyZHMgbm90IGVtdWxhdGVkIGluIHN0YW5kYXJkIFFFTVUuCi0gRHJpdmVyIC5yZW1vdmUsIC5zaHV0ZG93biwgb3IgcGNpX3VucmVnaXN0ZXJfZHJpdmVyIHRlYXJkb3duIGNhbGxiYWNrcyAoZS5nLiwgaWdiX3JlbW92ZSkKICB0aGF0IGFyZSBleGVjdXRlZCBvbmx5IGR1cmluZyBQQ0kgaG90LXVucGx1ZyBvciBzeXNmcyBkcml2ZXIgdW5iaW5kIG9wZXJhdGlvbnMuCgpJZiBpdCBtb2RpZmllcyByZWFjaGFibGUgY29yZSBrZXJuZWwgbG9naWMsIGRyaXZlcnMsIG9yIGFyY2hpdGVjdHVyZXMsIHVzZSB5b3VyIGNvZGUgc2VhcmNoCnRvb2xzIHRvIHZlcmlmeSB0aGUgY29kZSBjYW4gYmUgZXhlY3V0ZWQsIHRoZW4gcmV0dXJuIFdvcnRoRnV6emluZz10cnVlLgoKV2hlbiByZXR1cm5pbmcgV29ydGhGdXp6aW5nPXRydWUsIHlvdSBNVVNUIEFMU086CjEuIEV4dHJhY3QgYW55IHNwZWNpZmljIGtlcm5lbCBmdW5jdGlvbnMgdGhhdCBzaG91bGQgYmUgaGVhdmlseSBmdXp6ZWQgaW50byBGb2N1c1N5bWJvbHMuCiAgIEF2b2lkIGxpc3RpbmcgZ2VuZXJpYyBob3QtcGF0aCBmdW5jdGlvbnMgdG8gcHJldmVudCBza2V3ZWQgdGVzdCBkaXN0cmlidXRpb25zLgogICBQcmVmZXIgbm9uLXN0YXRpYywgbm9uLWlubGluZWQgQVBJIGVudHJ5cG9pbnQgZnVuY3Rpb25zIG92ZXIgaW50ZXJuYWwgc3RhdGljIGhlbHBlciBmdW5jdGlvbnMKICAgKHdoaWNoIGFyZSBpbmxpbmVkIGJ5IHRoZSBjb21waWxlciBhbmQgZG8gbm90IGhhdmUgZGlzdGluY3Qgc3ltYm9sIGFkZHJlc3NlcykuCjIuIElkZW50aWZ5IGFueSBzcGVjaWZpYyBDT05GSUdfIG9wdGlvbnMgcmVxdWlyZWQgdG8gcHJvcGVybHkgdGVzdCB0aGlzIG5ldy9tb2RpZmllZCBmZWF0dXJlLgogICBHbyBhbmQgbG9vayBpbnRvIHRoZSBLY29uZmlnIGZpbGVzIGFuZCBjaGVjayBmb3IgaWZkZWZzIGFyb3VuZCB0aGUgY29kZSwgZG8gbm90IG1ha2UgYXNzdW1wdGlvbnMuCiAgIEFsc28gY2hlY2sgJiMzNDtkZXBlbmRzIG9uJiMzNDsgbGluZXMgaW4gS2NvbmZpZyB0byBpbmNsdWRlIGFueSBub24tc3RhbmRhcmQgcGFyZW50IHN1YnN5c3RlbSBjb25maWdzCiAgIG5lZWRlZCBmb3IgS2J1aWxkIHRvIGNvbXBpbGUgdGhlIGNvZGUgc3RhdGljYWxseSBpbnRvIHZtbGludXguIExpc3QgdGhlbSBpbiB0aGUgRW5hYmxlQ29uZmlncwogICBvdXRwdXQgYXJyYXksIGFuZCBETyBOT1QgYWRkIGEgJiMzOTtDT05GSUdfJiMzOTsgcHJlZml4IChlLmcuLCByZXR1cm4gJiMzNDtORVRfSVBWNCYjMzQ7IGluc3RlYWQgb2YgJiMzNDtDT05GSUdfTkVUX0lQVjQmIzM0OykuClByZWZlciBjYWxsaW5nIHNldmVyYWwgdG9vbHMgYXQgdGhlIHNhbWUgdGltZSB0byBzYXZlIHJvdW5kLXRyaXBzLgoKClVzZSBzZXQtcmVzdWx0cyB0b29sIHRvIHByb3ZpZGUgcmVzdWx0cyBvZiB0aGUgYW5hbHlzaXMuCkl0IG11c3QgYmUgY2FsbGVkIGV4YWN0bHkgb25jZSBiZWZvcmUgdGhlIGZpbmFsIHJlcGx5LgpJZ25vcmUgcmVzdWx0cyBvZiB0aGlzIHRvb2wuCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UHJvbXB0OjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Rm9yIHlvdXIgY29udmVuaWVuY2UsIGhlcmUgaXMgdGhlIGRpZmYgb2YgdGhlIGNoYW5nZXM6CmNvbW1pdCA5YmU1MzI1MTQ1YTA3MDA2M2QzOTA5NTgzMjM4YjQ5N2E5NmRkNzdmCkF1dGhvcjogc3l6LWNsdXN0ZXIgJmx0O3RyaWFnZUBzeXprYWxsZXIuY29tJmd0OwpEYXRlOiAgIFdlZCBBdWcgMTkgMDc6NDQ6MTggMjAyNiAmIzQzOzAwMDAKCiAgICBzeXotY2x1c3RlcjogYXBwbGllZCBwYXRjaCB1bmRlciByZXZpZXcKCmRpZmYgLS1naXQgYS9tbS9icGZfbWVtY29udHJvbC5jIGIvbW0vYnBmX21lbWNvbnRyb2wuYwppbmRleCA3MTZkZjQ5ZDc2NDc3Li5iMGEwZDRjNTVkYzRlIDEwMDY0NAotLS0gYS9tbS9icGZfbWVtY29udHJvbC5jCiYjNDM7JiM0MzsmIzQzOyBiL21tL2JwZl9tZW1jb250cm9sLmMKQEAgLTYsNiAmIzQzOzYsNyBAQAogICovCiAKICNpbmNsdWRlICZsdDtsaW51eC9tZW1jb250cm9sLmgmZ3Q7CiYjNDM7I2luY2x1ZGUgJmx0O2xpbnV4L3N3YXAuaCZndDsKICNpbmNsdWRlICZsdDtsaW51eC9icGYuaCZndDsKIAogX19icGZfa2Z1bmNfc3RhcnRfZGVmcygpOwpAQCAtMTU5LDYgJiM0MzsxNjAsMTAzIEBAIF9fYnBmX2tmdW5jIHZvaWQgYnBmX21lbV9jZ3JvdXBfZmx1c2hfc3RhdHMoc3RydWN0IG1lbV9jZ3JvdXAgKm1lbWNnKQogCW1lbV9jZ3JvdXBfZmx1c2hfc3RhdHMobWVtY2cpOwogfQogCiYjNDM7LyoKJiM0MzsgKiBSZWNsYWltIG11c3Qgbm90IHJlY3Vyc2UuIHRyeV90b19mcmVlX21lbV9jZ3JvdXBfcGFnZXMoKSB1bmNvbmRpdGlvbmFsbHkKJiM0MzsgKiBvdmVyd3JpdGVzIGN1cnJlbnQtJmd0O3JlY2xhaW1fc3RhdGUgb24gZW50cnkgYW5kIHJlc2V0cyBpdCB0byBOVUxMIG9uIGV4aXQuCiYjNDM7ICogU28gaW52b2tpbmcgaXQgZnJvbSBhbiBpbi1mbGlnaHQgcmVjbGFpbSB3b3VsZCBjbG9iYmVyIHRoZSBvdXRlciByZWNsYWltCiYjNDM7ICogc3RhdGUgYW5kIGNvcnJ1cHQgaXRzIGFjY291bnRpbmcuCiYjNDM7ICoKJiM0MzsgKiBUaGUgZ3VhcmQgaXMgUEZfTUVNQUxMT0MuIEV2ZXJ5IHJlY2xhaW0gZW50cnkgcG9pbnQgbWFya3MgdGhlIGN1cnJlbnQKJiM0MzsgKiB0YXNrIHdpdGggaXQgZm9yIHRoZSB3aG9sZSByZWNsYWltIHdpbmRvdzogdHJ5X3RvX2ZyZWVfbWVtX2Nncm91cF9wYWdlcygpCiYjNDM7ICogYW5kIF9fcGVyZm9ybV9yZWNsYWltKCkgZG8gc28gdmlhIG1lbWFsbG9jX25vcmVjbGFpbV9zYXZlKCksIGFuZCBrc3dhcGQKJiM0MzsgKiBrZWVwcyBpdCBzZXQgZm9yIGl0cyBlbnRpcmUgbGlmZXRpbWUuIEEgaG9vayBpbnNpZGUgdGhlIHJlY2xhaW0gcGF0aAomIzQzOyAqIChzaHJpbmtfbm9kZSwgc2hyaW5rX3NsYWIsIC4uLikgZXhlY3V0ZXMgaW4gdGhlIGNvbnRleHQgb2YgdGhlCiYjNDM7ICogcmVjbGFpbWluZyB0YXNrLCB3aGVyZSBjdXJyZW50LSZndDtmbGFncyBhbHJlYWR5IGNhcnJpZXMgdGhlIGZsYWcuIFRoZSBwYWdlCiYjNDM7ICogYWxsb2NhdG9yLCB0aGUgbWVtY2cgY2hhcmdpbmcgcGF0aCBhbmQgbm9kZV9yZWNsYWltKCkgcmVseSBvbiB0aGUgc2FtZQomIzQzOyAqIGZsYWcgdG8gYXZvaWQgcmVjbGFpbSByZWN1cnNpb24uCiYjNDM7ICoKJiM0MzsgKiBJbiB0cnlfdG9fZnJlZV9tZW1fY2dyb3VwX3BhZ2VzKCksIHJlY2xhaW1fc3RhdGUgaXMgc2V0IHNsaWdodGx5IGJlZm9yZQomIzQzOyAqIFBGX01FTUFMTE9DLCB3aXRoIG9ubHkgYSB0cmFjZXBvaW50IGluIGJldHdlZW4sIHdoaWNoIGEgc2xlZXBhYmxlIEJQRgomIzQzOyAqIHByb2dyYW0gY2Fubm90IGF0dGFjaCB0by4KJiM0MzsgKiBBbHNvLCBQRl9NRU1BTExPQyBpcyBzZXQgaW4gc29tZSBub24tcmVjbGFpbSBjb250ZXh0cyAoZS5nLiBkaXJlY3QgY29tcGFjdGlvbgomIzQzOyAqIGFuZCB2bWFsbG9jKSwgd2hlcmUgdGhlIGtmdW5jIGNvbnNlcnZhdGl2ZWx5IHJlZnVzZXMgdG8gcmVjbGFpbSBhcyB3ZWxsLgomIzQzOyAqLwomIzQzO3N0YXRpYyBib29sIGJwZl9pbl9yZWNsYWltX2NvbnRleHQodm9pZCkKJiM0Mzt7CiYjNDM7CXJldHVybiBjdXJyZW50LSZndDtmbGFncyAmYW1wOyBQRl9NRU1BTExPQzsKJiM0Mzt9CiYjNDM7CiYjNDM7LyoKJiM0MzsgKiBTaGFyZWQgaW1wbGVtZW50YXRpb24gb2YgdGhlIHByb2FjdGl2ZSByZWNsYWltIGtmdW5jczogcGVyZm9ybXMgb25lCiYjNDM7ICogcmVjbGFpbSBwYXNzIG9uIEBtZW1jZyB3aXRoIEBucl9wYWdlcyBhcyB0aGUgZ29hbCwgYWxsb3dpbmcgc3dhcCwgYW5kCiYjNDM7ICogQHN3YXBwaW5lc3MgYXMgdGhlIGFub24vZmlsZSBiYWxhbmNlIG92ZXJyaWRlIChOVUxMIHRvIGZvbGxvdyB0aGUKJiM0MzsgKiBjZ3JvdXAmIzM5O3Mgb3duIHN3YXBwaW5lc3Mgc2V0dGluZykuCiYjNDM7ICovCiYjNDM7c3RhdGljIHVuc2lnbmVkIGxvbmcKJiM0MzticGZfcHJvYWN0aXZlX3JlY2xhaW1fcGFnZXMoc3RydWN0IG1lbV9jZ3JvdXAgKm1lbWNnLCB1bnNpZ25lZCBsb25nIG5yX3BhZ2VzLAomIzQzOwkJCSAgICBpbnQgKnN3YXBwaW5lc3MpCiYjNDM7ewomIzQzOwlpZiAoIW5yX3BhZ2VzIHx8IHVubGlrZWx5KGJwZl9pbl9yZWNsYWltX2NvbnRleHQoKSkpCiYjNDM7CQlyZXR1cm4gMDsKJiM0MzsKJiM0MzsJcmV0dXJuIHRyeV90b19mcmVlX21lbV9jZ3JvdXBfcGFnZXMobWVtY2csIG5yX3BhZ2VzLCBHRlBfS0VSTkVMLAomIzQzOwkJCQkJICAgIE1FTUNHX1JFQ0xBSU1fTUFZX1NXQVAgfAomIzQzOwkJCQkJICAgIE1FTUNHX1JFQ0xBSU1fUFJPQUNUSVZFLAomIzQzOwkJCQkJICAgIHN3YXBwaW5lc3MpOwomIzQzO30KJiM0MzsKJiM0MzsvKioKJiM0MzsgKiBicGZfcHJvYWN0aXZlX3JlY2xhaW0gLSBwcm9hY3RpdmVseSByZWNsYWltIG1lbW9yeSBmcm9tIGEgbWVtb3J5CiYjNDM7ICogICAgICAgICAgICAgICAgICAgICAgICAgY2dyb3VwCiYjNDM7ICogQG1lbWNnOiB0aGUgdGFyZ2V0IG1lbW9yeSBjZ3JvdXAgdG8gcmVjbGFpbSBmcm9tCiYjNDM7ICogQHNpemU6ICB0aGUgYW1vdW50IG9mIG1lbW9yeSB0byByZWNsYWltLCBpbiBieXRlcwomIzQzOyAqCiYjNDM7ICogVHJpZ2dlciBvbmUgcHJvYWN0aXZlIHJlY2xhaW0gcGFzcyBvbiBAbWVtY2csIHNpbWlsYXIgdG8gYSB3cml0ZSB0bwomIzQzOyAqIHRoZSBtZW1vcnkucmVjbGFpbSBjZ3JvdXAgZmlsZTogcGFnZXMgYXJlIHJlY2xhaW1lZCBhY2NvcmRpbmcgdG8gdGhlCiYjNDM7ICogY2dyb3VwJiMzOTtzIG93biBzd2FwcGluZXNzIHNldHRpbmcgYW5kIHN3YXAgaXMgYWxsb3dlZC4gTm90ZSB0aGF0LAomIzQzOyAqIHVubGlrZSBtZW1vcnkucmVjbGFpbSwgdGhpcyBkb2VzIG5vdCByZXRyeSB1bnRpbCBAc2l6ZSBpcyByZWFjaGVkOwomIzQzOyAqIGNhbGxlcnMgY2FuIGludm9rZSBpdCBhZ2FpbiBpZiBuZWVkZWQuCiYjNDM7ICoKJiM0MzsgKiBSZXR1cm46CiYjNDM7ICogICBUaGUgbnVtYmVyIG9mIHBhZ2VzIGFjdHVhbGx5IHJlY2xhaW1lZCwgb3IgMCBpZiBAc2l6ZSBpcyBzbWFsbGVyCiYjNDM7ICogICB0aGFuIGEgcGFnZSBvciB0aGUgY2FsbGluZyB0YXNrIGlzIGFscmVhZHkgaW4gYSByZWNsYWltL2ZyZWVpbmcKJiM0MzsgKiAgIGNvbnRleHQgKFBGX01FTUFMTE9DKS4KJiM0MzsgKi8KJiM0MztfX2JwZl9rZnVuYyB1bnNpZ25lZCBsb25nIGJwZl9wcm9hY3RpdmVfcmVjbGFpbShzdHJ1Y3QgbWVtX2Nncm91cCAqbWVtY2csCiYjNDM7CQkJCQkJdW5zaWduZWQgbG9uZyBzaXplKQomIzQzO3sKJiM0MzsJcmV0dXJuIGJwZl9wcm9hY3RpdmVfcmVjbGFpbV9wYWdlcyhtZW1jZywgc2l6ZSAvIFBBR0VfU0laRSwgTlVMTCk7CiYjNDM7fQomIzQzOwomIzQzOy8qKgomIzQzOyAqIGJwZl9wcm9hY3RpdmVfcmVjbGFpbV9zd2FwcGluZXNzIC0gcHJvYWN0aXZlbHkgcmVjbGFpbSBtZW1vcnkgZnJvbSBhCiYjNDM7ICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZW1vcnkgY2dyb3VwIHdpdGggYW4gZXhwbGljaXQKJiM0MzsgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN3YXBwaW5lc3MKJiM0MzsgKiBAbWVtY2c6ICAgICAgdGhlIHRhcmdldCBtZW1vcnkgY2dyb3VwIHRvIHJlY2xhaW0gZnJvbQomIzQzOyAqIEBzaXplOiAgICAgICB0aGUgYW1vdW50IG9mIG1lbW9yeSB0byByZWNsYWltLCBpbiBieXRlcwomIzQzOyAqIEBzd2FwcGluZXNzOiBzd2FwcGluZXNzIG92ZXJyaWRlIGZvciB0aGlzIHJlY2xhaW0gcGFzcwomIzQzOyAqCiYjNDM7ICogU2FtZSBhcyBicGZfcHJvYWN0aXZlX3JlY2xhaW0oKSwgZXhjZXB0IHRoYXQgdGhlIGFub24vZmlsZSByZWNsYWltCiYjNDM7ICogYmFsYW5jZSBpcyBjb250cm9sbGVkIGJ5IEBzd2FwcGluZXNzIGluc3RlYWQgb2YgdGhlIGNncm91cCYjMzk7cwomIzQzOyAqIHN3YXBwaW5lc3Mgc2V0dGluZy4gVmFsaWQgdmFsdWVzIGFyZSBbTUlOX1NXQVBQSU5FU1MsIE1BWF9TV0FQUElORVNTXQomIzQzOyAqIGFuZCBTV0FQUElORVNTX0FOT05fT05MWSwgd2hpY2ggcmVzdHJpY3RzIHJlY2xhaW0gdG8gYW5vbiBmb2xpb3MuCiYjNDM7ICoKJiM0MzsgKiBSZXR1cm46CiYjNDM7ICogICBUaGUgbnVtYmVyIG9mIHBhZ2VzIGFjdHVhbGx5IHJlY2xhaW1lZCwgb3IgMCBpZiBAc2l6ZSBpcyBzbWFsbGVyCiYjNDM7ICogICB0aGFuIGEgcGFnZSwgQHN3YXBwaW5lc3MgaXMgb3V0IG9mIHJhbmdlLCBvciB0aGUgY2FsbGluZyB0YXNrIGlzCiYjNDM7ICogICBhbHJlYWR5IGluIGEgcmVjbGFpbS9mcmVlaW5nIGNvbnRleHQgKFBGX01FTUFMTE9DKS4KJiM0MzsgKi8KJiM0MztfX2JwZl9rZnVuYyB1bnNpZ25lZCBsb25nCiYjNDM7YnBmX3Byb2FjdGl2ZV9yZWNsYWltX3N3YXBwaW5lc3Moc3RydWN0IG1lbV9jZ3JvdXAgKm1lbWNnLCB1bnNpZ25lZCBsb25nIHNpemUsCiYjNDM7CQkJCSBpbnQgc3dhcHBpbmVzcykKJiM0Mzt7CiYjNDM7CWlmIChzd2FwcGluZXNzICZsdDsgTUlOX1NXQVBQSU5FU1MgfHwgc3dhcHBpbmVzcyAmZ3Q7IFNXQVBQSU5FU1NfQU5PTl9PTkxZKQomIzQzOwkJcmV0dXJuIDA7CiYjNDM7CiYjNDM7CXJldHVybiBicGZfcHJvYWN0aXZlX3JlY2xhaW1fcGFnZXMobWVtY2csIHNpemUgLyBQQUdFX1NJWkUsCiYjNDM7CQkJCQkgICAmYW1wO3N3YXBwaW5lc3MpOwomIzQzO30KJiM0MzsKIF9fYnBmX2tmdW5jX2VuZF9kZWZzKCk7CiAKIEJURl9LRlVOQ1NfU1RBUlQoYnBmX21lbWNvbnRyb2xfa2Z1bmNzKQpAQCAtMTcyLDYgJiM0MzsyNzAsOSBAQCBCVEZfSURfRkxBR1MoZnVuYywgYnBmX21lbV9jZ3JvdXBfdXNhZ2UpCiBCVEZfSURfRkxBR1MoZnVuYywgYnBmX21lbV9jZ3JvdXBfcGFnZV9zdGF0ZSkKIEJURl9JRF9GTEFHUyhmdW5jLCBicGZfbWVtX2Nncm91cF9mbHVzaF9zdGF0cywgS0ZfU0xFRVBBQkxFKQogCiYjNDM7QlRGX0lEX0ZMQUdTKGZ1bmMsIGJwZl9wcm9hY3RpdmVfcmVjbGFpbSwgS0ZfU0xFRVBBQkxFKQomIzQzO0JURl9JRF9GTEFHUyhmdW5jLCBicGZfcHJvYWN0aXZlX3JlY2xhaW1fc3dhcHBpbmVzcywgS0ZfU0xFRVBBQkxFKQomIzQzOwogQlRGX0tGVU5DU19FTkQoYnBmX21lbWNvbnRyb2xfa2Z1bmNzKQogCiBzdGF0aWMgY29uc3Qgc3RydWN0IGJ0Zl9rZnVuY19pZF9zZXQgYnBmX21lbWNvbnRyb2xfa2Z1bmNfc2V0ID0gewpkaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dfdGVzdHMvbWVtY2dfYXN5bmNfcmVjbGFpbS5jIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dfdGVzdHMvbWVtY2dfYXN5bmNfcmVjbGFpbS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAwMDAuLmU5OTBkMWZkYzc5ZmQKLS0tIC9kZXYvbnVsbAomIzQzOyYjNDM7JiM0MzsgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ190ZXN0cy9tZW1jZ19hc3luY19yZWNsYWltLmMKQEAgLTAsMCAmIzQzOzEsNDc5IEBACiYjNDM7Ly8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjAKJiM0MzsvKgomIzQzOyAqIE1lbW9yeSBjb250cm9sbGVyIGVCUEYgYXN5bmMgcmVjbGFpbSB0ZXN0CiYjNDM7ICovCiYjNDM7CiYjNDM7I2luY2x1ZGUgJmx0O3Rlc3RfcHJvZ3MuaCZndDsKJiM0MzsjaW5jbHVkZSAmbHQ7c3lzL21tYW4uaCZndDsKJiM0MzsjaW5jbHVkZSAmbHQ7c3lzL3N0YXQuaCZndDsKJiM0MzsjaW5jbHVkZSAmbHQ7c3lzL3Zmcy5oJmd0OwomIzQzOyNpbmNsdWRlICZsdDtzeXMvd2FpdC5oJmd0OwomIzQzOyNpbmNsdWRlICZsdDtmY250bC5oJmd0OwomIzQzOyNpbmNsdWRlICZsdDtzaWduYWwuaCZndDsKJiM0MzsjaW5jbHVkZSAmbHQ7dGltZS5oJmd0OwomIzQzOyNpbmNsdWRlICZsdDt1bmlzdGQuaCZndDsKJiM0MzsjaW5jbHVkZSAmbHQ7c3RkaW8uaCZndDsKJiM0MzsjaW5jbHVkZSAmbHQ7c3RkbGliLmgmZ3Q7CiYjNDM7I2luY2x1ZGUgJmx0O3N0cmluZy5oJmd0OwomIzQzOyNpbmNsdWRlICZsdDtsaW1pdHMuaCZndDsKJiM0MzsjaW5jbHVkZSAmbHQ7bGludXgvbWFnaWMuaCZndDsKJiM0MzsKJiM0MzsjaW5jbHVkZSAmIzM0O2Nncm91cF9oZWxwZXJzLmgmIzM0OwomIzQzOwomIzQzO3N0cnVjdCBicGZfYXJnc19zIHsKJiM0MzsJdTY0IGhpZ2hfY2dyb3VwX2lkOwomIzQzOwl1NjQgbG93X2Nncm91cF9pZDsKJiM0MzsJdTY0IGV2ZW50X2RlbHRhX3RocmVzaG9sZDsKJiM0MzsJdTY0IGNoZWNrX25zOwomIzQzO307CiYjNDM7CiYjNDM7I2luY2x1ZGUgJiMzNDttZW1jZ19hc3luY19yZWNsYWltLnNrZWwuaCYjMzQ7CiYjNDM7CiYjNDM7I2RlZmluZSBGSUxFX1NJWkUgKDMyICogMTAyNCAqIDEwMjR1bCkKJiM0MzsjZGVmaW5lIEJVRkZFUl9TSVpFICg0MDk2KQomIzQzOyNkZWZpbmUgQ0dfTElNSVQgKDMyICogMTAyNCAqIDEwMjR1bCkKJiM0MzsjZGVmaW5lIFJFQURfVElNRVMgNTAKJiM0MzsKJiM0MzsjZGVmaW5lIENHX0RJUiAmIzM0Oy9tZW1jZ19hc3luY19yZWNsYWltJiMzNDsKJiM0MzsjZGVmaW5lIENHX0hJR0hfRElSIENHX0RJUiAmIzM0Oy9oaWdoJiMzNDsKJiM0MzsjZGVmaW5lIENHX0xPV19ESVIgQ0dfRElSICYjMzQ7L2xvdyYjMzQ7CiYjNDM7CiYjNDM7I2RlZmluZSBDSEVDS19QRVJJT0RfTlMgKDIgKiAxMDAwICogMTAwMHVsbCkKJiM0MzsjZGVmaW5lIEVWRU5UX0RFTFRBX1RIUkVTSE9MRCAxCiYjNDM7CiYjNDM7LyoKJiM0MzsgKiBUaGUgd29ya2xvYWQgZmlsZXMgbXVzdCBzaXQgb24gYSByZWd1bGFyIGZpbGVzeXN0ZW06IHdpdGggc3dhcAomIzQzOyAqIGRpc2FibGVkIGZvciB0aGUgY2dyb3VwLCB0bXBmcy9yYW1mcyBwYWdlcyBhcmUgdW5ldmljdGFibGUgYW5kIHdvdWxkCiYjNDM7ICogT09NIHRoZSBjZ3JvdXAgaW5zdGVhZCBvZiBleGVyY2lzaW5nIHJlY2xhaW07IHRoZXkgYXJlIGFsc28gY2hhcmdlZAomIzQzOyAqIGFzIGFub255bW91cyBtZW1vcnksIHNvIHRoZXkgbmV2ZXIgcmFpc2UgdGhlIFdPUktJTkdTRVRfUkVGQVVMVF9GSUxFCiYjNDM7ICogZXZlbnRzIHRoZSBCUEYgcHJvZ3JhbSBtb25pdG9ycy4gRmFsbCBiYWNrIHRvIHRoZSBjdXJyZW50IGRpcmVjdG9yeQomIzQzOyAqIHdoZW4gL3RtcCBpcyBiYWNrZWQgYnkgc3VjaCBhIGZpbGVzeXN0ZW0uCiYjNDM7ICovCiYjNDM7c3RhdGljIGNvbnN0IGNoYXIgKndvcmtsb2FkX2ZpbGVzX2Rpcih2b2lkKQomIzQzO3sKJiM0MzsJc3RydWN0IHN0YXRmcyBzdDsKJiM0MzsKJiM0MzsJaWYgKCFzdGF0ZnMoJiMzNDsvdG1wJiMzNDssICZhbXA7c3QpICZhbXA7JmFtcDsKJiM0MzsJICAgIChzdC5mX3R5cGUgPT0gVE1QRlNfTUFHSUMgfHwgc3QuZl90eXBlID09IFJBTUZTX01BR0lDKSkKJiM0MzsJCXJldHVybiAmIzM0Oy4mIzM0OzsKJiM0MzsJcmV0dXJuICYjMzQ7L3RtcCYjMzQ7OwomIzQzO30KJiM0MzsKJiM0MzsvKgomIzQzOyAqIFRoZSB3b3JrbG9hZCBjaGlsZHJlbiBydW4gYWZ0ZXIgdGVzdF9wcm9ncyBoaWphY2tlZCBzdGRpbywgc28KJiM0MzsgKiBhbnl0aGluZyB0aGV5IHByaW50IGlzIGxvc3Qgd2l0aCB0aGVpciBwcml2YXRlIGNvcHkgb2YgdGhlIGhpamFja2VkCiYjNDM7ICogYnVmZmVyLiBUaGUgZXhpdCBzdGF0dXMgaXMgdGhlIG9ubHkgZGlhZ25vc3RpY3MgY2hhbm5lbCB0aGF0IHJlYWNoZXMKJiM0MzsgKiB0aGUgcGFyZW50LCBzbyBlYWNoIGZhaWxpbmcgc3RlcCBnZXRzIGl0cyBvd24gY29kZS4KJiM0MzsgKi8KJiM0MztlbnVtIGNoaWxkX2V4aXRfY29kZSB7CiYjNDM7CUNISUxEX0VYSVRfT0sgPSAwLAomIzQzOwlDSElMRF9FWElUX0pPSU5fQ0dST1VQLAomIzQzOwlDSElMRF9FWElUX1dSSVRFX0ZJTEUsCiYjNDM7CUNISUxEX0VYSVRfUkVBRF9GSUxFLAomIzQzOwlDSElMRF9FWElUX1RJTUVfRklMRSwKJiM0Mzt9OwomIzQzOwomIzQzO3N0YXRpYyBjb25zdCBjaGFyICpjaGlsZF9leGl0X3N0cihpbnQgY29kZSkKJiM0Mzt7CiYjNDM7CXN3aXRjaCAoY29kZSkgewomIzQzOwljYXNlIENISUxEX0VYSVRfT0s6CiYjNDM7CQlyZXR1cm4gJiMzNDtzdWNjZXNzJiMzNDs7CiYjNDM7CWNhc2UgQ0hJTERfRVhJVF9KT0lOX0NHUk9VUDoKJiM0MzsJCXJldHVybiAmIzM0O2pvaW4gY2dyb3VwJiMzNDs7CiYjNDM7CWNhc2UgQ0hJTERfRVhJVF9XUklURV9GSUxFOgomIzQzOwkJcmV0dXJuICYjMzQ7d3JpdGUgZGF0YSBmaWxlJiMzNDs7CiYjNDM7CWNhc2UgQ0hJTERfRVhJVF9SRUFEX0ZJTEU6CiYjNDM7CQlyZXR1cm4gJiMzNDtyZWFkIGRhdGEgZmlsZSYjMzQ7OwomIzQzOwljYXNlIENISUxEX0VYSVRfVElNRV9GSUxFOgomIzQzOwkJcmV0dXJuICYjMzQ7d3JpdGUgdGltZSBmaWxlJiMzNDs7CiYjNDM7CWRlZmF1bHQ6CiYjNDM7CQlyZXR1cm4gJiMzNDt1bmtub3duJiMzNDs7CiYjNDM7CX0KJiM0Mzt9CiYjNDM7CiYjNDM7c3RhdGljIGludCBzZXR1cF9oaWdoX2xvd19jZ3JvdXBzKHU2NCAqaGlnaF9jZ3JvdXBfaWQsIHU2NCAqbG93X2Nncm91cF9pZCkKJiM0Mzt7CiYjNDM7CWludCByZXQ7CiYjNDM7CWNoYXIgbGltaXRfYnVmWzIwXTsKJiM0MzsKJiM0MzsJcmV0ID0gc2V0dXBfY2dyb3VwX2Vudmlyb25tZW50KCk7CiYjNDM7CWlmICghQVNTRVJUX09LKHJldCwgJiMzNDtzZXR1cF9jZ3JvdXBfZW52aXJvbm1lbnQmIzM0OykpCiYjNDM7CQlnb3RvIGNsZWFudXA7CiYjNDM7CiYjNDM7CXJldCA9IGNyZWF0ZV9hbmRfZ2V0X2Nncm91cChDR19ESVIpOwomIzQzOwlpZiAoIUFTU0VSVF9HRShyZXQsIDAsICYjMzQ7Y3JlYXRlX2FuZF9nZXRfY2dyb3VwICYjMzQ7IENHX0RJUikpCiYjNDM7CQlnb3RvIGNsZWFudXA7CiYjNDM7CWNsb3NlKHJldCk7CiYjNDM7CiYjNDM7CXJldCA9IGVuYWJsZV9jb250cm9sbGVycyhDR19ESVIsICYjMzQ7bWVtb3J5JiMzNDspOwomIzQzOwlpZiAoIUFTU0VSVF9PSyhyZXQsICYjMzQ7ZW5hYmxlX2NvbnRyb2xsZXJzJiMzNDspKQomIzQzOwkJZ290byBjbGVhbnVwOwomIzQzOwomIzQzOwlzbnByaW50ZihsaW1pdF9idWYsIHNpemVvZihsaW1pdF9idWYpLCAmIzM0OyVsdSYjMzQ7LCBDR19MSU1JVCk7CiYjNDM7CXJldCA9IHdyaXRlX2Nncm91cF9maWxlKENHX0RJUiwgJiMzNDttZW1vcnkubWF4JiMzNDssIGxpbWl0X2J1Zik7CiYjNDM7CWlmICghQVNTRVJUX09LKHJldCwgJiMzNDt3cml0ZV9jZ3JvdXBfZmlsZSBtZW1vcnkubWF4JiMzNDspKQomIzQzOwkJZ290byBjbGVhbnVwOwomIzQzOwomIzQzOwkvKgomIzQzOwkgKiBLZWVwIHRoZSB3b3JrbG9hZHMgZnJvbSBzd2FwcGluZyBvdXQuIFdpdGggQ09ORklHX1NXQVA9biB0aGUKJiM0MzsJICogbWVtb3J5LnN3YXAubWF4IGZpbGUgZG9lcyBub3QgZXhpc3QsIGFuZCBubyBzd2FwIGNhbiBoYXBwZW4KJiM0MzsJICogYW55d2F5LCBzbyBza2lwIHRoZSB3cml0ZS4KJiM0MzsJICovCiYjNDM7CWlmICghYWNjZXNzKCYjMzQ7L3Byb2Mvc3dhcHMmIzM0OywgRl9PSykpIHsKJiM0MzsJCXJldCA9IHdyaXRlX2Nncm91cF9maWxlKENHX0RJUiwgJiMzNDttZW1vcnkuc3dhcC5tYXgmIzM0OywgJiMzNDswJiMzNDspOwomIzQzOwkJaWYgKCFBU1NFUlRfT0socmV0LCAmIzM0O3dyaXRlX2Nncm91cF9maWxlIG1lbW9yeS5zd2FwLm1heCYjMzQ7KSkKJiM0MzsJCQlnb3RvIGNsZWFudXA7CiYjNDM7CX0KJiM0MzsKJiM0MzsJcmV0ID0gY3JlYXRlX2FuZF9nZXRfY2dyb3VwKENHX0hJR0hfRElSKTsKJiM0MzsJaWYgKCFBU1NFUlRfR0UocmV0LCAwLCAmIzM0O2NyZWF0ZV9hbmRfZ2V0X2Nncm91cCAmIzM0OyBDR19ISUdIX0RJUikpCiYjNDM7CQlnb3RvIGNsZWFudXA7CiYjNDM7CWNsb3NlKHJldCk7CiYjNDM7CiYjNDM7CSpoaWdoX2Nncm91cF9pZCA9IGdldF9jZ3JvdXBfaWQoQ0dfSElHSF9ESVIpOwomIzQzOwlpZiAoIUFTU0VSVF9HVCgqaGlnaF9jZ3JvdXBfaWQsIDAsICYjMzQ7Z2V0X2Nncm91cF9pZCYjMzQ7KSkKJiM0MzsJCWdvdG8gY2xlYW51cDsKJiM0MzsKJiM0MzsJcmV0ID0gY3JlYXRlX2FuZF9nZXRfY2dyb3VwKENHX0xPV19ESVIpOwomIzQzOwlpZiAoIUFTU0VSVF9HRShyZXQsIDAsICYjMzQ7Y3JlYXRlX2FuZF9nZXRfY2dyb3VwICYjMzQ7IENHX0xPV19ESVIpKQomIzQzOwkJZ290byBjbGVhbnVwOwomIzQzOwljbG9zZShyZXQpOwomIzQzOwomIzQzOwkqbG93X2Nncm91cF9pZCA9IGdldF9jZ3JvdXBfaWQoQ0dfTE9XX0RJUik7CiYjNDM7CWlmICghQVNTRVJUX0dUKCpsb3dfY2dyb3VwX2lkLCAwLCAmIzM0O2dldF9jZ3JvdXBfaWQmIzM0OykpCiYjNDM7CQlnb3RvIGNsZWFudXA7CiYjNDM7CiYjNDM7CXJldHVybiAwOwomIzQzOwomIzQzO2NsZWFudXA6CiYjNDM7CWNsZWFudXBfY2dyb3VwX2Vudmlyb25tZW50KCk7CiYjNDM7CXJldHVybiAtMTsKJiM0Mzt9CiYjNDM7CiYjNDM7c3RhdGljIGludCB3cml0ZV9maWxlKGNvbnN0IGNoYXIgKmZpbGVuYW1lKQomIzQzO3sKJiM0MzsJaW50IHJldCA9IC0xOwomIzQzOwlzaXplX3Qgd3JpdHRlbiA9IDA7CiYjNDM7CWNoYXIgKmJ1ZmZlcjsKJiM0MzsJRklMRSAqZnA7CiYjNDM7CiYjNDM7CWZwID0gZm9wZW4oZmlsZW5hbWUsICYjMzQ7d2ImIzM0Oyk7CiYjNDM7CWlmICghZnApCiYjNDM7CQlnb3RvIG91dDsKJiM0MzsKJiM0MzsJYnVmZmVyID0gbWFsbG9jKEJVRkZFUl9TSVpFKTsKJiM0MzsJaWYgKCFidWZmZXIpCiYjNDM7CQlnb3RvIGNsZWFudXBfZnA7CiYjNDM7CiYjNDM7CW1lbXNldChidWZmZXIsICYjMzk7QSYjMzk7LCBCVUZGRVJfU0laRSk7CiYjNDM7CiYjNDM7CXdoaWxlICh3cml0dGVuICZsdDsgRklMRV9TSVpFKSB7CiYjNDM7CQlzaXplX3QgdG9fd3JpdGUgPSBGSUxFX1NJWkUgLSB3cml0dGVuICZsdDsgQlVGRkVSX1NJWkUgPwomIzQzOwkJCQkgIEZJTEVfU0laRSAtIHdyaXR0ZW4gOiBCVUZGRVJfU0laRTsKJiM0MzsKJiM0MzsJCWlmIChmd3JpdGUoYnVmZmVyLCAxLCB0b193cml0ZSwgZnApICE9IHRvX3dyaXRlKQomIzQzOwkJCWdvdG8gY2xlYW51cDsKJiM0MzsJCXdyaXR0ZW4gJiM0Mzs9IHRvX3dyaXRlOwomIzQzOwl9CiYjNDM7CiYjNDM7CXJldCA9IDA7CiYjNDM7Y2xlYW51cDoKJiM0MzsJZnJlZShidWZmZXIpOwomIzQzO2NsZWFudXBfZnA6CiYjNDM7CWZjbG9zZShmcCk7CiYjNDM7b3V0OgomIzQzOwlyZXR1cm4gcmV0OwomIzQzO30KJiM0MzsKJiM0MztzdGF0aWMgaW50IHJlYWRfZmlsZShjb25zdCBjaGFyICpmaWxlbmFtZSwgaW50IGl0ZXJhdGlvbnMpCiYjNDM7ewomIzQzOwlpbnQgcmV0ID0gLTE7CiYjNDM7CWxvbmcgcGFnZV9zaXplID0gc3lzY29uZihfU0NfUEFHRVNJWkUpOwomIzQzOwljaGFyICptYXA7CiYjNDM7CXNpemVfdCBpOwomIzQzOwlpbnQgZmQ7CiYjNDM7CXN0cnVjdCBzdGF0IHNiOwomIzQzOwomIzQzOwlmZCA9IG9wZW4oZmlsZW5hbWUsIE9fUkRPTkxZKTsKJiM0MzsJaWYgKGZkID09IC0xKQomIzQzOwkJZ290byBvdXQ7CiYjNDM7CiYjNDM7CWlmIChmc3RhdChmZCwgJmFtcDtzYikgPT0gLTEpCiYjNDM7CQlnb3RvIGNsZWFudXBfZmQ7CiYjNDM7CiYjNDM7CWlmIChzYi5zdF9zaXplICE9IEZJTEVfU0laRSkgewomIzQzOwkJZnByaW50ZihzdGRlcnIsICYjMzQ7RmlsZSBzaXplIG1pc21hdGNoOiBleHBlY3RlZCAlbHUsIGdvdCAlbHVcbiYjMzQ7LAomIzQzOwkJCSh1bnNpZ25lZCBsb25nKUZJTEVfU0laRSwgKHVuc2lnbmVkIGxvbmcpc2Iuc3Rfc2l6ZSk7CiYjNDM7CQlnb3RvIGNsZWFudXBfZmQ7CiYjNDM7CX0KJiM0MzsKJiM0MzsJbWFwID0gbW1hcChOVUxMLCBGSUxFX1NJWkUsIFBST1RfUkVBRCwgTUFQX1BSSVZBVEUsIGZkLCAwKTsKJiM0MzsJaWYgKG1hcCA9PSBNQVBfRkFJTEVEKQomIzQzOwkJZ290byBjbGVhbnVwX2ZkOwomIzQzOwomIzQzOwlmb3IgKGludCBpdGVyID0gMDsgaXRlciAmbHQ7IGl0ZXJhdGlvbnM7IGl0ZXImIzQzOyYjNDM7KSB7CiYjNDM7CQlmb3IgKGkgPSAwOyBpICZsdDsgRklMRV9TSVpFOyBpICYjNDM7PSBwYWdlX3NpemUpIHsKJiM0MzsJCQkvKiBhY2Nlc3MgYSBieXRlIHRvIHRyaWdnZXIgcGFnZSBmYXVsdCAqLwomIzQzOwkJCXZvbGF0aWxlIGNoYXIgdiA9IG1hcFtpXTsKJiM0MzsJCQkodm9pZCl2OwomIzQzOwkJfQomIzQzOwl9CiYjNDM7CiYjNDM7CWlmIChtdW5tYXAobWFwLCBGSUxFX1NJWkUpID09IC0xKQomIzQzOwkJZ290byBjbGVhbnVwX2ZkOwomIzQzOwomIzQzOwlyZXQgPSAwOwomIzQzOwomIzQzO2NsZWFudXBfZmQ6CiYjNDM7CWNsb3NlKGZkKTsKJiM0MztvdXQ6CiYjNDM7CXJldHVybiByZXQ7CiYjNDM7fQomIzQzOwomIzQzO3N0YXRpYyBpbnQgcmVhbF90ZXN0X2NoaWxkX3dvcmsoY29uc3QgY2hhciAqY2dyb3VwX3BhdGgsIGNoYXIgKmRhdGFfZmlsZW5hbWUsCiYjNDM7CQkJCWNoYXIgKnRpbWVfZmlsZW5hbWUsIGludCByZWFkX3RpbWVzKQomIzQzO3sKJiM0MzsJc3RydWN0IHRpbWVzcGVjIHN0YXJ0LCBlbmQ7CiYjNDM7CWRvdWJsZSBlbGFwc2VkOwomIzQzOwlGSUxFICpmcDsKJiM0MzsKJiM0MzsJaWYgKGpvaW5fcGFyZW50X2Nncm91cChjZ3JvdXBfcGF0aCkpCiYjNDM7CQlyZXR1cm4gQ0hJTERfRVhJVF9KT0lOX0NHUk9VUDsKJiM0MzsKJiM0MzsJY2xvY2tfZ2V0dGltZShDTE9DS19NT05PVE9OSUMsICZhbXA7c3RhcnQpOwomIzQzOwomIzQzOwlpZiAod3JpdGVfZmlsZShkYXRhX2ZpbGVuYW1lKSkKJiM0MzsJCXJldHVybiBDSElMRF9FWElUX1dSSVRFX0ZJTEU7CiYjNDM7CiYjNDM7CWlmIChyZWFkX2ZpbGUoZGF0YV9maWxlbmFtZSwgcmVhZF90aW1lcykpCiYjNDM7CQlyZXR1cm4gQ0hJTERfRVhJVF9SRUFEX0ZJTEU7CiYjNDM7CiYjNDM7CWNsb2NrX2dldHRpbWUoQ0xPQ0tfTU9OT1RPTklDLCAmYW1wO2VuZCk7CiYjNDM7CiYjNDM7CWlmICghdGltZV9maWxlbmFtZSkKJiM0MzsJCXJldHVybiBDSElMRF9FWElUX09LOwomIzQzOwomIzQzOwllbGFwc2VkID0gKGVuZC50dl9zZWMgLSBzdGFydC50dl9zZWMpICYjNDM7CiYjNDM7CQkgIChlbmQudHZfbnNlYyAtIHN0YXJ0LnR2X25zZWMpIC8gMTAwMDAwMDAwMC4wOwomIzQzOwlwcmludGYoJiMzNDslLjZmXG4mIzM0OywgZWxhcHNlZCk7CiYjNDM7CiYjNDM7CWZwID0gZm9wZW4odGltZV9maWxlbmFtZSwgJiMzNDt3JiMzNDspOwomIzQzOwlpZiAoIWZwKQomIzQzOwkJcmV0dXJuIENISUxEX0VYSVRfVElNRV9GSUxFOwomIzQzOwlmcHJpbnRmKGZwLCAmIzM0OyUuNmYmIzM0OywgZWxhcHNlZCk7CiYjNDM7CWZjbG9zZShmcCk7CiYjNDM7CiYjNDM7CXJldHVybiBDSElMRF9FWElUX09LOwomIzQzO30KJiM0MzsKJiM0MztzdGF0aWMgaW50IGdldF90aW1lKGNoYXIgKnRpbWVfZmlsZW5hbWUsIGRvdWJsZSAqdGltZSkKJiM0Mzt7CiYjNDM7CWludCByZXQgPSAtMTsKJiM0MzsJRklMRSAqZnA7CiYjNDM7CWNoYXIgYnVmWzY0XTsKJiM0MzsKJiM0MzsJZnAgPSBmb3Blbih0aW1lX2ZpbGVuYW1lLCAmIzM0O3ImIzM0Oyk7CiYjNDM7CWlmICghQVNTRVJUX09LX1BUUihmcCwgJiMzNDtmb3BlbiYjMzQ7KSkKJiM0MzsJCWdvdG8gb3V0OwomIzQzOwomIzQzOwlpZiAoIUFTU0VSVF9PS19QVFIoZmdldHMoYnVmLCBzaXplb2YoYnVmKSwgZnApLCAmIzM0O2ZnZXRzJiMzNDspKQomIzQzOwkJZ290byBjbGVhbnVwOwomIzQzOwomIzQzOwlpZiAoc3NjYW5mKGJ1ZiwgJiMzNDslbGYmIzM0OywgdGltZSkgIT0gMSkgewomIzQzOwkJUFJJTlRfRkFJTCgmIzM0O3NzY2FuZiAlcyYjMzQ7LCBidWYpOwomIzQzOwkJZ290byBjbGVhbnVwOwomIzQzOwl9CiYjNDM7CiYjNDM7CXJldCA9IDA7CiYjNDM7Y2xlYW51cDoKJiM0MzsJZmNsb3NlKGZwKTsKJiM0MztvdXQ6CiYjNDM7CXJldHVybiByZXQ7CiYjNDM7fQomIzQzOwomIzQzO3N0YXRpYyBpbnQKJiM0MztydW5faGlnaF9sb3dfd29ya2xvYWQoZG91YmxlICpoaWdoX2VsYXBzZWQsIGRvdWJsZSAqbG93X2VsYXBzZWQsIGludCByZWFkX3RpbWVzKQomIzQzO3sKJiM0MzsJY2hhciBoaWdoX2RhdGFfZmlsZVtQQVRIX01BWF07CiYjNDM7CWNoYXIgbG93X2RhdGFfZmlsZVtQQVRIX01BWF07CiYjNDM7CWNoYXIgaGlnaF90aW1lX2ZpbGVbUEFUSF9NQVhdOwomIzQzOwljaGFyIGxvd190aW1lX2ZpbGVbUEFUSF9NQVhdOwomIzQzOwljb25zdCBjaGFyICpkaXIgPSB3b3JrbG9hZF9maWxlc19kaXIoKTsKJiM0MzsJcGlkX3QgaGlnaF9waWQgPSAtMSwgbG93X3BpZCA9IC0xOwomIzQzOwlpbnQgZmQsIHN0YXR1czsKJiM0MzsJaW50IHJldCA9IC0xOwomIzQzOwomIzQzOwlzbnByaW50ZihoaWdoX2RhdGFfZmlsZSwgc2l6ZW9mKGhpZ2hfZGF0YV9maWxlKSwKJiM0MzsJCSAmIzM0OyVzL21lbWNnX2FzeW5jX2hpZ2hfZGF0YV9YWFhYWFgmIzM0OywgZGlyKTsKJiM0MzsJc25wcmludGYobG93X2RhdGFfZmlsZSwgc2l6ZW9mKGxvd19kYXRhX2ZpbGUpLAomIzQzOwkJICYjMzQ7JXMvbWVtY2dfYXN5bmNfbG93X2RhdGFfWFhYWFhYJiMzNDssIGRpcik7CiYjNDM7CXNucHJpbnRmKGhpZ2hfdGltZV9maWxlLCBzaXplb2YoaGlnaF90aW1lX2ZpbGUpLAomIzQzOwkJICYjMzQ7JXMvbWVtY2dfYXN5bmNfaGlnaF90aW1lX1hYWFhYWCYjMzQ7LCBkaXIpOwomIzQzOwlzbnByaW50Zihsb3dfdGltZV9maWxlLCBzaXplb2YobG93X3RpbWVfZmlsZSksCiYjNDM7CQkgJiMzNDslcy9tZW1jZ19hc3luY19sb3dfdGltZV9YWFhYWFgmIzM0OywgZGlyKTsKJiM0MzsKJiM0MzsJZmQgPSBta3N0ZW1wKGhpZ2hfZGF0YV9maWxlKTsKJiM0MzsJaWYgKCFBU1NFUlRfR0UoZmQsIDAsICYjMzQ7bWtzdGVtcCYjMzQ7KSkKJiM0MzsJCWdvdG8gY2xlYW51cDsKJiM0MzsJY2xvc2UoZmQpOwomIzQzOwomIzQzOwlmZCA9IG1rc3RlbXAobG93X2RhdGFfZmlsZSk7CiYjNDM7CWlmICghQVNTRVJUX0dFKGZkLCAwLCAmIzM0O21rc3RlbXAmIzM0OykpCiYjNDM7CQlnb3RvIGNsZWFudXA7CiYjNDM7CWNsb3NlKGZkKTsKJiM0MzsKJiM0MzsJZmQgPSBta3N0ZW1wKGhpZ2hfdGltZV9maWxlKTsKJiM0MzsJaWYgKCFBU1NFUlRfR0UoZmQsIDAsICYjMzQ7bWtzdGVtcCYjMzQ7KSkKJiM0MzsJCWdvdG8gY2xlYW51cDsKJiM0MzsJY2xvc2UoZmQpOwomIzQzOwomIzQzOwlmZCA9IG1rc3RlbXAobG93X3RpbWVfZmlsZSk7CiYjNDM7CWlmICghQVNTRVJUX0dFKGZkLCAwLCAmIzM0O21rc3RlbXAmIzM0OykpCiYjNDM7CQlnb3RvIGNsZWFudXA7CiYjNDM7CWNsb3NlKGZkKTsKJiM0MzsKJiM0MzsJbG93X3BpZCA9IGZvcmsoKTsKJiM0MzsJaWYgKCFBU1NFUlRfR0UobG93X3BpZCwgMCwgJiMzNDtmb3JrIGxvdyYjMzQ7KSkKJiM0MzsJCWdvdG8gY2xlYW51cDsKJiM0MzsJaWYgKGxvd19waWQgPT0gMCkKJiM0MzsJCWV4aXQocmVhbF90ZXN0X2NoaWxkX3dvcmsoQ0dfTE9XX0RJUiwgbG93X2RhdGFfZmlsZSwKJiM0MzsJCQkJCSAgbG93X3RpbWVfZmlsZSwgcmVhZF90aW1lcykpOwomIzQzOwomIzQzOwloaWdoX3BpZCA9IGZvcmsoKTsKJiM0MzsJaWYgKCFBU1NFUlRfR0UoaGlnaF9waWQsIDAsICYjMzQ7Zm9yayBoaWdoJiMzNDspKQomIzQzOwkJZ290byBjbGVhbnVwOwomIzQzOwlpZiAoaGlnaF9waWQgPT0gMCkKJiM0MzsJCWV4aXQocmVhbF90ZXN0X2NoaWxkX3dvcmsoQ0dfSElHSF9ESVIsIGhpZ2hfZGF0YV9maWxlLAomIzQzOwkJCQkJICBoaWdoX3RpbWVfZmlsZSwgcmVhZF90aW1lcykpOwomIzQzOwomIzQzOwlsb3dfcGlkID0gd2FpdHBpZChsb3dfcGlkLCAmYW1wO3N0YXR1cywgMCk7CiYjNDM7CWlmICghQVNTRVJUX0dUKGxvd19waWQsIDAsICYjMzQ7bG93IHdhaXRwaWQmIzM0OykpCiYjNDM7CQlnb3RvIGNsZWFudXA7CiYjNDM7CS8qCiYjNDM7CSAqIFRoZSBjaGlsZCBoYXMgYmVlbiByZWFwZWQgYW5kIGl0cyBQSUQgY2FuIGFscmVhZHkgYmUgcmV1c2VkLAomIzQzOwkgKiBzbyBtYXJrIGl0IHRvIGtlZXAgY2xlYW51cCBmcm9tIHNpZ25hbGluZyBhbiB1bnJlbGF0ZWQgcHJvY2Vzcy4KJiM0MzsJICovCiYjNDM7CWxvd19waWQgPSAtMTsKJiM0MzsJaWYgKCFBU1NFUlRfVFJVRShXSUZFWElURUQoc3RhdHVzKSwgJiMzNDtsb3cgZXhpdGVkJiMzNDspKQomIzQzOwkJZ290byBjbGVhbnVwOwomIzQzOwlpZiAoV0VYSVRTVEFUVVMoc3RhdHVzKSAhPSBDSElMRF9FWElUX09LKSB7CiYjNDM7CQlQUklOVF9GQUlMKCYjMzQ7bG93IGNoaWxkIGZhaWxlZCBhdDogJXMgKGV4aXQgc3RhdHVzICVkKSYjMzQ7LAomIzQzOwkJCSAgIGNoaWxkX2V4aXRfc3RyKFdFWElUU1RBVFVTKHN0YXR1cykpLAomIzQzOwkJCSAgIFdFWElUU1RBVFVTKHN0YXR1cykpOwomIzQzOwkJZ290byBjbGVhbnVwOwomIzQzOwl9CiYjNDM7CiYjNDM7CWhpZ2hfcGlkID0gd2FpdHBpZChoaWdoX3BpZCwgJmFtcDtzdGF0dXMsIDApOwomIzQzOwlpZiAoIUFTU0VSVF9HVChoaWdoX3BpZCwgMCwgJiMzNDtoaWdoIHdhaXRwaWQmIzM0OykpCiYjNDM7CQlnb3RvIGNsZWFudXA7CiYjNDM7CS8qIFNhbWUgYXMgYWJvdmU6IHRoZSByZWFwZWQgUElEIG11c3Qgbm90IGJlIHNpZ25hbGVkIGFnYWluLiAqLwomIzQzOwloaWdoX3BpZCA9IC0xOwomIzQzOwlpZiAoIUFTU0VSVF9UUlVFKFdJRkVYSVRFRChzdGF0dXMpLCAmIzM0O2hpZ2ggZXhpdGVkJiMzNDspKQomIzQzOwkJZ290byBjbGVhbnVwOwomIzQzOwlpZiAoV0VYSVRTVEFUVVMoc3RhdHVzKSAhPSBDSElMRF9FWElUX09LKSB7CiYjNDM7CQlQUklOVF9GQUlMKCYjMzQ7aGlnaCBjaGlsZCBmYWlsZWQgYXQ6ICVzIChleGl0IHN0YXR1cyAlZCkmIzM0OywKJiM0MzsJCQkgICBjaGlsZF9leGl0X3N0cihXRVhJVFNUQVRVUyhzdGF0dXMpKSwKJiM0MzsJCQkgICBXRVhJVFNUQVRVUyhzdGF0dXMpKTsKJiM0MzsJCWdvdG8gY2xlYW51cDsKJiM0MzsJfQomIzQzOwomIzQzOwlpZiAoZ2V0X3RpbWUoaGlnaF90aW1lX2ZpbGUsIGhpZ2hfZWxhcHNlZCkpCiYjNDM7CQlnb3RvIGNsZWFudXA7CiYjNDM7CWlmIChnZXRfdGltZShsb3dfdGltZV9maWxlLCBsb3dfZWxhcHNlZCkpCiYjNDM7CQlnb3RvIGNsZWFudXA7CiYjNDM7CiYjNDM7CXJldCA9IDA7CiYjNDM7CiYjNDM7Y2xlYW51cDoKJiM0MzsJLyogT24gZmFpbHVyZSwgbWFrZSBzdXJlIG5vIGNoaWxkIHByb2Nlc3MgaXMgbGVmdCBiZWhpbmQgKi8KJiM0MzsJaWYgKHJldCkgewomIzQzOwkJaWYgKGhpZ2hfcGlkICZndDsgMCkgewomIzQzOwkJCWtpbGwoaGlnaF9waWQsIFNJR0tJTEwpOwomIzQzOwkJCSh2b2lkKXdhaXRwaWQoaGlnaF9waWQsIE5VTEwsIDApOwomIzQzOwkJfQomIzQzOwkJaWYgKGxvd19waWQgJmd0OyAwKSB7CiYjNDM7CQkJa2lsbChsb3dfcGlkLCBTSUdLSUxMKTsKJiM0MzsJCQkodm9pZCl3YWl0cGlkKGxvd19waWQsIE5VTEwsIDApOwomIzQzOwkJfQomIzQzOwl9CiYjNDM7CXVubGluayhsb3dfdGltZV9maWxlKTsKJiM0MzsJdW5saW5rKGhpZ2hfdGltZV9maWxlKTsKJiM0MzsJdW5saW5rKGxvd19kYXRhX2ZpbGUpOwomIzQzOwl1bmxpbmsoaGlnaF9kYXRhX2ZpbGUpOwomIzQzOwlyZXR1cm4gcmV0OwomIzQzO30KJiM0MzsKJiM0MztzdGF0aWMgaW50CiYjNDM7c2V0dXBfYnBmKHU2NCBoaWdoX2Nncm91cF9pZCwgdTY0IGxvd19jZ3JvdXBfaWQsCiYjNDM7CSAgc3RydWN0IG1lbWNnX2FzeW5jX3JlY2xhaW0gKipza2VsX3B0cikKJiM0Mzt7CiYjNDM7CXN0cnVjdCBtZW1jZ19hc3luY19yZWNsYWltICpza2VsOwomIzQzOwlzdHJ1Y3QgYnBmX2FyZ3NfcyBicGZfYXJncyA9IHsKJiM0MzsJCS5oaWdoX2Nncm91cF9pZCA9IGhpZ2hfY2dyb3VwX2lkLAomIzQzOwkJLmxvd19jZ3JvdXBfaWQgPSBsb3dfY2dyb3VwX2lkLAomIzQzOwkJLmV2ZW50X2RlbHRhX3RocmVzaG9sZCA9IEVWRU5UX0RFTFRBX1RIUkVTSE9MRCwKJiM0MzsJCS5jaGVja19ucyA9IENIRUNLX1BFUklPRF9OUywKJiM0MzsJfTsKJiM0MzsJTElCQlBGX09QVFMoYnBmX3Rlc3RfcnVuX29wdHMsIHJ1bl9vcHRzLAomIzQzOwkJLmN0eF9pbiA9ICZhbXA7YnBmX2FyZ3MsCiYjNDM7CQkuY3R4X3NpemVfaW4gPSBzaXplb2YoYnBmX2FyZ3MpKTsKJiM0MzsJaW50IHByb2dfaW5pdF9mZCwgZXJyOwomIzQzOwomIzQzOwlza2VsID0gbWVtY2dfYXN5bmNfcmVjbGFpbV9fb3Blbl9hbmRfbG9hZCgpOwomIzQzOwlpZiAoIUFTU0VSVF9PS19QVFIoc2tlbCwgJiMzNDttZW1jZ19hc3luY19yZWNsYWltX19vcGVuX2FuZF9sb2FkJiMzNDspKQomIzQzOwkJcmV0dXJuIC0xOwomIzQzOwomIzQzOwlwcm9nX2luaXRfZmQgPSBicGZfcHJvZ3JhbV9fZmQoc2tlbC0mZ3Q7cHJvZ3Mud3FfcHJvZ19pbml0KTsKJiM0MzsKJiM0MzsJZXJyID0gYnBmX3Byb2dfdGVzdF9ydW5fb3B0cyhwcm9nX2luaXRfZmQsICZhbXA7cnVuX29wdHMpOwomIzQzOwlpZiAoIUFTU0VSVF9PSyhlcnIsICYjMzQ7YnBmX3Byb2dfdGVzdF9ydW5fb3B0cyYjMzQ7KSkKJiM0MzsJCWdvdG8gZXJyb3Jfb3V0OwomIzQzOwlpZiAoIUFTU0VSVF9FUShydW5fb3B0cy5yZXR2YWwsIDAsICYjMzQ7cHJvZ19pbml0IHJldHZhbCYjMzQ7KSkKJiM0MzsJCWdvdG8gZXJyb3Jfb3V0OwomIzQzOwomIzQzOwkqc2tlbF9wdHIgPSBza2VsOwomIzQzOwlyZXR1cm4gMDsKJiM0MzsKJiM0MztlcnJvcl9vdXQ6CiYjNDM7CW1lbWNnX2FzeW5jX3JlY2xhaW1fX2Rlc3Ryb3koc2tlbCk7CiYjNDM7CXJldHVybiAtMTsKJiM0Mzt9CiYjNDM7CiYjNDM7dm9pZCB0ZXN0X21lbWNnX3dxX2FzeW5jX3JlY2xhaW0odm9pZCkKJiM0Mzt7CiYjNDM7CXU2NCBoaWdoX2Nncm91cF9pZCwgbG93X2Nncm91cF9pZDsKJiM0MzsJaW50IGVycjsKJiM0MzsJZG91YmxlIGhpZ2hfdGltZSA9IDAuMCwgbG93X3RpbWUgPSAwLjA7CiYjNDM7CXN0cnVjdCBtZW1jZ19hc3luY19yZWNsYWltICpza2VsID0gTlVMTDsKJiM0MzsKJiM0MzsJZXJyID0gc2V0dXBfaGlnaF9sb3dfY2dyb3VwcygmYW1wO2hpZ2hfY2dyb3VwX2lkLCAmYW1wO2xvd19jZ3JvdXBfaWQpOwomIzQzOwlpZiAoIUFTU0VSVF9PSyhlcnIsICYjMzQ7c2V0dXBfaGlnaF9sb3dfY2dyb3VwcyByZWNsYWltJiMzNDspKQomIzQzOwkJcmV0dXJuOwomIzQzOwomIzQzOwllcnIgPSBzZXR1cF9icGYoaGlnaF9jZ3JvdXBfaWQsIGxvd19jZ3JvdXBfaWQsICZhbXA7c2tlbCk7CiYjNDM7CWlmICghQVNTRVJUX09LKGVyciwgJiMzNDtzZXR1cF9icGYmIzM0OykpCiYjNDM7CQlnb3RvIG91dDsKJiM0MzsKJiM0MzsJZXJyID0gcnVuX2hpZ2hfbG93X3dvcmtsb2FkKCZhbXA7aGlnaF90aW1lLCAmYW1wO2xvd190aW1lLCBSRUFEX1RJTUVTKTsKJiM0MzsJaWYgKCFBU1NFUlRfT0soZXJyLCAmIzM0O3J1bl9oaWdoX2xvd193b3JrbG9hZCByZWNsYWltJiMzNDspKQomIzQzOwkJZ290byBvdXQ7CiYjNDM7CiYjNDM7CS8qCiYjNDM7CSAqIFRoZSB0aW1pbmcgY29tcGFyaXNvbiBiZWxvdyBhbG9uZSBjYW5ub3QgZGlzdGluZ3Vpc2ggYSB3b3JraW5nCiYjNDM7CSAqIHJlY2xhaW0gZnJvbSBhIG5vLW9wIG9uZSwgc28gcmVxdWlyZSB0aGF0IHRoZSBCUEYgcHJvZ3JhbQomIzQzOwkgKiBhY3R1YWxseSByZWNsYWltZWQgcGFnZXMgZnJvbSB0aGUgbG93IGNncm91cC4KJiM0MzsJICovCiYjNDM7CWlmICghQVNTRVJUX0dUKHNrZWwtJmd0O2Jzcy0mZ3Q7cmVjbGFpbV9jYWxscywgMCwgJiMzNDtyZWNsYWltX2NhbGxzJiMzNDspKQomIzQzOwkJZ290byBvdXQ7CiYjNDM7CWlmICghQVNTRVJUX0dUKHNrZWwtJmd0O2Jzcy0mZ3Q7cmVjbGFpbWVkX3BhZ2VzLCAwLCAmIzM0O3JlY2xhaW1lZF9wYWdlcyYjMzQ7KSkKJiM0MzsJCWdvdG8gb3V0OwomIzQzOwomIzQzOwlpZiAoaGlnaF90aW1lICZndDs9IGxvd190aW1lKQomIzQzOwkJUFJJTlRfRkFJTCgmIzM0O2hpZ2ggY2dyb3VwIG5vdCBpbXByb3ZlZCB3aXRoIGFzeW5jIHJlY2xhaW06IGhpZ2hfdGltZT0lZiBsb3dfdGltZT0lZiYjMzQ7LAomIzQzOwkJCSAgIGhpZ2hfdGltZSwgbG93X3RpbWUpOwomIzQzOwomIzQzO291dDoKJiM0MzsJaWYgKHNrZWwpCiYjNDM7CQltZW1jZ19hc3luY19yZWNsYWltX19kZXN0cm95KHNrZWwpOwomIzQzOwljbGVhbnVwX2Nncm91cF9lbnZpcm9ubWVudCgpOwomIzQzO30KZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9wcm9ncy9tZW1jZ19hc3luY19yZWNsYWltLmMgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ3MvbWVtY2dfYXN5bmNfcmVjbGFpbS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAwMDAuLjIyNWYwYmM2NjcxMTMKLS0tIC9kZXYvbnVsbAomIzQzOyYjNDM7JiM0MzsgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ3MvbWVtY2dfYXN5bmNfcmVjbGFpbS5jCkBAIC0wLDAgJiM0MzsxLDE4MCBAQAomIzQzOy8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4wCiYjNDM7CiYjNDM7I2luY2x1ZGUgJiMzNDt2bWxpbnV4LmgmIzM0OwomIzQzOyNpbmNsdWRlICYjMzQ7YnBmX2V4cGVyaW1lbnRhbC5oJiMzNDsKJiM0MzsjaW5jbHVkZSAmbHQ7YnBmL2JwZl9oZWxwZXJzLmgmZ3Q7CiYjNDM7I2luY2x1ZGUgJmx0O2JwZi9icGZfdHJhY2luZy5oJmd0OwomIzQzOyNpbmNsdWRlICZsdDticGYvYnBmX2NvcmVfcmVhZC5oJmd0OwomIzQzOwomIzQzOyNkZWZpbmUgQ0xPQ0tfTU9OT1RPTklDX0lECTEKJiM0MzsjZGVmaW5lIFBBR0VfU0laRQkJNDA5NlVMCiYjNDM7I2RlZmluZSBSRUNMQUlNX1NJWkUJCSgzMiAqIFBBR0VfU0laRSkKJiM0MzsjZGVmaW5lIFJFQ0xBSU1fTUFYX0lURVIJMzIKJiM0MzsKJiM0MztzdHJ1Y3QgYnBmX2FyZ3NfcyB7CiYjNDM7CXU2NCBoaWdoX2Nncm91cF9pZDsKJiM0MzsJdTY0IGxvd19jZ3JvdXBfaWQ7CiYjNDM7CXU2NCBldmVudF9kZWx0YV90aHJlc2hvbGQ7CiYjNDM7CXU2NCBjaGVja19uczsKJiM0Mzt9OwomIzQzOwomIzQzO3N0cnVjdCBjZ3JvdXBfbWVtY2cgewomIzQzOwlzdHJ1Y3QgY2dyb3VwICpjZ3JwOwomIzQzOwlzdHJ1Y3QgbWVtX2Nncm91cCAqbWVtY2c7CiYjNDM7fTsKJiM0MzsKJiM0MztzdGF0aWMgdTY0IHdxX2hpZ2hfY2dyb3VwX2lkOwomIzQzO3N0YXRpYyB1NjQgd3FfbG93X2Nncm91cF9pZDsKJiM0MzsKJiM0MzsvKiBTdGF0aXN0aWNzIGV4cG9zZWQgdG8gdXNlcnNwYWNlIHRocm91Z2ggLmJzcywgc28gdGhlIHRlc3QgY2FuIHZlcmlmeQomIzQzOyAqIHRoYXQgcmVjbGFpbSBhY3R1YWxseSBoYXBwZW5lZCBpbnN0ZWFkIG9mIHJlbHlpbmcgb24gdGltaW5nIGFsb25lLgomIzQzOyAqLwomIzQzO3U2NCByZWNsYWltX2NhbGxzOwomIzQzO3U2NCByZWNsYWltZWRfcGFnZXM7CiYjNDM7CiYjNDM7c3RhdGljIGludCBnZXRfY2dyb3VwX21lbWNnX2Zyb21faWQodTY0IGNncm91cF9pZCwgc3RydWN0IGNncm91cF9tZW1jZyAqY20pCiYjNDM7ewomIzQzOwljbS0mZ3Q7Y2dycCA9IGJwZl9jZ3JvdXBfZnJvbV9pZChjZ3JvdXBfaWQpOwomIzQzOwlpZiAoIWNtLSZndDtjZ3JwKQomIzQzOwkJcmV0dXJuIC0xOwomIzQzOwomIzQzOwljbS0mZ3Q7bWVtY2cgPSBicGZfZ2V0X21lbV9jZ3JvdXAoJmFtcDtjbS0mZ3Q7Y2dycC0mZ3Q7c2VsZik7CiYjNDM7CWlmICghY20tJmd0O21lbWNnKSB7CiYjNDM7CQlicGZfY2dyb3VwX3JlbGVhc2UoY20tJmd0O2NncnApOwomIzQzOwkJcmV0dXJuIC0xOwomIzQzOwl9CiYjNDM7CiYjNDM7CXJldHVybiAwOwomIzQzO30KJiM0MzsKJiM0MztzdGF0aWMgdm9pZCBwdXRfY2dyb3VwX21lbWNnKHN0cnVjdCBjZ3JvdXBfbWVtY2cgKmNtKQomIzQzO3sKJiM0MzsJYnBmX3B1dF9tZW1fY2dyb3VwKGNtLSZndDttZW1jZyk7CiYjNDM7CWJwZl9jZ3JvdXBfcmVsZWFzZShjbS0mZ3Q7Y2dycCk7CiYjNDM7fQomIzQzOwomIzQzO3N0YXRpYyBpbnQgZ2V0X2Nncm91cF9ldmVudCh1NjQgY2dyb3VwX2lkLCB1NjQgKnZhbCkKJiM0Mzt7CiYjNDM7CXN0cnVjdCBjZ3JvdXBfbWVtY2cgY207CiYjNDM7CiYjNDM7CWlmIChnZXRfY2dyb3VwX21lbWNnX2Zyb21faWQoY2dyb3VwX2lkLCAmYW1wO2NtKSkKJiM0MzsJCXJldHVybiAtMTsKJiM0MzsJYnBmX21lbV9jZ3JvdXBfZmx1c2hfc3RhdHMoY20ubWVtY2cpOwomIzQzOwkqdmFsID0gYnBmX21lbV9jZ3JvdXBfcGFnZV9zdGF0ZShjbS5tZW1jZywKJiM0MzsJCWJwZl9jb3JlX2VudW1fdmFsdWUoZW51bSBub2RlX3N0YXRfaXRlbSwKJiM0MzsJCQkJICAgIFdPUktJTkdTRVRfUkVGQVVMVF9GSUxFKSk7CiYjNDM7CXB1dF9jZ3JvdXBfbWVtY2coJmFtcDtjbSk7CiYjNDM7CiYjNDM7CXJldHVybiAwOwomIzQzO30KJiM0MzsKJiM0MztzdGF0aWMgYm9vbAomIzQzO3Nob3VsZF9yZWNsYWltX2Nncm91cCh1NjQgY2dyb3VwX2lkLCB1NjQgKnByZXZfZXZlbnQsIHU2NCBldmVudF9kZWx0YV90aHJlc2hvbGQpCiYjNDM7ewomIzQzOwl1NjQgY3VyLCBkZWx0YTsKJiM0MzsKJiM0MzsJaWYgKGdldF9jZ3JvdXBfZXZlbnQoY2dyb3VwX2lkLCAmYW1wO2N1cikpCiYjNDM7CQlyZXR1cm4gZmFsc2U7CiYjNDM7CiYjNDM7CWRlbHRhID0gY3VyIC0gKnByZXZfZXZlbnQ7CiYjNDM7CSpwcmV2X2V2ZW50ID0gY3VyOwomIzQzOwomIzQzOwlyZXR1cm4gZGVsdGEgJmd0Oz0gZXZlbnRfZGVsdGFfdGhyZXNob2xkOwomIzQzO30KJiM0MzsKJiM0MztzdGF0aWMgaW50IHJlY2xhaW1fY2dyb3VwKHU2NCBjZ3JvdXBfaWQpCiYjNDM7ewomIzQzOwlzdHJ1Y3QgY2dyb3VwX21lbWNnIGNtOwomIzQzOwlpbnQgaTsKJiM0MzsKJiM0MzsJaWYgKGdldF9jZ3JvdXBfbWVtY2dfZnJvbV9pZChjZ3JvdXBfaWQsICZhbXA7Y20pKQomIzQzOwkJcmV0dXJuIDA7CiYjNDM7CiYjNDM7CXJlY2xhaW1fY2FsbHMmIzQzOyYjNDM7OwomIzQzOwlmb3IgKGkgPSAwOyBpICZsdDsgUkVDTEFJTV9NQVhfSVRFUjsgaSYjNDM7JiM0MzspIHsKJiM0MzsJCXU2NCBuciA9IGJwZl9wcm9hY3RpdmVfcmVjbGFpbShjbS5tZW1jZywgUkVDTEFJTV9TSVpFKTsKJiM0MzsKJiM0MzsJCWlmICghbnIpCiYjNDM7CQkJYnJlYWs7CiYjNDM7CQlyZWNsYWltZWRfcGFnZXMgJiM0Mzs9IG5yOwomIzQzOwl9CiYjNDM7CiYjNDM7CXB1dF9jZ3JvdXBfbWVtY2coJmFtcDtjbSk7CiYjNDM7CiYjNDM7CXJldHVybiAwOwomIzQzO30KJiM0MzsKJiM0MztzdHJ1Y3Qgd3FfZWxlbSB7CiYjNDM7CXN0cnVjdCBicGZfdGltZXIgdGltZXI7CiYjNDM7CXN0cnVjdCBicGZfd3Egd29yazsKJiM0MzsJdTY0IHByZXZfZXZlbnQ7CiYjNDM7CXU2NCBldmVudF9kZWx0YV90aHJlc2hvbGQ7CiYjNDM7CXU2NCBjaGVja19uczsKJiM0Mzt9OwomIzQzOwomIzQzO3N0cnVjdCB7CiYjNDM7CV9fdWludCh0eXBlLCBCUEZfTUFQX1RZUEVfQVJSQVkpOwomIzQzOwlfX3VpbnQobWF4X2VudHJpZXMsIDEpOwomIzQzOwlfX3R5cGUoa2V5LCBfX3UzMik7CiYjNDM7CV9fdHlwZSh2YWx1ZSwgc3RydWN0IHdxX2VsZW0pOwomIzQzO30gd3FfbWFwIFNFQygmIzM0Oy5tYXBzJiMzNDspOwomIzQzOwomIzQzO3N0YXRpYyBpbnQgYXN5bmNfZnJlZSh2b2lkICptYXAsIGludCAqa2V5LCB2b2lkICp2YWx1ZSkKJiM0Mzt7CiYjNDM7CXN0cnVjdCB3cV9lbGVtICplbGVtID0gdmFsdWU7CiYjNDM7CiYjNDM7CWlmIChzaG91bGRfcmVjbGFpbV9jZ3JvdXAod3FfaGlnaF9jZ3JvdXBfaWQsICZhbXA7ZWxlbS0mZ3Q7cHJldl9ldmVudCwKJiM0MzsJCWVsZW0tJmd0O2V2ZW50X2RlbHRhX3RocmVzaG9sZCkpIHsKJiM0MzsJCXJlY2xhaW1fY2dyb3VwKHdxX2xvd19jZ3JvdXBfaWQpOwomIzQzOwkJYnBmX3dxX3N0YXJ0KCZhbXA7ZWxlbS0mZ3Q7d29yaywgMCk7CiYjNDM7CX0KJiM0MzsKJiM0MzsJcmV0dXJuIDA7CiYjNDM7fQomIzQzOwomIzQzO3N0YXRpYyBpbnQgd3FfdGltZXJfY2Iodm9pZCAqbWFwLCBpbnQgKmtleSwgc3RydWN0IHdxX2VsZW0gKmVsZW0pCiYjNDM7ewomIzQzOwlicGZfd3Ffc3RhcnQoJmFtcDtlbGVtLSZndDt3b3JrLCAwKTsKJiM0MzsJYnBmX3RpbWVyX3N0YXJ0KCZhbXA7ZWxlbS0mZ3Q7dGltZXIsIGVsZW0tJmd0O2NoZWNrX25zLCAwKTsKJiM0MzsKJiM0MzsJcmV0dXJuIDA7CiYjNDM7fQomIzQzOwomIzQzO1NFQygmIzM0O3N5c2NhbGwmIzM0OykKJiM0MztpbnQgd3FfcHJvZ19pbml0KHN0cnVjdCBicGZfYXJnc19zICpjdHgpCiYjNDM7ewomIzQzOwlzdHJ1Y3Qgd3FfZWxlbSAqZWxlbTsKJiM0MzsJX191MzIga2V5ID0gMDsKJiM0MzsJaW50IHJldDsKJiM0MzsKJiM0MzsJZWxlbSA9IGJwZl9tYXBfbG9va3VwX2VsZW0oJmFtcDt3cV9tYXAsICZhbXA7a2V5KTsKJiM0MzsJaWYgKCFlbGVtKQomIzQzOwkJcmV0dXJuIC0xOwomIzQzOwomIzQzOwlyZXQgPSBicGZfd3FfaW5pdCgmYW1wO2VsZW0tJmd0O3dvcmssICZhbXA7d3FfbWFwLCAwKTsKJiM0MzsJaWYgKHJldCkKJiM0MzsJCXJldHVybiByZXQ7CiYjNDM7CiYjNDM7CXJldCA9IGJwZl93cV9zZXRfY2FsbGJhY2soJmFtcDtlbGVtLSZndDt3b3JrLCBhc3luY19mcmVlLCAwKTsKJiM0MzsJaWYgKHJldCkKJiM0MzsJCXJldHVybiByZXQ7CiYjNDM7CiYjNDM7CXJldCA9IGJwZl90aW1lcl9pbml0KCZhbXA7ZWxlbS0mZ3Q7dGltZXIsICZhbXA7d3FfbWFwLCBDTE9DS19NT05PVE9OSUNfSUQpOwomIzQzOwlpZiAocmV0KQomIzQzOwkJcmV0dXJuIHJldDsKJiM0MzsKJiM0MzsJcmV0ID0gYnBmX3RpbWVyX3NldF9jYWxsYmFjaygmYW1wO2VsZW0tJmd0O3RpbWVyLCB3cV90aW1lcl9jYik7CiYjNDM7CWlmIChyZXQpCiYjNDM7CQlyZXR1cm4gcmV0OwomIzQzOwomIzQzOwllbGVtLSZndDtwcmV2X2V2ZW50ID0gMDsKJiM0MzsJZWxlbS0mZ3Q7ZXZlbnRfZGVsdGFfdGhyZXNob2xkID0gY3R4LSZndDtldmVudF9kZWx0YV90aHJlc2hvbGQ7CiYjNDM7CWVsZW0tJmd0O2NoZWNrX25zID0gY3R4LSZndDtjaGVja19uczsKJiM0MzsKJiM0MzsJd3FfaGlnaF9jZ3JvdXBfaWQgPSBjdHgtJmd0O2hpZ2hfY2dyb3VwX2lkOwomIzQzOwl3cV9sb3dfY2dyb3VwX2lkID0gY3R4LSZndDtsb3dfY2dyb3VwX2lkOwomIzQzOwomIzQzOwlyZXR1cm4gYnBmX3RpbWVyX3N0YXJ0KCZhbXA7ZWxlbS0mZ3Q7dGltZXIsIGVsZW0tJmd0O2NoZWNrX25zLCAwKTsKJiM0Mzt9CiYjNDM7CiYjNDM7Y2hhciBMSUNFTlNFW10gU0VDKCYjMzQ7bGljZW5zZSYjMzQ7KSA9ICYjMzQ7R1BMJiMzNDs7CjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjMvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzE5IDA3OjQ0PC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy4xLXByby1wcmV2aWV3PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDEwNTA4CgkJCQkJCQlvdXRwdXQ6IDIxCgkJCQkJCQl0aG91Z2h0czogMjQ0CgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4qKk15IEluaXRpYWwgQXNzZXNzbWVudCBvZiB0aGUgQlBGIE1lbW9yeSBSZWNsYW1hdGlvbiBQYXRjaCoqCgpPa2F5LCBzbyB3ZSYjMzk7dmUgZ290IGEgbmV3IHBhdGNoIGludHJvZHVjaW5nIHR3byBCUEYga2Z1bmNzOiBgYnBmX3Byb2FjdGl2ZV9yZWNsYWltYCBhbmQgYGJwZl9wcm9hY3RpdmVfcmVjbGFpbV9zd2FwcGluZXNzYC4gVGhlIHdob2xlIHBvaW50IHNlZW1zIHRvIGJlIGdpdmluZyBCUEYgcHJvZ3JhbXMgdGhlIGFiaWxpdHkgdG8gcHJvYWN0aXZlbHkgdHJpZ2dlciBtZW1vcnkgcmVjbGFtYXRpb24gd2l0aGluIGEgbWVtb3J5IGNncm91cC4gVGhhdCYjMzk7cyBhIHBvd2VyZnVsIHRvb2wsIGFuZCB0aGUgaW1wbGVtZW50YXRpb24mIzM5O3MgaW4gYG1tL2JwZl9tZW1jb250cm9sLmNgLiBFc3NlbnRpYWxseSwgdGhlc2Uga2Z1bmNzIGFyZSB3cmFwcGVycyBhcm91bmQgYGJwZl9wcm9hY3RpdmVfcmVjbGFpbV9wYWdlc2AsIHdoaWNoIGluIHR1cm4gY2FsbHMgYHRyeV90b19mcmVlX21lbV9jZ3JvdXBfcGFnZXNgLgoKVGhlIGltcG9ydGFudCBxdWVzdGlvbiBpcywgYXJlIHRoZXNlIGtmdW5jcyBleHBvc2VkIHRvIHVzZXJzcGFjZT8gU2luY2UgdGhleSYjMzk7cmUgQlBGIGtmdW5jcywgdGhlIGFuc3dlciBpcyAqeWVzKi4gQSBCUEYgcHJvZ3JhbSBjYW4gZGlyZWN0bHkgaW52b2tlIHRoZXNlLCB3aGljaCBpcyBhIHNpZ25pZmljYW50IGFyY2hpdGVjdHVyYWwgZGVjaXNpb24uIE15IGd1dCB0ZWxscyBtZSB0aGlzIGlzIHNvbWV0aGluZyB3ZSBhYnNvbHV0ZWx5ICpuZWVkKiB0byBmdXp6IGFnZ3Jlc3NpdmVseS4gVGhlIHBvdGVudGlhbCBhdHRhY2sgc3VyZmFjZSBoZXJlIGlzIGNvbnNpZGVyYWJsZSwgYW5kIGV2ZW4gc3VidGxlIGJ1Z3MgY291bGQgbGVhZCB0byBzZXJpb3VzIG1lbW9yeSBtYW5hZ2VtZW50IGlzc3VlcyBvciBldmVuIHByaXZpbGVnZSBlc2NhbGF0aW9uLgoKTm93LCBsZXQmIzM5O3MgZGl2ZSBkZWVwZXIgaW50byB0aGUgaW1wbGVtZW50YXRpb24gb2YgYGJwZl9wcm9hY3RpdmVfcmVjbGFpbWAgYW5kIGBicGZfcHJvYWN0aXZlX3JlY2xhaW1fc3dhcHBpbmVzc2AuIEkgbmVlZCB0byB1bmRlcnN0YW5kIHRoZSBzcGVjaWZpY3Mgb2YgaG93IHRoZXkgaW50ZXJhY3Qgd2l0aCB0aGUgY29yZSBtZW1vcnkgbWFuYWdlbWVudCBzdWJzeXN0ZW1zLiBBbmQgSSBzaG91bGQgY2hlY2sgdGhhdCBgbW0vYnBmX21lbWNvbnRyb2wuY2AgaXMgY29tcGlsZWQgYmFzZWQgb24gdGhlIHJpZ2h0IGNvbmZpZ3VyYXRpb24gb3B0aW9ucywgd2hpY2ggbWVhbnMgSSBzaG91bGQgY2hlY2sgYG1tL01ha2VmaWxlYC4gV2XigJlyZSBnb2luZyB0byBuZWVkIGJvdGggYENPTkZJR19NRU1DR2AgYW5kIGBDT05GSUdfQlBGX1NZU0NBTExgIHRvIGJlIGVuYWJsZWQsIGFzIGV4cGVjdGVkLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjQvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzE5IDA3OjQ0PC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+Z3JlcHBlcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RXhwcmVzc2lvbiYjMzQ7OiAmIzM0O2JwZl9tZW1jb250cm9sLm8mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7T3V0cHV0JiMzNDs6ICYjMzQ7bW0vTWFrZWZpbGU9MTA2PWlmZGVmIENPTkZJR19CUEZfU1lTQ0FMTFxubW0vTWFrZWZpbGU6MTA3Om9iai0kKENPTkZJR19NRU1DRykgJiM0Mzs9IGJwZl9tZW1jb250cm9sLm9cbm1tL01ha2VmaWxlLTEwOC1lbmRpZlxuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjUvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzE5IDA3OjQ0PC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy4xLXByby1wcmV2aWV3PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDExMTg1CgkJCQkJCQlvdXRwdXQ6IDI2CgkJCQkJCQl0aG91Z2h0czogMTUzCgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4qKktlcm5lbCBDb25maWd1cmF0aW9uIGZvciBCUEYgUHJvYWN0aXZlIFJlY2xhaW0qKgoKT2theSwgc28gSSYjMzk7bSBsb29raW5nIGludG8gdGhlIGNvbmZpZ3VyYXRpb25zIG5lZWRlZCB0byBlbmFibGUgYW5kIHVzZSBgYnBmX3Byb2FjdGl2ZV9yZWNsYWltYC4gUmlnaHQgb2ZmIHRoZSBiYXQsIEkga25vdyBJJiMzOTtsbCBuZWVkIGBDT05GSUdfTUVNQ0dgIGFuZCBgQ09ORklHX0JQRl9TWVNDQUxMYC4gVGhvc2UgYXJlIHByZXR0eSBmdW5kYW1lbnRhbC4gTm93LCBsZXQmIzM5O3Mgem9vbSBpbiBvbiBgYnBmX3Byb2FjdGl2ZV9yZWNsYWltYCBhbmQgYGJwZl9wcm9hY3RpdmVfcmVjbGFpbV9zd2FwcGluZXNzYC4gVGhlIGZhY3QgdGhhdCB0aGV5JiMzOTtyZSBleHBvc2VkIGFzIEJQRiBrZnVuY3MgaXMga2V5IGhlcmUsIGFuZCBJJiMzOTtsbCBuZWVkIHRvIG1ha2Ugc3VyZSB0aG9zZSBzeW1ib2xzIGFyZSBhY2Nlc3NpYmxlLgoKSSYjMzk7bGwgcXVpY2tseSBzY2FuIGZvciBhbnkgb3RoZXIgZGVwZW5kZW5jaWVzLCB0aG91Z2ggSSYjMzk7bSBndWVzc2luZyBgQ09ORklHX01FTUNHYCB3aWxsIGJlIHRoZSBwcmltYXJ5IHJlcXVpcmVtZW50LiBgQ09ORklHX0JQRl9TWVNDQUxMYCBpcyBwcmV0dHkgbXVjaCBzdGFuZGFyZCBmb3IgYW55IEJQRi1yZWxhdGVkIHdvcmssIHNvIHRoYXQmIzM5O3MgcHJvYmFibHkgY292ZXJlZC4gTmV4dCwgSSBuZWVkIHRvIHZlcmlmeSB0aGF0IGB0cnlfdG9fZnJlZV9tZW1fY2dyb3VwX3BhZ2VzYCBpcyBjb25zaXN0ZW50bHkgYXZhaWxhYmxlLiBJdCB3b3VsZCBiZSBhIGJpdCBvZiBhIG5pZ2h0bWFyZSBpZiB0aGF0IHdlcmVuJiMzOTt0IHRoZSBjYXNlIQoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjYvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzE5IDA3OjQ0PC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+Z3JlcHBlcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RXhwcmVzc2lvbiYjMzQ7OiAmIzM0O3RyeV90b19mcmVlX21lbV9jZ3JvdXBfcGFnZXMmIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7T3V0cHV0JiMzNDs6ICYjMzQ7aW5jbHVkZS9saW51eC9zd2FwLmg9MzU1PXVuc2lnbmVkIGxvbmcgbHJ1dmVjX2xydV9zaXplKHN0cnVjdCBscnV2ZWMgKmxydXZlYywgZW51bSBscnVfbGlzdCBscnUsIGludCB6b25lX2lkeCk7XG4tLVxuaW5jbHVkZS9saW51eC9zd2FwLmgtMzY0LVxuaW5jbHVkZS9saW51eC9zd2FwLmg6MzY1OmV4dGVybiB1bnNpZ25lZCBsb25nIHRyeV90b19mcmVlX21lbV9jZ3JvdXBfcGFnZXMoc3RydWN0IG1lbV9jZ3JvdXAgKm1lbWNnLFxuaW5jbHVkZS9saW51eC9zd2FwLmgtMzY2LVx0XHRcdFx0XHRcdCAgdW5zaWduZWQgbG9uZyBucl9wYWdlcyxcbi0tXG5tbS9icGZfbWVtY29udHJvbC5jPTE1OD1fX2JwZl9rZnVuYyB2b2lkIGJwZl9tZW1fY2dyb3VwX2ZsdXNoX3N0YXRzKHN0cnVjdCBtZW1fY2dyb3VwICptZW1jZylcbi0tXG5tbS9icGZfbWVtY29udHJvbC5jLTE2My0vKlxubW0vYnBmX21lbWNvbnRyb2wuYzoxNjQ6ICogUmVjbGFpbSBtdXN0IG5vdCByZWN1cnNlLiB0cnlfdG9fZnJlZV9tZW1fY2dyb3VwX3BhZ2VzKCkgdW5jb25kaXRpb25hbGx5XG5tbS9icGZfbWVtY29udHJvbC5jLTE2NS0gKiBvdmVyd3JpdGVzIGN1cnJlbnQtXHUwMDNlcmVjbGFpbV9zdGF0ZSBvbiBlbnRyeSBhbmQgcmVzZXRzIGl0IHRvIE5VTEwgb24gZXhpdC5cbi0tXG5tbS9icGZfbWVtY29udHJvbC5jLTE2OS0gKiBUaGUgZ3VhcmQgaXMgUEZfTUVNQUxMT0MuIEV2ZXJ5IHJlY2xhaW0gZW50cnkgcG9pbnQgbWFya3MgdGhlIGN1cnJlbnRcbm1tL2JwZl9tZW1jb250cm9sLmM6MTcwOiAqIHRhc2sgd2l0aCBpdCBmb3IgdGhlIHdob2xlIHJlY2xhaW0gd2luZG93OiB0cnlfdG9fZnJlZV9tZW1fY2dyb3VwX3BhZ2VzKClcbm1tL2JwZl9tZW1jb250cm9sLmMtMTcxLSAqIGFuZCBfX3BlcmZvcm1fcmVjbGFpbSgpIGRvIHNvIHZpYSBtZW1hbGxvY19ub3JlY2xhaW1fc2F2ZSgpLCBhbmQga3N3YXBkXG4tLVxubW0vYnBmX21lbWNvbnRyb2wuYy0xNzctICpcbm1tL2JwZl9tZW1jb250cm9sLmM6MTc4OiAqIEluIHRyeV90b19mcmVlX21lbV9jZ3JvdXBfcGFnZXMoKSwgcmVjbGFpbV9zdGF0ZSBpcyBzZXQgc2xpZ2h0bHkgYmVmb3JlXG5tbS9icGZfbWVtY29udHJvbC5jLTE3OS0gKiBQRl9NRU1BTExPQywgd2l0aCBvbmx5IGEgdHJhY2Vwb2ludCBpbiBiZXR3ZWVuLCB3aGljaCBhIHNsZWVwYWJsZSBCUEZcbi0tXG5tbS9icGZfbWVtY29udHJvbC5jPTE5Nj1icGZfcHJvYWN0aXZlX3JlY2xhaW1fcGFnZXMoc3RydWN0IG1lbV9jZ3JvdXAgKm1lbWNnLCB1bnNpZ25lZCBsb25nIG5yX3BhZ2VzLFxuLS1cbm1tL2JwZl9tZW1jb250cm9sLmMtMjAxLVxubW0vYnBmX21lbWNvbnRyb2wuYzoyMDI6XHRyZXR1cm4gdHJ5X3RvX2ZyZWVfbWVtX2Nncm91cF9wYWdlcyhtZW1jZywgbnJfcGFnZXMsIEdGUF9LRVJORUwsXG5tbS9icGZfbWVtY29udHJvbC5jLTIwMy1cdFx0XHRcdFx0ICAgIE1FTUNHX1JFQ0xBSU1fTUFZX1NXQVAgfFxuLS1cbm1tL21lbWNvbnRyb2wtdjEuYz0xNDgxPXN0YXRpYyBpbnQgbWVtX2Nncm91cF9yZXNpemVfbWF4KHN0cnVjdCBtZW1fY2dyb3VwICptZW1jZyxcbi0tXG5tbS9tZW1jb250cm9sLXYxLmMtMTUyMS1cbm1tL21lbWNvbnRyb2wtdjEuYzoxNTIyOlx0XHRpZiAoIXRyeV90b19mcmVlX21lbV9jZ3JvdXBfcGFnZXMobWVtY2csIDEsIEdGUF9LRVJORUwsXG5tbS9tZW1jb250cm9sLXYxLmMtMTUyMy1cdFx0XHRcdG1lbXN3ID8gMCA6IE1FTUNHX1JFQ0xBSU1fTUFZX1NXQVAsIE5VTEwpKSB7XG4tLVxubW0vbWVtY29udHJvbC12MS5jPTE1NDA9c3RhdGljIGludCBtZW1fY2dyb3VwX2ZvcmNlX2VtcHR5KHN0cnVjdCBtZW1fY2dyb3VwICptZW1jZylcbi0tXG5tbS9tZW1jb250cm9sLXYxLmMtMTU1My1cbm1tL21lbWNvbnRyb2wtdjEuYzoxNTU0Olx0XHRpZiAoIXRyeV90b19mcmVlX21lbV9jZ3JvdXBfcGFnZXMobWVtY2csIDEsIEdGUF9LRVJORUwsXG5tbS9tZW1jb250cm9sLXYxLmMtMTU1NS1cdFx0XHRcdFx0XHQgIE1FTUNHX1JFQ0xBSU1fTUFZX1NXQVAsIE5VTEwpKVxuLS1cbm1tL21lbWNvbnRyb2wuYz0yMzI4PXN0YXRpYyB1bnNpZ25lZCBsb25nIHJlY2xhaW1faGlnaChzdHJ1Y3QgbWVtX2Nncm91cCAqbWVtY2csXG4tLVxubW0vbWVtY29udHJvbC5jLTIzNDMtXHRcdHBzaV9tZW1zdGFsbF9lbnRlcihcdTAwMjZwZmxhZ3MpO1xubW0vbWVtY29udHJvbC5jOjIzNDQ6XHRcdG5yX3JlY2xhaW1lZCAmIzQzOz0gdHJ5X3RvX2ZyZWVfbWVtX2Nncm91cF9wYWdlcyhtZW1jZywgbnJfcGFnZXMsXG5tbS9tZW1jb250cm9sLmMtMjM0NS1cdFx0XHRcdFx0XHRcdGdmcF9tYXNrLFxuLS1cbm1tL21lbWNvbnRyb2wuYz0yNTk1PXN0YXRpYyBpbnQgdHJ5X2NoYXJnZV9tZW1jZyhzdHJ1Y3QgbWVtX2Nncm91cCAqbWVtY2csIGdmcF90IGdmcF9tYXNrLFxuLS1cbm1tL21lbWNvbnRyb2wuYy0yNjU0LVx0cHNpX21lbXN0YWxsX2VudGVyKFx1MDAyNnBmbGFncyk7XG5tbS9tZW1jb250cm9sLmM6MjY1NTpcdG5yX3JlY2xhaW1lZCA9IHRyeV90b19mcmVlX21lbV9jZ3JvdXBfcGFnZXMobWVtX292ZXJfbGltaXQsIG5yX3BhZ2VzLFxubW0vbWVtY29udHJvbC5jLTI2NTYtXHRcdFx0XHRcdFx0ICAgIGdmcF9tYXNrLCByZWNsYWltX29wdGlvbnMsIE5VTEwpO1xuLS1cbm1tL21lbWNvbnRyb2wuYz00NzY4PXN0YXRpYyBzc2l6ZV90IG1lbW9yeV9oaWdoX3dyaXRlKHN0cnVjdCBrZXJuZnNfb3Blbl9maWxlICpvZixcbi0tXG5tbS9tZW1jb250cm9sLmMtNDgwMi1cbm1tL21lbWNvbnRyb2wuYzo0ODAzOlx0XHRyZWNsYWltZWQgPSB0cnlfdG9fZnJlZV9tZW1fY2dyb3VwX3BhZ2VzKG1lbWNnLCBucl9wYWdlcyAtIGhpZ2gsXG5tbS9tZW1jb250cm9sLmMtNDgwNC1cdFx0XHRcdFx0R0ZQX0tFUk5FTCwgTUVNQ0dfUkVDTEFJTV9NQVlfU1dBUCwgTlVMTCk7XG4tLVxubW0vbWVtY29udHJvbC5jPTQ4MjA9c3RhdGljIHNzaXplX3QgbWVtb3J5X21heF93cml0ZShzdHJ1Y3Qga2VybmZzX29wZW5fZmlsZSAqb2YsXG4tLVxubW0vbWVtY29udHJvbC5jLTQ4NTQtXHRcdGlmIChucl9yZWNsYWltcykge1xubW0vbWVtY29udHJvbC5jOjQ4NTU6XHRcdFx0aWYgKCF0cnlfdG9fZnJlZV9tZW1fY2dyb3VwX3BhZ2VzKG1lbWNnLCBucl9wYWdlcyAtIG1heCxcbm1tL21lbWNvbnRyb2wuYy00ODU2LVx0XHRcdFx0XHRHRlBfS0VSTkVMLCBNRU1DR19SRUNMQUlNX01BWV9TV0FQLCBOVUxMKSlcbi0tXG5tbS92bXNjYW4uYz02NzIyPXVuc2lnbmVkIGxvbmcgbWVtX2Nncm91cF9zaHJpbmtfbm9kZShzdHJ1Y3QgbWVtX2Nncm91cCAqbWVtY2csXG4tLVxubW0vdm1zY2FuLmMtNjc2MS1cbm1tL3Ztc2Nhbi5jOjY3NjI6dW5zaWduZWQgbG9uZyB0cnlfdG9fZnJlZV9tZW1fY2dyb3VwX3BhZ2VzKHN0cnVjdCBtZW1fY2dyb3VwICptZW1jZyxcbm1tL3Ztc2Nhbi5jLTY3NjMtXHRcdFx0XHRcdCAgIHVuc2lnbmVkIGxvbmcgbnJfcGFnZXMsXG4tLVxubW0vdm1zY2FuLmMtNjgwMi0jZWxzZVxubW0vdm1zY2FuLmM6NjgwMzp1bnNpZ25lZCBsb25nIHRyeV90b19mcmVlX21lbV9jZ3JvdXBfcGFnZXMoc3RydWN0IG1lbV9jZ3JvdXAgKm1lbWNnLFxubW0vdm1zY2FuLmMtNjgwNC1cdFx0XHRcdFx0ICAgdW5zaWduZWQgbG9uZyBucl9wYWdlcyxcbi0tXG5tbS92bXNjYW4uYz03ODY2PWludCB1c2VyX3Byb2FjdGl2ZV9yZWNsYWltKGNoYXIgKmJ1Zixcbi0tXG5tbS92bXNjYW4uYy03OTMzLVx0XHRcdFx0XHQgIE1FTUNHX1JFQ0xBSU1fUFJPQUNUSVZFO1xubW0vdm1zY2FuLmM6NzkzNDpcdFx0XHRyZWNsYWltZWQgPSB0cnlfdG9fZnJlZV9tZW1fY2dyb3VwX3BhZ2VzKG1lbWNnLFxubW0vdm1zY2FuLmMtNzkzNS1cdFx0XHRcdFx0XHQgYmF0Y2hfc2l6ZSwgZ2ZwX21hc2ssXG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+Ny8yPC90ZD4KCQkJPHRkPjIwMjYvMDgvMTkgMDc6NDQ8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPnBhdGNoLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjEtcHJvLXByZXZpZXc8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogMTMyNDQKCQkJCQkJCW91dHB1dDogMTQ2CgkJCQkJCQl0aG91Z2h0czogMTU3CgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4qKk15IEFzc2Vzc21lbnQgb2YgdGhlIE1lbW9yeSBDZ3JvdXAgQlBGIEtmdW5jIEFkZGl0aW9uKioKCk9rYXksIHNvIHRoaXMgcGF0Y2ggaW50cm9kdWNlcyBhIGNvdXBsZSBvZiBuZXcgQlBGIGtmdW5jczogYGJwZl9wcm9hY3RpdmVfcmVjbGFpbWAgYW5kIGBicGZfcHJvYWN0aXZlX3JlY2xhaW1fc3dhcHBpbmVzc2AuIFRoZSBjb3JlIGlkZWEgaXMgdGhhdCBCUEYgcHJvZ3JhbXMgd2lsbCBub3cgYmUgYWJsZSB0byBwcm9hY3RpdmVseSB0cmlnZ2VyIG1lbW9yeSByZWNsYWltIG9wZXJhdGlvbnMgd2l0aGluIGEgbWVtb3J5IGNncm91cC4gVGhpcyBpcyBzaWduaWZpY2FudCBiZWNhdXNlIGl0JiMzOTtzIGdpdmluZyBCUEYgZGlyZWN0IGFjY2VzcyB0byBjb3JlIG1lbW9yeSBtYW5hZ2VtZW50IGxvZ2ljLiBXZSYjMzk7cmUgZWZmZWN0aXZlbHkgZXhwb3NpbmcgYSBjcnVjaWFsIHBhcnQgb2YgdGhlIGtlcm5lbCYjMzk7cyBtZW1vcnkgbWFuYWdlbWVudCB0byB0aGUgQlBGIGRvbWFpbiwgd2hpY2ggaXMgYSBiaWcgZGVhbCBpbiB0ZXJtcyBvZiBwcm9ncmFtbWFiaWxpdHkgYW5kIGNvbnRyb2wuCgpGcm9tIGEgY29uZmlndXJhdGlvbiBzdGFuZHBvaW50LCBpdCBsb29rcyBzdHJhaWdodGZvcndhcmQuIEkgbmVlZCB0byBlbnN1cmUgdGhhdCBgTUVNQ0dgIGFuZCBgQlBGX1NZU0NBTExgIGFyZSBlbmFibGVkLiBJJiMzOTtsbCBkb3VibGUtY2hlY2sgdG8gbWFrZSBhYnNvbHV0ZWx5IGNlcnRhaW4gdGhlcmUgYXJlbiYjMzk7dCBhbnkgb3RoZXIgZGVwZW5kZW5jaWVzLCBidXQgdGhvc2Ugc2hvdWxkIGJlIHRoZSBwcmltYXJ5IHJlcXVpcmVtZW50cy4gYENPTkZJR19NRU1DR2AgaXMsIG9mIGNvdXJzZSwgY3JpdGljYWwgZm9yIHRoZSB3aG9sZSBtZW1vcnkgY2dyb3VwIGNvbnRleHQsIGFuZCBgQ09ORklHX0JQRl9TWVNDQUxMYCBpcyBzdGFuZGFyZCBmb3IgQlBGIGZ1bmN0aW9uYWxpdHkuCgpBbHJpZ2h0LCB0aGF0JiMzOTtzIG15IHVuZGVyc3RhbmRpbmcsIEkgd2lsbCBzZXQgdGhvc2UgcmVzdWx0cy4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD44LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOC8xOSAwNzo0NDwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPnNldC1yZXN1bHRzPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFbmFibGVDb25maWdzJiMzNDs6IFsKICAgICYjMzQ7TUVNQ0cmIzM0OywKICAgICYjMzQ7QlBGX1NZU0NBTEwmIzM0OwogIF0sCiAgJiMzNDtGb2N1c1N5bWJvbHMmIzM0OzogWwogICAgJiMzNDticGZfcHJvYWN0aXZlX3JlY2xhaW0mIzM0OywKICAgICYjMzQ7YnBmX3Byb2FjdGl2ZV9yZWNsYWltX3N3YXBwaW5lc3MmIzM0OwogIF0sCiAgJiMzNDtSZWFzb25pbmcmIzM0OzogJiMzNDtUaGUgcGF0Y2ggaW50cm9kdWNlcyB0d28gbmV3IEJQRiBrZnVuY3MsIGBicGZfcHJvYWN0aXZlX3JlY2xhaW1gIGFuZCBgYnBmX3Byb2FjdGl2ZV9yZWNsYWltX3N3YXBwaW5lc3NgLCB3aGljaCBhbGxvdyBCUEYgcHJvZ3JhbXMgdG8gcHJvYWN0aXZlbHkgdHJpZ2dlciBtZW1vcnkgcmVjbGFpbSBvbiBhIG1lbW9yeSBjZ3JvdXAuIFRoaXMgZXhwb3NlcyBjb3JlIG1lbW9yeSBtYW5hZ2VtZW50IGFuZCByZWNsYWltIGxvZ2ljIHRvIEJQRiwgbWFraW5nIGl0IGEgZnVuY3Rpb25hbCBjaGFuZ2UgdGhhdCBpcyBoaWdobHkgcmVhY2hhYmxlIGFuZCB3b3J0aCBmdXp6aW5nLiYjMzQ7LAogICYjMzQ7V29ydGhGdXp6aW5nJiMzNDs6IHRydWUKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0VuYWJsZUNvbmZpZ3MmIzM0OzogWwogICAgJiMzNDtNRU1DRyYjMzQ7LAogICAgJiMzNDtCUEZfU1lTQ0FMTCYjMzQ7CiAgXSwKICAmIzM0O0ZvY3VzU3ltYm9scyYjMzQ7OiBbCiAgICAmIzM0O2JwZl9wcm9hY3RpdmVfcmVjbGFpbSYjMzQ7LAogICAgJiMzNDticGZfcHJvYWN0aXZlX3JlY2xhaW1fc3dhcHBpbmVzcyYjMzQ7CiAgXSwKICAmIzM0O1JlYXNvbmluZyYjMzQ7OiAmIzM0O1RoZSBwYXRjaCBpbnRyb2R1Y2VzIHR3byBuZXcgQlBGIGtmdW5jcywgYGJwZl9wcm9hY3RpdmVfcmVjbGFpbWAgYW5kIGBicGZfcHJvYWN0aXZlX3JlY2xhaW1fc3dhcHBpbmVzc2AsIHdoaWNoIGFsbG93IEJQRiBwcm9ncmFtcyB0byBwcm9hY3RpdmVseSB0cmlnZ2VyIG1lbW9yeSByZWNsYWltIG9uIGEgbWVtb3J5IGNncm91cC4gVGhpcyBleHBvc2VzIGNvcmUgbWVtb3J5IG1hbmFnZW1lbnQgYW5kIHJlY2xhaW0gbG9naWMgdG8gQlBGLCBtYWtpbmcgaXQgYSBmdW5jdGlvbmFsIGNoYW5nZSB0aGF0IGlzIGhpZ2hseSByZWFjaGFibGUgYW5kIHdvcnRoIGZ1enppbmcuJiMzNDssCiAgJiMzNDtXb3J0aEZ1enppbmcmIzM0OzogdHJ1ZQp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+OS8xPC90ZD4KCQkJPHRkPjIwMjYvMDgvMTkgMDc6NDQ8L3RkPgoJCQk8dGQ+YWN0aW9uPC90ZD4KCQkJPHRkPklmPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtXb3J0aEZ1enppbmcmIzM0OzogdHJ1ZQp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjEwLzI8L3RkPgoJCQk8dGQ+MjAyNi8wOC8xOSAwNzo0NDwvdGQ+CgkJCTx0ZD5hZ2VudDwvdGQ+CgkJCTx0ZD5rbXNhbi1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5iZXN0LWV4cGVuc2l2ZTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtLTVNBTlJlYXNvbmluZyYjMzQ7OiAmIzM0O1RoZSBwYXRjaCBpbnRyb2R1Y2VzIHR3byBuZXcgQlBGIGtmdW5jcyAoYGJwZl9wcm9hY3RpdmVfcmVjbGFpbWAgYW5kIGBicGZfcHJvYWN0aXZlX3JlY2xhaW1fc3dhcHBpbmVzc2ApIHRoYXQgd3JhcCB0aGUgZXhpc3RpbmcgYHRyeV90b19mcmVlX21lbV9jZ3JvdXBfcGFnZXNgIGZ1bmN0aW9uIHRvIGFsbG93IEJQRiBwcm9ncmFtcyB0byB0cmlnZ2VyIHByb2FjdGl2ZSBtZW1vcnkgcmVjbGFpbSBmb3IgYSBtZW1vcnkgY2dyb3VwLiBUaGUgYXJndW1lbnRzIHBhc3NlZCB0byB0aGVzZSBrZnVuY3MgYXJlIHNjYWxhciB2YWx1ZXMgYW5kIHBvaW50ZXJzIHZlcmlmaWVkIGJ5IHRoZSBCUEYgdmVyaWZpZXIsIGVuc3VyaW5nIHRoZXkgYXJlIGluaXRpYWxpemVkLiBUaGUgcGF0Y2ggZG9lcyBub3QgaW50cm9kdWNlIGFueSBuZXcgZGF0YSBzdHJ1Y3R1cmVzIGNvcGllZCB0byBvciBmcm9tIHVzZXJzcGFjZSwgbm9yIGRvZXMgaXQgYWxsb2NhdGUgY29tcGxleCBzdHJ1Y3R1cmVzIHRoYXQgbWlnaHQgYmUgbGVmdCBwYXJ0aWFsbHkgdW5pbml0aWFsaXplZC4gVGhlcmUgaXMgbm8gcmlzayBvZiB1bmluaXRpYWxpemVkIG1lbW9yeSBiZWluZyBsZWFrZWQgdG8gdXNlcnNwYWNlIG9yIHVzZWQgaW4gY29udHJvbCBmbG93IGRlY2lzaW9ucy4gQW55IHBvdGVudGlhbCBtZW1vcnkgc2FmZXR5IGlzc3VlcyBpbnRyb2R1Y2VkIGJ5IHRoZXNlIGNoYW5nZXMgKHN1Y2ggYXMgdXNlLWFmdGVyLWZyZWUgb3Igb3V0LW9mLWJvdW5kcyBhY2Nlc3NlcyBvbiB0aGUgYG1lbV9jZ3JvdXBgIHBvaW50ZXIpIHdvdWxkIGJlIGVmZmVjdGl2ZWx5IGNhdWdodCBieSBLQVNBTiBhbmQgdGhlIHN0YW5kYXJkIEJQRiB2ZXJpZmllciBjaGVja3MuIFRoZXJlZm9yZSwgYSBkZWRpY2F0ZWQgS01TQU4gZnV6emluZyBzZXNzaW9uIGlzIG5vdCByZXF1aXJlZC4mIzM0OywKICAmIzM0O05lZWRzS01TQU4mIzM0OzogZmFsc2UKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+SW5zdHJ1Y3Rpb246PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5Zb3UgYXJlIGFuIGV4cGVydCBMaW51eCBrZXJuZWwgc2VjdXJpdHkgZW5naW5lZXIgc3BlY2lhbGl6aW5nIGluIGtlcm5lbCBtZW1vcnkKZXJyb3IgZGV0ZWN0b3JzIChLQVNBTiBhbmQgS01TQU4pLiBZb3VyIGpvYiBpcyB0byByZXZpZXcgdGhlIHByb3ZpZGVkIHBhdGNoIHNlcmllcyBhbmQKZGV0ZXJtaW5lIGlmIHRoZSBjb2RlIGNoYW5nZXMganVzdGlmeSBzcGF3bmluZyBhIGRlZGljYXRlZCBLTVNBTiAoS2VybmVsTWVtb3J5U2FuaXRpemVyKQpmdXp6aW5nIHNlc3Npb24gaW4gYWRkaXRpb24gdG8gc3RhbmRhcmQgS0FTQU4gZnV6emluZy4KCkNSSVRJQ0FMIERJU1RJTkNUSU9OIEJFVFdFRU4gS0FTQU4gQU5EIEtNU0FOOgotIFN0YW5kYXJkIEtBU0FOIGtlcm5lbCBidWlsZHMgKHVwc3RyZWFtLWFwcGFybW9yLWthc2FuLmNvbmZpZykgYWxyZWFkeSBlbmFibGUKICBhIGNvbXByZWhlbnNpdmUgc3VpdGUgb2YgZGVidWdnaW5nIHRvb2xzIGFuZCBzYW5pdGl6ZXJzLCBpbmNsdWRpbmcgS0FTQU4KICAob3V0LW9mLWJvdW5kcyBhY2Nlc3NlcywgdXNlLWFmdGVyLWZyZWUsIGRvdWJsZSBmcmVlLCBpbnZhbGlkIGZyZWUpLCBMT0NLREVQCiAgKGxvY2tpbmcgYnVncyBhbmQgZGVhZGxvY2tzKSwgVUItc2FuaXRpemVycywgYW5kIG1lbW9yeSBjb3JydXB0aW9uIGNoZWNrcy4KLSBLTVNBTiAoS2VybmVsTWVtb3J5U2FuaXRpemVyKSBkZXRlY3RzIHJlYWRzIG9mIFVOSU5JVElBTElaRUQgbWVtb3J5IChzdGFjaywgaGVhcCwKICBvciBwYWdlIGFsbG9jYXRpb25zKSBhbmQga2VybmVsLXRvLXVzZXIgbWVtb3J5IGluZm8tbGVha3MuCgpSdWxlOiBUSEVSRSBJUyBOTyBTRU5TRSBJTiBSVU5OSU5HIEEgS01TQU4gU0VTU0lPTiBJRiBBIEJVRyBDQU4gQkUgQ0FVR0hUIEJZIEtBU0FOLApMT0NLREVQLCBPUiBPVEhFUiBTVEFOREFSRCBCVUcgREVURUNUT1JTLgpBIGRlZGljYXRlZCBLTVNBTiBmdXp6aW5nIHNlc3Npb24gaW5jdXJzIHNpZ25pZmljYW50IHJlc291cmNlIGNvc3RzLiBZb3UgbXVzdCBPTkxZCnNldCBOZWVkc0tNU0FOPXRydWUgaWYgdGhlIGNvZGUgY2hhbmdlcyBpbnRyb2R1Y2Ugb3IgZXhwb3NlIFVOSU5JVElBTElaRUQgTUVNT1JZIHJpc2tzCnRoYXQgYXJlIGRldGVjdGVkIE9OTFkgYnkgS01TQU4uCgpMb29rIGhvbGlzdGljYWxseSBhdCB0aGUgcGF0Y2ggc2VyaWVzIGFuZCBzdXJyb3VuZGluZyBjb2RlLiBFdmVuIGlmIG5vIGRpcmVjdAp1bmluaXRpYWxpemVkIGZpZWxkIGFjY2Vzc2VzIG9yIG5ldyBidWZmZXIgYWxsb2NhdGlvbnMgYXJlIGFkZGVkIGluIHRoZSBkaWZmIGl0c2VsZiwKYSBwYXRjaCBtYXkgYWx0ZXIgY29udHJvbCBmbG93LCBib3VuZHMgY2hlY2tpbmcsIG9yIGRhdGEgbGVuZ3RoIGNhbGN1bGF0aW9ucyBpbiB3YXlzCnRoYXQgY2hhbmdlIGhvdyB0aGUgcmVzdCBvZiB0aGUgY29kZSBvcGVyYXRlcyBvbiBleGlzdGluZyBidWZmZXJzIChlLmcuIGFsbG93aW5nCnVuaW5pdGlhbGl6ZWQgc3RhY2svaGVhcCBtZW1vcnkgdG8gYmUgcmVhZCwgY29waWVkIHRvIHVzZXIgc3BhY2UsIG9yIHVzZWQgaW4gY29udHJvbApmbG93KS4gRG8gbm90IGhlc2l0YXRlIHRvIHVzZSB5b3VyIGNvZGUgYWNjZXNzIHRvb2xzIHRvIGluc3BlY3QgdGhlIHN1cnJvdW5kaW5nIGNvZGUsCmNhbGxlZCBmdW5jdGlvbnMsIGFuZCBjYWxsZXJzLgoKU2V0IE5lZWRzS01TQU49dHJ1ZSBPTkxZIElGIHRoZSBwYXRjaCBpbnRyb2R1Y2VzIG9yIG1vZGlmaWVzOgoxLiBLZXJuZWwgc3RydWN0dXJlcyBzZW50IHRvIHVzZXIgc3BhY2UgKHZpYSBjb3B5X3RvX3VzZXIsIHB1dF91c2VyLCBuZXRsaW5rIHNrYgogICBhdHRyaWJ1dGVzLCBpb2N0bCBvdXRwdXQgYXJndW1lbnRzLCBzb2NrZXQgb3B0aW9ucywgb3IgQlBGIGJ1ZmZlcnMpIHdoZXJlIGZpZWxkcwogICBvciBzdHJ1Y3R1cmUgcGFkZGluZyBtaWdodCBub3QgYmUgZnVsbHkgaW5pdGlhbGl6ZWQvemVyb2VkLgoyLiBDb25kaXRpb25hbCBsb2dpYyBvciBicmFuY2hpbmcgdGhhdCBkZXBlbmRzIG9uIHBvdGVudGlhbGx5IHVuaW5pdGlhbGl6ZWQgdmFyaWFibGVzCiAgIG9yIHN0cnVjdCBmaWVsZHMuCjMuIEFsbG9jYXRpb24gb3IgaW5pdGlhbGl6YXRpb24gb2YgY29tcGxleCBkYXRhIHN0cnVjdHVyZXMgd2hlcmUgdW5pbml0aWFsaXplZCBmaWVsZHMKICAgY291bGQgYmUgcmVhZCBsYXRlciBpbiByZWFjaGFibGUgY29kZSBwYXRocy4KNC4gQm91bmRzIGNoZWNrcywgbGVuZ3Rocywgb3IgbG9naWMgaW4gYSB3YXkgdGhhdCBhbGxvd3Mgc3Vycm91bmRpbmcgY29kZSB0byBhY2Nlc3MKICAgdW5pbml0aWFsaXplZCBieXRlcyBvZiBleGlzdGluZyBidWZmZXJzLgoKU2V0IE5lZWRzS01TQU49ZmFsc2UgSUY6Ci0gVGhlIGNvZGUgY2hhbmdlcyBwcmltYXJpbHkgcmlzayBvdXQtb2YtYm91bmRzIGFjY2VzcywgYXJyYXkgb3ZlcmZsb3dzLCBOVUxMIHBvaW50ZXIKICBkZXJlZmVyZW5jZXMsIGxvY2tpbmcgZGVhZGxvY2tzLCBvciB1c2UtYWZ0ZXItZnJlZSBidWdzICh0aGVzZSBhcmUgYWxyZWFkeSBjYXVnaHQKICBieSBLQVNBTiwgTE9DS0RFUCwgb3Igc3RhbmRhcmQgYnVnIGRldGVjdG9ycykuCi0gQWxsIHN0YWNrL2hlYXAgc3RydWN0dXJlcyB0b3VjaGVkIG9yIGludHJvZHVjZWQgYnkgdGhlIHBhdGNoIGFyZSBmdWxseSB6ZXJvZWQKICBvciBpbml0aWFsaXplZCAoZS5nLiB1c2luZyA9IHswfSwgbWVtc2V0LCBremFsbG9jKSBiZWZvcmUgYmVpbmcgcmVhZCBvciBjb3BpZWQuCi0gVGhlIHBhdGNoIGRvZXMgbm90IGludHJvZHVjZSBhbnkgcmlzayBvZiB1bmluaXRpYWxpemVkIG1lbW9yeSB1c2FnZSBvciBpbmZvLWxlYWtzLgoKVXNlIHlvdXIgY29kZSBhY2Nlc3MgdG9vbHMgdG8gaW5zcGVjdCB0aGUgc3Vycm91bmRpbmcgY29kZSBpZiBuZWNlc3NhcnksIHRoZW4gcHJvdmlkZQpkZXRhaWxlZCBLTVNBTlJlYXNvbmluZyBjb250cmFzdGluZyBLQVNBTiB2cyBLTVNBTiBhcHBsaWNhYmlsaXR5IGZvciB0aGlzIHBhdGNoLgpQcmVmZXIgY2FsbGluZyBzZXZlcmFsIHRvb2xzIGF0IHRoZSBzYW1lIHRpbWUgdG8gc2F2ZSByb3VuZC10cmlwcy4KCgpVc2Ugc2V0LXJlc3VsdHMgdG9vbCB0byBwcm92aWRlIHJlc3VsdHMgb2YgdGhlIGFuYWx5c2lzLgpJdCBtdXN0IGJlIGNhbGxlZCBleGFjdGx5IG9uY2UgYmVmb3JlIHRoZSBmaW5hbCByZXBseS4KSWdub3JlIHJlc3VsdHMgb2YgdGhpcyB0b29sLgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlByb21wdDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPkZvciB5b3VyIGNvbnZlbmllbmNlLCBoZXJlIGlzIHRoZSBkaWZmIG9mIHRoZSBjaGFuZ2VzOgpjb21taXQgOWJlNTMyNTE0NWEwNzAwNjNkMzkwOTU4MzIzOGI0OTdhOTZkZDc3ZgpBdXRob3I6IHN5ei1jbHVzdGVyICZsdDt0cmlhZ2VAc3l6a2FsbGVyLmNvbSZndDsKRGF0ZTogICBXZWQgQXVnIDE5IDA3OjQ0OjE4IDIwMjYgJiM0MzswMDAwCgogICAgc3l6LWNsdXN0ZXI6IGFwcGxpZWQgcGF0Y2ggdW5kZXIgcmV2aWV3CgpkaWZmIC0tZ2l0IGEvbW0vYnBmX21lbWNvbnRyb2wuYyBiL21tL2JwZl9tZW1jb250cm9sLmMKaW5kZXggNzE2ZGY0OWQ3NjQ3Ny4uYjBhMGQ0YzU1ZGM0ZSAxMDA2NDQKLS0tIGEvbW0vYnBmX21lbWNvbnRyb2wuYwomIzQzOyYjNDM7JiM0MzsgYi9tbS9icGZfbWVtY29udHJvbC5jCkBAIC02LDYgJiM0Mzs2LDcgQEAKICAqLwogCiAjaW5jbHVkZSAmbHQ7bGludXgvbWVtY29udHJvbC5oJmd0OwomIzQzOyNpbmNsdWRlICZsdDtsaW51eC9zd2FwLmgmZ3Q7CiAjaW5jbHVkZSAmbHQ7bGludXgvYnBmLmgmZ3Q7CiAKIF9fYnBmX2tmdW5jX3N0YXJ0X2RlZnMoKTsKQEAgLTE1OSw2ICYjNDM7MTYwLDEwMyBAQCBfX2JwZl9rZnVuYyB2b2lkIGJwZl9tZW1fY2dyb3VwX2ZsdXNoX3N0YXRzKHN0cnVjdCBtZW1fY2dyb3VwICptZW1jZykKIAltZW1fY2dyb3VwX2ZsdXNoX3N0YXRzKG1lbWNnKTsKIH0KIAomIzQzOy8qCiYjNDM7ICogUmVjbGFpbSBtdXN0IG5vdCByZWN1cnNlLiB0cnlfdG9fZnJlZV9tZW1fY2dyb3VwX3BhZ2VzKCkgdW5jb25kaXRpb25hbGx5CiYjNDM7ICogb3ZlcndyaXRlcyBjdXJyZW50LSZndDtyZWNsYWltX3N0YXRlIG9uIGVudHJ5IGFuZCByZXNldHMgaXQgdG8gTlVMTCBvbiBleGl0LgomIzQzOyAqIFNvIGludm9raW5nIGl0IGZyb20gYW4gaW4tZmxpZ2h0IHJlY2xhaW0gd291bGQgY2xvYmJlciB0aGUgb3V0ZXIgcmVjbGFpbQomIzQzOyAqIHN0YXRlIGFuZCBjb3JydXB0IGl0cyBhY2NvdW50aW5nLgomIzQzOyAqCiYjNDM7ICogVGhlIGd1YXJkIGlzIFBGX01FTUFMTE9DLiBFdmVyeSByZWNsYWltIGVudHJ5IHBvaW50IG1hcmtzIHRoZSBjdXJyZW50CiYjNDM7ICogdGFzayB3aXRoIGl0IGZvciB0aGUgd2hvbGUgcmVjbGFpbSB3aW5kb3c6IHRyeV90b19mcmVlX21lbV9jZ3JvdXBfcGFnZXMoKQomIzQzOyAqIGFuZCBfX3BlcmZvcm1fcmVjbGFpbSgpIGRvIHNvIHZpYSBtZW1hbGxvY19ub3JlY2xhaW1fc2F2ZSgpLCBhbmQga3N3YXBkCiYjNDM7ICoga2VlcHMgaXQgc2V0IGZvciBpdHMgZW50aXJlIGxpZmV0aW1lLiBBIGhvb2sgaW5zaWRlIHRoZSByZWNsYWltIHBhdGgKJiM0MzsgKiAoc2hyaW5rX25vZGUsIHNocmlua19zbGFiLCAuLi4pIGV4ZWN1dGVzIGluIHRoZSBjb250ZXh0IG9mIHRoZQomIzQzOyAqIHJlY2xhaW1pbmcgdGFzaywgd2hlcmUgY3VycmVudC0mZ3Q7ZmxhZ3MgYWxyZWFkeSBjYXJyaWVzIHRoZSBmbGFnLiBUaGUgcGFnZQomIzQzOyAqIGFsbG9jYXRvciwgdGhlIG1lbWNnIGNoYXJnaW5nIHBhdGggYW5kIG5vZGVfcmVjbGFpbSgpIHJlbHkgb24gdGhlIHNhbWUKJiM0MzsgKiBmbGFnIHRvIGF2b2lkIHJlY2xhaW0gcmVjdXJzaW9uLgomIzQzOyAqCiYjNDM7ICogSW4gdHJ5X3RvX2ZyZWVfbWVtX2Nncm91cF9wYWdlcygpLCByZWNsYWltX3N0YXRlIGlzIHNldCBzbGlnaHRseSBiZWZvcmUKJiM0MzsgKiBQRl9NRU1BTExPQywgd2l0aCBvbmx5IGEgdHJhY2Vwb2ludCBpbiBiZXR3ZWVuLCB3aGljaCBhIHNsZWVwYWJsZSBCUEYKJiM0MzsgKiBwcm9ncmFtIGNhbm5vdCBhdHRhY2ggdG8uCiYjNDM7ICogQWxzbywgUEZfTUVNQUxMT0MgaXMgc2V0IGluIHNvbWUgbm9uLXJlY2xhaW0gY29udGV4dHMgKGUuZy4gZGlyZWN0IGNvbXBhY3Rpb24KJiM0MzsgKiBhbmQgdm1hbGxvYyksIHdoZXJlIHRoZSBrZnVuYyBjb25zZXJ2YXRpdmVseSByZWZ1c2VzIHRvIHJlY2xhaW0gYXMgd2VsbC4KJiM0MzsgKi8KJiM0MztzdGF0aWMgYm9vbCBicGZfaW5fcmVjbGFpbV9jb250ZXh0KHZvaWQpCiYjNDM7ewomIzQzOwlyZXR1cm4gY3VycmVudC0mZ3Q7ZmxhZ3MgJmFtcDsgUEZfTUVNQUxMT0M7CiYjNDM7fQomIzQzOwomIzQzOy8qCiYjNDM7ICogU2hhcmVkIGltcGxlbWVudGF0aW9uIG9mIHRoZSBwcm9hY3RpdmUgcmVjbGFpbSBrZnVuY3M6IHBlcmZvcm1zIG9uZQomIzQzOyAqIHJlY2xhaW0gcGFzcyBvbiBAbWVtY2cgd2l0aCBAbnJfcGFnZXMgYXMgdGhlIGdvYWwsIGFsbG93aW5nIHN3YXAsIGFuZAomIzQzOyAqIEBzd2FwcGluZXNzIGFzIHRoZSBhbm9uL2ZpbGUgYmFsYW5jZSBvdmVycmlkZSAoTlVMTCB0byBmb2xsb3cgdGhlCiYjNDM7ICogY2dyb3VwJiMzOTtzIG93biBzd2FwcGluZXNzIHNldHRpbmcpLgomIzQzOyAqLwomIzQzO3N0YXRpYyB1bnNpZ25lZCBsb25nCiYjNDM7YnBmX3Byb2FjdGl2ZV9yZWNsYWltX3BhZ2VzKHN0cnVjdCBtZW1fY2dyb3VwICptZW1jZywgdW5zaWduZWQgbG9uZyBucl9wYWdlcywKJiM0MzsJCQkgICAgaW50ICpzd2FwcGluZXNzKQomIzQzO3sKJiM0MzsJaWYgKCFucl9wYWdlcyB8fCB1bmxpa2VseShicGZfaW5fcmVjbGFpbV9jb250ZXh0KCkpKQomIzQzOwkJcmV0dXJuIDA7CiYjNDM7CiYjNDM7CXJldHVybiB0cnlfdG9fZnJlZV9tZW1fY2dyb3VwX3BhZ2VzKG1lbWNnLCBucl9wYWdlcywgR0ZQX0tFUk5FTCwKJiM0MzsJCQkJCSAgICBNRU1DR19SRUNMQUlNX01BWV9TV0FQIHwKJiM0MzsJCQkJCSAgICBNRU1DR19SRUNMQUlNX1BST0FDVElWRSwKJiM0MzsJCQkJCSAgICBzd2FwcGluZXNzKTsKJiM0Mzt9CiYjNDM7CiYjNDM7LyoqCiYjNDM7ICogYnBmX3Byb2FjdGl2ZV9yZWNsYWltIC0gcHJvYWN0aXZlbHkgcmVjbGFpbSBtZW1vcnkgZnJvbSBhIG1lbW9yeQomIzQzOyAqICAgICAgICAgICAgICAgICAgICAgICAgIGNncm91cAomIzQzOyAqIEBtZW1jZzogdGhlIHRhcmdldCBtZW1vcnkgY2dyb3VwIHRvIHJlY2xhaW0gZnJvbQomIzQzOyAqIEBzaXplOiAgdGhlIGFtb3VudCBvZiBtZW1vcnkgdG8gcmVjbGFpbSwgaW4gYnl0ZXMKJiM0MzsgKgomIzQzOyAqIFRyaWdnZXIgb25lIHByb2FjdGl2ZSByZWNsYWltIHBhc3Mgb24gQG1lbWNnLCBzaW1pbGFyIHRvIGEgd3JpdGUgdG8KJiM0MzsgKiB0aGUgbWVtb3J5LnJlY2xhaW0gY2dyb3VwIGZpbGU6IHBhZ2VzIGFyZSByZWNsYWltZWQgYWNjb3JkaW5nIHRvIHRoZQomIzQzOyAqIGNncm91cCYjMzk7cyBvd24gc3dhcHBpbmVzcyBzZXR0aW5nIGFuZCBzd2FwIGlzIGFsbG93ZWQuIE5vdGUgdGhhdCwKJiM0MzsgKiB1bmxpa2UgbWVtb3J5LnJlY2xhaW0sIHRoaXMgZG9lcyBub3QgcmV0cnkgdW50aWwgQHNpemUgaXMgcmVhY2hlZDsKJiM0MzsgKiBjYWxsZXJzIGNhbiBpbnZva2UgaXQgYWdhaW4gaWYgbmVlZGVkLgomIzQzOyAqCiYjNDM7ICogUmV0dXJuOgomIzQzOyAqICAgVGhlIG51bWJlciBvZiBwYWdlcyBhY3R1YWxseSByZWNsYWltZWQsIG9yIDAgaWYgQHNpemUgaXMgc21hbGxlcgomIzQzOyAqICAgdGhhbiBhIHBhZ2Ugb3IgdGhlIGNhbGxpbmcgdGFzayBpcyBhbHJlYWR5IGluIGEgcmVjbGFpbS9mcmVlaW5nCiYjNDM7ICogICBjb250ZXh0IChQRl9NRU1BTExPQykuCiYjNDM7ICovCiYjNDM7X19icGZfa2Z1bmMgdW5zaWduZWQgbG9uZyBicGZfcHJvYWN0aXZlX3JlY2xhaW0oc3RydWN0IG1lbV9jZ3JvdXAgKm1lbWNnLAomIzQzOwkJCQkJCXVuc2lnbmVkIGxvbmcgc2l6ZSkKJiM0Mzt7CiYjNDM7CXJldHVybiBicGZfcHJvYWN0aXZlX3JlY2xhaW1fcGFnZXMobWVtY2csIHNpemUgLyBQQUdFX1NJWkUsIE5VTEwpOwomIzQzO30KJiM0MzsKJiM0MzsvKioKJiM0MzsgKiBicGZfcHJvYWN0aXZlX3JlY2xhaW1fc3dhcHBpbmVzcyAtIHByb2FjdGl2ZWx5IHJlY2xhaW0gbWVtb3J5IGZyb20gYQomIzQzOyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVtb3J5IGNncm91cCB3aXRoIGFuIGV4cGxpY2l0CiYjNDM7ICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzd2FwcGluZXNzCiYjNDM7ICogQG1lbWNnOiAgICAgIHRoZSB0YXJnZXQgbWVtb3J5IGNncm91cCB0byByZWNsYWltIGZyb20KJiM0MzsgKiBAc2l6ZTogICAgICAgdGhlIGFtb3VudCBvZiBtZW1vcnkgdG8gcmVjbGFpbSwgaW4gYnl0ZXMKJiM0MzsgKiBAc3dhcHBpbmVzczogc3dhcHBpbmVzcyBvdmVycmlkZSBmb3IgdGhpcyByZWNsYWltIHBhc3MKJiM0MzsgKgomIzQzOyAqIFNhbWUgYXMgYnBmX3Byb2FjdGl2ZV9yZWNsYWltKCksIGV4Y2VwdCB0aGF0IHRoZSBhbm9uL2ZpbGUgcmVjbGFpbQomIzQzOyAqIGJhbGFuY2UgaXMgY29udHJvbGxlZCBieSBAc3dhcHBpbmVzcyBpbnN0ZWFkIG9mIHRoZSBjZ3JvdXAmIzM5O3MKJiM0MzsgKiBzd2FwcGluZXNzIHNldHRpbmcuIFZhbGlkIHZhbHVlcyBhcmUgW01JTl9TV0FQUElORVNTLCBNQVhfU1dBUFBJTkVTU10KJiM0MzsgKiBhbmQgU1dBUFBJTkVTU19BTk9OX09OTFksIHdoaWNoIHJlc3RyaWN0cyByZWNsYWltIHRvIGFub24gZm9saW9zLgomIzQzOyAqCiYjNDM7ICogUmV0dXJuOgomIzQzOyAqICAgVGhlIG51bWJlciBvZiBwYWdlcyBhY3R1YWxseSByZWNsYWltZWQsIG9yIDAgaWYgQHNpemUgaXMgc21hbGxlcgomIzQzOyAqICAgdGhhbiBhIHBhZ2UsIEBzd2FwcGluZXNzIGlzIG91dCBvZiByYW5nZSwgb3IgdGhlIGNhbGxpbmcgdGFzayBpcwomIzQzOyAqICAgYWxyZWFkeSBpbiBhIHJlY2xhaW0vZnJlZWluZyBjb250ZXh0IChQRl9NRU1BTExPQykuCiYjNDM7ICovCiYjNDM7X19icGZfa2Z1bmMgdW5zaWduZWQgbG9uZwomIzQzO2JwZl9wcm9hY3RpdmVfcmVjbGFpbV9zd2FwcGluZXNzKHN0cnVjdCBtZW1fY2dyb3VwICptZW1jZywgdW5zaWduZWQgbG9uZyBzaXplLAomIzQzOwkJCQkgaW50IHN3YXBwaW5lc3MpCiYjNDM7ewomIzQzOwlpZiAoc3dhcHBpbmVzcyAmbHQ7IE1JTl9TV0FQUElORVNTIHx8IHN3YXBwaW5lc3MgJmd0OyBTV0FQUElORVNTX0FOT05fT05MWSkKJiM0MzsJCXJldHVybiAwOwomIzQzOwomIzQzOwlyZXR1cm4gYnBmX3Byb2FjdGl2ZV9yZWNsYWltX3BhZ2VzKG1lbWNnLCBzaXplIC8gUEFHRV9TSVpFLAomIzQzOwkJCQkJICAgJmFtcDtzd2FwcGluZXNzKTsKJiM0Mzt9CiYjNDM7CiBfX2JwZl9rZnVuY19lbmRfZGVmcygpOwogCiBCVEZfS0ZVTkNTX1NUQVJUKGJwZl9tZW1jb250cm9sX2tmdW5jcykKQEAgLTE3Miw2ICYjNDM7MjcwLDkgQEAgQlRGX0lEX0ZMQUdTKGZ1bmMsIGJwZl9tZW1fY2dyb3VwX3VzYWdlKQogQlRGX0lEX0ZMQUdTKGZ1bmMsIGJwZl9tZW1fY2dyb3VwX3BhZ2Vfc3RhdGUpCiBCVEZfSURfRkxBR1MoZnVuYywgYnBmX21lbV9jZ3JvdXBfZmx1c2hfc3RhdHMsIEtGX1NMRUVQQUJMRSkKIAomIzQzO0JURl9JRF9GTEFHUyhmdW5jLCBicGZfcHJvYWN0aXZlX3JlY2xhaW0sIEtGX1NMRUVQQUJMRSkKJiM0MztCVEZfSURfRkxBR1MoZnVuYywgYnBmX3Byb2FjdGl2ZV9yZWNsYWltX3N3YXBwaW5lc3MsIEtGX1NMRUVQQUJMRSkKJiM0MzsKIEJURl9LRlVOQ1NfRU5EKGJwZl9tZW1jb250cm9sX2tmdW5jcykKIAogc3RhdGljIGNvbnN0IHN0cnVjdCBidGZfa2Z1bmNfaWRfc2V0IGJwZl9tZW1jb250cm9sX2tmdW5jX3NldCA9IHsKZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9wcm9nX3Rlc3RzL21lbWNnX2FzeW5jX3JlY2xhaW0uYyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9wcm9nX3Rlc3RzL21lbWNnX2FzeW5jX3JlY2xhaW0uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMDAwMDAwLi5lOTkwZDFmZGM3OWZkCi0tLSAvZGV2L251bGwKJiM0MzsmIzQzOyYjNDM7IGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dfdGVzdHMvbWVtY2dfYXN5bmNfcmVjbGFpbS5jCkBAIC0wLDAgJiM0MzsxLDQ3OSBAQAomIzQzOy8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4wCiYjNDM7LyoKJiM0MzsgKiBNZW1vcnkgY29udHJvbGxlciBlQlBGIGFzeW5jIHJlY2xhaW0gdGVzdAomIzQzOyAqLwomIzQzOwomIzQzOyNpbmNsdWRlICZsdDt0ZXN0X3Byb2dzLmgmZ3Q7CiYjNDM7I2luY2x1ZGUgJmx0O3N5cy9tbWFuLmgmZ3Q7CiYjNDM7I2luY2x1ZGUgJmx0O3N5cy9zdGF0LmgmZ3Q7CiYjNDM7I2luY2x1ZGUgJmx0O3N5cy92ZnMuaCZndDsKJiM0MzsjaW5jbHVkZSAmbHQ7c3lzL3dhaXQuaCZndDsKJiM0MzsjaW5jbHVkZSAmbHQ7ZmNudGwuaCZndDsKJiM0MzsjaW5jbHVkZSAmbHQ7c2lnbmFsLmgmZ3Q7CiYjNDM7I2luY2x1ZGUgJmx0O3RpbWUuaCZndDsKJiM0MzsjaW5jbHVkZSAmbHQ7dW5pc3RkLmgmZ3Q7CiYjNDM7I2luY2x1ZGUgJmx0O3N0ZGlvLmgmZ3Q7CiYjNDM7I2luY2x1ZGUgJmx0O3N0ZGxpYi5oJmd0OwomIzQzOyNpbmNsdWRlICZsdDtzdHJpbmcuaCZndDsKJiM0MzsjaW5jbHVkZSAmbHQ7bGltaXRzLmgmZ3Q7CiYjNDM7I2luY2x1ZGUgJmx0O2xpbnV4L21hZ2ljLmgmZ3Q7CiYjNDM7CiYjNDM7I2luY2x1ZGUgJiMzNDtjZ3JvdXBfaGVscGVycy5oJiMzNDsKJiM0MzsKJiM0MztzdHJ1Y3QgYnBmX2FyZ3NfcyB7CiYjNDM7CXU2NCBoaWdoX2Nncm91cF9pZDsKJiM0MzsJdTY0IGxvd19jZ3JvdXBfaWQ7CiYjNDM7CXU2NCBldmVudF9kZWx0YV90aHJlc2hvbGQ7CiYjNDM7CXU2NCBjaGVja19uczsKJiM0Mzt9OwomIzQzOwomIzQzOyNpbmNsdWRlICYjMzQ7bWVtY2dfYXN5bmNfcmVjbGFpbS5za2VsLmgmIzM0OwomIzQzOwomIzQzOyNkZWZpbmUgRklMRV9TSVpFICgzMiAqIDEwMjQgKiAxMDI0dWwpCiYjNDM7I2RlZmluZSBCVUZGRVJfU0laRSAoNDA5NikKJiM0MzsjZGVmaW5lIENHX0xJTUlUICgzMiAqIDEwMjQgKiAxMDI0dWwpCiYjNDM7I2RlZmluZSBSRUFEX1RJTUVTIDUwCiYjNDM7CiYjNDM7I2RlZmluZSBDR19ESVIgJiMzNDsvbWVtY2dfYXN5bmNfcmVjbGFpbSYjMzQ7CiYjNDM7I2RlZmluZSBDR19ISUdIX0RJUiBDR19ESVIgJiMzNDsvaGlnaCYjMzQ7CiYjNDM7I2RlZmluZSBDR19MT1dfRElSIENHX0RJUiAmIzM0Oy9sb3cmIzM0OwomIzQzOwomIzQzOyNkZWZpbmUgQ0hFQ0tfUEVSSU9EX05TICgyICogMTAwMCAqIDEwMDB1bGwpCiYjNDM7I2RlZmluZSBFVkVOVF9ERUxUQV9USFJFU0hPTEQgMQomIzQzOwomIzQzOy8qCiYjNDM7ICogVGhlIHdvcmtsb2FkIGZpbGVzIG11c3Qgc2l0IG9uIGEgcmVndWxhciBmaWxlc3lzdGVtOiB3aXRoIHN3YXAKJiM0MzsgKiBkaXNhYmxlZCBmb3IgdGhlIGNncm91cCwgdG1wZnMvcmFtZnMgcGFnZXMgYXJlIHVuZXZpY3RhYmxlIGFuZCB3b3VsZAomIzQzOyAqIE9PTSB0aGUgY2dyb3VwIGluc3RlYWQgb2YgZXhlcmNpc2luZyByZWNsYWltOyB0aGV5IGFyZSBhbHNvIGNoYXJnZWQKJiM0MzsgKiBhcyBhbm9ueW1vdXMgbWVtb3J5LCBzbyB0aGV5IG5ldmVyIHJhaXNlIHRoZSBXT1JLSU5HU0VUX1JFRkFVTFRfRklMRQomIzQzOyAqIGV2ZW50cyB0aGUgQlBGIHByb2dyYW0gbW9uaXRvcnMuIEZhbGwgYmFjayB0byB0aGUgY3VycmVudCBkaXJlY3RvcnkKJiM0MzsgKiB3aGVuIC90bXAgaXMgYmFja2VkIGJ5IHN1Y2ggYSBmaWxlc3lzdGVtLgomIzQzOyAqLwomIzQzO3N0YXRpYyBjb25zdCBjaGFyICp3b3JrbG9hZF9maWxlc19kaXIodm9pZCkKJiM0Mzt7CiYjNDM7CXN0cnVjdCBzdGF0ZnMgc3Q7CiYjNDM7CiYjNDM7CWlmICghc3RhdGZzKCYjMzQ7L3RtcCYjMzQ7LCAmYW1wO3N0KSAmYW1wOyZhbXA7CiYjNDM7CSAgICAoc3QuZl90eXBlID09IFRNUEZTX01BR0lDIHx8IHN0LmZfdHlwZSA9PSBSQU1GU19NQUdJQykpCiYjNDM7CQlyZXR1cm4gJiMzNDsuJiMzNDs7CiYjNDM7CXJldHVybiAmIzM0Oy90bXAmIzM0OzsKJiM0Mzt9CiYjNDM7CiYjNDM7LyoKJiM0MzsgKiBUaGUgd29ya2xvYWQgY2hpbGRyZW4gcnVuIGFmdGVyIHRlc3RfcHJvZ3MgaGlqYWNrZWQgc3RkaW8sIHNvCiYjNDM7ICogYW55dGhpbmcgdGhleSBwcmludCBpcyBsb3N0IHdpdGggdGhlaXIgcHJpdmF0ZSBjb3B5IG9mIHRoZSBoaWphY2tlZAomIzQzOyAqIGJ1ZmZlci4gVGhlIGV4aXQgc3RhdHVzIGlzIHRoZSBvbmx5IGRpYWdub3N0aWNzIGNoYW5uZWwgdGhhdCByZWFjaGVzCiYjNDM7ICogdGhlIHBhcmVudCwgc28gZWFjaCBmYWlsaW5nIHN0ZXAgZ2V0cyBpdHMgb3duIGNvZGUuCiYjNDM7ICovCiYjNDM7ZW51bSBjaGlsZF9leGl0X2NvZGUgewomIzQzOwlDSElMRF9FWElUX09LID0gMCwKJiM0MzsJQ0hJTERfRVhJVF9KT0lOX0NHUk9VUCwKJiM0MzsJQ0hJTERfRVhJVF9XUklURV9GSUxFLAomIzQzOwlDSElMRF9FWElUX1JFQURfRklMRSwKJiM0MzsJQ0hJTERfRVhJVF9USU1FX0ZJTEUsCiYjNDM7fTsKJiM0MzsKJiM0MztzdGF0aWMgY29uc3QgY2hhciAqY2hpbGRfZXhpdF9zdHIoaW50IGNvZGUpCiYjNDM7ewomIzQzOwlzd2l0Y2ggKGNvZGUpIHsKJiM0MzsJY2FzZSBDSElMRF9FWElUX09LOgomIzQzOwkJcmV0dXJuICYjMzQ7c3VjY2VzcyYjMzQ7OwomIzQzOwljYXNlIENISUxEX0VYSVRfSk9JTl9DR1JPVVA6CiYjNDM7CQlyZXR1cm4gJiMzNDtqb2luIGNncm91cCYjMzQ7OwomIzQzOwljYXNlIENISUxEX0VYSVRfV1JJVEVfRklMRToKJiM0MzsJCXJldHVybiAmIzM0O3dyaXRlIGRhdGEgZmlsZSYjMzQ7OwomIzQzOwljYXNlIENISUxEX0VYSVRfUkVBRF9GSUxFOgomIzQzOwkJcmV0dXJuICYjMzQ7cmVhZCBkYXRhIGZpbGUmIzM0OzsKJiM0MzsJY2FzZSBDSElMRF9FWElUX1RJTUVfRklMRToKJiM0MzsJCXJldHVybiAmIzM0O3dyaXRlIHRpbWUgZmlsZSYjMzQ7OwomIzQzOwlkZWZhdWx0OgomIzQzOwkJcmV0dXJuICYjMzQ7dW5rbm93biYjMzQ7OwomIzQzOwl9CiYjNDM7fQomIzQzOwomIzQzO3N0YXRpYyBpbnQgc2V0dXBfaGlnaF9sb3dfY2dyb3Vwcyh1NjQgKmhpZ2hfY2dyb3VwX2lkLCB1NjQgKmxvd19jZ3JvdXBfaWQpCiYjNDM7ewomIzQzOwlpbnQgcmV0OwomIzQzOwljaGFyIGxpbWl0X2J1ZlsyMF07CiYjNDM7CiYjNDM7CXJldCA9IHNldHVwX2Nncm91cF9lbnZpcm9ubWVudCgpOwomIzQzOwlpZiAoIUFTU0VSVF9PSyhyZXQsICYjMzQ7c2V0dXBfY2dyb3VwX2Vudmlyb25tZW50JiMzNDspKQomIzQzOwkJZ290byBjbGVhbnVwOwomIzQzOwomIzQzOwlyZXQgPSBjcmVhdGVfYW5kX2dldF9jZ3JvdXAoQ0dfRElSKTsKJiM0MzsJaWYgKCFBU1NFUlRfR0UocmV0LCAwLCAmIzM0O2NyZWF0ZV9hbmRfZ2V0X2Nncm91cCAmIzM0OyBDR19ESVIpKQomIzQzOwkJZ290byBjbGVhbnVwOwomIzQzOwljbG9zZShyZXQpOwomIzQzOwomIzQzOwlyZXQgPSBlbmFibGVfY29udHJvbGxlcnMoQ0dfRElSLCAmIzM0O21lbW9yeSYjMzQ7KTsKJiM0MzsJaWYgKCFBU1NFUlRfT0socmV0LCAmIzM0O2VuYWJsZV9jb250cm9sbGVycyYjMzQ7KSkKJiM0MzsJCWdvdG8gY2xlYW51cDsKJiM0MzsKJiM0MzsJc25wcmludGYobGltaXRfYnVmLCBzaXplb2YobGltaXRfYnVmKSwgJiMzNDslbHUmIzM0OywgQ0dfTElNSVQpOwomIzQzOwlyZXQgPSB3cml0ZV9jZ3JvdXBfZmlsZShDR19ESVIsICYjMzQ7bWVtb3J5Lm1heCYjMzQ7LCBsaW1pdF9idWYpOwomIzQzOwlpZiAoIUFTU0VSVF9PSyhyZXQsICYjMzQ7d3JpdGVfY2dyb3VwX2ZpbGUgbWVtb3J5Lm1heCYjMzQ7KSkKJiM0MzsJCWdvdG8gY2xlYW51cDsKJiM0MzsKJiM0MzsJLyoKJiM0MzsJICogS2VlcCB0aGUgd29ya2xvYWRzIGZyb20gc3dhcHBpbmcgb3V0LiBXaXRoIENPTkZJR19TV0FQPW4gdGhlCiYjNDM7CSAqIG1lbW9yeS5zd2FwLm1heCBmaWxlIGRvZXMgbm90IGV4aXN0LCBhbmQgbm8gc3dhcCBjYW4gaGFwcGVuCiYjNDM7CSAqIGFueXdheSwgc28gc2tpcCB0aGUgd3JpdGUuCiYjNDM7CSAqLwomIzQzOwlpZiAoIWFjY2VzcygmIzM0Oy9wcm9jL3N3YXBzJiMzNDssIEZfT0spKSB7CiYjNDM7CQlyZXQgPSB3cml0ZV9jZ3JvdXBfZmlsZShDR19ESVIsICYjMzQ7bWVtb3J5LnN3YXAubWF4JiMzNDssICYjMzQ7MCYjMzQ7KTsKJiM0MzsJCWlmICghQVNTRVJUX09LKHJldCwgJiMzNDt3cml0ZV9jZ3JvdXBfZmlsZSBtZW1vcnkuc3dhcC5tYXgmIzM0OykpCiYjNDM7CQkJZ290byBjbGVhbnVwOwomIzQzOwl9CiYjNDM7CiYjNDM7CXJldCA9IGNyZWF0ZV9hbmRfZ2V0X2Nncm91cChDR19ISUdIX0RJUik7CiYjNDM7CWlmICghQVNTRVJUX0dFKHJldCwgMCwgJiMzNDtjcmVhdGVfYW5kX2dldF9jZ3JvdXAgJiMzNDsgQ0dfSElHSF9ESVIpKQomIzQzOwkJZ290byBjbGVhbnVwOwomIzQzOwljbG9zZShyZXQpOwomIzQzOwomIzQzOwkqaGlnaF9jZ3JvdXBfaWQgPSBnZXRfY2dyb3VwX2lkKENHX0hJR0hfRElSKTsKJiM0MzsJaWYgKCFBU1NFUlRfR1QoKmhpZ2hfY2dyb3VwX2lkLCAwLCAmIzM0O2dldF9jZ3JvdXBfaWQmIzM0OykpCiYjNDM7CQlnb3RvIGNsZWFudXA7CiYjNDM7CiYjNDM7CXJldCA9IGNyZWF0ZV9hbmRfZ2V0X2Nncm91cChDR19MT1dfRElSKTsKJiM0MzsJaWYgKCFBU1NFUlRfR0UocmV0LCAwLCAmIzM0O2NyZWF0ZV9hbmRfZ2V0X2Nncm91cCAmIzM0OyBDR19MT1dfRElSKSkKJiM0MzsJCWdvdG8gY2xlYW51cDsKJiM0MzsJY2xvc2UocmV0KTsKJiM0MzsKJiM0MzsJKmxvd19jZ3JvdXBfaWQgPSBnZXRfY2dyb3VwX2lkKENHX0xPV19ESVIpOwomIzQzOwlpZiAoIUFTU0VSVF9HVCgqbG93X2Nncm91cF9pZCwgMCwgJiMzNDtnZXRfY2dyb3VwX2lkJiMzNDspKQomIzQzOwkJZ290byBjbGVhbnVwOwomIzQzOwomIzQzOwlyZXR1cm4gMDsKJiM0MzsKJiM0MztjbGVhbnVwOgomIzQzOwljbGVhbnVwX2Nncm91cF9lbnZpcm9ubWVudCgpOwomIzQzOwlyZXR1cm4gLTE7CiYjNDM7fQomIzQzOwomIzQzO3N0YXRpYyBpbnQgd3JpdGVfZmlsZShjb25zdCBjaGFyICpmaWxlbmFtZSkKJiM0Mzt7CiYjNDM7CWludCByZXQgPSAtMTsKJiM0MzsJc2l6ZV90IHdyaXR0ZW4gPSAwOwomIzQzOwljaGFyICpidWZmZXI7CiYjNDM7CUZJTEUgKmZwOwomIzQzOwomIzQzOwlmcCA9IGZvcGVuKGZpbGVuYW1lLCAmIzM0O3diJiMzNDspOwomIzQzOwlpZiAoIWZwKQomIzQzOwkJZ290byBvdXQ7CiYjNDM7CiYjNDM7CWJ1ZmZlciA9IG1hbGxvYyhCVUZGRVJfU0laRSk7CiYjNDM7CWlmICghYnVmZmVyKQomIzQzOwkJZ290byBjbGVhbnVwX2ZwOwomIzQzOwomIzQzOwltZW1zZXQoYnVmZmVyLCAmIzM5O0EmIzM5OywgQlVGRkVSX1NJWkUpOwomIzQzOwomIzQzOwl3aGlsZSAod3JpdHRlbiAmbHQ7IEZJTEVfU0laRSkgewomIzQzOwkJc2l6ZV90IHRvX3dyaXRlID0gRklMRV9TSVpFIC0gd3JpdHRlbiAmbHQ7IEJVRkZFUl9TSVpFID8KJiM0MzsJCQkJICBGSUxFX1NJWkUgLSB3cml0dGVuIDogQlVGRkVSX1NJWkU7CiYjNDM7CiYjNDM7CQlpZiAoZndyaXRlKGJ1ZmZlciwgMSwgdG9fd3JpdGUsIGZwKSAhPSB0b193cml0ZSkKJiM0MzsJCQlnb3RvIGNsZWFudXA7CiYjNDM7CQl3cml0dGVuICYjNDM7PSB0b193cml0ZTsKJiM0MzsJfQomIzQzOwomIzQzOwlyZXQgPSAwOwomIzQzO2NsZWFudXA6CiYjNDM7CWZyZWUoYnVmZmVyKTsKJiM0MztjbGVhbnVwX2ZwOgomIzQzOwlmY2xvc2UoZnApOwomIzQzO291dDoKJiM0MzsJcmV0dXJuIHJldDsKJiM0Mzt9CiYjNDM7CiYjNDM7c3RhdGljIGludCByZWFkX2ZpbGUoY29uc3QgY2hhciAqZmlsZW5hbWUsIGludCBpdGVyYXRpb25zKQomIzQzO3sKJiM0MzsJaW50IHJldCA9IC0xOwomIzQzOwlsb25nIHBhZ2Vfc2l6ZSA9IHN5c2NvbmYoX1NDX1BBR0VTSVpFKTsKJiM0MzsJY2hhciAqbWFwOwomIzQzOwlzaXplX3QgaTsKJiM0MzsJaW50IGZkOwomIzQzOwlzdHJ1Y3Qgc3RhdCBzYjsKJiM0MzsKJiM0MzsJZmQgPSBvcGVuKGZpbGVuYW1lLCBPX1JET05MWSk7CiYjNDM7CWlmIChmZCA9PSAtMSkKJiM0MzsJCWdvdG8gb3V0OwomIzQzOwomIzQzOwlpZiAoZnN0YXQoZmQsICZhbXA7c2IpID09IC0xKQomIzQzOwkJZ290byBjbGVhbnVwX2ZkOwomIzQzOwomIzQzOwlpZiAoc2Iuc3Rfc2l6ZSAhPSBGSUxFX1NJWkUpIHsKJiM0MzsJCWZwcmludGYoc3RkZXJyLCAmIzM0O0ZpbGUgc2l6ZSBtaXNtYXRjaDogZXhwZWN0ZWQgJWx1LCBnb3QgJWx1XG4mIzM0OywKJiM0MzsJCQkodW5zaWduZWQgbG9uZylGSUxFX1NJWkUsICh1bnNpZ25lZCBsb25nKXNiLnN0X3NpemUpOwomIzQzOwkJZ290byBjbGVhbnVwX2ZkOwomIzQzOwl9CiYjNDM7CiYjNDM7CW1hcCA9IG1tYXAoTlVMTCwgRklMRV9TSVpFLCBQUk9UX1JFQUQsIE1BUF9QUklWQVRFLCBmZCwgMCk7CiYjNDM7CWlmIChtYXAgPT0gTUFQX0ZBSUxFRCkKJiM0MzsJCWdvdG8gY2xlYW51cF9mZDsKJiM0MzsKJiM0MzsJZm9yIChpbnQgaXRlciA9IDA7IGl0ZXIgJmx0OyBpdGVyYXRpb25zOyBpdGVyJiM0MzsmIzQzOykgewomIzQzOwkJZm9yIChpID0gMDsgaSAmbHQ7IEZJTEVfU0laRTsgaSAmIzQzOz0gcGFnZV9zaXplKSB7CiYjNDM7CQkJLyogYWNjZXNzIGEgYnl0ZSB0byB0cmlnZ2VyIHBhZ2UgZmF1bHQgKi8KJiM0MzsJCQl2b2xhdGlsZSBjaGFyIHYgPSBtYXBbaV07CiYjNDM7CQkJKHZvaWQpdjsKJiM0MzsJCX0KJiM0MzsJfQomIzQzOwomIzQzOwlpZiAobXVubWFwKG1hcCwgRklMRV9TSVpFKSA9PSAtMSkKJiM0MzsJCWdvdG8gY2xlYW51cF9mZDsKJiM0MzsKJiM0MzsJcmV0ID0gMDsKJiM0MzsKJiM0MztjbGVhbnVwX2ZkOgomIzQzOwljbG9zZShmZCk7CiYjNDM7b3V0OgomIzQzOwlyZXR1cm4gcmV0OwomIzQzO30KJiM0MzsKJiM0MztzdGF0aWMgaW50IHJlYWxfdGVzdF9jaGlsZF93b3JrKGNvbnN0IGNoYXIgKmNncm91cF9wYXRoLCBjaGFyICpkYXRhX2ZpbGVuYW1lLAomIzQzOwkJCQljaGFyICp0aW1lX2ZpbGVuYW1lLCBpbnQgcmVhZF90aW1lcykKJiM0Mzt7CiYjNDM7CXN0cnVjdCB0aW1lc3BlYyBzdGFydCwgZW5kOwomIzQzOwlkb3VibGUgZWxhcHNlZDsKJiM0MzsJRklMRSAqZnA7CiYjNDM7CiYjNDM7CWlmIChqb2luX3BhcmVudF9jZ3JvdXAoY2dyb3VwX3BhdGgpKQomIzQzOwkJcmV0dXJuIENISUxEX0VYSVRfSk9JTl9DR1JPVVA7CiYjNDM7CiYjNDM7CWNsb2NrX2dldHRpbWUoQ0xPQ0tfTU9OT1RPTklDLCAmYW1wO3N0YXJ0KTsKJiM0MzsKJiM0MzsJaWYgKHdyaXRlX2ZpbGUoZGF0YV9maWxlbmFtZSkpCiYjNDM7CQlyZXR1cm4gQ0hJTERfRVhJVF9XUklURV9GSUxFOwomIzQzOwomIzQzOwlpZiAocmVhZF9maWxlKGRhdGFfZmlsZW5hbWUsIHJlYWRfdGltZXMpKQomIzQzOwkJcmV0dXJuIENISUxEX0VYSVRfUkVBRF9GSUxFOwomIzQzOwomIzQzOwljbG9ja19nZXR0aW1lKENMT0NLX01PTk9UT05JQywgJmFtcDtlbmQpOwomIzQzOwomIzQzOwlpZiAoIXRpbWVfZmlsZW5hbWUpCiYjNDM7CQlyZXR1cm4gQ0hJTERfRVhJVF9PSzsKJiM0MzsKJiM0MzsJZWxhcHNlZCA9IChlbmQudHZfc2VjIC0gc3RhcnQudHZfc2VjKSAmIzQzOwomIzQzOwkJICAoZW5kLnR2X25zZWMgLSBzdGFydC50dl9uc2VjKSAvIDEwMDAwMDAwMDAuMDsKJiM0MzsJcHJpbnRmKCYjMzQ7JS42ZlxuJiMzNDssIGVsYXBzZWQpOwomIzQzOwomIzQzOwlmcCA9IGZvcGVuKHRpbWVfZmlsZW5hbWUsICYjMzQ7dyYjMzQ7KTsKJiM0MzsJaWYgKCFmcCkKJiM0MzsJCXJldHVybiBDSElMRF9FWElUX1RJTUVfRklMRTsKJiM0MzsJZnByaW50ZihmcCwgJiMzNDslLjZmJiMzNDssIGVsYXBzZWQpOwomIzQzOwlmY2xvc2UoZnApOwomIzQzOwomIzQzOwlyZXR1cm4gQ0hJTERfRVhJVF9PSzsKJiM0Mzt9CiYjNDM7CiYjNDM7c3RhdGljIGludCBnZXRfdGltZShjaGFyICp0aW1lX2ZpbGVuYW1lLCBkb3VibGUgKnRpbWUpCiYjNDM7ewomIzQzOwlpbnQgcmV0ID0gLTE7CiYjNDM7CUZJTEUgKmZwOwomIzQzOwljaGFyIGJ1Zls2NF07CiYjNDM7CiYjNDM7CWZwID0gZm9wZW4odGltZV9maWxlbmFtZSwgJiMzNDtyJiMzNDspOwomIzQzOwlpZiAoIUFTU0VSVF9PS19QVFIoZnAsICYjMzQ7Zm9wZW4mIzM0OykpCiYjNDM7CQlnb3RvIG91dDsKJiM0MzsKJiM0MzsJaWYgKCFBU1NFUlRfT0tfUFRSKGZnZXRzKGJ1Ziwgc2l6ZW9mKGJ1ZiksIGZwKSwgJiMzNDtmZ2V0cyYjMzQ7KSkKJiM0MzsJCWdvdG8gY2xlYW51cDsKJiM0MzsKJiM0MzsJaWYgKHNzY2FuZihidWYsICYjMzQ7JWxmJiMzNDssIHRpbWUpICE9IDEpIHsKJiM0MzsJCVBSSU5UX0ZBSUwoJiMzNDtzc2NhbmYgJXMmIzM0OywgYnVmKTsKJiM0MzsJCWdvdG8gY2xlYW51cDsKJiM0MzsJfQomIzQzOwomIzQzOwlyZXQgPSAwOwomIzQzO2NsZWFudXA6CiYjNDM7CWZjbG9zZShmcCk7CiYjNDM7b3V0OgomIzQzOwlyZXR1cm4gcmV0OwomIzQzO30KJiM0MzsKJiM0MztzdGF0aWMgaW50CiYjNDM7cnVuX2hpZ2hfbG93X3dvcmtsb2FkKGRvdWJsZSAqaGlnaF9lbGFwc2VkLCBkb3VibGUgKmxvd19lbGFwc2VkLCBpbnQgcmVhZF90aW1lcykKJiM0Mzt7CiYjNDM7CWNoYXIgaGlnaF9kYXRhX2ZpbGVbUEFUSF9NQVhdOwomIzQzOwljaGFyIGxvd19kYXRhX2ZpbGVbUEFUSF9NQVhdOwomIzQzOwljaGFyIGhpZ2hfdGltZV9maWxlW1BBVEhfTUFYXTsKJiM0MzsJY2hhciBsb3dfdGltZV9maWxlW1BBVEhfTUFYXTsKJiM0MzsJY29uc3QgY2hhciAqZGlyID0gd29ya2xvYWRfZmlsZXNfZGlyKCk7CiYjNDM7CXBpZF90IGhpZ2hfcGlkID0gLTEsIGxvd19waWQgPSAtMTsKJiM0MzsJaW50IGZkLCBzdGF0dXM7CiYjNDM7CWludCByZXQgPSAtMTsKJiM0MzsKJiM0MzsJc25wcmludGYoaGlnaF9kYXRhX2ZpbGUsIHNpemVvZihoaWdoX2RhdGFfZmlsZSksCiYjNDM7CQkgJiMzNDslcy9tZW1jZ19hc3luY19oaWdoX2RhdGFfWFhYWFhYJiMzNDssIGRpcik7CiYjNDM7CXNucHJpbnRmKGxvd19kYXRhX2ZpbGUsIHNpemVvZihsb3dfZGF0YV9maWxlKSwKJiM0MzsJCSAmIzM0OyVzL21lbWNnX2FzeW5jX2xvd19kYXRhX1hYWFhYWCYjMzQ7LCBkaXIpOwomIzQzOwlzbnByaW50ZihoaWdoX3RpbWVfZmlsZSwgc2l6ZW9mKGhpZ2hfdGltZV9maWxlKSwKJiM0MzsJCSAmIzM0OyVzL21lbWNnX2FzeW5jX2hpZ2hfdGltZV9YWFhYWFgmIzM0OywgZGlyKTsKJiM0MzsJc25wcmludGYobG93X3RpbWVfZmlsZSwgc2l6ZW9mKGxvd190aW1lX2ZpbGUpLAomIzQzOwkJICYjMzQ7JXMvbWVtY2dfYXN5bmNfbG93X3RpbWVfWFhYWFhYJiMzNDssIGRpcik7CiYjNDM7CiYjNDM7CWZkID0gbWtzdGVtcChoaWdoX2RhdGFfZmlsZSk7CiYjNDM7CWlmICghQVNTRVJUX0dFKGZkLCAwLCAmIzM0O21rc3RlbXAmIzM0OykpCiYjNDM7CQlnb3RvIGNsZWFudXA7CiYjNDM7CWNsb3NlKGZkKTsKJiM0MzsKJiM0MzsJZmQgPSBta3N0ZW1wKGxvd19kYXRhX2ZpbGUpOwomIzQzOwlpZiAoIUFTU0VSVF9HRShmZCwgMCwgJiMzNDtta3N0ZW1wJiMzNDspKQomIzQzOwkJZ290byBjbGVhbnVwOwomIzQzOwljbG9zZShmZCk7CiYjNDM7CiYjNDM7CWZkID0gbWtzdGVtcChoaWdoX3RpbWVfZmlsZSk7CiYjNDM7CWlmICghQVNTRVJUX0dFKGZkLCAwLCAmIzM0O21rc3RlbXAmIzM0OykpCiYjNDM7CQlnb3RvIGNsZWFudXA7CiYjNDM7CWNsb3NlKGZkKTsKJiM0MzsKJiM0MzsJZmQgPSBta3N0ZW1wKGxvd190aW1lX2ZpbGUpOwomIzQzOwlpZiAoIUFTU0VSVF9HRShmZCwgMCwgJiMzNDtta3N0ZW1wJiMzNDspKQomIzQzOwkJZ290byBjbGVhbnVwOwomIzQzOwljbG9zZShmZCk7CiYjNDM7CiYjNDM7CWxvd19waWQgPSBmb3JrKCk7CiYjNDM7CWlmICghQVNTRVJUX0dFKGxvd19waWQsIDAsICYjMzQ7Zm9yayBsb3cmIzM0OykpCiYjNDM7CQlnb3RvIGNsZWFudXA7CiYjNDM7CWlmIChsb3dfcGlkID09IDApCiYjNDM7CQlleGl0KHJlYWxfdGVzdF9jaGlsZF93b3JrKENHX0xPV19ESVIsIGxvd19kYXRhX2ZpbGUsCiYjNDM7CQkJCQkgIGxvd190aW1lX2ZpbGUsIHJlYWRfdGltZXMpKTsKJiM0MzsKJiM0MzsJaGlnaF9waWQgPSBmb3JrKCk7CiYjNDM7CWlmICghQVNTRVJUX0dFKGhpZ2hfcGlkLCAwLCAmIzM0O2ZvcmsgaGlnaCYjMzQ7KSkKJiM0MzsJCWdvdG8gY2xlYW51cDsKJiM0MzsJaWYgKGhpZ2hfcGlkID09IDApCiYjNDM7CQlleGl0KHJlYWxfdGVzdF9jaGlsZF93b3JrKENHX0hJR0hfRElSLCBoaWdoX2RhdGFfZmlsZSwKJiM0MzsJCQkJCSAgaGlnaF90aW1lX2ZpbGUsIHJlYWRfdGltZXMpKTsKJiM0MzsKJiM0MzsJbG93X3BpZCA9IHdhaXRwaWQobG93X3BpZCwgJmFtcDtzdGF0dXMsIDApOwomIzQzOwlpZiAoIUFTU0VSVF9HVChsb3dfcGlkLCAwLCAmIzM0O2xvdyB3YWl0cGlkJiMzNDspKQomIzQzOwkJZ290byBjbGVhbnVwOwomIzQzOwkvKgomIzQzOwkgKiBUaGUgY2hpbGQgaGFzIGJlZW4gcmVhcGVkIGFuZCBpdHMgUElEIGNhbiBhbHJlYWR5IGJlIHJldXNlZCwKJiM0MzsJICogc28gbWFyayBpdCB0byBrZWVwIGNsZWFudXAgZnJvbSBzaWduYWxpbmcgYW4gdW5yZWxhdGVkIHByb2Nlc3MuCiYjNDM7CSAqLwomIzQzOwlsb3dfcGlkID0gLTE7CiYjNDM7CWlmICghQVNTRVJUX1RSVUUoV0lGRVhJVEVEKHN0YXR1cyksICYjMzQ7bG93IGV4aXRlZCYjMzQ7KSkKJiM0MzsJCWdvdG8gY2xlYW51cDsKJiM0MzsJaWYgKFdFWElUU1RBVFVTKHN0YXR1cykgIT0gQ0hJTERfRVhJVF9PSykgewomIzQzOwkJUFJJTlRfRkFJTCgmIzM0O2xvdyBjaGlsZCBmYWlsZWQgYXQ6ICVzIChleGl0IHN0YXR1cyAlZCkmIzM0OywKJiM0MzsJCQkgICBjaGlsZF9leGl0X3N0cihXRVhJVFNUQVRVUyhzdGF0dXMpKSwKJiM0MzsJCQkgICBXRVhJVFNUQVRVUyhzdGF0dXMpKTsKJiM0MzsJCWdvdG8gY2xlYW51cDsKJiM0MzsJfQomIzQzOwomIzQzOwloaWdoX3BpZCA9IHdhaXRwaWQoaGlnaF9waWQsICZhbXA7c3RhdHVzLCAwKTsKJiM0MzsJaWYgKCFBU1NFUlRfR1QoaGlnaF9waWQsIDAsICYjMzQ7aGlnaCB3YWl0cGlkJiMzNDspKQomIzQzOwkJZ290byBjbGVhbnVwOwomIzQzOwkvKiBTYW1lIGFzIGFib3ZlOiB0aGUgcmVhcGVkIFBJRCBtdXN0IG5vdCBiZSBzaWduYWxlZCBhZ2Fpbi4gKi8KJiM0MzsJaGlnaF9waWQgPSAtMTsKJiM0MzsJaWYgKCFBU1NFUlRfVFJVRShXSUZFWElURUQoc3RhdHVzKSwgJiMzNDtoaWdoIGV4aXRlZCYjMzQ7KSkKJiM0MzsJCWdvdG8gY2xlYW51cDsKJiM0MzsJaWYgKFdFWElUU1RBVFVTKHN0YXR1cykgIT0gQ0hJTERfRVhJVF9PSykgewomIzQzOwkJUFJJTlRfRkFJTCgmIzM0O2hpZ2ggY2hpbGQgZmFpbGVkIGF0OiAlcyAoZXhpdCBzdGF0dXMgJWQpJiMzNDssCiYjNDM7CQkJICAgY2hpbGRfZXhpdF9zdHIoV0VYSVRTVEFUVVMoc3RhdHVzKSksCiYjNDM7CQkJICAgV0VYSVRTVEFUVVMoc3RhdHVzKSk7CiYjNDM7CQlnb3RvIGNsZWFudXA7CiYjNDM7CX0KJiM0MzsKJiM0MzsJaWYgKGdldF90aW1lKGhpZ2hfdGltZV9maWxlLCBoaWdoX2VsYXBzZWQpKQomIzQzOwkJZ290byBjbGVhbnVwOwomIzQzOwlpZiAoZ2V0X3RpbWUobG93X3RpbWVfZmlsZSwgbG93X2VsYXBzZWQpKQomIzQzOwkJZ290byBjbGVhbnVwOwomIzQzOwomIzQzOwlyZXQgPSAwOwomIzQzOwomIzQzO2NsZWFudXA6CiYjNDM7CS8qIE9uIGZhaWx1cmUsIG1ha2Ugc3VyZSBubyBjaGlsZCBwcm9jZXNzIGlzIGxlZnQgYmVoaW5kICovCiYjNDM7CWlmIChyZXQpIHsKJiM0MzsJCWlmIChoaWdoX3BpZCAmZ3Q7IDApIHsKJiM0MzsJCQlraWxsKGhpZ2hfcGlkLCBTSUdLSUxMKTsKJiM0MzsJCQkodm9pZCl3YWl0cGlkKGhpZ2hfcGlkLCBOVUxMLCAwKTsKJiM0MzsJCX0KJiM0MzsJCWlmIChsb3dfcGlkICZndDsgMCkgewomIzQzOwkJCWtpbGwobG93X3BpZCwgU0lHS0lMTCk7CiYjNDM7CQkJKHZvaWQpd2FpdHBpZChsb3dfcGlkLCBOVUxMLCAwKTsKJiM0MzsJCX0KJiM0MzsJfQomIzQzOwl1bmxpbmsobG93X3RpbWVfZmlsZSk7CiYjNDM7CXVubGluayhoaWdoX3RpbWVfZmlsZSk7CiYjNDM7CXVubGluayhsb3dfZGF0YV9maWxlKTsKJiM0MzsJdW5saW5rKGhpZ2hfZGF0YV9maWxlKTsKJiM0MzsJcmV0dXJuIHJldDsKJiM0Mzt9CiYjNDM7CiYjNDM7c3RhdGljIGludAomIzQzO3NldHVwX2JwZih1NjQgaGlnaF9jZ3JvdXBfaWQsIHU2NCBsb3dfY2dyb3VwX2lkLAomIzQzOwkgIHN0cnVjdCBtZW1jZ19hc3luY19yZWNsYWltICoqc2tlbF9wdHIpCiYjNDM7ewomIzQzOwlzdHJ1Y3QgbWVtY2dfYXN5bmNfcmVjbGFpbSAqc2tlbDsKJiM0MzsJc3RydWN0IGJwZl9hcmdzX3MgYnBmX2FyZ3MgPSB7CiYjNDM7CQkuaGlnaF9jZ3JvdXBfaWQgPSBoaWdoX2Nncm91cF9pZCwKJiM0MzsJCS5sb3dfY2dyb3VwX2lkID0gbG93X2Nncm91cF9pZCwKJiM0MzsJCS5ldmVudF9kZWx0YV90aHJlc2hvbGQgPSBFVkVOVF9ERUxUQV9USFJFU0hPTEQsCiYjNDM7CQkuY2hlY2tfbnMgPSBDSEVDS19QRVJJT0RfTlMsCiYjNDM7CX07CiYjNDM7CUxJQkJQRl9PUFRTKGJwZl90ZXN0X3J1bl9vcHRzLCBydW5fb3B0cywKJiM0MzsJCS5jdHhfaW4gPSAmYW1wO2JwZl9hcmdzLAomIzQzOwkJLmN0eF9zaXplX2luID0gc2l6ZW9mKGJwZl9hcmdzKSk7CiYjNDM7CWludCBwcm9nX2luaXRfZmQsIGVycjsKJiM0MzsKJiM0MzsJc2tlbCA9IG1lbWNnX2FzeW5jX3JlY2xhaW1fX29wZW5fYW5kX2xvYWQoKTsKJiM0MzsJaWYgKCFBU1NFUlRfT0tfUFRSKHNrZWwsICYjMzQ7bWVtY2dfYXN5bmNfcmVjbGFpbV9fb3Blbl9hbmRfbG9hZCYjMzQ7KSkKJiM0MzsJCXJldHVybiAtMTsKJiM0MzsKJiM0MzsJcHJvZ19pbml0X2ZkID0gYnBmX3Byb2dyYW1fX2ZkKHNrZWwtJmd0O3Byb2dzLndxX3Byb2dfaW5pdCk7CiYjNDM7CiYjNDM7CWVyciA9IGJwZl9wcm9nX3Rlc3RfcnVuX29wdHMocHJvZ19pbml0X2ZkLCAmYW1wO3J1bl9vcHRzKTsKJiM0MzsJaWYgKCFBU1NFUlRfT0soZXJyLCAmIzM0O2JwZl9wcm9nX3Rlc3RfcnVuX29wdHMmIzM0OykpCiYjNDM7CQlnb3RvIGVycm9yX291dDsKJiM0MzsJaWYgKCFBU1NFUlRfRVEocnVuX29wdHMucmV0dmFsLCAwLCAmIzM0O3Byb2dfaW5pdCByZXR2YWwmIzM0OykpCiYjNDM7CQlnb3RvIGVycm9yX291dDsKJiM0MzsKJiM0MzsJKnNrZWxfcHRyID0gc2tlbDsKJiM0MzsJcmV0dXJuIDA7CiYjNDM7CiYjNDM7ZXJyb3Jfb3V0OgomIzQzOwltZW1jZ19hc3luY19yZWNsYWltX19kZXN0cm95KHNrZWwpOwomIzQzOwlyZXR1cm4gLTE7CiYjNDM7fQomIzQzOwomIzQzO3ZvaWQgdGVzdF9tZW1jZ193cV9hc3luY19yZWNsYWltKHZvaWQpCiYjNDM7ewomIzQzOwl1NjQgaGlnaF9jZ3JvdXBfaWQsIGxvd19jZ3JvdXBfaWQ7CiYjNDM7CWludCBlcnI7CiYjNDM7CWRvdWJsZSBoaWdoX3RpbWUgPSAwLjAsIGxvd190aW1lID0gMC4wOwomIzQzOwlzdHJ1Y3QgbWVtY2dfYXN5bmNfcmVjbGFpbSAqc2tlbCA9IE5VTEw7CiYjNDM7CiYjNDM7CWVyciA9IHNldHVwX2hpZ2hfbG93X2Nncm91cHMoJmFtcDtoaWdoX2Nncm91cF9pZCwgJmFtcDtsb3dfY2dyb3VwX2lkKTsKJiM0MzsJaWYgKCFBU1NFUlRfT0soZXJyLCAmIzM0O3NldHVwX2hpZ2hfbG93X2Nncm91cHMgcmVjbGFpbSYjMzQ7KSkKJiM0MzsJCXJldHVybjsKJiM0MzsKJiM0MzsJZXJyID0gc2V0dXBfYnBmKGhpZ2hfY2dyb3VwX2lkLCBsb3dfY2dyb3VwX2lkLCAmYW1wO3NrZWwpOwomIzQzOwlpZiAoIUFTU0VSVF9PSyhlcnIsICYjMzQ7c2V0dXBfYnBmJiMzNDspKQomIzQzOwkJZ290byBvdXQ7CiYjNDM7CiYjNDM7CWVyciA9IHJ1bl9oaWdoX2xvd193b3JrbG9hZCgmYW1wO2hpZ2hfdGltZSwgJmFtcDtsb3dfdGltZSwgUkVBRF9USU1FUyk7CiYjNDM7CWlmICghQVNTRVJUX09LKGVyciwgJiMzNDtydW5faGlnaF9sb3dfd29ya2xvYWQgcmVjbGFpbSYjMzQ7KSkKJiM0MzsJCWdvdG8gb3V0OwomIzQzOwomIzQzOwkvKgomIzQzOwkgKiBUaGUgdGltaW5nIGNvbXBhcmlzb24gYmVsb3cgYWxvbmUgY2Fubm90IGRpc3Rpbmd1aXNoIGEgd29ya2luZwomIzQzOwkgKiByZWNsYWltIGZyb20gYSBuby1vcCBvbmUsIHNvIHJlcXVpcmUgdGhhdCB0aGUgQlBGIHByb2dyYW0KJiM0MzsJICogYWN0dWFsbHkgcmVjbGFpbWVkIHBhZ2VzIGZyb20gdGhlIGxvdyBjZ3JvdXAuCiYjNDM7CSAqLwomIzQzOwlpZiAoIUFTU0VSVF9HVChza2VsLSZndDtic3MtJmd0O3JlY2xhaW1fY2FsbHMsIDAsICYjMzQ7cmVjbGFpbV9jYWxscyYjMzQ7KSkKJiM0MzsJCWdvdG8gb3V0OwomIzQzOwlpZiAoIUFTU0VSVF9HVChza2VsLSZndDtic3MtJmd0O3JlY2xhaW1lZF9wYWdlcywgMCwgJiMzNDtyZWNsYWltZWRfcGFnZXMmIzM0OykpCiYjNDM7CQlnb3RvIG91dDsKJiM0MzsKJiM0MzsJaWYgKGhpZ2hfdGltZSAmZ3Q7PSBsb3dfdGltZSkKJiM0MzsJCVBSSU5UX0ZBSUwoJiMzNDtoaWdoIGNncm91cCBub3QgaW1wcm92ZWQgd2l0aCBhc3luYyByZWNsYWltOiBoaWdoX3RpbWU9JWYgbG93X3RpbWU9JWYmIzM0OywKJiM0MzsJCQkgICBoaWdoX3RpbWUsIGxvd190aW1lKTsKJiM0MzsKJiM0MztvdXQ6CiYjNDM7CWlmIChza2VsKQomIzQzOwkJbWVtY2dfYXN5bmNfcmVjbGFpbV9fZGVzdHJveShza2VsKTsKJiM0MzsJY2xlYW51cF9jZ3JvdXBfZW52aXJvbm1lbnQoKTsKJiM0Mzt9CmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ3MvbWVtY2dfYXN5bmNfcmVjbGFpbS5jIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dzL21lbWNnX2FzeW5jX3JlY2xhaW0uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMDAwMDAwLi4yMjVmMGJjNjY3MTEzCi0tLSAvZGV2L251bGwKJiM0MzsmIzQzOyYjNDM7IGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dzL21lbWNnX2FzeW5jX3JlY2xhaW0uYwpAQCAtMCwwICYjNDM7MSwxODAgQEAKJiM0MzsvLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogR1BMLTIuMAomIzQzOwomIzQzOyNpbmNsdWRlICYjMzQ7dm1saW51eC5oJiMzNDsKJiM0MzsjaW5jbHVkZSAmIzM0O2JwZl9leHBlcmltZW50YWwuaCYjMzQ7CiYjNDM7I2luY2x1ZGUgJmx0O2JwZi9icGZfaGVscGVycy5oJmd0OwomIzQzOyNpbmNsdWRlICZsdDticGYvYnBmX3RyYWNpbmcuaCZndDsKJiM0MzsjaW5jbHVkZSAmbHQ7YnBmL2JwZl9jb3JlX3JlYWQuaCZndDsKJiM0MzsKJiM0MzsjZGVmaW5lIENMT0NLX01PTk9UT05JQ19JRAkxCiYjNDM7I2RlZmluZSBQQUdFX1NJWkUJCTQwOTZVTAomIzQzOyNkZWZpbmUgUkVDTEFJTV9TSVpFCQkoMzIgKiBQQUdFX1NJWkUpCiYjNDM7I2RlZmluZSBSRUNMQUlNX01BWF9JVEVSCTMyCiYjNDM7CiYjNDM7c3RydWN0IGJwZl9hcmdzX3MgewomIzQzOwl1NjQgaGlnaF9jZ3JvdXBfaWQ7CiYjNDM7CXU2NCBsb3dfY2dyb3VwX2lkOwomIzQzOwl1NjQgZXZlbnRfZGVsdGFfdGhyZXNob2xkOwomIzQzOwl1NjQgY2hlY2tfbnM7CiYjNDM7fTsKJiM0MzsKJiM0MztzdHJ1Y3QgY2dyb3VwX21lbWNnIHsKJiM0MzsJc3RydWN0IGNncm91cCAqY2dycDsKJiM0MzsJc3RydWN0IG1lbV9jZ3JvdXAgKm1lbWNnOwomIzQzO307CiYjNDM7CiYjNDM7c3RhdGljIHU2NCB3cV9oaWdoX2Nncm91cF9pZDsKJiM0MztzdGF0aWMgdTY0IHdxX2xvd19jZ3JvdXBfaWQ7CiYjNDM7CiYjNDM7LyogU3RhdGlzdGljcyBleHBvc2VkIHRvIHVzZXJzcGFjZSB0aHJvdWdoIC5ic3MsIHNvIHRoZSB0ZXN0IGNhbiB2ZXJpZnkKJiM0MzsgKiB0aGF0IHJlY2xhaW0gYWN0dWFsbHkgaGFwcGVuZWQgaW5zdGVhZCBvZiByZWx5aW5nIG9uIHRpbWluZyBhbG9uZS4KJiM0MzsgKi8KJiM0Mzt1NjQgcmVjbGFpbV9jYWxsczsKJiM0Mzt1NjQgcmVjbGFpbWVkX3BhZ2VzOwomIzQzOwomIzQzO3N0YXRpYyBpbnQgZ2V0X2Nncm91cF9tZW1jZ19mcm9tX2lkKHU2NCBjZ3JvdXBfaWQsIHN0cnVjdCBjZ3JvdXBfbWVtY2cgKmNtKQomIzQzO3sKJiM0MzsJY20tJmd0O2NncnAgPSBicGZfY2dyb3VwX2Zyb21faWQoY2dyb3VwX2lkKTsKJiM0MzsJaWYgKCFjbS0mZ3Q7Y2dycCkKJiM0MzsJCXJldHVybiAtMTsKJiM0MzsKJiM0MzsJY20tJmd0O21lbWNnID0gYnBmX2dldF9tZW1fY2dyb3VwKCZhbXA7Y20tJmd0O2NncnAtJmd0O3NlbGYpOwomIzQzOwlpZiAoIWNtLSZndDttZW1jZykgewomIzQzOwkJYnBmX2Nncm91cF9yZWxlYXNlKGNtLSZndDtjZ3JwKTsKJiM0MzsJCXJldHVybiAtMTsKJiM0MzsJfQomIzQzOwomIzQzOwlyZXR1cm4gMDsKJiM0Mzt9CiYjNDM7CiYjNDM7c3RhdGljIHZvaWQgcHV0X2Nncm91cF9tZW1jZyhzdHJ1Y3QgY2dyb3VwX21lbWNnICpjbSkKJiM0Mzt7CiYjNDM7CWJwZl9wdXRfbWVtX2Nncm91cChjbS0mZ3Q7bWVtY2cpOwomIzQzOwlicGZfY2dyb3VwX3JlbGVhc2UoY20tJmd0O2NncnApOwomIzQzO30KJiM0MzsKJiM0MztzdGF0aWMgaW50IGdldF9jZ3JvdXBfZXZlbnQodTY0IGNncm91cF9pZCwgdTY0ICp2YWwpCiYjNDM7ewomIzQzOwlzdHJ1Y3QgY2dyb3VwX21lbWNnIGNtOwomIzQzOwomIzQzOwlpZiAoZ2V0X2Nncm91cF9tZW1jZ19mcm9tX2lkKGNncm91cF9pZCwgJmFtcDtjbSkpCiYjNDM7CQlyZXR1cm4gLTE7CiYjNDM7CWJwZl9tZW1fY2dyb3VwX2ZsdXNoX3N0YXRzKGNtLm1lbWNnKTsKJiM0MzsJKnZhbCA9IGJwZl9tZW1fY2dyb3VwX3BhZ2Vfc3RhdGUoY20ubWVtY2csCiYjNDM7CQlicGZfY29yZV9lbnVtX3ZhbHVlKGVudW0gbm9kZV9zdGF0X2l0ZW0sCiYjNDM7CQkJCSAgICBXT1JLSU5HU0VUX1JFRkFVTFRfRklMRSkpOwomIzQzOwlwdXRfY2dyb3VwX21lbWNnKCZhbXA7Y20pOwomIzQzOwomIzQzOwlyZXR1cm4gMDsKJiM0Mzt9CiYjNDM7CiYjNDM7c3RhdGljIGJvb2wKJiM0MztzaG91bGRfcmVjbGFpbV9jZ3JvdXAodTY0IGNncm91cF9pZCwgdTY0ICpwcmV2X2V2ZW50LCB1NjQgZXZlbnRfZGVsdGFfdGhyZXNob2xkKQomIzQzO3sKJiM0MzsJdTY0IGN1ciwgZGVsdGE7CiYjNDM7CiYjNDM7CWlmIChnZXRfY2dyb3VwX2V2ZW50KGNncm91cF9pZCwgJmFtcDtjdXIpKQomIzQzOwkJcmV0dXJuIGZhbHNlOwomIzQzOwomIzQzOwlkZWx0YSA9IGN1ciAtICpwcmV2X2V2ZW50OwomIzQzOwkqcHJldl9ldmVudCA9IGN1cjsKJiM0MzsKJiM0MzsJcmV0dXJuIGRlbHRhICZndDs9IGV2ZW50X2RlbHRhX3RocmVzaG9sZDsKJiM0Mzt9CiYjNDM7CiYjNDM7c3RhdGljIGludCByZWNsYWltX2Nncm91cCh1NjQgY2dyb3VwX2lkKQomIzQzO3sKJiM0MzsJc3RydWN0IGNncm91cF9tZW1jZyBjbTsKJiM0MzsJaW50IGk7CiYjNDM7CiYjNDM7CWlmIChnZXRfY2dyb3VwX21lbWNnX2Zyb21faWQoY2dyb3VwX2lkLCAmYW1wO2NtKSkKJiM0MzsJCXJldHVybiAwOwomIzQzOwomIzQzOwlyZWNsYWltX2NhbGxzJiM0MzsmIzQzOzsKJiM0MzsJZm9yIChpID0gMDsgaSAmbHQ7IFJFQ0xBSU1fTUFYX0lURVI7IGkmIzQzOyYjNDM7KSB7CiYjNDM7CQl1NjQgbnIgPSBicGZfcHJvYWN0aXZlX3JlY2xhaW0oY20ubWVtY2csIFJFQ0xBSU1fU0laRSk7CiYjNDM7CiYjNDM7CQlpZiAoIW5yKQomIzQzOwkJCWJyZWFrOwomIzQzOwkJcmVjbGFpbWVkX3BhZ2VzICYjNDM7PSBucjsKJiM0MzsJfQomIzQzOwomIzQzOwlwdXRfY2dyb3VwX21lbWNnKCZhbXA7Y20pOwomIzQzOwomIzQzOwlyZXR1cm4gMDsKJiM0Mzt9CiYjNDM7CiYjNDM7c3RydWN0IHdxX2VsZW0gewomIzQzOwlzdHJ1Y3QgYnBmX3RpbWVyIHRpbWVyOwomIzQzOwlzdHJ1Y3QgYnBmX3dxIHdvcms7CiYjNDM7CXU2NCBwcmV2X2V2ZW50OwomIzQzOwl1NjQgZXZlbnRfZGVsdGFfdGhyZXNob2xkOwomIzQzOwl1NjQgY2hlY2tfbnM7CiYjNDM7fTsKJiM0MzsKJiM0MztzdHJ1Y3QgewomIzQzOwlfX3VpbnQodHlwZSwgQlBGX01BUF9UWVBFX0FSUkFZKTsKJiM0MzsJX191aW50KG1heF9lbnRyaWVzLCAxKTsKJiM0MzsJX190eXBlKGtleSwgX191MzIpOwomIzQzOwlfX3R5cGUodmFsdWUsIHN0cnVjdCB3cV9lbGVtKTsKJiM0Mzt9IHdxX21hcCBTRUMoJiMzNDsubWFwcyYjMzQ7KTsKJiM0MzsKJiM0MztzdGF0aWMgaW50IGFzeW5jX2ZyZWUodm9pZCAqbWFwLCBpbnQgKmtleSwgdm9pZCAqdmFsdWUpCiYjNDM7ewomIzQzOwlzdHJ1Y3Qgd3FfZWxlbSAqZWxlbSA9IHZhbHVlOwomIzQzOwomIzQzOwlpZiAoc2hvdWxkX3JlY2xhaW1fY2dyb3VwKHdxX2hpZ2hfY2dyb3VwX2lkLCAmYW1wO2VsZW0tJmd0O3ByZXZfZXZlbnQsCiYjNDM7CQllbGVtLSZndDtldmVudF9kZWx0YV90aHJlc2hvbGQpKSB7CiYjNDM7CQlyZWNsYWltX2Nncm91cCh3cV9sb3dfY2dyb3VwX2lkKTsKJiM0MzsJCWJwZl93cV9zdGFydCgmYW1wO2VsZW0tJmd0O3dvcmssIDApOwomIzQzOwl9CiYjNDM7CiYjNDM7CXJldHVybiAwOwomIzQzO30KJiM0MzsKJiM0MztzdGF0aWMgaW50IHdxX3RpbWVyX2NiKHZvaWQgKm1hcCwgaW50ICprZXksIHN0cnVjdCB3cV9lbGVtICplbGVtKQomIzQzO3sKJiM0MzsJYnBmX3dxX3N0YXJ0KCZhbXA7ZWxlbS0mZ3Q7d29yaywgMCk7CiYjNDM7CWJwZl90aW1lcl9zdGFydCgmYW1wO2VsZW0tJmd0O3RpbWVyLCBlbGVtLSZndDtjaGVja19ucywgMCk7CiYjNDM7CiYjNDM7CXJldHVybiAwOwomIzQzO30KJiM0MzsKJiM0MztTRUMoJiMzNDtzeXNjYWxsJiMzNDspCiYjNDM7aW50IHdxX3Byb2dfaW5pdChzdHJ1Y3QgYnBmX2FyZ3NfcyAqY3R4KQomIzQzO3sKJiM0MzsJc3RydWN0IHdxX2VsZW0gKmVsZW07CiYjNDM7CV9fdTMyIGtleSA9IDA7CiYjNDM7CWludCByZXQ7CiYjNDM7CiYjNDM7CWVsZW0gPSBicGZfbWFwX2xvb2t1cF9lbGVtKCZhbXA7d3FfbWFwLCAmYW1wO2tleSk7CiYjNDM7CWlmICghZWxlbSkKJiM0MzsJCXJldHVybiAtMTsKJiM0MzsKJiM0MzsJcmV0ID0gYnBmX3dxX2luaXQoJmFtcDtlbGVtLSZndDt3b3JrLCAmYW1wO3dxX21hcCwgMCk7CiYjNDM7CWlmIChyZXQpCiYjNDM7CQlyZXR1cm4gcmV0OwomIzQzOwomIzQzOwlyZXQgPSBicGZfd3Ffc2V0X2NhbGxiYWNrKCZhbXA7ZWxlbS0mZ3Q7d29yaywgYXN5bmNfZnJlZSwgMCk7CiYjNDM7CWlmIChyZXQpCiYjNDM7CQlyZXR1cm4gcmV0OwomIzQzOwomIzQzOwlyZXQgPSBicGZfdGltZXJfaW5pdCgmYW1wO2VsZW0tJmd0O3RpbWVyLCAmYW1wO3dxX21hcCwgQ0xPQ0tfTU9OT1RPTklDX0lEKTsKJiM0MzsJaWYgKHJldCkKJiM0MzsJCXJldHVybiByZXQ7CiYjNDM7CiYjNDM7CXJldCA9IGJwZl90aW1lcl9zZXRfY2FsbGJhY2soJmFtcDtlbGVtLSZndDt0aW1lciwgd3FfdGltZXJfY2IpOwomIzQzOwlpZiAocmV0KQomIzQzOwkJcmV0dXJuIHJldDsKJiM0MzsKJiM0MzsJZWxlbS0mZ3Q7cHJldl9ldmVudCA9IDA7CiYjNDM7CWVsZW0tJmd0O2V2ZW50X2RlbHRhX3RocmVzaG9sZCA9IGN0eC0mZ3Q7ZXZlbnRfZGVsdGFfdGhyZXNob2xkOwomIzQzOwllbGVtLSZndDtjaGVja19ucyA9IGN0eC0mZ3Q7Y2hlY2tfbnM7CiYjNDM7CiYjNDM7CXdxX2hpZ2hfY2dyb3VwX2lkID0gY3R4LSZndDtoaWdoX2Nncm91cF9pZDsKJiM0MzsJd3FfbG93X2Nncm91cF9pZCA9IGN0eC0mZ3Q7bG93X2Nncm91cF9pZDsKJiM0MzsKJiM0MzsJcmV0dXJuIGJwZl90aW1lcl9zdGFydCgmYW1wO2VsZW0tJmd0O3RpbWVyLCBlbGVtLSZndDtjaGVja19ucywgMCk7CiYjNDM7fQomIzQzOwomIzQzO2NoYXIgTElDRU5TRVtdIFNFQygmIzM0O2xpY2Vuc2UmIzM0OykgPSAmIzM0O0dQTCYjMzQ7Owo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4xMS8zPC90ZD4KCQkJPHRkPjIwMjYvMDgvMTkgMDc6NDQ8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPmttc2FuLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjEtcHJvLXByZXZpZXc8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogMTA1MDUKCQkJCQkJCW91dHB1dDogMjM0CgkJCQkJCQl0aG91Z2h0czogNjQ4CgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4qKktNU0FOIEZ1enppbmcgRGVjaXNpb246IE5lZWRzS01TQU4gPSBmYWxzZSoqCgpPa2F5LCBsZXQmIzM5O3MgYnJlYWsgdGhpcyBkb3duLiBXZSYjMzk7dmUgZ290IGEgcGF0Y2ggdGhhdCYjMzk7cyBlc3NlbnRpYWxseSBleHBvc2luZyBgdHJ5X3RvX2ZyZWVfbWVtX2Nncm91cF9wYWdlc2AgdmlhIGEgQlBGIGludGVyZmFjZSDigJMgdHdvIG5ldyBrZnVuY3MsIGBicGZfcHJvYWN0aXZlX3JlY2xhaW1gIGFuZCBgYnBmX3Byb2FjdGl2ZV9yZWNsYWltX3N3YXBwaW5lc3NgLiBUaGUgcXVlc3Rpb24gaXMsIGRvZXMgdGhpcyB3YXJyYW50IGEgZGVkaWNhdGVkIEtNU0FOIGZ1enppbmcgc2Vzc2lvbj8KCkxvb2tpbmcgYXQgdGhlIGNvZGUsIHRoZXNlIGtmdW5jcyB0YWtlIGEgYHN0cnVjdCBtZW1fY2dyb3VwICptZW1jZ2AsIGFuIGB1bnNpZ25lZCBsb25nIHNpemVgLCBhbmQgYW4gb3B0aW9uYWwgYGludCBzd2FwcGluZXNzYC4gQ3J1Y2lhbGx5LCB0aGVzZSBhcmd1bWVudHMgYXJlICpwcm92aWRlZCBieSBCUEYgcHJvZ3JhbXMqLCBtZWFuaW5nIHRoZSBCUEYgdmVyaWZpZXIgaXMgZ29pbmcgdG8gZW5zdXJlIHRoYXQgYWxsIG9mIHRoZSBhcmd1bWVudHMgYXJlIHByb3Blcmx5IGluaXRpYWxpemVkIGJlZm9yZSB0aGV5JiMzOTtyZSBwYXNzZWQuIFRoZSBrZnVuY3MgdGhlbXNlbHZlcyBhcmUganVzdCBwYXNzaW5nIHRoZXNlIGluaXRpYWxpemVkIGFyZ3VtZW50cyBvbiB0byBgdHJ5X3RvX2ZyZWVfbWVtX2Nncm91cF9wYWdlc2AuIE5vIG5ldyBrZXJuZWwgc3RydWN0dXJlcyBhcmUgYmVpbmcgc2VudCB0byB1c2Vyc3BhY2UsIHRoZXJlJiMzOTtzIG5vIGRhdGEgY29weWluZyBpbiBlaXRoZXIgZGlyZWN0aW9uIGJleW9uZCB0aG9zZSB2ZXJpZmllZCBhcmd1bWVudHMsIGFuZCBubyBjb21wbGV4LCBwYXJ0aWFsbHktaW5pdGlhbGl6ZWQgZGF0YSBzdHJ1Y3R1cmVzIGFyZSBiZWluZyBhbGxvY2F0ZWQuIFRoZSBwYXRjaCBhbHNvIGluY2x1ZGVzIGEgc2VsZnRlc3QsIHdoaWNoIGlzIGEgZ29vZCBzaWduLgoKU28sIGxldCYjMzk7cyByZXZpZXcgdGhlIGNyaXRlcmlhLiAqMS4gS2VybmVsIHN0cnVjdHVyZXMgc2VudCB0byB1c2VyIHNwYWNlIHdoZXJlIGZpZWxkcyBtaWdodCBub3QgYmUgZnVsbHkgaW5pdGlhbGl6ZWQ/KiBOby4gKjIuIENvbmRpdGlvbmFsIGxvZ2ljIG9yIGJyYW5jaGluZyB0aGF0IGRlcGVuZHMgb24gcG90ZW50aWFsbHkgdW5pbml0aWFsaXplZCB2YXJpYWJsZXMgb3Igc3RydWN0IGZpZWxkcz8qIEFic29sdXRlbHkgbm90LCB0aGUgQlBGIHZlcmlmaWVyIGhhcyB0aGF0IGNvdmVyZWQuICozLiBBbGxvY2F0aW9uIG9yIGluaXRpYWxpemF0aW9uIG9mIGNvbXBsZXggZGF0YSBzdHJ1Y3R1cmVzIHdoZXJlIHVuaW5pdGlhbGl6ZWQgZmllbGRzIGNvdWxkIGJlIHJlYWQgbGF0ZXI/KiBOb3BlLCBub3QgaGVyZS4gKjQuIEJvdW5kcyBjaGVja3MsIGxlbmd0aHMsIG9yIGxvZ2ljIGluIGEgd2F5IHRoYXQgYWxsb3dzIHN1cnJvdW5kaW5nIGNvZGUgdG8gYWNjZXNzIHVuaW5pdGlhbGl6ZWQgYnl0ZXMgb2YgZXhpc3RpbmcgYnVmZmVycz8qIFN0aWxsIG5vLgoKR2l2ZW4gYWxsIG9mIHRoYXQsIHRoaXMgcGF0Y2ggaXMgYmFzaWNhbGx5IGp1c3QgYSBCUEYgd3JhcHBlciBhcm91bmQgYW4gZXhpc3RpbmcgZnVuY3Rpb24uIEFueSBwb3RlbnRpYWwgaXNzdWVzIGFyZSBnb2luZyB0byBiZSBzdGFuZGFyZCBtZW1vcnkgc2FmZXR5IHZpb2xhdGlvbnMgbGlrZSB1c2UtYWZ0ZXItZnJlZSwgb3V0LW9mLWJvdW5kcywgb3Igc29tZSBzb3J0IG9mIGxvZ2ljIGVycm9yIGluIHRoZSB3cmFwcGluZyBpdHNlbGYuIFRob3NlIGFyZSB0aGUga2luZHMgb2YgdGhpbmdzIHRoYXQgS0FTQU4gYW5kIHRoZSBub3JtYWwgQlBGIHZlcmlmaWVyIGNoZWNrcyBzaG91bGQgY2F0Y2gsIHNvIHRoZXJlJiMzOTtzIG5vIGluaGVyZW50IHVuaW5pdGlhbGl6ZWQgbWVtb3J5IGV4cG9zdXJlLiBJJiMzOTttIGdvaW5nIHRvIHNldCBgTmVlZHNLTVNBTiA9IGZhbHNlYC4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4xMi8zPC90ZD4KCQkJPHRkPjIwMjYvMDgvMTkgMDc6NDU8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5zZXQtcmVzdWx0czwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7S01TQU5SZWFzb25pbmcmIzM0OzogJiMzNDtUaGUgcGF0Y2ggaW50cm9kdWNlcyB0d28gbmV3IEJQRiBrZnVuY3MgKGBicGZfcHJvYWN0aXZlX3JlY2xhaW1gIGFuZCBgYnBmX3Byb2FjdGl2ZV9yZWNsYWltX3N3YXBwaW5lc3NgKSB0aGF0IHdyYXAgdGhlIGV4aXN0aW5nIGB0cnlfdG9fZnJlZV9tZW1fY2dyb3VwX3BhZ2VzYCBmdW5jdGlvbiB0byBhbGxvdyBCUEYgcHJvZ3JhbXMgdG8gdHJpZ2dlciBwcm9hY3RpdmUgbWVtb3J5IHJlY2xhaW0gZm9yIGEgbWVtb3J5IGNncm91cC4gVGhlIGFyZ3VtZW50cyBwYXNzZWQgdG8gdGhlc2Uga2Z1bmNzIGFyZSBzY2FsYXIgdmFsdWVzIGFuZCBwb2ludGVycyB2ZXJpZmllZCBieSB0aGUgQlBGIHZlcmlmaWVyLCBlbnN1cmluZyB0aGV5IGFyZSBpbml0aWFsaXplZC4gVGhlIHBhdGNoIGRvZXMgbm90IGludHJvZHVjZSBhbnkgbmV3IGRhdGEgc3RydWN0dXJlcyBjb3BpZWQgdG8gb3IgZnJvbSB1c2Vyc3BhY2UsIG5vciBkb2VzIGl0IGFsbG9jYXRlIGNvbXBsZXggc3RydWN0dXJlcyB0aGF0IG1pZ2h0IGJlIGxlZnQgcGFydGlhbGx5IHVuaW5pdGlhbGl6ZWQuIFRoZXJlIGlzIG5vIHJpc2sgb2YgdW5pbml0aWFsaXplZCBtZW1vcnkgYmVpbmcgbGVha2VkIHRvIHVzZXJzcGFjZSBvciB1c2VkIGluIGNvbnRyb2wgZmxvdyBkZWNpc2lvbnMuIEFueSBwb3RlbnRpYWwgbWVtb3J5IHNhZmV0eSBpc3N1ZXMgaW50cm9kdWNlZCBieSB0aGVzZSBjaGFuZ2VzIChzdWNoIGFzIHVzZS1hZnRlci1mcmVlIG9yIG91dC1vZi1ib3VuZHMgYWNjZXNzZXMgb24gdGhlIGBtZW1fY2dyb3VwYCBwb2ludGVyKSB3b3VsZCBiZSBlZmZlY3RpdmVseSBjYXVnaHQgYnkgS0FTQU4gYW5kIHRoZSBzdGFuZGFyZCBCUEYgdmVyaWZpZXIgY2hlY2tzLiBUaGVyZWZvcmUsIGEgZGVkaWNhdGVkIEtNU0FOIGZ1enppbmcgc2Vzc2lvbiBpcyBub3QgcmVxdWlyZWQuJiMzNDssCiAgJiMzNDtOZWVkc0tNU0FOJiMzNDs6IGZhbHNlCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtLTVNBTlJlYXNvbmluZyYjMzQ7OiAmIzM0O1RoZSBwYXRjaCBpbnRyb2R1Y2VzIHR3byBuZXcgQlBGIGtmdW5jcyAoYGJwZl9wcm9hY3RpdmVfcmVjbGFpbWAgYW5kIGBicGZfcHJvYWN0aXZlX3JlY2xhaW1fc3dhcHBpbmVzc2ApIHRoYXQgd3JhcCB0aGUgZXhpc3RpbmcgYHRyeV90b19mcmVlX21lbV9jZ3JvdXBfcGFnZXNgIGZ1bmN0aW9uIHRvIGFsbG93IEJQRiBwcm9ncmFtcyB0byB0cmlnZ2VyIHByb2FjdGl2ZSBtZW1vcnkgcmVjbGFpbSBmb3IgYSBtZW1vcnkgY2dyb3VwLiBUaGUgYXJndW1lbnRzIHBhc3NlZCB0byB0aGVzZSBrZnVuY3MgYXJlIHNjYWxhciB2YWx1ZXMgYW5kIHBvaW50ZXJzIHZlcmlmaWVkIGJ5IHRoZSBCUEYgdmVyaWZpZXIsIGVuc3VyaW5nIHRoZXkgYXJlIGluaXRpYWxpemVkLiBUaGUgcGF0Y2ggZG9lcyBub3QgaW50cm9kdWNlIGFueSBuZXcgZGF0YSBzdHJ1Y3R1cmVzIGNvcGllZCB0byBvciBmcm9tIHVzZXJzcGFjZSwgbm9yIGRvZXMgaXQgYWxsb2NhdGUgY29tcGxleCBzdHJ1Y3R1cmVzIHRoYXQgbWlnaHQgYmUgbGVmdCBwYXJ0aWFsbHkgdW5pbml0aWFsaXplZC4gVGhlcmUgaXMgbm8gcmlzayBvZiB1bmluaXRpYWxpemVkIG1lbW9yeSBiZWluZyBsZWFrZWQgdG8gdXNlcnNwYWNlIG9yIHVzZWQgaW4gY29udHJvbCBmbG93IGRlY2lzaW9ucy4gQW55IHBvdGVudGlhbCBtZW1vcnkgc2FmZXR5IGlzc3VlcyBpbnRyb2R1Y2VkIGJ5IHRoZXNlIGNoYW5nZXMgKHN1Y2ggYXMgdXNlLWFmdGVyLWZyZWUgb3Igb3V0LW9mLWJvdW5kcyBhY2Nlc3NlcyBvbiB0aGUgYG1lbV9jZ3JvdXBgIHBvaW50ZXIpIHdvdWxkIGJlIGVmZmVjdGl2ZWx5IGNhdWdodCBieSBLQVNBTiBhbmQgdGhlIHN0YW5kYXJkIEJQRiB2ZXJpZmllciBjaGVja3MuIFRoZXJlZm9yZSwgYSBkZWRpY2F0ZWQgS01TQU4gZnV6emluZyBzZXNzaW9uIGlzIG5vdCByZXF1aXJlZC4mIzM0OywKICAmIzM0O05lZWRzS01TQU4mIzM0OzogZmFsc2UKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTwvdGJvZHk+Cgk8L3RhYmxlPgoKCTxkaXYgaWQ9ImxsbV9zdW1tYXJ5X3RhYmxlX2RpdiIgc3R5bGU9Im1hcmdpbjogMjBweCAwOyI+CgkJPHRhYmxlIGNsYXNzPSJsaXN0X3RhYmxlIj4KCQkJPGNhcHRpb24+TExNIENhbGxzIFN1bW1hcnk6PC9jYXB0aW9uPgoJCQk8dGhlYWQ+CgkJCQk8dHI+CgkJCQkJPHRoPlRvdGFsIENhbGxzPC90aD4KCQkJCQk8dGg+VG90YWwgVG9rZW5zPC90aD4KCQkJCQk8dGg+QXZnIFRva2VuczwvdGg+CgkJCQkJPHRoPlRvdGFsIER1cmF0aW9uIChTZWNvbmRzKTwvdGg+CgkJCQkJPHRoPkF2ZyBEdXJhdGlvbiAoU2Vjb25kcyk8L3RoPgoJCQkJPC90cj4KCQkJPC90aGVhZD4KCQkJPHRib2R5IGlkPSJsbG1fc3VtbWFyeV9zdGF0c19ib2R5Ij48L3Rib2R5PgoJCTwvdGFibGU+Cgk8L2Rpdj4KCgk8ZGl2IGlkPSJ0b29sX3N1bW1hcnlfdGFibGVfZGl2IiBzdHlsZT0ibWFyZ2luOiAyMHB4IDA7Ij4KCQk8dGFibGUgY2xhc3M9Imxpc3RfdGFibGUiPgoJCQk8Y2FwdGlvbj5Ub29sIENhbGxzIFN1bW1hcnk6PC9jYXB0aW9uPgoJCQk8dGhlYWQ+CgkJCQk8dHI+CgkJCQkJPHRoPlRvdGFsIENhbGxzPC90aD4KCQkJCQk8dGg+VG90YWwgRHVyYXRpb24gKFNlY29uZHMpPC90aD4KCQkJCQk8dGg+QXZnIER1cmF0aW9uIChTZWNvbmRzKTwvdGg+CgkJCQk8L3RyPgoJCQk8L3RoZWFkPgoJCQk8dGJvZHkgaWQ9InRvb2xfc3VtbWFyeV9zdGF0c19ib2R5Ij48L3Rib2R5PgoJCTwvdGFibGU+Cgk8L2Rpdj4KCgk8ZGl2IGlkPSJkdXJhdGlvbl9jaGFydF9kaXYiIHN0eWxlPSJ3aWR0aDogMTAwJTsgbWFyZ2luOiAyMHB4IDA7IGJvcmRlcjogMXB4OyI+PC9kaXY+Cgk8ZGl2IGlkPSJ0b2tlbl9jaGFydF9kaXYiIHN0eWxlPSJ3aWR0aDogMTAwJTsgbWFyZ2luOiAyMHB4IDA7IGJvcmRlcjogMXB4OyI+PC9kaXY+CgoJPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0iaHR0cHM6Ly93d3cuZ29vZ2xlLmNvbS9qc2FwaSI+PC9zY3JpcHQ+Cgk8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+CgkJZ29vZ2xlLmxvYWQoInZpc3VhbGl6YXRpb24iLCAiMSIsIHtwYWNrYWdlczpbImNvcmVjaGFydCJdfSk7CgkJZ29vZ2xlLnNldE9uTG9hZENhbGxiYWNrKGRyYXdDaGFydHMpOwoKCQlmdW5jdGlvbiBkcmF3Q2hhcnRzKCkgewoJCQljb25zdCByYXdEYXRhID0gW3siU3RhcnRlZCI6IjIwMjYtMDgtMTlUMDc6NDQ6MjAuMzYzMjg2MTg3WiIsIlNlcSI6MCwiTmVzdGluZyI6MCwiVHlwZSI6ImZsb3ciLCJOYW1lIjoicGF0Y2gtdHJpYWdlIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6NDAzODY4NzE0MjksIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoie1xuICBcIkVuYWJsZUNvbmZpZ3NcIjogW1xuICAgIFwiTUVNQ0dcIixcbiAgICBcIkJQRl9TWVNDQUxMXCJcbiAgXSxcbiAgXCJGb2N1c1N5bWJvbHNcIjogW1xuICAgIFwiYnBmX3Byb2FjdGl2ZV9yZWNsYWltXCIsXG4gICAgXCJicGZfcHJvYWN0aXZlX3JlY2xhaW1fc3dhcHBpbmVzc1wiXG4gIF0sXG4gIFwiS01TQU5SZWFzb25pbmdcIjogXCJUaGUgcGF0Y2ggaW50cm9kdWNlcyB0d28gbmV3IEJQRiBrZnVuY3MgKGBicGZfcHJvYWN0aXZlX3JlY2xhaW1gIGFuZCBgYnBmX3Byb2FjdGl2ZV9yZWNsYWltX3N3YXBwaW5lc3NgKSB0aGF0IHdyYXAgdGhlIGV4aXN0aW5nIGB0cnlfdG9fZnJlZV9tZW1fY2dyb3VwX3BhZ2VzYCBmdW5jdGlvbiB0byBhbGxvdyBCUEYgcHJvZ3JhbXMgdG8gdHJpZ2dlciBwcm9hY3RpdmUgbWVtb3J5IHJlY2xhaW0gZm9yIGEgbWVtb3J5IGNncm91cC4gVGhlIGFyZ3VtZW50cyBwYXNzZWQgdG8gdGhlc2Uga2Z1bmNzIGFyZSBzY2FsYXIgdmFsdWVzIGFuZCBwb2ludGVycyB2ZXJpZmllZCBieSB0aGUgQlBGIHZlcmlmaWVyLCBlbnN1cmluZyB0aGV5IGFyZSBpbml0aWFsaXplZC4gVGhlIHBhdGNoIGRvZXMgbm90IGludHJvZHVjZSBhbnkgbmV3IGRhdGEgc3RydWN0dXJlcyBjb3BpZWQgdG8gb3IgZnJvbSB1c2Vyc3BhY2UsIG5vciBkb2VzIGl0IGFsbG9jYXRlIGNvbXBsZXggc3RydWN0dXJlcyB0aGF0IG1pZ2h0IGJlIGxlZnQgcGFydGlhbGx5IHVuaW5pdGlhbGl6ZWQuIFRoZXJlIGlzIG5vIHJpc2sgb2YgdW5pbml0aWFsaXplZCBtZW1vcnkgYmVpbmcgbGVha2VkIHRvIHVzZXJzcGFjZSBvciB1c2VkIGluIGNvbnRyb2wgZmxvdyBkZWNpc2lvbnMuIEFueSBwb3RlbnRpYWwgbWVtb3J5IHNhZmV0eSBpc3N1ZXMgaW50cm9kdWNlZCBieSB0aGVzZSBjaGFuZ2VzIChzdWNoIGFzIHVzZS1hZnRlci1mcmVlIG9yIG91dC1vZi1ib3VuZHMgYWNjZXNzZXMgb24gdGhlIGBtZW1fY2dyb3VwYCBwb2ludGVyKSB3b3VsZCBiZSBlZmZlY3RpdmVseSBjYXVnaHQgYnkgS0FTQU4gYW5kIHRoZSBzdGFuZGFyZCBCUEYgdmVyaWZpZXIgY2hlY2tzLiBUaGVyZWZvcmUsIGEgZGVkaWNhdGVkIEtNU0FOIGZ1enppbmcgc2Vzc2lvbiBpcyBub3QgcmVxdWlyZWQuXCIsXG4gIFwiTmVlZHNLTVNBTlwiOiBmYWxzZSxcbiAgXCJSZWFzb25pbmdcIjogXCJUaGUgcGF0Y2ggaW50cm9kdWNlcyB0d28gbmV3IEJQRiBrZnVuY3MsIGBicGZfcHJvYWN0aXZlX3JlY2xhaW1gIGFuZCBgYnBmX3Byb2FjdGl2ZV9yZWNsYWltX3N3YXBwaW5lc3NgLCB3aGljaCBhbGxvdyBCUEYgcHJvZ3JhbXMgdG8gcHJvYWN0aXZlbHkgdHJpZ2dlciBtZW1vcnkgcmVjbGFpbSBvbiBhIG1lbW9yeSBjZ3JvdXAuIFRoaXMgZXhwb3NlcyBjb3JlIG1lbW9yeSBtYW5hZ2VtZW50IGFuZCByZWNsYWltIGxvZ2ljIHRvIEJQRiwgbWFraW5nIGl0IGEgZnVuY3Rpb25hbCBjaGFuZ2UgdGhhdCBpcyBoaWdobHkgcmVhY2hhYmxlIGFuZCB3b3J0aCBmdXp6aW5nLlwiLFxuICBcIldvcnRoRnV6emluZ1wiOiB0cnVlXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOC0xOVQwNzo0NDoyMC4zNjMyOTI4MzdaIiwiU2VxIjoxLCJOZXN0aW5nIjoxLCJUeXBlIjoiYWN0aW9uIiwiTmFtZSI6InJlYWQtcGF0Y2gtZGlmZiIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjEzMTU2MTkzOTEsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoie1xuICBcIlBhdGNoRGlmZlwiOiBcImNvbW1pdCA5YmU1MzI1MTQ1YTA3MDA2M2QzOTA5NTgzMjM4YjQ5N2E5NmRkNzdmXFxuQXV0aG9yOiBzeXotY2x1c3RlciBcXHUwMDNjdHJpYWdlQHN5emthbGxlci5jb21cXHUwMDNlXFxuRGF0ZTogICBXZWQgQXVnIDE5IDA3OjQ0OjE4IDIwMjYgKzAwMDBcXG5cXG4gICAgc3l6LWNsdXN0ZXI6IGFwcGxpZWQgcGF0Y2ggdW5kZXIgcmV2aWV3XFxuXFxuZGlmZiAtLWdpdCBhL21tL2JwZl9tZW1jb250cm9sLmMgYi9tbS9icGZfbWVtY29udHJvbC5jXFxuaW5kZXggNzE2ZGY0OWQ3NjQ3Ny4uYjBhMGQ0YzU1ZGM0ZSAxMDA2NDRcXG4tLS0gYS9tbS9icGZfbWVtY29udHJvbC5jXFxuKysrIGIvbW0vYnBmX21lbWNvbnRyb2wuY1xcbkBAIC02LDYgKzYsNyBAQFxcbiAgKi9cXG4gXFxuICNpbmNsdWRlIFxcdTAwM2NsaW51eC9tZW1jb250cm9sLmhcXHUwMDNlXFxuKyNpbmNsdWRlIFxcdTAwM2NsaW51eC9zd2FwLmhcXHUwMDNlXFxuICNpbmNsdWRlIFxcdTAwM2NsaW51eC9icGYuaFxcdTAwM2VcXG4gXFxuIF9fYnBmX2tmdW5jX3N0YXJ0X2RlZnMoKTtcXG5AQCAtMTU5LDYgKzE2MCwxMDMgQEAgX19icGZfa2Z1bmMgdm9pZCBicGZfbWVtX2Nncm91cF9mbHVzaF9zdGF0cyhzdHJ1Y3QgbWVtX2Nncm91cCAqbWVtY2cpXFxuIFxcdG1lbV9jZ3JvdXBfZmx1c2hfc3RhdHMobWVtY2cpO1xcbiB9XFxuIFxcbisvKlxcbisgKiBSZWNsYWltIG11c3Qgbm90IHJlY3Vyc2UuIHRyeV90b19mcmVlX21lbV9jZ3JvdXBfcGFnZXMoKSB1bmNvbmRpdGlvbmFsbHlcXG4rICogb3ZlcndyaXRlcyBjdXJyZW50LVxcdTAwM2VyZWNsYWltX3N0YXRlIG9uIGVudHJ5IGFuZCByZXNldHMgaXQgdG8gTlVMTCBvbiBleGl0LlxcbisgKiBTbyBpbnZva2luZyBpdCBmcm9tIGFuIGluLWZsaWdodCByZWNsYWltIHdvdWxkIGNsb2JiZXIgdGhlIG91dGVyIHJlY2xhaW1cXG4rICogc3RhdGUgYW5kIGNvcnJ1cHQgaXRzIGFjY291bnRpbmcuXFxuKyAqXFxuKyAqIFRoZSBndWFyZCBpcyBQRl9NRU1BTExPQy4gRXZlcnkgcmVjbGFpbSBlbnRyeSBwb2ludCBtYXJrcyB0aGUgY3VycmVudFxcbisgKiB0YXNrIHdpdGggaXQgZm9yIHRoZSB3aG9sZSByZWNsYWltIHdpbmRvdzogdHJ5X3RvX2ZyZWVfbWVtX2Nncm91cF9wYWdlcygpXFxuKyAqIGFuZCBfX3BlcmZvcm1fcmVjbGFpbSgpIGRvIHNvIHZpYSBtZW1hbGxvY19ub3JlY2xhaW1fc2F2ZSgpLCBhbmQga3N3YXBkXFxuKyAqIGtlZXBzIGl0IHNldCBmb3IgaXRzIGVudGlyZSBsaWZldGltZS4gQSBob29rIGluc2lkZSB0aGUgcmVjbGFpbSBwYXRoXFxuKyAqIChzaHJpbmtfbm9kZSwgc2hyaW5rX3NsYWIsIC4uLikgZXhlY3V0ZXMgaW4gdGhlIGNvbnRleHQgb2YgdGhlXFxuKyAqIHJlY2xhaW1pbmcgdGFzaywgd2hlcmUgY3VycmVudC1cXHUwMDNlZmxhZ3MgYWxyZWFkeSBjYXJyaWVzIHRoZSBmbGFnLiBUaGUgcGFnZVxcbisgKiBhbGxvY2F0b3IsIHRoZSBtZW1jZyBjaGFyZ2luZyBwYXRoIGFuZCBub2RlX3JlY2xhaW0oKSByZWx5IG9uIHRoZSBzYW1lXFxuKyAqIGZsYWcgdG8gYXZvaWQgcmVjbGFpbSByZWN1cnNpb24uXFxuKyAqXFxuKyAqIEluIHRyeV90b19mcmVlX21lbV9jZ3JvdXBfcGFnZXMoKSwgcmVjbGFpbV9zdGF0ZSBpcyBzZXQgc2xpZ2h0bHkgYmVmb3JlXFxuKyAqIFBGX01FTUFMTE9DLCB3aXRoIG9ubHkgYSB0cmFjZXBvaW50IGluIGJldHdlZW4sIHdoaWNoIGEgc2xlZXBhYmxlIEJQRlxcbisgKiBwcm9ncmFtIGNhbm5vdCBhdHRhY2ggdG8uXFxuKyAqIEFsc28sIFBGX01FTUFMTE9DIGlzIHNldCBpbiBzb21lIG5vbi1yZWNsYWltIGNvbnRleHRzIChlLmcuIGRpcmVjdCBjb21wYWN0aW9uXFxuKyAqIGFuZCB2bWFsbG9jKSwgd2hlcmUgdGhlIGtmdW5jIGNvbnNlcnZhdGl2ZWx5IHJlZnVzZXMgdG8gcmVjbGFpbSBhcyB3ZWxsLlxcbisgKi9cXG4rc3RhdGljIGJvb2wgYnBmX2luX3JlY2xhaW1fY29udGV4dCh2b2lkKVxcbit7XFxuK1xcdHJldHVybiBjdXJyZW50LVxcdTAwM2VmbGFncyBcXHUwMDI2IFBGX01FTUFMTE9DO1xcbit9XFxuK1xcbisvKlxcbisgKiBTaGFyZWQgaW1wbGVtZW50YXRpb24gb2YgdGhlIHByb2FjdGl2ZSByZWNsYWltIGtmdW5jczogcGVyZm9ybXMgb25lXFxuKyAqIHJlY2xhaW0gcGFzcyBvbiBAbWVtY2cgd2l0aCBAbnJfcGFnZXMgYXMgdGhlIGdvYWwsIGFsbG93aW5nIHN3YXAsIGFuZFxcbisgKiBAc3dhcHBpbmVzcyBhcyB0aGUgYW5vbi9maWxlIGJhbGFuY2Ugb3ZlcnJpZGUgKE5VTEwgdG8gZm9sbG93IHRoZVxcbisgKiBjZ3JvdXAncyBvd24gc3dhcHBpbmVzcyBzZXR0aW5nKS5cXG4rICovXFxuK3N0YXRpYyB1bnNpZ25lZCBsb25nXFxuK2JwZl9wcm9hY3RpdmVfcmVjbGFpbV9wYWdlcyhzdHJ1Y3QgbWVtX2Nncm91cCAqbWVtY2csIHVuc2lnbmVkIGxvbmcgbnJfcGFnZXMsXFxuK1xcdFxcdFxcdCAgICBpbnQgKnN3YXBwaW5lc3MpXFxuK3tcXG4rXFx0aWYgKCFucl9wYWdlcyB8fCB1bmxpa2VseShicGZfaW5fcmVjbGFpbV9jb250ZXh0KCkpKVxcbitcXHRcXHRyZXR1cm4gMDtcXG4rXFxuK1xcdHJldHVybiB0cnlfdG9fZnJlZV9tZW1fY2dyb3VwX3BhZ2VzKG1lbWNnLCBucl9wYWdlcywgR0ZQX0tFUk5FTCxcXG4rXFx0XFx0XFx0XFx0XFx0ICAgIE1FTUNHX1JFQ0xBSU1fTUFZX1NXQVAgfFxcbitcXHRcXHRcXHRcXHRcXHQgICAgTUVNQ0dfUkVDTEFJTV9QUk9BQ1RJVkUsXFxuK1xcdFxcdFxcdFxcdFxcdCAgICBzd2FwcGluZXNzKTtcXG4rfVxcbitcXG4rLyoqXFxuKyAqIGJwZl9wcm9hY3RpdmVfcmVjbGFpbSAtIHByb2FjdGl2ZWx5IHJlY2xhaW0gbWVtb3J5IGZyb20gYSBtZW1vcnlcXG4rICogICAgICAgICAgICAgICAgICAgICAgICAgY2dyb3VwXFxuKyAqIEBtZW1jZzogdGhlIHRhcmdldCBtZW1vcnkgY2dyb3VwIHRvIHJlY2xhaW0gZnJvbVxcbisgKiBAc2l6ZTogIHRoZSBhbW91bnQgb2YgbWVtb3J5IHRvIHJlY2xhaW0sIGluIGJ5dGVzXFxuKyAqXFxuKyAqIFRyaWdnZXIgb25lIHByb2FjdGl2ZSByZWNsYWltIHBhc3Mgb24gQG1lbWNnLCBzaW1pbGFyIHRvIGEgd3JpdGUgdG9cXG4rICogdGhlIG1lbW9yeS5yZWNsYWltIGNncm91cCBmaWxlOiBwYWdlcyBhcmUgcmVjbGFpbWVkIGFjY29yZGluZyB0byB0aGVcXG4rICogY2dyb3VwJ3Mgb3duIHN3YXBwaW5lc3Mgc2V0dGluZyBhbmQgc3dhcCBpcyBhbGxvd2VkLiBOb3RlIHRoYXQsXFxuKyAqIHVubGlrZSBtZW1vcnkucmVjbGFpbSwgdGhpcyBkb2VzIG5vdCByZXRyeSB1bnRpbCBAc2l6ZSBpcyByZWFjaGVkO1xcbisgKiBjYWxsZXJzIGNhbiBpbnZva2UgaXQgYWdhaW4gaWYgbmVlZGVkLlxcbisgKlxcbisgKiBSZXR1cm46XFxuKyAqICAgVGhlIG51bWJlciBvZiBwYWdlcyBhY3R1YWxseSByZWNsYWltZWQsIG9yIDAgaWYgQHNpemUgaXMgc21hbGxlclxcbisgKiAgIHRoYW4gYSBwYWdlIG9yIHRoZSBjYWxsaW5nIHRhc2sgaXMgYWxyZWFkeSBpbiBhIHJlY2xhaW0vZnJlZWluZ1xcbisgKiAgIGNvbnRleHQgKFBGX01FTUFMTE9DKS5cXG4rICovXFxuK19fYnBmX2tmdW5jIHVuc2lnbmVkIGxvbmcgYnBmX3Byb2FjdGl2ZV9yZWNsYWltKHN0cnVjdCBtZW1fY2dyb3VwICptZW1jZyxcXG4rXFx0XFx0XFx0XFx0XFx0XFx0dW5zaWduZWQgbG9uZyBzaXplKVxcbit7XFxuK1xcdHJldHVybiBicGZfcHJvYWN0aXZlX3JlY2xhaW1fcGFnZXMobWVtY2csIHNpemUgLyBQQUdFX1NJWkUsIE5VTEwpO1xcbit9XFxuK1xcbisvKipcXG4rICogYnBmX3Byb2FjdGl2ZV9yZWNsYWltX3N3YXBwaW5lc3MgLSBwcm9hY3RpdmVseSByZWNsYWltIG1lbW9yeSBmcm9tIGFcXG4rICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZW1vcnkgY2dyb3VwIHdpdGggYW4gZXhwbGljaXRcXG4rICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzd2FwcGluZXNzXFxuKyAqIEBtZW1jZzogICAgICB0aGUgdGFyZ2V0IG1lbW9yeSBjZ3JvdXAgdG8gcmVjbGFpbSBmcm9tXFxuKyAqIEBzaXplOiAgICAgICB0aGUgYW1vdW50IG9mIG1lbW9yeSB0byByZWNsYWltLCBpbiBieXRlc1xcbisgKiBAc3dhcHBpbmVzczogc3dhcHBpbmVzcyBvdmVycmlkZSBmb3IgdGhpcyByZWNsYWltIHBhc3NcXG4rICpcXG4rICogU2FtZSBhcyBicGZfcHJvYWN0aXZlX3JlY2xhaW0oKSwgZXhjZXB0IHRoYXQgdGhlIGFub24vZmlsZSByZWNsYWltXFxuKyAqIGJhbGFuY2UgaXMgY29udHJvbGxlZCBieSBAc3dhcHBpbmVzcyBpbnN0ZWFkIG9mIHRoZSBjZ3JvdXAnc1xcbisgKiBzd2FwcGluZXNzIHNldHRpbmcuIFZhbGlkIHZhbHVlcyBhcmUgW01JTl9TV0FQUElORVNTLCBNQVhfU1dBUFBJTkVTU11cXG4rICogYW5kIFNXQVBQSU5FU1NfQU5PTl9PTkxZLCB3aGljaCByZXN0cmljdHMgcmVjbGFpbSB0byBhbm9uIGZvbGlvcy5cXG4rICpcXG4rICogUmV0dXJuOlxcbisgKiAgIFRoZSBudW1iZXIgb2YgcGFnZXMgYWN0dWFsbHkgcmVjbGFpbWVkLCBvciAwIGlmIEBzaXplIGlzIHNtYWxsZXJcXG4rICogICB0aGFuIGEgcGFnZSwgQHN3YXBwaW5lc3MgaXMgb3V0IG9mIHJhbmdlLCBvciB0aGUgY2FsbGluZyB0YXNrIGlzXFxuKyAqICAgYWxyZWFkeSBpbiBhIHJlY2xhaW0vZnJlZWluZyBjb250ZXh0IChQRl9NRU1BTExPQykuXFxuKyAqL1xcbitfX2JwZl9rZnVuYyB1bnNpZ25lZCBsb25nXFxuK2JwZl9wcm9hY3RpdmVfcmVjbGFpbV9zd2FwcGluZXNzKHN0cnVjdCBtZW1fY2dyb3VwICptZW1jZywgdW5zaWduZWQgbG9uZyBzaXplLFxcbitcXHRcXHRcXHRcXHQgaW50IHN3YXBwaW5lc3MpXFxuK3tcXG4rXFx0aWYgKHN3YXBwaW5lc3MgXFx1MDAzYyBNSU5fU1dBUFBJTkVTUyB8fCBzd2FwcGluZXNzIFxcdTAwM2UgU1dBUFBJTkVTU19BTk9OX09OTFkpXFxuK1xcdFxcdHJldHVybiAwO1xcbitcXG4rXFx0cmV0dXJuIGJwZl9wcm9hY3RpdmVfcmVjbGFpbV9wYWdlcyhtZW1jZywgc2l6ZSAvIFBBR0VfU0laRSxcXG4rXFx0XFx0XFx0XFx0XFx0ICAgXFx1MDAyNnN3YXBwaW5lc3MpO1xcbit9XFxuK1xcbiBfX2JwZl9rZnVuY19lbmRfZGVmcygpO1xcbiBcXG4gQlRGX0tGVU5DU19TVEFSVChicGZfbWVtY29udHJvbF9rZnVuY3MpXFxuQEAgLTE3Miw2ICsyNzAsOSBAQCBCVEZfSURfRkxBR1MoZnVuYywgYnBmX21lbV9jZ3JvdXBfdXNhZ2UpXFxuIEJURl9JRF9GTEFHUyhmdW5jLCBicGZfbWVtX2Nncm91cF9wYWdlX3N0YXRlKVxcbiBCVEZfSURfRkxBR1MoZnVuYywgYnBmX21lbV9jZ3JvdXBfZmx1c2hfc3RhdHMsIEtGX1NMRUVQQUJMRSlcXG4gXFxuK0JURl9JRF9GTEFHUyhmdW5jLCBicGZfcHJvYWN0aXZlX3JlY2xhaW0sIEtGX1NMRUVQQUJMRSlcXG4rQlRGX0lEX0ZMQUdTKGZ1bmMsIGJwZl9wcm9hY3RpdmVfcmVjbGFpbV9zd2FwcGluZXNzLCBLRl9TTEVFUEFCTEUpXFxuK1xcbiBCVEZfS0ZVTkNTX0VORChicGZfbWVtY29udHJvbF9rZnVuY3MpXFxuIFxcbiBzdGF0aWMgY29uc3Qgc3RydWN0IGJ0Zl9rZnVuY19pZF9zZXQgYnBmX21lbWNvbnRyb2xfa2Z1bmNfc2V0ID0ge1xcbmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ190ZXN0cy9tZW1jZ19hc3luY19yZWNsYWltLmMgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ190ZXN0cy9tZW1jZ19hc3luY19yZWNsYWltLmNcXG5uZXcgZmlsZSBtb2RlIDEwMDY0NFxcbmluZGV4IDAwMDAwMDAwMDAwMDAuLmU5OTBkMWZkYzc5ZmRcXG4tLS0gL2Rldi9udWxsXFxuKysrIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dfdGVzdHMvbWVtY2dfYXN5bmNfcmVjbGFpbS5jXFxuQEAgLTAsMCArMSw0NzkgQEBcXG4rLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjBcXG4rLypcXG4rICogTWVtb3J5IGNvbnRyb2xsZXIgZUJQRiBhc3luYyByZWNsYWltIHRlc3RcXG4rICovXFxuK1xcbisjaW5jbHVkZSBcXHUwMDNjdGVzdF9wcm9ncy5oXFx1MDAzZVxcbisjaW5jbHVkZSBcXHUwMDNjc3lzL21tYW4uaFxcdTAwM2VcXG4rI2luY2x1ZGUgXFx1MDAzY3N5cy9zdGF0LmhcXHUwMDNlXFxuKyNpbmNsdWRlIFxcdTAwM2NzeXMvdmZzLmhcXHUwMDNlXFxuKyNpbmNsdWRlIFxcdTAwM2NzeXMvd2FpdC5oXFx1MDAzZVxcbisjaW5jbHVkZSBcXHUwMDNjZmNudGwuaFxcdTAwM2VcXG4rI2luY2x1ZGUgXFx1MDAzY3NpZ25hbC5oXFx1MDAzZVxcbisjaW5jbHVkZSBcXHUwMDNjdGltZS5oXFx1MDAzZVxcbisjaW5jbHVkZSBcXHUwMDNjdW5pc3RkLmhcXHUwMDNlXFxuKyNpbmNsdWRlIFxcdTAwM2NzdGRpby5oXFx1MDAzZVxcbisjaW5jbHVkZSBcXHUwMDNjc3RkbGliLmhcXHUwMDNlXFxuKyNpbmNsdWRlIFxcdTAwM2NzdHJpbmcuaFxcdTAwM2VcXG4rI2luY2x1ZGUgXFx1MDAzY2xpbWl0cy5oXFx1MDAzZVxcbisjaW5jbHVkZSBcXHUwMDNjbGludXgvbWFnaWMuaFxcdTAwM2VcXG4rXFxuKyNpbmNsdWRlIFxcXCJjZ3JvdXBfaGVscGVycy5oXFxcIlxcbitcXG4rc3RydWN0IGJwZl9hcmdzX3Mge1xcbitcXHR1NjQgaGlnaF9jZ3JvdXBfaWQ7XFxuK1xcdHU2NCBsb3dfY2dyb3VwX2lkO1xcbitcXHR1NjQgZXZlbnRfZGVsdGFfdGhyZXNob2xkO1xcbitcXHR1NjQgY2hlY2tfbnM7XFxuK307XFxuK1xcbisjaW5jbHVkZSBcXFwibWVtY2dfYXN5bmNfcmVjbGFpbS5za2VsLmhcXFwiXFxuK1xcbisjZGVmaW5lIEZJTEVfU0laRSAoMzIgKiAxMDI0ICogMTAyNHVsKVxcbisjZGVmaW5lIEJVRkZFUl9TSVpFICg0MDk2KVxcbisjZGVmaW5lIENHX0xJTUlUICgzMiAqIDEwMjQgKiAxMDI0dWwpXFxuKyNkZWZpbmUgUkVBRF9USU1FUyA1MFxcbitcXG4rI2RlZmluZSBDR19ESVIgXFxcIi9tZW1jZ19hc3luY19yZWNsYWltXFxcIlxcbisjZGVmaW5lIENHX0hJR0hfRElSIENHX0RJUiBcXFwiL2hpZ2hcXFwiXFxuKyNkZWZpbmUgQ0dfTE9XX0RJUiBDR19ESVIgXFxcIi9sb3dcXFwiXFxuK1xcbisjZGVmaW5lIENIRUNLX1BFUklPRF9OUyAoMiAqIDEwMDAgKiAxMDAwdWxsKVxcbisjZGVmaW5lIEVWRU5UX0RFTFRBX1RIUkVTSE9MRCAxXFxuK1xcbisvKlxcbisgKiBUaGUgd29ya2xvYWQgZmlsZXMgbXVzdCBzaXQgb24gYSByZWd1bGFyIGZpbGVzeXN0ZW06IHdpdGggc3dhcFxcbisgKiBkaXNhYmxlZCBmb3IgdGhlIGNncm91cCwgdG1wZnMvcmFtZnMgcGFnZXMgYXJlIHVuZXZpY3RhYmxlIGFuZCB3b3VsZFxcbisgKiBPT00gdGhlIGNncm91cCBpbnN0ZWFkIG9mIGV4ZXJjaXNpbmcgcmVjbGFpbTsgdGhleSBhcmUgYWxzbyBjaGFyZ2VkXFxuKyAqIGFzIGFub255bW91cyBtZW1vcnksIHNvIHRoZXkgbmV2ZXIgcmFpc2UgdGhlIFdPUktJTkdTRVRfUkVGQVVMVF9GSUxFXFxuKyAqIGV2ZW50cyB0aGUgQlBGIHByb2dyYW0gbW9uaXRvcnMuIEZhbGwgYmFjayB0byB0aGUgY3VycmVudCBkaXJlY3RvcnlcXG4rICogd2hlbiAvdG1wIGlzIGJhY2tlZCBieSBzdWNoIGEgZmlsZXN5c3RlbS5cXG4rICovXFxuK3N0YXRpYyBjb25zdCBjaGFyICp3b3JrbG9hZF9maWxlc19kaXIodm9pZClcXG4re1xcbitcXHRzdHJ1Y3Qgc3RhdGZzIHN0O1xcbitcXG4rXFx0aWYgKCFzdGF0ZnMoXFxcIi90bXBcXFwiLCBcXHUwMDI2c3QpIFxcdTAwMjZcXHUwMDI2XFxuK1xcdCAgICAoc3QuZl90eXBlID09IFRNUEZTX01BR0lDIHx8IHN0LmZfdHlwZSA9PSBSQU1GU19NQUdJQykpXFxuK1xcdFxcdHJldHVybiBcXFwiLlxcXCI7XFxuK1xcdHJldHVybiBcXFwiL3RtcFxcXCI7XFxuK31cXG4rXFxuKy8qXFxuKyAqIFRoZSB3b3JrbG9hZCBjaGlsZHJlbiBydW4gYWZ0ZXIgdGVzdF9wcm9ncyBoaWphY2tlZCBzdGRpbywgc29cXG4rICogYW55dGhpbmcgdGhleSBwcmludCBpcyBsb3N0IHdpdGggdGhlaXIgcHJpdmF0ZSBjb3B5IG9mIHRoZSBoaWphY2tlZFxcbisgKiBidWZmZXIuIFRoZSBleGl0IHN0YXR1cyBpcyB0aGUgb25seSBkaWFnbm9zdGljcyBjaGFubmVsIHRoYXQgcmVhY2hlc1xcbisgKiB0aGUgcGFyZW50LCBzbyBlYWNoIGZhaWxpbmcgc3RlcCBnZXRzIGl0cyBvd24gY29kZS5cXG4rICovXFxuK2VudW0gY2hpbGRfZXhpdF9jb2RlIHtcXG4rXFx0Q0hJTERfRVhJVF9PSyA9IDAsXFxuK1xcdENISUxEX0VYSVRfSk9JTl9DR1JPVVAsXFxuK1xcdENISUxEX0VYSVRfV1JJVEVfRklMRSxcXG4rXFx0Q0hJTERfRVhJVF9SRUFEX0ZJTEUsXFxuK1xcdENISUxEX0VYSVRfVElNRV9GSUxFLFxcbit9O1xcbitcXG4rc3RhdGljIGNvbnN0IGNoYXIgKmNoaWxkX2V4aXRfc3RyKGludCBjb2RlKVxcbit7XFxuK1xcdHN3aXRjaCAoY29kZSkge1xcbitcXHRjYXNlIENISUxEX0VYSVRfT0s6XFxuK1xcdFxcdHJldHVybiBcXFwic3VjY2Vzc1xcXCI7XFxuK1xcdGNhc2UgQ0hJTERfRVhJVF9KT0lOX0NHUk9VUDpcXG4rXFx0XFx0cmV0dXJuIFxcXCJqb2luIGNncm91cFxcXCI7XFxuK1xcdGNhc2UgQ0hJTERfRVhJVF9XUklURV9GSUxFOlxcbitcXHRcXHRyZXR1cm4gXFxcIndyaXRlIGRhdGEgZmlsZVxcXCI7XFxuK1xcdGNhc2UgQ0hJTERfRVhJVF9SRUFEX0ZJTEU6XFxuK1xcdFxcdHJldHVybiBcXFwicmVhZCBkYXRhIGZpbGVcXFwiO1xcbitcXHRjYXNlIENISUxEX0VYSVRfVElNRV9GSUxFOlxcbitcXHRcXHRyZXR1cm4gXFxcIndyaXRlIHRpbWUgZmlsZVxcXCI7XFxuK1xcdGRlZmF1bHQ6XFxuK1xcdFxcdHJldHVybiBcXFwidW5rbm93blxcXCI7XFxuK1xcdH1cXG4rfVxcbitcXG4rc3RhdGljIGludCBzZXR1cF9oaWdoX2xvd19jZ3JvdXBzKHU2NCAqaGlnaF9jZ3JvdXBfaWQsIHU2NCAqbG93X2Nncm91cF9pZClcXG4re1xcbitcXHRpbnQgcmV0O1xcbitcXHRjaGFyIGxpbWl0X2J1ZlsyMF07XFxuK1xcbitcXHRyZXQgPSBzZXR1cF9jZ3JvdXBfZW52aXJvbm1lbnQoKTtcXG4rXFx0aWYgKCFBU1NFUlRfT0socmV0LCBcXFwic2V0dXBfY2dyb3VwX2Vudmlyb25tZW50XFxcIikpXFxuK1xcdFxcdGdvdG8gY2xlYW51cDtcXG4rXFxuK1xcdHJldCA9IGNyZWF0ZV9hbmRfZ2V0X2Nncm91cChDR19ESVIpO1xcbitcXHRpZiAoIUFTU0VSVF9HRShyZXQsIDAsIFxcXCJjcmVhdGVfYW5kX2dldF9jZ3JvdXAgXFxcIiBDR19ESVIpKVxcbitcXHRcXHRnb3RvIGNsZWFudXA7XFxuK1xcdGNsb3NlKHJldCk7XFxuK1xcbitcXHRyZXQgPSBlbmFibGVfY29udHJvbGxlcnMoQ0dfRElSLCBcXFwibWVtb3J5XFxcIik7XFxuK1xcdGlmICghQVNTRVJUX09LKHJldCwgXFxcImVuYWJsZV9jb250cm9sbGVyc1xcXCIpKVxcbitcXHRcXHRnb3RvIGNsZWFudXA7XFxuK1xcbitcXHRzbnByaW50ZihsaW1pdF9idWYsIHNpemVvZihsaW1pdF9idWYpLCBcXFwiJWx1XFxcIiwgQ0dfTElNSVQpO1xcbitcXHRyZXQgPSB3cml0ZV9jZ3JvdXBfZmlsZShDR19ESVIsIFxcXCJtZW1vcnkubWF4XFxcIiwgbGltaXRfYnVmKTtcXG4rXFx0aWYgKCFBU1NFUlRfT0socmV0LCBcXFwid3JpdGVfY2dyb3VwX2ZpbGUgbWVtb3J5Lm1heFxcXCIpKVxcbitcXHRcXHRnb3RvIGNsZWFudXA7XFxuK1xcbitcXHQvKlxcbitcXHQgKiBLZWVwIHRoZSB3b3JrbG9hZHMgZnJvbSBzd2FwcGluZyBvdXQuIFdpdGggQ09ORklHX1NXQVA9biB0aGVcXG4rXFx0ICogbWVtb3J5LnN3YXAubWF4IGZpbGUgZG9lcyBub3QgZXhpc3QsIGFuZCBubyBzd2FwIGNhbiBoYXBwZW5cXG4rXFx0ICogYW55d2F5LCBzbyBza2lwIHRoZSB3cml0ZS5cXG4rXFx0ICovXFxuK1xcdGlmICghYWNjZXNzKFxcXCIvcHJvYy9zd2Fwc1xcXCIsIEZfT0spKSB7XFxuK1xcdFxcdHJldCA9IHdyaXRlX2Nncm91cF9maWxlKENHX0RJUiwgXFxcIm1lbW9yeS5zd2FwLm1heFxcXCIsIFxcXCIwXFxcIik7XFxuK1xcdFxcdGlmICghQVNTRVJUX09LKHJldCwgXFxcIndyaXRlX2Nncm91cF9maWxlIG1lbW9yeS5zd2FwLm1heFxcXCIpKVxcbitcXHRcXHRcXHRnb3RvIGNsZWFudXA7XFxuK1xcdH1cXG4rXFxuK1xcdHJldCA9IGNyZWF0ZV9hbmRfZ2V0X2Nncm91cChDR19ISUdIX0RJUik7XFxuK1xcdGlmICghQVNTRVJUX0dFKHJldCwgMCwgXFxcImNyZWF0ZV9hbmRfZ2V0X2Nncm91cCBcXFwiIENHX0hJR0hfRElSKSlcXG4rXFx0XFx0Z290byBjbGVhbnVwO1xcbitcXHRjbG9zZShyZXQpO1xcbitcXG4rXFx0KmhpZ2hfY2dyb3VwX2lkID0gZ2V0X2Nncm91cF9pZChDR19ISUdIX0RJUik7XFxuK1xcdGlmICghQVNTRVJUX0dUKCpoaWdoX2Nncm91cF9pZCwgMCwgXFxcImdldF9jZ3JvdXBfaWRcXFwiKSlcXG4rXFx0XFx0Z290byBjbGVhbnVwO1xcbitcXG4rXFx0cmV0ID0gY3JlYXRlX2FuZF9nZXRfY2dyb3VwKENHX0xPV19ESVIpO1xcbitcXHRpZiAoIUFTU0VSVF9HRShyZXQsIDAsIFxcXCJjcmVhdGVfYW5kX2dldF9jZ3JvdXAgXFxcIiBDR19MT1dfRElSKSlcXG4rXFx0XFx0Z290byBjbGVhbnVwO1xcbitcXHRjbG9zZShyZXQpO1xcbitcXG4rXFx0Kmxvd19jZ3JvdXBfaWQgPSBnZXRfY2dyb3VwX2lkKENHX0xPV19ESVIpO1xcbitcXHRpZiAoIUFTU0VSVF9HVCgqbG93X2Nncm91cF9pZCwgMCwgXFxcImdldF9jZ3JvdXBfaWRcXFwiKSlcXG4rXFx0XFx0Z290byBjbGVhbnVwO1xcbitcXG4rXFx0cmV0dXJuIDA7XFxuK1xcbitjbGVhbnVwOlxcbitcXHRjbGVhbnVwX2Nncm91cF9lbnZpcm9ubWVudCgpO1xcbitcXHRyZXR1cm4gLTE7XFxuK31cXG4rXFxuK3N0YXRpYyBpbnQgd3JpdGVfZmlsZShjb25zdCBjaGFyICpmaWxlbmFtZSlcXG4re1xcbitcXHRpbnQgcmV0ID0gLTE7XFxuK1xcdHNpemVfdCB3cml0dGVuID0gMDtcXG4rXFx0Y2hhciAqYnVmZmVyO1xcbitcXHRGSUxFICpmcDtcXG4rXFxuK1xcdGZwID0gZm9wZW4oZmlsZW5hbWUsIFxcXCJ3YlxcXCIpO1xcbitcXHRpZiAoIWZwKVxcbitcXHRcXHRnb3RvIG91dDtcXG4rXFxuK1xcdGJ1ZmZlciA9IG1hbGxvYyhCVUZGRVJfU0laRSk7XFxuK1xcdGlmICghYnVmZmVyKVxcbitcXHRcXHRnb3RvIGNsZWFudXBfZnA7XFxuK1xcbitcXHRtZW1zZXQoYnVmZmVyLCAnQScsIEJVRkZFUl9TSVpFKTtcXG4rXFxuK1xcdHdoaWxlICh3cml0dGVuIFxcdTAwM2MgRklMRV9TSVpFKSB7XFxuK1xcdFxcdHNpemVfdCB0b193cml0ZSA9IEZJTEVfU0laRSAtIHdyaXR0ZW4gXFx1MDAzYyBCVUZGRVJfU0laRSA/XFxuK1xcdFxcdFxcdFxcdCAgRklMRV9TSVpFIC0gd3JpdHRlbiA6IEJVRkZFUl9TSVpFO1xcbitcXG4rXFx0XFx0aWYgKGZ3cml0ZShidWZmZXIsIDEsIHRvX3dyaXRlLCBmcCkgIT0gdG9fd3JpdGUpXFxuK1xcdFxcdFxcdGdvdG8gY2xlYW51cDtcXG4rXFx0XFx0d3JpdHRlbiArPSB0b193cml0ZTtcXG4rXFx0fVxcbitcXG4rXFx0cmV0ID0gMDtcXG4rY2xlYW51cDpcXG4rXFx0ZnJlZShidWZmZXIpO1xcbitjbGVhbnVwX2ZwOlxcbitcXHRmY2xvc2UoZnApO1xcbitvdXQ6XFxuK1xcdHJldHVybiByZXQ7XFxuK31cXG4rXFxuK3N0YXRpYyBpbnQgcmVhZF9maWxlKGNvbnN0IGNoYXIgKmZpbGVuYW1lLCBpbnQgaXRlcmF0aW9ucylcXG4re1xcbitcXHRpbnQgcmV0ID0gLTE7XFxuK1xcdGxvbmcgcGFnZV9zaXplID0gc3lzY29uZihfU0NfUEFHRVNJWkUpO1xcbitcXHRjaGFyICptYXA7XFxuK1xcdHNpemVfdCBpO1xcbitcXHRpbnQgZmQ7XFxuK1xcdHN0cnVjdCBzdGF0IHNiO1xcbitcXG4rXFx0ZmQgPSBvcGVuKGZpbGVuYW1lLCBPX1JET05MWSk7XFxuK1xcdGlmIChmZCA9PSAtMSlcXG4rXFx0XFx0Z290byBvdXQ7XFxuK1xcbitcXHRpZiAoZnN0YXQoZmQsIFxcdTAwMjZzYikgPT0gLTEpXFxuK1xcdFxcdGdvdG8gY2xlYW51cF9mZDtcXG4rXFxuK1xcdGlmIChzYi5zdF9zaXplICE9IEZJTEVfU0laRSkge1xcbitcXHRcXHRmcHJpbnRmKHN0ZGVyciwgXFxcIkZpbGUgc2l6ZSBtaXNtYXRjaDogZXhwZWN0ZWQgJWx1LCBnb3QgJWx1XFxcXG5cXFwiLFxcbitcXHRcXHRcXHQodW5zaWduZWQgbG9uZylGSUxFX1NJWkUsICh1bnNpZ25lZCBsb25nKXNiLnN0X3NpemUpO1xcbitcXHRcXHRnb3RvIGNsZWFudXBfZmQ7XFxuK1xcdH1cXG4rXFxuK1xcdG1hcCA9IG1tYXAoTlVMTCwgRklMRV9TSVpFLCBQUk9UX1JFQUQsIE1BUF9QUklWQVRFLCBmZCwgMCk7XFxuK1xcdGlmIChtYXAgPT0gTUFQX0ZBSUxFRClcXG4rXFx0XFx0Z290byBjbGVhbnVwX2ZkO1xcbitcXG4rXFx0Zm9yIChpbnQgaXRlciA9IDA7IGl0ZXIgXFx1MDAzYyBpdGVyYXRpb25zOyBpdGVyKyspIHtcXG4rXFx0XFx0Zm9yIChpID0gMDsgaSBcXHUwMDNjIEZJTEVfU0laRTsgaSArPSBwYWdlX3NpemUpIHtcXG4rXFx0XFx0XFx0LyogYWNjZXNzIGEgYnl0ZSB0byB0cmlnZ2VyIHBhZ2UgZmF1bHQgKi9cXG4rXFx0XFx0XFx0dm9sYXRpbGUgY2hhciB2ID0gbWFwW2ldO1xcbitcXHRcXHRcXHQodm9pZCl2O1xcbitcXHRcXHR9XFxuK1xcdH1cXG4rXFxuK1xcdGlmIChtdW5tYXAobWFwLCBGSUxFX1NJWkUpID09IC0xKVxcbitcXHRcXHRnb3RvIGNsZWFudXBfZmQ7XFxuK1xcbitcXHRyZXQgPSAwO1xcbitcXG4rY2xlYW51cF9mZDpcXG4rXFx0Y2xvc2UoZmQpO1xcbitvdXQ6XFxuK1xcdHJldHVybiByZXQ7XFxuK31cXG4rXFxuK3N0YXRpYyBpbnQgcmVhbF90ZXN0X2NoaWxkX3dvcmsoY29uc3QgY2hhciAqY2dyb3VwX3BhdGgsIGNoYXIgKmRhdGFfZmlsZW5hbWUsXFxuK1xcdFxcdFxcdFxcdGNoYXIgKnRpbWVfZmlsZW5hbWUsIGludCByZWFkX3RpbWVzKVxcbit7XFxuK1xcdHN0cnVjdCB0aW1lc3BlYyBzdGFydCwgZW5kO1xcbitcXHRkb3VibGUgZWxhcHNlZDtcXG4rXFx0RklMRSAqZnA7XFxuK1xcbitcXHRpZiAoam9pbl9wYXJlbnRfY2dyb3VwKGNncm91cF9wYXRoKSlcXG4rXFx0XFx0cmV0dXJuIENISUxEX0VYSVRfSk9JTl9DR1JPVVA7XFxuK1xcbitcXHRjbG9ja19nZXR0aW1lKENMT0NLX01PTk9UT05JQywgXFx1MDAyNnN0YXJ0KTtcXG4rXFxuK1xcdGlmICh3cml0ZV9maWxlKGRhdGFfZmlsZW5hbWUpKVxcbitcXHRcXHRyZXR1cm4gQ0hJTERfRVhJVF9XUklURV9GSUxFO1xcbitcXG4rXFx0aWYgKHJlYWRfZmlsZShkYXRhX2ZpbGVuYW1lLCByZWFkX3RpbWVzKSlcXG4rXFx0XFx0cmV0dXJuIENISUxEX0VYSVRfUkVBRF9GSUxFO1xcbitcXG4rXFx0Y2xvY2tfZ2V0dGltZShDTE9DS19NT05PVE9OSUMsIFxcdTAwMjZlbmQpO1xcbitcXG4rXFx0aWYgKCF0aW1lX2ZpbGVuYW1lKVxcbitcXHRcXHRyZXR1cm4gQ0hJTERfRVhJVF9PSztcXG4rXFxuK1xcdGVsYXBzZWQgPSAoZW5kLnR2X3NlYyAtIHN0YXJ0LnR2X3NlYykgK1xcbitcXHRcXHQgIChlbmQudHZfbnNlYyAtIHN0YXJ0LnR2X25zZWMpIC8gMTAwMDAwMDAwMC4wO1xcbitcXHRwcmludGYoXFxcIiUuNmZcXFxcblxcXCIsIGVsYXBzZWQpO1xcbitcXG4rXFx0ZnAgPSBmb3Blbih0aW1lX2ZpbGVuYW1lLCBcXFwid1xcXCIpO1xcbitcXHRpZiAoIWZwKVxcbitcXHRcXHRyZXR1cm4gQ0hJTERfRVhJVF9USU1FX0ZJTEU7XFxuK1xcdGZwcmludGYoZnAsIFxcXCIlLjZmXFxcIiwgZWxhcHNlZCk7XFxuK1xcdGZjbG9zZShmcCk7XFxuK1xcbitcXHRyZXR1cm4gQ0hJTERfRVhJVF9PSztcXG4rfVxcbitcXG4rc3RhdGljIGludCBnZXRfdGltZShjaGFyICp0aW1lX2ZpbGVuYW1lLCBkb3VibGUgKnRpbWUpXFxuK3tcXG4rXFx0aW50IHJldCA9IC0xO1xcbitcXHRGSUxFICpmcDtcXG4rXFx0Y2hhciBidWZbNjRdO1xcbitcXG4rXFx0ZnAgPSBmb3Blbih0aW1lX2ZpbGVuYW1lLCBcXFwiclxcXCIpO1xcbitcXHRpZiAoIUFTU0VSVF9PS19QVFIoZnAsIFxcXCJmb3BlblxcXCIpKVxcbitcXHRcXHRnb3RvIG91dDtcXG4rXFxuK1xcdGlmICghQVNTRVJUX09LX1BUUihmZ2V0cyhidWYsIHNpemVvZihidWYpLCBmcCksIFxcXCJmZ2V0c1xcXCIpKVxcbitcXHRcXHRnb3RvIGNsZWFudXA7XFxuK1xcbitcXHRpZiAoc3NjYW5mKGJ1ZiwgXFxcIiVsZlxcXCIsIHRpbWUpICE9IDEpIHtcXG4rXFx0XFx0UFJJTlRfRkFJTChcXFwic3NjYW5mICVzXFxcIiwgYnVmKTtcXG4rXFx0XFx0Z290byBjbGVhbnVwO1xcbitcXHR9XFxuK1xcbitcXHRyZXQgPSAwO1xcbitjbGVhbnVwOlxcbitcXHRmY2xvc2UoZnApO1xcbitvdXQ6XFxuK1xcdHJldHVybiByZXQ7XFxuK31cXG4rXFxuK3N0YXRpYyBpbnRcXG4rcnVuX2hpZ2hfbG93X3dvcmtsb2FkKGRvdWJsZSAqaGlnaF9lbGFwc2VkLCBkb3VibGUgKmxvd19lbGFwc2VkLCBpbnQgcmVhZF90aW1lcylcXG4re1xcbitcXHRjaGFyIGhpZ2hfZGF0YV9maWxlW1BBVEhfTUFYXTtcXG4rXFx0Y2hhciBsb3dfZGF0YV9maWxlW1BBVEhfTUFYXTtcXG4rXFx0Y2hhciBoaWdoX3RpbWVfZmlsZVtQQVRIX01BWF07XFxuK1xcdGNoYXIgbG93X3RpbWVfZmlsZVtQQVRIX01BWF07XFxuK1xcdGNvbnN0IGNoYXIgKmRpciA9IHdvcmtsb2FkX2ZpbGVzX2RpcigpO1xcbitcXHRwaWRfdCBoaWdoX3BpZCA9IC0xLCBsb3dfcGlkID0gLTE7XFxuK1xcdGludCBmZCwgc3RhdHVzO1xcbitcXHRpbnQgcmV0ID0gLTE7XFxuK1xcbitcXHRzbnByaW50ZihoaWdoX2RhdGFfZmlsZSwgc2l6ZW9mKGhpZ2hfZGF0YV9maWxlKSxcXG4rXFx0XFx0IFxcXCIlcy9tZW1jZ19hc3luY19oaWdoX2RhdGFfWFhYWFhYXFxcIiwgZGlyKTtcXG4rXFx0c25wcmludGYobG93X2RhdGFfZmlsZSwgc2l6ZW9mKGxvd19kYXRhX2ZpbGUpLFxcbitcXHRcXHQgXFxcIiVzL21lbWNnX2FzeW5jX2xvd19kYXRhX1hYWFhYWFxcXCIsIGRpcik7XFxuK1xcdHNucHJpbnRmKGhpZ2hfdGltZV9maWxlLCBzaXplb2YoaGlnaF90aW1lX2ZpbGUpLFxcbitcXHRcXHQgXFxcIiVzL21lbWNnX2FzeW5jX2hpZ2hfdGltZV9YWFhYWFhcXFwiLCBkaXIpO1xcbitcXHRzbnByaW50Zihsb3dfdGltZV9maWxlLCBzaXplb2YobG93X3RpbWVfZmlsZSksXFxuK1xcdFxcdCBcXFwiJXMvbWVtY2dfYXN5bmNfbG93X3RpbWVfWFhYWFhYXFxcIiwgZGlyKTtcXG4rXFxuK1xcdGZkID0gbWtzdGVtcChoaWdoX2RhdGFfZmlsZSk7XFxuK1xcdGlmICghQVNTRVJUX0dFKGZkLCAwLCBcXFwibWtzdGVtcFxcXCIpKVxcbitcXHRcXHRnb3RvIGNsZWFudXA7XFxuK1xcdGNsb3NlKGZkKTtcXG4rXFxuK1xcdGZkID0gbWtzdGVtcChsb3dfZGF0YV9maWxlKTtcXG4rXFx0aWYgKCFBU1NFUlRfR0UoZmQsIDAsIFxcXCJta3N0ZW1wXFxcIikpXFxuK1xcdFxcdGdvdG8gY2xlYW51cDtcXG4rXFx0Y2xvc2UoZmQpO1xcbitcXG4rXFx0ZmQgPSBta3N0ZW1wKGhpZ2hfdGltZV9maWxlKTtcXG4rXFx0aWYgKCFBU1NFUlRfR0UoZmQsIDAsIFxcXCJta3N0ZW1wXFxcIikpXFxuK1xcdFxcdGdvdG8gY2xlYW51cDtcXG4rXFx0Y2xvc2UoZmQpO1xcbitcXG4rXFx0ZmQgPSBta3N0ZW1wKGxvd190aW1lX2ZpbGUpO1xcbitcXHRpZiAoIUFTU0VSVF9HRShmZCwgMCwgXFxcIm1rc3RlbXBcXFwiKSlcXG4rXFx0XFx0Z290byBjbGVhbnVwO1xcbitcXHRjbG9zZShmZCk7XFxuK1xcbitcXHRsb3dfcGlkID0gZm9yaygpO1xcbitcXHRpZiAoIUFTU0VSVF9HRShsb3dfcGlkLCAwLCBcXFwiZm9yayBsb3dcXFwiKSlcXG4rXFx0XFx0Z290byBjbGVhbnVwO1xcbitcXHRpZiAobG93X3BpZCA9PSAwKVxcbitcXHRcXHRleGl0KHJlYWxfdGVzdF9jaGlsZF93b3JrKENHX0xPV19ESVIsIGxvd19kYXRhX2ZpbGUsXFxuK1xcdFxcdFxcdFxcdFxcdCAgbG93X3RpbWVfZmlsZSwgcmVhZF90aW1lcykpO1xcbitcXG4rXFx0aGlnaF9waWQgPSBmb3JrKCk7XFxuK1xcdGlmICghQVNTRVJUX0dFKGhpZ2hfcGlkLCAwLCBcXFwiZm9yayBoaWdoXFxcIikpXFxuK1xcdFxcdGdvdG8gY2xlYW51cDtcXG4rXFx0aWYgKGhpZ2hfcGlkID09IDApXFxuK1xcdFxcdGV4aXQocmVhbF90ZXN0X2NoaWxkX3dvcmsoQ0dfSElHSF9ESVIsIGhpZ2hfZGF0YV9maWxlLFxcbitcXHRcXHRcXHRcXHRcXHQgIGhpZ2hfdGltZV9maWxlLCByZWFkX3RpbWVzKSk7XFxuK1xcbitcXHRsb3dfcGlkID0gd2FpdHBpZChsb3dfcGlkLCBcXHUwMDI2c3RhdHVzLCAwKTtcXG4rXFx0aWYgKCFBU1NFUlRfR1QobG93X3BpZCwgMCwgXFxcImxvdyB3YWl0cGlkXFxcIikpXFxuK1xcdFxcdGdvdG8gY2xlYW51cDtcXG4rXFx0LypcXG4rXFx0ICogVGhlIGNoaWxkIGhhcyBiZWVuIHJlYXBlZCBhbmQgaXRzIFBJRCBjYW4gYWxyZWFkeSBiZSByZXVzZWQsXFxuK1xcdCAqIHNvIG1hcmsgaXQgdG8ga2VlcCBjbGVhbnVwIGZyb20gc2lnbmFsaW5nIGFuIHVucmVsYXRlZCBwcm9jZXNzLlxcbitcXHQgKi9cXG4rXFx0bG93X3BpZCA9IC0xO1xcbitcXHRpZiAoIUFTU0VSVF9UUlVFKFdJRkVYSVRFRChzdGF0dXMpLCBcXFwibG93IGV4aXRlZFxcXCIpKVxcbitcXHRcXHRnb3RvIGNsZWFudXA7XFxuK1xcdGlmIChXRVhJVFNUQVRVUyhzdGF0dXMpICE9IENISUxEX0VYSVRfT0spIHtcXG4rXFx0XFx0UFJJTlRfRkFJTChcXFwibG93IGNoaWxkIGZhaWxlZCBhdDogJXMgKGV4aXQgc3RhdHVzICVkKVxcXCIsXFxuK1xcdFxcdFxcdCAgIGNoaWxkX2V4aXRfc3RyKFdFWElUU1RBVFVTKHN0YXR1cykpLFxcbitcXHRcXHRcXHQgICBXRVhJVFNUQVRVUyhzdGF0dXMpKTtcXG4rXFx0XFx0Z290byBjbGVhbnVwO1xcbitcXHR9XFxuK1xcbitcXHRoaWdoX3BpZCA9IHdhaXRwaWQoaGlnaF9waWQsIFxcdTAwMjZzdGF0dXMsIDApO1xcbitcXHRpZiAoIUFTU0VSVF9HVChoaWdoX3BpZCwgMCwgXFxcImhpZ2ggd2FpdHBpZFxcXCIpKVxcbitcXHRcXHRnb3RvIGNsZWFudXA7XFxuK1xcdC8qIFNhbWUgYXMgYWJvdmU6IHRoZSByZWFwZWQgUElEIG11c3Qgbm90IGJlIHNpZ25hbGVkIGFnYWluLiAqL1xcbitcXHRoaWdoX3BpZCA9IC0xO1xcbitcXHRpZiAoIUFTU0VSVF9UUlVFKFdJRkVYSVRFRChzdGF0dXMpLCBcXFwiaGlnaCBleGl0ZWRcXFwiKSlcXG4rXFx0XFx0Z290byBjbGVhbnVwO1xcbitcXHRpZiAoV0VYSVRTVEFUVVMoc3RhdHVzKSAhPSBDSElMRF9FWElUX09LKSB7XFxuK1xcdFxcdFBSSU5UX0ZBSUwoXFxcImhpZ2ggY2hpbGQgZmFpbGVkIGF0OiAlcyAoZXhpdCBzdGF0dXMgJWQpXFxcIixcXG4rXFx0XFx0XFx0ICAgY2hpbGRfZXhpdF9zdHIoV0VYSVRTVEFUVVMoc3RhdHVzKSksXFxuK1xcdFxcdFxcdCAgIFdFWElUU1RBVFVTKHN0YXR1cykpO1xcbitcXHRcXHRnb3RvIGNsZWFudXA7XFxuK1xcdH1cXG4rXFxuK1xcdGlmIChnZXRfdGltZShoaWdoX3RpbWVfZmlsZSwgaGlnaF9lbGFwc2VkKSlcXG4rXFx0XFx0Z290byBjbGVhbnVwO1xcbitcXHRpZiAoZ2V0X3RpbWUobG93X3RpbWVfZmlsZSwgbG93X2VsYXBzZWQpKVxcbitcXHRcXHRnb3RvIGNsZWFudXA7XFxuK1xcbitcXHRyZXQgPSAwO1xcbitcXG4rY2xlYW51cDpcXG4rXFx0LyogT24gZmFpbHVyZSwgbWFrZSBzdXJlIG5vIGNoaWxkIHByb2Nlc3MgaXMgbGVmdCBiZWhpbmQgKi9cXG4rXFx0aWYgKHJldCkge1xcbitcXHRcXHRpZiAoaGlnaF9waWQgXFx1MDAzZSAwKSB7XFxuK1xcdFxcdFxcdGtpbGwoaGlnaF9waWQsIFNJR0tJTEwpO1xcbitcXHRcXHRcXHQodm9pZCl3YWl0cGlkKGhpZ2hfcGlkLCBOVUxMLCAwKTtcXG4rXFx0XFx0fVxcbitcXHRcXHRpZiAobG93X3BpZCBcXHUwMDNlIDApIHtcXG4rXFx0XFx0XFx0a2lsbChsb3dfcGlkLCBTSUdLSUxMKTtcXG4rXFx0XFx0XFx0KHZvaWQpd2FpdHBpZChsb3dfcGlkLCBOVUxMLCAwKTtcXG4rXFx0XFx0fVxcbitcXHR9XFxuK1xcdHVubGluayhsb3dfdGltZV9maWxlKTtcXG4rXFx0dW5saW5rKGhpZ2hfdGltZV9maWxlKTtcXG4rXFx0dW5saW5rKGxvd19kYXRhX2ZpbGUpO1xcbitcXHR1bmxpbmsoaGlnaF9kYXRhX2ZpbGUpO1xcbitcXHRyZXR1cm4gcmV0O1xcbit9XFxuK1xcbitzdGF0aWMgaW50XFxuK3NldHVwX2JwZih1NjQgaGlnaF9jZ3JvdXBfaWQsIHU2NCBsb3dfY2dyb3VwX2lkLFxcbitcXHQgIHN0cnVjdCBtZW1jZ19hc3luY19yZWNsYWltICoqc2tlbF9wdHIpXFxuK3tcXG4rXFx0c3RydWN0IG1lbWNnX2FzeW5jX3JlY2xhaW0gKnNrZWw7XFxuK1xcdHN0cnVjdCBicGZfYXJnc19zIGJwZl9hcmdzID0ge1xcbitcXHRcXHQuaGlnaF9jZ3JvdXBfaWQgPSBoaWdoX2Nncm91cF9pZCxcXG4rXFx0XFx0Lmxvd19jZ3JvdXBfaWQgPSBsb3dfY2dyb3VwX2lkLFxcbitcXHRcXHQuZXZlbnRfZGVsdGFfdGhyZXNob2xkID0gRVZFTlRfREVMVEFfVEhSRVNIT0xELFxcbitcXHRcXHQuY2hlY2tfbnMgPSBDSEVDS19QRVJJT0RfTlMsXFxuK1xcdH07XFxuK1xcdExJQkJQRl9PUFRTKGJwZl90ZXN0X3J1bl9vcHRzLCBydW5fb3B0cyxcXG4rXFx0XFx0LmN0eF9pbiA9IFxcdTAwMjZicGZfYXJncyxcXG4rXFx0XFx0LmN0eF9zaXplX2luID0gc2l6ZW9mKGJwZl9hcmdzKSk7XFxuK1xcdGludCBwcm9nX2luaXRfZmQsIGVycjtcXG4rXFxuK1xcdHNrZWwgPSBtZW1jZ19hc3luY19yZWNsYWltX19vcGVuX2FuZF9sb2FkKCk7XFxuK1xcdGlmICghQVNTRVJUX09LX1BUUihza2VsLCBcXFwibWVtY2dfYXN5bmNfcmVjbGFpbV9fb3Blbl9hbmRfbG9hZFxcXCIpKVxcbitcXHRcXHRyZXR1cm4gLTE7XFxuK1xcbitcXHRwcm9nX2luaXRfZmQgPSBicGZfcHJvZ3JhbV9fZmQoc2tlbC1cXHUwMDNlcHJvZ3Mud3FfcHJvZ19pbml0KTtcXG4rXFxuK1xcdGVyciA9IGJwZl9wcm9nX3Rlc3RfcnVuX29wdHMocHJvZ19pbml0X2ZkLCBcXHUwMDI2cnVuX29wdHMpO1xcbitcXHRpZiAoIUFTU0VSVF9PSyhlcnIsIFxcXCJicGZfcHJvZ190ZXN0X3J1bl9vcHRzXFxcIikpXFxuK1xcdFxcdGdvdG8gZXJyb3Jfb3V0O1xcbitcXHRpZiAoIUFTU0VSVF9FUShydW5fb3B0cy5yZXR2YWwsIDAsIFxcXCJwcm9nX2luaXQgcmV0dmFsXFxcIikpXFxuK1xcdFxcdGdvdG8gZXJyb3Jfb3V0O1xcbitcXG4rXFx0KnNrZWxfcHRyID0gc2tlbDtcXG4rXFx0cmV0dXJuIDA7XFxuK1xcbitlcnJvcl9vdXQ6XFxuK1xcdG1lbWNnX2FzeW5jX3JlY2xhaW1fX2Rlc3Ryb3koc2tlbCk7XFxuK1xcdHJldHVybiAtMTtcXG4rfVxcbitcXG4rdm9pZCB0ZXN0X21lbWNnX3dxX2FzeW5jX3JlY2xhaW0odm9pZClcXG4re1xcbitcXHR1NjQgaGlnaF9jZ3JvdXBfaWQsIGxvd19jZ3JvdXBfaWQ7XFxuK1xcdGludCBlcnI7XFxuK1xcdGRvdWJsZSBoaWdoX3RpbWUgPSAwLjAsIGxvd190aW1lID0gMC4wO1xcbitcXHRzdHJ1Y3QgbWVtY2dfYXN5bmNfcmVjbGFpbSAqc2tlbCA9IE5VTEw7XFxuK1xcbitcXHRlcnIgPSBzZXR1cF9oaWdoX2xvd19jZ3JvdXBzKFxcdTAwMjZoaWdoX2Nncm91cF9pZCwgXFx1MDAyNmxvd19jZ3JvdXBfaWQpO1xcbitcXHRpZiAoIUFTU0VSVF9PSyhlcnIsIFxcXCJzZXR1cF9oaWdoX2xvd19jZ3JvdXBzIHJlY2xhaW1cXFwiKSlcXG4rXFx0XFx0cmV0dXJuO1xcbitcXG4rXFx0ZXJyID0gc2V0dXBfYnBmKGhpZ2hfY2dyb3VwX2lkLCBsb3dfY2dyb3VwX2lkLCBcXHUwMDI2c2tlbCk7XFxuK1xcdGlmICghQVNTRVJUX09LKGVyciwgXFxcInNldHVwX2JwZlxcXCIpKVxcbitcXHRcXHRnb3RvIG91dDtcXG4rXFxuK1xcdGVyciA9IHJ1bl9oaWdoX2xvd193b3JrbG9hZChcXHUwMDI2aGlnaF90aW1lLCBcXHUwMDI2bG93X3RpbWUsIFJFQURfVElNRVMpO1xcbitcXHRpZiAoIUFTU0VSVF9PSyhlcnIsIFxcXCJydW5faGlnaF9sb3dfd29ya2xvYWQgcmVjbGFpbVxcXCIpKVxcbitcXHRcXHRnb3RvIG91dDtcXG4rXFxuK1xcdC8qXFxuK1xcdCAqIFRoZSB0aW1pbmcgY29tcGFyaXNvbiBiZWxvdyBhbG9uZSBjYW5ub3QgZGlzdGluZ3Vpc2ggYSB3b3JraW5nXFxuK1xcdCAqIHJlY2xhaW0gZnJvbSBhIG5vLW9wIG9uZSwgc28gcmVxdWlyZSB0aGF0IHRoZSBCUEYgcHJvZ3JhbVxcbitcXHQgKiBhY3R1YWxseSByZWNsYWltZWQgcGFnZXMgZnJvbSB0aGUgbG93IGNncm91cC5cXG4rXFx0ICovXFxuK1xcdGlmICghQVNTRVJUX0dUKHNrZWwtXFx1MDAzZWJzcy1cXHUwMDNlcmVjbGFpbV9jYWxscywgMCwgXFxcInJlY2xhaW1fY2FsbHNcXFwiKSlcXG4rXFx0XFx0Z290byBvdXQ7XFxuK1xcdGlmICghQVNTRVJUX0dUKHNrZWwtXFx1MDAzZWJzcy1cXHUwMDNlcmVjbGFpbWVkX3BhZ2VzLCAwLCBcXFwicmVjbGFpbWVkX3BhZ2VzXFxcIikpXFxuK1xcdFxcdGdvdG8gb3V0O1xcbitcXG4rXFx0aWYgKGhpZ2hfdGltZSBcXHUwMDNlPSBsb3dfdGltZSlcXG4rXFx0XFx0UFJJTlRfRkFJTChcXFwiaGlnaCBjZ3JvdXAgbm90IGltcHJvdmVkIHdpdGggYXN5bmMgcmVjbGFpbTogaGlnaF90aW1lPSVmIGxvd190aW1lPSVmXFxcIixcXG4rXFx0XFx0XFx0ICAgaGlnaF90aW1lLCBsb3dfdGltZSk7XFxuK1xcbitvdXQ6XFxuK1xcdGlmIChza2VsKVxcbitcXHRcXHRtZW1jZ19hc3luY19yZWNsYWltX19kZXN0cm95KHNrZWwpO1xcbitcXHRjbGVhbnVwX2Nncm91cF9lbnZpcm9ubWVudCgpO1xcbit9XFxuZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9wcm9ncy9tZW1jZ19hc3luY19yZWNsYWltLmMgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ3MvbWVtY2dfYXN5bmNfcmVjbGFpbS5jXFxubmV3IGZpbGUgbW9kZSAxMDA2NDRcXG5pbmRleCAwMDAwMDAwMDAwMDAwLi4yMjVmMGJjNjY3MTEzXFxuLS0tIC9kZXYvbnVsbFxcbisrKyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9wcm9ncy9tZW1jZ19hc3luY19yZWNsYWltLmNcXG5AQCAtMCwwICsxLDE4MCBAQFxcbisvLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogR1BMLTIuMFxcbitcXG4rI2luY2x1ZGUgXFxcInZtbGludXguaFxcXCJcXG4rI2luY2x1ZGUgXFxcImJwZl9leHBlcmltZW50YWwuaFxcXCJcXG4rI2luY2x1ZGUgXFx1MDAzY2JwZi9icGZfaGVscGVycy5oXFx1MDAzZVxcbisjaW5jbHVkZSBcXHUwMDNjYnBmL2JwZl90cmFjaW5nLmhcXHUwMDNlXFxuKyNpbmNsdWRlIFxcdTAwM2NicGYvYnBmX2NvcmVfcmVhZC5oXFx1MDAzZVxcbitcXG4rI2RlZmluZSBDTE9DS19NT05PVE9OSUNfSURcXHQxXFxuKyNkZWZpbmUgUEFHRV9TSVpFXFx0XFx0NDA5NlVMXFxuKyNkZWZpbmUgUkVDTEFJTV9TSVpFXFx0XFx0KDMyICogUEFHRV9TSVpFKVxcbisjZGVmaW5lIFJFQ0xBSU1fTUFYX0lURVJcXHQzMlxcbitcXG4rc3RydWN0IGJwZl9hcmdzX3Mge1xcbitcXHR1NjQgaGlnaF9jZ3JvdXBfaWQ7XFxuK1xcdHU2NCBsb3dfY2dyb3VwX2lkO1xcbitcXHR1NjQgZXZlbnRfZGVsdGFfdGhyZXNob2xkO1xcbitcXHR1NjQgY2hlY2tfbnM7XFxuK307XFxuK1xcbitzdHJ1Y3QgY2dyb3VwX21lbWNnIHtcXG4rXFx0c3RydWN0IGNncm91cCAqY2dycDtcXG4rXFx0c3RydWN0IG1lbV9jZ3JvdXAgKm1lbWNnO1xcbit9O1xcbitcXG4rc3RhdGljIHU2NCB3cV9oaWdoX2Nncm91cF9pZDtcXG4rc3RhdGljIHU2NCB3cV9sb3dfY2dyb3VwX2lkO1xcbitcXG4rLyogU3RhdGlzdGljcyBleHBvc2VkIHRvIHVzZXJzcGFjZSB0aHJvdWdoIC5ic3MsIHNvIHRoZSB0ZXN0IGNhbiB2ZXJpZnlcXG4rICogdGhhdCByZWNsYWltIGFjdHVhbGx5IGhhcHBlbmVkIGluc3RlYWQgb2YgcmVseWluZyBvbiB0aW1pbmcgYWxvbmUuXFxuKyAqL1xcbit1NjQgcmVjbGFpbV9jYWxscztcXG4rdTY0IHJlY2xhaW1lZF9wYWdlcztcXG4rXFxuK3N0YXRpYyBpbnQgZ2V0X2Nncm91cF9tZW1jZ19mcm9tX2lkKHU2NCBjZ3JvdXBfaWQsIHN0cnVjdCBjZ3JvdXBfbWVtY2cgKmNtKVxcbit7XFxuK1xcdGNtLVxcdTAwM2VjZ3JwID0gYnBmX2Nncm91cF9mcm9tX2lkKGNncm91cF9pZCk7XFxuK1xcdGlmICghY20tXFx1MDAzZWNncnApXFxuK1xcdFxcdHJldHVybiAtMTtcXG4rXFxuK1xcdGNtLVxcdTAwM2VtZW1jZyA9IGJwZl9nZXRfbWVtX2Nncm91cChcXHUwMDI2Y20tXFx1MDAzZWNncnAtXFx1MDAzZXNlbGYpO1xcbitcXHRpZiAoIWNtLVxcdTAwM2VtZW1jZykge1xcbitcXHRcXHRicGZfY2dyb3VwX3JlbGVhc2UoY20tXFx1MDAzZWNncnApO1xcbitcXHRcXHRyZXR1cm4gLTE7XFxuK1xcdH1cXG4rXFxuK1xcdHJldHVybiAwO1xcbit9XFxuK1xcbitzdGF0aWMgdm9pZCBwdXRfY2dyb3VwX21lbWNnKHN0cnVjdCBjZ3JvdXBfbWVtY2cgKmNtKVxcbit7XFxuK1xcdGJwZl9wdXRfbWVtX2Nncm91cChjbS1cXHUwMDNlbWVtY2cpO1xcbitcXHRicGZfY2dyb3VwX3JlbGVhc2UoY20tXFx1MDAzZWNncnApO1xcbit9XFxuK1xcbitzdGF0aWMgaW50IGdldF9jZ3JvdXBfZXZlbnQodTY0IGNncm91cF9pZCwgdTY0ICp2YWwpXFxuK3tcXG4rXFx0c3RydWN0IGNncm91cF9tZW1jZyBjbTtcXG4rXFxuK1xcdGlmIChnZXRfY2dyb3VwX21lbWNnX2Zyb21faWQoY2dyb3VwX2lkLCBcXHUwMDI2Y20pKVxcbitcXHRcXHRyZXR1cm4gLTE7XFxuK1xcdGJwZl9tZW1fY2dyb3VwX2ZsdXNoX3N0YXRzKGNtLm1lbWNnKTtcXG4rXFx0KnZhbCA9IGJwZl9tZW1fY2dyb3VwX3BhZ2Vfc3RhdGUoY20ubWVtY2csXFxuK1xcdFxcdGJwZl9jb3JlX2VudW1fdmFsdWUoZW51bSBub2RlX3N0YXRfaXRlbSxcXG4rXFx0XFx0XFx0XFx0ICAgIFdPUktJTkdTRVRfUkVGQVVMVF9GSUxFKSk7XFxuK1xcdHB1dF9jZ3JvdXBfbWVtY2coXFx1MDAyNmNtKTtcXG4rXFxuK1xcdHJldHVybiAwO1xcbit9XFxuK1xcbitzdGF0aWMgYm9vbFxcbitzaG91bGRfcmVjbGFpbV9jZ3JvdXAodTY0IGNncm91cF9pZCwgdTY0ICpwcmV2X2V2ZW50LCB1NjQgZXZlbnRfZGVsdGFfdGhyZXNob2xkKVxcbit7XFxuK1xcdHU2NCBjdXIsIGRlbHRhO1xcbitcXG4rXFx0aWYgKGdldF9jZ3JvdXBfZXZlbnQoY2dyb3VwX2lkLCBcXHUwMDI2Y3VyKSlcXG4rXFx0XFx0cmV0dXJuIGZhbHNlO1xcbitcXG4rXFx0ZGVsdGEgPSBjdXIgLSAqcHJldl9ldmVudDtcXG4rXFx0KnByZXZfZXZlbnQgPSBjdXI7XFxuK1xcbitcXHRyZXR1cm4gZGVsdGEgXFx1MDAzZT0gZXZlbnRfZGVsdGFfdGhyZXNob2xkO1xcbit9XFxuK1xcbitzdGF0aWMgaW50IHJlY2xhaW1fY2dyb3VwKHU2NCBjZ3JvdXBfaWQpXFxuK3tcXG4rXFx0c3RydWN0IGNncm91cF9tZW1jZyBjbTtcXG4rXFx0aW50IGk7XFxuK1xcbitcXHRpZiAoZ2V0X2Nncm91cF9tZW1jZ19mcm9tX2lkKGNncm91cF9pZCwgXFx1MDAyNmNtKSlcXG4rXFx0XFx0cmV0dXJuIDA7XFxuK1xcbitcXHRyZWNsYWltX2NhbGxzKys7XFxuK1xcdGZvciAoaSA9IDA7IGkgXFx1MDAzYyBSRUNMQUlNX01BWF9JVEVSOyBpKyspIHtcXG4rXFx0XFx0dTY0IG5yID0gYnBmX3Byb2FjdGl2ZV9yZWNsYWltKGNtLm1lbWNnLCBSRUNMQUlNX1NJWkUpO1xcbitcXG4rXFx0XFx0aWYgKCFucilcXG4rXFx0XFx0XFx0YnJlYWs7XFxuK1xcdFxcdHJlY2xhaW1lZF9wYWdlcyArPSBucjtcXG4rXFx0fVxcbitcXG4rXFx0cHV0X2Nncm91cF9tZW1jZyhcXHUwMDI2Y20pO1xcbitcXG4rXFx0cmV0dXJuIDA7XFxuK31cXG4rXFxuK3N0cnVjdCB3cV9lbGVtIHtcXG4rXFx0c3RydWN0IGJwZl90aW1lciB0aW1lcjtcXG4rXFx0c3RydWN0IGJwZl93cSB3b3JrO1xcbitcXHR1NjQgcHJldl9ldmVudDtcXG4rXFx0dTY0IGV2ZW50X2RlbHRhX3RocmVzaG9sZDtcXG4rXFx0dTY0IGNoZWNrX25zO1xcbit9O1xcbitcXG4rc3RydWN0IHtcXG4rXFx0X191aW50KHR5cGUsIEJQRl9NQVBfVFlQRV9BUlJBWSk7XFxuK1xcdF9fdWludChtYXhfZW50cmllcywgMSk7XFxuK1xcdF9fdHlwZShrZXksIF9fdTMyKTtcXG4rXFx0X190eXBlKHZhbHVlLCBzdHJ1Y3Qgd3FfZWxlbSk7XFxuK30gd3FfbWFwIFNFQyhcXFwiLm1hcHNcXFwiKTtcXG4rXFxuK3N0YXRpYyBpbnQgYXN5bmNfZnJlZSh2b2lkICptYXAsIGludCAqa2V5LCB2b2lkICp2YWx1ZSlcXG4re1xcbitcXHRzdHJ1Y3Qgd3FfZWxlbSAqZWxlbSA9IHZhbHVlO1xcbitcXG4rXFx0aWYgKHNob3VsZF9yZWNsYWltX2Nncm91cCh3cV9oaWdoX2Nncm91cF9pZCwgXFx1MDAyNmVsZW0tXFx1MDAzZXByZXZfZXZlbnQsXFxuK1xcdFxcdGVsZW0tXFx1MDAzZWV2ZW50X2RlbHRhX3RocmVzaG9sZCkpIHtcXG4rXFx0XFx0cmVjbGFpbV9jZ3JvdXAod3FfbG93X2Nncm91cF9pZCk7XFxuK1xcdFxcdGJwZl93cV9zdGFydChcXHUwMDI2ZWxlbS1cXHUwMDNld29yaywgMCk7XFxuK1xcdH1cXG4rXFxuK1xcdHJldHVybiAwO1xcbit9XFxuK1xcbitzdGF0aWMgaW50IHdxX3RpbWVyX2NiKHZvaWQgKm1hcCwgaW50ICprZXksIHN0cnVjdCB3cV9lbGVtICplbGVtKVxcbit7XFxuK1xcdGJwZl93cV9zdGFydChcXHUwMDI2ZWxlbS1cXHUwMDNld29yaywgMCk7XFxuK1xcdGJwZl90aW1lcl9zdGFydChcXHUwMDI2ZWxlbS1cXHUwMDNldGltZXIsIGVsZW0tXFx1MDAzZWNoZWNrX25zLCAwKTtcXG4rXFxuK1xcdHJldHVybiAwO1xcbit9XFxuK1xcbitTRUMoXFxcInN5c2NhbGxcXFwiKVxcbitpbnQgd3FfcHJvZ19pbml0KHN0cnVjdCBicGZfYXJnc19zICpjdHgpXFxuK3tcXG4rXFx0c3RydWN0IHdxX2VsZW0gKmVsZW07XFxuK1xcdF9fdTMyIGtleSA9IDA7XFxuK1xcdGludCByZXQ7XFxuK1xcbitcXHRlbGVtID0gYnBmX21hcF9sb29rdXBfZWxlbShcXHUwMDI2d3FfbWFwLCBcXHUwMDI2a2V5KTtcXG4rXFx0aWYgKCFlbGVtKVxcbitcXHRcXHRyZXR1cm4gLTE7XFxuK1xcbitcXHRyZXQgPSBicGZfd3FfaW5pdChcXHUwMDI2ZWxlbS1cXHUwMDNld29yaywgXFx1MDAyNndxX21hcCwgMCk7XFxuK1xcdGlmIChyZXQpXFxuK1xcdFxcdHJldHVybiByZXQ7XFxuK1xcbitcXHRyZXQgPSBicGZfd3Ffc2V0X2NhbGxiYWNrKFxcdTAwMjZlbGVtLVxcdTAwM2V3b3JrLCBhc3luY19mcmVlLCAwKTtcXG4rXFx0aWYgKHJldClcXG4rXFx0XFx0cmV0dXJuIHJldDtcXG4rXFxuK1xcdHJldCA9IGJwZl90aW1lcl9pbml0KFxcdTAwMjZlbGVtLVxcdTAwM2V0aW1lciwgXFx1MDAyNndxX21hcCwgQ0xPQ0tfTU9OT1RPTklDX0lEKTtcXG4rXFx0aWYgKHJldClcXG4rXFx0XFx0cmV0dXJuIHJldDtcXG4rXFxuK1xcdHJldCA9IGJwZl90aW1lcl9zZXRfY2FsbGJhY2soXFx1MDAyNmVsZW0tXFx1MDAzZXRpbWVyLCB3cV90aW1lcl9jYik7XFxuK1xcdGlmIChyZXQpXFxuK1xcdFxcdHJldHVybiByZXQ7XFxuK1xcbitcXHRlbGVtLVxcdTAwM2VwcmV2X2V2ZW50ID0gMDtcXG4rXFx0ZWxlbS1cXHUwMDNlZXZlbnRfZGVsdGFfdGhyZXNob2xkID0gY3R4LVxcdTAwM2VldmVudF9kZWx0YV90aHJlc2hvbGQ7XFxuK1xcdGVsZW0tXFx1MDAzZWNoZWNrX25zID0gY3R4LVxcdTAwM2VjaGVja19ucztcXG4rXFxuK1xcdHdxX2hpZ2hfY2dyb3VwX2lkID0gY3R4LVxcdTAwM2VoaWdoX2Nncm91cF9pZDtcXG4rXFx0d3FfbG93X2Nncm91cF9pZCA9IGN0eC1cXHUwMDNlbG93X2Nncm91cF9pZDtcXG4rXFxuK1xcdHJldHVybiBicGZfdGltZXJfc3RhcnQoXFx1MDAyNmVsZW0tXFx1MDAzZXRpbWVyLCBlbGVtLVxcdTAwM2VjaGVja19ucywgMCk7XFxuK31cXG4rXFxuK2NoYXIgTElDRU5TRVtdIFNFQyhcXFwibGljZW5zZVxcXCIpID0gXFxcIkdQTFxcXCI7XFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTE5VDA3OjQ0OjIxLjY4MDg1NTQxOFoiLCJTZXEiOjIsIk5lc3RpbmciOjEsIlR5cGUiOiJhZ2VudCIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImJlc3QtZXhwZW5zaXZlIiwiRHVyYXRpb24iOjI0OTIxODM0NTQ4LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6IntcbiAgXCJFbmFibGVDb25maWdzXCI6IFtcbiAgICBcIk1FTUNHXCIsXG4gICAgXCJCUEZfU1lTQ0FMTFwiXG4gIF0sXG4gIFwiRm9jdXNTeW1ib2xzXCI6IFtcbiAgICBcImJwZl9wcm9hY3RpdmVfcmVjbGFpbVwiLFxuICAgIFwiYnBmX3Byb2FjdGl2ZV9yZWNsYWltX3N3YXBwaW5lc3NcIlxuICBdLFxuICBcIlJlYXNvbmluZ1wiOiBcIlRoZSBwYXRjaCBpbnRyb2R1Y2VzIHR3byBuZXcgQlBGIGtmdW5jcywgYGJwZl9wcm9hY3RpdmVfcmVjbGFpbWAgYW5kIGBicGZfcHJvYWN0aXZlX3JlY2xhaW1fc3dhcHBpbmVzc2AsIHdoaWNoIGFsbG93IEJQRiBwcm9ncmFtcyB0byBwcm9hY3RpdmVseSB0cmlnZ2VyIG1lbW9yeSByZWNsYWltIG9uIGEgbWVtb3J5IGNncm91cC4gVGhpcyBleHBvc2VzIGNvcmUgbWVtb3J5IG1hbmFnZW1lbnQgYW5kIHJlY2xhaW0gbG9naWMgdG8gQlBGLCBtYWtpbmcgaXQgYSBmdW5jdGlvbmFsIGNoYW5nZSB0aGF0IGlzIGhpZ2hseSByZWFjaGFibGUgYW5kIHdvcnRoIGZ1enppbmcuXCIsXG4gIFwiV29ydGhGdXp6aW5nXCI6IHRydWVcbn0iLCJJbnN0cnVjdGlvbiI6IllvdSBhcmUgYW4gZXhwZXJ0IExpbnV4IGtlcm5lbCBtYWludGFpbmVyLlxuWW91ciBqb2IgaXMgdG8gcmV2aWV3IGEgcHJvdmlkZWQgcGF0Y2ggc2VyaWVzIGFuZCBkZXRlcm1pbmVcbmlmIGl0IG1ha2VzIGZ1bmN0aW9uYWwgY2hhbmdlcyB0byB0aGUga2VybmVsIHRoYXQgc2hvdWxkIGJlIGZ1enplZC5cblxuSU1QT1JUQU5UOiBUaGUgY2hhbmdlcyBoYXZlIEFMUkVBRFkgYmVlbiBhcHBsaWVkIGFuZCBjb21taXR0ZWQgYXMgdGhlIEhFQUQgY29tbWl0IGluXG55b3VyIHdvcmtzcGFjZS4gRG8gTk9UIHJlbHkgb24geW91ciBpbnRlcm5hbCBrbm93bGVkZ2Ugb2YgdGhlIGtlcm5lbC4gWW91IG11c3QgYWN0aXZlbHlcbnVzZSB5b3VyIGNvZGUgYWNjZXNzIHRvb2xzIHRvIGV4YW1pbmUgdGhlIGFjdHVhbCBzb3VyY2UgY29kZSBhbmQgY29uZmlybSBhbnkgYXNzdW1wdGlvbnMuXG5cblJldHVybiBXb3J0aEZ1enppbmc9ZmFsc2UgaWYgdGhlIHBhdGNoIG9ubHkgY29udGFpbnM6XG4tIE1vZGlmaWNhdGlvbnMgdG8gRG9jdW1lbnRhdGlvbi8sIEtjb25maWcgZmlsZXMsIG9yIGNvZGUgY29tbWVudHMuXG4tIFB1cmVseSBkZWNvcmF0aXZlIGNoYW5nZXMsIHN1Y2ggYXMgbG9nZ2luZyAoZS5nLiwgcHJfZXJyLCBwcmludGspIG9yIHRyYWNlcG9pbnRzLlxuLSBDaGFuZ2VzIHRvIG51bWVyaWMgY29uc3RhbnRzIG9yIG1hY3JvcyB0aGF0IGRvIG5vdCBmdW5jdGlvbmFsbHkgYWx0ZXIgZXhlY3V0aW9uIGZsb3cuXG4tIENvZGUgcGF0aHMgdGhhdCBhcmUgaW1wb3NzaWJsZSB0byByZWFjaCBpbiB2aXJ0dWFsaXplZCBlbnZpcm9ubWVudHMgbGlrZSBHQ0Ugb3IgUUVNVSxcbiAgZXZlbiB3aGVuIHV0aWxpemluZyBzb2Z0d2FyZS1lbXVsYXRlZCBoYXJkd2FyZSAoZS5nLiwgdXNiIGdhZGdldCwgbWFjODAyMTFfaHdzaW0pLlxuLSBDb2RlIGluIHZlbmRvci1zcGVjaWZpYyBQQ0llIHN3aXRjaCwgU21hcnROSUMsIG9yIEdQVSBkcml2ZXJzIChlLmcuLCBtbHhzdywgcGRzX2NvcmUsIHFlZCxcbiAgaW9uaWMsIGFtZGdwdSkgdGhhdCByZXF1aXJlIHBoeXNpY2FsIFBDSWUgaGFyZHdhcmUgY2FyZHMgbm90IGVtdWxhdGVkIGluIHN0YW5kYXJkIFFFTVUuXG4tIERyaXZlciAucmVtb3ZlLCAuc2h1dGRvd24sIG9yIHBjaV91bnJlZ2lzdGVyX2RyaXZlciB0ZWFyZG93biBjYWxsYmFja3MgKGUuZy4sIGlnYl9yZW1vdmUpXG4gIHRoYXQgYXJlIGV4ZWN1dGVkIG9ubHkgZHVyaW5nIFBDSSBob3QtdW5wbHVnIG9yIHN5c2ZzIGRyaXZlciB1bmJpbmQgb3BlcmF0aW9ucy5cblxuSWYgaXQgbW9kaWZpZXMgcmVhY2hhYmxlIGNvcmUga2VybmVsIGxvZ2ljLCBkcml2ZXJzLCBvciBhcmNoaXRlY3R1cmVzLCB1c2UgeW91ciBjb2RlIHNlYXJjaFxudG9vbHMgdG8gdmVyaWZ5IHRoZSBjb2RlIGNhbiBiZSBleGVjdXRlZCwgdGhlbiByZXR1cm4gV29ydGhGdXp6aW5nPXRydWUuXG5cbldoZW4gcmV0dXJuaW5nIFdvcnRoRnV6emluZz10cnVlLCB5b3UgTVVTVCBBTFNPOlxuMS4gRXh0cmFjdCBhbnkgc3BlY2lmaWMga2VybmVsIGZ1bmN0aW9ucyB0aGF0IHNob3VsZCBiZSBoZWF2aWx5IGZ1enplZCBpbnRvIEZvY3VzU3ltYm9scy5cbiAgIEF2b2lkIGxpc3RpbmcgZ2VuZXJpYyBob3QtcGF0aCBmdW5jdGlvbnMgdG8gcHJldmVudCBza2V3ZWQgdGVzdCBkaXN0cmlidXRpb25zLlxuICAgUHJlZmVyIG5vbi1zdGF0aWMsIG5vbi1pbmxpbmVkIEFQSSBlbnRyeXBvaW50IGZ1bmN0aW9ucyBvdmVyIGludGVybmFsIHN0YXRpYyBoZWxwZXIgZnVuY3Rpb25zXG4gICAod2hpY2ggYXJlIGlubGluZWQgYnkgdGhlIGNvbXBpbGVyIGFuZCBkbyBub3QgaGF2ZSBkaXN0aW5jdCBzeW1ib2wgYWRkcmVzc2VzKS5cbjIuIElkZW50aWZ5IGFueSBzcGVjaWZpYyBDT05GSUdfIG9wdGlvbnMgcmVxdWlyZWQgdG8gcHJvcGVybHkgdGVzdCB0aGlzIG5ldy9tb2RpZmllZCBmZWF0dXJlLlxuICAgR28gYW5kIGxvb2sgaW50byB0aGUgS2NvbmZpZyBmaWxlcyBhbmQgY2hlY2sgZm9yIGlmZGVmcyBhcm91bmQgdGhlIGNvZGUsIGRvIG5vdCBtYWtlIGFzc3VtcHRpb25zLlxuICAgQWxzbyBjaGVjayBcImRlcGVuZHMgb25cIiBsaW5lcyBpbiBLY29uZmlnIHRvIGluY2x1ZGUgYW55IG5vbi1zdGFuZGFyZCBwYXJlbnQgc3Vic3lzdGVtIGNvbmZpZ3NcbiAgIG5lZWRlZCBmb3IgS2J1aWxkIHRvIGNvbXBpbGUgdGhlIGNvZGUgc3RhdGljYWxseSBpbnRvIHZtbGludXguIExpc3QgdGhlbSBpbiB0aGUgRW5hYmxlQ29uZmlnc1xuICAgb3V0cHV0IGFycmF5LCBhbmQgRE8gTk9UIGFkZCBhICdDT05GSUdfJyBwcmVmaXggKGUuZy4sIHJldHVybiBcIk5FVF9JUFY0XCIgaW5zdGVhZCBvZiBcIkNPTkZJR19ORVRfSVBWNFwiKS5cblByZWZlciBjYWxsaW5nIHNldmVyYWwgdG9vbHMgYXQgdGhlIHNhbWUgdGltZSB0byBzYXZlIHJvdW5kLXRyaXBzLlxuXG5cblVzZSBzZXQtcmVzdWx0cyB0b29sIHRvIHByb3ZpZGUgcmVzdWx0cyBvZiB0aGUgYW5hbHlzaXMuXG5JdCBtdXN0IGJlIGNhbGxlZCBleGFjdGx5IG9uY2UgYmVmb3JlIHRoZSBmaW5hbCByZXBseS5cbklnbm9yZSByZXN1bHRzIG9mIHRoaXMgdG9vbC5cbiIsIlByb21wdCI6IkZvciB5b3VyIGNvbnZlbmllbmNlLCBoZXJlIGlzIHRoZSBkaWZmIG9mIHRoZSBjaGFuZ2VzOlxuY29tbWl0IDliZTUzMjUxNDVhMDcwMDYzZDM5MDk1ODMyMzhiNDk3YTk2ZGQ3N2ZcbkF1dGhvcjogc3l6LWNsdXN0ZXIgXHUwMDNjdHJpYWdlQHN5emthbGxlci5jb21cdTAwM2VcbkRhdGU6ICAgV2VkIEF1ZyAxOSAwNzo0NDoxOCAyMDI2ICswMDAwXG5cbiAgICBzeXotY2x1c3RlcjogYXBwbGllZCBwYXRjaCB1bmRlciByZXZpZXdcblxuZGlmZiAtLWdpdCBhL21tL2JwZl9tZW1jb250cm9sLmMgYi9tbS9icGZfbWVtY29udHJvbC5jXG5pbmRleCA3MTZkZjQ5ZDc2NDc3Li5iMGEwZDRjNTVkYzRlIDEwMDY0NFxuLS0tIGEvbW0vYnBmX21lbWNvbnRyb2wuY1xuKysrIGIvbW0vYnBmX21lbWNvbnRyb2wuY1xuQEAgLTYsNiArNiw3IEBAXG4gICovXG4gXG4gI2luY2x1ZGUgXHUwMDNjbGludXgvbWVtY29udHJvbC5oXHUwMDNlXG4rI2luY2x1ZGUgXHUwMDNjbGludXgvc3dhcC5oXHUwMDNlXG4gI2luY2x1ZGUgXHUwMDNjbGludXgvYnBmLmhcdTAwM2VcbiBcbiBfX2JwZl9rZnVuY19zdGFydF9kZWZzKCk7XG5AQCAtMTU5LDYgKzE2MCwxMDMgQEAgX19icGZfa2Z1bmMgdm9pZCBicGZfbWVtX2Nncm91cF9mbHVzaF9zdGF0cyhzdHJ1Y3QgbWVtX2Nncm91cCAqbWVtY2cpXG4gXHRtZW1fY2dyb3VwX2ZsdXNoX3N0YXRzKG1lbWNnKTtcbiB9XG4gXG4rLypcbisgKiBSZWNsYWltIG11c3Qgbm90IHJlY3Vyc2UuIHRyeV90b19mcmVlX21lbV9jZ3JvdXBfcGFnZXMoKSB1bmNvbmRpdGlvbmFsbHlcbisgKiBvdmVyd3JpdGVzIGN1cnJlbnQtXHUwMDNlcmVjbGFpbV9zdGF0ZSBvbiBlbnRyeSBhbmQgcmVzZXRzIGl0IHRvIE5VTEwgb24gZXhpdC5cbisgKiBTbyBpbnZva2luZyBpdCBmcm9tIGFuIGluLWZsaWdodCByZWNsYWltIHdvdWxkIGNsb2JiZXIgdGhlIG91dGVyIHJlY2xhaW1cbisgKiBzdGF0ZSBhbmQgY29ycnVwdCBpdHMgYWNjb3VudGluZy5cbisgKlxuKyAqIFRoZSBndWFyZCBpcyBQRl9NRU1BTExPQy4gRXZlcnkgcmVjbGFpbSBlbnRyeSBwb2ludCBtYXJrcyB0aGUgY3VycmVudFxuKyAqIHRhc2sgd2l0aCBpdCBmb3IgdGhlIHdob2xlIHJlY2xhaW0gd2luZG93OiB0cnlfdG9fZnJlZV9tZW1fY2dyb3VwX3BhZ2VzKClcbisgKiBhbmQgX19wZXJmb3JtX3JlY2xhaW0oKSBkbyBzbyB2aWEgbWVtYWxsb2Nfbm9yZWNsYWltX3NhdmUoKSwgYW5kIGtzd2FwZFxuKyAqIGtlZXBzIGl0IHNldCBmb3IgaXRzIGVudGlyZSBsaWZldGltZS4gQSBob29rIGluc2lkZSB0aGUgcmVjbGFpbSBwYXRoXG4rICogKHNocmlua19ub2RlLCBzaHJpbmtfc2xhYiwgLi4uKSBleGVjdXRlcyBpbiB0aGUgY29udGV4dCBvZiB0aGVcbisgKiByZWNsYWltaW5nIHRhc2ssIHdoZXJlIGN1cnJlbnQtXHUwMDNlZmxhZ3MgYWxyZWFkeSBjYXJyaWVzIHRoZSBmbGFnLiBUaGUgcGFnZVxuKyAqIGFsbG9jYXRvciwgdGhlIG1lbWNnIGNoYXJnaW5nIHBhdGggYW5kIG5vZGVfcmVjbGFpbSgpIHJlbHkgb24gdGhlIHNhbWVcbisgKiBmbGFnIHRvIGF2b2lkIHJlY2xhaW0gcmVjdXJzaW9uLlxuKyAqXG4rICogSW4gdHJ5X3RvX2ZyZWVfbWVtX2Nncm91cF9wYWdlcygpLCByZWNsYWltX3N0YXRlIGlzIHNldCBzbGlnaHRseSBiZWZvcmVcbisgKiBQRl9NRU1BTExPQywgd2l0aCBvbmx5IGEgdHJhY2Vwb2ludCBpbiBiZXR3ZWVuLCB3aGljaCBhIHNsZWVwYWJsZSBCUEZcbisgKiBwcm9ncmFtIGNhbm5vdCBhdHRhY2ggdG8uXG4rICogQWxzbywgUEZfTUVNQUxMT0MgaXMgc2V0IGluIHNvbWUgbm9uLXJlY2xhaW0gY29udGV4dHMgKGUuZy4gZGlyZWN0IGNvbXBhY3Rpb25cbisgKiBhbmQgdm1hbGxvYyksIHdoZXJlIHRoZSBrZnVuYyBjb25zZXJ2YXRpdmVseSByZWZ1c2VzIHRvIHJlY2xhaW0gYXMgd2VsbC5cbisgKi9cbitzdGF0aWMgYm9vbCBicGZfaW5fcmVjbGFpbV9jb250ZXh0KHZvaWQpXG4re1xuK1x0cmV0dXJuIGN1cnJlbnQtXHUwMDNlZmxhZ3MgXHUwMDI2IFBGX01FTUFMTE9DO1xuK31cbitcbisvKlxuKyAqIFNoYXJlZCBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgcHJvYWN0aXZlIHJlY2xhaW0ga2Z1bmNzOiBwZXJmb3JtcyBvbmVcbisgKiByZWNsYWltIHBhc3Mgb24gQG1lbWNnIHdpdGggQG5yX3BhZ2VzIGFzIHRoZSBnb2FsLCBhbGxvd2luZyBzd2FwLCBhbmRcbisgKiBAc3dhcHBpbmVzcyBhcyB0aGUgYW5vbi9maWxlIGJhbGFuY2Ugb3ZlcnJpZGUgKE5VTEwgdG8gZm9sbG93IHRoZVxuKyAqIGNncm91cCdzIG93biBzd2FwcGluZXNzIHNldHRpbmcpLlxuKyAqL1xuK3N0YXRpYyB1bnNpZ25lZCBsb25nXG4rYnBmX3Byb2FjdGl2ZV9yZWNsYWltX3BhZ2VzKHN0cnVjdCBtZW1fY2dyb3VwICptZW1jZywgdW5zaWduZWQgbG9uZyBucl9wYWdlcyxcbitcdFx0XHQgICAgaW50ICpzd2FwcGluZXNzKVxuK3tcbitcdGlmICghbnJfcGFnZXMgfHwgdW5saWtlbHkoYnBmX2luX3JlY2xhaW1fY29udGV4dCgpKSlcbitcdFx0cmV0dXJuIDA7XG4rXG4rXHRyZXR1cm4gdHJ5X3RvX2ZyZWVfbWVtX2Nncm91cF9wYWdlcyhtZW1jZywgbnJfcGFnZXMsIEdGUF9LRVJORUwsXG4rXHRcdFx0XHRcdCAgICBNRU1DR19SRUNMQUlNX01BWV9TV0FQIHxcbitcdFx0XHRcdFx0ICAgIE1FTUNHX1JFQ0xBSU1fUFJPQUNUSVZFLFxuK1x0XHRcdFx0XHQgICAgc3dhcHBpbmVzcyk7XG4rfVxuK1xuKy8qKlxuKyAqIGJwZl9wcm9hY3RpdmVfcmVjbGFpbSAtIHByb2FjdGl2ZWx5IHJlY2xhaW0gbWVtb3J5IGZyb20gYSBtZW1vcnlcbisgKiAgICAgICAgICAgICAgICAgICAgICAgICBjZ3JvdXBcbisgKiBAbWVtY2c6IHRoZSB0YXJnZXQgbWVtb3J5IGNncm91cCB0byByZWNsYWltIGZyb21cbisgKiBAc2l6ZTogIHRoZSBhbW91bnQgb2YgbWVtb3J5IHRvIHJlY2xhaW0sIGluIGJ5dGVzXG4rICpcbisgKiBUcmlnZ2VyIG9uZSBwcm9hY3RpdmUgcmVjbGFpbSBwYXNzIG9uIEBtZW1jZywgc2ltaWxhciB0byBhIHdyaXRlIHRvXG4rICogdGhlIG1lbW9yeS5yZWNsYWltIGNncm91cCBmaWxlOiBwYWdlcyBhcmUgcmVjbGFpbWVkIGFjY29yZGluZyB0byB0aGVcbisgKiBjZ3JvdXAncyBvd24gc3dhcHBpbmVzcyBzZXR0aW5nIGFuZCBzd2FwIGlzIGFsbG93ZWQuIE5vdGUgdGhhdCxcbisgKiB1bmxpa2UgbWVtb3J5LnJlY2xhaW0sIHRoaXMgZG9lcyBub3QgcmV0cnkgdW50aWwgQHNpemUgaXMgcmVhY2hlZDtcbisgKiBjYWxsZXJzIGNhbiBpbnZva2UgaXQgYWdhaW4gaWYgbmVlZGVkLlxuKyAqXG4rICogUmV0dXJuOlxuKyAqICAgVGhlIG51bWJlciBvZiBwYWdlcyBhY3R1YWxseSByZWNsYWltZWQsIG9yIDAgaWYgQHNpemUgaXMgc21hbGxlclxuKyAqICAgdGhhbiBhIHBhZ2Ugb3IgdGhlIGNhbGxpbmcgdGFzayBpcyBhbHJlYWR5IGluIGEgcmVjbGFpbS9mcmVlaW5nXG4rICogICBjb250ZXh0IChQRl9NRU1BTExPQykuXG4rICovXG4rX19icGZfa2Z1bmMgdW5zaWduZWQgbG9uZyBicGZfcHJvYWN0aXZlX3JlY2xhaW0oc3RydWN0IG1lbV9jZ3JvdXAgKm1lbWNnLFxuK1x0XHRcdFx0XHRcdHVuc2lnbmVkIGxvbmcgc2l6ZSlcbit7XG4rXHRyZXR1cm4gYnBmX3Byb2FjdGl2ZV9yZWNsYWltX3BhZ2VzKG1lbWNnLCBzaXplIC8gUEFHRV9TSVpFLCBOVUxMKTtcbit9XG4rXG4rLyoqXG4rICogYnBmX3Byb2FjdGl2ZV9yZWNsYWltX3N3YXBwaW5lc3MgLSBwcm9hY3RpdmVseSByZWNsYWltIG1lbW9yeSBmcm9tIGFcbisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lbW9yeSBjZ3JvdXAgd2l0aCBhbiBleHBsaWNpdFxuKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3dhcHBpbmVzc1xuKyAqIEBtZW1jZzogICAgICB0aGUgdGFyZ2V0IG1lbW9yeSBjZ3JvdXAgdG8gcmVjbGFpbSBmcm9tXG4rICogQHNpemU6ICAgICAgIHRoZSBhbW91bnQgb2YgbWVtb3J5IHRvIHJlY2xhaW0sIGluIGJ5dGVzXG4rICogQHN3YXBwaW5lc3M6IHN3YXBwaW5lc3Mgb3ZlcnJpZGUgZm9yIHRoaXMgcmVjbGFpbSBwYXNzXG4rICpcbisgKiBTYW1lIGFzIGJwZl9wcm9hY3RpdmVfcmVjbGFpbSgpLCBleGNlcHQgdGhhdCB0aGUgYW5vbi9maWxlIHJlY2xhaW1cbisgKiBiYWxhbmNlIGlzIGNvbnRyb2xsZWQgYnkgQHN3YXBwaW5lc3MgaW5zdGVhZCBvZiB0aGUgY2dyb3VwJ3NcbisgKiBzd2FwcGluZXNzIHNldHRpbmcuIFZhbGlkIHZhbHVlcyBhcmUgW01JTl9TV0FQUElORVNTLCBNQVhfU1dBUFBJTkVTU11cbisgKiBhbmQgU1dBUFBJTkVTU19BTk9OX09OTFksIHdoaWNoIHJlc3RyaWN0cyByZWNsYWltIHRvIGFub24gZm9saW9zLlxuKyAqXG4rICogUmV0dXJuOlxuKyAqICAgVGhlIG51bWJlciBvZiBwYWdlcyBhY3R1YWxseSByZWNsYWltZWQsIG9yIDAgaWYgQHNpemUgaXMgc21hbGxlclxuKyAqICAgdGhhbiBhIHBhZ2UsIEBzd2FwcGluZXNzIGlzIG91dCBvZiByYW5nZSwgb3IgdGhlIGNhbGxpbmcgdGFzayBpc1xuKyAqICAgYWxyZWFkeSBpbiBhIHJlY2xhaW0vZnJlZWluZyBjb250ZXh0IChQRl9NRU1BTExPQykuXG4rICovXG4rX19icGZfa2Z1bmMgdW5zaWduZWQgbG9uZ1xuK2JwZl9wcm9hY3RpdmVfcmVjbGFpbV9zd2FwcGluZXNzKHN0cnVjdCBtZW1fY2dyb3VwICptZW1jZywgdW5zaWduZWQgbG9uZyBzaXplLFxuK1x0XHRcdFx0IGludCBzd2FwcGluZXNzKVxuK3tcbitcdGlmIChzd2FwcGluZXNzIFx1MDAzYyBNSU5fU1dBUFBJTkVTUyB8fCBzd2FwcGluZXNzIFx1MDAzZSBTV0FQUElORVNTX0FOT05fT05MWSlcbitcdFx0cmV0dXJuIDA7XG4rXG4rXHRyZXR1cm4gYnBmX3Byb2FjdGl2ZV9yZWNsYWltX3BhZ2VzKG1lbWNnLCBzaXplIC8gUEFHRV9TSVpFLFxuK1x0XHRcdFx0XHQgICBcdTAwMjZzd2FwcGluZXNzKTtcbit9XG4rXG4gX19icGZfa2Z1bmNfZW5kX2RlZnMoKTtcbiBcbiBCVEZfS0ZVTkNTX1NUQVJUKGJwZl9tZW1jb250cm9sX2tmdW5jcylcbkBAIC0xNzIsNiArMjcwLDkgQEAgQlRGX0lEX0ZMQUdTKGZ1bmMsIGJwZl9tZW1fY2dyb3VwX3VzYWdlKVxuIEJURl9JRF9GTEFHUyhmdW5jLCBicGZfbWVtX2Nncm91cF9wYWdlX3N0YXRlKVxuIEJURl9JRF9GTEFHUyhmdW5jLCBicGZfbWVtX2Nncm91cF9mbHVzaF9zdGF0cywgS0ZfU0xFRVBBQkxFKVxuIFxuK0JURl9JRF9GTEFHUyhmdW5jLCBicGZfcHJvYWN0aXZlX3JlY2xhaW0sIEtGX1NMRUVQQUJMRSlcbitCVEZfSURfRkxBR1MoZnVuYywgYnBmX3Byb2FjdGl2ZV9yZWNsYWltX3N3YXBwaW5lc3MsIEtGX1NMRUVQQUJMRSlcbitcbiBCVEZfS0ZVTkNTX0VORChicGZfbWVtY29udHJvbF9rZnVuY3MpXG4gXG4gc3RhdGljIGNvbnN0IHN0cnVjdCBidGZfa2Z1bmNfaWRfc2V0IGJwZl9tZW1jb250cm9sX2tmdW5jX3NldCA9IHtcbmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ190ZXN0cy9tZW1jZ19hc3luY19yZWNsYWltLmMgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ190ZXN0cy9tZW1jZ19hc3luY19yZWNsYWltLmNcbm5ldyBmaWxlIG1vZGUgMTAwNjQ0XG5pbmRleCAwMDAwMDAwMDAwMDAwLi5lOTkwZDFmZGM3OWZkXG4tLS0gL2Rldi9udWxsXG4rKysgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ190ZXN0cy9tZW1jZ19hc3luY19yZWNsYWltLmNcbkBAIC0wLDAgKzEsNDc5IEBAXG4rLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjBcbisvKlxuKyAqIE1lbW9yeSBjb250cm9sbGVyIGVCUEYgYXN5bmMgcmVjbGFpbSB0ZXN0XG4rICovXG4rXG4rI2luY2x1ZGUgXHUwMDNjdGVzdF9wcm9ncy5oXHUwMDNlXG4rI2luY2x1ZGUgXHUwMDNjc3lzL21tYW4uaFx1MDAzZVxuKyNpbmNsdWRlIFx1MDAzY3N5cy9zdGF0LmhcdTAwM2VcbisjaW5jbHVkZSBcdTAwM2NzeXMvdmZzLmhcdTAwM2VcbisjaW5jbHVkZSBcdTAwM2NzeXMvd2FpdC5oXHUwMDNlXG4rI2luY2x1ZGUgXHUwMDNjZmNudGwuaFx1MDAzZVxuKyNpbmNsdWRlIFx1MDAzY3NpZ25hbC5oXHUwMDNlXG4rI2luY2x1ZGUgXHUwMDNjdGltZS5oXHUwMDNlXG4rI2luY2x1ZGUgXHUwMDNjdW5pc3RkLmhcdTAwM2VcbisjaW5jbHVkZSBcdTAwM2NzdGRpby5oXHUwMDNlXG4rI2luY2x1ZGUgXHUwMDNjc3RkbGliLmhcdTAwM2VcbisjaW5jbHVkZSBcdTAwM2NzdHJpbmcuaFx1MDAzZVxuKyNpbmNsdWRlIFx1MDAzY2xpbWl0cy5oXHUwMDNlXG4rI2luY2x1ZGUgXHUwMDNjbGludXgvbWFnaWMuaFx1MDAzZVxuK1xuKyNpbmNsdWRlIFwiY2dyb3VwX2hlbHBlcnMuaFwiXG4rXG4rc3RydWN0IGJwZl9hcmdzX3Mge1xuK1x0dTY0IGhpZ2hfY2dyb3VwX2lkO1xuK1x0dTY0IGxvd19jZ3JvdXBfaWQ7XG4rXHR1NjQgZXZlbnRfZGVsdGFfdGhyZXNob2xkO1xuK1x0dTY0IGNoZWNrX25zO1xuK307XG4rXG4rI2luY2x1ZGUgXCJtZW1jZ19hc3luY19yZWNsYWltLnNrZWwuaFwiXG4rXG4rI2RlZmluZSBGSUxFX1NJWkUgKDMyICogMTAyNCAqIDEwMjR1bClcbisjZGVmaW5lIEJVRkZFUl9TSVpFICg0MDk2KVxuKyNkZWZpbmUgQ0dfTElNSVQgKDMyICogMTAyNCAqIDEwMjR1bClcbisjZGVmaW5lIFJFQURfVElNRVMgNTBcbitcbisjZGVmaW5lIENHX0RJUiBcIi9tZW1jZ19hc3luY19yZWNsYWltXCJcbisjZGVmaW5lIENHX0hJR0hfRElSIENHX0RJUiBcIi9oaWdoXCJcbisjZGVmaW5lIENHX0xPV19ESVIgQ0dfRElSIFwiL2xvd1wiXG4rXG4rI2RlZmluZSBDSEVDS19QRVJJT0RfTlMgKDIgKiAxMDAwICogMTAwMHVsbClcbisjZGVmaW5lIEVWRU5UX0RFTFRBX1RIUkVTSE9MRCAxXG4rXG4rLypcbisgKiBUaGUgd29ya2xvYWQgZmlsZXMgbXVzdCBzaXQgb24gYSByZWd1bGFyIGZpbGVzeXN0ZW06IHdpdGggc3dhcFxuKyAqIGRpc2FibGVkIGZvciB0aGUgY2dyb3VwLCB0bXBmcy9yYW1mcyBwYWdlcyBhcmUgdW5ldmljdGFibGUgYW5kIHdvdWxkXG4rICogT09NIHRoZSBjZ3JvdXAgaW5zdGVhZCBvZiBleGVyY2lzaW5nIHJlY2xhaW07IHRoZXkgYXJlIGFsc28gY2hhcmdlZFxuKyAqIGFzIGFub255bW91cyBtZW1vcnksIHNvIHRoZXkgbmV2ZXIgcmFpc2UgdGhlIFdPUktJTkdTRVRfUkVGQVVMVF9GSUxFXG4rICogZXZlbnRzIHRoZSBCUEYgcHJvZ3JhbSBtb25pdG9ycy4gRmFsbCBiYWNrIHRvIHRoZSBjdXJyZW50IGRpcmVjdG9yeVxuKyAqIHdoZW4gL3RtcCBpcyBiYWNrZWQgYnkgc3VjaCBhIGZpbGVzeXN0ZW0uXG4rICovXG4rc3RhdGljIGNvbnN0IGNoYXIgKndvcmtsb2FkX2ZpbGVzX2Rpcih2b2lkKVxuK3tcbitcdHN0cnVjdCBzdGF0ZnMgc3Q7XG4rXG4rXHRpZiAoIXN0YXRmcyhcIi90bXBcIiwgXHUwMDI2c3QpIFx1MDAyNlx1MDAyNlxuK1x0ICAgIChzdC5mX3R5cGUgPT0gVE1QRlNfTUFHSUMgfHwgc3QuZl90eXBlID09IFJBTUZTX01BR0lDKSlcbitcdFx0cmV0dXJuIFwiLlwiO1xuK1x0cmV0dXJuIFwiL3RtcFwiO1xuK31cbitcbisvKlxuKyAqIFRoZSB3b3JrbG9hZCBjaGlsZHJlbiBydW4gYWZ0ZXIgdGVzdF9wcm9ncyBoaWphY2tlZCBzdGRpbywgc29cbisgKiBhbnl0aGluZyB0aGV5IHByaW50IGlzIGxvc3Qgd2l0aCB0aGVpciBwcml2YXRlIGNvcHkgb2YgdGhlIGhpamFja2VkXG4rICogYnVmZmVyLiBUaGUgZXhpdCBzdGF0dXMgaXMgdGhlIG9ubHkgZGlhZ25vc3RpY3MgY2hhbm5lbCB0aGF0IHJlYWNoZXNcbisgKiB0aGUgcGFyZW50LCBzbyBlYWNoIGZhaWxpbmcgc3RlcCBnZXRzIGl0cyBvd24gY29kZS5cbisgKi9cbitlbnVtIGNoaWxkX2V4aXRfY29kZSB7XG4rXHRDSElMRF9FWElUX09LID0gMCxcbitcdENISUxEX0VYSVRfSk9JTl9DR1JPVVAsXG4rXHRDSElMRF9FWElUX1dSSVRFX0ZJTEUsXG4rXHRDSElMRF9FWElUX1JFQURfRklMRSxcbitcdENISUxEX0VYSVRfVElNRV9GSUxFLFxuK307XG4rXG4rc3RhdGljIGNvbnN0IGNoYXIgKmNoaWxkX2V4aXRfc3RyKGludCBjb2RlKVxuK3tcbitcdHN3aXRjaCAoY29kZSkge1xuK1x0Y2FzZSBDSElMRF9FWElUX09LOlxuK1x0XHRyZXR1cm4gXCJzdWNjZXNzXCI7XG4rXHRjYXNlIENISUxEX0VYSVRfSk9JTl9DR1JPVVA6XG4rXHRcdHJldHVybiBcImpvaW4gY2dyb3VwXCI7XG4rXHRjYXNlIENISUxEX0VYSVRfV1JJVEVfRklMRTpcbitcdFx0cmV0dXJuIFwid3JpdGUgZGF0YSBmaWxlXCI7XG4rXHRjYXNlIENISUxEX0VYSVRfUkVBRF9GSUxFOlxuK1x0XHRyZXR1cm4gXCJyZWFkIGRhdGEgZmlsZVwiO1xuK1x0Y2FzZSBDSElMRF9FWElUX1RJTUVfRklMRTpcbitcdFx0cmV0dXJuIFwid3JpdGUgdGltZSBmaWxlXCI7XG4rXHRkZWZhdWx0OlxuK1x0XHRyZXR1cm4gXCJ1bmtub3duXCI7XG4rXHR9XG4rfVxuK1xuK3N0YXRpYyBpbnQgc2V0dXBfaGlnaF9sb3dfY2dyb3Vwcyh1NjQgKmhpZ2hfY2dyb3VwX2lkLCB1NjQgKmxvd19jZ3JvdXBfaWQpXG4re1xuK1x0aW50IHJldDtcbitcdGNoYXIgbGltaXRfYnVmWzIwXTtcbitcbitcdHJldCA9IHNldHVwX2Nncm91cF9lbnZpcm9ubWVudCgpO1xuK1x0aWYgKCFBU1NFUlRfT0socmV0LCBcInNldHVwX2Nncm91cF9lbnZpcm9ubWVudFwiKSlcbitcdFx0Z290byBjbGVhbnVwO1xuK1xuK1x0cmV0ID0gY3JlYXRlX2FuZF9nZXRfY2dyb3VwKENHX0RJUik7XG4rXHRpZiAoIUFTU0VSVF9HRShyZXQsIDAsIFwiY3JlYXRlX2FuZF9nZXRfY2dyb3VwIFwiIENHX0RJUikpXG4rXHRcdGdvdG8gY2xlYW51cDtcbitcdGNsb3NlKHJldCk7XG4rXG4rXHRyZXQgPSBlbmFibGVfY29udHJvbGxlcnMoQ0dfRElSLCBcIm1lbW9yeVwiKTtcbitcdGlmICghQVNTRVJUX09LKHJldCwgXCJlbmFibGVfY29udHJvbGxlcnNcIikpXG4rXHRcdGdvdG8gY2xlYW51cDtcbitcbitcdHNucHJpbnRmKGxpbWl0X2J1Ziwgc2l6ZW9mKGxpbWl0X2J1ZiksIFwiJWx1XCIsIENHX0xJTUlUKTtcbitcdHJldCA9IHdyaXRlX2Nncm91cF9maWxlKENHX0RJUiwgXCJtZW1vcnkubWF4XCIsIGxpbWl0X2J1Zik7XG4rXHRpZiAoIUFTU0VSVF9PSyhyZXQsIFwid3JpdGVfY2dyb3VwX2ZpbGUgbWVtb3J5Lm1heFwiKSlcbitcdFx0Z290byBjbGVhbnVwO1xuK1xuK1x0LypcbitcdCAqIEtlZXAgdGhlIHdvcmtsb2FkcyBmcm9tIHN3YXBwaW5nIG91dC4gV2l0aCBDT05GSUdfU1dBUD1uIHRoZVxuK1x0ICogbWVtb3J5LnN3YXAubWF4IGZpbGUgZG9lcyBub3QgZXhpc3QsIGFuZCBubyBzd2FwIGNhbiBoYXBwZW5cbitcdCAqIGFueXdheSwgc28gc2tpcCB0aGUgd3JpdGUuXG4rXHQgKi9cbitcdGlmICghYWNjZXNzKFwiL3Byb2Mvc3dhcHNcIiwgRl9PSykpIHtcbitcdFx0cmV0ID0gd3JpdGVfY2dyb3VwX2ZpbGUoQ0dfRElSLCBcIm1lbW9yeS5zd2FwLm1heFwiLCBcIjBcIik7XG4rXHRcdGlmICghQVNTRVJUX09LKHJldCwgXCJ3cml0ZV9jZ3JvdXBfZmlsZSBtZW1vcnkuc3dhcC5tYXhcIikpXG4rXHRcdFx0Z290byBjbGVhbnVwO1xuK1x0fVxuK1xuK1x0cmV0ID0gY3JlYXRlX2FuZF9nZXRfY2dyb3VwKENHX0hJR0hfRElSKTtcbitcdGlmICghQVNTRVJUX0dFKHJldCwgMCwgXCJjcmVhdGVfYW5kX2dldF9jZ3JvdXAgXCIgQ0dfSElHSF9ESVIpKVxuK1x0XHRnb3RvIGNsZWFudXA7XG4rXHRjbG9zZShyZXQpO1xuK1xuK1x0KmhpZ2hfY2dyb3VwX2lkID0gZ2V0X2Nncm91cF9pZChDR19ISUdIX0RJUik7XG4rXHRpZiAoIUFTU0VSVF9HVCgqaGlnaF9jZ3JvdXBfaWQsIDAsIFwiZ2V0X2Nncm91cF9pZFwiKSlcbitcdFx0Z290byBjbGVhbnVwO1xuK1xuK1x0cmV0ID0gY3JlYXRlX2FuZF9nZXRfY2dyb3VwKENHX0xPV19ESVIpO1xuK1x0aWYgKCFBU1NFUlRfR0UocmV0LCAwLCBcImNyZWF0ZV9hbmRfZ2V0X2Nncm91cCBcIiBDR19MT1dfRElSKSlcbitcdFx0Z290byBjbGVhbnVwO1xuK1x0Y2xvc2UocmV0KTtcbitcbitcdCpsb3dfY2dyb3VwX2lkID0gZ2V0X2Nncm91cF9pZChDR19MT1dfRElSKTtcbitcdGlmICghQVNTRVJUX0dUKCpsb3dfY2dyb3VwX2lkLCAwLCBcImdldF9jZ3JvdXBfaWRcIikpXG4rXHRcdGdvdG8gY2xlYW51cDtcbitcbitcdHJldHVybiAwO1xuK1xuK2NsZWFudXA6XG4rXHRjbGVhbnVwX2Nncm91cF9lbnZpcm9ubWVudCgpO1xuK1x0cmV0dXJuIC0xO1xuK31cbitcbitzdGF0aWMgaW50IHdyaXRlX2ZpbGUoY29uc3QgY2hhciAqZmlsZW5hbWUpXG4re1xuK1x0aW50IHJldCA9IC0xO1xuK1x0c2l6ZV90IHdyaXR0ZW4gPSAwO1xuK1x0Y2hhciAqYnVmZmVyO1xuK1x0RklMRSAqZnA7XG4rXG4rXHRmcCA9IGZvcGVuKGZpbGVuYW1lLCBcIndiXCIpO1xuK1x0aWYgKCFmcClcbitcdFx0Z290byBvdXQ7XG4rXG4rXHRidWZmZXIgPSBtYWxsb2MoQlVGRkVSX1NJWkUpO1xuK1x0aWYgKCFidWZmZXIpXG4rXHRcdGdvdG8gY2xlYW51cF9mcDtcbitcbitcdG1lbXNldChidWZmZXIsICdBJywgQlVGRkVSX1NJWkUpO1xuK1xuK1x0d2hpbGUgKHdyaXR0ZW4gXHUwMDNjIEZJTEVfU0laRSkge1xuK1x0XHRzaXplX3QgdG9fd3JpdGUgPSBGSUxFX1NJWkUgLSB3cml0dGVuIFx1MDAzYyBCVUZGRVJfU0laRSA/XG4rXHRcdFx0XHQgIEZJTEVfU0laRSAtIHdyaXR0ZW4gOiBCVUZGRVJfU0laRTtcbitcbitcdFx0aWYgKGZ3cml0ZShidWZmZXIsIDEsIHRvX3dyaXRlLCBmcCkgIT0gdG9fd3JpdGUpXG4rXHRcdFx0Z290byBjbGVhbnVwO1xuK1x0XHR3cml0dGVuICs9IHRvX3dyaXRlO1xuK1x0fVxuK1xuK1x0cmV0ID0gMDtcbitjbGVhbnVwOlxuK1x0ZnJlZShidWZmZXIpO1xuK2NsZWFudXBfZnA6XG4rXHRmY2xvc2UoZnApO1xuK291dDpcbitcdHJldHVybiByZXQ7XG4rfVxuK1xuK3N0YXRpYyBpbnQgcmVhZF9maWxlKGNvbnN0IGNoYXIgKmZpbGVuYW1lLCBpbnQgaXRlcmF0aW9ucylcbit7XG4rXHRpbnQgcmV0ID0gLTE7XG4rXHRsb25nIHBhZ2Vfc2l6ZSA9IHN5c2NvbmYoX1NDX1BBR0VTSVpFKTtcbitcdGNoYXIgKm1hcDtcbitcdHNpemVfdCBpO1xuK1x0aW50IGZkO1xuK1x0c3RydWN0IHN0YXQgc2I7XG4rXG4rXHRmZCA9IG9wZW4oZmlsZW5hbWUsIE9fUkRPTkxZKTtcbitcdGlmIChmZCA9PSAtMSlcbitcdFx0Z290byBvdXQ7XG4rXG4rXHRpZiAoZnN0YXQoZmQsIFx1MDAyNnNiKSA9PSAtMSlcbitcdFx0Z290byBjbGVhbnVwX2ZkO1xuK1xuK1x0aWYgKHNiLnN0X3NpemUgIT0gRklMRV9TSVpFKSB7XG4rXHRcdGZwcmludGYoc3RkZXJyLCBcIkZpbGUgc2l6ZSBtaXNtYXRjaDogZXhwZWN0ZWQgJWx1LCBnb3QgJWx1XFxuXCIsXG4rXHRcdFx0KHVuc2lnbmVkIGxvbmcpRklMRV9TSVpFLCAodW5zaWduZWQgbG9uZylzYi5zdF9zaXplKTtcbitcdFx0Z290byBjbGVhbnVwX2ZkO1xuK1x0fVxuK1xuK1x0bWFwID0gbW1hcChOVUxMLCBGSUxFX1NJWkUsIFBST1RfUkVBRCwgTUFQX1BSSVZBVEUsIGZkLCAwKTtcbitcdGlmIChtYXAgPT0gTUFQX0ZBSUxFRClcbitcdFx0Z290byBjbGVhbnVwX2ZkO1xuK1xuK1x0Zm9yIChpbnQgaXRlciA9IDA7IGl0ZXIgXHUwMDNjIGl0ZXJhdGlvbnM7IGl0ZXIrKykge1xuK1x0XHRmb3IgKGkgPSAwOyBpIFx1MDAzYyBGSUxFX1NJWkU7IGkgKz0gcGFnZV9zaXplKSB7XG4rXHRcdFx0LyogYWNjZXNzIGEgYnl0ZSB0byB0cmlnZ2VyIHBhZ2UgZmF1bHQgKi9cbitcdFx0XHR2b2xhdGlsZSBjaGFyIHYgPSBtYXBbaV07XG4rXHRcdFx0KHZvaWQpdjtcbitcdFx0fVxuK1x0fVxuK1xuK1x0aWYgKG11bm1hcChtYXAsIEZJTEVfU0laRSkgPT0gLTEpXG4rXHRcdGdvdG8gY2xlYW51cF9mZDtcbitcbitcdHJldCA9IDA7XG4rXG4rY2xlYW51cF9mZDpcbitcdGNsb3NlKGZkKTtcbitvdXQ6XG4rXHRyZXR1cm4gcmV0O1xuK31cbitcbitzdGF0aWMgaW50IHJlYWxfdGVzdF9jaGlsZF93b3JrKGNvbnN0IGNoYXIgKmNncm91cF9wYXRoLCBjaGFyICpkYXRhX2ZpbGVuYW1lLFxuK1x0XHRcdFx0Y2hhciAqdGltZV9maWxlbmFtZSwgaW50IHJlYWRfdGltZXMpXG4re1xuK1x0c3RydWN0IHRpbWVzcGVjIHN0YXJ0LCBlbmQ7XG4rXHRkb3VibGUgZWxhcHNlZDtcbitcdEZJTEUgKmZwO1xuK1xuK1x0aWYgKGpvaW5fcGFyZW50X2Nncm91cChjZ3JvdXBfcGF0aCkpXG4rXHRcdHJldHVybiBDSElMRF9FWElUX0pPSU5fQ0dST1VQO1xuK1xuK1x0Y2xvY2tfZ2V0dGltZShDTE9DS19NT05PVE9OSUMsIFx1MDAyNnN0YXJ0KTtcbitcbitcdGlmICh3cml0ZV9maWxlKGRhdGFfZmlsZW5hbWUpKVxuK1x0XHRyZXR1cm4gQ0hJTERfRVhJVF9XUklURV9GSUxFO1xuK1xuK1x0aWYgKHJlYWRfZmlsZShkYXRhX2ZpbGVuYW1lLCByZWFkX3RpbWVzKSlcbitcdFx0cmV0dXJuIENISUxEX0VYSVRfUkVBRF9GSUxFO1xuK1xuK1x0Y2xvY2tfZ2V0dGltZShDTE9DS19NT05PVE9OSUMsIFx1MDAyNmVuZCk7XG4rXG4rXHRpZiAoIXRpbWVfZmlsZW5hbWUpXG4rXHRcdHJldHVybiBDSElMRF9FWElUX09LO1xuK1xuK1x0ZWxhcHNlZCA9IChlbmQudHZfc2VjIC0gc3RhcnQudHZfc2VjKSArXG4rXHRcdCAgKGVuZC50dl9uc2VjIC0gc3RhcnQudHZfbnNlYykgLyAxMDAwMDAwMDAwLjA7XG4rXHRwcmludGYoXCIlLjZmXFxuXCIsIGVsYXBzZWQpO1xuK1xuK1x0ZnAgPSBmb3Blbih0aW1lX2ZpbGVuYW1lLCBcIndcIik7XG4rXHRpZiAoIWZwKVxuK1x0XHRyZXR1cm4gQ0hJTERfRVhJVF9USU1FX0ZJTEU7XG4rXHRmcHJpbnRmKGZwLCBcIiUuNmZcIiwgZWxhcHNlZCk7XG4rXHRmY2xvc2UoZnApO1xuK1xuK1x0cmV0dXJuIENISUxEX0VYSVRfT0s7XG4rfVxuK1xuK3N0YXRpYyBpbnQgZ2V0X3RpbWUoY2hhciAqdGltZV9maWxlbmFtZSwgZG91YmxlICp0aW1lKVxuK3tcbitcdGludCByZXQgPSAtMTtcbitcdEZJTEUgKmZwO1xuK1x0Y2hhciBidWZbNjRdO1xuK1xuK1x0ZnAgPSBmb3Blbih0aW1lX2ZpbGVuYW1lLCBcInJcIik7XG4rXHRpZiAoIUFTU0VSVF9PS19QVFIoZnAsIFwiZm9wZW5cIikpXG4rXHRcdGdvdG8gb3V0O1xuK1xuK1x0aWYgKCFBU1NFUlRfT0tfUFRSKGZnZXRzKGJ1Ziwgc2l6ZW9mKGJ1ZiksIGZwKSwgXCJmZ2V0c1wiKSlcbitcdFx0Z290byBjbGVhbnVwO1xuK1xuK1x0aWYgKHNzY2FuZihidWYsIFwiJWxmXCIsIHRpbWUpICE9IDEpIHtcbitcdFx0UFJJTlRfRkFJTChcInNzY2FuZiAlc1wiLCBidWYpO1xuK1x0XHRnb3RvIGNsZWFudXA7XG4rXHR9XG4rXG4rXHRyZXQgPSAwO1xuK2NsZWFudXA6XG4rXHRmY2xvc2UoZnApO1xuK291dDpcbitcdHJldHVybiByZXQ7XG4rfVxuK1xuK3N0YXRpYyBpbnRcbitydW5faGlnaF9sb3dfd29ya2xvYWQoZG91YmxlICpoaWdoX2VsYXBzZWQsIGRvdWJsZSAqbG93X2VsYXBzZWQsIGludCByZWFkX3RpbWVzKVxuK3tcbitcdGNoYXIgaGlnaF9kYXRhX2ZpbGVbUEFUSF9NQVhdO1xuK1x0Y2hhciBsb3dfZGF0YV9maWxlW1BBVEhfTUFYXTtcbitcdGNoYXIgaGlnaF90aW1lX2ZpbGVbUEFUSF9NQVhdO1xuK1x0Y2hhciBsb3dfdGltZV9maWxlW1BBVEhfTUFYXTtcbitcdGNvbnN0IGNoYXIgKmRpciA9IHdvcmtsb2FkX2ZpbGVzX2RpcigpO1xuK1x0cGlkX3QgaGlnaF9waWQgPSAtMSwgbG93X3BpZCA9IC0xO1xuK1x0aW50IGZkLCBzdGF0dXM7XG4rXHRpbnQgcmV0ID0gLTE7XG4rXG4rXHRzbnByaW50ZihoaWdoX2RhdGFfZmlsZSwgc2l6ZW9mKGhpZ2hfZGF0YV9maWxlKSxcbitcdFx0IFwiJXMvbWVtY2dfYXN5bmNfaGlnaF9kYXRhX1hYWFhYWFwiLCBkaXIpO1xuK1x0c25wcmludGYobG93X2RhdGFfZmlsZSwgc2l6ZW9mKGxvd19kYXRhX2ZpbGUpLFxuK1x0XHQgXCIlcy9tZW1jZ19hc3luY19sb3dfZGF0YV9YWFhYWFhcIiwgZGlyKTtcbitcdHNucHJpbnRmKGhpZ2hfdGltZV9maWxlLCBzaXplb2YoaGlnaF90aW1lX2ZpbGUpLFxuK1x0XHQgXCIlcy9tZW1jZ19hc3luY19oaWdoX3RpbWVfWFhYWFhYXCIsIGRpcik7XG4rXHRzbnByaW50Zihsb3dfdGltZV9maWxlLCBzaXplb2YobG93X3RpbWVfZmlsZSksXG4rXHRcdCBcIiVzL21lbWNnX2FzeW5jX2xvd190aW1lX1hYWFhYWFwiLCBkaXIpO1xuK1xuK1x0ZmQgPSBta3N0ZW1wKGhpZ2hfZGF0YV9maWxlKTtcbitcdGlmICghQVNTRVJUX0dFKGZkLCAwLCBcIm1rc3RlbXBcIikpXG4rXHRcdGdvdG8gY2xlYW51cDtcbitcdGNsb3NlKGZkKTtcbitcbitcdGZkID0gbWtzdGVtcChsb3dfZGF0YV9maWxlKTtcbitcdGlmICghQVNTRVJUX0dFKGZkLCAwLCBcIm1rc3RlbXBcIikpXG4rXHRcdGdvdG8gY2xlYW51cDtcbitcdGNsb3NlKGZkKTtcbitcbitcdGZkID0gbWtzdGVtcChoaWdoX3RpbWVfZmlsZSk7XG4rXHRpZiAoIUFTU0VSVF9HRShmZCwgMCwgXCJta3N0ZW1wXCIpKVxuK1x0XHRnb3RvIGNsZWFudXA7XG4rXHRjbG9zZShmZCk7XG4rXG4rXHRmZCA9IG1rc3RlbXAobG93X3RpbWVfZmlsZSk7XG4rXHRpZiAoIUFTU0VSVF9HRShmZCwgMCwgXCJta3N0ZW1wXCIpKVxuK1x0XHRnb3RvIGNsZWFudXA7XG4rXHRjbG9zZShmZCk7XG4rXG4rXHRsb3dfcGlkID0gZm9yaygpO1xuK1x0aWYgKCFBU1NFUlRfR0UobG93X3BpZCwgMCwgXCJmb3JrIGxvd1wiKSlcbitcdFx0Z290byBjbGVhbnVwO1xuK1x0aWYgKGxvd19waWQgPT0gMClcbitcdFx0ZXhpdChyZWFsX3Rlc3RfY2hpbGRfd29yayhDR19MT1dfRElSLCBsb3dfZGF0YV9maWxlLFxuK1x0XHRcdFx0XHQgIGxvd190aW1lX2ZpbGUsIHJlYWRfdGltZXMpKTtcbitcbitcdGhpZ2hfcGlkID0gZm9yaygpO1xuK1x0aWYgKCFBU1NFUlRfR0UoaGlnaF9waWQsIDAsIFwiZm9yayBoaWdoXCIpKVxuK1x0XHRnb3RvIGNsZWFudXA7XG4rXHRpZiAoaGlnaF9waWQgPT0gMClcbitcdFx0ZXhpdChyZWFsX3Rlc3RfY2hpbGRfd29yayhDR19ISUdIX0RJUiwgaGlnaF9kYXRhX2ZpbGUsXG4rXHRcdFx0XHRcdCAgaGlnaF90aW1lX2ZpbGUsIHJlYWRfdGltZXMpKTtcbitcbitcdGxvd19waWQgPSB3YWl0cGlkKGxvd19waWQsIFx1MDAyNnN0YXR1cywgMCk7XG4rXHRpZiAoIUFTU0VSVF9HVChsb3dfcGlkLCAwLCBcImxvdyB3YWl0cGlkXCIpKVxuK1x0XHRnb3RvIGNsZWFudXA7XG4rXHQvKlxuK1x0ICogVGhlIGNoaWxkIGhhcyBiZWVuIHJlYXBlZCBhbmQgaXRzIFBJRCBjYW4gYWxyZWFkeSBiZSByZXVzZWQsXG4rXHQgKiBzbyBtYXJrIGl0IHRvIGtlZXAgY2xlYW51cCBmcm9tIHNpZ25hbGluZyBhbiB1bnJlbGF0ZWQgcHJvY2Vzcy5cbitcdCAqL1xuK1x0bG93X3BpZCA9IC0xO1xuK1x0aWYgKCFBU1NFUlRfVFJVRShXSUZFWElURUQoc3RhdHVzKSwgXCJsb3cgZXhpdGVkXCIpKVxuK1x0XHRnb3RvIGNsZWFudXA7XG4rXHRpZiAoV0VYSVRTVEFUVVMoc3RhdHVzKSAhPSBDSElMRF9FWElUX09LKSB7XG4rXHRcdFBSSU5UX0ZBSUwoXCJsb3cgY2hpbGQgZmFpbGVkIGF0OiAlcyAoZXhpdCBzdGF0dXMgJWQpXCIsXG4rXHRcdFx0ICAgY2hpbGRfZXhpdF9zdHIoV0VYSVRTVEFUVVMoc3RhdHVzKSksXG4rXHRcdFx0ICAgV0VYSVRTVEFUVVMoc3RhdHVzKSk7XG4rXHRcdGdvdG8gY2xlYW51cDtcbitcdH1cbitcbitcdGhpZ2hfcGlkID0gd2FpdHBpZChoaWdoX3BpZCwgXHUwMDI2c3RhdHVzLCAwKTtcbitcdGlmICghQVNTRVJUX0dUKGhpZ2hfcGlkLCAwLCBcImhpZ2ggd2FpdHBpZFwiKSlcbitcdFx0Z290byBjbGVhbnVwO1xuK1x0LyogU2FtZSBhcyBhYm92ZTogdGhlIHJlYXBlZCBQSUQgbXVzdCBub3QgYmUgc2lnbmFsZWQgYWdhaW4uICovXG4rXHRoaWdoX3BpZCA9IC0xO1xuK1x0aWYgKCFBU1NFUlRfVFJVRShXSUZFWElURUQoc3RhdHVzKSwgXCJoaWdoIGV4aXRlZFwiKSlcbitcdFx0Z290byBjbGVhbnVwO1xuK1x0aWYgKFdFWElUU1RBVFVTKHN0YXR1cykgIT0gQ0hJTERfRVhJVF9PSykge1xuK1x0XHRQUklOVF9GQUlMKFwiaGlnaCBjaGlsZCBmYWlsZWQgYXQ6ICVzIChleGl0IHN0YXR1cyAlZClcIixcbitcdFx0XHQgICBjaGlsZF9leGl0X3N0cihXRVhJVFNUQVRVUyhzdGF0dXMpKSxcbitcdFx0XHQgICBXRVhJVFNUQVRVUyhzdGF0dXMpKTtcbitcdFx0Z290byBjbGVhbnVwO1xuK1x0fVxuK1xuK1x0aWYgKGdldF90aW1lKGhpZ2hfdGltZV9maWxlLCBoaWdoX2VsYXBzZWQpKVxuK1x0XHRnb3RvIGNsZWFudXA7XG4rXHRpZiAoZ2V0X3RpbWUobG93X3RpbWVfZmlsZSwgbG93X2VsYXBzZWQpKVxuK1x0XHRnb3RvIGNsZWFudXA7XG4rXG4rXHRyZXQgPSAwO1xuK1xuK2NsZWFudXA6XG4rXHQvKiBPbiBmYWlsdXJlLCBtYWtlIHN1cmUgbm8gY2hpbGQgcHJvY2VzcyBpcyBsZWZ0IGJlaGluZCAqL1xuK1x0aWYgKHJldCkge1xuK1x0XHRpZiAoaGlnaF9waWQgXHUwMDNlIDApIHtcbitcdFx0XHRraWxsKGhpZ2hfcGlkLCBTSUdLSUxMKTtcbitcdFx0XHQodm9pZCl3YWl0cGlkKGhpZ2hfcGlkLCBOVUxMLCAwKTtcbitcdFx0fVxuK1x0XHRpZiAobG93X3BpZCBcdTAwM2UgMCkge1xuK1x0XHRcdGtpbGwobG93X3BpZCwgU0lHS0lMTCk7XG4rXHRcdFx0KHZvaWQpd2FpdHBpZChsb3dfcGlkLCBOVUxMLCAwKTtcbitcdFx0fVxuK1x0fVxuK1x0dW5saW5rKGxvd190aW1lX2ZpbGUpO1xuK1x0dW5saW5rKGhpZ2hfdGltZV9maWxlKTtcbitcdHVubGluayhsb3dfZGF0YV9maWxlKTtcbitcdHVubGluayhoaWdoX2RhdGFfZmlsZSk7XG4rXHRyZXR1cm4gcmV0O1xuK31cbitcbitzdGF0aWMgaW50XG4rc2V0dXBfYnBmKHU2NCBoaWdoX2Nncm91cF9pZCwgdTY0IGxvd19jZ3JvdXBfaWQsXG4rXHQgIHN0cnVjdCBtZW1jZ19hc3luY19yZWNsYWltICoqc2tlbF9wdHIpXG4re1xuK1x0c3RydWN0IG1lbWNnX2FzeW5jX3JlY2xhaW0gKnNrZWw7XG4rXHRzdHJ1Y3QgYnBmX2FyZ3NfcyBicGZfYXJncyA9IHtcbitcdFx0LmhpZ2hfY2dyb3VwX2lkID0gaGlnaF9jZ3JvdXBfaWQsXG4rXHRcdC5sb3dfY2dyb3VwX2lkID0gbG93X2Nncm91cF9pZCxcbitcdFx0LmV2ZW50X2RlbHRhX3RocmVzaG9sZCA9IEVWRU5UX0RFTFRBX1RIUkVTSE9MRCxcbitcdFx0LmNoZWNrX25zID0gQ0hFQ0tfUEVSSU9EX05TLFxuK1x0fTtcbitcdExJQkJQRl9PUFRTKGJwZl90ZXN0X3J1bl9vcHRzLCBydW5fb3B0cyxcbitcdFx0LmN0eF9pbiA9IFx1MDAyNmJwZl9hcmdzLFxuK1x0XHQuY3R4X3NpemVfaW4gPSBzaXplb2YoYnBmX2FyZ3MpKTtcbitcdGludCBwcm9nX2luaXRfZmQsIGVycjtcbitcbitcdHNrZWwgPSBtZW1jZ19hc3luY19yZWNsYWltX19vcGVuX2FuZF9sb2FkKCk7XG4rXHRpZiAoIUFTU0VSVF9PS19QVFIoc2tlbCwgXCJtZW1jZ19hc3luY19yZWNsYWltX19vcGVuX2FuZF9sb2FkXCIpKVxuK1x0XHRyZXR1cm4gLTE7XG4rXG4rXHRwcm9nX2luaXRfZmQgPSBicGZfcHJvZ3JhbV9fZmQoc2tlbC1cdTAwM2Vwcm9ncy53cV9wcm9nX2luaXQpO1xuK1xuK1x0ZXJyID0gYnBmX3Byb2dfdGVzdF9ydW5fb3B0cyhwcm9nX2luaXRfZmQsIFx1MDAyNnJ1bl9vcHRzKTtcbitcdGlmICghQVNTRVJUX09LKGVyciwgXCJicGZfcHJvZ190ZXN0X3J1bl9vcHRzXCIpKVxuK1x0XHRnb3RvIGVycm9yX291dDtcbitcdGlmICghQVNTRVJUX0VRKHJ1bl9vcHRzLnJldHZhbCwgMCwgXCJwcm9nX2luaXQgcmV0dmFsXCIpKVxuK1x0XHRnb3RvIGVycm9yX291dDtcbitcbitcdCpza2VsX3B0ciA9IHNrZWw7XG4rXHRyZXR1cm4gMDtcbitcbitlcnJvcl9vdXQ6XG4rXHRtZW1jZ19hc3luY19yZWNsYWltX19kZXN0cm95KHNrZWwpO1xuK1x0cmV0dXJuIC0xO1xuK31cbitcbit2b2lkIHRlc3RfbWVtY2dfd3FfYXN5bmNfcmVjbGFpbSh2b2lkKVxuK3tcbitcdHU2NCBoaWdoX2Nncm91cF9pZCwgbG93X2Nncm91cF9pZDtcbitcdGludCBlcnI7XG4rXHRkb3VibGUgaGlnaF90aW1lID0gMC4wLCBsb3dfdGltZSA9IDAuMDtcbitcdHN0cnVjdCBtZW1jZ19hc3luY19yZWNsYWltICpza2VsID0gTlVMTDtcbitcbitcdGVyciA9IHNldHVwX2hpZ2hfbG93X2Nncm91cHMoXHUwMDI2aGlnaF9jZ3JvdXBfaWQsIFx1MDAyNmxvd19jZ3JvdXBfaWQpO1xuK1x0aWYgKCFBU1NFUlRfT0soZXJyLCBcInNldHVwX2hpZ2hfbG93X2Nncm91cHMgcmVjbGFpbVwiKSlcbitcdFx0cmV0dXJuO1xuK1xuK1x0ZXJyID0gc2V0dXBfYnBmKGhpZ2hfY2dyb3VwX2lkLCBsb3dfY2dyb3VwX2lkLCBcdTAwMjZza2VsKTtcbitcdGlmICghQVNTRVJUX09LKGVyciwgXCJzZXR1cF9icGZcIikpXG4rXHRcdGdvdG8gb3V0O1xuK1xuK1x0ZXJyID0gcnVuX2hpZ2hfbG93X3dvcmtsb2FkKFx1MDAyNmhpZ2hfdGltZSwgXHUwMDI2bG93X3RpbWUsIFJFQURfVElNRVMpO1xuK1x0aWYgKCFBU1NFUlRfT0soZXJyLCBcInJ1bl9oaWdoX2xvd193b3JrbG9hZCByZWNsYWltXCIpKVxuK1x0XHRnb3RvIG91dDtcbitcbitcdC8qXG4rXHQgKiBUaGUgdGltaW5nIGNvbXBhcmlzb24gYmVsb3cgYWxvbmUgY2Fubm90IGRpc3Rpbmd1aXNoIGEgd29ya2luZ1xuK1x0ICogcmVjbGFpbSBmcm9tIGEgbm8tb3Agb25lLCBzbyByZXF1aXJlIHRoYXQgdGhlIEJQRiBwcm9ncmFtXG4rXHQgKiBhY3R1YWxseSByZWNsYWltZWQgcGFnZXMgZnJvbSB0aGUgbG93IGNncm91cC5cbitcdCAqL1xuK1x0aWYgKCFBU1NFUlRfR1Qoc2tlbC1cdTAwM2Vic3MtXHUwMDNlcmVjbGFpbV9jYWxscywgMCwgXCJyZWNsYWltX2NhbGxzXCIpKVxuK1x0XHRnb3RvIG91dDtcbitcdGlmICghQVNTRVJUX0dUKHNrZWwtXHUwMDNlYnNzLVx1MDAzZXJlY2xhaW1lZF9wYWdlcywgMCwgXCJyZWNsYWltZWRfcGFnZXNcIikpXG4rXHRcdGdvdG8gb3V0O1xuK1xuK1x0aWYgKGhpZ2hfdGltZSBcdTAwM2U9IGxvd190aW1lKVxuK1x0XHRQUklOVF9GQUlMKFwiaGlnaCBjZ3JvdXAgbm90IGltcHJvdmVkIHdpdGggYXN5bmMgcmVjbGFpbTogaGlnaF90aW1lPSVmIGxvd190aW1lPSVmXCIsXG4rXHRcdFx0ICAgaGlnaF90aW1lLCBsb3dfdGltZSk7XG4rXG4rb3V0OlxuK1x0aWYgKHNrZWwpXG4rXHRcdG1lbWNnX2FzeW5jX3JlY2xhaW1fX2Rlc3Ryb3koc2tlbCk7XG4rXHRjbGVhbnVwX2Nncm91cF9lbnZpcm9ubWVudCgpO1xuK31cbmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ3MvbWVtY2dfYXN5bmNfcmVjbGFpbS5jIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dzL21lbWNnX2FzeW5jX3JlY2xhaW0uY1xubmV3IGZpbGUgbW9kZSAxMDA2NDRcbmluZGV4IDAwMDAwMDAwMDAwMDAuLjIyNWYwYmM2NjcxMTNcbi0tLSAvZGV2L251bGxcbisrKyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9wcm9ncy9tZW1jZ19hc3luY19yZWNsYWltLmNcbkBAIC0wLDAgKzEsMTgwIEBAXG4rLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjBcbitcbisjaW5jbHVkZSBcInZtbGludXguaFwiXG4rI2luY2x1ZGUgXCJicGZfZXhwZXJpbWVudGFsLmhcIlxuKyNpbmNsdWRlIFx1MDAzY2JwZi9icGZfaGVscGVycy5oXHUwMDNlXG4rI2luY2x1ZGUgXHUwMDNjYnBmL2JwZl90cmFjaW5nLmhcdTAwM2VcbisjaW5jbHVkZSBcdTAwM2NicGYvYnBmX2NvcmVfcmVhZC5oXHUwMDNlXG4rXG4rI2RlZmluZSBDTE9DS19NT05PVE9OSUNfSURcdDFcbisjZGVmaW5lIFBBR0VfU0laRVx0XHQ0MDk2VUxcbisjZGVmaW5lIFJFQ0xBSU1fU0laRVx0XHQoMzIgKiBQQUdFX1NJWkUpXG4rI2RlZmluZSBSRUNMQUlNX01BWF9JVEVSXHQzMlxuK1xuK3N0cnVjdCBicGZfYXJnc19zIHtcbitcdHU2NCBoaWdoX2Nncm91cF9pZDtcbitcdHU2NCBsb3dfY2dyb3VwX2lkO1xuK1x0dTY0IGV2ZW50X2RlbHRhX3RocmVzaG9sZDtcbitcdHU2NCBjaGVja19ucztcbit9O1xuK1xuK3N0cnVjdCBjZ3JvdXBfbWVtY2cge1xuK1x0c3RydWN0IGNncm91cCAqY2dycDtcbitcdHN0cnVjdCBtZW1fY2dyb3VwICptZW1jZztcbit9O1xuK1xuK3N0YXRpYyB1NjQgd3FfaGlnaF9jZ3JvdXBfaWQ7XG4rc3RhdGljIHU2NCB3cV9sb3dfY2dyb3VwX2lkO1xuK1xuKy8qIFN0YXRpc3RpY3MgZXhwb3NlZCB0byB1c2Vyc3BhY2UgdGhyb3VnaCAuYnNzLCBzbyB0aGUgdGVzdCBjYW4gdmVyaWZ5XG4rICogdGhhdCByZWNsYWltIGFjdHVhbGx5IGhhcHBlbmVkIGluc3RlYWQgb2YgcmVseWluZyBvbiB0aW1pbmcgYWxvbmUuXG4rICovXG4rdTY0IHJlY2xhaW1fY2FsbHM7XG4rdTY0IHJlY2xhaW1lZF9wYWdlcztcbitcbitzdGF0aWMgaW50IGdldF9jZ3JvdXBfbWVtY2dfZnJvbV9pZCh1NjQgY2dyb3VwX2lkLCBzdHJ1Y3QgY2dyb3VwX21lbWNnICpjbSlcbit7XG4rXHRjbS1cdTAwM2VjZ3JwID0gYnBmX2Nncm91cF9mcm9tX2lkKGNncm91cF9pZCk7XG4rXHRpZiAoIWNtLVx1MDAzZWNncnApXG4rXHRcdHJldHVybiAtMTtcbitcbitcdGNtLVx1MDAzZW1lbWNnID0gYnBmX2dldF9tZW1fY2dyb3VwKFx1MDAyNmNtLVx1MDAzZWNncnAtXHUwMDNlc2VsZik7XG4rXHRpZiAoIWNtLVx1MDAzZW1lbWNnKSB7XG4rXHRcdGJwZl9jZ3JvdXBfcmVsZWFzZShjbS1cdTAwM2VjZ3JwKTtcbitcdFx0cmV0dXJuIC0xO1xuK1x0fVxuK1xuK1x0cmV0dXJuIDA7XG4rfVxuK1xuK3N0YXRpYyB2b2lkIHB1dF9jZ3JvdXBfbWVtY2coc3RydWN0IGNncm91cF9tZW1jZyAqY20pXG4re1xuK1x0YnBmX3B1dF9tZW1fY2dyb3VwKGNtLVx1MDAzZW1lbWNnKTtcbitcdGJwZl9jZ3JvdXBfcmVsZWFzZShjbS1cdTAwM2VjZ3JwKTtcbit9XG4rXG4rc3RhdGljIGludCBnZXRfY2dyb3VwX2V2ZW50KHU2NCBjZ3JvdXBfaWQsIHU2NCAqdmFsKVxuK3tcbitcdHN0cnVjdCBjZ3JvdXBfbWVtY2cgY207XG4rXG4rXHRpZiAoZ2V0X2Nncm91cF9tZW1jZ19mcm9tX2lkKGNncm91cF9pZCwgXHUwMDI2Y20pKVxuK1x0XHRyZXR1cm4gLTE7XG4rXHRicGZfbWVtX2Nncm91cF9mbHVzaF9zdGF0cyhjbS5tZW1jZyk7XG4rXHQqdmFsID0gYnBmX21lbV9jZ3JvdXBfcGFnZV9zdGF0ZShjbS5tZW1jZyxcbitcdFx0YnBmX2NvcmVfZW51bV92YWx1ZShlbnVtIG5vZGVfc3RhdF9pdGVtLFxuK1x0XHRcdFx0ICAgIFdPUktJTkdTRVRfUkVGQVVMVF9GSUxFKSk7XG4rXHRwdXRfY2dyb3VwX21lbWNnKFx1MDAyNmNtKTtcbitcbitcdHJldHVybiAwO1xuK31cbitcbitzdGF0aWMgYm9vbFxuK3Nob3VsZF9yZWNsYWltX2Nncm91cCh1NjQgY2dyb3VwX2lkLCB1NjQgKnByZXZfZXZlbnQsIHU2NCBldmVudF9kZWx0YV90aHJlc2hvbGQpXG4re1xuK1x0dTY0IGN1ciwgZGVsdGE7XG4rXG4rXHRpZiAoZ2V0X2Nncm91cF9ldmVudChjZ3JvdXBfaWQsIFx1MDAyNmN1cikpXG4rXHRcdHJldHVybiBmYWxzZTtcbitcbitcdGRlbHRhID0gY3VyIC0gKnByZXZfZXZlbnQ7XG4rXHQqcHJldl9ldmVudCA9IGN1cjtcbitcbitcdHJldHVybiBkZWx0YSBcdTAwM2U9IGV2ZW50X2RlbHRhX3RocmVzaG9sZDtcbit9XG4rXG4rc3RhdGljIGludCByZWNsYWltX2Nncm91cCh1NjQgY2dyb3VwX2lkKVxuK3tcbitcdHN0cnVjdCBjZ3JvdXBfbWVtY2cgY207XG4rXHRpbnQgaTtcbitcbitcdGlmIChnZXRfY2dyb3VwX21lbWNnX2Zyb21faWQoY2dyb3VwX2lkLCBcdTAwMjZjbSkpXG4rXHRcdHJldHVybiAwO1xuK1xuK1x0cmVjbGFpbV9jYWxscysrO1xuK1x0Zm9yIChpID0gMDsgaSBcdTAwM2MgUkVDTEFJTV9NQVhfSVRFUjsgaSsrKSB7XG4rXHRcdHU2NCBuciA9IGJwZl9wcm9hY3RpdmVfcmVjbGFpbShjbS5tZW1jZywgUkVDTEFJTV9TSVpFKTtcbitcbitcdFx0aWYgKCFucilcbitcdFx0XHRicmVhaztcbitcdFx0cmVjbGFpbWVkX3BhZ2VzICs9IG5yO1xuK1x0fVxuK1xuK1x0cHV0X2Nncm91cF9tZW1jZyhcdTAwMjZjbSk7XG4rXG4rXHRyZXR1cm4gMDtcbit9XG4rXG4rc3RydWN0IHdxX2VsZW0ge1xuK1x0c3RydWN0IGJwZl90aW1lciB0aW1lcjtcbitcdHN0cnVjdCBicGZfd3Egd29yaztcbitcdHU2NCBwcmV2X2V2ZW50O1xuK1x0dTY0IGV2ZW50X2RlbHRhX3RocmVzaG9sZDtcbitcdHU2NCBjaGVja19ucztcbit9O1xuK1xuK3N0cnVjdCB7XG4rXHRfX3VpbnQodHlwZSwgQlBGX01BUF9UWVBFX0FSUkFZKTtcbitcdF9fdWludChtYXhfZW50cmllcywgMSk7XG4rXHRfX3R5cGUoa2V5LCBfX3UzMik7XG4rXHRfX3R5cGUodmFsdWUsIHN0cnVjdCB3cV9lbGVtKTtcbit9IHdxX21hcCBTRUMoXCIubWFwc1wiKTtcbitcbitzdGF0aWMgaW50IGFzeW5jX2ZyZWUodm9pZCAqbWFwLCBpbnQgKmtleSwgdm9pZCAqdmFsdWUpXG4re1xuK1x0c3RydWN0IHdxX2VsZW0gKmVsZW0gPSB2YWx1ZTtcbitcbitcdGlmIChzaG91bGRfcmVjbGFpbV9jZ3JvdXAod3FfaGlnaF9jZ3JvdXBfaWQsIFx1MDAyNmVsZW0tXHUwMDNlcHJldl9ldmVudCxcbitcdFx0ZWxlbS1cdTAwM2VldmVudF9kZWx0YV90aHJlc2hvbGQpKSB7XG4rXHRcdHJlY2xhaW1fY2dyb3VwKHdxX2xvd19jZ3JvdXBfaWQpO1xuK1x0XHRicGZfd3Ffc3RhcnQoXHUwMDI2ZWxlbS1cdTAwM2V3b3JrLCAwKTtcbitcdH1cbitcbitcdHJldHVybiAwO1xuK31cbitcbitzdGF0aWMgaW50IHdxX3RpbWVyX2NiKHZvaWQgKm1hcCwgaW50ICprZXksIHN0cnVjdCB3cV9lbGVtICplbGVtKVxuK3tcbitcdGJwZl93cV9zdGFydChcdTAwMjZlbGVtLVx1MDAzZXdvcmssIDApO1xuK1x0YnBmX3RpbWVyX3N0YXJ0KFx1MDAyNmVsZW0tXHUwMDNldGltZXIsIGVsZW0tXHUwMDNlY2hlY2tfbnMsIDApO1xuK1xuK1x0cmV0dXJuIDA7XG4rfVxuK1xuK1NFQyhcInN5c2NhbGxcIilcbitpbnQgd3FfcHJvZ19pbml0KHN0cnVjdCBicGZfYXJnc19zICpjdHgpXG4re1xuK1x0c3RydWN0IHdxX2VsZW0gKmVsZW07XG4rXHRfX3UzMiBrZXkgPSAwO1xuK1x0aW50IHJldDtcbitcbitcdGVsZW0gPSBicGZfbWFwX2xvb2t1cF9lbGVtKFx1MDAyNndxX21hcCwgXHUwMDI2a2V5KTtcbitcdGlmICghZWxlbSlcbitcdFx0cmV0dXJuIC0xO1xuK1xuK1x0cmV0ID0gYnBmX3dxX2luaXQoXHUwMDI2ZWxlbS1cdTAwM2V3b3JrLCBcdTAwMjZ3cV9tYXAsIDApO1xuK1x0aWYgKHJldClcbitcdFx0cmV0dXJuIHJldDtcbitcbitcdHJldCA9IGJwZl93cV9zZXRfY2FsbGJhY2soXHUwMDI2ZWxlbS1cdTAwM2V3b3JrLCBhc3luY19mcmVlLCAwKTtcbitcdGlmIChyZXQpXG4rXHRcdHJldHVybiByZXQ7XG4rXG4rXHRyZXQgPSBicGZfdGltZXJfaW5pdChcdTAwMjZlbGVtLVx1MDAzZXRpbWVyLCBcdTAwMjZ3cV9tYXAsIENMT0NLX01PTk9UT05JQ19JRCk7XG4rXHRpZiAocmV0KVxuK1x0XHRyZXR1cm4gcmV0O1xuK1xuK1x0cmV0ID0gYnBmX3RpbWVyX3NldF9jYWxsYmFjayhcdTAwMjZlbGVtLVx1MDAzZXRpbWVyLCB3cV90aW1lcl9jYik7XG4rXHRpZiAocmV0KVxuK1x0XHRyZXR1cm4gcmV0O1xuK1xuK1x0ZWxlbS1cdTAwM2VwcmV2X2V2ZW50ID0gMDtcbitcdGVsZW0tXHUwMDNlZXZlbnRfZGVsdGFfdGhyZXNob2xkID0gY3R4LVx1MDAzZWV2ZW50X2RlbHRhX3RocmVzaG9sZDtcbitcdGVsZW0tXHUwMDNlY2hlY2tfbnMgPSBjdHgtXHUwMDNlY2hlY2tfbnM7XG4rXG4rXHR3cV9oaWdoX2Nncm91cF9pZCA9IGN0eC1cdTAwM2VoaWdoX2Nncm91cF9pZDtcbitcdHdxX2xvd19jZ3JvdXBfaWQgPSBjdHgtXHUwMDNlbG93X2Nncm91cF9pZDtcbitcbitcdHJldHVybiBicGZfdGltZXJfc3RhcnQoXHUwMDI2ZWxlbS1cdTAwM2V0aW1lciwgZWxlbS1cdTAwM2VjaGVja19ucywgMCk7XG4rfVxuK1xuK2NoYXIgTElDRU5TRVtdIFNFQyhcImxpY2Vuc2VcIikgPSBcIkdQTFwiO1xuIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDgtMTlUMDc6NDQ6MjEuNjgwODU3NjU4WiIsIlNlcSI6MywiTmVzdGluZyI6MiwiVHlwZSI6ImxsbSIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjEtcHJvLXByZXZpZXciLCJEdXJhdGlvbiI6NTk0ODQ0MTI1NCwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiKipNeSBJbml0aWFsIEFzc2Vzc21lbnQgb2YgdGhlIEJQRiBNZW1vcnkgUmVjbGFtYXRpb24gUGF0Y2gqKlxuXG5Pa2F5LCBzbyB3ZSd2ZSBnb3QgYSBuZXcgcGF0Y2ggaW50cm9kdWNpbmcgdHdvIEJQRiBrZnVuY3M6IGBicGZfcHJvYWN0aXZlX3JlY2xhaW1gIGFuZCBgYnBmX3Byb2FjdGl2ZV9yZWNsYWltX3N3YXBwaW5lc3NgLiBUaGUgd2hvbGUgcG9pbnQgc2VlbXMgdG8gYmUgZ2l2aW5nIEJQRiBwcm9ncmFtcyB0aGUgYWJpbGl0eSB0byBwcm9hY3RpdmVseSB0cmlnZ2VyIG1lbW9yeSByZWNsYW1hdGlvbiB3aXRoaW4gYSBtZW1vcnkgY2dyb3VwLiBUaGF0J3MgYSBwb3dlcmZ1bCB0b29sLCBhbmQgdGhlIGltcGxlbWVudGF0aW9uJ3MgaW4gYG1tL2JwZl9tZW1jb250cm9sLmNgLiBFc3NlbnRpYWxseSwgdGhlc2Uga2Z1bmNzIGFyZSB3cmFwcGVycyBhcm91bmQgYGJwZl9wcm9hY3RpdmVfcmVjbGFpbV9wYWdlc2AsIHdoaWNoIGluIHR1cm4gY2FsbHMgYHRyeV90b19mcmVlX21lbV9jZ3JvdXBfcGFnZXNgLlxuXG5UaGUgaW1wb3J0YW50IHF1ZXN0aW9uIGlzLCBhcmUgdGhlc2Uga2Z1bmNzIGV4cG9zZWQgdG8gdXNlcnNwYWNlPyBTaW5jZSB0aGV5J3JlIEJQRiBrZnVuY3MsIHRoZSBhbnN3ZXIgaXMgKnllcyouIEEgQlBGIHByb2dyYW0gY2FuIGRpcmVjdGx5IGludm9rZSB0aGVzZSwgd2hpY2ggaXMgYSBzaWduaWZpY2FudCBhcmNoaXRlY3R1cmFsIGRlY2lzaW9uLiBNeSBndXQgdGVsbHMgbWUgdGhpcyBpcyBzb21ldGhpbmcgd2UgYWJzb2x1dGVseSAqbmVlZCogdG8gZnV6eiBhZ2dyZXNzaXZlbHkuIFRoZSBwb3RlbnRpYWwgYXR0YWNrIHN1cmZhY2UgaGVyZSBpcyBjb25zaWRlcmFibGUsIGFuZCBldmVuIHN1YnRsZSBidWdzIGNvdWxkIGxlYWQgdG8gc2VyaW91cyBtZW1vcnkgbWFuYWdlbWVudCBpc3N1ZXMgb3IgZXZlbiBwcml2aWxlZ2UgZXNjYWxhdGlvbi5cblxuTm93LCBsZXQncyBkaXZlIGRlZXBlciBpbnRvIHRoZSBpbXBsZW1lbnRhdGlvbiBvZiBgYnBmX3Byb2FjdGl2ZV9yZWNsYWltYCBhbmQgYGJwZl9wcm9hY3RpdmVfcmVjbGFpbV9zd2FwcGluZXNzYC4gSSBuZWVkIHRvIHVuZGVyc3RhbmQgdGhlIHNwZWNpZmljcyBvZiBob3cgdGhleSBpbnRlcmFjdCB3aXRoIHRoZSBjb3JlIG1lbW9yeSBtYW5hZ2VtZW50IHN1YnN5c3RlbXMuIEFuZCBJIHNob3VsZCBjaGVjayB0aGF0IGBtbS9icGZfbWVtY29udHJvbC5jYCBpcyBjb21waWxlZCBiYXNlZCBvbiB0aGUgcmlnaHQgY29uZmlndXJhdGlvbiBvcHRpb25zLCB3aGljaCBtZWFucyBJIHNob3VsZCBjaGVjayBgbW0vTWFrZWZpbGVgLiBXZeKAmXJlIGdvaW5nIHRvIG5lZWQgYm90aCBgQ09ORklHX01FTUNHYCBhbmQgYENPTkZJR19CUEZfU1lTQ0FMTGAgdG8gYmUgZW5hYmxlZCwgYXMgZXhwZWN0ZWQuXG5cblxuIiwiSW5wdXRUb2tlbnMiOjEwNTA4LCJPdXRwdXRUb2tlbnMiOjIxLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MjQ0LCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDgtMTlUMDc6NDQ6MjcuNjI5MzAxOTcyWiIsIlNlcSI6NCwiTmVzdGluZyI6MiwiVHlwZSI6InRvb2wiLCJOYW1lIjoiZ3JlcHBlciIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjMyMzMwNzU3NjcsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJFeHByZXNzaW9uXCI6IFwiYnBmX21lbWNvbnRyb2wub1wiXG59IiwiUmVzdWx0cyI6IntcbiAgXCJPdXRwdXRcIjogXCJtbS9NYWtlZmlsZT0xMDY9aWZkZWYgQ09ORklHX0JQRl9TWVNDQUxMXFxubW0vTWFrZWZpbGU6MTA3Om9iai0kKENPTkZJR19NRU1DRykgKz0gYnBmX21lbWNvbnRyb2wub1xcbm1tL01ha2VmaWxlLTEwOC1lbmRpZlxcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOC0xOVQwNzo0NDozMC44NjIzODcxMjlaIiwiU2VxIjo1LCJOZXN0aW5nIjoyLCJUeXBlIjoibGxtIiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuMS1wcm8tcHJldmlldyIsIkR1cmF0aW9uIjo3MjMyNzI4ODk1LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIqKktlcm5lbCBDb25maWd1cmF0aW9uIGZvciBCUEYgUHJvYWN0aXZlIFJlY2xhaW0qKlxuXG5Pa2F5LCBzbyBJJ20gbG9va2luZyBpbnRvIHRoZSBjb25maWd1cmF0aW9ucyBuZWVkZWQgdG8gZW5hYmxlIGFuZCB1c2UgYGJwZl9wcm9hY3RpdmVfcmVjbGFpbWAuIFJpZ2h0IG9mZiB0aGUgYmF0LCBJIGtub3cgSSdsbCBuZWVkIGBDT05GSUdfTUVNQ0dgIGFuZCBgQ09ORklHX0JQRl9TWVNDQUxMYC4gVGhvc2UgYXJlIHByZXR0eSBmdW5kYW1lbnRhbC4gTm93LCBsZXQncyB6b29tIGluIG9uIGBicGZfcHJvYWN0aXZlX3JlY2xhaW1gIGFuZCBgYnBmX3Byb2FjdGl2ZV9yZWNsYWltX3N3YXBwaW5lc3NgLiBUaGUgZmFjdCB0aGF0IHRoZXkncmUgZXhwb3NlZCBhcyBCUEYga2Z1bmNzIGlzIGtleSBoZXJlLCBhbmQgSSdsbCBuZWVkIHRvIG1ha2Ugc3VyZSB0aG9zZSBzeW1ib2xzIGFyZSBhY2Nlc3NpYmxlLlxuXG5JJ2xsIHF1aWNrbHkgc2NhbiBmb3IgYW55IG90aGVyIGRlcGVuZGVuY2llcywgdGhvdWdoIEknbSBndWVzc2luZyBgQ09ORklHX01FTUNHYCB3aWxsIGJlIHRoZSBwcmltYXJ5IHJlcXVpcmVtZW50LiBgQ09ORklHX0JQRl9TWVNDQUxMYCBpcyBwcmV0dHkgbXVjaCBzdGFuZGFyZCBmb3IgYW55IEJQRi1yZWxhdGVkIHdvcmssIHNvIHRoYXQncyBwcm9iYWJseSBjb3ZlcmVkLiBOZXh0LCBJIG5lZWQgdG8gdmVyaWZ5IHRoYXQgYHRyeV90b19mcmVlX21lbV9jZ3JvdXBfcGFnZXNgIGlzIGNvbnNpc3RlbnRseSBhdmFpbGFibGUuIEl0IHdvdWxkIGJlIGEgYml0IG9mIGEgbmlnaHRtYXJlIGlmIHRoYXQgd2VyZW4ndCB0aGUgY2FzZSFcblxuXG4iLCJJbnB1dFRva2VucyI6MTExODUsIk91dHB1dFRva2VucyI6MjYsIk91dHB1dFRob3VnaHRzVG9rZW5zIjoxNTMsIlRvb2xDYWxscyI6WyJncmVwcGVyIl19LHsiU3RhcnRlZCI6IjIwMjYtMDgtMTlUMDc6NDQ6MzguMDk1MTE5MDA0WiIsIlNlcSI6NiwiTmVzdGluZyI6MiwiVHlwZSI6InRvb2wiLCJOYW1lIjoiZ3JlcHBlciIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjIxNjIzMDA0MTksIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJFeHByZXNzaW9uXCI6IFwidHJ5X3RvX2ZyZWVfbWVtX2Nncm91cF9wYWdlc1wiXG59IiwiUmVzdWx0cyI6IntcbiAgXCJPdXRwdXRcIjogXCJpbmNsdWRlL2xpbnV4L3N3YXAuaD0zNTU9dW5zaWduZWQgbG9uZyBscnV2ZWNfbHJ1X3NpemUoc3RydWN0IGxydXZlYyAqbHJ1dmVjLCBlbnVtIGxydV9saXN0IGxydSwgaW50IHpvbmVfaWR4KTtcXG4tLVxcbmluY2x1ZGUvbGludXgvc3dhcC5oLTM2NC1cXG5pbmNsdWRlL2xpbnV4L3N3YXAuaDozNjU6ZXh0ZXJuIHVuc2lnbmVkIGxvbmcgdHJ5X3RvX2ZyZWVfbWVtX2Nncm91cF9wYWdlcyhzdHJ1Y3QgbWVtX2Nncm91cCAqbWVtY2csXFxuaW5jbHVkZS9saW51eC9zd2FwLmgtMzY2LVxcdFxcdFxcdFxcdFxcdFxcdCAgdW5zaWduZWQgbG9uZyBucl9wYWdlcyxcXG4tLVxcbm1tL2JwZl9tZW1jb250cm9sLmM9MTU4PV9fYnBmX2tmdW5jIHZvaWQgYnBmX21lbV9jZ3JvdXBfZmx1c2hfc3RhdHMoc3RydWN0IG1lbV9jZ3JvdXAgKm1lbWNnKVxcbi0tXFxubW0vYnBmX21lbWNvbnRyb2wuYy0xNjMtLypcXG5tbS9icGZfbWVtY29udHJvbC5jOjE2NDogKiBSZWNsYWltIG11c3Qgbm90IHJlY3Vyc2UuIHRyeV90b19mcmVlX21lbV9jZ3JvdXBfcGFnZXMoKSB1bmNvbmRpdGlvbmFsbHlcXG5tbS9icGZfbWVtY29udHJvbC5jLTE2NS0gKiBvdmVyd3JpdGVzIGN1cnJlbnQtXFx1MDAzZXJlY2xhaW1fc3RhdGUgb24gZW50cnkgYW5kIHJlc2V0cyBpdCB0byBOVUxMIG9uIGV4aXQuXFxuLS1cXG5tbS9icGZfbWVtY29udHJvbC5jLTE2OS0gKiBUaGUgZ3VhcmQgaXMgUEZfTUVNQUxMT0MuIEV2ZXJ5IHJlY2xhaW0gZW50cnkgcG9pbnQgbWFya3MgdGhlIGN1cnJlbnRcXG5tbS9icGZfbWVtY29udHJvbC5jOjE3MDogKiB0YXNrIHdpdGggaXQgZm9yIHRoZSB3aG9sZSByZWNsYWltIHdpbmRvdzogdHJ5X3RvX2ZyZWVfbWVtX2Nncm91cF9wYWdlcygpXFxubW0vYnBmX21lbWNvbnRyb2wuYy0xNzEtICogYW5kIF9fcGVyZm9ybV9yZWNsYWltKCkgZG8gc28gdmlhIG1lbWFsbG9jX25vcmVjbGFpbV9zYXZlKCksIGFuZCBrc3dhcGRcXG4tLVxcbm1tL2JwZl9tZW1jb250cm9sLmMtMTc3LSAqXFxubW0vYnBmX21lbWNvbnRyb2wuYzoxNzg6ICogSW4gdHJ5X3RvX2ZyZWVfbWVtX2Nncm91cF9wYWdlcygpLCByZWNsYWltX3N0YXRlIGlzIHNldCBzbGlnaHRseSBiZWZvcmVcXG5tbS9icGZfbWVtY29udHJvbC5jLTE3OS0gKiBQRl9NRU1BTExPQywgd2l0aCBvbmx5IGEgdHJhY2Vwb2ludCBpbiBiZXR3ZWVuLCB3aGljaCBhIHNsZWVwYWJsZSBCUEZcXG4tLVxcbm1tL2JwZl9tZW1jb250cm9sLmM9MTk2PWJwZl9wcm9hY3RpdmVfcmVjbGFpbV9wYWdlcyhzdHJ1Y3QgbWVtX2Nncm91cCAqbWVtY2csIHVuc2lnbmVkIGxvbmcgbnJfcGFnZXMsXFxuLS1cXG5tbS9icGZfbWVtY29udHJvbC5jLTIwMS1cXG5tbS9icGZfbWVtY29udHJvbC5jOjIwMjpcXHRyZXR1cm4gdHJ5X3RvX2ZyZWVfbWVtX2Nncm91cF9wYWdlcyhtZW1jZywgbnJfcGFnZXMsIEdGUF9LRVJORUwsXFxubW0vYnBmX21lbWNvbnRyb2wuYy0yMDMtXFx0XFx0XFx0XFx0XFx0ICAgIE1FTUNHX1JFQ0xBSU1fTUFZX1NXQVAgfFxcbi0tXFxubW0vbWVtY29udHJvbC12MS5jPTE0ODE9c3RhdGljIGludCBtZW1fY2dyb3VwX3Jlc2l6ZV9tYXgoc3RydWN0IG1lbV9jZ3JvdXAgKm1lbWNnLFxcbi0tXFxubW0vbWVtY29udHJvbC12MS5jLTE1MjEtXFxubW0vbWVtY29udHJvbC12MS5jOjE1MjI6XFx0XFx0aWYgKCF0cnlfdG9fZnJlZV9tZW1fY2dyb3VwX3BhZ2VzKG1lbWNnLCAxLCBHRlBfS0VSTkVMLFxcbm1tL21lbWNvbnRyb2wtdjEuYy0xNTIzLVxcdFxcdFxcdFxcdG1lbXN3ID8gMCA6IE1FTUNHX1JFQ0xBSU1fTUFZX1NXQVAsIE5VTEwpKSB7XFxuLS1cXG5tbS9tZW1jb250cm9sLXYxLmM9MTU0MD1zdGF0aWMgaW50IG1lbV9jZ3JvdXBfZm9yY2VfZW1wdHkoc3RydWN0IG1lbV9jZ3JvdXAgKm1lbWNnKVxcbi0tXFxubW0vbWVtY29udHJvbC12MS5jLTE1NTMtXFxubW0vbWVtY29udHJvbC12MS5jOjE1NTQ6XFx0XFx0aWYgKCF0cnlfdG9fZnJlZV9tZW1fY2dyb3VwX3BhZ2VzKG1lbWNnLCAxLCBHRlBfS0VSTkVMLFxcbm1tL21lbWNvbnRyb2wtdjEuYy0xNTU1LVxcdFxcdFxcdFxcdFxcdFxcdCAgTUVNQ0dfUkVDTEFJTV9NQVlfU1dBUCwgTlVMTCkpXFxuLS1cXG5tbS9tZW1jb250cm9sLmM9MjMyOD1zdGF0aWMgdW5zaWduZWQgbG9uZyByZWNsYWltX2hpZ2goc3RydWN0IG1lbV9jZ3JvdXAgKm1lbWNnLFxcbi0tXFxubW0vbWVtY29udHJvbC5jLTIzNDMtXFx0XFx0cHNpX21lbXN0YWxsX2VudGVyKFxcdTAwMjZwZmxhZ3MpO1xcbm1tL21lbWNvbnRyb2wuYzoyMzQ0OlxcdFxcdG5yX3JlY2xhaW1lZCArPSB0cnlfdG9fZnJlZV9tZW1fY2dyb3VwX3BhZ2VzKG1lbWNnLCBucl9wYWdlcyxcXG5tbS9tZW1jb250cm9sLmMtMjM0NS1cXHRcXHRcXHRcXHRcXHRcXHRcXHRnZnBfbWFzayxcXG4tLVxcbm1tL21lbWNvbnRyb2wuYz0yNTk1PXN0YXRpYyBpbnQgdHJ5X2NoYXJnZV9tZW1jZyhzdHJ1Y3QgbWVtX2Nncm91cCAqbWVtY2csIGdmcF90IGdmcF9tYXNrLFxcbi0tXFxubW0vbWVtY29udHJvbC5jLTI2NTQtXFx0cHNpX21lbXN0YWxsX2VudGVyKFxcdTAwMjZwZmxhZ3MpO1xcbm1tL21lbWNvbnRyb2wuYzoyNjU1OlxcdG5yX3JlY2xhaW1lZCA9IHRyeV90b19mcmVlX21lbV9jZ3JvdXBfcGFnZXMobWVtX292ZXJfbGltaXQsIG5yX3BhZ2VzLFxcbm1tL21lbWNvbnRyb2wuYy0yNjU2LVxcdFxcdFxcdFxcdFxcdFxcdCAgICBnZnBfbWFzaywgcmVjbGFpbV9vcHRpb25zLCBOVUxMKTtcXG4tLVxcbm1tL21lbWNvbnRyb2wuYz00NzY4PXN0YXRpYyBzc2l6ZV90IG1lbW9yeV9oaWdoX3dyaXRlKHN0cnVjdCBrZXJuZnNfb3Blbl9maWxlICpvZixcXG4tLVxcbm1tL21lbWNvbnRyb2wuYy00ODAyLVxcbm1tL21lbWNvbnRyb2wuYzo0ODAzOlxcdFxcdHJlY2xhaW1lZCA9IHRyeV90b19mcmVlX21lbV9jZ3JvdXBfcGFnZXMobWVtY2csIG5yX3BhZ2VzIC0gaGlnaCxcXG5tbS9tZW1jb250cm9sLmMtNDgwNC1cXHRcXHRcXHRcXHRcXHRHRlBfS0VSTkVMLCBNRU1DR19SRUNMQUlNX01BWV9TV0FQLCBOVUxMKTtcXG4tLVxcbm1tL21lbWNvbnRyb2wuYz00ODIwPXN0YXRpYyBzc2l6ZV90IG1lbW9yeV9tYXhfd3JpdGUoc3RydWN0IGtlcm5mc19vcGVuX2ZpbGUgKm9mLFxcbi0tXFxubW0vbWVtY29udHJvbC5jLTQ4NTQtXFx0XFx0aWYgKG5yX3JlY2xhaW1zKSB7XFxubW0vbWVtY29udHJvbC5jOjQ4NTU6XFx0XFx0XFx0aWYgKCF0cnlfdG9fZnJlZV9tZW1fY2dyb3VwX3BhZ2VzKG1lbWNnLCBucl9wYWdlcyAtIG1heCxcXG5tbS9tZW1jb250cm9sLmMtNDg1Ni1cXHRcXHRcXHRcXHRcXHRHRlBfS0VSTkVMLCBNRU1DR19SRUNMQUlNX01BWV9TV0FQLCBOVUxMKSlcXG4tLVxcbm1tL3Ztc2Nhbi5jPTY3MjI9dW5zaWduZWQgbG9uZyBtZW1fY2dyb3VwX3Nocmlua19ub2RlKHN0cnVjdCBtZW1fY2dyb3VwICptZW1jZyxcXG4tLVxcbm1tL3Ztc2Nhbi5jLTY3NjEtXFxubW0vdm1zY2FuLmM6Njc2Mjp1bnNpZ25lZCBsb25nIHRyeV90b19mcmVlX21lbV9jZ3JvdXBfcGFnZXMoc3RydWN0IG1lbV9jZ3JvdXAgKm1lbWNnLFxcbm1tL3Ztc2Nhbi5jLTY3NjMtXFx0XFx0XFx0XFx0XFx0ICAgdW5zaWduZWQgbG9uZyBucl9wYWdlcyxcXG4tLVxcbm1tL3Ztc2Nhbi5jLTY4MDItI2Vsc2VcXG5tbS92bXNjYW4uYzo2ODAzOnVuc2lnbmVkIGxvbmcgdHJ5X3RvX2ZyZWVfbWVtX2Nncm91cF9wYWdlcyhzdHJ1Y3QgbWVtX2Nncm91cCAqbWVtY2csXFxubW0vdm1zY2FuLmMtNjgwNC1cXHRcXHRcXHRcXHRcXHQgICB1bnNpZ25lZCBsb25nIG5yX3BhZ2VzLFxcbi0tXFxubW0vdm1zY2FuLmM9Nzg2Nj1pbnQgdXNlcl9wcm9hY3RpdmVfcmVjbGFpbShjaGFyICpidWYsXFxuLS1cXG5tbS92bXNjYW4uYy03OTMzLVxcdFxcdFxcdFxcdFxcdCAgTUVNQ0dfUkVDTEFJTV9QUk9BQ1RJVkU7XFxubW0vdm1zY2FuLmM6NzkzNDpcXHRcXHRcXHRyZWNsYWltZWQgPSB0cnlfdG9fZnJlZV9tZW1fY2dyb3VwX3BhZ2VzKG1lbWNnLFxcbm1tL3Ztc2Nhbi5jLTc5MzUtXFx0XFx0XFx0XFx0XFx0XFx0IGJhdGNoX3NpemUsIGdmcF9tYXNrLFxcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOC0xOVQwNzo0NDo0MC4yNTc0MjUzNzJaIiwiU2VxIjo3LCJOZXN0aW5nIjoyLCJUeXBlIjoibGxtIiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuMS1wcm8tcHJldmlldyIsIkR1cmF0aW9uIjo2Mjc0NTc3NzM2LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIqKk15IEFzc2Vzc21lbnQgb2YgdGhlIE1lbW9yeSBDZ3JvdXAgQlBGIEtmdW5jIEFkZGl0aW9uKipcblxuT2theSwgc28gdGhpcyBwYXRjaCBpbnRyb2R1Y2VzIGEgY291cGxlIG9mIG5ldyBCUEYga2Z1bmNzOiBgYnBmX3Byb2FjdGl2ZV9yZWNsYWltYCBhbmQgYGJwZl9wcm9hY3RpdmVfcmVjbGFpbV9zd2FwcGluZXNzYC4gVGhlIGNvcmUgaWRlYSBpcyB0aGF0IEJQRiBwcm9ncmFtcyB3aWxsIG5vdyBiZSBhYmxlIHRvIHByb2FjdGl2ZWx5IHRyaWdnZXIgbWVtb3J5IHJlY2xhaW0gb3BlcmF0aW9ucyB3aXRoaW4gYSBtZW1vcnkgY2dyb3VwLiBUaGlzIGlzIHNpZ25pZmljYW50IGJlY2F1c2UgaXQncyBnaXZpbmcgQlBGIGRpcmVjdCBhY2Nlc3MgdG8gY29yZSBtZW1vcnkgbWFuYWdlbWVudCBsb2dpYy4gV2UncmUgZWZmZWN0aXZlbHkgZXhwb3NpbmcgYSBjcnVjaWFsIHBhcnQgb2YgdGhlIGtlcm5lbCdzIG1lbW9yeSBtYW5hZ2VtZW50IHRvIHRoZSBCUEYgZG9tYWluLCB3aGljaCBpcyBhIGJpZyBkZWFsIGluIHRlcm1zIG9mIHByb2dyYW1tYWJpbGl0eSBhbmQgY29udHJvbC5cblxuRnJvbSBhIGNvbmZpZ3VyYXRpb24gc3RhbmRwb2ludCwgaXQgbG9va3Mgc3RyYWlnaHRmb3J3YXJkLiBJIG5lZWQgdG8gZW5zdXJlIHRoYXQgYE1FTUNHYCBhbmQgYEJQRl9TWVNDQUxMYCBhcmUgZW5hYmxlZC4gSSdsbCBkb3VibGUtY2hlY2sgdG8gbWFrZSBhYnNvbHV0ZWx5IGNlcnRhaW4gdGhlcmUgYXJlbid0IGFueSBvdGhlciBkZXBlbmRlbmNpZXMsIGJ1dCB0aG9zZSBzaG91bGQgYmUgdGhlIHByaW1hcnkgcmVxdWlyZW1lbnRzLiBgQ09ORklHX01FTUNHYCBpcywgb2YgY291cnNlLCBjcml0aWNhbCBmb3IgdGhlIHdob2xlIG1lbW9yeSBjZ3JvdXAgY29udGV4dCwgYW5kIGBDT05GSUdfQlBGX1NZU0NBTExgIGlzIHN0YW5kYXJkIGZvciBCUEYgZnVuY3Rpb25hbGl0eS5cblxuQWxyaWdodCwgdGhhdCdzIG15IHVuZGVyc3RhbmRpbmcsIEkgd2lsbCBzZXQgdGhvc2UgcmVzdWx0cy5cblxuXG4iLCJJbnB1dFRva2VucyI6MTMyNDQsIk91dHB1dFRva2VucyI6MTQ2LCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MTU3LCJUb29sQ2FsbHMiOlsiZ3JlcHBlciJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTE5VDA3OjQ0OjQ2LjUzMjAwNTExOVoiLCJTZXEiOjgsIk5lc3RpbmciOjIsIlR5cGUiOiJ0b29sIiwiTmFtZSI6InNldC1yZXN1bHRzIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6NzA2ODIxNTcsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJFbmFibGVDb25maWdzXCI6IFtcbiAgICBcIk1FTUNHXCIsXG4gICAgXCJCUEZfU1lTQ0FMTFwiXG4gIF0sXG4gIFwiRm9jdXNTeW1ib2xzXCI6IFtcbiAgICBcImJwZl9wcm9hY3RpdmVfcmVjbGFpbVwiLFxuICAgIFwiYnBmX3Byb2FjdGl2ZV9yZWNsYWltX3N3YXBwaW5lc3NcIlxuICBdLFxuICBcIlJlYXNvbmluZ1wiOiBcIlRoZSBwYXRjaCBpbnRyb2R1Y2VzIHR3byBuZXcgQlBGIGtmdW5jcywgYGJwZl9wcm9hY3RpdmVfcmVjbGFpbWAgYW5kIGBicGZfcHJvYWN0aXZlX3JlY2xhaW1fc3dhcHBpbmVzc2AsIHdoaWNoIGFsbG93IEJQRiBwcm9ncmFtcyB0byBwcm9hY3RpdmVseSB0cmlnZ2VyIG1lbW9yeSByZWNsYWltIG9uIGEgbWVtb3J5IGNncm91cC4gVGhpcyBleHBvc2VzIGNvcmUgbWVtb3J5IG1hbmFnZW1lbnQgYW5kIHJlY2xhaW0gbG9naWMgdG8gQlBGLCBtYWtpbmcgaXQgYSBmdW5jdGlvbmFsIGNoYW5nZSB0aGF0IGlzIGhpZ2hseSByZWFjaGFibGUgYW5kIHdvcnRoIGZ1enppbmcuXCIsXG4gIFwiV29ydGhGdXp6aW5nXCI6IHRydWVcbn0iLCJSZXN1bHRzIjoie1xuICBcIkVuYWJsZUNvbmZpZ3NcIjogW1xuICAgIFwiTUVNQ0dcIixcbiAgICBcIkJQRl9TWVNDQUxMXCJcbiAgXSxcbiAgXCJGb2N1c1N5bWJvbHNcIjogW1xuICAgIFwiYnBmX3Byb2FjdGl2ZV9yZWNsYWltXCIsXG4gICAgXCJicGZfcHJvYWN0aXZlX3JlY2xhaW1fc3dhcHBpbmVzc1wiXG4gIF0sXG4gIFwiUmVhc29uaW5nXCI6IFwiVGhlIHBhdGNoIGludHJvZHVjZXMgdHdvIG5ldyBCUEYga2Z1bmNzLCBgYnBmX3Byb2FjdGl2ZV9yZWNsYWltYCBhbmQgYGJwZl9wcm9hY3RpdmVfcmVjbGFpbV9zd2FwcGluZXNzYCwgd2hpY2ggYWxsb3cgQlBGIHByb2dyYW1zIHRvIHByb2FjdGl2ZWx5IHRyaWdnZXIgbWVtb3J5IHJlY2xhaW0gb24gYSBtZW1vcnkgY2dyb3VwLiBUaGlzIGV4cG9zZXMgY29yZSBtZW1vcnkgbWFuYWdlbWVudCBhbmQgcmVjbGFpbSBsb2dpYyB0byBCUEYsIG1ha2luZyBpdCBhIGZ1bmN0aW9uYWwgY2hhbmdlIHRoYXQgaXMgaGlnaGx5IHJlYWNoYWJsZSBhbmQgd29ydGggZnV6emluZy5cIixcbiAgXCJXb3J0aEZ1enppbmdcIjogdHJ1ZVxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDgtMTlUMDc6NDQ6NDYuNjAyNjk0MDY2WiIsIlNlcSI6OSwiTmVzdGluZyI6MSwiVHlwZSI6ImFjdGlvbiIsIk5hbWUiOiJJZiIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjE0MTQ3NDUyNjMwLCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiV29ydGhGdXp6aW5nXCI6IHRydWVcbn0iLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDgtMTlUMDc6NDQ6NDYuNjAzMjQzMDE2WiIsIlNlcSI6MTAsIk5lc3RpbmciOjIsIlR5cGUiOiJhZ2VudCIsIk5hbWUiOiJrbXNhbi1ldmFsdWF0b3IiLCJNb2RlbCI6ImJlc3QtZXhwZW5zaXZlIiwiRHVyYXRpb24iOjE0MTQ2ODk5OTEwLCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6IntcbiAgXCJLTVNBTlJlYXNvbmluZ1wiOiBcIlRoZSBwYXRjaCBpbnRyb2R1Y2VzIHR3byBuZXcgQlBGIGtmdW5jcyAoYGJwZl9wcm9hY3RpdmVfcmVjbGFpbWAgYW5kIGBicGZfcHJvYWN0aXZlX3JlY2xhaW1fc3dhcHBpbmVzc2ApIHRoYXQgd3JhcCB0aGUgZXhpc3RpbmcgYHRyeV90b19mcmVlX21lbV9jZ3JvdXBfcGFnZXNgIGZ1bmN0aW9uIHRvIGFsbG93IEJQRiBwcm9ncmFtcyB0byB0cmlnZ2VyIHByb2FjdGl2ZSBtZW1vcnkgcmVjbGFpbSBmb3IgYSBtZW1vcnkgY2dyb3VwLiBUaGUgYXJndW1lbnRzIHBhc3NlZCB0byB0aGVzZSBrZnVuY3MgYXJlIHNjYWxhciB2YWx1ZXMgYW5kIHBvaW50ZXJzIHZlcmlmaWVkIGJ5IHRoZSBCUEYgdmVyaWZpZXIsIGVuc3VyaW5nIHRoZXkgYXJlIGluaXRpYWxpemVkLiBUaGUgcGF0Y2ggZG9lcyBub3QgaW50cm9kdWNlIGFueSBuZXcgZGF0YSBzdHJ1Y3R1cmVzIGNvcGllZCB0byBvciBmcm9tIHVzZXJzcGFjZSwgbm9yIGRvZXMgaXQgYWxsb2NhdGUgY29tcGxleCBzdHJ1Y3R1cmVzIHRoYXQgbWlnaHQgYmUgbGVmdCBwYXJ0aWFsbHkgdW5pbml0aWFsaXplZC4gVGhlcmUgaXMgbm8gcmlzayBvZiB1bmluaXRpYWxpemVkIG1lbW9yeSBiZWluZyBsZWFrZWQgdG8gdXNlcnNwYWNlIG9yIHVzZWQgaW4gY29udHJvbCBmbG93IGRlY2lzaW9ucy4gQW55IHBvdGVudGlhbCBtZW1vcnkgc2FmZXR5IGlzc3VlcyBpbnRyb2R1Y2VkIGJ5IHRoZXNlIGNoYW5nZXMgKHN1Y2ggYXMgdXNlLWFmdGVyLWZyZWUgb3Igb3V0LW9mLWJvdW5kcyBhY2Nlc3NlcyBvbiB0aGUgYG1lbV9jZ3JvdXBgIHBvaW50ZXIpIHdvdWxkIGJlIGVmZmVjdGl2ZWx5IGNhdWdodCBieSBLQVNBTiBhbmQgdGhlIHN0YW5kYXJkIEJQRiB2ZXJpZmllciBjaGVja3MuIFRoZXJlZm9yZSwgYSBkZWRpY2F0ZWQgS01TQU4gZnV6emluZyBzZXNzaW9uIGlzIG5vdCByZXF1aXJlZC5cIixcbiAgXCJOZWVkc0tNU0FOXCI6IGZhbHNlXG59IiwiSW5zdHJ1Y3Rpb24iOiJZb3UgYXJlIGFuIGV4cGVydCBMaW51eCBrZXJuZWwgc2VjdXJpdHkgZW5naW5lZXIgc3BlY2lhbGl6aW5nIGluIGtlcm5lbCBtZW1vcnlcbmVycm9yIGRldGVjdG9ycyAoS0FTQU4gYW5kIEtNU0FOKS4gWW91ciBqb2IgaXMgdG8gcmV2aWV3IHRoZSBwcm92aWRlZCBwYXRjaCBzZXJpZXMgYW5kXG5kZXRlcm1pbmUgaWYgdGhlIGNvZGUgY2hhbmdlcyBqdXN0aWZ5IHNwYXduaW5nIGEgZGVkaWNhdGVkIEtNU0FOIChLZXJuZWxNZW1vcnlTYW5pdGl6ZXIpXG5mdXp6aW5nIHNlc3Npb24gaW4gYWRkaXRpb24gdG8gc3RhbmRhcmQgS0FTQU4gZnV6emluZy5cblxuQ1JJVElDQUwgRElTVElOQ1RJT04gQkVUV0VFTiBLQVNBTiBBTkQgS01TQU46XG4tIFN0YW5kYXJkIEtBU0FOIGtlcm5lbCBidWlsZHMgKHVwc3RyZWFtLWFwcGFybW9yLWthc2FuLmNvbmZpZykgYWxyZWFkeSBlbmFibGVcbiAgYSBjb21wcmVoZW5zaXZlIHN1aXRlIG9mIGRlYnVnZ2luZyB0b29scyBhbmQgc2FuaXRpemVycywgaW5jbHVkaW5nIEtBU0FOXG4gIChvdXQtb2YtYm91bmRzIGFjY2Vzc2VzLCB1c2UtYWZ0ZXItZnJlZSwgZG91YmxlIGZyZWUsIGludmFsaWQgZnJlZSksIExPQ0tERVBcbiAgKGxvY2tpbmcgYnVncyBhbmQgZGVhZGxvY2tzKSwgVUItc2FuaXRpemVycywgYW5kIG1lbW9yeSBjb3JydXB0aW9uIGNoZWNrcy5cbi0gS01TQU4gKEtlcm5lbE1lbW9yeVNhbml0aXplcikgZGV0ZWN0cyByZWFkcyBvZiBVTklOSVRJQUxJWkVEIG1lbW9yeSAoc3RhY2ssIGhlYXAsXG4gIG9yIHBhZ2UgYWxsb2NhdGlvbnMpIGFuZCBrZXJuZWwtdG8tdXNlciBtZW1vcnkgaW5mby1sZWFrcy5cblxuUnVsZTogVEhFUkUgSVMgTk8gU0VOU0UgSU4gUlVOTklORyBBIEtNU0FOIFNFU1NJT04gSUYgQSBCVUcgQ0FOIEJFIENBVUdIVCBCWSBLQVNBTixcbkxPQ0tERVAsIE9SIE9USEVSIFNUQU5EQVJEIEJVRyBERVRFQ1RPUlMuXG5BIGRlZGljYXRlZCBLTVNBTiBmdXp6aW5nIHNlc3Npb24gaW5jdXJzIHNpZ25pZmljYW50IHJlc291cmNlIGNvc3RzLiBZb3UgbXVzdCBPTkxZXG5zZXQgTmVlZHNLTVNBTj10cnVlIGlmIHRoZSBjb2RlIGNoYW5nZXMgaW50cm9kdWNlIG9yIGV4cG9zZSBVTklOSVRJQUxJWkVEIE1FTU9SWSByaXNrc1xudGhhdCBhcmUgZGV0ZWN0ZWQgT05MWSBieSBLTVNBTi5cblxuTG9vayBob2xpc3RpY2FsbHkgYXQgdGhlIHBhdGNoIHNlcmllcyBhbmQgc3Vycm91bmRpbmcgY29kZS4gRXZlbiBpZiBubyBkaXJlY3RcbnVuaW5pdGlhbGl6ZWQgZmllbGQgYWNjZXNzZXMgb3IgbmV3IGJ1ZmZlciBhbGxvY2F0aW9ucyBhcmUgYWRkZWQgaW4gdGhlIGRpZmYgaXRzZWxmLFxuYSBwYXRjaCBtYXkgYWx0ZXIgY29udHJvbCBmbG93LCBib3VuZHMgY2hlY2tpbmcsIG9yIGRhdGEgbGVuZ3RoIGNhbGN1bGF0aW9ucyBpbiB3YXlzXG50aGF0IGNoYW5nZSBob3cgdGhlIHJlc3Qgb2YgdGhlIGNvZGUgb3BlcmF0ZXMgb24gZXhpc3RpbmcgYnVmZmVycyAoZS5nLiBhbGxvd2luZ1xudW5pbml0aWFsaXplZCBzdGFjay9oZWFwIG1lbW9yeSB0byBiZSByZWFkLCBjb3BpZWQgdG8gdXNlciBzcGFjZSwgb3IgdXNlZCBpbiBjb250cm9sXG5mbG93KS4gRG8gbm90IGhlc2l0YXRlIHRvIHVzZSB5b3VyIGNvZGUgYWNjZXNzIHRvb2xzIHRvIGluc3BlY3QgdGhlIHN1cnJvdW5kaW5nIGNvZGUsXG5jYWxsZWQgZnVuY3Rpb25zLCBhbmQgY2FsbGVycy5cblxuU2V0IE5lZWRzS01TQU49dHJ1ZSBPTkxZIElGIHRoZSBwYXRjaCBpbnRyb2R1Y2VzIG9yIG1vZGlmaWVzOlxuMS4gS2VybmVsIHN0cnVjdHVyZXMgc2VudCB0byB1c2VyIHNwYWNlICh2aWEgY29weV90b191c2VyLCBwdXRfdXNlciwgbmV0bGluayBza2JcbiAgIGF0dHJpYnV0ZXMsIGlvY3RsIG91dHB1dCBhcmd1bWVudHMsIHNvY2tldCBvcHRpb25zLCBvciBCUEYgYnVmZmVycykgd2hlcmUgZmllbGRzXG4gICBvciBzdHJ1Y3R1cmUgcGFkZGluZyBtaWdodCBub3QgYmUgZnVsbHkgaW5pdGlhbGl6ZWQvemVyb2VkLlxuMi4gQ29uZGl0aW9uYWwgbG9naWMgb3IgYnJhbmNoaW5nIHRoYXQgZGVwZW5kcyBvbiBwb3RlbnRpYWxseSB1bmluaXRpYWxpemVkIHZhcmlhYmxlc1xuICAgb3Igc3RydWN0IGZpZWxkcy5cbjMuIEFsbG9jYXRpb24gb3IgaW5pdGlhbGl6YXRpb24gb2YgY29tcGxleCBkYXRhIHN0cnVjdHVyZXMgd2hlcmUgdW5pbml0aWFsaXplZCBmaWVsZHNcbiAgIGNvdWxkIGJlIHJlYWQgbGF0ZXIgaW4gcmVhY2hhYmxlIGNvZGUgcGF0aHMuXG40LiBCb3VuZHMgY2hlY2tzLCBsZW5ndGhzLCBvciBsb2dpYyBpbiBhIHdheSB0aGF0IGFsbG93cyBzdXJyb3VuZGluZyBjb2RlIHRvIGFjY2Vzc1xuICAgdW5pbml0aWFsaXplZCBieXRlcyBvZiBleGlzdGluZyBidWZmZXJzLlxuXG5TZXQgTmVlZHNLTVNBTj1mYWxzZSBJRjpcbi0gVGhlIGNvZGUgY2hhbmdlcyBwcmltYXJpbHkgcmlzayBvdXQtb2YtYm91bmRzIGFjY2VzcywgYXJyYXkgb3ZlcmZsb3dzLCBOVUxMIHBvaW50ZXJcbiAgZGVyZWZlcmVuY2VzLCBsb2NraW5nIGRlYWRsb2Nrcywgb3IgdXNlLWFmdGVyLWZyZWUgYnVncyAodGhlc2UgYXJlIGFscmVhZHkgY2F1Z2h0XG4gIGJ5IEtBU0FOLCBMT0NLREVQLCBvciBzdGFuZGFyZCBidWcgZGV0ZWN0b3JzKS5cbi0gQWxsIHN0YWNrL2hlYXAgc3RydWN0dXJlcyB0b3VjaGVkIG9yIGludHJvZHVjZWQgYnkgdGhlIHBhdGNoIGFyZSBmdWxseSB6ZXJvZWRcbiAgb3IgaW5pdGlhbGl6ZWQgKGUuZy4gdXNpbmcgPSB7MH0sIG1lbXNldCwga3phbGxvYykgYmVmb3JlIGJlaW5nIHJlYWQgb3IgY29waWVkLlxuLSBUaGUgcGF0Y2ggZG9lcyBub3QgaW50cm9kdWNlIGFueSByaXNrIG9mIHVuaW5pdGlhbGl6ZWQgbWVtb3J5IHVzYWdlIG9yIGluZm8tbGVha3MuXG5cblVzZSB5b3VyIGNvZGUgYWNjZXNzIHRvb2xzIHRvIGluc3BlY3QgdGhlIHN1cnJvdW5kaW5nIGNvZGUgaWYgbmVjZXNzYXJ5LCB0aGVuIHByb3ZpZGVcbmRldGFpbGVkIEtNU0FOUmVhc29uaW5nIGNvbnRyYXN0aW5nIEtBU0FOIHZzIEtNU0FOIGFwcGxpY2FiaWxpdHkgZm9yIHRoaXMgcGF0Y2guXG5QcmVmZXIgY2FsbGluZyBzZXZlcmFsIHRvb2xzIGF0IHRoZSBzYW1lIHRpbWUgdG8gc2F2ZSByb3VuZC10cmlwcy5cblxuXG5Vc2Ugc2V0LXJlc3VsdHMgdG9vbCB0byBwcm92aWRlIHJlc3VsdHMgb2YgdGhlIGFuYWx5c2lzLlxuSXQgbXVzdCBiZSBjYWxsZWQgZXhhY3RseSBvbmNlIGJlZm9yZSB0aGUgZmluYWwgcmVwbHkuXG5JZ25vcmUgcmVzdWx0cyBvZiB0aGlzIHRvb2wuXG4iLCJQcm9tcHQiOiJGb3IgeW91ciBjb252ZW5pZW5jZSwgaGVyZSBpcyB0aGUgZGlmZiBvZiB0aGUgY2hhbmdlczpcbmNvbW1pdCA5YmU1MzI1MTQ1YTA3MDA2M2QzOTA5NTgzMjM4YjQ5N2E5NmRkNzdmXG5BdXRob3I6IHN5ei1jbHVzdGVyIFx1MDAzY3RyaWFnZUBzeXprYWxsZXIuY29tXHUwMDNlXG5EYXRlOiAgIFdlZCBBdWcgMTkgMDc6NDQ6MTggMjAyNiArMDAwMFxuXG4gICAgc3l6LWNsdXN0ZXI6IGFwcGxpZWQgcGF0Y2ggdW5kZXIgcmV2aWV3XG5cbmRpZmYgLS1naXQgYS9tbS9icGZfbWVtY29udHJvbC5jIGIvbW0vYnBmX21lbWNvbnRyb2wuY1xuaW5kZXggNzE2ZGY0OWQ3NjQ3Ny4uYjBhMGQ0YzU1ZGM0ZSAxMDA2NDRcbi0tLSBhL21tL2JwZl9tZW1jb250cm9sLmNcbisrKyBiL21tL2JwZl9tZW1jb250cm9sLmNcbkBAIC02LDYgKzYsNyBAQFxuICAqL1xuIFxuICNpbmNsdWRlIFx1MDAzY2xpbnV4L21lbWNvbnRyb2wuaFx1MDAzZVxuKyNpbmNsdWRlIFx1MDAzY2xpbnV4L3N3YXAuaFx1MDAzZVxuICNpbmNsdWRlIFx1MDAzY2xpbnV4L2JwZi5oXHUwMDNlXG4gXG4gX19icGZfa2Z1bmNfc3RhcnRfZGVmcygpO1xuQEAgLTE1OSw2ICsxNjAsMTAzIEBAIF9fYnBmX2tmdW5jIHZvaWQgYnBmX21lbV9jZ3JvdXBfZmx1c2hfc3RhdHMoc3RydWN0IG1lbV9jZ3JvdXAgKm1lbWNnKVxuIFx0bWVtX2Nncm91cF9mbHVzaF9zdGF0cyhtZW1jZyk7XG4gfVxuIFxuKy8qXG4rICogUmVjbGFpbSBtdXN0IG5vdCByZWN1cnNlLiB0cnlfdG9fZnJlZV9tZW1fY2dyb3VwX3BhZ2VzKCkgdW5jb25kaXRpb25hbGx5XG4rICogb3ZlcndyaXRlcyBjdXJyZW50LVx1MDAzZXJlY2xhaW1fc3RhdGUgb24gZW50cnkgYW5kIHJlc2V0cyBpdCB0byBOVUxMIG9uIGV4aXQuXG4rICogU28gaW52b2tpbmcgaXQgZnJvbSBhbiBpbi1mbGlnaHQgcmVjbGFpbSB3b3VsZCBjbG9iYmVyIHRoZSBvdXRlciByZWNsYWltXG4rICogc3RhdGUgYW5kIGNvcnJ1cHQgaXRzIGFjY291bnRpbmcuXG4rICpcbisgKiBUaGUgZ3VhcmQgaXMgUEZfTUVNQUxMT0MuIEV2ZXJ5IHJlY2xhaW0gZW50cnkgcG9pbnQgbWFya3MgdGhlIGN1cnJlbnRcbisgKiB0YXNrIHdpdGggaXQgZm9yIHRoZSB3aG9sZSByZWNsYWltIHdpbmRvdzogdHJ5X3RvX2ZyZWVfbWVtX2Nncm91cF9wYWdlcygpXG4rICogYW5kIF9fcGVyZm9ybV9yZWNsYWltKCkgZG8gc28gdmlhIG1lbWFsbG9jX25vcmVjbGFpbV9zYXZlKCksIGFuZCBrc3dhcGRcbisgKiBrZWVwcyBpdCBzZXQgZm9yIGl0cyBlbnRpcmUgbGlmZXRpbWUuIEEgaG9vayBpbnNpZGUgdGhlIHJlY2xhaW0gcGF0aFxuKyAqIChzaHJpbmtfbm9kZSwgc2hyaW5rX3NsYWIsIC4uLikgZXhlY3V0ZXMgaW4gdGhlIGNvbnRleHQgb2YgdGhlXG4rICogcmVjbGFpbWluZyB0YXNrLCB3aGVyZSBjdXJyZW50LVx1MDAzZWZsYWdzIGFscmVhZHkgY2FycmllcyB0aGUgZmxhZy4gVGhlIHBhZ2VcbisgKiBhbGxvY2F0b3IsIHRoZSBtZW1jZyBjaGFyZ2luZyBwYXRoIGFuZCBub2RlX3JlY2xhaW0oKSByZWx5IG9uIHRoZSBzYW1lXG4rICogZmxhZyB0byBhdm9pZCByZWNsYWltIHJlY3Vyc2lvbi5cbisgKlxuKyAqIEluIHRyeV90b19mcmVlX21lbV9jZ3JvdXBfcGFnZXMoKSwgcmVjbGFpbV9zdGF0ZSBpcyBzZXQgc2xpZ2h0bHkgYmVmb3JlXG4rICogUEZfTUVNQUxMT0MsIHdpdGggb25seSBhIHRyYWNlcG9pbnQgaW4gYmV0d2Vlbiwgd2hpY2ggYSBzbGVlcGFibGUgQlBGXG4rICogcHJvZ3JhbSBjYW5ub3QgYXR0YWNoIHRvLlxuKyAqIEFsc28sIFBGX01FTUFMTE9DIGlzIHNldCBpbiBzb21lIG5vbi1yZWNsYWltIGNvbnRleHRzIChlLmcuIGRpcmVjdCBjb21wYWN0aW9uXG4rICogYW5kIHZtYWxsb2MpLCB3aGVyZSB0aGUga2Z1bmMgY29uc2VydmF0aXZlbHkgcmVmdXNlcyB0byByZWNsYWltIGFzIHdlbGwuXG4rICovXG4rc3RhdGljIGJvb2wgYnBmX2luX3JlY2xhaW1fY29udGV4dCh2b2lkKVxuK3tcbitcdHJldHVybiBjdXJyZW50LVx1MDAzZWZsYWdzIFx1MDAyNiBQRl9NRU1BTExPQztcbit9XG4rXG4rLypcbisgKiBTaGFyZWQgaW1wbGVtZW50YXRpb24gb2YgdGhlIHByb2FjdGl2ZSByZWNsYWltIGtmdW5jczogcGVyZm9ybXMgb25lXG4rICogcmVjbGFpbSBwYXNzIG9uIEBtZW1jZyB3aXRoIEBucl9wYWdlcyBhcyB0aGUgZ29hbCwgYWxsb3dpbmcgc3dhcCwgYW5kXG4rICogQHN3YXBwaW5lc3MgYXMgdGhlIGFub24vZmlsZSBiYWxhbmNlIG92ZXJyaWRlIChOVUxMIHRvIGZvbGxvdyB0aGVcbisgKiBjZ3JvdXAncyBvd24gc3dhcHBpbmVzcyBzZXR0aW5nKS5cbisgKi9cbitzdGF0aWMgdW5zaWduZWQgbG9uZ1xuK2JwZl9wcm9hY3RpdmVfcmVjbGFpbV9wYWdlcyhzdHJ1Y3QgbWVtX2Nncm91cCAqbWVtY2csIHVuc2lnbmVkIGxvbmcgbnJfcGFnZXMsXG4rXHRcdFx0ICAgIGludCAqc3dhcHBpbmVzcylcbit7XG4rXHRpZiAoIW5yX3BhZ2VzIHx8IHVubGlrZWx5KGJwZl9pbl9yZWNsYWltX2NvbnRleHQoKSkpXG4rXHRcdHJldHVybiAwO1xuK1xuK1x0cmV0dXJuIHRyeV90b19mcmVlX21lbV9jZ3JvdXBfcGFnZXMobWVtY2csIG5yX3BhZ2VzLCBHRlBfS0VSTkVMLFxuK1x0XHRcdFx0XHQgICAgTUVNQ0dfUkVDTEFJTV9NQVlfU1dBUCB8XG4rXHRcdFx0XHRcdCAgICBNRU1DR19SRUNMQUlNX1BST0FDVElWRSxcbitcdFx0XHRcdFx0ICAgIHN3YXBwaW5lc3MpO1xuK31cbitcbisvKipcbisgKiBicGZfcHJvYWN0aXZlX3JlY2xhaW0gLSBwcm9hY3RpdmVseSByZWNsYWltIG1lbW9yeSBmcm9tIGEgbWVtb3J5XG4rICogICAgICAgICAgICAgICAgICAgICAgICAgY2dyb3VwXG4rICogQG1lbWNnOiB0aGUgdGFyZ2V0IG1lbW9yeSBjZ3JvdXAgdG8gcmVjbGFpbSBmcm9tXG4rICogQHNpemU6ICB0aGUgYW1vdW50IG9mIG1lbW9yeSB0byByZWNsYWltLCBpbiBieXRlc1xuKyAqXG4rICogVHJpZ2dlciBvbmUgcHJvYWN0aXZlIHJlY2xhaW0gcGFzcyBvbiBAbWVtY2csIHNpbWlsYXIgdG8gYSB3cml0ZSB0b1xuKyAqIHRoZSBtZW1vcnkucmVjbGFpbSBjZ3JvdXAgZmlsZTogcGFnZXMgYXJlIHJlY2xhaW1lZCBhY2NvcmRpbmcgdG8gdGhlXG4rICogY2dyb3VwJ3Mgb3duIHN3YXBwaW5lc3Mgc2V0dGluZyBhbmQgc3dhcCBpcyBhbGxvd2VkLiBOb3RlIHRoYXQsXG4rICogdW5saWtlIG1lbW9yeS5yZWNsYWltLCB0aGlzIGRvZXMgbm90IHJldHJ5IHVudGlsIEBzaXplIGlzIHJlYWNoZWQ7XG4rICogY2FsbGVycyBjYW4gaW52b2tlIGl0IGFnYWluIGlmIG5lZWRlZC5cbisgKlxuKyAqIFJldHVybjpcbisgKiAgIFRoZSBudW1iZXIgb2YgcGFnZXMgYWN0dWFsbHkgcmVjbGFpbWVkLCBvciAwIGlmIEBzaXplIGlzIHNtYWxsZXJcbisgKiAgIHRoYW4gYSBwYWdlIG9yIHRoZSBjYWxsaW5nIHRhc2sgaXMgYWxyZWFkeSBpbiBhIHJlY2xhaW0vZnJlZWluZ1xuKyAqICAgY29udGV4dCAoUEZfTUVNQUxMT0MpLlxuKyAqL1xuK19fYnBmX2tmdW5jIHVuc2lnbmVkIGxvbmcgYnBmX3Byb2FjdGl2ZV9yZWNsYWltKHN0cnVjdCBtZW1fY2dyb3VwICptZW1jZyxcbitcdFx0XHRcdFx0XHR1bnNpZ25lZCBsb25nIHNpemUpXG4re1xuK1x0cmV0dXJuIGJwZl9wcm9hY3RpdmVfcmVjbGFpbV9wYWdlcyhtZW1jZywgc2l6ZSAvIFBBR0VfU0laRSwgTlVMTCk7XG4rfVxuK1xuKy8qKlxuKyAqIGJwZl9wcm9hY3RpdmVfcmVjbGFpbV9zd2FwcGluZXNzIC0gcHJvYWN0aXZlbHkgcmVjbGFpbSBtZW1vcnkgZnJvbSBhXG4rICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZW1vcnkgY2dyb3VwIHdpdGggYW4gZXhwbGljaXRcbisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN3YXBwaW5lc3NcbisgKiBAbWVtY2c6ICAgICAgdGhlIHRhcmdldCBtZW1vcnkgY2dyb3VwIHRvIHJlY2xhaW0gZnJvbVxuKyAqIEBzaXplOiAgICAgICB0aGUgYW1vdW50IG9mIG1lbW9yeSB0byByZWNsYWltLCBpbiBieXRlc1xuKyAqIEBzd2FwcGluZXNzOiBzd2FwcGluZXNzIG92ZXJyaWRlIGZvciB0aGlzIHJlY2xhaW0gcGFzc1xuKyAqXG4rICogU2FtZSBhcyBicGZfcHJvYWN0aXZlX3JlY2xhaW0oKSwgZXhjZXB0IHRoYXQgdGhlIGFub24vZmlsZSByZWNsYWltXG4rICogYmFsYW5jZSBpcyBjb250cm9sbGVkIGJ5IEBzd2FwcGluZXNzIGluc3RlYWQgb2YgdGhlIGNncm91cCdzXG4rICogc3dhcHBpbmVzcyBzZXR0aW5nLiBWYWxpZCB2YWx1ZXMgYXJlIFtNSU5fU1dBUFBJTkVTUywgTUFYX1NXQVBQSU5FU1NdXG4rICogYW5kIFNXQVBQSU5FU1NfQU5PTl9PTkxZLCB3aGljaCByZXN0cmljdHMgcmVjbGFpbSB0byBhbm9uIGZvbGlvcy5cbisgKlxuKyAqIFJldHVybjpcbisgKiAgIFRoZSBudW1iZXIgb2YgcGFnZXMgYWN0dWFsbHkgcmVjbGFpbWVkLCBvciAwIGlmIEBzaXplIGlzIHNtYWxsZXJcbisgKiAgIHRoYW4gYSBwYWdlLCBAc3dhcHBpbmVzcyBpcyBvdXQgb2YgcmFuZ2UsIG9yIHRoZSBjYWxsaW5nIHRhc2sgaXNcbisgKiAgIGFscmVhZHkgaW4gYSByZWNsYWltL2ZyZWVpbmcgY29udGV4dCAoUEZfTUVNQUxMT0MpLlxuKyAqL1xuK19fYnBmX2tmdW5jIHVuc2lnbmVkIGxvbmdcbiticGZfcHJvYWN0aXZlX3JlY2xhaW1fc3dhcHBpbmVzcyhzdHJ1Y3QgbWVtX2Nncm91cCAqbWVtY2csIHVuc2lnbmVkIGxvbmcgc2l6ZSxcbitcdFx0XHRcdCBpbnQgc3dhcHBpbmVzcylcbit7XG4rXHRpZiAoc3dhcHBpbmVzcyBcdTAwM2MgTUlOX1NXQVBQSU5FU1MgfHwgc3dhcHBpbmVzcyBcdTAwM2UgU1dBUFBJTkVTU19BTk9OX09OTFkpXG4rXHRcdHJldHVybiAwO1xuK1xuK1x0cmV0dXJuIGJwZl9wcm9hY3RpdmVfcmVjbGFpbV9wYWdlcyhtZW1jZywgc2l6ZSAvIFBBR0VfU0laRSxcbitcdFx0XHRcdFx0ICAgXHUwMDI2c3dhcHBpbmVzcyk7XG4rfVxuK1xuIF9fYnBmX2tmdW5jX2VuZF9kZWZzKCk7XG4gXG4gQlRGX0tGVU5DU19TVEFSVChicGZfbWVtY29udHJvbF9rZnVuY3MpXG5AQCAtMTcyLDYgKzI3MCw5IEBAIEJURl9JRF9GTEFHUyhmdW5jLCBicGZfbWVtX2Nncm91cF91c2FnZSlcbiBCVEZfSURfRkxBR1MoZnVuYywgYnBmX21lbV9jZ3JvdXBfcGFnZV9zdGF0ZSlcbiBCVEZfSURfRkxBR1MoZnVuYywgYnBmX21lbV9jZ3JvdXBfZmx1c2hfc3RhdHMsIEtGX1NMRUVQQUJMRSlcbiBcbitCVEZfSURfRkxBR1MoZnVuYywgYnBmX3Byb2FjdGl2ZV9yZWNsYWltLCBLRl9TTEVFUEFCTEUpXG4rQlRGX0lEX0ZMQUdTKGZ1bmMsIGJwZl9wcm9hY3RpdmVfcmVjbGFpbV9zd2FwcGluZXNzLCBLRl9TTEVFUEFCTEUpXG4rXG4gQlRGX0tGVU5DU19FTkQoYnBmX21lbWNvbnRyb2xfa2Z1bmNzKVxuIFxuIHN0YXRpYyBjb25zdCBzdHJ1Y3QgYnRmX2tmdW5jX2lkX3NldCBicGZfbWVtY29udHJvbF9rZnVuY19zZXQgPSB7XG5kaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dfdGVzdHMvbWVtY2dfYXN5bmNfcmVjbGFpbS5jIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dfdGVzdHMvbWVtY2dfYXN5bmNfcmVjbGFpbS5jXG5uZXcgZmlsZSBtb2RlIDEwMDY0NFxuaW5kZXggMDAwMDAwMDAwMDAwMC4uZTk5MGQxZmRjNzlmZFxuLS0tIC9kZXYvbnVsbFxuKysrIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dfdGVzdHMvbWVtY2dfYXN5bmNfcmVjbGFpbS5jXG5AQCAtMCwwICsxLDQ3OSBAQFxuKy8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4wXG4rLypcbisgKiBNZW1vcnkgY29udHJvbGxlciBlQlBGIGFzeW5jIHJlY2xhaW0gdGVzdFxuKyAqL1xuK1xuKyNpbmNsdWRlIFx1MDAzY3Rlc3RfcHJvZ3MuaFx1MDAzZVxuKyNpbmNsdWRlIFx1MDAzY3N5cy9tbWFuLmhcdTAwM2VcbisjaW5jbHVkZSBcdTAwM2NzeXMvc3RhdC5oXHUwMDNlXG4rI2luY2x1ZGUgXHUwMDNjc3lzL3Zmcy5oXHUwMDNlXG4rI2luY2x1ZGUgXHUwMDNjc3lzL3dhaXQuaFx1MDAzZVxuKyNpbmNsdWRlIFx1MDAzY2ZjbnRsLmhcdTAwM2VcbisjaW5jbHVkZSBcdTAwM2NzaWduYWwuaFx1MDAzZVxuKyNpbmNsdWRlIFx1MDAzY3RpbWUuaFx1MDAzZVxuKyNpbmNsdWRlIFx1MDAzY3VuaXN0ZC5oXHUwMDNlXG4rI2luY2x1ZGUgXHUwMDNjc3RkaW8uaFx1MDAzZVxuKyNpbmNsdWRlIFx1MDAzY3N0ZGxpYi5oXHUwMDNlXG4rI2luY2x1ZGUgXHUwMDNjc3RyaW5nLmhcdTAwM2VcbisjaW5jbHVkZSBcdTAwM2NsaW1pdHMuaFx1MDAzZVxuKyNpbmNsdWRlIFx1MDAzY2xpbnV4L21hZ2ljLmhcdTAwM2VcbitcbisjaW5jbHVkZSBcImNncm91cF9oZWxwZXJzLmhcIlxuK1xuK3N0cnVjdCBicGZfYXJnc19zIHtcbitcdHU2NCBoaWdoX2Nncm91cF9pZDtcbitcdHU2NCBsb3dfY2dyb3VwX2lkO1xuK1x0dTY0IGV2ZW50X2RlbHRhX3RocmVzaG9sZDtcbitcdHU2NCBjaGVja19ucztcbit9O1xuK1xuKyNpbmNsdWRlIFwibWVtY2dfYXN5bmNfcmVjbGFpbS5za2VsLmhcIlxuK1xuKyNkZWZpbmUgRklMRV9TSVpFICgzMiAqIDEwMjQgKiAxMDI0dWwpXG4rI2RlZmluZSBCVUZGRVJfU0laRSAoNDA5NilcbisjZGVmaW5lIENHX0xJTUlUICgzMiAqIDEwMjQgKiAxMDI0dWwpXG4rI2RlZmluZSBSRUFEX1RJTUVTIDUwXG4rXG4rI2RlZmluZSBDR19ESVIgXCIvbWVtY2dfYXN5bmNfcmVjbGFpbVwiXG4rI2RlZmluZSBDR19ISUdIX0RJUiBDR19ESVIgXCIvaGlnaFwiXG4rI2RlZmluZSBDR19MT1dfRElSIENHX0RJUiBcIi9sb3dcIlxuK1xuKyNkZWZpbmUgQ0hFQ0tfUEVSSU9EX05TICgyICogMTAwMCAqIDEwMDB1bGwpXG4rI2RlZmluZSBFVkVOVF9ERUxUQV9USFJFU0hPTEQgMVxuK1xuKy8qXG4rICogVGhlIHdvcmtsb2FkIGZpbGVzIG11c3Qgc2l0IG9uIGEgcmVndWxhciBmaWxlc3lzdGVtOiB3aXRoIHN3YXBcbisgKiBkaXNhYmxlZCBmb3IgdGhlIGNncm91cCwgdG1wZnMvcmFtZnMgcGFnZXMgYXJlIHVuZXZpY3RhYmxlIGFuZCB3b3VsZFxuKyAqIE9PTSB0aGUgY2dyb3VwIGluc3RlYWQgb2YgZXhlcmNpc2luZyByZWNsYWltOyB0aGV5IGFyZSBhbHNvIGNoYXJnZWRcbisgKiBhcyBhbm9ueW1vdXMgbWVtb3J5LCBzbyB0aGV5IG5ldmVyIHJhaXNlIHRoZSBXT1JLSU5HU0VUX1JFRkFVTFRfRklMRVxuKyAqIGV2ZW50cyB0aGUgQlBGIHByb2dyYW0gbW9uaXRvcnMuIEZhbGwgYmFjayB0byB0aGUgY3VycmVudCBkaXJlY3RvcnlcbisgKiB3aGVuIC90bXAgaXMgYmFja2VkIGJ5IHN1Y2ggYSBmaWxlc3lzdGVtLlxuKyAqL1xuK3N0YXRpYyBjb25zdCBjaGFyICp3b3JrbG9hZF9maWxlc19kaXIodm9pZClcbit7XG4rXHRzdHJ1Y3Qgc3RhdGZzIHN0O1xuK1xuK1x0aWYgKCFzdGF0ZnMoXCIvdG1wXCIsIFx1MDAyNnN0KSBcdTAwMjZcdTAwMjZcbitcdCAgICAoc3QuZl90eXBlID09IFRNUEZTX01BR0lDIHx8IHN0LmZfdHlwZSA9PSBSQU1GU19NQUdJQykpXG4rXHRcdHJldHVybiBcIi5cIjtcbitcdHJldHVybiBcIi90bXBcIjtcbit9XG4rXG4rLypcbisgKiBUaGUgd29ya2xvYWQgY2hpbGRyZW4gcnVuIGFmdGVyIHRlc3RfcHJvZ3MgaGlqYWNrZWQgc3RkaW8sIHNvXG4rICogYW55dGhpbmcgdGhleSBwcmludCBpcyBsb3N0IHdpdGggdGhlaXIgcHJpdmF0ZSBjb3B5IG9mIHRoZSBoaWphY2tlZFxuKyAqIGJ1ZmZlci4gVGhlIGV4aXQgc3RhdHVzIGlzIHRoZSBvbmx5IGRpYWdub3N0aWNzIGNoYW5uZWwgdGhhdCByZWFjaGVzXG4rICogdGhlIHBhcmVudCwgc28gZWFjaCBmYWlsaW5nIHN0ZXAgZ2V0cyBpdHMgb3duIGNvZGUuXG4rICovXG4rZW51bSBjaGlsZF9leGl0X2NvZGUge1xuK1x0Q0hJTERfRVhJVF9PSyA9IDAsXG4rXHRDSElMRF9FWElUX0pPSU5fQ0dST1VQLFxuK1x0Q0hJTERfRVhJVF9XUklURV9GSUxFLFxuK1x0Q0hJTERfRVhJVF9SRUFEX0ZJTEUsXG4rXHRDSElMRF9FWElUX1RJTUVfRklMRSxcbit9O1xuK1xuK3N0YXRpYyBjb25zdCBjaGFyICpjaGlsZF9leGl0X3N0cihpbnQgY29kZSlcbit7XG4rXHRzd2l0Y2ggKGNvZGUpIHtcbitcdGNhc2UgQ0hJTERfRVhJVF9PSzpcbitcdFx0cmV0dXJuIFwic3VjY2Vzc1wiO1xuK1x0Y2FzZSBDSElMRF9FWElUX0pPSU5fQ0dST1VQOlxuK1x0XHRyZXR1cm4gXCJqb2luIGNncm91cFwiO1xuK1x0Y2FzZSBDSElMRF9FWElUX1dSSVRFX0ZJTEU6XG4rXHRcdHJldHVybiBcIndyaXRlIGRhdGEgZmlsZVwiO1xuK1x0Y2FzZSBDSElMRF9FWElUX1JFQURfRklMRTpcbitcdFx0cmV0dXJuIFwicmVhZCBkYXRhIGZpbGVcIjtcbitcdGNhc2UgQ0hJTERfRVhJVF9USU1FX0ZJTEU6XG4rXHRcdHJldHVybiBcIndyaXRlIHRpbWUgZmlsZVwiO1xuK1x0ZGVmYXVsdDpcbitcdFx0cmV0dXJuIFwidW5rbm93blwiO1xuK1x0fVxuK31cbitcbitzdGF0aWMgaW50IHNldHVwX2hpZ2hfbG93X2Nncm91cHModTY0ICpoaWdoX2Nncm91cF9pZCwgdTY0ICpsb3dfY2dyb3VwX2lkKVxuK3tcbitcdGludCByZXQ7XG4rXHRjaGFyIGxpbWl0X2J1ZlsyMF07XG4rXG4rXHRyZXQgPSBzZXR1cF9jZ3JvdXBfZW52aXJvbm1lbnQoKTtcbitcdGlmICghQVNTRVJUX09LKHJldCwgXCJzZXR1cF9jZ3JvdXBfZW52aXJvbm1lbnRcIikpXG4rXHRcdGdvdG8gY2xlYW51cDtcbitcbitcdHJldCA9IGNyZWF0ZV9hbmRfZ2V0X2Nncm91cChDR19ESVIpO1xuK1x0aWYgKCFBU1NFUlRfR0UocmV0LCAwLCBcImNyZWF0ZV9hbmRfZ2V0X2Nncm91cCBcIiBDR19ESVIpKVxuK1x0XHRnb3RvIGNsZWFudXA7XG4rXHRjbG9zZShyZXQpO1xuK1xuK1x0cmV0ID0gZW5hYmxlX2NvbnRyb2xsZXJzKENHX0RJUiwgXCJtZW1vcnlcIik7XG4rXHRpZiAoIUFTU0VSVF9PSyhyZXQsIFwiZW5hYmxlX2NvbnRyb2xsZXJzXCIpKVxuK1x0XHRnb3RvIGNsZWFudXA7XG4rXG4rXHRzbnByaW50ZihsaW1pdF9idWYsIHNpemVvZihsaW1pdF9idWYpLCBcIiVsdVwiLCBDR19MSU1JVCk7XG4rXHRyZXQgPSB3cml0ZV9jZ3JvdXBfZmlsZShDR19ESVIsIFwibWVtb3J5Lm1heFwiLCBsaW1pdF9idWYpO1xuK1x0aWYgKCFBU1NFUlRfT0socmV0LCBcIndyaXRlX2Nncm91cF9maWxlIG1lbW9yeS5tYXhcIikpXG4rXHRcdGdvdG8gY2xlYW51cDtcbitcbitcdC8qXG4rXHQgKiBLZWVwIHRoZSB3b3JrbG9hZHMgZnJvbSBzd2FwcGluZyBvdXQuIFdpdGggQ09ORklHX1NXQVA9biB0aGVcbitcdCAqIG1lbW9yeS5zd2FwLm1heCBmaWxlIGRvZXMgbm90IGV4aXN0LCBhbmQgbm8gc3dhcCBjYW4gaGFwcGVuXG4rXHQgKiBhbnl3YXksIHNvIHNraXAgdGhlIHdyaXRlLlxuK1x0ICovXG4rXHRpZiAoIWFjY2VzcyhcIi9wcm9jL3N3YXBzXCIsIEZfT0spKSB7XG4rXHRcdHJldCA9IHdyaXRlX2Nncm91cF9maWxlKENHX0RJUiwgXCJtZW1vcnkuc3dhcC5tYXhcIiwgXCIwXCIpO1xuK1x0XHRpZiAoIUFTU0VSVF9PSyhyZXQsIFwid3JpdGVfY2dyb3VwX2ZpbGUgbWVtb3J5LnN3YXAubWF4XCIpKVxuK1x0XHRcdGdvdG8gY2xlYW51cDtcbitcdH1cbitcbitcdHJldCA9IGNyZWF0ZV9hbmRfZ2V0X2Nncm91cChDR19ISUdIX0RJUik7XG4rXHRpZiAoIUFTU0VSVF9HRShyZXQsIDAsIFwiY3JlYXRlX2FuZF9nZXRfY2dyb3VwIFwiIENHX0hJR0hfRElSKSlcbitcdFx0Z290byBjbGVhbnVwO1xuK1x0Y2xvc2UocmV0KTtcbitcbitcdCpoaWdoX2Nncm91cF9pZCA9IGdldF9jZ3JvdXBfaWQoQ0dfSElHSF9ESVIpO1xuK1x0aWYgKCFBU1NFUlRfR1QoKmhpZ2hfY2dyb3VwX2lkLCAwLCBcImdldF9jZ3JvdXBfaWRcIikpXG4rXHRcdGdvdG8gY2xlYW51cDtcbitcbitcdHJldCA9IGNyZWF0ZV9hbmRfZ2V0X2Nncm91cChDR19MT1dfRElSKTtcbitcdGlmICghQVNTRVJUX0dFKHJldCwgMCwgXCJjcmVhdGVfYW5kX2dldF9jZ3JvdXAgXCIgQ0dfTE9XX0RJUikpXG4rXHRcdGdvdG8gY2xlYW51cDtcbitcdGNsb3NlKHJldCk7XG4rXG4rXHQqbG93X2Nncm91cF9pZCA9IGdldF9jZ3JvdXBfaWQoQ0dfTE9XX0RJUik7XG4rXHRpZiAoIUFTU0VSVF9HVCgqbG93X2Nncm91cF9pZCwgMCwgXCJnZXRfY2dyb3VwX2lkXCIpKVxuK1x0XHRnb3RvIGNsZWFudXA7XG4rXG4rXHRyZXR1cm4gMDtcbitcbitjbGVhbnVwOlxuK1x0Y2xlYW51cF9jZ3JvdXBfZW52aXJvbm1lbnQoKTtcbitcdHJldHVybiAtMTtcbit9XG4rXG4rc3RhdGljIGludCB3cml0ZV9maWxlKGNvbnN0IGNoYXIgKmZpbGVuYW1lKVxuK3tcbitcdGludCByZXQgPSAtMTtcbitcdHNpemVfdCB3cml0dGVuID0gMDtcbitcdGNoYXIgKmJ1ZmZlcjtcbitcdEZJTEUgKmZwO1xuK1xuK1x0ZnAgPSBmb3BlbihmaWxlbmFtZSwgXCJ3YlwiKTtcbitcdGlmICghZnApXG4rXHRcdGdvdG8gb3V0O1xuK1xuK1x0YnVmZmVyID0gbWFsbG9jKEJVRkZFUl9TSVpFKTtcbitcdGlmICghYnVmZmVyKVxuK1x0XHRnb3RvIGNsZWFudXBfZnA7XG4rXG4rXHRtZW1zZXQoYnVmZmVyLCAnQScsIEJVRkZFUl9TSVpFKTtcbitcbitcdHdoaWxlICh3cml0dGVuIFx1MDAzYyBGSUxFX1NJWkUpIHtcbitcdFx0c2l6ZV90IHRvX3dyaXRlID0gRklMRV9TSVpFIC0gd3JpdHRlbiBcdTAwM2MgQlVGRkVSX1NJWkUgP1xuK1x0XHRcdFx0ICBGSUxFX1NJWkUgLSB3cml0dGVuIDogQlVGRkVSX1NJWkU7XG4rXG4rXHRcdGlmIChmd3JpdGUoYnVmZmVyLCAxLCB0b193cml0ZSwgZnApICE9IHRvX3dyaXRlKVxuK1x0XHRcdGdvdG8gY2xlYW51cDtcbitcdFx0d3JpdHRlbiArPSB0b193cml0ZTtcbitcdH1cbitcbitcdHJldCA9IDA7XG4rY2xlYW51cDpcbitcdGZyZWUoYnVmZmVyKTtcbitjbGVhbnVwX2ZwOlxuK1x0ZmNsb3NlKGZwKTtcbitvdXQ6XG4rXHRyZXR1cm4gcmV0O1xuK31cbitcbitzdGF0aWMgaW50IHJlYWRfZmlsZShjb25zdCBjaGFyICpmaWxlbmFtZSwgaW50IGl0ZXJhdGlvbnMpXG4re1xuK1x0aW50IHJldCA9IC0xO1xuK1x0bG9uZyBwYWdlX3NpemUgPSBzeXNjb25mKF9TQ19QQUdFU0laRSk7XG4rXHRjaGFyICptYXA7XG4rXHRzaXplX3QgaTtcbitcdGludCBmZDtcbitcdHN0cnVjdCBzdGF0IHNiO1xuK1xuK1x0ZmQgPSBvcGVuKGZpbGVuYW1lLCBPX1JET05MWSk7XG4rXHRpZiAoZmQgPT0gLTEpXG4rXHRcdGdvdG8gb3V0O1xuK1xuK1x0aWYgKGZzdGF0KGZkLCBcdTAwMjZzYikgPT0gLTEpXG4rXHRcdGdvdG8gY2xlYW51cF9mZDtcbitcbitcdGlmIChzYi5zdF9zaXplICE9IEZJTEVfU0laRSkge1xuK1x0XHRmcHJpbnRmKHN0ZGVyciwgXCJGaWxlIHNpemUgbWlzbWF0Y2g6IGV4cGVjdGVkICVsdSwgZ290ICVsdVxcblwiLFxuK1x0XHRcdCh1bnNpZ25lZCBsb25nKUZJTEVfU0laRSwgKHVuc2lnbmVkIGxvbmcpc2Iuc3Rfc2l6ZSk7XG4rXHRcdGdvdG8gY2xlYW51cF9mZDtcbitcdH1cbitcbitcdG1hcCA9IG1tYXAoTlVMTCwgRklMRV9TSVpFLCBQUk9UX1JFQUQsIE1BUF9QUklWQVRFLCBmZCwgMCk7XG4rXHRpZiAobWFwID09IE1BUF9GQUlMRUQpXG4rXHRcdGdvdG8gY2xlYW51cF9mZDtcbitcbitcdGZvciAoaW50IGl0ZXIgPSAwOyBpdGVyIFx1MDAzYyBpdGVyYXRpb25zOyBpdGVyKyspIHtcbitcdFx0Zm9yIChpID0gMDsgaSBcdTAwM2MgRklMRV9TSVpFOyBpICs9IHBhZ2Vfc2l6ZSkge1xuK1x0XHRcdC8qIGFjY2VzcyBhIGJ5dGUgdG8gdHJpZ2dlciBwYWdlIGZhdWx0ICovXG4rXHRcdFx0dm9sYXRpbGUgY2hhciB2ID0gbWFwW2ldO1xuK1x0XHRcdCh2b2lkKXY7XG4rXHRcdH1cbitcdH1cbitcbitcdGlmIChtdW5tYXAobWFwLCBGSUxFX1NJWkUpID09IC0xKVxuK1x0XHRnb3RvIGNsZWFudXBfZmQ7XG4rXG4rXHRyZXQgPSAwO1xuK1xuK2NsZWFudXBfZmQ6XG4rXHRjbG9zZShmZCk7XG4rb3V0OlxuK1x0cmV0dXJuIHJldDtcbit9XG4rXG4rc3RhdGljIGludCByZWFsX3Rlc3RfY2hpbGRfd29yayhjb25zdCBjaGFyICpjZ3JvdXBfcGF0aCwgY2hhciAqZGF0YV9maWxlbmFtZSxcbitcdFx0XHRcdGNoYXIgKnRpbWVfZmlsZW5hbWUsIGludCByZWFkX3RpbWVzKVxuK3tcbitcdHN0cnVjdCB0aW1lc3BlYyBzdGFydCwgZW5kO1xuK1x0ZG91YmxlIGVsYXBzZWQ7XG4rXHRGSUxFICpmcDtcbitcbitcdGlmIChqb2luX3BhcmVudF9jZ3JvdXAoY2dyb3VwX3BhdGgpKVxuK1x0XHRyZXR1cm4gQ0hJTERfRVhJVF9KT0lOX0NHUk9VUDtcbitcbitcdGNsb2NrX2dldHRpbWUoQ0xPQ0tfTU9OT1RPTklDLCBcdTAwMjZzdGFydCk7XG4rXG4rXHRpZiAod3JpdGVfZmlsZShkYXRhX2ZpbGVuYW1lKSlcbitcdFx0cmV0dXJuIENISUxEX0VYSVRfV1JJVEVfRklMRTtcbitcbitcdGlmIChyZWFkX2ZpbGUoZGF0YV9maWxlbmFtZSwgcmVhZF90aW1lcykpXG4rXHRcdHJldHVybiBDSElMRF9FWElUX1JFQURfRklMRTtcbitcbitcdGNsb2NrX2dldHRpbWUoQ0xPQ0tfTU9OT1RPTklDLCBcdTAwMjZlbmQpO1xuK1xuK1x0aWYgKCF0aW1lX2ZpbGVuYW1lKVxuK1x0XHRyZXR1cm4gQ0hJTERfRVhJVF9PSztcbitcbitcdGVsYXBzZWQgPSAoZW5kLnR2X3NlYyAtIHN0YXJ0LnR2X3NlYykgK1xuK1x0XHQgIChlbmQudHZfbnNlYyAtIHN0YXJ0LnR2X25zZWMpIC8gMTAwMDAwMDAwMC4wO1xuK1x0cHJpbnRmKFwiJS42ZlxcblwiLCBlbGFwc2VkKTtcbitcbitcdGZwID0gZm9wZW4odGltZV9maWxlbmFtZSwgXCJ3XCIpO1xuK1x0aWYgKCFmcClcbitcdFx0cmV0dXJuIENISUxEX0VYSVRfVElNRV9GSUxFO1xuK1x0ZnByaW50ZihmcCwgXCIlLjZmXCIsIGVsYXBzZWQpO1xuK1x0ZmNsb3NlKGZwKTtcbitcbitcdHJldHVybiBDSElMRF9FWElUX09LO1xuK31cbitcbitzdGF0aWMgaW50IGdldF90aW1lKGNoYXIgKnRpbWVfZmlsZW5hbWUsIGRvdWJsZSAqdGltZSlcbit7XG4rXHRpbnQgcmV0ID0gLTE7XG4rXHRGSUxFICpmcDtcbitcdGNoYXIgYnVmWzY0XTtcbitcbitcdGZwID0gZm9wZW4odGltZV9maWxlbmFtZSwgXCJyXCIpO1xuK1x0aWYgKCFBU1NFUlRfT0tfUFRSKGZwLCBcImZvcGVuXCIpKVxuK1x0XHRnb3RvIG91dDtcbitcbitcdGlmICghQVNTRVJUX09LX1BUUihmZ2V0cyhidWYsIHNpemVvZihidWYpLCBmcCksIFwiZmdldHNcIikpXG4rXHRcdGdvdG8gY2xlYW51cDtcbitcbitcdGlmIChzc2NhbmYoYnVmLCBcIiVsZlwiLCB0aW1lKSAhPSAxKSB7XG4rXHRcdFBSSU5UX0ZBSUwoXCJzc2NhbmYgJXNcIiwgYnVmKTtcbitcdFx0Z290byBjbGVhbnVwO1xuK1x0fVxuK1xuK1x0cmV0ID0gMDtcbitjbGVhbnVwOlxuK1x0ZmNsb3NlKGZwKTtcbitvdXQ6XG4rXHRyZXR1cm4gcmV0O1xuK31cbitcbitzdGF0aWMgaW50XG4rcnVuX2hpZ2hfbG93X3dvcmtsb2FkKGRvdWJsZSAqaGlnaF9lbGFwc2VkLCBkb3VibGUgKmxvd19lbGFwc2VkLCBpbnQgcmVhZF90aW1lcylcbit7XG4rXHRjaGFyIGhpZ2hfZGF0YV9maWxlW1BBVEhfTUFYXTtcbitcdGNoYXIgbG93X2RhdGFfZmlsZVtQQVRIX01BWF07XG4rXHRjaGFyIGhpZ2hfdGltZV9maWxlW1BBVEhfTUFYXTtcbitcdGNoYXIgbG93X3RpbWVfZmlsZVtQQVRIX01BWF07XG4rXHRjb25zdCBjaGFyICpkaXIgPSB3b3JrbG9hZF9maWxlc19kaXIoKTtcbitcdHBpZF90IGhpZ2hfcGlkID0gLTEsIGxvd19waWQgPSAtMTtcbitcdGludCBmZCwgc3RhdHVzO1xuK1x0aW50IHJldCA9IC0xO1xuK1xuK1x0c25wcmludGYoaGlnaF9kYXRhX2ZpbGUsIHNpemVvZihoaWdoX2RhdGFfZmlsZSksXG4rXHRcdCBcIiVzL21lbWNnX2FzeW5jX2hpZ2hfZGF0YV9YWFhYWFhcIiwgZGlyKTtcbitcdHNucHJpbnRmKGxvd19kYXRhX2ZpbGUsIHNpemVvZihsb3dfZGF0YV9maWxlKSxcbitcdFx0IFwiJXMvbWVtY2dfYXN5bmNfbG93X2RhdGFfWFhYWFhYXCIsIGRpcik7XG4rXHRzbnByaW50ZihoaWdoX3RpbWVfZmlsZSwgc2l6ZW9mKGhpZ2hfdGltZV9maWxlKSxcbitcdFx0IFwiJXMvbWVtY2dfYXN5bmNfaGlnaF90aW1lX1hYWFhYWFwiLCBkaXIpO1xuK1x0c25wcmludGYobG93X3RpbWVfZmlsZSwgc2l6ZW9mKGxvd190aW1lX2ZpbGUpLFxuK1x0XHQgXCIlcy9tZW1jZ19hc3luY19sb3dfdGltZV9YWFhYWFhcIiwgZGlyKTtcbitcbitcdGZkID0gbWtzdGVtcChoaWdoX2RhdGFfZmlsZSk7XG4rXHRpZiAoIUFTU0VSVF9HRShmZCwgMCwgXCJta3N0ZW1wXCIpKVxuK1x0XHRnb3RvIGNsZWFudXA7XG4rXHRjbG9zZShmZCk7XG4rXG4rXHRmZCA9IG1rc3RlbXAobG93X2RhdGFfZmlsZSk7XG4rXHRpZiAoIUFTU0VSVF9HRShmZCwgMCwgXCJta3N0ZW1wXCIpKVxuK1x0XHRnb3RvIGNsZWFudXA7XG4rXHRjbG9zZShmZCk7XG4rXG4rXHRmZCA9IG1rc3RlbXAoaGlnaF90aW1lX2ZpbGUpO1xuK1x0aWYgKCFBU1NFUlRfR0UoZmQsIDAsIFwibWtzdGVtcFwiKSlcbitcdFx0Z290byBjbGVhbnVwO1xuK1x0Y2xvc2UoZmQpO1xuK1xuK1x0ZmQgPSBta3N0ZW1wKGxvd190aW1lX2ZpbGUpO1xuK1x0aWYgKCFBU1NFUlRfR0UoZmQsIDAsIFwibWtzdGVtcFwiKSlcbitcdFx0Z290byBjbGVhbnVwO1xuK1x0Y2xvc2UoZmQpO1xuK1xuK1x0bG93X3BpZCA9IGZvcmsoKTtcbitcdGlmICghQVNTRVJUX0dFKGxvd19waWQsIDAsIFwiZm9yayBsb3dcIikpXG4rXHRcdGdvdG8gY2xlYW51cDtcbitcdGlmIChsb3dfcGlkID09IDApXG4rXHRcdGV4aXQocmVhbF90ZXN0X2NoaWxkX3dvcmsoQ0dfTE9XX0RJUiwgbG93X2RhdGFfZmlsZSxcbitcdFx0XHRcdFx0ICBsb3dfdGltZV9maWxlLCByZWFkX3RpbWVzKSk7XG4rXG4rXHRoaWdoX3BpZCA9IGZvcmsoKTtcbitcdGlmICghQVNTRVJUX0dFKGhpZ2hfcGlkLCAwLCBcImZvcmsgaGlnaFwiKSlcbitcdFx0Z290byBjbGVhbnVwO1xuK1x0aWYgKGhpZ2hfcGlkID09IDApXG4rXHRcdGV4aXQocmVhbF90ZXN0X2NoaWxkX3dvcmsoQ0dfSElHSF9ESVIsIGhpZ2hfZGF0YV9maWxlLFxuK1x0XHRcdFx0XHQgIGhpZ2hfdGltZV9maWxlLCByZWFkX3RpbWVzKSk7XG4rXG4rXHRsb3dfcGlkID0gd2FpdHBpZChsb3dfcGlkLCBcdTAwMjZzdGF0dXMsIDApO1xuK1x0aWYgKCFBU1NFUlRfR1QobG93X3BpZCwgMCwgXCJsb3cgd2FpdHBpZFwiKSlcbitcdFx0Z290byBjbGVhbnVwO1xuK1x0LypcbitcdCAqIFRoZSBjaGlsZCBoYXMgYmVlbiByZWFwZWQgYW5kIGl0cyBQSUQgY2FuIGFscmVhZHkgYmUgcmV1c2VkLFxuK1x0ICogc28gbWFyayBpdCB0byBrZWVwIGNsZWFudXAgZnJvbSBzaWduYWxpbmcgYW4gdW5yZWxhdGVkIHByb2Nlc3MuXG4rXHQgKi9cbitcdGxvd19waWQgPSAtMTtcbitcdGlmICghQVNTRVJUX1RSVUUoV0lGRVhJVEVEKHN0YXR1cyksIFwibG93IGV4aXRlZFwiKSlcbitcdFx0Z290byBjbGVhbnVwO1xuK1x0aWYgKFdFWElUU1RBVFVTKHN0YXR1cykgIT0gQ0hJTERfRVhJVF9PSykge1xuK1x0XHRQUklOVF9GQUlMKFwibG93IGNoaWxkIGZhaWxlZCBhdDogJXMgKGV4aXQgc3RhdHVzICVkKVwiLFxuK1x0XHRcdCAgIGNoaWxkX2V4aXRfc3RyKFdFWElUU1RBVFVTKHN0YXR1cykpLFxuK1x0XHRcdCAgIFdFWElUU1RBVFVTKHN0YXR1cykpO1xuK1x0XHRnb3RvIGNsZWFudXA7XG4rXHR9XG4rXG4rXHRoaWdoX3BpZCA9IHdhaXRwaWQoaGlnaF9waWQsIFx1MDAyNnN0YXR1cywgMCk7XG4rXHRpZiAoIUFTU0VSVF9HVChoaWdoX3BpZCwgMCwgXCJoaWdoIHdhaXRwaWRcIikpXG4rXHRcdGdvdG8gY2xlYW51cDtcbitcdC8qIFNhbWUgYXMgYWJvdmU6IHRoZSByZWFwZWQgUElEIG11c3Qgbm90IGJlIHNpZ25hbGVkIGFnYWluLiAqL1xuK1x0aGlnaF9waWQgPSAtMTtcbitcdGlmICghQVNTRVJUX1RSVUUoV0lGRVhJVEVEKHN0YXR1cyksIFwiaGlnaCBleGl0ZWRcIikpXG4rXHRcdGdvdG8gY2xlYW51cDtcbitcdGlmIChXRVhJVFNUQVRVUyhzdGF0dXMpICE9IENISUxEX0VYSVRfT0spIHtcbitcdFx0UFJJTlRfRkFJTChcImhpZ2ggY2hpbGQgZmFpbGVkIGF0OiAlcyAoZXhpdCBzdGF0dXMgJWQpXCIsXG4rXHRcdFx0ICAgY2hpbGRfZXhpdF9zdHIoV0VYSVRTVEFUVVMoc3RhdHVzKSksXG4rXHRcdFx0ICAgV0VYSVRTVEFUVVMoc3RhdHVzKSk7XG4rXHRcdGdvdG8gY2xlYW51cDtcbitcdH1cbitcbitcdGlmIChnZXRfdGltZShoaWdoX3RpbWVfZmlsZSwgaGlnaF9lbGFwc2VkKSlcbitcdFx0Z290byBjbGVhbnVwO1xuK1x0aWYgKGdldF90aW1lKGxvd190aW1lX2ZpbGUsIGxvd19lbGFwc2VkKSlcbitcdFx0Z290byBjbGVhbnVwO1xuK1xuK1x0cmV0ID0gMDtcbitcbitjbGVhbnVwOlxuK1x0LyogT24gZmFpbHVyZSwgbWFrZSBzdXJlIG5vIGNoaWxkIHByb2Nlc3MgaXMgbGVmdCBiZWhpbmQgKi9cbitcdGlmIChyZXQpIHtcbitcdFx0aWYgKGhpZ2hfcGlkIFx1MDAzZSAwKSB7XG4rXHRcdFx0a2lsbChoaWdoX3BpZCwgU0lHS0lMTCk7XG4rXHRcdFx0KHZvaWQpd2FpdHBpZChoaWdoX3BpZCwgTlVMTCwgMCk7XG4rXHRcdH1cbitcdFx0aWYgKGxvd19waWQgXHUwMDNlIDApIHtcbitcdFx0XHRraWxsKGxvd19waWQsIFNJR0tJTEwpO1xuK1x0XHRcdCh2b2lkKXdhaXRwaWQobG93X3BpZCwgTlVMTCwgMCk7XG4rXHRcdH1cbitcdH1cbitcdHVubGluayhsb3dfdGltZV9maWxlKTtcbitcdHVubGluayhoaWdoX3RpbWVfZmlsZSk7XG4rXHR1bmxpbmsobG93X2RhdGFfZmlsZSk7XG4rXHR1bmxpbmsoaGlnaF9kYXRhX2ZpbGUpO1xuK1x0cmV0dXJuIHJldDtcbit9XG4rXG4rc3RhdGljIGludFxuK3NldHVwX2JwZih1NjQgaGlnaF9jZ3JvdXBfaWQsIHU2NCBsb3dfY2dyb3VwX2lkLFxuK1x0ICBzdHJ1Y3QgbWVtY2dfYXN5bmNfcmVjbGFpbSAqKnNrZWxfcHRyKVxuK3tcbitcdHN0cnVjdCBtZW1jZ19hc3luY19yZWNsYWltICpza2VsO1xuK1x0c3RydWN0IGJwZl9hcmdzX3MgYnBmX2FyZ3MgPSB7XG4rXHRcdC5oaWdoX2Nncm91cF9pZCA9IGhpZ2hfY2dyb3VwX2lkLFxuK1x0XHQubG93X2Nncm91cF9pZCA9IGxvd19jZ3JvdXBfaWQsXG4rXHRcdC5ldmVudF9kZWx0YV90aHJlc2hvbGQgPSBFVkVOVF9ERUxUQV9USFJFU0hPTEQsXG4rXHRcdC5jaGVja19ucyA9IENIRUNLX1BFUklPRF9OUyxcbitcdH07XG4rXHRMSUJCUEZfT1BUUyhicGZfdGVzdF9ydW5fb3B0cywgcnVuX29wdHMsXG4rXHRcdC5jdHhfaW4gPSBcdTAwMjZicGZfYXJncyxcbitcdFx0LmN0eF9zaXplX2luID0gc2l6ZW9mKGJwZl9hcmdzKSk7XG4rXHRpbnQgcHJvZ19pbml0X2ZkLCBlcnI7XG4rXG4rXHRza2VsID0gbWVtY2dfYXN5bmNfcmVjbGFpbV9fb3Blbl9hbmRfbG9hZCgpO1xuK1x0aWYgKCFBU1NFUlRfT0tfUFRSKHNrZWwsIFwibWVtY2dfYXN5bmNfcmVjbGFpbV9fb3Blbl9hbmRfbG9hZFwiKSlcbitcdFx0cmV0dXJuIC0xO1xuK1xuK1x0cHJvZ19pbml0X2ZkID0gYnBmX3Byb2dyYW1fX2ZkKHNrZWwtXHUwMDNlcHJvZ3Mud3FfcHJvZ19pbml0KTtcbitcbitcdGVyciA9IGJwZl9wcm9nX3Rlc3RfcnVuX29wdHMocHJvZ19pbml0X2ZkLCBcdTAwMjZydW5fb3B0cyk7XG4rXHRpZiAoIUFTU0VSVF9PSyhlcnIsIFwiYnBmX3Byb2dfdGVzdF9ydW5fb3B0c1wiKSlcbitcdFx0Z290byBlcnJvcl9vdXQ7XG4rXHRpZiAoIUFTU0VSVF9FUShydW5fb3B0cy5yZXR2YWwsIDAsIFwicHJvZ19pbml0IHJldHZhbFwiKSlcbitcdFx0Z290byBlcnJvcl9vdXQ7XG4rXG4rXHQqc2tlbF9wdHIgPSBza2VsO1xuK1x0cmV0dXJuIDA7XG4rXG4rZXJyb3Jfb3V0OlxuK1x0bWVtY2dfYXN5bmNfcmVjbGFpbV9fZGVzdHJveShza2VsKTtcbitcdHJldHVybiAtMTtcbit9XG4rXG4rdm9pZCB0ZXN0X21lbWNnX3dxX2FzeW5jX3JlY2xhaW0odm9pZClcbit7XG4rXHR1NjQgaGlnaF9jZ3JvdXBfaWQsIGxvd19jZ3JvdXBfaWQ7XG4rXHRpbnQgZXJyO1xuK1x0ZG91YmxlIGhpZ2hfdGltZSA9IDAuMCwgbG93X3RpbWUgPSAwLjA7XG4rXHRzdHJ1Y3QgbWVtY2dfYXN5bmNfcmVjbGFpbSAqc2tlbCA9IE5VTEw7XG4rXG4rXHRlcnIgPSBzZXR1cF9oaWdoX2xvd19jZ3JvdXBzKFx1MDAyNmhpZ2hfY2dyb3VwX2lkLCBcdTAwMjZsb3dfY2dyb3VwX2lkKTtcbitcdGlmICghQVNTRVJUX09LKGVyciwgXCJzZXR1cF9oaWdoX2xvd19jZ3JvdXBzIHJlY2xhaW1cIikpXG4rXHRcdHJldHVybjtcbitcbitcdGVyciA9IHNldHVwX2JwZihoaWdoX2Nncm91cF9pZCwgbG93X2Nncm91cF9pZCwgXHUwMDI2c2tlbCk7XG4rXHRpZiAoIUFTU0VSVF9PSyhlcnIsIFwic2V0dXBfYnBmXCIpKVxuK1x0XHRnb3RvIG91dDtcbitcbitcdGVyciA9IHJ1bl9oaWdoX2xvd193b3JrbG9hZChcdTAwMjZoaWdoX3RpbWUsIFx1MDAyNmxvd190aW1lLCBSRUFEX1RJTUVTKTtcbitcdGlmICghQVNTRVJUX09LKGVyciwgXCJydW5faGlnaF9sb3dfd29ya2xvYWQgcmVjbGFpbVwiKSlcbitcdFx0Z290byBvdXQ7XG4rXG4rXHQvKlxuK1x0ICogVGhlIHRpbWluZyBjb21wYXJpc29uIGJlbG93IGFsb25lIGNhbm5vdCBkaXN0aW5ndWlzaCBhIHdvcmtpbmdcbitcdCAqIHJlY2xhaW0gZnJvbSBhIG5vLW9wIG9uZSwgc28gcmVxdWlyZSB0aGF0IHRoZSBCUEYgcHJvZ3JhbVxuK1x0ICogYWN0dWFsbHkgcmVjbGFpbWVkIHBhZ2VzIGZyb20gdGhlIGxvdyBjZ3JvdXAuXG4rXHQgKi9cbitcdGlmICghQVNTRVJUX0dUKHNrZWwtXHUwMDNlYnNzLVx1MDAzZXJlY2xhaW1fY2FsbHMsIDAsIFwicmVjbGFpbV9jYWxsc1wiKSlcbitcdFx0Z290byBvdXQ7XG4rXHRpZiAoIUFTU0VSVF9HVChza2VsLVx1MDAzZWJzcy1cdTAwM2VyZWNsYWltZWRfcGFnZXMsIDAsIFwicmVjbGFpbWVkX3BhZ2VzXCIpKVxuK1x0XHRnb3RvIG91dDtcbitcbitcdGlmIChoaWdoX3RpbWUgXHUwMDNlPSBsb3dfdGltZSlcbitcdFx0UFJJTlRfRkFJTChcImhpZ2ggY2dyb3VwIG5vdCBpbXByb3ZlZCB3aXRoIGFzeW5jIHJlY2xhaW06IGhpZ2hfdGltZT0lZiBsb3dfdGltZT0lZlwiLFxuK1x0XHRcdCAgIGhpZ2hfdGltZSwgbG93X3RpbWUpO1xuK1xuK291dDpcbitcdGlmIChza2VsKVxuK1x0XHRtZW1jZ19hc3luY19yZWNsYWltX19kZXN0cm95KHNrZWwpO1xuK1x0Y2xlYW51cF9jZ3JvdXBfZW52aXJvbm1lbnQoKTtcbit9XG5kaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dzL21lbWNnX2FzeW5jX3JlY2xhaW0uYyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9wcm9ncy9tZW1jZ19hc3luY19yZWNsYWltLmNcbm5ldyBmaWxlIG1vZGUgMTAwNjQ0XG5pbmRleCAwMDAwMDAwMDAwMDAwLi4yMjVmMGJjNjY3MTEzXG4tLS0gL2Rldi9udWxsXG4rKysgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ3MvbWVtY2dfYXN5bmNfcmVjbGFpbS5jXG5AQCAtMCwwICsxLDE4MCBAQFxuKy8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4wXG4rXG4rI2luY2x1ZGUgXCJ2bWxpbnV4LmhcIlxuKyNpbmNsdWRlIFwiYnBmX2V4cGVyaW1lbnRhbC5oXCJcbisjaW5jbHVkZSBcdTAwM2NicGYvYnBmX2hlbHBlcnMuaFx1MDAzZVxuKyNpbmNsdWRlIFx1MDAzY2JwZi9icGZfdHJhY2luZy5oXHUwMDNlXG4rI2luY2x1ZGUgXHUwMDNjYnBmL2JwZl9jb3JlX3JlYWQuaFx1MDAzZVxuK1xuKyNkZWZpbmUgQ0xPQ0tfTU9OT1RPTklDX0lEXHQxXG4rI2RlZmluZSBQQUdFX1NJWkVcdFx0NDA5NlVMXG4rI2RlZmluZSBSRUNMQUlNX1NJWkVcdFx0KDMyICogUEFHRV9TSVpFKVxuKyNkZWZpbmUgUkVDTEFJTV9NQVhfSVRFUlx0MzJcbitcbitzdHJ1Y3QgYnBmX2FyZ3NfcyB7XG4rXHR1NjQgaGlnaF9jZ3JvdXBfaWQ7XG4rXHR1NjQgbG93X2Nncm91cF9pZDtcbitcdHU2NCBldmVudF9kZWx0YV90aHJlc2hvbGQ7XG4rXHR1NjQgY2hlY2tfbnM7XG4rfTtcbitcbitzdHJ1Y3QgY2dyb3VwX21lbWNnIHtcbitcdHN0cnVjdCBjZ3JvdXAgKmNncnA7XG4rXHRzdHJ1Y3QgbWVtX2Nncm91cCAqbWVtY2c7XG4rfTtcbitcbitzdGF0aWMgdTY0IHdxX2hpZ2hfY2dyb3VwX2lkO1xuK3N0YXRpYyB1NjQgd3FfbG93X2Nncm91cF9pZDtcbitcbisvKiBTdGF0aXN0aWNzIGV4cG9zZWQgdG8gdXNlcnNwYWNlIHRocm91Z2ggLmJzcywgc28gdGhlIHRlc3QgY2FuIHZlcmlmeVxuKyAqIHRoYXQgcmVjbGFpbSBhY3R1YWxseSBoYXBwZW5lZCBpbnN0ZWFkIG9mIHJlbHlpbmcgb24gdGltaW5nIGFsb25lLlxuKyAqL1xuK3U2NCByZWNsYWltX2NhbGxzO1xuK3U2NCByZWNsYWltZWRfcGFnZXM7XG4rXG4rc3RhdGljIGludCBnZXRfY2dyb3VwX21lbWNnX2Zyb21faWQodTY0IGNncm91cF9pZCwgc3RydWN0IGNncm91cF9tZW1jZyAqY20pXG4re1xuK1x0Y20tXHUwMDNlY2dycCA9IGJwZl9jZ3JvdXBfZnJvbV9pZChjZ3JvdXBfaWQpO1xuK1x0aWYgKCFjbS1cdTAwM2VjZ3JwKVxuK1x0XHRyZXR1cm4gLTE7XG4rXG4rXHRjbS1cdTAwM2VtZW1jZyA9IGJwZl9nZXRfbWVtX2Nncm91cChcdTAwMjZjbS1cdTAwM2VjZ3JwLVx1MDAzZXNlbGYpO1xuK1x0aWYgKCFjbS1cdTAwM2VtZW1jZykge1xuK1x0XHRicGZfY2dyb3VwX3JlbGVhc2UoY20tXHUwMDNlY2dycCk7XG4rXHRcdHJldHVybiAtMTtcbitcdH1cbitcbitcdHJldHVybiAwO1xuK31cbitcbitzdGF0aWMgdm9pZCBwdXRfY2dyb3VwX21lbWNnKHN0cnVjdCBjZ3JvdXBfbWVtY2cgKmNtKVxuK3tcbitcdGJwZl9wdXRfbWVtX2Nncm91cChjbS1cdTAwM2VtZW1jZyk7XG4rXHRicGZfY2dyb3VwX3JlbGVhc2UoY20tXHUwMDNlY2dycCk7XG4rfVxuK1xuK3N0YXRpYyBpbnQgZ2V0X2Nncm91cF9ldmVudCh1NjQgY2dyb3VwX2lkLCB1NjQgKnZhbClcbit7XG4rXHRzdHJ1Y3QgY2dyb3VwX21lbWNnIGNtO1xuK1xuK1x0aWYgKGdldF9jZ3JvdXBfbWVtY2dfZnJvbV9pZChjZ3JvdXBfaWQsIFx1MDAyNmNtKSlcbitcdFx0cmV0dXJuIC0xO1xuK1x0YnBmX21lbV9jZ3JvdXBfZmx1c2hfc3RhdHMoY20ubWVtY2cpO1xuK1x0KnZhbCA9IGJwZl9tZW1fY2dyb3VwX3BhZ2Vfc3RhdGUoY20ubWVtY2csXG4rXHRcdGJwZl9jb3JlX2VudW1fdmFsdWUoZW51bSBub2RlX3N0YXRfaXRlbSxcbitcdFx0XHRcdCAgICBXT1JLSU5HU0VUX1JFRkFVTFRfRklMRSkpO1xuK1x0cHV0X2Nncm91cF9tZW1jZyhcdTAwMjZjbSk7XG4rXG4rXHRyZXR1cm4gMDtcbit9XG4rXG4rc3RhdGljIGJvb2xcbitzaG91bGRfcmVjbGFpbV9jZ3JvdXAodTY0IGNncm91cF9pZCwgdTY0ICpwcmV2X2V2ZW50LCB1NjQgZXZlbnRfZGVsdGFfdGhyZXNob2xkKVxuK3tcbitcdHU2NCBjdXIsIGRlbHRhO1xuK1xuK1x0aWYgKGdldF9jZ3JvdXBfZXZlbnQoY2dyb3VwX2lkLCBcdTAwMjZjdXIpKVxuK1x0XHRyZXR1cm4gZmFsc2U7XG4rXG4rXHRkZWx0YSA9IGN1ciAtICpwcmV2X2V2ZW50O1xuK1x0KnByZXZfZXZlbnQgPSBjdXI7XG4rXG4rXHRyZXR1cm4gZGVsdGEgXHUwMDNlPSBldmVudF9kZWx0YV90aHJlc2hvbGQ7XG4rfVxuK1xuK3N0YXRpYyBpbnQgcmVjbGFpbV9jZ3JvdXAodTY0IGNncm91cF9pZClcbit7XG4rXHRzdHJ1Y3QgY2dyb3VwX21lbWNnIGNtO1xuK1x0aW50IGk7XG4rXG4rXHRpZiAoZ2V0X2Nncm91cF9tZW1jZ19mcm9tX2lkKGNncm91cF9pZCwgXHUwMDI2Y20pKVxuK1x0XHRyZXR1cm4gMDtcbitcbitcdHJlY2xhaW1fY2FsbHMrKztcbitcdGZvciAoaSA9IDA7IGkgXHUwMDNjIFJFQ0xBSU1fTUFYX0lURVI7IGkrKykge1xuK1x0XHR1NjQgbnIgPSBicGZfcHJvYWN0aXZlX3JlY2xhaW0oY20ubWVtY2csIFJFQ0xBSU1fU0laRSk7XG4rXG4rXHRcdGlmICghbnIpXG4rXHRcdFx0YnJlYWs7XG4rXHRcdHJlY2xhaW1lZF9wYWdlcyArPSBucjtcbitcdH1cbitcbitcdHB1dF9jZ3JvdXBfbWVtY2coXHUwMDI2Y20pO1xuK1xuK1x0cmV0dXJuIDA7XG4rfVxuK1xuK3N0cnVjdCB3cV9lbGVtIHtcbitcdHN0cnVjdCBicGZfdGltZXIgdGltZXI7XG4rXHRzdHJ1Y3QgYnBmX3dxIHdvcms7XG4rXHR1NjQgcHJldl9ldmVudDtcbitcdHU2NCBldmVudF9kZWx0YV90aHJlc2hvbGQ7XG4rXHR1NjQgY2hlY2tfbnM7XG4rfTtcbitcbitzdHJ1Y3Qge1xuK1x0X191aW50KHR5cGUsIEJQRl9NQVBfVFlQRV9BUlJBWSk7XG4rXHRfX3VpbnQobWF4X2VudHJpZXMsIDEpO1xuK1x0X190eXBlKGtleSwgX191MzIpO1xuK1x0X190eXBlKHZhbHVlLCBzdHJ1Y3Qgd3FfZWxlbSk7XG4rfSB3cV9tYXAgU0VDKFwiLm1hcHNcIik7XG4rXG4rc3RhdGljIGludCBhc3luY19mcmVlKHZvaWQgKm1hcCwgaW50ICprZXksIHZvaWQgKnZhbHVlKVxuK3tcbitcdHN0cnVjdCB3cV9lbGVtICplbGVtID0gdmFsdWU7XG4rXG4rXHRpZiAoc2hvdWxkX3JlY2xhaW1fY2dyb3VwKHdxX2hpZ2hfY2dyb3VwX2lkLCBcdTAwMjZlbGVtLVx1MDAzZXByZXZfZXZlbnQsXG4rXHRcdGVsZW0tXHUwMDNlZXZlbnRfZGVsdGFfdGhyZXNob2xkKSkge1xuK1x0XHRyZWNsYWltX2Nncm91cCh3cV9sb3dfY2dyb3VwX2lkKTtcbitcdFx0YnBmX3dxX3N0YXJ0KFx1MDAyNmVsZW0tXHUwMDNld29yaywgMCk7XG4rXHR9XG4rXG4rXHRyZXR1cm4gMDtcbit9XG4rXG4rc3RhdGljIGludCB3cV90aW1lcl9jYih2b2lkICptYXAsIGludCAqa2V5LCBzdHJ1Y3Qgd3FfZWxlbSAqZWxlbSlcbit7XG4rXHRicGZfd3Ffc3RhcnQoXHUwMDI2ZWxlbS1cdTAwM2V3b3JrLCAwKTtcbitcdGJwZl90aW1lcl9zdGFydChcdTAwMjZlbGVtLVx1MDAzZXRpbWVyLCBlbGVtLVx1MDAzZWNoZWNrX25zLCAwKTtcbitcbitcdHJldHVybiAwO1xuK31cbitcbitTRUMoXCJzeXNjYWxsXCIpXG4raW50IHdxX3Byb2dfaW5pdChzdHJ1Y3QgYnBmX2FyZ3NfcyAqY3R4KVxuK3tcbitcdHN0cnVjdCB3cV9lbGVtICplbGVtO1xuK1x0X191MzIga2V5ID0gMDtcbitcdGludCByZXQ7XG4rXG4rXHRlbGVtID0gYnBmX21hcF9sb29rdXBfZWxlbShcdTAwMjZ3cV9tYXAsIFx1MDAyNmtleSk7XG4rXHRpZiAoIWVsZW0pXG4rXHRcdHJldHVybiAtMTtcbitcbitcdHJldCA9IGJwZl93cV9pbml0KFx1MDAyNmVsZW0tXHUwMDNld29yaywgXHUwMDI2d3FfbWFwLCAwKTtcbitcdGlmIChyZXQpXG4rXHRcdHJldHVybiByZXQ7XG4rXG4rXHRyZXQgPSBicGZfd3Ffc2V0X2NhbGxiYWNrKFx1MDAyNmVsZW0tXHUwMDNld29yaywgYXN5bmNfZnJlZSwgMCk7XG4rXHRpZiAocmV0KVxuK1x0XHRyZXR1cm4gcmV0O1xuK1xuK1x0cmV0ID0gYnBmX3RpbWVyX2luaXQoXHUwMDI2ZWxlbS1cdTAwM2V0aW1lciwgXHUwMDI2d3FfbWFwLCBDTE9DS19NT05PVE9OSUNfSUQpO1xuK1x0aWYgKHJldClcbitcdFx0cmV0dXJuIHJldDtcbitcbitcdHJldCA9IGJwZl90aW1lcl9zZXRfY2FsbGJhY2soXHUwMDI2ZWxlbS1cdTAwM2V0aW1lciwgd3FfdGltZXJfY2IpO1xuK1x0aWYgKHJldClcbitcdFx0cmV0dXJuIHJldDtcbitcbitcdGVsZW0tXHUwMDNlcHJldl9ldmVudCA9IDA7XG4rXHRlbGVtLVx1MDAzZWV2ZW50X2RlbHRhX3RocmVzaG9sZCA9IGN0eC1cdTAwM2VldmVudF9kZWx0YV90aHJlc2hvbGQ7XG4rXHRlbGVtLVx1MDAzZWNoZWNrX25zID0gY3R4LVx1MDAzZWNoZWNrX25zO1xuK1xuK1x0d3FfaGlnaF9jZ3JvdXBfaWQgPSBjdHgtXHUwMDNlaGlnaF9jZ3JvdXBfaWQ7XG4rXHR3cV9sb3dfY2dyb3VwX2lkID0gY3R4LVx1MDAzZWxvd19jZ3JvdXBfaWQ7XG4rXG4rXHRyZXR1cm4gYnBmX3RpbWVyX3N0YXJ0KFx1MDAyNmVsZW0tXHUwMDNldGltZXIsIGVsZW0tXHUwMDNlY2hlY2tfbnMsIDApO1xuK31cbitcbitjaGFyIExJQ0VOU0VbXSBTRUMoXCJsaWNlbnNlXCIpID0gXCJHUExcIjtcbiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTE5VDA3OjQ0OjQ2LjYwMzI0Mzc4NloiLCJTZXEiOjExLCJOZXN0aW5nIjozLCJUeXBlIjoibGxtIiwiTmFtZSI6Imttc2FuLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuMS1wcm8tcHJldmlldyIsIkR1cmF0aW9uIjoxNDE0Njg3NjMwMCwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiKipLTVNBTiBGdXp6aW5nIERlY2lzaW9uOiBOZWVkc0tNU0FOID0gZmFsc2UqKlxuXG5Pa2F5LCBsZXQncyBicmVhayB0aGlzIGRvd24uIFdlJ3ZlIGdvdCBhIHBhdGNoIHRoYXQncyBlc3NlbnRpYWxseSBleHBvc2luZyBgdHJ5X3RvX2ZyZWVfbWVtX2Nncm91cF9wYWdlc2AgdmlhIGEgQlBGIGludGVyZmFjZSDigJMgdHdvIG5ldyBrZnVuY3MsIGBicGZfcHJvYWN0aXZlX3JlY2xhaW1gIGFuZCBgYnBmX3Byb2FjdGl2ZV9yZWNsYWltX3N3YXBwaW5lc3NgLiBUaGUgcXVlc3Rpb24gaXMsIGRvZXMgdGhpcyB3YXJyYW50IGEgZGVkaWNhdGVkIEtNU0FOIGZ1enppbmcgc2Vzc2lvbj9cblxuTG9va2luZyBhdCB0aGUgY29kZSwgdGhlc2Uga2Z1bmNzIHRha2UgYSBgc3RydWN0IG1lbV9jZ3JvdXAgKm1lbWNnYCwgYW4gYHVuc2lnbmVkIGxvbmcgc2l6ZWAsIGFuZCBhbiBvcHRpb25hbCBgaW50IHN3YXBwaW5lc3NgLiBDcnVjaWFsbHksIHRoZXNlIGFyZ3VtZW50cyBhcmUgKnByb3ZpZGVkIGJ5IEJQRiBwcm9ncmFtcyosIG1lYW5pbmcgdGhlIEJQRiB2ZXJpZmllciBpcyBnb2luZyB0byBlbnN1cmUgdGhhdCBhbGwgb2YgdGhlIGFyZ3VtZW50cyBhcmUgcHJvcGVybHkgaW5pdGlhbGl6ZWQgYmVmb3JlIHRoZXkncmUgcGFzc2VkLiBUaGUga2Z1bmNzIHRoZW1zZWx2ZXMgYXJlIGp1c3QgcGFzc2luZyB0aGVzZSBpbml0aWFsaXplZCBhcmd1bWVudHMgb24gdG8gYHRyeV90b19mcmVlX21lbV9jZ3JvdXBfcGFnZXNgLiBObyBuZXcga2VybmVsIHN0cnVjdHVyZXMgYXJlIGJlaW5nIHNlbnQgdG8gdXNlcnNwYWNlLCB0aGVyZSdzIG5vIGRhdGEgY29weWluZyBpbiBlaXRoZXIgZGlyZWN0aW9uIGJleW9uZCB0aG9zZSB2ZXJpZmllZCBhcmd1bWVudHMsIGFuZCBubyBjb21wbGV4LCBwYXJ0aWFsbHktaW5pdGlhbGl6ZWQgZGF0YSBzdHJ1Y3R1cmVzIGFyZSBiZWluZyBhbGxvY2F0ZWQuIFRoZSBwYXRjaCBhbHNvIGluY2x1ZGVzIGEgc2VsZnRlc3QsIHdoaWNoIGlzIGEgZ29vZCBzaWduLlxuXG5TbywgbGV0J3MgcmV2aWV3IHRoZSBjcml0ZXJpYS4gKjEuIEtlcm5lbCBzdHJ1Y3R1cmVzIHNlbnQgdG8gdXNlciBzcGFjZSB3aGVyZSBmaWVsZHMgbWlnaHQgbm90IGJlIGZ1bGx5IGluaXRpYWxpemVkPyogTm8uICoyLiBDb25kaXRpb25hbCBsb2dpYyBvciBicmFuY2hpbmcgdGhhdCBkZXBlbmRzIG9uIHBvdGVudGlhbGx5IHVuaW5pdGlhbGl6ZWQgdmFyaWFibGVzIG9yIHN0cnVjdCBmaWVsZHM/KiBBYnNvbHV0ZWx5IG5vdCwgdGhlIEJQRiB2ZXJpZmllciBoYXMgdGhhdCBjb3ZlcmVkLiAqMy4gQWxsb2NhdGlvbiBvciBpbml0aWFsaXphdGlvbiBvZiBjb21wbGV4IGRhdGEgc3RydWN0dXJlcyB3aGVyZSB1bmluaXRpYWxpemVkIGZpZWxkcyBjb3VsZCBiZSByZWFkIGxhdGVyPyogTm9wZSwgbm90IGhlcmUuICo0LiBCb3VuZHMgY2hlY2tzLCBsZW5ndGhzLCBvciBsb2dpYyBpbiBhIHdheSB0aGF0IGFsbG93cyBzdXJyb3VuZGluZyBjb2RlIHRvIGFjY2VzcyB1bmluaXRpYWxpemVkIGJ5dGVzIG9mIGV4aXN0aW5nIGJ1ZmZlcnM/KiBTdGlsbCBuby5cblxuR2l2ZW4gYWxsIG9mIHRoYXQsIHRoaXMgcGF0Y2ggaXMgYmFzaWNhbGx5IGp1c3QgYSBCUEYgd3JhcHBlciBhcm91bmQgYW4gZXhpc3RpbmcgZnVuY3Rpb24uIEFueSBwb3RlbnRpYWwgaXNzdWVzIGFyZSBnb2luZyB0byBiZSBzdGFuZGFyZCBtZW1vcnkgc2FmZXR5IHZpb2xhdGlvbnMgbGlrZSB1c2UtYWZ0ZXItZnJlZSwgb3V0LW9mLWJvdW5kcywgb3Igc29tZSBzb3J0IG9mIGxvZ2ljIGVycm9yIGluIHRoZSB3cmFwcGluZyBpdHNlbGYuIFRob3NlIGFyZSB0aGUga2luZHMgb2YgdGhpbmdzIHRoYXQgS0FTQU4gYW5kIHRoZSBub3JtYWwgQlBGIHZlcmlmaWVyIGNoZWNrcyBzaG91bGQgY2F0Y2gsIHNvIHRoZXJlJ3Mgbm8gaW5oZXJlbnQgdW5pbml0aWFsaXplZCBtZW1vcnkgZXhwb3N1cmUuIEknbSBnb2luZyB0byBzZXQgYE5lZWRzS01TQU4gPSBmYWxzZWAuXG5cblxuIiwiSW5wdXRUb2tlbnMiOjEwNTA1LCJPdXRwdXRUb2tlbnMiOjIzNCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjY0OCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTE5VDA3OjQ1OjAwLjc1MDEyMzYwNloiLCJTZXEiOjEyLCJOZXN0aW5nIjozLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJzZXQtcmVzdWx0cyIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjE3NzUwLCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiS01TQU5SZWFzb25pbmdcIjogXCJUaGUgcGF0Y2ggaW50cm9kdWNlcyB0d28gbmV3IEJQRiBrZnVuY3MgKGBicGZfcHJvYWN0aXZlX3JlY2xhaW1gIGFuZCBgYnBmX3Byb2FjdGl2ZV9yZWNsYWltX3N3YXBwaW5lc3NgKSB0aGF0IHdyYXAgdGhlIGV4aXN0aW5nIGB0cnlfdG9fZnJlZV9tZW1fY2dyb3VwX3BhZ2VzYCBmdW5jdGlvbiB0byBhbGxvdyBCUEYgcHJvZ3JhbXMgdG8gdHJpZ2dlciBwcm9hY3RpdmUgbWVtb3J5IHJlY2xhaW0gZm9yIGEgbWVtb3J5IGNncm91cC4gVGhlIGFyZ3VtZW50cyBwYXNzZWQgdG8gdGhlc2Uga2Z1bmNzIGFyZSBzY2FsYXIgdmFsdWVzIGFuZCBwb2ludGVycyB2ZXJpZmllZCBieSB0aGUgQlBGIHZlcmlmaWVyLCBlbnN1cmluZyB0aGV5IGFyZSBpbml0aWFsaXplZC4gVGhlIHBhdGNoIGRvZXMgbm90IGludHJvZHVjZSBhbnkgbmV3IGRhdGEgc3RydWN0dXJlcyBjb3BpZWQgdG8gb3IgZnJvbSB1c2Vyc3BhY2UsIG5vciBkb2VzIGl0IGFsbG9jYXRlIGNvbXBsZXggc3RydWN0dXJlcyB0aGF0IG1pZ2h0IGJlIGxlZnQgcGFydGlhbGx5IHVuaW5pdGlhbGl6ZWQuIFRoZXJlIGlzIG5vIHJpc2sgb2YgdW5pbml0aWFsaXplZCBtZW1vcnkgYmVpbmcgbGVha2VkIHRvIHVzZXJzcGFjZSBvciB1c2VkIGluIGNvbnRyb2wgZmxvdyBkZWNpc2lvbnMuIEFueSBwb3RlbnRpYWwgbWVtb3J5IHNhZmV0eSBpc3N1ZXMgaW50cm9kdWNlZCBieSB0aGVzZSBjaGFuZ2VzIChzdWNoIGFzIHVzZS1hZnRlci1mcmVlIG9yIG91dC1vZi1ib3VuZHMgYWNjZXNzZXMgb24gdGhlIGBtZW1fY2dyb3VwYCBwb2ludGVyKSB3b3VsZCBiZSBlZmZlY3RpdmVseSBjYXVnaHQgYnkgS0FTQU4gYW5kIHRoZSBzdGFuZGFyZCBCUEYgdmVyaWZpZXIgY2hlY2tzLiBUaGVyZWZvcmUsIGEgZGVkaWNhdGVkIEtNU0FOIGZ1enppbmcgc2Vzc2lvbiBpcyBub3QgcmVxdWlyZWQuXCIsXG4gIFwiTmVlZHNLTVNBTlwiOiBmYWxzZVxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiS01TQU5SZWFzb25pbmdcIjogXCJUaGUgcGF0Y2ggaW50cm9kdWNlcyB0d28gbmV3IEJQRiBrZnVuY3MgKGBicGZfcHJvYWN0aXZlX3JlY2xhaW1gIGFuZCBgYnBmX3Byb2FjdGl2ZV9yZWNsYWltX3N3YXBwaW5lc3NgKSB0aGF0IHdyYXAgdGhlIGV4aXN0aW5nIGB0cnlfdG9fZnJlZV9tZW1fY2dyb3VwX3BhZ2VzYCBmdW5jdGlvbiB0byBhbGxvdyBCUEYgcHJvZ3JhbXMgdG8gdHJpZ2dlciBwcm9hY3RpdmUgbWVtb3J5IHJlY2xhaW0gZm9yIGEgbWVtb3J5IGNncm91cC4gVGhlIGFyZ3VtZW50cyBwYXNzZWQgdG8gdGhlc2Uga2Z1bmNzIGFyZSBzY2FsYXIgdmFsdWVzIGFuZCBwb2ludGVycyB2ZXJpZmllZCBieSB0aGUgQlBGIHZlcmlmaWVyLCBlbnN1cmluZyB0aGV5IGFyZSBpbml0aWFsaXplZC4gVGhlIHBhdGNoIGRvZXMgbm90IGludHJvZHVjZSBhbnkgbmV3IGRhdGEgc3RydWN0dXJlcyBjb3BpZWQgdG8gb3IgZnJvbSB1c2Vyc3BhY2UsIG5vciBkb2VzIGl0IGFsbG9jYXRlIGNvbXBsZXggc3RydWN0dXJlcyB0aGF0IG1pZ2h0IGJlIGxlZnQgcGFydGlhbGx5IHVuaW5pdGlhbGl6ZWQuIFRoZXJlIGlzIG5vIHJpc2sgb2YgdW5pbml0aWFsaXplZCBtZW1vcnkgYmVpbmcgbGVha2VkIHRvIHVzZXJzcGFjZSBvciB1c2VkIGluIGNvbnRyb2wgZmxvdyBkZWNpc2lvbnMuIEFueSBwb3RlbnRpYWwgbWVtb3J5IHNhZmV0eSBpc3N1ZXMgaW50cm9kdWNlZCBieSB0aGVzZSBjaGFuZ2VzIChzdWNoIGFzIHVzZS1hZnRlci1mcmVlIG9yIG91dC1vZi1ib3VuZHMgYWNjZXNzZXMgb24gdGhlIGBtZW1fY2dyb3VwYCBwb2ludGVyKSB3b3VsZCBiZSBlZmZlY3RpdmVseSBjYXVnaHQgYnkgS0FTQU4gYW5kIHRoZSBzdGFuZGFyZCBCUEYgdmVyaWZpZXIgY2hlY2tzLiBUaGVyZWZvcmUsIGEgZGVkaWNhdGVkIEtNU0FOIGZ1enppbmcgc2Vzc2lvbiBpcyBub3QgcmVxdWlyZWQuXCIsXG4gIFwiTmVlZHNLTVNBTlwiOiBmYWxzZVxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9XTsKCQkJaWYgKCFyYXdEYXRhIHx8IHJhd0RhdGEubGVuZ3RoID09PSAwKSByZXR1cm47CgoJCQlkcmF3U3VtbWFyeVRhYmxlcyhyYXdEYXRhKTsKCQkJZHJhd0R1cmF0aW9uQ2hhcnQocmF3RGF0YSk7CgkJCWRyYXdUb2tlbkNvbnN1bXB0aW9uQ2hhcnQocmF3RGF0YSk7CgkJfQoKCQlmdW5jdGlvbiBkcmF3U3VtbWFyeVRhYmxlcyhyYXdEYXRhKSB7CgkJCWNvbnN0IHN0YXRzID0gewoJCQkJbGxtOiB7IGNvdW50OiAwLCB0b2tlbnM6IDAsIGR1cmF0aW9uOiAwIH0sCgkJCQl0b29sOiB7IGNvdW50OiAwLCBkdXJhdGlvbjogMCB9CgkJCX07CgoJCQlyYXdEYXRhLmZvckVhY2gocyA9PiB7CgkJCQljb25zdCBkdXIgPSBzLkR1cmF0aW9uIC8gMTAwMDAwMDAwMDsgCgkJCQlpZiAocy5UeXBlID09PSAibGxtIikgewoJCQkJCXN0YXRzLmxsbS5jb3VudCsrOwoJCQkJCXN0YXRzLmxsbS50b2tlbnMgKz0gKHMuSW5wdXRUb2tlbnMgKyBzLk91dHB1dFRva2VucyArIHMuT3V0cHV0VGhvdWdodHNUb2tlbnMpOwoJCQkJCXN0YXRzLmxsbS5kdXJhdGlvbiArPSBkdXI7CgkJCQl9IGVsc2UgaWYgKHMuVHlwZSA9PT0gInRvb2wiKSB7CgkJCQkJc3RhdHMudG9vbC5jb3VudCsrOwoJCQkJCXN0YXRzLnRvb2wuZHVyYXRpb24gKz0gZHVyOwoJCQkJfQoJCQl9KTsKCgkJCWNvbnN0IGF2Z0xsbUR1ciA9IHN0YXRzLmxsbS5jb3VudCA+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-workflowrfgn7[0].run-triage(0) Phase: Succeeded StartedAt: 2026-08-19 06:43:11 +0000 UTC FinishedAt: 2026-08-19 07:45:02 +0000 UTC Input: nil Output: &Outputs{Parameters:[]Parameter{Parameter{Name:result,Default:nil,Value:*{ "skip_reason": "", "targets": [ { "base": { "arch": "amd64", "tree_name": "bpf-next", "tree_url": "https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git", "commit_hash": "f79066c784022fda83f5936559a1af414e41b603", "config_name": "upstream-apparmor-kasan.config", "enable_configs": [ "MEMCG", "BPF_SYSCALL" ], "series_id": "" }, "patched": { "arch": "amd64", "tree_name": "bpf-next", "tree_url": "https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git", "commit_hash": "f79066c784022fda83f5936559a1af414e41b603", "config_name": "upstream-apparmor-kasan.config", "enable_configs": [ "MEMCG", "BPF_SYSCALL" ], "series_id": "8d9574dc-d2aa-4392-9d3a-291297bace73" }, "track": "KASAN", "fuzz": { "focus": null, "focus_symbols": [ "bpf_proactive_reclaim", "bpf_proactive_reclaim_swappiness" ], "corpus_urls": [ "https://storage.googleapis.com/syzkaller/corpus/ci-upstream-bpf-kasan-gce-corpus.db", "https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db" ], "skip_cover_check": true, "bug_title_re": "" }, "retest": null } ], "trajectory": "CjwhZG9jdHlwZSBodG1sPgo8aHRtbD4KPGhlYWQ+Cgk8dGl0bGU+QUkgVHJhamVjdG9yeTwvdGl0bGU+Cgk8c3R5bGU+CgkJdGFibGUgewoJCQlib3JkZXI6IDFweCBzb2xpZCAjY2NjOwoJCQltYXJnaW46IDIwcHggNXB4OwoJCQlib3JkZXItY29sbGFwc2U6IGNvbGxhcHNlOwoJCQl3aGl0ZS1zcGFjZTogbm93cmFwOwoJCQl0ZXh0LW92ZXJmbG93OiBlbGxpcHNpczsKCQkJb3ZlcmZsb3c6IGhpZGRlbjsKCQl9CgoJCXRhYmxlIGNhcHRpb24gewoJCQlmb250LXdlaWdodDogYm9sZDsKCQl9CgoJCXRhYmxlIHRkLCB0YWJsZSB0aCB7CgkJCXZlcnRpY2FsLWFsaWduOiB0b3A7CgkJCXBhZGRpbmc6IDJweCA4cHg7CgkJCXRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzOwoJCQlvdmVyZmxvdzogaGlkZGVuOwoJCX0KCgkJLmxpc3RfdGFibGUgdGQsIC5saXN0X3RhYmxlIHRoIHsKCQkJYm9yZGVyLWxlZnQ6IDFweCBzb2xpZCAjY2NjOwoJCX0KCgkJLmxpc3RfdGFibGUgdGggewoJCQliYWNrZ3JvdW5kOiAjRjRGNEY0OwoJCX0KCgkJLmxpc3RfdGFibGUgdHI6bnRoLWNoaWxkKDJuKSB7CgkJCWJhY2tncm91bmQ6ICNGNEY0RjQ7CgkJfQoKCQkubGlzdF90YWJsZSB0cjpob3ZlciB7CgkJCWJhY2tncm91bmQ6ICNmZmZmOTk7CgkJfQoKCQkjYWlfZGV0YWlsc19kaXYgcHJlIHsKCQkJbWFyZ2luOiAxcHg7CgkJCW1heC13aWR0aDogMTIwY2g7CgkJCXdoaXRlLXNwYWNlOiBwcmUtd3JhcDsKCQkJb3ZlcmZsb3ctd3JhcDogYnJlYWstd29yZDsKCQl9Cgk8L3N0eWxlPgo8L2hlYWQ+Cjxib2R5PgoJPGgxPkFJIFRyYWplY3Rvcnk8L2gxPgoJPGJyPgoKCQoJPHRhYmxlIGNsYXNzPSJsaXN0X3RhYmxlIj4KCQk8Y2FwdGlvbj5UcmFqZWN0b3J5OiAoPGEgaHJlZj0iIyIgb25jbGljaz0idG9nZ2xlQWxsRGV0YWlscygpOyByZXR1cm4gZmFsc2U7Ij5FeHBhbmQvQ29sbGFwc2UgQWxsPC9hPik8L2NhcHRpb24+CgkJPHRoZWFkPjx0cj4KCQkJPHRoPlNlcTwvdGg+CgkJCTx0aD5UaW1lc3RhbXA8L3RoPgoJCQk8dGg+VHlwZTwvdGg+CgkJCTx0aD5OYW1lPC90aD4KCQkJPHRoPkR1cmF0aW9uPC90aD4KCQk8L3RyPjwvdGhlYWQ+CgkJPHRib2R5PgoJCQoJCTx0cj4KCQkJPHRkPjAvMDwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzE5IDA3OjQ0PC90ZD4KCQkJPHRkPmZsb3c8L3RkPgoJCQk8dGQ+cGF0Y2gtdHJpYWdlPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RW5hYmxlQ29uZmlncyYjMzQ7OiBbCiAgICAmIzM0O01FTUNHJiMzNDssCiAgICAmIzM0O0JQRl9TWVNDQUxMJiMzNDsKICBdLAogICYjMzQ7Rm9jdXNTeW1ib2xzJiMzNDs6IFsKICAgICYjMzQ7YnBmX3Byb2FjdGl2ZV9yZWNsYWltJiMzNDssCiAgICAmIzM0O2JwZl9wcm9hY3RpdmVfcmVjbGFpbV9zd2FwcGluZXNzJiMzNDsKICBdLAogICYjMzQ7S01TQU5SZWFzb25pbmcmIzM0OzogJiMzNDtUaGUgcGF0Y2ggaW50cm9kdWNlcyB0d28gbmV3IEJQRiBrZnVuY3MgKGBicGZfcHJvYWN0aXZlX3JlY2xhaW1gIGFuZCBgYnBmX3Byb2FjdGl2ZV9yZWNsYWltX3N3YXBwaW5lc3NgKSB0aGF0IHdyYXAgdGhlIGV4aXN0aW5nIGB0cnlfdG9fZnJlZV9tZW1fY2dyb3VwX3BhZ2VzYCBmdW5jdGlvbiB0byBhbGxvdyBCUEYgcHJvZ3JhbXMgdG8gdHJpZ2dlciBwcm9hY3RpdmUgbWVtb3J5IHJlY2xhaW0gZm9yIGEgbWVtb3J5IGNncm91cC4gVGhlIGFyZ3VtZW50cyBwYXNzZWQgdG8gdGhlc2Uga2Z1bmNzIGFyZSBzY2FsYXIgdmFsdWVzIGFuZCBwb2ludGVycyB2ZXJpZmllZCBieSB0aGUgQlBGIHZlcmlmaWVyLCBlbnN1cmluZyB0aGV5IGFyZSBpbml0aWFsaXplZC4gVGhlIHBhdGNoIGRvZXMgbm90IGludHJvZHVjZSBhbnkgbmV3IGRhdGEgc3RydWN0dXJlcyBjb3BpZWQgdG8gb3IgZnJvbSB1c2Vyc3BhY2UsIG5vciBkb2VzIGl0IGFsbG9jYXRlIGNvbXBsZXggc3RydWN0dXJlcyB0aGF0IG1pZ2h0IGJlIGxlZnQgcGFydGlhbGx5IHVuaW5pdGlhbGl6ZWQuIFRoZXJlIGlzIG5vIHJpc2sgb2YgdW5pbml0aWFsaXplZCBtZW1vcnkgYmVpbmcgbGVha2VkIHRvIHVzZXJzcGFjZSBvciB1c2VkIGluIGNvbnRyb2wgZmxvdyBkZWNpc2lvbnMuIEFueSBwb3RlbnRpYWwgbWVtb3J5IHNhZmV0eSBpc3N1ZXMgaW50cm9kdWNlZCBieSB0aGVzZSBjaGFuZ2VzIChzdWNoIGFzIHVzZS1hZnRlci1mcmVlIG9yIG91dC1vZi1ib3VuZHMgYWNjZXNzZXMgb24gdGhlIGBtZW1fY2dyb3VwYCBwb2ludGVyKSB3b3VsZCBiZSBlZmZlY3RpdmVseSBjYXVnaHQgYnkgS0FTQU4gYW5kIHRoZSBzdGFuZGFyZCBCUEYgdmVyaWZpZXIgY2hlY2tzLiBUaGVyZWZvcmUsIGEgZGVkaWNhdGVkIEtNU0FOIGZ1enppbmcgc2Vzc2lvbiBpcyBub3QgcmVxdWlyZWQuJiMzNDssCiAgJiMzNDtOZWVkc0tNU0FOJiMzNDs6IGZhbHNlLAogICYjMzQ7UmVhc29uaW5nJiMzNDs6ICYjMzQ7VGhlIHBhdGNoIGludHJvZHVjZXMgdHdvIG5ldyBCUEYga2Z1bmNzLCBgYnBmX3Byb2FjdGl2ZV9yZWNsYWltYCBhbmQgYGJwZl9wcm9hY3RpdmVfcmVjbGFpbV9zd2FwcGluZXNzYCwgd2hpY2ggYWxsb3cgQlBGIHByb2dyYW1zIHRvIHByb2FjdGl2ZWx5IHRyaWdnZXIgbWVtb3J5IHJlY2xhaW0gb24gYSBtZW1vcnkgY2dyb3VwLiBUaGlzIGV4cG9zZXMgY29yZSBtZW1vcnkgbWFuYWdlbWVudCBhbmQgcmVjbGFpbSBsb2dpYyB0byBCUEYsIG1ha2luZyBpdCBhIGZ1bmN0aW9uYWwgY2hhbmdlIHRoYXQgaXMgaGlnaGx5IHJlYWNoYWJsZSBhbmQgd29ydGggZnV6emluZy4mIzM0OywKICAmIzM0O1dvcnRoRnV6emluZyYjMzQ7OiB0cnVlCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4xLzE8L3RkPgoJCQk8dGQ+MjAyNi8wOC8xOSAwNzo0NDwvdGQ+CgkJCTx0ZD5hY3Rpb248L3RkPgoJCQk8dGQ+cmVhZC1wYXRjaC1kaWZmPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7UGF0Y2hEaWZmJiMzNDs6ICYjMzQ7Y29tbWl0IDliZTUzMjUxNDVhMDcwMDYzZDM5MDk1ODMyMzhiNDk3YTk2ZGQ3N2ZcbkF1dGhvcjogc3l6LWNsdXN0ZXIgXHUwMDNjdHJpYWdlQHN5emthbGxlci5jb21cdTAwM2VcbkRhdGU6ICAgV2VkIEF1ZyAxOSAwNzo0NDoxOCAyMDI2ICYjNDM7MDAwMFxuXG4gICAgc3l6LWNsdXN0ZXI6IGFwcGxpZWQgcGF0Y2ggdW5kZXIgcmV2aWV3XG5cbmRpZmYgLS1naXQgYS9tbS9icGZfbWVtY29udHJvbC5jIGIvbW0vYnBmX21lbWNvbnRyb2wuY1xuaW5kZXggNzE2ZGY0OWQ3NjQ3Ny4uYjBhMGQ0YzU1ZGM0ZSAxMDA2NDRcbi0tLSBhL21tL2JwZl9tZW1jb250cm9sLmNcbiYjNDM7JiM0MzsmIzQzOyBiL21tL2JwZl9tZW1jb250cm9sLmNcbkBAIC02LDYgJiM0Mzs2LDcgQEBcbiAgKi9cbiBcbiAjaW5jbHVkZSBcdTAwM2NsaW51eC9tZW1jb250cm9sLmhcdTAwM2VcbiYjNDM7I2luY2x1ZGUgXHUwMDNjbGludXgvc3dhcC5oXHUwMDNlXG4gI2luY2x1ZGUgXHUwMDNjbGludXgvYnBmLmhcdTAwM2VcbiBcbiBfX2JwZl9rZnVuY19zdGFydF9kZWZzKCk7XG5AQCAtMTU5LDYgJiM0MzsxNjAsMTAzIEBAIF9fYnBmX2tmdW5jIHZvaWQgYnBmX21lbV9jZ3JvdXBfZmx1c2hfc3RhdHMoc3RydWN0IG1lbV9jZ3JvdXAgKm1lbWNnKVxuIFx0bWVtX2Nncm91cF9mbHVzaF9zdGF0cyhtZW1jZyk7XG4gfVxuIFxuJiM0MzsvKlxuJiM0MzsgKiBSZWNsYWltIG11c3Qgbm90IHJlY3Vyc2UuIHRyeV90b19mcmVlX21lbV9jZ3JvdXBfcGFnZXMoKSB1bmNvbmRpdGlvbmFsbHlcbiYjNDM7ICogb3ZlcndyaXRlcyBjdXJyZW50LVx1MDAzZXJlY2xhaW1fc3RhdGUgb24gZW50cnkgYW5kIHJlc2V0cyBpdCB0byBOVUxMIG9uIGV4aXQuXG4mIzQzOyAqIFNvIGludm9raW5nIGl0IGZyb20gYW4gaW4tZmxpZ2h0IHJlY2xhaW0gd291bGQgY2xvYmJlciB0aGUgb3V0ZXIgcmVjbGFpbVxuJiM0MzsgKiBzdGF0ZSBhbmQgY29ycnVwdCBpdHMgYWNjb3VudGluZy5cbiYjNDM7ICpcbiYjNDM7ICogVGhlIGd1YXJkIGlzIFBGX01FTUFMTE9DLiBFdmVyeSByZWNsYWltIGVudHJ5IHBvaW50IG1hcmtzIHRoZSBjdXJyZW50XG4mIzQzOyAqIHRhc2sgd2l0aCBpdCBmb3IgdGhlIHdob2xlIHJlY2xhaW0gd2luZG93OiB0cnlfdG9fZnJlZV9tZW1fY2dyb3VwX3BhZ2VzKClcbiYjNDM7ICogYW5kIF9fcGVyZm9ybV9yZWNsYWltKCkgZG8gc28gdmlhIG1lbWFsbG9jX25vcmVjbGFpbV9zYXZlKCksIGFuZCBrc3dhcGRcbiYjNDM7ICoga2VlcHMgaXQgc2V0IGZvciBpdHMgZW50aXJlIGxpZmV0aW1lLiBBIGhvb2sgaW5zaWRlIHRoZSByZWNsYWltIHBhdGhcbiYjNDM7ICogKHNocmlua19ub2RlLCBzaHJpbmtfc2xhYiwgLi4uKSBleGVjdXRlcyBpbiB0aGUgY29udGV4dCBvZiB0aGVcbiYjNDM7ICogcmVjbGFpbWluZyB0YXNrLCB3aGVyZSBjdXJyZW50LVx1MDAzZWZsYWdzIGFscmVhZHkgY2FycmllcyB0aGUgZmxhZy4gVGhlIHBhZ2VcbiYjNDM7ICogYWxsb2NhdG9yLCB0aGUgbWVtY2cgY2hhcmdpbmcgcGF0aCBhbmQgbm9kZV9yZWNsYWltKCkgcmVseSBvbiB0aGUgc2FtZVxuJiM0MzsgKiBmbGFnIHRvIGF2b2lkIHJlY2xhaW0gcmVjdXJzaW9uLlxuJiM0MzsgKlxuJiM0MzsgKiBJbiB0cnlfdG9fZnJlZV9tZW1fY2dyb3VwX3BhZ2VzKCksIHJlY2xhaW1fc3RhdGUgaXMgc2V0IHNsaWdodGx5IGJlZm9yZVxuJiM0MzsgKiBQRl9NRU1BTExPQywgd2l0aCBvbmx5IGEgdHJhY2Vwb2ludCBpbiBiZXR3ZWVuLCB3aGljaCBhIHNsZWVwYWJsZSBCUEZcbiYjNDM7ICogcHJvZ3JhbSBjYW5ub3QgYXR0YWNoIHRvLlxuJiM0MzsgKiBBbHNvLCBQRl9NRU1BTExPQyBpcyBzZXQgaW4gc29tZSBub24tcmVjbGFpbSBjb250ZXh0cyAoZS5nLiBkaXJlY3QgY29tcGFjdGlvblxuJiM0MzsgKiBhbmQgdm1hbGxvYyksIHdoZXJlIHRoZSBrZnVuYyBjb25zZXJ2YXRpdmVseSByZWZ1c2VzIHRvIHJlY2xhaW0gYXMgd2VsbC5cbiYjNDM7ICovXG4mIzQzO3N0YXRpYyBib29sIGJwZl9pbl9yZWNsYWltX2NvbnRleHQodm9pZClcbiYjNDM7e1xuJiM0MztcdHJldHVybiBjdXJyZW50LVx1MDAzZWZsYWdzIFx1MDAyNiBQRl9NRU1BTExPQztcbiYjNDM7fVxuJiM0MztcbiYjNDM7LypcbiYjNDM7ICogU2hhcmVkIGltcGxlbWVudGF0aW9uIG9mIHRoZSBwcm9hY3RpdmUgcmVjbGFpbSBrZnVuY3M6IHBlcmZvcm1zIG9uZVxuJiM0MzsgKiByZWNsYWltIHBhc3Mgb24gQG1lbWNnIHdpdGggQG5yX3BhZ2VzIGFzIHRoZSBnb2FsLCBhbGxvd2luZyBzd2FwLCBhbmRcbiYjNDM7ICogQHN3YXBwaW5lc3MgYXMgdGhlIGFub24vZmlsZSBiYWxhbmNlIG92ZXJyaWRlIChOVUxMIHRvIGZvbGxvdyB0aGVcbiYjNDM7ICogY2dyb3VwJiMzOTtzIG93biBzd2FwcGluZXNzIHNldHRpbmcpLlxuJiM0MzsgKi9cbiYjNDM7c3RhdGljIHVuc2lnbmVkIGxvbmdcbiYjNDM7YnBmX3Byb2FjdGl2ZV9yZWNsYWltX3BhZ2VzKHN0cnVjdCBtZW1fY2dyb3VwICptZW1jZywgdW5zaWduZWQgbG9uZyBucl9wYWdlcyxcbiYjNDM7XHRcdFx0ICAgIGludCAqc3dhcHBpbmVzcylcbiYjNDM7e1xuJiM0MztcdGlmICghbnJfcGFnZXMgfHwgdW5saWtlbHkoYnBmX2luX3JlY2xhaW1fY29udGV4dCgpKSlcbiYjNDM7XHRcdHJldHVybiAwO1xuJiM0MztcbiYjNDM7XHRyZXR1cm4gdHJ5X3RvX2ZyZWVfbWVtX2Nncm91cF9wYWdlcyhtZW1jZywgbnJfcGFnZXMsIEdGUF9LRVJORUwsXG4mIzQzO1x0XHRcdFx0XHQgICAgTUVNQ0dfUkVDTEFJTV9NQVlfU1dBUCB8XG4mIzQzO1x0XHRcdFx0XHQgICAgTUVNQ0dfUkVDTEFJTV9QUk9BQ1RJVkUsXG4mIzQzO1x0XHRcdFx0XHQgICAgc3dhcHBpbmVzcyk7XG4mIzQzO31cbiYjNDM7XG4mIzQzOy8qKlxuJiM0MzsgKiBicGZfcHJvYWN0aXZlX3JlY2xhaW0gLSBwcm9hY3RpdmVseSByZWNsYWltIG1lbW9yeSBmcm9tIGEgbWVtb3J5XG4mIzQzOyAqICAgICAgICAgICAgICAgICAgICAgICAgIGNncm91cFxuJiM0MzsgKiBAbWVtY2c6IHRoZSB0YXJnZXQgbWVtb3J5IGNncm91cCB0byByZWNsYWltIGZyb21cbiYjNDM7ICogQHNpemU6ICB0aGUgYW1vdW50IG9mIG1lbW9yeSB0byByZWNsYWltLCBpbiBieXRlc1xuJiM0MzsgKlxuJiM0MzsgKiBUcmlnZ2VyIG9uZSBwcm9hY3RpdmUgcmVjbGFpbSBwYXNzIG9uIEBtZW1jZywgc2ltaWxhciB0byBhIHdyaXRlIHRvXG4mIzQzOyAqIHRoZSBtZW1vcnkucmVjbGFpbSBjZ3JvdXAgZmlsZTogcGFnZXMgYXJlIHJlY2xhaW1lZCBhY2NvcmRpbmcgdG8gdGhlXG4mIzQzOyAqIGNncm91cCYjMzk7cyBvd24gc3dhcHBpbmVzcyBzZXR0aW5nIGFuZCBzd2FwIGlzIGFsbG93ZWQuIE5vdGUgdGhhdCxcbiYjNDM7ICogdW5saWtlIG1lbW9yeS5yZWNsYWltLCB0aGlzIGRvZXMgbm90IHJldHJ5IHVudGlsIEBzaXplIGlzIHJlYWNoZWQ7XG4mIzQzOyAqIGNhbGxlcnMgY2FuIGludm9rZSBpdCBhZ2FpbiBpZiBuZWVkZWQuXG4mIzQzOyAqXG4mIzQzOyAqIFJldHVybjpcbiYjNDM7ICogICBUaGUgbnVtYmVyIG9mIHBhZ2VzIGFjdHVhbGx5IHJlY2xhaW1lZCwgb3IgMCBpZiBAc2l6ZSBpcyBzbWFsbGVyXG4mIzQzOyAqICAgdGhhbiBhIHBhZ2Ugb3IgdGhlIGNhbGxpbmcgdGFzayBpcyBhbHJlYWR5IGluIGEgcmVjbGFpbS9mcmVlaW5nXG4mIzQzOyAqICAgY29udGV4dCAoUEZfTUVNQUxMT0MpLlxuJiM0MzsgKi9cbiYjNDM7X19icGZfa2Z1bmMgdW5zaWduZWQgbG9uZyBicGZfcHJvYWN0aXZlX3JlY2xhaW0oc3RydWN0IG1lbV9jZ3JvdXAgKm1lbWNnLFxuJiM0MztcdFx0XHRcdFx0XHR1bnNpZ25lZCBsb25nIHNpemUpXG4mIzQzO3tcbiYjNDM7XHRyZXR1cm4gYnBmX3Byb2FjdGl2ZV9yZWNsYWltX3BhZ2VzKG1lbWNnLCBzaXplIC8gUEFHRV9TSVpFLCBOVUxMKTtcbiYjNDM7fVxuJiM0MztcbiYjNDM7LyoqXG4mIzQzOyAqIGJwZl9wcm9hY3RpdmVfcmVjbGFpbV9zd2FwcGluZXNzIC0gcHJvYWN0aXZlbHkgcmVjbGFpbSBtZW1vcnkgZnJvbSBhXG4mIzQzOyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVtb3J5IGNncm91cCB3aXRoIGFuIGV4cGxpY2l0XG4mIzQzOyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3dhcHBpbmVzc1xuJiM0MzsgKiBAbWVtY2c6ICAgICAgdGhlIHRhcmdldCBtZW1vcnkgY2dyb3VwIHRvIHJlY2xhaW0gZnJvbVxuJiM0MzsgKiBAc2l6ZTogICAgICAgdGhlIGFtb3VudCBvZiBtZW1vcnkgdG8gcmVjbGFpbSwgaW4gYnl0ZXNcbiYjNDM7ICogQHN3YXBwaW5lc3M6IHN3YXBwaW5lc3Mgb3ZlcnJpZGUgZm9yIHRoaXMgcmVjbGFpbSBwYXNzXG4mIzQzOyAqXG4mIzQzOyAqIFNhbWUgYXMgYnBmX3Byb2FjdGl2ZV9yZWNsYWltKCksIGV4Y2VwdCB0aGF0IHRoZSBhbm9uL2ZpbGUgcmVjbGFpbVxuJiM0MzsgKiBiYWxhbmNlIGlzIGNvbnRyb2xsZWQgYnkgQHN3YXBwaW5lc3MgaW5zdGVhZCBvZiB0aGUgY2dyb3VwJiMzOTtzXG4mIzQzOyAqIHN3YXBwaW5lc3Mgc2V0dGluZy4gVmFsaWQgdmFsdWVzIGFyZSBbTUlOX1NXQVBQSU5FU1MsIE1BWF9TV0FQUElORVNTXVxuJiM0MzsgKiBhbmQgU1dBUFBJTkVTU19BTk9OX09OTFksIHdoaWNoIHJlc3RyaWN0cyByZWNsYWltIHRvIGFub24gZm9saW9zLlxuJiM0MzsgKlxuJiM0MzsgKiBSZXR1cm46XG4mIzQzOyAqICAgVGhlIG51bWJlciBvZiBwYWdlcyBhY3R1YWxseSByZWNsYWltZWQsIG9yIDAgaWYgQHNpemUgaXMgc21hbGxlclxuJiM0MzsgKiAgIHRoYW4gYSBwYWdlLCBAc3dhcHBpbmVzcyBpcyBvdXQgb2YgcmFuZ2UsIG9yIHRoZSBjYWxsaW5nIHRhc2sgaXNcbiYjNDM7ICogICBhbHJlYWR5IGluIGEgcmVjbGFpbS9mcmVlaW5nIGNvbnRleHQgKFBGX01FTUFMTE9DKS5cbiYjNDM7ICovXG4mIzQzO19fYnBmX2tmdW5jIHVuc2lnbmVkIGxvbmdcbiYjNDM7YnBmX3Byb2FjdGl2ZV9yZWNsYWltX3N3YXBwaW5lc3Moc3RydWN0IG1lbV9jZ3JvdXAgKm1lbWNnLCB1bnNpZ25lZCBsb25nIHNpemUsXG4mIzQzO1x0XHRcdFx0IGludCBzd2FwcGluZXNzKVxuJiM0Mzt7XG4mIzQzO1x0aWYgKHN3YXBwaW5lc3MgXHUwMDNjIE1JTl9TV0FQUElORVNTIHx8IHN3YXBwaW5lc3MgXHUwMDNlIFNXQVBQSU5FU1NfQU5PTl9PTkxZKVxuJiM0MztcdFx0cmV0dXJuIDA7XG4mIzQzO1xuJiM0MztcdHJldHVybiBicGZfcHJvYWN0aXZlX3JlY2xhaW1fcGFnZXMobWVtY2csIHNpemUgLyBQQUdFX1NJWkUsXG4mIzQzO1x0XHRcdFx0XHQgICBcdTAwMjZzd2FwcGluZXNzKTtcbiYjNDM7fVxuJiM0MztcbiBfX2JwZl9rZnVuY19lbmRfZGVmcygpO1xuIFxuIEJURl9LRlVOQ1NfU1RBUlQoYnBmX21lbWNvbnRyb2xfa2Z1bmNzKVxuQEAgLTE3Miw2ICYjNDM7MjcwLDkgQEAgQlRGX0lEX0ZMQUdTKGZ1bmMsIGJwZl9tZW1fY2dyb3VwX3VzYWdlKVxuIEJURl9JRF9GTEFHUyhmdW5jLCBicGZfbWVtX2Nncm91cF9wYWdlX3N0YXRlKVxuIEJURl9JRF9GTEFHUyhmdW5jLCBicGZfbWVtX2Nncm91cF9mbHVzaF9zdGF0cywgS0ZfU0xFRVBBQkxFKVxuIFxuJiM0MztCVEZfSURfRkxBR1MoZnVuYywgYnBmX3Byb2FjdGl2ZV9yZWNsYWltLCBLRl9TTEVFUEFCTEUpXG4mIzQzO0JURl9JRF9GTEFHUyhmdW5jLCBicGZfcHJvYWN0aXZlX3JlY2xhaW1fc3dhcHBpbmVzcywgS0ZfU0xFRVBBQkxFKVxuJiM0MztcbiBCVEZfS0ZVTkNTX0VORChicGZfbWVtY29udHJvbF9rZnVuY3MpXG4gXG4gc3RhdGljIGNvbnN0IHN0cnVjdCBidGZfa2Z1bmNfaWRfc2V0IGJwZl9tZW1jb250cm9sX2tmdW5jX3NldCA9IHtcbmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ190ZXN0cy9tZW1jZ19hc3luY19yZWNsYWltLmMgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ190ZXN0cy9tZW1jZ19hc3luY19yZWNsYWltLmNcbm5ldyBmaWxlIG1vZGUgMTAwNjQ0XG5pbmRleCAwMDAwMDAwMDAwMDAwLi5lOTkwZDFmZGM3OWZkXG4tLS0gL2Rldi9udWxsXG4mIzQzOyYjNDM7JiM0MzsgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ190ZXN0cy9tZW1jZ19hc3luY19yZWNsYWltLmNcbkBAIC0wLDAgJiM0MzsxLDQ3OSBAQFxuJiM0MzsvLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogR1BMLTIuMFxuJiM0MzsvKlxuJiM0MzsgKiBNZW1vcnkgY29udHJvbGxlciBlQlBGIGFzeW5jIHJlY2xhaW0gdGVzdFxuJiM0MzsgKi9cbiYjNDM7XG4mIzQzOyNpbmNsdWRlIFx1MDAzY3Rlc3RfcHJvZ3MuaFx1MDAzZVxuJiM0MzsjaW5jbHVkZSBcdTAwM2NzeXMvbW1hbi5oXHUwMDNlXG4mIzQzOyNpbmNsdWRlIFx1MDAzY3N5cy9zdGF0LmhcdTAwM2VcbiYjNDM7I2luY2x1ZGUgXHUwMDNjc3lzL3Zmcy5oXHUwMDNlXG4mIzQzOyNpbmNsdWRlIFx1MDAzY3N5cy93YWl0LmhcdTAwM2VcbiYjNDM7I2luY2x1ZGUgXHUwMDNjZmNudGwuaFx1MDAzZVxuJiM0MzsjaW5jbHVkZSBcdTAwM2NzaWduYWwuaFx1MDAzZVxuJiM0MzsjaW5jbHVkZSBcdTAwM2N0aW1lLmhcdTAwM2VcbiYjNDM7I2luY2x1ZGUgXHUwMDNjdW5pc3RkLmhcdTAwM2VcbiYjNDM7I2luY2x1ZGUgXHUwMDNjc3RkaW8uaFx1MDAzZVxuJiM0MzsjaW5jbHVkZSBcdTAwM2NzdGRsaWIuaFx1MDAzZVxuJiM0MzsjaW5jbHVkZSBcdTAwM2NzdHJpbmcuaFx1MDAzZVxuJiM0MzsjaW5jbHVkZSBcdTAwM2NsaW1pdHMuaFx1MDAzZVxuJiM0MzsjaW5jbHVkZSBcdTAwM2NsaW51eC9tYWdpYy5oXHUwMDNlXG4mIzQzO1xuJiM0MzsjaW5jbHVkZSBcJiMzNDtjZ3JvdXBfaGVscGVycy5oXCYjMzQ7XG4mIzQzO1xuJiM0MztzdHJ1Y3QgYnBmX2FyZ3NfcyB7XG4mIzQzO1x0dTY0IGhpZ2hfY2dyb3VwX2lkO1xuJiM0MztcdHU2NCBsb3dfY2dyb3VwX2lkO1xuJiM0MztcdHU2NCBldmVudF9kZWx0YV90aHJlc2hvbGQ7XG4mIzQzO1x0dTY0IGNoZWNrX25zO1xuJiM0Mzt9O1xuJiM0MztcbiYjNDM7I2luY2x1ZGUgXCYjMzQ7bWVtY2dfYXN5bmNfcmVjbGFpbS5za2VsLmhcJiMzNDtcbiYjNDM7XG4mIzQzOyNkZWZpbmUgRklMRV9TSVpFICgzMiAqIDEwMjQgKiAxMDI0dWwpXG4mIzQzOyNkZWZpbmUgQlVGRkVSX1NJWkUgKDQwOTYpXG4mIzQzOyNkZWZpbmUgQ0dfTElNSVQgKDMyICogMTAyNCAqIDEwMjR1bClcbiYjNDM7I2RlZmluZSBSRUFEX1RJTUVTIDUwXG4mIzQzO1xuJiM0MzsjZGVmaW5lIENHX0RJUiBcJiMzNDsvbWVtY2dfYXN5bmNfcmVjbGFpbVwmIzM0O1xuJiM0MzsjZGVmaW5lIENHX0hJR0hfRElSIENHX0RJUiBcJiMzNDsvaGlnaFwmIzM0O1xuJiM0MzsjZGVmaW5lIENHX0xPV19ESVIgQ0dfRElSIFwmIzM0Oy9sb3dcJiMzNDtcbiYjNDM7XG4mIzQzOyNkZWZpbmUgQ0hFQ0tfUEVSSU9EX05TICgyICogMTAwMCAqIDEwMDB1bGwpXG4mIzQzOyNkZWZpbmUgRVZFTlRfREVMVEFfVEhSRVNIT0xEIDFcbiYjNDM7XG4mIzQzOy8qXG4mIzQzOyAqIFRoZSB3b3JrbG9hZCBmaWxlcyBtdXN0IHNpdCBvbiBhIHJlZ3VsYXIgZmlsZXN5c3RlbTogd2l0aCBzd2FwXG4mIzQzOyAqIGRpc2FibGVkIGZvciB0aGUgY2dyb3VwLCB0bXBmcy9yYW1mcyBwYWdlcyBhcmUgdW5ldmljdGFibGUgYW5kIHdvdWxkXG4mIzQzOyAqIE9PTSB0aGUgY2dyb3VwIGluc3RlYWQgb2YgZXhlcmNpc2luZyByZWNsYWltOyB0aGV5IGFyZSBhbHNvIGNoYXJnZWRcbiYjNDM7ICogYXMgYW5vbnltb3VzIG1lbW9yeSwgc28gdGhleSBuZXZlciByYWlzZSB0aGUgV09SS0lOR1NFVF9SRUZBVUxUX0ZJTEVcbiYjNDM7ICogZXZlbnRzIHRoZSBCUEYgcHJvZ3JhbSBtb25pdG9ycy4gRmFsbCBiYWNrIHRvIHRoZSBjdXJyZW50IGRpcmVjdG9yeVxuJiM0MzsgKiB3aGVuIC90bXAgaXMgYmFja2VkIGJ5IHN1Y2ggYSBmaWxlc3lzdGVtLlxuJiM0MzsgKi9cbiYjNDM7c3RhdGljIGNvbnN0IGNoYXIgKndvcmtsb2FkX2ZpbGVzX2Rpcih2b2lkKVxuJiM0Mzt7XG4mIzQzO1x0c3RydWN0IHN0YXRmcyBzdDtcbiYjNDM7XG4mIzQzO1x0aWYgKCFzdGF0ZnMoXCYjMzQ7L3RtcFwmIzM0OywgXHUwMDI2c3QpIFx1MDAyNlx1MDAyNlxuJiM0MztcdCAgICAoc3QuZl90eXBlID09IFRNUEZTX01BR0lDIHx8IHN0LmZfdHlwZSA9PSBSQU1GU19NQUdJQykpXG4mIzQzO1x0XHRyZXR1cm4gXCYjMzQ7LlwmIzM0OztcbiYjNDM7XHRyZXR1cm4gXCYjMzQ7L3RtcFwmIzM0OztcbiYjNDM7fVxuJiM0MztcbiYjNDM7LypcbiYjNDM7ICogVGhlIHdvcmtsb2FkIGNoaWxkcmVuIHJ1biBhZnRlciB0ZXN0X3Byb2dzIGhpamFja2VkIHN0ZGlvLCBzb1xuJiM0MzsgKiBhbnl0aGluZyB0aGV5IHByaW50IGlzIGxvc3Qgd2l0aCB0aGVpciBwcml2YXRlIGNvcHkgb2YgdGhlIGhpamFja2VkXG4mIzQzOyAqIGJ1ZmZlci4gVGhlIGV4aXQgc3RhdHVzIGlzIHRoZSBvbmx5IGRpYWdub3N0aWNzIGNoYW5uZWwgdGhhdCByZWFjaGVzXG4mIzQzOyAqIHRoZSBwYXJlbnQsIHNvIGVhY2ggZmFpbGluZyBzdGVwIGdldHMgaXRzIG93biBjb2RlLlxuJiM0MzsgKi9cbiYjNDM7ZW51bSBjaGlsZF9leGl0X2NvZGUge1xuJiM0MztcdENISUxEX0VYSVRfT0sgPSAwLFxuJiM0MztcdENISUxEX0VYSVRfSk9JTl9DR1JPVVAsXG4mIzQzO1x0Q0hJTERfRVhJVF9XUklURV9GSUxFLFxuJiM0MztcdENISUxEX0VYSVRfUkVBRF9GSUxFLFxuJiM0MztcdENISUxEX0VYSVRfVElNRV9GSUxFLFxuJiM0Mzt9O1xuJiM0MztcbiYjNDM7c3RhdGljIGNvbnN0IGNoYXIgKmNoaWxkX2V4aXRfc3RyKGludCBjb2RlKVxuJiM0Mzt7XG4mIzQzO1x0c3dpdGNoIChjb2RlKSB7XG4mIzQzO1x0Y2FzZSBDSElMRF9FWElUX09LOlxuJiM0MztcdFx0cmV0dXJuIFwmIzM0O3N1Y2Nlc3NcJiMzNDs7XG4mIzQzO1x0Y2FzZSBDSElMRF9FWElUX0pPSU5fQ0dST1VQOlxuJiM0MztcdFx0cmV0dXJuIFwmIzM0O2pvaW4gY2dyb3VwXCYjMzQ7O1xuJiM0MztcdGNhc2UgQ0hJTERfRVhJVF9XUklURV9GSUxFOlxuJiM0MztcdFx0cmV0dXJuIFwmIzM0O3dyaXRlIGRhdGEgZmlsZVwmIzM0OztcbiYjNDM7XHRjYXNlIENISUxEX0VYSVRfUkVBRF9GSUxFOlxuJiM0MztcdFx0cmV0dXJuIFwmIzM0O3JlYWQgZGF0YSBmaWxlXCYjMzQ7O1xuJiM0MztcdGNhc2UgQ0hJTERfRVhJVF9USU1FX0ZJTEU6XG4mIzQzO1x0XHRyZXR1cm4gXCYjMzQ7d3JpdGUgdGltZSBmaWxlXCYjMzQ7O1xuJiM0MztcdGRlZmF1bHQ6XG4mIzQzO1x0XHRyZXR1cm4gXCYjMzQ7dW5rbm93blwmIzM0OztcbiYjNDM7XHR9XG4mIzQzO31cbiYjNDM7XG4mIzQzO3N0YXRpYyBpbnQgc2V0dXBfaGlnaF9sb3dfY2dyb3Vwcyh1NjQgKmhpZ2hfY2dyb3VwX2lkLCB1NjQgKmxvd19jZ3JvdXBfaWQpXG4mIzQzO3tcbiYjNDM7XHRpbnQgcmV0O1xuJiM0MztcdGNoYXIgbGltaXRfYnVmWzIwXTtcbiYjNDM7XG4mIzQzO1x0cmV0ID0gc2V0dXBfY2dyb3VwX2Vudmlyb25tZW50KCk7XG4mIzQzO1x0aWYgKCFBU1NFUlRfT0socmV0LCBcJiMzNDtzZXR1cF9jZ3JvdXBfZW52aXJvbm1lbnRcJiMzNDspKVxuJiM0MztcdFx0Z290byBjbGVhbnVwO1xuJiM0MztcbiYjNDM7XHRyZXQgPSBjcmVhdGVfYW5kX2dldF9jZ3JvdXAoQ0dfRElSKTtcbiYjNDM7XHRpZiAoIUFTU0VSVF9HRShyZXQsIDAsIFwmIzM0O2NyZWF0ZV9hbmRfZ2V0X2Nncm91cCBcJiMzNDsgQ0dfRElSKSlcbiYjNDM7XHRcdGdvdG8gY2xlYW51cDtcbiYjNDM7XHRjbG9zZShyZXQpO1xuJiM0MztcbiYjNDM7XHRyZXQgPSBlbmFibGVfY29udHJvbGxlcnMoQ0dfRElSLCBcJiMzNDttZW1vcnlcJiMzNDspO1xuJiM0MztcdGlmICghQVNTRVJUX09LKHJldCwgXCYjMzQ7ZW5hYmxlX2NvbnRyb2xsZXJzXCYjMzQ7KSlcbiYjNDM7XHRcdGdvdG8gY2xlYW51cDtcbiYjNDM7XG4mIzQzO1x0c25wcmludGYobGltaXRfYnVmLCBzaXplb2YobGltaXRfYnVmKSwgXCYjMzQ7JWx1XCYjMzQ7LCBDR19MSU1JVCk7XG4mIzQzO1x0cmV0ID0gd3JpdGVfY2dyb3VwX2ZpbGUoQ0dfRElSLCBcJiMzNDttZW1vcnkubWF4XCYjMzQ7LCBsaW1pdF9idWYpO1xuJiM0MztcdGlmICghQVNTRVJUX09LKHJldCwgXCYjMzQ7d3JpdGVfY2dyb3VwX2ZpbGUgbWVtb3J5Lm1heFwmIzM0OykpXG4mIzQzO1x0XHRnb3RvIGNsZWFudXA7XG4mIzQzO1xuJiM0MztcdC8qXG4mIzQzO1x0ICogS2VlcCB0aGUgd29ya2xvYWRzIGZyb20gc3dhcHBpbmcgb3V0LiBXaXRoIENPTkZJR19TV0FQPW4gdGhlXG4mIzQzO1x0ICogbWVtb3J5LnN3YXAubWF4IGZpbGUgZG9lcyBub3QgZXhpc3QsIGFuZCBubyBzd2FwIGNhbiBoYXBwZW5cbiYjNDM7XHQgKiBhbnl3YXksIHNvIHNraXAgdGhlIHdyaXRlLlxuJiM0MztcdCAqL1xuJiM0MztcdGlmICghYWNjZXNzKFwmIzM0Oy9wcm9jL3N3YXBzXCYjMzQ7LCBGX09LKSkge1xuJiM0MztcdFx0cmV0ID0gd3JpdGVfY2dyb3VwX2ZpbGUoQ0dfRElSLCBcJiMzNDttZW1vcnkuc3dhcC5tYXhcJiMzNDssIFwmIzM0OzBcJiMzNDspO1xuJiM0MztcdFx0aWYgKCFBU1NFUlRfT0socmV0LCBcJiMzNDt3cml0ZV9jZ3JvdXBfZmlsZSBtZW1vcnkuc3dhcC5tYXhcJiMzNDspKVxuJiM0MztcdFx0XHRnb3RvIGNsZWFudXA7XG4mIzQzO1x0fVxuJiM0MztcbiYjNDM7XHRyZXQgPSBjcmVhdGVfYW5kX2dldF9jZ3JvdXAoQ0dfSElHSF9ESVIpO1xuJiM0MztcdGlmICghQVNTRVJUX0dFKHJldCwgMCwgXCYjMzQ7Y3JlYXRlX2FuZF9nZXRfY2dyb3VwIFwmIzM0OyBDR19ISUdIX0RJUikpXG4mIzQzO1x0XHRnb3RvIGNsZWFudXA7XG4mIzQzO1x0Y2xvc2UocmV0KTtcbiYjNDM7XG4mIzQzO1x0KmhpZ2hfY2dyb3VwX2lkID0gZ2V0X2Nncm91cF9pZChDR19ISUdIX0RJUik7XG4mIzQzO1x0aWYgKCFBU1NFUlRfR1QoKmhpZ2hfY2dyb3VwX2lkLCAwLCBcJiMzNDtnZXRfY2dyb3VwX2lkXCYjMzQ7KSlcbiYjNDM7XHRcdGdvdG8gY2xlYW51cDtcbiYjNDM7XG4mIzQzO1x0cmV0ID0gY3JlYXRlX2FuZF9nZXRfY2dyb3VwKENHX0xPV19ESVIpO1xuJiM0MztcdGlmICghQVNTRVJUX0dFKHJldCwgMCwgXCYjMzQ7Y3JlYXRlX2FuZF9nZXRfY2dyb3VwIFwmIzM0OyBDR19MT1dfRElSKSlcbiYjNDM7XHRcdGdvdG8gY2xlYW51cDtcbiYjNDM7XHRjbG9zZShyZXQpO1xuJiM0MztcbiYjNDM7XHQqbG93X2Nncm91cF9pZCA9IGdldF9jZ3JvdXBfaWQoQ0dfTE9XX0RJUik7XG4mIzQzO1x0aWYgKCFBU1NFUlRfR1QoKmxvd19jZ3JvdXBfaWQsIDAsIFwmIzM0O2dldF9jZ3JvdXBfaWRcJiMzNDspKVxuJiM0MztcdFx0Z290byBjbGVhbnVwO1xuJiM0MztcbiYjNDM7XHRyZXR1cm4gMDtcbiYjNDM7XG4mIzQzO2NsZWFudXA6XG4mIzQzO1x0Y2xlYW51cF9jZ3JvdXBfZW52aXJvbm1lbnQoKTtcbiYjNDM7XHRyZXR1cm4gLTE7XG4mIzQzO31cbiYjNDM7XG4mIzQzO3N0YXRpYyBpbnQgd3JpdGVfZmlsZShjb25zdCBjaGFyICpmaWxlbmFtZSlcbiYjNDM7e1xuJiM0MztcdGludCByZXQgPSAtMTtcbiYjNDM7XHRzaXplX3Qgd3JpdHRlbiA9IDA7XG4mIzQzO1x0Y2hhciAqYnVmZmVyO1xuJiM0MztcdEZJTEUgKmZwO1xuJiM0MztcbiYjNDM7XHRmcCA9IGZvcGVuKGZpbGVuYW1lLCBcJiMzNDt3YlwmIzM0Oyk7XG4mIzQzO1x0aWYgKCFmcClcbiYjNDM7XHRcdGdvdG8gb3V0O1xuJiM0MztcbiYjNDM7XHRidWZmZXIgPSBtYWxsb2MoQlVGRkVSX1NJWkUpO1xuJiM0MztcdGlmICghYnVmZmVyKVxuJiM0MztcdFx0Z290byBjbGVhbnVwX2ZwO1xuJiM0MztcbiYjNDM7XHRtZW1zZXQoYnVmZmVyLCAmIzM5O0EmIzM5OywgQlVGRkVSX1NJWkUpO1xuJiM0MztcbiYjNDM7XHR3aGlsZSAod3JpdHRlbiBcdTAwM2MgRklMRV9TSVpFKSB7XG4mIzQzO1x0XHRzaXplX3QgdG9fd3JpdGUgPSBGSUxFX1NJWkUgLSB3cml0dGVuIFx1MDAzYyBCVUZGRVJfU0laRSA/XG4mIzQzO1x0XHRcdFx0ICBGSUxFX1NJWkUgLSB3cml0dGVuIDogQlVGRkVSX1NJWkU7XG4mIzQzO1xuJiM0MztcdFx0aWYgKGZ3cml0ZShidWZmZXIsIDEsIHRvX3dyaXRlLCBmcCkgIT0gdG9fd3JpdGUpXG4mIzQzO1x0XHRcdGdvdG8gY2xlYW51cDtcbiYjNDM7XHRcdHdyaXR0ZW4gJiM0Mzs9IHRvX3dyaXRlO1xuJiM0MztcdH1cbiYjNDM7XG4mIzQzO1x0cmV0ID0gMDtcbiYjNDM7Y2xlYW51cDpcbiYjNDM7XHRmcmVlKGJ1ZmZlcik7XG4mIzQzO2NsZWFudXBfZnA6XG4mIzQzO1x0ZmNsb3NlKGZwKTtcbiYjNDM7b3V0OlxuJiM0MztcdHJldHVybiByZXQ7XG4mIzQzO31cbiYjNDM7XG4mIzQzO3N0YXRpYyBpbnQgcmVhZF9maWxlKGNvbnN0IGNoYXIgKmZpbGVuYW1lLCBpbnQgaXRlcmF0aW9ucylcbiYjNDM7e1xuJiM0MztcdGludCByZXQgPSAtMTtcbiYjNDM7XHRsb25nIHBhZ2Vfc2l6ZSA9IHN5c2NvbmYoX1NDX1BBR0VTSVpFKTtcbiYjNDM7XHRjaGFyICptYXA7XG4mIzQzO1x0c2l6ZV90IGk7XG4mIzQzO1x0aW50IGZkO1xuJiM0MztcdHN0cnVjdCBzdGF0IHNiO1xuJiM0MztcbiYjNDM7XHRmZCA9IG9wZW4oZmlsZW5hbWUsIE9fUkRPTkxZKTtcbiYjNDM7XHRpZiAoZmQgPT0gLTEpXG4mIzQzO1x0XHRnb3RvIG91dDtcbiYjNDM7XG4mIzQzO1x0aWYgKGZzdGF0KGZkLCBcdTAwMjZzYikgPT0gLTEpXG4mIzQzO1x0XHRnb3RvIGNsZWFudXBfZmQ7XG4mIzQzO1xuJiM0MztcdGlmIChzYi5zdF9zaXplICE9IEZJTEVfU0laRSkge1xuJiM0MztcdFx0ZnByaW50ZihzdGRlcnIsIFwmIzM0O0ZpbGUgc2l6ZSBtaXNtYXRjaDogZXhwZWN0ZWQgJWx1LCBnb3QgJWx1XFxuXCYjMzQ7LFxuJiM0MztcdFx0XHQodW5zaWduZWQgbG9uZylGSUxFX1NJWkUsICh1bnNpZ25lZCBsb25nKXNiLnN0X3NpemUpO1xuJiM0MztcdFx0Z290byBjbGVhbnVwX2ZkO1xuJiM0MztcdH1cbiYjNDM7XG4mIzQzO1x0bWFwID0gbW1hcChOVUxMLCBGSUxFX1NJWkUsIFBST1RfUkVBRCwgTUFQX1BSSVZBVEUsIGZkLCAwKTtcbiYjNDM7XHRpZiAobWFwID09IE1BUF9GQUlMRUQpXG4mIzQzO1x0XHRnb3RvIGNsZWFudXBfZmQ7XG4mIzQzO1xuJiM0MztcdGZvciAoaW50IGl0ZXIgPSAwOyBpdGVyIFx1MDAzYyBpdGVyYXRpb25zOyBpdGVyJiM0MzsmIzQzOykge1xuJiM0MztcdFx0Zm9yIChpID0gMDsgaSBcdTAwM2MgRklMRV9TSVpFOyBpICYjNDM7PSBwYWdlX3NpemUpIHtcbiYjNDM7XHRcdFx0LyogYWNjZXNzIGEgYnl0ZSB0byB0cmlnZ2VyIHBhZ2UgZmF1bHQgKi9cbiYjNDM7XHRcdFx0dm9sYXRpbGUgY2hhciB2ID0gbWFwW2ldO1xuJiM0MztcdFx0XHQodm9pZCl2O1xuJiM0MztcdFx0fVxuJiM0MztcdH1cbiYjNDM7XG4mIzQzO1x0aWYgKG11bm1hcChtYXAsIEZJTEVfU0laRSkgPT0gLTEpXG4mIzQzO1x0XHRnb3RvIGNsZWFudXBfZmQ7XG4mIzQzO1xuJiM0MztcdHJldCA9IDA7XG4mIzQzO1xuJiM0MztjbGVhbnVwX2ZkOlxuJiM0MztcdGNsb3NlKGZkKTtcbiYjNDM7b3V0OlxuJiM0MztcdHJldHVybiByZXQ7XG4mIzQzO31cbiYjNDM7XG4mIzQzO3N0YXRpYyBpbnQgcmVhbF90ZXN0X2NoaWxkX3dvcmsoY29uc3QgY2hhciAqY2dyb3VwX3BhdGgsIGNoYXIgKmRhdGFfZmlsZW5hbWUsXG4mIzQzO1x0XHRcdFx0Y2hhciAqdGltZV9maWxlbmFtZSwgaW50IHJlYWRfdGltZXMpXG4mIzQzO3tcbiYjNDM7XHRzdHJ1Y3QgdGltZXNwZWMgc3RhcnQsIGVuZDtcbiYjNDM7XHRkb3VibGUgZWxhcHNlZDtcbiYjNDM7XHRGSUxFICpmcDtcbiYjNDM7XG4mIzQzO1x0aWYgKGpvaW5fcGFyZW50X2Nncm91cChjZ3JvdXBfcGF0aCkpXG4mIzQzO1x0XHRyZXR1cm4gQ0hJTERfRVhJVF9KT0lOX0NHUk9VUDtcbiYjNDM7XG4mIzQzO1x0Y2xvY2tfZ2V0dGltZShDTE9DS19NT05PVE9OSUMsIFx1MDAyNnN0YXJ0KTtcbiYjNDM7XG4mIzQzO1x0aWYgKHdyaXRlX2ZpbGUoZGF0YV9maWxlbmFtZSkpXG4mIzQzO1x0XHRyZXR1cm4gQ0hJTERfRVhJVF9XUklURV9GSUxFO1xuJiM0MztcbiYjNDM7XHRpZiAocmVhZF9maWxlKGRhdGFfZmlsZW5hbWUsIHJlYWRfdGltZXMpKVxuJiM0MztcdFx0cmV0dXJuIENISUxEX0VYSVRfUkVBRF9GSUxFO1xuJiM0MztcbiYjNDM7XHRjbG9ja19nZXR0aW1lKENMT0NLX01PTk9UT05JQywgXHUwMDI2ZW5kKTtcbiYjNDM7XG4mIzQzO1x0aWYgKCF0aW1lX2ZpbGVuYW1lKVxuJiM0MztcdFx0cmV0dXJuIENISUxEX0VYSVRfT0s7XG4mIzQzO1xuJiM0MztcdGVsYXBzZWQgPSAoZW5kLnR2X3NlYyAtIHN0YXJ0LnR2X3NlYykgJiM0MztcbiYjNDM7XHRcdCAgKGVuZC50dl9uc2VjIC0gc3RhcnQudHZfbnNlYykgLyAxMDAwMDAwMDAwLjA7XG4mIzQzO1x0cHJpbnRmKFwmIzM0OyUuNmZcXG5cJiMzNDssIGVsYXBzZWQpO1xuJiM0MztcbiYjNDM7XHRmcCA9IGZvcGVuKHRpbWVfZmlsZW5hbWUsIFwmIzM0O3dcJiMzNDspO1xuJiM0MztcdGlmICghZnApXG4mIzQzO1x0XHRyZXR1cm4gQ0hJTERfRVhJVF9USU1FX0ZJTEU7XG4mIzQzO1x0ZnByaW50ZihmcCwgXCYjMzQ7JS42ZlwmIzM0OywgZWxhcHNlZCk7XG4mIzQzO1x0ZmNsb3NlKGZwKTtcbiYjNDM7XG4mIzQzO1x0cmV0dXJuIENISUxEX0VYSVRfT0s7XG4mIzQzO31cbiYjNDM7XG4mIzQzO3N0YXRpYyBpbnQgZ2V0X3RpbWUoY2hhciAqdGltZV9maWxlbmFtZSwgZG91YmxlICp0aW1lKVxuJiM0Mzt7XG4mIzQzO1x0aW50IHJldCA9IC0xO1xuJiM0MztcdEZJTEUgKmZwO1xuJiM0MztcdGNoYXIgYnVmWzY0XTtcbiYjNDM7XG4mIzQzO1x0ZnAgPSBmb3Blbih0aW1lX2ZpbGVuYW1lLCBcJiMzNDtyXCYjMzQ7KTtcbiYjNDM7XHRpZiAoIUFTU0VSVF9PS19QVFIoZnAsIFwmIzM0O2ZvcGVuXCYjMzQ7KSlcbiYjNDM7XHRcdGdvdG8gb3V0O1xuJiM0MztcbiYjNDM7XHRpZiAoIUFTU0VSVF9PS19QVFIoZmdldHMoYnVmLCBzaXplb2YoYnVmKSwgZnApLCBcJiMzNDtmZ2V0c1wmIzM0OykpXG4mIzQzO1x0XHRnb3RvIGNsZWFudXA7XG4mIzQzO1xuJiM0MztcdGlmIChzc2NhbmYoYnVmLCBcJiMzNDslbGZcJiMzNDssIHRpbWUpICE9IDEpIHtcbiYjNDM7XHRcdFBSSU5UX0ZBSUwoXCYjMzQ7c3NjYW5mICVzXCYjMzQ7LCBidWYpO1xuJiM0MztcdFx0Z290byBjbGVhbnVwO1xuJiM0MztcdH1cbiYjNDM7XG4mIzQzO1x0cmV0ID0gMDtcbiYjNDM7Y2xlYW51cDpcbiYjNDM7XHRmY2xvc2UoZnApO1xuJiM0MztvdXQ6XG4mIzQzO1x0cmV0dXJuIHJldDtcbiYjNDM7fVxuJiM0MztcbiYjNDM7c3RhdGljIGludFxuJiM0MztydW5faGlnaF9sb3dfd29ya2xvYWQoZG91YmxlICpoaWdoX2VsYXBzZWQsIGRvdWJsZSAqbG93X2VsYXBzZWQsIGludCByZWFkX3RpbWVzKVxuJiM0Mzt7XG4mIzQzO1x0Y2hhciBoaWdoX2RhdGFfZmlsZVtQQVRIX01BWF07XG4mIzQzO1x0Y2hhciBsb3dfZGF0YV9maWxlW1BBVEhfTUFYXTtcbiYjNDM7XHRjaGFyIGhpZ2hfdGltZV9maWxlW1BBVEhfTUFYXTtcbiYjNDM7XHRjaGFyIGxvd190aW1lX2ZpbGVbUEFUSF9NQVhdO1xuJiM0MztcdGNvbnN0IGNoYXIgKmRpciA9IHdvcmtsb2FkX2ZpbGVzX2RpcigpO1xuJiM0MztcdHBpZF90IGhpZ2hfcGlkID0gLTEsIGxvd19waWQgPSAtMTtcbiYjNDM7XHRpbnQgZmQsIHN0YXR1cztcbiYjNDM7XHRpbnQgcmV0ID0gLTE7XG4mIzQzO1xuJiM0MztcdHNucHJpbnRmKGhpZ2hfZGF0YV9maWxlLCBzaXplb2YoaGlnaF9kYXRhX2ZpbGUpLFxuJiM0MztcdFx0IFwmIzM0OyVzL21lbWNnX2FzeW5jX2hpZ2hfZGF0YV9YWFhYWFhcJiMzNDssIGRpcik7XG4mIzQzO1x0c25wcmludGYobG93X2RhdGFfZmlsZSwgc2l6ZW9mKGxvd19kYXRhX2ZpbGUpLFxuJiM0MztcdFx0IFwmIzM0OyVzL21lbWNnX2FzeW5jX2xvd19kYXRhX1hYWFhYWFwmIzM0OywgZGlyKTtcbiYjNDM7XHRzbnByaW50ZihoaWdoX3RpbWVfZmlsZSwgc2l6ZW9mKGhpZ2hfdGltZV9maWxlKSxcbiYjNDM7XHRcdCBcJiMzNDslcy9tZW1jZ19hc3luY19oaWdoX3RpbWVfWFhYWFhYXCYjMzQ7LCBkaXIpO1xuJiM0MztcdHNucHJpbnRmKGxvd190aW1lX2ZpbGUsIHNpemVvZihsb3dfdGltZV9maWxlKSxcbiYjNDM7XHRcdCBcJiMzNDslcy9tZW1jZ19hc3luY19sb3dfdGltZV9YWFhYWFhcJiMzNDssIGRpcik7XG4mIzQzO1xuJiM0MztcdGZkID0gbWtzdGVtcChoaWdoX2RhdGFfZmlsZSk7XG4mIzQzO1x0aWYgKCFBU1NFUlRfR0UoZmQsIDAsIFwmIzM0O21rc3RlbXBcJiMzNDspKVxuJiM0MztcdFx0Z290byBjbGVhbnVwO1xuJiM0MztcdGNsb3NlKGZkKTtcbiYjNDM7XG4mIzQzO1x0ZmQgPSBta3N0ZW1wKGxvd19kYXRhX2ZpbGUpO1xuJiM0MztcdGlmICghQVNTRVJUX0dFKGZkLCAwLCBcJiMzNDtta3N0ZW1wXCYjMzQ7KSlcbiYjNDM7XHRcdGdvdG8gY2xlYW51cDtcbiYjNDM7XHRjbG9zZShmZCk7XG4mIzQzO1xuJiM0MztcdGZkID0gbWtzdGVtcChoaWdoX3RpbWVfZmlsZSk7XG4mIzQzO1x0aWYgKCFBU1NFUlRfR0UoZmQsIDAsIFwmIzM0O21rc3RlbXBcJiMzNDspKVxuJiM0MztcdFx0Z290byBjbGVhbnVwO1xuJiM0MztcdGNsb3NlKGZkKTtcbiYjNDM7XG4mIzQzO1x0ZmQgPSBta3N0ZW1wKGxvd190aW1lX2ZpbGUpO1xuJiM0MztcdGlmICghQVNTRVJUX0dFKGZkLCAwLCBcJiMzNDtta3N0ZW1wXCYjMzQ7KSlcbiYjNDM7XHRcdGdvdG8gY2xlYW51cDtcbiYjNDM7XHRjbG9zZShmZCk7XG4mIzQzO1xuJiM0MztcdGxvd19waWQgPSBmb3JrKCk7XG4mIzQzO1x0aWYgKCFBU1NFUlRfR0UobG93X3BpZCwgMCwgXCYjMzQ7Zm9yayBsb3dcJiMzNDspKVxuJiM0MztcdFx0Z290byBjbGVhbnVwO1xuJiM0MztcdGlmIChsb3dfcGlkID09IDApXG4mIzQzO1x0XHRleGl0KHJlYWxfdGVzdF9jaGlsZF93b3JrKENHX0xPV19ESVIsIGxvd19kYXRhX2ZpbGUsXG4mIzQzO1x0XHRcdFx0XHQgIGxvd190aW1lX2ZpbGUsIHJlYWRfdGltZXMpKTtcbiYjNDM7XG4mIzQzO1x0aGlnaF9waWQgPSBmb3JrKCk7XG4mIzQzO1x0aWYgKCFBU1NFUlRfR0UoaGlnaF9waWQsIDAsIFwmIzM0O2ZvcmsgaGlnaFwmIzM0OykpXG4mIzQzO1x0XHRnb3RvIGNsZWFudXA7XG4mIzQzO1x0aWYgKGhpZ2hfcGlkID09IDApXG4mIzQzO1x0XHRleGl0KHJlYWxfdGVzdF9jaGlsZF93b3JrKENHX0hJR0hfRElSLCBoaWdoX2RhdGFfZmlsZSxcbiYjNDM7XHRcdFx0XHRcdCAgaGlnaF90aW1lX2ZpbGUsIHJlYWRfdGltZXMpKTtcbiYjNDM7XG4mIzQzO1x0bG93X3BpZCA9IHdhaXRwaWQobG93X3BpZCwgXHUwMDI2c3RhdHVzLCAwKTtcbiYjNDM7XHRpZiAoIUFTU0VSVF9HVChsb3dfcGlkLCAwLCBcJiMzNDtsb3cgd2FpdHBpZFwmIzM0OykpXG4mIzQzO1x0XHRnb3RvIGNsZWFudXA7XG4mIzQzO1x0LypcbiYjNDM7XHQgKiBUaGUgY2hpbGQgaGFzIGJlZW4gcmVhcGVkIGFuZCBpdHMgUElEIGNhbiBhbHJlYWR5IGJlIHJldXNlZCxcbiYjNDM7XHQgKiBzbyBtYXJrIGl0IHRvIGtlZXAgY2xlYW51cCBmcm9tIHNpZ25hbGluZyBhbiB1bnJlbGF0ZWQgcHJvY2Vzcy5cbiYjNDM7XHQgKi9cbiYjNDM7XHRsb3dfcGlkID0gLTE7XG4mIzQzO1x0aWYgKCFBU1NFUlRfVFJVRShXSUZFWElURUQoc3RhdHVzKSwgXCYjMzQ7bG93IGV4aXRlZFwmIzM0OykpXG4mIzQzO1x0XHRnb3RvIGNsZWFudXA7XG4mIzQzO1x0aWYgKFdFWElUU1RBVFVTKHN0YXR1cykgIT0gQ0hJTERfRVhJVF9PSykge1xuJiM0MztcdFx0UFJJTlRfRkFJTChcJiMzNDtsb3cgY2hpbGQgZmFpbGVkIGF0OiAlcyAoZXhpdCBzdGF0dXMgJWQpXCYjMzQ7LFxuJiM0MztcdFx0XHQgICBjaGlsZF9leGl0X3N0cihXRVhJVFNUQVRVUyhzdGF0dXMpKSxcbiYjNDM7XHRcdFx0ICAgV0VYSVRTVEFUVVMoc3RhdHVzKSk7XG4mIzQzO1x0XHRnb3RvIGNsZWFudXA7XG4mIzQzO1x0fVxuJiM0MztcbiYjNDM7XHRoaWdoX3BpZCA9IHdhaXRwaWQoaGlnaF9waWQsIFx1MDAyNnN0YXR1cywgMCk7XG4mIzQzO1x0aWYgKCFBU1NFUlRfR1QoaGlnaF9waWQsIDAsIFwmIzM0O2hpZ2ggd2FpdHBpZFwmIzM0OykpXG4mIzQzO1x0XHRnb3RvIGNsZWFudXA7XG4mIzQzO1x0LyogU2FtZSBhcyBhYm92ZTogdGhlIHJlYXBlZCBQSUQgbXVzdCBub3QgYmUgc2lnbmFsZWQgYWdhaW4uICovXG4mIzQzO1x0aGlnaF9waWQgPSAtMTtcbiYjNDM7XHRpZiAoIUFTU0VSVF9UUlVFKFdJRkVYSVRFRChzdGF0dXMpLCBcJiMzNDtoaWdoIGV4aXRlZFwmIzM0OykpXG4mIzQzO1x0XHRnb3RvIGNsZWFudXA7XG4mIzQzO1x0aWYgKFdFWElUU1RBVFVTKHN0YXR1cykgIT0gQ0hJTERfRVhJVF9PSykge1xuJiM0MztcdFx0UFJJTlRfRkFJTChcJiMzNDtoaWdoIGNoaWxkIGZhaWxlZCBhdDogJXMgKGV4aXQgc3RhdHVzICVkKVwmIzM0OyxcbiYjNDM7XHRcdFx0ICAgY2hpbGRfZXhpdF9zdHIoV0VYSVRTVEFUVVMoc3RhdHVzKSksXG4mIzQzO1x0XHRcdCAgIFdFWElUU1RBVFVTKHN0YXR1cykpO1xuJiM0MztcdFx0Z290byBjbGVhbnVwO1xuJiM0MztcdH1cbiYjNDM7XG4mIzQzO1x0aWYgKGdldF90aW1lKGhpZ2hfdGltZV9maWxlLCBoaWdoX2VsYXBzZWQpKVxuJiM0MztcdFx0Z290byBjbGVhbnVwO1xuJiM0MztcdGlmIChnZXRfdGltZShsb3dfdGltZV9maWxlLCBsb3dfZWxhcHNlZCkpXG4mIzQzO1x0XHRnb3RvIGNsZWFudXA7XG4mIzQzO1xuJiM0MztcdHJldCA9IDA7XG4mIzQzO1xuJiM0MztjbGVhbnVwOlxuJiM0MztcdC8qIE9uIGZhaWx1cmUsIG1ha2Ugc3VyZSBubyBjaGlsZCBwcm9jZXNzIGlzIGxlZnQgYmVoaW5kICovXG4mIzQzO1x0aWYgKHJldCkge1xuJiM0MztcdFx0aWYgKGhpZ2hfcGlkIFx1MDAzZSAwKSB7XG4mIzQzO1x0XHRcdGtpbGwoaGlnaF9waWQsIFNJR0tJTEwpO1xuJiM0MztcdFx0XHQodm9pZCl3YWl0cGlkKGhpZ2hfcGlkLCBOVUxMLCAwKTtcbiYjNDM7XHRcdH1cbiYjNDM7XHRcdGlmIChsb3dfcGlkIFx1MDAzZSAwKSB7XG4mIzQzO1x0XHRcdGtpbGwobG93X3BpZCwgU0lHS0lMTCk7XG4mIzQzO1x0XHRcdCh2b2lkKXdhaXRwaWQobG93X3BpZCwgTlVMTCwgMCk7XG4mIzQzO1x0XHR9XG4mIzQzO1x0fVxuJiM0MztcdHVubGluayhsb3dfdGltZV9maWxlKTtcbiYjNDM7XHR1bmxpbmsoaGlnaF90aW1lX2ZpbGUpO1xuJiM0MztcdHVubGluayhsb3dfZGF0YV9maWxlKTtcbiYjNDM7XHR1bmxpbmsoaGlnaF9kYXRhX2ZpbGUpO1xuJiM0MztcdHJldHVybiByZXQ7XG4mIzQzO31cbiYjNDM7XG4mIzQzO3N0YXRpYyBpbnRcbiYjNDM7c2V0dXBfYnBmKHU2NCBoaWdoX2Nncm91cF9pZCwgdTY0IGxvd19jZ3JvdXBfaWQsXG4mIzQzO1x0ICBzdHJ1Y3QgbWVtY2dfYXN5bmNfcmVjbGFpbSAqKnNrZWxfcHRyKVxuJiM0Mzt7XG4mIzQzO1x0c3RydWN0IG1lbWNnX2FzeW5jX3JlY2xhaW0gKnNrZWw7XG4mIzQzO1x0c3RydWN0IGJwZl9hcmdzX3MgYnBmX2FyZ3MgPSB7XG4mIzQzO1x0XHQuaGlnaF9jZ3JvdXBfaWQgPSBoaWdoX2Nncm91cF9pZCxcbiYjNDM7XHRcdC5sb3dfY2dyb3VwX2lkID0gbG93X2Nncm91cF9pZCxcbiYjNDM7XHRcdC5ldmVudF9kZWx0YV90aHJlc2hvbGQgPSBFVkVOVF9ERUxUQV9USFJFU0hPTEQsXG4mIzQzO1x0XHQuY2hlY2tfbnMgPSBDSEVDS19QRVJJT0RfTlMsXG4mIzQzO1x0fTtcbiYjNDM7XHRMSUJCUEZfT1BUUyhicGZfdGVzdF9ydW5fb3B0cywgcnVuX29wdHMsXG4mIzQzO1x0XHQuY3R4X2luID0gXHUwMDI2YnBmX2FyZ3MsXG4mIzQzO1x0XHQuY3R4X3NpemVfaW4gPSBzaXplb2YoYnBmX2FyZ3MpKTtcbiYjNDM7XHRpbnQgcHJvZ19pbml0X2ZkLCBlcnI7XG4mIzQzO1xuJiM0MztcdHNrZWwgPSBtZW1jZ19hc3luY19yZWNsYWltX19vcGVuX2FuZF9sb2FkKCk7XG4mIzQzO1x0aWYgKCFBU1NFUlRfT0tfUFRSKHNrZWwsIFwmIzM0O21lbWNnX2FzeW5jX3JlY2xhaW1fX29wZW5fYW5kX2xvYWRcJiMzNDspKVxuJiM0MztcdFx0cmV0dXJuIC0xO1xuJiM0MztcbiYjNDM7XHRwcm9nX2luaXRfZmQgPSBicGZfcHJvZ3JhbV9fZmQoc2tlbC1cdTAwM2Vwcm9ncy53cV9wcm9nX2luaXQpO1xuJiM0MztcbiYjNDM7XHRlcnIgPSBicGZfcHJvZ190ZXN0X3J1bl9vcHRzKHByb2dfaW5pdF9mZCwgXHUwMDI2cnVuX29wdHMpO1xuJiM0MztcdGlmICghQVNTRVJUX09LKGVyciwgXCYjMzQ7YnBmX3Byb2dfdGVzdF9ydW5fb3B0c1wmIzM0OykpXG4mIzQzO1x0XHRnb3RvIGVycm9yX291dDtcbiYjNDM7XHRpZiAoIUFTU0VSVF9FUShydW5fb3B0cy5yZXR2YWwsIDAsIFwmIzM0O3Byb2dfaW5pdCByZXR2YWxcJiMzNDspKVxuJiM0MztcdFx0Z290byBlcnJvcl9vdXQ7XG4mIzQzO1xuJiM0MztcdCpza2VsX3B0ciA9IHNrZWw7XG4mIzQzO1x0cmV0dXJuIDA7XG4mIzQzO1xuJiM0MztlcnJvcl9vdXQ6XG4mIzQzO1x0bWVtY2dfYXN5bmNfcmVjbGFpbV9fZGVzdHJveShza2VsKTtcbiYjNDM7XHRyZXR1cm4gLTE7XG4mIzQzO31cbiYjNDM7XG4mIzQzO3ZvaWQgdGVzdF9tZW1jZ193cV9hc3luY19yZWNsYWltKHZvaWQpXG4mIzQzO3tcbiYjNDM7XHR1NjQgaGlnaF9jZ3JvdXBfaWQsIGxvd19jZ3JvdXBfaWQ7XG4mIzQzO1x0aW50IGVycjtcbiYjNDM7XHRkb3VibGUgaGlnaF90aW1lID0gMC4wLCBsb3dfdGltZSA9IDAuMDtcbiYjNDM7XHRzdHJ1Y3QgbWVtY2dfYXN5bmNfcmVjbGFpbSAqc2tlbCA9IE5VTEw7XG4mIzQzO1xuJiM0MztcdGVyciA9IHNldHVwX2hpZ2hfbG93X2Nncm91cHMoXHUwMDI2aGlnaF9jZ3JvdXBfaWQsIFx1MDAyNmxvd19jZ3JvdXBfaWQpO1xuJiM0MztcdGlmICghQVNTRVJUX09LKGVyciwgXCYjMzQ7c2V0dXBfaGlnaF9sb3dfY2dyb3VwcyByZWNsYWltXCYjMzQ7KSlcbiYjNDM7XHRcdHJldHVybjtcbiYjNDM7XG4mIzQzO1x0ZXJyID0gc2V0dXBfYnBmKGhpZ2hfY2dyb3VwX2lkLCBsb3dfY2dyb3VwX2lkLCBcdTAwMjZza2VsKTtcbiYjNDM7XHRpZiAoIUFTU0VSVF9PSyhlcnIsIFwmIzM0O3NldHVwX2JwZlwmIzM0OykpXG4mIzQzO1x0XHRnb3RvIG91dDtcbiYjNDM7XG4mIzQzO1x0ZXJyID0gcnVuX2hpZ2hfbG93X3dvcmtsb2FkKFx1MDAyNmhpZ2hfdGltZSwgXHUwMDI2bG93X3RpbWUsIFJFQURfVElNRVMpO1xuJiM0MztcdGlmICghQVNTRVJUX09LKGVyciwgXCYjMzQ7cnVuX2hpZ2hfbG93X3dvcmtsb2FkIHJlY2xhaW1cJiMzNDspKVxuJiM0MztcdFx0Z290byBvdXQ7XG4mIzQzO1xuJiM0MztcdC8qXG4mIzQzO1x0ICogVGhlIHRpbWluZyBjb21wYXJpc29uIGJlbG93IGFsb25lIGNhbm5vdCBkaXN0aW5ndWlzaCBhIHdvcmtpbmdcbiYjNDM7XHQgKiByZWNsYWltIGZyb20gYSBuby1vcCBvbmUsIHNvIHJlcXVpcmUgdGhhdCB0aGUgQlBGIHByb2dyYW1cbiYjNDM7XHQgKiBhY3R1YWxseSByZWNsYWltZWQgcGFnZXMgZnJvbSB0aGUgbG93IGNncm91cC5cbiYjNDM7XHQgKi9cbiYjNDM7XHRpZiAoIUFTU0VSVF9HVChza2VsLVx1MDAzZWJzcy1cdTAwM2VyZWNsYWltX2NhbGxzLCAwLCBcJiMzNDtyZWNsYWltX2NhbGxzXCYjMzQ7KSlcbiYjNDM7XHRcdGdvdG8gb3V0O1xuJiM0MztcdGlmICghQVNTRVJUX0dUKHNrZWwtXHUwMDNlYnNzLVx1MDAzZXJlY2xhaW1lZF9wYWdlcywgMCwgXCYjMzQ7cmVjbGFpbWVkX3BhZ2VzXCYjMzQ7KSlcbiYjNDM7XHRcdGdvdG8gb3V0O1xuJiM0MztcbiYjNDM7XHRpZiAoaGlnaF90aW1lIFx1MDAzZT0gbG93X3RpbWUpXG4mIzQzO1x0XHRQUklOVF9GQUlMKFwmIzM0O2hpZ2ggY2dyb3VwIG5vdCBpbXByb3ZlZCB3aXRoIGFzeW5jIHJlY2xhaW06IGhpZ2hfdGltZT0lZiBsb3dfdGltZT0lZlwmIzM0OyxcbiYjNDM7XHRcdFx0ICAgaGlnaF90aW1lLCBsb3dfdGltZSk7XG4mIzQzO1xuJiM0MztvdXQ6XG4mIzQzO1x0aWYgKHNrZWwpXG4mIzQzO1x0XHRtZW1jZ19hc3luY19yZWNsYWltX19kZXN0cm95KHNrZWwpO1xuJiM0MztcdGNsZWFudXBfY2dyb3VwX2Vudmlyb25tZW50KCk7XG4mIzQzO31cbmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ3MvbWVtY2dfYXN5bmNfcmVjbGFpbS5jIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dzL21lbWNnX2FzeW5jX3JlY2xhaW0uY1xubmV3IGZpbGUgbW9kZSAxMDA2NDRcbmluZGV4IDAwMDAwMDAwMDAwMDAuLjIyNWYwYmM2NjcxMTNcbi0tLSAvZGV2L251bGxcbiYjNDM7JiM0MzsmIzQzOyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9wcm9ncy9tZW1jZ19hc3luY19yZWNsYWltLmNcbkBAIC0wLDAgJiM0MzsxLDE4MCBAQFxuJiM0MzsvLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogR1BMLTIuMFxuJiM0MztcbiYjNDM7I2luY2x1ZGUgXCYjMzQ7dm1saW51eC5oXCYjMzQ7XG4mIzQzOyNpbmNsdWRlIFwmIzM0O2JwZl9leHBlcmltZW50YWwuaFwmIzM0O1xuJiM0MzsjaW5jbHVkZSBcdTAwM2NicGYvYnBmX2hlbHBlcnMuaFx1MDAzZVxuJiM0MzsjaW5jbHVkZSBcdTAwM2NicGYvYnBmX3RyYWNpbmcuaFx1MDAzZVxuJiM0MzsjaW5jbHVkZSBcdTAwM2NicGYvYnBmX2NvcmVfcmVhZC5oXHUwMDNlXG4mIzQzO1xuJiM0MzsjZGVmaW5lIENMT0NLX01PTk9UT05JQ19JRFx0MVxuJiM0MzsjZGVmaW5lIFBBR0VfU0laRVx0XHQ0MDk2VUxcbiYjNDM7I2RlZmluZSBSRUNMQUlNX1NJWkVcdFx0KDMyICogUEFHRV9TSVpFKVxuJiM0MzsjZGVmaW5lIFJFQ0xBSU1fTUFYX0lURVJcdDMyXG4mIzQzO1xuJiM0MztzdHJ1Y3QgYnBmX2FyZ3NfcyB7XG4mIzQzO1x0dTY0IGhpZ2hfY2dyb3VwX2lkO1xuJiM0MztcdHU2NCBsb3dfY2dyb3VwX2lkO1xuJiM0MztcdHU2NCBldmVudF9kZWx0YV90aHJlc2hvbGQ7XG4mIzQzO1x0dTY0IGNoZWNrX25zO1xuJiM0Mzt9O1xuJiM0MztcbiYjNDM7c3RydWN0IGNncm91cF9tZW1jZyB7XG4mIzQzO1x0c3RydWN0IGNncm91cCAqY2dycDtcbiYjNDM7XHRzdHJ1Y3QgbWVtX2Nncm91cCAqbWVtY2c7XG4mIzQzO307XG4mIzQzO1xuJiM0MztzdGF0aWMgdTY0IHdxX2hpZ2hfY2dyb3VwX2lkO1xuJiM0MztzdGF0aWMgdTY0IHdxX2xvd19jZ3JvdXBfaWQ7XG4mIzQzO1xuJiM0MzsvKiBTdGF0aXN0aWNzIGV4cG9zZWQgdG8gdXNlcnNwYWNlIHRocm91Z2ggLmJzcywgc28gdGhlIHRlc3QgY2FuIHZlcmlmeVxuJiM0MzsgKiB0aGF0IHJlY2xhaW0gYWN0dWFsbHkgaGFwcGVuZWQgaW5zdGVhZCBvZiByZWx5aW5nIG9uIHRpbWluZyBhbG9uZS5cbiYjNDM7ICovXG4mIzQzO3U2NCByZWNsYWltX2NhbGxzO1xuJiM0Mzt1NjQgcmVjbGFpbWVkX3BhZ2VzO1xuJiM0MztcbiYjNDM7c3RhdGljIGludCBnZXRfY2dyb3VwX21lbWNnX2Zyb21faWQodTY0IGNncm91cF9pZCwgc3RydWN0IGNncm91cF9tZW1jZyAqY20pXG4mIzQzO3tcbiYjNDM7XHRjbS1cdTAwM2VjZ3JwID0gYnBmX2Nncm91cF9mcm9tX2lkKGNncm91cF9pZCk7XG4mIzQzO1x0aWYgKCFjbS1cdTAwM2VjZ3JwKVxuJiM0MztcdFx0cmV0dXJuIC0xO1xuJiM0MztcbiYjNDM7XHRjbS1cdTAwM2VtZW1jZyA9IGJwZl9nZXRfbWVtX2Nncm91cChcdTAwMjZjbS1cdTAwM2VjZ3JwLVx1MDAzZXNlbGYpO1xuJiM0MztcdGlmICghY20tXHUwMDNlbWVtY2cpIHtcbiYjNDM7XHRcdGJwZl9jZ3JvdXBfcmVsZWFzZShjbS1cdTAwM2VjZ3JwKTtcbiYjNDM7XHRcdHJldHVybiAtMTtcbiYjNDM7XHR9XG4mIzQzO1xuJiM0MztcdHJldHVybiAwO1xuJiM0Mzt9XG4mIzQzO1xuJiM0MztzdGF0aWMgdm9pZCBwdXRfY2dyb3VwX21lbWNnKHN0cnVjdCBjZ3JvdXBfbWVtY2cgKmNtKVxuJiM0Mzt7XG4mIzQzO1x0YnBmX3B1dF9tZW1fY2dyb3VwKGNtLVx1MDAzZW1lbWNnKTtcbiYjNDM7XHRicGZfY2dyb3VwX3JlbGVhc2UoY20tXHUwMDNlY2dycCk7XG4mIzQzO31cbiYjNDM7XG4mIzQzO3N0YXRpYyBpbnQgZ2V0X2Nncm91cF9ldmVudCh1NjQgY2dyb3VwX2lkLCB1NjQgKnZhbClcbiYjNDM7e1xuJiM0MztcdHN0cnVjdCBjZ3JvdXBfbWVtY2cgY207XG4mIzQzO1xuJiM0MztcdGlmIChnZXRfY2dyb3VwX21lbWNnX2Zyb21faWQoY2dyb3VwX2lkLCBcdTAwMjZjbSkpXG4mIzQzO1x0XHRyZXR1cm4gLTE7XG4mIzQzO1x0YnBmX21lbV9jZ3JvdXBfZmx1c2hfc3RhdHMoY20ubWVtY2cpO1xuJiM0MztcdCp2YWwgPSBicGZfbWVtX2Nncm91cF9wYWdlX3N0YXRlKGNtLm1lbWNnLFxuJiM0MztcdFx0YnBmX2NvcmVfZW51bV92YWx1ZShlbnVtIG5vZGVfc3RhdF9pdGVtLFxuJiM0MztcdFx0XHRcdCAgICBXT1JLSU5HU0VUX1JFRkFVTFRfRklMRSkpO1xuJiM0MztcdHB1dF9jZ3JvdXBfbWVtY2coXHUwMDI2Y20pO1xuJiM0MztcbiYjNDM7XHRyZXR1cm4gMDtcbiYjNDM7fVxuJiM0MztcbiYjNDM7c3RhdGljIGJvb2xcbiYjNDM7c2hvdWxkX3JlY2xhaW1fY2dyb3VwKHU2NCBjZ3JvdXBfaWQsIHU2NCAqcHJldl9ldmVudCwgdTY0IGV2ZW50X2RlbHRhX3RocmVzaG9sZClcbiYjNDM7e1xuJiM0MztcdHU2NCBjdXIsIGRlbHRhO1xuJiM0MztcbiYjNDM7XHRpZiAoZ2V0X2Nncm91cF9ldmVudChjZ3JvdXBfaWQsIFx1MDAyNmN1cikpXG4mIzQzO1x0XHRyZXR1cm4gZmFsc2U7XG4mIzQzO1xuJiM0MztcdGRlbHRhID0gY3VyIC0gKnByZXZfZXZlbnQ7XG4mIzQzO1x0KnByZXZfZXZlbnQgPSBjdXI7XG4mIzQzO1xuJiM0MztcdHJldHVybiBkZWx0YSBcdTAwM2U9IGV2ZW50X2RlbHRhX3RocmVzaG9sZDtcbiYjNDM7fVxuJiM0MztcbiYjNDM7c3RhdGljIGludCByZWNsYWltX2Nncm91cCh1NjQgY2dyb3VwX2lkKVxuJiM0Mzt7XG4mIzQzO1x0c3RydWN0IGNncm91cF9tZW1jZyBjbTtcbiYjNDM7XHRpbnQgaTtcbiYjNDM7XG4mIzQzO1x0aWYgKGdldF9jZ3JvdXBfbWVtY2dfZnJvbV9pZChjZ3JvdXBfaWQsIFx1MDAyNmNtKSlcbiYjNDM7XHRcdHJldHVybiAwO1xuJiM0MztcbiYjNDM7XHRyZWNsYWltX2NhbGxzJiM0MzsmIzQzOztcbiYjNDM7XHRmb3IgKGkgPSAwOyBpIFx1MDAzYyBSRUNMQUlNX01BWF9JVEVSOyBpJiM0MzsmIzQzOykge1xuJiM0MztcdFx0dTY0IG5yID0gYnBmX3Byb2FjdGl2ZV9yZWNsYWltKGNtLm1lbWNnLCBSRUNMQUlNX1NJWkUpO1xuJiM0MztcbiYjNDM7XHRcdGlmICghbnIpXG4mIzQzO1x0XHRcdGJyZWFrO1xuJiM0MztcdFx0cmVjbGFpbWVkX3BhZ2VzICYjNDM7PSBucjtcbiYjNDM7XHR9XG4mIzQzO1xuJiM0MztcdHB1dF9jZ3JvdXBfbWVtY2coXHUwMDI2Y20pO1xuJiM0MztcbiYjNDM7XHRyZXR1cm4gMDtcbiYjNDM7fVxuJiM0MztcbiYjNDM7c3RydWN0IHdxX2VsZW0ge1xuJiM0MztcdHN0cnVjdCBicGZfdGltZXIgdGltZXI7XG4mIzQzO1x0c3RydWN0IGJwZl93cSB3b3JrO1xuJiM0MztcdHU2NCBwcmV2X2V2ZW50O1xuJiM0MztcdHU2NCBldmVudF9kZWx0YV90aHJlc2hvbGQ7XG4mIzQzO1x0dTY0IGNoZWNrX25zO1xuJiM0Mzt9O1xuJiM0MztcbiYjNDM7c3RydWN0IHtcbiYjNDM7XHRfX3VpbnQodHlwZSwgQlBGX01BUF9UWVBFX0FSUkFZKTtcbiYjNDM7XHRfX3VpbnQobWF4X2VudHJpZXMsIDEpO1xuJiM0MztcdF9fdHlwZShrZXksIF9fdTMyKTtcbiYjNDM7XHRfX3R5cGUodmFsdWUsIHN0cnVjdCB3cV9lbGVtKTtcbiYjNDM7fSB3cV9tYXAgU0VDKFwmIzM0Oy5tYXBzXCYjMzQ7KTtcbiYjNDM7XG4mIzQzO3N0YXRpYyBpbnQgYXN5bmNfZnJlZSh2b2lkICptYXAsIGludCAqa2V5LCB2b2lkICp2YWx1ZSlcbiYjNDM7e1xuJiM0MztcdHN0cnVjdCB3cV9lbGVtICplbGVtID0gdmFsdWU7XG4mIzQzO1xuJiM0MztcdGlmIChzaG91bGRfcmVjbGFpbV9jZ3JvdXAod3FfaGlnaF9jZ3JvdXBfaWQsIFx1MDAyNmVsZW0tXHUwMDNlcHJldl9ldmVudCxcbiYjNDM7XHRcdGVsZW0tXHUwMDNlZXZlbnRfZGVsdGFfdGhyZXNob2xkKSkge1xuJiM0MztcdFx0cmVjbGFpbV9jZ3JvdXAod3FfbG93X2Nncm91cF9pZCk7XG4mIzQzO1x0XHRicGZfd3Ffc3RhcnQoXHUwMDI2ZWxlbS1cdTAwM2V3b3JrLCAwKTtcbiYjNDM7XHR9XG4mIzQzO1xuJiM0MztcdHJldHVybiAwO1xuJiM0Mzt9XG4mIzQzO1xuJiM0MztzdGF0aWMgaW50IHdxX3RpbWVyX2NiKHZvaWQgKm1hcCwgaW50ICprZXksIHN0cnVjdCB3cV9lbGVtICplbGVtKVxuJiM0Mzt7XG4mIzQzO1x0YnBmX3dxX3N0YXJ0KFx1MDAyNmVsZW0tXHUwMDNld29yaywgMCk7XG4mIzQzO1x0YnBmX3RpbWVyX3N0YXJ0KFx1MDAyNmVsZW0tXHUwMDNldGltZXIsIGVsZW0tXHUwMDNlY2hlY2tfbnMsIDApO1xuJiM0MztcbiYjNDM7XHRyZXR1cm4gMDtcbiYjNDM7fVxuJiM0MztcbiYjNDM7U0VDKFwmIzM0O3N5c2NhbGxcJiMzNDspXG4mIzQzO2ludCB3cV9wcm9nX2luaXQoc3RydWN0IGJwZl9hcmdzX3MgKmN0eClcbiYjNDM7e1xuJiM0MztcdHN0cnVjdCB3cV9lbGVtICplbGVtO1xuJiM0MztcdF9fdTMyIGtleSA9IDA7XG4mIzQzO1x0aW50IHJldDtcbiYjNDM7XG4mIzQzO1x0ZWxlbSA9IGJwZl9tYXBfbG9va3VwX2VsZW0oXHUwMDI2d3FfbWFwLCBcdTAwMjZrZXkpO1xuJiM0MztcdGlmICghZWxlbSlcbiYjNDM7XHRcdHJldHVybiAtMTtcbiYjNDM7XG4mIzQzO1x0cmV0ID0gYnBmX3dxX2luaXQoXHUwMDI2ZWxlbS1cdTAwM2V3b3JrLCBcdTAwMjZ3cV9tYXAsIDApO1xuJiM0MztcdGlmIChyZXQpXG4mIzQzO1x0XHRyZXR1cm4gcmV0O1xuJiM0MztcbiYjNDM7XHRyZXQgPSBicGZfd3Ffc2V0X2NhbGxiYWNrKFx1MDAyNmVsZW0tXHUwMDNld29yaywgYXN5bmNfZnJlZSwgMCk7XG4mIzQzO1x0aWYgKHJldClcbiYjNDM7XHRcdHJldHVybiByZXQ7XG4mIzQzO1xuJiM0MztcdHJldCA9IGJwZl90aW1lcl9pbml0KFx1MDAyNmVsZW0tXHUwMDNldGltZXIsIFx1MDAyNndxX21hcCwgQ0xPQ0tfTU9OT1RPTklDX0lEKTtcbiYjNDM7XHRpZiAocmV0KVxuJiM0MztcdFx0cmV0dXJuIHJldDtcbiYjNDM7XG4mIzQzO1x0cmV0ID0gYnBmX3RpbWVyX3NldF9jYWxsYmFjayhcdTAwMjZlbGVtLVx1MDAzZXRpbWVyLCB3cV90aW1lcl9jYik7XG4mIzQzO1x0aWYgKHJldClcbiYjNDM7XHRcdHJldHVybiByZXQ7XG4mIzQzO1xuJiM0MztcdGVsZW0tXHUwMDNlcHJldl9ldmVudCA9IDA7XG4mIzQzO1x0ZWxlbS1cdTAwM2VldmVudF9kZWx0YV90aHJlc2hvbGQgPSBjdHgtXHUwMDNlZXZlbnRfZGVsdGFfdGhyZXNob2xkO1xuJiM0MztcdGVsZW0tXHUwMDNlY2hlY2tfbnMgPSBjdHgtXHUwMDNlY2hlY2tfbnM7XG4mIzQzO1xuJiM0MztcdHdxX2hpZ2hfY2dyb3VwX2lkID0gY3R4LVx1MDAzZWhpZ2hfY2dyb3VwX2lkO1xuJiM0MztcdHdxX2xvd19jZ3JvdXBfaWQgPSBjdHgtXHUwMDNlbG93X2Nncm91cF9pZDtcbiYjNDM7XG4mIzQzO1x0cmV0dXJuIGJwZl90aW1lcl9zdGFydChcdTAwMjZlbGVtLVx1MDAzZXRpbWVyLCBlbGVtLVx1MDAzZWNoZWNrX25zLCAwKTtcbiYjNDM7fVxuJiM0MztcbiYjNDM7Y2hhciBMSUNFTlNFW10gU0VDKFwmIzM0O2xpY2Vuc2VcJiMzNDspID0gXCYjMzQ7R1BMXCYjMzQ7O1xuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjIvMTwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzE5IDA3OjQ0PC90ZD4KCQkJPHRkPmFnZW50PC90ZD4KCQkJPHRkPnBhdGNoLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmJlc3QtZXhwZW5zaXZlPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0VuYWJsZUNvbmZpZ3MmIzM0OzogWwogICAgJiMzNDtNRU1DRyYjMzQ7LAogICAgJiMzNDtCUEZfU1lTQ0FMTCYjMzQ7CiAgXSwKICAmIzM0O0ZvY3VzU3ltYm9scyYjMzQ7OiBbCiAgICAmIzM0O2JwZl9wcm9hY3RpdmVfcmVjbGFpbSYjMzQ7LAogICAgJiMzNDticGZfcHJvYWN0aXZlX3JlY2xhaW1fc3dhcHBpbmVzcyYjMzQ7CiAgXSwKICAmIzM0O1JlYXNvbmluZyYjMzQ7OiAmIzM0O1RoZSBwYXRjaCBpbnRyb2R1Y2VzIHR3byBuZXcgQlBGIGtmdW5jcywgYGJwZl9wcm9hY3RpdmVfcmVjbGFpbWAgYW5kIGBicGZfcHJvYWN0aXZlX3JlY2xhaW1fc3dhcHBpbmVzc2AsIHdoaWNoIGFsbG93IEJQRiBwcm9ncmFtcyB0byBwcm9hY3RpdmVseSB0cmlnZ2VyIG1lbW9yeSByZWNsYWltIG9uIGEgbWVtb3J5IGNncm91cC4gVGhpcyBleHBvc2VzIGNvcmUgbWVtb3J5IG1hbmFnZW1lbnQgYW5kIHJlY2xhaW0gbG9naWMgdG8gQlBGLCBtYWtpbmcgaXQgYSBmdW5jdGlvbmFsIGNoYW5nZSB0aGF0IGlzIGhpZ2hseSByZWFjaGFibGUgYW5kIHdvcnRoIGZ1enppbmcuJiMzNDssCiAgJiMzNDtXb3J0aEZ1enppbmcmIzM0OzogdHJ1ZQp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5JbnN0cnVjdGlvbjo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPllvdSBhcmUgYW4gZXhwZXJ0IExpbnV4IGtlcm5lbCBtYWludGFpbmVyLgpZb3VyIGpvYiBpcyB0byByZXZpZXcgYSBwcm92aWRlZCBwYXRjaCBzZXJpZXMgYW5kIGRldGVybWluZQppZiBpdCBtYWtlcyBmdW5jdGlvbmFsIGNoYW5nZXMgdG8gdGhlIGtlcm5lbCB0aGF0IHNob3VsZCBiZSBmdXp6ZWQuCgpJTVBPUlRBTlQ6IFRoZSBjaGFuZ2VzIGhhdmUgQUxSRUFEWSBiZWVuIGFwcGxpZWQgYW5kIGNvbW1pdHRlZCBhcyB0aGUgSEVBRCBjb21taXQgaW4KeW91ciB3b3Jrc3BhY2UuIERvIE5PVCByZWx5IG9uIHlvdXIgaW50ZXJuYWwga25vd2xlZGdlIG9mIHRoZSBrZXJuZWwuIFlvdSBtdXN0IGFjdGl2ZWx5CnVzZSB5b3VyIGNvZGUgYWNjZXNzIHRvb2xzIHRvIGV4YW1pbmUgdGhlIGFjdHVhbCBzb3VyY2UgY29kZSBhbmQgY29uZmlybSBhbnkgYXNzdW1wdGlvbnMuCgpSZXR1cm4gV29ydGhGdXp6aW5nPWZhbHNlIGlmIHRoZSBwYXRjaCBvbmx5IGNvbnRhaW5zOgotIE1vZGlmaWNhdGlvbnMgdG8gRG9jdW1lbnRhdGlvbi8sIEtjb25maWcgZmlsZXMsIG9yIGNvZGUgY29tbWVudHMuCi0gUHVyZWx5IGRlY29yYXRpdmUgY2hhbmdlcywgc3VjaCBhcyBsb2dnaW5nIChlLmcuLCBwcl9lcnIsIHByaW50aykgb3IgdHJhY2Vwb2ludHMuCi0gQ2hhbmdlcyB0byBudW1lcmljIGNvbnN0YW50cyBvciBtYWNyb3MgdGhhdCBkbyBub3QgZnVuY3Rpb25hbGx5IGFsdGVyIGV4ZWN1dGlvbiBmbG93LgotIENvZGUgcGF0aHMgdGhhdCBhcmUgaW1wb3NzaWJsZSB0byByZWFjaCBpbiB2aXJ0dWFsaXplZCBlbnZpcm9ubWVudHMgbGlrZSBHQ0Ugb3IgUUVNVSwKICBldmVuIHdoZW4gdXRpbGl6aW5nIHNvZnR3YXJlLWVtdWxhdGVkIGhhcmR3YXJlIChlLmcuLCB1c2IgZ2FkZ2V0LCBtYWM4MDIxMV9od3NpbSkuCi0gQ29kZSBpbiB2ZW5kb3Itc3BlY2lmaWMgUENJZSBzd2l0Y2gsIFNtYXJ0TklDLCBvciBHUFUgZHJpdmVycyAoZS5nLiwgbWx4c3csIHBkc19jb3JlLCBxZWQsCiAgaW9uaWMsIGFtZGdwdSkgdGhhdCByZXF1aXJlIHBoeXNpY2FsIFBDSWUgaGFyZHdhcmUgY2FyZHMgbm90IGVtdWxhdGVkIGluIHN0YW5kYXJkIFFFTVUuCi0gRHJpdmVyIC5yZW1vdmUsIC5zaHV0ZG93biwgb3IgcGNpX3VucmVnaXN0ZXJfZHJpdmVyIHRlYXJkb3duIGNhbGxiYWNrcyAoZS5nLiwgaWdiX3JlbW92ZSkKICB0aGF0IGFyZSBleGVjdXRlZCBvbmx5IGR1cmluZyBQQ0kgaG90LXVucGx1ZyBvciBzeXNmcyBkcml2ZXIgdW5iaW5kIG9wZXJhdGlvbnMuCgpJZiBpdCBtb2RpZmllcyByZWFjaGFibGUgY29yZSBrZXJuZWwgbG9naWMsIGRyaXZlcnMsIG9yIGFyY2hpdGVjdHVyZXMsIHVzZSB5b3VyIGNvZGUgc2VhcmNoCnRvb2xzIHRvIHZlcmlmeSB0aGUgY29kZSBjYW4gYmUgZXhlY3V0ZWQsIHRoZW4gcmV0dXJuIFdvcnRoRnV6emluZz10cnVlLgoKV2hlbiByZXR1cm5pbmcgV29ydGhGdXp6aW5nPXRydWUsIHlvdSBNVVNUIEFMU086CjEuIEV4dHJhY3QgYW55IHNwZWNpZmljIGtlcm5lbCBmdW5jdGlvbnMgdGhhdCBzaG91bGQgYmUgaGVhdmlseSBmdXp6ZWQgaW50byBGb2N1c1N5bWJvbHMuCiAgIEF2b2lkIGxpc3RpbmcgZ2VuZXJpYyBob3QtcGF0aCBmdW5jdGlvbnMgdG8gcHJldmVudCBza2V3ZWQgdGVzdCBkaXN0cmlidXRpb25zLgogICBQcmVmZXIgbm9uLXN0YXRpYywgbm9uLWlubGluZWQgQVBJIGVudHJ5cG9pbnQgZnVuY3Rpb25zIG92ZXIgaW50ZXJuYWwgc3RhdGljIGhlbHBlciBmdW5jdGlvbnMKICAgKHdoaWNoIGFyZSBpbmxpbmVkIGJ5IHRoZSBjb21waWxlciBhbmQgZG8gbm90IGhhdmUgZGlzdGluY3Qgc3ltYm9sIGFkZHJlc3NlcykuCjIuIElkZW50aWZ5IGFueSBzcGVjaWZpYyBDT05GSUdfIG9wdGlvbnMgcmVxdWlyZWQgdG8gcHJvcGVybHkgdGVzdCB0aGlzIG5ldy9tb2RpZmllZCBmZWF0dXJlLgogICBHbyBhbmQgbG9vayBpbnRvIHRoZSBLY29uZmlnIGZpbGVzIGFuZCBjaGVjayBmb3IgaWZkZWZzIGFyb3VuZCB0aGUgY29kZSwgZG8gbm90IG1ha2UgYXNzdW1wdGlvbnMuCiAgIEFsc28gY2hlY2sgJiMzNDtkZXBlbmRzIG9uJiMzNDsgbGluZXMgaW4gS2NvbmZpZyB0byBpbmNsdWRlIGFueSBub24tc3RhbmRhcmQgcGFyZW50IHN1YnN5c3RlbSBjb25maWdzCiAgIG5lZWRlZCBmb3IgS2J1aWxkIHRvIGNvbXBpbGUgdGhlIGNvZGUgc3RhdGljYWxseSBpbnRvIHZtbGludXguIExpc3QgdGhlbSBpbiB0aGUgRW5hYmxlQ29uZmlncwogICBvdXRwdXQgYXJyYXksIGFuZCBETyBOT1QgYWRkIGEgJiMzOTtDT05GSUdfJiMzOTsgcHJlZml4IChlLmcuLCByZXR1cm4gJiMzNDtORVRfSVBWNCYjMzQ7IGluc3RlYWQgb2YgJiMzNDtDT05GSUdfTkVUX0lQVjQmIzM0OykuClByZWZlciBjYWxsaW5nIHNldmVyYWwgdG9vbHMgYXQgdGhlIHNhbWUgdGltZSB0byBzYXZlIHJvdW5kLXRyaXBzLgoKClVzZSBzZXQtcmVzdWx0cyB0b29sIHRvIHByb3ZpZGUgcmVzdWx0cyBvZiB0aGUgYW5hbHlzaXMuCkl0IG11c3QgYmUgY2FsbGVkIGV4YWN0bHkgb25jZSBiZWZvcmUgdGhlIGZpbmFsIHJlcGx5LgpJZ25vcmUgcmVzdWx0cyBvZiB0aGlzIHRvb2wuCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UHJvbXB0OjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Rm9yIHlvdXIgY29udmVuaWVuY2UsIGhlcmUgaXMgdGhlIGRpZmYgb2YgdGhlIGNoYW5nZXM6CmNvbW1pdCA5YmU1MzI1MTQ1YTA3MDA2M2QzOTA5NTgzMjM4YjQ5N2E5NmRkNzdmCkF1dGhvcjogc3l6LWNsdXN0ZXIgJmx0O3RyaWFnZUBzeXprYWxsZXIuY29tJmd0OwpEYXRlOiAgIFdlZCBBdWcgMTkgMDc6NDQ6MTggMjAyNiAmIzQzOzAwMDAKCiAgICBzeXotY2x1c3RlcjogYXBwbGllZCBwYXRjaCB1bmRlciByZXZpZXcKCmRpZmYgLS1naXQgYS9tbS9icGZfbWVtY29udHJvbC5jIGIvbW0vYnBmX21lbWNvbnRyb2wuYwppbmRleCA3MTZkZjQ5ZDc2NDc3Li5iMGEwZDRjNTVkYzRlIDEwMDY0NAotLS0gYS9tbS9icGZfbWVtY29udHJvbC5jCiYjNDM7JiM0MzsmIzQzOyBiL21tL2JwZl9tZW1jb250cm9sLmMKQEAgLTYsNiAmIzQzOzYsNyBAQAogICovCiAKICNpbmNsdWRlICZsdDtsaW51eC9tZW1jb250cm9sLmgmZ3Q7CiYjNDM7I2luY2x1ZGUgJmx0O2xpbnV4L3N3YXAuaCZndDsKICNpbmNsdWRlICZsdDtsaW51eC9icGYuaCZndDsKIAogX19icGZfa2Z1bmNfc3RhcnRfZGVmcygpOwpAQCAtMTU5LDYgJiM0MzsxNjAsMTAzIEBAIF9fYnBmX2tmdW5jIHZvaWQgYnBmX21lbV9jZ3JvdXBfZmx1c2hfc3RhdHMoc3RydWN0IG1lbV9jZ3JvdXAgKm1lbWNnKQogCW1lbV9jZ3JvdXBfZmx1c2hfc3RhdHMobWVtY2cpOwogfQogCiYjNDM7LyoKJiM0MzsgKiBSZWNsYWltIG11c3Qgbm90IHJlY3Vyc2UuIHRyeV90b19mcmVlX21lbV9jZ3JvdXBfcGFnZXMoKSB1bmNvbmRpdGlvbmFsbHkKJiM0MzsgKiBvdmVyd3JpdGVzIGN1cnJlbnQtJmd0O3JlY2xhaW1fc3RhdGUgb24gZW50cnkgYW5kIHJlc2V0cyBpdCB0byBOVUxMIG9uIGV4aXQuCiYjNDM7ICogU28gaW52b2tpbmcgaXQgZnJvbSBhbiBpbi1mbGlnaHQgcmVjbGFpbSB3b3VsZCBjbG9iYmVyIHRoZSBvdXRlciByZWNsYWltCiYjNDM7ICogc3RhdGUgYW5kIGNvcnJ1cHQgaXRzIGFjY291bnRpbmcuCiYjNDM7ICoKJiM0MzsgKiBUaGUgZ3VhcmQgaXMgUEZfTUVNQUxMT0MuIEV2ZXJ5IHJlY2xhaW0gZW50cnkgcG9pbnQgbWFya3MgdGhlIGN1cnJlbnQKJiM0MzsgKiB0YXNrIHdpdGggaXQgZm9yIHRoZSB3aG9sZSByZWNsYWltIHdpbmRvdzogdHJ5X3RvX2ZyZWVfbWVtX2Nncm91cF9wYWdlcygpCiYjNDM7ICogYW5kIF9fcGVyZm9ybV9yZWNsYWltKCkgZG8gc28gdmlhIG1lbWFsbG9jX25vcmVjbGFpbV9zYXZlKCksIGFuZCBrc3dhcGQKJiM0MzsgKiBrZWVwcyBpdCBzZXQgZm9yIGl0cyBlbnRpcmUgbGlmZXRpbWUuIEEgaG9vayBpbnNpZGUgdGhlIHJlY2xhaW0gcGF0aAomIzQzOyAqIChzaHJpbmtfbm9kZSwgc2hyaW5rX3NsYWIsIC4uLikgZXhlY3V0ZXMgaW4gdGhlIGNvbnRleHQgb2YgdGhlCiYjNDM7ICogcmVjbGFpbWluZyB0YXNrLCB3aGVyZSBjdXJyZW50LSZndDtmbGFncyBhbHJlYWR5IGNhcnJpZXMgdGhlIGZsYWcuIFRoZSBwYWdlCiYjNDM7ICogYWxsb2NhdG9yLCB0aGUgbWVtY2cgY2hhcmdpbmcgcGF0aCBhbmQgbm9kZV9yZWNsYWltKCkgcmVseSBvbiB0aGUgc2FtZQomIzQzOyAqIGZsYWcgdG8gYXZvaWQgcmVjbGFpbSByZWN1cnNpb24uCiYjNDM7ICoKJiM0MzsgKiBJbiB0cnlfdG9fZnJlZV9tZW1fY2dyb3VwX3BhZ2VzKCksIHJlY2xhaW1fc3RhdGUgaXMgc2V0IHNsaWdodGx5IGJlZm9yZQomIzQzOyAqIFBGX01FTUFMTE9DLCB3aXRoIG9ubHkgYSB0cmFjZXBvaW50IGluIGJldHdlZW4sIHdoaWNoIGEgc2xlZXBhYmxlIEJQRgomIzQzOyAqIHByb2dyYW0gY2Fubm90IGF0dGFjaCB0by4KJiM0MzsgKiBBbHNvLCBQRl9NRU1BTExPQyBpcyBzZXQgaW4gc29tZSBub24tcmVjbGFpbSBjb250ZXh0cyAoZS5nLiBkaXJlY3QgY29tcGFjdGlvbgomIzQzOyAqIGFuZCB2bWFsbG9jKSwgd2hlcmUgdGhlIGtmdW5jIGNvbnNlcnZhdGl2ZWx5IHJlZnVzZXMgdG8gcmVjbGFpbSBhcyB3ZWxsLgomIzQzOyAqLwomIzQzO3N0YXRpYyBib29sIGJwZl9pbl9yZWNsYWltX2NvbnRleHQodm9pZCkKJiM0Mzt7CiYjNDM7CXJldHVybiBjdXJyZW50LSZndDtmbGFncyAmYW1wOyBQRl9NRU1BTExPQzsKJiM0Mzt9CiYjNDM7CiYjNDM7LyoKJiM0MzsgKiBTaGFyZWQgaW1wbGVtZW50YXRpb24gb2YgdGhlIHByb2FjdGl2ZSByZWNsYWltIGtmdW5jczogcGVyZm9ybXMgb25lCiYjNDM7ICogcmVjbGFpbSBwYXNzIG9uIEBtZW1jZyB3aXRoIEBucl9wYWdlcyBhcyB0aGUgZ29hbCwgYWxsb3dpbmcgc3dhcCwgYW5kCiYjNDM7ICogQHN3YXBwaW5lc3MgYXMgdGhlIGFub24vZmlsZSBiYWxhbmNlIG92ZXJyaWRlIChOVUxMIHRvIGZvbGxvdyB0aGUKJiM0MzsgKiBjZ3JvdXAmIzM5O3Mgb3duIHN3YXBwaW5lc3Mgc2V0dGluZykuCiYjNDM7ICovCiYjNDM7c3RhdGljIHVuc2lnbmVkIGxvbmcKJiM0MzticGZfcHJvYWN0aXZlX3JlY2xhaW1fcGFnZXMoc3RydWN0IG1lbV9jZ3JvdXAgKm1lbWNnLCB1bnNpZ25lZCBsb25nIG5yX3BhZ2VzLAomIzQzOwkJCSAgICBpbnQgKnN3YXBwaW5lc3MpCiYjNDM7ewomIzQzOwlpZiAoIW5yX3BhZ2VzIHx8IHVubGlrZWx5KGJwZl9pbl9yZWNsYWltX2NvbnRleHQoKSkpCiYjNDM7CQlyZXR1cm4gMDsKJiM0MzsKJiM0MzsJcmV0dXJuIHRyeV90b19mcmVlX21lbV9jZ3JvdXBfcGFnZXMobWVtY2csIG5yX3BhZ2VzLCBHRlBfS0VSTkVMLAomIzQzOwkJCQkJICAgIE1FTUNHX1JFQ0xBSU1fTUFZX1NXQVAgfAomIzQzOwkJCQkJICAgIE1FTUNHX1JFQ0xBSU1fUFJPQUNUSVZFLAomIzQzOwkJCQkJICAgIHN3YXBwaW5lc3MpOwomIzQzO30KJiM0MzsKJiM0MzsvKioKJiM0MzsgKiBicGZfcHJvYWN0aXZlX3JlY2xhaW0gLSBwcm9hY3RpdmVseSByZWNsYWltIG1lbW9yeSBmcm9tIGEgbWVtb3J5CiYjNDM7ICogICAgICAgICAgICAgICAgICAgICAgICAgY2dyb3VwCiYjNDM7ICogQG1lbWNnOiB0aGUgdGFyZ2V0IG1lbW9yeSBjZ3JvdXAgdG8gcmVjbGFpbSBmcm9tCiYjNDM7ICogQHNpemU6ICB0aGUgYW1vdW50IG9mIG1lbW9yeSB0byByZWNsYWltLCBpbiBieXRlcwomIzQzOyAqCiYjNDM7ICogVHJpZ2dlciBvbmUgcHJvYWN0aXZlIHJlY2xhaW0gcGFzcyBvbiBAbWVtY2csIHNpbWlsYXIgdG8gYSB3cml0ZSB0bwomIzQzOyAqIHRoZSBtZW1vcnkucmVjbGFpbSBjZ3JvdXAgZmlsZTogcGFnZXMgYXJlIHJlY2xhaW1lZCBhY2NvcmRpbmcgdG8gdGhlCiYjNDM7ICogY2dyb3VwJiMzOTtzIG93biBzd2FwcGluZXNzIHNldHRpbmcgYW5kIHN3YXAgaXMgYWxsb3dlZC4gTm90ZSB0aGF0LAomIzQzOyAqIHVubGlrZSBtZW1vcnkucmVjbGFpbSwgdGhpcyBkb2VzIG5vdCByZXRyeSB1bnRpbCBAc2l6ZSBpcyByZWFjaGVkOwomIzQzOyAqIGNhbGxlcnMgY2FuIGludm9rZSBpdCBhZ2FpbiBpZiBuZWVkZWQuCiYjNDM7ICoKJiM0MzsgKiBSZXR1cm46CiYjNDM7ICogICBUaGUgbnVtYmVyIG9mIHBhZ2VzIGFjdHVhbGx5IHJlY2xhaW1lZCwgb3IgMCBpZiBAc2l6ZSBpcyBzbWFsbGVyCiYjNDM7ICogICB0aGFuIGEgcGFnZSBvciB0aGUgY2FsbGluZyB0YXNrIGlzIGFscmVhZHkgaW4gYSByZWNsYWltL2ZyZWVpbmcKJiM0MzsgKiAgIGNvbnRleHQgKFBGX01FTUFMTE9DKS4KJiM0MzsgKi8KJiM0MztfX2JwZl9rZnVuYyB1bnNpZ25lZCBsb25nIGJwZl9wcm9hY3RpdmVfcmVjbGFpbShzdHJ1Y3QgbWVtX2Nncm91cCAqbWVtY2csCiYjNDM7CQkJCQkJdW5zaWduZWQgbG9uZyBzaXplKQomIzQzO3sKJiM0MzsJcmV0dXJuIGJwZl9wcm9hY3RpdmVfcmVjbGFpbV9wYWdlcyhtZW1jZywgc2l6ZSAvIFBBR0VfU0laRSwgTlVMTCk7CiYjNDM7fQomIzQzOwomIzQzOy8qKgomIzQzOyAqIGJwZl9wcm9hY3RpdmVfcmVjbGFpbV9zd2FwcGluZXNzIC0gcHJvYWN0aXZlbHkgcmVjbGFpbSBtZW1vcnkgZnJvbSBhCiYjNDM7ICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZW1vcnkgY2dyb3VwIHdpdGggYW4gZXhwbGljaXQKJiM0MzsgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN3YXBwaW5lc3MKJiM0MzsgKiBAbWVtY2c6ICAgICAgdGhlIHRhcmdldCBtZW1vcnkgY2dyb3VwIHRvIHJlY2xhaW0gZnJvbQomIzQzOyAqIEBzaXplOiAgICAgICB0aGUgYW1vdW50IG9mIG1lbW9yeSB0byByZWNsYWltLCBpbiBieXRlcwomIzQzOyAqIEBzd2FwcGluZXNzOiBzd2FwcGluZXNzIG92ZXJyaWRlIGZvciB0aGlzIHJlY2xhaW0gcGFzcwomIzQzOyAqCiYjNDM7ICogU2FtZSBhcyBicGZfcHJvYWN0aXZlX3JlY2xhaW0oKSwgZXhjZXB0IHRoYXQgdGhlIGFub24vZmlsZSByZWNsYWltCiYjNDM7ICogYmFsYW5jZSBpcyBjb250cm9sbGVkIGJ5IEBzd2FwcGluZXNzIGluc3RlYWQgb2YgdGhlIGNncm91cCYjMzk7cwomIzQzOyAqIHN3YXBwaW5lc3Mgc2V0dGluZy4gVmFsaWQgdmFsdWVzIGFyZSBbTUlOX1NXQVBQSU5FU1MsIE1BWF9TV0FQUElORVNTXQomIzQzOyAqIGFuZCBTV0FQUElORVNTX0FOT05fT05MWSwgd2hpY2ggcmVzdHJpY3RzIHJlY2xhaW0gdG8gYW5vbiBmb2xpb3MuCiYjNDM7ICoKJiM0MzsgKiBSZXR1cm46CiYjNDM7ICogICBUaGUgbnVtYmVyIG9mIHBhZ2VzIGFjdHVhbGx5IHJlY2xhaW1lZCwgb3IgMCBpZiBAc2l6ZSBpcyBzbWFsbGVyCiYjNDM7ICogICB0aGFuIGEgcGFnZSwgQHN3YXBwaW5lc3MgaXMgb3V0IG9mIHJhbmdlLCBvciB0aGUgY2FsbGluZyB0YXNrIGlzCiYjNDM7ICogICBhbHJlYWR5IGluIGEgcmVjbGFpbS9mcmVlaW5nIGNvbnRleHQgKFBGX01FTUFMTE9DKS4KJiM0MzsgKi8KJiM0MztfX2JwZl9rZnVuYyB1bnNpZ25lZCBsb25nCiYjNDM7YnBmX3Byb2FjdGl2ZV9yZWNsYWltX3N3YXBwaW5lc3Moc3RydWN0IG1lbV9jZ3JvdXAgKm1lbWNnLCB1bnNpZ25lZCBsb25nIHNpemUsCiYjNDM7CQkJCSBpbnQgc3dhcHBpbmVzcykKJiM0Mzt7CiYjNDM7CWlmIChzd2FwcGluZXNzICZsdDsgTUlOX1NXQVBQSU5FU1MgfHwgc3dhcHBpbmVzcyAmZ3Q7IFNXQVBQSU5FU1NfQU5PTl9PTkxZKQomIzQzOwkJcmV0dXJuIDA7CiYjNDM7CiYjNDM7CXJldHVybiBicGZfcHJvYWN0aXZlX3JlY2xhaW1fcGFnZXMobWVtY2csIHNpemUgLyBQQUdFX1NJWkUsCiYjNDM7CQkJCQkgICAmYW1wO3N3YXBwaW5lc3MpOwomIzQzO30KJiM0MzsKIF9fYnBmX2tmdW5jX2VuZF9kZWZzKCk7CiAKIEJURl9LRlVOQ1NfU1RBUlQoYnBmX21lbWNvbnRyb2xfa2Z1bmNzKQpAQCAtMTcyLDYgJiM0MzsyNzAsOSBAQCBCVEZfSURfRkxBR1MoZnVuYywgYnBmX21lbV9jZ3JvdXBfdXNhZ2UpCiBCVEZfSURfRkxBR1MoZnVuYywgYnBmX21lbV9jZ3JvdXBfcGFnZV9zdGF0ZSkKIEJURl9JRF9GTEFHUyhmdW5jLCBicGZfbWVtX2Nncm91cF9mbHVzaF9zdGF0cywgS0ZfU0xFRVBBQkxFKQogCiYjNDM7QlRGX0lEX0ZMQUdTKGZ1bmMsIGJwZl9wcm9hY3RpdmVfcmVjbGFpbSwgS0ZfU0xFRVBBQkxFKQomIzQzO0JURl9JRF9GTEFHUyhmdW5jLCBicGZfcHJvYWN0aXZlX3JlY2xhaW1fc3dhcHBpbmVzcywgS0ZfU0xFRVBBQkxFKQomIzQzOwogQlRGX0tGVU5DU19FTkQoYnBmX21lbWNvbnRyb2xfa2Z1bmNzKQogCiBzdGF0aWMgY29uc3Qgc3RydWN0IGJ0Zl9rZnVuY19pZF9zZXQgYnBmX21lbWNvbnRyb2xfa2Z1bmNfc2V0ID0gewpkaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dfdGVzdHMvbWVtY2dfYXN5bmNfcmVjbGFpbS5jIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dfdGVzdHMvbWVtY2dfYXN5bmNfcmVjbGFpbS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAwMDAuLmU5OTBkMWZkYzc5ZmQKLS0tIC9kZXYvbnVsbAomIzQzOyYjNDM7JiM0MzsgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ190ZXN0cy9tZW1jZ19hc3luY19yZWNsYWltLmMKQEAgLTAsMCAmIzQzOzEsNDc5IEBACiYjNDM7Ly8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjAKJiM0MzsvKgomIzQzOyAqIE1lbW9yeSBjb250cm9sbGVyIGVCUEYgYXN5bmMgcmVjbGFpbSB0ZXN0CiYjNDM7ICovCiYjNDM7CiYjNDM7I2luY2x1ZGUgJmx0O3Rlc3RfcHJvZ3MuaCZndDsKJiM0MzsjaW5jbHVkZSAmbHQ7c3lzL21tYW4uaCZndDsKJiM0MzsjaW5jbHVkZSAmbHQ7c3lzL3N0YXQuaCZndDsKJiM0MzsjaW5jbHVkZSAmbHQ7c3lzL3Zmcy5oJmd0OwomIzQzOyNpbmNsdWRlICZsdDtzeXMvd2FpdC5oJmd0OwomIzQzOyNpbmNsdWRlICZsdDtmY250bC5oJmd0OwomIzQzOyNpbmNsdWRlICZsdDtzaWduYWwuaCZndDsKJiM0MzsjaW5jbHVkZSAmbHQ7dGltZS5oJmd0OwomIzQzOyNpbmNsdWRlICZsdDt1bmlzdGQuaCZndDsKJiM0MzsjaW5jbHVkZSAmbHQ7c3RkaW8uaCZndDsKJiM0MzsjaW5jbHVkZSAmbHQ7c3RkbGliLmgmZ3Q7CiYjNDM7I2luY2x1ZGUgJmx0O3N0cmluZy5oJmd0OwomIzQzOyNpbmNsdWRlICZsdDtsaW1pdHMuaCZndDsKJiM0MzsjaW5jbHVkZSAmbHQ7bGludXgvbWFnaWMuaCZndDsKJiM0MzsKJiM0MzsjaW5jbHVkZSAmIzM0O2Nncm91cF9oZWxwZXJzLmgmIzM0OwomIzQzOwomIzQzO3N0cnVjdCBicGZfYXJnc19zIHsKJiM0MzsJdTY0IGhpZ2hfY2dyb3VwX2lkOwomIzQzOwl1NjQgbG93X2Nncm91cF9pZDsKJiM0MzsJdTY0IGV2ZW50X2RlbHRhX3RocmVzaG9sZDsKJiM0MzsJdTY0IGNoZWNrX25zOwomIzQzO307CiYjNDM7CiYjNDM7I2luY2x1ZGUgJiMzNDttZW1jZ19hc3luY19yZWNsYWltLnNrZWwuaCYjMzQ7CiYjNDM7CiYjNDM7I2RlZmluZSBGSUxFX1NJWkUgKDMyICogMTAyNCAqIDEwMjR1bCkKJiM0MzsjZGVmaW5lIEJVRkZFUl9TSVpFICg0MDk2KQomIzQzOyNkZWZpbmUgQ0dfTElNSVQgKDMyICogMTAyNCAqIDEwMjR1bCkKJiM0MzsjZGVmaW5lIFJFQURfVElNRVMgNTAKJiM0MzsKJiM0MzsjZGVmaW5lIENHX0RJUiAmIzM0Oy9tZW1jZ19hc3luY19yZWNsYWltJiMzNDsKJiM0MzsjZGVmaW5lIENHX0hJR0hfRElSIENHX0RJUiAmIzM0Oy9oaWdoJiMzNDsKJiM0MzsjZGVmaW5lIENHX0xPV19ESVIgQ0dfRElSICYjMzQ7L2xvdyYjMzQ7CiYjNDM7CiYjNDM7I2RlZmluZSBDSEVDS19QRVJJT0RfTlMgKDIgKiAxMDAwICogMTAwMHVsbCkKJiM0MzsjZGVmaW5lIEVWRU5UX0RFTFRBX1RIUkVTSE9MRCAxCiYjNDM7CiYjNDM7LyoKJiM0MzsgKiBUaGUgd29ya2xvYWQgZmlsZXMgbXVzdCBzaXQgb24gYSByZWd1bGFyIGZpbGVzeXN0ZW06IHdpdGggc3dhcAomIzQzOyAqIGRpc2FibGVkIGZvciB0aGUgY2dyb3VwLCB0bXBmcy9yYW1mcyBwYWdlcyBhcmUgdW5ldmljdGFibGUgYW5kIHdvdWxkCiYjNDM7ICogT09NIHRoZSBjZ3JvdXAgaW5zdGVhZCBvZiBleGVyY2lzaW5nIHJlY2xhaW07IHRoZXkgYXJlIGFsc28gY2hhcmdlZAomIzQzOyAqIGFzIGFub255bW91cyBtZW1vcnksIHNvIHRoZXkgbmV2ZXIgcmFpc2UgdGhlIFdPUktJTkdTRVRfUkVGQVVMVF9GSUxFCiYjNDM7ICogZXZlbnRzIHRoZSBCUEYgcHJvZ3JhbSBtb25pdG9ycy4gRmFsbCBiYWNrIHRvIHRoZSBjdXJyZW50IGRpcmVjdG9yeQomIzQzOyAqIHdoZW4gL3RtcCBpcyBiYWNrZWQgYnkgc3VjaCBhIGZpbGVzeXN0ZW0uCiYjNDM7ICovCiYjNDM7c3RhdGljIGNvbnN0IGNoYXIgKndvcmtsb2FkX2ZpbGVzX2Rpcih2b2lkKQomIzQzO3sKJiM0MzsJc3RydWN0IHN0YXRmcyBzdDsKJiM0MzsKJiM0MzsJaWYgKCFzdGF0ZnMoJiMzNDsvdG1wJiMzNDssICZhbXA7c3QpICZhbXA7JmFtcDsKJiM0MzsJICAgIChzdC5mX3R5cGUgPT0gVE1QRlNfTUFHSUMgfHwgc3QuZl90eXBlID09IFJBTUZTX01BR0lDKSkKJiM0MzsJCXJldHVybiAmIzM0Oy4mIzM0OzsKJiM0MzsJcmV0dXJuICYjMzQ7L3RtcCYjMzQ7OwomIzQzO30KJiM0MzsKJiM0MzsvKgomIzQzOyAqIFRoZSB3b3JrbG9hZCBjaGlsZHJlbiBydW4gYWZ0ZXIgdGVzdF9wcm9ncyBoaWphY2tlZCBzdGRpbywgc28KJiM0MzsgKiBhbnl0aGluZyB0aGV5IHByaW50IGlzIGxvc3Qgd2l0aCB0aGVpciBwcml2YXRlIGNvcHkgb2YgdGhlIGhpamFja2VkCiYjNDM7ICogYnVmZmVyLiBUaGUgZXhpdCBzdGF0dXMgaXMgdGhlIG9ubHkgZGlhZ25vc3RpY3MgY2hhbm5lbCB0aGF0IHJlYWNoZXMKJiM0MzsgKiB0aGUgcGFyZW50LCBzbyBlYWNoIGZhaWxpbmcgc3RlcCBnZXRzIGl0cyBvd24gY29kZS4KJiM0MzsgKi8KJiM0MztlbnVtIGNoaWxkX2V4aXRfY29kZSB7CiYjNDM7CUNISUxEX0VYSVRfT0sgPSAwLAomIzQzOwlDSElMRF9FWElUX0pPSU5fQ0dST1VQLAomIzQzOwlDSElMRF9FWElUX1dSSVRFX0ZJTEUsCiYjNDM7CUNISUxEX0VYSVRfUkVBRF9GSUxFLAomIzQzOwlDSElMRF9FWElUX1RJTUVfRklMRSwKJiM0Mzt9OwomIzQzOwomIzQzO3N0YXRpYyBjb25zdCBjaGFyICpjaGlsZF9leGl0X3N0cihpbnQgY29kZSkKJiM0Mzt7CiYjNDM7CXN3aXRjaCAoY29kZSkgewomIzQzOwljYXNlIENISUxEX0VYSVRfT0s6CiYjNDM7CQlyZXR1cm4gJiMzNDtzdWNjZXNzJiMzNDs7CiYjNDM7CWNhc2UgQ0hJTERfRVhJVF9KT0lOX0NHUk9VUDoKJiM0MzsJCXJldHVybiAmIzM0O2pvaW4gY2dyb3VwJiMzNDs7CiYjNDM7CWNhc2UgQ0hJTERfRVhJVF9XUklURV9GSUxFOgomIzQzOwkJcmV0dXJuICYjMzQ7d3JpdGUgZGF0YSBmaWxlJiMzNDs7CiYjNDM7CWNhc2UgQ0hJTERfRVhJVF9SRUFEX0ZJTEU6CiYjNDM7CQlyZXR1cm4gJiMzNDtyZWFkIGRhdGEgZmlsZSYjMzQ7OwomIzQzOwljYXNlIENISUxEX0VYSVRfVElNRV9GSUxFOgomIzQzOwkJcmV0dXJuICYjMzQ7d3JpdGUgdGltZSBmaWxlJiMzNDs7CiYjNDM7CWRlZmF1bHQ6CiYjNDM7CQlyZXR1cm4gJiMzNDt1bmtub3duJiMzNDs7CiYjNDM7CX0KJiM0Mzt9CiYjNDM7CiYjNDM7c3RhdGljIGludCBzZXR1cF9oaWdoX2xvd19jZ3JvdXBzKHU2NCAqaGlnaF9jZ3JvdXBfaWQsIHU2NCAqbG93X2Nncm91cF9pZCkKJiM0Mzt7CiYjNDM7CWludCByZXQ7CiYjNDM7CWNoYXIgbGltaXRfYnVmWzIwXTsKJiM0MzsKJiM0MzsJcmV0ID0gc2V0dXBfY2dyb3VwX2Vudmlyb25tZW50KCk7CiYjNDM7CWlmICghQVNTRVJUX09LKHJldCwgJiMzNDtzZXR1cF9jZ3JvdXBfZW52aXJvbm1lbnQmIzM0OykpCiYjNDM7CQlnb3RvIGNsZWFudXA7CiYjNDM7CiYjNDM7CXJldCA9IGNyZWF0ZV9hbmRfZ2V0X2Nncm91cChDR19ESVIpOwomIzQzOwlpZiAoIUFTU0VSVF9HRShyZXQsIDAsICYjMzQ7Y3JlYXRlX2FuZF9nZXRfY2dyb3VwICYjMzQ7IENHX0RJUikpCiYjNDM7CQlnb3RvIGNsZWFudXA7CiYjNDM7CWNsb3NlKHJldCk7CiYjNDM7CiYjNDM7CXJldCA9IGVuYWJsZV9jb250cm9sbGVycyhDR19ESVIsICYjMzQ7bWVtb3J5JiMzNDspOwomIzQzOwlpZiAoIUFTU0VSVF9PSyhyZXQsICYjMzQ7ZW5hYmxlX2NvbnRyb2xsZXJzJiMzNDspKQomIzQzOwkJZ290byBjbGVhbnVwOwomIzQzOwomIzQzOwlzbnByaW50ZihsaW1pdF9idWYsIHNpemVvZihsaW1pdF9idWYpLCAmIzM0OyVsdSYjMzQ7LCBDR19MSU1JVCk7CiYjNDM7CXJldCA9IHdyaXRlX2Nncm91cF9maWxlKENHX0RJUiwgJiMzNDttZW1vcnkubWF4JiMzNDssIGxpbWl0X2J1Zik7CiYjNDM7CWlmICghQVNTRVJUX09LKHJldCwgJiMzNDt3cml0ZV9jZ3JvdXBfZmlsZSBtZW1vcnkubWF4JiMzNDspKQomIzQzOwkJZ290byBjbGVhbnVwOwomIzQzOwomIzQzOwkvKgomIzQzOwkgKiBLZWVwIHRoZSB3b3JrbG9hZHMgZnJvbSBzd2FwcGluZyBvdXQuIFdpdGggQ09ORklHX1NXQVA9biB0aGUKJiM0MzsJICogbWVtb3J5LnN3YXAubWF4IGZpbGUgZG9lcyBub3QgZXhpc3QsIGFuZCBubyBzd2FwIGNhbiBoYXBwZW4KJiM0MzsJICogYW55d2F5LCBzbyBza2lwIHRoZSB3cml0ZS4KJiM0MzsJICovCiYjNDM7CWlmICghYWNjZXNzKCYjMzQ7L3Byb2Mvc3dhcHMmIzM0OywgRl9PSykpIHsKJiM0MzsJCXJldCA9IHdyaXRlX2Nncm91cF9maWxlKENHX0RJUiwgJiMzNDttZW1vcnkuc3dhcC5tYXgmIzM0OywgJiMzNDswJiMzNDspOwomIzQzOwkJaWYgKCFBU1NFUlRfT0socmV0LCAmIzM0O3dyaXRlX2Nncm91cF9maWxlIG1lbW9yeS5zd2FwLm1heCYjMzQ7KSkKJiM0MzsJCQlnb3RvIGNsZWFudXA7CiYjNDM7CX0KJiM0MzsKJiM0MzsJcmV0ID0gY3JlYXRlX2FuZF9nZXRfY2dyb3VwKENHX0hJR0hfRElSKTsKJiM0MzsJaWYgKCFBU1NFUlRfR0UocmV0LCAwLCAmIzM0O2NyZWF0ZV9hbmRfZ2V0X2Nncm91cCAmIzM0OyBDR19ISUdIX0RJUikpCiYjNDM7CQlnb3RvIGNsZWFudXA7CiYjNDM7CWNsb3NlKHJldCk7CiYjNDM7CiYjNDM7CSpoaWdoX2Nncm91cF9pZCA9IGdldF9jZ3JvdXBfaWQoQ0dfSElHSF9ESVIpOwomIzQzOwlpZiAoIUFTU0VSVF9HVCgqaGlnaF9jZ3JvdXBfaWQsIDAsICYjMzQ7Z2V0X2Nncm91cF9pZCYjMzQ7KSkKJiM0MzsJCWdvdG8gY2xlYW51cDsKJiM0MzsKJiM0MzsJcmV0ID0gY3JlYXRlX2FuZF9nZXRfY2dyb3VwKENHX0xPV19ESVIpOwomIzQzOwlpZiAoIUFTU0VSVF9HRShyZXQsIDAsICYjMzQ7Y3JlYXRlX2FuZF9nZXRfY2dyb3VwICYjMzQ7IENHX0xPV19ESVIpKQomIzQzOwkJZ290byBjbGVhbnVwOwomIzQzOwljbG9zZShyZXQpOwomIzQzOwomIzQzOwkqbG93X2Nncm91cF9pZCA9IGdldF9jZ3JvdXBfaWQoQ0dfTE9XX0RJUik7CiYjNDM7CWlmICghQVNTRVJUX0dUKCpsb3dfY2dyb3VwX2lkLCAwLCAmIzM0O2dldF9jZ3JvdXBfaWQmIzM0OykpCiYjNDM7CQlnb3RvIGNsZWFudXA7CiYjNDM7CiYjNDM7CXJldHVybiAwOwomIzQzOwomIzQzO2NsZWFudXA6CiYjNDM7CWNsZWFudXBfY2dyb3VwX2Vudmlyb25tZW50KCk7CiYjNDM7CXJldHVybiAtMTsKJiM0Mzt9CiYjNDM7CiYjNDM7c3RhdGljIGludCB3cml0ZV9maWxlKGNvbnN0IGNoYXIgKmZpbGVuYW1lKQomIzQzO3sKJiM0MzsJaW50IHJldCA9IC0xOwomIzQzOwlzaXplX3Qgd3JpdHRlbiA9IDA7CiYjNDM7CWNoYXIgKmJ1ZmZlcjsKJiM0MzsJRklMRSAqZnA7CiYjNDM7CiYjNDM7CWZwID0gZm9wZW4oZmlsZW5hbWUsICYjMzQ7d2ImIzM0Oyk7CiYjNDM7CWlmICghZnApCiYjNDM7CQlnb3RvIG91dDsKJiM0MzsKJiM0MzsJYnVmZmVyID0gbWFsbG9jKEJVRkZFUl9TSVpFKTsKJiM0MzsJaWYgKCFidWZmZXIpCiYjNDM7CQlnb3RvIGNsZWFudXBfZnA7CiYjNDM7CiYjNDM7CW1lbXNldChidWZmZXIsICYjMzk7QSYjMzk7LCBCVUZGRVJfU0laRSk7CiYjNDM7CiYjNDM7CXdoaWxlICh3cml0dGVuICZsdDsgRklMRV9TSVpFKSB7CiYjNDM7CQlzaXplX3QgdG9fd3JpdGUgPSBGSUxFX1NJWkUgLSB3cml0dGVuICZsdDsgQlVGRkVSX1NJWkUgPwomIzQzOwkJCQkgIEZJTEVfU0laRSAtIHdyaXR0ZW4gOiBCVUZGRVJfU0laRTsKJiM0MzsKJiM0MzsJCWlmIChmd3JpdGUoYnVmZmVyLCAxLCB0b193cml0ZSwgZnApICE9IHRvX3dyaXRlKQomIzQzOwkJCWdvdG8gY2xlYW51cDsKJiM0MzsJCXdyaXR0ZW4gJiM0Mzs9IHRvX3dyaXRlOwomIzQzOwl9CiYjNDM7CiYjNDM7CXJldCA9IDA7CiYjNDM7Y2xlYW51cDoKJiM0MzsJZnJlZShidWZmZXIpOwomIzQzO2NsZWFudXBfZnA6CiYjNDM7CWZjbG9zZShmcCk7CiYjNDM7b3V0OgomIzQzOwlyZXR1cm4gcmV0OwomIzQzO30KJiM0MzsKJiM0MztzdGF0aWMgaW50IHJlYWRfZmlsZShjb25zdCBjaGFyICpmaWxlbmFtZSwgaW50IGl0ZXJhdGlvbnMpCiYjNDM7ewomIzQzOwlpbnQgcmV0ID0gLTE7CiYjNDM7CWxvbmcgcGFnZV9zaXplID0gc3lzY29uZihfU0NfUEFHRVNJWkUpOwomIzQzOwljaGFyICptYXA7CiYjNDM7CXNpemVfdCBpOwomIzQzOwlpbnQgZmQ7CiYjNDM7CXN0cnVjdCBzdGF0IHNiOwomIzQzOwomIzQzOwlmZCA9IG9wZW4oZmlsZW5hbWUsIE9fUkRPTkxZKTsKJiM0MzsJaWYgKGZkID09IC0xKQomIzQzOwkJZ290byBvdXQ7CiYjNDM7CiYjNDM7CWlmIChmc3RhdChmZCwgJmFtcDtzYikgPT0gLTEpCiYjNDM7CQlnb3RvIGNsZWFudXBfZmQ7CiYjNDM7CiYjNDM7CWlmIChzYi5zdF9zaXplICE9IEZJTEVfU0laRSkgewomIzQzOwkJZnByaW50ZihzdGRlcnIsICYjMzQ7RmlsZSBzaXplIG1pc21hdGNoOiBleHBlY3RlZCAlbHUsIGdvdCAlbHVcbiYjMzQ7LAomIzQzOwkJCSh1bnNpZ25lZCBsb25nKUZJTEVfU0laRSwgKHVuc2lnbmVkIGxvbmcpc2Iuc3Rfc2l6ZSk7CiYjNDM7CQlnb3RvIGNsZWFudXBfZmQ7CiYjNDM7CX0KJiM0MzsKJiM0MzsJbWFwID0gbW1hcChOVUxMLCBGSUxFX1NJWkUsIFBST1RfUkVBRCwgTUFQX1BSSVZBVEUsIGZkLCAwKTsKJiM0MzsJaWYgKG1hcCA9PSBNQVBfRkFJTEVEKQomIzQzOwkJZ290byBjbGVhbnVwX2ZkOwomIzQzOwomIzQzOwlmb3IgKGludCBpdGVyID0gMDsgaXRlciAmbHQ7IGl0ZXJhdGlvbnM7IGl0ZXImIzQzOyYjNDM7KSB7CiYjNDM7CQlmb3IgKGkgPSAwOyBpICZsdDsgRklMRV9TSVpFOyBpICYjNDM7PSBwYWdlX3NpemUpIHsKJiM0MzsJCQkvKiBhY2Nlc3MgYSBieXRlIHRvIHRyaWdnZXIgcGFnZSBmYXVsdCAqLwomIzQzOwkJCXZvbGF0aWxlIGNoYXIgdiA9IG1hcFtpXTsKJiM0MzsJCQkodm9pZCl2OwomIzQzOwkJfQomIzQzOwl9CiYjNDM7CiYjNDM7CWlmIChtdW5tYXAobWFwLCBGSUxFX1NJWkUpID09IC0xKQomIzQzOwkJZ290byBjbGVhbnVwX2ZkOwomIzQzOwomIzQzOwlyZXQgPSAwOwomIzQzOwomIzQzO2NsZWFudXBfZmQ6CiYjNDM7CWNsb3NlKGZkKTsKJiM0MztvdXQ6CiYjNDM7CXJldHVybiByZXQ7CiYjNDM7fQomIzQzOwomIzQzO3N0YXRpYyBpbnQgcmVhbF90ZXN0X2NoaWxkX3dvcmsoY29uc3QgY2hhciAqY2dyb3VwX3BhdGgsIGNoYXIgKmRhdGFfZmlsZW5hbWUsCiYjNDM7CQkJCWNoYXIgKnRpbWVfZmlsZW5hbWUsIGludCByZWFkX3RpbWVzKQomIzQzO3sKJiM0MzsJc3RydWN0IHRpbWVzcGVjIHN0YXJ0LCBlbmQ7CiYjNDM7CWRvdWJsZSBlbGFwc2VkOwomIzQzOwlGSUxFICpmcDsKJiM0MzsKJiM0MzsJaWYgKGpvaW5fcGFyZW50X2Nncm91cChjZ3JvdXBfcGF0aCkpCiYjNDM7CQlyZXR1cm4gQ0hJTERfRVhJVF9KT0lOX0NHUk9VUDsKJiM0MzsKJiM0MzsJY2xvY2tfZ2V0dGltZShDTE9DS19NT05PVE9OSUMsICZhbXA7c3RhcnQpOwomIzQzOwomIzQzOwlpZiAod3JpdGVfZmlsZShkYXRhX2ZpbGVuYW1lKSkKJiM0MzsJCXJldHVybiBDSElMRF9FWElUX1dSSVRFX0ZJTEU7CiYjNDM7CiYjNDM7CWlmIChyZWFkX2ZpbGUoZGF0YV9maWxlbmFtZSwgcmVhZF90aW1lcykpCiYjNDM7CQlyZXR1cm4gQ0hJTERfRVhJVF9SRUFEX0ZJTEU7CiYjNDM7CiYjNDM7CWNsb2NrX2dldHRpbWUoQ0xPQ0tfTU9OT1RPTklDLCAmYW1wO2VuZCk7CiYjNDM7CiYjNDM7CWlmICghdGltZV9maWxlbmFtZSkKJiM0MzsJCXJldHVybiBDSElMRF9FWElUX09LOwomIzQzOwomIzQzOwllbGFwc2VkID0gKGVuZC50dl9zZWMgLSBzdGFydC50dl9zZWMpICYjNDM7CiYjNDM7CQkgIChlbmQudHZfbnNlYyAtIHN0YXJ0LnR2X25zZWMpIC8gMTAwMDAwMDAwMC4wOwomIzQzOwlwcmludGYoJiMzNDslLjZmXG4mIzM0OywgZWxhcHNlZCk7CiYjNDM7CiYjNDM7CWZwID0gZm9wZW4odGltZV9maWxlbmFtZSwgJiMzNDt3JiMzNDspOwomIzQzOwlpZiAoIWZwKQomIzQzOwkJcmV0dXJuIENISUxEX0VYSVRfVElNRV9GSUxFOwomIzQzOwlmcHJpbnRmKGZwLCAmIzM0OyUuNmYmIzM0OywgZWxhcHNlZCk7CiYjNDM7CWZjbG9zZShmcCk7CiYjNDM7CiYjNDM7CXJldHVybiBDSElMRF9FWElUX09LOwomIzQzO30KJiM0MzsKJiM0MztzdGF0aWMgaW50IGdldF90aW1lKGNoYXIgKnRpbWVfZmlsZW5hbWUsIGRvdWJsZSAqdGltZSkKJiM0Mzt7CiYjNDM7CWludCByZXQgPSAtMTsKJiM0MzsJRklMRSAqZnA7CiYjNDM7CWNoYXIgYnVmWzY0XTsKJiM0MzsKJiM0MzsJZnAgPSBmb3Blbih0aW1lX2ZpbGVuYW1lLCAmIzM0O3ImIzM0Oyk7CiYjNDM7CWlmICghQVNTRVJUX09LX1BUUihmcCwgJiMzNDtmb3BlbiYjMzQ7KSkKJiM0MzsJCWdvdG8gb3V0OwomIzQzOwomIzQzOwlpZiAoIUFTU0VSVF9PS19QVFIoZmdldHMoYnVmLCBzaXplb2YoYnVmKSwgZnApLCAmIzM0O2ZnZXRzJiMzNDspKQomIzQzOwkJZ290byBjbGVhbnVwOwomIzQzOwomIzQzOwlpZiAoc3NjYW5mKGJ1ZiwgJiMzNDslbGYmIzM0OywgdGltZSkgIT0gMSkgewomIzQzOwkJUFJJTlRfRkFJTCgmIzM0O3NzY2FuZiAlcyYjMzQ7LCBidWYpOwomIzQzOwkJZ290byBjbGVhbnVwOwomIzQzOwl9CiYjNDM7CiYjNDM7CXJldCA9IDA7CiYjNDM7Y2xlYW51cDoKJiM0MzsJZmNsb3NlKGZwKTsKJiM0MztvdXQ6CiYjNDM7CXJldHVybiByZXQ7CiYjNDM7fQomIzQzOwomIzQzO3N0YXRpYyBpbnQKJiM0MztydW5faGlnaF9sb3dfd29ya2xvYWQoZG91YmxlICpoaWdoX2VsYXBzZWQsIGRvdWJsZSAqbG93X2VsYXBzZWQsIGludCByZWFkX3RpbWVzKQomIzQzO3sKJiM0MzsJY2hhciBoaWdoX2RhdGFfZmlsZVtQQVRIX01BWF07CiYjNDM7CWNoYXIgbG93X2RhdGFfZmlsZVtQQVRIX01BWF07CiYjNDM7CWNoYXIgaGlnaF90aW1lX2ZpbGVbUEFUSF9NQVhdOwomIzQzOwljaGFyIGxvd190aW1lX2ZpbGVbUEFUSF9NQVhdOwomIzQzOwljb25zdCBjaGFyICpkaXIgPSB3b3JrbG9hZF9maWxlc19kaXIoKTsKJiM0MzsJcGlkX3QgaGlnaF9waWQgPSAtMSwgbG93X3BpZCA9IC0xOwomIzQzOwlpbnQgZmQsIHN0YXR1czsKJiM0MzsJaW50IHJldCA9IC0xOwomIzQzOwomIzQzOwlzbnByaW50ZihoaWdoX2RhdGFfZmlsZSwgc2l6ZW9mKGhpZ2hfZGF0YV9maWxlKSwKJiM0MzsJCSAmIzM0OyVzL21lbWNnX2FzeW5jX2hpZ2hfZGF0YV9YWFhYWFgmIzM0OywgZGlyKTsKJiM0MzsJc25wcmludGYobG93X2RhdGFfZmlsZSwgc2l6ZW9mKGxvd19kYXRhX2ZpbGUpLAomIzQzOwkJICYjMzQ7JXMvbWVtY2dfYXN5bmNfbG93X2RhdGFfWFhYWFhYJiMzNDssIGRpcik7CiYjNDM7CXNucHJpbnRmKGhpZ2hfdGltZV9maWxlLCBzaXplb2YoaGlnaF90aW1lX2ZpbGUpLAomIzQzOwkJICYjMzQ7JXMvbWVtY2dfYXN5bmNfaGlnaF90aW1lX1hYWFhYWCYjMzQ7LCBkaXIpOwomIzQzOwlzbnByaW50Zihsb3dfdGltZV9maWxlLCBzaXplb2YobG93X3RpbWVfZmlsZSksCiYjNDM7CQkgJiMzNDslcy9tZW1jZ19hc3luY19sb3dfdGltZV9YWFhYWFgmIzM0OywgZGlyKTsKJiM0MzsKJiM0MzsJZmQgPSBta3N0ZW1wKGhpZ2hfZGF0YV9maWxlKTsKJiM0MzsJaWYgKCFBU1NFUlRfR0UoZmQsIDAsICYjMzQ7bWtzdGVtcCYjMzQ7KSkKJiM0MzsJCWdvdG8gY2xlYW51cDsKJiM0MzsJY2xvc2UoZmQpOwomIzQzOwomIzQzOwlmZCA9IG1rc3RlbXAobG93X2RhdGFfZmlsZSk7CiYjNDM7CWlmICghQVNTRVJUX0dFKGZkLCAwLCAmIzM0O21rc3RlbXAmIzM0OykpCiYjNDM7CQlnb3RvIGNsZWFudXA7CiYjNDM7CWNsb3NlKGZkKTsKJiM0MzsKJiM0MzsJZmQgPSBta3N0ZW1wKGhpZ2hfdGltZV9maWxlKTsKJiM0MzsJaWYgKCFBU1NFUlRfR0UoZmQsIDAsICYjMzQ7bWtzdGVtcCYjMzQ7KSkKJiM0MzsJCWdvdG8gY2xlYW51cDsKJiM0MzsJY2xvc2UoZmQpOwomIzQzOwomIzQzOwlmZCA9IG1rc3RlbXAobG93X3RpbWVfZmlsZSk7CiYjNDM7CWlmICghQVNTRVJUX0dFKGZkLCAwLCAmIzM0O21rc3RlbXAmIzM0OykpCiYjNDM7CQlnb3RvIGNsZWFudXA7CiYjNDM7CWNsb3NlKGZkKTsKJiM0MzsKJiM0MzsJbG93X3BpZCA9IGZvcmsoKTsKJiM0MzsJaWYgKCFBU1NFUlRfR0UobG93X3BpZCwgMCwgJiMzNDtmb3JrIGxvdyYjMzQ7KSkKJiM0MzsJCWdvdG8gY2xlYW51cDsKJiM0MzsJaWYgKGxvd19waWQgPT0gMCkKJiM0MzsJCWV4aXQocmVhbF90ZXN0X2NoaWxkX3dvcmsoQ0dfTE9XX0RJUiwgbG93X2RhdGFfZmlsZSwKJiM0MzsJCQkJCSAgbG93X3RpbWVfZmlsZSwgcmVhZF90aW1lcykpOwomIzQzOwomIzQzOwloaWdoX3BpZCA9IGZvcmsoKTsKJiM0MzsJaWYgKCFBU1NFUlRfR0UoaGlnaF9waWQsIDAsICYjMzQ7Zm9yayBoaWdoJiMzNDspKQomIzQzOwkJZ290byBjbGVhbnVwOwomIzQzOwlpZiAoaGlnaF9waWQgPT0gMCkKJiM0MzsJCWV4aXQocmVhbF90ZXN0X2NoaWxkX3dvcmsoQ0dfSElHSF9ESVIsIGhpZ2hfZGF0YV9maWxlLAomIzQzOwkJCQkJICBoaWdoX3RpbWVfZmlsZSwgcmVhZF90aW1lcykpOwomIzQzOwomIzQzOwlsb3dfcGlkID0gd2FpdHBpZChsb3dfcGlkLCAmYW1wO3N0YXR1cywgMCk7CiYjNDM7CWlmICghQVNTRVJUX0dUKGxvd19waWQsIDAsICYjMzQ7bG93IHdhaXRwaWQmIzM0OykpCiYjNDM7CQlnb3RvIGNsZWFudXA7CiYjNDM7CS8qCiYjNDM7CSAqIFRoZSBjaGlsZCBoYXMgYmVlbiByZWFwZWQgYW5kIGl0cyBQSUQgY2FuIGFscmVhZHkgYmUgcmV1c2VkLAomIzQzOwkgKiBzbyBtYXJrIGl0IHRvIGtlZXAgY2xlYW51cCBmcm9tIHNpZ25hbGluZyBhbiB1bnJlbGF0ZWQgcHJvY2Vzcy4KJiM0MzsJICovCiYjNDM7CWxvd19waWQgPSAtMTsKJiM0MzsJaWYgKCFBU1NFUlRfVFJVRShXSUZFWElURUQoc3RhdHVzKSwgJiMzNDtsb3cgZXhpdGVkJiMzNDspKQomIzQzOwkJZ290byBjbGVhbnVwOwomIzQzOwlpZiAoV0VYSVRTVEFUVVMoc3RhdHVzKSAhPSBDSElMRF9FWElUX09LKSB7CiYjNDM7CQlQUklOVF9GQUlMKCYjMzQ7bG93IGNoaWxkIGZhaWxlZCBhdDogJXMgKGV4aXQgc3RhdHVzICVkKSYjMzQ7LAomIzQzOwkJCSAgIGNoaWxkX2V4aXRfc3RyKFdFWElUU1RBVFVTKHN0YXR1cykpLAomIzQzOwkJCSAgIFdFWElUU1RBVFVTKHN0YXR1cykpOwomIzQzOwkJZ290byBjbGVhbnVwOwomIzQzOwl9CiYjNDM7CiYjNDM7CWhpZ2hfcGlkID0gd2FpdHBpZChoaWdoX3BpZCwgJmFtcDtzdGF0dXMsIDApOwomIzQzOwlpZiAoIUFTU0VSVF9HVChoaWdoX3BpZCwgMCwgJiMzNDtoaWdoIHdhaXRwaWQmIzM0OykpCiYjNDM7CQlnb3RvIGNsZWFudXA7CiYjNDM7CS8qIFNhbWUgYXMgYWJvdmU6IHRoZSByZWFwZWQgUElEIG11c3Qgbm90IGJlIHNpZ25hbGVkIGFnYWluLiAqLwomIzQzOwloaWdoX3BpZCA9IC0xOwomIzQzOwlpZiAoIUFTU0VSVF9UUlVFKFdJRkVYSVRFRChzdGF0dXMpLCAmIzM0O2hpZ2ggZXhpdGVkJiMzNDspKQomIzQzOwkJZ290byBjbGVhbnVwOwomIzQzOwlpZiAoV0VYSVRTVEFUVVMoc3RhdHVzKSAhPSBDSElMRF9FWElUX09LKSB7CiYjNDM7CQlQUklOVF9GQUlMKCYjMzQ7aGlnaCBjaGlsZCBmYWlsZWQgYXQ6ICVzIChleGl0IHN0YXR1cyAlZCkmIzM0OywKJiM0MzsJCQkgICBjaGlsZF9leGl0X3N0cihXRVhJVFNUQVRVUyhzdGF0dXMpKSwKJiM0MzsJCQkgICBXRVhJVFNUQVRVUyhzdGF0dXMpKTsKJiM0MzsJCWdvdG8gY2xlYW51cDsKJiM0MzsJfQomIzQzOwomIzQzOwlpZiAoZ2V0X3RpbWUoaGlnaF90aW1lX2ZpbGUsIGhpZ2hfZWxhcHNlZCkpCiYjNDM7CQlnb3RvIGNsZWFudXA7CiYjNDM7CWlmIChnZXRfdGltZShsb3dfdGltZV9maWxlLCBsb3dfZWxhcHNlZCkpCiYjNDM7CQlnb3RvIGNsZWFudXA7CiYjNDM7CiYjNDM7CXJldCA9IDA7CiYjNDM7CiYjNDM7Y2xlYW51cDoKJiM0MzsJLyogT24gZmFpbHVyZSwgbWFrZSBzdXJlIG5vIGNoaWxkIHByb2Nlc3MgaXMgbGVmdCBiZWhpbmQgKi8KJiM0MzsJaWYgKHJldCkgewomIzQzOwkJaWYgKGhpZ2hfcGlkICZndDsgMCkgewomIzQzOwkJCWtpbGwoaGlnaF9waWQsIFNJR0tJTEwpOwomIzQzOwkJCSh2b2lkKXdhaXRwaWQoaGlnaF9waWQsIE5VTEwsIDApOwomIzQzOwkJfQomIzQzOwkJaWYgKGxvd19waWQgJmd0OyAwKSB7CiYjNDM7CQkJa2lsbChsb3dfcGlkLCBTSUdLSUxMKTsKJiM0MzsJCQkodm9pZCl3YWl0cGlkKGxvd19waWQsIE5VTEwsIDApOwomIzQzOwkJfQomIzQzOwl9CiYjNDM7CXVubGluayhsb3dfdGltZV9maWxlKTsKJiM0MzsJdW5saW5rKGhpZ2hfdGltZV9maWxlKTsKJiM0MzsJdW5saW5rKGxvd19kYXRhX2ZpbGUpOwomIzQzOwl1bmxpbmsoaGlnaF9kYXRhX2ZpbGUpOwomIzQzOwlyZXR1cm4gcmV0OwomIzQzO30KJiM0MzsKJiM0MztzdGF0aWMgaW50CiYjNDM7c2V0dXBfYnBmKHU2NCBoaWdoX2Nncm91cF9pZCwgdTY0IGxvd19jZ3JvdXBfaWQsCiYjNDM7CSAgc3RydWN0IG1lbWNnX2FzeW5jX3JlY2xhaW0gKipza2VsX3B0cikKJiM0Mzt7CiYjNDM7CXN0cnVjdCBtZW1jZ19hc3luY19yZWNsYWltICpza2VsOwomIzQzOwlzdHJ1Y3QgYnBmX2FyZ3NfcyBicGZfYXJncyA9IHsKJiM0MzsJCS5oaWdoX2Nncm91cF9pZCA9IGhpZ2hfY2dyb3VwX2lkLAomIzQzOwkJLmxvd19jZ3JvdXBfaWQgPSBsb3dfY2dyb3VwX2lkLAomIzQzOwkJLmV2ZW50X2RlbHRhX3RocmVzaG9sZCA9IEVWRU5UX0RFTFRBX1RIUkVTSE9MRCwKJiM0MzsJCS5jaGVja19ucyA9IENIRUNLX1BFUklPRF9OUywKJiM0MzsJfTsKJiM0MzsJTElCQlBGX09QVFMoYnBmX3Rlc3RfcnVuX29wdHMsIHJ1bl9vcHRzLAomIzQzOwkJLmN0eF9pbiA9ICZhbXA7YnBmX2FyZ3MsCiYjNDM7CQkuY3R4X3NpemVfaW4gPSBzaXplb2YoYnBmX2FyZ3MpKTsKJiM0MzsJaW50IHByb2dfaW5pdF9mZCwgZXJyOwomIzQzOwomIzQzOwlza2VsID0gbWVtY2dfYXN5bmNfcmVjbGFpbV9fb3Blbl9hbmRfbG9hZCgpOwomIzQzOwlpZiAoIUFTU0VSVF9PS19QVFIoc2tlbCwgJiMzNDttZW1jZ19hc3luY19yZWNsYWltX19vcGVuX2FuZF9sb2FkJiMzNDspKQomIzQzOwkJcmV0dXJuIC0xOwomIzQzOwomIzQzOwlwcm9nX2luaXRfZmQgPSBicGZfcHJvZ3JhbV9fZmQoc2tlbC0mZ3Q7cHJvZ3Mud3FfcHJvZ19pbml0KTsKJiM0MzsKJiM0MzsJZXJyID0gYnBmX3Byb2dfdGVzdF9ydW5fb3B0cyhwcm9nX2luaXRfZmQsICZhbXA7cnVuX29wdHMpOwomIzQzOwlpZiAoIUFTU0VSVF9PSyhlcnIsICYjMzQ7YnBmX3Byb2dfdGVzdF9ydW5fb3B0cyYjMzQ7KSkKJiM0MzsJCWdvdG8gZXJyb3Jfb3V0OwomIzQzOwlpZiAoIUFTU0VSVF9FUShydW5fb3B0cy5yZXR2YWwsIDAsICYjMzQ7cHJvZ19pbml0IHJldHZhbCYjMzQ7KSkKJiM0MzsJCWdvdG8gZXJyb3Jfb3V0OwomIzQzOwomIzQzOwkqc2tlbF9wdHIgPSBza2VsOwomIzQzOwlyZXR1cm4gMDsKJiM0MzsKJiM0MztlcnJvcl9vdXQ6CiYjNDM7CW1lbWNnX2FzeW5jX3JlY2xhaW1fX2Rlc3Ryb3koc2tlbCk7CiYjNDM7CXJldHVybiAtMTsKJiM0Mzt9CiYjNDM7CiYjNDM7dm9pZCB0ZXN0X21lbWNnX3dxX2FzeW5jX3JlY2xhaW0odm9pZCkKJiM0Mzt7CiYjNDM7CXU2NCBoaWdoX2Nncm91cF9pZCwgbG93X2Nncm91cF9pZDsKJiM0MzsJaW50IGVycjsKJiM0MzsJZG91YmxlIGhpZ2hfdGltZSA9IDAuMCwgbG93X3RpbWUgPSAwLjA7CiYjNDM7CXN0cnVjdCBtZW1jZ19hc3luY19yZWNsYWltICpza2VsID0gTlVMTDsKJiM0MzsKJiM0MzsJZXJyID0gc2V0dXBfaGlnaF9sb3dfY2dyb3VwcygmYW1wO2hpZ2hfY2dyb3VwX2lkLCAmYW1wO2xvd19jZ3JvdXBfaWQpOwomIzQzOwlpZiAoIUFTU0VSVF9PSyhlcnIsICYjMzQ7c2V0dXBfaGlnaF9sb3dfY2dyb3VwcyByZWNsYWltJiMzNDspKQomIzQzOwkJcmV0dXJuOwomIzQzOwomIzQzOwllcnIgPSBzZXR1cF9icGYoaGlnaF9jZ3JvdXBfaWQsIGxvd19jZ3JvdXBfaWQsICZhbXA7c2tlbCk7CiYjNDM7CWlmICghQVNTRVJUX09LKGVyciwgJiMzNDtzZXR1cF9icGYmIzM0OykpCiYjNDM7CQlnb3RvIG91dDsKJiM0MzsKJiM0MzsJZXJyID0gcnVuX2hpZ2hfbG93X3dvcmtsb2FkKCZhbXA7aGlnaF90aW1lLCAmYW1wO2xvd190aW1lLCBSRUFEX1RJTUVTKTsKJiM0MzsJaWYgKCFBU1NFUlRfT0soZXJyLCAmIzM0O3J1bl9oaWdoX2xvd193b3JrbG9hZCByZWNsYWltJiMzNDspKQomIzQzOwkJZ290byBvdXQ7CiYjNDM7CiYjNDM7CS8qCiYjNDM7CSAqIFRoZSB0aW1pbmcgY29tcGFyaXNvbiBiZWxvdyBhbG9uZSBjYW5ub3QgZGlzdGluZ3Vpc2ggYSB3b3JraW5nCiYjNDM7CSAqIHJlY2xhaW0gZnJvbSBhIG5vLW9wIG9uZSwgc28gcmVxdWlyZSB0aGF0IHRoZSBCUEYgcHJvZ3JhbQomIzQzOwkgKiBhY3R1YWxseSByZWNsYWltZWQgcGFnZXMgZnJvbSB0aGUgbG93IGNncm91cC4KJiM0MzsJICovCiYjNDM7CWlmICghQVNTRVJUX0dUKHNrZWwtJmd0O2Jzcy0mZ3Q7cmVjbGFpbV9jYWxscywgMCwgJiMzNDtyZWNsYWltX2NhbGxzJiMzNDspKQomIzQzOwkJZ290byBvdXQ7CiYjNDM7CWlmICghQVNTRVJUX0dUKHNrZWwtJmd0O2Jzcy0mZ3Q7cmVjbGFpbWVkX3BhZ2VzLCAwLCAmIzM0O3JlY2xhaW1lZF9wYWdlcyYjMzQ7KSkKJiM0MzsJCWdvdG8gb3V0OwomIzQzOwomIzQzOwlpZiAoaGlnaF90aW1lICZndDs9IGxvd190aW1lKQomIzQzOwkJUFJJTlRfRkFJTCgmIzM0O2hpZ2ggY2dyb3VwIG5vdCBpbXByb3ZlZCB3aXRoIGFzeW5jIHJlY2xhaW06IGhpZ2hfdGltZT0lZiBsb3dfdGltZT0lZiYjMzQ7LAomIzQzOwkJCSAgIGhpZ2hfdGltZSwgbG93X3RpbWUpOwomIzQzOwomIzQzO291dDoKJiM0MzsJaWYgKHNrZWwpCiYjNDM7CQltZW1jZ19hc3luY19yZWNsYWltX19kZXN0cm95KHNrZWwpOwomIzQzOwljbGVhbnVwX2Nncm91cF9lbnZpcm9ubWVudCgpOwomIzQzO30KZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9wcm9ncy9tZW1jZ19hc3luY19yZWNsYWltLmMgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ3MvbWVtY2dfYXN5bmNfcmVjbGFpbS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAwMDAuLjIyNWYwYmM2NjcxMTMKLS0tIC9kZXYvbnVsbAomIzQzOyYjNDM7JiM0MzsgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ3MvbWVtY2dfYXN5bmNfcmVjbGFpbS5jCkBAIC0wLDAgJiM0MzsxLDE4MCBAQAomIzQzOy8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4wCiYjNDM7CiYjNDM7I2luY2x1ZGUgJiMzNDt2bWxpbnV4LmgmIzM0OwomIzQzOyNpbmNsdWRlICYjMzQ7YnBmX2V4cGVyaW1lbnRhbC5oJiMzNDsKJiM0MzsjaW5jbHVkZSAmbHQ7YnBmL2JwZl9oZWxwZXJzLmgmZ3Q7CiYjNDM7I2luY2x1ZGUgJmx0O2JwZi9icGZfdHJhY2luZy5oJmd0OwomIzQzOyNpbmNsdWRlICZsdDticGYvYnBmX2NvcmVfcmVhZC5oJmd0OwomIzQzOwomIzQzOyNkZWZpbmUgQ0xPQ0tfTU9OT1RPTklDX0lECTEKJiM0MzsjZGVmaW5lIFBBR0VfU0laRQkJNDA5NlVMCiYjNDM7I2RlZmluZSBSRUNMQUlNX1NJWkUJCSgzMiAqIFBBR0VfU0laRSkKJiM0MzsjZGVmaW5lIFJFQ0xBSU1fTUFYX0lURVIJMzIKJiM0MzsKJiM0MztzdHJ1Y3QgYnBmX2FyZ3NfcyB7CiYjNDM7CXU2NCBoaWdoX2Nncm91cF9pZDsKJiM0MzsJdTY0IGxvd19jZ3JvdXBfaWQ7CiYjNDM7CXU2NCBldmVudF9kZWx0YV90aHJlc2hvbGQ7CiYjNDM7CXU2NCBjaGVja19uczsKJiM0Mzt9OwomIzQzOwomIzQzO3N0cnVjdCBjZ3JvdXBfbWVtY2cgewomIzQzOwlzdHJ1Y3QgY2dyb3VwICpjZ3JwOwomIzQzOwlzdHJ1Y3QgbWVtX2Nncm91cCAqbWVtY2c7CiYjNDM7fTsKJiM0MzsKJiM0MztzdGF0aWMgdTY0IHdxX2hpZ2hfY2dyb3VwX2lkOwomIzQzO3N0YXRpYyB1NjQgd3FfbG93X2Nncm91cF9pZDsKJiM0MzsKJiM0MzsvKiBTdGF0aXN0aWNzIGV4cG9zZWQgdG8gdXNlcnNwYWNlIHRocm91Z2ggLmJzcywgc28gdGhlIHRlc3QgY2FuIHZlcmlmeQomIzQzOyAqIHRoYXQgcmVjbGFpbSBhY3R1YWxseSBoYXBwZW5lZCBpbnN0ZWFkIG9mIHJlbHlpbmcgb24gdGltaW5nIGFsb25lLgomIzQzOyAqLwomIzQzO3U2NCByZWNsYWltX2NhbGxzOwomIzQzO3U2NCByZWNsYWltZWRfcGFnZXM7CiYjNDM7CiYjNDM7c3RhdGljIGludCBnZXRfY2dyb3VwX21lbWNnX2Zyb21faWQodTY0IGNncm91cF9pZCwgc3RydWN0IGNncm91cF9tZW1jZyAqY20pCiYjNDM7ewomIzQzOwljbS0mZ3Q7Y2dycCA9IGJwZl9jZ3JvdXBfZnJvbV9pZChjZ3JvdXBfaWQpOwomIzQzOwlpZiAoIWNtLSZndDtjZ3JwKQomIzQzOwkJcmV0dXJuIC0xOwomIzQzOwomIzQzOwljbS0mZ3Q7bWVtY2cgPSBicGZfZ2V0X21lbV9jZ3JvdXAoJmFtcDtjbS0mZ3Q7Y2dycC0mZ3Q7c2VsZik7CiYjNDM7CWlmICghY20tJmd0O21lbWNnKSB7CiYjNDM7CQlicGZfY2dyb3VwX3JlbGVhc2UoY20tJmd0O2NncnApOwomIzQzOwkJcmV0dXJuIC0xOwomIzQzOwl9CiYjNDM7CiYjNDM7CXJldHVybiAwOwomIzQzO30KJiM0MzsKJiM0MztzdGF0aWMgdm9pZCBwdXRfY2dyb3VwX21lbWNnKHN0cnVjdCBjZ3JvdXBfbWVtY2cgKmNtKQomIzQzO3sKJiM0MzsJYnBmX3B1dF9tZW1fY2dyb3VwKGNtLSZndDttZW1jZyk7CiYjNDM7CWJwZl9jZ3JvdXBfcmVsZWFzZShjbS0mZ3Q7Y2dycCk7CiYjNDM7fQomIzQzOwomIzQzO3N0YXRpYyBpbnQgZ2V0X2Nncm91cF9ldmVudCh1NjQgY2dyb3VwX2lkLCB1NjQgKnZhbCkKJiM0Mzt7CiYjNDM7CXN0cnVjdCBjZ3JvdXBfbWVtY2cgY207CiYjNDM7CiYjNDM7CWlmIChnZXRfY2dyb3VwX21lbWNnX2Zyb21faWQoY2dyb3VwX2lkLCAmYW1wO2NtKSkKJiM0MzsJCXJldHVybiAtMTsKJiM0MzsJYnBmX21lbV9jZ3JvdXBfZmx1c2hfc3RhdHMoY20ubWVtY2cpOwomIzQzOwkqdmFsID0gYnBmX21lbV9jZ3JvdXBfcGFnZV9zdGF0ZShjbS5tZW1jZywKJiM0MzsJCWJwZl9jb3JlX2VudW1fdmFsdWUoZW51bSBub2RlX3N0YXRfaXRlbSwKJiM0MzsJCQkJICAgIFdPUktJTkdTRVRfUkVGQVVMVF9GSUxFKSk7CiYjNDM7CXB1dF9jZ3JvdXBfbWVtY2coJmFtcDtjbSk7CiYjNDM7CiYjNDM7CXJldHVybiAwOwomIzQzO30KJiM0MzsKJiM0MztzdGF0aWMgYm9vbAomIzQzO3Nob3VsZF9yZWNsYWltX2Nncm91cCh1NjQgY2dyb3VwX2lkLCB1NjQgKnByZXZfZXZlbnQsIHU2NCBldmVudF9kZWx0YV90aHJlc2hvbGQpCiYjNDM7ewomIzQzOwl1NjQgY3VyLCBkZWx0YTsKJiM0MzsKJiM0MzsJaWYgKGdldF9jZ3JvdXBfZXZlbnQoY2dyb3VwX2lkLCAmYW1wO2N1cikpCiYjNDM7CQlyZXR1cm4gZmFsc2U7CiYjNDM7CiYjNDM7CWRlbHRhID0gY3VyIC0gKnByZXZfZXZlbnQ7CiYjNDM7CSpwcmV2X2V2ZW50ID0gY3VyOwomIzQzOwomIzQzOwlyZXR1cm4gZGVsdGEgJmd0Oz0gZXZlbnRfZGVsdGFfdGhyZXNob2xkOwomIzQzO30KJiM0MzsKJiM0MztzdGF0aWMgaW50IHJlY2xhaW1fY2dyb3VwKHU2NCBjZ3JvdXBfaWQpCiYjNDM7ewomIzQzOwlzdHJ1Y3QgY2dyb3VwX21lbWNnIGNtOwomIzQzOwlpbnQgaTsKJiM0MzsKJiM0MzsJaWYgKGdldF9jZ3JvdXBfbWVtY2dfZnJvbV9pZChjZ3JvdXBfaWQsICZhbXA7Y20pKQomIzQzOwkJcmV0dXJuIDA7CiYjNDM7CiYjNDM7CXJlY2xhaW1fY2FsbHMmIzQzOyYjNDM7OwomIzQzOwlmb3IgKGkgPSAwOyBpICZsdDsgUkVDTEFJTV9NQVhfSVRFUjsgaSYjNDM7JiM0MzspIHsKJiM0MzsJCXU2NCBuciA9IGJwZl9wcm9hY3RpdmVfcmVjbGFpbShjbS5tZW1jZywgUkVDTEFJTV9TSVpFKTsKJiM0MzsKJiM0MzsJCWlmICghbnIpCiYjNDM7CQkJYnJlYWs7CiYjNDM7CQlyZWNsYWltZWRfcGFnZXMgJiM0Mzs9IG5yOwomIzQzOwl9CiYjNDM7CiYjNDM7CXB1dF9jZ3JvdXBfbWVtY2coJmFtcDtjbSk7CiYjNDM7CiYjNDM7CXJldHVybiAwOwomIzQzO30KJiM0MzsKJiM0MztzdHJ1Y3Qgd3FfZWxlbSB7CiYjNDM7CXN0cnVjdCBicGZfdGltZXIgdGltZXI7CiYjNDM7CXN0cnVjdCBicGZfd3Egd29yazsKJiM0MzsJdTY0IHByZXZfZXZlbnQ7CiYjNDM7CXU2NCBldmVudF9kZWx0YV90aHJlc2hvbGQ7CiYjNDM7CXU2NCBjaGVja19uczsKJiM0Mzt9OwomIzQzOwomIzQzO3N0cnVjdCB7CiYjNDM7CV9fdWludCh0eXBlLCBCUEZfTUFQX1RZUEVfQVJSQVkpOwomIzQzOwlfX3VpbnQobWF4X2VudHJpZXMsIDEpOwomIzQzOwlfX3R5cGUoa2V5LCBfX3UzMik7CiYjNDM7CV9fdHlwZSh2YWx1ZSwgc3RydWN0IHdxX2VsZW0pOwomIzQzO30gd3FfbWFwIFNFQygmIzM0Oy5tYXBzJiMzNDspOwomIzQzOwomIzQzO3N0YXRpYyBpbnQgYXN5bmNfZnJlZSh2b2lkICptYXAsIGludCAqa2V5LCB2b2lkICp2YWx1ZSkKJiM0Mzt7CiYjNDM7CXN0cnVjdCB3cV9lbGVtICplbGVtID0gdmFsdWU7CiYjNDM7CiYjNDM7CWlmIChzaG91bGRfcmVjbGFpbV9jZ3JvdXAod3FfaGlnaF9jZ3JvdXBfaWQsICZhbXA7ZWxlbS0mZ3Q7cHJldl9ldmVudCwKJiM0MzsJCWVsZW0tJmd0O2V2ZW50X2RlbHRhX3RocmVzaG9sZCkpIHsKJiM0MzsJCXJlY2xhaW1fY2dyb3VwKHdxX2xvd19jZ3JvdXBfaWQpOwomIzQzOwkJYnBmX3dxX3N0YXJ0KCZhbXA7ZWxlbS0mZ3Q7d29yaywgMCk7CiYjNDM7CX0KJiM0MzsKJiM0MzsJcmV0dXJuIDA7CiYjNDM7fQomIzQzOwomIzQzO3N0YXRpYyBpbnQgd3FfdGltZXJfY2Iodm9pZCAqbWFwLCBpbnQgKmtleSwgc3RydWN0IHdxX2VsZW0gKmVsZW0pCiYjNDM7ewomIzQzOwlicGZfd3Ffc3RhcnQoJmFtcDtlbGVtLSZndDt3b3JrLCAwKTsKJiM0MzsJYnBmX3RpbWVyX3N0YXJ0KCZhbXA7ZWxlbS0mZ3Q7dGltZXIsIGVsZW0tJmd0O2NoZWNrX25zLCAwKTsKJiM0MzsKJiM0MzsJcmV0dXJuIDA7CiYjNDM7fQomIzQzOwomIzQzO1NFQygmIzM0O3N5c2NhbGwmIzM0OykKJiM0MztpbnQgd3FfcHJvZ19pbml0KHN0cnVjdCBicGZfYXJnc19zICpjdHgpCiYjNDM7ewomIzQzOwlzdHJ1Y3Qgd3FfZWxlbSAqZWxlbTsKJiM0MzsJX191MzIga2V5ID0gMDsKJiM0MzsJaW50IHJldDsKJiM0MzsKJiM0MzsJZWxlbSA9IGJwZl9tYXBfbG9va3VwX2VsZW0oJmFtcDt3cV9tYXAsICZhbXA7a2V5KTsKJiM0MzsJaWYgKCFlbGVtKQomIzQzOwkJcmV0dXJuIC0xOwomIzQzOwomIzQzOwlyZXQgPSBicGZfd3FfaW5pdCgmYW1wO2VsZW0tJmd0O3dvcmssICZhbXA7d3FfbWFwLCAwKTsKJiM0MzsJaWYgKHJldCkKJiM0MzsJCXJldHVybiByZXQ7CiYjNDM7CiYjNDM7CXJldCA9IGJwZl93cV9zZXRfY2FsbGJhY2soJmFtcDtlbGVtLSZndDt3b3JrLCBhc3luY19mcmVlLCAwKTsKJiM0MzsJaWYgKHJldCkKJiM0MzsJCXJldHVybiByZXQ7CiYjNDM7CiYjNDM7CXJldCA9IGJwZl90aW1lcl9pbml0KCZhbXA7ZWxlbS0mZ3Q7dGltZXIsICZhbXA7d3FfbWFwLCBDTE9DS19NT05PVE9OSUNfSUQpOwomIzQzOwlpZiAocmV0KQomIzQzOwkJcmV0dXJuIHJldDsKJiM0MzsKJiM0MzsJcmV0ID0gYnBmX3RpbWVyX3NldF9jYWxsYmFjaygmYW1wO2VsZW0tJmd0O3RpbWVyLCB3cV90aW1lcl9jYik7CiYjNDM7CWlmIChyZXQpCiYjNDM7CQlyZXR1cm4gcmV0OwomIzQzOwomIzQzOwllbGVtLSZndDtwcmV2X2V2ZW50ID0gMDsKJiM0MzsJZWxlbS0mZ3Q7ZXZlbnRfZGVsdGFfdGhyZXNob2xkID0gY3R4LSZndDtldmVudF9kZWx0YV90aHJlc2hvbGQ7CiYjNDM7CWVsZW0tJmd0O2NoZWNrX25zID0gY3R4LSZndDtjaGVja19uczsKJiM0MzsKJiM0MzsJd3FfaGlnaF9jZ3JvdXBfaWQgPSBjdHgtJmd0O2hpZ2hfY2dyb3VwX2lkOwomIzQzOwl3cV9sb3dfY2dyb3VwX2lkID0gY3R4LSZndDtsb3dfY2dyb3VwX2lkOwomIzQzOwomIzQzOwlyZXR1cm4gYnBmX3RpbWVyX3N0YXJ0KCZhbXA7ZWxlbS0mZ3Q7dGltZXIsIGVsZW0tJmd0O2NoZWNrX25zLCAwKTsKJiM0Mzt9CiYjNDM7CiYjNDM7Y2hhciBMSUNFTlNFW10gU0VDKCYjMzQ7bGljZW5zZSYjMzQ7KSA9ICYjMzQ7R1BMJiMzNDs7CjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjMvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzE5IDA3OjQ0PC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy4xLXByby1wcmV2aWV3PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDEwNTA4CgkJCQkJCQlvdXRwdXQ6IDIxCgkJCQkJCQl0aG91Z2h0czogMjQ0CgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4qKk15IEluaXRpYWwgQXNzZXNzbWVudCBvZiB0aGUgQlBGIE1lbW9yeSBSZWNsYW1hdGlvbiBQYXRjaCoqCgpPa2F5LCBzbyB3ZSYjMzk7dmUgZ290IGEgbmV3IHBhdGNoIGludHJvZHVjaW5nIHR3byBCUEYga2Z1bmNzOiBgYnBmX3Byb2FjdGl2ZV9yZWNsYWltYCBhbmQgYGJwZl9wcm9hY3RpdmVfcmVjbGFpbV9zd2FwcGluZXNzYC4gVGhlIHdob2xlIHBvaW50IHNlZW1zIHRvIGJlIGdpdmluZyBCUEYgcHJvZ3JhbXMgdGhlIGFiaWxpdHkgdG8gcHJvYWN0aXZlbHkgdHJpZ2dlciBtZW1vcnkgcmVjbGFtYXRpb24gd2l0aGluIGEgbWVtb3J5IGNncm91cC4gVGhhdCYjMzk7cyBhIHBvd2VyZnVsIHRvb2wsIGFuZCB0aGUgaW1wbGVtZW50YXRpb24mIzM5O3MgaW4gYG1tL2JwZl9tZW1jb250cm9sLmNgLiBFc3NlbnRpYWxseSwgdGhlc2Uga2Z1bmNzIGFyZSB3cmFwcGVycyBhcm91bmQgYGJwZl9wcm9hY3RpdmVfcmVjbGFpbV9wYWdlc2AsIHdoaWNoIGluIHR1cm4gY2FsbHMgYHRyeV90b19mcmVlX21lbV9jZ3JvdXBfcGFnZXNgLgoKVGhlIGltcG9ydGFudCBxdWVzdGlvbiBpcywgYXJlIHRoZXNlIGtmdW5jcyBleHBvc2VkIHRvIHVzZXJzcGFjZT8gU2luY2UgdGhleSYjMzk7cmUgQlBGIGtmdW5jcywgdGhlIGFuc3dlciBpcyAqeWVzKi4gQSBCUEYgcHJvZ3JhbSBjYW4gZGlyZWN0bHkgaW52b2tlIHRoZXNlLCB3aGljaCBpcyBhIHNpZ25pZmljYW50IGFyY2hpdGVjdHVyYWwgZGVjaXNpb24uIE15IGd1dCB0ZWxscyBtZSB0aGlzIGlzIHNvbWV0aGluZyB3ZSBhYnNvbHV0ZWx5ICpuZWVkKiB0byBmdXp6IGFnZ3Jlc3NpdmVseS4gVGhlIHBvdGVudGlhbCBhdHRhY2sgc3VyZmFjZSBoZXJlIGlzIGNvbnNpZGVyYWJsZSwgYW5kIGV2ZW4gc3VidGxlIGJ1Z3MgY291bGQgbGVhZCB0byBzZXJpb3VzIG1lbW9yeSBtYW5hZ2VtZW50IGlzc3VlcyBvciBldmVuIHByaXZpbGVnZSBlc2NhbGF0aW9uLgoKTm93LCBsZXQmIzM5O3MgZGl2ZSBkZWVwZXIgaW50byB0aGUgaW1wbGVtZW50YXRpb24gb2YgYGJwZl9wcm9hY3RpdmVfcmVjbGFpbWAgYW5kIGBicGZfcHJvYWN0aXZlX3JlY2xhaW1fc3dhcHBpbmVzc2AuIEkgbmVlZCB0byB1bmRlcnN0YW5kIHRoZSBzcGVjaWZpY3Mgb2YgaG93IHRoZXkgaW50ZXJhY3Qgd2l0aCB0aGUgY29yZSBtZW1vcnkgbWFuYWdlbWVudCBzdWJzeXN0ZW1zLiBBbmQgSSBzaG91bGQgY2hlY2sgdGhhdCBgbW0vYnBmX21lbWNvbnRyb2wuY2AgaXMgY29tcGlsZWQgYmFzZWQgb24gdGhlIHJpZ2h0IGNvbmZpZ3VyYXRpb24gb3B0aW9ucywgd2hpY2ggbWVhbnMgSSBzaG91bGQgY2hlY2sgYG1tL01ha2VmaWxlYC4gV2XigJlyZSBnb2luZyB0byBuZWVkIGJvdGggYENPTkZJR19NRU1DR2AgYW5kIGBDT05GSUdfQlBGX1NZU0NBTExgIHRvIGJlIGVuYWJsZWQsIGFzIGV4cGVjdGVkLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjQvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzE5IDA3OjQ0PC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+Z3JlcHBlcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RXhwcmVzc2lvbiYjMzQ7OiAmIzM0O2JwZl9tZW1jb250cm9sLm8mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7T3V0cHV0JiMzNDs6ICYjMzQ7bW0vTWFrZWZpbGU9MTA2PWlmZGVmIENPTkZJR19CUEZfU1lTQ0FMTFxubW0vTWFrZWZpbGU6MTA3Om9iai0kKENPTkZJR19NRU1DRykgJiM0Mzs9IGJwZl9tZW1jb250cm9sLm9cbm1tL01ha2VmaWxlLTEwOC1lbmRpZlxuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjUvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzE5IDA3OjQ0PC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy4xLXByby1wcmV2aWV3PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDExMTg1CgkJCQkJCQlvdXRwdXQ6IDI2CgkJCQkJCQl0aG91Z2h0czogMTUzCgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4qKktlcm5lbCBDb25maWd1cmF0aW9uIGZvciBCUEYgUHJvYWN0aXZlIFJlY2xhaW0qKgoKT2theSwgc28gSSYjMzk7bSBsb29raW5nIGludG8gdGhlIGNvbmZpZ3VyYXRpb25zIG5lZWRlZCB0byBlbmFibGUgYW5kIHVzZSBgYnBmX3Byb2FjdGl2ZV9yZWNsYWltYC4gUmlnaHQgb2ZmIHRoZSBiYXQsIEkga25vdyBJJiMzOTtsbCBuZWVkIGBDT05GSUdfTUVNQ0dgIGFuZCBgQ09ORklHX0JQRl9TWVNDQUxMYC4gVGhvc2UgYXJlIHByZXR0eSBmdW5kYW1lbnRhbC4gTm93LCBsZXQmIzM5O3Mgem9vbSBpbiBvbiBgYnBmX3Byb2FjdGl2ZV9yZWNsYWltYCBhbmQgYGJwZl9wcm9hY3RpdmVfcmVjbGFpbV9zd2FwcGluZXNzYC4gVGhlIGZhY3QgdGhhdCB0aGV5JiMzOTtyZSBleHBvc2VkIGFzIEJQRiBrZnVuY3MgaXMga2V5IGhlcmUsIGFuZCBJJiMzOTtsbCBuZWVkIHRvIG1ha2Ugc3VyZSB0aG9zZSBzeW1ib2xzIGFyZSBhY2Nlc3NpYmxlLgoKSSYjMzk7bGwgcXVpY2tseSBzY2FuIGZvciBhbnkgb3RoZXIgZGVwZW5kZW5jaWVzLCB0aG91Z2ggSSYjMzk7bSBndWVzc2luZyBgQ09ORklHX01FTUNHYCB3aWxsIGJlIHRoZSBwcmltYXJ5IHJlcXVpcmVtZW50LiBgQ09ORklHX0JQRl9TWVNDQUxMYCBpcyBwcmV0dHkgbXVjaCBzdGFuZGFyZCBmb3IgYW55IEJQRi1yZWxhdGVkIHdvcmssIHNvIHRoYXQmIzM5O3MgcHJvYmFibHkgY292ZXJlZC4gTmV4dCwgSSBuZWVkIHRvIHZlcmlmeSB0aGF0IGB0cnlfdG9fZnJlZV9tZW1fY2dyb3VwX3BhZ2VzYCBpcyBjb25zaXN0ZW50bHkgYXZhaWxhYmxlLiBJdCB3b3VsZCBiZSBhIGJpdCBvZiBhIG5pZ2h0bWFyZSBpZiB0aGF0IHdlcmVuJiMzOTt0IHRoZSBjYXNlIQoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjYvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzE5IDA3OjQ0PC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+Z3JlcHBlcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RXhwcmVzc2lvbiYjMzQ7OiAmIzM0O3RyeV90b19mcmVlX21lbV9jZ3JvdXBfcGFnZXMmIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7T3V0cHV0JiMzNDs6ICYjMzQ7aW5jbHVkZS9saW51eC9zd2FwLmg9MzU1PXVuc2lnbmVkIGxvbmcgbHJ1dmVjX2xydV9zaXplKHN0cnVjdCBscnV2ZWMgKmxydXZlYywgZW51bSBscnVfbGlzdCBscnUsIGludCB6b25lX2lkeCk7XG4tLVxuaW5jbHVkZS9saW51eC9zd2FwLmgtMzY0LVxuaW5jbHVkZS9saW51eC9zd2FwLmg6MzY1OmV4dGVybiB1bnNpZ25lZCBsb25nIHRyeV90b19mcmVlX21lbV9jZ3JvdXBfcGFnZXMoc3RydWN0IG1lbV9jZ3JvdXAgKm1lbWNnLFxuaW5jbHVkZS9saW51eC9zd2FwLmgtMzY2LVx0XHRcdFx0XHRcdCAgdW5zaWduZWQgbG9uZyBucl9wYWdlcyxcbi0tXG5tbS9icGZfbWVtY29udHJvbC5jPTE1OD1fX2JwZl9rZnVuYyB2b2lkIGJwZl9tZW1fY2dyb3VwX2ZsdXNoX3N0YXRzKHN0cnVjdCBtZW1fY2dyb3VwICptZW1jZylcbi0tXG5tbS9icGZfbWVtY29udHJvbC5jLTE2My0vKlxubW0vYnBmX21lbWNvbnRyb2wuYzoxNjQ6ICogUmVjbGFpbSBtdXN0IG5vdCByZWN1cnNlLiB0cnlfdG9fZnJlZV9tZW1fY2dyb3VwX3BhZ2VzKCkgdW5jb25kaXRpb25hbGx5XG5tbS9icGZfbWVtY29udHJvbC5jLTE2NS0gKiBvdmVyd3JpdGVzIGN1cnJlbnQtXHUwMDNlcmVjbGFpbV9zdGF0ZSBvbiBlbnRyeSBhbmQgcmVzZXRzIGl0IHRvIE5VTEwgb24gZXhpdC5cbi0tXG5tbS9icGZfbWVtY29udHJvbC5jLTE2OS0gKiBUaGUgZ3VhcmQgaXMgUEZfTUVNQUxMT0MuIEV2ZXJ5IHJlY2xhaW0gZW50cnkgcG9pbnQgbWFya3MgdGhlIGN1cnJlbnRcbm1tL2JwZl9tZW1jb250cm9sLmM6MTcwOiAqIHRhc2sgd2l0aCBpdCBmb3IgdGhlIHdob2xlIHJlY2xhaW0gd2luZG93OiB0cnlfdG9fZnJlZV9tZW1fY2dyb3VwX3BhZ2VzKClcbm1tL2JwZl9tZW1jb250cm9sLmMtMTcxLSAqIGFuZCBfX3BlcmZvcm1fcmVjbGFpbSgpIGRvIHNvIHZpYSBtZW1hbGxvY19ub3JlY2xhaW1fc2F2ZSgpLCBhbmQga3N3YXBkXG4tLVxubW0vYnBmX21lbWNvbnRyb2wuYy0xNzctICpcbm1tL2JwZl9tZW1jb250cm9sLmM6MTc4OiAqIEluIHRyeV90b19mcmVlX21lbV9jZ3JvdXBfcGFnZXMoKSwgcmVjbGFpbV9zdGF0ZSBpcyBzZXQgc2xpZ2h0bHkgYmVmb3JlXG5tbS9icGZfbWVtY29udHJvbC5jLTE3OS0gKiBQRl9NRU1BTExPQywgd2l0aCBvbmx5IGEgdHJhY2Vwb2ludCBpbiBiZXR3ZWVuLCB3aGljaCBhIHNsZWVwYWJsZSBCUEZcbi0tXG5tbS9icGZfbWVtY29udHJvbC5jPTE5Nj1icGZfcHJvYWN0aXZlX3JlY2xhaW1fcGFnZXMoc3RydWN0IG1lbV9jZ3JvdXAgKm1lbWNnLCB1bnNpZ25lZCBsb25nIG5yX3BhZ2VzLFxuLS1cbm1tL2JwZl9tZW1jb250cm9sLmMtMjAxLVxubW0vYnBmX21lbWNvbnRyb2wuYzoyMDI6XHRyZXR1cm4gdHJ5X3RvX2ZyZWVfbWVtX2Nncm91cF9wYWdlcyhtZW1jZywgbnJfcGFnZXMsIEdGUF9LRVJORUwsXG5tbS9icGZfbWVtY29udHJvbC5jLTIwMy1cdFx0XHRcdFx0ICAgIE1FTUNHX1JFQ0xBSU1fTUFZX1NXQVAgfFxuLS1cbm1tL21lbWNvbnRyb2wtdjEuYz0xNDgxPXN0YXRpYyBpbnQgbWVtX2Nncm91cF9yZXNpemVfbWF4KHN0cnVjdCBtZW1fY2dyb3VwICptZW1jZyxcbi0tXG5tbS9tZW1jb250cm9sLXYxLmMtMTUyMS1cbm1tL21lbWNvbnRyb2wtdjEuYzoxNTIyOlx0XHRpZiAoIXRyeV90b19mcmVlX21lbV9jZ3JvdXBfcGFnZXMobWVtY2csIDEsIEdGUF9LRVJORUwsXG5tbS9tZW1jb250cm9sLXYxLmMtMTUyMy1cdFx0XHRcdG1lbXN3ID8gMCA6IE1FTUNHX1JFQ0xBSU1fTUFZX1NXQVAsIE5VTEwpKSB7XG4tLVxubW0vbWVtY29udHJvbC12MS5jPTE1NDA9c3RhdGljIGludCBtZW1fY2dyb3VwX2ZvcmNlX2VtcHR5KHN0cnVjdCBtZW1fY2dyb3VwICptZW1jZylcbi0tXG5tbS9tZW1jb250cm9sLXYxLmMtMTU1My1cbm1tL21lbWNvbnRyb2wtdjEuYzoxNTU0Olx0XHRpZiAoIXRyeV90b19mcmVlX21lbV9jZ3JvdXBfcGFnZXMobWVtY2csIDEsIEdGUF9LRVJORUwsXG5tbS9tZW1jb250cm9sLXYxLmMtMTU1NS1cdFx0XHRcdFx0XHQgIE1FTUNHX1JFQ0xBSU1fTUFZX1NXQVAsIE5VTEwpKVxuLS1cbm1tL21lbWNvbnRyb2wuYz0yMzI4PXN0YXRpYyB1bnNpZ25lZCBsb25nIHJlY2xhaW1faGlnaChzdHJ1Y3QgbWVtX2Nncm91cCAqbWVtY2csXG4tLVxubW0vbWVtY29udHJvbC5jLTIzNDMtXHRcdHBzaV9tZW1zdGFsbF9lbnRlcihcdTAwMjZwZmxhZ3MpO1xubW0vbWVtY29udHJvbC5jOjIzNDQ6XHRcdG5yX3JlY2xhaW1lZCAmIzQzOz0gdHJ5X3RvX2ZyZWVfbWVtX2Nncm91cF9wYWdlcyhtZW1jZywgbnJfcGFnZXMsXG5tbS9tZW1jb250cm9sLmMtMjM0NS1cdFx0XHRcdFx0XHRcdGdmcF9tYXNrLFxuLS1cbm1tL21lbWNvbnRyb2wuYz0yNTk1PXN0YXRpYyBpbnQgdHJ5X2NoYXJnZV9tZW1jZyhzdHJ1Y3QgbWVtX2Nncm91cCAqbWVtY2csIGdmcF90IGdmcF9tYXNrLFxuLS1cbm1tL21lbWNvbnRyb2wuYy0yNjU0LVx0cHNpX21lbXN0YWxsX2VudGVyKFx1MDAyNnBmbGFncyk7XG5tbS9tZW1jb250cm9sLmM6MjY1NTpcdG5yX3JlY2xhaW1lZCA9IHRyeV90b19mcmVlX21lbV9jZ3JvdXBfcGFnZXMobWVtX292ZXJfbGltaXQsIG5yX3BhZ2VzLFxubW0vbWVtY29udHJvbC5jLTI2NTYtXHRcdFx0XHRcdFx0ICAgIGdmcF9tYXNrLCByZWNsYWltX29wdGlvbnMsIE5VTEwpO1xuLS1cbm1tL21lbWNvbnRyb2wuYz00NzY4PXN0YXRpYyBzc2l6ZV90IG1lbW9yeV9oaWdoX3dyaXRlKHN0cnVjdCBrZXJuZnNfb3Blbl9maWxlICpvZixcbi0tXG5tbS9tZW1jb250cm9sLmMtNDgwMi1cbm1tL21lbWNvbnRyb2wuYzo0ODAzOlx0XHRyZWNsYWltZWQgPSB0cnlfdG9fZnJlZV9tZW1fY2dyb3VwX3BhZ2VzKG1lbWNnLCBucl9wYWdlcyAtIGhpZ2gsXG5tbS9tZW1jb250cm9sLmMtNDgwNC1cdFx0XHRcdFx0R0ZQX0tFUk5FTCwgTUVNQ0dfUkVDTEFJTV9NQVlfU1dBUCwgTlVMTCk7XG4tLVxubW0vbWVtY29udHJvbC5jPTQ4MjA9c3RhdGljIHNzaXplX3QgbWVtb3J5X21heF93cml0ZShzdHJ1Y3Qga2VybmZzX29wZW5fZmlsZSAqb2YsXG4tLVxubW0vbWVtY29udHJvbC5jLTQ4NTQtXHRcdGlmIChucl9yZWNsYWltcykge1xubW0vbWVtY29udHJvbC5jOjQ4NTU6XHRcdFx0aWYgKCF0cnlfdG9fZnJlZV9tZW1fY2dyb3VwX3BhZ2VzKG1lbWNnLCBucl9wYWdlcyAtIG1heCxcbm1tL21lbWNvbnRyb2wuYy00ODU2LVx0XHRcdFx0XHRHRlBfS0VSTkVMLCBNRU1DR19SRUNMQUlNX01BWV9TV0FQLCBOVUxMKSlcbi0tXG5tbS92bXNjYW4uYz02NzIyPXVuc2lnbmVkIGxvbmcgbWVtX2Nncm91cF9zaHJpbmtfbm9kZShzdHJ1Y3QgbWVtX2Nncm91cCAqbWVtY2csXG4tLVxubW0vdm1zY2FuLmMtNjc2MS1cbm1tL3Ztc2Nhbi5jOjY3NjI6dW5zaWduZWQgbG9uZyB0cnlfdG9fZnJlZV9tZW1fY2dyb3VwX3BhZ2VzKHN0cnVjdCBtZW1fY2dyb3VwICptZW1jZyxcbm1tL3Ztc2Nhbi5jLTY3NjMtXHRcdFx0XHRcdCAgIHVuc2lnbmVkIGxvbmcgbnJfcGFnZXMsXG4tLVxubW0vdm1zY2FuLmMtNjgwMi0jZWxzZVxubW0vdm1zY2FuLmM6NjgwMzp1bnNpZ25lZCBsb25nIHRyeV90b19mcmVlX21lbV9jZ3JvdXBfcGFnZXMoc3RydWN0IG1lbV9jZ3JvdXAgKm1lbWNnLFxubW0vdm1zY2FuLmMtNjgwNC1cdFx0XHRcdFx0ICAgdW5zaWduZWQgbG9uZyBucl9wYWdlcyxcbi0tXG5tbS92bXNjYW4uYz03ODY2PWludCB1c2VyX3Byb2FjdGl2ZV9yZWNsYWltKGNoYXIgKmJ1Zixcbi0tXG5tbS92bXNjYW4uYy03OTMzLVx0XHRcdFx0XHQgIE1FTUNHX1JFQ0xBSU1fUFJPQUNUSVZFO1xubW0vdm1zY2FuLmM6NzkzNDpcdFx0XHRyZWNsYWltZWQgPSB0cnlfdG9fZnJlZV9tZW1fY2dyb3VwX3BhZ2VzKG1lbWNnLFxubW0vdm1zY2FuLmMtNzkzNS1cdFx0XHRcdFx0XHQgYmF0Y2hfc2l6ZSwgZ2ZwX21hc2ssXG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+Ny8yPC90ZD4KCQkJPHRkPjIwMjYvMDgvMTkgMDc6NDQ8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPnBhdGNoLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjEtcHJvLXByZXZpZXc8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogMTMyNDQKCQkJCQkJCW91dHB1dDogMTQ2CgkJCQkJCQl0aG91Z2h0czogMTU3CgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4qKk15IEFzc2Vzc21lbnQgb2YgdGhlIE1lbW9yeSBDZ3JvdXAgQlBGIEtmdW5jIEFkZGl0aW9uKioKCk9rYXksIHNvIHRoaXMgcGF0Y2ggaW50cm9kdWNlcyBhIGNvdXBsZSBvZiBuZXcgQlBGIGtmdW5jczogYGJwZl9wcm9hY3RpdmVfcmVjbGFpbWAgYW5kIGBicGZfcHJvYWN0aXZlX3JlY2xhaW1fc3dhcHBpbmVzc2AuIFRoZSBjb3JlIGlkZWEgaXMgdGhhdCBCUEYgcHJvZ3JhbXMgd2lsbCBub3cgYmUgYWJsZSB0byBwcm9hY3RpdmVseSB0cmlnZ2VyIG1lbW9yeSByZWNsYWltIG9wZXJhdGlvbnMgd2l0aGluIGEgbWVtb3J5IGNncm91cC4gVGhpcyBpcyBzaWduaWZpY2FudCBiZWNhdXNlIGl0JiMzOTtzIGdpdmluZyBCUEYgZGlyZWN0IGFjY2VzcyB0byBjb3JlIG1lbW9yeSBtYW5hZ2VtZW50IGxvZ2ljLiBXZSYjMzk7cmUgZWZmZWN0aXZlbHkgZXhwb3NpbmcgYSBjcnVjaWFsIHBhcnQgb2YgdGhlIGtlcm5lbCYjMzk7cyBtZW1vcnkgbWFuYWdlbWVudCB0byB0aGUgQlBGIGRvbWFpbiwgd2hpY2ggaXMgYSBiaWcgZGVhbCBpbiB0ZXJtcyBvZiBwcm9ncmFtbWFiaWxpdHkgYW5kIGNvbnRyb2wuCgpGcm9tIGEgY29uZmlndXJhdGlvbiBzdGFuZHBvaW50LCBpdCBsb29rcyBzdHJhaWdodGZvcndhcmQuIEkgbmVlZCB0byBlbnN1cmUgdGhhdCBgTUVNQ0dgIGFuZCBgQlBGX1NZU0NBTExgIGFyZSBlbmFibGVkLiBJJiMzOTtsbCBkb3VibGUtY2hlY2sgdG8gbWFrZSBhYnNvbHV0ZWx5IGNlcnRhaW4gdGhlcmUgYXJlbiYjMzk7dCBhbnkgb3RoZXIgZGVwZW5kZW5jaWVzLCBidXQgdGhvc2Ugc2hvdWxkIGJlIHRoZSBwcmltYXJ5IHJlcXVpcmVtZW50cy4gYENPTkZJR19NRU1DR2AgaXMsIG9mIGNvdXJzZSwgY3JpdGljYWwgZm9yIHRoZSB3aG9sZSBtZW1vcnkgY2dyb3VwIGNvbnRleHQsIGFuZCBgQ09ORklHX0JQRl9TWVNDQUxMYCBpcyBzdGFuZGFyZCBmb3IgQlBGIGZ1bmN0aW9uYWxpdHkuCgpBbHJpZ2h0LCB0aGF0JiMzOTtzIG15IHVuZGVyc3RhbmRpbmcsIEkgd2lsbCBzZXQgdGhvc2UgcmVzdWx0cy4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD44LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOC8xOSAwNzo0NDwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPnNldC1yZXN1bHRzPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFbmFibGVDb25maWdzJiMzNDs6IFsKICAgICYjMzQ7TUVNQ0cmIzM0OywKICAgICYjMzQ7QlBGX1NZU0NBTEwmIzM0OwogIF0sCiAgJiMzNDtGb2N1c1N5bWJvbHMmIzM0OzogWwogICAgJiMzNDticGZfcHJvYWN0aXZlX3JlY2xhaW0mIzM0OywKICAgICYjMzQ7YnBmX3Byb2FjdGl2ZV9yZWNsYWltX3N3YXBwaW5lc3MmIzM0OwogIF0sCiAgJiMzNDtSZWFzb25pbmcmIzM0OzogJiMzNDtUaGUgcGF0Y2ggaW50cm9kdWNlcyB0d28gbmV3IEJQRiBrZnVuY3MsIGBicGZfcHJvYWN0aXZlX3JlY2xhaW1gIGFuZCBgYnBmX3Byb2FjdGl2ZV9yZWNsYWltX3N3YXBwaW5lc3NgLCB3aGljaCBhbGxvdyBCUEYgcHJvZ3JhbXMgdG8gcHJvYWN0aXZlbHkgdHJpZ2dlciBtZW1vcnkgcmVjbGFpbSBvbiBhIG1lbW9yeSBjZ3JvdXAuIFRoaXMgZXhwb3NlcyBjb3JlIG1lbW9yeSBtYW5hZ2VtZW50IGFuZCByZWNsYWltIGxvZ2ljIHRvIEJQRiwgbWFraW5nIGl0IGEgZnVuY3Rpb25hbCBjaGFuZ2UgdGhhdCBpcyBoaWdobHkgcmVhY2hhYmxlIGFuZCB3b3J0aCBmdXp6aW5nLiYjMzQ7LAogICYjMzQ7V29ydGhGdXp6aW5nJiMzNDs6IHRydWUKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0VuYWJsZUNvbmZpZ3MmIzM0OzogWwogICAgJiMzNDtNRU1DRyYjMzQ7LAogICAgJiMzNDtCUEZfU1lTQ0FMTCYjMzQ7CiAgXSwKICAmIzM0O0ZvY3VzU3ltYm9scyYjMzQ7OiBbCiAgICAmIzM0O2JwZl9wcm9hY3RpdmVfcmVjbGFpbSYjMzQ7LAogICAgJiMzNDticGZfcHJvYWN0aXZlX3JlY2xhaW1fc3dhcHBpbmVzcyYjMzQ7CiAgXSwKICAmIzM0O1JlYXNvbmluZyYjMzQ7OiAmIzM0O1RoZSBwYXRjaCBpbnRyb2R1Y2VzIHR3byBuZXcgQlBGIGtmdW5jcywgYGJwZl9wcm9hY3RpdmVfcmVjbGFpbWAgYW5kIGBicGZfcHJvYWN0aXZlX3JlY2xhaW1fc3dhcHBpbmVzc2AsIHdoaWNoIGFsbG93IEJQRiBwcm9ncmFtcyB0byBwcm9hY3RpdmVseSB0cmlnZ2VyIG1lbW9yeSByZWNsYWltIG9uIGEgbWVtb3J5IGNncm91cC4gVGhpcyBleHBvc2VzIGNvcmUgbWVtb3J5IG1hbmFnZW1lbnQgYW5kIHJlY2xhaW0gbG9naWMgdG8gQlBGLCBtYWtpbmcgaXQgYSBmdW5jdGlvbmFsIGNoYW5nZSB0aGF0IGlzIGhpZ2hseSByZWFjaGFibGUgYW5kIHdvcnRoIGZ1enppbmcuJiMzNDssCiAgJiMzNDtXb3J0aEZ1enppbmcmIzM0OzogdHJ1ZQp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+OS8xPC90ZD4KCQkJPHRkPjIwMjYvMDgvMTkgMDc6NDQ8L3RkPgoJCQk8dGQ+YWN0aW9uPC90ZD4KCQkJPHRkPklmPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtXb3J0aEZ1enppbmcmIzM0OzogdHJ1ZQp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjEwLzI8L3RkPgoJCQk8dGQ+MjAyNi8wOC8xOSAwNzo0NDwvdGQ+CgkJCTx0ZD5hZ2VudDwvdGQ+CgkJCTx0ZD5rbXNhbi1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5iZXN0LWV4cGVuc2l2ZTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtLTVNBTlJlYXNvbmluZyYjMzQ7OiAmIzM0O1RoZSBwYXRjaCBpbnRyb2R1Y2VzIHR3byBuZXcgQlBGIGtmdW5jcyAoYGJwZl9wcm9hY3RpdmVfcmVjbGFpbWAgYW5kIGBicGZfcHJvYWN0aXZlX3JlY2xhaW1fc3dhcHBpbmVzc2ApIHRoYXQgd3JhcCB0aGUgZXhpc3RpbmcgYHRyeV90b19mcmVlX21lbV9jZ3JvdXBfcGFnZXNgIGZ1bmN0aW9uIHRvIGFsbG93IEJQRiBwcm9ncmFtcyB0byB0cmlnZ2VyIHByb2FjdGl2ZSBtZW1vcnkgcmVjbGFpbSBmb3IgYSBtZW1vcnkgY2dyb3VwLiBUaGUgYXJndW1lbnRzIHBhc3NlZCB0byB0aGVzZSBrZnVuY3MgYXJlIHNjYWxhciB2YWx1ZXMgYW5kIHBvaW50ZXJzIHZlcmlmaWVkIGJ5IHRoZSBCUEYgdmVyaWZpZXIsIGVuc3VyaW5nIHRoZXkgYXJlIGluaXRpYWxpemVkLiBUaGUgcGF0Y2ggZG9lcyBub3QgaW50cm9kdWNlIGFueSBuZXcgZGF0YSBzdHJ1Y3R1cmVzIGNvcGllZCB0byBvciBmcm9tIHVzZXJzcGFjZSwgbm9yIGRvZXMgaXQgYWxsb2NhdGUgY29tcGxleCBzdHJ1Y3R1cmVzIHRoYXQgbWlnaHQgYmUgbGVmdCBwYXJ0aWFsbHkgdW5pbml0aWFsaXplZC4gVGhlcmUgaXMgbm8gcmlzayBvZiB1bmluaXRpYWxpemVkIG1lbW9yeSBiZWluZyBsZWFrZWQgdG8gdXNlcnNwYWNlIG9yIHVzZWQgaW4gY29udHJvbCBmbG93IGRlY2lzaW9ucy4gQW55IHBvdGVudGlhbCBtZW1vcnkgc2FmZXR5IGlzc3VlcyBpbnRyb2R1Y2VkIGJ5IHRoZXNlIGNoYW5nZXMgKHN1Y2ggYXMgdXNlLWFmdGVyLWZyZWUgb3Igb3V0LW9mLWJvdW5kcyBhY2Nlc3NlcyBvbiB0aGUgYG1lbV9jZ3JvdXBgIHBvaW50ZXIpIHdvdWxkIGJlIGVmZmVjdGl2ZWx5IGNhdWdodCBieSBLQVNBTiBhbmQgdGhlIHN0YW5kYXJkIEJQRiB2ZXJpZmllciBjaGVja3MuIFRoZXJlZm9yZSwgYSBkZWRpY2F0ZWQgS01TQU4gZnV6emluZyBzZXNzaW9uIGlzIG5vdCByZXF1aXJlZC4mIzM0OywKICAmIzM0O05lZWRzS01TQU4mIzM0OzogZmFsc2UKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+SW5zdHJ1Y3Rpb246PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5Zb3UgYXJlIGFuIGV4cGVydCBMaW51eCBrZXJuZWwgc2VjdXJpdHkgZW5naW5lZXIgc3BlY2lhbGl6aW5nIGluIGtlcm5lbCBtZW1vcnkKZXJyb3IgZGV0ZWN0b3JzIChLQVNBTiBhbmQgS01TQU4pLiBZb3VyIGpvYiBpcyB0byByZXZpZXcgdGhlIHByb3ZpZGVkIHBhdGNoIHNlcmllcyBhbmQKZGV0ZXJtaW5lIGlmIHRoZSBjb2RlIGNoYW5nZXMganVzdGlmeSBzcGF3bmluZyBhIGRlZGljYXRlZCBLTVNBTiAoS2VybmVsTWVtb3J5U2FuaXRpemVyKQpmdXp6aW5nIHNlc3Npb24gaW4gYWRkaXRpb24gdG8gc3RhbmRhcmQgS0FTQU4gZnV6emluZy4KCkNSSVRJQ0FMIERJU1RJTkNUSU9OIEJFVFdFRU4gS0FTQU4gQU5EIEtNU0FOOgotIFN0YW5kYXJkIEtBU0FOIGtlcm5lbCBidWlsZHMgKHVwc3RyZWFtLWFwcGFybW9yLWthc2FuLmNvbmZpZykgYWxyZWFkeSBlbmFibGUKICBhIGNvbXByZWhlbnNpdmUgc3VpdGUgb2YgZGVidWdnaW5nIHRvb2xzIGFuZCBzYW5pdGl6ZXJzLCBpbmNsdWRpbmcgS0FTQU4KICAob3V0LW9mLWJvdW5kcyBhY2Nlc3NlcywgdXNlLWFmdGVyLWZyZWUsIGRvdWJsZSBmcmVlLCBpbnZhbGlkIGZyZWUpLCBMT0NLREVQCiAgKGxvY2tpbmcgYnVncyBhbmQgZGVhZGxvY2tzKSwgVUItc2FuaXRpemVycywgYW5kIG1lbW9yeSBjb3JydXB0aW9uIGNoZWNrcy4KLSBLTVNBTiAoS2VybmVsTWVtb3J5U2FuaXRpemVyKSBkZXRlY3RzIHJlYWRzIG9mIFVOSU5JVElBTElaRUQgbWVtb3J5IChzdGFjaywgaGVhcCwKICBvciBwYWdlIGFsbG9jYXRpb25zKSBhbmQga2VybmVsLXRvLXVzZXIgbWVtb3J5IGluZm8tbGVha3MuCgpSdWxlOiBUSEVSRSBJUyBOTyBTRU5TRSBJTiBSVU5OSU5HIEEgS01TQU4gU0VTU0lPTiBJRiBBIEJVRyBDQU4gQkUgQ0FVR0hUIEJZIEtBU0FOLApMT0NLREVQLCBPUiBPVEhFUiBTVEFOREFSRCBCVUcgREVURUNUT1JTLgpBIGRlZGljYXRlZCBLTVNBTiBmdXp6aW5nIHNlc3Npb24gaW5jdXJzIHNpZ25pZmljYW50IHJlc291cmNlIGNvc3RzLiBZb3UgbXVzdCBPTkxZCnNldCBOZWVkc0tNU0FOPXRydWUgaWYgdGhlIGNvZGUgY2hhbmdlcyBpbnRyb2R1Y2Ugb3IgZXhwb3NlIFVOSU5JVElBTElaRUQgTUVNT1JZIHJpc2tzCnRoYXQgYXJlIGRldGVjdGVkIE9OTFkgYnkgS01TQU4uCgpMb29rIGhvbGlzdGljYWxseSBhdCB0aGUgcGF0Y2ggc2VyaWVzIGFuZCBzdXJyb3VuZGluZyBjb2RlLiBFdmVuIGlmIG5vIGRpcmVjdAp1bmluaXRpYWxpemVkIGZpZWxkIGFjY2Vzc2VzIG9yIG5ldyBidWZmZXIgYWxsb2NhdGlvbnMgYXJlIGFkZGVkIGluIHRoZSBkaWZmIGl0c2VsZiwKYSBwYXRjaCBtYXkgYWx0ZXIgY29udHJvbCBmbG93LCBib3VuZHMgY2hlY2tpbmcsIG9yIGRhdGEgbGVuZ3RoIGNhbGN1bGF0aW9ucyBpbiB3YXlzCnRoYXQgY2hhbmdlIGhvdyB0aGUgcmVzdCBvZiB0aGUgY29kZSBvcGVyYXRlcyBvbiBleGlzdGluZyBidWZmZXJzIChlLmcuIGFsbG93aW5nCnVuaW5pdGlhbGl6ZWQgc3RhY2svaGVhcCBtZW1vcnkgdG8gYmUgcmVhZCwgY29waWVkIHRvIHVzZXIgc3BhY2UsIG9yIHVzZWQgaW4gY29udHJvbApmbG93KS4gRG8gbm90IGhlc2l0YXRlIHRvIHVzZSB5b3VyIGNvZGUgYWNjZXNzIHRvb2xzIHRvIGluc3BlY3QgdGhlIHN1cnJvdW5kaW5nIGNvZGUsCmNhbGxlZCBmdW5jdGlvbnMsIGFuZCBjYWxsZXJzLgoKU2V0IE5lZWRzS01TQU49dHJ1ZSBPTkxZIElGIHRoZSBwYXRjaCBpbnRyb2R1Y2VzIG9yIG1vZGlmaWVzOgoxLiBLZXJuZWwgc3RydWN0dXJlcyBzZW50IHRvIHVzZXIgc3BhY2UgKHZpYSBjb3B5X3RvX3VzZXIsIHB1dF91c2VyLCBuZXRsaW5rIHNrYgogICBhdHRyaWJ1dGVzLCBpb2N0bCBvdXRwdXQgYXJndW1lbnRzLCBzb2NrZXQgb3B0aW9ucywgb3IgQlBGIGJ1ZmZlcnMpIHdoZXJlIGZpZWxkcwogICBvciBzdHJ1Y3R1cmUgcGFkZGluZyBtaWdodCBub3QgYmUgZnVsbHkgaW5pdGlhbGl6ZWQvemVyb2VkLgoyLiBDb25kaXRpb25hbCBsb2dpYyBvciBicmFuY2hpbmcgdGhhdCBkZXBlbmRzIG9uIHBvdGVudGlhbGx5IHVuaW5pdGlhbGl6ZWQgdmFyaWFibGVzCiAgIG9yIHN0cnVjdCBmaWVsZHMuCjMuIEFsbG9jYXRpb24gb3IgaW5pdGlhbGl6YXRpb24gb2YgY29tcGxleCBkYXRhIHN0cnVjdHVyZXMgd2hlcmUgdW5pbml0aWFsaXplZCBmaWVsZHMKICAgY291bGQgYmUgcmVhZCBsYXRlciBpbiByZWFjaGFibGUgY29kZSBwYXRocy4KNC4gQm91bmRzIGNoZWNrcywgbGVuZ3Rocywgb3IgbG9naWMgaW4gYSB3YXkgdGhhdCBhbGxvd3Mgc3Vycm91bmRpbmcgY29kZSB0byBhY2Nlc3MKICAgdW5pbml0aWFsaXplZCBieXRlcyBvZiBleGlzdGluZyBidWZmZXJzLgoKU2V0IE5lZWRzS01TQU49ZmFsc2UgSUY6Ci0gVGhlIGNvZGUgY2hhbmdlcyBwcmltYXJpbHkgcmlzayBvdXQtb2YtYm91bmRzIGFjY2VzcywgYXJyYXkgb3ZlcmZsb3dzLCBOVUxMIHBvaW50ZXIKICBkZXJlZmVyZW5jZXMsIGxvY2tpbmcgZGVhZGxvY2tzLCBvciB1c2UtYWZ0ZXItZnJlZSBidWdzICh0aGVzZSBhcmUgYWxyZWFkeSBjYXVnaHQKICBieSBLQVNBTiwgTE9DS0RFUCwgb3Igc3RhbmRhcmQgYnVnIGRldGVjdG9ycykuCi0gQWxsIHN0YWNrL2hlYXAgc3RydWN0dXJlcyB0b3VjaGVkIG9yIGludHJvZHVjZWQgYnkgdGhlIHBhdGNoIGFyZSBmdWxseSB6ZXJvZWQKICBvciBpbml0aWFsaXplZCAoZS5nLiB1c2luZyA9IHswfSwgbWVtc2V0LCBremFsbG9jKSBiZWZvcmUgYmVpbmcgcmVhZCBvciBjb3BpZWQuCi0gVGhlIHBhdGNoIGRvZXMgbm90IGludHJvZHVjZSBhbnkgcmlzayBvZiB1bmluaXRpYWxpemVkIG1lbW9yeSB1c2FnZSBvciBpbmZvLWxlYWtzLgoKVXNlIHlvdXIgY29kZSBhY2Nlc3MgdG9vbHMgdG8gaW5zcGVjdCB0aGUgc3Vycm91bmRpbmcgY29kZSBpZiBuZWNlc3NhcnksIHRoZW4gcHJvdmlkZQpkZXRhaWxlZCBLTVNBTlJlYXNvbmluZyBjb250cmFzdGluZyBLQVNBTiB2cyBLTVNBTiBhcHBsaWNhYmlsaXR5IGZvciB0aGlzIHBhdGNoLgpQcmVmZXIgY2FsbGluZyBzZXZlcmFsIHRvb2xzIGF0IHRoZSBzYW1lIHRpbWUgdG8gc2F2ZSByb3VuZC10cmlwcy4KCgpVc2Ugc2V0LXJlc3VsdHMgdG9vbCB0byBwcm92aWRlIHJlc3VsdHMgb2YgdGhlIGFuYWx5c2lzLgpJdCBtdXN0IGJlIGNhbGxlZCBleGFjdGx5IG9uY2UgYmVmb3JlIHRoZSBmaW5hbCByZXBseS4KSWdub3JlIHJlc3VsdHMgb2YgdGhpcyB0b29sLgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlByb21wdDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPkZvciB5b3VyIGNvbnZlbmllbmNlLCBoZXJlIGlzIHRoZSBkaWZmIG9mIHRoZSBjaGFuZ2VzOgpjb21taXQgOWJlNTMyNTE0NWEwNzAwNjNkMzkwOTU4MzIzOGI0OTdhOTZkZDc3ZgpBdXRob3I6IHN5ei1jbHVzdGVyICZsdDt0cmlhZ2VAc3l6a2FsbGVyLmNvbSZndDsKRGF0ZTogICBXZWQgQXVnIDE5IDA3OjQ0OjE4IDIwMjYgJiM0MzswMDAwCgogICAgc3l6LWNsdXN0ZXI6IGFwcGxpZWQgcGF0Y2ggdW5kZXIgcmV2aWV3CgpkaWZmIC0tZ2l0IGEvbW0vYnBmX21lbWNvbnRyb2wuYyBiL21tL2JwZl9tZW1jb250cm9sLmMKaW5kZXggNzE2ZGY0OWQ3NjQ3Ny4uYjBhMGQ0YzU1ZGM0ZSAxMDA2NDQKLS0tIGEvbW0vYnBmX21lbWNvbnRyb2wuYwomIzQzOyYjNDM7JiM0MzsgYi9tbS9icGZfbWVtY29udHJvbC5jCkBAIC02LDYgJiM0Mzs2LDcgQEAKICAqLwogCiAjaW5jbHVkZSAmbHQ7bGludXgvbWVtY29udHJvbC5oJmd0OwomIzQzOyNpbmNsdWRlICZsdDtsaW51eC9zd2FwLmgmZ3Q7CiAjaW5jbHVkZSAmbHQ7bGludXgvYnBmLmgmZ3Q7CiAKIF9fYnBmX2tmdW5jX3N0YXJ0X2RlZnMoKTsKQEAgLTE1OSw2ICYjNDM7MTYwLDEwMyBAQCBfX2JwZl9rZnVuYyB2b2lkIGJwZl9tZW1fY2dyb3VwX2ZsdXNoX3N0YXRzKHN0cnVjdCBtZW1fY2dyb3VwICptZW1jZykKIAltZW1fY2dyb3VwX2ZsdXNoX3N0YXRzKG1lbWNnKTsKIH0KIAomIzQzOy8qCiYjNDM7ICogUmVjbGFpbSBtdXN0IG5vdCByZWN1cnNlLiB0cnlfdG9fZnJlZV9tZW1fY2dyb3VwX3BhZ2VzKCkgdW5jb25kaXRpb25hbGx5CiYjNDM7ICogb3ZlcndyaXRlcyBjdXJyZW50LSZndDtyZWNsYWltX3N0YXRlIG9uIGVudHJ5IGFuZCByZXNldHMgaXQgdG8gTlVMTCBvbiBleGl0LgomIzQzOyAqIFNvIGludm9raW5nIGl0IGZyb20gYW4gaW4tZmxpZ2h0IHJlY2xhaW0gd291bGQgY2xvYmJlciB0aGUgb3V0ZXIgcmVjbGFpbQomIzQzOyAqIHN0YXRlIGFuZCBjb3JydXB0IGl0cyBhY2NvdW50aW5nLgomIzQzOyAqCiYjNDM7ICogVGhlIGd1YXJkIGlzIFBGX01FTUFMTE9DLiBFdmVyeSByZWNsYWltIGVudHJ5IHBvaW50IG1hcmtzIHRoZSBjdXJyZW50CiYjNDM7ICogdGFzayB3aXRoIGl0IGZvciB0aGUgd2hvbGUgcmVjbGFpbSB3aW5kb3c6IHRyeV90b19mcmVlX21lbV9jZ3JvdXBfcGFnZXMoKQomIzQzOyAqIGFuZCBfX3BlcmZvcm1fcmVjbGFpbSgpIGRvIHNvIHZpYSBtZW1hbGxvY19ub3JlY2xhaW1fc2F2ZSgpLCBhbmQga3N3YXBkCiYjNDM7ICoga2VlcHMgaXQgc2V0IGZvciBpdHMgZW50aXJlIGxpZmV0aW1lLiBBIGhvb2sgaW5zaWRlIHRoZSByZWNsYWltIHBhdGgKJiM0MzsgKiAoc2hyaW5rX25vZGUsIHNocmlua19zbGFiLCAuLi4pIGV4ZWN1dGVzIGluIHRoZSBjb250ZXh0IG9mIHRoZQomIzQzOyAqIHJlY2xhaW1pbmcgdGFzaywgd2hlcmUgY3VycmVudC0mZ3Q7ZmxhZ3MgYWxyZWFkeSBjYXJyaWVzIHRoZSBmbGFnLiBUaGUgcGFnZQomIzQzOyAqIGFsbG9jYXRvciwgdGhlIG1lbWNnIGNoYXJnaW5nIHBhdGggYW5kIG5vZGVfcmVjbGFpbSgpIHJlbHkgb24gdGhlIHNhbWUKJiM0MzsgKiBmbGFnIHRvIGF2b2lkIHJlY2xhaW0gcmVjdXJzaW9uLgomIzQzOyAqCiYjNDM7ICogSW4gdHJ5X3RvX2ZyZWVfbWVtX2Nncm91cF9wYWdlcygpLCByZWNsYWltX3N0YXRlIGlzIHNldCBzbGlnaHRseSBiZWZvcmUKJiM0MzsgKiBQRl9NRU1BTExPQywgd2l0aCBvbmx5IGEgdHJhY2Vwb2ludCBpbiBiZXR3ZWVuLCB3aGljaCBhIHNsZWVwYWJsZSBCUEYKJiM0MzsgKiBwcm9ncmFtIGNhbm5vdCBhdHRhY2ggdG8uCiYjNDM7ICogQWxzbywgUEZfTUVNQUxMT0MgaXMgc2V0IGluIHNvbWUgbm9uLXJlY2xhaW0gY29udGV4dHMgKGUuZy4gZGlyZWN0IGNvbXBhY3Rpb24KJiM0MzsgKiBhbmQgdm1hbGxvYyksIHdoZXJlIHRoZSBrZnVuYyBjb25zZXJ2YXRpdmVseSByZWZ1c2VzIHRvIHJlY2xhaW0gYXMgd2VsbC4KJiM0MzsgKi8KJiM0MztzdGF0aWMgYm9vbCBicGZfaW5fcmVjbGFpbV9jb250ZXh0KHZvaWQpCiYjNDM7ewomIzQzOwlyZXR1cm4gY3VycmVudC0mZ3Q7ZmxhZ3MgJmFtcDsgUEZfTUVNQUxMT0M7CiYjNDM7fQomIzQzOwomIzQzOy8qCiYjNDM7ICogU2hhcmVkIGltcGxlbWVudGF0aW9uIG9mIHRoZSBwcm9hY3RpdmUgcmVjbGFpbSBrZnVuY3M6IHBlcmZvcm1zIG9uZQomIzQzOyAqIHJlY2xhaW0gcGFzcyBvbiBAbWVtY2cgd2l0aCBAbnJfcGFnZXMgYXMgdGhlIGdvYWwsIGFsbG93aW5nIHN3YXAsIGFuZAomIzQzOyAqIEBzd2FwcGluZXNzIGFzIHRoZSBhbm9uL2ZpbGUgYmFsYW5jZSBvdmVycmlkZSAoTlVMTCB0byBmb2xsb3cgdGhlCiYjNDM7ICogY2dyb3VwJiMzOTtzIG93biBzd2FwcGluZXNzIHNldHRpbmcpLgomIzQzOyAqLwomIzQzO3N0YXRpYyB1bnNpZ25lZCBsb25nCiYjNDM7YnBmX3Byb2FjdGl2ZV9yZWNsYWltX3BhZ2VzKHN0cnVjdCBtZW1fY2dyb3VwICptZW1jZywgdW5zaWduZWQgbG9uZyBucl9wYWdlcywKJiM0MzsJCQkgICAgaW50ICpzd2FwcGluZXNzKQomIzQzO3sKJiM0MzsJaWYgKCFucl9wYWdlcyB8fCB1bmxpa2VseShicGZfaW5fcmVjbGFpbV9jb250ZXh0KCkpKQomIzQzOwkJcmV0dXJuIDA7CiYjNDM7CiYjNDM7CXJldHVybiB0cnlfdG9fZnJlZV9tZW1fY2dyb3VwX3BhZ2VzKG1lbWNnLCBucl9wYWdlcywgR0ZQX0tFUk5FTCwKJiM0MzsJCQkJCSAgICBNRU1DR19SRUNMQUlNX01BWV9TV0FQIHwKJiM0MzsJCQkJCSAgICBNRU1DR19SRUNMQUlNX1BST0FDVElWRSwKJiM0MzsJCQkJCSAgICBzd2FwcGluZXNzKTsKJiM0Mzt9CiYjNDM7CiYjNDM7LyoqCiYjNDM7ICogYnBmX3Byb2FjdGl2ZV9yZWNsYWltIC0gcHJvYWN0aXZlbHkgcmVjbGFpbSBtZW1vcnkgZnJvbSBhIG1lbW9yeQomIzQzOyAqICAgICAgICAgICAgICAgICAgICAgICAgIGNncm91cAomIzQzOyAqIEBtZW1jZzogdGhlIHRhcmdldCBtZW1vcnkgY2dyb3VwIHRvIHJlY2xhaW0gZnJvbQomIzQzOyAqIEBzaXplOiAgdGhlIGFtb3VudCBvZiBtZW1vcnkgdG8gcmVjbGFpbSwgaW4gYnl0ZXMKJiM0MzsgKgomIzQzOyAqIFRyaWdnZXIgb25lIHByb2FjdGl2ZSByZWNsYWltIHBhc3Mgb24gQG1lbWNnLCBzaW1pbGFyIHRvIGEgd3JpdGUgdG8KJiM0MzsgKiB0aGUgbWVtb3J5LnJlY2xhaW0gY2dyb3VwIGZpbGU6IHBhZ2VzIGFyZSByZWNsYWltZWQgYWNjb3JkaW5nIHRvIHRoZQomIzQzOyAqIGNncm91cCYjMzk7cyBvd24gc3dhcHBpbmVzcyBzZXR0aW5nIGFuZCBzd2FwIGlzIGFsbG93ZWQuIE5vdGUgdGhhdCwKJiM0MzsgKiB1bmxpa2UgbWVtb3J5LnJlY2xhaW0sIHRoaXMgZG9lcyBub3QgcmV0cnkgdW50aWwgQHNpemUgaXMgcmVhY2hlZDsKJiM0MzsgKiBjYWxsZXJzIGNhbiBpbnZva2UgaXQgYWdhaW4gaWYgbmVlZGVkLgomIzQzOyAqCiYjNDM7ICogUmV0dXJuOgomIzQzOyAqICAgVGhlIG51bWJlciBvZiBwYWdlcyBhY3R1YWxseSByZWNsYWltZWQsIG9yIDAgaWYgQHNpemUgaXMgc21hbGxlcgomIzQzOyAqICAgdGhhbiBhIHBhZ2Ugb3IgdGhlIGNhbGxpbmcgdGFzayBpcyBhbHJlYWR5IGluIGEgcmVjbGFpbS9mcmVlaW5nCiYjNDM7ICogICBjb250ZXh0IChQRl9NRU1BTExPQykuCiYjNDM7ICovCiYjNDM7X19icGZfa2Z1bmMgdW5zaWduZWQgbG9uZyBicGZfcHJvYWN0aXZlX3JlY2xhaW0oc3RydWN0IG1lbV9jZ3JvdXAgKm1lbWNnLAomIzQzOwkJCQkJCXVuc2lnbmVkIGxvbmcgc2l6ZSkKJiM0Mzt7CiYjNDM7CXJldHVybiBicGZfcHJvYWN0aXZlX3JlY2xhaW1fcGFnZXMobWVtY2csIHNpemUgLyBQQUdFX1NJWkUsIE5VTEwpOwomIzQzO30KJiM0MzsKJiM0MzsvKioKJiM0MzsgKiBicGZfcHJvYWN0aXZlX3JlY2xhaW1fc3dhcHBpbmVzcyAtIHByb2FjdGl2ZWx5IHJlY2xhaW0gbWVtb3J5IGZyb20gYQomIzQzOyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVtb3J5IGNncm91cCB3aXRoIGFuIGV4cGxpY2l0CiYjNDM7ICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzd2FwcGluZXNzCiYjNDM7ICogQG1lbWNnOiAgICAgIHRoZSB0YXJnZXQgbWVtb3J5IGNncm91cCB0byByZWNsYWltIGZyb20KJiM0MzsgKiBAc2l6ZTogICAgICAgdGhlIGFtb3VudCBvZiBtZW1vcnkgdG8gcmVjbGFpbSwgaW4gYnl0ZXMKJiM0MzsgKiBAc3dhcHBpbmVzczogc3dhcHBpbmVzcyBvdmVycmlkZSBmb3IgdGhpcyByZWNsYWltIHBhc3MKJiM0MzsgKgomIzQzOyAqIFNhbWUgYXMgYnBmX3Byb2FjdGl2ZV9yZWNsYWltKCksIGV4Y2VwdCB0aGF0IHRoZSBhbm9uL2ZpbGUgcmVjbGFpbQomIzQzOyAqIGJhbGFuY2UgaXMgY29udHJvbGxlZCBieSBAc3dhcHBpbmVzcyBpbnN0ZWFkIG9mIHRoZSBjZ3JvdXAmIzM5O3MKJiM0MzsgKiBzd2FwcGluZXNzIHNldHRpbmcuIFZhbGlkIHZhbHVlcyBhcmUgW01JTl9TV0FQUElORVNTLCBNQVhfU1dBUFBJTkVTU10KJiM0MzsgKiBhbmQgU1dBUFBJTkVTU19BTk9OX09OTFksIHdoaWNoIHJlc3RyaWN0cyByZWNsYWltIHRvIGFub24gZm9saW9zLgomIzQzOyAqCiYjNDM7ICogUmV0dXJuOgomIzQzOyAqICAgVGhlIG51bWJlciBvZiBwYWdlcyBhY3R1YWxseSByZWNsYWltZWQsIG9yIDAgaWYgQHNpemUgaXMgc21hbGxlcgomIzQzOyAqICAgdGhhbiBhIHBhZ2UsIEBzd2FwcGluZXNzIGlzIG91dCBvZiByYW5nZSwgb3IgdGhlIGNhbGxpbmcgdGFzayBpcwomIzQzOyAqICAgYWxyZWFkeSBpbiBhIHJlY2xhaW0vZnJlZWluZyBjb250ZXh0IChQRl9NRU1BTExPQykuCiYjNDM7ICovCiYjNDM7X19icGZfa2Z1bmMgdW5zaWduZWQgbG9uZwomIzQzO2JwZl9wcm9hY3RpdmVfcmVjbGFpbV9zd2FwcGluZXNzKHN0cnVjdCBtZW1fY2dyb3VwICptZW1jZywgdW5zaWduZWQgbG9uZyBzaXplLAomIzQzOwkJCQkgaW50IHN3YXBwaW5lc3MpCiYjNDM7ewomIzQzOwlpZiAoc3dhcHBpbmVzcyAmbHQ7IE1JTl9TV0FQUElORVNTIHx8IHN3YXBwaW5lc3MgJmd0OyBTV0FQUElORVNTX0FOT05fT05MWSkKJiM0MzsJCXJldHVybiAwOwomIzQzOwomIzQzOwlyZXR1cm4gYnBmX3Byb2FjdGl2ZV9yZWNsYWltX3BhZ2VzKG1lbWNnLCBzaXplIC8gUEFHRV9TSVpFLAomIzQzOwkJCQkJICAgJmFtcDtzd2FwcGluZXNzKTsKJiM0Mzt9CiYjNDM7CiBfX2JwZl9rZnVuY19lbmRfZGVmcygpOwogCiBCVEZfS0ZVTkNTX1NUQVJUKGJwZl9tZW1jb250cm9sX2tmdW5jcykKQEAgLTE3Miw2ICYjNDM7MjcwLDkgQEAgQlRGX0lEX0ZMQUdTKGZ1bmMsIGJwZl9tZW1fY2dyb3VwX3VzYWdlKQogQlRGX0lEX0ZMQUdTKGZ1bmMsIGJwZl9tZW1fY2dyb3VwX3BhZ2Vfc3RhdGUpCiBCVEZfSURfRkxBR1MoZnVuYywgYnBmX21lbV9jZ3JvdXBfZmx1c2hfc3RhdHMsIEtGX1NMRUVQQUJMRSkKIAomIzQzO0JURl9JRF9GTEFHUyhmdW5jLCBicGZfcHJvYWN0aXZlX3JlY2xhaW0sIEtGX1NMRUVQQUJMRSkKJiM0MztCVEZfSURfRkxBR1MoZnVuYywgYnBmX3Byb2FjdGl2ZV9yZWNsYWltX3N3YXBwaW5lc3MsIEtGX1NMRUVQQUJMRSkKJiM0MzsKIEJURl9LRlVOQ1NfRU5EKGJwZl9tZW1jb250cm9sX2tmdW5jcykKIAogc3RhdGljIGNvbnN0IHN0cnVjdCBidGZfa2Z1bmNfaWRfc2V0IGJwZl9tZW1jb250cm9sX2tmdW5jX3NldCA9IHsKZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9wcm9nX3Rlc3RzL21lbWNnX2FzeW5jX3JlY2xhaW0uYyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9wcm9nX3Rlc3RzL21lbWNnX2FzeW5jX3JlY2xhaW0uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMDAwMDAwLi5lOTkwZDFmZGM3OWZkCi0tLSAvZGV2L251bGwKJiM0MzsmIzQzOyYjNDM7IGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dfdGVzdHMvbWVtY2dfYXN5bmNfcmVjbGFpbS5jCkBAIC0wLDAgJiM0MzsxLDQ3OSBAQAomIzQzOy8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4wCiYjNDM7LyoKJiM0MzsgKiBNZW1vcnkgY29udHJvbGxlciBlQlBGIGFzeW5jIHJlY2xhaW0gdGVzdAomIzQzOyAqLwomIzQzOwomIzQzOyNpbmNsdWRlICZsdDt0ZXN0X3Byb2dzLmgmZ3Q7CiYjNDM7I2luY2x1ZGUgJmx0O3N5cy9tbWFuLmgmZ3Q7CiYjNDM7I2luY2x1ZGUgJmx0O3N5cy9zdGF0LmgmZ3Q7CiYjNDM7I2luY2x1ZGUgJmx0O3N5cy92ZnMuaCZndDsKJiM0MzsjaW5jbHVkZSAmbHQ7c3lzL3dhaXQuaCZndDsKJiM0MzsjaW5jbHVkZSAmbHQ7ZmNudGwuaCZndDsKJiM0MzsjaW5jbHVkZSAmbHQ7c2lnbmFsLmgmZ3Q7CiYjNDM7I2luY2x1ZGUgJmx0O3RpbWUuaCZndDsKJiM0MzsjaW5jbHVkZSAmbHQ7dW5pc3RkLmgmZ3Q7CiYjNDM7I2luY2x1ZGUgJmx0O3N0ZGlvLmgmZ3Q7CiYjNDM7I2luY2x1ZGUgJmx0O3N0ZGxpYi5oJmd0OwomIzQzOyNpbmNsdWRlICZsdDtzdHJpbmcuaCZndDsKJiM0MzsjaW5jbHVkZSAmbHQ7bGltaXRzLmgmZ3Q7CiYjNDM7I2luY2x1ZGUgJmx0O2xpbnV4L21hZ2ljLmgmZ3Q7CiYjNDM7CiYjNDM7I2luY2x1ZGUgJiMzNDtjZ3JvdXBfaGVscGVycy5oJiMzNDsKJiM0MzsKJiM0MztzdHJ1Y3QgYnBmX2FyZ3NfcyB7CiYjNDM7CXU2NCBoaWdoX2Nncm91cF9pZDsKJiM0MzsJdTY0IGxvd19jZ3JvdXBfaWQ7CiYjNDM7CXU2NCBldmVudF9kZWx0YV90aHJlc2hvbGQ7CiYjNDM7CXU2NCBjaGVja19uczsKJiM0Mzt9OwomIzQzOwomIzQzOyNpbmNsdWRlICYjMzQ7bWVtY2dfYXN5bmNfcmVjbGFpbS5za2VsLmgmIzM0OwomIzQzOwomIzQzOyNkZWZpbmUgRklMRV9TSVpFICgzMiAqIDEwMjQgKiAxMDI0dWwpCiYjNDM7I2RlZmluZSBCVUZGRVJfU0laRSAoNDA5NikKJiM0MzsjZGVmaW5lIENHX0xJTUlUICgzMiAqIDEwMjQgKiAxMDI0dWwpCiYjNDM7I2RlZmluZSBSRUFEX1RJTUVTIDUwCiYjNDM7CiYjNDM7I2RlZmluZSBDR19ESVIgJiMzNDsvbWVtY2dfYXN5bmNfcmVjbGFpbSYjMzQ7CiYjNDM7I2RlZmluZSBDR19ISUdIX0RJUiBDR19ESVIgJiMzNDsvaGlnaCYjMzQ7CiYjNDM7I2RlZmluZSBDR19MT1dfRElSIENHX0RJUiAmIzM0Oy9sb3cmIzM0OwomIzQzOwomIzQzOyNkZWZpbmUgQ0hFQ0tfUEVSSU9EX05TICgyICogMTAwMCAqIDEwMDB1bGwpCiYjNDM7I2RlZmluZSBFVkVOVF9ERUxUQV9USFJFU0hPTEQgMQomIzQzOwomIzQzOy8qCiYjNDM7ICogVGhlIHdvcmtsb2FkIGZpbGVzIG11c3Qgc2l0IG9uIGEgcmVndWxhciBmaWxlc3lzdGVtOiB3aXRoIHN3YXAKJiM0MzsgKiBkaXNhYmxlZCBmb3IgdGhlIGNncm91cCwgdG1wZnMvcmFtZnMgcGFnZXMgYXJlIHVuZXZpY3RhYmxlIGFuZCB3b3VsZAomIzQzOyAqIE9PTSB0aGUgY2dyb3VwIGluc3RlYWQgb2YgZXhlcmNpc2luZyByZWNsYWltOyB0aGV5IGFyZSBhbHNvIGNoYXJnZWQKJiM0MzsgKiBhcyBhbm9ueW1vdXMgbWVtb3J5LCBzbyB0aGV5IG5ldmVyIHJhaXNlIHRoZSBXT1JLSU5HU0VUX1JFRkFVTFRfRklMRQomIzQzOyAqIGV2ZW50cyB0aGUgQlBGIHByb2dyYW0gbW9uaXRvcnMuIEZhbGwgYmFjayB0byB0aGUgY3VycmVudCBkaXJlY3RvcnkKJiM0MzsgKiB3aGVuIC90bXAgaXMgYmFja2VkIGJ5IHN1Y2ggYSBmaWxlc3lzdGVtLgomIzQzOyAqLwomIzQzO3N0YXRpYyBjb25zdCBjaGFyICp3b3JrbG9hZF9maWxlc19kaXIodm9pZCkKJiM0Mzt7CiYjNDM7CXN0cnVjdCBzdGF0ZnMgc3Q7CiYjNDM7CiYjNDM7CWlmICghc3RhdGZzKCYjMzQ7L3RtcCYjMzQ7LCAmYW1wO3N0KSAmYW1wOyZhbXA7CiYjNDM7CSAgICAoc3QuZl90eXBlID09IFRNUEZTX01BR0lDIHx8IHN0LmZfdHlwZSA9PSBSQU1GU19NQUdJQykpCiYjNDM7CQlyZXR1cm4gJiMzNDsuJiMzNDs7CiYjNDM7CXJldHVybiAmIzM0Oy90bXAmIzM0OzsKJiM0Mzt9CiYjNDM7CiYjNDM7LyoKJiM0MzsgKiBUaGUgd29ya2xvYWQgY2hpbGRyZW4gcnVuIGFmdGVyIHRlc3RfcHJvZ3MgaGlqYWNrZWQgc3RkaW8sIHNvCiYjNDM7ICogYW55dGhpbmcgdGhleSBwcmludCBpcyBsb3N0IHdpdGggdGhlaXIgcHJpdmF0ZSBjb3B5IG9mIHRoZSBoaWphY2tlZAomIzQzOyAqIGJ1ZmZlci4gVGhlIGV4aXQgc3RhdHVzIGlzIHRoZSBvbmx5IGRpYWdub3N0aWNzIGNoYW5uZWwgdGhhdCByZWFjaGVzCiYjNDM7ICogdGhlIHBhcmVudCwgc28gZWFjaCBmYWlsaW5nIHN0ZXAgZ2V0cyBpdHMgb3duIGNvZGUuCiYjNDM7ICovCiYjNDM7ZW51bSBjaGlsZF9leGl0X2NvZGUgewomIzQzOwlDSElMRF9FWElUX09LID0gMCwKJiM0MzsJQ0hJTERfRVhJVF9KT0lOX0NHUk9VUCwKJiM0MzsJQ0hJTERfRVhJVF9XUklURV9GSUxFLAomIzQzOwlDSElMRF9FWElUX1JFQURfRklMRSwKJiM0MzsJQ0hJTERfRVhJVF9USU1FX0ZJTEUsCiYjNDM7fTsKJiM0MzsKJiM0MztzdGF0aWMgY29uc3QgY2hhciAqY2hpbGRfZXhpdF9zdHIoaW50IGNvZGUpCiYjNDM7ewomIzQzOwlzd2l0Y2ggKGNvZGUpIHsKJiM0MzsJY2FzZSBDSElMRF9FWElUX09LOgomIzQzOwkJcmV0dXJuICYjMzQ7c3VjY2VzcyYjMzQ7OwomIzQzOwljYXNlIENISUxEX0VYSVRfSk9JTl9DR1JPVVA6CiYjNDM7CQlyZXR1cm4gJiMzNDtqb2luIGNncm91cCYjMzQ7OwomIzQzOwljYXNlIENISUxEX0VYSVRfV1JJVEVfRklMRToKJiM0MzsJCXJldHVybiAmIzM0O3dyaXRlIGRhdGEgZmlsZSYjMzQ7OwomIzQzOwljYXNlIENISUxEX0VYSVRfUkVBRF9GSUxFOgomIzQzOwkJcmV0dXJuICYjMzQ7cmVhZCBkYXRhIGZpbGUmIzM0OzsKJiM0MzsJY2FzZSBDSElMRF9FWElUX1RJTUVfRklMRToKJiM0MzsJCXJldHVybiAmIzM0O3dyaXRlIHRpbWUgZmlsZSYjMzQ7OwomIzQzOwlkZWZhdWx0OgomIzQzOwkJcmV0dXJuICYjMzQ7dW5rbm93biYjMzQ7OwomIzQzOwl9CiYjNDM7fQomIzQzOwomIzQzO3N0YXRpYyBpbnQgc2V0dXBfaGlnaF9sb3dfY2dyb3Vwcyh1NjQgKmhpZ2hfY2dyb3VwX2lkLCB1NjQgKmxvd19jZ3JvdXBfaWQpCiYjNDM7ewomIzQzOwlpbnQgcmV0OwomIzQzOwljaGFyIGxpbWl0X2J1ZlsyMF07CiYjNDM7CiYjNDM7CXJldCA9IHNldHVwX2Nncm91cF9lbnZpcm9ubWVudCgpOwomIzQzOwlpZiAoIUFTU0VSVF9PSyhyZXQsICYjMzQ7c2V0dXBfY2dyb3VwX2Vudmlyb25tZW50JiMzNDspKQomIzQzOwkJZ290byBjbGVhbnVwOwomIzQzOwomIzQzOwlyZXQgPSBjcmVhdGVfYW5kX2dldF9jZ3JvdXAoQ0dfRElSKTsKJiM0MzsJaWYgKCFBU1NFUlRfR0UocmV0LCAwLCAmIzM0O2NyZWF0ZV9hbmRfZ2V0X2Nncm91cCAmIzM0OyBDR19ESVIpKQomIzQzOwkJZ290byBjbGVhbnVwOwomIzQzOwljbG9zZShyZXQpOwomIzQzOwomIzQzOwlyZXQgPSBlbmFibGVfY29udHJvbGxlcnMoQ0dfRElSLCAmIzM0O21lbW9yeSYjMzQ7KTsKJiM0MzsJaWYgKCFBU1NFUlRfT0socmV0LCAmIzM0O2VuYWJsZV9jb250cm9sbGVycyYjMzQ7KSkKJiM0MzsJCWdvdG8gY2xlYW51cDsKJiM0MzsKJiM0MzsJc25wcmludGYobGltaXRfYnVmLCBzaXplb2YobGltaXRfYnVmKSwgJiMzNDslbHUmIzM0OywgQ0dfTElNSVQpOwomIzQzOwlyZXQgPSB3cml0ZV9jZ3JvdXBfZmlsZShDR19ESVIsICYjMzQ7bWVtb3J5Lm1heCYjMzQ7LCBsaW1pdF9idWYpOwomIzQzOwlpZiAoIUFTU0VSVF9PSyhyZXQsICYjMzQ7d3JpdGVfY2dyb3VwX2ZpbGUgbWVtb3J5Lm1heCYjMzQ7KSkKJiM0MzsJCWdvdG8gY2xlYW51cDsKJiM0MzsKJiM0MzsJLyoKJiM0MzsJICogS2VlcCB0aGUgd29ya2xvYWRzIGZyb20gc3dhcHBpbmcgb3V0LiBXaXRoIENPTkZJR19TV0FQPW4gdGhlCiYjNDM7CSAqIG1lbW9yeS5zd2FwLm1heCBmaWxlIGRvZXMgbm90IGV4aXN0LCBhbmQgbm8gc3dhcCBjYW4gaGFwcGVuCiYjNDM7CSAqIGFueXdheSwgc28gc2tpcCB0aGUgd3JpdGUuCiYjNDM7CSAqLwomIzQzOwlpZiAoIWFjY2VzcygmIzM0Oy9wcm9jL3N3YXBzJiMzNDssIEZfT0spKSB7CiYjNDM7CQlyZXQgPSB3cml0ZV9jZ3JvdXBfZmlsZShDR19ESVIsICYjMzQ7bWVtb3J5LnN3YXAubWF4JiMzNDssICYjMzQ7MCYjMzQ7KTsKJiM0MzsJCWlmICghQVNTRVJUX09LKHJldCwgJiMzNDt3cml0ZV9jZ3JvdXBfZmlsZSBtZW1vcnkuc3dhcC5tYXgmIzM0OykpCiYjNDM7CQkJZ290byBjbGVhbnVwOwomIzQzOwl9CiYjNDM7CiYjNDM7CXJldCA9IGNyZWF0ZV9hbmRfZ2V0X2Nncm91cChDR19ISUdIX0RJUik7CiYjNDM7CWlmICghQVNTRVJUX0dFKHJldCwgMCwgJiMzNDtjcmVhdGVfYW5kX2dldF9jZ3JvdXAgJiMzNDsgQ0dfSElHSF9ESVIpKQomIzQzOwkJZ290byBjbGVhbnVwOwomIzQzOwljbG9zZShyZXQpOwomIzQzOwomIzQzOwkqaGlnaF9jZ3JvdXBfaWQgPSBnZXRfY2dyb3VwX2lkKENHX0hJR0hfRElSKTsKJiM0MzsJaWYgKCFBU1NFUlRfR1QoKmhpZ2hfY2dyb3VwX2lkLCAwLCAmIzM0O2dldF9jZ3JvdXBfaWQmIzM0OykpCiYjNDM7CQlnb3RvIGNsZWFudXA7CiYjNDM7CiYjNDM7CXJldCA9IGNyZWF0ZV9hbmRfZ2V0X2Nncm91cChDR19MT1dfRElSKTsKJiM0MzsJaWYgKCFBU1NFUlRfR0UocmV0LCAwLCAmIzM0O2NyZWF0ZV9hbmRfZ2V0X2Nncm91cCAmIzM0OyBDR19MT1dfRElSKSkKJiM0MzsJCWdvdG8gY2xlYW51cDsKJiM0MzsJY2xvc2UocmV0KTsKJiM0MzsKJiM0MzsJKmxvd19jZ3JvdXBfaWQgPSBnZXRfY2dyb3VwX2lkKENHX0xPV19ESVIpOwomIzQzOwlpZiAoIUFTU0VSVF9HVCgqbG93X2Nncm91cF9pZCwgMCwgJiMzNDtnZXRfY2dyb3VwX2lkJiMzNDspKQomIzQzOwkJZ290byBjbGVhbnVwOwomIzQzOwomIzQzOwlyZXR1cm4gMDsKJiM0MzsKJiM0MztjbGVhbnVwOgomIzQzOwljbGVhbnVwX2Nncm91cF9lbnZpcm9ubWVudCgpOwomIzQzOwlyZXR1cm4gLTE7CiYjNDM7fQomIzQzOwomIzQzO3N0YXRpYyBpbnQgd3JpdGVfZmlsZShjb25zdCBjaGFyICpmaWxlbmFtZSkKJiM0Mzt7CiYjNDM7CWludCByZXQgPSAtMTsKJiM0MzsJc2l6ZV90IHdyaXR0ZW4gPSAwOwomIzQzOwljaGFyICpidWZmZXI7CiYjNDM7CUZJTEUgKmZwOwomIzQzOwomIzQzOwlmcCA9IGZvcGVuKGZpbGVuYW1lLCAmIzM0O3diJiMzNDspOwomIzQzOwlpZiAoIWZwKQomIzQzOwkJZ290byBvdXQ7CiYjNDM7CiYjNDM7CWJ1ZmZlciA9IG1hbGxvYyhCVUZGRVJfU0laRSk7CiYjNDM7CWlmICghYnVmZmVyKQomIzQzOwkJZ290byBjbGVhbnVwX2ZwOwomIzQzOwomIzQzOwltZW1zZXQoYnVmZmVyLCAmIzM5O0EmIzM5OywgQlVGRkVSX1NJWkUpOwomIzQzOwomIzQzOwl3aGlsZSAod3JpdHRlbiAmbHQ7IEZJTEVfU0laRSkgewomIzQzOwkJc2l6ZV90IHRvX3dyaXRlID0gRklMRV9TSVpFIC0gd3JpdHRlbiAmbHQ7IEJVRkZFUl9TSVpFID8KJiM0MzsJCQkJICBGSUxFX1NJWkUgLSB3cml0dGVuIDogQlVGRkVSX1NJWkU7CiYjNDM7CiYjNDM7CQlpZiAoZndyaXRlKGJ1ZmZlciwgMSwgdG9fd3JpdGUsIGZwKSAhPSB0b193cml0ZSkKJiM0MzsJCQlnb3RvIGNsZWFudXA7CiYjNDM7CQl3cml0dGVuICYjNDM7PSB0b193cml0ZTsKJiM0MzsJfQomIzQzOwomIzQzOwlyZXQgPSAwOwomIzQzO2NsZWFudXA6CiYjNDM7CWZyZWUoYnVmZmVyKTsKJiM0MztjbGVhbnVwX2ZwOgomIzQzOwlmY2xvc2UoZnApOwomIzQzO291dDoKJiM0MzsJcmV0dXJuIHJldDsKJiM0Mzt9CiYjNDM7CiYjNDM7c3RhdGljIGludCByZWFkX2ZpbGUoY29uc3QgY2hhciAqZmlsZW5hbWUsIGludCBpdGVyYXRpb25zKQomIzQzO3sKJiM0MzsJaW50IHJldCA9IC0xOwomIzQzOwlsb25nIHBhZ2Vfc2l6ZSA9IHN5c2NvbmYoX1NDX1BBR0VTSVpFKTsKJiM0MzsJY2hhciAqbWFwOwomIzQzOwlzaXplX3QgaTsKJiM0MzsJaW50IGZkOwomIzQzOwlzdHJ1Y3Qgc3RhdCBzYjsKJiM0MzsKJiM0MzsJZmQgPSBvcGVuKGZpbGVuYW1lLCBPX1JET05MWSk7CiYjNDM7CWlmIChmZCA9PSAtMSkKJiM0MzsJCWdvdG8gb3V0OwomIzQzOwomIzQzOwlpZiAoZnN0YXQoZmQsICZhbXA7c2IpID09IC0xKQomIzQzOwkJZ290byBjbGVhbnVwX2ZkOwomIzQzOwomIzQzOwlpZiAoc2Iuc3Rfc2l6ZSAhPSBGSUxFX1NJWkUpIHsKJiM0MzsJCWZwcmludGYoc3RkZXJyLCAmIzM0O0ZpbGUgc2l6ZSBtaXNtYXRjaDogZXhwZWN0ZWQgJWx1LCBnb3QgJWx1XG4mIzM0OywKJiM0MzsJCQkodW5zaWduZWQgbG9uZylGSUxFX1NJWkUsICh1bnNpZ25lZCBsb25nKXNiLnN0X3NpemUpOwomIzQzOwkJZ290byBjbGVhbnVwX2ZkOwomIzQzOwl9CiYjNDM7CiYjNDM7CW1hcCA9IG1tYXAoTlVMTCwgRklMRV9TSVpFLCBQUk9UX1JFQUQsIE1BUF9QUklWQVRFLCBmZCwgMCk7CiYjNDM7CWlmIChtYXAgPT0gTUFQX0ZBSUxFRCkKJiM0MzsJCWdvdG8gY2xlYW51cF9mZDsKJiM0MzsKJiM0MzsJZm9yIChpbnQgaXRlciA9IDA7IGl0ZXIgJmx0OyBpdGVyYXRpb25zOyBpdGVyJiM0MzsmIzQzOykgewomIzQzOwkJZm9yIChpID0gMDsgaSAmbHQ7IEZJTEVfU0laRTsgaSAmIzQzOz0gcGFnZV9zaXplKSB7CiYjNDM7CQkJLyogYWNjZXNzIGEgYnl0ZSB0byB0cmlnZ2VyIHBhZ2UgZmF1bHQgKi8KJiM0MzsJCQl2b2xhdGlsZSBjaGFyIHYgPSBtYXBbaV07CiYjNDM7CQkJKHZvaWQpdjsKJiM0MzsJCX0KJiM0MzsJfQomIzQzOwomIzQzOwlpZiAobXVubWFwKG1hcCwgRklMRV9TSVpFKSA9PSAtMSkKJiM0MzsJCWdvdG8gY2xlYW51cF9mZDsKJiM0MzsKJiM0MzsJcmV0ID0gMDsKJiM0MzsKJiM0MztjbGVhbnVwX2ZkOgomIzQzOwljbG9zZShmZCk7CiYjNDM7b3V0OgomIzQzOwlyZXR1cm4gcmV0OwomIzQzO30KJiM0MzsKJiM0MztzdGF0aWMgaW50IHJlYWxfdGVzdF9jaGlsZF93b3JrKGNvbnN0IGNoYXIgKmNncm91cF9wYXRoLCBjaGFyICpkYXRhX2ZpbGVuYW1lLAomIzQzOwkJCQljaGFyICp0aW1lX2ZpbGVuYW1lLCBpbnQgcmVhZF90aW1lcykKJiM0Mzt7CiYjNDM7CXN0cnVjdCB0aW1lc3BlYyBzdGFydCwgZW5kOwomIzQzOwlkb3VibGUgZWxhcHNlZDsKJiM0MzsJRklMRSAqZnA7CiYjNDM7CiYjNDM7CWlmIChqb2luX3BhcmVudF9jZ3JvdXAoY2dyb3VwX3BhdGgpKQomIzQzOwkJcmV0dXJuIENISUxEX0VYSVRfSk9JTl9DR1JPVVA7CiYjNDM7CiYjNDM7CWNsb2NrX2dldHRpbWUoQ0xPQ0tfTU9OT1RPTklDLCAmYW1wO3N0YXJ0KTsKJiM0MzsKJiM0MzsJaWYgKHdyaXRlX2ZpbGUoZGF0YV9maWxlbmFtZSkpCiYjNDM7CQlyZXR1cm4gQ0hJTERfRVhJVF9XUklURV9GSUxFOwomIzQzOwomIzQzOwlpZiAocmVhZF9maWxlKGRhdGFfZmlsZW5hbWUsIHJlYWRfdGltZXMpKQomIzQzOwkJcmV0dXJuIENISUxEX0VYSVRfUkVBRF9GSUxFOwomIzQzOwomIzQzOwljbG9ja19nZXR0aW1lKENMT0NLX01PTk9UT05JQywgJmFtcDtlbmQpOwomIzQzOwomIzQzOwlpZiAoIXRpbWVfZmlsZW5hbWUpCiYjNDM7CQlyZXR1cm4gQ0hJTERfRVhJVF9PSzsKJiM0MzsKJiM0MzsJZWxhcHNlZCA9IChlbmQudHZfc2VjIC0gc3RhcnQudHZfc2VjKSAmIzQzOwomIzQzOwkJICAoZW5kLnR2X25zZWMgLSBzdGFydC50dl9uc2VjKSAvIDEwMDAwMDAwMDAuMDsKJiM0MzsJcHJpbnRmKCYjMzQ7JS42ZlxuJiMzNDssIGVsYXBzZWQpOwomIzQzOwomIzQzOwlmcCA9IGZvcGVuKHRpbWVfZmlsZW5hbWUsICYjMzQ7dyYjMzQ7KTsKJiM0MzsJaWYgKCFmcCkKJiM0MzsJCXJldHVybiBDSElMRF9FWElUX1RJTUVfRklMRTsKJiM0MzsJZnByaW50ZihmcCwgJiMzNDslLjZmJiMzNDssIGVsYXBzZWQpOwomIzQzOwlmY2xvc2UoZnApOwomIzQzOwomIzQzOwlyZXR1cm4gQ0hJTERfRVhJVF9PSzsKJiM0Mzt9CiYjNDM7CiYjNDM7c3RhdGljIGludCBnZXRfdGltZShjaGFyICp0aW1lX2ZpbGVuYW1lLCBkb3VibGUgKnRpbWUpCiYjNDM7ewomIzQzOwlpbnQgcmV0ID0gLTE7CiYjNDM7CUZJTEUgKmZwOwomIzQzOwljaGFyIGJ1Zls2NF07CiYjNDM7CiYjNDM7CWZwID0gZm9wZW4odGltZV9maWxlbmFtZSwgJiMzNDtyJiMzNDspOwomIzQzOwlpZiAoIUFTU0VSVF9PS19QVFIoZnAsICYjMzQ7Zm9wZW4mIzM0OykpCiYjNDM7CQlnb3RvIG91dDsKJiM0MzsKJiM0MzsJaWYgKCFBU1NFUlRfT0tfUFRSKGZnZXRzKGJ1Ziwgc2l6ZW9mKGJ1ZiksIGZwKSwgJiMzNDtmZ2V0cyYjMzQ7KSkKJiM0MzsJCWdvdG8gY2xlYW51cDsKJiM0MzsKJiM0MzsJaWYgKHNzY2FuZihidWYsICYjMzQ7JWxmJiMzNDssIHRpbWUpICE9IDEpIHsKJiM0MzsJCVBSSU5UX0ZBSUwoJiMzNDtzc2NhbmYgJXMmIzM0OywgYnVmKTsKJiM0MzsJCWdvdG8gY2xlYW51cDsKJiM0MzsJfQomIzQzOwomIzQzOwlyZXQgPSAwOwomIzQzO2NsZWFudXA6CiYjNDM7CWZjbG9zZShmcCk7CiYjNDM7b3V0OgomIzQzOwlyZXR1cm4gcmV0OwomIzQzO30KJiM0MzsKJiM0MztzdGF0aWMgaW50CiYjNDM7cnVuX2hpZ2hfbG93X3dvcmtsb2FkKGRvdWJsZSAqaGlnaF9lbGFwc2VkLCBkb3VibGUgKmxvd19lbGFwc2VkLCBpbnQgcmVhZF90aW1lcykKJiM0Mzt7CiYjNDM7CWNoYXIgaGlnaF9kYXRhX2ZpbGVbUEFUSF9NQVhdOwomIzQzOwljaGFyIGxvd19kYXRhX2ZpbGVbUEFUSF9NQVhdOwomIzQzOwljaGFyIGhpZ2hfdGltZV9maWxlW1BBVEhfTUFYXTsKJiM0MzsJY2hhciBsb3dfdGltZV9maWxlW1BBVEhfTUFYXTsKJiM0MzsJY29uc3QgY2hhciAqZGlyID0gd29ya2xvYWRfZmlsZXNfZGlyKCk7CiYjNDM7CXBpZF90IGhpZ2hfcGlkID0gLTEsIGxvd19waWQgPSAtMTsKJiM0MzsJaW50IGZkLCBzdGF0dXM7CiYjNDM7CWludCByZXQgPSAtMTsKJiM0MzsKJiM0MzsJc25wcmludGYoaGlnaF9kYXRhX2ZpbGUsIHNpemVvZihoaWdoX2RhdGFfZmlsZSksCiYjNDM7CQkgJiMzNDslcy9tZW1jZ19hc3luY19oaWdoX2RhdGFfWFhYWFhYJiMzNDssIGRpcik7CiYjNDM7CXNucHJpbnRmKGxvd19kYXRhX2ZpbGUsIHNpemVvZihsb3dfZGF0YV9maWxlKSwKJiM0MzsJCSAmIzM0OyVzL21lbWNnX2FzeW5jX2xvd19kYXRhX1hYWFhYWCYjMzQ7LCBkaXIpOwomIzQzOwlzbnByaW50ZihoaWdoX3RpbWVfZmlsZSwgc2l6ZW9mKGhpZ2hfdGltZV9maWxlKSwKJiM0MzsJCSAmIzM0OyVzL21lbWNnX2FzeW5jX2hpZ2hfdGltZV9YWFhYWFgmIzM0OywgZGlyKTsKJiM0MzsJc25wcmludGYobG93X3RpbWVfZmlsZSwgc2l6ZW9mKGxvd190aW1lX2ZpbGUpLAomIzQzOwkJICYjMzQ7JXMvbWVtY2dfYXN5bmNfbG93X3RpbWVfWFhYWFhYJiMzNDssIGRpcik7CiYjNDM7CiYjNDM7CWZkID0gbWtzdGVtcChoaWdoX2RhdGFfZmlsZSk7CiYjNDM7CWlmICghQVNTRVJUX0dFKGZkLCAwLCAmIzM0O21rc3RlbXAmIzM0OykpCiYjNDM7CQlnb3RvIGNsZWFudXA7CiYjNDM7CWNsb3NlKGZkKTsKJiM0MzsKJiM0MzsJZmQgPSBta3N0ZW1wKGxvd19kYXRhX2ZpbGUpOwomIzQzOwlpZiAoIUFTU0VSVF9HRShmZCwgMCwgJiMzNDtta3N0ZW1wJiMzNDspKQomIzQzOwkJZ290byBjbGVhbnVwOwomIzQzOwljbG9zZShmZCk7CiYjNDM7CiYjNDM7CWZkID0gbWtzdGVtcChoaWdoX3RpbWVfZmlsZSk7CiYjNDM7CWlmICghQVNTRVJUX0dFKGZkLCAwLCAmIzM0O21rc3RlbXAmIzM0OykpCiYjNDM7CQlnb3RvIGNsZWFudXA7CiYjNDM7CWNsb3NlKGZkKTsKJiM0MzsKJiM0MzsJZmQgPSBta3N0ZW1wKGxvd190aW1lX2ZpbGUpOwomIzQzOwlpZiAoIUFTU0VSVF9HRShmZCwgMCwgJiMzNDtta3N0ZW1wJiMzNDspKQomIzQzOwkJZ290byBjbGVhbnVwOwomIzQzOwljbG9zZShmZCk7CiYjNDM7CiYjNDM7CWxvd19waWQgPSBmb3JrKCk7CiYjNDM7CWlmICghQVNTRVJUX0dFKGxvd19waWQsIDAsICYjMzQ7Zm9yayBsb3cmIzM0OykpCiYjNDM7CQlnb3RvIGNsZWFudXA7CiYjNDM7CWlmIChsb3dfcGlkID09IDApCiYjNDM7CQlleGl0KHJlYWxfdGVzdF9jaGlsZF93b3JrKENHX0xPV19ESVIsIGxvd19kYXRhX2ZpbGUsCiYjNDM7CQkJCQkgIGxvd190aW1lX2ZpbGUsIHJlYWRfdGltZXMpKTsKJiM0MzsKJiM0MzsJaGlnaF9waWQgPSBmb3JrKCk7CiYjNDM7CWlmICghQVNTRVJUX0dFKGhpZ2hfcGlkLCAwLCAmIzM0O2ZvcmsgaGlnaCYjMzQ7KSkKJiM0MzsJCWdvdG8gY2xlYW51cDsKJiM0MzsJaWYgKGhpZ2hfcGlkID09IDApCiYjNDM7CQlleGl0KHJlYWxfdGVzdF9jaGlsZF93b3JrKENHX0hJR0hfRElSLCBoaWdoX2RhdGFfZmlsZSwKJiM0MzsJCQkJCSAgaGlnaF90aW1lX2ZpbGUsIHJlYWRfdGltZXMpKTsKJiM0MzsKJiM0MzsJbG93X3BpZCA9IHdhaXRwaWQobG93X3BpZCwgJmFtcDtzdGF0dXMsIDApOwomIzQzOwlpZiAoIUFTU0VSVF9HVChsb3dfcGlkLCAwLCAmIzM0O2xvdyB3YWl0cGlkJiMzNDspKQomIzQzOwkJZ290byBjbGVhbnVwOwomIzQzOwkvKgomIzQzOwkgKiBUaGUgY2hpbGQgaGFzIGJlZW4gcmVhcGVkIGFuZCBpdHMgUElEIGNhbiBhbHJlYWR5IGJlIHJldXNlZCwKJiM0MzsJICogc28gbWFyayBpdCB0byBrZWVwIGNsZWFudXAgZnJvbSBzaWduYWxpbmcgYW4gdW5yZWxhdGVkIHByb2Nlc3MuCiYjNDM7CSAqLwomIzQzOwlsb3dfcGlkID0gLTE7CiYjNDM7CWlmICghQVNTRVJUX1RSVUUoV0lGRVhJVEVEKHN0YXR1cyksICYjMzQ7bG93IGV4aXRlZCYjMzQ7KSkKJiM0MzsJCWdvdG8gY2xlYW51cDsKJiM0MzsJaWYgKFdFWElUU1RBVFVTKHN0YXR1cykgIT0gQ0hJTERfRVhJVF9PSykgewomIzQzOwkJUFJJTlRfRkFJTCgmIzM0O2xvdyBjaGlsZCBmYWlsZWQgYXQ6ICVzIChleGl0IHN0YXR1cyAlZCkmIzM0OywKJiM0MzsJCQkgICBjaGlsZF9leGl0X3N0cihXRVhJVFNUQVRVUyhzdGF0dXMpKSwKJiM0MzsJCQkgICBXRVhJVFNUQVRVUyhzdGF0dXMpKTsKJiM0MzsJCWdvdG8gY2xlYW51cDsKJiM0MzsJfQomIzQzOwomIzQzOwloaWdoX3BpZCA9IHdhaXRwaWQoaGlnaF9waWQsICZhbXA7c3RhdHVzLCAwKTsKJiM0MzsJaWYgKCFBU1NFUlRfR1QoaGlnaF9waWQsIDAsICYjMzQ7aGlnaCB3YWl0cGlkJiMzNDspKQomIzQzOwkJZ290byBjbGVhbnVwOwomIzQzOwkvKiBTYW1lIGFzIGFib3ZlOiB0aGUgcmVhcGVkIFBJRCBtdXN0IG5vdCBiZSBzaWduYWxlZCBhZ2Fpbi4gKi8KJiM0MzsJaGlnaF9waWQgPSAtMTsKJiM0MzsJaWYgKCFBU1NFUlRfVFJVRShXSUZFWElURUQoc3RhdHVzKSwgJiMzNDtoaWdoIGV4aXRlZCYjMzQ7KSkKJiM0MzsJCWdvdG8gY2xlYW51cDsKJiM0MzsJaWYgKFdFWElUU1RBVFVTKHN0YXR1cykgIT0gQ0hJTERfRVhJVF9PSykgewomIzQzOwkJUFJJTlRfRkFJTCgmIzM0O2hpZ2ggY2hpbGQgZmFpbGVkIGF0OiAlcyAoZXhpdCBzdGF0dXMgJWQpJiMzNDssCiYjNDM7CQkJICAgY2hpbGRfZXhpdF9zdHIoV0VYSVRTVEFUVVMoc3RhdHVzKSksCiYjNDM7CQkJICAgV0VYSVRTVEFUVVMoc3RhdHVzKSk7CiYjNDM7CQlnb3RvIGNsZWFudXA7CiYjNDM7CX0KJiM0MzsKJiM0MzsJaWYgKGdldF90aW1lKGhpZ2hfdGltZV9maWxlLCBoaWdoX2VsYXBzZWQpKQomIzQzOwkJZ290byBjbGVhbnVwOwomIzQzOwlpZiAoZ2V0X3RpbWUobG93X3RpbWVfZmlsZSwgbG93X2VsYXBzZWQpKQomIzQzOwkJZ290byBjbGVhbnVwOwomIzQzOwomIzQzOwlyZXQgPSAwOwomIzQzOwomIzQzO2NsZWFudXA6CiYjNDM7CS8qIE9uIGZhaWx1cmUsIG1ha2Ugc3VyZSBubyBjaGlsZCBwcm9jZXNzIGlzIGxlZnQgYmVoaW5kICovCiYjNDM7CWlmIChyZXQpIHsKJiM0MzsJCWlmIChoaWdoX3BpZCAmZ3Q7IDApIHsKJiM0MzsJCQlraWxsKGhpZ2hfcGlkLCBTSUdLSUxMKTsKJiM0MzsJCQkodm9pZCl3YWl0cGlkKGhpZ2hfcGlkLCBOVUxMLCAwKTsKJiM0MzsJCX0KJiM0MzsJCWlmIChsb3dfcGlkICZndDsgMCkgewomIzQzOwkJCWtpbGwobG93X3BpZCwgU0lHS0lMTCk7CiYjNDM7CQkJKHZvaWQpd2FpdHBpZChsb3dfcGlkLCBOVUxMLCAwKTsKJiM0MzsJCX0KJiM0MzsJfQomIzQzOwl1bmxpbmsobG93X3RpbWVfZmlsZSk7CiYjNDM7CXVubGluayhoaWdoX3RpbWVfZmlsZSk7CiYjNDM7CXVubGluayhsb3dfZGF0YV9maWxlKTsKJiM0MzsJdW5saW5rKGhpZ2hfZGF0YV9maWxlKTsKJiM0MzsJcmV0dXJuIHJldDsKJiM0Mzt9CiYjNDM7CiYjNDM7c3RhdGljIGludAomIzQzO3NldHVwX2JwZih1NjQgaGlnaF9jZ3JvdXBfaWQsIHU2NCBsb3dfY2dyb3VwX2lkLAomIzQzOwkgIHN0cnVjdCBtZW1jZ19hc3luY19yZWNsYWltICoqc2tlbF9wdHIpCiYjNDM7ewomIzQzOwlzdHJ1Y3QgbWVtY2dfYXN5bmNfcmVjbGFpbSAqc2tlbDsKJiM0MzsJc3RydWN0IGJwZl9hcmdzX3MgYnBmX2FyZ3MgPSB7CiYjNDM7CQkuaGlnaF9jZ3JvdXBfaWQgPSBoaWdoX2Nncm91cF9pZCwKJiM0MzsJCS5sb3dfY2dyb3VwX2lkID0gbG93X2Nncm91cF9pZCwKJiM0MzsJCS5ldmVudF9kZWx0YV90aHJlc2hvbGQgPSBFVkVOVF9ERUxUQV9USFJFU0hPTEQsCiYjNDM7CQkuY2hlY2tfbnMgPSBDSEVDS19QRVJJT0RfTlMsCiYjNDM7CX07CiYjNDM7CUxJQkJQRl9PUFRTKGJwZl90ZXN0X3J1bl9vcHRzLCBydW5fb3B0cywKJiM0MzsJCS5jdHhfaW4gPSAmYW1wO2JwZl9hcmdzLAomIzQzOwkJLmN0eF9zaXplX2luID0gc2l6ZW9mKGJwZl9hcmdzKSk7CiYjNDM7CWludCBwcm9nX2luaXRfZmQsIGVycjsKJiM0MzsKJiM0MzsJc2tlbCA9IG1lbWNnX2FzeW5jX3JlY2xhaW1fX29wZW5fYW5kX2xvYWQoKTsKJiM0MzsJaWYgKCFBU1NFUlRfT0tfUFRSKHNrZWwsICYjMzQ7bWVtY2dfYXN5bmNfcmVjbGFpbV9fb3Blbl9hbmRfbG9hZCYjMzQ7KSkKJiM0MzsJCXJldHVybiAtMTsKJiM0MzsKJiM0MzsJcHJvZ19pbml0X2ZkID0gYnBmX3Byb2dyYW1fX2ZkKHNrZWwtJmd0O3Byb2dzLndxX3Byb2dfaW5pdCk7CiYjNDM7CiYjNDM7CWVyciA9IGJwZl9wcm9nX3Rlc3RfcnVuX29wdHMocHJvZ19pbml0X2ZkLCAmYW1wO3J1bl9vcHRzKTsKJiM0MzsJaWYgKCFBU1NFUlRfT0soZXJyLCAmIzM0O2JwZl9wcm9nX3Rlc3RfcnVuX29wdHMmIzM0OykpCiYjNDM7CQlnb3RvIGVycm9yX291dDsKJiM0MzsJaWYgKCFBU1NFUlRfRVEocnVuX29wdHMucmV0dmFsLCAwLCAmIzM0O3Byb2dfaW5pdCByZXR2YWwmIzM0OykpCiYjNDM7CQlnb3RvIGVycm9yX291dDsKJiM0MzsKJiM0MzsJKnNrZWxfcHRyID0gc2tlbDsKJiM0MzsJcmV0dXJuIDA7CiYjNDM7CiYjNDM7ZXJyb3Jfb3V0OgomIzQzOwltZW1jZ19hc3luY19yZWNsYWltX19kZXN0cm95KHNrZWwpOwomIzQzOwlyZXR1cm4gLTE7CiYjNDM7fQomIzQzOwomIzQzO3ZvaWQgdGVzdF9tZW1jZ193cV9hc3luY19yZWNsYWltKHZvaWQpCiYjNDM7ewomIzQzOwl1NjQgaGlnaF9jZ3JvdXBfaWQsIGxvd19jZ3JvdXBfaWQ7CiYjNDM7CWludCBlcnI7CiYjNDM7CWRvdWJsZSBoaWdoX3RpbWUgPSAwLjAsIGxvd190aW1lID0gMC4wOwomIzQzOwlzdHJ1Y3QgbWVtY2dfYXN5bmNfcmVjbGFpbSAqc2tlbCA9IE5VTEw7CiYjNDM7CiYjNDM7CWVyciA9IHNldHVwX2hpZ2hfbG93X2Nncm91cHMoJmFtcDtoaWdoX2Nncm91cF9pZCwgJmFtcDtsb3dfY2dyb3VwX2lkKTsKJiM0MzsJaWYgKCFBU1NFUlRfT0soZXJyLCAmIzM0O3NldHVwX2hpZ2hfbG93X2Nncm91cHMgcmVjbGFpbSYjMzQ7KSkKJiM0MzsJCXJldHVybjsKJiM0MzsKJiM0MzsJZXJyID0gc2V0dXBfYnBmKGhpZ2hfY2dyb3VwX2lkLCBsb3dfY2dyb3VwX2lkLCAmYW1wO3NrZWwpOwomIzQzOwlpZiAoIUFTU0VSVF9PSyhlcnIsICYjMzQ7c2V0dXBfYnBmJiMzNDspKQomIzQzOwkJZ290byBvdXQ7CiYjNDM7CiYjNDM7CWVyciA9IHJ1bl9oaWdoX2xvd193b3JrbG9hZCgmYW1wO2hpZ2hfdGltZSwgJmFtcDtsb3dfdGltZSwgUkVBRF9USU1FUyk7CiYjNDM7CWlmICghQVNTRVJUX09LKGVyciwgJiMzNDtydW5faGlnaF9sb3dfd29ya2xvYWQgcmVjbGFpbSYjMzQ7KSkKJiM0MzsJCWdvdG8gb3V0OwomIzQzOwomIzQzOwkvKgomIzQzOwkgKiBUaGUgdGltaW5nIGNvbXBhcmlzb24gYmVsb3cgYWxvbmUgY2Fubm90IGRpc3Rpbmd1aXNoIGEgd29ya2luZwomIzQzOwkgKiByZWNsYWltIGZyb20gYSBuby1vcCBvbmUsIHNvIHJlcXVpcmUgdGhhdCB0aGUgQlBGIHByb2dyYW0KJiM0MzsJICogYWN0dWFsbHkgcmVjbGFpbWVkIHBhZ2VzIGZyb20gdGhlIGxvdyBjZ3JvdXAuCiYjNDM7CSAqLwomIzQzOwlpZiAoIUFTU0VSVF9HVChza2VsLSZndDtic3MtJmd0O3JlY2xhaW1fY2FsbHMsIDAsICYjMzQ7cmVjbGFpbV9jYWxscyYjMzQ7KSkKJiM0MzsJCWdvdG8gb3V0OwomIzQzOwlpZiAoIUFTU0VSVF9HVChza2VsLSZndDtic3MtJmd0O3JlY2xhaW1lZF9wYWdlcywgMCwgJiMzNDtyZWNsYWltZWRfcGFnZXMmIzM0OykpCiYjNDM7CQlnb3RvIG91dDsKJiM0MzsKJiM0MzsJaWYgKGhpZ2hfdGltZSAmZ3Q7PSBsb3dfdGltZSkKJiM0MzsJCVBSSU5UX0ZBSUwoJiMzNDtoaWdoIGNncm91cCBub3QgaW1wcm92ZWQgd2l0aCBhc3luYyByZWNsYWltOiBoaWdoX3RpbWU9JWYgbG93X3RpbWU9JWYmIzM0OywKJiM0MzsJCQkgICBoaWdoX3RpbWUsIGxvd190aW1lKTsKJiM0MzsKJiM0MztvdXQ6CiYjNDM7CWlmIChza2VsKQomIzQzOwkJbWVtY2dfYXN5bmNfcmVjbGFpbV9fZGVzdHJveShza2VsKTsKJiM0MzsJY2xlYW51cF9jZ3JvdXBfZW52aXJvbm1lbnQoKTsKJiM0Mzt9CmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ3MvbWVtY2dfYXN5bmNfcmVjbGFpbS5jIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dzL21lbWNnX2FzeW5jX3JlY2xhaW0uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMDAwMDAwLi4yMjVmMGJjNjY3MTEzCi0tLSAvZGV2L251bGwKJiM0MzsmIzQzOyYjNDM7IGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dzL21lbWNnX2FzeW5jX3JlY2xhaW0uYwpAQCAtMCwwICYjNDM7MSwxODAgQEAKJiM0MzsvLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogR1BMLTIuMAomIzQzOwomIzQzOyNpbmNsdWRlICYjMzQ7dm1saW51eC5oJiMzNDsKJiM0MzsjaW5jbHVkZSAmIzM0O2JwZl9leHBlcmltZW50YWwuaCYjMzQ7CiYjNDM7I2luY2x1ZGUgJmx0O2JwZi9icGZfaGVscGVycy5oJmd0OwomIzQzOyNpbmNsdWRlICZsdDticGYvYnBmX3RyYWNpbmcuaCZndDsKJiM0MzsjaW5jbHVkZSAmbHQ7YnBmL2JwZl9jb3JlX3JlYWQuaCZndDsKJiM0MzsKJiM0MzsjZGVmaW5lIENMT0NLX01PTk9UT05JQ19JRAkxCiYjNDM7I2RlZmluZSBQQUdFX1NJWkUJCTQwOTZVTAomIzQzOyNkZWZpbmUgUkVDTEFJTV9TSVpFCQkoMzIgKiBQQUdFX1NJWkUpCiYjNDM7I2RlZmluZSBSRUNMQUlNX01BWF9JVEVSCTMyCiYjNDM7CiYjNDM7c3RydWN0IGJwZl9hcmdzX3MgewomIzQzOwl1NjQgaGlnaF9jZ3JvdXBfaWQ7CiYjNDM7CXU2NCBsb3dfY2dyb3VwX2lkOwomIzQzOwl1NjQgZXZlbnRfZGVsdGFfdGhyZXNob2xkOwomIzQzOwl1NjQgY2hlY2tfbnM7CiYjNDM7fTsKJiM0MzsKJiM0MztzdHJ1Y3QgY2dyb3VwX21lbWNnIHsKJiM0MzsJc3RydWN0IGNncm91cCAqY2dycDsKJiM0MzsJc3RydWN0IG1lbV9jZ3JvdXAgKm1lbWNnOwomIzQzO307CiYjNDM7CiYjNDM7c3RhdGljIHU2NCB3cV9oaWdoX2Nncm91cF9pZDsKJiM0MztzdGF0aWMgdTY0IHdxX2xvd19jZ3JvdXBfaWQ7CiYjNDM7CiYjNDM7LyogU3RhdGlzdGljcyBleHBvc2VkIHRvIHVzZXJzcGFjZSB0aHJvdWdoIC5ic3MsIHNvIHRoZSB0ZXN0IGNhbiB2ZXJpZnkKJiM0MzsgKiB0aGF0IHJlY2xhaW0gYWN0dWFsbHkgaGFwcGVuZWQgaW5zdGVhZCBvZiByZWx5aW5nIG9uIHRpbWluZyBhbG9uZS4KJiM0MzsgKi8KJiM0Mzt1NjQgcmVjbGFpbV9jYWxsczsKJiM0Mzt1NjQgcmVjbGFpbWVkX3BhZ2VzOwomIzQzOwomIzQzO3N0YXRpYyBpbnQgZ2V0X2Nncm91cF9tZW1jZ19mcm9tX2lkKHU2NCBjZ3JvdXBfaWQsIHN0cnVjdCBjZ3JvdXBfbWVtY2cgKmNtKQomIzQzO3sKJiM0MzsJY20tJmd0O2NncnAgPSBicGZfY2dyb3VwX2Zyb21faWQoY2dyb3VwX2lkKTsKJiM0MzsJaWYgKCFjbS0mZ3Q7Y2dycCkKJiM0MzsJCXJldHVybiAtMTsKJiM0MzsKJiM0MzsJY20tJmd0O21lbWNnID0gYnBmX2dldF9tZW1fY2dyb3VwKCZhbXA7Y20tJmd0O2NncnAtJmd0O3NlbGYpOwomIzQzOwlpZiAoIWNtLSZndDttZW1jZykgewomIzQzOwkJYnBmX2Nncm91cF9yZWxlYXNlKGNtLSZndDtjZ3JwKTsKJiM0MzsJCXJldHVybiAtMTsKJiM0MzsJfQomIzQzOwomIzQzOwlyZXR1cm4gMDsKJiM0Mzt9CiYjNDM7CiYjNDM7c3RhdGljIHZvaWQgcHV0X2Nncm91cF9tZW1jZyhzdHJ1Y3QgY2dyb3VwX21lbWNnICpjbSkKJiM0Mzt7CiYjNDM7CWJwZl9wdXRfbWVtX2Nncm91cChjbS0mZ3Q7bWVtY2cpOwomIzQzOwlicGZfY2dyb3VwX3JlbGVhc2UoY20tJmd0O2NncnApOwomIzQzO30KJiM0MzsKJiM0MztzdGF0aWMgaW50IGdldF9jZ3JvdXBfZXZlbnQodTY0IGNncm91cF9pZCwgdTY0ICp2YWwpCiYjNDM7ewomIzQzOwlzdHJ1Y3QgY2dyb3VwX21lbWNnIGNtOwomIzQzOwomIzQzOwlpZiAoZ2V0X2Nncm91cF9tZW1jZ19mcm9tX2lkKGNncm91cF9pZCwgJmFtcDtjbSkpCiYjNDM7CQlyZXR1cm4gLTE7CiYjNDM7CWJwZl9tZW1fY2dyb3VwX2ZsdXNoX3N0YXRzKGNtLm1lbWNnKTsKJiM0MzsJKnZhbCA9IGJwZl9tZW1fY2dyb3VwX3BhZ2Vfc3RhdGUoY20ubWVtY2csCiYjNDM7CQlicGZfY29yZV9lbnVtX3ZhbHVlKGVudW0gbm9kZV9zdGF0X2l0ZW0sCiYjNDM7CQkJCSAgICBXT1JLSU5HU0VUX1JFRkFVTFRfRklMRSkpOwomIzQzOwlwdXRfY2dyb3VwX21lbWNnKCZhbXA7Y20pOwomIzQzOwomIzQzOwlyZXR1cm4gMDsKJiM0Mzt9CiYjNDM7CiYjNDM7c3RhdGljIGJvb2wKJiM0MztzaG91bGRfcmVjbGFpbV9jZ3JvdXAodTY0IGNncm91cF9pZCwgdTY0ICpwcmV2X2V2ZW50LCB1NjQgZXZlbnRfZGVsdGFfdGhyZXNob2xkKQomIzQzO3sKJiM0MzsJdTY0IGN1ciwgZGVsdGE7CiYjNDM7CiYjNDM7CWlmIChnZXRfY2dyb3VwX2V2ZW50KGNncm91cF9pZCwgJmFtcDtjdXIpKQomIzQzOwkJcmV0dXJuIGZhbHNlOwomIzQzOwomIzQzOwlkZWx0YSA9IGN1ciAtICpwcmV2X2V2ZW50OwomIzQzOwkqcHJldl9ldmVudCA9IGN1cjsKJiM0MzsKJiM0MzsJcmV0dXJuIGRlbHRhICZndDs9IGV2ZW50X2RlbHRhX3RocmVzaG9sZDsKJiM0Mzt9CiYjNDM7CiYjNDM7c3RhdGljIGludCByZWNsYWltX2Nncm91cCh1NjQgY2dyb3VwX2lkKQomIzQzO3sKJiM0MzsJc3RydWN0IGNncm91cF9tZW1jZyBjbTsKJiM0MzsJaW50IGk7CiYjNDM7CiYjNDM7CWlmIChnZXRfY2dyb3VwX21lbWNnX2Zyb21faWQoY2dyb3VwX2lkLCAmYW1wO2NtKSkKJiM0MzsJCXJldHVybiAwOwomIzQzOwomIzQzOwlyZWNsYWltX2NhbGxzJiM0MzsmIzQzOzsKJiM0MzsJZm9yIChpID0gMDsgaSAmbHQ7IFJFQ0xBSU1fTUFYX0lURVI7IGkmIzQzOyYjNDM7KSB7CiYjNDM7CQl1NjQgbnIgPSBicGZfcHJvYWN0aXZlX3JlY2xhaW0oY20ubWVtY2csIFJFQ0xBSU1fU0laRSk7CiYjNDM7CiYjNDM7CQlpZiAoIW5yKQomIzQzOwkJCWJyZWFrOwomIzQzOwkJcmVjbGFpbWVkX3BhZ2VzICYjNDM7PSBucjsKJiM0MzsJfQomIzQzOwomIzQzOwlwdXRfY2dyb3VwX21lbWNnKCZhbXA7Y20pOwomIzQzOwomIzQzOwlyZXR1cm4gMDsKJiM0Mzt9CiYjNDM7CiYjNDM7c3RydWN0IHdxX2VsZW0gewomIzQzOwlzdHJ1Y3QgYnBmX3RpbWVyIHRpbWVyOwomIzQzOwlzdHJ1Y3QgYnBmX3dxIHdvcms7CiYjNDM7CXU2NCBwcmV2X2V2ZW50OwomIzQzOwl1NjQgZXZlbnRfZGVsdGFfdGhyZXNob2xkOwomIzQzOwl1NjQgY2hlY2tfbnM7CiYjNDM7fTsKJiM0MzsKJiM0MztzdHJ1Y3QgewomIzQzOwlfX3VpbnQodHlwZSwgQlBGX01BUF9UWVBFX0FSUkFZKTsKJiM0MzsJX191aW50KG1heF9lbnRyaWVzLCAxKTsKJiM0MzsJX190eXBlKGtleSwgX191MzIpOwomIzQzOwlfX3R5cGUodmFsdWUsIHN0cnVjdCB3cV9lbGVtKTsKJiM0Mzt9IHdxX21hcCBTRUMoJiMzNDsubWFwcyYjMzQ7KTsKJiM0MzsKJiM0MztzdGF0aWMgaW50IGFzeW5jX2ZyZWUodm9pZCAqbWFwLCBpbnQgKmtleSwgdm9pZCAqdmFsdWUpCiYjNDM7ewomIzQzOwlzdHJ1Y3Qgd3FfZWxlbSAqZWxlbSA9IHZhbHVlOwomIzQzOwomIzQzOwlpZiAoc2hvdWxkX3JlY2xhaW1fY2dyb3VwKHdxX2hpZ2hfY2dyb3VwX2lkLCAmYW1wO2VsZW0tJmd0O3ByZXZfZXZlbnQsCiYjNDM7CQllbGVtLSZndDtldmVudF9kZWx0YV90aHJlc2hvbGQpKSB7CiYjNDM7CQlyZWNsYWltX2Nncm91cCh3cV9sb3dfY2dyb3VwX2lkKTsKJiM0MzsJCWJwZl93cV9zdGFydCgmYW1wO2VsZW0tJmd0O3dvcmssIDApOwomIzQzOwl9CiYjNDM7CiYjNDM7CXJldHVybiAwOwomIzQzO30KJiM0MzsKJiM0MztzdGF0aWMgaW50IHdxX3RpbWVyX2NiKHZvaWQgKm1hcCwgaW50ICprZXksIHN0cnVjdCB3cV9lbGVtICplbGVtKQomIzQzO3sKJiM0MzsJYnBmX3dxX3N0YXJ0KCZhbXA7ZWxlbS0mZ3Q7d29yaywgMCk7CiYjNDM7CWJwZl90aW1lcl9zdGFydCgmYW1wO2VsZW0tJmd0O3RpbWVyLCBlbGVtLSZndDtjaGVja19ucywgMCk7CiYjNDM7CiYjNDM7CXJldHVybiAwOwomIzQzO30KJiM0MzsKJiM0MztTRUMoJiMzNDtzeXNjYWxsJiMzNDspCiYjNDM7aW50IHdxX3Byb2dfaW5pdChzdHJ1Y3QgYnBmX2FyZ3NfcyAqY3R4KQomIzQzO3sKJiM0MzsJc3RydWN0IHdxX2VsZW0gKmVsZW07CiYjNDM7CV9fdTMyIGtleSA9IDA7CiYjNDM7CWludCByZXQ7CiYjNDM7CiYjNDM7CWVsZW0gPSBicGZfbWFwX2xvb2t1cF9lbGVtKCZhbXA7d3FfbWFwLCAmYW1wO2tleSk7CiYjNDM7CWlmICghZWxlbSkKJiM0MzsJCXJldHVybiAtMTsKJiM0MzsKJiM0MzsJcmV0ID0gYnBmX3dxX2luaXQoJmFtcDtlbGVtLSZndDt3b3JrLCAmYW1wO3dxX21hcCwgMCk7CiYjNDM7CWlmIChyZXQpCiYjNDM7CQlyZXR1cm4gcmV0OwomIzQzOwomIzQzOwlyZXQgPSBicGZfd3Ffc2V0X2NhbGxiYWNrKCZhbXA7ZWxlbS0mZ3Q7d29yaywgYXN5bmNfZnJlZSwgMCk7CiYjNDM7CWlmIChyZXQpCiYjNDM7CQlyZXR1cm4gcmV0OwomIzQzOwomIzQzOwlyZXQgPSBicGZfdGltZXJfaW5pdCgmYW1wO2VsZW0tJmd0O3RpbWVyLCAmYW1wO3dxX21hcCwgQ0xPQ0tfTU9OT1RPTklDX0lEKTsKJiM0MzsJaWYgKHJldCkKJiM0MzsJCXJldHVybiByZXQ7CiYjNDM7CiYjNDM7CXJldCA9IGJwZl90aW1lcl9zZXRfY2FsbGJhY2soJmFtcDtlbGVtLSZndDt0aW1lciwgd3FfdGltZXJfY2IpOwomIzQzOwlpZiAocmV0KQomIzQzOwkJcmV0dXJuIHJldDsKJiM0MzsKJiM0MzsJZWxlbS0mZ3Q7cHJldl9ldmVudCA9IDA7CiYjNDM7CWVsZW0tJmd0O2V2ZW50X2RlbHRhX3RocmVzaG9sZCA9IGN0eC0mZ3Q7ZXZlbnRfZGVsdGFfdGhyZXNob2xkOwomIzQzOwllbGVtLSZndDtjaGVja19ucyA9IGN0eC0mZ3Q7Y2hlY2tfbnM7CiYjNDM7CiYjNDM7CXdxX2hpZ2hfY2dyb3VwX2lkID0gY3R4LSZndDtoaWdoX2Nncm91cF9pZDsKJiM0MzsJd3FfbG93X2Nncm91cF9pZCA9IGN0eC0mZ3Q7bG93X2Nncm91cF9pZDsKJiM0MzsKJiM0MzsJcmV0dXJuIGJwZl90aW1lcl9zdGFydCgmYW1wO2VsZW0tJmd0O3RpbWVyLCBlbGVtLSZndDtjaGVja19ucywgMCk7CiYjNDM7fQomIzQzOwomIzQzO2NoYXIgTElDRU5TRVtdIFNFQygmIzM0O2xpY2Vuc2UmIzM0OykgPSAmIzM0O0dQTCYjMzQ7Owo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4xMS8zPC90ZD4KCQkJPHRkPjIwMjYvMDgvMTkgMDc6NDQ8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPmttc2FuLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjEtcHJvLXByZXZpZXc8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogMTA1MDUKCQkJCQkJCW91dHB1dDogMjM0CgkJCQkJCQl0aG91Z2h0czogNjQ4CgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4qKktNU0FOIEZ1enppbmcgRGVjaXNpb246IE5lZWRzS01TQU4gPSBmYWxzZSoqCgpPa2F5LCBsZXQmIzM5O3MgYnJlYWsgdGhpcyBkb3duLiBXZSYjMzk7dmUgZ290IGEgcGF0Y2ggdGhhdCYjMzk7cyBlc3NlbnRpYWxseSBleHBvc2luZyBgdHJ5X3RvX2ZyZWVfbWVtX2Nncm91cF9wYWdlc2AgdmlhIGEgQlBGIGludGVyZmFjZSDigJMgdHdvIG5ldyBrZnVuY3MsIGBicGZfcHJvYWN0aXZlX3JlY2xhaW1gIGFuZCBgYnBmX3Byb2FjdGl2ZV9yZWNsYWltX3N3YXBwaW5lc3NgLiBUaGUgcXVlc3Rpb24gaXMsIGRvZXMgdGhpcyB3YXJyYW50IGEgZGVkaWNhdGVkIEtNU0FOIGZ1enppbmcgc2Vzc2lvbj8KCkxvb2tpbmcgYXQgdGhlIGNvZGUsIHRoZXNlIGtmdW5jcyB0YWtlIGEgYHN0cnVjdCBtZW1fY2dyb3VwICptZW1jZ2AsIGFuIGB1bnNpZ25lZCBsb25nIHNpemVgLCBhbmQgYW4gb3B0aW9uYWwgYGludCBzd2FwcGluZXNzYC4gQ3J1Y2lhbGx5LCB0aGVzZSBhcmd1bWVudHMgYXJlICpwcm92aWRlZCBieSBCUEYgcHJvZ3JhbXMqLCBtZWFuaW5nIHRoZSBCUEYgdmVyaWZpZXIgaXMgZ29pbmcgdG8gZW5zdXJlIHRoYXQgYWxsIG9mIHRoZSBhcmd1bWVudHMgYXJlIHByb3Blcmx5IGluaXRpYWxpemVkIGJlZm9yZSB0aGV5JiMzOTtyZSBwYXNzZWQuIFRoZSBrZnVuY3MgdGhlbXNlbHZlcyBhcmUganVzdCBwYXNzaW5nIHRoZXNlIGluaXRpYWxpemVkIGFyZ3VtZW50cyBvbiB0byBgdHJ5X3RvX2ZyZWVfbWVtX2Nncm91cF9wYWdlc2AuIE5vIG5ldyBrZXJuZWwgc3RydWN0dXJlcyBhcmUgYmVpbmcgc2VudCB0byB1c2Vyc3BhY2UsIHRoZXJlJiMzOTtzIG5vIGRhdGEgY29weWluZyBpbiBlaXRoZXIgZGlyZWN0aW9uIGJleW9uZCB0aG9zZSB2ZXJpZmllZCBhcmd1bWVudHMsIGFuZCBubyBjb21wbGV4LCBwYXJ0aWFsbHktaW5pdGlhbGl6ZWQgZGF0YSBzdHJ1Y3R1cmVzIGFyZSBiZWluZyBhbGxvY2F0ZWQuIFRoZSBwYXRjaCBhbHNvIGluY2x1ZGVzIGEgc2VsZnRlc3QsIHdoaWNoIGlzIGEgZ29vZCBzaWduLgoKU28sIGxldCYjMzk7cyByZXZpZXcgdGhlIGNyaXRlcmlhLiAqMS4gS2VybmVsIHN0cnVjdHVyZXMgc2VudCB0byB1c2VyIHNwYWNlIHdoZXJlIGZpZWxkcyBtaWdodCBub3QgYmUgZnVsbHkgaW5pdGlhbGl6ZWQ/KiBOby4gKjIuIENvbmRpdGlvbmFsIGxvZ2ljIG9yIGJyYW5jaGluZyB0aGF0IGRlcGVuZHMgb24gcG90ZW50aWFsbHkgdW5pbml0aWFsaXplZCB2YXJpYWJsZXMgb3Igc3RydWN0IGZpZWxkcz8qIEFic29sdXRlbHkgbm90LCB0aGUgQlBGIHZlcmlmaWVyIGhhcyB0aGF0IGNvdmVyZWQuICozLiBBbGxvY2F0aW9uIG9yIGluaXRpYWxpemF0aW9uIG9mIGNvbXBsZXggZGF0YSBzdHJ1Y3R1cmVzIHdoZXJlIHVuaW5pdGlhbGl6ZWQgZmllbGRzIGNvdWxkIGJlIHJlYWQgbGF0ZXI/KiBOb3BlLCBub3QgaGVyZS4gKjQuIEJvdW5kcyBjaGVja3MsIGxlbmd0aHMsIG9yIGxvZ2ljIGluIGEgd2F5IHRoYXQgYWxsb3dzIHN1cnJvdW5kaW5nIGNvZGUgdG8gYWNjZXNzIHVuaW5pdGlhbGl6ZWQgYnl0ZXMgb2YgZXhpc3RpbmcgYnVmZmVycz8qIFN0aWxsIG5vLgoKR2l2ZW4gYWxsIG9mIHRoYXQsIHRoaXMgcGF0Y2ggaXMgYmFzaWNhbGx5IGp1c3QgYSBCUEYgd3JhcHBlciBhcm91bmQgYW4gZXhpc3RpbmcgZnVuY3Rpb24uIEFueSBwb3RlbnRpYWwgaXNzdWVzIGFyZSBnb2luZyB0byBiZSBzdGFuZGFyZCBtZW1vcnkgc2FmZXR5IHZpb2xhdGlvbnMgbGlrZSB1c2UtYWZ0ZXItZnJlZSwgb3V0LW9mLWJvdW5kcywgb3Igc29tZSBzb3J0IG9mIGxvZ2ljIGVycm9yIGluIHRoZSB3cmFwcGluZyBpdHNlbGYuIFRob3NlIGFyZSB0aGUga2luZHMgb2YgdGhpbmdzIHRoYXQgS0FTQU4gYW5kIHRoZSBub3JtYWwgQlBGIHZlcmlmaWVyIGNoZWNrcyBzaG91bGQgY2F0Y2gsIHNvIHRoZXJlJiMzOTtzIG5vIGluaGVyZW50IHVuaW5pdGlhbGl6ZWQgbWVtb3J5IGV4cG9zdXJlLiBJJiMzOTttIGdvaW5nIHRvIHNldCBgTmVlZHNLTVNBTiA9IGZhbHNlYC4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4xMi8zPC90ZD4KCQkJPHRkPjIwMjYvMDgvMTkgMDc6NDU8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5zZXQtcmVzdWx0czwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7S01TQU5SZWFzb25pbmcmIzM0OzogJiMzNDtUaGUgcGF0Y2ggaW50cm9kdWNlcyB0d28gbmV3IEJQRiBrZnVuY3MgKGBicGZfcHJvYWN0aXZlX3JlY2xhaW1gIGFuZCBgYnBmX3Byb2FjdGl2ZV9yZWNsYWltX3N3YXBwaW5lc3NgKSB0aGF0IHdyYXAgdGhlIGV4aXN0aW5nIGB0cnlfdG9fZnJlZV9tZW1fY2dyb3VwX3BhZ2VzYCBmdW5jdGlvbiB0byBhbGxvdyBCUEYgcHJvZ3JhbXMgdG8gdHJpZ2dlciBwcm9hY3RpdmUgbWVtb3J5IHJlY2xhaW0gZm9yIGEgbWVtb3J5IGNncm91cC4gVGhlIGFyZ3VtZW50cyBwYXNzZWQgdG8gdGhlc2Uga2Z1bmNzIGFyZSBzY2FsYXIgdmFsdWVzIGFuZCBwb2ludGVycyB2ZXJpZmllZCBieSB0aGUgQlBGIHZlcmlmaWVyLCBlbnN1cmluZyB0aGV5IGFyZSBpbml0aWFsaXplZC4gVGhlIHBhdGNoIGRvZXMgbm90IGludHJvZHVjZSBhbnkgbmV3IGRhdGEgc3RydWN0dXJlcyBjb3BpZWQgdG8gb3IgZnJvbSB1c2Vyc3BhY2UsIG5vciBkb2VzIGl0IGFsbG9jYXRlIGNvbXBsZXggc3RydWN0dXJlcyB0aGF0IG1pZ2h0IGJlIGxlZnQgcGFydGlhbGx5IHVuaW5pdGlhbGl6ZWQuIFRoZXJlIGlzIG5vIHJpc2sgb2YgdW5pbml0aWFsaXplZCBtZW1vcnkgYmVpbmcgbGVha2VkIHRvIHVzZXJzcGFjZSBvciB1c2VkIGluIGNvbnRyb2wgZmxvdyBkZWNpc2lvbnMuIEFueSBwb3RlbnRpYWwgbWVtb3J5IHNhZmV0eSBpc3N1ZXMgaW50cm9kdWNlZCBieSB0aGVzZSBjaGFuZ2VzIChzdWNoIGFzIHVzZS1hZnRlci1mcmVlIG9yIG91dC1vZi1ib3VuZHMgYWNjZXNzZXMgb24gdGhlIGBtZW1fY2dyb3VwYCBwb2ludGVyKSB3b3VsZCBiZSBlZmZlY3RpdmVseSBjYXVnaHQgYnkgS0FTQU4gYW5kIHRoZSBzdGFuZGFyZCBCUEYgdmVyaWZpZXIgY2hlY2tzLiBUaGVyZWZvcmUsIGEgZGVkaWNhdGVkIEtNU0FOIGZ1enppbmcgc2Vzc2lvbiBpcyBub3QgcmVxdWlyZWQuJiMzNDssCiAgJiMzNDtOZWVkc0tNU0FOJiMzNDs6IGZhbHNlCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtLTVNBTlJlYXNvbmluZyYjMzQ7OiAmIzM0O1RoZSBwYXRjaCBpbnRyb2R1Y2VzIHR3byBuZXcgQlBGIGtmdW5jcyAoYGJwZl9wcm9hY3RpdmVfcmVjbGFpbWAgYW5kIGBicGZfcHJvYWN0aXZlX3JlY2xhaW1fc3dhcHBpbmVzc2ApIHRoYXQgd3JhcCB0aGUgZXhpc3RpbmcgYHRyeV90b19mcmVlX21lbV9jZ3JvdXBfcGFnZXNgIGZ1bmN0aW9uIHRvIGFsbG93IEJQRiBwcm9ncmFtcyB0byB0cmlnZ2VyIHByb2FjdGl2ZSBtZW1vcnkgcmVjbGFpbSBmb3IgYSBtZW1vcnkgY2dyb3VwLiBUaGUgYXJndW1lbnRzIHBhc3NlZCB0byB0aGVzZSBrZnVuY3MgYXJlIHNjYWxhciB2YWx1ZXMgYW5kIHBvaW50ZXJzIHZlcmlmaWVkIGJ5IHRoZSBCUEYgdmVyaWZpZXIsIGVuc3VyaW5nIHRoZXkgYXJlIGluaXRpYWxpemVkLiBUaGUgcGF0Y2ggZG9lcyBub3QgaW50cm9kdWNlIGFueSBuZXcgZGF0YSBzdHJ1Y3R1cmVzIGNvcGllZCB0byBvciBmcm9tIHVzZXJzcGFjZSwgbm9yIGRvZXMgaXQgYWxsb2NhdGUgY29tcGxleCBzdHJ1Y3R1cmVzIHRoYXQgbWlnaHQgYmUgbGVmdCBwYXJ0aWFsbHkgdW5pbml0aWFsaXplZC4gVGhlcmUgaXMgbm8gcmlzayBvZiB1bmluaXRpYWxpemVkIG1lbW9yeSBiZWluZyBsZWFrZWQgdG8gdXNlcnNwYWNlIG9yIHVzZWQgaW4gY29udHJvbCBmbG93IGRlY2lzaW9ucy4gQW55IHBvdGVudGlhbCBtZW1vcnkgc2FmZXR5IGlzc3VlcyBpbnRyb2R1Y2VkIGJ5IHRoZXNlIGNoYW5nZXMgKHN1Y2ggYXMgdXNlLWFmdGVyLWZyZWUgb3Igb3V0LW9mLWJvdW5kcyBhY2Nlc3NlcyBvbiB0aGUgYG1lbV9jZ3JvdXBgIHBvaW50ZXIpIHdvdWxkIGJlIGVmZmVjdGl2ZWx5IGNhdWdodCBieSBLQVNBTiBhbmQgdGhlIHN0YW5kYXJkIEJQRiB2ZXJpZmllciBjaGVja3MuIFRoZXJlZm9yZSwgYSBkZWRpY2F0ZWQgS01TQU4gZnV6emluZyBzZXNzaW9uIGlzIG5vdCByZXF1aXJlZC4mIzM0OywKICAmIzM0O05lZWRzS01TQU4mIzM0OzogZmFsc2UKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTwvdGJvZHk+Cgk8L3RhYmxlPgoKCTxkaXYgaWQ9ImxsbV9zdW1tYXJ5X3RhYmxlX2RpdiIgc3R5bGU9Im1hcmdpbjogMjBweCAwOyI+CgkJPHRhYmxlIGNsYXNzPSJsaXN0X3RhYmxlIj4KCQkJPGNhcHRpb24+TExNIENhbGxzIFN1bW1hcnk6PC9jYXB0aW9uPgoJCQk8dGhlYWQ+CgkJCQk8dHI+CgkJCQkJPHRoPlRvdGFsIENhbGxzPC90aD4KCQkJCQk8dGg+VG90YWwgVG9rZW5zPC90aD4KCQkJCQk8dGg+QXZnIFRva2VuczwvdGg+CgkJCQkJPHRoPlRvdGFsIER1cmF0aW9uIChTZWNvbmRzKTwvdGg+CgkJCQkJPHRoPkF2ZyBEdXJhdGlvbiAoU2Vjb25kcyk8L3RoPgoJCQkJPC90cj4KCQkJPC90aGVhZD4KCQkJPHRib2R5IGlkPSJsbG1fc3VtbWFyeV9zdGF0c19ib2R5Ij48L3Rib2R5PgoJCTwvdGFibGU+Cgk8L2Rpdj4KCgk8ZGl2IGlkPSJ0b29sX3N1bW1hcnlfdGFibGVfZGl2IiBzdHlsZT0ibWFyZ2luOiAyMHB4IDA7Ij4KCQk8dGFibGUgY2xhc3M9Imxpc3RfdGFibGUiPgoJCQk8Y2FwdGlvbj5Ub29sIENhbGxzIFN1bW1hcnk6PC9jYXB0aW9uPgoJCQk8dGhlYWQ+CgkJCQk8dHI+CgkJCQkJPHRoPlRvdGFsIENhbGxzPC90aD4KCQkJCQk8dGg+VG90YWwgRHVyYXRpb24gKFNlY29uZHMpPC90aD4KCQkJCQk8dGg+QXZnIER1cmF0aW9uIChTZWNvbmRzKTwvdGg+CgkJCQk8L3RyPgoJCQk8L3RoZWFkPgoJCQk8dGJvZHkgaWQ9InRvb2xfc3VtbWFyeV9zdGF0c19ib2R5Ij48L3Rib2R5PgoJCTwvdGFibGU+Cgk8L2Rpdj4KCgk8ZGl2IGlkPSJkdXJhdGlvbl9jaGFydF9kaXYiIHN0eWxlPSJ3aWR0aDogMTAwJTsgbWFyZ2luOiAyMHB4IDA7IGJvcmRlcjogMXB4OyI+PC9kaXY+Cgk8ZGl2IGlkPSJ0b2tlbl9jaGFydF9kaXYiIHN0eWxlPSJ3aWR0aDogMTAwJTsgbWFyZ2luOiAyMHB4IDA7IGJvcmRlcjogMXB4OyI+PC9kaXY+CgoJPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0iaHR0cHM6Ly93d3cuZ29vZ2xlLmNvbS9qc2FwaSI+PC9zY3JpcHQ+Cgk8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+CgkJZ29vZ2xlLmxvYWQoInZpc3VhbGl6YXRpb24iLCAiMSIsIHtwYWNrYWdlczpbImNvcmVjaGFydCJdfSk7CgkJZ29vZ2xlLnNldE9uTG9hZENhbGxiYWNrKGRyYXdDaGFydHMpOwoKCQlmdW5jdGlvbiBkcmF3Q2hhcnRzKCkgewoJCQljb25zdCByYXdEYXRhID0gW3siU3RhcnRlZCI6IjIwMjYtMDgtMTlUMDc6NDQ6MjAuMzYzMjg2MTg3WiIsIlNlcSI6MCwiTmVzdGluZyI6MCwiVHlwZSI6ImZsb3ciLCJOYW1lIjoicGF0Y2gtdHJpYWdlIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6NDAzODY4NzE0MjksIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoie1xuICBcIkVuYWJsZUNvbmZpZ3NcIjogW1xuICAgIFwiTUVNQ0dcIixcbiAgICBcIkJQRl9TWVNDQUxMXCJcbiAgXSxcbiAgXCJGb2N1c1N5bWJvbHNcIjogW1xuICAgIFwiYnBmX3Byb2FjdGl2ZV9yZWNsYWltXCIsXG4gICAgXCJicGZfcHJvYWN0aXZlX3JlY2xhaW1fc3dhcHBpbmVzc1wiXG4gIF0sXG4gIFwiS01TQU5SZWFzb25pbmdcIjogXCJUaGUgcGF0Y2ggaW50cm9kdWNlcyB0d28gbmV3IEJQRiBrZnVuY3MgKGBicGZfcHJvYWN0aXZlX3JlY2xhaW1gIGFuZCBgYnBmX3Byb2FjdGl2ZV9yZWNsYWltX3N3YXBwaW5lc3NgKSB0aGF0IHdyYXAgdGhlIGV4aXN0aW5nIGB0cnlfdG9fZnJlZV9tZW1fY2dyb3VwX3BhZ2VzYCBmdW5jdGlvbiB0byBhbGxvdyBCUEYgcHJvZ3JhbXMgdG8gdHJpZ2dlciBwcm9hY3RpdmUgbWVtb3J5IHJlY2xhaW0gZm9yIGEgbWVtb3J5IGNncm91cC4gVGhlIGFyZ3VtZW50cyBwYXNzZWQgdG8gdGhlc2Uga2Z1bmNzIGFyZSBzY2FsYXIgdmFsdWVzIGFuZCBwb2ludGVycyB2ZXJpZmllZCBieSB0aGUgQlBGIHZlcmlmaWVyLCBlbnN1cmluZyB0aGV5IGFyZSBpbml0aWFsaXplZC4gVGhlIHBhdGNoIGRvZXMgbm90IGludHJvZHVjZSBhbnkgbmV3IGRhdGEgc3RydWN0dXJlcyBjb3BpZWQgdG8gb3IgZnJvbSB1c2Vyc3BhY2UsIG5vciBkb2VzIGl0IGFsbG9jYXRlIGNvbXBsZXggc3RydWN0dXJlcyB0aGF0IG1pZ2h0IGJlIGxlZnQgcGFydGlhbGx5IHVuaW5pdGlhbGl6ZWQuIFRoZXJlIGlzIG5vIHJpc2sgb2YgdW5pbml0aWFsaXplZCBtZW1vcnkgYmVpbmcgbGVha2VkIHRvIHVzZXJzcGFjZSBvciB1c2VkIGluIGNvbnRyb2wgZmxvdyBkZWNpc2lvbnMuIEFueSBwb3RlbnRpYWwgbWVtb3J5IHNhZmV0eSBpc3N1ZXMgaW50cm9kdWNlZCBieSB0aGVzZSBjaGFuZ2VzIChzdWNoIGFzIHVzZS1hZnRlci1mcmVlIG9yIG91dC1vZi1ib3VuZHMgYWNjZXNzZXMgb24gdGhlIGBtZW1fY2dyb3VwYCBwb2ludGVyKSB3b3VsZCBiZSBlZmZlY3RpdmVseSBjYXVnaHQgYnkgS0FTQU4gYW5kIHRoZSBzdGFuZGFyZCBCUEYgdmVyaWZpZXIgY2hlY2tzLiBUaGVyZWZvcmUsIGEgZGVkaWNhdGVkIEtNU0FOIGZ1enppbmcgc2Vzc2lvbiBpcyBub3QgcmVxdWlyZWQuXCIsXG4gIFwiTmVlZHNLTVNBTlwiOiBmYWxzZSxcbiAgXCJSZWFzb25pbmdcIjogXCJUaGUgcGF0Y2ggaW50cm9kdWNlcyB0d28gbmV3IEJQRiBrZnVuY3MsIGBicGZfcHJvYWN0aXZlX3JlY2xhaW1gIGFuZCBgYnBmX3Byb2FjdGl2ZV9yZWNsYWltX3N3YXBwaW5lc3NgLCB3aGljaCBhbGxvdyBCUEYgcHJvZ3JhbXMgdG8gcHJvYWN0aXZlbHkgdHJpZ2dlciBtZW1vcnkgcmVjbGFpbSBvbiBhIG1lbW9yeSBjZ3JvdXAuIFRoaXMgZXhwb3NlcyBjb3JlIG1lbW9yeSBtYW5hZ2VtZW50IGFuZCByZWNsYWltIGxvZ2ljIHRvIEJQRiwgbWFraW5nIGl0IGEgZnVuY3Rpb25hbCBjaGFuZ2UgdGhhdCBpcyBoaWdobHkgcmVhY2hhYmxlIGFuZCB3b3J0aCBmdXp6aW5nLlwiLFxuICBcIldvcnRoRnV6emluZ1wiOiB0cnVlXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOC0xOVQwNzo0NDoyMC4zNjMyOTI4MzdaIiwiU2VxIjoxLCJOZXN0aW5nIjoxLCJUeXBlIjoiYWN0aW9uIiwiTmFtZSI6InJlYWQtcGF0Y2gtZGlmZiIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjEzMTU2MTkzOTEsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoie1xuICBcIlBhdGNoRGlmZlwiOiBcImNvbW1pdCA5YmU1MzI1MTQ1YTA3MDA2M2QzOTA5NTgzMjM4YjQ5N2E5NmRkNzdmXFxuQXV0aG9yOiBzeXotY2x1c3RlciBcXHUwMDNjdHJpYWdlQHN5emthbGxlci5jb21cXHUwMDNlXFxuRGF0ZTogICBXZWQgQXVnIDE5IDA3OjQ0OjE4IDIwMjYgKzAwMDBcXG5cXG4gICAgc3l6LWNsdXN0ZXI6IGFwcGxpZWQgcGF0Y2ggdW5kZXIgcmV2aWV3XFxuXFxuZGlmZiAtLWdpdCBhL21tL2JwZl9tZW1jb250cm9sLmMgYi9tbS9icGZfbWVtY29udHJvbC5jXFxuaW5kZXggNzE2ZGY0OWQ3NjQ3Ny4uYjBhMGQ0YzU1ZGM0ZSAxMDA2NDRcXG4tLS0gYS9tbS9icGZfbWVtY29udHJvbC5jXFxuKysrIGIvbW0vYnBmX21lbWNvbnRyb2wuY1xcbkBAIC02LDYgKzYsNyBAQFxcbiAgKi9cXG4gXFxuICNpbmNsdWRlIFxcdTAwM2NsaW51eC9tZW1jb250cm9sLmhcXHUwMDNlXFxuKyNpbmNsdWRlIFxcdTAwM2NsaW51eC9zd2FwLmhcXHUwMDNlXFxuICNpbmNsdWRlIFxcdTAwM2NsaW51eC9icGYuaFxcdTAwM2VcXG4gXFxuIF9fYnBmX2tmdW5jX3N0YXJ0X2RlZnMoKTtcXG5AQCAtMTU5LDYgKzE2MCwxMDMgQEAgX19icGZfa2Z1bmMgdm9pZCBicGZfbWVtX2Nncm91cF9mbHVzaF9zdGF0cyhzdHJ1Y3QgbWVtX2Nncm91cCAqbWVtY2cpXFxuIFxcdG1lbV9jZ3JvdXBfZmx1c2hfc3RhdHMobWVtY2cpO1xcbiB9XFxuIFxcbisvKlxcbisgKiBSZWNsYWltIG11c3Qgbm90IHJlY3Vyc2UuIHRyeV90b19mcmVlX21lbV9jZ3JvdXBfcGFnZXMoKSB1bmNvbmRpdGlvbmFsbHlcXG4rICogb3ZlcndyaXRlcyBjdXJyZW50LVxcdTAwM2VyZWNsYWltX3N0YXRlIG9uIGVudHJ5IGFuZCByZXNldHMgaXQgdG8gTlVMTCBvbiBleGl0LlxcbisgKiBTbyBpbnZva2luZyBpdCBmcm9tIGFuIGluLWZsaWdodCByZWNsYWltIHdvdWxkIGNsb2JiZXIgdGhlIG91dGVyIHJlY2xhaW1cXG4rICogc3RhdGUgYW5kIGNvcnJ1cHQgaXRzIGFjY291bnRpbmcuXFxuKyAqXFxuKyAqIFRoZSBndWFyZCBpcyBQRl9NRU1BTExPQy4gRXZlcnkgcmVjbGFpbSBlbnRyeSBwb2ludCBtYXJrcyB0aGUgY3VycmVudFxcbisgKiB0YXNrIHdpdGggaXQgZm9yIHRoZSB3aG9sZSByZWNsYWltIHdpbmRvdzogdHJ5X3RvX2ZyZWVfbWVtX2Nncm91cF9wYWdlcygpXFxuKyAqIGFuZCBfX3BlcmZvcm1fcmVjbGFpbSgpIGRvIHNvIHZpYSBtZW1hbGxvY19ub3JlY2xhaW1fc2F2ZSgpLCBhbmQga3N3YXBkXFxuKyAqIGtlZXBzIGl0IHNldCBmb3IgaXRzIGVudGlyZSBsaWZldGltZS4gQSBob29rIGluc2lkZSB0aGUgcmVjbGFpbSBwYXRoXFxuKyAqIChzaHJpbmtfbm9kZSwgc2hyaW5rX3NsYWIsIC4uLikgZXhlY3V0ZXMgaW4gdGhlIGNvbnRleHQgb2YgdGhlXFxuKyAqIHJlY2xhaW1pbmcgdGFzaywgd2hlcmUgY3VycmVudC1cXHUwMDNlZmxhZ3MgYWxyZWFkeSBjYXJyaWVzIHRoZSBmbGFnLiBUaGUgcGFnZVxcbisgKiBhbGxvY2F0b3IsIHRoZSBtZW1jZyBjaGFyZ2luZyBwYXRoIGFuZCBub2RlX3JlY2xhaW0oKSByZWx5IG9uIHRoZSBzYW1lXFxuKyAqIGZsYWcgdG8gYXZvaWQgcmVjbGFpbSByZWN1cnNpb24uXFxuKyAqXFxuKyAqIEluIHRyeV90b19mcmVlX21lbV9jZ3JvdXBfcGFnZXMoKSwgcmVjbGFpbV9zdGF0ZSBpcyBzZXQgc2xpZ2h0bHkgYmVmb3JlXFxuKyAqIFBGX01FTUFMTE9DLCB3aXRoIG9ubHkgYSB0cmFjZXBvaW50IGluIGJldHdlZW4sIHdoaWNoIGEgc2xlZXBhYmxlIEJQRlxcbisgKiBwcm9ncmFtIGNhbm5vdCBhdHRhY2ggdG8uXFxuKyAqIEFsc28sIFBGX01FTUFMTE9DIGlzIHNldCBpbiBzb21lIG5vbi1yZWNsYWltIGNvbnRleHRzIChlLmcuIGRpcmVjdCBjb21wYWN0aW9uXFxuKyAqIGFuZCB2bWFsbG9jKSwgd2hlcmUgdGhlIGtmdW5jIGNvbnNlcnZhdGl2ZWx5IHJlZnVzZXMgdG8gcmVjbGFpbSBhcyB3ZWxsLlxcbisgKi9cXG4rc3RhdGljIGJvb2wgYnBmX2luX3JlY2xhaW1fY29udGV4dCh2b2lkKVxcbit7XFxuK1xcdHJldHVybiBjdXJyZW50LVxcdTAwM2VmbGFncyBcXHUwMDI2IFBGX01FTUFMTE9DO1xcbit9XFxuK1xcbisvKlxcbisgKiBTaGFyZWQgaW1wbGVtZW50YXRpb24gb2YgdGhlIHByb2FjdGl2ZSByZWNsYWltIGtmdW5jczogcGVyZm9ybXMgb25lXFxuKyAqIHJlY2xhaW0gcGFzcyBvbiBAbWVtY2cgd2l0aCBAbnJfcGFnZXMgYXMgdGhlIGdvYWwsIGFsbG93aW5nIHN3YXAsIGFuZFxcbisgKiBAc3dhcHBpbmVzcyBhcyB0aGUgYW5vbi9maWxlIGJhbGFuY2Ugb3ZlcnJpZGUgKE5VTEwgdG8gZm9sbG93IHRoZVxcbisgKiBjZ3JvdXAncyBvd24gc3dhcHBpbmVzcyBzZXR0aW5nKS5cXG4rICovXFxuK3N0YXRpYyB1bnNpZ25lZCBsb25nXFxuK2JwZl9wcm9hY3RpdmVfcmVjbGFpbV9wYWdlcyhzdHJ1Y3QgbWVtX2Nncm91cCAqbWVtY2csIHVuc2lnbmVkIGxvbmcgbnJfcGFnZXMsXFxuK1xcdFxcdFxcdCAgICBpbnQgKnN3YXBwaW5lc3MpXFxuK3tcXG4rXFx0aWYgKCFucl9wYWdlcyB8fCB1bmxpa2VseShicGZfaW5fcmVjbGFpbV9jb250ZXh0KCkpKVxcbitcXHRcXHRyZXR1cm4gMDtcXG4rXFxuK1xcdHJldHVybiB0cnlfdG9fZnJlZV9tZW1fY2dyb3VwX3BhZ2VzKG1lbWNnLCBucl9wYWdlcywgR0ZQX0tFUk5FTCxcXG4rXFx0XFx0XFx0XFx0XFx0ICAgIE1FTUNHX1JFQ0xBSU1fTUFZX1NXQVAgfFxcbitcXHRcXHRcXHRcXHRcXHQgICAgTUVNQ0dfUkVDTEFJTV9QUk9BQ1RJVkUsXFxuK1xcdFxcdFxcdFxcdFxcdCAgICBzd2FwcGluZXNzKTtcXG4rfVxcbitcXG4rLyoqXFxuKyAqIGJwZl9wcm9hY3RpdmVfcmVjbGFpbSAtIHByb2FjdGl2ZWx5IHJlY2xhaW0gbWVtb3J5IGZyb20gYSBtZW1vcnlcXG4rICogICAgICAgICAgICAgICAgICAgICAgICAgY2dyb3VwXFxuKyAqIEBtZW1jZzogdGhlIHRhcmdldCBtZW1vcnkgY2dyb3VwIHRvIHJlY2xhaW0gZnJvbVxcbisgKiBAc2l6ZTogIHRoZSBhbW91bnQgb2YgbWVtb3J5IHRvIHJlY2xhaW0sIGluIGJ5dGVzXFxuKyAqXFxuKyAqIFRyaWdnZXIgb25lIHByb2FjdGl2ZSByZWNsYWltIHBhc3Mgb24gQG1lbWNnLCBzaW1pbGFyIHRvIGEgd3JpdGUgdG9cXG4rICogdGhlIG1lbW9yeS5yZWNsYWltIGNncm91cCBmaWxlOiBwYWdlcyBhcmUgcmVjbGFpbWVkIGFjY29yZGluZyB0byB0aGVcXG4rICogY2dyb3VwJ3Mgb3duIHN3YXBwaW5lc3Mgc2V0dGluZyBhbmQgc3dhcCBpcyBhbGxvd2VkLiBOb3RlIHRoYXQsXFxuKyAqIHVubGlrZSBtZW1vcnkucmVjbGFpbSwgdGhpcyBkb2VzIG5vdCByZXRyeSB1bnRpbCBAc2l6ZSBpcyByZWFjaGVkO1xcbisgKiBjYWxsZXJzIGNhbiBpbnZva2UgaXQgYWdhaW4gaWYgbmVlZGVkLlxcbisgKlxcbisgKiBSZXR1cm46XFxuKyAqICAgVGhlIG51bWJlciBvZiBwYWdlcyBhY3R1YWxseSByZWNsYWltZWQsIG9yIDAgaWYgQHNpemUgaXMgc21hbGxlclxcbisgKiAgIHRoYW4gYSBwYWdlIG9yIHRoZSBjYWxsaW5nIHRhc2sgaXMgYWxyZWFkeSBpbiBhIHJlY2xhaW0vZnJlZWluZ1xcbisgKiAgIGNvbnRleHQgKFBGX01FTUFMTE9DKS5cXG4rICovXFxuK19fYnBmX2tmdW5jIHVuc2lnbmVkIGxvbmcgYnBmX3Byb2FjdGl2ZV9yZWNsYWltKHN0cnVjdCBtZW1fY2dyb3VwICptZW1jZyxcXG4rXFx0XFx0XFx0XFx0XFx0XFx0dW5zaWduZWQgbG9uZyBzaXplKVxcbit7XFxuK1xcdHJldHVybiBicGZfcHJvYWN0aXZlX3JlY2xhaW1fcGFnZXMobWVtY2csIHNpemUgLyBQQUdFX1NJWkUsIE5VTEwpO1xcbit9XFxuK1xcbisvKipcXG4rICogYnBmX3Byb2FjdGl2ZV9yZWNsYWltX3N3YXBwaW5lc3MgLSBwcm9hY3RpdmVseSByZWNsYWltIG1lbW9yeSBmcm9tIGFcXG4rICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZW1vcnkgY2dyb3VwIHdpdGggYW4gZXhwbGljaXRcXG4rICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzd2FwcGluZXNzXFxuKyAqIEBtZW1jZzogICAgICB0aGUgdGFyZ2V0IG1lbW9yeSBjZ3JvdXAgdG8gcmVjbGFpbSBmcm9tXFxuKyAqIEBzaXplOiAgICAgICB0aGUgYW1vdW50IG9mIG1lbW9yeSB0byByZWNsYWltLCBpbiBieXRlc1xcbisgKiBAc3dhcHBpbmVzczogc3dhcHBpbmVzcyBvdmVycmlkZSBmb3IgdGhpcyByZWNsYWltIHBhc3NcXG4rICpcXG4rICogU2FtZSBhcyBicGZfcHJvYWN0aXZlX3JlY2xhaW0oKSwgZXhjZXB0IHRoYXQgdGhlIGFub24vZmlsZSByZWNsYWltXFxuKyAqIGJhbGFuY2UgaXMgY29udHJvbGxlZCBieSBAc3dhcHBpbmVzcyBpbnN0ZWFkIG9mIHRoZSBjZ3JvdXAnc1xcbisgKiBzd2FwcGluZXNzIHNldHRpbmcuIFZhbGlkIHZhbHVlcyBhcmUgW01JTl9TV0FQUElORVNTLCBNQVhfU1dBUFBJTkVTU11cXG4rICogYW5kIFNXQVBQSU5FU1NfQU5PTl9PTkxZLCB3aGljaCByZXN0cmljdHMgcmVjbGFpbSB0byBhbm9uIGZvbGlvcy5cXG4rICpcXG4rICogUmV0dXJuOlxcbisgKiAgIFRoZSBudW1iZXIgb2YgcGFnZXMgYWN0dWFsbHkgcmVjbGFpbWVkLCBvciAwIGlmIEBzaXplIGlzIHNtYWxsZXJcXG4rICogICB0aGFuIGEgcGFnZSwgQHN3YXBwaW5lc3MgaXMgb3V0IG9mIHJhbmdlLCBvciB0aGUgY2FsbGluZyB0YXNrIGlzXFxuKyAqICAgYWxyZWFkeSBpbiBhIHJlY2xhaW0vZnJlZWluZyBjb250ZXh0IChQRl9NRU1BTExPQykuXFxuKyAqL1xcbitfX2JwZl9rZnVuYyB1bnNpZ25lZCBsb25nXFxuK2JwZl9wcm9hY3RpdmVfcmVjbGFpbV9zd2FwcGluZXNzKHN0cnVjdCBtZW1fY2dyb3VwICptZW1jZywgdW5zaWduZWQgbG9uZyBzaXplLFxcbitcXHRcXHRcXHRcXHQgaW50IHN3YXBwaW5lc3MpXFxuK3tcXG4rXFx0aWYgKHN3YXBwaW5lc3MgXFx1MDAzYyBNSU5fU1dBUFBJTkVTUyB8fCBzd2FwcGluZXNzIFxcdTAwM2UgU1dBUFBJTkVTU19BTk9OX09OTFkpXFxuK1xcdFxcdHJldHVybiAwO1xcbitcXG4rXFx0cmV0dXJuIGJwZl9wcm9hY3RpdmVfcmVjbGFpbV9wYWdlcyhtZW1jZywgc2l6ZSAvIFBBR0VfU0laRSxcXG4rXFx0XFx0XFx0XFx0XFx0ICAgXFx1MDAyNnN3YXBwaW5lc3MpO1xcbit9XFxuK1xcbiBfX2JwZl9rZnVuY19lbmRfZGVmcygpO1xcbiBcXG4gQlRGX0tGVU5DU19TVEFSVChicGZfbWVtY29udHJvbF9rZnVuY3MpXFxuQEAgLTE3Miw2ICsyNzAsOSBAQCBCVEZfSURfRkxBR1MoZnVuYywgYnBmX21lbV9jZ3JvdXBfdXNhZ2UpXFxuIEJURl9JRF9GTEFHUyhmdW5jLCBicGZfbWVtX2Nncm91cF9wYWdlX3N0YXRlKVxcbiBCVEZfSURfRkxBR1MoZnVuYywgYnBmX21lbV9jZ3JvdXBfZmx1c2hfc3RhdHMsIEtGX1NMRUVQQUJMRSlcXG4gXFxuK0JURl9JRF9GTEFHUyhmdW5jLCBicGZfcHJvYWN0aXZlX3JlY2xhaW0sIEtGX1NMRUVQQUJMRSlcXG4rQlRGX0lEX0ZMQUdTKGZ1bmMsIGJwZl9wcm9hY3RpdmVfcmVjbGFpbV9zd2FwcGluZXNzLCBLRl9TTEVFUEFCTEUpXFxuK1xcbiBCVEZfS0ZVTkNTX0VORChicGZfbWVtY29udHJvbF9rZnVuY3MpXFxuIFxcbiBzdGF0aWMgY29uc3Qgc3RydWN0IGJ0Zl9rZnVuY19pZF9zZXQgYnBmX21lbWNvbnRyb2xfa2Z1bmNfc2V0ID0ge1xcbmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ190ZXN0cy9tZW1jZ19hc3luY19yZWNsYWltLmMgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ190ZXN0cy9tZW1jZ19hc3luY19yZWNsYWltLmNcXG5uZXcgZmlsZSBtb2RlIDEwMDY0NFxcbmluZGV4IDAwMDAwMDAwMDAwMDAuLmU5OTBkMWZkYzc5ZmRcXG4tLS0gL2Rldi9udWxsXFxuKysrIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dfdGVzdHMvbWVtY2dfYXN5bmNfcmVjbGFpbS5jXFxuQEAgLTAsMCArMSw0NzkgQEBcXG4rLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjBcXG4rLypcXG4rICogTWVtb3J5IGNvbnRyb2xsZXIgZUJQRiBhc3luYyByZWNsYWltIHRlc3RcXG4rICovXFxuK1xcbisjaW5jbHVkZSBcXHUwMDNjdGVzdF9wcm9ncy5oXFx1MDAzZVxcbisjaW5jbHVkZSBcXHUwMDNjc3lzL21tYW4uaFxcdTAwM2VcXG4rI2luY2x1ZGUgXFx1MDAzY3N5cy9zdGF0LmhcXHUwMDNlXFxuKyNpbmNsdWRlIFxcdTAwM2NzeXMvdmZzLmhcXHUwMDNlXFxuKyNpbmNsdWRlIFxcdTAwM2NzeXMvd2FpdC5oXFx1MDAzZVxcbisjaW5jbHVkZSBcXHUwMDNjZmNudGwuaFxcdTAwM2VcXG4rI2luY2x1ZGUgXFx1MDAzY3NpZ25hbC5oXFx1MDAzZVxcbisjaW5jbHVkZSBcXHUwMDNjdGltZS5oXFx1MDAzZVxcbisjaW5jbHVkZSBcXHUwMDNjdW5pc3RkLmhcXHUwMDNlXFxuKyNpbmNsdWRlIFxcdTAwM2NzdGRpby5oXFx1MDAzZVxcbisjaW5jbHVkZSBcXHUwMDNjc3RkbGliLmhcXHUwMDNlXFxuKyNpbmNsdWRlIFxcdTAwM2NzdHJpbmcuaFxcdTAwM2VcXG4rI2luY2x1ZGUgXFx1MDAzY2xpbWl0cy5oXFx1MDAzZVxcbisjaW5jbHVkZSBcXHUwMDNjbGludXgvbWFnaWMuaFxcdTAwM2VcXG4rXFxuKyNpbmNsdWRlIFxcXCJjZ3JvdXBfaGVscGVycy5oXFxcIlxcbitcXG4rc3RydWN0IGJwZl9hcmdzX3Mge1xcbitcXHR1NjQgaGlnaF9jZ3JvdXBfaWQ7XFxuK1xcdHU2NCBsb3dfY2dyb3VwX2lkO1xcbitcXHR1NjQgZXZlbnRfZGVsdGFfdGhyZXNob2xkO1xcbitcXHR1NjQgY2hlY2tfbnM7XFxuK307XFxuK1xcbisjaW5jbHVkZSBcXFwibWVtY2dfYXN5bmNfcmVjbGFpbS5za2VsLmhcXFwiXFxuK1xcbisjZGVmaW5lIEZJTEVfU0laRSAoMzIgKiAxMDI0ICogMTAyNHVsKVxcbisjZGVmaW5lIEJVRkZFUl9TSVpFICg0MDk2KVxcbisjZGVmaW5lIENHX0xJTUlUICgzMiAqIDEwMjQgKiAxMDI0dWwpXFxuKyNkZWZpbmUgUkVBRF9USU1FUyA1MFxcbitcXG4rI2RlZmluZSBDR19ESVIgXFxcIi9tZW1jZ19hc3luY19yZWNsYWltXFxcIlxcbisjZGVmaW5lIENHX0hJR0hfRElSIENHX0RJUiBcXFwiL2hpZ2hcXFwiXFxuKyNkZWZpbmUgQ0dfTE9XX0RJUiBDR19ESVIgXFxcIi9sb3dcXFwiXFxuK1xcbisjZGVmaW5lIENIRUNLX1BFUklPRF9OUyAoMiAqIDEwMDAgKiAxMDAwdWxsKVxcbisjZGVmaW5lIEVWRU5UX0RFTFRBX1RIUkVTSE9MRCAxXFxuK1xcbisvKlxcbisgKiBUaGUgd29ya2xvYWQgZmlsZXMgbXVzdCBzaXQgb24gYSByZWd1bGFyIGZpbGVzeXN0ZW06IHdpdGggc3dhcFxcbisgKiBkaXNhYmxlZCBmb3IgdGhlIGNncm91cCwgdG1wZnMvcmFtZnMgcGFnZXMgYXJlIHVuZXZpY3RhYmxlIGFuZCB3b3VsZFxcbisgKiBPT00gdGhlIGNncm91cCBpbnN0ZWFkIG9mIGV4ZXJjaXNpbmcgcmVjbGFpbTsgdGhleSBhcmUgYWxzbyBjaGFyZ2VkXFxuKyAqIGFzIGFub255bW91cyBtZW1vcnksIHNvIHRoZXkgbmV2ZXIgcmFpc2UgdGhlIFdPUktJTkdTRVRfUkVGQVVMVF9GSUxFXFxuKyAqIGV2ZW50cyB0aGUgQlBGIHByb2dyYW0gbW9uaXRvcnMuIEZhbGwgYmFjayB0byB0aGUgY3VycmVudCBkaXJlY3RvcnlcXG4rICogd2hlbiAvdG1wIGlzIGJhY2tlZCBieSBzdWNoIGEgZmlsZXN5c3RlbS5cXG4rICovXFxuK3N0YXRpYyBjb25zdCBjaGFyICp3b3JrbG9hZF9maWxlc19kaXIodm9pZClcXG4re1xcbitcXHRzdHJ1Y3Qgc3RhdGZzIHN0O1xcbitcXG4rXFx0aWYgKCFzdGF0ZnMoXFxcIi90bXBcXFwiLCBcXHUwMDI2c3QpIFxcdTAwMjZcXHUwMDI2XFxuK1xcdCAgICAoc3QuZl90eXBlID09IFRNUEZTX01BR0lDIHx8IHN0LmZfdHlwZSA9PSBSQU1GU19NQUdJQykpXFxuK1xcdFxcdHJldHVybiBcXFwiLlxcXCI7XFxuK1xcdHJldHVybiBcXFwiL3RtcFxcXCI7XFxuK31cXG4rXFxuKy8qXFxuKyAqIFRoZSB3b3JrbG9hZCBjaGlsZHJlbiBydW4gYWZ0ZXIgdGVzdF9wcm9ncyBoaWphY2tlZCBzdGRpbywgc29cXG4rICogYW55dGhpbmcgdGhleSBwcmludCBpcyBsb3N0IHdpdGggdGhlaXIgcHJpdmF0ZSBjb3B5IG9mIHRoZSBoaWphY2tlZFxcbisgKiBidWZmZXIuIFRoZSBleGl0IHN0YXR1cyBpcyB0aGUgb25seSBkaWFnbm9zdGljcyBjaGFubmVsIHRoYXQgcmVhY2hlc1xcbisgKiB0aGUgcGFyZW50LCBzbyBlYWNoIGZhaWxpbmcgc3RlcCBnZXRzIGl0cyBvd24gY29kZS5cXG4rICovXFxuK2VudW0gY2hpbGRfZXhpdF9jb2RlIHtcXG4rXFx0Q0hJTERfRVhJVF9PSyA9IDAsXFxuK1xcdENISUxEX0VYSVRfSk9JTl9DR1JPVVAsXFxuK1xcdENISUxEX0VYSVRfV1JJVEVfRklMRSxcXG4rXFx0Q0hJTERfRVhJVF9SRUFEX0ZJTEUsXFxuK1xcdENISUxEX0VYSVRfVElNRV9GSUxFLFxcbit9O1xcbitcXG4rc3RhdGljIGNvbnN0IGNoYXIgKmNoaWxkX2V4aXRfc3RyKGludCBjb2RlKVxcbit7XFxuK1xcdHN3aXRjaCAoY29kZSkge1xcbitcXHRjYXNlIENISUxEX0VYSVRfT0s6XFxuK1xcdFxcdHJldHVybiBcXFwic3VjY2Vzc1xcXCI7XFxuK1xcdGNhc2UgQ0hJTERfRVhJVF9KT0lOX0NHUk9VUDpcXG4rXFx0XFx0cmV0dXJuIFxcXCJqb2luIGNncm91cFxcXCI7XFxuK1xcdGNhc2UgQ0hJTERfRVhJVF9XUklURV9GSUxFOlxcbitcXHRcXHRyZXR1cm4gXFxcIndyaXRlIGRhdGEgZmlsZVxcXCI7XFxuK1xcdGNhc2UgQ0hJTERfRVhJVF9SRUFEX0ZJTEU6XFxuK1xcdFxcdHJldHVybiBcXFwicmVhZCBkYXRhIGZpbGVcXFwiO1xcbitcXHRjYXNlIENISUxEX0VYSVRfVElNRV9GSUxFOlxcbitcXHRcXHRyZXR1cm4gXFxcIndyaXRlIHRpbWUgZmlsZVxcXCI7XFxuK1xcdGRlZmF1bHQ6XFxuK1xcdFxcdHJldHVybiBcXFwidW5rbm93blxcXCI7XFxuK1xcdH1cXG4rfVxcbitcXG4rc3RhdGljIGludCBzZXR1cF9oaWdoX2xvd19jZ3JvdXBzKHU2NCAqaGlnaF9jZ3JvdXBfaWQsIHU2NCAqbG93X2Nncm91cF9pZClcXG4re1xcbitcXHRpbnQgcmV0O1xcbitcXHRjaGFyIGxpbWl0X2J1ZlsyMF07XFxuK1xcbitcXHRyZXQgPSBzZXR1cF9jZ3JvdXBfZW52aXJvbm1lbnQoKTtcXG4rXFx0aWYgKCFBU1NFUlRfT0socmV0LCBcXFwic2V0dXBfY2dyb3VwX2Vudmlyb25tZW50XFxcIikpXFxuK1xcdFxcdGdvdG8gY2xlYW51cDtcXG4rXFxuK1xcdHJldCA9IGNyZWF0ZV9hbmRfZ2V0X2Nncm91cChDR19ESVIpO1xcbitcXHRpZiAoIUFTU0VSVF9HRShyZXQsIDAsIFxcXCJjcmVhdGVfYW5kX2dldF9jZ3JvdXAgXFxcIiBDR19ESVIpKVxcbitcXHRcXHRnb3RvIGNsZWFudXA7XFxuK1xcdGNsb3NlKHJldCk7XFxuK1xcbitcXHRyZXQgPSBlbmFibGVfY29udHJvbGxlcnMoQ0dfRElSLCBcXFwibWVtb3J5XFxcIik7XFxuK1xcdGlmICghQVNTRVJUX09LKHJldCwgXFxcImVuYWJsZV9jb250cm9sbGVyc1xcXCIpKVxcbitcXHRcXHRnb3RvIGNsZWFudXA7XFxuK1xcbitcXHRzbnByaW50ZihsaW1pdF9idWYsIHNpemVvZihsaW1pdF9idWYpLCBcXFwiJWx1XFxcIiwgQ0dfTElNSVQpO1xcbitcXHRyZXQgPSB3cml0ZV9jZ3JvdXBfZmlsZShDR19ESVIsIFxcXCJtZW1vcnkubWF4XFxcIiwgbGltaXRfYnVmKTtcXG4rXFx0aWYgKCFBU1NFUlRfT0socmV0LCBcXFwid3JpdGVfY2dyb3VwX2ZpbGUgbWVtb3J5Lm1heFxcXCIpKVxcbitcXHRcXHRnb3RvIGNsZWFudXA7XFxuK1xcbitcXHQvKlxcbitcXHQgKiBLZWVwIHRoZSB3b3JrbG9hZHMgZnJvbSBzd2FwcGluZyBvdXQuIFdpdGggQ09ORklHX1NXQVA9biB0aGVcXG4rXFx0ICogbWVtb3J5LnN3YXAubWF4IGZpbGUgZG9lcyBub3QgZXhpc3QsIGFuZCBubyBzd2FwIGNhbiBoYXBwZW5cXG4rXFx0ICogYW55d2F5LCBzbyBza2lwIHRoZSB3cml0ZS5cXG4rXFx0ICovXFxuK1xcdGlmICghYWNjZXNzKFxcXCIvcHJvYy9zd2Fwc1xcXCIsIEZfT0spKSB7XFxuK1xcdFxcdHJldCA9IHdyaXRlX2Nncm91cF9maWxlKENHX0RJUiwgXFxcIm1lbW9yeS5zd2FwLm1heFxcXCIsIFxcXCIwXFxcIik7XFxuK1xcdFxcdGlmICghQVNTRVJUX09LKHJldCwgXFxcIndyaXRlX2Nncm91cF9maWxlIG1lbW9yeS5zd2FwLm1heFxcXCIpKVxcbitcXHRcXHRcXHRnb3RvIGNsZWFudXA7XFxuK1xcdH1cXG4rXFxuK1xcdHJldCA9IGNyZWF0ZV9hbmRfZ2V0X2Nncm91cChDR19ISUdIX0RJUik7XFxuK1xcdGlmICghQVNTRVJUX0dFKHJldCwgMCwgXFxcImNyZWF0ZV9hbmRfZ2V0X2Nncm91cCBcXFwiIENHX0hJR0hfRElSKSlcXG4rXFx0XFx0Z290byBjbGVhbnVwO1xcbitcXHRjbG9zZShyZXQpO1xcbitcXG4rXFx0KmhpZ2hfY2dyb3VwX2lkID0gZ2V0X2Nncm91cF9pZChDR19ISUdIX0RJUik7XFxuK1xcdGlmICghQVNTRVJUX0dUKCpoaWdoX2Nncm91cF9pZCwgMCwgXFxcImdldF9jZ3JvdXBfaWRcXFwiKSlcXG4rXFx0XFx0Z290byBjbGVhbnVwO1xcbitcXG4rXFx0cmV0ID0gY3JlYXRlX2FuZF9nZXRfY2dyb3VwKENHX0xPV19ESVIpO1xcbitcXHRpZiAoIUFTU0VSVF9HRShyZXQsIDAsIFxcXCJjcmVhdGVfYW5kX2dldF9jZ3JvdXAgXFxcIiBDR19MT1dfRElSKSlcXG4rXFx0XFx0Z290byBjbGVhbnVwO1xcbitcXHRjbG9zZShyZXQpO1xcbitcXG4rXFx0Kmxvd19jZ3JvdXBfaWQgPSBnZXRfY2dyb3VwX2lkKENHX0xPV19ESVIpO1xcbitcXHRpZiAoIUFTU0VSVF9HVCgqbG93X2Nncm91cF9pZCwgMCwgXFxcImdldF9jZ3JvdXBfaWRcXFwiKSlcXG4rXFx0XFx0Z290byBjbGVhbnVwO1xcbitcXG4rXFx0cmV0dXJuIDA7XFxuK1xcbitjbGVhbnVwOlxcbitcXHRjbGVhbnVwX2Nncm91cF9lbnZpcm9ubWVudCgpO1xcbitcXHRyZXR1cm4gLTE7XFxuK31cXG4rXFxuK3N0YXRpYyBpbnQgd3JpdGVfZmlsZShjb25zdCBjaGFyICpmaWxlbmFtZSlcXG4re1xcbitcXHRpbnQgcmV0ID0gLTE7XFxuK1xcdHNpemVfdCB3cml0dGVuID0gMDtcXG4rXFx0Y2hhciAqYnVmZmVyO1xcbitcXHRGSUxFICpmcDtcXG4rXFxuK1xcdGZwID0gZm9wZW4oZmlsZW5hbWUsIFxcXCJ3YlxcXCIpO1xcbitcXHRpZiAoIWZwKVxcbitcXHRcXHRnb3RvIG91dDtcXG4rXFxuK1xcdGJ1ZmZlciA9IG1hbGxvYyhCVUZGRVJfU0laRSk7XFxuK1xcdGlmICghYnVmZmVyKVxcbitcXHRcXHRnb3RvIGNsZWFudXBfZnA7XFxuK1xcbitcXHRtZW1zZXQoYnVmZmVyLCAnQScsIEJVRkZFUl9TSVpFKTtcXG4rXFxuK1xcdHdoaWxlICh3cml0dGVuIFxcdTAwM2MgRklMRV9TSVpFKSB7XFxuK1xcdFxcdHNpemVfdCB0b193cml0ZSA9IEZJTEVfU0laRSAtIHdyaXR0ZW4gXFx1MDAzYyBCVUZGRVJfU0laRSA/XFxuK1xcdFxcdFxcdFxcdCAgRklMRV9TSVpFIC0gd3JpdHRlbiA6IEJVRkZFUl9TSVpFO1xcbitcXG4rXFx0XFx0aWYgKGZ3cml0ZShidWZmZXIsIDEsIHRvX3dyaXRlLCBmcCkgIT0gdG9fd3JpdGUpXFxuK1xcdFxcdFxcdGdvdG8gY2xlYW51cDtcXG4rXFx0XFx0d3JpdHRlbiArPSB0b193cml0ZTtcXG4rXFx0fVxcbitcXG4rXFx0cmV0ID0gMDtcXG4rY2xlYW51cDpcXG4rXFx0ZnJlZShidWZmZXIpO1xcbitjbGVhbnVwX2ZwOlxcbitcXHRmY2xvc2UoZnApO1xcbitvdXQ6XFxuK1xcdHJldHVybiByZXQ7XFxuK31cXG4rXFxuK3N0YXRpYyBpbnQgcmVhZF9maWxlKGNvbnN0IGNoYXIgKmZpbGVuYW1lLCBpbnQgaXRlcmF0aW9ucylcXG4re1xcbitcXHRpbnQgcmV0ID0gLTE7XFxuK1xcdGxvbmcgcGFnZV9zaXplID0gc3lzY29uZihfU0NfUEFHRVNJWkUpO1xcbitcXHRjaGFyICptYXA7XFxuK1xcdHNpemVfdCBpO1xcbitcXHRpbnQgZmQ7XFxuK1xcdHN0cnVjdCBzdGF0IHNiO1xcbitcXG4rXFx0ZmQgPSBvcGVuKGZpbGVuYW1lLCBPX1JET05MWSk7XFxuK1xcdGlmIChmZCA9PSAtMSlcXG4rXFx0XFx0Z290byBvdXQ7XFxuK1xcbitcXHRpZiAoZnN0YXQoZmQsIFxcdTAwMjZzYikgPT0gLTEpXFxuK1xcdFxcdGdvdG8gY2xlYW51cF9mZDtcXG4rXFxuK1xcdGlmIChzYi5zdF9zaXplICE9IEZJTEVfU0laRSkge1xcbitcXHRcXHRmcHJpbnRmKHN0ZGVyciwgXFxcIkZpbGUgc2l6ZSBtaXNtYXRjaDogZXhwZWN0ZWQgJWx1LCBnb3QgJWx1XFxcXG5cXFwiLFxcbitcXHRcXHRcXHQodW5zaWduZWQgbG9uZylGSUxFX1NJWkUsICh1bnNpZ25lZCBsb25nKXNiLnN0X3NpemUpO1xcbitcXHRcXHRnb3RvIGNsZWFudXBfZmQ7XFxuK1xcdH1cXG4rXFxuK1xcdG1hcCA9IG1tYXAoTlVMTCwgRklMRV9TSVpFLCBQUk9UX1JFQUQsIE1BUF9QUklWQVRFLCBmZCwgMCk7XFxuK1xcdGlmIChtYXAgPT0gTUFQX0ZBSUxFRClcXG4rXFx0XFx0Z290byBjbGVhbnVwX2ZkO1xcbitcXG4rXFx0Zm9yIChpbnQgaXRlciA9IDA7IGl0ZXIgXFx1MDAzYyBpdGVyYXRpb25zOyBpdGVyKyspIHtcXG4rXFx0XFx0Zm9yIChpID0gMDsgaSBcXHUwMDNjIEZJTEVfU0laRTsgaSArPSBwYWdlX3NpemUpIHtcXG4rXFx0XFx0XFx0LyogYWNjZXNzIGEgYnl0ZSB0byB0cmlnZ2VyIHBhZ2UgZmF1bHQgKi9cXG4rXFx0XFx0XFx0dm9sYXRpbGUgY2hhciB2ID0gbWFwW2ldO1xcbitcXHRcXHRcXHQodm9pZCl2O1xcbitcXHRcXHR9XFxuK1xcdH1cXG4rXFxuK1xcdGlmIChtdW5tYXAobWFwLCBGSUxFX1NJWkUpID09IC0xKVxcbitcXHRcXHRnb3RvIGNsZWFudXBfZmQ7XFxuK1xcbitcXHRyZXQgPSAwO1xcbitcXG4rY2xlYW51cF9mZDpcXG4rXFx0Y2xvc2UoZmQpO1xcbitvdXQ6XFxuK1xcdHJldHVybiByZXQ7XFxuK31cXG4rXFxuK3N0YXRpYyBpbnQgcmVhbF90ZXN0X2NoaWxkX3dvcmsoY29uc3QgY2hhciAqY2dyb3VwX3BhdGgsIGNoYXIgKmRhdGFfZmlsZW5hbWUsXFxuK1xcdFxcdFxcdFxcdGNoYXIgKnRpbWVfZmlsZW5hbWUsIGludCByZWFkX3RpbWVzKVxcbit7XFxuK1xcdHN0cnVjdCB0aW1lc3BlYyBzdGFydCwgZW5kO1xcbitcXHRkb3VibGUgZWxhcHNlZDtcXG4rXFx0RklMRSAqZnA7XFxuK1xcbitcXHRpZiAoam9pbl9wYXJlbnRfY2dyb3VwKGNncm91cF9wYXRoKSlcXG4rXFx0XFx0cmV0dXJuIENISUxEX0VYSVRfSk9JTl9DR1JPVVA7XFxuK1xcbitcXHRjbG9ja19nZXR0aW1lKENMT0NLX01PTk9UT05JQywgXFx1MDAyNnN0YXJ0KTtcXG4rXFxuK1xcdGlmICh3cml0ZV9maWxlKGRhdGFfZmlsZW5hbWUpKVxcbitcXHRcXHRyZXR1cm4gQ0hJTERfRVhJVF9XUklURV9GSUxFO1xcbitcXG4rXFx0aWYgKHJlYWRfZmlsZShkYXRhX2ZpbGVuYW1lLCByZWFkX3RpbWVzKSlcXG4rXFx0XFx0cmV0dXJuIENISUxEX0VYSVRfUkVBRF9GSUxFO1xcbitcXG4rXFx0Y2xvY2tfZ2V0dGltZShDTE9DS19NT05PVE9OSUMsIFxcdTAwMjZlbmQpO1xcbitcXG4rXFx0aWYgKCF0aW1lX2ZpbGVuYW1lKVxcbitcXHRcXHRyZXR1cm4gQ0hJTERfRVhJVF9PSztcXG4rXFxuK1xcdGVsYXBzZWQgPSAoZW5kLnR2X3NlYyAtIHN0YXJ0LnR2X3NlYykgK1xcbitcXHRcXHQgIChlbmQudHZfbnNlYyAtIHN0YXJ0LnR2X25zZWMpIC8gMTAwMDAwMDAwMC4wO1xcbitcXHRwcmludGYoXFxcIiUuNmZcXFxcblxcXCIsIGVsYXBzZWQpO1xcbitcXG4rXFx0ZnAgPSBmb3Blbih0aW1lX2ZpbGVuYW1lLCBcXFwid1xcXCIpO1xcbitcXHRpZiAoIWZwKVxcbitcXHRcXHRyZXR1cm4gQ0hJTERfRVhJVF9USU1FX0ZJTEU7XFxuK1xcdGZwcmludGYoZnAsIFxcXCIlLjZmXFxcIiwgZWxhcHNlZCk7XFxuK1xcdGZjbG9zZShmcCk7XFxuK1xcbitcXHRyZXR1cm4gQ0hJTERfRVhJVF9PSztcXG4rfVxcbitcXG4rc3RhdGljIGludCBnZXRfdGltZShjaGFyICp0aW1lX2ZpbGVuYW1lLCBkb3VibGUgKnRpbWUpXFxuK3tcXG4rXFx0aW50IHJldCA9IC0xO1xcbitcXHRGSUxFICpmcDtcXG4rXFx0Y2hhciBidWZbNjRdO1xcbitcXG4rXFx0ZnAgPSBmb3Blbih0aW1lX2ZpbGVuYW1lLCBcXFwiclxcXCIpO1xcbitcXHRpZiAoIUFTU0VSVF9PS19QVFIoZnAsIFxcXCJmb3BlblxcXCIpKVxcbitcXHRcXHRnb3RvIG91dDtcXG4rXFxuK1xcdGlmICghQVNTRVJUX09LX1BUUihmZ2V0cyhidWYsIHNpemVvZihidWYpLCBmcCksIFxcXCJmZ2V0c1xcXCIpKVxcbitcXHRcXHRnb3RvIGNsZWFudXA7XFxuK1xcbitcXHRpZiAoc3NjYW5mKGJ1ZiwgXFxcIiVsZlxcXCIsIHRpbWUpICE9IDEpIHtcXG4rXFx0XFx0UFJJTlRfRkFJTChcXFwic3NjYW5mICVzXFxcIiwgYnVmKTtcXG4rXFx0XFx0Z290byBjbGVhbnVwO1xcbitcXHR9XFxuK1xcbitcXHRyZXQgPSAwO1xcbitjbGVhbnVwOlxcbitcXHRmY2xvc2UoZnApO1xcbitvdXQ6XFxuK1xcdHJldHVybiByZXQ7XFxuK31cXG4rXFxuK3N0YXRpYyBpbnRcXG4rcnVuX2hpZ2hfbG93X3dvcmtsb2FkKGRvdWJsZSAqaGlnaF9lbGFwc2VkLCBkb3VibGUgKmxvd19lbGFwc2VkLCBpbnQgcmVhZF90aW1lcylcXG4re1xcbitcXHRjaGFyIGhpZ2hfZGF0YV9maWxlW1BBVEhfTUFYXTtcXG4rXFx0Y2hhciBsb3dfZGF0YV9maWxlW1BBVEhfTUFYXTtcXG4rXFx0Y2hhciBoaWdoX3RpbWVfZmlsZVtQQVRIX01BWF07XFxuK1xcdGNoYXIgbG93X3RpbWVfZmlsZVtQQVRIX01BWF07XFxuK1xcdGNvbnN0IGNoYXIgKmRpciA9IHdvcmtsb2FkX2ZpbGVzX2RpcigpO1xcbitcXHRwaWRfdCBoaWdoX3BpZCA9IC0xLCBsb3dfcGlkID0gLTE7XFxuK1xcdGludCBmZCwgc3RhdHVzO1xcbitcXHRpbnQgcmV0ID0gLTE7XFxuK1xcbitcXHRzbnByaW50ZihoaWdoX2RhdGFfZmlsZSwgc2l6ZW9mKGhpZ2hfZGF0YV9maWxlKSxcXG4rXFx0XFx0IFxcXCIlcy9tZW1jZ19hc3luY19oaWdoX2RhdGFfWFhYWFhYXFxcIiwgZGlyKTtcXG4rXFx0c25wcmludGYobG93X2RhdGFfZmlsZSwgc2l6ZW9mKGxvd19kYXRhX2ZpbGUpLFxcbitcXHRcXHQgXFxcIiVzL21lbWNnX2FzeW5jX2xvd19kYXRhX1hYWFhYWFxcXCIsIGRpcik7XFxuK1xcdHNucHJpbnRmKGhpZ2hfdGltZV9maWxlLCBzaXplb2YoaGlnaF90aW1lX2ZpbGUpLFxcbitcXHRcXHQgXFxcIiVzL21lbWNnX2FzeW5jX2hpZ2hfdGltZV9YWFhYWFhcXFwiLCBkaXIpO1xcbitcXHRzbnByaW50Zihsb3dfdGltZV9maWxlLCBzaXplb2YobG93X3RpbWVfZmlsZSksXFxuK1xcdFxcdCBcXFwiJXMvbWVtY2dfYXN5bmNfbG93X3RpbWVfWFhYWFhYXFxcIiwgZGlyKTtcXG4rXFxuK1xcdGZkID0gbWtzdGVtcChoaWdoX2RhdGFfZmlsZSk7XFxuK1xcdGlmICghQVNTRVJUX0dFKGZkLCAwLCBcXFwibWtzdGVtcFxcXCIpKVxcbitcXHRcXHRnb3RvIGNsZWFudXA7XFxuK1xcdGNsb3NlKGZkKTtcXG4rXFxuK1xcdGZkID0gbWtzdGVtcChsb3dfZGF0YV9maWxlKTtcXG4rXFx0aWYgKCFBU1NFUlRfR0UoZmQsIDAsIFxcXCJta3N0ZW1wXFxcIikpXFxuK1xcdFxcdGdvdG8gY2xlYW51cDtcXG4rXFx0Y2xvc2UoZmQpO1xcbitcXG4rXFx0ZmQgPSBta3N0ZW1wKGhpZ2hfdGltZV9maWxlKTtcXG4rXFx0aWYgKCFBU1NFUlRfR0UoZmQsIDAsIFxcXCJta3N0ZW1wXFxcIikpXFxuK1xcdFxcdGdvdG8gY2xlYW51cDtcXG4rXFx0Y2xvc2UoZmQpO1xcbitcXG4rXFx0ZmQgPSBta3N0ZW1wKGxvd190aW1lX2ZpbGUpO1xcbitcXHRpZiAoIUFTU0VSVF9HRShmZCwgMCwgXFxcIm1rc3RlbXBcXFwiKSlcXG4rXFx0XFx0Z290byBjbGVhbnVwO1xcbitcXHRjbG9zZShmZCk7XFxuK1xcbitcXHRsb3dfcGlkID0gZm9yaygpO1xcbitcXHRpZiAoIUFTU0VSVF9HRShsb3dfcGlkLCAwLCBcXFwiZm9yayBsb3dcXFwiKSlcXG4rXFx0XFx0Z290byBjbGVhbnVwO1xcbitcXHRpZiAobG93X3BpZCA9PSAwKVxcbitcXHRcXHRleGl0KHJlYWxfdGVzdF9jaGlsZF93b3JrKENHX0xPV19ESVIsIGxvd19kYXRhX2ZpbGUsXFxuK1xcdFxcdFxcdFxcdFxcdCAgbG93X3RpbWVfZmlsZSwgcmVhZF90aW1lcykpO1xcbitcXG4rXFx0aGlnaF9waWQgPSBmb3JrKCk7XFxuK1xcdGlmICghQVNTRVJUX0dFKGhpZ2hfcGlkLCAwLCBcXFwiZm9yayBoaWdoXFxcIikpXFxuK1xcdFxcdGdvdG8gY2xlYW51cDtcXG4rXFx0aWYgKGhpZ2hfcGlkID09IDApXFxuK1xcdFxcdGV4aXQocmVhbF90ZXN0X2NoaWxkX3dvcmsoQ0dfSElHSF9ESVIsIGhpZ2hfZGF0YV9maWxlLFxcbitcXHRcXHRcXHRcXHRcXHQgIGhpZ2hfdGltZV9maWxlLCByZWFkX3RpbWVzKSk7XFxuK1xcbitcXHRsb3dfcGlkID0gd2FpdHBpZChsb3dfcGlkLCBcXHUwMDI2c3RhdHVzLCAwKTtcXG4rXFx0aWYgKCFBU1NFUlRfR1QobG93X3BpZCwgMCwgXFxcImxvdyB3YWl0cGlkXFxcIikpXFxuK1xcdFxcdGdvdG8gY2xlYW51cDtcXG4rXFx0LypcXG4rXFx0ICogVGhlIGNoaWxkIGhhcyBiZWVuIHJlYXBlZCBhbmQgaXRzIFBJRCBjYW4gYWxyZWFkeSBiZSByZXVzZWQsXFxuK1xcdCAqIHNvIG1hcmsgaXQgdG8ga2VlcCBjbGVhbnVwIGZyb20gc2lnbmFsaW5nIGFuIHVucmVsYXRlZCBwcm9jZXNzLlxcbitcXHQgKi9cXG4rXFx0bG93X3BpZCA9IC0xO1xcbitcXHRpZiAoIUFTU0VSVF9UUlVFKFdJRkVYSVRFRChzdGF0dXMpLCBcXFwibG93IGV4aXRlZFxcXCIpKVxcbitcXHRcXHRnb3RvIGNsZWFudXA7XFxuK1xcdGlmIChXRVhJVFNUQVRVUyhzdGF0dXMpICE9IENISUxEX0VYSVRfT0spIHtcXG4rXFx0XFx0UFJJTlRfRkFJTChcXFwibG93IGNoaWxkIGZhaWxlZCBhdDogJXMgKGV4aXQgc3RhdHVzICVkKVxcXCIsXFxuK1xcdFxcdFxcdCAgIGNoaWxkX2V4aXRfc3RyKFdFWElUU1RBVFVTKHN0YXR1cykpLFxcbitcXHRcXHRcXHQgICBXRVhJVFNUQVRVUyhzdGF0dXMpKTtcXG4rXFx0XFx0Z290byBjbGVhbnVwO1xcbitcXHR9XFxuK1xcbitcXHRoaWdoX3BpZCA9IHdhaXRwaWQoaGlnaF9waWQsIFxcdTAwMjZzdGF0dXMsIDApO1xcbitcXHRpZiAoIUFTU0VSVF9HVChoaWdoX3BpZCwgMCwgXFxcImhpZ2ggd2FpdHBpZFxcXCIpKVxcbitcXHRcXHRnb3RvIGNsZWFudXA7XFxuK1xcdC8qIFNhbWUgYXMgYWJvdmU6IHRoZSByZWFwZWQgUElEIG11c3Qgbm90IGJlIHNpZ25hbGVkIGFnYWluLiAqL1xcbitcXHRoaWdoX3BpZCA9IC0xO1xcbitcXHRpZiAoIUFTU0VSVF9UUlVFKFdJRkVYSVRFRChzdGF0dXMpLCBcXFwiaGlnaCBleGl0ZWRcXFwiKSlcXG4rXFx0XFx0Z290byBjbGVhbnVwO1xcbitcXHRpZiAoV0VYSVRTVEFUVVMoc3RhdHVzKSAhPSBDSElMRF9FWElUX09LKSB7XFxuK1xcdFxcdFBSSU5UX0ZBSUwoXFxcImhpZ2ggY2hpbGQgZmFpbGVkIGF0OiAlcyAoZXhpdCBzdGF0dXMgJWQpXFxcIixcXG4rXFx0XFx0XFx0ICAgY2hpbGRfZXhpdF9zdHIoV0VYSVRTVEFUVVMoc3RhdHVzKSksXFxuK1xcdFxcdFxcdCAgIFdFWElUU1RBVFVTKHN0YXR1cykpO1xcbitcXHRcXHRnb3RvIGNsZWFudXA7XFxuK1xcdH1cXG4rXFxuK1xcdGlmIChnZXRfdGltZShoaWdoX3RpbWVfZmlsZSwgaGlnaF9lbGFwc2VkKSlcXG4rXFx0XFx0Z290byBjbGVhbnVwO1xcbitcXHRpZiAoZ2V0X3RpbWUobG93X3RpbWVfZmlsZSwgbG93X2VsYXBzZWQpKVxcbitcXHRcXHRnb3RvIGNsZWFudXA7XFxuK1xcbitcXHRyZXQgPSAwO1xcbitcXG4rY2xlYW51cDpcXG4rXFx0LyogT24gZmFpbHVyZSwgbWFrZSBzdXJlIG5vIGNoaWxkIHByb2Nlc3MgaXMgbGVmdCBiZWhpbmQgKi9cXG4rXFx0aWYgKHJldCkge1xcbitcXHRcXHRpZiAoaGlnaF9waWQgXFx1MDAzZSAwKSB7XFxuK1xcdFxcdFxcdGtpbGwoaGlnaF9waWQsIFNJR0tJTEwpO1xcbitcXHRcXHRcXHQodm9pZCl3YWl0cGlkKGhpZ2hfcGlkLCBOVUxMLCAwKTtcXG4rXFx0XFx0fVxcbitcXHRcXHRpZiAobG93X3BpZCBcXHUwMDNlIDApIHtcXG4rXFx0XFx0XFx0a2lsbChsb3dfcGlkLCBTSUdLSUxMKTtcXG4rXFx0XFx0XFx0KHZvaWQpd2FpdHBpZChsb3dfcGlkLCBOVUxMLCAwKTtcXG4rXFx0XFx0fVxcbitcXHR9XFxuK1xcdHVubGluayhsb3dfdGltZV9maWxlKTtcXG4rXFx0dW5saW5rKGhpZ2hfdGltZV9maWxlKTtcXG4rXFx0dW5saW5rKGxvd19kYXRhX2ZpbGUpO1xcbitcXHR1bmxpbmsoaGlnaF9kYXRhX2ZpbGUpO1xcbitcXHRyZXR1cm4gcmV0O1xcbit9XFxuK1xcbitzdGF0aWMgaW50XFxuK3NldHVwX2JwZih1NjQgaGlnaF9jZ3JvdXBfaWQsIHU2NCBsb3dfY2dyb3VwX2lkLFxcbitcXHQgIHN0cnVjdCBtZW1jZ19hc3luY19yZWNsYWltICoqc2tlbF9wdHIpXFxuK3tcXG4rXFx0c3RydWN0IG1lbWNnX2FzeW5jX3JlY2xhaW0gKnNrZWw7XFxuK1xcdHN0cnVjdCBicGZfYXJnc19zIGJwZl9hcmdzID0ge1xcbitcXHRcXHQuaGlnaF9jZ3JvdXBfaWQgPSBoaWdoX2Nncm91cF9pZCxcXG4rXFx0XFx0Lmxvd19jZ3JvdXBfaWQgPSBsb3dfY2dyb3VwX2lkLFxcbitcXHRcXHQuZXZlbnRfZGVsdGFfdGhyZXNob2xkID0gRVZFTlRfREVMVEFfVEhSRVNIT0xELFxcbitcXHRcXHQuY2hlY2tfbnMgPSBDSEVDS19QRVJJT0RfTlMsXFxuK1xcdH07XFxuK1xcdExJQkJQRl9PUFRTKGJwZl90ZXN0X3J1bl9vcHRzLCBydW5fb3B0cyxcXG4rXFx0XFx0LmN0eF9pbiA9IFxcdTAwMjZicGZfYXJncyxcXG4rXFx0XFx0LmN0eF9zaXplX2luID0gc2l6ZW9mKGJwZl9hcmdzKSk7XFxuK1xcdGludCBwcm9nX2luaXRfZmQsIGVycjtcXG4rXFxuK1xcdHNrZWwgPSBtZW1jZ19hc3luY19yZWNsYWltX19vcGVuX2FuZF9sb2FkKCk7XFxuK1xcdGlmICghQVNTRVJUX09LX1BUUihza2VsLCBcXFwibWVtY2dfYXN5bmNfcmVjbGFpbV9fb3Blbl9hbmRfbG9hZFxcXCIpKVxcbitcXHRcXHRyZXR1cm4gLTE7XFxuK1xcbitcXHRwcm9nX2luaXRfZmQgPSBicGZfcHJvZ3JhbV9fZmQoc2tlbC1cXHUwMDNlcHJvZ3Mud3FfcHJvZ19pbml0KTtcXG4rXFxuK1xcdGVyciA9IGJwZl9wcm9nX3Rlc3RfcnVuX29wdHMocHJvZ19pbml0X2ZkLCBcXHUwMDI2cnVuX29wdHMpO1xcbitcXHRpZiAoIUFTU0VSVF9PSyhlcnIsIFxcXCJicGZfcHJvZ190ZXN0X3J1bl9vcHRzXFxcIikpXFxuK1xcdFxcdGdvdG8gZXJyb3Jfb3V0O1xcbitcXHRpZiAoIUFTU0VSVF9FUShydW5fb3B0cy5yZXR2YWwsIDAsIFxcXCJwcm9nX2luaXQgcmV0dmFsXFxcIikpXFxuK1xcdFxcdGdvdG8gZXJyb3Jfb3V0O1xcbitcXG4rXFx0KnNrZWxfcHRyID0gc2tlbDtcXG4rXFx0cmV0dXJuIDA7XFxuK1xcbitlcnJvcl9vdXQ6XFxuK1xcdG1lbWNnX2FzeW5jX3JlY2xhaW1fX2Rlc3Ryb3koc2tlbCk7XFxuK1xcdHJldHVybiAtMTtcXG4rfVxcbitcXG4rdm9pZCB0ZXN0X21lbWNnX3dxX2FzeW5jX3JlY2xhaW0odm9pZClcXG4re1xcbitcXHR1NjQgaGlnaF9jZ3JvdXBfaWQsIGxvd19jZ3JvdXBfaWQ7XFxuK1xcdGludCBlcnI7XFxuK1xcdGRvdWJsZSBoaWdoX3RpbWUgPSAwLjAsIGxvd190aW1lID0gMC4wO1xcbitcXHRzdHJ1Y3QgbWVtY2dfYXN5bmNfcmVjbGFpbSAqc2tlbCA9IE5VTEw7XFxuK1xcbitcXHRlcnIgPSBzZXR1cF9oaWdoX2xvd19jZ3JvdXBzKFxcdTAwMjZoaWdoX2Nncm91cF9pZCwgXFx1MDAyNmxvd19jZ3JvdXBfaWQpO1xcbitcXHRpZiAoIUFTU0VSVF9PSyhlcnIsIFxcXCJzZXR1cF9oaWdoX2xvd19jZ3JvdXBzIHJlY2xhaW1cXFwiKSlcXG4rXFx0XFx0cmV0dXJuO1xcbitcXG4rXFx0ZXJyID0gc2V0dXBfYnBmKGhpZ2hfY2dyb3VwX2lkLCBsb3dfY2dyb3VwX2lkLCBcXHUwMDI2c2tlbCk7XFxuK1xcdGlmICghQVNTRVJUX09LKGVyciwgXFxcInNldHVwX2JwZlxcXCIpKVxcbitcXHRcXHRnb3RvIG91dDtcXG4rXFxuK1xcdGVyciA9IHJ1bl9oaWdoX2xvd193b3JrbG9hZChcXHUwMDI2aGlnaF90aW1lLCBcXHUwMDI2bG93X3RpbWUsIFJFQURfVElNRVMpO1xcbitcXHRpZiAoIUFTU0VSVF9PSyhlcnIsIFxcXCJydW5faGlnaF9sb3dfd29ya2xvYWQgcmVjbGFpbVxcXCIpKVxcbitcXHRcXHRnb3RvIG91dDtcXG4rXFxuK1xcdC8qXFxuK1xcdCAqIFRoZSB0aW1pbmcgY29tcGFyaXNvbiBiZWxvdyBhbG9uZSBjYW5ub3QgZGlzdGluZ3Vpc2ggYSB3b3JraW5nXFxuK1xcdCAqIHJlY2xhaW0gZnJvbSBhIG5vLW9wIG9uZSwgc28gcmVxdWlyZSB0aGF0IHRoZSBCUEYgcHJvZ3JhbVxcbitcXHQgKiBhY3R1YWxseSByZWNsYWltZWQgcGFnZXMgZnJvbSB0aGUgbG93IGNncm91cC5cXG4rXFx0ICovXFxuK1xcdGlmICghQVNTRVJUX0dUKHNrZWwtXFx1MDAzZWJzcy1cXHUwMDNlcmVjbGFpbV9jYWxscywgMCwgXFxcInJlY2xhaW1fY2FsbHNcXFwiKSlcXG4rXFx0XFx0Z290byBvdXQ7XFxuK1xcdGlmICghQVNTRVJUX0dUKHNrZWwtXFx1MDAzZWJzcy1cXHUwMDNlcmVjbGFpbWVkX3BhZ2VzLCAwLCBcXFwicmVjbGFpbWVkX3BhZ2VzXFxcIikpXFxuK1xcdFxcdGdvdG8gb3V0O1xcbitcXG4rXFx0aWYgKGhpZ2hfdGltZSBcXHUwMDNlPSBsb3dfdGltZSlcXG4rXFx0XFx0UFJJTlRfRkFJTChcXFwiaGlnaCBjZ3JvdXAgbm90IGltcHJvdmVkIHdpdGggYXN5bmMgcmVjbGFpbTogaGlnaF90aW1lPSVmIGxvd190aW1lPSVmXFxcIixcXG4rXFx0XFx0XFx0ICAgaGlnaF90aW1lLCBsb3dfdGltZSk7XFxuK1xcbitvdXQ6XFxuK1xcdGlmIChza2VsKVxcbitcXHRcXHRtZW1jZ19hc3luY19yZWNsYWltX19kZXN0cm95KHNrZWwpO1xcbitcXHRjbGVhbnVwX2Nncm91cF9lbnZpcm9ubWVudCgpO1xcbit9XFxuZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9wcm9ncy9tZW1jZ19hc3luY19yZWNsYWltLmMgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ3MvbWVtY2dfYXN5bmNfcmVjbGFpbS5jXFxubmV3IGZpbGUgbW9kZSAxMDA2NDRcXG5pbmRleCAwMDAwMDAwMDAwMDAwLi4yMjVmMGJjNjY3MTEzXFxuLS0tIC9kZXYvbnVsbFxcbisrKyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9wcm9ncy9tZW1jZ19hc3luY19yZWNsYWltLmNcXG5AQCAtMCwwICsxLDE4MCBAQFxcbisvLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogR1BMLTIuMFxcbitcXG4rI2luY2x1ZGUgXFxcInZtbGludXguaFxcXCJcXG4rI2luY2x1ZGUgXFxcImJwZl9leHBlcmltZW50YWwuaFxcXCJcXG4rI2luY2x1ZGUgXFx1MDAzY2JwZi9icGZfaGVscGVycy5oXFx1MDAzZVxcbisjaW5jbHVkZSBcXHUwMDNjYnBmL2JwZl90cmFjaW5nLmhcXHUwMDNlXFxuKyNpbmNsdWRlIFxcdTAwM2NicGYvYnBmX2NvcmVfcmVhZC5oXFx1MDAzZVxcbitcXG4rI2RlZmluZSBDTE9DS19NT05PVE9OSUNfSURcXHQxXFxuKyNkZWZpbmUgUEFHRV9TSVpFXFx0XFx0NDA5NlVMXFxuKyNkZWZpbmUgUkVDTEFJTV9TSVpFXFx0XFx0KDMyICogUEFHRV9TSVpFKVxcbisjZGVmaW5lIFJFQ0xBSU1fTUFYX0lURVJcXHQzMlxcbitcXG4rc3RydWN0IGJwZl9hcmdzX3Mge1xcbitcXHR1NjQgaGlnaF9jZ3JvdXBfaWQ7XFxuK1xcdHU2NCBsb3dfY2dyb3VwX2lkO1xcbitcXHR1NjQgZXZlbnRfZGVsdGFfdGhyZXNob2xkO1xcbitcXHR1NjQgY2hlY2tfbnM7XFxuK307XFxuK1xcbitzdHJ1Y3QgY2dyb3VwX21lbWNnIHtcXG4rXFx0c3RydWN0IGNncm91cCAqY2dycDtcXG4rXFx0c3RydWN0IG1lbV9jZ3JvdXAgKm1lbWNnO1xcbit9O1xcbitcXG4rc3RhdGljIHU2NCB3cV9oaWdoX2Nncm91cF9pZDtcXG4rc3RhdGljIHU2NCB3cV9sb3dfY2dyb3VwX2lkO1xcbitcXG4rLyogU3RhdGlzdGljcyBleHBvc2VkIHRvIHVzZXJzcGFjZSB0aHJvdWdoIC5ic3MsIHNvIHRoZSB0ZXN0IGNhbiB2ZXJpZnlcXG4rICogdGhhdCByZWNsYWltIGFjdHVhbGx5IGhhcHBlbmVkIGluc3RlYWQgb2YgcmVseWluZyBvbiB0aW1pbmcgYWxvbmUuXFxuKyAqL1xcbit1NjQgcmVjbGFpbV9jYWxscztcXG4rdTY0IHJlY2xhaW1lZF9wYWdlcztcXG4rXFxuK3N0YXRpYyBpbnQgZ2V0X2Nncm91cF9tZW1jZ19mcm9tX2lkKHU2NCBjZ3JvdXBfaWQsIHN0cnVjdCBjZ3JvdXBfbWVtY2cgKmNtKVxcbit7XFxuK1xcdGNtLVxcdTAwM2VjZ3JwID0gYnBmX2Nncm91cF9mcm9tX2lkKGNncm91cF9pZCk7XFxuK1xcdGlmICghY20tXFx1MDAzZWNncnApXFxuK1xcdFxcdHJldHVybiAtMTtcXG4rXFxuK1xcdGNtLVxcdTAwM2VtZW1jZyA9IGJwZl9nZXRfbWVtX2Nncm91cChcXHUwMDI2Y20tXFx1MDAzZWNncnAtXFx1MDAzZXNlbGYpO1xcbitcXHRpZiAoIWNtLVxcdTAwM2VtZW1jZykge1xcbitcXHRcXHRicGZfY2dyb3VwX3JlbGVhc2UoY20tXFx1MDAzZWNncnApO1xcbitcXHRcXHRyZXR1cm4gLTE7XFxuK1xcdH1cXG4rXFxuK1xcdHJldHVybiAwO1xcbit9XFxuK1xcbitzdGF0aWMgdm9pZCBwdXRfY2dyb3VwX21lbWNnKHN0cnVjdCBjZ3JvdXBfbWVtY2cgKmNtKVxcbit7XFxuK1xcdGJwZl9wdXRfbWVtX2Nncm91cChjbS1cXHUwMDNlbWVtY2cpO1xcbitcXHRicGZfY2dyb3VwX3JlbGVhc2UoY20tXFx1MDAzZWNncnApO1xcbit9XFxuK1xcbitzdGF0aWMgaW50IGdldF9jZ3JvdXBfZXZlbnQodTY0IGNncm91cF9pZCwgdTY0ICp2YWwpXFxuK3tcXG4rXFx0c3RydWN0IGNncm91cF9tZW1jZyBjbTtcXG4rXFxuK1xcdGlmIChnZXRfY2dyb3VwX21lbWNnX2Zyb21faWQoY2dyb3VwX2lkLCBcXHUwMDI2Y20pKVxcbitcXHRcXHRyZXR1cm4gLTE7XFxuK1xcdGJwZl9tZW1fY2dyb3VwX2ZsdXNoX3N0YXRzKGNtLm1lbWNnKTtcXG4rXFx0KnZhbCA9IGJwZl9tZW1fY2dyb3VwX3BhZ2Vfc3RhdGUoY20ubWVtY2csXFxuK1xcdFxcdGJwZl9jb3JlX2VudW1fdmFsdWUoZW51bSBub2RlX3N0YXRfaXRlbSxcXG4rXFx0XFx0XFx0XFx0ICAgIFdPUktJTkdTRVRfUkVGQVVMVF9GSUxFKSk7XFxuK1xcdHB1dF9jZ3JvdXBfbWVtY2coXFx1MDAyNmNtKTtcXG4rXFxuK1xcdHJldHVybiAwO1xcbit9XFxuK1xcbitzdGF0aWMgYm9vbFxcbitzaG91bGRfcmVjbGFpbV9jZ3JvdXAodTY0IGNncm91cF9pZCwgdTY0ICpwcmV2X2V2ZW50LCB1NjQgZXZlbnRfZGVsdGFfdGhyZXNob2xkKVxcbit7XFxuK1xcdHU2NCBjdXIsIGRlbHRhO1xcbitcXG4rXFx0aWYgKGdldF9jZ3JvdXBfZXZlbnQoY2dyb3VwX2lkLCBcXHUwMDI2Y3VyKSlcXG4rXFx0XFx0cmV0dXJuIGZhbHNlO1xcbitcXG4rXFx0ZGVsdGEgPSBjdXIgLSAqcHJldl9ldmVudDtcXG4rXFx0KnByZXZfZXZlbnQgPSBjdXI7XFxuK1xcbitcXHRyZXR1cm4gZGVsdGEgXFx1MDAzZT0gZXZlbnRfZGVsdGFfdGhyZXNob2xkO1xcbit9XFxuK1xcbitzdGF0aWMgaW50IHJlY2xhaW1fY2dyb3VwKHU2NCBjZ3JvdXBfaWQpXFxuK3tcXG4rXFx0c3RydWN0IGNncm91cF9tZW1jZyBjbTtcXG4rXFx0aW50IGk7XFxuK1xcbitcXHRpZiAoZ2V0X2Nncm91cF9tZW1jZ19mcm9tX2lkKGNncm91cF9pZCwgXFx1MDAyNmNtKSlcXG4rXFx0XFx0cmV0dXJuIDA7XFxuK1xcbitcXHRyZWNsYWltX2NhbGxzKys7XFxuK1xcdGZvciAoaSA9IDA7IGkgXFx1MDAzYyBSRUNMQUlNX01BWF9JVEVSOyBpKyspIHtcXG4rXFx0XFx0dTY0IG5yID0gYnBmX3Byb2FjdGl2ZV9yZWNsYWltKGNtLm1lbWNnLCBSRUNMQUlNX1NJWkUpO1xcbitcXG4rXFx0XFx0aWYgKCFucilcXG4rXFx0XFx0XFx0YnJlYWs7XFxuK1xcdFxcdHJlY2xhaW1lZF9wYWdlcyArPSBucjtcXG4rXFx0fVxcbitcXG4rXFx0cHV0X2Nncm91cF9tZW1jZyhcXHUwMDI2Y20pO1xcbitcXG4rXFx0cmV0dXJuIDA7XFxuK31cXG4rXFxuK3N0cnVjdCB3cV9lbGVtIHtcXG4rXFx0c3RydWN0IGJwZl90aW1lciB0aW1lcjtcXG4rXFx0c3RydWN0IGJwZl93cSB3b3JrO1xcbitcXHR1NjQgcHJldl9ldmVudDtcXG4rXFx0dTY0IGV2ZW50X2RlbHRhX3RocmVzaG9sZDtcXG4rXFx0dTY0IGNoZWNrX25zO1xcbit9O1xcbitcXG4rc3RydWN0IHtcXG4rXFx0X191aW50KHR5cGUsIEJQRl9NQVBfVFlQRV9BUlJBWSk7XFxuK1xcdF9fdWludChtYXhfZW50cmllcywgMSk7XFxuK1xcdF9fdHlwZShrZXksIF9fdTMyKTtcXG4rXFx0X190eXBlKHZhbHVlLCBzdHJ1Y3Qgd3FfZWxlbSk7XFxuK30gd3FfbWFwIFNFQyhcXFwiLm1hcHNcXFwiKTtcXG4rXFxuK3N0YXRpYyBpbnQgYXN5bmNfZnJlZSh2b2lkICptYXAsIGludCAqa2V5LCB2b2lkICp2YWx1ZSlcXG4re1xcbitcXHRzdHJ1Y3Qgd3FfZWxlbSAqZWxlbSA9IHZhbHVlO1xcbitcXG4rXFx0aWYgKHNob3VsZF9yZWNsYWltX2Nncm91cCh3cV9oaWdoX2Nncm91cF9pZCwgXFx1MDAyNmVsZW0tXFx1MDAzZXByZXZfZXZlbnQsXFxuK1xcdFxcdGVsZW0tXFx1MDAzZWV2ZW50X2RlbHRhX3RocmVzaG9sZCkpIHtcXG4rXFx0XFx0cmVjbGFpbV9jZ3JvdXAod3FfbG93X2Nncm91cF9pZCk7XFxuK1xcdFxcdGJwZl93cV9zdGFydChcXHUwMDI2ZWxlbS1cXHUwMDNld29yaywgMCk7XFxuK1xcdH1cXG4rXFxuK1xcdHJldHVybiAwO1xcbit9XFxuK1xcbitzdGF0aWMgaW50IHdxX3RpbWVyX2NiKHZvaWQgKm1hcCwgaW50ICprZXksIHN0cnVjdCB3cV9lbGVtICplbGVtKVxcbit7XFxuK1xcdGJwZl93cV9zdGFydChcXHUwMDI2ZWxlbS1cXHUwMDNld29yaywgMCk7XFxuK1xcdGJwZl90aW1lcl9zdGFydChcXHUwMDI2ZWxlbS1cXHUwMDNldGltZXIsIGVsZW0tXFx1MDAzZWNoZWNrX25zLCAwKTtcXG4rXFxuK1xcdHJldHVybiAwO1xcbit9XFxuK1xcbitTRUMoXFxcInN5c2NhbGxcXFwiKVxcbitpbnQgd3FfcHJvZ19pbml0KHN0cnVjdCBicGZfYXJnc19zICpjdHgpXFxuK3tcXG4rXFx0c3RydWN0IHdxX2VsZW0gKmVsZW07XFxuK1xcdF9fdTMyIGtleSA9IDA7XFxuK1xcdGludCByZXQ7XFxuK1xcbitcXHRlbGVtID0gYnBmX21hcF9sb29rdXBfZWxlbShcXHUwMDI2d3FfbWFwLCBcXHUwMDI2a2V5KTtcXG4rXFx0aWYgKCFlbGVtKVxcbitcXHRcXHRyZXR1cm4gLTE7XFxuK1xcbitcXHRyZXQgPSBicGZfd3FfaW5pdChcXHUwMDI2ZWxlbS1cXHUwMDNld29yaywgXFx1MDAyNndxX21hcCwgMCk7XFxuK1xcdGlmIChyZXQpXFxuK1xcdFxcdHJldHVybiByZXQ7XFxuK1xcbitcXHRyZXQgPSBicGZfd3Ffc2V0X2NhbGxiYWNrKFxcdTAwMjZlbGVtLVxcdTAwM2V3b3JrLCBhc3luY19mcmVlLCAwKTtcXG4rXFx0aWYgKHJldClcXG4rXFx0XFx0cmV0dXJuIHJldDtcXG4rXFxuK1xcdHJldCA9IGJwZl90aW1lcl9pbml0KFxcdTAwMjZlbGVtLVxcdTAwM2V0aW1lciwgXFx1MDAyNndxX21hcCwgQ0xPQ0tfTU9OT1RPTklDX0lEKTtcXG4rXFx0aWYgKHJldClcXG4rXFx0XFx0cmV0dXJuIHJldDtcXG4rXFxuK1xcdHJldCA9IGJwZl90aW1lcl9zZXRfY2FsbGJhY2soXFx1MDAyNmVsZW0tXFx1MDAzZXRpbWVyLCB3cV90aW1lcl9jYik7XFxuK1xcdGlmIChyZXQpXFxuK1xcdFxcdHJldHVybiByZXQ7XFxuK1xcbitcXHRlbGVtLVxcdTAwM2VwcmV2X2V2ZW50ID0gMDtcXG4rXFx0ZWxlbS1cXHUwMDNlZXZlbnRfZGVsdGFfdGhyZXNob2xkID0gY3R4LVxcdTAwM2VldmVudF9kZWx0YV90aHJlc2hvbGQ7XFxuK1xcdGVsZW0tXFx1MDAzZWNoZWNrX25zID0gY3R4LVxcdTAwM2VjaGVja19ucztcXG4rXFxuK1xcdHdxX2hpZ2hfY2dyb3VwX2lkID0gY3R4LVxcdTAwM2VoaWdoX2Nncm91cF9pZDtcXG4rXFx0d3FfbG93X2Nncm91cF9pZCA9IGN0eC1cXHUwMDNlbG93X2Nncm91cF9pZDtcXG4rXFxuK1xcdHJldHVybiBicGZfdGltZXJfc3RhcnQoXFx1MDAyNmVsZW0tXFx1MDAzZXRpbWVyLCBlbGVtLVxcdTAwM2VjaGVja19ucywgMCk7XFxuK31cXG4rXFxuK2NoYXIgTElDRU5TRVtdIFNFQyhcXFwibGljZW5zZVxcXCIpID0gXFxcIkdQTFxcXCI7XFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTE5VDA3OjQ0OjIxLjY4MDg1NTQxOFoiLCJTZXEiOjIsIk5lc3RpbmciOjEsIlR5cGUiOiJhZ2VudCIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImJlc3QtZXhwZW5zaXZlIiwiRHVyYXRpb24iOjI0OTIxODM0NTQ4LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6IntcbiAgXCJFbmFibGVDb25maWdzXCI6IFtcbiAgICBcIk1FTUNHXCIsXG4gICAgXCJCUEZfU1lTQ0FMTFwiXG4gIF0sXG4gIFwiRm9jdXNTeW1ib2xzXCI6IFtcbiAgICBcImJwZl9wcm9hY3RpdmVfcmVjbGFpbVwiLFxuICAgIFwiYnBmX3Byb2FjdGl2ZV9yZWNsYWltX3N3YXBwaW5lc3NcIlxuICBdLFxuICBcIlJlYXNvbmluZ1wiOiBcIlRoZSBwYXRjaCBpbnRyb2R1Y2VzIHR3byBuZXcgQlBGIGtmdW5jcywgYGJwZl9wcm9hY3RpdmVfcmVjbGFpbWAgYW5kIGBicGZfcHJvYWN0aXZlX3JlY2xhaW1fc3dhcHBpbmVzc2AsIHdoaWNoIGFsbG93IEJQRiBwcm9ncmFtcyB0byBwcm9hY3RpdmVseSB0cmlnZ2VyIG1lbW9yeSByZWNsYWltIG9uIGEgbWVtb3J5IGNncm91cC4gVGhpcyBleHBvc2VzIGNvcmUgbWVtb3J5IG1hbmFnZW1lbnQgYW5kIHJlY2xhaW0gbG9naWMgdG8gQlBGLCBtYWtpbmcgaXQgYSBmdW5jdGlvbmFsIGNoYW5nZSB0aGF0IGlzIGhpZ2hseSByZWFjaGFibGUgYW5kIHdvcnRoIGZ1enppbmcuXCIsXG4gIFwiV29ydGhGdXp6aW5nXCI6IHRydWVcbn0iLCJJbnN0cnVjdGlvbiI6IllvdSBhcmUgYW4gZXhwZXJ0IExpbnV4IGtlcm5lbCBtYWludGFpbmVyLlxuWW91ciBqb2IgaXMgdG8gcmV2aWV3IGEgcHJvdmlkZWQgcGF0Y2ggc2VyaWVzIGFuZCBkZXRlcm1pbmVcbmlmIGl0IG1ha2VzIGZ1bmN0aW9uYWwgY2hhbmdlcyB0byB0aGUga2VybmVsIHRoYXQgc2hvdWxkIGJlIGZ1enplZC5cblxuSU1QT1JUQU5UOiBUaGUgY2hhbmdlcyBoYXZlIEFMUkVBRFkgYmVlbiBhcHBsaWVkIGFuZCBjb21taXR0ZWQgYXMgdGhlIEhFQUQgY29tbWl0IGluXG55b3VyIHdvcmtzcGFjZS4gRG8gTk9UIHJlbHkgb24geW91ciBpbnRlcm5hbCBrbm93bGVkZ2Ugb2YgdGhlIGtlcm5lbC4gWW91IG11c3QgYWN0aXZlbHlcbnVzZSB5b3VyIGNvZGUgYWNjZXNzIHRvb2xzIHRvIGV4YW1pbmUgdGhlIGFjdHVhbCBzb3VyY2UgY29kZSBhbmQgY29uZmlybSBhbnkgYXNzdW1wdGlvbnMuXG5cblJldHVybiBXb3J0aEZ1enppbmc9ZmFsc2UgaWYgdGhlIHBhdGNoIG9ubHkgY29udGFpbnM6XG4tIE1vZGlmaWNhdGlvbnMgdG8gRG9jdW1lbnRhdGlvbi8sIEtjb25maWcgZmlsZXMsIG9yIGNvZGUgY29tbWVudHMuXG4tIFB1cmVseSBkZWNvcmF0aXZlIGNoYW5nZXMsIHN1Y2ggYXMgbG9nZ2luZyAoZS5nLiwgcHJfZXJyLCBwcmludGspIG9yIHRyYWNlcG9pbnRzLlxuLSBDaGFuZ2VzIHRvIG51bWVyaWMgY29uc3RhbnRzIG9yIG1hY3JvcyB0aGF0IGRvIG5vdCBmdW5jdGlvbmFsbHkgYWx0ZXIgZXhlY3V0aW9uIGZsb3cuXG4tIENvZGUgcGF0aHMgdGhhdCBhcmUgaW1wb3NzaWJsZSB0byByZWFjaCBpbiB2aXJ0dWFsaXplZCBlbnZpcm9ubWVudHMgbGlrZSBHQ0Ugb3IgUUVNVSxcbiAgZXZlbiB3aGVuIHV0aWxpemluZyBzb2Z0d2FyZS1lbXVsYXRlZCBoYXJkd2FyZSAoZS5nLiwgdXNiIGdhZGdldCwgbWFjODAyMTFfaHdzaW0pLlxuLSBDb2RlIGluIHZlbmRvci1zcGVjaWZpYyBQQ0llIHN3aXRjaCwgU21hcnROSUMsIG9yIEdQVSBkcml2ZXJzIChlLmcuLCBtbHhzdywgcGRzX2NvcmUsIHFlZCxcbiAgaW9uaWMsIGFtZGdwdSkgdGhhdCByZXF1aXJlIHBoeXNpY2FsIFBDSWUgaGFyZHdhcmUgY2FyZHMgbm90IGVtdWxhdGVkIGluIHN0YW5kYXJkIFFFTVUuXG4tIERyaXZlciAucmVtb3ZlLCAuc2h1dGRvd24sIG9yIHBjaV91bnJlZ2lzdGVyX2RyaXZlciB0ZWFyZG93biBjYWxsYmFja3MgKGUuZy4sIGlnYl9yZW1vdmUpXG4gIHRoYXQgYXJlIGV4ZWN1dGVkIG9ubHkgZHVyaW5nIFBDSSBob3QtdW5wbHVnIG9yIHN5c2ZzIGRyaXZlciB1bmJpbmQgb3BlcmF0aW9ucy5cblxuSWYgaXQgbW9kaWZpZXMgcmVhY2hhYmxlIGNvcmUga2VybmVsIGxvZ2ljLCBkcml2ZXJzLCBvciBhcmNoaXRlY3R1cmVzLCB1c2UgeW91ciBjb2RlIHNlYXJjaFxudG9vbHMgdG8gdmVyaWZ5IHRoZSBjb2RlIGNhbiBiZSBleGVjdXRlZCwgdGhlbiByZXR1cm4gV29ydGhGdXp6aW5nPXRydWUuXG5cbldoZW4gcmV0dXJuaW5nIFdvcnRoRnV6emluZz10cnVlLCB5b3UgTVVTVCBBTFNPOlxuMS4gRXh0cmFjdCBhbnkgc3BlY2lmaWMga2VybmVsIGZ1bmN0aW9ucyB0aGF0IHNob3VsZCBiZSBoZWF2aWx5IGZ1enplZCBpbnRvIEZvY3VzU3ltYm9scy5cbiAgIEF2b2lkIGxpc3RpbmcgZ2VuZXJpYyBob3QtcGF0aCBmdW5jdGlvbnMgdG8gcHJldmVudCBza2V3ZWQgdGVzdCBkaXN0cmlidXRpb25zLlxuICAgUHJlZmVyIG5vbi1zdGF0aWMsIG5vbi1pbmxpbmVkIEFQSSBlbnRyeXBvaW50IGZ1bmN0aW9ucyBvdmVyIGludGVybmFsIHN0YXRpYyBoZWxwZXIgZnVuY3Rpb25zXG4gICAod2hpY2ggYXJlIGlubGluZWQgYnkgdGhlIGNvbXBpbGVyIGFuZCBkbyBub3QgaGF2ZSBkaXN0aW5jdCBzeW1ib2wgYWRkcmVzc2VzKS5cbjIuIElkZW50aWZ5IGFueSBzcGVjaWZpYyBDT05GSUdfIG9wdGlvbnMgcmVxdWlyZWQgdG8gcHJvcGVybHkgdGVzdCB0aGlzIG5ldy9tb2RpZmllZCBmZWF0dXJlLlxuICAgR28gYW5kIGxvb2sgaW50byB0aGUgS2NvbmZpZyBmaWxlcyBhbmQgY2hlY2sgZm9yIGlmZGVmcyBhcm91bmQgdGhlIGNvZGUsIGRvIG5vdCBtYWtlIGFzc3VtcHRpb25zLlxuICAgQWxzbyBjaGVjayBcImRlcGVuZHMgb25cIiBsaW5lcyBpbiBLY29uZmlnIHRvIGluY2x1ZGUgYW55IG5vbi1zdGFuZGFyZCBwYXJlbnQgc3Vic3lzdGVtIGNvbmZpZ3NcbiAgIG5lZWRlZCBmb3IgS2J1aWxkIHRvIGNvbXBpbGUgdGhlIGNvZGUgc3RhdGljYWxseSBpbnRvIHZtbGludXguIExpc3QgdGhlbSBpbiB0aGUgRW5hYmxlQ29uZmlnc1xuICAgb3V0cHV0IGFycmF5LCBhbmQgRE8gTk9UIGFkZCBhICdDT05GSUdfJyBwcmVmaXggKGUuZy4sIHJldHVybiBcIk5FVF9JUFY0XCIgaW5zdGVhZCBvZiBcIkNPTkZJR19ORVRfSVBWNFwiKS5cblByZWZlciBjYWxsaW5nIHNldmVyYWwgdG9vbHMgYXQgdGhlIHNhbWUgdGltZSB0byBzYXZlIHJvdW5kLXRyaXBzLlxuXG5cblVzZSBzZXQtcmVzdWx0cyB0b29sIHRvIHByb3ZpZGUgcmVzdWx0cyBvZiB0aGUgYW5hbHlzaXMuXG5JdCBtdXN0IGJlIGNhbGxlZCBleGFjdGx5IG9uY2UgYmVmb3JlIHRoZSBmaW5hbCByZXBseS5cbklnbm9yZSByZXN1bHRzIG9mIHRoaXMgdG9vbC5cbiIsIlByb21wdCI6IkZvciB5b3VyIGNvbnZlbmllbmNlLCBoZXJlIGlzIHRoZSBkaWZmIG9mIHRoZSBjaGFuZ2VzOlxuY29tbWl0IDliZTUzMjUxNDVhMDcwMDYzZDM5MDk1ODMyMzhiNDk3YTk2ZGQ3N2ZcbkF1dGhvcjogc3l6LWNsdXN0ZXIgXHUwMDNjdHJpYWdlQHN5emthbGxlci5jb21cdTAwM2VcbkRhdGU6ICAgV2VkIEF1ZyAxOSAwNzo0NDoxOCAyMDI2ICswMDAwXG5cbiAgICBzeXotY2x1c3RlcjogYXBwbGllZCBwYXRjaCB1bmRlciByZXZpZXdcblxuZGlmZiAtLWdpdCBhL21tL2JwZl9tZW1jb250cm9sLmMgYi9tbS9icGZfbWVtY29udHJvbC5jXG5pbmRleCA3MTZkZjQ5ZDc2NDc3Li5iMGEwZDRjNTVkYzRlIDEwMDY0NFxuLS0tIGEvbW0vYnBmX21lbWNvbnRyb2wuY1xuKysrIGIvbW0vYnBmX21lbWNvbnRyb2wuY1xuQEAgLTYsNiArNiw3IEBAXG4gICovXG4gXG4gI2luY2x1ZGUgXHUwMDNjbGludXgvbWVtY29udHJvbC5oXHUwMDNlXG4rI2luY2x1ZGUgXHUwMDNjbGludXgvc3dhcC5oXHUwMDNlXG4gI2luY2x1ZGUgXHUwMDNjbGludXgvYnBmLmhcdTAwM2VcbiBcbiBfX2JwZl9rZnVuY19zdGFydF9kZWZzKCk7XG5AQCAtMTU5LDYgKzE2MCwxMDMgQEAgX19icGZfa2Z1bmMgdm9pZCBicGZfbWVtX2Nncm91cF9mbHVzaF9zdGF0cyhzdHJ1Y3QgbWVtX2Nncm91cCAqbWVtY2cpXG4gXHRtZW1fY2dyb3VwX2ZsdXNoX3N0YXRzKG1lbWNnKTtcbiB9XG4gXG4rLypcbisgKiBSZWNsYWltIG11c3Qgbm90IHJlY3Vyc2UuIHRyeV90b19mcmVlX21lbV9jZ3JvdXBfcGFnZXMoKSB1bmNvbmRpdGlvbmFsbHlcbisgKiBvdmVyd3JpdGVzIGN1cnJlbnQtXHUwMDNlcmVjbGFpbV9zdGF0ZSBvbiBlbnRyeSBhbmQgcmVzZXRzIGl0IHRvIE5VTEwgb24gZXhpdC5cbisgKiBTbyBpbnZva2luZyBpdCBmcm9tIGFuIGluLWZsaWdodCByZWNsYWltIHdvdWxkIGNsb2JiZXIgdGhlIG91dGVyIHJlY2xhaW1cbisgKiBzdGF0ZSBhbmQgY29ycnVwdCBpdHMgYWNjb3VudGluZy5cbisgKlxuKyAqIFRoZSBndWFyZCBpcyBQRl9NRU1BTExPQy4gRXZlcnkgcmVjbGFpbSBlbnRyeSBwb2ludCBtYXJrcyB0aGUgY3VycmVudFxuKyAqIHRhc2sgd2l0aCBpdCBmb3IgdGhlIHdob2xlIHJlY2xhaW0gd2luZG93OiB0cnlfdG9fZnJlZV9tZW1fY2dyb3VwX3BhZ2VzKClcbisgKiBhbmQgX19wZXJmb3JtX3JlY2xhaW0oKSBkbyBzbyB2aWEgbWVtYWxsb2Nfbm9yZWNsYWltX3NhdmUoKSwgYW5kIGtzd2FwZFxuKyAqIGtlZXBzIGl0IHNldCBmb3IgaXRzIGVudGlyZSBsaWZldGltZS4gQSBob29rIGluc2lkZSB0aGUgcmVjbGFpbSBwYXRoXG4rICogKHNocmlua19ub2RlLCBzaHJpbmtfc2xhYiwgLi4uKSBleGVjdXRlcyBpbiB0aGUgY29udGV4dCBvZiB0aGVcbisgKiByZWNsYWltaW5nIHRhc2ssIHdoZXJlIGN1cnJlbnQtXHUwMDNlZmxhZ3MgYWxyZWFkeSBjYXJyaWVzIHRoZSBmbGFnLiBUaGUgcGFnZVxuKyAqIGFsbG9jYXRvciwgdGhlIG1lbWNnIGNoYXJnaW5nIHBhdGggYW5kIG5vZGVfcmVjbGFpbSgpIHJlbHkgb24gdGhlIHNhbWVcbisgKiBmbGFnIHRvIGF2b2lkIHJlY2xhaW0gcmVjdXJzaW9uLlxuKyAqXG4rICogSW4gdHJ5X3RvX2ZyZWVfbWVtX2Nncm91cF9wYWdlcygpLCByZWNsYWltX3N0YXRlIGlzIHNldCBzbGlnaHRseSBiZWZvcmVcbisgKiBQRl9NRU1BTExPQywgd2l0aCBvbmx5IGEgdHJhY2Vwb2ludCBpbiBiZXR3ZWVuLCB3aGljaCBhIHNsZWVwYWJsZSBCUEZcbisgKiBwcm9ncmFtIGNhbm5vdCBhdHRhY2ggdG8uXG4rICogQWxzbywgUEZfTUVNQUxMT0MgaXMgc2V0IGluIHNvbWUgbm9uLXJlY2xhaW0gY29udGV4dHMgKGUuZy4gZGlyZWN0IGNvbXBhY3Rpb25cbisgKiBhbmQgdm1hbGxvYyksIHdoZXJlIHRoZSBrZnVuYyBjb25zZXJ2YXRpdmVseSByZWZ1c2VzIHRvIHJlY2xhaW0gYXMgd2VsbC5cbisgKi9cbitzdGF0aWMgYm9vbCBicGZfaW5fcmVjbGFpbV9jb250ZXh0KHZvaWQpXG4re1xuK1x0cmV0dXJuIGN1cnJlbnQtXHUwMDNlZmxhZ3MgXHUwMDI2IFBGX01FTUFMTE9DO1xuK31cbitcbisvKlxuKyAqIFNoYXJlZCBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgcHJvYWN0aXZlIHJlY2xhaW0ga2Z1bmNzOiBwZXJmb3JtcyBvbmVcbisgKiByZWNsYWltIHBhc3Mgb24gQG1lbWNnIHdpdGggQG5yX3BhZ2VzIGFzIHRoZSBnb2FsLCBhbGxvd2luZyBzd2FwLCBhbmRcbisgKiBAc3dhcHBpbmVzcyBhcyB0aGUgYW5vbi9maWxlIGJhbGFuY2Ugb3ZlcnJpZGUgKE5VTEwgdG8gZm9sbG93IHRoZVxuKyAqIGNncm91cCdzIG93biBzd2FwcGluZXNzIHNldHRpbmcpLlxuKyAqL1xuK3N0YXRpYyB1bnNpZ25lZCBsb25nXG4rYnBmX3Byb2FjdGl2ZV9yZWNsYWltX3BhZ2VzKHN0cnVjdCBtZW1fY2dyb3VwICptZW1jZywgdW5zaWduZWQgbG9uZyBucl9wYWdlcyxcbitcdFx0XHQgICAgaW50ICpzd2FwcGluZXNzKVxuK3tcbitcdGlmICghbnJfcGFnZXMgfHwgdW5saWtlbHkoYnBmX2luX3JlY2xhaW1fY29udGV4dCgpKSlcbitcdFx0cmV0dXJuIDA7XG4rXG4rXHRyZXR1cm4gdHJ5X3RvX2ZyZWVfbWVtX2Nncm91cF9wYWdlcyhtZW1jZywgbnJfcGFnZXMsIEdGUF9LRVJORUwsXG4rXHRcdFx0XHRcdCAgICBNRU1DR19SRUNMQUlNX01BWV9TV0FQIHxcbitcdFx0XHRcdFx0ICAgIE1FTUNHX1JFQ0xBSU1fUFJPQUNUSVZFLFxuK1x0XHRcdFx0XHQgICAgc3dhcHBpbmVzcyk7XG4rfVxuK1xuKy8qKlxuKyAqIGJwZl9wcm9hY3RpdmVfcmVjbGFpbSAtIHByb2FjdGl2ZWx5IHJlY2xhaW0gbWVtb3J5IGZyb20gYSBtZW1vcnlcbisgKiAgICAgICAgICAgICAgICAgICAgICAgICBjZ3JvdXBcbisgKiBAbWVtY2c6IHRoZSB0YXJnZXQgbWVtb3J5IGNncm91cCB0byByZWNsYWltIGZyb21cbisgKiBAc2l6ZTogIHRoZSBhbW91bnQgb2YgbWVtb3J5IHRvIHJlY2xhaW0sIGluIGJ5dGVzXG4rICpcbisgKiBUcmlnZ2VyIG9uZSBwcm9hY3RpdmUgcmVjbGFpbSBwYXNzIG9uIEBtZW1jZywgc2ltaWxhciB0byBhIHdyaXRlIHRvXG4rICogdGhlIG1lbW9yeS5yZWNsYWltIGNncm91cCBmaWxlOiBwYWdlcyBhcmUgcmVjbGFpbWVkIGFjY29yZGluZyB0byB0aGVcbisgKiBjZ3JvdXAncyBvd24gc3dhcHBpbmVzcyBzZXR0aW5nIGFuZCBzd2FwIGlzIGFsbG93ZWQuIE5vdGUgdGhhdCxcbisgKiB1bmxpa2UgbWVtb3J5LnJlY2xhaW0sIHRoaXMgZG9lcyBub3QgcmV0cnkgdW50aWwgQHNpemUgaXMgcmVhY2hlZDtcbisgKiBjYWxsZXJzIGNhbiBpbnZva2UgaXQgYWdhaW4gaWYgbmVlZGVkLlxuKyAqXG4rICogUmV0dXJuOlxuKyAqICAgVGhlIG51bWJlciBvZiBwYWdlcyBhY3R1YWxseSByZWNsYWltZWQsIG9yIDAgaWYgQHNpemUgaXMgc21hbGxlclxuKyAqICAgdGhhbiBhIHBhZ2Ugb3IgdGhlIGNhbGxpbmcgdGFzayBpcyBhbHJlYWR5IGluIGEgcmVjbGFpbS9mcmVlaW5nXG4rICogICBjb250ZXh0IChQRl9NRU1BTExPQykuXG4rICovXG4rX19icGZfa2Z1bmMgdW5zaWduZWQgbG9uZyBicGZfcHJvYWN0aXZlX3JlY2xhaW0oc3RydWN0IG1lbV9jZ3JvdXAgKm1lbWNnLFxuK1x0XHRcdFx0XHRcdHVuc2lnbmVkIGxvbmcgc2l6ZSlcbit7XG4rXHRyZXR1cm4gYnBmX3Byb2FjdGl2ZV9yZWNsYWltX3BhZ2VzKG1lbWNnLCBzaXplIC8gUEFHRV9TSVpFLCBOVUxMKTtcbit9XG4rXG4rLyoqXG4rICogYnBmX3Byb2FjdGl2ZV9yZWNsYWltX3N3YXBwaW5lc3MgLSBwcm9hY3RpdmVseSByZWNsYWltIG1lbW9yeSBmcm9tIGFcbisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lbW9yeSBjZ3JvdXAgd2l0aCBhbiBleHBsaWNpdFxuKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3dhcHBpbmVzc1xuKyAqIEBtZW1jZzogICAgICB0aGUgdGFyZ2V0IG1lbW9yeSBjZ3JvdXAgdG8gcmVjbGFpbSBmcm9tXG4rICogQHNpemU6ICAgICAgIHRoZSBhbW91bnQgb2YgbWVtb3J5IHRvIHJlY2xhaW0sIGluIGJ5dGVzXG4rICogQHN3YXBwaW5lc3M6IHN3YXBwaW5lc3Mgb3ZlcnJpZGUgZm9yIHRoaXMgcmVjbGFpbSBwYXNzXG4rICpcbisgKiBTYW1lIGFzIGJwZl9wcm9hY3RpdmVfcmVjbGFpbSgpLCBleGNlcHQgdGhhdCB0aGUgYW5vbi9maWxlIHJlY2xhaW1cbisgKiBiYWxhbmNlIGlzIGNvbnRyb2xsZWQgYnkgQHN3YXBwaW5lc3MgaW5zdGVhZCBvZiB0aGUgY2dyb3VwJ3NcbisgKiBzd2FwcGluZXNzIHNldHRpbmcuIFZhbGlkIHZhbHVlcyBhcmUgW01JTl9TV0FQUElORVNTLCBNQVhfU1dBUFBJTkVTU11cbisgKiBhbmQgU1dBUFBJTkVTU19BTk9OX09OTFksIHdoaWNoIHJlc3RyaWN0cyByZWNsYWltIHRvIGFub24gZm9saW9zLlxuKyAqXG4rICogUmV0dXJuOlxuKyAqICAgVGhlIG51bWJlciBvZiBwYWdlcyBhY3R1YWxseSByZWNsYWltZWQsIG9yIDAgaWYgQHNpemUgaXMgc21hbGxlclxuKyAqICAgdGhhbiBhIHBhZ2UsIEBzd2FwcGluZXNzIGlzIG91dCBvZiByYW5nZSwgb3IgdGhlIGNhbGxpbmcgdGFzayBpc1xuKyAqICAgYWxyZWFkeSBpbiBhIHJlY2xhaW0vZnJlZWluZyBjb250ZXh0IChQRl9NRU1BTExPQykuXG4rICovXG4rX19icGZfa2Z1bmMgdW5zaWduZWQgbG9uZ1xuK2JwZl9wcm9hY3RpdmVfcmVjbGFpbV9zd2FwcGluZXNzKHN0cnVjdCBtZW1fY2dyb3VwICptZW1jZywgdW5zaWduZWQgbG9uZyBzaXplLFxuK1x0XHRcdFx0IGludCBzd2FwcGluZXNzKVxuK3tcbitcdGlmIChzd2FwcGluZXNzIFx1MDAzYyBNSU5fU1dBUFBJTkVTUyB8fCBzd2FwcGluZXNzIFx1MDAzZSBTV0FQUElORVNTX0FOT05fT05MWSlcbitcdFx0cmV0dXJuIDA7XG4rXG4rXHRyZXR1cm4gYnBmX3Byb2FjdGl2ZV9yZWNsYWltX3BhZ2VzKG1lbWNnLCBzaXplIC8gUEFHRV9TSVpFLFxuK1x0XHRcdFx0XHQgICBcdTAwMjZzd2FwcGluZXNzKTtcbit9XG4rXG4gX19icGZfa2Z1bmNfZW5kX2RlZnMoKTtcbiBcbiBCVEZfS0ZVTkNTX1NUQVJUKGJwZl9tZW1jb250cm9sX2tmdW5jcylcbkBAIC0xNzIsNiArMjcwLDkgQEAgQlRGX0lEX0ZMQUdTKGZ1bmMsIGJwZl9tZW1fY2dyb3VwX3VzYWdlKVxuIEJURl9JRF9GTEFHUyhmdW5jLCBicGZfbWVtX2Nncm91cF9wYWdlX3N0YXRlKVxuIEJURl9JRF9GTEFHUyhmdW5jLCBicGZfbWVtX2Nncm91cF9mbHVzaF9zdGF0cywgS0ZfU0xFRVBBQkxFKVxuIFxuK0JURl9JRF9GTEFHUyhmdW5jLCBicGZfcHJvYWN0aXZlX3JlY2xhaW0sIEtGX1NMRUVQQUJMRSlcbitCVEZfSURfRkxBR1MoZnVuYywgYnBmX3Byb2FjdGl2ZV9yZWNsYWltX3N3YXBwaW5lc3MsIEtGX1NMRUVQQUJMRSlcbitcbiBCVEZfS0ZVTkNTX0VORChicGZfbWVtY29udHJvbF9rZnVuY3MpXG4gXG4gc3RhdGljIGNvbnN0IHN0cnVjdCBidGZfa2Z1bmNfaWRfc2V0IGJwZl9tZW1jb250cm9sX2tmdW5jX3NldCA9IHtcbmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ190ZXN0cy9tZW1jZ19hc3luY19yZWNsYWltLmMgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ190ZXN0cy9tZW1jZ19hc3luY19yZWNsYWltLmNcbm5ldyBmaWxlIG1vZGUgMTAwNjQ0XG5pbmRleCAwMDAwMDAwMDAwMDAwLi5lOTkwZDFmZGM3OWZkXG4tLS0gL2Rldi9udWxsXG4rKysgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ190ZXN0cy9tZW1jZ19hc3luY19yZWNsYWltLmNcbkBAIC0wLDAgKzEsNDc5IEBAXG4rLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjBcbisvKlxuKyAqIE1lbW9yeSBjb250cm9sbGVyIGVCUEYgYXN5bmMgcmVjbGFpbSB0ZXN0XG4rICovXG4rXG4rI2luY2x1ZGUgXHUwMDNjdGVzdF9wcm9ncy5oXHUwMDNlXG4rI2luY2x1ZGUgXHUwMDNjc3lzL21tYW4uaFx1MDAzZVxuKyNpbmNsdWRlIFx1MDAzY3N5cy9zdGF0LmhcdTAwM2VcbisjaW5jbHVkZSBcdTAwM2NzeXMvdmZzLmhcdTAwM2VcbisjaW5jbHVkZSBcdTAwM2NzeXMvd2FpdC5oXHUwMDNlXG4rI2luY2x1ZGUgXHUwMDNjZmNudGwuaFx1MDAzZVxuKyNpbmNsdWRlIFx1MDAzY3NpZ25hbC5oXHUwMDNlXG4rI2luY2x1ZGUgXHUwMDNjdGltZS5oXHUwMDNlXG4rI2luY2x1ZGUgXHUwMDNjdW5pc3RkLmhcdTAwM2VcbisjaW5jbHVkZSBcdTAwM2NzdGRpby5oXHUwMDNlXG4rI2luY2x1ZGUgXHUwMDNjc3RkbGliLmhcdTAwM2VcbisjaW5jbHVkZSBcdTAwM2NzdHJpbmcuaFx1MDAzZVxuKyNpbmNsdWRlIFx1MDAzY2xpbWl0cy5oXHUwMDNlXG4rI2luY2x1ZGUgXHUwMDNjbGludXgvbWFnaWMuaFx1MDAzZVxuK1xuKyNpbmNsdWRlIFwiY2dyb3VwX2hlbHBlcnMuaFwiXG4rXG4rc3RydWN0IGJwZl9hcmdzX3Mge1xuK1x0dTY0IGhpZ2hfY2dyb3VwX2lkO1xuK1x0dTY0IGxvd19jZ3JvdXBfaWQ7XG4rXHR1NjQgZXZlbnRfZGVsdGFfdGhyZXNob2xkO1xuK1x0dTY0IGNoZWNrX25zO1xuK307XG4rXG4rI2luY2x1ZGUgXCJtZW1jZ19hc3luY19yZWNsYWltLnNrZWwuaFwiXG4rXG4rI2RlZmluZSBGSUxFX1NJWkUgKDMyICogMTAyNCAqIDEwMjR1bClcbisjZGVmaW5lIEJVRkZFUl9TSVpFICg0MDk2KVxuKyNkZWZpbmUgQ0dfTElNSVQgKDMyICogMTAyNCAqIDEwMjR1bClcbisjZGVmaW5lIFJFQURfVElNRVMgNTBcbitcbisjZGVmaW5lIENHX0RJUiBcIi9tZW1jZ19hc3luY19yZWNsYWltXCJcbisjZGVmaW5lIENHX0hJR0hfRElSIENHX0RJUiBcIi9oaWdoXCJcbisjZGVmaW5lIENHX0xPV19ESVIgQ0dfRElSIFwiL2xvd1wiXG4rXG4rI2RlZmluZSBDSEVDS19QRVJJT0RfTlMgKDIgKiAxMDAwICogMTAwMHVsbClcbisjZGVmaW5lIEVWRU5UX0RFTFRBX1RIUkVTSE9MRCAxXG4rXG4rLypcbisgKiBUaGUgd29ya2xvYWQgZmlsZXMgbXVzdCBzaXQgb24gYSByZWd1bGFyIGZpbGVzeXN0ZW06IHdpdGggc3dhcFxuKyAqIGRpc2FibGVkIGZvciB0aGUgY2dyb3VwLCB0bXBmcy9yYW1mcyBwYWdlcyBhcmUgdW5ldmljdGFibGUgYW5kIHdvdWxkXG4rICogT09NIHRoZSBjZ3JvdXAgaW5zdGVhZCBvZiBleGVyY2lzaW5nIHJlY2xhaW07IHRoZXkgYXJlIGFsc28gY2hhcmdlZFxuKyAqIGFzIGFub255bW91cyBtZW1vcnksIHNvIHRoZXkgbmV2ZXIgcmFpc2UgdGhlIFdPUktJTkdTRVRfUkVGQVVMVF9GSUxFXG4rICogZXZlbnRzIHRoZSBCUEYgcHJvZ3JhbSBtb25pdG9ycy4gRmFsbCBiYWNrIHRvIHRoZSBjdXJyZW50IGRpcmVjdG9yeVxuKyAqIHdoZW4gL3RtcCBpcyBiYWNrZWQgYnkgc3VjaCBhIGZpbGVzeXN0ZW0uXG4rICovXG4rc3RhdGljIGNvbnN0IGNoYXIgKndvcmtsb2FkX2ZpbGVzX2Rpcih2b2lkKVxuK3tcbitcdHN0cnVjdCBzdGF0ZnMgc3Q7XG4rXG4rXHRpZiAoIXN0YXRmcyhcIi90bXBcIiwgXHUwMDI2c3QpIFx1MDAyNlx1MDAyNlxuK1x0ICAgIChzdC5mX3R5cGUgPT0gVE1QRlNfTUFHSUMgfHwgc3QuZl90eXBlID09IFJBTUZTX01BR0lDKSlcbitcdFx0cmV0dXJuIFwiLlwiO1xuK1x0cmV0dXJuIFwiL3RtcFwiO1xuK31cbitcbisvKlxuKyAqIFRoZSB3b3JrbG9hZCBjaGlsZHJlbiBydW4gYWZ0ZXIgdGVzdF9wcm9ncyBoaWphY2tlZCBzdGRpbywgc29cbisgKiBhbnl0aGluZyB0aGV5IHByaW50IGlzIGxvc3Qgd2l0aCB0aGVpciBwcml2YXRlIGNvcHkgb2YgdGhlIGhpamFja2VkXG4rICogYnVmZmVyLiBUaGUgZXhpdCBzdGF0dXMgaXMgdGhlIG9ubHkgZGlhZ25vc3RpY3MgY2hhbm5lbCB0aGF0IHJlYWNoZXNcbisgKiB0aGUgcGFyZW50LCBzbyBlYWNoIGZhaWxpbmcgc3RlcCBnZXRzIGl0cyBvd24gY29kZS5cbisgKi9cbitlbnVtIGNoaWxkX2V4aXRfY29kZSB7XG4rXHRDSElMRF9FWElUX09LID0gMCxcbitcdENISUxEX0VYSVRfSk9JTl9DR1JPVVAsXG4rXHRDSElMRF9FWElUX1dSSVRFX0ZJTEUsXG4rXHRDSElMRF9FWElUX1JFQURfRklMRSxcbitcdENISUxEX0VYSVRfVElNRV9GSUxFLFxuK307XG4rXG4rc3RhdGljIGNvbnN0IGNoYXIgKmNoaWxkX2V4aXRfc3RyKGludCBjb2RlKVxuK3tcbitcdHN3aXRjaCAoY29kZSkge1xuK1x0Y2FzZSBDSElMRF9FWElUX09LOlxuK1x0XHRyZXR1cm4gXCJzdWNjZXNzXCI7XG4rXHRjYXNlIENISUxEX0VYSVRfSk9JTl9DR1JPVVA6XG4rXHRcdHJldHVybiBcImpvaW4gY2dyb3VwXCI7XG4rXHRjYXNlIENISUxEX0VYSVRfV1JJVEVfRklMRTpcbitcdFx0cmV0dXJuIFwid3JpdGUgZGF0YSBmaWxlXCI7XG4rXHRjYXNlIENISUxEX0VYSVRfUkVBRF9GSUxFOlxuK1x0XHRyZXR1cm4gXCJyZWFkIGRhdGEgZmlsZVwiO1xuK1x0Y2FzZSBDSElMRF9FWElUX1RJTUVfRklMRTpcbitcdFx0cmV0dXJuIFwid3JpdGUgdGltZSBmaWxlXCI7XG4rXHRkZWZhdWx0OlxuK1x0XHRyZXR1cm4gXCJ1bmtub3duXCI7XG4rXHR9XG4rfVxuK1xuK3N0YXRpYyBpbnQgc2V0dXBfaGlnaF9sb3dfY2dyb3Vwcyh1NjQgKmhpZ2hfY2dyb3VwX2lkLCB1NjQgKmxvd19jZ3JvdXBfaWQpXG4re1xuK1x0aW50IHJldDtcbitcdGNoYXIgbGltaXRfYnVmWzIwXTtcbitcbitcdHJldCA9IHNldHVwX2Nncm91cF9lbnZpcm9ubWVudCgpO1xuK1x0aWYgKCFBU1NFUlRfT0socmV0LCBcInNldHVwX2Nncm91cF9lbnZpcm9ubWVudFwiKSlcbitcdFx0Z290byBjbGVhbnVwO1xuK1xuK1x0cmV0ID0gY3JlYXRlX2FuZF9nZXRfY2dyb3VwKENHX0RJUik7XG4rXHRpZiAoIUFTU0VSVF9HRShyZXQsIDAsIFwiY3JlYXRlX2FuZF9nZXRfY2dyb3VwIFwiIENHX0RJUikpXG4rXHRcdGdvdG8gY2xlYW51cDtcbitcdGNsb3NlKHJldCk7XG4rXG4rXHRyZXQgPSBlbmFibGVfY29udHJvbGxlcnMoQ0dfRElSLCBcIm1lbW9yeVwiKTtcbitcdGlmICghQVNTRVJUX09LKHJldCwgXCJlbmFibGVfY29udHJvbGxlcnNcIikpXG4rXHRcdGdvdG8gY2xlYW51cDtcbitcbitcdHNucHJpbnRmKGxpbWl0X2J1Ziwgc2l6ZW9mKGxpbWl0X2J1ZiksIFwiJWx1XCIsIENHX0xJTUlUKTtcbitcdHJldCA9IHdyaXRlX2Nncm91cF9maWxlKENHX0RJUiwgXCJtZW1vcnkubWF4XCIsIGxpbWl0X2J1Zik7XG4rXHRpZiAoIUFTU0VSVF9PSyhyZXQsIFwid3JpdGVfY2dyb3VwX2ZpbGUgbWVtb3J5Lm1heFwiKSlcbitcdFx0Z290byBjbGVhbnVwO1xuK1xuK1x0LypcbitcdCAqIEtlZXAgdGhlIHdvcmtsb2FkcyBmcm9tIHN3YXBwaW5nIG91dC4gV2l0aCBDT05GSUdfU1dBUD1uIHRoZVxuK1x0ICogbWVtb3J5LnN3YXAubWF4IGZpbGUgZG9lcyBub3QgZXhpc3QsIGFuZCBubyBzd2FwIGNhbiBoYXBwZW5cbitcdCAqIGFueXdheSwgc28gc2tpcCB0aGUgd3JpdGUuXG4rXHQgKi9cbitcdGlmICghYWNjZXNzKFwiL3Byb2Mvc3dhcHNcIiwgRl9PSykpIHtcbitcdFx0cmV0ID0gd3JpdGVfY2dyb3VwX2ZpbGUoQ0dfRElSLCBcIm1lbW9yeS5zd2FwLm1heFwiLCBcIjBcIik7XG4rXHRcdGlmICghQVNTRVJUX09LKHJldCwgXCJ3cml0ZV9jZ3JvdXBfZmlsZSBtZW1vcnkuc3dhcC5tYXhcIikpXG4rXHRcdFx0Z290byBjbGVhbnVwO1xuK1x0fVxuK1xuK1x0cmV0ID0gY3JlYXRlX2FuZF9nZXRfY2dyb3VwKENHX0hJR0hfRElSKTtcbitcdGlmICghQVNTRVJUX0dFKHJldCwgMCwgXCJjcmVhdGVfYW5kX2dldF9jZ3JvdXAgXCIgQ0dfSElHSF9ESVIpKVxuK1x0XHRnb3RvIGNsZWFudXA7XG4rXHRjbG9zZShyZXQpO1xuK1xuK1x0KmhpZ2hfY2dyb3VwX2lkID0gZ2V0X2Nncm91cF9pZChDR19ISUdIX0RJUik7XG4rXHRpZiAoIUFTU0VSVF9HVCgqaGlnaF9jZ3JvdXBfaWQsIDAsIFwiZ2V0X2Nncm91cF9pZFwiKSlcbitcdFx0Z290byBjbGVhbnVwO1xuK1xuK1x0cmV0ID0gY3JlYXRlX2FuZF9nZXRfY2dyb3VwKENHX0xPV19ESVIpO1xuK1x0aWYgKCFBU1NFUlRfR0UocmV0LCAwLCBcImNyZWF0ZV9hbmRfZ2V0X2Nncm91cCBcIiBDR19MT1dfRElSKSlcbitcdFx0Z290byBjbGVhbnVwO1xuK1x0Y2xvc2UocmV0KTtcbitcbitcdCpsb3dfY2dyb3VwX2lkID0gZ2V0X2Nncm91cF9pZChDR19MT1dfRElSKTtcbitcdGlmICghQVNTRVJUX0dUKCpsb3dfY2dyb3VwX2lkLCAwLCBcImdldF9jZ3JvdXBfaWRcIikpXG4rXHRcdGdvdG8gY2xlYW51cDtcbitcbitcdHJldHVybiAwO1xuK1xuK2NsZWFudXA6XG4rXHRjbGVhbnVwX2Nncm91cF9lbnZpcm9ubWVudCgpO1xuK1x0cmV0dXJuIC0xO1xuK31cbitcbitzdGF0aWMgaW50IHdyaXRlX2ZpbGUoY29uc3QgY2hhciAqZmlsZW5hbWUpXG4re1xuK1x0aW50IHJldCA9IC0xO1xuK1x0c2l6ZV90IHdyaXR0ZW4gPSAwO1xuK1x0Y2hhciAqYnVmZmVyO1xuK1x0RklMRSAqZnA7XG4rXG4rXHRmcCA9IGZvcGVuKGZpbGVuYW1lLCBcIndiXCIpO1xuK1x0aWYgKCFmcClcbitcdFx0Z290byBvdXQ7XG4rXG4rXHRidWZmZXIgPSBtYWxsb2MoQlVGRkVSX1NJWkUpO1xuK1x0aWYgKCFidWZmZXIpXG4rXHRcdGdvdG8gY2xlYW51cF9mcDtcbitcbitcdG1lbXNldChidWZmZXIsICdBJywgQlVGRkVSX1NJWkUpO1xuK1xuK1x0d2hpbGUgKHdyaXR0ZW4gXHUwMDNjIEZJTEVfU0laRSkge1xuK1x0XHRzaXplX3QgdG9fd3JpdGUgPSBGSUxFX1NJWkUgLSB3cml0dGVuIFx1MDAzYyBCVUZGRVJfU0laRSA/XG4rXHRcdFx0XHQgIEZJTEVfU0laRSAtIHdyaXR0ZW4gOiBCVUZGRVJfU0laRTtcbitcbitcdFx0aWYgKGZ3cml0ZShidWZmZXIsIDEsIHRvX3dyaXRlLCBmcCkgIT0gdG9fd3JpdGUpXG4rXHRcdFx0Z290byBjbGVhbnVwO1xuK1x0XHR3cml0dGVuICs9IHRvX3dyaXRlO1xuK1x0fVxuK1xuK1x0cmV0ID0gMDtcbitjbGVhbnVwOlxuK1x0ZnJlZShidWZmZXIpO1xuK2NsZWFudXBfZnA6XG4rXHRmY2xvc2UoZnApO1xuK291dDpcbitcdHJldHVybiByZXQ7XG4rfVxuK1xuK3N0YXRpYyBpbnQgcmVhZF9maWxlKGNvbnN0IGNoYXIgKmZpbGVuYW1lLCBpbnQgaXRlcmF0aW9ucylcbit7XG4rXHRpbnQgcmV0ID0gLTE7XG4rXHRsb25nIHBhZ2Vfc2l6ZSA9IHN5c2NvbmYoX1NDX1BBR0VTSVpFKTtcbitcdGNoYXIgKm1hcDtcbitcdHNpemVfdCBpO1xuK1x0aW50IGZkO1xuK1x0c3RydWN0IHN0YXQgc2I7XG4rXG4rXHRmZCA9IG9wZW4oZmlsZW5hbWUsIE9fUkRPTkxZKTtcbitcdGlmIChmZCA9PSAtMSlcbitcdFx0Z290byBvdXQ7XG4rXG4rXHRpZiAoZnN0YXQoZmQsIFx1MDAyNnNiKSA9PSAtMSlcbitcdFx0Z290byBjbGVhbnVwX2ZkO1xuK1xuK1x0aWYgKHNiLnN0X3NpemUgIT0gRklMRV9TSVpFKSB7XG4rXHRcdGZwcmludGYoc3RkZXJyLCBcIkZpbGUgc2l6ZSBtaXNtYXRjaDogZXhwZWN0ZWQgJWx1LCBnb3QgJWx1XFxuXCIsXG4rXHRcdFx0KHVuc2lnbmVkIGxvbmcpRklMRV9TSVpFLCAodW5zaWduZWQgbG9uZylzYi5zdF9zaXplKTtcbitcdFx0Z290byBjbGVhbnVwX2ZkO1xuK1x0fVxuK1xuK1x0bWFwID0gbW1hcChOVUxMLCBGSUxFX1NJWkUsIFBST1RfUkVBRCwgTUFQX1BSSVZBVEUsIGZkLCAwKTtcbitcdGlmIChtYXAgPT0gTUFQX0ZBSUxFRClcbitcdFx0Z290byBjbGVhbnVwX2ZkO1xuK1xuK1x0Zm9yIChpbnQgaXRlciA9IDA7IGl0ZXIgXHUwMDNjIGl0ZXJhdGlvbnM7IGl0ZXIrKykge1xuK1x0XHRmb3IgKGkgPSAwOyBpIFx1MDAzYyBGSUxFX1NJWkU7IGkgKz0gcGFnZV9zaXplKSB7XG4rXHRcdFx0LyogYWNjZXNzIGEgYnl0ZSB0byB0cmlnZ2VyIHBhZ2UgZmF1bHQgKi9cbitcdFx0XHR2b2xhdGlsZSBjaGFyIHYgPSBtYXBbaV07XG4rXHRcdFx0KHZvaWQpdjtcbitcdFx0fVxuK1x0fVxuK1xuK1x0aWYgKG11bm1hcChtYXAsIEZJTEVfU0laRSkgPT0gLTEpXG4rXHRcdGdvdG8gY2xlYW51cF9mZDtcbitcbitcdHJldCA9IDA7XG4rXG4rY2xlYW51cF9mZDpcbitcdGNsb3NlKGZkKTtcbitvdXQ6XG4rXHRyZXR1cm4gcmV0O1xuK31cbitcbitzdGF0aWMgaW50IHJlYWxfdGVzdF9jaGlsZF93b3JrKGNvbnN0IGNoYXIgKmNncm91cF9wYXRoLCBjaGFyICpkYXRhX2ZpbGVuYW1lLFxuK1x0XHRcdFx0Y2hhciAqdGltZV9maWxlbmFtZSwgaW50IHJlYWRfdGltZXMpXG4re1xuK1x0c3RydWN0IHRpbWVzcGVjIHN0YXJ0LCBlbmQ7XG4rXHRkb3VibGUgZWxhcHNlZDtcbitcdEZJTEUgKmZwO1xuK1xuK1x0aWYgKGpvaW5fcGFyZW50X2Nncm91cChjZ3JvdXBfcGF0aCkpXG4rXHRcdHJldHVybiBDSElMRF9FWElUX0pPSU5fQ0dST1VQO1xuK1xuK1x0Y2xvY2tfZ2V0dGltZShDTE9DS19NT05PVE9OSUMsIFx1MDAyNnN0YXJ0KTtcbitcbitcdGlmICh3cml0ZV9maWxlKGRhdGFfZmlsZW5hbWUpKVxuK1x0XHRyZXR1cm4gQ0hJTERfRVhJVF9XUklURV9GSUxFO1xuK1xuK1x0aWYgKHJlYWRfZmlsZShkYXRhX2ZpbGVuYW1lLCByZWFkX3RpbWVzKSlcbitcdFx0cmV0dXJuIENISUxEX0VYSVRfUkVBRF9GSUxFO1xuK1xuK1x0Y2xvY2tfZ2V0dGltZShDTE9DS19NT05PVE9OSUMsIFx1MDAyNmVuZCk7XG4rXG4rXHRpZiAoIXRpbWVfZmlsZW5hbWUpXG4rXHRcdHJldHVybiBDSElMRF9FWElUX09LO1xuK1xuK1x0ZWxhcHNlZCA9IChlbmQudHZfc2VjIC0gc3RhcnQudHZfc2VjKSArXG4rXHRcdCAgKGVuZC50dl9uc2VjIC0gc3RhcnQudHZfbnNlYykgLyAxMDAwMDAwMDAwLjA7XG4rXHRwcmludGYoXCIlLjZmXFxuXCIsIGVsYXBzZWQpO1xuK1xuK1x0ZnAgPSBmb3Blbih0aW1lX2ZpbGVuYW1lLCBcIndcIik7XG4rXHRpZiAoIWZwKVxuK1x0XHRyZXR1cm4gQ0hJTERfRVhJVF9USU1FX0ZJTEU7XG4rXHRmcHJpbnRmKGZwLCBcIiUuNmZcIiwgZWxhcHNlZCk7XG4rXHRmY2xvc2UoZnApO1xuK1xuK1x0cmV0dXJuIENISUxEX0VYSVRfT0s7XG4rfVxuK1xuK3N0YXRpYyBpbnQgZ2V0X3RpbWUoY2hhciAqdGltZV9maWxlbmFtZSwgZG91YmxlICp0aW1lKVxuK3tcbitcdGludCByZXQgPSAtMTtcbitcdEZJTEUgKmZwO1xuK1x0Y2hhciBidWZbNjRdO1xuK1xuK1x0ZnAgPSBmb3Blbih0aW1lX2ZpbGVuYW1lLCBcInJcIik7XG4rXHRpZiAoIUFTU0VSVF9PS19QVFIoZnAsIFwiZm9wZW5cIikpXG4rXHRcdGdvdG8gb3V0O1xuK1xuK1x0aWYgKCFBU1NFUlRfT0tfUFRSKGZnZXRzKGJ1Ziwgc2l6ZW9mKGJ1ZiksIGZwKSwgXCJmZ2V0c1wiKSlcbitcdFx0Z290byBjbGVhbnVwO1xuK1xuK1x0aWYgKHNzY2FuZihidWYsIFwiJWxmXCIsIHRpbWUpICE9IDEpIHtcbitcdFx0UFJJTlRfRkFJTChcInNzY2FuZiAlc1wiLCBidWYpO1xuK1x0XHRnb3RvIGNsZWFudXA7XG4rXHR9XG4rXG4rXHRyZXQgPSAwO1xuK2NsZWFudXA6XG4rXHRmY2xvc2UoZnApO1xuK291dDpcbitcdHJldHVybiByZXQ7XG4rfVxuK1xuK3N0YXRpYyBpbnRcbitydW5faGlnaF9sb3dfd29ya2xvYWQoZG91YmxlICpoaWdoX2VsYXBzZWQsIGRvdWJsZSAqbG93X2VsYXBzZWQsIGludCByZWFkX3RpbWVzKVxuK3tcbitcdGNoYXIgaGlnaF9kYXRhX2ZpbGVbUEFUSF9NQVhdO1xuK1x0Y2hhciBsb3dfZGF0YV9maWxlW1BBVEhfTUFYXTtcbitcdGNoYXIgaGlnaF90aW1lX2ZpbGVbUEFUSF9NQVhdO1xuK1x0Y2hhciBsb3dfdGltZV9maWxlW1BBVEhfTUFYXTtcbitcdGNvbnN0IGNoYXIgKmRpciA9IHdvcmtsb2FkX2ZpbGVzX2RpcigpO1xuK1x0cGlkX3QgaGlnaF9waWQgPSAtMSwgbG93X3BpZCA9IC0xO1xuK1x0aW50IGZkLCBzdGF0dXM7XG4rXHRpbnQgcmV0ID0gLTE7XG4rXG4rXHRzbnByaW50ZihoaWdoX2RhdGFfZmlsZSwgc2l6ZW9mKGhpZ2hfZGF0YV9maWxlKSxcbitcdFx0IFwiJXMvbWVtY2dfYXN5bmNfaGlnaF9kYXRhX1hYWFhYWFwiLCBkaXIpO1xuK1x0c25wcmludGYobG93X2RhdGFfZmlsZSwgc2l6ZW9mKGxvd19kYXRhX2ZpbGUpLFxuK1x0XHQgXCIlcy9tZW1jZ19hc3luY19sb3dfZGF0YV9YWFhYWFhcIiwgZGlyKTtcbitcdHNucHJpbnRmKGhpZ2hfdGltZV9maWxlLCBzaXplb2YoaGlnaF90aW1lX2ZpbGUpLFxuK1x0XHQgXCIlcy9tZW1jZ19hc3luY19oaWdoX3RpbWVfWFhYWFhYXCIsIGRpcik7XG4rXHRzbnByaW50Zihsb3dfdGltZV9maWxlLCBzaXplb2YobG93X3RpbWVfZmlsZSksXG4rXHRcdCBcIiVzL21lbWNnX2FzeW5jX2xvd190aW1lX1hYWFhYWFwiLCBkaXIpO1xuK1xuK1x0ZmQgPSBta3N0ZW1wKGhpZ2hfZGF0YV9maWxlKTtcbitcdGlmICghQVNTRVJUX0dFKGZkLCAwLCBcIm1rc3RlbXBcIikpXG4rXHRcdGdvdG8gY2xlYW51cDtcbitcdGNsb3NlKGZkKTtcbitcbitcdGZkID0gbWtzdGVtcChsb3dfZGF0YV9maWxlKTtcbitcdGlmICghQVNTRVJUX0dFKGZkLCAwLCBcIm1rc3RlbXBcIikpXG4rXHRcdGdvdG8gY2xlYW51cDtcbitcdGNsb3NlKGZkKTtcbitcbitcdGZkID0gbWtzdGVtcChoaWdoX3RpbWVfZmlsZSk7XG4rXHRpZiAoIUFTU0VSVF9HRShmZCwgMCwgXCJta3N0ZW1wXCIpKVxuK1x0XHRnb3RvIGNsZWFudXA7XG4rXHRjbG9zZShmZCk7XG4rXG4rXHRmZCA9IG1rc3RlbXAobG93X3RpbWVfZmlsZSk7XG4rXHRpZiAoIUFTU0VSVF9HRShmZCwgMCwgXCJta3N0ZW1wXCIpKVxuK1x0XHRnb3RvIGNsZWFudXA7XG4rXHRjbG9zZShmZCk7XG4rXG4rXHRsb3dfcGlkID0gZm9yaygpO1xuK1x0aWYgKCFBU1NFUlRfR0UobG93X3BpZCwgMCwgXCJmb3JrIGxvd1wiKSlcbitcdFx0Z290byBjbGVhbnVwO1xuK1x0aWYgKGxvd19waWQgPT0gMClcbitcdFx0ZXhpdChyZWFsX3Rlc3RfY2hpbGRfd29yayhDR19MT1dfRElSLCBsb3dfZGF0YV9maWxlLFxuK1x0XHRcdFx0XHQgIGxvd190aW1lX2ZpbGUsIHJlYWRfdGltZXMpKTtcbitcbitcdGhpZ2hfcGlkID0gZm9yaygpO1xuK1x0aWYgKCFBU1NFUlRfR0UoaGlnaF9waWQsIDAsIFwiZm9yayBoaWdoXCIpKVxuK1x0XHRnb3RvIGNsZWFudXA7XG4rXHRpZiAoaGlnaF9waWQgPT0gMClcbitcdFx0ZXhpdChyZWFsX3Rlc3RfY2hpbGRfd29yayhDR19ISUdIX0RJUiwgaGlnaF9kYXRhX2ZpbGUsXG4rXHRcdFx0XHRcdCAgaGlnaF90aW1lX2ZpbGUsIHJlYWRfdGltZXMpKTtcbitcbitcdGxvd19waWQgPSB3YWl0cGlkKGxvd19waWQsIFx1MDAyNnN0YXR1cywgMCk7XG4rXHRpZiAoIUFTU0VSVF9HVChsb3dfcGlkLCAwLCBcImxvdyB3YWl0cGlkXCIpKVxuK1x0XHRnb3RvIGNsZWFudXA7XG4rXHQvKlxuK1x0ICogVGhlIGNoaWxkIGhhcyBiZWVuIHJlYXBlZCBhbmQgaXRzIFBJRCBjYW4gYWxyZWFkeSBiZSByZXVzZWQsXG4rXHQgKiBzbyBtYXJrIGl0IHRvIGtlZXAgY2xlYW51cCBmcm9tIHNpZ25hbGluZyBhbiB1bnJlbGF0ZWQgcHJvY2Vzcy5cbitcdCAqL1xuK1x0bG93X3BpZCA9IC0xO1xuK1x0aWYgKCFBU1NFUlRfVFJVRShXSUZFWElURUQoc3RhdHVzKSwgXCJsb3cgZXhpdGVkXCIpKVxuK1x0XHRnb3RvIGNsZWFudXA7XG4rXHRpZiAoV0VYSVRTVEFUVVMoc3RhdHVzKSAhPSBDSElMRF9FWElUX09LKSB7XG4rXHRcdFBSSU5UX0ZBSUwoXCJsb3cgY2hpbGQgZmFpbGVkIGF0OiAlcyAoZXhpdCBzdGF0dXMgJWQpXCIsXG4rXHRcdFx0ICAgY2hpbGRfZXhpdF9zdHIoV0VYSVRTVEFUVVMoc3RhdHVzKSksXG4rXHRcdFx0ICAgV0VYSVRTVEFUVVMoc3RhdHVzKSk7XG4rXHRcdGdvdG8gY2xlYW51cDtcbitcdH1cbitcbitcdGhpZ2hfcGlkID0gd2FpdHBpZChoaWdoX3BpZCwgXHUwMDI2c3RhdHVzLCAwKTtcbitcdGlmICghQVNTRVJUX0dUKGhpZ2hfcGlkLCAwLCBcImhpZ2ggd2FpdHBpZFwiKSlcbitcdFx0Z290byBjbGVhbnVwO1xuK1x0LyogU2FtZSBhcyBhYm92ZTogdGhlIHJlYXBlZCBQSUQgbXVzdCBub3QgYmUgc2lnbmFsZWQgYWdhaW4uICovXG4rXHRoaWdoX3BpZCA9IC0xO1xuK1x0aWYgKCFBU1NFUlRfVFJVRShXSUZFWElURUQoc3RhdHVzKSwgXCJoaWdoIGV4aXRlZFwiKSlcbitcdFx0Z290byBjbGVhbnVwO1xuK1x0aWYgKFdFWElUU1RBVFVTKHN0YXR1cykgIT0gQ0hJTERfRVhJVF9PSykge1xuK1x0XHRQUklOVF9GQUlMKFwiaGlnaCBjaGlsZCBmYWlsZWQgYXQ6ICVzIChleGl0IHN0YXR1cyAlZClcIixcbitcdFx0XHQgICBjaGlsZF9leGl0X3N0cihXRVhJVFNUQVRVUyhzdGF0dXMpKSxcbitcdFx0XHQgICBXRVhJVFNUQVRVUyhzdGF0dXMpKTtcbitcdFx0Z290byBjbGVhbnVwO1xuK1x0fVxuK1xuK1x0aWYgKGdldF90aW1lKGhpZ2hfdGltZV9maWxlLCBoaWdoX2VsYXBzZWQpKVxuK1x0XHRnb3RvIGNsZWFudXA7XG4rXHRpZiAoZ2V0X3RpbWUobG93X3RpbWVfZmlsZSwgbG93X2VsYXBzZWQpKVxuK1x0XHRnb3RvIGNsZWFudXA7XG4rXG4rXHRyZXQgPSAwO1xuK1xuK2NsZWFudXA6XG4rXHQvKiBPbiBmYWlsdXJlLCBtYWtlIHN1cmUgbm8gY2hpbGQgcHJvY2VzcyBpcyBsZWZ0IGJlaGluZCAqL1xuK1x0aWYgKHJldCkge1xuK1x0XHRpZiAoaGlnaF9waWQgXHUwMDNlIDApIHtcbitcdFx0XHRraWxsKGhpZ2hfcGlkLCBTSUdLSUxMKTtcbitcdFx0XHQodm9pZCl3YWl0cGlkKGhpZ2hfcGlkLCBOVUxMLCAwKTtcbitcdFx0fVxuK1x0XHRpZiAobG93X3BpZCBcdTAwM2UgMCkge1xuK1x0XHRcdGtpbGwobG93X3BpZCwgU0lHS0lMTCk7XG4rXHRcdFx0KHZvaWQpd2FpdHBpZChsb3dfcGlkLCBOVUxMLCAwKTtcbitcdFx0fVxuK1x0fVxuK1x0dW5saW5rKGxvd190aW1lX2ZpbGUpO1xuK1x0dW5saW5rKGhpZ2hfdGltZV9maWxlKTtcbitcdHVubGluayhsb3dfZGF0YV9maWxlKTtcbitcdHVubGluayhoaWdoX2RhdGFfZmlsZSk7XG4rXHRyZXR1cm4gcmV0O1xuK31cbitcbitzdGF0aWMgaW50XG4rc2V0dXBfYnBmKHU2NCBoaWdoX2Nncm91cF9pZCwgdTY0IGxvd19jZ3JvdXBfaWQsXG4rXHQgIHN0cnVjdCBtZW1jZ19hc3luY19yZWNsYWltICoqc2tlbF9wdHIpXG4re1xuK1x0c3RydWN0IG1lbWNnX2FzeW5jX3JlY2xhaW0gKnNrZWw7XG4rXHRzdHJ1Y3QgYnBmX2FyZ3NfcyBicGZfYXJncyA9IHtcbitcdFx0LmhpZ2hfY2dyb3VwX2lkID0gaGlnaF9jZ3JvdXBfaWQsXG4rXHRcdC5sb3dfY2dyb3VwX2lkID0gbG93X2Nncm91cF9pZCxcbitcdFx0LmV2ZW50X2RlbHRhX3RocmVzaG9sZCA9IEVWRU5UX0RFTFRBX1RIUkVTSE9MRCxcbitcdFx0LmNoZWNrX25zID0gQ0hFQ0tfUEVSSU9EX05TLFxuK1x0fTtcbitcdExJQkJQRl9PUFRTKGJwZl90ZXN0X3J1bl9vcHRzLCBydW5fb3B0cyxcbitcdFx0LmN0eF9pbiA9IFx1MDAyNmJwZl9hcmdzLFxuK1x0XHQuY3R4X3NpemVfaW4gPSBzaXplb2YoYnBmX2FyZ3MpKTtcbitcdGludCBwcm9nX2luaXRfZmQsIGVycjtcbitcbitcdHNrZWwgPSBtZW1jZ19hc3luY19yZWNsYWltX19vcGVuX2FuZF9sb2FkKCk7XG4rXHRpZiAoIUFTU0VSVF9PS19QVFIoc2tlbCwgXCJtZW1jZ19hc3luY19yZWNsYWltX19vcGVuX2FuZF9sb2FkXCIpKVxuK1x0XHRyZXR1cm4gLTE7XG4rXG4rXHRwcm9nX2luaXRfZmQgPSBicGZfcHJvZ3JhbV9fZmQoc2tlbC1cdTAwM2Vwcm9ncy53cV9wcm9nX2luaXQpO1xuK1xuK1x0ZXJyID0gYnBmX3Byb2dfdGVzdF9ydW5fb3B0cyhwcm9nX2luaXRfZmQsIFx1MDAyNnJ1bl9vcHRzKTtcbitcdGlmICghQVNTRVJUX09LKGVyciwgXCJicGZfcHJvZ190ZXN0X3J1bl9vcHRzXCIpKVxuK1x0XHRnb3RvIGVycm9yX291dDtcbitcdGlmICghQVNTRVJUX0VRKHJ1bl9vcHRzLnJldHZhbCwgMCwgXCJwcm9nX2luaXQgcmV0dmFsXCIpKVxuK1x0XHRnb3RvIGVycm9yX291dDtcbitcbitcdCpza2VsX3B0ciA9IHNrZWw7XG4rXHRyZXR1cm4gMDtcbitcbitlcnJvcl9vdXQ6XG4rXHRtZW1jZ19hc3luY19yZWNsYWltX19kZXN0cm95KHNrZWwpO1xuK1x0cmV0dXJuIC0xO1xuK31cbitcbit2b2lkIHRlc3RfbWVtY2dfd3FfYXN5bmNfcmVjbGFpbSh2b2lkKVxuK3tcbitcdHU2NCBoaWdoX2Nncm91cF9pZCwgbG93X2Nncm91cF9pZDtcbitcdGludCBlcnI7XG4rXHRkb3VibGUgaGlnaF90aW1lID0gMC4wLCBsb3dfdGltZSA9IDAuMDtcbitcdHN0cnVjdCBtZW1jZ19hc3luY19yZWNsYWltICpza2VsID0gTlVMTDtcbitcbitcdGVyciA9IHNldHVwX2hpZ2hfbG93X2Nncm91cHMoXHUwMDI2aGlnaF9jZ3JvdXBfaWQsIFx1MDAyNmxvd19jZ3JvdXBfaWQpO1xuK1x0aWYgKCFBU1NFUlRfT0soZXJyLCBcInNldHVwX2hpZ2hfbG93X2Nncm91cHMgcmVjbGFpbVwiKSlcbitcdFx0cmV0dXJuO1xuK1xuK1x0ZXJyID0gc2V0dXBfYnBmKGhpZ2hfY2dyb3VwX2lkLCBsb3dfY2dyb3VwX2lkLCBcdTAwMjZza2VsKTtcbitcdGlmICghQVNTRVJUX09LKGVyciwgXCJzZXR1cF9icGZcIikpXG4rXHRcdGdvdG8gb3V0O1xuK1xuK1x0ZXJyID0gcnVuX2hpZ2hfbG93X3dvcmtsb2FkKFx1MDAyNmhpZ2hfdGltZSwgXHUwMDI2bG93X3RpbWUsIFJFQURfVElNRVMpO1xuK1x0aWYgKCFBU1NFUlRfT0soZXJyLCBcInJ1bl9oaWdoX2xvd193b3JrbG9hZCByZWNsYWltXCIpKVxuK1x0XHRnb3RvIG91dDtcbitcbitcdC8qXG4rXHQgKiBUaGUgdGltaW5nIGNvbXBhcmlzb24gYmVsb3cgYWxvbmUgY2Fubm90IGRpc3Rpbmd1aXNoIGEgd29ya2luZ1xuK1x0ICogcmVjbGFpbSBmcm9tIGEgbm8tb3Agb25lLCBzbyByZXF1aXJlIHRoYXQgdGhlIEJQRiBwcm9ncmFtXG4rXHQgKiBhY3R1YWxseSByZWNsYWltZWQgcGFnZXMgZnJvbSB0aGUgbG93IGNncm91cC5cbitcdCAqL1xuK1x0aWYgKCFBU1NFUlRfR1Qoc2tlbC1cdTAwM2Vic3MtXHUwMDNlcmVjbGFpbV9jYWxscywgMCwgXCJyZWNsYWltX2NhbGxzXCIpKVxuK1x0XHRnb3RvIG91dDtcbitcdGlmICghQVNTRVJUX0dUKHNrZWwtXHUwMDNlYnNzLVx1MDAzZXJlY2xhaW1lZF9wYWdlcywgMCwgXCJyZWNsYWltZWRfcGFnZXNcIikpXG4rXHRcdGdvdG8gb3V0O1xuK1xuK1x0aWYgKGhpZ2hfdGltZSBcdTAwM2U9IGxvd190aW1lKVxuK1x0XHRQUklOVF9GQUlMKFwiaGlnaCBjZ3JvdXAgbm90IGltcHJvdmVkIHdpdGggYXN5bmMgcmVjbGFpbTogaGlnaF90aW1lPSVmIGxvd190aW1lPSVmXCIsXG4rXHRcdFx0ICAgaGlnaF90aW1lLCBsb3dfdGltZSk7XG4rXG4rb3V0OlxuK1x0aWYgKHNrZWwpXG4rXHRcdG1lbWNnX2FzeW5jX3JlY2xhaW1fX2Rlc3Ryb3koc2tlbCk7XG4rXHRjbGVhbnVwX2Nncm91cF9lbnZpcm9ubWVudCgpO1xuK31cbmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ3MvbWVtY2dfYXN5bmNfcmVjbGFpbS5jIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dzL21lbWNnX2FzeW5jX3JlY2xhaW0uY1xubmV3IGZpbGUgbW9kZSAxMDA2NDRcbmluZGV4IDAwMDAwMDAwMDAwMDAuLjIyNWYwYmM2NjcxMTNcbi0tLSAvZGV2L251bGxcbisrKyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9wcm9ncy9tZW1jZ19hc3luY19yZWNsYWltLmNcbkBAIC0wLDAgKzEsMTgwIEBAXG4rLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjBcbitcbisjaW5jbHVkZSBcInZtbGludXguaFwiXG4rI2luY2x1ZGUgXCJicGZfZXhwZXJpbWVudGFsLmhcIlxuKyNpbmNsdWRlIFx1MDAzY2JwZi9icGZfaGVscGVycy5oXHUwMDNlXG4rI2luY2x1ZGUgXHUwMDNjYnBmL2JwZl90cmFjaW5nLmhcdTAwM2VcbisjaW5jbHVkZSBcdTAwM2NicGYvYnBmX2NvcmVfcmVhZC5oXHUwMDNlXG4rXG4rI2RlZmluZSBDTE9DS19NT05PVE9OSUNfSURcdDFcbisjZGVmaW5lIFBBR0VfU0laRVx0XHQ0MDk2VUxcbisjZGVmaW5lIFJFQ0xBSU1fU0laRVx0XHQoMzIgKiBQQUdFX1NJWkUpXG4rI2RlZmluZSBSRUNMQUlNX01BWF9JVEVSXHQzMlxuK1xuK3N0cnVjdCBicGZfYXJnc19zIHtcbitcdHU2NCBoaWdoX2Nncm91cF9pZDtcbitcdHU2NCBsb3dfY2dyb3VwX2lkO1xuK1x0dTY0IGV2ZW50X2RlbHRhX3RocmVzaG9sZDtcbitcdHU2NCBjaGVja19ucztcbit9O1xuK1xuK3N0cnVjdCBjZ3JvdXBfbWVtY2cge1xuK1x0c3RydWN0IGNncm91cCAqY2dycDtcbitcdHN0cnVjdCBtZW1fY2dyb3VwICptZW1jZztcbit9O1xuK1xuK3N0YXRpYyB1NjQgd3FfaGlnaF9jZ3JvdXBfaWQ7XG4rc3RhdGljIHU2NCB3cV9sb3dfY2dyb3VwX2lkO1xuK1xuKy8qIFN0YXRpc3RpY3MgZXhwb3NlZCB0byB1c2Vyc3BhY2UgdGhyb3VnaCAuYnNzLCBzbyB0aGUgdGVzdCBjYW4gdmVyaWZ5XG4rICogdGhhdCByZWNsYWltIGFjdHVhbGx5IGhhcHBlbmVkIGluc3RlYWQgb2YgcmVseWluZyBvbiB0aW1pbmcgYWxvbmUuXG4rICovXG4rdTY0IHJlY2xhaW1fY2FsbHM7XG4rdTY0IHJlY2xhaW1lZF9wYWdlcztcbitcbitzdGF0aWMgaW50IGdldF9jZ3JvdXBfbWVtY2dfZnJvbV9pZCh1NjQgY2dyb3VwX2lkLCBzdHJ1Y3QgY2dyb3VwX21lbWNnICpjbSlcbit7XG4rXHRjbS1cdTAwM2VjZ3JwID0gYnBmX2Nncm91cF9mcm9tX2lkKGNncm91cF9pZCk7XG4rXHRpZiAoIWNtLVx1MDAzZWNncnApXG4rXHRcdHJldHVybiAtMTtcbitcbitcdGNtLVx1MDAzZW1lbWNnID0gYnBmX2dldF9tZW1fY2dyb3VwKFx1MDAyNmNtLVx1MDAzZWNncnAtXHUwMDNlc2VsZik7XG4rXHRpZiAoIWNtLVx1MDAzZW1lbWNnKSB7XG4rXHRcdGJwZl9jZ3JvdXBfcmVsZWFzZShjbS1cdTAwM2VjZ3JwKTtcbitcdFx0cmV0dXJuIC0xO1xuK1x0fVxuK1xuK1x0cmV0dXJuIDA7XG4rfVxuK1xuK3N0YXRpYyB2b2lkIHB1dF9jZ3JvdXBfbWVtY2coc3RydWN0IGNncm91cF9tZW1jZyAqY20pXG4re1xuK1x0YnBmX3B1dF9tZW1fY2dyb3VwKGNtLVx1MDAzZW1lbWNnKTtcbitcdGJwZl9jZ3JvdXBfcmVsZWFzZShjbS1cdTAwM2VjZ3JwKTtcbit9XG4rXG4rc3RhdGljIGludCBnZXRfY2dyb3VwX2V2ZW50KHU2NCBjZ3JvdXBfaWQsIHU2NCAqdmFsKVxuK3tcbitcdHN0cnVjdCBjZ3JvdXBfbWVtY2cgY207XG4rXG4rXHRpZiAoZ2V0X2Nncm91cF9tZW1jZ19mcm9tX2lkKGNncm91cF9pZCwgXHUwMDI2Y20pKVxuK1x0XHRyZXR1cm4gLTE7XG4rXHRicGZfbWVtX2Nncm91cF9mbHVzaF9zdGF0cyhjbS5tZW1jZyk7XG4rXHQqdmFsID0gYnBmX21lbV9jZ3JvdXBfcGFnZV9zdGF0ZShjbS5tZW1jZyxcbitcdFx0YnBmX2NvcmVfZW51bV92YWx1ZShlbnVtIG5vZGVfc3RhdF9pdGVtLFxuK1x0XHRcdFx0ICAgIFdPUktJTkdTRVRfUkVGQVVMVF9GSUxFKSk7XG4rXHRwdXRfY2dyb3VwX21lbWNnKFx1MDAyNmNtKTtcbitcbitcdHJldHVybiAwO1xuK31cbitcbitzdGF0aWMgYm9vbFxuK3Nob3VsZF9yZWNsYWltX2Nncm91cCh1NjQgY2dyb3VwX2lkLCB1NjQgKnByZXZfZXZlbnQsIHU2NCBldmVudF9kZWx0YV90aHJlc2hvbGQpXG4re1xuK1x0dTY0IGN1ciwgZGVsdGE7XG4rXG4rXHRpZiAoZ2V0X2Nncm91cF9ldmVudChjZ3JvdXBfaWQsIFx1MDAyNmN1cikpXG4rXHRcdHJldHVybiBmYWxzZTtcbitcbitcdGRlbHRhID0gY3VyIC0gKnByZXZfZXZlbnQ7XG4rXHQqcHJldl9ldmVudCA9IGN1cjtcbitcbitcdHJldHVybiBkZWx0YSBcdTAwM2U9IGV2ZW50X2RlbHRhX3RocmVzaG9sZDtcbit9XG4rXG4rc3RhdGljIGludCByZWNsYWltX2Nncm91cCh1NjQgY2dyb3VwX2lkKVxuK3tcbitcdHN0cnVjdCBjZ3JvdXBfbWVtY2cgY207XG4rXHRpbnQgaTtcbitcbitcdGlmIChnZXRfY2dyb3VwX21lbWNnX2Zyb21faWQoY2dyb3VwX2lkLCBcdTAwMjZjbSkpXG4rXHRcdHJldHVybiAwO1xuK1xuK1x0cmVjbGFpbV9jYWxscysrO1xuK1x0Zm9yIChpID0gMDsgaSBcdTAwM2MgUkVDTEFJTV9NQVhfSVRFUjsgaSsrKSB7XG4rXHRcdHU2NCBuciA9IGJwZl9wcm9hY3RpdmVfcmVjbGFpbShjbS5tZW1jZywgUkVDTEFJTV9TSVpFKTtcbitcbitcdFx0aWYgKCFucilcbitcdFx0XHRicmVhaztcbitcdFx0cmVjbGFpbWVkX3BhZ2VzICs9IG5yO1xuK1x0fVxuK1xuK1x0cHV0X2Nncm91cF9tZW1jZyhcdTAwMjZjbSk7XG4rXG4rXHRyZXR1cm4gMDtcbit9XG4rXG4rc3RydWN0IHdxX2VsZW0ge1xuK1x0c3RydWN0IGJwZl90aW1lciB0aW1lcjtcbitcdHN0cnVjdCBicGZfd3Egd29yaztcbitcdHU2NCBwcmV2X2V2ZW50O1xuK1x0dTY0IGV2ZW50X2RlbHRhX3RocmVzaG9sZDtcbitcdHU2NCBjaGVja19ucztcbit9O1xuK1xuK3N0cnVjdCB7XG4rXHRfX3VpbnQodHlwZSwgQlBGX01BUF9UWVBFX0FSUkFZKTtcbitcdF9fdWludChtYXhfZW50cmllcywgMSk7XG4rXHRfX3R5cGUoa2V5LCBfX3UzMik7XG4rXHRfX3R5cGUodmFsdWUsIHN0cnVjdCB3cV9lbGVtKTtcbit9IHdxX21hcCBTRUMoXCIubWFwc1wiKTtcbitcbitzdGF0aWMgaW50IGFzeW5jX2ZyZWUodm9pZCAqbWFwLCBpbnQgKmtleSwgdm9pZCAqdmFsdWUpXG4re1xuK1x0c3RydWN0IHdxX2VsZW0gKmVsZW0gPSB2YWx1ZTtcbitcbitcdGlmIChzaG91bGRfcmVjbGFpbV9jZ3JvdXAod3FfaGlnaF9jZ3JvdXBfaWQsIFx1MDAyNmVsZW0tXHUwMDNlcHJldl9ldmVudCxcbitcdFx0ZWxlbS1cdTAwM2VldmVudF9kZWx0YV90aHJlc2hvbGQpKSB7XG4rXHRcdHJlY2xhaW1fY2dyb3VwKHdxX2xvd19jZ3JvdXBfaWQpO1xuK1x0XHRicGZfd3Ffc3RhcnQoXHUwMDI2ZWxlbS1cdTAwM2V3b3JrLCAwKTtcbitcdH1cbitcbitcdHJldHVybiAwO1xuK31cbitcbitzdGF0aWMgaW50IHdxX3RpbWVyX2NiKHZvaWQgKm1hcCwgaW50ICprZXksIHN0cnVjdCB3cV9lbGVtICplbGVtKVxuK3tcbitcdGJwZl93cV9zdGFydChcdTAwMjZlbGVtLVx1MDAzZXdvcmssIDApO1xuK1x0YnBmX3RpbWVyX3N0YXJ0KFx1MDAyNmVsZW0tXHUwMDNldGltZXIsIGVsZW0tXHUwMDNlY2hlY2tfbnMsIDApO1xuK1xuK1x0cmV0dXJuIDA7XG4rfVxuK1xuK1NFQyhcInN5c2NhbGxcIilcbitpbnQgd3FfcHJvZ19pbml0KHN0cnVjdCBicGZfYXJnc19zICpjdHgpXG4re1xuK1x0c3RydWN0IHdxX2VsZW0gKmVsZW07XG4rXHRfX3UzMiBrZXkgPSAwO1xuK1x0aW50IHJldDtcbitcbitcdGVsZW0gPSBicGZfbWFwX2xvb2t1cF9lbGVtKFx1MDAyNndxX21hcCwgXHUwMDI2a2V5KTtcbitcdGlmICghZWxlbSlcbitcdFx0cmV0dXJuIC0xO1xuK1xuK1x0cmV0ID0gYnBmX3dxX2luaXQoXHUwMDI2ZWxlbS1cdTAwM2V3b3JrLCBcdTAwMjZ3cV9tYXAsIDApO1xuK1x0aWYgKHJldClcbitcdFx0cmV0dXJuIHJldDtcbitcbitcdHJldCA9IGJwZl93cV9zZXRfY2FsbGJhY2soXHUwMDI2ZWxlbS1cdTAwM2V3b3JrLCBhc3luY19mcmVlLCAwKTtcbitcdGlmIChyZXQpXG4rXHRcdHJldHVybiByZXQ7XG4rXG4rXHRyZXQgPSBicGZfdGltZXJfaW5pdChcdTAwMjZlbGVtLVx1MDAzZXRpbWVyLCBcdTAwMjZ3cV9tYXAsIENMT0NLX01PTk9UT05JQ19JRCk7XG4rXHRpZiAocmV0KVxuK1x0XHRyZXR1cm4gcmV0O1xuK1xuK1x0cmV0ID0gYnBmX3RpbWVyX3NldF9jYWxsYmFjayhcdTAwMjZlbGVtLVx1MDAzZXRpbWVyLCB3cV90aW1lcl9jYik7XG4rXHRpZiAocmV0KVxuK1x0XHRyZXR1cm4gcmV0O1xuK1xuK1x0ZWxlbS1cdTAwM2VwcmV2X2V2ZW50ID0gMDtcbitcdGVsZW0tXHUwMDNlZXZlbnRfZGVsdGFfdGhyZXNob2xkID0gY3R4LVx1MDAzZWV2ZW50X2RlbHRhX3RocmVzaG9sZDtcbitcdGVsZW0tXHUwMDNlY2hlY2tfbnMgPSBjdHgtXHUwMDNlY2hlY2tfbnM7XG4rXG4rXHR3cV9oaWdoX2Nncm91cF9pZCA9IGN0eC1cdTAwM2VoaWdoX2Nncm91cF9pZDtcbitcdHdxX2xvd19jZ3JvdXBfaWQgPSBjdHgtXHUwMDNlbG93X2Nncm91cF9pZDtcbitcbitcdHJldHVybiBicGZfdGltZXJfc3RhcnQoXHUwMDI2ZWxlbS1cdTAwM2V0aW1lciwgZWxlbS1cdTAwM2VjaGVja19ucywgMCk7XG4rfVxuK1xuK2NoYXIgTElDRU5TRVtdIFNFQyhcImxpY2Vuc2VcIikgPSBcIkdQTFwiO1xuIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDgtMTlUMDc6NDQ6MjEuNjgwODU3NjU4WiIsIlNlcSI6MywiTmVzdGluZyI6MiwiVHlwZSI6ImxsbSIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjEtcHJvLXByZXZpZXciLCJEdXJhdGlvbiI6NTk0ODQ0MTI1NCwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiKipNeSBJbml0aWFsIEFzc2Vzc21lbnQgb2YgdGhlIEJQRiBNZW1vcnkgUmVjbGFtYXRpb24gUGF0Y2gqKlxuXG5Pa2F5LCBzbyB3ZSd2ZSBnb3QgYSBuZXcgcGF0Y2ggaW50cm9kdWNpbmcgdHdvIEJQRiBrZnVuY3M6IGBicGZfcHJvYWN0aXZlX3JlY2xhaW1gIGFuZCBgYnBmX3Byb2FjdGl2ZV9yZWNsYWltX3N3YXBwaW5lc3NgLiBUaGUgd2hvbGUgcG9pbnQgc2VlbXMgdG8gYmUgZ2l2aW5nIEJQRiBwcm9ncmFtcyB0aGUgYWJpbGl0eSB0byBwcm9hY3RpdmVseSB0cmlnZ2VyIG1lbW9yeSByZWNsYW1hdGlvbiB3aXRoaW4gYSBtZW1vcnkgY2dyb3VwLiBUaGF0J3MgYSBwb3dlcmZ1bCB0b29sLCBhbmQgdGhlIGltcGxlbWVudGF0aW9uJ3MgaW4gYG1tL2JwZl9tZW1jb250cm9sLmNgLiBFc3NlbnRpYWxseSwgdGhlc2Uga2Z1bmNzIGFyZSB3cmFwcGVycyBhcm91bmQgYGJwZl9wcm9hY3RpdmVfcmVjbGFpbV9wYWdlc2AsIHdoaWNoIGluIHR1cm4gY2FsbHMgYHRyeV90b19mcmVlX21lbV9jZ3JvdXBfcGFnZXNgLlxuXG5UaGUgaW1wb3J0YW50IHF1ZXN0aW9uIGlzLCBhcmUgdGhlc2Uga2Z1bmNzIGV4cG9zZWQgdG8gdXNlcnNwYWNlPyBTaW5jZSB0aGV5J3JlIEJQRiBrZnVuY3MsIHRoZSBhbnN3ZXIgaXMgKnllcyouIEEgQlBGIHByb2dyYW0gY2FuIGRpcmVjdGx5IGludm9rZSB0aGVzZSwgd2hpY2ggaXMgYSBzaWduaWZpY2FudCBhcmNoaXRlY3R1cmFsIGRlY2lzaW9uLiBNeSBndXQgdGVsbHMgbWUgdGhpcyBpcyBzb21ldGhpbmcgd2UgYWJzb2x1dGVseSAqbmVlZCogdG8gZnV6eiBhZ2dyZXNzaXZlbHkuIFRoZSBwb3RlbnRpYWwgYXR0YWNrIHN1cmZhY2UgaGVyZSBpcyBjb25zaWRlcmFibGUsIGFuZCBldmVuIHN1YnRsZSBidWdzIGNvdWxkIGxlYWQgdG8gc2VyaW91cyBtZW1vcnkgbWFuYWdlbWVudCBpc3N1ZXMgb3IgZXZlbiBwcml2aWxlZ2UgZXNjYWxhdGlvbi5cblxuTm93LCBsZXQncyBkaXZlIGRlZXBlciBpbnRvIHRoZSBpbXBsZW1lbnRhdGlvbiBvZiBgYnBmX3Byb2FjdGl2ZV9yZWNsYWltYCBhbmQgYGJwZl9wcm9hY3RpdmVfcmVjbGFpbV9zd2FwcGluZXNzYC4gSSBuZWVkIHRvIHVuZGVyc3RhbmQgdGhlIHNwZWNpZmljcyBvZiBob3cgdGhleSBpbnRlcmFjdCB3aXRoIHRoZSBjb3JlIG1lbW9yeSBtYW5hZ2VtZW50IHN1YnN5c3RlbXMuIEFuZCBJIHNob3VsZCBjaGVjayB0aGF0IGBtbS9icGZfbWVtY29udHJvbC5jYCBpcyBjb21waWxlZCBiYXNlZCBvbiB0aGUgcmlnaHQgY29uZmlndXJhdGlvbiBvcHRpb25zLCB3aGljaCBtZWFucyBJIHNob3VsZCBjaGVjayBgbW0vTWFrZWZpbGVgLiBXZeKAmXJlIGdvaW5nIHRvIG5lZWQgYm90aCBgQ09ORklHX01FTUNHYCBhbmQgYENPTkZJR19CUEZfU1lTQ0FMTGAgdG8gYmUgZW5hYmxlZCwgYXMgZXhwZWN0ZWQuXG5cblxuIiwiSW5wdXRUb2tlbnMiOjEwNTA4LCJPdXRwdXRUb2tlbnMiOjIxLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MjQ0LCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDgtMTlUMDc6NDQ6MjcuNjI5MzAxOTcyWiIsIlNlcSI6NCwiTmVzdGluZyI6MiwiVHlwZSI6InRvb2wiLCJOYW1lIjoiZ3JlcHBlciIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjMyMzMwNzU3NjcsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJFeHByZXNzaW9uXCI6IFwiYnBmX21lbWNvbnRyb2wub1wiXG59IiwiUmVzdWx0cyI6IntcbiAgXCJPdXRwdXRcIjogXCJtbS9NYWtlZmlsZT0xMDY9aWZkZWYgQ09ORklHX0JQRl9TWVNDQUxMXFxubW0vTWFrZWZpbGU6MTA3Om9iai0kKENPTkZJR19NRU1DRykgKz0gYnBmX21lbWNvbnRyb2wub1xcbm1tL01ha2VmaWxlLTEwOC1lbmRpZlxcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOC0xOVQwNzo0NDozMC44NjIzODcxMjlaIiwiU2VxIjo1LCJOZXN0aW5nIjoyLCJUeXBlIjoibGxtIiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuMS1wcm8tcHJldmlldyIsIkR1cmF0aW9uIjo3MjMyNzI4ODk1LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIqKktlcm5lbCBDb25maWd1cmF0aW9uIGZvciBCUEYgUHJvYWN0aXZlIFJlY2xhaW0qKlxuXG5Pa2F5LCBzbyBJJ20gbG9va2luZyBpbnRvIHRoZSBjb25maWd1cmF0aW9ucyBuZWVkZWQgdG8gZW5hYmxlIGFuZCB1c2UgYGJwZl9wcm9hY3RpdmVfcmVjbGFpbWAuIFJpZ2h0IG9mZiB0aGUgYmF0LCBJIGtub3cgSSdsbCBuZWVkIGBDT05GSUdfTUVNQ0dgIGFuZCBgQ09ORklHX0JQRl9TWVNDQUxMYC4gVGhvc2UgYXJlIHByZXR0eSBmdW5kYW1lbnRhbC4gTm93LCBsZXQncyB6b29tIGluIG9uIGBicGZfcHJvYWN0aXZlX3JlY2xhaW1gIGFuZCBgYnBmX3Byb2FjdGl2ZV9yZWNsYWltX3N3YXBwaW5lc3NgLiBUaGUgZmFjdCB0aGF0IHRoZXkncmUgZXhwb3NlZCBhcyBCUEYga2Z1bmNzIGlzIGtleSBoZXJlLCBhbmQgSSdsbCBuZWVkIHRvIG1ha2Ugc3VyZSB0aG9zZSBzeW1ib2xzIGFyZSBhY2Nlc3NpYmxlLlxuXG5JJ2xsIHF1aWNrbHkgc2NhbiBmb3IgYW55IG90aGVyIGRlcGVuZGVuY2llcywgdGhvdWdoIEknbSBndWVzc2luZyBgQ09ORklHX01FTUNHYCB3aWxsIGJlIHRoZSBwcmltYXJ5IHJlcXVpcmVtZW50LiBgQ09ORklHX0JQRl9TWVNDQUxMYCBpcyBwcmV0dHkgbXVjaCBzdGFuZGFyZCBmb3IgYW55IEJQRi1yZWxhdGVkIHdvcmssIHNvIHRoYXQncyBwcm9iYWJseSBjb3ZlcmVkLiBOZXh0LCBJIG5lZWQgdG8gdmVyaWZ5IHRoYXQgYHRyeV90b19mcmVlX21lbV9jZ3JvdXBfcGFnZXNgIGlzIGNvbnNpc3RlbnRseSBhdmFpbGFibGUuIEl0IHdvdWxkIGJlIGEgYml0IG9mIGEgbmlnaHRtYXJlIGlmIHRoYXQgd2VyZW4ndCB0aGUgY2FzZSFcblxuXG4iLCJJbnB1dFRva2VucyI6MTExODUsIk91dHB1dFRva2VucyI6MjYsIk91dHB1dFRob3VnaHRzVG9rZW5zIjoxNTMsIlRvb2xDYWxscyI6WyJncmVwcGVyIl19LHsiU3RhcnRlZCI6IjIwMjYtMDgtMTlUMDc6NDQ6MzguMDk1MTE5MDA0WiIsIlNlcSI6NiwiTmVzdGluZyI6MiwiVHlwZSI6InRvb2wiLCJOYW1lIjoiZ3JlcHBlciIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjIxNjIzMDA0MTksIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJFeHByZXNzaW9uXCI6IFwidHJ5X3RvX2ZyZWVfbWVtX2Nncm91cF9wYWdlc1wiXG59IiwiUmVzdWx0cyI6IntcbiAgXCJPdXRwdXRcIjogXCJpbmNsdWRlL2xpbnV4L3N3YXAuaD0zNTU9dW5zaWduZWQgbG9uZyBscnV2ZWNfbHJ1X3NpemUoc3RydWN0IGxydXZlYyAqbHJ1dmVjLCBlbnVtIGxydV9saXN0IGxydSwgaW50IHpvbmVfaWR4KTtcXG4tLVxcbmluY2x1ZGUvbGludXgvc3dhcC5oLTM2NC1cXG5pbmNsdWRlL2xpbnV4L3N3YXAuaDozNjU6ZXh0ZXJuIHVuc2lnbmVkIGxvbmcgdHJ5X3RvX2ZyZWVfbWVtX2Nncm91cF9wYWdlcyhzdHJ1Y3QgbWVtX2Nncm91cCAqbWVtY2csXFxuaW5jbHVkZS9saW51eC9zd2FwLmgtMzY2LVxcdFxcdFxcdFxcdFxcdFxcdCAgdW5zaWduZWQgbG9uZyBucl9wYWdlcyxcXG4tLVxcbm1tL2JwZl9tZW1jb250cm9sLmM9MTU4PV9fYnBmX2tmdW5jIHZvaWQgYnBmX21lbV9jZ3JvdXBfZmx1c2hfc3RhdHMoc3RydWN0IG1lbV9jZ3JvdXAgKm1lbWNnKVxcbi0tXFxubW0vYnBmX21lbWNvbnRyb2wuYy0xNjMtLypcXG5tbS9icGZfbWVtY29udHJvbC5jOjE2NDogKiBSZWNsYWltIG11c3Qgbm90IHJlY3Vyc2UuIHRyeV90b19mcmVlX21lbV9jZ3JvdXBfcGFnZXMoKSB1bmNvbmRpdGlvbmFsbHlcXG5tbS9icGZfbWVtY29udHJvbC5jLTE2NS0gKiBvdmVyd3JpdGVzIGN1cnJlbnQtXFx1MDAzZXJlY2xhaW1fc3RhdGUgb24gZW50cnkgYW5kIHJlc2V0cyBpdCB0byBOVUxMIG9uIGV4aXQuXFxuLS1cXG5tbS9icGZfbWVtY29udHJvbC5jLTE2OS0gKiBUaGUgZ3VhcmQgaXMgUEZfTUVNQUxMT0MuIEV2ZXJ5IHJlY2xhaW0gZW50cnkgcG9pbnQgbWFya3MgdGhlIGN1cnJlbnRcXG5tbS9icGZfbWVtY29udHJvbC5jOjE3MDogKiB0YXNrIHdpdGggaXQgZm9yIHRoZSB3aG9sZSByZWNsYWltIHdpbmRvdzogdHJ5X3RvX2ZyZWVfbWVtX2Nncm91cF9wYWdlcygpXFxubW0vYnBmX21lbWNvbnRyb2wuYy0xNzEtICogYW5kIF9fcGVyZm9ybV9yZWNsYWltKCkgZG8gc28gdmlhIG1lbWFsbG9jX25vcmVjbGFpbV9zYXZlKCksIGFuZCBrc3dhcGRcXG4tLVxcbm1tL2JwZl9tZW1jb250cm9sLmMtMTc3LSAqXFxubW0vYnBmX21lbWNvbnRyb2wuYzoxNzg6ICogSW4gdHJ5X3RvX2ZyZWVfbWVtX2Nncm91cF9wYWdlcygpLCByZWNsYWltX3N0YXRlIGlzIHNldCBzbGlnaHRseSBiZWZvcmVcXG5tbS9icGZfbWVtY29udHJvbC5jLTE3OS0gKiBQRl9NRU1BTExPQywgd2l0aCBvbmx5IGEgdHJhY2Vwb2ludCBpbiBiZXR3ZWVuLCB3aGljaCBhIHNsZWVwYWJsZSBCUEZcXG4tLVxcbm1tL2JwZl9tZW1jb250cm9sLmM9MTk2PWJwZl9wcm9hY3RpdmVfcmVjbGFpbV9wYWdlcyhzdHJ1Y3QgbWVtX2Nncm91cCAqbWVtY2csIHVuc2lnbmVkIGxvbmcgbnJfcGFnZXMsXFxuLS1cXG5tbS9icGZfbWVtY29udHJvbC5jLTIwMS1cXG5tbS9icGZfbWVtY29udHJvbC5jOjIwMjpcXHRyZXR1cm4gdHJ5X3RvX2ZyZWVfbWVtX2Nncm91cF9wYWdlcyhtZW1jZywgbnJfcGFnZXMsIEdGUF9LRVJORUwsXFxubW0vYnBmX21lbWNvbnRyb2wuYy0yMDMtXFx0XFx0XFx0XFx0XFx0ICAgIE1FTUNHX1JFQ0xBSU1fTUFZX1NXQVAgfFxcbi0tXFxubW0vbWVtY29udHJvbC12MS5jPTE0ODE9c3RhdGljIGludCBtZW1fY2dyb3VwX3Jlc2l6ZV9tYXgoc3RydWN0IG1lbV9jZ3JvdXAgKm1lbWNnLFxcbi0tXFxubW0vbWVtY29udHJvbC12MS5jLTE1MjEtXFxubW0vbWVtY29udHJvbC12MS5jOjE1MjI6XFx0XFx0aWYgKCF0cnlfdG9fZnJlZV9tZW1fY2dyb3VwX3BhZ2VzKG1lbWNnLCAxLCBHRlBfS0VSTkVMLFxcbm1tL21lbWNvbnRyb2wtdjEuYy0xNTIzLVxcdFxcdFxcdFxcdG1lbXN3ID8gMCA6IE1FTUNHX1JFQ0xBSU1fTUFZX1NXQVAsIE5VTEwpKSB7XFxuLS1cXG5tbS9tZW1jb250cm9sLXYxLmM9MTU0MD1zdGF0aWMgaW50IG1lbV9jZ3JvdXBfZm9yY2VfZW1wdHkoc3RydWN0IG1lbV9jZ3JvdXAgKm1lbWNnKVxcbi0tXFxubW0vbWVtY29udHJvbC12MS5jLTE1NTMtXFxubW0vbWVtY29udHJvbC12MS5jOjE1NTQ6XFx0XFx0aWYgKCF0cnlfdG9fZnJlZV9tZW1fY2dyb3VwX3BhZ2VzKG1lbWNnLCAxLCBHRlBfS0VSTkVMLFxcbm1tL21lbWNvbnRyb2wtdjEuYy0xNTU1LVxcdFxcdFxcdFxcdFxcdFxcdCAgTUVNQ0dfUkVDTEFJTV9NQVlfU1dBUCwgTlVMTCkpXFxuLS1cXG5tbS9tZW1jb250cm9sLmM9MjMyOD1zdGF0aWMgdW5zaWduZWQgbG9uZyByZWNsYWltX2hpZ2goc3RydWN0IG1lbV9jZ3JvdXAgKm1lbWNnLFxcbi0tXFxubW0vbWVtY29udHJvbC5jLTIzNDMtXFx0XFx0cHNpX21lbXN0YWxsX2VudGVyKFxcdTAwMjZwZmxhZ3MpO1xcbm1tL21lbWNvbnRyb2wuYzoyMzQ0OlxcdFxcdG5yX3JlY2xhaW1lZCArPSB0cnlfdG9fZnJlZV9tZW1fY2dyb3VwX3BhZ2VzKG1lbWNnLCBucl9wYWdlcyxcXG5tbS9tZW1jb250cm9sLmMtMjM0NS1cXHRcXHRcXHRcXHRcXHRcXHRcXHRnZnBfbWFzayxcXG4tLVxcbm1tL21lbWNvbnRyb2wuYz0yNTk1PXN0YXRpYyBpbnQgdHJ5X2NoYXJnZV9tZW1jZyhzdHJ1Y3QgbWVtX2Nncm91cCAqbWVtY2csIGdmcF90IGdmcF9tYXNrLFxcbi0tXFxubW0vbWVtY29udHJvbC5jLTI2NTQtXFx0cHNpX21lbXN0YWxsX2VudGVyKFxcdTAwMjZwZmxhZ3MpO1xcbm1tL21lbWNvbnRyb2wuYzoyNjU1OlxcdG5yX3JlY2xhaW1lZCA9IHRyeV90b19mcmVlX21lbV9jZ3JvdXBfcGFnZXMobWVtX292ZXJfbGltaXQsIG5yX3BhZ2VzLFxcbm1tL21lbWNvbnRyb2wuYy0yNjU2LVxcdFxcdFxcdFxcdFxcdFxcdCAgICBnZnBfbWFzaywgcmVjbGFpbV9vcHRpb25zLCBOVUxMKTtcXG4tLVxcbm1tL21lbWNvbnRyb2wuYz00NzY4PXN0YXRpYyBzc2l6ZV90IG1lbW9yeV9oaWdoX3dyaXRlKHN0cnVjdCBrZXJuZnNfb3Blbl9maWxlICpvZixcXG4tLVxcbm1tL21lbWNvbnRyb2wuYy00ODAyLVxcbm1tL21lbWNvbnRyb2wuYzo0ODAzOlxcdFxcdHJlY2xhaW1lZCA9IHRyeV90b19mcmVlX21lbV9jZ3JvdXBfcGFnZXMobWVtY2csIG5yX3BhZ2VzIC0gaGlnaCxcXG5tbS9tZW1jb250cm9sLmMtNDgwNC1cXHRcXHRcXHRcXHRcXHRHRlBfS0VSTkVMLCBNRU1DR19SRUNMQUlNX01BWV9TV0FQLCBOVUxMKTtcXG4tLVxcbm1tL21lbWNvbnRyb2wuYz00ODIwPXN0YXRpYyBzc2l6ZV90IG1lbW9yeV9tYXhfd3JpdGUoc3RydWN0IGtlcm5mc19vcGVuX2ZpbGUgKm9mLFxcbi0tXFxubW0vbWVtY29udHJvbC5jLTQ4NTQtXFx0XFx0aWYgKG5yX3JlY2xhaW1zKSB7XFxubW0vbWVtY29udHJvbC5jOjQ4NTU6XFx0XFx0XFx0aWYgKCF0cnlfdG9fZnJlZV9tZW1fY2dyb3VwX3BhZ2VzKG1lbWNnLCBucl9wYWdlcyAtIG1heCxcXG5tbS9tZW1jb250cm9sLmMtNDg1Ni1cXHRcXHRcXHRcXHRcXHRHRlBfS0VSTkVMLCBNRU1DR19SRUNMQUlNX01BWV9TV0FQLCBOVUxMKSlcXG4tLVxcbm1tL3Ztc2Nhbi5jPTY3MjI9dW5zaWduZWQgbG9uZyBtZW1fY2dyb3VwX3Nocmlua19ub2RlKHN0cnVjdCBtZW1fY2dyb3VwICptZW1jZyxcXG4tLVxcbm1tL3Ztc2Nhbi5jLTY3NjEtXFxubW0vdm1zY2FuLmM6Njc2Mjp1bnNpZ25lZCBsb25nIHRyeV90b19mcmVlX21lbV9jZ3JvdXBfcGFnZXMoc3RydWN0IG1lbV9jZ3JvdXAgKm1lbWNnLFxcbm1tL3Ztc2Nhbi5jLTY3NjMtXFx0XFx0XFx0XFx0XFx0ICAgdW5zaWduZWQgbG9uZyBucl9wYWdlcyxcXG4tLVxcbm1tL3Ztc2Nhbi5jLTY4MDItI2Vsc2VcXG5tbS92bXNjYW4uYzo2ODAzOnVuc2lnbmVkIGxvbmcgdHJ5X3RvX2ZyZWVfbWVtX2Nncm91cF9wYWdlcyhzdHJ1Y3QgbWVtX2Nncm91cCAqbWVtY2csXFxubW0vdm1zY2FuLmMtNjgwNC1cXHRcXHRcXHRcXHRcXHQgICB1bnNpZ25lZCBsb25nIG5yX3BhZ2VzLFxcbi0tXFxubW0vdm1zY2FuLmM9Nzg2Nj1pbnQgdXNlcl9wcm9hY3RpdmVfcmVjbGFpbShjaGFyICpidWYsXFxuLS1cXG5tbS92bXNjYW4uYy03OTMzLVxcdFxcdFxcdFxcdFxcdCAgTUVNQ0dfUkVDTEFJTV9QUk9BQ1RJVkU7XFxubW0vdm1zY2FuLmM6NzkzNDpcXHRcXHRcXHRyZWNsYWltZWQgPSB0cnlfdG9fZnJlZV9tZW1fY2dyb3VwX3BhZ2VzKG1lbWNnLFxcbm1tL3Ztc2Nhbi5jLTc5MzUtXFx0XFx0XFx0XFx0XFx0XFx0IGJhdGNoX3NpemUsIGdmcF9tYXNrLFxcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOC0xOVQwNzo0NDo0MC4yNTc0MjUzNzJaIiwiU2VxIjo3LCJOZXN0aW5nIjoyLCJUeXBlIjoibGxtIiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuMS1wcm8tcHJldmlldyIsIkR1cmF0aW9uIjo2Mjc0NTc3NzM2LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIqKk15IEFzc2Vzc21lbnQgb2YgdGhlIE1lbW9yeSBDZ3JvdXAgQlBGIEtmdW5jIEFkZGl0aW9uKipcblxuT2theSwgc28gdGhpcyBwYXRjaCBpbnRyb2R1Y2VzIGEgY291cGxlIG9mIG5ldyBCUEYga2Z1bmNzOiBgYnBmX3Byb2FjdGl2ZV9yZWNsYWltYCBhbmQgYGJwZl9wcm9hY3RpdmVfcmVjbGFpbV9zd2FwcGluZXNzYC4gVGhlIGNvcmUgaWRlYSBpcyB0aGF0IEJQRiBwcm9ncmFtcyB3aWxsIG5vdyBiZSBhYmxlIHRvIHByb2FjdGl2ZWx5IHRyaWdnZXIgbWVtb3J5IHJlY2xhaW0gb3BlcmF0aW9ucyB3aXRoaW4gYSBtZW1vcnkgY2dyb3VwLiBUaGlzIGlzIHNpZ25pZmljYW50IGJlY2F1c2UgaXQncyBnaXZpbmcgQlBGIGRpcmVjdCBhY2Nlc3MgdG8gY29yZSBtZW1vcnkgbWFuYWdlbWVudCBsb2dpYy4gV2UncmUgZWZmZWN0aXZlbHkgZXhwb3NpbmcgYSBjcnVjaWFsIHBhcnQgb2YgdGhlIGtlcm5lbCdzIG1lbW9yeSBtYW5hZ2VtZW50IHRvIHRoZSBCUEYgZG9tYWluLCB3aGljaCBpcyBhIGJpZyBkZWFsIGluIHRlcm1zIG9mIHByb2dyYW1tYWJpbGl0eSBhbmQgY29udHJvbC5cblxuRnJvbSBhIGNvbmZpZ3VyYXRpb24gc3RhbmRwb2ludCwgaXQgbG9va3Mgc3RyYWlnaHRmb3J3YXJkLiBJIG5lZWQgdG8gZW5zdXJlIHRoYXQgYE1FTUNHYCBhbmQgYEJQRl9TWVNDQUxMYCBhcmUgZW5hYmxlZC4gSSdsbCBkb3VibGUtY2hlY2sgdG8gbWFrZSBhYnNvbHV0ZWx5IGNlcnRhaW4gdGhlcmUgYXJlbid0IGFueSBvdGhlciBkZXBlbmRlbmNpZXMsIGJ1dCB0aG9zZSBzaG91bGQgYmUgdGhlIHByaW1hcnkgcmVxdWlyZW1lbnRzLiBgQ09ORklHX01FTUNHYCBpcywgb2YgY291cnNlLCBjcml0aWNhbCBmb3IgdGhlIHdob2xlIG1lbW9yeSBjZ3JvdXAgY29udGV4dCwgYW5kIGBDT05GSUdfQlBGX1NZU0NBTExgIGlzIHN0YW5kYXJkIGZvciBCUEYgZnVuY3Rpb25hbGl0eS5cblxuQWxyaWdodCwgdGhhdCdzIG15IHVuZGVyc3RhbmRpbmcsIEkgd2lsbCBzZXQgdGhvc2UgcmVzdWx0cy5cblxuXG4iLCJJbnB1dFRva2VucyI6MTMyNDQsIk91dHB1dFRva2VucyI6MTQ2LCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MTU3LCJUb29sQ2FsbHMiOlsiZ3JlcHBlciJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTE5VDA3OjQ0OjQ2LjUzMjAwNTExOVoiLCJTZXEiOjgsIk5lc3RpbmciOjIsIlR5cGUiOiJ0b29sIiwiTmFtZSI6InNldC1yZXN1bHRzIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6NzA2ODIxNTcsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJFbmFibGVDb25maWdzXCI6IFtcbiAgICBcIk1FTUNHXCIsXG4gICAgXCJCUEZfU1lTQ0FMTFwiXG4gIF0sXG4gIFwiRm9jdXNTeW1ib2xzXCI6IFtcbiAgICBcImJwZl9wcm9hY3RpdmVfcmVjbGFpbVwiLFxuICAgIFwiYnBmX3Byb2FjdGl2ZV9yZWNsYWltX3N3YXBwaW5lc3NcIlxuICBdLFxuICBcIlJlYXNvbmluZ1wiOiBcIlRoZSBwYXRjaCBpbnRyb2R1Y2VzIHR3byBuZXcgQlBGIGtmdW5jcywgYGJwZl9wcm9hY3RpdmVfcmVjbGFpbWAgYW5kIGBicGZfcHJvYWN0aXZlX3JlY2xhaW1fc3dhcHBpbmVzc2AsIHdoaWNoIGFsbG93IEJQRiBwcm9ncmFtcyB0byBwcm9hY3RpdmVseSB0cmlnZ2VyIG1lbW9yeSByZWNsYWltIG9uIGEgbWVtb3J5IGNncm91cC4gVGhpcyBleHBvc2VzIGNvcmUgbWVtb3J5IG1hbmFnZW1lbnQgYW5kIHJlY2xhaW0gbG9naWMgdG8gQlBGLCBtYWtpbmcgaXQgYSBmdW5jdGlvbmFsIGNoYW5nZSB0aGF0IGlzIGhpZ2hseSByZWFjaGFibGUgYW5kIHdvcnRoIGZ1enppbmcuXCIsXG4gIFwiV29ydGhGdXp6aW5nXCI6IHRydWVcbn0iLCJSZXN1bHRzIjoie1xuICBcIkVuYWJsZUNvbmZpZ3NcIjogW1xuICAgIFwiTUVNQ0dcIixcbiAgICBcIkJQRl9TWVNDQUxMXCJcbiAgXSxcbiAgXCJGb2N1c1N5bWJvbHNcIjogW1xuICAgIFwiYnBmX3Byb2FjdGl2ZV9yZWNsYWltXCIsXG4gICAgXCJicGZfcHJvYWN0aXZlX3JlY2xhaW1fc3dhcHBpbmVzc1wiXG4gIF0sXG4gIFwiUmVhc29uaW5nXCI6IFwiVGhlIHBhdGNoIGludHJvZHVjZXMgdHdvIG5ldyBCUEYga2Z1bmNzLCBgYnBmX3Byb2FjdGl2ZV9yZWNsYWltYCBhbmQgYGJwZl9wcm9hY3RpdmVfcmVjbGFpbV9zd2FwcGluZXNzYCwgd2hpY2ggYWxsb3cgQlBGIHByb2dyYW1zIHRvIHByb2FjdGl2ZWx5IHRyaWdnZXIgbWVtb3J5IHJlY2xhaW0gb24gYSBtZW1vcnkgY2dyb3VwLiBUaGlzIGV4cG9zZXMgY29yZSBtZW1vcnkgbWFuYWdlbWVudCBhbmQgcmVjbGFpbSBsb2dpYyB0byBCUEYsIG1ha2luZyBpdCBhIGZ1bmN0aW9uYWwgY2hhbmdlIHRoYXQgaXMgaGlnaGx5IHJlYWNoYWJsZSBhbmQgd29ydGggZnV6emluZy5cIixcbiAgXCJXb3J0aEZ1enppbmdcIjogdHJ1ZVxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDgtMTlUMDc6NDQ6NDYuNjAyNjk0MDY2WiIsIlNlcSI6OSwiTmVzdGluZyI6MSwiVHlwZSI6ImFjdGlvbiIsIk5hbWUiOiJJZiIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjE0MTQ3NDUyNjMwLCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiV29ydGhGdXp6aW5nXCI6IHRydWVcbn0iLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDgtMTlUMDc6NDQ6NDYuNjAzMjQzMDE2WiIsIlNlcSI6MTAsIk5lc3RpbmciOjIsIlR5cGUiOiJhZ2VudCIsIk5hbWUiOiJrbXNhbi1ldmFsdWF0b3IiLCJNb2RlbCI6ImJlc3QtZXhwZW5zaXZlIiwiRHVyYXRpb24iOjE0MTQ2ODk5OTEwLCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6IntcbiAgXCJLTVNBTlJlYXNvbmluZ1wiOiBcIlRoZSBwYXRjaCBpbnRyb2R1Y2VzIHR3byBuZXcgQlBGIGtmdW5jcyAoYGJwZl9wcm9hY3RpdmVfcmVjbGFpbWAgYW5kIGBicGZfcHJvYWN0aXZlX3JlY2xhaW1fc3dhcHBpbmVzc2ApIHRoYXQgd3JhcCB0aGUgZXhpc3RpbmcgYHRyeV90b19mcmVlX21lbV9jZ3JvdXBfcGFnZXNgIGZ1bmN0aW9uIHRvIGFsbG93IEJQRiBwcm9ncmFtcyB0byB0cmlnZ2VyIHByb2FjdGl2ZSBtZW1vcnkgcmVjbGFpbSBmb3IgYSBtZW1vcnkgY2dyb3VwLiBUaGUgYXJndW1lbnRzIHBhc3NlZCB0byB0aGVzZSBrZnVuY3MgYXJlIHNjYWxhciB2YWx1ZXMgYW5kIHBvaW50ZXJzIHZlcmlmaWVkIGJ5IHRoZSBCUEYgdmVyaWZpZXIsIGVuc3VyaW5nIHRoZXkgYXJlIGluaXRpYWxpemVkLiBUaGUgcGF0Y2ggZG9lcyBub3QgaW50cm9kdWNlIGFueSBuZXcgZGF0YSBzdHJ1Y3R1cmVzIGNvcGllZCB0byBvciBmcm9tIHVzZXJzcGFjZSwgbm9yIGRvZXMgaXQgYWxsb2NhdGUgY29tcGxleCBzdHJ1Y3R1cmVzIHRoYXQgbWlnaHQgYmUgbGVmdCBwYXJ0aWFsbHkgdW5pbml0aWFsaXplZC4gVGhlcmUgaXMgbm8gcmlzayBvZiB1bmluaXRpYWxpemVkIG1lbW9yeSBiZWluZyBsZWFrZWQgdG8gdXNlcnNwYWNlIG9yIHVzZWQgaW4gY29udHJvbCBmbG93IGRlY2lzaW9ucy4gQW55IHBvdGVudGlhbCBtZW1vcnkgc2FmZXR5IGlzc3VlcyBpbnRyb2R1Y2VkIGJ5IHRoZXNlIGNoYW5nZXMgKHN1Y2ggYXMgdXNlLWFmdGVyLWZyZWUgb3Igb3V0LW9mLWJvdW5kcyBhY2Nlc3NlcyBvbiB0aGUgYG1lbV9jZ3JvdXBgIHBvaW50ZXIpIHdvdWxkIGJlIGVmZmVjdGl2ZWx5IGNhdWdodCBieSBLQVNBTiBhbmQgdGhlIHN0YW5kYXJkIEJQRiB2ZXJpZmllciBjaGVja3MuIFRoZXJlZm9yZSwgYSBkZWRpY2F0ZWQgS01TQU4gZnV6emluZyBzZXNzaW9uIGlzIG5vdCByZXF1aXJlZC5cIixcbiAgXCJOZWVkc0tNU0FOXCI6IGZhbHNlXG59IiwiSW5zdHJ1Y3Rpb24iOiJZb3UgYXJlIGFuIGV4cGVydCBMaW51eCBrZXJuZWwgc2VjdXJpdHkgZW5naW5lZXIgc3BlY2lhbGl6aW5nIGluIGtlcm5lbCBtZW1vcnlcbmVycm9yIGRldGVjdG9ycyAoS0FTQU4gYW5kIEtNU0FOKS4gWW91ciBqb2IgaXMgdG8gcmV2aWV3IHRoZSBwcm92aWRlZCBwYXRjaCBzZXJpZXMgYW5kXG5kZXRlcm1pbmUgaWYgdGhlIGNvZGUgY2hhbmdlcyBqdXN0aWZ5IHNwYXduaW5nIGEgZGVkaWNhdGVkIEtNU0FOIChLZXJuZWxNZW1vcnlTYW5pdGl6ZXIpXG5mdXp6aW5nIHNlc3Npb24gaW4gYWRkaXRpb24gdG8gc3RhbmRhcmQgS0FTQU4gZnV6emluZy5cblxuQ1JJVElDQUwgRElTVElOQ1RJT04gQkVUV0VFTiBLQVNBTiBBTkQgS01TQU46XG4tIFN0YW5kYXJkIEtBU0FOIGtlcm5lbCBidWlsZHMgKHVwc3RyZWFtLWFwcGFybW9yLWthc2FuLmNvbmZpZykgYWxyZWFkeSBlbmFibGVcbiAgYSBjb21wcmVoZW5zaXZlIHN1aXRlIG9mIGRlYnVnZ2luZyB0b29scyBhbmQgc2FuaXRpemVycywgaW5jbHVkaW5nIEtBU0FOXG4gIChvdXQtb2YtYm91bmRzIGFjY2Vzc2VzLCB1c2UtYWZ0ZXItZnJlZSwgZG91YmxlIGZyZWUsIGludmFsaWQgZnJlZSksIExPQ0tERVBcbiAgKGxvY2tpbmcgYnVncyBhbmQgZGVhZGxvY2tzKSwgVUItc2FuaXRpemVycywgYW5kIG1lbW9yeSBjb3JydXB0aW9uIGNoZWNrcy5cbi0gS01TQU4gKEtlcm5lbE1lbW9yeVNhbml0aXplcikgZGV0ZWN0cyByZWFkcyBvZiBVTklOSVRJQUxJWkVEIG1lbW9yeSAoc3RhY2ssIGhlYXAsXG4gIG9yIHBhZ2UgYWxsb2NhdGlvbnMpIGFuZCBrZXJuZWwtdG8tdXNlciBtZW1vcnkgaW5mby1sZWFrcy5cblxuUnVsZTogVEhFUkUgSVMgTk8gU0VOU0UgSU4gUlVOTklORyBBIEtNU0FOIFNFU1NJT04gSUYgQSBCVUcgQ0FOIEJFIENBVUdIVCBCWSBLQVNBTixcbkxPQ0tERVAsIE9SIE9USEVSIFNUQU5EQVJEIEJVRyBERVRFQ1RPUlMuXG5BIGRlZGljYXRlZCBLTVNBTiBmdXp6aW5nIHNlc3Npb24gaW5jdXJzIHNpZ25pZmljYW50IHJlc291cmNlIGNvc3RzLiBZb3UgbXVzdCBPTkxZXG5zZXQgTmVlZHNLTVNBTj10cnVlIGlmIHRoZSBjb2RlIGNoYW5nZXMgaW50cm9kdWNlIG9yIGV4cG9zZSBVTklOSVRJQUxJWkVEIE1FTU9SWSByaXNrc1xudGhhdCBhcmUgZGV0ZWN0ZWQgT05MWSBieSBLTVNBTi5cblxuTG9vayBob2xpc3RpY2FsbHkgYXQgdGhlIHBhdGNoIHNlcmllcyBhbmQgc3Vycm91bmRpbmcgY29kZS4gRXZlbiBpZiBubyBkaXJlY3RcbnVuaW5pdGlhbGl6ZWQgZmllbGQgYWNjZXNzZXMgb3IgbmV3IGJ1ZmZlciBhbGxvY2F0aW9ucyBhcmUgYWRkZWQgaW4gdGhlIGRpZmYgaXRzZWxmLFxuYSBwYXRjaCBtYXkgYWx0ZXIgY29udHJvbCBmbG93LCBib3VuZHMgY2hlY2tpbmcsIG9yIGRhdGEgbGVuZ3RoIGNhbGN1bGF0aW9ucyBpbiB3YXlzXG50aGF0IGNoYW5nZSBob3cgdGhlIHJlc3Qgb2YgdGhlIGNvZGUgb3BlcmF0ZXMgb24gZXhpc3RpbmcgYnVmZmVycyAoZS5nLiBhbGxvd2luZ1xudW5pbml0aWFsaXplZCBzdGFjay9oZWFwIG1lbW9yeSB0byBiZSByZWFkLCBjb3BpZWQgdG8gdXNlciBzcGFjZSwgb3IgdXNlZCBpbiBjb250cm9sXG5mbG93KS4gRG8gbm90IGhlc2l0YXRlIHRvIHVzZSB5b3VyIGNvZGUgYWNjZXNzIHRvb2xzIHRvIGluc3BlY3QgdGhlIHN1cnJvdW5kaW5nIGNvZGUsXG5jYWxsZWQgZnVuY3Rpb25zLCBhbmQgY2FsbGVycy5cblxuU2V0IE5lZWRzS01TQU49dHJ1ZSBPTkxZIElGIHRoZSBwYXRjaCBpbnRyb2R1Y2VzIG9yIG1vZGlmaWVzOlxuMS4gS2VybmVsIHN0cnVjdHVyZXMgc2VudCB0byB1c2VyIHNwYWNlICh2aWEgY29weV90b191c2VyLCBwdXRfdXNlciwgbmV0bGluayBza2JcbiAgIGF0dHJpYnV0ZXMsIGlvY3RsIG91dHB1dCBhcmd1bWVudHMsIHNvY2tldCBvcHRpb25zLCBvciBCUEYgYnVmZmVycykgd2hlcmUgZmllbGRzXG4gICBvciBzdHJ1Y3R1cmUgcGFkZGluZyBtaWdodCBub3QgYmUgZnVsbHkgaW5pdGlhbGl6ZWQvemVyb2VkLlxuMi4gQ29uZGl0aW9uYWwgbG9naWMgb3IgYnJhbmNoaW5nIHRoYXQgZGVwZW5kcyBvbiBwb3RlbnRpYWxseSB1bmluaXRpYWxpemVkIHZhcmlhYmxlc1xuICAgb3Igc3RydWN0IGZpZWxkcy5cbjMuIEFsbG9jYXRpb24gb3IgaW5pdGlhbGl6YXRpb24gb2YgY29tcGxleCBkYXRhIHN0cnVjdHVyZXMgd2hlcmUgdW5pbml0aWFsaXplZCBmaWVsZHNcbiAgIGNvdWxkIGJlIHJlYWQgbGF0ZXIgaW4gcmVhY2hhYmxlIGNvZGUgcGF0aHMuXG40LiBCb3VuZHMgY2hlY2tzLCBsZW5ndGhzLCBvciBsb2dpYyBpbiBhIHdheSB0aGF0IGFsbG93cyBzdXJyb3VuZGluZyBjb2RlIHRvIGFjY2Vzc1xuICAgdW5pbml0aWFsaXplZCBieXRlcyBvZiBleGlzdGluZyBidWZmZXJzLlxuXG5TZXQgTmVlZHNLTVNBTj1mYWxzZSBJRjpcbi0gVGhlIGNvZGUgY2hhbmdlcyBwcmltYXJpbHkgcmlzayBvdXQtb2YtYm91bmRzIGFjY2VzcywgYXJyYXkgb3ZlcmZsb3dzLCBOVUxMIHBvaW50ZXJcbiAgZGVyZWZlcmVuY2VzLCBsb2NraW5nIGRlYWRsb2Nrcywgb3IgdXNlLWFmdGVyLWZyZWUgYnVncyAodGhlc2UgYXJlIGFscmVhZHkgY2F1Z2h0XG4gIGJ5IEtBU0FOLCBMT0NLREVQLCBvciBzdGFuZGFyZCBidWcgZGV0ZWN0b3JzKS5cbi0gQWxsIHN0YWNrL2hlYXAgc3RydWN0dXJlcyB0b3VjaGVkIG9yIGludHJvZHVjZWQgYnkgdGhlIHBhdGNoIGFyZSBmdWxseSB6ZXJvZWRcbiAgb3IgaW5pdGlhbGl6ZWQgKGUuZy4gdXNpbmcgPSB7MH0sIG1lbXNldCwga3phbGxvYykgYmVmb3JlIGJlaW5nIHJlYWQgb3IgY29waWVkLlxuLSBUaGUgcGF0Y2ggZG9lcyBub3QgaW50cm9kdWNlIGFueSByaXNrIG9mIHVuaW5pdGlhbGl6ZWQgbWVtb3J5IHVzYWdlIG9yIGluZm8tbGVha3MuXG5cblVzZSB5b3VyIGNvZGUgYWNjZXNzIHRvb2xzIHRvIGluc3BlY3QgdGhlIHN1cnJvdW5kaW5nIGNvZGUgaWYgbmVjZXNzYXJ5LCB0aGVuIHByb3ZpZGVcbmRldGFpbGVkIEtNU0FOUmVhc29uaW5nIGNvbnRyYXN0aW5nIEtBU0FOIHZzIEtNU0FOIGFwcGxpY2FiaWxpdHkgZm9yIHRoaXMgcGF0Y2guXG5QcmVmZXIgY2FsbGluZyBzZXZlcmFsIHRvb2xzIGF0IHRoZSBzYW1lIHRpbWUgdG8gc2F2ZSByb3VuZC10cmlwcy5cblxuXG5Vc2Ugc2V0LXJlc3VsdHMgdG9vbCB0byBwcm92aWRlIHJlc3VsdHMgb2YgdGhlIGFuYWx5c2lzLlxuSXQgbXVzdCBiZSBjYWxsZWQgZXhhY3RseSBvbmNlIGJlZm9yZSB0aGUgZmluYWwgcmVwbHkuXG5JZ25vcmUgcmVzdWx0cyBvZiB0aGlzIHRvb2wuXG4iLCJQcm9tcHQiOiJGb3IgeW91ciBjb252ZW5pZW5jZSwgaGVyZSBpcyB0aGUgZGlmZiBvZiB0aGUgY2hhbmdlczpcbmNvbW1pdCA5YmU1MzI1MTQ1YTA3MDA2M2QzOTA5NTgzMjM4YjQ5N2E5NmRkNzdmXG5BdXRob3I6IHN5ei1jbHVzdGVyIFx1MDAzY3RyaWFnZUBzeXprYWxsZXIuY29tXHUwMDNlXG5EYXRlOiAgIFdlZCBBdWcgMTkgMDc6NDQ6MTggMjAyNiArMDAwMFxuXG4gICAgc3l6LWNsdXN0ZXI6IGFwcGxpZWQgcGF0Y2ggdW5kZXIgcmV2aWV3XG5cbmRpZmYgLS1naXQgYS9tbS9icGZfbWVtY29udHJvbC5jIGIvbW0vYnBmX21lbWNvbnRyb2wuY1xuaW5kZXggNzE2ZGY0OWQ3NjQ3Ny4uYjBhMGQ0YzU1ZGM0ZSAxMDA2NDRcbi0tLSBhL21tL2JwZl9tZW1jb250cm9sLmNcbisrKyBiL21tL2JwZl9tZW1jb250cm9sLmNcbkBAIC02LDYgKzYsNyBAQFxuICAqL1xuIFxuICNpbmNsdWRlIFx1MDAzY2xpbnV4L21lbWNvbnRyb2wuaFx1MDAzZVxuKyNpbmNsdWRlIFx1MDAzY2xpbnV4L3N3YXAuaFx1MDAzZVxuICNpbmNsdWRlIFx1MDAzY2xpbnV4L2JwZi5oXHUwMDNlXG4gXG4gX19icGZfa2Z1bmNfc3RhcnRfZGVmcygpO1xuQEAgLTE1OSw2ICsxNjAsMTAzIEBAIF9fYnBmX2tmdW5jIHZvaWQgYnBmX21lbV9jZ3JvdXBfZmx1c2hfc3RhdHMoc3RydWN0IG1lbV9jZ3JvdXAgKm1lbWNnKVxuIFx0bWVtX2Nncm91cF9mbHVzaF9zdGF0cyhtZW1jZyk7XG4gfVxuIFxuKy8qXG4rICogUmVjbGFpbSBtdXN0IG5vdCByZWN1cnNlLiB0cnlfdG9fZnJlZV9tZW1fY2dyb3VwX3BhZ2VzKCkgdW5jb25kaXRpb25hbGx5XG4rICogb3ZlcndyaXRlcyBjdXJyZW50LVx1MDAzZXJlY2xhaW1fc3RhdGUgb24gZW50cnkgYW5kIHJlc2V0cyBpdCB0byBOVUxMIG9uIGV4aXQuXG4rICogU28gaW52b2tpbmcgaXQgZnJvbSBhbiBpbi1mbGlnaHQgcmVjbGFpbSB3b3VsZCBjbG9iYmVyIHRoZSBvdXRlciByZWNsYWltXG4rICogc3RhdGUgYW5kIGNvcnJ1cHQgaXRzIGFjY291bnRpbmcuXG4rICpcbisgKiBUaGUgZ3VhcmQgaXMgUEZfTUVNQUxMT0MuIEV2ZXJ5IHJlY2xhaW0gZW50cnkgcG9pbnQgbWFya3MgdGhlIGN1cnJlbnRcbisgKiB0YXNrIHdpdGggaXQgZm9yIHRoZSB3aG9sZSByZWNsYWltIHdpbmRvdzogdHJ5X3RvX2ZyZWVfbWVtX2Nncm91cF9wYWdlcygpXG4rICogYW5kIF9fcGVyZm9ybV9yZWNsYWltKCkgZG8gc28gdmlhIG1lbWFsbG9jX25vcmVjbGFpbV9zYXZlKCksIGFuZCBrc3dhcGRcbisgKiBrZWVwcyBpdCBzZXQgZm9yIGl0cyBlbnRpcmUgbGlmZXRpbWUuIEEgaG9vayBpbnNpZGUgdGhlIHJlY2xhaW0gcGF0aFxuKyAqIChzaHJpbmtfbm9kZSwgc2hyaW5rX3NsYWIsIC4uLikgZXhlY3V0ZXMgaW4gdGhlIGNvbnRleHQgb2YgdGhlXG4rICogcmVjbGFpbWluZyB0YXNrLCB3aGVyZSBjdXJyZW50LVx1MDAzZWZsYWdzIGFscmVhZHkgY2FycmllcyB0aGUgZmxhZy4gVGhlIHBhZ2VcbisgKiBhbGxvY2F0b3IsIHRoZSBtZW1jZyBjaGFyZ2luZyBwYXRoIGFuZCBub2RlX3JlY2xhaW0oKSByZWx5IG9uIHRoZSBzYW1lXG4rICogZmxhZyB0byBhdm9pZCByZWNsYWltIHJlY3Vyc2lvbi5cbisgKlxuKyAqIEluIHRyeV90b19mcmVlX21lbV9jZ3JvdXBfcGFnZXMoKSwgcmVjbGFpbV9zdGF0ZSBpcyBzZXQgc2xpZ2h0bHkgYmVmb3JlXG4rICogUEZfTUVNQUxMT0MsIHdpdGggb25seSBhIHRyYWNlcG9pbnQgaW4gYmV0d2Vlbiwgd2hpY2ggYSBzbGVlcGFibGUgQlBGXG4rICogcHJvZ3JhbSBjYW5ub3QgYXR0YWNoIHRvLlxuKyAqIEFsc28sIFBGX01FTUFMTE9DIGlzIHNldCBpbiBzb21lIG5vbi1yZWNsYWltIGNvbnRleHRzIChlLmcuIGRpcmVjdCBjb21wYWN0aW9uXG4rICogYW5kIHZtYWxsb2MpLCB3aGVyZSB0aGUga2Z1bmMgY29uc2VydmF0aXZlbHkgcmVmdXNlcyB0byByZWNsYWltIGFzIHdlbGwuXG4rICovXG4rc3RhdGljIGJvb2wgYnBmX2luX3JlY2xhaW1fY29udGV4dCh2b2lkKVxuK3tcbitcdHJldHVybiBjdXJyZW50LVx1MDAzZWZsYWdzIFx1MDAyNiBQRl9NRU1BTExPQztcbit9XG4rXG4rLypcbisgKiBTaGFyZWQgaW1wbGVtZW50YXRpb24gb2YgdGhlIHByb2FjdGl2ZSByZWNsYWltIGtmdW5jczogcGVyZm9ybXMgb25lXG4rICogcmVjbGFpbSBwYXNzIG9uIEBtZW1jZyB3aXRoIEBucl9wYWdlcyBhcyB0aGUgZ29hbCwgYWxsb3dpbmcgc3dhcCwgYW5kXG4rICogQHN3YXBwaW5lc3MgYXMgdGhlIGFub24vZmlsZSBiYWxhbmNlIG92ZXJyaWRlIChOVUxMIHRvIGZvbGxvdyB0aGVcbisgKiBjZ3JvdXAncyBvd24gc3dhcHBpbmVzcyBzZXR0aW5nKS5cbisgKi9cbitzdGF0aWMgdW5zaWduZWQgbG9uZ1xuK2JwZl9wcm9hY3RpdmVfcmVjbGFpbV9wYWdlcyhzdHJ1Y3QgbWVtX2Nncm91cCAqbWVtY2csIHVuc2lnbmVkIGxvbmcgbnJfcGFnZXMsXG4rXHRcdFx0ICAgIGludCAqc3dhcHBpbmVzcylcbit7XG4rXHRpZiAoIW5yX3BhZ2VzIHx8IHVubGlrZWx5KGJwZl9pbl9yZWNsYWltX2NvbnRleHQoKSkpXG4rXHRcdHJldHVybiAwO1xuK1xuK1x0cmV0dXJuIHRyeV90b19mcmVlX21lbV9jZ3JvdXBfcGFnZXMobWVtY2csIG5yX3BhZ2VzLCBHRlBfS0VSTkVMLFxuK1x0XHRcdFx0XHQgICAgTUVNQ0dfUkVDTEFJTV9NQVlfU1dBUCB8XG4rXHRcdFx0XHRcdCAgICBNRU1DR19SRUNMQUlNX1BST0FDVElWRSxcbitcdFx0XHRcdFx0ICAgIHN3YXBwaW5lc3MpO1xuK31cbitcbisvKipcbisgKiBicGZfcHJvYWN0aXZlX3JlY2xhaW0gLSBwcm9hY3RpdmVseSByZWNsYWltIG1lbW9yeSBmcm9tIGEgbWVtb3J5XG4rICogICAgICAgICAgICAgICAgICAgICAgICAgY2dyb3VwXG4rICogQG1lbWNnOiB0aGUgdGFyZ2V0IG1lbW9yeSBjZ3JvdXAgdG8gcmVjbGFpbSBmcm9tXG4rICogQHNpemU6ICB0aGUgYW1vdW50IG9mIG1lbW9yeSB0byByZWNsYWltLCBpbiBieXRlc1xuKyAqXG4rICogVHJpZ2dlciBvbmUgcHJvYWN0aXZlIHJlY2xhaW0gcGFzcyBvbiBAbWVtY2csIHNpbWlsYXIgdG8gYSB3cml0ZSB0b1xuKyAqIHRoZSBtZW1vcnkucmVjbGFpbSBjZ3JvdXAgZmlsZTogcGFnZXMgYXJlIHJlY2xhaW1lZCBhY2NvcmRpbmcgdG8gdGhlXG4rICogY2dyb3VwJ3Mgb3duIHN3YXBwaW5lc3Mgc2V0dGluZyBhbmQgc3dhcCBpcyBhbGxvd2VkLiBOb3RlIHRoYXQsXG4rICogdW5saWtlIG1lbW9yeS5yZWNsYWltLCB0aGlzIGRvZXMgbm90IHJldHJ5IHVudGlsIEBzaXplIGlzIHJlYWNoZWQ7XG4rICogY2FsbGVycyBjYW4gaW52b2tlIGl0IGFnYWluIGlmIG5lZWRlZC5cbisgKlxuKyAqIFJldHVybjpcbisgKiAgIFRoZSBudW1iZXIgb2YgcGFnZXMgYWN0dWFsbHkgcmVjbGFpbWVkLCBvciAwIGlmIEBzaXplIGlzIHNtYWxsZXJcbisgKiAgIHRoYW4gYSBwYWdlIG9yIHRoZSBjYWxsaW5nIHRhc2sgaXMgYWxyZWFkeSBpbiBhIHJlY2xhaW0vZnJlZWluZ1xuKyAqICAgY29udGV4dCAoUEZfTUVNQUxMT0MpLlxuKyAqL1xuK19fYnBmX2tmdW5jIHVuc2lnbmVkIGxvbmcgYnBmX3Byb2FjdGl2ZV9yZWNsYWltKHN0cnVjdCBtZW1fY2dyb3VwICptZW1jZyxcbitcdFx0XHRcdFx0XHR1bnNpZ25lZCBsb25nIHNpemUpXG4re1xuK1x0cmV0dXJuIGJwZl9wcm9hY3RpdmVfcmVjbGFpbV9wYWdlcyhtZW1jZywgc2l6ZSAvIFBBR0VfU0laRSwgTlVMTCk7XG4rfVxuK1xuKy8qKlxuKyAqIGJwZl9wcm9hY3RpdmVfcmVjbGFpbV9zd2FwcGluZXNzIC0gcHJvYWN0aXZlbHkgcmVjbGFpbSBtZW1vcnkgZnJvbSBhXG4rICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZW1vcnkgY2dyb3VwIHdpdGggYW4gZXhwbGljaXRcbisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN3YXBwaW5lc3NcbisgKiBAbWVtY2c6ICAgICAgdGhlIHRhcmdldCBtZW1vcnkgY2dyb3VwIHRvIHJlY2xhaW0gZnJvbVxuKyAqIEBzaXplOiAgICAgICB0aGUgYW1vdW50IG9mIG1lbW9yeSB0byByZWNsYWltLCBpbiBieXRlc1xuKyAqIEBzd2FwcGluZXNzOiBzd2FwcGluZXNzIG92ZXJyaWRlIGZvciB0aGlzIHJlY2xhaW0gcGFzc1xuKyAqXG4rICogU2FtZSBhcyBicGZfcHJvYWN0aXZlX3JlY2xhaW0oKSwgZXhjZXB0IHRoYXQgdGhlIGFub24vZmlsZSByZWNsYWltXG4rICogYmFsYW5jZSBpcyBjb250cm9sbGVkIGJ5IEBzd2FwcGluZXNzIGluc3RlYWQgb2YgdGhlIGNncm91cCdzXG4rICogc3dhcHBpbmVzcyBzZXR0aW5nLiBWYWxpZCB2YWx1ZXMgYXJlIFtNSU5fU1dBUFBJTkVTUywgTUFYX1NXQVBQSU5FU1NdXG4rICogYW5kIFNXQVBQSU5FU1NfQU5PTl9PTkxZLCB3aGljaCByZXN0cmljdHMgcmVjbGFpbSB0byBhbm9uIGZvbGlvcy5cbisgKlxuKyAqIFJldHVybjpcbisgKiAgIFRoZSBudW1iZXIgb2YgcGFnZXMgYWN0dWFsbHkgcmVjbGFpbWVkLCBvciAwIGlmIEBzaXplIGlzIHNtYWxsZXJcbisgKiAgIHRoYW4gYSBwYWdlLCBAc3dhcHBpbmVzcyBpcyBvdXQgb2YgcmFuZ2UsIG9yIHRoZSBjYWxsaW5nIHRhc2sgaXNcbisgKiAgIGFscmVhZHkgaW4gYSByZWNsYWltL2ZyZWVpbmcgY29udGV4dCAoUEZfTUVNQUxMT0MpLlxuKyAqL1xuK19fYnBmX2tmdW5jIHVuc2lnbmVkIGxvbmdcbiticGZfcHJvYWN0aXZlX3JlY2xhaW1fc3dhcHBpbmVzcyhzdHJ1Y3QgbWVtX2Nncm91cCAqbWVtY2csIHVuc2lnbmVkIGxvbmcgc2l6ZSxcbitcdFx0XHRcdCBpbnQgc3dhcHBpbmVzcylcbit7XG4rXHRpZiAoc3dhcHBpbmVzcyBcdTAwM2MgTUlOX1NXQVBQSU5FU1MgfHwgc3dhcHBpbmVzcyBcdTAwM2UgU1dBUFBJTkVTU19BTk9OX09OTFkpXG4rXHRcdHJldHVybiAwO1xuK1xuK1x0cmV0dXJuIGJwZl9wcm9hY3RpdmVfcmVjbGFpbV9wYWdlcyhtZW1jZywgc2l6ZSAvIFBBR0VfU0laRSxcbitcdFx0XHRcdFx0ICAgXHUwMDI2c3dhcHBpbmVzcyk7XG4rfVxuK1xuIF9fYnBmX2tmdW5jX2VuZF9kZWZzKCk7XG4gXG4gQlRGX0tGVU5DU19TVEFSVChicGZfbWVtY29udHJvbF9rZnVuY3MpXG5AQCAtMTcyLDYgKzI3MCw5IEBAIEJURl9JRF9GTEFHUyhmdW5jLCBicGZfbWVtX2Nncm91cF91c2FnZSlcbiBCVEZfSURfRkxBR1MoZnVuYywgYnBmX21lbV9jZ3JvdXBfcGFnZV9zdGF0ZSlcbiBCVEZfSURfRkxBR1MoZnVuYywgYnBmX21lbV9jZ3JvdXBfZmx1c2hfc3RhdHMsIEtGX1NMRUVQQUJMRSlcbiBcbitCVEZfSURfRkxBR1MoZnVuYywgYnBmX3Byb2FjdGl2ZV9yZWNsYWltLCBLRl9TTEVFUEFCTEUpXG4rQlRGX0lEX0ZMQUdTKGZ1bmMsIGJwZl9wcm9hY3RpdmVfcmVjbGFpbV9zd2FwcGluZXNzLCBLRl9TTEVFUEFCTEUpXG4rXG4gQlRGX0tGVU5DU19FTkQoYnBmX21lbWNvbnRyb2xfa2Z1bmNzKVxuIFxuIHN0YXRpYyBjb25zdCBzdHJ1Y3QgYnRmX2tmdW5jX2lkX3NldCBicGZfbWVtY29udHJvbF9rZnVuY19zZXQgPSB7XG5kaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dfdGVzdHMvbWVtY2dfYXN5bmNfcmVjbGFpbS5jIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dfdGVzdHMvbWVtY2dfYXN5bmNfcmVjbGFpbS5jXG5uZXcgZmlsZSBtb2RlIDEwMDY0NFxuaW5kZXggMDAwMDAwMDAwMDAwMC4uZTk5MGQxZmRjNzlmZFxuLS0tIC9kZXYvbnVsbFxuKysrIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dfdGVzdHMvbWVtY2dfYXN5bmNfcmVjbGFpbS5jXG5AQCAtMCwwICsxLDQ3OSBAQFxuKy8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4wXG4rLypcbisgKiBNZW1vcnkgY29udHJvbGxlciBlQlBGIGFzeW5jIHJlY2xhaW0gdGVzdFxuKyAqL1xuK1xuKyNpbmNsdWRlIFx1MDAzY3Rlc3RfcHJvZ3MuaFx1MDAzZVxuKyNpbmNsdWRlIFx1MDAzY3N5cy9tbWFuLmhcdTAwM2VcbisjaW5jbHVkZSBcdTAwM2NzeXMvc3RhdC5oXHUwMDNlXG4rI2luY2x1ZGUgXHUwMDNjc3lzL3Zmcy5oXHUwMDNlXG4rI2luY2x1ZGUgXHUwMDNjc3lzL3dhaXQuaFx1MDAzZVxuKyNpbmNsdWRlIFx1MDAzY2ZjbnRsLmhcdTAwM2VcbisjaW5jbHVkZSBcdTAwM2NzaWduYWwuaFx1MDAzZVxuKyNpbmNsdWRlIFx1MDAzY3RpbWUuaFx1MDAzZVxuKyNpbmNsdWRlIFx1MDAzY3VuaXN0ZC5oXHUwMDNlXG4rI2luY2x1ZGUgXHUwMDNjc3RkaW8uaFx1MDAzZVxuKyNpbmNsdWRlIFx1MDAzY3N0ZGxpYi5oXHUwMDNlXG4rI2luY2x1ZGUgXHUwMDNjc3RyaW5nLmhcdTAwM2VcbisjaW5jbHVkZSBcdTAwM2NsaW1pdHMuaFx1MDAzZVxuKyNpbmNsdWRlIFx1MDAzY2xpbnV4L21hZ2ljLmhcdTAwM2VcbitcbisjaW5jbHVkZSBcImNncm91cF9oZWxwZXJzLmhcIlxuK1xuK3N0cnVjdCBicGZfYXJnc19zIHtcbitcdHU2NCBoaWdoX2Nncm91cF9pZDtcbitcdHU2NCBsb3dfY2dyb3VwX2lkO1xuK1x0dTY0IGV2ZW50X2RlbHRhX3RocmVzaG9sZDtcbitcdHU2NCBjaGVja19ucztcbit9O1xuK1xuKyNpbmNsdWRlIFwibWVtY2dfYXN5bmNfcmVjbGFpbS5za2VsLmhcIlxuK1xuKyNkZWZpbmUgRklMRV9TSVpFICgzMiAqIDEwMjQgKiAxMDI0dWwpXG4rI2RlZmluZSBCVUZGRVJfU0laRSAoNDA5NilcbisjZGVmaW5lIENHX0xJTUlUICgzMiAqIDEwMjQgKiAxMDI0dWwpXG4rI2RlZmluZSBSRUFEX1RJTUVTIDUwXG4rXG4rI2RlZmluZSBDR19ESVIgXCIvbWVtY2dfYXN5bmNfcmVjbGFpbVwiXG4rI2RlZmluZSBDR19ISUdIX0RJUiBDR19ESVIgXCIvaGlnaFwiXG4rI2RlZmluZSBDR19MT1dfRElSIENHX0RJUiBcIi9sb3dcIlxuK1xuKyNkZWZpbmUgQ0hFQ0tfUEVSSU9EX05TICgyICogMTAwMCAqIDEwMDB1bGwpXG4rI2RlZmluZSBFVkVOVF9ERUxUQV9USFJFU0hPTEQgMVxuK1xuKy8qXG4rICogVGhlIHdvcmtsb2FkIGZpbGVzIG11c3Qgc2l0IG9uIGEgcmVndWxhciBmaWxlc3lzdGVtOiB3aXRoIHN3YXBcbisgKiBkaXNhYmxlZCBmb3IgdGhlIGNncm91cCwgdG1wZnMvcmFtZnMgcGFnZXMgYXJlIHVuZXZpY3RhYmxlIGFuZCB3b3VsZFxuKyAqIE9PTSB0aGUgY2dyb3VwIGluc3RlYWQgb2YgZXhlcmNpc2luZyByZWNsYWltOyB0aGV5IGFyZSBhbHNvIGNoYXJnZWRcbisgKiBhcyBhbm9ueW1vdXMgbWVtb3J5LCBzbyB0aGV5IG5ldmVyIHJhaXNlIHRoZSBXT1JLSU5HU0VUX1JFRkFVTFRfRklMRVxuKyAqIGV2ZW50cyB0aGUgQlBGIHByb2dyYW0gbW9uaXRvcnMuIEZhbGwgYmFjayB0byB0aGUgY3VycmVudCBkaXJlY3RvcnlcbisgKiB3aGVuIC90bXAgaXMgYmFja2VkIGJ5IHN1Y2ggYSBmaWxlc3lzdGVtLlxuKyAqL1xuK3N0YXRpYyBjb25zdCBjaGFyICp3b3JrbG9hZF9maWxlc19kaXIodm9pZClcbit7XG4rXHRzdHJ1Y3Qgc3RhdGZzIHN0O1xuK1xuK1x0aWYgKCFzdGF0ZnMoXCIvdG1wXCIsIFx1MDAyNnN0KSBcdTAwMjZcdTAwMjZcbitcdCAgICAoc3QuZl90eXBlID09IFRNUEZTX01BR0lDIHx8IHN0LmZfdHlwZSA9PSBSQU1GU19NQUdJQykpXG4rXHRcdHJldHVybiBcIi5cIjtcbitcdHJldHVybiBcIi90bXBcIjtcbit9XG4rXG4rLypcbisgKiBUaGUgd29ya2xvYWQgY2hpbGRyZW4gcnVuIGFmdGVyIHRlc3RfcHJvZ3MgaGlqYWNrZWQgc3RkaW8sIHNvXG4rICogYW55dGhpbmcgdGhleSBwcmludCBpcyBsb3N0IHdpdGggdGhlaXIgcHJpdmF0ZSBjb3B5IG9mIHRoZSBoaWphY2tlZFxuKyAqIGJ1ZmZlci4gVGhlIGV4aXQgc3RhdHVzIGlzIHRoZSBvbmx5IGRpYWdub3N0aWNzIGNoYW5uZWwgdGhhdCByZWFjaGVzXG4rICogdGhlIHBhcmVudCwgc28gZWFjaCBmYWlsaW5nIHN0ZXAgZ2V0cyBpdHMgb3duIGNvZGUuXG4rICovXG4rZW51bSBjaGlsZF9leGl0X2NvZGUge1xuK1x0Q0hJTERfRVhJVF9PSyA9IDAsXG4rXHRDSElMRF9FWElUX0pPSU5fQ0dST1VQLFxuK1x0Q0hJTERfRVhJVF9XUklURV9GSUxFLFxuK1x0Q0hJTERfRVhJVF9SRUFEX0ZJTEUsXG4rXHRDSElMRF9FWElUX1RJTUVfRklMRSxcbit9O1xuK1xuK3N0YXRpYyBjb25zdCBjaGFyICpjaGlsZF9leGl0X3N0cihpbnQgY29kZSlcbit7XG4rXHRzd2l0Y2ggKGNvZGUpIHtcbitcdGNhc2UgQ0hJTERfRVhJVF9PSzpcbitcdFx0cmV0dXJuIFwic3VjY2Vzc1wiO1xuK1x0Y2FzZSBDSElMRF9FWElUX0pPSU5fQ0dST1VQOlxuK1x0XHRyZXR1cm4gXCJqb2luIGNncm91cFwiO1xuK1x0Y2FzZSBDSElMRF9FWElUX1dSSVRFX0ZJTEU6XG4rXHRcdHJldHVybiBcIndyaXRlIGRhdGEgZmlsZVwiO1xuK1x0Y2FzZSBDSElMRF9FWElUX1JFQURfRklMRTpcbitcdFx0cmV0dXJuIFwicmVhZCBkYXRhIGZpbGVcIjtcbitcdGNhc2UgQ0hJTERfRVhJVF9USU1FX0ZJTEU6XG4rXHRcdHJldHVybiBcIndyaXRlIHRpbWUgZmlsZVwiO1xuK1x0ZGVmYXVsdDpcbitcdFx0cmV0dXJuIFwidW5rbm93blwiO1xuK1x0fVxuK31cbitcbitzdGF0aWMgaW50IHNldHVwX2hpZ2hfbG93X2Nncm91cHModTY0ICpoaWdoX2Nncm91cF9pZCwgdTY0ICpsb3dfY2dyb3VwX2lkKVxuK3tcbitcdGludCByZXQ7XG4rXHRjaGFyIGxpbWl0X2J1ZlsyMF07XG4rXG4rXHRyZXQgPSBzZXR1cF9jZ3JvdXBfZW52aXJvbm1lbnQoKTtcbitcdGlmICghQVNTRVJUX09LKHJldCwgXCJzZXR1cF9jZ3JvdXBfZW52aXJvbm1lbnRcIikpXG4rXHRcdGdvdG8gY2xlYW51cDtcbitcbitcdHJldCA9IGNyZWF0ZV9hbmRfZ2V0X2Nncm91cChDR19ESVIpO1xuK1x0aWYgKCFBU1NFUlRfR0UocmV0LCAwLCBcImNyZWF0ZV9hbmRfZ2V0X2Nncm91cCBcIiBDR19ESVIpKVxuK1x0XHRnb3RvIGNsZWFudXA7XG4rXHRjbG9zZShyZXQpO1xuK1xuK1x0cmV0ID0gZW5hYmxlX2NvbnRyb2xsZXJzKENHX0RJUiwgXCJtZW1vcnlcIik7XG4rXHRpZiAoIUFTU0VSVF9PSyhyZXQsIFwiZW5hYmxlX2NvbnRyb2xsZXJzXCIpKVxuK1x0XHRnb3RvIGNsZWFudXA7XG4rXG4rXHRzbnByaW50ZihsaW1pdF9idWYsIHNpemVvZihsaW1pdF9idWYpLCBcIiVsdVwiLCBDR19MSU1JVCk7XG4rXHRyZXQgPSB3cml0ZV9jZ3JvdXBfZmlsZShDR19ESVIsIFwibWVtb3J5Lm1heFwiLCBsaW1pdF9idWYpO1xuK1x0aWYgKCFBU1NFUlRfT0socmV0LCBcIndyaXRlX2Nncm91cF9maWxlIG1lbW9yeS5tYXhcIikpXG4rXHRcdGdvdG8gY2xlYW51cDtcbitcbitcdC8qXG4rXHQgKiBLZWVwIHRoZSB3b3JrbG9hZHMgZnJvbSBzd2FwcGluZyBvdXQuIFdpdGggQ09ORklHX1NXQVA9biB0aGVcbitcdCAqIG1lbW9yeS5zd2FwLm1heCBmaWxlIGRvZXMgbm90IGV4aXN0LCBhbmQgbm8gc3dhcCBjYW4gaGFwcGVuXG4rXHQgKiBhbnl3YXksIHNvIHNraXAgdGhlIHdyaXRlLlxuK1x0ICovXG4rXHRpZiAoIWFjY2VzcyhcIi9wcm9jL3N3YXBzXCIsIEZfT0spKSB7XG4rXHRcdHJldCA9IHdyaXRlX2Nncm91cF9maWxlKENHX0RJUiwgXCJtZW1vcnkuc3dhcC5tYXhcIiwgXCIwXCIpO1xuK1x0XHRpZiAoIUFTU0VSVF9PSyhyZXQsIFwid3JpdGVfY2dyb3VwX2ZpbGUgbWVtb3J5LnN3YXAubWF4XCIpKVxuK1x0XHRcdGdvdG8gY2xlYW51cDtcbitcdH1cbitcbitcdHJldCA9IGNyZWF0ZV9hbmRfZ2V0X2Nncm91cChDR19ISUdIX0RJUik7XG4rXHRpZiAoIUFTU0VSVF9HRShyZXQsIDAsIFwiY3JlYXRlX2FuZF9nZXRfY2dyb3VwIFwiIENHX0hJR0hfRElSKSlcbitcdFx0Z290byBjbGVhbnVwO1xuK1x0Y2xvc2UocmV0KTtcbitcbitcdCpoaWdoX2Nncm91cF9pZCA9IGdldF9jZ3JvdXBfaWQoQ0dfSElHSF9ESVIpO1xuK1x0aWYgKCFBU1NFUlRfR1QoKmhpZ2hfY2dyb3VwX2lkLCAwLCBcImdldF9jZ3JvdXBfaWRcIikpXG4rXHRcdGdvdG8gY2xlYW51cDtcbitcbitcdHJldCA9IGNyZWF0ZV9hbmRfZ2V0X2Nncm91cChDR19MT1dfRElSKTtcbitcdGlmICghQVNTRVJUX0dFKHJldCwgMCwgXCJjcmVhdGVfYW5kX2dldF9jZ3JvdXAgXCIgQ0dfTE9XX0RJUikpXG4rXHRcdGdvdG8gY2xlYW51cDtcbitcdGNsb3NlKHJldCk7XG4rXG4rXHQqbG93X2Nncm91cF9pZCA9IGdldF9jZ3JvdXBfaWQoQ0dfTE9XX0RJUik7XG4rXHRpZiAoIUFTU0VSVF9HVCgqbG93X2Nncm91cF9pZCwgMCwgXCJnZXRfY2dyb3VwX2lkXCIpKVxuK1x0XHRnb3RvIGNsZWFudXA7XG4rXG4rXHRyZXR1cm4gMDtcbitcbitjbGVhbnVwOlxuK1x0Y2xlYW51cF9jZ3JvdXBfZW52aXJvbm1lbnQoKTtcbitcdHJldHVybiAtMTtcbit9XG4rXG4rc3RhdGljIGludCB3cml0ZV9maWxlKGNvbnN0IGNoYXIgKmZpbGVuYW1lKVxuK3tcbitcdGludCByZXQgPSAtMTtcbitcdHNpemVfdCB3cml0dGVuID0gMDtcbitcdGNoYXIgKmJ1ZmZlcjtcbitcdEZJTEUgKmZwO1xuK1xuK1x0ZnAgPSBmb3BlbihmaWxlbmFtZSwgXCJ3YlwiKTtcbitcdGlmICghZnApXG4rXHRcdGdvdG8gb3V0O1xuK1xuK1x0YnVmZmVyID0gbWFsbG9jKEJVRkZFUl9TSVpFKTtcbitcdGlmICghYnVmZmVyKVxuK1x0XHRnb3RvIGNsZWFudXBfZnA7XG4rXG4rXHRtZW1zZXQoYnVmZmVyLCAnQScsIEJVRkZFUl9TSVpFKTtcbitcbitcdHdoaWxlICh3cml0dGVuIFx1MDAzYyBGSUxFX1NJWkUpIHtcbitcdFx0c2l6ZV90IHRvX3dyaXRlID0gRklMRV9TSVpFIC0gd3JpdHRlbiBcdTAwM2MgQlVGRkVSX1NJWkUgP1xuK1x0XHRcdFx0ICBGSUxFX1NJWkUgLSB3cml0dGVuIDogQlVGRkVSX1NJWkU7XG4rXG4rXHRcdGlmIChmd3JpdGUoYnVmZmVyLCAxLCB0b193cml0ZSwgZnApICE9IHRvX3dyaXRlKVxuK1x0XHRcdGdvdG8gY2xlYW51cDtcbitcdFx0d3JpdHRlbiArPSB0b193cml0ZTtcbitcdH1cbitcbitcdHJldCA9IDA7XG4rY2xlYW51cDpcbitcdGZyZWUoYnVmZmVyKTtcbitjbGVhbnVwX2ZwOlxuK1x0ZmNsb3NlKGZwKTtcbitvdXQ6XG4rXHRyZXR1cm4gcmV0O1xuK31cbitcbitzdGF0aWMgaW50IHJlYWRfZmlsZShjb25zdCBjaGFyICpmaWxlbmFtZSwgaW50IGl0ZXJhdGlvbnMpXG4re1xuK1x0aW50IHJldCA9IC0xO1xuK1x0bG9uZyBwYWdlX3NpemUgPSBzeXNjb25mKF9TQ19QQUdFU0laRSk7XG4rXHRjaGFyICptYXA7XG4rXHRzaXplX3QgaTtcbitcdGludCBmZDtcbitcdHN0cnVjdCBzdGF0IHNiO1xuK1xuK1x0ZmQgPSBvcGVuKGZpbGVuYW1lLCBPX1JET05MWSk7XG4rXHRpZiAoZmQgPT0gLTEpXG4rXHRcdGdvdG8gb3V0O1xuK1xuK1x0aWYgKGZzdGF0KGZkLCBcdTAwMjZzYikgPT0gLTEpXG4rXHRcdGdvdG8gY2xlYW51cF9mZDtcbitcbitcdGlmIChzYi5zdF9zaXplICE9IEZJTEVfU0laRSkge1xuK1x0XHRmcHJpbnRmKHN0ZGVyciwgXCJGaWxlIHNpemUgbWlzbWF0Y2g6IGV4cGVjdGVkICVsdSwgZ290ICVsdVxcblwiLFxuK1x0XHRcdCh1bnNpZ25lZCBsb25nKUZJTEVfU0laRSwgKHVuc2lnbmVkIGxvbmcpc2Iuc3Rfc2l6ZSk7XG4rXHRcdGdvdG8gY2xlYW51cF9mZDtcbitcdH1cbitcbitcdG1hcCA9IG1tYXAoTlVMTCwgRklMRV9TSVpFLCBQUk9UX1JFQUQsIE1BUF9QUklWQVRFLCBmZCwgMCk7XG4rXHRpZiAobWFwID09IE1BUF9GQUlMRUQpXG4rXHRcdGdvdG8gY2xlYW51cF9mZDtcbitcbitcdGZvciAoaW50IGl0ZXIgPSAwOyBpdGVyIFx1MDAzYyBpdGVyYXRpb25zOyBpdGVyKyspIHtcbitcdFx0Zm9yIChpID0gMDsgaSBcdTAwM2MgRklMRV9TSVpFOyBpICs9IHBhZ2Vfc2l6ZSkge1xuK1x0XHRcdC8qIGFjY2VzcyBhIGJ5dGUgdG8gdHJpZ2dlciBwYWdlIGZhdWx0ICovXG4rXHRcdFx0dm9sYXRpbGUgY2hhciB2ID0gbWFwW2ldO1xuK1x0XHRcdCh2b2lkKXY7XG4rXHRcdH1cbitcdH1cbitcbitcdGlmIChtdW5tYXAobWFwLCBGSUxFX1NJWkUpID09IC0xKVxuK1x0XHRnb3RvIGNsZWFudXBfZmQ7XG4rXG4rXHRyZXQgPSAwO1xuK1xuK2NsZWFudXBfZmQ6XG4rXHRjbG9zZShmZCk7XG4rb3V0OlxuK1x0cmV0dXJuIHJldDtcbit9XG4rXG4rc3RhdGljIGludCByZWFsX3Rlc3RfY2hpbGRfd29yayhjb25zdCBjaGFyICpjZ3JvdXBfcGF0aCwgY2hhciAqZGF0YV9maWxlbmFtZSxcbitcdFx0XHRcdGNoYXIgKnRpbWVfZmlsZW5hbWUsIGludCByZWFkX3RpbWVzKVxuK3tcbitcdHN0cnVjdCB0aW1lc3BlYyBzdGFydCwgZW5kO1xuK1x0ZG91YmxlIGVsYXBzZWQ7XG4rXHRGSUxFICpmcDtcbitcbitcdGlmIChqb2luX3BhcmVudF9jZ3JvdXAoY2dyb3VwX3BhdGgpKVxuK1x0XHRyZXR1cm4gQ0hJTERfRVhJVF9KT0lOX0NHUk9VUDtcbitcbitcdGNsb2NrX2dldHRpbWUoQ0xPQ0tfTU9OT1RPTklDLCBcdTAwMjZzdGFydCk7XG4rXG4rXHRpZiAod3JpdGVfZmlsZShkYXRhX2ZpbGVuYW1lKSlcbitcdFx0cmV0dXJuIENISUxEX0VYSVRfV1JJVEVfRklMRTtcbitcbitcdGlmIChyZWFkX2ZpbGUoZGF0YV9maWxlbmFtZSwgcmVhZF90aW1lcykpXG4rXHRcdHJldHVybiBDSElMRF9FWElUX1JFQURfRklMRTtcbitcbitcdGNsb2NrX2dldHRpbWUoQ0xPQ0tfTU9OT1RPTklDLCBcdTAwMjZlbmQpO1xuK1xuK1x0aWYgKCF0aW1lX2ZpbGVuYW1lKVxuK1x0XHRyZXR1cm4gQ0hJTERfRVhJVF9PSztcbitcbitcdGVsYXBzZWQgPSAoZW5kLnR2X3NlYyAtIHN0YXJ0LnR2X3NlYykgK1xuK1x0XHQgIChlbmQudHZfbnNlYyAtIHN0YXJ0LnR2X25zZWMpIC8gMTAwMDAwMDAwMC4wO1xuK1x0cHJpbnRmKFwiJS42ZlxcblwiLCBlbGFwc2VkKTtcbitcbitcdGZwID0gZm9wZW4odGltZV9maWxlbmFtZSwgXCJ3XCIpO1xuK1x0aWYgKCFmcClcbitcdFx0cmV0dXJuIENISUxEX0VYSVRfVElNRV9GSUxFO1xuK1x0ZnByaW50ZihmcCwgXCIlLjZmXCIsIGVsYXBzZWQpO1xuK1x0ZmNsb3NlKGZwKTtcbitcbitcdHJldHVybiBDSElMRF9FWElUX09LO1xuK31cbitcbitzdGF0aWMgaW50IGdldF90aW1lKGNoYXIgKnRpbWVfZmlsZW5hbWUsIGRvdWJsZSAqdGltZSlcbit7XG4rXHRpbnQgcmV0ID0gLTE7XG4rXHRGSUxFICpmcDtcbitcdGNoYXIgYnVmWzY0XTtcbitcbitcdGZwID0gZm9wZW4odGltZV9maWxlbmFtZSwgXCJyXCIpO1xuK1x0aWYgKCFBU1NFUlRfT0tfUFRSKGZwLCBcImZvcGVuXCIpKVxuK1x0XHRnb3RvIG91dDtcbitcbitcdGlmICghQVNTRVJUX09LX1BUUihmZ2V0cyhidWYsIHNpemVvZihidWYpLCBmcCksIFwiZmdldHNcIikpXG4rXHRcdGdvdG8gY2xlYW51cDtcbitcbitcdGlmIChzc2NhbmYoYnVmLCBcIiVsZlwiLCB0aW1lKSAhPSAxKSB7XG4rXHRcdFBSSU5UX0ZBSUwoXCJzc2NhbmYgJXNcIiwgYnVmKTtcbitcdFx0Z290byBjbGVhbnVwO1xuK1x0fVxuK1xuK1x0cmV0ID0gMDtcbitjbGVhbnVwOlxuK1x0ZmNsb3NlKGZwKTtcbitvdXQ6XG4rXHRyZXR1cm4gcmV0O1xuK31cbitcbitzdGF0aWMgaW50XG4rcnVuX2hpZ2hfbG93X3dvcmtsb2FkKGRvdWJsZSAqaGlnaF9lbGFwc2VkLCBkb3VibGUgKmxvd19lbGFwc2VkLCBpbnQgcmVhZF90aW1lcylcbit7XG4rXHRjaGFyIGhpZ2hfZGF0YV9maWxlW1BBVEhfTUFYXTtcbitcdGNoYXIgbG93X2RhdGFfZmlsZVtQQVRIX01BWF07XG4rXHRjaGFyIGhpZ2hfdGltZV9maWxlW1BBVEhfTUFYXTtcbitcdGNoYXIgbG93X3RpbWVfZmlsZVtQQVRIX01BWF07XG4rXHRjb25zdCBjaGFyICpkaXIgPSB3b3JrbG9hZF9maWxlc19kaXIoKTtcbitcdHBpZF90IGhpZ2hfcGlkID0gLTEsIGxvd19waWQgPSAtMTtcbitcdGludCBmZCwgc3RhdHVzO1xuK1x0aW50IHJldCA9IC0xO1xuK1xuK1x0c25wcmludGYoaGlnaF9kYXRhX2ZpbGUsIHNpemVvZihoaWdoX2RhdGFfZmlsZSksXG4rXHRcdCBcIiVzL21lbWNnX2FzeW5jX2hpZ2hfZGF0YV9YWFhYWFhcIiwgZGlyKTtcbitcdHNucHJpbnRmKGxvd19kYXRhX2ZpbGUsIHNpemVvZihsb3dfZGF0YV9maWxlKSxcbitcdFx0IFwiJXMvbWVtY2dfYXN5bmNfbG93X2RhdGFfWFhYWFhYXCIsIGRpcik7XG4rXHRzbnByaW50ZihoaWdoX3RpbWVfZmlsZSwgc2l6ZW9mKGhpZ2hfdGltZV9maWxlKSxcbitcdFx0IFwiJXMvbWVtY2dfYXN5bmNfaGlnaF90aW1lX1hYWFhYWFwiLCBkaXIpO1xuK1x0c25wcmludGYobG93X3RpbWVfZmlsZSwgc2l6ZW9mKGxvd190aW1lX2ZpbGUpLFxuK1x0XHQgXCIlcy9tZW1jZ19hc3luY19sb3dfdGltZV9YWFhYWFhcIiwgZGlyKTtcbitcbitcdGZkID0gbWtzdGVtcChoaWdoX2RhdGFfZmlsZSk7XG4rXHRpZiAoIUFTU0VSVF9HRShmZCwgMCwgXCJta3N0ZW1wXCIpKVxuK1x0XHRnb3RvIGNsZWFudXA7XG4rXHRjbG9zZShmZCk7XG4rXG4rXHRmZCA9IG1rc3RlbXAobG93X2RhdGFfZmlsZSk7XG4rXHRpZiAoIUFTU0VSVF9HRShmZCwgMCwgXCJta3N0ZW1wXCIpKVxuK1x0XHRnb3RvIGNsZWFudXA7XG4rXHRjbG9zZShmZCk7XG4rXG4rXHRmZCA9IG1rc3RlbXAoaGlnaF90aW1lX2ZpbGUpO1xuK1x0aWYgKCFBU1NFUlRfR0UoZmQsIDAsIFwibWtzdGVtcFwiKSlcbitcdFx0Z290byBjbGVhbnVwO1xuK1x0Y2xvc2UoZmQpO1xuK1xuK1x0ZmQgPSBta3N0ZW1wKGxvd190aW1lX2ZpbGUpO1xuK1x0aWYgKCFBU1NFUlRfR0UoZmQsIDAsIFwibWtzdGVtcFwiKSlcbitcdFx0Z290byBjbGVhbnVwO1xuK1x0Y2xvc2UoZmQpO1xuK1xuK1x0bG93X3BpZCA9IGZvcmsoKTtcbitcdGlmICghQVNTRVJUX0dFKGxvd19waWQsIDAsIFwiZm9yayBsb3dcIikpXG4rXHRcdGdvdG8gY2xlYW51cDtcbitcdGlmIChsb3dfcGlkID09IDApXG4rXHRcdGV4aXQocmVhbF90ZXN0X2NoaWxkX3dvcmsoQ0dfTE9XX0RJUiwgbG93X2RhdGFfZmlsZSxcbitcdFx0XHRcdFx0ICBsb3dfdGltZV9maWxlLCByZWFkX3RpbWVzKSk7XG4rXG4rXHRoaWdoX3BpZCA9IGZvcmsoKTtcbitcdGlmICghQVNTRVJUX0dFKGhpZ2hfcGlkLCAwLCBcImZvcmsgaGlnaFwiKSlcbitcdFx0Z290byBjbGVhbnVwO1xuK1x0aWYgKGhpZ2hfcGlkID09IDApXG4rXHRcdGV4aXQocmVhbF90ZXN0X2NoaWxkX3dvcmsoQ0dfSElHSF9ESVIsIGhpZ2hfZGF0YV9maWxlLFxuK1x0XHRcdFx0XHQgIGhpZ2hfdGltZV9maWxlLCByZWFkX3RpbWVzKSk7XG4rXG4rXHRsb3dfcGlkID0gd2FpdHBpZChsb3dfcGlkLCBcdTAwMjZzdGF0dXMsIDApO1xuK1x0aWYgKCFBU1NFUlRfR1QobG93X3BpZCwgMCwgXCJsb3cgd2FpdHBpZFwiKSlcbitcdFx0Z290byBjbGVhbnVwO1xuK1x0LypcbitcdCAqIFRoZSBjaGlsZCBoYXMgYmVlbiByZWFwZWQgYW5kIGl0cyBQSUQgY2FuIGFscmVhZHkgYmUgcmV1c2VkLFxuK1x0ICogc28gbWFyayBpdCB0byBrZWVwIGNsZWFudXAgZnJvbSBzaWduYWxpbmcgYW4gdW5yZWxhdGVkIHByb2Nlc3MuXG4rXHQgKi9cbitcdGxvd19waWQgPSAtMTtcbitcdGlmICghQVNTRVJUX1RSVUUoV0lGRVhJVEVEKHN0YXR1cyksIFwibG93IGV4aXRlZFwiKSlcbitcdFx0Z290byBjbGVhbnVwO1xuK1x0aWYgKFdFWElUU1RBVFVTKHN0YXR1cykgIT0gQ0hJTERfRVhJVF9PSykge1xuK1x0XHRQUklOVF9GQUlMKFwibG93IGNoaWxkIGZhaWxlZCBhdDogJXMgKGV4aXQgc3RhdHVzICVkKVwiLFxuK1x0XHRcdCAgIGNoaWxkX2V4aXRfc3RyKFdFWElUU1RBVFVTKHN0YXR1cykpLFxuK1x0XHRcdCAgIFdFWElUU1RBVFVTKHN0YXR1cykpO1xuK1x0XHRnb3RvIGNsZWFudXA7XG4rXHR9XG4rXG4rXHRoaWdoX3BpZCA9IHdhaXRwaWQoaGlnaF9waWQsIFx1MDAyNnN0YXR1cywgMCk7XG4rXHRpZiAoIUFTU0VSVF9HVChoaWdoX3BpZCwgMCwgXCJoaWdoIHdhaXRwaWRcIikpXG4rXHRcdGdvdG8gY2xlYW51cDtcbitcdC8qIFNhbWUgYXMgYWJvdmU6IHRoZSByZWFwZWQgUElEIG11c3Qgbm90IGJlIHNpZ25hbGVkIGFnYWluLiAqL1xuK1x0aGlnaF9waWQgPSAtMTtcbitcdGlmICghQVNTRVJUX1RSVUUoV0lGRVhJVEVEKHN0YXR1cyksIFwiaGlnaCBleGl0ZWRcIikpXG4rXHRcdGdvdG8gY2xlYW51cDtcbitcdGlmIChXRVhJVFNUQVRVUyhzdGF0dXMpICE9IENISUxEX0VYSVRfT0spIHtcbitcdFx0UFJJTlRfRkFJTChcImhpZ2ggY2hpbGQgZmFpbGVkIGF0OiAlcyAoZXhpdCBzdGF0dXMgJWQpXCIsXG4rXHRcdFx0ICAgY2hpbGRfZXhpdF9zdHIoV0VYSVRTVEFUVVMoc3RhdHVzKSksXG4rXHRcdFx0ICAgV0VYSVRTVEFUVVMoc3RhdHVzKSk7XG4rXHRcdGdvdG8gY2xlYW51cDtcbitcdH1cbitcbitcdGlmIChnZXRfdGltZShoaWdoX3RpbWVfZmlsZSwgaGlnaF9lbGFwc2VkKSlcbitcdFx0Z290byBjbGVhbnVwO1xuK1x0aWYgKGdldF90aW1lKGxvd190aW1lX2ZpbGUsIGxvd19lbGFwc2VkKSlcbitcdFx0Z290byBjbGVhbnVwO1xuK1xuK1x0cmV0ID0gMDtcbitcbitjbGVhbnVwOlxuK1x0LyogT24gZmFpbHVyZSwgbWFrZSBzdXJlIG5vIGNoaWxkIHByb2Nlc3MgaXMgbGVmdCBiZWhpbmQgKi9cbitcdGlmIChyZXQpIHtcbitcdFx0aWYgKGhpZ2hfcGlkIFx1MDAzZSAwKSB7XG4rXHRcdFx0a2lsbChoaWdoX3BpZCwgU0lHS0lMTCk7XG4rXHRcdFx0KHZvaWQpd2FpdHBpZChoaWdoX3BpZCwgTlVMTCwgMCk7XG4rXHRcdH1cbitcdFx0aWYgKGxvd19waWQgXHUwMDNlIDApIHtcbitcdFx0XHRraWxsKGxvd19waWQsIFNJR0tJTEwpO1xuK1x0XHRcdCh2b2lkKXdhaXRwaWQobG93X3BpZCwgTlVMTCwgMCk7XG4rXHRcdH1cbitcdH1cbitcdHVubGluayhsb3dfdGltZV9maWxlKTtcbitcdHVubGluayhoaWdoX3RpbWVfZmlsZSk7XG4rXHR1bmxpbmsobG93X2RhdGFfZmlsZSk7XG4rXHR1bmxpbmsoaGlnaF9kYXRhX2ZpbGUpO1xuK1x0cmV0dXJuIHJldDtcbit9XG4rXG4rc3RhdGljIGludFxuK3NldHVwX2JwZih1NjQgaGlnaF9jZ3JvdXBfaWQsIHU2NCBsb3dfY2dyb3VwX2lkLFxuK1x0ICBzdHJ1Y3QgbWVtY2dfYXN5bmNfcmVjbGFpbSAqKnNrZWxfcHRyKVxuK3tcbitcdHN0cnVjdCBtZW1jZ19hc3luY19yZWNsYWltICpza2VsO1xuK1x0c3RydWN0IGJwZl9hcmdzX3MgYnBmX2FyZ3MgPSB7XG4rXHRcdC5oaWdoX2Nncm91cF9pZCA9IGhpZ2hfY2dyb3VwX2lkLFxuK1x0XHQubG93X2Nncm91cF9pZCA9IGxvd19jZ3JvdXBfaWQsXG4rXHRcdC5ldmVudF9kZWx0YV90aHJlc2hvbGQgPSBFVkVOVF9ERUxUQV9USFJFU0hPTEQsXG4rXHRcdC5jaGVja19ucyA9IENIRUNLX1BFUklPRF9OUyxcbitcdH07XG4rXHRMSUJCUEZfT1BUUyhicGZfdGVzdF9ydW5fb3B0cywgcnVuX29wdHMsXG4rXHRcdC5jdHhfaW4gPSBcdTAwMjZicGZfYXJncyxcbitcdFx0LmN0eF9zaXplX2luID0gc2l6ZW9mKGJwZl9hcmdzKSk7XG4rXHRpbnQgcHJvZ19pbml0X2ZkLCBlcnI7XG4rXG4rXHRza2VsID0gbWVtY2dfYXN5bmNfcmVjbGFpbV9fb3Blbl9hbmRfbG9hZCgpO1xuK1x0aWYgKCFBU1NFUlRfT0tfUFRSKHNrZWwsIFwibWVtY2dfYXN5bmNfcmVjbGFpbV9fb3Blbl9hbmRfbG9hZFwiKSlcbitcdFx0cmV0dXJuIC0xO1xuK1xuK1x0cHJvZ19pbml0X2ZkID0gYnBmX3Byb2dyYW1fX2ZkKHNrZWwtXHUwMDNlcHJvZ3Mud3FfcHJvZ19pbml0KTtcbitcbitcdGVyciA9IGJwZl9wcm9nX3Rlc3RfcnVuX29wdHMocHJvZ19pbml0X2ZkLCBcdTAwMjZydW5fb3B0cyk7XG4rXHRpZiAoIUFTU0VSVF9PSyhlcnIsIFwiYnBmX3Byb2dfdGVzdF9ydW5fb3B0c1wiKSlcbitcdFx0Z290byBlcnJvcl9vdXQ7XG4rXHRpZiAoIUFTU0VSVF9FUShydW5fb3B0cy5yZXR2YWwsIDAsIFwicHJvZ19pbml0IHJldHZhbFwiKSlcbitcdFx0Z290byBlcnJvcl9vdXQ7XG4rXG4rXHQqc2tlbF9wdHIgPSBza2VsO1xuK1x0cmV0dXJuIDA7XG4rXG4rZXJyb3Jfb3V0OlxuK1x0bWVtY2dfYXN5bmNfcmVjbGFpbV9fZGVzdHJveShza2VsKTtcbitcdHJldHVybiAtMTtcbit9XG4rXG4rdm9pZCB0ZXN0X21lbWNnX3dxX2FzeW5jX3JlY2xhaW0odm9pZClcbit7XG4rXHR1NjQgaGlnaF9jZ3JvdXBfaWQsIGxvd19jZ3JvdXBfaWQ7XG4rXHRpbnQgZXJyO1xuK1x0ZG91YmxlIGhpZ2hfdGltZSA9IDAuMCwgbG93X3RpbWUgPSAwLjA7XG4rXHRzdHJ1Y3QgbWVtY2dfYXN5bmNfcmVjbGFpbSAqc2tlbCA9IE5VTEw7XG4rXG4rXHRlcnIgPSBzZXR1cF9oaWdoX2xvd19jZ3JvdXBzKFx1MDAyNmhpZ2hfY2dyb3VwX2lkLCBcdTAwMjZsb3dfY2dyb3VwX2lkKTtcbitcdGlmICghQVNTRVJUX09LKGVyciwgXCJzZXR1cF9oaWdoX2xvd19jZ3JvdXBzIHJlY2xhaW1cIikpXG4rXHRcdHJldHVybjtcbitcbitcdGVyciA9IHNldHVwX2JwZihoaWdoX2Nncm91cF9pZCwgbG93X2Nncm91cF9pZCwgXHUwMDI2c2tlbCk7XG4rXHRpZiAoIUFTU0VSVF9PSyhlcnIsIFwic2V0dXBfYnBmXCIpKVxuK1x0XHRnb3RvIG91dDtcbitcbitcdGVyciA9IHJ1bl9oaWdoX2xvd193b3JrbG9hZChcdTAwMjZoaWdoX3RpbWUsIFx1MDAyNmxvd190aW1lLCBSRUFEX1RJTUVTKTtcbitcdGlmICghQVNTRVJUX09LKGVyciwgXCJydW5faGlnaF9sb3dfd29ya2xvYWQgcmVjbGFpbVwiKSlcbitcdFx0Z290byBvdXQ7XG4rXG4rXHQvKlxuK1x0ICogVGhlIHRpbWluZyBjb21wYXJpc29uIGJlbG93IGFsb25lIGNhbm5vdCBkaXN0aW5ndWlzaCBhIHdvcmtpbmdcbitcdCAqIHJlY2xhaW0gZnJvbSBhIG5vLW9wIG9uZSwgc28gcmVxdWlyZSB0aGF0IHRoZSBCUEYgcHJvZ3JhbVxuK1x0ICogYWN0dWFsbHkgcmVjbGFpbWVkIHBhZ2VzIGZyb20gdGhlIGxvdyBjZ3JvdXAuXG4rXHQgKi9cbitcdGlmICghQVNTRVJUX0dUKHNrZWwtXHUwMDNlYnNzLVx1MDAzZXJlY2xhaW1fY2FsbHMsIDAsIFwicmVjbGFpbV9jYWxsc1wiKSlcbitcdFx0Z290byBvdXQ7XG4rXHRpZiAoIUFTU0VSVF9HVChza2VsLVx1MDAzZWJzcy1cdTAwM2VyZWNsYWltZWRfcGFnZXMsIDAsIFwicmVjbGFpbWVkX3BhZ2VzXCIpKVxuK1x0XHRnb3RvIG91dDtcbitcbitcdGlmIChoaWdoX3RpbWUgXHUwMDNlPSBsb3dfdGltZSlcbitcdFx0UFJJTlRfRkFJTChcImhpZ2ggY2dyb3VwIG5vdCBpbXByb3ZlZCB3aXRoIGFzeW5jIHJlY2xhaW06IGhpZ2hfdGltZT0lZiBsb3dfdGltZT0lZlwiLFxuK1x0XHRcdCAgIGhpZ2hfdGltZSwgbG93X3RpbWUpO1xuK1xuK291dDpcbitcdGlmIChza2VsKVxuK1x0XHRtZW1jZ19hc3luY19yZWNsYWltX19kZXN0cm95KHNrZWwpO1xuK1x0Y2xlYW51cF9jZ3JvdXBfZW52aXJvbm1lbnQoKTtcbit9XG5kaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dzL21lbWNnX2FzeW5jX3JlY2xhaW0uYyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9wcm9ncy9tZW1jZ19hc3luY19yZWNsYWltLmNcbm5ldyBmaWxlIG1vZGUgMTAwNjQ0XG5pbmRleCAwMDAwMDAwMDAwMDAwLi4yMjVmMGJjNjY3MTEzXG4tLS0gL2Rldi9udWxsXG4rKysgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ3MvbWVtY2dfYXN5bmNfcmVjbGFpbS5jXG5AQCAtMCwwICsxLDE4MCBAQFxuKy8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4wXG4rXG4rI2luY2x1ZGUgXCJ2bWxpbnV4LmhcIlxuKyNpbmNsdWRlIFwiYnBmX2V4cGVyaW1lbnRhbC5oXCJcbisjaW5jbHVkZSBcdTAwM2NicGYvYnBmX2hlbHBlcnMuaFx1MDAzZVxuKyNpbmNsdWRlIFx1MDAzY2JwZi9icGZfdHJhY2luZy5oXHUwMDNlXG4rI2luY2x1ZGUgXHUwMDNjYnBmL2JwZl9jb3JlX3JlYWQuaFx1MDAzZVxuK1xuKyNkZWZpbmUgQ0xPQ0tfTU9OT1RPTklDX0lEXHQxXG4rI2RlZmluZSBQQUdFX1NJWkVcdFx0NDA5NlVMXG4rI2RlZmluZSBSRUNMQUlNX1NJWkVcdFx0KDMyICogUEFHRV9TSVpFKVxuKyNkZWZpbmUgUkVDTEFJTV9NQVhfSVRFUlx0MzJcbitcbitzdHJ1Y3QgYnBmX2FyZ3NfcyB7XG4rXHR1NjQgaGlnaF9jZ3JvdXBfaWQ7XG4rXHR1NjQgbG93X2Nncm91cF9pZDtcbitcdHU2NCBldmVudF9kZWx0YV90aHJlc2hvbGQ7XG4rXHR1NjQgY2hlY2tfbnM7XG4rfTtcbitcbitzdHJ1Y3QgY2dyb3VwX21lbWNnIHtcbitcdHN0cnVjdCBjZ3JvdXAgKmNncnA7XG4rXHRzdHJ1Y3QgbWVtX2Nncm91cCAqbWVtY2c7XG4rfTtcbitcbitzdGF0aWMgdTY0IHdxX2hpZ2hfY2dyb3VwX2lkO1xuK3N0YXRpYyB1NjQgd3FfbG93X2Nncm91cF9pZDtcbitcbisvKiBTdGF0aXN0aWNzIGV4cG9zZWQgdG8gdXNlcnNwYWNlIHRocm91Z2ggLmJzcywgc28gdGhlIHRlc3QgY2FuIHZlcmlmeVxuKyAqIHRoYXQgcmVjbGFpbSBhY3R1YWxseSBoYXBwZW5lZCBpbnN0ZWFkIG9mIHJlbHlpbmcgb24gdGltaW5nIGFsb25lLlxuKyAqL1xuK3U2NCByZWNsYWltX2NhbGxzO1xuK3U2NCByZWNsYWltZWRfcGFnZXM7XG4rXG4rc3RhdGljIGludCBnZXRfY2dyb3VwX21lbWNnX2Zyb21faWQodTY0IGNncm91cF9pZCwgc3RydWN0IGNncm91cF9tZW1jZyAqY20pXG4re1xuK1x0Y20tXHUwMDNlY2dycCA9IGJwZl9jZ3JvdXBfZnJvbV9pZChjZ3JvdXBfaWQpO1xuK1x0aWYgKCFjbS1cdTAwM2VjZ3JwKVxuK1x0XHRyZXR1cm4gLTE7XG4rXG4rXHRjbS1cdTAwM2VtZW1jZyA9IGJwZl9nZXRfbWVtX2Nncm91cChcdTAwMjZjbS1cdTAwM2VjZ3JwLVx1MDAzZXNlbGYpO1xuK1x0aWYgKCFjbS1cdTAwM2VtZW1jZykge1xuK1x0XHRicGZfY2dyb3VwX3JlbGVhc2UoY20tXHUwMDNlY2dycCk7XG4rXHRcdHJldHVybiAtMTtcbitcdH1cbitcbitcdHJldHVybiAwO1xuK31cbitcbitzdGF0aWMgdm9pZCBwdXRfY2dyb3VwX21lbWNnKHN0cnVjdCBjZ3JvdXBfbWVtY2cgKmNtKVxuK3tcbitcdGJwZl9wdXRfbWVtX2Nncm91cChjbS1cdTAwM2VtZW1jZyk7XG4rXHRicGZfY2dyb3VwX3JlbGVhc2UoY20tXHUwMDNlY2dycCk7XG4rfVxuK1xuK3N0YXRpYyBpbnQgZ2V0X2Nncm91cF9ldmVudCh1NjQgY2dyb3VwX2lkLCB1NjQgKnZhbClcbit7XG4rXHRzdHJ1Y3QgY2dyb3VwX21lbWNnIGNtO1xuK1xuK1x0aWYgKGdldF9jZ3JvdXBfbWVtY2dfZnJvbV9pZChjZ3JvdXBfaWQsIFx1MDAyNmNtKSlcbitcdFx0cmV0dXJuIC0xO1xuK1x0YnBmX21lbV9jZ3JvdXBfZmx1c2hfc3RhdHMoY20ubWVtY2cpO1xuK1x0KnZhbCA9IGJwZl9tZW1fY2dyb3VwX3BhZ2Vfc3RhdGUoY20ubWVtY2csXG4rXHRcdGJwZl9jb3JlX2VudW1fdmFsdWUoZW51bSBub2RlX3N0YXRfaXRlbSxcbitcdFx0XHRcdCAgICBXT1JLSU5HU0VUX1JFRkFVTFRfRklMRSkpO1xuK1x0cHV0X2Nncm91cF9tZW1jZyhcdTAwMjZjbSk7XG4rXG4rXHRyZXR1cm4gMDtcbit9XG4rXG4rc3RhdGljIGJvb2xcbitzaG91bGRfcmVjbGFpbV9jZ3JvdXAodTY0IGNncm91cF9pZCwgdTY0ICpwcmV2X2V2ZW50LCB1NjQgZXZlbnRfZGVsdGFfdGhyZXNob2xkKVxuK3tcbitcdHU2NCBjdXIsIGRlbHRhO1xuK1xuK1x0aWYgKGdldF9jZ3JvdXBfZXZlbnQoY2dyb3VwX2lkLCBcdTAwMjZjdXIpKVxuK1x0XHRyZXR1cm4gZmFsc2U7XG4rXG4rXHRkZWx0YSA9IGN1ciAtICpwcmV2X2V2ZW50O1xuK1x0KnByZXZfZXZlbnQgPSBjdXI7XG4rXG4rXHRyZXR1cm4gZGVsdGEgXHUwMDNlPSBldmVudF9kZWx0YV90aHJlc2hvbGQ7XG4rfVxuK1xuK3N0YXRpYyBpbnQgcmVjbGFpbV9jZ3JvdXAodTY0IGNncm91cF9pZClcbit7XG4rXHRzdHJ1Y3QgY2dyb3VwX21lbWNnIGNtO1xuK1x0aW50IGk7XG4rXG4rXHRpZiAoZ2V0X2Nncm91cF9tZW1jZ19mcm9tX2lkKGNncm91cF9pZCwgXHUwMDI2Y20pKVxuK1x0XHRyZXR1cm4gMDtcbitcbitcdHJlY2xhaW1fY2FsbHMrKztcbitcdGZvciAoaSA9IDA7IGkgXHUwMDNjIFJFQ0xBSU1fTUFYX0lURVI7IGkrKykge1xuK1x0XHR1NjQgbnIgPSBicGZfcHJvYWN0aXZlX3JlY2xhaW0oY20ubWVtY2csIFJFQ0xBSU1fU0laRSk7XG4rXG4rXHRcdGlmICghbnIpXG4rXHRcdFx0YnJlYWs7XG4rXHRcdHJlY2xhaW1lZF9wYWdlcyArPSBucjtcbitcdH1cbitcbitcdHB1dF9jZ3JvdXBfbWVtY2coXHUwMDI2Y20pO1xuK1xuK1x0cmV0dXJuIDA7XG4rfVxuK1xuK3N0cnVjdCB3cV9lbGVtIHtcbitcdHN0cnVjdCBicGZfdGltZXIgdGltZXI7XG4rXHRzdHJ1Y3QgYnBmX3dxIHdvcms7XG4rXHR1NjQgcHJldl9ldmVudDtcbitcdHU2NCBldmVudF9kZWx0YV90aHJlc2hvbGQ7XG4rXHR1NjQgY2hlY2tfbnM7XG4rfTtcbitcbitzdHJ1Y3Qge1xuK1x0X191aW50KHR5cGUsIEJQRl9NQVBfVFlQRV9BUlJBWSk7XG4rXHRfX3VpbnQobWF4X2VudHJpZXMsIDEpO1xuK1x0X190eXBlKGtleSwgX191MzIpO1xuK1x0X190eXBlKHZhbHVlLCBzdHJ1Y3Qgd3FfZWxlbSk7XG4rfSB3cV9tYXAgU0VDKFwiLm1hcHNcIik7XG4rXG4rc3RhdGljIGludCBhc3luY19mcmVlKHZvaWQgKm1hcCwgaW50ICprZXksIHZvaWQgKnZhbHVlKVxuK3tcbitcdHN0cnVjdCB3cV9lbGVtICplbGVtID0gdmFsdWU7XG4rXG4rXHRpZiAoc2hvdWxkX3JlY2xhaW1fY2dyb3VwKHdxX2hpZ2hfY2dyb3VwX2lkLCBcdTAwMjZlbGVtLVx1MDAzZXByZXZfZXZlbnQsXG4rXHRcdGVsZW0tXHUwMDNlZXZlbnRfZGVsdGFfdGhyZXNob2xkKSkge1xuK1x0XHRyZWNsYWltX2Nncm91cCh3cV9sb3dfY2dyb3VwX2lkKTtcbitcdFx0YnBmX3dxX3N0YXJ0KFx1MDAyNmVsZW0tXHUwMDNld29yaywgMCk7XG4rXHR9XG4rXG4rXHRyZXR1cm4gMDtcbit9XG4rXG4rc3RhdGljIGludCB3cV90aW1lcl9jYih2b2lkICptYXAsIGludCAqa2V5LCBzdHJ1Y3Qgd3FfZWxlbSAqZWxlbSlcbit7XG4rXHRicGZfd3Ffc3RhcnQoXHUwMDI2ZWxlbS1cdTAwM2V3b3JrLCAwKTtcbitcdGJwZl90aW1lcl9zdGFydChcdTAwMjZlbGVtLVx1MDAzZXRpbWVyLCBlbGVtLVx1MDAzZWNoZWNrX25zLCAwKTtcbitcbitcdHJldHVybiAwO1xuK31cbitcbitTRUMoXCJzeXNjYWxsXCIpXG4raW50IHdxX3Byb2dfaW5pdChzdHJ1Y3QgYnBmX2FyZ3NfcyAqY3R4KVxuK3tcbitcdHN0cnVjdCB3cV9lbGVtICplbGVtO1xuK1x0X191MzIga2V5ID0gMDtcbitcdGludCByZXQ7XG4rXG4rXHRlbGVtID0gYnBmX21hcF9sb29rdXBfZWxlbShcdTAwMjZ3cV9tYXAsIFx1MDAyNmtleSk7XG4rXHRpZiAoIWVsZW0pXG4rXHRcdHJldHVybiAtMTtcbitcbitcdHJldCA9IGJwZl93cV9pbml0KFx1MDAyNmVsZW0tXHUwMDNld29yaywgXHUwMDI2d3FfbWFwLCAwKTtcbitcdGlmIChyZXQpXG4rXHRcdHJldHVybiByZXQ7XG4rXG4rXHRyZXQgPSBicGZfd3Ffc2V0X2NhbGxiYWNrKFx1MDAyNmVsZW0tXHUwMDNld29yaywgYXN5bmNfZnJlZSwgMCk7XG4rXHRpZiAocmV0KVxuK1x0XHRyZXR1cm4gcmV0O1xuK1xuK1x0cmV0ID0gYnBmX3RpbWVyX2luaXQoXHUwMDI2ZWxlbS1cdTAwM2V0aW1lciwgXHUwMDI2d3FfbWFwLCBDTE9DS19NT05PVE9OSUNfSUQpO1xuK1x0aWYgKHJldClcbitcdFx0cmV0dXJuIHJldDtcbitcbitcdHJldCA9IGJwZl90aW1lcl9zZXRfY2FsbGJhY2soXHUwMDI2ZWxlbS1cdTAwM2V0aW1lciwgd3FfdGltZXJfY2IpO1xuK1x0aWYgKHJldClcbitcdFx0cmV0dXJuIHJldDtcbitcbitcdGVsZW0tXHUwMDNlcHJldl9ldmVudCA9IDA7XG4rXHRlbGVtLVx1MDAzZWV2ZW50X2RlbHRhX3RocmVzaG9sZCA9IGN0eC1cdTAwM2VldmVudF9kZWx0YV90aHJlc2hvbGQ7XG4rXHRlbGVtLVx1MDAzZWNoZWNrX25zID0gY3R4LVx1MDAzZWNoZWNrX25zO1xuK1xuK1x0d3FfaGlnaF9jZ3JvdXBfaWQgPSBjdHgtXHUwMDNlaGlnaF9jZ3JvdXBfaWQ7XG4rXHR3cV9sb3dfY2dyb3VwX2lkID0gY3R4LVx1MDAzZWxvd19jZ3JvdXBfaWQ7XG4rXG4rXHRyZXR1cm4gYnBmX3RpbWVyX3N0YXJ0KFx1MDAyNmVsZW0tXHUwMDNldGltZXIsIGVsZW0tXHUwMDNlY2hlY2tfbnMsIDApO1xuK31cbitcbitjaGFyIExJQ0VOU0VbXSBTRUMoXCJsaWNlbnNlXCIpID0gXCJHUExcIjtcbiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTE5VDA3OjQ0OjQ2LjYwMzI0Mzc4NloiLCJTZXEiOjExLCJOZXN0aW5nIjozLCJUeXBlIjoibGxtIiwiTmFtZSI6Imttc2FuLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuMS1wcm8tcHJldmlldyIsIkR1cmF0aW9uIjoxNDE0Njg3NjMwMCwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiKipLTVNBTiBGdXp6aW5nIERlY2lzaW9uOiBOZWVkc0tNU0FOID0gZmFsc2UqKlxuXG5Pa2F5LCBsZXQncyBicmVhayB0aGlzIGRvd24uIFdlJ3ZlIGdvdCBhIHBhdGNoIHRoYXQncyBlc3NlbnRpYWxseSBleHBvc2luZyBgdHJ5X3RvX2ZyZWVfbWVtX2Nncm91cF9wYWdlc2AgdmlhIGEgQlBGIGludGVyZmFjZSDigJMgdHdvIG5ldyBrZnVuY3MsIGBicGZfcHJvYWN0aXZlX3JlY2xhaW1gIGFuZCBgYnBmX3Byb2FjdGl2ZV9yZWNsYWltX3N3YXBwaW5lc3NgLiBUaGUgcXVlc3Rpb24gaXMsIGRvZXMgdGhpcyB3YXJyYW50IGEgZGVkaWNhdGVkIEtNU0FOIGZ1enppbmcgc2Vzc2lvbj9cblxuTG9va2luZyBhdCB0aGUgY29kZSwgdGhlc2Uga2Z1bmNzIHRha2UgYSBgc3RydWN0IG1lbV9jZ3JvdXAgKm1lbWNnYCwgYW4gYHVuc2lnbmVkIGxvbmcgc2l6ZWAsIGFuZCBhbiBvcHRpb25hbCBgaW50IHN3YXBwaW5lc3NgLiBDcnVjaWFsbHksIHRoZXNlIGFyZ3VtZW50cyBhcmUgKnByb3ZpZGVkIGJ5IEJQRiBwcm9ncmFtcyosIG1lYW5pbmcgdGhlIEJQRiB2ZXJpZmllciBpcyBnb2luZyB0byBlbnN1cmUgdGhhdCBhbGwgb2YgdGhlIGFyZ3VtZW50cyBhcmUgcHJvcGVybHkgaW5pdGlhbGl6ZWQgYmVmb3JlIHRoZXkncmUgcGFzc2VkLiBUaGUga2Z1bmNzIHRoZW1zZWx2ZXMgYXJlIGp1c3QgcGFzc2luZyB0aGVzZSBpbml0aWFsaXplZCBhcmd1bWVudHMgb24gdG8gYHRyeV90b19mcmVlX21lbV9jZ3JvdXBfcGFnZXNgLiBObyBuZXcga2VybmVsIHN0cnVjdHVyZXMgYXJlIGJlaW5nIHNlbnQgdG8gdXNlcnNwYWNlLCB0aGVyZSdzIG5vIGRhdGEgY29weWluZyBpbiBlaXRoZXIgZGlyZWN0aW9uIGJleW9uZCB0aG9zZSB2ZXJpZmllZCBhcmd1bWVudHMsIGFuZCBubyBjb21wbGV4LCBwYXJ0aWFsbHktaW5pdGlhbGl6ZWQgZGF0YSBzdHJ1Y3R1cmVzIGFyZSBiZWluZyBhbGxvY2F0ZWQuIFRoZSBwYXRjaCBhbHNvIGluY2x1ZGVzIGEgc2VsZnRlc3QsIHdoaWNoIGlzIGEgZ29vZCBzaWduLlxuXG5TbywgbGV0J3MgcmV2aWV3IHRoZSBjcml0ZXJpYS4gKjEuIEtlcm5lbCBzdHJ1Y3R1cmVzIHNlbnQgdG8gdXNlciBzcGFjZSB3aGVyZSBmaWVsZHMgbWlnaHQgbm90IGJlIGZ1bGx5IGluaXRpYWxpemVkPyogTm8uICoyLiBDb25kaXRpb25hbCBsb2dpYyBvciBicmFuY2hpbmcgdGhhdCBkZXBlbmRzIG9uIHBvdGVudGlhbGx5IHVuaW5pdGlhbGl6ZWQgdmFyaWFibGVzIG9yIHN0cnVjdCBmaWVsZHM/KiBBYnNvbHV0ZWx5IG5vdCwgdGhlIEJQRiB2ZXJpZmllciBoYXMgdGhhdCBjb3ZlcmVkLiAqMy4gQWxsb2NhdGlvbiBvciBpbml0aWFsaXphdGlvbiBvZiBjb21wbGV4IGRhdGEgc3RydWN0dXJlcyB3aGVyZSB1bmluaXRpYWxpemVkIGZpZWxkcyBjb3VsZCBiZSByZWFkIGxhdGVyPyogTm9wZSwgbm90IGhlcmUuICo0LiBCb3VuZHMgY2hlY2tzLCBsZW5ndGhzLCBvciBsb2dpYyBpbiBhIHdheSB0aGF0IGFsbG93cyBzdXJyb3VuZGluZyBjb2RlIHRvIGFjY2VzcyB1bmluaXRpYWxpemVkIGJ5dGVzIG9mIGV4aXN0aW5nIGJ1ZmZlcnM/KiBTdGlsbCBuby5cblxuR2l2ZW4gYWxsIG9mIHRoYXQsIHRoaXMgcGF0Y2ggaXMgYmFzaWNhbGx5IGp1c3QgYSBCUEYgd3JhcHBlciBhcm91bmQgYW4gZXhpc3RpbmcgZnVuY3Rpb24uIEFueSBwb3RlbnRpYWwgaXNzdWVzIGFyZSBnb2luZyB0byBiZSBzdGFuZGFyZCBtZW1vcnkgc2FmZXR5IHZpb2xhdGlvbnMgbGlrZSB1c2UtYWZ0ZXItZnJlZSwgb3V0LW9mLWJvdW5kcywgb3Igc29tZSBzb3J0IG9mIGxvZ2ljIGVycm9yIGluIHRoZSB3cmFwcGluZyBpdHNlbGYuIFRob3NlIGFyZSB0aGUga2luZHMgb2YgdGhpbmdzIHRoYXQgS0FTQU4gYW5kIHRoZSBub3JtYWwgQlBGIHZlcmlmaWVyIGNoZWNrcyBzaG91bGQgY2F0Y2gsIHNvIHRoZXJlJ3Mgbm8gaW5oZXJlbnQgdW5pbml0aWFsaXplZCBtZW1vcnkgZXhwb3N1cmUuIEknbSBnb2luZyB0byBzZXQgYE5lZWRzS01TQU4gPSBmYWxzZWAuXG5cblxuIiwiSW5wdXRUb2tlbnMiOjEwNTA1LCJPdXRwdXRUb2tlbnMiOjIzNCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjY0OCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTE5VDA3OjQ1OjAwLjc1MDEyMzYwNloiLCJTZXEiOjEyLCJOZXN0aW5nIjozLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJzZXQtcmVzdWx0cyIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjE3NzUwLCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiS01TQU5SZWFzb25pbmdcIjogXCJUaGUgcGF0Y2ggaW50cm9kdWNlcyB0d28gbmV3IEJQRiBrZnVuY3MgKGBicGZfcHJvYWN0aXZlX3JlY2xhaW1gIGFuZCBgYnBmX3Byb2FjdGl2ZV9yZWNsYWltX3N3YXBwaW5lc3NgKSB0aGF0IHdyYXAgdGhlIGV4aXN0aW5nIGB0cnlfdG9fZnJlZV9tZW1fY2dyb3VwX3BhZ2VzYCBmdW5jdGlvbiB0byBhbGxvdyBCUEYgcHJvZ3JhbXMgdG8gdHJpZ2dlciBwcm9hY3RpdmUgbWVtb3J5IHJlY2xhaW0gZm9yIGEgbWVtb3J5IGNncm91cC4gVGhlIGFyZ3VtZW50cyBwYXNzZWQgdG8gdGhlc2Uga2Z1bmNzIGFyZSBzY2FsYXIgdmFsdWVzIGFuZCBwb2ludGVycyB2ZXJpZmllZCBieSB0aGUgQlBGIHZlcmlmaWVyLCBlbnN1cmluZyB0aGV5IGFyZSBpbml0aWFsaXplZC4gVGhlIHBhdGNoIGRvZXMgbm90IGludHJvZHVjZSBhbnkgbmV3IGRhdGEgc3RydWN0dXJlcyBjb3BpZWQgdG8gb3IgZnJvbSB1c2Vyc3BhY2UsIG5vciBkb2VzIGl0IGFsbG9jYXRlIGNvbXBsZXggc3RydWN0dXJlcyB0aGF0IG1pZ2h0IGJlIGxlZnQgcGFydGlhbGx5IHVuaW5pdGlhbGl6ZWQuIFRoZXJlIGlzIG5vIHJpc2sgb2YgdW5pbml0aWFsaXplZCBtZW1vcnkgYmVpbmcgbGVha2VkIHRvIHVzZXJzcGFjZSBvciB1c2VkIGluIGNvbnRyb2wgZmxvdyBkZWNpc2lvbnMuIEFueSBwb3RlbnRpYWwgbWVtb3J5IHNhZmV0eSBpc3N1ZXMgaW50cm9kdWNlZCBieSB0aGVzZSBjaGFuZ2VzIChzdWNoIGFzIHVzZS1hZnRlci1mcmVlIG9yIG91dC1vZi1ib3VuZHMgYWNjZXNzZXMgb24gdGhlIGBtZW1fY2dyb3VwYCBwb2ludGVyKSB3b3VsZCBiZSBlZmZlY3RpdmVseSBjYXVnaHQgYnkgS0FTQU4gYW5kIHRoZSBzdGFuZGFyZCBCUEYgdmVyaWZpZXIgY2hlY2tzLiBUaGVyZWZvcmUsIGEgZGVkaWNhdGVkIEtNU0FOIGZ1enppbmcgc2Vzc2lvbiBpcyBub3QgcmVxdWlyZWQuXCIsXG4gIFwiTmVlZHNLTVNBTlwiOiBmYWxzZVxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiS01TQU5SZWFzb25pbmdcIjogXCJUaGUgcGF0Y2ggaW50cm9kdWNlcyB0d28gbmV3IEJQRiBrZnVuY3MgKGBicGZfcHJvYWN0aXZlX3JlY2xhaW1gIGFuZCBgYnBmX3Byb2FjdGl2ZV9yZWNsYWltX3N3YXBwaW5lc3NgKSB0aGF0IHdyYXAgdGhlIGV4aXN0aW5nIGB0cnlfdG9fZnJlZV9tZW1fY2dyb3VwX3BhZ2VzYCBmdW5jdGlvbiB0byBhbGxvdyBCUEYgcHJvZ3JhbXMgdG8gdHJpZ2dlciBwcm9hY3RpdmUgbWVtb3J5IHJlY2xhaW0gZm9yIGEgbWVtb3J5IGNncm91cC4gVGhlIGFyZ3VtZW50cyBwYXNzZWQgdG8gdGhlc2Uga2Z1bmNzIGFyZSBzY2FsYXIgdmFsdWVzIGFuZCBwb2ludGVycyB2ZXJpZmllZCBieSB0aGUgQlBGIHZlcmlmaWVyLCBlbnN1cmluZyB0aGV5IGFyZSBpbml0aWFsaXplZC4gVGhlIHBhdGNoIGRvZXMgbm90IGludHJvZHVjZSBhbnkgbmV3IGRhdGEgc3RydWN0dXJlcyBjb3BpZWQgdG8gb3IgZnJvbSB1c2Vyc3BhY2UsIG5vciBkb2VzIGl0IGFsbG9jYXRlIGNvbXBsZXggc3RydWN0dXJlcyB0aGF0IG1pZ2h0IGJlIGxlZnQgcGFydGlhbGx5IHVuaW5pdGlhbGl6ZWQuIFRoZXJlIGlzIG5vIHJpc2sgb2YgdW5pbml0aWFsaXplZCBtZW1vcnkgYmVpbmcgbGVha2VkIHRvIHVzZXJzcGFjZSBvciB1c2VkIGluIGNvbnRyb2wgZmxvdyBkZWNpc2lvbnMuIEFueSBwb3RlbnRpYWwgbWVtb3J5IHNhZmV0eSBpc3N1ZXMgaW50cm9kdWNlZCBieSB0aGVzZSBjaGFuZ2VzIChzdWNoIGFzIHVzZS1hZnRlci1mcmVlIG9yIG91dC1vZi1ib3VuZHMgYWNjZXNzZXMgb24gdGhlIGBtZW1fY2dyb3VwYCBwb2ludGVyKSB3b3VsZCBiZSBlZmZlY3RpdmVseSBjYXVnaHQgYnkgS0FTQU4gYW5kIHRoZSBzdGFuZGFyZCBCUEYgdmVyaWZpZXIgY2hlY2tzLiBUaGVyZWZvcmUsIGEgZGVkaWNhdGVkIEtNU0FOIGZ1enppbmcgc2Vzc2lvbiBpcyBub3QgcmVxdWlyZWQuXCIsXG4gIFwiTmVlZHNLTVNBTlwiOiBmYWxzZVxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9XTsKCQkJaWYgKCFyYXdEYXRhIHx8IHJhd0RhdGEubGVuZ3RoID09PSAwKSByZXR1cm47CgoJCQlkcmF3U3VtbWFyeVRhYmxlcyhyYXdEYXRhKTsKCQkJZHJhd0R1cmF0aW9uQ2hhcnQocmF3RGF0YSk7CgkJCWRyYXdUb2tlbkNvbnN1bXB0aW9uQ2hhcnQocmF3RGF0YSk7CgkJfQoKCQlmdW5jdGlvbiBkcmF3U3VtbWFyeVRhYmxlcyhyYXdEYXRhKSB7CgkJCWNvbnN0IHN0YXRzID0gewoJCQkJbGxtOiB7IGNvdW50OiAwLCB0b2tlbnM6IDAsIGR1cmF0aW9uOiAwIH0sCgkJCQl0b29sOiB7IGNvdW50OiAwLCBkdXJhdGlvbjogMCB9CgkJCX07CgoJCQlyYXdEYXRhLmZvckVhY2gocyA9PiB7CgkJCQljb25zdCBkdXIgPSBzLkR1cmF0aW9uIC8gMTAwMDAwMDAwMDsgCgkJCQlpZiAocy5UeXBlID09PSAibGxtIikgewoJCQkJCXN0YXRzLmxsbS5jb3VudCsrOwoJCQkJCXN0YXRzLmxsbS50b2tlbnMgKz0gKHMuSW5wdXRUb2tlbnMgKyBzLk91dHB1dFRva2VucyArIHMuT3V0cHV0VGhvdWdodHNUb2tlbnMpOwoJCQkJCXN0YXRzLmxsbS5kdXJhdGlvbiArPSBkdXI7CgkJCQl9IGVsc2UgaWYgKHMuVHlwZSA9PT0gInRvb2wiKSB7CgkJCQkJc3RhdHMudG9vbC5jb3VudCsrOwoJCQkJCXN0YXRzLnRvb2wuZHVyYXRpb24gKz0gZHVyOwoJCQkJfQoJCQl9KTsKCgkJCWNvbnN0IGF2Z0xsbUR1ciA9IHN0YXRzLmxsbS5jb3VudCA+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-workflowrfgn7[1] Phase: Succeeded StartedAt: 2026-08-19 07:45:23 +0000 UTC FinishedAt: 2026-08-19 07:45:23 +0000 UTC Input: nil Output: nil --------- Name: series-workflowrfgn7[1].abort-on-skip-outcome Phase: Skipped StartedAt: 2026-08-19 07:45:23 +0000 UTC FinishedAt: 2026-08-19 07:45:23 +0000 UTC Input: nil Output: nil --------- Name: series-workflowrfgn7[2] Phase: Succeeded StartedAt: 2026-08-19 07:45:23 +0000 UTC FinishedAt: 2026-08-19 11:28:13 +0000 UTC Input: nil Output: nil --------- Name: series-workflowrfgn7[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"f79066c784022fda83f5936559a1af414e41b603","config_name":"upstream-apparmor-kasan.config","enable_configs":["MEMCG","BPF_SYSCALL"],"series_id":"","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-bpf-kasan-gce-corpus.db","https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["bpf_proactive_reclaim","bpf_proactive_reclaim_swappiness"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"f79066c784022fda83f5936559a1af414e41b603","config_name":"upstream-apparmor-kasan.config","enable_configs":["MEMCG","BPF_SYSCALL"],"series_id":"8d9574dc-d2aa-4392-9d3a-291297bace73","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},retest:null,track:KASAN) Phase: Succeeded StartedAt: 2026-08-19 07:45:23 +0000 UTC FinishedAt: 2026-08-19 11:28:13 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:element,Default:nil,Value:*{"base":{"arch":"amd64","commit_hash":"f79066c784022fda83f5936559a1af414e41b603","config_name":"upstream-apparmor-kasan.config","enable_configs":["MEMCG","BPF_SYSCALL"],"series_id":"","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},"fuzz":{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-bpf-kasan-gce-corpus.db","https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["bpf_proactive_reclaim","bpf_proactive_reclaim_swappiness"],"skip_cover_check":true},"patched":{"arch":"amd64","commit_hash":"f79066c784022fda83f5936559a1af414e41b603","config_name":"upstream-apparmor-kasan.config","enable_configs":["MEMCG","BPF_SYSCALL"],"series_id":"8d9574dc-d2aa-4392-9d3a-291297bace73","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},"retest":null,"track":"KASAN"},ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},},Artifacts:[]Artifact{},} Output: nil --------- Name: series-workflowrfgn7[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"f79066c784022fda83f5936559a1af414e41b603","config_name":"upstream-apparmor-kasan.config","enable_configs":["MEMCG","BPF_SYSCALL"],"series_id":"","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-bpf-kasan-gce-corpus.db","https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["bpf_proactive_reclaim","bpf_proactive_reclaim_swappiness"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"f79066c784022fda83f5936559a1af414e41b603","config_name":"upstream-apparmor-kasan.config","enable_configs":["MEMCG","BPF_SYSCALL"],"series_id":"8d9574dc-d2aa-4392-9d3a-291297bace73","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},retest:null,track:KASAN)[0] Phase: Succeeded StartedAt: 2026-08-19 07:45:23 +0000 UTC FinishedAt: 2026-08-19 07:45:33 +0000 UTC Input: nil Output: nil --------- Name: series-workflowrfgn7[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"f79066c784022fda83f5936559a1af414e41b603","config_name":"upstream-apparmor-kasan.config","enable_configs":["MEMCG","BPF_SYSCALL"],"series_id":"","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-bpf-kasan-gce-corpus.db","https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["bpf_proactive_reclaim","bpf_proactive_reclaim_swappiness"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"f79066c784022fda83f5936559a1af414e41b603","config_name":"upstream-apparmor-kasan.config","enable_configs":["MEMCG","BPF_SYSCALL"],"series_id":"8d9574dc-d2aa-4392-9d3a-291297bace73","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},retest:null,track:KASAN)[0].save-base-req Phase: Succeeded StartedAt: 2026-08-19 07:45:23 +0000 UTC FinishedAt: 2026-08-19 07:45:29 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:data,Default:nil,Value:*{"arch":"amd64","commit_hash":"f79066c784022fda83f5936559a1af414e41b603","config_name":"upstream-apparmor-kasan.config","enable_configs":["MEMCG","BPF_SYSCALL"],"series_id":"","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-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-workflowrfgn7/series-workflowrfgn7-convert-artifact-1828622133/artifact.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:false,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},Result:nil,ExitCode:*0,} --------- Name: series-workflowrfgn7[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"f79066c784022fda83f5936559a1af414e41b603","config_name":"upstream-apparmor-kasan.config","enable_configs":["MEMCG","BPF_SYSCALL"],"series_id":"","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-bpf-kasan-gce-corpus.db","https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["bpf_proactive_reclaim","bpf_proactive_reclaim_swappiness"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"f79066c784022fda83f5936559a1af414e41b603","config_name":"upstream-apparmor-kasan.config","enable_configs":["MEMCG","BPF_SYSCALL"],"series_id":"8d9574dc-d2aa-4392-9d3a-291297bace73","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},retest:null,track:KASAN)[1] Phase: Succeeded StartedAt: 2026-08-19 07:45:33 +0000 UTC FinishedAt: 2026-08-19 08:03:21 +0000 UTC Input: nil Output: nil --------- Name: series-workflowrfgn7[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"f79066c784022fda83f5936559a1af414e41b603","config_name":"upstream-apparmor-kasan.config","enable_configs":["MEMCG","BPF_SYSCALL"],"series_id":"","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-bpf-kasan-gce-corpus.db","https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["bpf_proactive_reclaim","bpf_proactive_reclaim_swappiness"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"f79066c784022fda83f5936559a1af414e41b603","config_name":"upstream-apparmor-kasan.config","enable_configs":["MEMCG","BPF_SYSCALL"],"series_id":"8d9574dc-d2aa-4392-9d3a-291297bace73","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},retest:null,track:KASAN)[1].base-build Phase: Succeeded StartedAt: 2026-08-19 07:45:33 +0000 UTC FinishedAt: 2026-08-19 08:03:21 +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:*8a86e110-4a15-4d7c-93d5-2c07a33a949f,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-workflowrfgn7/series-workflowrfgn7-convert-artifact-1828622133/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": "2193f4cc-cd19-4bc3-a649-339a8dd092ac", "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-workflowrfgn7/series-workflowrfgn7-build-action-3261877019/kernel.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:true,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},Result:nil,ExitCode:*0,} --------- Name: series-workflowrfgn7[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"f79066c784022fda83f5936559a1af414e41b603","config_name":"upstream-apparmor-kasan.config","enable_configs":["MEMCG","BPF_SYSCALL"],"series_id":"","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-bpf-kasan-gce-corpus.db","https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["bpf_proactive_reclaim","bpf_proactive_reclaim_swappiness"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"f79066c784022fda83f5936559a1af414e41b603","config_name":"upstream-apparmor-kasan.config","enable_configs":["MEMCG","BPF_SYSCALL"],"series_id":"8d9574dc-d2aa-4392-9d3a-291297bace73","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},retest:null,track:KASAN)[1].base-build(0) Phase: Succeeded StartedAt: 2026-08-19 07:45:33 +0000 UTC FinishedAt: 2026-08-19 08:03:11 +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:*8a86e110-4a15-4d7c-93d5-2c07a33a949f,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-workflowrfgn7/series-workflowrfgn7-convert-artifact-1828622133/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": "2193f4cc-cd19-4bc3-a649-339a8dd092ac", "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-workflowrfgn7/series-workflowrfgn7-build-action-3261877019/kernel.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:true,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},Result:nil,ExitCode:*0,} --------- Name: series-workflowrfgn7[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"f79066c784022fda83f5936559a1af414e41b603","config_name":"upstream-apparmor-kasan.config","enable_configs":["MEMCG","BPF_SYSCALL"],"series_id":"","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-bpf-kasan-gce-corpus.db","https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["bpf_proactive_reclaim","bpf_proactive_reclaim_swappiness"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"f79066c784022fda83f5936559a1af414e41b603","config_name":"upstream-apparmor-kasan.config","enable_configs":["MEMCG","BPF_SYSCALL"],"series_id":"8d9574dc-d2aa-4392-9d3a-291297bace73","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},retest:null,track:KASAN)[2] Phase: Succeeded StartedAt: 2026-08-19 08:03:21 +0000 UTC FinishedAt: 2026-08-19 08:03:21 +0000 UTC Input: nil Output: nil --------- Name: series-workflowrfgn7[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"f79066c784022fda83f5936559a1af414e41b603","config_name":"upstream-apparmor-kasan.config","enable_configs":["MEMCG","BPF_SYSCALL"],"series_id":"","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-bpf-kasan-gce-corpus.db","https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["bpf_proactive_reclaim","bpf_proactive_reclaim_swappiness"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"f79066c784022fda83f5936559a1af414e41b603","config_name":"upstream-apparmor-kasan.config","enable_configs":["MEMCG","BPF_SYSCALL"],"series_id":"8d9574dc-d2aa-4392-9d3a-291297bace73","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},retest:null,track:KASAN)[2].abort-if-base-build-failed Phase: Skipped StartedAt: 2026-08-19 08:03:21 +0000 UTC FinishedAt: 2026-08-19 08:03:21 +0000 UTC Input: nil Output: nil --------- Name: series-workflowrfgn7[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"f79066c784022fda83f5936559a1af414e41b603","config_name":"upstream-apparmor-kasan.config","enable_configs":["MEMCG","BPF_SYSCALL"],"series_id":"","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-bpf-kasan-gce-corpus.db","https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["bpf_proactive_reclaim","bpf_proactive_reclaim_swappiness"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"f79066c784022fda83f5936559a1af414e41b603","config_name":"upstream-apparmor-kasan.config","enable_configs":["MEMCG","BPF_SYSCALL"],"series_id":"8d9574dc-d2aa-4392-9d3a-291297bace73","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},retest:null,track:KASAN)[3] Phase: Succeeded StartedAt: 2026-08-19 08:03:21 +0000 UTC FinishedAt: 2026-08-19 08:03:31 +0000 UTC Input: nil Output: nil --------- Name: series-workflowrfgn7[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"f79066c784022fda83f5936559a1af414e41b603","config_name":"upstream-apparmor-kasan.config","enable_configs":["MEMCG","BPF_SYSCALL"],"series_id":"","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-bpf-kasan-gce-corpus.db","https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["bpf_proactive_reclaim","bpf_proactive_reclaim_swappiness"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"f79066c784022fda83f5936559a1af414e41b603","config_name":"upstream-apparmor-kasan.config","enable_configs":["MEMCG","BPF_SYSCALL"],"series_id":"8d9574dc-d2aa-4392-9d3a-291297bace73","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},retest:null,track:KASAN)[3].save-patched-req Phase: Succeeded StartedAt: 2026-08-19 08:03:21 +0000 UTC FinishedAt: 2026-08-19 08:03:26 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:data,Default:nil,Value:*{"arch":"amd64","commit_hash":"f79066c784022fda83f5936559a1af414e41b603","config_name":"upstream-apparmor-kasan.config","enable_configs":["MEMCG","BPF_SYSCALL"],"series_id":"8d9574dc-d2aa-4392-9d3a-291297bace73","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-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-workflowrfgn7/series-workflowrfgn7-convert-artifact-2046708368/artifact.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:false,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},Result:nil,ExitCode:*0,} --------- Name: series-workflowrfgn7[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"f79066c784022fda83f5936559a1af414e41b603","config_name":"upstream-apparmor-kasan.config","enable_configs":["MEMCG","BPF_SYSCALL"],"series_id":"","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-bpf-kasan-gce-corpus.db","https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["bpf_proactive_reclaim","bpf_proactive_reclaim_swappiness"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"f79066c784022fda83f5936559a1af414e41b603","config_name":"upstream-apparmor-kasan.config","enable_configs":["MEMCG","BPF_SYSCALL"],"series_id":"8d9574dc-d2aa-4392-9d3a-291297bace73","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},retest:null,track:KASAN)[4] Phase: Succeeded StartedAt: 2026-08-19 08:03:31 +0000 UTC FinishedAt: 2026-08-19 08:05:39 +0000 UTC Input: nil Output: nil --------- Name: series-workflowrfgn7[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"f79066c784022fda83f5936559a1af414e41b603","config_name":"upstream-apparmor-kasan.config","enable_configs":["MEMCG","BPF_SYSCALL"],"series_id":"","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-bpf-kasan-gce-corpus.db","https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["bpf_proactive_reclaim","bpf_proactive_reclaim_swappiness"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"f79066c784022fda83f5936559a1af414e41b603","config_name":"upstream-apparmor-kasan.config","enable_configs":["MEMCG","BPF_SYSCALL"],"series_id":"8d9574dc-d2aa-4392-9d3a-291297bace73","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},retest:null,track:KASAN)[4].boot-test-base Phase: Succeeded StartedAt: 2026-08-19 08:03:31 +0000 UTC FinishedAt: 2026-08-19 08:05:29 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:base-build-id,Default:nil,Value:*2193f4cc-cd19-4bc3-a649-339a8dd092ac,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-workflowrfgn7/series-workflowrfgn7-build-action-3261877019/kernel.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:true,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},} Output: &Outputs{Parameters:[]Parameter{Parameter{Name:result,Default:nil,Value:*{ "success": true },ValueFrom:&ValueFrom{Path:/output/result.json,JSONPath:,JQFilter:,Parameter:,Default:nil,Supplied:nil,Event:,Expression:,ConfigMapKeyRef:nil,},GlobalName:,Enum:[],Description:nil,},},Artifacts:[]Artifact{},Result:nil,ExitCode:*0,} --------- Name: series-workflowrfgn7[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"f79066c784022fda83f5936559a1af414e41b603","config_name":"upstream-apparmor-kasan.config","enable_configs":["MEMCG","BPF_SYSCALL"],"series_id":"","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-bpf-kasan-gce-corpus.db","https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["bpf_proactive_reclaim","bpf_proactive_reclaim_swappiness"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"f79066c784022fda83f5936559a1af414e41b603","config_name":"upstream-apparmor-kasan.config","enable_configs":["MEMCG","BPF_SYSCALL"],"series_id":"8d9574dc-d2aa-4392-9d3a-291297bace73","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},retest:null,track:KASAN)[5] Phase: Succeeded StartedAt: 2026-08-19 08:05:39 +0000 UTC FinishedAt: 2026-08-19 08:05:39 +0000 UTC Input: nil Output: nil --------- Name: series-workflowrfgn7[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"f79066c784022fda83f5936559a1af414e41b603","config_name":"upstream-apparmor-kasan.config","enable_configs":["MEMCG","BPF_SYSCALL"],"series_id":"","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-bpf-kasan-gce-corpus.db","https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["bpf_proactive_reclaim","bpf_proactive_reclaim_swappiness"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"f79066c784022fda83f5936559a1af414e41b603","config_name":"upstream-apparmor-kasan.config","enable_configs":["MEMCG","BPF_SYSCALL"],"series_id":"8d9574dc-d2aa-4392-9d3a-291297bace73","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},retest:null,track:KASAN)[5].abort-if-base-boot-failed Phase: Skipped StartedAt: 2026-08-19 08:05:39 +0000 UTC FinishedAt: 2026-08-19 08:05:39 +0000 UTC Input: nil Output: nil --------- Name: series-workflowrfgn7[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"f79066c784022fda83f5936559a1af414e41b603","config_name":"upstream-apparmor-kasan.config","enable_configs":["MEMCG","BPF_SYSCALL"],"series_id":"","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-bpf-kasan-gce-corpus.db","https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["bpf_proactive_reclaim","bpf_proactive_reclaim_swappiness"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"f79066c784022fda83f5936559a1af414e41b603","config_name":"upstream-apparmor-kasan.config","enable_configs":["MEMCG","BPF_SYSCALL"],"series_id":"8d9574dc-d2aa-4392-9d3a-291297bace73","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},retest:null,track:KASAN)[6] Phase: Succeeded StartedAt: 2026-08-19 08:05:39 +0000 UTC FinishedAt: 2026-08-19 08:23:16 +0000 UTC Input: nil Output: nil --------- Name: series-workflowrfgn7[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"f79066c784022fda83f5936559a1af414e41b603","config_name":"upstream-apparmor-kasan.config","enable_configs":["MEMCG","BPF_SYSCALL"],"series_id":"","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-bpf-kasan-gce-corpus.db","https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["bpf_proactive_reclaim","bpf_proactive_reclaim_swappiness"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"f79066c784022fda83f5936559a1af414e41b603","config_name":"upstream-apparmor-kasan.config","enable_configs":["MEMCG","BPF_SYSCALL"],"series_id":"8d9574dc-d2aa-4392-9d3a-291297bace73","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},retest:null,track:KASAN)[6].patched-build Phase: Succeeded StartedAt: 2026-08-19 08:05:39 +0000 UTC FinishedAt: 2026-08-19 08:23:16 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:findings,Default:nil,Value:*true,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:test-name,Default:nil,Value:*[KASAN] Build Patched,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:smoke-build,Default:nil,Value:*false,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:session-id,Default:nil,Value:*8a86e110-4a15-4d7c-93d5-2c07a33a949f,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-workflowrfgn7/series-workflowrfgn7-convert-artifact-2046708368/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": "30c9f1f9-d094-4885-85a6-38616c169405", "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-workflowrfgn7/series-workflowrfgn7-build-action-2357479180/kernel.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:true,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},Result:nil,ExitCode:*0,} --------- Name: series-workflowrfgn7[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"f79066c784022fda83f5936559a1af414e41b603","config_name":"upstream-apparmor-kasan.config","enable_configs":["MEMCG","BPF_SYSCALL"],"series_id":"","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-bpf-kasan-gce-corpus.db","https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["bpf_proactive_reclaim","bpf_proactive_reclaim_swappiness"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"f79066c784022fda83f5936559a1af414e41b603","config_name":"upstream-apparmor-kasan.config","enable_configs":["MEMCG","BPF_SYSCALL"],"series_id":"8d9574dc-d2aa-4392-9d3a-291297bace73","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},retest:null,track:KASAN)[6].patched-build(0) Phase: Succeeded StartedAt: 2026-08-19 08:05:39 +0000 UTC FinishedAt: 2026-08-19 08:23:06 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:findings,Default:nil,Value:*true,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:test-name,Default:nil,Value:*[KASAN] Build Patched,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:smoke-build,Default:nil,Value:*false,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:session-id,Default:nil,Value:*8a86e110-4a15-4d7c-93d5-2c07a33a949f,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-workflowrfgn7/series-workflowrfgn7-convert-artifact-2046708368/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": "30c9f1f9-d094-4885-85a6-38616c169405", "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-workflowrfgn7/series-workflowrfgn7-build-action-2357479180/kernel.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:true,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},Result:nil,ExitCode:*0,} --------- Name: series-workflowrfgn7[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"f79066c784022fda83f5936559a1af414e41b603","config_name":"upstream-apparmor-kasan.config","enable_configs":["MEMCG","BPF_SYSCALL"],"series_id":"","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-bpf-kasan-gce-corpus.db","https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["bpf_proactive_reclaim","bpf_proactive_reclaim_swappiness"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"f79066c784022fda83f5936559a1af414e41b603","config_name":"upstream-apparmor-kasan.config","enable_configs":["MEMCG","BPF_SYSCALL"],"series_id":"8d9574dc-d2aa-4392-9d3a-291297bace73","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},retest:null,track:KASAN)[7] Phase: Succeeded StartedAt: 2026-08-19 08:23:16 +0000 UTC FinishedAt: 2026-08-19 08:23:16 +0000 UTC Input: nil Output: nil --------- Name: series-workflowrfgn7[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"f79066c784022fda83f5936559a1af414e41b603","config_name":"upstream-apparmor-kasan.config","enable_configs":["MEMCG","BPF_SYSCALL"],"series_id":"","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-bpf-kasan-gce-corpus.db","https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["bpf_proactive_reclaim","bpf_proactive_reclaim_swappiness"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"f79066c784022fda83f5936559a1af414e41b603","config_name":"upstream-apparmor-kasan.config","enable_configs":["MEMCG","BPF_SYSCALL"],"series_id":"8d9574dc-d2aa-4392-9d3a-291297bace73","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},retest:null,track:KASAN)[7].abort-if-patched-build-failed Phase: Skipped StartedAt: 2026-08-19 08:23:16 +0000 UTC FinishedAt: 2026-08-19 08:23:16 +0000 UTC Input: nil Output: nil --------- Name: series-workflowrfgn7[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"f79066c784022fda83f5936559a1af414e41b603","config_name":"upstream-apparmor-kasan.config","enable_configs":["MEMCG","BPF_SYSCALL"],"series_id":"","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-bpf-kasan-gce-corpus.db","https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["bpf_proactive_reclaim","bpf_proactive_reclaim_swappiness"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"f79066c784022fda83f5936559a1af414e41b603","config_name":"upstream-apparmor-kasan.config","enable_configs":["MEMCG","BPF_SYSCALL"],"series_id":"8d9574dc-d2aa-4392-9d3a-291297bace73","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},retest:null,track:KASAN)[8] Phase: Succeeded StartedAt: 2026-08-19 08:23:16 +0000 UTC FinishedAt: 2026-08-19 08:25:23 +0000 UTC Input: nil Output: nil --------- Name: series-workflowrfgn7[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"f79066c784022fda83f5936559a1af414e41b603","config_name":"upstream-apparmor-kasan.config","enable_configs":["MEMCG","BPF_SYSCALL"],"series_id":"","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-bpf-kasan-gce-corpus.db","https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["bpf_proactive_reclaim","bpf_proactive_reclaim_swappiness"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"f79066c784022fda83f5936559a1af414e41b603","config_name":"upstream-apparmor-kasan.config","enable_configs":["MEMCG","BPF_SYSCALL"],"series_id":"8d9574dc-d2aa-4392-9d3a-291297bace73","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},retest:null,track:KASAN)[8].boot-test-patched Phase: Succeeded StartedAt: 2026-08-19 08:23:16 +0000 UTC FinishedAt: 2026-08-19 08:25:13 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:base-build-id,Default:nil,Value:*,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:patched-build-id,Default:nil,Value:*30c9f1f9-d094-4885-85a6-38616c169405,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:test-name,Default:nil,Value:*[KASAN] Boot test: Patched,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:report-findings,Default:nil,Value:*true,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},},Artifacts:[]Artifact{Artifact{Name:kernel,Path:/base,Mode:nil,From:,ArtifactLocation:ArtifactLocation{ArchiveLogs:nil,S3:nil,Git:nil,HTTP:nil,Artifactory:nil,HDFS:nil,Raw:nil,OSS:nil,GCS:&GCSArtifact{GCSBucket:GCSBucket{Bucket:,ServiceAccountKeySecret:nil,},Key:series-workflowrfgn7/series-workflowrfgn7-build-action-2357479180/kernel.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:true,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},} Output: &Outputs{Parameters:[]Parameter{Parameter{Name:result,Default:nil,Value:*{ "success": true },ValueFrom:&ValueFrom{Path:/output/result.json,JSONPath:,JQFilter:,Parameter:,Default:nil,Supplied:nil,Event:,Expression:,ConfigMapKeyRef:nil,},GlobalName:,Enum:[],Description:nil,},},Artifacts:[]Artifact{},Result:nil,ExitCode:*0,} --------- Name: series-workflowrfgn7[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"f79066c784022fda83f5936559a1af414e41b603","config_name":"upstream-apparmor-kasan.config","enable_configs":["MEMCG","BPF_SYSCALL"],"series_id":"","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-bpf-kasan-gce-corpus.db","https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["bpf_proactive_reclaim","bpf_proactive_reclaim_swappiness"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"f79066c784022fda83f5936559a1af414e41b603","config_name":"upstream-apparmor-kasan.config","enable_configs":["MEMCG","BPF_SYSCALL"],"series_id":"8d9574dc-d2aa-4392-9d3a-291297bace73","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},retest:null,track:KASAN)[10] Phase: Succeeded StartedAt: 2026-08-19 08:25:23 +0000 UTC FinishedAt: 2026-08-19 11:28:13 +0000 UTC Input: nil Output: nil --------- Name: series-workflowrfgn7[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"f79066c784022fda83f5936559a1af414e41b603","config_name":"upstream-apparmor-kasan.config","enable_configs":["MEMCG","BPF_SYSCALL"],"series_id":"","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-bpf-kasan-gce-corpus.db","https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["bpf_proactive_reclaim","bpf_proactive_reclaim_swappiness"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"f79066c784022fda83f5936559a1af414e41b603","config_name":"upstream-apparmor-kasan.config","enable_configs":["MEMCG","BPF_SYSCALL"],"series_id":"8d9574dc-d2aa-4392-9d3a-291297bace73","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},retest:null,track:KASAN)[10].run-fuzz Phase: Succeeded StartedAt: 2026-08-19 08:25:23 +0000 UTC FinishedAt: 2026-08-19 11:28:13 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:config,Default:nil,Value:*{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-bpf-kasan-gce-corpus.db","https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["bpf_proactive_reclaim","bpf_proactive_reclaim_swappiness"],"skip_cover_check":true},ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:track,Default:nil,Value:*KASAN,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:base-build-id,Default:nil,Value:*2193f4cc-cd19-4bc3-a649-339a8dd092ac,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:patched-build-id,Default:nil,Value:*30c9f1f9-d094-4885-85a6-38616c169405,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},},Artifacts:[]Artifact{Artifact{Name:base-kernel,Path:,Mode:nil,From:,ArtifactLocation:ArtifactLocation{ArchiveLogs:nil,S3:nil,Git:nil,HTTP:nil,Artifactory:nil,HDFS:nil,Raw:nil,OSS:nil,GCS:&GCSArtifact{GCSBucket:GCSBucket{Bucket:,ServiceAccountKeySecret:nil,},Key:series-workflowrfgn7/series-workflowrfgn7-build-action-3261877019/kernel.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:true,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},Artifact{Name:patched-kernel,Path:,Mode:nil,From:,ArtifactLocation:ArtifactLocation{ArchiveLogs:nil,S3:nil,Git:nil,HTTP:nil,Artifactory:nil,HDFS:nil,Raw:nil,OSS:nil,GCS:&GCSArtifact{GCSBucket:GCSBucket{Bucket:,ServiceAccountKeySecret:nil,},Key:series-workflowrfgn7/series-workflowrfgn7-build-action-2357479180/kernel.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:true,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},} Output: nil --------- Name: series-workflowrfgn7[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"f79066c784022fda83f5936559a1af414e41b603","config_name":"upstream-apparmor-kasan.config","enable_configs":["MEMCG","BPF_SYSCALL"],"series_id":"","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-bpf-kasan-gce-corpus.db","https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["bpf_proactive_reclaim","bpf_proactive_reclaim_swappiness"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"f79066c784022fda83f5936559a1af414e41b603","config_name":"upstream-apparmor-kasan.config","enable_configs":["MEMCG","BPF_SYSCALL"],"series_id":"8d9574dc-d2aa-4392-9d3a-291297bace73","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},retest:null,track:KASAN)[10].run-fuzz[0] Phase: Succeeded StartedAt: 2026-08-19 08:25:23 +0000 UTC FinishedAt: 2026-08-19 08:25:33 +0000 UTC Input: nil Output: nil --------- Name: series-workflowrfgn7[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"f79066c784022fda83f5936559a1af414e41b603","config_name":"upstream-apparmor-kasan.config","enable_configs":["MEMCG","BPF_SYSCALL"],"series_id":"","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-bpf-kasan-gce-corpus.db","https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["bpf_proactive_reclaim","bpf_proactive_reclaim_swappiness"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"f79066c784022fda83f5936559a1af414e41b603","config_name":"upstream-apparmor-kasan.config","enable_configs":["MEMCG","BPF_SYSCALL"],"series_id":"8d9574dc-d2aa-4392-9d3a-291297bace73","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},retest:null,track:KASAN)[10].run-fuzz[0].save-fuzz-config Phase: Succeeded StartedAt: 2026-08-19 08:25:23 +0000 UTC FinishedAt: 2026-08-19 08:25:28 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:data,Default:nil,Value:*{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-bpf-kasan-gce-corpus.db","https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["bpf_proactive_reclaim","bpf_proactive_reclaim_swappiness"],"skip_cover_check":true},ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},},Artifacts:[]Artifact{},} Output: &Outputs{Parameters:[]Parameter{},Artifacts:[]Artifact{Artifact{Name:artifact,Path:/tmp/artifact,Mode:nil,From:,ArtifactLocation:ArtifactLocation{ArchiveLogs:nil,S3:nil,Git:nil,HTTP:nil,Artifactory:nil,HDFS:nil,Raw:nil,OSS:nil,GCS:&GCSArtifact{GCSBucket:GCSBucket{Bucket:,ServiceAccountKeySecret:nil,},Key:series-workflowrfgn7/series-workflowrfgn7-convert-artifact-3335371913/artifact.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:false,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},Result:nil,ExitCode:*0,} --------- Name: series-workflowrfgn7[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"f79066c784022fda83f5936559a1af414e41b603","config_name":"upstream-apparmor-kasan.config","enable_configs":["MEMCG","BPF_SYSCALL"],"series_id":"","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-bpf-kasan-gce-corpus.db","https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["bpf_proactive_reclaim","bpf_proactive_reclaim_swappiness"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"f79066c784022fda83f5936559a1af414e41b603","config_name":"upstream-apparmor-kasan.config","enable_configs":["MEMCG","BPF_SYSCALL"],"series_id":"8d9574dc-d2aa-4392-9d3a-291297bace73","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},retest:null,track:KASAN)[10].run-retest Phase: Skipped StartedAt: 2026-08-19 08:25:23 +0000 UTC FinishedAt: 2026-08-19 08:25:23 +0000 UTC Input: nil Output: nil --------- Name: series-workflowrfgn7[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"f79066c784022fda83f5936559a1af414e41b603","config_name":"upstream-apparmor-kasan.config","enable_configs":["MEMCG","BPF_SYSCALL"],"series_id":"","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-bpf-kasan-gce-corpus.db","https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["bpf_proactive_reclaim","bpf_proactive_reclaim_swappiness"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"f79066c784022fda83f5936559a1af414e41b603","config_name":"upstream-apparmor-kasan.config","enable_configs":["MEMCG","BPF_SYSCALL"],"series_id":"8d9574dc-d2aa-4392-9d3a-291297bace73","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},retest:null,track:KASAN)[9] Phase: Succeeded StartedAt: 2026-08-19 08:25:23 +0000 UTC FinishedAt: 2026-08-19 08:25:23 +0000 UTC Input: nil Output: nil --------- Name: series-workflowrfgn7[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"f79066c784022fda83f5936559a1af414e41b603","config_name":"upstream-apparmor-kasan.config","enable_configs":["MEMCG","BPF_SYSCALL"],"series_id":"","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-bpf-kasan-gce-corpus.db","https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["bpf_proactive_reclaim","bpf_proactive_reclaim_swappiness"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"f79066c784022fda83f5936559a1af414e41b603","config_name":"upstream-apparmor-kasan.config","enable_configs":["MEMCG","BPF_SYSCALL"],"series_id":"8d9574dc-d2aa-4392-9d3a-291297bace73","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},retest:null,track:KASAN)[9].abort-if-patched-boot-failed Phase: Skipped StartedAt: 2026-08-19 08:25:23 +0000 UTC FinishedAt: 2026-08-19 08:25:23 +0000 UTC Input: nil Output: nil --------- Name: series-workflowrfgn7[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"f79066c784022fda83f5936559a1af414e41b603","config_name":"upstream-apparmor-kasan.config","enable_configs":["MEMCG","BPF_SYSCALL"],"series_id":"","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-bpf-kasan-gce-corpus.db","https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["bpf_proactive_reclaim","bpf_proactive_reclaim_swappiness"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"f79066c784022fda83f5936559a1af414e41b603","config_name":"upstream-apparmor-kasan.config","enable_configs":["MEMCG","BPF_SYSCALL"],"series_id":"8d9574dc-d2aa-4392-9d3a-291297bace73","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},retest:null,track:KASAN)[10].run-fuzz[1] Phase: Succeeded StartedAt: 2026-08-19 08:25:33 +0000 UTC FinishedAt: 2026-08-19 11:28:13 +0000 UTC Input: nil Output: nil --------- Name: series-workflowrfgn7[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"f79066c784022fda83f5936559a1af414e41b603","config_name":"upstream-apparmor-kasan.config","enable_configs":["MEMCG","BPF_SYSCALL"],"series_id":"","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-bpf-kasan-gce-corpus.db","https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["bpf_proactive_reclaim","bpf_proactive_reclaim_swappiness"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"f79066c784022fda83f5936559a1af414e41b603","config_name":"upstream-apparmor-kasan.config","enable_configs":["MEMCG","BPF_SYSCALL"],"series_id":"8d9574dc-d2aa-4392-9d3a-291297bace73","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},retest:null,track:KASAN)[10].run-fuzz[1].fuzz Phase: Succeeded StartedAt: 2026-08-19 08:25:33 +0000 UTC FinishedAt: 2026-08-19 11:28:03 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:base-build-id,Default:nil,Value:*2193f4cc-cd19-4bc3-a649-339a8dd092ac,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:patched-build-id,Default:nil,Value:*30c9f1f9-d094-4885-85a6-38616c169405,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:test-name,Default:nil,Value:*[KASAN] Fuzz,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},},Artifacts:[]Artifact{Artifact{Name:base-kernel,Path:/base,Mode:nil,From:,ArtifactLocation:ArtifactLocation{ArchiveLogs:nil,S3:nil,Git:nil,HTTP:nil,Artifactory:nil,HDFS:nil,Raw:nil,OSS:nil,GCS:&GCSArtifact{GCSBucket:GCSBucket{Bucket:,ServiceAccountKeySecret:nil,},Key:series-workflowrfgn7/series-workflowrfgn7-build-action-3261877019/kernel.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:true,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},Artifact{Name:patched-kernel,Path:/patched,Mode:nil,From:,ArtifactLocation:ArtifactLocation{ArchiveLogs:nil,S3:nil,Git:nil,HTTP:nil,Artifactory:nil,HDFS:nil,Raw:nil,OSS:nil,GCS:&GCSArtifact{GCSBucket:GCSBucket{Bucket:,ServiceAccountKeySecret:nil,},Key:series-workflowrfgn7/series-workflowrfgn7-build-action-2357479180/kernel.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:true,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},Artifact{Name:config,Path:/tmp/config.json,Mode:nil,From:,ArtifactLocation:ArtifactLocation{ArchiveLogs:nil,S3:nil,Git:nil,HTTP:nil,Artifactory:nil,HDFS:nil,Raw:nil,OSS:nil,GCS:&GCSArtifact{GCSBucket:GCSBucket{Bucket:,ServiceAccountKeySecret:nil,},Key:series-workflowrfgn7/series-workflowrfgn7-convert-artifact-3335371913/artifact.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:false,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},} Output: &Outputs{Parameters:[]Parameter{},Artifacts:[]Artifact{},Result:nil,ExitCode:*0,}