Name: series-workflowhr8tv Phase: Failed StartedAt: 2026-09-11 03:58:28 +0000 UTC FinishedAt: 2026-09-11 04:00:33 +0000 UTC Input: nil Output: nil --------- Name: series-workflowhr8tv[0] Phase: Succeeded StartedAt: 2026-09-11 03:58:28 +0000 UTC FinishedAt: 2026-09-11 04:00:23 +0000 UTC Input: nil Output: nil --------- Name: series-workflowhr8tv[0].run-triage Phase: Succeeded StartedAt: 2026-09-11 03:58:28 +0000 UTC FinishedAt: 2026-09-11 04:00:23 +0000 UTC Input: nil Output: &Outputs{Parameters:[]Parameter{Parameter{Name:result,Default:nil,Value:*{ "skip_reason": "AI determined the patch has no functional impact", "targets": null, "trajectory": "CjwhZG9jdHlwZSBodG1sPgo8aHRtbD4KPGhlYWQ+Cgk8dGl0bGU+QUkgVHJhamVjdG9yeTwvdGl0bGU+Cgk8c3R5bGU+CgkJdGFibGUgewoJCQlib3JkZXI6IDFweCBzb2xpZCAjY2NjOwoJCQltYXJnaW46IDIwcHggNXB4OwoJCQlib3JkZXItY29sbGFwc2U6IGNvbGxhcHNlOwoJCQl3aGl0ZS1zcGFjZTogbm93cmFwOwoJCQl0ZXh0LW92ZXJmbG93OiBlbGxpcHNpczsKCQkJb3ZlcmZsb3c6IGhpZGRlbjsKCQl9CgoJCXRhYmxlIGNhcHRpb24gewoJCQlmb250LXdlaWdodDogYm9sZDsKCQl9CgoJCXRhYmxlIHRkLCB0YWJsZSB0aCB7CgkJCXZlcnRpY2FsLWFsaWduOiB0b3A7CgkJCXBhZGRpbmc6IDJweCA4cHg7CgkJCXRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzOwoJCQlvdmVyZmxvdzogaGlkZGVuOwoJCX0KCgkJLmxpc3RfdGFibGUgdGQsIC5saXN0X3RhYmxlIHRoIHsKCQkJYm9yZGVyLWxlZnQ6IDFweCBzb2xpZCAjY2NjOwoJCX0KCgkJLmxpc3RfdGFibGUgdGggewoJCQliYWNrZ3JvdW5kOiAjRjRGNEY0OwoJCX0KCgkJLmxpc3RfdGFibGUgdHI6bnRoLWNoaWxkKDJuKSB7CgkJCWJhY2tncm91bmQ6ICNGNEY0RjQ7CgkJfQoKCQkubGlzdF90YWJsZSB0cjpob3ZlciB7CgkJCWJhY2tncm91bmQ6ICNmZmZmOTk7CgkJfQoKCQkjYWlfZGV0YWlsc19kaXYgcHJlIHsKCQkJbWFyZ2luOiAxcHg7CgkJCW1heC13aWR0aDogMTIwY2g7CgkJCXdoaXRlLXNwYWNlOiBwcmUtd3JhcDsKCQkJb3ZlcmZsb3ctd3JhcDogYnJlYWstd29yZDsKCQl9Cgk8L3N0eWxlPgo8L2hlYWQ+Cjxib2R5PgoJPGgxPkFJIFRyYWplY3Rvcnk8L2gxPgoJPGJyPgoKCQoJPHRhYmxlIGNsYXNzPSJsaXN0X3RhYmxlIj4KCQk8Y2FwdGlvbj5UcmFqZWN0b3J5OiAoPGEgaHJlZj0iIyIgb25jbGljaz0idG9nZ2xlQWxsRGV0YWlscygpOyByZXR1cm4gZmFsc2U7Ij5FeHBhbmQvQ29sbGFwc2UgQWxsPC9hPik8L2NhcHRpb24+CgkJPHRoZWFkPjx0cj4KCQkJPHRoPlNlcTwvdGg+CgkJCTx0aD5UaW1lc3RhbXA8L3RoPgoJCQk8dGg+VHlwZTwvdGg+CgkJCTx0aD5OYW1lPC90aD4KCQkJPHRoPkR1cmF0aW9uPC90aD4KCQk8L3RyPjwvdGhlYWQ+CgkJPHRib2R5PgoJCQoJCTx0cj4KCQkJPHRkPjAvMDwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzExIDA0OjAwPC90ZD4KCQkJPHRkPmZsb3c8L3RkPgoJCQk8dGQ+cGF0Y2gtdHJpYWdlPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RW5hYmxlQ29uZmlncyYjMzQ7OiBudWxsLAogICYjMzQ7Rm9jdXNTeW1ib2xzJiMzNDs6IFtdLAogICYjMzQ7S01TQU5SZWFzb25pbmcmIzM0OzogJiMzNDsmIzM0OywKICAmIzM0O05lZWRzS01TQU4mIzM0OzogZmFsc2UsCiAgJiMzNDtSZWFzb25pbmcmIzM0OzogJiMzNDtUaGUgcGF0Y2ggbW9kaWZpZXMgb25seSB1c2VyLXNwYWNlIHRvb2xpbmcgKGJwZnRvb2wgdW5kZXIgdG9vbHMvYnBmL2JwZnRvb2wvKSBhbmQgQlBGIHNlbGZ0ZXN0cyAodG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmLykuIEl0IGRvZXMgbm90IHRvdWNoIHRoZSBMaW51eCBrZXJuZWwgaW1hZ2Ugb3Iga2VybmVsIG1vZHVsZXMsIG1ha2luZyBpdCB1bnJlYWNoYWJsZSBmb3Igc3l6a2FsbGVyIGtlcm5lbCBmdXp6aW5nLiYjMzQ7LAogICYjMzQ7V29ydGhGdXp6aW5nJiMzNDs6IGZhbHNlCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4xLzE8L3RkPgoJCQk8dGQ+MjAyNi8wOS8xMSAwNDowMDwvdGQ+CgkJCTx0ZD5hY3Rpb248L3RkPgoJCQk8dGQ+cmVhZC1wYXRjaC1kaWZmPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7UGF0Y2hEaWZmJiMzNDs6ICYjMzQ7Y29tbWl0IDUwODA4ZjZlODc4Zjg4OWUwYTM0MDc5YTk0NTZjMDMzNGM1MjIyMGRcbkF1dGhvcjogc3l6LWNsdXN0ZXIgXHUwMDNjdHJpYWdlQHN5emthbGxlci5jb21cdTAwM2VcbkRhdGU6ICAgRnJpIFNlcCAxMSAwNDowMDowMSAyMDI2ICYjNDM7MDAwMFxuXG4gICAgc3l6LWNsdXN0ZXI6IGFwcGxpZWQgcGF0Y2ggdW5kZXIgcmV2aWV3XG5cbmRpZmYgLS1naXQgYS90b29scy9icGYvYnBmdG9vbC9Eb2N1bWVudGF0aW9uL2JwZnRvb2wtbWFwLnJzdCBiL3Rvb2xzL2JwZi9icGZ0b29sL0RvY3VtZW50YXRpb24vYnBmdG9vbC1tYXAucnN0XG5pbmRleCA1ZGFmM2RlNWM3NDQ2Li4yM2ZhYTY3MjY4NTg3IDEwMDY0NFxuLS0tIGEvdG9vbHMvYnBmL2JwZnRvb2wvRG9jdW1lbnRhdGlvbi9icGZ0b29sLW1hcC5yc3RcbiYjNDM7JiM0MzsmIzQzOyBiL3Rvb2xzL2JwZi9icGZ0b29sL0RvY3VtZW50YXRpb24vYnBmdG9vbC1tYXAucnN0XG5AQCAtMTYsNyAmIzQzOzE2LDggQEAgU1lOT1BTSVNcbiBcbiAqKmJwZnRvb2wqKiBbKk9QVElPTlMqXSAqKm1hcCoqICpDT01NQU5EKlxuIFxuLSpPUFRJT05TKiA6PSB7IHxDT01NT05fT1BUSU9OU3wgfCB7ICoqLWYqKiB8ICoqLS1icGZmcyoqIH0gfCB7ICoqLW4qKiB8ICoqLS1ub21vdW50KiogfSB9XG4mIzQzOypPUFRJT05TKiA6PSB7IHxDT01NT05fT1BUSU9OU3wgfCB7ICoqLWYqKiB8ICoqLS1icGZmcyoqIH0gfFxuJiM0Mzt7ICoqLW4qKiB8ICoqLS1ub21vdW50KiogfSB8IHsgKiotcioqIHwgKiotLXJlY3Vyc2l2ZSoqIH0gfVxuIFxuICpDT01NQU5EUyogOj1cbiB7ICoqc2hvdyoqIHwgKipsaXN0KiogfCAqKmNyZWF0ZSoqIHwgKipkdW1wKiogfCAqKnVwZGF0ZSoqIHwgKipsb29rdXAqKiB8ICoqZ2V0bmV4dCoqIHxcbkBAIC0xNzAsNiAmIzQzOzE3MSwyNSBAQCBPUFRJT05TXG4gICAgIERvIG5vdCBhdXRvbWF0aWNhbGx5IGF0dGVtcHQgdG8gbW91bnQgYW55IHZpcnR1YWwgZmlsZSBzeXN0ZW0gKHN1Y2ggYXNcbiAgICAgdHJhY2VmcyBvciBCUEYgdmlydHVhbCBmaWxlIHN5c3RlbSkgd2hlbiBuZWNlc3NhcnkuXG4gXG4mIzQzOy1yLCAtLXJlY3Vyc2l2ZVxuJiM0MzsgICAgQWxzbyBkdW1wIHRoZSBpbm5lciBtYXBzIHJlZmVyZW5jZWQgYnkgKiphcnJheV9vZl9tYXBzKiogYW5kICoqaGFzaF9vZl9tYXBzKipcbiYjNDM7ICAgIGVudHJpZXMgd2hlbiBydW5uaW5nICoqbWFwIGR1bXAqKi4gRWFjaCBtYXAgSUQgaXMgdmlzaXRlZCBvbmNlLCBldmVuIGlmXG4mIzQzOyAgICBzZXZlcmFsIGVudHJpZXMgcmVmZXIgdG8gaXQuIFNlbGVjdGVkIG1hcHMgYXJlIGZvbGxvd2VkIGJ5IHRoZWlyIGlubmVyIG1hcHMuXG4mIzQzO1xuJiM0MzsgICAgUGxhaW4gb3V0cHV0IGluY2x1ZGVzIGEgaGVhZGVyIGlkZW50aWZ5aW5nIGVhY2ggbWFwLiBPbiBzdWNjZXNzLCBKU09OIG91dHB1dFxuJiM0MzsgICAgaXMgYWx3YXlzIGFuIGFycmF5IG9mIG1hcCBvYmplY3RzLCBlYWNoIGNvbnRhaW5pbmcgYW4gKippZCoqIGFuZCBhblxuJiM0MzsgICAgKiplbGVtZW50cyoqIGFycmF5LCBpbmNsdWRpbmcgd2hlbiBvbmx5IG9uZSBtYXAgaXMgZHVtcGVkLiBPdXRlciBtYXAgZW50cmllc1xuJiM0MzsgICAgcmV0YWluIHRoZWlyICoqaW5uZXJfbWFwX2lkKiogZmllbGQsIHdoaWNoIGlkZW50aWZpZXMgdGhlIGNvcnJlc3BvbmRpbmcgaW5uZXJcbiYjNDM7ICAgIG1hcCBvYmplY3QuXG4mIzQzO1xuJiM0MzsgICAgSW5uZXIgbWFwIElEcyBhcmUgcmVzb2x2ZWQgd2hlbiB0aGUgbWFwcyBhcmUgdmlzaXRlZC4gVGhlIGR1bXAgaXMgbm90IGFuXG4mIzQzOyAgICBhdG9taWMgc25hcHNob3Q6IGNvbmN1cnJlbnQgdXBkYXRlcyBjYW4gY2hhbmdlIG1hcCBjb250ZW50cyBvciByZW1vdmUgYVxuJiM0MzsgICAgcmVmZXJlbmNlZCBpbm5lciBtYXAgYmVmb3JlIGl0IGlzIHZpc2l0ZWQuIEZhaWx1cmUgdG8gb3BlbiBhIHJlZmVyZW5jZWRcbiYjNDM7ICAgIGlubmVyIG1hcCBzdG9wcyB0aGUgZHVtcCBhbmQgcmV0dXJucyBhIG5vbnplcm8gZXhpdCBzdGF0dXMuIE91dHB1dCBtYXlcbiYjNDM7ICAgIGNvbnRhaW4gbWFwcyBvciBlbnRyaWVzIHByaW50ZWQgYmVmb3JlIHRoZSBlcnJvci5cbiYjNDM7XG4mIzQzOyAgICBJbiBKU09OIG1vZGUsIHRoZSBlbmNsb3NpbmcgYXJyYXlzIGFuZCBvYmplY3RzIGFyZSBjbG9zZWQgYmVmb3JlIHJldHVybmluZy5cbiYjNDM7XG4gRVhBTVBMRVNcbiA9PT09PT09PVxuICoqIyBicGZ0b29sIG1hcCBzaG93KipcbmRpZmYgLS1naXQgYS90b29scy9icGYvYnBmdG9vbC9iYXNoLWNvbXBsZXRpb24vYnBmdG9vbCBiL3Rvb2xzL2JwZi9icGZ0b29sL2Jhc2gtY29tcGxldGlvbi9icGZ0b29sXG5pbmRleCA3NWNiY2I1MTJlYmFlLi40NWMzMzZkNjNiZTBhIDEwMDY0NFxuLS0tIGEvdG9vbHMvYnBmL2JwZnRvb2wvYmFzaC1jb21wbGV0aW9uL2JwZnRvb2xcbiYjNDM7JiM0MzsmIzQzOyBiL3Rvb2xzL2JwZi9icGZ0b29sL2Jhc2gtY29tcGxldGlvbi9icGZ0b29sXG5AQCAtMjYxLDcgJiM0MzsyNjEsNyBAQCBfYnBmdG9vbCgpXG4gXG4gICAgICMgRGVhbCB3aXRoIG9wdGlvbnNcbiAgICAgaWYgW1sgJHt3b3Jkc1tjd29yZF19ID09IC0qIF1dOyB0aGVuXG4tICAgICAgICBsb2NhbCBjPSYjMzk7LS12ZXJzaW9uIC0tanNvbiAtLXByZXR0eSAtLWJwZmZzIC0tbWFwY29tcGF0IC0tZGVidWcgXFxcbiYjNDM7ICAgICAgICBsb2NhbCBjPSYjMzk7LS12ZXJzaW9uIC0tanNvbiAtLXByZXR0eSAtLXJlY3Vyc2l2ZSAtLWJwZmZzIC0tbWFwY29tcGF0IC0tZGVidWcgXFxcbiAgICAgICAgICAgICAtLXVzZS1sb2FkZXIgLS1iYXNlLWJ0ZiAtLXNpZ24gLWkgLWsmIzM5O1xuICAgICAgICAgQ09NUFJFUExZPSggJCggY29tcGdlbiAtVyBcJiMzNDskY1wmIzM0OyAtLSBcJiMzNDskY3VyXCYjMzQ7ICkgKVxuICAgICAgICAgcmV0dXJuIDBcbmRpZmYgLS1naXQgYS90b29scy9icGYvYnBmdG9vbC9tYWluLmMgYi90b29scy9icGYvYnBmdG9vbC9tYWluLmNcbmluZGV4IDVhYmFiZDhmN2QwYTAuLmMwZjRkZjEwMTAyMTIgMTAwNjQ0XG4tLS0gYS90b29scy9icGYvYnBmdG9vbC9tYWluLmNcbiYjNDM7JiM0MzsmIzQzOyBiL3Rvb2xzL2JwZi9icGZ0b29sL21haW4uY1xuQEAgLTI2LDYgJiM0MzsyNiw3IEBAIHN0YXRpYyBpbnQgKCpsYXN0X2RvX2hlbHApKGludCBhcmdjLCBjaGFyICoqYXJndik7XG4ganNvbl93cml0ZXJfdCAqanNvbl93dHI7XG4gYm9vbCBwcmV0dHlfb3V0cHV0O1xuIGJvb2wganNvbl9vdXRwdXQ7XG4mIzQzO2Jvb2wgcmVjdXJzaXZlX2R1bXA7XG4gYm9vbCBzaG93X3Bpbm5lZDtcbiBib29sIGJsb2NrX21vdW50O1xuIGJvb2wgdmVyaWZpZXJfbG9ncztcbkBAIC00NTYsNiAmIzQzOzQ1Nyw3IEBAIGludCBtYWluKGludCBhcmdjLCBjaGFyICoqYXJndilcbiBcdFx0eyBcJiMzNDtqc29uXCYjMzQ7LFx0bm9fYXJndW1lbnQsXHROVUxMLFx0JiMzOTtqJiMzOTsgfSxcbiBcdFx0eyBcJiMzNDtoZWxwXCYjMzQ7LFx0bm9fYXJndW1lbnQsXHROVUxMLFx0JiMzOTtoJiMzOTsgfSxcbiBcdFx0eyBcJiMzNDtwcmV0dHlcJiMzNDssXHRub19hcmd1bWVudCxcdE5VTEwsXHQmIzM5O3AmIzM5OyB9LFxuJiM0MztcdFx0eyBcJiMzNDtyZWN1cnNpdmVcJiMzNDssXHRub19hcmd1bWVudCxcdE5VTEwsXHQmIzM5O3ImIzM5OyB9LFxuIFx0XHR7IFwmIzM0O3ZlcnNpb25cJiMzNDssXHRub19hcmd1bWVudCxcdE5VTEwsXHQmIzM5O1YmIzM5OyB9LFxuIFx0XHR7IFwmIzM0O2JwZmZzXCYjMzQ7LFx0bm9fYXJndW1lbnQsXHROVUxMLFx0JiMzOTtmJiMzOTsgfSxcbiBcdFx0eyBcJiMzNDttYXBjb21wYXRcJiMzNDssXHRub19hcmd1bWVudCxcdE5VTEwsXHQmIzM5O20mIzM5OyB9LFxuQEAgLTQ3OSw3ICYjNDM7NDgxLDcgQEAgaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KVxuIFx0YmluX25hbWUgPSBcJiMzNDticGZ0b29sXCYjMzQ7O1xuIFxuIFx0b3B0ZXJyID0gMDtcbi1cdHdoaWxlICgob3B0ID0gZ2V0b3B0X2xvbmcoYXJnYywgYXJndiwgXCYjMzQ7VmhwamZMbW5kU2k6azpCOmxcJiMzNDssXG4mIzQzO1x0d2hpbGUgKChvcHQgPSBnZXRvcHRfbG9uZyhhcmdjLCBhcmd2LCBcJiMzNDtWaHBqcmZMbW5kU2k6azpCOmxcJiMzNDssXG4gXHRcdFx0XHQgIG9wdGlvbnMsIE5VTEwpKSBcdTAwM2U9IDApIHtcbiBcdFx0c3dpdGNoIChvcHQpIHtcbiBcdFx0Y2FzZSAmIzM5O1YmIzM5OzpcbkBAIC01MDEsNiAmIzQzOzUwMyw5IEBAIGludCBtYWluKGludCBhcmdjLCBjaGFyICoqYXJndilcbiBcdFx0XHR9XG4gXHRcdFx0anNvbndfcHJldHR5KGpzb25fd3RyLCBwcmV0dHlfb3V0cHV0KTtcbiBcdFx0XHRicmVhaztcbiYjNDM7XHRcdGNhc2UgJiMzOTtyJiMzOTs6XG4mIzQzO1x0XHRcdHJlY3Vyc2l2ZV9kdW1wID0gdHJ1ZTtcbiYjNDM7XHRcdFx0YnJlYWs7XG4gXHRcdGNhc2UgJiMzOTtmJiMzOTs6XG4gXHRcdFx0c2hvd19waW5uZWQgPSB0cnVlO1xuIFx0XHRcdGJyZWFrO1xuZGlmZiAtLWdpdCBhL3Rvb2xzL2JwZi9icGZ0b29sL21haW4uaCBiL3Rvb2xzL2JwZi9icGZ0b29sL21haW4uaFxuaW5kZXggOTMxNWExZGIxZjdjMi4uNDNlZjBhYTU5MmRiNiAxMDA2NDRcbi0tLSBhL3Rvb2xzL2JwZi9icGZ0b29sL21haW4uaFxuJiM0MzsmIzQzOyYjNDM7IGIvdG9vbHMvYnBmL2JwZnRvb2wvbWFpbi5oXG5AQCAtODMsNiAmIzQzOzgzLDcgQEAgZXh0ZXJuIGNvbnN0IGNoYXIgKmJpbl9uYW1lO1xuIFxuIGV4dGVybiBqc29uX3dyaXRlcl90ICpqc29uX3d0cjtcbiBleHRlcm4gYm9vbCBqc29uX291dHB1dDtcbiYjNDM7ZXh0ZXJuIGJvb2wgcmVjdXJzaXZlX2R1bXA7XG4gZXh0ZXJuIGJvb2wgc2hvd19waW5uZWQ7XG4gZXh0ZXJuIGJvb2wgc2hvd19waWRzO1xuIGV4dGVybiBib29sIGJsb2NrX21vdW50O1xuZGlmZiAtLWdpdCBhL3Rvb2xzL2JwZi9icGZ0b29sL21hcC5jIGIvdG9vbHMvYnBmL2JwZnRvb2wvbWFwLmNcbmluZGV4IDY4NGE4ZmI3MjQxNDYuLmMwNTA1ZjUwNDk2NzQgMTAwNjQ0XG4tLS0gYS90b29scy9icGYvYnBmdG9vbC9tYXAuY1xuJiM0MzsmIzQzOyYjNDM7IGIvdG9vbHMvYnBmL2JwZnRvb2wvbWFwLmNcbkBAIC0xNyw2ICYjNDM7MTcsNyBAQFxuICNpbmNsdWRlIFx1MDAzY2JwZi9icGYuaFx1MDAzZVxuICNpbmNsdWRlIFx1MDAzY2JwZi9idGYuaFx1MDAzZVxuICNpbmNsdWRlIFx1MDAzY2JwZi9oYXNobWFwLmhcdTAwM2VcbiYjNDM7I2luY2x1ZGUgXHUwMDNjYnBmL2xpYmJwZl9pbnRlcm5hbC5oXHUwMDNlXG4gXG4gI2luY2x1ZGUgXCYjMzQ7anNvbl93cml0ZXIuaFwmIzM0O1xuICNpbmNsdWRlIFwmIzM0O21haW4uaFwmIzM0O1xuQEAgLTgyNiwxMiAmIzQzOzgyNyw0NCBAQCBzdGF0aWMgdm9pZCBmcmVlX21hcF9rdl9idGYoc3RydWN0IGJ0ZiAqYnRmKVxuIFx0XHRidGZfX2ZyZWUoYnRmKTtcbiB9XG4gXG4mIzQzO3N0cnVjdCBtYXBfZHVtcF9jdHgge1xuJiM0MztcdHN0cnVjdCBoYXNobWFwICpzZWVuO1xuJiM0MztcdF9fdTMyICpwZW5kaW5nX2lkcztcbiYjNDM7XHRzaXplX3QgcGVuZGluZ19jbnQ7XG4mIzQzO307XG4mIzQzO1xuJiM0MztzdGF0aWMgaW50IGNvbGxlY3RfaW5uZXJfbWFwKHN0cnVjdCBtYXBfZHVtcF9jdHggKmN0eCwgX191MzIgaWQpXG4mIzQzO3tcbiYjNDM7XHRfX3UzMiAqaWRzO1xuJiM0MztcdGludCBlcnI7XG4mIzQzO1xuJiM0MztcdGlmIChoYXNobWFwX19maW5kKGN0eC1cdTAwM2VzZWVuLCBpZCwgTlVMTCkpXG4mIzQzO1x0XHRyZXR1cm4gMDtcbiYjNDM7XG4mIzQzO1x0aWRzID0gbGliYnBmX3JlYWxsb2NhcnJheShjdHgtXHUwMDNlcGVuZGluZ19pZHMsIGN0eC1cdTAwM2VwZW5kaW5nX2NudCAmIzQzOyAxLFxuJiM0MztcdFx0XHRcdCAgc2l6ZW9mKCppZHMpKTtcbiYjNDM7XHRpZiAoIWlkcykge1xuJiM0MztcdFx0cF9lcnIoXCYjMzQ7bWVtIGFsbG9jIGZhaWxlZFwmIzM0Oyk7XG4mIzQzO1x0XHRyZXR1cm4gLTE7XG4mIzQzO1x0fVxuJiM0MztcdGN0eC1cdTAwM2VwZW5kaW5nX2lkcyA9IGlkcztcbiYjNDM7XG4mIzQzO1x0ZXJyID0gaGFzaG1hcF9fYWRkKGN0eC1cdTAwM2VzZWVuLCBpZCwgMCk7XG4mIzQzO1x0aWYgKGVycikge1xuJiM0MztcdFx0cF9lcnIoXCYjMzQ7ZmFpbGVkIHRvIHJlY29yZCBpbm5lciBtYXAgaWQgJXU6ICVzXCYjMzQ7LCBpZCwgc3RyZXJyb3IoLWVycikpO1xuJiM0MztcdFx0cmV0dXJuIC0xO1xuJiM0MztcdH1cbiYjNDM7XHRpZHNbY3R4LVx1MDAzZXBlbmRpbmdfY250JiM0MzsmIzQzO10gPSBpZDtcbiYjNDM7XHRyZXR1cm4gMDtcbiYjNDM7fVxuJiM0MztcbiBzdGF0aWMgaW50XG4gbWFwX2R1bXAoaW50IGZkLCBzdHJ1Y3QgYnBmX21hcF9pbmZvICppbmZvLCBqc29uX3dyaXRlcl90ICp3dHIsXG4tXHQgYm9vbCBzaG93X2hlYWRlcilcbiYjNDM7XHQgYm9vbCBzaG93X2hlYWRlciwgc3RydWN0IG1hcF9kdW1wX2N0eCAqY3R4KVxuIHtcbiBcdHZvaWQgKmtleSwgKnZhbHVlLCAqcHJldl9rZXk7XG4gXHR1bnNpZ25lZCBpbnQgbnVtX2VsZW1zID0gMDtcbiYjNDM7XHRqc29uX3dyaXRlcl90ICpwbGFpbl9idGZfd3RyID0gTlVMTDtcbiBcdHN0cnVjdCBidGYgKmJ0ZiA9IE5VTEw7XG4gXHRpbnQgZXJyO1xuIFxuQEAgLTg0NSw2ICYjNDM7ODc4LDE3IEBAIG1hcF9kdW1wKGludCBmZCwgc3RydWN0IGJwZl9tYXBfaW5mbyAqaW5mbywganNvbl93cml0ZXJfdCAqd3RyLFxuIFxuIFx0cHJldl9rZXkgPSBOVUxMO1xuIFxuJiM0MztcdGlmIChjdHggXHUwMDI2XHUwMDI2ICF3dHIgXHUwMDI2XHUwMDI2IChpbmZvLVx1MDAzZWJ0Zl92YWx1ZV90eXBlX2lkIHx8XG4mIzQzO1x0XHRcdCAgICBpbmZvLVx1MDAzZWJ0Zl92bWxpbnV4X3ZhbHVlX3R5cGVfaWQpKSB7XG4mIzQzO1x0XHRwbGFpbl9idGZfd3RyID0gZ2V0X2J0Zl93cml0ZXIoKTtcbiYjNDM7XHRcdGlmIChwbGFpbl9idGZfd3RyKSB7XG4mIzQzO1x0XHRcdGlmIChzaG93X2hlYWRlcilcbiYjNDM7XHRcdFx0XHRzaG93X21hcF9oZWFkZXJfcGxhaW4oaW5mbyk7XG4mIzQzO1x0XHRcdHNob3dfaGVhZGVyID0gZmFsc2U7XG4mIzQzO1x0XHRcdHd0ciA9IHBsYWluX2J0Zl93dHI7XG4mIzQzO1x0XHR9XG4mIzQzO1x0fVxuJiM0MztcbiBcdGlmICh3dHIpIHtcbiBcdFx0ZXJyID0gZ2V0X21hcF9rdl9idGYoaW5mbywgXHUwMDI2YnRmKTtcbiBcdFx0aWYgKGVycikge1xuQEAgLTg3NCwxMCAmIzQzOzkxOCwyMCBAQCBtYXBfZHVtcChpbnQgZmQsIHN0cnVjdCBicGZfbWFwX2luZm8gKmluZm8sIGpzb25fd3JpdGVyX3QgKnd0cixcbiBcdFx0aWYgKGVycikge1xuIFx0XHRcdGlmIChlcnJubyA9PSBFTk9FTlQpXG4gXHRcdFx0XHRlcnIgPSAwO1xuJiM0MztcdFx0XHRlbHNlIGlmIChjdHgpXG4mIzQzO1x0XHRcdFx0cF9lcnIoXCYjMzQ7Y2FuJiMzOTt0IGdldCBuZXh0IGtleSBmb3IgbWFwIGlkICV1OiAlc1wmIzM0OyxcbiYjNDM7XHRcdFx0XHQgICAgICBpbmZvLVx1MDAzZWlkLCBzdHJlcnJvcihlcnJubykpO1xuIFx0XHRcdGJyZWFrO1xuIFx0XHR9XG4tXHRcdGlmICghZHVtcF9tYXBfZWxlbShmZCwga2V5LCB2YWx1ZSwgaW5mbywgYnRmLCB3dHIpKVxuJiM0MztcdFx0ZXJyID0gZHVtcF9tYXBfZWxlbShmZCwga2V5LCB2YWx1ZSwgaW5mbywgYnRmLCB3dHIpO1xuJiM0MztcdFx0aWYgKCFlcnIpIHtcbiBcdFx0XHRudW1fZWxlbXMmIzQzOyYjNDM7O1xuJiM0MztcdFx0XHRpZiAoY3R4IFx1MDAyNlx1MDAyNiBtYXBfaXNfbWFwX29mX21hcHMoaW5mby1cdTAwM2V0eXBlKSkge1xuJiM0MztcdFx0XHRcdGVyciA9IGNvbGxlY3RfaW5uZXJfbWFwKGN0eCwgKihfX3UzMiAqKXZhbHVlKTtcbiYjNDM7XHRcdFx0XHRpZiAoZXJyKVxuJiM0MztcdFx0XHRcdFx0YnJlYWs7XG4mIzQzO1x0XHRcdH1cbiYjNDM7XHRcdH1cbiBcdFx0cHJldl9rZXkgPSBrZXk7XG4gXHR9XG4gXG5AQCAtODk0LDE4ICYjNDM7OTQ4LDI1IEBAIG1hcF9kdW1wKGludCBmZCwgc3RydWN0IGJwZl9tYXBfaW5mbyAqaW5mbywganNvbl93cml0ZXJfdCAqd3RyLFxuIFx0ZnJlZShrZXkpO1xuIFx0ZnJlZSh2YWx1ZSk7XG4gXHRmcmVlX21hcF9rdl9idGYoYnRmKTtcbiYjNDM7XHRpZiAocGxhaW5fYnRmX3d0cilcbiYjNDM7XHRcdGpzb253X2Rlc3Ryb3koXHUwMDI2cGxhaW5fYnRmX3d0cik7XG4gXG4gXHRyZXR1cm4gZXJyO1xuIH1cbiBcbiBzdGF0aWMgaW50IGRvX2R1bXAoaW50IGFyZ2MsIGNoYXIgKiphcmd2KVxuIHtcbiYjNDM7XHRMSUJCUEZfT1BUUyhicGZfZ2V0X2ZkX2J5X2lkX29wdHMsIG9wdHMsXG4mIzQzO1x0XHQgICAgLm9wZW5fZmxhZ3MgPSBCUEZfRl9SRE9OTFksXG4mIzQzO1x0KTtcbiBcdGpzb25fd3JpdGVyX3QgKnd0ciA9IE5VTEwsICpidGZfd3RyID0gTlVMTDtcbiBcdHN0cnVjdCBicGZfbWFwX2luZm8gaW5mbyA9IHt9O1xuJiM0MztcdHN0cnVjdCBtYXBfZHVtcF9jdHggY3R4ID0ge307XG4gXHRpbnQgbmJfZmRzLCBpID0gMDtcbiBcdF9fdTMyIGxlbiA9IHNpemVvZihpbmZvKTtcbiBcdGludCAqZmRzID0gTlVMTDtcbiBcdGludCBlcnIgPSAtMTtcbiYjNDM7XHRzaXplX3QgajtcbiBcbiBcdGlmIChhcmdjICE9IDIpXG4gXHRcdHVzYWdlKCk7XG5AQCAtOTE5LDkgJiM0Mzs5ODAsMzUgQEAgc3RhdGljIGludCBkb19kdW1wKGludCBhcmdjLCBjaGFyICoqYXJndilcbiBcdGlmIChuYl9mZHMgXHUwMDNjIDEpXG4gXHRcdGdvdG8gZXhpdF9mcmVlO1xuIFxuJiM0MztcdGlmIChyZWN1cnNpdmVfZHVtcCkge1xuJiM0MztcdFx0Y3R4LnNlZW4gPSBoYXNobWFwX19uZXcoaGFzaF9mbl9mb3Jfa2V5X2FzX2lkLFxuJiM0MztcdFx0XHRcdFx0ZXF1YWxfZm5fZm9yX2tleV9hc19pZCwgTlVMTCk7XG4mIzQzO1x0XHRpZiAoSVNfRVJSKGN0eC5zZWVuKSkge1xuJiM0MztcdFx0XHRjdHguc2VlbiA9IE5VTEw7XG4mIzQzO1x0XHRcdHBfZXJyKFwmIzM0O2ZhaWxlZCB0byBjcmVhdGUgaGFzaG1hcCBmb3IgcmVjdXJzaXZlIGR1bXBcJiMzNDspO1xuJiM0MztcdFx0XHRnb3RvIGV4aXRfY2xvc2U7XG4mIzQzO1x0XHR9XG4mIzQzO1x0XHQvKiBSZWNvcmQgdGhlIHNlbGVjdGVkIG1hcHMgYmVmb3JlIGRpc2NvdmVyaW5nIGFueSBpbm5lciBtYXBzLiAqL1xuJiM0MztcdFx0Zm9yIChpID0gMDsgaSBcdTAwM2MgbmJfZmRzOyBpJiM0MzsmIzQzOykge1xuJiM0MztcdFx0XHRsZW4gPSBzaXplb2YoaW5mbyk7XG4mIzQzO1x0XHRcdGlmIChicGZfbWFwX2dldF9pbmZvX2J5X2ZkKGZkc1tpXSwgXHUwMDI2aW5mbywgXHUwMDI2bGVuKSkge1xuJiM0MztcdFx0XHRcdHBfZXJyKFwmIzM0O2NhbiYjMzk7dCBnZXQgbWFwIGluZm86ICVzXCYjMzQ7LCBzdHJlcnJvcihlcnJubykpO1xuJiM0MztcdFx0XHRcdGVyciA9IC0xO1xuJiM0MztcdFx0XHRcdGdvdG8gZXhpdF9jbG9zZTtcbiYjNDM7XHRcdFx0fVxuJiM0MztcdFx0XHRlcnIgPSBoYXNobWFwX19hZGQoY3R4LnNlZW4sIGluZm8uaWQsIDApO1xuJiM0MztcdFx0XHRpZiAoZXJyKSB7XG4mIzQzO1x0XHRcdFx0cF9lcnIoXCYjMzQ7ZmFpbGVkIHRvIHJlY29yZCBtYXAgaWQgJXU6ICVzXCYjMzQ7LCBpbmZvLmlkLFxuJiM0MztcdFx0XHRcdCAgICAgIHN0cmVycm9yKC1lcnIpKTtcbiYjNDM7XHRcdFx0XHRlcnIgPSAtMTtcbiYjNDM7XHRcdFx0XHRnb3RvIGV4aXRfY2xvc2U7XG4mIzQzO1x0XHRcdH1cbiYjNDM7XHRcdH1cbiYjNDM7XHR9XG4mIzQzO1xuIFx0aWYgKGpzb25fb3V0cHV0KSB7XG4gXHRcdHd0ciA9IGpzb25fd3RyO1xuLVx0fSBlbHNlIHtcbiYjNDM7XHR9IGVsc2UgaWYgKCFyZWN1cnNpdmVfZHVtcCkge1xuIFx0XHRpbnQgZG9fcGxhaW5fYnRmO1xuIFxuIFx0XHRkb19wbGFpbl9idGYgPSBtYXBzX2hhdmVfYnRmKGZkcywgbmJfZmRzKTtcbkBAIC05MzYsNyAmIzQzOzEwMjMsNyBAQCBzdGF0aWMgaW50IGRvX2R1bXAoaW50IGFyZ2MsIGNoYXIgKiphcmd2KVxuIFx0XHR9XG4gXHR9XG4gXG4tXHRpZiAod3RyIFx1MDAyNlx1MDAyNiBuYl9mZHMgXHUwMDNlIDEpXG4mIzQzO1x0aWYgKHd0ciBcdTAwMjZcdTAwMjYgKG5iX2ZkcyBcdTAwM2UgMSB8fCByZWN1cnNpdmVfZHVtcCkpXG4gXHRcdGpzb253X3N0YXJ0X2FycmF5KHd0cik7XHQvKiByb290IGFycmF5ICovXG4gXHRmb3IgKGkgPSAwOyBpIFx1MDAzYyBuYl9mZHM7IGkmIzQzOyYjNDM7KSB7XG4gXHRcdGlmIChicGZfbWFwX2dldF9pbmZvX2J5X2ZkKGZkc1tpXSwgXHUwMDI2aW5mbywgXHUwMDI2bGVuKSkge1xuQEAgLTk0NCwyMiAmIzQzOzEwMzEsNTAgQEAgc3RhdGljIGludCBkb19kdW1wKGludCBhcmdjLCBjaGFyICoqYXJndilcbiBcdFx0XHRlcnIgPSAtMTtcbiBcdFx0XHRicmVhaztcbiBcdFx0fVxuLVx0XHRlcnIgPSBtYXBfZHVtcChmZHNbaV0sIFx1MDAyNmluZm8sIHd0ciwgbmJfZmRzIFx1MDAzZSAxKTtcbiYjNDM7XHRcdGVyciA9IG1hcF9kdW1wKGZkc1tpXSwgXHUwMDI2aW5mbywgd3RyLCBuYl9mZHMgXHUwMDNlIDEgfHwgcmVjdXJzaXZlX2R1bXAsXG4mIzQzO1x0XHRcdCAgICAgICByZWN1cnNpdmVfZHVtcCA/IFx1MDAyNmN0eCA6IE5VTEwpO1xuIFx0XHRpZiAoIXd0ciBcdTAwMjZcdTAwMjYgaSAhPSBuYl9mZHMgLSAxKVxuIFx0XHRcdHByaW50ZihcJiMzNDtcXG5cJiMzNDspO1xuIFxuIFx0XHRpZiAoZXJyKVxuIFx0XHRcdGJyZWFrO1xuLVx0XHRjbG9zZShmZHNbaV0pO1xuJiM0MztcdFx0LyogS2VlcCBzZWxlY3RlZCBtYXBzIGFsaXZlIHdoaWxlIHZpc2l0aW5nIHRoZWlyIGlubmVyIG1hcHMuICovXG4mIzQzO1x0XHRpZiAoIXJlY3Vyc2l2ZV9kdW1wKVxuJiM0MztcdFx0XHRjbG9zZShmZHNbaV0pO1xuJiM0MztcdH1cbiYjNDM7XHRmb3IgKGogPSAwOyAhZXJyIFx1MDAyNlx1MDAyNiBqIFx1MDAzYyBjdHgucGVuZGluZ19jbnQ7IGomIzQzOyYjNDM7KSB7XG4mIzQzO1x0XHRpbnQgZmQ7XG4mIzQzO1xuJiM0MztcdFx0ZmQgPSBicGZfbWFwX2dldF9mZF9ieV9pZF9vcHRzKGN0eC5wZW5kaW5nX2lkc1tqXSwgXHUwMDI2b3B0cyk7XG4mIzQzO1x0XHRpZiAoZmQgXHUwMDNjIDApIHtcbiYjNDM7XHRcdFx0cF9lcnIoXCYjMzQ7Y2FuJiMzOTt0IG9wZW4gaW5uZXIgbWFwIGlkICV1OiAlc1wmIzM0OyxcbiYjNDM7XHRcdFx0ICAgICAgY3R4LnBlbmRpbmdfaWRzW2pdLCBzdHJlcnJvcihlcnJubykpO1xuJiM0MztcdFx0XHRlcnIgPSAtMTtcbiYjNDM7XHRcdFx0YnJlYWs7XG4mIzQzO1x0XHR9XG4mIzQzO1x0XHRsZW4gPSBzaXplb2YoaW5mbyk7XG4mIzQzO1x0XHRpZiAoYnBmX21hcF9nZXRfaW5mb19ieV9mZChmZCwgXHUwMDI2aW5mbywgXHUwMDI2bGVuKSkge1xuJiM0MztcdFx0XHRwX2VycihcJiMzNDtjYW4mIzM5O3QgZ2V0IG1hcCBpbmZvOiAlc1wmIzM0Oywgc3RyZXJyb3IoZXJybm8pKTtcbiYjNDM7XHRcdFx0ZXJyID0gLTE7XG4mIzQzO1x0XHR9IGVsc2Uge1xuJiM0MztcdFx0XHRpZiAoIXd0cilcbiYjNDM7XHRcdFx0XHRwcmludGYoXCYjMzQ7XFxuXCYjMzQ7KTtcbiYjNDM7XHRcdFx0ZXJyID0gbWFwX2R1bXAoZmQsIFx1MDAyNmluZm8sIHd0ciwgdHJ1ZSwgXHUwMDI2Y3R4KTtcbiYjNDM7XHRcdH1cbiYjNDM7XHRcdGNsb3NlKGZkKTtcbiBcdH1cbi1cdGlmICh3dHIgXHUwMDI2XHUwMDI2IG5iX2ZkcyBcdTAwM2UgMSlcbiYjNDM7XHRpZiAod3RyIFx1MDAyNlx1MDAyNiAobmJfZmRzIFx1MDAzZSAxIHx8IHJlY3Vyc2l2ZV9kdW1wKSlcbiBcdFx0anNvbndfZW5kX2FycmF5KHd0cik7XHQvKiByb290IGFycmF5ICovXG4gXG4gXHRpZiAoYnRmX3d0cilcbiBcdFx0anNvbndfZGVzdHJveShcdTAwMjZidGZfd3RyKTtcbiBleGl0X2Nsb3NlOlxuJiM0MztcdGlmIChyZWN1cnNpdmVfZHVtcClcbiYjNDM7XHRcdGkgPSAwO1xuIFx0Zm9yICg7IGkgXHUwMDNjIG5iX2ZkczsgaSYjNDM7JiM0MzspXG4gXHRcdGNsb3NlKGZkc1tpXSk7XG4mIzQzO1x0aGFzaG1hcF9fZnJlZShjdHguc2Vlbik7XG4mIzQzO1x0ZnJlZShjdHgucGVuZGluZ19pZHMpO1xuIGV4aXRfZnJlZTpcbiBcdGZyZWUoZmRzKTtcbiBcdGZyZWVfYnRmX3ZtbGludXgoKTtcbkBAIC0xNDg0LDcgJiM0MzsxNTk5LDcgQEAgc3RhdGljIGludCBkb19oZWxwKGludCBhcmdjLCBjaGFyICoqYXJndilcbiBcdFx0XCYjMzQ7ICAgICAgICAgICAgICAgICB0YXNrX3N0b3JhZ2UgfCBibG9vbV9maWx0ZXIgfCB1c2VyX3JpbmdidWYgfCBjZ3JwX3N0b3JhZ2UgfCBhcmVuYSB8XFxuXCYjMzQ7XG4gXHRcdFwmIzM0OyAgICAgICAgICAgICAgICAgaW5zbl9hcnJheSB8IHJoYXNoIH1cXG5cJiMzNDtcbiBcdFx0XCYjMzQ7ICAgICAgIFwmIzM0OyBIRUxQX1NQRUNfT1BUSU9OUyBcJiMzNDsgfFxcblwmIzM0O1xuLVx0XHRcJiMzNDsgICAgICAgICAgICAgICAgICAgIHstZnwtLWJwZmZzfSB8IHstbnwtLW5vbW91bnR9IH1cXG5cJiMzNDtcbiYjNDM7XHRcdFwmIzM0OyAgICAgICAgICAgICAgICAgICAgey1mfC0tYnBmZnN9IHwgey1ufC0tbm9tb3VudH0gfCB7LXJ8LS1yZWN1cnNpdmV9IH1cXG5cJiMzNDtcbiBcdFx0XCYjMzQ7XCYjMzQ7LFxuIFx0XHRiaW5fbmFtZSwgYXJndlstMl0pO1xuIFxuZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9wcm9nX3Rlc3RzL2JwZnRvb2xfbWFwX2R1bXAuYyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9wcm9nX3Rlc3RzL2JwZnRvb2xfbWFwX2R1bXAuY1xubmV3IGZpbGUgbW9kZSAxMDA2NDRcbmluZGV4IDAwMDAwMDAwMDAwMDAuLjFmYjg3N2ZjNjhjODNcbi0tLSAvZGV2L251bGxcbiYjNDM7JiM0MzsmIzQzOyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9wcm9nX3Rlc3RzL2JwZnRvb2xfbWFwX2R1bXAuY1xuQEAgLTAsMCAmIzQzOzEsNDc0IEBAXG4mIzQzOy8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4wLW9ubHlcbiYjNDM7I2luY2x1ZGUgXHUwMDNjdGVzdF9wcm9ncy5oXHUwMDNlXG4mIzQzOyNpbmNsdWRlIFx1MDAzY2JwZnRvb2xfaGVscGVycy5oXHUwMDNlXG4mIzQzOyNpbmNsdWRlIFx1MDAzY2JwZi9idGYuaFx1MDAzZVxuJiM0MzsjaW5jbHVkZSBcdTAwM2NzeXMvcmVzb3VyY2UuaFx1MDAzZVxuJiM0MzsjaW5jbHVkZSBcdTAwM2NkaXJlbnQuaFx1MDAzZVxuJiM0MztcbiYjNDM7I2RlZmluZSBPVVRQVVRfU0laRSA4MTkyXG4mIzQzO1xuJiM0MztzdGF0aWMgYm9vbCBkdW1wX21hcChfX3UzMiBpZCwgY29uc3QgY2hhciAqb3B0aW9ucywgY2hhciAqb3V0cHV0KVxuJiM0Mzt7XG4mIzQzO1x0Y2hhciBjb21tYW5kW01BWF9CUEZUT09MX0NNRF9MRU5dO1xuJiM0MztcbiYjNDM7XHRzbnByaW50Zihjb21tYW5kLCBzaXplb2YoY29tbWFuZCksIFwmIzM0OyVzIG1hcCBkdW1wIGlkICV1XCYjMzQ7LCBvcHRpb25zLCBpZCk7XG4mIzQzO1x0bWVtc2V0KG91dHB1dCwgMCwgT1VUUFVUX1NJWkUpO1xuJiM0MztcdGlmICghQVNTRVJUX09LKGdldF9icGZ0b29sX2NvbW1hbmRfb3V0cHV0KGNvbW1hbmQsIG91dHB1dCwgT1VUUFVUX1NJWkUgLSAxKSxcbiYjNDM7XHRcdCAgICAgICBcJiMzNDtkdW1wX21hcFwmIzM0OykpXG4mIzQzO1x0XHRyZXR1cm4gZmFsc2U7XG4mIzQzO1x0LyogVGhlIGhlbHBlciBsZWF2ZXMgdGhlIHRyYWlsaW5nIG5ld2xpbmUgaW4gcGxhY2UuICovXG4mIzQzO1x0b3V0cHV0W3N0cmNzcG4ob3V0cHV0LCBcJiMzNDtcXG5cJiMzNDspXSA9ICYjMzk7XFwwJiMzOTs7XG4mIzQzO1x0cmV0dXJuIHRydWU7XG4mIzQzO31cbiYjNDM7XG4mIzQzO3N0YXRpYyBfX3UzMiBtYXBfaWQoaW50IGZkKVxuJiM0Mzt7XG4mIzQzO1x0c3RydWN0IGJwZl9tYXBfaW5mbyBpbmZvID0ge307XG4mIzQzO1x0X191MzIgbGVuID0gc2l6ZW9mKGluZm8pO1xuJiM0MztcbiYjNDM7XHRpZiAoIUFTU0VSVF9PSyhicGZfbWFwX2dldF9pbmZvX2J5X2ZkKGZkLCBcdTAwMjZpbmZvLCBcdTAwMjZsZW4pLCBcJiMzNDttYXBfaW5mb1wmIzM0OykpXG4mIzQzO1x0XHRyZXR1cm4gMDtcbiYjNDM7XHRyZXR1cm4gaW5mby5pZDtcbiYjNDM7fVxuJiM0MztcbiYjNDM7c3RhdGljIGludCBjb3VudF90b2tlbihjb25zdCBjaGFyICpvdXRwdXQsIGNvbnN0IGNoYXIgKnRva2VuKVxuJiM0Mzt7XG4mIzQzO1x0aW50IGNvdW50ID0gMDtcbiYjNDM7XG4mIzQzO1x0d2hpbGUgKChvdXRwdXQgPSBzdHJzdHIob3V0cHV0LCB0b2tlbikpKSB7XG4mIzQzO1x0XHRjb3VudCYjNDM7JiM0Mzs7XG4mIzQzO1x0XHRvdXRwdXQgJiM0Mzs9IHN0cmxlbih0b2tlbik7XG4mIzQzO1x0fVxuJiM0MztcdHJldHVybiBjb3VudDtcbiYjNDM7fVxuJiM0MztcbiYjNDM7c3RhdGljIHZvaWQgY2hlY2tfcGxhaW4oX191MzIgcm9vdF9pZCwgX191MzIgaW5uZXJfaWQsIGNvbnN0IGNoYXIgKnR5cGUsXG4mIzQzO1x0XHRcdGludCBlbnRyaWVzLCBib29sIHR5cGVkKVxuJiM0Mzt7XG4mIzQzO1x0Y2hhciBjb21tYW5kW01BWF9CUEZUT09MX0NNRF9MRU5dLCBoZWFkZXJbMTI4XTtcbiYjNDM7XHRjaGFyIG91dHB1dFtPVVRQVVRfU0laRV0gPSB7fTtcbiYjNDM7XHRjb25zdCBjaGFyICpyb290LCAqaW5uZXI7XG4mIzQzO1xuJiM0MztcdHNucHJpbnRmKGNvbW1hbmQsIHNpemVvZihjb21tYW5kKSwgXCYjMzQ7LS1yZWN1cnNpdmUgbWFwIGR1bXAgaWQgJXVcJiMzNDssIHJvb3RfaWQpO1xuJiM0MztcdGlmICghQVNTRVJUX09LKGdldF9icGZ0b29sX2NvbW1hbmRfb3V0cHV0KGNvbW1hbmQsIG91dHB1dCwgc2l6ZW9mKG91dHB1dCkgLSAxKSxcbiYjNDM7XHRcdCAgICAgICBcJiMzNDtwbGFpbl9kdW1wXCYjMzQ7KSlcbiYjNDM7XHRcdHJldHVybjtcbiYjNDM7XHRzbnByaW50ZihoZWFkZXIsIHNpemVvZihoZWFkZXIpLCBcJiMzNDsldTogJXMgIG5hbWUgZHVtcF9vdXRlciAgXCYjMzQ7LCByb290X2lkLCB0eXBlKTtcbiYjNDM7XHRyb290ID0gc3Ryc3RyKG91dHB1dCwgaGVhZGVyKTtcbiYjNDM7XHRpZiAoIUFTU0VSVF9PS19QVFIocm9vdCwgXCYjMzQ7cGxhaW5fcm9vdF9oZWFkZXJcJiMzNDspKVxuJiM0MztcdFx0cmV0dXJuO1xuJiM0MztcdEFTU0VSVF9FUShyb290IC0gb3V0cHV0LCAwLCBcJiMzNDtwbGFpbl9yb290X2ZpcnN0XCYjMzQ7KTtcbiYjNDM7XHRBU1NFUlRfRVEoY291bnRfdG9rZW4ob3V0cHV0LCBcJiMzNDtpbm5lcl9tYXBfaWQ6XCYjMzQ7KSwgZW50cmllcywgXCYjMzQ7cGxhaW5fcmVmZXJlbmNlc1wmIzM0Oyk7XG4mIzQzO1x0aWYgKGVudHJpZXMpIHtcbiYjNDM7XHRcdHNucHJpbnRmKGhlYWRlciwgc2l6ZW9mKGhlYWRlciksIFwmIzM0OyV1OiBoYXNoICBuYW1lIGR1bXBfaW5uZXIgIFwmIzM0OywgaW5uZXJfaWQpO1xuJiM0MztcdFx0aW5uZXIgPSBzdHJzdHIob3V0cHV0LCBoZWFkZXIpO1xuJiM0MztcdFx0aWYgKEFTU0VSVF9PS19QVFIoaW5uZXIsIFwmIzM0O3BsYWluX2lubmVyX2hlYWRlclwmIzM0OykpXG4mIzQzO1x0XHRcdEFTU0VSVF9HVChpbm5lciAtIHJvb3QsIDAsIFwmIzM0O3BsYWluX2lubmVyX2FmdGVyX3Jvb3RcJiMzNDspO1xuJiM0MztcdFx0QVNTRVJUX0VRKGNvdW50X3Rva2VuKG91dHB1dCwgaGVhZGVyKSwgMSwgXCYjMzQ7cGxhaW5faW5uZXJfb25jZVwmIzM0Oyk7XG4mIzQzO1x0fVxuJiM0MztcdEFTU0VSVF9FUShjb3VudF90b2tlbihvdXRwdXQsIFwmIzM0O0ZvdW5kIFwmIzM0OyksIGVudHJpZXMgXHUwMDI2XHUwMDI2ICF0eXBlZCA/IDIgOiAxLFxuJiM0MztcdFx0ICBcJiMzNDtwbGFpbl9tYXBfY291bnRcJiMzNDspO1xuJiM0MztcdGlmICh0eXBlZCkge1xuJiM0MztcdFx0QVNTRVJUX0hBU19TVUJTVFIob3V0cHV0LCBcJiMzNDtcXFwmIzM0O2tleVxcXCYjMzQ7OiAwXCYjMzQ7LCBcJiMzNDtwbGFpbl9idGZfa2V5XCYjMzQ7KTtcbiYjNDM7XHRcdEFTU0VSVF9IQVNfU1VCU1RSKG91dHB1dCwgXCYjMzQ7XFxcJiMzNDt2YWx1ZVxcXCYjMzQ7OiAxNjg0MzAwOVwmIzM0OywgXCYjMzQ7cGxhaW5fYnRmX3ZhbHVlXCYjMzQ7KTtcbiYjNDM7XHR9XG4mIzQzO31cbiYjNDM7XG4mIzQzO3N0YXRpYyB2b2lkIHRlc3Rfb3V0ZXIoZW51bSBicGZfbWFwX3R5cGUgdHlwZSwgaW50IGVudHJpZXMsIGJvb2wgZW1wdHlfaW5uZXIsXG4mIzQzO1x0XHQgICAgICAgYm9vbCB0eXBlZClcbiYjNDM7e1xuJiM0MztcdExJQkJQRl9PUFRTKGJwZl9tYXBfY3JlYXRlX29wdHMsIG9wdHMpO1xuJiM0MztcdExJQkJQRl9PUFRTKGJwZl9tYXBfY3JlYXRlX29wdHMsIGlubmVyX29wdHMpO1xuJiM0MztcdHN0cnVjdCBidGYgKmJ0ZiA9IE5VTEw7XG4mIzQzO1x0Y2hhciBvdXRlcltPVVRQVVRfU0laRV0sIGlubmVyW09VVFBVVF9TSVpFXSwgb3V0cHV0W09VVFBVVF9TSVpFXTtcbiYjNDM7XHRjaGFyIGV4cGVjdGVkW09VVFBVVF9TSVpFICogM10sIHJlZmVyZW5jZVs2NF07XG4mIzQzO1x0Y29uc3QgY2hhciAqdHlwZV9uYW1lID0gbGliYnBmX2JwZl9tYXBfdHlwZV9zdHIodHlwZSk7XG4mIzQzO1x0aW50IGlubmVyX2ZkID0gLTEsIG91dGVyX2ZkID0gLTE7XG4mIzQzO1x0X191MzIgcm9vdF9pZCwgaW5uZXJfaWQsIGtleSwgdmFsdWUgPSAweDAxMDEwMTAxO1xuJiM0MztcbiYjNDM7XHRpZiAodHlwZWQpIHtcbiYjNDM7XHRcdGJ0ZiA9IGJ0Zl9fbmV3X2VtcHR5KCk7XG4mIzQzO1x0XHRpZiAoIUFTU0VSVF9PS19QVFIoYnRmLCBcJiMzNDtjcmVhdGVfYnRmXCYjMzQ7KSB8fFxuJiM0MztcdFx0ICAgICFBU1NFUlRfRVEoYnRmX19hZGRfaW50KGJ0ZiwgXCYjMzQ7dW5zaWduZWQgaW50XCYjMzQ7LCA0LCAwKSwgMSwgXCYjMzQ7YnRmX2ludFwmIzM0OykgfHxcbiYjNDM7XHRcdCAgICAhQVNTRVJUX09LKGJ0Zl9fbG9hZF9pbnRvX2tlcm5lbChidGYpLCBcJiMzNDtsb2FkX2J0ZlwmIzM0OykpXG4mIzQzO1x0XHRcdGdvdG8gb3V0O1xuJiM0MztcdFx0aW5uZXJfb3B0cy5idGZfZmQgPSBidGZfX2ZkKGJ0Zik7XG4mIzQzO1x0XHRpbm5lcl9vcHRzLmJ0Zl9rZXlfdHlwZV9pZCA9IDE7XG4mIzQzO1x0XHRpbm5lcl9vcHRzLmJ0Zl92YWx1ZV90eXBlX2lkID0gMTtcbiYjNDM7XHR9XG4mIzQzO1x0aW5uZXJfZmQgPSBicGZfbWFwX2NyZWF0ZShCUEZfTUFQX1RZUEVfSEFTSCwgXCYjMzQ7ZHVtcF9pbm5lclwmIzM0Oywgc2l6ZW9mKGtleSksXG4mIzQzO1x0XHRcdFx0ICBzaXplb2YodmFsdWUpLCAyLCBcdTAwMjZpbm5lcl9vcHRzKTtcbiYjNDM7XHRpZiAoIUFTU0VSVF9PS19GRChpbm5lcl9mZCwgXCYjMzQ7Y3JlYXRlX2lubmVyXCYjMzQ7KSlcbiYjNDM7XHRcdGdvdG8gb3V0O1xuJiM0MztcdGtleSA9IDA7XG4mIzQzO1x0aWYgKCFlbXB0eV9pbm5lciBcdTAwMjZcdTAwMjZcbiYjNDM7XHQgICAgIUFTU0VSVF9PSyhicGZfbWFwX3VwZGF0ZV9lbGVtKGlubmVyX2ZkLCBcdTAwMjZrZXksIFx1MDAyNnZhbHVlLCBCUEZfQU5ZKSxcbiYjNDM7XHRcdCAgICAgICBcJiMzNDtwb3B1bGF0ZV9pbm5lclwmIzM0OykpXG4mIzQzO1x0XHRnb3RvIG91dDtcbiYjNDM7XHRvcHRzLmlubmVyX21hcF9mZCA9IGlubmVyX2ZkO1xuJiM0MztcdG91dGVyX2ZkID0gYnBmX21hcF9jcmVhdGUodHlwZSwgXCYjMzQ7ZHVtcF9vdXRlclwmIzM0Oywgc2l6ZW9mKGtleSksIHNpemVvZihfX3UzMiksXG4mIzQzO1x0XHRcdFx0ICAzLCBcdTAwMjZvcHRzKTtcbiYjNDM7XHRpZiAoIUFTU0VSVF9PS19GRChvdXRlcl9mZCwgXCYjMzQ7Y3JlYXRlX291dGVyXCYjMzQ7KSlcbiYjNDM7XHRcdGdvdG8gb3V0O1xuJiM0MztcdC8qIFRoZSB1bnVzZWQgdGhpcmQgYXJyYXkgc2xvdCBhbHNvIGV4ZXJjaXNlcyBmYWlsZWQgbG9va3Vwcy4gKi9cbiYjNDM7XHRmb3IgKGtleSA9IDA7IGtleSBcdTAwM2MgZW50cmllczsga2V5JiM0MzsmIzQzOylcbiYjNDM7XHRcdGlmICghQVNTRVJUX09LKGJwZl9tYXBfdXBkYXRlX2VsZW0ob3V0ZXJfZmQsIFx1MDAyNmtleSwgXHUwMDI2aW5uZXJfZmQsIEJQRl9BTlkpLFxuJiM0MztcdFx0XHQgICAgICAgXCYjMzQ7cG9wdWxhdGVfb3V0ZXJcJiMzNDspKVxuJiM0MztcdFx0XHRnb3RvIG91dDtcbiYjNDM7XHRyb290X2lkID0gbWFwX2lkKG91dGVyX2ZkKTtcbiYjNDM7XHRpbm5lcl9pZCA9IG1hcF9pZChpbm5lcl9mZCk7XG4mIzQzO1x0aWYgKCFyb290X2lkIHx8ICFpbm5lcl9pZCB8fCAhZHVtcF9tYXAocm9vdF9pZCwgXCYjMzQ7LWpcJiMzNDssIG91dGVyKSB8fFxuJiM0MztcdCAgICAhZHVtcF9tYXAoaW5uZXJfaWQsIFwmIzM0Oy1qXCYjMzQ7LCBpbm5lcikpXG4mIzQzO1x0XHRnb3RvIG91dDtcbiYjNDM7XG4mIzQzO1x0QVNTRVJUX0VRKG91dGVyWzBdLCAmIzM5O1smIzM5OywgXCYjMzQ7ZGVmYXVsdF9hcnJheVwmIzM0Oyk7XG4mIzQzO1x0QVNTRVJUX0VRKGNvdW50X3Rva2VuKG91dGVyLCBcJiMzNDtcXFwmIzM0O2VsZW1lbnRzXFxcJiMzNDs6XCYjMzQ7KSwgMCwgXCYjMzQ7ZGVmYXVsdF9ub193cmFwcGVyXCYjMzQ7KTtcbiYjNDM7XHRBU1NFUlRfRVEoY291bnRfdG9rZW4ob3V0ZXIsIFwmIzM0O1xcXCYjMzQ7aWRcXFwmIzM0OzpcJiMzNDspLCAwLCBcJiMzNDtkZWZhdWx0X25vX2hlYWRlclwmIzM0Oyk7XG4mIzQzO1x0c25wcmludGYocmVmZXJlbmNlLCBzaXplb2YocmVmZXJlbmNlKSwgXCYjMzQ7XFxcJiMzNDtpbm5lcl9tYXBfaWRcXFwmIzM0OzoldVwmIzM0OywgaW5uZXJfaWQpO1xuJiM0MztcdEFTU0VSVF9FUShjb3VudF90b2tlbihvdXRlciwgcmVmZXJlbmNlKSwgZW50cmllcywgXCYjMzQ7ZGVmYXVsdF9yZWZlcmVuY2VzXCYjMzQ7KTtcbiYjNDM7XHRpZiAoIWVudHJpZXMpXG4mIzQzO1x0XHRBU1NFUlRfU1RSRVEob3V0ZXIsIFwmIzM0O1tdXCYjMzQ7LCBcJiMzNDtlbXB0eV9vdXRlcl9kZWZhdWx0XCYjMzQ7KTtcbiYjNDM7XHRpZiAoZW1wdHlfaW5uZXIpXG4mIzQzO1x0XHRBU1NFUlRfU1RSRVEoaW5uZXIsIFwmIzM0O1tdXCYjMzQ7LCBcJiMzNDtlbXB0eV9pbm5lcl9kZWZhdWx0XCYjMzQ7KTtcbiYjNDM7XHRlbHNlIGlmICh0eXBlZClcbiYjNDM7XHRcdEFTU0VSVF9IQVNfU1VCU1RSKGlubmVyLCBcJiMzNDtcXFwmIzM0O2Zvcm1hdHRlZFxcXCYjMzQ7OntcXFwmIzM0O2tleVxcXCYjMzQ7OjAsXFxcJiMzNDt2YWx1ZVxcXCYjMzQ7OjE2ODQzMDA5fVwmIzM0OyxcbiYjNDM7XHRcdFx0XHQgIFwmIzM0O3R5cGVkX2lubmVyXCYjMzQ7KTtcbiYjNDM7XHRlbHNlXG4mIzQzO1x0XHRBU1NFUlRfU1RSRVEoaW5uZXIsXG4mIzQzO1x0XHRcdCAgICAgXCYjMzQ7W3tcXFwmIzM0O2tleVxcXCYjMzQ7OltcXFwmIzM0OzB4MDBcXFwmIzM0OyxcXFwmIzM0OzB4MDBcXFwmIzM0OyxcXFwmIzM0OzB4MDBcXFwmIzM0OyxcXFwmIzM0OzB4MDBcXFwmIzM0O10sXCYjMzQ7XG4mIzQzO1x0XHRcdCAgICAgXCYjMzQ7XFxcJiMzNDt2YWx1ZVxcXCYjMzQ7OltcXFwmIzM0OzB4MDFcXFwmIzM0OyxcXFwmIzM0OzB4MDFcXFwmIzM0OyxcXFwmIzM0OzB4MDFcXFwmIzM0OyxcXFwmIzM0OzB4MDFcXFwmIzM0O119XVwmIzM0OyxcbiYjNDM7XHRcdFx0ICAgICBcJiMzNDtvcmRpbmFyeV9kZWZhdWx0XCYjMzQ7KTtcbiYjNDM7XG4mIzQzO1x0LypcbiYjNDM7XHQgKiBDb21wYXJlIHRoZSBjb21wbGV0ZSBKU09OIGRvY3VtZW50OiBhIGZsYXQgYXJyYXkgd2l0aCB0aGUgcm9vdCBmaXJzdCxcbiYjNDM7XHQgKiBvbmUgY29weSBvZiB0aGUgc2hhcmVkIGlubmVyIG1hcCwgYW5kIHVuY2hhbmdlZCBlbnRyeSByZXByZXNlbnRhdGlvbnMuXG4mIzQzO1x0ICovXG4mIzQzO1x0aWYgKGVudHJpZXMpXG4mIzQzO1x0XHRzbnByaW50ZihleHBlY3RlZCwgc2l6ZW9mKGV4cGVjdGVkKSxcbiYjNDM7XHRcdFx0IFwmIzM0O1t7XFxcJiMzNDtpZFxcXCYjMzQ7OiV1LFxcXCYjMzQ7dHlwZVxcXCYjMzQ7OlxcXCYjMzQ7JXNcXFwmIzM0OyxcXFwmIzM0O25hbWVcXFwmIzM0OzpcXFwmIzM0O2R1bXBfb3V0ZXJcXFwmIzM0OyxcJiMzNDtcbiYjNDM7XHRcdFx0IFwmIzM0O1xcXCYjMzQ7ZmxhZ3NcXFwmIzM0OzowLFxcXCYjMzQ7ZWxlbWVudHNcXFwmIzM0Ozolc30se1xcXCYjMzQ7aWRcXFwmIzM0OzoldSxcXFwmIzM0O3R5cGVcXFwmIzM0OzpcXFwmIzM0O2hhc2hcXFwmIzM0OyxcJiMzNDtcbiYjNDM7XHRcdFx0IFwmIzM0O1xcXCYjMzQ7bmFtZVxcXCYjMzQ7OlxcXCYjMzQ7ZHVtcF9pbm5lclxcXCYjMzQ7LFxcXCYjMzQ7ZmxhZ3NcXFwmIzM0OzowLFxcXCYjMzQ7ZWxlbWVudHNcXFwmIzM0Ozolc31dXCYjMzQ7LFxuJiM0MztcdFx0XHQgcm9vdF9pZCwgdHlwZV9uYW1lLCBvdXRlciwgaW5uZXJfaWQsIGlubmVyKTtcbiYjNDM7XHRlbHNlXG4mIzQzO1x0XHRzbnByaW50ZihleHBlY3RlZCwgc2l6ZW9mKGV4cGVjdGVkKSxcbiYjNDM7XHRcdFx0IFwmIzM0O1t7XFxcJiMzNDtpZFxcXCYjMzQ7OiV1LFxcXCYjMzQ7dHlwZVxcXCYjMzQ7OlxcXCYjMzQ7JXNcXFwmIzM0OyxcXFwmIzM0O25hbWVcXFwmIzM0OzpcXFwmIzM0O2R1bXBfb3V0ZXJcXFwmIzM0OyxcJiMzNDtcbiYjNDM7XHRcdFx0IFwmIzM0O1xcXCYjMzQ7ZmxhZ3NcXFwmIzM0OzowLFxcXCYjMzQ7ZWxlbWVudHNcXFwmIzM0OzpbXX1dXCYjMzQ7LCByb290X2lkLCB0eXBlX25hbWUpO1xuJiM0MztcdGlmIChkdW1wX21hcChyb290X2lkLCBcJiMzNDstaiAtclwmIzM0Oywgb3V0cHV0KSlcbiYjNDM7XHRcdEFTU0VSVF9TVFJFUShvdXRwdXQsIGV4cGVjdGVkLCBcJiMzNDtyZWN1cnNpdmVfanNvblwmIzM0Oyk7XG4mIzQzO1x0aWYgKGR1bXBfbWFwKHJvb3RfaWQsIFwmIzM0Oy0tanNvbiAtLXJlY3Vyc2l2ZVwmIzM0Oywgb3V0cHV0KSlcbiYjNDM7XHRcdEFTU0VSVF9TVFJFUShvdXRwdXQsIGV4cGVjdGVkLCBcJiMzNDtyZWN1cnNpdmVfbG9uZ19vcHRpb25zXCYjMzQ7KTtcbiYjNDM7XHRjaGVja19wbGFpbihyb290X2lkLCBpbm5lcl9pZCwgdHlwZV9uYW1lLCBlbnRyaWVzLCB0eXBlZCk7XG4mIzQzO1xuJiM0MztcdC8qIFJlY3Vyc2lvbiBvbiBhbiBvcmRpbmFyeSBtYXAgc3RpbGwgZW1pdHMgYSBzaW5nbGUgbWFwIG9iamVjdC4gKi9cbiYjNDM7XHRzbnByaW50ZihleHBlY3RlZCwgc2l6ZW9mKGV4cGVjdGVkKSxcbiYjNDM7XHRcdCBcJiMzNDtbe1xcXCYjMzQ7aWRcXFwmIzM0OzoldSxcXFwmIzM0O3R5cGVcXFwmIzM0OzpcXFwmIzM0O2hhc2hcXFwmIzM0OyxcXFwmIzM0O25hbWVcXFwmIzM0OzpcXFwmIzM0O2R1bXBfaW5uZXJcXFwmIzM0OyxcJiMzNDtcbiYjNDM7XHRcdCBcJiMzNDtcXFwmIzM0O2ZsYWdzXFxcJiMzNDs6MCxcXFwmIzM0O2VsZW1lbnRzXFxcJiMzNDs6JXN9XVwmIzM0OywgaW5uZXJfaWQsIGlubmVyKTtcbiYjNDM7XHRpZiAoZHVtcF9tYXAoaW5uZXJfaWQsIFwmIzM0Oy1qIC1yXCYjMzQ7LCBvdXRwdXQpKVxuJiM0MztcdFx0QVNTRVJUX1NUUkVRKG91dHB1dCwgZXhwZWN0ZWQsIFwmIzM0O29yZGluYXJ5X3JlY3Vyc2l2ZVwmIzM0Oyk7XG4mIzQzO291dDpcbiYjNDM7XHRpZiAob3V0ZXJfZmQgXHUwMDNlPSAwKVxuJiM0MztcdFx0Y2xvc2Uob3V0ZXJfZmQpO1xuJiM0MztcdGlmIChpbm5lcl9mZCBcdTAwM2U9IDApXG4mIzQzO1x0XHRjbG9zZShpbm5lcl9mZCk7XG4mIzQzO1x0YnRmX19mcmVlKGJ0Zik7XG4mIzQzO31cbiYjNDM7XG4mIzQzO3N0YXRpYyB2b2lkIHRlc3RfbXVsdGlwbGVfcm9vdHModm9pZClcbiYjNDM7e1xuJiM0MztcdExJQkJQRl9PUFRTKGJwZl9tYXBfY3JlYXRlX29wdHMsIG9wdHMpO1xuJiM0MztcdGNoYXIgY29tbWFuZFtNQVhfQlBGVE9PTF9DTURfTEVOXSwgbmFtZVtCUEZfT0JKX05BTUVfTEVOXTtcbiYjNDM7XHRjaGFyIG91dHB1dFtPVVRQVVRfU0laRV0gPSB7fSwgZXhwZWN0ZWRbT1VUUFVUX1NJWkUgKiA0XSwgZWxlbWVudHNbT1VUUFVUX1NJWkVdO1xuJiM0MztcdHN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgdHlwZXNbXSA9IHsgXCYjMzQ7aGFzaFwmIzM0OywgXCYjMzQ7YXJyYXlfb2ZfbWFwc1wmIzM0OywgXCYjMzQ7aGFzaF9vZl9tYXBzXCYjMzQ7LCBcJiMzNDtoYXNoXCYjMzQ7IH07XG4mIzQzO1x0aW50IGZkc1tdID0geyAtMSwgLTEsIC0xLCAtMSB9O1xuJiM0MztcdF9fdTMyIGlkc1s0XSwga2V5O1xuJiM0MztcdGludCBpLCBsZW4gPSAwO1xuJiM0MztcbiYjNDM7XHQvKlxuJiM0MztcdCAqIFNlbGVjdCB0aGUgZmlyc3QgaW5uZXIgbWFwIGFuZCBib3RoIG91dGVycyBhcyByb290cy4gVGhlIG90aGVyIGlubmVyXG4mIzQzO1x0ICogbWFwIG11c3QgYmUgYXBwZW5kZWQgYWZ0ZXIgYWxsIHRocmVlIHJvb3RzLCBldmVuIHRob3VnaCBpdCBpcyBmb3VuZFxuJiM0MztcdCAqIHdoaWxlIGR1bXBpbmcgdGhlIGZpcnN0IG91dGVyLiBBIHByb2Nlc3Mtc3BlY2lmaWMgbmFtZSBhdm9pZHMgb3RoZXJcbiYjNDM7XHQgKiB0ZXN0cyYjMzk7IG1hcHMgam9pbmluZyB0aGUgc2VsZWN0aW9uLlxuJiM0MztcdCAqL1xuJiM0MztcdHNucHJpbnRmKG5hbWUsIHNpemVvZihuYW1lKSwgXCYjMzQ7ZHVtcF8ldVwmIzM0OywgZ2V0cGlkKCkpO1xuJiM0MztcdGZkc1swXSA9IGJwZl9tYXBfY3JlYXRlKEJQRl9NQVBfVFlQRV9IQVNILCBuYW1lLCA0LCA0LCAxLCBOVUxMKTtcbiYjNDM7XHRpZiAoIUFTU0VSVF9PS19GRChmZHNbMF0sIFwmIzM0O2NyZWF0ZV9zZWxlY3RlZF9pbm5lclwmIzM0OykpXG4mIzQzO1x0XHRnb3RvIG91dDtcbiYjNDM7XHRmZHNbM10gPSBicGZfbWFwX2NyZWF0ZShCUEZfTUFQX1RZUEVfSEFTSCwgXCYjMzQ7ZHVtcF9kaXNjb3ZlcmVkXCYjMzQ7LCA0LCA0LCAxLCBOVUxMKTtcbiYjNDM7XHRpZiAoIUFTU0VSVF9PS19GRChmZHNbM10sIFwmIzM0O2NyZWF0ZV9kaXNjb3ZlcmVkX2lubmVyXCYjMzQ7KSlcbiYjNDM7XHRcdGdvdG8gb3V0O1xuJiM0MztcdG9wdHMuaW5uZXJfbWFwX2ZkID0gZmRzWzBdO1xuJiM0MztcdGZkc1sxXSA9IGJwZl9tYXBfY3JlYXRlKEJQRl9NQVBfVFlQRV9BUlJBWV9PRl9NQVBTLCBuYW1lLCA0LCA0LCAyLCBcdTAwMjZvcHRzKTtcbiYjNDM7XHRpZiAoIUFTU0VSVF9PS19GRChmZHNbMV0sIFwmIzM0O2NyZWF0ZV9hcnJheV9yb290XCYjMzQ7KSlcbiYjNDM7XHRcdGdvdG8gb3V0O1xuJiM0MztcdGZkc1syXSA9IGJwZl9tYXBfY3JlYXRlKEJQRl9NQVBfVFlQRV9IQVNIX09GX01BUFMsIG5hbWUsIDQsIDQsIDIsIFx1MDAyNm9wdHMpO1xuJiM0MztcdGlmICghQVNTRVJUX09LX0ZEKGZkc1syXSwgXCYjMzQ7Y3JlYXRlX2hhc2hfcm9vdFwmIzM0OykpXG4mIzQzO1x0XHRnb3RvIG91dDtcbiYjNDM7XHRmb3IgKGkgPSAxOyBpIFx1MDAzYz0gMjsgaSYjNDM7JiM0MzspIHtcbiYjNDM7XHRcdGtleSA9IDA7XG4mIzQzO1x0XHRpZiAoIUFTU0VSVF9PSyhicGZfbWFwX3VwZGF0ZV9lbGVtKGZkc1tpXSwgXHUwMDI2a2V5LCBcdTAwMjZmZHNbMF0sIEJQRl9BTlkpLFxuJiM0MztcdFx0XHQgICAgICAgXCYjMzQ7cmVmZXJlbmNlX3NlbGVjdGVkX2lubmVyXCYjMzQ7KSlcbiYjNDM7XHRcdFx0Z290byBvdXQ7XG4mIzQzO1x0XHRrZXkgPSAxO1xuJiM0MztcdFx0aWYgKCFBU1NFUlRfT0soYnBmX21hcF91cGRhdGVfZWxlbShmZHNbaV0sIFx1MDAyNmtleSwgXHUwMDI2ZmRzWzNdLCBCUEZfQU5ZKSxcbiYjNDM7XHRcdFx0ICAgICAgIFwmIzM0O3JlZmVyZW5jZV9kaXNjb3ZlcmVkX2lubmVyXCYjMzQ7KSlcbiYjNDM7XHRcdFx0Z290byBvdXQ7XG4mIzQzO1x0fVxuJiM0MztcdGZvciAoaSA9IDA7IGkgXHUwMDNjIEFSUkFZX1NJWkUoZmRzKTsgaSYjNDM7JiM0MzspIHtcbiYjNDM7XHRcdGlkc1tpXSA9IG1hcF9pZChmZHNbaV0pO1xuJiM0MztcdFx0aWYgKCFpZHNbaV0gfHwgIWR1bXBfbWFwKGlkc1tpXSwgXCYjMzQ7LWpcJiMzNDssIGVsZW1lbnRzKSlcbiYjNDM7XHRcdFx0Z290byBvdXQ7XG4mIzQzO1x0XHRsZW4gJiM0Mzs9IHNucHJpbnRmKGV4cGVjdGVkICYjNDM7IGxlbiwgc2l6ZW9mKGV4cGVjdGVkKSAtIGxlbixcbiYjNDM7XHRcdFx0XHRcJiMzNDslc3tcXFwmIzM0O2lkXFxcJiMzNDs6JXUsXFxcJiMzNDt0eXBlXFxcJiMzNDs6XFxcJiMzNDslc1xcXCYjMzQ7LFxcXCYjMzQ7bmFtZVxcXCYjMzQ7OlxcXCYjMzQ7JXNcXFwmIzM0OyxcJiMzNDtcbiYjNDM7XHRcdFx0XHRcJiMzNDtcXFwmIzM0O2ZsYWdzXFxcJiMzNDs6MCxcXFwmIzM0O2VsZW1lbnRzXFxcJiMzNDs6JXN9JXNcJiMzNDssXG4mIzQzO1x0XHRcdFx0aSA/IFwmIzM0OyxcJiMzNDsgOiBcJiMzNDtbXCYjMzQ7LCBpZHNbaV0sIHR5cGVzW2ldLFxuJiM0MztcdFx0XHRcdGkgPT0gMyA/IFwmIzM0O2R1bXBfZGlzY292ZXJlZFwmIzM0OyA6IG5hbWUsIGVsZW1lbnRzLCBpID09IDMgPyBcJiMzNDtdXCYjMzQ7IDogXCYjMzQ7XCYjMzQ7KTtcbiYjNDM7XHR9XG4mIzQzO1x0c25wcmludGYoY29tbWFuZCwgc2l6ZW9mKGNvbW1hbmQpLCBcJiMzNDstaiAtciBtYXAgZHVtcCBuYW1lICVzXCYjMzQ7LCBuYW1lKTtcbiYjNDM7XHRpZiAoQVNTRVJUX09LKGdldF9icGZ0b29sX2NvbW1hbmRfb3V0cHV0KGNvbW1hbmQsIG91dHB1dCwgc2l6ZW9mKG91dHB1dCkgLSAxKSxcbiYjNDM7XHRcdCAgICAgIFwmIzM0O2R1bXBfbXVsdGlwbGVfcm9vdHNcJiMzNDspKSB7XG4mIzQzO1x0XHRvdXRwdXRbc3RyY3NwbihvdXRwdXQsIFwmIzM0O1xcblwmIzM0OyldID0gJiMzOTtcXDAmIzM5OztcbiYjNDM7XHRcdEFTU0VSVF9TVFJFUShvdXRwdXQsIGV4cGVjdGVkLCBcJiMzNDtyb290c19maXJzdF9hbmRfc2VlZF9kZWR1cFwmIzM0Oyk7XG4mIzQzO1x0fVxuJiM0MztvdXQ6XG4mIzQzO1x0Zm9yIChpID0gMDsgaSBcdTAwM2MgQVJSQVlfU0laRShmZHMpOyBpJiM0MzsmIzQzOylcbiYjNDM7XHRcdGlmIChmZHNbaV0gXHUwMDNlPSAwKVxuJiM0MztcdFx0XHRjbG9zZShmZHNbaV0pO1xuJiM0Mzt9XG4mIzQzO1xuJiM0MztzdGF0aWMgdm9pZCB0ZXN0X3VucmVhZGFibGUoYm9vbCBvdXRlcilcbiYjNDM7e1xuJiM0MztcdExJQkJQRl9PUFRTKGJwZl9tYXBfY3JlYXRlX29wdHMsIG9wdHMpO1xuJiM0MztcdGNoYXIgZWxlbWVudHNbT1VUUFVUX1NJWkVdLCBvdXRwdXRbT1VUUFVUX1NJWkVdLCByb290W09VVFBVVF9TSVpFXTtcbiYjNDM7XHRjaGFyIGV4cGVjdGVkW09VVFBVVF9TSVpFICogM10sIHBsYWluW09VVFBVVF9TSVpFXSA9IHt9O1xuJiM0MztcdGNoYXIgY29tbWFuZFtNQVhfQlBGVE9PTF9DTURfTEVOXTtcbiYjNDM7XHRpbnQgaW5uZXJfZmQgPSAtMSwgb3V0ZXJfZmQgPSAtMSwgbG9va3VwX2Vycm5vO1xuJiM0MztcdF9fdTMyIGlubmVyX2lkLCByb290X2lkLCBrZXkgPSAwLCB2YWx1ZTtcbiYjNDM7XG4mIzQzO1x0LypcbiYjNDM7XHQgKiBFdmVyeSBrZXkgaXMgZW51bWVyYWJsZSwgYnV0IFBFUkZfRVZFTlRfQVJSQVkgbG9va3VwIHJldHVybnNcbiYjNDM7XHQgKiBFTk9UU1VQUCAodGhlIGtlcm5lbC1pbnRlcm5hbCBlcnJubykuIENoZWNrIGJvdGggZW50cmllcyBzbyBhblxuJiM0MztcdCAqIGVhcmx5IGV4aXQgb24gdGhlIGZpcnN0IGxvb2t1cCBmYWlsdXJlIGNhbm5vdCBwYXNzLlxuJiM0MztcdCAqL1xuJiM0MztcdGlubmVyX2ZkID0gYnBmX21hcF9jcmVhdGUoQlBGX01BUF9UWVBFX1BFUkZfRVZFTlRfQVJSQVksIFwmIzM0O2R1bXBfdW5yZWFkYWJsZVwmIzM0OyxcbiYjNDM7XHRcdFx0XHQgIHNpemVvZihrZXkpLCBzaXplb2YodmFsdWUpLCAyLCBOVUxMKTtcbiYjNDM7XHRpZiAoIUFTU0VSVF9PS19GRChpbm5lcl9mZCwgXCYjMzQ7Y3JlYXRlX3VucmVhZGFibGVcJiMzNDspKVxuJiM0MztcdFx0Z290byBvdXQ7XG4mIzQzO1x0aWYgKCFBU1NFUlRfTFQoYnBmX21hcF9sb29rdXBfZWxlbShpbm5lcl9mZCwgXHUwMDI2a2V5LCBcdTAwMjZ2YWx1ZSksIDAsXG4mIzQzO1x0XHQgICAgICAgXCYjMzQ7dW5yZWFkYWJsZV9sb29rdXBcJiMzNDspKVxuJiM0MztcdFx0Z290byBvdXQ7XG4mIzQzO1x0bG9va3VwX2Vycm5vID0gZXJybm87XG4mIzQzO1x0aWYgKCFBU1NFUlRfTkVRKGxvb2t1cF9lcnJubywgRU5PRU5ULCBcJiMzNDt1bnJlYWRhYmxlX25vdF9taXNzaW5nXCYjMzQ7KSlcbiYjNDM7XHRcdGdvdG8gb3V0O1xuJiM0MztcdGlubmVyX2lkID0gbWFwX2lkKGlubmVyX2ZkKTtcbiYjNDM7XHRpZiAoIWlubmVyX2lkIHx8ICFkdW1wX21hcChpbm5lcl9pZCwgXCYjMzQ7LWpcJiMzNDssIGVsZW1lbnRzKSlcbiYjNDM7XHRcdGdvdG8gb3V0O1xuJiM0MztcdEFTU0VSVF9FUShjb3VudF90b2tlbihlbGVtZW50cywgXCYjMzQ7XFxcJiMzNDtlcnJvclxcXCYjMzQ7OlwmIzM0OyksIDIsIFwmIzM0O2RlZmF1bHRfanNvbl9lcnJvcnNcJiMzNDspO1xuJiM0MztcdHNucHJpbnRmKGNvbW1hbmQsIHNpemVvZihjb21tYW5kKSwgXCYjMzQ7bWFwIGR1bXAgaWQgJXVcJiMzNDssIGlubmVyX2lkKTtcbiYjNDM7XHRpZiAoIUFTU0VSVF9PSyhnZXRfYnBmdG9vbF9jb21tYW5kX291dHB1dChjb21tYW5kLCBwbGFpbiwgc2l6ZW9mKHBsYWluKSAtIDEpLFxuJiM0MztcdFx0ICAgICAgIFwmIzM0O2RlZmF1bHRfcGxhaW5fdW5yZWFkYWJsZVwmIzM0OykpXG4mIzQzO1x0XHRnb3RvIG91dDtcbiYjNDM7XHRBU1NFUlRfRVEoY291bnRfdG9rZW4ocGxhaW4sIHN0cmVycm9yKGxvb2t1cF9lcnJubykpLCAyLCBcJiMzNDtkZWZhdWx0X3BsYWluX2Vycm9yc1wmIzM0Oyk7XG4mIzQzO1x0QVNTRVJUX0hBU19TVUJTVFIocGxhaW4sIFwmIzM0O0ZvdW5kIDAgZWxlbWVudHNcJiMzNDssIFwmIzM0O2RlZmF1bHRfcGxhaW5fY291bnRcJiMzNDspO1xuJiM0MztcbiYjNDM7XHRyb290X2lkID0gaW5uZXJfaWQ7XG4mIzQzO1x0aWYgKG91dGVyKSB7XG4mIzQzO1x0XHRvcHRzLmlubmVyX21hcF9mZCA9IGlubmVyX2ZkO1xuJiM0MztcdFx0b3V0ZXJfZmQgPSBicGZfbWFwX2NyZWF0ZShCUEZfTUFQX1RZUEVfQVJSQVlfT0ZfTUFQUywgXCYjMzQ7ZHVtcF9vdXRlclwmIzM0OyxcbiYjNDM7XHRcdFx0XHRcdCAgc2l6ZW9mKGtleSksIHNpemVvZih2YWx1ZSksIDEsIFx1MDAyNm9wdHMpO1xuJiM0MztcdFx0aWYgKCFBU1NFUlRfT0tfRkQob3V0ZXJfZmQsIFwmIzM0O2NyZWF0ZV9vdXRlclwmIzM0OykgfHxcbiYjNDM7XHRcdCAgICAhQVNTRVJUX09LKGJwZl9tYXBfdXBkYXRlX2VsZW0ob3V0ZXJfZmQsIFx1MDAyNmtleSwgXHUwMDI2aW5uZXJfZmQsIEJQRl9BTlkpLFxuJiM0MztcdFx0XHQgICAgICAgXCYjMzQ7cG9wdWxhdGVfb3V0ZXJcJiMzNDspKVxuJiM0MztcdFx0XHRnb3RvIG91dDtcbiYjNDM7XHRcdHJvb3RfaWQgPSBtYXBfaWQob3V0ZXJfZmQpO1xuJiM0MztcdFx0aWYgKCFyb290X2lkIHx8ICFkdW1wX21hcChyb290X2lkLCBcJiMzNDstalwmIzM0Oywgcm9vdCkpXG4mIzQzO1x0XHRcdGdvdG8gb3V0O1xuJiM0MztcdFx0c25wcmludGYoZXhwZWN0ZWQsIHNpemVvZihleHBlY3RlZCksXG4mIzQzO1x0XHRcdCBcJiMzNDtbe1xcXCYjMzQ7aWRcXFwmIzM0OzoldSxcXFwmIzM0O3R5cGVcXFwmIzM0OzpcXFwmIzM0O2FycmF5X29mX21hcHNcXFwmIzM0OyxcXFwmIzM0O25hbWVcXFwmIzM0OzpcXFwmIzM0O2R1bXBfb3V0ZXJcXFwmIzM0OyxcJiMzNDtcbiYjNDM7XHRcdFx0IFwmIzM0O1xcXCYjMzQ7ZmxhZ3NcXFwmIzM0OzowLFxcXCYjMzQ7ZWxlbWVudHNcXFwmIzM0Ozolc30se1xcXCYjMzQ7aWRcXFwmIzM0OzoldSxcJiMzNDtcbiYjNDM7XHRcdFx0IFwmIzM0O1xcXCYjMzQ7dHlwZVxcXCYjMzQ7OlxcXCYjMzQ7cGVyZl9ldmVudF9hcnJheVxcXCYjMzQ7LFxcXCYjMzQ7bmFtZVxcXCYjMzQ7OlxcXCYjMzQ7ZHVtcF91bnJlYWRhYmxlXFxcJiMzNDssXCYjMzQ7XG4mIzQzO1x0XHRcdCBcJiMzNDtcXFwmIzM0O2ZsYWdzXFxcJiMzNDs6MCxcXFwmIzM0O2VsZW1lbnRzXFxcJiMzNDs6JXN9XVwmIzM0Oywgcm9vdF9pZCwgcm9vdCwgaW5uZXJfaWQsIGVsZW1lbnRzKTtcbiYjNDM7XHR9IGVsc2Uge1xuJiM0MztcdFx0c25wcmludGYoZXhwZWN0ZWQsIHNpemVvZihleHBlY3RlZCksXG4mIzQzO1x0XHRcdCBcJiMzNDtbe1xcXCYjMzQ7aWRcXFwmIzM0OzoldSxcXFwmIzM0O3R5cGVcXFwmIzM0OzpcXFwmIzM0O3BlcmZfZXZlbnRfYXJyYXlcXFwmIzM0OyxcJiMzNDtcbiYjNDM7XHRcdFx0IFwmIzM0O1xcXCYjMzQ7bmFtZVxcXCYjMzQ7OlxcXCYjMzQ7ZHVtcF91bnJlYWRhYmxlXFxcJiMzNDssXFxcJiMzNDtmbGFnc1xcXCYjMzQ7OjAsXFxcJiMzNDtlbGVtZW50c1xcXCYjMzQ7OiVzfV1cJiMzNDssXG4mIzQzO1x0XHRcdCBpbm5lcl9pZCwgZWxlbWVudHMpO1xuJiM0MztcdH1cbiYjNDM7XHRpZiAoZHVtcF9tYXAocm9vdF9pZCwgXCYjMzQ7LWogLXJcJiMzNDssIG91dHB1dCkpXG4mIzQzO1x0XHRBU1NFUlRfU1RSRVEob3V0cHV0LCBleHBlY3RlZCwgXCYjMzQ7cmVjdXJzaXZlX3VucmVhZGFibGVfanNvblwmIzM0Oyk7XG4mIzQzO1x0bWVtc2V0KG91dHB1dCwgMCwgc2l6ZW9mKG91dHB1dCkpO1xuJiM0MztcdHNucHJpbnRmKGNvbW1hbmQsIHNpemVvZihjb21tYW5kKSwgXCYjMzQ7LXIgbWFwIGR1bXAgaWQgJXVcJiMzNDssIHJvb3RfaWQpO1xuJiM0MztcdGlmIChBU1NFUlRfT0soZ2V0X2JwZnRvb2xfY29tbWFuZF9vdXRwdXQoY29tbWFuZCwgb3V0cHV0LCBzaXplb2Yob3V0cHV0KSAtIDEpLFxuJiM0MztcdFx0ICAgICAgXCYjMzQ7cmVjdXJzaXZlX3VucmVhZGFibGVfcGxhaW5cJiMzNDspKSB7XG4mIzQzO1x0XHRBU1NFUlRfSEFTX1NVQlNUUihvdXRwdXQsIHBsYWluLCBcJiMzNDtyZWN1cnNpdmVfcGxhaW5fcHJlc2VydmVzX2Vycm9yc1wmIzM0Oyk7XG4mIzQzO1x0XHRBU1NFUlRfRVEoY291bnRfdG9rZW4ob3V0cHV0LCBzdHJlcnJvcihsb29rdXBfZXJybm8pKSwgMixcbiYjNDM7XHRcdFx0ICBcJiMzNDtyZWN1cnNpdmVfcGxhaW5fZXJyb3JzXCYjMzQ7KTtcbiYjNDM7XHRcdEFTU0VSVF9FUShjb3VudF90b2tlbihvdXRwdXQsIFwmIzM0O0ZvdW5kIFwmIzM0OyksIG91dGVyID8gMiA6IDEsXG4mIzQzO1x0XHRcdCAgXCYjMzQ7cmVjdXJzaXZlX3BsYWluX21hcHNcJiMzNDspO1xuJiM0MztcdH1cbiYjNDM7b3V0OlxuJiM0MztcdGlmIChvdXRlcl9mZCBcdTAwM2U9IDApXG4mIzQzO1x0XHRjbG9zZShvdXRlcl9mZCk7XG4mIzQzO1x0aWYgKGlubmVyX2ZkIFx1MDAzZT0gMClcbiYjNDM7XHRcdGNsb3NlKGlubmVyX2ZkKTtcbiYjNDM7fVxuJiM0MztcbiYjNDM7c3RhdGljIHZvaWQgdGVzdF9tYW55X2lubmVyX21hcHMoYm9vbCBqc29uKVxuJiM0Mzt7XG4mIzQzO1x0ZW51bSB7XG4mIzQzO1x0XHREVU1QX09LLFxuJiM0MztcdFx0RFVNUF9FUlJfUkxJTUlULFxuJiM0MztcdFx0RFVNUF9FUlJfQ09NTUFORCxcbiYjNDM7XHRcdERVTVBfRVJSX0NPVU5UUyxcbiYjNDM7XHRcdERVTVBfRVJSX0lEUyxcbiYjNDM7XHRcdERVTVBfRVJSX0pTT04sXG4mIzQzO1x0XHREVU1QX0VSUl9GRFMsXG4mIzQzO1x0fTtcbiYjNDM7XHRMSUJCUEZfT1BUUyhicGZfbWFwX2NyZWF0ZV9vcHRzLCBvcHRzKTtcbiYjNDM7XHRjb25zdCBzdHJ1Y3QgcmxpbWl0IGxpbWl0ID0geyAucmxpbV9jdXIgPSAzMiwgLnJsaW1fbWF4ID0gMzIgfTtcbiYjNDM7XHRjaGFyIGNvbW1hbmRbTUFYX0JQRlRPT0xfQ01EX0xFTl0sIHRva2VuWzY0XTtcbiYjNDM7XHRfX3UzMiBpZHNbNjRdLCByb290X2lkLCBrZXk7XG4mIzQzO1x0aW50IGlubmVyX2ZkID0gLTEsIG91dGVyX2ZkID0gLTEsIHN0YXR1cztcbiYjNDM7XHRpbnQgaW5oZXJpdGVkX2Zkc1szMl0sIG5yX2luaGVyaXRlZCA9IDAsIGk7XG4mIzQzO1x0Y2hhciAqb3V0cHV0ID0gTlVMTDtcbiYjNDM7XHRwaWRfdCBwaWQ7XG4mIzQzO1xuJiM0MztcdGlubmVyX2ZkID0gYnBmX21hcF9jcmVhdGUoQlBGX01BUF9UWVBFX0hBU0gsIFwmIzM0O2R1bXBfaW5uZXJcJiMzNDssIDQsIDQsIDEsIE5VTEwpO1xuJiM0MztcdGlmICghQVNTRVJUX09LX0ZEKGlubmVyX2ZkLCBcJiMzNDtjcmVhdGVfdGVtcGxhdGVcJiMzNDspKVxuJiM0MztcdFx0Z290byBvdXQ7XG4mIzQzO1x0b3B0cy5pbm5lcl9tYXBfZmQgPSBpbm5lcl9mZDtcbiYjNDM7XHRvdXRlcl9mZCA9IGJwZl9tYXBfY3JlYXRlKEJQRl9NQVBfVFlQRV9BUlJBWV9PRl9NQVBTLCBcJiMzNDtkdW1wX291dGVyXCYjMzQ7LCA0LCA0LFxuJiM0MztcdFx0XHRcdCAgQVJSQVlfU0laRShpZHMpLCBcdTAwMjZvcHRzKTtcbiYjNDM7XHRjbG9zZShpbm5lcl9mZCk7XG4mIzQzO1x0aW5uZXJfZmQgPSAtMTtcbiYjNDM7XHRpZiAoIUFTU0VSVF9PS19GRChvdXRlcl9mZCwgXCYjMzQ7Y3JlYXRlX291dGVyXCYjMzQ7KSlcbiYjNDM7XHRcdGdvdG8gb3V0O1xuJiM0MztcdGZvciAoa2V5ID0gMDsga2V5IFx1MDAzYyBBUlJBWV9TSVpFKGlkcyk7IGtleSYjNDM7JiM0MzspIHtcbiYjNDM7XHRcdGlubmVyX2ZkID0gYnBmX21hcF9jcmVhdGUoQlBGX01BUF9UWVBFX0hBU0gsIFwmIzM0O2R1bXBfaW5uZXJcJiMzNDssIDQsIDQsIDEsIE5VTEwpO1xuJiM0MztcdFx0aWYgKCFBU1NFUlRfT0tfRkQoaW5uZXJfZmQsIFwmIzM0O2NyZWF0ZV9pbm5lclwmIzM0OykgfHxcbiYjNDM7XHRcdCAgICAhQVNTRVJUX09LKGJwZl9tYXBfdXBkYXRlX2VsZW0ob3V0ZXJfZmQsIFx1MDAyNmtleSwgXHUwMDI2aW5uZXJfZmQsIEJQRl9BTlkpLFxuJiM0MztcdFx0XHQgICAgICAgXCYjMzQ7cG9wdWxhdGVfb3V0ZXJcJiMzNDspKVxuJiM0MztcdFx0XHRnb3RvIG91dDtcbiYjNDM7XHRcdGlkc1trZXldID0gbWFwX2lkKGlubmVyX2ZkKTtcbiYjNDM7XHRcdGlmICghaWRzW2tleV0pXG4mIzQzO1x0XHRcdGdvdG8gb3V0O1xuJiM0MztcdFx0LyogVGhlIG91dGVyIG1hcCBrZWVwcyBlYWNoIGRpc3RpbmN0IGlubmVyIG1hcCBhbGl2ZS4gKi9cbiYjNDM7XHRcdGNsb3NlKGlubmVyX2ZkKTtcbiYjNDM7XHRcdGlubmVyX2ZkID0gLTE7XG4mIzQzO1x0fVxuJiM0MztcdHJvb3RfaWQgPSBtYXBfaWQob3V0ZXJfZmQpO1xuJiM0MztcdG91dHB1dCA9IGNhbGxvYygxLCA2NTUzNik7XG4mIzQzO1x0aWYgKCFyb290X2lkIHx8ICFBU1NFUlRfT0tfUFRSKG91dHB1dCwgXCYjMzQ7YWxsb2NhdGVfb3V0cHV0XCYjMzQ7KSlcbiYjNDM7XHRcdGdvdG8gb3V0O1xuJiM0MztcbiYjNDM7XHQvKiBGaWxsIHRoZSBsb3cgRkQgc2xvdHMgdG8gZXhlcmNpc2UgaW5oZXJpdGVkIGRlc2NyaXB0b3IgY2xlYW51cC4gKi9cbiYjNDM7XHRmb3IgKGkgPSAwOyBpIFx1MDAzYyBBUlJBWV9TSVpFKGluaGVyaXRlZF9mZHMpOyBpJiM0MzsmIzQzOykge1xuJiM0MztcdFx0aW50IGZkID0gb3BlbihcJiMzNDsvZGV2L251bGxcJiMzNDssIE9fUkRPTkxZKTtcbiYjNDM7XG4mIzQzO1x0XHRpZiAoIUFTU0VSVF9PS19GRChmZCwgXCYjMzQ7b3Blbl9pbmhlcml0ZWRfZmRcJiMzNDspKVxuJiM0MztcdFx0XHRnb3RvIG91dDtcbiYjNDM7XHRcdGluaGVyaXRlZF9mZHNbbnJfaW5oZXJpdGVkJiM0MzsmIzQzO10gPSBmZDtcbiYjNDM7XHR9XG4mIzQzO1xuJiM0MztcdC8qXG4mIzQzO1x0ICogQ3JlYXRlIGFsbCBmaXh0dXJlcyBiZWZvcmUgbG93ZXJpbmcgdGhlIGxpbWl0LCBhbmQga2VlcCB0aGUgdGVzdFxuJiM0MztcdCAqIHJ1bm5lciYjMzk7cyBsaW1pdCB1bmNoYW5nZWQuIFJldGFpbmluZyBldmVyeSBkaXNjb3ZlcmVkIEZEIHdvdWxkIGV4Y2VlZFxuJiM0MztcdCAqIHRoaXMgbGltaXQgYmVmb3JlIHRoZSByZWN1cnNpdmUgZHVtcCBjb3VsZCB2aXNpdCBhbGwgaW5uZXIgbWFwcy5cbiYjNDM7XHQgKi9cbiYjNDM7XHRwaWQgPSBmb3JrKCk7XG4mIzQzO1x0aWYgKCFBU1NFUlRfR0UocGlkLCAwLCBcJiMzNDtmb3JrXCYjMzQ7KSlcbiYjNDM7XHRcdGdvdG8gb3V0O1xuJiM0MztcdGlmICghcGlkKSB7XG4mIzQzO1x0XHRzdHJ1Y3QgZGlyZW50ICplbnRyeTtcbiYjNDM7XHRcdERJUiAqZGlyO1xuJiM0MztcbiYjNDM7XHRcdC8qIFJlc2VydmUgYSBzbG90IGZvciB0aGUgZGlyZWN0b3J5IGV2ZW4gaWYgdGhlIHBhcmVudCBpcyBmdWxsLiAqL1xuJiM0MztcdFx0Y2xvc2UoaW5oZXJpdGVkX2Zkc1tucl9pbmhlcml0ZWQgLSAxXSk7XG4mIzQzO1x0XHRkaXIgPSBvcGVuZGlyKFwmIzM0Oy9wcm9jL3NlbGYvZmRcJiMzNDspO1xuJiM0MztcdFx0aWYgKCFkaXIpXG4mIzQzO1x0XHRcdF9leGl0KERVTVBfRVJSX0ZEUyk7XG4mIzQzO1x0XHQvKiBUaGUgcGFyZW50IGtlZXBzIHRoZSBvdXRlciBtYXAgYW5kIGl0cyBpbm5lciBtYXBzIGFsaXZlLiAqL1xuJiM0MztcdFx0Zm9yICg7Oykge1xuJiM0MztcdFx0XHRjaGFyICplbmQ7XG4mIzQzO1x0XHRcdGxvbmcgZmQ7XG4mIzQzO1xuJiM0MztcdFx0XHRlcnJubyA9IDA7XG4mIzQzO1x0XHRcdGVudHJ5ID0gcmVhZGRpcihkaXIpO1xuJiM0MztcdFx0XHRpZiAoIWVudHJ5KSB7XG4mIzQzO1x0XHRcdFx0aWYgKGVycm5vKVxuJiM0MztcdFx0XHRcdFx0X2V4aXQoRFVNUF9FUlJfRkRTKTtcbiYjNDM7XHRcdFx0XHRicmVhaztcbiYjNDM7XHRcdFx0fVxuJiM0MztcdFx0XHRmZCA9IHN0cnRvbChlbnRyeS1cdTAwM2VkX25hbWUsIFx1MDAyNmVuZCwgMTApO1xuJiM0MztcdFx0XHRpZiAoKmVuZCB8fCBmZCBcdTAwM2MgMyB8fCBmZCA9PSBkaXJmZChkaXIpKVxuJiM0MztcdFx0XHRcdGNvbnRpbnVlO1xuJiM0MztcdFx0XHRjbG9zZShmZCk7XG4mIzQzO1x0XHR9XG4mIzQzO1x0XHRpZiAoY2xvc2VkaXIoZGlyKSlcbiYjNDM7XHRcdFx0X2V4aXQoRFVNUF9FUlJfRkRTKTtcbiYjNDM7XHRcdGlmIChzZXRybGltaXQoUkxJTUlUX05PRklMRSwgXHUwMDI2bGltaXQpKVxuJiM0MztcdFx0XHRfZXhpdChEVU1QX0VSUl9STElNSVQpO1xuJiM0MztcdFx0c25wcmludGYoY29tbWFuZCwgc2l6ZW9mKGNvbW1hbmQpLCBcJiMzNDslcyAtciBtYXAgZHVtcCBpZCAldVwmIzM0OyxcbiYjNDM7XHRcdFx0IGpzb24gPyBcJiMzNDstalwmIzM0OyA6IFwmIzM0O1wmIzM0Oywgcm9vdF9pZCk7XG4mIzQzO1x0XHRpZiAoZ2V0X2JwZnRvb2xfY29tbWFuZF9vdXRwdXQoY29tbWFuZCwgb3V0cHV0LCA2NTUzNSkpXG4mIzQzO1x0XHRcdF9leGl0KERVTVBfRVJSX0NPTU1BTkQpO1xuJiM0MztcdFx0aWYgKGNvdW50X3Rva2VuKG91dHB1dCwganNvbiA/IFwmIzM0O1xcXCYjMzQ7aWRcXFwmIzM0OzpcJiMzNDsgOiBcJiMzNDtGb3VuZCBcJiMzNDspICE9IEFSUkFZX1NJWkUoaWRzKSAmIzQzOyAxIHx8XG4mIzQzO1x0XHQgICAgY291bnRfdG9rZW4ob3V0cHV0LCBqc29uID8gXCYjMzQ7XFxcJiMzNDtpbm5lcl9tYXBfaWRcXFwmIzM0OzpcJiMzNDsgOiBcJiMzNDtpbm5lcl9tYXBfaWQ6XCYjMzQ7KSAhPVxuJiM0MztcdFx0ICAgIEFSUkFZX1NJWkUoaWRzKSlcbiYjNDM7XHRcdFx0X2V4aXQoRFVNUF9FUlJfQ09VTlRTKTtcbiYjNDM7XHRcdGZvciAoa2V5ID0gMDsga2V5IFx1MDAzYyBBUlJBWV9TSVpFKGlkcyk7IGtleSYjNDM7JiM0MzspIHtcbiYjNDM7XHRcdFx0aWYgKGpzb24pXG4mIzQzO1x0XHRcdFx0c25wcmludGYodG9rZW4sIHNpemVvZih0b2tlbiksIFwmIzM0O1xcXCYjMzQ7aWRcXFwmIzM0OzoldSxcJiMzNDssIGlkc1trZXldKTtcbiYjNDM7XHRcdFx0ZWxzZVxuJiM0MztcdFx0XHRcdHNucHJpbnRmKHRva2VuLCBzaXplb2YodG9rZW4pLCBcJiMzNDtcXG4ldTogaGFzaCAgbmFtZSBkdW1wX2lubmVyICBcJiMzNDssXG4mIzQzO1x0XHRcdFx0XHQgaWRzW2tleV0pO1xuJiM0MztcdFx0XHRpZiAoY291bnRfdG9rZW4ob3V0cHV0LCB0b2tlbikgIT0gMSlcbiYjNDM7XHRcdFx0XHRfZXhpdChEVU1QX0VSUl9JRFMpO1xuJiM0MztcdFx0fVxuJiM0MztcdFx0aWYgKGpzb24gXHUwMDI2XHUwMDI2IChvdXRwdXRbMF0gIT0gJiMzOTtbJiMzOTsgfHxcbiYjNDM7XHRcdFx0ICAgICBzdHJjbXAob3V0cHV0ICYjNDM7IHN0cmxlbihvdXRwdXQpIC0gMiwgXCYjMzQ7XVxcblwmIzM0OykpKVxuJiM0MztcdFx0XHRfZXhpdChEVU1QX0VSUl9KU09OKTtcbiYjNDM7XHRcdF9leGl0KERVTVBfT0spO1xuJiM0MztcdH1cbiYjNDM7XHRpZiAoQVNTRVJUX0VRKHdhaXRwaWQocGlkLCBcdTAwMjZzdGF0dXMsIDApLCBwaWQsIFwmIzM0O3dhaXRwaWRcJiMzNDspIFx1MDAyNlx1MDAyNlxuJiM0MztcdCAgICBBU1NFUlRfVFJVRShXSUZFWElURUQoc3RhdHVzKSwgXCYjMzQ7Y2hpbGRfZXhpdGVkXCYjMzQ7KSlcbiYjNDM7XHRcdEFTU0VSVF9FUShXRVhJVFNUQVRVUyhzdGF0dXMpLCBEVU1QX09LLCBcJiMzNDtkdW1wX3dpdGhfbG93X2ZkX2xpbWl0XCYjMzQ7KTtcbiYjNDM7XHRmb3IgKGkgPSAwOyBpIFx1MDAzYyBucl9pbmhlcml0ZWQ7IGkmIzQzOyYjNDM7KVxuJiM0MztcdFx0QVNTRVJUX0dFKGZjbnRsKGluaGVyaXRlZF9mZHNbaV0sIEZfR0VURkQpLCAwLCBcJiMzNDtwYXJlbnRfZmRfcHJlc2VydmVkXCYjMzQ7KTtcbiYjNDM7XHRBU1NFUlRfRVEobWFwX2lkKG91dGVyX2ZkKSwgcm9vdF9pZCwgXCYjMzQ7cGFyZW50X291dGVyX3ByZXNlcnZlZFwmIzM0Oyk7XG4mIzQzO291dDpcbiYjNDM7XHR3aGlsZSAobnJfaW5oZXJpdGVkKVxuJiM0MztcdFx0Y2xvc2UoaW5oZXJpdGVkX2Zkc1stLW5yX2luaGVyaXRlZF0pO1xuJiM0MztcdGZyZWUob3V0cHV0KTtcbiYjNDM7XHRpZiAob3V0ZXJfZmQgXHUwMDNlPSAwKVxuJiM0MztcdFx0Y2xvc2Uob3V0ZXJfZmQpO1xuJiM0MztcdGlmIChpbm5lcl9mZCBcdTAwM2U9IDApXG4mIzQzO1x0XHRjbG9zZShpbm5lcl9mZCk7XG4mIzQzO31cbiYjNDM7XG4mIzQzO3ZvaWQgdGVzdF9icGZ0b29sX21hcF9kdW1wKHZvaWQpXG4mIzQzO3tcbiYjNDM7XHRpZiAodGVzdF9fc3RhcnRfc3VidGVzdChcJiMzNDt1bnJlYWRhYmxlX29yZGluYXJ5XCYjMzQ7KSlcbiYjNDM7XHRcdHRlc3RfdW5yZWFkYWJsZShmYWxzZSk7XG4mIzQzO1x0aWYgKHRlc3RfX3N0YXJ0X3N1YnRlc3QoXCYjMzQ7dW5yZWFkYWJsZV9pbm5lclwmIzM0OykpXG4mIzQzO1x0XHR0ZXN0X3VucmVhZGFibGUodHJ1ZSk7XG4mIzQzO1x0aWYgKHRlc3RfX3N0YXJ0X3N1YnRlc3QoXCYjMzQ7bWFueV9pbm5lcl9tYXBzX2pzb25cJiMzNDspKVxuJiM0MztcdFx0dGVzdF9tYW55X2lubmVyX21hcHModHJ1ZSk7XG4mIzQzO1x0aWYgKHRlc3RfX3N0YXJ0X3N1YnRlc3QoXCYjMzQ7bWFueV9pbm5lcl9tYXBzX3BsYWluXCYjMzQ7KSlcbiYjNDM7XHRcdHRlc3RfbWFueV9pbm5lcl9tYXBzKGZhbHNlKTtcbiYjNDM7XHRpZiAodGVzdF9fc3RhcnRfc3VidGVzdChcJiMzNDttdWx0aXBsZV9yb290c1wmIzM0OykpXG4mIzQzO1x0XHR0ZXN0X211bHRpcGxlX3Jvb3RzKCk7XG4mIzQzO1x0aWYgKHRlc3RfX3N0YXJ0X3N1YnRlc3QoXCYjMzQ7YXJyYXlfb2ZfbWFwc1wmIzM0OykpXG4mIzQzO1x0XHR0ZXN0X291dGVyKEJQRl9NQVBfVFlQRV9BUlJBWV9PRl9NQVBTLCAxLCBmYWxzZSwgZmFsc2UpO1xuJiM0MztcdGlmICh0ZXN0X19zdGFydF9zdWJ0ZXN0KFwmIzM0O2hhc2hfb2ZfbWFwc1wmIzM0OykpXG4mIzQzO1x0XHR0ZXN0X291dGVyKEJQRl9NQVBfVFlQRV9IQVNIX09GX01BUFMsIDEsIGZhbHNlLCBmYWxzZSk7XG4mIzQzO1x0aWYgKHRlc3RfX3N0YXJ0X3N1YnRlc3QoXCYjMzQ7c2hhcmVkX2lubmVyXCYjMzQ7KSlcbiYjNDM7XHRcdHRlc3Rfb3V0ZXIoQlBGX01BUF9UWVBFX0FSUkFZX09GX01BUFMsIDIsIGZhbHNlLCBmYWxzZSk7XG4mIzQzO1x0aWYgKHRlc3RfX3N0YXJ0X3N1YnRlc3QoXCYjMzQ7ZW1wdHlfYXJyYXlfb2ZfbWFwc1wmIzM0OykpXG4mIzQzO1x0XHR0ZXN0X291dGVyKEJQRl9NQVBfVFlQRV9BUlJBWV9PRl9NQVBTLCAwLCBmYWxzZSwgZmFsc2UpO1xuJiM0MztcdGlmICh0ZXN0X19zdGFydF9zdWJ0ZXN0KFwmIzM0O2VtcHR5X2hhc2hfb2ZfbWFwc1wmIzM0OykpXG4mIzQzO1x0XHR0ZXN0X291dGVyKEJQRl9NQVBfVFlQRV9IQVNIX09GX01BUFMsIDAsIGZhbHNlLCBmYWxzZSk7XG4mIzQzO1x0aWYgKHRlc3RfX3N0YXJ0X3N1YnRlc3QoXCYjMzQ7YnRmX2lubmVyXCYjMzQ7KSlcbiYjNDM7XHRcdHRlc3Rfb3V0ZXIoQlBGX01BUF9UWVBFX0hBU0hfT0ZfTUFQUywgMSwgZmFsc2UsIHRydWUpO1xuJiM0MztcdGlmICh0ZXN0X19zdGFydF9zdWJ0ZXN0KFwmIzM0O2VtcHR5X2lubmVyXCYjMzQ7KSlcbiYjNDM7XHRcdHRlc3Rfb3V0ZXIoQlBGX01BUF9UWVBFX0hBU0hfT0ZfTUFQUywgMSwgdHJ1ZSwgZmFsc2UpO1xuJiM0Mzt9XG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+Mi8xPC90ZD4KCQkJPHRkPjIwMjYvMDkvMTEgMDQ6MDA8L3RkPgoJCQk8dGQ+YWdlbnQ8L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Y29yZTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFbmFibGVDb25maWdzJiMzNDs6IG51bGwsCiAgJiMzNDtGb2N1c1N5bWJvbHMmIzM0OzogW10sCiAgJiMzNDtSZWFzb25pbmcmIzM0OzogJiMzNDtUaGUgcGF0Y2ggbW9kaWZpZXMgb25seSB1c2VyLXNwYWNlIHRvb2xpbmcgKGJwZnRvb2wgdW5kZXIgdG9vbHMvYnBmL2JwZnRvb2wvKSBhbmQgQlBGIHNlbGZ0ZXN0cyAodG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmLykuIEl0IGRvZXMgbm90IHRvdWNoIHRoZSBMaW51eCBrZXJuZWwgaW1hZ2Ugb3Iga2VybmVsIG1vZHVsZXMsIG1ha2luZyBpdCB1bnJlYWNoYWJsZSBmb3Igc3l6a2FsbGVyIGtlcm5lbCBmdXp6aW5nLiYjMzQ7LAogICYjMzQ7V29ydGhGdXp6aW5nJiMzNDs6IGZhbHNlCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPkluc3RydWN0aW9uOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+WW91IGFyZSBhbiBleHBlcnQgTGludXgga2VybmVsIG1haW50YWluZXIgYW5kIHNlY3VyaXR5IGVuZ2luZWVyLgpZb3VyIGpvYiBpcyB0byByZXZpZXcgYSBwcm92aWRlZCBwYXRjaCBzZXJpZXMgYW5kIGV2YWx1YXRlIHdoZXRoZXIgaXQgd2FycmFudHMgZnV6emluZyB3aXRoIHN5emthbGxlci4KCklNUE9SVEFOVDogVGhlIGNoYW5nZXMgaGF2ZSBBTFJFQURZIGJlZW4gYXBwbGllZCBhbmQgY29tbWl0dGVkIGFzIHRoZSBIRUFEIGNvbW1pdCBpbgp5b3VyIHdvcmtzcGFjZS4gRG8gTk9UIHJlbHkgb24gaW50ZXJuYWwgYXNzdW1wdGlvbnMuIFlvdSBtdXN0IGFjdGl2ZWx5IHVzZSB5b3VyIGNvZGUgYWNjZXNzCnRvb2xzIHRvIGluc3BlY3QgdGhlIGFjdHVhbCBzb3VyY2UgY29kZSwgY2FsbGVycywgYW5kIHN1cnJvdW5kaW5nIGNvbnRleHQuCgo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoxLiBDT1JFIFRSSUFHRSBQSElMT1NPUEhZCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ClRoZSBnb2FsIG9mIHBhdGNoIGZ1enppbmcgaXMgdG8gZGlzY292ZXIgY3Jhc2hlcywgcmVncmVzc2lvbnMsIGV4cG9zZWQgbGF0ZW50IGJ1Z3MsCmFuZCBuZXdseSB0cmlnZ2VyZWQgYXNzZXJ0aW9ucyBpbnRyb2R1Y2VkIGJ5IHRoZSBwYXRjaCBzZXJpZXMuCgotIFJFQUNIQUJJTElUWSBJUyBUSEUgUFJJTUFSWSBHQVRFOgogIEZ1enppbmcgY2FuIG9ubHkgZGlzY292ZXIgYnVncyBpbiBjb2RlIHRoYXQgY2FuIGFjdHVhbGx5IGV4ZWN1dGUgaW4gc3RhbmRhcmQgdmlydHVhbGl6ZWQKICBlbnZpcm9ubWVudHMgKEdDRSBvciBRRU1VLCB1dGlsaXppbmcgc29mdHdhcmUtZW11bGF0ZWQgZGV2aWNlcyBsaWtlIFVTQiBnYWRnZXRzLCBuZXRkZXYsIHR1bi90YXApLgogIElmIHRoZSBtb2RpZmllZCBjb2RlIGlzIHN0cnVjdHVyYWxseSB1bnJlYWNoYWJsZSAoc2VlIFNlY3Rpb24gMiksIGl0IE1VU1QgTk9UIGJlIGZ1enplZCwKICByZWdhcmRsZXNzIG9mIHdoZXRoZXIgaXQgYWRkcyBhc3NlcnRpb25zIG9yIGNvbXBsZXggbG9naWMuCgotIERPIE5PVCBCTElORExZIFRSVVNUICYjMzQ7Tk8gRlVOQ1RJT05BTCBDSEFOR0UmIzM0OyAoTkZDSSkgT1IgJiMzNDtSRUZBQ1RPUklORyYjMzQ7IENMQUlNUzoKICBQYXRjaCBhdXRob3JzIHJvdXRpbmVseSBsYWJlbCBjaGFuZ2VzIGFzICYjMzQ7Y2xlYW51cHMmIzM0OywgJiMzNDtyZWZhY3RvcmluZ3MmIzM0Oywgb3Igc3RhdGUKICAmIzM0O05vIGZ1bmN0aW9uYWwgY2hhbmdlIGludGVuZGVkJiMzNDsuIERvIE5PVCB0YWtlIHRoZXNlIGNsYWltcyBhdCBmYWNlIHZhbHVlLgogIENvZGUgcmVmYWN0b3JpbmdzIHRoYXQgcmVhcnJhbmdlIGxvZ2ljLCBpbnRyb2R1Y2UgaGVscGVyIGZ1bmN0aW9ucywgb3IgYWx0ZXIgc3RhdGUgbWFuYWdlbWVudAogIGluIGNvcmUgc3Vic3lzdGVtcyBmcmVxdWVudGx5IGludHJvZHVjZSBzdWJ0bGUgc2VtYW50aWMgc2hpZnRzIG9yIHVuY292ZXIgbGF0ZW50IGtlcm5lbCBidWdzLgogIElmIHJlYWNoYWJsZSBleGVjdXRhYmxlIGNvZGUgaXMgbW9kaWZpZWQgb3IgcmVmYWN0b3JlZCwgaXQgTVVTVCBiZSBmdXp6ZWQuCgotIE5FVyBPUiBNT0RJRklFRCBBU1NFUlRJT05TIElOIFJFQUNIQUJMRSBDT0RFIE1VU1QgQkUgRlVaWkVEOgogIFdoZW4gYSBwYXRjaCBpbnRyb2R1Y2VzIG9yIG1vZGlmaWVzIHJ1bnRpbWUgY2hlY2tzIG9yIGFzc2VydGlvbnMgKGUuZy4sIFdBUk5fT04qLCBWTV9XQVJOX09OKiwKICBCVUdfT04qLCBsb2NrZGVwX2Fzc2VydCopIGluIHJlYWNoYWJsZSBjb2RlIHBhdGhzLCBpdCBlbmZvcmNlcyBuZXcgb3Igc3RyaWN0ZXIgaW52YXJpYW50cy4KICBFdmVuIGlmIHRoZSBhdXRob3IgYmVsaWV2ZXMgdGhlIGludmFyaWFudCBhbHdheXMgaG9sZHMsIGZ1enppbmcgaXMgZXNzZW50aWFsIHRvIHZlcmlmeSB3aGV0aGVyCiAgYW4gdW51c3VhbCBzZXF1ZW5jZSBvZiBvcGVyYXRpb25zIGNhbiB2aW9sYXRlIGl0LgoKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KMi4gV0hFTiBUTyBSRVRVUk4gV29ydGhGdXp6aW5nPWZhbHNlIChORUdBVElWRSBDUklURVJJQSkKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KUmV0dXJuIFdvcnRoRnV6emluZz1mYWxzZSBPTkxZIElGIGFsbCBtb2RpZmllZCBjb2RlIGZhbGxzIHN0cmljdGx5IGludG8gb25lIG9yIG1vcmUgb2YgdGhlc2UgY2F0ZWdvcmllczoKCi0gTm9uLWtlcm5lbCBhbmQgbm9uLWV4ZWN1dGFibGUgY2hhbmdlczoKICAqIE1vZGlmaWNhdGlvbnMgdG8gRG9jdW1lbnRhdGlvbi8sIGNvbW1lbnRzLCBvciBzcGVsbGluZyBmaXhlcy4KICAqIFVzZXItc3BhY2UgZGlyZWN0b3JpZXMsIHNlbGYtdGVzdHMsIHNhbXBsZXMsIG9yIHNjcmlwdHMgKGUuZy4sIHRvb2xzLywgc2FtcGxlcy8sIHNjcmlwdHMvLCB1c3IvKQogICAgdGhhdCBkbyBub3QgYWZmZWN0IHRoZSBjb21waWxlZCBrZXJuZWwgaW1hZ2UgKHZtbGludXgpIG9yIGtlcm5lbCBtb2R1bGVzLgogICogUHVyZWx5IGRlY29yYXRpdmUgbG9nZ2luZyAoZS5nLiwgbWVzc2FnZSBzdHJpbmdzIGluIHByX2VyciwgcHJpbnRrLCBkZXZfaW5mbykgb3IgdHJhY2Vwb2ludHMKICAgIHRoYXQgZG8gbm90IGFsdGVyIGNvbnRyb2wgZmxvdyBvciBkYXRhIHN0cnVjdHVyZXMuCiAgKiBCdWlsZCBzeXN0ZW0gb3IgS2NvbmZpZyBjaGFuZ2VzIHRoYXQgZG8gbm90IGFsdGVyIGNvbXBpbGVkIEMgbG9naWMuCi0gU3RydWN0dXJhbGx5IHVucmVhY2hhYmxlIGhhcmR3YXJlOgogICogVmVuZG9yLXNwZWNpZmljIFBDSWUgc3dpdGNoZXMsIFNtYXJ0TklDcywgb3IgR1BVIGRyaXZlcnMgKGUuZy4sIG1seHN3LCBwZHNfY29yZSwgcWVkLAogICAgaW9uaWMsIGFtZGdwdSkgcmVxdWlyaW5nIHBoeXNpY2FsIEFTSUMvUENJZSBjYXJkcyBub3QgZW11bGF0ZWQgaW4gc3RhbmRhcmQgUUVNVS4KLSBVbnJlYWNoYWJsZSBleGVjdXRpb24gcGF0aHM6CiAgKiBEcml2ZXIgdGVhcmRvd24gY2FsbGJhY2tzICgucmVtb3ZlLCAuc2h1dGRvd24sIHBjaV91bnJlZ2lzdGVyX2RyaXZlcikgZXhlY3V0ZWQgb25seSBkdXJpbmcKICAgIHBoeXNpY2FsIFBDSSBob3QtdW5wbHVnIG9yIG1hbnVhbCBzeXNmcyBkcml2ZXIgdW5iaW5kaW5nLgogICogQ29kZSBwYXRocyBleGNsdXNpdmUgdG8gYXJjaGl0ZWN0dXJlcyBvdGhlciB0aGFuIHRoZSB0YXJnZXQgYXJjaGl0ZWN0dXJlLgoKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KMy4gV0hFTiBUTyBSRVRVUk4gV29ydGhGdXp6aW5nPXRydWUgKFBPU0lUSVZFIENSSVRFUklBKQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQpSZXR1cm4gV29ydGhGdXp6aW5nPXRydWUgd2hlbmV2ZXIgdGhlIHBhdGNoIHRvdWNoZXMgcmVhY2hhYmxlIGV4ZWN1dGFibGUgY29kZSwgaW5jbHVkaW5nOgotIENvcmUgU3Vic3lzdGVtczoKICAqIEFueSBsb2dpYyBtb2RpZmljYXRpb25zIGluIG1lbW9yeSBtYW5hZ2VtZW50IChtbS8pLCBzeW5jaHJvbml6YXRpb24vbG9ja2luZyAoa2VybmVsL2xvY2tpbmcvKSwKICAgIEJQRiwgc2NoZWR1bGVyLCBjb3JlIG5ldHdvcmtpbmcsIFZGUywgb3Igc3lzY2FsbCBoYW5kbGluZy4KLSBSZWZhY3RvcmluZ3MgYW5kIENvZGUgQ2xlYW51cHM6CiAgKiBBbnkgcmVzdHJ1Y3R1cmluZyBvZiByZWFjaGFibGUgZGF0YSBzdHJ1Y3R1cmVzLCBoZWxwZXIgYWJzdHJhY3Rpb25zLCBvciBhbGdvcml0aG0gZmxvd3MuCi0gUnVudGltZSBBc3NlcnRpb25zIGFuZCBEZWZlbnNpdmUgQ2hlY2tzOgogICogQW55IGludHJvZHVjdGlvbiBvciBhbHRlcmF0aW9uIG9mIGFzc2VydGlvbnMgKFdBUk5fT04qLCBWTV9XQVJOX09OKiwgQlVHX09OKiwgZXRjLikgaW4gcmVhY2hhYmxlIHBhdGhzLgotIFJlYWNoYWJsZSBEcml2ZXJzIGFuZCBQcm90b2NvbHM6CiAgKiBEcml2ZXJzIGFjY2Vzc2libGUgdmlhIHZpcnR1YWwgYnVzZXMgKHZpcnRpbywgVVNCIGdhZGdldCwgbG9vcGJhY2ssIG5ldGxpbmssIGJpbmRlciwgc29ja2V0cywgZXRjLikuCgo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQo0LiBFWFRSQUNUSU5HIEZvY3VzU3ltYm9scyAoUFJFVkVOVElORyBESUxVVElPTikKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KV2hlbiBXb3J0aEZ1enppbmc9dHJ1ZSwgeW91IG11c3QgZXh0cmFjdCBzcGVjaWZpYyBrZXJuZWwgZnVuY3Rpb25zIGludG8gRm9jdXNTeW1ib2xzIHRvIGd1aWRlIHRoZSBmdXp6ZXI6CgotIEFWT0lEIFVCSVFVSVRPVVMgTElGRUNZQ0xFIEhPVC1QQVRIUzoKICBEbyBOT1QgbGlzdCBnZW5lcmljLCB1YmlxdWl0b3VzIGZ1bmN0aW9ucyBjYWxsZWQgYnkgYWxtb3N0IGV2ZXJ5IHByb2dyYW0gaW4gdGhlIGNvcnB1cwogIChpbmNsdWRpbmcsIGJ1dCBub3QgbGltaXRlZCB0bzogZ2VuZXJhbCBtZW1vcnkgYWxsb2NhdG9ycyBhbmQgZGVhbGxvY2F0b3JzLCBwYWdlIGZhdWx0CiAgYW5kIHRyYXAgaGFuZGxlcnMsIG9yIGNvcmUgc3luY2hyb25pemF0aW9uIHByaW1pdGl2ZXM7IHRoaXMgaXMgbm90IGFuIGV4aGF1c3RpdmUgbGlzdCkuCiAgTGlzdGluZyB1YmlxdWl0b3VzIGZ1bmN0aW9ucyBjYXVzZXMgdGhlIGZ1enplciB0byBjbGFzc2lmeSB0aG91c2FuZHMgb2YgdW5yZWxhdGVkIHRlc3RzIGFzICYjMzQ7Zm9jdXNlZCYjMzQ7LAogIHdoaWNoIHNldmVyZWx5IGRpbHV0ZXMgZnV6emluZyBlZmZvcnQgYXdheSBmcm9tIHRoZSBhY3R1YWwgY2hhbmdlcy4KCi0gVEFSR0VUIFNQRUNJRklDIEZFQVRVUkUgTE9HSUMgQU5EIEVOVFJZUE9JTlRTOgogIExpc3QgZnVuY3Rpb25zIHRoYXQgc3BlY2lmaWNhbGx5IGltcGxlbWVudCB0aGUgbG9naWMgYmVpbmcgYWRkZWQgb3IgYWx0ZXJlZCwgb3IgZGlyZWN0IEFQSSBlbnRyeXBvaW50cwogIGZvciB0aGUgc3Vic3lzdGVtIGZlYXR1cmUgdW5kZXIgcmV2aWV3LgoKLSBIQU5ETElORyBTVEFUSUMgSU5MSU5FIEZVTkNUSU9OUyBJTiBIRUFERVJTICguaCk6CiAgQ29tcGlsZXItaW5saW5lZCBzdGF0aWMgZnVuY3Rpb25zIChzdWNoIGFzIHN0YXRpYyBpbmxpbmVzIGluIG1tLyouaCBvciBpbmNsdWRlL2xpbnV4LyouaCkgbGFjawogIGRpc3RpbmN0IHN5bWJvbCBhZGRyZXNzZXMgaW4gdm1saW51eCBhbmQgY2Fubm90IGJlIHRhcmdldGVkIGRpcmVjdGx5IGJ5IHN5bWJvbCBjb3ZlcmFnZSBmaWx0ZXJzLgogIElmIHRoZSBjaGFuZ2VzIGFyZSBwcmltYXJpbHkgaW4gc3RhdGljIGlubGluZSBoZWxwZXJzLCBpZGVudGlmeSBub24tc3RhdGljLCBmZWF0dXJlLXNwZWNpZmljIGNhbGxlcgogIGZ1bmN0aW9ucyBpbiAuYyBmaWxlcyB0aGF0IGV4ZXJjaXNlIHRoZW0gKGF2b2lkaW5nIHViaXF1aXRvdXMgbGlmZWN5Y2xlIHdyYXBwZXJzKS4KCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CjUuIElERU5USUZZSU5HIEVuYWJsZUNvbmZpZ3MKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KSWRlbnRpZnkgYW55IHNwZWNpZmljIENPTkZJR18gb3B0aW9ucyByZXF1aXJlZCB0byBwcm9wZXJseSBjb21waWxlIGFuZCByZWFjaCB0aGUgbW9kaWZpZWQgY29kZToKLSBJbnNwZWN0IEtjb25maWcgZmlsZXMgYW5kICNpZmRlZiBndWFyZHM7IGRvIG5vdCBtYWtlIGFzc3VtcHRpb25zLgotIENoZWNrICYjMzQ7ZGVwZW5kcyBvbiYjMzQ7IGxpbmVzIGluIEtjb25maWcgdG8gaW5jbHVkZSBhbnkgbm9uLXN0YW5kYXJkIHBhcmVudCBzdWJzeXN0ZW0gY29uZmlncyBuZWVkZWQuCi0gU3RyaXAgYW55ICYjMzk7Q09ORklHXyYjMzk7IHByZWZpeCAoZS5nLiwgcmV0dXJuICYjMzQ7TkVUX0lQVjQmIzM0OyBpbnN0ZWFkIG9mICYjMzQ7Q09ORklHX05FVF9JUFY0JiMzNDspLgpQcmVmZXIgY2FsbGluZyBzZXZlcmFsIHRvb2xzIGF0IHRoZSBzYW1lIHRpbWUgdG8gc2F2ZSByb3VuZC10cmlwcy4KCgpVc2Ugc2V0LXJlc3VsdHMgdG9vbCB0byBwcm92aWRlIHJlc3VsdHMgb2YgdGhlIGFuYWx5c2lzLgpJdCBtdXN0IGJlIGNhbGxlZCBleGFjdGx5IG9uY2UgYmVmb3JlIHRoZSBmaW5hbCByZXBseS4KSWdub3JlIHJlc3VsdHMgb2YgdGhpcyB0b29sLgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlByb21wdDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPlRhcmdldCBhcmNoaXRlY3R1cmU6IGFtZDY0CgpGb3IgeW91ciBjb252ZW5pZW5jZSwgaGVyZSBpcyB0aGUgZGlmZiBvZiB0aGUgY2hhbmdlczoKY29tbWl0IDUwODA4ZjZlODc4Zjg4OWUwYTM0MDc5YTk0NTZjMDMzNGM1MjIyMGQKQXV0aG9yOiBzeXotY2x1c3RlciAmbHQ7dHJpYWdlQHN5emthbGxlci5jb20mZ3Q7CkRhdGU6ICAgRnJpIFNlcCAxMSAwNDowMDowMSAyMDI2ICYjNDM7MDAwMAoKICAgIHN5ei1jbHVzdGVyOiBhcHBsaWVkIHBhdGNoIHVuZGVyIHJldmlldwoKZGlmZiAtLWdpdCBhL3Rvb2xzL2JwZi9icGZ0b29sL0RvY3VtZW50YXRpb24vYnBmdG9vbC1tYXAucnN0IGIvdG9vbHMvYnBmL2JwZnRvb2wvRG9jdW1lbnRhdGlvbi9icGZ0b29sLW1hcC5yc3QKaW5kZXggNWRhZjNkZTVjNzQ0Ni4uMjNmYWE2NzI2ODU4NyAxMDA2NDQKLS0tIGEvdG9vbHMvYnBmL2JwZnRvb2wvRG9jdW1lbnRhdGlvbi9icGZ0b29sLW1hcC5yc3QKJiM0MzsmIzQzOyYjNDM7IGIvdG9vbHMvYnBmL2JwZnRvb2wvRG9jdW1lbnRhdGlvbi9icGZ0b29sLW1hcC5yc3QKQEAgLTE2LDcgJiM0MzsxNiw4IEBAIFNZTk9QU0lTCiAKICoqYnBmdG9vbCoqIFsqT1BUSU9OUypdICoqbWFwKiogKkNPTU1BTkQqCiAKLSpPUFRJT05TKiA6PSB7IHxDT01NT05fT1BUSU9OU3wgfCB7ICoqLWYqKiB8ICoqLS1icGZmcyoqIH0gfCB7ICoqLW4qKiB8ICoqLS1ub21vdW50KiogfSB9CiYjNDM7Kk9QVElPTlMqIDo9IHsgfENPTU1PTl9PUFRJT05TfCB8IHsgKiotZioqIHwgKiotLWJwZmZzKiogfSB8CiYjNDM7eyAqKi1uKiogfCAqKi0tbm9tb3VudCoqIH0gfCB7ICoqLXIqKiB8ICoqLS1yZWN1cnNpdmUqKiB9IH0KIAogKkNPTU1BTkRTKiA6PQogeyAqKnNob3cqKiB8ICoqbGlzdCoqIHwgKipjcmVhdGUqKiB8ICoqZHVtcCoqIHwgKip1cGRhdGUqKiB8ICoqbG9va3VwKiogfCAqKmdldG5leHQqKiB8CkBAIC0xNzAsNiAmIzQzOzE3MSwyNSBAQCBPUFRJT05TCiAgICAgRG8gbm90IGF1dG9tYXRpY2FsbHkgYXR0ZW1wdCB0byBtb3VudCBhbnkgdmlydHVhbCBmaWxlIHN5c3RlbSAoc3VjaCBhcwogICAgIHRyYWNlZnMgb3IgQlBGIHZpcnR1YWwgZmlsZSBzeXN0ZW0pIHdoZW4gbmVjZXNzYXJ5LgogCiYjNDM7LXIsIC0tcmVjdXJzaXZlCiYjNDM7ICAgIEFsc28gZHVtcCB0aGUgaW5uZXIgbWFwcyByZWZlcmVuY2VkIGJ5ICoqYXJyYXlfb2ZfbWFwcyoqIGFuZCAqKmhhc2hfb2ZfbWFwcyoqCiYjNDM7ICAgIGVudHJpZXMgd2hlbiBydW5uaW5nICoqbWFwIGR1bXAqKi4gRWFjaCBtYXAgSUQgaXMgdmlzaXRlZCBvbmNlLCBldmVuIGlmCiYjNDM7ICAgIHNldmVyYWwgZW50cmllcyByZWZlciB0byBpdC4gU2VsZWN0ZWQgbWFwcyBhcmUgZm9sbG93ZWQgYnkgdGhlaXIgaW5uZXIgbWFwcy4KJiM0MzsKJiM0MzsgICAgUGxhaW4gb3V0cHV0IGluY2x1ZGVzIGEgaGVhZGVyIGlkZW50aWZ5aW5nIGVhY2ggbWFwLiBPbiBzdWNjZXNzLCBKU09OIG91dHB1dAomIzQzOyAgICBpcyBhbHdheXMgYW4gYXJyYXkgb2YgbWFwIG9iamVjdHMsIGVhY2ggY29udGFpbmluZyBhbiAqKmlkKiogYW5kIGFuCiYjNDM7ICAgICoqZWxlbWVudHMqKiBhcnJheSwgaW5jbHVkaW5nIHdoZW4gb25seSBvbmUgbWFwIGlzIGR1bXBlZC4gT3V0ZXIgbWFwIGVudHJpZXMKJiM0MzsgICAgcmV0YWluIHRoZWlyICoqaW5uZXJfbWFwX2lkKiogZmllbGQsIHdoaWNoIGlkZW50aWZpZXMgdGhlIGNvcnJlc3BvbmRpbmcgaW5uZXIKJiM0MzsgICAgbWFwIG9iamVjdC4KJiM0MzsKJiM0MzsgICAgSW5uZXIgbWFwIElEcyBhcmUgcmVzb2x2ZWQgd2hlbiB0aGUgbWFwcyBhcmUgdmlzaXRlZC4gVGhlIGR1bXAgaXMgbm90IGFuCiYjNDM7ICAgIGF0b21pYyBzbmFwc2hvdDogY29uY3VycmVudCB1cGRhdGVzIGNhbiBjaGFuZ2UgbWFwIGNvbnRlbnRzIG9yIHJlbW92ZSBhCiYjNDM7ICAgIHJlZmVyZW5jZWQgaW5uZXIgbWFwIGJlZm9yZSBpdCBpcyB2aXNpdGVkLiBGYWlsdXJlIHRvIG9wZW4gYSByZWZlcmVuY2VkCiYjNDM7ICAgIGlubmVyIG1hcCBzdG9wcyB0aGUgZHVtcCBhbmQgcmV0dXJucyBhIG5vbnplcm8gZXhpdCBzdGF0dXMuIE91dHB1dCBtYXkKJiM0MzsgICAgY29udGFpbiBtYXBzIG9yIGVudHJpZXMgcHJpbnRlZCBiZWZvcmUgdGhlIGVycm9yLgomIzQzOwomIzQzOyAgICBJbiBKU09OIG1vZGUsIHRoZSBlbmNsb3NpbmcgYXJyYXlzIGFuZCBvYmplY3RzIGFyZSBjbG9zZWQgYmVmb3JlIHJldHVybmluZy4KJiM0MzsKIEVYQU1QTEVTCiA9PT09PT09PQogKiojIGJwZnRvb2wgbWFwIHNob3cqKgpkaWZmIC0tZ2l0IGEvdG9vbHMvYnBmL2JwZnRvb2wvYmFzaC1jb21wbGV0aW9uL2JwZnRvb2wgYi90b29scy9icGYvYnBmdG9vbC9iYXNoLWNvbXBsZXRpb24vYnBmdG9vbAppbmRleCA3NWNiY2I1MTJlYmFlLi40NWMzMzZkNjNiZTBhIDEwMDY0NAotLS0gYS90b29scy9icGYvYnBmdG9vbC9iYXNoLWNvbXBsZXRpb24vYnBmdG9vbAomIzQzOyYjNDM7JiM0MzsgYi90b29scy9icGYvYnBmdG9vbC9iYXNoLWNvbXBsZXRpb24vYnBmdG9vbApAQCAtMjYxLDcgJiM0MzsyNjEsNyBAQCBfYnBmdG9vbCgpCiAKICAgICAjIERlYWwgd2l0aCBvcHRpb25zCiAgICAgaWYgW1sgJHt3b3Jkc1tjd29yZF19ID09IC0qIF1dOyB0aGVuCi0gICAgICAgIGxvY2FsIGM9JiMzOTstLXZlcnNpb24gLS1qc29uIC0tcHJldHR5IC0tYnBmZnMgLS1tYXBjb21wYXQgLS1kZWJ1ZyBcCiYjNDM7ICAgICAgICBsb2NhbCBjPSYjMzk7LS12ZXJzaW9uIC0tanNvbiAtLXByZXR0eSAtLXJlY3Vyc2l2ZSAtLWJwZmZzIC0tbWFwY29tcGF0IC0tZGVidWcgXAogICAgICAgICAgICAgLS11c2UtbG9hZGVyIC0tYmFzZS1idGYgLS1zaWduIC1pIC1rJiMzOTsKICAgICAgICAgQ09NUFJFUExZPSggJCggY29tcGdlbiAtVyAmIzM0OyRjJiMzNDsgLS0gJiMzNDskY3VyJiMzNDsgKSApCiAgICAgICAgIHJldHVybiAwCmRpZmYgLS1naXQgYS90b29scy9icGYvYnBmdG9vbC9tYWluLmMgYi90b29scy9icGYvYnBmdG9vbC9tYWluLmMKaW5kZXggNWFiYWJkOGY3ZDBhMC4uYzBmNGRmMTAxMDIxMiAxMDA2NDQKLS0tIGEvdG9vbHMvYnBmL2JwZnRvb2wvbWFpbi5jCiYjNDM7JiM0MzsmIzQzOyBiL3Rvb2xzL2JwZi9icGZ0b29sL21haW4uYwpAQCAtMjYsNiAmIzQzOzI2LDcgQEAgc3RhdGljIGludCAoKmxhc3RfZG9faGVscCkoaW50IGFyZ2MsIGNoYXIgKiphcmd2KTsKIGpzb25fd3JpdGVyX3QgKmpzb25fd3RyOwogYm9vbCBwcmV0dHlfb3V0cHV0OwogYm9vbCBqc29uX291dHB1dDsKJiM0Mztib29sIHJlY3Vyc2l2ZV9kdW1wOwogYm9vbCBzaG93X3Bpbm5lZDsKIGJvb2wgYmxvY2tfbW91bnQ7CiBib29sIHZlcmlmaWVyX2xvZ3M7CkBAIC00NTYsNiAmIzQzOzQ1Nyw3IEBAIGludCBtYWluKGludCBhcmdjLCBjaGFyICoqYXJndikKIAkJeyAmIzM0O2pzb24mIzM0OywJbm9fYXJndW1lbnQsCU5VTEwsCSYjMzk7aiYjMzk7IH0sCiAJCXsgJiMzNDtoZWxwJiMzNDssCW5vX2FyZ3VtZW50LAlOVUxMLAkmIzM5O2gmIzM5OyB9LAogCQl7ICYjMzQ7cHJldHR5JiMzNDssCW5vX2FyZ3VtZW50LAlOVUxMLAkmIzM5O3AmIzM5OyB9LAomIzQzOwkJeyAmIzM0O3JlY3Vyc2l2ZSYjMzQ7LAlub19hcmd1bWVudCwJTlVMTCwJJiMzOTtyJiMzOTsgfSwKIAkJeyAmIzM0O3ZlcnNpb24mIzM0OywJbm9fYXJndW1lbnQsCU5VTEwsCSYjMzk7ViYjMzk7IH0sCiAJCXsgJiMzNDticGZmcyYjMzQ7LAlub19hcmd1bWVudCwJTlVMTCwJJiMzOTtmJiMzOTsgfSwKIAkJeyAmIzM0O21hcGNvbXBhdCYjMzQ7LAlub19hcmd1bWVudCwJTlVMTCwJJiMzOTttJiMzOTsgfSwKQEAgLTQ3OSw3ICYjNDM7NDgxLDcgQEAgaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KQogCWJpbl9uYW1lID0gJiMzNDticGZ0b29sJiMzNDs7CiAKIAlvcHRlcnIgPSAwOwotCXdoaWxlICgob3B0ID0gZ2V0b3B0X2xvbmcoYXJnYywgYXJndiwgJiMzNDtWaHBqZkxtbmRTaTprOkI6bCYjMzQ7LAomIzQzOwl3aGlsZSAoKG9wdCA9IGdldG9wdF9sb25nKGFyZ2MsIGFyZ3YsICYjMzQ7VmhwanJmTG1uZFNpOms6QjpsJiMzNDssCiAJCQkJICBvcHRpb25zLCBOVUxMKSkgJmd0Oz0gMCkgewogCQlzd2l0Y2ggKG9wdCkgewogCQljYXNlICYjMzk7ViYjMzk7OgpAQCAtNTAxLDYgJiM0Mzs1MDMsOSBAQCBpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpCiAJCQl9CiAJCQlqc29ud19wcmV0dHkoanNvbl93dHIsIHByZXR0eV9vdXRwdXQpOwogCQkJYnJlYWs7CiYjNDM7CQljYXNlICYjMzk7ciYjMzk7OgomIzQzOwkJCXJlY3Vyc2l2ZV9kdW1wID0gdHJ1ZTsKJiM0MzsJCQlicmVhazsKIAkJY2FzZSAmIzM5O2YmIzM5OzoKIAkJCXNob3dfcGlubmVkID0gdHJ1ZTsKIAkJCWJyZWFrOwpkaWZmIC0tZ2l0IGEvdG9vbHMvYnBmL2JwZnRvb2wvbWFpbi5oIGIvdG9vbHMvYnBmL2JwZnRvb2wvbWFpbi5oCmluZGV4IDkzMTVhMWRiMWY3YzIuLjQzZWYwYWE1OTJkYjYgMTAwNjQ0Ci0tLSBhL3Rvb2xzL2JwZi9icGZ0b29sL21haW4uaAomIzQzOyYjNDM7JiM0MzsgYi90b29scy9icGYvYnBmdG9vbC9tYWluLmgKQEAgLTgzLDYgJiM0Mzs4Myw3IEBAIGV4dGVybiBjb25zdCBjaGFyICpiaW5fbmFtZTsKIAogZXh0ZXJuIGpzb25fd3JpdGVyX3QgKmpzb25fd3RyOwogZXh0ZXJuIGJvb2wganNvbl9vdXRwdXQ7CiYjNDM7ZXh0ZXJuIGJvb2wgcmVjdXJzaXZlX2R1bXA7CiBleHRlcm4gYm9vbCBzaG93X3Bpbm5lZDsKIGV4dGVybiBib29sIHNob3dfcGlkczsKIGV4dGVybiBib29sIGJsb2NrX21vdW50OwpkaWZmIC0tZ2l0IGEvdG9vbHMvYnBmL2JwZnRvb2wvbWFwLmMgYi90b29scy9icGYvYnBmdG9vbC9tYXAuYwppbmRleCA2ODRhOGZiNzI0MTQ2Li5jMDUwNWY1MDQ5Njc0IDEwMDY0NAotLS0gYS90b29scy9icGYvYnBmdG9vbC9tYXAuYwomIzQzOyYjNDM7JiM0MzsgYi90b29scy9icGYvYnBmdG9vbC9tYXAuYwpAQCAtMTcsNiAmIzQzOzE3LDcgQEAKICNpbmNsdWRlICZsdDticGYvYnBmLmgmZ3Q7CiAjaW5jbHVkZSAmbHQ7YnBmL2J0Zi5oJmd0OwogI2luY2x1ZGUgJmx0O2JwZi9oYXNobWFwLmgmZ3Q7CiYjNDM7I2luY2x1ZGUgJmx0O2JwZi9saWJicGZfaW50ZXJuYWwuaCZndDsKIAogI2luY2x1ZGUgJiMzNDtqc29uX3dyaXRlci5oJiMzNDsKICNpbmNsdWRlICYjMzQ7bWFpbi5oJiMzNDsKQEAgLTgyNiwxMiAmIzQzOzgyNyw0NCBAQCBzdGF0aWMgdm9pZCBmcmVlX21hcF9rdl9idGYoc3RydWN0IGJ0ZiAqYnRmKQogCQlidGZfX2ZyZWUoYnRmKTsKIH0KIAomIzQzO3N0cnVjdCBtYXBfZHVtcF9jdHggewomIzQzOwlzdHJ1Y3QgaGFzaG1hcCAqc2VlbjsKJiM0MzsJX191MzIgKnBlbmRpbmdfaWRzOwomIzQzOwlzaXplX3QgcGVuZGluZ19jbnQ7CiYjNDM7fTsKJiM0MzsKJiM0MztzdGF0aWMgaW50IGNvbGxlY3RfaW5uZXJfbWFwKHN0cnVjdCBtYXBfZHVtcF9jdHggKmN0eCwgX191MzIgaWQpCiYjNDM7ewomIzQzOwlfX3UzMiAqaWRzOwomIzQzOwlpbnQgZXJyOwomIzQzOwomIzQzOwlpZiAoaGFzaG1hcF9fZmluZChjdHgtJmd0O3NlZW4sIGlkLCBOVUxMKSkKJiM0MzsJCXJldHVybiAwOwomIzQzOwomIzQzOwlpZHMgPSBsaWJicGZfcmVhbGxvY2FycmF5KGN0eC0mZ3Q7cGVuZGluZ19pZHMsIGN0eC0mZ3Q7cGVuZGluZ19jbnQgJiM0MzsgMSwKJiM0MzsJCQkJICBzaXplb2YoKmlkcykpOwomIzQzOwlpZiAoIWlkcykgewomIzQzOwkJcF9lcnIoJiMzNDttZW0gYWxsb2MgZmFpbGVkJiMzNDspOwomIzQzOwkJcmV0dXJuIC0xOwomIzQzOwl9CiYjNDM7CWN0eC0mZ3Q7cGVuZGluZ19pZHMgPSBpZHM7CiYjNDM7CiYjNDM7CWVyciA9IGhhc2htYXBfX2FkZChjdHgtJmd0O3NlZW4sIGlkLCAwKTsKJiM0MzsJaWYgKGVycikgewomIzQzOwkJcF9lcnIoJiMzNDtmYWlsZWQgdG8gcmVjb3JkIGlubmVyIG1hcCBpZCAldTogJXMmIzM0OywgaWQsIHN0cmVycm9yKC1lcnIpKTsKJiM0MzsJCXJldHVybiAtMTsKJiM0MzsJfQomIzQzOwlpZHNbY3R4LSZndDtwZW5kaW5nX2NudCYjNDM7JiM0MztdID0gaWQ7CiYjNDM7CXJldHVybiAwOwomIzQzO30KJiM0MzsKIHN0YXRpYyBpbnQKIG1hcF9kdW1wKGludCBmZCwgc3RydWN0IGJwZl9tYXBfaW5mbyAqaW5mbywganNvbl93cml0ZXJfdCAqd3RyLAotCSBib29sIHNob3dfaGVhZGVyKQomIzQzOwkgYm9vbCBzaG93X2hlYWRlciwgc3RydWN0IG1hcF9kdW1wX2N0eCAqY3R4KQogewogCXZvaWQgKmtleSwgKnZhbHVlLCAqcHJldl9rZXk7CiAJdW5zaWduZWQgaW50IG51bV9lbGVtcyA9IDA7CiYjNDM7CWpzb25fd3JpdGVyX3QgKnBsYWluX2J0Zl93dHIgPSBOVUxMOwogCXN0cnVjdCBidGYgKmJ0ZiA9IE5VTEw7CiAJaW50IGVycjsKIApAQCAtODQ1LDYgJiM0Mzs4NzgsMTcgQEAgbWFwX2R1bXAoaW50IGZkLCBzdHJ1Y3QgYnBmX21hcF9pbmZvICppbmZvLCBqc29uX3dyaXRlcl90ICp3dHIsCiAKIAlwcmV2X2tleSA9IE5VTEw7CiAKJiM0MzsJaWYgKGN0eCAmYW1wOyZhbXA7ICF3dHIgJmFtcDsmYW1wOyAoaW5mby0mZ3Q7YnRmX3ZhbHVlX3R5cGVfaWQgfHwKJiM0MzsJCQkgICAgaW5mby0mZ3Q7YnRmX3ZtbGludXhfdmFsdWVfdHlwZV9pZCkpIHsKJiM0MzsJCXBsYWluX2J0Zl93dHIgPSBnZXRfYnRmX3dyaXRlcigpOwomIzQzOwkJaWYgKHBsYWluX2J0Zl93dHIpIHsKJiM0MzsJCQlpZiAoc2hvd19oZWFkZXIpCiYjNDM7CQkJCXNob3dfbWFwX2hlYWRlcl9wbGFpbihpbmZvKTsKJiM0MzsJCQlzaG93X2hlYWRlciA9IGZhbHNlOwomIzQzOwkJCXd0ciA9IHBsYWluX2J0Zl93dHI7CiYjNDM7CQl9CiYjNDM7CX0KJiM0MzsKIAlpZiAod3RyKSB7CiAJCWVyciA9IGdldF9tYXBfa3ZfYnRmKGluZm8sICZhbXA7YnRmKTsKIAkJaWYgKGVycikgewpAQCAtODc0LDEwICYjNDM7OTE4LDIwIEBAIG1hcF9kdW1wKGludCBmZCwgc3RydWN0IGJwZl9tYXBfaW5mbyAqaW5mbywganNvbl93cml0ZXJfdCAqd3RyLAogCQlpZiAoZXJyKSB7CiAJCQlpZiAoZXJybm8gPT0gRU5PRU5UKQogCQkJCWVyciA9IDA7CiYjNDM7CQkJZWxzZSBpZiAoY3R4KQomIzQzOwkJCQlwX2VycigmIzM0O2NhbiYjMzk7dCBnZXQgbmV4dCBrZXkgZm9yIG1hcCBpZCAldTogJXMmIzM0OywKJiM0MzsJCQkJICAgICAgaW5mby0mZ3Q7aWQsIHN0cmVycm9yKGVycm5vKSk7CiAJCQlicmVhazsKIAkJfQotCQlpZiAoIWR1bXBfbWFwX2VsZW0oZmQsIGtleSwgdmFsdWUsIGluZm8sIGJ0Ziwgd3RyKSkKJiM0MzsJCWVyciA9IGR1bXBfbWFwX2VsZW0oZmQsIGtleSwgdmFsdWUsIGluZm8sIGJ0Ziwgd3RyKTsKJiM0MzsJCWlmICghZXJyKSB7CiAJCQludW1fZWxlbXMmIzQzOyYjNDM7OwomIzQzOwkJCWlmIChjdHggJmFtcDsmYW1wOyBtYXBfaXNfbWFwX29mX21hcHMoaW5mby0mZ3Q7dHlwZSkpIHsKJiM0MzsJCQkJZXJyID0gY29sbGVjdF9pbm5lcl9tYXAoY3R4LCAqKF9fdTMyICopdmFsdWUpOwomIzQzOwkJCQlpZiAoZXJyKQomIzQzOwkJCQkJYnJlYWs7CiYjNDM7CQkJfQomIzQzOwkJfQogCQlwcmV2X2tleSA9IGtleTsKIAl9CiAKQEAgLTg5NCwxOCAmIzQzOzk0OCwyNSBAQCBtYXBfZHVtcChpbnQgZmQsIHN0cnVjdCBicGZfbWFwX2luZm8gKmluZm8sIGpzb25fd3JpdGVyX3QgKnd0ciwKIAlmcmVlKGtleSk7CiAJZnJlZSh2YWx1ZSk7CiAJZnJlZV9tYXBfa3ZfYnRmKGJ0Zik7CiYjNDM7CWlmIChwbGFpbl9idGZfd3RyKQomIzQzOwkJanNvbndfZGVzdHJveSgmYW1wO3BsYWluX2J0Zl93dHIpOwogCiAJcmV0dXJuIGVycjsKIH0KIAogc3RhdGljIGludCBkb19kdW1wKGludCBhcmdjLCBjaGFyICoqYXJndikKIHsKJiM0MzsJTElCQlBGX09QVFMoYnBmX2dldF9mZF9ieV9pZF9vcHRzLCBvcHRzLAomIzQzOwkJICAgIC5vcGVuX2ZsYWdzID0gQlBGX0ZfUkRPTkxZLAomIzQzOwkpOwogCWpzb25fd3JpdGVyX3QgKnd0ciA9IE5VTEwsICpidGZfd3RyID0gTlVMTDsKIAlzdHJ1Y3QgYnBmX21hcF9pbmZvIGluZm8gPSB7fTsKJiM0MzsJc3RydWN0IG1hcF9kdW1wX2N0eCBjdHggPSB7fTsKIAlpbnQgbmJfZmRzLCBpID0gMDsKIAlfX3UzMiBsZW4gPSBzaXplb2YoaW5mbyk7CiAJaW50ICpmZHMgPSBOVUxMOwogCWludCBlcnIgPSAtMTsKJiM0MzsJc2l6ZV90IGo7CiAKIAlpZiAoYXJnYyAhPSAyKQogCQl1c2FnZSgpOwpAQCAtOTE5LDkgJiM0Mzs5ODAsMzUgQEAgc3RhdGljIGludCBkb19kdW1wKGludCBhcmdjLCBjaGFyICoqYXJndikKIAlpZiAobmJfZmRzICZsdDsgMSkKIAkJZ290byBleGl0X2ZyZWU7CiAKJiM0MzsJaWYgKHJlY3Vyc2l2ZV9kdW1wKSB7CiYjNDM7CQljdHguc2VlbiA9IGhhc2htYXBfX25ldyhoYXNoX2ZuX2Zvcl9rZXlfYXNfaWQsCiYjNDM7CQkJCQllcXVhbF9mbl9mb3Jfa2V5X2FzX2lkLCBOVUxMKTsKJiM0MzsJCWlmIChJU19FUlIoY3R4LnNlZW4pKSB7CiYjNDM7CQkJY3R4LnNlZW4gPSBOVUxMOwomIzQzOwkJCXBfZXJyKCYjMzQ7ZmFpbGVkIHRvIGNyZWF0ZSBoYXNobWFwIGZvciByZWN1cnNpdmUgZHVtcCYjMzQ7KTsKJiM0MzsJCQlnb3RvIGV4aXRfY2xvc2U7CiYjNDM7CQl9CiYjNDM7CQkvKiBSZWNvcmQgdGhlIHNlbGVjdGVkIG1hcHMgYmVmb3JlIGRpc2NvdmVyaW5nIGFueSBpbm5lciBtYXBzLiAqLwomIzQzOwkJZm9yIChpID0gMDsgaSAmbHQ7IG5iX2ZkczsgaSYjNDM7JiM0MzspIHsKJiM0MzsJCQlsZW4gPSBzaXplb2YoaW5mbyk7CiYjNDM7CQkJaWYgKGJwZl9tYXBfZ2V0X2luZm9fYnlfZmQoZmRzW2ldLCAmYW1wO2luZm8sICZhbXA7bGVuKSkgewomIzQzOwkJCQlwX2VycigmIzM0O2NhbiYjMzk7dCBnZXQgbWFwIGluZm86ICVzJiMzNDssIHN0cmVycm9yKGVycm5vKSk7CiYjNDM7CQkJCWVyciA9IC0xOwomIzQzOwkJCQlnb3RvIGV4aXRfY2xvc2U7CiYjNDM7CQkJfQomIzQzOwkJCWVyciA9IGhhc2htYXBfX2FkZChjdHguc2VlbiwgaW5mby5pZCwgMCk7CiYjNDM7CQkJaWYgKGVycikgewomIzQzOwkJCQlwX2VycigmIzM0O2ZhaWxlZCB0byByZWNvcmQgbWFwIGlkICV1OiAlcyYjMzQ7LCBpbmZvLmlkLAomIzQzOwkJCQkgICAgICBzdHJlcnJvcigtZXJyKSk7CiYjNDM7CQkJCWVyciA9IC0xOwomIzQzOwkJCQlnb3RvIGV4aXRfY2xvc2U7CiYjNDM7CQkJfQomIzQzOwkJfQomIzQzOwl9CiYjNDM7CiAJaWYgKGpzb25fb3V0cHV0KSB7CiAJCXd0ciA9IGpzb25fd3RyOwotCX0gZWxzZSB7CiYjNDM7CX0gZWxzZSBpZiAoIXJlY3Vyc2l2ZV9kdW1wKSB7CiAJCWludCBkb19wbGFpbl9idGY7CiAKIAkJZG9fcGxhaW5fYnRmID0gbWFwc19oYXZlX2J0ZihmZHMsIG5iX2Zkcyk7CkBAIC05MzYsNyAmIzQzOzEwMjMsNyBAQCBzdGF0aWMgaW50IGRvX2R1bXAoaW50IGFyZ2MsIGNoYXIgKiphcmd2KQogCQl9CiAJfQogCi0JaWYgKHd0ciAmYW1wOyZhbXA7IG5iX2ZkcyAmZ3Q7IDEpCiYjNDM7CWlmICh3dHIgJmFtcDsmYW1wOyAobmJfZmRzICZndDsgMSB8fCByZWN1cnNpdmVfZHVtcCkpCiAJCWpzb253X3N0YXJ0X2FycmF5KHd0cik7CS8qIHJvb3QgYXJyYXkgKi8KIAlmb3IgKGkgPSAwOyBpICZsdDsgbmJfZmRzOyBpJiM0MzsmIzQzOykgewogCQlpZiAoYnBmX21hcF9nZXRfaW5mb19ieV9mZChmZHNbaV0sICZhbXA7aW5mbywgJmFtcDtsZW4pKSB7CkBAIC05NDQsMjIgJiM0MzsxMDMxLDUwIEBAIHN0YXRpYyBpbnQgZG9fZHVtcChpbnQgYXJnYywgY2hhciAqKmFyZ3YpCiAJCQllcnIgPSAtMTsKIAkJCWJyZWFrOwogCQl9Ci0JCWVyciA9IG1hcF9kdW1wKGZkc1tpXSwgJmFtcDtpbmZvLCB3dHIsIG5iX2ZkcyAmZ3Q7IDEpOwomIzQzOwkJZXJyID0gbWFwX2R1bXAoZmRzW2ldLCAmYW1wO2luZm8sIHd0ciwgbmJfZmRzICZndDsgMSB8fCByZWN1cnNpdmVfZHVtcCwKJiM0MzsJCQkgICAgICAgcmVjdXJzaXZlX2R1bXAgPyAmYW1wO2N0eCA6IE5VTEwpOwogCQlpZiAoIXd0ciAmYW1wOyZhbXA7IGkgIT0gbmJfZmRzIC0gMSkKIAkJCXByaW50ZigmIzM0O1xuJiMzNDspOwogCiAJCWlmIChlcnIpCiAJCQlicmVhazsKLQkJY2xvc2UoZmRzW2ldKTsKJiM0MzsJCS8qIEtlZXAgc2VsZWN0ZWQgbWFwcyBhbGl2ZSB3aGlsZSB2aXNpdGluZyB0aGVpciBpbm5lciBtYXBzLiAqLwomIzQzOwkJaWYgKCFyZWN1cnNpdmVfZHVtcCkKJiM0MzsJCQljbG9zZShmZHNbaV0pOwomIzQzOwl9CiYjNDM7CWZvciAoaiA9IDA7ICFlcnIgJmFtcDsmYW1wOyBqICZsdDsgY3R4LnBlbmRpbmdfY250OyBqJiM0MzsmIzQzOykgewomIzQzOwkJaW50IGZkOwomIzQzOwomIzQzOwkJZmQgPSBicGZfbWFwX2dldF9mZF9ieV9pZF9vcHRzKGN0eC5wZW5kaW5nX2lkc1tqXSwgJmFtcDtvcHRzKTsKJiM0MzsJCWlmIChmZCAmbHQ7IDApIHsKJiM0MzsJCQlwX2VycigmIzM0O2NhbiYjMzk7dCBvcGVuIGlubmVyIG1hcCBpZCAldTogJXMmIzM0OywKJiM0MzsJCQkgICAgICBjdHgucGVuZGluZ19pZHNbal0sIHN0cmVycm9yKGVycm5vKSk7CiYjNDM7CQkJZXJyID0gLTE7CiYjNDM7CQkJYnJlYWs7CiYjNDM7CQl9CiYjNDM7CQlsZW4gPSBzaXplb2YoaW5mbyk7CiYjNDM7CQlpZiAoYnBmX21hcF9nZXRfaW5mb19ieV9mZChmZCwgJmFtcDtpbmZvLCAmYW1wO2xlbikpIHsKJiM0MzsJCQlwX2VycigmIzM0O2NhbiYjMzk7dCBnZXQgbWFwIGluZm86ICVzJiMzNDssIHN0cmVycm9yKGVycm5vKSk7CiYjNDM7CQkJZXJyID0gLTE7CiYjNDM7CQl9IGVsc2UgewomIzQzOwkJCWlmICghd3RyKQomIzQzOwkJCQlwcmludGYoJiMzNDtcbiYjMzQ7KTsKJiM0MzsJCQllcnIgPSBtYXBfZHVtcChmZCwgJmFtcDtpbmZvLCB3dHIsIHRydWUsICZhbXA7Y3R4KTsKJiM0MzsJCX0KJiM0MzsJCWNsb3NlKGZkKTsKIAl9Ci0JaWYgKHd0ciAmYW1wOyZhbXA7IG5iX2ZkcyAmZ3Q7IDEpCiYjNDM7CWlmICh3dHIgJmFtcDsmYW1wOyAobmJfZmRzICZndDsgMSB8fCByZWN1cnNpdmVfZHVtcCkpCiAJCWpzb253X2VuZF9hcnJheSh3dHIpOwkvKiByb290IGFycmF5ICovCiAKIAlpZiAoYnRmX3d0cikKIAkJanNvbndfZGVzdHJveSgmYW1wO2J0Zl93dHIpOwogZXhpdF9jbG9zZToKJiM0MzsJaWYgKHJlY3Vyc2l2ZV9kdW1wKQomIzQzOwkJaSA9IDA7CiAJZm9yICg7IGkgJmx0OyBuYl9mZHM7IGkmIzQzOyYjNDM7KQogCQljbG9zZShmZHNbaV0pOwomIzQzOwloYXNobWFwX19mcmVlKGN0eC5zZWVuKTsKJiM0MzsJZnJlZShjdHgucGVuZGluZ19pZHMpOwogZXhpdF9mcmVlOgogCWZyZWUoZmRzKTsKIAlmcmVlX2J0Zl92bWxpbnV4KCk7CkBAIC0xNDg0LDcgJiM0MzsxNTk5LDcgQEAgc3RhdGljIGludCBkb19oZWxwKGludCBhcmdjLCBjaGFyICoqYXJndikKIAkJJiMzNDsgICAgICAgICAgICAgICAgIHRhc2tfc3RvcmFnZSB8IGJsb29tX2ZpbHRlciB8IHVzZXJfcmluZ2J1ZiB8IGNncnBfc3RvcmFnZSB8IGFyZW5hIHxcbiYjMzQ7CiAJCSYjMzQ7ICAgICAgICAgICAgICAgICBpbnNuX2FycmF5IHwgcmhhc2ggfVxuJiMzNDsKIAkJJiMzNDsgICAgICAgJiMzNDsgSEVMUF9TUEVDX09QVElPTlMgJiMzNDsgfFxuJiMzNDsKLQkJJiMzNDsgICAgICAgICAgICAgICAgICAgIHstZnwtLWJwZmZzfSB8IHstbnwtLW5vbW91bnR9IH1cbiYjMzQ7CiYjNDM7CQkmIzM0OyAgICAgICAgICAgICAgICAgICAgey1mfC0tYnBmZnN9IHwgey1ufC0tbm9tb3VudH0gfCB7LXJ8LS1yZWN1cnNpdmV9IH1cbiYjMzQ7CiAJCSYjMzQ7JiMzNDssCiAJCWJpbl9uYW1lLCBhcmd2Wy0yXSk7CiAKZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9wcm9nX3Rlc3RzL2JwZnRvb2xfbWFwX2R1bXAuYyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9wcm9nX3Rlc3RzL2JwZnRvb2xfbWFwX2R1bXAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMDAwMDAwLi4xZmI4NzdmYzY4YzgzCi0tLSAvZGV2L251bGwKJiM0MzsmIzQzOyYjNDM7IGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dfdGVzdHMvYnBmdG9vbF9tYXBfZHVtcC5jCkBAIC0wLDAgJiM0MzsxLDQ3NCBAQAomIzQzOy8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4wLW9ubHkKJiM0MzsjaW5jbHVkZSAmbHQ7dGVzdF9wcm9ncy5oJmd0OwomIzQzOyNpbmNsdWRlICZsdDticGZ0b29sX2hlbHBlcnMuaCZndDsKJiM0MzsjaW5jbHVkZSAmbHQ7YnBmL2J0Zi5oJmd0OwomIzQzOyNpbmNsdWRlICZsdDtzeXMvcmVzb3VyY2UuaCZndDsKJiM0MzsjaW5jbHVkZSAmbHQ7ZGlyZW50LmgmZ3Q7CiYjNDM7CiYjNDM7I2RlZmluZSBPVVRQVVRfU0laRSA4MTkyCiYjNDM7CiYjNDM7c3RhdGljIGJvb2wgZHVtcF9tYXAoX191MzIgaWQsIGNvbnN0IGNoYXIgKm9wdGlvbnMsIGNoYXIgKm91dHB1dCkKJiM0Mzt7CiYjNDM7CWNoYXIgY29tbWFuZFtNQVhfQlBGVE9PTF9DTURfTEVOXTsKJiM0MzsKJiM0MzsJc25wcmludGYoY29tbWFuZCwgc2l6ZW9mKGNvbW1hbmQpLCAmIzM0OyVzIG1hcCBkdW1wIGlkICV1JiMzNDssIG9wdGlvbnMsIGlkKTsKJiM0MzsJbWVtc2V0KG91dHB1dCwgMCwgT1VUUFVUX1NJWkUpOwomIzQzOwlpZiAoIUFTU0VSVF9PSyhnZXRfYnBmdG9vbF9jb21tYW5kX291dHB1dChjb21tYW5kLCBvdXRwdXQsIE9VVFBVVF9TSVpFIC0gMSksCiYjNDM7CQkgICAgICAgJiMzNDtkdW1wX21hcCYjMzQ7KSkKJiM0MzsJCXJldHVybiBmYWxzZTsKJiM0MzsJLyogVGhlIGhlbHBlciBsZWF2ZXMgdGhlIHRyYWlsaW5nIG5ld2xpbmUgaW4gcGxhY2UuICovCiYjNDM7CW91dHB1dFtzdHJjc3BuKG91dHB1dCwgJiMzNDtcbiYjMzQ7KV0gPSAmIzM5O1wwJiMzOTs7CiYjNDM7CXJldHVybiB0cnVlOwomIzQzO30KJiM0MzsKJiM0MztzdGF0aWMgX191MzIgbWFwX2lkKGludCBmZCkKJiM0Mzt7CiYjNDM7CXN0cnVjdCBicGZfbWFwX2luZm8gaW5mbyA9IHt9OwomIzQzOwlfX3UzMiBsZW4gPSBzaXplb2YoaW5mbyk7CiYjNDM7CiYjNDM7CWlmICghQVNTRVJUX09LKGJwZl9tYXBfZ2V0X2luZm9fYnlfZmQoZmQsICZhbXA7aW5mbywgJmFtcDtsZW4pLCAmIzM0O21hcF9pbmZvJiMzNDspKQomIzQzOwkJcmV0dXJuIDA7CiYjNDM7CXJldHVybiBpbmZvLmlkOwomIzQzO30KJiM0MzsKJiM0MztzdGF0aWMgaW50IGNvdW50X3Rva2VuKGNvbnN0IGNoYXIgKm91dHB1dCwgY29uc3QgY2hhciAqdG9rZW4pCiYjNDM7ewomIzQzOwlpbnQgY291bnQgPSAwOwomIzQzOwomIzQzOwl3aGlsZSAoKG91dHB1dCA9IHN0cnN0cihvdXRwdXQsIHRva2VuKSkpIHsKJiM0MzsJCWNvdW50JiM0MzsmIzQzOzsKJiM0MzsJCW91dHB1dCAmIzQzOz0gc3RybGVuKHRva2VuKTsKJiM0MzsJfQomIzQzOwlyZXR1cm4gY291bnQ7CiYjNDM7fQomIzQzOwomIzQzO3N0YXRpYyB2b2lkIGNoZWNrX3BsYWluKF9fdTMyIHJvb3RfaWQsIF9fdTMyIGlubmVyX2lkLCBjb25zdCBjaGFyICp0eXBlLAomIzQzOwkJCWludCBlbnRyaWVzLCBib29sIHR5cGVkKQomIzQzO3sKJiM0MzsJY2hhciBjb21tYW5kW01BWF9CUEZUT09MX0NNRF9MRU5dLCBoZWFkZXJbMTI4XTsKJiM0MzsJY2hhciBvdXRwdXRbT1VUUFVUX1NJWkVdID0ge307CiYjNDM7CWNvbnN0IGNoYXIgKnJvb3QsICppbm5lcjsKJiM0MzsKJiM0MzsJc25wcmludGYoY29tbWFuZCwgc2l6ZW9mKGNvbW1hbmQpLCAmIzM0Oy0tcmVjdXJzaXZlIG1hcCBkdW1wIGlkICV1JiMzNDssIHJvb3RfaWQpOwomIzQzOwlpZiAoIUFTU0VSVF9PSyhnZXRfYnBmdG9vbF9jb21tYW5kX291dHB1dChjb21tYW5kLCBvdXRwdXQsIHNpemVvZihvdXRwdXQpIC0gMSksCiYjNDM7CQkgICAgICAgJiMzNDtwbGFpbl9kdW1wJiMzNDspKQomIzQzOwkJcmV0dXJuOwomIzQzOwlzbnByaW50ZihoZWFkZXIsIHNpemVvZihoZWFkZXIpLCAmIzM0OyV1OiAlcyAgbmFtZSBkdW1wX291dGVyICAmIzM0Oywgcm9vdF9pZCwgdHlwZSk7CiYjNDM7CXJvb3QgPSBzdHJzdHIob3V0cHV0LCBoZWFkZXIpOwomIzQzOwlpZiAoIUFTU0VSVF9PS19QVFIocm9vdCwgJiMzNDtwbGFpbl9yb290X2hlYWRlciYjMzQ7KSkKJiM0MzsJCXJldHVybjsKJiM0MzsJQVNTRVJUX0VRKHJvb3QgLSBvdXRwdXQsIDAsICYjMzQ7cGxhaW5fcm9vdF9maXJzdCYjMzQ7KTsKJiM0MzsJQVNTRVJUX0VRKGNvdW50X3Rva2VuKG91dHB1dCwgJiMzNDtpbm5lcl9tYXBfaWQ6JiMzNDspLCBlbnRyaWVzLCAmIzM0O3BsYWluX3JlZmVyZW5jZXMmIzM0Oyk7CiYjNDM7CWlmIChlbnRyaWVzKSB7CiYjNDM7CQlzbnByaW50ZihoZWFkZXIsIHNpemVvZihoZWFkZXIpLCAmIzM0OyV1OiBoYXNoICBuYW1lIGR1bXBfaW5uZXIgICYjMzQ7LCBpbm5lcl9pZCk7CiYjNDM7CQlpbm5lciA9IHN0cnN0cihvdXRwdXQsIGhlYWRlcik7CiYjNDM7CQlpZiAoQVNTRVJUX09LX1BUUihpbm5lciwgJiMzNDtwbGFpbl9pbm5lcl9oZWFkZXImIzM0OykpCiYjNDM7CQkJQVNTRVJUX0dUKGlubmVyIC0gcm9vdCwgMCwgJiMzNDtwbGFpbl9pbm5lcl9hZnRlcl9yb290JiMzNDspOwomIzQzOwkJQVNTRVJUX0VRKGNvdW50X3Rva2VuKG91dHB1dCwgaGVhZGVyKSwgMSwgJiMzNDtwbGFpbl9pbm5lcl9vbmNlJiMzNDspOwomIzQzOwl9CiYjNDM7CUFTU0VSVF9FUShjb3VudF90b2tlbihvdXRwdXQsICYjMzQ7Rm91bmQgJiMzNDspLCBlbnRyaWVzICZhbXA7JmFtcDsgIXR5cGVkID8gMiA6IDEsCiYjNDM7CQkgICYjMzQ7cGxhaW5fbWFwX2NvdW50JiMzNDspOwomIzQzOwlpZiAodHlwZWQpIHsKJiM0MzsJCUFTU0VSVF9IQVNfU1VCU1RSKG91dHB1dCwgJiMzNDtcJiMzNDtrZXlcJiMzNDs6IDAmIzM0OywgJiMzNDtwbGFpbl9idGZfa2V5JiMzNDspOwomIzQzOwkJQVNTRVJUX0hBU19TVUJTVFIob3V0cHV0LCAmIzM0O1wmIzM0O3ZhbHVlXCYjMzQ7OiAxNjg0MzAwOSYjMzQ7LCAmIzM0O3BsYWluX2J0Zl92YWx1ZSYjMzQ7KTsKJiM0MzsJfQomIzQzO30KJiM0MzsKJiM0MztzdGF0aWMgdm9pZCB0ZXN0X291dGVyKGVudW0gYnBmX21hcF90eXBlIHR5cGUsIGludCBlbnRyaWVzLCBib29sIGVtcHR5X2lubmVyLAomIzQzOwkJICAgICAgIGJvb2wgdHlwZWQpCiYjNDM7ewomIzQzOwlMSUJCUEZfT1BUUyhicGZfbWFwX2NyZWF0ZV9vcHRzLCBvcHRzKTsKJiM0MzsJTElCQlBGX09QVFMoYnBmX21hcF9jcmVhdGVfb3B0cywgaW5uZXJfb3B0cyk7CiYjNDM7CXN0cnVjdCBidGYgKmJ0ZiA9IE5VTEw7CiYjNDM7CWNoYXIgb3V0ZXJbT1VUUFVUX1NJWkVdLCBpbm5lcltPVVRQVVRfU0laRV0sIG91dHB1dFtPVVRQVVRfU0laRV07CiYjNDM7CWNoYXIgZXhwZWN0ZWRbT1VUUFVUX1NJWkUgKiAzXSwgcmVmZXJlbmNlWzY0XTsKJiM0MzsJY29uc3QgY2hhciAqdHlwZV9uYW1lID0gbGliYnBmX2JwZl9tYXBfdHlwZV9zdHIodHlwZSk7CiYjNDM7CWludCBpbm5lcl9mZCA9IC0xLCBvdXRlcl9mZCA9IC0xOwomIzQzOwlfX3UzMiByb290X2lkLCBpbm5lcl9pZCwga2V5LCB2YWx1ZSA9IDB4MDEwMTAxMDE7CiYjNDM7CiYjNDM7CWlmICh0eXBlZCkgewomIzQzOwkJYnRmID0gYnRmX19uZXdfZW1wdHkoKTsKJiM0MzsJCWlmICghQVNTRVJUX09LX1BUUihidGYsICYjMzQ7Y3JlYXRlX2J0ZiYjMzQ7KSB8fAomIzQzOwkJICAgICFBU1NFUlRfRVEoYnRmX19hZGRfaW50KGJ0ZiwgJiMzNDt1bnNpZ25lZCBpbnQmIzM0OywgNCwgMCksIDEsICYjMzQ7YnRmX2ludCYjMzQ7KSB8fAomIzQzOwkJICAgICFBU1NFUlRfT0soYnRmX19sb2FkX2ludG9fa2VybmVsKGJ0ZiksICYjMzQ7bG9hZF9idGYmIzM0OykpCiYjNDM7CQkJZ290byBvdXQ7CiYjNDM7CQlpbm5lcl9vcHRzLmJ0Zl9mZCA9IGJ0Zl9fZmQoYnRmKTsKJiM0MzsJCWlubmVyX29wdHMuYnRmX2tleV90eXBlX2lkID0gMTsKJiM0MzsJCWlubmVyX29wdHMuYnRmX3ZhbHVlX3R5cGVfaWQgPSAxOwomIzQzOwl9CiYjNDM7CWlubmVyX2ZkID0gYnBmX21hcF9jcmVhdGUoQlBGX01BUF9UWVBFX0hBU0gsICYjMzQ7ZHVtcF9pbm5lciYjMzQ7LCBzaXplb2Yoa2V5KSwKJiM0MzsJCQkJICBzaXplb2YodmFsdWUpLCAyLCAmYW1wO2lubmVyX29wdHMpOwomIzQzOwlpZiAoIUFTU0VSVF9PS19GRChpbm5lcl9mZCwgJiMzNDtjcmVhdGVfaW5uZXImIzM0OykpCiYjNDM7CQlnb3RvIG91dDsKJiM0MzsJa2V5ID0gMDsKJiM0MzsJaWYgKCFlbXB0eV9pbm5lciAmYW1wOyZhbXA7CiYjNDM7CSAgICAhQVNTRVJUX09LKGJwZl9tYXBfdXBkYXRlX2VsZW0oaW5uZXJfZmQsICZhbXA7a2V5LCAmYW1wO3ZhbHVlLCBCUEZfQU5ZKSwKJiM0MzsJCSAgICAgICAmIzM0O3BvcHVsYXRlX2lubmVyJiMzNDspKQomIzQzOwkJZ290byBvdXQ7CiYjNDM7CW9wdHMuaW5uZXJfbWFwX2ZkID0gaW5uZXJfZmQ7CiYjNDM7CW91dGVyX2ZkID0gYnBmX21hcF9jcmVhdGUodHlwZSwgJiMzNDtkdW1wX291dGVyJiMzNDssIHNpemVvZihrZXkpLCBzaXplb2YoX191MzIpLAomIzQzOwkJCQkgIDMsICZhbXA7b3B0cyk7CiYjNDM7CWlmICghQVNTRVJUX09LX0ZEKG91dGVyX2ZkLCAmIzM0O2NyZWF0ZV9vdXRlciYjMzQ7KSkKJiM0MzsJCWdvdG8gb3V0OwomIzQzOwkvKiBUaGUgdW51c2VkIHRoaXJkIGFycmF5IHNsb3QgYWxzbyBleGVyY2lzZXMgZmFpbGVkIGxvb2t1cHMuICovCiYjNDM7CWZvciAoa2V5ID0gMDsga2V5ICZsdDsgZW50cmllczsga2V5JiM0MzsmIzQzOykKJiM0MzsJCWlmICghQVNTRVJUX09LKGJwZl9tYXBfdXBkYXRlX2VsZW0ob3V0ZXJfZmQsICZhbXA7a2V5LCAmYW1wO2lubmVyX2ZkLCBCUEZfQU5ZKSwKJiM0MzsJCQkgICAgICAgJiMzNDtwb3B1bGF0ZV9vdXRlciYjMzQ7KSkKJiM0MzsJCQlnb3RvIG91dDsKJiM0MzsJcm9vdF9pZCA9IG1hcF9pZChvdXRlcl9mZCk7CiYjNDM7CWlubmVyX2lkID0gbWFwX2lkKGlubmVyX2ZkKTsKJiM0MzsJaWYgKCFyb290X2lkIHx8ICFpbm5lcl9pZCB8fCAhZHVtcF9tYXAocm9vdF9pZCwgJiMzNDstaiYjMzQ7LCBvdXRlcikgfHwKJiM0MzsJICAgICFkdW1wX21hcChpbm5lcl9pZCwgJiMzNDstaiYjMzQ7LCBpbm5lcikpCiYjNDM7CQlnb3RvIG91dDsKJiM0MzsKJiM0MzsJQVNTRVJUX0VRKG91dGVyWzBdLCAmIzM5O1smIzM5OywgJiMzNDtkZWZhdWx0X2FycmF5JiMzNDspOwomIzQzOwlBU1NFUlRfRVEoY291bnRfdG9rZW4ob3V0ZXIsICYjMzQ7XCYjMzQ7ZWxlbWVudHNcJiMzNDs6JiMzNDspLCAwLCAmIzM0O2RlZmF1bHRfbm9fd3JhcHBlciYjMzQ7KTsKJiM0MzsJQVNTRVJUX0VRKGNvdW50X3Rva2VuKG91dGVyLCAmIzM0O1wmIzM0O2lkXCYjMzQ7OiYjMzQ7KSwgMCwgJiMzNDtkZWZhdWx0X25vX2hlYWRlciYjMzQ7KTsKJiM0MzsJc25wcmludGYocmVmZXJlbmNlLCBzaXplb2YocmVmZXJlbmNlKSwgJiMzNDtcJiMzNDtpbm5lcl9tYXBfaWRcJiMzNDs6JXUmIzM0OywgaW5uZXJfaWQpOwomIzQzOwlBU1NFUlRfRVEoY291bnRfdG9rZW4ob3V0ZXIsIHJlZmVyZW5jZSksIGVudHJpZXMsICYjMzQ7ZGVmYXVsdF9yZWZlcmVuY2VzJiMzNDspOwomIzQzOwlpZiAoIWVudHJpZXMpCiYjNDM7CQlBU1NFUlRfU1RSRVEob3V0ZXIsICYjMzQ7W10mIzM0OywgJiMzNDtlbXB0eV9vdXRlcl9kZWZhdWx0JiMzNDspOwomIzQzOwlpZiAoZW1wdHlfaW5uZXIpCiYjNDM7CQlBU1NFUlRfU1RSRVEoaW5uZXIsICYjMzQ7W10mIzM0OywgJiMzNDtlbXB0eV9pbm5lcl9kZWZhdWx0JiMzNDspOwomIzQzOwllbHNlIGlmICh0eXBlZCkKJiM0MzsJCUFTU0VSVF9IQVNfU1VCU1RSKGlubmVyLCAmIzM0O1wmIzM0O2Zvcm1hdHRlZFwmIzM0Ozp7XCYjMzQ7a2V5XCYjMzQ7OjAsXCYjMzQ7dmFsdWVcJiMzNDs6MTY4NDMwMDl9JiMzNDssCiYjNDM7CQkJCSAgJiMzNDt0eXBlZF9pbm5lciYjMzQ7KTsKJiM0MzsJZWxzZQomIzQzOwkJQVNTRVJUX1NUUkVRKGlubmVyLAomIzQzOwkJCSAgICAgJiMzNDtbe1wmIzM0O2tleVwmIzM0OzpbXCYjMzQ7MHgwMFwmIzM0OyxcJiMzNDsweDAwXCYjMzQ7LFwmIzM0OzB4MDBcJiMzNDssXCYjMzQ7MHgwMFwmIzM0O10sJiMzNDsKJiM0MzsJCQkgICAgICYjMzQ7XCYjMzQ7dmFsdWVcJiMzNDs6W1wmIzM0OzB4MDFcJiMzNDssXCYjMzQ7MHgwMVwmIzM0OyxcJiMzNDsweDAxXCYjMzQ7LFwmIzM0OzB4MDFcJiMzNDtdfV0mIzM0OywKJiM0MzsJCQkgICAgICYjMzQ7b3JkaW5hcnlfZGVmYXVsdCYjMzQ7KTsKJiM0MzsKJiM0MzsJLyoKJiM0MzsJICogQ29tcGFyZSB0aGUgY29tcGxldGUgSlNPTiBkb2N1bWVudDogYSBmbGF0IGFycmF5IHdpdGggdGhlIHJvb3QgZmlyc3QsCiYjNDM7CSAqIG9uZSBjb3B5IG9mIHRoZSBzaGFyZWQgaW5uZXIgbWFwLCBhbmQgdW5jaGFuZ2VkIGVudHJ5IHJlcHJlc2VudGF0aW9ucy4KJiM0MzsJICovCiYjNDM7CWlmIChlbnRyaWVzKQomIzQzOwkJc25wcmludGYoZXhwZWN0ZWQsIHNpemVvZihleHBlY3RlZCksCiYjNDM7CQkJICYjMzQ7W3tcJiMzNDtpZFwmIzM0OzoldSxcJiMzNDt0eXBlXCYjMzQ7OlwmIzM0OyVzXCYjMzQ7LFwmIzM0O25hbWVcJiMzNDs6XCYjMzQ7ZHVtcF9vdXRlclwmIzM0OywmIzM0OwomIzQzOwkJCSAmIzM0O1wmIzM0O2ZsYWdzXCYjMzQ7OjAsXCYjMzQ7ZWxlbWVudHNcJiMzNDs6JXN9LHtcJiMzNDtpZFwmIzM0OzoldSxcJiMzNDt0eXBlXCYjMzQ7OlwmIzM0O2hhc2hcJiMzNDssJiMzNDsKJiM0MzsJCQkgJiMzNDtcJiMzNDtuYW1lXCYjMzQ7OlwmIzM0O2R1bXBfaW5uZXJcJiMzNDssXCYjMzQ7ZmxhZ3NcJiMzNDs6MCxcJiMzNDtlbGVtZW50c1wmIzM0Ozolc31dJiMzNDssCiYjNDM7CQkJIHJvb3RfaWQsIHR5cGVfbmFtZSwgb3V0ZXIsIGlubmVyX2lkLCBpbm5lcik7CiYjNDM7CWVsc2UKJiM0MzsJCXNucHJpbnRmKGV4cGVjdGVkLCBzaXplb2YoZXhwZWN0ZWQpLAomIzQzOwkJCSAmIzM0O1t7XCYjMzQ7aWRcJiMzNDs6JXUsXCYjMzQ7dHlwZVwmIzM0OzpcJiMzNDslc1wmIzM0OyxcJiMzNDtuYW1lXCYjMzQ7OlwmIzM0O2R1bXBfb3V0ZXJcJiMzNDssJiMzNDsKJiM0MzsJCQkgJiMzNDtcJiMzNDtmbGFnc1wmIzM0OzowLFwmIzM0O2VsZW1lbnRzXCYjMzQ7OltdfV0mIzM0Oywgcm9vdF9pZCwgdHlwZV9uYW1lKTsKJiM0MzsJaWYgKGR1bXBfbWFwKHJvb3RfaWQsICYjMzQ7LWogLXImIzM0Oywgb3V0cHV0KSkKJiM0MzsJCUFTU0VSVF9TVFJFUShvdXRwdXQsIGV4cGVjdGVkLCAmIzM0O3JlY3Vyc2l2ZV9qc29uJiMzNDspOwomIzQzOwlpZiAoZHVtcF9tYXAocm9vdF9pZCwgJiMzNDstLWpzb24gLS1yZWN1cnNpdmUmIzM0Oywgb3V0cHV0KSkKJiM0MzsJCUFTU0VSVF9TVFJFUShvdXRwdXQsIGV4cGVjdGVkLCAmIzM0O3JlY3Vyc2l2ZV9sb25nX29wdGlvbnMmIzM0Oyk7CiYjNDM7CWNoZWNrX3BsYWluKHJvb3RfaWQsIGlubmVyX2lkLCB0eXBlX25hbWUsIGVudHJpZXMsIHR5cGVkKTsKJiM0MzsKJiM0MzsJLyogUmVjdXJzaW9uIG9uIGFuIG9yZGluYXJ5IG1hcCBzdGlsbCBlbWl0cyBhIHNpbmdsZSBtYXAgb2JqZWN0LiAqLwomIzQzOwlzbnByaW50ZihleHBlY3RlZCwgc2l6ZW9mKGV4cGVjdGVkKSwKJiM0MzsJCSAmIzM0O1t7XCYjMzQ7aWRcJiMzNDs6JXUsXCYjMzQ7dHlwZVwmIzM0OzpcJiMzNDtoYXNoXCYjMzQ7LFwmIzM0O25hbWVcJiMzNDs6XCYjMzQ7ZHVtcF9pbm5lclwmIzM0OywmIzM0OwomIzQzOwkJICYjMzQ7XCYjMzQ7ZmxhZ3NcJiMzNDs6MCxcJiMzNDtlbGVtZW50c1wmIzM0Ozolc31dJiMzNDssIGlubmVyX2lkLCBpbm5lcik7CiYjNDM7CWlmIChkdW1wX21hcChpbm5lcl9pZCwgJiMzNDstaiAtciYjMzQ7LCBvdXRwdXQpKQomIzQzOwkJQVNTRVJUX1NUUkVRKG91dHB1dCwgZXhwZWN0ZWQsICYjMzQ7b3JkaW5hcnlfcmVjdXJzaXZlJiMzNDspOwomIzQzO291dDoKJiM0MzsJaWYgKG91dGVyX2ZkICZndDs9IDApCiYjNDM7CQljbG9zZShvdXRlcl9mZCk7CiYjNDM7CWlmIChpbm5lcl9mZCAmZ3Q7PSAwKQomIzQzOwkJY2xvc2UoaW5uZXJfZmQpOwomIzQzOwlidGZfX2ZyZWUoYnRmKTsKJiM0Mzt9CiYjNDM7CiYjNDM7c3RhdGljIHZvaWQgdGVzdF9tdWx0aXBsZV9yb290cyh2b2lkKQomIzQzO3sKJiM0MzsJTElCQlBGX09QVFMoYnBmX21hcF9jcmVhdGVfb3B0cywgb3B0cyk7CiYjNDM7CWNoYXIgY29tbWFuZFtNQVhfQlBGVE9PTF9DTURfTEVOXSwgbmFtZVtCUEZfT0JKX05BTUVfTEVOXTsKJiM0MzsJY2hhciBvdXRwdXRbT1VUUFVUX1NJWkVdID0ge30sIGV4cGVjdGVkW09VVFBVVF9TSVpFICogNF0sIGVsZW1lbnRzW09VVFBVVF9TSVpFXTsKJiM0MzsJc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCB0eXBlc1tdID0geyAmIzM0O2hhc2gmIzM0OywgJiMzNDthcnJheV9vZl9tYXBzJiMzNDssICYjMzQ7aGFzaF9vZl9tYXBzJiMzNDssICYjMzQ7aGFzaCYjMzQ7IH07CiYjNDM7CWludCBmZHNbXSA9IHsgLTEsIC0xLCAtMSwgLTEgfTsKJiM0MzsJX191MzIgaWRzWzRdLCBrZXk7CiYjNDM7CWludCBpLCBsZW4gPSAwOwomIzQzOwomIzQzOwkvKgomIzQzOwkgKiBTZWxlY3QgdGhlIGZpcnN0IGlubmVyIG1hcCBhbmQgYm90aCBvdXRlcnMgYXMgcm9vdHMuIFRoZSBvdGhlciBpbm5lcgomIzQzOwkgKiBtYXAgbXVzdCBiZSBhcHBlbmRlZCBhZnRlciBhbGwgdGhyZWUgcm9vdHMsIGV2ZW4gdGhvdWdoIGl0IGlzIGZvdW5kCiYjNDM7CSAqIHdoaWxlIGR1bXBpbmcgdGhlIGZpcnN0IG91dGVyLiBBIHByb2Nlc3Mtc3BlY2lmaWMgbmFtZSBhdm9pZHMgb3RoZXIKJiM0MzsJICogdGVzdHMmIzM5OyBtYXBzIGpvaW5pbmcgdGhlIHNlbGVjdGlvbi4KJiM0MzsJICovCiYjNDM7CXNucHJpbnRmKG5hbWUsIHNpemVvZihuYW1lKSwgJiMzNDtkdW1wXyV1JiMzNDssIGdldHBpZCgpKTsKJiM0MzsJZmRzWzBdID0gYnBmX21hcF9jcmVhdGUoQlBGX01BUF9UWVBFX0hBU0gsIG5hbWUsIDQsIDQsIDEsIE5VTEwpOwomIzQzOwlpZiAoIUFTU0VSVF9PS19GRChmZHNbMF0sICYjMzQ7Y3JlYXRlX3NlbGVjdGVkX2lubmVyJiMzNDspKQomIzQzOwkJZ290byBvdXQ7CiYjNDM7CWZkc1szXSA9IGJwZl9tYXBfY3JlYXRlKEJQRl9NQVBfVFlQRV9IQVNILCAmIzM0O2R1bXBfZGlzY292ZXJlZCYjMzQ7LCA0LCA0LCAxLCBOVUxMKTsKJiM0MzsJaWYgKCFBU1NFUlRfT0tfRkQoZmRzWzNdLCAmIzM0O2NyZWF0ZV9kaXNjb3ZlcmVkX2lubmVyJiMzNDspKQomIzQzOwkJZ290byBvdXQ7CiYjNDM7CW9wdHMuaW5uZXJfbWFwX2ZkID0gZmRzWzBdOwomIzQzOwlmZHNbMV0gPSBicGZfbWFwX2NyZWF0ZShCUEZfTUFQX1RZUEVfQVJSQVlfT0ZfTUFQUywgbmFtZSwgNCwgNCwgMiwgJmFtcDtvcHRzKTsKJiM0MzsJaWYgKCFBU1NFUlRfT0tfRkQoZmRzWzFdLCAmIzM0O2NyZWF0ZV9hcnJheV9yb290JiMzNDspKQomIzQzOwkJZ290byBvdXQ7CiYjNDM7CWZkc1syXSA9IGJwZl9tYXBfY3JlYXRlKEJQRl9NQVBfVFlQRV9IQVNIX09GX01BUFMsIG5hbWUsIDQsIDQsIDIsICZhbXA7b3B0cyk7CiYjNDM7CWlmICghQVNTRVJUX09LX0ZEKGZkc1syXSwgJiMzNDtjcmVhdGVfaGFzaF9yb290JiMzNDspKQomIzQzOwkJZ290byBvdXQ7CiYjNDM7CWZvciAoaSA9IDE7IGkgJmx0Oz0gMjsgaSYjNDM7JiM0MzspIHsKJiM0MzsJCWtleSA9IDA7CiYjNDM7CQlpZiAoIUFTU0VSVF9PSyhicGZfbWFwX3VwZGF0ZV9lbGVtKGZkc1tpXSwgJmFtcDtrZXksICZhbXA7ZmRzWzBdLCBCUEZfQU5ZKSwKJiM0MzsJCQkgICAgICAgJiMzNDtyZWZlcmVuY2Vfc2VsZWN0ZWRfaW5uZXImIzM0OykpCiYjNDM7CQkJZ290byBvdXQ7CiYjNDM7CQlrZXkgPSAxOwomIzQzOwkJaWYgKCFBU1NFUlRfT0soYnBmX21hcF91cGRhdGVfZWxlbShmZHNbaV0sICZhbXA7a2V5LCAmYW1wO2Zkc1szXSwgQlBGX0FOWSksCiYjNDM7CQkJICAgICAgICYjMzQ7cmVmZXJlbmNlX2Rpc2NvdmVyZWRfaW5uZXImIzM0OykpCiYjNDM7CQkJZ290byBvdXQ7CiYjNDM7CX0KJiM0MzsJZm9yIChpID0gMDsgaSAmbHQ7IEFSUkFZX1NJWkUoZmRzKTsgaSYjNDM7JiM0MzspIHsKJiM0MzsJCWlkc1tpXSA9IG1hcF9pZChmZHNbaV0pOwomIzQzOwkJaWYgKCFpZHNbaV0gfHwgIWR1bXBfbWFwKGlkc1tpXSwgJiMzNDstaiYjMzQ7LCBlbGVtZW50cykpCiYjNDM7CQkJZ290byBvdXQ7CiYjNDM7CQlsZW4gJiM0Mzs9IHNucHJpbnRmKGV4cGVjdGVkICYjNDM7IGxlbiwgc2l6ZW9mKGV4cGVjdGVkKSAtIGxlbiwKJiM0MzsJCQkJJiMzNDslc3tcJiMzNDtpZFwmIzM0OzoldSxcJiMzNDt0eXBlXCYjMzQ7OlwmIzM0OyVzXCYjMzQ7LFwmIzM0O25hbWVcJiMzNDs6XCYjMzQ7JXNcJiMzNDssJiMzNDsKJiM0MzsJCQkJJiMzNDtcJiMzNDtmbGFnc1wmIzM0OzowLFwmIzM0O2VsZW1lbnRzXCYjMzQ7OiVzfSVzJiMzNDssCiYjNDM7CQkJCWkgPyAmIzM0OywmIzM0OyA6ICYjMzQ7WyYjMzQ7LCBpZHNbaV0sIHR5cGVzW2ldLAomIzQzOwkJCQlpID09IDMgPyAmIzM0O2R1bXBfZGlzY292ZXJlZCYjMzQ7IDogbmFtZSwgZWxlbWVudHMsIGkgPT0gMyA/ICYjMzQ7XSYjMzQ7IDogJiMzNDsmIzM0Oyk7CiYjNDM7CX0KJiM0MzsJc25wcmludGYoY29tbWFuZCwgc2l6ZW9mKGNvbW1hbmQpLCAmIzM0Oy1qIC1yIG1hcCBkdW1wIG5hbWUgJXMmIzM0OywgbmFtZSk7CiYjNDM7CWlmIChBU1NFUlRfT0soZ2V0X2JwZnRvb2xfY29tbWFuZF9vdXRwdXQoY29tbWFuZCwgb3V0cHV0LCBzaXplb2Yob3V0cHV0KSAtIDEpLAomIzQzOwkJICAgICAgJiMzNDtkdW1wX211bHRpcGxlX3Jvb3RzJiMzNDspKSB7CiYjNDM7CQlvdXRwdXRbc3RyY3NwbihvdXRwdXQsICYjMzQ7XG4mIzM0OyldID0gJiMzOTtcMCYjMzk7OwomIzQzOwkJQVNTRVJUX1NUUkVRKG91dHB1dCwgZXhwZWN0ZWQsICYjMzQ7cm9vdHNfZmlyc3RfYW5kX3NlZWRfZGVkdXAmIzM0Oyk7CiYjNDM7CX0KJiM0MztvdXQ6CiYjNDM7CWZvciAoaSA9IDA7IGkgJmx0OyBBUlJBWV9TSVpFKGZkcyk7IGkmIzQzOyYjNDM7KQomIzQzOwkJaWYgKGZkc1tpXSAmZ3Q7PSAwKQomIzQzOwkJCWNsb3NlKGZkc1tpXSk7CiYjNDM7fQomIzQzOwomIzQzO3N0YXRpYyB2b2lkIHRlc3RfdW5yZWFkYWJsZShib29sIG91dGVyKQomIzQzO3sKJiM0MzsJTElCQlBGX09QVFMoYnBmX21hcF9jcmVhdGVfb3B0cywgb3B0cyk7CiYjNDM7CWNoYXIgZWxlbWVudHNbT1VUUFVUX1NJWkVdLCBvdXRwdXRbT1VUUFVUX1NJWkVdLCByb290W09VVFBVVF9TSVpFXTsKJiM0MzsJY2hhciBleHBlY3RlZFtPVVRQVVRfU0laRSAqIDNdLCBwbGFpbltPVVRQVVRfU0laRV0gPSB7fTsKJiM0MzsJY2hhciBjb21tYW5kW01BWF9CUEZUT09MX0NNRF9MRU5dOwomIzQzOwlpbnQgaW5uZXJfZmQgPSAtMSwgb3V0ZXJfZmQgPSAtMSwgbG9va3VwX2Vycm5vOwomIzQzOwlfX3UzMiBpbm5lcl9pZCwgcm9vdF9pZCwga2V5ID0gMCwgdmFsdWU7CiYjNDM7CiYjNDM7CS8qCiYjNDM7CSAqIEV2ZXJ5IGtleSBpcyBlbnVtZXJhYmxlLCBidXQgUEVSRl9FVkVOVF9BUlJBWSBsb29rdXAgcmV0dXJucwomIzQzOwkgKiBFTk9UU1VQUCAodGhlIGtlcm5lbC1pbnRlcm5hbCBlcnJubykuIENoZWNrIGJvdGggZW50cmllcyBzbyBhbgomIzQzOwkgKiBlYXJseSBleGl0IG9uIHRoZSBmaXJzdCBsb29rdXAgZmFpbHVyZSBjYW5ub3QgcGFzcy4KJiM0MzsJICovCiYjNDM7CWlubmVyX2ZkID0gYnBmX21hcF9jcmVhdGUoQlBGX01BUF9UWVBFX1BFUkZfRVZFTlRfQVJSQVksICYjMzQ7ZHVtcF91bnJlYWRhYmxlJiMzNDssCiYjNDM7CQkJCSAgc2l6ZW9mKGtleSksIHNpemVvZih2YWx1ZSksIDIsIE5VTEwpOwomIzQzOwlpZiAoIUFTU0VSVF9PS19GRChpbm5lcl9mZCwgJiMzNDtjcmVhdGVfdW5yZWFkYWJsZSYjMzQ7KSkKJiM0MzsJCWdvdG8gb3V0OwomIzQzOwlpZiAoIUFTU0VSVF9MVChicGZfbWFwX2xvb2t1cF9lbGVtKGlubmVyX2ZkLCAmYW1wO2tleSwgJmFtcDt2YWx1ZSksIDAsCiYjNDM7CQkgICAgICAgJiMzNDt1bnJlYWRhYmxlX2xvb2t1cCYjMzQ7KSkKJiM0MzsJCWdvdG8gb3V0OwomIzQzOwlsb29rdXBfZXJybm8gPSBlcnJubzsKJiM0MzsJaWYgKCFBU1NFUlRfTkVRKGxvb2t1cF9lcnJubywgRU5PRU5ULCAmIzM0O3VucmVhZGFibGVfbm90X21pc3NpbmcmIzM0OykpCiYjNDM7CQlnb3RvIG91dDsKJiM0MzsJaW5uZXJfaWQgPSBtYXBfaWQoaW5uZXJfZmQpOwomIzQzOwlpZiAoIWlubmVyX2lkIHx8ICFkdW1wX21hcChpbm5lcl9pZCwgJiMzNDstaiYjMzQ7LCBlbGVtZW50cykpCiYjNDM7CQlnb3RvIG91dDsKJiM0MzsJQVNTRVJUX0VRKGNvdW50X3Rva2VuKGVsZW1lbnRzLCAmIzM0O1wmIzM0O2Vycm9yXCYjMzQ7OiYjMzQ7KSwgMiwgJiMzNDtkZWZhdWx0X2pzb25fZXJyb3JzJiMzNDspOwomIzQzOwlzbnByaW50Zihjb21tYW5kLCBzaXplb2YoY29tbWFuZCksICYjMzQ7bWFwIGR1bXAgaWQgJXUmIzM0OywgaW5uZXJfaWQpOwomIzQzOwlpZiAoIUFTU0VSVF9PSyhnZXRfYnBmdG9vbF9jb21tYW5kX291dHB1dChjb21tYW5kLCBwbGFpbiwgc2l6ZW9mKHBsYWluKSAtIDEpLAomIzQzOwkJICAgICAgICYjMzQ7ZGVmYXVsdF9wbGFpbl91bnJlYWRhYmxlJiMzNDspKQomIzQzOwkJZ290byBvdXQ7CiYjNDM7CUFTU0VSVF9FUShjb3VudF90b2tlbihwbGFpbiwgc3RyZXJyb3IobG9va3VwX2Vycm5vKSksIDIsICYjMzQ7ZGVmYXVsdF9wbGFpbl9lcnJvcnMmIzM0Oyk7CiYjNDM7CUFTU0VSVF9IQVNfU1VCU1RSKHBsYWluLCAmIzM0O0ZvdW5kIDAgZWxlbWVudHMmIzM0OywgJiMzNDtkZWZhdWx0X3BsYWluX2NvdW50JiMzNDspOwomIzQzOwomIzQzOwlyb290X2lkID0gaW5uZXJfaWQ7CiYjNDM7CWlmIChvdXRlcikgewomIzQzOwkJb3B0cy5pbm5lcl9tYXBfZmQgPSBpbm5lcl9mZDsKJiM0MzsJCW91dGVyX2ZkID0gYnBmX21hcF9jcmVhdGUoQlBGX01BUF9UWVBFX0FSUkFZX09GX01BUFMsICYjMzQ7ZHVtcF9vdXRlciYjMzQ7LAomIzQzOwkJCQkJICBzaXplb2Yoa2V5KSwgc2l6ZW9mKHZhbHVlKSwgMSwgJmFtcDtvcHRzKTsKJiM0MzsJCWlmICghQVNTRVJUX09LX0ZEKG91dGVyX2ZkLCAmIzM0O2NyZWF0ZV9vdXRlciYjMzQ7KSB8fAomIzQzOwkJICAgICFBU1NFUlRfT0soYnBmX21hcF91cGRhdGVfZWxlbShvdXRlcl9mZCwgJmFtcDtrZXksICZhbXA7aW5uZXJfZmQsIEJQRl9BTlkpLAomIzQzOwkJCSAgICAgICAmIzM0O3BvcHVsYXRlX291dGVyJiMzNDspKQomIzQzOwkJCWdvdG8gb3V0OwomIzQzOwkJcm9vdF9pZCA9IG1hcF9pZChvdXRlcl9mZCk7CiYjNDM7CQlpZiAoIXJvb3RfaWQgfHwgIWR1bXBfbWFwKHJvb3RfaWQsICYjMzQ7LWomIzM0Oywgcm9vdCkpCiYjNDM7CQkJZ290byBvdXQ7CiYjNDM7CQlzbnByaW50ZihleHBlY3RlZCwgc2l6ZW9mKGV4cGVjdGVkKSwKJiM0MzsJCQkgJiMzNDtbe1wmIzM0O2lkXCYjMzQ7OiV1LFwmIzM0O3R5cGVcJiMzNDs6XCYjMzQ7YXJyYXlfb2ZfbWFwc1wmIzM0OyxcJiMzNDtuYW1lXCYjMzQ7OlwmIzM0O2R1bXBfb3V0ZXJcJiMzNDssJiMzNDsKJiM0MzsJCQkgJiMzNDtcJiMzNDtmbGFnc1wmIzM0OzowLFwmIzM0O2VsZW1lbnRzXCYjMzQ7OiVzfSx7XCYjMzQ7aWRcJiMzNDs6JXUsJiMzNDsKJiM0MzsJCQkgJiMzNDtcJiMzNDt0eXBlXCYjMzQ7OlwmIzM0O3BlcmZfZXZlbnRfYXJyYXlcJiMzNDssXCYjMzQ7bmFtZVwmIzM0OzpcJiMzNDtkdW1wX3VucmVhZGFibGVcJiMzNDssJiMzNDsKJiM0MzsJCQkgJiMzNDtcJiMzNDtmbGFnc1wmIzM0OzowLFwmIzM0O2VsZW1lbnRzXCYjMzQ7OiVzfV0mIzM0Oywgcm9vdF9pZCwgcm9vdCwgaW5uZXJfaWQsIGVsZW1lbnRzKTsKJiM0MzsJfSBlbHNlIHsKJiM0MzsJCXNucHJpbnRmKGV4cGVjdGVkLCBzaXplb2YoZXhwZWN0ZWQpLAomIzQzOwkJCSAmIzM0O1t7XCYjMzQ7aWRcJiMzNDs6JXUsXCYjMzQ7dHlwZVwmIzM0OzpcJiMzNDtwZXJmX2V2ZW50X2FycmF5XCYjMzQ7LCYjMzQ7CiYjNDM7CQkJICYjMzQ7XCYjMzQ7bmFtZVwmIzM0OzpcJiMzNDtkdW1wX3VucmVhZGFibGVcJiMzNDssXCYjMzQ7ZmxhZ3NcJiMzNDs6MCxcJiMzNDtlbGVtZW50c1wmIzM0Ozolc31dJiMzNDssCiYjNDM7CQkJIGlubmVyX2lkLCBlbGVtZW50cyk7CiYjNDM7CX0KJiM0MzsJaWYgKGR1bXBfbWFwKHJvb3RfaWQsICYjMzQ7LWogLXImIzM0Oywgb3V0cHV0KSkKJiM0MzsJCUFTU0VSVF9TVFJFUShvdXRwdXQsIGV4cGVjdGVkLCAmIzM0O3JlY3Vyc2l2ZV91bnJlYWRhYmxlX2pzb24mIzM0Oyk7CiYjNDM7CW1lbXNldChvdXRwdXQsIDAsIHNpemVvZihvdXRwdXQpKTsKJiM0MzsJc25wcmludGYoY29tbWFuZCwgc2l6ZW9mKGNvbW1hbmQpLCAmIzM0Oy1yIG1hcCBkdW1wIGlkICV1JiMzNDssIHJvb3RfaWQpOwomIzQzOwlpZiAoQVNTRVJUX09LKGdldF9icGZ0b29sX2NvbW1hbmRfb3V0cHV0KGNvbW1hbmQsIG91dHB1dCwgc2l6ZW9mKG91dHB1dCkgLSAxKSwKJiM0MzsJCSAgICAgICYjMzQ7cmVjdXJzaXZlX3VucmVhZGFibGVfcGxhaW4mIzM0OykpIHsKJiM0MzsJCUFTU0VSVF9IQVNfU1VCU1RSKG91dHB1dCwgcGxhaW4sICYjMzQ7cmVjdXJzaXZlX3BsYWluX3ByZXNlcnZlc19lcnJvcnMmIzM0Oyk7CiYjNDM7CQlBU1NFUlRfRVEoY291bnRfdG9rZW4ob3V0cHV0LCBzdHJlcnJvcihsb29rdXBfZXJybm8pKSwgMiwKJiM0MzsJCQkgICYjMzQ7cmVjdXJzaXZlX3BsYWluX2Vycm9ycyYjMzQ7KTsKJiM0MzsJCUFTU0VSVF9FUShjb3VudF90b2tlbihvdXRwdXQsICYjMzQ7Rm91bmQgJiMzNDspLCBvdXRlciA/IDIgOiAxLAomIzQzOwkJCSAgJiMzNDtyZWN1cnNpdmVfcGxhaW5fbWFwcyYjMzQ7KTsKJiM0MzsJfQomIzQzO291dDoKJiM0MzsJaWYgKG91dGVyX2ZkICZndDs9IDApCiYjNDM7CQljbG9zZShvdXRlcl9mZCk7CiYjNDM7CWlmIChpbm5lcl9mZCAmZ3Q7PSAwKQomIzQzOwkJY2xvc2UoaW5uZXJfZmQpOwomIzQzO30KJiM0MzsKJiM0MztzdGF0aWMgdm9pZCB0ZXN0X21hbnlfaW5uZXJfbWFwcyhib29sIGpzb24pCiYjNDM7ewomIzQzOwllbnVtIHsKJiM0MzsJCURVTVBfT0ssCiYjNDM7CQlEVU1QX0VSUl9STElNSVQsCiYjNDM7CQlEVU1QX0VSUl9DT01NQU5ELAomIzQzOwkJRFVNUF9FUlJfQ09VTlRTLAomIzQzOwkJRFVNUF9FUlJfSURTLAomIzQzOwkJRFVNUF9FUlJfSlNPTiwKJiM0MzsJCURVTVBfRVJSX0ZEUywKJiM0MzsJfTsKJiM0MzsJTElCQlBGX09QVFMoYnBmX21hcF9jcmVhdGVfb3B0cywgb3B0cyk7CiYjNDM7CWNvbnN0IHN0cnVjdCBybGltaXQgbGltaXQgPSB7IC5ybGltX2N1ciA9IDMyLCAucmxpbV9tYXggPSAzMiB9OwomIzQzOwljaGFyIGNvbW1hbmRbTUFYX0JQRlRPT0xfQ01EX0xFTl0sIHRva2VuWzY0XTsKJiM0MzsJX191MzIgaWRzWzY0XSwgcm9vdF9pZCwga2V5OwomIzQzOwlpbnQgaW5uZXJfZmQgPSAtMSwgb3V0ZXJfZmQgPSAtMSwgc3RhdHVzOwomIzQzOwlpbnQgaW5oZXJpdGVkX2Zkc1szMl0sIG5yX2luaGVyaXRlZCA9IDAsIGk7CiYjNDM7CWNoYXIgKm91dHB1dCA9IE5VTEw7CiYjNDM7CXBpZF90IHBpZDsKJiM0MzsKJiM0MzsJaW5uZXJfZmQgPSBicGZfbWFwX2NyZWF0ZShCUEZfTUFQX1RZUEVfSEFTSCwgJiMzNDtkdW1wX2lubmVyJiMzNDssIDQsIDQsIDEsIE5VTEwpOwomIzQzOwlpZiAoIUFTU0VSVF9PS19GRChpbm5lcl9mZCwgJiMzNDtjcmVhdGVfdGVtcGxhdGUmIzM0OykpCiYjNDM7CQlnb3RvIG91dDsKJiM0MzsJb3B0cy5pbm5lcl9tYXBfZmQgPSBpbm5lcl9mZDsKJiM0MzsJb3V0ZXJfZmQgPSBicGZfbWFwX2NyZWF0ZShCUEZfTUFQX1RZUEVfQVJSQVlfT0ZfTUFQUywgJiMzNDtkdW1wX291dGVyJiMzNDssIDQsIDQsCiYjNDM7CQkJCSAgQVJSQVlfU0laRShpZHMpLCAmYW1wO29wdHMpOwomIzQzOwljbG9zZShpbm5lcl9mZCk7CiYjNDM7CWlubmVyX2ZkID0gLTE7CiYjNDM7CWlmICghQVNTRVJUX09LX0ZEKG91dGVyX2ZkLCAmIzM0O2NyZWF0ZV9vdXRlciYjMzQ7KSkKJiM0MzsJCWdvdG8gb3V0OwomIzQzOwlmb3IgKGtleSA9IDA7IGtleSAmbHQ7IEFSUkFZX1NJWkUoaWRzKTsga2V5JiM0MzsmIzQzOykgewomIzQzOwkJaW5uZXJfZmQgPSBicGZfbWFwX2NyZWF0ZShCUEZfTUFQX1RZUEVfSEFTSCwgJiMzNDtkdW1wX2lubmVyJiMzNDssIDQsIDQsIDEsIE5VTEwpOwomIzQzOwkJaWYgKCFBU1NFUlRfT0tfRkQoaW5uZXJfZmQsICYjMzQ7Y3JlYXRlX2lubmVyJiMzNDspIHx8CiYjNDM7CQkgICAgIUFTU0VSVF9PSyhicGZfbWFwX3VwZGF0ZV9lbGVtKG91dGVyX2ZkLCAmYW1wO2tleSwgJmFtcDtpbm5lcl9mZCwgQlBGX0FOWSksCiYjNDM7CQkJICAgICAgICYjMzQ7cG9wdWxhdGVfb3V0ZXImIzM0OykpCiYjNDM7CQkJZ290byBvdXQ7CiYjNDM7CQlpZHNba2V5XSA9IG1hcF9pZChpbm5lcl9mZCk7CiYjNDM7CQlpZiAoIWlkc1trZXldKQomIzQzOwkJCWdvdG8gb3V0OwomIzQzOwkJLyogVGhlIG91dGVyIG1hcCBrZWVwcyBlYWNoIGRpc3RpbmN0IGlubmVyIG1hcCBhbGl2ZS4gKi8KJiM0MzsJCWNsb3NlKGlubmVyX2ZkKTsKJiM0MzsJCWlubmVyX2ZkID0gLTE7CiYjNDM7CX0KJiM0MzsJcm9vdF9pZCA9IG1hcF9pZChvdXRlcl9mZCk7CiYjNDM7CW91dHB1dCA9IGNhbGxvYygxLCA2NTUzNik7CiYjNDM7CWlmICghcm9vdF9pZCB8fCAhQVNTRVJUX09LX1BUUihvdXRwdXQsICYjMzQ7YWxsb2NhdGVfb3V0cHV0JiMzNDspKQomIzQzOwkJZ290byBvdXQ7CiYjNDM7CiYjNDM7CS8qIEZpbGwgdGhlIGxvdyBGRCBzbG90cyB0byBleGVyY2lzZSBpbmhlcml0ZWQgZGVzY3JpcHRvciBjbGVhbnVwLiAqLwomIzQzOwlmb3IgKGkgPSAwOyBpICZsdDsgQVJSQVlfU0laRShpbmhlcml0ZWRfZmRzKTsgaSYjNDM7JiM0MzspIHsKJiM0MzsJCWludCBmZCA9IG9wZW4oJiMzNDsvZGV2L251bGwmIzM0OywgT19SRE9OTFkpOwomIzQzOwomIzQzOwkJaWYgKCFBU1NFUlRfT0tfRkQoZmQsICYjMzQ7b3Blbl9pbmhlcml0ZWRfZmQmIzM0OykpCiYjNDM7CQkJZ290byBvdXQ7CiYjNDM7CQlpbmhlcml0ZWRfZmRzW25yX2luaGVyaXRlZCYjNDM7JiM0MztdID0gZmQ7CiYjNDM7CX0KJiM0MzsKJiM0MzsJLyoKJiM0MzsJICogQ3JlYXRlIGFsbCBmaXh0dXJlcyBiZWZvcmUgbG93ZXJpbmcgdGhlIGxpbWl0LCBhbmQga2VlcCB0aGUgdGVzdAomIzQzOwkgKiBydW5uZXImIzM5O3MgbGltaXQgdW5jaGFuZ2VkLiBSZXRhaW5pbmcgZXZlcnkgZGlzY292ZXJlZCBGRCB3b3VsZCBleGNlZWQKJiM0MzsJICogdGhpcyBsaW1pdCBiZWZvcmUgdGhlIHJlY3Vyc2l2ZSBkdW1wIGNvdWxkIHZpc2l0IGFsbCBpbm5lciBtYXBzLgomIzQzOwkgKi8KJiM0MzsJcGlkID0gZm9yaygpOwomIzQzOwlpZiAoIUFTU0VSVF9HRShwaWQsIDAsICYjMzQ7Zm9yayYjMzQ7KSkKJiM0MzsJCWdvdG8gb3V0OwomIzQzOwlpZiAoIXBpZCkgewomIzQzOwkJc3RydWN0IGRpcmVudCAqZW50cnk7CiYjNDM7CQlESVIgKmRpcjsKJiM0MzsKJiM0MzsJCS8qIFJlc2VydmUgYSBzbG90IGZvciB0aGUgZGlyZWN0b3J5IGV2ZW4gaWYgdGhlIHBhcmVudCBpcyBmdWxsLiAqLwomIzQzOwkJY2xvc2UoaW5oZXJpdGVkX2Zkc1tucl9pbmhlcml0ZWQgLSAxXSk7CiYjNDM7CQlkaXIgPSBvcGVuZGlyKCYjMzQ7L3Byb2Mvc2VsZi9mZCYjMzQ7KTsKJiM0MzsJCWlmICghZGlyKQomIzQzOwkJCV9leGl0KERVTVBfRVJSX0ZEUyk7CiYjNDM7CQkvKiBUaGUgcGFyZW50IGtlZXBzIHRoZSBvdXRlciBtYXAgYW5kIGl0cyBpbm5lciBtYXBzIGFsaXZlLiAqLwomIzQzOwkJZm9yICg7OykgewomIzQzOwkJCWNoYXIgKmVuZDsKJiM0MzsJCQlsb25nIGZkOwomIzQzOwomIzQzOwkJCWVycm5vID0gMDsKJiM0MzsJCQllbnRyeSA9IHJlYWRkaXIoZGlyKTsKJiM0MzsJCQlpZiAoIWVudHJ5KSB7CiYjNDM7CQkJCWlmIChlcnJubykKJiM0MzsJCQkJCV9leGl0KERVTVBfRVJSX0ZEUyk7CiYjNDM7CQkJCWJyZWFrOwomIzQzOwkJCX0KJiM0MzsJCQlmZCA9IHN0cnRvbChlbnRyeS0mZ3Q7ZF9uYW1lLCAmYW1wO2VuZCwgMTApOwomIzQzOwkJCWlmICgqZW5kIHx8IGZkICZsdDsgMyB8fCBmZCA9PSBkaXJmZChkaXIpKQomIzQzOwkJCQljb250aW51ZTsKJiM0MzsJCQljbG9zZShmZCk7CiYjNDM7CQl9CiYjNDM7CQlpZiAoY2xvc2VkaXIoZGlyKSkKJiM0MzsJCQlfZXhpdChEVU1QX0VSUl9GRFMpOwomIzQzOwkJaWYgKHNldHJsaW1pdChSTElNSVRfTk9GSUxFLCAmYW1wO2xpbWl0KSkKJiM0MzsJCQlfZXhpdChEVU1QX0VSUl9STElNSVQpOwomIzQzOwkJc25wcmludGYoY29tbWFuZCwgc2l6ZW9mKGNvbW1hbmQpLCAmIzM0OyVzIC1yIG1hcCBkdW1wIGlkICV1JiMzNDssCiYjNDM7CQkJIGpzb24gPyAmIzM0Oy1qJiMzNDsgOiAmIzM0OyYjMzQ7LCByb290X2lkKTsKJiM0MzsJCWlmIChnZXRfYnBmdG9vbF9jb21tYW5kX291dHB1dChjb21tYW5kLCBvdXRwdXQsIDY1NTM1KSkKJiM0MzsJCQlfZXhpdChEVU1QX0VSUl9DT01NQU5EKTsKJiM0MzsJCWlmIChjb3VudF90b2tlbihvdXRwdXQsIGpzb24gPyAmIzM0O1wmIzM0O2lkXCYjMzQ7OiYjMzQ7IDogJiMzNDtGb3VuZCAmIzM0OykgIT0gQVJSQVlfU0laRShpZHMpICYjNDM7IDEgfHwKJiM0MzsJCSAgICBjb3VudF90b2tlbihvdXRwdXQsIGpzb24gPyAmIzM0O1wmIzM0O2lubmVyX21hcF9pZFwmIzM0OzomIzM0OyA6ICYjMzQ7aW5uZXJfbWFwX2lkOiYjMzQ7KSAhPQomIzQzOwkJICAgIEFSUkFZX1NJWkUoaWRzKSkKJiM0MzsJCQlfZXhpdChEVU1QX0VSUl9DT1VOVFMpOwomIzQzOwkJZm9yIChrZXkgPSAwOyBrZXkgJmx0OyBBUlJBWV9TSVpFKGlkcyk7IGtleSYjNDM7JiM0MzspIHsKJiM0MzsJCQlpZiAoanNvbikKJiM0MzsJCQkJc25wcmludGYodG9rZW4sIHNpemVvZih0b2tlbiksICYjMzQ7XCYjMzQ7aWRcJiMzNDs6JXUsJiMzNDssIGlkc1trZXldKTsKJiM0MzsJCQllbHNlCiYjNDM7CQkJCXNucHJpbnRmKHRva2VuLCBzaXplb2YodG9rZW4pLCAmIzM0O1xuJXU6IGhhc2ggIG5hbWUgZHVtcF9pbm5lciAgJiMzNDssCiYjNDM7CQkJCQkgaWRzW2tleV0pOwomIzQzOwkJCWlmIChjb3VudF90b2tlbihvdXRwdXQsIHRva2VuKSAhPSAxKQomIzQzOwkJCQlfZXhpdChEVU1QX0VSUl9JRFMpOwomIzQzOwkJfQomIzQzOwkJaWYgKGpzb24gJmFtcDsmYW1wOyAob3V0cHV0WzBdICE9ICYjMzk7WyYjMzk7IHx8CiYjNDM7CQkJICAgICBzdHJjbXAob3V0cHV0ICYjNDM7IHN0cmxlbihvdXRwdXQpIC0gMiwgJiMzNDtdXG4mIzM0OykpKQomIzQzOwkJCV9leGl0KERVTVBfRVJSX0pTT04pOwomIzQzOwkJX2V4aXQoRFVNUF9PSyk7CiYjNDM7CX0KJiM0MzsJaWYgKEFTU0VSVF9FUSh3YWl0cGlkKHBpZCwgJmFtcDtzdGF0dXMsIDApLCBwaWQsICYjMzQ7d2FpdHBpZCYjMzQ7KSAmYW1wOyZhbXA7CiYjNDM7CSAgICBBU1NFUlRfVFJVRShXSUZFWElURUQoc3RhdHVzKSwgJiMzNDtjaGlsZF9leGl0ZWQmIzM0OykpCiYjNDM7CQlBU1NFUlRfRVEoV0VYSVRTVEFUVVMoc3RhdHVzKSwgRFVNUF9PSywgJiMzNDtkdW1wX3dpdGhfbG93X2ZkX2xpbWl0JiMzNDspOwomIzQzOwlmb3IgKGkgPSAwOyBpICZsdDsgbnJfaW5oZXJpdGVkOyBpJiM0MzsmIzQzOykKJiM0MzsJCUFTU0VSVF9HRShmY250bChpbmhlcml0ZWRfZmRzW2ldLCBGX0dFVEZEKSwgMCwgJiMzNDtwYXJlbnRfZmRfcHJlc2VydmVkJiMzNDspOwomIzQzOwlBU1NFUlRfRVEobWFwX2lkKG91dGVyX2ZkKSwgcm9vdF9pZCwgJiMzNDtwYXJlbnRfb3V0ZXJfcHJlc2VydmVkJiMzNDspOwomIzQzO291dDoKJiM0MzsJd2hpbGUgKG5yX2luaGVyaXRlZCkKJiM0MzsJCWNsb3NlKGluaGVyaXRlZF9mZHNbLS1ucl9pbmhlcml0ZWRdKTsKJiM0MzsJZnJlZShvdXRwdXQpOwomIzQzOwlpZiAob3V0ZXJfZmQgJmd0Oz0gMCkKJiM0MzsJCWNsb3NlKG91dGVyX2ZkKTsKJiM0MzsJaWYgKGlubmVyX2ZkICZndDs9IDApCiYjNDM7CQljbG9zZShpbm5lcl9mZCk7CiYjNDM7fQomIzQzOwomIzQzO3ZvaWQgdGVzdF9icGZ0b29sX21hcF9kdW1wKHZvaWQpCiYjNDM7ewomIzQzOwlpZiAodGVzdF9fc3RhcnRfc3VidGVzdCgmIzM0O3VucmVhZGFibGVfb3JkaW5hcnkmIzM0OykpCiYjNDM7CQl0ZXN0X3VucmVhZGFibGUoZmFsc2UpOwomIzQzOwlpZiAodGVzdF9fc3RhcnRfc3VidGVzdCgmIzM0O3VucmVhZGFibGVfaW5uZXImIzM0OykpCiYjNDM7CQl0ZXN0X3VucmVhZGFibGUodHJ1ZSk7CiYjNDM7CWlmICh0ZXN0X19zdGFydF9zdWJ0ZXN0KCYjMzQ7bWFueV9pbm5lcl9tYXBzX2pzb24mIzM0OykpCiYjNDM7CQl0ZXN0X21hbnlfaW5uZXJfbWFwcyh0cnVlKTsKJiM0MzsJaWYgKHRlc3RfX3N0YXJ0X3N1YnRlc3QoJiMzNDttYW55X2lubmVyX21hcHNfcGxhaW4mIzM0OykpCiYjNDM7CQl0ZXN0X21hbnlfaW5uZXJfbWFwcyhmYWxzZSk7CiYjNDM7CWlmICh0ZXN0X19zdGFydF9zdWJ0ZXN0KCYjMzQ7bXVsdGlwbGVfcm9vdHMmIzM0OykpCiYjNDM7CQl0ZXN0X211bHRpcGxlX3Jvb3RzKCk7CiYjNDM7CWlmICh0ZXN0X19zdGFydF9zdWJ0ZXN0KCYjMzQ7YXJyYXlfb2ZfbWFwcyYjMzQ7KSkKJiM0MzsJCXRlc3Rfb3V0ZXIoQlBGX01BUF9UWVBFX0FSUkFZX09GX01BUFMsIDEsIGZhbHNlLCBmYWxzZSk7CiYjNDM7CWlmICh0ZXN0X19zdGFydF9zdWJ0ZXN0KCYjMzQ7aGFzaF9vZl9tYXBzJiMzNDspKQomIzQzOwkJdGVzdF9vdXRlcihCUEZfTUFQX1RZUEVfSEFTSF9PRl9NQVBTLCAxLCBmYWxzZSwgZmFsc2UpOwomIzQzOwlpZiAodGVzdF9fc3RhcnRfc3VidGVzdCgmIzM0O3NoYXJlZF9pbm5lciYjMzQ7KSkKJiM0MzsJCXRlc3Rfb3V0ZXIoQlBGX01BUF9UWVBFX0FSUkFZX09GX01BUFMsIDIsIGZhbHNlLCBmYWxzZSk7CiYjNDM7CWlmICh0ZXN0X19zdGFydF9zdWJ0ZXN0KCYjMzQ7ZW1wdHlfYXJyYXlfb2ZfbWFwcyYjMzQ7KSkKJiM0MzsJCXRlc3Rfb3V0ZXIoQlBGX01BUF9UWVBFX0FSUkFZX09GX01BUFMsIDAsIGZhbHNlLCBmYWxzZSk7CiYjNDM7CWlmICh0ZXN0X19zdGFydF9zdWJ0ZXN0KCYjMzQ7ZW1wdHlfaGFzaF9vZl9tYXBzJiMzNDspKQomIzQzOwkJdGVzdF9vdXRlcihCUEZfTUFQX1RZUEVfSEFTSF9PRl9NQVBTLCAwLCBmYWxzZSwgZmFsc2UpOwomIzQzOwlpZiAodGVzdF9fc3RhcnRfc3VidGVzdCgmIzM0O2J0Zl9pbm5lciYjMzQ7KSkKJiM0MzsJCXRlc3Rfb3V0ZXIoQlBGX01BUF9UWVBFX0hBU0hfT0ZfTUFQUywgMSwgZmFsc2UsIHRydWUpOwomIzQzOwlpZiAodGVzdF9fc3RhcnRfc3VidGVzdCgmIzM0O2VtcHR5X2lubmVyJiMzNDspKQomIzQzOwkJdGVzdF9vdXRlcihCUEZfTUFQX1RZUEVfSEFTSF9PRl9NQVBTLCAxLCB0cnVlLCBmYWxzZSk7CiYjNDM7fQo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4zLzI8L3RkPgoJCQk8dGQ+MjAyNi8wOS8xMSAwNDowMDwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuNy1mbGFzaDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAxNDEyMAoJCQkJCQkJb3V0cHV0OiAxOQoJCQkJCQkJdGhvdWdodHM6IDMxMQoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+KipNeSBBc3Nlc3NtZW50IG9mIHRoZSBQYXRjaCoqCgpPa2F5LCBzbyB0aGUgZGlmZiBpcyBwcmV0dHkgZm9jdXNlZC4gTG9va2luZyBhdCB0aGUgY2hhbmdlcywgaXQmIzM5O3MgYWxsIGNvbnRhaW5lZCB3aXRoaW4gdGhlIGB0b29scy9gIGRpcmVjdG9yeSwgc3BlY2lmaWNhbGx5IGFyb3VuZCBgYnBmdG9vbGAgYW5kIGEgcmVsYXRlZCBzZWxmLXRlc3QuIExldCYjMzk7cyBzZWUuLi4KCkJhc2VkIG9uIG15IHVuZGVyc3RhbmRpbmcgb2Ygb3VyIHJ1bGVzLCBzcGVjaWZpY2FsbHkgU2VjdGlvbiAyLCB0aGlzICpzaG91bGQqIGJlIGEgc3RyYWlnaHRmb3J3YXJkICYjMzQ7V29ydGhGdXp6aW5nPWZhbHNlJiMzNDsgc2NlbmFyaW8uIFRoZSBuZWdhdGl2ZSBjcml0ZXJpYSBhcmUgY2xlYXIgaGVyZTogbm9uLWtlcm5lbCwgbm9uLWV4ZWN1dGFibGUgY2hhbmdlcy4gVGhlIG1vZGlmaWNhdGlvbnMgc2VlbSB0byBiZSBsaW1pdGVkIHRvIGRvY3VtZW50YXRpb24gKGBicGZ0b29sLW1hcC5yc3RgKSwgYmFzaCBjb21wbGV0aW9uIHNjcmlwdHMgKGBicGZ0b29sYCksIHRoZSBtYWluIGFwcGxpY2F0aW9uIGNvZGUsIGhlYWRlciBmaWxlcyBhbmQgdGhlIHVuaXQgdGVzdHMuIE5vbmUgb2YgdGhlc2UgY2hhbmdlcyBzaG91bGQgaW1wYWN0IHRoZSBjb21waWxlZCBrZXJuZWwgaW1hZ2UgKGB2bWxpbnV4YCkgb3IgYW55IGtlcm5lbCBtb2R1bGVzLiBJdCYjMzk7cyBlc3NlbnRpYWxseSB1c2VyLXNwYWNlIHRvb2xzIGFuZCB0ZXN0aW5nLgoKSnVzdCB0byBiZSBhYnNvbHV0ZWx5IGNlcnRhaW4sIEkmIzM5O2xsIHJ1biBhIHF1aWNrIGNoZWNrLCBtYXliZSB3aXRoIGBncmVwcGVyYCwganVzdCB0byBiZSB0cmlwbGUgc3VyZSBubyB1bmV4cGVjdGVkIG1vZGlmaWNhdGlvbnMgd2VyZSBzbnVjayBpbiwgYnV0IGJhc2VkIG9uIG15IGluaXRpYWwgc2NhbiwgdGhpcyBsb29rcyBsaWtlIGEgY2xlYXItY3V0IGNhc2Ugb2Ygbm9uLWNyaXRpY2FsIG1vZGlmaWNhdGlvbi4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD40LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOS8xMSAwNDowMDwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPmdyZXBwZXI8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0V4cHJlc3Npb24mIzM0OzogJiMzNDtjb2xsZWN0X2lubmVyX21hcCYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtPdXRwdXQmIzM0OzogJiMzNDt0b29scy9icGYvYnBmdG9vbC9tYXAuYz04MzA9c3RydWN0IG1hcF9kdW1wX2N0eCB7XG4tLVxudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmMtODM1LVxudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6ODM2OnN0YXRpYyBpbnQgY29sbGVjdF9pbm5lcl9tYXAoc3RydWN0IG1hcF9kdW1wX2N0eCAqY3R4LCBfX3UzMiBpZClcbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jLTgzNy17XG4tLVxudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM9ODYyPW1hcF9kdW1wKGludCBmZCwgc3RydWN0IGJwZl9tYXBfaW5mbyAqaW5mbywganNvbl93cml0ZXJfdCAqd3RyLFxuLS1cbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jLTkyOS1cdFx0XHRpZiAoY3R4IFx1MDAyNlx1MDAyNiBtYXBfaXNfbWFwX29mX21hcHMoaW5mby1cdTAwM2V0eXBlKSkge1xudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6OTMwOlx0XHRcdFx0ZXJyID0gY29sbGVjdF9pbm5lcl9tYXAoY3R4LCAqKF9fdTMyICopdmFsdWUpO1xudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmMtOTMxLVx0XHRcdFx0aWYgKGVycilcbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD41LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOS8xMSAwNDowMDwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuNy1mbGFzaDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAxNDkzNwoJCQkJCQkJb3V0cHV0OiA5NAoJCQkJCQkJdGhvdWdodHM6IDEzMwoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+KipNeSBBc3Nlc3NtZW50IG9mIHRoZSBQcm9wb3NlZCBDaGFuZ2VzKioKCk9rYXksIHNvIEkmIzM5O20gbG9va2luZyBhdCB0aGVzZSBjaGFuZ2VzLCBhbmQgZnJvbSBteSBleHBlcnQgcGVyc3BlY3RpdmUsIGl0JiMzOTtzIHByZXR0eSBjbGVhciB3aGVyZSB3ZSBzdGFuZC4gVGhlIG1vZGlmaWNhdGlvbnMgYXJlICpzdHJpY3RseSogY29udGFpbmVkIHdpdGhpbiB1c2VyLXNwYWNlIHRvb2xzLiBXZSYjMzk7cmUgdGFsa2luZyBzcGVjaWZpY2FsbHkgYWJvdXQgYGJwZnRvb2xgIHdpdGhpbiBgdG9vbHMvYnBmL2JwZnRvb2wvYCBhbmQgdGhlIHNlbGYtdGVzdHMgaW4gYHRvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2AuIFRoYXQgaW1tZWRpYXRlbHkgcmluZ3MgYSBiZWxsIGZvciBtZSwgYmVjYXVzZSBhbnkgYWx0ZXJhdGlvbnMgaW4gdGhvc2UgYXJlYXMgYXJlIGluaGVyZW50bHkgaXNvbGF0ZWQgZnJvbSB0aGUga2VybmVsIGl0c2VsZi4KClRoZXJlZm9yZSwgYXBwbHlpbmcgb3VyIG5lZ2F0aXZlIGNyaXRlcmlhLCBpdCYjMzk7cyBhIHN0cmFpZ2h0Zm9yd2FyZCBkZXRlcm1pbmF0aW9uLiBTaW5jZSB0aGVzZSBjaGFuZ2VzIHJlc2lkZSB3aXRoaW4gdXNlci1zcGFjZSBkaXJlY3Rvcmllcywgc2VsZi10ZXN0cywgc2FtcGxlcywgb3Igc2NyaXB0cywgdGhleSAqZG8gbm90KiBhZmZlY3QgdGhlIGNvbXBpbGVkIGtlcm5lbCBpbWFnZSAoYHZtbGludXhgKSBvciBhbnkgb2YgdGhlIGtlcm5lbCBtb2R1bGVzLiBJbiBlc3NlbmNlLCB0aGV5IGFyZSBzaWRlLWNhciBzb2Z0d2FyZSB0aGF0IGludGVyYWN0cyB3aXRoIHRoZSBrZXJuZWwuCgpHaXZlbiB0aGlzIGlzb2xhdGlvbiwgSSBjYW4gY29uZmlkZW50bHkgcnVsZSBvdXQgYW55IGZ1enppbmcgcmVxdWlyZW1lbnRzLiBgV29ydGhGdXp6aW5nYCBpcyBhIGhhcmQgJiMzNDtmYWxzZSYjMzQ7IGhlcmUuIFNpbWlsYXJseSwgYW55IGNvbnNpZGVyYXRpb25zIGZvciBzcGVjaWZpYyBzeW1ib2xzIG9yIGNvbmZpZ3VyYXRpb25zIGFyZSB1bm5lY2Vzc2FyeS4gQm90aCBgRm9jdXNTeW1ib2xzYCBhbmQgYEVuYWJsZUNvbmZpZ3NgIGFyZSBjb3JyZWN0bHkgbnVsbCwgcmVwcmVzZW50ZWQgYXMgYW4gZW1wdHkgYXJyYXkgYFtdYC4gVGhleSBhcmUgbm90IHJlbGV2YW50IHRvIGlzb2xhdGVkIGNoYW5nZXMgaW4gdXNlci1zcGFjZSB0b29scy4KCldpdGggdGhpcyBhbmFseXNpcyBjb21wbGV0ZSwgaXQmIzM5O3MgdGltZSB0byBjYWxsIGBzZXQtcmVzdWx0c2AuIFdlIGNhbiBwcm9jZWVkIGJhc2VkIG9uIHRoaXMgYXNzZXNzbWVudC4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD42LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOS8xMSAwNDowMDwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPnNldC1yZXN1bHRzPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFbmFibGVDb25maWdzJiMzNDs6IFtdLAogICYjMzQ7Rm9jdXNTeW1ib2xzJiMzNDs6IFtdLAogICYjMzQ7UmVhc29uaW5nJiMzNDs6ICYjMzQ7VGhlIHBhdGNoIG1vZGlmaWVzIG9ubHkgdXNlci1zcGFjZSB0b29saW5nIChicGZ0b29sIHVuZGVyIHRvb2xzL2JwZi9icGZ0b29sLykgYW5kIEJQRiBzZWxmdGVzdHMgKHRvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi8pLiBJdCBkb2VzIG5vdCB0b3VjaCB0aGUgTGludXgga2VybmVsIGltYWdlIG9yIGtlcm5lbCBtb2R1bGVzLCBtYWtpbmcgaXQgdW5yZWFjaGFibGUgZm9yIHN5emthbGxlciBrZXJuZWwgZnV6emluZy4mIzM0OywKICAmIzM0O1dvcnRoRnV6emluZyYjMzQ7OiBmYWxzZQp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RW5hYmxlQ29uZmlncyYjMzQ7OiBudWxsLAogICYjMzQ7Rm9jdXNTeW1ib2xzJiMzNDs6IFtdLAogICYjMzQ7UmVhc29uaW5nJiMzNDs6ICYjMzQ7VGhlIHBhdGNoIG1vZGlmaWVzIG9ubHkgdXNlci1zcGFjZSB0b29saW5nIChicGZ0b29sIHVuZGVyIHRvb2xzL2JwZi9icGZ0b29sLykgYW5kIEJQRiBzZWxmdGVzdHMgKHRvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi8pLiBJdCBkb2VzIG5vdCB0b3VjaCB0aGUgTGludXgga2VybmVsIGltYWdlIG9yIGtlcm5lbCBtb2R1bGVzLCBtYWtpbmcgaXQgdW5yZWFjaGFibGUgZm9yIHN5emthbGxlciBrZXJuZWwgZnV6emluZy4mIzM0OywKICAmIzM0O1dvcnRoRnV6emluZyYjMzQ7OiBmYWxzZQp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+Ny8xPC90ZD4KCQkJPHRkPjIwMjYvMDkvMTEgMDQ6MDA8L3RkPgoJCQk8dGQ+YWN0aW9uPC90ZD4KCQkJPHRkPklmPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtXb3J0aEZ1enppbmcmIzM0OzogZmFsc2UKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8L3Rib2R5PgoJPC90YWJsZT4KCgk8ZGl2IGlkPSJsbG1fc3VtbWFyeV90YWJsZV9kaXYiIHN0eWxlPSJtYXJnaW46IDIwcHggMDsiPgoJCTx0YWJsZSBjbGFzcz0ibGlzdF90YWJsZSI+CgkJCTxjYXB0aW9uPkxMTSBDYWxscyBTdW1tYXJ5OjwvY2FwdGlvbj4KCQkJPHRoZWFkPgoJCQkJPHRyPgoJCQkJCTx0aD5Ub3RhbCBDYWxsczwvdGg+CgkJCQkJPHRoPlRvdGFsIFRva2VuczwvdGg+CgkJCQkJPHRoPkF2ZyBUb2tlbnM8L3RoPgoJCQkJCTx0aD5Ub3RhbCBEdXJhdGlvbiAoU2Vjb25kcyk8L3RoPgoJCQkJCTx0aD5BdmcgRHVyYXRpb24gKFNlY29uZHMpPC90aD4KCQkJCTwvdHI+CgkJCTwvdGhlYWQ+CgkJCTx0Ym9keSBpZD0ibGxtX3N1bW1hcnlfc3RhdHNfYm9keSI+PC90Ym9keT4KCQk8L3RhYmxlPgoJPC9kaXY+CgoJPGRpdiBpZD0idG9vbF9zdW1tYXJ5X3RhYmxlX2RpdiIgc3R5bGU9Im1hcmdpbjogMjBweCAwOyI+CgkJPHRhYmxlIGNsYXNzPSJsaXN0X3RhYmxlIj4KCQkJPGNhcHRpb24+VG9vbCBDYWxscyBTdW1tYXJ5OjwvY2FwdGlvbj4KCQkJPHRoZWFkPgoJCQkJPHRyPgoJCQkJCTx0aD5Ub3RhbCBDYWxsczwvdGg+CgkJCQkJPHRoPlRvdGFsIER1cmF0aW9uIChTZWNvbmRzKTwvdGg+CgkJCQkJPHRoPkF2ZyBEdXJhdGlvbiAoU2Vjb25kcyk8L3RoPgoJCQkJPC90cj4KCQkJPC90aGVhZD4KCQkJPHRib2R5IGlkPSJ0b29sX3N1bW1hcnlfc3RhdHNfYm9keSI+PC90Ym9keT4KCQk8L3RhYmxlPgoJPC9kaXY+CgoJPGRpdiBpZD0iZHVyYXRpb25fY2hhcnRfZGl2IiBzdHlsZT0id2lkdGg6IDEwMCU7IG1hcmdpbjogMjBweCAwOyBib3JkZXI6IDFweDsiPjwvZGl2PgoJPGRpdiBpZD0idG9rZW5fY2hhcnRfZGl2IiBzdHlsZT0id2lkdGg6IDEwMCU7IG1hcmdpbjogMjBweCAwOyBib3JkZXI6IDFweDsiPjwvZGl2PgoKCTxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBzcmM9Imh0dHBzOi8vd3d3Lmdvb2dsZS5jb20vanNhcGkiPjwvc2NyaXB0PgoJPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgoJCWdvb2dsZS5sb2FkKCJ2aXN1YWxpemF0aW9uIiwgIjEiLCB7cGFja2FnZXM6WyJjb3JlY2hhcnQiXX0pOwoJCWdvb2dsZS5zZXRPbkxvYWRDYWxsYmFjayhkcmF3Q2hhcnRzKTsKCgkJZnVuY3Rpb24gZHJhd0NoYXJ0cygpIHsKCQkJY29uc3QgcmF3RGF0YSA9IFt7IlN0YXJ0ZWQiOiIyMDI2LTA5LTExVDA0OjAwOjAyLjYzNTUxMzQxM1oiLCJTZXEiOjAsIk5lc3RpbmciOjAsIlR5cGUiOiJmbG93IiwiTmFtZSI6InBhdGNoLXRyaWFnZSIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjkxNzUwNTEyNjUsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoie1xuICBcIkVuYWJsZUNvbmZpZ3NcIjogbnVsbCxcbiAgXCJGb2N1c1N5bWJvbHNcIjogW10sXG4gIFwiS01TQU5SZWFzb25pbmdcIjogXCJcIixcbiAgXCJOZWVkc0tNU0FOXCI6IGZhbHNlLFxuICBcIlJlYXNvbmluZ1wiOiBcIlRoZSBwYXRjaCBtb2RpZmllcyBvbmx5IHVzZXItc3BhY2UgdG9vbGluZyAoYnBmdG9vbCB1bmRlciB0b29scy9icGYvYnBmdG9vbC8pIGFuZCBCUEYgc2VsZnRlc3RzICh0b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvKS4gSXQgZG9lcyBub3QgdG91Y2ggdGhlIExpbnV4IGtlcm5lbCBpbWFnZSBvciBrZXJuZWwgbW9kdWxlcywgbWFraW5nIGl0IHVucmVhY2hhYmxlIGZvciBzeXprYWxsZXIga2VybmVsIGZ1enppbmcuXCIsXG4gIFwiV29ydGhGdXp6aW5nXCI6IGZhbHNlXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOS0xMVQwNDowMDowMi42MzU1MTg1MDJaIiwiU2VxIjoxLCJOZXN0aW5nIjoxLCJUeXBlIjoiYWN0aW9uIiwiTmFtZSI6InJlYWQtcGF0Y2gtZGlmZiIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjQ0NzAzMDg0NywiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJ7XG4gIFwiUGF0Y2hEaWZmXCI6IFwiY29tbWl0IDUwODA4ZjZlODc4Zjg4OWUwYTM0MDc5YTk0NTZjMDMzNGM1MjIyMGRcXG5BdXRob3I6IHN5ei1jbHVzdGVyIFxcdTAwM2N0cmlhZ2VAc3l6a2FsbGVyLmNvbVxcdTAwM2VcXG5EYXRlOiAgIEZyaSBTZXAgMTEgMDQ6MDA6MDEgMjAyNiArMDAwMFxcblxcbiAgICBzeXotY2x1c3RlcjogYXBwbGllZCBwYXRjaCB1bmRlciByZXZpZXdcXG5cXG5kaWZmIC0tZ2l0IGEvdG9vbHMvYnBmL2JwZnRvb2wvRG9jdW1lbnRhdGlvbi9icGZ0b29sLW1hcC5yc3QgYi90b29scy9icGYvYnBmdG9vbC9Eb2N1bWVudGF0aW9uL2JwZnRvb2wtbWFwLnJzdFxcbmluZGV4IDVkYWYzZGU1Yzc0NDYuLjIzZmFhNjcyNjg1ODcgMTAwNjQ0XFxuLS0tIGEvdG9vbHMvYnBmL2JwZnRvb2wvRG9jdW1lbnRhdGlvbi9icGZ0b29sLW1hcC5yc3RcXG4rKysgYi90b29scy9icGYvYnBmdG9vbC9Eb2N1bWVudGF0aW9uL2JwZnRvb2wtbWFwLnJzdFxcbkBAIC0xNiw3ICsxNiw4IEBAIFNZTk9QU0lTXFxuIFxcbiAqKmJwZnRvb2wqKiBbKk9QVElPTlMqXSAqKm1hcCoqICpDT01NQU5EKlxcbiBcXG4tKk9QVElPTlMqIDo9IHsgfENPTU1PTl9PUFRJT05TfCB8IHsgKiotZioqIHwgKiotLWJwZmZzKiogfSB8IHsgKiotbioqIHwgKiotLW5vbW91bnQqKiB9IH1cXG4rKk9QVElPTlMqIDo9IHsgfENPTU1PTl9PUFRJT05TfCB8IHsgKiotZioqIHwgKiotLWJwZmZzKiogfSB8XFxuK3sgKiotbioqIHwgKiotLW5vbW91bnQqKiB9IHwgeyAqKi1yKiogfCAqKi0tcmVjdXJzaXZlKiogfSB9XFxuIFxcbiAqQ09NTUFORFMqIDo9XFxuIHsgKipzaG93KiogfCAqKmxpc3QqKiB8ICoqY3JlYXRlKiogfCAqKmR1bXAqKiB8ICoqdXBkYXRlKiogfCAqKmxvb2t1cCoqIHwgKipnZXRuZXh0KiogfFxcbkBAIC0xNzAsNiArMTcxLDI1IEBAIE9QVElPTlNcXG4gICAgIERvIG5vdCBhdXRvbWF0aWNhbGx5IGF0dGVtcHQgdG8gbW91bnQgYW55IHZpcnR1YWwgZmlsZSBzeXN0ZW0gKHN1Y2ggYXNcXG4gICAgIHRyYWNlZnMgb3IgQlBGIHZpcnR1YWwgZmlsZSBzeXN0ZW0pIHdoZW4gbmVjZXNzYXJ5LlxcbiBcXG4rLXIsIC0tcmVjdXJzaXZlXFxuKyAgICBBbHNvIGR1bXAgdGhlIGlubmVyIG1hcHMgcmVmZXJlbmNlZCBieSAqKmFycmF5X29mX21hcHMqKiBhbmQgKipoYXNoX29mX21hcHMqKlxcbisgICAgZW50cmllcyB3aGVuIHJ1bm5pbmcgKiptYXAgZHVtcCoqLiBFYWNoIG1hcCBJRCBpcyB2aXNpdGVkIG9uY2UsIGV2ZW4gaWZcXG4rICAgIHNldmVyYWwgZW50cmllcyByZWZlciB0byBpdC4gU2VsZWN0ZWQgbWFwcyBhcmUgZm9sbG93ZWQgYnkgdGhlaXIgaW5uZXIgbWFwcy5cXG4rXFxuKyAgICBQbGFpbiBvdXRwdXQgaW5jbHVkZXMgYSBoZWFkZXIgaWRlbnRpZnlpbmcgZWFjaCBtYXAuIE9uIHN1Y2Nlc3MsIEpTT04gb3V0cHV0XFxuKyAgICBpcyBhbHdheXMgYW4gYXJyYXkgb2YgbWFwIG9iamVjdHMsIGVhY2ggY29udGFpbmluZyBhbiAqKmlkKiogYW5kIGFuXFxuKyAgICAqKmVsZW1lbnRzKiogYXJyYXksIGluY2x1ZGluZyB3aGVuIG9ubHkgb25lIG1hcCBpcyBkdW1wZWQuIE91dGVyIG1hcCBlbnRyaWVzXFxuKyAgICByZXRhaW4gdGhlaXIgKippbm5lcl9tYXBfaWQqKiBmaWVsZCwgd2hpY2ggaWRlbnRpZmllcyB0aGUgY29ycmVzcG9uZGluZyBpbm5lclxcbisgICAgbWFwIG9iamVjdC5cXG4rXFxuKyAgICBJbm5lciBtYXAgSURzIGFyZSByZXNvbHZlZCB3aGVuIHRoZSBtYXBzIGFyZSB2aXNpdGVkLiBUaGUgZHVtcCBpcyBub3QgYW5cXG4rICAgIGF0b21pYyBzbmFwc2hvdDogY29uY3VycmVudCB1cGRhdGVzIGNhbiBjaGFuZ2UgbWFwIGNvbnRlbnRzIG9yIHJlbW92ZSBhXFxuKyAgICByZWZlcmVuY2VkIGlubmVyIG1hcCBiZWZvcmUgaXQgaXMgdmlzaXRlZC4gRmFpbHVyZSB0byBvcGVuIGEgcmVmZXJlbmNlZFxcbisgICAgaW5uZXIgbWFwIHN0b3BzIHRoZSBkdW1wIGFuZCByZXR1cm5zIGEgbm9uemVybyBleGl0IHN0YXR1cy4gT3V0cHV0IG1heVxcbisgICAgY29udGFpbiBtYXBzIG9yIGVudHJpZXMgcHJpbnRlZCBiZWZvcmUgdGhlIGVycm9yLlxcbitcXG4rICAgIEluIEpTT04gbW9kZSwgdGhlIGVuY2xvc2luZyBhcnJheXMgYW5kIG9iamVjdHMgYXJlIGNsb3NlZCBiZWZvcmUgcmV0dXJuaW5nLlxcbitcXG4gRVhBTVBMRVNcXG4gPT09PT09PT1cXG4gKiojIGJwZnRvb2wgbWFwIHNob3cqKlxcbmRpZmYgLS1naXQgYS90b29scy9icGYvYnBmdG9vbC9iYXNoLWNvbXBsZXRpb24vYnBmdG9vbCBiL3Rvb2xzL2JwZi9icGZ0b29sL2Jhc2gtY29tcGxldGlvbi9icGZ0b29sXFxuaW5kZXggNzVjYmNiNTEyZWJhZS4uNDVjMzM2ZDYzYmUwYSAxMDA2NDRcXG4tLS0gYS90b29scy9icGYvYnBmdG9vbC9iYXNoLWNvbXBsZXRpb24vYnBmdG9vbFxcbisrKyBiL3Rvb2xzL2JwZi9icGZ0b29sL2Jhc2gtY29tcGxldGlvbi9icGZ0b29sXFxuQEAgLTI2MSw3ICsyNjEsNyBAQCBfYnBmdG9vbCgpXFxuIFxcbiAgICAgIyBEZWFsIHdpdGggb3B0aW9uc1xcbiAgICAgaWYgW1sgJHt3b3Jkc1tjd29yZF19ID09IC0qIF1dOyB0aGVuXFxuLSAgICAgICAgbG9jYWwgYz0nLS12ZXJzaW9uIC0tanNvbiAtLXByZXR0eSAtLWJwZmZzIC0tbWFwY29tcGF0IC0tZGVidWcgXFxcXFxcbisgICAgICAgIGxvY2FsIGM9Jy0tdmVyc2lvbiAtLWpzb24gLS1wcmV0dHkgLS1yZWN1cnNpdmUgLS1icGZmcyAtLW1hcGNvbXBhdCAtLWRlYnVnIFxcXFxcXG4gICAgICAgICAgICAgLS11c2UtbG9hZGVyIC0tYmFzZS1idGYgLS1zaWduIC1pIC1rJ1xcbiAgICAgICAgIENPTVBSRVBMWT0oICQoIGNvbXBnZW4gLVcgXFxcIiRjXFxcIiAtLSBcXFwiJGN1clxcXCIgKSApXFxuICAgICAgICAgcmV0dXJuIDBcXG5kaWZmIC0tZ2l0IGEvdG9vbHMvYnBmL2JwZnRvb2wvbWFpbi5jIGIvdG9vbHMvYnBmL2JwZnRvb2wvbWFpbi5jXFxuaW5kZXggNWFiYWJkOGY3ZDBhMC4uYzBmNGRmMTAxMDIxMiAxMDA2NDRcXG4tLS0gYS90b29scy9icGYvYnBmdG9vbC9tYWluLmNcXG4rKysgYi90b29scy9icGYvYnBmdG9vbC9tYWluLmNcXG5AQCAtMjYsNiArMjYsNyBAQCBzdGF0aWMgaW50ICgqbGFzdF9kb19oZWxwKShpbnQgYXJnYywgY2hhciAqKmFyZ3YpO1xcbiBqc29uX3dyaXRlcl90ICpqc29uX3d0cjtcXG4gYm9vbCBwcmV0dHlfb3V0cHV0O1xcbiBib29sIGpzb25fb3V0cHV0O1xcbitib29sIHJlY3Vyc2l2ZV9kdW1wO1xcbiBib29sIHNob3dfcGlubmVkO1xcbiBib29sIGJsb2NrX21vdW50O1xcbiBib29sIHZlcmlmaWVyX2xvZ3M7XFxuQEAgLTQ1Niw2ICs0NTcsNyBAQCBpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpXFxuIFxcdFxcdHsgXFxcImpzb25cXFwiLFxcdG5vX2FyZ3VtZW50LFxcdE5VTEwsXFx0J2onIH0sXFxuIFxcdFxcdHsgXFxcImhlbHBcXFwiLFxcdG5vX2FyZ3VtZW50LFxcdE5VTEwsXFx0J2gnIH0sXFxuIFxcdFxcdHsgXFxcInByZXR0eVxcXCIsXFx0bm9fYXJndW1lbnQsXFx0TlVMTCxcXHQncCcgfSxcXG4rXFx0XFx0eyBcXFwicmVjdXJzaXZlXFxcIixcXHRub19hcmd1bWVudCxcXHROVUxMLFxcdCdyJyB9LFxcbiBcXHRcXHR7IFxcXCJ2ZXJzaW9uXFxcIixcXHRub19hcmd1bWVudCxcXHROVUxMLFxcdCdWJyB9LFxcbiBcXHRcXHR7IFxcXCJicGZmc1xcXCIsXFx0bm9fYXJndW1lbnQsXFx0TlVMTCxcXHQnZicgfSxcXG4gXFx0XFx0eyBcXFwibWFwY29tcGF0XFxcIixcXHRub19hcmd1bWVudCxcXHROVUxMLFxcdCdtJyB9LFxcbkBAIC00NzksNyArNDgxLDcgQEAgaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KVxcbiBcXHRiaW5fbmFtZSA9IFxcXCJicGZ0b29sXFxcIjtcXG4gXFxuIFxcdG9wdGVyciA9IDA7XFxuLVxcdHdoaWxlICgob3B0ID0gZ2V0b3B0X2xvbmcoYXJnYywgYXJndiwgXFxcIlZocGpmTG1uZFNpOms6QjpsXFxcIixcXG4rXFx0d2hpbGUgKChvcHQgPSBnZXRvcHRfbG9uZyhhcmdjLCBhcmd2LCBcXFwiVmhwanJmTG1uZFNpOms6QjpsXFxcIixcXG4gXFx0XFx0XFx0XFx0ICBvcHRpb25zLCBOVUxMKSkgXFx1MDAzZT0gMCkge1xcbiBcXHRcXHRzd2l0Y2ggKG9wdCkge1xcbiBcXHRcXHRjYXNlICdWJzpcXG5AQCAtNTAxLDYgKzUwMyw5IEBAIGludCBtYWluKGludCBhcmdjLCBjaGFyICoqYXJndilcXG4gXFx0XFx0XFx0fVxcbiBcXHRcXHRcXHRqc29ud19wcmV0dHkoanNvbl93dHIsIHByZXR0eV9vdXRwdXQpO1xcbiBcXHRcXHRcXHRicmVhaztcXG4rXFx0XFx0Y2FzZSAncic6XFxuK1xcdFxcdFxcdHJlY3Vyc2l2ZV9kdW1wID0gdHJ1ZTtcXG4rXFx0XFx0XFx0YnJlYWs7XFxuIFxcdFxcdGNhc2UgJ2YnOlxcbiBcXHRcXHRcXHRzaG93X3Bpbm5lZCA9IHRydWU7XFxuIFxcdFxcdFxcdGJyZWFrO1xcbmRpZmYgLS1naXQgYS90b29scy9icGYvYnBmdG9vbC9tYWluLmggYi90b29scy9icGYvYnBmdG9vbC9tYWluLmhcXG5pbmRleCA5MzE1YTFkYjFmN2MyLi40M2VmMGFhNTkyZGI2IDEwMDY0NFxcbi0tLSBhL3Rvb2xzL2JwZi9icGZ0b29sL21haW4uaFxcbisrKyBiL3Rvb2xzL2JwZi9icGZ0b29sL21haW4uaFxcbkBAIC04Myw2ICs4Myw3IEBAIGV4dGVybiBjb25zdCBjaGFyICpiaW5fbmFtZTtcXG4gXFxuIGV4dGVybiBqc29uX3dyaXRlcl90ICpqc29uX3d0cjtcXG4gZXh0ZXJuIGJvb2wganNvbl9vdXRwdXQ7XFxuK2V4dGVybiBib29sIHJlY3Vyc2l2ZV9kdW1wO1xcbiBleHRlcm4gYm9vbCBzaG93X3Bpbm5lZDtcXG4gZXh0ZXJuIGJvb2wgc2hvd19waWRzO1xcbiBleHRlcm4gYm9vbCBibG9ja19tb3VudDtcXG5kaWZmIC0tZ2l0IGEvdG9vbHMvYnBmL2JwZnRvb2wvbWFwLmMgYi90b29scy9icGYvYnBmdG9vbC9tYXAuY1xcbmluZGV4IDY4NGE4ZmI3MjQxNDYuLmMwNTA1ZjUwNDk2NzQgMTAwNjQ0XFxuLS0tIGEvdG9vbHMvYnBmL2JwZnRvb2wvbWFwLmNcXG4rKysgYi90b29scy9icGYvYnBmdG9vbC9tYXAuY1xcbkBAIC0xNyw2ICsxNyw3IEBAXFxuICNpbmNsdWRlIFxcdTAwM2NicGYvYnBmLmhcXHUwMDNlXFxuICNpbmNsdWRlIFxcdTAwM2NicGYvYnRmLmhcXHUwMDNlXFxuICNpbmNsdWRlIFxcdTAwM2NicGYvaGFzaG1hcC5oXFx1MDAzZVxcbisjaW5jbHVkZSBcXHUwMDNjYnBmL2xpYmJwZl9pbnRlcm5hbC5oXFx1MDAzZVxcbiBcXG4gI2luY2x1ZGUgXFxcImpzb25fd3JpdGVyLmhcXFwiXFxuICNpbmNsdWRlIFxcXCJtYWluLmhcXFwiXFxuQEAgLTgyNiwxMiArODI3LDQ0IEBAIHN0YXRpYyB2b2lkIGZyZWVfbWFwX2t2X2J0ZihzdHJ1Y3QgYnRmICpidGYpXFxuIFxcdFxcdGJ0Zl9fZnJlZShidGYpO1xcbiB9XFxuIFxcbitzdHJ1Y3QgbWFwX2R1bXBfY3R4IHtcXG4rXFx0c3RydWN0IGhhc2htYXAgKnNlZW47XFxuK1xcdF9fdTMyICpwZW5kaW5nX2lkcztcXG4rXFx0c2l6ZV90IHBlbmRpbmdfY250O1xcbit9O1xcbitcXG4rc3RhdGljIGludCBjb2xsZWN0X2lubmVyX21hcChzdHJ1Y3QgbWFwX2R1bXBfY3R4ICpjdHgsIF9fdTMyIGlkKVxcbit7XFxuK1xcdF9fdTMyICppZHM7XFxuK1xcdGludCBlcnI7XFxuK1xcbitcXHRpZiAoaGFzaG1hcF9fZmluZChjdHgtXFx1MDAzZXNlZW4sIGlkLCBOVUxMKSlcXG4rXFx0XFx0cmV0dXJuIDA7XFxuK1xcbitcXHRpZHMgPSBsaWJicGZfcmVhbGxvY2FycmF5KGN0eC1cXHUwMDNlcGVuZGluZ19pZHMsIGN0eC1cXHUwMDNlcGVuZGluZ19jbnQgKyAxLFxcbitcXHRcXHRcXHRcXHQgIHNpemVvZigqaWRzKSk7XFxuK1xcdGlmICghaWRzKSB7XFxuK1xcdFxcdHBfZXJyKFxcXCJtZW0gYWxsb2MgZmFpbGVkXFxcIik7XFxuK1xcdFxcdHJldHVybiAtMTtcXG4rXFx0fVxcbitcXHRjdHgtXFx1MDAzZXBlbmRpbmdfaWRzID0gaWRzO1xcbitcXG4rXFx0ZXJyID0gaGFzaG1hcF9fYWRkKGN0eC1cXHUwMDNlc2VlbiwgaWQsIDApO1xcbitcXHRpZiAoZXJyKSB7XFxuK1xcdFxcdHBfZXJyKFxcXCJmYWlsZWQgdG8gcmVjb3JkIGlubmVyIG1hcCBpZCAldTogJXNcXFwiLCBpZCwgc3RyZXJyb3IoLWVycikpO1xcbitcXHRcXHRyZXR1cm4gLTE7XFxuK1xcdH1cXG4rXFx0aWRzW2N0eC1cXHUwMDNlcGVuZGluZ19jbnQrK10gPSBpZDtcXG4rXFx0cmV0dXJuIDA7XFxuK31cXG4rXFxuIHN0YXRpYyBpbnRcXG4gbWFwX2R1bXAoaW50IGZkLCBzdHJ1Y3QgYnBmX21hcF9pbmZvICppbmZvLCBqc29uX3dyaXRlcl90ICp3dHIsXFxuLVxcdCBib29sIHNob3dfaGVhZGVyKVxcbitcXHQgYm9vbCBzaG93X2hlYWRlciwgc3RydWN0IG1hcF9kdW1wX2N0eCAqY3R4KVxcbiB7XFxuIFxcdHZvaWQgKmtleSwgKnZhbHVlLCAqcHJldl9rZXk7XFxuIFxcdHVuc2lnbmVkIGludCBudW1fZWxlbXMgPSAwO1xcbitcXHRqc29uX3dyaXRlcl90ICpwbGFpbl9idGZfd3RyID0gTlVMTDtcXG4gXFx0c3RydWN0IGJ0ZiAqYnRmID0gTlVMTDtcXG4gXFx0aW50IGVycjtcXG4gXFxuQEAgLTg0NSw2ICs4NzgsMTcgQEAgbWFwX2R1bXAoaW50IGZkLCBzdHJ1Y3QgYnBmX21hcF9pbmZvICppbmZvLCBqc29uX3dyaXRlcl90ICp3dHIsXFxuIFxcbiBcXHRwcmV2X2tleSA9IE5VTEw7XFxuIFxcbitcXHRpZiAoY3R4IFxcdTAwMjZcXHUwMDI2ICF3dHIgXFx1MDAyNlxcdTAwMjYgKGluZm8tXFx1MDAzZWJ0Zl92YWx1ZV90eXBlX2lkIHx8XFxuK1xcdFxcdFxcdCAgICBpbmZvLVxcdTAwM2VidGZfdm1saW51eF92YWx1ZV90eXBlX2lkKSkge1xcbitcXHRcXHRwbGFpbl9idGZfd3RyID0gZ2V0X2J0Zl93cml0ZXIoKTtcXG4rXFx0XFx0aWYgKHBsYWluX2J0Zl93dHIpIHtcXG4rXFx0XFx0XFx0aWYgKHNob3dfaGVhZGVyKVxcbitcXHRcXHRcXHRcXHRzaG93X21hcF9oZWFkZXJfcGxhaW4oaW5mbyk7XFxuK1xcdFxcdFxcdHNob3dfaGVhZGVyID0gZmFsc2U7XFxuK1xcdFxcdFxcdHd0ciA9IHBsYWluX2J0Zl93dHI7XFxuK1xcdFxcdH1cXG4rXFx0fVxcbitcXG4gXFx0aWYgKHd0cikge1xcbiBcXHRcXHRlcnIgPSBnZXRfbWFwX2t2X2J0ZihpbmZvLCBcXHUwMDI2YnRmKTtcXG4gXFx0XFx0aWYgKGVycikge1xcbkBAIC04NzQsMTAgKzkxOCwyMCBAQCBtYXBfZHVtcChpbnQgZmQsIHN0cnVjdCBicGZfbWFwX2luZm8gKmluZm8sIGpzb25fd3JpdGVyX3QgKnd0cixcXG4gXFx0XFx0aWYgKGVycikge1xcbiBcXHRcXHRcXHRpZiAoZXJybm8gPT0gRU5PRU5UKVxcbiBcXHRcXHRcXHRcXHRlcnIgPSAwO1xcbitcXHRcXHRcXHRlbHNlIGlmIChjdHgpXFxuK1xcdFxcdFxcdFxcdHBfZXJyKFxcXCJjYW4ndCBnZXQgbmV4dCBrZXkgZm9yIG1hcCBpZCAldTogJXNcXFwiLFxcbitcXHRcXHRcXHRcXHQgICAgICBpbmZvLVxcdTAwM2VpZCwgc3RyZXJyb3IoZXJybm8pKTtcXG4gXFx0XFx0XFx0YnJlYWs7XFxuIFxcdFxcdH1cXG4tXFx0XFx0aWYgKCFkdW1wX21hcF9lbGVtKGZkLCBrZXksIHZhbHVlLCBpbmZvLCBidGYsIHd0cikpXFxuK1xcdFxcdGVyciA9IGR1bXBfbWFwX2VsZW0oZmQsIGtleSwgdmFsdWUsIGluZm8sIGJ0Ziwgd3RyKTtcXG4rXFx0XFx0aWYgKCFlcnIpIHtcXG4gXFx0XFx0XFx0bnVtX2VsZW1zKys7XFxuK1xcdFxcdFxcdGlmIChjdHggXFx1MDAyNlxcdTAwMjYgbWFwX2lzX21hcF9vZl9tYXBzKGluZm8tXFx1MDAzZXR5cGUpKSB7XFxuK1xcdFxcdFxcdFxcdGVyciA9IGNvbGxlY3RfaW5uZXJfbWFwKGN0eCwgKihfX3UzMiAqKXZhbHVlKTtcXG4rXFx0XFx0XFx0XFx0aWYgKGVycilcXG4rXFx0XFx0XFx0XFx0XFx0YnJlYWs7XFxuK1xcdFxcdFxcdH1cXG4rXFx0XFx0fVxcbiBcXHRcXHRwcmV2X2tleSA9IGtleTtcXG4gXFx0fVxcbiBcXG5AQCAtODk0LDE4ICs5NDgsMjUgQEAgbWFwX2R1bXAoaW50IGZkLCBzdHJ1Y3QgYnBmX21hcF9pbmZvICppbmZvLCBqc29uX3dyaXRlcl90ICp3dHIsXFxuIFxcdGZyZWUoa2V5KTtcXG4gXFx0ZnJlZSh2YWx1ZSk7XFxuIFxcdGZyZWVfbWFwX2t2X2J0ZihidGYpO1xcbitcXHRpZiAocGxhaW5fYnRmX3d0cilcXG4rXFx0XFx0anNvbndfZGVzdHJveShcXHUwMDI2cGxhaW5fYnRmX3d0cik7XFxuIFxcbiBcXHRyZXR1cm4gZXJyO1xcbiB9XFxuIFxcbiBzdGF0aWMgaW50IGRvX2R1bXAoaW50IGFyZ2MsIGNoYXIgKiphcmd2KVxcbiB7XFxuK1xcdExJQkJQRl9PUFRTKGJwZl9nZXRfZmRfYnlfaWRfb3B0cywgb3B0cyxcXG4rXFx0XFx0ICAgIC5vcGVuX2ZsYWdzID0gQlBGX0ZfUkRPTkxZLFxcbitcXHQpO1xcbiBcXHRqc29uX3dyaXRlcl90ICp3dHIgPSBOVUxMLCAqYnRmX3d0ciA9IE5VTEw7XFxuIFxcdHN0cnVjdCBicGZfbWFwX2luZm8gaW5mbyA9IHt9O1xcbitcXHRzdHJ1Y3QgbWFwX2R1bXBfY3R4IGN0eCA9IHt9O1xcbiBcXHRpbnQgbmJfZmRzLCBpID0gMDtcXG4gXFx0X191MzIgbGVuID0gc2l6ZW9mKGluZm8pO1xcbiBcXHRpbnQgKmZkcyA9IE5VTEw7XFxuIFxcdGludCBlcnIgPSAtMTtcXG4rXFx0c2l6ZV90IGo7XFxuIFxcbiBcXHRpZiAoYXJnYyAhPSAyKVxcbiBcXHRcXHR1c2FnZSgpO1xcbkBAIC05MTksOSArOTgwLDM1IEBAIHN0YXRpYyBpbnQgZG9fZHVtcChpbnQgYXJnYywgY2hhciAqKmFyZ3YpXFxuIFxcdGlmIChuYl9mZHMgXFx1MDAzYyAxKVxcbiBcXHRcXHRnb3RvIGV4aXRfZnJlZTtcXG4gXFxuK1xcdGlmIChyZWN1cnNpdmVfZHVtcCkge1xcbitcXHRcXHRjdHguc2VlbiA9IGhhc2htYXBfX25ldyhoYXNoX2ZuX2Zvcl9rZXlfYXNfaWQsXFxuK1xcdFxcdFxcdFxcdFxcdGVxdWFsX2ZuX2Zvcl9rZXlfYXNfaWQsIE5VTEwpO1xcbitcXHRcXHRpZiAoSVNfRVJSKGN0eC5zZWVuKSkge1xcbitcXHRcXHRcXHRjdHguc2VlbiA9IE5VTEw7XFxuK1xcdFxcdFxcdHBfZXJyKFxcXCJmYWlsZWQgdG8gY3JlYXRlIGhhc2htYXAgZm9yIHJlY3Vyc2l2ZSBkdW1wXFxcIik7XFxuK1xcdFxcdFxcdGdvdG8gZXhpdF9jbG9zZTtcXG4rXFx0XFx0fVxcbitcXHRcXHQvKiBSZWNvcmQgdGhlIHNlbGVjdGVkIG1hcHMgYmVmb3JlIGRpc2NvdmVyaW5nIGFueSBpbm5lciBtYXBzLiAqL1xcbitcXHRcXHRmb3IgKGkgPSAwOyBpIFxcdTAwM2MgbmJfZmRzOyBpKyspIHtcXG4rXFx0XFx0XFx0bGVuID0gc2l6ZW9mKGluZm8pO1xcbitcXHRcXHRcXHRpZiAoYnBmX21hcF9nZXRfaW5mb19ieV9mZChmZHNbaV0sIFxcdTAwMjZpbmZvLCBcXHUwMDI2bGVuKSkge1xcbitcXHRcXHRcXHRcXHRwX2VycihcXFwiY2FuJ3QgZ2V0IG1hcCBpbmZvOiAlc1xcXCIsIHN0cmVycm9yKGVycm5vKSk7XFxuK1xcdFxcdFxcdFxcdGVyciA9IC0xO1xcbitcXHRcXHRcXHRcXHRnb3RvIGV4aXRfY2xvc2U7XFxuK1xcdFxcdFxcdH1cXG4rXFx0XFx0XFx0ZXJyID0gaGFzaG1hcF9fYWRkKGN0eC5zZWVuLCBpbmZvLmlkLCAwKTtcXG4rXFx0XFx0XFx0aWYgKGVycikge1xcbitcXHRcXHRcXHRcXHRwX2VycihcXFwiZmFpbGVkIHRvIHJlY29yZCBtYXAgaWQgJXU6ICVzXFxcIiwgaW5mby5pZCxcXG4rXFx0XFx0XFx0XFx0ICAgICAgc3RyZXJyb3IoLWVycikpO1xcbitcXHRcXHRcXHRcXHRlcnIgPSAtMTtcXG4rXFx0XFx0XFx0XFx0Z290byBleGl0X2Nsb3NlO1xcbitcXHRcXHRcXHR9XFxuK1xcdFxcdH1cXG4rXFx0fVxcbitcXG4gXFx0aWYgKGpzb25fb3V0cHV0KSB7XFxuIFxcdFxcdHd0ciA9IGpzb25fd3RyO1xcbi1cXHR9IGVsc2Uge1xcbitcXHR9IGVsc2UgaWYgKCFyZWN1cnNpdmVfZHVtcCkge1xcbiBcXHRcXHRpbnQgZG9fcGxhaW5fYnRmO1xcbiBcXG4gXFx0XFx0ZG9fcGxhaW5fYnRmID0gbWFwc19oYXZlX2J0ZihmZHMsIG5iX2Zkcyk7XFxuQEAgLTkzNiw3ICsxMDIzLDcgQEAgc3RhdGljIGludCBkb19kdW1wKGludCBhcmdjLCBjaGFyICoqYXJndilcXG4gXFx0XFx0fVxcbiBcXHR9XFxuIFxcbi1cXHRpZiAod3RyIFxcdTAwMjZcXHUwMDI2IG5iX2ZkcyBcXHUwMDNlIDEpXFxuK1xcdGlmICh3dHIgXFx1MDAyNlxcdTAwMjYgKG5iX2ZkcyBcXHUwMDNlIDEgfHwgcmVjdXJzaXZlX2R1bXApKVxcbiBcXHRcXHRqc29ud19zdGFydF9hcnJheSh3dHIpO1xcdC8qIHJvb3QgYXJyYXkgKi9cXG4gXFx0Zm9yIChpID0gMDsgaSBcXHUwMDNjIG5iX2ZkczsgaSsrKSB7XFxuIFxcdFxcdGlmIChicGZfbWFwX2dldF9pbmZvX2J5X2ZkKGZkc1tpXSwgXFx1MDAyNmluZm8sIFxcdTAwMjZsZW4pKSB7XFxuQEAgLTk0NCwyMiArMTAzMSw1MCBAQCBzdGF0aWMgaW50IGRvX2R1bXAoaW50IGFyZ2MsIGNoYXIgKiphcmd2KVxcbiBcXHRcXHRcXHRlcnIgPSAtMTtcXG4gXFx0XFx0XFx0YnJlYWs7XFxuIFxcdFxcdH1cXG4tXFx0XFx0ZXJyID0gbWFwX2R1bXAoZmRzW2ldLCBcXHUwMDI2aW5mbywgd3RyLCBuYl9mZHMgXFx1MDAzZSAxKTtcXG4rXFx0XFx0ZXJyID0gbWFwX2R1bXAoZmRzW2ldLCBcXHUwMDI2aW5mbywgd3RyLCBuYl9mZHMgXFx1MDAzZSAxIHx8IHJlY3Vyc2l2ZV9kdW1wLFxcbitcXHRcXHRcXHQgICAgICAgcmVjdXJzaXZlX2R1bXAgPyBcXHUwMDI2Y3R4IDogTlVMTCk7XFxuIFxcdFxcdGlmICghd3RyIFxcdTAwMjZcXHUwMDI2IGkgIT0gbmJfZmRzIC0gMSlcXG4gXFx0XFx0XFx0cHJpbnRmKFxcXCJcXFxcblxcXCIpO1xcbiBcXG4gXFx0XFx0aWYgKGVycilcXG4gXFx0XFx0XFx0YnJlYWs7XFxuLVxcdFxcdGNsb3NlKGZkc1tpXSk7XFxuK1xcdFxcdC8qIEtlZXAgc2VsZWN0ZWQgbWFwcyBhbGl2ZSB3aGlsZSB2aXNpdGluZyB0aGVpciBpbm5lciBtYXBzLiAqL1xcbitcXHRcXHRpZiAoIXJlY3Vyc2l2ZV9kdW1wKVxcbitcXHRcXHRcXHRjbG9zZShmZHNbaV0pO1xcbitcXHR9XFxuK1xcdGZvciAoaiA9IDA7ICFlcnIgXFx1MDAyNlxcdTAwMjYgaiBcXHUwMDNjIGN0eC5wZW5kaW5nX2NudDsgaisrKSB7XFxuK1xcdFxcdGludCBmZDtcXG4rXFxuK1xcdFxcdGZkID0gYnBmX21hcF9nZXRfZmRfYnlfaWRfb3B0cyhjdHgucGVuZGluZ19pZHNbal0sIFxcdTAwMjZvcHRzKTtcXG4rXFx0XFx0aWYgKGZkIFxcdTAwM2MgMCkge1xcbitcXHRcXHRcXHRwX2VycihcXFwiY2FuJ3Qgb3BlbiBpbm5lciBtYXAgaWQgJXU6ICVzXFxcIixcXG4rXFx0XFx0XFx0ICAgICAgY3R4LnBlbmRpbmdfaWRzW2pdLCBzdHJlcnJvcihlcnJubykpO1xcbitcXHRcXHRcXHRlcnIgPSAtMTtcXG4rXFx0XFx0XFx0YnJlYWs7XFxuK1xcdFxcdH1cXG4rXFx0XFx0bGVuID0gc2l6ZW9mKGluZm8pO1xcbitcXHRcXHRpZiAoYnBmX21hcF9nZXRfaW5mb19ieV9mZChmZCwgXFx1MDAyNmluZm8sIFxcdTAwMjZsZW4pKSB7XFxuK1xcdFxcdFxcdHBfZXJyKFxcXCJjYW4ndCBnZXQgbWFwIGluZm86ICVzXFxcIiwgc3RyZXJyb3IoZXJybm8pKTtcXG4rXFx0XFx0XFx0ZXJyID0gLTE7XFxuK1xcdFxcdH0gZWxzZSB7XFxuK1xcdFxcdFxcdGlmICghd3RyKVxcbitcXHRcXHRcXHRcXHRwcmludGYoXFxcIlxcXFxuXFxcIik7XFxuK1xcdFxcdFxcdGVyciA9IG1hcF9kdW1wKGZkLCBcXHUwMDI2aW5mbywgd3RyLCB0cnVlLCBcXHUwMDI2Y3R4KTtcXG4rXFx0XFx0fVxcbitcXHRcXHRjbG9zZShmZCk7XFxuIFxcdH1cXG4tXFx0aWYgKHd0ciBcXHUwMDI2XFx1MDAyNiBuYl9mZHMgXFx1MDAzZSAxKVxcbitcXHRpZiAod3RyIFxcdTAwMjZcXHUwMDI2IChuYl9mZHMgXFx1MDAzZSAxIHx8IHJlY3Vyc2l2ZV9kdW1wKSlcXG4gXFx0XFx0anNvbndfZW5kX2FycmF5KHd0cik7XFx0Lyogcm9vdCBhcnJheSAqL1xcbiBcXG4gXFx0aWYgKGJ0Zl93dHIpXFxuIFxcdFxcdGpzb253X2Rlc3Ryb3koXFx1MDAyNmJ0Zl93dHIpO1xcbiBleGl0X2Nsb3NlOlxcbitcXHRpZiAocmVjdXJzaXZlX2R1bXApXFxuK1xcdFxcdGkgPSAwO1xcbiBcXHRmb3IgKDsgaSBcXHUwMDNjIG5iX2ZkczsgaSsrKVxcbiBcXHRcXHRjbG9zZShmZHNbaV0pO1xcbitcXHRoYXNobWFwX19mcmVlKGN0eC5zZWVuKTtcXG4rXFx0ZnJlZShjdHgucGVuZGluZ19pZHMpO1xcbiBleGl0X2ZyZWU6XFxuIFxcdGZyZWUoZmRzKTtcXG4gXFx0ZnJlZV9idGZfdm1saW51eCgpO1xcbkBAIC0xNDg0LDcgKzE1OTksNyBAQCBzdGF0aWMgaW50IGRvX2hlbHAoaW50IGFyZ2MsIGNoYXIgKiphcmd2KVxcbiBcXHRcXHRcXFwiICAgICAgICAgICAgICAgICB0YXNrX3N0b3JhZ2UgfCBibG9vbV9maWx0ZXIgfCB1c2VyX3JpbmdidWYgfCBjZ3JwX3N0b3JhZ2UgfCBhcmVuYSB8XFxcXG5cXFwiXFxuIFxcdFxcdFxcXCIgICAgICAgICAgICAgICAgIGluc25fYXJyYXkgfCByaGFzaCB9XFxcXG5cXFwiXFxuIFxcdFxcdFxcXCIgICAgICAgXFxcIiBIRUxQX1NQRUNfT1BUSU9OUyBcXFwiIHxcXFxcblxcXCJcXG4tXFx0XFx0XFxcIiAgICAgICAgICAgICAgICAgICAgey1mfC0tYnBmZnN9IHwgey1ufC0tbm9tb3VudH0gfVxcXFxuXFxcIlxcbitcXHRcXHRcXFwiICAgICAgICAgICAgICAgICAgICB7LWZ8LS1icGZmc30gfCB7LW58LS1ub21vdW50fSB8IHstcnwtLXJlY3Vyc2l2ZX0gfVxcXFxuXFxcIlxcbiBcXHRcXHRcXFwiXFxcIixcXG4gXFx0XFx0YmluX25hbWUsIGFyZ3ZbLTJdKTtcXG4gXFxuZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9wcm9nX3Rlc3RzL2JwZnRvb2xfbWFwX2R1bXAuYyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9wcm9nX3Rlc3RzL2JwZnRvb2xfbWFwX2R1bXAuY1xcbm5ldyBmaWxlIG1vZGUgMTAwNjQ0XFxuaW5kZXggMDAwMDAwMDAwMDAwMC4uMWZiODc3ZmM2OGM4M1xcbi0tLSAvZGV2L251bGxcXG4rKysgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ190ZXN0cy9icGZ0b29sX21hcF9kdW1wLmNcXG5AQCAtMCwwICsxLDQ3NCBAQFxcbisvLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogR1BMLTIuMC1vbmx5XFxuKyNpbmNsdWRlIFxcdTAwM2N0ZXN0X3Byb2dzLmhcXHUwMDNlXFxuKyNpbmNsdWRlIFxcdTAwM2NicGZ0b29sX2hlbHBlcnMuaFxcdTAwM2VcXG4rI2luY2x1ZGUgXFx1MDAzY2JwZi9idGYuaFxcdTAwM2VcXG4rI2luY2x1ZGUgXFx1MDAzY3N5cy9yZXNvdXJjZS5oXFx1MDAzZVxcbisjaW5jbHVkZSBcXHUwMDNjZGlyZW50LmhcXHUwMDNlXFxuK1xcbisjZGVmaW5lIE9VVFBVVF9TSVpFIDgxOTJcXG4rXFxuK3N0YXRpYyBib29sIGR1bXBfbWFwKF9fdTMyIGlkLCBjb25zdCBjaGFyICpvcHRpb25zLCBjaGFyICpvdXRwdXQpXFxuK3tcXG4rXFx0Y2hhciBjb21tYW5kW01BWF9CUEZUT09MX0NNRF9MRU5dO1xcbitcXG4rXFx0c25wcmludGYoY29tbWFuZCwgc2l6ZW9mKGNvbW1hbmQpLCBcXFwiJXMgbWFwIGR1bXAgaWQgJXVcXFwiLCBvcHRpb25zLCBpZCk7XFxuK1xcdG1lbXNldChvdXRwdXQsIDAsIE9VVFBVVF9TSVpFKTtcXG4rXFx0aWYgKCFBU1NFUlRfT0soZ2V0X2JwZnRvb2xfY29tbWFuZF9vdXRwdXQoY29tbWFuZCwgb3V0cHV0LCBPVVRQVVRfU0laRSAtIDEpLFxcbitcXHRcXHQgICAgICAgXFxcImR1bXBfbWFwXFxcIikpXFxuK1xcdFxcdHJldHVybiBmYWxzZTtcXG4rXFx0LyogVGhlIGhlbHBlciBsZWF2ZXMgdGhlIHRyYWlsaW5nIG5ld2xpbmUgaW4gcGxhY2UuICovXFxuK1xcdG91dHB1dFtzdHJjc3BuKG91dHB1dCwgXFxcIlxcXFxuXFxcIildID0gJ1xcXFwwJztcXG4rXFx0cmV0dXJuIHRydWU7XFxuK31cXG4rXFxuK3N0YXRpYyBfX3UzMiBtYXBfaWQoaW50IGZkKVxcbit7XFxuK1xcdHN0cnVjdCBicGZfbWFwX2luZm8gaW5mbyA9IHt9O1xcbitcXHRfX3UzMiBsZW4gPSBzaXplb2YoaW5mbyk7XFxuK1xcbitcXHRpZiAoIUFTU0VSVF9PSyhicGZfbWFwX2dldF9pbmZvX2J5X2ZkKGZkLCBcXHUwMDI2aW5mbywgXFx1MDAyNmxlbiksIFxcXCJtYXBfaW5mb1xcXCIpKVxcbitcXHRcXHRyZXR1cm4gMDtcXG4rXFx0cmV0dXJuIGluZm8uaWQ7XFxuK31cXG4rXFxuK3N0YXRpYyBpbnQgY291bnRfdG9rZW4oY29uc3QgY2hhciAqb3V0cHV0LCBjb25zdCBjaGFyICp0b2tlbilcXG4re1xcbitcXHRpbnQgY291bnQgPSAwO1xcbitcXG4rXFx0d2hpbGUgKChvdXRwdXQgPSBzdHJzdHIob3V0cHV0LCB0b2tlbikpKSB7XFxuK1xcdFxcdGNvdW50Kys7XFxuK1xcdFxcdG91dHB1dCArPSBzdHJsZW4odG9rZW4pO1xcbitcXHR9XFxuK1xcdHJldHVybiBjb3VudDtcXG4rfVxcbitcXG4rc3RhdGljIHZvaWQgY2hlY2tfcGxhaW4oX191MzIgcm9vdF9pZCwgX191MzIgaW5uZXJfaWQsIGNvbnN0IGNoYXIgKnR5cGUsXFxuK1xcdFxcdFxcdGludCBlbnRyaWVzLCBib29sIHR5cGVkKVxcbit7XFxuK1xcdGNoYXIgY29tbWFuZFtNQVhfQlBGVE9PTF9DTURfTEVOXSwgaGVhZGVyWzEyOF07XFxuK1xcdGNoYXIgb3V0cHV0W09VVFBVVF9TSVpFXSA9IHt9O1xcbitcXHRjb25zdCBjaGFyICpyb290LCAqaW5uZXI7XFxuK1xcbitcXHRzbnByaW50Zihjb21tYW5kLCBzaXplb2YoY29tbWFuZCksIFxcXCItLXJlY3Vyc2l2ZSBtYXAgZHVtcCBpZCAldVxcXCIsIHJvb3RfaWQpO1xcbitcXHRpZiAoIUFTU0VSVF9PSyhnZXRfYnBmdG9vbF9jb21tYW5kX291dHB1dChjb21tYW5kLCBvdXRwdXQsIHNpemVvZihvdXRwdXQpIC0gMSksXFxuK1xcdFxcdCAgICAgICBcXFwicGxhaW5fZHVtcFxcXCIpKVxcbitcXHRcXHRyZXR1cm47XFxuK1xcdHNucHJpbnRmKGhlYWRlciwgc2l6ZW9mKGhlYWRlciksIFxcXCIldTogJXMgIG5hbWUgZHVtcF9vdXRlciAgXFxcIiwgcm9vdF9pZCwgdHlwZSk7XFxuK1xcdHJvb3QgPSBzdHJzdHIob3V0cHV0LCBoZWFkZXIpO1xcbitcXHRpZiAoIUFTU0VSVF9PS19QVFIocm9vdCwgXFxcInBsYWluX3Jvb3RfaGVhZGVyXFxcIikpXFxuK1xcdFxcdHJldHVybjtcXG4rXFx0QVNTRVJUX0VRKHJvb3QgLSBvdXRwdXQsIDAsIFxcXCJwbGFpbl9yb290X2ZpcnN0XFxcIik7XFxuK1xcdEFTU0VSVF9FUShjb3VudF90b2tlbihvdXRwdXQsIFxcXCJpbm5lcl9tYXBfaWQ6XFxcIiksIGVudHJpZXMsIFxcXCJwbGFpbl9yZWZlcmVuY2VzXFxcIik7XFxuK1xcdGlmIChlbnRyaWVzKSB7XFxuK1xcdFxcdHNucHJpbnRmKGhlYWRlciwgc2l6ZW9mKGhlYWRlciksIFxcXCIldTogaGFzaCAgbmFtZSBkdW1wX2lubmVyICBcXFwiLCBpbm5lcl9pZCk7XFxuK1xcdFxcdGlubmVyID0gc3Ryc3RyKG91dHB1dCwgaGVhZGVyKTtcXG4rXFx0XFx0aWYgKEFTU0VSVF9PS19QVFIoaW5uZXIsIFxcXCJwbGFpbl9pbm5lcl9oZWFkZXJcXFwiKSlcXG4rXFx0XFx0XFx0QVNTRVJUX0dUKGlubmVyIC0gcm9vdCwgMCwgXFxcInBsYWluX2lubmVyX2FmdGVyX3Jvb3RcXFwiKTtcXG4rXFx0XFx0QVNTRVJUX0VRKGNvdW50X3Rva2VuKG91dHB1dCwgaGVhZGVyKSwgMSwgXFxcInBsYWluX2lubmVyX29uY2VcXFwiKTtcXG4rXFx0fVxcbitcXHRBU1NFUlRfRVEoY291bnRfdG9rZW4ob3V0cHV0LCBcXFwiRm91bmQgXFxcIiksIGVudHJpZXMgXFx1MDAyNlxcdTAwMjYgIXR5cGVkID8gMiA6IDEsXFxuK1xcdFxcdCAgXFxcInBsYWluX21hcF9jb3VudFxcXCIpO1xcbitcXHRpZiAodHlwZWQpIHtcXG4rXFx0XFx0QVNTRVJUX0hBU19TVUJTVFIob3V0cHV0LCBcXFwiXFxcXFxcXCJrZXlcXFxcXFxcIjogMFxcXCIsIFxcXCJwbGFpbl9idGZfa2V5XFxcIik7XFxuK1xcdFxcdEFTU0VSVF9IQVNfU1VCU1RSKG91dHB1dCwgXFxcIlxcXFxcXFwidmFsdWVcXFxcXFxcIjogMTY4NDMwMDlcXFwiLCBcXFwicGxhaW5fYnRmX3ZhbHVlXFxcIik7XFxuK1xcdH1cXG4rfVxcbitcXG4rc3RhdGljIHZvaWQgdGVzdF9vdXRlcihlbnVtIGJwZl9tYXBfdHlwZSB0eXBlLCBpbnQgZW50cmllcywgYm9vbCBlbXB0eV9pbm5lcixcXG4rXFx0XFx0ICAgICAgIGJvb2wgdHlwZWQpXFxuK3tcXG4rXFx0TElCQlBGX09QVFMoYnBmX21hcF9jcmVhdGVfb3B0cywgb3B0cyk7XFxuK1xcdExJQkJQRl9PUFRTKGJwZl9tYXBfY3JlYXRlX29wdHMsIGlubmVyX29wdHMpO1xcbitcXHRzdHJ1Y3QgYnRmICpidGYgPSBOVUxMO1xcbitcXHRjaGFyIG91dGVyW09VVFBVVF9TSVpFXSwgaW5uZXJbT1VUUFVUX1NJWkVdLCBvdXRwdXRbT1VUUFVUX1NJWkVdO1xcbitcXHRjaGFyIGV4cGVjdGVkW09VVFBVVF9TSVpFICogM10sIHJlZmVyZW5jZVs2NF07XFxuK1xcdGNvbnN0IGNoYXIgKnR5cGVfbmFtZSA9IGxpYmJwZl9icGZfbWFwX3R5cGVfc3RyKHR5cGUpO1xcbitcXHRpbnQgaW5uZXJfZmQgPSAtMSwgb3V0ZXJfZmQgPSAtMTtcXG4rXFx0X191MzIgcm9vdF9pZCwgaW5uZXJfaWQsIGtleSwgdmFsdWUgPSAweDAxMDEwMTAxO1xcbitcXG4rXFx0aWYgKHR5cGVkKSB7XFxuK1xcdFxcdGJ0ZiA9IGJ0Zl9fbmV3X2VtcHR5KCk7XFxuK1xcdFxcdGlmICghQVNTRVJUX09LX1BUUihidGYsIFxcXCJjcmVhdGVfYnRmXFxcIikgfHxcXG4rXFx0XFx0ICAgICFBU1NFUlRfRVEoYnRmX19hZGRfaW50KGJ0ZiwgXFxcInVuc2lnbmVkIGludFxcXCIsIDQsIDApLCAxLCBcXFwiYnRmX2ludFxcXCIpIHx8XFxuK1xcdFxcdCAgICAhQVNTRVJUX09LKGJ0Zl9fbG9hZF9pbnRvX2tlcm5lbChidGYpLCBcXFwibG9hZF9idGZcXFwiKSlcXG4rXFx0XFx0XFx0Z290byBvdXQ7XFxuK1xcdFxcdGlubmVyX29wdHMuYnRmX2ZkID0gYnRmX19mZChidGYpO1xcbitcXHRcXHRpbm5lcl9vcHRzLmJ0Zl9rZXlfdHlwZV9pZCA9IDE7XFxuK1xcdFxcdGlubmVyX29wdHMuYnRmX3ZhbHVlX3R5cGVfaWQgPSAxO1xcbitcXHR9XFxuK1xcdGlubmVyX2ZkID0gYnBmX21hcF9jcmVhdGUoQlBGX01BUF9UWVBFX0hBU0gsIFxcXCJkdW1wX2lubmVyXFxcIiwgc2l6ZW9mKGtleSksXFxuK1xcdFxcdFxcdFxcdCAgc2l6ZW9mKHZhbHVlKSwgMiwgXFx1MDAyNmlubmVyX29wdHMpO1xcbitcXHRpZiAoIUFTU0VSVF9PS19GRChpbm5lcl9mZCwgXFxcImNyZWF0ZV9pbm5lclxcXCIpKVxcbitcXHRcXHRnb3RvIG91dDtcXG4rXFx0a2V5ID0gMDtcXG4rXFx0aWYgKCFlbXB0eV9pbm5lciBcXHUwMDI2XFx1MDAyNlxcbitcXHQgICAgIUFTU0VSVF9PSyhicGZfbWFwX3VwZGF0ZV9lbGVtKGlubmVyX2ZkLCBcXHUwMDI2a2V5LCBcXHUwMDI2dmFsdWUsIEJQRl9BTlkpLFxcbitcXHRcXHQgICAgICAgXFxcInBvcHVsYXRlX2lubmVyXFxcIikpXFxuK1xcdFxcdGdvdG8gb3V0O1xcbitcXHRvcHRzLmlubmVyX21hcF9mZCA9IGlubmVyX2ZkO1xcbitcXHRvdXRlcl9mZCA9IGJwZl9tYXBfY3JlYXRlKHR5cGUsIFxcXCJkdW1wX291dGVyXFxcIiwgc2l6ZW9mKGtleSksIHNpemVvZihfX3UzMiksXFxuK1xcdFxcdFxcdFxcdCAgMywgXFx1MDAyNm9wdHMpO1xcbitcXHRpZiAoIUFTU0VSVF9PS19GRChvdXRlcl9mZCwgXFxcImNyZWF0ZV9vdXRlclxcXCIpKVxcbitcXHRcXHRnb3RvIG91dDtcXG4rXFx0LyogVGhlIHVudXNlZCB0aGlyZCBhcnJheSBzbG90IGFsc28gZXhlcmNpc2VzIGZhaWxlZCBsb29rdXBzLiAqL1xcbitcXHRmb3IgKGtleSA9IDA7IGtleSBcXHUwMDNjIGVudHJpZXM7IGtleSsrKVxcbitcXHRcXHRpZiAoIUFTU0VSVF9PSyhicGZfbWFwX3VwZGF0ZV9lbGVtKG91dGVyX2ZkLCBcXHUwMDI2a2V5LCBcXHUwMDI2aW5uZXJfZmQsIEJQRl9BTlkpLFxcbitcXHRcXHRcXHQgICAgICAgXFxcInBvcHVsYXRlX291dGVyXFxcIikpXFxuK1xcdFxcdFxcdGdvdG8gb3V0O1xcbitcXHRyb290X2lkID0gbWFwX2lkKG91dGVyX2ZkKTtcXG4rXFx0aW5uZXJfaWQgPSBtYXBfaWQoaW5uZXJfZmQpO1xcbitcXHRpZiAoIXJvb3RfaWQgfHwgIWlubmVyX2lkIHx8ICFkdW1wX21hcChyb290X2lkLCBcXFwiLWpcXFwiLCBvdXRlcikgfHxcXG4rXFx0ICAgICFkdW1wX21hcChpbm5lcl9pZCwgXFxcIi1qXFxcIiwgaW5uZXIpKVxcbitcXHRcXHRnb3RvIG91dDtcXG4rXFxuK1xcdEFTU0VSVF9FUShvdXRlclswXSwgJ1snLCBcXFwiZGVmYXVsdF9hcnJheVxcXCIpO1xcbitcXHRBU1NFUlRfRVEoY291bnRfdG9rZW4ob3V0ZXIsIFxcXCJcXFxcXFxcImVsZW1lbnRzXFxcXFxcXCI6XFxcIiksIDAsIFxcXCJkZWZhdWx0X25vX3dyYXBwZXJcXFwiKTtcXG4rXFx0QVNTRVJUX0VRKGNvdW50X3Rva2VuKG91dGVyLCBcXFwiXFxcXFxcXCJpZFxcXFxcXFwiOlxcXCIpLCAwLCBcXFwiZGVmYXVsdF9ub19oZWFkZXJcXFwiKTtcXG4rXFx0c25wcmludGYocmVmZXJlbmNlLCBzaXplb2YocmVmZXJlbmNlKSwgXFxcIlxcXFxcXFwiaW5uZXJfbWFwX2lkXFxcXFxcXCI6JXVcXFwiLCBpbm5lcl9pZCk7XFxuK1xcdEFTU0VSVF9FUShjb3VudF90b2tlbihvdXRlciwgcmVmZXJlbmNlKSwgZW50cmllcywgXFxcImRlZmF1bHRfcmVmZXJlbmNlc1xcXCIpO1xcbitcXHRpZiAoIWVudHJpZXMpXFxuK1xcdFxcdEFTU0VSVF9TVFJFUShvdXRlciwgXFxcIltdXFxcIiwgXFxcImVtcHR5X291dGVyX2RlZmF1bHRcXFwiKTtcXG4rXFx0aWYgKGVtcHR5X2lubmVyKVxcbitcXHRcXHRBU1NFUlRfU1RSRVEoaW5uZXIsIFxcXCJbXVxcXCIsIFxcXCJlbXB0eV9pbm5lcl9kZWZhdWx0XFxcIik7XFxuK1xcdGVsc2UgaWYgKHR5cGVkKVxcbitcXHRcXHRBU1NFUlRfSEFTX1NVQlNUUihpbm5lciwgXFxcIlxcXFxcXFwiZm9ybWF0dGVkXFxcXFxcXCI6e1xcXFxcXFwia2V5XFxcXFxcXCI6MCxcXFxcXFxcInZhbHVlXFxcXFxcXCI6MTY4NDMwMDl9XFxcIixcXG4rXFx0XFx0XFx0XFx0ICBcXFwidHlwZWRfaW5uZXJcXFwiKTtcXG4rXFx0ZWxzZVxcbitcXHRcXHRBU1NFUlRfU1RSRVEoaW5uZXIsXFxuK1xcdFxcdFxcdCAgICAgXFxcIlt7XFxcXFxcXCJrZXlcXFxcXFxcIjpbXFxcXFxcXCIweDAwXFxcXFxcXCIsXFxcXFxcXCIweDAwXFxcXFxcXCIsXFxcXFxcXCIweDAwXFxcXFxcXCIsXFxcXFxcXCIweDAwXFxcXFxcXCJdLFxcXCJcXG4rXFx0XFx0XFx0ICAgICBcXFwiXFxcXFxcXCJ2YWx1ZVxcXFxcXFwiOltcXFxcXFxcIjB4MDFcXFxcXFxcIixcXFxcXFxcIjB4MDFcXFxcXFxcIixcXFxcXFxcIjB4MDFcXFxcXFxcIixcXFxcXFxcIjB4MDFcXFxcXFxcIl19XVxcXCIsXFxuK1xcdFxcdFxcdCAgICAgXFxcIm9yZGluYXJ5X2RlZmF1bHRcXFwiKTtcXG4rXFxuK1xcdC8qXFxuK1xcdCAqIENvbXBhcmUgdGhlIGNvbXBsZXRlIEpTT04gZG9jdW1lbnQ6IGEgZmxhdCBhcnJheSB3aXRoIHRoZSByb290IGZpcnN0LFxcbitcXHQgKiBvbmUgY29weSBvZiB0aGUgc2hhcmVkIGlubmVyIG1hcCwgYW5kIHVuY2hhbmdlZCBlbnRyeSByZXByZXNlbnRhdGlvbnMuXFxuK1xcdCAqL1xcbitcXHRpZiAoZW50cmllcylcXG4rXFx0XFx0c25wcmludGYoZXhwZWN0ZWQsIHNpemVvZihleHBlY3RlZCksXFxuK1xcdFxcdFxcdCBcXFwiW3tcXFxcXFxcImlkXFxcXFxcXCI6JXUsXFxcXFxcXCJ0eXBlXFxcXFxcXCI6XFxcXFxcXCIlc1xcXFxcXFwiLFxcXFxcXFwibmFtZVxcXFxcXFwiOlxcXFxcXFwiZHVtcF9vdXRlclxcXFxcXFwiLFxcXCJcXG4rXFx0XFx0XFx0IFxcXCJcXFxcXFxcImZsYWdzXFxcXFxcXCI6MCxcXFxcXFxcImVsZW1lbnRzXFxcXFxcXCI6JXN9LHtcXFxcXFxcImlkXFxcXFxcXCI6JXUsXFxcXFxcXCJ0eXBlXFxcXFxcXCI6XFxcXFxcXCJoYXNoXFxcXFxcXCIsXFxcIlxcbitcXHRcXHRcXHQgXFxcIlxcXFxcXFwibmFtZVxcXFxcXFwiOlxcXFxcXFwiZHVtcF9pbm5lclxcXFxcXFwiLFxcXFxcXFwiZmxhZ3NcXFxcXFxcIjowLFxcXFxcXFwiZWxlbWVudHNcXFxcXFxcIjolc31dXFxcIixcXG4rXFx0XFx0XFx0IHJvb3RfaWQsIHR5cGVfbmFtZSwgb3V0ZXIsIGlubmVyX2lkLCBpbm5lcik7XFxuK1xcdGVsc2VcXG4rXFx0XFx0c25wcmludGYoZXhwZWN0ZWQsIHNpemVvZihleHBlY3RlZCksXFxuK1xcdFxcdFxcdCBcXFwiW3tcXFxcXFxcImlkXFxcXFxcXCI6JXUsXFxcXFxcXCJ0eXBlXFxcXFxcXCI6XFxcXFxcXCIlc1xcXFxcXFwiLFxcXFxcXFwibmFtZVxcXFxcXFwiOlxcXFxcXFwiZHVtcF9vdXRlclxcXFxcXFwiLFxcXCJcXG4rXFx0XFx0XFx0IFxcXCJcXFxcXFxcImZsYWdzXFxcXFxcXCI6MCxcXFxcXFxcImVsZW1lbnRzXFxcXFxcXCI6W119XVxcXCIsIHJvb3RfaWQsIHR5cGVfbmFtZSk7XFxuK1xcdGlmIChkdW1wX21hcChyb290X2lkLCBcXFwiLWogLXJcXFwiLCBvdXRwdXQpKVxcbitcXHRcXHRBU1NFUlRfU1RSRVEob3V0cHV0LCBleHBlY3RlZCwgXFxcInJlY3Vyc2l2ZV9qc29uXFxcIik7XFxuK1xcdGlmIChkdW1wX21hcChyb290X2lkLCBcXFwiLS1qc29uIC0tcmVjdXJzaXZlXFxcIiwgb3V0cHV0KSlcXG4rXFx0XFx0QVNTRVJUX1NUUkVRKG91dHB1dCwgZXhwZWN0ZWQsIFxcXCJyZWN1cnNpdmVfbG9uZ19vcHRpb25zXFxcIik7XFxuK1xcdGNoZWNrX3BsYWluKHJvb3RfaWQsIGlubmVyX2lkLCB0eXBlX25hbWUsIGVudHJpZXMsIHR5cGVkKTtcXG4rXFxuK1xcdC8qIFJlY3Vyc2lvbiBvbiBhbiBvcmRpbmFyeSBtYXAgc3RpbGwgZW1pdHMgYSBzaW5nbGUgbWFwIG9iamVjdC4gKi9cXG4rXFx0c25wcmludGYoZXhwZWN0ZWQsIHNpemVvZihleHBlY3RlZCksXFxuK1xcdFxcdCBcXFwiW3tcXFxcXFxcImlkXFxcXFxcXCI6JXUsXFxcXFxcXCJ0eXBlXFxcXFxcXCI6XFxcXFxcXCJoYXNoXFxcXFxcXCIsXFxcXFxcXCJuYW1lXFxcXFxcXCI6XFxcXFxcXCJkdW1wX2lubmVyXFxcXFxcXCIsXFxcIlxcbitcXHRcXHQgXFxcIlxcXFxcXFwiZmxhZ3NcXFxcXFxcIjowLFxcXFxcXFwiZWxlbWVudHNcXFxcXFxcIjolc31dXFxcIiwgaW5uZXJfaWQsIGlubmVyKTtcXG4rXFx0aWYgKGR1bXBfbWFwKGlubmVyX2lkLCBcXFwiLWogLXJcXFwiLCBvdXRwdXQpKVxcbitcXHRcXHRBU1NFUlRfU1RSRVEob3V0cHV0LCBleHBlY3RlZCwgXFxcIm9yZGluYXJ5X3JlY3Vyc2l2ZVxcXCIpO1xcbitvdXQ6XFxuK1xcdGlmIChvdXRlcl9mZCBcXHUwMDNlPSAwKVxcbitcXHRcXHRjbG9zZShvdXRlcl9mZCk7XFxuK1xcdGlmIChpbm5lcl9mZCBcXHUwMDNlPSAwKVxcbitcXHRcXHRjbG9zZShpbm5lcl9mZCk7XFxuK1xcdGJ0Zl9fZnJlZShidGYpO1xcbit9XFxuK1xcbitzdGF0aWMgdm9pZCB0ZXN0X211bHRpcGxlX3Jvb3RzKHZvaWQpXFxuK3tcXG4rXFx0TElCQlBGX09QVFMoYnBmX21hcF9jcmVhdGVfb3B0cywgb3B0cyk7XFxuK1xcdGNoYXIgY29tbWFuZFtNQVhfQlBGVE9PTF9DTURfTEVOXSwgbmFtZVtCUEZfT0JKX05BTUVfTEVOXTtcXG4rXFx0Y2hhciBvdXRwdXRbT1VUUFVUX1NJWkVdID0ge30sIGV4cGVjdGVkW09VVFBVVF9TSVpFICogNF0sIGVsZW1lbnRzW09VVFBVVF9TSVpFXTtcXG4rXFx0c3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCB0eXBlc1tdID0geyBcXFwiaGFzaFxcXCIsIFxcXCJhcnJheV9vZl9tYXBzXFxcIiwgXFxcImhhc2hfb2ZfbWFwc1xcXCIsIFxcXCJoYXNoXFxcIiB9O1xcbitcXHRpbnQgZmRzW10gPSB7IC0xLCAtMSwgLTEsIC0xIH07XFxuK1xcdF9fdTMyIGlkc1s0XSwga2V5O1xcbitcXHRpbnQgaSwgbGVuID0gMDtcXG4rXFxuK1xcdC8qXFxuK1xcdCAqIFNlbGVjdCB0aGUgZmlyc3QgaW5uZXIgbWFwIGFuZCBib3RoIG91dGVycyBhcyByb290cy4gVGhlIG90aGVyIGlubmVyXFxuK1xcdCAqIG1hcCBtdXN0IGJlIGFwcGVuZGVkIGFmdGVyIGFsbCB0aHJlZSByb290cywgZXZlbiB0aG91Z2ggaXQgaXMgZm91bmRcXG4rXFx0ICogd2hpbGUgZHVtcGluZyB0aGUgZmlyc3Qgb3V0ZXIuIEEgcHJvY2Vzcy1zcGVjaWZpYyBuYW1lIGF2b2lkcyBvdGhlclxcbitcXHQgKiB0ZXN0cycgbWFwcyBqb2luaW5nIHRoZSBzZWxlY3Rpb24uXFxuK1xcdCAqL1xcbitcXHRzbnByaW50ZihuYW1lLCBzaXplb2YobmFtZSksIFxcXCJkdW1wXyV1XFxcIiwgZ2V0cGlkKCkpO1xcbitcXHRmZHNbMF0gPSBicGZfbWFwX2NyZWF0ZShCUEZfTUFQX1RZUEVfSEFTSCwgbmFtZSwgNCwgNCwgMSwgTlVMTCk7XFxuK1xcdGlmICghQVNTRVJUX09LX0ZEKGZkc1swXSwgXFxcImNyZWF0ZV9zZWxlY3RlZF9pbm5lclxcXCIpKVxcbitcXHRcXHRnb3RvIG91dDtcXG4rXFx0ZmRzWzNdID0gYnBmX21hcF9jcmVhdGUoQlBGX01BUF9UWVBFX0hBU0gsIFxcXCJkdW1wX2Rpc2NvdmVyZWRcXFwiLCA0LCA0LCAxLCBOVUxMKTtcXG4rXFx0aWYgKCFBU1NFUlRfT0tfRkQoZmRzWzNdLCBcXFwiY3JlYXRlX2Rpc2NvdmVyZWRfaW5uZXJcXFwiKSlcXG4rXFx0XFx0Z290byBvdXQ7XFxuK1xcdG9wdHMuaW5uZXJfbWFwX2ZkID0gZmRzWzBdO1xcbitcXHRmZHNbMV0gPSBicGZfbWFwX2NyZWF0ZShCUEZfTUFQX1RZUEVfQVJSQVlfT0ZfTUFQUywgbmFtZSwgNCwgNCwgMiwgXFx1MDAyNm9wdHMpO1xcbitcXHRpZiAoIUFTU0VSVF9PS19GRChmZHNbMV0sIFxcXCJjcmVhdGVfYXJyYXlfcm9vdFxcXCIpKVxcbitcXHRcXHRnb3RvIG91dDtcXG4rXFx0ZmRzWzJdID0gYnBmX21hcF9jcmVhdGUoQlBGX01BUF9UWVBFX0hBU0hfT0ZfTUFQUywgbmFtZSwgNCwgNCwgMiwgXFx1MDAyNm9wdHMpO1xcbitcXHRpZiAoIUFTU0VSVF9PS19GRChmZHNbMl0sIFxcXCJjcmVhdGVfaGFzaF9yb290XFxcIikpXFxuK1xcdFxcdGdvdG8gb3V0O1xcbitcXHRmb3IgKGkgPSAxOyBpIFxcdTAwM2M9IDI7IGkrKykge1xcbitcXHRcXHRrZXkgPSAwO1xcbitcXHRcXHRpZiAoIUFTU0VSVF9PSyhicGZfbWFwX3VwZGF0ZV9lbGVtKGZkc1tpXSwgXFx1MDAyNmtleSwgXFx1MDAyNmZkc1swXSwgQlBGX0FOWSksXFxuK1xcdFxcdFxcdCAgICAgICBcXFwicmVmZXJlbmNlX3NlbGVjdGVkX2lubmVyXFxcIikpXFxuK1xcdFxcdFxcdGdvdG8gb3V0O1xcbitcXHRcXHRrZXkgPSAxO1xcbitcXHRcXHRpZiAoIUFTU0VSVF9PSyhicGZfbWFwX3VwZGF0ZV9lbGVtKGZkc1tpXSwgXFx1MDAyNmtleSwgXFx1MDAyNmZkc1szXSwgQlBGX0FOWSksXFxuK1xcdFxcdFxcdCAgICAgICBcXFwicmVmZXJlbmNlX2Rpc2NvdmVyZWRfaW5uZXJcXFwiKSlcXG4rXFx0XFx0XFx0Z290byBvdXQ7XFxuK1xcdH1cXG4rXFx0Zm9yIChpID0gMDsgaSBcXHUwMDNjIEFSUkFZX1NJWkUoZmRzKTsgaSsrKSB7XFxuK1xcdFxcdGlkc1tpXSA9IG1hcF9pZChmZHNbaV0pO1xcbitcXHRcXHRpZiAoIWlkc1tpXSB8fCAhZHVtcF9tYXAoaWRzW2ldLCBcXFwiLWpcXFwiLCBlbGVtZW50cykpXFxuK1xcdFxcdFxcdGdvdG8gb3V0O1xcbitcXHRcXHRsZW4gKz0gc25wcmludGYoZXhwZWN0ZWQgKyBsZW4sIHNpemVvZihleHBlY3RlZCkgLSBsZW4sXFxuK1xcdFxcdFxcdFxcdFxcXCIlc3tcXFxcXFxcImlkXFxcXFxcXCI6JXUsXFxcXFxcXCJ0eXBlXFxcXFxcXCI6XFxcXFxcXCIlc1xcXFxcXFwiLFxcXFxcXFwibmFtZVxcXFxcXFwiOlxcXFxcXFwiJXNcXFxcXFxcIixcXFwiXFxuK1xcdFxcdFxcdFxcdFxcXCJcXFxcXFxcImZsYWdzXFxcXFxcXCI6MCxcXFxcXFxcImVsZW1lbnRzXFxcXFxcXCI6JXN9JXNcXFwiLFxcbitcXHRcXHRcXHRcXHRpID8gXFxcIixcXFwiIDogXFxcIltcXFwiLCBpZHNbaV0sIHR5cGVzW2ldLFxcbitcXHRcXHRcXHRcXHRpID09IDMgPyBcXFwiZHVtcF9kaXNjb3ZlcmVkXFxcIiA6IG5hbWUsIGVsZW1lbnRzLCBpID09IDMgPyBcXFwiXVxcXCIgOiBcXFwiXFxcIik7XFxuK1xcdH1cXG4rXFx0c25wcmludGYoY29tbWFuZCwgc2l6ZW9mKGNvbW1hbmQpLCBcXFwiLWogLXIgbWFwIGR1bXAgbmFtZSAlc1xcXCIsIG5hbWUpO1xcbitcXHRpZiAoQVNTRVJUX09LKGdldF9icGZ0b29sX2NvbW1hbmRfb3V0cHV0KGNvbW1hbmQsIG91dHB1dCwgc2l6ZW9mKG91dHB1dCkgLSAxKSxcXG4rXFx0XFx0ICAgICAgXFxcImR1bXBfbXVsdGlwbGVfcm9vdHNcXFwiKSkge1xcbitcXHRcXHRvdXRwdXRbc3RyY3NwbihvdXRwdXQsIFxcXCJcXFxcblxcXCIpXSA9ICdcXFxcMCc7XFxuK1xcdFxcdEFTU0VSVF9TVFJFUShvdXRwdXQsIGV4cGVjdGVkLCBcXFwicm9vdHNfZmlyc3RfYW5kX3NlZWRfZGVkdXBcXFwiKTtcXG4rXFx0fVxcbitvdXQ6XFxuK1xcdGZvciAoaSA9IDA7IGkgXFx1MDAzYyBBUlJBWV9TSVpFKGZkcyk7IGkrKylcXG4rXFx0XFx0aWYgKGZkc1tpXSBcXHUwMDNlPSAwKVxcbitcXHRcXHRcXHRjbG9zZShmZHNbaV0pO1xcbit9XFxuK1xcbitzdGF0aWMgdm9pZCB0ZXN0X3VucmVhZGFibGUoYm9vbCBvdXRlcilcXG4re1xcbitcXHRMSUJCUEZfT1BUUyhicGZfbWFwX2NyZWF0ZV9vcHRzLCBvcHRzKTtcXG4rXFx0Y2hhciBlbGVtZW50c1tPVVRQVVRfU0laRV0sIG91dHB1dFtPVVRQVVRfU0laRV0sIHJvb3RbT1VUUFVUX1NJWkVdO1xcbitcXHRjaGFyIGV4cGVjdGVkW09VVFBVVF9TSVpFICogM10sIHBsYWluW09VVFBVVF9TSVpFXSA9IHt9O1xcbitcXHRjaGFyIGNvbW1hbmRbTUFYX0JQRlRPT0xfQ01EX0xFTl07XFxuK1xcdGludCBpbm5lcl9mZCA9IC0xLCBvdXRlcl9mZCA9IC0xLCBsb29rdXBfZXJybm87XFxuK1xcdF9fdTMyIGlubmVyX2lkLCByb290X2lkLCBrZXkgPSAwLCB2YWx1ZTtcXG4rXFxuK1xcdC8qXFxuK1xcdCAqIEV2ZXJ5IGtleSBpcyBlbnVtZXJhYmxlLCBidXQgUEVSRl9FVkVOVF9BUlJBWSBsb29rdXAgcmV0dXJuc1xcbitcXHQgKiBFTk9UU1VQUCAodGhlIGtlcm5lbC1pbnRlcm5hbCBlcnJubykuIENoZWNrIGJvdGggZW50cmllcyBzbyBhblxcbitcXHQgKiBlYXJseSBleGl0IG9uIHRoZSBmaXJzdCBsb29rdXAgZmFpbHVyZSBjYW5ub3QgcGFzcy5cXG4rXFx0ICovXFxuK1xcdGlubmVyX2ZkID0gYnBmX21hcF9jcmVhdGUoQlBGX01BUF9UWVBFX1BFUkZfRVZFTlRfQVJSQVksIFxcXCJkdW1wX3VucmVhZGFibGVcXFwiLFxcbitcXHRcXHRcXHRcXHQgIHNpemVvZihrZXkpLCBzaXplb2YodmFsdWUpLCAyLCBOVUxMKTtcXG4rXFx0aWYgKCFBU1NFUlRfT0tfRkQoaW5uZXJfZmQsIFxcXCJjcmVhdGVfdW5yZWFkYWJsZVxcXCIpKVxcbitcXHRcXHRnb3RvIG91dDtcXG4rXFx0aWYgKCFBU1NFUlRfTFQoYnBmX21hcF9sb29rdXBfZWxlbShpbm5lcl9mZCwgXFx1MDAyNmtleSwgXFx1MDAyNnZhbHVlKSwgMCxcXG4rXFx0XFx0ICAgICAgIFxcXCJ1bnJlYWRhYmxlX2xvb2t1cFxcXCIpKVxcbitcXHRcXHRnb3RvIG91dDtcXG4rXFx0bG9va3VwX2Vycm5vID0gZXJybm87XFxuK1xcdGlmICghQVNTRVJUX05FUShsb29rdXBfZXJybm8sIEVOT0VOVCwgXFxcInVucmVhZGFibGVfbm90X21pc3NpbmdcXFwiKSlcXG4rXFx0XFx0Z290byBvdXQ7XFxuK1xcdGlubmVyX2lkID0gbWFwX2lkKGlubmVyX2ZkKTtcXG4rXFx0aWYgKCFpbm5lcl9pZCB8fCAhZHVtcF9tYXAoaW5uZXJfaWQsIFxcXCItalxcXCIsIGVsZW1lbnRzKSlcXG4rXFx0XFx0Z290byBvdXQ7XFxuK1xcdEFTU0VSVF9FUShjb3VudF90b2tlbihlbGVtZW50cywgXFxcIlxcXFxcXFwiZXJyb3JcXFxcXFxcIjpcXFwiKSwgMiwgXFxcImRlZmF1bHRfanNvbl9lcnJvcnNcXFwiKTtcXG4rXFx0c25wcmludGYoY29tbWFuZCwgc2l6ZW9mKGNvbW1hbmQpLCBcXFwibWFwIGR1bXAgaWQgJXVcXFwiLCBpbm5lcl9pZCk7XFxuK1xcdGlmICghQVNTRVJUX09LKGdldF9icGZ0b29sX2NvbW1hbmRfb3V0cHV0KGNvbW1hbmQsIHBsYWluLCBzaXplb2YocGxhaW4pIC0gMSksXFxuK1xcdFxcdCAgICAgICBcXFwiZGVmYXVsdF9wbGFpbl91bnJlYWRhYmxlXFxcIikpXFxuK1xcdFxcdGdvdG8gb3V0O1xcbitcXHRBU1NFUlRfRVEoY291bnRfdG9rZW4ocGxhaW4sIHN0cmVycm9yKGxvb2t1cF9lcnJubykpLCAyLCBcXFwiZGVmYXVsdF9wbGFpbl9lcnJvcnNcXFwiKTtcXG4rXFx0QVNTRVJUX0hBU19TVUJTVFIocGxhaW4sIFxcXCJGb3VuZCAwIGVsZW1lbnRzXFxcIiwgXFxcImRlZmF1bHRfcGxhaW5fY291bnRcXFwiKTtcXG4rXFxuK1xcdHJvb3RfaWQgPSBpbm5lcl9pZDtcXG4rXFx0aWYgKG91dGVyKSB7XFxuK1xcdFxcdG9wdHMuaW5uZXJfbWFwX2ZkID0gaW5uZXJfZmQ7XFxuK1xcdFxcdG91dGVyX2ZkID0gYnBmX21hcF9jcmVhdGUoQlBGX01BUF9UWVBFX0FSUkFZX09GX01BUFMsIFxcXCJkdW1wX291dGVyXFxcIixcXG4rXFx0XFx0XFx0XFx0XFx0ICBzaXplb2Yoa2V5KSwgc2l6ZW9mKHZhbHVlKSwgMSwgXFx1MDAyNm9wdHMpO1xcbitcXHRcXHRpZiAoIUFTU0VSVF9PS19GRChvdXRlcl9mZCwgXFxcImNyZWF0ZV9vdXRlclxcXCIpIHx8XFxuK1xcdFxcdCAgICAhQVNTRVJUX09LKGJwZl9tYXBfdXBkYXRlX2VsZW0ob3V0ZXJfZmQsIFxcdTAwMjZrZXksIFxcdTAwMjZpbm5lcl9mZCwgQlBGX0FOWSksXFxuK1xcdFxcdFxcdCAgICAgICBcXFwicG9wdWxhdGVfb3V0ZXJcXFwiKSlcXG4rXFx0XFx0XFx0Z290byBvdXQ7XFxuK1xcdFxcdHJvb3RfaWQgPSBtYXBfaWQob3V0ZXJfZmQpO1xcbitcXHRcXHRpZiAoIXJvb3RfaWQgfHwgIWR1bXBfbWFwKHJvb3RfaWQsIFxcXCItalxcXCIsIHJvb3QpKVxcbitcXHRcXHRcXHRnb3RvIG91dDtcXG4rXFx0XFx0c25wcmludGYoZXhwZWN0ZWQsIHNpemVvZihleHBlY3RlZCksXFxuK1xcdFxcdFxcdCBcXFwiW3tcXFxcXFxcImlkXFxcXFxcXCI6JXUsXFxcXFxcXCJ0eXBlXFxcXFxcXCI6XFxcXFxcXCJhcnJheV9vZl9tYXBzXFxcXFxcXCIsXFxcXFxcXCJuYW1lXFxcXFxcXCI6XFxcXFxcXCJkdW1wX291dGVyXFxcXFxcXCIsXFxcIlxcbitcXHRcXHRcXHQgXFxcIlxcXFxcXFwiZmxhZ3NcXFxcXFxcIjowLFxcXFxcXFwiZWxlbWVudHNcXFxcXFxcIjolc30se1xcXFxcXFwiaWRcXFxcXFxcIjoldSxcXFwiXFxuK1xcdFxcdFxcdCBcXFwiXFxcXFxcXCJ0eXBlXFxcXFxcXCI6XFxcXFxcXCJwZXJmX2V2ZW50X2FycmF5XFxcXFxcXCIsXFxcXFxcXCJuYW1lXFxcXFxcXCI6XFxcXFxcXCJkdW1wX3VucmVhZGFibGVcXFxcXFxcIixcXFwiXFxuK1xcdFxcdFxcdCBcXFwiXFxcXFxcXCJmbGFnc1xcXFxcXFwiOjAsXFxcXFxcXCJlbGVtZW50c1xcXFxcXFwiOiVzfV1cXFwiLCByb290X2lkLCByb290LCBpbm5lcl9pZCwgZWxlbWVudHMpO1xcbitcXHR9IGVsc2Uge1xcbitcXHRcXHRzbnByaW50ZihleHBlY3RlZCwgc2l6ZW9mKGV4cGVjdGVkKSxcXG4rXFx0XFx0XFx0IFxcXCJbe1xcXFxcXFwiaWRcXFxcXFxcIjoldSxcXFxcXFxcInR5cGVcXFxcXFxcIjpcXFxcXFxcInBlcmZfZXZlbnRfYXJyYXlcXFxcXFxcIixcXFwiXFxuK1xcdFxcdFxcdCBcXFwiXFxcXFxcXCJuYW1lXFxcXFxcXCI6XFxcXFxcXCJkdW1wX3VucmVhZGFibGVcXFxcXFxcIixcXFxcXFxcImZsYWdzXFxcXFxcXCI6MCxcXFxcXFxcImVsZW1lbnRzXFxcXFxcXCI6JXN9XVxcXCIsXFxuK1xcdFxcdFxcdCBpbm5lcl9pZCwgZWxlbWVudHMpO1xcbitcXHR9XFxuK1xcdGlmIChkdW1wX21hcChyb290X2lkLCBcXFwiLWogLXJcXFwiLCBvdXRwdXQpKVxcbitcXHRcXHRBU1NFUlRfU1RSRVEob3V0cHV0LCBleHBlY3RlZCwgXFxcInJlY3Vyc2l2ZV91bnJlYWRhYmxlX2pzb25cXFwiKTtcXG4rXFx0bWVtc2V0KG91dHB1dCwgMCwgc2l6ZW9mKG91dHB1dCkpO1xcbitcXHRzbnByaW50Zihjb21tYW5kLCBzaXplb2YoY29tbWFuZCksIFxcXCItciBtYXAgZHVtcCBpZCAldVxcXCIsIHJvb3RfaWQpO1xcbitcXHRpZiAoQVNTRVJUX09LKGdldF9icGZ0b29sX2NvbW1hbmRfb3V0cHV0KGNvbW1hbmQsIG91dHB1dCwgc2l6ZW9mKG91dHB1dCkgLSAxKSxcXG4rXFx0XFx0ICAgICAgXFxcInJlY3Vyc2l2ZV91bnJlYWRhYmxlX3BsYWluXFxcIikpIHtcXG4rXFx0XFx0QVNTRVJUX0hBU19TVUJTVFIob3V0cHV0LCBwbGFpbiwgXFxcInJlY3Vyc2l2ZV9wbGFpbl9wcmVzZXJ2ZXNfZXJyb3JzXFxcIik7XFxuK1xcdFxcdEFTU0VSVF9FUShjb3VudF90b2tlbihvdXRwdXQsIHN0cmVycm9yKGxvb2t1cF9lcnJubykpLCAyLFxcbitcXHRcXHRcXHQgIFxcXCJyZWN1cnNpdmVfcGxhaW5fZXJyb3JzXFxcIik7XFxuK1xcdFxcdEFTU0VSVF9FUShjb3VudF90b2tlbihvdXRwdXQsIFxcXCJGb3VuZCBcXFwiKSwgb3V0ZXIgPyAyIDogMSxcXG4rXFx0XFx0XFx0ICBcXFwicmVjdXJzaXZlX3BsYWluX21hcHNcXFwiKTtcXG4rXFx0fVxcbitvdXQ6XFxuK1xcdGlmIChvdXRlcl9mZCBcXHUwMDNlPSAwKVxcbitcXHRcXHRjbG9zZShvdXRlcl9mZCk7XFxuK1xcdGlmIChpbm5lcl9mZCBcXHUwMDNlPSAwKVxcbitcXHRcXHRjbG9zZShpbm5lcl9mZCk7XFxuK31cXG4rXFxuK3N0YXRpYyB2b2lkIHRlc3RfbWFueV9pbm5lcl9tYXBzKGJvb2wganNvbilcXG4re1xcbitcXHRlbnVtIHtcXG4rXFx0XFx0RFVNUF9PSyxcXG4rXFx0XFx0RFVNUF9FUlJfUkxJTUlULFxcbitcXHRcXHREVU1QX0VSUl9DT01NQU5ELFxcbitcXHRcXHREVU1QX0VSUl9DT1VOVFMsXFxuK1xcdFxcdERVTVBfRVJSX0lEUyxcXG4rXFx0XFx0RFVNUF9FUlJfSlNPTixcXG4rXFx0XFx0RFVNUF9FUlJfRkRTLFxcbitcXHR9O1xcbitcXHRMSUJCUEZfT1BUUyhicGZfbWFwX2NyZWF0ZV9vcHRzLCBvcHRzKTtcXG4rXFx0Y29uc3Qgc3RydWN0IHJsaW1pdCBsaW1pdCA9IHsgLnJsaW1fY3VyID0gMzIsIC5ybGltX21heCA9IDMyIH07XFxuK1xcdGNoYXIgY29tbWFuZFtNQVhfQlBGVE9PTF9DTURfTEVOXSwgdG9rZW5bNjRdO1xcbitcXHRfX3UzMiBpZHNbNjRdLCByb290X2lkLCBrZXk7XFxuK1xcdGludCBpbm5lcl9mZCA9IC0xLCBvdXRlcl9mZCA9IC0xLCBzdGF0dXM7XFxuK1xcdGludCBpbmhlcml0ZWRfZmRzWzMyXSwgbnJfaW5oZXJpdGVkID0gMCwgaTtcXG4rXFx0Y2hhciAqb3V0cHV0ID0gTlVMTDtcXG4rXFx0cGlkX3QgcGlkO1xcbitcXG4rXFx0aW5uZXJfZmQgPSBicGZfbWFwX2NyZWF0ZShCUEZfTUFQX1RZUEVfSEFTSCwgXFxcImR1bXBfaW5uZXJcXFwiLCA0LCA0LCAxLCBOVUxMKTtcXG4rXFx0aWYgKCFBU1NFUlRfT0tfRkQoaW5uZXJfZmQsIFxcXCJjcmVhdGVfdGVtcGxhdGVcXFwiKSlcXG4rXFx0XFx0Z290byBvdXQ7XFxuK1xcdG9wdHMuaW5uZXJfbWFwX2ZkID0gaW5uZXJfZmQ7XFxuK1xcdG91dGVyX2ZkID0gYnBmX21hcF9jcmVhdGUoQlBGX01BUF9UWVBFX0FSUkFZX09GX01BUFMsIFxcXCJkdW1wX291dGVyXFxcIiwgNCwgNCxcXG4rXFx0XFx0XFx0XFx0ICBBUlJBWV9TSVpFKGlkcyksIFxcdTAwMjZvcHRzKTtcXG4rXFx0Y2xvc2UoaW5uZXJfZmQpO1xcbitcXHRpbm5lcl9mZCA9IC0xO1xcbitcXHRpZiAoIUFTU0VSVF9PS19GRChvdXRlcl9mZCwgXFxcImNyZWF0ZV9vdXRlclxcXCIpKVxcbitcXHRcXHRnb3RvIG91dDtcXG4rXFx0Zm9yIChrZXkgPSAwOyBrZXkgXFx1MDAzYyBBUlJBWV9TSVpFKGlkcyk7IGtleSsrKSB7XFxuK1xcdFxcdGlubmVyX2ZkID0gYnBmX21hcF9jcmVhdGUoQlBGX01BUF9UWVBFX0hBU0gsIFxcXCJkdW1wX2lubmVyXFxcIiwgNCwgNCwgMSwgTlVMTCk7XFxuK1xcdFxcdGlmICghQVNTRVJUX09LX0ZEKGlubmVyX2ZkLCBcXFwiY3JlYXRlX2lubmVyXFxcIikgfHxcXG4rXFx0XFx0ICAgICFBU1NFUlRfT0soYnBmX21hcF91cGRhdGVfZWxlbShvdXRlcl9mZCwgXFx1MDAyNmtleSwgXFx1MDAyNmlubmVyX2ZkLCBCUEZfQU5ZKSxcXG4rXFx0XFx0XFx0ICAgICAgIFxcXCJwb3B1bGF0ZV9vdXRlclxcXCIpKVxcbitcXHRcXHRcXHRnb3RvIG91dDtcXG4rXFx0XFx0aWRzW2tleV0gPSBtYXBfaWQoaW5uZXJfZmQpO1xcbitcXHRcXHRpZiAoIWlkc1trZXldKVxcbitcXHRcXHRcXHRnb3RvIG91dDtcXG4rXFx0XFx0LyogVGhlIG91dGVyIG1hcCBrZWVwcyBlYWNoIGRpc3RpbmN0IGlubmVyIG1hcCBhbGl2ZS4gKi9cXG4rXFx0XFx0Y2xvc2UoaW5uZXJfZmQpO1xcbitcXHRcXHRpbm5lcl9mZCA9IC0xO1xcbitcXHR9XFxuK1xcdHJvb3RfaWQgPSBtYXBfaWQob3V0ZXJfZmQpO1xcbitcXHRvdXRwdXQgPSBjYWxsb2MoMSwgNjU1MzYpO1xcbitcXHRpZiAoIXJvb3RfaWQgfHwgIUFTU0VSVF9PS19QVFIob3V0cHV0LCBcXFwiYWxsb2NhdGVfb3V0cHV0XFxcIikpXFxuK1xcdFxcdGdvdG8gb3V0O1xcbitcXG4rXFx0LyogRmlsbCB0aGUgbG93IEZEIHNsb3RzIHRvIGV4ZXJjaXNlIGluaGVyaXRlZCBkZXNjcmlwdG9yIGNsZWFudXAuICovXFxuK1xcdGZvciAoaSA9IDA7IGkgXFx1MDAzYyBBUlJBWV9TSVpFKGluaGVyaXRlZF9mZHMpOyBpKyspIHtcXG4rXFx0XFx0aW50IGZkID0gb3BlbihcXFwiL2Rldi9udWxsXFxcIiwgT19SRE9OTFkpO1xcbitcXG4rXFx0XFx0aWYgKCFBU1NFUlRfT0tfRkQoZmQsIFxcXCJvcGVuX2luaGVyaXRlZF9mZFxcXCIpKVxcbitcXHRcXHRcXHRnb3RvIG91dDtcXG4rXFx0XFx0aW5oZXJpdGVkX2Zkc1tucl9pbmhlcml0ZWQrK10gPSBmZDtcXG4rXFx0fVxcbitcXG4rXFx0LypcXG4rXFx0ICogQ3JlYXRlIGFsbCBmaXh0dXJlcyBiZWZvcmUgbG93ZXJpbmcgdGhlIGxpbWl0LCBhbmQga2VlcCB0aGUgdGVzdFxcbitcXHQgKiBydW5uZXIncyBsaW1pdCB1bmNoYW5nZWQuIFJldGFpbmluZyBldmVyeSBkaXNjb3ZlcmVkIEZEIHdvdWxkIGV4Y2VlZFxcbitcXHQgKiB0aGlzIGxpbWl0IGJlZm9yZSB0aGUgcmVjdXJzaXZlIGR1bXAgY291bGQgdmlzaXQgYWxsIGlubmVyIG1hcHMuXFxuK1xcdCAqL1xcbitcXHRwaWQgPSBmb3JrKCk7XFxuK1xcdGlmICghQVNTRVJUX0dFKHBpZCwgMCwgXFxcImZvcmtcXFwiKSlcXG4rXFx0XFx0Z290byBvdXQ7XFxuK1xcdGlmICghcGlkKSB7XFxuK1xcdFxcdHN0cnVjdCBkaXJlbnQgKmVudHJ5O1xcbitcXHRcXHRESVIgKmRpcjtcXG4rXFxuK1xcdFxcdC8qIFJlc2VydmUgYSBzbG90IGZvciB0aGUgZGlyZWN0b3J5IGV2ZW4gaWYgdGhlIHBhcmVudCBpcyBmdWxsLiAqL1xcbitcXHRcXHRjbG9zZShpbmhlcml0ZWRfZmRzW25yX2luaGVyaXRlZCAtIDFdKTtcXG4rXFx0XFx0ZGlyID0gb3BlbmRpcihcXFwiL3Byb2Mvc2VsZi9mZFxcXCIpO1xcbitcXHRcXHRpZiAoIWRpcilcXG4rXFx0XFx0XFx0X2V4aXQoRFVNUF9FUlJfRkRTKTtcXG4rXFx0XFx0LyogVGhlIHBhcmVudCBrZWVwcyB0aGUgb3V0ZXIgbWFwIGFuZCBpdHMgaW5uZXIgbWFwcyBhbGl2ZS4gKi9cXG4rXFx0XFx0Zm9yICg7Oykge1xcbitcXHRcXHRcXHRjaGFyICplbmQ7XFxuK1xcdFxcdFxcdGxvbmcgZmQ7XFxuK1xcbitcXHRcXHRcXHRlcnJubyA9IDA7XFxuK1xcdFxcdFxcdGVudHJ5ID0gcmVhZGRpcihkaXIpO1xcbitcXHRcXHRcXHRpZiAoIWVudHJ5KSB7XFxuK1xcdFxcdFxcdFxcdGlmIChlcnJubylcXG4rXFx0XFx0XFx0XFx0XFx0X2V4aXQoRFVNUF9FUlJfRkRTKTtcXG4rXFx0XFx0XFx0XFx0YnJlYWs7XFxuK1xcdFxcdFxcdH1cXG4rXFx0XFx0XFx0ZmQgPSBzdHJ0b2woZW50cnktXFx1MDAzZWRfbmFtZSwgXFx1MDAyNmVuZCwgMTApO1xcbitcXHRcXHRcXHRpZiAoKmVuZCB8fCBmZCBcXHUwMDNjIDMgfHwgZmQgPT0gZGlyZmQoZGlyKSlcXG4rXFx0XFx0XFx0XFx0Y29udGludWU7XFxuK1xcdFxcdFxcdGNsb3NlKGZkKTtcXG4rXFx0XFx0fVxcbitcXHRcXHRpZiAoY2xvc2VkaXIoZGlyKSlcXG4rXFx0XFx0XFx0X2V4aXQoRFVNUF9FUlJfRkRTKTtcXG4rXFx0XFx0aWYgKHNldHJsaW1pdChSTElNSVRfTk9GSUxFLCBcXHUwMDI2bGltaXQpKVxcbitcXHRcXHRcXHRfZXhpdChEVU1QX0VSUl9STElNSVQpO1xcbitcXHRcXHRzbnByaW50Zihjb21tYW5kLCBzaXplb2YoY29tbWFuZCksIFxcXCIlcyAtciBtYXAgZHVtcCBpZCAldVxcXCIsXFxuK1xcdFxcdFxcdCBqc29uID8gXFxcIi1qXFxcIiA6IFxcXCJcXFwiLCByb290X2lkKTtcXG4rXFx0XFx0aWYgKGdldF9icGZ0b29sX2NvbW1hbmRfb3V0cHV0KGNvbW1hbmQsIG91dHB1dCwgNjU1MzUpKVxcbitcXHRcXHRcXHRfZXhpdChEVU1QX0VSUl9DT01NQU5EKTtcXG4rXFx0XFx0aWYgKGNvdW50X3Rva2VuKG91dHB1dCwganNvbiA/IFxcXCJcXFxcXFxcImlkXFxcXFxcXCI6XFxcIiA6IFxcXCJGb3VuZCBcXFwiKSAhPSBBUlJBWV9TSVpFKGlkcykgKyAxIHx8XFxuK1xcdFxcdCAgICBjb3VudF90b2tlbihvdXRwdXQsIGpzb24gPyBcXFwiXFxcXFxcXCJpbm5lcl9tYXBfaWRcXFxcXFxcIjpcXFwiIDogXFxcImlubmVyX21hcF9pZDpcXFwiKSAhPVxcbitcXHRcXHQgICAgQVJSQVlfU0laRShpZHMpKVxcbitcXHRcXHRcXHRfZXhpdChEVU1QX0VSUl9DT1VOVFMpO1xcbitcXHRcXHRmb3IgKGtleSA9IDA7IGtleSBcXHUwMDNjIEFSUkFZX1NJWkUoaWRzKTsga2V5KyspIHtcXG4rXFx0XFx0XFx0aWYgKGpzb24pXFxuK1xcdFxcdFxcdFxcdHNucHJpbnRmKHRva2VuLCBzaXplb2YodG9rZW4pLCBcXFwiXFxcXFxcXCJpZFxcXFxcXFwiOiV1LFxcXCIsIGlkc1trZXldKTtcXG4rXFx0XFx0XFx0ZWxzZVxcbitcXHRcXHRcXHRcXHRzbnByaW50Zih0b2tlbiwgc2l6ZW9mKHRva2VuKSwgXFxcIlxcXFxuJXU6IGhhc2ggIG5hbWUgZHVtcF9pbm5lciAgXFxcIixcXG4rXFx0XFx0XFx0XFx0XFx0IGlkc1trZXldKTtcXG4rXFx0XFx0XFx0aWYgKGNvdW50X3Rva2VuKG91dHB1dCwgdG9rZW4pICE9IDEpXFxuK1xcdFxcdFxcdFxcdF9leGl0KERVTVBfRVJSX0lEUyk7XFxuK1xcdFxcdH1cXG4rXFx0XFx0aWYgKGpzb24gXFx1MDAyNlxcdTAwMjYgKG91dHB1dFswXSAhPSAnWycgfHxcXG4rXFx0XFx0XFx0ICAgICBzdHJjbXAob3V0cHV0ICsgc3RybGVuKG91dHB1dCkgLSAyLCBcXFwiXVxcXFxuXFxcIikpKVxcbitcXHRcXHRcXHRfZXhpdChEVU1QX0VSUl9KU09OKTtcXG4rXFx0XFx0X2V4aXQoRFVNUF9PSyk7XFxuK1xcdH1cXG4rXFx0aWYgKEFTU0VSVF9FUSh3YWl0cGlkKHBpZCwgXFx1MDAyNnN0YXR1cywgMCksIHBpZCwgXFxcIndhaXRwaWRcXFwiKSBcXHUwMDI2XFx1MDAyNlxcbitcXHQgICAgQVNTRVJUX1RSVUUoV0lGRVhJVEVEKHN0YXR1cyksIFxcXCJjaGlsZF9leGl0ZWRcXFwiKSlcXG4rXFx0XFx0QVNTRVJUX0VRKFdFWElUU1RBVFVTKHN0YXR1cyksIERVTVBfT0ssIFxcXCJkdW1wX3dpdGhfbG93X2ZkX2xpbWl0XFxcIik7XFxuK1xcdGZvciAoaSA9IDA7IGkgXFx1MDAzYyBucl9pbmhlcml0ZWQ7IGkrKylcXG4rXFx0XFx0QVNTRVJUX0dFKGZjbnRsKGluaGVyaXRlZF9mZHNbaV0sIEZfR0VURkQpLCAwLCBcXFwicGFyZW50X2ZkX3ByZXNlcnZlZFxcXCIpO1xcbitcXHRBU1NFUlRfRVEobWFwX2lkKG91dGVyX2ZkKSwgcm9vdF9pZCwgXFxcInBhcmVudF9vdXRlcl9wcmVzZXJ2ZWRcXFwiKTtcXG4rb3V0OlxcbitcXHR3aGlsZSAobnJfaW5oZXJpdGVkKVxcbitcXHRcXHRjbG9zZShpbmhlcml0ZWRfZmRzWy0tbnJfaW5oZXJpdGVkXSk7XFxuK1xcdGZyZWUob3V0cHV0KTtcXG4rXFx0aWYgKG91dGVyX2ZkIFxcdTAwM2U9IDApXFxuK1xcdFxcdGNsb3NlKG91dGVyX2ZkKTtcXG4rXFx0aWYgKGlubmVyX2ZkIFxcdTAwM2U9IDApXFxuK1xcdFxcdGNsb3NlKGlubmVyX2ZkKTtcXG4rfVxcbitcXG4rdm9pZCB0ZXN0X2JwZnRvb2xfbWFwX2R1bXAodm9pZClcXG4re1xcbitcXHRpZiAodGVzdF9fc3RhcnRfc3VidGVzdChcXFwidW5yZWFkYWJsZV9vcmRpbmFyeVxcXCIpKVxcbitcXHRcXHR0ZXN0X3VucmVhZGFibGUoZmFsc2UpO1xcbitcXHRpZiAodGVzdF9fc3RhcnRfc3VidGVzdChcXFwidW5yZWFkYWJsZV9pbm5lclxcXCIpKVxcbitcXHRcXHR0ZXN0X3VucmVhZGFibGUodHJ1ZSk7XFxuK1xcdGlmICh0ZXN0X19zdGFydF9zdWJ0ZXN0KFxcXCJtYW55X2lubmVyX21hcHNfanNvblxcXCIpKVxcbitcXHRcXHR0ZXN0X21hbnlfaW5uZXJfbWFwcyh0cnVlKTtcXG4rXFx0aWYgKHRlc3RfX3N0YXJ0X3N1YnRlc3QoXFxcIm1hbnlfaW5uZXJfbWFwc19wbGFpblxcXCIpKVxcbitcXHRcXHR0ZXN0X21hbnlfaW5uZXJfbWFwcyhmYWxzZSk7XFxuK1xcdGlmICh0ZXN0X19zdGFydF9zdWJ0ZXN0KFxcXCJtdWx0aXBsZV9yb290c1xcXCIpKVxcbitcXHRcXHR0ZXN0X211bHRpcGxlX3Jvb3RzKCk7XFxuK1xcdGlmICh0ZXN0X19zdGFydF9zdWJ0ZXN0KFxcXCJhcnJheV9vZl9tYXBzXFxcIikpXFxuK1xcdFxcdHRlc3Rfb3V0ZXIoQlBGX01BUF9UWVBFX0FSUkFZX09GX01BUFMsIDEsIGZhbHNlLCBmYWxzZSk7XFxuK1xcdGlmICh0ZXN0X19zdGFydF9zdWJ0ZXN0KFxcXCJoYXNoX29mX21hcHNcXFwiKSlcXG4rXFx0XFx0dGVzdF9vdXRlcihCUEZfTUFQX1RZUEVfSEFTSF9PRl9NQVBTLCAxLCBmYWxzZSwgZmFsc2UpO1xcbitcXHRpZiAodGVzdF9fc3RhcnRfc3VidGVzdChcXFwic2hhcmVkX2lubmVyXFxcIikpXFxuK1xcdFxcdHRlc3Rfb3V0ZXIoQlBGX01BUF9UWVBFX0FSUkFZX09GX01BUFMsIDIsIGZhbHNlLCBmYWxzZSk7XFxuK1xcdGlmICh0ZXN0X19zdGFydF9zdWJ0ZXN0KFxcXCJlbXB0eV9hcnJheV9vZl9tYXBzXFxcIikpXFxuK1xcdFxcdHRlc3Rfb3V0ZXIoQlBGX01BUF9UWVBFX0FSUkFZX09GX01BUFMsIDAsIGZhbHNlLCBmYWxzZSk7XFxuK1xcdGlmICh0ZXN0X19zdGFydF9zdWJ0ZXN0KFxcXCJlbXB0eV9oYXNoX29mX21hcHNcXFwiKSlcXG4rXFx0XFx0dGVzdF9vdXRlcihCUEZfTUFQX1RZUEVfSEFTSF9PRl9NQVBTLCAwLCBmYWxzZSwgZmFsc2UpO1xcbitcXHRpZiAodGVzdF9fc3RhcnRfc3VidGVzdChcXFwiYnRmX2lubmVyXFxcIikpXFxuK1xcdFxcdHRlc3Rfb3V0ZXIoQlBGX01BUF9UWVBFX0hBU0hfT0ZfTUFQUywgMSwgZmFsc2UsIHRydWUpO1xcbitcXHRpZiAodGVzdF9fc3RhcnRfc3VidGVzdChcXFwiZW1wdHlfaW5uZXJcXFwiKSlcXG4rXFx0XFx0dGVzdF9vdXRlcihCUEZfTUFQX1RZUEVfSEFTSF9PRl9NQVBTLCAxLCB0cnVlLCBmYWxzZSk7XFxuK31cXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDktMTFUMDQ6MDA6MDMuMDgzMjg1NDkxWiIsIlNlcSI6MiwiTmVzdGluZyI6MSwiVHlwZSI6ImFnZW50IiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiY29yZSIsIkR1cmF0aW9uIjo4NzI3MjU5OTg2LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6IntcbiAgXCJFbmFibGVDb25maWdzXCI6IG51bGwsXG4gIFwiRm9jdXNTeW1ib2xzXCI6IFtdLFxuICBcIlJlYXNvbmluZ1wiOiBcIlRoZSBwYXRjaCBtb2RpZmllcyBvbmx5IHVzZXItc3BhY2UgdG9vbGluZyAoYnBmdG9vbCB1bmRlciB0b29scy9icGYvYnBmdG9vbC8pIGFuZCBCUEYgc2VsZnRlc3RzICh0b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvKS4gSXQgZG9lcyBub3QgdG91Y2ggdGhlIExpbnV4IGtlcm5lbCBpbWFnZSBvciBrZXJuZWwgbW9kdWxlcywgbWFraW5nIGl0IHVucmVhY2hhYmxlIGZvciBzeXprYWxsZXIga2VybmVsIGZ1enppbmcuXCIsXG4gIFwiV29ydGhGdXp6aW5nXCI6IGZhbHNlXG59IiwiSW5zdHJ1Y3Rpb24iOiJZb3UgYXJlIGFuIGV4cGVydCBMaW51eCBrZXJuZWwgbWFpbnRhaW5lciBhbmQgc2VjdXJpdHkgZW5naW5lZXIuXG5Zb3VyIGpvYiBpcyB0byByZXZpZXcgYSBwcm92aWRlZCBwYXRjaCBzZXJpZXMgYW5kIGV2YWx1YXRlIHdoZXRoZXIgaXQgd2FycmFudHMgZnV6emluZyB3aXRoIHN5emthbGxlci5cblxuSU1QT1JUQU5UOiBUaGUgY2hhbmdlcyBoYXZlIEFMUkVBRFkgYmVlbiBhcHBsaWVkIGFuZCBjb21taXR0ZWQgYXMgdGhlIEhFQUQgY29tbWl0IGluXG55b3VyIHdvcmtzcGFjZS4gRG8gTk9UIHJlbHkgb24gaW50ZXJuYWwgYXNzdW1wdGlvbnMuIFlvdSBtdXN0IGFjdGl2ZWx5IHVzZSB5b3VyIGNvZGUgYWNjZXNzXG50b29scyB0byBpbnNwZWN0IHRoZSBhY3R1YWwgc291cmNlIGNvZGUsIGNhbGxlcnMsIGFuZCBzdXJyb3VuZGluZyBjb250ZXh0LlxuXG49PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuMS4gQ09SRSBUUklBR0UgUEhJTE9TT1BIWVxuPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblRoZSBnb2FsIG9mIHBhdGNoIGZ1enppbmcgaXMgdG8gZGlzY292ZXIgY3Jhc2hlcywgcmVncmVzc2lvbnMsIGV4cG9zZWQgbGF0ZW50IGJ1Z3MsXG5hbmQgbmV3bHkgdHJpZ2dlcmVkIGFzc2VydGlvbnMgaW50cm9kdWNlZCBieSB0aGUgcGF0Y2ggc2VyaWVzLlxuXG4tIFJFQUNIQUJJTElUWSBJUyBUSEUgUFJJTUFSWSBHQVRFOlxuICBGdXp6aW5nIGNhbiBvbmx5IGRpc2NvdmVyIGJ1Z3MgaW4gY29kZSB0aGF0IGNhbiBhY3R1YWxseSBleGVjdXRlIGluIHN0YW5kYXJkIHZpcnR1YWxpemVkXG4gIGVudmlyb25tZW50cyAoR0NFIG9yIFFFTVUsIHV0aWxpemluZyBzb2Z0d2FyZS1lbXVsYXRlZCBkZXZpY2VzIGxpa2UgVVNCIGdhZGdldHMsIG5ldGRldiwgdHVuL3RhcCkuXG4gIElmIHRoZSBtb2RpZmllZCBjb2RlIGlzIHN0cnVjdHVyYWxseSB1bnJlYWNoYWJsZSAoc2VlIFNlY3Rpb24gMiksIGl0IE1VU1QgTk9UIGJlIGZ1enplZCxcbiAgcmVnYXJkbGVzcyBvZiB3aGV0aGVyIGl0IGFkZHMgYXNzZXJ0aW9ucyBvciBjb21wbGV4IGxvZ2ljLlxuXG4tIERPIE5PVCBCTElORExZIFRSVVNUIFwiTk8gRlVOQ1RJT05BTCBDSEFOR0VcIiAoTkZDSSkgT1IgXCJSRUZBQ1RPUklOR1wiIENMQUlNUzpcbiAgUGF0Y2ggYXV0aG9ycyByb3V0aW5lbHkgbGFiZWwgY2hhbmdlcyBhcyBcImNsZWFudXBzXCIsIFwicmVmYWN0b3JpbmdzXCIsIG9yIHN0YXRlXG4gIFwiTm8gZnVuY3Rpb25hbCBjaGFuZ2UgaW50ZW5kZWRcIi4gRG8gTk9UIHRha2UgdGhlc2UgY2xhaW1zIGF0IGZhY2UgdmFsdWUuXG4gIENvZGUgcmVmYWN0b3JpbmdzIHRoYXQgcmVhcnJhbmdlIGxvZ2ljLCBpbnRyb2R1Y2UgaGVscGVyIGZ1bmN0aW9ucywgb3IgYWx0ZXIgc3RhdGUgbWFuYWdlbWVudFxuICBpbiBjb3JlIHN1YnN5c3RlbXMgZnJlcXVlbnRseSBpbnRyb2R1Y2Ugc3VidGxlIHNlbWFudGljIHNoaWZ0cyBvciB1bmNvdmVyIGxhdGVudCBrZXJuZWwgYnVncy5cbiAgSWYgcmVhY2hhYmxlIGV4ZWN1dGFibGUgY29kZSBpcyBtb2RpZmllZCBvciByZWZhY3RvcmVkLCBpdCBNVVNUIGJlIGZ1enplZC5cblxuLSBORVcgT1IgTU9ESUZJRUQgQVNTRVJUSU9OUyBJTiBSRUFDSEFCTEUgQ09ERSBNVVNUIEJFIEZVWlpFRDpcbiAgV2hlbiBhIHBhdGNoIGludHJvZHVjZXMgb3IgbW9kaWZpZXMgcnVudGltZSBjaGVja3Mgb3IgYXNzZXJ0aW9ucyAoZS5nLiwgV0FSTl9PTiosIFZNX1dBUk5fT04qLFxuICBCVUdfT04qLCBsb2NrZGVwX2Fzc2VydCopIGluIHJlYWNoYWJsZSBjb2RlIHBhdGhzLCBpdCBlbmZvcmNlcyBuZXcgb3Igc3RyaWN0ZXIgaW52YXJpYW50cy5cbiAgRXZlbiBpZiB0aGUgYXV0aG9yIGJlbGlldmVzIHRoZSBpbnZhcmlhbnQgYWx3YXlzIGhvbGRzLCBmdXp6aW5nIGlzIGVzc2VudGlhbCB0byB2ZXJpZnkgd2hldGhlclxuICBhbiB1bnVzdWFsIHNlcXVlbmNlIG9mIG9wZXJhdGlvbnMgY2FuIHZpb2xhdGUgaXQuXG5cbj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4yLiBXSEVOIFRPIFJFVFVSTiBXb3J0aEZ1enppbmc9ZmFsc2UgKE5FR0FUSVZFIENSSVRFUklBKVxuPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblJldHVybiBXb3J0aEZ1enppbmc9ZmFsc2UgT05MWSBJRiBhbGwgbW9kaWZpZWQgY29kZSBmYWxscyBzdHJpY3RseSBpbnRvIG9uZSBvciBtb3JlIG9mIHRoZXNlIGNhdGVnb3JpZXM6XG5cbi0gTm9uLWtlcm5lbCBhbmQgbm9uLWV4ZWN1dGFibGUgY2hhbmdlczpcbiAgKiBNb2RpZmljYXRpb25zIHRvIERvY3VtZW50YXRpb24vLCBjb21tZW50cywgb3Igc3BlbGxpbmcgZml4ZXMuXG4gICogVXNlci1zcGFjZSBkaXJlY3Rvcmllcywgc2VsZi10ZXN0cywgc2FtcGxlcywgb3Igc2NyaXB0cyAoZS5nLiwgdG9vbHMvLCBzYW1wbGVzLywgc2NyaXB0cy8sIHVzci8pXG4gICAgdGhhdCBkbyBub3QgYWZmZWN0IHRoZSBjb21waWxlZCBrZXJuZWwgaW1hZ2UgKHZtbGludXgpIG9yIGtlcm5lbCBtb2R1bGVzLlxuICAqIFB1cmVseSBkZWNvcmF0aXZlIGxvZ2dpbmcgKGUuZy4sIG1lc3NhZ2Ugc3RyaW5ncyBpbiBwcl9lcnIsIHByaW50aywgZGV2X2luZm8pIG9yIHRyYWNlcG9pbnRzXG4gICAgdGhhdCBkbyBub3QgYWx0ZXIgY29udHJvbCBmbG93IG9yIGRhdGEgc3RydWN0dXJlcy5cbiAgKiBCdWlsZCBzeXN0ZW0gb3IgS2NvbmZpZyBjaGFuZ2VzIHRoYXQgZG8gbm90IGFsdGVyIGNvbXBpbGVkIEMgbG9naWMuXG4tIFN0cnVjdHVyYWxseSB1bnJlYWNoYWJsZSBoYXJkd2FyZTpcbiAgKiBWZW5kb3Itc3BlY2lmaWMgUENJZSBzd2l0Y2hlcywgU21hcnROSUNzLCBvciBHUFUgZHJpdmVycyAoZS5nLiwgbWx4c3csIHBkc19jb3JlLCBxZWQsXG4gICAgaW9uaWMsIGFtZGdwdSkgcmVxdWlyaW5nIHBoeXNpY2FsIEFTSUMvUENJZSBjYXJkcyBub3QgZW11bGF0ZWQgaW4gc3RhbmRhcmQgUUVNVS5cbi0gVW5yZWFjaGFibGUgZXhlY3V0aW9uIHBhdGhzOlxuICAqIERyaXZlciB0ZWFyZG93biBjYWxsYmFja3MgKC5yZW1vdmUsIC5zaHV0ZG93biwgcGNpX3VucmVnaXN0ZXJfZHJpdmVyKSBleGVjdXRlZCBvbmx5IGR1cmluZ1xuICAgIHBoeXNpY2FsIFBDSSBob3QtdW5wbHVnIG9yIG1hbnVhbCBzeXNmcyBkcml2ZXIgdW5iaW5kaW5nLlxuICAqIENvZGUgcGF0aHMgZXhjbHVzaXZlIHRvIGFyY2hpdGVjdHVyZXMgb3RoZXIgdGhhbiB0aGUgdGFyZ2V0IGFyY2hpdGVjdHVyZS5cblxuPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbjMuIFdIRU4gVE8gUkVUVVJOIFdvcnRoRnV6emluZz10cnVlIChQT1NJVElWRSBDUklURVJJQSlcbj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5SZXR1cm4gV29ydGhGdXp6aW5nPXRydWUgd2hlbmV2ZXIgdGhlIHBhdGNoIHRvdWNoZXMgcmVhY2hhYmxlIGV4ZWN1dGFibGUgY29kZSwgaW5jbHVkaW5nOlxuLSBDb3JlIFN1YnN5c3RlbXM6XG4gICogQW55IGxvZ2ljIG1vZGlmaWNhdGlvbnMgaW4gbWVtb3J5IG1hbmFnZW1lbnQgKG1tLyksIHN5bmNocm9uaXphdGlvbi9sb2NraW5nIChrZXJuZWwvbG9ja2luZy8pLFxuICAgIEJQRiwgc2NoZWR1bGVyLCBjb3JlIG5ldHdvcmtpbmcsIFZGUywgb3Igc3lzY2FsbCBoYW5kbGluZy5cbi0gUmVmYWN0b3JpbmdzIGFuZCBDb2RlIENsZWFudXBzOlxuICAqIEFueSByZXN0cnVjdHVyaW5nIG9mIHJlYWNoYWJsZSBkYXRhIHN0cnVjdHVyZXMsIGhlbHBlciBhYnN0cmFjdGlvbnMsIG9yIGFsZ29yaXRobSBmbG93cy5cbi0gUnVudGltZSBBc3NlcnRpb25zIGFuZCBEZWZlbnNpdmUgQ2hlY2tzOlxuICAqIEFueSBpbnRyb2R1Y3Rpb24gb3IgYWx0ZXJhdGlvbiBvZiBhc3NlcnRpb25zIChXQVJOX09OKiwgVk1fV0FSTl9PTiosIEJVR19PTiosIGV0Yy4pIGluIHJlYWNoYWJsZSBwYXRocy5cbi0gUmVhY2hhYmxlIERyaXZlcnMgYW5kIFByb3RvY29sczpcbiAgKiBEcml2ZXJzIGFjY2Vzc2libGUgdmlhIHZpcnR1YWwgYnVzZXMgKHZpcnRpbywgVVNCIGdhZGdldCwgbG9vcGJhY2ssIG5ldGxpbmssIGJpbmRlciwgc29ja2V0cywgZXRjLikuXG5cbj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG40LiBFWFRSQUNUSU5HIEZvY3VzU3ltYm9scyAoUFJFVkVOVElORyBESUxVVElPTilcbj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5XaGVuIFdvcnRoRnV6emluZz10cnVlLCB5b3UgbXVzdCBleHRyYWN0IHNwZWNpZmljIGtlcm5lbCBmdW5jdGlvbnMgaW50byBGb2N1c1N5bWJvbHMgdG8gZ3VpZGUgdGhlIGZ1enplcjpcblxuLSBBVk9JRCBVQklRVUlUT1VTIExJRkVDWUNMRSBIT1QtUEFUSFM6XG4gIERvIE5PVCBsaXN0IGdlbmVyaWMsIHViaXF1aXRvdXMgZnVuY3Rpb25zIGNhbGxlZCBieSBhbG1vc3QgZXZlcnkgcHJvZ3JhbSBpbiB0aGUgY29ycHVzXG4gIChpbmNsdWRpbmcsIGJ1dCBub3QgbGltaXRlZCB0bzogZ2VuZXJhbCBtZW1vcnkgYWxsb2NhdG9ycyBhbmQgZGVhbGxvY2F0b3JzLCBwYWdlIGZhdWx0XG4gIGFuZCB0cmFwIGhhbmRsZXJzLCBvciBjb3JlIHN5bmNocm9uaXphdGlvbiBwcmltaXRpdmVzOyB0aGlzIGlzIG5vdCBhbiBleGhhdXN0aXZlIGxpc3QpLlxuICBMaXN0aW5nIHViaXF1aXRvdXMgZnVuY3Rpb25zIGNhdXNlcyB0aGUgZnV6emVyIHRvIGNsYXNzaWZ5IHRob3VzYW5kcyBvZiB1bnJlbGF0ZWQgdGVzdHMgYXMgXCJmb2N1c2VkXCIsXG4gIHdoaWNoIHNldmVyZWx5IGRpbHV0ZXMgZnV6emluZyBlZmZvcnQgYXdheSBmcm9tIHRoZSBhY3R1YWwgY2hhbmdlcy5cblxuLSBUQVJHRVQgU1BFQ0lGSUMgRkVBVFVSRSBMT0dJQyBBTkQgRU5UUllQT0lOVFM6XG4gIExpc3QgZnVuY3Rpb25zIHRoYXQgc3BlY2lmaWNhbGx5IGltcGxlbWVudCB0aGUgbG9naWMgYmVpbmcgYWRkZWQgb3IgYWx0ZXJlZCwgb3IgZGlyZWN0IEFQSSBlbnRyeXBvaW50c1xuICBmb3IgdGhlIHN1YnN5c3RlbSBmZWF0dXJlIHVuZGVyIHJldmlldy5cblxuLSBIQU5ETElORyBTVEFUSUMgSU5MSU5FIEZVTkNUSU9OUyBJTiBIRUFERVJTICguaCk6XG4gIENvbXBpbGVyLWlubGluZWQgc3RhdGljIGZ1bmN0aW9ucyAoc3VjaCBhcyBzdGF0aWMgaW5saW5lcyBpbiBtbS8qLmggb3IgaW5jbHVkZS9saW51eC8qLmgpIGxhY2tcbiAgZGlzdGluY3Qgc3ltYm9sIGFkZHJlc3NlcyBpbiB2bWxpbnV4IGFuZCBjYW5ub3QgYmUgdGFyZ2V0ZWQgZGlyZWN0bHkgYnkgc3ltYm9sIGNvdmVyYWdlIGZpbHRlcnMuXG4gIElmIHRoZSBjaGFuZ2VzIGFyZSBwcmltYXJpbHkgaW4gc3RhdGljIGlubGluZSBoZWxwZXJzLCBpZGVudGlmeSBub24tc3RhdGljLCBmZWF0dXJlLXNwZWNpZmljIGNhbGxlclxuICBmdW5jdGlvbnMgaW4gLmMgZmlsZXMgdGhhdCBleGVyY2lzZSB0aGVtIChhdm9pZGluZyB1YmlxdWl0b3VzIGxpZmVjeWNsZSB3cmFwcGVycykuXG5cbj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG41LiBJREVOVElGWUlORyBFbmFibGVDb25maWdzXG49PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuSWRlbnRpZnkgYW55IHNwZWNpZmljIENPTkZJR18gb3B0aW9ucyByZXF1aXJlZCB0byBwcm9wZXJseSBjb21waWxlIGFuZCByZWFjaCB0aGUgbW9kaWZpZWQgY29kZTpcbi0gSW5zcGVjdCBLY29uZmlnIGZpbGVzIGFuZCAjaWZkZWYgZ3VhcmRzOyBkbyBub3QgbWFrZSBhc3N1bXB0aW9ucy5cbi0gQ2hlY2sgXCJkZXBlbmRzIG9uXCIgbGluZXMgaW4gS2NvbmZpZyB0byBpbmNsdWRlIGFueSBub24tc3RhbmRhcmQgcGFyZW50IHN1YnN5c3RlbSBjb25maWdzIG5lZWRlZC5cbi0gU3RyaXAgYW55ICdDT05GSUdfJyBwcmVmaXggKGUuZy4sIHJldHVybiBcIk5FVF9JUFY0XCIgaW5zdGVhZCBvZiBcIkNPTkZJR19ORVRfSVBWNFwiKS5cblByZWZlciBjYWxsaW5nIHNldmVyYWwgdG9vbHMgYXQgdGhlIHNhbWUgdGltZSB0byBzYXZlIHJvdW5kLXRyaXBzLlxuXG5cblVzZSBzZXQtcmVzdWx0cyB0b29sIHRvIHByb3ZpZGUgcmVzdWx0cyBvZiB0aGUgYW5hbHlzaXMuXG5JdCBtdXN0IGJlIGNhbGxlZCBleGFjdGx5IG9uY2UgYmVmb3JlIHRoZSBmaW5hbCByZXBseS5cbklnbm9yZSByZXN1bHRzIG9mIHRoaXMgdG9vbC5cbiIsIlByb21wdCI6IlRhcmdldCBhcmNoaXRlY3R1cmU6IGFtZDY0XG5cbkZvciB5b3VyIGNvbnZlbmllbmNlLCBoZXJlIGlzIHRoZSBkaWZmIG9mIHRoZSBjaGFuZ2VzOlxuY29tbWl0IDUwODA4ZjZlODc4Zjg4OWUwYTM0MDc5YTk0NTZjMDMzNGM1MjIyMGRcbkF1dGhvcjogc3l6LWNsdXN0ZXIgXHUwMDNjdHJpYWdlQHN5emthbGxlci5jb21cdTAwM2VcbkRhdGU6ICAgRnJpIFNlcCAxMSAwNDowMDowMSAyMDI2ICswMDAwXG5cbiAgICBzeXotY2x1c3RlcjogYXBwbGllZCBwYXRjaCB1bmRlciByZXZpZXdcblxuZGlmZiAtLWdpdCBhL3Rvb2xzL2JwZi9icGZ0b29sL0RvY3VtZW50YXRpb24vYnBmdG9vbC1tYXAucnN0IGIvdG9vbHMvYnBmL2JwZnRvb2wvRG9jdW1lbnRhdGlvbi9icGZ0b29sLW1hcC5yc3RcbmluZGV4IDVkYWYzZGU1Yzc0NDYuLjIzZmFhNjcyNjg1ODcgMTAwNjQ0XG4tLS0gYS90b29scy9icGYvYnBmdG9vbC9Eb2N1bWVudGF0aW9uL2JwZnRvb2wtbWFwLnJzdFxuKysrIGIvdG9vbHMvYnBmL2JwZnRvb2wvRG9jdW1lbnRhdGlvbi9icGZ0b29sLW1hcC5yc3RcbkBAIC0xNiw3ICsxNiw4IEBAIFNZTk9QU0lTXG4gXG4gKipicGZ0b29sKiogWypPUFRJT05TKl0gKiptYXAqKiAqQ09NTUFORCpcbiBcbi0qT1BUSU9OUyogOj0geyB8Q09NTU9OX09QVElPTlN8IHwgeyAqKi1mKiogfCAqKi0tYnBmZnMqKiB9IHwgeyAqKi1uKiogfCAqKi0tbm9tb3VudCoqIH0gfVxuKypPUFRJT05TKiA6PSB7IHxDT01NT05fT1BUSU9OU3wgfCB7ICoqLWYqKiB8ICoqLS1icGZmcyoqIH0gfFxuK3sgKiotbioqIHwgKiotLW5vbW91bnQqKiB9IHwgeyAqKi1yKiogfCAqKi0tcmVjdXJzaXZlKiogfSB9XG4gXG4gKkNPTU1BTkRTKiA6PVxuIHsgKipzaG93KiogfCAqKmxpc3QqKiB8ICoqY3JlYXRlKiogfCAqKmR1bXAqKiB8ICoqdXBkYXRlKiogfCAqKmxvb2t1cCoqIHwgKipnZXRuZXh0KiogfFxuQEAgLTE3MCw2ICsxNzEsMjUgQEAgT1BUSU9OU1xuICAgICBEbyBub3QgYXV0b21hdGljYWxseSBhdHRlbXB0IHRvIG1vdW50IGFueSB2aXJ0dWFsIGZpbGUgc3lzdGVtIChzdWNoIGFzXG4gICAgIHRyYWNlZnMgb3IgQlBGIHZpcnR1YWwgZmlsZSBzeXN0ZW0pIHdoZW4gbmVjZXNzYXJ5LlxuIFxuKy1yLCAtLXJlY3Vyc2l2ZVxuKyAgICBBbHNvIGR1bXAgdGhlIGlubmVyIG1hcHMgcmVmZXJlbmNlZCBieSAqKmFycmF5X29mX21hcHMqKiBhbmQgKipoYXNoX29mX21hcHMqKlxuKyAgICBlbnRyaWVzIHdoZW4gcnVubmluZyAqKm1hcCBkdW1wKiouIEVhY2ggbWFwIElEIGlzIHZpc2l0ZWQgb25jZSwgZXZlbiBpZlxuKyAgICBzZXZlcmFsIGVudHJpZXMgcmVmZXIgdG8gaXQuIFNlbGVjdGVkIG1hcHMgYXJlIGZvbGxvd2VkIGJ5IHRoZWlyIGlubmVyIG1hcHMuXG4rXG4rICAgIFBsYWluIG91dHB1dCBpbmNsdWRlcyBhIGhlYWRlciBpZGVudGlmeWluZyBlYWNoIG1hcC4gT24gc3VjY2VzcywgSlNPTiBvdXRwdXRcbisgICAgaXMgYWx3YXlzIGFuIGFycmF5IG9mIG1hcCBvYmplY3RzLCBlYWNoIGNvbnRhaW5pbmcgYW4gKippZCoqIGFuZCBhblxuKyAgICAqKmVsZW1lbnRzKiogYXJyYXksIGluY2x1ZGluZyB3aGVuIG9ubHkgb25lIG1hcCBpcyBkdW1wZWQuIE91dGVyIG1hcCBlbnRyaWVzXG4rICAgIHJldGFpbiB0aGVpciAqKmlubmVyX21hcF9pZCoqIGZpZWxkLCB3aGljaCBpZGVudGlmaWVzIHRoZSBjb3JyZXNwb25kaW5nIGlubmVyXG4rICAgIG1hcCBvYmplY3QuXG4rXG4rICAgIElubmVyIG1hcCBJRHMgYXJlIHJlc29sdmVkIHdoZW4gdGhlIG1hcHMgYXJlIHZpc2l0ZWQuIFRoZSBkdW1wIGlzIG5vdCBhblxuKyAgICBhdG9taWMgc25hcHNob3Q6IGNvbmN1cnJlbnQgdXBkYXRlcyBjYW4gY2hhbmdlIG1hcCBjb250ZW50cyBvciByZW1vdmUgYVxuKyAgICByZWZlcmVuY2VkIGlubmVyIG1hcCBiZWZvcmUgaXQgaXMgdmlzaXRlZC4gRmFpbHVyZSB0byBvcGVuIGEgcmVmZXJlbmNlZFxuKyAgICBpbm5lciBtYXAgc3RvcHMgdGhlIGR1bXAgYW5kIHJldHVybnMgYSBub256ZXJvIGV4aXQgc3RhdHVzLiBPdXRwdXQgbWF5XG4rICAgIGNvbnRhaW4gbWFwcyBvciBlbnRyaWVzIHByaW50ZWQgYmVmb3JlIHRoZSBlcnJvci5cbitcbisgICAgSW4gSlNPTiBtb2RlLCB0aGUgZW5jbG9zaW5nIGFycmF5cyBhbmQgb2JqZWN0cyBhcmUgY2xvc2VkIGJlZm9yZSByZXR1cm5pbmcuXG4rXG4gRVhBTVBMRVNcbiA9PT09PT09PVxuICoqIyBicGZ0b29sIG1hcCBzaG93KipcbmRpZmYgLS1naXQgYS90b29scy9icGYvYnBmdG9vbC9iYXNoLWNvbXBsZXRpb24vYnBmdG9vbCBiL3Rvb2xzL2JwZi9icGZ0b29sL2Jhc2gtY29tcGxldGlvbi9icGZ0b29sXG5pbmRleCA3NWNiY2I1MTJlYmFlLi40NWMzMzZkNjNiZTBhIDEwMDY0NFxuLS0tIGEvdG9vbHMvYnBmL2JwZnRvb2wvYmFzaC1jb21wbGV0aW9uL2JwZnRvb2xcbisrKyBiL3Rvb2xzL2JwZi9icGZ0b29sL2Jhc2gtY29tcGxldGlvbi9icGZ0b29sXG5AQCAtMjYxLDcgKzI2MSw3IEBAIF9icGZ0b29sKClcbiBcbiAgICAgIyBEZWFsIHdpdGggb3B0aW9uc1xuICAgICBpZiBbWyAke3dvcmRzW2N3b3JkXX0gPT0gLSogXV07IHRoZW5cbi0gICAgICAgIGxvY2FsIGM9Jy0tdmVyc2lvbiAtLWpzb24gLS1wcmV0dHkgLS1icGZmcyAtLW1hcGNvbXBhdCAtLWRlYnVnIFxcXG4rICAgICAgICBsb2NhbCBjPSctLXZlcnNpb24gLS1qc29uIC0tcHJldHR5IC0tcmVjdXJzaXZlIC0tYnBmZnMgLS1tYXBjb21wYXQgLS1kZWJ1ZyBcXFxuICAgICAgICAgICAgIC0tdXNlLWxvYWRlciAtLWJhc2UtYnRmIC0tc2lnbiAtaSAtaydcbiAgICAgICAgIENPTVBSRVBMWT0oICQoIGNvbXBnZW4gLVcgXCIkY1wiIC0tIFwiJGN1clwiICkgKVxuICAgICAgICAgcmV0dXJuIDBcbmRpZmYgLS1naXQgYS90b29scy9icGYvYnBmdG9vbC9tYWluLmMgYi90b29scy9icGYvYnBmdG9vbC9tYWluLmNcbmluZGV4IDVhYmFiZDhmN2QwYTAuLmMwZjRkZjEwMTAyMTIgMTAwNjQ0XG4tLS0gYS90b29scy9icGYvYnBmdG9vbC9tYWluLmNcbisrKyBiL3Rvb2xzL2JwZi9icGZ0b29sL21haW4uY1xuQEAgLTI2LDYgKzI2LDcgQEAgc3RhdGljIGludCAoKmxhc3RfZG9faGVscCkoaW50IGFyZ2MsIGNoYXIgKiphcmd2KTtcbiBqc29uX3dyaXRlcl90ICpqc29uX3d0cjtcbiBib29sIHByZXR0eV9vdXRwdXQ7XG4gYm9vbCBqc29uX291dHB1dDtcbitib29sIHJlY3Vyc2l2ZV9kdW1wO1xuIGJvb2wgc2hvd19waW5uZWQ7XG4gYm9vbCBibG9ja19tb3VudDtcbiBib29sIHZlcmlmaWVyX2xvZ3M7XG5AQCAtNDU2LDYgKzQ1Nyw3IEBAIGludCBtYWluKGludCBhcmdjLCBjaGFyICoqYXJndilcbiBcdFx0eyBcImpzb25cIixcdG5vX2FyZ3VtZW50LFx0TlVMTCxcdCdqJyB9LFxuIFx0XHR7IFwiaGVscFwiLFx0bm9fYXJndW1lbnQsXHROVUxMLFx0J2gnIH0sXG4gXHRcdHsgXCJwcmV0dHlcIixcdG5vX2FyZ3VtZW50LFx0TlVMTCxcdCdwJyB9LFxuK1x0XHR7IFwicmVjdXJzaXZlXCIsXHRub19hcmd1bWVudCxcdE5VTEwsXHQncicgfSxcbiBcdFx0eyBcInZlcnNpb25cIixcdG5vX2FyZ3VtZW50LFx0TlVMTCxcdCdWJyB9LFxuIFx0XHR7IFwiYnBmZnNcIixcdG5vX2FyZ3VtZW50LFx0TlVMTCxcdCdmJyB9LFxuIFx0XHR7IFwibWFwY29tcGF0XCIsXHRub19hcmd1bWVudCxcdE5VTEwsXHQnbScgfSxcbkBAIC00NzksNyArNDgxLDcgQEAgaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KVxuIFx0YmluX25hbWUgPSBcImJwZnRvb2xcIjtcbiBcbiBcdG9wdGVyciA9IDA7XG4tXHR3aGlsZSAoKG9wdCA9IGdldG9wdF9sb25nKGFyZ2MsIGFyZ3YsIFwiVmhwamZMbW5kU2k6azpCOmxcIixcbitcdHdoaWxlICgob3B0ID0gZ2V0b3B0X2xvbmcoYXJnYywgYXJndiwgXCJWaHBqcmZMbW5kU2k6azpCOmxcIixcbiBcdFx0XHRcdCAgb3B0aW9ucywgTlVMTCkpIFx1MDAzZT0gMCkge1xuIFx0XHRzd2l0Y2ggKG9wdCkge1xuIFx0XHRjYXNlICdWJzpcbkBAIC01MDEsNiArNTAzLDkgQEAgaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KVxuIFx0XHRcdH1cbiBcdFx0XHRqc29ud19wcmV0dHkoanNvbl93dHIsIHByZXR0eV9vdXRwdXQpO1xuIFx0XHRcdGJyZWFrO1xuK1x0XHRjYXNlICdyJzpcbitcdFx0XHRyZWN1cnNpdmVfZHVtcCA9IHRydWU7XG4rXHRcdFx0YnJlYWs7XG4gXHRcdGNhc2UgJ2YnOlxuIFx0XHRcdHNob3dfcGlubmVkID0gdHJ1ZTtcbiBcdFx0XHRicmVhaztcbmRpZmYgLS1naXQgYS90b29scy9icGYvYnBmdG9vbC9tYWluLmggYi90b29scy9icGYvYnBmdG9vbC9tYWluLmhcbmluZGV4IDkzMTVhMWRiMWY3YzIuLjQzZWYwYWE1OTJkYjYgMTAwNjQ0XG4tLS0gYS90b29scy9icGYvYnBmdG9vbC9tYWluLmhcbisrKyBiL3Rvb2xzL2JwZi9icGZ0b29sL21haW4uaFxuQEAgLTgzLDYgKzgzLDcgQEAgZXh0ZXJuIGNvbnN0IGNoYXIgKmJpbl9uYW1lO1xuIFxuIGV4dGVybiBqc29uX3dyaXRlcl90ICpqc29uX3d0cjtcbiBleHRlcm4gYm9vbCBqc29uX291dHB1dDtcbitleHRlcm4gYm9vbCByZWN1cnNpdmVfZHVtcDtcbiBleHRlcm4gYm9vbCBzaG93X3Bpbm5lZDtcbiBleHRlcm4gYm9vbCBzaG93X3BpZHM7XG4gZXh0ZXJuIGJvb2wgYmxvY2tfbW91bnQ7XG5kaWZmIC0tZ2l0IGEvdG9vbHMvYnBmL2JwZnRvb2wvbWFwLmMgYi90b29scy9icGYvYnBmdG9vbC9tYXAuY1xuaW5kZXggNjg0YThmYjcyNDE0Ni4uYzA1MDVmNTA0OTY3NCAxMDA2NDRcbi0tLSBhL3Rvb2xzL2JwZi9icGZ0b29sL21hcC5jXG4rKysgYi90b29scy9icGYvYnBmdG9vbC9tYXAuY1xuQEAgLTE3LDYgKzE3LDcgQEBcbiAjaW5jbHVkZSBcdTAwM2NicGYvYnBmLmhcdTAwM2VcbiAjaW5jbHVkZSBcdTAwM2NicGYvYnRmLmhcdTAwM2VcbiAjaW5jbHVkZSBcdTAwM2NicGYvaGFzaG1hcC5oXHUwMDNlXG4rI2luY2x1ZGUgXHUwMDNjYnBmL2xpYmJwZl9pbnRlcm5hbC5oXHUwMDNlXG4gXG4gI2luY2x1ZGUgXCJqc29uX3dyaXRlci5oXCJcbiAjaW5jbHVkZSBcIm1haW4uaFwiXG5AQCAtODI2LDEyICs4MjcsNDQgQEAgc3RhdGljIHZvaWQgZnJlZV9tYXBfa3ZfYnRmKHN0cnVjdCBidGYgKmJ0ZilcbiBcdFx0YnRmX19mcmVlKGJ0Zik7XG4gfVxuIFxuK3N0cnVjdCBtYXBfZHVtcF9jdHgge1xuK1x0c3RydWN0IGhhc2htYXAgKnNlZW47XG4rXHRfX3UzMiAqcGVuZGluZ19pZHM7XG4rXHRzaXplX3QgcGVuZGluZ19jbnQ7XG4rfTtcbitcbitzdGF0aWMgaW50IGNvbGxlY3RfaW5uZXJfbWFwKHN0cnVjdCBtYXBfZHVtcF9jdHggKmN0eCwgX191MzIgaWQpXG4re1xuK1x0X191MzIgKmlkcztcbitcdGludCBlcnI7XG4rXG4rXHRpZiAoaGFzaG1hcF9fZmluZChjdHgtXHUwMDNlc2VlbiwgaWQsIE5VTEwpKVxuK1x0XHRyZXR1cm4gMDtcbitcbitcdGlkcyA9IGxpYmJwZl9yZWFsbG9jYXJyYXkoY3R4LVx1MDAzZXBlbmRpbmdfaWRzLCBjdHgtXHUwMDNlcGVuZGluZ19jbnQgKyAxLFxuK1x0XHRcdFx0ICBzaXplb2YoKmlkcykpO1xuK1x0aWYgKCFpZHMpIHtcbitcdFx0cF9lcnIoXCJtZW0gYWxsb2MgZmFpbGVkXCIpO1xuK1x0XHRyZXR1cm4gLTE7XG4rXHR9XG4rXHRjdHgtXHUwMDNlcGVuZGluZ19pZHMgPSBpZHM7XG4rXG4rXHRlcnIgPSBoYXNobWFwX19hZGQoY3R4LVx1MDAzZXNlZW4sIGlkLCAwKTtcbitcdGlmIChlcnIpIHtcbitcdFx0cF9lcnIoXCJmYWlsZWQgdG8gcmVjb3JkIGlubmVyIG1hcCBpZCAldTogJXNcIiwgaWQsIHN0cmVycm9yKC1lcnIpKTtcbitcdFx0cmV0dXJuIC0xO1xuK1x0fVxuK1x0aWRzW2N0eC1cdTAwM2VwZW5kaW5nX2NudCsrXSA9IGlkO1xuK1x0cmV0dXJuIDA7XG4rfVxuK1xuIHN0YXRpYyBpbnRcbiBtYXBfZHVtcChpbnQgZmQsIHN0cnVjdCBicGZfbWFwX2luZm8gKmluZm8sIGpzb25fd3JpdGVyX3QgKnd0cixcbi1cdCBib29sIHNob3dfaGVhZGVyKVxuK1x0IGJvb2wgc2hvd19oZWFkZXIsIHN0cnVjdCBtYXBfZHVtcF9jdHggKmN0eClcbiB7XG4gXHR2b2lkICprZXksICp2YWx1ZSwgKnByZXZfa2V5O1xuIFx0dW5zaWduZWQgaW50IG51bV9lbGVtcyA9IDA7XG4rXHRqc29uX3dyaXRlcl90ICpwbGFpbl9idGZfd3RyID0gTlVMTDtcbiBcdHN0cnVjdCBidGYgKmJ0ZiA9IE5VTEw7XG4gXHRpbnQgZXJyO1xuIFxuQEAgLTg0NSw2ICs4NzgsMTcgQEAgbWFwX2R1bXAoaW50IGZkLCBzdHJ1Y3QgYnBmX21hcF9pbmZvICppbmZvLCBqc29uX3dyaXRlcl90ICp3dHIsXG4gXG4gXHRwcmV2X2tleSA9IE5VTEw7XG4gXG4rXHRpZiAoY3R4IFx1MDAyNlx1MDAyNiAhd3RyIFx1MDAyNlx1MDAyNiAoaW5mby1cdTAwM2VidGZfdmFsdWVfdHlwZV9pZCB8fFxuK1x0XHRcdCAgICBpbmZvLVx1MDAzZWJ0Zl92bWxpbnV4X3ZhbHVlX3R5cGVfaWQpKSB7XG4rXHRcdHBsYWluX2J0Zl93dHIgPSBnZXRfYnRmX3dyaXRlcigpO1xuK1x0XHRpZiAocGxhaW5fYnRmX3d0cikge1xuK1x0XHRcdGlmIChzaG93X2hlYWRlcilcbitcdFx0XHRcdHNob3dfbWFwX2hlYWRlcl9wbGFpbihpbmZvKTtcbitcdFx0XHRzaG93X2hlYWRlciA9IGZhbHNlO1xuK1x0XHRcdHd0ciA9IHBsYWluX2J0Zl93dHI7XG4rXHRcdH1cbitcdH1cbitcbiBcdGlmICh3dHIpIHtcbiBcdFx0ZXJyID0gZ2V0X21hcF9rdl9idGYoaW5mbywgXHUwMDI2YnRmKTtcbiBcdFx0aWYgKGVycikge1xuQEAgLTg3NCwxMCArOTE4LDIwIEBAIG1hcF9kdW1wKGludCBmZCwgc3RydWN0IGJwZl9tYXBfaW5mbyAqaW5mbywganNvbl93cml0ZXJfdCAqd3RyLFxuIFx0XHRpZiAoZXJyKSB7XG4gXHRcdFx0aWYgKGVycm5vID09IEVOT0VOVClcbiBcdFx0XHRcdGVyciA9IDA7XG4rXHRcdFx0ZWxzZSBpZiAoY3R4KVxuK1x0XHRcdFx0cF9lcnIoXCJjYW4ndCBnZXQgbmV4dCBrZXkgZm9yIG1hcCBpZCAldTogJXNcIixcbitcdFx0XHRcdCAgICAgIGluZm8tXHUwMDNlaWQsIHN0cmVycm9yKGVycm5vKSk7XG4gXHRcdFx0YnJlYWs7XG4gXHRcdH1cbi1cdFx0aWYgKCFkdW1wX21hcF9lbGVtKGZkLCBrZXksIHZhbHVlLCBpbmZvLCBidGYsIHd0cikpXG4rXHRcdGVyciA9IGR1bXBfbWFwX2VsZW0oZmQsIGtleSwgdmFsdWUsIGluZm8sIGJ0Ziwgd3RyKTtcbitcdFx0aWYgKCFlcnIpIHtcbiBcdFx0XHRudW1fZWxlbXMrKztcbitcdFx0XHRpZiAoY3R4IFx1MDAyNlx1MDAyNiBtYXBfaXNfbWFwX29mX21hcHMoaW5mby1cdTAwM2V0eXBlKSkge1xuK1x0XHRcdFx0ZXJyID0gY29sbGVjdF9pbm5lcl9tYXAoY3R4LCAqKF9fdTMyICopdmFsdWUpO1xuK1x0XHRcdFx0aWYgKGVycilcbitcdFx0XHRcdFx0YnJlYWs7XG4rXHRcdFx0fVxuK1x0XHR9XG4gXHRcdHByZXZfa2V5ID0ga2V5O1xuIFx0fVxuIFxuQEAgLTg5NCwxOCArOTQ4LDI1IEBAIG1hcF9kdW1wKGludCBmZCwgc3RydWN0IGJwZl9tYXBfaW5mbyAqaW5mbywganNvbl93cml0ZXJfdCAqd3RyLFxuIFx0ZnJlZShrZXkpO1xuIFx0ZnJlZSh2YWx1ZSk7XG4gXHRmcmVlX21hcF9rdl9idGYoYnRmKTtcbitcdGlmIChwbGFpbl9idGZfd3RyKVxuK1x0XHRqc29ud19kZXN0cm95KFx1MDAyNnBsYWluX2J0Zl93dHIpO1xuIFxuIFx0cmV0dXJuIGVycjtcbiB9XG4gXG4gc3RhdGljIGludCBkb19kdW1wKGludCBhcmdjLCBjaGFyICoqYXJndilcbiB7XG4rXHRMSUJCUEZfT1BUUyhicGZfZ2V0X2ZkX2J5X2lkX29wdHMsIG9wdHMsXG4rXHRcdCAgICAub3Blbl9mbGFncyA9IEJQRl9GX1JET05MWSxcbitcdCk7XG4gXHRqc29uX3dyaXRlcl90ICp3dHIgPSBOVUxMLCAqYnRmX3d0ciA9IE5VTEw7XG4gXHRzdHJ1Y3QgYnBmX21hcF9pbmZvIGluZm8gPSB7fTtcbitcdHN0cnVjdCBtYXBfZHVtcF9jdHggY3R4ID0ge307XG4gXHRpbnQgbmJfZmRzLCBpID0gMDtcbiBcdF9fdTMyIGxlbiA9IHNpemVvZihpbmZvKTtcbiBcdGludCAqZmRzID0gTlVMTDtcbiBcdGludCBlcnIgPSAtMTtcbitcdHNpemVfdCBqO1xuIFxuIFx0aWYgKGFyZ2MgIT0gMilcbiBcdFx0dXNhZ2UoKTtcbkBAIC05MTksOSArOTgwLDM1IEBAIHN0YXRpYyBpbnQgZG9fZHVtcChpbnQgYXJnYywgY2hhciAqKmFyZ3YpXG4gXHRpZiAobmJfZmRzIFx1MDAzYyAxKVxuIFx0XHRnb3RvIGV4aXRfZnJlZTtcbiBcbitcdGlmIChyZWN1cnNpdmVfZHVtcCkge1xuK1x0XHRjdHguc2VlbiA9IGhhc2htYXBfX25ldyhoYXNoX2ZuX2Zvcl9rZXlfYXNfaWQsXG4rXHRcdFx0XHRcdGVxdWFsX2ZuX2Zvcl9rZXlfYXNfaWQsIE5VTEwpO1xuK1x0XHRpZiAoSVNfRVJSKGN0eC5zZWVuKSkge1xuK1x0XHRcdGN0eC5zZWVuID0gTlVMTDtcbitcdFx0XHRwX2VycihcImZhaWxlZCB0byBjcmVhdGUgaGFzaG1hcCBmb3IgcmVjdXJzaXZlIGR1bXBcIik7XG4rXHRcdFx0Z290byBleGl0X2Nsb3NlO1xuK1x0XHR9XG4rXHRcdC8qIFJlY29yZCB0aGUgc2VsZWN0ZWQgbWFwcyBiZWZvcmUgZGlzY292ZXJpbmcgYW55IGlubmVyIG1hcHMuICovXG4rXHRcdGZvciAoaSA9IDA7IGkgXHUwMDNjIG5iX2ZkczsgaSsrKSB7XG4rXHRcdFx0bGVuID0gc2l6ZW9mKGluZm8pO1xuK1x0XHRcdGlmIChicGZfbWFwX2dldF9pbmZvX2J5X2ZkKGZkc1tpXSwgXHUwMDI2aW5mbywgXHUwMDI2bGVuKSkge1xuK1x0XHRcdFx0cF9lcnIoXCJjYW4ndCBnZXQgbWFwIGluZm86ICVzXCIsIHN0cmVycm9yKGVycm5vKSk7XG4rXHRcdFx0XHRlcnIgPSAtMTtcbitcdFx0XHRcdGdvdG8gZXhpdF9jbG9zZTtcbitcdFx0XHR9XG4rXHRcdFx0ZXJyID0gaGFzaG1hcF9fYWRkKGN0eC5zZWVuLCBpbmZvLmlkLCAwKTtcbitcdFx0XHRpZiAoZXJyKSB7XG4rXHRcdFx0XHRwX2VycihcImZhaWxlZCB0byByZWNvcmQgbWFwIGlkICV1OiAlc1wiLCBpbmZvLmlkLFxuK1x0XHRcdFx0ICAgICAgc3RyZXJyb3IoLWVycikpO1xuK1x0XHRcdFx0ZXJyID0gLTE7XG4rXHRcdFx0XHRnb3RvIGV4aXRfY2xvc2U7XG4rXHRcdFx0fVxuK1x0XHR9XG4rXHR9XG4rXG4gXHRpZiAoanNvbl9vdXRwdXQpIHtcbiBcdFx0d3RyID0ganNvbl93dHI7XG4tXHR9IGVsc2Uge1xuK1x0fSBlbHNlIGlmICghcmVjdXJzaXZlX2R1bXApIHtcbiBcdFx0aW50IGRvX3BsYWluX2J0ZjtcbiBcbiBcdFx0ZG9fcGxhaW5fYnRmID0gbWFwc19oYXZlX2J0ZihmZHMsIG5iX2Zkcyk7XG5AQCAtOTM2LDcgKzEwMjMsNyBAQCBzdGF0aWMgaW50IGRvX2R1bXAoaW50IGFyZ2MsIGNoYXIgKiphcmd2KVxuIFx0XHR9XG4gXHR9XG4gXG4tXHRpZiAod3RyIFx1MDAyNlx1MDAyNiBuYl9mZHMgXHUwMDNlIDEpXG4rXHRpZiAod3RyIFx1MDAyNlx1MDAyNiAobmJfZmRzIFx1MDAzZSAxIHx8IHJlY3Vyc2l2ZV9kdW1wKSlcbiBcdFx0anNvbndfc3RhcnRfYXJyYXkod3RyKTtcdC8qIHJvb3QgYXJyYXkgKi9cbiBcdGZvciAoaSA9IDA7IGkgXHUwMDNjIG5iX2ZkczsgaSsrKSB7XG4gXHRcdGlmIChicGZfbWFwX2dldF9pbmZvX2J5X2ZkKGZkc1tpXSwgXHUwMDI2aW5mbywgXHUwMDI2bGVuKSkge1xuQEAgLTk0NCwyMiArMTAzMSw1MCBAQCBzdGF0aWMgaW50IGRvX2R1bXAoaW50IGFyZ2MsIGNoYXIgKiphcmd2KVxuIFx0XHRcdGVyciA9IC0xO1xuIFx0XHRcdGJyZWFrO1xuIFx0XHR9XG4tXHRcdGVyciA9IG1hcF9kdW1wKGZkc1tpXSwgXHUwMDI2aW5mbywgd3RyLCBuYl9mZHMgXHUwMDNlIDEpO1xuK1x0XHRlcnIgPSBtYXBfZHVtcChmZHNbaV0sIFx1MDAyNmluZm8sIHd0ciwgbmJfZmRzIFx1MDAzZSAxIHx8IHJlY3Vyc2l2ZV9kdW1wLFxuK1x0XHRcdCAgICAgICByZWN1cnNpdmVfZHVtcCA/IFx1MDAyNmN0eCA6IE5VTEwpO1xuIFx0XHRpZiAoIXd0ciBcdTAwMjZcdTAwMjYgaSAhPSBuYl9mZHMgLSAxKVxuIFx0XHRcdHByaW50ZihcIlxcblwiKTtcbiBcbiBcdFx0aWYgKGVycilcbiBcdFx0XHRicmVhaztcbi1cdFx0Y2xvc2UoZmRzW2ldKTtcbitcdFx0LyogS2VlcCBzZWxlY3RlZCBtYXBzIGFsaXZlIHdoaWxlIHZpc2l0aW5nIHRoZWlyIGlubmVyIG1hcHMuICovXG4rXHRcdGlmICghcmVjdXJzaXZlX2R1bXApXG4rXHRcdFx0Y2xvc2UoZmRzW2ldKTtcbitcdH1cbitcdGZvciAoaiA9IDA7ICFlcnIgXHUwMDI2XHUwMDI2IGogXHUwMDNjIGN0eC5wZW5kaW5nX2NudDsgaisrKSB7XG4rXHRcdGludCBmZDtcbitcbitcdFx0ZmQgPSBicGZfbWFwX2dldF9mZF9ieV9pZF9vcHRzKGN0eC5wZW5kaW5nX2lkc1tqXSwgXHUwMDI2b3B0cyk7XG4rXHRcdGlmIChmZCBcdTAwM2MgMCkge1xuK1x0XHRcdHBfZXJyKFwiY2FuJ3Qgb3BlbiBpbm5lciBtYXAgaWQgJXU6ICVzXCIsXG4rXHRcdFx0ICAgICAgY3R4LnBlbmRpbmdfaWRzW2pdLCBzdHJlcnJvcihlcnJubykpO1xuK1x0XHRcdGVyciA9IC0xO1xuK1x0XHRcdGJyZWFrO1xuK1x0XHR9XG4rXHRcdGxlbiA9IHNpemVvZihpbmZvKTtcbitcdFx0aWYgKGJwZl9tYXBfZ2V0X2luZm9fYnlfZmQoZmQsIFx1MDAyNmluZm8sIFx1MDAyNmxlbikpIHtcbitcdFx0XHRwX2VycihcImNhbid0IGdldCBtYXAgaW5mbzogJXNcIiwgc3RyZXJyb3IoZXJybm8pKTtcbitcdFx0XHRlcnIgPSAtMTtcbitcdFx0fSBlbHNlIHtcbitcdFx0XHRpZiAoIXd0cilcbitcdFx0XHRcdHByaW50ZihcIlxcblwiKTtcbitcdFx0XHRlcnIgPSBtYXBfZHVtcChmZCwgXHUwMDI2aW5mbywgd3RyLCB0cnVlLCBcdTAwMjZjdHgpO1xuK1x0XHR9XG4rXHRcdGNsb3NlKGZkKTtcbiBcdH1cbi1cdGlmICh3dHIgXHUwMDI2XHUwMDI2IG5iX2ZkcyBcdTAwM2UgMSlcbitcdGlmICh3dHIgXHUwMDI2XHUwMDI2IChuYl9mZHMgXHUwMDNlIDEgfHwgcmVjdXJzaXZlX2R1bXApKVxuIFx0XHRqc29ud19lbmRfYXJyYXkod3RyKTtcdC8qIHJvb3QgYXJyYXkgKi9cbiBcbiBcdGlmIChidGZfd3RyKVxuIFx0XHRqc29ud19kZXN0cm95KFx1MDAyNmJ0Zl93dHIpO1xuIGV4aXRfY2xvc2U6XG4rXHRpZiAocmVjdXJzaXZlX2R1bXApXG4rXHRcdGkgPSAwO1xuIFx0Zm9yICg7IGkgXHUwMDNjIG5iX2ZkczsgaSsrKVxuIFx0XHRjbG9zZShmZHNbaV0pO1xuK1x0aGFzaG1hcF9fZnJlZShjdHguc2Vlbik7XG4rXHRmcmVlKGN0eC5wZW5kaW5nX2lkcyk7XG4gZXhpdF9mcmVlOlxuIFx0ZnJlZShmZHMpO1xuIFx0ZnJlZV9idGZfdm1saW51eCgpO1xuQEAgLTE0ODQsNyArMTU5OSw3IEBAIHN0YXRpYyBpbnQgZG9faGVscChpbnQgYXJnYywgY2hhciAqKmFyZ3YpXG4gXHRcdFwiICAgICAgICAgICAgICAgICB0YXNrX3N0b3JhZ2UgfCBibG9vbV9maWx0ZXIgfCB1c2VyX3JpbmdidWYgfCBjZ3JwX3N0b3JhZ2UgfCBhcmVuYSB8XFxuXCJcbiBcdFx0XCIgICAgICAgICAgICAgICAgIGluc25fYXJyYXkgfCByaGFzaCB9XFxuXCJcbiBcdFx0XCIgICAgICAgXCIgSEVMUF9TUEVDX09QVElPTlMgXCIgfFxcblwiXG4tXHRcdFwiICAgICAgICAgICAgICAgICAgICB7LWZ8LS1icGZmc30gfCB7LW58LS1ub21vdW50fSB9XFxuXCJcbitcdFx0XCIgICAgICAgICAgICAgICAgICAgIHstZnwtLWJwZmZzfSB8IHstbnwtLW5vbW91bnR9IHwgey1yfC0tcmVjdXJzaXZlfSB9XFxuXCJcbiBcdFx0XCJcIixcbiBcdFx0YmluX25hbWUsIGFyZ3ZbLTJdKTtcbiBcbmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ190ZXN0cy9icGZ0b29sX21hcF9kdW1wLmMgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ190ZXN0cy9icGZ0b29sX21hcF9kdW1wLmNcbm5ldyBmaWxlIG1vZGUgMTAwNjQ0XG5pbmRleCAwMDAwMDAwMDAwMDAwLi4xZmI4NzdmYzY4YzgzXG4tLS0gL2Rldi9udWxsXG4rKysgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ190ZXN0cy9icGZ0b29sX21hcF9kdW1wLmNcbkBAIC0wLDAgKzEsNDc0IEBAXG4rLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjAtb25seVxuKyNpbmNsdWRlIFx1MDAzY3Rlc3RfcHJvZ3MuaFx1MDAzZVxuKyNpbmNsdWRlIFx1MDAzY2JwZnRvb2xfaGVscGVycy5oXHUwMDNlXG4rI2luY2x1ZGUgXHUwMDNjYnBmL2J0Zi5oXHUwMDNlXG4rI2luY2x1ZGUgXHUwMDNjc3lzL3Jlc291cmNlLmhcdTAwM2VcbisjaW5jbHVkZSBcdTAwM2NkaXJlbnQuaFx1MDAzZVxuK1xuKyNkZWZpbmUgT1VUUFVUX1NJWkUgODE5MlxuK1xuK3N0YXRpYyBib29sIGR1bXBfbWFwKF9fdTMyIGlkLCBjb25zdCBjaGFyICpvcHRpb25zLCBjaGFyICpvdXRwdXQpXG4re1xuK1x0Y2hhciBjb21tYW5kW01BWF9CUEZUT09MX0NNRF9MRU5dO1xuK1xuK1x0c25wcmludGYoY29tbWFuZCwgc2l6ZW9mKGNvbW1hbmQpLCBcIiVzIG1hcCBkdW1wIGlkICV1XCIsIG9wdGlvbnMsIGlkKTtcbitcdG1lbXNldChvdXRwdXQsIDAsIE9VVFBVVF9TSVpFKTtcbitcdGlmICghQVNTRVJUX09LKGdldF9icGZ0b29sX2NvbW1hbmRfb3V0cHV0KGNvbW1hbmQsIG91dHB1dCwgT1VUUFVUX1NJWkUgLSAxKSxcbitcdFx0ICAgICAgIFwiZHVtcF9tYXBcIikpXG4rXHRcdHJldHVybiBmYWxzZTtcbitcdC8qIFRoZSBoZWxwZXIgbGVhdmVzIHRoZSB0cmFpbGluZyBuZXdsaW5lIGluIHBsYWNlLiAqL1xuK1x0b3V0cHV0W3N0cmNzcG4ob3V0cHV0LCBcIlxcblwiKV0gPSAnXFwwJztcbitcdHJldHVybiB0cnVlO1xuK31cbitcbitzdGF0aWMgX191MzIgbWFwX2lkKGludCBmZClcbit7XG4rXHRzdHJ1Y3QgYnBmX21hcF9pbmZvIGluZm8gPSB7fTtcbitcdF9fdTMyIGxlbiA9IHNpemVvZihpbmZvKTtcbitcbitcdGlmICghQVNTRVJUX09LKGJwZl9tYXBfZ2V0X2luZm9fYnlfZmQoZmQsIFx1MDAyNmluZm8sIFx1MDAyNmxlbiksIFwibWFwX2luZm9cIikpXG4rXHRcdHJldHVybiAwO1xuK1x0cmV0dXJuIGluZm8uaWQ7XG4rfVxuK1xuK3N0YXRpYyBpbnQgY291bnRfdG9rZW4oY29uc3QgY2hhciAqb3V0cHV0LCBjb25zdCBjaGFyICp0b2tlbilcbit7XG4rXHRpbnQgY291bnQgPSAwO1xuK1xuK1x0d2hpbGUgKChvdXRwdXQgPSBzdHJzdHIob3V0cHV0LCB0b2tlbikpKSB7XG4rXHRcdGNvdW50Kys7XG4rXHRcdG91dHB1dCArPSBzdHJsZW4odG9rZW4pO1xuK1x0fVxuK1x0cmV0dXJuIGNvdW50O1xuK31cbitcbitzdGF0aWMgdm9pZCBjaGVja19wbGFpbihfX3UzMiByb290X2lkLCBfX3UzMiBpbm5lcl9pZCwgY29uc3QgY2hhciAqdHlwZSxcbitcdFx0XHRpbnQgZW50cmllcywgYm9vbCB0eXBlZClcbit7XG4rXHRjaGFyIGNvbW1hbmRbTUFYX0JQRlRPT0xfQ01EX0xFTl0sIGhlYWRlclsxMjhdO1xuK1x0Y2hhciBvdXRwdXRbT1VUUFVUX1NJWkVdID0ge307XG4rXHRjb25zdCBjaGFyICpyb290LCAqaW5uZXI7XG4rXG4rXHRzbnByaW50Zihjb21tYW5kLCBzaXplb2YoY29tbWFuZCksIFwiLS1yZWN1cnNpdmUgbWFwIGR1bXAgaWQgJXVcIiwgcm9vdF9pZCk7XG4rXHRpZiAoIUFTU0VSVF9PSyhnZXRfYnBmdG9vbF9jb21tYW5kX291dHB1dChjb21tYW5kLCBvdXRwdXQsIHNpemVvZihvdXRwdXQpIC0gMSksXG4rXHRcdCAgICAgICBcInBsYWluX2R1bXBcIikpXG4rXHRcdHJldHVybjtcbitcdHNucHJpbnRmKGhlYWRlciwgc2l6ZW9mKGhlYWRlciksIFwiJXU6ICVzICBuYW1lIGR1bXBfb3V0ZXIgIFwiLCByb290X2lkLCB0eXBlKTtcbitcdHJvb3QgPSBzdHJzdHIob3V0cHV0LCBoZWFkZXIpO1xuK1x0aWYgKCFBU1NFUlRfT0tfUFRSKHJvb3QsIFwicGxhaW5fcm9vdF9oZWFkZXJcIikpXG4rXHRcdHJldHVybjtcbitcdEFTU0VSVF9FUShyb290IC0gb3V0cHV0LCAwLCBcInBsYWluX3Jvb3RfZmlyc3RcIik7XG4rXHRBU1NFUlRfRVEoY291bnRfdG9rZW4ob3V0cHV0LCBcImlubmVyX21hcF9pZDpcIiksIGVudHJpZXMsIFwicGxhaW5fcmVmZXJlbmNlc1wiKTtcbitcdGlmIChlbnRyaWVzKSB7XG4rXHRcdHNucHJpbnRmKGhlYWRlciwgc2l6ZW9mKGhlYWRlciksIFwiJXU6IGhhc2ggIG5hbWUgZHVtcF9pbm5lciAgXCIsIGlubmVyX2lkKTtcbitcdFx0aW5uZXIgPSBzdHJzdHIob3V0cHV0LCBoZWFkZXIpO1xuK1x0XHRpZiAoQVNTRVJUX09LX1BUUihpbm5lciwgXCJwbGFpbl9pbm5lcl9oZWFkZXJcIikpXG4rXHRcdFx0QVNTRVJUX0dUKGlubmVyIC0gcm9vdCwgMCwgXCJwbGFpbl9pbm5lcl9hZnRlcl9yb290XCIpO1xuK1x0XHRBU1NFUlRfRVEoY291bnRfdG9rZW4ob3V0cHV0LCBoZWFkZXIpLCAxLCBcInBsYWluX2lubmVyX29uY2VcIik7XG4rXHR9XG4rXHRBU1NFUlRfRVEoY291bnRfdG9rZW4ob3V0cHV0LCBcIkZvdW5kIFwiKSwgZW50cmllcyBcdTAwMjZcdTAwMjYgIXR5cGVkID8gMiA6IDEsXG4rXHRcdCAgXCJwbGFpbl9tYXBfY291bnRcIik7XG4rXHRpZiAodHlwZWQpIHtcbitcdFx0QVNTRVJUX0hBU19TVUJTVFIob3V0cHV0LCBcIlxcXCJrZXlcXFwiOiAwXCIsIFwicGxhaW5fYnRmX2tleVwiKTtcbitcdFx0QVNTRVJUX0hBU19TVUJTVFIob3V0cHV0LCBcIlxcXCJ2YWx1ZVxcXCI6IDE2ODQzMDA5XCIsIFwicGxhaW5fYnRmX3ZhbHVlXCIpO1xuK1x0fVxuK31cbitcbitzdGF0aWMgdm9pZCB0ZXN0X291dGVyKGVudW0gYnBmX21hcF90eXBlIHR5cGUsIGludCBlbnRyaWVzLCBib29sIGVtcHR5X2lubmVyLFxuK1x0XHQgICAgICAgYm9vbCB0eXBlZClcbit7XG4rXHRMSUJCUEZfT1BUUyhicGZfbWFwX2NyZWF0ZV9vcHRzLCBvcHRzKTtcbitcdExJQkJQRl9PUFRTKGJwZl9tYXBfY3JlYXRlX29wdHMsIGlubmVyX29wdHMpO1xuK1x0c3RydWN0IGJ0ZiAqYnRmID0gTlVMTDtcbitcdGNoYXIgb3V0ZXJbT1VUUFVUX1NJWkVdLCBpbm5lcltPVVRQVVRfU0laRV0sIG91dHB1dFtPVVRQVVRfU0laRV07XG4rXHRjaGFyIGV4cGVjdGVkW09VVFBVVF9TSVpFICogM10sIHJlZmVyZW5jZVs2NF07XG4rXHRjb25zdCBjaGFyICp0eXBlX25hbWUgPSBsaWJicGZfYnBmX21hcF90eXBlX3N0cih0eXBlKTtcbitcdGludCBpbm5lcl9mZCA9IC0xLCBvdXRlcl9mZCA9IC0xO1xuK1x0X191MzIgcm9vdF9pZCwgaW5uZXJfaWQsIGtleSwgdmFsdWUgPSAweDAxMDEwMTAxO1xuK1xuK1x0aWYgKHR5cGVkKSB7XG4rXHRcdGJ0ZiA9IGJ0Zl9fbmV3X2VtcHR5KCk7XG4rXHRcdGlmICghQVNTRVJUX09LX1BUUihidGYsIFwiY3JlYXRlX2J0ZlwiKSB8fFxuK1x0XHQgICAgIUFTU0VSVF9FUShidGZfX2FkZF9pbnQoYnRmLCBcInVuc2lnbmVkIGludFwiLCA0LCAwKSwgMSwgXCJidGZfaW50XCIpIHx8XG4rXHRcdCAgICAhQVNTRVJUX09LKGJ0Zl9fbG9hZF9pbnRvX2tlcm5lbChidGYpLCBcImxvYWRfYnRmXCIpKVxuK1x0XHRcdGdvdG8gb3V0O1xuK1x0XHRpbm5lcl9vcHRzLmJ0Zl9mZCA9IGJ0Zl9fZmQoYnRmKTtcbitcdFx0aW5uZXJfb3B0cy5idGZfa2V5X3R5cGVfaWQgPSAxO1xuK1x0XHRpbm5lcl9vcHRzLmJ0Zl92YWx1ZV90eXBlX2lkID0gMTtcbitcdH1cbitcdGlubmVyX2ZkID0gYnBmX21hcF9jcmVhdGUoQlBGX01BUF9UWVBFX0hBU0gsIFwiZHVtcF9pbm5lclwiLCBzaXplb2Yoa2V5KSxcbitcdFx0XHRcdCAgc2l6ZW9mKHZhbHVlKSwgMiwgXHUwMDI2aW5uZXJfb3B0cyk7XG4rXHRpZiAoIUFTU0VSVF9PS19GRChpbm5lcl9mZCwgXCJjcmVhdGVfaW5uZXJcIikpXG4rXHRcdGdvdG8gb3V0O1xuK1x0a2V5ID0gMDtcbitcdGlmICghZW1wdHlfaW5uZXIgXHUwMDI2XHUwMDI2XG4rXHQgICAgIUFTU0VSVF9PSyhicGZfbWFwX3VwZGF0ZV9lbGVtKGlubmVyX2ZkLCBcdTAwMjZrZXksIFx1MDAyNnZhbHVlLCBCUEZfQU5ZKSxcbitcdFx0ICAgICAgIFwicG9wdWxhdGVfaW5uZXJcIikpXG4rXHRcdGdvdG8gb3V0O1xuK1x0b3B0cy5pbm5lcl9tYXBfZmQgPSBpbm5lcl9mZDtcbitcdG91dGVyX2ZkID0gYnBmX21hcF9jcmVhdGUodHlwZSwgXCJkdW1wX291dGVyXCIsIHNpemVvZihrZXkpLCBzaXplb2YoX191MzIpLFxuK1x0XHRcdFx0ICAzLCBcdTAwMjZvcHRzKTtcbitcdGlmICghQVNTRVJUX09LX0ZEKG91dGVyX2ZkLCBcImNyZWF0ZV9vdXRlclwiKSlcbitcdFx0Z290byBvdXQ7XG4rXHQvKiBUaGUgdW51c2VkIHRoaXJkIGFycmF5IHNsb3QgYWxzbyBleGVyY2lzZXMgZmFpbGVkIGxvb2t1cHMuICovXG4rXHRmb3IgKGtleSA9IDA7IGtleSBcdTAwM2MgZW50cmllczsga2V5KyspXG4rXHRcdGlmICghQVNTRVJUX09LKGJwZl9tYXBfdXBkYXRlX2VsZW0ob3V0ZXJfZmQsIFx1MDAyNmtleSwgXHUwMDI2aW5uZXJfZmQsIEJQRl9BTlkpLFxuK1x0XHRcdCAgICAgICBcInBvcHVsYXRlX291dGVyXCIpKVxuK1x0XHRcdGdvdG8gb3V0O1xuK1x0cm9vdF9pZCA9IG1hcF9pZChvdXRlcl9mZCk7XG4rXHRpbm5lcl9pZCA9IG1hcF9pZChpbm5lcl9mZCk7XG4rXHRpZiAoIXJvb3RfaWQgfHwgIWlubmVyX2lkIHx8ICFkdW1wX21hcChyb290X2lkLCBcIi1qXCIsIG91dGVyKSB8fFxuK1x0ICAgICFkdW1wX21hcChpbm5lcl9pZCwgXCItalwiLCBpbm5lcikpXG4rXHRcdGdvdG8gb3V0O1xuK1xuK1x0QVNTRVJUX0VRKG91dGVyWzBdLCAnWycsIFwiZGVmYXVsdF9hcnJheVwiKTtcbitcdEFTU0VSVF9FUShjb3VudF90b2tlbihvdXRlciwgXCJcXFwiZWxlbWVudHNcXFwiOlwiKSwgMCwgXCJkZWZhdWx0X25vX3dyYXBwZXJcIik7XG4rXHRBU1NFUlRfRVEoY291bnRfdG9rZW4ob3V0ZXIsIFwiXFxcImlkXFxcIjpcIiksIDAsIFwiZGVmYXVsdF9ub19oZWFkZXJcIik7XG4rXHRzbnByaW50ZihyZWZlcmVuY2UsIHNpemVvZihyZWZlcmVuY2UpLCBcIlxcXCJpbm5lcl9tYXBfaWRcXFwiOiV1XCIsIGlubmVyX2lkKTtcbitcdEFTU0VSVF9FUShjb3VudF90b2tlbihvdXRlciwgcmVmZXJlbmNlKSwgZW50cmllcywgXCJkZWZhdWx0X3JlZmVyZW5jZXNcIik7XG4rXHRpZiAoIWVudHJpZXMpXG4rXHRcdEFTU0VSVF9TVFJFUShvdXRlciwgXCJbXVwiLCBcImVtcHR5X291dGVyX2RlZmF1bHRcIik7XG4rXHRpZiAoZW1wdHlfaW5uZXIpXG4rXHRcdEFTU0VSVF9TVFJFUShpbm5lciwgXCJbXVwiLCBcImVtcHR5X2lubmVyX2RlZmF1bHRcIik7XG4rXHRlbHNlIGlmICh0eXBlZClcbitcdFx0QVNTRVJUX0hBU19TVUJTVFIoaW5uZXIsIFwiXFxcImZvcm1hdHRlZFxcXCI6e1xcXCJrZXlcXFwiOjAsXFxcInZhbHVlXFxcIjoxNjg0MzAwOX1cIixcbitcdFx0XHRcdCAgXCJ0eXBlZF9pbm5lclwiKTtcbitcdGVsc2VcbitcdFx0QVNTRVJUX1NUUkVRKGlubmVyLFxuK1x0XHRcdCAgICAgXCJbe1xcXCJrZXlcXFwiOltcXFwiMHgwMFxcXCIsXFxcIjB4MDBcXFwiLFxcXCIweDAwXFxcIixcXFwiMHgwMFxcXCJdLFwiXG4rXHRcdFx0ICAgICBcIlxcXCJ2YWx1ZVxcXCI6W1xcXCIweDAxXFxcIixcXFwiMHgwMVxcXCIsXFxcIjB4MDFcXFwiLFxcXCIweDAxXFxcIl19XVwiLFxuK1x0XHRcdCAgICAgXCJvcmRpbmFyeV9kZWZhdWx0XCIpO1xuK1xuK1x0LypcbitcdCAqIENvbXBhcmUgdGhlIGNvbXBsZXRlIEpTT04gZG9jdW1lbnQ6IGEgZmxhdCBhcnJheSB3aXRoIHRoZSByb290IGZpcnN0LFxuK1x0ICogb25lIGNvcHkgb2YgdGhlIHNoYXJlZCBpbm5lciBtYXAsIGFuZCB1bmNoYW5nZWQgZW50cnkgcmVwcmVzZW50YXRpb25zLlxuK1x0ICovXG4rXHRpZiAoZW50cmllcylcbitcdFx0c25wcmludGYoZXhwZWN0ZWQsIHNpemVvZihleHBlY3RlZCksXG4rXHRcdFx0IFwiW3tcXFwiaWRcXFwiOiV1LFxcXCJ0eXBlXFxcIjpcXFwiJXNcXFwiLFxcXCJuYW1lXFxcIjpcXFwiZHVtcF9vdXRlclxcXCIsXCJcbitcdFx0XHQgXCJcXFwiZmxhZ3NcXFwiOjAsXFxcImVsZW1lbnRzXFxcIjolc30se1xcXCJpZFxcXCI6JXUsXFxcInR5cGVcXFwiOlxcXCJoYXNoXFxcIixcIlxuK1x0XHRcdCBcIlxcXCJuYW1lXFxcIjpcXFwiZHVtcF9pbm5lclxcXCIsXFxcImZsYWdzXFxcIjowLFxcXCJlbGVtZW50c1xcXCI6JXN9XVwiLFxuK1x0XHRcdCByb290X2lkLCB0eXBlX25hbWUsIG91dGVyLCBpbm5lcl9pZCwgaW5uZXIpO1xuK1x0ZWxzZVxuK1x0XHRzbnByaW50ZihleHBlY3RlZCwgc2l6ZW9mKGV4cGVjdGVkKSxcbitcdFx0XHQgXCJbe1xcXCJpZFxcXCI6JXUsXFxcInR5cGVcXFwiOlxcXCIlc1xcXCIsXFxcIm5hbWVcXFwiOlxcXCJkdW1wX291dGVyXFxcIixcIlxuK1x0XHRcdCBcIlxcXCJmbGFnc1xcXCI6MCxcXFwiZWxlbWVudHNcXFwiOltdfV1cIiwgcm9vdF9pZCwgdHlwZV9uYW1lKTtcbitcdGlmIChkdW1wX21hcChyb290X2lkLCBcIi1qIC1yXCIsIG91dHB1dCkpXG4rXHRcdEFTU0VSVF9TVFJFUShvdXRwdXQsIGV4cGVjdGVkLCBcInJlY3Vyc2l2ZV9qc29uXCIpO1xuK1x0aWYgKGR1bXBfbWFwKHJvb3RfaWQsIFwiLS1qc29uIC0tcmVjdXJzaXZlXCIsIG91dHB1dCkpXG4rXHRcdEFTU0VSVF9TVFJFUShvdXRwdXQsIGV4cGVjdGVkLCBcInJlY3Vyc2l2ZV9sb25nX29wdGlvbnNcIik7XG4rXHRjaGVja19wbGFpbihyb290X2lkLCBpbm5lcl9pZCwgdHlwZV9uYW1lLCBlbnRyaWVzLCB0eXBlZCk7XG4rXG4rXHQvKiBSZWN1cnNpb24gb24gYW4gb3JkaW5hcnkgbWFwIHN0aWxsIGVtaXRzIGEgc2luZ2xlIG1hcCBvYmplY3QuICovXG4rXHRzbnByaW50ZihleHBlY3RlZCwgc2l6ZW9mKGV4cGVjdGVkKSxcbitcdFx0IFwiW3tcXFwiaWRcXFwiOiV1LFxcXCJ0eXBlXFxcIjpcXFwiaGFzaFxcXCIsXFxcIm5hbWVcXFwiOlxcXCJkdW1wX2lubmVyXFxcIixcIlxuK1x0XHQgXCJcXFwiZmxhZ3NcXFwiOjAsXFxcImVsZW1lbnRzXFxcIjolc31dXCIsIGlubmVyX2lkLCBpbm5lcik7XG4rXHRpZiAoZHVtcF9tYXAoaW5uZXJfaWQsIFwiLWogLXJcIiwgb3V0cHV0KSlcbitcdFx0QVNTRVJUX1NUUkVRKG91dHB1dCwgZXhwZWN0ZWQsIFwib3JkaW5hcnlfcmVjdXJzaXZlXCIpO1xuK291dDpcbitcdGlmIChvdXRlcl9mZCBcdTAwM2U9IDApXG4rXHRcdGNsb3NlKG91dGVyX2ZkKTtcbitcdGlmIChpbm5lcl9mZCBcdTAwM2U9IDApXG4rXHRcdGNsb3NlKGlubmVyX2ZkKTtcbitcdGJ0Zl9fZnJlZShidGYpO1xuK31cbitcbitzdGF0aWMgdm9pZCB0ZXN0X211bHRpcGxlX3Jvb3RzKHZvaWQpXG4re1xuK1x0TElCQlBGX09QVFMoYnBmX21hcF9jcmVhdGVfb3B0cywgb3B0cyk7XG4rXHRjaGFyIGNvbW1hbmRbTUFYX0JQRlRPT0xfQ01EX0xFTl0sIG5hbWVbQlBGX09CSl9OQU1FX0xFTl07XG4rXHRjaGFyIG91dHB1dFtPVVRQVVRfU0laRV0gPSB7fSwgZXhwZWN0ZWRbT1VUUFVUX1NJWkUgKiA0XSwgZWxlbWVudHNbT1VUUFVUX1NJWkVdO1xuK1x0c3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCB0eXBlc1tdID0geyBcImhhc2hcIiwgXCJhcnJheV9vZl9tYXBzXCIsIFwiaGFzaF9vZl9tYXBzXCIsIFwiaGFzaFwiIH07XG4rXHRpbnQgZmRzW10gPSB7IC0xLCAtMSwgLTEsIC0xIH07XG4rXHRfX3UzMiBpZHNbNF0sIGtleTtcbitcdGludCBpLCBsZW4gPSAwO1xuK1xuK1x0LypcbitcdCAqIFNlbGVjdCB0aGUgZmlyc3QgaW5uZXIgbWFwIGFuZCBib3RoIG91dGVycyBhcyByb290cy4gVGhlIG90aGVyIGlubmVyXG4rXHQgKiBtYXAgbXVzdCBiZSBhcHBlbmRlZCBhZnRlciBhbGwgdGhyZWUgcm9vdHMsIGV2ZW4gdGhvdWdoIGl0IGlzIGZvdW5kXG4rXHQgKiB3aGlsZSBkdW1waW5nIHRoZSBmaXJzdCBvdXRlci4gQSBwcm9jZXNzLXNwZWNpZmljIG5hbWUgYXZvaWRzIG90aGVyXG4rXHQgKiB0ZXN0cycgbWFwcyBqb2luaW5nIHRoZSBzZWxlY3Rpb24uXG4rXHQgKi9cbitcdHNucHJpbnRmKG5hbWUsIHNpemVvZihuYW1lKSwgXCJkdW1wXyV1XCIsIGdldHBpZCgpKTtcbitcdGZkc1swXSA9IGJwZl9tYXBfY3JlYXRlKEJQRl9NQVBfVFlQRV9IQVNILCBuYW1lLCA0LCA0LCAxLCBOVUxMKTtcbitcdGlmICghQVNTRVJUX09LX0ZEKGZkc1swXSwgXCJjcmVhdGVfc2VsZWN0ZWRfaW5uZXJcIikpXG4rXHRcdGdvdG8gb3V0O1xuK1x0ZmRzWzNdID0gYnBmX21hcF9jcmVhdGUoQlBGX01BUF9UWVBFX0hBU0gsIFwiZHVtcF9kaXNjb3ZlcmVkXCIsIDQsIDQsIDEsIE5VTEwpO1xuK1x0aWYgKCFBU1NFUlRfT0tfRkQoZmRzWzNdLCBcImNyZWF0ZV9kaXNjb3ZlcmVkX2lubmVyXCIpKVxuK1x0XHRnb3RvIG91dDtcbitcdG9wdHMuaW5uZXJfbWFwX2ZkID0gZmRzWzBdO1xuK1x0ZmRzWzFdID0gYnBmX21hcF9jcmVhdGUoQlBGX01BUF9UWVBFX0FSUkFZX09GX01BUFMsIG5hbWUsIDQsIDQsIDIsIFx1MDAyNm9wdHMpO1xuK1x0aWYgKCFBU1NFUlRfT0tfRkQoZmRzWzFdLCBcImNyZWF0ZV9hcnJheV9yb290XCIpKVxuK1x0XHRnb3RvIG91dDtcbitcdGZkc1syXSA9IGJwZl9tYXBfY3JlYXRlKEJQRl9NQVBfVFlQRV9IQVNIX09GX01BUFMsIG5hbWUsIDQsIDQsIDIsIFx1MDAyNm9wdHMpO1xuK1x0aWYgKCFBU1NFUlRfT0tfRkQoZmRzWzJdLCBcImNyZWF0ZV9oYXNoX3Jvb3RcIikpXG4rXHRcdGdvdG8gb3V0O1xuK1x0Zm9yIChpID0gMTsgaSBcdTAwM2M9IDI7IGkrKykge1xuK1x0XHRrZXkgPSAwO1xuK1x0XHRpZiAoIUFTU0VSVF9PSyhicGZfbWFwX3VwZGF0ZV9lbGVtKGZkc1tpXSwgXHUwMDI2a2V5LCBcdTAwMjZmZHNbMF0sIEJQRl9BTlkpLFxuK1x0XHRcdCAgICAgICBcInJlZmVyZW5jZV9zZWxlY3RlZF9pbm5lclwiKSlcbitcdFx0XHRnb3RvIG91dDtcbitcdFx0a2V5ID0gMTtcbitcdFx0aWYgKCFBU1NFUlRfT0soYnBmX21hcF91cGRhdGVfZWxlbShmZHNbaV0sIFx1MDAyNmtleSwgXHUwMDI2ZmRzWzNdLCBCUEZfQU5ZKSxcbitcdFx0XHQgICAgICAgXCJyZWZlcmVuY2VfZGlzY292ZXJlZF9pbm5lclwiKSlcbitcdFx0XHRnb3RvIG91dDtcbitcdH1cbitcdGZvciAoaSA9IDA7IGkgXHUwMDNjIEFSUkFZX1NJWkUoZmRzKTsgaSsrKSB7XG4rXHRcdGlkc1tpXSA9IG1hcF9pZChmZHNbaV0pO1xuK1x0XHRpZiAoIWlkc1tpXSB8fCAhZHVtcF9tYXAoaWRzW2ldLCBcIi1qXCIsIGVsZW1lbnRzKSlcbitcdFx0XHRnb3RvIG91dDtcbitcdFx0bGVuICs9IHNucHJpbnRmKGV4cGVjdGVkICsgbGVuLCBzaXplb2YoZXhwZWN0ZWQpIC0gbGVuLFxuK1x0XHRcdFx0XCIlc3tcXFwiaWRcXFwiOiV1LFxcXCJ0eXBlXFxcIjpcXFwiJXNcXFwiLFxcXCJuYW1lXFxcIjpcXFwiJXNcXFwiLFwiXG4rXHRcdFx0XHRcIlxcXCJmbGFnc1xcXCI6MCxcXFwiZWxlbWVudHNcXFwiOiVzfSVzXCIsXG4rXHRcdFx0XHRpID8gXCIsXCIgOiBcIltcIiwgaWRzW2ldLCB0eXBlc1tpXSxcbitcdFx0XHRcdGkgPT0gMyA/IFwiZHVtcF9kaXNjb3ZlcmVkXCIgOiBuYW1lLCBlbGVtZW50cywgaSA9PSAzID8gXCJdXCIgOiBcIlwiKTtcbitcdH1cbitcdHNucHJpbnRmKGNvbW1hbmQsIHNpemVvZihjb21tYW5kKSwgXCItaiAtciBtYXAgZHVtcCBuYW1lICVzXCIsIG5hbWUpO1xuK1x0aWYgKEFTU0VSVF9PSyhnZXRfYnBmdG9vbF9jb21tYW5kX291dHB1dChjb21tYW5kLCBvdXRwdXQsIHNpemVvZihvdXRwdXQpIC0gMSksXG4rXHRcdCAgICAgIFwiZHVtcF9tdWx0aXBsZV9yb290c1wiKSkge1xuK1x0XHRvdXRwdXRbc3RyY3NwbihvdXRwdXQsIFwiXFxuXCIpXSA9ICdcXDAnO1xuK1x0XHRBU1NFUlRfU1RSRVEob3V0cHV0LCBleHBlY3RlZCwgXCJyb290c19maXJzdF9hbmRfc2VlZF9kZWR1cFwiKTtcbitcdH1cbitvdXQ6XG4rXHRmb3IgKGkgPSAwOyBpIFx1MDAzYyBBUlJBWV9TSVpFKGZkcyk7IGkrKylcbitcdFx0aWYgKGZkc1tpXSBcdTAwM2U9IDApXG4rXHRcdFx0Y2xvc2UoZmRzW2ldKTtcbit9XG4rXG4rc3RhdGljIHZvaWQgdGVzdF91bnJlYWRhYmxlKGJvb2wgb3V0ZXIpXG4re1xuK1x0TElCQlBGX09QVFMoYnBmX21hcF9jcmVhdGVfb3B0cywgb3B0cyk7XG4rXHRjaGFyIGVsZW1lbnRzW09VVFBVVF9TSVpFXSwgb3V0cHV0W09VVFBVVF9TSVpFXSwgcm9vdFtPVVRQVVRfU0laRV07XG4rXHRjaGFyIGV4cGVjdGVkW09VVFBVVF9TSVpFICogM10sIHBsYWluW09VVFBVVF9TSVpFXSA9IHt9O1xuK1x0Y2hhciBjb21tYW5kW01BWF9CUEZUT09MX0NNRF9MRU5dO1xuK1x0aW50IGlubmVyX2ZkID0gLTEsIG91dGVyX2ZkID0gLTEsIGxvb2t1cF9lcnJubztcbitcdF9fdTMyIGlubmVyX2lkLCByb290X2lkLCBrZXkgPSAwLCB2YWx1ZTtcbitcbitcdC8qXG4rXHQgKiBFdmVyeSBrZXkgaXMgZW51bWVyYWJsZSwgYnV0IFBFUkZfRVZFTlRfQVJSQVkgbG9va3VwIHJldHVybnNcbitcdCAqIEVOT1RTVVBQICh0aGUga2VybmVsLWludGVybmFsIGVycm5vKS4gQ2hlY2sgYm90aCBlbnRyaWVzIHNvIGFuXG4rXHQgKiBlYXJseSBleGl0IG9uIHRoZSBmaXJzdCBsb29rdXAgZmFpbHVyZSBjYW5ub3QgcGFzcy5cbitcdCAqL1xuK1x0aW5uZXJfZmQgPSBicGZfbWFwX2NyZWF0ZShCUEZfTUFQX1RZUEVfUEVSRl9FVkVOVF9BUlJBWSwgXCJkdW1wX3VucmVhZGFibGVcIixcbitcdFx0XHRcdCAgc2l6ZW9mKGtleSksIHNpemVvZih2YWx1ZSksIDIsIE5VTEwpO1xuK1x0aWYgKCFBU1NFUlRfT0tfRkQoaW5uZXJfZmQsIFwiY3JlYXRlX3VucmVhZGFibGVcIikpXG4rXHRcdGdvdG8gb3V0O1xuK1x0aWYgKCFBU1NFUlRfTFQoYnBmX21hcF9sb29rdXBfZWxlbShpbm5lcl9mZCwgXHUwMDI2a2V5LCBcdTAwMjZ2YWx1ZSksIDAsXG4rXHRcdCAgICAgICBcInVucmVhZGFibGVfbG9va3VwXCIpKVxuK1x0XHRnb3RvIG91dDtcbitcdGxvb2t1cF9lcnJubyA9IGVycm5vO1xuK1x0aWYgKCFBU1NFUlRfTkVRKGxvb2t1cF9lcnJubywgRU5PRU5ULCBcInVucmVhZGFibGVfbm90X21pc3NpbmdcIikpXG4rXHRcdGdvdG8gb3V0O1xuK1x0aW5uZXJfaWQgPSBtYXBfaWQoaW5uZXJfZmQpO1xuK1x0aWYgKCFpbm5lcl9pZCB8fCAhZHVtcF9tYXAoaW5uZXJfaWQsIFwiLWpcIiwgZWxlbWVudHMpKVxuK1x0XHRnb3RvIG91dDtcbitcdEFTU0VSVF9FUShjb3VudF90b2tlbihlbGVtZW50cywgXCJcXFwiZXJyb3JcXFwiOlwiKSwgMiwgXCJkZWZhdWx0X2pzb25fZXJyb3JzXCIpO1xuK1x0c25wcmludGYoY29tbWFuZCwgc2l6ZW9mKGNvbW1hbmQpLCBcIm1hcCBkdW1wIGlkICV1XCIsIGlubmVyX2lkKTtcbitcdGlmICghQVNTRVJUX09LKGdldF9icGZ0b29sX2NvbW1hbmRfb3V0cHV0KGNvbW1hbmQsIHBsYWluLCBzaXplb2YocGxhaW4pIC0gMSksXG4rXHRcdCAgICAgICBcImRlZmF1bHRfcGxhaW5fdW5yZWFkYWJsZVwiKSlcbitcdFx0Z290byBvdXQ7XG4rXHRBU1NFUlRfRVEoY291bnRfdG9rZW4ocGxhaW4sIHN0cmVycm9yKGxvb2t1cF9lcnJubykpLCAyLCBcImRlZmF1bHRfcGxhaW5fZXJyb3JzXCIpO1xuK1x0QVNTRVJUX0hBU19TVUJTVFIocGxhaW4sIFwiRm91bmQgMCBlbGVtZW50c1wiLCBcImRlZmF1bHRfcGxhaW5fY291bnRcIik7XG4rXG4rXHRyb290X2lkID0gaW5uZXJfaWQ7XG4rXHRpZiAob3V0ZXIpIHtcbitcdFx0b3B0cy5pbm5lcl9tYXBfZmQgPSBpbm5lcl9mZDtcbitcdFx0b3V0ZXJfZmQgPSBicGZfbWFwX2NyZWF0ZShCUEZfTUFQX1RZUEVfQVJSQVlfT0ZfTUFQUywgXCJkdW1wX291dGVyXCIsXG4rXHRcdFx0XHRcdCAgc2l6ZW9mKGtleSksIHNpemVvZih2YWx1ZSksIDEsIFx1MDAyNm9wdHMpO1xuK1x0XHRpZiAoIUFTU0VSVF9PS19GRChvdXRlcl9mZCwgXCJjcmVhdGVfb3V0ZXJcIikgfHxcbitcdFx0ICAgICFBU1NFUlRfT0soYnBmX21hcF91cGRhdGVfZWxlbShvdXRlcl9mZCwgXHUwMDI2a2V5LCBcdTAwMjZpbm5lcl9mZCwgQlBGX0FOWSksXG4rXHRcdFx0ICAgICAgIFwicG9wdWxhdGVfb3V0ZXJcIikpXG4rXHRcdFx0Z290byBvdXQ7XG4rXHRcdHJvb3RfaWQgPSBtYXBfaWQob3V0ZXJfZmQpO1xuK1x0XHRpZiAoIXJvb3RfaWQgfHwgIWR1bXBfbWFwKHJvb3RfaWQsIFwiLWpcIiwgcm9vdCkpXG4rXHRcdFx0Z290byBvdXQ7XG4rXHRcdHNucHJpbnRmKGV4cGVjdGVkLCBzaXplb2YoZXhwZWN0ZWQpLFxuK1x0XHRcdCBcIlt7XFxcImlkXFxcIjoldSxcXFwidHlwZVxcXCI6XFxcImFycmF5X29mX21hcHNcXFwiLFxcXCJuYW1lXFxcIjpcXFwiZHVtcF9vdXRlclxcXCIsXCJcbitcdFx0XHQgXCJcXFwiZmxhZ3NcXFwiOjAsXFxcImVsZW1lbnRzXFxcIjolc30se1xcXCJpZFxcXCI6JXUsXCJcbitcdFx0XHQgXCJcXFwidHlwZVxcXCI6XFxcInBlcmZfZXZlbnRfYXJyYXlcXFwiLFxcXCJuYW1lXFxcIjpcXFwiZHVtcF91bnJlYWRhYmxlXFxcIixcIlxuK1x0XHRcdCBcIlxcXCJmbGFnc1xcXCI6MCxcXFwiZWxlbWVudHNcXFwiOiVzfV1cIiwgcm9vdF9pZCwgcm9vdCwgaW5uZXJfaWQsIGVsZW1lbnRzKTtcbitcdH0gZWxzZSB7XG4rXHRcdHNucHJpbnRmKGV4cGVjdGVkLCBzaXplb2YoZXhwZWN0ZWQpLFxuK1x0XHRcdCBcIlt7XFxcImlkXFxcIjoldSxcXFwidHlwZVxcXCI6XFxcInBlcmZfZXZlbnRfYXJyYXlcXFwiLFwiXG4rXHRcdFx0IFwiXFxcIm5hbWVcXFwiOlxcXCJkdW1wX3VucmVhZGFibGVcXFwiLFxcXCJmbGFnc1xcXCI6MCxcXFwiZWxlbWVudHNcXFwiOiVzfV1cIixcbitcdFx0XHQgaW5uZXJfaWQsIGVsZW1lbnRzKTtcbitcdH1cbitcdGlmIChkdW1wX21hcChyb290X2lkLCBcIi1qIC1yXCIsIG91dHB1dCkpXG4rXHRcdEFTU0VSVF9TVFJFUShvdXRwdXQsIGV4cGVjdGVkLCBcInJlY3Vyc2l2ZV91bnJlYWRhYmxlX2pzb25cIik7XG4rXHRtZW1zZXQob3V0cHV0LCAwLCBzaXplb2Yob3V0cHV0KSk7XG4rXHRzbnByaW50Zihjb21tYW5kLCBzaXplb2YoY29tbWFuZCksIFwiLXIgbWFwIGR1bXAgaWQgJXVcIiwgcm9vdF9pZCk7XG4rXHRpZiAoQVNTRVJUX09LKGdldF9icGZ0b29sX2NvbW1hbmRfb3V0cHV0KGNvbW1hbmQsIG91dHB1dCwgc2l6ZW9mKG91dHB1dCkgLSAxKSxcbitcdFx0ICAgICAgXCJyZWN1cnNpdmVfdW5yZWFkYWJsZV9wbGFpblwiKSkge1xuK1x0XHRBU1NFUlRfSEFTX1NVQlNUUihvdXRwdXQsIHBsYWluLCBcInJlY3Vyc2l2ZV9wbGFpbl9wcmVzZXJ2ZXNfZXJyb3JzXCIpO1xuK1x0XHRBU1NFUlRfRVEoY291bnRfdG9rZW4ob3V0cHV0LCBzdHJlcnJvcihsb29rdXBfZXJybm8pKSwgMixcbitcdFx0XHQgIFwicmVjdXJzaXZlX3BsYWluX2Vycm9yc1wiKTtcbitcdFx0QVNTRVJUX0VRKGNvdW50X3Rva2VuKG91dHB1dCwgXCJGb3VuZCBcIiksIG91dGVyID8gMiA6IDEsXG4rXHRcdFx0ICBcInJlY3Vyc2l2ZV9wbGFpbl9tYXBzXCIpO1xuK1x0fVxuK291dDpcbitcdGlmIChvdXRlcl9mZCBcdTAwM2U9IDApXG4rXHRcdGNsb3NlKG91dGVyX2ZkKTtcbitcdGlmIChpbm5lcl9mZCBcdTAwM2U9IDApXG4rXHRcdGNsb3NlKGlubmVyX2ZkKTtcbit9XG4rXG4rc3RhdGljIHZvaWQgdGVzdF9tYW55X2lubmVyX21hcHMoYm9vbCBqc29uKVxuK3tcbitcdGVudW0ge1xuK1x0XHREVU1QX09LLFxuK1x0XHREVU1QX0VSUl9STElNSVQsXG4rXHRcdERVTVBfRVJSX0NPTU1BTkQsXG4rXHRcdERVTVBfRVJSX0NPVU5UUyxcbitcdFx0RFVNUF9FUlJfSURTLFxuK1x0XHREVU1QX0VSUl9KU09OLFxuK1x0XHREVU1QX0VSUl9GRFMsXG4rXHR9O1xuK1x0TElCQlBGX09QVFMoYnBmX21hcF9jcmVhdGVfb3B0cywgb3B0cyk7XG4rXHRjb25zdCBzdHJ1Y3QgcmxpbWl0IGxpbWl0ID0geyAucmxpbV9jdXIgPSAzMiwgLnJsaW1fbWF4ID0gMzIgfTtcbitcdGNoYXIgY29tbWFuZFtNQVhfQlBGVE9PTF9DTURfTEVOXSwgdG9rZW5bNjRdO1xuK1x0X191MzIgaWRzWzY0XSwgcm9vdF9pZCwga2V5O1xuK1x0aW50IGlubmVyX2ZkID0gLTEsIG91dGVyX2ZkID0gLTEsIHN0YXR1cztcbitcdGludCBpbmhlcml0ZWRfZmRzWzMyXSwgbnJfaW5oZXJpdGVkID0gMCwgaTtcbitcdGNoYXIgKm91dHB1dCA9IE5VTEw7XG4rXHRwaWRfdCBwaWQ7XG4rXG4rXHRpbm5lcl9mZCA9IGJwZl9tYXBfY3JlYXRlKEJQRl9NQVBfVFlQRV9IQVNILCBcImR1bXBfaW5uZXJcIiwgNCwgNCwgMSwgTlVMTCk7XG4rXHRpZiAoIUFTU0VSVF9PS19GRChpbm5lcl9mZCwgXCJjcmVhdGVfdGVtcGxhdGVcIikpXG4rXHRcdGdvdG8gb3V0O1xuK1x0b3B0cy5pbm5lcl9tYXBfZmQgPSBpbm5lcl9mZDtcbitcdG91dGVyX2ZkID0gYnBmX21hcF9jcmVhdGUoQlBGX01BUF9UWVBFX0FSUkFZX09GX01BUFMsIFwiZHVtcF9vdXRlclwiLCA0LCA0LFxuK1x0XHRcdFx0ICBBUlJBWV9TSVpFKGlkcyksIFx1MDAyNm9wdHMpO1xuK1x0Y2xvc2UoaW5uZXJfZmQpO1xuK1x0aW5uZXJfZmQgPSAtMTtcbitcdGlmICghQVNTRVJUX09LX0ZEKG91dGVyX2ZkLCBcImNyZWF0ZV9vdXRlclwiKSlcbitcdFx0Z290byBvdXQ7XG4rXHRmb3IgKGtleSA9IDA7IGtleSBcdTAwM2MgQVJSQVlfU0laRShpZHMpOyBrZXkrKykge1xuK1x0XHRpbm5lcl9mZCA9IGJwZl9tYXBfY3JlYXRlKEJQRl9NQVBfVFlQRV9IQVNILCBcImR1bXBfaW5uZXJcIiwgNCwgNCwgMSwgTlVMTCk7XG4rXHRcdGlmICghQVNTRVJUX09LX0ZEKGlubmVyX2ZkLCBcImNyZWF0ZV9pbm5lclwiKSB8fFxuK1x0XHQgICAgIUFTU0VSVF9PSyhicGZfbWFwX3VwZGF0ZV9lbGVtKG91dGVyX2ZkLCBcdTAwMjZrZXksIFx1MDAyNmlubmVyX2ZkLCBCUEZfQU5ZKSxcbitcdFx0XHQgICAgICAgXCJwb3B1bGF0ZV9vdXRlclwiKSlcbitcdFx0XHRnb3RvIG91dDtcbitcdFx0aWRzW2tleV0gPSBtYXBfaWQoaW5uZXJfZmQpO1xuK1x0XHRpZiAoIWlkc1trZXldKVxuK1x0XHRcdGdvdG8gb3V0O1xuK1x0XHQvKiBUaGUgb3V0ZXIgbWFwIGtlZXBzIGVhY2ggZGlzdGluY3QgaW5uZXIgbWFwIGFsaXZlLiAqL1xuK1x0XHRjbG9zZShpbm5lcl9mZCk7XG4rXHRcdGlubmVyX2ZkID0gLTE7XG4rXHR9XG4rXHRyb290X2lkID0gbWFwX2lkKG91dGVyX2ZkKTtcbitcdG91dHB1dCA9IGNhbGxvYygxLCA2NTUzNik7XG4rXHRpZiAoIXJvb3RfaWQgfHwgIUFTU0VSVF9PS19QVFIob3V0cHV0LCBcImFsbG9jYXRlX291dHB1dFwiKSlcbitcdFx0Z290byBvdXQ7XG4rXG4rXHQvKiBGaWxsIHRoZSBsb3cgRkQgc2xvdHMgdG8gZXhlcmNpc2UgaW5oZXJpdGVkIGRlc2NyaXB0b3IgY2xlYW51cC4gKi9cbitcdGZvciAoaSA9IDA7IGkgXHUwMDNjIEFSUkFZX1NJWkUoaW5oZXJpdGVkX2Zkcyk7IGkrKykge1xuK1x0XHRpbnQgZmQgPSBvcGVuKFwiL2Rldi9udWxsXCIsIE9fUkRPTkxZKTtcbitcbitcdFx0aWYgKCFBU1NFUlRfT0tfRkQoZmQsIFwib3Blbl9pbmhlcml0ZWRfZmRcIikpXG4rXHRcdFx0Z290byBvdXQ7XG4rXHRcdGluaGVyaXRlZF9mZHNbbnJfaW5oZXJpdGVkKytdID0gZmQ7XG4rXHR9XG4rXG4rXHQvKlxuK1x0ICogQ3JlYXRlIGFsbCBmaXh0dXJlcyBiZWZvcmUgbG93ZXJpbmcgdGhlIGxpbWl0LCBhbmQga2VlcCB0aGUgdGVzdFxuK1x0ICogcnVubmVyJ3MgbGltaXQgdW5jaGFuZ2VkLiBSZXRhaW5pbmcgZXZlcnkgZGlzY292ZXJlZCBGRCB3b3VsZCBleGNlZWRcbitcdCAqIHRoaXMgbGltaXQgYmVmb3JlIHRoZSByZWN1cnNpdmUgZHVtcCBjb3VsZCB2aXNpdCBhbGwgaW5uZXIgbWFwcy5cbitcdCAqL1xuK1x0cGlkID0gZm9yaygpO1xuK1x0aWYgKCFBU1NFUlRfR0UocGlkLCAwLCBcImZvcmtcIikpXG4rXHRcdGdvdG8gb3V0O1xuK1x0aWYgKCFwaWQpIHtcbitcdFx0c3RydWN0IGRpcmVudCAqZW50cnk7XG4rXHRcdERJUiAqZGlyO1xuK1xuK1x0XHQvKiBSZXNlcnZlIGEgc2xvdCBmb3IgdGhlIGRpcmVjdG9yeSBldmVuIGlmIHRoZSBwYXJlbnQgaXMgZnVsbC4gKi9cbitcdFx0Y2xvc2UoaW5oZXJpdGVkX2Zkc1tucl9pbmhlcml0ZWQgLSAxXSk7XG4rXHRcdGRpciA9IG9wZW5kaXIoXCIvcHJvYy9zZWxmL2ZkXCIpO1xuK1x0XHRpZiAoIWRpcilcbitcdFx0XHRfZXhpdChEVU1QX0VSUl9GRFMpO1xuK1x0XHQvKiBUaGUgcGFyZW50IGtlZXBzIHRoZSBvdXRlciBtYXAgYW5kIGl0cyBpbm5lciBtYXBzIGFsaXZlLiAqL1xuK1x0XHRmb3IgKDs7KSB7XG4rXHRcdFx0Y2hhciAqZW5kO1xuK1x0XHRcdGxvbmcgZmQ7XG4rXG4rXHRcdFx0ZXJybm8gPSAwO1xuK1x0XHRcdGVudHJ5ID0gcmVhZGRpcihkaXIpO1xuK1x0XHRcdGlmICghZW50cnkpIHtcbitcdFx0XHRcdGlmIChlcnJubylcbitcdFx0XHRcdFx0X2V4aXQoRFVNUF9FUlJfRkRTKTtcbitcdFx0XHRcdGJyZWFrO1xuK1x0XHRcdH1cbitcdFx0XHRmZCA9IHN0cnRvbChlbnRyeS1cdTAwM2VkX25hbWUsIFx1MDAyNmVuZCwgMTApO1xuK1x0XHRcdGlmICgqZW5kIHx8IGZkIFx1MDAzYyAzIHx8IGZkID09IGRpcmZkKGRpcikpXG4rXHRcdFx0XHRjb250aW51ZTtcbitcdFx0XHRjbG9zZShmZCk7XG4rXHRcdH1cbitcdFx0aWYgKGNsb3NlZGlyKGRpcikpXG4rXHRcdFx0X2V4aXQoRFVNUF9FUlJfRkRTKTtcbitcdFx0aWYgKHNldHJsaW1pdChSTElNSVRfTk9GSUxFLCBcdTAwMjZsaW1pdCkpXG4rXHRcdFx0X2V4aXQoRFVNUF9FUlJfUkxJTUlUKTtcbitcdFx0c25wcmludGYoY29tbWFuZCwgc2l6ZW9mKGNvbW1hbmQpLCBcIiVzIC1yIG1hcCBkdW1wIGlkICV1XCIsXG4rXHRcdFx0IGpzb24gPyBcIi1qXCIgOiBcIlwiLCByb290X2lkKTtcbitcdFx0aWYgKGdldF9icGZ0b29sX2NvbW1hbmRfb3V0cHV0KGNvbW1hbmQsIG91dHB1dCwgNjU1MzUpKVxuK1x0XHRcdF9leGl0KERVTVBfRVJSX0NPTU1BTkQpO1xuK1x0XHRpZiAoY291bnRfdG9rZW4ob3V0cHV0LCBqc29uID8gXCJcXFwiaWRcXFwiOlwiIDogXCJGb3VuZCBcIikgIT0gQVJSQVlfU0laRShpZHMpICsgMSB8fFxuK1x0XHQgICAgY291bnRfdG9rZW4ob3V0cHV0LCBqc29uID8gXCJcXFwiaW5uZXJfbWFwX2lkXFxcIjpcIiA6IFwiaW5uZXJfbWFwX2lkOlwiKSAhPVxuK1x0XHQgICAgQVJSQVlfU0laRShpZHMpKVxuK1x0XHRcdF9leGl0KERVTVBfRVJSX0NPVU5UUyk7XG4rXHRcdGZvciAoa2V5ID0gMDsga2V5IFx1MDAzYyBBUlJBWV9TSVpFKGlkcyk7IGtleSsrKSB7XG4rXHRcdFx0aWYgKGpzb24pXG4rXHRcdFx0XHRzbnByaW50Zih0b2tlbiwgc2l6ZW9mKHRva2VuKSwgXCJcXFwiaWRcXFwiOiV1LFwiLCBpZHNba2V5XSk7XG4rXHRcdFx0ZWxzZVxuK1x0XHRcdFx0c25wcmludGYodG9rZW4sIHNpemVvZih0b2tlbiksIFwiXFxuJXU6IGhhc2ggIG5hbWUgZHVtcF9pbm5lciAgXCIsXG4rXHRcdFx0XHRcdCBpZHNba2V5XSk7XG4rXHRcdFx0aWYgKGNvdW50X3Rva2VuKG91dHB1dCwgdG9rZW4pICE9IDEpXG4rXHRcdFx0XHRfZXhpdChEVU1QX0VSUl9JRFMpO1xuK1x0XHR9XG4rXHRcdGlmIChqc29uIFx1MDAyNlx1MDAyNiAob3V0cHV0WzBdICE9ICdbJyB8fFxuK1x0XHRcdCAgICAgc3RyY21wKG91dHB1dCArIHN0cmxlbihvdXRwdXQpIC0gMiwgXCJdXFxuXCIpKSlcbitcdFx0XHRfZXhpdChEVU1QX0VSUl9KU09OKTtcbitcdFx0X2V4aXQoRFVNUF9PSyk7XG4rXHR9XG4rXHRpZiAoQVNTRVJUX0VRKHdhaXRwaWQocGlkLCBcdTAwMjZzdGF0dXMsIDApLCBwaWQsIFwid2FpdHBpZFwiKSBcdTAwMjZcdTAwMjZcbitcdCAgICBBU1NFUlRfVFJVRShXSUZFWElURUQoc3RhdHVzKSwgXCJjaGlsZF9leGl0ZWRcIikpXG4rXHRcdEFTU0VSVF9FUShXRVhJVFNUQVRVUyhzdGF0dXMpLCBEVU1QX09LLCBcImR1bXBfd2l0aF9sb3dfZmRfbGltaXRcIik7XG4rXHRmb3IgKGkgPSAwOyBpIFx1MDAzYyBucl9pbmhlcml0ZWQ7IGkrKylcbitcdFx0QVNTRVJUX0dFKGZjbnRsKGluaGVyaXRlZF9mZHNbaV0sIEZfR0VURkQpLCAwLCBcInBhcmVudF9mZF9wcmVzZXJ2ZWRcIik7XG4rXHRBU1NFUlRfRVEobWFwX2lkKG91dGVyX2ZkKSwgcm9vdF9pZCwgXCJwYXJlbnRfb3V0ZXJfcHJlc2VydmVkXCIpO1xuK291dDpcbitcdHdoaWxlIChucl9pbmhlcml0ZWQpXG4rXHRcdGNsb3NlKGluaGVyaXRlZF9mZHNbLS1ucl9pbmhlcml0ZWRdKTtcbitcdGZyZWUob3V0cHV0KTtcbitcdGlmIChvdXRlcl9mZCBcdTAwM2U9IDApXG4rXHRcdGNsb3NlKG91dGVyX2ZkKTtcbitcdGlmIChpbm5lcl9mZCBcdTAwM2U9IDApXG4rXHRcdGNsb3NlKGlubmVyX2ZkKTtcbit9XG4rXG4rdm9pZCB0ZXN0X2JwZnRvb2xfbWFwX2R1bXAodm9pZClcbit7XG4rXHRpZiAodGVzdF9fc3RhcnRfc3VidGVzdChcInVucmVhZGFibGVfb3JkaW5hcnlcIikpXG4rXHRcdHRlc3RfdW5yZWFkYWJsZShmYWxzZSk7XG4rXHRpZiAodGVzdF9fc3RhcnRfc3VidGVzdChcInVucmVhZGFibGVfaW5uZXJcIikpXG4rXHRcdHRlc3RfdW5yZWFkYWJsZSh0cnVlKTtcbitcdGlmICh0ZXN0X19zdGFydF9zdWJ0ZXN0KFwibWFueV9pbm5lcl9tYXBzX2pzb25cIikpXG4rXHRcdHRlc3RfbWFueV9pbm5lcl9tYXBzKHRydWUpO1xuK1x0aWYgKHRlc3RfX3N0YXJ0X3N1YnRlc3QoXCJtYW55X2lubmVyX21hcHNfcGxhaW5cIikpXG4rXHRcdHRlc3RfbWFueV9pbm5lcl9tYXBzKGZhbHNlKTtcbitcdGlmICh0ZXN0X19zdGFydF9zdWJ0ZXN0KFwibXVsdGlwbGVfcm9vdHNcIikpXG4rXHRcdHRlc3RfbXVsdGlwbGVfcm9vdHMoKTtcbitcdGlmICh0ZXN0X19zdGFydF9zdWJ0ZXN0KFwiYXJyYXlfb2ZfbWFwc1wiKSlcbitcdFx0dGVzdF9vdXRlcihCUEZfTUFQX1RZUEVfQVJSQVlfT0ZfTUFQUywgMSwgZmFsc2UsIGZhbHNlKTtcbitcdGlmICh0ZXN0X19zdGFydF9zdWJ0ZXN0KFwiaGFzaF9vZl9tYXBzXCIpKVxuK1x0XHR0ZXN0X291dGVyKEJQRl9NQVBfVFlQRV9IQVNIX09GX01BUFMsIDEsIGZhbHNlLCBmYWxzZSk7XG4rXHRpZiAodGVzdF9fc3RhcnRfc3VidGVzdChcInNoYXJlZF9pbm5lclwiKSlcbitcdFx0dGVzdF9vdXRlcihCUEZfTUFQX1RZUEVfQVJSQVlfT0ZfTUFQUywgMiwgZmFsc2UsIGZhbHNlKTtcbitcdGlmICh0ZXN0X19zdGFydF9zdWJ0ZXN0KFwiZW1wdHlfYXJyYXlfb2ZfbWFwc1wiKSlcbitcdFx0dGVzdF9vdXRlcihCUEZfTUFQX1RZUEVfQVJSQVlfT0ZfTUFQUywgMCwgZmFsc2UsIGZhbHNlKTtcbitcdGlmICh0ZXN0X19zdGFydF9zdWJ0ZXN0KFwiZW1wdHlfaGFzaF9vZl9tYXBzXCIpKVxuK1x0XHR0ZXN0X291dGVyKEJQRl9NQVBfVFlQRV9IQVNIX09GX01BUFMsIDAsIGZhbHNlLCBmYWxzZSk7XG4rXHRpZiAodGVzdF9fc3RhcnRfc3VidGVzdChcImJ0Zl9pbm5lclwiKSlcbitcdFx0dGVzdF9vdXRlcihCUEZfTUFQX1RZUEVfSEFTSF9PRl9NQVBTLCAxLCBmYWxzZSwgdHJ1ZSk7XG4rXHRpZiAodGVzdF9fc3RhcnRfc3VidGVzdChcImVtcHR5X2lubmVyXCIpKVxuK1x0XHR0ZXN0X291dGVyKEJQRl9NQVBfVFlQRV9IQVNIX09GX01BUFMsIDEsIHRydWUsIGZhbHNlKTtcbit9XG4iLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOS0xMVQwNDowMDowMy4wODMyODcxMDFaIiwiU2VxIjozLCJOZXN0aW5nIjoyLCJUeXBlIjoibGxtIiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuNy1mbGFzaCIsIkR1cmF0aW9uIjoyNzMzODY5NDk0LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIqKk15IEFzc2Vzc21lbnQgb2YgdGhlIFBhdGNoKipcblxuT2theSwgc28gdGhlIGRpZmYgaXMgcHJldHR5IGZvY3VzZWQuIExvb2tpbmcgYXQgdGhlIGNoYW5nZXMsIGl0J3MgYWxsIGNvbnRhaW5lZCB3aXRoaW4gdGhlIGB0b29scy9gIGRpcmVjdG9yeSwgc3BlY2lmaWNhbGx5IGFyb3VuZCBgYnBmdG9vbGAgYW5kIGEgcmVsYXRlZCBzZWxmLXRlc3QuIExldCdzIHNlZS4uLlxuXG5CYXNlZCBvbiBteSB1bmRlcnN0YW5kaW5nIG9mIG91ciBydWxlcywgc3BlY2lmaWNhbGx5IFNlY3Rpb24gMiwgdGhpcyAqc2hvdWxkKiBiZSBhIHN0cmFpZ2h0Zm9yd2FyZCBcIldvcnRoRnV6emluZz1mYWxzZVwiIHNjZW5hcmlvLiBUaGUgbmVnYXRpdmUgY3JpdGVyaWEgYXJlIGNsZWFyIGhlcmU6IG5vbi1rZXJuZWwsIG5vbi1leGVjdXRhYmxlIGNoYW5nZXMuIFRoZSBtb2RpZmljYXRpb25zIHNlZW0gdG8gYmUgbGltaXRlZCB0byBkb2N1bWVudGF0aW9uIChgYnBmdG9vbC1tYXAucnN0YCksIGJhc2ggY29tcGxldGlvbiBzY3JpcHRzIChgYnBmdG9vbGApLCB0aGUgbWFpbiBhcHBsaWNhdGlvbiBjb2RlLCBoZWFkZXIgZmlsZXMgYW5kIHRoZSB1bml0IHRlc3RzLiBOb25lIG9mIHRoZXNlIGNoYW5nZXMgc2hvdWxkIGltcGFjdCB0aGUgY29tcGlsZWQga2VybmVsIGltYWdlIChgdm1saW51eGApIG9yIGFueSBrZXJuZWwgbW9kdWxlcy4gSXQncyBlc3NlbnRpYWxseSB1c2VyLXNwYWNlIHRvb2xzIGFuZCB0ZXN0aW5nLlxuXG5KdXN0IHRvIGJlIGFic29sdXRlbHkgY2VydGFpbiwgSSdsbCBydW4gYSBxdWljayBjaGVjaywgbWF5YmUgd2l0aCBgZ3JlcHBlcmAsIGp1c3QgdG8gYmUgdHJpcGxlIHN1cmUgbm8gdW5leHBlY3RlZCBtb2RpZmljYXRpb25zIHdlcmUgc251Y2sgaW4sIGJ1dCBiYXNlZCBvbiBteSBpbml0aWFsIHNjYW4sIHRoaXMgbG9va3MgbGlrZSBhIGNsZWFyLWN1dCBjYXNlIG9mIG5vbi1jcml0aWNhbCBtb2RpZmljYXRpb24uXG5cblxuIiwiSW5wdXRUb2tlbnMiOjE0MTIwLCJPdXRwdXRUb2tlbnMiOjE5LCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MzExLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDktMTFUMDQ6MDA6MDUuODE3MTU4NzA1WiIsIlNlcSI6NCwiTmVzdGluZyI6MiwiVHlwZSI6InRvb2wiLCJOYW1lIjoiZ3JlcHBlciIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjE5MDE4ODk4MjksIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJFeHByZXNzaW9uXCI6IFwiY29sbGVjdF9pbm5lcl9tYXBcIlxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiT3V0cHV0XCI6IFwidG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM9ODMwPXN0cnVjdCBtYXBfZHVtcF9jdHgge1xcbi0tXFxudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmMtODM1LVxcbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjgzNjpzdGF0aWMgaW50IGNvbGxlY3RfaW5uZXJfbWFwKHN0cnVjdCBtYXBfZHVtcF9jdHggKmN0eCwgX191MzIgaWQpXFxudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmMtODM3LXtcXG4tLVxcbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jPTg2Mj1tYXBfZHVtcChpbnQgZmQsIHN0cnVjdCBicGZfbWFwX2luZm8gKmluZm8sIGpzb25fd3JpdGVyX3QgKnd0cixcXG4tLVxcbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jLTkyOS1cXHRcXHRcXHRpZiAoY3R4IFxcdTAwMjZcXHUwMDI2IG1hcF9pc19tYXBfb2ZfbWFwcyhpbmZvLVxcdTAwM2V0eXBlKSkge1xcbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjkzMDpcXHRcXHRcXHRcXHRlcnIgPSBjb2xsZWN0X2lubmVyX21hcChjdHgsICooX191MzIgKil2YWx1ZSk7XFxudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmMtOTMxLVxcdFxcdFxcdFxcdGlmIChlcnIpXFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTExVDA0OjAwOjA3LjcxOTA1NDc5NFoiLCJTZXEiOjUsIk5lc3RpbmciOjIsIlR5cGUiOiJsbG0iLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy43LWZsYXNoIiwiRHVyYXRpb24iOjQwOTE0NTI4MTMsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IioqTXkgQXNzZXNzbWVudCBvZiB0aGUgUHJvcG9zZWQgQ2hhbmdlcyoqXG5cbk9rYXksIHNvIEknbSBsb29raW5nIGF0IHRoZXNlIGNoYW5nZXMsIGFuZCBmcm9tIG15IGV4cGVydCBwZXJzcGVjdGl2ZSwgaXQncyBwcmV0dHkgY2xlYXIgd2hlcmUgd2Ugc3RhbmQuIFRoZSBtb2RpZmljYXRpb25zIGFyZSAqc3RyaWN0bHkqIGNvbnRhaW5lZCB3aXRoaW4gdXNlci1zcGFjZSB0b29scy4gV2UncmUgdGFsa2luZyBzcGVjaWZpY2FsbHkgYWJvdXQgYGJwZnRvb2xgIHdpdGhpbiBgdG9vbHMvYnBmL2JwZnRvb2wvYCBhbmQgdGhlIHNlbGYtdGVzdHMgaW4gYHRvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2AuIFRoYXQgaW1tZWRpYXRlbHkgcmluZ3MgYSBiZWxsIGZvciBtZSwgYmVjYXVzZSBhbnkgYWx0ZXJhdGlvbnMgaW4gdGhvc2UgYXJlYXMgYXJlIGluaGVyZW50bHkgaXNvbGF0ZWQgZnJvbSB0aGUga2VybmVsIGl0c2VsZi5cblxuVGhlcmVmb3JlLCBhcHBseWluZyBvdXIgbmVnYXRpdmUgY3JpdGVyaWEsIGl0J3MgYSBzdHJhaWdodGZvcndhcmQgZGV0ZXJtaW5hdGlvbi4gU2luY2UgdGhlc2UgY2hhbmdlcyByZXNpZGUgd2l0aGluIHVzZXItc3BhY2UgZGlyZWN0b3JpZXMsIHNlbGYtdGVzdHMsIHNhbXBsZXMsIG9yIHNjcmlwdHMsIHRoZXkgKmRvIG5vdCogYWZmZWN0IHRoZSBjb21waWxlZCBrZXJuZWwgaW1hZ2UgKGB2bWxpbnV4YCkgb3IgYW55IG9mIHRoZSBrZXJuZWwgbW9kdWxlcy4gSW4gZXNzZW5jZSwgdGhleSBhcmUgc2lkZS1jYXIgc29mdHdhcmUgdGhhdCBpbnRlcmFjdHMgd2l0aCB0aGUga2VybmVsLlxuXG5HaXZlbiB0aGlzIGlzb2xhdGlvbiwgSSBjYW4gY29uZmlkZW50bHkgcnVsZSBvdXQgYW55IGZ1enppbmcgcmVxdWlyZW1lbnRzLiBgV29ydGhGdXp6aW5nYCBpcyBhIGhhcmQgXCJmYWxzZVwiIGhlcmUuIFNpbWlsYXJseSwgYW55IGNvbnNpZGVyYXRpb25zIGZvciBzcGVjaWZpYyBzeW1ib2xzIG9yIGNvbmZpZ3VyYXRpb25zIGFyZSB1bm5lY2Vzc2FyeS4gQm90aCBgRm9jdXNTeW1ib2xzYCBhbmQgYEVuYWJsZUNvbmZpZ3NgIGFyZSBjb3JyZWN0bHkgbnVsbCwgcmVwcmVzZW50ZWQgYXMgYW4gZW1wdHkgYXJyYXkgYFtdYC4gVGhleSBhcmUgbm90IHJlbGV2YW50IHRvIGlzb2xhdGVkIGNoYW5nZXMgaW4gdXNlci1zcGFjZSB0b29scy5cblxuV2l0aCB0aGlzIGFuYWx5c2lzIGNvbXBsZXRlLCBpdCdzIHRpbWUgdG8gY2FsbCBgc2V0LXJlc3VsdHNgLiBXZSBjYW4gcHJvY2VlZCBiYXNlZCBvbiB0aGlzIGFzc2Vzc21lbnQuXG5cblxuIiwiSW5wdXRUb2tlbnMiOjE0OTM3LCJPdXRwdXRUb2tlbnMiOjk0LCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MTMzLCJUb29sQ2FsbHMiOlsiZ3JlcHBlciJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTExVDA0OjAwOjExLjgxMDUxMDI0N1oiLCJTZXEiOjYsIk5lc3RpbmciOjIsIlR5cGUiOiJ0b29sIiwiTmFtZSI6InNldC1yZXN1bHRzIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6MzIwMDAsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJFbmFibGVDb25maWdzXCI6IFtdLFxuICBcIkZvY3VzU3ltYm9sc1wiOiBbXSxcbiAgXCJSZWFzb25pbmdcIjogXCJUaGUgcGF0Y2ggbW9kaWZpZXMgb25seSB1c2VyLXNwYWNlIHRvb2xpbmcgKGJwZnRvb2wgdW5kZXIgdG9vbHMvYnBmL2JwZnRvb2wvKSBhbmQgQlBGIHNlbGZ0ZXN0cyAodG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmLykuIEl0IGRvZXMgbm90IHRvdWNoIHRoZSBMaW51eCBrZXJuZWwgaW1hZ2Ugb3Iga2VybmVsIG1vZHVsZXMsIG1ha2luZyBpdCB1bnJlYWNoYWJsZSBmb3Igc3l6a2FsbGVyIGtlcm5lbCBmdXp6aW5nLlwiLFxuICBcIldvcnRoRnV6emluZ1wiOiBmYWxzZVxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiRW5hYmxlQ29uZmlnc1wiOiBudWxsLFxuICBcIkZvY3VzU3ltYm9sc1wiOiBbXSxcbiAgXCJSZWFzb25pbmdcIjogXCJUaGUgcGF0Y2ggbW9kaWZpZXMgb25seSB1c2VyLXNwYWNlIHRvb2xpbmcgKGJwZnRvb2wgdW5kZXIgdG9vbHMvYnBmL2JwZnRvb2wvKSBhbmQgQlBGIHNlbGZ0ZXN0cyAodG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmLykuIEl0IGRvZXMgbm90IHRvdWNoIHRoZSBMaW51eCBrZXJuZWwgaW1hZ2Ugb3Iga2VybmVsIG1vZHVsZXMsIG1ha2luZyBpdCB1bnJlYWNoYWJsZSBmb3Igc3l6a2FsbGVyIGtlcm5lbCBmdXp6aW5nLlwiLFxuICBcIldvcnRoRnV6emluZ1wiOiBmYWxzZVxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDktMTFUMDQ6MDA6MTEuODEwNTQ4MDc3WiIsIlNlcSI6NywiTmVzdGluZyI6MSwiVHlwZSI6ImFjdGlvbiIsIk5hbWUiOiJJZiIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjI2NDAsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJXb3J0aEZ1enppbmdcIjogZmFsc2Vcbn0iLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9XTsKCQkJaWYgKCFyYXdEYXRhIHx8IHJhd0RhdGEubGVuZ3RoID09PSAwKSByZXR1cm47CgoJCQlkcmF3U3VtbWFyeVRhYmxlcyhyYXdEYXRhKTsKCQkJZHJhd0R1cmF0aW9uQ2hhcnQocmF3RGF0YSk7CgkJCWRyYXdUb2tlbkNvbnN1bXB0aW9uQ2hhcnQocmF3RGF0YSk7CgkJfQoKCQlmdW5jdGlvbiBkcmF3U3VtbWFyeVRhYmxlcyhyYXdEYXRhKSB7CgkJCWNvbnN0IHN0YXRzID0gewoJCQkJbGxtOiB7IGNvdW50OiAwLCB0b2tlbnM6IDAsIGR1cmF0aW9uOiAwIH0sCgkJCQl0b29sOiB7IGNvdW50OiAwLCBkdXJhdGlvbjogMCB9CgkJCX07CgoJCQlyYXdEYXRhLmZvckVhY2gocyA9PiB7CgkJCQljb25zdCBkdXIgPSBzLkR1cmF0aW9uIC8gMTAwMDAwMDAwMDsgCgkJCQlpZiAocy5UeXBlID09PSAibGxtIikgewoJCQkJCXN0YXRzLmxsbS5jb3VudCsrOwoJCQkJCXN0YXRzLmxsbS50b2tlbnMgKz0gKHMuSW5wdXRUb2tlbnMgKyBzLk91dHB1dFRva2VucyArIHMuT3V0cHV0VGhvdWdodHNUb2tlbnMpOwoJCQkJCXN0YXRzLmxsbS5kdXJhdGlvbiArPSBkdXI7CgkJCQl9IGVsc2UgaWYgKHMuVHlwZSA9PT0gInRvb2wiKSB7CgkJCQkJc3RhdHMudG9vbC5jb3VudCsrOwoJCQkJCXN0YXRzLnRvb2wuZHVyYXRpb24gKz0gZHVyOwoJCQkJfQoJCQl9KTsKCgkJCWNvbnN0IGF2Z0xsbUR1ciA9IHN0YXRzLmxsbS5jb3VudCA+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-workflowhr8tv[0].run-triage(0) Phase: Succeeded StartedAt: 2026-09-11 03:58:28 +0000 UTC FinishedAt: 2026-09-11 04:00:13 +0000 UTC Input: nil Output: &Outputs{Parameters:[]Parameter{Parameter{Name:result,Default:nil,Value:*{ "skip_reason": "AI determined the patch has no functional impact", "targets": null, "trajectory": "CjwhZG9jdHlwZSBodG1sPgo8aHRtbD4KPGhlYWQ+Cgk8dGl0bGU+QUkgVHJhamVjdG9yeTwvdGl0bGU+Cgk8c3R5bGU+CgkJdGFibGUgewoJCQlib3JkZXI6IDFweCBzb2xpZCAjY2NjOwoJCQltYXJnaW46IDIwcHggNXB4OwoJCQlib3JkZXItY29sbGFwc2U6IGNvbGxhcHNlOwoJCQl3aGl0ZS1zcGFjZTogbm93cmFwOwoJCQl0ZXh0LW92ZXJmbG93OiBlbGxpcHNpczsKCQkJb3ZlcmZsb3c6IGhpZGRlbjsKCQl9CgoJCXRhYmxlIGNhcHRpb24gewoJCQlmb250LXdlaWdodDogYm9sZDsKCQl9CgoJCXRhYmxlIHRkLCB0YWJsZSB0aCB7CgkJCXZlcnRpY2FsLWFsaWduOiB0b3A7CgkJCXBhZGRpbmc6IDJweCA4cHg7CgkJCXRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzOwoJCQlvdmVyZmxvdzogaGlkZGVuOwoJCX0KCgkJLmxpc3RfdGFibGUgdGQsIC5saXN0X3RhYmxlIHRoIHsKCQkJYm9yZGVyLWxlZnQ6IDFweCBzb2xpZCAjY2NjOwoJCX0KCgkJLmxpc3RfdGFibGUgdGggewoJCQliYWNrZ3JvdW5kOiAjRjRGNEY0OwoJCX0KCgkJLmxpc3RfdGFibGUgdHI6bnRoLWNoaWxkKDJuKSB7CgkJCWJhY2tncm91bmQ6ICNGNEY0RjQ7CgkJfQoKCQkubGlzdF90YWJsZSB0cjpob3ZlciB7CgkJCWJhY2tncm91bmQ6ICNmZmZmOTk7CgkJfQoKCQkjYWlfZGV0YWlsc19kaXYgcHJlIHsKCQkJbWFyZ2luOiAxcHg7CgkJCW1heC13aWR0aDogMTIwY2g7CgkJCXdoaXRlLXNwYWNlOiBwcmUtd3JhcDsKCQkJb3ZlcmZsb3ctd3JhcDogYnJlYWstd29yZDsKCQl9Cgk8L3N0eWxlPgo8L2hlYWQ+Cjxib2R5PgoJPGgxPkFJIFRyYWplY3Rvcnk8L2gxPgoJPGJyPgoKCQoJPHRhYmxlIGNsYXNzPSJsaXN0X3RhYmxlIj4KCQk8Y2FwdGlvbj5UcmFqZWN0b3J5OiAoPGEgaHJlZj0iIyIgb25jbGljaz0idG9nZ2xlQWxsRGV0YWlscygpOyByZXR1cm4gZmFsc2U7Ij5FeHBhbmQvQ29sbGFwc2UgQWxsPC9hPik8L2NhcHRpb24+CgkJPHRoZWFkPjx0cj4KCQkJPHRoPlNlcTwvdGg+CgkJCTx0aD5UaW1lc3RhbXA8L3RoPgoJCQk8dGg+VHlwZTwvdGg+CgkJCTx0aD5OYW1lPC90aD4KCQkJPHRoPkR1cmF0aW9uPC90aD4KCQk8L3RyPjwvdGhlYWQ+CgkJPHRib2R5PgoJCQoJCTx0cj4KCQkJPHRkPjAvMDwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzExIDA0OjAwPC90ZD4KCQkJPHRkPmZsb3c8L3RkPgoJCQk8dGQ+cGF0Y2gtdHJpYWdlPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RW5hYmxlQ29uZmlncyYjMzQ7OiBudWxsLAogICYjMzQ7Rm9jdXNTeW1ib2xzJiMzNDs6IFtdLAogICYjMzQ7S01TQU5SZWFzb25pbmcmIzM0OzogJiMzNDsmIzM0OywKICAmIzM0O05lZWRzS01TQU4mIzM0OzogZmFsc2UsCiAgJiMzNDtSZWFzb25pbmcmIzM0OzogJiMzNDtUaGUgcGF0Y2ggbW9kaWZpZXMgb25seSB1c2VyLXNwYWNlIHRvb2xpbmcgKGJwZnRvb2wgdW5kZXIgdG9vbHMvYnBmL2JwZnRvb2wvKSBhbmQgQlBGIHNlbGZ0ZXN0cyAodG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmLykuIEl0IGRvZXMgbm90IHRvdWNoIHRoZSBMaW51eCBrZXJuZWwgaW1hZ2Ugb3Iga2VybmVsIG1vZHVsZXMsIG1ha2luZyBpdCB1bnJlYWNoYWJsZSBmb3Igc3l6a2FsbGVyIGtlcm5lbCBmdXp6aW5nLiYjMzQ7LAogICYjMzQ7V29ydGhGdXp6aW5nJiMzNDs6IGZhbHNlCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4xLzE8L3RkPgoJCQk8dGQ+MjAyNi8wOS8xMSAwNDowMDwvdGQ+CgkJCTx0ZD5hY3Rpb248L3RkPgoJCQk8dGQ+cmVhZC1wYXRjaC1kaWZmPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7UGF0Y2hEaWZmJiMzNDs6ICYjMzQ7Y29tbWl0IDUwODA4ZjZlODc4Zjg4OWUwYTM0MDc5YTk0NTZjMDMzNGM1MjIyMGRcbkF1dGhvcjogc3l6LWNsdXN0ZXIgXHUwMDNjdHJpYWdlQHN5emthbGxlci5jb21cdTAwM2VcbkRhdGU6ICAgRnJpIFNlcCAxMSAwNDowMDowMSAyMDI2ICYjNDM7MDAwMFxuXG4gICAgc3l6LWNsdXN0ZXI6IGFwcGxpZWQgcGF0Y2ggdW5kZXIgcmV2aWV3XG5cbmRpZmYgLS1naXQgYS90b29scy9icGYvYnBmdG9vbC9Eb2N1bWVudGF0aW9uL2JwZnRvb2wtbWFwLnJzdCBiL3Rvb2xzL2JwZi9icGZ0b29sL0RvY3VtZW50YXRpb24vYnBmdG9vbC1tYXAucnN0XG5pbmRleCA1ZGFmM2RlNWM3NDQ2Li4yM2ZhYTY3MjY4NTg3IDEwMDY0NFxuLS0tIGEvdG9vbHMvYnBmL2JwZnRvb2wvRG9jdW1lbnRhdGlvbi9icGZ0b29sLW1hcC5yc3RcbiYjNDM7JiM0MzsmIzQzOyBiL3Rvb2xzL2JwZi9icGZ0b29sL0RvY3VtZW50YXRpb24vYnBmdG9vbC1tYXAucnN0XG5AQCAtMTYsNyAmIzQzOzE2LDggQEAgU1lOT1BTSVNcbiBcbiAqKmJwZnRvb2wqKiBbKk9QVElPTlMqXSAqKm1hcCoqICpDT01NQU5EKlxuIFxuLSpPUFRJT05TKiA6PSB7IHxDT01NT05fT1BUSU9OU3wgfCB7ICoqLWYqKiB8ICoqLS1icGZmcyoqIH0gfCB7ICoqLW4qKiB8ICoqLS1ub21vdW50KiogfSB9XG4mIzQzOypPUFRJT05TKiA6PSB7IHxDT01NT05fT1BUSU9OU3wgfCB7ICoqLWYqKiB8ICoqLS1icGZmcyoqIH0gfFxuJiM0Mzt7ICoqLW4qKiB8ICoqLS1ub21vdW50KiogfSB8IHsgKiotcioqIHwgKiotLXJlY3Vyc2l2ZSoqIH0gfVxuIFxuICpDT01NQU5EUyogOj1cbiB7ICoqc2hvdyoqIHwgKipsaXN0KiogfCAqKmNyZWF0ZSoqIHwgKipkdW1wKiogfCAqKnVwZGF0ZSoqIHwgKipsb29rdXAqKiB8ICoqZ2V0bmV4dCoqIHxcbkBAIC0xNzAsNiAmIzQzOzE3MSwyNSBAQCBPUFRJT05TXG4gICAgIERvIG5vdCBhdXRvbWF0aWNhbGx5IGF0dGVtcHQgdG8gbW91bnQgYW55IHZpcnR1YWwgZmlsZSBzeXN0ZW0gKHN1Y2ggYXNcbiAgICAgdHJhY2VmcyBvciBCUEYgdmlydHVhbCBmaWxlIHN5c3RlbSkgd2hlbiBuZWNlc3NhcnkuXG4gXG4mIzQzOy1yLCAtLXJlY3Vyc2l2ZVxuJiM0MzsgICAgQWxzbyBkdW1wIHRoZSBpbm5lciBtYXBzIHJlZmVyZW5jZWQgYnkgKiphcnJheV9vZl9tYXBzKiogYW5kICoqaGFzaF9vZl9tYXBzKipcbiYjNDM7ICAgIGVudHJpZXMgd2hlbiBydW5uaW5nICoqbWFwIGR1bXAqKi4gRWFjaCBtYXAgSUQgaXMgdmlzaXRlZCBvbmNlLCBldmVuIGlmXG4mIzQzOyAgICBzZXZlcmFsIGVudHJpZXMgcmVmZXIgdG8gaXQuIFNlbGVjdGVkIG1hcHMgYXJlIGZvbGxvd2VkIGJ5IHRoZWlyIGlubmVyIG1hcHMuXG4mIzQzO1xuJiM0MzsgICAgUGxhaW4gb3V0cHV0IGluY2x1ZGVzIGEgaGVhZGVyIGlkZW50aWZ5aW5nIGVhY2ggbWFwLiBPbiBzdWNjZXNzLCBKU09OIG91dHB1dFxuJiM0MzsgICAgaXMgYWx3YXlzIGFuIGFycmF5IG9mIG1hcCBvYmplY3RzLCBlYWNoIGNvbnRhaW5pbmcgYW4gKippZCoqIGFuZCBhblxuJiM0MzsgICAgKiplbGVtZW50cyoqIGFycmF5LCBpbmNsdWRpbmcgd2hlbiBvbmx5IG9uZSBtYXAgaXMgZHVtcGVkLiBPdXRlciBtYXAgZW50cmllc1xuJiM0MzsgICAgcmV0YWluIHRoZWlyICoqaW5uZXJfbWFwX2lkKiogZmllbGQsIHdoaWNoIGlkZW50aWZpZXMgdGhlIGNvcnJlc3BvbmRpbmcgaW5uZXJcbiYjNDM7ICAgIG1hcCBvYmplY3QuXG4mIzQzO1xuJiM0MzsgICAgSW5uZXIgbWFwIElEcyBhcmUgcmVzb2x2ZWQgd2hlbiB0aGUgbWFwcyBhcmUgdmlzaXRlZC4gVGhlIGR1bXAgaXMgbm90IGFuXG4mIzQzOyAgICBhdG9taWMgc25hcHNob3Q6IGNvbmN1cnJlbnQgdXBkYXRlcyBjYW4gY2hhbmdlIG1hcCBjb250ZW50cyBvciByZW1vdmUgYVxuJiM0MzsgICAgcmVmZXJlbmNlZCBpbm5lciBtYXAgYmVmb3JlIGl0IGlzIHZpc2l0ZWQuIEZhaWx1cmUgdG8gb3BlbiBhIHJlZmVyZW5jZWRcbiYjNDM7ICAgIGlubmVyIG1hcCBzdG9wcyB0aGUgZHVtcCBhbmQgcmV0dXJucyBhIG5vbnplcm8gZXhpdCBzdGF0dXMuIE91dHB1dCBtYXlcbiYjNDM7ICAgIGNvbnRhaW4gbWFwcyBvciBlbnRyaWVzIHByaW50ZWQgYmVmb3JlIHRoZSBlcnJvci5cbiYjNDM7XG4mIzQzOyAgICBJbiBKU09OIG1vZGUsIHRoZSBlbmNsb3NpbmcgYXJyYXlzIGFuZCBvYmplY3RzIGFyZSBjbG9zZWQgYmVmb3JlIHJldHVybmluZy5cbiYjNDM7XG4gRVhBTVBMRVNcbiA9PT09PT09PVxuICoqIyBicGZ0b29sIG1hcCBzaG93KipcbmRpZmYgLS1naXQgYS90b29scy9icGYvYnBmdG9vbC9iYXNoLWNvbXBsZXRpb24vYnBmdG9vbCBiL3Rvb2xzL2JwZi9icGZ0b29sL2Jhc2gtY29tcGxldGlvbi9icGZ0b29sXG5pbmRleCA3NWNiY2I1MTJlYmFlLi40NWMzMzZkNjNiZTBhIDEwMDY0NFxuLS0tIGEvdG9vbHMvYnBmL2JwZnRvb2wvYmFzaC1jb21wbGV0aW9uL2JwZnRvb2xcbiYjNDM7JiM0MzsmIzQzOyBiL3Rvb2xzL2JwZi9icGZ0b29sL2Jhc2gtY29tcGxldGlvbi9icGZ0b29sXG5AQCAtMjYxLDcgJiM0MzsyNjEsNyBAQCBfYnBmdG9vbCgpXG4gXG4gICAgICMgRGVhbCB3aXRoIG9wdGlvbnNcbiAgICAgaWYgW1sgJHt3b3Jkc1tjd29yZF19ID09IC0qIF1dOyB0aGVuXG4tICAgICAgICBsb2NhbCBjPSYjMzk7LS12ZXJzaW9uIC0tanNvbiAtLXByZXR0eSAtLWJwZmZzIC0tbWFwY29tcGF0IC0tZGVidWcgXFxcbiYjNDM7ICAgICAgICBsb2NhbCBjPSYjMzk7LS12ZXJzaW9uIC0tanNvbiAtLXByZXR0eSAtLXJlY3Vyc2l2ZSAtLWJwZmZzIC0tbWFwY29tcGF0IC0tZGVidWcgXFxcbiAgICAgICAgICAgICAtLXVzZS1sb2FkZXIgLS1iYXNlLWJ0ZiAtLXNpZ24gLWkgLWsmIzM5O1xuICAgICAgICAgQ09NUFJFUExZPSggJCggY29tcGdlbiAtVyBcJiMzNDskY1wmIzM0OyAtLSBcJiMzNDskY3VyXCYjMzQ7ICkgKVxuICAgICAgICAgcmV0dXJuIDBcbmRpZmYgLS1naXQgYS90b29scy9icGYvYnBmdG9vbC9tYWluLmMgYi90b29scy9icGYvYnBmdG9vbC9tYWluLmNcbmluZGV4IDVhYmFiZDhmN2QwYTAuLmMwZjRkZjEwMTAyMTIgMTAwNjQ0XG4tLS0gYS90b29scy9icGYvYnBmdG9vbC9tYWluLmNcbiYjNDM7JiM0MzsmIzQzOyBiL3Rvb2xzL2JwZi9icGZ0b29sL21haW4uY1xuQEAgLTI2LDYgJiM0MzsyNiw3IEBAIHN0YXRpYyBpbnQgKCpsYXN0X2RvX2hlbHApKGludCBhcmdjLCBjaGFyICoqYXJndik7XG4ganNvbl93cml0ZXJfdCAqanNvbl93dHI7XG4gYm9vbCBwcmV0dHlfb3V0cHV0O1xuIGJvb2wganNvbl9vdXRwdXQ7XG4mIzQzO2Jvb2wgcmVjdXJzaXZlX2R1bXA7XG4gYm9vbCBzaG93X3Bpbm5lZDtcbiBib29sIGJsb2NrX21vdW50O1xuIGJvb2wgdmVyaWZpZXJfbG9ncztcbkBAIC00NTYsNiAmIzQzOzQ1Nyw3IEBAIGludCBtYWluKGludCBhcmdjLCBjaGFyICoqYXJndilcbiBcdFx0eyBcJiMzNDtqc29uXCYjMzQ7LFx0bm9fYXJndW1lbnQsXHROVUxMLFx0JiMzOTtqJiMzOTsgfSxcbiBcdFx0eyBcJiMzNDtoZWxwXCYjMzQ7LFx0bm9fYXJndW1lbnQsXHROVUxMLFx0JiMzOTtoJiMzOTsgfSxcbiBcdFx0eyBcJiMzNDtwcmV0dHlcJiMzNDssXHRub19hcmd1bWVudCxcdE5VTEwsXHQmIzM5O3AmIzM5OyB9LFxuJiM0MztcdFx0eyBcJiMzNDtyZWN1cnNpdmVcJiMzNDssXHRub19hcmd1bWVudCxcdE5VTEwsXHQmIzM5O3ImIzM5OyB9LFxuIFx0XHR7IFwmIzM0O3ZlcnNpb25cJiMzNDssXHRub19hcmd1bWVudCxcdE5VTEwsXHQmIzM5O1YmIzM5OyB9LFxuIFx0XHR7IFwmIzM0O2JwZmZzXCYjMzQ7LFx0bm9fYXJndW1lbnQsXHROVUxMLFx0JiMzOTtmJiMzOTsgfSxcbiBcdFx0eyBcJiMzNDttYXBjb21wYXRcJiMzNDssXHRub19hcmd1bWVudCxcdE5VTEwsXHQmIzM5O20mIzM5OyB9LFxuQEAgLTQ3OSw3ICYjNDM7NDgxLDcgQEAgaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KVxuIFx0YmluX25hbWUgPSBcJiMzNDticGZ0b29sXCYjMzQ7O1xuIFxuIFx0b3B0ZXJyID0gMDtcbi1cdHdoaWxlICgob3B0ID0gZ2V0b3B0X2xvbmcoYXJnYywgYXJndiwgXCYjMzQ7VmhwamZMbW5kU2k6azpCOmxcJiMzNDssXG4mIzQzO1x0d2hpbGUgKChvcHQgPSBnZXRvcHRfbG9uZyhhcmdjLCBhcmd2LCBcJiMzNDtWaHBqcmZMbW5kU2k6azpCOmxcJiMzNDssXG4gXHRcdFx0XHQgIG9wdGlvbnMsIE5VTEwpKSBcdTAwM2U9IDApIHtcbiBcdFx0c3dpdGNoIChvcHQpIHtcbiBcdFx0Y2FzZSAmIzM5O1YmIzM5OzpcbkBAIC01MDEsNiAmIzQzOzUwMyw5IEBAIGludCBtYWluKGludCBhcmdjLCBjaGFyICoqYXJndilcbiBcdFx0XHR9XG4gXHRcdFx0anNvbndfcHJldHR5KGpzb25fd3RyLCBwcmV0dHlfb3V0cHV0KTtcbiBcdFx0XHRicmVhaztcbiYjNDM7XHRcdGNhc2UgJiMzOTtyJiMzOTs6XG4mIzQzO1x0XHRcdHJlY3Vyc2l2ZV9kdW1wID0gdHJ1ZTtcbiYjNDM7XHRcdFx0YnJlYWs7XG4gXHRcdGNhc2UgJiMzOTtmJiMzOTs6XG4gXHRcdFx0c2hvd19waW5uZWQgPSB0cnVlO1xuIFx0XHRcdGJyZWFrO1xuZGlmZiAtLWdpdCBhL3Rvb2xzL2JwZi9icGZ0b29sL21haW4uaCBiL3Rvb2xzL2JwZi9icGZ0b29sL21haW4uaFxuaW5kZXggOTMxNWExZGIxZjdjMi4uNDNlZjBhYTU5MmRiNiAxMDA2NDRcbi0tLSBhL3Rvb2xzL2JwZi9icGZ0b29sL21haW4uaFxuJiM0MzsmIzQzOyYjNDM7IGIvdG9vbHMvYnBmL2JwZnRvb2wvbWFpbi5oXG5AQCAtODMsNiAmIzQzOzgzLDcgQEAgZXh0ZXJuIGNvbnN0IGNoYXIgKmJpbl9uYW1lO1xuIFxuIGV4dGVybiBqc29uX3dyaXRlcl90ICpqc29uX3d0cjtcbiBleHRlcm4gYm9vbCBqc29uX291dHB1dDtcbiYjNDM7ZXh0ZXJuIGJvb2wgcmVjdXJzaXZlX2R1bXA7XG4gZXh0ZXJuIGJvb2wgc2hvd19waW5uZWQ7XG4gZXh0ZXJuIGJvb2wgc2hvd19waWRzO1xuIGV4dGVybiBib29sIGJsb2NrX21vdW50O1xuZGlmZiAtLWdpdCBhL3Rvb2xzL2JwZi9icGZ0b29sL21hcC5jIGIvdG9vbHMvYnBmL2JwZnRvb2wvbWFwLmNcbmluZGV4IDY4NGE4ZmI3MjQxNDYuLmMwNTA1ZjUwNDk2NzQgMTAwNjQ0XG4tLS0gYS90b29scy9icGYvYnBmdG9vbC9tYXAuY1xuJiM0MzsmIzQzOyYjNDM7IGIvdG9vbHMvYnBmL2JwZnRvb2wvbWFwLmNcbkBAIC0xNyw2ICYjNDM7MTcsNyBAQFxuICNpbmNsdWRlIFx1MDAzY2JwZi9icGYuaFx1MDAzZVxuICNpbmNsdWRlIFx1MDAzY2JwZi9idGYuaFx1MDAzZVxuICNpbmNsdWRlIFx1MDAzY2JwZi9oYXNobWFwLmhcdTAwM2VcbiYjNDM7I2luY2x1ZGUgXHUwMDNjYnBmL2xpYmJwZl9pbnRlcm5hbC5oXHUwMDNlXG4gXG4gI2luY2x1ZGUgXCYjMzQ7anNvbl93cml0ZXIuaFwmIzM0O1xuICNpbmNsdWRlIFwmIzM0O21haW4uaFwmIzM0O1xuQEAgLTgyNiwxMiAmIzQzOzgyNyw0NCBAQCBzdGF0aWMgdm9pZCBmcmVlX21hcF9rdl9idGYoc3RydWN0IGJ0ZiAqYnRmKVxuIFx0XHRidGZfX2ZyZWUoYnRmKTtcbiB9XG4gXG4mIzQzO3N0cnVjdCBtYXBfZHVtcF9jdHgge1xuJiM0MztcdHN0cnVjdCBoYXNobWFwICpzZWVuO1xuJiM0MztcdF9fdTMyICpwZW5kaW5nX2lkcztcbiYjNDM7XHRzaXplX3QgcGVuZGluZ19jbnQ7XG4mIzQzO307XG4mIzQzO1xuJiM0MztzdGF0aWMgaW50IGNvbGxlY3RfaW5uZXJfbWFwKHN0cnVjdCBtYXBfZHVtcF9jdHggKmN0eCwgX191MzIgaWQpXG4mIzQzO3tcbiYjNDM7XHRfX3UzMiAqaWRzO1xuJiM0MztcdGludCBlcnI7XG4mIzQzO1xuJiM0MztcdGlmIChoYXNobWFwX19maW5kKGN0eC1cdTAwM2VzZWVuLCBpZCwgTlVMTCkpXG4mIzQzO1x0XHRyZXR1cm4gMDtcbiYjNDM7XG4mIzQzO1x0aWRzID0gbGliYnBmX3JlYWxsb2NhcnJheShjdHgtXHUwMDNlcGVuZGluZ19pZHMsIGN0eC1cdTAwM2VwZW5kaW5nX2NudCAmIzQzOyAxLFxuJiM0MztcdFx0XHRcdCAgc2l6ZW9mKCppZHMpKTtcbiYjNDM7XHRpZiAoIWlkcykge1xuJiM0MztcdFx0cF9lcnIoXCYjMzQ7bWVtIGFsbG9jIGZhaWxlZFwmIzM0Oyk7XG4mIzQzO1x0XHRyZXR1cm4gLTE7XG4mIzQzO1x0fVxuJiM0MztcdGN0eC1cdTAwM2VwZW5kaW5nX2lkcyA9IGlkcztcbiYjNDM7XG4mIzQzO1x0ZXJyID0gaGFzaG1hcF9fYWRkKGN0eC1cdTAwM2VzZWVuLCBpZCwgMCk7XG4mIzQzO1x0aWYgKGVycikge1xuJiM0MztcdFx0cF9lcnIoXCYjMzQ7ZmFpbGVkIHRvIHJlY29yZCBpbm5lciBtYXAgaWQgJXU6ICVzXCYjMzQ7LCBpZCwgc3RyZXJyb3IoLWVycikpO1xuJiM0MztcdFx0cmV0dXJuIC0xO1xuJiM0MztcdH1cbiYjNDM7XHRpZHNbY3R4LVx1MDAzZXBlbmRpbmdfY250JiM0MzsmIzQzO10gPSBpZDtcbiYjNDM7XHRyZXR1cm4gMDtcbiYjNDM7fVxuJiM0MztcbiBzdGF0aWMgaW50XG4gbWFwX2R1bXAoaW50IGZkLCBzdHJ1Y3QgYnBmX21hcF9pbmZvICppbmZvLCBqc29uX3dyaXRlcl90ICp3dHIsXG4tXHQgYm9vbCBzaG93X2hlYWRlcilcbiYjNDM7XHQgYm9vbCBzaG93X2hlYWRlciwgc3RydWN0IG1hcF9kdW1wX2N0eCAqY3R4KVxuIHtcbiBcdHZvaWQgKmtleSwgKnZhbHVlLCAqcHJldl9rZXk7XG4gXHR1bnNpZ25lZCBpbnQgbnVtX2VsZW1zID0gMDtcbiYjNDM7XHRqc29uX3dyaXRlcl90ICpwbGFpbl9idGZfd3RyID0gTlVMTDtcbiBcdHN0cnVjdCBidGYgKmJ0ZiA9IE5VTEw7XG4gXHRpbnQgZXJyO1xuIFxuQEAgLTg0NSw2ICYjNDM7ODc4LDE3IEBAIG1hcF9kdW1wKGludCBmZCwgc3RydWN0IGJwZl9tYXBfaW5mbyAqaW5mbywganNvbl93cml0ZXJfdCAqd3RyLFxuIFxuIFx0cHJldl9rZXkgPSBOVUxMO1xuIFxuJiM0MztcdGlmIChjdHggXHUwMDI2XHUwMDI2ICF3dHIgXHUwMDI2XHUwMDI2IChpbmZvLVx1MDAzZWJ0Zl92YWx1ZV90eXBlX2lkIHx8XG4mIzQzO1x0XHRcdCAgICBpbmZvLVx1MDAzZWJ0Zl92bWxpbnV4X3ZhbHVlX3R5cGVfaWQpKSB7XG4mIzQzO1x0XHRwbGFpbl9idGZfd3RyID0gZ2V0X2J0Zl93cml0ZXIoKTtcbiYjNDM7XHRcdGlmIChwbGFpbl9idGZfd3RyKSB7XG4mIzQzO1x0XHRcdGlmIChzaG93X2hlYWRlcilcbiYjNDM7XHRcdFx0XHRzaG93X21hcF9oZWFkZXJfcGxhaW4oaW5mbyk7XG4mIzQzO1x0XHRcdHNob3dfaGVhZGVyID0gZmFsc2U7XG4mIzQzO1x0XHRcdHd0ciA9IHBsYWluX2J0Zl93dHI7XG4mIzQzO1x0XHR9XG4mIzQzO1x0fVxuJiM0MztcbiBcdGlmICh3dHIpIHtcbiBcdFx0ZXJyID0gZ2V0X21hcF9rdl9idGYoaW5mbywgXHUwMDI2YnRmKTtcbiBcdFx0aWYgKGVycikge1xuQEAgLTg3NCwxMCAmIzQzOzkxOCwyMCBAQCBtYXBfZHVtcChpbnQgZmQsIHN0cnVjdCBicGZfbWFwX2luZm8gKmluZm8sIGpzb25fd3JpdGVyX3QgKnd0cixcbiBcdFx0aWYgKGVycikge1xuIFx0XHRcdGlmIChlcnJubyA9PSBFTk9FTlQpXG4gXHRcdFx0XHRlcnIgPSAwO1xuJiM0MztcdFx0XHRlbHNlIGlmIChjdHgpXG4mIzQzO1x0XHRcdFx0cF9lcnIoXCYjMzQ7Y2FuJiMzOTt0IGdldCBuZXh0IGtleSBmb3IgbWFwIGlkICV1OiAlc1wmIzM0OyxcbiYjNDM7XHRcdFx0XHQgICAgICBpbmZvLVx1MDAzZWlkLCBzdHJlcnJvcihlcnJubykpO1xuIFx0XHRcdGJyZWFrO1xuIFx0XHR9XG4tXHRcdGlmICghZHVtcF9tYXBfZWxlbShmZCwga2V5LCB2YWx1ZSwgaW5mbywgYnRmLCB3dHIpKVxuJiM0MztcdFx0ZXJyID0gZHVtcF9tYXBfZWxlbShmZCwga2V5LCB2YWx1ZSwgaW5mbywgYnRmLCB3dHIpO1xuJiM0MztcdFx0aWYgKCFlcnIpIHtcbiBcdFx0XHRudW1fZWxlbXMmIzQzOyYjNDM7O1xuJiM0MztcdFx0XHRpZiAoY3R4IFx1MDAyNlx1MDAyNiBtYXBfaXNfbWFwX29mX21hcHMoaW5mby1cdTAwM2V0eXBlKSkge1xuJiM0MztcdFx0XHRcdGVyciA9IGNvbGxlY3RfaW5uZXJfbWFwKGN0eCwgKihfX3UzMiAqKXZhbHVlKTtcbiYjNDM7XHRcdFx0XHRpZiAoZXJyKVxuJiM0MztcdFx0XHRcdFx0YnJlYWs7XG4mIzQzO1x0XHRcdH1cbiYjNDM7XHRcdH1cbiBcdFx0cHJldl9rZXkgPSBrZXk7XG4gXHR9XG4gXG5AQCAtODk0LDE4ICYjNDM7OTQ4LDI1IEBAIG1hcF9kdW1wKGludCBmZCwgc3RydWN0IGJwZl9tYXBfaW5mbyAqaW5mbywganNvbl93cml0ZXJfdCAqd3RyLFxuIFx0ZnJlZShrZXkpO1xuIFx0ZnJlZSh2YWx1ZSk7XG4gXHRmcmVlX21hcF9rdl9idGYoYnRmKTtcbiYjNDM7XHRpZiAocGxhaW5fYnRmX3d0cilcbiYjNDM7XHRcdGpzb253X2Rlc3Ryb3koXHUwMDI2cGxhaW5fYnRmX3d0cik7XG4gXG4gXHRyZXR1cm4gZXJyO1xuIH1cbiBcbiBzdGF0aWMgaW50IGRvX2R1bXAoaW50IGFyZ2MsIGNoYXIgKiphcmd2KVxuIHtcbiYjNDM7XHRMSUJCUEZfT1BUUyhicGZfZ2V0X2ZkX2J5X2lkX29wdHMsIG9wdHMsXG4mIzQzO1x0XHQgICAgLm9wZW5fZmxhZ3MgPSBCUEZfRl9SRE9OTFksXG4mIzQzO1x0KTtcbiBcdGpzb25fd3JpdGVyX3QgKnd0ciA9IE5VTEwsICpidGZfd3RyID0gTlVMTDtcbiBcdHN0cnVjdCBicGZfbWFwX2luZm8gaW5mbyA9IHt9O1xuJiM0MztcdHN0cnVjdCBtYXBfZHVtcF9jdHggY3R4ID0ge307XG4gXHRpbnQgbmJfZmRzLCBpID0gMDtcbiBcdF9fdTMyIGxlbiA9IHNpemVvZihpbmZvKTtcbiBcdGludCAqZmRzID0gTlVMTDtcbiBcdGludCBlcnIgPSAtMTtcbiYjNDM7XHRzaXplX3QgajtcbiBcbiBcdGlmIChhcmdjICE9IDIpXG4gXHRcdHVzYWdlKCk7XG5AQCAtOTE5LDkgJiM0Mzs5ODAsMzUgQEAgc3RhdGljIGludCBkb19kdW1wKGludCBhcmdjLCBjaGFyICoqYXJndilcbiBcdGlmIChuYl9mZHMgXHUwMDNjIDEpXG4gXHRcdGdvdG8gZXhpdF9mcmVlO1xuIFxuJiM0MztcdGlmIChyZWN1cnNpdmVfZHVtcCkge1xuJiM0MztcdFx0Y3R4LnNlZW4gPSBoYXNobWFwX19uZXcoaGFzaF9mbl9mb3Jfa2V5X2FzX2lkLFxuJiM0MztcdFx0XHRcdFx0ZXF1YWxfZm5fZm9yX2tleV9hc19pZCwgTlVMTCk7XG4mIzQzO1x0XHRpZiAoSVNfRVJSKGN0eC5zZWVuKSkge1xuJiM0MztcdFx0XHRjdHguc2VlbiA9IE5VTEw7XG4mIzQzO1x0XHRcdHBfZXJyKFwmIzM0O2ZhaWxlZCB0byBjcmVhdGUgaGFzaG1hcCBmb3IgcmVjdXJzaXZlIGR1bXBcJiMzNDspO1xuJiM0MztcdFx0XHRnb3RvIGV4aXRfY2xvc2U7XG4mIzQzO1x0XHR9XG4mIzQzO1x0XHQvKiBSZWNvcmQgdGhlIHNlbGVjdGVkIG1hcHMgYmVmb3JlIGRpc2NvdmVyaW5nIGFueSBpbm5lciBtYXBzLiAqL1xuJiM0MztcdFx0Zm9yIChpID0gMDsgaSBcdTAwM2MgbmJfZmRzOyBpJiM0MzsmIzQzOykge1xuJiM0MztcdFx0XHRsZW4gPSBzaXplb2YoaW5mbyk7XG4mIzQzO1x0XHRcdGlmIChicGZfbWFwX2dldF9pbmZvX2J5X2ZkKGZkc1tpXSwgXHUwMDI2aW5mbywgXHUwMDI2bGVuKSkge1xuJiM0MztcdFx0XHRcdHBfZXJyKFwmIzM0O2NhbiYjMzk7dCBnZXQgbWFwIGluZm86ICVzXCYjMzQ7LCBzdHJlcnJvcihlcnJubykpO1xuJiM0MztcdFx0XHRcdGVyciA9IC0xO1xuJiM0MztcdFx0XHRcdGdvdG8gZXhpdF9jbG9zZTtcbiYjNDM7XHRcdFx0fVxuJiM0MztcdFx0XHRlcnIgPSBoYXNobWFwX19hZGQoY3R4LnNlZW4sIGluZm8uaWQsIDApO1xuJiM0MztcdFx0XHRpZiAoZXJyKSB7XG4mIzQzO1x0XHRcdFx0cF9lcnIoXCYjMzQ7ZmFpbGVkIHRvIHJlY29yZCBtYXAgaWQgJXU6ICVzXCYjMzQ7LCBpbmZvLmlkLFxuJiM0MztcdFx0XHRcdCAgICAgIHN0cmVycm9yKC1lcnIpKTtcbiYjNDM7XHRcdFx0XHRlcnIgPSAtMTtcbiYjNDM7XHRcdFx0XHRnb3RvIGV4aXRfY2xvc2U7XG4mIzQzO1x0XHRcdH1cbiYjNDM7XHRcdH1cbiYjNDM7XHR9XG4mIzQzO1xuIFx0aWYgKGpzb25fb3V0cHV0KSB7XG4gXHRcdHd0ciA9IGpzb25fd3RyO1xuLVx0fSBlbHNlIHtcbiYjNDM7XHR9IGVsc2UgaWYgKCFyZWN1cnNpdmVfZHVtcCkge1xuIFx0XHRpbnQgZG9fcGxhaW5fYnRmO1xuIFxuIFx0XHRkb19wbGFpbl9idGYgPSBtYXBzX2hhdmVfYnRmKGZkcywgbmJfZmRzKTtcbkBAIC05MzYsNyAmIzQzOzEwMjMsNyBAQCBzdGF0aWMgaW50IGRvX2R1bXAoaW50IGFyZ2MsIGNoYXIgKiphcmd2KVxuIFx0XHR9XG4gXHR9XG4gXG4tXHRpZiAod3RyIFx1MDAyNlx1MDAyNiBuYl9mZHMgXHUwMDNlIDEpXG4mIzQzO1x0aWYgKHd0ciBcdTAwMjZcdTAwMjYgKG5iX2ZkcyBcdTAwM2UgMSB8fCByZWN1cnNpdmVfZHVtcCkpXG4gXHRcdGpzb253X3N0YXJ0X2FycmF5KHd0cik7XHQvKiByb290IGFycmF5ICovXG4gXHRmb3IgKGkgPSAwOyBpIFx1MDAzYyBuYl9mZHM7IGkmIzQzOyYjNDM7KSB7XG4gXHRcdGlmIChicGZfbWFwX2dldF9pbmZvX2J5X2ZkKGZkc1tpXSwgXHUwMDI2aW5mbywgXHUwMDI2bGVuKSkge1xuQEAgLTk0NCwyMiAmIzQzOzEwMzEsNTAgQEAgc3RhdGljIGludCBkb19kdW1wKGludCBhcmdjLCBjaGFyICoqYXJndilcbiBcdFx0XHRlcnIgPSAtMTtcbiBcdFx0XHRicmVhaztcbiBcdFx0fVxuLVx0XHRlcnIgPSBtYXBfZHVtcChmZHNbaV0sIFx1MDAyNmluZm8sIHd0ciwgbmJfZmRzIFx1MDAzZSAxKTtcbiYjNDM7XHRcdGVyciA9IG1hcF9kdW1wKGZkc1tpXSwgXHUwMDI2aW5mbywgd3RyLCBuYl9mZHMgXHUwMDNlIDEgfHwgcmVjdXJzaXZlX2R1bXAsXG4mIzQzO1x0XHRcdCAgICAgICByZWN1cnNpdmVfZHVtcCA/IFx1MDAyNmN0eCA6IE5VTEwpO1xuIFx0XHRpZiAoIXd0ciBcdTAwMjZcdTAwMjYgaSAhPSBuYl9mZHMgLSAxKVxuIFx0XHRcdHByaW50ZihcJiMzNDtcXG5cJiMzNDspO1xuIFxuIFx0XHRpZiAoZXJyKVxuIFx0XHRcdGJyZWFrO1xuLVx0XHRjbG9zZShmZHNbaV0pO1xuJiM0MztcdFx0LyogS2VlcCBzZWxlY3RlZCBtYXBzIGFsaXZlIHdoaWxlIHZpc2l0aW5nIHRoZWlyIGlubmVyIG1hcHMuICovXG4mIzQzO1x0XHRpZiAoIXJlY3Vyc2l2ZV9kdW1wKVxuJiM0MztcdFx0XHRjbG9zZShmZHNbaV0pO1xuJiM0MztcdH1cbiYjNDM7XHRmb3IgKGogPSAwOyAhZXJyIFx1MDAyNlx1MDAyNiBqIFx1MDAzYyBjdHgucGVuZGluZ19jbnQ7IGomIzQzOyYjNDM7KSB7XG4mIzQzO1x0XHRpbnQgZmQ7XG4mIzQzO1xuJiM0MztcdFx0ZmQgPSBicGZfbWFwX2dldF9mZF9ieV9pZF9vcHRzKGN0eC5wZW5kaW5nX2lkc1tqXSwgXHUwMDI2b3B0cyk7XG4mIzQzO1x0XHRpZiAoZmQgXHUwMDNjIDApIHtcbiYjNDM7XHRcdFx0cF9lcnIoXCYjMzQ7Y2FuJiMzOTt0IG9wZW4gaW5uZXIgbWFwIGlkICV1OiAlc1wmIzM0OyxcbiYjNDM7XHRcdFx0ICAgICAgY3R4LnBlbmRpbmdfaWRzW2pdLCBzdHJlcnJvcihlcnJubykpO1xuJiM0MztcdFx0XHRlcnIgPSAtMTtcbiYjNDM7XHRcdFx0YnJlYWs7XG4mIzQzO1x0XHR9XG4mIzQzO1x0XHRsZW4gPSBzaXplb2YoaW5mbyk7XG4mIzQzO1x0XHRpZiAoYnBmX21hcF9nZXRfaW5mb19ieV9mZChmZCwgXHUwMDI2aW5mbywgXHUwMDI2bGVuKSkge1xuJiM0MztcdFx0XHRwX2VycihcJiMzNDtjYW4mIzM5O3QgZ2V0IG1hcCBpbmZvOiAlc1wmIzM0Oywgc3RyZXJyb3IoZXJybm8pKTtcbiYjNDM7XHRcdFx0ZXJyID0gLTE7XG4mIzQzO1x0XHR9IGVsc2Uge1xuJiM0MztcdFx0XHRpZiAoIXd0cilcbiYjNDM7XHRcdFx0XHRwcmludGYoXCYjMzQ7XFxuXCYjMzQ7KTtcbiYjNDM7XHRcdFx0ZXJyID0gbWFwX2R1bXAoZmQsIFx1MDAyNmluZm8sIHd0ciwgdHJ1ZSwgXHUwMDI2Y3R4KTtcbiYjNDM7XHRcdH1cbiYjNDM7XHRcdGNsb3NlKGZkKTtcbiBcdH1cbi1cdGlmICh3dHIgXHUwMDI2XHUwMDI2IG5iX2ZkcyBcdTAwM2UgMSlcbiYjNDM7XHRpZiAod3RyIFx1MDAyNlx1MDAyNiAobmJfZmRzIFx1MDAzZSAxIHx8IHJlY3Vyc2l2ZV9kdW1wKSlcbiBcdFx0anNvbndfZW5kX2FycmF5KHd0cik7XHQvKiByb290IGFycmF5ICovXG4gXG4gXHRpZiAoYnRmX3d0cilcbiBcdFx0anNvbndfZGVzdHJveShcdTAwMjZidGZfd3RyKTtcbiBleGl0X2Nsb3NlOlxuJiM0MztcdGlmIChyZWN1cnNpdmVfZHVtcClcbiYjNDM7XHRcdGkgPSAwO1xuIFx0Zm9yICg7IGkgXHUwMDNjIG5iX2ZkczsgaSYjNDM7JiM0MzspXG4gXHRcdGNsb3NlKGZkc1tpXSk7XG4mIzQzO1x0aGFzaG1hcF9fZnJlZShjdHguc2Vlbik7XG4mIzQzO1x0ZnJlZShjdHgucGVuZGluZ19pZHMpO1xuIGV4aXRfZnJlZTpcbiBcdGZyZWUoZmRzKTtcbiBcdGZyZWVfYnRmX3ZtbGludXgoKTtcbkBAIC0xNDg0LDcgJiM0MzsxNTk5LDcgQEAgc3RhdGljIGludCBkb19oZWxwKGludCBhcmdjLCBjaGFyICoqYXJndilcbiBcdFx0XCYjMzQ7ICAgICAgICAgICAgICAgICB0YXNrX3N0b3JhZ2UgfCBibG9vbV9maWx0ZXIgfCB1c2VyX3JpbmdidWYgfCBjZ3JwX3N0b3JhZ2UgfCBhcmVuYSB8XFxuXCYjMzQ7XG4gXHRcdFwmIzM0OyAgICAgICAgICAgICAgICAgaW5zbl9hcnJheSB8IHJoYXNoIH1cXG5cJiMzNDtcbiBcdFx0XCYjMzQ7ICAgICAgIFwmIzM0OyBIRUxQX1NQRUNfT1BUSU9OUyBcJiMzNDsgfFxcblwmIzM0O1xuLVx0XHRcJiMzNDsgICAgICAgICAgICAgICAgICAgIHstZnwtLWJwZmZzfSB8IHstbnwtLW5vbW91bnR9IH1cXG5cJiMzNDtcbiYjNDM7XHRcdFwmIzM0OyAgICAgICAgICAgICAgICAgICAgey1mfC0tYnBmZnN9IHwgey1ufC0tbm9tb3VudH0gfCB7LXJ8LS1yZWN1cnNpdmV9IH1cXG5cJiMzNDtcbiBcdFx0XCYjMzQ7XCYjMzQ7LFxuIFx0XHRiaW5fbmFtZSwgYXJndlstMl0pO1xuIFxuZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9wcm9nX3Rlc3RzL2JwZnRvb2xfbWFwX2R1bXAuYyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9wcm9nX3Rlc3RzL2JwZnRvb2xfbWFwX2R1bXAuY1xubmV3IGZpbGUgbW9kZSAxMDA2NDRcbmluZGV4IDAwMDAwMDAwMDAwMDAuLjFmYjg3N2ZjNjhjODNcbi0tLSAvZGV2L251bGxcbiYjNDM7JiM0MzsmIzQzOyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9wcm9nX3Rlc3RzL2JwZnRvb2xfbWFwX2R1bXAuY1xuQEAgLTAsMCAmIzQzOzEsNDc0IEBAXG4mIzQzOy8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4wLW9ubHlcbiYjNDM7I2luY2x1ZGUgXHUwMDNjdGVzdF9wcm9ncy5oXHUwMDNlXG4mIzQzOyNpbmNsdWRlIFx1MDAzY2JwZnRvb2xfaGVscGVycy5oXHUwMDNlXG4mIzQzOyNpbmNsdWRlIFx1MDAzY2JwZi9idGYuaFx1MDAzZVxuJiM0MzsjaW5jbHVkZSBcdTAwM2NzeXMvcmVzb3VyY2UuaFx1MDAzZVxuJiM0MzsjaW5jbHVkZSBcdTAwM2NkaXJlbnQuaFx1MDAzZVxuJiM0MztcbiYjNDM7I2RlZmluZSBPVVRQVVRfU0laRSA4MTkyXG4mIzQzO1xuJiM0MztzdGF0aWMgYm9vbCBkdW1wX21hcChfX3UzMiBpZCwgY29uc3QgY2hhciAqb3B0aW9ucywgY2hhciAqb3V0cHV0KVxuJiM0Mzt7XG4mIzQzO1x0Y2hhciBjb21tYW5kW01BWF9CUEZUT09MX0NNRF9MRU5dO1xuJiM0MztcbiYjNDM7XHRzbnByaW50Zihjb21tYW5kLCBzaXplb2YoY29tbWFuZCksIFwmIzM0OyVzIG1hcCBkdW1wIGlkICV1XCYjMzQ7LCBvcHRpb25zLCBpZCk7XG4mIzQzO1x0bWVtc2V0KG91dHB1dCwgMCwgT1VUUFVUX1NJWkUpO1xuJiM0MztcdGlmICghQVNTRVJUX09LKGdldF9icGZ0b29sX2NvbW1hbmRfb3V0cHV0KGNvbW1hbmQsIG91dHB1dCwgT1VUUFVUX1NJWkUgLSAxKSxcbiYjNDM7XHRcdCAgICAgICBcJiMzNDtkdW1wX21hcFwmIzM0OykpXG4mIzQzO1x0XHRyZXR1cm4gZmFsc2U7XG4mIzQzO1x0LyogVGhlIGhlbHBlciBsZWF2ZXMgdGhlIHRyYWlsaW5nIG5ld2xpbmUgaW4gcGxhY2UuICovXG4mIzQzO1x0b3V0cHV0W3N0cmNzcG4ob3V0cHV0LCBcJiMzNDtcXG5cJiMzNDspXSA9ICYjMzk7XFwwJiMzOTs7XG4mIzQzO1x0cmV0dXJuIHRydWU7XG4mIzQzO31cbiYjNDM7XG4mIzQzO3N0YXRpYyBfX3UzMiBtYXBfaWQoaW50IGZkKVxuJiM0Mzt7XG4mIzQzO1x0c3RydWN0IGJwZl9tYXBfaW5mbyBpbmZvID0ge307XG4mIzQzO1x0X191MzIgbGVuID0gc2l6ZW9mKGluZm8pO1xuJiM0MztcbiYjNDM7XHRpZiAoIUFTU0VSVF9PSyhicGZfbWFwX2dldF9pbmZvX2J5X2ZkKGZkLCBcdTAwMjZpbmZvLCBcdTAwMjZsZW4pLCBcJiMzNDttYXBfaW5mb1wmIzM0OykpXG4mIzQzO1x0XHRyZXR1cm4gMDtcbiYjNDM7XHRyZXR1cm4gaW5mby5pZDtcbiYjNDM7fVxuJiM0MztcbiYjNDM7c3RhdGljIGludCBjb3VudF90b2tlbihjb25zdCBjaGFyICpvdXRwdXQsIGNvbnN0IGNoYXIgKnRva2VuKVxuJiM0Mzt7XG4mIzQzO1x0aW50IGNvdW50ID0gMDtcbiYjNDM7XG4mIzQzO1x0d2hpbGUgKChvdXRwdXQgPSBzdHJzdHIob3V0cHV0LCB0b2tlbikpKSB7XG4mIzQzO1x0XHRjb3VudCYjNDM7JiM0Mzs7XG4mIzQzO1x0XHRvdXRwdXQgJiM0Mzs9IHN0cmxlbih0b2tlbik7XG4mIzQzO1x0fVxuJiM0MztcdHJldHVybiBjb3VudDtcbiYjNDM7fVxuJiM0MztcbiYjNDM7c3RhdGljIHZvaWQgY2hlY2tfcGxhaW4oX191MzIgcm9vdF9pZCwgX191MzIgaW5uZXJfaWQsIGNvbnN0IGNoYXIgKnR5cGUsXG4mIzQzO1x0XHRcdGludCBlbnRyaWVzLCBib29sIHR5cGVkKVxuJiM0Mzt7XG4mIzQzO1x0Y2hhciBjb21tYW5kW01BWF9CUEZUT09MX0NNRF9MRU5dLCBoZWFkZXJbMTI4XTtcbiYjNDM7XHRjaGFyIG91dHB1dFtPVVRQVVRfU0laRV0gPSB7fTtcbiYjNDM7XHRjb25zdCBjaGFyICpyb290LCAqaW5uZXI7XG4mIzQzO1xuJiM0MztcdHNucHJpbnRmKGNvbW1hbmQsIHNpemVvZihjb21tYW5kKSwgXCYjMzQ7LS1yZWN1cnNpdmUgbWFwIGR1bXAgaWQgJXVcJiMzNDssIHJvb3RfaWQpO1xuJiM0MztcdGlmICghQVNTRVJUX09LKGdldF9icGZ0b29sX2NvbW1hbmRfb3V0cHV0KGNvbW1hbmQsIG91dHB1dCwgc2l6ZW9mKG91dHB1dCkgLSAxKSxcbiYjNDM7XHRcdCAgICAgICBcJiMzNDtwbGFpbl9kdW1wXCYjMzQ7KSlcbiYjNDM7XHRcdHJldHVybjtcbiYjNDM7XHRzbnByaW50ZihoZWFkZXIsIHNpemVvZihoZWFkZXIpLCBcJiMzNDsldTogJXMgIG5hbWUgZHVtcF9vdXRlciAgXCYjMzQ7LCByb290X2lkLCB0eXBlKTtcbiYjNDM7XHRyb290ID0gc3Ryc3RyKG91dHB1dCwgaGVhZGVyKTtcbiYjNDM7XHRpZiAoIUFTU0VSVF9PS19QVFIocm9vdCwgXCYjMzQ7cGxhaW5fcm9vdF9oZWFkZXJcJiMzNDspKVxuJiM0MztcdFx0cmV0dXJuO1xuJiM0MztcdEFTU0VSVF9FUShyb290IC0gb3V0cHV0LCAwLCBcJiMzNDtwbGFpbl9yb290X2ZpcnN0XCYjMzQ7KTtcbiYjNDM7XHRBU1NFUlRfRVEoY291bnRfdG9rZW4ob3V0cHV0LCBcJiMzNDtpbm5lcl9tYXBfaWQ6XCYjMzQ7KSwgZW50cmllcywgXCYjMzQ7cGxhaW5fcmVmZXJlbmNlc1wmIzM0Oyk7XG4mIzQzO1x0aWYgKGVudHJpZXMpIHtcbiYjNDM7XHRcdHNucHJpbnRmKGhlYWRlciwgc2l6ZW9mKGhlYWRlciksIFwmIzM0OyV1OiBoYXNoICBuYW1lIGR1bXBfaW5uZXIgIFwmIzM0OywgaW5uZXJfaWQpO1xuJiM0MztcdFx0aW5uZXIgPSBzdHJzdHIob3V0cHV0LCBoZWFkZXIpO1xuJiM0MztcdFx0aWYgKEFTU0VSVF9PS19QVFIoaW5uZXIsIFwmIzM0O3BsYWluX2lubmVyX2hlYWRlclwmIzM0OykpXG4mIzQzO1x0XHRcdEFTU0VSVF9HVChpbm5lciAtIHJvb3QsIDAsIFwmIzM0O3BsYWluX2lubmVyX2FmdGVyX3Jvb3RcJiMzNDspO1xuJiM0MztcdFx0QVNTRVJUX0VRKGNvdW50X3Rva2VuKG91dHB1dCwgaGVhZGVyKSwgMSwgXCYjMzQ7cGxhaW5faW5uZXJfb25jZVwmIzM0Oyk7XG4mIzQzO1x0fVxuJiM0MztcdEFTU0VSVF9FUShjb3VudF90b2tlbihvdXRwdXQsIFwmIzM0O0ZvdW5kIFwmIzM0OyksIGVudHJpZXMgXHUwMDI2XHUwMDI2ICF0eXBlZCA/IDIgOiAxLFxuJiM0MztcdFx0ICBcJiMzNDtwbGFpbl9tYXBfY291bnRcJiMzNDspO1xuJiM0MztcdGlmICh0eXBlZCkge1xuJiM0MztcdFx0QVNTRVJUX0hBU19TVUJTVFIob3V0cHV0LCBcJiMzNDtcXFwmIzM0O2tleVxcXCYjMzQ7OiAwXCYjMzQ7LCBcJiMzNDtwbGFpbl9idGZfa2V5XCYjMzQ7KTtcbiYjNDM7XHRcdEFTU0VSVF9IQVNfU1VCU1RSKG91dHB1dCwgXCYjMzQ7XFxcJiMzNDt2YWx1ZVxcXCYjMzQ7OiAxNjg0MzAwOVwmIzM0OywgXCYjMzQ7cGxhaW5fYnRmX3ZhbHVlXCYjMzQ7KTtcbiYjNDM7XHR9XG4mIzQzO31cbiYjNDM7XG4mIzQzO3N0YXRpYyB2b2lkIHRlc3Rfb3V0ZXIoZW51bSBicGZfbWFwX3R5cGUgdHlwZSwgaW50IGVudHJpZXMsIGJvb2wgZW1wdHlfaW5uZXIsXG4mIzQzO1x0XHQgICAgICAgYm9vbCB0eXBlZClcbiYjNDM7e1xuJiM0MztcdExJQkJQRl9PUFRTKGJwZl9tYXBfY3JlYXRlX29wdHMsIG9wdHMpO1xuJiM0MztcdExJQkJQRl9PUFRTKGJwZl9tYXBfY3JlYXRlX29wdHMsIGlubmVyX29wdHMpO1xuJiM0MztcdHN0cnVjdCBidGYgKmJ0ZiA9IE5VTEw7XG4mIzQzO1x0Y2hhciBvdXRlcltPVVRQVVRfU0laRV0sIGlubmVyW09VVFBVVF9TSVpFXSwgb3V0cHV0W09VVFBVVF9TSVpFXTtcbiYjNDM7XHRjaGFyIGV4cGVjdGVkW09VVFBVVF9TSVpFICogM10sIHJlZmVyZW5jZVs2NF07XG4mIzQzO1x0Y29uc3QgY2hhciAqdHlwZV9uYW1lID0gbGliYnBmX2JwZl9tYXBfdHlwZV9zdHIodHlwZSk7XG4mIzQzO1x0aW50IGlubmVyX2ZkID0gLTEsIG91dGVyX2ZkID0gLTE7XG4mIzQzO1x0X191MzIgcm9vdF9pZCwgaW5uZXJfaWQsIGtleSwgdmFsdWUgPSAweDAxMDEwMTAxO1xuJiM0MztcbiYjNDM7XHRpZiAodHlwZWQpIHtcbiYjNDM7XHRcdGJ0ZiA9IGJ0Zl9fbmV3X2VtcHR5KCk7XG4mIzQzO1x0XHRpZiAoIUFTU0VSVF9PS19QVFIoYnRmLCBcJiMzNDtjcmVhdGVfYnRmXCYjMzQ7KSB8fFxuJiM0MztcdFx0ICAgICFBU1NFUlRfRVEoYnRmX19hZGRfaW50KGJ0ZiwgXCYjMzQ7dW5zaWduZWQgaW50XCYjMzQ7LCA0LCAwKSwgMSwgXCYjMzQ7YnRmX2ludFwmIzM0OykgfHxcbiYjNDM7XHRcdCAgICAhQVNTRVJUX09LKGJ0Zl9fbG9hZF9pbnRvX2tlcm5lbChidGYpLCBcJiMzNDtsb2FkX2J0ZlwmIzM0OykpXG4mIzQzO1x0XHRcdGdvdG8gb3V0O1xuJiM0MztcdFx0aW5uZXJfb3B0cy5idGZfZmQgPSBidGZfX2ZkKGJ0Zik7XG4mIzQzO1x0XHRpbm5lcl9vcHRzLmJ0Zl9rZXlfdHlwZV9pZCA9IDE7XG4mIzQzO1x0XHRpbm5lcl9vcHRzLmJ0Zl92YWx1ZV90eXBlX2lkID0gMTtcbiYjNDM7XHR9XG4mIzQzO1x0aW5uZXJfZmQgPSBicGZfbWFwX2NyZWF0ZShCUEZfTUFQX1RZUEVfSEFTSCwgXCYjMzQ7ZHVtcF9pbm5lclwmIzM0Oywgc2l6ZW9mKGtleSksXG4mIzQzO1x0XHRcdFx0ICBzaXplb2YodmFsdWUpLCAyLCBcdTAwMjZpbm5lcl9vcHRzKTtcbiYjNDM7XHRpZiAoIUFTU0VSVF9PS19GRChpbm5lcl9mZCwgXCYjMzQ7Y3JlYXRlX2lubmVyXCYjMzQ7KSlcbiYjNDM7XHRcdGdvdG8gb3V0O1xuJiM0MztcdGtleSA9IDA7XG4mIzQzO1x0aWYgKCFlbXB0eV9pbm5lciBcdTAwMjZcdTAwMjZcbiYjNDM7XHQgICAgIUFTU0VSVF9PSyhicGZfbWFwX3VwZGF0ZV9lbGVtKGlubmVyX2ZkLCBcdTAwMjZrZXksIFx1MDAyNnZhbHVlLCBCUEZfQU5ZKSxcbiYjNDM7XHRcdCAgICAgICBcJiMzNDtwb3B1bGF0ZV9pbm5lclwmIzM0OykpXG4mIzQzO1x0XHRnb3RvIG91dDtcbiYjNDM7XHRvcHRzLmlubmVyX21hcF9mZCA9IGlubmVyX2ZkO1xuJiM0MztcdG91dGVyX2ZkID0gYnBmX21hcF9jcmVhdGUodHlwZSwgXCYjMzQ7ZHVtcF9vdXRlclwmIzM0Oywgc2l6ZW9mKGtleSksIHNpemVvZihfX3UzMiksXG4mIzQzO1x0XHRcdFx0ICAzLCBcdTAwMjZvcHRzKTtcbiYjNDM7XHRpZiAoIUFTU0VSVF9PS19GRChvdXRlcl9mZCwgXCYjMzQ7Y3JlYXRlX291dGVyXCYjMzQ7KSlcbiYjNDM7XHRcdGdvdG8gb3V0O1xuJiM0MztcdC8qIFRoZSB1bnVzZWQgdGhpcmQgYXJyYXkgc2xvdCBhbHNvIGV4ZXJjaXNlcyBmYWlsZWQgbG9va3Vwcy4gKi9cbiYjNDM7XHRmb3IgKGtleSA9IDA7IGtleSBcdTAwM2MgZW50cmllczsga2V5JiM0MzsmIzQzOylcbiYjNDM7XHRcdGlmICghQVNTRVJUX09LKGJwZl9tYXBfdXBkYXRlX2VsZW0ob3V0ZXJfZmQsIFx1MDAyNmtleSwgXHUwMDI2aW5uZXJfZmQsIEJQRl9BTlkpLFxuJiM0MztcdFx0XHQgICAgICAgXCYjMzQ7cG9wdWxhdGVfb3V0ZXJcJiMzNDspKVxuJiM0MztcdFx0XHRnb3RvIG91dDtcbiYjNDM7XHRyb290X2lkID0gbWFwX2lkKG91dGVyX2ZkKTtcbiYjNDM7XHRpbm5lcl9pZCA9IG1hcF9pZChpbm5lcl9mZCk7XG4mIzQzO1x0aWYgKCFyb290X2lkIHx8ICFpbm5lcl9pZCB8fCAhZHVtcF9tYXAocm9vdF9pZCwgXCYjMzQ7LWpcJiMzNDssIG91dGVyKSB8fFxuJiM0MztcdCAgICAhZHVtcF9tYXAoaW5uZXJfaWQsIFwmIzM0Oy1qXCYjMzQ7LCBpbm5lcikpXG4mIzQzO1x0XHRnb3RvIG91dDtcbiYjNDM7XG4mIzQzO1x0QVNTRVJUX0VRKG91dGVyWzBdLCAmIzM5O1smIzM5OywgXCYjMzQ7ZGVmYXVsdF9hcnJheVwmIzM0Oyk7XG4mIzQzO1x0QVNTRVJUX0VRKGNvdW50X3Rva2VuKG91dGVyLCBcJiMzNDtcXFwmIzM0O2VsZW1lbnRzXFxcJiMzNDs6XCYjMzQ7KSwgMCwgXCYjMzQ7ZGVmYXVsdF9ub193cmFwcGVyXCYjMzQ7KTtcbiYjNDM7XHRBU1NFUlRfRVEoY291bnRfdG9rZW4ob3V0ZXIsIFwmIzM0O1xcXCYjMzQ7aWRcXFwmIzM0OzpcJiMzNDspLCAwLCBcJiMzNDtkZWZhdWx0X25vX2hlYWRlclwmIzM0Oyk7XG4mIzQzO1x0c25wcmludGYocmVmZXJlbmNlLCBzaXplb2YocmVmZXJlbmNlKSwgXCYjMzQ7XFxcJiMzNDtpbm5lcl9tYXBfaWRcXFwmIzM0OzoldVwmIzM0OywgaW5uZXJfaWQpO1xuJiM0MztcdEFTU0VSVF9FUShjb3VudF90b2tlbihvdXRlciwgcmVmZXJlbmNlKSwgZW50cmllcywgXCYjMzQ7ZGVmYXVsdF9yZWZlcmVuY2VzXCYjMzQ7KTtcbiYjNDM7XHRpZiAoIWVudHJpZXMpXG4mIzQzO1x0XHRBU1NFUlRfU1RSRVEob3V0ZXIsIFwmIzM0O1tdXCYjMzQ7LCBcJiMzNDtlbXB0eV9vdXRlcl9kZWZhdWx0XCYjMzQ7KTtcbiYjNDM7XHRpZiAoZW1wdHlfaW5uZXIpXG4mIzQzO1x0XHRBU1NFUlRfU1RSRVEoaW5uZXIsIFwmIzM0O1tdXCYjMzQ7LCBcJiMzNDtlbXB0eV9pbm5lcl9kZWZhdWx0XCYjMzQ7KTtcbiYjNDM7XHRlbHNlIGlmICh0eXBlZClcbiYjNDM7XHRcdEFTU0VSVF9IQVNfU1VCU1RSKGlubmVyLCBcJiMzNDtcXFwmIzM0O2Zvcm1hdHRlZFxcXCYjMzQ7OntcXFwmIzM0O2tleVxcXCYjMzQ7OjAsXFxcJiMzNDt2YWx1ZVxcXCYjMzQ7OjE2ODQzMDA5fVwmIzM0OyxcbiYjNDM7XHRcdFx0XHQgIFwmIzM0O3R5cGVkX2lubmVyXCYjMzQ7KTtcbiYjNDM7XHRlbHNlXG4mIzQzO1x0XHRBU1NFUlRfU1RSRVEoaW5uZXIsXG4mIzQzO1x0XHRcdCAgICAgXCYjMzQ7W3tcXFwmIzM0O2tleVxcXCYjMzQ7OltcXFwmIzM0OzB4MDBcXFwmIzM0OyxcXFwmIzM0OzB4MDBcXFwmIzM0OyxcXFwmIzM0OzB4MDBcXFwmIzM0OyxcXFwmIzM0OzB4MDBcXFwmIzM0O10sXCYjMzQ7XG4mIzQzO1x0XHRcdCAgICAgXCYjMzQ7XFxcJiMzNDt2YWx1ZVxcXCYjMzQ7OltcXFwmIzM0OzB4MDFcXFwmIzM0OyxcXFwmIzM0OzB4MDFcXFwmIzM0OyxcXFwmIzM0OzB4MDFcXFwmIzM0OyxcXFwmIzM0OzB4MDFcXFwmIzM0O119XVwmIzM0OyxcbiYjNDM7XHRcdFx0ICAgICBcJiMzNDtvcmRpbmFyeV9kZWZhdWx0XCYjMzQ7KTtcbiYjNDM7XG4mIzQzO1x0LypcbiYjNDM7XHQgKiBDb21wYXJlIHRoZSBjb21wbGV0ZSBKU09OIGRvY3VtZW50OiBhIGZsYXQgYXJyYXkgd2l0aCB0aGUgcm9vdCBmaXJzdCxcbiYjNDM7XHQgKiBvbmUgY29weSBvZiB0aGUgc2hhcmVkIGlubmVyIG1hcCwgYW5kIHVuY2hhbmdlZCBlbnRyeSByZXByZXNlbnRhdGlvbnMuXG4mIzQzO1x0ICovXG4mIzQzO1x0aWYgKGVudHJpZXMpXG4mIzQzO1x0XHRzbnByaW50ZihleHBlY3RlZCwgc2l6ZW9mKGV4cGVjdGVkKSxcbiYjNDM7XHRcdFx0IFwmIzM0O1t7XFxcJiMzNDtpZFxcXCYjMzQ7OiV1LFxcXCYjMzQ7dHlwZVxcXCYjMzQ7OlxcXCYjMzQ7JXNcXFwmIzM0OyxcXFwmIzM0O25hbWVcXFwmIzM0OzpcXFwmIzM0O2R1bXBfb3V0ZXJcXFwmIzM0OyxcJiMzNDtcbiYjNDM7XHRcdFx0IFwmIzM0O1xcXCYjMzQ7ZmxhZ3NcXFwmIzM0OzowLFxcXCYjMzQ7ZWxlbWVudHNcXFwmIzM0Ozolc30se1xcXCYjMzQ7aWRcXFwmIzM0OzoldSxcXFwmIzM0O3R5cGVcXFwmIzM0OzpcXFwmIzM0O2hhc2hcXFwmIzM0OyxcJiMzNDtcbiYjNDM7XHRcdFx0IFwmIzM0O1xcXCYjMzQ7bmFtZVxcXCYjMzQ7OlxcXCYjMzQ7ZHVtcF9pbm5lclxcXCYjMzQ7LFxcXCYjMzQ7ZmxhZ3NcXFwmIzM0OzowLFxcXCYjMzQ7ZWxlbWVudHNcXFwmIzM0Ozolc31dXCYjMzQ7LFxuJiM0MztcdFx0XHQgcm9vdF9pZCwgdHlwZV9uYW1lLCBvdXRlciwgaW5uZXJfaWQsIGlubmVyKTtcbiYjNDM7XHRlbHNlXG4mIzQzO1x0XHRzbnByaW50ZihleHBlY3RlZCwgc2l6ZW9mKGV4cGVjdGVkKSxcbiYjNDM7XHRcdFx0IFwmIzM0O1t7XFxcJiMzNDtpZFxcXCYjMzQ7OiV1LFxcXCYjMzQ7dHlwZVxcXCYjMzQ7OlxcXCYjMzQ7JXNcXFwmIzM0OyxcXFwmIzM0O25hbWVcXFwmIzM0OzpcXFwmIzM0O2R1bXBfb3V0ZXJcXFwmIzM0OyxcJiMzNDtcbiYjNDM7XHRcdFx0IFwmIzM0O1xcXCYjMzQ7ZmxhZ3NcXFwmIzM0OzowLFxcXCYjMzQ7ZWxlbWVudHNcXFwmIzM0OzpbXX1dXCYjMzQ7LCByb290X2lkLCB0eXBlX25hbWUpO1xuJiM0MztcdGlmIChkdW1wX21hcChyb290X2lkLCBcJiMzNDstaiAtclwmIzM0Oywgb3V0cHV0KSlcbiYjNDM7XHRcdEFTU0VSVF9TVFJFUShvdXRwdXQsIGV4cGVjdGVkLCBcJiMzNDtyZWN1cnNpdmVfanNvblwmIzM0Oyk7XG4mIzQzO1x0aWYgKGR1bXBfbWFwKHJvb3RfaWQsIFwmIzM0Oy0tanNvbiAtLXJlY3Vyc2l2ZVwmIzM0Oywgb3V0cHV0KSlcbiYjNDM7XHRcdEFTU0VSVF9TVFJFUShvdXRwdXQsIGV4cGVjdGVkLCBcJiMzNDtyZWN1cnNpdmVfbG9uZ19vcHRpb25zXCYjMzQ7KTtcbiYjNDM7XHRjaGVja19wbGFpbihyb290X2lkLCBpbm5lcl9pZCwgdHlwZV9uYW1lLCBlbnRyaWVzLCB0eXBlZCk7XG4mIzQzO1xuJiM0MztcdC8qIFJlY3Vyc2lvbiBvbiBhbiBvcmRpbmFyeSBtYXAgc3RpbGwgZW1pdHMgYSBzaW5nbGUgbWFwIG9iamVjdC4gKi9cbiYjNDM7XHRzbnByaW50ZihleHBlY3RlZCwgc2l6ZW9mKGV4cGVjdGVkKSxcbiYjNDM7XHRcdCBcJiMzNDtbe1xcXCYjMzQ7aWRcXFwmIzM0OzoldSxcXFwmIzM0O3R5cGVcXFwmIzM0OzpcXFwmIzM0O2hhc2hcXFwmIzM0OyxcXFwmIzM0O25hbWVcXFwmIzM0OzpcXFwmIzM0O2R1bXBfaW5uZXJcXFwmIzM0OyxcJiMzNDtcbiYjNDM7XHRcdCBcJiMzNDtcXFwmIzM0O2ZsYWdzXFxcJiMzNDs6MCxcXFwmIzM0O2VsZW1lbnRzXFxcJiMzNDs6JXN9XVwmIzM0OywgaW5uZXJfaWQsIGlubmVyKTtcbiYjNDM7XHRpZiAoZHVtcF9tYXAoaW5uZXJfaWQsIFwmIzM0Oy1qIC1yXCYjMzQ7LCBvdXRwdXQpKVxuJiM0MztcdFx0QVNTRVJUX1NUUkVRKG91dHB1dCwgZXhwZWN0ZWQsIFwmIzM0O29yZGluYXJ5X3JlY3Vyc2l2ZVwmIzM0Oyk7XG4mIzQzO291dDpcbiYjNDM7XHRpZiAob3V0ZXJfZmQgXHUwMDNlPSAwKVxuJiM0MztcdFx0Y2xvc2Uob3V0ZXJfZmQpO1xuJiM0MztcdGlmIChpbm5lcl9mZCBcdTAwM2U9IDApXG4mIzQzO1x0XHRjbG9zZShpbm5lcl9mZCk7XG4mIzQzO1x0YnRmX19mcmVlKGJ0Zik7XG4mIzQzO31cbiYjNDM7XG4mIzQzO3N0YXRpYyB2b2lkIHRlc3RfbXVsdGlwbGVfcm9vdHModm9pZClcbiYjNDM7e1xuJiM0MztcdExJQkJQRl9PUFRTKGJwZl9tYXBfY3JlYXRlX29wdHMsIG9wdHMpO1xuJiM0MztcdGNoYXIgY29tbWFuZFtNQVhfQlBGVE9PTF9DTURfTEVOXSwgbmFtZVtCUEZfT0JKX05BTUVfTEVOXTtcbiYjNDM7XHRjaGFyIG91dHB1dFtPVVRQVVRfU0laRV0gPSB7fSwgZXhwZWN0ZWRbT1VUUFVUX1NJWkUgKiA0XSwgZWxlbWVudHNbT1VUUFVUX1NJWkVdO1xuJiM0MztcdHN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgdHlwZXNbXSA9IHsgXCYjMzQ7aGFzaFwmIzM0OywgXCYjMzQ7YXJyYXlfb2ZfbWFwc1wmIzM0OywgXCYjMzQ7aGFzaF9vZl9tYXBzXCYjMzQ7LCBcJiMzNDtoYXNoXCYjMzQ7IH07XG4mIzQzO1x0aW50IGZkc1tdID0geyAtMSwgLTEsIC0xLCAtMSB9O1xuJiM0MztcdF9fdTMyIGlkc1s0XSwga2V5O1xuJiM0MztcdGludCBpLCBsZW4gPSAwO1xuJiM0MztcbiYjNDM7XHQvKlxuJiM0MztcdCAqIFNlbGVjdCB0aGUgZmlyc3QgaW5uZXIgbWFwIGFuZCBib3RoIG91dGVycyBhcyByb290cy4gVGhlIG90aGVyIGlubmVyXG4mIzQzO1x0ICogbWFwIG11c3QgYmUgYXBwZW5kZWQgYWZ0ZXIgYWxsIHRocmVlIHJvb3RzLCBldmVuIHRob3VnaCBpdCBpcyBmb3VuZFxuJiM0MztcdCAqIHdoaWxlIGR1bXBpbmcgdGhlIGZpcnN0IG91dGVyLiBBIHByb2Nlc3Mtc3BlY2lmaWMgbmFtZSBhdm9pZHMgb3RoZXJcbiYjNDM7XHQgKiB0ZXN0cyYjMzk7IG1hcHMgam9pbmluZyB0aGUgc2VsZWN0aW9uLlxuJiM0MztcdCAqL1xuJiM0MztcdHNucHJpbnRmKG5hbWUsIHNpemVvZihuYW1lKSwgXCYjMzQ7ZHVtcF8ldVwmIzM0OywgZ2V0cGlkKCkpO1xuJiM0MztcdGZkc1swXSA9IGJwZl9tYXBfY3JlYXRlKEJQRl9NQVBfVFlQRV9IQVNILCBuYW1lLCA0LCA0LCAxLCBOVUxMKTtcbiYjNDM7XHRpZiAoIUFTU0VSVF9PS19GRChmZHNbMF0sIFwmIzM0O2NyZWF0ZV9zZWxlY3RlZF9pbm5lclwmIzM0OykpXG4mIzQzO1x0XHRnb3RvIG91dDtcbiYjNDM7XHRmZHNbM10gPSBicGZfbWFwX2NyZWF0ZShCUEZfTUFQX1RZUEVfSEFTSCwgXCYjMzQ7ZHVtcF9kaXNjb3ZlcmVkXCYjMzQ7LCA0LCA0LCAxLCBOVUxMKTtcbiYjNDM7XHRpZiAoIUFTU0VSVF9PS19GRChmZHNbM10sIFwmIzM0O2NyZWF0ZV9kaXNjb3ZlcmVkX2lubmVyXCYjMzQ7KSlcbiYjNDM7XHRcdGdvdG8gb3V0O1xuJiM0MztcdG9wdHMuaW5uZXJfbWFwX2ZkID0gZmRzWzBdO1xuJiM0MztcdGZkc1sxXSA9IGJwZl9tYXBfY3JlYXRlKEJQRl9NQVBfVFlQRV9BUlJBWV9PRl9NQVBTLCBuYW1lLCA0LCA0LCAyLCBcdTAwMjZvcHRzKTtcbiYjNDM7XHRpZiAoIUFTU0VSVF9PS19GRChmZHNbMV0sIFwmIzM0O2NyZWF0ZV9hcnJheV9yb290XCYjMzQ7KSlcbiYjNDM7XHRcdGdvdG8gb3V0O1xuJiM0MztcdGZkc1syXSA9IGJwZl9tYXBfY3JlYXRlKEJQRl9NQVBfVFlQRV9IQVNIX09GX01BUFMsIG5hbWUsIDQsIDQsIDIsIFx1MDAyNm9wdHMpO1xuJiM0MztcdGlmICghQVNTRVJUX09LX0ZEKGZkc1syXSwgXCYjMzQ7Y3JlYXRlX2hhc2hfcm9vdFwmIzM0OykpXG4mIzQzO1x0XHRnb3RvIG91dDtcbiYjNDM7XHRmb3IgKGkgPSAxOyBpIFx1MDAzYz0gMjsgaSYjNDM7JiM0MzspIHtcbiYjNDM7XHRcdGtleSA9IDA7XG4mIzQzO1x0XHRpZiAoIUFTU0VSVF9PSyhicGZfbWFwX3VwZGF0ZV9lbGVtKGZkc1tpXSwgXHUwMDI2a2V5LCBcdTAwMjZmZHNbMF0sIEJQRl9BTlkpLFxuJiM0MztcdFx0XHQgICAgICAgXCYjMzQ7cmVmZXJlbmNlX3NlbGVjdGVkX2lubmVyXCYjMzQ7KSlcbiYjNDM7XHRcdFx0Z290byBvdXQ7XG4mIzQzO1x0XHRrZXkgPSAxO1xuJiM0MztcdFx0aWYgKCFBU1NFUlRfT0soYnBmX21hcF91cGRhdGVfZWxlbShmZHNbaV0sIFx1MDAyNmtleSwgXHUwMDI2ZmRzWzNdLCBCUEZfQU5ZKSxcbiYjNDM7XHRcdFx0ICAgICAgIFwmIzM0O3JlZmVyZW5jZV9kaXNjb3ZlcmVkX2lubmVyXCYjMzQ7KSlcbiYjNDM7XHRcdFx0Z290byBvdXQ7XG4mIzQzO1x0fVxuJiM0MztcdGZvciAoaSA9IDA7IGkgXHUwMDNjIEFSUkFZX1NJWkUoZmRzKTsgaSYjNDM7JiM0MzspIHtcbiYjNDM7XHRcdGlkc1tpXSA9IG1hcF9pZChmZHNbaV0pO1xuJiM0MztcdFx0aWYgKCFpZHNbaV0gfHwgIWR1bXBfbWFwKGlkc1tpXSwgXCYjMzQ7LWpcJiMzNDssIGVsZW1lbnRzKSlcbiYjNDM7XHRcdFx0Z290byBvdXQ7XG4mIzQzO1x0XHRsZW4gJiM0Mzs9IHNucHJpbnRmKGV4cGVjdGVkICYjNDM7IGxlbiwgc2l6ZW9mKGV4cGVjdGVkKSAtIGxlbixcbiYjNDM7XHRcdFx0XHRcJiMzNDslc3tcXFwmIzM0O2lkXFxcJiMzNDs6JXUsXFxcJiMzNDt0eXBlXFxcJiMzNDs6XFxcJiMzNDslc1xcXCYjMzQ7LFxcXCYjMzQ7bmFtZVxcXCYjMzQ7OlxcXCYjMzQ7JXNcXFwmIzM0OyxcJiMzNDtcbiYjNDM7XHRcdFx0XHRcJiMzNDtcXFwmIzM0O2ZsYWdzXFxcJiMzNDs6MCxcXFwmIzM0O2VsZW1lbnRzXFxcJiMzNDs6JXN9JXNcJiMzNDssXG4mIzQzO1x0XHRcdFx0aSA/IFwmIzM0OyxcJiMzNDsgOiBcJiMzNDtbXCYjMzQ7LCBpZHNbaV0sIHR5cGVzW2ldLFxuJiM0MztcdFx0XHRcdGkgPT0gMyA/IFwmIzM0O2R1bXBfZGlzY292ZXJlZFwmIzM0OyA6IG5hbWUsIGVsZW1lbnRzLCBpID09IDMgPyBcJiMzNDtdXCYjMzQ7IDogXCYjMzQ7XCYjMzQ7KTtcbiYjNDM7XHR9XG4mIzQzO1x0c25wcmludGYoY29tbWFuZCwgc2l6ZW9mKGNvbW1hbmQpLCBcJiMzNDstaiAtciBtYXAgZHVtcCBuYW1lICVzXCYjMzQ7LCBuYW1lKTtcbiYjNDM7XHRpZiAoQVNTRVJUX09LKGdldF9icGZ0b29sX2NvbW1hbmRfb3V0cHV0KGNvbW1hbmQsIG91dHB1dCwgc2l6ZW9mKG91dHB1dCkgLSAxKSxcbiYjNDM7XHRcdCAgICAgIFwmIzM0O2R1bXBfbXVsdGlwbGVfcm9vdHNcJiMzNDspKSB7XG4mIzQzO1x0XHRvdXRwdXRbc3RyY3NwbihvdXRwdXQsIFwmIzM0O1xcblwmIzM0OyldID0gJiMzOTtcXDAmIzM5OztcbiYjNDM7XHRcdEFTU0VSVF9TVFJFUShvdXRwdXQsIGV4cGVjdGVkLCBcJiMzNDtyb290c19maXJzdF9hbmRfc2VlZF9kZWR1cFwmIzM0Oyk7XG4mIzQzO1x0fVxuJiM0MztvdXQ6XG4mIzQzO1x0Zm9yIChpID0gMDsgaSBcdTAwM2MgQVJSQVlfU0laRShmZHMpOyBpJiM0MzsmIzQzOylcbiYjNDM7XHRcdGlmIChmZHNbaV0gXHUwMDNlPSAwKVxuJiM0MztcdFx0XHRjbG9zZShmZHNbaV0pO1xuJiM0Mzt9XG4mIzQzO1xuJiM0MztzdGF0aWMgdm9pZCB0ZXN0X3VucmVhZGFibGUoYm9vbCBvdXRlcilcbiYjNDM7e1xuJiM0MztcdExJQkJQRl9PUFRTKGJwZl9tYXBfY3JlYXRlX29wdHMsIG9wdHMpO1xuJiM0MztcdGNoYXIgZWxlbWVudHNbT1VUUFVUX1NJWkVdLCBvdXRwdXRbT1VUUFVUX1NJWkVdLCByb290W09VVFBVVF9TSVpFXTtcbiYjNDM7XHRjaGFyIGV4cGVjdGVkW09VVFBVVF9TSVpFICogM10sIHBsYWluW09VVFBVVF9TSVpFXSA9IHt9O1xuJiM0MztcdGNoYXIgY29tbWFuZFtNQVhfQlBGVE9PTF9DTURfTEVOXTtcbiYjNDM7XHRpbnQgaW5uZXJfZmQgPSAtMSwgb3V0ZXJfZmQgPSAtMSwgbG9va3VwX2Vycm5vO1xuJiM0MztcdF9fdTMyIGlubmVyX2lkLCByb290X2lkLCBrZXkgPSAwLCB2YWx1ZTtcbiYjNDM7XG4mIzQzO1x0LypcbiYjNDM7XHQgKiBFdmVyeSBrZXkgaXMgZW51bWVyYWJsZSwgYnV0IFBFUkZfRVZFTlRfQVJSQVkgbG9va3VwIHJldHVybnNcbiYjNDM7XHQgKiBFTk9UU1VQUCAodGhlIGtlcm5lbC1pbnRlcm5hbCBlcnJubykuIENoZWNrIGJvdGggZW50cmllcyBzbyBhblxuJiM0MztcdCAqIGVhcmx5IGV4aXQgb24gdGhlIGZpcnN0IGxvb2t1cCBmYWlsdXJlIGNhbm5vdCBwYXNzLlxuJiM0MztcdCAqL1xuJiM0MztcdGlubmVyX2ZkID0gYnBmX21hcF9jcmVhdGUoQlBGX01BUF9UWVBFX1BFUkZfRVZFTlRfQVJSQVksIFwmIzM0O2R1bXBfdW5yZWFkYWJsZVwmIzM0OyxcbiYjNDM7XHRcdFx0XHQgIHNpemVvZihrZXkpLCBzaXplb2YodmFsdWUpLCAyLCBOVUxMKTtcbiYjNDM7XHRpZiAoIUFTU0VSVF9PS19GRChpbm5lcl9mZCwgXCYjMzQ7Y3JlYXRlX3VucmVhZGFibGVcJiMzNDspKVxuJiM0MztcdFx0Z290byBvdXQ7XG4mIzQzO1x0aWYgKCFBU1NFUlRfTFQoYnBmX21hcF9sb29rdXBfZWxlbShpbm5lcl9mZCwgXHUwMDI2a2V5LCBcdTAwMjZ2YWx1ZSksIDAsXG4mIzQzO1x0XHQgICAgICAgXCYjMzQ7dW5yZWFkYWJsZV9sb29rdXBcJiMzNDspKVxuJiM0MztcdFx0Z290byBvdXQ7XG4mIzQzO1x0bG9va3VwX2Vycm5vID0gZXJybm87XG4mIzQzO1x0aWYgKCFBU1NFUlRfTkVRKGxvb2t1cF9lcnJubywgRU5PRU5ULCBcJiMzNDt1bnJlYWRhYmxlX25vdF9taXNzaW5nXCYjMzQ7KSlcbiYjNDM7XHRcdGdvdG8gb3V0O1xuJiM0MztcdGlubmVyX2lkID0gbWFwX2lkKGlubmVyX2ZkKTtcbiYjNDM7XHRpZiAoIWlubmVyX2lkIHx8ICFkdW1wX21hcChpbm5lcl9pZCwgXCYjMzQ7LWpcJiMzNDssIGVsZW1lbnRzKSlcbiYjNDM7XHRcdGdvdG8gb3V0O1xuJiM0MztcdEFTU0VSVF9FUShjb3VudF90b2tlbihlbGVtZW50cywgXCYjMzQ7XFxcJiMzNDtlcnJvclxcXCYjMzQ7OlwmIzM0OyksIDIsIFwmIzM0O2RlZmF1bHRfanNvbl9lcnJvcnNcJiMzNDspO1xuJiM0MztcdHNucHJpbnRmKGNvbW1hbmQsIHNpemVvZihjb21tYW5kKSwgXCYjMzQ7bWFwIGR1bXAgaWQgJXVcJiMzNDssIGlubmVyX2lkKTtcbiYjNDM7XHRpZiAoIUFTU0VSVF9PSyhnZXRfYnBmdG9vbF9jb21tYW5kX291dHB1dChjb21tYW5kLCBwbGFpbiwgc2l6ZW9mKHBsYWluKSAtIDEpLFxuJiM0MztcdFx0ICAgICAgIFwmIzM0O2RlZmF1bHRfcGxhaW5fdW5yZWFkYWJsZVwmIzM0OykpXG4mIzQzO1x0XHRnb3RvIG91dDtcbiYjNDM7XHRBU1NFUlRfRVEoY291bnRfdG9rZW4ocGxhaW4sIHN0cmVycm9yKGxvb2t1cF9lcnJubykpLCAyLCBcJiMzNDtkZWZhdWx0X3BsYWluX2Vycm9yc1wmIzM0Oyk7XG4mIzQzO1x0QVNTRVJUX0hBU19TVUJTVFIocGxhaW4sIFwmIzM0O0ZvdW5kIDAgZWxlbWVudHNcJiMzNDssIFwmIzM0O2RlZmF1bHRfcGxhaW5fY291bnRcJiMzNDspO1xuJiM0MztcbiYjNDM7XHRyb290X2lkID0gaW5uZXJfaWQ7XG4mIzQzO1x0aWYgKG91dGVyKSB7XG4mIzQzO1x0XHRvcHRzLmlubmVyX21hcF9mZCA9IGlubmVyX2ZkO1xuJiM0MztcdFx0b3V0ZXJfZmQgPSBicGZfbWFwX2NyZWF0ZShCUEZfTUFQX1RZUEVfQVJSQVlfT0ZfTUFQUywgXCYjMzQ7ZHVtcF9vdXRlclwmIzM0OyxcbiYjNDM7XHRcdFx0XHRcdCAgc2l6ZW9mKGtleSksIHNpemVvZih2YWx1ZSksIDEsIFx1MDAyNm9wdHMpO1xuJiM0MztcdFx0aWYgKCFBU1NFUlRfT0tfRkQob3V0ZXJfZmQsIFwmIzM0O2NyZWF0ZV9vdXRlclwmIzM0OykgfHxcbiYjNDM7XHRcdCAgICAhQVNTRVJUX09LKGJwZl9tYXBfdXBkYXRlX2VsZW0ob3V0ZXJfZmQsIFx1MDAyNmtleSwgXHUwMDI2aW5uZXJfZmQsIEJQRl9BTlkpLFxuJiM0MztcdFx0XHQgICAgICAgXCYjMzQ7cG9wdWxhdGVfb3V0ZXJcJiMzNDspKVxuJiM0MztcdFx0XHRnb3RvIG91dDtcbiYjNDM7XHRcdHJvb3RfaWQgPSBtYXBfaWQob3V0ZXJfZmQpO1xuJiM0MztcdFx0aWYgKCFyb290X2lkIHx8ICFkdW1wX21hcChyb290X2lkLCBcJiMzNDstalwmIzM0Oywgcm9vdCkpXG4mIzQzO1x0XHRcdGdvdG8gb3V0O1xuJiM0MztcdFx0c25wcmludGYoZXhwZWN0ZWQsIHNpemVvZihleHBlY3RlZCksXG4mIzQzO1x0XHRcdCBcJiMzNDtbe1xcXCYjMzQ7aWRcXFwmIzM0OzoldSxcXFwmIzM0O3R5cGVcXFwmIzM0OzpcXFwmIzM0O2FycmF5X29mX21hcHNcXFwmIzM0OyxcXFwmIzM0O25hbWVcXFwmIzM0OzpcXFwmIzM0O2R1bXBfb3V0ZXJcXFwmIzM0OyxcJiMzNDtcbiYjNDM7XHRcdFx0IFwmIzM0O1xcXCYjMzQ7ZmxhZ3NcXFwmIzM0OzowLFxcXCYjMzQ7ZWxlbWVudHNcXFwmIzM0Ozolc30se1xcXCYjMzQ7aWRcXFwmIzM0OzoldSxcJiMzNDtcbiYjNDM7XHRcdFx0IFwmIzM0O1xcXCYjMzQ7dHlwZVxcXCYjMzQ7OlxcXCYjMzQ7cGVyZl9ldmVudF9hcnJheVxcXCYjMzQ7LFxcXCYjMzQ7bmFtZVxcXCYjMzQ7OlxcXCYjMzQ7ZHVtcF91bnJlYWRhYmxlXFxcJiMzNDssXCYjMzQ7XG4mIzQzO1x0XHRcdCBcJiMzNDtcXFwmIzM0O2ZsYWdzXFxcJiMzNDs6MCxcXFwmIzM0O2VsZW1lbnRzXFxcJiMzNDs6JXN9XVwmIzM0Oywgcm9vdF9pZCwgcm9vdCwgaW5uZXJfaWQsIGVsZW1lbnRzKTtcbiYjNDM7XHR9IGVsc2Uge1xuJiM0MztcdFx0c25wcmludGYoZXhwZWN0ZWQsIHNpemVvZihleHBlY3RlZCksXG4mIzQzO1x0XHRcdCBcJiMzNDtbe1xcXCYjMzQ7aWRcXFwmIzM0OzoldSxcXFwmIzM0O3R5cGVcXFwmIzM0OzpcXFwmIzM0O3BlcmZfZXZlbnRfYXJyYXlcXFwmIzM0OyxcJiMzNDtcbiYjNDM7XHRcdFx0IFwmIzM0O1xcXCYjMzQ7bmFtZVxcXCYjMzQ7OlxcXCYjMzQ7ZHVtcF91bnJlYWRhYmxlXFxcJiMzNDssXFxcJiMzNDtmbGFnc1xcXCYjMzQ7OjAsXFxcJiMzNDtlbGVtZW50c1xcXCYjMzQ7OiVzfV1cJiMzNDssXG4mIzQzO1x0XHRcdCBpbm5lcl9pZCwgZWxlbWVudHMpO1xuJiM0MztcdH1cbiYjNDM7XHRpZiAoZHVtcF9tYXAocm9vdF9pZCwgXCYjMzQ7LWogLXJcJiMzNDssIG91dHB1dCkpXG4mIzQzO1x0XHRBU1NFUlRfU1RSRVEob3V0cHV0LCBleHBlY3RlZCwgXCYjMzQ7cmVjdXJzaXZlX3VucmVhZGFibGVfanNvblwmIzM0Oyk7XG4mIzQzO1x0bWVtc2V0KG91dHB1dCwgMCwgc2l6ZW9mKG91dHB1dCkpO1xuJiM0MztcdHNucHJpbnRmKGNvbW1hbmQsIHNpemVvZihjb21tYW5kKSwgXCYjMzQ7LXIgbWFwIGR1bXAgaWQgJXVcJiMzNDssIHJvb3RfaWQpO1xuJiM0MztcdGlmIChBU1NFUlRfT0soZ2V0X2JwZnRvb2xfY29tbWFuZF9vdXRwdXQoY29tbWFuZCwgb3V0cHV0LCBzaXplb2Yob3V0cHV0KSAtIDEpLFxuJiM0MztcdFx0ICAgICAgXCYjMzQ7cmVjdXJzaXZlX3VucmVhZGFibGVfcGxhaW5cJiMzNDspKSB7XG4mIzQzO1x0XHRBU1NFUlRfSEFTX1NVQlNUUihvdXRwdXQsIHBsYWluLCBcJiMzNDtyZWN1cnNpdmVfcGxhaW5fcHJlc2VydmVzX2Vycm9yc1wmIzM0Oyk7XG4mIzQzO1x0XHRBU1NFUlRfRVEoY291bnRfdG9rZW4ob3V0cHV0LCBzdHJlcnJvcihsb29rdXBfZXJybm8pKSwgMixcbiYjNDM7XHRcdFx0ICBcJiMzNDtyZWN1cnNpdmVfcGxhaW5fZXJyb3JzXCYjMzQ7KTtcbiYjNDM7XHRcdEFTU0VSVF9FUShjb3VudF90b2tlbihvdXRwdXQsIFwmIzM0O0ZvdW5kIFwmIzM0OyksIG91dGVyID8gMiA6IDEsXG4mIzQzO1x0XHRcdCAgXCYjMzQ7cmVjdXJzaXZlX3BsYWluX21hcHNcJiMzNDspO1xuJiM0MztcdH1cbiYjNDM7b3V0OlxuJiM0MztcdGlmIChvdXRlcl9mZCBcdTAwM2U9IDApXG4mIzQzO1x0XHRjbG9zZShvdXRlcl9mZCk7XG4mIzQzO1x0aWYgKGlubmVyX2ZkIFx1MDAzZT0gMClcbiYjNDM7XHRcdGNsb3NlKGlubmVyX2ZkKTtcbiYjNDM7fVxuJiM0MztcbiYjNDM7c3RhdGljIHZvaWQgdGVzdF9tYW55X2lubmVyX21hcHMoYm9vbCBqc29uKVxuJiM0Mzt7XG4mIzQzO1x0ZW51bSB7XG4mIzQzO1x0XHREVU1QX09LLFxuJiM0MztcdFx0RFVNUF9FUlJfUkxJTUlULFxuJiM0MztcdFx0RFVNUF9FUlJfQ09NTUFORCxcbiYjNDM7XHRcdERVTVBfRVJSX0NPVU5UUyxcbiYjNDM7XHRcdERVTVBfRVJSX0lEUyxcbiYjNDM7XHRcdERVTVBfRVJSX0pTT04sXG4mIzQzO1x0XHREVU1QX0VSUl9GRFMsXG4mIzQzO1x0fTtcbiYjNDM7XHRMSUJCUEZfT1BUUyhicGZfbWFwX2NyZWF0ZV9vcHRzLCBvcHRzKTtcbiYjNDM7XHRjb25zdCBzdHJ1Y3QgcmxpbWl0IGxpbWl0ID0geyAucmxpbV9jdXIgPSAzMiwgLnJsaW1fbWF4ID0gMzIgfTtcbiYjNDM7XHRjaGFyIGNvbW1hbmRbTUFYX0JQRlRPT0xfQ01EX0xFTl0sIHRva2VuWzY0XTtcbiYjNDM7XHRfX3UzMiBpZHNbNjRdLCByb290X2lkLCBrZXk7XG4mIzQzO1x0aW50IGlubmVyX2ZkID0gLTEsIG91dGVyX2ZkID0gLTEsIHN0YXR1cztcbiYjNDM7XHRpbnQgaW5oZXJpdGVkX2Zkc1szMl0sIG5yX2luaGVyaXRlZCA9IDAsIGk7XG4mIzQzO1x0Y2hhciAqb3V0cHV0ID0gTlVMTDtcbiYjNDM7XHRwaWRfdCBwaWQ7XG4mIzQzO1xuJiM0MztcdGlubmVyX2ZkID0gYnBmX21hcF9jcmVhdGUoQlBGX01BUF9UWVBFX0hBU0gsIFwmIzM0O2R1bXBfaW5uZXJcJiMzNDssIDQsIDQsIDEsIE5VTEwpO1xuJiM0MztcdGlmICghQVNTRVJUX09LX0ZEKGlubmVyX2ZkLCBcJiMzNDtjcmVhdGVfdGVtcGxhdGVcJiMzNDspKVxuJiM0MztcdFx0Z290byBvdXQ7XG4mIzQzO1x0b3B0cy5pbm5lcl9tYXBfZmQgPSBpbm5lcl9mZDtcbiYjNDM7XHRvdXRlcl9mZCA9IGJwZl9tYXBfY3JlYXRlKEJQRl9NQVBfVFlQRV9BUlJBWV9PRl9NQVBTLCBcJiMzNDtkdW1wX291dGVyXCYjMzQ7LCA0LCA0LFxuJiM0MztcdFx0XHRcdCAgQVJSQVlfU0laRShpZHMpLCBcdTAwMjZvcHRzKTtcbiYjNDM7XHRjbG9zZShpbm5lcl9mZCk7XG4mIzQzO1x0aW5uZXJfZmQgPSAtMTtcbiYjNDM7XHRpZiAoIUFTU0VSVF9PS19GRChvdXRlcl9mZCwgXCYjMzQ7Y3JlYXRlX291dGVyXCYjMzQ7KSlcbiYjNDM7XHRcdGdvdG8gb3V0O1xuJiM0MztcdGZvciAoa2V5ID0gMDsga2V5IFx1MDAzYyBBUlJBWV9TSVpFKGlkcyk7IGtleSYjNDM7JiM0MzspIHtcbiYjNDM7XHRcdGlubmVyX2ZkID0gYnBmX21hcF9jcmVhdGUoQlBGX01BUF9UWVBFX0hBU0gsIFwmIzM0O2R1bXBfaW5uZXJcJiMzNDssIDQsIDQsIDEsIE5VTEwpO1xuJiM0MztcdFx0aWYgKCFBU1NFUlRfT0tfRkQoaW5uZXJfZmQsIFwmIzM0O2NyZWF0ZV9pbm5lclwmIzM0OykgfHxcbiYjNDM7XHRcdCAgICAhQVNTRVJUX09LKGJwZl9tYXBfdXBkYXRlX2VsZW0ob3V0ZXJfZmQsIFx1MDAyNmtleSwgXHUwMDI2aW5uZXJfZmQsIEJQRl9BTlkpLFxuJiM0MztcdFx0XHQgICAgICAgXCYjMzQ7cG9wdWxhdGVfb3V0ZXJcJiMzNDspKVxuJiM0MztcdFx0XHRnb3RvIG91dDtcbiYjNDM7XHRcdGlkc1trZXldID0gbWFwX2lkKGlubmVyX2ZkKTtcbiYjNDM7XHRcdGlmICghaWRzW2tleV0pXG4mIzQzO1x0XHRcdGdvdG8gb3V0O1xuJiM0MztcdFx0LyogVGhlIG91dGVyIG1hcCBrZWVwcyBlYWNoIGRpc3RpbmN0IGlubmVyIG1hcCBhbGl2ZS4gKi9cbiYjNDM7XHRcdGNsb3NlKGlubmVyX2ZkKTtcbiYjNDM7XHRcdGlubmVyX2ZkID0gLTE7XG4mIzQzO1x0fVxuJiM0MztcdHJvb3RfaWQgPSBtYXBfaWQob3V0ZXJfZmQpO1xuJiM0MztcdG91dHB1dCA9IGNhbGxvYygxLCA2NTUzNik7XG4mIzQzO1x0aWYgKCFyb290X2lkIHx8ICFBU1NFUlRfT0tfUFRSKG91dHB1dCwgXCYjMzQ7YWxsb2NhdGVfb3V0cHV0XCYjMzQ7KSlcbiYjNDM7XHRcdGdvdG8gb3V0O1xuJiM0MztcbiYjNDM7XHQvKiBGaWxsIHRoZSBsb3cgRkQgc2xvdHMgdG8gZXhlcmNpc2UgaW5oZXJpdGVkIGRlc2NyaXB0b3IgY2xlYW51cC4gKi9cbiYjNDM7XHRmb3IgKGkgPSAwOyBpIFx1MDAzYyBBUlJBWV9TSVpFKGluaGVyaXRlZF9mZHMpOyBpJiM0MzsmIzQzOykge1xuJiM0MztcdFx0aW50IGZkID0gb3BlbihcJiMzNDsvZGV2L251bGxcJiMzNDssIE9fUkRPTkxZKTtcbiYjNDM7XG4mIzQzO1x0XHRpZiAoIUFTU0VSVF9PS19GRChmZCwgXCYjMzQ7b3Blbl9pbmhlcml0ZWRfZmRcJiMzNDspKVxuJiM0MztcdFx0XHRnb3RvIG91dDtcbiYjNDM7XHRcdGluaGVyaXRlZF9mZHNbbnJfaW5oZXJpdGVkJiM0MzsmIzQzO10gPSBmZDtcbiYjNDM7XHR9XG4mIzQzO1xuJiM0MztcdC8qXG4mIzQzO1x0ICogQ3JlYXRlIGFsbCBmaXh0dXJlcyBiZWZvcmUgbG93ZXJpbmcgdGhlIGxpbWl0LCBhbmQga2VlcCB0aGUgdGVzdFxuJiM0MztcdCAqIHJ1bm5lciYjMzk7cyBsaW1pdCB1bmNoYW5nZWQuIFJldGFpbmluZyBldmVyeSBkaXNjb3ZlcmVkIEZEIHdvdWxkIGV4Y2VlZFxuJiM0MztcdCAqIHRoaXMgbGltaXQgYmVmb3JlIHRoZSByZWN1cnNpdmUgZHVtcCBjb3VsZCB2aXNpdCBhbGwgaW5uZXIgbWFwcy5cbiYjNDM7XHQgKi9cbiYjNDM7XHRwaWQgPSBmb3JrKCk7XG4mIzQzO1x0aWYgKCFBU1NFUlRfR0UocGlkLCAwLCBcJiMzNDtmb3JrXCYjMzQ7KSlcbiYjNDM7XHRcdGdvdG8gb3V0O1xuJiM0MztcdGlmICghcGlkKSB7XG4mIzQzO1x0XHRzdHJ1Y3QgZGlyZW50ICplbnRyeTtcbiYjNDM7XHRcdERJUiAqZGlyO1xuJiM0MztcbiYjNDM7XHRcdC8qIFJlc2VydmUgYSBzbG90IGZvciB0aGUgZGlyZWN0b3J5IGV2ZW4gaWYgdGhlIHBhcmVudCBpcyBmdWxsLiAqL1xuJiM0MztcdFx0Y2xvc2UoaW5oZXJpdGVkX2Zkc1tucl9pbmhlcml0ZWQgLSAxXSk7XG4mIzQzO1x0XHRkaXIgPSBvcGVuZGlyKFwmIzM0Oy9wcm9jL3NlbGYvZmRcJiMzNDspO1xuJiM0MztcdFx0aWYgKCFkaXIpXG4mIzQzO1x0XHRcdF9leGl0KERVTVBfRVJSX0ZEUyk7XG4mIzQzO1x0XHQvKiBUaGUgcGFyZW50IGtlZXBzIHRoZSBvdXRlciBtYXAgYW5kIGl0cyBpbm5lciBtYXBzIGFsaXZlLiAqL1xuJiM0MztcdFx0Zm9yICg7Oykge1xuJiM0MztcdFx0XHRjaGFyICplbmQ7XG4mIzQzO1x0XHRcdGxvbmcgZmQ7XG4mIzQzO1xuJiM0MztcdFx0XHRlcnJubyA9IDA7XG4mIzQzO1x0XHRcdGVudHJ5ID0gcmVhZGRpcihkaXIpO1xuJiM0MztcdFx0XHRpZiAoIWVudHJ5KSB7XG4mIzQzO1x0XHRcdFx0aWYgKGVycm5vKVxuJiM0MztcdFx0XHRcdFx0X2V4aXQoRFVNUF9FUlJfRkRTKTtcbiYjNDM7XHRcdFx0XHRicmVhaztcbiYjNDM7XHRcdFx0fVxuJiM0MztcdFx0XHRmZCA9IHN0cnRvbChlbnRyeS1cdTAwM2VkX25hbWUsIFx1MDAyNmVuZCwgMTApO1xuJiM0MztcdFx0XHRpZiAoKmVuZCB8fCBmZCBcdTAwM2MgMyB8fCBmZCA9PSBkaXJmZChkaXIpKVxuJiM0MztcdFx0XHRcdGNvbnRpbnVlO1xuJiM0MztcdFx0XHRjbG9zZShmZCk7XG4mIzQzO1x0XHR9XG4mIzQzO1x0XHRpZiAoY2xvc2VkaXIoZGlyKSlcbiYjNDM7XHRcdFx0X2V4aXQoRFVNUF9FUlJfRkRTKTtcbiYjNDM7XHRcdGlmIChzZXRybGltaXQoUkxJTUlUX05PRklMRSwgXHUwMDI2bGltaXQpKVxuJiM0MztcdFx0XHRfZXhpdChEVU1QX0VSUl9STElNSVQpO1xuJiM0MztcdFx0c25wcmludGYoY29tbWFuZCwgc2l6ZW9mKGNvbW1hbmQpLCBcJiMzNDslcyAtciBtYXAgZHVtcCBpZCAldVwmIzM0OyxcbiYjNDM7XHRcdFx0IGpzb24gPyBcJiMzNDstalwmIzM0OyA6IFwmIzM0O1wmIzM0Oywgcm9vdF9pZCk7XG4mIzQzO1x0XHRpZiAoZ2V0X2JwZnRvb2xfY29tbWFuZF9vdXRwdXQoY29tbWFuZCwgb3V0cHV0LCA2NTUzNSkpXG4mIzQzO1x0XHRcdF9leGl0KERVTVBfRVJSX0NPTU1BTkQpO1xuJiM0MztcdFx0aWYgKGNvdW50X3Rva2VuKG91dHB1dCwganNvbiA/IFwmIzM0O1xcXCYjMzQ7aWRcXFwmIzM0OzpcJiMzNDsgOiBcJiMzNDtGb3VuZCBcJiMzNDspICE9IEFSUkFZX1NJWkUoaWRzKSAmIzQzOyAxIHx8XG4mIzQzO1x0XHQgICAgY291bnRfdG9rZW4ob3V0cHV0LCBqc29uID8gXCYjMzQ7XFxcJiMzNDtpbm5lcl9tYXBfaWRcXFwmIzM0OzpcJiMzNDsgOiBcJiMzNDtpbm5lcl9tYXBfaWQ6XCYjMzQ7KSAhPVxuJiM0MztcdFx0ICAgIEFSUkFZX1NJWkUoaWRzKSlcbiYjNDM7XHRcdFx0X2V4aXQoRFVNUF9FUlJfQ09VTlRTKTtcbiYjNDM7XHRcdGZvciAoa2V5ID0gMDsga2V5IFx1MDAzYyBBUlJBWV9TSVpFKGlkcyk7IGtleSYjNDM7JiM0MzspIHtcbiYjNDM7XHRcdFx0aWYgKGpzb24pXG4mIzQzO1x0XHRcdFx0c25wcmludGYodG9rZW4sIHNpemVvZih0b2tlbiksIFwmIzM0O1xcXCYjMzQ7aWRcXFwmIzM0OzoldSxcJiMzNDssIGlkc1trZXldKTtcbiYjNDM7XHRcdFx0ZWxzZVxuJiM0MztcdFx0XHRcdHNucHJpbnRmKHRva2VuLCBzaXplb2YodG9rZW4pLCBcJiMzNDtcXG4ldTogaGFzaCAgbmFtZSBkdW1wX2lubmVyICBcJiMzNDssXG4mIzQzO1x0XHRcdFx0XHQgaWRzW2tleV0pO1xuJiM0MztcdFx0XHRpZiAoY291bnRfdG9rZW4ob3V0cHV0LCB0b2tlbikgIT0gMSlcbiYjNDM7XHRcdFx0XHRfZXhpdChEVU1QX0VSUl9JRFMpO1xuJiM0MztcdFx0fVxuJiM0MztcdFx0aWYgKGpzb24gXHUwMDI2XHUwMDI2IChvdXRwdXRbMF0gIT0gJiMzOTtbJiMzOTsgfHxcbiYjNDM7XHRcdFx0ICAgICBzdHJjbXAob3V0cHV0ICYjNDM7IHN0cmxlbihvdXRwdXQpIC0gMiwgXCYjMzQ7XVxcblwmIzM0OykpKVxuJiM0MztcdFx0XHRfZXhpdChEVU1QX0VSUl9KU09OKTtcbiYjNDM7XHRcdF9leGl0KERVTVBfT0spO1xuJiM0MztcdH1cbiYjNDM7XHRpZiAoQVNTRVJUX0VRKHdhaXRwaWQocGlkLCBcdTAwMjZzdGF0dXMsIDApLCBwaWQsIFwmIzM0O3dhaXRwaWRcJiMzNDspIFx1MDAyNlx1MDAyNlxuJiM0MztcdCAgICBBU1NFUlRfVFJVRShXSUZFWElURUQoc3RhdHVzKSwgXCYjMzQ7Y2hpbGRfZXhpdGVkXCYjMzQ7KSlcbiYjNDM7XHRcdEFTU0VSVF9FUShXRVhJVFNUQVRVUyhzdGF0dXMpLCBEVU1QX09LLCBcJiMzNDtkdW1wX3dpdGhfbG93X2ZkX2xpbWl0XCYjMzQ7KTtcbiYjNDM7XHRmb3IgKGkgPSAwOyBpIFx1MDAzYyBucl9pbmhlcml0ZWQ7IGkmIzQzOyYjNDM7KVxuJiM0MztcdFx0QVNTRVJUX0dFKGZjbnRsKGluaGVyaXRlZF9mZHNbaV0sIEZfR0VURkQpLCAwLCBcJiMzNDtwYXJlbnRfZmRfcHJlc2VydmVkXCYjMzQ7KTtcbiYjNDM7XHRBU1NFUlRfRVEobWFwX2lkKG91dGVyX2ZkKSwgcm9vdF9pZCwgXCYjMzQ7cGFyZW50X291dGVyX3ByZXNlcnZlZFwmIzM0Oyk7XG4mIzQzO291dDpcbiYjNDM7XHR3aGlsZSAobnJfaW5oZXJpdGVkKVxuJiM0MztcdFx0Y2xvc2UoaW5oZXJpdGVkX2Zkc1stLW5yX2luaGVyaXRlZF0pO1xuJiM0MztcdGZyZWUob3V0cHV0KTtcbiYjNDM7XHRpZiAob3V0ZXJfZmQgXHUwMDNlPSAwKVxuJiM0MztcdFx0Y2xvc2Uob3V0ZXJfZmQpO1xuJiM0MztcdGlmIChpbm5lcl9mZCBcdTAwM2U9IDApXG4mIzQzO1x0XHRjbG9zZShpbm5lcl9mZCk7XG4mIzQzO31cbiYjNDM7XG4mIzQzO3ZvaWQgdGVzdF9icGZ0b29sX21hcF9kdW1wKHZvaWQpXG4mIzQzO3tcbiYjNDM7XHRpZiAodGVzdF9fc3RhcnRfc3VidGVzdChcJiMzNDt1bnJlYWRhYmxlX29yZGluYXJ5XCYjMzQ7KSlcbiYjNDM7XHRcdHRlc3RfdW5yZWFkYWJsZShmYWxzZSk7XG4mIzQzO1x0aWYgKHRlc3RfX3N0YXJ0X3N1YnRlc3QoXCYjMzQ7dW5yZWFkYWJsZV9pbm5lclwmIzM0OykpXG4mIzQzO1x0XHR0ZXN0X3VucmVhZGFibGUodHJ1ZSk7XG4mIzQzO1x0aWYgKHRlc3RfX3N0YXJ0X3N1YnRlc3QoXCYjMzQ7bWFueV9pbm5lcl9tYXBzX2pzb25cJiMzNDspKVxuJiM0MztcdFx0dGVzdF9tYW55X2lubmVyX21hcHModHJ1ZSk7XG4mIzQzO1x0aWYgKHRlc3RfX3N0YXJ0X3N1YnRlc3QoXCYjMzQ7bWFueV9pbm5lcl9tYXBzX3BsYWluXCYjMzQ7KSlcbiYjNDM7XHRcdHRlc3RfbWFueV9pbm5lcl9tYXBzKGZhbHNlKTtcbiYjNDM7XHRpZiAodGVzdF9fc3RhcnRfc3VidGVzdChcJiMzNDttdWx0aXBsZV9yb290c1wmIzM0OykpXG4mIzQzO1x0XHR0ZXN0X211bHRpcGxlX3Jvb3RzKCk7XG4mIzQzO1x0aWYgKHRlc3RfX3N0YXJ0X3N1YnRlc3QoXCYjMzQ7YXJyYXlfb2ZfbWFwc1wmIzM0OykpXG4mIzQzO1x0XHR0ZXN0X291dGVyKEJQRl9NQVBfVFlQRV9BUlJBWV9PRl9NQVBTLCAxLCBmYWxzZSwgZmFsc2UpO1xuJiM0MztcdGlmICh0ZXN0X19zdGFydF9zdWJ0ZXN0KFwmIzM0O2hhc2hfb2ZfbWFwc1wmIzM0OykpXG4mIzQzO1x0XHR0ZXN0X291dGVyKEJQRl9NQVBfVFlQRV9IQVNIX09GX01BUFMsIDEsIGZhbHNlLCBmYWxzZSk7XG4mIzQzO1x0aWYgKHRlc3RfX3N0YXJ0X3N1YnRlc3QoXCYjMzQ7c2hhcmVkX2lubmVyXCYjMzQ7KSlcbiYjNDM7XHRcdHRlc3Rfb3V0ZXIoQlBGX01BUF9UWVBFX0FSUkFZX09GX01BUFMsIDIsIGZhbHNlLCBmYWxzZSk7XG4mIzQzO1x0aWYgKHRlc3RfX3N0YXJ0X3N1YnRlc3QoXCYjMzQ7ZW1wdHlfYXJyYXlfb2ZfbWFwc1wmIzM0OykpXG4mIzQzO1x0XHR0ZXN0X291dGVyKEJQRl9NQVBfVFlQRV9BUlJBWV9PRl9NQVBTLCAwLCBmYWxzZSwgZmFsc2UpO1xuJiM0MztcdGlmICh0ZXN0X19zdGFydF9zdWJ0ZXN0KFwmIzM0O2VtcHR5X2hhc2hfb2ZfbWFwc1wmIzM0OykpXG4mIzQzO1x0XHR0ZXN0X291dGVyKEJQRl9NQVBfVFlQRV9IQVNIX09GX01BUFMsIDAsIGZhbHNlLCBmYWxzZSk7XG4mIzQzO1x0aWYgKHRlc3RfX3N0YXJ0X3N1YnRlc3QoXCYjMzQ7YnRmX2lubmVyXCYjMzQ7KSlcbiYjNDM7XHRcdHRlc3Rfb3V0ZXIoQlBGX01BUF9UWVBFX0hBU0hfT0ZfTUFQUywgMSwgZmFsc2UsIHRydWUpO1xuJiM0MztcdGlmICh0ZXN0X19zdGFydF9zdWJ0ZXN0KFwmIzM0O2VtcHR5X2lubmVyXCYjMzQ7KSlcbiYjNDM7XHRcdHRlc3Rfb3V0ZXIoQlBGX01BUF9UWVBFX0hBU0hfT0ZfTUFQUywgMSwgdHJ1ZSwgZmFsc2UpO1xuJiM0Mzt9XG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+Mi8xPC90ZD4KCQkJPHRkPjIwMjYvMDkvMTEgMDQ6MDA8L3RkPgoJCQk8dGQ+YWdlbnQ8L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Y29yZTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFbmFibGVDb25maWdzJiMzNDs6IG51bGwsCiAgJiMzNDtGb2N1c1N5bWJvbHMmIzM0OzogW10sCiAgJiMzNDtSZWFzb25pbmcmIzM0OzogJiMzNDtUaGUgcGF0Y2ggbW9kaWZpZXMgb25seSB1c2VyLXNwYWNlIHRvb2xpbmcgKGJwZnRvb2wgdW5kZXIgdG9vbHMvYnBmL2JwZnRvb2wvKSBhbmQgQlBGIHNlbGZ0ZXN0cyAodG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmLykuIEl0IGRvZXMgbm90IHRvdWNoIHRoZSBMaW51eCBrZXJuZWwgaW1hZ2Ugb3Iga2VybmVsIG1vZHVsZXMsIG1ha2luZyBpdCB1bnJlYWNoYWJsZSBmb3Igc3l6a2FsbGVyIGtlcm5lbCBmdXp6aW5nLiYjMzQ7LAogICYjMzQ7V29ydGhGdXp6aW5nJiMzNDs6IGZhbHNlCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPkluc3RydWN0aW9uOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+WW91IGFyZSBhbiBleHBlcnQgTGludXgga2VybmVsIG1haW50YWluZXIgYW5kIHNlY3VyaXR5IGVuZ2luZWVyLgpZb3VyIGpvYiBpcyB0byByZXZpZXcgYSBwcm92aWRlZCBwYXRjaCBzZXJpZXMgYW5kIGV2YWx1YXRlIHdoZXRoZXIgaXQgd2FycmFudHMgZnV6emluZyB3aXRoIHN5emthbGxlci4KCklNUE9SVEFOVDogVGhlIGNoYW5nZXMgaGF2ZSBBTFJFQURZIGJlZW4gYXBwbGllZCBhbmQgY29tbWl0dGVkIGFzIHRoZSBIRUFEIGNvbW1pdCBpbgp5b3VyIHdvcmtzcGFjZS4gRG8gTk9UIHJlbHkgb24gaW50ZXJuYWwgYXNzdW1wdGlvbnMuIFlvdSBtdXN0IGFjdGl2ZWx5IHVzZSB5b3VyIGNvZGUgYWNjZXNzCnRvb2xzIHRvIGluc3BlY3QgdGhlIGFjdHVhbCBzb3VyY2UgY29kZSwgY2FsbGVycywgYW5kIHN1cnJvdW5kaW5nIGNvbnRleHQuCgo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoxLiBDT1JFIFRSSUFHRSBQSElMT1NPUEhZCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ClRoZSBnb2FsIG9mIHBhdGNoIGZ1enppbmcgaXMgdG8gZGlzY292ZXIgY3Jhc2hlcywgcmVncmVzc2lvbnMsIGV4cG9zZWQgbGF0ZW50IGJ1Z3MsCmFuZCBuZXdseSB0cmlnZ2VyZWQgYXNzZXJ0aW9ucyBpbnRyb2R1Y2VkIGJ5IHRoZSBwYXRjaCBzZXJpZXMuCgotIFJFQUNIQUJJTElUWSBJUyBUSEUgUFJJTUFSWSBHQVRFOgogIEZ1enppbmcgY2FuIG9ubHkgZGlzY292ZXIgYnVncyBpbiBjb2RlIHRoYXQgY2FuIGFjdHVhbGx5IGV4ZWN1dGUgaW4gc3RhbmRhcmQgdmlydHVhbGl6ZWQKICBlbnZpcm9ubWVudHMgKEdDRSBvciBRRU1VLCB1dGlsaXppbmcgc29mdHdhcmUtZW11bGF0ZWQgZGV2aWNlcyBsaWtlIFVTQiBnYWRnZXRzLCBuZXRkZXYsIHR1bi90YXApLgogIElmIHRoZSBtb2RpZmllZCBjb2RlIGlzIHN0cnVjdHVyYWxseSB1bnJlYWNoYWJsZSAoc2VlIFNlY3Rpb24gMiksIGl0IE1VU1QgTk9UIGJlIGZ1enplZCwKICByZWdhcmRsZXNzIG9mIHdoZXRoZXIgaXQgYWRkcyBhc3NlcnRpb25zIG9yIGNvbXBsZXggbG9naWMuCgotIERPIE5PVCBCTElORExZIFRSVVNUICYjMzQ7Tk8gRlVOQ1RJT05BTCBDSEFOR0UmIzM0OyAoTkZDSSkgT1IgJiMzNDtSRUZBQ1RPUklORyYjMzQ7IENMQUlNUzoKICBQYXRjaCBhdXRob3JzIHJvdXRpbmVseSBsYWJlbCBjaGFuZ2VzIGFzICYjMzQ7Y2xlYW51cHMmIzM0OywgJiMzNDtyZWZhY3RvcmluZ3MmIzM0Oywgb3Igc3RhdGUKICAmIzM0O05vIGZ1bmN0aW9uYWwgY2hhbmdlIGludGVuZGVkJiMzNDsuIERvIE5PVCB0YWtlIHRoZXNlIGNsYWltcyBhdCBmYWNlIHZhbHVlLgogIENvZGUgcmVmYWN0b3JpbmdzIHRoYXQgcmVhcnJhbmdlIGxvZ2ljLCBpbnRyb2R1Y2UgaGVscGVyIGZ1bmN0aW9ucywgb3IgYWx0ZXIgc3RhdGUgbWFuYWdlbWVudAogIGluIGNvcmUgc3Vic3lzdGVtcyBmcmVxdWVudGx5IGludHJvZHVjZSBzdWJ0bGUgc2VtYW50aWMgc2hpZnRzIG9yIHVuY292ZXIgbGF0ZW50IGtlcm5lbCBidWdzLgogIElmIHJlYWNoYWJsZSBleGVjdXRhYmxlIGNvZGUgaXMgbW9kaWZpZWQgb3IgcmVmYWN0b3JlZCwgaXQgTVVTVCBiZSBmdXp6ZWQuCgotIE5FVyBPUiBNT0RJRklFRCBBU1NFUlRJT05TIElOIFJFQUNIQUJMRSBDT0RFIE1VU1QgQkUgRlVaWkVEOgogIFdoZW4gYSBwYXRjaCBpbnRyb2R1Y2VzIG9yIG1vZGlmaWVzIHJ1bnRpbWUgY2hlY2tzIG9yIGFzc2VydGlvbnMgKGUuZy4sIFdBUk5fT04qLCBWTV9XQVJOX09OKiwKICBCVUdfT04qLCBsb2NrZGVwX2Fzc2VydCopIGluIHJlYWNoYWJsZSBjb2RlIHBhdGhzLCBpdCBlbmZvcmNlcyBuZXcgb3Igc3RyaWN0ZXIgaW52YXJpYW50cy4KICBFdmVuIGlmIHRoZSBhdXRob3IgYmVsaWV2ZXMgdGhlIGludmFyaWFudCBhbHdheXMgaG9sZHMsIGZ1enppbmcgaXMgZXNzZW50aWFsIHRvIHZlcmlmeSB3aGV0aGVyCiAgYW4gdW51c3VhbCBzZXF1ZW5jZSBvZiBvcGVyYXRpb25zIGNhbiB2aW9sYXRlIGl0LgoKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KMi4gV0hFTiBUTyBSRVRVUk4gV29ydGhGdXp6aW5nPWZhbHNlIChORUdBVElWRSBDUklURVJJQSkKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KUmV0dXJuIFdvcnRoRnV6emluZz1mYWxzZSBPTkxZIElGIGFsbCBtb2RpZmllZCBjb2RlIGZhbGxzIHN0cmljdGx5IGludG8gb25lIG9yIG1vcmUgb2YgdGhlc2UgY2F0ZWdvcmllczoKCi0gTm9uLWtlcm5lbCBhbmQgbm9uLWV4ZWN1dGFibGUgY2hhbmdlczoKICAqIE1vZGlmaWNhdGlvbnMgdG8gRG9jdW1lbnRhdGlvbi8sIGNvbW1lbnRzLCBvciBzcGVsbGluZyBmaXhlcy4KICAqIFVzZXItc3BhY2UgZGlyZWN0b3JpZXMsIHNlbGYtdGVzdHMsIHNhbXBsZXMsIG9yIHNjcmlwdHMgKGUuZy4sIHRvb2xzLywgc2FtcGxlcy8sIHNjcmlwdHMvLCB1c3IvKQogICAgdGhhdCBkbyBub3QgYWZmZWN0IHRoZSBjb21waWxlZCBrZXJuZWwgaW1hZ2UgKHZtbGludXgpIG9yIGtlcm5lbCBtb2R1bGVzLgogICogUHVyZWx5IGRlY29yYXRpdmUgbG9nZ2luZyAoZS5nLiwgbWVzc2FnZSBzdHJpbmdzIGluIHByX2VyciwgcHJpbnRrLCBkZXZfaW5mbykgb3IgdHJhY2Vwb2ludHMKICAgIHRoYXQgZG8gbm90IGFsdGVyIGNvbnRyb2wgZmxvdyBvciBkYXRhIHN0cnVjdHVyZXMuCiAgKiBCdWlsZCBzeXN0ZW0gb3IgS2NvbmZpZyBjaGFuZ2VzIHRoYXQgZG8gbm90IGFsdGVyIGNvbXBpbGVkIEMgbG9naWMuCi0gU3RydWN0dXJhbGx5IHVucmVhY2hhYmxlIGhhcmR3YXJlOgogICogVmVuZG9yLXNwZWNpZmljIFBDSWUgc3dpdGNoZXMsIFNtYXJ0TklDcywgb3IgR1BVIGRyaXZlcnMgKGUuZy4sIG1seHN3LCBwZHNfY29yZSwgcWVkLAogICAgaW9uaWMsIGFtZGdwdSkgcmVxdWlyaW5nIHBoeXNpY2FsIEFTSUMvUENJZSBjYXJkcyBub3QgZW11bGF0ZWQgaW4gc3RhbmRhcmQgUUVNVS4KLSBVbnJlYWNoYWJsZSBleGVjdXRpb24gcGF0aHM6CiAgKiBEcml2ZXIgdGVhcmRvd24gY2FsbGJhY2tzICgucmVtb3ZlLCAuc2h1dGRvd24sIHBjaV91bnJlZ2lzdGVyX2RyaXZlcikgZXhlY3V0ZWQgb25seSBkdXJpbmcKICAgIHBoeXNpY2FsIFBDSSBob3QtdW5wbHVnIG9yIG1hbnVhbCBzeXNmcyBkcml2ZXIgdW5iaW5kaW5nLgogICogQ29kZSBwYXRocyBleGNsdXNpdmUgdG8gYXJjaGl0ZWN0dXJlcyBvdGhlciB0aGFuIHRoZSB0YXJnZXQgYXJjaGl0ZWN0dXJlLgoKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KMy4gV0hFTiBUTyBSRVRVUk4gV29ydGhGdXp6aW5nPXRydWUgKFBPU0lUSVZFIENSSVRFUklBKQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQpSZXR1cm4gV29ydGhGdXp6aW5nPXRydWUgd2hlbmV2ZXIgdGhlIHBhdGNoIHRvdWNoZXMgcmVhY2hhYmxlIGV4ZWN1dGFibGUgY29kZSwgaW5jbHVkaW5nOgotIENvcmUgU3Vic3lzdGVtczoKICAqIEFueSBsb2dpYyBtb2RpZmljYXRpb25zIGluIG1lbW9yeSBtYW5hZ2VtZW50IChtbS8pLCBzeW5jaHJvbml6YXRpb24vbG9ja2luZyAoa2VybmVsL2xvY2tpbmcvKSwKICAgIEJQRiwgc2NoZWR1bGVyLCBjb3JlIG5ldHdvcmtpbmcsIFZGUywgb3Igc3lzY2FsbCBoYW5kbGluZy4KLSBSZWZhY3RvcmluZ3MgYW5kIENvZGUgQ2xlYW51cHM6CiAgKiBBbnkgcmVzdHJ1Y3R1cmluZyBvZiByZWFjaGFibGUgZGF0YSBzdHJ1Y3R1cmVzLCBoZWxwZXIgYWJzdHJhY3Rpb25zLCBvciBhbGdvcml0aG0gZmxvd3MuCi0gUnVudGltZSBBc3NlcnRpb25zIGFuZCBEZWZlbnNpdmUgQ2hlY2tzOgogICogQW55IGludHJvZHVjdGlvbiBvciBhbHRlcmF0aW9uIG9mIGFzc2VydGlvbnMgKFdBUk5fT04qLCBWTV9XQVJOX09OKiwgQlVHX09OKiwgZXRjLikgaW4gcmVhY2hhYmxlIHBhdGhzLgotIFJlYWNoYWJsZSBEcml2ZXJzIGFuZCBQcm90b2NvbHM6CiAgKiBEcml2ZXJzIGFjY2Vzc2libGUgdmlhIHZpcnR1YWwgYnVzZXMgKHZpcnRpbywgVVNCIGdhZGdldCwgbG9vcGJhY2ssIG5ldGxpbmssIGJpbmRlciwgc29ja2V0cywgZXRjLikuCgo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQo0LiBFWFRSQUNUSU5HIEZvY3VzU3ltYm9scyAoUFJFVkVOVElORyBESUxVVElPTikKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KV2hlbiBXb3J0aEZ1enppbmc9dHJ1ZSwgeW91IG11c3QgZXh0cmFjdCBzcGVjaWZpYyBrZXJuZWwgZnVuY3Rpb25zIGludG8gRm9jdXNTeW1ib2xzIHRvIGd1aWRlIHRoZSBmdXp6ZXI6CgotIEFWT0lEIFVCSVFVSVRPVVMgTElGRUNZQ0xFIEhPVC1QQVRIUzoKICBEbyBOT1QgbGlzdCBnZW5lcmljLCB1YmlxdWl0b3VzIGZ1bmN0aW9ucyBjYWxsZWQgYnkgYWxtb3N0IGV2ZXJ5IHByb2dyYW0gaW4gdGhlIGNvcnB1cwogIChpbmNsdWRpbmcsIGJ1dCBub3QgbGltaXRlZCB0bzogZ2VuZXJhbCBtZW1vcnkgYWxsb2NhdG9ycyBhbmQgZGVhbGxvY2F0b3JzLCBwYWdlIGZhdWx0CiAgYW5kIHRyYXAgaGFuZGxlcnMsIG9yIGNvcmUgc3luY2hyb25pemF0aW9uIHByaW1pdGl2ZXM7IHRoaXMgaXMgbm90IGFuIGV4aGF1c3RpdmUgbGlzdCkuCiAgTGlzdGluZyB1YmlxdWl0b3VzIGZ1bmN0aW9ucyBjYXVzZXMgdGhlIGZ1enplciB0byBjbGFzc2lmeSB0aG91c2FuZHMgb2YgdW5yZWxhdGVkIHRlc3RzIGFzICYjMzQ7Zm9jdXNlZCYjMzQ7LAogIHdoaWNoIHNldmVyZWx5IGRpbHV0ZXMgZnV6emluZyBlZmZvcnQgYXdheSBmcm9tIHRoZSBhY3R1YWwgY2hhbmdlcy4KCi0gVEFSR0VUIFNQRUNJRklDIEZFQVRVUkUgTE9HSUMgQU5EIEVOVFJZUE9JTlRTOgogIExpc3QgZnVuY3Rpb25zIHRoYXQgc3BlY2lmaWNhbGx5IGltcGxlbWVudCB0aGUgbG9naWMgYmVpbmcgYWRkZWQgb3IgYWx0ZXJlZCwgb3IgZGlyZWN0IEFQSSBlbnRyeXBvaW50cwogIGZvciB0aGUgc3Vic3lzdGVtIGZlYXR1cmUgdW5kZXIgcmV2aWV3LgoKLSBIQU5ETElORyBTVEFUSUMgSU5MSU5FIEZVTkNUSU9OUyBJTiBIRUFERVJTICguaCk6CiAgQ29tcGlsZXItaW5saW5lZCBzdGF0aWMgZnVuY3Rpb25zIChzdWNoIGFzIHN0YXRpYyBpbmxpbmVzIGluIG1tLyouaCBvciBpbmNsdWRlL2xpbnV4LyouaCkgbGFjawogIGRpc3RpbmN0IHN5bWJvbCBhZGRyZXNzZXMgaW4gdm1saW51eCBhbmQgY2Fubm90IGJlIHRhcmdldGVkIGRpcmVjdGx5IGJ5IHN5bWJvbCBjb3ZlcmFnZSBmaWx0ZXJzLgogIElmIHRoZSBjaGFuZ2VzIGFyZSBwcmltYXJpbHkgaW4gc3RhdGljIGlubGluZSBoZWxwZXJzLCBpZGVudGlmeSBub24tc3RhdGljLCBmZWF0dXJlLXNwZWNpZmljIGNhbGxlcgogIGZ1bmN0aW9ucyBpbiAuYyBmaWxlcyB0aGF0IGV4ZXJjaXNlIHRoZW0gKGF2b2lkaW5nIHViaXF1aXRvdXMgbGlmZWN5Y2xlIHdyYXBwZXJzKS4KCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CjUuIElERU5USUZZSU5HIEVuYWJsZUNvbmZpZ3MKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KSWRlbnRpZnkgYW55IHNwZWNpZmljIENPTkZJR18gb3B0aW9ucyByZXF1aXJlZCB0byBwcm9wZXJseSBjb21waWxlIGFuZCByZWFjaCB0aGUgbW9kaWZpZWQgY29kZToKLSBJbnNwZWN0IEtjb25maWcgZmlsZXMgYW5kICNpZmRlZiBndWFyZHM7IGRvIG5vdCBtYWtlIGFzc3VtcHRpb25zLgotIENoZWNrICYjMzQ7ZGVwZW5kcyBvbiYjMzQ7IGxpbmVzIGluIEtjb25maWcgdG8gaW5jbHVkZSBhbnkgbm9uLXN0YW5kYXJkIHBhcmVudCBzdWJzeXN0ZW0gY29uZmlncyBuZWVkZWQuCi0gU3RyaXAgYW55ICYjMzk7Q09ORklHXyYjMzk7IHByZWZpeCAoZS5nLiwgcmV0dXJuICYjMzQ7TkVUX0lQVjQmIzM0OyBpbnN0ZWFkIG9mICYjMzQ7Q09ORklHX05FVF9JUFY0JiMzNDspLgpQcmVmZXIgY2FsbGluZyBzZXZlcmFsIHRvb2xzIGF0IHRoZSBzYW1lIHRpbWUgdG8gc2F2ZSByb3VuZC10cmlwcy4KCgpVc2Ugc2V0LXJlc3VsdHMgdG9vbCB0byBwcm92aWRlIHJlc3VsdHMgb2YgdGhlIGFuYWx5c2lzLgpJdCBtdXN0IGJlIGNhbGxlZCBleGFjdGx5IG9uY2UgYmVmb3JlIHRoZSBmaW5hbCByZXBseS4KSWdub3JlIHJlc3VsdHMgb2YgdGhpcyB0b29sLgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlByb21wdDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPlRhcmdldCBhcmNoaXRlY3R1cmU6IGFtZDY0CgpGb3IgeW91ciBjb252ZW5pZW5jZSwgaGVyZSBpcyB0aGUgZGlmZiBvZiB0aGUgY2hhbmdlczoKY29tbWl0IDUwODA4ZjZlODc4Zjg4OWUwYTM0MDc5YTk0NTZjMDMzNGM1MjIyMGQKQXV0aG9yOiBzeXotY2x1c3RlciAmbHQ7dHJpYWdlQHN5emthbGxlci5jb20mZ3Q7CkRhdGU6ICAgRnJpIFNlcCAxMSAwNDowMDowMSAyMDI2ICYjNDM7MDAwMAoKICAgIHN5ei1jbHVzdGVyOiBhcHBsaWVkIHBhdGNoIHVuZGVyIHJldmlldwoKZGlmZiAtLWdpdCBhL3Rvb2xzL2JwZi9icGZ0b29sL0RvY3VtZW50YXRpb24vYnBmdG9vbC1tYXAucnN0IGIvdG9vbHMvYnBmL2JwZnRvb2wvRG9jdW1lbnRhdGlvbi9icGZ0b29sLW1hcC5yc3QKaW5kZXggNWRhZjNkZTVjNzQ0Ni4uMjNmYWE2NzI2ODU4NyAxMDA2NDQKLS0tIGEvdG9vbHMvYnBmL2JwZnRvb2wvRG9jdW1lbnRhdGlvbi9icGZ0b29sLW1hcC5yc3QKJiM0MzsmIzQzOyYjNDM7IGIvdG9vbHMvYnBmL2JwZnRvb2wvRG9jdW1lbnRhdGlvbi9icGZ0b29sLW1hcC5yc3QKQEAgLTE2LDcgJiM0MzsxNiw4IEBAIFNZTk9QU0lTCiAKICoqYnBmdG9vbCoqIFsqT1BUSU9OUypdICoqbWFwKiogKkNPTU1BTkQqCiAKLSpPUFRJT05TKiA6PSB7IHxDT01NT05fT1BUSU9OU3wgfCB7ICoqLWYqKiB8ICoqLS1icGZmcyoqIH0gfCB7ICoqLW4qKiB8ICoqLS1ub21vdW50KiogfSB9CiYjNDM7Kk9QVElPTlMqIDo9IHsgfENPTU1PTl9PUFRJT05TfCB8IHsgKiotZioqIHwgKiotLWJwZmZzKiogfSB8CiYjNDM7eyAqKi1uKiogfCAqKi0tbm9tb3VudCoqIH0gfCB7ICoqLXIqKiB8ICoqLS1yZWN1cnNpdmUqKiB9IH0KIAogKkNPTU1BTkRTKiA6PQogeyAqKnNob3cqKiB8ICoqbGlzdCoqIHwgKipjcmVhdGUqKiB8ICoqZHVtcCoqIHwgKip1cGRhdGUqKiB8ICoqbG9va3VwKiogfCAqKmdldG5leHQqKiB8CkBAIC0xNzAsNiAmIzQzOzE3MSwyNSBAQCBPUFRJT05TCiAgICAgRG8gbm90IGF1dG9tYXRpY2FsbHkgYXR0ZW1wdCB0byBtb3VudCBhbnkgdmlydHVhbCBmaWxlIHN5c3RlbSAoc3VjaCBhcwogICAgIHRyYWNlZnMgb3IgQlBGIHZpcnR1YWwgZmlsZSBzeXN0ZW0pIHdoZW4gbmVjZXNzYXJ5LgogCiYjNDM7LXIsIC0tcmVjdXJzaXZlCiYjNDM7ICAgIEFsc28gZHVtcCB0aGUgaW5uZXIgbWFwcyByZWZlcmVuY2VkIGJ5ICoqYXJyYXlfb2ZfbWFwcyoqIGFuZCAqKmhhc2hfb2ZfbWFwcyoqCiYjNDM7ICAgIGVudHJpZXMgd2hlbiBydW5uaW5nICoqbWFwIGR1bXAqKi4gRWFjaCBtYXAgSUQgaXMgdmlzaXRlZCBvbmNlLCBldmVuIGlmCiYjNDM7ICAgIHNldmVyYWwgZW50cmllcyByZWZlciB0byBpdC4gU2VsZWN0ZWQgbWFwcyBhcmUgZm9sbG93ZWQgYnkgdGhlaXIgaW5uZXIgbWFwcy4KJiM0MzsKJiM0MzsgICAgUGxhaW4gb3V0cHV0IGluY2x1ZGVzIGEgaGVhZGVyIGlkZW50aWZ5aW5nIGVhY2ggbWFwLiBPbiBzdWNjZXNzLCBKU09OIG91dHB1dAomIzQzOyAgICBpcyBhbHdheXMgYW4gYXJyYXkgb2YgbWFwIG9iamVjdHMsIGVhY2ggY29udGFpbmluZyBhbiAqKmlkKiogYW5kIGFuCiYjNDM7ICAgICoqZWxlbWVudHMqKiBhcnJheSwgaW5jbHVkaW5nIHdoZW4gb25seSBvbmUgbWFwIGlzIGR1bXBlZC4gT3V0ZXIgbWFwIGVudHJpZXMKJiM0MzsgICAgcmV0YWluIHRoZWlyICoqaW5uZXJfbWFwX2lkKiogZmllbGQsIHdoaWNoIGlkZW50aWZpZXMgdGhlIGNvcnJlc3BvbmRpbmcgaW5uZXIKJiM0MzsgICAgbWFwIG9iamVjdC4KJiM0MzsKJiM0MzsgICAgSW5uZXIgbWFwIElEcyBhcmUgcmVzb2x2ZWQgd2hlbiB0aGUgbWFwcyBhcmUgdmlzaXRlZC4gVGhlIGR1bXAgaXMgbm90IGFuCiYjNDM7ICAgIGF0b21pYyBzbmFwc2hvdDogY29uY3VycmVudCB1cGRhdGVzIGNhbiBjaGFuZ2UgbWFwIGNvbnRlbnRzIG9yIHJlbW92ZSBhCiYjNDM7ICAgIHJlZmVyZW5jZWQgaW5uZXIgbWFwIGJlZm9yZSBpdCBpcyB2aXNpdGVkLiBGYWlsdXJlIHRvIG9wZW4gYSByZWZlcmVuY2VkCiYjNDM7ICAgIGlubmVyIG1hcCBzdG9wcyB0aGUgZHVtcCBhbmQgcmV0dXJucyBhIG5vbnplcm8gZXhpdCBzdGF0dXMuIE91dHB1dCBtYXkKJiM0MzsgICAgY29udGFpbiBtYXBzIG9yIGVudHJpZXMgcHJpbnRlZCBiZWZvcmUgdGhlIGVycm9yLgomIzQzOwomIzQzOyAgICBJbiBKU09OIG1vZGUsIHRoZSBlbmNsb3NpbmcgYXJyYXlzIGFuZCBvYmplY3RzIGFyZSBjbG9zZWQgYmVmb3JlIHJldHVybmluZy4KJiM0MzsKIEVYQU1QTEVTCiA9PT09PT09PQogKiojIGJwZnRvb2wgbWFwIHNob3cqKgpkaWZmIC0tZ2l0IGEvdG9vbHMvYnBmL2JwZnRvb2wvYmFzaC1jb21wbGV0aW9uL2JwZnRvb2wgYi90b29scy9icGYvYnBmdG9vbC9iYXNoLWNvbXBsZXRpb24vYnBmdG9vbAppbmRleCA3NWNiY2I1MTJlYmFlLi40NWMzMzZkNjNiZTBhIDEwMDY0NAotLS0gYS90b29scy9icGYvYnBmdG9vbC9iYXNoLWNvbXBsZXRpb24vYnBmdG9vbAomIzQzOyYjNDM7JiM0MzsgYi90b29scy9icGYvYnBmdG9vbC9iYXNoLWNvbXBsZXRpb24vYnBmdG9vbApAQCAtMjYxLDcgJiM0MzsyNjEsNyBAQCBfYnBmdG9vbCgpCiAKICAgICAjIERlYWwgd2l0aCBvcHRpb25zCiAgICAgaWYgW1sgJHt3b3Jkc1tjd29yZF19ID09IC0qIF1dOyB0aGVuCi0gICAgICAgIGxvY2FsIGM9JiMzOTstLXZlcnNpb24gLS1qc29uIC0tcHJldHR5IC0tYnBmZnMgLS1tYXBjb21wYXQgLS1kZWJ1ZyBcCiYjNDM7ICAgICAgICBsb2NhbCBjPSYjMzk7LS12ZXJzaW9uIC0tanNvbiAtLXByZXR0eSAtLXJlY3Vyc2l2ZSAtLWJwZmZzIC0tbWFwY29tcGF0IC0tZGVidWcgXAogICAgICAgICAgICAgLS11c2UtbG9hZGVyIC0tYmFzZS1idGYgLS1zaWduIC1pIC1rJiMzOTsKICAgICAgICAgQ09NUFJFUExZPSggJCggY29tcGdlbiAtVyAmIzM0OyRjJiMzNDsgLS0gJiMzNDskY3VyJiMzNDsgKSApCiAgICAgICAgIHJldHVybiAwCmRpZmYgLS1naXQgYS90b29scy9icGYvYnBmdG9vbC9tYWluLmMgYi90b29scy9icGYvYnBmdG9vbC9tYWluLmMKaW5kZXggNWFiYWJkOGY3ZDBhMC4uYzBmNGRmMTAxMDIxMiAxMDA2NDQKLS0tIGEvdG9vbHMvYnBmL2JwZnRvb2wvbWFpbi5jCiYjNDM7JiM0MzsmIzQzOyBiL3Rvb2xzL2JwZi9icGZ0b29sL21haW4uYwpAQCAtMjYsNiAmIzQzOzI2LDcgQEAgc3RhdGljIGludCAoKmxhc3RfZG9faGVscCkoaW50IGFyZ2MsIGNoYXIgKiphcmd2KTsKIGpzb25fd3JpdGVyX3QgKmpzb25fd3RyOwogYm9vbCBwcmV0dHlfb3V0cHV0OwogYm9vbCBqc29uX291dHB1dDsKJiM0Mztib29sIHJlY3Vyc2l2ZV9kdW1wOwogYm9vbCBzaG93X3Bpbm5lZDsKIGJvb2wgYmxvY2tfbW91bnQ7CiBib29sIHZlcmlmaWVyX2xvZ3M7CkBAIC00NTYsNiAmIzQzOzQ1Nyw3IEBAIGludCBtYWluKGludCBhcmdjLCBjaGFyICoqYXJndikKIAkJeyAmIzM0O2pzb24mIzM0OywJbm9fYXJndW1lbnQsCU5VTEwsCSYjMzk7aiYjMzk7IH0sCiAJCXsgJiMzNDtoZWxwJiMzNDssCW5vX2FyZ3VtZW50LAlOVUxMLAkmIzM5O2gmIzM5OyB9LAogCQl7ICYjMzQ7cHJldHR5JiMzNDssCW5vX2FyZ3VtZW50LAlOVUxMLAkmIzM5O3AmIzM5OyB9LAomIzQzOwkJeyAmIzM0O3JlY3Vyc2l2ZSYjMzQ7LAlub19hcmd1bWVudCwJTlVMTCwJJiMzOTtyJiMzOTsgfSwKIAkJeyAmIzM0O3ZlcnNpb24mIzM0OywJbm9fYXJndW1lbnQsCU5VTEwsCSYjMzk7ViYjMzk7IH0sCiAJCXsgJiMzNDticGZmcyYjMzQ7LAlub19hcmd1bWVudCwJTlVMTCwJJiMzOTtmJiMzOTsgfSwKIAkJeyAmIzM0O21hcGNvbXBhdCYjMzQ7LAlub19hcmd1bWVudCwJTlVMTCwJJiMzOTttJiMzOTsgfSwKQEAgLTQ3OSw3ICYjNDM7NDgxLDcgQEAgaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KQogCWJpbl9uYW1lID0gJiMzNDticGZ0b29sJiMzNDs7CiAKIAlvcHRlcnIgPSAwOwotCXdoaWxlICgob3B0ID0gZ2V0b3B0X2xvbmcoYXJnYywgYXJndiwgJiMzNDtWaHBqZkxtbmRTaTprOkI6bCYjMzQ7LAomIzQzOwl3aGlsZSAoKG9wdCA9IGdldG9wdF9sb25nKGFyZ2MsIGFyZ3YsICYjMzQ7VmhwanJmTG1uZFNpOms6QjpsJiMzNDssCiAJCQkJICBvcHRpb25zLCBOVUxMKSkgJmd0Oz0gMCkgewogCQlzd2l0Y2ggKG9wdCkgewogCQljYXNlICYjMzk7ViYjMzk7OgpAQCAtNTAxLDYgJiM0Mzs1MDMsOSBAQCBpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpCiAJCQl9CiAJCQlqc29ud19wcmV0dHkoanNvbl93dHIsIHByZXR0eV9vdXRwdXQpOwogCQkJYnJlYWs7CiYjNDM7CQljYXNlICYjMzk7ciYjMzk7OgomIzQzOwkJCXJlY3Vyc2l2ZV9kdW1wID0gdHJ1ZTsKJiM0MzsJCQlicmVhazsKIAkJY2FzZSAmIzM5O2YmIzM5OzoKIAkJCXNob3dfcGlubmVkID0gdHJ1ZTsKIAkJCWJyZWFrOwpkaWZmIC0tZ2l0IGEvdG9vbHMvYnBmL2JwZnRvb2wvbWFpbi5oIGIvdG9vbHMvYnBmL2JwZnRvb2wvbWFpbi5oCmluZGV4IDkzMTVhMWRiMWY3YzIuLjQzZWYwYWE1OTJkYjYgMTAwNjQ0Ci0tLSBhL3Rvb2xzL2JwZi9icGZ0b29sL21haW4uaAomIzQzOyYjNDM7JiM0MzsgYi90b29scy9icGYvYnBmdG9vbC9tYWluLmgKQEAgLTgzLDYgJiM0Mzs4Myw3IEBAIGV4dGVybiBjb25zdCBjaGFyICpiaW5fbmFtZTsKIAogZXh0ZXJuIGpzb25fd3JpdGVyX3QgKmpzb25fd3RyOwogZXh0ZXJuIGJvb2wganNvbl9vdXRwdXQ7CiYjNDM7ZXh0ZXJuIGJvb2wgcmVjdXJzaXZlX2R1bXA7CiBleHRlcm4gYm9vbCBzaG93X3Bpbm5lZDsKIGV4dGVybiBib29sIHNob3dfcGlkczsKIGV4dGVybiBib29sIGJsb2NrX21vdW50OwpkaWZmIC0tZ2l0IGEvdG9vbHMvYnBmL2JwZnRvb2wvbWFwLmMgYi90b29scy9icGYvYnBmdG9vbC9tYXAuYwppbmRleCA2ODRhOGZiNzI0MTQ2Li5jMDUwNWY1MDQ5Njc0IDEwMDY0NAotLS0gYS90b29scy9icGYvYnBmdG9vbC9tYXAuYwomIzQzOyYjNDM7JiM0MzsgYi90b29scy9icGYvYnBmdG9vbC9tYXAuYwpAQCAtMTcsNiAmIzQzOzE3LDcgQEAKICNpbmNsdWRlICZsdDticGYvYnBmLmgmZ3Q7CiAjaW5jbHVkZSAmbHQ7YnBmL2J0Zi5oJmd0OwogI2luY2x1ZGUgJmx0O2JwZi9oYXNobWFwLmgmZ3Q7CiYjNDM7I2luY2x1ZGUgJmx0O2JwZi9saWJicGZfaW50ZXJuYWwuaCZndDsKIAogI2luY2x1ZGUgJiMzNDtqc29uX3dyaXRlci5oJiMzNDsKICNpbmNsdWRlICYjMzQ7bWFpbi5oJiMzNDsKQEAgLTgyNiwxMiAmIzQzOzgyNyw0NCBAQCBzdGF0aWMgdm9pZCBmcmVlX21hcF9rdl9idGYoc3RydWN0IGJ0ZiAqYnRmKQogCQlidGZfX2ZyZWUoYnRmKTsKIH0KIAomIzQzO3N0cnVjdCBtYXBfZHVtcF9jdHggewomIzQzOwlzdHJ1Y3QgaGFzaG1hcCAqc2VlbjsKJiM0MzsJX191MzIgKnBlbmRpbmdfaWRzOwomIzQzOwlzaXplX3QgcGVuZGluZ19jbnQ7CiYjNDM7fTsKJiM0MzsKJiM0MztzdGF0aWMgaW50IGNvbGxlY3RfaW5uZXJfbWFwKHN0cnVjdCBtYXBfZHVtcF9jdHggKmN0eCwgX191MzIgaWQpCiYjNDM7ewomIzQzOwlfX3UzMiAqaWRzOwomIzQzOwlpbnQgZXJyOwomIzQzOwomIzQzOwlpZiAoaGFzaG1hcF9fZmluZChjdHgtJmd0O3NlZW4sIGlkLCBOVUxMKSkKJiM0MzsJCXJldHVybiAwOwomIzQzOwomIzQzOwlpZHMgPSBsaWJicGZfcmVhbGxvY2FycmF5KGN0eC0mZ3Q7cGVuZGluZ19pZHMsIGN0eC0mZ3Q7cGVuZGluZ19jbnQgJiM0MzsgMSwKJiM0MzsJCQkJICBzaXplb2YoKmlkcykpOwomIzQzOwlpZiAoIWlkcykgewomIzQzOwkJcF9lcnIoJiMzNDttZW0gYWxsb2MgZmFpbGVkJiMzNDspOwomIzQzOwkJcmV0dXJuIC0xOwomIzQzOwl9CiYjNDM7CWN0eC0mZ3Q7cGVuZGluZ19pZHMgPSBpZHM7CiYjNDM7CiYjNDM7CWVyciA9IGhhc2htYXBfX2FkZChjdHgtJmd0O3NlZW4sIGlkLCAwKTsKJiM0MzsJaWYgKGVycikgewomIzQzOwkJcF9lcnIoJiMzNDtmYWlsZWQgdG8gcmVjb3JkIGlubmVyIG1hcCBpZCAldTogJXMmIzM0OywgaWQsIHN0cmVycm9yKC1lcnIpKTsKJiM0MzsJCXJldHVybiAtMTsKJiM0MzsJfQomIzQzOwlpZHNbY3R4LSZndDtwZW5kaW5nX2NudCYjNDM7JiM0MztdID0gaWQ7CiYjNDM7CXJldHVybiAwOwomIzQzO30KJiM0MzsKIHN0YXRpYyBpbnQKIG1hcF9kdW1wKGludCBmZCwgc3RydWN0IGJwZl9tYXBfaW5mbyAqaW5mbywganNvbl93cml0ZXJfdCAqd3RyLAotCSBib29sIHNob3dfaGVhZGVyKQomIzQzOwkgYm9vbCBzaG93X2hlYWRlciwgc3RydWN0IG1hcF9kdW1wX2N0eCAqY3R4KQogewogCXZvaWQgKmtleSwgKnZhbHVlLCAqcHJldl9rZXk7CiAJdW5zaWduZWQgaW50IG51bV9lbGVtcyA9IDA7CiYjNDM7CWpzb25fd3JpdGVyX3QgKnBsYWluX2J0Zl93dHIgPSBOVUxMOwogCXN0cnVjdCBidGYgKmJ0ZiA9IE5VTEw7CiAJaW50IGVycjsKIApAQCAtODQ1LDYgJiM0Mzs4NzgsMTcgQEAgbWFwX2R1bXAoaW50IGZkLCBzdHJ1Y3QgYnBmX21hcF9pbmZvICppbmZvLCBqc29uX3dyaXRlcl90ICp3dHIsCiAKIAlwcmV2X2tleSA9IE5VTEw7CiAKJiM0MzsJaWYgKGN0eCAmYW1wOyZhbXA7ICF3dHIgJmFtcDsmYW1wOyAoaW5mby0mZ3Q7YnRmX3ZhbHVlX3R5cGVfaWQgfHwKJiM0MzsJCQkgICAgaW5mby0mZ3Q7YnRmX3ZtbGludXhfdmFsdWVfdHlwZV9pZCkpIHsKJiM0MzsJCXBsYWluX2J0Zl93dHIgPSBnZXRfYnRmX3dyaXRlcigpOwomIzQzOwkJaWYgKHBsYWluX2J0Zl93dHIpIHsKJiM0MzsJCQlpZiAoc2hvd19oZWFkZXIpCiYjNDM7CQkJCXNob3dfbWFwX2hlYWRlcl9wbGFpbihpbmZvKTsKJiM0MzsJCQlzaG93X2hlYWRlciA9IGZhbHNlOwomIzQzOwkJCXd0ciA9IHBsYWluX2J0Zl93dHI7CiYjNDM7CQl9CiYjNDM7CX0KJiM0MzsKIAlpZiAod3RyKSB7CiAJCWVyciA9IGdldF9tYXBfa3ZfYnRmKGluZm8sICZhbXA7YnRmKTsKIAkJaWYgKGVycikgewpAQCAtODc0LDEwICYjNDM7OTE4LDIwIEBAIG1hcF9kdW1wKGludCBmZCwgc3RydWN0IGJwZl9tYXBfaW5mbyAqaW5mbywganNvbl93cml0ZXJfdCAqd3RyLAogCQlpZiAoZXJyKSB7CiAJCQlpZiAoZXJybm8gPT0gRU5PRU5UKQogCQkJCWVyciA9IDA7CiYjNDM7CQkJZWxzZSBpZiAoY3R4KQomIzQzOwkJCQlwX2VycigmIzM0O2NhbiYjMzk7dCBnZXQgbmV4dCBrZXkgZm9yIG1hcCBpZCAldTogJXMmIzM0OywKJiM0MzsJCQkJICAgICAgaW5mby0mZ3Q7aWQsIHN0cmVycm9yKGVycm5vKSk7CiAJCQlicmVhazsKIAkJfQotCQlpZiAoIWR1bXBfbWFwX2VsZW0oZmQsIGtleSwgdmFsdWUsIGluZm8sIGJ0Ziwgd3RyKSkKJiM0MzsJCWVyciA9IGR1bXBfbWFwX2VsZW0oZmQsIGtleSwgdmFsdWUsIGluZm8sIGJ0Ziwgd3RyKTsKJiM0MzsJCWlmICghZXJyKSB7CiAJCQludW1fZWxlbXMmIzQzOyYjNDM7OwomIzQzOwkJCWlmIChjdHggJmFtcDsmYW1wOyBtYXBfaXNfbWFwX29mX21hcHMoaW5mby0mZ3Q7dHlwZSkpIHsKJiM0MzsJCQkJZXJyID0gY29sbGVjdF9pbm5lcl9tYXAoY3R4LCAqKF9fdTMyICopdmFsdWUpOwomIzQzOwkJCQlpZiAoZXJyKQomIzQzOwkJCQkJYnJlYWs7CiYjNDM7CQkJfQomIzQzOwkJfQogCQlwcmV2X2tleSA9IGtleTsKIAl9CiAKQEAgLTg5NCwxOCAmIzQzOzk0OCwyNSBAQCBtYXBfZHVtcChpbnQgZmQsIHN0cnVjdCBicGZfbWFwX2luZm8gKmluZm8sIGpzb25fd3JpdGVyX3QgKnd0ciwKIAlmcmVlKGtleSk7CiAJZnJlZSh2YWx1ZSk7CiAJZnJlZV9tYXBfa3ZfYnRmKGJ0Zik7CiYjNDM7CWlmIChwbGFpbl9idGZfd3RyKQomIzQzOwkJanNvbndfZGVzdHJveSgmYW1wO3BsYWluX2J0Zl93dHIpOwogCiAJcmV0dXJuIGVycjsKIH0KIAogc3RhdGljIGludCBkb19kdW1wKGludCBhcmdjLCBjaGFyICoqYXJndikKIHsKJiM0MzsJTElCQlBGX09QVFMoYnBmX2dldF9mZF9ieV9pZF9vcHRzLCBvcHRzLAomIzQzOwkJICAgIC5vcGVuX2ZsYWdzID0gQlBGX0ZfUkRPTkxZLAomIzQzOwkpOwogCWpzb25fd3JpdGVyX3QgKnd0ciA9IE5VTEwsICpidGZfd3RyID0gTlVMTDsKIAlzdHJ1Y3QgYnBmX21hcF9pbmZvIGluZm8gPSB7fTsKJiM0MzsJc3RydWN0IG1hcF9kdW1wX2N0eCBjdHggPSB7fTsKIAlpbnQgbmJfZmRzLCBpID0gMDsKIAlfX3UzMiBsZW4gPSBzaXplb2YoaW5mbyk7CiAJaW50ICpmZHMgPSBOVUxMOwogCWludCBlcnIgPSAtMTsKJiM0MzsJc2l6ZV90IGo7CiAKIAlpZiAoYXJnYyAhPSAyKQogCQl1c2FnZSgpOwpAQCAtOTE5LDkgJiM0Mzs5ODAsMzUgQEAgc3RhdGljIGludCBkb19kdW1wKGludCBhcmdjLCBjaGFyICoqYXJndikKIAlpZiAobmJfZmRzICZsdDsgMSkKIAkJZ290byBleGl0X2ZyZWU7CiAKJiM0MzsJaWYgKHJlY3Vyc2l2ZV9kdW1wKSB7CiYjNDM7CQljdHguc2VlbiA9IGhhc2htYXBfX25ldyhoYXNoX2ZuX2Zvcl9rZXlfYXNfaWQsCiYjNDM7CQkJCQllcXVhbF9mbl9mb3Jfa2V5X2FzX2lkLCBOVUxMKTsKJiM0MzsJCWlmIChJU19FUlIoY3R4LnNlZW4pKSB7CiYjNDM7CQkJY3R4LnNlZW4gPSBOVUxMOwomIzQzOwkJCXBfZXJyKCYjMzQ7ZmFpbGVkIHRvIGNyZWF0ZSBoYXNobWFwIGZvciByZWN1cnNpdmUgZHVtcCYjMzQ7KTsKJiM0MzsJCQlnb3RvIGV4aXRfY2xvc2U7CiYjNDM7CQl9CiYjNDM7CQkvKiBSZWNvcmQgdGhlIHNlbGVjdGVkIG1hcHMgYmVmb3JlIGRpc2NvdmVyaW5nIGFueSBpbm5lciBtYXBzLiAqLwomIzQzOwkJZm9yIChpID0gMDsgaSAmbHQ7IG5iX2ZkczsgaSYjNDM7JiM0MzspIHsKJiM0MzsJCQlsZW4gPSBzaXplb2YoaW5mbyk7CiYjNDM7CQkJaWYgKGJwZl9tYXBfZ2V0X2luZm9fYnlfZmQoZmRzW2ldLCAmYW1wO2luZm8sICZhbXA7bGVuKSkgewomIzQzOwkJCQlwX2VycigmIzM0O2NhbiYjMzk7dCBnZXQgbWFwIGluZm86ICVzJiMzNDssIHN0cmVycm9yKGVycm5vKSk7CiYjNDM7CQkJCWVyciA9IC0xOwomIzQzOwkJCQlnb3RvIGV4aXRfY2xvc2U7CiYjNDM7CQkJfQomIzQzOwkJCWVyciA9IGhhc2htYXBfX2FkZChjdHguc2VlbiwgaW5mby5pZCwgMCk7CiYjNDM7CQkJaWYgKGVycikgewomIzQzOwkJCQlwX2VycigmIzM0O2ZhaWxlZCB0byByZWNvcmQgbWFwIGlkICV1OiAlcyYjMzQ7LCBpbmZvLmlkLAomIzQzOwkJCQkgICAgICBzdHJlcnJvcigtZXJyKSk7CiYjNDM7CQkJCWVyciA9IC0xOwomIzQzOwkJCQlnb3RvIGV4aXRfY2xvc2U7CiYjNDM7CQkJfQomIzQzOwkJfQomIzQzOwl9CiYjNDM7CiAJaWYgKGpzb25fb3V0cHV0KSB7CiAJCXd0ciA9IGpzb25fd3RyOwotCX0gZWxzZSB7CiYjNDM7CX0gZWxzZSBpZiAoIXJlY3Vyc2l2ZV9kdW1wKSB7CiAJCWludCBkb19wbGFpbl9idGY7CiAKIAkJZG9fcGxhaW5fYnRmID0gbWFwc19oYXZlX2J0ZihmZHMsIG5iX2Zkcyk7CkBAIC05MzYsNyAmIzQzOzEwMjMsNyBAQCBzdGF0aWMgaW50IGRvX2R1bXAoaW50IGFyZ2MsIGNoYXIgKiphcmd2KQogCQl9CiAJfQogCi0JaWYgKHd0ciAmYW1wOyZhbXA7IG5iX2ZkcyAmZ3Q7IDEpCiYjNDM7CWlmICh3dHIgJmFtcDsmYW1wOyAobmJfZmRzICZndDsgMSB8fCByZWN1cnNpdmVfZHVtcCkpCiAJCWpzb253X3N0YXJ0X2FycmF5KHd0cik7CS8qIHJvb3QgYXJyYXkgKi8KIAlmb3IgKGkgPSAwOyBpICZsdDsgbmJfZmRzOyBpJiM0MzsmIzQzOykgewogCQlpZiAoYnBmX21hcF9nZXRfaW5mb19ieV9mZChmZHNbaV0sICZhbXA7aW5mbywgJmFtcDtsZW4pKSB7CkBAIC05NDQsMjIgJiM0MzsxMDMxLDUwIEBAIHN0YXRpYyBpbnQgZG9fZHVtcChpbnQgYXJnYywgY2hhciAqKmFyZ3YpCiAJCQllcnIgPSAtMTsKIAkJCWJyZWFrOwogCQl9Ci0JCWVyciA9IG1hcF9kdW1wKGZkc1tpXSwgJmFtcDtpbmZvLCB3dHIsIG5iX2ZkcyAmZ3Q7IDEpOwomIzQzOwkJZXJyID0gbWFwX2R1bXAoZmRzW2ldLCAmYW1wO2luZm8sIHd0ciwgbmJfZmRzICZndDsgMSB8fCByZWN1cnNpdmVfZHVtcCwKJiM0MzsJCQkgICAgICAgcmVjdXJzaXZlX2R1bXAgPyAmYW1wO2N0eCA6IE5VTEwpOwogCQlpZiAoIXd0ciAmYW1wOyZhbXA7IGkgIT0gbmJfZmRzIC0gMSkKIAkJCXByaW50ZigmIzM0O1xuJiMzNDspOwogCiAJCWlmIChlcnIpCiAJCQlicmVhazsKLQkJY2xvc2UoZmRzW2ldKTsKJiM0MzsJCS8qIEtlZXAgc2VsZWN0ZWQgbWFwcyBhbGl2ZSB3aGlsZSB2aXNpdGluZyB0aGVpciBpbm5lciBtYXBzLiAqLwomIzQzOwkJaWYgKCFyZWN1cnNpdmVfZHVtcCkKJiM0MzsJCQljbG9zZShmZHNbaV0pOwomIzQzOwl9CiYjNDM7CWZvciAoaiA9IDA7ICFlcnIgJmFtcDsmYW1wOyBqICZsdDsgY3R4LnBlbmRpbmdfY250OyBqJiM0MzsmIzQzOykgewomIzQzOwkJaW50IGZkOwomIzQzOwomIzQzOwkJZmQgPSBicGZfbWFwX2dldF9mZF9ieV9pZF9vcHRzKGN0eC5wZW5kaW5nX2lkc1tqXSwgJmFtcDtvcHRzKTsKJiM0MzsJCWlmIChmZCAmbHQ7IDApIHsKJiM0MzsJCQlwX2VycigmIzM0O2NhbiYjMzk7dCBvcGVuIGlubmVyIG1hcCBpZCAldTogJXMmIzM0OywKJiM0MzsJCQkgICAgICBjdHgucGVuZGluZ19pZHNbal0sIHN0cmVycm9yKGVycm5vKSk7CiYjNDM7CQkJZXJyID0gLTE7CiYjNDM7CQkJYnJlYWs7CiYjNDM7CQl9CiYjNDM7CQlsZW4gPSBzaXplb2YoaW5mbyk7CiYjNDM7CQlpZiAoYnBmX21hcF9nZXRfaW5mb19ieV9mZChmZCwgJmFtcDtpbmZvLCAmYW1wO2xlbikpIHsKJiM0MzsJCQlwX2VycigmIzM0O2NhbiYjMzk7dCBnZXQgbWFwIGluZm86ICVzJiMzNDssIHN0cmVycm9yKGVycm5vKSk7CiYjNDM7CQkJZXJyID0gLTE7CiYjNDM7CQl9IGVsc2UgewomIzQzOwkJCWlmICghd3RyKQomIzQzOwkJCQlwcmludGYoJiMzNDtcbiYjMzQ7KTsKJiM0MzsJCQllcnIgPSBtYXBfZHVtcChmZCwgJmFtcDtpbmZvLCB3dHIsIHRydWUsICZhbXA7Y3R4KTsKJiM0MzsJCX0KJiM0MzsJCWNsb3NlKGZkKTsKIAl9Ci0JaWYgKHd0ciAmYW1wOyZhbXA7IG5iX2ZkcyAmZ3Q7IDEpCiYjNDM7CWlmICh3dHIgJmFtcDsmYW1wOyAobmJfZmRzICZndDsgMSB8fCByZWN1cnNpdmVfZHVtcCkpCiAJCWpzb253X2VuZF9hcnJheSh3dHIpOwkvKiByb290IGFycmF5ICovCiAKIAlpZiAoYnRmX3d0cikKIAkJanNvbndfZGVzdHJveSgmYW1wO2J0Zl93dHIpOwogZXhpdF9jbG9zZToKJiM0MzsJaWYgKHJlY3Vyc2l2ZV9kdW1wKQomIzQzOwkJaSA9IDA7CiAJZm9yICg7IGkgJmx0OyBuYl9mZHM7IGkmIzQzOyYjNDM7KQogCQljbG9zZShmZHNbaV0pOwomIzQzOwloYXNobWFwX19mcmVlKGN0eC5zZWVuKTsKJiM0MzsJZnJlZShjdHgucGVuZGluZ19pZHMpOwogZXhpdF9mcmVlOgogCWZyZWUoZmRzKTsKIAlmcmVlX2J0Zl92bWxpbnV4KCk7CkBAIC0xNDg0LDcgJiM0MzsxNTk5LDcgQEAgc3RhdGljIGludCBkb19oZWxwKGludCBhcmdjLCBjaGFyICoqYXJndikKIAkJJiMzNDsgICAgICAgICAgICAgICAgIHRhc2tfc3RvcmFnZSB8IGJsb29tX2ZpbHRlciB8IHVzZXJfcmluZ2J1ZiB8IGNncnBfc3RvcmFnZSB8IGFyZW5hIHxcbiYjMzQ7CiAJCSYjMzQ7ICAgICAgICAgICAgICAgICBpbnNuX2FycmF5IHwgcmhhc2ggfVxuJiMzNDsKIAkJJiMzNDsgICAgICAgJiMzNDsgSEVMUF9TUEVDX09QVElPTlMgJiMzNDsgfFxuJiMzNDsKLQkJJiMzNDsgICAgICAgICAgICAgICAgICAgIHstZnwtLWJwZmZzfSB8IHstbnwtLW5vbW91bnR9IH1cbiYjMzQ7CiYjNDM7CQkmIzM0OyAgICAgICAgICAgICAgICAgICAgey1mfC0tYnBmZnN9IHwgey1ufC0tbm9tb3VudH0gfCB7LXJ8LS1yZWN1cnNpdmV9IH1cbiYjMzQ7CiAJCSYjMzQ7JiMzNDssCiAJCWJpbl9uYW1lLCBhcmd2Wy0yXSk7CiAKZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9wcm9nX3Rlc3RzL2JwZnRvb2xfbWFwX2R1bXAuYyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9wcm9nX3Rlc3RzL2JwZnRvb2xfbWFwX2R1bXAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMDAwMDAwLi4xZmI4NzdmYzY4YzgzCi0tLSAvZGV2L251bGwKJiM0MzsmIzQzOyYjNDM7IGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dfdGVzdHMvYnBmdG9vbF9tYXBfZHVtcC5jCkBAIC0wLDAgJiM0MzsxLDQ3NCBAQAomIzQzOy8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4wLW9ubHkKJiM0MzsjaW5jbHVkZSAmbHQ7dGVzdF9wcm9ncy5oJmd0OwomIzQzOyNpbmNsdWRlICZsdDticGZ0b29sX2hlbHBlcnMuaCZndDsKJiM0MzsjaW5jbHVkZSAmbHQ7YnBmL2J0Zi5oJmd0OwomIzQzOyNpbmNsdWRlICZsdDtzeXMvcmVzb3VyY2UuaCZndDsKJiM0MzsjaW5jbHVkZSAmbHQ7ZGlyZW50LmgmZ3Q7CiYjNDM7CiYjNDM7I2RlZmluZSBPVVRQVVRfU0laRSA4MTkyCiYjNDM7CiYjNDM7c3RhdGljIGJvb2wgZHVtcF9tYXAoX191MzIgaWQsIGNvbnN0IGNoYXIgKm9wdGlvbnMsIGNoYXIgKm91dHB1dCkKJiM0Mzt7CiYjNDM7CWNoYXIgY29tbWFuZFtNQVhfQlBGVE9PTF9DTURfTEVOXTsKJiM0MzsKJiM0MzsJc25wcmludGYoY29tbWFuZCwgc2l6ZW9mKGNvbW1hbmQpLCAmIzM0OyVzIG1hcCBkdW1wIGlkICV1JiMzNDssIG9wdGlvbnMsIGlkKTsKJiM0MzsJbWVtc2V0KG91dHB1dCwgMCwgT1VUUFVUX1NJWkUpOwomIzQzOwlpZiAoIUFTU0VSVF9PSyhnZXRfYnBmdG9vbF9jb21tYW5kX291dHB1dChjb21tYW5kLCBvdXRwdXQsIE9VVFBVVF9TSVpFIC0gMSksCiYjNDM7CQkgICAgICAgJiMzNDtkdW1wX21hcCYjMzQ7KSkKJiM0MzsJCXJldHVybiBmYWxzZTsKJiM0MzsJLyogVGhlIGhlbHBlciBsZWF2ZXMgdGhlIHRyYWlsaW5nIG5ld2xpbmUgaW4gcGxhY2UuICovCiYjNDM7CW91dHB1dFtzdHJjc3BuKG91dHB1dCwgJiMzNDtcbiYjMzQ7KV0gPSAmIzM5O1wwJiMzOTs7CiYjNDM7CXJldHVybiB0cnVlOwomIzQzO30KJiM0MzsKJiM0MztzdGF0aWMgX191MzIgbWFwX2lkKGludCBmZCkKJiM0Mzt7CiYjNDM7CXN0cnVjdCBicGZfbWFwX2luZm8gaW5mbyA9IHt9OwomIzQzOwlfX3UzMiBsZW4gPSBzaXplb2YoaW5mbyk7CiYjNDM7CiYjNDM7CWlmICghQVNTRVJUX09LKGJwZl9tYXBfZ2V0X2luZm9fYnlfZmQoZmQsICZhbXA7aW5mbywgJmFtcDtsZW4pLCAmIzM0O21hcF9pbmZvJiMzNDspKQomIzQzOwkJcmV0dXJuIDA7CiYjNDM7CXJldHVybiBpbmZvLmlkOwomIzQzO30KJiM0MzsKJiM0MztzdGF0aWMgaW50IGNvdW50X3Rva2VuKGNvbnN0IGNoYXIgKm91dHB1dCwgY29uc3QgY2hhciAqdG9rZW4pCiYjNDM7ewomIzQzOwlpbnQgY291bnQgPSAwOwomIzQzOwomIzQzOwl3aGlsZSAoKG91dHB1dCA9IHN0cnN0cihvdXRwdXQsIHRva2VuKSkpIHsKJiM0MzsJCWNvdW50JiM0MzsmIzQzOzsKJiM0MzsJCW91dHB1dCAmIzQzOz0gc3RybGVuKHRva2VuKTsKJiM0MzsJfQomIzQzOwlyZXR1cm4gY291bnQ7CiYjNDM7fQomIzQzOwomIzQzO3N0YXRpYyB2b2lkIGNoZWNrX3BsYWluKF9fdTMyIHJvb3RfaWQsIF9fdTMyIGlubmVyX2lkLCBjb25zdCBjaGFyICp0eXBlLAomIzQzOwkJCWludCBlbnRyaWVzLCBib29sIHR5cGVkKQomIzQzO3sKJiM0MzsJY2hhciBjb21tYW5kW01BWF9CUEZUT09MX0NNRF9MRU5dLCBoZWFkZXJbMTI4XTsKJiM0MzsJY2hhciBvdXRwdXRbT1VUUFVUX1NJWkVdID0ge307CiYjNDM7CWNvbnN0IGNoYXIgKnJvb3QsICppbm5lcjsKJiM0MzsKJiM0MzsJc25wcmludGYoY29tbWFuZCwgc2l6ZW9mKGNvbW1hbmQpLCAmIzM0Oy0tcmVjdXJzaXZlIG1hcCBkdW1wIGlkICV1JiMzNDssIHJvb3RfaWQpOwomIzQzOwlpZiAoIUFTU0VSVF9PSyhnZXRfYnBmdG9vbF9jb21tYW5kX291dHB1dChjb21tYW5kLCBvdXRwdXQsIHNpemVvZihvdXRwdXQpIC0gMSksCiYjNDM7CQkgICAgICAgJiMzNDtwbGFpbl9kdW1wJiMzNDspKQomIzQzOwkJcmV0dXJuOwomIzQzOwlzbnByaW50ZihoZWFkZXIsIHNpemVvZihoZWFkZXIpLCAmIzM0OyV1OiAlcyAgbmFtZSBkdW1wX291dGVyICAmIzM0Oywgcm9vdF9pZCwgdHlwZSk7CiYjNDM7CXJvb3QgPSBzdHJzdHIob3V0cHV0LCBoZWFkZXIpOwomIzQzOwlpZiAoIUFTU0VSVF9PS19QVFIocm9vdCwgJiMzNDtwbGFpbl9yb290X2hlYWRlciYjMzQ7KSkKJiM0MzsJCXJldHVybjsKJiM0MzsJQVNTRVJUX0VRKHJvb3QgLSBvdXRwdXQsIDAsICYjMzQ7cGxhaW5fcm9vdF9maXJzdCYjMzQ7KTsKJiM0MzsJQVNTRVJUX0VRKGNvdW50X3Rva2VuKG91dHB1dCwgJiMzNDtpbm5lcl9tYXBfaWQ6JiMzNDspLCBlbnRyaWVzLCAmIzM0O3BsYWluX3JlZmVyZW5jZXMmIzM0Oyk7CiYjNDM7CWlmIChlbnRyaWVzKSB7CiYjNDM7CQlzbnByaW50ZihoZWFkZXIsIHNpemVvZihoZWFkZXIpLCAmIzM0OyV1OiBoYXNoICBuYW1lIGR1bXBfaW5uZXIgICYjMzQ7LCBpbm5lcl9pZCk7CiYjNDM7CQlpbm5lciA9IHN0cnN0cihvdXRwdXQsIGhlYWRlcik7CiYjNDM7CQlpZiAoQVNTRVJUX09LX1BUUihpbm5lciwgJiMzNDtwbGFpbl9pbm5lcl9oZWFkZXImIzM0OykpCiYjNDM7CQkJQVNTRVJUX0dUKGlubmVyIC0gcm9vdCwgMCwgJiMzNDtwbGFpbl9pbm5lcl9hZnRlcl9yb290JiMzNDspOwomIzQzOwkJQVNTRVJUX0VRKGNvdW50X3Rva2VuKG91dHB1dCwgaGVhZGVyKSwgMSwgJiMzNDtwbGFpbl9pbm5lcl9vbmNlJiMzNDspOwomIzQzOwl9CiYjNDM7CUFTU0VSVF9FUShjb3VudF90b2tlbihvdXRwdXQsICYjMzQ7Rm91bmQgJiMzNDspLCBlbnRyaWVzICZhbXA7JmFtcDsgIXR5cGVkID8gMiA6IDEsCiYjNDM7CQkgICYjMzQ7cGxhaW5fbWFwX2NvdW50JiMzNDspOwomIzQzOwlpZiAodHlwZWQpIHsKJiM0MzsJCUFTU0VSVF9IQVNfU1VCU1RSKG91dHB1dCwgJiMzNDtcJiMzNDtrZXlcJiMzNDs6IDAmIzM0OywgJiMzNDtwbGFpbl9idGZfa2V5JiMzNDspOwomIzQzOwkJQVNTRVJUX0hBU19TVUJTVFIob3V0cHV0LCAmIzM0O1wmIzM0O3ZhbHVlXCYjMzQ7OiAxNjg0MzAwOSYjMzQ7LCAmIzM0O3BsYWluX2J0Zl92YWx1ZSYjMzQ7KTsKJiM0MzsJfQomIzQzO30KJiM0MzsKJiM0MztzdGF0aWMgdm9pZCB0ZXN0X291dGVyKGVudW0gYnBmX21hcF90eXBlIHR5cGUsIGludCBlbnRyaWVzLCBib29sIGVtcHR5X2lubmVyLAomIzQzOwkJICAgICAgIGJvb2wgdHlwZWQpCiYjNDM7ewomIzQzOwlMSUJCUEZfT1BUUyhicGZfbWFwX2NyZWF0ZV9vcHRzLCBvcHRzKTsKJiM0MzsJTElCQlBGX09QVFMoYnBmX21hcF9jcmVhdGVfb3B0cywgaW5uZXJfb3B0cyk7CiYjNDM7CXN0cnVjdCBidGYgKmJ0ZiA9IE5VTEw7CiYjNDM7CWNoYXIgb3V0ZXJbT1VUUFVUX1NJWkVdLCBpbm5lcltPVVRQVVRfU0laRV0sIG91dHB1dFtPVVRQVVRfU0laRV07CiYjNDM7CWNoYXIgZXhwZWN0ZWRbT1VUUFVUX1NJWkUgKiAzXSwgcmVmZXJlbmNlWzY0XTsKJiM0MzsJY29uc3QgY2hhciAqdHlwZV9uYW1lID0gbGliYnBmX2JwZl9tYXBfdHlwZV9zdHIodHlwZSk7CiYjNDM7CWludCBpbm5lcl9mZCA9IC0xLCBvdXRlcl9mZCA9IC0xOwomIzQzOwlfX3UzMiByb290X2lkLCBpbm5lcl9pZCwga2V5LCB2YWx1ZSA9IDB4MDEwMTAxMDE7CiYjNDM7CiYjNDM7CWlmICh0eXBlZCkgewomIzQzOwkJYnRmID0gYnRmX19uZXdfZW1wdHkoKTsKJiM0MzsJCWlmICghQVNTRVJUX09LX1BUUihidGYsICYjMzQ7Y3JlYXRlX2J0ZiYjMzQ7KSB8fAomIzQzOwkJICAgICFBU1NFUlRfRVEoYnRmX19hZGRfaW50KGJ0ZiwgJiMzNDt1bnNpZ25lZCBpbnQmIzM0OywgNCwgMCksIDEsICYjMzQ7YnRmX2ludCYjMzQ7KSB8fAomIzQzOwkJICAgICFBU1NFUlRfT0soYnRmX19sb2FkX2ludG9fa2VybmVsKGJ0ZiksICYjMzQ7bG9hZF9idGYmIzM0OykpCiYjNDM7CQkJZ290byBvdXQ7CiYjNDM7CQlpbm5lcl9vcHRzLmJ0Zl9mZCA9IGJ0Zl9fZmQoYnRmKTsKJiM0MzsJCWlubmVyX29wdHMuYnRmX2tleV90eXBlX2lkID0gMTsKJiM0MzsJCWlubmVyX29wdHMuYnRmX3ZhbHVlX3R5cGVfaWQgPSAxOwomIzQzOwl9CiYjNDM7CWlubmVyX2ZkID0gYnBmX21hcF9jcmVhdGUoQlBGX01BUF9UWVBFX0hBU0gsICYjMzQ7ZHVtcF9pbm5lciYjMzQ7LCBzaXplb2Yoa2V5KSwKJiM0MzsJCQkJICBzaXplb2YodmFsdWUpLCAyLCAmYW1wO2lubmVyX29wdHMpOwomIzQzOwlpZiAoIUFTU0VSVF9PS19GRChpbm5lcl9mZCwgJiMzNDtjcmVhdGVfaW5uZXImIzM0OykpCiYjNDM7CQlnb3RvIG91dDsKJiM0MzsJa2V5ID0gMDsKJiM0MzsJaWYgKCFlbXB0eV9pbm5lciAmYW1wOyZhbXA7CiYjNDM7CSAgICAhQVNTRVJUX09LKGJwZl9tYXBfdXBkYXRlX2VsZW0oaW5uZXJfZmQsICZhbXA7a2V5LCAmYW1wO3ZhbHVlLCBCUEZfQU5ZKSwKJiM0MzsJCSAgICAgICAmIzM0O3BvcHVsYXRlX2lubmVyJiMzNDspKQomIzQzOwkJZ290byBvdXQ7CiYjNDM7CW9wdHMuaW5uZXJfbWFwX2ZkID0gaW5uZXJfZmQ7CiYjNDM7CW91dGVyX2ZkID0gYnBmX21hcF9jcmVhdGUodHlwZSwgJiMzNDtkdW1wX291dGVyJiMzNDssIHNpemVvZihrZXkpLCBzaXplb2YoX191MzIpLAomIzQzOwkJCQkgIDMsICZhbXA7b3B0cyk7CiYjNDM7CWlmICghQVNTRVJUX09LX0ZEKG91dGVyX2ZkLCAmIzM0O2NyZWF0ZV9vdXRlciYjMzQ7KSkKJiM0MzsJCWdvdG8gb3V0OwomIzQzOwkvKiBUaGUgdW51c2VkIHRoaXJkIGFycmF5IHNsb3QgYWxzbyBleGVyY2lzZXMgZmFpbGVkIGxvb2t1cHMuICovCiYjNDM7CWZvciAoa2V5ID0gMDsga2V5ICZsdDsgZW50cmllczsga2V5JiM0MzsmIzQzOykKJiM0MzsJCWlmICghQVNTRVJUX09LKGJwZl9tYXBfdXBkYXRlX2VsZW0ob3V0ZXJfZmQsICZhbXA7a2V5LCAmYW1wO2lubmVyX2ZkLCBCUEZfQU5ZKSwKJiM0MzsJCQkgICAgICAgJiMzNDtwb3B1bGF0ZV9vdXRlciYjMzQ7KSkKJiM0MzsJCQlnb3RvIG91dDsKJiM0MzsJcm9vdF9pZCA9IG1hcF9pZChvdXRlcl9mZCk7CiYjNDM7CWlubmVyX2lkID0gbWFwX2lkKGlubmVyX2ZkKTsKJiM0MzsJaWYgKCFyb290X2lkIHx8ICFpbm5lcl9pZCB8fCAhZHVtcF9tYXAocm9vdF9pZCwgJiMzNDstaiYjMzQ7LCBvdXRlcikgfHwKJiM0MzsJICAgICFkdW1wX21hcChpbm5lcl9pZCwgJiMzNDstaiYjMzQ7LCBpbm5lcikpCiYjNDM7CQlnb3RvIG91dDsKJiM0MzsKJiM0MzsJQVNTRVJUX0VRKG91dGVyWzBdLCAmIzM5O1smIzM5OywgJiMzNDtkZWZhdWx0X2FycmF5JiMzNDspOwomIzQzOwlBU1NFUlRfRVEoY291bnRfdG9rZW4ob3V0ZXIsICYjMzQ7XCYjMzQ7ZWxlbWVudHNcJiMzNDs6JiMzNDspLCAwLCAmIzM0O2RlZmF1bHRfbm9fd3JhcHBlciYjMzQ7KTsKJiM0MzsJQVNTRVJUX0VRKGNvdW50X3Rva2VuKG91dGVyLCAmIzM0O1wmIzM0O2lkXCYjMzQ7OiYjMzQ7KSwgMCwgJiMzNDtkZWZhdWx0X25vX2hlYWRlciYjMzQ7KTsKJiM0MzsJc25wcmludGYocmVmZXJlbmNlLCBzaXplb2YocmVmZXJlbmNlKSwgJiMzNDtcJiMzNDtpbm5lcl9tYXBfaWRcJiMzNDs6JXUmIzM0OywgaW5uZXJfaWQpOwomIzQzOwlBU1NFUlRfRVEoY291bnRfdG9rZW4ob3V0ZXIsIHJlZmVyZW5jZSksIGVudHJpZXMsICYjMzQ7ZGVmYXVsdF9yZWZlcmVuY2VzJiMzNDspOwomIzQzOwlpZiAoIWVudHJpZXMpCiYjNDM7CQlBU1NFUlRfU1RSRVEob3V0ZXIsICYjMzQ7W10mIzM0OywgJiMzNDtlbXB0eV9vdXRlcl9kZWZhdWx0JiMzNDspOwomIzQzOwlpZiAoZW1wdHlfaW5uZXIpCiYjNDM7CQlBU1NFUlRfU1RSRVEoaW5uZXIsICYjMzQ7W10mIzM0OywgJiMzNDtlbXB0eV9pbm5lcl9kZWZhdWx0JiMzNDspOwomIzQzOwllbHNlIGlmICh0eXBlZCkKJiM0MzsJCUFTU0VSVF9IQVNfU1VCU1RSKGlubmVyLCAmIzM0O1wmIzM0O2Zvcm1hdHRlZFwmIzM0Ozp7XCYjMzQ7a2V5XCYjMzQ7OjAsXCYjMzQ7dmFsdWVcJiMzNDs6MTY4NDMwMDl9JiMzNDssCiYjNDM7CQkJCSAgJiMzNDt0eXBlZF9pbm5lciYjMzQ7KTsKJiM0MzsJZWxzZQomIzQzOwkJQVNTRVJUX1NUUkVRKGlubmVyLAomIzQzOwkJCSAgICAgJiMzNDtbe1wmIzM0O2tleVwmIzM0OzpbXCYjMzQ7MHgwMFwmIzM0OyxcJiMzNDsweDAwXCYjMzQ7LFwmIzM0OzB4MDBcJiMzNDssXCYjMzQ7MHgwMFwmIzM0O10sJiMzNDsKJiM0MzsJCQkgICAgICYjMzQ7XCYjMzQ7dmFsdWVcJiMzNDs6W1wmIzM0OzB4MDFcJiMzNDssXCYjMzQ7MHgwMVwmIzM0OyxcJiMzNDsweDAxXCYjMzQ7LFwmIzM0OzB4MDFcJiMzNDtdfV0mIzM0OywKJiM0MzsJCQkgICAgICYjMzQ7b3JkaW5hcnlfZGVmYXVsdCYjMzQ7KTsKJiM0MzsKJiM0MzsJLyoKJiM0MzsJICogQ29tcGFyZSB0aGUgY29tcGxldGUgSlNPTiBkb2N1bWVudDogYSBmbGF0IGFycmF5IHdpdGggdGhlIHJvb3QgZmlyc3QsCiYjNDM7CSAqIG9uZSBjb3B5IG9mIHRoZSBzaGFyZWQgaW5uZXIgbWFwLCBhbmQgdW5jaGFuZ2VkIGVudHJ5IHJlcHJlc2VudGF0aW9ucy4KJiM0MzsJICovCiYjNDM7CWlmIChlbnRyaWVzKQomIzQzOwkJc25wcmludGYoZXhwZWN0ZWQsIHNpemVvZihleHBlY3RlZCksCiYjNDM7CQkJICYjMzQ7W3tcJiMzNDtpZFwmIzM0OzoldSxcJiMzNDt0eXBlXCYjMzQ7OlwmIzM0OyVzXCYjMzQ7LFwmIzM0O25hbWVcJiMzNDs6XCYjMzQ7ZHVtcF9vdXRlclwmIzM0OywmIzM0OwomIzQzOwkJCSAmIzM0O1wmIzM0O2ZsYWdzXCYjMzQ7OjAsXCYjMzQ7ZWxlbWVudHNcJiMzNDs6JXN9LHtcJiMzNDtpZFwmIzM0OzoldSxcJiMzNDt0eXBlXCYjMzQ7OlwmIzM0O2hhc2hcJiMzNDssJiMzNDsKJiM0MzsJCQkgJiMzNDtcJiMzNDtuYW1lXCYjMzQ7OlwmIzM0O2R1bXBfaW5uZXJcJiMzNDssXCYjMzQ7ZmxhZ3NcJiMzNDs6MCxcJiMzNDtlbGVtZW50c1wmIzM0Ozolc31dJiMzNDssCiYjNDM7CQkJIHJvb3RfaWQsIHR5cGVfbmFtZSwgb3V0ZXIsIGlubmVyX2lkLCBpbm5lcik7CiYjNDM7CWVsc2UKJiM0MzsJCXNucHJpbnRmKGV4cGVjdGVkLCBzaXplb2YoZXhwZWN0ZWQpLAomIzQzOwkJCSAmIzM0O1t7XCYjMzQ7aWRcJiMzNDs6JXUsXCYjMzQ7dHlwZVwmIzM0OzpcJiMzNDslc1wmIzM0OyxcJiMzNDtuYW1lXCYjMzQ7OlwmIzM0O2R1bXBfb3V0ZXJcJiMzNDssJiMzNDsKJiM0MzsJCQkgJiMzNDtcJiMzNDtmbGFnc1wmIzM0OzowLFwmIzM0O2VsZW1lbnRzXCYjMzQ7OltdfV0mIzM0Oywgcm9vdF9pZCwgdHlwZV9uYW1lKTsKJiM0MzsJaWYgKGR1bXBfbWFwKHJvb3RfaWQsICYjMzQ7LWogLXImIzM0Oywgb3V0cHV0KSkKJiM0MzsJCUFTU0VSVF9TVFJFUShvdXRwdXQsIGV4cGVjdGVkLCAmIzM0O3JlY3Vyc2l2ZV9qc29uJiMzNDspOwomIzQzOwlpZiAoZHVtcF9tYXAocm9vdF9pZCwgJiMzNDstLWpzb24gLS1yZWN1cnNpdmUmIzM0Oywgb3V0cHV0KSkKJiM0MzsJCUFTU0VSVF9TVFJFUShvdXRwdXQsIGV4cGVjdGVkLCAmIzM0O3JlY3Vyc2l2ZV9sb25nX29wdGlvbnMmIzM0Oyk7CiYjNDM7CWNoZWNrX3BsYWluKHJvb3RfaWQsIGlubmVyX2lkLCB0eXBlX25hbWUsIGVudHJpZXMsIHR5cGVkKTsKJiM0MzsKJiM0MzsJLyogUmVjdXJzaW9uIG9uIGFuIG9yZGluYXJ5IG1hcCBzdGlsbCBlbWl0cyBhIHNpbmdsZSBtYXAgb2JqZWN0LiAqLwomIzQzOwlzbnByaW50ZihleHBlY3RlZCwgc2l6ZW9mKGV4cGVjdGVkKSwKJiM0MzsJCSAmIzM0O1t7XCYjMzQ7aWRcJiMzNDs6JXUsXCYjMzQ7dHlwZVwmIzM0OzpcJiMzNDtoYXNoXCYjMzQ7LFwmIzM0O25hbWVcJiMzNDs6XCYjMzQ7ZHVtcF9pbm5lclwmIzM0OywmIzM0OwomIzQzOwkJICYjMzQ7XCYjMzQ7ZmxhZ3NcJiMzNDs6MCxcJiMzNDtlbGVtZW50c1wmIzM0Ozolc31dJiMzNDssIGlubmVyX2lkLCBpbm5lcik7CiYjNDM7CWlmIChkdW1wX21hcChpbm5lcl9pZCwgJiMzNDstaiAtciYjMzQ7LCBvdXRwdXQpKQomIzQzOwkJQVNTRVJUX1NUUkVRKG91dHB1dCwgZXhwZWN0ZWQsICYjMzQ7b3JkaW5hcnlfcmVjdXJzaXZlJiMzNDspOwomIzQzO291dDoKJiM0MzsJaWYgKG91dGVyX2ZkICZndDs9IDApCiYjNDM7CQljbG9zZShvdXRlcl9mZCk7CiYjNDM7CWlmIChpbm5lcl9mZCAmZ3Q7PSAwKQomIzQzOwkJY2xvc2UoaW5uZXJfZmQpOwomIzQzOwlidGZfX2ZyZWUoYnRmKTsKJiM0Mzt9CiYjNDM7CiYjNDM7c3RhdGljIHZvaWQgdGVzdF9tdWx0aXBsZV9yb290cyh2b2lkKQomIzQzO3sKJiM0MzsJTElCQlBGX09QVFMoYnBmX21hcF9jcmVhdGVfb3B0cywgb3B0cyk7CiYjNDM7CWNoYXIgY29tbWFuZFtNQVhfQlBGVE9PTF9DTURfTEVOXSwgbmFtZVtCUEZfT0JKX05BTUVfTEVOXTsKJiM0MzsJY2hhciBvdXRwdXRbT1VUUFVUX1NJWkVdID0ge30sIGV4cGVjdGVkW09VVFBVVF9TSVpFICogNF0sIGVsZW1lbnRzW09VVFBVVF9TSVpFXTsKJiM0MzsJc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCB0eXBlc1tdID0geyAmIzM0O2hhc2gmIzM0OywgJiMzNDthcnJheV9vZl9tYXBzJiMzNDssICYjMzQ7aGFzaF9vZl9tYXBzJiMzNDssICYjMzQ7aGFzaCYjMzQ7IH07CiYjNDM7CWludCBmZHNbXSA9IHsgLTEsIC0xLCAtMSwgLTEgfTsKJiM0MzsJX191MzIgaWRzWzRdLCBrZXk7CiYjNDM7CWludCBpLCBsZW4gPSAwOwomIzQzOwomIzQzOwkvKgomIzQzOwkgKiBTZWxlY3QgdGhlIGZpcnN0IGlubmVyIG1hcCBhbmQgYm90aCBvdXRlcnMgYXMgcm9vdHMuIFRoZSBvdGhlciBpbm5lcgomIzQzOwkgKiBtYXAgbXVzdCBiZSBhcHBlbmRlZCBhZnRlciBhbGwgdGhyZWUgcm9vdHMsIGV2ZW4gdGhvdWdoIGl0IGlzIGZvdW5kCiYjNDM7CSAqIHdoaWxlIGR1bXBpbmcgdGhlIGZpcnN0IG91dGVyLiBBIHByb2Nlc3Mtc3BlY2lmaWMgbmFtZSBhdm9pZHMgb3RoZXIKJiM0MzsJICogdGVzdHMmIzM5OyBtYXBzIGpvaW5pbmcgdGhlIHNlbGVjdGlvbi4KJiM0MzsJICovCiYjNDM7CXNucHJpbnRmKG5hbWUsIHNpemVvZihuYW1lKSwgJiMzNDtkdW1wXyV1JiMzNDssIGdldHBpZCgpKTsKJiM0MzsJZmRzWzBdID0gYnBmX21hcF9jcmVhdGUoQlBGX01BUF9UWVBFX0hBU0gsIG5hbWUsIDQsIDQsIDEsIE5VTEwpOwomIzQzOwlpZiAoIUFTU0VSVF9PS19GRChmZHNbMF0sICYjMzQ7Y3JlYXRlX3NlbGVjdGVkX2lubmVyJiMzNDspKQomIzQzOwkJZ290byBvdXQ7CiYjNDM7CWZkc1szXSA9IGJwZl9tYXBfY3JlYXRlKEJQRl9NQVBfVFlQRV9IQVNILCAmIzM0O2R1bXBfZGlzY292ZXJlZCYjMzQ7LCA0LCA0LCAxLCBOVUxMKTsKJiM0MzsJaWYgKCFBU1NFUlRfT0tfRkQoZmRzWzNdLCAmIzM0O2NyZWF0ZV9kaXNjb3ZlcmVkX2lubmVyJiMzNDspKQomIzQzOwkJZ290byBvdXQ7CiYjNDM7CW9wdHMuaW5uZXJfbWFwX2ZkID0gZmRzWzBdOwomIzQzOwlmZHNbMV0gPSBicGZfbWFwX2NyZWF0ZShCUEZfTUFQX1RZUEVfQVJSQVlfT0ZfTUFQUywgbmFtZSwgNCwgNCwgMiwgJmFtcDtvcHRzKTsKJiM0MzsJaWYgKCFBU1NFUlRfT0tfRkQoZmRzWzFdLCAmIzM0O2NyZWF0ZV9hcnJheV9yb290JiMzNDspKQomIzQzOwkJZ290byBvdXQ7CiYjNDM7CWZkc1syXSA9IGJwZl9tYXBfY3JlYXRlKEJQRl9NQVBfVFlQRV9IQVNIX09GX01BUFMsIG5hbWUsIDQsIDQsIDIsICZhbXA7b3B0cyk7CiYjNDM7CWlmICghQVNTRVJUX09LX0ZEKGZkc1syXSwgJiMzNDtjcmVhdGVfaGFzaF9yb290JiMzNDspKQomIzQzOwkJZ290byBvdXQ7CiYjNDM7CWZvciAoaSA9IDE7IGkgJmx0Oz0gMjsgaSYjNDM7JiM0MzspIHsKJiM0MzsJCWtleSA9IDA7CiYjNDM7CQlpZiAoIUFTU0VSVF9PSyhicGZfbWFwX3VwZGF0ZV9lbGVtKGZkc1tpXSwgJmFtcDtrZXksICZhbXA7ZmRzWzBdLCBCUEZfQU5ZKSwKJiM0MzsJCQkgICAgICAgJiMzNDtyZWZlcmVuY2Vfc2VsZWN0ZWRfaW5uZXImIzM0OykpCiYjNDM7CQkJZ290byBvdXQ7CiYjNDM7CQlrZXkgPSAxOwomIzQzOwkJaWYgKCFBU1NFUlRfT0soYnBmX21hcF91cGRhdGVfZWxlbShmZHNbaV0sICZhbXA7a2V5LCAmYW1wO2Zkc1szXSwgQlBGX0FOWSksCiYjNDM7CQkJICAgICAgICYjMzQ7cmVmZXJlbmNlX2Rpc2NvdmVyZWRfaW5uZXImIzM0OykpCiYjNDM7CQkJZ290byBvdXQ7CiYjNDM7CX0KJiM0MzsJZm9yIChpID0gMDsgaSAmbHQ7IEFSUkFZX1NJWkUoZmRzKTsgaSYjNDM7JiM0MzspIHsKJiM0MzsJCWlkc1tpXSA9IG1hcF9pZChmZHNbaV0pOwomIzQzOwkJaWYgKCFpZHNbaV0gfHwgIWR1bXBfbWFwKGlkc1tpXSwgJiMzNDstaiYjMzQ7LCBlbGVtZW50cykpCiYjNDM7CQkJZ290byBvdXQ7CiYjNDM7CQlsZW4gJiM0Mzs9IHNucHJpbnRmKGV4cGVjdGVkICYjNDM7IGxlbiwgc2l6ZW9mKGV4cGVjdGVkKSAtIGxlbiwKJiM0MzsJCQkJJiMzNDslc3tcJiMzNDtpZFwmIzM0OzoldSxcJiMzNDt0eXBlXCYjMzQ7OlwmIzM0OyVzXCYjMzQ7LFwmIzM0O25hbWVcJiMzNDs6XCYjMzQ7JXNcJiMzNDssJiMzNDsKJiM0MzsJCQkJJiMzNDtcJiMzNDtmbGFnc1wmIzM0OzowLFwmIzM0O2VsZW1lbnRzXCYjMzQ7OiVzfSVzJiMzNDssCiYjNDM7CQkJCWkgPyAmIzM0OywmIzM0OyA6ICYjMzQ7WyYjMzQ7LCBpZHNbaV0sIHR5cGVzW2ldLAomIzQzOwkJCQlpID09IDMgPyAmIzM0O2R1bXBfZGlzY292ZXJlZCYjMzQ7IDogbmFtZSwgZWxlbWVudHMsIGkgPT0gMyA/ICYjMzQ7XSYjMzQ7IDogJiMzNDsmIzM0Oyk7CiYjNDM7CX0KJiM0MzsJc25wcmludGYoY29tbWFuZCwgc2l6ZW9mKGNvbW1hbmQpLCAmIzM0Oy1qIC1yIG1hcCBkdW1wIG5hbWUgJXMmIzM0OywgbmFtZSk7CiYjNDM7CWlmIChBU1NFUlRfT0soZ2V0X2JwZnRvb2xfY29tbWFuZF9vdXRwdXQoY29tbWFuZCwgb3V0cHV0LCBzaXplb2Yob3V0cHV0KSAtIDEpLAomIzQzOwkJICAgICAgJiMzNDtkdW1wX211bHRpcGxlX3Jvb3RzJiMzNDspKSB7CiYjNDM7CQlvdXRwdXRbc3RyY3NwbihvdXRwdXQsICYjMzQ7XG4mIzM0OyldID0gJiMzOTtcMCYjMzk7OwomIzQzOwkJQVNTRVJUX1NUUkVRKG91dHB1dCwgZXhwZWN0ZWQsICYjMzQ7cm9vdHNfZmlyc3RfYW5kX3NlZWRfZGVkdXAmIzM0Oyk7CiYjNDM7CX0KJiM0MztvdXQ6CiYjNDM7CWZvciAoaSA9IDA7IGkgJmx0OyBBUlJBWV9TSVpFKGZkcyk7IGkmIzQzOyYjNDM7KQomIzQzOwkJaWYgKGZkc1tpXSAmZ3Q7PSAwKQomIzQzOwkJCWNsb3NlKGZkc1tpXSk7CiYjNDM7fQomIzQzOwomIzQzO3N0YXRpYyB2b2lkIHRlc3RfdW5yZWFkYWJsZShib29sIG91dGVyKQomIzQzO3sKJiM0MzsJTElCQlBGX09QVFMoYnBmX21hcF9jcmVhdGVfb3B0cywgb3B0cyk7CiYjNDM7CWNoYXIgZWxlbWVudHNbT1VUUFVUX1NJWkVdLCBvdXRwdXRbT1VUUFVUX1NJWkVdLCByb290W09VVFBVVF9TSVpFXTsKJiM0MzsJY2hhciBleHBlY3RlZFtPVVRQVVRfU0laRSAqIDNdLCBwbGFpbltPVVRQVVRfU0laRV0gPSB7fTsKJiM0MzsJY2hhciBjb21tYW5kW01BWF9CUEZUT09MX0NNRF9MRU5dOwomIzQzOwlpbnQgaW5uZXJfZmQgPSAtMSwgb3V0ZXJfZmQgPSAtMSwgbG9va3VwX2Vycm5vOwomIzQzOwlfX3UzMiBpbm5lcl9pZCwgcm9vdF9pZCwga2V5ID0gMCwgdmFsdWU7CiYjNDM7CiYjNDM7CS8qCiYjNDM7CSAqIEV2ZXJ5IGtleSBpcyBlbnVtZXJhYmxlLCBidXQgUEVSRl9FVkVOVF9BUlJBWSBsb29rdXAgcmV0dXJucwomIzQzOwkgKiBFTk9UU1VQUCAodGhlIGtlcm5lbC1pbnRlcm5hbCBlcnJubykuIENoZWNrIGJvdGggZW50cmllcyBzbyBhbgomIzQzOwkgKiBlYXJseSBleGl0IG9uIHRoZSBmaXJzdCBsb29rdXAgZmFpbHVyZSBjYW5ub3QgcGFzcy4KJiM0MzsJICovCiYjNDM7CWlubmVyX2ZkID0gYnBmX21hcF9jcmVhdGUoQlBGX01BUF9UWVBFX1BFUkZfRVZFTlRfQVJSQVksICYjMzQ7ZHVtcF91bnJlYWRhYmxlJiMzNDssCiYjNDM7CQkJCSAgc2l6ZW9mKGtleSksIHNpemVvZih2YWx1ZSksIDIsIE5VTEwpOwomIzQzOwlpZiAoIUFTU0VSVF9PS19GRChpbm5lcl9mZCwgJiMzNDtjcmVhdGVfdW5yZWFkYWJsZSYjMzQ7KSkKJiM0MzsJCWdvdG8gb3V0OwomIzQzOwlpZiAoIUFTU0VSVF9MVChicGZfbWFwX2xvb2t1cF9lbGVtKGlubmVyX2ZkLCAmYW1wO2tleSwgJmFtcDt2YWx1ZSksIDAsCiYjNDM7CQkgICAgICAgJiMzNDt1bnJlYWRhYmxlX2xvb2t1cCYjMzQ7KSkKJiM0MzsJCWdvdG8gb3V0OwomIzQzOwlsb29rdXBfZXJybm8gPSBlcnJubzsKJiM0MzsJaWYgKCFBU1NFUlRfTkVRKGxvb2t1cF9lcnJubywgRU5PRU5ULCAmIzM0O3VucmVhZGFibGVfbm90X21pc3NpbmcmIzM0OykpCiYjNDM7CQlnb3RvIG91dDsKJiM0MzsJaW5uZXJfaWQgPSBtYXBfaWQoaW5uZXJfZmQpOwomIzQzOwlpZiAoIWlubmVyX2lkIHx8ICFkdW1wX21hcChpbm5lcl9pZCwgJiMzNDstaiYjMzQ7LCBlbGVtZW50cykpCiYjNDM7CQlnb3RvIG91dDsKJiM0MzsJQVNTRVJUX0VRKGNvdW50X3Rva2VuKGVsZW1lbnRzLCAmIzM0O1wmIzM0O2Vycm9yXCYjMzQ7OiYjMzQ7KSwgMiwgJiMzNDtkZWZhdWx0X2pzb25fZXJyb3JzJiMzNDspOwomIzQzOwlzbnByaW50Zihjb21tYW5kLCBzaXplb2YoY29tbWFuZCksICYjMzQ7bWFwIGR1bXAgaWQgJXUmIzM0OywgaW5uZXJfaWQpOwomIzQzOwlpZiAoIUFTU0VSVF9PSyhnZXRfYnBmdG9vbF9jb21tYW5kX291dHB1dChjb21tYW5kLCBwbGFpbiwgc2l6ZW9mKHBsYWluKSAtIDEpLAomIzQzOwkJICAgICAgICYjMzQ7ZGVmYXVsdF9wbGFpbl91bnJlYWRhYmxlJiMzNDspKQomIzQzOwkJZ290byBvdXQ7CiYjNDM7CUFTU0VSVF9FUShjb3VudF90b2tlbihwbGFpbiwgc3RyZXJyb3IobG9va3VwX2Vycm5vKSksIDIsICYjMzQ7ZGVmYXVsdF9wbGFpbl9lcnJvcnMmIzM0Oyk7CiYjNDM7CUFTU0VSVF9IQVNfU1VCU1RSKHBsYWluLCAmIzM0O0ZvdW5kIDAgZWxlbWVudHMmIzM0OywgJiMzNDtkZWZhdWx0X3BsYWluX2NvdW50JiMzNDspOwomIzQzOwomIzQzOwlyb290X2lkID0gaW5uZXJfaWQ7CiYjNDM7CWlmIChvdXRlcikgewomIzQzOwkJb3B0cy5pbm5lcl9tYXBfZmQgPSBpbm5lcl9mZDsKJiM0MzsJCW91dGVyX2ZkID0gYnBmX21hcF9jcmVhdGUoQlBGX01BUF9UWVBFX0FSUkFZX09GX01BUFMsICYjMzQ7ZHVtcF9vdXRlciYjMzQ7LAomIzQzOwkJCQkJICBzaXplb2Yoa2V5KSwgc2l6ZW9mKHZhbHVlKSwgMSwgJmFtcDtvcHRzKTsKJiM0MzsJCWlmICghQVNTRVJUX09LX0ZEKG91dGVyX2ZkLCAmIzM0O2NyZWF0ZV9vdXRlciYjMzQ7KSB8fAomIzQzOwkJICAgICFBU1NFUlRfT0soYnBmX21hcF91cGRhdGVfZWxlbShvdXRlcl9mZCwgJmFtcDtrZXksICZhbXA7aW5uZXJfZmQsIEJQRl9BTlkpLAomIzQzOwkJCSAgICAgICAmIzM0O3BvcHVsYXRlX291dGVyJiMzNDspKQomIzQzOwkJCWdvdG8gb3V0OwomIzQzOwkJcm9vdF9pZCA9IG1hcF9pZChvdXRlcl9mZCk7CiYjNDM7CQlpZiAoIXJvb3RfaWQgfHwgIWR1bXBfbWFwKHJvb3RfaWQsICYjMzQ7LWomIzM0Oywgcm9vdCkpCiYjNDM7CQkJZ290byBvdXQ7CiYjNDM7CQlzbnByaW50ZihleHBlY3RlZCwgc2l6ZW9mKGV4cGVjdGVkKSwKJiM0MzsJCQkgJiMzNDtbe1wmIzM0O2lkXCYjMzQ7OiV1LFwmIzM0O3R5cGVcJiMzNDs6XCYjMzQ7YXJyYXlfb2ZfbWFwc1wmIzM0OyxcJiMzNDtuYW1lXCYjMzQ7OlwmIzM0O2R1bXBfb3V0ZXJcJiMzNDssJiMzNDsKJiM0MzsJCQkgJiMzNDtcJiMzNDtmbGFnc1wmIzM0OzowLFwmIzM0O2VsZW1lbnRzXCYjMzQ7OiVzfSx7XCYjMzQ7aWRcJiMzNDs6JXUsJiMzNDsKJiM0MzsJCQkgJiMzNDtcJiMzNDt0eXBlXCYjMzQ7OlwmIzM0O3BlcmZfZXZlbnRfYXJyYXlcJiMzNDssXCYjMzQ7bmFtZVwmIzM0OzpcJiMzNDtkdW1wX3VucmVhZGFibGVcJiMzNDssJiMzNDsKJiM0MzsJCQkgJiMzNDtcJiMzNDtmbGFnc1wmIzM0OzowLFwmIzM0O2VsZW1lbnRzXCYjMzQ7OiVzfV0mIzM0Oywgcm9vdF9pZCwgcm9vdCwgaW5uZXJfaWQsIGVsZW1lbnRzKTsKJiM0MzsJfSBlbHNlIHsKJiM0MzsJCXNucHJpbnRmKGV4cGVjdGVkLCBzaXplb2YoZXhwZWN0ZWQpLAomIzQzOwkJCSAmIzM0O1t7XCYjMzQ7aWRcJiMzNDs6JXUsXCYjMzQ7dHlwZVwmIzM0OzpcJiMzNDtwZXJmX2V2ZW50X2FycmF5XCYjMzQ7LCYjMzQ7CiYjNDM7CQkJICYjMzQ7XCYjMzQ7bmFtZVwmIzM0OzpcJiMzNDtkdW1wX3VucmVhZGFibGVcJiMzNDssXCYjMzQ7ZmxhZ3NcJiMzNDs6MCxcJiMzNDtlbGVtZW50c1wmIzM0Ozolc31dJiMzNDssCiYjNDM7CQkJIGlubmVyX2lkLCBlbGVtZW50cyk7CiYjNDM7CX0KJiM0MzsJaWYgKGR1bXBfbWFwKHJvb3RfaWQsICYjMzQ7LWogLXImIzM0Oywgb3V0cHV0KSkKJiM0MzsJCUFTU0VSVF9TVFJFUShvdXRwdXQsIGV4cGVjdGVkLCAmIzM0O3JlY3Vyc2l2ZV91bnJlYWRhYmxlX2pzb24mIzM0Oyk7CiYjNDM7CW1lbXNldChvdXRwdXQsIDAsIHNpemVvZihvdXRwdXQpKTsKJiM0MzsJc25wcmludGYoY29tbWFuZCwgc2l6ZW9mKGNvbW1hbmQpLCAmIzM0Oy1yIG1hcCBkdW1wIGlkICV1JiMzNDssIHJvb3RfaWQpOwomIzQzOwlpZiAoQVNTRVJUX09LKGdldF9icGZ0b29sX2NvbW1hbmRfb3V0cHV0KGNvbW1hbmQsIG91dHB1dCwgc2l6ZW9mKG91dHB1dCkgLSAxKSwKJiM0MzsJCSAgICAgICYjMzQ7cmVjdXJzaXZlX3VucmVhZGFibGVfcGxhaW4mIzM0OykpIHsKJiM0MzsJCUFTU0VSVF9IQVNfU1VCU1RSKG91dHB1dCwgcGxhaW4sICYjMzQ7cmVjdXJzaXZlX3BsYWluX3ByZXNlcnZlc19lcnJvcnMmIzM0Oyk7CiYjNDM7CQlBU1NFUlRfRVEoY291bnRfdG9rZW4ob3V0cHV0LCBzdHJlcnJvcihsb29rdXBfZXJybm8pKSwgMiwKJiM0MzsJCQkgICYjMzQ7cmVjdXJzaXZlX3BsYWluX2Vycm9ycyYjMzQ7KTsKJiM0MzsJCUFTU0VSVF9FUShjb3VudF90b2tlbihvdXRwdXQsICYjMzQ7Rm91bmQgJiMzNDspLCBvdXRlciA/IDIgOiAxLAomIzQzOwkJCSAgJiMzNDtyZWN1cnNpdmVfcGxhaW5fbWFwcyYjMzQ7KTsKJiM0MzsJfQomIzQzO291dDoKJiM0MzsJaWYgKG91dGVyX2ZkICZndDs9IDApCiYjNDM7CQljbG9zZShvdXRlcl9mZCk7CiYjNDM7CWlmIChpbm5lcl9mZCAmZ3Q7PSAwKQomIzQzOwkJY2xvc2UoaW5uZXJfZmQpOwomIzQzO30KJiM0MzsKJiM0MztzdGF0aWMgdm9pZCB0ZXN0X21hbnlfaW5uZXJfbWFwcyhib29sIGpzb24pCiYjNDM7ewomIzQzOwllbnVtIHsKJiM0MzsJCURVTVBfT0ssCiYjNDM7CQlEVU1QX0VSUl9STElNSVQsCiYjNDM7CQlEVU1QX0VSUl9DT01NQU5ELAomIzQzOwkJRFVNUF9FUlJfQ09VTlRTLAomIzQzOwkJRFVNUF9FUlJfSURTLAomIzQzOwkJRFVNUF9FUlJfSlNPTiwKJiM0MzsJCURVTVBfRVJSX0ZEUywKJiM0MzsJfTsKJiM0MzsJTElCQlBGX09QVFMoYnBmX21hcF9jcmVhdGVfb3B0cywgb3B0cyk7CiYjNDM7CWNvbnN0IHN0cnVjdCBybGltaXQgbGltaXQgPSB7IC5ybGltX2N1ciA9IDMyLCAucmxpbV9tYXggPSAzMiB9OwomIzQzOwljaGFyIGNvbW1hbmRbTUFYX0JQRlRPT0xfQ01EX0xFTl0sIHRva2VuWzY0XTsKJiM0MzsJX191MzIgaWRzWzY0XSwgcm9vdF9pZCwga2V5OwomIzQzOwlpbnQgaW5uZXJfZmQgPSAtMSwgb3V0ZXJfZmQgPSAtMSwgc3RhdHVzOwomIzQzOwlpbnQgaW5oZXJpdGVkX2Zkc1szMl0sIG5yX2luaGVyaXRlZCA9IDAsIGk7CiYjNDM7CWNoYXIgKm91dHB1dCA9IE5VTEw7CiYjNDM7CXBpZF90IHBpZDsKJiM0MzsKJiM0MzsJaW5uZXJfZmQgPSBicGZfbWFwX2NyZWF0ZShCUEZfTUFQX1RZUEVfSEFTSCwgJiMzNDtkdW1wX2lubmVyJiMzNDssIDQsIDQsIDEsIE5VTEwpOwomIzQzOwlpZiAoIUFTU0VSVF9PS19GRChpbm5lcl9mZCwgJiMzNDtjcmVhdGVfdGVtcGxhdGUmIzM0OykpCiYjNDM7CQlnb3RvIG91dDsKJiM0MzsJb3B0cy5pbm5lcl9tYXBfZmQgPSBpbm5lcl9mZDsKJiM0MzsJb3V0ZXJfZmQgPSBicGZfbWFwX2NyZWF0ZShCUEZfTUFQX1RZUEVfQVJSQVlfT0ZfTUFQUywgJiMzNDtkdW1wX291dGVyJiMzNDssIDQsIDQsCiYjNDM7CQkJCSAgQVJSQVlfU0laRShpZHMpLCAmYW1wO29wdHMpOwomIzQzOwljbG9zZShpbm5lcl9mZCk7CiYjNDM7CWlubmVyX2ZkID0gLTE7CiYjNDM7CWlmICghQVNTRVJUX09LX0ZEKG91dGVyX2ZkLCAmIzM0O2NyZWF0ZV9vdXRlciYjMzQ7KSkKJiM0MzsJCWdvdG8gb3V0OwomIzQzOwlmb3IgKGtleSA9IDA7IGtleSAmbHQ7IEFSUkFZX1NJWkUoaWRzKTsga2V5JiM0MzsmIzQzOykgewomIzQzOwkJaW5uZXJfZmQgPSBicGZfbWFwX2NyZWF0ZShCUEZfTUFQX1RZUEVfSEFTSCwgJiMzNDtkdW1wX2lubmVyJiMzNDssIDQsIDQsIDEsIE5VTEwpOwomIzQzOwkJaWYgKCFBU1NFUlRfT0tfRkQoaW5uZXJfZmQsICYjMzQ7Y3JlYXRlX2lubmVyJiMzNDspIHx8CiYjNDM7CQkgICAgIUFTU0VSVF9PSyhicGZfbWFwX3VwZGF0ZV9lbGVtKG91dGVyX2ZkLCAmYW1wO2tleSwgJmFtcDtpbm5lcl9mZCwgQlBGX0FOWSksCiYjNDM7CQkJICAgICAgICYjMzQ7cG9wdWxhdGVfb3V0ZXImIzM0OykpCiYjNDM7CQkJZ290byBvdXQ7CiYjNDM7CQlpZHNba2V5XSA9IG1hcF9pZChpbm5lcl9mZCk7CiYjNDM7CQlpZiAoIWlkc1trZXldKQomIzQzOwkJCWdvdG8gb3V0OwomIzQzOwkJLyogVGhlIG91dGVyIG1hcCBrZWVwcyBlYWNoIGRpc3RpbmN0IGlubmVyIG1hcCBhbGl2ZS4gKi8KJiM0MzsJCWNsb3NlKGlubmVyX2ZkKTsKJiM0MzsJCWlubmVyX2ZkID0gLTE7CiYjNDM7CX0KJiM0MzsJcm9vdF9pZCA9IG1hcF9pZChvdXRlcl9mZCk7CiYjNDM7CW91dHB1dCA9IGNhbGxvYygxLCA2NTUzNik7CiYjNDM7CWlmICghcm9vdF9pZCB8fCAhQVNTRVJUX09LX1BUUihvdXRwdXQsICYjMzQ7YWxsb2NhdGVfb3V0cHV0JiMzNDspKQomIzQzOwkJZ290byBvdXQ7CiYjNDM7CiYjNDM7CS8qIEZpbGwgdGhlIGxvdyBGRCBzbG90cyB0byBleGVyY2lzZSBpbmhlcml0ZWQgZGVzY3JpcHRvciBjbGVhbnVwLiAqLwomIzQzOwlmb3IgKGkgPSAwOyBpICZsdDsgQVJSQVlfU0laRShpbmhlcml0ZWRfZmRzKTsgaSYjNDM7JiM0MzspIHsKJiM0MzsJCWludCBmZCA9IG9wZW4oJiMzNDsvZGV2L251bGwmIzM0OywgT19SRE9OTFkpOwomIzQzOwomIzQzOwkJaWYgKCFBU1NFUlRfT0tfRkQoZmQsICYjMzQ7b3Blbl9pbmhlcml0ZWRfZmQmIzM0OykpCiYjNDM7CQkJZ290byBvdXQ7CiYjNDM7CQlpbmhlcml0ZWRfZmRzW25yX2luaGVyaXRlZCYjNDM7JiM0MztdID0gZmQ7CiYjNDM7CX0KJiM0MzsKJiM0MzsJLyoKJiM0MzsJICogQ3JlYXRlIGFsbCBmaXh0dXJlcyBiZWZvcmUgbG93ZXJpbmcgdGhlIGxpbWl0LCBhbmQga2VlcCB0aGUgdGVzdAomIzQzOwkgKiBydW5uZXImIzM5O3MgbGltaXQgdW5jaGFuZ2VkLiBSZXRhaW5pbmcgZXZlcnkgZGlzY292ZXJlZCBGRCB3b3VsZCBleGNlZWQKJiM0MzsJICogdGhpcyBsaW1pdCBiZWZvcmUgdGhlIHJlY3Vyc2l2ZSBkdW1wIGNvdWxkIHZpc2l0IGFsbCBpbm5lciBtYXBzLgomIzQzOwkgKi8KJiM0MzsJcGlkID0gZm9yaygpOwomIzQzOwlpZiAoIUFTU0VSVF9HRShwaWQsIDAsICYjMzQ7Zm9yayYjMzQ7KSkKJiM0MzsJCWdvdG8gb3V0OwomIzQzOwlpZiAoIXBpZCkgewomIzQzOwkJc3RydWN0IGRpcmVudCAqZW50cnk7CiYjNDM7CQlESVIgKmRpcjsKJiM0MzsKJiM0MzsJCS8qIFJlc2VydmUgYSBzbG90IGZvciB0aGUgZGlyZWN0b3J5IGV2ZW4gaWYgdGhlIHBhcmVudCBpcyBmdWxsLiAqLwomIzQzOwkJY2xvc2UoaW5oZXJpdGVkX2Zkc1tucl9pbmhlcml0ZWQgLSAxXSk7CiYjNDM7CQlkaXIgPSBvcGVuZGlyKCYjMzQ7L3Byb2Mvc2VsZi9mZCYjMzQ7KTsKJiM0MzsJCWlmICghZGlyKQomIzQzOwkJCV9leGl0KERVTVBfRVJSX0ZEUyk7CiYjNDM7CQkvKiBUaGUgcGFyZW50IGtlZXBzIHRoZSBvdXRlciBtYXAgYW5kIGl0cyBpbm5lciBtYXBzIGFsaXZlLiAqLwomIzQzOwkJZm9yICg7OykgewomIzQzOwkJCWNoYXIgKmVuZDsKJiM0MzsJCQlsb25nIGZkOwomIzQzOwomIzQzOwkJCWVycm5vID0gMDsKJiM0MzsJCQllbnRyeSA9IHJlYWRkaXIoZGlyKTsKJiM0MzsJCQlpZiAoIWVudHJ5KSB7CiYjNDM7CQkJCWlmIChlcnJubykKJiM0MzsJCQkJCV9leGl0KERVTVBfRVJSX0ZEUyk7CiYjNDM7CQkJCWJyZWFrOwomIzQzOwkJCX0KJiM0MzsJCQlmZCA9IHN0cnRvbChlbnRyeS0mZ3Q7ZF9uYW1lLCAmYW1wO2VuZCwgMTApOwomIzQzOwkJCWlmICgqZW5kIHx8IGZkICZsdDsgMyB8fCBmZCA9PSBkaXJmZChkaXIpKQomIzQzOwkJCQljb250aW51ZTsKJiM0MzsJCQljbG9zZShmZCk7CiYjNDM7CQl9CiYjNDM7CQlpZiAoY2xvc2VkaXIoZGlyKSkKJiM0MzsJCQlfZXhpdChEVU1QX0VSUl9GRFMpOwomIzQzOwkJaWYgKHNldHJsaW1pdChSTElNSVRfTk9GSUxFLCAmYW1wO2xpbWl0KSkKJiM0MzsJCQlfZXhpdChEVU1QX0VSUl9STElNSVQpOwomIzQzOwkJc25wcmludGYoY29tbWFuZCwgc2l6ZW9mKGNvbW1hbmQpLCAmIzM0OyVzIC1yIG1hcCBkdW1wIGlkICV1JiMzNDssCiYjNDM7CQkJIGpzb24gPyAmIzM0Oy1qJiMzNDsgOiAmIzM0OyYjMzQ7LCByb290X2lkKTsKJiM0MzsJCWlmIChnZXRfYnBmdG9vbF9jb21tYW5kX291dHB1dChjb21tYW5kLCBvdXRwdXQsIDY1NTM1KSkKJiM0MzsJCQlfZXhpdChEVU1QX0VSUl9DT01NQU5EKTsKJiM0MzsJCWlmIChjb3VudF90b2tlbihvdXRwdXQsIGpzb24gPyAmIzM0O1wmIzM0O2lkXCYjMzQ7OiYjMzQ7IDogJiMzNDtGb3VuZCAmIzM0OykgIT0gQVJSQVlfU0laRShpZHMpICYjNDM7IDEgfHwKJiM0MzsJCSAgICBjb3VudF90b2tlbihvdXRwdXQsIGpzb24gPyAmIzM0O1wmIzM0O2lubmVyX21hcF9pZFwmIzM0OzomIzM0OyA6ICYjMzQ7aW5uZXJfbWFwX2lkOiYjMzQ7KSAhPQomIzQzOwkJICAgIEFSUkFZX1NJWkUoaWRzKSkKJiM0MzsJCQlfZXhpdChEVU1QX0VSUl9DT1VOVFMpOwomIzQzOwkJZm9yIChrZXkgPSAwOyBrZXkgJmx0OyBBUlJBWV9TSVpFKGlkcyk7IGtleSYjNDM7JiM0MzspIHsKJiM0MzsJCQlpZiAoanNvbikKJiM0MzsJCQkJc25wcmludGYodG9rZW4sIHNpemVvZih0b2tlbiksICYjMzQ7XCYjMzQ7aWRcJiMzNDs6JXUsJiMzNDssIGlkc1trZXldKTsKJiM0MzsJCQllbHNlCiYjNDM7CQkJCXNucHJpbnRmKHRva2VuLCBzaXplb2YodG9rZW4pLCAmIzM0O1xuJXU6IGhhc2ggIG5hbWUgZHVtcF9pbm5lciAgJiMzNDssCiYjNDM7CQkJCQkgaWRzW2tleV0pOwomIzQzOwkJCWlmIChjb3VudF90b2tlbihvdXRwdXQsIHRva2VuKSAhPSAxKQomIzQzOwkJCQlfZXhpdChEVU1QX0VSUl9JRFMpOwomIzQzOwkJfQomIzQzOwkJaWYgKGpzb24gJmFtcDsmYW1wOyAob3V0cHV0WzBdICE9ICYjMzk7WyYjMzk7IHx8CiYjNDM7CQkJICAgICBzdHJjbXAob3V0cHV0ICYjNDM7IHN0cmxlbihvdXRwdXQpIC0gMiwgJiMzNDtdXG4mIzM0OykpKQomIzQzOwkJCV9leGl0KERVTVBfRVJSX0pTT04pOwomIzQzOwkJX2V4aXQoRFVNUF9PSyk7CiYjNDM7CX0KJiM0MzsJaWYgKEFTU0VSVF9FUSh3YWl0cGlkKHBpZCwgJmFtcDtzdGF0dXMsIDApLCBwaWQsICYjMzQ7d2FpdHBpZCYjMzQ7KSAmYW1wOyZhbXA7CiYjNDM7CSAgICBBU1NFUlRfVFJVRShXSUZFWElURUQoc3RhdHVzKSwgJiMzNDtjaGlsZF9leGl0ZWQmIzM0OykpCiYjNDM7CQlBU1NFUlRfRVEoV0VYSVRTVEFUVVMoc3RhdHVzKSwgRFVNUF9PSywgJiMzNDtkdW1wX3dpdGhfbG93X2ZkX2xpbWl0JiMzNDspOwomIzQzOwlmb3IgKGkgPSAwOyBpICZsdDsgbnJfaW5oZXJpdGVkOyBpJiM0MzsmIzQzOykKJiM0MzsJCUFTU0VSVF9HRShmY250bChpbmhlcml0ZWRfZmRzW2ldLCBGX0dFVEZEKSwgMCwgJiMzNDtwYXJlbnRfZmRfcHJlc2VydmVkJiMzNDspOwomIzQzOwlBU1NFUlRfRVEobWFwX2lkKG91dGVyX2ZkKSwgcm9vdF9pZCwgJiMzNDtwYXJlbnRfb3V0ZXJfcHJlc2VydmVkJiMzNDspOwomIzQzO291dDoKJiM0MzsJd2hpbGUgKG5yX2luaGVyaXRlZCkKJiM0MzsJCWNsb3NlKGluaGVyaXRlZF9mZHNbLS1ucl9pbmhlcml0ZWRdKTsKJiM0MzsJZnJlZShvdXRwdXQpOwomIzQzOwlpZiAob3V0ZXJfZmQgJmd0Oz0gMCkKJiM0MzsJCWNsb3NlKG91dGVyX2ZkKTsKJiM0MzsJaWYgKGlubmVyX2ZkICZndDs9IDApCiYjNDM7CQljbG9zZShpbm5lcl9mZCk7CiYjNDM7fQomIzQzOwomIzQzO3ZvaWQgdGVzdF9icGZ0b29sX21hcF9kdW1wKHZvaWQpCiYjNDM7ewomIzQzOwlpZiAodGVzdF9fc3RhcnRfc3VidGVzdCgmIzM0O3VucmVhZGFibGVfb3JkaW5hcnkmIzM0OykpCiYjNDM7CQl0ZXN0X3VucmVhZGFibGUoZmFsc2UpOwomIzQzOwlpZiAodGVzdF9fc3RhcnRfc3VidGVzdCgmIzM0O3VucmVhZGFibGVfaW5uZXImIzM0OykpCiYjNDM7CQl0ZXN0X3VucmVhZGFibGUodHJ1ZSk7CiYjNDM7CWlmICh0ZXN0X19zdGFydF9zdWJ0ZXN0KCYjMzQ7bWFueV9pbm5lcl9tYXBzX2pzb24mIzM0OykpCiYjNDM7CQl0ZXN0X21hbnlfaW5uZXJfbWFwcyh0cnVlKTsKJiM0MzsJaWYgKHRlc3RfX3N0YXJ0X3N1YnRlc3QoJiMzNDttYW55X2lubmVyX21hcHNfcGxhaW4mIzM0OykpCiYjNDM7CQl0ZXN0X21hbnlfaW5uZXJfbWFwcyhmYWxzZSk7CiYjNDM7CWlmICh0ZXN0X19zdGFydF9zdWJ0ZXN0KCYjMzQ7bXVsdGlwbGVfcm9vdHMmIzM0OykpCiYjNDM7CQl0ZXN0X211bHRpcGxlX3Jvb3RzKCk7CiYjNDM7CWlmICh0ZXN0X19zdGFydF9zdWJ0ZXN0KCYjMzQ7YXJyYXlfb2ZfbWFwcyYjMzQ7KSkKJiM0MzsJCXRlc3Rfb3V0ZXIoQlBGX01BUF9UWVBFX0FSUkFZX09GX01BUFMsIDEsIGZhbHNlLCBmYWxzZSk7CiYjNDM7CWlmICh0ZXN0X19zdGFydF9zdWJ0ZXN0KCYjMzQ7aGFzaF9vZl9tYXBzJiMzNDspKQomIzQzOwkJdGVzdF9vdXRlcihCUEZfTUFQX1RZUEVfSEFTSF9PRl9NQVBTLCAxLCBmYWxzZSwgZmFsc2UpOwomIzQzOwlpZiAodGVzdF9fc3RhcnRfc3VidGVzdCgmIzM0O3NoYXJlZF9pbm5lciYjMzQ7KSkKJiM0MzsJCXRlc3Rfb3V0ZXIoQlBGX01BUF9UWVBFX0FSUkFZX09GX01BUFMsIDIsIGZhbHNlLCBmYWxzZSk7CiYjNDM7CWlmICh0ZXN0X19zdGFydF9zdWJ0ZXN0KCYjMzQ7ZW1wdHlfYXJyYXlfb2ZfbWFwcyYjMzQ7KSkKJiM0MzsJCXRlc3Rfb3V0ZXIoQlBGX01BUF9UWVBFX0FSUkFZX09GX01BUFMsIDAsIGZhbHNlLCBmYWxzZSk7CiYjNDM7CWlmICh0ZXN0X19zdGFydF9zdWJ0ZXN0KCYjMzQ7ZW1wdHlfaGFzaF9vZl9tYXBzJiMzNDspKQomIzQzOwkJdGVzdF9vdXRlcihCUEZfTUFQX1RZUEVfSEFTSF9PRl9NQVBTLCAwLCBmYWxzZSwgZmFsc2UpOwomIzQzOwlpZiAodGVzdF9fc3RhcnRfc3VidGVzdCgmIzM0O2J0Zl9pbm5lciYjMzQ7KSkKJiM0MzsJCXRlc3Rfb3V0ZXIoQlBGX01BUF9UWVBFX0hBU0hfT0ZfTUFQUywgMSwgZmFsc2UsIHRydWUpOwomIzQzOwlpZiAodGVzdF9fc3RhcnRfc3VidGVzdCgmIzM0O2VtcHR5X2lubmVyJiMzNDspKQomIzQzOwkJdGVzdF9vdXRlcihCUEZfTUFQX1RZUEVfSEFTSF9PRl9NQVBTLCAxLCB0cnVlLCBmYWxzZSk7CiYjNDM7fQo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4zLzI8L3RkPgoJCQk8dGQ+MjAyNi8wOS8xMSAwNDowMDwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuNy1mbGFzaDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAxNDEyMAoJCQkJCQkJb3V0cHV0OiAxOQoJCQkJCQkJdGhvdWdodHM6IDMxMQoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+KipNeSBBc3Nlc3NtZW50IG9mIHRoZSBQYXRjaCoqCgpPa2F5LCBzbyB0aGUgZGlmZiBpcyBwcmV0dHkgZm9jdXNlZC4gTG9va2luZyBhdCB0aGUgY2hhbmdlcywgaXQmIzM5O3MgYWxsIGNvbnRhaW5lZCB3aXRoaW4gdGhlIGB0b29scy9gIGRpcmVjdG9yeSwgc3BlY2lmaWNhbGx5IGFyb3VuZCBgYnBmdG9vbGAgYW5kIGEgcmVsYXRlZCBzZWxmLXRlc3QuIExldCYjMzk7cyBzZWUuLi4KCkJhc2VkIG9uIG15IHVuZGVyc3RhbmRpbmcgb2Ygb3VyIHJ1bGVzLCBzcGVjaWZpY2FsbHkgU2VjdGlvbiAyLCB0aGlzICpzaG91bGQqIGJlIGEgc3RyYWlnaHRmb3J3YXJkICYjMzQ7V29ydGhGdXp6aW5nPWZhbHNlJiMzNDsgc2NlbmFyaW8uIFRoZSBuZWdhdGl2ZSBjcml0ZXJpYSBhcmUgY2xlYXIgaGVyZTogbm9uLWtlcm5lbCwgbm9uLWV4ZWN1dGFibGUgY2hhbmdlcy4gVGhlIG1vZGlmaWNhdGlvbnMgc2VlbSB0byBiZSBsaW1pdGVkIHRvIGRvY3VtZW50YXRpb24gKGBicGZ0b29sLW1hcC5yc3RgKSwgYmFzaCBjb21wbGV0aW9uIHNjcmlwdHMgKGBicGZ0b29sYCksIHRoZSBtYWluIGFwcGxpY2F0aW9uIGNvZGUsIGhlYWRlciBmaWxlcyBhbmQgdGhlIHVuaXQgdGVzdHMuIE5vbmUgb2YgdGhlc2UgY2hhbmdlcyBzaG91bGQgaW1wYWN0IHRoZSBjb21waWxlZCBrZXJuZWwgaW1hZ2UgKGB2bWxpbnV4YCkgb3IgYW55IGtlcm5lbCBtb2R1bGVzLiBJdCYjMzk7cyBlc3NlbnRpYWxseSB1c2VyLXNwYWNlIHRvb2xzIGFuZCB0ZXN0aW5nLgoKSnVzdCB0byBiZSBhYnNvbHV0ZWx5IGNlcnRhaW4sIEkmIzM5O2xsIHJ1biBhIHF1aWNrIGNoZWNrLCBtYXliZSB3aXRoIGBncmVwcGVyYCwganVzdCB0byBiZSB0cmlwbGUgc3VyZSBubyB1bmV4cGVjdGVkIG1vZGlmaWNhdGlvbnMgd2VyZSBzbnVjayBpbiwgYnV0IGJhc2VkIG9uIG15IGluaXRpYWwgc2NhbiwgdGhpcyBsb29rcyBsaWtlIGEgY2xlYXItY3V0IGNhc2Ugb2Ygbm9uLWNyaXRpY2FsIG1vZGlmaWNhdGlvbi4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD40LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOS8xMSAwNDowMDwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPmdyZXBwZXI8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0V4cHJlc3Npb24mIzM0OzogJiMzNDtjb2xsZWN0X2lubmVyX21hcCYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtPdXRwdXQmIzM0OzogJiMzNDt0b29scy9icGYvYnBmdG9vbC9tYXAuYz04MzA9c3RydWN0IG1hcF9kdW1wX2N0eCB7XG4tLVxudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmMtODM1LVxudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6ODM2OnN0YXRpYyBpbnQgY29sbGVjdF9pbm5lcl9tYXAoc3RydWN0IG1hcF9kdW1wX2N0eCAqY3R4LCBfX3UzMiBpZClcbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jLTgzNy17XG4tLVxudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM9ODYyPW1hcF9kdW1wKGludCBmZCwgc3RydWN0IGJwZl9tYXBfaW5mbyAqaW5mbywganNvbl93cml0ZXJfdCAqd3RyLFxuLS1cbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jLTkyOS1cdFx0XHRpZiAoY3R4IFx1MDAyNlx1MDAyNiBtYXBfaXNfbWFwX29mX21hcHMoaW5mby1cdTAwM2V0eXBlKSkge1xudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6OTMwOlx0XHRcdFx0ZXJyID0gY29sbGVjdF9pbm5lcl9tYXAoY3R4LCAqKF9fdTMyICopdmFsdWUpO1xudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmMtOTMxLVx0XHRcdFx0aWYgKGVycilcbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD41LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOS8xMSAwNDowMDwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuNy1mbGFzaDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAxNDkzNwoJCQkJCQkJb3V0cHV0OiA5NAoJCQkJCQkJdGhvdWdodHM6IDEzMwoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+KipNeSBBc3Nlc3NtZW50IG9mIHRoZSBQcm9wb3NlZCBDaGFuZ2VzKioKCk9rYXksIHNvIEkmIzM5O20gbG9va2luZyBhdCB0aGVzZSBjaGFuZ2VzLCBhbmQgZnJvbSBteSBleHBlcnQgcGVyc3BlY3RpdmUsIGl0JiMzOTtzIHByZXR0eSBjbGVhciB3aGVyZSB3ZSBzdGFuZC4gVGhlIG1vZGlmaWNhdGlvbnMgYXJlICpzdHJpY3RseSogY29udGFpbmVkIHdpdGhpbiB1c2VyLXNwYWNlIHRvb2xzLiBXZSYjMzk7cmUgdGFsa2luZyBzcGVjaWZpY2FsbHkgYWJvdXQgYGJwZnRvb2xgIHdpdGhpbiBgdG9vbHMvYnBmL2JwZnRvb2wvYCBhbmQgdGhlIHNlbGYtdGVzdHMgaW4gYHRvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2AuIFRoYXQgaW1tZWRpYXRlbHkgcmluZ3MgYSBiZWxsIGZvciBtZSwgYmVjYXVzZSBhbnkgYWx0ZXJhdGlvbnMgaW4gdGhvc2UgYXJlYXMgYXJlIGluaGVyZW50bHkgaXNvbGF0ZWQgZnJvbSB0aGUga2VybmVsIGl0c2VsZi4KClRoZXJlZm9yZSwgYXBwbHlpbmcgb3VyIG5lZ2F0aXZlIGNyaXRlcmlhLCBpdCYjMzk7cyBhIHN0cmFpZ2h0Zm9yd2FyZCBkZXRlcm1pbmF0aW9uLiBTaW5jZSB0aGVzZSBjaGFuZ2VzIHJlc2lkZSB3aXRoaW4gdXNlci1zcGFjZSBkaXJlY3Rvcmllcywgc2VsZi10ZXN0cywgc2FtcGxlcywgb3Igc2NyaXB0cywgdGhleSAqZG8gbm90KiBhZmZlY3QgdGhlIGNvbXBpbGVkIGtlcm5lbCBpbWFnZSAoYHZtbGludXhgKSBvciBhbnkgb2YgdGhlIGtlcm5lbCBtb2R1bGVzLiBJbiBlc3NlbmNlLCB0aGV5IGFyZSBzaWRlLWNhciBzb2Z0d2FyZSB0aGF0IGludGVyYWN0cyB3aXRoIHRoZSBrZXJuZWwuCgpHaXZlbiB0aGlzIGlzb2xhdGlvbiwgSSBjYW4gY29uZmlkZW50bHkgcnVsZSBvdXQgYW55IGZ1enppbmcgcmVxdWlyZW1lbnRzLiBgV29ydGhGdXp6aW5nYCBpcyBhIGhhcmQgJiMzNDtmYWxzZSYjMzQ7IGhlcmUuIFNpbWlsYXJseSwgYW55IGNvbnNpZGVyYXRpb25zIGZvciBzcGVjaWZpYyBzeW1ib2xzIG9yIGNvbmZpZ3VyYXRpb25zIGFyZSB1bm5lY2Vzc2FyeS4gQm90aCBgRm9jdXNTeW1ib2xzYCBhbmQgYEVuYWJsZUNvbmZpZ3NgIGFyZSBjb3JyZWN0bHkgbnVsbCwgcmVwcmVzZW50ZWQgYXMgYW4gZW1wdHkgYXJyYXkgYFtdYC4gVGhleSBhcmUgbm90IHJlbGV2YW50IHRvIGlzb2xhdGVkIGNoYW5nZXMgaW4gdXNlci1zcGFjZSB0b29scy4KCldpdGggdGhpcyBhbmFseXNpcyBjb21wbGV0ZSwgaXQmIzM5O3MgdGltZSB0byBjYWxsIGBzZXQtcmVzdWx0c2AuIFdlIGNhbiBwcm9jZWVkIGJhc2VkIG9uIHRoaXMgYXNzZXNzbWVudC4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD42LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOS8xMSAwNDowMDwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPnNldC1yZXN1bHRzPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFbmFibGVDb25maWdzJiMzNDs6IFtdLAogICYjMzQ7Rm9jdXNTeW1ib2xzJiMzNDs6IFtdLAogICYjMzQ7UmVhc29uaW5nJiMzNDs6ICYjMzQ7VGhlIHBhdGNoIG1vZGlmaWVzIG9ubHkgdXNlci1zcGFjZSB0b29saW5nIChicGZ0b29sIHVuZGVyIHRvb2xzL2JwZi9icGZ0b29sLykgYW5kIEJQRiBzZWxmdGVzdHMgKHRvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi8pLiBJdCBkb2VzIG5vdCB0b3VjaCB0aGUgTGludXgga2VybmVsIGltYWdlIG9yIGtlcm5lbCBtb2R1bGVzLCBtYWtpbmcgaXQgdW5yZWFjaGFibGUgZm9yIHN5emthbGxlciBrZXJuZWwgZnV6emluZy4mIzM0OywKICAmIzM0O1dvcnRoRnV6emluZyYjMzQ7OiBmYWxzZQp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RW5hYmxlQ29uZmlncyYjMzQ7OiBudWxsLAogICYjMzQ7Rm9jdXNTeW1ib2xzJiMzNDs6IFtdLAogICYjMzQ7UmVhc29uaW5nJiMzNDs6ICYjMzQ7VGhlIHBhdGNoIG1vZGlmaWVzIG9ubHkgdXNlci1zcGFjZSB0b29saW5nIChicGZ0b29sIHVuZGVyIHRvb2xzL2JwZi9icGZ0b29sLykgYW5kIEJQRiBzZWxmdGVzdHMgKHRvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi8pLiBJdCBkb2VzIG5vdCB0b3VjaCB0aGUgTGludXgga2VybmVsIGltYWdlIG9yIGtlcm5lbCBtb2R1bGVzLCBtYWtpbmcgaXQgdW5yZWFjaGFibGUgZm9yIHN5emthbGxlciBrZXJuZWwgZnV6emluZy4mIzM0OywKICAmIzM0O1dvcnRoRnV6emluZyYjMzQ7OiBmYWxzZQp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+Ny8xPC90ZD4KCQkJPHRkPjIwMjYvMDkvMTEgMDQ6MDA8L3RkPgoJCQk8dGQ+YWN0aW9uPC90ZD4KCQkJPHRkPklmPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtXb3J0aEZ1enppbmcmIzM0OzogZmFsc2UKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8L3Rib2R5PgoJPC90YWJsZT4KCgk8ZGl2IGlkPSJsbG1fc3VtbWFyeV90YWJsZV9kaXYiIHN0eWxlPSJtYXJnaW46IDIwcHggMDsiPgoJCTx0YWJsZSBjbGFzcz0ibGlzdF90YWJsZSI+CgkJCTxjYXB0aW9uPkxMTSBDYWxscyBTdW1tYXJ5OjwvY2FwdGlvbj4KCQkJPHRoZWFkPgoJCQkJPHRyPgoJCQkJCTx0aD5Ub3RhbCBDYWxsczwvdGg+CgkJCQkJPHRoPlRvdGFsIFRva2VuczwvdGg+CgkJCQkJPHRoPkF2ZyBUb2tlbnM8L3RoPgoJCQkJCTx0aD5Ub3RhbCBEdXJhdGlvbiAoU2Vjb25kcyk8L3RoPgoJCQkJCTx0aD5BdmcgRHVyYXRpb24gKFNlY29uZHMpPC90aD4KCQkJCTwvdHI+CgkJCTwvdGhlYWQ+CgkJCTx0Ym9keSBpZD0ibGxtX3N1bW1hcnlfc3RhdHNfYm9keSI+PC90Ym9keT4KCQk8L3RhYmxlPgoJPC9kaXY+CgoJPGRpdiBpZD0idG9vbF9zdW1tYXJ5X3RhYmxlX2RpdiIgc3R5bGU9Im1hcmdpbjogMjBweCAwOyI+CgkJPHRhYmxlIGNsYXNzPSJsaXN0X3RhYmxlIj4KCQkJPGNhcHRpb24+VG9vbCBDYWxscyBTdW1tYXJ5OjwvY2FwdGlvbj4KCQkJPHRoZWFkPgoJCQkJPHRyPgoJCQkJCTx0aD5Ub3RhbCBDYWxsczwvdGg+CgkJCQkJPHRoPlRvdGFsIER1cmF0aW9uIChTZWNvbmRzKTwvdGg+CgkJCQkJPHRoPkF2ZyBEdXJhdGlvbiAoU2Vjb25kcyk8L3RoPgoJCQkJPC90cj4KCQkJPC90aGVhZD4KCQkJPHRib2R5IGlkPSJ0b29sX3N1bW1hcnlfc3RhdHNfYm9keSI+PC90Ym9keT4KCQk8L3RhYmxlPgoJPC9kaXY+CgoJPGRpdiBpZD0iZHVyYXRpb25fY2hhcnRfZGl2IiBzdHlsZT0id2lkdGg6IDEwMCU7IG1hcmdpbjogMjBweCAwOyBib3JkZXI6IDFweDsiPjwvZGl2PgoJPGRpdiBpZD0idG9rZW5fY2hhcnRfZGl2IiBzdHlsZT0id2lkdGg6IDEwMCU7IG1hcmdpbjogMjBweCAwOyBib3JkZXI6IDFweDsiPjwvZGl2PgoKCTxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBzcmM9Imh0dHBzOi8vd3d3Lmdvb2dsZS5jb20vanNhcGkiPjwvc2NyaXB0PgoJPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgoJCWdvb2dsZS5sb2FkKCJ2aXN1YWxpemF0aW9uIiwgIjEiLCB7cGFja2FnZXM6WyJjb3JlY2hhcnQiXX0pOwoJCWdvb2dsZS5zZXRPbkxvYWRDYWxsYmFjayhkcmF3Q2hhcnRzKTsKCgkJZnVuY3Rpb24gZHJhd0NoYXJ0cygpIHsKCQkJY29uc3QgcmF3RGF0YSA9IFt7IlN0YXJ0ZWQiOiIyMDI2LTA5LTExVDA0OjAwOjAyLjYzNTUxMzQxM1oiLCJTZXEiOjAsIk5lc3RpbmciOjAsIlR5cGUiOiJmbG93IiwiTmFtZSI6InBhdGNoLXRyaWFnZSIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjkxNzUwNTEyNjUsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoie1xuICBcIkVuYWJsZUNvbmZpZ3NcIjogbnVsbCxcbiAgXCJGb2N1c1N5bWJvbHNcIjogW10sXG4gIFwiS01TQU5SZWFzb25pbmdcIjogXCJcIixcbiAgXCJOZWVkc0tNU0FOXCI6IGZhbHNlLFxuICBcIlJlYXNvbmluZ1wiOiBcIlRoZSBwYXRjaCBtb2RpZmllcyBvbmx5IHVzZXItc3BhY2UgdG9vbGluZyAoYnBmdG9vbCB1bmRlciB0b29scy9icGYvYnBmdG9vbC8pIGFuZCBCUEYgc2VsZnRlc3RzICh0b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvKS4gSXQgZG9lcyBub3QgdG91Y2ggdGhlIExpbnV4IGtlcm5lbCBpbWFnZSBvciBrZXJuZWwgbW9kdWxlcywgbWFraW5nIGl0IHVucmVhY2hhYmxlIGZvciBzeXprYWxsZXIga2VybmVsIGZ1enppbmcuXCIsXG4gIFwiV29ydGhGdXp6aW5nXCI6IGZhbHNlXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOS0xMVQwNDowMDowMi42MzU1MTg1MDJaIiwiU2VxIjoxLCJOZXN0aW5nIjoxLCJUeXBlIjoiYWN0aW9uIiwiTmFtZSI6InJlYWQtcGF0Y2gtZGlmZiIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjQ0NzAzMDg0NywiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJ7XG4gIFwiUGF0Y2hEaWZmXCI6IFwiY29tbWl0IDUwODA4ZjZlODc4Zjg4OWUwYTM0MDc5YTk0NTZjMDMzNGM1MjIyMGRcXG5BdXRob3I6IHN5ei1jbHVzdGVyIFxcdTAwM2N0cmlhZ2VAc3l6a2FsbGVyLmNvbVxcdTAwM2VcXG5EYXRlOiAgIEZyaSBTZXAgMTEgMDQ6MDA6MDEgMjAyNiArMDAwMFxcblxcbiAgICBzeXotY2x1c3RlcjogYXBwbGllZCBwYXRjaCB1bmRlciByZXZpZXdcXG5cXG5kaWZmIC0tZ2l0IGEvdG9vbHMvYnBmL2JwZnRvb2wvRG9jdW1lbnRhdGlvbi9icGZ0b29sLW1hcC5yc3QgYi90b29scy9icGYvYnBmdG9vbC9Eb2N1bWVudGF0aW9uL2JwZnRvb2wtbWFwLnJzdFxcbmluZGV4IDVkYWYzZGU1Yzc0NDYuLjIzZmFhNjcyNjg1ODcgMTAwNjQ0XFxuLS0tIGEvdG9vbHMvYnBmL2JwZnRvb2wvRG9jdW1lbnRhdGlvbi9icGZ0b29sLW1hcC5yc3RcXG4rKysgYi90b29scy9icGYvYnBmdG9vbC9Eb2N1bWVudGF0aW9uL2JwZnRvb2wtbWFwLnJzdFxcbkBAIC0xNiw3ICsxNiw4IEBAIFNZTk9QU0lTXFxuIFxcbiAqKmJwZnRvb2wqKiBbKk9QVElPTlMqXSAqKm1hcCoqICpDT01NQU5EKlxcbiBcXG4tKk9QVElPTlMqIDo9IHsgfENPTU1PTl9PUFRJT05TfCB8IHsgKiotZioqIHwgKiotLWJwZmZzKiogfSB8IHsgKiotbioqIHwgKiotLW5vbW91bnQqKiB9IH1cXG4rKk9QVElPTlMqIDo9IHsgfENPTU1PTl9PUFRJT05TfCB8IHsgKiotZioqIHwgKiotLWJwZmZzKiogfSB8XFxuK3sgKiotbioqIHwgKiotLW5vbW91bnQqKiB9IHwgeyAqKi1yKiogfCAqKi0tcmVjdXJzaXZlKiogfSB9XFxuIFxcbiAqQ09NTUFORFMqIDo9XFxuIHsgKipzaG93KiogfCAqKmxpc3QqKiB8ICoqY3JlYXRlKiogfCAqKmR1bXAqKiB8ICoqdXBkYXRlKiogfCAqKmxvb2t1cCoqIHwgKipnZXRuZXh0KiogfFxcbkBAIC0xNzAsNiArMTcxLDI1IEBAIE9QVElPTlNcXG4gICAgIERvIG5vdCBhdXRvbWF0aWNhbGx5IGF0dGVtcHQgdG8gbW91bnQgYW55IHZpcnR1YWwgZmlsZSBzeXN0ZW0gKHN1Y2ggYXNcXG4gICAgIHRyYWNlZnMgb3IgQlBGIHZpcnR1YWwgZmlsZSBzeXN0ZW0pIHdoZW4gbmVjZXNzYXJ5LlxcbiBcXG4rLXIsIC0tcmVjdXJzaXZlXFxuKyAgICBBbHNvIGR1bXAgdGhlIGlubmVyIG1hcHMgcmVmZXJlbmNlZCBieSAqKmFycmF5X29mX21hcHMqKiBhbmQgKipoYXNoX29mX21hcHMqKlxcbisgICAgZW50cmllcyB3aGVuIHJ1bm5pbmcgKiptYXAgZHVtcCoqLiBFYWNoIG1hcCBJRCBpcyB2aXNpdGVkIG9uY2UsIGV2ZW4gaWZcXG4rICAgIHNldmVyYWwgZW50cmllcyByZWZlciB0byBpdC4gU2VsZWN0ZWQgbWFwcyBhcmUgZm9sbG93ZWQgYnkgdGhlaXIgaW5uZXIgbWFwcy5cXG4rXFxuKyAgICBQbGFpbiBvdXRwdXQgaW5jbHVkZXMgYSBoZWFkZXIgaWRlbnRpZnlpbmcgZWFjaCBtYXAuIE9uIHN1Y2Nlc3MsIEpTT04gb3V0cHV0XFxuKyAgICBpcyBhbHdheXMgYW4gYXJyYXkgb2YgbWFwIG9iamVjdHMsIGVhY2ggY29udGFpbmluZyBhbiAqKmlkKiogYW5kIGFuXFxuKyAgICAqKmVsZW1lbnRzKiogYXJyYXksIGluY2x1ZGluZyB3aGVuIG9ubHkgb25lIG1hcCBpcyBkdW1wZWQuIE91dGVyIG1hcCBlbnRyaWVzXFxuKyAgICByZXRhaW4gdGhlaXIgKippbm5lcl9tYXBfaWQqKiBmaWVsZCwgd2hpY2ggaWRlbnRpZmllcyB0aGUgY29ycmVzcG9uZGluZyBpbm5lclxcbisgICAgbWFwIG9iamVjdC5cXG4rXFxuKyAgICBJbm5lciBtYXAgSURzIGFyZSByZXNvbHZlZCB3aGVuIHRoZSBtYXBzIGFyZSB2aXNpdGVkLiBUaGUgZHVtcCBpcyBub3QgYW5cXG4rICAgIGF0b21pYyBzbmFwc2hvdDogY29uY3VycmVudCB1cGRhdGVzIGNhbiBjaGFuZ2UgbWFwIGNvbnRlbnRzIG9yIHJlbW92ZSBhXFxuKyAgICByZWZlcmVuY2VkIGlubmVyIG1hcCBiZWZvcmUgaXQgaXMgdmlzaXRlZC4gRmFpbHVyZSB0byBvcGVuIGEgcmVmZXJlbmNlZFxcbisgICAgaW5uZXIgbWFwIHN0b3BzIHRoZSBkdW1wIGFuZCByZXR1cm5zIGEgbm9uemVybyBleGl0IHN0YXR1cy4gT3V0cHV0IG1heVxcbisgICAgY29udGFpbiBtYXBzIG9yIGVudHJpZXMgcHJpbnRlZCBiZWZvcmUgdGhlIGVycm9yLlxcbitcXG4rICAgIEluIEpTT04gbW9kZSwgdGhlIGVuY2xvc2luZyBhcnJheXMgYW5kIG9iamVjdHMgYXJlIGNsb3NlZCBiZWZvcmUgcmV0dXJuaW5nLlxcbitcXG4gRVhBTVBMRVNcXG4gPT09PT09PT1cXG4gKiojIGJwZnRvb2wgbWFwIHNob3cqKlxcbmRpZmYgLS1naXQgYS90b29scy9icGYvYnBmdG9vbC9iYXNoLWNvbXBsZXRpb24vYnBmdG9vbCBiL3Rvb2xzL2JwZi9icGZ0b29sL2Jhc2gtY29tcGxldGlvbi9icGZ0b29sXFxuaW5kZXggNzVjYmNiNTEyZWJhZS4uNDVjMzM2ZDYzYmUwYSAxMDA2NDRcXG4tLS0gYS90b29scy9icGYvYnBmdG9vbC9iYXNoLWNvbXBsZXRpb24vYnBmdG9vbFxcbisrKyBiL3Rvb2xzL2JwZi9icGZ0b29sL2Jhc2gtY29tcGxldGlvbi9icGZ0b29sXFxuQEAgLTI2MSw3ICsyNjEsNyBAQCBfYnBmdG9vbCgpXFxuIFxcbiAgICAgIyBEZWFsIHdpdGggb3B0aW9uc1xcbiAgICAgaWYgW1sgJHt3b3Jkc1tjd29yZF19ID09IC0qIF1dOyB0aGVuXFxuLSAgICAgICAgbG9jYWwgYz0nLS12ZXJzaW9uIC0tanNvbiAtLXByZXR0eSAtLWJwZmZzIC0tbWFwY29tcGF0IC0tZGVidWcgXFxcXFxcbisgICAgICAgIGxvY2FsIGM9Jy0tdmVyc2lvbiAtLWpzb24gLS1wcmV0dHkgLS1yZWN1cnNpdmUgLS1icGZmcyAtLW1hcGNvbXBhdCAtLWRlYnVnIFxcXFxcXG4gICAgICAgICAgICAgLS11c2UtbG9hZGVyIC0tYmFzZS1idGYgLS1zaWduIC1pIC1rJ1xcbiAgICAgICAgIENPTVBSRVBMWT0oICQoIGNvbXBnZW4gLVcgXFxcIiRjXFxcIiAtLSBcXFwiJGN1clxcXCIgKSApXFxuICAgICAgICAgcmV0dXJuIDBcXG5kaWZmIC0tZ2l0IGEvdG9vbHMvYnBmL2JwZnRvb2wvbWFpbi5jIGIvdG9vbHMvYnBmL2JwZnRvb2wvbWFpbi5jXFxuaW5kZXggNWFiYWJkOGY3ZDBhMC4uYzBmNGRmMTAxMDIxMiAxMDA2NDRcXG4tLS0gYS90b29scy9icGYvYnBmdG9vbC9tYWluLmNcXG4rKysgYi90b29scy9icGYvYnBmdG9vbC9tYWluLmNcXG5AQCAtMjYsNiArMjYsNyBAQCBzdGF0aWMgaW50ICgqbGFzdF9kb19oZWxwKShpbnQgYXJnYywgY2hhciAqKmFyZ3YpO1xcbiBqc29uX3dyaXRlcl90ICpqc29uX3d0cjtcXG4gYm9vbCBwcmV0dHlfb3V0cHV0O1xcbiBib29sIGpzb25fb3V0cHV0O1xcbitib29sIHJlY3Vyc2l2ZV9kdW1wO1xcbiBib29sIHNob3dfcGlubmVkO1xcbiBib29sIGJsb2NrX21vdW50O1xcbiBib29sIHZlcmlmaWVyX2xvZ3M7XFxuQEAgLTQ1Niw2ICs0NTcsNyBAQCBpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpXFxuIFxcdFxcdHsgXFxcImpzb25cXFwiLFxcdG5vX2FyZ3VtZW50LFxcdE5VTEwsXFx0J2onIH0sXFxuIFxcdFxcdHsgXFxcImhlbHBcXFwiLFxcdG5vX2FyZ3VtZW50LFxcdE5VTEwsXFx0J2gnIH0sXFxuIFxcdFxcdHsgXFxcInByZXR0eVxcXCIsXFx0bm9fYXJndW1lbnQsXFx0TlVMTCxcXHQncCcgfSxcXG4rXFx0XFx0eyBcXFwicmVjdXJzaXZlXFxcIixcXHRub19hcmd1bWVudCxcXHROVUxMLFxcdCdyJyB9LFxcbiBcXHRcXHR7IFxcXCJ2ZXJzaW9uXFxcIixcXHRub19hcmd1bWVudCxcXHROVUxMLFxcdCdWJyB9LFxcbiBcXHRcXHR7IFxcXCJicGZmc1xcXCIsXFx0bm9fYXJndW1lbnQsXFx0TlVMTCxcXHQnZicgfSxcXG4gXFx0XFx0eyBcXFwibWFwY29tcGF0XFxcIixcXHRub19hcmd1bWVudCxcXHROVUxMLFxcdCdtJyB9LFxcbkBAIC00NzksNyArNDgxLDcgQEAgaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KVxcbiBcXHRiaW5fbmFtZSA9IFxcXCJicGZ0b29sXFxcIjtcXG4gXFxuIFxcdG9wdGVyciA9IDA7XFxuLVxcdHdoaWxlICgob3B0ID0gZ2V0b3B0X2xvbmcoYXJnYywgYXJndiwgXFxcIlZocGpmTG1uZFNpOms6QjpsXFxcIixcXG4rXFx0d2hpbGUgKChvcHQgPSBnZXRvcHRfbG9uZyhhcmdjLCBhcmd2LCBcXFwiVmhwanJmTG1uZFNpOms6QjpsXFxcIixcXG4gXFx0XFx0XFx0XFx0ICBvcHRpb25zLCBOVUxMKSkgXFx1MDAzZT0gMCkge1xcbiBcXHRcXHRzd2l0Y2ggKG9wdCkge1xcbiBcXHRcXHRjYXNlICdWJzpcXG5AQCAtNTAxLDYgKzUwMyw5IEBAIGludCBtYWluKGludCBhcmdjLCBjaGFyICoqYXJndilcXG4gXFx0XFx0XFx0fVxcbiBcXHRcXHRcXHRqc29ud19wcmV0dHkoanNvbl93dHIsIHByZXR0eV9vdXRwdXQpO1xcbiBcXHRcXHRcXHRicmVhaztcXG4rXFx0XFx0Y2FzZSAncic6XFxuK1xcdFxcdFxcdHJlY3Vyc2l2ZV9kdW1wID0gdHJ1ZTtcXG4rXFx0XFx0XFx0YnJlYWs7XFxuIFxcdFxcdGNhc2UgJ2YnOlxcbiBcXHRcXHRcXHRzaG93X3Bpbm5lZCA9IHRydWU7XFxuIFxcdFxcdFxcdGJyZWFrO1xcbmRpZmYgLS1naXQgYS90b29scy9icGYvYnBmdG9vbC9tYWluLmggYi90b29scy9icGYvYnBmdG9vbC9tYWluLmhcXG5pbmRleCA5MzE1YTFkYjFmN2MyLi40M2VmMGFhNTkyZGI2IDEwMDY0NFxcbi0tLSBhL3Rvb2xzL2JwZi9icGZ0b29sL21haW4uaFxcbisrKyBiL3Rvb2xzL2JwZi9icGZ0b29sL21haW4uaFxcbkBAIC04Myw2ICs4Myw3IEBAIGV4dGVybiBjb25zdCBjaGFyICpiaW5fbmFtZTtcXG4gXFxuIGV4dGVybiBqc29uX3dyaXRlcl90ICpqc29uX3d0cjtcXG4gZXh0ZXJuIGJvb2wganNvbl9vdXRwdXQ7XFxuK2V4dGVybiBib29sIHJlY3Vyc2l2ZV9kdW1wO1xcbiBleHRlcm4gYm9vbCBzaG93X3Bpbm5lZDtcXG4gZXh0ZXJuIGJvb2wgc2hvd19waWRzO1xcbiBleHRlcm4gYm9vbCBibG9ja19tb3VudDtcXG5kaWZmIC0tZ2l0IGEvdG9vbHMvYnBmL2JwZnRvb2wvbWFwLmMgYi90b29scy9icGYvYnBmdG9vbC9tYXAuY1xcbmluZGV4IDY4NGE4ZmI3MjQxNDYuLmMwNTA1ZjUwNDk2NzQgMTAwNjQ0XFxuLS0tIGEvdG9vbHMvYnBmL2JwZnRvb2wvbWFwLmNcXG4rKysgYi90b29scy9icGYvYnBmdG9vbC9tYXAuY1xcbkBAIC0xNyw2ICsxNyw3IEBAXFxuICNpbmNsdWRlIFxcdTAwM2NicGYvYnBmLmhcXHUwMDNlXFxuICNpbmNsdWRlIFxcdTAwM2NicGYvYnRmLmhcXHUwMDNlXFxuICNpbmNsdWRlIFxcdTAwM2NicGYvaGFzaG1hcC5oXFx1MDAzZVxcbisjaW5jbHVkZSBcXHUwMDNjYnBmL2xpYmJwZl9pbnRlcm5hbC5oXFx1MDAzZVxcbiBcXG4gI2luY2x1ZGUgXFxcImpzb25fd3JpdGVyLmhcXFwiXFxuICNpbmNsdWRlIFxcXCJtYWluLmhcXFwiXFxuQEAgLTgyNiwxMiArODI3LDQ0IEBAIHN0YXRpYyB2b2lkIGZyZWVfbWFwX2t2X2J0ZihzdHJ1Y3QgYnRmICpidGYpXFxuIFxcdFxcdGJ0Zl9fZnJlZShidGYpO1xcbiB9XFxuIFxcbitzdHJ1Y3QgbWFwX2R1bXBfY3R4IHtcXG4rXFx0c3RydWN0IGhhc2htYXAgKnNlZW47XFxuK1xcdF9fdTMyICpwZW5kaW5nX2lkcztcXG4rXFx0c2l6ZV90IHBlbmRpbmdfY250O1xcbit9O1xcbitcXG4rc3RhdGljIGludCBjb2xsZWN0X2lubmVyX21hcChzdHJ1Y3QgbWFwX2R1bXBfY3R4ICpjdHgsIF9fdTMyIGlkKVxcbit7XFxuK1xcdF9fdTMyICppZHM7XFxuK1xcdGludCBlcnI7XFxuK1xcbitcXHRpZiAoaGFzaG1hcF9fZmluZChjdHgtXFx1MDAzZXNlZW4sIGlkLCBOVUxMKSlcXG4rXFx0XFx0cmV0dXJuIDA7XFxuK1xcbitcXHRpZHMgPSBsaWJicGZfcmVhbGxvY2FycmF5KGN0eC1cXHUwMDNlcGVuZGluZ19pZHMsIGN0eC1cXHUwMDNlcGVuZGluZ19jbnQgKyAxLFxcbitcXHRcXHRcXHRcXHQgIHNpemVvZigqaWRzKSk7XFxuK1xcdGlmICghaWRzKSB7XFxuK1xcdFxcdHBfZXJyKFxcXCJtZW0gYWxsb2MgZmFpbGVkXFxcIik7XFxuK1xcdFxcdHJldHVybiAtMTtcXG4rXFx0fVxcbitcXHRjdHgtXFx1MDAzZXBlbmRpbmdfaWRzID0gaWRzO1xcbitcXG4rXFx0ZXJyID0gaGFzaG1hcF9fYWRkKGN0eC1cXHUwMDNlc2VlbiwgaWQsIDApO1xcbitcXHRpZiAoZXJyKSB7XFxuK1xcdFxcdHBfZXJyKFxcXCJmYWlsZWQgdG8gcmVjb3JkIGlubmVyIG1hcCBpZCAldTogJXNcXFwiLCBpZCwgc3RyZXJyb3IoLWVycikpO1xcbitcXHRcXHRyZXR1cm4gLTE7XFxuK1xcdH1cXG4rXFx0aWRzW2N0eC1cXHUwMDNlcGVuZGluZ19jbnQrK10gPSBpZDtcXG4rXFx0cmV0dXJuIDA7XFxuK31cXG4rXFxuIHN0YXRpYyBpbnRcXG4gbWFwX2R1bXAoaW50IGZkLCBzdHJ1Y3QgYnBmX21hcF9pbmZvICppbmZvLCBqc29uX3dyaXRlcl90ICp3dHIsXFxuLVxcdCBib29sIHNob3dfaGVhZGVyKVxcbitcXHQgYm9vbCBzaG93X2hlYWRlciwgc3RydWN0IG1hcF9kdW1wX2N0eCAqY3R4KVxcbiB7XFxuIFxcdHZvaWQgKmtleSwgKnZhbHVlLCAqcHJldl9rZXk7XFxuIFxcdHVuc2lnbmVkIGludCBudW1fZWxlbXMgPSAwO1xcbitcXHRqc29uX3dyaXRlcl90ICpwbGFpbl9idGZfd3RyID0gTlVMTDtcXG4gXFx0c3RydWN0IGJ0ZiAqYnRmID0gTlVMTDtcXG4gXFx0aW50IGVycjtcXG4gXFxuQEAgLTg0NSw2ICs4NzgsMTcgQEAgbWFwX2R1bXAoaW50IGZkLCBzdHJ1Y3QgYnBmX21hcF9pbmZvICppbmZvLCBqc29uX3dyaXRlcl90ICp3dHIsXFxuIFxcbiBcXHRwcmV2X2tleSA9IE5VTEw7XFxuIFxcbitcXHRpZiAoY3R4IFxcdTAwMjZcXHUwMDI2ICF3dHIgXFx1MDAyNlxcdTAwMjYgKGluZm8tXFx1MDAzZWJ0Zl92YWx1ZV90eXBlX2lkIHx8XFxuK1xcdFxcdFxcdCAgICBpbmZvLVxcdTAwM2VidGZfdm1saW51eF92YWx1ZV90eXBlX2lkKSkge1xcbitcXHRcXHRwbGFpbl9idGZfd3RyID0gZ2V0X2J0Zl93cml0ZXIoKTtcXG4rXFx0XFx0aWYgKHBsYWluX2J0Zl93dHIpIHtcXG4rXFx0XFx0XFx0aWYgKHNob3dfaGVhZGVyKVxcbitcXHRcXHRcXHRcXHRzaG93X21hcF9oZWFkZXJfcGxhaW4oaW5mbyk7XFxuK1xcdFxcdFxcdHNob3dfaGVhZGVyID0gZmFsc2U7XFxuK1xcdFxcdFxcdHd0ciA9IHBsYWluX2J0Zl93dHI7XFxuK1xcdFxcdH1cXG4rXFx0fVxcbitcXG4gXFx0aWYgKHd0cikge1xcbiBcXHRcXHRlcnIgPSBnZXRfbWFwX2t2X2J0ZihpbmZvLCBcXHUwMDI2YnRmKTtcXG4gXFx0XFx0aWYgKGVycikge1xcbkBAIC04NzQsMTAgKzkxOCwyMCBAQCBtYXBfZHVtcChpbnQgZmQsIHN0cnVjdCBicGZfbWFwX2luZm8gKmluZm8sIGpzb25fd3JpdGVyX3QgKnd0cixcXG4gXFx0XFx0aWYgKGVycikge1xcbiBcXHRcXHRcXHRpZiAoZXJybm8gPT0gRU5PRU5UKVxcbiBcXHRcXHRcXHRcXHRlcnIgPSAwO1xcbitcXHRcXHRcXHRlbHNlIGlmIChjdHgpXFxuK1xcdFxcdFxcdFxcdHBfZXJyKFxcXCJjYW4ndCBnZXQgbmV4dCBrZXkgZm9yIG1hcCBpZCAldTogJXNcXFwiLFxcbitcXHRcXHRcXHRcXHQgICAgICBpbmZvLVxcdTAwM2VpZCwgc3RyZXJyb3IoZXJybm8pKTtcXG4gXFx0XFx0XFx0YnJlYWs7XFxuIFxcdFxcdH1cXG4tXFx0XFx0aWYgKCFkdW1wX21hcF9lbGVtKGZkLCBrZXksIHZhbHVlLCBpbmZvLCBidGYsIHd0cikpXFxuK1xcdFxcdGVyciA9IGR1bXBfbWFwX2VsZW0oZmQsIGtleSwgdmFsdWUsIGluZm8sIGJ0Ziwgd3RyKTtcXG4rXFx0XFx0aWYgKCFlcnIpIHtcXG4gXFx0XFx0XFx0bnVtX2VsZW1zKys7XFxuK1xcdFxcdFxcdGlmIChjdHggXFx1MDAyNlxcdTAwMjYgbWFwX2lzX21hcF9vZl9tYXBzKGluZm8tXFx1MDAzZXR5cGUpKSB7XFxuK1xcdFxcdFxcdFxcdGVyciA9IGNvbGxlY3RfaW5uZXJfbWFwKGN0eCwgKihfX3UzMiAqKXZhbHVlKTtcXG4rXFx0XFx0XFx0XFx0aWYgKGVycilcXG4rXFx0XFx0XFx0XFx0XFx0YnJlYWs7XFxuK1xcdFxcdFxcdH1cXG4rXFx0XFx0fVxcbiBcXHRcXHRwcmV2X2tleSA9IGtleTtcXG4gXFx0fVxcbiBcXG5AQCAtODk0LDE4ICs5NDgsMjUgQEAgbWFwX2R1bXAoaW50IGZkLCBzdHJ1Y3QgYnBmX21hcF9pbmZvICppbmZvLCBqc29uX3dyaXRlcl90ICp3dHIsXFxuIFxcdGZyZWUoa2V5KTtcXG4gXFx0ZnJlZSh2YWx1ZSk7XFxuIFxcdGZyZWVfbWFwX2t2X2J0ZihidGYpO1xcbitcXHRpZiAocGxhaW5fYnRmX3d0cilcXG4rXFx0XFx0anNvbndfZGVzdHJveShcXHUwMDI2cGxhaW5fYnRmX3d0cik7XFxuIFxcbiBcXHRyZXR1cm4gZXJyO1xcbiB9XFxuIFxcbiBzdGF0aWMgaW50IGRvX2R1bXAoaW50IGFyZ2MsIGNoYXIgKiphcmd2KVxcbiB7XFxuK1xcdExJQkJQRl9PUFRTKGJwZl9nZXRfZmRfYnlfaWRfb3B0cywgb3B0cyxcXG4rXFx0XFx0ICAgIC5vcGVuX2ZsYWdzID0gQlBGX0ZfUkRPTkxZLFxcbitcXHQpO1xcbiBcXHRqc29uX3dyaXRlcl90ICp3dHIgPSBOVUxMLCAqYnRmX3d0ciA9IE5VTEw7XFxuIFxcdHN0cnVjdCBicGZfbWFwX2luZm8gaW5mbyA9IHt9O1xcbitcXHRzdHJ1Y3QgbWFwX2R1bXBfY3R4IGN0eCA9IHt9O1xcbiBcXHRpbnQgbmJfZmRzLCBpID0gMDtcXG4gXFx0X191MzIgbGVuID0gc2l6ZW9mKGluZm8pO1xcbiBcXHRpbnQgKmZkcyA9IE5VTEw7XFxuIFxcdGludCBlcnIgPSAtMTtcXG4rXFx0c2l6ZV90IGo7XFxuIFxcbiBcXHRpZiAoYXJnYyAhPSAyKVxcbiBcXHRcXHR1c2FnZSgpO1xcbkBAIC05MTksOSArOTgwLDM1IEBAIHN0YXRpYyBpbnQgZG9fZHVtcChpbnQgYXJnYywgY2hhciAqKmFyZ3YpXFxuIFxcdGlmIChuYl9mZHMgXFx1MDAzYyAxKVxcbiBcXHRcXHRnb3RvIGV4aXRfZnJlZTtcXG4gXFxuK1xcdGlmIChyZWN1cnNpdmVfZHVtcCkge1xcbitcXHRcXHRjdHguc2VlbiA9IGhhc2htYXBfX25ldyhoYXNoX2ZuX2Zvcl9rZXlfYXNfaWQsXFxuK1xcdFxcdFxcdFxcdFxcdGVxdWFsX2ZuX2Zvcl9rZXlfYXNfaWQsIE5VTEwpO1xcbitcXHRcXHRpZiAoSVNfRVJSKGN0eC5zZWVuKSkge1xcbitcXHRcXHRcXHRjdHguc2VlbiA9IE5VTEw7XFxuK1xcdFxcdFxcdHBfZXJyKFxcXCJmYWlsZWQgdG8gY3JlYXRlIGhhc2htYXAgZm9yIHJlY3Vyc2l2ZSBkdW1wXFxcIik7XFxuK1xcdFxcdFxcdGdvdG8gZXhpdF9jbG9zZTtcXG4rXFx0XFx0fVxcbitcXHRcXHQvKiBSZWNvcmQgdGhlIHNlbGVjdGVkIG1hcHMgYmVmb3JlIGRpc2NvdmVyaW5nIGFueSBpbm5lciBtYXBzLiAqL1xcbitcXHRcXHRmb3IgKGkgPSAwOyBpIFxcdTAwM2MgbmJfZmRzOyBpKyspIHtcXG4rXFx0XFx0XFx0bGVuID0gc2l6ZW9mKGluZm8pO1xcbitcXHRcXHRcXHRpZiAoYnBmX21hcF9nZXRfaW5mb19ieV9mZChmZHNbaV0sIFxcdTAwMjZpbmZvLCBcXHUwMDI2bGVuKSkge1xcbitcXHRcXHRcXHRcXHRwX2VycihcXFwiY2FuJ3QgZ2V0IG1hcCBpbmZvOiAlc1xcXCIsIHN0cmVycm9yKGVycm5vKSk7XFxuK1xcdFxcdFxcdFxcdGVyciA9IC0xO1xcbitcXHRcXHRcXHRcXHRnb3RvIGV4aXRfY2xvc2U7XFxuK1xcdFxcdFxcdH1cXG4rXFx0XFx0XFx0ZXJyID0gaGFzaG1hcF9fYWRkKGN0eC5zZWVuLCBpbmZvLmlkLCAwKTtcXG4rXFx0XFx0XFx0aWYgKGVycikge1xcbitcXHRcXHRcXHRcXHRwX2VycihcXFwiZmFpbGVkIHRvIHJlY29yZCBtYXAgaWQgJXU6ICVzXFxcIiwgaW5mby5pZCxcXG4rXFx0XFx0XFx0XFx0ICAgICAgc3RyZXJyb3IoLWVycikpO1xcbitcXHRcXHRcXHRcXHRlcnIgPSAtMTtcXG4rXFx0XFx0XFx0XFx0Z290byBleGl0X2Nsb3NlO1xcbitcXHRcXHRcXHR9XFxuK1xcdFxcdH1cXG4rXFx0fVxcbitcXG4gXFx0aWYgKGpzb25fb3V0cHV0KSB7XFxuIFxcdFxcdHd0ciA9IGpzb25fd3RyO1xcbi1cXHR9IGVsc2Uge1xcbitcXHR9IGVsc2UgaWYgKCFyZWN1cnNpdmVfZHVtcCkge1xcbiBcXHRcXHRpbnQgZG9fcGxhaW5fYnRmO1xcbiBcXG4gXFx0XFx0ZG9fcGxhaW5fYnRmID0gbWFwc19oYXZlX2J0ZihmZHMsIG5iX2Zkcyk7XFxuQEAgLTkzNiw3ICsxMDIzLDcgQEAgc3RhdGljIGludCBkb19kdW1wKGludCBhcmdjLCBjaGFyICoqYXJndilcXG4gXFx0XFx0fVxcbiBcXHR9XFxuIFxcbi1cXHRpZiAod3RyIFxcdTAwMjZcXHUwMDI2IG5iX2ZkcyBcXHUwMDNlIDEpXFxuK1xcdGlmICh3dHIgXFx1MDAyNlxcdTAwMjYgKG5iX2ZkcyBcXHUwMDNlIDEgfHwgcmVjdXJzaXZlX2R1bXApKVxcbiBcXHRcXHRqc29ud19zdGFydF9hcnJheSh3dHIpO1xcdC8qIHJvb3QgYXJyYXkgKi9cXG4gXFx0Zm9yIChpID0gMDsgaSBcXHUwMDNjIG5iX2ZkczsgaSsrKSB7XFxuIFxcdFxcdGlmIChicGZfbWFwX2dldF9pbmZvX2J5X2ZkKGZkc1tpXSwgXFx1MDAyNmluZm8sIFxcdTAwMjZsZW4pKSB7XFxuQEAgLTk0NCwyMiArMTAzMSw1MCBAQCBzdGF0aWMgaW50IGRvX2R1bXAoaW50IGFyZ2MsIGNoYXIgKiphcmd2KVxcbiBcXHRcXHRcXHRlcnIgPSAtMTtcXG4gXFx0XFx0XFx0YnJlYWs7XFxuIFxcdFxcdH1cXG4tXFx0XFx0ZXJyID0gbWFwX2R1bXAoZmRzW2ldLCBcXHUwMDI2aW5mbywgd3RyLCBuYl9mZHMgXFx1MDAzZSAxKTtcXG4rXFx0XFx0ZXJyID0gbWFwX2R1bXAoZmRzW2ldLCBcXHUwMDI2aW5mbywgd3RyLCBuYl9mZHMgXFx1MDAzZSAxIHx8IHJlY3Vyc2l2ZV9kdW1wLFxcbitcXHRcXHRcXHQgICAgICAgcmVjdXJzaXZlX2R1bXAgPyBcXHUwMDI2Y3R4IDogTlVMTCk7XFxuIFxcdFxcdGlmICghd3RyIFxcdTAwMjZcXHUwMDI2IGkgIT0gbmJfZmRzIC0gMSlcXG4gXFx0XFx0XFx0cHJpbnRmKFxcXCJcXFxcblxcXCIpO1xcbiBcXG4gXFx0XFx0aWYgKGVycilcXG4gXFx0XFx0XFx0YnJlYWs7XFxuLVxcdFxcdGNsb3NlKGZkc1tpXSk7XFxuK1xcdFxcdC8qIEtlZXAgc2VsZWN0ZWQgbWFwcyBhbGl2ZSB3aGlsZSB2aXNpdGluZyB0aGVpciBpbm5lciBtYXBzLiAqL1xcbitcXHRcXHRpZiAoIXJlY3Vyc2l2ZV9kdW1wKVxcbitcXHRcXHRcXHRjbG9zZShmZHNbaV0pO1xcbitcXHR9XFxuK1xcdGZvciAoaiA9IDA7ICFlcnIgXFx1MDAyNlxcdTAwMjYgaiBcXHUwMDNjIGN0eC5wZW5kaW5nX2NudDsgaisrKSB7XFxuK1xcdFxcdGludCBmZDtcXG4rXFxuK1xcdFxcdGZkID0gYnBmX21hcF9nZXRfZmRfYnlfaWRfb3B0cyhjdHgucGVuZGluZ19pZHNbal0sIFxcdTAwMjZvcHRzKTtcXG4rXFx0XFx0aWYgKGZkIFxcdTAwM2MgMCkge1xcbitcXHRcXHRcXHRwX2VycihcXFwiY2FuJ3Qgb3BlbiBpbm5lciBtYXAgaWQgJXU6ICVzXFxcIixcXG4rXFx0XFx0XFx0ICAgICAgY3R4LnBlbmRpbmdfaWRzW2pdLCBzdHJlcnJvcihlcnJubykpO1xcbitcXHRcXHRcXHRlcnIgPSAtMTtcXG4rXFx0XFx0XFx0YnJlYWs7XFxuK1xcdFxcdH1cXG4rXFx0XFx0bGVuID0gc2l6ZW9mKGluZm8pO1xcbitcXHRcXHRpZiAoYnBmX21hcF9nZXRfaW5mb19ieV9mZChmZCwgXFx1MDAyNmluZm8sIFxcdTAwMjZsZW4pKSB7XFxuK1xcdFxcdFxcdHBfZXJyKFxcXCJjYW4ndCBnZXQgbWFwIGluZm86ICVzXFxcIiwgc3RyZXJyb3IoZXJybm8pKTtcXG4rXFx0XFx0XFx0ZXJyID0gLTE7XFxuK1xcdFxcdH0gZWxzZSB7XFxuK1xcdFxcdFxcdGlmICghd3RyKVxcbitcXHRcXHRcXHRcXHRwcmludGYoXFxcIlxcXFxuXFxcIik7XFxuK1xcdFxcdFxcdGVyciA9IG1hcF9kdW1wKGZkLCBcXHUwMDI2aW5mbywgd3RyLCB0cnVlLCBcXHUwMDI2Y3R4KTtcXG4rXFx0XFx0fVxcbitcXHRcXHRjbG9zZShmZCk7XFxuIFxcdH1cXG4tXFx0aWYgKHd0ciBcXHUwMDI2XFx1MDAyNiBuYl9mZHMgXFx1MDAzZSAxKVxcbitcXHRpZiAod3RyIFxcdTAwMjZcXHUwMDI2IChuYl9mZHMgXFx1MDAzZSAxIHx8IHJlY3Vyc2l2ZV9kdW1wKSlcXG4gXFx0XFx0anNvbndfZW5kX2FycmF5KHd0cik7XFx0Lyogcm9vdCBhcnJheSAqL1xcbiBcXG4gXFx0aWYgKGJ0Zl93dHIpXFxuIFxcdFxcdGpzb253X2Rlc3Ryb3koXFx1MDAyNmJ0Zl93dHIpO1xcbiBleGl0X2Nsb3NlOlxcbitcXHRpZiAocmVjdXJzaXZlX2R1bXApXFxuK1xcdFxcdGkgPSAwO1xcbiBcXHRmb3IgKDsgaSBcXHUwMDNjIG5iX2ZkczsgaSsrKVxcbiBcXHRcXHRjbG9zZShmZHNbaV0pO1xcbitcXHRoYXNobWFwX19mcmVlKGN0eC5zZWVuKTtcXG4rXFx0ZnJlZShjdHgucGVuZGluZ19pZHMpO1xcbiBleGl0X2ZyZWU6XFxuIFxcdGZyZWUoZmRzKTtcXG4gXFx0ZnJlZV9idGZfdm1saW51eCgpO1xcbkBAIC0xNDg0LDcgKzE1OTksNyBAQCBzdGF0aWMgaW50IGRvX2hlbHAoaW50IGFyZ2MsIGNoYXIgKiphcmd2KVxcbiBcXHRcXHRcXFwiICAgICAgICAgICAgICAgICB0YXNrX3N0b3JhZ2UgfCBibG9vbV9maWx0ZXIgfCB1c2VyX3JpbmdidWYgfCBjZ3JwX3N0b3JhZ2UgfCBhcmVuYSB8XFxcXG5cXFwiXFxuIFxcdFxcdFxcXCIgICAgICAgICAgICAgICAgIGluc25fYXJyYXkgfCByaGFzaCB9XFxcXG5cXFwiXFxuIFxcdFxcdFxcXCIgICAgICAgXFxcIiBIRUxQX1NQRUNfT1BUSU9OUyBcXFwiIHxcXFxcblxcXCJcXG4tXFx0XFx0XFxcIiAgICAgICAgICAgICAgICAgICAgey1mfC0tYnBmZnN9IHwgey1ufC0tbm9tb3VudH0gfVxcXFxuXFxcIlxcbitcXHRcXHRcXFwiICAgICAgICAgICAgICAgICAgICB7LWZ8LS1icGZmc30gfCB7LW58LS1ub21vdW50fSB8IHstcnwtLXJlY3Vyc2l2ZX0gfVxcXFxuXFxcIlxcbiBcXHRcXHRcXFwiXFxcIixcXG4gXFx0XFx0YmluX25hbWUsIGFyZ3ZbLTJdKTtcXG4gXFxuZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9wcm9nX3Rlc3RzL2JwZnRvb2xfbWFwX2R1bXAuYyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9wcm9nX3Rlc3RzL2JwZnRvb2xfbWFwX2R1bXAuY1xcbm5ldyBmaWxlIG1vZGUgMTAwNjQ0XFxuaW5kZXggMDAwMDAwMDAwMDAwMC4uMWZiODc3ZmM2OGM4M1xcbi0tLSAvZGV2L251bGxcXG4rKysgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ190ZXN0cy9icGZ0b29sX21hcF9kdW1wLmNcXG5AQCAtMCwwICsxLDQ3NCBAQFxcbisvLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogR1BMLTIuMC1vbmx5XFxuKyNpbmNsdWRlIFxcdTAwM2N0ZXN0X3Byb2dzLmhcXHUwMDNlXFxuKyNpbmNsdWRlIFxcdTAwM2NicGZ0b29sX2hlbHBlcnMuaFxcdTAwM2VcXG4rI2luY2x1ZGUgXFx1MDAzY2JwZi9idGYuaFxcdTAwM2VcXG4rI2luY2x1ZGUgXFx1MDAzY3N5cy9yZXNvdXJjZS5oXFx1MDAzZVxcbisjaW5jbHVkZSBcXHUwMDNjZGlyZW50LmhcXHUwMDNlXFxuK1xcbisjZGVmaW5lIE9VVFBVVF9TSVpFIDgxOTJcXG4rXFxuK3N0YXRpYyBib29sIGR1bXBfbWFwKF9fdTMyIGlkLCBjb25zdCBjaGFyICpvcHRpb25zLCBjaGFyICpvdXRwdXQpXFxuK3tcXG4rXFx0Y2hhciBjb21tYW5kW01BWF9CUEZUT09MX0NNRF9MRU5dO1xcbitcXG4rXFx0c25wcmludGYoY29tbWFuZCwgc2l6ZW9mKGNvbW1hbmQpLCBcXFwiJXMgbWFwIGR1bXAgaWQgJXVcXFwiLCBvcHRpb25zLCBpZCk7XFxuK1xcdG1lbXNldChvdXRwdXQsIDAsIE9VVFBVVF9TSVpFKTtcXG4rXFx0aWYgKCFBU1NFUlRfT0soZ2V0X2JwZnRvb2xfY29tbWFuZF9vdXRwdXQoY29tbWFuZCwgb3V0cHV0LCBPVVRQVVRfU0laRSAtIDEpLFxcbitcXHRcXHQgICAgICAgXFxcImR1bXBfbWFwXFxcIikpXFxuK1xcdFxcdHJldHVybiBmYWxzZTtcXG4rXFx0LyogVGhlIGhlbHBlciBsZWF2ZXMgdGhlIHRyYWlsaW5nIG5ld2xpbmUgaW4gcGxhY2UuICovXFxuK1xcdG91dHB1dFtzdHJjc3BuKG91dHB1dCwgXFxcIlxcXFxuXFxcIildID0gJ1xcXFwwJztcXG4rXFx0cmV0dXJuIHRydWU7XFxuK31cXG4rXFxuK3N0YXRpYyBfX3UzMiBtYXBfaWQoaW50IGZkKVxcbit7XFxuK1xcdHN0cnVjdCBicGZfbWFwX2luZm8gaW5mbyA9IHt9O1xcbitcXHRfX3UzMiBsZW4gPSBzaXplb2YoaW5mbyk7XFxuK1xcbitcXHRpZiAoIUFTU0VSVF9PSyhicGZfbWFwX2dldF9pbmZvX2J5X2ZkKGZkLCBcXHUwMDI2aW5mbywgXFx1MDAyNmxlbiksIFxcXCJtYXBfaW5mb1xcXCIpKVxcbitcXHRcXHRyZXR1cm4gMDtcXG4rXFx0cmV0dXJuIGluZm8uaWQ7XFxuK31cXG4rXFxuK3N0YXRpYyBpbnQgY291bnRfdG9rZW4oY29uc3QgY2hhciAqb3V0cHV0LCBjb25zdCBjaGFyICp0b2tlbilcXG4re1xcbitcXHRpbnQgY291bnQgPSAwO1xcbitcXG4rXFx0d2hpbGUgKChvdXRwdXQgPSBzdHJzdHIob3V0cHV0LCB0b2tlbikpKSB7XFxuK1xcdFxcdGNvdW50Kys7XFxuK1xcdFxcdG91dHB1dCArPSBzdHJsZW4odG9rZW4pO1xcbitcXHR9XFxuK1xcdHJldHVybiBjb3VudDtcXG4rfVxcbitcXG4rc3RhdGljIHZvaWQgY2hlY2tfcGxhaW4oX191MzIgcm9vdF9pZCwgX191MzIgaW5uZXJfaWQsIGNvbnN0IGNoYXIgKnR5cGUsXFxuK1xcdFxcdFxcdGludCBlbnRyaWVzLCBib29sIHR5cGVkKVxcbit7XFxuK1xcdGNoYXIgY29tbWFuZFtNQVhfQlBGVE9PTF9DTURfTEVOXSwgaGVhZGVyWzEyOF07XFxuK1xcdGNoYXIgb3V0cHV0W09VVFBVVF9TSVpFXSA9IHt9O1xcbitcXHRjb25zdCBjaGFyICpyb290LCAqaW5uZXI7XFxuK1xcbitcXHRzbnByaW50Zihjb21tYW5kLCBzaXplb2YoY29tbWFuZCksIFxcXCItLXJlY3Vyc2l2ZSBtYXAgZHVtcCBpZCAldVxcXCIsIHJvb3RfaWQpO1xcbitcXHRpZiAoIUFTU0VSVF9PSyhnZXRfYnBmdG9vbF9jb21tYW5kX291dHB1dChjb21tYW5kLCBvdXRwdXQsIHNpemVvZihvdXRwdXQpIC0gMSksXFxuK1xcdFxcdCAgICAgICBcXFwicGxhaW5fZHVtcFxcXCIpKVxcbitcXHRcXHRyZXR1cm47XFxuK1xcdHNucHJpbnRmKGhlYWRlciwgc2l6ZW9mKGhlYWRlciksIFxcXCIldTogJXMgIG5hbWUgZHVtcF9vdXRlciAgXFxcIiwgcm9vdF9pZCwgdHlwZSk7XFxuK1xcdHJvb3QgPSBzdHJzdHIob3V0cHV0LCBoZWFkZXIpO1xcbitcXHRpZiAoIUFTU0VSVF9PS19QVFIocm9vdCwgXFxcInBsYWluX3Jvb3RfaGVhZGVyXFxcIikpXFxuK1xcdFxcdHJldHVybjtcXG4rXFx0QVNTRVJUX0VRKHJvb3QgLSBvdXRwdXQsIDAsIFxcXCJwbGFpbl9yb290X2ZpcnN0XFxcIik7XFxuK1xcdEFTU0VSVF9FUShjb3VudF90b2tlbihvdXRwdXQsIFxcXCJpbm5lcl9tYXBfaWQ6XFxcIiksIGVudHJpZXMsIFxcXCJwbGFpbl9yZWZlcmVuY2VzXFxcIik7XFxuK1xcdGlmIChlbnRyaWVzKSB7XFxuK1xcdFxcdHNucHJpbnRmKGhlYWRlciwgc2l6ZW9mKGhlYWRlciksIFxcXCIldTogaGFzaCAgbmFtZSBkdW1wX2lubmVyICBcXFwiLCBpbm5lcl9pZCk7XFxuK1xcdFxcdGlubmVyID0gc3Ryc3RyKG91dHB1dCwgaGVhZGVyKTtcXG4rXFx0XFx0aWYgKEFTU0VSVF9PS19QVFIoaW5uZXIsIFxcXCJwbGFpbl9pbm5lcl9oZWFkZXJcXFwiKSlcXG4rXFx0XFx0XFx0QVNTRVJUX0dUKGlubmVyIC0gcm9vdCwgMCwgXFxcInBsYWluX2lubmVyX2FmdGVyX3Jvb3RcXFwiKTtcXG4rXFx0XFx0QVNTRVJUX0VRKGNvdW50X3Rva2VuKG91dHB1dCwgaGVhZGVyKSwgMSwgXFxcInBsYWluX2lubmVyX29uY2VcXFwiKTtcXG4rXFx0fVxcbitcXHRBU1NFUlRfRVEoY291bnRfdG9rZW4ob3V0cHV0LCBcXFwiRm91bmQgXFxcIiksIGVudHJpZXMgXFx1MDAyNlxcdTAwMjYgIXR5cGVkID8gMiA6IDEsXFxuK1xcdFxcdCAgXFxcInBsYWluX21hcF9jb3VudFxcXCIpO1xcbitcXHRpZiAodHlwZWQpIHtcXG4rXFx0XFx0QVNTRVJUX0hBU19TVUJTVFIob3V0cHV0LCBcXFwiXFxcXFxcXCJrZXlcXFxcXFxcIjogMFxcXCIsIFxcXCJwbGFpbl9idGZfa2V5XFxcIik7XFxuK1xcdFxcdEFTU0VSVF9IQVNfU1VCU1RSKG91dHB1dCwgXFxcIlxcXFxcXFwidmFsdWVcXFxcXFxcIjogMTY4NDMwMDlcXFwiLCBcXFwicGxhaW5fYnRmX3ZhbHVlXFxcIik7XFxuK1xcdH1cXG4rfVxcbitcXG4rc3RhdGljIHZvaWQgdGVzdF9vdXRlcihlbnVtIGJwZl9tYXBfdHlwZSB0eXBlLCBpbnQgZW50cmllcywgYm9vbCBlbXB0eV9pbm5lcixcXG4rXFx0XFx0ICAgICAgIGJvb2wgdHlwZWQpXFxuK3tcXG4rXFx0TElCQlBGX09QVFMoYnBmX21hcF9jcmVhdGVfb3B0cywgb3B0cyk7XFxuK1xcdExJQkJQRl9PUFRTKGJwZl9tYXBfY3JlYXRlX29wdHMsIGlubmVyX29wdHMpO1xcbitcXHRzdHJ1Y3QgYnRmICpidGYgPSBOVUxMO1xcbitcXHRjaGFyIG91dGVyW09VVFBVVF9TSVpFXSwgaW5uZXJbT1VUUFVUX1NJWkVdLCBvdXRwdXRbT1VUUFVUX1NJWkVdO1xcbitcXHRjaGFyIGV4cGVjdGVkW09VVFBVVF9TSVpFICogM10sIHJlZmVyZW5jZVs2NF07XFxuK1xcdGNvbnN0IGNoYXIgKnR5cGVfbmFtZSA9IGxpYmJwZl9icGZfbWFwX3R5cGVfc3RyKHR5cGUpO1xcbitcXHRpbnQgaW5uZXJfZmQgPSAtMSwgb3V0ZXJfZmQgPSAtMTtcXG4rXFx0X191MzIgcm9vdF9pZCwgaW5uZXJfaWQsIGtleSwgdmFsdWUgPSAweDAxMDEwMTAxO1xcbitcXG4rXFx0aWYgKHR5cGVkKSB7XFxuK1xcdFxcdGJ0ZiA9IGJ0Zl9fbmV3X2VtcHR5KCk7XFxuK1xcdFxcdGlmICghQVNTRVJUX09LX1BUUihidGYsIFxcXCJjcmVhdGVfYnRmXFxcIikgfHxcXG4rXFx0XFx0ICAgICFBU1NFUlRfRVEoYnRmX19hZGRfaW50KGJ0ZiwgXFxcInVuc2lnbmVkIGludFxcXCIsIDQsIDApLCAxLCBcXFwiYnRmX2ludFxcXCIpIHx8XFxuK1xcdFxcdCAgICAhQVNTRVJUX09LKGJ0Zl9fbG9hZF9pbnRvX2tlcm5lbChidGYpLCBcXFwibG9hZF9idGZcXFwiKSlcXG4rXFx0XFx0XFx0Z290byBvdXQ7XFxuK1xcdFxcdGlubmVyX29wdHMuYnRmX2ZkID0gYnRmX19mZChidGYpO1xcbitcXHRcXHRpbm5lcl9vcHRzLmJ0Zl9rZXlfdHlwZV9pZCA9IDE7XFxuK1xcdFxcdGlubmVyX29wdHMuYnRmX3ZhbHVlX3R5cGVfaWQgPSAxO1xcbitcXHR9XFxuK1xcdGlubmVyX2ZkID0gYnBmX21hcF9jcmVhdGUoQlBGX01BUF9UWVBFX0hBU0gsIFxcXCJkdW1wX2lubmVyXFxcIiwgc2l6ZW9mKGtleSksXFxuK1xcdFxcdFxcdFxcdCAgc2l6ZW9mKHZhbHVlKSwgMiwgXFx1MDAyNmlubmVyX29wdHMpO1xcbitcXHRpZiAoIUFTU0VSVF9PS19GRChpbm5lcl9mZCwgXFxcImNyZWF0ZV9pbm5lclxcXCIpKVxcbitcXHRcXHRnb3RvIG91dDtcXG4rXFx0a2V5ID0gMDtcXG4rXFx0aWYgKCFlbXB0eV9pbm5lciBcXHUwMDI2XFx1MDAyNlxcbitcXHQgICAgIUFTU0VSVF9PSyhicGZfbWFwX3VwZGF0ZV9lbGVtKGlubmVyX2ZkLCBcXHUwMDI2a2V5LCBcXHUwMDI2dmFsdWUsIEJQRl9BTlkpLFxcbitcXHRcXHQgICAgICAgXFxcInBvcHVsYXRlX2lubmVyXFxcIikpXFxuK1xcdFxcdGdvdG8gb3V0O1xcbitcXHRvcHRzLmlubmVyX21hcF9mZCA9IGlubmVyX2ZkO1xcbitcXHRvdXRlcl9mZCA9IGJwZl9tYXBfY3JlYXRlKHR5cGUsIFxcXCJkdW1wX291dGVyXFxcIiwgc2l6ZW9mKGtleSksIHNpemVvZihfX3UzMiksXFxuK1xcdFxcdFxcdFxcdCAgMywgXFx1MDAyNm9wdHMpO1xcbitcXHRpZiAoIUFTU0VSVF9PS19GRChvdXRlcl9mZCwgXFxcImNyZWF0ZV9vdXRlclxcXCIpKVxcbitcXHRcXHRnb3RvIG91dDtcXG4rXFx0LyogVGhlIHVudXNlZCB0aGlyZCBhcnJheSBzbG90IGFsc28gZXhlcmNpc2VzIGZhaWxlZCBsb29rdXBzLiAqL1xcbitcXHRmb3IgKGtleSA9IDA7IGtleSBcXHUwMDNjIGVudHJpZXM7IGtleSsrKVxcbitcXHRcXHRpZiAoIUFTU0VSVF9PSyhicGZfbWFwX3VwZGF0ZV9lbGVtKG91dGVyX2ZkLCBcXHUwMDI2a2V5LCBcXHUwMDI2aW5uZXJfZmQsIEJQRl9BTlkpLFxcbitcXHRcXHRcXHQgICAgICAgXFxcInBvcHVsYXRlX291dGVyXFxcIikpXFxuK1xcdFxcdFxcdGdvdG8gb3V0O1xcbitcXHRyb290X2lkID0gbWFwX2lkKG91dGVyX2ZkKTtcXG4rXFx0aW5uZXJfaWQgPSBtYXBfaWQoaW5uZXJfZmQpO1xcbitcXHRpZiAoIXJvb3RfaWQgfHwgIWlubmVyX2lkIHx8ICFkdW1wX21hcChyb290X2lkLCBcXFwiLWpcXFwiLCBvdXRlcikgfHxcXG4rXFx0ICAgICFkdW1wX21hcChpbm5lcl9pZCwgXFxcIi1qXFxcIiwgaW5uZXIpKVxcbitcXHRcXHRnb3RvIG91dDtcXG4rXFxuK1xcdEFTU0VSVF9FUShvdXRlclswXSwgJ1snLCBcXFwiZGVmYXVsdF9hcnJheVxcXCIpO1xcbitcXHRBU1NFUlRfRVEoY291bnRfdG9rZW4ob3V0ZXIsIFxcXCJcXFxcXFxcImVsZW1lbnRzXFxcXFxcXCI6XFxcIiksIDAsIFxcXCJkZWZhdWx0X25vX3dyYXBwZXJcXFwiKTtcXG4rXFx0QVNTRVJUX0VRKGNvdW50X3Rva2VuKG91dGVyLCBcXFwiXFxcXFxcXCJpZFxcXFxcXFwiOlxcXCIpLCAwLCBcXFwiZGVmYXVsdF9ub19oZWFkZXJcXFwiKTtcXG4rXFx0c25wcmludGYocmVmZXJlbmNlLCBzaXplb2YocmVmZXJlbmNlKSwgXFxcIlxcXFxcXFwiaW5uZXJfbWFwX2lkXFxcXFxcXCI6JXVcXFwiLCBpbm5lcl9pZCk7XFxuK1xcdEFTU0VSVF9FUShjb3VudF90b2tlbihvdXRlciwgcmVmZXJlbmNlKSwgZW50cmllcywgXFxcImRlZmF1bHRfcmVmZXJlbmNlc1xcXCIpO1xcbitcXHRpZiAoIWVudHJpZXMpXFxuK1xcdFxcdEFTU0VSVF9TVFJFUShvdXRlciwgXFxcIltdXFxcIiwgXFxcImVtcHR5X291dGVyX2RlZmF1bHRcXFwiKTtcXG4rXFx0aWYgKGVtcHR5X2lubmVyKVxcbitcXHRcXHRBU1NFUlRfU1RSRVEoaW5uZXIsIFxcXCJbXVxcXCIsIFxcXCJlbXB0eV9pbm5lcl9kZWZhdWx0XFxcIik7XFxuK1xcdGVsc2UgaWYgKHR5cGVkKVxcbitcXHRcXHRBU1NFUlRfSEFTX1NVQlNUUihpbm5lciwgXFxcIlxcXFxcXFwiZm9ybWF0dGVkXFxcXFxcXCI6e1xcXFxcXFwia2V5XFxcXFxcXCI6MCxcXFxcXFxcInZhbHVlXFxcXFxcXCI6MTY4NDMwMDl9XFxcIixcXG4rXFx0XFx0XFx0XFx0ICBcXFwidHlwZWRfaW5uZXJcXFwiKTtcXG4rXFx0ZWxzZVxcbitcXHRcXHRBU1NFUlRfU1RSRVEoaW5uZXIsXFxuK1xcdFxcdFxcdCAgICAgXFxcIlt7XFxcXFxcXCJrZXlcXFxcXFxcIjpbXFxcXFxcXCIweDAwXFxcXFxcXCIsXFxcXFxcXCIweDAwXFxcXFxcXCIsXFxcXFxcXCIweDAwXFxcXFxcXCIsXFxcXFxcXCIweDAwXFxcXFxcXCJdLFxcXCJcXG4rXFx0XFx0XFx0ICAgICBcXFwiXFxcXFxcXCJ2YWx1ZVxcXFxcXFwiOltcXFxcXFxcIjB4MDFcXFxcXFxcIixcXFxcXFxcIjB4MDFcXFxcXFxcIixcXFxcXFxcIjB4MDFcXFxcXFxcIixcXFxcXFxcIjB4MDFcXFxcXFxcIl19XVxcXCIsXFxuK1xcdFxcdFxcdCAgICAgXFxcIm9yZGluYXJ5X2RlZmF1bHRcXFwiKTtcXG4rXFxuK1xcdC8qXFxuK1xcdCAqIENvbXBhcmUgdGhlIGNvbXBsZXRlIEpTT04gZG9jdW1lbnQ6IGEgZmxhdCBhcnJheSB3aXRoIHRoZSByb290IGZpcnN0LFxcbitcXHQgKiBvbmUgY29weSBvZiB0aGUgc2hhcmVkIGlubmVyIG1hcCwgYW5kIHVuY2hhbmdlZCBlbnRyeSByZXByZXNlbnRhdGlvbnMuXFxuK1xcdCAqL1xcbitcXHRpZiAoZW50cmllcylcXG4rXFx0XFx0c25wcmludGYoZXhwZWN0ZWQsIHNpemVvZihleHBlY3RlZCksXFxuK1xcdFxcdFxcdCBcXFwiW3tcXFxcXFxcImlkXFxcXFxcXCI6JXUsXFxcXFxcXCJ0eXBlXFxcXFxcXCI6XFxcXFxcXCIlc1xcXFxcXFwiLFxcXFxcXFwibmFtZVxcXFxcXFwiOlxcXFxcXFwiZHVtcF9vdXRlclxcXFxcXFwiLFxcXCJcXG4rXFx0XFx0XFx0IFxcXCJcXFxcXFxcImZsYWdzXFxcXFxcXCI6MCxcXFxcXFxcImVsZW1lbnRzXFxcXFxcXCI6JXN9LHtcXFxcXFxcImlkXFxcXFxcXCI6JXUsXFxcXFxcXCJ0eXBlXFxcXFxcXCI6XFxcXFxcXCJoYXNoXFxcXFxcXCIsXFxcIlxcbitcXHRcXHRcXHQgXFxcIlxcXFxcXFwibmFtZVxcXFxcXFwiOlxcXFxcXFwiZHVtcF9pbm5lclxcXFxcXFwiLFxcXFxcXFwiZmxhZ3NcXFxcXFxcIjowLFxcXFxcXFwiZWxlbWVudHNcXFxcXFxcIjolc31dXFxcIixcXG4rXFx0XFx0XFx0IHJvb3RfaWQsIHR5cGVfbmFtZSwgb3V0ZXIsIGlubmVyX2lkLCBpbm5lcik7XFxuK1xcdGVsc2VcXG4rXFx0XFx0c25wcmludGYoZXhwZWN0ZWQsIHNpemVvZihleHBlY3RlZCksXFxuK1xcdFxcdFxcdCBcXFwiW3tcXFxcXFxcImlkXFxcXFxcXCI6JXUsXFxcXFxcXCJ0eXBlXFxcXFxcXCI6XFxcXFxcXCIlc1xcXFxcXFwiLFxcXFxcXFwibmFtZVxcXFxcXFwiOlxcXFxcXFwiZHVtcF9vdXRlclxcXFxcXFwiLFxcXCJcXG4rXFx0XFx0XFx0IFxcXCJcXFxcXFxcImZsYWdzXFxcXFxcXCI6MCxcXFxcXFxcImVsZW1lbnRzXFxcXFxcXCI6W119XVxcXCIsIHJvb3RfaWQsIHR5cGVfbmFtZSk7XFxuK1xcdGlmIChkdW1wX21hcChyb290X2lkLCBcXFwiLWogLXJcXFwiLCBvdXRwdXQpKVxcbitcXHRcXHRBU1NFUlRfU1RSRVEob3V0cHV0LCBleHBlY3RlZCwgXFxcInJlY3Vyc2l2ZV9qc29uXFxcIik7XFxuK1xcdGlmIChkdW1wX21hcChyb290X2lkLCBcXFwiLS1qc29uIC0tcmVjdXJzaXZlXFxcIiwgb3V0cHV0KSlcXG4rXFx0XFx0QVNTRVJUX1NUUkVRKG91dHB1dCwgZXhwZWN0ZWQsIFxcXCJyZWN1cnNpdmVfbG9uZ19vcHRpb25zXFxcIik7XFxuK1xcdGNoZWNrX3BsYWluKHJvb3RfaWQsIGlubmVyX2lkLCB0eXBlX25hbWUsIGVudHJpZXMsIHR5cGVkKTtcXG4rXFxuK1xcdC8qIFJlY3Vyc2lvbiBvbiBhbiBvcmRpbmFyeSBtYXAgc3RpbGwgZW1pdHMgYSBzaW5nbGUgbWFwIG9iamVjdC4gKi9cXG4rXFx0c25wcmludGYoZXhwZWN0ZWQsIHNpemVvZihleHBlY3RlZCksXFxuK1xcdFxcdCBcXFwiW3tcXFxcXFxcImlkXFxcXFxcXCI6JXUsXFxcXFxcXCJ0eXBlXFxcXFxcXCI6XFxcXFxcXCJoYXNoXFxcXFxcXCIsXFxcXFxcXCJuYW1lXFxcXFxcXCI6XFxcXFxcXCJkdW1wX2lubmVyXFxcXFxcXCIsXFxcIlxcbitcXHRcXHQgXFxcIlxcXFxcXFwiZmxhZ3NcXFxcXFxcIjowLFxcXFxcXFwiZWxlbWVudHNcXFxcXFxcIjolc31dXFxcIiwgaW5uZXJfaWQsIGlubmVyKTtcXG4rXFx0aWYgKGR1bXBfbWFwKGlubmVyX2lkLCBcXFwiLWogLXJcXFwiLCBvdXRwdXQpKVxcbitcXHRcXHRBU1NFUlRfU1RSRVEob3V0cHV0LCBleHBlY3RlZCwgXFxcIm9yZGluYXJ5X3JlY3Vyc2l2ZVxcXCIpO1xcbitvdXQ6XFxuK1xcdGlmIChvdXRlcl9mZCBcXHUwMDNlPSAwKVxcbitcXHRcXHRjbG9zZShvdXRlcl9mZCk7XFxuK1xcdGlmIChpbm5lcl9mZCBcXHUwMDNlPSAwKVxcbitcXHRcXHRjbG9zZShpbm5lcl9mZCk7XFxuK1xcdGJ0Zl9fZnJlZShidGYpO1xcbit9XFxuK1xcbitzdGF0aWMgdm9pZCB0ZXN0X211bHRpcGxlX3Jvb3RzKHZvaWQpXFxuK3tcXG4rXFx0TElCQlBGX09QVFMoYnBmX21hcF9jcmVhdGVfb3B0cywgb3B0cyk7XFxuK1xcdGNoYXIgY29tbWFuZFtNQVhfQlBGVE9PTF9DTURfTEVOXSwgbmFtZVtCUEZfT0JKX05BTUVfTEVOXTtcXG4rXFx0Y2hhciBvdXRwdXRbT1VUUFVUX1NJWkVdID0ge30sIGV4cGVjdGVkW09VVFBVVF9TSVpFICogNF0sIGVsZW1lbnRzW09VVFBVVF9TSVpFXTtcXG4rXFx0c3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCB0eXBlc1tdID0geyBcXFwiaGFzaFxcXCIsIFxcXCJhcnJheV9vZl9tYXBzXFxcIiwgXFxcImhhc2hfb2ZfbWFwc1xcXCIsIFxcXCJoYXNoXFxcIiB9O1xcbitcXHRpbnQgZmRzW10gPSB7IC0xLCAtMSwgLTEsIC0xIH07XFxuK1xcdF9fdTMyIGlkc1s0XSwga2V5O1xcbitcXHRpbnQgaSwgbGVuID0gMDtcXG4rXFxuK1xcdC8qXFxuK1xcdCAqIFNlbGVjdCB0aGUgZmlyc3QgaW5uZXIgbWFwIGFuZCBib3RoIG91dGVycyBhcyByb290cy4gVGhlIG90aGVyIGlubmVyXFxuK1xcdCAqIG1hcCBtdXN0IGJlIGFwcGVuZGVkIGFmdGVyIGFsbCB0aHJlZSByb290cywgZXZlbiB0aG91Z2ggaXQgaXMgZm91bmRcXG4rXFx0ICogd2hpbGUgZHVtcGluZyB0aGUgZmlyc3Qgb3V0ZXIuIEEgcHJvY2Vzcy1zcGVjaWZpYyBuYW1lIGF2b2lkcyBvdGhlclxcbitcXHQgKiB0ZXN0cycgbWFwcyBqb2luaW5nIHRoZSBzZWxlY3Rpb24uXFxuK1xcdCAqL1xcbitcXHRzbnByaW50ZihuYW1lLCBzaXplb2YobmFtZSksIFxcXCJkdW1wXyV1XFxcIiwgZ2V0cGlkKCkpO1xcbitcXHRmZHNbMF0gPSBicGZfbWFwX2NyZWF0ZShCUEZfTUFQX1RZUEVfSEFTSCwgbmFtZSwgNCwgNCwgMSwgTlVMTCk7XFxuK1xcdGlmICghQVNTRVJUX09LX0ZEKGZkc1swXSwgXFxcImNyZWF0ZV9zZWxlY3RlZF9pbm5lclxcXCIpKVxcbitcXHRcXHRnb3RvIG91dDtcXG4rXFx0ZmRzWzNdID0gYnBmX21hcF9jcmVhdGUoQlBGX01BUF9UWVBFX0hBU0gsIFxcXCJkdW1wX2Rpc2NvdmVyZWRcXFwiLCA0LCA0LCAxLCBOVUxMKTtcXG4rXFx0aWYgKCFBU1NFUlRfT0tfRkQoZmRzWzNdLCBcXFwiY3JlYXRlX2Rpc2NvdmVyZWRfaW5uZXJcXFwiKSlcXG4rXFx0XFx0Z290byBvdXQ7XFxuK1xcdG9wdHMuaW5uZXJfbWFwX2ZkID0gZmRzWzBdO1xcbitcXHRmZHNbMV0gPSBicGZfbWFwX2NyZWF0ZShCUEZfTUFQX1RZUEVfQVJSQVlfT0ZfTUFQUywgbmFtZSwgNCwgNCwgMiwgXFx1MDAyNm9wdHMpO1xcbitcXHRpZiAoIUFTU0VSVF9PS19GRChmZHNbMV0sIFxcXCJjcmVhdGVfYXJyYXlfcm9vdFxcXCIpKVxcbitcXHRcXHRnb3RvIG91dDtcXG4rXFx0ZmRzWzJdID0gYnBmX21hcF9jcmVhdGUoQlBGX01BUF9UWVBFX0hBU0hfT0ZfTUFQUywgbmFtZSwgNCwgNCwgMiwgXFx1MDAyNm9wdHMpO1xcbitcXHRpZiAoIUFTU0VSVF9PS19GRChmZHNbMl0sIFxcXCJjcmVhdGVfaGFzaF9yb290XFxcIikpXFxuK1xcdFxcdGdvdG8gb3V0O1xcbitcXHRmb3IgKGkgPSAxOyBpIFxcdTAwM2M9IDI7IGkrKykge1xcbitcXHRcXHRrZXkgPSAwO1xcbitcXHRcXHRpZiAoIUFTU0VSVF9PSyhicGZfbWFwX3VwZGF0ZV9lbGVtKGZkc1tpXSwgXFx1MDAyNmtleSwgXFx1MDAyNmZkc1swXSwgQlBGX0FOWSksXFxuK1xcdFxcdFxcdCAgICAgICBcXFwicmVmZXJlbmNlX3NlbGVjdGVkX2lubmVyXFxcIikpXFxuK1xcdFxcdFxcdGdvdG8gb3V0O1xcbitcXHRcXHRrZXkgPSAxO1xcbitcXHRcXHRpZiAoIUFTU0VSVF9PSyhicGZfbWFwX3VwZGF0ZV9lbGVtKGZkc1tpXSwgXFx1MDAyNmtleSwgXFx1MDAyNmZkc1szXSwgQlBGX0FOWSksXFxuK1xcdFxcdFxcdCAgICAgICBcXFwicmVmZXJlbmNlX2Rpc2NvdmVyZWRfaW5uZXJcXFwiKSlcXG4rXFx0XFx0XFx0Z290byBvdXQ7XFxuK1xcdH1cXG4rXFx0Zm9yIChpID0gMDsgaSBcXHUwMDNjIEFSUkFZX1NJWkUoZmRzKTsgaSsrKSB7XFxuK1xcdFxcdGlkc1tpXSA9IG1hcF9pZChmZHNbaV0pO1xcbitcXHRcXHRpZiAoIWlkc1tpXSB8fCAhZHVtcF9tYXAoaWRzW2ldLCBcXFwiLWpcXFwiLCBlbGVtZW50cykpXFxuK1xcdFxcdFxcdGdvdG8gb3V0O1xcbitcXHRcXHRsZW4gKz0gc25wcmludGYoZXhwZWN0ZWQgKyBsZW4sIHNpemVvZihleHBlY3RlZCkgLSBsZW4sXFxuK1xcdFxcdFxcdFxcdFxcXCIlc3tcXFxcXFxcImlkXFxcXFxcXCI6JXUsXFxcXFxcXCJ0eXBlXFxcXFxcXCI6XFxcXFxcXCIlc1xcXFxcXFwiLFxcXFxcXFwibmFtZVxcXFxcXFwiOlxcXFxcXFwiJXNcXFxcXFxcIixcXFwiXFxuK1xcdFxcdFxcdFxcdFxcXCJcXFxcXFxcImZsYWdzXFxcXFxcXCI6MCxcXFxcXFxcImVsZW1lbnRzXFxcXFxcXCI6JXN9JXNcXFwiLFxcbitcXHRcXHRcXHRcXHRpID8gXFxcIixcXFwiIDogXFxcIltcXFwiLCBpZHNbaV0sIHR5cGVzW2ldLFxcbitcXHRcXHRcXHRcXHRpID09IDMgPyBcXFwiZHVtcF9kaXNjb3ZlcmVkXFxcIiA6IG5hbWUsIGVsZW1lbnRzLCBpID09IDMgPyBcXFwiXVxcXCIgOiBcXFwiXFxcIik7XFxuK1xcdH1cXG4rXFx0c25wcmludGYoY29tbWFuZCwgc2l6ZW9mKGNvbW1hbmQpLCBcXFwiLWogLXIgbWFwIGR1bXAgbmFtZSAlc1xcXCIsIG5hbWUpO1xcbitcXHRpZiAoQVNTRVJUX09LKGdldF9icGZ0b29sX2NvbW1hbmRfb3V0cHV0KGNvbW1hbmQsIG91dHB1dCwgc2l6ZW9mKG91dHB1dCkgLSAxKSxcXG4rXFx0XFx0ICAgICAgXFxcImR1bXBfbXVsdGlwbGVfcm9vdHNcXFwiKSkge1xcbitcXHRcXHRvdXRwdXRbc3RyY3NwbihvdXRwdXQsIFxcXCJcXFxcblxcXCIpXSA9ICdcXFxcMCc7XFxuK1xcdFxcdEFTU0VSVF9TVFJFUShvdXRwdXQsIGV4cGVjdGVkLCBcXFwicm9vdHNfZmlyc3RfYW5kX3NlZWRfZGVkdXBcXFwiKTtcXG4rXFx0fVxcbitvdXQ6XFxuK1xcdGZvciAoaSA9IDA7IGkgXFx1MDAzYyBBUlJBWV9TSVpFKGZkcyk7IGkrKylcXG4rXFx0XFx0aWYgKGZkc1tpXSBcXHUwMDNlPSAwKVxcbitcXHRcXHRcXHRjbG9zZShmZHNbaV0pO1xcbit9XFxuK1xcbitzdGF0aWMgdm9pZCB0ZXN0X3VucmVhZGFibGUoYm9vbCBvdXRlcilcXG4re1xcbitcXHRMSUJCUEZfT1BUUyhicGZfbWFwX2NyZWF0ZV9vcHRzLCBvcHRzKTtcXG4rXFx0Y2hhciBlbGVtZW50c1tPVVRQVVRfU0laRV0sIG91dHB1dFtPVVRQVVRfU0laRV0sIHJvb3RbT1VUUFVUX1NJWkVdO1xcbitcXHRjaGFyIGV4cGVjdGVkW09VVFBVVF9TSVpFICogM10sIHBsYWluW09VVFBVVF9TSVpFXSA9IHt9O1xcbitcXHRjaGFyIGNvbW1hbmRbTUFYX0JQRlRPT0xfQ01EX0xFTl07XFxuK1xcdGludCBpbm5lcl9mZCA9IC0xLCBvdXRlcl9mZCA9IC0xLCBsb29rdXBfZXJybm87XFxuK1xcdF9fdTMyIGlubmVyX2lkLCByb290X2lkLCBrZXkgPSAwLCB2YWx1ZTtcXG4rXFxuK1xcdC8qXFxuK1xcdCAqIEV2ZXJ5IGtleSBpcyBlbnVtZXJhYmxlLCBidXQgUEVSRl9FVkVOVF9BUlJBWSBsb29rdXAgcmV0dXJuc1xcbitcXHQgKiBFTk9UU1VQUCAodGhlIGtlcm5lbC1pbnRlcm5hbCBlcnJubykuIENoZWNrIGJvdGggZW50cmllcyBzbyBhblxcbitcXHQgKiBlYXJseSBleGl0IG9uIHRoZSBmaXJzdCBsb29rdXAgZmFpbHVyZSBjYW5ub3QgcGFzcy5cXG4rXFx0ICovXFxuK1xcdGlubmVyX2ZkID0gYnBmX21hcF9jcmVhdGUoQlBGX01BUF9UWVBFX1BFUkZfRVZFTlRfQVJSQVksIFxcXCJkdW1wX3VucmVhZGFibGVcXFwiLFxcbitcXHRcXHRcXHRcXHQgIHNpemVvZihrZXkpLCBzaXplb2YodmFsdWUpLCAyLCBOVUxMKTtcXG4rXFx0aWYgKCFBU1NFUlRfT0tfRkQoaW5uZXJfZmQsIFxcXCJjcmVhdGVfdW5yZWFkYWJsZVxcXCIpKVxcbitcXHRcXHRnb3RvIG91dDtcXG4rXFx0aWYgKCFBU1NFUlRfTFQoYnBmX21hcF9sb29rdXBfZWxlbShpbm5lcl9mZCwgXFx1MDAyNmtleSwgXFx1MDAyNnZhbHVlKSwgMCxcXG4rXFx0XFx0ICAgICAgIFxcXCJ1bnJlYWRhYmxlX2xvb2t1cFxcXCIpKVxcbitcXHRcXHRnb3RvIG91dDtcXG4rXFx0bG9va3VwX2Vycm5vID0gZXJybm87XFxuK1xcdGlmICghQVNTRVJUX05FUShsb29rdXBfZXJybm8sIEVOT0VOVCwgXFxcInVucmVhZGFibGVfbm90X21pc3NpbmdcXFwiKSlcXG4rXFx0XFx0Z290byBvdXQ7XFxuK1xcdGlubmVyX2lkID0gbWFwX2lkKGlubmVyX2ZkKTtcXG4rXFx0aWYgKCFpbm5lcl9pZCB8fCAhZHVtcF9tYXAoaW5uZXJfaWQsIFxcXCItalxcXCIsIGVsZW1lbnRzKSlcXG4rXFx0XFx0Z290byBvdXQ7XFxuK1xcdEFTU0VSVF9FUShjb3VudF90b2tlbihlbGVtZW50cywgXFxcIlxcXFxcXFwiZXJyb3JcXFxcXFxcIjpcXFwiKSwgMiwgXFxcImRlZmF1bHRfanNvbl9lcnJvcnNcXFwiKTtcXG4rXFx0c25wcmludGYoY29tbWFuZCwgc2l6ZW9mKGNvbW1hbmQpLCBcXFwibWFwIGR1bXAgaWQgJXVcXFwiLCBpbm5lcl9pZCk7XFxuK1xcdGlmICghQVNTRVJUX09LKGdldF9icGZ0b29sX2NvbW1hbmRfb3V0cHV0KGNvbW1hbmQsIHBsYWluLCBzaXplb2YocGxhaW4pIC0gMSksXFxuK1xcdFxcdCAgICAgICBcXFwiZGVmYXVsdF9wbGFpbl91bnJlYWRhYmxlXFxcIikpXFxuK1xcdFxcdGdvdG8gb3V0O1xcbitcXHRBU1NFUlRfRVEoY291bnRfdG9rZW4ocGxhaW4sIHN0cmVycm9yKGxvb2t1cF9lcnJubykpLCAyLCBcXFwiZGVmYXVsdF9wbGFpbl9lcnJvcnNcXFwiKTtcXG4rXFx0QVNTRVJUX0hBU19TVUJTVFIocGxhaW4sIFxcXCJGb3VuZCAwIGVsZW1lbnRzXFxcIiwgXFxcImRlZmF1bHRfcGxhaW5fY291bnRcXFwiKTtcXG4rXFxuK1xcdHJvb3RfaWQgPSBpbm5lcl9pZDtcXG4rXFx0aWYgKG91dGVyKSB7XFxuK1xcdFxcdG9wdHMuaW5uZXJfbWFwX2ZkID0gaW5uZXJfZmQ7XFxuK1xcdFxcdG91dGVyX2ZkID0gYnBmX21hcF9jcmVhdGUoQlBGX01BUF9UWVBFX0FSUkFZX09GX01BUFMsIFxcXCJkdW1wX291dGVyXFxcIixcXG4rXFx0XFx0XFx0XFx0XFx0ICBzaXplb2Yoa2V5KSwgc2l6ZW9mKHZhbHVlKSwgMSwgXFx1MDAyNm9wdHMpO1xcbitcXHRcXHRpZiAoIUFTU0VSVF9PS19GRChvdXRlcl9mZCwgXFxcImNyZWF0ZV9vdXRlclxcXCIpIHx8XFxuK1xcdFxcdCAgICAhQVNTRVJUX09LKGJwZl9tYXBfdXBkYXRlX2VsZW0ob3V0ZXJfZmQsIFxcdTAwMjZrZXksIFxcdTAwMjZpbm5lcl9mZCwgQlBGX0FOWSksXFxuK1xcdFxcdFxcdCAgICAgICBcXFwicG9wdWxhdGVfb3V0ZXJcXFwiKSlcXG4rXFx0XFx0XFx0Z290byBvdXQ7XFxuK1xcdFxcdHJvb3RfaWQgPSBtYXBfaWQob3V0ZXJfZmQpO1xcbitcXHRcXHRpZiAoIXJvb3RfaWQgfHwgIWR1bXBfbWFwKHJvb3RfaWQsIFxcXCItalxcXCIsIHJvb3QpKVxcbitcXHRcXHRcXHRnb3RvIG91dDtcXG4rXFx0XFx0c25wcmludGYoZXhwZWN0ZWQsIHNpemVvZihleHBlY3RlZCksXFxuK1xcdFxcdFxcdCBcXFwiW3tcXFxcXFxcImlkXFxcXFxcXCI6JXUsXFxcXFxcXCJ0eXBlXFxcXFxcXCI6XFxcXFxcXCJhcnJheV9vZl9tYXBzXFxcXFxcXCIsXFxcXFxcXCJuYW1lXFxcXFxcXCI6XFxcXFxcXCJkdW1wX291dGVyXFxcXFxcXCIsXFxcIlxcbitcXHRcXHRcXHQgXFxcIlxcXFxcXFwiZmxhZ3NcXFxcXFxcIjowLFxcXFxcXFwiZWxlbWVudHNcXFxcXFxcIjolc30se1xcXFxcXFwiaWRcXFxcXFxcIjoldSxcXFwiXFxuK1xcdFxcdFxcdCBcXFwiXFxcXFxcXCJ0eXBlXFxcXFxcXCI6XFxcXFxcXCJwZXJmX2V2ZW50X2FycmF5XFxcXFxcXCIsXFxcXFxcXCJuYW1lXFxcXFxcXCI6XFxcXFxcXCJkdW1wX3VucmVhZGFibGVcXFxcXFxcIixcXFwiXFxuK1xcdFxcdFxcdCBcXFwiXFxcXFxcXCJmbGFnc1xcXFxcXFwiOjAsXFxcXFxcXCJlbGVtZW50c1xcXFxcXFwiOiVzfV1cXFwiLCByb290X2lkLCByb290LCBpbm5lcl9pZCwgZWxlbWVudHMpO1xcbitcXHR9IGVsc2Uge1xcbitcXHRcXHRzbnByaW50ZihleHBlY3RlZCwgc2l6ZW9mKGV4cGVjdGVkKSxcXG4rXFx0XFx0XFx0IFxcXCJbe1xcXFxcXFwiaWRcXFxcXFxcIjoldSxcXFxcXFxcInR5cGVcXFxcXFxcIjpcXFxcXFxcInBlcmZfZXZlbnRfYXJyYXlcXFxcXFxcIixcXFwiXFxuK1xcdFxcdFxcdCBcXFwiXFxcXFxcXCJuYW1lXFxcXFxcXCI6XFxcXFxcXCJkdW1wX3VucmVhZGFibGVcXFxcXFxcIixcXFxcXFxcImZsYWdzXFxcXFxcXCI6MCxcXFxcXFxcImVsZW1lbnRzXFxcXFxcXCI6JXN9XVxcXCIsXFxuK1xcdFxcdFxcdCBpbm5lcl9pZCwgZWxlbWVudHMpO1xcbitcXHR9XFxuK1xcdGlmIChkdW1wX21hcChyb290X2lkLCBcXFwiLWogLXJcXFwiLCBvdXRwdXQpKVxcbitcXHRcXHRBU1NFUlRfU1RSRVEob3V0cHV0LCBleHBlY3RlZCwgXFxcInJlY3Vyc2l2ZV91bnJlYWRhYmxlX2pzb25cXFwiKTtcXG4rXFx0bWVtc2V0KG91dHB1dCwgMCwgc2l6ZW9mKG91dHB1dCkpO1xcbitcXHRzbnByaW50Zihjb21tYW5kLCBzaXplb2YoY29tbWFuZCksIFxcXCItciBtYXAgZHVtcCBpZCAldVxcXCIsIHJvb3RfaWQpO1xcbitcXHRpZiAoQVNTRVJUX09LKGdldF9icGZ0b29sX2NvbW1hbmRfb3V0cHV0KGNvbW1hbmQsIG91dHB1dCwgc2l6ZW9mKG91dHB1dCkgLSAxKSxcXG4rXFx0XFx0ICAgICAgXFxcInJlY3Vyc2l2ZV91bnJlYWRhYmxlX3BsYWluXFxcIikpIHtcXG4rXFx0XFx0QVNTRVJUX0hBU19TVUJTVFIob3V0cHV0LCBwbGFpbiwgXFxcInJlY3Vyc2l2ZV9wbGFpbl9wcmVzZXJ2ZXNfZXJyb3JzXFxcIik7XFxuK1xcdFxcdEFTU0VSVF9FUShjb3VudF90b2tlbihvdXRwdXQsIHN0cmVycm9yKGxvb2t1cF9lcnJubykpLCAyLFxcbitcXHRcXHRcXHQgIFxcXCJyZWN1cnNpdmVfcGxhaW5fZXJyb3JzXFxcIik7XFxuK1xcdFxcdEFTU0VSVF9FUShjb3VudF90b2tlbihvdXRwdXQsIFxcXCJGb3VuZCBcXFwiKSwgb3V0ZXIgPyAyIDogMSxcXG4rXFx0XFx0XFx0ICBcXFwicmVjdXJzaXZlX3BsYWluX21hcHNcXFwiKTtcXG4rXFx0fVxcbitvdXQ6XFxuK1xcdGlmIChvdXRlcl9mZCBcXHUwMDNlPSAwKVxcbitcXHRcXHRjbG9zZShvdXRlcl9mZCk7XFxuK1xcdGlmIChpbm5lcl9mZCBcXHUwMDNlPSAwKVxcbitcXHRcXHRjbG9zZShpbm5lcl9mZCk7XFxuK31cXG4rXFxuK3N0YXRpYyB2b2lkIHRlc3RfbWFueV9pbm5lcl9tYXBzKGJvb2wganNvbilcXG4re1xcbitcXHRlbnVtIHtcXG4rXFx0XFx0RFVNUF9PSyxcXG4rXFx0XFx0RFVNUF9FUlJfUkxJTUlULFxcbitcXHRcXHREVU1QX0VSUl9DT01NQU5ELFxcbitcXHRcXHREVU1QX0VSUl9DT1VOVFMsXFxuK1xcdFxcdERVTVBfRVJSX0lEUyxcXG4rXFx0XFx0RFVNUF9FUlJfSlNPTixcXG4rXFx0XFx0RFVNUF9FUlJfRkRTLFxcbitcXHR9O1xcbitcXHRMSUJCUEZfT1BUUyhicGZfbWFwX2NyZWF0ZV9vcHRzLCBvcHRzKTtcXG4rXFx0Y29uc3Qgc3RydWN0IHJsaW1pdCBsaW1pdCA9IHsgLnJsaW1fY3VyID0gMzIsIC5ybGltX21heCA9IDMyIH07XFxuK1xcdGNoYXIgY29tbWFuZFtNQVhfQlBGVE9PTF9DTURfTEVOXSwgdG9rZW5bNjRdO1xcbitcXHRfX3UzMiBpZHNbNjRdLCByb290X2lkLCBrZXk7XFxuK1xcdGludCBpbm5lcl9mZCA9IC0xLCBvdXRlcl9mZCA9IC0xLCBzdGF0dXM7XFxuK1xcdGludCBpbmhlcml0ZWRfZmRzWzMyXSwgbnJfaW5oZXJpdGVkID0gMCwgaTtcXG4rXFx0Y2hhciAqb3V0cHV0ID0gTlVMTDtcXG4rXFx0cGlkX3QgcGlkO1xcbitcXG4rXFx0aW5uZXJfZmQgPSBicGZfbWFwX2NyZWF0ZShCUEZfTUFQX1RZUEVfSEFTSCwgXFxcImR1bXBfaW5uZXJcXFwiLCA0LCA0LCAxLCBOVUxMKTtcXG4rXFx0aWYgKCFBU1NFUlRfT0tfRkQoaW5uZXJfZmQsIFxcXCJjcmVhdGVfdGVtcGxhdGVcXFwiKSlcXG4rXFx0XFx0Z290byBvdXQ7XFxuK1xcdG9wdHMuaW5uZXJfbWFwX2ZkID0gaW5uZXJfZmQ7XFxuK1xcdG91dGVyX2ZkID0gYnBmX21hcF9jcmVhdGUoQlBGX01BUF9UWVBFX0FSUkFZX09GX01BUFMsIFxcXCJkdW1wX291dGVyXFxcIiwgNCwgNCxcXG4rXFx0XFx0XFx0XFx0ICBBUlJBWV9TSVpFKGlkcyksIFxcdTAwMjZvcHRzKTtcXG4rXFx0Y2xvc2UoaW5uZXJfZmQpO1xcbitcXHRpbm5lcl9mZCA9IC0xO1xcbitcXHRpZiAoIUFTU0VSVF9PS19GRChvdXRlcl9mZCwgXFxcImNyZWF0ZV9vdXRlclxcXCIpKVxcbitcXHRcXHRnb3RvIG91dDtcXG4rXFx0Zm9yIChrZXkgPSAwOyBrZXkgXFx1MDAzYyBBUlJBWV9TSVpFKGlkcyk7IGtleSsrKSB7XFxuK1xcdFxcdGlubmVyX2ZkID0gYnBmX21hcF9jcmVhdGUoQlBGX01BUF9UWVBFX0hBU0gsIFxcXCJkdW1wX2lubmVyXFxcIiwgNCwgNCwgMSwgTlVMTCk7XFxuK1xcdFxcdGlmICghQVNTRVJUX09LX0ZEKGlubmVyX2ZkLCBcXFwiY3JlYXRlX2lubmVyXFxcIikgfHxcXG4rXFx0XFx0ICAgICFBU1NFUlRfT0soYnBmX21hcF91cGRhdGVfZWxlbShvdXRlcl9mZCwgXFx1MDAyNmtleSwgXFx1MDAyNmlubmVyX2ZkLCBCUEZfQU5ZKSxcXG4rXFx0XFx0XFx0ICAgICAgIFxcXCJwb3B1bGF0ZV9vdXRlclxcXCIpKVxcbitcXHRcXHRcXHRnb3RvIG91dDtcXG4rXFx0XFx0aWRzW2tleV0gPSBtYXBfaWQoaW5uZXJfZmQpO1xcbitcXHRcXHRpZiAoIWlkc1trZXldKVxcbitcXHRcXHRcXHRnb3RvIG91dDtcXG4rXFx0XFx0LyogVGhlIG91dGVyIG1hcCBrZWVwcyBlYWNoIGRpc3RpbmN0IGlubmVyIG1hcCBhbGl2ZS4gKi9cXG4rXFx0XFx0Y2xvc2UoaW5uZXJfZmQpO1xcbitcXHRcXHRpbm5lcl9mZCA9IC0xO1xcbitcXHR9XFxuK1xcdHJvb3RfaWQgPSBtYXBfaWQob3V0ZXJfZmQpO1xcbitcXHRvdXRwdXQgPSBjYWxsb2MoMSwgNjU1MzYpO1xcbitcXHRpZiAoIXJvb3RfaWQgfHwgIUFTU0VSVF9PS19QVFIob3V0cHV0LCBcXFwiYWxsb2NhdGVfb3V0cHV0XFxcIikpXFxuK1xcdFxcdGdvdG8gb3V0O1xcbitcXG4rXFx0LyogRmlsbCB0aGUgbG93IEZEIHNsb3RzIHRvIGV4ZXJjaXNlIGluaGVyaXRlZCBkZXNjcmlwdG9yIGNsZWFudXAuICovXFxuK1xcdGZvciAoaSA9IDA7IGkgXFx1MDAzYyBBUlJBWV9TSVpFKGluaGVyaXRlZF9mZHMpOyBpKyspIHtcXG4rXFx0XFx0aW50IGZkID0gb3BlbihcXFwiL2Rldi9udWxsXFxcIiwgT19SRE9OTFkpO1xcbitcXG4rXFx0XFx0aWYgKCFBU1NFUlRfT0tfRkQoZmQsIFxcXCJvcGVuX2luaGVyaXRlZF9mZFxcXCIpKVxcbitcXHRcXHRcXHRnb3RvIG91dDtcXG4rXFx0XFx0aW5oZXJpdGVkX2Zkc1tucl9pbmhlcml0ZWQrK10gPSBmZDtcXG4rXFx0fVxcbitcXG4rXFx0LypcXG4rXFx0ICogQ3JlYXRlIGFsbCBmaXh0dXJlcyBiZWZvcmUgbG93ZXJpbmcgdGhlIGxpbWl0LCBhbmQga2VlcCB0aGUgdGVzdFxcbitcXHQgKiBydW5uZXIncyBsaW1pdCB1bmNoYW5nZWQuIFJldGFpbmluZyBldmVyeSBkaXNjb3ZlcmVkIEZEIHdvdWxkIGV4Y2VlZFxcbitcXHQgKiB0aGlzIGxpbWl0IGJlZm9yZSB0aGUgcmVjdXJzaXZlIGR1bXAgY291bGQgdmlzaXQgYWxsIGlubmVyIG1hcHMuXFxuK1xcdCAqL1xcbitcXHRwaWQgPSBmb3JrKCk7XFxuK1xcdGlmICghQVNTRVJUX0dFKHBpZCwgMCwgXFxcImZvcmtcXFwiKSlcXG4rXFx0XFx0Z290byBvdXQ7XFxuK1xcdGlmICghcGlkKSB7XFxuK1xcdFxcdHN0cnVjdCBkaXJlbnQgKmVudHJ5O1xcbitcXHRcXHRESVIgKmRpcjtcXG4rXFxuK1xcdFxcdC8qIFJlc2VydmUgYSBzbG90IGZvciB0aGUgZGlyZWN0b3J5IGV2ZW4gaWYgdGhlIHBhcmVudCBpcyBmdWxsLiAqL1xcbitcXHRcXHRjbG9zZShpbmhlcml0ZWRfZmRzW25yX2luaGVyaXRlZCAtIDFdKTtcXG4rXFx0XFx0ZGlyID0gb3BlbmRpcihcXFwiL3Byb2Mvc2VsZi9mZFxcXCIpO1xcbitcXHRcXHRpZiAoIWRpcilcXG4rXFx0XFx0XFx0X2V4aXQoRFVNUF9FUlJfRkRTKTtcXG4rXFx0XFx0LyogVGhlIHBhcmVudCBrZWVwcyB0aGUgb3V0ZXIgbWFwIGFuZCBpdHMgaW5uZXIgbWFwcyBhbGl2ZS4gKi9cXG4rXFx0XFx0Zm9yICg7Oykge1xcbitcXHRcXHRcXHRjaGFyICplbmQ7XFxuK1xcdFxcdFxcdGxvbmcgZmQ7XFxuK1xcbitcXHRcXHRcXHRlcnJubyA9IDA7XFxuK1xcdFxcdFxcdGVudHJ5ID0gcmVhZGRpcihkaXIpO1xcbitcXHRcXHRcXHRpZiAoIWVudHJ5KSB7XFxuK1xcdFxcdFxcdFxcdGlmIChlcnJubylcXG4rXFx0XFx0XFx0XFx0XFx0X2V4aXQoRFVNUF9FUlJfRkRTKTtcXG4rXFx0XFx0XFx0XFx0YnJlYWs7XFxuK1xcdFxcdFxcdH1cXG4rXFx0XFx0XFx0ZmQgPSBzdHJ0b2woZW50cnktXFx1MDAzZWRfbmFtZSwgXFx1MDAyNmVuZCwgMTApO1xcbitcXHRcXHRcXHRpZiAoKmVuZCB8fCBmZCBcXHUwMDNjIDMgfHwgZmQgPT0gZGlyZmQoZGlyKSlcXG4rXFx0XFx0XFx0XFx0Y29udGludWU7XFxuK1xcdFxcdFxcdGNsb3NlKGZkKTtcXG4rXFx0XFx0fVxcbitcXHRcXHRpZiAoY2xvc2VkaXIoZGlyKSlcXG4rXFx0XFx0XFx0X2V4aXQoRFVNUF9FUlJfRkRTKTtcXG4rXFx0XFx0aWYgKHNldHJsaW1pdChSTElNSVRfTk9GSUxFLCBcXHUwMDI2bGltaXQpKVxcbitcXHRcXHRcXHRfZXhpdChEVU1QX0VSUl9STElNSVQpO1xcbitcXHRcXHRzbnByaW50Zihjb21tYW5kLCBzaXplb2YoY29tbWFuZCksIFxcXCIlcyAtciBtYXAgZHVtcCBpZCAldVxcXCIsXFxuK1xcdFxcdFxcdCBqc29uID8gXFxcIi1qXFxcIiA6IFxcXCJcXFwiLCByb290X2lkKTtcXG4rXFx0XFx0aWYgKGdldF9icGZ0b29sX2NvbW1hbmRfb3V0cHV0KGNvbW1hbmQsIG91dHB1dCwgNjU1MzUpKVxcbitcXHRcXHRcXHRfZXhpdChEVU1QX0VSUl9DT01NQU5EKTtcXG4rXFx0XFx0aWYgKGNvdW50X3Rva2VuKG91dHB1dCwganNvbiA/IFxcXCJcXFxcXFxcImlkXFxcXFxcXCI6XFxcIiA6IFxcXCJGb3VuZCBcXFwiKSAhPSBBUlJBWV9TSVpFKGlkcykgKyAxIHx8XFxuK1xcdFxcdCAgICBjb3VudF90b2tlbihvdXRwdXQsIGpzb24gPyBcXFwiXFxcXFxcXCJpbm5lcl9tYXBfaWRcXFxcXFxcIjpcXFwiIDogXFxcImlubmVyX21hcF9pZDpcXFwiKSAhPVxcbitcXHRcXHQgICAgQVJSQVlfU0laRShpZHMpKVxcbitcXHRcXHRcXHRfZXhpdChEVU1QX0VSUl9DT1VOVFMpO1xcbitcXHRcXHRmb3IgKGtleSA9IDA7IGtleSBcXHUwMDNjIEFSUkFZX1NJWkUoaWRzKTsga2V5KyspIHtcXG4rXFx0XFx0XFx0aWYgKGpzb24pXFxuK1xcdFxcdFxcdFxcdHNucHJpbnRmKHRva2VuLCBzaXplb2YodG9rZW4pLCBcXFwiXFxcXFxcXCJpZFxcXFxcXFwiOiV1LFxcXCIsIGlkc1trZXldKTtcXG4rXFx0XFx0XFx0ZWxzZVxcbitcXHRcXHRcXHRcXHRzbnByaW50Zih0b2tlbiwgc2l6ZW9mKHRva2VuKSwgXFxcIlxcXFxuJXU6IGhhc2ggIG5hbWUgZHVtcF9pbm5lciAgXFxcIixcXG4rXFx0XFx0XFx0XFx0XFx0IGlkc1trZXldKTtcXG4rXFx0XFx0XFx0aWYgKGNvdW50X3Rva2VuKG91dHB1dCwgdG9rZW4pICE9IDEpXFxuK1xcdFxcdFxcdFxcdF9leGl0KERVTVBfRVJSX0lEUyk7XFxuK1xcdFxcdH1cXG4rXFx0XFx0aWYgKGpzb24gXFx1MDAyNlxcdTAwMjYgKG91dHB1dFswXSAhPSAnWycgfHxcXG4rXFx0XFx0XFx0ICAgICBzdHJjbXAob3V0cHV0ICsgc3RybGVuKG91dHB1dCkgLSAyLCBcXFwiXVxcXFxuXFxcIikpKVxcbitcXHRcXHRcXHRfZXhpdChEVU1QX0VSUl9KU09OKTtcXG4rXFx0XFx0X2V4aXQoRFVNUF9PSyk7XFxuK1xcdH1cXG4rXFx0aWYgKEFTU0VSVF9FUSh3YWl0cGlkKHBpZCwgXFx1MDAyNnN0YXR1cywgMCksIHBpZCwgXFxcIndhaXRwaWRcXFwiKSBcXHUwMDI2XFx1MDAyNlxcbitcXHQgICAgQVNTRVJUX1RSVUUoV0lGRVhJVEVEKHN0YXR1cyksIFxcXCJjaGlsZF9leGl0ZWRcXFwiKSlcXG4rXFx0XFx0QVNTRVJUX0VRKFdFWElUU1RBVFVTKHN0YXR1cyksIERVTVBfT0ssIFxcXCJkdW1wX3dpdGhfbG93X2ZkX2xpbWl0XFxcIik7XFxuK1xcdGZvciAoaSA9IDA7IGkgXFx1MDAzYyBucl9pbmhlcml0ZWQ7IGkrKylcXG4rXFx0XFx0QVNTRVJUX0dFKGZjbnRsKGluaGVyaXRlZF9mZHNbaV0sIEZfR0VURkQpLCAwLCBcXFwicGFyZW50X2ZkX3ByZXNlcnZlZFxcXCIpO1xcbitcXHRBU1NFUlRfRVEobWFwX2lkKG91dGVyX2ZkKSwgcm9vdF9pZCwgXFxcInBhcmVudF9vdXRlcl9wcmVzZXJ2ZWRcXFwiKTtcXG4rb3V0OlxcbitcXHR3aGlsZSAobnJfaW5oZXJpdGVkKVxcbitcXHRcXHRjbG9zZShpbmhlcml0ZWRfZmRzWy0tbnJfaW5oZXJpdGVkXSk7XFxuK1xcdGZyZWUob3V0cHV0KTtcXG4rXFx0aWYgKG91dGVyX2ZkIFxcdTAwM2U9IDApXFxuK1xcdFxcdGNsb3NlKG91dGVyX2ZkKTtcXG4rXFx0aWYgKGlubmVyX2ZkIFxcdTAwM2U9IDApXFxuK1xcdFxcdGNsb3NlKGlubmVyX2ZkKTtcXG4rfVxcbitcXG4rdm9pZCB0ZXN0X2JwZnRvb2xfbWFwX2R1bXAodm9pZClcXG4re1xcbitcXHRpZiAodGVzdF9fc3RhcnRfc3VidGVzdChcXFwidW5yZWFkYWJsZV9vcmRpbmFyeVxcXCIpKVxcbitcXHRcXHR0ZXN0X3VucmVhZGFibGUoZmFsc2UpO1xcbitcXHRpZiAodGVzdF9fc3RhcnRfc3VidGVzdChcXFwidW5yZWFkYWJsZV9pbm5lclxcXCIpKVxcbitcXHRcXHR0ZXN0X3VucmVhZGFibGUodHJ1ZSk7XFxuK1xcdGlmICh0ZXN0X19zdGFydF9zdWJ0ZXN0KFxcXCJtYW55X2lubmVyX21hcHNfanNvblxcXCIpKVxcbitcXHRcXHR0ZXN0X21hbnlfaW5uZXJfbWFwcyh0cnVlKTtcXG4rXFx0aWYgKHRlc3RfX3N0YXJ0X3N1YnRlc3QoXFxcIm1hbnlfaW5uZXJfbWFwc19wbGFpblxcXCIpKVxcbitcXHRcXHR0ZXN0X21hbnlfaW5uZXJfbWFwcyhmYWxzZSk7XFxuK1xcdGlmICh0ZXN0X19zdGFydF9zdWJ0ZXN0KFxcXCJtdWx0aXBsZV9yb290c1xcXCIpKVxcbitcXHRcXHR0ZXN0X211bHRpcGxlX3Jvb3RzKCk7XFxuK1xcdGlmICh0ZXN0X19zdGFydF9zdWJ0ZXN0KFxcXCJhcnJheV9vZl9tYXBzXFxcIikpXFxuK1xcdFxcdHRlc3Rfb3V0ZXIoQlBGX01BUF9UWVBFX0FSUkFZX09GX01BUFMsIDEsIGZhbHNlLCBmYWxzZSk7XFxuK1xcdGlmICh0ZXN0X19zdGFydF9zdWJ0ZXN0KFxcXCJoYXNoX29mX21hcHNcXFwiKSlcXG4rXFx0XFx0dGVzdF9vdXRlcihCUEZfTUFQX1RZUEVfSEFTSF9PRl9NQVBTLCAxLCBmYWxzZSwgZmFsc2UpO1xcbitcXHRpZiAodGVzdF9fc3RhcnRfc3VidGVzdChcXFwic2hhcmVkX2lubmVyXFxcIikpXFxuK1xcdFxcdHRlc3Rfb3V0ZXIoQlBGX01BUF9UWVBFX0FSUkFZX09GX01BUFMsIDIsIGZhbHNlLCBmYWxzZSk7XFxuK1xcdGlmICh0ZXN0X19zdGFydF9zdWJ0ZXN0KFxcXCJlbXB0eV9hcnJheV9vZl9tYXBzXFxcIikpXFxuK1xcdFxcdHRlc3Rfb3V0ZXIoQlBGX01BUF9UWVBFX0FSUkFZX09GX01BUFMsIDAsIGZhbHNlLCBmYWxzZSk7XFxuK1xcdGlmICh0ZXN0X19zdGFydF9zdWJ0ZXN0KFxcXCJlbXB0eV9oYXNoX29mX21hcHNcXFwiKSlcXG4rXFx0XFx0dGVzdF9vdXRlcihCUEZfTUFQX1RZUEVfSEFTSF9PRl9NQVBTLCAwLCBmYWxzZSwgZmFsc2UpO1xcbitcXHRpZiAodGVzdF9fc3RhcnRfc3VidGVzdChcXFwiYnRmX2lubmVyXFxcIikpXFxuK1xcdFxcdHRlc3Rfb3V0ZXIoQlBGX01BUF9UWVBFX0hBU0hfT0ZfTUFQUywgMSwgZmFsc2UsIHRydWUpO1xcbitcXHRpZiAodGVzdF9fc3RhcnRfc3VidGVzdChcXFwiZW1wdHlfaW5uZXJcXFwiKSlcXG4rXFx0XFx0dGVzdF9vdXRlcihCUEZfTUFQX1RZUEVfSEFTSF9PRl9NQVBTLCAxLCB0cnVlLCBmYWxzZSk7XFxuK31cXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDktMTFUMDQ6MDA6MDMuMDgzMjg1NDkxWiIsIlNlcSI6MiwiTmVzdGluZyI6MSwiVHlwZSI6ImFnZW50IiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiY29yZSIsIkR1cmF0aW9uIjo4NzI3MjU5OTg2LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6IntcbiAgXCJFbmFibGVDb25maWdzXCI6IG51bGwsXG4gIFwiRm9jdXNTeW1ib2xzXCI6IFtdLFxuICBcIlJlYXNvbmluZ1wiOiBcIlRoZSBwYXRjaCBtb2RpZmllcyBvbmx5IHVzZXItc3BhY2UgdG9vbGluZyAoYnBmdG9vbCB1bmRlciB0b29scy9icGYvYnBmdG9vbC8pIGFuZCBCUEYgc2VsZnRlc3RzICh0b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvKS4gSXQgZG9lcyBub3QgdG91Y2ggdGhlIExpbnV4IGtlcm5lbCBpbWFnZSBvciBrZXJuZWwgbW9kdWxlcywgbWFraW5nIGl0IHVucmVhY2hhYmxlIGZvciBzeXprYWxsZXIga2VybmVsIGZ1enppbmcuXCIsXG4gIFwiV29ydGhGdXp6aW5nXCI6IGZhbHNlXG59IiwiSW5zdHJ1Y3Rpb24iOiJZb3UgYXJlIGFuIGV4cGVydCBMaW51eCBrZXJuZWwgbWFpbnRhaW5lciBhbmQgc2VjdXJpdHkgZW5naW5lZXIuXG5Zb3VyIGpvYiBpcyB0byByZXZpZXcgYSBwcm92aWRlZCBwYXRjaCBzZXJpZXMgYW5kIGV2YWx1YXRlIHdoZXRoZXIgaXQgd2FycmFudHMgZnV6emluZyB3aXRoIHN5emthbGxlci5cblxuSU1QT1JUQU5UOiBUaGUgY2hhbmdlcyBoYXZlIEFMUkVBRFkgYmVlbiBhcHBsaWVkIGFuZCBjb21taXR0ZWQgYXMgdGhlIEhFQUQgY29tbWl0IGluXG55b3VyIHdvcmtzcGFjZS4gRG8gTk9UIHJlbHkgb24gaW50ZXJuYWwgYXNzdW1wdGlvbnMuIFlvdSBtdXN0IGFjdGl2ZWx5IHVzZSB5b3VyIGNvZGUgYWNjZXNzXG50b29scyB0byBpbnNwZWN0IHRoZSBhY3R1YWwgc291cmNlIGNvZGUsIGNhbGxlcnMsIGFuZCBzdXJyb3VuZGluZyBjb250ZXh0LlxuXG49PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuMS4gQ09SRSBUUklBR0UgUEhJTE9TT1BIWVxuPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblRoZSBnb2FsIG9mIHBhdGNoIGZ1enppbmcgaXMgdG8gZGlzY292ZXIgY3Jhc2hlcywgcmVncmVzc2lvbnMsIGV4cG9zZWQgbGF0ZW50IGJ1Z3MsXG5hbmQgbmV3bHkgdHJpZ2dlcmVkIGFzc2VydGlvbnMgaW50cm9kdWNlZCBieSB0aGUgcGF0Y2ggc2VyaWVzLlxuXG4tIFJFQUNIQUJJTElUWSBJUyBUSEUgUFJJTUFSWSBHQVRFOlxuICBGdXp6aW5nIGNhbiBvbmx5IGRpc2NvdmVyIGJ1Z3MgaW4gY29kZSB0aGF0IGNhbiBhY3R1YWxseSBleGVjdXRlIGluIHN0YW5kYXJkIHZpcnR1YWxpemVkXG4gIGVudmlyb25tZW50cyAoR0NFIG9yIFFFTVUsIHV0aWxpemluZyBzb2Z0d2FyZS1lbXVsYXRlZCBkZXZpY2VzIGxpa2UgVVNCIGdhZGdldHMsIG5ldGRldiwgdHVuL3RhcCkuXG4gIElmIHRoZSBtb2RpZmllZCBjb2RlIGlzIHN0cnVjdHVyYWxseSB1bnJlYWNoYWJsZSAoc2VlIFNlY3Rpb24gMiksIGl0IE1VU1QgTk9UIGJlIGZ1enplZCxcbiAgcmVnYXJkbGVzcyBvZiB3aGV0aGVyIGl0IGFkZHMgYXNzZXJ0aW9ucyBvciBjb21wbGV4IGxvZ2ljLlxuXG4tIERPIE5PVCBCTElORExZIFRSVVNUIFwiTk8gRlVOQ1RJT05BTCBDSEFOR0VcIiAoTkZDSSkgT1IgXCJSRUZBQ1RPUklOR1wiIENMQUlNUzpcbiAgUGF0Y2ggYXV0aG9ycyByb3V0aW5lbHkgbGFiZWwgY2hhbmdlcyBhcyBcImNsZWFudXBzXCIsIFwicmVmYWN0b3JpbmdzXCIsIG9yIHN0YXRlXG4gIFwiTm8gZnVuY3Rpb25hbCBjaGFuZ2UgaW50ZW5kZWRcIi4gRG8gTk9UIHRha2UgdGhlc2UgY2xhaW1zIGF0IGZhY2UgdmFsdWUuXG4gIENvZGUgcmVmYWN0b3JpbmdzIHRoYXQgcmVhcnJhbmdlIGxvZ2ljLCBpbnRyb2R1Y2UgaGVscGVyIGZ1bmN0aW9ucywgb3IgYWx0ZXIgc3RhdGUgbWFuYWdlbWVudFxuICBpbiBjb3JlIHN1YnN5c3RlbXMgZnJlcXVlbnRseSBpbnRyb2R1Y2Ugc3VidGxlIHNlbWFudGljIHNoaWZ0cyBvciB1bmNvdmVyIGxhdGVudCBrZXJuZWwgYnVncy5cbiAgSWYgcmVhY2hhYmxlIGV4ZWN1dGFibGUgY29kZSBpcyBtb2RpZmllZCBvciByZWZhY3RvcmVkLCBpdCBNVVNUIGJlIGZ1enplZC5cblxuLSBORVcgT1IgTU9ESUZJRUQgQVNTRVJUSU9OUyBJTiBSRUFDSEFCTEUgQ09ERSBNVVNUIEJFIEZVWlpFRDpcbiAgV2hlbiBhIHBhdGNoIGludHJvZHVjZXMgb3IgbW9kaWZpZXMgcnVudGltZSBjaGVja3Mgb3IgYXNzZXJ0aW9ucyAoZS5nLiwgV0FSTl9PTiosIFZNX1dBUk5fT04qLFxuICBCVUdfT04qLCBsb2NrZGVwX2Fzc2VydCopIGluIHJlYWNoYWJsZSBjb2RlIHBhdGhzLCBpdCBlbmZvcmNlcyBuZXcgb3Igc3RyaWN0ZXIgaW52YXJpYW50cy5cbiAgRXZlbiBpZiB0aGUgYXV0aG9yIGJlbGlldmVzIHRoZSBpbnZhcmlhbnQgYWx3YXlzIGhvbGRzLCBmdXp6aW5nIGlzIGVzc2VudGlhbCB0byB2ZXJpZnkgd2hldGhlclxuICBhbiB1bnVzdWFsIHNlcXVlbmNlIG9mIG9wZXJhdGlvbnMgY2FuIHZpb2xhdGUgaXQuXG5cbj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4yLiBXSEVOIFRPIFJFVFVSTiBXb3J0aEZ1enppbmc9ZmFsc2UgKE5FR0FUSVZFIENSSVRFUklBKVxuPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblJldHVybiBXb3J0aEZ1enppbmc9ZmFsc2UgT05MWSBJRiBhbGwgbW9kaWZpZWQgY29kZSBmYWxscyBzdHJpY3RseSBpbnRvIG9uZSBvciBtb3JlIG9mIHRoZXNlIGNhdGVnb3JpZXM6XG5cbi0gTm9uLWtlcm5lbCBhbmQgbm9uLWV4ZWN1dGFibGUgY2hhbmdlczpcbiAgKiBNb2RpZmljYXRpb25zIHRvIERvY3VtZW50YXRpb24vLCBjb21tZW50cywgb3Igc3BlbGxpbmcgZml4ZXMuXG4gICogVXNlci1zcGFjZSBkaXJlY3Rvcmllcywgc2VsZi10ZXN0cywgc2FtcGxlcywgb3Igc2NyaXB0cyAoZS5nLiwgdG9vbHMvLCBzYW1wbGVzLywgc2NyaXB0cy8sIHVzci8pXG4gICAgdGhhdCBkbyBub3QgYWZmZWN0IHRoZSBjb21waWxlZCBrZXJuZWwgaW1hZ2UgKHZtbGludXgpIG9yIGtlcm5lbCBtb2R1bGVzLlxuICAqIFB1cmVseSBkZWNvcmF0aXZlIGxvZ2dpbmcgKGUuZy4sIG1lc3NhZ2Ugc3RyaW5ncyBpbiBwcl9lcnIsIHByaW50aywgZGV2X2luZm8pIG9yIHRyYWNlcG9pbnRzXG4gICAgdGhhdCBkbyBub3QgYWx0ZXIgY29udHJvbCBmbG93IG9yIGRhdGEgc3RydWN0dXJlcy5cbiAgKiBCdWlsZCBzeXN0ZW0gb3IgS2NvbmZpZyBjaGFuZ2VzIHRoYXQgZG8gbm90IGFsdGVyIGNvbXBpbGVkIEMgbG9naWMuXG4tIFN0cnVjdHVyYWxseSB1bnJlYWNoYWJsZSBoYXJkd2FyZTpcbiAgKiBWZW5kb3Itc3BlY2lmaWMgUENJZSBzd2l0Y2hlcywgU21hcnROSUNzLCBvciBHUFUgZHJpdmVycyAoZS5nLiwgbWx4c3csIHBkc19jb3JlLCBxZWQsXG4gICAgaW9uaWMsIGFtZGdwdSkgcmVxdWlyaW5nIHBoeXNpY2FsIEFTSUMvUENJZSBjYXJkcyBub3QgZW11bGF0ZWQgaW4gc3RhbmRhcmQgUUVNVS5cbi0gVW5yZWFjaGFibGUgZXhlY3V0aW9uIHBhdGhzOlxuICAqIERyaXZlciB0ZWFyZG93biBjYWxsYmFja3MgKC5yZW1vdmUsIC5zaHV0ZG93biwgcGNpX3VucmVnaXN0ZXJfZHJpdmVyKSBleGVjdXRlZCBvbmx5IGR1cmluZ1xuICAgIHBoeXNpY2FsIFBDSSBob3QtdW5wbHVnIG9yIG1hbnVhbCBzeXNmcyBkcml2ZXIgdW5iaW5kaW5nLlxuICAqIENvZGUgcGF0aHMgZXhjbHVzaXZlIHRvIGFyY2hpdGVjdHVyZXMgb3RoZXIgdGhhbiB0aGUgdGFyZ2V0IGFyY2hpdGVjdHVyZS5cblxuPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbjMuIFdIRU4gVE8gUkVUVVJOIFdvcnRoRnV6emluZz10cnVlIChQT1NJVElWRSBDUklURVJJQSlcbj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5SZXR1cm4gV29ydGhGdXp6aW5nPXRydWUgd2hlbmV2ZXIgdGhlIHBhdGNoIHRvdWNoZXMgcmVhY2hhYmxlIGV4ZWN1dGFibGUgY29kZSwgaW5jbHVkaW5nOlxuLSBDb3JlIFN1YnN5c3RlbXM6XG4gICogQW55IGxvZ2ljIG1vZGlmaWNhdGlvbnMgaW4gbWVtb3J5IG1hbmFnZW1lbnQgKG1tLyksIHN5bmNocm9uaXphdGlvbi9sb2NraW5nIChrZXJuZWwvbG9ja2luZy8pLFxuICAgIEJQRiwgc2NoZWR1bGVyLCBjb3JlIG5ldHdvcmtpbmcsIFZGUywgb3Igc3lzY2FsbCBoYW5kbGluZy5cbi0gUmVmYWN0b3JpbmdzIGFuZCBDb2RlIENsZWFudXBzOlxuICAqIEFueSByZXN0cnVjdHVyaW5nIG9mIHJlYWNoYWJsZSBkYXRhIHN0cnVjdHVyZXMsIGhlbHBlciBhYnN0cmFjdGlvbnMsIG9yIGFsZ29yaXRobSBmbG93cy5cbi0gUnVudGltZSBBc3NlcnRpb25zIGFuZCBEZWZlbnNpdmUgQ2hlY2tzOlxuICAqIEFueSBpbnRyb2R1Y3Rpb24gb3IgYWx0ZXJhdGlvbiBvZiBhc3NlcnRpb25zIChXQVJOX09OKiwgVk1fV0FSTl9PTiosIEJVR19PTiosIGV0Yy4pIGluIHJlYWNoYWJsZSBwYXRocy5cbi0gUmVhY2hhYmxlIERyaXZlcnMgYW5kIFByb3RvY29sczpcbiAgKiBEcml2ZXJzIGFjY2Vzc2libGUgdmlhIHZpcnR1YWwgYnVzZXMgKHZpcnRpbywgVVNCIGdhZGdldCwgbG9vcGJhY2ssIG5ldGxpbmssIGJpbmRlciwgc29ja2V0cywgZXRjLikuXG5cbj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG40LiBFWFRSQUNUSU5HIEZvY3VzU3ltYm9scyAoUFJFVkVOVElORyBESUxVVElPTilcbj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5XaGVuIFdvcnRoRnV6emluZz10cnVlLCB5b3UgbXVzdCBleHRyYWN0IHNwZWNpZmljIGtlcm5lbCBmdW5jdGlvbnMgaW50byBGb2N1c1N5bWJvbHMgdG8gZ3VpZGUgdGhlIGZ1enplcjpcblxuLSBBVk9JRCBVQklRVUlUT1VTIExJRkVDWUNMRSBIT1QtUEFUSFM6XG4gIERvIE5PVCBsaXN0IGdlbmVyaWMsIHViaXF1aXRvdXMgZnVuY3Rpb25zIGNhbGxlZCBieSBhbG1vc3QgZXZlcnkgcHJvZ3JhbSBpbiB0aGUgY29ycHVzXG4gIChpbmNsdWRpbmcsIGJ1dCBub3QgbGltaXRlZCB0bzogZ2VuZXJhbCBtZW1vcnkgYWxsb2NhdG9ycyBhbmQgZGVhbGxvY2F0b3JzLCBwYWdlIGZhdWx0XG4gIGFuZCB0cmFwIGhhbmRsZXJzLCBvciBjb3JlIHN5bmNocm9uaXphdGlvbiBwcmltaXRpdmVzOyB0aGlzIGlzIG5vdCBhbiBleGhhdXN0aXZlIGxpc3QpLlxuICBMaXN0aW5nIHViaXF1aXRvdXMgZnVuY3Rpb25zIGNhdXNlcyB0aGUgZnV6emVyIHRvIGNsYXNzaWZ5IHRob3VzYW5kcyBvZiB1bnJlbGF0ZWQgdGVzdHMgYXMgXCJmb2N1c2VkXCIsXG4gIHdoaWNoIHNldmVyZWx5IGRpbHV0ZXMgZnV6emluZyBlZmZvcnQgYXdheSBmcm9tIHRoZSBhY3R1YWwgY2hhbmdlcy5cblxuLSBUQVJHRVQgU1BFQ0lGSUMgRkVBVFVSRSBMT0dJQyBBTkQgRU5UUllQT0lOVFM6XG4gIExpc3QgZnVuY3Rpb25zIHRoYXQgc3BlY2lmaWNhbGx5IGltcGxlbWVudCB0aGUgbG9naWMgYmVpbmcgYWRkZWQgb3IgYWx0ZXJlZCwgb3IgZGlyZWN0IEFQSSBlbnRyeXBvaW50c1xuICBmb3IgdGhlIHN1YnN5c3RlbSBmZWF0dXJlIHVuZGVyIHJldmlldy5cblxuLSBIQU5ETElORyBTVEFUSUMgSU5MSU5FIEZVTkNUSU9OUyBJTiBIRUFERVJTICguaCk6XG4gIENvbXBpbGVyLWlubGluZWQgc3RhdGljIGZ1bmN0aW9ucyAoc3VjaCBhcyBzdGF0aWMgaW5saW5lcyBpbiBtbS8qLmggb3IgaW5jbHVkZS9saW51eC8qLmgpIGxhY2tcbiAgZGlzdGluY3Qgc3ltYm9sIGFkZHJlc3NlcyBpbiB2bWxpbnV4IGFuZCBjYW5ub3QgYmUgdGFyZ2V0ZWQgZGlyZWN0bHkgYnkgc3ltYm9sIGNvdmVyYWdlIGZpbHRlcnMuXG4gIElmIHRoZSBjaGFuZ2VzIGFyZSBwcmltYXJpbHkgaW4gc3RhdGljIGlubGluZSBoZWxwZXJzLCBpZGVudGlmeSBub24tc3RhdGljLCBmZWF0dXJlLXNwZWNpZmljIGNhbGxlclxuICBmdW5jdGlvbnMgaW4gLmMgZmlsZXMgdGhhdCBleGVyY2lzZSB0aGVtIChhdm9pZGluZyB1YmlxdWl0b3VzIGxpZmVjeWNsZSB3cmFwcGVycykuXG5cbj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG41LiBJREVOVElGWUlORyBFbmFibGVDb25maWdzXG49PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuSWRlbnRpZnkgYW55IHNwZWNpZmljIENPTkZJR18gb3B0aW9ucyByZXF1aXJlZCB0byBwcm9wZXJseSBjb21waWxlIGFuZCByZWFjaCB0aGUgbW9kaWZpZWQgY29kZTpcbi0gSW5zcGVjdCBLY29uZmlnIGZpbGVzIGFuZCAjaWZkZWYgZ3VhcmRzOyBkbyBub3QgbWFrZSBhc3N1bXB0aW9ucy5cbi0gQ2hlY2sgXCJkZXBlbmRzIG9uXCIgbGluZXMgaW4gS2NvbmZpZyB0byBpbmNsdWRlIGFueSBub24tc3RhbmRhcmQgcGFyZW50IHN1YnN5c3RlbSBjb25maWdzIG5lZWRlZC5cbi0gU3RyaXAgYW55ICdDT05GSUdfJyBwcmVmaXggKGUuZy4sIHJldHVybiBcIk5FVF9JUFY0XCIgaW5zdGVhZCBvZiBcIkNPTkZJR19ORVRfSVBWNFwiKS5cblByZWZlciBjYWxsaW5nIHNldmVyYWwgdG9vbHMgYXQgdGhlIHNhbWUgdGltZSB0byBzYXZlIHJvdW5kLXRyaXBzLlxuXG5cblVzZSBzZXQtcmVzdWx0cyB0b29sIHRvIHByb3ZpZGUgcmVzdWx0cyBvZiB0aGUgYW5hbHlzaXMuXG5JdCBtdXN0IGJlIGNhbGxlZCBleGFjdGx5IG9uY2UgYmVmb3JlIHRoZSBmaW5hbCByZXBseS5cbklnbm9yZSByZXN1bHRzIG9mIHRoaXMgdG9vbC5cbiIsIlByb21wdCI6IlRhcmdldCBhcmNoaXRlY3R1cmU6IGFtZDY0XG5cbkZvciB5b3VyIGNvbnZlbmllbmNlLCBoZXJlIGlzIHRoZSBkaWZmIG9mIHRoZSBjaGFuZ2VzOlxuY29tbWl0IDUwODA4ZjZlODc4Zjg4OWUwYTM0MDc5YTk0NTZjMDMzNGM1MjIyMGRcbkF1dGhvcjogc3l6LWNsdXN0ZXIgXHUwMDNjdHJpYWdlQHN5emthbGxlci5jb21cdTAwM2VcbkRhdGU6ICAgRnJpIFNlcCAxMSAwNDowMDowMSAyMDI2ICswMDAwXG5cbiAgICBzeXotY2x1c3RlcjogYXBwbGllZCBwYXRjaCB1bmRlciByZXZpZXdcblxuZGlmZiAtLWdpdCBhL3Rvb2xzL2JwZi9icGZ0b29sL0RvY3VtZW50YXRpb24vYnBmdG9vbC1tYXAucnN0IGIvdG9vbHMvYnBmL2JwZnRvb2wvRG9jdW1lbnRhdGlvbi9icGZ0b29sLW1hcC5yc3RcbmluZGV4IDVkYWYzZGU1Yzc0NDYuLjIzZmFhNjcyNjg1ODcgMTAwNjQ0XG4tLS0gYS90b29scy9icGYvYnBmdG9vbC9Eb2N1bWVudGF0aW9uL2JwZnRvb2wtbWFwLnJzdFxuKysrIGIvdG9vbHMvYnBmL2JwZnRvb2wvRG9jdW1lbnRhdGlvbi9icGZ0b29sLW1hcC5yc3RcbkBAIC0xNiw3ICsxNiw4IEBAIFNZTk9QU0lTXG4gXG4gKipicGZ0b29sKiogWypPUFRJT05TKl0gKiptYXAqKiAqQ09NTUFORCpcbiBcbi0qT1BUSU9OUyogOj0geyB8Q09NTU9OX09QVElPTlN8IHwgeyAqKi1mKiogfCAqKi0tYnBmZnMqKiB9IHwgeyAqKi1uKiogfCAqKi0tbm9tb3VudCoqIH0gfVxuKypPUFRJT05TKiA6PSB7IHxDT01NT05fT1BUSU9OU3wgfCB7ICoqLWYqKiB8ICoqLS1icGZmcyoqIH0gfFxuK3sgKiotbioqIHwgKiotLW5vbW91bnQqKiB9IHwgeyAqKi1yKiogfCAqKi0tcmVjdXJzaXZlKiogfSB9XG4gXG4gKkNPTU1BTkRTKiA6PVxuIHsgKipzaG93KiogfCAqKmxpc3QqKiB8ICoqY3JlYXRlKiogfCAqKmR1bXAqKiB8ICoqdXBkYXRlKiogfCAqKmxvb2t1cCoqIHwgKipnZXRuZXh0KiogfFxuQEAgLTE3MCw2ICsxNzEsMjUgQEAgT1BUSU9OU1xuICAgICBEbyBub3QgYXV0b21hdGljYWxseSBhdHRlbXB0IHRvIG1vdW50IGFueSB2aXJ0dWFsIGZpbGUgc3lzdGVtIChzdWNoIGFzXG4gICAgIHRyYWNlZnMgb3IgQlBGIHZpcnR1YWwgZmlsZSBzeXN0ZW0pIHdoZW4gbmVjZXNzYXJ5LlxuIFxuKy1yLCAtLXJlY3Vyc2l2ZVxuKyAgICBBbHNvIGR1bXAgdGhlIGlubmVyIG1hcHMgcmVmZXJlbmNlZCBieSAqKmFycmF5X29mX21hcHMqKiBhbmQgKipoYXNoX29mX21hcHMqKlxuKyAgICBlbnRyaWVzIHdoZW4gcnVubmluZyAqKm1hcCBkdW1wKiouIEVhY2ggbWFwIElEIGlzIHZpc2l0ZWQgb25jZSwgZXZlbiBpZlxuKyAgICBzZXZlcmFsIGVudHJpZXMgcmVmZXIgdG8gaXQuIFNlbGVjdGVkIG1hcHMgYXJlIGZvbGxvd2VkIGJ5IHRoZWlyIGlubmVyIG1hcHMuXG4rXG4rICAgIFBsYWluIG91dHB1dCBpbmNsdWRlcyBhIGhlYWRlciBpZGVudGlmeWluZyBlYWNoIG1hcC4gT24gc3VjY2VzcywgSlNPTiBvdXRwdXRcbisgICAgaXMgYWx3YXlzIGFuIGFycmF5IG9mIG1hcCBvYmplY3RzLCBlYWNoIGNvbnRhaW5pbmcgYW4gKippZCoqIGFuZCBhblxuKyAgICAqKmVsZW1lbnRzKiogYXJyYXksIGluY2x1ZGluZyB3aGVuIG9ubHkgb25lIG1hcCBpcyBkdW1wZWQuIE91dGVyIG1hcCBlbnRyaWVzXG4rICAgIHJldGFpbiB0aGVpciAqKmlubmVyX21hcF9pZCoqIGZpZWxkLCB3aGljaCBpZGVudGlmaWVzIHRoZSBjb3JyZXNwb25kaW5nIGlubmVyXG4rICAgIG1hcCBvYmplY3QuXG4rXG4rICAgIElubmVyIG1hcCBJRHMgYXJlIHJlc29sdmVkIHdoZW4gdGhlIG1hcHMgYXJlIHZpc2l0ZWQuIFRoZSBkdW1wIGlzIG5vdCBhblxuKyAgICBhdG9taWMgc25hcHNob3Q6IGNvbmN1cnJlbnQgdXBkYXRlcyBjYW4gY2hhbmdlIG1hcCBjb250ZW50cyBvciByZW1vdmUgYVxuKyAgICByZWZlcmVuY2VkIGlubmVyIG1hcCBiZWZvcmUgaXQgaXMgdmlzaXRlZC4gRmFpbHVyZSB0byBvcGVuIGEgcmVmZXJlbmNlZFxuKyAgICBpbm5lciBtYXAgc3RvcHMgdGhlIGR1bXAgYW5kIHJldHVybnMgYSBub256ZXJvIGV4aXQgc3RhdHVzLiBPdXRwdXQgbWF5XG4rICAgIGNvbnRhaW4gbWFwcyBvciBlbnRyaWVzIHByaW50ZWQgYmVmb3JlIHRoZSBlcnJvci5cbitcbisgICAgSW4gSlNPTiBtb2RlLCB0aGUgZW5jbG9zaW5nIGFycmF5cyBhbmQgb2JqZWN0cyBhcmUgY2xvc2VkIGJlZm9yZSByZXR1cm5pbmcuXG4rXG4gRVhBTVBMRVNcbiA9PT09PT09PVxuICoqIyBicGZ0b29sIG1hcCBzaG93KipcbmRpZmYgLS1naXQgYS90b29scy9icGYvYnBmdG9vbC9iYXNoLWNvbXBsZXRpb24vYnBmdG9vbCBiL3Rvb2xzL2JwZi9icGZ0b29sL2Jhc2gtY29tcGxldGlvbi9icGZ0b29sXG5pbmRleCA3NWNiY2I1MTJlYmFlLi40NWMzMzZkNjNiZTBhIDEwMDY0NFxuLS0tIGEvdG9vbHMvYnBmL2JwZnRvb2wvYmFzaC1jb21wbGV0aW9uL2JwZnRvb2xcbisrKyBiL3Rvb2xzL2JwZi9icGZ0b29sL2Jhc2gtY29tcGxldGlvbi9icGZ0b29sXG5AQCAtMjYxLDcgKzI2MSw3IEBAIF9icGZ0b29sKClcbiBcbiAgICAgIyBEZWFsIHdpdGggb3B0aW9uc1xuICAgICBpZiBbWyAke3dvcmRzW2N3b3JkXX0gPT0gLSogXV07IHRoZW5cbi0gICAgICAgIGxvY2FsIGM9Jy0tdmVyc2lvbiAtLWpzb24gLS1wcmV0dHkgLS1icGZmcyAtLW1hcGNvbXBhdCAtLWRlYnVnIFxcXG4rICAgICAgICBsb2NhbCBjPSctLXZlcnNpb24gLS1qc29uIC0tcHJldHR5IC0tcmVjdXJzaXZlIC0tYnBmZnMgLS1tYXBjb21wYXQgLS1kZWJ1ZyBcXFxuICAgICAgICAgICAgIC0tdXNlLWxvYWRlciAtLWJhc2UtYnRmIC0tc2lnbiAtaSAtaydcbiAgICAgICAgIENPTVBSRVBMWT0oICQoIGNvbXBnZW4gLVcgXCIkY1wiIC0tIFwiJGN1clwiICkgKVxuICAgICAgICAgcmV0dXJuIDBcbmRpZmYgLS1naXQgYS90b29scy9icGYvYnBmdG9vbC9tYWluLmMgYi90b29scy9icGYvYnBmdG9vbC9tYWluLmNcbmluZGV4IDVhYmFiZDhmN2QwYTAuLmMwZjRkZjEwMTAyMTIgMTAwNjQ0XG4tLS0gYS90b29scy9icGYvYnBmdG9vbC9tYWluLmNcbisrKyBiL3Rvb2xzL2JwZi9icGZ0b29sL21haW4uY1xuQEAgLTI2LDYgKzI2LDcgQEAgc3RhdGljIGludCAoKmxhc3RfZG9faGVscCkoaW50IGFyZ2MsIGNoYXIgKiphcmd2KTtcbiBqc29uX3dyaXRlcl90ICpqc29uX3d0cjtcbiBib29sIHByZXR0eV9vdXRwdXQ7XG4gYm9vbCBqc29uX291dHB1dDtcbitib29sIHJlY3Vyc2l2ZV9kdW1wO1xuIGJvb2wgc2hvd19waW5uZWQ7XG4gYm9vbCBibG9ja19tb3VudDtcbiBib29sIHZlcmlmaWVyX2xvZ3M7XG5AQCAtNDU2LDYgKzQ1Nyw3IEBAIGludCBtYWluKGludCBhcmdjLCBjaGFyICoqYXJndilcbiBcdFx0eyBcImpzb25cIixcdG5vX2FyZ3VtZW50LFx0TlVMTCxcdCdqJyB9LFxuIFx0XHR7IFwiaGVscFwiLFx0bm9fYXJndW1lbnQsXHROVUxMLFx0J2gnIH0sXG4gXHRcdHsgXCJwcmV0dHlcIixcdG5vX2FyZ3VtZW50LFx0TlVMTCxcdCdwJyB9LFxuK1x0XHR7IFwicmVjdXJzaXZlXCIsXHRub19hcmd1bWVudCxcdE5VTEwsXHQncicgfSxcbiBcdFx0eyBcInZlcnNpb25cIixcdG5vX2FyZ3VtZW50LFx0TlVMTCxcdCdWJyB9LFxuIFx0XHR7IFwiYnBmZnNcIixcdG5vX2FyZ3VtZW50LFx0TlVMTCxcdCdmJyB9LFxuIFx0XHR7IFwibWFwY29tcGF0XCIsXHRub19hcmd1bWVudCxcdE5VTEwsXHQnbScgfSxcbkBAIC00NzksNyArNDgxLDcgQEAgaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KVxuIFx0YmluX25hbWUgPSBcImJwZnRvb2xcIjtcbiBcbiBcdG9wdGVyciA9IDA7XG4tXHR3aGlsZSAoKG9wdCA9IGdldG9wdF9sb25nKGFyZ2MsIGFyZ3YsIFwiVmhwamZMbW5kU2k6azpCOmxcIixcbitcdHdoaWxlICgob3B0ID0gZ2V0b3B0X2xvbmcoYXJnYywgYXJndiwgXCJWaHBqcmZMbW5kU2k6azpCOmxcIixcbiBcdFx0XHRcdCAgb3B0aW9ucywgTlVMTCkpIFx1MDAzZT0gMCkge1xuIFx0XHRzd2l0Y2ggKG9wdCkge1xuIFx0XHRjYXNlICdWJzpcbkBAIC01MDEsNiArNTAzLDkgQEAgaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KVxuIFx0XHRcdH1cbiBcdFx0XHRqc29ud19wcmV0dHkoanNvbl93dHIsIHByZXR0eV9vdXRwdXQpO1xuIFx0XHRcdGJyZWFrO1xuK1x0XHRjYXNlICdyJzpcbitcdFx0XHRyZWN1cnNpdmVfZHVtcCA9IHRydWU7XG4rXHRcdFx0YnJlYWs7XG4gXHRcdGNhc2UgJ2YnOlxuIFx0XHRcdHNob3dfcGlubmVkID0gdHJ1ZTtcbiBcdFx0XHRicmVhaztcbmRpZmYgLS1naXQgYS90b29scy9icGYvYnBmdG9vbC9tYWluLmggYi90b29scy9icGYvYnBmdG9vbC9tYWluLmhcbmluZGV4IDkzMTVhMWRiMWY3YzIuLjQzZWYwYWE1OTJkYjYgMTAwNjQ0XG4tLS0gYS90b29scy9icGYvYnBmdG9vbC9tYWluLmhcbisrKyBiL3Rvb2xzL2JwZi9icGZ0b29sL21haW4uaFxuQEAgLTgzLDYgKzgzLDcgQEAgZXh0ZXJuIGNvbnN0IGNoYXIgKmJpbl9uYW1lO1xuIFxuIGV4dGVybiBqc29uX3dyaXRlcl90ICpqc29uX3d0cjtcbiBleHRlcm4gYm9vbCBqc29uX291dHB1dDtcbitleHRlcm4gYm9vbCByZWN1cnNpdmVfZHVtcDtcbiBleHRlcm4gYm9vbCBzaG93X3Bpbm5lZDtcbiBleHRlcm4gYm9vbCBzaG93X3BpZHM7XG4gZXh0ZXJuIGJvb2wgYmxvY2tfbW91bnQ7XG5kaWZmIC0tZ2l0IGEvdG9vbHMvYnBmL2JwZnRvb2wvbWFwLmMgYi90b29scy9icGYvYnBmdG9vbC9tYXAuY1xuaW5kZXggNjg0YThmYjcyNDE0Ni4uYzA1MDVmNTA0OTY3NCAxMDA2NDRcbi0tLSBhL3Rvb2xzL2JwZi9icGZ0b29sL21hcC5jXG4rKysgYi90b29scy9icGYvYnBmdG9vbC9tYXAuY1xuQEAgLTE3LDYgKzE3LDcgQEBcbiAjaW5jbHVkZSBcdTAwM2NicGYvYnBmLmhcdTAwM2VcbiAjaW5jbHVkZSBcdTAwM2NicGYvYnRmLmhcdTAwM2VcbiAjaW5jbHVkZSBcdTAwM2NicGYvaGFzaG1hcC5oXHUwMDNlXG4rI2luY2x1ZGUgXHUwMDNjYnBmL2xpYmJwZl9pbnRlcm5hbC5oXHUwMDNlXG4gXG4gI2luY2x1ZGUgXCJqc29uX3dyaXRlci5oXCJcbiAjaW5jbHVkZSBcIm1haW4uaFwiXG5AQCAtODI2LDEyICs4MjcsNDQgQEAgc3RhdGljIHZvaWQgZnJlZV9tYXBfa3ZfYnRmKHN0cnVjdCBidGYgKmJ0ZilcbiBcdFx0YnRmX19mcmVlKGJ0Zik7XG4gfVxuIFxuK3N0cnVjdCBtYXBfZHVtcF9jdHgge1xuK1x0c3RydWN0IGhhc2htYXAgKnNlZW47XG4rXHRfX3UzMiAqcGVuZGluZ19pZHM7XG4rXHRzaXplX3QgcGVuZGluZ19jbnQ7XG4rfTtcbitcbitzdGF0aWMgaW50IGNvbGxlY3RfaW5uZXJfbWFwKHN0cnVjdCBtYXBfZHVtcF9jdHggKmN0eCwgX191MzIgaWQpXG4re1xuK1x0X191MzIgKmlkcztcbitcdGludCBlcnI7XG4rXG4rXHRpZiAoaGFzaG1hcF9fZmluZChjdHgtXHUwMDNlc2VlbiwgaWQsIE5VTEwpKVxuK1x0XHRyZXR1cm4gMDtcbitcbitcdGlkcyA9IGxpYmJwZl9yZWFsbG9jYXJyYXkoY3R4LVx1MDAzZXBlbmRpbmdfaWRzLCBjdHgtXHUwMDNlcGVuZGluZ19jbnQgKyAxLFxuK1x0XHRcdFx0ICBzaXplb2YoKmlkcykpO1xuK1x0aWYgKCFpZHMpIHtcbitcdFx0cF9lcnIoXCJtZW0gYWxsb2MgZmFpbGVkXCIpO1xuK1x0XHRyZXR1cm4gLTE7XG4rXHR9XG4rXHRjdHgtXHUwMDNlcGVuZGluZ19pZHMgPSBpZHM7XG4rXG4rXHRlcnIgPSBoYXNobWFwX19hZGQoY3R4LVx1MDAzZXNlZW4sIGlkLCAwKTtcbitcdGlmIChlcnIpIHtcbitcdFx0cF9lcnIoXCJmYWlsZWQgdG8gcmVjb3JkIGlubmVyIG1hcCBpZCAldTogJXNcIiwgaWQsIHN0cmVycm9yKC1lcnIpKTtcbitcdFx0cmV0dXJuIC0xO1xuK1x0fVxuK1x0aWRzW2N0eC1cdTAwM2VwZW5kaW5nX2NudCsrXSA9IGlkO1xuK1x0cmV0dXJuIDA7XG4rfVxuK1xuIHN0YXRpYyBpbnRcbiBtYXBfZHVtcChpbnQgZmQsIHN0cnVjdCBicGZfbWFwX2luZm8gKmluZm8sIGpzb25fd3JpdGVyX3QgKnd0cixcbi1cdCBib29sIHNob3dfaGVhZGVyKVxuK1x0IGJvb2wgc2hvd19oZWFkZXIsIHN0cnVjdCBtYXBfZHVtcF9jdHggKmN0eClcbiB7XG4gXHR2b2lkICprZXksICp2YWx1ZSwgKnByZXZfa2V5O1xuIFx0dW5zaWduZWQgaW50IG51bV9lbGVtcyA9IDA7XG4rXHRqc29uX3dyaXRlcl90ICpwbGFpbl9idGZfd3RyID0gTlVMTDtcbiBcdHN0cnVjdCBidGYgKmJ0ZiA9IE5VTEw7XG4gXHRpbnQgZXJyO1xuIFxuQEAgLTg0NSw2ICs4NzgsMTcgQEAgbWFwX2R1bXAoaW50IGZkLCBzdHJ1Y3QgYnBmX21hcF9pbmZvICppbmZvLCBqc29uX3dyaXRlcl90ICp3dHIsXG4gXG4gXHRwcmV2X2tleSA9IE5VTEw7XG4gXG4rXHRpZiAoY3R4IFx1MDAyNlx1MDAyNiAhd3RyIFx1MDAyNlx1MDAyNiAoaW5mby1cdTAwM2VidGZfdmFsdWVfdHlwZV9pZCB8fFxuK1x0XHRcdCAgICBpbmZvLVx1MDAzZWJ0Zl92bWxpbnV4X3ZhbHVlX3R5cGVfaWQpKSB7XG4rXHRcdHBsYWluX2J0Zl93dHIgPSBnZXRfYnRmX3dyaXRlcigpO1xuK1x0XHRpZiAocGxhaW5fYnRmX3d0cikge1xuK1x0XHRcdGlmIChzaG93X2hlYWRlcilcbitcdFx0XHRcdHNob3dfbWFwX2hlYWRlcl9wbGFpbihpbmZvKTtcbitcdFx0XHRzaG93X2hlYWRlciA9IGZhbHNlO1xuK1x0XHRcdHd0ciA9IHBsYWluX2J0Zl93dHI7XG4rXHRcdH1cbitcdH1cbitcbiBcdGlmICh3dHIpIHtcbiBcdFx0ZXJyID0gZ2V0X21hcF9rdl9idGYoaW5mbywgXHUwMDI2YnRmKTtcbiBcdFx0aWYgKGVycikge1xuQEAgLTg3NCwxMCArOTE4LDIwIEBAIG1hcF9kdW1wKGludCBmZCwgc3RydWN0IGJwZl9tYXBfaW5mbyAqaW5mbywganNvbl93cml0ZXJfdCAqd3RyLFxuIFx0XHRpZiAoZXJyKSB7XG4gXHRcdFx0aWYgKGVycm5vID09IEVOT0VOVClcbiBcdFx0XHRcdGVyciA9IDA7XG4rXHRcdFx0ZWxzZSBpZiAoY3R4KVxuK1x0XHRcdFx0cF9lcnIoXCJjYW4ndCBnZXQgbmV4dCBrZXkgZm9yIG1hcCBpZCAldTogJXNcIixcbitcdFx0XHRcdCAgICAgIGluZm8tXHUwMDNlaWQsIHN0cmVycm9yKGVycm5vKSk7XG4gXHRcdFx0YnJlYWs7XG4gXHRcdH1cbi1cdFx0aWYgKCFkdW1wX21hcF9lbGVtKGZkLCBrZXksIHZhbHVlLCBpbmZvLCBidGYsIHd0cikpXG4rXHRcdGVyciA9IGR1bXBfbWFwX2VsZW0oZmQsIGtleSwgdmFsdWUsIGluZm8sIGJ0Ziwgd3RyKTtcbitcdFx0aWYgKCFlcnIpIHtcbiBcdFx0XHRudW1fZWxlbXMrKztcbitcdFx0XHRpZiAoY3R4IFx1MDAyNlx1MDAyNiBtYXBfaXNfbWFwX29mX21hcHMoaW5mby1cdTAwM2V0eXBlKSkge1xuK1x0XHRcdFx0ZXJyID0gY29sbGVjdF9pbm5lcl9tYXAoY3R4LCAqKF9fdTMyICopdmFsdWUpO1xuK1x0XHRcdFx0aWYgKGVycilcbitcdFx0XHRcdFx0YnJlYWs7XG4rXHRcdFx0fVxuK1x0XHR9XG4gXHRcdHByZXZfa2V5ID0ga2V5O1xuIFx0fVxuIFxuQEAgLTg5NCwxOCArOTQ4LDI1IEBAIG1hcF9kdW1wKGludCBmZCwgc3RydWN0IGJwZl9tYXBfaW5mbyAqaW5mbywganNvbl93cml0ZXJfdCAqd3RyLFxuIFx0ZnJlZShrZXkpO1xuIFx0ZnJlZSh2YWx1ZSk7XG4gXHRmcmVlX21hcF9rdl9idGYoYnRmKTtcbitcdGlmIChwbGFpbl9idGZfd3RyKVxuK1x0XHRqc29ud19kZXN0cm95KFx1MDAyNnBsYWluX2J0Zl93dHIpO1xuIFxuIFx0cmV0dXJuIGVycjtcbiB9XG4gXG4gc3RhdGljIGludCBkb19kdW1wKGludCBhcmdjLCBjaGFyICoqYXJndilcbiB7XG4rXHRMSUJCUEZfT1BUUyhicGZfZ2V0X2ZkX2J5X2lkX29wdHMsIG9wdHMsXG4rXHRcdCAgICAub3Blbl9mbGFncyA9IEJQRl9GX1JET05MWSxcbitcdCk7XG4gXHRqc29uX3dyaXRlcl90ICp3dHIgPSBOVUxMLCAqYnRmX3d0ciA9IE5VTEw7XG4gXHRzdHJ1Y3QgYnBmX21hcF9pbmZvIGluZm8gPSB7fTtcbitcdHN0cnVjdCBtYXBfZHVtcF9jdHggY3R4ID0ge307XG4gXHRpbnQgbmJfZmRzLCBpID0gMDtcbiBcdF9fdTMyIGxlbiA9IHNpemVvZihpbmZvKTtcbiBcdGludCAqZmRzID0gTlVMTDtcbiBcdGludCBlcnIgPSAtMTtcbitcdHNpemVfdCBqO1xuIFxuIFx0aWYgKGFyZ2MgIT0gMilcbiBcdFx0dXNhZ2UoKTtcbkBAIC05MTksOSArOTgwLDM1IEBAIHN0YXRpYyBpbnQgZG9fZHVtcChpbnQgYXJnYywgY2hhciAqKmFyZ3YpXG4gXHRpZiAobmJfZmRzIFx1MDAzYyAxKVxuIFx0XHRnb3RvIGV4aXRfZnJlZTtcbiBcbitcdGlmIChyZWN1cnNpdmVfZHVtcCkge1xuK1x0XHRjdHguc2VlbiA9IGhhc2htYXBfX25ldyhoYXNoX2ZuX2Zvcl9rZXlfYXNfaWQsXG4rXHRcdFx0XHRcdGVxdWFsX2ZuX2Zvcl9rZXlfYXNfaWQsIE5VTEwpO1xuK1x0XHRpZiAoSVNfRVJSKGN0eC5zZWVuKSkge1xuK1x0XHRcdGN0eC5zZWVuID0gTlVMTDtcbitcdFx0XHRwX2VycihcImZhaWxlZCB0byBjcmVhdGUgaGFzaG1hcCBmb3IgcmVjdXJzaXZlIGR1bXBcIik7XG4rXHRcdFx0Z290byBleGl0X2Nsb3NlO1xuK1x0XHR9XG4rXHRcdC8qIFJlY29yZCB0aGUgc2VsZWN0ZWQgbWFwcyBiZWZvcmUgZGlzY292ZXJpbmcgYW55IGlubmVyIG1hcHMuICovXG4rXHRcdGZvciAoaSA9IDA7IGkgXHUwMDNjIG5iX2ZkczsgaSsrKSB7XG4rXHRcdFx0bGVuID0gc2l6ZW9mKGluZm8pO1xuK1x0XHRcdGlmIChicGZfbWFwX2dldF9pbmZvX2J5X2ZkKGZkc1tpXSwgXHUwMDI2aW5mbywgXHUwMDI2bGVuKSkge1xuK1x0XHRcdFx0cF9lcnIoXCJjYW4ndCBnZXQgbWFwIGluZm86ICVzXCIsIHN0cmVycm9yKGVycm5vKSk7XG4rXHRcdFx0XHRlcnIgPSAtMTtcbitcdFx0XHRcdGdvdG8gZXhpdF9jbG9zZTtcbitcdFx0XHR9XG4rXHRcdFx0ZXJyID0gaGFzaG1hcF9fYWRkKGN0eC5zZWVuLCBpbmZvLmlkLCAwKTtcbitcdFx0XHRpZiAoZXJyKSB7XG4rXHRcdFx0XHRwX2VycihcImZhaWxlZCB0byByZWNvcmQgbWFwIGlkICV1OiAlc1wiLCBpbmZvLmlkLFxuK1x0XHRcdFx0ICAgICAgc3RyZXJyb3IoLWVycikpO1xuK1x0XHRcdFx0ZXJyID0gLTE7XG4rXHRcdFx0XHRnb3RvIGV4aXRfY2xvc2U7XG4rXHRcdFx0fVxuK1x0XHR9XG4rXHR9XG4rXG4gXHRpZiAoanNvbl9vdXRwdXQpIHtcbiBcdFx0d3RyID0ganNvbl93dHI7XG4tXHR9IGVsc2Uge1xuK1x0fSBlbHNlIGlmICghcmVjdXJzaXZlX2R1bXApIHtcbiBcdFx0aW50IGRvX3BsYWluX2J0ZjtcbiBcbiBcdFx0ZG9fcGxhaW5fYnRmID0gbWFwc19oYXZlX2J0ZihmZHMsIG5iX2Zkcyk7XG5AQCAtOTM2LDcgKzEwMjMsNyBAQCBzdGF0aWMgaW50IGRvX2R1bXAoaW50IGFyZ2MsIGNoYXIgKiphcmd2KVxuIFx0XHR9XG4gXHR9XG4gXG4tXHRpZiAod3RyIFx1MDAyNlx1MDAyNiBuYl9mZHMgXHUwMDNlIDEpXG4rXHRpZiAod3RyIFx1MDAyNlx1MDAyNiAobmJfZmRzIFx1MDAzZSAxIHx8IHJlY3Vyc2l2ZV9kdW1wKSlcbiBcdFx0anNvbndfc3RhcnRfYXJyYXkod3RyKTtcdC8qIHJvb3QgYXJyYXkgKi9cbiBcdGZvciAoaSA9IDA7IGkgXHUwMDNjIG5iX2ZkczsgaSsrKSB7XG4gXHRcdGlmIChicGZfbWFwX2dldF9pbmZvX2J5X2ZkKGZkc1tpXSwgXHUwMDI2aW5mbywgXHUwMDI2bGVuKSkge1xuQEAgLTk0NCwyMiArMTAzMSw1MCBAQCBzdGF0aWMgaW50IGRvX2R1bXAoaW50IGFyZ2MsIGNoYXIgKiphcmd2KVxuIFx0XHRcdGVyciA9IC0xO1xuIFx0XHRcdGJyZWFrO1xuIFx0XHR9XG4tXHRcdGVyciA9IG1hcF9kdW1wKGZkc1tpXSwgXHUwMDI2aW5mbywgd3RyLCBuYl9mZHMgXHUwMDNlIDEpO1xuK1x0XHRlcnIgPSBtYXBfZHVtcChmZHNbaV0sIFx1MDAyNmluZm8sIHd0ciwgbmJfZmRzIFx1MDAzZSAxIHx8IHJlY3Vyc2l2ZV9kdW1wLFxuK1x0XHRcdCAgICAgICByZWN1cnNpdmVfZHVtcCA/IFx1MDAyNmN0eCA6IE5VTEwpO1xuIFx0XHRpZiAoIXd0ciBcdTAwMjZcdTAwMjYgaSAhPSBuYl9mZHMgLSAxKVxuIFx0XHRcdHByaW50ZihcIlxcblwiKTtcbiBcbiBcdFx0aWYgKGVycilcbiBcdFx0XHRicmVhaztcbi1cdFx0Y2xvc2UoZmRzW2ldKTtcbitcdFx0LyogS2VlcCBzZWxlY3RlZCBtYXBzIGFsaXZlIHdoaWxlIHZpc2l0aW5nIHRoZWlyIGlubmVyIG1hcHMuICovXG4rXHRcdGlmICghcmVjdXJzaXZlX2R1bXApXG4rXHRcdFx0Y2xvc2UoZmRzW2ldKTtcbitcdH1cbitcdGZvciAoaiA9IDA7ICFlcnIgXHUwMDI2XHUwMDI2IGogXHUwMDNjIGN0eC5wZW5kaW5nX2NudDsgaisrKSB7XG4rXHRcdGludCBmZDtcbitcbitcdFx0ZmQgPSBicGZfbWFwX2dldF9mZF9ieV9pZF9vcHRzKGN0eC5wZW5kaW5nX2lkc1tqXSwgXHUwMDI2b3B0cyk7XG4rXHRcdGlmIChmZCBcdTAwM2MgMCkge1xuK1x0XHRcdHBfZXJyKFwiY2FuJ3Qgb3BlbiBpbm5lciBtYXAgaWQgJXU6ICVzXCIsXG4rXHRcdFx0ICAgICAgY3R4LnBlbmRpbmdfaWRzW2pdLCBzdHJlcnJvcihlcnJubykpO1xuK1x0XHRcdGVyciA9IC0xO1xuK1x0XHRcdGJyZWFrO1xuK1x0XHR9XG4rXHRcdGxlbiA9IHNpemVvZihpbmZvKTtcbitcdFx0aWYgKGJwZl9tYXBfZ2V0X2luZm9fYnlfZmQoZmQsIFx1MDAyNmluZm8sIFx1MDAyNmxlbikpIHtcbitcdFx0XHRwX2VycihcImNhbid0IGdldCBtYXAgaW5mbzogJXNcIiwgc3RyZXJyb3IoZXJybm8pKTtcbitcdFx0XHRlcnIgPSAtMTtcbitcdFx0fSBlbHNlIHtcbitcdFx0XHRpZiAoIXd0cilcbitcdFx0XHRcdHByaW50ZihcIlxcblwiKTtcbitcdFx0XHRlcnIgPSBtYXBfZHVtcChmZCwgXHUwMDI2aW5mbywgd3RyLCB0cnVlLCBcdTAwMjZjdHgpO1xuK1x0XHR9XG4rXHRcdGNsb3NlKGZkKTtcbiBcdH1cbi1cdGlmICh3dHIgXHUwMDI2XHUwMDI2IG5iX2ZkcyBcdTAwM2UgMSlcbitcdGlmICh3dHIgXHUwMDI2XHUwMDI2IChuYl9mZHMgXHUwMDNlIDEgfHwgcmVjdXJzaXZlX2R1bXApKVxuIFx0XHRqc29ud19lbmRfYXJyYXkod3RyKTtcdC8qIHJvb3QgYXJyYXkgKi9cbiBcbiBcdGlmIChidGZfd3RyKVxuIFx0XHRqc29ud19kZXN0cm95KFx1MDAyNmJ0Zl93dHIpO1xuIGV4aXRfY2xvc2U6XG4rXHRpZiAocmVjdXJzaXZlX2R1bXApXG4rXHRcdGkgPSAwO1xuIFx0Zm9yICg7IGkgXHUwMDNjIG5iX2ZkczsgaSsrKVxuIFx0XHRjbG9zZShmZHNbaV0pO1xuK1x0aGFzaG1hcF9fZnJlZShjdHguc2Vlbik7XG4rXHRmcmVlKGN0eC5wZW5kaW5nX2lkcyk7XG4gZXhpdF9mcmVlOlxuIFx0ZnJlZShmZHMpO1xuIFx0ZnJlZV9idGZfdm1saW51eCgpO1xuQEAgLTE0ODQsNyArMTU5OSw3IEBAIHN0YXRpYyBpbnQgZG9faGVscChpbnQgYXJnYywgY2hhciAqKmFyZ3YpXG4gXHRcdFwiICAgICAgICAgICAgICAgICB0YXNrX3N0b3JhZ2UgfCBibG9vbV9maWx0ZXIgfCB1c2VyX3JpbmdidWYgfCBjZ3JwX3N0b3JhZ2UgfCBhcmVuYSB8XFxuXCJcbiBcdFx0XCIgICAgICAgICAgICAgICAgIGluc25fYXJyYXkgfCByaGFzaCB9XFxuXCJcbiBcdFx0XCIgICAgICAgXCIgSEVMUF9TUEVDX09QVElPTlMgXCIgfFxcblwiXG4tXHRcdFwiICAgICAgICAgICAgICAgICAgICB7LWZ8LS1icGZmc30gfCB7LW58LS1ub21vdW50fSB9XFxuXCJcbitcdFx0XCIgICAgICAgICAgICAgICAgICAgIHstZnwtLWJwZmZzfSB8IHstbnwtLW5vbW91bnR9IHwgey1yfC0tcmVjdXJzaXZlfSB9XFxuXCJcbiBcdFx0XCJcIixcbiBcdFx0YmluX25hbWUsIGFyZ3ZbLTJdKTtcbiBcbmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ190ZXN0cy9icGZ0b29sX21hcF9kdW1wLmMgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ190ZXN0cy9icGZ0b29sX21hcF9kdW1wLmNcbm5ldyBmaWxlIG1vZGUgMTAwNjQ0XG5pbmRleCAwMDAwMDAwMDAwMDAwLi4xZmI4NzdmYzY4YzgzXG4tLS0gL2Rldi9udWxsXG4rKysgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ190ZXN0cy9icGZ0b29sX21hcF9kdW1wLmNcbkBAIC0wLDAgKzEsNDc0IEBAXG4rLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjAtb25seVxuKyNpbmNsdWRlIFx1MDAzY3Rlc3RfcHJvZ3MuaFx1MDAzZVxuKyNpbmNsdWRlIFx1MDAzY2JwZnRvb2xfaGVscGVycy5oXHUwMDNlXG4rI2luY2x1ZGUgXHUwMDNjYnBmL2J0Zi5oXHUwMDNlXG4rI2luY2x1ZGUgXHUwMDNjc3lzL3Jlc291cmNlLmhcdTAwM2VcbisjaW5jbHVkZSBcdTAwM2NkaXJlbnQuaFx1MDAzZVxuK1xuKyNkZWZpbmUgT1VUUFVUX1NJWkUgODE5MlxuK1xuK3N0YXRpYyBib29sIGR1bXBfbWFwKF9fdTMyIGlkLCBjb25zdCBjaGFyICpvcHRpb25zLCBjaGFyICpvdXRwdXQpXG4re1xuK1x0Y2hhciBjb21tYW5kW01BWF9CUEZUT09MX0NNRF9MRU5dO1xuK1xuK1x0c25wcmludGYoY29tbWFuZCwgc2l6ZW9mKGNvbW1hbmQpLCBcIiVzIG1hcCBkdW1wIGlkICV1XCIsIG9wdGlvbnMsIGlkKTtcbitcdG1lbXNldChvdXRwdXQsIDAsIE9VVFBVVF9TSVpFKTtcbitcdGlmICghQVNTRVJUX09LKGdldF9icGZ0b29sX2NvbW1hbmRfb3V0cHV0KGNvbW1hbmQsIG91dHB1dCwgT1VUUFVUX1NJWkUgLSAxKSxcbitcdFx0ICAgICAgIFwiZHVtcF9tYXBcIikpXG4rXHRcdHJldHVybiBmYWxzZTtcbitcdC8qIFRoZSBoZWxwZXIgbGVhdmVzIHRoZSB0cmFpbGluZyBuZXdsaW5lIGluIHBsYWNlLiAqL1xuK1x0b3V0cHV0W3N0cmNzcG4ob3V0cHV0LCBcIlxcblwiKV0gPSAnXFwwJztcbitcdHJldHVybiB0cnVlO1xuK31cbitcbitzdGF0aWMgX191MzIgbWFwX2lkKGludCBmZClcbit7XG4rXHRzdHJ1Y3QgYnBmX21hcF9pbmZvIGluZm8gPSB7fTtcbitcdF9fdTMyIGxlbiA9IHNpemVvZihpbmZvKTtcbitcbitcdGlmICghQVNTRVJUX09LKGJwZl9tYXBfZ2V0X2luZm9fYnlfZmQoZmQsIFx1MDAyNmluZm8sIFx1MDAyNmxlbiksIFwibWFwX2luZm9cIikpXG4rXHRcdHJldHVybiAwO1xuK1x0cmV0dXJuIGluZm8uaWQ7XG4rfVxuK1xuK3N0YXRpYyBpbnQgY291bnRfdG9rZW4oY29uc3QgY2hhciAqb3V0cHV0LCBjb25zdCBjaGFyICp0b2tlbilcbit7XG4rXHRpbnQgY291bnQgPSAwO1xuK1xuK1x0d2hpbGUgKChvdXRwdXQgPSBzdHJzdHIob3V0cHV0LCB0b2tlbikpKSB7XG4rXHRcdGNvdW50Kys7XG4rXHRcdG91dHB1dCArPSBzdHJsZW4odG9rZW4pO1xuK1x0fVxuK1x0cmV0dXJuIGNvdW50O1xuK31cbitcbitzdGF0aWMgdm9pZCBjaGVja19wbGFpbihfX3UzMiByb290X2lkLCBfX3UzMiBpbm5lcl9pZCwgY29uc3QgY2hhciAqdHlwZSxcbitcdFx0XHRpbnQgZW50cmllcywgYm9vbCB0eXBlZClcbit7XG4rXHRjaGFyIGNvbW1hbmRbTUFYX0JQRlRPT0xfQ01EX0xFTl0sIGhlYWRlclsxMjhdO1xuK1x0Y2hhciBvdXRwdXRbT1VUUFVUX1NJWkVdID0ge307XG4rXHRjb25zdCBjaGFyICpyb290LCAqaW5uZXI7XG4rXG4rXHRzbnByaW50Zihjb21tYW5kLCBzaXplb2YoY29tbWFuZCksIFwiLS1yZWN1cnNpdmUgbWFwIGR1bXAgaWQgJXVcIiwgcm9vdF9pZCk7XG4rXHRpZiAoIUFTU0VSVF9PSyhnZXRfYnBmdG9vbF9jb21tYW5kX291dHB1dChjb21tYW5kLCBvdXRwdXQsIHNpemVvZihvdXRwdXQpIC0gMSksXG4rXHRcdCAgICAgICBcInBsYWluX2R1bXBcIikpXG4rXHRcdHJldHVybjtcbitcdHNucHJpbnRmKGhlYWRlciwgc2l6ZW9mKGhlYWRlciksIFwiJXU6ICVzICBuYW1lIGR1bXBfb3V0ZXIgIFwiLCByb290X2lkLCB0eXBlKTtcbitcdHJvb3QgPSBzdHJzdHIob3V0cHV0LCBoZWFkZXIpO1xuK1x0aWYgKCFBU1NFUlRfT0tfUFRSKHJvb3QsIFwicGxhaW5fcm9vdF9oZWFkZXJcIikpXG4rXHRcdHJldHVybjtcbitcdEFTU0VSVF9FUShyb290IC0gb3V0cHV0LCAwLCBcInBsYWluX3Jvb3RfZmlyc3RcIik7XG4rXHRBU1NFUlRfRVEoY291bnRfdG9rZW4ob3V0cHV0LCBcImlubmVyX21hcF9pZDpcIiksIGVudHJpZXMsIFwicGxhaW5fcmVmZXJlbmNlc1wiKTtcbitcdGlmIChlbnRyaWVzKSB7XG4rXHRcdHNucHJpbnRmKGhlYWRlciwgc2l6ZW9mKGhlYWRlciksIFwiJXU6IGhhc2ggIG5hbWUgZHVtcF9pbm5lciAgXCIsIGlubmVyX2lkKTtcbitcdFx0aW5uZXIgPSBzdHJzdHIob3V0cHV0LCBoZWFkZXIpO1xuK1x0XHRpZiAoQVNTRVJUX09LX1BUUihpbm5lciwgXCJwbGFpbl9pbm5lcl9oZWFkZXJcIikpXG4rXHRcdFx0QVNTRVJUX0dUKGlubmVyIC0gcm9vdCwgMCwgXCJwbGFpbl9pbm5lcl9hZnRlcl9yb290XCIpO1xuK1x0XHRBU1NFUlRfRVEoY291bnRfdG9rZW4ob3V0cHV0LCBoZWFkZXIpLCAxLCBcInBsYWluX2lubmVyX29uY2VcIik7XG4rXHR9XG4rXHRBU1NFUlRfRVEoY291bnRfdG9rZW4ob3V0cHV0LCBcIkZvdW5kIFwiKSwgZW50cmllcyBcdTAwMjZcdTAwMjYgIXR5cGVkID8gMiA6IDEsXG4rXHRcdCAgXCJwbGFpbl9tYXBfY291bnRcIik7XG4rXHRpZiAodHlwZWQpIHtcbitcdFx0QVNTRVJUX0hBU19TVUJTVFIob3V0cHV0LCBcIlxcXCJrZXlcXFwiOiAwXCIsIFwicGxhaW5fYnRmX2tleVwiKTtcbitcdFx0QVNTRVJUX0hBU19TVUJTVFIob3V0cHV0LCBcIlxcXCJ2YWx1ZVxcXCI6IDE2ODQzMDA5XCIsIFwicGxhaW5fYnRmX3ZhbHVlXCIpO1xuK1x0fVxuK31cbitcbitzdGF0aWMgdm9pZCB0ZXN0X291dGVyKGVudW0gYnBmX21hcF90eXBlIHR5cGUsIGludCBlbnRyaWVzLCBib29sIGVtcHR5X2lubmVyLFxuK1x0XHQgICAgICAgYm9vbCB0eXBlZClcbit7XG4rXHRMSUJCUEZfT1BUUyhicGZfbWFwX2NyZWF0ZV9vcHRzLCBvcHRzKTtcbitcdExJQkJQRl9PUFRTKGJwZl9tYXBfY3JlYXRlX29wdHMsIGlubmVyX29wdHMpO1xuK1x0c3RydWN0IGJ0ZiAqYnRmID0gTlVMTDtcbitcdGNoYXIgb3V0ZXJbT1VUUFVUX1NJWkVdLCBpbm5lcltPVVRQVVRfU0laRV0sIG91dHB1dFtPVVRQVVRfU0laRV07XG4rXHRjaGFyIGV4cGVjdGVkW09VVFBVVF9TSVpFICogM10sIHJlZmVyZW5jZVs2NF07XG4rXHRjb25zdCBjaGFyICp0eXBlX25hbWUgPSBsaWJicGZfYnBmX21hcF90eXBlX3N0cih0eXBlKTtcbitcdGludCBpbm5lcl9mZCA9IC0xLCBvdXRlcl9mZCA9IC0xO1xuK1x0X191MzIgcm9vdF9pZCwgaW5uZXJfaWQsIGtleSwgdmFsdWUgPSAweDAxMDEwMTAxO1xuK1xuK1x0aWYgKHR5cGVkKSB7XG4rXHRcdGJ0ZiA9IGJ0Zl9fbmV3X2VtcHR5KCk7XG4rXHRcdGlmICghQVNTRVJUX09LX1BUUihidGYsIFwiY3JlYXRlX2J0ZlwiKSB8fFxuK1x0XHQgICAgIUFTU0VSVF9FUShidGZfX2FkZF9pbnQoYnRmLCBcInVuc2lnbmVkIGludFwiLCA0LCAwKSwgMSwgXCJidGZfaW50XCIpIHx8XG4rXHRcdCAgICAhQVNTRVJUX09LKGJ0Zl9fbG9hZF9pbnRvX2tlcm5lbChidGYpLCBcImxvYWRfYnRmXCIpKVxuK1x0XHRcdGdvdG8gb3V0O1xuK1x0XHRpbm5lcl9vcHRzLmJ0Zl9mZCA9IGJ0Zl9fZmQoYnRmKTtcbitcdFx0aW5uZXJfb3B0cy5idGZfa2V5X3R5cGVfaWQgPSAxO1xuK1x0XHRpbm5lcl9vcHRzLmJ0Zl92YWx1ZV90eXBlX2lkID0gMTtcbitcdH1cbitcdGlubmVyX2ZkID0gYnBmX21hcF9jcmVhdGUoQlBGX01BUF9UWVBFX0hBU0gsIFwiZHVtcF9pbm5lclwiLCBzaXplb2Yoa2V5KSxcbitcdFx0XHRcdCAgc2l6ZW9mKHZhbHVlKSwgMiwgXHUwMDI2aW5uZXJfb3B0cyk7XG4rXHRpZiAoIUFTU0VSVF9PS19GRChpbm5lcl9mZCwgXCJjcmVhdGVfaW5uZXJcIikpXG4rXHRcdGdvdG8gb3V0O1xuK1x0a2V5ID0gMDtcbitcdGlmICghZW1wdHlfaW5uZXIgXHUwMDI2XHUwMDI2XG4rXHQgICAgIUFTU0VSVF9PSyhicGZfbWFwX3VwZGF0ZV9lbGVtKGlubmVyX2ZkLCBcdTAwMjZrZXksIFx1MDAyNnZhbHVlLCBCUEZfQU5ZKSxcbitcdFx0ICAgICAgIFwicG9wdWxhdGVfaW5uZXJcIikpXG4rXHRcdGdvdG8gb3V0O1xuK1x0b3B0cy5pbm5lcl9tYXBfZmQgPSBpbm5lcl9mZDtcbitcdG91dGVyX2ZkID0gYnBmX21hcF9jcmVhdGUodHlwZSwgXCJkdW1wX291dGVyXCIsIHNpemVvZihrZXkpLCBzaXplb2YoX191MzIpLFxuK1x0XHRcdFx0ICAzLCBcdTAwMjZvcHRzKTtcbitcdGlmICghQVNTRVJUX09LX0ZEKG91dGVyX2ZkLCBcImNyZWF0ZV9vdXRlclwiKSlcbitcdFx0Z290byBvdXQ7XG4rXHQvKiBUaGUgdW51c2VkIHRoaXJkIGFycmF5IHNsb3QgYWxzbyBleGVyY2lzZXMgZmFpbGVkIGxvb2t1cHMuICovXG4rXHRmb3IgKGtleSA9IDA7IGtleSBcdTAwM2MgZW50cmllczsga2V5KyspXG4rXHRcdGlmICghQVNTRVJUX09LKGJwZl9tYXBfdXBkYXRlX2VsZW0ob3V0ZXJfZmQsIFx1MDAyNmtleSwgXHUwMDI2aW5uZXJfZmQsIEJQRl9BTlkpLFxuK1x0XHRcdCAgICAgICBcInBvcHVsYXRlX291dGVyXCIpKVxuK1x0XHRcdGdvdG8gb3V0O1xuK1x0cm9vdF9pZCA9IG1hcF9pZChvdXRlcl9mZCk7XG4rXHRpbm5lcl9pZCA9IG1hcF9pZChpbm5lcl9mZCk7XG4rXHRpZiAoIXJvb3RfaWQgfHwgIWlubmVyX2lkIHx8ICFkdW1wX21hcChyb290X2lkLCBcIi1qXCIsIG91dGVyKSB8fFxuK1x0ICAgICFkdW1wX21hcChpbm5lcl9pZCwgXCItalwiLCBpbm5lcikpXG4rXHRcdGdvdG8gb3V0O1xuK1xuK1x0QVNTRVJUX0VRKG91dGVyWzBdLCAnWycsIFwiZGVmYXVsdF9hcnJheVwiKTtcbitcdEFTU0VSVF9FUShjb3VudF90b2tlbihvdXRlciwgXCJcXFwiZWxlbWVudHNcXFwiOlwiKSwgMCwgXCJkZWZhdWx0X25vX3dyYXBwZXJcIik7XG4rXHRBU1NFUlRfRVEoY291bnRfdG9rZW4ob3V0ZXIsIFwiXFxcImlkXFxcIjpcIiksIDAsIFwiZGVmYXVsdF9ub19oZWFkZXJcIik7XG4rXHRzbnByaW50ZihyZWZlcmVuY2UsIHNpemVvZihyZWZlcmVuY2UpLCBcIlxcXCJpbm5lcl9tYXBfaWRcXFwiOiV1XCIsIGlubmVyX2lkKTtcbitcdEFTU0VSVF9FUShjb3VudF90b2tlbihvdXRlciwgcmVmZXJlbmNlKSwgZW50cmllcywgXCJkZWZhdWx0X3JlZmVyZW5jZXNcIik7XG4rXHRpZiAoIWVudHJpZXMpXG4rXHRcdEFTU0VSVF9TVFJFUShvdXRlciwgXCJbXVwiLCBcImVtcHR5X291dGVyX2RlZmF1bHRcIik7XG4rXHRpZiAoZW1wdHlfaW5uZXIpXG4rXHRcdEFTU0VSVF9TVFJFUShpbm5lciwgXCJbXVwiLCBcImVtcHR5X2lubmVyX2RlZmF1bHRcIik7XG4rXHRlbHNlIGlmICh0eXBlZClcbitcdFx0QVNTRVJUX0hBU19TVUJTVFIoaW5uZXIsIFwiXFxcImZvcm1hdHRlZFxcXCI6e1xcXCJrZXlcXFwiOjAsXFxcInZhbHVlXFxcIjoxNjg0MzAwOX1cIixcbitcdFx0XHRcdCAgXCJ0eXBlZF9pbm5lclwiKTtcbitcdGVsc2VcbitcdFx0QVNTRVJUX1NUUkVRKGlubmVyLFxuK1x0XHRcdCAgICAgXCJbe1xcXCJrZXlcXFwiOltcXFwiMHgwMFxcXCIsXFxcIjB4MDBcXFwiLFxcXCIweDAwXFxcIixcXFwiMHgwMFxcXCJdLFwiXG4rXHRcdFx0ICAgICBcIlxcXCJ2YWx1ZVxcXCI6W1xcXCIweDAxXFxcIixcXFwiMHgwMVxcXCIsXFxcIjB4MDFcXFwiLFxcXCIweDAxXFxcIl19XVwiLFxuK1x0XHRcdCAgICAgXCJvcmRpbmFyeV9kZWZhdWx0XCIpO1xuK1xuK1x0LypcbitcdCAqIENvbXBhcmUgdGhlIGNvbXBsZXRlIEpTT04gZG9jdW1lbnQ6IGEgZmxhdCBhcnJheSB3aXRoIHRoZSByb290IGZpcnN0LFxuK1x0ICogb25lIGNvcHkgb2YgdGhlIHNoYXJlZCBpbm5lciBtYXAsIGFuZCB1bmNoYW5nZWQgZW50cnkgcmVwcmVzZW50YXRpb25zLlxuK1x0ICovXG4rXHRpZiAoZW50cmllcylcbitcdFx0c25wcmludGYoZXhwZWN0ZWQsIHNpemVvZihleHBlY3RlZCksXG4rXHRcdFx0IFwiW3tcXFwiaWRcXFwiOiV1LFxcXCJ0eXBlXFxcIjpcXFwiJXNcXFwiLFxcXCJuYW1lXFxcIjpcXFwiZHVtcF9vdXRlclxcXCIsXCJcbitcdFx0XHQgXCJcXFwiZmxhZ3NcXFwiOjAsXFxcImVsZW1lbnRzXFxcIjolc30se1xcXCJpZFxcXCI6JXUsXFxcInR5cGVcXFwiOlxcXCJoYXNoXFxcIixcIlxuK1x0XHRcdCBcIlxcXCJuYW1lXFxcIjpcXFwiZHVtcF9pbm5lclxcXCIsXFxcImZsYWdzXFxcIjowLFxcXCJlbGVtZW50c1xcXCI6JXN9XVwiLFxuK1x0XHRcdCByb290X2lkLCB0eXBlX25hbWUsIG91dGVyLCBpbm5lcl9pZCwgaW5uZXIpO1xuK1x0ZWxzZVxuK1x0XHRzbnByaW50ZihleHBlY3RlZCwgc2l6ZW9mKGV4cGVjdGVkKSxcbitcdFx0XHQgXCJbe1xcXCJpZFxcXCI6JXUsXFxcInR5cGVcXFwiOlxcXCIlc1xcXCIsXFxcIm5hbWVcXFwiOlxcXCJkdW1wX291dGVyXFxcIixcIlxuK1x0XHRcdCBcIlxcXCJmbGFnc1xcXCI6MCxcXFwiZWxlbWVudHNcXFwiOltdfV1cIiwgcm9vdF9pZCwgdHlwZV9uYW1lKTtcbitcdGlmIChkdW1wX21hcChyb290X2lkLCBcIi1qIC1yXCIsIG91dHB1dCkpXG4rXHRcdEFTU0VSVF9TVFJFUShvdXRwdXQsIGV4cGVjdGVkLCBcInJlY3Vyc2l2ZV9qc29uXCIpO1xuK1x0aWYgKGR1bXBfbWFwKHJvb3RfaWQsIFwiLS1qc29uIC0tcmVjdXJzaXZlXCIsIG91dHB1dCkpXG4rXHRcdEFTU0VSVF9TVFJFUShvdXRwdXQsIGV4cGVjdGVkLCBcInJlY3Vyc2l2ZV9sb25nX29wdGlvbnNcIik7XG4rXHRjaGVja19wbGFpbihyb290X2lkLCBpbm5lcl9pZCwgdHlwZV9uYW1lLCBlbnRyaWVzLCB0eXBlZCk7XG4rXG4rXHQvKiBSZWN1cnNpb24gb24gYW4gb3JkaW5hcnkgbWFwIHN0aWxsIGVtaXRzIGEgc2luZ2xlIG1hcCBvYmplY3QuICovXG4rXHRzbnByaW50ZihleHBlY3RlZCwgc2l6ZW9mKGV4cGVjdGVkKSxcbitcdFx0IFwiW3tcXFwiaWRcXFwiOiV1LFxcXCJ0eXBlXFxcIjpcXFwiaGFzaFxcXCIsXFxcIm5hbWVcXFwiOlxcXCJkdW1wX2lubmVyXFxcIixcIlxuK1x0XHQgXCJcXFwiZmxhZ3NcXFwiOjAsXFxcImVsZW1lbnRzXFxcIjolc31dXCIsIGlubmVyX2lkLCBpbm5lcik7XG4rXHRpZiAoZHVtcF9tYXAoaW5uZXJfaWQsIFwiLWogLXJcIiwgb3V0cHV0KSlcbitcdFx0QVNTRVJUX1NUUkVRKG91dHB1dCwgZXhwZWN0ZWQsIFwib3JkaW5hcnlfcmVjdXJzaXZlXCIpO1xuK291dDpcbitcdGlmIChvdXRlcl9mZCBcdTAwM2U9IDApXG4rXHRcdGNsb3NlKG91dGVyX2ZkKTtcbitcdGlmIChpbm5lcl9mZCBcdTAwM2U9IDApXG4rXHRcdGNsb3NlKGlubmVyX2ZkKTtcbitcdGJ0Zl9fZnJlZShidGYpO1xuK31cbitcbitzdGF0aWMgdm9pZCB0ZXN0X211bHRpcGxlX3Jvb3RzKHZvaWQpXG4re1xuK1x0TElCQlBGX09QVFMoYnBmX21hcF9jcmVhdGVfb3B0cywgb3B0cyk7XG4rXHRjaGFyIGNvbW1hbmRbTUFYX0JQRlRPT0xfQ01EX0xFTl0sIG5hbWVbQlBGX09CSl9OQU1FX0xFTl07XG4rXHRjaGFyIG91dHB1dFtPVVRQVVRfU0laRV0gPSB7fSwgZXhwZWN0ZWRbT1VUUFVUX1NJWkUgKiA0XSwgZWxlbWVudHNbT1VUUFVUX1NJWkVdO1xuK1x0c3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCB0eXBlc1tdID0geyBcImhhc2hcIiwgXCJhcnJheV9vZl9tYXBzXCIsIFwiaGFzaF9vZl9tYXBzXCIsIFwiaGFzaFwiIH07XG4rXHRpbnQgZmRzW10gPSB7IC0xLCAtMSwgLTEsIC0xIH07XG4rXHRfX3UzMiBpZHNbNF0sIGtleTtcbitcdGludCBpLCBsZW4gPSAwO1xuK1xuK1x0LypcbitcdCAqIFNlbGVjdCB0aGUgZmlyc3QgaW5uZXIgbWFwIGFuZCBib3RoIG91dGVycyBhcyByb290cy4gVGhlIG90aGVyIGlubmVyXG4rXHQgKiBtYXAgbXVzdCBiZSBhcHBlbmRlZCBhZnRlciBhbGwgdGhyZWUgcm9vdHMsIGV2ZW4gdGhvdWdoIGl0IGlzIGZvdW5kXG4rXHQgKiB3aGlsZSBkdW1waW5nIHRoZSBmaXJzdCBvdXRlci4gQSBwcm9jZXNzLXNwZWNpZmljIG5hbWUgYXZvaWRzIG90aGVyXG4rXHQgKiB0ZXN0cycgbWFwcyBqb2luaW5nIHRoZSBzZWxlY3Rpb24uXG4rXHQgKi9cbitcdHNucHJpbnRmKG5hbWUsIHNpemVvZihuYW1lKSwgXCJkdW1wXyV1XCIsIGdldHBpZCgpKTtcbitcdGZkc1swXSA9IGJwZl9tYXBfY3JlYXRlKEJQRl9NQVBfVFlQRV9IQVNILCBuYW1lLCA0LCA0LCAxLCBOVUxMKTtcbitcdGlmICghQVNTRVJUX09LX0ZEKGZkc1swXSwgXCJjcmVhdGVfc2VsZWN0ZWRfaW5uZXJcIikpXG4rXHRcdGdvdG8gb3V0O1xuK1x0ZmRzWzNdID0gYnBmX21hcF9jcmVhdGUoQlBGX01BUF9UWVBFX0hBU0gsIFwiZHVtcF9kaXNjb3ZlcmVkXCIsIDQsIDQsIDEsIE5VTEwpO1xuK1x0aWYgKCFBU1NFUlRfT0tfRkQoZmRzWzNdLCBcImNyZWF0ZV9kaXNjb3ZlcmVkX2lubmVyXCIpKVxuK1x0XHRnb3RvIG91dDtcbitcdG9wdHMuaW5uZXJfbWFwX2ZkID0gZmRzWzBdO1xuK1x0ZmRzWzFdID0gYnBmX21hcF9jcmVhdGUoQlBGX01BUF9UWVBFX0FSUkFZX09GX01BUFMsIG5hbWUsIDQsIDQsIDIsIFx1MDAyNm9wdHMpO1xuK1x0aWYgKCFBU1NFUlRfT0tfRkQoZmRzWzFdLCBcImNyZWF0ZV9hcnJheV9yb290XCIpKVxuK1x0XHRnb3RvIG91dDtcbitcdGZkc1syXSA9IGJwZl9tYXBfY3JlYXRlKEJQRl9NQVBfVFlQRV9IQVNIX09GX01BUFMsIG5hbWUsIDQsIDQsIDIsIFx1MDAyNm9wdHMpO1xuK1x0aWYgKCFBU1NFUlRfT0tfRkQoZmRzWzJdLCBcImNyZWF0ZV9oYXNoX3Jvb3RcIikpXG4rXHRcdGdvdG8gb3V0O1xuK1x0Zm9yIChpID0gMTsgaSBcdTAwM2M9IDI7IGkrKykge1xuK1x0XHRrZXkgPSAwO1xuK1x0XHRpZiAoIUFTU0VSVF9PSyhicGZfbWFwX3VwZGF0ZV9lbGVtKGZkc1tpXSwgXHUwMDI2a2V5LCBcdTAwMjZmZHNbMF0sIEJQRl9BTlkpLFxuK1x0XHRcdCAgICAgICBcInJlZmVyZW5jZV9zZWxlY3RlZF9pbm5lclwiKSlcbitcdFx0XHRnb3RvIG91dDtcbitcdFx0a2V5ID0gMTtcbitcdFx0aWYgKCFBU1NFUlRfT0soYnBmX21hcF91cGRhdGVfZWxlbShmZHNbaV0sIFx1MDAyNmtleSwgXHUwMDI2ZmRzWzNdLCBCUEZfQU5ZKSxcbitcdFx0XHQgICAgICAgXCJyZWZlcmVuY2VfZGlzY292ZXJlZF9pbm5lclwiKSlcbitcdFx0XHRnb3RvIG91dDtcbitcdH1cbitcdGZvciAoaSA9IDA7IGkgXHUwMDNjIEFSUkFZX1NJWkUoZmRzKTsgaSsrKSB7XG4rXHRcdGlkc1tpXSA9IG1hcF9pZChmZHNbaV0pO1xuK1x0XHRpZiAoIWlkc1tpXSB8fCAhZHVtcF9tYXAoaWRzW2ldLCBcIi1qXCIsIGVsZW1lbnRzKSlcbitcdFx0XHRnb3RvIG91dDtcbitcdFx0bGVuICs9IHNucHJpbnRmKGV4cGVjdGVkICsgbGVuLCBzaXplb2YoZXhwZWN0ZWQpIC0gbGVuLFxuK1x0XHRcdFx0XCIlc3tcXFwiaWRcXFwiOiV1LFxcXCJ0eXBlXFxcIjpcXFwiJXNcXFwiLFxcXCJuYW1lXFxcIjpcXFwiJXNcXFwiLFwiXG4rXHRcdFx0XHRcIlxcXCJmbGFnc1xcXCI6MCxcXFwiZWxlbWVudHNcXFwiOiVzfSVzXCIsXG4rXHRcdFx0XHRpID8gXCIsXCIgOiBcIltcIiwgaWRzW2ldLCB0eXBlc1tpXSxcbitcdFx0XHRcdGkgPT0gMyA/IFwiZHVtcF9kaXNjb3ZlcmVkXCIgOiBuYW1lLCBlbGVtZW50cywgaSA9PSAzID8gXCJdXCIgOiBcIlwiKTtcbitcdH1cbitcdHNucHJpbnRmKGNvbW1hbmQsIHNpemVvZihjb21tYW5kKSwgXCItaiAtciBtYXAgZHVtcCBuYW1lICVzXCIsIG5hbWUpO1xuK1x0aWYgKEFTU0VSVF9PSyhnZXRfYnBmdG9vbF9jb21tYW5kX291dHB1dChjb21tYW5kLCBvdXRwdXQsIHNpemVvZihvdXRwdXQpIC0gMSksXG4rXHRcdCAgICAgIFwiZHVtcF9tdWx0aXBsZV9yb290c1wiKSkge1xuK1x0XHRvdXRwdXRbc3RyY3NwbihvdXRwdXQsIFwiXFxuXCIpXSA9ICdcXDAnO1xuK1x0XHRBU1NFUlRfU1RSRVEob3V0cHV0LCBleHBlY3RlZCwgXCJyb290c19maXJzdF9hbmRfc2VlZF9kZWR1cFwiKTtcbitcdH1cbitvdXQ6XG4rXHRmb3IgKGkgPSAwOyBpIFx1MDAzYyBBUlJBWV9TSVpFKGZkcyk7IGkrKylcbitcdFx0aWYgKGZkc1tpXSBcdTAwM2U9IDApXG4rXHRcdFx0Y2xvc2UoZmRzW2ldKTtcbit9XG4rXG4rc3RhdGljIHZvaWQgdGVzdF91bnJlYWRhYmxlKGJvb2wgb3V0ZXIpXG4re1xuK1x0TElCQlBGX09QVFMoYnBmX21hcF9jcmVhdGVfb3B0cywgb3B0cyk7XG4rXHRjaGFyIGVsZW1lbnRzW09VVFBVVF9TSVpFXSwgb3V0cHV0W09VVFBVVF9TSVpFXSwgcm9vdFtPVVRQVVRfU0laRV07XG4rXHRjaGFyIGV4cGVjdGVkW09VVFBVVF9TSVpFICogM10sIHBsYWluW09VVFBVVF9TSVpFXSA9IHt9O1xuK1x0Y2hhciBjb21tYW5kW01BWF9CUEZUT09MX0NNRF9MRU5dO1xuK1x0aW50IGlubmVyX2ZkID0gLTEsIG91dGVyX2ZkID0gLTEsIGxvb2t1cF9lcnJubztcbitcdF9fdTMyIGlubmVyX2lkLCByb290X2lkLCBrZXkgPSAwLCB2YWx1ZTtcbitcbitcdC8qXG4rXHQgKiBFdmVyeSBrZXkgaXMgZW51bWVyYWJsZSwgYnV0IFBFUkZfRVZFTlRfQVJSQVkgbG9va3VwIHJldHVybnNcbitcdCAqIEVOT1RTVVBQICh0aGUga2VybmVsLWludGVybmFsIGVycm5vKS4gQ2hlY2sgYm90aCBlbnRyaWVzIHNvIGFuXG4rXHQgKiBlYXJseSBleGl0IG9uIHRoZSBmaXJzdCBsb29rdXAgZmFpbHVyZSBjYW5ub3QgcGFzcy5cbitcdCAqL1xuK1x0aW5uZXJfZmQgPSBicGZfbWFwX2NyZWF0ZShCUEZfTUFQX1RZUEVfUEVSRl9FVkVOVF9BUlJBWSwgXCJkdW1wX3VucmVhZGFibGVcIixcbitcdFx0XHRcdCAgc2l6ZW9mKGtleSksIHNpemVvZih2YWx1ZSksIDIsIE5VTEwpO1xuK1x0aWYgKCFBU1NFUlRfT0tfRkQoaW5uZXJfZmQsIFwiY3JlYXRlX3VucmVhZGFibGVcIikpXG4rXHRcdGdvdG8gb3V0O1xuK1x0aWYgKCFBU1NFUlRfTFQoYnBmX21hcF9sb29rdXBfZWxlbShpbm5lcl9mZCwgXHUwMDI2a2V5LCBcdTAwMjZ2YWx1ZSksIDAsXG4rXHRcdCAgICAgICBcInVucmVhZGFibGVfbG9va3VwXCIpKVxuK1x0XHRnb3RvIG91dDtcbitcdGxvb2t1cF9lcnJubyA9IGVycm5vO1xuK1x0aWYgKCFBU1NFUlRfTkVRKGxvb2t1cF9lcnJubywgRU5PRU5ULCBcInVucmVhZGFibGVfbm90X21pc3NpbmdcIikpXG4rXHRcdGdvdG8gb3V0O1xuK1x0aW5uZXJfaWQgPSBtYXBfaWQoaW5uZXJfZmQpO1xuK1x0aWYgKCFpbm5lcl9pZCB8fCAhZHVtcF9tYXAoaW5uZXJfaWQsIFwiLWpcIiwgZWxlbWVudHMpKVxuK1x0XHRnb3RvIG91dDtcbitcdEFTU0VSVF9FUShjb3VudF90b2tlbihlbGVtZW50cywgXCJcXFwiZXJyb3JcXFwiOlwiKSwgMiwgXCJkZWZhdWx0X2pzb25fZXJyb3JzXCIpO1xuK1x0c25wcmludGYoY29tbWFuZCwgc2l6ZW9mKGNvbW1hbmQpLCBcIm1hcCBkdW1wIGlkICV1XCIsIGlubmVyX2lkKTtcbitcdGlmICghQVNTRVJUX09LKGdldF9icGZ0b29sX2NvbW1hbmRfb3V0cHV0KGNvbW1hbmQsIHBsYWluLCBzaXplb2YocGxhaW4pIC0gMSksXG4rXHRcdCAgICAgICBcImRlZmF1bHRfcGxhaW5fdW5yZWFkYWJsZVwiKSlcbitcdFx0Z290byBvdXQ7XG4rXHRBU1NFUlRfRVEoY291bnRfdG9rZW4ocGxhaW4sIHN0cmVycm9yKGxvb2t1cF9lcnJubykpLCAyLCBcImRlZmF1bHRfcGxhaW5fZXJyb3JzXCIpO1xuK1x0QVNTRVJUX0hBU19TVUJTVFIocGxhaW4sIFwiRm91bmQgMCBlbGVtZW50c1wiLCBcImRlZmF1bHRfcGxhaW5fY291bnRcIik7XG4rXG4rXHRyb290X2lkID0gaW5uZXJfaWQ7XG4rXHRpZiAob3V0ZXIpIHtcbitcdFx0b3B0cy5pbm5lcl9tYXBfZmQgPSBpbm5lcl9mZDtcbitcdFx0b3V0ZXJfZmQgPSBicGZfbWFwX2NyZWF0ZShCUEZfTUFQX1RZUEVfQVJSQVlfT0ZfTUFQUywgXCJkdW1wX291dGVyXCIsXG4rXHRcdFx0XHRcdCAgc2l6ZW9mKGtleSksIHNpemVvZih2YWx1ZSksIDEsIFx1MDAyNm9wdHMpO1xuK1x0XHRpZiAoIUFTU0VSVF9PS19GRChvdXRlcl9mZCwgXCJjcmVhdGVfb3V0ZXJcIikgfHxcbitcdFx0ICAgICFBU1NFUlRfT0soYnBmX21hcF91cGRhdGVfZWxlbShvdXRlcl9mZCwgXHUwMDI2a2V5LCBcdTAwMjZpbm5lcl9mZCwgQlBGX0FOWSksXG4rXHRcdFx0ICAgICAgIFwicG9wdWxhdGVfb3V0ZXJcIikpXG4rXHRcdFx0Z290byBvdXQ7XG4rXHRcdHJvb3RfaWQgPSBtYXBfaWQob3V0ZXJfZmQpO1xuK1x0XHRpZiAoIXJvb3RfaWQgfHwgIWR1bXBfbWFwKHJvb3RfaWQsIFwiLWpcIiwgcm9vdCkpXG4rXHRcdFx0Z290byBvdXQ7XG4rXHRcdHNucHJpbnRmKGV4cGVjdGVkLCBzaXplb2YoZXhwZWN0ZWQpLFxuK1x0XHRcdCBcIlt7XFxcImlkXFxcIjoldSxcXFwidHlwZVxcXCI6XFxcImFycmF5X29mX21hcHNcXFwiLFxcXCJuYW1lXFxcIjpcXFwiZHVtcF9vdXRlclxcXCIsXCJcbitcdFx0XHQgXCJcXFwiZmxhZ3NcXFwiOjAsXFxcImVsZW1lbnRzXFxcIjolc30se1xcXCJpZFxcXCI6JXUsXCJcbitcdFx0XHQgXCJcXFwidHlwZVxcXCI6XFxcInBlcmZfZXZlbnRfYXJyYXlcXFwiLFxcXCJuYW1lXFxcIjpcXFwiZHVtcF91bnJlYWRhYmxlXFxcIixcIlxuK1x0XHRcdCBcIlxcXCJmbGFnc1xcXCI6MCxcXFwiZWxlbWVudHNcXFwiOiVzfV1cIiwgcm9vdF9pZCwgcm9vdCwgaW5uZXJfaWQsIGVsZW1lbnRzKTtcbitcdH0gZWxzZSB7XG4rXHRcdHNucHJpbnRmKGV4cGVjdGVkLCBzaXplb2YoZXhwZWN0ZWQpLFxuK1x0XHRcdCBcIlt7XFxcImlkXFxcIjoldSxcXFwidHlwZVxcXCI6XFxcInBlcmZfZXZlbnRfYXJyYXlcXFwiLFwiXG4rXHRcdFx0IFwiXFxcIm5hbWVcXFwiOlxcXCJkdW1wX3VucmVhZGFibGVcXFwiLFxcXCJmbGFnc1xcXCI6MCxcXFwiZWxlbWVudHNcXFwiOiVzfV1cIixcbitcdFx0XHQgaW5uZXJfaWQsIGVsZW1lbnRzKTtcbitcdH1cbitcdGlmIChkdW1wX21hcChyb290X2lkLCBcIi1qIC1yXCIsIG91dHB1dCkpXG4rXHRcdEFTU0VSVF9TVFJFUShvdXRwdXQsIGV4cGVjdGVkLCBcInJlY3Vyc2l2ZV91bnJlYWRhYmxlX2pzb25cIik7XG4rXHRtZW1zZXQob3V0cHV0LCAwLCBzaXplb2Yob3V0cHV0KSk7XG4rXHRzbnByaW50Zihjb21tYW5kLCBzaXplb2YoY29tbWFuZCksIFwiLXIgbWFwIGR1bXAgaWQgJXVcIiwgcm9vdF9pZCk7XG4rXHRpZiAoQVNTRVJUX09LKGdldF9icGZ0b29sX2NvbW1hbmRfb3V0cHV0KGNvbW1hbmQsIG91dHB1dCwgc2l6ZW9mKG91dHB1dCkgLSAxKSxcbitcdFx0ICAgICAgXCJyZWN1cnNpdmVfdW5yZWFkYWJsZV9wbGFpblwiKSkge1xuK1x0XHRBU1NFUlRfSEFTX1NVQlNUUihvdXRwdXQsIHBsYWluLCBcInJlY3Vyc2l2ZV9wbGFpbl9wcmVzZXJ2ZXNfZXJyb3JzXCIpO1xuK1x0XHRBU1NFUlRfRVEoY291bnRfdG9rZW4ob3V0cHV0LCBzdHJlcnJvcihsb29rdXBfZXJybm8pKSwgMixcbitcdFx0XHQgIFwicmVjdXJzaXZlX3BsYWluX2Vycm9yc1wiKTtcbitcdFx0QVNTRVJUX0VRKGNvdW50X3Rva2VuKG91dHB1dCwgXCJGb3VuZCBcIiksIG91dGVyID8gMiA6IDEsXG4rXHRcdFx0ICBcInJlY3Vyc2l2ZV9wbGFpbl9tYXBzXCIpO1xuK1x0fVxuK291dDpcbitcdGlmIChvdXRlcl9mZCBcdTAwM2U9IDApXG4rXHRcdGNsb3NlKG91dGVyX2ZkKTtcbitcdGlmIChpbm5lcl9mZCBcdTAwM2U9IDApXG4rXHRcdGNsb3NlKGlubmVyX2ZkKTtcbit9XG4rXG4rc3RhdGljIHZvaWQgdGVzdF9tYW55X2lubmVyX21hcHMoYm9vbCBqc29uKVxuK3tcbitcdGVudW0ge1xuK1x0XHREVU1QX09LLFxuK1x0XHREVU1QX0VSUl9STElNSVQsXG4rXHRcdERVTVBfRVJSX0NPTU1BTkQsXG4rXHRcdERVTVBfRVJSX0NPVU5UUyxcbitcdFx0RFVNUF9FUlJfSURTLFxuK1x0XHREVU1QX0VSUl9KU09OLFxuK1x0XHREVU1QX0VSUl9GRFMsXG4rXHR9O1xuK1x0TElCQlBGX09QVFMoYnBmX21hcF9jcmVhdGVfb3B0cywgb3B0cyk7XG4rXHRjb25zdCBzdHJ1Y3QgcmxpbWl0IGxpbWl0ID0geyAucmxpbV9jdXIgPSAzMiwgLnJsaW1fbWF4ID0gMzIgfTtcbitcdGNoYXIgY29tbWFuZFtNQVhfQlBGVE9PTF9DTURfTEVOXSwgdG9rZW5bNjRdO1xuK1x0X191MzIgaWRzWzY0XSwgcm9vdF9pZCwga2V5O1xuK1x0aW50IGlubmVyX2ZkID0gLTEsIG91dGVyX2ZkID0gLTEsIHN0YXR1cztcbitcdGludCBpbmhlcml0ZWRfZmRzWzMyXSwgbnJfaW5oZXJpdGVkID0gMCwgaTtcbitcdGNoYXIgKm91dHB1dCA9IE5VTEw7XG4rXHRwaWRfdCBwaWQ7XG4rXG4rXHRpbm5lcl9mZCA9IGJwZl9tYXBfY3JlYXRlKEJQRl9NQVBfVFlQRV9IQVNILCBcImR1bXBfaW5uZXJcIiwgNCwgNCwgMSwgTlVMTCk7XG4rXHRpZiAoIUFTU0VSVF9PS19GRChpbm5lcl9mZCwgXCJjcmVhdGVfdGVtcGxhdGVcIikpXG4rXHRcdGdvdG8gb3V0O1xuK1x0b3B0cy5pbm5lcl9tYXBfZmQgPSBpbm5lcl9mZDtcbitcdG91dGVyX2ZkID0gYnBmX21hcF9jcmVhdGUoQlBGX01BUF9UWVBFX0FSUkFZX09GX01BUFMsIFwiZHVtcF9vdXRlclwiLCA0LCA0LFxuK1x0XHRcdFx0ICBBUlJBWV9TSVpFKGlkcyksIFx1MDAyNm9wdHMpO1xuK1x0Y2xvc2UoaW5uZXJfZmQpO1xuK1x0aW5uZXJfZmQgPSAtMTtcbitcdGlmICghQVNTRVJUX09LX0ZEKG91dGVyX2ZkLCBcImNyZWF0ZV9vdXRlclwiKSlcbitcdFx0Z290byBvdXQ7XG4rXHRmb3IgKGtleSA9IDA7IGtleSBcdTAwM2MgQVJSQVlfU0laRShpZHMpOyBrZXkrKykge1xuK1x0XHRpbm5lcl9mZCA9IGJwZl9tYXBfY3JlYXRlKEJQRl9NQVBfVFlQRV9IQVNILCBcImR1bXBfaW5uZXJcIiwgNCwgNCwgMSwgTlVMTCk7XG4rXHRcdGlmICghQVNTRVJUX09LX0ZEKGlubmVyX2ZkLCBcImNyZWF0ZV9pbm5lclwiKSB8fFxuK1x0XHQgICAgIUFTU0VSVF9PSyhicGZfbWFwX3VwZGF0ZV9lbGVtKG91dGVyX2ZkLCBcdTAwMjZrZXksIFx1MDAyNmlubmVyX2ZkLCBCUEZfQU5ZKSxcbitcdFx0XHQgICAgICAgXCJwb3B1bGF0ZV9vdXRlclwiKSlcbitcdFx0XHRnb3RvIG91dDtcbitcdFx0aWRzW2tleV0gPSBtYXBfaWQoaW5uZXJfZmQpO1xuK1x0XHRpZiAoIWlkc1trZXldKVxuK1x0XHRcdGdvdG8gb3V0O1xuK1x0XHQvKiBUaGUgb3V0ZXIgbWFwIGtlZXBzIGVhY2ggZGlzdGluY3QgaW5uZXIgbWFwIGFsaXZlLiAqL1xuK1x0XHRjbG9zZShpbm5lcl9mZCk7XG4rXHRcdGlubmVyX2ZkID0gLTE7XG4rXHR9XG4rXHRyb290X2lkID0gbWFwX2lkKG91dGVyX2ZkKTtcbitcdG91dHB1dCA9IGNhbGxvYygxLCA2NTUzNik7XG4rXHRpZiAoIXJvb3RfaWQgfHwgIUFTU0VSVF9PS19QVFIob3V0cHV0LCBcImFsbG9jYXRlX291dHB1dFwiKSlcbitcdFx0Z290byBvdXQ7XG4rXG4rXHQvKiBGaWxsIHRoZSBsb3cgRkQgc2xvdHMgdG8gZXhlcmNpc2UgaW5oZXJpdGVkIGRlc2NyaXB0b3IgY2xlYW51cC4gKi9cbitcdGZvciAoaSA9IDA7IGkgXHUwMDNjIEFSUkFZX1NJWkUoaW5oZXJpdGVkX2Zkcyk7IGkrKykge1xuK1x0XHRpbnQgZmQgPSBvcGVuKFwiL2Rldi9udWxsXCIsIE9fUkRPTkxZKTtcbitcbitcdFx0aWYgKCFBU1NFUlRfT0tfRkQoZmQsIFwib3Blbl9pbmhlcml0ZWRfZmRcIikpXG4rXHRcdFx0Z290byBvdXQ7XG4rXHRcdGluaGVyaXRlZF9mZHNbbnJfaW5oZXJpdGVkKytdID0gZmQ7XG4rXHR9XG4rXG4rXHQvKlxuK1x0ICogQ3JlYXRlIGFsbCBmaXh0dXJlcyBiZWZvcmUgbG93ZXJpbmcgdGhlIGxpbWl0LCBhbmQga2VlcCB0aGUgdGVzdFxuK1x0ICogcnVubmVyJ3MgbGltaXQgdW5jaGFuZ2VkLiBSZXRhaW5pbmcgZXZlcnkgZGlzY292ZXJlZCBGRCB3b3VsZCBleGNlZWRcbitcdCAqIHRoaXMgbGltaXQgYmVmb3JlIHRoZSByZWN1cnNpdmUgZHVtcCBjb3VsZCB2aXNpdCBhbGwgaW5uZXIgbWFwcy5cbitcdCAqL1xuK1x0cGlkID0gZm9yaygpO1xuK1x0aWYgKCFBU1NFUlRfR0UocGlkLCAwLCBcImZvcmtcIikpXG4rXHRcdGdvdG8gb3V0O1xuK1x0aWYgKCFwaWQpIHtcbitcdFx0c3RydWN0IGRpcmVudCAqZW50cnk7XG4rXHRcdERJUiAqZGlyO1xuK1xuK1x0XHQvKiBSZXNlcnZlIGEgc2xvdCBmb3IgdGhlIGRpcmVjdG9yeSBldmVuIGlmIHRoZSBwYXJlbnQgaXMgZnVsbC4gKi9cbitcdFx0Y2xvc2UoaW5oZXJpdGVkX2Zkc1tucl9pbmhlcml0ZWQgLSAxXSk7XG4rXHRcdGRpciA9IG9wZW5kaXIoXCIvcHJvYy9zZWxmL2ZkXCIpO1xuK1x0XHRpZiAoIWRpcilcbitcdFx0XHRfZXhpdChEVU1QX0VSUl9GRFMpO1xuK1x0XHQvKiBUaGUgcGFyZW50IGtlZXBzIHRoZSBvdXRlciBtYXAgYW5kIGl0cyBpbm5lciBtYXBzIGFsaXZlLiAqL1xuK1x0XHRmb3IgKDs7KSB7XG4rXHRcdFx0Y2hhciAqZW5kO1xuK1x0XHRcdGxvbmcgZmQ7XG4rXG4rXHRcdFx0ZXJybm8gPSAwO1xuK1x0XHRcdGVudHJ5ID0gcmVhZGRpcihkaXIpO1xuK1x0XHRcdGlmICghZW50cnkpIHtcbitcdFx0XHRcdGlmIChlcnJubylcbitcdFx0XHRcdFx0X2V4aXQoRFVNUF9FUlJfRkRTKTtcbitcdFx0XHRcdGJyZWFrO1xuK1x0XHRcdH1cbitcdFx0XHRmZCA9IHN0cnRvbChlbnRyeS1cdTAwM2VkX25hbWUsIFx1MDAyNmVuZCwgMTApO1xuK1x0XHRcdGlmICgqZW5kIHx8IGZkIFx1MDAzYyAzIHx8IGZkID09IGRpcmZkKGRpcikpXG4rXHRcdFx0XHRjb250aW51ZTtcbitcdFx0XHRjbG9zZShmZCk7XG4rXHRcdH1cbitcdFx0aWYgKGNsb3NlZGlyKGRpcikpXG4rXHRcdFx0X2V4aXQoRFVNUF9FUlJfRkRTKTtcbitcdFx0aWYgKHNldHJsaW1pdChSTElNSVRfTk9GSUxFLCBcdTAwMjZsaW1pdCkpXG4rXHRcdFx0X2V4aXQoRFVNUF9FUlJfUkxJTUlUKTtcbitcdFx0c25wcmludGYoY29tbWFuZCwgc2l6ZW9mKGNvbW1hbmQpLCBcIiVzIC1yIG1hcCBkdW1wIGlkICV1XCIsXG4rXHRcdFx0IGpzb24gPyBcIi1qXCIgOiBcIlwiLCByb290X2lkKTtcbitcdFx0aWYgKGdldF9icGZ0b29sX2NvbW1hbmRfb3V0cHV0KGNvbW1hbmQsIG91dHB1dCwgNjU1MzUpKVxuK1x0XHRcdF9leGl0KERVTVBfRVJSX0NPTU1BTkQpO1xuK1x0XHRpZiAoY291bnRfdG9rZW4ob3V0cHV0LCBqc29uID8gXCJcXFwiaWRcXFwiOlwiIDogXCJGb3VuZCBcIikgIT0gQVJSQVlfU0laRShpZHMpICsgMSB8fFxuK1x0XHQgICAgY291bnRfdG9rZW4ob3V0cHV0LCBqc29uID8gXCJcXFwiaW5uZXJfbWFwX2lkXFxcIjpcIiA6IFwiaW5uZXJfbWFwX2lkOlwiKSAhPVxuK1x0XHQgICAgQVJSQVlfU0laRShpZHMpKVxuK1x0XHRcdF9leGl0KERVTVBfRVJSX0NPVU5UUyk7XG4rXHRcdGZvciAoa2V5ID0gMDsga2V5IFx1MDAzYyBBUlJBWV9TSVpFKGlkcyk7IGtleSsrKSB7XG4rXHRcdFx0aWYgKGpzb24pXG4rXHRcdFx0XHRzbnByaW50Zih0b2tlbiwgc2l6ZW9mKHRva2VuKSwgXCJcXFwiaWRcXFwiOiV1LFwiLCBpZHNba2V5XSk7XG4rXHRcdFx0ZWxzZVxuK1x0XHRcdFx0c25wcmludGYodG9rZW4sIHNpemVvZih0b2tlbiksIFwiXFxuJXU6IGhhc2ggIG5hbWUgZHVtcF9pbm5lciAgXCIsXG4rXHRcdFx0XHRcdCBpZHNba2V5XSk7XG4rXHRcdFx0aWYgKGNvdW50X3Rva2VuKG91dHB1dCwgdG9rZW4pICE9IDEpXG4rXHRcdFx0XHRfZXhpdChEVU1QX0VSUl9JRFMpO1xuK1x0XHR9XG4rXHRcdGlmIChqc29uIFx1MDAyNlx1MDAyNiAob3V0cHV0WzBdICE9ICdbJyB8fFxuK1x0XHRcdCAgICAgc3RyY21wKG91dHB1dCArIHN0cmxlbihvdXRwdXQpIC0gMiwgXCJdXFxuXCIpKSlcbitcdFx0XHRfZXhpdChEVU1QX0VSUl9KU09OKTtcbitcdFx0X2V4aXQoRFVNUF9PSyk7XG4rXHR9XG4rXHRpZiAoQVNTRVJUX0VRKHdhaXRwaWQocGlkLCBcdTAwMjZzdGF0dXMsIDApLCBwaWQsIFwid2FpdHBpZFwiKSBcdTAwMjZcdTAwMjZcbitcdCAgICBBU1NFUlRfVFJVRShXSUZFWElURUQoc3RhdHVzKSwgXCJjaGlsZF9leGl0ZWRcIikpXG4rXHRcdEFTU0VSVF9FUShXRVhJVFNUQVRVUyhzdGF0dXMpLCBEVU1QX09LLCBcImR1bXBfd2l0aF9sb3dfZmRfbGltaXRcIik7XG4rXHRmb3IgKGkgPSAwOyBpIFx1MDAzYyBucl9pbmhlcml0ZWQ7IGkrKylcbitcdFx0QVNTRVJUX0dFKGZjbnRsKGluaGVyaXRlZF9mZHNbaV0sIEZfR0VURkQpLCAwLCBcInBhcmVudF9mZF9wcmVzZXJ2ZWRcIik7XG4rXHRBU1NFUlRfRVEobWFwX2lkKG91dGVyX2ZkKSwgcm9vdF9pZCwgXCJwYXJlbnRfb3V0ZXJfcHJlc2VydmVkXCIpO1xuK291dDpcbitcdHdoaWxlIChucl9pbmhlcml0ZWQpXG4rXHRcdGNsb3NlKGluaGVyaXRlZF9mZHNbLS1ucl9pbmhlcml0ZWRdKTtcbitcdGZyZWUob3V0cHV0KTtcbitcdGlmIChvdXRlcl9mZCBcdTAwM2U9IDApXG4rXHRcdGNsb3NlKG91dGVyX2ZkKTtcbitcdGlmIChpbm5lcl9mZCBcdTAwM2U9IDApXG4rXHRcdGNsb3NlKGlubmVyX2ZkKTtcbit9XG4rXG4rdm9pZCB0ZXN0X2JwZnRvb2xfbWFwX2R1bXAodm9pZClcbit7XG4rXHRpZiAodGVzdF9fc3RhcnRfc3VidGVzdChcInVucmVhZGFibGVfb3JkaW5hcnlcIikpXG4rXHRcdHRlc3RfdW5yZWFkYWJsZShmYWxzZSk7XG4rXHRpZiAodGVzdF9fc3RhcnRfc3VidGVzdChcInVucmVhZGFibGVfaW5uZXJcIikpXG4rXHRcdHRlc3RfdW5yZWFkYWJsZSh0cnVlKTtcbitcdGlmICh0ZXN0X19zdGFydF9zdWJ0ZXN0KFwibWFueV9pbm5lcl9tYXBzX2pzb25cIikpXG4rXHRcdHRlc3RfbWFueV9pbm5lcl9tYXBzKHRydWUpO1xuK1x0aWYgKHRlc3RfX3N0YXJ0X3N1YnRlc3QoXCJtYW55X2lubmVyX21hcHNfcGxhaW5cIikpXG4rXHRcdHRlc3RfbWFueV9pbm5lcl9tYXBzKGZhbHNlKTtcbitcdGlmICh0ZXN0X19zdGFydF9zdWJ0ZXN0KFwibXVsdGlwbGVfcm9vdHNcIikpXG4rXHRcdHRlc3RfbXVsdGlwbGVfcm9vdHMoKTtcbitcdGlmICh0ZXN0X19zdGFydF9zdWJ0ZXN0KFwiYXJyYXlfb2ZfbWFwc1wiKSlcbitcdFx0dGVzdF9vdXRlcihCUEZfTUFQX1RZUEVfQVJSQVlfT0ZfTUFQUywgMSwgZmFsc2UsIGZhbHNlKTtcbitcdGlmICh0ZXN0X19zdGFydF9zdWJ0ZXN0KFwiaGFzaF9vZl9tYXBzXCIpKVxuK1x0XHR0ZXN0X291dGVyKEJQRl9NQVBfVFlQRV9IQVNIX09GX01BUFMsIDEsIGZhbHNlLCBmYWxzZSk7XG4rXHRpZiAodGVzdF9fc3RhcnRfc3VidGVzdChcInNoYXJlZF9pbm5lclwiKSlcbitcdFx0dGVzdF9vdXRlcihCUEZfTUFQX1RZUEVfQVJSQVlfT0ZfTUFQUywgMiwgZmFsc2UsIGZhbHNlKTtcbitcdGlmICh0ZXN0X19zdGFydF9zdWJ0ZXN0KFwiZW1wdHlfYXJyYXlfb2ZfbWFwc1wiKSlcbitcdFx0dGVzdF9vdXRlcihCUEZfTUFQX1RZUEVfQVJSQVlfT0ZfTUFQUywgMCwgZmFsc2UsIGZhbHNlKTtcbitcdGlmICh0ZXN0X19zdGFydF9zdWJ0ZXN0KFwiZW1wdHlfaGFzaF9vZl9tYXBzXCIpKVxuK1x0XHR0ZXN0X291dGVyKEJQRl9NQVBfVFlQRV9IQVNIX09GX01BUFMsIDAsIGZhbHNlLCBmYWxzZSk7XG4rXHRpZiAodGVzdF9fc3RhcnRfc3VidGVzdChcImJ0Zl9pbm5lclwiKSlcbitcdFx0dGVzdF9vdXRlcihCUEZfTUFQX1RZUEVfSEFTSF9PRl9NQVBTLCAxLCBmYWxzZSwgdHJ1ZSk7XG4rXHRpZiAodGVzdF9fc3RhcnRfc3VidGVzdChcImVtcHR5X2lubmVyXCIpKVxuK1x0XHR0ZXN0X291dGVyKEJQRl9NQVBfVFlQRV9IQVNIX09GX01BUFMsIDEsIHRydWUsIGZhbHNlKTtcbit9XG4iLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOS0xMVQwNDowMDowMy4wODMyODcxMDFaIiwiU2VxIjozLCJOZXN0aW5nIjoyLCJUeXBlIjoibGxtIiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuNy1mbGFzaCIsIkR1cmF0aW9uIjoyNzMzODY5NDk0LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIqKk15IEFzc2Vzc21lbnQgb2YgdGhlIFBhdGNoKipcblxuT2theSwgc28gdGhlIGRpZmYgaXMgcHJldHR5IGZvY3VzZWQuIExvb2tpbmcgYXQgdGhlIGNoYW5nZXMsIGl0J3MgYWxsIGNvbnRhaW5lZCB3aXRoaW4gdGhlIGB0b29scy9gIGRpcmVjdG9yeSwgc3BlY2lmaWNhbGx5IGFyb3VuZCBgYnBmdG9vbGAgYW5kIGEgcmVsYXRlZCBzZWxmLXRlc3QuIExldCdzIHNlZS4uLlxuXG5CYXNlZCBvbiBteSB1bmRlcnN0YW5kaW5nIG9mIG91ciBydWxlcywgc3BlY2lmaWNhbGx5IFNlY3Rpb24gMiwgdGhpcyAqc2hvdWxkKiBiZSBhIHN0cmFpZ2h0Zm9yd2FyZCBcIldvcnRoRnV6emluZz1mYWxzZVwiIHNjZW5hcmlvLiBUaGUgbmVnYXRpdmUgY3JpdGVyaWEgYXJlIGNsZWFyIGhlcmU6IG5vbi1rZXJuZWwsIG5vbi1leGVjdXRhYmxlIGNoYW5nZXMuIFRoZSBtb2RpZmljYXRpb25zIHNlZW0gdG8gYmUgbGltaXRlZCB0byBkb2N1bWVudGF0aW9uIChgYnBmdG9vbC1tYXAucnN0YCksIGJhc2ggY29tcGxldGlvbiBzY3JpcHRzIChgYnBmdG9vbGApLCB0aGUgbWFpbiBhcHBsaWNhdGlvbiBjb2RlLCBoZWFkZXIgZmlsZXMgYW5kIHRoZSB1bml0IHRlc3RzLiBOb25lIG9mIHRoZXNlIGNoYW5nZXMgc2hvdWxkIGltcGFjdCB0aGUgY29tcGlsZWQga2VybmVsIGltYWdlIChgdm1saW51eGApIG9yIGFueSBrZXJuZWwgbW9kdWxlcy4gSXQncyBlc3NlbnRpYWxseSB1c2VyLXNwYWNlIHRvb2xzIGFuZCB0ZXN0aW5nLlxuXG5KdXN0IHRvIGJlIGFic29sdXRlbHkgY2VydGFpbiwgSSdsbCBydW4gYSBxdWljayBjaGVjaywgbWF5YmUgd2l0aCBgZ3JlcHBlcmAsIGp1c3QgdG8gYmUgdHJpcGxlIHN1cmUgbm8gdW5leHBlY3RlZCBtb2RpZmljYXRpb25zIHdlcmUgc251Y2sgaW4sIGJ1dCBiYXNlZCBvbiBteSBpbml0aWFsIHNjYW4sIHRoaXMgbG9va3MgbGlrZSBhIGNsZWFyLWN1dCBjYXNlIG9mIG5vbi1jcml0aWNhbCBtb2RpZmljYXRpb24uXG5cblxuIiwiSW5wdXRUb2tlbnMiOjE0MTIwLCJPdXRwdXRUb2tlbnMiOjE5LCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MzExLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDktMTFUMDQ6MDA6MDUuODE3MTU4NzA1WiIsIlNlcSI6NCwiTmVzdGluZyI6MiwiVHlwZSI6InRvb2wiLCJOYW1lIjoiZ3JlcHBlciIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjE5MDE4ODk4MjksIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJFeHByZXNzaW9uXCI6IFwiY29sbGVjdF9pbm5lcl9tYXBcIlxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiT3V0cHV0XCI6IFwidG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM9ODMwPXN0cnVjdCBtYXBfZHVtcF9jdHgge1xcbi0tXFxudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmMtODM1LVxcbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjgzNjpzdGF0aWMgaW50IGNvbGxlY3RfaW5uZXJfbWFwKHN0cnVjdCBtYXBfZHVtcF9jdHggKmN0eCwgX191MzIgaWQpXFxudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmMtODM3LXtcXG4tLVxcbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jPTg2Mj1tYXBfZHVtcChpbnQgZmQsIHN0cnVjdCBicGZfbWFwX2luZm8gKmluZm8sIGpzb25fd3JpdGVyX3QgKnd0cixcXG4tLVxcbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jLTkyOS1cXHRcXHRcXHRpZiAoY3R4IFxcdTAwMjZcXHUwMDI2IG1hcF9pc19tYXBfb2ZfbWFwcyhpbmZvLVxcdTAwM2V0eXBlKSkge1xcbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjkzMDpcXHRcXHRcXHRcXHRlcnIgPSBjb2xsZWN0X2lubmVyX21hcChjdHgsICooX191MzIgKil2YWx1ZSk7XFxudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmMtOTMxLVxcdFxcdFxcdFxcdGlmIChlcnIpXFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTExVDA0OjAwOjA3LjcxOTA1NDc5NFoiLCJTZXEiOjUsIk5lc3RpbmciOjIsIlR5cGUiOiJsbG0iLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy43LWZsYXNoIiwiRHVyYXRpb24iOjQwOTE0NTI4MTMsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IioqTXkgQXNzZXNzbWVudCBvZiB0aGUgUHJvcG9zZWQgQ2hhbmdlcyoqXG5cbk9rYXksIHNvIEknbSBsb29raW5nIGF0IHRoZXNlIGNoYW5nZXMsIGFuZCBmcm9tIG15IGV4cGVydCBwZXJzcGVjdGl2ZSwgaXQncyBwcmV0dHkgY2xlYXIgd2hlcmUgd2Ugc3RhbmQuIFRoZSBtb2RpZmljYXRpb25zIGFyZSAqc3RyaWN0bHkqIGNvbnRhaW5lZCB3aXRoaW4gdXNlci1zcGFjZSB0b29scy4gV2UncmUgdGFsa2luZyBzcGVjaWZpY2FsbHkgYWJvdXQgYGJwZnRvb2xgIHdpdGhpbiBgdG9vbHMvYnBmL2JwZnRvb2wvYCBhbmQgdGhlIHNlbGYtdGVzdHMgaW4gYHRvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2AuIFRoYXQgaW1tZWRpYXRlbHkgcmluZ3MgYSBiZWxsIGZvciBtZSwgYmVjYXVzZSBhbnkgYWx0ZXJhdGlvbnMgaW4gdGhvc2UgYXJlYXMgYXJlIGluaGVyZW50bHkgaXNvbGF0ZWQgZnJvbSB0aGUga2VybmVsIGl0c2VsZi5cblxuVGhlcmVmb3JlLCBhcHBseWluZyBvdXIgbmVnYXRpdmUgY3JpdGVyaWEsIGl0J3MgYSBzdHJhaWdodGZvcndhcmQgZGV0ZXJtaW5hdGlvbi4gU2luY2UgdGhlc2UgY2hhbmdlcyByZXNpZGUgd2l0aGluIHVzZXItc3BhY2UgZGlyZWN0b3JpZXMsIHNlbGYtdGVzdHMsIHNhbXBsZXMsIG9yIHNjcmlwdHMsIHRoZXkgKmRvIG5vdCogYWZmZWN0IHRoZSBjb21waWxlZCBrZXJuZWwgaW1hZ2UgKGB2bWxpbnV4YCkgb3IgYW55IG9mIHRoZSBrZXJuZWwgbW9kdWxlcy4gSW4gZXNzZW5jZSwgdGhleSBhcmUgc2lkZS1jYXIgc29mdHdhcmUgdGhhdCBpbnRlcmFjdHMgd2l0aCB0aGUga2VybmVsLlxuXG5HaXZlbiB0aGlzIGlzb2xhdGlvbiwgSSBjYW4gY29uZmlkZW50bHkgcnVsZSBvdXQgYW55IGZ1enppbmcgcmVxdWlyZW1lbnRzLiBgV29ydGhGdXp6aW5nYCBpcyBhIGhhcmQgXCJmYWxzZVwiIGhlcmUuIFNpbWlsYXJseSwgYW55IGNvbnNpZGVyYXRpb25zIGZvciBzcGVjaWZpYyBzeW1ib2xzIG9yIGNvbmZpZ3VyYXRpb25zIGFyZSB1bm5lY2Vzc2FyeS4gQm90aCBgRm9jdXNTeW1ib2xzYCBhbmQgYEVuYWJsZUNvbmZpZ3NgIGFyZSBjb3JyZWN0bHkgbnVsbCwgcmVwcmVzZW50ZWQgYXMgYW4gZW1wdHkgYXJyYXkgYFtdYC4gVGhleSBhcmUgbm90IHJlbGV2YW50IHRvIGlzb2xhdGVkIGNoYW5nZXMgaW4gdXNlci1zcGFjZSB0b29scy5cblxuV2l0aCB0aGlzIGFuYWx5c2lzIGNvbXBsZXRlLCBpdCdzIHRpbWUgdG8gY2FsbCBgc2V0LXJlc3VsdHNgLiBXZSBjYW4gcHJvY2VlZCBiYXNlZCBvbiB0aGlzIGFzc2Vzc21lbnQuXG5cblxuIiwiSW5wdXRUb2tlbnMiOjE0OTM3LCJPdXRwdXRUb2tlbnMiOjk0LCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MTMzLCJUb29sQ2FsbHMiOlsiZ3JlcHBlciJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTExVDA0OjAwOjExLjgxMDUxMDI0N1oiLCJTZXEiOjYsIk5lc3RpbmciOjIsIlR5cGUiOiJ0b29sIiwiTmFtZSI6InNldC1yZXN1bHRzIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6MzIwMDAsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJFbmFibGVDb25maWdzXCI6IFtdLFxuICBcIkZvY3VzU3ltYm9sc1wiOiBbXSxcbiAgXCJSZWFzb25pbmdcIjogXCJUaGUgcGF0Y2ggbW9kaWZpZXMgb25seSB1c2VyLXNwYWNlIHRvb2xpbmcgKGJwZnRvb2wgdW5kZXIgdG9vbHMvYnBmL2JwZnRvb2wvKSBhbmQgQlBGIHNlbGZ0ZXN0cyAodG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmLykuIEl0IGRvZXMgbm90IHRvdWNoIHRoZSBMaW51eCBrZXJuZWwgaW1hZ2Ugb3Iga2VybmVsIG1vZHVsZXMsIG1ha2luZyBpdCB1bnJlYWNoYWJsZSBmb3Igc3l6a2FsbGVyIGtlcm5lbCBmdXp6aW5nLlwiLFxuICBcIldvcnRoRnV6emluZ1wiOiBmYWxzZVxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiRW5hYmxlQ29uZmlnc1wiOiBudWxsLFxuICBcIkZvY3VzU3ltYm9sc1wiOiBbXSxcbiAgXCJSZWFzb25pbmdcIjogXCJUaGUgcGF0Y2ggbW9kaWZpZXMgb25seSB1c2VyLXNwYWNlIHRvb2xpbmcgKGJwZnRvb2wgdW5kZXIgdG9vbHMvYnBmL2JwZnRvb2wvKSBhbmQgQlBGIHNlbGZ0ZXN0cyAodG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmLykuIEl0IGRvZXMgbm90IHRvdWNoIHRoZSBMaW51eCBrZXJuZWwgaW1hZ2Ugb3Iga2VybmVsIG1vZHVsZXMsIG1ha2luZyBpdCB1bnJlYWNoYWJsZSBmb3Igc3l6a2FsbGVyIGtlcm5lbCBmdXp6aW5nLlwiLFxuICBcIldvcnRoRnV6emluZ1wiOiBmYWxzZVxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDktMTFUMDQ6MDA6MTEuODEwNTQ4MDc3WiIsIlNlcSI6NywiTmVzdGluZyI6MSwiVHlwZSI6ImFjdGlvbiIsIk5hbWUiOiJJZiIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjI2NDAsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJXb3J0aEZ1enppbmdcIjogZmFsc2Vcbn0iLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9XTsKCQkJaWYgKCFyYXdEYXRhIHx8IHJhd0RhdGEubGVuZ3RoID09PSAwKSByZXR1cm47CgoJCQlkcmF3U3VtbWFyeVRhYmxlcyhyYXdEYXRhKTsKCQkJZHJhd0R1cmF0aW9uQ2hhcnQocmF3RGF0YSk7CgkJCWRyYXdUb2tlbkNvbnN1bXB0aW9uQ2hhcnQocmF3RGF0YSk7CgkJfQoKCQlmdW5jdGlvbiBkcmF3U3VtbWFyeVRhYmxlcyhyYXdEYXRhKSB7CgkJCWNvbnN0IHN0YXRzID0gewoJCQkJbGxtOiB7IGNvdW50OiAwLCB0b2tlbnM6IDAsIGR1cmF0aW9uOiAwIH0sCgkJCQl0b29sOiB7IGNvdW50OiAwLCBkdXJhdGlvbjogMCB9CgkJCX07CgoJCQlyYXdEYXRhLmZvckVhY2gocyA9PiB7CgkJCQljb25zdCBkdXIgPSBzLkR1cmF0aW9uIC8gMTAwMDAwMDAwMDsgCgkJCQlpZiAocy5UeXBlID09PSAibGxtIikgewoJCQkJCXN0YXRzLmxsbS5jb3VudCsrOwoJCQkJCXN0YXRzLmxsbS50b2tlbnMgKz0gKHMuSW5wdXRUb2tlbnMgKyBzLk91dHB1dFRva2VucyArIHMuT3V0cHV0VGhvdWdodHNUb2tlbnMpOwoJCQkJCXN0YXRzLmxsbS5kdXJhdGlvbiArPSBkdXI7CgkJCQl9IGVsc2UgaWYgKHMuVHlwZSA9PT0gInRvb2wiKSB7CgkJCQkJc3RhdHMudG9vbC5jb3VudCsrOwoJCQkJCXN0YXRzLnRvb2wuZHVyYXRpb24gKz0gZHVyOwoJCQkJfQoJCQl9KTsKCgkJCWNvbnN0IGF2Z0xsbUR1ciA9IHN0YXRzLmxsbS5jb3VudCA+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-workflowhr8tv[1] Phase: Running StartedAt: 2026-09-11 04:00:23 +0000 UTC FinishedAt: 0001-01-01 00:00:00 +0000 UTC Input: nil Output: nil --------- Name: series-workflowhr8tv[1].abort-on-skip-outcome Phase: Failed StartedAt: 2026-09-11 04:00:23 +0000 UTC FinishedAt: 2026-09-11 04:00:27 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:code,Default:nil,Value:*1,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},},Artifacts:[]Artifact{},} Output: &Outputs{Parameters:[]Parameter{},Artifacts:[]Artifact{},Result:nil,ExitCode:*1,}