ZGlmZiAtLWdpdCBhL2Fib3V0Lmh0bWwgYi9hYm91dC5odG1sCmluZGV4IDY0YzA1OTguLmU4YjgzNGQgMTAwNjQ0Ci0tLSBhL2Fib3V0Lmh0bWwKKysrIGIvYWJvdXQuaHRtbApAQCAtOCwxMyArOCwxMyBAQAogPGJvZHkgbGFuZz0iRU4tVVMiPgogPGgyPkFib3V0IFRoaXMgQ29udGVudDwvaDI+CiAgCi08cD5KdW5lIDEsIDIwMTY8L3A+CQorPHA+Tm92ZW1iZXIgMzAsIDIwMTc8L3A+CQogPGgzPkxpY2Vuc2U8L2gzPgogCiA8cD5UaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1ha2VzIGF2YWlsYWJsZSBhbGwgY29udGVudCBpbiB0aGlzIHBsdWctaW4gKCZxdW90O0NvbnRlbnQmcXVvdDspLiAgVW5sZXNzIG90aGVyd2lzZSAKIGluZGljYXRlZCBiZWxvdywgdGhlIENvbnRlbnQgaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUKLUVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKCZxdW90O0VQTCZxdW90OykuICBBIGNvcHkgb2YgdGhlIEVQTCBpcyBhdmFpbGFibGUgCi1hdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWw8L2E+LgorRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIuMCAoJnF1b3Q7RVBMJnF1b3Q7KS4gIEEgY29weSBvZiB0aGUgRVBMIGlzIGF2YWlsYWJsZSAKK2F0IDxhIGhyZWY9Imh0dHBzOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAiPmh0dHBzOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjA8L2E+LgogRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICZxdW90O1Byb2dyYW0mcXVvdDsgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvcD4KIAogPHA+SWYgeW91IGRpZCBub3QgcmVjZWl2ZSB0aGlzIENvbnRlbnQgZGlyZWN0bHkgZnJvbSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uLCB0aGUgQ29udGVudCBpcyAKZGlmZiAtLWdpdCBhL25vdGljZS5odG1sIGIvbm90aWNlLmh0bWwKaW5kZXggYzNkMzRjMy4uMDA4YjgwMSAxMDA2NDQKLS0tIGEvbm90aWNlLmh0bWwKKysrIGIvbm90aWNlLmh0bWwKQEAgLTcsMTAxICs3LDE4MyBAQAogPC9oZWFkPgogCiA8Ym9keSBsYW5nPSJFTi1VUyI+Ci08aDI+RWNsaXBzZSBGb3VuZGF0aW9uIFNvZnR3YXJlIFVzZXIgQWdyZWVtZW50PC9oMj4KLTxwPkFwcmlsIDksIDIwMTQ8L3A+CisJPGgyPkVjbGlwc2UgRm91bmRhdGlvbiBTb2Z0d2FyZSBVc2VyIEFncmVlbWVudDwvaDI+CisJPHA+Tm92ZW1iZXIgMjIsIDIwMTc8L3A+CiAKLTxoMz5Vc2FnZSBPZiBDb250ZW50PC9oMz4KKwk8aDM+VXNhZ2UgT2YgQ29udGVudDwvaDM+CiAKLTxwPlRIRSBFQ0xJUFNFIEZPVU5EQVRJT04gTUFLRVMgQVZBSUxBQkxFIFNPRlRXQVJFLCBET0NVTUVOVEFUSU9OLCBJTkZPUk1BVElPTiBBTkQvT1IgT1RIRVIgTUFURVJJQUxTIEZPUiBPUEVOIFNPVVJDRSBQUk9KRUNUUwotICAgKENPTExFQ1RJVkVMWSAmcXVvdDtDT05URU5UJnF1b3Q7KS4gIFVTRSBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJUyBBR1JFRU1FTlQgQU5EL09SIFRIRSBURVJNUyBBTkQKLSAgIENPTkRJVElPTlMgT0YgTElDRU5TRSBBR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuICBCWSBVU0lORyBUSEUgQ09OVEVOVCwgWU9VIEFHUkVFIFRIQVQgWU9VUiBVU0UKLSAgIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRISVMgQUdSRUVNRU5UIEFORC9PUiBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTIE9SCi0gICBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiAgSUYgWU9VIERPIE5PVCBBR1JFRSBUTyBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJUyBBR1JFRU1FTlQgQU5EIFRIRSBURVJNUyBBTkQKLSAgIENPTkRJVElPTlMgT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1csIFRIRU4gWU9VIE1BWSBOT1QgVVNFIFRIRSBDT05URU5ULjwvcD4KKwk8cD5USEUgRUNMSVBTRSBGT1VOREFUSU9OIE1BS0VTIEFWQUlMQUJMRSBTT0ZUV0FSRSwgRE9DVU1FTlRBVElPTiwKKwkJSU5GT1JNQVRJT04gQU5EL09SIE9USEVSIE1BVEVSSUFMUyBGT1IgT1BFTiBTT1VSQ0UgUFJPSkVDVFMKKwkJKENPTExFQ1RJVkVMWSAmcXVvdDtDT05URU5UJnF1b3Q7KS4gVVNFIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZCisJCVRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTIEFHUkVFTUVOVCBBTkQvT1IgVEhFIFRFUk1TIEFORAorCQlDT05ESVRJT05TIE9GIExJQ0VOU0UgQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VECisJCUJFTE9XLiBCWSBVU0lORyBUSEUgQ09OVEVOVCwgWU9VIEFHUkVFIFRIQVQgWU9VUiBVU0UgT0YgVEhFIENPTlRFTlQgSVMKKwkJR09WRVJORUQgQlkgVEhJUyBBR1JFRU1FTlQgQU5EL09SIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBBTlkKKwkJQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRAorCQlCRUxPVy4gSUYgWU9VIERPIE5PVCBBR1JFRSBUTyBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJUworCQlBR1JFRU1FTlQgQU5EIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFCisJCUFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVywgVEhFTiBZT1UgTUFZIE5PVAorCQlVU0UgVEhFIENPTlRFTlQuPC9wPgogCi08aDM+QXBwbGljYWJsZSBMaWNlbnNlczwvaDM+CisJPGgzPkFwcGxpY2FibGUgTGljZW5zZXM8L2gzPgogCi08cD5Vbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCwgYWxsIENvbnRlbnQgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiBpcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wCi0gICAoJnF1b3Q7RVBMJnF1b3Q7KS4gIEEgY29weSBvZiB0aGUgRVBMIGlzIHByb3ZpZGVkIHdpdGggdGhpcyBDb250ZW50IGFuZCBpcyBhbHNvIGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWw8L2E+LgotICAgRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICZxdW90O1Byb2dyYW0mcXVvdDsgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvcD4KKwk8cD4KKwkJVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQsIGFsbCBDb250ZW50IG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlCisJCUZvdW5kYXRpb24gaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUKKwkJRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIuMCAoJnF1b3Q7RVBMJnF1b3Q7KS4gQSBjb3B5IG9mIHRoZQorCQlFUEwgaXMgcHJvdmlkZWQgd2l0aCB0aGlzIENvbnRlbnQgYW5kIGlzIGFsc28gYXZhaWxhYmxlIGF0IDxhCisJCQlocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMDwvYT4uCisJCUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAmcXVvdDtQcm9ncmFtJnF1b3Q7IHdpbGwgbWVhbiB0aGUgQ29udGVudC4KKwk8L3A+CiAKLTxwPkNvbnRlbnQgaW5jbHVkZXMsIGJ1dCBpcyBub3QgbGltaXRlZCB0bywgc291cmNlIGNvZGUsIG9iamVjdCBjb2RlLCBkb2N1bWVudGF0aW9uIGFuZCBvdGhlciBmaWxlcyBtYWludGFpbmVkIGluIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gc291cmNlIGNvZGUKLSAgIHJlcG9zaXRvcnkgKCZxdW90O1JlcG9zaXRvcnkmcXVvdDspIGluIHNvZnR3YXJlIG1vZHVsZXMgKCZxdW90O01vZHVsZXMmcXVvdDspIGFuZCBtYWRlIGF2YWlsYWJsZSBhcyBkb3dubG9hZGFibGUgYXJjaGl2ZXMgKCZxdW90O0Rvd25sb2FkcyZxdW90OykuPC9wPgorCTxwPkNvbnRlbnQgaW5jbHVkZXMsIGJ1dCBpcyBub3QgbGltaXRlZCB0bywgc291cmNlIGNvZGUsIG9iamVjdAorCQljb2RlLCBkb2N1bWVudGF0aW9uIGFuZCBvdGhlciBmaWxlcyBtYWludGFpbmVkIGluIHRoZSBFY2xpcHNlCisJCUZvdW5kYXRpb24gc291cmNlIGNvZGUgcmVwb3NpdG9yeSAoJnF1b3Q7UmVwb3NpdG9yeSZxdW90OykgaW4gc29mdHdhcmUKKwkJbW9kdWxlcyAoJnF1b3Q7TW9kdWxlcyZxdW90OykgYW5kIG1hZGUgYXZhaWxhYmxlIGFzIGRvd25sb2FkYWJsZQorCQlhcmNoaXZlcyAoJnF1b3Q7RG93bmxvYWRzJnF1b3Q7KS48L3A+CiAKLTx1bD4KLSAgICAgICA8bGk+Q29udGVudCBtYXkgYmUgc3RydWN0dXJlZCBhbmQgcGFja2FnZWQgaW50byBtb2R1bGVzIHRvIGZhY2lsaXRhdGUgZGVsaXZlcmluZywgZXh0ZW5kaW5nLCBhbmQgdXBncmFkaW5nIHRoZSBDb250ZW50LiAgVHlwaWNhbCBtb2R1bGVzIG1heSBpbmNsdWRlIHBsdWctaW5zICgmcXVvdDtQbHVnLWlucyZxdW90OyksIHBsdWctaW4gZnJhZ21lbnRzICgmcXVvdDtGcmFnbWVudHMmcXVvdDspLCBhbmQgZmVhdHVyZXMgKCZxdW90O0ZlYXR1cmVzJnF1b3Q7KS48L2xpPgotICAgICAgIDxsaT5FYWNoIFBsdWctaW4gb3IgRnJhZ21lbnQgbWF5IGJlIHBhY2thZ2VkIGFzIGEgc3ViLWRpcmVjdG9yeSBvciBKQVIgKEphdmEmdHJhZGU7IEFSY2hpdmUpIGluIGEgZGlyZWN0b3J5IG5hbWVkICZxdW90O3BsdWdpbnMmcXVvdDsuPC9saT4KLSAgICAgICA8bGk+QSBGZWF0dXJlIGlzIGEgYnVuZGxlIG9mIG9uZSBvciBtb3JlIFBsdWctaW5zIGFuZC9vciBGcmFnbWVudHMgYW5kIGFzc29jaWF0ZWQgbWF0ZXJpYWwuICBFYWNoIEZlYXR1cmUgbWF5IGJlIHBhY2thZ2VkIGFzIGEgc3ViLWRpcmVjdG9yeSBpbiBhIGRpcmVjdG9yeSBuYW1lZCAmcXVvdDtmZWF0dXJlcyZxdW90Oy4gIFdpdGhpbiBhIEZlYXR1cmUsIGZpbGVzIG5hbWVkICZxdW90O2ZlYXR1cmUueG1sJnF1b3Q7IG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZiB0aGUgUGx1Zy1pbnMKLSAgICAgIGFuZC9vciBGcmFnbWVudHMgYXNzb2NpYXRlZCB3aXRoIHRoYXQgRmVhdHVyZS48L2xpPgotICAgICAgIDxsaT5GZWF0dXJlcyBtYXkgYWxzbyBpbmNsdWRlIG90aGVyIEZlYXR1cmVzICgmcXVvdDtJbmNsdWRlZCBGZWF0dXJlcyZxdW90OykuIFdpdGhpbiBhIEZlYXR1cmUsIGZpbGVzIG5hbWVkICZxdW90O2ZlYXR1cmUueG1sJnF1b3Q7IG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZiBJbmNsdWRlZCBGZWF0dXJlcy48L2xpPgotPC91bD4KKwk8dWw+CisJCTxsaT5Db250ZW50IG1heSBiZSBzdHJ1Y3R1cmVkIGFuZCBwYWNrYWdlZCBpbnRvIG1vZHVsZXMgdG8KKwkJCWZhY2lsaXRhdGUgZGVsaXZlcmluZywgZXh0ZW5kaW5nLCBhbmQgdXBncmFkaW5nIHRoZSBDb250ZW50LiBUeXBpY2FsCisJCQltb2R1bGVzIG1heSBpbmNsdWRlIHBsdWctaW5zICgmcXVvdDtQbHVnLWlucyZxdW90OyksIHBsdWctaW4KKwkJCWZyYWdtZW50cyAoJnF1b3Q7RnJhZ21lbnRzJnF1b3Q7KSwgYW5kIGZlYXR1cmVzCisJCQkoJnF1b3Q7RmVhdHVyZXMmcXVvdDspLjwvbGk+CisJCTxsaT5FYWNoIFBsdWctaW4gb3IgRnJhZ21lbnQgbWF5IGJlIHBhY2thZ2VkIGFzIGEgc3ViLWRpcmVjdG9yeQorCQkJb3IgSkFSIChKYXZhJnRyYWRlOyBBUmNoaXZlKSBpbiBhIGRpcmVjdG9yeSBuYW1lZAorCQkJJnF1b3Q7cGx1Z2lucyZxdW90Oy48L2xpPgorCQk8bGk+QSBGZWF0dXJlIGlzIGEgYnVuZGxlIG9mIG9uZSBvciBtb3JlIFBsdWctaW5zIGFuZC9vcgorCQkJRnJhZ21lbnRzIGFuZCBhc3NvY2lhdGVkIG1hdGVyaWFsLiBFYWNoIEZlYXR1cmUgbWF5IGJlIHBhY2thZ2VkIGFzIGEKKwkJCXN1Yi1kaXJlY3RvcnkgaW4gYSBkaXJlY3RvcnkgbmFtZWQgJnF1b3Q7ZmVhdHVyZXMmcXVvdDsuIFdpdGhpbiBhCisJCQlGZWF0dXJlLCBmaWxlcyBuYW1lZCAmcXVvdDtmZWF0dXJlLnhtbCZxdW90OyBtYXkgY29udGFpbiBhIGxpc3Qgb2YKKwkJCXRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mIHRoZSBQbHVnLWlucyBhbmQvb3IgRnJhZ21lbnRzCisJCQlhc3NvY2lhdGVkIHdpdGggdGhhdCBGZWF0dXJlLjwvbGk+CisJCTxsaT5GZWF0dXJlcyBtYXkgYWxzbyBpbmNsdWRlIG90aGVyIEZlYXR1cmVzICgmcXVvdDtJbmNsdWRlZAorCQkJRmVhdHVyZXMmcXVvdDspLiBXaXRoaW4gYSBGZWF0dXJlLCBmaWxlcyBuYW1lZAorCQkJJnF1b3Q7ZmVhdHVyZS54bWwmcXVvdDsgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbgorCQkJbnVtYmVycyBvZiBJbmNsdWRlZCBGZWF0dXJlcy48L2xpPgorCTwvdWw+CiAKLTxwPlRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBzaG91bGQgYmUgY29udGFpbmVkIGluIGZpbGVzIG5hbWVkICZxdW90O2Fib3V0Lmh0bWwmcXVvdDsgKCZxdW90O0Fib3V0cyZxdW90OykuIFRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgRmVhdHVyZXMgYW5kCi1JbmNsdWRlZCBGZWF0dXJlcyBzaG91bGQgYmUgY29udGFpbmVkIGluIGZpbGVzIG5hbWVkICZxdW90O2xpY2Vuc2UuaHRtbCZxdW90OyAoJnF1b3Q7RmVhdHVyZSBMaWNlbnNlcyZxdW90OykuICBBYm91dHMgYW5kIEZlYXR1cmUgTGljZW5zZXMgbWF5IGJlIGxvY2F0ZWQgaW4gYW55IGRpcmVjdG9yeSBvZiBhIERvd25sb2FkIG9yIE1vZHVsZQotaW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGZvbGxvd2luZyBsb2NhdGlvbnM6PC9wPgorCTxwPlRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBzaG91bGQKKwkJYmUgY29udGFpbmVkIGluIGZpbGVzIG5hbWVkICZxdW90O2Fib3V0Lmh0bWwmcXVvdDsKKwkJKCZxdW90O0Fib3V0cyZxdW90OykuIFRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgRmVhdHVyZXMgYW5kCisJCUluY2x1ZGVkIEZlYXR1cmVzIHNob3VsZCBiZSBjb250YWluZWQgaW4gZmlsZXMgbmFtZWQKKwkJJnF1b3Q7bGljZW5zZS5odG1sJnF1b3Q7ICgmcXVvdDtGZWF0dXJlIExpY2Vuc2VzJnF1b3Q7KS4gQWJvdXRzIGFuZAorCQlGZWF0dXJlIExpY2Vuc2VzIG1heSBiZSBsb2NhdGVkIGluIGFueSBkaXJlY3Rvcnkgb2YgYSBEb3dubG9hZCBvcgorCQlNb2R1bGUgaW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGZvbGxvd2luZyBsb2NhdGlvbnM6PC9wPgogCi08dWw+Ci0gICAgICAgPGxpPlRoZSB0b3AtbGV2ZWwgKHJvb3QpIGRpcmVjdG9yeTwvbGk+Ci0gICAgICAgPGxpPlBsdWctaW4gYW5kIEZyYWdtZW50IGRpcmVjdG9yaWVzPC9saT4KLSAgICAgICA8bGk+SW5zaWRlIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgcGFja2FnZWQgYXMgSkFSczwvbGk+Ci0gICAgICAgPGxpPlN1Yi1kaXJlY3RvcmllcyBvZiB0aGUgZGlyZWN0b3J5IG5hbWVkICZxdW90O3NyYyZxdW90OyBvZiBjZXJ0YWluIFBsdWctaW5zPC9saT4KLSAgICAgICA8bGk+RmVhdHVyZSBkaXJlY3RvcmllczwvbGk+Ci08L3VsPgorCTx1bD4KKwkJPGxpPlRoZSB0b3AtbGV2ZWwgKHJvb3QpIGRpcmVjdG9yeTwvbGk+CisJCTxsaT5QbHVnLWluIGFuZCBGcmFnbWVudCBkaXJlY3RvcmllczwvbGk+CisJCTxsaT5JbnNpZGUgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBwYWNrYWdlZCBhcyBKQVJzPC9saT4KKwkJPGxpPlN1Yi1kaXJlY3RvcmllcyBvZiB0aGUgZGlyZWN0b3J5IG5hbWVkICZxdW90O3NyYyZxdW90OyBvZgorCQkJY2VydGFpbiBQbHVnLWluczwvbGk+CisJCTxsaT5GZWF0dXJlIGRpcmVjdG9yaWVzPC9saT4KKwk8L3VsPgogCi08cD5Ob3RlOiBpZiBhIEZlYXR1cmUgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiBpcyBpbnN0YWxsZWQgdXNpbmcgdGhlIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5IChhcyBkZWZpbmVkIGJlbG93KSwgeW91IG11c3QgYWdyZWUgdG8gYSBsaWNlbnNlICgmcXVvdDtGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlJnF1b3Q7KSBkdXJpbmcgdGhlCi1pbnN0YWxsYXRpb24gcHJvY2Vzcy4gIElmIHRoZSBGZWF0dXJlIGNvbnRhaW5zIEluY2x1ZGVkIEZlYXR1cmVzLCB0aGUgRmVhdHVyZSBVcGRhdGUgTGljZW5zZSBzaG91bGQgZWl0aGVyIHByb3ZpZGUgeW91IHdpdGggdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyB0aGUgSW5jbHVkZWQgRmVhdHVyZXMgb3IKLWluZm9ybSB5b3Ugd2hlcmUgeW91IGNhbiBsb2NhdGUgdGhlbS4gIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIG1heSBiZSBmb3VuZCBpbiB0aGUgJnF1b3Q7bGljZW5zZSZxdW90OyBwcm9wZXJ0eSBvZiBmaWxlcyBuYW1lZCAmcXVvdDtmZWF0dXJlLnByb3BlcnRpZXMmcXVvdDsgZm91bmQgd2l0aGluIGEgRmVhdHVyZS4KLVN1Y2ggQWJvdXRzLCBGZWF0dXJlIExpY2Vuc2VzLCBhbmQgRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgY29udGFpbiB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgKG9yIHJlZmVyZW5jZXMgdG8gc3VjaCB0ZXJtcyBhbmQgY29uZGl0aW9ucykgdGhhdCBnb3Zlcm4geW91ciB1c2Ugb2YgdGhlIGFzc29jaWF0ZWQgQ29udGVudCBpbgotdGhhdCBkaXJlY3RvcnkuPC9wPgorCTxwPk5vdGU6IGlmIGEgRmVhdHVyZSBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIGlzCisJCWluc3RhbGxlZCB1c2luZyB0aGUgUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kgKGFzIGRlZmluZWQgYmVsb3cpLCB5b3UKKwkJbXVzdCBhZ3JlZSB0byBhIGxpY2Vuc2UgKCZxdW90O0ZlYXR1cmUgVXBkYXRlIExpY2Vuc2UmcXVvdDspIGR1cmluZworCQl0aGUgaW5zdGFsbGF0aW9uIHByb2Nlc3MuIElmIHRoZSBGZWF0dXJlIGNvbnRhaW5zIEluY2x1ZGVkIEZlYXR1cmVzLAorCQl0aGUgRmVhdHVyZSBVcGRhdGUgTGljZW5zZSBzaG91bGQgZWl0aGVyIHByb3ZpZGUgeW91IHdpdGggdGhlIHRlcm1zCisJCWFuZCBjb25kaXRpb25zIGdvdmVybmluZyB0aGUgSW5jbHVkZWQgRmVhdHVyZXMgb3IgaW5mb3JtIHlvdSB3aGVyZSB5b3UKKwkJY2FuIGxvY2F0ZSB0aGVtLiBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBtYXkgYmUgZm91bmQgaW4gdGhlCisJCSZxdW90O2xpY2Vuc2UmcXVvdDsgcHJvcGVydHkgb2YgZmlsZXMgbmFtZWQKKwkJJnF1b3Q7ZmVhdHVyZS5wcm9wZXJ0aWVzJnF1b3Q7IGZvdW5kIHdpdGhpbiBhIEZlYXR1cmUuIFN1Y2ggQWJvdXRzLAorCQlGZWF0dXJlIExpY2Vuc2VzLCBhbmQgRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgY29udGFpbiB0aGUgdGVybXMgYW5kCisJCWNvbmRpdGlvbnMgKG9yIHJlZmVyZW5jZXMgdG8gc3VjaCB0ZXJtcyBhbmQgY29uZGl0aW9ucykgdGhhdCBnb3Zlcm4KKwkJeW91ciB1c2Ugb2YgdGhlIGFzc29jaWF0ZWQgQ29udGVudCBpbiB0aGF0IGRpcmVjdG9yeS48L3A+CiAKLTxwPlRIRSBBQk9VVFMsIEZFQVRVUkUgTElDRU5TRVMsIEFORCBGRUFUVVJFIFVQREFURSBMSUNFTlNFUyBNQVkgUkVGRVIgVE8gVEhFIEVQTCBPUiBPVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMsIE5PVElDRVMgT1IgVEVSTVMgQU5EIENPTkRJVElPTlMuICBTT01FIE9GIFRIRVNFCi1PVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMgTUFZIElOQ0xVREUgKEJVVCBBUkUgTk9UIExJTUlURUQgVE8pOjwvcD4KKwk8cD5USEUgQUJPVVRTLCBGRUFUVVJFIExJQ0VOU0VTLCBBTkQgRkVBVFVSRSBVUERBVEUgTElDRU5TRVMgTUFZCisJCVJFRkVSIFRPIFRIRSBFUEwgT1IgT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTLCBOT1RJQ0VTIE9SIFRFUk1TIEFORAorCQlDT05ESVRJT05TLiBTT01FIE9GIFRIRVNFIE9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUyBNQVkgSU5DTFVERSAoQlVUCisJCUFSRSBOT1QgTElNSVRFRCBUTyk6PC9wPgogCi08dWw+Ci0gICAgICAgPGxpPkVjbGlwc2UgRGlzdHJpYnV0aW9uIExpY2Vuc2UgVmVyc2lvbiAxLjAgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xpY2Vuc2VzL2VkbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9saWNlbnNlcy9lZGwtdjEuMC5odG1sPC9hPik8L2xpPgotICAgICAgIDxsaT5Db21tb24gUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWw8L2E+KTwvbGk+Ci0gICAgICAgPGxpPkFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDEuMSAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFIj5odHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRTwvYT4pPC9saT4KLSAgICAgICA8bGk+QXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMi4wIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wIj5odHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjA8L2E+KTwvbGk+Ci0gICAgICAgPGxpPk1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjEgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC9NUEwtMS4xLmh0bWwiPmh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBML01QTC0xLjEuaHRtbDwvYT4pPC9saT4KLTwvdWw+CisJPHVsPgorCQk8bGk+RWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoYXZhaWxhYmxlIGF0IDxhCisJCQlocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWw8L2E+KQorCQk8L2xpPgorCQk8bGk+RWNsaXBzZSBEaXN0cmlidXRpb24gTGljZW5zZSBWZXJzaW9uIDEuMCAoYXZhaWxhYmxlIGF0IDxhCisJCQlocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xpY2Vuc2VzL2VkbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9saWNlbnNlcy9lZGwtdjEuMC5odG1sPC9hPikKKwkJPC9saT4KKwkJPGxpPkNvbW1vbiBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoYXZhaWxhYmxlIGF0IDxhCisJCQlocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWw8L2E+KQorCQk8L2xpPgorCQk8bGk+QXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMS4xIChhdmFpbGFibGUgYXQgPGEKKwkJCWhyZWY9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFIj5odHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRTwvYT4pCisJCTwvbGk+CisJCTxsaT5BcGFjaGUgU29mdHdhcmUgTGljZW5zZSAyLjAgKGF2YWlsYWJsZSBhdCA8YQorCQkJaHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wIj5odHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjA8L2E+KQorCQk8L2xpPgorCQk8bGk+TW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMSAoYXZhaWxhYmxlIGF0IDxhCisJCQlocmVmPSJodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC9NUEwtMS4xLmh0bWwiPmh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBML01QTC0xLjEuaHRtbDwvYT4pCisJCTwvbGk+CisJPC91bD4KIAotPHA+SVQgSVMgWU9VUiBPQkxJR0FUSU9OIFRPIFJFQUQgQU5EIEFDQ0VQVCBBTEwgU1VDSCBURVJNUyBBTkQgQ09ORElUSU9OUyBQUklPUiBUTyBVU0UgT0YgVEhFIENPTlRFTlQuICBJZiBubyBBYm91dCwgRmVhdHVyZSBMaWNlbnNlLCBvciBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIGlzIHByb3ZpZGVkLCBwbGVhc2UKLWNvbnRhY3QgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiB0byBkZXRlcm1pbmUgd2hhdCB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm4gdGhhdCBwYXJ0aWN1bGFyIENvbnRlbnQuPC9wPgorCTxwPklUIElTIFlPVVIgT0JMSUdBVElPTiBUTyBSRUFEIEFORCBBQ0NFUFQgQUxMIFNVQ0ggVEVSTVMgQU5ECisJCUNPTkRJVElPTlMgUFJJT1IgVE8gVVNFIE9GIFRIRSBDT05URU5ULiBJZiBubyBBYm91dCwgRmVhdHVyZSBMaWNlbnNlLAorCQlvciBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIGlzIHByb3ZpZGVkLCBwbGVhc2UgY29udGFjdCB0aGUgRWNsaXBzZQorCQlGb3VuZGF0aW9uIHRvIGRldGVybWluZSB3aGF0IHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybiB0aGF0CisJCXBhcnRpY3VsYXIgQ29udGVudC48L3A+CiAKIAotPGgzPlVzZSBvZiBQcm92aXNpb25pbmcgVGVjaG5vbG9neTwvaDM+CisJPGgzPlVzZSBvZiBQcm92aXNpb25pbmcgVGVjaG5vbG9neTwvaDM+CiAKLTxwPlRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWFrZXMgYXZhaWxhYmxlIHByb3Zpc2lvbmluZyBzb2Z0d2FyZSwgZXhhbXBsZXMgb2Ygd2hpY2ggaW5jbHVkZSwgYnV0IGFyZSBub3QgbGltaXRlZCB0bywgcDIgYW5kIHRoZSBFY2xpcHNlCi0gICBVcGRhdGUgTWFuYWdlciAoJnF1b3Q7UHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kmcXVvdDspIGZvciB0aGUgcHVycG9zZSBvZiBhbGxvd2luZyB1c2VycyB0byBpbnN0YWxsIHNvZnR3YXJlLCBkb2N1bWVudGF0aW9uLCBpbmZvcm1hdGlvbiBhbmQvb3IKLSAgIG90aGVyIG1hdGVyaWFscyAoY29sbGVjdGl2ZWx5ICZxdW90O0luc3RhbGxhYmxlIFNvZnR3YXJlJnF1b3Q7KS4gVGhpcyBjYXBhYmlsaXR5IGlzIHByb3ZpZGVkIHdpdGggdGhlIGludGVudCBvZiBhbGxvd2luZyBzdWNoIHVzZXJzIHRvCi0gICBpbnN0YWxsLCBleHRlbmQgYW5kIHVwZGF0ZSBFY2xpcHNlLWJhc2VkIHByb2R1Y3RzLiBJbmZvcm1hdGlvbiBhYm91dCBwYWNrYWdpbmcgSW5zdGFsbGFibGUgU29mdHdhcmUgaXMgYXZhaWxhYmxlIGF0IDxhCi0gICAgICAgaHJlZj0iaHR0cDovL2VjbGlwc2Uub3JnL2VxdWlub3gvcDIvcmVwb3NpdG9yeV9wYWNrYWdpbmcuaHRtbCI+aHR0cDovL2VjbGlwc2Uub3JnL2VxdWlub3gvcDIvcmVwb3NpdG9yeV9wYWNrYWdpbmcuaHRtbDwvYT4KLSAgICgmcXVvdDtTcGVjaWZpY2F0aW9uJnF1b3Q7KS48L3A+CisJPHA+CisJCVRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWFrZXMgYXZhaWxhYmxlIHByb3Zpc2lvbmluZyBzb2Z0d2FyZSwgZXhhbXBsZXMKKwkJb2Ygd2hpY2ggaW5jbHVkZSwgYnV0IGFyZSBub3QgbGltaXRlZCB0bywgcDIgYW5kIHRoZSBFY2xpcHNlIFVwZGF0ZQorCQlNYW5hZ2VyICgmcXVvdDtQcm92aXNpb25pbmcgVGVjaG5vbG9neSZxdW90OykgZm9yIHRoZSBwdXJwb3NlIG9mCisJCWFsbG93aW5nIHVzZXJzIHRvIGluc3RhbGwgc29mdHdhcmUsIGRvY3VtZW50YXRpb24sIGluZm9ybWF0aW9uIGFuZC9vcgorCQlvdGhlciBtYXRlcmlhbHMgKGNvbGxlY3RpdmVseSAmcXVvdDtJbnN0YWxsYWJsZSBTb2Z0d2FyZSZxdW90OykuIFRoaXMKKwkJY2FwYWJpbGl0eSBpcyBwcm92aWRlZCB3aXRoIHRoZSBpbnRlbnQgb2YgYWxsb3dpbmcgc3VjaCB1c2VycyB0bworCQlpbnN0YWxsLCBleHRlbmQgYW5kIHVwZGF0ZSBFY2xpcHNlLWJhc2VkIHByb2R1Y3RzLiBJbmZvcm1hdGlvbiBhYm91dAorCQlwYWNrYWdpbmcgSW5zdGFsbGFibGUgU29mdHdhcmUgaXMgYXZhaWxhYmxlIGF0IDxhCisJCQlocmVmPSJodHRwOi8vZWNsaXBzZS5vcmcvZXF1aW5veC9wMi9yZXBvc2l0b3J5X3BhY2thZ2luZy5odG1sIj5odHRwOi8vZWNsaXBzZS5vcmcvZXF1aW5veC9wMi9yZXBvc2l0b3J5X3BhY2thZ2luZy5odG1sPC9hPgorCQkoJnF1b3Q7U3BlY2lmaWNhdGlvbiZxdW90OykuCisJPC9wPgogCi08cD5Zb3UgbWF5IHVzZSBQcm92aXNpb25pbmcgVGVjaG5vbG9neSB0byBhbGxvdyBvdGhlciBwYXJ0aWVzIHRvIGluc3RhbGwgSW5zdGFsbGFibGUgU29mdHdhcmUuIFlvdSBzaGFsbCBiZSByZXNwb25zaWJsZSBmb3IgZW5hYmxpbmcgdGhlCi0gICBhcHBsaWNhYmxlIGxpY2Vuc2UgYWdyZWVtZW50cyByZWxhdGluZyB0byB0aGUgSW5zdGFsbGFibGUgU29mdHdhcmUgdG8gYmUgcHJlc2VudGVkIHRvLCBhbmQgYWNjZXB0ZWQgYnksIHRoZSB1c2VycyBvZiB0aGUgUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kKLSAgIGluIGFjY29yZGFuY2Ugd2l0aCB0aGUgU3BlY2lmaWNhdGlvbi4gQnkgdXNpbmcgUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kgaW4gc3VjaCBhIG1hbm5lciBhbmQgbWFraW5nIGl0IGF2YWlsYWJsZSBpbiBhY2NvcmRhbmNlIHdpdGggdGhlCi0gICBTcGVjaWZpY2F0aW9uLCB5b3UgZnVydGhlciBhY2tub3dsZWRnZSB5b3VyIGFncmVlbWVudCB0bywgYW5kIHRoZSBhY3F1aXNpdGlvbiBvZiBhbGwgbmVjZXNzYXJ5IHJpZ2h0cyB0byBwZXJtaXQgdGhlIGZvbGxvd2luZzo8L3A+CisJPHA+WW91IG1heSB1c2UgUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kgdG8gYWxsb3cgb3RoZXIgcGFydGllcyB0bworCQlpbnN0YWxsIEluc3RhbGxhYmxlIFNvZnR3YXJlLiBZb3Ugc2hhbGwgYmUgcmVzcG9uc2libGUgZm9yIGVuYWJsaW5nCisJCXRoZSBhcHBsaWNhYmxlIGxpY2Vuc2UgYWdyZWVtZW50cyByZWxhdGluZyB0byB0aGUgSW5zdGFsbGFibGUgU29mdHdhcmUKKwkJdG8gYmUgcHJlc2VudGVkIHRvLCBhbmQgYWNjZXB0ZWQgYnksIHRoZSB1c2VycyBvZiB0aGUgUHJvdmlzaW9uaW5nCisJCVRlY2hub2xvZ3kgaW4gYWNjb3JkYW5jZSB3aXRoIHRoZSBTcGVjaWZpY2F0aW9uLiBCeSB1c2luZyBQcm92aXNpb25pbmcKKwkJVGVjaG5vbG9neSBpbiBzdWNoIGEgbWFubmVyIGFuZCBtYWtpbmcgaXQgYXZhaWxhYmxlIGluIGFjY29yZGFuY2Ugd2l0aAorCQl0aGUgU3BlY2lmaWNhdGlvbiwgeW91IGZ1cnRoZXIgYWNrbm93bGVkZ2UgeW91ciBhZ3JlZW1lbnQgdG8sIGFuZCB0aGUKKwkJYWNxdWlzaXRpb24gb2YgYWxsIG5lY2Vzc2FyeSByaWdodHMgdG8gcGVybWl0IHRoZSBmb2xsb3dpbmc6PC9wPgogCi08b2w+Ci0gICAgICAgPGxpPkEgc2VyaWVzIG9mIGFjdGlvbnMgbWF5IG9jY3VyICgmcXVvdDtQcm92aXNpb25pbmcgUHJvY2VzcyZxdW90OykgaW4gd2hpY2ggYSB1c2VyIG1heSBleGVjdXRlIHRoZSBQcm92aXNpb25pbmcgVGVjaG5vbG9neQotICAgICAgIG9uIGEgbWFjaGluZSAoJnF1b3Q7VGFyZ2V0IE1hY2hpbmUmcXVvdDspIHdpdGggdGhlIGludGVudCBvZiBpbnN0YWxsaW5nLCBleHRlbmRpbmcgb3IgdXBkYXRpbmcgdGhlIGZ1bmN0aW9uYWxpdHkgb2YgYW4gRWNsaXBzZS1iYXNlZAotICAgICAgIHByb2R1Y3QuPC9saT4KLSAgICAgICA8bGk+RHVyaW5nIHRoZSBQcm92aXNpb25pbmcgUHJvY2VzcywgdGhlIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5IG1heSBjYXVzZSB0aGlyZCBwYXJ0eSBJbnN0YWxsYWJsZSBTb2Z0d2FyZSBvciBhIHBvcnRpb24gdGhlcmVvZiB0byBiZQotICAgICAgIGFjY2Vzc2VkIGFuZCBjb3BpZWQgdG8gdGhlIFRhcmdldCBNYWNoaW5lLjwvbGk+Ci0gICAgICAgPGxpPlB1cnN1YW50IHRvIHRoZSBTcGVjaWZpY2F0aW9uLCB5b3Ugd2lsbCBwcm92aWRlIHRvIHRoZSB1c2VyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyB0aGF0IGdvdmVybiB0aGUgdXNlIG9mIHRoZSBJbnN0YWxsYWJsZQotICAgICAgIFNvZnR3YXJlICgmcXVvdDtJbnN0YWxsYWJsZSBTb2Z0d2FyZSBBZ3JlZW1lbnQmcXVvdDspIGFuZCBzdWNoIEluc3RhbGxhYmxlIFNvZnR3YXJlIEFncmVlbWVudCBzaGFsbCBiZSBhY2Nlc3NlZCBmcm9tIHRoZSBUYXJnZXQKLSAgICAgICBNYWNoaW5lIGluIGFjY29yZGFuY2Ugd2l0aCB0aGUgU3BlY2lmaWNhdGlvbi4gU3VjaCBJbnN0YWxsYWJsZSBTb2Z0d2FyZSBBZ3JlZW1lbnQgbXVzdCBpbmZvcm0gdGhlIHVzZXIgb2YgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIHRoYXQgZ292ZXJuCi0gICAgICAgdGhlIEluc3RhbGxhYmxlIFNvZnR3YXJlIGFuZCBtdXN0IHNvbGljaXQgYWNjZXB0YW5jZSBieSB0aGUgZW5kIHVzZXIgaW4gdGhlIG1hbm5lciBwcmVzY3JpYmVkIGluIHN1Y2ggSW5zdGFsbGFibGUgU29mdHdhcmUgQWdyZWVtZW50LiBVcG9uIHN1Y2gKLSAgICAgICBpbmRpY2F0aW9uIG9mIGFncmVlbWVudCBieSB0aGUgdXNlciwgdGhlIHByb3Zpc2lvbmluZyBUZWNobm9sb2d5IHdpbGwgY29tcGxldGUgaW5zdGFsbGF0aW9uIG9mIHRoZSBJbnN0YWxsYWJsZSBTb2Z0d2FyZS48L2xpPgotPC9vbD4KKwk8b2w+CisJCTxsaT5BIHNlcmllcyBvZiBhY3Rpb25zIG1heSBvY2N1ciAoJnF1b3Q7UHJvdmlzaW9uaW5nCisJCQlQcm9jZXNzJnF1b3Q7KSBpbiB3aGljaCBhIHVzZXIgbWF5IGV4ZWN1dGUgdGhlIFByb3Zpc2lvbmluZworCQkJVGVjaG5vbG9neSBvbiBhIG1hY2hpbmUgKCZxdW90O1RhcmdldCBNYWNoaW5lJnF1b3Q7KSB3aXRoIHRoZSBpbnRlbnQKKwkJCW9mIGluc3RhbGxpbmcsIGV4dGVuZGluZyBvciB1cGRhdGluZyB0aGUgZnVuY3Rpb25hbGl0eSBvZiBhbgorCQkJRWNsaXBzZS1iYXNlZCBwcm9kdWN0LjwvbGk+CisJCTxsaT5EdXJpbmcgdGhlIFByb3Zpc2lvbmluZyBQcm9jZXNzLCB0aGUgUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kKKwkJCW1heSBjYXVzZSB0aGlyZCBwYXJ0eSBJbnN0YWxsYWJsZSBTb2Z0d2FyZSBvciBhIHBvcnRpb24gdGhlcmVvZiB0byBiZQorCQkJYWNjZXNzZWQgYW5kIGNvcGllZCB0byB0aGUgVGFyZ2V0IE1hY2hpbmUuPC9saT4KKwkJPGxpPlB1cnN1YW50IHRvIHRoZSBTcGVjaWZpY2F0aW9uLCB5b3Ugd2lsbCBwcm92aWRlIHRvIHRoZSB1c2VyCisJCQl0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgdGhhdCBnb3Zlcm4gdGhlIHVzZSBvZiB0aGUgSW5zdGFsbGFibGUKKwkJCVNvZnR3YXJlICgmcXVvdDtJbnN0YWxsYWJsZSBTb2Z0d2FyZSBBZ3JlZW1lbnQmcXVvdDspIGFuZCBzdWNoCisJCQlJbnN0YWxsYWJsZSBTb2Z0d2FyZSBBZ3JlZW1lbnQgc2hhbGwgYmUgYWNjZXNzZWQgZnJvbSB0aGUgVGFyZ2V0CisJCQlNYWNoaW5lIGluIGFjY29yZGFuY2Ugd2l0aCB0aGUgU3BlY2lmaWNhdGlvbi4gU3VjaCBJbnN0YWxsYWJsZQorCQkJU29mdHdhcmUgQWdyZWVtZW50IG11c3QgaW5mb3JtIHRoZSB1c2VyIG9mIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucworCQkJdGhhdCBnb3Zlcm4gdGhlIEluc3RhbGxhYmxlIFNvZnR3YXJlIGFuZCBtdXN0IHNvbGljaXQgYWNjZXB0YW5jZSBieQorCQkJdGhlIGVuZCB1c2VyIGluIHRoZSBtYW5uZXIgcHJlc2NyaWJlZCBpbiBzdWNoIEluc3RhbGxhYmxlIFNvZnR3YXJlCisJCQlBZ3JlZW1lbnQuIFVwb24gc3VjaCBpbmRpY2F0aW9uIG9mIGFncmVlbWVudCBieSB0aGUgdXNlciwgdGhlCisJCQlwcm92aXNpb25pbmcgVGVjaG5vbG9neSB3aWxsIGNvbXBsZXRlIGluc3RhbGxhdGlvbiBvZiB0aGUgSW5zdGFsbGFibGUKKwkJCVNvZnR3YXJlLjwvbGk+CisJPC9vbD4KIAotPGgzPkNyeXB0b2dyYXBoeTwvaDM+CisJPGgzPkNyeXB0b2dyYXBoeTwvaDM+CiAKLTxwPkNvbnRlbnQgbWF5IGNvbnRhaW4gZW5jcnlwdGlvbiBzb2Z0d2FyZS4gVGhlIGNvdW50cnkgaW4gd2hpY2ggeW91IGFyZSBjdXJyZW50bHkgbWF5IGhhdmUgcmVzdHJpY3Rpb25zIG9uIHRoZSBpbXBvcnQsIHBvc3Nlc3Npb24sIGFuZCB1c2UsIGFuZC9vciByZS1leHBvcnQgdG8KLSAgIGFub3RoZXIgY291bnRyeSwgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZS4gQkVGT1JFIHVzaW5nIGFueSBlbmNyeXB0aW9uIHNvZnR3YXJlLCBwbGVhc2UgY2hlY2sgdGhlIGNvdW50cnkncyBsYXdzLCByZWd1bGF0aW9ucyBhbmQgcG9saWNpZXMgY29uY2VybmluZyB0aGUgaW1wb3J0LAotICAgcG9zc2Vzc2lvbiwgb3IgdXNlLCBhbmQgcmUtZXhwb3J0IG9mIGVuY3J5cHRpb24gc29mdHdhcmUsIHRvIHNlZSBpZiB0aGlzIGlzIHBlcm1pdHRlZC48L3A+CisJPHA+Q29udGVudCBtYXkgY29udGFpbiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBUaGUgY291bnRyeSBpbiB3aGljaAorCQl5b3UgYXJlIGN1cnJlbnRseSBtYXkgaGF2ZSByZXN0cmljdGlvbnMgb24gdGhlIGltcG9ydCwgcG9zc2Vzc2lvbiwgYW5kCisJCXVzZSwgYW5kL29yIHJlLWV4cG9ydCB0byBhbm90aGVyIGNvdW50cnksIG9mIGVuY3J5cHRpb24gc29mdHdhcmUuCisJCUJFRk9SRSB1c2luZyBhbnkgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgcGxlYXNlIGNoZWNrIHRoZSBjb3VudHJ5J3MgbGF3cywKKwkJcmVndWxhdGlvbnMgYW5kIHBvbGljaWVzIGNvbmNlcm5pbmcgdGhlIGltcG9ydCwgcG9zc2Vzc2lvbiwgb3IgdXNlLAorCQlhbmQgcmUtZXhwb3J0IG9mIGVuY3J5cHRpb24gc29mdHdhcmUsIHRvIHNlZSBpZiB0aGlzIGlzIHBlcm1pdHRlZC48L3A+CiAKLTxwPjxzbWFsbD5KYXZhIGFuZCBhbGwgSmF2YS1iYXNlZCB0cmFkZW1hcmtzIGFyZSB0cmFkZW1hcmtzIG9mIE9yYWNsZSBDb3Jwb3JhdGlvbiBpbiB0aGUgVW5pdGVkIFN0YXRlcywgb3RoZXIgY291bnRyaWVzLCBvciBib3RoLjwvc21hbGw+PC9wPgorCTxwPgorCQk8c21hbGw+SmF2YSBhbmQgYWxsIEphdmEtYmFzZWQgdHJhZGVtYXJrcyBhcmUgdHJhZGVtYXJrcyBvZgorCQkJT3JhY2xlIENvcnBvcmF0aW9uIGluIHRoZSBVbml0ZWQgU3RhdGVzLCBvdGhlciBjb3VudHJpZXMsIG9yIGJvdGguPC9zbWFsbD4KKwk8L3A+CiA8L2JvZHk+CiA8L2h0bWw+CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmRhdGFpbnRlcmNoYW5nZS5jb21tb24vTElDRU5TRS50eHQgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmRhdGFpbnRlcmNoYW5nZS5jb21tb24vTElDRU5TRS50eHQKaW5kZXggZmY0MmFkNC4uZmM1OTM4ZCAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5kYXRhaW50ZXJjaGFuZ2UuY29tbW9uL0xJQ0VOU0UudHh0CisrKyBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQuZGF0YWludGVyY2hhbmdlLmNvbW1vbi9MSUNFTlNFLnR4dApAQCAtMSwxNjEgKzEsMTQwIEBACi1FY2xpcHNlIFB1YmxpYyBMaWNlbnNlIC12IDEuMAorRWNsaXBzZSBGb3VuZGF0aW9uIFNvZnR3YXJlIFVzZXIgQWdyZWVtZW50CiAKLVRIRSBBQ0NPTVBBTllJTkcgUFJPR1JBTSBJUyBQUk9WSURFRCBVTkRFUiBUSEUgVEVSTVMgT0YgVEhJUyBFQ0xJUFNFIFBVQkxJQyBMSUNFTlNFICgiQUdSRUVNRU5UIikuIEFOWSBVU0UsIFJFUFJPRFVDVElPTgotT1IgRElTVFJJQlVUSU9OIE9GIFRIRSBQUk9HUkFNIENPTlNUSVRVVEVTIFJFQ0lQSUVOVCdTIEFDQ0VQVEFOQ0UgT0YgVEhJUyBBR1JFRU1FTlQuCitOb3ZlbWJlciAyMiwgMjAxNwogCi0xLiBERUZJTklUSU9OUworVXNhZ2UgT2YgQ29udGVudAogCi0iQ29udHJpYnV0aW9uIiBtZWFuczoKK1RIRSBFQ0xJUFNFIEZPVU5EQVRJT04gTUFLRVMgQVZBSUxBQkxFIFNPRlRXQVJFLCBET0NVTUVOVEFUSU9OLCBJTkZPUk1BVElPTgorQU5EL09SIE9USEVSIE1BVEVSSUFMUyBGT1IgT1BFTiBTT1VSQ0UgUFJPSkVDVFMgKENPTExFQ1RJVkVMWSAiQ09OVEVOVCIpLiBVU0UgT0YKK1RIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTIEFHUkVFTUVOVCBBTkQvT1IgVEhFCitURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBMSUNFTlNFIEFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRAorQkVMT1cuIEJZIFVTSU5HIFRIRSBDT05URU5ULCBZT1UgQUdSRUUgVEhBVCBZT1VSIFVTRSBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRAorQlkgVEhJUyBBR1JFRU1FTlQgQU5EL09SIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFCitBR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuIElGIFlPVSBETyBOT1QgQUdSRUUgVE8gVEhFCitURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTIEFHUkVFTUVOVCBBTkQgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIEFOWQorQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVywgVEhFTiBZT1UKK01BWSBOT1QgVVNFIFRIRSBDT05URU5ULgogCi1hKSBpbiB0aGUgY2FzZSBvZiB0aGUgaW5pdGlhbCBDb250cmlidXRvciwgdGhlIGluaXRpYWwgY29kZSBhbmQgZG9jdW1lbnRhdGlvbiBkaXN0cmlidXRlZCB1bmRlciB0aGlzIEFncmVlbWVudCwgYW5kCitBcHBsaWNhYmxlIExpY2Vuc2VzCiAKLWIpIGluIHRoZSBjYXNlIG9mIGVhY2ggc3Vic2VxdWVudCBDb250cmlidXRvcjoKK1VubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkLCBhbGwgQ29udGVudCBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uCitpcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlCitWZXJzaW9uIDIuMCAoIkVQTCIpLiBBIGNvcHkgb2YgdGhlIEVQTCBpcyBwcm92aWRlZCB3aXRoIHRoaXMgQ29udGVudCBhbmQgaXMgYWxzbworYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4gRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsCisiUHJvZ3JhbSIgd2lsbCBtZWFuIHRoZSBDb250ZW50LgogCi1pKSBjaGFuZ2VzIHRvIHRoZSBQcm9ncmFtLCBhbmQKK0NvbnRlbnQgaW5jbHVkZXMsIGJ1dCBpcyBub3QgbGltaXRlZCB0bywgc291cmNlIGNvZGUsIG9iamVjdCBjb2RlLCBkb2N1bWVudGF0aW9uCithbmQgb3RoZXIgZmlsZXMgbWFpbnRhaW5lZCBpbiB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIHNvdXJjZSBjb2RlIHJlcG9zaXRvcnkKKygiUmVwb3NpdG9yeSIpIGluIHNvZnR3YXJlIG1vZHVsZXMgKCJNb2R1bGVzIikgYW5kIG1hZGUgYXZhaWxhYmxlIGFzCitkb3dubG9hZGFibGUgYXJjaGl2ZXMgKCJEb3dubG9hZHMiKS4KIAotaWkpIGFkZGl0aW9ucyB0byB0aGUgUHJvZ3JhbTsKKy0gICBDb250ZW50IG1heSBiZSBzdHJ1Y3R1cmVkIGFuZCBwYWNrYWdlZCBpbnRvIG1vZHVsZXMgdG8gZmFjaWxpdGF0ZQorICAgIGRlbGl2ZXJpbmcsIGV4dGVuZGluZywgYW5kIHVwZ3JhZGluZyB0aGUgQ29udGVudC4gVHlwaWNhbCBtb2R1bGVzIG1heQorICAgIGluY2x1ZGUgcGx1Zy1pbnMgKCJQbHVnLWlucyIpLCBwbHVnLWluIGZyYWdtZW50cyAoIkZyYWdtZW50cyIpLCBhbmQKKyAgICBmZWF0dXJlcyAoIkZlYXR1cmVzIikuCistICAgRWFjaCBQbHVnLWluIG9yIEZyYWdtZW50IG1heSBiZSBwYWNrYWdlZCBhcyBhIHN1Yi1kaXJlY3Rvcnkgb3IgSkFSCisgICAgKEphdmHihKIgQVJjaGl2ZSkgaW4gYSBkaXJlY3RvcnkgbmFtZWQgInBsdWdpbnMiLgorLSAgIEEgRmVhdHVyZSBpcyBhIGJ1bmRsZSBvZiBvbmUgb3IgbW9yZSBQbHVnLWlucyBhbmQvb3IgRnJhZ21lbnRzIGFuZAorICAgIGFzc29jaWF0ZWQgbWF0ZXJpYWwuIEVhY2ggRmVhdHVyZSBtYXkgYmUgcGFja2FnZWQgYXMgYSBzdWItZGlyZWN0b3J5IGluIGEKKyAgICBkaXJlY3RvcnkgbmFtZWQgImZlYXR1cmVzIi4gV2l0aGluIGEgRmVhdHVyZSwgZmlsZXMgbmFtZWQgImZlYXR1cmUueG1sIiBtYXkKKyAgICBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZiB0aGUgUGx1Zy1pbnMgYW5kL29yCisgICAgRnJhZ21lbnRzIGFzc29jaWF0ZWQgd2l0aCB0aGF0IEZlYXR1cmUuCistICAgRmVhdHVyZXMgbWF5IGFsc28gaW5jbHVkZSBvdGhlciBGZWF0dXJlcyAoIkluY2x1ZGVkIEZlYXR1cmVzIikuIFdpdGhpbiBhCisgICAgRmVhdHVyZSwgZmlsZXMgbmFtZWQgImZlYXR1cmUueG1sIiBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZAorICAgIHZlcnNpb24gbnVtYmVycyBvZiBJbmNsdWRlZCBGZWF0dXJlcy4KIAotd2hlcmUgc3VjaCBjaGFuZ2VzIGFuZC9vciBhZGRpdGlvbnMgdG8gdGhlIFByb2dyYW0gb3JpZ2luYXRlIGZyb20gYW5kIGFyZSBkaXN0cmlidXRlZCBieSB0aGF0IHBhcnRpY3VsYXIgQ29udHJpYnV0b3IuCi1BIENvbnRyaWJ1dGlvbiAnb3JpZ2luYXRlcycgZnJvbSBhIENvbnRyaWJ1dG9yIGlmIGl0IHdhcyBhZGRlZCB0byB0aGUgUHJvZ3JhbSBieSBzdWNoIENvbnRyaWJ1dG9yIGl0c2VsZiBvciBhbnlvbmUKLWFjdGluZyBvbiBzdWNoIENvbnRyaWJ1dG9yJ3MgYmVoYWxmLiBDb250cmlidXRpb25zIGRvIG5vdCBpbmNsdWRlIGFkZGl0aW9ucyB0byB0aGUgUHJvZ3JhbSB3aGljaDogKGkpIGFyZSBzZXBhcmF0ZQotbW9kdWxlcyBvZiBzb2Z0d2FyZSBkaXN0cmlidXRlZCBpbiBjb25qdW5jdGlvbiB3aXRoIHRoZSBQcm9ncmFtIHVuZGVyIHRoZWlyIG93biBsaWNlbnNlIGFncmVlbWVudCwgYW5kIChpaSkgYXJlIG5vdAotZGVyaXZhdGl2ZSB3b3JrcyBvZiB0aGUgUHJvZ3JhbS4KK1RoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBzaG91bGQgYmUgY29udGFpbmVkIGluCitmaWxlcyBuYW1lZCAiYWJvdXQuaHRtbCIgKCJBYm91dHMiKS4gVGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyBGZWF0dXJlcworYW5kIEluY2x1ZGVkIEZlYXR1cmVzIHNob3VsZCBiZSBjb250YWluZWQgaW4gZmlsZXMgbmFtZWQgImxpY2Vuc2UuaHRtbCIKKygiRmVhdHVyZSBMaWNlbnNlcyIpLiBBYm91dHMgYW5kIEZlYXR1cmUgTGljZW5zZXMgbWF5IGJlIGxvY2F0ZWQgaW4gYW55CitkaXJlY3Rvcnkgb2YgYSBEb3dubG9hZCBvciBNb2R1bGUgaW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGZvbGxvd2luZworbG9jYXRpb25zOgogCi0iQ29udHJpYnV0b3IiIG1lYW5zIGFueSBwZXJzb24gb3IgZW50aXR5IHRoYXQgZGlzdHJpYnV0ZXMgdGhlIFByb2dyYW0uCistICAgVGhlIHRvcC1sZXZlbCAocm9vdCkgZGlyZWN0b3J5CistICAgUGx1Zy1pbiBhbmQgRnJhZ21lbnQgZGlyZWN0b3JpZXMKKy0gICBJbnNpZGUgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBwYWNrYWdlZCBhcyBKQVJzCistICAgU3ViLWRpcmVjdG9yaWVzIG9mIHRoZSBkaXJlY3RvcnkgbmFtZWQgInNyYyIgb2YgY2VydGFpbiBQbHVnLWlucworLSAgIEZlYXR1cmUgZGlyZWN0b3JpZXMKIAotIkxpY2Vuc2VkIFBhdGVudHMgIiBtZWFuIHBhdGVudCBjbGFpbXMgbGljZW5zYWJsZSBieSBhIENvbnRyaWJ1dG9yIHdoaWNoIGFyZSBuZWNlc3NhcmlseSBpbmZyaW5nZWQgYnkgdGhlIHVzZSBvciBzYWxlIG9mCi1pdHMgQ29udHJpYnV0aW9uIGFsb25lIG9yIHdoZW4gY29tYmluZWQgd2l0aCB0aGUgUHJvZ3JhbS4KK05vdGU6IGlmIGEgRmVhdHVyZSBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIGlzIGluc3RhbGxlZCB1c2luZwordGhlIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5IChhcyBkZWZpbmVkIGJlbG93KSwgeW91IG11c3QgYWdyZWUgdG8gYSBsaWNlbnNlCisoIkZlYXR1cmUgVXBkYXRlIExpY2Vuc2UiKSBkdXJpbmcgdGhlIGluc3RhbGxhdGlvbiBwcm9jZXNzLiBJZiB0aGUgRmVhdHVyZQorY29udGFpbnMgSW5jbHVkZWQgRmVhdHVyZXMsIHRoZSBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIHNob3VsZCBlaXRoZXIgcHJvdmlkZSB5b3UKK3dpdGggdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyB0aGUgSW5jbHVkZWQgRmVhdHVyZXMgb3IgaW5mb3JtIHlvdQord2hlcmUgeW91IGNhbiBsb2NhdGUgdGhlbS4gRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgbWF5IGJlIGZvdW5kIGluIHRoZSAibGljZW5zZSIKK3Byb3BlcnR5IG9mIGZpbGVzIG5hbWVkICJmZWF0dXJlLnByb3BlcnRpZXMiIGZvdW5kIHdpdGhpbiBhIEZlYXR1cmUuIFN1Y2gKK0Fib3V0cywgRmVhdHVyZSBMaWNlbnNlcywgYW5kIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIGNvbnRhaW4gdGhlIHRlcm1zIGFuZAorY29uZGl0aW9ucyAob3IgcmVmZXJlbmNlcyB0byBzdWNoIHRlcm1zIGFuZCBjb25kaXRpb25zKSB0aGF0IGdvdmVybiB5b3VyIHVzZSBvZgordGhlIGFzc29jaWF0ZWQgQ29udGVudCBpbiB0aGF0IGRpcmVjdG9yeS4KIAotIlByb2dyYW0iIG1lYW5zIHRoZSBDb250cmlidXRpb25zIGRpc3RyaWJ1dGVkIGluIGFjY29yZGFuY2Ugd2l0aCB0aGlzIEFncmVlbWVudC4KK1RIRSBBQk9VVFMsIEZFQVRVUkUgTElDRU5TRVMsIEFORCBGRUFUVVJFIFVQREFURSBMSUNFTlNFUyBNQVkgUkVGRVIgVE8gVEhFIEVQTAorT1IgT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTLCBOT1RJQ0VTIE9SIFRFUk1TIEFORCBDT05ESVRJT05TLiBTT01FIE9GIFRIRVNFCitPVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMgTUFZIElOQ0xVREUgKEJVVCBBUkUgTk9UIExJTUlURUQgVE8pOgogCi0iUmVjaXBpZW50IiBtZWFucyBhbnlvbmUgd2hvIHJlY2VpdmVzIHRoZSBQcm9ncmFtIHVuZGVyIHRoaXMgQWdyZWVtZW50LCBpbmNsdWRpbmcgYWxsIENvbnRyaWJ1dG9ycy4KKy0gICBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wIChhdmFpbGFibGUgYXQKKyAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCkKKy0gICBFY2xpcHNlIERpc3RyaWJ1dGlvbiBMaWNlbnNlIFZlcnNpb24gMS4wIChhdmFpbGFibGUgYXQKKyAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xpY2Vuc2VzL2VkbC12MS4wLmh0bWwpCistICAgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wIChhdmFpbGFibGUgYXQKKyAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbCkKKy0gICBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSAxLjEgKGF2YWlsYWJsZSBhdAorICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFKQorLSAgIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDIuMCAoYXZhaWxhYmxlIGF0CisgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wKQorLSAgIE1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjEgKGF2YWlsYWJsZSBhdAorICAgIGh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBML01QTC0xLjEuaHRtbCkKIAotMi4gR1JBTlQgT0YgUklHSFRTCitJVCBJUyBZT1VSIE9CTElHQVRJT04gVE8gUkVBRCBBTkQgQUNDRVBUIEFMTCBTVUNIIFRFUk1TIEFORCBDT05ESVRJT05TIFBSSU9SIFRPCitVU0UgT0YgVEhFIENPTlRFTlQuIElmIG5vIEFib3V0LCBGZWF0dXJlIExpY2Vuc2UsIG9yIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2UgaXMKK3Byb3ZpZGVkLCBwbGVhc2UgY29udGFjdCB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIHRvIGRldGVybWluZSB3aGF0IHRlcm1zIGFuZAorY29uZGl0aW9ucyBnb3Zlcm4gdGhhdCBwYXJ0aWN1bGFyIENvbnRlbnQuCiAKLWEpIFN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoaXMgQWdyZWVtZW50LCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgUmVjaXBpZW50IGEgbm9uLWV4Y2x1c2l2ZSwgd29ybGR3aWRlLAotcm95YWx0eS1mcmVlIGNvcHlyaWdodCBsaWNlbnNlIHRvIHJlcHJvZHVjZSwgcHJlcGFyZSBkZXJpdmF0aXZlIHdvcmtzIG9mLCBwdWJsaWNseSBkaXNwbGF5LCBwdWJsaWNseSBwZXJmb3JtLCBkaXN0cmlidXRlCi1hbmQgc3VibGljZW5zZSB0aGUgQ29udHJpYnV0aW9uIG9mIHN1Y2ggQ29udHJpYnV0b3IsIGlmIGFueSwgYW5kIHN1Y2ggZGVyaXZhdGl2ZSB3b3JrcywgaW4gc291cmNlIGNvZGUgYW5kIG9iamVjdCBjb2RlCi1mb3JtLgorVXNlIG9mIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5CiAKLWIpIFN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoaXMgQWdyZWVtZW50LCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgUmVjaXBpZW50IGEgbm9uLWV4Y2x1c2l2ZSwgd29ybGR3aWRlLAotcm95YWx0eS1mcmVlIHBhdGVudCBsaWNlbnNlIHVuZGVyIExpY2Vuc2VkIFBhdGVudHMgdG8gbWFrZSwgdXNlLCBzZWxsLCBvZmZlciB0byBzZWxsLCBpbXBvcnQgYW5kIG90aGVyd2lzZSB0cmFuc2ZlciB0aGUKLUNvbnRyaWJ1dGlvbiBvZiBzdWNoIENvbnRyaWJ1dG9yLCBpZiBhbnksIGluIHNvdXJjZSBjb2RlIGFuZCBvYmplY3QgY29kZSBmb3JtLiBUaGlzIHBhdGVudCBsaWNlbnNlIHNoYWxsIGFwcGx5IHRvIHRoZQotY29tYmluYXRpb24gb2YgdGhlIENvbnRyaWJ1dGlvbiBhbmQgdGhlIFByb2dyYW0gaWYsIGF0IHRoZSB0aW1lIHRoZSBDb250cmlidXRpb24gaXMgYWRkZWQgYnkgdGhlIENvbnRyaWJ1dG9yLCBzdWNoCi1hZGRpdGlvbiBvZiB0aGUgQ29udHJpYnV0aW9uIGNhdXNlcyBzdWNoIGNvbWJpbmF0aW9uIHRvIGJlIGNvdmVyZWQgYnkgdGhlIExpY2Vuc2VkIFBhdGVudHMuIFRoZSBwYXRlbnQgbGljZW5zZSBzaGFsbCBub3QKLWFwcGx5IHRvIGFueSBvdGhlciBjb21iaW5hdGlvbnMgd2hpY2ggaW5jbHVkZSB0aGUgQ29udHJpYnV0aW9uLiBObyBoYXJkd2FyZSBwZXIgc2UgaXMgbGljZW5zZWQgaGVyZXVuZGVyLgorVGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYWtlcyBhdmFpbGFibGUgcHJvdmlzaW9uaW5nIHNvZnR3YXJlLCBleGFtcGxlcyBvZiB3aGljaAoraW5jbHVkZSwgYnV0IGFyZSBub3QgbGltaXRlZCB0bywgcDIgYW5kIHRoZSBFY2xpcHNlIFVwZGF0ZSBNYW5hZ2VyCisoIlByb3Zpc2lvbmluZyBUZWNobm9sb2d5IikgZm9yIHRoZSBwdXJwb3NlIG9mIGFsbG93aW5nIHVzZXJzIHRvIGluc3RhbGwKK3NvZnR3YXJlLCBkb2N1bWVudGF0aW9uLCBpbmZvcm1hdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIChjb2xsZWN0aXZlbHkKKyJJbnN0YWxsYWJsZSBTb2Z0d2FyZSIpLiBUaGlzIGNhcGFiaWxpdHkgaXMgcHJvdmlkZWQgd2l0aCB0aGUgaW50ZW50IG9mIGFsbG93aW5nCitzdWNoIHVzZXJzIHRvIGluc3RhbGwsIGV4dGVuZCBhbmQgdXBkYXRlIEVjbGlwc2UtYmFzZWQgcHJvZHVjdHMuIEluZm9ybWF0aW9uCithYm91dCBwYWNrYWdpbmcgSW5zdGFsbGFibGUgU29mdHdhcmUgaXMgYXZhaWxhYmxlIGF0CitodHRwOi8vZWNsaXBzZS5vcmcvZXF1aW5veC9wMi9yZXBvc2l0b3J5X3BhY2thZ2luZy5odG1sICgiU3BlY2lmaWNhdGlvbiIpLgogCi1jKSBSZWNpcGllbnQgdW5kZXJzdGFuZHMgdGhhdCBhbHRob3VnaCBlYWNoIENvbnRyaWJ1dG9yIGdyYW50cyB0aGUgbGljZW5zZXMgdG8gaXRzIENvbnRyaWJ1dGlvbnMgc2V0IGZvcnRoIGhlcmVpbiwgbm8KLWFzc3VyYW5jZXMgYXJlIHByb3ZpZGVkIGJ5IGFueSBDb250cmlidXRvciB0aGF0IHRoZSBQcm9ncmFtIGRvZXMgbm90IGluZnJpbmdlIHRoZSBwYXRlbnQgb3Igb3RoZXIgaW50ZWxsZWN0dWFsIHByb3BlcnR5Ci1yaWdodHMgb2YgYW55IG90aGVyIGVudGl0eS4gRWFjaCBDb250cmlidXRvciBkaXNjbGFpbXMgYW55IGxpYWJpbGl0eSB0byBSZWNpcGllbnQgZm9yIGNsYWltcyBicm91Z2h0IGJ5IGFueSBvdGhlciBlbnRpdHkKLWJhc2VkIG9uIGluZnJpbmdlbWVudCBvZiBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIG9yIG90aGVyd2lzZS4gQXMgYSBjb25kaXRpb24gdG8gZXhlcmNpc2luZyB0aGUgcmlnaHRzIGFuZAotbGljZW5zZXMgZ3JhbnRlZCBoZXJldW5kZXIsIGVhY2ggUmVjaXBpZW50IGhlcmVieSBhc3N1bWVzIHNvbGUgcmVzcG9uc2liaWxpdHkgdG8gc2VjdXJlIGFueSBvdGhlciBpbnRlbGxlY3R1YWwgcHJvcGVydHkKLXJpZ2h0cyBuZWVkZWQsIGlmIGFueS4gRm9yIGV4YW1wbGUsIGlmIGEgdGhpcmQgcGFydHkgcGF0ZW50IGxpY2Vuc2UgaXMgcmVxdWlyZWQgdG8gYWxsb3cgUmVjaXBpZW50IHRvIGRpc3RyaWJ1dGUgdGhlCi1Qcm9ncmFtLCBpdCBpcyBSZWNpcGllbnQncyByZXNwb25zaWJpbGl0eSB0byBhY3F1aXJlIHRoYXQgbGljZW5zZSBiZWZvcmUgZGlzdHJpYnV0aW5nIHRoZSBQcm9ncmFtLgorWW91IG1heSB1c2UgUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kgdG8gYWxsb3cgb3RoZXIgcGFydGllcyB0byBpbnN0YWxsCitJbnN0YWxsYWJsZSBTb2Z0d2FyZS4gWW91IHNoYWxsIGJlIHJlc3BvbnNpYmxlIGZvciBlbmFibGluZyB0aGUgYXBwbGljYWJsZQorbGljZW5zZSBhZ3JlZW1lbnRzIHJlbGF0aW5nIHRvIHRoZSBJbnN0YWxsYWJsZSBTb2Z0d2FyZSB0byBiZSBwcmVzZW50ZWQgdG8sIGFuZAorYWNjZXB0ZWQgYnksIHRoZSB1c2VycyBvZiB0aGUgUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kgaW4gYWNjb3JkYW5jZSB3aXRoIHRoZQorU3BlY2lmaWNhdGlvbi4gQnkgdXNpbmcgUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kgaW4gc3VjaCBhIG1hbm5lciBhbmQgbWFraW5nIGl0CithdmFpbGFibGUgaW4gYWNjb3JkYW5jZSB3aXRoIHRoZSBTcGVjaWZpY2F0aW9uLCB5b3UgZnVydGhlciBhY2tub3dsZWRnZSB5b3VyCithZ3JlZW1lbnQgdG8sIGFuZCB0aGUgYWNxdWlzaXRpb24gb2YgYWxsIG5lY2Vzc2FyeSByaWdodHMgdG8gcGVybWl0IHRoZQorZm9sbG93aW5nOgogCi1kKSBFYWNoIENvbnRyaWJ1dG9yIHJlcHJlc2VudHMgdGhhdCB0byBpdHMga25vd2xlZGdlIGl0IGhhcyBzdWZmaWNpZW50IGNvcHlyaWdodCByaWdodHMgaW4gaXRzIENvbnRyaWJ1dGlvbiwgaWYgYW55LCB0bwotZ3JhbnQgdGhlIGNvcHlyaWdodCBsaWNlbnNlIHNldCBmb3J0aCBpbiB0aGlzIEFncmVlbWVudC4KKzEuICBBIHNlcmllcyBvZiBhY3Rpb25zIG1heSBvY2N1ciAoIlByb3Zpc2lvbmluZyBQcm9jZXNzIikgaW4gd2hpY2ggYSB1c2VyIG1heQorICAgIGV4ZWN1dGUgdGhlIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5IG9uIGEgbWFjaGluZSAoIlRhcmdldCBNYWNoaW5lIikgd2l0aCB0aGUKKyAgICBpbnRlbnQgb2YgaW5zdGFsbGluZywgZXh0ZW5kaW5nIG9yIHVwZGF0aW5nIHRoZSBmdW5jdGlvbmFsaXR5IG9mIGFuCisgICAgRWNsaXBzZS1iYXNlZCBwcm9kdWN0LgorMi4gIER1cmluZyB0aGUgUHJvdmlzaW9uaW5nIFByb2Nlc3MsIHRoZSBQcm92aXNpb25pbmcgVGVjaG5vbG9neSBtYXkgY2F1c2UgdGhpcmQKKyAgICBwYXJ0eSBJbnN0YWxsYWJsZSBTb2Z0d2FyZSBvciBhIHBvcnRpb24gdGhlcmVvZiB0byBiZSBhY2Nlc3NlZCBhbmQgY29waWVkIHRvCisgICAgdGhlIFRhcmdldCBNYWNoaW5lLgorMy4gIFB1cnN1YW50IHRvIHRoZSBTcGVjaWZpY2F0aW9uLCB5b3Ugd2lsbCBwcm92aWRlIHRvIHRoZSB1c2VyIHRoZSB0ZXJtcyBhbmQKKyAgICBjb25kaXRpb25zIHRoYXQgZ292ZXJuIHRoZSB1c2Ugb2YgdGhlIEluc3RhbGxhYmxlIFNvZnR3YXJlICgiSW5zdGFsbGFibGUKKyAgICBTb2Z0d2FyZSBBZ3JlZW1lbnQiKSBhbmQgc3VjaCBJbnN0YWxsYWJsZSBTb2Z0d2FyZSBBZ3JlZW1lbnQgc2hhbGwgYmUKKyAgICBhY2Nlc3NlZCBmcm9tIHRoZSBUYXJnZXQgTWFjaGluZSBpbiBhY2NvcmRhbmNlIHdpdGggdGhlIFNwZWNpZmljYXRpb24uIFN1Y2gKKyAgICBJbnN0YWxsYWJsZSBTb2Z0d2FyZSBBZ3JlZW1lbnQgbXVzdCBpbmZvcm0gdGhlIHVzZXIgb2YgdGhlIHRlcm1zIGFuZAorICAgIGNvbmRpdGlvbnMgdGhhdCBnb3Zlcm4gdGhlIEluc3RhbGxhYmxlIFNvZnR3YXJlIGFuZCBtdXN0IHNvbGljaXQgYWNjZXB0YW5jZQorICAgIGJ5IHRoZSBlbmQgdXNlciBpbiB0aGUgbWFubmVyIHByZXNjcmliZWQgaW4gc3VjaCBJbnN0YWxsYWJsZQorICAgIFNvZnR3YXJlIEFncmVlbWVudC4gVXBvbiBzdWNoIGluZGljYXRpb24gb2YgYWdyZWVtZW50IGJ5IHRoZSB1c2VyLCB0aGUKKyAgICBwcm92aXNpb25pbmcgVGVjaG5vbG9neSB3aWxsIGNvbXBsZXRlIGluc3RhbGxhdGlvbiBvZiB0aGUKKyAgICBJbnN0YWxsYWJsZSBTb2Z0d2FyZS4KIAotMy4gUkVRVUlSRU1FTlRTCitDcnlwdG9ncmFwaHkKIAotQSBDb250cmlidXRvciBtYXkgY2hvb3NlIHRvIGRpc3RyaWJ1dGUgdGhlIFByb2dyYW0gaW4gb2JqZWN0IGNvZGUgZm9ybSB1bmRlciBpdHMgb3duIGxpY2Vuc2UgYWdyZWVtZW50LCBwcm92aWRlZCB0aGF0OgorQ29udGVudCBtYXkgY29udGFpbiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBUaGUgY291bnRyeSBpbiB3aGljaCB5b3UgYXJlIGN1cnJlbnRseQorbWF5IGhhdmUgcmVzdHJpY3Rpb25zIG9uIHRoZSBpbXBvcnQsIHBvc3Nlc3Npb24sIGFuZCB1c2UsIGFuZC9vciByZS1leHBvcnQgdG8KK2Fub3RoZXIgY291bnRyeSwgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZS4gQkVGT1JFIHVzaW5nIGFueSBlbmNyeXB0aW9uIHNvZnR3YXJlLAorcGxlYXNlIGNoZWNrIHRoZSBjb3VudHJ5J3MgbGF3cywgcmVndWxhdGlvbnMgYW5kIHBvbGljaWVzIGNvbmNlcm5pbmcgdGhlIGltcG9ydCwKK3Bvc3Nlc3Npb24sIG9yIHVzZSwgYW5kIHJlLWV4cG9ydCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLCB0byBzZWUgaWYgdGhpcyBpcworcGVybWl0dGVkLgogCi1hKSBpdCBjb21wbGllcyB3aXRoIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGlzIEFncmVlbWVudDsgYW5kCi0KLWIpIGl0cyBsaWNlbnNlIGFncmVlbWVudDoKLQotaSkgZWZmZWN0aXZlbHkgZGlzY2xhaW1zIG9uIGJlaGFsZiBvZiBhbGwgQ29udHJpYnV0b3JzIGFsbCB3YXJyYW50aWVzIGFuZCBjb25kaXRpb25zLCBleHByZXNzIGFuZCBpbXBsaWVkLCBpbmNsdWRpbmcKLXdhcnJhbnRpZXMgb3IgY29uZGl0aW9ucyBvZiB0aXRsZSBhbmQgbm9uLWluZnJpbmdlbWVudCwgYW5kIGltcGxpZWQgd2FycmFudGllcyBvciBjb25kaXRpb25zIG9mIG1lcmNoYW50YWJpbGl0eSBhbmQKLWZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlOwotCi1paSkgZWZmZWN0aXZlbHkgZXhjbHVkZXMgb24gYmVoYWxmIG9mIGFsbCBDb250cmlidXRvcnMgYWxsIGxpYWJpbGl0eSBmb3IgZGFtYWdlcywgaW5jbHVkaW5nIGRpcmVjdCwgaW5kaXJlY3QsIHNwZWNpYWwsCi1pbmNpZGVudGFsIGFuZCBjb25zZXF1ZW50aWFsIGRhbWFnZXMsIHN1Y2ggYXMgbG9zdCBwcm9maXRzOwotCi1paWkpIHN0YXRlcyB0aGF0IGFueSBwcm92aXNpb25zIHdoaWNoIGRpZmZlciBmcm9tIHRoaXMgQWdyZWVtZW50IGFyZSBvZmZlcmVkIGJ5IHRoYXQgQ29udHJpYnV0b3IgYWxvbmUgYW5kIG5vdCBieSBhbnkKLW90aGVyIHBhcnR5OyBhbmQKLQotaXYpIHN0YXRlcyB0aGF0IHNvdXJjZSBjb2RlIGZvciB0aGUgUHJvZ3JhbSBpcyBhdmFpbGFibGUgZnJvbSBzdWNoIENvbnRyaWJ1dG9yLCBhbmQgaW5mb3JtcyBsaWNlbnNlZXMgaG93IHRvIG9idGFpbiBpdAotaW4gYSByZWFzb25hYmxlIG1hbm5lciBvbiBvciB0aHJvdWdoIGEgbWVkaXVtIGN1c3RvbWFyaWx5IHVzZWQgZm9yIHNvZnR3YXJlIGV4Y2hhbmdlLgotCi1XaGVuIHRoZSBQcm9ncmFtIGlzIG1hZGUgYXZhaWxhYmxlIGluIHNvdXJjZSBjb2RlIGZvcm06Ci0KLWEpIGl0IG11c3QgYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhpcyBBZ3JlZW1lbnQ7IGFuZAotCi1iKSBhIGNvcHkgb2YgdGhpcyBBZ3JlZW1lbnQgbXVzdCBiZSBpbmNsdWRlZCB3aXRoIGVhY2ggY29weSBvZiB0aGUgUHJvZ3JhbS4KLQotQ29udHJpYnV0b3JzIG1heSBub3QgcmVtb3ZlIG9yIGFsdGVyIGFueSBjb3B5cmlnaHQgbm90aWNlcyBjb250YWluZWQgd2l0aGluIHRoZSBQcm9ncmFtLgotCi1FYWNoIENvbnRyaWJ1dG9yIG11c3QgaWRlbnRpZnkgaXRzZWxmIGFzIHRoZSBvcmlnaW5hdG9yIG9mIGl0cyBDb250cmlidXRpb24sIGlmIGFueSwgaW4gYSBtYW5uZXIgdGhhdCByZWFzb25hYmx5IGFsbG93cwotc3Vic2VxdWVudCBSZWNpcGllbnRzIHRvIGlkZW50aWZ5IHRoZSBvcmlnaW5hdG9yIG9mIHRoZSBDb250cmlidXRpb24uCi0KLTQuIENPTU1FUkNJQUwgRElTVFJJQlVUSU9OCi0KLUNvbW1lcmNpYWwgZGlzdHJpYnV0b3JzIG9mIHNvZnR3YXJlIG1heSBhY2NlcHQgY2VydGFpbiByZXNwb25zaWJpbGl0aWVzIHdpdGggcmVzcGVjdCB0byBlbmQgdXNlcnMsIGJ1c2luZXNzIHBhcnRuZXJzIGFuZAotdGhlIGxpa2UuIFdoaWxlIHRoaXMgbGljZW5zZSBpcyBpbnRlbmRlZCB0byBmYWNpbGl0YXRlIHRoZSBjb21tZXJjaWFsIHVzZSBvZiB0aGUgUHJvZ3JhbSwgdGhlIENvbnRyaWJ1dG9yIHdobyBpbmNsdWRlcwotdGhlIFByb2dyYW0gaW4gYSBjb21tZXJjaWFsIHByb2R1Y3Qgb2ZmZXJpbmcgc2hvdWxkIGRvIHNvIGluIGEgbWFubmVyIHdoaWNoIGRvZXMgbm90IGNyZWF0ZSBwb3RlbnRpYWwgbGlhYmlsaXR5IGZvcgotb3RoZXIgQ29udHJpYnV0b3JzLiBUaGVyZWZvcmUsIGlmIGEgQ29udHJpYnV0b3IgaW5jbHVkZXMgdGhlIFByb2dyYW0gaW4gYSBjb21tZXJjaWFsIHByb2R1Y3Qgb2ZmZXJpbmcsIHN1Y2ggQ29udHJpYnV0b3IKLSgiQ29tbWVyY2lhbCBDb250cmlidXRvciIpIGhlcmVieSBhZ3JlZXMgdG8gZGVmZW5kIGFuZCBpbmRlbW5pZnkgZXZlcnkgb3RoZXIgQ29udHJpYnV0b3IgKCJJbmRlbW5pZmllZCBDb250cmlidXRvciIpCi1hZ2FpbnN0IGFueSBsb3NzZXMsIGRhbWFnZXMgYW5kIGNvc3RzIChjb2xsZWN0aXZlbHkgIkxvc3NlcyIpIGFyaXNpbmcgZnJvbSBjbGFpbXMsIGxhd3N1aXRzIGFuZCBvdGhlciBsZWdhbCBhY3Rpb25zCi1icm91Z2h0IGJ5IGEgdGhpcmQgcGFydHkgYWdhaW5zdCB0aGUgSW5kZW1uaWZpZWQgQ29udHJpYnV0b3IgdG8gdGhlIGV4dGVudCBjYXVzZWQgYnkgdGhlIGFjdHMgb3Igb21pc3Npb25zIG9mIHN1Y2gKLUNvbW1lcmNpYWwgQ29udHJpYnV0b3IgaW4gY29ubmVjdGlvbiB3aXRoIGl0cyBkaXN0cmlidXRpb24gb2YgdGhlIFByb2dyYW0gaW4gYSBjb21tZXJjaWFsIHByb2R1Y3Qgb2ZmZXJpbmcuIFRoZQotb2JsaWdhdGlvbnMgaW4gdGhpcyBzZWN0aW9uIGRvIG5vdCBhcHBseSB0byBhbnkgY2xhaW1zIG9yIExvc3NlcyByZWxhdGluZyB0byBhbnkgYWN0dWFsIG9yIGFsbGVnZWQgaW50ZWxsZWN0dWFsCi1wcm9wZXJ0eSBpbmZyaW5nZW1lbnQuIEluIG9yZGVyIHRvIHF1YWxpZnksIGFuIEluZGVtbmlmaWVkIENvbnRyaWJ1dG9yIG11c3Q6IGEpIHByb21wdGx5IG5vdGlmeSB0aGUgQ29tbWVyY2lhbAotQ29udHJpYnV0b3IgaW4gd3JpdGluZyBvZiBzdWNoIGNsYWltLCBhbmQgYikgYWxsb3cgdGhlIENvbW1lcmNpYWwgQ29udHJpYnV0b3IgdG8gY29udHJvbCwgYW5kIGNvb3BlcmF0ZSB3aXRoIHRoZQotQ29tbWVyY2lhbCBDb250cmlidXRvciBpbiwgdGhlIGRlZmVuc2UgYW5kIGFueSByZWxhdGVkIHNldHRsZW1lbnQgbmVnb3RpYXRpb25zLiBUaGUgSW5kZW1uaWZpZWQgQ29udHJpYnV0b3IgbWF5Ci0gcGFydGljaXBhdGUgaW4gYW55IHN1Y2ggY2xhaW0gYXQgaXRzIG93biBleHBlbnNlLgotCi1Gb3IgZXhhbXBsZSwgYSBDb250cmlidXRvciBtaWdodCBpbmNsdWRlIHRoZSBQcm9ncmFtIGluIGEgY29tbWVyY2lhbCBwcm9kdWN0IG9mZmVyaW5nLCBQcm9kdWN0IFguIFRoYXQgQ29udHJpYnV0b3IgaXMKLXRoZW4gYSBDb21tZXJjaWFsIENvbnRyaWJ1dG9yLiBJZiB0aGF0IENvbW1lcmNpYWwgQ29udHJpYnV0b3IgdGhlbiBtYWtlcyBwZXJmb3JtYW5jZSBjbGFpbXMsIG9yIG9mZmVycyB3YXJyYW50aWVzCi1yZWxhdGVkIHRvIFByb2R1Y3QgWCwgdGhvc2UgcGVyZm9ybWFuY2UgY2xhaW1zIGFuZCB3YXJyYW50aWVzIGFyZSBzdWNoIENvbW1lcmNpYWwgQ29udHJpYnV0b3IncyByZXNwb25zaWJpbGl0eSBhbG9uZS4KLVVuZGVyIHRoaXMgc2VjdGlvbiwgdGhlIENvbW1lcmNpYWwgQ29udHJpYnV0b3Igd291bGQgaGF2ZSB0byBkZWZlbmQgY2xhaW1zIGFnYWluc3QgdGhlIG90aGVyIENvbnRyaWJ1dG9ycyByZWxhdGVkIHRvCi10aG9zZSBwZXJmb3JtYW5jZSBjbGFpbXMgYW5kIHdhcnJhbnRpZXMsIGFuZCBpZiBhIGNvdXJ0IHJlcXVpcmVzIGFueSBvdGhlciBDb250cmlidXRvciB0byBwYXkgYW55IGRhbWFnZXMgYXMgYSByZXN1bHQsCi10aGUgQ29tbWVyY2lhbCBDb250cmlidXRvciBtdXN0IHBheSB0aG9zZSBkYW1hZ2VzLgotCi01LiBOTyBXQVJSQU5UWQotCi1FWENFUFQgQVMgRVhQUkVTU0xZIFNFVCBGT1JUSCBJTiBUSElTIEFHUkVFTUVOVCwgVEhFIFBST0dSQU0gSVMgUFJPVklERUQgT04gQU4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SCi1DT05ESVRJT05TIE9GIEFOWSBLSU5ELCBFSVRIRVIgRVhQUkVTUyBPUiBJTVBMSUVEIElOQ0xVRElORywgV0lUSE9VVCBMSU1JVEFUSU9OLCBBTlkgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIFRJVExFLAotTk9OLUlORlJJTkdFTUVOVCwgTUVSQ0hBTlRBQklMSVRZIE9SIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBFYWNoIFJlY2lwaWVudCBpcyBzb2xlbHkgcmVzcG9uc2libGUgZm9yCi1kZXRlcm1pbmluZyB0aGUgYXBwcm9wcmlhdGVuZXNzIG9mIHVzaW5nIGFuZCBkaXN0cmlidXRpbmcgdGhlIFByb2dyYW0gYW5kIGFzc3VtZXMgYWxsIHJpc2tzIGFzc29jaWF0ZWQgd2l0aCBpdHMKLWV4ZXJjaXNlIG9mIHJpZ2h0cyB1bmRlciB0aGlzIEFncmVlbWVudCAsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIHJpc2tzIGFuZCBjb3N0cyBvZiBwcm9ncmFtIGVycm9ycywgY29tcGxpYW5jZQotd2l0aCBhcHBsaWNhYmxlIGxhd3MsIGRhbWFnZSB0byBvciBsb3NzIG9mIGRhdGEsIHByb2dyYW1zIG9yIGVxdWlwbWVudCwgYW5kIHVuYXZhaWxhYmlsaXR5IG9yIGludGVycnVwdGlvbiBvZiBvcGVyYXRpb25zLgotCi02LiBESVNDTEFJTUVSIE9GIExJQUJJTElUWQotCi1FWENFUFQgQVMgRVhQUkVTU0xZIFNFVCBGT1JUSCBJTiBUSElTIEFHUkVFTUVOVCwgTkVJVEhFUiBSRUNJUElFTlQgTk9SIEFOWSBDT05UUklCVVRPUlMgU0hBTEwgSEFWRSBBTlkgTElBQklMSVRZIEZPUiBBTlkKLURJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcgV0lUSE9VVCBMSU1JVEFUSU9OIExPU1QgUFJPRklUUyksCi1IT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SCi1PVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPUiBESVNUUklCVVRJT04gT0YgVEhFIFBST0dSQU0gT1IgVEhFIEVYRVJDSVNFIE9GIEFOWSBSSUdIVFMgR1JBTlRFRAotSEVSRVVOREVSLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFUy4KLQotNy4gR0VORVJBTAotCi1JZiBhbnkgcHJvdmlzaW9uIG9mIHRoaXMgQWdyZWVtZW50IGlzIGludmFsaWQgb3IgdW5lbmZvcmNlYWJsZSB1bmRlciBhcHBsaWNhYmxlIGxhdywgaXQgc2hhbGwgbm90IGFmZmVjdCB0aGUgdmFsaWRpdHkgb3IKLWVuZm9yY2VhYmlsaXR5IG9mIHRoZSByZW1haW5kZXIgb2YgdGhlIHRlcm1zIG9mIHRoaXMgQWdyZWVtZW50LCBhbmQgd2l0aG91dCBmdXJ0aGVyIGFjdGlvbiBieSB0aGUgcGFydGllcyBoZXJldG8sIHN1Y2gKLXByb3Zpc2lvbiBzaGFsbCBiZSByZWZvcm1lZCB0byB0aGUgbWluaW11bSBleHRlbnQgbmVjZXNzYXJ5IHRvIG1ha2Ugc3VjaCBwcm92aXNpb24gdmFsaWQgYW5kIGVuZm9yY2VhYmxlLgotCi1JZiBSZWNpcGllbnQgaW5zdGl0dXRlcyBwYXRlbnQgbGl0aWdhdGlvbiBhZ2FpbnN0IGFueSBlbnRpdHkgKGluY2x1ZGluZyBhIGNyb3NzLWNsYWltIG9yIGNvdW50ZXJjbGFpbSBpbiBhIGxhd3N1aXQpCi1hbGxlZ2luZyB0aGF0IHRoZSBQcm9ncmFtIGl0c2VsZiAoZXhjbHVkaW5nIGNvbWJpbmF0aW9ucyBvZiB0aGUgUHJvZ3JhbSB3aXRoIG90aGVyIHNvZnR3YXJlIG9yIGhhcmR3YXJlKSBpbmZyaW5nZXMgc3VjaAotUmVjaXBpZW50J3MgcGF0ZW50KHMpLCB0aGVuIHN1Y2ggUmVjaXBpZW50J3MgcmlnaHRzIGdyYW50ZWQgdW5kZXIgU2VjdGlvbiAyKGIpIHNoYWxsIHRlcm1pbmF0ZSBhcyBvZiB0aGUgZGF0ZSBzdWNoCi1saXRpZ2F0aW9uIGlzIGZpbGVkLgotCi1BbGwgUmVjaXBpZW50J3MgcmlnaHRzIHVuZGVyIHRoaXMgQWdyZWVtZW50IHNoYWxsIHRlcm1pbmF0ZSBpZiBpdCBmYWlscyB0byBjb21wbHkgd2l0aCBhbnkgb2YgdGhlIG1hdGVyaWFsIHRlcm1zIG9yCi1jb25kaXRpb25zIG9mIHRoaXMgQWdyZWVtZW50IGFuZCBkb2VzIG5vdCBjdXJlIHN1Y2ggZmFpbHVyZSBpbiBhIHJlYXNvbmFibGUgcGVyaW9kIG9mIHRpbWUgYWZ0ZXIgYmVjb21pbmcgYXdhcmUgb2Ygc3VjaAotbm9uY29tcGxpYW5jZS4gSWYgYWxsIFJlY2lwaWVudCdzIHJpZ2h0cyB1bmRlciB0aGlzIEFncmVlbWVudCB0ZXJtaW5hdGUsIFJlY2lwaWVudCBhZ3JlZXMgdG8gY2Vhc2UgdXNlIGFuZCBkaXN0cmlidXRpb24KLW9mIHRoZSBQcm9ncmFtIGFzIHNvb24gYXMgcmVhc29uYWJseSBwcmFjdGljYWJsZS4gSG93ZXZlciwgUmVjaXBpZW50J3Mgb2JsaWdhdGlvbnMgdW5kZXIgdGhpcyBBZ3JlZW1lbnQgYW5kIGFueSBsaWNlbnNlcwotIGdyYW50ZWQgYnkgUmVjaXBpZW50IHJlbGF0aW5nIHRvIHRoZSBQcm9ncmFtIHNoYWxsIGNvbnRpbnVlIGFuZCBzdXJ2aXZlLgotCi1FdmVyeW9uZSBpcyBwZXJtaXR0ZWQgdG8gY29weSBhbmQgZGlzdHJpYnV0ZSBjb3BpZXMgb2YgdGhpcyBBZ3JlZW1lbnQsIGJ1dCBpbiBvcmRlciB0byBhdm9pZCBpbmNvbnNpc3RlbmN5IHRoZSBBZ3JlZW1lbnQKLWlzIGNvcHlyaWdodGVkIGFuZCBtYXkgb25seSBiZSBtb2RpZmllZCBpbiB0aGUgZm9sbG93aW5nIG1hbm5lci4gVGhlIEFncmVlbWVudCBTdGV3YXJkIHJlc2VydmVzIHRoZSByaWdodCB0byBwdWJsaXNoCi1uZXcgdmVyc2lvbnMgKGluY2x1ZGluZyByZXZpc2lvbnMpIG9mIHRoaXMgQWdyZWVtZW50IGZyb20gdGltZSB0byB0aW1lLiBObyBvbmUgb3RoZXIgdGhhbiB0aGUgQWdyZWVtZW50IFN0ZXdhcmQgaGFzIHRoZQotcmlnaHQgdG8gbW9kaWZ5IHRoaXMgQWdyZWVtZW50LiBUaGUgRWNsaXBzZSBGb3VuZGF0aW9uIGlzIHRoZSBpbml0aWFsIEFncmVlbWVudCBTdGV3YXJkLiBUaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1heQotYXNzaWduIHRoZSByZXNwb25zaWJpbGl0eSB0byBzZXJ2ZSBhcyB0aGUgQWdyZWVtZW50IFN0ZXdhcmQgdG8gYSBzdWl0YWJsZSBzZXBhcmF0ZSBlbnRpdHkuIEVhY2ggbmV3IHZlcnNpb24gb2YgdGhlCi1BZ3JlZW1lbnQgd2lsbCBiZSBnaXZlbiBhIGRpc3Rpbmd1aXNoaW5nIHZlcnNpb24gbnVtYmVyLiBUaGUgUHJvZ3JhbSAoaW5jbHVkaW5nIENvbnRyaWJ1dGlvbnMpIG1heSBhbHdheXMgYmUKLWRpc3RyaWJ1dGVkIHN1YmplY3QgdG8gdGhlIHZlcnNpb24gb2YgdGhlIEFncmVlbWVudCB1bmRlciB3aGljaCBpdCB3YXMgcmVjZWl2ZWQuIEluIGFkZGl0aW9uLCBhZnRlciBhIG5ldyB2ZXJzaW9uIG9mCi10aGUgQWdyZWVtZW50IGlzIHB1Ymxpc2hlZCwgQ29udHJpYnV0b3IgbWF5IGVsZWN0IHRvIGRpc3RyaWJ1dGUgdGhlIFByb2dyYW0gKGluY2x1ZGluZyBpdHMgQ29udHJpYnV0aW9ucykgdW5kZXIgdGhlCi1uZXcgdmVyc2lvbi4gRXhjZXB0IGFzIGV4cHJlc3NseSBzdGF0ZWQgaW4gU2VjdGlvbnMgMihhKSBhbmQgMihiKSBhYm92ZSwgUmVjaXBpZW50IHJlY2VpdmVzIG5vIHJpZ2h0cyBvciBsaWNlbnNlcyB0bwotdGhlIGludGVsbGVjdHVhbCBwcm9wZXJ0eSBvZiBhbnkgQ29udHJpYnV0b3IgdW5kZXIgdGhpcyBBZ3JlZW1lbnQsIHdoZXRoZXIgZXhwcmVzc2x5LCBieSBpbXBsaWNhdGlvbiwgZXN0b3BwZWwgb3IKLW90aGVyd2lzZS4gQWxsIHJpZ2h0cyBpbiB0aGUgUHJvZ3JhbSBub3QgZXhwcmVzc2x5IGdyYW50ZWQgdW5kZXIgdGhpcyBBZ3JlZW1lbnQgYXJlIHJlc2VydmVkLgotCi1UaGlzIEFncmVlbWVudCBpcyBnb3Zlcm5lZCBieSB0aGUgbGF3cyBvZiB0aGUgU3RhdGUgb2YgTmV3IFlvcmsgYW5kIHRoZSBpbnRlbGxlY3R1YWwgcHJvcGVydHkgbGF3cyBvZiB0aGUgVW5pdGVkIFN0YXRlcwotb2YgQW1lcmljYS4gTm8gcGFydHkgdG8gdGhpcyBBZ3JlZW1lbnQgd2lsbCBicmluZyBhIGxlZ2FsIGFjdGlvbiB1bmRlciB0aGlzIEFncmVlbWVudCBtb3JlIHRoYW4gb25lIHllYXIgYWZ0ZXIgdGhlIGNhdXNlCi1vZiBhY3Rpb24gYXJvc2UuIEVhY2ggcGFydHkgd2FpdmVzIGl0cyByaWdodHMgdG8gYSBqdXJ5IHRyaWFsIGluIGFueSByZXN1bHRpbmcgbGl0aWdhdGlvbi4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCitKYXZhIGFuZCBhbGwgSmF2YS1iYXNlZCB0cmFkZW1hcmtzIGFyZSB0cmFkZW1hcmtzIG9mIE9yYWNsZSBDb3Jwb3JhdGlvbiBpbiB0aGUKK1VuaXRlZCBTdGF0ZXMsIG90aGVyIGNvdW50cmllcywgb3IgYm90aC4KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLm9zYnAueHRleHQuZGF0YWludGVyY2hhbmdlLmNvbW1vbi9hYm91dC5odG1sIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5kYXRhaW50ZXJjaGFuZ2UuY29tbW9uL2Fib3V0Lmh0bWwKaW5kZXggNjRjMDU5OC4uZThiODM0ZCAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5kYXRhaW50ZXJjaGFuZ2UuY29tbW9uL2Fib3V0Lmh0bWwKKysrIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5kYXRhaW50ZXJjaGFuZ2UuY29tbW9uL2Fib3V0Lmh0bWwKQEAgLTgsMTMgKzgsMTMgQEAKIDxib2R5IGxhbmc9IkVOLVVTIj4KIDxoMj5BYm91dCBUaGlzIENvbnRlbnQ8L2gyPgogIAotPHA+SnVuZSAxLCAyMDE2PC9wPgkKKzxwPk5vdmVtYmVyIDMwLCAyMDE3PC9wPgkKIDxoMz5MaWNlbnNlPC9oMz4KIAogPHA+VGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYWtlcyBhdmFpbGFibGUgYWxsIGNvbnRlbnQgaW4gdGhpcyBwbHVnLWluICgmcXVvdDtDb250ZW50JnF1b3Q7KS4gIFVubGVzcyBvdGhlcndpc2UgCiBpbmRpY2F0ZWQgYmVsb3csIHRoZSBDb250ZW50IGlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlCi1FY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wICgmcXVvdDtFUEwmcXVvdDspLiAgQSBjb3B5IG9mIHRoZSBFUEwgaXMgYXZhaWxhYmxlIAotYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sPC9hPi4KK0VjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyLjAgKCZxdW90O0VQTCZxdW90OykuICBBIGNvcHkgb2YgdGhlIEVQTCBpcyBhdmFpbGFibGUgCithdCA8YSBocmVmPSJodHRwczovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wIj5odHRwczovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wPC9hPi4KIEZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAmcXVvdDtQcm9ncmFtJnF1b3Q7IHdpbGwgbWVhbiB0aGUgQ29udGVudC48L3A+CiAKIDxwPklmIHlvdSBkaWQgbm90IHJlY2VpdmUgdGhpcyBDb250ZW50IGRpcmVjdGx5IGZyb20gdGhlIEVjbGlwc2UgRm91bmRhdGlvbiwgdGhlIENvbnRlbnQgaXMgCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmRhdGFpbnRlcmNoYW5nZS5jb21tb24vYWJvdXQucHJvcGVydGllcyBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQuZGF0YWludGVyY2hhbmdlLmNvbW1vbi9hYm91dC5wcm9wZXJ0aWVzCmluZGV4IDc1NTkyYmEuLjYwMWMyYzkgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLm9zYnAueHRleHQuZGF0YWludGVyY2hhbmdlLmNvbW1vbi9hYm91dC5wcm9wZXJ0aWVzCisrKyBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQuZGF0YWludGVyY2hhbmdlLmNvbW1vbi9hYm91dC5wcm9wZXJ0aWVzCkBAIC0xLDkgKzEsMTEgQEAKICMKICMgQ29weXJpZ2h0IChjKSAyMDEyLCAyMDE2IC0gTG9ldHogR21iSCZDby5LRyAoSGVpZGVsYmVyZykKICMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSAyLjAgCiAjIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisjIGh0dHBzOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAvCisjCisjIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wCiAjCiAjIENvbnRyaWJ1dG9yczoKICMgICAgQ2hyaXN0b3BoZSBMb2V0eiAoTG9ldHogR21iSCZDby5LRykgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KQEAgLTE3LDkgKzE5LDExIEBACiBmZWF0dXJlVGV4dD1cCiBDb3B5cmlnaHQgKGMpIDIwMTItMjAxNiAtIExvZXR6IEdtYkgmQ28uS0cgXG5cCiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzXG5cCi1hcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjBcblwKK2FyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgMi4wIFxuXAogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXRcblwKLWh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sXG5cCitodHRwczovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wL1xuXAorXG5cCitTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMFxuXAogXG5cCiBDb250cmlidXRvcnM6XG5cCiAgICAgQ2hyaXN0b3BoZSBMb2V0eiAoTG9ldHogR21iSCZDby5LRykgLSBpbml0aWFsIGltcGxlbWVudGF0aW9uXG4KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLm9zYnAueHRleHQuZGF0YWludGVyY2hhbmdlLmNvbW1vbi9idWlsZC5wcm9wZXJ0aWVzIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5kYXRhaW50ZXJjaGFuZ2UuY29tbW9uL2J1aWxkLnByb3BlcnRpZXMKaW5kZXggMDU0YmVhNi4uZDkwM2QwMiAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5kYXRhaW50ZXJjaGFuZ2UuY29tbW9uL2J1aWxkLnByb3BlcnRpZXMKKysrIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5kYXRhaW50ZXJjaGFuZ2UuY29tbW9uL2J1aWxkLnByb3BlcnRpZXMKQEAgLTcsNyArNyw3IEBACiAgICAgICAgICAgICAgICAuc2V0dGluZ3MvLFwKICAgICAgICAgICAgICAgIGxpY2Vuc2UuaHRtbCxcCiAgICAgICAgICAgICAgICBMSUNFTlNFLnR4dCxcCi0gICAgICAgICAgICAgICBlcGwtdjEwLmh0bWwKKyAgICAgICAgICAgICAgIGVwbC0yLjAuaHRtbAogc3JjLmluY2x1ZGVzID0gYWJvdXQucHJvcGVydGllcywgIGFib3V0Lm1hcHBpbmdzLCAgYWJvdXQuaW5pLCAgYWJvdXQuaHRtbCwgIGxpY2Vuc2UuaHRtbCxcCiAgICAgICAgICAgICAgICBMSUNFTlNFLnR4dCxcCi0gICAgICAgICAgICAgICBlcGwtdjEwLmh0bWwJCQkgICAKKyAgICAgICAgICAgICAgIGVwbC0yLjAuaHRtbAkJCSAgIApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5kYXRhaW50ZXJjaGFuZ2UuY29tbW9uL2VwbC0yLjAuaHRtbCBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQuZGF0YWludGVyY2hhbmdlLmNvbW1vbi9lcGwtMi4wLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjM3YTE4MQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQuZGF0YWludGVyY2hhbmdlLmNvbW1vbi9lcGwtMi4wLmh0bWwKQEAgLTAsMCArMSwzMDAgQEAKKzwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFN0cmljdC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS1zdHJpY3QuZHRkIj4KKzxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIiB4bWw6bGFuZz0iZW4iIGxhbmc9ImVuIj4KKyAgPGhlYWQ+CisgICAgPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXRmLTgiIC8+CisgICAgPHRpdGxlPkVjbGlwc2UgUHVibGljIExpY2Vuc2UgLSBWZXJzaW9uIDIuMDwvdGl0bGU+CisgICAgPHN0eWxlIHR5cGU9InRleHQvY3NzIj4KKyAgICAgIGJvZHkgeworICAgICAgICBtYXJnaW46IDEuNWVtIDNlbTsKKyAgICAgIH0KKyAgICAgIGgxeworICAgICAgICBmb250LXNpemU6MS41ZW07CisgICAgICB9CisgICAgICBoMnsKKyAgICAgICAgZm9udC1zaXplOjFlbTsKKyAgICAgICAgbWFyZ2luLWJvdHRvbTowLjVlbTsKKyAgICAgICAgbWFyZ2luLXRvcDoxZW07CisgICAgICB9CisgICAgICBwIHsKKyAgICAgICAgbWFyZ2luLXRvcDogIDAuNWVtOworICAgICAgICBtYXJnaW4tYm90dG9tOiAwLjVlbTsKKyAgICAgIH0KKyAgICAgIHVsLCBvbHsKKyAgICAgICAgbGlzdC1zdHlsZS10eXBlOm5vbmU7CisgICAgICB9CisgICAgPC9zdHlsZT4KKyAgPC9oZWFkPgorICA8Ym9keT4KKyAgICA8aDE+RWNsaXBzZSBQdWJsaWMgTGljZW5zZSAtIHYgMi4wPC9oMT4KKyAgICA8cD5USEUgQUNDT01QQU5ZSU5HIFBST0dSQU0gSVMgUFJPVklERUQgVU5ERVIgVEhFIFRFUk1TIE9GIFRISVMgRUNMSVBTRQorICAgICAgUFVCTElDIExJQ0VOU0UgKCZsZHF1bztBR1JFRU1FTlQmcmRxdW87KS4gQU5ZIFVTRSwgUkVQUk9EVUNUSU9OIE9SIERJU1RSSUJVVElPTgorICAgICAgT0YgVEhFIFBST0dSQU0gQ09OU1RJVFVURVMgUkVDSVBJRU5UJiMwMzk7UyBBQ0NFUFRBTkNFIE9GIFRISVMgQUdSRUVNRU5ULgorICAgIDwvcD4KKyAgICA8aDIgaWQ9ImRlZmluaXRpb25zIj4xLiBERUZJTklUSU9OUzwvaDI+CisgICAgPHA+JmxkcXVvO0NvbnRyaWJ1dGlvbiZyZHF1bzsgbWVhbnM6PC9wPgorICAgIDx1bD4KKyAgICAgIDxsaT5hKSBpbiB0aGUgY2FzZSBvZiB0aGUgaW5pdGlhbCBDb250cmlidXRvciwgdGhlIGluaXRpYWwgY29udGVudAorICAgICAgICBEaXN0cmlidXRlZCB1bmRlciB0aGlzIEFncmVlbWVudCwgYW5kCisgICAgICA8L2xpPgorICAgICAgPGxpPgorICAgICAgICBiKSBpbiB0aGUgY2FzZSBvZiBlYWNoIHN1YnNlcXVlbnQgQ29udHJpYnV0b3I6CisgICAgICAgIDx1bD4KKyAgICAgICAgICA8bGk+aSkgY2hhbmdlcyB0byB0aGUgUHJvZ3JhbSwgYW5kPC9saT4KKyAgICAgICAgICA8bGk+aWkpIGFkZGl0aW9ucyB0byB0aGUgUHJvZ3JhbTs8L2xpPgorICAgICAgICA8L3VsPgorICAgICAgICB3aGVyZSBzdWNoIGNoYW5nZXMgYW5kL29yIGFkZGl0aW9ucyB0byB0aGUgUHJvZ3JhbSBvcmlnaW5hdGUgZnJvbQorICAgICAgICBhbmQgYXJlIERpc3RyaWJ1dGVkIGJ5IHRoYXQgcGFydGljdWxhciBDb250cmlidXRvci4gQSBDb250cmlidXRpb24KKyAgICAgICAgJmxkcXVvO29yaWdpbmF0ZXMmcmRxdW87IGZyb20gYSBDb250cmlidXRvciBpZiBpdCB3YXMgYWRkZWQgdG8gdGhlIFByb2dyYW0gYnkgc3VjaAorICAgICAgICBDb250cmlidXRvciBpdHNlbGYgb3IgYW55b25lIGFjdGluZyBvbiBzdWNoIENvbnRyaWJ1dG9yJiMwMzk7cyBiZWhhbGYuCisgICAgICAgIENvbnRyaWJ1dGlvbnMgZG8gbm90IGluY2x1ZGUgY2hhbmdlcyBvciBhZGRpdGlvbnMgdG8gdGhlIFByb2dyYW0gdGhhdAorICAgICAgICBhcmUgbm90IE1vZGlmaWVkIFdvcmtzLgorICAgICAgPC9saT4KKyAgICA8L3VsPgorICAgIDxwPiZsZHF1bztDb250cmlidXRvciZyZHF1bzsgbWVhbnMgYW55IHBlcnNvbiBvciBlbnRpdHkgdGhhdCBEaXN0cmlidXRlcyB0aGUgUHJvZ3JhbS48L3A+CisgICAgPHA+JmxkcXVvO0xpY2Vuc2VkIFBhdGVudHMmcmRxdW87IG1lYW4gcGF0ZW50IGNsYWltcyBsaWNlbnNhYmxlIGJ5IGEgQ29udHJpYnV0b3Igd2hpY2gKKyAgICAgIGFyZSBuZWNlc3NhcmlseSBpbmZyaW5nZWQgYnkgdGhlIHVzZSBvciBzYWxlIG9mIGl0cyBDb250cmlidXRpb24gYWxvbmUKKyAgICAgIG9yIHdoZW4gY29tYmluZWQgd2l0aCB0aGUgUHJvZ3JhbS4KKyAgICA8L3A+CisgICAgPHA+JmxkcXVvO1Byb2dyYW0mcmRxdW87IG1lYW5zIHRoZSBDb250cmlidXRpb25zIERpc3RyaWJ1dGVkIGluIGFjY29yZGFuY2Ugd2l0aCB0aGlzCisgICAgICBBZ3JlZW1lbnQuCisgICAgPC9wPgorICAgIDxwPiZsZHF1bztSZWNpcGllbnQmcmRxdW87IG1lYW5zIGFueW9uZSB3aG8gcmVjZWl2ZXMgdGhlIFByb2dyYW0gdW5kZXIgdGhpcyBBZ3JlZW1lbnQKKyAgICAgIG9yIGFueSBTZWNvbmRhcnkgTGljZW5zZSAoYXMgYXBwbGljYWJsZSksIGluY2x1ZGluZyBDb250cmlidXRvcnMuCisgICAgPC9wPgorICAgIDxwPiZsZHF1bztEZXJpdmF0aXZlIFdvcmtzJnJkcXVvOyBzaGFsbCBtZWFuIGFueSB3b3JrLCB3aGV0aGVyIGluIFNvdXJjZSBDb2RlIG9yIG90aGVyCisgICAgICBmb3JtLCB0aGF0IGlzIGJhc2VkIG9uIChvciBkZXJpdmVkIGZyb20pIHRoZSBQcm9ncmFtIGFuZCBmb3Igd2hpY2ggdGhlCisgICAgICBlZGl0b3JpYWwgcmV2aXNpb25zLCBhbm5vdGF0aW9ucywgZWxhYm9yYXRpb25zLCBvciBvdGhlciBtb2RpZmljYXRpb25zCisgICAgICByZXByZXNlbnQsIGFzIGEgd2hvbGUsIGFuIG9yaWdpbmFsIHdvcmsgb2YgYXV0aG9yc2hpcC4KKyAgICA8L3A+CisgICAgPHA+JmxkcXVvO01vZGlmaWVkIFdvcmtzJnJkcXVvOyBzaGFsbCBtZWFuIGFueSB3b3JrIGluIFNvdXJjZSBDb2RlIG9yIG90aGVyIGZvcm0gdGhhdAorICAgICAgcmVzdWx0cyBmcm9tIGFuIGFkZGl0aW9uIHRvLCBkZWxldGlvbiBmcm9tLCBvciBtb2RpZmljYXRpb24gb2YgdGhlCisgICAgICBjb250ZW50cyBvZiB0aGUgUHJvZ3JhbSwgaW5jbHVkaW5nLCBmb3IgcHVycG9zZXMgb2YgY2xhcml0eSBhbnkgbmV3IGZpbGUKKyAgICAgIGluIFNvdXJjZSBDb2RlIGZvcm0gdGhhdCBjb250YWlucyBhbnkgY29udGVudHMgb2YgdGhlIFByb2dyYW0uIE1vZGlmaWVkCisgICAgICBXb3JrcyBzaGFsbCBub3QgaW5jbHVkZSB3b3JrcyB0aGF0IGNvbnRhaW4gb25seSBkZWNsYXJhdGlvbnMsIGludGVyZmFjZXMsCisgICAgICB0eXBlcywgY2xhc3Nlcywgc3RydWN0dXJlcywgb3IgZmlsZXMgb2YgdGhlIFByb2dyYW0gc29sZWx5IGluIGVhY2ggY2FzZQorICAgICAgaW4gb3JkZXIgdG8gbGluayB0bywgYmluZCBieSBuYW1lLCBvciBzdWJjbGFzcyB0aGUgUHJvZ3JhbSBvciBNb2RpZmllZAorICAgICAgV29ya3MgdGhlcmVvZi4KKyAgICA8L3A+CisgICAgPHA+JmxkcXVvO0Rpc3RyaWJ1dGUmcmRxdW87IG1lYW5zIHRoZSBhY3RzIG9mIGEpIGRpc3RyaWJ1dGluZyBvciBiKSBtYWtpbmcgYXZhaWxhYmxlCisgICAgICBpbiBhbnkgbWFubmVyIHRoYXQgZW5hYmxlcyB0aGUgdHJhbnNmZXIgb2YgYSBjb3B5LgorICAgIDwvcD4KKyAgICA8cD4mbGRxdW87U291cmNlIENvZGUmcmRxdW87IG1lYW5zIHRoZSBmb3JtIG9mIGEgUHJvZ3JhbSBwcmVmZXJyZWQgZm9yIG1ha2luZworICAgICAgbW9kaWZpY2F0aW9ucywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBzb2Z0d2FyZSBzb3VyY2UgY29kZSwKKyAgICAgIGRvY3VtZW50YXRpb24gc291cmNlLCBhbmQgY29uZmlndXJhdGlvbiBmaWxlcy4KKyAgICA8L3A+CisgICAgPHA+JmxkcXVvO1NlY29uZGFyeSBMaWNlbnNlJnJkcXVvOyBtZWFucyBlaXRoZXIgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICAgICAgVmVyc2lvbiAyLjAsIG9yIGFueSBsYXRlciB2ZXJzaW9ucyBvZiB0aGF0IGxpY2Vuc2UsIGluY2x1ZGluZyBhbnkKKyAgICAgIGV4Y2VwdGlvbnMgb3IgYWRkaXRpb25hbCBwZXJtaXNzaW9ucyBhcyBpZGVudGlmaWVkIGJ5IHRoZSBpbml0aWFsCisgICAgICBDb250cmlidXRvci4KKyAgICA8L3A+CisgICAgPGgyIGlkPSJncmFudC1vZi1yaWdodHMiPjIuIEdSQU5UIE9GIFJJR0hUUzwvaDI+CisgICAgPHVsPgorICAgICAgPGxpPmEpIFN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoaXMgQWdyZWVtZW50LCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieQorICAgICAgICBncmFudHMgUmVjaXBpZW50IGEgbm9uLWV4Y2x1c2l2ZSwgd29ybGR3aWRlLCByb3lhbHR5LWZyZWUgY29weXJpZ2h0CisgICAgICAgIGxpY2Vuc2UgdG8gcmVwcm9kdWNlLCBwcmVwYXJlIERlcml2YXRpdmUgV29ya3Mgb2YsIHB1YmxpY2x5IGRpc3BsYXksCisgICAgICAgIHB1YmxpY2x5IHBlcmZvcm0sIERpc3RyaWJ1dGUgYW5kIHN1YmxpY2Vuc2UgdGhlIENvbnRyaWJ1dGlvbiBvZiBzdWNoCisgICAgICAgIENvbnRyaWJ1dG9yLCBpZiBhbnksIGFuZCBzdWNoIERlcml2YXRpdmUgV29ya3MuCisgICAgICA8L2xpPgorICAgICAgPGxpPmIpIFN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoaXMgQWdyZWVtZW50LCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieQorICAgICAgICBncmFudHMgUmVjaXBpZW50IGEgbm9uLWV4Y2x1c2l2ZSwgd29ybGR3aWRlLCByb3lhbHR5LWZyZWUgcGF0ZW50CisgICAgICAgIGxpY2Vuc2UgdW5kZXIgTGljZW5zZWQgUGF0ZW50cyB0byBtYWtlLCB1c2UsIHNlbGwsIG9mZmVyIHRvIHNlbGwsCisgICAgICAgIGltcG9ydCBhbmQgb3RoZXJ3aXNlIHRyYW5zZmVyIHRoZSBDb250cmlidXRpb24gb2Ygc3VjaCBDb250cmlidXRvciwKKyAgICAgICAgaWYgYW55LCBpbiBTb3VyY2UgQ29kZSBvciBvdGhlciBmb3JtLiBUaGlzIHBhdGVudCBsaWNlbnNlIHNoYWxsCisgICAgICAgIGFwcGx5IHRvIHRoZSBjb21iaW5hdGlvbiBvZiB0aGUgQ29udHJpYnV0aW9uIGFuZCB0aGUgUHJvZ3JhbSBpZiwKKyAgICAgICAgYXQgdGhlIHRpbWUgdGhlIENvbnRyaWJ1dGlvbiBpcyBhZGRlZCBieSB0aGUgQ29udHJpYnV0b3IsIHN1Y2gKKyAgICAgICAgYWRkaXRpb24gb2YgdGhlIENvbnRyaWJ1dGlvbiBjYXVzZXMgc3VjaCBjb21iaW5hdGlvbiB0byBiZSBjb3ZlcmVkCisgICAgICAgIGJ5IHRoZSBMaWNlbnNlZCBQYXRlbnRzLiBUaGUgcGF0ZW50IGxpY2Vuc2Ugc2hhbGwgbm90IGFwcGx5IHRvIGFueQorICAgICAgICBvdGhlciBjb21iaW5hdGlvbnMgd2hpY2ggaW5jbHVkZSB0aGUgQ29udHJpYnV0aW9uLiBObyBoYXJkd2FyZSBwZXIKKyAgICAgICAgc2UgaXMgbGljZW5zZWQgaGVyZXVuZGVyLgorICAgICAgPC9saT4KKyAgICAgIDxsaT5jKSBSZWNpcGllbnQgdW5kZXJzdGFuZHMgdGhhdCBhbHRob3VnaCBlYWNoIENvbnRyaWJ1dG9yIGdyYW50cyB0aGUKKyAgICAgICAgbGljZW5zZXMgdG8gaXRzIENvbnRyaWJ1dGlvbnMgc2V0IGZvcnRoIGhlcmVpbiwgbm8gYXNzdXJhbmNlcyBhcmUKKyAgICAgICAgcHJvdmlkZWQgYnkgYW55IENvbnRyaWJ1dG9yIHRoYXQgdGhlIFByb2dyYW0gZG9lcyBub3QgaW5mcmluZ2UgdGhlCisgICAgICAgIHBhdGVudCBvciBvdGhlciBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIG9mIGFueSBvdGhlciBlbnRpdHkuCisgICAgICAgIEVhY2ggQ29udHJpYnV0b3IgZGlzY2xhaW1zIGFueSBsaWFiaWxpdHkgdG8gUmVjaXBpZW50IGZvciBjbGFpbXMKKyAgICAgICAgYnJvdWdodCBieSBhbnkgb3RoZXIgZW50aXR5IGJhc2VkIG9uIGluZnJpbmdlbWVudCBvZiBpbnRlbGxlY3R1YWwKKyAgICAgICAgcHJvcGVydHkgcmlnaHRzIG9yIG90aGVyd2lzZS4gQXMgYSBjb25kaXRpb24gdG8gZXhlcmNpc2luZyB0aGUgcmlnaHRzCisgICAgICAgIGFuZCBsaWNlbnNlcyBncmFudGVkIGhlcmV1bmRlciwgZWFjaCBSZWNpcGllbnQgaGVyZWJ5IGFzc3VtZXMgc29sZQorICAgICAgICByZXNwb25zaWJpbGl0eSB0byBzZWN1cmUgYW55IG90aGVyIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgbmVlZGVkLAorICAgICAgICBpZiBhbnkuIEZvciBleGFtcGxlLCBpZiBhIHRoaXJkIHBhcnR5IHBhdGVudCBsaWNlbnNlIGlzIHJlcXVpcmVkIHRvCisgICAgICAgIGFsbG93IFJlY2lwaWVudCB0byBEaXN0cmlidXRlIHRoZSBQcm9ncmFtLCBpdCBpcyBSZWNpcGllbnQmIzAzOTtzCisgICAgICAgIHJlc3BvbnNpYmlsaXR5IHRvIGFjcXVpcmUgdGhhdCBsaWNlbnNlIGJlZm9yZSBkaXN0cmlidXRpbmcgdGhlIFByb2dyYW0uCisgICAgICA8L2xpPgorICAgICAgPGxpPmQpIEVhY2ggQ29udHJpYnV0b3IgcmVwcmVzZW50cyB0aGF0IHRvIGl0cyBrbm93bGVkZ2UgaXQgaGFzIHN1ZmZpY2llbnQKKyAgICAgICAgY29weXJpZ2h0IHJpZ2h0cyBpbiBpdHMgQ29udHJpYnV0aW9uLCBpZiBhbnksIHRvIGdyYW50IHRoZSBjb3B5cmlnaHQKKyAgICAgICAgbGljZW5zZSBzZXQgZm9ydGggaW4gdGhpcyBBZ3JlZW1lbnQuCisgICAgICA8L2xpPgorICAgICAgPGxpPmUpIE5vdHdpdGhzdGFuZGluZyB0aGUgdGVybXMgb2YgYW55IFNlY29uZGFyeSBMaWNlbnNlLCBubyBDb250cmlidXRvcgorICAgICAgICBtYWtlcyBhZGRpdGlvbmFsIGdyYW50cyB0byBhbnkgUmVjaXBpZW50IChvdGhlciB0aGFuIHRob3NlIHNldCBmb3J0aAorICAgICAgICBpbiB0aGlzIEFncmVlbWVudCkgYXMgYSByZXN1bHQgb2Ygc3VjaCBSZWNpcGllbnQmIzAzOTtzIHJlY2VpcHQgb2YgdGhlCisgICAgICAgIFByb2dyYW0gdW5kZXIgdGhlIHRlcm1zIG9mIGEgU2Vjb25kYXJ5IExpY2Vuc2UgKGlmIHBlcm1pdHRlZCB1bmRlcgorICAgICAgICB0aGUgdGVybXMgb2YgU2VjdGlvbiAzKS4KKyAgICAgIDwvbGk+CisgICAgPC91bD4KKyAgICA8aDIgaWQ9InJlcXVpcmVtZW50cyI+My4gUkVRVUlSRU1FTlRTPC9oMj4KKyAgICA8cD4zLjEgSWYgYSBDb250cmlidXRvciBEaXN0cmlidXRlcyB0aGUgUHJvZ3JhbSBpbiBhbnkgZm9ybSwgdGhlbjo8L3A+CisgICAgPHVsPgorICAgICAgPGxpPmEpIHRoZSBQcm9ncmFtIG11c3QgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSBhcyBTb3VyY2UgQ29kZSwgaW4KKyAgICAgICAgYWNjb3JkYW5jZSB3aXRoIHNlY3Rpb24gMy4yLCBhbmQgdGhlIENvbnRyaWJ1dG9yIG11c3QgYWNjb21wYW55CisgICAgICAgIHRoZSBQcm9ncmFtIHdpdGggYSBzdGF0ZW1lbnQgdGhhdCB0aGUgU291cmNlIENvZGUgZm9yIHRoZSBQcm9ncmFtCisgICAgICAgIGlzIGF2YWlsYWJsZSB1bmRlciB0aGlzIEFncmVlbWVudCwgYW5kIGluZm9ybXMgUmVjaXBpZW50cyBob3cgdG8KKyAgICAgICAgb2J0YWluIGl0IGluIGEgcmVhc29uYWJsZSBtYW5uZXIgb24gb3IgdGhyb3VnaCBhIG1lZGl1bSBjdXN0b21hcmlseQorICAgICAgICB1c2VkIGZvciBzb2Z0d2FyZSBleGNoYW5nZTsgYW5kCisgICAgICA8L2xpPgorICAgICAgPGxpPgorICAgICAgICBiKSB0aGUgQ29udHJpYnV0b3IgbWF5IERpc3RyaWJ1dGUgdGhlIFByb2dyYW0gdW5kZXIgYSBsaWNlbnNlCisgICAgICAgIGRpZmZlcmVudCB0aGFuIHRoaXMgQWdyZWVtZW50LCBwcm92aWRlZCB0aGF0IHN1Y2ggbGljZW5zZToKKyAgICAgICAgPHVsPgorICAgICAgICAgIDxsaT5pKSBlZmZlY3RpdmVseSBkaXNjbGFpbXMgb24gYmVoYWxmIG9mIGFsbCBvdGhlciBDb250cmlidXRvcnMgYWxsCisgICAgICAgICAgICB3YXJyYW50aWVzIGFuZCBjb25kaXRpb25zLCBleHByZXNzIGFuZCBpbXBsaWVkLCBpbmNsdWRpbmcgd2FycmFudGllcworICAgICAgICAgICAgb3IgY29uZGl0aW9ucyBvZiB0aXRsZSBhbmQgbm9uLWluZnJpbmdlbWVudCwgYW5kIGltcGxpZWQgd2FycmFudGllcworICAgICAgICAgICAgb3IgY29uZGl0aW9ucyBvZiBtZXJjaGFudGFiaWxpdHkgYW5kIGZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlOworICAgICAgICAgIDwvbGk+CisgICAgICAgICAgPGxpPmlpKSBlZmZlY3RpdmVseSBleGNsdWRlcyBvbiBiZWhhbGYgb2YgYWxsIG90aGVyIENvbnRyaWJ1dG9ycyBhbGwKKyAgICAgICAgICAgIGxpYWJpbGl0eSBmb3IgZGFtYWdlcywgaW5jbHVkaW5nIGRpcmVjdCwgaW5kaXJlY3QsIHNwZWNpYWwsIGluY2lkZW50YWwKKyAgICAgICAgICAgIGFuZCBjb25zZXF1ZW50aWFsIGRhbWFnZXMsIHN1Y2ggYXMgbG9zdCBwcm9maXRzOworICAgICAgICAgIDwvbGk+CisgICAgICAgICAgPGxpPmlpaSkgZG9lcyBub3QgYXR0ZW1wdCB0byBsaW1pdCBvciBhbHRlciB0aGUgcmVjaXBpZW50cyYjMDM5OyByaWdodHMgaW4gdGhlCisgICAgICAgICAgICBTb3VyY2UgQ29kZSB1bmRlciBzZWN0aW9uIDMuMjsgYW5kCisgICAgICAgICAgPC9saT4KKyAgICAgICAgICA8bGk+aXYpIHJlcXVpcmVzIGFueSBzdWJzZXF1ZW50IGRpc3RyaWJ1dGlvbiBvZiB0aGUgUHJvZ3JhbSBieSBhbnkgcGFydHkKKyAgICAgICAgICAgIHRvIGJlIHVuZGVyIGEgbGljZW5zZSB0aGF0IHNhdGlzZmllcyB0aGUgcmVxdWlyZW1lbnRzIG9mIHRoaXMgc2VjdGlvbiAzLgorICAgICAgICAgIDwvbGk+CisgICAgICAgIDwvdWw+CisgICAgICA8L2xpPgorICAgIDwvdWw+CisgICAgPHA+My4yIFdoZW4gdGhlIFByb2dyYW0gaXMgRGlzdHJpYnV0ZWQgYXMgU291cmNlIENvZGU6PC9wPgorICAgIDx1bD4KKyAgICAgIDxsaT5hKSBpdCBtdXN0IGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoaXMgQWdyZWVtZW50LCBvciBpZiB0aGUgUHJvZ3JhbSAoaSkKKyAgICAgICAgaXMgY29tYmluZWQgd2l0aCBvdGhlciBtYXRlcmlhbCBpbiBhIHNlcGFyYXRlIGZpbGUgb3IgZmlsZXMgbWFkZSBhdmFpbGFibGUKKyAgICAgICAgdW5kZXIgYSBTZWNvbmRhcnkgTGljZW5zZSwgYW5kIChpaSkgdGhlIGluaXRpYWwgQ29udHJpYnV0b3IgYXR0YWNoZWQgdG8KKyAgICAgICAgdGhlIFNvdXJjZSBDb2RlIHRoZSBub3RpY2UgZGVzY3JpYmVkIGluIEV4aGliaXQgQSBvZiB0aGlzIEFncmVlbWVudCwKKyAgICAgICAgdGhlbiB0aGUgUHJvZ3JhbSBtYXkgYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHN1Y2gKKyAgICAgICAgU2Vjb25kYXJ5IExpY2Vuc2VzLCBhbmQKKyAgICAgIDwvbGk+CisgICAgICA8bGk+YikgYSBjb3B5IG9mIHRoaXMgQWdyZWVtZW50IG11c3QgYmUgaW5jbHVkZWQgd2l0aCBlYWNoIGNvcHkgb2YgdGhlIFByb2dyYW0uPC9saT4KKyAgICA8L3VsPgorICAgIDxwPjMuMyBDb250cmlidXRvcnMgbWF5IG5vdCByZW1vdmUgb3IgYWx0ZXIgYW55IGNvcHlyaWdodCwgcGF0ZW50LCB0cmFkZW1hcmssCisgICAgICBhdHRyaWJ1dGlvbiBub3RpY2VzLCBkaXNjbGFpbWVycyBvZiB3YXJyYW50eSwgb3IgbGltaXRhdGlvbnMgb2YgbGlhYmlsaXR5CisgICAgICAoJmxzcXVvO25vdGljZXMmcnNxdW87KSBjb250YWluZWQgd2l0aGluIHRoZSBQcm9ncmFtIGZyb20gYW55IGNvcHkgb2YgdGhlIFByb2dyYW0gd2hpY2gKKyAgICAgIHRoZXkgRGlzdHJpYnV0ZSwgcHJvdmlkZWQgdGhhdCBDb250cmlidXRvcnMgbWF5IGFkZCB0aGVpciBvd24gYXBwcm9wcmlhdGUKKyAgICAgIG5vdGljZXMuCisgICAgPC9wPgorICAgIDxoMiBpZD0iY29tbWVyY2lhbC1kaXN0cmlidXRpb24iPjQuIENPTU1FUkNJQUwgRElTVFJJQlVUSU9OPC9oMj4KKyAgICA8cD5Db21tZXJjaWFsIGRpc3RyaWJ1dG9ycyBvZiBzb2Z0d2FyZSBtYXkgYWNjZXB0IGNlcnRhaW4gcmVzcG9uc2liaWxpdGllcworICAgICAgd2l0aCByZXNwZWN0IHRvIGVuZCB1c2VycywgYnVzaW5lc3MgcGFydG5lcnMgYW5kIHRoZSBsaWtlLiBXaGlsZSB0aGlzCisgICAgICBsaWNlbnNlIGlzIGludGVuZGVkIHRvIGZhY2lsaXRhdGUgdGhlIGNvbW1lcmNpYWwgdXNlIG9mIHRoZSBQcm9ncmFtLCB0aGUKKyAgICAgIENvbnRyaWJ1dG9yIHdobyBpbmNsdWRlcyB0aGUgUHJvZ3JhbSBpbiBhIGNvbW1lcmNpYWwgcHJvZHVjdCBvZmZlcmluZyBzaG91bGQKKyAgICAgIGRvIHNvIGluIGEgbWFubmVyIHdoaWNoIGRvZXMgbm90IGNyZWF0ZSBwb3RlbnRpYWwgbGlhYmlsaXR5IGZvciBvdGhlcgorICAgICAgQ29udHJpYnV0b3JzLiBUaGVyZWZvcmUsIGlmIGEgQ29udHJpYnV0b3IgaW5jbHVkZXMgdGhlIFByb2dyYW0gaW4gYQorICAgICAgY29tbWVyY2lhbCBwcm9kdWN0IG9mZmVyaW5nLCBzdWNoIENvbnRyaWJ1dG9yICgmbGRxdW87Q29tbWVyY2lhbCBDb250cmlidXRvciZyZHF1bzspCisgICAgICBoZXJlYnkgYWdyZWVzIHRvIGRlZmVuZCBhbmQgaW5kZW1uaWZ5IGV2ZXJ5IG90aGVyIENvbnRyaWJ1dG9yCisgICAgICAoJmxkcXVvO0luZGVtbmlmaWVkIENvbnRyaWJ1dG9yJnJkcXVvOykgYWdhaW5zdCBhbnkgbG9zc2VzLCBkYW1hZ2VzIGFuZCBjb3N0cworICAgICAgKGNvbGxlY3RpdmVseSAmbGRxdW87TG9zc2VzJnJkcXVvOykgYXJpc2luZyBmcm9tIGNsYWltcywgbGF3c3VpdHMgYW5kIG90aGVyIGxlZ2FsIGFjdGlvbnMKKyAgICAgIGJyb3VnaHQgYnkgYSB0aGlyZCBwYXJ0eSBhZ2FpbnN0IHRoZSBJbmRlbW5pZmllZCBDb250cmlidXRvciB0byB0aGUgZXh0ZW50CisgICAgICBjYXVzZWQgYnkgdGhlIGFjdHMgb3Igb21pc3Npb25zIG9mIHN1Y2ggQ29tbWVyY2lhbCBDb250cmlidXRvciBpbiBjb25uZWN0aW9uCisgICAgICB3aXRoIGl0cyBkaXN0cmlidXRpb24gb2YgdGhlIFByb2dyYW0gaW4gYSBjb21tZXJjaWFsIHByb2R1Y3Qgb2ZmZXJpbmcuCisgICAgICBUaGUgb2JsaWdhdGlvbnMgaW4gdGhpcyBzZWN0aW9uIGRvIG5vdCBhcHBseSB0byBhbnkgY2xhaW1zIG9yIExvc3NlcyByZWxhdGluZworICAgICAgdG8gYW55IGFjdHVhbCBvciBhbGxlZ2VkIGludGVsbGVjdHVhbCBwcm9wZXJ0eSBpbmZyaW5nZW1lbnQuIEluIG9yZGVyIHRvCisgICAgICBxdWFsaWZ5LCBhbiBJbmRlbW5pZmllZCBDb250cmlidXRvciBtdXN0OiBhKSBwcm9tcHRseSBub3RpZnkgdGhlCisgICAgICBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIGluIHdyaXRpbmcgb2Ygc3VjaCBjbGFpbSwgYW5kIGIpIGFsbG93IHRoZSBDb21tZXJjaWFsCisgICAgICBDb250cmlidXRvciB0byBjb250cm9sLCBhbmQgY29vcGVyYXRlIHdpdGggdGhlIENvbW1lcmNpYWwgQ29udHJpYnV0b3IgaW4sCisgICAgICB0aGUgZGVmZW5zZSBhbmQgYW55IHJlbGF0ZWQgc2V0dGxlbWVudCBuZWdvdGlhdGlvbnMuIFRoZSBJbmRlbW5pZmllZAorICAgICAgQ29udHJpYnV0b3IgbWF5IHBhcnRpY2lwYXRlIGluIGFueSBzdWNoIGNsYWltIGF0IGl0cyBvd24gZXhwZW5zZS4KKyAgICA8L3A+CisgICAgPHA+Rm9yIGV4YW1wbGUsIGEgQ29udHJpYnV0b3IgbWlnaHQgaW5jbHVkZSB0aGUgUHJvZ3JhbQorICAgICAgaW4gYSBjb21tZXJjaWFsIHByb2R1Y3Qgb2ZmZXJpbmcsIFByb2R1Y3QgWC4gVGhhdCBDb250cmlidXRvciBpcyB0aGVuIGEKKyAgICAgIENvbW1lcmNpYWwgQ29udHJpYnV0b3IuIElmIHRoYXQgQ29tbWVyY2lhbCBDb250cmlidXRvciB0aGVuIG1ha2VzIHBlcmZvcm1hbmNlCisgICAgICBjbGFpbXMsIG9yIG9mZmVycyB3YXJyYW50aWVzIHJlbGF0ZWQgdG8gUHJvZHVjdCBYLCB0aG9zZSBwZXJmb3JtYW5jZSBjbGFpbXMKKyAgICAgIGFuZCB3YXJyYW50aWVzIGFyZSBzdWNoIENvbW1lcmNpYWwgQ29udHJpYnV0b3ImIzAzOTtzIHJlc3BvbnNpYmlsaXR5IGFsb25lLgorICAgICAgVW5kZXIgdGhpcyBzZWN0aW9uLCB0aGUgQ29tbWVyY2lhbCBDb250cmlidXRvciB3b3VsZCBoYXZlIHRvIGRlZmVuZCBjbGFpbXMKKyAgICAgIGFnYWluc3QgdGhlIG90aGVyIENvbnRyaWJ1dG9ycyByZWxhdGVkIHRvIHRob3NlIHBlcmZvcm1hbmNlIGNsYWltcyBhbmQKKyAgICAgIHdhcnJhbnRpZXMsIGFuZCBpZiBhIGNvdXJ0IHJlcXVpcmVzIGFueSBvdGhlciBDb250cmlidXRvciB0byBwYXkgYW55IGRhbWFnZXMKKyAgICAgIGFzIGEgcmVzdWx0LCB0aGUgQ29tbWVyY2lhbCBDb250cmlidXRvciBtdXN0IHBheSB0aG9zZSBkYW1hZ2VzLgorICAgIDwvcD4KKyAgICA8aDIgaWQ9IndhcnJhbnR5Ij41LiBOTyBXQVJSQU5UWTwvaDI+CisgICAgPHA+RVhDRVBUIEFTIEVYUFJFU1NMWSBTRVQgRk9SVEggSU4gVEhJUyBBR1JFRU1FTlQsIEFORCBUTyBUSEUgRVhURU5UIFBFUk1JVFRFRAorICAgICAgQlkgQVBQTElDQUJMRSBMQVcsIFRIRSBQUk9HUkFNIElTIFBST1ZJREVEIE9OIEFOICZsZHF1bztBUyBJUyZyZHF1bzsgQkFTSVMsIFdJVEhPVVQKKyAgICAgIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgRUlUSEVSIEVYUFJFU1MgT1IgSU1QTElFRCBJTkNMVURJTkcsCisgICAgICBXSVRIT1VUIExJTUlUQVRJT04sIEFOWSBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgVElUTEUsIE5PTi1JTkZSSU5HRU1FTlQsCisgICAgICBNRVJDSEFOVEFCSUxJVFkgT1IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIEVhY2ggUmVjaXBpZW50IGlzCisgICAgICBzb2xlbHkgcmVzcG9uc2libGUgZm9yIGRldGVybWluaW5nIHRoZSBhcHByb3ByaWF0ZW5lc3Mgb2YgdXNpbmcgYW5kCisgICAgICBkaXN0cmlidXRpbmcgdGhlIFByb2dyYW0gYW5kIGFzc3VtZXMgYWxsIHJpc2tzIGFzc29jaWF0ZWQgd2l0aCBpdHMKKyAgICAgIGV4ZXJjaXNlIG9mIHJpZ2h0cyB1bmRlciB0aGlzIEFncmVlbWVudCwgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUKKyAgICAgIHJpc2tzIGFuZCBjb3N0cyBvZiBwcm9ncmFtIGVycm9ycywgY29tcGxpYW5jZSB3aXRoIGFwcGxpY2FibGUgbGF3cywgZGFtYWdlCisgICAgICB0byBvciBsb3NzIG9mIGRhdGEsIHByb2dyYW1zIG9yIGVxdWlwbWVudCwgYW5kIHVuYXZhaWxhYmlsaXR5IG9yCisgICAgICBpbnRlcnJ1cHRpb24gb2Ygb3BlcmF0aW9ucy4KKyAgICA8L3A+CisgICAgPGgyIGlkPSJkaXNjbGFpbWVyIj42LiBESVNDTEFJTUVSIE9GIExJQUJJTElUWTwvaDI+CisgICAgPHA+RVhDRVBUIEFTIEVYUFJFU1NMWSBTRVQgRk9SVEggSU4gVEhJUyBBR1JFRU1FTlQsIEFORCBUTyBUSEUgRVhURU5UIFBFUk1JVFRFRAorICAgICAgQlkgQVBQTElDQUJMRSBMQVcsIE5FSVRIRVIgUkVDSVBJRU5UIE5PUiBBTlkgQ09OVFJJQlVUT1JTIFNIQUxMIEhBVkUgQU5ZCisgICAgICBMSUFCSUxJVFkgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksCisgICAgICBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORyBXSVRIT1VUIExJTUlUQVRJT04gTE9TVCBQUk9GSVRTKSwKKyAgICAgIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgICAgICBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCisgICAgICBPVVQgT0YgVEhFIFVTRSBPUiBESVNUUklCVVRJT04gT0YgVEhFIFBST0dSQU0gT1IgVEhFIEVYRVJDSVNFIE9GIEFOWSBSSUdIVFMKKyAgICAgIEdSQU5URUQgSEVSRVVOREVSLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFUy4KKyAgICA8L3A+CisgICAgPGgyIGlkPSJnZW5lcmFsIj43LiBHRU5FUkFMPC9oMj4KKyAgICA8cD5JZiBhbnkgcHJvdmlzaW9uIG9mIHRoaXMgQWdyZWVtZW50IGlzIGludmFsaWQgb3IgdW5lbmZvcmNlYWJsZSB1bmRlcgorICAgICAgYXBwbGljYWJsZSBsYXcsIGl0IHNoYWxsIG5vdCBhZmZlY3QgdGhlIHZhbGlkaXR5IG9yIGVuZm9yY2VhYmlsaXR5IG9mIHRoZQorICAgICAgcmVtYWluZGVyIG9mIHRoZSB0ZXJtcyBvZiB0aGlzIEFncmVlbWVudCwgYW5kIHdpdGhvdXQgZnVydGhlciBhY3Rpb24gYnkgdGhlCisgICAgICBwYXJ0aWVzIGhlcmV0bywgc3VjaCBwcm92aXNpb24gc2hhbGwgYmUgcmVmb3JtZWQgdG8gdGhlIG1pbmltdW0gZXh0ZW50CisgICAgICBuZWNlc3NhcnkgdG8gbWFrZSBzdWNoIHByb3Zpc2lvbiB2YWxpZCBhbmQgZW5mb3JjZWFibGUuCisgICAgPC9wPgorICAgIDxwPklmIFJlY2lwaWVudCBpbnN0aXR1dGVzIHBhdGVudCBsaXRpZ2F0aW9uIGFnYWluc3QgYW55IGVudGl0eSAoaW5jbHVkaW5nIGEKKyAgICAgIGNyb3NzLWNsYWltIG9yIGNvdW50ZXJjbGFpbSBpbiBhIGxhd3N1aXQpIGFsbGVnaW5nIHRoYXQgdGhlIFByb2dyYW0gaXRzZWxmCisgICAgICAoZXhjbHVkaW5nIGNvbWJpbmF0aW9ucyBvZiB0aGUgUHJvZ3JhbSB3aXRoIG90aGVyIHNvZnR3YXJlIG9yIGhhcmR3YXJlKQorICAgICAgaW5mcmluZ2VzIHN1Y2ggUmVjaXBpZW50JiMwMzk7cyBwYXRlbnQocyksIHRoZW4gc3VjaCBSZWNpcGllbnQmIzAzOTtzIHJpZ2h0cyBncmFudGVkCisgICAgICB1bmRlciBTZWN0aW9uIDIoYikgc2hhbGwgdGVybWluYXRlIGFzIG9mIHRoZSBkYXRlIHN1Y2ggbGl0aWdhdGlvbiBpcyBmaWxlZC4KKyAgICA8L3A+CisgICAgPHA+QWxsIFJlY2lwaWVudCYjMDM5O3MgcmlnaHRzIHVuZGVyIHRoaXMgQWdyZWVtZW50IHNoYWxsIHRlcm1pbmF0ZSBpZiBpdCBmYWlscyB0bworICAgICAgY29tcGx5IHdpdGggYW55IG9mIHRoZSBtYXRlcmlhbCB0ZXJtcyBvciBjb25kaXRpb25zIG9mIHRoaXMgQWdyZWVtZW50IGFuZAorICAgICAgZG9lcyBub3QgY3VyZSBzdWNoIGZhaWx1cmUgaW4gYSByZWFzb25hYmxlIHBlcmlvZCBvZiB0aW1lIGFmdGVyIGJlY29taW5nCisgICAgICBhd2FyZSBvZiBzdWNoIG5vbmNvbXBsaWFuY2UuIElmIGFsbCBSZWNpcGllbnQmIzAzOTtzIHJpZ2h0cyB1bmRlciB0aGlzIEFncmVlbWVudAorICAgICAgdGVybWluYXRlLCBSZWNpcGllbnQgYWdyZWVzIHRvIGNlYXNlIHVzZSBhbmQgZGlzdHJpYnV0aW9uIG9mIHRoZSBQcm9ncmFtCisgICAgICBhcyBzb29uIGFzIHJlYXNvbmFibHkgcHJhY3RpY2FibGUuIEhvd2V2ZXIsIFJlY2lwaWVudCYjMDM5O3Mgb2JsaWdhdGlvbnMgdW5kZXIKKyAgICAgIHRoaXMgQWdyZWVtZW50IGFuZCBhbnkgbGljZW5zZXMgZ3JhbnRlZCBieSBSZWNpcGllbnQgcmVsYXRpbmcgdG8gdGhlCisgICAgICBQcm9ncmFtIHNoYWxsIGNvbnRpbnVlIGFuZCBzdXJ2aXZlLgorICAgIDwvcD4KKyAgICA8cD5FdmVyeW9uZSBpcyBwZXJtaXR0ZWQgdG8gY29weSBhbmQgZGlzdHJpYnV0ZSBjb3BpZXMgb2YgdGhpcyBBZ3JlZW1lbnQsCisgICAgICBidXQgaW4gb3JkZXIgdG8gYXZvaWQgaW5jb25zaXN0ZW5jeSB0aGUgQWdyZWVtZW50IGlzIGNvcHlyaWdodGVkIGFuZCBtYXkKKyAgICAgIG9ubHkgYmUgbW9kaWZpZWQgaW4gdGhlIGZvbGxvd2luZyBtYW5uZXIuIFRoZSBBZ3JlZW1lbnQgU3Rld2FyZCByZXNlcnZlcworICAgICAgdGhlIHJpZ2h0IHRvIHB1Ymxpc2ggbmV3IHZlcnNpb25zIChpbmNsdWRpbmcgcmV2aXNpb25zKSBvZiB0aGlzIEFncmVlbWVudAorICAgICAgZnJvbSB0aW1lIHRvIHRpbWUuIE5vIG9uZSBvdGhlciB0aGFuIHRoZSBBZ3JlZW1lbnQgU3Rld2FyZCBoYXMgdGhlIHJpZ2h0CisgICAgICB0byBtb2RpZnkgdGhpcyBBZ3JlZW1lbnQuIFRoZSBFY2xpcHNlIEZvdW5kYXRpb24gaXMgdGhlIGluaXRpYWwgQWdyZWVtZW50CisgICAgICBTdGV3YXJkLiBUaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1heSBhc3NpZ24gdGhlIHJlc3BvbnNpYmlsaXR5IHRvIHNlcnZlIGFzCisgICAgICB0aGUgQWdyZWVtZW50IFN0ZXdhcmQgdG8gYSBzdWl0YWJsZSBzZXBhcmF0ZSBlbnRpdHkuIEVhY2ggbmV3IHZlcnNpb24gb2YKKyAgICAgIHRoZSBBZ3JlZW1lbnQgd2lsbCBiZSBnaXZlbiBhIGRpc3Rpbmd1aXNoaW5nIHZlcnNpb24gbnVtYmVyLiBUaGUgUHJvZ3JhbQorICAgICAgKGluY2x1ZGluZyBDb250cmlidXRpb25zKSBtYXkgYWx3YXlzIGJlIERpc3RyaWJ1dGVkIHN1YmplY3QgdG8gdGhlIHZlcnNpb24KKyAgICAgIG9mIHRoZSBBZ3JlZW1lbnQgdW5kZXIgd2hpY2ggaXQgd2FzIHJlY2VpdmVkLiBJbiBhZGRpdGlvbiwgYWZ0ZXIgYSBuZXcKKyAgICAgIHZlcnNpb24gb2YgdGhlIEFncmVlbWVudCBpcyBwdWJsaXNoZWQsIENvbnRyaWJ1dG9yIG1heSBlbGVjdCB0byBEaXN0cmlidXRlCisgICAgICB0aGUgUHJvZ3JhbSAoaW5jbHVkaW5nIGl0cyBDb250cmlidXRpb25zKSB1bmRlciB0aGUgbmV3IHZlcnNpb24uCisgICAgPC9wPgorICAgIDxwPkV4Y2VwdCBhcyBleHByZXNzbHkgc3RhdGVkIGluIFNlY3Rpb25zIDIoYSkgYW5kIDIoYikgYWJvdmUsIFJlY2lwaWVudAorICAgICAgcmVjZWl2ZXMgbm8gcmlnaHRzIG9yIGxpY2Vuc2VzIHRvIHRoZSBpbnRlbGxlY3R1YWwgcHJvcGVydHkgb2YgYW55CisgICAgICBDb250cmlidXRvciB1bmRlciB0aGlzIEFncmVlbWVudCwgd2hldGhlciBleHByZXNzbHksIGJ5IGltcGxpY2F0aW9uLAorICAgICAgZXN0b3BwZWwgb3Igb3RoZXJ3aXNlLiBBbGwgcmlnaHRzIGluIHRoZSBQcm9ncmFtIG5vdCBleHByZXNzbHkgZ3JhbnRlZAorICAgICAgdW5kZXIgdGhpcyBBZ3JlZW1lbnQgYXJlIHJlc2VydmVkLiBOb3RoaW5nIGluIHRoaXMgQWdyZWVtZW50IGlzIGludGVuZGVkCisgICAgICB0byBiZSBlbmZvcmNlYWJsZSBieSBhbnkgZW50aXR5IHRoYXQgaXMgbm90IGEgQ29udHJpYnV0b3Igb3IgUmVjaXBpZW50LgorICAgICAgTm8gdGhpcmQtcGFydHkgYmVuZWZpY2lhcnkgcmlnaHRzIGFyZSBjcmVhdGVkIHVuZGVyIHRoaXMgQWdyZWVtZW50LgorICAgIDwvcD4KKyAgICA8aDIgaWQ9ImV4aGliaXQtYSI+RXhoaWJpdCBBICZuZGFzaDsgRm9ybSBvZiBTZWNvbmRhcnkgTGljZW5zZXMgTm90aWNlPC9oMj4KKyAgICA8cD4mbGRxdW87VGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIAorICAgIAlTZWNvbmRhcnkgTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIAorICAgIAlpbiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSwgdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IHtuYW1lIGxpY2Vuc2UocyksCisgICAgCXZlcnNpb24ocyksIGFuZCBleGNlcHRpb25zIG9yIGFkZGl0aW9uYWwgcGVybWlzc2lvbnMgaGVyZX0uJnJkcXVvOworICAgIDwvcD4KKyAgICA8YmxvY2txdW90ZT4KKyAgICAgIDxwPlNpbXBseSBpbmNsdWRpbmcgYSBjb3B5IG9mIHRoaXMgQWdyZWVtZW50LCBpbmNsdWRpbmcgdGhpcyBFeGhpYml0IEEKKyAgICAgICAgaXMgbm90IHN1ZmZpY2llbnQgdG8gbGljZW5zZSB0aGUgU291cmNlIENvZGUgdW5kZXIgU2Vjb25kYXJ5IExpY2Vuc2VzLgorICAgICAgPC9wPgorICAgICAgPHA+SWYgaXQgaXMgbm90IHBvc3NpYmxlIG9yIGRlc2lyYWJsZSB0byBwdXQgdGhlIG5vdGljZSBpbiBhIHBhcnRpY3VsYXIgZmlsZSwKKyAgICAgICAgdGhlbiBZb3UgbWF5IGluY2x1ZGUgdGhlIG5vdGljZSBpbiBhIGxvY2F0aW9uIChzdWNoIGFzIGEgTElDRU5TRSBmaWxlIGluIGEKKyAgICAgICAgcmVsZXZhbnQgZGlyZWN0b3J5KSB3aGVyZSBhIHJlY2lwaWVudCB3b3VsZCBiZSBsaWtlbHkgdG8gbG9vayBmb3IKKyAgICAgICAgc3VjaCBhIG5vdGljZS4KKyAgICAgIDwvcD4KKyAgICAgIDxwPllvdSBtYXkgYWRkIGFkZGl0aW9uYWwgYWNjdXJhdGUgbm90aWNlcyBvZiBjb3B5cmlnaHQgb3duZXJzaGlwLjwvcD4KKyAgICA8L2Jsb2NrcXVvdGU+CisgIDwvYm9keT4KKzwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmRhdGFpbnRlcmNoYW5nZS5jb21tb24vZXBsLXYxMC5odG1sIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5kYXRhaW50ZXJjaGFuZ2UuY29tbW9uL2VwbC12MTAuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjM5OGFjYy4uMDAwMDAwMAotLS0gYS9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmRhdGFpbnRlcmNoYW5nZS5jb21tb24vZXBsLXYxMC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjU5ICswLDAgQEAKLTwhLS0/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IklTTy04ODU5LTEiID8tLT4KLTwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIj48aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTEiPgotPHRpdGxlPkVjbGlwc2UgUHVibGljIExpY2Vuc2UgLSBWZXJzaW9uIDEuMDwvdGl0bGU+Ci08c3R5bGUgdHlwZT0idGV4dC9jc3MiPgotICBib2R5IHsKLSAgICBzaXplOiA4LjVpbiAxMS4waW47Ci0gICAgbWFyZ2luOiAwLjI1aW4gMC41aW4gMC4yNWluIDAuNWluOwotICAgIHRhYi1pbnRlcnZhbDogMC41aW47Ci0gICAgfQotICBwIHsgIAkKLSAgICBtYXJnaW4tbGVmdDogYXV0bzsKLSAgICBtYXJnaW4tdG9wOiAgMC41ZW07Ci0gICAgbWFyZ2luLWJvdHRvbTogMC41ZW07Ci0gICAgfQotICBwLmxpc3QgewotICAJbWFyZ2luLWxlZnQ6IDAuNWluOwotICAgIG1hcmdpbi10b3A6ICAwLjA1ZW07Ci0gICAgbWFyZ2luLWJvdHRvbTogMC4wNWVtOwotICAgIH0KLSAgPC9zdHlsZT4KLQotPC9oZWFkPgotCi08Ym9keSBsYW5nPSJFTi1VUyI+Ci0KLTxoMj5FY2xpcHNlIFB1YmxpYyBMaWNlbnNlIC0gdiAxLjA8L2gyPgotCi08cD5USEUgQUNDT01QQU5ZSU5HIFBST0dSQU0gSVMgUFJPVklERUQgVU5ERVIgVEhFIFRFUk1TIE9GIFRISVMgRUNMSVBTRQotUFVCTElDIExJQ0VOU0UgKCJBR1JFRU1FTlQiKS4gQU5ZIFVTRSwgUkVQUk9EVUNUSU9OIE9SCi1ESVNUUklCVVRJT04gT0YgVEhFIFBST0dSQU0gQ09OU1RJVFVURVMgUkVDSVBJRU5UJ1MgQUNDRVBUQU5DRSBPRiBUSElTCi1BR1JFRU1FTlQuPC9wPgotCi08cD48Yj4xLiBERUZJTklUSU9OUzwvYj48L3A+Ci0KLTxwPiJDb250cmlidXRpb24iIG1lYW5zOjwvcD4KLQotPHAgY2xhc3M9Imxpc3QiPmEpIGluIHRoZSBjYXNlIG9mIHRoZSBpbml0aWFsIENvbnRyaWJ1dG9yLCB0aGUgaW5pdGlhbAotY29kZSBhbmQgZG9jdW1lbnRhdGlvbiBkaXN0cmlidXRlZCB1bmRlciB0aGlzIEFncmVlbWVudCwgYW5kPC9wPgotPHAgY2xhc3M9Imxpc3QiPmIpIGluIHRoZSBjYXNlIG9mIGVhY2ggc3Vic2VxdWVudCBDb250cmlidXRvcjo8L3A+Ci08cCBjbGFzcz0ibGlzdCI+aSkgY2hhbmdlcyB0byB0aGUgUHJvZ3JhbSwgYW5kPC9wPgotPHAgY2xhc3M9Imxpc3QiPmlpKSBhZGRpdGlvbnMgdG8gdGhlIFByb2dyYW07PC9wPgotPHAgY2xhc3M9Imxpc3QiPndoZXJlIHN1Y2ggY2hhbmdlcyBhbmQvb3IgYWRkaXRpb25zIHRvIHRoZSBQcm9ncmFtCi1vcmlnaW5hdGUgZnJvbSBhbmQgYXJlIGRpc3RyaWJ1dGVkIGJ5IHRoYXQgcGFydGljdWxhciBDb250cmlidXRvci4gQQotQ29udHJpYnV0aW9uICdvcmlnaW5hdGVzJyBmcm9tIGEgQ29udHJpYnV0b3IgaWYgaXQgd2FzIGFkZGVkIHRvIHRoZQotUHJvZ3JhbSBieSBzdWNoIENvbnRyaWJ1dG9yIGl0c2VsZiBvciBhbnlvbmUgYWN0aW5nIG9uIHN1Y2gKLUNvbnRyaWJ1dG9yJ3MgYmVoYWxmLiBDb250cmlidXRpb25zIGRvIG5vdCBpbmNsdWRlIGFkZGl0aW9ucyB0byB0aGUKLVByb2dyYW0gd2hpY2g6IChpKSBhcmUgc2VwYXJhdGUgbW9kdWxlcyBvZiBzb2Z0d2FyZSBkaXN0cmlidXRlZCBpbgotY29uanVuY3Rpb24gd2l0aCB0aGUgUHJvZ3JhbSB1bmRlciB0aGVpciBvd24gbGljZW5zZSBhZ3JlZW1lbnQsIGFuZCAoaWkpCi1hcmUgbm90IGRlcml2YXRpdmUgd29ya3Mgb2YgdGhlIFByb2dyYW0uPC9wPgotCi08cD4iQ29udHJpYnV0b3IiIG1lYW5zIGFueSBwZXJzb24gb3IgZW50aXR5IHRoYXQgZGlzdHJpYnV0ZXMKLXRoZSBQcm9ncmFtLjwvcD4KLQotPHA+IkxpY2Vuc2VkIFBhdGVudHMiIG1lYW4gcGF0ZW50IGNsYWltcyBsaWNlbnNhYmxlIGJ5IGEKLUNvbnRyaWJ1dG9yIHdoaWNoIGFyZSBuZWNlc3NhcmlseSBpbmZyaW5nZWQgYnkgdGhlIHVzZSBvciBzYWxlIG9mIGl0cwotQ29udHJpYnV0aW9uIGFsb25lIG9yIHdoZW4gY29tYmluZWQgd2l0aCB0aGUgUHJvZ3JhbS48L3A+Ci0KLTxwPiJQcm9ncmFtIiBtZWFucyB0aGUgQ29udHJpYnV0aW9ucyBkaXN0cmlidXRlZCBpbiBhY2NvcmRhbmNlCi13aXRoIHRoaXMgQWdyZWVtZW50LjwvcD4KLQotPHA+IlJlY2lwaWVudCIgbWVhbnMgYW55b25lIHdobyByZWNlaXZlcyB0aGUgUHJvZ3JhbSB1bmRlcgotdGhpcyBBZ3JlZW1lbnQsIGluY2x1ZGluZyBhbGwgQ29udHJpYnV0b3JzLjwvcD4KLQotPHA+PGI+Mi4gR1JBTlQgT0YgUklHSFRTPC9iPjwvcD4KLQotPHAgY2xhc3M9Imxpc3QiPmEpIFN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoaXMgQWdyZWVtZW50LCBlYWNoCi1Db250cmlidXRvciBoZXJlYnkgZ3JhbnRzIFJlY2lwaWVudCBhIG5vbi1leGNsdXNpdmUsIHdvcmxkd2lkZSwKLXJveWFsdHktZnJlZSBjb3B5cmlnaHQgbGljZW5zZSB0byByZXByb2R1Y2UsIHByZXBhcmUgZGVyaXZhdGl2ZSB3b3Jrcwotb2YsIHB1YmxpY2x5IGRpc3BsYXksIHB1YmxpY2x5IHBlcmZvcm0sIGRpc3RyaWJ1dGUgYW5kIHN1YmxpY2Vuc2UgdGhlCi1Db250cmlidXRpb24gb2Ygc3VjaCBDb250cmlidXRvciwgaWYgYW55LCBhbmQgc3VjaCBkZXJpdmF0aXZlIHdvcmtzLCBpbgotc291cmNlIGNvZGUgYW5kIG9iamVjdCBjb2RlIGZvcm0uPC9wPgotCi08cCBjbGFzcz0ibGlzdCI+YikgU3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhpcyBBZ3JlZW1lbnQsIGVhY2gKLUNvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgUmVjaXBpZW50IGEgbm9uLWV4Y2x1c2l2ZSwgd29ybGR3aWRlLAotcm95YWx0eS1mcmVlIHBhdGVudCBsaWNlbnNlIHVuZGVyIExpY2Vuc2VkIFBhdGVudHMgdG8gbWFrZSwgdXNlLCBzZWxsLAotb2ZmZXIgdG8gc2VsbCwgaW1wb3J0IGFuZCBvdGhlcndpc2UgdHJhbnNmZXIgdGhlIENvbnRyaWJ1dGlvbiBvZiBzdWNoCi1Db250cmlidXRvciwgaWYgYW55LCBpbiBzb3VyY2UgY29kZSBhbmQgb2JqZWN0IGNvZGUgZm9ybS4gVGhpcyBwYXRlbnQKLWxpY2Vuc2Ugc2hhbGwgYXBwbHkgdG8gdGhlIGNvbWJpbmF0aW9uIG9mIHRoZSBDb250cmlidXRpb24gYW5kIHRoZQotUHJvZ3JhbSBpZiwgYXQgdGhlIHRpbWUgdGhlIENvbnRyaWJ1dGlvbiBpcyBhZGRlZCBieSB0aGUgQ29udHJpYnV0b3IsCi1zdWNoIGFkZGl0aW9uIG9mIHRoZSBDb250cmlidXRpb24gY2F1c2VzIHN1Y2ggY29tYmluYXRpb24gdG8gYmUgY292ZXJlZAotYnkgdGhlIExpY2Vuc2VkIFBhdGVudHMuIFRoZSBwYXRlbnQgbGljZW5zZSBzaGFsbCBub3QgYXBwbHkgdG8gYW55IG90aGVyCi1jb21iaW5hdGlvbnMgd2hpY2ggaW5jbHVkZSB0aGUgQ29udHJpYnV0aW9uLiBObyBoYXJkd2FyZSBwZXIgc2UgaXMKLWxpY2Vuc2VkIGhlcmV1bmRlci48L3A+Ci0KLTxwIGNsYXNzPSJsaXN0Ij5jKSBSZWNpcGllbnQgdW5kZXJzdGFuZHMgdGhhdCBhbHRob3VnaCBlYWNoIENvbnRyaWJ1dG9yCi1ncmFudHMgdGhlIGxpY2Vuc2VzIHRvIGl0cyBDb250cmlidXRpb25zIHNldCBmb3J0aCBoZXJlaW4sIG5vIGFzc3VyYW5jZXMKLWFyZSBwcm92aWRlZCBieSBhbnkgQ29udHJpYnV0b3IgdGhhdCB0aGUgUHJvZ3JhbSBkb2VzIG5vdCBpbmZyaW5nZSB0aGUKLXBhdGVudCBvciBvdGhlciBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIG9mIGFueSBvdGhlciBlbnRpdHkuIEVhY2gKLUNvbnRyaWJ1dG9yIGRpc2NsYWltcyBhbnkgbGlhYmlsaXR5IHRvIFJlY2lwaWVudCBmb3IgY2xhaW1zIGJyb3VnaHQgYnkKLWFueSBvdGhlciBlbnRpdHkgYmFzZWQgb24gaW5mcmluZ2VtZW50IG9mIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMKLW9yIG90aGVyd2lzZS4gQXMgYSBjb25kaXRpb24gdG8gZXhlcmNpc2luZyB0aGUgcmlnaHRzIGFuZCBsaWNlbnNlcwotZ3JhbnRlZCBoZXJldW5kZXIsIGVhY2ggUmVjaXBpZW50IGhlcmVieSBhc3N1bWVzIHNvbGUgcmVzcG9uc2liaWxpdHkgdG8KLXNlY3VyZSBhbnkgb3RoZXIgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBuZWVkZWQsIGlmIGFueS4gRm9yCi1leGFtcGxlLCBpZiBhIHRoaXJkIHBhcnR5IHBhdGVudCBsaWNlbnNlIGlzIHJlcXVpcmVkIHRvIGFsbG93IFJlY2lwaWVudAotdG8gZGlzdHJpYnV0ZSB0aGUgUHJvZ3JhbSwgaXQgaXMgUmVjaXBpZW50J3MgcmVzcG9uc2liaWxpdHkgdG8gYWNxdWlyZQotdGhhdCBsaWNlbnNlIGJlZm9yZSBkaXN0cmlidXRpbmcgdGhlIFByb2dyYW0uPC9wPgotCi08cCBjbGFzcz0ibGlzdCI+ZCkgRWFjaCBDb250cmlidXRvciByZXByZXNlbnRzIHRoYXQgdG8gaXRzIGtub3dsZWRnZSBpdAotaGFzIHN1ZmZpY2llbnQgY29weXJpZ2h0IHJpZ2h0cyBpbiBpdHMgQ29udHJpYnV0aW9uLCBpZiBhbnksIHRvIGdyYW50Ci10aGUgY29weXJpZ2h0IGxpY2Vuc2Ugc2V0IGZvcnRoIGluIHRoaXMgQWdyZWVtZW50LjwvcD4KLQotPHA+PGI+My4gUkVRVUlSRU1FTlRTPC9iPjwvcD4KLQotPHA+QSBDb250cmlidXRvciBtYXkgY2hvb3NlIHRvIGRpc3RyaWJ1dGUgdGhlIFByb2dyYW0gaW4gb2JqZWN0IGNvZGUKLWZvcm0gdW5kZXIgaXRzIG93biBsaWNlbnNlIGFncmVlbWVudCwgcHJvdmlkZWQgdGhhdDo8L3A+Ci0KLTxwIGNsYXNzPSJsaXN0Ij5hKSBpdCBjb21wbGllcyB3aXRoIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGlzCi1BZ3JlZW1lbnQ7IGFuZDwvcD4KLQotPHAgY2xhc3M9Imxpc3QiPmIpIGl0cyBsaWNlbnNlIGFncmVlbWVudDo8L3A+Ci0KLTxwIGNsYXNzPSJsaXN0Ij5pKSBlZmZlY3RpdmVseSBkaXNjbGFpbXMgb24gYmVoYWxmIG9mIGFsbCBDb250cmlidXRvcnMKLWFsbCB3YXJyYW50aWVzIGFuZCBjb25kaXRpb25zLCBleHByZXNzIGFuZCBpbXBsaWVkLCBpbmNsdWRpbmcgd2FycmFudGllcwotb3IgY29uZGl0aW9ucyBvZiB0aXRsZSBhbmQgbm9uLWluZnJpbmdlbWVudCwgYW5kIGltcGxpZWQgd2FycmFudGllcyBvcgotY29uZGl0aW9ucyBvZiBtZXJjaGFudGFiaWxpdHkgYW5kIGZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlOzwvcD4KLQotPHAgY2xhc3M9Imxpc3QiPmlpKSBlZmZlY3RpdmVseSBleGNsdWRlcyBvbiBiZWhhbGYgb2YgYWxsIENvbnRyaWJ1dG9ycwotYWxsIGxpYWJpbGl0eSBmb3IgZGFtYWdlcywgaW5jbHVkaW5nIGRpcmVjdCwgaW5kaXJlY3QsIHNwZWNpYWwsCi1pbmNpZGVudGFsIGFuZCBjb25zZXF1ZW50aWFsIGRhbWFnZXMsIHN1Y2ggYXMgbG9zdCBwcm9maXRzOzwvcD4KLQotPHAgY2xhc3M9Imxpc3QiPmlpaSkgc3RhdGVzIHRoYXQgYW55IHByb3Zpc2lvbnMgd2hpY2ggZGlmZmVyIGZyb20gdGhpcwotQWdyZWVtZW50IGFyZSBvZmZlcmVkIGJ5IHRoYXQgQ29udHJpYnV0b3IgYWxvbmUgYW5kIG5vdCBieSBhbnkgb3RoZXIKLXBhcnR5OyBhbmQ8L3A+Ci0KLTxwIGNsYXNzPSJsaXN0Ij5pdikgc3RhdGVzIHRoYXQgc291cmNlIGNvZGUgZm9yIHRoZSBQcm9ncmFtIGlzIGF2YWlsYWJsZQotZnJvbSBzdWNoIENvbnRyaWJ1dG9yLCBhbmQgaW5mb3JtcyBsaWNlbnNlZXMgaG93IHRvIG9idGFpbiBpdCBpbiBhCi1yZWFzb25hYmxlIG1hbm5lciBvbiBvciB0aHJvdWdoIGEgbWVkaXVtIGN1c3RvbWFyaWx5IHVzZWQgZm9yIHNvZnR3YXJlCi1leGNoYW5nZS48L3A+Ci0KLTxwPldoZW4gdGhlIFByb2dyYW0gaXMgbWFkZSBhdmFpbGFibGUgaW4gc291cmNlIGNvZGUgZm9ybTo8L3A+Ci0KLTxwIGNsYXNzPSJsaXN0Ij5hKSBpdCBtdXN0IGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoaXMgQWdyZWVtZW50OyBhbmQ8L3A+Ci0KLTxwIGNsYXNzPSJsaXN0Ij5iKSBhIGNvcHkgb2YgdGhpcyBBZ3JlZW1lbnQgbXVzdCBiZSBpbmNsdWRlZCB3aXRoIGVhY2gKLWNvcHkgb2YgdGhlIFByb2dyYW0uPC9wPgotCi08cD5Db250cmlidXRvcnMgbWF5IG5vdCByZW1vdmUgb3IgYWx0ZXIgYW55IGNvcHlyaWdodCBub3RpY2VzIGNvbnRhaW5lZAotd2l0aGluIHRoZSBQcm9ncmFtLjwvcD4KLQotPHA+RWFjaCBDb250cmlidXRvciBtdXN0IGlkZW50aWZ5IGl0c2VsZiBhcyB0aGUgb3JpZ2luYXRvciBvZiBpdHMKLUNvbnRyaWJ1dGlvbiwgaWYgYW55LCBpbiBhIG1hbm5lciB0aGF0IHJlYXNvbmFibHkgYWxsb3dzIHN1YnNlcXVlbnQKLVJlY2lwaWVudHMgdG8gaWRlbnRpZnkgdGhlIG9yaWdpbmF0b3Igb2YgdGhlIENvbnRyaWJ1dGlvbi48L3A+Ci0KLTxwPjxiPjQuIENPTU1FUkNJQUwgRElTVFJJQlVUSU9OPC9iPjwvcD4KLQotPHA+Q29tbWVyY2lhbCBkaXN0cmlidXRvcnMgb2Ygc29mdHdhcmUgbWF5IGFjY2VwdCBjZXJ0YWluCi1yZXNwb25zaWJpbGl0aWVzIHdpdGggcmVzcGVjdCB0byBlbmQgdXNlcnMsIGJ1c2luZXNzIHBhcnRuZXJzIGFuZCB0aGUKLWxpa2UuIFdoaWxlIHRoaXMgbGljZW5zZSBpcyBpbnRlbmRlZCB0byBmYWNpbGl0YXRlIHRoZSBjb21tZXJjaWFsIHVzZSBvZgotdGhlIFByb2dyYW0sIHRoZSBDb250cmlidXRvciB3aG8gaW5jbHVkZXMgdGhlIFByb2dyYW0gaW4gYSBjb21tZXJjaWFsCi1wcm9kdWN0IG9mZmVyaW5nIHNob3VsZCBkbyBzbyBpbiBhIG1hbm5lciB3aGljaCBkb2VzIG5vdCBjcmVhdGUKLXBvdGVudGlhbCBsaWFiaWxpdHkgZm9yIG90aGVyIENvbnRyaWJ1dG9ycy4gVGhlcmVmb3JlLCBpZiBhIENvbnRyaWJ1dG9yCi1pbmNsdWRlcyB0aGUgUHJvZ3JhbSBpbiBhIGNvbW1lcmNpYWwgcHJvZHVjdCBvZmZlcmluZywgc3VjaCBDb250cmlidXRvcgotKCJDb21tZXJjaWFsIENvbnRyaWJ1dG9yIikgaGVyZWJ5IGFncmVlcyB0byBkZWZlbmQgYW5kCi1pbmRlbW5pZnkgZXZlcnkgb3RoZXIgQ29udHJpYnV0b3IgKCJJbmRlbW5pZmllZCBDb250cmlidXRvciIpCi1hZ2FpbnN0IGFueSBsb3NzZXMsIGRhbWFnZXMgYW5kIGNvc3RzIChjb2xsZWN0aXZlbHkgIkxvc3NlcyIpCi1hcmlzaW5nIGZyb20gY2xhaW1zLCBsYXdzdWl0cyBhbmQgb3RoZXIgbGVnYWwgYWN0aW9ucyBicm91Z2h0IGJ5IGEgdGhpcmQKLXBhcnR5IGFnYWluc3QgdGhlIEluZGVtbmlmaWVkIENvbnRyaWJ1dG9yIHRvIHRoZSBleHRlbnQgY2F1c2VkIGJ5IHRoZQotYWN0cyBvciBvbWlzc2lvbnMgb2Ygc3VjaCBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIGluIGNvbm5lY3Rpb24gd2l0aCBpdHMKLWRpc3RyaWJ1dGlvbiBvZiB0aGUgUHJvZ3JhbSBpbiBhIGNvbW1lcmNpYWwgcHJvZHVjdCBvZmZlcmluZy4gVGhlCi1vYmxpZ2F0aW9ucyBpbiB0aGlzIHNlY3Rpb24gZG8gbm90IGFwcGx5IHRvIGFueSBjbGFpbXMgb3IgTG9zc2VzCi1yZWxhdGluZyB0byBhbnkgYWN0dWFsIG9yIGFsbGVnZWQgaW50ZWxsZWN0dWFsIHByb3BlcnR5IGluZnJpbmdlbWVudC4gSW4KLW9yZGVyIHRvIHF1YWxpZnksIGFuIEluZGVtbmlmaWVkIENvbnRyaWJ1dG9yIG11c3Q6IGEpIHByb21wdGx5IG5vdGlmeQotdGhlIENvbW1lcmNpYWwgQ29udHJpYnV0b3IgaW4gd3JpdGluZyBvZiBzdWNoIGNsYWltLCBhbmQgYikgYWxsb3cgdGhlCi1Db21tZXJjaWFsIENvbnRyaWJ1dG9yIHRvIGNvbnRyb2wsIGFuZCBjb29wZXJhdGUgd2l0aCB0aGUgQ29tbWVyY2lhbAotQ29udHJpYnV0b3IgaW4sIHRoZSBkZWZlbnNlIGFuZCBhbnkgcmVsYXRlZCBzZXR0bGVtZW50IG5lZ290aWF0aW9ucy4gVGhlCi1JbmRlbW5pZmllZCBDb250cmlidXRvciBtYXkgcGFydGljaXBhdGUgaW4gYW55IHN1Y2ggY2xhaW0gYXQgaXRzIG93bgotZXhwZW5zZS48L3A+Ci0KLTxwPkZvciBleGFtcGxlLCBhIENvbnRyaWJ1dG9yIG1pZ2h0IGluY2x1ZGUgdGhlIFByb2dyYW0gaW4gYSBjb21tZXJjaWFsCi1wcm9kdWN0IG9mZmVyaW5nLCBQcm9kdWN0IFguIFRoYXQgQ29udHJpYnV0b3IgaXMgdGhlbiBhIENvbW1lcmNpYWwKLUNvbnRyaWJ1dG9yLiBJZiB0aGF0IENvbW1lcmNpYWwgQ29udHJpYnV0b3IgdGhlbiBtYWtlcyBwZXJmb3JtYW5jZQotY2xhaW1zLCBvciBvZmZlcnMgd2FycmFudGllcyByZWxhdGVkIHRvIFByb2R1Y3QgWCwgdGhvc2UgcGVyZm9ybWFuY2UKLWNsYWltcyBhbmQgd2FycmFudGllcyBhcmUgc3VjaCBDb21tZXJjaWFsIENvbnRyaWJ1dG9yJ3MgcmVzcG9uc2liaWxpdHkKLWFsb25lLiBVbmRlciB0aGlzIHNlY3Rpb24sIHRoZSBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIHdvdWxkIGhhdmUgdG8KLWRlZmVuZCBjbGFpbXMgYWdhaW5zdCB0aGUgb3RoZXIgQ29udHJpYnV0b3JzIHJlbGF0ZWQgdG8gdGhvc2UKLXBlcmZvcm1hbmNlIGNsYWltcyBhbmQgd2FycmFudGllcywgYW5kIGlmIGEgY291cnQgcmVxdWlyZXMgYW55IG90aGVyCi1Db250cmlidXRvciB0byBwYXkgYW55IGRhbWFnZXMgYXMgYSByZXN1bHQsIHRoZSBDb21tZXJjaWFsIENvbnRyaWJ1dG9yCi1tdXN0IHBheSB0aG9zZSBkYW1hZ2VzLjwvcD4KLQotPHA+PGI+NS4gTk8gV0FSUkFOVFk8L2I+PC9wPgotCi08cD5FWENFUFQgQVMgRVhQUkVTU0xZIFNFVCBGT1JUSCBJTiBUSElTIEFHUkVFTUVOVCwgVEhFIFBST0dSQU0gSVMKLVBST1ZJREVEIE9OIEFOICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TCi1PRiBBTlkgS0lORCwgRUlUSEVSIEVYUFJFU1MgT1IgSU1QTElFRCBJTkNMVURJTkcsIFdJVEhPVVQgTElNSVRBVElPTiwKLUFOWSBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgVElUTEUsIE5PTi1JTkZSSU5HRU1FTlQsIE1FUkNIQU5UQUJJTElUWQotT1IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIEVhY2ggUmVjaXBpZW50IGlzIHNvbGVseQotcmVzcG9uc2libGUgZm9yIGRldGVybWluaW5nIHRoZSBhcHByb3ByaWF0ZW5lc3Mgb2YgdXNpbmcgYW5kCi1kaXN0cmlidXRpbmcgdGhlIFByb2dyYW0gYW5kIGFzc3VtZXMgYWxsIHJpc2tzIGFzc29jaWF0ZWQgd2l0aCBpdHMKLWV4ZXJjaXNlIG9mIHJpZ2h0cyB1bmRlciB0aGlzIEFncmVlbWVudCAsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8KLXRoZSByaXNrcyBhbmQgY29zdHMgb2YgcHJvZ3JhbSBlcnJvcnMsIGNvbXBsaWFuY2Ugd2l0aCBhcHBsaWNhYmxlIGxhd3MsCi1kYW1hZ2UgdG8gb3IgbG9zcyBvZiBkYXRhLCBwcm9ncmFtcyBvciBlcXVpcG1lbnQsIGFuZCB1bmF2YWlsYWJpbGl0eSBvcgotaW50ZXJydXB0aW9uIG9mIG9wZXJhdGlvbnMuPC9wPgotCi08cD48Yj42LiBESVNDTEFJTUVSIE9GIExJQUJJTElUWTwvYj48L3A+Ci0KLTxwPkVYQ0VQVCBBUyBFWFBSRVNTTFkgU0VUIEZPUlRIIElOIFRISVMgQUdSRUVNRU5ULCBORUlUSEVSIFJFQ0lQSUVOVAotTk9SIEFOWSBDT05UUklCVVRPUlMgU0hBTEwgSEFWRSBBTlkgTElBQklMSVRZIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKLUlOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcKLVdJVEhPVVQgTElNSVRBVElPTiBMT1NUIFBST0ZJVFMpLCBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRgotTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcKLU5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT1IKLURJU1RSSUJVVElPTiBPRiBUSEUgUFJPR1JBTSBPUiBUSEUgRVhFUkNJU0UgT0YgQU5ZIFJJR0hUUyBHUkFOVEVECi1IRVJFVU5ERVIsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0VTLjwvcD4KLQotPHA+PGI+Ny4gR0VORVJBTDwvYj48L3A+Ci0KLTxwPklmIGFueSBwcm92aXNpb24gb2YgdGhpcyBBZ3JlZW1lbnQgaXMgaW52YWxpZCBvciB1bmVuZm9yY2VhYmxlIHVuZGVyCi1hcHBsaWNhYmxlIGxhdywgaXQgc2hhbGwgbm90IGFmZmVjdCB0aGUgdmFsaWRpdHkgb3IgZW5mb3JjZWFiaWxpdHkgb2YKLXRoZSByZW1haW5kZXIgb2YgdGhlIHRlcm1zIG9mIHRoaXMgQWdyZWVtZW50LCBhbmQgd2l0aG91dCBmdXJ0aGVyIGFjdGlvbgotYnkgdGhlIHBhcnRpZXMgaGVyZXRvLCBzdWNoIHByb3Zpc2lvbiBzaGFsbCBiZSByZWZvcm1lZCB0byB0aGUgbWluaW11bQotZXh0ZW50IG5lY2Vzc2FyeSB0byBtYWtlIHN1Y2ggcHJvdmlzaW9uIHZhbGlkIGFuZCBlbmZvcmNlYWJsZS48L3A+Ci0KLTxwPklmIFJlY2lwaWVudCBpbnN0aXR1dGVzIHBhdGVudCBsaXRpZ2F0aW9uIGFnYWluc3QgYW55IGVudGl0eQotKGluY2x1ZGluZyBhIGNyb3NzLWNsYWltIG9yIGNvdW50ZXJjbGFpbSBpbiBhIGxhd3N1aXQpIGFsbGVnaW5nIHRoYXQgdGhlCi1Qcm9ncmFtIGl0c2VsZiAoZXhjbHVkaW5nIGNvbWJpbmF0aW9ucyBvZiB0aGUgUHJvZ3JhbSB3aXRoIG90aGVyCi1zb2Z0d2FyZSBvciBoYXJkd2FyZSkgaW5mcmluZ2VzIHN1Y2ggUmVjaXBpZW50J3MgcGF0ZW50KHMpLCB0aGVuIHN1Y2gKLVJlY2lwaWVudCdzIHJpZ2h0cyBncmFudGVkIHVuZGVyIFNlY3Rpb24gMihiKSBzaGFsbCB0ZXJtaW5hdGUgYXMgb2YgdGhlCi1kYXRlIHN1Y2ggbGl0aWdhdGlvbiBpcyBmaWxlZC48L3A+Ci0KLTxwPkFsbCBSZWNpcGllbnQncyByaWdodHMgdW5kZXIgdGhpcyBBZ3JlZW1lbnQgc2hhbGwgdGVybWluYXRlIGlmIGl0Ci1mYWlscyB0byBjb21wbHkgd2l0aCBhbnkgb2YgdGhlIG1hdGVyaWFsIHRlcm1zIG9yIGNvbmRpdGlvbnMgb2YgdGhpcwotQWdyZWVtZW50IGFuZCBkb2VzIG5vdCBjdXJlIHN1Y2ggZmFpbHVyZSBpbiBhIHJlYXNvbmFibGUgcGVyaW9kIG9mIHRpbWUKLWFmdGVyIGJlY29taW5nIGF3YXJlIG9mIHN1Y2ggbm9uY29tcGxpYW5jZS4gSWYgYWxsIFJlY2lwaWVudCdzIHJpZ2h0cwotdW5kZXIgdGhpcyBBZ3JlZW1lbnQgdGVybWluYXRlLCBSZWNpcGllbnQgYWdyZWVzIHRvIGNlYXNlIHVzZSBhbmQKLWRpc3RyaWJ1dGlvbiBvZiB0aGUgUHJvZ3JhbSBhcyBzb29uIGFzIHJlYXNvbmFibHkgcHJhY3RpY2FibGUuIEhvd2V2ZXIsCi1SZWNpcGllbnQncyBvYmxpZ2F0aW9ucyB1bmRlciB0aGlzIEFncmVlbWVudCBhbmQgYW55IGxpY2Vuc2VzIGdyYW50ZWQgYnkKLVJlY2lwaWVudCByZWxhdGluZyB0byB0aGUgUHJvZ3JhbSBzaGFsbCBjb250aW51ZSBhbmQgc3Vydml2ZS48L3A+Ci0KLTxwPkV2ZXJ5b25lIGlzIHBlcm1pdHRlZCB0byBjb3B5IGFuZCBkaXN0cmlidXRlIGNvcGllcyBvZiB0aGlzCi1BZ3JlZW1lbnQsIGJ1dCBpbiBvcmRlciB0byBhdm9pZCBpbmNvbnNpc3RlbmN5IHRoZSBBZ3JlZW1lbnQgaXMKLWNvcHlyaWdodGVkIGFuZCBtYXkgb25seSBiZSBtb2RpZmllZCBpbiB0aGUgZm9sbG93aW5nIG1hbm5lci4gVGhlCi1BZ3JlZW1lbnQgU3Rld2FyZCByZXNlcnZlcyB0aGUgcmlnaHQgdG8gcHVibGlzaCBuZXcgdmVyc2lvbnMgKGluY2x1ZGluZwotcmV2aXNpb25zKSBvZiB0aGlzIEFncmVlbWVudCBmcm9tIHRpbWUgdG8gdGltZS4gTm8gb25lIG90aGVyIHRoYW4gdGhlCi1BZ3JlZW1lbnQgU3Rld2FyZCBoYXMgdGhlIHJpZ2h0IHRvIG1vZGlmeSB0aGlzIEFncmVlbWVudC4gVGhlIEVjbGlwc2UKLUZvdW5kYXRpb24gaXMgdGhlIGluaXRpYWwgQWdyZWVtZW50IFN0ZXdhcmQuIFRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWF5Ci1hc3NpZ24gdGhlIHJlc3BvbnNpYmlsaXR5IHRvIHNlcnZlIGFzIHRoZSBBZ3JlZW1lbnQgU3Rld2FyZCB0byBhCi1zdWl0YWJsZSBzZXBhcmF0ZSBlbnRpdHkuIEVhY2ggbmV3IHZlcnNpb24gb2YgdGhlIEFncmVlbWVudCB3aWxsIGJlCi1naXZlbiBhIGRpc3Rpbmd1aXNoaW5nIHZlcnNpb24gbnVtYmVyLiBUaGUgUHJvZ3JhbSAoaW5jbHVkaW5nCi1Db250cmlidXRpb25zKSBtYXkgYWx3YXlzIGJlIGRpc3RyaWJ1dGVkIHN1YmplY3QgdG8gdGhlIHZlcnNpb24gb2YgdGhlCi1BZ3JlZW1lbnQgdW5kZXIgd2hpY2ggaXQgd2FzIHJlY2VpdmVkLiBJbiBhZGRpdGlvbiwgYWZ0ZXIgYSBuZXcgdmVyc2lvbgotb2YgdGhlIEFncmVlbWVudCBpcyBwdWJsaXNoZWQsIENvbnRyaWJ1dG9yIG1heSBlbGVjdCB0byBkaXN0cmlidXRlIHRoZQotUHJvZ3JhbSAoaW5jbHVkaW5nIGl0cyBDb250cmlidXRpb25zKSB1bmRlciB0aGUgbmV3IHZlcnNpb24uIEV4Y2VwdCBhcwotZXhwcmVzc2x5IHN0YXRlZCBpbiBTZWN0aW9ucyAyKGEpIGFuZCAyKGIpIGFib3ZlLCBSZWNpcGllbnQgcmVjZWl2ZXMgbm8KLXJpZ2h0cyBvciBsaWNlbnNlcyB0byB0aGUgaW50ZWxsZWN0dWFsIHByb3BlcnR5IG9mIGFueSBDb250cmlidXRvciB1bmRlcgotdGhpcyBBZ3JlZW1lbnQsIHdoZXRoZXIgZXhwcmVzc2x5LCBieSBpbXBsaWNhdGlvbiwgZXN0b3BwZWwgb3IKLW90aGVyd2lzZS4gQWxsIHJpZ2h0cyBpbiB0aGUgUHJvZ3JhbSBub3QgZXhwcmVzc2x5IGdyYW50ZWQgdW5kZXIgdGhpcwotQWdyZWVtZW50IGFyZSByZXNlcnZlZC48L3A+Ci0KLTxwPlRoaXMgQWdyZWVtZW50IGlzIGdvdmVybmVkIGJ5IHRoZSBsYXdzIG9mIHRoZSBTdGF0ZSBvZiBOZXcgWW9yayBhbmQKLXRoZSBpbnRlbGxlY3R1YWwgcHJvcGVydHkgbGF3cyBvZiB0aGUgVW5pdGVkIFN0YXRlcyBvZiBBbWVyaWNhLiBObyBwYXJ0eQotdG8gdGhpcyBBZ3JlZW1lbnQgd2lsbCBicmluZyBhIGxlZ2FsIGFjdGlvbiB1bmRlciB0aGlzIEFncmVlbWVudCBtb3JlCi10aGFuIG9uZSB5ZWFyIGFmdGVyIHRoZSBjYXVzZSBvZiBhY3Rpb24gYXJvc2UuIEVhY2ggcGFydHkgd2FpdmVzIGl0cwotcmlnaHRzIHRvIGEganVyeSB0cmlhbCBpbiBhbnkgcmVzdWx0aW5nIGxpdGlnYXRpb24uPC9wPgotCi0KLQotPC9ib2R5PjwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmRhdGFpbnRlcmNoYW5nZS5jb21tb24vbGljZW5zZS5odG1sIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5kYXRhaW50ZXJjaGFuZ2UuY29tbW9uL2xpY2Vuc2UuaHRtbAppbmRleCA2ZTU3OWE1Li4wMDhiODAxIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmRhdGFpbnRlcmNoYW5nZS5jb21tb24vbGljZW5zZS5odG1sCisrKyBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQuZGF0YWludGVyY2hhbmdlLmNvbW1vbi9saWNlbnNlLmh0bWwKQEAgLTEsMTY0ICsxLDE4OSBAQAotPCEtLT94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iSVNPLTg4NTktMSIgPy0tPgorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iSVNPLTg4NTktMSIgPz4KIDwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFN0cmljdC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS1zdHJpY3QuZHRkIj4KLTxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIj48aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTEiPgorPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiPgorPGhlYWQ+Cis8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1JU08tODg1OS0xIiAvPgogPHRpdGxlPkVjbGlwc2UgRm91bmRhdGlvbiBTb2Z0d2FyZSBVc2VyIEFncmVlbWVudDwvdGl0bGU+CiA8L2hlYWQ+CiAKIDxib2R5IGxhbmc9IkVOLVVTIj4KLTxoMj5FY2xpcHNlIEZvdW5kYXRpb24gU29mdHdhcmUgVXNlciBBZ3JlZW1lbnQ8L2gyPgotPHA+RmVicnVhcnkgMSwgMjAxMTwvcD4KKwk8aDI+RWNsaXBzZSBGb3VuZGF0aW9uIFNvZnR3YXJlIFVzZXIgQWdyZWVtZW50PC9oMj4KKwk8cD5Ob3ZlbWJlciAyMiwgMjAxNzwvcD4KIAotPGgzPlVzYWdlIE9mIENvbnRlbnQ8L2gzPgorCTxoMz5Vc2FnZSBPZiBDb250ZW50PC9oMz4KIAotPHA+VEhFIEVDTElQU0UgRk9VTkRBVElPTiBNQUtFUyBBVkFJTEFCTEUgU09GVFdBUkUsIERPQ1VNRU5UQVRJT04sIElORk9STUFUSU9OIEFORC9PUiBPVEhFUiBNQVRFUklBTFMgRk9SIE9QRU4gU09VUkNFIFBST0pFQ1RTCi0gICAoQ09MTEVDVElWRUxZICJDT05URU5UIikuICBVU0UgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVMgQUdSRUVNRU5UIEFORC9PUiBUSEUgVEVSTVMgQU5ECi0gICBDT05ESVRJT05TIE9GIExJQ0VOU0UgQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiAgQlkgVVNJTkcgVEhFIENPTlRFTlQsIFlPVSBBR1JFRSBUSEFUIFlPVVIgVVNFCi0gICBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSElTIEFHUkVFTUVOVCBBTkQvT1IgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UUyBPUgotICAgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gIElGIFlPVSBETyBOT1QgQUdSRUUgVE8gVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVMgQUdSRUVNRU5UIEFORCBUSEUgVEVSTVMgQU5ECi0gICBDT05ESVRJT05TIE9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLCBUSEVOIFlPVSBNQVkgTk9UIFVTRSBUSEUgQ09OVEVOVC48L3A+CisJPHA+VEhFIEVDTElQU0UgRk9VTkRBVElPTiBNQUtFUyBBVkFJTEFCTEUgU09GVFdBUkUsIERPQ1VNRU5UQVRJT04sCisJCUlORk9STUFUSU9OIEFORC9PUiBPVEhFUiBNQVRFUklBTFMgRk9SIE9QRU4gU09VUkNFIFBST0pFQ1RTCisJCShDT0xMRUNUSVZFTFkgJnF1b3Q7Q09OVEVOVCZxdW90OykuIFVTRSBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWQorCQlUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJUyBBR1JFRU1FTlQgQU5EL09SIFRIRSBURVJNUyBBTkQKKwkJQ09ORElUSU9OUyBPRiBMSUNFTlNFIEFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRAorCQlCRUxPVy4gQlkgVVNJTkcgVEhFIENPTlRFTlQsIFlPVSBBR1JFRSBUSEFUIFlPVVIgVVNFIE9GIFRIRSBDT05URU5UIElTCisJCUdPVkVSTkVEIEJZIFRISVMgQUdSRUVNRU5UIEFORC9PUiBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgQU5ZCisJCUFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQKKwkJQkVMT1cuIElGIFlPVSBETyBOT1QgQUdSRUUgVE8gVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVMKKwkJQUdSRUVNRU5UIEFORCBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRQorCQlBR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1csIFRIRU4gWU9VIE1BWSBOT1QKKwkJVVNFIFRIRSBDT05URU5ULjwvcD4KIAotPGgzPkFwcGxpY2FibGUgTGljZW5zZXM8L2gzPgorCTxoMz5BcHBsaWNhYmxlIExpY2Vuc2VzPC9oMz4KIAotPHA+VW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQsIGFsbCBDb250ZW50IG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlCi0gRm91bmRhdGlvbiBpcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSAKLUVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAKLSAgICgiRVBMIikuICBBIGNvcHkgb2YgdGhlIEVQTCBpcyBwcm92aWRlZCB3aXRoIHRoaXMgQ29udGVudCBhbmQgaXMgYWxzbwotIGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWw8L2E+LgotICAgRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICJQcm9ncmFtIiB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9wPgorCTxwPgorCQlVbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCwgYWxsIENvbnRlbnQgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UKKwkJRm91bmRhdGlvbiBpcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZQorCQlFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMi4wICgmcXVvdDtFUEwmcXVvdDspLiBBIGNvcHkgb2YgdGhlCisJCUVQTCBpcyBwcm92aWRlZCB3aXRoIHRoaXMgQ29udGVudCBhbmQgaXMgYWxzbyBhdmFpbGFibGUgYXQgPGEKKwkJCWhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wPC9hPi4KKwkJRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICZxdW90O1Byb2dyYW0mcXVvdDsgd2lsbCBtZWFuIHRoZSBDb250ZW50LgorCTwvcD4KIAotPHA+Q29udGVudCBpbmNsdWRlcywgYnV0IGlzIG5vdCBsaW1pdGVkIHRvLCBzb3VyY2UgY29kZSwgb2JqZWN0IGNvZGUsIAotZG9jdW1lbnRhdGlvbiBhbmQgb3RoZXIgZmlsZXMgbWFpbnRhaW5lZCBpbiB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIAotc291cmNlIGNvZGUKLSAgIHJlcG9zaXRvcnkgKCJSZXBvc2l0b3J5IikgaW4gc29mdHdhcmUgbW9kdWxlcyAoIk1vZHVsZXMiKSBhbmQgbWFkZSAKLWF2YWlsYWJsZSBhcyBkb3dubG9hZGFibGUgYXJjaGl2ZXMgKCJEb3dubG9hZHMiKS48L3A+CisJPHA+Q29udGVudCBpbmNsdWRlcywgYnV0IGlzIG5vdCBsaW1pdGVkIHRvLCBzb3VyY2UgY29kZSwgb2JqZWN0CisJCWNvZGUsIGRvY3VtZW50YXRpb24gYW5kIG90aGVyIGZpbGVzIG1haW50YWluZWQgaW4gdGhlIEVjbGlwc2UKKwkJRm91bmRhdGlvbiBzb3VyY2UgY29kZSByZXBvc2l0b3J5ICgmcXVvdDtSZXBvc2l0b3J5JnF1b3Q7KSBpbiBzb2Z0d2FyZQorCQltb2R1bGVzICgmcXVvdDtNb2R1bGVzJnF1b3Q7KSBhbmQgbWFkZSBhdmFpbGFibGUgYXMgZG93bmxvYWRhYmxlCisJCWFyY2hpdmVzICgmcXVvdDtEb3dubG9hZHMmcXVvdDspLjwvcD4KIAotPHVsPgotICAgICAgIDxsaT5Db250ZW50IG1heSBiZSBzdHJ1Y3R1cmVkIGFuZCBwYWNrYWdlZCBpbnRvIG1vZHVsZXMgdG8gCi1mYWNpbGl0YXRlIGRlbGl2ZXJpbmcsIGV4dGVuZGluZywgYW5kIHVwZ3JhZGluZyB0aGUgQ29udGVudC4gIFR5cGljYWwgCi1tb2R1bGVzIG1heSBpbmNsdWRlIHBsdWctaW5zICgiUGx1Zy1pbnMiKSwgcGx1Zy1pbiBmcmFnbWVudHMgCi0oIkZyYWdtZW50cyIpLCBhbmQgZmVhdHVyZXMgKCJGZWF0dXJlcyIpLjwvbGk+Ci0gICAgICAgPGxpPkVhY2ggUGx1Zy1pbiBvciBGcmFnbWVudCBtYXkgYmUgcGFja2FnZWQgYXMgYSBzdWItZGlyZWN0b3J5IG9yIEpBUiAoSmF2YSYjODQ4MjsgQVJjaGl2ZSkgaW4gYSBkaXJlY3RvcnkgbmFtZWQgInBsdWdpbnMiLjwvbGk+Ci0gICAgICAgPGxpPkEgRmVhdHVyZSBpcyBhIGJ1bmRsZSBvZiBvbmUgb3IgbW9yZSBQbHVnLWlucyBhbmQvb3IgCi1GcmFnbWVudHMgYW5kIGFzc29jaWF0ZWQgbWF0ZXJpYWwuICBFYWNoIEZlYXR1cmUgbWF5IGJlIHBhY2thZ2VkIGFzIGEgCi1zdWItZGlyZWN0b3J5IGluIGEgZGlyZWN0b3J5IG5hbWVkICJmZWF0dXJlcyIuICBXaXRoaW4gYSBGZWF0dXJlLCBmaWxlcyAKLW5hbWVkICJmZWF0dXJlLnhtbCIgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIAotb2YgdGhlIFBsdWctaW5zCi0gICAgICBhbmQvb3IgRnJhZ21lbnRzIGFzc29jaWF0ZWQgd2l0aCB0aGF0IEZlYXR1cmUuPC9saT4KLSAgICAgICA8bGk+RmVhdHVyZXMgbWF5IGFsc28gaW5jbHVkZSBvdGhlciBGZWF0dXJlcyAoIkluY2x1ZGVkIAotRmVhdHVyZXMiKS4gV2l0aGluIGEgRmVhdHVyZSwgZmlsZXMgbmFtZWQgImZlYXR1cmUueG1sIiBtYXkgY29udGFpbiBhIAotbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZiBJbmNsdWRlZCBGZWF0dXJlcy48L2xpPgotPC91bD4KKwk8dWw+CisJCTxsaT5Db250ZW50IG1heSBiZSBzdHJ1Y3R1cmVkIGFuZCBwYWNrYWdlZCBpbnRvIG1vZHVsZXMgdG8KKwkJCWZhY2lsaXRhdGUgZGVsaXZlcmluZywgZXh0ZW5kaW5nLCBhbmQgdXBncmFkaW5nIHRoZSBDb250ZW50LiBUeXBpY2FsCisJCQltb2R1bGVzIG1heSBpbmNsdWRlIHBsdWctaW5zICgmcXVvdDtQbHVnLWlucyZxdW90OyksIHBsdWctaW4KKwkJCWZyYWdtZW50cyAoJnF1b3Q7RnJhZ21lbnRzJnF1b3Q7KSwgYW5kIGZlYXR1cmVzCisJCQkoJnF1b3Q7RmVhdHVyZXMmcXVvdDspLjwvbGk+CisJCTxsaT5FYWNoIFBsdWctaW4gb3IgRnJhZ21lbnQgbWF5IGJlIHBhY2thZ2VkIGFzIGEgc3ViLWRpcmVjdG9yeQorCQkJb3IgSkFSIChKYXZhJnRyYWRlOyBBUmNoaXZlKSBpbiBhIGRpcmVjdG9yeSBuYW1lZAorCQkJJnF1b3Q7cGx1Z2lucyZxdW90Oy48L2xpPgorCQk8bGk+QSBGZWF0dXJlIGlzIGEgYnVuZGxlIG9mIG9uZSBvciBtb3JlIFBsdWctaW5zIGFuZC9vcgorCQkJRnJhZ21lbnRzIGFuZCBhc3NvY2lhdGVkIG1hdGVyaWFsLiBFYWNoIEZlYXR1cmUgbWF5IGJlIHBhY2thZ2VkIGFzIGEKKwkJCXN1Yi1kaXJlY3RvcnkgaW4gYSBkaXJlY3RvcnkgbmFtZWQgJnF1b3Q7ZmVhdHVyZXMmcXVvdDsuIFdpdGhpbiBhCisJCQlGZWF0dXJlLCBmaWxlcyBuYW1lZCAmcXVvdDtmZWF0dXJlLnhtbCZxdW90OyBtYXkgY29udGFpbiBhIGxpc3Qgb2YKKwkJCXRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mIHRoZSBQbHVnLWlucyBhbmQvb3IgRnJhZ21lbnRzCisJCQlhc3NvY2lhdGVkIHdpdGggdGhhdCBGZWF0dXJlLjwvbGk+CisJCTxsaT5GZWF0dXJlcyBtYXkgYWxzbyBpbmNsdWRlIG90aGVyIEZlYXR1cmVzICgmcXVvdDtJbmNsdWRlZAorCQkJRmVhdHVyZXMmcXVvdDspLiBXaXRoaW4gYSBGZWF0dXJlLCBmaWxlcyBuYW1lZAorCQkJJnF1b3Q7ZmVhdHVyZS54bWwmcXVvdDsgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbgorCQkJbnVtYmVycyBvZiBJbmNsdWRlZCBGZWF0dXJlcy48L2xpPgorCTwvdWw+CiAKLTxwPlRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBzaG91bGQgYmUgCi1jb250YWluZWQgaW4gZmlsZXMgbmFtZWQgImFib3V0Lmh0bWwiICgiQWJvdXRzIikuIFRoZSB0ZXJtcyBhbmQgCi1jb25kaXRpb25zIGdvdmVybmluZyBGZWF0dXJlcyBhbmQKLUluY2x1ZGVkIEZlYXR1cmVzIHNob3VsZCBiZSBjb250YWluZWQgaW4gZmlsZXMgbmFtZWQgImxpY2Vuc2UuaHRtbCIgCi0oIkZlYXR1cmUgTGljZW5zZXMiKS4gIEFib3V0cyBhbmQgRmVhdHVyZSBMaWNlbnNlcyBtYXkgYmUgbG9jYXRlZCBpbiBhbnkKLSBkaXJlY3Rvcnkgb2YgYSBEb3dubG9hZCBvciBNb2R1bGUKLWluY2x1ZGluZywgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBmb2xsb3dpbmcgbG9jYXRpb25zOjwvcD4KKwk8cD5UaGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgc2hvdWxkCisJCWJlIGNvbnRhaW5lZCBpbiBmaWxlcyBuYW1lZCAmcXVvdDthYm91dC5odG1sJnF1b3Q7CisJCSgmcXVvdDtBYm91dHMmcXVvdDspLiBUaGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIEZlYXR1cmVzIGFuZAorCQlJbmNsdWRlZCBGZWF0dXJlcyBzaG91bGQgYmUgY29udGFpbmVkIGluIGZpbGVzIG5hbWVkCisJCSZxdW90O2xpY2Vuc2UuaHRtbCZxdW90OyAoJnF1b3Q7RmVhdHVyZSBMaWNlbnNlcyZxdW90OykuIEFib3V0cyBhbmQKKwkJRmVhdHVyZSBMaWNlbnNlcyBtYXkgYmUgbG9jYXRlZCBpbiBhbnkgZGlyZWN0b3J5IG9mIGEgRG93bmxvYWQgb3IKKwkJTW9kdWxlIGluY2x1ZGluZywgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBmb2xsb3dpbmcgbG9jYXRpb25zOjwvcD4KIAotPHVsPgotICAgICAgIDxsaT5UaGUgdG9wLWxldmVsIChyb290KSBkaXJlY3Rvcnk8L2xpPgotICAgICAgIDxsaT5QbHVnLWluIGFuZCBGcmFnbWVudCBkaXJlY3RvcmllczwvbGk+Ci0gICAgICAgPGxpPkluc2lkZSBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHBhY2thZ2VkIGFzIEpBUnM8L2xpPgotICAgICAgIDxsaT5TdWItZGlyZWN0b3JpZXMgb2YgdGhlIGRpcmVjdG9yeSBuYW1lZCAic3JjIiBvZiBjZXJ0YWluIFBsdWctaW5zPC9saT4KLSAgICAgICA8bGk+RmVhdHVyZSBkaXJlY3RvcmllczwvbGk+Ci08L3VsPgorCTx1bD4KKwkJPGxpPlRoZSB0b3AtbGV2ZWwgKHJvb3QpIGRpcmVjdG9yeTwvbGk+CisJCTxsaT5QbHVnLWluIGFuZCBGcmFnbWVudCBkaXJlY3RvcmllczwvbGk+CisJCTxsaT5JbnNpZGUgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBwYWNrYWdlZCBhcyBKQVJzPC9saT4KKwkJPGxpPlN1Yi1kaXJlY3RvcmllcyBvZiB0aGUgZGlyZWN0b3J5IG5hbWVkICZxdW90O3NyYyZxdW90OyBvZgorCQkJY2VydGFpbiBQbHVnLWluczwvbGk+CisJCTxsaT5GZWF0dXJlIGRpcmVjdG9yaWVzPC9saT4KKwk8L3VsPgogCi08cD5Ob3RlOiBpZiBhIEZlYXR1cmUgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiBpcyAKLWluc3RhbGxlZCB1c2luZyB0aGUgUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kgKGFzIGRlZmluZWQgYmVsb3cpLCB5b3UgbXVzdAotIGFncmVlIHRvIGEgbGljZW5zZSAoIkZlYXR1cmUgVXBkYXRlIExpY2Vuc2UiKSBkdXJpbmcgdGhlCi1pbnN0YWxsYXRpb24gcHJvY2Vzcy4gIElmIHRoZSBGZWF0dXJlIGNvbnRhaW5zIEluY2x1ZGVkIEZlYXR1cmVzLCB0aGUgCi1GZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIHNob3VsZCBlaXRoZXIgcHJvdmlkZSB5b3Ugd2l0aCB0aGUgdGVybXMgYW5kIAotY29uZGl0aW9ucyBnb3Zlcm5pbmcgdGhlIEluY2x1ZGVkIEZlYXR1cmVzIG9yCi1pbmZvcm0geW91IHdoZXJlIHlvdSBjYW4gbG9jYXRlIHRoZW0uICBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBtYXkgYmUgCi1mb3VuZCBpbiB0aGUgImxpY2Vuc2UiIHByb3BlcnR5IG9mIGZpbGVzIG5hbWVkICJmZWF0dXJlLnByb3BlcnRpZXMiIAotZm91bmQgd2l0aGluIGEgRmVhdHVyZS4KLVN1Y2ggQWJvdXRzLCBGZWF0dXJlIExpY2Vuc2VzLCBhbmQgRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgY29udGFpbiB0aGUgCi10ZXJtcyBhbmQgY29uZGl0aW9ucyAob3IgcmVmZXJlbmNlcyB0byBzdWNoIHRlcm1zIGFuZCBjb25kaXRpb25zKSB0aGF0IAotZ292ZXJuIHlvdXIgdXNlIG9mIHRoZSBhc3NvY2lhdGVkIENvbnRlbnQgaW4KLXRoYXQgZGlyZWN0b3J5LjwvcD4KKwk8cD5Ob3RlOiBpZiBhIEZlYXR1cmUgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiBpcworCQlpbnN0YWxsZWQgdXNpbmcgdGhlIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5IChhcyBkZWZpbmVkIGJlbG93KSwgeW91CisJCW11c3QgYWdyZWUgdG8gYSBsaWNlbnNlICgmcXVvdDtGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlJnF1b3Q7KSBkdXJpbmcKKwkJdGhlIGluc3RhbGxhdGlvbiBwcm9jZXNzLiBJZiB0aGUgRmVhdHVyZSBjb250YWlucyBJbmNsdWRlZCBGZWF0dXJlcywKKwkJdGhlIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2Ugc2hvdWxkIGVpdGhlciBwcm92aWRlIHlvdSB3aXRoIHRoZSB0ZXJtcworCQlhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgdGhlIEluY2x1ZGVkIEZlYXR1cmVzIG9yIGluZm9ybSB5b3Ugd2hlcmUgeW91CisJCWNhbiBsb2NhdGUgdGhlbS4gRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgbWF5IGJlIGZvdW5kIGluIHRoZQorCQkmcXVvdDtsaWNlbnNlJnF1b3Q7IHByb3BlcnR5IG9mIGZpbGVzIG5hbWVkCisJCSZxdW90O2ZlYXR1cmUucHJvcGVydGllcyZxdW90OyBmb3VuZCB3aXRoaW4gYSBGZWF0dXJlLiBTdWNoIEFib3V0cywKKwkJRmVhdHVyZSBMaWNlbnNlcywgYW5kIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIGNvbnRhaW4gdGhlIHRlcm1zIGFuZAorCQljb25kaXRpb25zIChvciByZWZlcmVuY2VzIHRvIHN1Y2ggdGVybXMgYW5kIGNvbmRpdGlvbnMpIHRoYXQgZ292ZXJuCisJCXlvdXIgdXNlIG9mIHRoZSBhc3NvY2lhdGVkIENvbnRlbnQgaW4gdGhhdCBkaXJlY3RvcnkuPC9wPgogCi08cD5USEUgQUJPVVRTLCBGRUFUVVJFIExJQ0VOU0VTLCBBTkQgRkVBVFVSRSBVUERBVEUgTElDRU5TRVMgTUFZIFJFRkVSIAotVE8gVEhFIEVQTCBPUiBPVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMsIE5PVElDRVMgT1IgVEVSTVMgQU5EIENPTkRJVElPTlMuCi0gIFNPTUUgT0YgVEhFU0UKLU9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUyBNQVkgSU5DTFVERSAoQlVUIEFSRSBOT1QgTElNSVRFRCBUTyk6PC9wPgorCTxwPlRIRSBBQk9VVFMsIEZFQVRVUkUgTElDRU5TRVMsIEFORCBGRUFUVVJFIFVQREFURSBMSUNFTlNFUyBNQVkKKwkJUkVGRVIgVE8gVEhFIEVQTCBPUiBPVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMsIE5PVElDRVMgT1IgVEVSTVMgQU5ECisJCUNPTkRJVElPTlMuIFNPTUUgT0YgVEhFU0UgT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTIE1BWSBJTkNMVURFIChCVVQKKwkJQVJFIE5PVCBMSU1JVEVEIFRPKTo8L3A+CiAKLTx1bD4KLSAgICAgICA8bGk+RWNsaXBzZSBEaXN0cmlidXRpb24gTGljZW5zZSBWZXJzaW9uIDEuMCAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGljZW5zZXMvZWRsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xpY2Vuc2VzL2VkbC12MS4wLmh0bWw8L2E+KTwvbGk+Ci0gICAgICAgPGxpPkNvbW1vbiBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbDwvYT4pPC9saT4KLSAgICAgICA8bGk+QXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMS4xIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UiPmh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFPC9hPik8L2xpPgotICAgICAgIDxsaT5BcGFjaGUgU29mdHdhcmUgTGljZW5zZSAyLjAgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAiPmh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMDwvYT4pPC9saT4KLSAgICAgICA8bGk+TWV0cm8gTGluayBQdWJsaWMgTGljZW5zZSAxLjAwIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuZ3JvdXAub3JnL29wZW5tb3RpZi9zdXBwb3J0ZXJzL21ldHJvbGluay9saWNlbnNlLmh0bWwiPmh0dHA6Ly93d3cub3Blbmdyb3VwLm9yZy9vcGVubW90aWYvc3VwcG9ydGVycy9tZXRyb2xpbmsvbGljZW5zZS5odG1sPC9hPik8L2xpPgotICAgICAgIDxsaT5Nb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4xIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvTVBMLTEuMS5odG1sIj5odHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC9NUEwtMS4xLmh0bWw8L2E+KTwvbGk+Ci08L3VsPgorCTx1bD4KKwkJPGxpPkVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKGF2YWlsYWJsZSBhdCA8YQorCQkJaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sPC9hPikKKwkJPC9saT4KKwkJPGxpPkVjbGlwc2UgRGlzdHJpYnV0aW9uIExpY2Vuc2UgVmVyc2lvbiAxLjAgKGF2YWlsYWJsZSBhdCA8YQorCQkJaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9saWNlbnNlcy9lZGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGljZW5zZXMvZWRsLXYxLjAuaHRtbDwvYT4pCisJCTwvbGk+CisJCTxsaT5Db21tb24gUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKGF2YWlsYWJsZSBhdCA8YQorCQkJaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sPC9hPikKKwkJPC9saT4KKwkJPGxpPkFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDEuMSAoYXZhaWxhYmxlIGF0IDxhCisJCQlocmVmPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRSI+aHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0U8L2E+KQorCQk8L2xpPgorCQk8bGk+QXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMi4wIChhdmFpbGFibGUgYXQgPGEKKwkJCWhyZWY9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCI+aHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wPC9hPikKKwkJPC9saT4KKwkJPGxpPk1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjEgKGF2YWlsYWJsZSBhdCA8YQorCQkJaHJlZj0iaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvTVBMLTEuMS5odG1sIj5odHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC9NUEwtMS4xLmh0bWw8L2E+KQorCQk8L2xpPgorCTwvdWw+CiAKLTxwPklUIElTIFlPVVIgT0JMSUdBVElPTiBUTyBSRUFEIEFORCBBQ0NFUFQgQUxMIFNVQ0ggVEVSTVMgQU5EIAotQ09ORElUSU9OUyBQUklPUiBUTyBVU0UgT0YgVEhFIENPTlRFTlQuICBJZiBubyBBYm91dCwgRmVhdHVyZSBMaWNlbnNlLCAKLW9yIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2UgaXMgcHJvdmlkZWQsIHBsZWFzZQotY29udGFjdCB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIHRvIGRldGVybWluZSB3aGF0IHRlcm1zIGFuZCBjb25kaXRpb25zIAotZ292ZXJuIHRoYXQgcGFydGljdWxhciBDb250ZW50LjwvcD4KKwk8cD5JVCBJUyBZT1VSIE9CTElHQVRJT04gVE8gUkVBRCBBTkQgQUNDRVBUIEFMTCBTVUNIIFRFUk1TIEFORAorCQlDT05ESVRJT05TIFBSSU9SIFRPIFVTRSBPRiBUSEUgQ09OVEVOVC4gSWYgbm8gQWJvdXQsIEZlYXR1cmUgTGljZW5zZSwKKwkJb3IgRmVhdHVyZSBVcGRhdGUgTGljZW5zZSBpcyBwcm92aWRlZCwgcGxlYXNlIGNvbnRhY3QgdGhlIEVjbGlwc2UKKwkJRm91bmRhdGlvbiB0byBkZXRlcm1pbmUgd2hhdCB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm4gdGhhdAorCQlwYXJ0aWN1bGFyIENvbnRlbnQuPC9wPgogCiAKLTxoMz5Vc2Ugb2YgUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3k8L2gzPgorCTxoMz5Vc2Ugb2YgUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3k8L2gzPgogCi08cD5UaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1ha2VzIGF2YWlsYWJsZSBwcm92aXNpb25pbmcgc29mdHdhcmUsIAotZXhhbXBsZXMgb2Ygd2hpY2ggaW5jbHVkZSwgYnV0IGFyZSBub3QgbGltaXRlZCB0bywgcDIgYW5kIHRoZSBFY2xpcHNlCi0gICBVcGRhdGUgTWFuYWdlciAoIlByb3Zpc2lvbmluZyBUZWNobm9sb2d5IikgZm9yIHRoZSBwdXJwb3NlIG9mIAotYWxsb3dpbmcgdXNlcnMgdG8gaW5zdGFsbCBzb2Z0d2FyZSwgZG9jdW1lbnRhdGlvbiwgaW5mb3JtYXRpb24gYW5kL29yCi0gICBvdGhlciBtYXRlcmlhbHMgKGNvbGxlY3RpdmVseSAiSW5zdGFsbGFibGUgU29mdHdhcmUiKS4gVGhpcyAKLWNhcGFiaWxpdHkgaXMgcHJvdmlkZWQgd2l0aCB0aGUgaW50ZW50IG9mIGFsbG93aW5nIHN1Y2ggdXNlcnMgdG8KLSAgIGluc3RhbGwsIGV4dGVuZCBhbmQgdXBkYXRlIEVjbGlwc2UtYmFzZWQgcHJvZHVjdHMuIEluZm9ybWF0aW9uIGFib3V0IAotcGFja2FnaW5nIEluc3RhbGxhYmxlIFNvZnR3YXJlIGlzIGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vZWNsaXBzZS5vcmcvZXF1aW5veC9wMi9yZXBvc2l0b3J5X3BhY2thZ2luZy5odG1sIj5odHRwOi8vZWNsaXBzZS5vcmcvZXF1aW5veC9wMi9yZXBvc2l0b3J5X3BhY2thZ2luZy5odG1sPC9hPgotICAgKCJTcGVjaWZpY2F0aW9uIikuPC9wPgorCTxwPgorCQlUaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1ha2VzIGF2YWlsYWJsZSBwcm92aXNpb25pbmcgc29mdHdhcmUsIGV4YW1wbGVzCisJCW9mIHdoaWNoIGluY2x1ZGUsIGJ1dCBhcmUgbm90IGxpbWl0ZWQgdG8sIHAyIGFuZCB0aGUgRWNsaXBzZSBVcGRhdGUKKwkJTWFuYWdlciAoJnF1b3Q7UHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kmcXVvdDspIGZvciB0aGUgcHVycG9zZSBvZgorCQlhbGxvd2luZyB1c2VycyB0byBpbnN0YWxsIHNvZnR3YXJlLCBkb2N1bWVudGF0aW9uLCBpbmZvcm1hdGlvbiBhbmQvb3IKKwkJb3RoZXIgbWF0ZXJpYWxzIChjb2xsZWN0aXZlbHkgJnF1b3Q7SW5zdGFsbGFibGUgU29mdHdhcmUmcXVvdDspLiBUaGlzCisJCWNhcGFiaWxpdHkgaXMgcHJvdmlkZWQgd2l0aCB0aGUgaW50ZW50IG9mIGFsbG93aW5nIHN1Y2ggdXNlcnMgdG8KKwkJaW5zdGFsbCwgZXh0ZW5kIGFuZCB1cGRhdGUgRWNsaXBzZS1iYXNlZCBwcm9kdWN0cy4gSW5mb3JtYXRpb24gYWJvdXQKKwkJcGFja2FnaW5nIEluc3RhbGxhYmxlIFNvZnR3YXJlIGlzIGF2YWlsYWJsZSBhdCA8YQorCQkJaHJlZj0iaHR0cDovL2VjbGlwc2Uub3JnL2VxdWlub3gvcDIvcmVwb3NpdG9yeV9wYWNrYWdpbmcuaHRtbCI+aHR0cDovL2VjbGlwc2Uub3JnL2VxdWlub3gvcDIvcmVwb3NpdG9yeV9wYWNrYWdpbmcuaHRtbDwvYT4KKwkJKCZxdW90O1NwZWNpZmljYXRpb24mcXVvdDspLgorCTwvcD4KIAotPHA+WW91IG1heSB1c2UgUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kgdG8gYWxsb3cgb3RoZXIgcGFydGllcyB0byBpbnN0YWxsCi0gSW5zdGFsbGFibGUgU29mdHdhcmUuIFlvdSBzaGFsbCBiZSByZXNwb25zaWJsZSBmb3IgZW5hYmxpbmcgdGhlCi0gICBhcHBsaWNhYmxlIGxpY2Vuc2UgYWdyZWVtZW50cyByZWxhdGluZyB0byB0aGUgSW5zdGFsbGFibGUgU29mdHdhcmUgdG8KLSBiZSBwcmVzZW50ZWQgdG8sIGFuZCBhY2NlcHRlZCBieSwgdGhlIHVzZXJzIG9mIHRoZSBQcm92aXNpb25pbmcgCi1UZWNobm9sb2d5Ci0gICBpbiBhY2NvcmRhbmNlIHdpdGggdGhlIFNwZWNpZmljYXRpb24uIEJ5IHVzaW5nIFByb3Zpc2lvbmluZyAKLVRlY2hub2xvZ3kgaW4gc3VjaCBhIG1hbm5lciBhbmQgbWFraW5nIGl0IGF2YWlsYWJsZSBpbiBhY2NvcmRhbmNlIHdpdGggCi10aGUKLSAgIFNwZWNpZmljYXRpb24sIHlvdSBmdXJ0aGVyIGFja25vd2xlZGdlIHlvdXIgYWdyZWVtZW50IHRvLCBhbmQgdGhlIAotYWNxdWlzaXRpb24gb2YgYWxsIG5lY2Vzc2FyeSByaWdodHMgdG8gcGVybWl0IHRoZSBmb2xsb3dpbmc6PC9wPgorCTxwPllvdSBtYXkgdXNlIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5IHRvIGFsbG93IG90aGVyIHBhcnRpZXMgdG8KKwkJaW5zdGFsbCBJbnN0YWxsYWJsZSBTb2Z0d2FyZS4gWW91IHNoYWxsIGJlIHJlc3BvbnNpYmxlIGZvciBlbmFibGluZworCQl0aGUgYXBwbGljYWJsZSBsaWNlbnNlIGFncmVlbWVudHMgcmVsYXRpbmcgdG8gdGhlIEluc3RhbGxhYmxlIFNvZnR3YXJlCisJCXRvIGJlIHByZXNlbnRlZCB0bywgYW5kIGFjY2VwdGVkIGJ5LCB0aGUgdXNlcnMgb2YgdGhlIFByb3Zpc2lvbmluZworCQlUZWNobm9sb2d5IGluIGFjY29yZGFuY2Ugd2l0aCB0aGUgU3BlY2lmaWNhdGlvbi4gQnkgdXNpbmcgUHJvdmlzaW9uaW5nCisJCVRlY2hub2xvZ3kgaW4gc3VjaCBhIG1hbm5lciBhbmQgbWFraW5nIGl0IGF2YWlsYWJsZSBpbiBhY2NvcmRhbmNlIHdpdGgKKwkJdGhlIFNwZWNpZmljYXRpb24sIHlvdSBmdXJ0aGVyIGFja25vd2xlZGdlIHlvdXIgYWdyZWVtZW50IHRvLCBhbmQgdGhlCisJCWFjcXVpc2l0aW9uIG9mIGFsbCBuZWNlc3NhcnkgcmlnaHRzIHRvIHBlcm1pdCB0aGUgZm9sbG93aW5nOjwvcD4KIAotPG9sPgotICAgICAgIDxsaT5BIHNlcmllcyBvZiBhY3Rpb25zIG1heSBvY2N1ciAoIlByb3Zpc2lvbmluZyBQcm9jZXNzIikgaW4gCi13aGljaCBhIHVzZXIgbWF5IGV4ZWN1dGUgdGhlIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5Ci0gICAgICAgb24gYSBtYWNoaW5lICgiVGFyZ2V0IE1hY2hpbmUiKSB3aXRoIHRoZSBpbnRlbnQgb2YgaW5zdGFsbGluZywgCi1leHRlbmRpbmcgb3IgdXBkYXRpbmcgdGhlIGZ1bmN0aW9uYWxpdHkgb2YgYW4gRWNsaXBzZS1iYXNlZAotICAgICAgIHByb2R1Y3QuPC9saT4KLSAgICAgICA8bGk+RHVyaW5nIHRoZSBQcm92aXNpb25pbmcgUHJvY2VzcywgdGhlIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5IAotbWF5IGNhdXNlIHRoaXJkIHBhcnR5IEluc3RhbGxhYmxlIFNvZnR3YXJlIG9yIGEgcG9ydGlvbiB0aGVyZW9mIHRvIGJlCi0gICAgICAgYWNjZXNzZWQgYW5kIGNvcGllZCB0byB0aGUgVGFyZ2V0IE1hY2hpbmUuPC9saT4KLSAgICAgICA8bGk+UHVyc3VhbnQgdG8gdGhlIFNwZWNpZmljYXRpb24sIHlvdSB3aWxsIHByb3ZpZGUgdG8gdGhlIHVzZXIgCi10aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgdGhhdCBnb3Zlcm4gdGhlIHVzZSBvZiB0aGUgSW5zdGFsbGFibGUKLSAgICAgICBTb2Z0d2FyZSAoIkluc3RhbGxhYmxlIFNvZnR3YXJlIEFncmVlbWVudCIpIGFuZCBzdWNoIEluc3RhbGxhYmxlIAotU29mdHdhcmUgQWdyZWVtZW50IHNoYWxsIGJlIGFjY2Vzc2VkIGZyb20gdGhlIFRhcmdldAotICAgICAgIE1hY2hpbmUgaW4gYWNjb3JkYW5jZSB3aXRoIHRoZSBTcGVjaWZpY2F0aW9uLiBTdWNoIEluc3RhbGxhYmxlIAotU29mdHdhcmUgQWdyZWVtZW50IG11c3QgaW5mb3JtIHRoZSB1c2VyIG9mIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyB0aGF0Ci0gZ292ZXJuCi0gICAgICAgdGhlIEluc3RhbGxhYmxlIFNvZnR3YXJlIGFuZCBtdXN0IHNvbGljaXQgYWNjZXB0YW5jZSBieSB0aGUgZW5kIAotdXNlciBpbiB0aGUgbWFubmVyIHByZXNjcmliZWQgaW4gc3VjaCBJbnN0YWxsYWJsZSBTb2Z0d2FyZSBBZ3JlZW1lbnQuIAotVXBvbiBzdWNoCi0gICAgICAgaW5kaWNhdGlvbiBvZiBhZ3JlZW1lbnQgYnkgdGhlIHVzZXIsIHRoZSBwcm92aXNpb25pbmcgVGVjaG5vbG9neSAKLXdpbGwgY29tcGxldGUgaW5zdGFsbGF0aW9uIG9mIHRoZSBJbnN0YWxsYWJsZSBTb2Z0d2FyZS48L2xpPgotPC9vbD4KKwk8b2w+CisJCTxsaT5BIHNlcmllcyBvZiBhY3Rpb25zIG1heSBvY2N1ciAoJnF1b3Q7UHJvdmlzaW9uaW5nCisJCQlQcm9jZXNzJnF1b3Q7KSBpbiB3aGljaCBhIHVzZXIgbWF5IGV4ZWN1dGUgdGhlIFByb3Zpc2lvbmluZworCQkJVGVjaG5vbG9neSBvbiBhIG1hY2hpbmUgKCZxdW90O1RhcmdldCBNYWNoaW5lJnF1b3Q7KSB3aXRoIHRoZSBpbnRlbnQKKwkJCW9mIGluc3RhbGxpbmcsIGV4dGVuZGluZyBvciB1cGRhdGluZyB0aGUgZnVuY3Rpb25hbGl0eSBvZiBhbgorCQkJRWNsaXBzZS1iYXNlZCBwcm9kdWN0LjwvbGk+CisJCTxsaT5EdXJpbmcgdGhlIFByb3Zpc2lvbmluZyBQcm9jZXNzLCB0aGUgUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kKKwkJCW1heSBjYXVzZSB0aGlyZCBwYXJ0eSBJbnN0YWxsYWJsZSBTb2Z0d2FyZSBvciBhIHBvcnRpb24gdGhlcmVvZiB0byBiZQorCQkJYWNjZXNzZWQgYW5kIGNvcGllZCB0byB0aGUgVGFyZ2V0IE1hY2hpbmUuPC9saT4KKwkJPGxpPlB1cnN1YW50IHRvIHRoZSBTcGVjaWZpY2F0aW9uLCB5b3Ugd2lsbCBwcm92aWRlIHRvIHRoZSB1c2VyCisJCQl0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgdGhhdCBnb3Zlcm4gdGhlIHVzZSBvZiB0aGUgSW5zdGFsbGFibGUKKwkJCVNvZnR3YXJlICgmcXVvdDtJbnN0YWxsYWJsZSBTb2Z0d2FyZSBBZ3JlZW1lbnQmcXVvdDspIGFuZCBzdWNoCisJCQlJbnN0YWxsYWJsZSBTb2Z0d2FyZSBBZ3JlZW1lbnQgc2hhbGwgYmUgYWNjZXNzZWQgZnJvbSB0aGUgVGFyZ2V0CisJCQlNYWNoaW5lIGluIGFjY29yZGFuY2Ugd2l0aCB0aGUgU3BlY2lmaWNhdGlvbi4gU3VjaCBJbnN0YWxsYWJsZQorCQkJU29mdHdhcmUgQWdyZWVtZW50IG11c3QgaW5mb3JtIHRoZSB1c2VyIG9mIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucworCQkJdGhhdCBnb3Zlcm4gdGhlIEluc3RhbGxhYmxlIFNvZnR3YXJlIGFuZCBtdXN0IHNvbGljaXQgYWNjZXB0YW5jZSBieQorCQkJdGhlIGVuZCB1c2VyIGluIHRoZSBtYW5uZXIgcHJlc2NyaWJlZCBpbiBzdWNoIEluc3RhbGxhYmxlIFNvZnR3YXJlCisJCQlBZ3JlZW1lbnQuIFVwb24gc3VjaCBpbmRpY2F0aW9uIG9mIGFncmVlbWVudCBieSB0aGUgdXNlciwgdGhlCisJCQlwcm92aXNpb25pbmcgVGVjaG5vbG9neSB3aWxsIGNvbXBsZXRlIGluc3RhbGxhdGlvbiBvZiB0aGUgSW5zdGFsbGFibGUKKwkJCVNvZnR3YXJlLjwvbGk+CisJPC9vbD4KIAotPGgzPkNyeXB0b2dyYXBoeTwvaDM+CisJPGgzPkNyeXB0b2dyYXBoeTwvaDM+CiAKLTxwPkNvbnRlbnQgbWF5IGNvbnRhaW4gZW5jcnlwdGlvbiBzb2Z0d2FyZS4gVGhlIGNvdW50cnkgaW4gd2hpY2ggeW91IGFyZQotIGN1cnJlbnRseSBtYXkgaGF2ZSByZXN0cmljdGlvbnMgb24gdGhlIGltcG9ydCwgcG9zc2Vzc2lvbiwgYW5kIHVzZSwgCi1hbmQvb3IgcmUtZXhwb3J0IHRvCi0gICBhbm90aGVyIGNvdW50cnksIG9mIGVuY3J5cHRpb24gc29mdHdhcmUuIEJFRk9SRSB1c2luZyBhbnkgZW5jcnlwdGlvbiAKLXNvZnR3YXJlLCBwbGVhc2UgY2hlY2sgdGhlIGNvdW50cnkncyBsYXdzLCByZWd1bGF0aW9ucyBhbmQgcG9saWNpZXMgCi1jb25jZXJuaW5nIHRoZSBpbXBvcnQsCi0gICBwb3NzZXNzaW9uLCBvciB1c2UsIGFuZCByZS1leHBvcnQgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgdG8gc2VlIGlmIAotdGhpcyBpcyBwZXJtaXR0ZWQuPC9wPgorCTxwPkNvbnRlbnQgbWF5IGNvbnRhaW4gZW5jcnlwdGlvbiBzb2Z0d2FyZS4gVGhlIGNvdW50cnkgaW4gd2hpY2gKKwkJeW91IGFyZSBjdXJyZW50bHkgbWF5IGhhdmUgcmVzdHJpY3Rpb25zIG9uIHRoZSBpbXBvcnQsIHBvc3Nlc3Npb24sIGFuZAorCQl1c2UsIGFuZC9vciByZS1leHBvcnQgdG8gYW5vdGhlciBjb3VudHJ5LCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLgorCQlCRUZPUkUgdXNpbmcgYW55IGVuY3J5cHRpb24gc29mdHdhcmUsIHBsZWFzZSBjaGVjayB0aGUgY291bnRyeSdzIGxhd3MsCisJCXJlZ3VsYXRpb25zIGFuZCBwb2xpY2llcyBjb25jZXJuaW5nIHRoZSBpbXBvcnQsIHBvc3Nlc3Npb24sIG9yIHVzZSwKKwkJYW5kIHJlLWV4cG9ydCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLCB0byBzZWUgaWYgdGhpcyBpcyBwZXJtaXR0ZWQuPC9wPgogCi08cD48c21hbGw+SmF2YSBhbmQgYWxsIEphdmEtYmFzZWQgdHJhZGVtYXJrcyBhcmUgdHJhZGVtYXJrcyBvZiBPcmFjbGUgQ29ycG9yYXRpb24gaW4gdGhlIFVuaXRlZCBTdGF0ZXMsIG90aGVyIGNvdW50cmllcywgb3IgYm90aC48L3NtYWxsPjwvcD4KLQotCi08L2JvZHk+PC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKKwk8cD4KKwkJPHNtYWxsPkphdmEgYW5kIGFsbCBKYXZhLWJhc2VkIHRyYWRlbWFya3MgYXJlIHRyYWRlbWFya3Mgb2YKKwkJCU9yYWNsZSBDb3Jwb3JhdGlvbiBpbiB0aGUgVW5pdGVkIFN0YXRlcywgb3RoZXIgY291bnRyaWVzLCBvciBib3RoLjwvc21hbGw+CisJPC9wPgorPC9ib2R5PgorPC9odG1sPgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5kYXRhaW50ZXJjaGFuZ2UuY29tbW9uL3BvbS54bWwgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmRhdGFpbnRlcmNoYW5nZS5jb21tb24vcG9tLnhtbAppbmRleCBlNjVkNjFjLi43ODA5MGIzIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmRhdGFpbnRlcmNoYW5nZS5jb21tb24vcG9tLnhtbAorKysgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmRhdGFpbnRlcmNoYW5nZS5jb21tb24vcG9tLnhtbApAQCAtMiw5ICsyLDExIEBACiA8IS0tIz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgogPCEtLSMgQ29weXJpZ2h0IChjKSAyMDExLCAyMDE2IC0gTG9ldHogR21iSCZDby5LRyAoNjkxMTUgSGVpZGVsYmVyZywgR2VybWFueSkgLS0+CiA8IS0tIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIC0tPgotPCEtLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIC0tPgorPCEtLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSAyLjAgIC0tPgogPCEtLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgLS0+Ci08IS0tIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCAtLT4KKzwhLS0jIGh0dHBzOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAvICAgIC0tPgorPCEtLSMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+Cis8IS0tIyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCAgICAgICAgICAtLT4KIDwhLS0jIC0tPgogPCEtLSMgQ29udHJpYnV0b3JzOiAtLT4KIDwhLS0jICAgICBDaHJpc3RvcGhlIExvZXR6IChMb2V0eiBHbWJIJkNvLktHKSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbiAtLT4KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLm9zYnAueHRleHQuZGF0YWludGVyY2hhbmdlLmNvbW1vbi9zcmMvb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9kYXRhaW50ZXJjaGFuZ2UvY29tbW9uL1dvcmtlclRocmVhZFJ1bm5hYmxlLmphdmEgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmRhdGFpbnRlcmNoYW5nZS5jb21tb24vc3JjL29yZy9lY2xpcHNlL29zYnAveHRleHQvZGF0YWludGVyY2hhbmdlL2NvbW1vbi9Xb3JrZXJUaHJlYWRSdW5uYWJsZS5qYXZhCmluZGV4IDU4OGMyNjIuLmNkNDBjOGYgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLm9zYnAueHRleHQuZGF0YWludGVyY2hhbmdlLmNvbW1vbi9zcmMvb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9kYXRhaW50ZXJjaGFuZ2UvY29tbW9uL1dvcmtlclRocmVhZFJ1bm5hYmxlLmphdmEKKysrIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5kYXRhaW50ZXJjaGFuZ2UuY29tbW9uL3NyYy9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2RhdGFpbnRlcmNoYW5nZS9jb21tb24vV29ya2VyVGhyZWFkUnVubmFibGUuamF2YQpAQCAtMyw5ICszLDExIEBACiAgKiAgQ29weXJpZ2h0IChjKSAyMDExLCAyMDE2IC0gTG9ldHogR21iSCZDby5LRyAoNjkxMTUgSGVpZGVsYmVyZywgR2VybWFueSkgCiAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAqICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzICAgICAgICAgICAKLSAqICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgICAgICAgCisgKiAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSAyLjAgICAgICAgIAogICogIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0ICAgICAgICAgICAgICAgICAgCi0gKiAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAqICBodHRwczovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAqICBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgKiAgQ29udHJpYnV0b3JzOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICogCSAgIENocmlzdG9waGUgTG9ldHogKExvZXR6IEdtYkgmQ28uS0cpIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgpAQCAtMTMsNiArMTUsMTUgQEAKICAqLwogcGFja2FnZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmRhdGFpbnRlcmNoYW5nZS5jb21tb247CiAKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEubmlvLmZpbGUuRmlsZXM7CitpbXBvcnQgamF2YS5uaW8uZmlsZS5QYXRoOworCitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC5jb3JlLmFwaS5wZXJzaXN0ZW5jZS5JUGVyc2lzdGVuY2VTZXJ2aWNlOworaW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAuZGF0YWludGVyY2hhbmdlLmFwaS5JRGF0YUludGVyY2hhbmdlRXhlY3V0aW9uRXZlbnQ7CitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC5kYXRhaW50ZXJjaGFuZ2UuYXBpLklEYXRhSW50ZXJjaGFuZ2VFeGVjdXRpb25FdmVudExpc3RlbmVyOworaW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAucnVudGltZS5jb21tb24uZXZlbnQuSUV2ZW50RGlzcGF0Y2hlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnVpLmFwaS5jdXN0b21maWVsZHMuSUJsb2JTZXJ2aWNlOwogaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXI7CiBpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlckZhY3Rvcnk7CiAKQEAgLTIwLDE0ICszMSw2IEBACiBpbXBvcnQgY29tLnZhYWRpbi51aS5Qcm9ncmVzc0JhcjsKIGltcG9ydCBjb20udmFhZGluLnVpLlVJOwogCi1pbXBvcnQgb3JnLmVjbGlwc2Uub3NicC5jb3JlLmFwaS5wZXJzaXN0ZW5jZS5JUGVyc2lzdGVuY2VTZXJ2aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAuZGF0YWludGVyY2hhbmdlLmFwaS5JRGF0YUludGVyY2hhbmdlRXhlY3V0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NicC5kYXRhaW50ZXJjaGFuZ2UuYXBpLklEYXRhSW50ZXJjaGFuZ2VFeGVjdXRpb25FdmVudExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAucnVudGltZS5jb21tb24uZXZlbnQuRXZlbnREaXNwYXRjaGVyRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NicC5ydW50aW1lLmNvbW1vbi5ldmVudC5FdmVudERpc3BhdGNoZXJFdmVudC5FdmVudERpc3BhdGNoZXJDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAucnVudGltZS5jb21tb24uZXZlbnQuSUV2ZW50RGlzcGF0Y2hlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnVpLmFwaS5jdXN0b21maWVsZHMuSUJsb2JTZXJ2aWNlOwotCiBwdWJsaWMgYWJzdHJhY3QgY2xhc3MgV29ya2VyVGhyZWFkUnVubmFibGUgaW1wbGVtZW50cyBSdW5uYWJsZSwgSURhdGFJbnRlcmNoYW5nZUV4ZWN1dGlvbkV2ZW50TGlzdGVuZXIgewogCXN0YXRpYyBmaW5hbCBMb2dnZXIgbG9nID0gTG9nZ2VyRmFjdG9yeS5nZXRMb2dnZXIoV29ya2VyVGhyZWFkUnVubmFibGUuY2xhc3MpOwogCXByaXZhdGUgU3RyaW5nIG5hbWUgPSBudWxsOwpAQCAtNDcsNiArNTAsOSBAQAogCXByaXZhdGUgRGlyZWN0aW9uIGRpcmVjdGlvbiA9IERpcmVjdGlvbi5JTVBPUlQ7CiAJcHJpdmF0ZSBJQmxvYlNlcnZpY2UgYmxvYlNlcnZpY2U7CiAJCisJcHJpdmF0ZSBib29sZWFuIGRlbGV0ZUZpbGVBZnRlckltcG9ydD1mYWxzZTsKKwlwcml2YXRlIGJvb2xlYW4gZmFpbGVkRXhlY3V0aW9uID0gZmFsc2U7CisJCiAJcHVibGljIFdvcmtlclRocmVhZFJ1bm5hYmxlKCkgewogCQlwcm9ncmVzc0JhckFyZWEgPSBuZXcgSG9yaXpvbnRhbExheW91dCgpOwogCQlwcm9ncmVzc0JhciA9IG5ldyBQcm9ncmVzc0JhcigpOwpAQCAtMTczLDQgKzE3OSwzNiBAQAogCQkJfQogCQl9CiAJfQorCisJcHVibGljIGJvb2xlYW4gaXNEZWxldGVGaWxlQWZ0ZXJJbXBvcnQoKSB7CisJCXJldHVybiBkZWxldGVGaWxlQWZ0ZXJJbXBvcnQ7CisJfQorCQorCXB1YmxpYyB2b2lkIHNldERlbGV0ZUZpbGVBZnRlckltcG9ydChib29sZWFuIGRlbGV0ZUZpbGVBZnRlckltcG9ydCkgeworCQl0aGlzLmRlbGV0ZUZpbGVBZnRlckltcG9ydCA9IGRlbGV0ZUZpbGVBZnRlckltcG9ydDsKKwl9CisJCisJLyoqCisJICogTWFrZSBzdXJlIHRoYXQgdGhlIGdpdmVuIGZpbGUgaXMgZGVsZXRlZC4KKwkgKi8KKwlwdWJsaWMgdm9pZCBkZWxldGVGaWxlKGZpbmFsIFBhdGggZmlsZSkgeworCQl0cnkgeworCQkJaWYoRmlsZXMuZGVsZXRlSWZFeGlzdHMoZmlsZSkpeworCQkJCWxvZy5kZWJ1ZygiRmlsZTogIiArIGZpbGUgKyAiIHN1Y2Nlc3NmdWx5IHJlbW92ZWQuIik7CQkJCQorCQkJfQorCQkJZWxzZXsKKwkJCQlsb2cuZGVidWcoIkZpbGU6ICIgKyBmaWxlICsgIiBkb2Vzbid0IGV4aXN0IGFuZCBjb3VsZCBub3QgYmUgZGVsZXRlZC4iKTsJCQkJCQkJCQorCQkJfQorCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisJCQlsb2cuZXJyb3IoIkZpbGU6ICIgKyBmaWxlICsgIiBjb3VsZCBub3QgYmUgZGVsZXRlZC5cbiIgKyBlLmdldE1lc3NhZ2UoKSk7CisJCX0KKwl9CisKKwlwdWJsaWMgYm9vbGVhbiBoYXNFeGVjdXRpb25GYWlsZWQoKSB7CisJCXJldHVybiBmYWlsZWRFeGVjdXRpb247CisJfQorCisJcHVibGljIHZvaWQgc2V0RXhlY3V0aW9uRmFpbGVkKGJvb2xlYW4gZmFpbGVkRXhlY3V0aW9uKSB7CisJCXRoaXMuZmFpbGVkRXhlY3V0aW9uID0gZmFpbGVkRXhlY3V0aW9uOworCX0KIH0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLm9zYnAueHRleHQuZGF0YWludGVyY2hhbmdlLmZlYXR1cmUvTElDRU5TRS50eHQgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmRhdGFpbnRlcmNoYW5nZS5mZWF0dXJlL0xJQ0VOU0UudHh0CmluZGV4IGZmNDJhZDQuLmZjNTkzOGQgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLm9zYnAueHRleHQuZGF0YWludGVyY2hhbmdlLmZlYXR1cmUvTElDRU5TRS50eHQKKysrIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5kYXRhaW50ZXJjaGFuZ2UuZmVhdHVyZS9MSUNFTlNFLnR4dApAQCAtMSwxNjEgKzEsMTQwIEBACi1FY2xpcHNlIFB1YmxpYyBMaWNlbnNlIC12IDEuMAorRWNsaXBzZSBGb3VuZGF0aW9uIFNvZnR3YXJlIFVzZXIgQWdyZWVtZW50CiAKLVRIRSBBQ0NPTVBBTllJTkcgUFJPR1JBTSBJUyBQUk9WSURFRCBVTkRFUiBUSEUgVEVSTVMgT0YgVEhJUyBFQ0xJUFNFIFBVQkxJQyBMSUNFTlNFICgiQUdSRUVNRU5UIikuIEFOWSBVU0UsIFJFUFJPRFVDVElPTgotT1IgRElTVFJJQlVUSU9OIE9GIFRIRSBQUk9HUkFNIENPTlNUSVRVVEVTIFJFQ0lQSUVOVCdTIEFDQ0VQVEFOQ0UgT0YgVEhJUyBBR1JFRU1FTlQuCitOb3ZlbWJlciAyMiwgMjAxNwogCi0xLiBERUZJTklUSU9OUworVXNhZ2UgT2YgQ29udGVudAogCi0iQ29udHJpYnV0aW9uIiBtZWFuczoKK1RIRSBFQ0xJUFNFIEZPVU5EQVRJT04gTUFLRVMgQVZBSUxBQkxFIFNPRlRXQVJFLCBET0NVTUVOVEFUSU9OLCBJTkZPUk1BVElPTgorQU5EL09SIE9USEVSIE1BVEVSSUFMUyBGT1IgT1BFTiBTT1VSQ0UgUFJPSkVDVFMgKENPTExFQ1RJVkVMWSAiQ09OVEVOVCIpLiBVU0UgT0YKK1RIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTIEFHUkVFTUVOVCBBTkQvT1IgVEhFCitURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBMSUNFTlNFIEFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRAorQkVMT1cuIEJZIFVTSU5HIFRIRSBDT05URU5ULCBZT1UgQUdSRUUgVEhBVCBZT1VSIFVTRSBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRAorQlkgVEhJUyBBR1JFRU1FTlQgQU5EL09SIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFCitBR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuIElGIFlPVSBETyBOT1QgQUdSRUUgVE8gVEhFCitURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTIEFHUkVFTUVOVCBBTkQgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIEFOWQorQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVywgVEhFTiBZT1UKK01BWSBOT1QgVVNFIFRIRSBDT05URU5ULgogCi1hKSBpbiB0aGUgY2FzZSBvZiB0aGUgaW5pdGlhbCBDb250cmlidXRvciwgdGhlIGluaXRpYWwgY29kZSBhbmQgZG9jdW1lbnRhdGlvbiBkaXN0cmlidXRlZCB1bmRlciB0aGlzIEFncmVlbWVudCwgYW5kCitBcHBsaWNhYmxlIExpY2Vuc2VzCiAKLWIpIGluIHRoZSBjYXNlIG9mIGVhY2ggc3Vic2VxdWVudCBDb250cmlidXRvcjoKK1VubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkLCBhbGwgQ29udGVudCBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uCitpcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlCitWZXJzaW9uIDIuMCAoIkVQTCIpLiBBIGNvcHkgb2YgdGhlIEVQTCBpcyBwcm92aWRlZCB3aXRoIHRoaXMgQ29udGVudCBhbmQgaXMgYWxzbworYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4gRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsCisiUHJvZ3JhbSIgd2lsbCBtZWFuIHRoZSBDb250ZW50LgogCi1pKSBjaGFuZ2VzIHRvIHRoZSBQcm9ncmFtLCBhbmQKK0NvbnRlbnQgaW5jbHVkZXMsIGJ1dCBpcyBub3QgbGltaXRlZCB0bywgc291cmNlIGNvZGUsIG9iamVjdCBjb2RlLCBkb2N1bWVudGF0aW9uCithbmQgb3RoZXIgZmlsZXMgbWFpbnRhaW5lZCBpbiB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIHNvdXJjZSBjb2RlIHJlcG9zaXRvcnkKKygiUmVwb3NpdG9yeSIpIGluIHNvZnR3YXJlIG1vZHVsZXMgKCJNb2R1bGVzIikgYW5kIG1hZGUgYXZhaWxhYmxlIGFzCitkb3dubG9hZGFibGUgYXJjaGl2ZXMgKCJEb3dubG9hZHMiKS4KIAotaWkpIGFkZGl0aW9ucyB0byB0aGUgUHJvZ3JhbTsKKy0gICBDb250ZW50IG1heSBiZSBzdHJ1Y3R1cmVkIGFuZCBwYWNrYWdlZCBpbnRvIG1vZHVsZXMgdG8gZmFjaWxpdGF0ZQorICAgIGRlbGl2ZXJpbmcsIGV4dGVuZGluZywgYW5kIHVwZ3JhZGluZyB0aGUgQ29udGVudC4gVHlwaWNhbCBtb2R1bGVzIG1heQorICAgIGluY2x1ZGUgcGx1Zy1pbnMgKCJQbHVnLWlucyIpLCBwbHVnLWluIGZyYWdtZW50cyAoIkZyYWdtZW50cyIpLCBhbmQKKyAgICBmZWF0dXJlcyAoIkZlYXR1cmVzIikuCistICAgRWFjaCBQbHVnLWluIG9yIEZyYWdtZW50IG1heSBiZSBwYWNrYWdlZCBhcyBhIHN1Yi1kaXJlY3Rvcnkgb3IgSkFSCisgICAgKEphdmHihKIgQVJjaGl2ZSkgaW4gYSBkaXJlY3RvcnkgbmFtZWQgInBsdWdpbnMiLgorLSAgIEEgRmVhdHVyZSBpcyBhIGJ1bmRsZSBvZiBvbmUgb3IgbW9yZSBQbHVnLWlucyBhbmQvb3IgRnJhZ21lbnRzIGFuZAorICAgIGFzc29jaWF0ZWQgbWF0ZXJpYWwuIEVhY2ggRmVhdHVyZSBtYXkgYmUgcGFja2FnZWQgYXMgYSBzdWItZGlyZWN0b3J5IGluIGEKKyAgICBkaXJlY3RvcnkgbmFtZWQgImZlYXR1cmVzIi4gV2l0aGluIGEgRmVhdHVyZSwgZmlsZXMgbmFtZWQgImZlYXR1cmUueG1sIiBtYXkKKyAgICBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZiB0aGUgUGx1Zy1pbnMgYW5kL29yCisgICAgRnJhZ21lbnRzIGFzc29jaWF0ZWQgd2l0aCB0aGF0IEZlYXR1cmUuCistICAgRmVhdHVyZXMgbWF5IGFsc28gaW5jbHVkZSBvdGhlciBGZWF0dXJlcyAoIkluY2x1ZGVkIEZlYXR1cmVzIikuIFdpdGhpbiBhCisgICAgRmVhdHVyZSwgZmlsZXMgbmFtZWQgImZlYXR1cmUueG1sIiBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZAorICAgIHZlcnNpb24gbnVtYmVycyBvZiBJbmNsdWRlZCBGZWF0dXJlcy4KIAotd2hlcmUgc3VjaCBjaGFuZ2VzIGFuZC9vciBhZGRpdGlvbnMgdG8gdGhlIFByb2dyYW0gb3JpZ2luYXRlIGZyb20gYW5kIGFyZSBkaXN0cmlidXRlZCBieSB0aGF0IHBhcnRpY3VsYXIgQ29udHJpYnV0b3IuCi1BIENvbnRyaWJ1dGlvbiAnb3JpZ2luYXRlcycgZnJvbSBhIENvbnRyaWJ1dG9yIGlmIGl0IHdhcyBhZGRlZCB0byB0aGUgUHJvZ3JhbSBieSBzdWNoIENvbnRyaWJ1dG9yIGl0c2VsZiBvciBhbnlvbmUKLWFjdGluZyBvbiBzdWNoIENvbnRyaWJ1dG9yJ3MgYmVoYWxmLiBDb250cmlidXRpb25zIGRvIG5vdCBpbmNsdWRlIGFkZGl0aW9ucyB0byB0aGUgUHJvZ3JhbSB3aGljaDogKGkpIGFyZSBzZXBhcmF0ZQotbW9kdWxlcyBvZiBzb2Z0d2FyZSBkaXN0cmlidXRlZCBpbiBjb25qdW5jdGlvbiB3aXRoIHRoZSBQcm9ncmFtIHVuZGVyIHRoZWlyIG93biBsaWNlbnNlIGFncmVlbWVudCwgYW5kIChpaSkgYXJlIG5vdAotZGVyaXZhdGl2ZSB3b3JrcyBvZiB0aGUgUHJvZ3JhbS4KK1RoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBzaG91bGQgYmUgY29udGFpbmVkIGluCitmaWxlcyBuYW1lZCAiYWJvdXQuaHRtbCIgKCJBYm91dHMiKS4gVGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyBGZWF0dXJlcworYW5kIEluY2x1ZGVkIEZlYXR1cmVzIHNob3VsZCBiZSBjb250YWluZWQgaW4gZmlsZXMgbmFtZWQgImxpY2Vuc2UuaHRtbCIKKygiRmVhdHVyZSBMaWNlbnNlcyIpLiBBYm91dHMgYW5kIEZlYXR1cmUgTGljZW5zZXMgbWF5IGJlIGxvY2F0ZWQgaW4gYW55CitkaXJlY3Rvcnkgb2YgYSBEb3dubG9hZCBvciBNb2R1bGUgaW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGZvbGxvd2luZworbG9jYXRpb25zOgogCi0iQ29udHJpYnV0b3IiIG1lYW5zIGFueSBwZXJzb24gb3IgZW50aXR5IHRoYXQgZGlzdHJpYnV0ZXMgdGhlIFByb2dyYW0uCistICAgVGhlIHRvcC1sZXZlbCAocm9vdCkgZGlyZWN0b3J5CistICAgUGx1Zy1pbiBhbmQgRnJhZ21lbnQgZGlyZWN0b3JpZXMKKy0gICBJbnNpZGUgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBwYWNrYWdlZCBhcyBKQVJzCistICAgU3ViLWRpcmVjdG9yaWVzIG9mIHRoZSBkaXJlY3RvcnkgbmFtZWQgInNyYyIgb2YgY2VydGFpbiBQbHVnLWlucworLSAgIEZlYXR1cmUgZGlyZWN0b3JpZXMKIAotIkxpY2Vuc2VkIFBhdGVudHMgIiBtZWFuIHBhdGVudCBjbGFpbXMgbGljZW5zYWJsZSBieSBhIENvbnRyaWJ1dG9yIHdoaWNoIGFyZSBuZWNlc3NhcmlseSBpbmZyaW5nZWQgYnkgdGhlIHVzZSBvciBzYWxlIG9mCi1pdHMgQ29udHJpYnV0aW9uIGFsb25lIG9yIHdoZW4gY29tYmluZWQgd2l0aCB0aGUgUHJvZ3JhbS4KK05vdGU6IGlmIGEgRmVhdHVyZSBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIGlzIGluc3RhbGxlZCB1c2luZwordGhlIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5IChhcyBkZWZpbmVkIGJlbG93KSwgeW91IG11c3QgYWdyZWUgdG8gYSBsaWNlbnNlCisoIkZlYXR1cmUgVXBkYXRlIExpY2Vuc2UiKSBkdXJpbmcgdGhlIGluc3RhbGxhdGlvbiBwcm9jZXNzLiBJZiB0aGUgRmVhdHVyZQorY29udGFpbnMgSW5jbHVkZWQgRmVhdHVyZXMsIHRoZSBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIHNob3VsZCBlaXRoZXIgcHJvdmlkZSB5b3UKK3dpdGggdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyB0aGUgSW5jbHVkZWQgRmVhdHVyZXMgb3IgaW5mb3JtIHlvdQord2hlcmUgeW91IGNhbiBsb2NhdGUgdGhlbS4gRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgbWF5IGJlIGZvdW5kIGluIHRoZSAibGljZW5zZSIKK3Byb3BlcnR5IG9mIGZpbGVzIG5hbWVkICJmZWF0dXJlLnByb3BlcnRpZXMiIGZvdW5kIHdpdGhpbiBhIEZlYXR1cmUuIFN1Y2gKK0Fib3V0cywgRmVhdHVyZSBMaWNlbnNlcywgYW5kIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIGNvbnRhaW4gdGhlIHRlcm1zIGFuZAorY29uZGl0aW9ucyAob3IgcmVmZXJlbmNlcyB0byBzdWNoIHRlcm1zIGFuZCBjb25kaXRpb25zKSB0aGF0IGdvdmVybiB5b3VyIHVzZSBvZgordGhlIGFzc29jaWF0ZWQgQ29udGVudCBpbiB0aGF0IGRpcmVjdG9yeS4KIAotIlByb2dyYW0iIG1lYW5zIHRoZSBDb250cmlidXRpb25zIGRpc3RyaWJ1dGVkIGluIGFjY29yZGFuY2Ugd2l0aCB0aGlzIEFncmVlbWVudC4KK1RIRSBBQk9VVFMsIEZFQVRVUkUgTElDRU5TRVMsIEFORCBGRUFUVVJFIFVQREFURSBMSUNFTlNFUyBNQVkgUkVGRVIgVE8gVEhFIEVQTAorT1IgT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTLCBOT1RJQ0VTIE9SIFRFUk1TIEFORCBDT05ESVRJT05TLiBTT01FIE9GIFRIRVNFCitPVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMgTUFZIElOQ0xVREUgKEJVVCBBUkUgTk9UIExJTUlURUQgVE8pOgogCi0iUmVjaXBpZW50IiBtZWFucyBhbnlvbmUgd2hvIHJlY2VpdmVzIHRoZSBQcm9ncmFtIHVuZGVyIHRoaXMgQWdyZWVtZW50LCBpbmNsdWRpbmcgYWxsIENvbnRyaWJ1dG9ycy4KKy0gICBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wIChhdmFpbGFibGUgYXQKKyAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCkKKy0gICBFY2xpcHNlIERpc3RyaWJ1dGlvbiBMaWNlbnNlIFZlcnNpb24gMS4wIChhdmFpbGFibGUgYXQKKyAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xpY2Vuc2VzL2VkbC12MS4wLmh0bWwpCistICAgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wIChhdmFpbGFibGUgYXQKKyAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbCkKKy0gICBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSAxLjEgKGF2YWlsYWJsZSBhdAorICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFKQorLSAgIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDIuMCAoYXZhaWxhYmxlIGF0CisgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wKQorLSAgIE1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjEgKGF2YWlsYWJsZSBhdAorICAgIGh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBML01QTC0xLjEuaHRtbCkKIAotMi4gR1JBTlQgT0YgUklHSFRTCitJVCBJUyBZT1VSIE9CTElHQVRJT04gVE8gUkVBRCBBTkQgQUNDRVBUIEFMTCBTVUNIIFRFUk1TIEFORCBDT05ESVRJT05TIFBSSU9SIFRPCitVU0UgT0YgVEhFIENPTlRFTlQuIElmIG5vIEFib3V0LCBGZWF0dXJlIExpY2Vuc2UsIG9yIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2UgaXMKK3Byb3ZpZGVkLCBwbGVhc2UgY29udGFjdCB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIHRvIGRldGVybWluZSB3aGF0IHRlcm1zIGFuZAorY29uZGl0aW9ucyBnb3Zlcm4gdGhhdCBwYXJ0aWN1bGFyIENvbnRlbnQuCiAKLWEpIFN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoaXMgQWdyZWVtZW50LCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgUmVjaXBpZW50IGEgbm9uLWV4Y2x1c2l2ZSwgd29ybGR3aWRlLAotcm95YWx0eS1mcmVlIGNvcHlyaWdodCBsaWNlbnNlIHRvIHJlcHJvZHVjZSwgcHJlcGFyZSBkZXJpdmF0aXZlIHdvcmtzIG9mLCBwdWJsaWNseSBkaXNwbGF5LCBwdWJsaWNseSBwZXJmb3JtLCBkaXN0cmlidXRlCi1hbmQgc3VibGljZW5zZSB0aGUgQ29udHJpYnV0aW9uIG9mIHN1Y2ggQ29udHJpYnV0b3IsIGlmIGFueSwgYW5kIHN1Y2ggZGVyaXZhdGl2ZSB3b3JrcywgaW4gc291cmNlIGNvZGUgYW5kIG9iamVjdCBjb2RlCi1mb3JtLgorVXNlIG9mIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5CiAKLWIpIFN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoaXMgQWdyZWVtZW50LCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgUmVjaXBpZW50IGEgbm9uLWV4Y2x1c2l2ZSwgd29ybGR3aWRlLAotcm95YWx0eS1mcmVlIHBhdGVudCBsaWNlbnNlIHVuZGVyIExpY2Vuc2VkIFBhdGVudHMgdG8gbWFrZSwgdXNlLCBzZWxsLCBvZmZlciB0byBzZWxsLCBpbXBvcnQgYW5kIG90aGVyd2lzZSB0cmFuc2ZlciB0aGUKLUNvbnRyaWJ1dGlvbiBvZiBzdWNoIENvbnRyaWJ1dG9yLCBpZiBhbnksIGluIHNvdXJjZSBjb2RlIGFuZCBvYmplY3QgY29kZSBmb3JtLiBUaGlzIHBhdGVudCBsaWNlbnNlIHNoYWxsIGFwcGx5IHRvIHRoZQotY29tYmluYXRpb24gb2YgdGhlIENvbnRyaWJ1dGlvbiBhbmQgdGhlIFByb2dyYW0gaWYsIGF0IHRoZSB0aW1lIHRoZSBDb250cmlidXRpb24gaXMgYWRkZWQgYnkgdGhlIENvbnRyaWJ1dG9yLCBzdWNoCi1hZGRpdGlvbiBvZiB0aGUgQ29udHJpYnV0aW9uIGNhdXNlcyBzdWNoIGNvbWJpbmF0aW9uIHRvIGJlIGNvdmVyZWQgYnkgdGhlIExpY2Vuc2VkIFBhdGVudHMuIFRoZSBwYXRlbnQgbGljZW5zZSBzaGFsbCBub3QKLWFwcGx5IHRvIGFueSBvdGhlciBjb21iaW5hdGlvbnMgd2hpY2ggaW5jbHVkZSB0aGUgQ29udHJpYnV0aW9uLiBObyBoYXJkd2FyZSBwZXIgc2UgaXMgbGljZW5zZWQgaGVyZXVuZGVyLgorVGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYWtlcyBhdmFpbGFibGUgcHJvdmlzaW9uaW5nIHNvZnR3YXJlLCBleGFtcGxlcyBvZiB3aGljaAoraW5jbHVkZSwgYnV0IGFyZSBub3QgbGltaXRlZCB0bywgcDIgYW5kIHRoZSBFY2xpcHNlIFVwZGF0ZSBNYW5hZ2VyCisoIlByb3Zpc2lvbmluZyBUZWNobm9sb2d5IikgZm9yIHRoZSBwdXJwb3NlIG9mIGFsbG93aW5nIHVzZXJzIHRvIGluc3RhbGwKK3NvZnR3YXJlLCBkb2N1bWVudGF0aW9uLCBpbmZvcm1hdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIChjb2xsZWN0aXZlbHkKKyJJbnN0YWxsYWJsZSBTb2Z0d2FyZSIpLiBUaGlzIGNhcGFiaWxpdHkgaXMgcHJvdmlkZWQgd2l0aCB0aGUgaW50ZW50IG9mIGFsbG93aW5nCitzdWNoIHVzZXJzIHRvIGluc3RhbGwsIGV4dGVuZCBhbmQgdXBkYXRlIEVjbGlwc2UtYmFzZWQgcHJvZHVjdHMuIEluZm9ybWF0aW9uCithYm91dCBwYWNrYWdpbmcgSW5zdGFsbGFibGUgU29mdHdhcmUgaXMgYXZhaWxhYmxlIGF0CitodHRwOi8vZWNsaXBzZS5vcmcvZXF1aW5veC9wMi9yZXBvc2l0b3J5X3BhY2thZ2luZy5odG1sICgiU3BlY2lmaWNhdGlvbiIpLgogCi1jKSBSZWNpcGllbnQgdW5kZXJzdGFuZHMgdGhhdCBhbHRob3VnaCBlYWNoIENvbnRyaWJ1dG9yIGdyYW50cyB0aGUgbGljZW5zZXMgdG8gaXRzIENvbnRyaWJ1dGlvbnMgc2V0IGZvcnRoIGhlcmVpbiwgbm8KLWFzc3VyYW5jZXMgYXJlIHByb3ZpZGVkIGJ5IGFueSBDb250cmlidXRvciB0aGF0IHRoZSBQcm9ncmFtIGRvZXMgbm90IGluZnJpbmdlIHRoZSBwYXRlbnQgb3Igb3RoZXIgaW50ZWxsZWN0dWFsIHByb3BlcnR5Ci1yaWdodHMgb2YgYW55IG90aGVyIGVudGl0eS4gRWFjaCBDb250cmlidXRvciBkaXNjbGFpbXMgYW55IGxpYWJpbGl0eSB0byBSZWNpcGllbnQgZm9yIGNsYWltcyBicm91Z2h0IGJ5IGFueSBvdGhlciBlbnRpdHkKLWJhc2VkIG9uIGluZnJpbmdlbWVudCBvZiBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIG9yIG90aGVyd2lzZS4gQXMgYSBjb25kaXRpb24gdG8gZXhlcmNpc2luZyB0aGUgcmlnaHRzIGFuZAotbGljZW5zZXMgZ3JhbnRlZCBoZXJldW5kZXIsIGVhY2ggUmVjaXBpZW50IGhlcmVieSBhc3N1bWVzIHNvbGUgcmVzcG9uc2liaWxpdHkgdG8gc2VjdXJlIGFueSBvdGhlciBpbnRlbGxlY3R1YWwgcHJvcGVydHkKLXJpZ2h0cyBuZWVkZWQsIGlmIGFueS4gRm9yIGV4YW1wbGUsIGlmIGEgdGhpcmQgcGFydHkgcGF0ZW50IGxpY2Vuc2UgaXMgcmVxdWlyZWQgdG8gYWxsb3cgUmVjaXBpZW50IHRvIGRpc3RyaWJ1dGUgdGhlCi1Qcm9ncmFtLCBpdCBpcyBSZWNpcGllbnQncyByZXNwb25zaWJpbGl0eSB0byBhY3F1aXJlIHRoYXQgbGljZW5zZSBiZWZvcmUgZGlzdHJpYnV0aW5nIHRoZSBQcm9ncmFtLgorWW91IG1heSB1c2UgUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kgdG8gYWxsb3cgb3RoZXIgcGFydGllcyB0byBpbnN0YWxsCitJbnN0YWxsYWJsZSBTb2Z0d2FyZS4gWW91IHNoYWxsIGJlIHJlc3BvbnNpYmxlIGZvciBlbmFibGluZyB0aGUgYXBwbGljYWJsZQorbGljZW5zZSBhZ3JlZW1lbnRzIHJlbGF0aW5nIHRvIHRoZSBJbnN0YWxsYWJsZSBTb2Z0d2FyZSB0byBiZSBwcmVzZW50ZWQgdG8sIGFuZAorYWNjZXB0ZWQgYnksIHRoZSB1c2VycyBvZiB0aGUgUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kgaW4gYWNjb3JkYW5jZSB3aXRoIHRoZQorU3BlY2lmaWNhdGlvbi4gQnkgdXNpbmcgUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kgaW4gc3VjaCBhIG1hbm5lciBhbmQgbWFraW5nIGl0CithdmFpbGFibGUgaW4gYWNjb3JkYW5jZSB3aXRoIHRoZSBTcGVjaWZpY2F0aW9uLCB5b3UgZnVydGhlciBhY2tub3dsZWRnZSB5b3VyCithZ3JlZW1lbnQgdG8sIGFuZCB0aGUgYWNxdWlzaXRpb24gb2YgYWxsIG5lY2Vzc2FyeSByaWdodHMgdG8gcGVybWl0IHRoZQorZm9sbG93aW5nOgogCi1kKSBFYWNoIENvbnRyaWJ1dG9yIHJlcHJlc2VudHMgdGhhdCB0byBpdHMga25vd2xlZGdlIGl0IGhhcyBzdWZmaWNpZW50IGNvcHlyaWdodCByaWdodHMgaW4gaXRzIENvbnRyaWJ1dGlvbiwgaWYgYW55LCB0bwotZ3JhbnQgdGhlIGNvcHlyaWdodCBsaWNlbnNlIHNldCBmb3J0aCBpbiB0aGlzIEFncmVlbWVudC4KKzEuICBBIHNlcmllcyBvZiBhY3Rpb25zIG1heSBvY2N1ciAoIlByb3Zpc2lvbmluZyBQcm9jZXNzIikgaW4gd2hpY2ggYSB1c2VyIG1heQorICAgIGV4ZWN1dGUgdGhlIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5IG9uIGEgbWFjaGluZSAoIlRhcmdldCBNYWNoaW5lIikgd2l0aCB0aGUKKyAgICBpbnRlbnQgb2YgaW5zdGFsbGluZywgZXh0ZW5kaW5nIG9yIHVwZGF0aW5nIHRoZSBmdW5jdGlvbmFsaXR5IG9mIGFuCisgICAgRWNsaXBzZS1iYXNlZCBwcm9kdWN0LgorMi4gIER1cmluZyB0aGUgUHJvdmlzaW9uaW5nIFByb2Nlc3MsIHRoZSBQcm92aXNpb25pbmcgVGVjaG5vbG9neSBtYXkgY2F1c2UgdGhpcmQKKyAgICBwYXJ0eSBJbnN0YWxsYWJsZSBTb2Z0d2FyZSBvciBhIHBvcnRpb24gdGhlcmVvZiB0byBiZSBhY2Nlc3NlZCBhbmQgY29waWVkIHRvCisgICAgdGhlIFRhcmdldCBNYWNoaW5lLgorMy4gIFB1cnN1YW50IHRvIHRoZSBTcGVjaWZpY2F0aW9uLCB5b3Ugd2lsbCBwcm92aWRlIHRvIHRoZSB1c2VyIHRoZSB0ZXJtcyBhbmQKKyAgICBjb25kaXRpb25zIHRoYXQgZ292ZXJuIHRoZSB1c2Ugb2YgdGhlIEluc3RhbGxhYmxlIFNvZnR3YXJlICgiSW5zdGFsbGFibGUKKyAgICBTb2Z0d2FyZSBBZ3JlZW1lbnQiKSBhbmQgc3VjaCBJbnN0YWxsYWJsZSBTb2Z0d2FyZSBBZ3JlZW1lbnQgc2hhbGwgYmUKKyAgICBhY2Nlc3NlZCBmcm9tIHRoZSBUYXJnZXQgTWFjaGluZSBpbiBhY2NvcmRhbmNlIHdpdGggdGhlIFNwZWNpZmljYXRpb24uIFN1Y2gKKyAgICBJbnN0YWxsYWJsZSBTb2Z0d2FyZSBBZ3JlZW1lbnQgbXVzdCBpbmZvcm0gdGhlIHVzZXIgb2YgdGhlIHRlcm1zIGFuZAorICAgIGNvbmRpdGlvbnMgdGhhdCBnb3Zlcm4gdGhlIEluc3RhbGxhYmxlIFNvZnR3YXJlIGFuZCBtdXN0IHNvbGljaXQgYWNjZXB0YW5jZQorICAgIGJ5IHRoZSBlbmQgdXNlciBpbiB0aGUgbWFubmVyIHByZXNjcmliZWQgaW4gc3VjaCBJbnN0YWxsYWJsZQorICAgIFNvZnR3YXJlIEFncmVlbWVudC4gVXBvbiBzdWNoIGluZGljYXRpb24gb2YgYWdyZWVtZW50IGJ5IHRoZSB1c2VyLCB0aGUKKyAgICBwcm92aXNpb25pbmcgVGVjaG5vbG9neSB3aWxsIGNvbXBsZXRlIGluc3RhbGxhdGlvbiBvZiB0aGUKKyAgICBJbnN0YWxsYWJsZSBTb2Z0d2FyZS4KIAotMy4gUkVRVUlSRU1FTlRTCitDcnlwdG9ncmFwaHkKIAotQSBDb250cmlidXRvciBtYXkgY2hvb3NlIHRvIGRpc3RyaWJ1dGUgdGhlIFByb2dyYW0gaW4gb2JqZWN0IGNvZGUgZm9ybSB1bmRlciBpdHMgb3duIGxpY2Vuc2UgYWdyZWVtZW50LCBwcm92aWRlZCB0aGF0OgorQ29udGVudCBtYXkgY29udGFpbiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBUaGUgY291bnRyeSBpbiB3aGljaCB5b3UgYXJlIGN1cnJlbnRseQorbWF5IGhhdmUgcmVzdHJpY3Rpb25zIG9uIHRoZSBpbXBvcnQsIHBvc3Nlc3Npb24sIGFuZCB1c2UsIGFuZC9vciByZS1leHBvcnQgdG8KK2Fub3RoZXIgY291bnRyeSwgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZS4gQkVGT1JFIHVzaW5nIGFueSBlbmNyeXB0aW9uIHNvZnR3YXJlLAorcGxlYXNlIGNoZWNrIHRoZSBjb3VudHJ5J3MgbGF3cywgcmVndWxhdGlvbnMgYW5kIHBvbGljaWVzIGNvbmNlcm5pbmcgdGhlIGltcG9ydCwKK3Bvc3Nlc3Npb24sIG9yIHVzZSwgYW5kIHJlLWV4cG9ydCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLCB0byBzZWUgaWYgdGhpcyBpcworcGVybWl0dGVkLgogCi1hKSBpdCBjb21wbGllcyB3aXRoIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGlzIEFncmVlbWVudDsgYW5kCi0KLWIpIGl0cyBsaWNlbnNlIGFncmVlbWVudDoKLQotaSkgZWZmZWN0aXZlbHkgZGlzY2xhaW1zIG9uIGJlaGFsZiBvZiBhbGwgQ29udHJpYnV0b3JzIGFsbCB3YXJyYW50aWVzIGFuZCBjb25kaXRpb25zLCBleHByZXNzIGFuZCBpbXBsaWVkLCBpbmNsdWRpbmcKLXdhcnJhbnRpZXMgb3IgY29uZGl0aW9ucyBvZiB0aXRsZSBhbmQgbm9uLWluZnJpbmdlbWVudCwgYW5kIGltcGxpZWQgd2FycmFudGllcyBvciBjb25kaXRpb25zIG9mIG1lcmNoYW50YWJpbGl0eSBhbmQKLWZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlOwotCi1paSkgZWZmZWN0aXZlbHkgZXhjbHVkZXMgb24gYmVoYWxmIG9mIGFsbCBDb250cmlidXRvcnMgYWxsIGxpYWJpbGl0eSBmb3IgZGFtYWdlcywgaW5jbHVkaW5nIGRpcmVjdCwgaW5kaXJlY3QsIHNwZWNpYWwsCi1pbmNpZGVudGFsIGFuZCBjb25zZXF1ZW50aWFsIGRhbWFnZXMsIHN1Y2ggYXMgbG9zdCBwcm9maXRzOwotCi1paWkpIHN0YXRlcyB0aGF0IGFueSBwcm92aXNpb25zIHdoaWNoIGRpZmZlciBmcm9tIHRoaXMgQWdyZWVtZW50IGFyZSBvZmZlcmVkIGJ5IHRoYXQgQ29udHJpYnV0b3IgYWxvbmUgYW5kIG5vdCBieSBhbnkKLW90aGVyIHBhcnR5OyBhbmQKLQotaXYpIHN0YXRlcyB0aGF0IHNvdXJjZSBjb2RlIGZvciB0aGUgUHJvZ3JhbSBpcyBhdmFpbGFibGUgZnJvbSBzdWNoIENvbnRyaWJ1dG9yLCBhbmQgaW5mb3JtcyBsaWNlbnNlZXMgaG93IHRvIG9idGFpbiBpdAotaW4gYSByZWFzb25hYmxlIG1hbm5lciBvbiBvciB0aHJvdWdoIGEgbWVkaXVtIGN1c3RvbWFyaWx5IHVzZWQgZm9yIHNvZnR3YXJlIGV4Y2hhbmdlLgotCi1XaGVuIHRoZSBQcm9ncmFtIGlzIG1hZGUgYXZhaWxhYmxlIGluIHNvdXJjZSBjb2RlIGZvcm06Ci0KLWEpIGl0IG11c3QgYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhpcyBBZ3JlZW1lbnQ7IGFuZAotCi1iKSBhIGNvcHkgb2YgdGhpcyBBZ3JlZW1lbnQgbXVzdCBiZSBpbmNsdWRlZCB3aXRoIGVhY2ggY29weSBvZiB0aGUgUHJvZ3JhbS4KLQotQ29udHJpYnV0b3JzIG1heSBub3QgcmVtb3ZlIG9yIGFsdGVyIGFueSBjb3B5cmlnaHQgbm90aWNlcyBjb250YWluZWQgd2l0aGluIHRoZSBQcm9ncmFtLgotCi1FYWNoIENvbnRyaWJ1dG9yIG11c3QgaWRlbnRpZnkgaXRzZWxmIGFzIHRoZSBvcmlnaW5hdG9yIG9mIGl0cyBDb250cmlidXRpb24sIGlmIGFueSwgaW4gYSBtYW5uZXIgdGhhdCByZWFzb25hYmx5IGFsbG93cwotc3Vic2VxdWVudCBSZWNpcGllbnRzIHRvIGlkZW50aWZ5IHRoZSBvcmlnaW5hdG9yIG9mIHRoZSBDb250cmlidXRpb24uCi0KLTQuIENPTU1FUkNJQUwgRElTVFJJQlVUSU9OCi0KLUNvbW1lcmNpYWwgZGlzdHJpYnV0b3JzIG9mIHNvZnR3YXJlIG1heSBhY2NlcHQgY2VydGFpbiByZXNwb25zaWJpbGl0aWVzIHdpdGggcmVzcGVjdCB0byBlbmQgdXNlcnMsIGJ1c2luZXNzIHBhcnRuZXJzIGFuZAotdGhlIGxpa2UuIFdoaWxlIHRoaXMgbGljZW5zZSBpcyBpbnRlbmRlZCB0byBmYWNpbGl0YXRlIHRoZSBjb21tZXJjaWFsIHVzZSBvZiB0aGUgUHJvZ3JhbSwgdGhlIENvbnRyaWJ1dG9yIHdobyBpbmNsdWRlcwotdGhlIFByb2dyYW0gaW4gYSBjb21tZXJjaWFsIHByb2R1Y3Qgb2ZmZXJpbmcgc2hvdWxkIGRvIHNvIGluIGEgbWFubmVyIHdoaWNoIGRvZXMgbm90IGNyZWF0ZSBwb3RlbnRpYWwgbGlhYmlsaXR5IGZvcgotb3RoZXIgQ29udHJpYnV0b3JzLiBUaGVyZWZvcmUsIGlmIGEgQ29udHJpYnV0b3IgaW5jbHVkZXMgdGhlIFByb2dyYW0gaW4gYSBjb21tZXJjaWFsIHByb2R1Y3Qgb2ZmZXJpbmcsIHN1Y2ggQ29udHJpYnV0b3IKLSgiQ29tbWVyY2lhbCBDb250cmlidXRvciIpIGhlcmVieSBhZ3JlZXMgdG8gZGVmZW5kIGFuZCBpbmRlbW5pZnkgZXZlcnkgb3RoZXIgQ29udHJpYnV0b3IgKCJJbmRlbW5pZmllZCBDb250cmlidXRvciIpCi1hZ2FpbnN0IGFueSBsb3NzZXMsIGRhbWFnZXMgYW5kIGNvc3RzIChjb2xsZWN0aXZlbHkgIkxvc3NlcyIpIGFyaXNpbmcgZnJvbSBjbGFpbXMsIGxhd3N1aXRzIGFuZCBvdGhlciBsZWdhbCBhY3Rpb25zCi1icm91Z2h0IGJ5IGEgdGhpcmQgcGFydHkgYWdhaW5zdCB0aGUgSW5kZW1uaWZpZWQgQ29udHJpYnV0b3IgdG8gdGhlIGV4dGVudCBjYXVzZWQgYnkgdGhlIGFjdHMgb3Igb21pc3Npb25zIG9mIHN1Y2gKLUNvbW1lcmNpYWwgQ29udHJpYnV0b3IgaW4gY29ubmVjdGlvbiB3aXRoIGl0cyBkaXN0cmlidXRpb24gb2YgdGhlIFByb2dyYW0gaW4gYSBjb21tZXJjaWFsIHByb2R1Y3Qgb2ZmZXJpbmcuIFRoZQotb2JsaWdhdGlvbnMgaW4gdGhpcyBzZWN0aW9uIGRvIG5vdCBhcHBseSB0byBhbnkgY2xhaW1zIG9yIExvc3NlcyByZWxhdGluZyB0byBhbnkgYWN0dWFsIG9yIGFsbGVnZWQgaW50ZWxsZWN0dWFsCi1wcm9wZXJ0eSBpbmZyaW5nZW1lbnQuIEluIG9yZGVyIHRvIHF1YWxpZnksIGFuIEluZGVtbmlmaWVkIENvbnRyaWJ1dG9yIG11c3Q6IGEpIHByb21wdGx5IG5vdGlmeSB0aGUgQ29tbWVyY2lhbAotQ29udHJpYnV0b3IgaW4gd3JpdGluZyBvZiBzdWNoIGNsYWltLCBhbmQgYikgYWxsb3cgdGhlIENvbW1lcmNpYWwgQ29udHJpYnV0b3IgdG8gY29udHJvbCwgYW5kIGNvb3BlcmF0ZSB3aXRoIHRoZQotQ29tbWVyY2lhbCBDb250cmlidXRvciBpbiwgdGhlIGRlZmVuc2UgYW5kIGFueSByZWxhdGVkIHNldHRsZW1lbnQgbmVnb3RpYXRpb25zLiBUaGUgSW5kZW1uaWZpZWQgQ29udHJpYnV0b3IgbWF5Ci0gcGFydGljaXBhdGUgaW4gYW55IHN1Y2ggY2xhaW0gYXQgaXRzIG93biBleHBlbnNlLgotCi1Gb3IgZXhhbXBsZSwgYSBDb250cmlidXRvciBtaWdodCBpbmNsdWRlIHRoZSBQcm9ncmFtIGluIGEgY29tbWVyY2lhbCBwcm9kdWN0IG9mZmVyaW5nLCBQcm9kdWN0IFguIFRoYXQgQ29udHJpYnV0b3IgaXMKLXRoZW4gYSBDb21tZXJjaWFsIENvbnRyaWJ1dG9yLiBJZiB0aGF0IENvbW1lcmNpYWwgQ29udHJpYnV0b3IgdGhlbiBtYWtlcyBwZXJmb3JtYW5jZSBjbGFpbXMsIG9yIG9mZmVycyB3YXJyYW50aWVzCi1yZWxhdGVkIHRvIFByb2R1Y3QgWCwgdGhvc2UgcGVyZm9ybWFuY2UgY2xhaW1zIGFuZCB3YXJyYW50aWVzIGFyZSBzdWNoIENvbW1lcmNpYWwgQ29udHJpYnV0b3IncyByZXNwb25zaWJpbGl0eSBhbG9uZS4KLVVuZGVyIHRoaXMgc2VjdGlvbiwgdGhlIENvbW1lcmNpYWwgQ29udHJpYnV0b3Igd291bGQgaGF2ZSB0byBkZWZlbmQgY2xhaW1zIGFnYWluc3QgdGhlIG90aGVyIENvbnRyaWJ1dG9ycyByZWxhdGVkIHRvCi10aG9zZSBwZXJmb3JtYW5jZSBjbGFpbXMgYW5kIHdhcnJhbnRpZXMsIGFuZCBpZiBhIGNvdXJ0IHJlcXVpcmVzIGFueSBvdGhlciBDb250cmlidXRvciB0byBwYXkgYW55IGRhbWFnZXMgYXMgYSByZXN1bHQsCi10aGUgQ29tbWVyY2lhbCBDb250cmlidXRvciBtdXN0IHBheSB0aG9zZSBkYW1hZ2VzLgotCi01LiBOTyBXQVJSQU5UWQotCi1FWENFUFQgQVMgRVhQUkVTU0xZIFNFVCBGT1JUSCBJTiBUSElTIEFHUkVFTUVOVCwgVEhFIFBST0dSQU0gSVMgUFJPVklERUQgT04gQU4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SCi1DT05ESVRJT05TIE9GIEFOWSBLSU5ELCBFSVRIRVIgRVhQUkVTUyBPUiBJTVBMSUVEIElOQ0xVRElORywgV0lUSE9VVCBMSU1JVEFUSU9OLCBBTlkgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIFRJVExFLAotTk9OLUlORlJJTkdFTUVOVCwgTUVSQ0hBTlRBQklMSVRZIE9SIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBFYWNoIFJlY2lwaWVudCBpcyBzb2xlbHkgcmVzcG9uc2libGUgZm9yCi1kZXRlcm1pbmluZyB0aGUgYXBwcm9wcmlhdGVuZXNzIG9mIHVzaW5nIGFuZCBkaXN0cmlidXRpbmcgdGhlIFByb2dyYW0gYW5kIGFzc3VtZXMgYWxsIHJpc2tzIGFzc29jaWF0ZWQgd2l0aCBpdHMKLWV4ZXJjaXNlIG9mIHJpZ2h0cyB1bmRlciB0aGlzIEFncmVlbWVudCAsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIHJpc2tzIGFuZCBjb3N0cyBvZiBwcm9ncmFtIGVycm9ycywgY29tcGxpYW5jZQotd2l0aCBhcHBsaWNhYmxlIGxhd3MsIGRhbWFnZSB0byBvciBsb3NzIG9mIGRhdGEsIHByb2dyYW1zIG9yIGVxdWlwbWVudCwgYW5kIHVuYXZhaWxhYmlsaXR5IG9yIGludGVycnVwdGlvbiBvZiBvcGVyYXRpb25zLgotCi02LiBESVNDTEFJTUVSIE9GIExJQUJJTElUWQotCi1FWENFUFQgQVMgRVhQUkVTU0xZIFNFVCBGT1JUSCBJTiBUSElTIEFHUkVFTUVOVCwgTkVJVEhFUiBSRUNJUElFTlQgTk9SIEFOWSBDT05UUklCVVRPUlMgU0hBTEwgSEFWRSBBTlkgTElBQklMSVRZIEZPUiBBTlkKLURJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcgV0lUSE9VVCBMSU1JVEFUSU9OIExPU1QgUFJPRklUUyksCi1IT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SCi1PVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPUiBESVNUUklCVVRJT04gT0YgVEhFIFBST0dSQU0gT1IgVEhFIEVYRVJDSVNFIE9GIEFOWSBSSUdIVFMgR1JBTlRFRAotSEVSRVVOREVSLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFUy4KLQotNy4gR0VORVJBTAotCi1JZiBhbnkgcHJvdmlzaW9uIG9mIHRoaXMgQWdyZWVtZW50IGlzIGludmFsaWQgb3IgdW5lbmZvcmNlYWJsZSB1bmRlciBhcHBsaWNhYmxlIGxhdywgaXQgc2hhbGwgbm90IGFmZmVjdCB0aGUgdmFsaWRpdHkgb3IKLWVuZm9yY2VhYmlsaXR5IG9mIHRoZSByZW1haW5kZXIgb2YgdGhlIHRlcm1zIG9mIHRoaXMgQWdyZWVtZW50LCBhbmQgd2l0aG91dCBmdXJ0aGVyIGFjdGlvbiBieSB0aGUgcGFydGllcyBoZXJldG8sIHN1Y2gKLXByb3Zpc2lvbiBzaGFsbCBiZSByZWZvcm1lZCB0byB0aGUgbWluaW11bSBleHRlbnQgbmVjZXNzYXJ5IHRvIG1ha2Ugc3VjaCBwcm92aXNpb24gdmFsaWQgYW5kIGVuZm9yY2VhYmxlLgotCi1JZiBSZWNpcGllbnQgaW5zdGl0dXRlcyBwYXRlbnQgbGl0aWdhdGlvbiBhZ2FpbnN0IGFueSBlbnRpdHkgKGluY2x1ZGluZyBhIGNyb3NzLWNsYWltIG9yIGNvdW50ZXJjbGFpbSBpbiBhIGxhd3N1aXQpCi1hbGxlZ2luZyB0aGF0IHRoZSBQcm9ncmFtIGl0c2VsZiAoZXhjbHVkaW5nIGNvbWJpbmF0aW9ucyBvZiB0aGUgUHJvZ3JhbSB3aXRoIG90aGVyIHNvZnR3YXJlIG9yIGhhcmR3YXJlKSBpbmZyaW5nZXMgc3VjaAotUmVjaXBpZW50J3MgcGF0ZW50KHMpLCB0aGVuIHN1Y2ggUmVjaXBpZW50J3MgcmlnaHRzIGdyYW50ZWQgdW5kZXIgU2VjdGlvbiAyKGIpIHNoYWxsIHRlcm1pbmF0ZSBhcyBvZiB0aGUgZGF0ZSBzdWNoCi1saXRpZ2F0aW9uIGlzIGZpbGVkLgotCi1BbGwgUmVjaXBpZW50J3MgcmlnaHRzIHVuZGVyIHRoaXMgQWdyZWVtZW50IHNoYWxsIHRlcm1pbmF0ZSBpZiBpdCBmYWlscyB0byBjb21wbHkgd2l0aCBhbnkgb2YgdGhlIG1hdGVyaWFsIHRlcm1zIG9yCi1jb25kaXRpb25zIG9mIHRoaXMgQWdyZWVtZW50IGFuZCBkb2VzIG5vdCBjdXJlIHN1Y2ggZmFpbHVyZSBpbiBhIHJlYXNvbmFibGUgcGVyaW9kIG9mIHRpbWUgYWZ0ZXIgYmVjb21pbmcgYXdhcmUgb2Ygc3VjaAotbm9uY29tcGxpYW5jZS4gSWYgYWxsIFJlY2lwaWVudCdzIHJpZ2h0cyB1bmRlciB0aGlzIEFncmVlbWVudCB0ZXJtaW5hdGUsIFJlY2lwaWVudCBhZ3JlZXMgdG8gY2Vhc2UgdXNlIGFuZCBkaXN0cmlidXRpb24KLW9mIHRoZSBQcm9ncmFtIGFzIHNvb24gYXMgcmVhc29uYWJseSBwcmFjdGljYWJsZS4gSG93ZXZlciwgUmVjaXBpZW50J3Mgb2JsaWdhdGlvbnMgdW5kZXIgdGhpcyBBZ3JlZW1lbnQgYW5kIGFueSBsaWNlbnNlcwotIGdyYW50ZWQgYnkgUmVjaXBpZW50IHJlbGF0aW5nIHRvIHRoZSBQcm9ncmFtIHNoYWxsIGNvbnRpbnVlIGFuZCBzdXJ2aXZlLgotCi1FdmVyeW9uZSBpcyBwZXJtaXR0ZWQgdG8gY29weSBhbmQgZGlzdHJpYnV0ZSBjb3BpZXMgb2YgdGhpcyBBZ3JlZW1lbnQsIGJ1dCBpbiBvcmRlciB0byBhdm9pZCBpbmNvbnNpc3RlbmN5IHRoZSBBZ3JlZW1lbnQKLWlzIGNvcHlyaWdodGVkIGFuZCBtYXkgb25seSBiZSBtb2RpZmllZCBpbiB0aGUgZm9sbG93aW5nIG1hbm5lci4gVGhlIEFncmVlbWVudCBTdGV3YXJkIHJlc2VydmVzIHRoZSByaWdodCB0byBwdWJsaXNoCi1uZXcgdmVyc2lvbnMgKGluY2x1ZGluZyByZXZpc2lvbnMpIG9mIHRoaXMgQWdyZWVtZW50IGZyb20gdGltZSB0byB0aW1lLiBObyBvbmUgb3RoZXIgdGhhbiB0aGUgQWdyZWVtZW50IFN0ZXdhcmQgaGFzIHRoZQotcmlnaHQgdG8gbW9kaWZ5IHRoaXMgQWdyZWVtZW50LiBUaGUgRWNsaXBzZSBGb3VuZGF0aW9uIGlzIHRoZSBpbml0aWFsIEFncmVlbWVudCBTdGV3YXJkLiBUaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1heQotYXNzaWduIHRoZSByZXNwb25zaWJpbGl0eSB0byBzZXJ2ZSBhcyB0aGUgQWdyZWVtZW50IFN0ZXdhcmQgdG8gYSBzdWl0YWJsZSBzZXBhcmF0ZSBlbnRpdHkuIEVhY2ggbmV3IHZlcnNpb24gb2YgdGhlCi1BZ3JlZW1lbnQgd2lsbCBiZSBnaXZlbiBhIGRpc3Rpbmd1aXNoaW5nIHZlcnNpb24gbnVtYmVyLiBUaGUgUHJvZ3JhbSAoaW5jbHVkaW5nIENvbnRyaWJ1dGlvbnMpIG1heSBhbHdheXMgYmUKLWRpc3RyaWJ1dGVkIHN1YmplY3QgdG8gdGhlIHZlcnNpb24gb2YgdGhlIEFncmVlbWVudCB1bmRlciB3aGljaCBpdCB3YXMgcmVjZWl2ZWQuIEluIGFkZGl0aW9uLCBhZnRlciBhIG5ldyB2ZXJzaW9uIG9mCi10aGUgQWdyZWVtZW50IGlzIHB1Ymxpc2hlZCwgQ29udHJpYnV0b3IgbWF5IGVsZWN0IHRvIGRpc3RyaWJ1dGUgdGhlIFByb2dyYW0gKGluY2x1ZGluZyBpdHMgQ29udHJpYnV0aW9ucykgdW5kZXIgdGhlCi1uZXcgdmVyc2lvbi4gRXhjZXB0IGFzIGV4cHJlc3NseSBzdGF0ZWQgaW4gU2VjdGlvbnMgMihhKSBhbmQgMihiKSBhYm92ZSwgUmVjaXBpZW50IHJlY2VpdmVzIG5vIHJpZ2h0cyBvciBsaWNlbnNlcyB0bwotdGhlIGludGVsbGVjdHVhbCBwcm9wZXJ0eSBvZiBhbnkgQ29udHJpYnV0b3IgdW5kZXIgdGhpcyBBZ3JlZW1lbnQsIHdoZXRoZXIgZXhwcmVzc2x5LCBieSBpbXBsaWNhdGlvbiwgZXN0b3BwZWwgb3IKLW90aGVyd2lzZS4gQWxsIHJpZ2h0cyBpbiB0aGUgUHJvZ3JhbSBub3QgZXhwcmVzc2x5IGdyYW50ZWQgdW5kZXIgdGhpcyBBZ3JlZW1lbnQgYXJlIHJlc2VydmVkLgotCi1UaGlzIEFncmVlbWVudCBpcyBnb3Zlcm5lZCBieSB0aGUgbGF3cyBvZiB0aGUgU3RhdGUgb2YgTmV3IFlvcmsgYW5kIHRoZSBpbnRlbGxlY3R1YWwgcHJvcGVydHkgbGF3cyBvZiB0aGUgVW5pdGVkIFN0YXRlcwotb2YgQW1lcmljYS4gTm8gcGFydHkgdG8gdGhpcyBBZ3JlZW1lbnQgd2lsbCBicmluZyBhIGxlZ2FsIGFjdGlvbiB1bmRlciB0aGlzIEFncmVlbWVudCBtb3JlIHRoYW4gb25lIHllYXIgYWZ0ZXIgdGhlIGNhdXNlCi1vZiBhY3Rpb24gYXJvc2UuIEVhY2ggcGFydHkgd2FpdmVzIGl0cyByaWdodHMgdG8gYSBqdXJ5IHRyaWFsIGluIGFueSByZXN1bHRpbmcgbGl0aWdhdGlvbi4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCitKYXZhIGFuZCBhbGwgSmF2YS1iYXNlZCB0cmFkZW1hcmtzIGFyZSB0cmFkZW1hcmtzIG9mIE9yYWNsZSBDb3Jwb3JhdGlvbiBpbiB0aGUKK1VuaXRlZCBTdGF0ZXMsIG90aGVyIGNvdW50cmllcywgb3IgYm90aC4KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLm9zYnAueHRleHQuZGF0YWludGVyY2hhbmdlLmZlYXR1cmUvYnVpbGQucHJvcGVydGllcyBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQuZGF0YWludGVyY2hhbmdlLmZlYXR1cmUvYnVpbGQucHJvcGVydGllcwppbmRleCA5NjFhM2UwLi4xOTUwZjUyIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmRhdGFpbnRlcmNoYW5nZS5mZWF0dXJlL2J1aWxkLnByb3BlcnRpZXMKKysrIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5kYXRhaW50ZXJjaGFuZ2UuZmVhdHVyZS9idWlsZC5wcm9wZXJ0aWVzCkBAIC0xLDUgKzEsNSBAQAotYmluLmluY2x1ZGVzID0gbGljZW5zZS5odG1sLCAgZXBsLXYxMC5odG1sLCAgZmVhdHVyZS54bWwsXAorYmluLmluY2x1ZGVzID0gbGljZW5zZS5odG1sLCAgZXBsLTIuMC5odG1sLCAgZmVhdHVyZS54bWwsXAogICAgICAgICAgICAgICAgZmVhdHVyZS5wcm9wZXJ0aWVzCiBzcmMuaW5jbHVkZXMgPSBMSUNFTlNFLnR4dCxcCi0gICAgICAgICAgICAgICBlcGwtdjEwLmh0bWwsXAorICAgICAgICAgICAgICAgZXBsLTIuMC5odG1sLFwKICAgICAgICAgICAgICAgIGxpY2Vuc2UuaHRtbApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5kYXRhaW50ZXJjaGFuZ2UuZmVhdHVyZS9lcGwtMi4wLmh0bWwgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmRhdGFpbnRlcmNoYW5nZS5mZWF0dXJlL2VwbC0yLjAuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MzdhMTgxCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5kYXRhaW50ZXJjaGFuZ2UuZmVhdHVyZS9lcGwtMi4wLmh0bWwKQEAgLTAsMCArMSwzMDAgQEAKKzwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFN0cmljdC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS1zdHJpY3QuZHRkIj4KKzxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIiB4bWw6bGFuZz0iZW4iIGxhbmc9ImVuIj4KKyAgPGhlYWQ+CisgICAgPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXRmLTgiIC8+CisgICAgPHRpdGxlPkVjbGlwc2UgUHVibGljIExpY2Vuc2UgLSBWZXJzaW9uIDIuMDwvdGl0bGU+CisgICAgPHN0eWxlIHR5cGU9InRleHQvY3NzIj4KKyAgICAgIGJvZHkgeworICAgICAgICBtYXJnaW46IDEuNWVtIDNlbTsKKyAgICAgIH0KKyAgICAgIGgxeworICAgICAgICBmb250LXNpemU6MS41ZW07CisgICAgICB9CisgICAgICBoMnsKKyAgICAgICAgZm9udC1zaXplOjFlbTsKKyAgICAgICAgbWFyZ2luLWJvdHRvbTowLjVlbTsKKyAgICAgICAgbWFyZ2luLXRvcDoxZW07CisgICAgICB9CisgICAgICBwIHsKKyAgICAgICAgbWFyZ2luLXRvcDogIDAuNWVtOworICAgICAgICBtYXJnaW4tYm90dG9tOiAwLjVlbTsKKyAgICAgIH0KKyAgICAgIHVsLCBvbHsKKyAgICAgICAgbGlzdC1zdHlsZS10eXBlOm5vbmU7CisgICAgICB9CisgICAgPC9zdHlsZT4KKyAgPC9oZWFkPgorICA8Ym9keT4KKyAgICA8aDE+RWNsaXBzZSBQdWJsaWMgTGljZW5zZSAtIHYgMi4wPC9oMT4KKyAgICA8cD5USEUgQUNDT01QQU5ZSU5HIFBST0dSQU0gSVMgUFJPVklERUQgVU5ERVIgVEhFIFRFUk1TIE9GIFRISVMgRUNMSVBTRQorICAgICAgUFVCTElDIExJQ0VOU0UgKCZsZHF1bztBR1JFRU1FTlQmcmRxdW87KS4gQU5ZIFVTRSwgUkVQUk9EVUNUSU9OIE9SIERJU1RSSUJVVElPTgorICAgICAgT0YgVEhFIFBST0dSQU0gQ09OU1RJVFVURVMgUkVDSVBJRU5UJiMwMzk7UyBBQ0NFUFRBTkNFIE9GIFRISVMgQUdSRUVNRU5ULgorICAgIDwvcD4KKyAgICA8aDIgaWQ9ImRlZmluaXRpb25zIj4xLiBERUZJTklUSU9OUzwvaDI+CisgICAgPHA+JmxkcXVvO0NvbnRyaWJ1dGlvbiZyZHF1bzsgbWVhbnM6PC9wPgorICAgIDx1bD4KKyAgICAgIDxsaT5hKSBpbiB0aGUgY2FzZSBvZiB0aGUgaW5pdGlhbCBDb250cmlidXRvciwgdGhlIGluaXRpYWwgY29udGVudAorICAgICAgICBEaXN0cmlidXRlZCB1bmRlciB0aGlzIEFncmVlbWVudCwgYW5kCisgICAgICA8L2xpPgorICAgICAgPGxpPgorICAgICAgICBiKSBpbiB0aGUgY2FzZSBvZiBlYWNoIHN1YnNlcXVlbnQgQ29udHJpYnV0b3I6CisgICAgICAgIDx1bD4KKyAgICAgICAgICA8bGk+aSkgY2hhbmdlcyB0byB0aGUgUHJvZ3JhbSwgYW5kPC9saT4KKyAgICAgICAgICA8bGk+aWkpIGFkZGl0aW9ucyB0byB0aGUgUHJvZ3JhbTs8L2xpPgorICAgICAgICA8L3VsPgorICAgICAgICB3aGVyZSBzdWNoIGNoYW5nZXMgYW5kL29yIGFkZGl0aW9ucyB0byB0aGUgUHJvZ3JhbSBvcmlnaW5hdGUgZnJvbQorICAgICAgICBhbmQgYXJlIERpc3RyaWJ1dGVkIGJ5IHRoYXQgcGFydGljdWxhciBDb250cmlidXRvci4gQSBDb250cmlidXRpb24KKyAgICAgICAgJmxkcXVvO29yaWdpbmF0ZXMmcmRxdW87IGZyb20gYSBDb250cmlidXRvciBpZiBpdCB3YXMgYWRkZWQgdG8gdGhlIFByb2dyYW0gYnkgc3VjaAorICAgICAgICBDb250cmlidXRvciBpdHNlbGYgb3IgYW55b25lIGFjdGluZyBvbiBzdWNoIENvbnRyaWJ1dG9yJiMwMzk7cyBiZWhhbGYuCisgICAgICAgIENvbnRyaWJ1dGlvbnMgZG8gbm90IGluY2x1ZGUgY2hhbmdlcyBvciBhZGRpdGlvbnMgdG8gdGhlIFByb2dyYW0gdGhhdAorICAgICAgICBhcmUgbm90IE1vZGlmaWVkIFdvcmtzLgorICAgICAgPC9saT4KKyAgICA8L3VsPgorICAgIDxwPiZsZHF1bztDb250cmlidXRvciZyZHF1bzsgbWVhbnMgYW55IHBlcnNvbiBvciBlbnRpdHkgdGhhdCBEaXN0cmlidXRlcyB0aGUgUHJvZ3JhbS48L3A+CisgICAgPHA+JmxkcXVvO0xpY2Vuc2VkIFBhdGVudHMmcmRxdW87IG1lYW4gcGF0ZW50IGNsYWltcyBsaWNlbnNhYmxlIGJ5IGEgQ29udHJpYnV0b3Igd2hpY2gKKyAgICAgIGFyZSBuZWNlc3NhcmlseSBpbmZyaW5nZWQgYnkgdGhlIHVzZSBvciBzYWxlIG9mIGl0cyBDb250cmlidXRpb24gYWxvbmUKKyAgICAgIG9yIHdoZW4gY29tYmluZWQgd2l0aCB0aGUgUHJvZ3JhbS4KKyAgICA8L3A+CisgICAgPHA+JmxkcXVvO1Byb2dyYW0mcmRxdW87IG1lYW5zIHRoZSBDb250cmlidXRpb25zIERpc3RyaWJ1dGVkIGluIGFjY29yZGFuY2Ugd2l0aCB0aGlzCisgICAgICBBZ3JlZW1lbnQuCisgICAgPC9wPgorICAgIDxwPiZsZHF1bztSZWNpcGllbnQmcmRxdW87IG1lYW5zIGFueW9uZSB3aG8gcmVjZWl2ZXMgdGhlIFByb2dyYW0gdW5kZXIgdGhpcyBBZ3JlZW1lbnQKKyAgICAgIG9yIGFueSBTZWNvbmRhcnkgTGljZW5zZSAoYXMgYXBwbGljYWJsZSksIGluY2x1ZGluZyBDb250cmlidXRvcnMuCisgICAgPC9wPgorICAgIDxwPiZsZHF1bztEZXJpdmF0aXZlIFdvcmtzJnJkcXVvOyBzaGFsbCBtZWFuIGFueSB3b3JrLCB3aGV0aGVyIGluIFNvdXJjZSBDb2RlIG9yIG90aGVyCisgICAgICBmb3JtLCB0aGF0IGlzIGJhc2VkIG9uIChvciBkZXJpdmVkIGZyb20pIHRoZSBQcm9ncmFtIGFuZCBmb3Igd2hpY2ggdGhlCisgICAgICBlZGl0b3JpYWwgcmV2aXNpb25zLCBhbm5vdGF0aW9ucywgZWxhYm9yYXRpb25zLCBvciBvdGhlciBtb2RpZmljYXRpb25zCisgICAgICByZXByZXNlbnQsIGFzIGEgd2hvbGUsIGFuIG9yaWdpbmFsIHdvcmsgb2YgYXV0aG9yc2hpcC4KKyAgICA8L3A+CisgICAgPHA+JmxkcXVvO01vZGlmaWVkIFdvcmtzJnJkcXVvOyBzaGFsbCBtZWFuIGFueSB3b3JrIGluIFNvdXJjZSBDb2RlIG9yIG90aGVyIGZvcm0gdGhhdAorICAgICAgcmVzdWx0cyBmcm9tIGFuIGFkZGl0aW9uIHRvLCBkZWxldGlvbiBmcm9tLCBvciBtb2RpZmljYXRpb24gb2YgdGhlCisgICAgICBjb250ZW50cyBvZiB0aGUgUHJvZ3JhbSwgaW5jbHVkaW5nLCBmb3IgcHVycG9zZXMgb2YgY2xhcml0eSBhbnkgbmV3IGZpbGUKKyAgICAgIGluIFNvdXJjZSBDb2RlIGZvcm0gdGhhdCBjb250YWlucyBhbnkgY29udGVudHMgb2YgdGhlIFByb2dyYW0uIE1vZGlmaWVkCisgICAgICBXb3JrcyBzaGFsbCBub3QgaW5jbHVkZSB3b3JrcyB0aGF0IGNvbnRhaW4gb25seSBkZWNsYXJhdGlvbnMsIGludGVyZmFjZXMsCisgICAgICB0eXBlcywgY2xhc3Nlcywgc3RydWN0dXJlcywgb3IgZmlsZXMgb2YgdGhlIFByb2dyYW0gc29sZWx5IGluIGVhY2ggY2FzZQorICAgICAgaW4gb3JkZXIgdG8gbGluayB0bywgYmluZCBieSBuYW1lLCBvciBzdWJjbGFzcyB0aGUgUHJvZ3JhbSBvciBNb2RpZmllZAorICAgICAgV29ya3MgdGhlcmVvZi4KKyAgICA8L3A+CisgICAgPHA+JmxkcXVvO0Rpc3RyaWJ1dGUmcmRxdW87IG1lYW5zIHRoZSBhY3RzIG9mIGEpIGRpc3RyaWJ1dGluZyBvciBiKSBtYWtpbmcgYXZhaWxhYmxlCisgICAgICBpbiBhbnkgbWFubmVyIHRoYXQgZW5hYmxlcyB0aGUgdHJhbnNmZXIgb2YgYSBjb3B5LgorICAgIDwvcD4KKyAgICA8cD4mbGRxdW87U291cmNlIENvZGUmcmRxdW87IG1lYW5zIHRoZSBmb3JtIG9mIGEgUHJvZ3JhbSBwcmVmZXJyZWQgZm9yIG1ha2luZworICAgICAgbW9kaWZpY2F0aW9ucywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBzb2Z0d2FyZSBzb3VyY2UgY29kZSwKKyAgICAgIGRvY3VtZW50YXRpb24gc291cmNlLCBhbmQgY29uZmlndXJhdGlvbiBmaWxlcy4KKyAgICA8L3A+CisgICAgPHA+JmxkcXVvO1NlY29uZGFyeSBMaWNlbnNlJnJkcXVvOyBtZWFucyBlaXRoZXIgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICAgICAgVmVyc2lvbiAyLjAsIG9yIGFueSBsYXRlciB2ZXJzaW9ucyBvZiB0aGF0IGxpY2Vuc2UsIGluY2x1ZGluZyBhbnkKKyAgICAgIGV4Y2VwdGlvbnMgb3IgYWRkaXRpb25hbCBwZXJtaXNzaW9ucyBhcyBpZGVudGlmaWVkIGJ5IHRoZSBpbml0aWFsCisgICAgICBDb250cmlidXRvci4KKyAgICA8L3A+CisgICAgPGgyIGlkPSJncmFudC1vZi1yaWdodHMiPjIuIEdSQU5UIE9GIFJJR0hUUzwvaDI+CisgICAgPHVsPgorICAgICAgPGxpPmEpIFN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoaXMgQWdyZWVtZW50LCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieQorICAgICAgICBncmFudHMgUmVjaXBpZW50IGEgbm9uLWV4Y2x1c2l2ZSwgd29ybGR3aWRlLCByb3lhbHR5LWZyZWUgY29weXJpZ2h0CisgICAgICAgIGxpY2Vuc2UgdG8gcmVwcm9kdWNlLCBwcmVwYXJlIERlcml2YXRpdmUgV29ya3Mgb2YsIHB1YmxpY2x5IGRpc3BsYXksCisgICAgICAgIHB1YmxpY2x5IHBlcmZvcm0sIERpc3RyaWJ1dGUgYW5kIHN1YmxpY2Vuc2UgdGhlIENvbnRyaWJ1dGlvbiBvZiBzdWNoCisgICAgICAgIENvbnRyaWJ1dG9yLCBpZiBhbnksIGFuZCBzdWNoIERlcml2YXRpdmUgV29ya3MuCisgICAgICA8L2xpPgorICAgICAgPGxpPmIpIFN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoaXMgQWdyZWVtZW50LCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieQorICAgICAgICBncmFudHMgUmVjaXBpZW50IGEgbm9uLWV4Y2x1c2l2ZSwgd29ybGR3aWRlLCByb3lhbHR5LWZyZWUgcGF0ZW50CisgICAgICAgIGxpY2Vuc2UgdW5kZXIgTGljZW5zZWQgUGF0ZW50cyB0byBtYWtlLCB1c2UsIHNlbGwsIG9mZmVyIHRvIHNlbGwsCisgICAgICAgIGltcG9ydCBhbmQgb3RoZXJ3aXNlIHRyYW5zZmVyIHRoZSBDb250cmlidXRpb24gb2Ygc3VjaCBDb250cmlidXRvciwKKyAgICAgICAgaWYgYW55LCBpbiBTb3VyY2UgQ29kZSBvciBvdGhlciBmb3JtLiBUaGlzIHBhdGVudCBsaWNlbnNlIHNoYWxsCisgICAgICAgIGFwcGx5IHRvIHRoZSBjb21iaW5hdGlvbiBvZiB0aGUgQ29udHJpYnV0aW9uIGFuZCB0aGUgUHJvZ3JhbSBpZiwKKyAgICAgICAgYXQgdGhlIHRpbWUgdGhlIENvbnRyaWJ1dGlvbiBpcyBhZGRlZCBieSB0aGUgQ29udHJpYnV0b3IsIHN1Y2gKKyAgICAgICAgYWRkaXRpb24gb2YgdGhlIENvbnRyaWJ1dGlvbiBjYXVzZXMgc3VjaCBjb21iaW5hdGlvbiB0byBiZSBjb3ZlcmVkCisgICAgICAgIGJ5IHRoZSBMaWNlbnNlZCBQYXRlbnRzLiBUaGUgcGF0ZW50IGxpY2Vuc2Ugc2hhbGwgbm90IGFwcGx5IHRvIGFueQorICAgICAgICBvdGhlciBjb21iaW5hdGlvbnMgd2hpY2ggaW5jbHVkZSB0aGUgQ29udHJpYnV0aW9uLiBObyBoYXJkd2FyZSBwZXIKKyAgICAgICAgc2UgaXMgbGljZW5zZWQgaGVyZXVuZGVyLgorICAgICAgPC9saT4KKyAgICAgIDxsaT5jKSBSZWNpcGllbnQgdW5kZXJzdGFuZHMgdGhhdCBhbHRob3VnaCBlYWNoIENvbnRyaWJ1dG9yIGdyYW50cyB0aGUKKyAgICAgICAgbGljZW5zZXMgdG8gaXRzIENvbnRyaWJ1dGlvbnMgc2V0IGZvcnRoIGhlcmVpbiwgbm8gYXNzdXJhbmNlcyBhcmUKKyAgICAgICAgcHJvdmlkZWQgYnkgYW55IENvbnRyaWJ1dG9yIHRoYXQgdGhlIFByb2dyYW0gZG9lcyBub3QgaW5mcmluZ2UgdGhlCisgICAgICAgIHBhdGVudCBvciBvdGhlciBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIG9mIGFueSBvdGhlciBlbnRpdHkuCisgICAgICAgIEVhY2ggQ29udHJpYnV0b3IgZGlzY2xhaW1zIGFueSBsaWFiaWxpdHkgdG8gUmVjaXBpZW50IGZvciBjbGFpbXMKKyAgICAgICAgYnJvdWdodCBieSBhbnkgb3RoZXIgZW50aXR5IGJhc2VkIG9uIGluZnJpbmdlbWVudCBvZiBpbnRlbGxlY3R1YWwKKyAgICAgICAgcHJvcGVydHkgcmlnaHRzIG9yIG90aGVyd2lzZS4gQXMgYSBjb25kaXRpb24gdG8gZXhlcmNpc2luZyB0aGUgcmlnaHRzCisgICAgICAgIGFuZCBsaWNlbnNlcyBncmFudGVkIGhlcmV1bmRlciwgZWFjaCBSZWNpcGllbnQgaGVyZWJ5IGFzc3VtZXMgc29sZQorICAgICAgICByZXNwb25zaWJpbGl0eSB0byBzZWN1cmUgYW55IG90aGVyIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgbmVlZGVkLAorICAgICAgICBpZiBhbnkuIEZvciBleGFtcGxlLCBpZiBhIHRoaXJkIHBhcnR5IHBhdGVudCBsaWNlbnNlIGlzIHJlcXVpcmVkIHRvCisgICAgICAgIGFsbG93IFJlY2lwaWVudCB0byBEaXN0cmlidXRlIHRoZSBQcm9ncmFtLCBpdCBpcyBSZWNpcGllbnQmIzAzOTtzCisgICAgICAgIHJlc3BvbnNpYmlsaXR5IHRvIGFjcXVpcmUgdGhhdCBsaWNlbnNlIGJlZm9yZSBkaXN0cmlidXRpbmcgdGhlIFByb2dyYW0uCisgICAgICA8L2xpPgorICAgICAgPGxpPmQpIEVhY2ggQ29udHJpYnV0b3IgcmVwcmVzZW50cyB0aGF0IHRvIGl0cyBrbm93bGVkZ2UgaXQgaGFzIHN1ZmZpY2llbnQKKyAgICAgICAgY29weXJpZ2h0IHJpZ2h0cyBpbiBpdHMgQ29udHJpYnV0aW9uLCBpZiBhbnksIHRvIGdyYW50IHRoZSBjb3B5cmlnaHQKKyAgICAgICAgbGljZW5zZSBzZXQgZm9ydGggaW4gdGhpcyBBZ3JlZW1lbnQuCisgICAgICA8L2xpPgorICAgICAgPGxpPmUpIE5vdHdpdGhzdGFuZGluZyB0aGUgdGVybXMgb2YgYW55IFNlY29uZGFyeSBMaWNlbnNlLCBubyBDb250cmlidXRvcgorICAgICAgICBtYWtlcyBhZGRpdGlvbmFsIGdyYW50cyB0byBhbnkgUmVjaXBpZW50IChvdGhlciB0aGFuIHRob3NlIHNldCBmb3J0aAorICAgICAgICBpbiB0aGlzIEFncmVlbWVudCkgYXMgYSByZXN1bHQgb2Ygc3VjaCBSZWNpcGllbnQmIzAzOTtzIHJlY2VpcHQgb2YgdGhlCisgICAgICAgIFByb2dyYW0gdW5kZXIgdGhlIHRlcm1zIG9mIGEgU2Vjb25kYXJ5IExpY2Vuc2UgKGlmIHBlcm1pdHRlZCB1bmRlcgorICAgICAgICB0aGUgdGVybXMgb2YgU2VjdGlvbiAzKS4KKyAgICAgIDwvbGk+CisgICAgPC91bD4KKyAgICA8aDIgaWQ9InJlcXVpcmVtZW50cyI+My4gUkVRVUlSRU1FTlRTPC9oMj4KKyAgICA8cD4zLjEgSWYgYSBDb250cmlidXRvciBEaXN0cmlidXRlcyB0aGUgUHJvZ3JhbSBpbiBhbnkgZm9ybSwgdGhlbjo8L3A+CisgICAgPHVsPgorICAgICAgPGxpPmEpIHRoZSBQcm9ncmFtIG11c3QgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSBhcyBTb3VyY2UgQ29kZSwgaW4KKyAgICAgICAgYWNjb3JkYW5jZSB3aXRoIHNlY3Rpb24gMy4yLCBhbmQgdGhlIENvbnRyaWJ1dG9yIG11c3QgYWNjb21wYW55CisgICAgICAgIHRoZSBQcm9ncmFtIHdpdGggYSBzdGF0ZW1lbnQgdGhhdCB0aGUgU291cmNlIENvZGUgZm9yIHRoZSBQcm9ncmFtCisgICAgICAgIGlzIGF2YWlsYWJsZSB1bmRlciB0aGlzIEFncmVlbWVudCwgYW5kIGluZm9ybXMgUmVjaXBpZW50cyBob3cgdG8KKyAgICAgICAgb2J0YWluIGl0IGluIGEgcmVhc29uYWJsZSBtYW5uZXIgb24gb3IgdGhyb3VnaCBhIG1lZGl1bSBjdXN0b21hcmlseQorICAgICAgICB1c2VkIGZvciBzb2Z0d2FyZSBleGNoYW5nZTsgYW5kCisgICAgICA8L2xpPgorICAgICAgPGxpPgorICAgICAgICBiKSB0aGUgQ29udHJpYnV0b3IgbWF5IERpc3RyaWJ1dGUgdGhlIFByb2dyYW0gdW5kZXIgYSBsaWNlbnNlCisgICAgICAgIGRpZmZlcmVudCB0aGFuIHRoaXMgQWdyZWVtZW50LCBwcm92aWRlZCB0aGF0IHN1Y2ggbGljZW5zZToKKyAgICAgICAgPHVsPgorICAgICAgICAgIDxsaT5pKSBlZmZlY3RpdmVseSBkaXNjbGFpbXMgb24gYmVoYWxmIG9mIGFsbCBvdGhlciBDb250cmlidXRvcnMgYWxsCisgICAgICAgICAgICB3YXJyYW50aWVzIGFuZCBjb25kaXRpb25zLCBleHByZXNzIGFuZCBpbXBsaWVkLCBpbmNsdWRpbmcgd2FycmFudGllcworICAgICAgICAgICAgb3IgY29uZGl0aW9ucyBvZiB0aXRsZSBhbmQgbm9uLWluZnJpbmdlbWVudCwgYW5kIGltcGxpZWQgd2FycmFudGllcworICAgICAgICAgICAgb3IgY29uZGl0aW9ucyBvZiBtZXJjaGFudGFiaWxpdHkgYW5kIGZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlOworICAgICAgICAgIDwvbGk+CisgICAgICAgICAgPGxpPmlpKSBlZmZlY3RpdmVseSBleGNsdWRlcyBvbiBiZWhhbGYgb2YgYWxsIG90aGVyIENvbnRyaWJ1dG9ycyBhbGwKKyAgICAgICAgICAgIGxpYWJpbGl0eSBmb3IgZGFtYWdlcywgaW5jbHVkaW5nIGRpcmVjdCwgaW5kaXJlY3QsIHNwZWNpYWwsIGluY2lkZW50YWwKKyAgICAgICAgICAgIGFuZCBjb25zZXF1ZW50aWFsIGRhbWFnZXMsIHN1Y2ggYXMgbG9zdCBwcm9maXRzOworICAgICAgICAgIDwvbGk+CisgICAgICAgICAgPGxpPmlpaSkgZG9lcyBub3QgYXR0ZW1wdCB0byBsaW1pdCBvciBhbHRlciB0aGUgcmVjaXBpZW50cyYjMDM5OyByaWdodHMgaW4gdGhlCisgICAgICAgICAgICBTb3VyY2UgQ29kZSB1bmRlciBzZWN0aW9uIDMuMjsgYW5kCisgICAgICAgICAgPC9saT4KKyAgICAgICAgICA8bGk+aXYpIHJlcXVpcmVzIGFueSBzdWJzZXF1ZW50IGRpc3RyaWJ1dGlvbiBvZiB0aGUgUHJvZ3JhbSBieSBhbnkgcGFydHkKKyAgICAgICAgICAgIHRvIGJlIHVuZGVyIGEgbGljZW5zZSB0aGF0IHNhdGlzZmllcyB0aGUgcmVxdWlyZW1lbnRzIG9mIHRoaXMgc2VjdGlvbiAzLgorICAgICAgICAgIDwvbGk+CisgICAgICAgIDwvdWw+CisgICAgICA8L2xpPgorICAgIDwvdWw+CisgICAgPHA+My4yIFdoZW4gdGhlIFByb2dyYW0gaXMgRGlzdHJpYnV0ZWQgYXMgU291cmNlIENvZGU6PC9wPgorICAgIDx1bD4KKyAgICAgIDxsaT5hKSBpdCBtdXN0IGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoaXMgQWdyZWVtZW50LCBvciBpZiB0aGUgUHJvZ3JhbSAoaSkKKyAgICAgICAgaXMgY29tYmluZWQgd2l0aCBvdGhlciBtYXRlcmlhbCBpbiBhIHNlcGFyYXRlIGZpbGUgb3IgZmlsZXMgbWFkZSBhdmFpbGFibGUKKyAgICAgICAgdW5kZXIgYSBTZWNvbmRhcnkgTGljZW5zZSwgYW5kIChpaSkgdGhlIGluaXRpYWwgQ29udHJpYnV0b3IgYXR0YWNoZWQgdG8KKyAgICAgICAgdGhlIFNvdXJjZSBDb2RlIHRoZSBub3RpY2UgZGVzY3JpYmVkIGluIEV4aGliaXQgQSBvZiB0aGlzIEFncmVlbWVudCwKKyAgICAgICAgdGhlbiB0aGUgUHJvZ3JhbSBtYXkgYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHN1Y2gKKyAgICAgICAgU2Vjb25kYXJ5IExpY2Vuc2VzLCBhbmQKKyAgICAgIDwvbGk+CisgICAgICA8bGk+YikgYSBjb3B5IG9mIHRoaXMgQWdyZWVtZW50IG11c3QgYmUgaW5jbHVkZWQgd2l0aCBlYWNoIGNvcHkgb2YgdGhlIFByb2dyYW0uPC9saT4KKyAgICA8L3VsPgorICAgIDxwPjMuMyBDb250cmlidXRvcnMgbWF5IG5vdCByZW1vdmUgb3IgYWx0ZXIgYW55IGNvcHlyaWdodCwgcGF0ZW50LCB0cmFkZW1hcmssCisgICAgICBhdHRyaWJ1dGlvbiBub3RpY2VzLCBkaXNjbGFpbWVycyBvZiB3YXJyYW50eSwgb3IgbGltaXRhdGlvbnMgb2YgbGlhYmlsaXR5CisgICAgICAoJmxzcXVvO25vdGljZXMmcnNxdW87KSBjb250YWluZWQgd2l0aGluIHRoZSBQcm9ncmFtIGZyb20gYW55IGNvcHkgb2YgdGhlIFByb2dyYW0gd2hpY2gKKyAgICAgIHRoZXkgRGlzdHJpYnV0ZSwgcHJvdmlkZWQgdGhhdCBDb250cmlidXRvcnMgbWF5IGFkZCB0aGVpciBvd24gYXBwcm9wcmlhdGUKKyAgICAgIG5vdGljZXMuCisgICAgPC9wPgorICAgIDxoMiBpZD0iY29tbWVyY2lhbC1kaXN0cmlidXRpb24iPjQuIENPTU1FUkNJQUwgRElTVFJJQlVUSU9OPC9oMj4KKyAgICA8cD5Db21tZXJjaWFsIGRpc3RyaWJ1dG9ycyBvZiBzb2Z0d2FyZSBtYXkgYWNjZXB0IGNlcnRhaW4gcmVzcG9uc2liaWxpdGllcworICAgICAgd2l0aCByZXNwZWN0IHRvIGVuZCB1c2VycywgYnVzaW5lc3MgcGFydG5lcnMgYW5kIHRoZSBsaWtlLiBXaGlsZSB0aGlzCisgICAgICBsaWNlbnNlIGlzIGludGVuZGVkIHRvIGZhY2lsaXRhdGUgdGhlIGNvbW1lcmNpYWwgdXNlIG9mIHRoZSBQcm9ncmFtLCB0aGUKKyAgICAgIENvbnRyaWJ1dG9yIHdobyBpbmNsdWRlcyB0aGUgUHJvZ3JhbSBpbiBhIGNvbW1lcmNpYWwgcHJvZHVjdCBvZmZlcmluZyBzaG91bGQKKyAgICAgIGRvIHNvIGluIGEgbWFubmVyIHdoaWNoIGRvZXMgbm90IGNyZWF0ZSBwb3RlbnRpYWwgbGlhYmlsaXR5IGZvciBvdGhlcgorICAgICAgQ29udHJpYnV0b3JzLiBUaGVyZWZvcmUsIGlmIGEgQ29udHJpYnV0b3IgaW5jbHVkZXMgdGhlIFByb2dyYW0gaW4gYQorICAgICAgY29tbWVyY2lhbCBwcm9kdWN0IG9mZmVyaW5nLCBzdWNoIENvbnRyaWJ1dG9yICgmbGRxdW87Q29tbWVyY2lhbCBDb250cmlidXRvciZyZHF1bzspCisgICAgICBoZXJlYnkgYWdyZWVzIHRvIGRlZmVuZCBhbmQgaW5kZW1uaWZ5IGV2ZXJ5IG90aGVyIENvbnRyaWJ1dG9yCisgICAgICAoJmxkcXVvO0luZGVtbmlmaWVkIENvbnRyaWJ1dG9yJnJkcXVvOykgYWdhaW5zdCBhbnkgbG9zc2VzLCBkYW1hZ2VzIGFuZCBjb3N0cworICAgICAgKGNvbGxlY3RpdmVseSAmbGRxdW87TG9zc2VzJnJkcXVvOykgYXJpc2luZyBmcm9tIGNsYWltcywgbGF3c3VpdHMgYW5kIG90aGVyIGxlZ2FsIGFjdGlvbnMKKyAgICAgIGJyb3VnaHQgYnkgYSB0aGlyZCBwYXJ0eSBhZ2FpbnN0IHRoZSBJbmRlbW5pZmllZCBDb250cmlidXRvciB0byB0aGUgZXh0ZW50CisgICAgICBjYXVzZWQgYnkgdGhlIGFjdHMgb3Igb21pc3Npb25zIG9mIHN1Y2ggQ29tbWVyY2lhbCBDb250cmlidXRvciBpbiBjb25uZWN0aW9uCisgICAgICB3aXRoIGl0cyBkaXN0cmlidXRpb24gb2YgdGhlIFByb2dyYW0gaW4gYSBjb21tZXJjaWFsIHByb2R1Y3Qgb2ZmZXJpbmcuCisgICAgICBUaGUgb2JsaWdhdGlvbnMgaW4gdGhpcyBzZWN0aW9uIGRvIG5vdCBhcHBseSB0byBhbnkgY2xhaW1zIG9yIExvc3NlcyByZWxhdGluZworICAgICAgdG8gYW55IGFjdHVhbCBvciBhbGxlZ2VkIGludGVsbGVjdHVhbCBwcm9wZXJ0eSBpbmZyaW5nZW1lbnQuIEluIG9yZGVyIHRvCisgICAgICBxdWFsaWZ5LCBhbiBJbmRlbW5pZmllZCBDb250cmlidXRvciBtdXN0OiBhKSBwcm9tcHRseSBub3RpZnkgdGhlCisgICAgICBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIGluIHdyaXRpbmcgb2Ygc3VjaCBjbGFpbSwgYW5kIGIpIGFsbG93IHRoZSBDb21tZXJjaWFsCisgICAgICBDb250cmlidXRvciB0byBjb250cm9sLCBhbmQgY29vcGVyYXRlIHdpdGggdGhlIENvbW1lcmNpYWwgQ29udHJpYnV0b3IgaW4sCisgICAgICB0aGUgZGVmZW5zZSBhbmQgYW55IHJlbGF0ZWQgc2V0dGxlbWVudCBuZWdvdGlhdGlvbnMuIFRoZSBJbmRlbW5pZmllZAorICAgICAgQ29udHJpYnV0b3IgbWF5IHBhcnRpY2lwYXRlIGluIGFueSBzdWNoIGNsYWltIGF0IGl0cyBvd24gZXhwZW5zZS4KKyAgICA8L3A+CisgICAgPHA+Rm9yIGV4YW1wbGUsIGEgQ29udHJpYnV0b3IgbWlnaHQgaW5jbHVkZSB0aGUgUHJvZ3JhbQorICAgICAgaW4gYSBjb21tZXJjaWFsIHByb2R1Y3Qgb2ZmZXJpbmcsIFByb2R1Y3QgWC4gVGhhdCBDb250cmlidXRvciBpcyB0aGVuIGEKKyAgICAgIENvbW1lcmNpYWwgQ29udHJpYnV0b3IuIElmIHRoYXQgQ29tbWVyY2lhbCBDb250cmlidXRvciB0aGVuIG1ha2VzIHBlcmZvcm1hbmNlCisgICAgICBjbGFpbXMsIG9yIG9mZmVycyB3YXJyYW50aWVzIHJlbGF0ZWQgdG8gUHJvZHVjdCBYLCB0aG9zZSBwZXJmb3JtYW5jZSBjbGFpbXMKKyAgICAgIGFuZCB3YXJyYW50aWVzIGFyZSBzdWNoIENvbW1lcmNpYWwgQ29udHJpYnV0b3ImIzAzOTtzIHJlc3BvbnNpYmlsaXR5IGFsb25lLgorICAgICAgVW5kZXIgdGhpcyBzZWN0aW9uLCB0aGUgQ29tbWVyY2lhbCBDb250cmlidXRvciB3b3VsZCBoYXZlIHRvIGRlZmVuZCBjbGFpbXMKKyAgICAgIGFnYWluc3QgdGhlIG90aGVyIENvbnRyaWJ1dG9ycyByZWxhdGVkIHRvIHRob3NlIHBlcmZvcm1hbmNlIGNsYWltcyBhbmQKKyAgICAgIHdhcnJhbnRpZXMsIGFuZCBpZiBhIGNvdXJ0IHJlcXVpcmVzIGFueSBvdGhlciBDb250cmlidXRvciB0byBwYXkgYW55IGRhbWFnZXMKKyAgICAgIGFzIGEgcmVzdWx0LCB0aGUgQ29tbWVyY2lhbCBDb250cmlidXRvciBtdXN0IHBheSB0aG9zZSBkYW1hZ2VzLgorICAgIDwvcD4KKyAgICA8aDIgaWQ9IndhcnJhbnR5Ij41LiBOTyBXQVJSQU5UWTwvaDI+CisgICAgPHA+RVhDRVBUIEFTIEVYUFJFU1NMWSBTRVQgRk9SVEggSU4gVEhJUyBBR1JFRU1FTlQsIEFORCBUTyBUSEUgRVhURU5UIFBFUk1JVFRFRAorICAgICAgQlkgQVBQTElDQUJMRSBMQVcsIFRIRSBQUk9HUkFNIElTIFBST1ZJREVEIE9OIEFOICZsZHF1bztBUyBJUyZyZHF1bzsgQkFTSVMsIFdJVEhPVVQKKyAgICAgIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgRUlUSEVSIEVYUFJFU1MgT1IgSU1QTElFRCBJTkNMVURJTkcsCisgICAgICBXSVRIT1VUIExJTUlUQVRJT04sIEFOWSBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgVElUTEUsIE5PTi1JTkZSSU5HRU1FTlQsCisgICAgICBNRVJDSEFOVEFCSUxJVFkgT1IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIEVhY2ggUmVjaXBpZW50IGlzCisgICAgICBzb2xlbHkgcmVzcG9uc2libGUgZm9yIGRldGVybWluaW5nIHRoZSBhcHByb3ByaWF0ZW5lc3Mgb2YgdXNpbmcgYW5kCisgICAgICBkaXN0cmlidXRpbmcgdGhlIFByb2dyYW0gYW5kIGFzc3VtZXMgYWxsIHJpc2tzIGFzc29jaWF0ZWQgd2l0aCBpdHMKKyAgICAgIGV4ZXJjaXNlIG9mIHJpZ2h0cyB1bmRlciB0aGlzIEFncmVlbWVudCwgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUKKyAgICAgIHJpc2tzIGFuZCBjb3N0cyBvZiBwcm9ncmFtIGVycm9ycywgY29tcGxpYW5jZSB3aXRoIGFwcGxpY2FibGUgbGF3cywgZGFtYWdlCisgICAgICB0byBvciBsb3NzIG9mIGRhdGEsIHByb2dyYW1zIG9yIGVxdWlwbWVudCwgYW5kIHVuYXZhaWxhYmlsaXR5IG9yCisgICAgICBpbnRlcnJ1cHRpb24gb2Ygb3BlcmF0aW9ucy4KKyAgICA8L3A+CisgICAgPGgyIGlkPSJkaXNjbGFpbWVyIj42LiBESVNDTEFJTUVSIE9GIExJQUJJTElUWTwvaDI+CisgICAgPHA+RVhDRVBUIEFTIEVYUFJFU1NMWSBTRVQgRk9SVEggSU4gVEhJUyBBR1JFRU1FTlQsIEFORCBUTyBUSEUgRVhURU5UIFBFUk1JVFRFRAorICAgICAgQlkgQVBQTElDQUJMRSBMQVcsIE5FSVRIRVIgUkVDSVBJRU5UIE5PUiBBTlkgQ09OVFJJQlVUT1JTIFNIQUxMIEhBVkUgQU5ZCisgICAgICBMSUFCSUxJVFkgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksCisgICAgICBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORyBXSVRIT1VUIExJTUlUQVRJT04gTE9TVCBQUk9GSVRTKSwKKyAgICAgIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgICAgICBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCisgICAgICBPVVQgT0YgVEhFIFVTRSBPUiBESVNUUklCVVRJT04gT0YgVEhFIFBST0dSQU0gT1IgVEhFIEVYRVJDSVNFIE9GIEFOWSBSSUdIVFMKKyAgICAgIEdSQU5URUQgSEVSRVVOREVSLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFUy4KKyAgICA8L3A+CisgICAgPGgyIGlkPSJnZW5lcmFsIj43LiBHRU5FUkFMPC9oMj4KKyAgICA8cD5JZiBhbnkgcHJvdmlzaW9uIG9mIHRoaXMgQWdyZWVtZW50IGlzIGludmFsaWQgb3IgdW5lbmZvcmNlYWJsZSB1bmRlcgorICAgICAgYXBwbGljYWJsZSBsYXcsIGl0IHNoYWxsIG5vdCBhZmZlY3QgdGhlIHZhbGlkaXR5IG9yIGVuZm9yY2VhYmlsaXR5IG9mIHRoZQorICAgICAgcmVtYWluZGVyIG9mIHRoZSB0ZXJtcyBvZiB0aGlzIEFncmVlbWVudCwgYW5kIHdpdGhvdXQgZnVydGhlciBhY3Rpb24gYnkgdGhlCisgICAgICBwYXJ0aWVzIGhlcmV0bywgc3VjaCBwcm92aXNpb24gc2hhbGwgYmUgcmVmb3JtZWQgdG8gdGhlIG1pbmltdW0gZXh0ZW50CisgICAgICBuZWNlc3NhcnkgdG8gbWFrZSBzdWNoIHByb3Zpc2lvbiB2YWxpZCBhbmQgZW5mb3JjZWFibGUuCisgICAgPC9wPgorICAgIDxwPklmIFJlY2lwaWVudCBpbnN0aXR1dGVzIHBhdGVudCBsaXRpZ2F0aW9uIGFnYWluc3QgYW55IGVudGl0eSAoaW5jbHVkaW5nIGEKKyAgICAgIGNyb3NzLWNsYWltIG9yIGNvdW50ZXJjbGFpbSBpbiBhIGxhd3N1aXQpIGFsbGVnaW5nIHRoYXQgdGhlIFByb2dyYW0gaXRzZWxmCisgICAgICAoZXhjbHVkaW5nIGNvbWJpbmF0aW9ucyBvZiB0aGUgUHJvZ3JhbSB3aXRoIG90aGVyIHNvZnR3YXJlIG9yIGhhcmR3YXJlKQorICAgICAgaW5mcmluZ2VzIHN1Y2ggUmVjaXBpZW50JiMwMzk7cyBwYXRlbnQocyksIHRoZW4gc3VjaCBSZWNpcGllbnQmIzAzOTtzIHJpZ2h0cyBncmFudGVkCisgICAgICB1bmRlciBTZWN0aW9uIDIoYikgc2hhbGwgdGVybWluYXRlIGFzIG9mIHRoZSBkYXRlIHN1Y2ggbGl0aWdhdGlvbiBpcyBmaWxlZC4KKyAgICA8L3A+CisgICAgPHA+QWxsIFJlY2lwaWVudCYjMDM5O3MgcmlnaHRzIHVuZGVyIHRoaXMgQWdyZWVtZW50IHNoYWxsIHRlcm1pbmF0ZSBpZiBpdCBmYWlscyB0bworICAgICAgY29tcGx5IHdpdGggYW55IG9mIHRoZSBtYXRlcmlhbCB0ZXJtcyBvciBjb25kaXRpb25zIG9mIHRoaXMgQWdyZWVtZW50IGFuZAorICAgICAgZG9lcyBub3QgY3VyZSBzdWNoIGZhaWx1cmUgaW4gYSByZWFzb25hYmxlIHBlcmlvZCBvZiB0aW1lIGFmdGVyIGJlY29taW5nCisgICAgICBhd2FyZSBvZiBzdWNoIG5vbmNvbXBsaWFuY2UuIElmIGFsbCBSZWNpcGllbnQmIzAzOTtzIHJpZ2h0cyB1bmRlciB0aGlzIEFncmVlbWVudAorICAgICAgdGVybWluYXRlLCBSZWNpcGllbnQgYWdyZWVzIHRvIGNlYXNlIHVzZSBhbmQgZGlzdHJpYnV0aW9uIG9mIHRoZSBQcm9ncmFtCisgICAgICBhcyBzb29uIGFzIHJlYXNvbmFibHkgcHJhY3RpY2FibGUuIEhvd2V2ZXIsIFJlY2lwaWVudCYjMDM5O3Mgb2JsaWdhdGlvbnMgdW5kZXIKKyAgICAgIHRoaXMgQWdyZWVtZW50IGFuZCBhbnkgbGljZW5zZXMgZ3JhbnRlZCBieSBSZWNpcGllbnQgcmVsYXRpbmcgdG8gdGhlCisgICAgICBQcm9ncmFtIHNoYWxsIGNvbnRpbnVlIGFuZCBzdXJ2aXZlLgorICAgIDwvcD4KKyAgICA8cD5FdmVyeW9uZSBpcyBwZXJtaXR0ZWQgdG8gY29weSBhbmQgZGlzdHJpYnV0ZSBjb3BpZXMgb2YgdGhpcyBBZ3JlZW1lbnQsCisgICAgICBidXQgaW4gb3JkZXIgdG8gYXZvaWQgaW5jb25zaXN0ZW5jeSB0aGUgQWdyZWVtZW50IGlzIGNvcHlyaWdodGVkIGFuZCBtYXkKKyAgICAgIG9ubHkgYmUgbW9kaWZpZWQgaW4gdGhlIGZvbGxvd2luZyBtYW5uZXIuIFRoZSBBZ3JlZW1lbnQgU3Rld2FyZCByZXNlcnZlcworICAgICAgdGhlIHJpZ2h0IHRvIHB1Ymxpc2ggbmV3IHZlcnNpb25zIChpbmNsdWRpbmcgcmV2aXNpb25zKSBvZiB0aGlzIEFncmVlbWVudAorICAgICAgZnJvbSB0aW1lIHRvIHRpbWUuIE5vIG9uZSBvdGhlciB0aGFuIHRoZSBBZ3JlZW1lbnQgU3Rld2FyZCBoYXMgdGhlIHJpZ2h0CisgICAgICB0byBtb2RpZnkgdGhpcyBBZ3JlZW1lbnQuIFRoZSBFY2xpcHNlIEZvdW5kYXRpb24gaXMgdGhlIGluaXRpYWwgQWdyZWVtZW50CisgICAgICBTdGV3YXJkLiBUaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1heSBhc3NpZ24gdGhlIHJlc3BvbnNpYmlsaXR5IHRvIHNlcnZlIGFzCisgICAgICB0aGUgQWdyZWVtZW50IFN0ZXdhcmQgdG8gYSBzdWl0YWJsZSBzZXBhcmF0ZSBlbnRpdHkuIEVhY2ggbmV3IHZlcnNpb24gb2YKKyAgICAgIHRoZSBBZ3JlZW1lbnQgd2lsbCBiZSBnaXZlbiBhIGRpc3Rpbmd1aXNoaW5nIHZlcnNpb24gbnVtYmVyLiBUaGUgUHJvZ3JhbQorICAgICAgKGluY2x1ZGluZyBDb250cmlidXRpb25zKSBtYXkgYWx3YXlzIGJlIERpc3RyaWJ1dGVkIHN1YmplY3QgdG8gdGhlIHZlcnNpb24KKyAgICAgIG9mIHRoZSBBZ3JlZW1lbnQgdW5kZXIgd2hpY2ggaXQgd2FzIHJlY2VpdmVkLiBJbiBhZGRpdGlvbiwgYWZ0ZXIgYSBuZXcKKyAgICAgIHZlcnNpb24gb2YgdGhlIEFncmVlbWVudCBpcyBwdWJsaXNoZWQsIENvbnRyaWJ1dG9yIG1heSBlbGVjdCB0byBEaXN0cmlidXRlCisgICAgICB0aGUgUHJvZ3JhbSAoaW5jbHVkaW5nIGl0cyBDb250cmlidXRpb25zKSB1bmRlciB0aGUgbmV3IHZlcnNpb24uCisgICAgPC9wPgorICAgIDxwPkV4Y2VwdCBhcyBleHByZXNzbHkgc3RhdGVkIGluIFNlY3Rpb25zIDIoYSkgYW5kIDIoYikgYWJvdmUsIFJlY2lwaWVudAorICAgICAgcmVjZWl2ZXMgbm8gcmlnaHRzIG9yIGxpY2Vuc2VzIHRvIHRoZSBpbnRlbGxlY3R1YWwgcHJvcGVydHkgb2YgYW55CisgICAgICBDb250cmlidXRvciB1bmRlciB0aGlzIEFncmVlbWVudCwgd2hldGhlciBleHByZXNzbHksIGJ5IGltcGxpY2F0aW9uLAorICAgICAgZXN0b3BwZWwgb3Igb3RoZXJ3aXNlLiBBbGwgcmlnaHRzIGluIHRoZSBQcm9ncmFtIG5vdCBleHByZXNzbHkgZ3JhbnRlZAorICAgICAgdW5kZXIgdGhpcyBBZ3JlZW1lbnQgYXJlIHJlc2VydmVkLiBOb3RoaW5nIGluIHRoaXMgQWdyZWVtZW50IGlzIGludGVuZGVkCisgICAgICB0byBiZSBlbmZvcmNlYWJsZSBieSBhbnkgZW50aXR5IHRoYXQgaXMgbm90IGEgQ29udHJpYnV0b3Igb3IgUmVjaXBpZW50LgorICAgICAgTm8gdGhpcmQtcGFydHkgYmVuZWZpY2lhcnkgcmlnaHRzIGFyZSBjcmVhdGVkIHVuZGVyIHRoaXMgQWdyZWVtZW50LgorICAgIDwvcD4KKyAgICA8aDIgaWQ9ImV4aGliaXQtYSI+RXhoaWJpdCBBICZuZGFzaDsgRm9ybSBvZiBTZWNvbmRhcnkgTGljZW5zZXMgTm90aWNlPC9oMj4KKyAgICA8cD4mbGRxdW87VGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIAorICAgIAlTZWNvbmRhcnkgTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIAorICAgIAlpbiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSwgdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IHtuYW1lIGxpY2Vuc2UocyksCisgICAgCXZlcnNpb24ocyksIGFuZCBleGNlcHRpb25zIG9yIGFkZGl0aW9uYWwgcGVybWlzc2lvbnMgaGVyZX0uJnJkcXVvOworICAgIDwvcD4KKyAgICA8YmxvY2txdW90ZT4KKyAgICAgIDxwPlNpbXBseSBpbmNsdWRpbmcgYSBjb3B5IG9mIHRoaXMgQWdyZWVtZW50LCBpbmNsdWRpbmcgdGhpcyBFeGhpYml0IEEKKyAgICAgICAgaXMgbm90IHN1ZmZpY2llbnQgdG8gbGljZW5zZSB0aGUgU291cmNlIENvZGUgdW5kZXIgU2Vjb25kYXJ5IExpY2Vuc2VzLgorICAgICAgPC9wPgorICAgICAgPHA+SWYgaXQgaXMgbm90IHBvc3NpYmxlIG9yIGRlc2lyYWJsZSB0byBwdXQgdGhlIG5vdGljZSBpbiBhIHBhcnRpY3VsYXIgZmlsZSwKKyAgICAgICAgdGhlbiBZb3UgbWF5IGluY2x1ZGUgdGhlIG5vdGljZSBpbiBhIGxvY2F0aW9uIChzdWNoIGFzIGEgTElDRU5TRSBmaWxlIGluIGEKKyAgICAgICAgcmVsZXZhbnQgZGlyZWN0b3J5KSB3aGVyZSBhIHJlY2lwaWVudCB3b3VsZCBiZSBsaWtlbHkgdG8gbG9vayBmb3IKKyAgICAgICAgc3VjaCBhIG5vdGljZS4KKyAgICAgIDwvcD4KKyAgICAgIDxwPllvdSBtYXkgYWRkIGFkZGl0aW9uYWwgYWNjdXJhdGUgbm90aWNlcyBvZiBjb3B5cmlnaHQgb3duZXJzaGlwLjwvcD4KKyAgICA8L2Jsb2NrcXVvdGU+CisgIDwvYm9keT4KKzwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmRhdGFpbnRlcmNoYW5nZS5mZWF0dXJlL2VwbC12MTAuaHRtbCBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQuZGF0YWludGVyY2hhbmdlLmZlYXR1cmUvZXBsLXYxMC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMzk4YWNjLi4wMDAwMDAwCi0tLSBhL29yZy5lY2xpcHNlLm9zYnAueHRleHQuZGF0YWludGVyY2hhbmdlLmZlYXR1cmUvZXBsLXYxMC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjU5ICswLDAgQEAKLTwhLS0/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IklTTy04ODU5LTEiID8tLT4KLTwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIj48aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTEiPgotPHRpdGxlPkVjbGlwc2UgUHVibGljIExpY2Vuc2UgLSBWZXJzaW9uIDEuMDwvdGl0bGU+Ci08c3R5bGUgdHlwZT0idGV4dC9jc3MiPgotICBib2R5IHsKLSAgICBzaXplOiA4LjVpbiAxMS4waW47Ci0gICAgbWFyZ2luOiAwLjI1aW4gMC41aW4gMC4yNWluIDAuNWluOwotICAgIHRhYi1pbnRlcnZhbDogMC41aW47Ci0gICAgfQotICBwIHsgIAkKLSAgICBtYXJnaW4tbGVmdDogYXV0bzsKLSAgICBtYXJnaW4tdG9wOiAgMC41ZW07Ci0gICAgbWFyZ2luLWJvdHRvbTogMC41ZW07Ci0gICAgfQotICBwLmxpc3QgewotICAJbWFyZ2luLWxlZnQ6IDAuNWluOwotICAgIG1hcmdpbi10b3A6ICAwLjA1ZW07Ci0gICAgbWFyZ2luLWJvdHRvbTogMC4wNWVtOwotICAgIH0KLSAgPC9zdHlsZT4KLQotPC9oZWFkPgotCi08Ym9keSBsYW5nPSJFTi1VUyI+Ci0KLTxoMj5FY2xpcHNlIFB1YmxpYyBMaWNlbnNlIC0gdiAxLjA8L2gyPgotCi08cD5USEUgQUNDT01QQU5ZSU5HIFBST0dSQU0gSVMgUFJPVklERUQgVU5ERVIgVEhFIFRFUk1TIE9GIFRISVMgRUNMSVBTRQotUFVCTElDIExJQ0VOU0UgKCJBR1JFRU1FTlQiKS4gQU5ZIFVTRSwgUkVQUk9EVUNUSU9OIE9SCi1ESVNUUklCVVRJT04gT0YgVEhFIFBST0dSQU0gQ09OU1RJVFVURVMgUkVDSVBJRU5UJ1MgQUNDRVBUQU5DRSBPRiBUSElTCi1BR1JFRU1FTlQuPC9wPgotCi08cD48Yj4xLiBERUZJTklUSU9OUzwvYj48L3A+Ci0KLTxwPiJDb250cmlidXRpb24iIG1lYW5zOjwvcD4KLQotPHAgY2xhc3M9Imxpc3QiPmEpIGluIHRoZSBjYXNlIG9mIHRoZSBpbml0aWFsIENvbnRyaWJ1dG9yLCB0aGUgaW5pdGlhbAotY29kZSBhbmQgZG9jdW1lbnRhdGlvbiBkaXN0cmlidXRlZCB1bmRlciB0aGlzIEFncmVlbWVudCwgYW5kPC9wPgotPHAgY2xhc3M9Imxpc3QiPmIpIGluIHRoZSBjYXNlIG9mIGVhY2ggc3Vic2VxdWVudCBDb250cmlidXRvcjo8L3A+Ci08cCBjbGFzcz0ibGlzdCI+aSkgY2hhbmdlcyB0byB0aGUgUHJvZ3JhbSwgYW5kPC9wPgotPHAgY2xhc3M9Imxpc3QiPmlpKSBhZGRpdGlvbnMgdG8gdGhlIFByb2dyYW07PC9wPgotPHAgY2xhc3M9Imxpc3QiPndoZXJlIHN1Y2ggY2hhbmdlcyBhbmQvb3IgYWRkaXRpb25zIHRvIHRoZSBQcm9ncmFtCi1vcmlnaW5hdGUgZnJvbSBhbmQgYXJlIGRpc3RyaWJ1dGVkIGJ5IHRoYXQgcGFydGljdWxhciBDb250cmlidXRvci4gQQotQ29udHJpYnV0aW9uICdvcmlnaW5hdGVzJyBmcm9tIGEgQ29udHJpYnV0b3IgaWYgaXQgd2FzIGFkZGVkIHRvIHRoZQotUHJvZ3JhbSBieSBzdWNoIENvbnRyaWJ1dG9yIGl0c2VsZiBvciBhbnlvbmUgYWN0aW5nIG9uIHN1Y2gKLUNvbnRyaWJ1dG9yJ3MgYmVoYWxmLiBDb250cmlidXRpb25zIGRvIG5vdCBpbmNsdWRlIGFkZGl0aW9ucyB0byB0aGUKLVByb2dyYW0gd2hpY2g6IChpKSBhcmUgc2VwYXJhdGUgbW9kdWxlcyBvZiBzb2Z0d2FyZSBkaXN0cmlidXRlZCBpbgotY29uanVuY3Rpb24gd2l0aCB0aGUgUHJvZ3JhbSB1bmRlciB0aGVpciBvd24gbGljZW5zZSBhZ3JlZW1lbnQsIGFuZCAoaWkpCi1hcmUgbm90IGRlcml2YXRpdmUgd29ya3Mgb2YgdGhlIFByb2dyYW0uPC9wPgotCi08cD4iQ29udHJpYnV0b3IiIG1lYW5zIGFueSBwZXJzb24gb3IgZW50aXR5IHRoYXQgZGlzdHJpYnV0ZXMKLXRoZSBQcm9ncmFtLjwvcD4KLQotPHA+IkxpY2Vuc2VkIFBhdGVudHMiIG1lYW4gcGF0ZW50IGNsYWltcyBsaWNlbnNhYmxlIGJ5IGEKLUNvbnRyaWJ1dG9yIHdoaWNoIGFyZSBuZWNlc3NhcmlseSBpbmZyaW5nZWQgYnkgdGhlIHVzZSBvciBzYWxlIG9mIGl0cwotQ29udHJpYnV0aW9uIGFsb25lIG9yIHdoZW4gY29tYmluZWQgd2l0aCB0aGUgUHJvZ3JhbS48L3A+Ci0KLTxwPiJQcm9ncmFtIiBtZWFucyB0aGUgQ29udHJpYnV0aW9ucyBkaXN0cmlidXRlZCBpbiBhY2NvcmRhbmNlCi13aXRoIHRoaXMgQWdyZWVtZW50LjwvcD4KLQotPHA+IlJlY2lwaWVudCIgbWVhbnMgYW55b25lIHdobyByZWNlaXZlcyB0aGUgUHJvZ3JhbSB1bmRlcgotdGhpcyBBZ3JlZW1lbnQsIGluY2x1ZGluZyBhbGwgQ29udHJpYnV0b3JzLjwvcD4KLQotPHA+PGI+Mi4gR1JBTlQgT0YgUklHSFRTPC9iPjwvcD4KLQotPHAgY2xhc3M9Imxpc3QiPmEpIFN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoaXMgQWdyZWVtZW50LCBlYWNoCi1Db250cmlidXRvciBoZXJlYnkgZ3JhbnRzIFJlY2lwaWVudCBhIG5vbi1leGNsdXNpdmUsIHdvcmxkd2lkZSwKLXJveWFsdHktZnJlZSBjb3B5cmlnaHQgbGljZW5zZSB0byByZXByb2R1Y2UsIHByZXBhcmUgZGVyaXZhdGl2ZSB3b3Jrcwotb2YsIHB1YmxpY2x5IGRpc3BsYXksIHB1YmxpY2x5IHBlcmZvcm0sIGRpc3RyaWJ1dGUgYW5kIHN1YmxpY2Vuc2UgdGhlCi1Db250cmlidXRpb24gb2Ygc3VjaCBDb250cmlidXRvciwgaWYgYW55LCBhbmQgc3VjaCBkZXJpdmF0aXZlIHdvcmtzLCBpbgotc291cmNlIGNvZGUgYW5kIG9iamVjdCBjb2RlIGZvcm0uPC9wPgotCi08cCBjbGFzcz0ibGlzdCI+YikgU3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhpcyBBZ3JlZW1lbnQsIGVhY2gKLUNvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgUmVjaXBpZW50IGEgbm9uLWV4Y2x1c2l2ZSwgd29ybGR3aWRlLAotcm95YWx0eS1mcmVlIHBhdGVudCBsaWNlbnNlIHVuZGVyIExpY2Vuc2VkIFBhdGVudHMgdG8gbWFrZSwgdXNlLCBzZWxsLAotb2ZmZXIgdG8gc2VsbCwgaW1wb3J0IGFuZCBvdGhlcndpc2UgdHJhbnNmZXIgdGhlIENvbnRyaWJ1dGlvbiBvZiBzdWNoCi1Db250cmlidXRvciwgaWYgYW55LCBpbiBzb3VyY2UgY29kZSBhbmQgb2JqZWN0IGNvZGUgZm9ybS4gVGhpcyBwYXRlbnQKLWxpY2Vuc2Ugc2hhbGwgYXBwbHkgdG8gdGhlIGNvbWJpbmF0aW9uIG9mIHRoZSBDb250cmlidXRpb24gYW5kIHRoZQotUHJvZ3JhbSBpZiwgYXQgdGhlIHRpbWUgdGhlIENvbnRyaWJ1dGlvbiBpcyBhZGRlZCBieSB0aGUgQ29udHJpYnV0b3IsCi1zdWNoIGFkZGl0aW9uIG9mIHRoZSBDb250cmlidXRpb24gY2F1c2VzIHN1Y2ggY29tYmluYXRpb24gdG8gYmUgY292ZXJlZAotYnkgdGhlIExpY2Vuc2VkIFBhdGVudHMuIFRoZSBwYXRlbnQgbGljZW5zZSBzaGFsbCBub3QgYXBwbHkgdG8gYW55IG90aGVyCi1jb21iaW5hdGlvbnMgd2hpY2ggaW5jbHVkZSB0aGUgQ29udHJpYnV0aW9uLiBObyBoYXJkd2FyZSBwZXIgc2UgaXMKLWxpY2Vuc2VkIGhlcmV1bmRlci48L3A+Ci0KLTxwIGNsYXNzPSJsaXN0Ij5jKSBSZWNpcGllbnQgdW5kZXJzdGFuZHMgdGhhdCBhbHRob3VnaCBlYWNoIENvbnRyaWJ1dG9yCi1ncmFudHMgdGhlIGxpY2Vuc2VzIHRvIGl0cyBDb250cmlidXRpb25zIHNldCBmb3J0aCBoZXJlaW4sIG5vIGFzc3VyYW5jZXMKLWFyZSBwcm92aWRlZCBieSBhbnkgQ29udHJpYnV0b3IgdGhhdCB0aGUgUHJvZ3JhbSBkb2VzIG5vdCBpbmZyaW5nZSB0aGUKLXBhdGVudCBvciBvdGhlciBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIG9mIGFueSBvdGhlciBlbnRpdHkuIEVhY2gKLUNvbnRyaWJ1dG9yIGRpc2NsYWltcyBhbnkgbGlhYmlsaXR5IHRvIFJlY2lwaWVudCBmb3IgY2xhaW1zIGJyb3VnaHQgYnkKLWFueSBvdGhlciBlbnRpdHkgYmFzZWQgb24gaW5mcmluZ2VtZW50IG9mIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMKLW9yIG90aGVyd2lzZS4gQXMgYSBjb25kaXRpb24gdG8gZXhlcmNpc2luZyB0aGUgcmlnaHRzIGFuZCBsaWNlbnNlcwotZ3JhbnRlZCBoZXJldW5kZXIsIGVhY2ggUmVjaXBpZW50IGhlcmVieSBhc3N1bWVzIHNvbGUgcmVzcG9uc2liaWxpdHkgdG8KLXNlY3VyZSBhbnkgb3RoZXIgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBuZWVkZWQsIGlmIGFueS4gRm9yCi1leGFtcGxlLCBpZiBhIHRoaXJkIHBhcnR5IHBhdGVudCBsaWNlbnNlIGlzIHJlcXVpcmVkIHRvIGFsbG93IFJlY2lwaWVudAotdG8gZGlzdHJpYnV0ZSB0aGUgUHJvZ3JhbSwgaXQgaXMgUmVjaXBpZW50J3MgcmVzcG9uc2liaWxpdHkgdG8gYWNxdWlyZQotdGhhdCBsaWNlbnNlIGJlZm9yZSBkaXN0cmlidXRpbmcgdGhlIFByb2dyYW0uPC9wPgotCi08cCBjbGFzcz0ibGlzdCI+ZCkgRWFjaCBDb250cmlidXRvciByZXByZXNlbnRzIHRoYXQgdG8gaXRzIGtub3dsZWRnZSBpdAotaGFzIHN1ZmZpY2llbnQgY29weXJpZ2h0IHJpZ2h0cyBpbiBpdHMgQ29udHJpYnV0aW9uLCBpZiBhbnksIHRvIGdyYW50Ci10aGUgY29weXJpZ2h0IGxpY2Vuc2Ugc2V0IGZvcnRoIGluIHRoaXMgQWdyZWVtZW50LjwvcD4KLQotPHA+PGI+My4gUkVRVUlSRU1FTlRTPC9iPjwvcD4KLQotPHA+QSBDb250cmlidXRvciBtYXkgY2hvb3NlIHRvIGRpc3RyaWJ1dGUgdGhlIFByb2dyYW0gaW4gb2JqZWN0IGNvZGUKLWZvcm0gdW5kZXIgaXRzIG93biBsaWNlbnNlIGFncmVlbWVudCwgcHJvdmlkZWQgdGhhdDo8L3A+Ci0KLTxwIGNsYXNzPSJsaXN0Ij5hKSBpdCBjb21wbGllcyB3aXRoIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGlzCi1BZ3JlZW1lbnQ7IGFuZDwvcD4KLQotPHAgY2xhc3M9Imxpc3QiPmIpIGl0cyBsaWNlbnNlIGFncmVlbWVudDo8L3A+Ci0KLTxwIGNsYXNzPSJsaXN0Ij5pKSBlZmZlY3RpdmVseSBkaXNjbGFpbXMgb24gYmVoYWxmIG9mIGFsbCBDb250cmlidXRvcnMKLWFsbCB3YXJyYW50aWVzIGFuZCBjb25kaXRpb25zLCBleHByZXNzIGFuZCBpbXBsaWVkLCBpbmNsdWRpbmcgd2FycmFudGllcwotb3IgY29uZGl0aW9ucyBvZiB0aXRsZSBhbmQgbm9uLWluZnJpbmdlbWVudCwgYW5kIGltcGxpZWQgd2FycmFudGllcyBvcgotY29uZGl0aW9ucyBvZiBtZXJjaGFudGFiaWxpdHkgYW5kIGZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlOzwvcD4KLQotPHAgY2xhc3M9Imxpc3QiPmlpKSBlZmZlY3RpdmVseSBleGNsdWRlcyBvbiBiZWhhbGYgb2YgYWxsIENvbnRyaWJ1dG9ycwotYWxsIGxpYWJpbGl0eSBmb3IgZGFtYWdlcywgaW5jbHVkaW5nIGRpcmVjdCwgaW5kaXJlY3QsIHNwZWNpYWwsCi1pbmNpZGVudGFsIGFuZCBjb25zZXF1ZW50aWFsIGRhbWFnZXMsIHN1Y2ggYXMgbG9zdCBwcm9maXRzOzwvcD4KLQotPHAgY2xhc3M9Imxpc3QiPmlpaSkgc3RhdGVzIHRoYXQgYW55IHByb3Zpc2lvbnMgd2hpY2ggZGlmZmVyIGZyb20gdGhpcwotQWdyZWVtZW50IGFyZSBvZmZlcmVkIGJ5IHRoYXQgQ29udHJpYnV0b3IgYWxvbmUgYW5kIG5vdCBieSBhbnkgb3RoZXIKLXBhcnR5OyBhbmQ8L3A+Ci0KLTxwIGNsYXNzPSJsaXN0Ij5pdikgc3RhdGVzIHRoYXQgc291cmNlIGNvZGUgZm9yIHRoZSBQcm9ncmFtIGlzIGF2YWlsYWJsZQotZnJvbSBzdWNoIENvbnRyaWJ1dG9yLCBhbmQgaW5mb3JtcyBsaWNlbnNlZXMgaG93IHRvIG9idGFpbiBpdCBpbiBhCi1yZWFzb25hYmxlIG1hbm5lciBvbiBvciB0aHJvdWdoIGEgbWVkaXVtIGN1c3RvbWFyaWx5IHVzZWQgZm9yIHNvZnR3YXJlCi1leGNoYW5nZS48L3A+Ci0KLTxwPldoZW4gdGhlIFByb2dyYW0gaXMgbWFkZSBhdmFpbGFibGUgaW4gc291cmNlIGNvZGUgZm9ybTo8L3A+Ci0KLTxwIGNsYXNzPSJsaXN0Ij5hKSBpdCBtdXN0IGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoaXMgQWdyZWVtZW50OyBhbmQ8L3A+Ci0KLTxwIGNsYXNzPSJsaXN0Ij5iKSBhIGNvcHkgb2YgdGhpcyBBZ3JlZW1lbnQgbXVzdCBiZSBpbmNsdWRlZCB3aXRoIGVhY2gKLWNvcHkgb2YgdGhlIFByb2dyYW0uPC9wPgotCi08cD5Db250cmlidXRvcnMgbWF5IG5vdCByZW1vdmUgb3IgYWx0ZXIgYW55IGNvcHlyaWdodCBub3RpY2VzIGNvbnRhaW5lZAotd2l0aGluIHRoZSBQcm9ncmFtLjwvcD4KLQotPHA+RWFjaCBDb250cmlidXRvciBtdXN0IGlkZW50aWZ5IGl0c2VsZiBhcyB0aGUgb3JpZ2luYXRvciBvZiBpdHMKLUNvbnRyaWJ1dGlvbiwgaWYgYW55LCBpbiBhIG1hbm5lciB0aGF0IHJlYXNvbmFibHkgYWxsb3dzIHN1YnNlcXVlbnQKLVJlY2lwaWVudHMgdG8gaWRlbnRpZnkgdGhlIG9yaWdpbmF0b3Igb2YgdGhlIENvbnRyaWJ1dGlvbi48L3A+Ci0KLTxwPjxiPjQuIENPTU1FUkNJQUwgRElTVFJJQlVUSU9OPC9iPjwvcD4KLQotPHA+Q29tbWVyY2lhbCBkaXN0cmlidXRvcnMgb2Ygc29mdHdhcmUgbWF5IGFjY2VwdCBjZXJ0YWluCi1yZXNwb25zaWJpbGl0aWVzIHdpdGggcmVzcGVjdCB0byBlbmQgdXNlcnMsIGJ1c2luZXNzIHBhcnRuZXJzIGFuZCB0aGUKLWxpa2UuIFdoaWxlIHRoaXMgbGljZW5zZSBpcyBpbnRlbmRlZCB0byBmYWNpbGl0YXRlIHRoZSBjb21tZXJjaWFsIHVzZSBvZgotdGhlIFByb2dyYW0sIHRoZSBDb250cmlidXRvciB3aG8gaW5jbHVkZXMgdGhlIFByb2dyYW0gaW4gYSBjb21tZXJjaWFsCi1wcm9kdWN0IG9mZmVyaW5nIHNob3VsZCBkbyBzbyBpbiBhIG1hbm5lciB3aGljaCBkb2VzIG5vdCBjcmVhdGUKLXBvdGVudGlhbCBsaWFiaWxpdHkgZm9yIG90aGVyIENvbnRyaWJ1dG9ycy4gVGhlcmVmb3JlLCBpZiBhIENvbnRyaWJ1dG9yCi1pbmNsdWRlcyB0aGUgUHJvZ3JhbSBpbiBhIGNvbW1lcmNpYWwgcHJvZHVjdCBvZmZlcmluZywgc3VjaCBDb250cmlidXRvcgotKCJDb21tZXJjaWFsIENvbnRyaWJ1dG9yIikgaGVyZWJ5IGFncmVlcyB0byBkZWZlbmQgYW5kCi1pbmRlbW5pZnkgZXZlcnkgb3RoZXIgQ29udHJpYnV0b3IgKCJJbmRlbW5pZmllZCBDb250cmlidXRvciIpCi1hZ2FpbnN0IGFueSBsb3NzZXMsIGRhbWFnZXMgYW5kIGNvc3RzIChjb2xsZWN0aXZlbHkgIkxvc3NlcyIpCi1hcmlzaW5nIGZyb20gY2xhaW1zLCBsYXdzdWl0cyBhbmQgb3RoZXIgbGVnYWwgYWN0aW9ucyBicm91Z2h0IGJ5IGEgdGhpcmQKLXBhcnR5IGFnYWluc3QgdGhlIEluZGVtbmlmaWVkIENvbnRyaWJ1dG9yIHRvIHRoZSBleHRlbnQgY2F1c2VkIGJ5IHRoZQotYWN0cyBvciBvbWlzc2lvbnMgb2Ygc3VjaCBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIGluIGNvbm5lY3Rpb24gd2l0aCBpdHMKLWRpc3RyaWJ1dGlvbiBvZiB0aGUgUHJvZ3JhbSBpbiBhIGNvbW1lcmNpYWwgcHJvZHVjdCBvZmZlcmluZy4gVGhlCi1vYmxpZ2F0aW9ucyBpbiB0aGlzIHNlY3Rpb24gZG8gbm90IGFwcGx5IHRvIGFueSBjbGFpbXMgb3IgTG9zc2VzCi1yZWxhdGluZyB0byBhbnkgYWN0dWFsIG9yIGFsbGVnZWQgaW50ZWxsZWN0dWFsIHByb3BlcnR5IGluZnJpbmdlbWVudC4gSW4KLW9yZGVyIHRvIHF1YWxpZnksIGFuIEluZGVtbmlmaWVkIENvbnRyaWJ1dG9yIG11c3Q6IGEpIHByb21wdGx5IG5vdGlmeQotdGhlIENvbW1lcmNpYWwgQ29udHJpYnV0b3IgaW4gd3JpdGluZyBvZiBzdWNoIGNsYWltLCBhbmQgYikgYWxsb3cgdGhlCi1Db21tZXJjaWFsIENvbnRyaWJ1dG9yIHRvIGNvbnRyb2wsIGFuZCBjb29wZXJhdGUgd2l0aCB0aGUgQ29tbWVyY2lhbAotQ29udHJpYnV0b3IgaW4sIHRoZSBkZWZlbnNlIGFuZCBhbnkgcmVsYXRlZCBzZXR0bGVtZW50IG5lZ290aWF0aW9ucy4gVGhlCi1JbmRlbW5pZmllZCBDb250cmlidXRvciBtYXkgcGFydGljaXBhdGUgaW4gYW55IHN1Y2ggY2xhaW0gYXQgaXRzIG93bgotZXhwZW5zZS48L3A+Ci0KLTxwPkZvciBleGFtcGxlLCBhIENvbnRyaWJ1dG9yIG1pZ2h0IGluY2x1ZGUgdGhlIFByb2dyYW0gaW4gYSBjb21tZXJjaWFsCi1wcm9kdWN0IG9mZmVyaW5nLCBQcm9kdWN0IFguIFRoYXQgQ29udHJpYnV0b3IgaXMgdGhlbiBhIENvbW1lcmNpYWwKLUNvbnRyaWJ1dG9yLiBJZiB0aGF0IENvbW1lcmNpYWwgQ29udHJpYnV0b3IgdGhlbiBtYWtlcyBwZXJmb3JtYW5jZQotY2xhaW1zLCBvciBvZmZlcnMgd2FycmFudGllcyByZWxhdGVkIHRvIFByb2R1Y3QgWCwgdGhvc2UgcGVyZm9ybWFuY2UKLWNsYWltcyBhbmQgd2FycmFudGllcyBhcmUgc3VjaCBDb21tZXJjaWFsIENvbnRyaWJ1dG9yJ3MgcmVzcG9uc2liaWxpdHkKLWFsb25lLiBVbmRlciB0aGlzIHNlY3Rpb24sIHRoZSBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIHdvdWxkIGhhdmUgdG8KLWRlZmVuZCBjbGFpbXMgYWdhaW5zdCB0aGUgb3RoZXIgQ29udHJpYnV0b3JzIHJlbGF0ZWQgdG8gdGhvc2UKLXBlcmZvcm1hbmNlIGNsYWltcyBhbmQgd2FycmFudGllcywgYW5kIGlmIGEgY291cnQgcmVxdWlyZXMgYW55IG90aGVyCi1Db250cmlidXRvciB0byBwYXkgYW55IGRhbWFnZXMgYXMgYSByZXN1bHQsIHRoZSBDb21tZXJjaWFsIENvbnRyaWJ1dG9yCi1tdXN0IHBheSB0aG9zZSBkYW1hZ2VzLjwvcD4KLQotPHA+PGI+NS4gTk8gV0FSUkFOVFk8L2I+PC9wPgotCi08cD5FWENFUFQgQVMgRVhQUkVTU0xZIFNFVCBGT1JUSCBJTiBUSElTIEFHUkVFTUVOVCwgVEhFIFBST0dSQU0gSVMKLVBST1ZJREVEIE9OIEFOICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TCi1PRiBBTlkgS0lORCwgRUlUSEVSIEVYUFJFU1MgT1IgSU1QTElFRCBJTkNMVURJTkcsIFdJVEhPVVQgTElNSVRBVElPTiwKLUFOWSBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgVElUTEUsIE5PTi1JTkZSSU5HRU1FTlQsIE1FUkNIQU5UQUJJTElUWQotT1IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIEVhY2ggUmVjaXBpZW50IGlzIHNvbGVseQotcmVzcG9uc2libGUgZm9yIGRldGVybWluaW5nIHRoZSBhcHByb3ByaWF0ZW5lc3Mgb2YgdXNpbmcgYW5kCi1kaXN0cmlidXRpbmcgdGhlIFByb2dyYW0gYW5kIGFzc3VtZXMgYWxsIHJpc2tzIGFzc29jaWF0ZWQgd2l0aCBpdHMKLWV4ZXJjaXNlIG9mIHJpZ2h0cyB1bmRlciB0aGlzIEFncmVlbWVudCAsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8KLXRoZSByaXNrcyBhbmQgY29zdHMgb2YgcHJvZ3JhbSBlcnJvcnMsIGNvbXBsaWFuY2Ugd2l0aCBhcHBsaWNhYmxlIGxhd3MsCi1kYW1hZ2UgdG8gb3IgbG9zcyBvZiBkYXRhLCBwcm9ncmFtcyBvciBlcXVpcG1lbnQsIGFuZCB1bmF2YWlsYWJpbGl0eSBvcgotaW50ZXJydXB0aW9uIG9mIG9wZXJhdGlvbnMuPC9wPgotCi08cD48Yj42LiBESVNDTEFJTUVSIE9GIExJQUJJTElUWTwvYj48L3A+Ci0KLTxwPkVYQ0VQVCBBUyBFWFBSRVNTTFkgU0VUIEZPUlRIIElOIFRISVMgQUdSRUVNRU5ULCBORUlUSEVSIFJFQ0lQSUVOVAotTk9SIEFOWSBDT05UUklCVVRPUlMgU0hBTEwgSEFWRSBBTlkgTElBQklMSVRZIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKLUlOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcKLVdJVEhPVVQgTElNSVRBVElPTiBMT1NUIFBST0ZJVFMpLCBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRgotTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcKLU5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT1IKLURJU1RSSUJVVElPTiBPRiBUSEUgUFJPR1JBTSBPUiBUSEUgRVhFUkNJU0UgT0YgQU5ZIFJJR0hUUyBHUkFOVEVECi1IRVJFVU5ERVIsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0VTLjwvcD4KLQotPHA+PGI+Ny4gR0VORVJBTDwvYj48L3A+Ci0KLTxwPklmIGFueSBwcm92aXNpb24gb2YgdGhpcyBBZ3JlZW1lbnQgaXMgaW52YWxpZCBvciB1bmVuZm9yY2VhYmxlIHVuZGVyCi1hcHBsaWNhYmxlIGxhdywgaXQgc2hhbGwgbm90IGFmZmVjdCB0aGUgdmFsaWRpdHkgb3IgZW5mb3JjZWFiaWxpdHkgb2YKLXRoZSByZW1haW5kZXIgb2YgdGhlIHRlcm1zIG9mIHRoaXMgQWdyZWVtZW50LCBhbmQgd2l0aG91dCBmdXJ0aGVyIGFjdGlvbgotYnkgdGhlIHBhcnRpZXMgaGVyZXRvLCBzdWNoIHByb3Zpc2lvbiBzaGFsbCBiZSByZWZvcm1lZCB0byB0aGUgbWluaW11bQotZXh0ZW50IG5lY2Vzc2FyeSB0byBtYWtlIHN1Y2ggcHJvdmlzaW9uIHZhbGlkIGFuZCBlbmZvcmNlYWJsZS48L3A+Ci0KLTxwPklmIFJlY2lwaWVudCBpbnN0aXR1dGVzIHBhdGVudCBsaXRpZ2F0aW9uIGFnYWluc3QgYW55IGVudGl0eQotKGluY2x1ZGluZyBhIGNyb3NzLWNsYWltIG9yIGNvdW50ZXJjbGFpbSBpbiBhIGxhd3N1aXQpIGFsbGVnaW5nIHRoYXQgdGhlCi1Qcm9ncmFtIGl0c2VsZiAoZXhjbHVkaW5nIGNvbWJpbmF0aW9ucyBvZiB0aGUgUHJvZ3JhbSB3aXRoIG90aGVyCi1zb2Z0d2FyZSBvciBoYXJkd2FyZSkgaW5mcmluZ2VzIHN1Y2ggUmVjaXBpZW50J3MgcGF0ZW50KHMpLCB0aGVuIHN1Y2gKLVJlY2lwaWVudCdzIHJpZ2h0cyBncmFudGVkIHVuZGVyIFNlY3Rpb24gMihiKSBzaGFsbCB0ZXJtaW5hdGUgYXMgb2YgdGhlCi1kYXRlIHN1Y2ggbGl0aWdhdGlvbiBpcyBmaWxlZC48L3A+Ci0KLTxwPkFsbCBSZWNpcGllbnQncyByaWdodHMgdW5kZXIgdGhpcyBBZ3JlZW1lbnQgc2hhbGwgdGVybWluYXRlIGlmIGl0Ci1mYWlscyB0byBjb21wbHkgd2l0aCBhbnkgb2YgdGhlIG1hdGVyaWFsIHRlcm1zIG9yIGNvbmRpdGlvbnMgb2YgdGhpcwotQWdyZWVtZW50IGFuZCBkb2VzIG5vdCBjdXJlIHN1Y2ggZmFpbHVyZSBpbiBhIHJlYXNvbmFibGUgcGVyaW9kIG9mIHRpbWUKLWFmdGVyIGJlY29taW5nIGF3YXJlIG9mIHN1Y2ggbm9uY29tcGxpYW5jZS4gSWYgYWxsIFJlY2lwaWVudCdzIHJpZ2h0cwotdW5kZXIgdGhpcyBBZ3JlZW1lbnQgdGVybWluYXRlLCBSZWNpcGllbnQgYWdyZWVzIHRvIGNlYXNlIHVzZSBhbmQKLWRpc3RyaWJ1dGlvbiBvZiB0aGUgUHJvZ3JhbSBhcyBzb29uIGFzIHJlYXNvbmFibHkgcHJhY3RpY2FibGUuIEhvd2V2ZXIsCi1SZWNpcGllbnQncyBvYmxpZ2F0aW9ucyB1bmRlciB0aGlzIEFncmVlbWVudCBhbmQgYW55IGxpY2Vuc2VzIGdyYW50ZWQgYnkKLVJlY2lwaWVudCByZWxhdGluZyB0byB0aGUgUHJvZ3JhbSBzaGFsbCBjb250aW51ZSBhbmQgc3Vydml2ZS48L3A+Ci0KLTxwPkV2ZXJ5b25lIGlzIHBlcm1pdHRlZCB0byBjb3B5IGFuZCBkaXN0cmlidXRlIGNvcGllcyBvZiB0aGlzCi1BZ3JlZW1lbnQsIGJ1dCBpbiBvcmRlciB0byBhdm9pZCBpbmNvbnNpc3RlbmN5IHRoZSBBZ3JlZW1lbnQgaXMKLWNvcHlyaWdodGVkIGFuZCBtYXkgb25seSBiZSBtb2RpZmllZCBpbiB0aGUgZm9sbG93aW5nIG1hbm5lci4gVGhlCi1BZ3JlZW1lbnQgU3Rld2FyZCByZXNlcnZlcyB0aGUgcmlnaHQgdG8gcHVibGlzaCBuZXcgdmVyc2lvbnMgKGluY2x1ZGluZwotcmV2aXNpb25zKSBvZiB0aGlzIEFncmVlbWVudCBmcm9tIHRpbWUgdG8gdGltZS4gTm8gb25lIG90aGVyIHRoYW4gdGhlCi1BZ3JlZW1lbnQgU3Rld2FyZCBoYXMgdGhlIHJpZ2h0IHRvIG1vZGlmeSB0aGlzIEFncmVlbWVudC4gVGhlIEVjbGlwc2UKLUZvdW5kYXRpb24gaXMgdGhlIGluaXRpYWwgQWdyZWVtZW50IFN0ZXdhcmQuIFRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWF5Ci1hc3NpZ24gdGhlIHJlc3BvbnNpYmlsaXR5IHRvIHNlcnZlIGFzIHRoZSBBZ3JlZW1lbnQgU3Rld2FyZCB0byBhCi1zdWl0YWJsZSBzZXBhcmF0ZSBlbnRpdHkuIEVhY2ggbmV3IHZlcnNpb24gb2YgdGhlIEFncmVlbWVudCB3aWxsIGJlCi1naXZlbiBhIGRpc3Rpbmd1aXNoaW5nIHZlcnNpb24gbnVtYmVyLiBUaGUgUHJvZ3JhbSAoaW5jbHVkaW5nCi1Db250cmlidXRpb25zKSBtYXkgYWx3YXlzIGJlIGRpc3RyaWJ1dGVkIHN1YmplY3QgdG8gdGhlIHZlcnNpb24gb2YgdGhlCi1BZ3JlZW1lbnQgdW5kZXIgd2hpY2ggaXQgd2FzIHJlY2VpdmVkLiBJbiBhZGRpdGlvbiwgYWZ0ZXIgYSBuZXcgdmVyc2lvbgotb2YgdGhlIEFncmVlbWVudCBpcyBwdWJsaXNoZWQsIENvbnRyaWJ1dG9yIG1heSBlbGVjdCB0byBkaXN0cmlidXRlIHRoZQotUHJvZ3JhbSAoaW5jbHVkaW5nIGl0cyBDb250cmlidXRpb25zKSB1bmRlciB0aGUgbmV3IHZlcnNpb24uIEV4Y2VwdCBhcwotZXhwcmVzc2x5IHN0YXRlZCBpbiBTZWN0aW9ucyAyKGEpIGFuZCAyKGIpIGFib3ZlLCBSZWNpcGllbnQgcmVjZWl2ZXMgbm8KLXJpZ2h0cyBvciBsaWNlbnNlcyB0byB0aGUgaW50ZWxsZWN0dWFsIHByb3BlcnR5IG9mIGFueSBDb250cmlidXRvciB1bmRlcgotdGhpcyBBZ3JlZW1lbnQsIHdoZXRoZXIgZXhwcmVzc2x5LCBieSBpbXBsaWNhdGlvbiwgZXN0b3BwZWwgb3IKLW90aGVyd2lzZS4gQWxsIHJpZ2h0cyBpbiB0aGUgUHJvZ3JhbSBub3QgZXhwcmVzc2x5IGdyYW50ZWQgdW5kZXIgdGhpcwotQWdyZWVtZW50IGFyZSByZXNlcnZlZC48L3A+Ci0KLTxwPlRoaXMgQWdyZWVtZW50IGlzIGdvdmVybmVkIGJ5IHRoZSBsYXdzIG9mIHRoZSBTdGF0ZSBvZiBOZXcgWW9yayBhbmQKLXRoZSBpbnRlbGxlY3R1YWwgcHJvcGVydHkgbGF3cyBvZiB0aGUgVW5pdGVkIFN0YXRlcyBvZiBBbWVyaWNhLiBObyBwYXJ0eQotdG8gdGhpcyBBZ3JlZW1lbnQgd2lsbCBicmluZyBhIGxlZ2FsIGFjdGlvbiB1bmRlciB0aGlzIEFncmVlbWVudCBtb3JlCi10aGFuIG9uZSB5ZWFyIGFmdGVyIHRoZSBjYXVzZSBvZiBhY3Rpb24gYXJvc2UuIEVhY2ggcGFydHkgd2FpdmVzIGl0cwotcmlnaHRzIHRvIGEganVyeSB0cmlhbCBpbiBhbnkgcmVzdWx0aW5nIGxpdGlnYXRpb24uPC9wPgotCi0KLQotPC9ib2R5PjwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmRhdGFpbnRlcmNoYW5nZS5mZWF0dXJlL2ZlYXR1cmUucHJvcGVydGllcyBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQuZGF0YWludGVyY2hhbmdlLmZlYXR1cmUvZmVhdHVyZS5wcm9wZXJ0aWVzCmluZGV4IDg4ZGM2YzIuLjE2Y2YyMTEgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLm9zYnAueHRleHQuZGF0YWludGVyY2hhbmdlLmZlYXR1cmUvZmVhdHVyZS5wcm9wZXJ0aWVzCisrKyBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQuZGF0YWludGVyY2hhbmdlLmZlYXR1cmUvZmVhdHVyZS5wcm9wZXJ0aWVzCkBAIC0xLDkgKzEsMTEgQEAKICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKICMgQ29weXJpZ2h0IChjKSAyMDExLCAyMDE2IC0gTG9ldHogR21iSCZDby5LRyAoNjkxMTUgSGVpZGVsYmVyZywgR2VybWFueSkuCiAjIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisjIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgMi4wIAogIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorIyBodHRwczovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLworIworIyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMAogIwogIyBDb250cmlidXRvcnM6CiAjICAgICBDcmlzdGlhbm8gR2F2aeNvIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCkBAIC0zMCw5ICszMiwxMSBAQAogY29weXJpZ2h0PVwKIENvcHlyaWdodCAoYykgMjAxMSwgMjAxNiAtIExvZXR6IEdtYkgmQ28uS0cgKDY5MTE1IEhlaWRlbGJlcmcsIEdlcm1hbnkpIFxuXAogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFsc1xuXAotYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wXG5cCithcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIDIuMCBcblwKIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0XG5cCi1odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbFxuXAoraHR0cHM6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC9cblwKK1xuXAorU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjBcblwKIFxuXAogIyMjIyMjIyMjIyMjIyMjIyBlbmQgb2YgY29weXJpZ2h0IHByb3BlcnR5ICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwogCkBAIC00NCwxMjYgKzQ4LDE0MyBAQAogIyBzaG91bGQgYmUgcGxhaW4gdGV4dCB2ZXJzaW9uIG9mIGxpY2Vuc2UgYWdyZWVtZW50IHBvaW50ZWQgdG8gYmUgImxpY2Vuc2VVUkwiCiBsaWNlbnNlPVwKIEVjbGlwc2UgRm91bmRhdGlvbiBTb2Z0d2FyZSBVc2VyIEFncmVlbWVudFxuXAotRmVicnVhcnkgMSwgMjAxMVxuXAorXG5cCitOb3ZlbWJlciAyMiwgMjAxN1xuXAogXG5cCiBVc2FnZSBPZiBDb250ZW50XG5cCiBcblwKLVRIRSBFQ0xJUFNFIEZPVU5EQVRJT04gTUFLRVMgQVZBSUxBQkxFIFNPRlRXQVJFLCBET0NVTUVOVEFUSU9OLCBJTkZPUk1BVElPTiBBTkQvT1JcblwKLU9USEVSIE1BVEVSSUFMUyBGT1IgT1BFTiBTT1VSQ0UgUFJPSkVDVFMgKENPTExFQ1RJVkVMWSAiQ09OVEVOVCIpLlxuXAotVVNFIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTXG5cCi1BR1JFRU1FTlQgQU5EL09SIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBMSUNFTlNFIEFHUkVFTUVOVFMgT1JcblwKLU5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuICBCWSBVU0lORyBUSEUgQ09OVEVOVCwgWU9VXG5cCi1BR1JFRSBUSEFUIFlPVVIgVVNFIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRISVMgQUdSRUVNRU5UXG5cCi1BTkQvT1IgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UU1xuXAotT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gIElGIFlPVSBETyBOT1QgQUdSRUUgVE8gVEhFXG5cCi1URVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTIEFHUkVFTUVOVCBBTkQgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TXG5cCi1PRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRFxuXAotQkVMT1csIFRIRU4gWU9VIE1BWSBOT1QgVVNFIFRIRSBDT05URU5ULlxuXAorVEhFIEVDTElQU0UgRk9VTkRBVElPTiBNQUtFUyBBVkFJTEFCTEUgU09GVFdBUkUsIERPQ1VNRU5UQVRJT04sIElORk9STUFUSU9OXG5cCitBTkQvT1IgT1RIRVIgTUFURVJJQUxTIEZPUiBPUEVOIFNPVVJDRSBQUk9KRUNUUyAoQ09MTEVDVElWRUxZICJDT05URU5UIikuIFVTRSBPRlxuXAorVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVMgQUdSRUVNRU5UIEFORC9PUiBUSEVcblwKK1RFUk1TIEFORCBDT05ESVRJT05TIE9GIExJQ0VOU0UgQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEXG5cCitCRUxPVy4gQlkgVVNJTkcgVEhFIENPTlRFTlQsIFlPVSBBR1JFRSBUSEFUIFlPVVIgVVNFIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEXG5cCitCWSBUSElTIEFHUkVFTUVOVCBBTkQvT1IgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0VcblwKK0FHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gSUYgWU9VIERPIE5PVCBBR1JFRSBUTyBUSEVcblwKK1RFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVMgQUdSRUVNRU5UIEFORCBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgQU5ZXG5cCitBUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLCBUSEVOIFlPVVxuXAorTUFZIE5PVCBVU0UgVEhFIENPTlRFTlQuXG5cCiBcblwKIEFwcGxpY2FibGUgTGljZW5zZXNcblwKIFxuXAotVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQsIGFsbCBDb250ZW50IG1hZGUgYXZhaWxhYmxlIGJ5IHRoZVxuXAotRWNsaXBzZSBGb3VuZGF0aW9uIGlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2ZcblwKLXRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wICgiRVBMIikuIEEgY29weSBvZiB0aGUgRVBMIGlzXG5cCi1wcm92aWRlZCB3aXRoIHRoaXMgQ29udGVudCBhbmQgaXMgYWxzbyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuXG5cCi1Gb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgIlByb2dyYW0iIHdpbGwgbWVhbiB0aGUgQ29udGVudC5cblwKK1VubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkLCBhbGwgQ29udGVudCBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uXG5cCitpcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlXG5cCitWZXJzaW9uIDIuMCAoIkVQTCIpLiBBIGNvcHkgb2YgdGhlIEVQTCBpcyBwcm92aWRlZCB3aXRoIHRoaXMgQ29udGVudCBhbmQgaXMgYWxzb1xuXAorYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4gRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsXG5cCisiUHJvZ3JhbSIgd2lsbCBtZWFuIHRoZSBDb250ZW50LlxuXAogXG5cCi1Db250ZW50IGluY2x1ZGVzLCBidXQgaXMgbm90IGxpbWl0ZWQgdG8sIHNvdXJjZSBjb2RlLCBvYmplY3QgY29kZSxcblwKLWRvY3VtZW50YXRpb24gYW5kIG90aGVyIGZpbGVzIG1haW50YWluZWQgaW4gdGhlIEVjbGlwc2UgRm91bmRhdGlvbiBzb3VyY2UgY29kZVxuXAotcmVwb3NpdG9yeSAoIlJlcG9zaXRvcnkiKSBpbiBzb2Z0d2FyZSBtb2R1bGVzICgiTW9kdWxlcyIpIGFuZCBtYWRlIGF2YWlsYWJsZVxuXAotYXMgZG93bmxvYWRhYmxlIGFyY2hpdmVzICgiRG93bmxvYWRzIikuXG5cCitDb250ZW50IGluY2x1ZGVzLCBidXQgaXMgbm90IGxpbWl0ZWQgdG8sIHNvdXJjZSBjb2RlLCBvYmplY3QgY29kZSwgZG9jdW1lbnRhdGlvblxuXAorYW5kIG90aGVyIGZpbGVzIG1haW50YWluZWQgaW4gdGhlIEVjbGlwc2UgRm91bmRhdGlvbiBzb3VyY2UgY29kZSByZXBvc2l0b3J5XG5cCisoIlJlcG9zaXRvcnkiKSBpbiBzb2Z0d2FyZSBtb2R1bGVzICgiTW9kdWxlcyIpIGFuZCBtYWRlIGF2YWlsYWJsZSBhc1xuXAorZG93bmxvYWRhYmxlIGFyY2hpdmVzICgiRG93bmxvYWRzIikuXG5cCiBcblwKLSAgICAgICAtIENvbnRlbnQgbWF5IGJlIHN0cnVjdHVyZWQgYW5kIHBhY2thZ2VkIGludG8gbW9kdWxlcyB0byBmYWNpbGl0YXRlIGRlbGl2ZXJpbmcsXG5cCi0gICAgICAgICBleHRlbmRpbmcsIGFuZCB1cGdyYWRpbmcgdGhlIENvbnRlbnQuIFR5cGljYWwgbW9kdWxlcyBtYXkgaW5jbHVkZSBwbHVnLWlucyAoIlBsdWctaW5zIiksXG5cCi0gICAgICAgICBwbHVnLWluIGZyYWdtZW50cyAoIkZyYWdtZW50cyIpLCBhbmQgZmVhdHVyZXMgKCJGZWF0dXJlcyIpLlxuXAotICAgICAgIC0gRWFjaCBQbHVnLWluIG9yIEZyYWdtZW50IG1heSBiZSBwYWNrYWdlZCBhcyBhIHN1Yi1kaXJlY3Rvcnkgb3IgSkFSIChKYXZhKFRNKSBBUmNoaXZlKVxuXAotICAgICAgICAgaW4gYSBkaXJlY3RvcnkgbmFtZWQgInBsdWdpbnMiLlxuXAotICAgICAgIC0gQSBGZWF0dXJlIGlzIGEgYnVuZGxlIG9mIG9uZSBvciBtb3JlIFBsdWctaW5zIGFuZC9vciBGcmFnbWVudHMgYW5kIGFzc29jaWF0ZWQgbWF0ZXJpYWwuXG5cCi0gICAgICAgICBFYWNoIEZlYXR1cmUgbWF5IGJlIHBhY2thZ2VkIGFzIGEgc3ViLWRpcmVjdG9yeSBpbiBhIGRpcmVjdG9yeSBuYW1lZCAiZmVhdHVyZXMiLlxuXAotICAgICAgICAgV2l0aGluIGEgRmVhdHVyZSwgZmlsZXMgbmFtZWQgImZlYXR1cmUueG1sIiBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uXG5cCi0gICAgICAgICBudW1iZXJzIG9mIHRoZSBQbHVnLWlucyBhbmQvb3IgRnJhZ21lbnRzIGFzc29jaWF0ZWQgd2l0aCB0aGF0IEZlYXR1cmUuXG5cCi0gICAgICAgLSBGZWF0dXJlcyBtYXkgYWxzbyBpbmNsdWRlIG90aGVyIEZlYXR1cmVzICgiSW5jbHVkZWQgRmVhdHVyZXMiKS4gV2l0aGluIGEgRmVhdHVyZSwgZmlsZXNcblwKLSAgICAgICAgIG5hbWVkICJmZWF0dXJlLnhtbCIgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mIEluY2x1ZGVkIEZlYXR1cmVzLlxuXAorLSAgIENvbnRlbnQgbWF5IGJlIHN0cnVjdHVyZWQgYW5kIHBhY2thZ2VkIGludG8gbW9kdWxlcyB0byBmYWNpbGl0YXRlXG5cCisgICAgZGVsaXZlcmluZywgZXh0ZW5kaW5nLCBhbmQgdXBncmFkaW5nIHRoZSBDb250ZW50LiBUeXBpY2FsIG1vZHVsZXMgbWF5XG5cCisgICAgaW5jbHVkZSBwbHVnLWlucyAoIlBsdWctaW5zIiksIHBsdWctaW4gZnJhZ21lbnRzICgiRnJhZ21lbnRzIiksIGFuZFxuXAorICAgIGZlYXR1cmVzICgiRmVhdHVyZXMiKS5cblwKKy0gICBFYWNoIFBsdWctaW4gb3IgRnJhZ21lbnQgbWF5IGJlIHBhY2thZ2VkIGFzIGEgc3ViLWRpcmVjdG9yeSBvciBKQVJcblwKKyAgICAoSmF2YeKEoiBBUmNoaXZlKSBpbiBhIGRpcmVjdG9yeSBuYW1lZCAicGx1Z2lucyIuXG5cCistICAgQSBGZWF0dXJlIGlzIGEgYnVuZGxlIG9mIG9uZSBvciBtb3JlIFBsdWctaW5zIGFuZC9vciBGcmFnbWVudHMgYW5kXG5cCisgICAgYXNzb2NpYXRlZCBtYXRlcmlhbC4gRWFjaCBGZWF0dXJlIG1heSBiZSBwYWNrYWdlZCBhcyBhIHN1Yi1kaXJlY3RvcnkgaW4gYVxuXAorICAgIGRpcmVjdG9yeSBuYW1lZCAiZmVhdHVyZXMiLiBXaXRoaW4gYSBGZWF0dXJlLCBmaWxlcyBuYW1lZCAiZmVhdHVyZS54bWwiIG1heVxuXAorICAgIGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mIHRoZSBQbHVnLWlucyBhbmQvb3JcblwKKyAgICBGcmFnbWVudHMgYXNzb2NpYXRlZCB3aXRoIHRoYXQgRmVhdHVyZS5cblwKKy0gICBGZWF0dXJlcyBtYXkgYWxzbyBpbmNsdWRlIG90aGVyIEZlYXR1cmVzICgiSW5jbHVkZWQgRmVhdHVyZXMiKS4gV2l0aGluIGFcblwKKyAgICBGZWF0dXJlLCBmaWxlcyBuYW1lZCAiZmVhdHVyZS54bWwiIG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kXG5cCisgICAgdmVyc2lvbiBudW1iZXJzIG9mIEluY2x1ZGVkIEZlYXR1cmVzLlxuXAogXG5cCi1UaGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgc2hvdWxkIGJlXG5cCi1jb250YWluZWQgaW4gZmlsZXMgbmFtZWQgImFib3V0Lmh0bWwiICgiQWJvdXRzIikuIFRoZSB0ZXJtcyBhbmRcblwKLWNvbmRpdGlvbnMgZ292ZXJuaW5nIEZlYXR1cmVzIGFuZCBJbmNsdWRlZCBGZWF0dXJlcyBzaG91bGQgYmUgY29udGFpbmVkXG5cCi1pbiBmaWxlcyBuYW1lZCAibGljZW5zZS5odG1sIiAoIkZlYXR1cmUgTGljZW5zZXMiKS4gQWJvdXRzIGFuZCBGZWF0dXJlXG5cCi1MaWNlbnNlcyBtYXkgYmUgbG9jYXRlZCBpbiBhbnkgZGlyZWN0b3J5IG9mIGEgRG93bmxvYWQgb3IgTW9kdWxlXG5cCi1pbmNsdWRpbmcsIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgZm9sbG93aW5nIGxvY2F0aW9uczpcblwKK1RoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBzaG91bGQgYmUgY29udGFpbmVkIGluXG5cCitmaWxlcyBuYW1lZCAiYWJvdXQuaHRtbCIgKCJBYm91dHMiKS4gVGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyBGZWF0dXJlc1xuXAorYW5kIEluY2x1ZGVkIEZlYXR1cmVzIHNob3VsZCBiZSBjb250YWluZWQgaW4gZmlsZXMgbmFtZWQgImxpY2Vuc2UuaHRtbCJcblwKKygiRmVhdHVyZSBMaWNlbnNlcyIpLiBBYm91dHMgYW5kIEZlYXR1cmUgTGljZW5zZXMgbWF5IGJlIGxvY2F0ZWQgaW4gYW55XG5cCitkaXJlY3Rvcnkgb2YgYSBEb3dubG9hZCBvciBNb2R1bGUgaW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGZvbGxvd2luZ1xuXAorbG9jYXRpb25zOlxuXAogXG5cCi0gICAgICAgLSBUaGUgdG9wLWxldmVsIChyb290KSBkaXJlY3RvcnlcblwKLSAgICAgICAtIFBsdWctaW4gYW5kIEZyYWdtZW50IGRpcmVjdG9yaWVzXG5cCi0gICAgICAgLSBJbnNpZGUgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBwYWNrYWdlZCBhcyBKQVJzXG5cCi0gICAgICAgLSBTdWItZGlyZWN0b3JpZXMgb2YgdGhlIGRpcmVjdG9yeSBuYW1lZCAic3JjIiBvZiBjZXJ0YWluIFBsdWctaW5zXG5cCi0gICAgICAgLSBGZWF0dXJlIGRpcmVjdG9yaWVzXG5cCistICAgVGhlIHRvcC1sZXZlbCAocm9vdCkgZGlyZWN0b3J5XG5cCistICAgUGx1Zy1pbiBhbmQgRnJhZ21lbnQgZGlyZWN0b3JpZXNcblwKKy0gICBJbnNpZGUgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBwYWNrYWdlZCBhcyBKQVJzXG5cCistICAgU3ViLWRpcmVjdG9yaWVzIG9mIHRoZSBkaXJlY3RvcnkgbmFtZWQgInNyYyIgb2YgY2VydGFpbiBQbHVnLWluc1xuXAorLSAgIEZlYXR1cmUgZGlyZWN0b3JpZXNcblwKIFxuXAotTm90ZTogaWYgYSBGZWF0dXJlIG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gaXMgaW5zdGFsbGVkIHVzaW5nIHRoZVxuXAotUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kgKGFzIGRlZmluZWQgYmVsb3cpLCB5b3UgbXVzdCBhZ3JlZSB0byBhIGxpY2Vuc2UgKCJGZWF0dXJlIFxuXAotVXBkYXRlIExpY2Vuc2UiKSBkdXJpbmcgdGhlIGluc3RhbGxhdGlvbiBwcm9jZXNzLiBJZiB0aGUgRmVhdHVyZSBjb250YWluc1xuXAotSW5jbHVkZWQgRmVhdHVyZXMsIHRoZSBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIHNob3VsZCBlaXRoZXIgcHJvdmlkZSB5b3VcblwKLXdpdGggdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyB0aGUgSW5jbHVkZWQgRmVhdHVyZXMgb3IgaW5mb3JtXG5cCi15b3Ugd2hlcmUgeW91IGNhbiBsb2NhdGUgdGhlbS4gRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgbWF5IGJlIGZvdW5kIGluXG5cCi10aGUgImxpY2Vuc2UiIHByb3BlcnR5IG9mIGZpbGVzIG5hbWVkICJmZWF0dXJlLnByb3BlcnRpZXMiIGZvdW5kIHdpdGhpbiBhIEZlYXR1cmUuXG5cCi1TdWNoIEFib3V0cywgRmVhdHVyZSBMaWNlbnNlcywgYW5kIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIGNvbnRhaW4gdGhlXG5cCi10ZXJtcyBhbmQgY29uZGl0aW9ucyAob3IgcmVmZXJlbmNlcyB0byBzdWNoIHRlcm1zIGFuZCBjb25kaXRpb25zKSB0aGF0XG5cCi1nb3Zlcm4geW91ciB1c2Ugb2YgdGhlIGFzc29jaWF0ZWQgQ29udGVudCBpbiB0aGF0IGRpcmVjdG9yeS5cblwKK05vdGU6IGlmIGEgRmVhdHVyZSBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIGlzIGluc3RhbGxlZCB1c2luZ1xuXAordGhlIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5IChhcyBkZWZpbmVkIGJlbG93KSwgeW91IG11c3QgYWdyZWUgdG8gYSBsaWNlbnNlXG5cCisoIkZlYXR1cmUgVXBkYXRlIExpY2Vuc2UiKSBkdXJpbmcgdGhlIGluc3RhbGxhdGlvbiBwcm9jZXNzLiBJZiB0aGUgRmVhdHVyZVxuXAorY29udGFpbnMgSW5jbHVkZWQgRmVhdHVyZXMsIHRoZSBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIHNob3VsZCBlaXRoZXIgcHJvdmlkZSB5b3VcblwKK3dpdGggdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyB0aGUgSW5jbHVkZWQgRmVhdHVyZXMgb3IgaW5mb3JtIHlvdVxuXAord2hlcmUgeW91IGNhbiBsb2NhdGUgdGhlbS4gRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgbWF5IGJlIGZvdW5kIGluIHRoZSAibGljZW5zZSJcblwKK3Byb3BlcnR5IG9mIGZpbGVzIG5hbWVkICJmZWF0dXJlLnByb3BlcnRpZXMiIGZvdW5kIHdpdGhpbiBhIEZlYXR1cmUuIFN1Y2hcblwKK0Fib3V0cywgRmVhdHVyZSBMaWNlbnNlcywgYW5kIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIGNvbnRhaW4gdGhlIHRlcm1zIGFuZFxuXAorY29uZGl0aW9ucyAob3IgcmVmZXJlbmNlcyB0byBzdWNoIHRlcm1zIGFuZCBjb25kaXRpb25zKSB0aGF0IGdvdmVybiB5b3VyIHVzZSBvZlxuXAordGhlIGFzc29jaWF0ZWQgQ29udGVudCBpbiB0aGF0IGRpcmVjdG9yeS5cblwKIFxuXAotVEhFIEFCT1VUUywgRkVBVFVSRSBMSUNFTlNFUywgQU5EIEZFQVRVUkUgVVBEQVRFIExJQ0VOU0VTIE1BWSBSRUZFUlxuXAotVE8gVEhFIEVQTCBPUiBPVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMsIE5PVElDRVMgT1IgVEVSTVMgQU5EIENPTkRJVElPTlMuXG5cCi1TT01FIE9GIFRIRVNFIE9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUyBNQVkgSU5DTFVERSAoQlVUIEFSRSBOT1QgTElNSVRFRCBUTyk6XG5cCitUSEUgQUJPVVRTLCBGRUFUVVJFIExJQ0VOU0VTLCBBTkQgRkVBVFVSRSBVUERBVEUgTElDRU5TRVMgTUFZIFJFRkVSIFRPIFRIRSBFUExcblwKK09SIE9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUywgTk9USUNFUyBPUiBURVJNUyBBTkQgQ09ORElUSU9OUy4gU09NRSBPRiBUSEVTRVxuXAorT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTIE1BWSBJTkNMVURFIChCVVQgQVJFIE5PVCBMSU1JVEVEIFRPKTpcblwKIFxuXAotICAgICAgIC0gRWNsaXBzZSBEaXN0cmlidXRpb24gTGljZW5zZSBWZXJzaW9uIDEuMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGljZW5zZXMvZWRsLXYxLjAuaHRtbClcblwKLSAgICAgICAtIENvbW1vbiBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sKVxuXAotICAgICAgIC0gQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMS4xIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UpXG5cCi0gICAgICAgLSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSAyLjAgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjApXG5cCi0gICAgICAgLSBNZXRybyBMaW5rIFB1YmxpYyBMaWNlbnNlIDEuMDAgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3Lm9wZW5ncm91cC5vcmcvb3Blbm1vdGlmL3N1cHBvcnRlcnMvbWV0cm9saW5rL2xpY2Vuc2UuaHRtbClcblwKLSAgICAgICAtIE1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjEgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC9NUEwtMS4xLmh0bWwpXG5cCistICAgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoYXZhaWxhYmxlIGF0XG5cCisgICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwpXG5cCistICAgRWNsaXBzZSBEaXN0cmlidXRpb24gTGljZW5zZSBWZXJzaW9uIDEuMCAoYXZhaWxhYmxlIGF0XG5cCisgICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9saWNlbnNlcy9lZGwtdjEuMC5odG1sKVxuXAorLSAgIENvbW1vbiBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoYXZhaWxhYmxlIGF0XG5cCisgICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwpXG5cCistICAgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMS4xIChhdmFpbGFibGUgYXRcblwKKyAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRSlcblwKKy0gICBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSAyLjAgKGF2YWlsYWJsZSBhdFxuXAorICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMClcblwKKy0gICBNb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4xIChhdmFpbGFibGUgYXRcblwKKyAgICBodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC9NUEwtMS4xLmh0bWwpXG5cCiBcblwKLUlUIElTIFlPVVIgT0JMSUdBVElPTiBUTyBSRUFEIEFORCBBQ0NFUFQgQUxMIFNVQ0ggVEVSTVMgQU5EIENPTkRJVElPTlMgUFJJT1JcblwKLVRPIFVTRSBPRiBUSEUgQ09OVEVOVC4gSWYgbm8gQWJvdXQsIEZlYXR1cmUgTGljZW5zZSwgb3IgRmVhdHVyZSBVcGRhdGUgTGljZW5zZVxuXAotaXMgcHJvdmlkZWQsIHBsZWFzZSBjb250YWN0IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gdG8gZGV0ZXJtaW5lIHdoYXQgdGVybXMgYW5kIGNvbmRpdGlvbnNcblwKLWdvdmVybiB0aGF0IHBhcnRpY3VsYXIgQ29udGVudC5cblwKK0lUIElTIFlPVVIgT0JMSUdBVElPTiBUTyBSRUFEIEFORCBBQ0NFUFQgQUxMIFNVQ0ggVEVSTVMgQU5EIENPTkRJVElPTlMgUFJJT1IgVE9cblwKK1VTRSBPRiBUSEUgQ09OVEVOVC4gSWYgbm8gQWJvdXQsIEZlYXR1cmUgTGljZW5zZSwgb3IgRmVhdHVyZSBVcGRhdGUgTGljZW5zZSBpc1xuXAorcHJvdmlkZWQsIHBsZWFzZSBjb250YWN0IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gdG8gZGV0ZXJtaW5lIHdoYXQgdGVybXMgYW5kXG5cCitjb25kaXRpb25zIGdvdmVybiB0aGF0IHBhcnRpY3VsYXIgQ29udGVudC5cblwKIFxuXAotXG5cVXNlIG9mIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5XG5cCitVc2Ugb2YgUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3lcblwKIFxuXAotVGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYWtlcyBhdmFpbGFibGUgcHJvdmlzaW9uaW5nIHNvZnR3YXJlLCBleGFtcGxlcyBvZiB3aGljaCBpbmNsdWRlLFxuXAotYnV0IGFyZSBub3QgbGltaXRlZCB0bywgcDIgYW5kIHRoZSBFY2xpcHNlIFVwZGF0ZSBNYW5hZ2VyICgiUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kiKSBmb3JcblwKLXRoZSBwdXJwb3NlIG9mIGFsbG93aW5nIHVzZXJzIHRvIGluc3RhbGwgc29mdHdhcmUsIGRvY3VtZW50YXRpb24sIGluZm9ybWF0aW9uIGFuZC9vclxuXAotb3RoZXIgbWF0ZXJpYWxzIChjb2xsZWN0aXZlbHkgIkluc3RhbGxhYmxlIFNvZnR3YXJlIikuIFRoaXMgY2FwYWJpbGl0eSBpcyBwcm92aWRlZCB3aXRoXG5cCi10aGUgaW50ZW50IG9mIGFsbG93aW5nIHN1Y2ggdXNlcnMgdG8gaW5zdGFsbCwgZXh0ZW5kIGFuZCB1cGRhdGUgRWNsaXBzZS1iYXNlZCBwcm9kdWN0cy5cblwKLUluZm9ybWF0aW9uIGFib3V0IHBhY2thZ2luZyBJbnN0YWxsYWJsZSBTb2Z0d2FyZSBpcyBhdmFpbGFibGUgYXRcblwKK1RoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWFrZXMgYXZhaWxhYmxlIHByb3Zpc2lvbmluZyBzb2Z0d2FyZSwgZXhhbXBsZXMgb2Ygd2hpY2hcblwKK2luY2x1ZGUsIGJ1dCBhcmUgbm90IGxpbWl0ZWQgdG8sIHAyIGFuZCB0aGUgRWNsaXBzZSBVcGRhdGUgTWFuYWdlclxuXAorKCJQcm92aXNpb25pbmcgVGVjaG5vbG9neSIpIGZvciB0aGUgcHVycG9zZSBvZiBhbGxvd2luZyB1c2VycyB0byBpbnN0YWxsXG5cCitzb2Z0d2FyZSwgZG9jdW1lbnRhdGlvbiwgaW5mb3JtYXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyAoY29sbGVjdGl2ZWx5XG5cCisiSW5zdGFsbGFibGUgU29mdHdhcmUiKS4gVGhpcyBjYXBhYmlsaXR5IGlzIHByb3ZpZGVkIHdpdGggdGhlIGludGVudCBvZiBhbGxvd2luZ1xuXAorc3VjaCB1c2VycyB0byBpbnN0YWxsLCBleHRlbmQgYW5kIHVwZGF0ZSBFY2xpcHNlLWJhc2VkIHByb2R1Y3RzLiBJbmZvcm1hdGlvblxuXAorYWJvdXQgcGFja2FnaW5nIEluc3RhbGxhYmxlIFNvZnR3YXJlIGlzIGF2YWlsYWJsZSBhdFxuXAogaHR0cDovL2VjbGlwc2Uub3JnL2VxdWlub3gvcDIvcmVwb3NpdG9yeV9wYWNrYWdpbmcuaHRtbCAoIlNwZWNpZmljYXRpb24iKS5cblwKIFxuXAotWW91IG1heSB1c2UgUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kgdG8gYWxsb3cgb3RoZXIgcGFydGllcyB0byBpbnN0YWxsIEluc3RhbGxhYmxlIFNvZnR3YXJlLlxuXAotWW91IHNoYWxsIGJlIHJlc3BvbnNpYmxlIGZvciBlbmFibGluZyB0aGUgYXBwbGljYWJsZSBsaWNlbnNlIGFncmVlbWVudHMgcmVsYXRpbmcgdG8gdGhlXG5cCi1JbnN0YWxsYWJsZSBTb2Z0d2FyZSB0byBiZSBwcmVzZW50ZWQgdG8sIGFuZCBhY2NlcHRlZCBieSwgdGhlIHVzZXJzIG9mIHRoZSBQcm92aXNpb25pbmcgVGVjaG5vbG9neVxuXAotaW4gYWNjb3JkYW5jZSB3aXRoIHRoZSBTcGVjaWZpY2F0aW9uLiBCeSB1c2luZyBQcm92aXNpb25pbmcgVGVjaG5vbG9neSBpbiBzdWNoIGEgbWFubmVyIGFuZFxuXAotbWFraW5nIGl0IGF2YWlsYWJsZSBpbiBhY2NvcmRhbmNlIHdpdGggdGhlIFNwZWNpZmljYXRpb24sIHlvdSBmdXJ0aGVyIGFja25vd2xlZGdlIHlvdXJcblwKLWFncmVlbWVudCB0bywgYW5kIHRoZSBhY3F1aXNpdGlvbiBvZiBhbGwgbmVjZXNzYXJ5IHJpZ2h0cyB0byBwZXJtaXQgdGhlIGZvbGxvd2luZzpcblwKK1lvdSBtYXkgdXNlIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5IHRvIGFsbG93IG90aGVyIHBhcnRpZXMgdG8gaW5zdGFsbFxuXAorSW5zdGFsbGFibGUgU29mdHdhcmUuIFlvdSBzaGFsbCBiZSByZXNwb25zaWJsZSBmb3IgZW5hYmxpbmcgdGhlIGFwcGxpY2FibGVcblwKK2xpY2Vuc2UgYWdyZWVtZW50cyByZWxhdGluZyB0byB0aGUgSW5zdGFsbGFibGUgU29mdHdhcmUgdG8gYmUgcHJlc2VudGVkIHRvLCBhbmRcblwKK2FjY2VwdGVkIGJ5LCB0aGUgdXNlcnMgb2YgdGhlIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5IGluIGFjY29yZGFuY2Ugd2l0aCB0aGVcblwKK1NwZWNpZmljYXRpb24uIEJ5IHVzaW5nIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5IGluIHN1Y2ggYSBtYW5uZXIgYW5kIG1ha2luZyBpdFxuXAorYXZhaWxhYmxlIGluIGFjY29yZGFuY2Ugd2l0aCB0aGUgU3BlY2lmaWNhdGlvbiwgeW91IGZ1cnRoZXIgYWNrbm93bGVkZ2UgeW91clxuXAorYWdyZWVtZW50IHRvLCBhbmQgdGhlIGFjcXVpc2l0aW9uIG9mIGFsbCBuZWNlc3NhcnkgcmlnaHRzIHRvIHBlcm1pdCB0aGVcblwKK2ZvbGxvd2luZzpcblwKIFxuXAotICAgICAgIDEuIEEgc2VyaWVzIG9mIGFjdGlvbnMgbWF5IG9jY3VyICgiUHJvdmlzaW9uaW5nIFByb2Nlc3MiKSBpbiB3aGljaCBhIHVzZXIgbWF5IGV4ZWN1dGVcblwKLSAgICAgICAgICB0aGUgUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kgb24gYSBtYWNoaW5lICgiVGFyZ2V0IE1hY2hpbmUiKSB3aXRoIHRoZSBpbnRlbnQgb2YgaW5zdGFsbGluZyxcblwKLSAgICAgICAgICBleHRlbmRpbmcgb3IgdXBkYXRpbmcgdGhlIGZ1bmN0aW9uYWxpdHkgb2YgYW4gRWNsaXBzZS1iYXNlZCBwcm9kdWN0LlxuXAotICAgICAgIDIuIER1cmluZyB0aGUgUHJvdmlzaW9uaW5nIFByb2Nlc3MsIHRoZSBQcm92aXNpb25pbmcgVGVjaG5vbG9neSBtYXkgY2F1c2UgdGhpcmQgcGFydHlcblwKLSAgICAgICAgICBJbnN0YWxsYWJsZSBTb2Z0d2FyZSBvciBhIHBvcnRpb24gdGhlcmVvZiB0byBiZSBhY2Nlc3NlZCBhbmQgY29waWVkIHRvIHRoZSBUYXJnZXQgTWFjaGluZS5cblwKLSAgICAgICAzLiBQdXJzdWFudCB0byB0aGUgU3BlY2lmaWNhdGlvbiwgeW91IHdpbGwgcHJvdmlkZSB0byB0aGUgdXNlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgdGhhdFxuXAotICAgICAgICAgIGdvdmVybiB0aGUgdXNlIG9mIHRoZSBJbnN0YWxsYWJsZSBTb2Z0d2FyZSAoIkluc3RhbGxhYmxlIFNvZnR3YXJlIEFncmVlbWVudCIpIGFuZCBzdWNoXG5cCi0gICAgICAgICAgSW5zdGFsbGFibGUgU29mdHdhcmUgQWdyZWVtZW50IHNoYWxsIGJlIGFjY2Vzc2VkIGZyb20gdGhlIFRhcmdldCBNYWNoaW5lIGluIGFjY29yZGFuY2VcblwKLSAgICAgICAgICB3aXRoIHRoZSBTcGVjaWZpY2F0aW9uLiBTdWNoIEluc3RhbGxhYmxlIFNvZnR3YXJlIEFncmVlbWVudCBtdXN0IGluZm9ybSB0aGUgdXNlciBvZiB0aGVcblwKLSAgICAgICAgICB0ZXJtcyBhbmQgY29uZGl0aW9ucyB0aGF0IGdvdmVybiB0aGUgSW5zdGFsbGFibGUgU29mdHdhcmUgYW5kIG11c3Qgc29saWNpdCBhY2NlcHRhbmNlIGJ5XG5cCi0gICAgICAgICAgdGhlIGVuZCB1c2VyIGluIHRoZSBtYW5uZXIgcHJlc2NyaWJlZCBpbiBzdWNoIEluc3RhbGxhYmxlIFNvZnR3YXJlIEFncmVlbWVudC4gVXBvbiBzdWNoXG5cCi0gICAgICAgICAgaW5kaWNhdGlvbiBvZiBhZ3JlZW1lbnQgYnkgdGhlIHVzZXIsIHRoZSBwcm92aXNpb25pbmcgVGVjaG5vbG9neSB3aWxsIGNvbXBsZXRlIGluc3RhbGxhdGlvblxuXAotICAgICAgICAgIG9mIHRoZSBJbnN0YWxsYWJsZSBTb2Z0d2FyZS5cblwKKzEuICBBIHNlcmllcyBvZiBhY3Rpb25zIG1heSBvY2N1ciAoIlByb3Zpc2lvbmluZyBQcm9jZXNzIikgaW4gd2hpY2ggYSB1c2VyIG1heVxuXAorICAgIGV4ZWN1dGUgdGhlIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5IG9uIGEgbWFjaGluZSAoIlRhcmdldCBNYWNoaW5lIikgd2l0aCB0aGVcblwKKyAgICBpbnRlbnQgb2YgaW5zdGFsbGluZywgZXh0ZW5kaW5nIG9yIHVwZGF0aW5nIHRoZSBmdW5jdGlvbmFsaXR5IG9mIGFuXG5cCisgICAgRWNsaXBzZS1iYXNlZCBwcm9kdWN0LlxuXAorMi4gIER1cmluZyB0aGUgUHJvdmlzaW9uaW5nIFByb2Nlc3MsIHRoZSBQcm92aXNpb25pbmcgVGVjaG5vbG9neSBtYXkgY2F1c2UgdGhpcmRcblwKKyAgICBwYXJ0eSBJbnN0YWxsYWJsZSBTb2Z0d2FyZSBvciBhIHBvcnRpb24gdGhlcmVvZiB0byBiZSBhY2Nlc3NlZCBhbmQgY29waWVkIHRvXG5cCisgICAgdGhlIFRhcmdldCBNYWNoaW5lLlxuXAorMy4gIFB1cnN1YW50IHRvIHRoZSBTcGVjaWZpY2F0aW9uLCB5b3Ugd2lsbCBwcm92aWRlIHRvIHRoZSB1c2VyIHRoZSB0ZXJtcyBhbmRcblwKKyAgICBjb25kaXRpb25zIHRoYXQgZ292ZXJuIHRoZSB1c2Ugb2YgdGhlIEluc3RhbGxhYmxlIFNvZnR3YXJlICgiSW5zdGFsbGFibGVcblwKKyAgICBTb2Z0d2FyZSBBZ3JlZW1lbnQiKSBhbmQgc3VjaCBJbnN0YWxsYWJsZSBTb2Z0d2FyZSBBZ3JlZW1lbnQgc2hhbGwgYmVcblwKKyAgICBhY2Nlc3NlZCBmcm9tIHRoZSBUYXJnZXQgTWFjaGluZSBpbiBhY2NvcmRhbmNlIHdpdGggdGhlIFNwZWNpZmljYXRpb24uIFN1Y2hcblwKKyAgICBJbnN0YWxsYWJsZSBTb2Z0d2FyZSBBZ3JlZW1lbnQgbXVzdCBpbmZvcm0gdGhlIHVzZXIgb2YgdGhlIHRlcm1zIGFuZFxuXAorICAgIGNvbmRpdGlvbnMgdGhhdCBnb3Zlcm4gdGhlIEluc3RhbGxhYmxlIFNvZnR3YXJlIGFuZCBtdXN0IHNvbGljaXQgYWNjZXB0YW5jZVxuXAorICAgIGJ5IHRoZSBlbmQgdXNlciBpbiB0aGUgbWFubmVyIHByZXNjcmliZWQgaW4gc3VjaCBJbnN0YWxsYWJsZVxuXAorICAgIFNvZnR3YXJlIEFncmVlbWVudC4gVXBvbiBzdWNoIGluZGljYXRpb24gb2YgYWdyZWVtZW50IGJ5IHRoZSB1c2VyLCB0aGVcblwKKyAgICBwcm92aXNpb25pbmcgVGVjaG5vbG9neSB3aWxsIGNvbXBsZXRlIGluc3RhbGxhdGlvbiBvZiB0aGVcblwKKyAgICBJbnN0YWxsYWJsZSBTb2Z0d2FyZS5cblwKIFxuXAogQ3J5cHRvZ3JhcGh5XG5cCiBcblwKLUNvbnRlbnQgbWF5IGNvbnRhaW4gZW5jcnlwdGlvbiBzb2Z0d2FyZS4gVGhlIGNvdW50cnkgaW4gd2hpY2ggeW91IGFyZVxuXAotY3VycmVudGx5IG1heSBoYXZlIHJlc3RyaWN0aW9ucyBvbiB0aGUgaW1wb3J0LCBwb3NzZXNzaW9uLCBhbmQgdXNlLFxuXAotYW5kL29yIHJlLWV4cG9ydCB0byBhbm90aGVyIGNvdW50cnksIG9mIGVuY3J5cHRpb24gc29mdHdhcmUuIEJFRk9SRVxuXAotdXNpbmcgYW55IGVuY3J5cHRpb24gc29mdHdhcmUsIHBsZWFzZSBjaGVjayB0aGUgY291bnRyeSdzIGxhd3MsXG5cCi1yZWd1bGF0aW9ucyBhbmQgcG9saWNpZXMgY29uY2VybmluZyB0aGUgaW1wb3J0LCBwb3NzZXNzaW9uLCBvciB1c2UsIGFuZFxuXAotcmUtZXhwb3J0IG9mIGVuY3J5cHRpb24gc29mdHdhcmUsIHRvIHNlZSBpZiB0aGlzIGlzIHBlcm1pdHRlZC5cblwKK0NvbnRlbnQgbWF5IGNvbnRhaW4gZW5jcnlwdGlvbiBzb2Z0d2FyZS4gVGhlIGNvdW50cnkgaW4gd2hpY2ggeW91IGFyZSBjdXJyZW50bHlcblwKK21heSBoYXZlIHJlc3RyaWN0aW9ucyBvbiB0aGUgaW1wb3J0LCBwb3NzZXNzaW9uLCBhbmQgdXNlLCBhbmQvb3IgcmUtZXhwb3J0IHRvXG5cCithbm90aGVyIGNvdW50cnksIG9mIGVuY3J5cHRpb24gc29mdHdhcmUuIEJFRk9SRSB1c2luZyBhbnkgZW5jcnlwdGlvbiBzb2Z0d2FyZSxcblwKK3BsZWFzZSBjaGVjayB0aGUgY291bnRyeSdzIGxhd3MsIHJlZ3VsYXRpb25zIGFuZCBwb2xpY2llcyBjb25jZXJuaW5nIHRoZSBpbXBvcnQsXG5cCitwb3NzZXNzaW9uLCBvciB1c2UsIGFuZCByZS1leHBvcnQgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgdG8gc2VlIGlmIHRoaXMgaXNcblwKK3Blcm1pdHRlZC5cblwKIFxuXAotSmF2YSBhbmQgYWxsIEphdmEtYmFzZWQgdHJhZGVtYXJrcyBhcmUgdHJhZGVtYXJrcyBvZiBPcmFjbGUgQ29ycG9yYXRpb24gaW4gdGhlIFVuaXRlZCBTdGF0ZXMsIG90aGVyIGNvdW50cmllcywgb3IgYm90aC5cbgorSmF2YSBhbmQgYWxsIEphdmEtYmFzZWQgdHJhZGVtYXJrcyBhcmUgdHJhZGVtYXJrcyBvZiBPcmFjbGUgQ29ycG9yYXRpb24gaW4gdGhlXG5cCitVbml0ZWQgU3RhdGVzLCBvdGhlciBjb3VudHJpZXMsIG9yIGJvdGguXG4KICMjIyMjIyMjIyMjIGVuZCBvZiBsaWNlbnNlIHByb3BlcnR5ICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5kYXRhaW50ZXJjaGFuZ2UuZmVhdHVyZS9saWNlbnNlLmh0bWwgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmRhdGFpbnRlcmNoYW5nZS5mZWF0dXJlL2xpY2Vuc2UuaHRtbAppbmRleCA2ZTU3OWE1Li4wMDhiODAxIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmRhdGFpbnRlcmNoYW5nZS5mZWF0dXJlL2xpY2Vuc2UuaHRtbAorKysgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmRhdGFpbnRlcmNoYW5nZS5mZWF0dXJlL2xpY2Vuc2UuaHRtbApAQCAtMSwxNjQgKzEsMTg5IEBACi08IS0tP3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJJU08tODg1OS0xIiA/LS0+Cis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJJU08tODg1OS0xIiA/PgogPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgU3RyaWN0Ly9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXN0cmljdC5kdGQiPgotPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiPjxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9SVNPLTg4NTktMSI+Cis8aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCI+Cis8aGVhZD4KKzxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTEiIC8+CiA8dGl0bGU+RWNsaXBzZSBGb3VuZGF0aW9uIFNvZnR3YXJlIFVzZXIgQWdyZWVtZW50PC90aXRsZT4KIDwvaGVhZD4KIAogPGJvZHkgbGFuZz0iRU4tVVMiPgotPGgyPkVjbGlwc2UgRm91bmRhdGlvbiBTb2Z0d2FyZSBVc2VyIEFncmVlbWVudDwvaDI+Ci08cD5GZWJydWFyeSAxLCAyMDExPC9wPgorCTxoMj5FY2xpcHNlIEZvdW5kYXRpb24gU29mdHdhcmUgVXNlciBBZ3JlZW1lbnQ8L2gyPgorCTxwPk5vdmVtYmVyIDIyLCAyMDE3PC9wPgogCi08aDM+VXNhZ2UgT2YgQ29udGVudDwvaDM+CisJPGgzPlVzYWdlIE9mIENvbnRlbnQ8L2gzPgogCi08cD5USEUgRUNMSVBTRSBGT1VOREFUSU9OIE1BS0VTIEFWQUlMQUJMRSBTT0ZUV0FSRSwgRE9DVU1FTlRBVElPTiwgSU5GT1JNQVRJT04gQU5EL09SIE9USEVSIE1BVEVSSUFMUyBGT1IgT1BFTiBTT1VSQ0UgUFJPSkVDVFMKLSAgIChDT0xMRUNUSVZFTFkgIkNPTlRFTlQiKS4gIFVTRSBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJUyBBR1JFRU1FTlQgQU5EL09SIFRIRSBURVJNUyBBTkQKLSAgIENPTkRJVElPTlMgT0YgTElDRU5TRSBBR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuICBCWSBVU0lORyBUSEUgQ09OVEVOVCwgWU9VIEFHUkVFIFRIQVQgWU9VUiBVU0UKLSAgIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRISVMgQUdSRUVNRU5UIEFORC9PUiBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTIE9SCi0gICBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiAgSUYgWU9VIERPIE5PVCBBR1JFRSBUTyBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJUyBBR1JFRU1FTlQgQU5EIFRIRSBURVJNUyBBTkQKLSAgIENPTkRJVElPTlMgT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1csIFRIRU4gWU9VIE1BWSBOT1QgVVNFIFRIRSBDT05URU5ULjwvcD4KKwk8cD5USEUgRUNMSVBTRSBGT1VOREFUSU9OIE1BS0VTIEFWQUlMQUJMRSBTT0ZUV0FSRSwgRE9DVU1FTlRBVElPTiwKKwkJSU5GT1JNQVRJT04gQU5EL09SIE9USEVSIE1BVEVSSUFMUyBGT1IgT1BFTiBTT1VSQ0UgUFJPSkVDVFMKKwkJKENPTExFQ1RJVkVMWSAmcXVvdDtDT05URU5UJnF1b3Q7KS4gVVNFIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZCisJCVRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTIEFHUkVFTUVOVCBBTkQvT1IgVEhFIFRFUk1TIEFORAorCQlDT05ESVRJT05TIE9GIExJQ0VOU0UgQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VECisJCUJFTE9XLiBCWSBVU0lORyBUSEUgQ09OVEVOVCwgWU9VIEFHUkVFIFRIQVQgWU9VUiBVU0UgT0YgVEhFIENPTlRFTlQgSVMKKwkJR09WRVJORUQgQlkgVEhJUyBBR1JFRU1FTlQgQU5EL09SIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBBTlkKKwkJQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRAorCQlCRUxPVy4gSUYgWU9VIERPIE5PVCBBR1JFRSBUTyBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJUworCQlBR1JFRU1FTlQgQU5EIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFCisJCUFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVywgVEhFTiBZT1UgTUFZIE5PVAorCQlVU0UgVEhFIENPTlRFTlQuPC9wPgogCi08aDM+QXBwbGljYWJsZSBMaWNlbnNlczwvaDM+CisJPGgzPkFwcGxpY2FibGUgTGljZW5zZXM8L2gzPgogCi08cD5Vbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCwgYWxsIENvbnRlbnQgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UKLSBGb3VuZGF0aW9uIGlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIAotRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMAotICAgKCJFUEwiKS4gIEEgY29weSBvZiB0aGUgRVBMIGlzIHByb3ZpZGVkIHdpdGggdGhpcyBDb250ZW50IGFuZCBpcyBhbHNvCi0gYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbDwvYT4uCi0gICBGb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgIlByb2dyYW0iIHdpbGwgbWVhbiB0aGUgQ29udGVudC48L3A+CisJPHA+CisJCVVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkLCBhbGwgQ29udGVudCBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZQorCQlGb3VuZGF0aW9uIGlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlCisJCUVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyLjAgKCZxdW90O0VQTCZxdW90OykuIEEgY29weSBvZiB0aGUKKwkJRVBMIGlzIHByb3ZpZGVkIHdpdGggdGhpcyBDb250ZW50IGFuZCBpcyBhbHNvIGF2YWlsYWJsZSBhdCA8YQorCQkJaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjA8L2E+LgorCQlGb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgJnF1b3Q7UHJvZ3JhbSZxdW90OyB3aWxsIG1lYW4gdGhlIENvbnRlbnQuCisJPC9wPgogCi08cD5Db250ZW50IGluY2x1ZGVzLCBidXQgaXMgbm90IGxpbWl0ZWQgdG8sIHNvdXJjZSBjb2RlLCBvYmplY3QgY29kZSwgCi1kb2N1bWVudGF0aW9uIGFuZCBvdGhlciBmaWxlcyBtYWludGFpbmVkIGluIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gCi1zb3VyY2UgY29kZQotICAgcmVwb3NpdG9yeSAoIlJlcG9zaXRvcnkiKSBpbiBzb2Z0d2FyZSBtb2R1bGVzICgiTW9kdWxlcyIpIGFuZCBtYWRlIAotYXZhaWxhYmxlIGFzIGRvd25sb2FkYWJsZSBhcmNoaXZlcyAoIkRvd25sb2FkcyIpLjwvcD4KKwk8cD5Db250ZW50IGluY2x1ZGVzLCBidXQgaXMgbm90IGxpbWl0ZWQgdG8sIHNvdXJjZSBjb2RlLCBvYmplY3QKKwkJY29kZSwgZG9jdW1lbnRhdGlvbiBhbmQgb3RoZXIgZmlsZXMgbWFpbnRhaW5lZCBpbiB0aGUgRWNsaXBzZQorCQlGb3VuZGF0aW9uIHNvdXJjZSBjb2RlIHJlcG9zaXRvcnkgKCZxdW90O1JlcG9zaXRvcnkmcXVvdDspIGluIHNvZnR3YXJlCisJCW1vZHVsZXMgKCZxdW90O01vZHVsZXMmcXVvdDspIGFuZCBtYWRlIGF2YWlsYWJsZSBhcyBkb3dubG9hZGFibGUKKwkJYXJjaGl2ZXMgKCZxdW90O0Rvd25sb2FkcyZxdW90OykuPC9wPgogCi08dWw+Ci0gICAgICAgPGxpPkNvbnRlbnQgbWF5IGJlIHN0cnVjdHVyZWQgYW5kIHBhY2thZ2VkIGludG8gbW9kdWxlcyB0byAKLWZhY2lsaXRhdGUgZGVsaXZlcmluZywgZXh0ZW5kaW5nLCBhbmQgdXBncmFkaW5nIHRoZSBDb250ZW50LiAgVHlwaWNhbCAKLW1vZHVsZXMgbWF5IGluY2x1ZGUgcGx1Zy1pbnMgKCJQbHVnLWlucyIpLCBwbHVnLWluIGZyYWdtZW50cyAKLSgiRnJhZ21lbnRzIiksIGFuZCBmZWF0dXJlcyAoIkZlYXR1cmVzIikuPC9saT4KLSAgICAgICA8bGk+RWFjaCBQbHVnLWluIG9yIEZyYWdtZW50IG1heSBiZSBwYWNrYWdlZCBhcyBhIHN1Yi1kaXJlY3Rvcnkgb3IgSkFSIChKYXZhJiM4NDgyOyBBUmNoaXZlKSBpbiBhIGRpcmVjdG9yeSBuYW1lZCAicGx1Z2lucyIuPC9saT4KLSAgICAgICA8bGk+QSBGZWF0dXJlIGlzIGEgYnVuZGxlIG9mIG9uZSBvciBtb3JlIFBsdWctaW5zIGFuZC9vciAKLUZyYWdtZW50cyBhbmQgYXNzb2NpYXRlZCBtYXRlcmlhbC4gIEVhY2ggRmVhdHVyZSBtYXkgYmUgcGFja2FnZWQgYXMgYSAKLXN1Yi1kaXJlY3RvcnkgaW4gYSBkaXJlY3RvcnkgbmFtZWQgImZlYXR1cmVzIi4gIFdpdGhpbiBhIEZlYXR1cmUsIGZpbGVzIAotbmFtZWQgImZlYXR1cmUueG1sIiBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgCi1vZiB0aGUgUGx1Zy1pbnMKLSAgICAgIGFuZC9vciBGcmFnbWVudHMgYXNzb2NpYXRlZCB3aXRoIHRoYXQgRmVhdHVyZS48L2xpPgotICAgICAgIDxsaT5GZWF0dXJlcyBtYXkgYWxzbyBpbmNsdWRlIG90aGVyIEZlYXR1cmVzICgiSW5jbHVkZWQgCi1GZWF0dXJlcyIpLiBXaXRoaW4gYSBGZWF0dXJlLCBmaWxlcyBuYW1lZCAiZmVhdHVyZS54bWwiIG1heSBjb250YWluIGEgCi1saXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mIEluY2x1ZGVkIEZlYXR1cmVzLjwvbGk+Ci08L3VsPgorCTx1bD4KKwkJPGxpPkNvbnRlbnQgbWF5IGJlIHN0cnVjdHVyZWQgYW5kIHBhY2thZ2VkIGludG8gbW9kdWxlcyB0bworCQkJZmFjaWxpdGF0ZSBkZWxpdmVyaW5nLCBleHRlbmRpbmcsIGFuZCB1cGdyYWRpbmcgdGhlIENvbnRlbnQuIFR5cGljYWwKKwkJCW1vZHVsZXMgbWF5IGluY2x1ZGUgcGx1Zy1pbnMgKCZxdW90O1BsdWctaW5zJnF1b3Q7KSwgcGx1Zy1pbgorCQkJZnJhZ21lbnRzICgmcXVvdDtGcmFnbWVudHMmcXVvdDspLCBhbmQgZmVhdHVyZXMKKwkJCSgmcXVvdDtGZWF0dXJlcyZxdW90OykuPC9saT4KKwkJPGxpPkVhY2ggUGx1Zy1pbiBvciBGcmFnbWVudCBtYXkgYmUgcGFja2FnZWQgYXMgYSBzdWItZGlyZWN0b3J5CisJCQlvciBKQVIgKEphdmEmdHJhZGU7IEFSY2hpdmUpIGluIGEgZGlyZWN0b3J5IG5hbWVkCisJCQkmcXVvdDtwbHVnaW5zJnF1b3Q7LjwvbGk+CisJCTxsaT5BIEZlYXR1cmUgaXMgYSBidW5kbGUgb2Ygb25lIG9yIG1vcmUgUGx1Zy1pbnMgYW5kL29yCisJCQlGcmFnbWVudHMgYW5kIGFzc29jaWF0ZWQgbWF0ZXJpYWwuIEVhY2ggRmVhdHVyZSBtYXkgYmUgcGFja2FnZWQgYXMgYQorCQkJc3ViLWRpcmVjdG9yeSBpbiBhIGRpcmVjdG9yeSBuYW1lZCAmcXVvdDtmZWF0dXJlcyZxdW90Oy4gV2l0aGluIGEKKwkJCUZlYXR1cmUsIGZpbGVzIG5hbWVkICZxdW90O2ZlYXR1cmUueG1sJnF1b3Q7IG1heSBjb250YWluIGEgbGlzdCBvZgorCQkJdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2YgdGhlIFBsdWctaW5zIGFuZC9vciBGcmFnbWVudHMKKwkJCWFzc29jaWF0ZWQgd2l0aCB0aGF0IEZlYXR1cmUuPC9saT4KKwkJPGxpPkZlYXR1cmVzIG1heSBhbHNvIGluY2x1ZGUgb3RoZXIgRmVhdHVyZXMgKCZxdW90O0luY2x1ZGVkCisJCQlGZWF0dXJlcyZxdW90OykuIFdpdGhpbiBhIEZlYXR1cmUsIGZpbGVzIG5hbWVkCisJCQkmcXVvdDtmZWF0dXJlLnhtbCZxdW90OyBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uCisJCQludW1iZXJzIG9mIEluY2x1ZGVkIEZlYXR1cmVzLjwvbGk+CisJPC91bD4KIAotPHA+VGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHNob3VsZCBiZSAKLWNvbnRhaW5lZCBpbiBmaWxlcyBuYW1lZCAiYWJvdXQuaHRtbCIgKCJBYm91dHMiKS4gVGhlIHRlcm1zIGFuZCAKLWNvbmRpdGlvbnMgZ292ZXJuaW5nIEZlYXR1cmVzIGFuZAotSW5jbHVkZWQgRmVhdHVyZXMgc2hvdWxkIGJlIGNvbnRhaW5lZCBpbiBmaWxlcyBuYW1lZCAibGljZW5zZS5odG1sIiAKLSgiRmVhdHVyZSBMaWNlbnNlcyIpLiAgQWJvdXRzIGFuZCBGZWF0dXJlIExpY2Vuc2VzIG1heSBiZSBsb2NhdGVkIGluIGFueQotIGRpcmVjdG9yeSBvZiBhIERvd25sb2FkIG9yIE1vZHVsZQotaW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGZvbGxvd2luZyBsb2NhdGlvbnM6PC9wPgorCTxwPlRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBzaG91bGQKKwkJYmUgY29udGFpbmVkIGluIGZpbGVzIG5hbWVkICZxdW90O2Fib3V0Lmh0bWwmcXVvdDsKKwkJKCZxdW90O0Fib3V0cyZxdW90OykuIFRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgRmVhdHVyZXMgYW5kCisJCUluY2x1ZGVkIEZlYXR1cmVzIHNob3VsZCBiZSBjb250YWluZWQgaW4gZmlsZXMgbmFtZWQKKwkJJnF1b3Q7bGljZW5zZS5odG1sJnF1b3Q7ICgmcXVvdDtGZWF0dXJlIExpY2Vuc2VzJnF1b3Q7KS4gQWJvdXRzIGFuZAorCQlGZWF0dXJlIExpY2Vuc2VzIG1heSBiZSBsb2NhdGVkIGluIGFueSBkaXJlY3Rvcnkgb2YgYSBEb3dubG9hZCBvcgorCQlNb2R1bGUgaW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGZvbGxvd2luZyBsb2NhdGlvbnM6PC9wPgogCi08dWw+Ci0gICAgICAgPGxpPlRoZSB0b3AtbGV2ZWwgKHJvb3QpIGRpcmVjdG9yeTwvbGk+Ci0gICAgICAgPGxpPlBsdWctaW4gYW5kIEZyYWdtZW50IGRpcmVjdG9yaWVzPC9saT4KLSAgICAgICA8bGk+SW5zaWRlIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgcGFja2FnZWQgYXMgSkFSczwvbGk+Ci0gICAgICAgPGxpPlN1Yi1kaXJlY3RvcmllcyBvZiB0aGUgZGlyZWN0b3J5IG5hbWVkICJzcmMiIG9mIGNlcnRhaW4gUGx1Zy1pbnM8L2xpPgotICAgICAgIDxsaT5GZWF0dXJlIGRpcmVjdG9yaWVzPC9saT4KLTwvdWw+CisJPHVsPgorCQk8bGk+VGhlIHRvcC1sZXZlbCAocm9vdCkgZGlyZWN0b3J5PC9saT4KKwkJPGxpPlBsdWctaW4gYW5kIEZyYWdtZW50IGRpcmVjdG9yaWVzPC9saT4KKwkJPGxpPkluc2lkZSBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHBhY2thZ2VkIGFzIEpBUnM8L2xpPgorCQk8bGk+U3ViLWRpcmVjdG9yaWVzIG9mIHRoZSBkaXJlY3RvcnkgbmFtZWQgJnF1b3Q7c3JjJnF1b3Q7IG9mCisJCQljZXJ0YWluIFBsdWctaW5zPC9saT4KKwkJPGxpPkZlYXR1cmUgZGlyZWN0b3JpZXM8L2xpPgorCTwvdWw+CiAKLTxwPk5vdGU6IGlmIGEgRmVhdHVyZSBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIGlzIAotaW5zdGFsbGVkIHVzaW5nIHRoZSBQcm92aXNpb25pbmcgVGVjaG5vbG9neSAoYXMgZGVmaW5lZCBiZWxvdyksIHlvdSBtdXN0Ci0gYWdyZWUgdG8gYSBsaWNlbnNlICgiRmVhdHVyZSBVcGRhdGUgTGljZW5zZSIpIGR1cmluZyB0aGUKLWluc3RhbGxhdGlvbiBwcm9jZXNzLiAgSWYgdGhlIEZlYXR1cmUgY29udGFpbnMgSW5jbHVkZWQgRmVhdHVyZXMsIHRoZSAKLUZlYXR1cmUgVXBkYXRlIExpY2Vuc2Ugc2hvdWxkIGVpdGhlciBwcm92aWRlIHlvdSB3aXRoIHRoZSB0ZXJtcyBhbmQgCi1jb25kaXRpb25zIGdvdmVybmluZyB0aGUgSW5jbHVkZWQgRmVhdHVyZXMgb3IKLWluZm9ybSB5b3Ugd2hlcmUgeW91IGNhbiBsb2NhdGUgdGhlbS4gIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIG1heSBiZSAKLWZvdW5kIGluIHRoZSAibGljZW5zZSIgcHJvcGVydHkgb2YgZmlsZXMgbmFtZWQgImZlYXR1cmUucHJvcGVydGllcyIgCi1mb3VuZCB3aXRoaW4gYSBGZWF0dXJlLgotU3VjaCBBYm91dHMsIEZlYXR1cmUgTGljZW5zZXMsIGFuZCBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBjb250YWluIHRoZSAKLXRlcm1zIGFuZCBjb25kaXRpb25zIChvciByZWZlcmVuY2VzIHRvIHN1Y2ggdGVybXMgYW5kIGNvbmRpdGlvbnMpIHRoYXQgCi1nb3Zlcm4geW91ciB1c2Ugb2YgdGhlIGFzc29jaWF0ZWQgQ29udGVudCBpbgotdGhhdCBkaXJlY3RvcnkuPC9wPgorCTxwPk5vdGU6IGlmIGEgRmVhdHVyZSBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIGlzCisJCWluc3RhbGxlZCB1c2luZyB0aGUgUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kgKGFzIGRlZmluZWQgYmVsb3cpLCB5b3UKKwkJbXVzdCBhZ3JlZSB0byBhIGxpY2Vuc2UgKCZxdW90O0ZlYXR1cmUgVXBkYXRlIExpY2Vuc2UmcXVvdDspIGR1cmluZworCQl0aGUgaW5zdGFsbGF0aW9uIHByb2Nlc3MuIElmIHRoZSBGZWF0dXJlIGNvbnRhaW5zIEluY2x1ZGVkIEZlYXR1cmVzLAorCQl0aGUgRmVhdHVyZSBVcGRhdGUgTGljZW5zZSBzaG91bGQgZWl0aGVyIHByb3ZpZGUgeW91IHdpdGggdGhlIHRlcm1zCisJCWFuZCBjb25kaXRpb25zIGdvdmVybmluZyB0aGUgSW5jbHVkZWQgRmVhdHVyZXMgb3IgaW5mb3JtIHlvdSB3aGVyZSB5b3UKKwkJY2FuIGxvY2F0ZSB0aGVtLiBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBtYXkgYmUgZm91bmQgaW4gdGhlCisJCSZxdW90O2xpY2Vuc2UmcXVvdDsgcHJvcGVydHkgb2YgZmlsZXMgbmFtZWQKKwkJJnF1b3Q7ZmVhdHVyZS5wcm9wZXJ0aWVzJnF1b3Q7IGZvdW5kIHdpdGhpbiBhIEZlYXR1cmUuIFN1Y2ggQWJvdXRzLAorCQlGZWF0dXJlIExpY2Vuc2VzLCBhbmQgRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgY29udGFpbiB0aGUgdGVybXMgYW5kCisJCWNvbmRpdGlvbnMgKG9yIHJlZmVyZW5jZXMgdG8gc3VjaCB0ZXJtcyBhbmQgY29uZGl0aW9ucykgdGhhdCBnb3Zlcm4KKwkJeW91ciB1c2Ugb2YgdGhlIGFzc29jaWF0ZWQgQ29udGVudCBpbiB0aGF0IGRpcmVjdG9yeS48L3A+CiAKLTxwPlRIRSBBQk9VVFMsIEZFQVRVUkUgTElDRU5TRVMsIEFORCBGRUFUVVJFIFVQREFURSBMSUNFTlNFUyBNQVkgUkVGRVIgCi1UTyBUSEUgRVBMIE9SIE9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUywgTk9USUNFUyBPUiBURVJNUyBBTkQgQ09ORElUSU9OUy4KLSAgU09NRSBPRiBUSEVTRQotT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTIE1BWSBJTkNMVURFIChCVVQgQVJFIE5PVCBMSU1JVEVEIFRPKTo8L3A+CisJPHA+VEhFIEFCT1VUUywgRkVBVFVSRSBMSUNFTlNFUywgQU5EIEZFQVRVUkUgVVBEQVRFIExJQ0VOU0VTIE1BWQorCQlSRUZFUiBUTyBUSEUgRVBMIE9SIE9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUywgTk9USUNFUyBPUiBURVJNUyBBTkQKKwkJQ09ORElUSU9OUy4gU09NRSBPRiBUSEVTRSBPVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMgTUFZIElOQ0xVREUgKEJVVAorCQlBUkUgTk9UIExJTUlURUQgVE8pOjwvcD4KIAotPHVsPgotICAgICAgIDxsaT5FY2xpcHNlIERpc3RyaWJ1dGlvbiBMaWNlbnNlIFZlcnNpb24gMS4wIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9saWNlbnNlcy9lZGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGljZW5zZXMvZWRsLXYxLjAuaHRtbDwvYT4pPC9saT4KLSAgICAgICA8bGk+Q29tbW9uIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sPC9hPik8L2xpPgotICAgICAgIDxsaT5BcGFjaGUgU29mdHdhcmUgTGljZW5zZSAxLjEgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRSI+aHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0U8L2E+KTwvbGk+Ci0gICAgICAgPGxpPkFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDIuMCAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCI+aHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wPC9hPik8L2xpPgotICAgICAgIDxsaT5NZXRybyBMaW5rIFB1YmxpYyBMaWNlbnNlIDEuMDAgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3Lm9wZW5ncm91cC5vcmcvb3Blbm1vdGlmL3N1cHBvcnRlcnMvbWV0cm9saW5rL2xpY2Vuc2UuaHRtbCI+aHR0cDovL3d3dy5vcGVuZ3JvdXAub3JnL29wZW5tb3RpZi9zdXBwb3J0ZXJzL21ldHJvbGluay9saWNlbnNlLmh0bWw8L2E+KTwvbGk+Ci0gICAgICAgPGxpPk1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjEgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC9NUEwtMS4xLmh0bWwiPmh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBML01QTC0xLjEuaHRtbDwvYT4pPC9saT4KLTwvdWw+CisJPHVsPgorCQk8bGk+RWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoYXZhaWxhYmxlIGF0IDxhCisJCQlocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWw8L2E+KQorCQk8L2xpPgorCQk8bGk+RWNsaXBzZSBEaXN0cmlidXRpb24gTGljZW5zZSBWZXJzaW9uIDEuMCAoYXZhaWxhYmxlIGF0IDxhCisJCQlocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xpY2Vuc2VzL2VkbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9saWNlbnNlcy9lZGwtdjEuMC5odG1sPC9hPikKKwkJPC9saT4KKwkJPGxpPkNvbW1vbiBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoYXZhaWxhYmxlIGF0IDxhCisJCQlocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWw8L2E+KQorCQk8L2xpPgorCQk8bGk+QXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMS4xIChhdmFpbGFibGUgYXQgPGEKKwkJCWhyZWY9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFIj5odHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRTwvYT4pCisJCTwvbGk+CisJCTxsaT5BcGFjaGUgU29mdHdhcmUgTGljZW5zZSAyLjAgKGF2YWlsYWJsZSBhdCA8YQorCQkJaHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wIj5odHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjA8L2E+KQorCQk8L2xpPgorCQk8bGk+TW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMSAoYXZhaWxhYmxlIGF0IDxhCisJCQlocmVmPSJodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC9NUEwtMS4xLmh0bWwiPmh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBML01QTC0xLjEuaHRtbDwvYT4pCisJCTwvbGk+CisJPC91bD4KIAotPHA+SVQgSVMgWU9VUiBPQkxJR0FUSU9OIFRPIFJFQUQgQU5EIEFDQ0VQVCBBTEwgU1VDSCBURVJNUyBBTkQgCi1DT05ESVRJT05TIFBSSU9SIFRPIFVTRSBPRiBUSEUgQ09OVEVOVC4gIElmIG5vIEFib3V0LCBGZWF0dXJlIExpY2Vuc2UsIAotb3IgRmVhdHVyZSBVcGRhdGUgTGljZW5zZSBpcyBwcm92aWRlZCwgcGxlYXNlCi1jb250YWN0IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gdG8gZGV0ZXJtaW5lIHdoYXQgdGVybXMgYW5kIGNvbmRpdGlvbnMgCi1nb3Zlcm4gdGhhdCBwYXJ0aWN1bGFyIENvbnRlbnQuPC9wPgorCTxwPklUIElTIFlPVVIgT0JMSUdBVElPTiBUTyBSRUFEIEFORCBBQ0NFUFQgQUxMIFNVQ0ggVEVSTVMgQU5ECisJCUNPTkRJVElPTlMgUFJJT1IgVE8gVVNFIE9GIFRIRSBDT05URU5ULiBJZiBubyBBYm91dCwgRmVhdHVyZSBMaWNlbnNlLAorCQlvciBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIGlzIHByb3ZpZGVkLCBwbGVhc2UgY29udGFjdCB0aGUgRWNsaXBzZQorCQlGb3VuZGF0aW9uIHRvIGRldGVybWluZSB3aGF0IHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybiB0aGF0CisJCXBhcnRpY3VsYXIgQ29udGVudC48L3A+CiAKIAotPGgzPlVzZSBvZiBQcm92aXNpb25pbmcgVGVjaG5vbG9neTwvaDM+CisJPGgzPlVzZSBvZiBQcm92aXNpb25pbmcgVGVjaG5vbG9neTwvaDM+CiAKLTxwPlRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWFrZXMgYXZhaWxhYmxlIHByb3Zpc2lvbmluZyBzb2Z0d2FyZSwgCi1leGFtcGxlcyBvZiB3aGljaCBpbmNsdWRlLCBidXQgYXJlIG5vdCBsaW1pdGVkIHRvLCBwMiBhbmQgdGhlIEVjbGlwc2UKLSAgIFVwZGF0ZSBNYW5hZ2VyICgiUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kiKSBmb3IgdGhlIHB1cnBvc2Ugb2YgCi1hbGxvd2luZyB1c2VycyB0byBpbnN0YWxsIHNvZnR3YXJlLCBkb2N1bWVudGF0aW9uLCBpbmZvcm1hdGlvbiBhbmQvb3IKLSAgIG90aGVyIG1hdGVyaWFscyAoY29sbGVjdGl2ZWx5ICJJbnN0YWxsYWJsZSBTb2Z0d2FyZSIpLiBUaGlzIAotY2FwYWJpbGl0eSBpcyBwcm92aWRlZCB3aXRoIHRoZSBpbnRlbnQgb2YgYWxsb3dpbmcgc3VjaCB1c2VycyB0bwotICAgaW5zdGFsbCwgZXh0ZW5kIGFuZCB1cGRhdGUgRWNsaXBzZS1iYXNlZCBwcm9kdWN0cy4gSW5mb3JtYXRpb24gYWJvdXQgCi1wYWNrYWdpbmcgSW5zdGFsbGFibGUgU29mdHdhcmUgaXMgYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly9lY2xpcHNlLm9yZy9lcXVpbm94L3AyL3JlcG9zaXRvcnlfcGFja2FnaW5nLmh0bWwiPmh0dHA6Ly9lY2xpcHNlLm9yZy9lcXVpbm94L3AyL3JlcG9zaXRvcnlfcGFja2FnaW5nLmh0bWw8L2E+Ci0gICAoIlNwZWNpZmljYXRpb24iKS48L3A+CisJPHA+CisJCVRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWFrZXMgYXZhaWxhYmxlIHByb3Zpc2lvbmluZyBzb2Z0d2FyZSwgZXhhbXBsZXMKKwkJb2Ygd2hpY2ggaW5jbHVkZSwgYnV0IGFyZSBub3QgbGltaXRlZCB0bywgcDIgYW5kIHRoZSBFY2xpcHNlIFVwZGF0ZQorCQlNYW5hZ2VyICgmcXVvdDtQcm92aXNpb25pbmcgVGVjaG5vbG9neSZxdW90OykgZm9yIHRoZSBwdXJwb3NlIG9mCisJCWFsbG93aW5nIHVzZXJzIHRvIGluc3RhbGwgc29mdHdhcmUsIGRvY3VtZW50YXRpb24sIGluZm9ybWF0aW9uIGFuZC9vcgorCQlvdGhlciBtYXRlcmlhbHMgKGNvbGxlY3RpdmVseSAmcXVvdDtJbnN0YWxsYWJsZSBTb2Z0d2FyZSZxdW90OykuIFRoaXMKKwkJY2FwYWJpbGl0eSBpcyBwcm92aWRlZCB3aXRoIHRoZSBpbnRlbnQgb2YgYWxsb3dpbmcgc3VjaCB1c2VycyB0bworCQlpbnN0YWxsLCBleHRlbmQgYW5kIHVwZGF0ZSBFY2xpcHNlLWJhc2VkIHByb2R1Y3RzLiBJbmZvcm1hdGlvbiBhYm91dAorCQlwYWNrYWdpbmcgSW5zdGFsbGFibGUgU29mdHdhcmUgaXMgYXZhaWxhYmxlIGF0IDxhCisJCQlocmVmPSJodHRwOi8vZWNsaXBzZS5vcmcvZXF1aW5veC9wMi9yZXBvc2l0b3J5X3BhY2thZ2luZy5odG1sIj5odHRwOi8vZWNsaXBzZS5vcmcvZXF1aW5veC9wMi9yZXBvc2l0b3J5X3BhY2thZ2luZy5odG1sPC9hPgorCQkoJnF1b3Q7U3BlY2lmaWNhdGlvbiZxdW90OykuCisJPC9wPgogCi08cD5Zb3UgbWF5IHVzZSBQcm92aXNpb25pbmcgVGVjaG5vbG9neSB0byBhbGxvdyBvdGhlciBwYXJ0aWVzIHRvIGluc3RhbGwKLSBJbnN0YWxsYWJsZSBTb2Z0d2FyZS4gWW91IHNoYWxsIGJlIHJlc3BvbnNpYmxlIGZvciBlbmFibGluZyB0aGUKLSAgIGFwcGxpY2FibGUgbGljZW5zZSBhZ3JlZW1lbnRzIHJlbGF0aW5nIHRvIHRoZSBJbnN0YWxsYWJsZSBTb2Z0d2FyZSB0bwotIGJlIHByZXNlbnRlZCB0bywgYW5kIGFjY2VwdGVkIGJ5LCB0aGUgdXNlcnMgb2YgdGhlIFByb3Zpc2lvbmluZyAKLVRlY2hub2xvZ3kKLSAgIGluIGFjY29yZGFuY2Ugd2l0aCB0aGUgU3BlY2lmaWNhdGlvbi4gQnkgdXNpbmcgUHJvdmlzaW9uaW5nIAotVGVjaG5vbG9neSBpbiBzdWNoIGEgbWFubmVyIGFuZCBtYWtpbmcgaXQgYXZhaWxhYmxlIGluIGFjY29yZGFuY2Ugd2l0aCAKLXRoZQotICAgU3BlY2lmaWNhdGlvbiwgeW91IGZ1cnRoZXIgYWNrbm93bGVkZ2UgeW91ciBhZ3JlZW1lbnQgdG8sIGFuZCB0aGUgCi1hY3F1aXNpdGlvbiBvZiBhbGwgbmVjZXNzYXJ5IHJpZ2h0cyB0byBwZXJtaXQgdGhlIGZvbGxvd2luZzo8L3A+CisJPHA+WW91IG1heSB1c2UgUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kgdG8gYWxsb3cgb3RoZXIgcGFydGllcyB0bworCQlpbnN0YWxsIEluc3RhbGxhYmxlIFNvZnR3YXJlLiBZb3Ugc2hhbGwgYmUgcmVzcG9uc2libGUgZm9yIGVuYWJsaW5nCisJCXRoZSBhcHBsaWNhYmxlIGxpY2Vuc2UgYWdyZWVtZW50cyByZWxhdGluZyB0byB0aGUgSW5zdGFsbGFibGUgU29mdHdhcmUKKwkJdG8gYmUgcHJlc2VudGVkIHRvLCBhbmQgYWNjZXB0ZWQgYnksIHRoZSB1c2VycyBvZiB0aGUgUHJvdmlzaW9uaW5nCisJCVRlY2hub2xvZ3kgaW4gYWNjb3JkYW5jZSB3aXRoIHRoZSBTcGVjaWZpY2F0aW9uLiBCeSB1c2luZyBQcm92aXNpb25pbmcKKwkJVGVjaG5vbG9neSBpbiBzdWNoIGEgbWFubmVyIGFuZCBtYWtpbmcgaXQgYXZhaWxhYmxlIGluIGFjY29yZGFuY2Ugd2l0aAorCQl0aGUgU3BlY2lmaWNhdGlvbiwgeW91IGZ1cnRoZXIgYWNrbm93bGVkZ2UgeW91ciBhZ3JlZW1lbnQgdG8sIGFuZCB0aGUKKwkJYWNxdWlzaXRpb24gb2YgYWxsIG5lY2Vzc2FyeSByaWdodHMgdG8gcGVybWl0IHRoZSBmb2xsb3dpbmc6PC9wPgogCi08b2w+Ci0gICAgICAgPGxpPkEgc2VyaWVzIG9mIGFjdGlvbnMgbWF5IG9jY3VyICgiUHJvdmlzaW9uaW5nIFByb2Nlc3MiKSBpbiAKLXdoaWNoIGEgdXNlciBtYXkgZXhlY3V0ZSB0aGUgUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kKLSAgICAgICBvbiBhIG1hY2hpbmUgKCJUYXJnZXQgTWFjaGluZSIpIHdpdGggdGhlIGludGVudCBvZiBpbnN0YWxsaW5nLCAKLWV4dGVuZGluZyBvciB1cGRhdGluZyB0aGUgZnVuY3Rpb25hbGl0eSBvZiBhbiBFY2xpcHNlLWJhc2VkCi0gICAgICAgcHJvZHVjdC48L2xpPgotICAgICAgIDxsaT5EdXJpbmcgdGhlIFByb3Zpc2lvbmluZyBQcm9jZXNzLCB0aGUgUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kgCi1tYXkgY2F1c2UgdGhpcmQgcGFydHkgSW5zdGFsbGFibGUgU29mdHdhcmUgb3IgYSBwb3J0aW9uIHRoZXJlb2YgdG8gYmUKLSAgICAgICBhY2Nlc3NlZCBhbmQgY29waWVkIHRvIHRoZSBUYXJnZXQgTWFjaGluZS48L2xpPgotICAgICAgIDxsaT5QdXJzdWFudCB0byB0aGUgU3BlY2lmaWNhdGlvbiwgeW91IHdpbGwgcHJvdmlkZSB0byB0aGUgdXNlciAKLXRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyB0aGF0IGdvdmVybiB0aGUgdXNlIG9mIHRoZSBJbnN0YWxsYWJsZQotICAgICAgIFNvZnR3YXJlICgiSW5zdGFsbGFibGUgU29mdHdhcmUgQWdyZWVtZW50IikgYW5kIHN1Y2ggSW5zdGFsbGFibGUgCi1Tb2Z0d2FyZSBBZ3JlZW1lbnQgc2hhbGwgYmUgYWNjZXNzZWQgZnJvbSB0aGUgVGFyZ2V0Ci0gICAgICAgTWFjaGluZSBpbiBhY2NvcmRhbmNlIHdpdGggdGhlIFNwZWNpZmljYXRpb24uIFN1Y2ggSW5zdGFsbGFibGUgCi1Tb2Z0d2FyZSBBZ3JlZW1lbnQgbXVzdCBpbmZvcm0gdGhlIHVzZXIgb2YgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIHRoYXQKLSBnb3Zlcm4KLSAgICAgICB0aGUgSW5zdGFsbGFibGUgU29mdHdhcmUgYW5kIG11c3Qgc29saWNpdCBhY2NlcHRhbmNlIGJ5IHRoZSBlbmQgCi11c2VyIGluIHRoZSBtYW5uZXIgcHJlc2NyaWJlZCBpbiBzdWNoIEluc3RhbGxhYmxlIFNvZnR3YXJlIEFncmVlbWVudC4gCi1VcG9uIHN1Y2gKLSAgICAgICBpbmRpY2F0aW9uIG9mIGFncmVlbWVudCBieSB0aGUgdXNlciwgdGhlIHByb3Zpc2lvbmluZyBUZWNobm9sb2d5IAotd2lsbCBjb21wbGV0ZSBpbnN0YWxsYXRpb24gb2YgdGhlIEluc3RhbGxhYmxlIFNvZnR3YXJlLjwvbGk+Ci08L29sPgorCTxvbD4KKwkJPGxpPkEgc2VyaWVzIG9mIGFjdGlvbnMgbWF5IG9jY3VyICgmcXVvdDtQcm92aXNpb25pbmcKKwkJCVByb2Nlc3MmcXVvdDspIGluIHdoaWNoIGEgdXNlciBtYXkgZXhlY3V0ZSB0aGUgUHJvdmlzaW9uaW5nCisJCQlUZWNobm9sb2d5IG9uIGEgbWFjaGluZSAoJnF1b3Q7VGFyZ2V0IE1hY2hpbmUmcXVvdDspIHdpdGggdGhlIGludGVudAorCQkJb2YgaW5zdGFsbGluZywgZXh0ZW5kaW5nIG9yIHVwZGF0aW5nIHRoZSBmdW5jdGlvbmFsaXR5IG9mIGFuCisJCQlFY2xpcHNlLWJhc2VkIHByb2R1Y3QuPC9saT4KKwkJPGxpPkR1cmluZyB0aGUgUHJvdmlzaW9uaW5nIFByb2Nlc3MsIHRoZSBQcm92aXNpb25pbmcgVGVjaG5vbG9neQorCQkJbWF5IGNhdXNlIHRoaXJkIHBhcnR5IEluc3RhbGxhYmxlIFNvZnR3YXJlIG9yIGEgcG9ydGlvbiB0aGVyZW9mIHRvIGJlCisJCQlhY2Nlc3NlZCBhbmQgY29waWVkIHRvIHRoZSBUYXJnZXQgTWFjaGluZS48L2xpPgorCQk8bGk+UHVyc3VhbnQgdG8gdGhlIFNwZWNpZmljYXRpb24sIHlvdSB3aWxsIHByb3ZpZGUgdG8gdGhlIHVzZXIKKwkJCXRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyB0aGF0IGdvdmVybiB0aGUgdXNlIG9mIHRoZSBJbnN0YWxsYWJsZQorCQkJU29mdHdhcmUgKCZxdW90O0luc3RhbGxhYmxlIFNvZnR3YXJlIEFncmVlbWVudCZxdW90OykgYW5kIHN1Y2gKKwkJCUluc3RhbGxhYmxlIFNvZnR3YXJlIEFncmVlbWVudCBzaGFsbCBiZSBhY2Nlc3NlZCBmcm9tIHRoZSBUYXJnZXQKKwkJCU1hY2hpbmUgaW4gYWNjb3JkYW5jZSB3aXRoIHRoZSBTcGVjaWZpY2F0aW9uLiBTdWNoIEluc3RhbGxhYmxlCisJCQlTb2Z0d2FyZSBBZ3JlZW1lbnQgbXVzdCBpbmZvcm0gdGhlIHVzZXIgb2YgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zCisJCQl0aGF0IGdvdmVybiB0aGUgSW5zdGFsbGFibGUgU29mdHdhcmUgYW5kIG11c3Qgc29saWNpdCBhY2NlcHRhbmNlIGJ5CisJCQl0aGUgZW5kIHVzZXIgaW4gdGhlIG1hbm5lciBwcmVzY3JpYmVkIGluIHN1Y2ggSW5zdGFsbGFibGUgU29mdHdhcmUKKwkJCUFncmVlbWVudC4gVXBvbiBzdWNoIGluZGljYXRpb24gb2YgYWdyZWVtZW50IGJ5IHRoZSB1c2VyLCB0aGUKKwkJCXByb3Zpc2lvbmluZyBUZWNobm9sb2d5IHdpbGwgY29tcGxldGUgaW5zdGFsbGF0aW9uIG9mIHRoZSBJbnN0YWxsYWJsZQorCQkJU29mdHdhcmUuPC9saT4KKwk8L29sPgogCi08aDM+Q3J5cHRvZ3JhcGh5PC9oMz4KKwk8aDM+Q3J5cHRvZ3JhcGh5PC9oMz4KIAotPHA+Q29udGVudCBtYXkgY29udGFpbiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBUaGUgY291bnRyeSBpbiB3aGljaCB5b3UgYXJlCi0gY3VycmVudGx5IG1heSBoYXZlIHJlc3RyaWN0aW9ucyBvbiB0aGUgaW1wb3J0LCBwb3NzZXNzaW9uLCBhbmQgdXNlLCAKLWFuZC9vciByZS1leHBvcnQgdG8KLSAgIGFub3RoZXIgY291bnRyeSwgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZS4gQkVGT1JFIHVzaW5nIGFueSBlbmNyeXB0aW9uIAotc29mdHdhcmUsIHBsZWFzZSBjaGVjayB0aGUgY291bnRyeSdzIGxhd3MsIHJlZ3VsYXRpb25zIGFuZCBwb2xpY2llcyAKLWNvbmNlcm5pbmcgdGhlIGltcG9ydCwKLSAgIHBvc3Nlc3Npb24sIG9yIHVzZSwgYW5kIHJlLWV4cG9ydCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLCB0byBzZWUgaWYgCi10aGlzIGlzIHBlcm1pdHRlZC48L3A+CisJPHA+Q29udGVudCBtYXkgY29udGFpbiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBUaGUgY291bnRyeSBpbiB3aGljaAorCQl5b3UgYXJlIGN1cnJlbnRseSBtYXkgaGF2ZSByZXN0cmljdGlvbnMgb24gdGhlIGltcG9ydCwgcG9zc2Vzc2lvbiwgYW5kCisJCXVzZSwgYW5kL29yIHJlLWV4cG9ydCB0byBhbm90aGVyIGNvdW50cnksIG9mIGVuY3J5cHRpb24gc29mdHdhcmUuCisJCUJFRk9SRSB1c2luZyBhbnkgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgcGxlYXNlIGNoZWNrIHRoZSBjb3VudHJ5J3MgbGF3cywKKwkJcmVndWxhdGlvbnMgYW5kIHBvbGljaWVzIGNvbmNlcm5pbmcgdGhlIGltcG9ydCwgcG9zc2Vzc2lvbiwgb3IgdXNlLAorCQlhbmQgcmUtZXhwb3J0IG9mIGVuY3J5cHRpb24gc29mdHdhcmUsIHRvIHNlZSBpZiB0aGlzIGlzIHBlcm1pdHRlZC48L3A+CiAKLTxwPjxzbWFsbD5KYXZhIGFuZCBhbGwgSmF2YS1iYXNlZCB0cmFkZW1hcmtzIGFyZSB0cmFkZW1hcmtzIG9mIE9yYWNsZSBDb3Jwb3JhdGlvbiBpbiB0aGUgVW5pdGVkIFN0YXRlcywgb3RoZXIgY291bnRyaWVzLCBvciBib3RoLjwvc21hbGw+PC9wPgotCi0KLTwvYm9keT48L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQorCTxwPgorCQk8c21hbGw+SmF2YSBhbmQgYWxsIEphdmEtYmFzZWQgdHJhZGVtYXJrcyBhcmUgdHJhZGVtYXJrcyBvZgorCQkJT3JhY2xlIENvcnBvcmF0aW9uIGluIHRoZSBVbml0ZWQgU3RhdGVzLCBvdGhlciBjb3VudHJpZXMsIG9yIGJvdGguPC9zbWFsbD4KKwk8L3A+Cis8L2JvZHk+Cis8L2h0bWw+CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmRhdGFpbnRlcmNoYW5nZS5mZWF0dXJlL3BvbS54bWwgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmRhdGFpbnRlcmNoYW5nZS5mZWF0dXJlL3BvbS54bWwKaW5kZXggM2IwOTNlOC4uNjBhMDQ3NCAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5kYXRhaW50ZXJjaGFuZ2UuZmVhdHVyZS9wb20ueG1sCisrKyBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQuZGF0YWludGVyY2hhbmdlLmZlYXR1cmUvcG9tLnhtbApAQCAtMiw5ICsyLDExIEBACiA8IS0tIz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgogPCEtLSMgQ29weXJpZ2h0IChjKSAyMDExLCAyMDE2IC0gTG9ldHogR21iSCZDby5LRyAoNjkxMTUgSGVpZGVsYmVyZywgR2VybWFueSkuIC0tPgogPCEtLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAtLT4KLTwhLS0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCAtLT4KKzwhLS0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgMi4wICAtLT4KIDwhLS0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IC0tPgotPCEtLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwgLS0+Cis8IS0tIyBodHRwczovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLyAgICAtLT4KKzwhLS0jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgorPCEtLSMgU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgICAgICAgICAgLS0+CiA8IS0tIyAtLT4KIDwhLS0jIENvbnRyaWJ1dG9yczogLS0+CiA8IS0tIyBDaHJpc3RvcGhlIExvZXR6ICAoTG9ldHogR21iSCZDby5LRykgLSBJbml0aWFsIGltcGxlbWVudGF0aW9uIEFQSSBhbmQgaW1wbGVtZW50YXRpb24gLS0+CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmRhdGFpbnRlcmNoYW5nZS5pZGUvcG9tLnhtbCBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQuZGF0YWludGVyY2hhbmdlLmlkZS9wb20ueG1sCmluZGV4IDQ2Mzk5M2UuLjM2NzliMWEgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLm9zYnAueHRleHQuZGF0YWludGVyY2hhbmdlLmlkZS9wb20ueG1sCisrKyBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQuZGF0YWludGVyY2hhbmdlLmlkZS9wb20ueG1sCkBAIC0yLDkgKzIsMTEgQEAKIDwhLS0jPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+CiA8IS0tIyBDb3B5cmlnaHQgKGMpIDIwMTEsIDIwMTYgLSBMb2V0eiBHbWJIJkNvLktHICg2OTExNSBIZWlkZWxiZXJnLCBHZXJtYW55KSAtLT4KIDwhLS0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgLS0+Ci08IS0tIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgLS0+Cis8IS0tIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIDIuMCAgLS0+CiA8IS0tIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAtLT4KLTwhLS0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIC0tPgorPCEtLSMgaHR0cHM6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC8gICAgLS0+Cis8IS0tIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLT4KKzwhLS0jIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wICAgICAgICAgIC0tPgogPCEtLSMgLS0+CiA8IS0tIyBDb250cmlidXRvcnM6IC0tPgogPCEtLSMgICAgIENocmlzdG9waGUgTG9ldHogKExvZXR6IEdtYkgmQ28uS0cpIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uIC0tPgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5kYXRhaW50ZXJjaGFuZ2UuaWRlL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9kYXRhaW50ZXJjaGFuZ2UvaWRlL0Fic3RyYWN0RGF0YURTTElkZU1vZHVsZS5qYXZhIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5kYXRhaW50ZXJjaGFuZ2UuaWRlL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9kYXRhaW50ZXJjaGFuZ2UvaWRlL0Fic3RyYWN0RGF0YURTTElkZU1vZHVsZS5qYXZhCmluZGV4IDA3Y2M4MzUuLmVhYTVmMDEgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLm9zYnAueHRleHQuZGF0YWludGVyY2hhbmdlLmlkZS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvZGF0YWludGVyY2hhbmdlL2lkZS9BYnN0cmFjdERhdGFEU0xJZGVNb2R1bGUuamF2YQorKysgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmRhdGFpbnRlcmNoYW5nZS5pZGUvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2RhdGFpbnRlcmNoYW5nZS9pZGUvQWJzdHJhY3REYXRhRFNMSWRlTW9kdWxlLmphdmEKQEAgLTMsOSArMywxMSBAQAogICogIENvcHlyaWdodCAoYykgMjAxMSwgMjAxNiAtIExvZXR6IEdtYkgmQ28uS0cgKDY5MTE1IEhlaWRlbGJlcmcsIEdlcm1hbnkpIAogICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgKiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAgICAgICAgICAgCi0gKiAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wICAgICAgIAorICogIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgMi4wICAgICAgICAKICAqICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAgICAgICAgICAgICAgICAgIAotICogIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKiAgaHR0cHM6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKiAgU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICogIENvbnRyaWJ1dG9yczogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAqIAkgICBDaHJpc3RvcGhlIExvZXR6IChMb2V0eiBHbWJIJkNvLktHKSAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLm9zYnAueHRleHQuZGF0YWludGVyY2hhbmdlLmlkZS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvZGF0YWludGVyY2hhbmdlL2lkZS9jb250ZW50YXNzaXN0L2FudGxyL0RhdGFEU0xQYXJzZXIuamF2YSBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQuZGF0YWludGVyY2hhbmdlLmlkZS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvZGF0YWludGVyY2hhbmdlL2lkZS9jb250ZW50YXNzaXN0L2FudGxyL0RhdGFEU0xQYXJzZXIuamF2YQppbmRleCA0ZjU1NmFmLi42YzI4ZDdiIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmRhdGFpbnRlcmNoYW5nZS5pZGUvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2RhdGFpbnRlcmNoYW5nZS9pZGUvY29udGVudGFzc2lzdC9hbnRsci9EYXRhRFNMUGFyc2VyLmphdmEKKysrIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5kYXRhaW50ZXJjaGFuZ2UuaWRlL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9kYXRhaW50ZXJjaGFuZ2UvaWRlL2NvbnRlbnRhc3Npc3QvYW50bHIvRGF0YURTTFBhcnNlci5qYXZhCkBAIC0zLDkgKzMsMTEgQEAKICAqICBDb3B5cmlnaHQgKGMpIDIwMTEsIDIwMTYgLSBMb2V0eiBHbWJIJkNvLktHICg2OTExNSBIZWlkZWxiZXJnLCBHZXJtYW55KSAKICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICogIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgICAgICAgICAgIAotICogIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCAgICAgICAKKyAqICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIDIuMCAgICAgICAgCiAgKiAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgICAgICAgICAgICAgICAgICAKLSAqICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICogIGh0dHBzOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAvICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICogIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAqICBDb250cmlidXRvcnM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgKiAJICAgQ2hyaXN0b3BoZSBMb2V0eiAoTG9ldHogR21iSCZDby5LRykgLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCkBAIC00Niw2ICs0OCw3IEBACiAJCQkJewogCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXREYXRhSW50ZXJjaGFuZ2VGaWxlQWNjZXNzKCkuZ2V0QWx0ZXJuYXRpdmVzKCksICJydWxlX19EYXRhSW50ZXJjaGFuZ2VGaWxlX19BbHRlcm5hdGl2ZXMiKTsKIAkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YUludGVyY2hhbmdlRXhwcmVzc2lvbkFjY2VzcygpLmdldEFsdGVybmF0aXZlcygpLCAicnVsZV9fRGF0YUludGVyY2hhbmdlRXhwcmVzc2lvbl9fQWx0ZXJuYXRpdmVzIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldERhdGFJbnRlcmNoYW5nZUV4cG9zZUFjY2VzcygpLmdldEFsdGVybmF0aXZlc18zKCksICJydWxlX19EYXRhSW50ZXJjaGFuZ2VFeHBvc2VfX0FsdGVybmF0aXZlc18zIik7CiAJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldERhdGFJbnRlcmNoYW5nZU1hcHBpbmdBY2Nlc3MoKS5nZXRBbHRlcm5hdGl2ZXMoKSwgInJ1bGVfX0RhdGFJbnRlcmNoYW5nZU1hcHBpbmdfX0FsdGVybmF0aXZlcyIpOwogCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRYSW1wb3J0RGVjbGFyYXRpb25BY2Nlc3MoKS5nZXRBbHRlcm5hdGl2ZXNfMigpLCAicnVsZV9fWEltcG9ydERlY2xhcmF0aW9uX19BbHRlcm5hdGl2ZXNfMiIpOwogCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRYSW1wb3J0RGVjbGFyYXRpb25BY2Nlc3MoKS5nZXRBbHRlcm5hdGl2ZXNfMl8wXzMoKSwgInJ1bGVfX1hJbXBvcnREZWNsYXJhdGlvbl9fQWx0ZXJuYXRpdmVzXzJfMF8zIik7CkBAIC05NCw2ICs5Nyw4IEBACiAJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldFByZWRlZmluZWRCZWFuRW51bUFjY2VzcygpLmdldEFsdGVybmF0aXZlcygpLCAicnVsZV9fUHJlZGVmaW5lZEJlYW5FbnVtX19BbHRlcm5hdGl2ZXMiKTsKIAkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0UHJlZGVmaW5lZEJlYW5UeXBlRW51bUFjY2VzcygpLmdldEFsdGVybmF0aXZlcygpLCAicnVsZV9fUHJlZGVmaW5lZEJlYW5UeXBlRW51bV9fQWx0ZXJuYXRpdmVzIik7CiAJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldEVudGl0eU1hbmFnZXJNb2RlQWNjZXNzKCkuZ2V0QWx0ZXJuYXRpdmVzKCksICJydWxlX19FbnRpdHlNYW5hZ2VyTW9kZV9fQWx0ZXJuYXRpdmVzIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldENvbmRpdGlvbkFuZE9wZXJhdG9yMUFjY2VzcygpLmdldEFsdGVybmF0aXZlcygpLCAicnVsZV9fQ29uZGl0aW9uQW5kT3BlcmF0b3IxX19BbHRlcm5hdGl2ZXMiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0Q29uZGl0aW9uQW5kT3BlcmF0b3IyQWNjZXNzKCkuZ2V0QWx0ZXJuYXRpdmVzKCksICJydWxlX19Db25kaXRpb25BbmRPcGVyYXRvcjJfX0FsdGVybmF0aXZlcyIpOwogCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXREYXRhSW50ZXJjaGFuZ2VNb2RlbEFjY2VzcygpLmdldEdyb3VwKCksICJydWxlX19EYXRhSW50ZXJjaGFuZ2VNb2RlbF9fR3JvdXBfXzAiKTsKIAkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YUludGVyY2hhbmdlUGFja2FnZUFjY2VzcygpLmdldEdyb3VwKCksICJydWxlX19EYXRhSW50ZXJjaGFuZ2VQYWNrYWdlX19Hcm91cF9fMCIpOwogCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXREYXRhSW50ZXJjaGFuZ2VQYWNrYWdlQWNjZXNzKCkuZ2V0R3JvdXBfNSgpLCAicnVsZV9fRGF0YUludGVyY2hhbmdlUGFja2FnZV9fR3JvdXBfNV9fMCIpOwpAQCAtMTIyLDYgKzEyNyw5IEBACiAJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldERhdGFJbnRlcmNoYW5nZUJlYW5BY2Nlc3MoKS5nZXRHcm91cF84KCksICJydWxlX19EYXRhSW50ZXJjaGFuZ2VCZWFuX19Hcm91cF84X18wIik7CiAJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldERhdGFJbnRlcmNoYW5nZUJlYW5BY2Nlc3MoKS5nZXRHcm91cF85KCksICJydWxlX19EYXRhSW50ZXJjaGFuZ2VCZWFuX19Hcm91cF85X18wIik7CiAJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldERhdGFJbnRlcmNoYW5nZUJlYW5BY2Nlc3MoKS5nZXRHcm91cF8xMCgpLCAicnVsZV9fRGF0YUludGVyY2hhbmdlQmVhbl9fR3JvdXBfMTBfXzAiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YUludGVyY2hhbmdlQmVhbkFjY2VzcygpLmdldEdyb3VwXzExKCksICJydWxlX19EYXRhSW50ZXJjaGFuZ2VCZWFuX19Hcm91cF8xMV9fMCIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXREYXRhSW50ZXJjaGFuZ2VCZWFuQWNjZXNzKCkuZ2V0R3JvdXBfMTIoKSwgInJ1bGVfX0RhdGFJbnRlcmNoYW5nZUJlYW5fX0dyb3VwXzEyX18wIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldERhdGFJbnRlcmNoYW5nZUJlYW5BY2Nlc3MoKS5nZXRHcm91cF8xMygpLCAicnVsZV9fRGF0YUludGVyY2hhbmdlQmVhbl9fR3JvdXBfMTNfXzAiKTsKIAkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YUludGVyY2hhbmdlS2V5QWNjZXNzKCkuZ2V0R3JvdXAoKSwgInJ1bGVfX0RhdGFJbnRlcmNoYW5nZUtleV9fR3JvdXBfXzAiKTsKIAkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YUludGVyY2hhbmdlTG9va3VwQWNjZXNzKCkuZ2V0R3JvdXAoKSwgInJ1bGVfX0RhdGFJbnRlcmNoYW5nZUxvb2t1cF9fR3JvdXBfXzAiKTsKIAkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YUludGVyY2hhbmdlTG9va3VwQWNjZXNzKCkuZ2V0R3JvdXBfNSgpLCAicnVsZV9fRGF0YUludGVyY2hhbmdlTG9va3VwX19Hcm91cF81X18wIik7CkBAIC0xMzIsNiArMTQwLDE1IEBACiAJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldERhdGFJbnRlcmNoYW5nZU1hcmtlckVudGl0eUFjY2VzcygpLmdldEdyb3VwXzMoKSwgInJ1bGVfX0RhdGFJbnRlcmNoYW5nZU1hcmtlckVudGl0eV9fR3JvdXBfM19fMCIpOwogCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXREYXRhSW50ZXJjaGFuZ2VGb3JtYXRBY2Nlc3MoKS5nZXRHcm91cCgpLCAicnVsZV9fRGF0YUludGVyY2hhbmdlRm9ybWF0X19Hcm91cF9fMCIpOwogCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXREYXRhSW50ZXJjaGFuZ2VFbnRpdHlFeHByZXNzaW9uQWNjZXNzKCkuZ2V0R3JvdXAoKSwgInJ1bGVfX0RhdGFJbnRlcmNoYW5nZUVudGl0eUV4cHJlc3Npb25fX0dyb3VwX18wIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldERhdGFJbnRlcmNoYW5nZUV4cG9zZUFjY2VzcygpLmdldEdyb3VwKCksICJydWxlX19EYXRhSW50ZXJjaGFuZ2VFeHBvc2VfX0dyb3VwX18wIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldERhdGFJbnRlcmNoYW5nZUV4cG9zZUFjY2VzcygpLmdldEdyb3VwXzNfMCgpLCAicnVsZV9fRGF0YUludGVyY2hhbmdlRXhwb3NlX19Hcm91cF8zXzBfXzAiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YUludGVyY2hhbmdlRXhwb3NlQWNjZXNzKCkuZ2V0R3JvdXBfM18xKCksICJydWxlX19EYXRhSW50ZXJjaGFuZ2VFeHBvc2VfX0dyb3VwXzNfMV9fMCIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXREYXRhSW50ZXJjaGFuZ2VFeHBvcnRGaWx0ZXJBY2Nlc3MoKS5nZXRHcm91cCgpLCAicnVsZV9fRGF0YUludGVyY2hhbmdlRXhwb3J0RmlsdGVyX19Hcm91cF9fMCIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXREYXRhSW50ZXJjaGFuZ2VFeHBvcnRGaWx0ZXJBY2Nlc3MoKS5nZXRHcm91cF8xKCksICJydWxlX19EYXRhSW50ZXJjaGFuZ2VFeHBvcnRGaWx0ZXJfX0dyb3VwXzFfXzAiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YUludGVyY2hhbmdlRXhwb3J0RmlsdGVyQWNjZXNzKCkuZ2V0R3JvdXBfMigpLCAicnVsZV9fRGF0YUludGVyY2hhbmdlRXhwb3J0RmlsdGVyX19Hcm91cF8yX18wIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldERhdGFJbnRlcmNoYW5nZUZpbHRlckNvbmRpdGlvbkFjY2VzcygpLmdldEdyb3VwKCksICJydWxlX19EYXRhSW50ZXJjaGFuZ2VGaWx0ZXJDb25kaXRpb25fX0dyb3VwX18wIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldERhdGFJbnRlcmNoYW5nZUZpbHRlckNvbmRpdGlvbkFjY2VzcygpLmdldEdyb3VwXzMoKSwgInJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbHRlckNvbmRpdGlvbl9fR3JvdXBfM19fMCIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXREYXRhSW50ZXJjaGFuZ2VFeHBvcnRIaWRlQWNjZXNzKCkuZ2V0R3JvdXAoKSwgInJ1bGVfX0RhdGFJbnRlcmNoYW5nZUV4cG9ydEhpZGVfX0dyb3VwX18wIik7CiAJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldERhdGFJbnRlcmNoYW5nZVByZWRlZmluZWRFeHByZXNzaW9uQWNjZXNzKCkuZ2V0R3JvdXAoKSwgInJ1bGVfX0RhdGFJbnRlcmNoYW5nZVByZWRlZmluZWRFeHByZXNzaW9uX19Hcm91cF9fMCIpOwogCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXREYXRhSW50ZXJjaGFuZ2VWYWx1ZU1hcHBpbmdBY2Nlc3MoKS5nZXRHcm91cCgpLCAicnVsZV9fRGF0YUludGVyY2hhbmdlVmFsdWVNYXBwaW5nX19Hcm91cF9fMCIpOwogCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXREYXRhSW50ZXJjaGFuZ2VCbG9iTWFwcGluZ0FjY2VzcygpLmdldEdyb3VwKCksICJydWxlX19EYXRhSW50ZXJjaGFuZ2VCbG9iTWFwcGluZ19fR3JvdXBfXzAiKTsKQEAgLTM1MSw4ICszNjgsOSBAQAogCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXREYXRhSW50ZXJjaGFuZ2VBY2Nlc3MoKS5nZXRWZWN0b3JOYW1lQXNzaWdubWVudF81XzEoKSwgInJ1bGVfX0RhdGFJbnRlcmNoYW5nZV9fVmVjdG9yTmFtZUFzc2lnbm1lbnRfNV8xIik7CiAJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldERhdGFJbnRlcmNoYW5nZUFjY2VzcygpLmdldENyZWF0ZVJlcG9ydEFzc2lnbm1lbnRfNigpLCAicnVsZV9fRGF0YUludGVyY2hhbmdlX19DcmVhdGVSZXBvcnRBc3NpZ25tZW50XzYiKTsKIAkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YUludGVyY2hhbmdlQWNjZXNzKCkuZ2V0RWxlbWVudFNpemVBc3NpZ25tZW50XzdfMSgpLCAicnVsZV9fRGF0YUludGVyY2hhbmdlX19FbGVtZW50U2l6ZUFzc2lnbm1lbnRfN18xIik7Ci0JCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldERhdGFJbnRlcmNoYW5nZUFjY2VzcygpLmdldEZpbGVFbmRwb2ludEFzc2lnbm1lbnRfOSgpLCAicnVsZV9fRGF0YUludGVyY2hhbmdlX19GaWxlRW5kcG9pbnRBc3NpZ25tZW50XzkiKTsKLQkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YUludGVyY2hhbmdlQWNjZXNzKCkuZ2V0UGF0aEFzc2lnbm1lbnRfMTIoKSwgInJ1bGVfX0RhdGFJbnRlcmNoYW5nZV9fUGF0aEFzc2lnbm1lbnRfMTIiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YUludGVyY2hhbmdlQWNjZXNzKCkuZ2V0RGVsZXRlRmlsZUFmdGVySW1wb3J0QXNzaWdubWVudF84KCksICJydWxlX19EYXRhSW50ZXJjaGFuZ2VfX0RlbGV0ZUZpbGVBZnRlckltcG9ydEFzc2lnbm1lbnRfOCIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXREYXRhSW50ZXJjaGFuZ2VBY2Nlc3MoKS5nZXRGaWxlRW5kcG9pbnRBc3NpZ25tZW50XzEwKCksICJydWxlX19EYXRhSW50ZXJjaGFuZ2VfX0ZpbGVFbmRwb2ludEFzc2lnbm1lbnRfMTAiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YUludGVyY2hhbmdlQWNjZXNzKCkuZ2V0UGF0aEFzc2lnbm1lbnRfMTMoKSwgInJ1bGVfX0RhdGFJbnRlcmNoYW5nZV9fUGF0aEFzc2lnbm1lbnRfMTMiKTsKIAkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YUludGVyY2hhbmdlRmlsZVhNTEFjY2VzcygpLmdldEZpbGVVUkxBc3NpZ25tZW50XzIoKSwgInJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbGVYTUxfX0ZpbGVVUkxBc3NpZ25tZW50XzIiKTsKIAkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YUludGVyY2hhbmdlRmlsZVhNTEFjY2VzcygpLmdldEJ5QXR0cmlidXRlQXNzaWdubWVudF8zXzAoKSwgInJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbGVYTUxfX0J5QXR0cmlidXRlQXNzaWdubWVudF8zXzAiKTsKIAkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YUludGVyY2hhbmdlRmlsZVhNTEFjY2VzcygpLmdldEVuY29kaW5nQXNzaWdubWVudF8zXzFfMSgpLCAicnVsZV9fRGF0YUludGVyY2hhbmdlRmlsZVhNTF9fRW5jb2RpbmdBc3NpZ25tZW50XzNfMV8xIik7CkBAIC0zNzIsMTMgKzM5MCwxNyBAQAogCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXREYXRhSW50ZXJjaGFuZ2VCZWFuQWNjZXNzKCkuZ2V0RW50aXR5QXNzaWdubWVudF8yKCksICJydWxlX19EYXRhSW50ZXJjaGFuZ2VCZWFuX19FbnRpdHlBc3NpZ25tZW50XzIiKTsKIAkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YUludGVyY2hhbmdlQmVhbkFjY2VzcygpLmdldE5vZGVOYW1lQXNzaWdubWVudF8zXzEoKSwgInJ1bGVfX0RhdGFJbnRlcmNoYW5nZUJlYW5fX05vZGVOYW1lQXNzaWdubWVudF8zXzEiKTsKIAkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YUludGVyY2hhbmdlQmVhbkFjY2VzcygpLmdldEVsZW1lbnRNYXBBc3NpZ25tZW50XzRfMSgpLCAicnVsZV9fRGF0YUludGVyY2hhbmdlQmVhbl9fRWxlbWVudE1hcEFzc2lnbm1lbnRfNF8xIik7Ci0JCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldERhdGFJbnRlcmNoYW5nZUJlYW5BY2Nlc3MoKS5nZXRNYXJrTGF0ZXN0QXNzaWdubWVudF81XzAoKSwgInJ1bGVfX0RhdGFJbnRlcmNoYW5nZUJlYW5fX01hcmtMYXRlc3RBc3NpZ25tZW50XzVfMCIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXREYXRhSW50ZXJjaGFuZ2VCZWFuQWNjZXNzKCkuZ2V0TWFya0xhdGVzdEltcG9ydEFzc2lnbm1lbnRfNV8wKCksICJydWxlX19EYXRhSW50ZXJjaGFuZ2VCZWFuX19NYXJrTGF0ZXN0SW1wb3J0QXNzaWdubWVudF81XzAiKTsKIAkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YUludGVyY2hhbmdlQmVhbkFjY2VzcygpLmdldExhdGVzdFByb3BlcnR5QXNzaWdubWVudF81XzEoKSwgInJ1bGVfX0RhdGFJbnRlcmNoYW5nZUJlYW5fX0xhdGVzdFByb3BlcnR5QXNzaWdubWVudF81XzEiKTsKLQkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YUludGVyY2hhbmdlQmVhbkFjY2VzcygpLmdldEV4cHJlc3Npb25Bc3NpZ25tZW50XzZfMigpLCAicnVsZV9fRGF0YUludGVyY2hhbmdlQmVhbl9fRXhwcmVzc2lvbkFzc2lnbm1lbnRfNl8yIik7Ci0JCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldERhdGFJbnRlcmNoYW5nZUJlYW5BY2Nlc3MoKS5nZXRMb29rdXBBc3NpZ25tZW50XzdfMigpLCAicnVsZV9fRGF0YUludGVyY2hhbmdlQmVhbl9fTG9va3VwQXNzaWdubWVudF83XzIiKTsKLQkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YUludGVyY2hhbmdlQmVhbkFjY2VzcygpLmdldEZvcm1hdEFzc2lnbm1lbnRfOF8yKCksICJydWxlX19EYXRhSW50ZXJjaGFuZ2VCZWFuX19Gb3JtYXRBc3NpZ25tZW50XzhfMiIpOwotCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXREYXRhSW50ZXJjaGFuZ2VCZWFuQWNjZXNzKCkuZ2V0TWFwcGluZ3NBc3NpZ25tZW50XzlfMigpLCAicnVsZV9fRGF0YUludGVyY2hhbmdlQmVhbl9fTWFwcGluZ3NBc3NpZ25tZW50XzlfMiIpOwotCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXREYXRhSW50ZXJjaGFuZ2VCZWFuQWNjZXNzKCkuZ2V0TG9va3VwS2V5c0Fzc2lnbm1lbnRfMTBfMigpLCAicnVsZV9fRGF0YUludGVyY2hhbmdlQmVhbl9fTG9va3VwS2V5c0Fzc2lnbm1lbnRfMTBfMiIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXREYXRhSW50ZXJjaGFuZ2VCZWFuQWNjZXNzKCkuZ2V0TWFya0xhdGVzdEV4cG9ydEFzc2lnbm1lbnRfNl8wKCksICJydWxlX19EYXRhSW50ZXJjaGFuZ2VCZWFuX19NYXJrTGF0ZXN0RXhwb3J0QXNzaWdubWVudF82XzAiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YUludGVyY2hhbmdlQmVhbkFjY2VzcygpLmdldExhdGVzdEV4cFByb3BlcnR5QXNzaWdubWVudF82XzEoKSwgInJ1bGVfX0RhdGFJbnRlcmNoYW5nZUJlYW5fX0xhdGVzdEV4cFByb3BlcnR5QXNzaWdubWVudF82XzEiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YUludGVyY2hhbmdlQmVhbkFjY2VzcygpLmdldEV4cHJlc3Npb25Bc3NpZ25tZW50XzdfMigpLCAicnVsZV9fRGF0YUludGVyY2hhbmdlQmVhbl9fRXhwcmVzc2lvbkFzc2lnbm1lbnRfN18yIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldERhdGFJbnRlcmNoYW5nZUJlYW5BY2Nlc3MoKS5nZXRMb29rdXBBc3NpZ25tZW50XzhfMigpLCAicnVsZV9fRGF0YUludGVyY2hhbmdlQmVhbl9fTG9va3VwQXNzaWdubWVudF84XzIiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YUludGVyY2hhbmdlQmVhbkFjY2VzcygpLmdldEZvcm1hdEFzc2lnbm1lbnRfOV8yKCksICJydWxlX19EYXRhSW50ZXJjaGFuZ2VCZWFuX19Gb3JtYXRBc3NpZ25tZW50XzlfMiIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXREYXRhSW50ZXJjaGFuZ2VCZWFuQWNjZXNzKCkuZ2V0RXhwb3J0RXhwb3Nlc0Fzc2lnbm1lbnRfMTBfMigpLCAicnVsZV9fRGF0YUludGVyY2hhbmdlQmVhbl9fRXhwb3J0RXhwb3Nlc0Fzc2lnbm1lbnRfMTBfMiIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXREYXRhSW50ZXJjaGFuZ2VCZWFuQWNjZXNzKCkuZ2V0TWFwcGluZ3NBc3NpZ25tZW50XzExXzIoKSwgInJ1bGVfX0RhdGFJbnRlcmNoYW5nZUJlYW5fX01hcHBpbmdzQXNzaWdubWVudF8xMV8yIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldERhdGFJbnRlcmNoYW5nZUJlYW5BY2Nlc3MoKS5nZXRMb29rdXBLZXlzQXNzaWdubWVudF8xMl8yKCksICJydWxlX19EYXRhSW50ZXJjaGFuZ2VCZWFuX19Mb29rdXBLZXlzQXNzaWdubWVudF8xMl8yIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldERhdGFJbnRlcmNoYW5nZUJlYW5BY2Nlc3MoKS5nZXRFeHBvcnRGaWx0ZXJBc3NpZ25tZW50XzEzXzIoKSwgInJ1bGVfX0RhdGFJbnRlcmNoYW5nZUJlYW5fX0V4cG9ydEZpbHRlckFzc2lnbm1lbnRfMTNfMiIpOwogCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXREYXRhSW50ZXJjaGFuZ2VLZXlBY2Nlc3MoKS5nZXRQcm9wZXJ0eUFzc2lnbm1lbnRfMigpLCAicnVsZV9fRGF0YUludGVyY2hhbmdlS2V5X19Qcm9wZXJ0eUFzc2lnbm1lbnRfMiIpOwogCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXREYXRhSW50ZXJjaGFuZ2VMb29rdXBBY2Nlc3MoKS5nZXRUYXJnZXRQcm9wZXJ0eUFzc2lnbm1lbnRfMigpLCAicnVsZV9fRGF0YUludGVyY2hhbmdlTG9va3VwX19UYXJnZXRQcm9wZXJ0eUFzc2lnbm1lbnRfMiIpOwogCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXREYXRhSW50ZXJjaGFuZ2VMb29rdXBBY2Nlc3MoKS5nZXRFbnRpdHlBc3NpZ25tZW50XzQoKSwgInJ1bGVfX0RhdGFJbnRlcmNoYW5nZUxvb2t1cF9fRW50aXR5QXNzaWdubWVudF80Iik7CkBAIC0zOTksNiArNDIxLDE3IEBACiAJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldERhdGFJbnRlcmNoYW5nZUVudGl0eUV4cHJlc3Npb25BY2Nlc3MoKS5nZXRUYXJnZXRQcm9wZXJ0eUFzc2lnbm1lbnRfMigpLCAicnVsZV9fRGF0YUludGVyY2hhbmdlRW50aXR5RXhwcmVzc2lvbl9fVGFyZ2V0UHJvcGVydHlBc3NpZ25tZW50XzIiKTsKIAkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YUludGVyY2hhbmdlRW50aXR5RXhwcmVzc2lvbkFjY2VzcygpLmdldEVudGl0eUFzc2lnbm1lbnRfNCgpLCAicnVsZV9fRGF0YUludGVyY2hhbmdlRW50aXR5RXhwcmVzc2lvbl9fRW50aXR5QXNzaWdubWVudF80Iik7CiAJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldERhdGFJbnRlcmNoYW5nZUVudGl0eUV4cHJlc3Npb25BY2Nlc3MoKS5nZXRQcm9wZXJ0eUFzc2lnbm1lbnRfNigpLCAicnVsZV9fRGF0YUludGVyY2hhbmdlRW50aXR5RXhwcmVzc2lvbl9fUHJvcGVydHlBc3NpZ25tZW50XzYiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YUludGVyY2hhbmdlRXhwb3NlQWNjZXNzKCkuZ2V0UmVmRW50aXR5QXNzaWdubWVudF8yKCksICJydWxlX19EYXRhSW50ZXJjaGFuZ2VFeHBvc2VfX1JlZkVudGl0eUFzc2lnbm1lbnRfMiIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXREYXRhSW50ZXJjaGFuZ2VFeHBvc2VBY2Nlc3MoKS5nZXRSZWZQcm9wZXJ0eUFzc2lnbm1lbnRfM18wXzEoKSwgInJ1bGVfX0RhdGFJbnRlcmNoYW5nZUV4cG9zZV9fUmVmUHJvcGVydHlBc3NpZ25tZW50XzNfMF8xIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldERhdGFJbnRlcmNoYW5nZUV4cG9zZUFjY2VzcygpLmdldFN1YkV4cG9zZUFzc2lnbm1lbnRfM18xXzIoKSwgInJ1bGVfX0RhdGFJbnRlcmNoYW5nZUV4cG9zZV9fU3ViRXhwb3NlQXNzaWdubWVudF8zXzFfMiIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXREYXRhSW50ZXJjaGFuZ2VFeHBvcnRGaWx0ZXJBY2Nlc3MoKS5nZXRDb25kaXRpb25Bc3NpZ25tZW50XzFfMigpLCAicnVsZV9fRGF0YUludGVyY2hhbmdlRXhwb3J0RmlsdGVyX19Db25kaXRpb25Bc3NpZ25tZW50XzFfMiIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXREYXRhSW50ZXJjaGFuZ2VFeHBvcnRGaWx0ZXJBY2Nlc3MoKS5nZXRIaWRkZW5wcm9wZXJ0aWVzQXNzaWdubWVudF8yXzEoKSwgInJ1bGVfX0RhdGFJbnRlcmNoYW5nZUV4cG9ydEZpbHRlcl9fSGlkZGVucHJvcGVydGllc0Fzc2lnbm1lbnRfMl8xIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldERhdGFJbnRlcmNoYW5nZUZpbHRlckNvbmRpdGlvbkFjY2VzcygpLmdldFJlZlByb3BlcnR5QXNzaWdubWVudF8wKCksICJydWxlX19EYXRhSW50ZXJjaGFuZ2VGaWx0ZXJDb25kaXRpb25fX1JlZlByb3BlcnR5QXNzaWdubWVudF8wIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldERhdGFJbnRlcmNoYW5nZUZpbHRlckNvbmRpdGlvbkFjY2VzcygpLmdldE9wZXJhdG9yQXNzaWdubWVudF8xKCksICJydWxlX19EYXRhSW50ZXJjaGFuZ2VGaWx0ZXJDb25kaXRpb25fX09wZXJhdG9yQXNzaWdubWVudF8xIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldERhdGFJbnRlcmNoYW5nZUZpbHRlckNvbmRpdGlvbkFjY2VzcygpLmdldFZhbHVlQXNzaWdubWVudF8yKCksICJydWxlX19EYXRhSW50ZXJjaGFuZ2VGaWx0ZXJDb25kaXRpb25fX1ZhbHVlQXNzaWdubWVudF8yIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldERhdGFJbnRlcmNoYW5nZUZpbHRlckNvbmRpdGlvbkFjY2VzcygpLmdldE9wZXJhdG9yMkFzc2lnbm1lbnRfM18wKCksICJydWxlX19EYXRhSW50ZXJjaGFuZ2VGaWx0ZXJDb25kaXRpb25fX09wZXJhdG9yMkFzc2lnbm1lbnRfM18wIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldERhdGFJbnRlcmNoYW5nZUZpbHRlckNvbmRpdGlvbkFjY2VzcygpLmdldFN1YmNvbmRpdGlvbkFzc2lnbm1lbnRfM18xKCksICJydWxlX19EYXRhSW50ZXJjaGFuZ2VGaWx0ZXJDb25kaXRpb25fX1N1YmNvbmRpdGlvbkFzc2lnbm1lbnRfM18xIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldERhdGFJbnRlcmNoYW5nZUV4cG9ydEhpZGVBY2Nlc3MoKS5nZXRQcm9wZXJ0eUFzc2lnbm1lbnRfMSgpLCAicnVsZV9fRGF0YUludGVyY2hhbmdlRXhwb3J0SGlkZV9fUHJvcGVydHlBc3NpZ25tZW50XzEiKTsKIAkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YUludGVyY2hhbmdlUHJlZGVmaW5lZEV4cHJlc3Npb25BY2Nlc3MoKS5nZXRUYXJnZXRQcm9wZXJ0eUFzc2lnbm1lbnRfMigpLCAicnVsZV9fRGF0YUludGVyY2hhbmdlUHJlZGVmaW5lZEV4cHJlc3Npb25fX1RhcmdldFByb3BlcnR5QXNzaWdubWVudF8yIik7CiAJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldERhdGFJbnRlcmNoYW5nZVByZWRlZmluZWRFeHByZXNzaW9uQWNjZXNzKCkuZ2V0QmVhbkFzc2lnbm1lbnRfNCgpLCAicnVsZV9fRGF0YUludGVyY2hhbmdlUHJlZGVmaW5lZEV4cHJlc3Npb25fX0JlYW5Bc3NpZ25tZW50XzQiKTsKIAkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YUludGVyY2hhbmdlUHJlZGVmaW5lZEV4cHJlc3Npb25BY2Nlc3MoKS5nZXRCZWFuVHlwZUFzc2lnbm1lbnRfNigpLCAicnVsZV9fRGF0YUludGVyY2hhbmdlUHJlZGVmaW5lZEV4cHJlc3Npb25fX0JlYW5UeXBlQXNzaWdubWVudF82Iik7CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmRhdGFpbnRlcmNoYW5nZS5pZGUvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2RhdGFpbnRlcmNoYW5nZS9pZGUvY29udGVudGFzc2lzdC9hbnRsci9QYXJ0aWFsRGF0YURTTENvbnRlbnRBc3Npc3RQYXJzZXIuamF2YSBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQuZGF0YWludGVyY2hhbmdlLmlkZS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvZGF0YWludGVyY2hhbmdlL2lkZS9jb250ZW50YXNzaXN0L2FudGxyL1BhcnRpYWxEYXRhRFNMQ29udGVudEFzc2lzdFBhcnNlci5qYXZhCmluZGV4IGNjNGQ3ZWYuLjIwNzQ0ODEgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLm9zYnAueHRleHQuZGF0YWludGVyY2hhbmdlLmlkZS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvZGF0YWludGVyY2hhbmdlL2lkZS9jb250ZW50YXNzaXN0L2FudGxyL1BhcnRpYWxEYXRhRFNMQ29udGVudEFzc2lzdFBhcnNlci5qYXZhCisrKyBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQuZGF0YWludGVyY2hhbmdlLmlkZS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvZGF0YWludGVyY2hhbmdlL2lkZS9jb250ZW50YXNzaXN0L2FudGxyL1BhcnRpYWxEYXRhRFNMQ29udGVudEFzc2lzdFBhcnNlci5qYXZhCkBAIC0zLDkgKzMsMTEgQEAKICAqICBDb3B5cmlnaHQgKGMpIDIwMTEsIDIwMTYgLSBMb2V0eiBHbWJIJkNvLktHICg2OTExNSBIZWlkZWxiZXJnLCBHZXJtYW55KSAKICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICogIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgICAgICAgICAgIAotICogIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCAgICAgICAKKyAqICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIDIuMCAgICAgICAgCiAgKiAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgICAgICAgICAgICAgICAgICAKLSAqICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICogIGh0dHBzOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAvICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICogIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAqICBDb250cmlidXRvcnM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgKiAJICAgQ2hyaXN0b3BoZSBMb2V0eiAoTG9ldHogR21iSCZDby5LRykgLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmRhdGFpbnRlcmNoYW5nZS5pZGUvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2RhdGFpbnRlcmNoYW5nZS9pZGUvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbERhdGFEU0wuZyBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQuZGF0YWludGVyY2hhbmdlLmlkZS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvZGF0YWludGVyY2hhbmdlL2lkZS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsRGF0YURTTC5nCmluZGV4IDQyZWNlYmIuLjYxZjU3YWUgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLm9zYnAueHRleHQuZGF0YWludGVyY2hhbmdlLmlkZS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvZGF0YWludGVyY2hhbmdlL2lkZS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsRGF0YURTTC5nCisrKyBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQuZGF0YWludGVyY2hhbmdlLmlkZS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvZGF0YWludGVyY2hhbmdlL2lkZS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsRGF0YURTTC5nCkBAIC00MzgsNiArNDM4LDEwNiBAQAogCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKIH0KIAorLy8gRW50cnkgcnVsZSBlbnRyeVJ1bGVEYXRhSW50ZXJjaGFuZ2VFeHBvc2UKK2VudHJ5UnVsZURhdGFJbnRlcmNoYW5nZUV4cG9zZQorOgoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXREYXRhSW50ZXJjaGFuZ2VFeHBvc2VSdWxlKCkpOyB9CisJIHJ1bGVEYXRhSW50ZXJjaGFuZ2VFeHBvc2UKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXREYXRhSW50ZXJjaGFuZ2VFeHBvc2VSdWxlKCkpOyB9IAorCSBFT0YgCis7CisKKy8vIFJ1bGUgRGF0YUludGVyY2hhbmdlRXhwb3NlCitydWxlRGF0YUludGVyY2hhbmdlRXhwb3NlIAorCUBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKwl9CisJOgorCSgKKwkJeyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXREYXRhSW50ZXJjaGFuZ2VFeHBvc2VBY2Nlc3MoKS5nZXRHcm91cCgpKTsgfQorCQkocnVsZV9fRGF0YUludGVyY2hhbmdlRXhwb3NlX19Hcm91cF9fMCkKKwkJeyBhZnRlcihncmFtbWFyQWNjZXNzLmdldERhdGFJbnRlcmNoYW5nZUV4cG9zZUFjY2VzcygpLmdldEdyb3VwKCkpOyB9CisJKQorOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCisvLyBFbnRyeSBydWxlIGVudHJ5UnVsZURhdGFJbnRlcmNoYW5nZUV4cG9ydEZpbHRlcgorZW50cnlSdWxlRGF0YUludGVyY2hhbmdlRXhwb3J0RmlsdGVyCis6Cit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldERhdGFJbnRlcmNoYW5nZUV4cG9ydEZpbHRlclJ1bGUoKSk7IH0KKwkgcnVsZURhdGFJbnRlcmNoYW5nZUV4cG9ydEZpbHRlcgoreyBhZnRlcihncmFtbWFyQWNjZXNzLmdldERhdGFJbnRlcmNoYW5nZUV4cG9ydEZpbHRlclJ1bGUoKSk7IH0gCisJIEVPRiAKKzsKKworLy8gUnVsZSBEYXRhSW50ZXJjaGFuZ2VFeHBvcnRGaWx0ZXIKK3J1bGVEYXRhSW50ZXJjaGFuZ2VFeHBvcnRGaWx0ZXIgCisJQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworCX0KKwk6CisJKAorCQl7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldERhdGFJbnRlcmNoYW5nZUV4cG9ydEZpbHRlckFjY2VzcygpLmdldEdyb3VwKCkpOyB9CisJCShydWxlX19EYXRhSW50ZXJjaGFuZ2VFeHBvcnRGaWx0ZXJfX0dyb3VwX18wKQorCQl7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YUludGVyY2hhbmdlRXhwb3J0RmlsdGVyQWNjZXNzKCkuZ2V0R3JvdXAoKSk7IH0KKwkpCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKKy8vIEVudHJ5IHJ1bGUgZW50cnlSdWxlRGF0YUludGVyY2hhbmdlRmlsdGVyQ29uZGl0aW9uCitlbnRyeVJ1bGVEYXRhSW50ZXJjaGFuZ2VGaWx0ZXJDb25kaXRpb24KKzoKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YUludGVyY2hhbmdlRmlsdGVyQ29uZGl0aW9uUnVsZSgpKTsgfQorCSBydWxlRGF0YUludGVyY2hhbmdlRmlsdGVyQ29uZGl0aW9uCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YUludGVyY2hhbmdlRmlsdGVyQ29uZGl0aW9uUnVsZSgpKTsgfSAKKwkgRU9GIAorOworCisvLyBSdWxlIERhdGFJbnRlcmNoYW5nZUZpbHRlckNvbmRpdGlvbgorcnVsZURhdGFJbnRlcmNoYW5nZUZpbHRlckNvbmRpdGlvbiAKKwlAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisJfQorCToKKwkoCisJCXsgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YUludGVyY2hhbmdlRmlsdGVyQ29uZGl0aW9uQWNjZXNzKCkuZ2V0R3JvdXAoKSk7IH0KKwkJKHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbHRlckNvbmRpdGlvbl9fR3JvdXBfXzApCisJCXsgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXREYXRhSW50ZXJjaGFuZ2VGaWx0ZXJDb25kaXRpb25BY2Nlc3MoKS5nZXRHcm91cCgpKTsgfQorCSkKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworLy8gRW50cnkgcnVsZSBlbnRyeVJ1bGVEYXRhSW50ZXJjaGFuZ2VFeHBvcnRIaWRlCitlbnRyeVJ1bGVEYXRhSW50ZXJjaGFuZ2VFeHBvcnRIaWRlCis6Cit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldERhdGFJbnRlcmNoYW5nZUV4cG9ydEhpZGVSdWxlKCkpOyB9CisJIHJ1bGVEYXRhSW50ZXJjaGFuZ2VFeHBvcnRIaWRlCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YUludGVyY2hhbmdlRXhwb3J0SGlkZVJ1bGUoKSk7IH0gCisJIEVPRiAKKzsKKworLy8gUnVsZSBEYXRhSW50ZXJjaGFuZ2VFeHBvcnRIaWRlCitydWxlRGF0YUludGVyY2hhbmdlRXhwb3J0SGlkZSAKKwlAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisJfQorCToKKwkoCisJCXsgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YUludGVyY2hhbmdlRXhwb3J0SGlkZUFjY2VzcygpLmdldEdyb3VwKCkpOyB9CisJCShydWxlX19EYXRhSW50ZXJjaGFuZ2VFeHBvcnRIaWRlX19Hcm91cF9fMCkKKwkJeyBhZnRlcihncmFtbWFyQWNjZXNzLmdldERhdGFJbnRlcmNoYW5nZUV4cG9ydEhpZGVBY2Nlc3MoKS5nZXRHcm91cCgpKTsgfQorCSkKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKwogLy8gRW50cnkgcnVsZSBlbnRyeVJ1bGVEYXRhSW50ZXJjaGFuZ2VQcmVkZWZpbmVkRXhwcmVzc2lvbgogZW50cnlSdWxlRGF0YUludGVyY2hhbmdlUHJlZGVmaW5lZEV4cHJlc3Npb24KIDoKQEAgLTI3MjQsNiArMjgyNCwzOCBAQAogCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKIH0KIAorLy8gUnVsZSBDb25kaXRpb25BbmRPcGVyYXRvcjEKK3J1bGVDb25kaXRpb25BbmRPcGVyYXRvcjEKKwlAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisJfQorOgorCSgKKwkJeyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRDb25kaXRpb25BbmRPcGVyYXRvcjFBY2Nlc3MoKS5nZXRBbHRlcm5hdGl2ZXMoKSk7IH0KKwkJKHJ1bGVfX0NvbmRpdGlvbkFuZE9wZXJhdG9yMV9fQWx0ZXJuYXRpdmVzKQorCQl7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0Q29uZGl0aW9uQW5kT3BlcmF0b3IxQWNjZXNzKCkuZ2V0QWx0ZXJuYXRpdmVzKCkpOyB9CisJKQorOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCisvLyBSdWxlIENvbmRpdGlvbkFuZE9wZXJhdG9yMgorcnVsZUNvbmRpdGlvbkFuZE9wZXJhdG9yMgorCUBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKwl9Cis6CisJKAorCQl7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldENvbmRpdGlvbkFuZE9wZXJhdG9yMkFjY2VzcygpLmdldEFsdGVybmF0aXZlcygpKTsgfQorCQkocnVsZV9fQ29uZGl0aW9uQW5kT3BlcmF0b3IyX19BbHRlcm5hdGl2ZXMpCisJCXsgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRDb25kaXRpb25BbmRPcGVyYXRvcjJBY2Nlc3MoKS5nZXRBbHRlcm5hdGl2ZXMoKSk7IH0KKwkpCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbGVfX0FsdGVybmF0aXZlcwogCUBpbml0IHsKIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKQEAgLTI3NzIsNiArMjkwNCwyNyBAQAogCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKIH0KIAorcnVsZV9fRGF0YUludGVyY2hhbmdlRXhwb3NlX19BbHRlcm5hdGl2ZXNfMworCUBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKwl9Cis6CisJKAorCQl7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldERhdGFJbnRlcmNoYW5nZUV4cG9zZUFjY2VzcygpLmdldEdyb3VwXzNfMCgpKTsgfQorCQkocnVsZV9fRGF0YUludGVyY2hhbmdlRXhwb3NlX19Hcm91cF8zXzBfXzApCisJCXsgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXREYXRhSW50ZXJjaGFuZ2VFeHBvc2VBY2Nlc3MoKS5nZXRHcm91cF8zXzAoKSk7IH0KKwkpCisJfAorCSgKKwkJeyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXREYXRhSW50ZXJjaGFuZ2VFeHBvc2VBY2Nlc3MoKS5nZXRHcm91cF8zXzEoKSk7IH0KKwkJKHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUV4cG9zZV9fR3JvdXBfM18xX18wKQorCQl7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YUludGVyY2hhbmdlRXhwb3NlQWNjZXNzKCkuZ2V0R3JvdXBfM18xKCkpOyB9CisJKQorOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCiBydWxlX19EYXRhSW50ZXJjaGFuZ2VNYXBwaW5nX19BbHRlcm5hdGl2ZXMKIAlAaW5pdCB7CiAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CkBAIC00MDk4LDYgKzQyNTEsODQgQEAKIAlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7CiB9CiAKK3J1bGVfX0NvbmRpdGlvbkFuZE9wZXJhdG9yMV9fQWx0ZXJuYXRpdmVzCisJQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworCX0KKzoKKwkoCisJCXsgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0Q29uZGl0aW9uQW5kT3BlcmF0b3IxQWNjZXNzKCkuZ2V0RXF1YWxzRW51bUxpdGVyYWxEZWNsYXJhdGlvbl8wKCkpOyB9CisJCSgnPScpCisJCXsgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRDb25kaXRpb25BbmRPcGVyYXRvcjFBY2Nlc3MoKS5nZXRFcXVhbHNFbnVtTGl0ZXJhbERlY2xhcmF0aW9uXzAoKSk7IH0KKwkpCisJfAorCSgKKwkJeyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRDb25kaXRpb25BbmRPcGVyYXRvcjFBY2Nlc3MoKS5nZXROb3RlcXVhbHNFbnVtTGl0ZXJhbERlY2xhcmF0aW9uXzEoKSk7IH0KKwkJKCchPScpCisJCXsgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRDb25kaXRpb25BbmRPcGVyYXRvcjFBY2Nlc3MoKS5nZXROb3RlcXVhbHNFbnVtTGl0ZXJhbERlY2xhcmF0aW9uXzEoKSk7IH0KKwkpCisJfAorCSgKKwkJeyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRDb25kaXRpb25BbmRPcGVyYXRvcjFBY2Nlc3MoKS5nZXRHcmVhdGVydGhlbkVudW1MaXRlcmFsRGVjbGFyYXRpb25fMigpKTsgfQorCQkoJz4nKQorCQl7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0Q29uZGl0aW9uQW5kT3BlcmF0b3IxQWNjZXNzKCkuZ2V0R3JlYXRlcnRoZW5FbnVtTGl0ZXJhbERlY2xhcmF0aW9uXzIoKSk7IH0KKwkpCisJfAorCSgKKwkJeyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRDb25kaXRpb25BbmRPcGVyYXRvcjFBY2Nlc3MoKS5nZXRHcmVhdGVydGhlbm9yZXF1YWx0b0VudW1MaXRlcmFsRGVjbGFyYXRpb25fMygpKTsgfQorCQkoJz49JykKKwkJeyBhZnRlcihncmFtbWFyQWNjZXNzLmdldENvbmRpdGlvbkFuZE9wZXJhdG9yMUFjY2VzcygpLmdldEdyZWF0ZXJ0aGVub3JlcXVhbHRvRW51bUxpdGVyYWxEZWNsYXJhdGlvbl8zKCkpOyB9CisJKQorCXwKKwkoCisJCXsgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0Q29uZGl0aW9uQW5kT3BlcmF0b3IxQWNjZXNzKCkuZ2V0TGVzc3RoZW5FbnVtTGl0ZXJhbERlY2xhcmF0aW9uXzQoKSk7IH0KKwkJKCc8JykKKwkJeyBhZnRlcihncmFtbWFyQWNjZXNzLmdldENvbmRpdGlvbkFuZE9wZXJhdG9yMUFjY2VzcygpLmdldExlc3N0aGVuRW51bUxpdGVyYWxEZWNsYXJhdGlvbl80KCkpOyB9CisJKQorCXwKKwkoCisJCXsgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0Q29uZGl0aW9uQW5kT3BlcmF0b3IxQWNjZXNzKCkuZ2V0TGVzc3RoZW5vcmVxdWFsdG9FbnVtTGl0ZXJhbERlY2xhcmF0aW9uXzUoKSk7IH0KKwkJKCc8PScpCisJCXsgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRDb25kaXRpb25BbmRPcGVyYXRvcjFBY2Nlc3MoKS5nZXRMZXNzdGhlbm9yZXF1YWx0b0VudW1MaXRlcmFsRGVjbGFyYXRpb25fNSgpKTsgfQorCSkKKwl8CisJKAorCQl7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldENvbmRpdGlvbkFuZE9wZXJhdG9yMUFjY2VzcygpLmdldElzbnVsbEVudW1MaXRlcmFsRGVjbGFyYXRpb25fNigpKTsgfQorCQkoJ2lzbnVsbCcpCisJCXsgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRDb25kaXRpb25BbmRPcGVyYXRvcjFBY2Nlc3MoKS5nZXRJc251bGxFbnVtTGl0ZXJhbERlY2xhcmF0aW9uXzYoKSk7IH0KKwkpCisJfAorCSgKKwkJeyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRDb25kaXRpb25BbmRPcGVyYXRvcjFBY2Nlc3MoKS5nZXRJc25vdG51bGxFbnVtTGl0ZXJhbERlY2xhcmF0aW9uXzcoKSk7IH0KKwkJKCdpc25vdG51bGwnKQorCQl7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0Q29uZGl0aW9uQW5kT3BlcmF0b3IxQWNjZXNzKCkuZ2V0SXNub3RudWxsRW51bUxpdGVyYWxEZWNsYXJhdGlvbl83KCkpOyB9CisJKQorOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCitydWxlX19Db25kaXRpb25BbmRPcGVyYXRvcjJfX0FsdGVybmF0aXZlcworCUBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKwl9Cis6CisJKAorCQl7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldENvbmRpdGlvbkFuZE9wZXJhdG9yMkFjY2VzcygpLmdldEFuZEVudW1MaXRlcmFsRGVjbGFyYXRpb25fMCgpKTsgfQorCQkoJ2FuZCcpCisJCXsgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRDb25kaXRpb25BbmRPcGVyYXRvcjJBY2Nlc3MoKS5nZXRBbmRFbnVtTGl0ZXJhbERlY2xhcmF0aW9uXzAoKSk7IH0KKwkpCisJfAorCSgKKwkJeyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRDb25kaXRpb25BbmRPcGVyYXRvcjJBY2Nlc3MoKS5nZXRPckVudW1MaXRlcmFsRGVjbGFyYXRpb25fMSgpKTsgfQorCQkoJ29yJykKKwkJeyBhZnRlcihncmFtbWFyQWNjZXNzLmdldENvbmRpdGlvbkFuZE9wZXJhdG9yMkFjY2VzcygpLmdldE9yRW51bUxpdGVyYWxEZWNsYXJhdGlvbl8xKCkpOyB9CisJKQorOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCiBydWxlX19EYXRhSW50ZXJjaGFuZ2VNb2RlbF9fR3JvdXBfXzAKIAlAaW5pdCB7CiAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CkBAIC00NjI5LDkgKzQ4NjAsOSBAQAogCX0KIDoKICgKLQl7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldERhdGFJbnRlcmNoYW5nZUFjY2VzcygpLmdldEZpbGVLZXl3b3JkXzgoKSk7IH0KLQknZmlsZScKLQl7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YUludGVyY2hhbmdlQWNjZXNzKCkuZ2V0RmlsZUtleXdvcmRfOCgpKTsgfQorCXsgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YUludGVyY2hhbmdlQWNjZXNzKCkuZ2V0RGVsZXRlRmlsZUFmdGVySW1wb3J0QXNzaWdubWVudF84KCkpOyB9CisJKHJ1bGVfX0RhdGFJbnRlcmNoYW5nZV9fRGVsZXRlRmlsZUFmdGVySW1wb3J0QXNzaWdubWVudF84KT8KKwl7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YUludGVyY2hhbmdlQWNjZXNzKCkuZ2V0RGVsZXRlRmlsZUFmdGVySW1wb3J0QXNzaWdubWVudF84KCkpOyB9CiApCiA7CiBmaW5hbGx5IHsKQEAgLTQ2NTYsOSArNDg4Nyw5IEBACiAJfQogOgogKAotCXsgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YUludGVyY2hhbmdlQWNjZXNzKCkuZ2V0RmlsZUVuZHBvaW50QXNzaWdubWVudF85KCkpOyB9Ci0JKHJ1bGVfX0RhdGFJbnRlcmNoYW5nZV9fRmlsZUVuZHBvaW50QXNzaWdubWVudF85KQotCXsgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXREYXRhSW50ZXJjaGFuZ2VBY2Nlc3MoKS5nZXRGaWxlRW5kcG9pbnRBc3NpZ25tZW50XzkoKSk7IH0KKwl7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldERhdGFJbnRlcmNoYW5nZUFjY2VzcygpLmdldEZpbGVLZXl3b3JkXzkoKSk7IH0KKwknZmlsZScKKwl7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YUludGVyY2hhbmdlQWNjZXNzKCkuZ2V0RmlsZUtleXdvcmRfOSgpKTsgfQogKQogOwogZmluYWxseSB7CkBAIC00NjgzLDkgKzQ5MTQsOSBAQAogCX0KIDoKICgKLQl7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldERhdGFJbnRlcmNoYW5nZUFjY2VzcygpLmdldFBhdGhLZXl3b3JkXzEwKCkpOyB9Ci0JJ3BhdGgnCi0JeyBhZnRlcihncmFtbWFyQWNjZXNzLmdldERhdGFJbnRlcmNoYW5nZUFjY2VzcygpLmdldFBhdGhLZXl3b3JkXzEwKCkpOyB9CisJeyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXREYXRhSW50ZXJjaGFuZ2VBY2Nlc3MoKS5nZXRGaWxlRW5kcG9pbnRBc3NpZ25tZW50XzEwKCkpOyB9CisJKHJ1bGVfX0RhdGFJbnRlcmNoYW5nZV9fRmlsZUVuZHBvaW50QXNzaWdubWVudF8xMCkKKwl7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YUludGVyY2hhbmdlQWNjZXNzKCkuZ2V0RmlsZUVuZHBvaW50QXNzaWdubWVudF8xMCgpKTsgfQogKQogOwogZmluYWxseSB7CkBAIC00NzEwLDkgKzQ5NDEsOSBAQAogCX0KIDoKICgKLQl7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldERhdGFJbnRlcmNoYW5nZUFjY2VzcygpLmdldExlZnRDdXJseUJyYWNrZXRLZXl3b3JkXzExKCkpOyB9Ci0JJ3snCi0JeyBhZnRlcihncmFtbWFyQWNjZXNzLmdldERhdGFJbnRlcmNoYW5nZUFjY2VzcygpLmdldExlZnRDdXJseUJyYWNrZXRLZXl3b3JkXzExKCkpOyB9CisJeyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXREYXRhSW50ZXJjaGFuZ2VBY2Nlc3MoKS5nZXRQYXRoS2V5d29yZF8xMSgpKTsgfQorCSdwYXRoJworCXsgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXREYXRhSW50ZXJjaGFuZ2VBY2Nlc3MoKS5nZXRQYXRoS2V5d29yZF8xMSgpKTsgfQogKQogOwogZmluYWxseSB7CkBAIC00NzM3LDkgKzQ5NjgsOSBAQAogCX0KIDoKICgKLQl7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldERhdGFJbnRlcmNoYW5nZUFjY2VzcygpLmdldFBhdGhBc3NpZ25tZW50XzEyKCkpOyB9Ci0JKHJ1bGVfX0RhdGFJbnRlcmNoYW5nZV9fUGF0aEFzc2lnbm1lbnRfMTIpKgotCXsgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXREYXRhSW50ZXJjaGFuZ2VBY2Nlc3MoKS5nZXRQYXRoQXNzaWdubWVudF8xMigpKTsgfQorCXsgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YUludGVyY2hhbmdlQWNjZXNzKCkuZ2V0TGVmdEN1cmx5QnJhY2tldEtleXdvcmRfMTIoKSk7IH0KKwkneycKKwl7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YUludGVyY2hhbmdlQWNjZXNzKCkuZ2V0TGVmdEN1cmx5QnJhY2tldEtleXdvcmRfMTIoKSk7IH0KICkKIDsKIGZpbmFsbHkgewpAQCAtNDc1Miw2ICs0OTgzLDcgQEAKIAl9CiA6CiAJcnVsZV9fRGF0YUludGVyY2hhbmdlX19Hcm91cF9fMTNfX0ltcGwKKwlydWxlX19EYXRhSW50ZXJjaGFuZ2VfX0dyb3VwX18xNAogOwogZmluYWxseSB7CiAJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOwpAQCAtNDc2Myw5ICs0OTk1LDM1IEBACiAJfQogOgogKAotCXsgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YUludGVyY2hhbmdlQWNjZXNzKCkuZ2V0UmlnaHRDdXJseUJyYWNrZXRLZXl3b3JkXzEzKCkpOyB9CisJeyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXREYXRhSW50ZXJjaGFuZ2VBY2Nlc3MoKS5nZXRQYXRoQXNzaWdubWVudF8xMygpKTsgfQorCShydWxlX19EYXRhSW50ZXJjaGFuZ2VfX1BhdGhBc3NpZ25tZW50XzEzKSoKKwl7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YUludGVyY2hhbmdlQWNjZXNzKCkuZ2V0UGF0aEFzc2lnbm1lbnRfMTMoKSk7IH0KKykKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworcnVsZV9fRGF0YUludGVyY2hhbmdlX19Hcm91cF9fMTQKKwlAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisJfQorOgorCXJ1bGVfX0RhdGFJbnRlcmNoYW5nZV9fR3JvdXBfXzE0X19JbXBsCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKK3J1bGVfX0RhdGFJbnRlcmNoYW5nZV9fR3JvdXBfXzE0X19JbXBsCisJQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworCX0KKzoKKygKKwl7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldERhdGFJbnRlcmNoYW5nZUFjY2VzcygpLmdldFJpZ2h0Q3VybHlCcmFja2V0S2V5d29yZF8xNCgpKTsgfQogCSd9JwotCXsgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXREYXRhSW50ZXJjaGFuZ2VBY2Nlc3MoKS5nZXRSaWdodEN1cmx5QnJhY2tldEtleXdvcmRfMTMoKSk7IH0KKwl7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YUludGVyY2hhbmdlQWNjZXNzKCkuZ2V0UmlnaHRDdXJseUJyYWNrZXRLZXl3b3JkXzE0KCkpOyB9CiApCiA7CiBmaW5hbGx5IHsKQEAgLTYxMDIsNiArNjM2MCw3IEBACiAJfQogOgogCXJ1bGVfX0RhdGFJbnRlcmNoYW5nZUJlYW5fX0dyb3VwX18xMF9fSW1wbAorCXJ1bGVfX0RhdGFJbnRlcmNoYW5nZUJlYW5fX0dyb3VwX18xMQogOwogZmluYWxseSB7CiAJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOwpAQCAtNjEyMiw2ICs2MzgxLDg2IEBACiAJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOwogfQogCitydWxlX19EYXRhSW50ZXJjaGFuZ2VCZWFuX19Hcm91cF9fMTEKKwlAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisJfQorOgorCXJ1bGVfX0RhdGFJbnRlcmNoYW5nZUJlYW5fX0dyb3VwX18xMV9fSW1wbAorCXJ1bGVfX0RhdGFJbnRlcmNoYW5nZUJlYW5fX0dyb3VwX18xMgorOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCitydWxlX19EYXRhSW50ZXJjaGFuZ2VCZWFuX19Hcm91cF9fMTFfX0ltcGwKKwlAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisJfQorOgorKAorCXsgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YUludGVyY2hhbmdlQmVhbkFjY2VzcygpLmdldEdyb3VwXzExKCkpOyB9CisJKHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUJlYW5fX0dyb3VwXzExX18wKT8KKwl7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YUludGVyY2hhbmdlQmVhbkFjY2VzcygpLmdldEdyb3VwXzExKCkpOyB9CispCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKK3J1bGVfX0RhdGFJbnRlcmNoYW5nZUJlYW5fX0dyb3VwX18xMgorCUBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKwl9Cis6CisJcnVsZV9fRGF0YUludGVyY2hhbmdlQmVhbl9fR3JvdXBfXzEyX19JbXBsCisJcnVsZV9fRGF0YUludGVyY2hhbmdlQmVhbl9fR3JvdXBfXzEzCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKK3J1bGVfX0RhdGFJbnRlcmNoYW5nZUJlYW5fX0dyb3VwX18xMl9fSW1wbAorCUBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKwl9Cis6CisoCisJeyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXREYXRhSW50ZXJjaGFuZ2VCZWFuQWNjZXNzKCkuZ2V0R3JvdXBfMTIoKSk7IH0KKwkocnVsZV9fRGF0YUludGVyY2hhbmdlQmVhbl9fR3JvdXBfMTJfXzApPworCXsgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXREYXRhSW50ZXJjaGFuZ2VCZWFuQWNjZXNzKCkuZ2V0R3JvdXBfMTIoKSk7IH0KKykKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworcnVsZV9fRGF0YUludGVyY2hhbmdlQmVhbl9fR3JvdXBfXzEzCisJQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworCX0KKzoKKwlydWxlX19EYXRhSW50ZXJjaGFuZ2VCZWFuX19Hcm91cF9fMTNfX0ltcGwKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworcnVsZV9fRGF0YUludGVyY2hhbmdlQmVhbl9fR3JvdXBfXzEzX19JbXBsCisJQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworCX0KKzoKKygKKwl7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldERhdGFJbnRlcmNoYW5nZUJlYW5BY2Nlc3MoKS5nZXRHcm91cF8xMygpKTsgfQorCShydWxlX19EYXRhSW50ZXJjaGFuZ2VCZWFuX19Hcm91cF8xM19fMCk/CisJeyBhZnRlcihncmFtbWFyQWNjZXNzLmdldERhdGFJbnRlcmNoYW5nZUJlYW5BY2Nlc3MoKS5nZXRHcm91cF8xMygpKTsgfQorKQorOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCiAKIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUJlYW5fX0dyb3VwXzNfXzAKIAlAaW5pdCB7CkBAIC02MjQ5LDkgKzY1ODgsOSBAQAogCX0KIDoKICgKLQl7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldERhdGFJbnRlcmNoYW5nZUJlYW5BY2Nlc3MoKS5nZXRNYXJrTGF0ZXN0QXNzaWdubWVudF81XzAoKSk7IH0KLQkocnVsZV9fRGF0YUludGVyY2hhbmdlQmVhbl9fTWFya0xhdGVzdEFzc2lnbm1lbnRfNV8wKQotCXsgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXREYXRhSW50ZXJjaGFuZ2VCZWFuQWNjZXNzKCkuZ2V0TWFya0xhdGVzdEFzc2lnbm1lbnRfNV8wKCkpOyB9CisJeyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXREYXRhSW50ZXJjaGFuZ2VCZWFuQWNjZXNzKCkuZ2V0TWFya0xhdGVzdEltcG9ydEFzc2lnbm1lbnRfNV8wKCkpOyB9CisJKHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUJlYW5fX01hcmtMYXRlc3RJbXBvcnRBc3NpZ25tZW50XzVfMCkKKwl7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YUludGVyY2hhbmdlQmVhbkFjY2VzcygpLmdldE1hcmtMYXRlc3RJbXBvcnRBc3NpZ25tZW50XzVfMCgpKTsgfQogKQogOwogZmluYWxseSB7CkBAIC02MzAzLDkgKzY2NDIsOSBAQAogCX0KIDoKICgKLQl7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldERhdGFJbnRlcmNoYW5nZUJlYW5BY2Nlc3MoKS5nZXRFeHByZXNzaW9uS2V5d29yZF82XzAoKSk7IH0KLQknZXhwcmVzc2lvbicKLQl7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YUludGVyY2hhbmdlQmVhbkFjY2VzcygpLmdldEV4cHJlc3Npb25LZXl3b3JkXzZfMCgpKTsgfQorCXsgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YUludGVyY2hhbmdlQmVhbkFjY2VzcygpLmdldE1hcmtMYXRlc3RFeHBvcnRBc3NpZ25tZW50XzZfMCgpKTsgfQorCShydWxlX19EYXRhSW50ZXJjaGFuZ2VCZWFuX19NYXJrTGF0ZXN0RXhwb3J0QXNzaWdubWVudF82XzApCisJeyBhZnRlcihncmFtbWFyQWNjZXNzLmdldERhdGFJbnRlcmNoYW5nZUJlYW5BY2Nlc3MoKS5nZXRNYXJrTGF0ZXN0RXhwb3J0QXNzaWdubWVudF82XzAoKSk7IH0KICkKIDsKIGZpbmFsbHkgewpAQCAtNjMxOCw3ICs2NjU3LDYgQEAKIAl9CiA6CiAJcnVsZV9fRGF0YUludGVyY2hhbmdlQmVhbl9fR3JvdXBfNl9fMV9fSW1wbAotCXJ1bGVfX0RhdGFJbnRlcmNoYW5nZUJlYW5fX0dyb3VwXzZfXzIKIDsKIGZpbmFsbHkgewogCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKQEAgLTYzMzAsNjIgKzY2NjgsOSBAQAogCX0KIDoKICgKLQl7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldERhdGFJbnRlcmNoYW5nZUJlYW5BY2Nlc3MoKS5nZXRMZWZ0Q3VybHlCcmFja2V0S2V5d29yZF82XzEoKSk7IH0KLQkneycKLQl7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YUludGVyY2hhbmdlQmVhbkFjY2VzcygpLmdldExlZnRDdXJseUJyYWNrZXRLZXl3b3JkXzZfMSgpKTsgfQotKQotOwotZmluYWxseSB7Ci0JcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOwotfQotCi1ydWxlX19EYXRhSW50ZXJjaGFuZ2VCZWFuX19Hcm91cF82X18yCi0JQGluaXQgewotCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwotCX0KLToKLQlydWxlX19EYXRhSW50ZXJjaGFuZ2VCZWFuX19Hcm91cF82X18yX19JbXBsCi0JcnVsZV9fRGF0YUludGVyY2hhbmdlQmVhbl9fR3JvdXBfNl9fMwotOwotZmluYWxseSB7Ci0JcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOwotfQotCi1ydWxlX19EYXRhSW50ZXJjaGFuZ2VCZWFuX19Hcm91cF82X18yX19JbXBsCi0JQGluaXQgewotCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwotCX0KLToKLSgKLQl7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldERhdGFJbnRlcmNoYW5nZUJlYW5BY2Nlc3MoKS5nZXRFeHByZXNzaW9uQXNzaWdubWVudF82XzIoKSk7IH0KLQkocnVsZV9fRGF0YUludGVyY2hhbmdlQmVhbl9fRXhwcmVzc2lvbkFzc2lnbm1lbnRfNl8yKSoKLQl7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YUludGVyY2hhbmdlQmVhbkFjY2VzcygpLmdldEV4cHJlc3Npb25Bc3NpZ25tZW50XzZfMigpKTsgfQotKQotOwotZmluYWxseSB7Ci0JcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOwotfQotCi1ydWxlX19EYXRhSW50ZXJjaGFuZ2VCZWFuX19Hcm91cF82X18zCi0JQGluaXQgewotCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwotCX0KLToKLQlydWxlX19EYXRhSW50ZXJjaGFuZ2VCZWFuX19Hcm91cF82X18zX19JbXBsCi07Ci1maW5hbGx5IHsKLQlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Ci19Ci0KLXJ1bGVfX0RhdGFJbnRlcmNoYW5nZUJlYW5fX0dyb3VwXzZfXzNfX0ltcGwKLQlAaW5pdCB7Ci0JCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7Ci0JfQotOgotKAotCXsgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YUludGVyY2hhbmdlQmVhbkFjY2VzcygpLmdldFJpZ2h0Q3VybHlCcmFja2V0S2V5d29yZF82XzMoKSk7IH0KLQknfScKLQl7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YUludGVyY2hhbmdlQmVhbkFjY2VzcygpLmdldFJpZ2h0Q3VybHlCcmFja2V0S2V5d29yZF82XzMoKSk7IH0KKwl7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldERhdGFJbnRlcmNoYW5nZUJlYW5BY2Nlc3MoKS5nZXRMYXRlc3RFeHBQcm9wZXJ0eUFzc2lnbm1lbnRfNl8xKCkpOyB9CisJKHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUJlYW5fX0xhdGVzdEV4cFByb3BlcnR5QXNzaWdubWVudF82XzEpCisJeyBhZnRlcihncmFtbWFyQWNjZXNzLmdldERhdGFJbnRlcmNoYW5nZUJlYW5BY2Nlc3MoKS5nZXRMYXRlc3RFeHBQcm9wZXJ0eUFzc2lnbm1lbnRfNl8xKCkpOyB9CiApCiA7CiBmaW5hbGx5IHsKQEAgLTY0MTEsOSArNjY5Niw5IEBACiAJfQogOgogKAotCXsgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YUludGVyY2hhbmdlQmVhbkFjY2VzcygpLmdldExvb2t1cEtleXdvcmRfN18wKCkpOyB9Ci0JJ2xvb2t1cCcKLQl7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YUludGVyY2hhbmdlQmVhbkFjY2VzcygpLmdldExvb2t1cEtleXdvcmRfN18wKCkpOyB9CisJeyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXREYXRhSW50ZXJjaGFuZ2VCZWFuQWNjZXNzKCkuZ2V0RXhwcmVzc2lvbktleXdvcmRfN18wKCkpOyB9CisJJ2V4cHJlc3Npb24nCisJeyBhZnRlcihncmFtbWFyQWNjZXNzLmdldERhdGFJbnRlcmNoYW5nZUJlYW5BY2Nlc3MoKS5nZXRFeHByZXNzaW9uS2V5d29yZF83XzAoKSk7IH0KICkKIDsKIGZpbmFsbHkgewpAQCAtNjQ2NSw5ICs2NzUwLDkgQEAKIAl9CiA6CiAoCi0JeyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXREYXRhSW50ZXJjaGFuZ2VCZWFuQWNjZXNzKCkuZ2V0TG9va3VwQXNzaWdubWVudF83XzIoKSk7IH0KLQkocnVsZV9fRGF0YUludGVyY2hhbmdlQmVhbl9fTG9va3VwQXNzaWdubWVudF83XzIpKgotCXsgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXREYXRhSW50ZXJjaGFuZ2VCZWFuQWNjZXNzKCkuZ2V0TG9va3VwQXNzaWdubWVudF83XzIoKSk7IH0KKwl7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldERhdGFJbnRlcmNoYW5nZUJlYW5BY2Nlc3MoKS5nZXRFeHByZXNzaW9uQXNzaWdubWVudF83XzIoKSk7IH0KKwkocnVsZV9fRGF0YUludGVyY2hhbmdlQmVhbl9fRXhwcmVzc2lvbkFzc2lnbm1lbnRfN18yKSoKKwl7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YUludGVyY2hhbmdlQmVhbkFjY2VzcygpLmdldEV4cHJlc3Npb25Bc3NpZ25tZW50XzdfMigpKTsgfQogKQogOwogZmluYWxseSB7CkBAIC02NTE5LDkgKzY4MDQsOSBAQAogCX0KIDoKICgKLQl7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldERhdGFJbnRlcmNoYW5nZUJlYW5BY2Nlc3MoKS5nZXRGb3JtYXRLZXl3b3JkXzhfMCgpKTsgfQotCSdmb3JtYXQnCi0JeyBhZnRlcihncmFtbWFyQWNjZXNzLmdldERhdGFJbnRlcmNoYW5nZUJlYW5BY2Nlc3MoKS5nZXRGb3JtYXRLZXl3b3JkXzhfMCgpKTsgfQorCXsgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YUludGVyY2hhbmdlQmVhbkFjY2VzcygpLmdldExvb2t1cEtleXdvcmRfOF8wKCkpOyB9CisJJ2xvb2t1cCcKKwl7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YUludGVyY2hhbmdlQmVhbkFjY2VzcygpLmdldExvb2t1cEtleXdvcmRfOF8wKCkpOyB9CiApCiA7CiBmaW5hbGx5IHsKQEAgLTY1NzMsOSArNjg1OCw5IEBACiAJfQogOgogKAotCXsgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YUludGVyY2hhbmdlQmVhbkFjY2VzcygpLmdldEZvcm1hdEFzc2lnbm1lbnRfOF8yKCkpOyB9Ci0JKHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUJlYW5fX0Zvcm1hdEFzc2lnbm1lbnRfOF8yKSoKLQl7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YUludGVyY2hhbmdlQmVhbkFjY2VzcygpLmdldEZvcm1hdEFzc2lnbm1lbnRfOF8yKCkpOyB9CisJeyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXREYXRhSW50ZXJjaGFuZ2VCZWFuQWNjZXNzKCkuZ2V0TG9va3VwQXNzaWdubWVudF84XzIoKSk7IH0KKwkocnVsZV9fRGF0YUludGVyY2hhbmdlQmVhbl9fTG9va3VwQXNzaWdubWVudF84XzIpKgorCXsgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXREYXRhSW50ZXJjaGFuZ2VCZWFuQWNjZXNzKCkuZ2V0TG9va3VwQXNzaWdubWVudF84XzIoKSk7IH0KICkKIDsKIGZpbmFsbHkgewpAQCAtNjYyNyw5ICs2OTEyLDkgQEAKIAl9CiA6CiAoCi0JeyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXREYXRhSW50ZXJjaGFuZ2VCZWFuQWNjZXNzKCkuZ2V0TWFwcGluZ0tleXdvcmRfOV8wKCkpOyB9Ci0JJ21hcHBpbmcnCi0JeyBhZnRlcihncmFtbWFyQWNjZXNzLmdldERhdGFJbnRlcmNoYW5nZUJlYW5BY2Nlc3MoKS5nZXRNYXBwaW5nS2V5d29yZF85XzAoKSk7IH0KKwl7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldERhdGFJbnRlcmNoYW5nZUJlYW5BY2Nlc3MoKS5nZXRGb3JtYXRLZXl3b3JkXzlfMCgpKTsgfQorCSdmb3JtYXQnCisJeyBhZnRlcihncmFtbWFyQWNjZXNzLmdldERhdGFJbnRlcmNoYW5nZUJlYW5BY2Nlc3MoKS5nZXRGb3JtYXRLZXl3b3JkXzlfMCgpKTsgfQogKQogOwogZmluYWxseSB7CkBAIC02NjgxLDkgKzY5NjYsOSBAQAogCX0KIDoKICgKLQl7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldERhdGFJbnRlcmNoYW5nZUJlYW5BY2Nlc3MoKS5nZXRNYXBwaW5nc0Fzc2lnbm1lbnRfOV8yKCkpOyB9Ci0JKHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUJlYW5fX01hcHBpbmdzQXNzaWdubWVudF85XzIpKgotCXsgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXREYXRhSW50ZXJjaGFuZ2VCZWFuQWNjZXNzKCkuZ2V0TWFwcGluZ3NBc3NpZ25tZW50XzlfMigpKTsgfQorCXsgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YUludGVyY2hhbmdlQmVhbkFjY2VzcygpLmdldEZvcm1hdEFzc2lnbm1lbnRfOV8yKCkpOyB9CisJKHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUJlYW5fX0Zvcm1hdEFzc2lnbm1lbnRfOV8yKSoKKwl7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YUludGVyY2hhbmdlQmVhbkFjY2VzcygpLmdldEZvcm1hdEFzc2lnbm1lbnRfOV8yKCkpOyB9CiApCiA7CiBmaW5hbGx5IHsKQEAgLTY3MzUsOSArNzAyMCw5IEBACiAJfQogOgogKAotCXsgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YUludGVyY2hhbmdlQmVhbkFjY2VzcygpLmdldEtleXNLZXl3b3JkXzEwXzAoKSk7IH0KLQkna2V5cycKLQl7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YUludGVyY2hhbmdlQmVhbkFjY2VzcygpLmdldEtleXNLZXl3b3JkXzEwXzAoKSk7IH0KKwl7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldERhdGFJbnRlcmNoYW5nZUJlYW5BY2Nlc3MoKS5nZXRFeHBvc2VLZXl3b3JkXzEwXzAoKSk7IH0KKwknZXhwb3NlJworCXsgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXREYXRhSW50ZXJjaGFuZ2VCZWFuQWNjZXNzKCkuZ2V0RXhwb3NlS2V5d29yZF8xMF8wKCkpOyB9CiApCiA7CiBmaW5hbGx5IHsKQEAgLTY3ODksOSArNzA3NCw5IEBACiAJfQogOgogKAotCXsgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YUludGVyY2hhbmdlQmVhbkFjY2VzcygpLmdldExvb2t1cEtleXNBc3NpZ25tZW50XzEwXzIoKSk7IH0KLQkocnVsZV9fRGF0YUludGVyY2hhbmdlQmVhbl9fTG9va3VwS2V5c0Fzc2lnbm1lbnRfMTBfMikqCi0JeyBhZnRlcihncmFtbWFyQWNjZXNzLmdldERhdGFJbnRlcmNoYW5nZUJlYW5BY2Nlc3MoKS5nZXRMb29rdXBLZXlzQXNzaWdubWVudF8xMF8yKCkpOyB9CisJeyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXREYXRhSW50ZXJjaGFuZ2VCZWFuQWNjZXNzKCkuZ2V0RXhwb3J0RXhwb3Nlc0Fzc2lnbm1lbnRfMTBfMigpKTsgfQorCShydWxlX19EYXRhSW50ZXJjaGFuZ2VCZWFuX19FeHBvcnRFeHBvc2VzQXNzaWdubWVudF8xMF8yKSoKKwl7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YUludGVyY2hhbmdlQmVhbkFjY2VzcygpLmdldEV4cG9ydEV4cG9zZXNBc3NpZ25tZW50XzEwXzIoKSk7IH0KICkKIDsKIGZpbmFsbHkgewpAQCAtNjgyNSw2ICs3MTEwLDMzMCBAQAogfQogCiAKK3J1bGVfX0RhdGFJbnRlcmNoYW5nZUJlYW5fX0dyb3VwXzExX18wCisJQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworCX0KKzoKKwlydWxlX19EYXRhSW50ZXJjaGFuZ2VCZWFuX19Hcm91cF8xMV9fMF9fSW1wbAorCXJ1bGVfX0RhdGFJbnRlcmNoYW5nZUJlYW5fX0dyb3VwXzExX18xCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKK3J1bGVfX0RhdGFJbnRlcmNoYW5nZUJlYW5fX0dyb3VwXzExX18wX19JbXBsCisJQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworCX0KKzoKKygKKwl7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldERhdGFJbnRlcmNoYW5nZUJlYW5BY2Nlc3MoKS5nZXRNYXBwaW5nS2V5d29yZF8xMV8wKCkpOyB9CisJJ21hcHBpbmcnCisJeyBhZnRlcihncmFtbWFyQWNjZXNzLmdldERhdGFJbnRlcmNoYW5nZUJlYW5BY2Nlc3MoKS5nZXRNYXBwaW5nS2V5d29yZF8xMV8wKCkpOyB9CispCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKK3J1bGVfX0RhdGFJbnRlcmNoYW5nZUJlYW5fX0dyb3VwXzExX18xCisJQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworCX0KKzoKKwlydWxlX19EYXRhSW50ZXJjaGFuZ2VCZWFuX19Hcm91cF8xMV9fMV9fSW1wbAorCXJ1bGVfX0RhdGFJbnRlcmNoYW5nZUJlYW5fX0dyb3VwXzExX18yCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKK3J1bGVfX0RhdGFJbnRlcmNoYW5nZUJlYW5fX0dyb3VwXzExX18xX19JbXBsCisJQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworCX0KKzoKKygKKwl7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldERhdGFJbnRlcmNoYW5nZUJlYW5BY2Nlc3MoKS5nZXRMZWZ0Q3VybHlCcmFja2V0S2V5d29yZF8xMV8xKCkpOyB9CisJJ3snCisJeyBhZnRlcihncmFtbWFyQWNjZXNzLmdldERhdGFJbnRlcmNoYW5nZUJlYW5BY2Nlc3MoKS5nZXRMZWZ0Q3VybHlCcmFja2V0S2V5d29yZF8xMV8xKCkpOyB9CispCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKK3J1bGVfX0RhdGFJbnRlcmNoYW5nZUJlYW5fX0dyb3VwXzExX18yCisJQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworCX0KKzoKKwlydWxlX19EYXRhSW50ZXJjaGFuZ2VCZWFuX19Hcm91cF8xMV9fMl9fSW1wbAorCXJ1bGVfX0RhdGFJbnRlcmNoYW5nZUJlYW5fX0dyb3VwXzExX18zCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKK3J1bGVfX0RhdGFJbnRlcmNoYW5nZUJlYW5fX0dyb3VwXzExX18yX19JbXBsCisJQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworCX0KKzoKKygKKwl7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldERhdGFJbnRlcmNoYW5nZUJlYW5BY2Nlc3MoKS5nZXRNYXBwaW5nc0Fzc2lnbm1lbnRfMTFfMigpKTsgfQorCShydWxlX19EYXRhSW50ZXJjaGFuZ2VCZWFuX19NYXBwaW5nc0Fzc2lnbm1lbnRfMTFfMikqCisJeyBhZnRlcihncmFtbWFyQWNjZXNzLmdldERhdGFJbnRlcmNoYW5nZUJlYW5BY2Nlc3MoKS5nZXRNYXBwaW5nc0Fzc2lnbm1lbnRfMTFfMigpKTsgfQorKQorOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCitydWxlX19EYXRhSW50ZXJjaGFuZ2VCZWFuX19Hcm91cF8xMV9fMworCUBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKwl9Cis6CisJcnVsZV9fRGF0YUludGVyY2hhbmdlQmVhbl9fR3JvdXBfMTFfXzNfX0ltcGwKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworcnVsZV9fRGF0YUludGVyY2hhbmdlQmVhbl9fR3JvdXBfMTFfXzNfX0ltcGwKKwlAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisJfQorOgorKAorCXsgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YUludGVyY2hhbmdlQmVhbkFjY2VzcygpLmdldFJpZ2h0Q3VybHlCcmFja2V0S2V5d29yZF8xMV8zKCkpOyB9CisJJ30nCisJeyBhZnRlcihncmFtbWFyQWNjZXNzLmdldERhdGFJbnRlcmNoYW5nZUJlYW5BY2Nlc3MoKS5nZXRSaWdodEN1cmx5QnJhY2tldEtleXdvcmRfMTFfMygpKTsgfQorKQorOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCisKK3J1bGVfX0RhdGFJbnRlcmNoYW5nZUJlYW5fX0dyb3VwXzEyX18wCisJQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworCX0KKzoKKwlydWxlX19EYXRhSW50ZXJjaGFuZ2VCZWFuX19Hcm91cF8xMl9fMF9fSW1wbAorCXJ1bGVfX0RhdGFJbnRlcmNoYW5nZUJlYW5fX0dyb3VwXzEyX18xCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKK3J1bGVfX0RhdGFJbnRlcmNoYW5nZUJlYW5fX0dyb3VwXzEyX18wX19JbXBsCisJQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworCX0KKzoKKygKKwl7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldERhdGFJbnRlcmNoYW5nZUJlYW5BY2Nlc3MoKS5nZXRLZXlzS2V5d29yZF8xMl8wKCkpOyB9CisJJ2tleXMnCisJeyBhZnRlcihncmFtbWFyQWNjZXNzLmdldERhdGFJbnRlcmNoYW5nZUJlYW5BY2Nlc3MoKS5nZXRLZXlzS2V5d29yZF8xMl8wKCkpOyB9CispCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKK3J1bGVfX0RhdGFJbnRlcmNoYW5nZUJlYW5fX0dyb3VwXzEyX18xCisJQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworCX0KKzoKKwlydWxlX19EYXRhSW50ZXJjaGFuZ2VCZWFuX19Hcm91cF8xMl9fMV9fSW1wbAorCXJ1bGVfX0RhdGFJbnRlcmNoYW5nZUJlYW5fX0dyb3VwXzEyX18yCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKK3J1bGVfX0RhdGFJbnRlcmNoYW5nZUJlYW5fX0dyb3VwXzEyX18xX19JbXBsCisJQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworCX0KKzoKKygKKwl7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldERhdGFJbnRlcmNoYW5nZUJlYW5BY2Nlc3MoKS5nZXRMZWZ0Q3VybHlCcmFja2V0S2V5d29yZF8xMl8xKCkpOyB9CisJJ3snCisJeyBhZnRlcihncmFtbWFyQWNjZXNzLmdldERhdGFJbnRlcmNoYW5nZUJlYW5BY2Nlc3MoKS5nZXRMZWZ0Q3VybHlCcmFja2V0S2V5d29yZF8xMl8xKCkpOyB9CispCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKK3J1bGVfX0RhdGFJbnRlcmNoYW5nZUJlYW5fX0dyb3VwXzEyX18yCisJQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworCX0KKzoKKwlydWxlX19EYXRhSW50ZXJjaGFuZ2VCZWFuX19Hcm91cF8xMl9fMl9fSW1wbAorCXJ1bGVfX0RhdGFJbnRlcmNoYW5nZUJlYW5fX0dyb3VwXzEyX18zCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKK3J1bGVfX0RhdGFJbnRlcmNoYW5nZUJlYW5fX0dyb3VwXzEyX18yX19JbXBsCisJQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworCX0KKzoKKygKKwl7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldERhdGFJbnRlcmNoYW5nZUJlYW5BY2Nlc3MoKS5nZXRMb29rdXBLZXlzQXNzaWdubWVudF8xMl8yKCkpOyB9CisJKHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUJlYW5fX0xvb2t1cEtleXNBc3NpZ25tZW50XzEyXzIpKgorCXsgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXREYXRhSW50ZXJjaGFuZ2VCZWFuQWNjZXNzKCkuZ2V0TG9va3VwS2V5c0Fzc2lnbm1lbnRfMTJfMigpKTsgfQorKQorOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCitydWxlX19EYXRhSW50ZXJjaGFuZ2VCZWFuX19Hcm91cF8xMl9fMworCUBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKwl9Cis6CisJcnVsZV9fRGF0YUludGVyY2hhbmdlQmVhbl9fR3JvdXBfMTJfXzNfX0ltcGwKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworcnVsZV9fRGF0YUludGVyY2hhbmdlQmVhbl9fR3JvdXBfMTJfXzNfX0ltcGwKKwlAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisJfQorOgorKAorCXsgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YUludGVyY2hhbmdlQmVhbkFjY2VzcygpLmdldFJpZ2h0Q3VybHlCcmFja2V0S2V5d29yZF8xMl8zKCkpOyB9CisJJ30nCisJeyBhZnRlcihncmFtbWFyQWNjZXNzLmdldERhdGFJbnRlcmNoYW5nZUJlYW5BY2Nlc3MoKS5nZXRSaWdodEN1cmx5QnJhY2tldEtleXdvcmRfMTJfMygpKTsgfQorKQorOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCisKK3J1bGVfX0RhdGFJbnRlcmNoYW5nZUJlYW5fX0dyb3VwXzEzX18wCisJQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworCX0KKzoKKwlydWxlX19EYXRhSW50ZXJjaGFuZ2VCZWFuX19Hcm91cF8xM19fMF9fSW1wbAorCXJ1bGVfX0RhdGFJbnRlcmNoYW5nZUJlYW5fX0dyb3VwXzEzX18xCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKK3J1bGVfX0RhdGFJbnRlcmNoYW5nZUJlYW5fX0dyb3VwXzEzX18wX19JbXBsCisJQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworCX0KKzoKKygKKwl7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldERhdGFJbnRlcmNoYW5nZUJlYW5BY2Nlc3MoKS5nZXRFeHBvcnRGaWx0ZXJLZXl3b3JkXzEzXzAoKSk7IH0KKwknZXhwb3J0RmlsdGVyJworCXsgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXREYXRhSW50ZXJjaGFuZ2VCZWFuQWNjZXNzKCkuZ2V0RXhwb3J0RmlsdGVyS2V5d29yZF8xM18wKCkpOyB9CispCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKK3J1bGVfX0RhdGFJbnRlcmNoYW5nZUJlYW5fX0dyb3VwXzEzX18xCisJQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworCX0KKzoKKwlydWxlX19EYXRhSW50ZXJjaGFuZ2VCZWFuX19Hcm91cF8xM19fMV9fSW1wbAorCXJ1bGVfX0RhdGFJbnRlcmNoYW5nZUJlYW5fX0dyb3VwXzEzX18yCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKK3J1bGVfX0RhdGFJbnRlcmNoYW5nZUJlYW5fX0dyb3VwXzEzX18xX19JbXBsCisJQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworCX0KKzoKKygKKwl7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldERhdGFJbnRlcmNoYW5nZUJlYW5BY2Nlc3MoKS5nZXRMZWZ0Q3VybHlCcmFja2V0S2V5d29yZF8xM18xKCkpOyB9CisJJ3snCisJeyBhZnRlcihncmFtbWFyQWNjZXNzLmdldERhdGFJbnRlcmNoYW5nZUJlYW5BY2Nlc3MoKS5nZXRMZWZ0Q3VybHlCcmFja2V0S2V5d29yZF8xM18xKCkpOyB9CispCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKK3J1bGVfX0RhdGFJbnRlcmNoYW5nZUJlYW5fX0dyb3VwXzEzX18yCisJQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworCX0KKzoKKwlydWxlX19EYXRhSW50ZXJjaGFuZ2VCZWFuX19Hcm91cF8xM19fMl9fSW1wbAorCXJ1bGVfX0RhdGFJbnRlcmNoYW5nZUJlYW5fX0dyb3VwXzEzX18zCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKK3J1bGVfX0RhdGFJbnRlcmNoYW5nZUJlYW5fX0dyb3VwXzEzX18yX19JbXBsCisJQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworCX0KKzoKKygKKwl7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldERhdGFJbnRlcmNoYW5nZUJlYW5BY2Nlc3MoKS5nZXRFeHBvcnRGaWx0ZXJBc3NpZ25tZW50XzEzXzIoKSk7IH0KKwkocnVsZV9fRGF0YUludGVyY2hhbmdlQmVhbl9fRXhwb3J0RmlsdGVyQXNzaWdubWVudF8xM18yKQorCXsgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXREYXRhSW50ZXJjaGFuZ2VCZWFuQWNjZXNzKCkuZ2V0RXhwb3J0RmlsdGVyQXNzaWdubWVudF8xM18yKCkpOyB9CispCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKK3J1bGVfX0RhdGFJbnRlcmNoYW5nZUJlYW5fX0dyb3VwXzEzX18zCisJQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworCX0KKzoKKwlydWxlX19EYXRhSW50ZXJjaGFuZ2VCZWFuX19Hcm91cF8xM19fM19fSW1wbAorOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCitydWxlX19EYXRhSW50ZXJjaGFuZ2VCZWFuX19Hcm91cF8xM19fM19fSW1wbAorCUBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKwl9Cis6CisoCisJeyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXREYXRhSW50ZXJjaGFuZ2VCZWFuQWNjZXNzKCkuZ2V0UmlnaHRDdXJseUJyYWNrZXRLZXl3b3JkXzEzXzMoKSk7IH0KKwknfScKKwl7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YUludGVyY2hhbmdlQmVhbkFjY2VzcygpLmdldFJpZ2h0Q3VybHlCcmFja2V0S2V5d29yZF8xM18zKCkpOyB9CispCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKKwogcnVsZV9fRGF0YUludGVyY2hhbmdlS2V5X19Hcm91cF9fMAogCUBpbml0IHsKIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKQEAgLTc5ODYsNiArODU5NSw3MzUgQEAKIH0KIAogCitydWxlX19EYXRhSW50ZXJjaGFuZ2VFeHBvc2VfX0dyb3VwX18wCisJQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworCX0KKzoKKwlydWxlX19EYXRhSW50ZXJjaGFuZ2VFeHBvc2VfX0dyb3VwX18wX19JbXBsCisJcnVsZV9fRGF0YUludGVyY2hhbmdlRXhwb3NlX19Hcm91cF9fMQorOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCitydWxlX19EYXRhSW50ZXJjaGFuZ2VFeHBvc2VfX0dyb3VwX18wX19JbXBsCisJQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworCX0KKzoKKygKKwl7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldERhdGFJbnRlcmNoYW5nZUV4cG9zZUFjY2VzcygpLmdldERhdGFJbnRlcmNoYW5nZUV4cG9zZUFjdGlvbl8wKCkpOyB9CisJKCkKKwl7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YUludGVyY2hhbmdlRXhwb3NlQWNjZXNzKCkuZ2V0RGF0YUludGVyY2hhbmdlRXhwb3NlQWN0aW9uXzAoKSk7IH0KKykKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworcnVsZV9fRGF0YUludGVyY2hhbmdlRXhwb3NlX19Hcm91cF9fMQorCUBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKwl9Cis6CisJcnVsZV9fRGF0YUludGVyY2hhbmdlRXhwb3NlX19Hcm91cF9fMV9fSW1wbAorCXJ1bGVfX0RhdGFJbnRlcmNoYW5nZUV4cG9zZV9fR3JvdXBfXzIKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworcnVsZV9fRGF0YUludGVyY2hhbmdlRXhwb3NlX19Hcm91cF9fMV9fSW1wbAorCUBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKwl9Cis6CisoCisJeyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXREYXRhSW50ZXJjaGFuZ2VFeHBvc2VBY2Nlc3MoKS5nZXRSZWZLZXl3b3JkXzEoKSk7IH0KKwkncmVmJworCXsgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXREYXRhSW50ZXJjaGFuZ2VFeHBvc2VBY2Nlc3MoKS5nZXRSZWZLZXl3b3JkXzEoKSk7IH0KKykKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworcnVsZV9fRGF0YUludGVyY2hhbmdlRXhwb3NlX19Hcm91cF9fMgorCUBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKwl9Cis6CisJcnVsZV9fRGF0YUludGVyY2hhbmdlRXhwb3NlX19Hcm91cF9fMl9fSW1wbAorCXJ1bGVfX0RhdGFJbnRlcmNoYW5nZUV4cG9zZV9fR3JvdXBfXzMKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworcnVsZV9fRGF0YUludGVyY2hhbmdlRXhwb3NlX19Hcm91cF9fMl9fSW1wbAorCUBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKwl9Cis6CisoCisJeyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXREYXRhSW50ZXJjaGFuZ2VFeHBvc2VBY2Nlc3MoKS5nZXRSZWZFbnRpdHlBc3NpZ25tZW50XzIoKSk7IH0KKwkocnVsZV9fRGF0YUludGVyY2hhbmdlRXhwb3NlX19SZWZFbnRpdHlBc3NpZ25tZW50XzIpCisJeyBhZnRlcihncmFtbWFyQWNjZXNzLmdldERhdGFJbnRlcmNoYW5nZUV4cG9zZUFjY2VzcygpLmdldFJlZkVudGl0eUFzc2lnbm1lbnRfMigpKTsgfQorKQorOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCitydWxlX19EYXRhSW50ZXJjaGFuZ2VFeHBvc2VfX0dyb3VwX18zCisJQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworCX0KKzoKKwlydWxlX19EYXRhSW50ZXJjaGFuZ2VFeHBvc2VfX0dyb3VwX18zX19JbXBsCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKK3J1bGVfX0RhdGFJbnRlcmNoYW5nZUV4cG9zZV9fR3JvdXBfXzNfX0ltcGwKKwlAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisJfQorOgorKAorCXsgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YUludGVyY2hhbmdlRXhwb3NlQWNjZXNzKCkuZ2V0QWx0ZXJuYXRpdmVzXzMoKSk7IH0KKwkocnVsZV9fRGF0YUludGVyY2hhbmdlRXhwb3NlX19BbHRlcm5hdGl2ZXNfMykKKwl7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YUludGVyY2hhbmdlRXhwb3NlQWNjZXNzKCkuZ2V0QWx0ZXJuYXRpdmVzXzMoKSk7IH0KKykKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworCitydWxlX19EYXRhSW50ZXJjaGFuZ2VFeHBvc2VfX0dyb3VwXzNfMF9fMAorCUBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKwl9Cis6CisJcnVsZV9fRGF0YUludGVyY2hhbmdlRXhwb3NlX19Hcm91cF8zXzBfXzBfX0ltcGwKKwlydWxlX19EYXRhSW50ZXJjaGFuZ2VFeHBvc2VfX0dyb3VwXzNfMF9fMQorOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCitydWxlX19EYXRhSW50ZXJjaGFuZ2VFeHBvc2VfX0dyb3VwXzNfMF9fMF9fSW1wbAorCUBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKwl9Cis6CisoCisJeyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXREYXRhSW50ZXJjaGFuZ2VFeHBvc2VBY2Nlc3MoKS5nZXRPbktleXdvcmRfM18wXzAoKSk7IH0KKwknb24nCisJeyBhZnRlcihncmFtbWFyQWNjZXNzLmdldERhdGFJbnRlcmNoYW5nZUV4cG9zZUFjY2VzcygpLmdldE9uS2V5d29yZF8zXzBfMCgpKTsgfQorKQorOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCitydWxlX19EYXRhSW50ZXJjaGFuZ2VFeHBvc2VfX0dyb3VwXzNfMF9fMQorCUBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKwl9Cis6CisJcnVsZV9fRGF0YUludGVyY2hhbmdlRXhwb3NlX19Hcm91cF8zXzBfXzFfX0ltcGwKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworcnVsZV9fRGF0YUludGVyY2hhbmdlRXhwb3NlX19Hcm91cF8zXzBfXzFfX0ltcGwKKwlAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisJfQorOgorKAorCXsgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YUludGVyY2hhbmdlRXhwb3NlQWNjZXNzKCkuZ2V0UmVmUHJvcGVydHlBc3NpZ25tZW50XzNfMF8xKCkpOyB9CisJKHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUV4cG9zZV9fUmVmUHJvcGVydHlBc3NpZ25tZW50XzNfMF8xKQorCXsgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXREYXRhSW50ZXJjaGFuZ2VFeHBvc2VBY2Nlc3MoKS5nZXRSZWZQcm9wZXJ0eUFzc2lnbm1lbnRfM18wXzEoKSk7IH0KKykKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworCitydWxlX19EYXRhSW50ZXJjaGFuZ2VFeHBvc2VfX0dyb3VwXzNfMV9fMAorCUBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKwl9Cis6CisJcnVsZV9fRGF0YUludGVyY2hhbmdlRXhwb3NlX19Hcm91cF8zXzFfXzBfX0ltcGwKKwlydWxlX19EYXRhSW50ZXJjaGFuZ2VFeHBvc2VfX0dyb3VwXzNfMV9fMQorOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCitydWxlX19EYXRhSW50ZXJjaGFuZ2VFeHBvc2VfX0dyb3VwXzNfMV9fMF9fSW1wbAorCUBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKwl9Cis6CisoCisJeyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXREYXRhSW50ZXJjaGFuZ2VFeHBvc2VBY2Nlc3MoKS5nZXRFeHBvc2VLZXl3b3JkXzNfMV8wKCkpOyB9CisJJ2V4cG9zZScKKwl7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YUludGVyY2hhbmdlRXhwb3NlQWNjZXNzKCkuZ2V0RXhwb3NlS2V5d29yZF8zXzFfMCgpKTsgfQorKQorOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCitydWxlX19EYXRhSW50ZXJjaGFuZ2VFeHBvc2VfX0dyb3VwXzNfMV9fMQorCUBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKwl9Cis6CisJcnVsZV9fRGF0YUludGVyY2hhbmdlRXhwb3NlX19Hcm91cF8zXzFfXzFfX0ltcGwKKwlydWxlX19EYXRhSW50ZXJjaGFuZ2VFeHBvc2VfX0dyb3VwXzNfMV9fMgorOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCitydWxlX19EYXRhSW50ZXJjaGFuZ2VFeHBvc2VfX0dyb3VwXzNfMV9fMV9fSW1wbAorCUBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKwl9Cis6CisoCisJeyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXREYXRhSW50ZXJjaGFuZ2VFeHBvc2VBY2Nlc3MoKS5nZXRMZWZ0Q3VybHlCcmFja2V0S2V5d29yZF8zXzFfMSgpKTsgfQorCSd7JworCXsgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXREYXRhSW50ZXJjaGFuZ2VFeHBvc2VBY2Nlc3MoKS5nZXRMZWZ0Q3VybHlCcmFja2V0S2V5d29yZF8zXzFfMSgpKTsgfQorKQorOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCitydWxlX19EYXRhSW50ZXJjaGFuZ2VFeHBvc2VfX0dyb3VwXzNfMV9fMgorCUBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKwl9Cis6CisJcnVsZV9fRGF0YUludGVyY2hhbmdlRXhwb3NlX19Hcm91cF8zXzFfXzJfX0ltcGwKKwlydWxlX19EYXRhSW50ZXJjaGFuZ2VFeHBvc2VfX0dyb3VwXzNfMV9fMworOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCitydWxlX19EYXRhSW50ZXJjaGFuZ2VFeHBvc2VfX0dyb3VwXzNfMV9fMl9fSW1wbAorCUBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKwl9Cis6CisoCisJeyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXREYXRhSW50ZXJjaGFuZ2VFeHBvc2VBY2Nlc3MoKS5nZXRTdWJFeHBvc2VBc3NpZ25tZW50XzNfMV8yKCkpOyB9CisJKHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUV4cG9zZV9fU3ViRXhwb3NlQXNzaWdubWVudF8zXzFfMikKKwl7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YUludGVyY2hhbmdlRXhwb3NlQWNjZXNzKCkuZ2V0U3ViRXhwb3NlQXNzaWdubWVudF8zXzFfMigpKTsgfQorKQorOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCitydWxlX19EYXRhSW50ZXJjaGFuZ2VFeHBvc2VfX0dyb3VwXzNfMV9fMworCUBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKwl9Cis6CisJcnVsZV9fRGF0YUludGVyY2hhbmdlRXhwb3NlX19Hcm91cF8zXzFfXzNfX0ltcGwKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworcnVsZV9fRGF0YUludGVyY2hhbmdlRXhwb3NlX19Hcm91cF8zXzFfXzNfX0ltcGwKKwlAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisJfQorOgorKAorCXsgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YUludGVyY2hhbmdlRXhwb3NlQWNjZXNzKCkuZ2V0UmlnaHRDdXJseUJyYWNrZXRLZXl3b3JkXzNfMV8zKCkpOyB9CisJJ30nCisJeyBhZnRlcihncmFtbWFyQWNjZXNzLmdldERhdGFJbnRlcmNoYW5nZUV4cG9zZUFjY2VzcygpLmdldFJpZ2h0Q3VybHlCcmFja2V0S2V5d29yZF8zXzFfMygpKTsgfQorKQorOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCisKK3J1bGVfX0RhdGFJbnRlcmNoYW5nZUV4cG9ydEZpbHRlcl9fR3JvdXBfXzAKKwlAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisJfQorOgorCXJ1bGVfX0RhdGFJbnRlcmNoYW5nZUV4cG9ydEZpbHRlcl9fR3JvdXBfXzBfX0ltcGwKKwlydWxlX19EYXRhSW50ZXJjaGFuZ2VFeHBvcnRGaWx0ZXJfX0dyb3VwX18xCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKK3J1bGVfX0RhdGFJbnRlcmNoYW5nZUV4cG9ydEZpbHRlcl9fR3JvdXBfXzBfX0ltcGwKKwlAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisJfQorOgorKAorCXsgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YUludGVyY2hhbmdlRXhwb3J0RmlsdGVyQWNjZXNzKCkuZ2V0RGF0YUludGVyY2hhbmdlRXhwb3J0RmlsdGVyQWN0aW9uXzAoKSk7IH0KKwkoKQorCXsgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXREYXRhSW50ZXJjaGFuZ2VFeHBvcnRGaWx0ZXJBY2Nlc3MoKS5nZXREYXRhSW50ZXJjaGFuZ2VFeHBvcnRGaWx0ZXJBY3Rpb25fMCgpKTsgfQorKQorOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCitydWxlX19EYXRhSW50ZXJjaGFuZ2VFeHBvcnRGaWx0ZXJfX0dyb3VwX18xCisJQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworCX0KKzoKKwlydWxlX19EYXRhSW50ZXJjaGFuZ2VFeHBvcnRGaWx0ZXJfX0dyb3VwX18xX19JbXBsCisJcnVsZV9fRGF0YUludGVyY2hhbmdlRXhwb3J0RmlsdGVyX19Hcm91cF9fMgorOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCitydWxlX19EYXRhSW50ZXJjaGFuZ2VFeHBvcnRGaWx0ZXJfX0dyb3VwX18xX19JbXBsCisJQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworCX0KKzoKKygKKwl7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldERhdGFJbnRlcmNoYW5nZUV4cG9ydEZpbHRlckFjY2VzcygpLmdldEdyb3VwXzEoKSk7IH0KKwkocnVsZV9fRGF0YUludGVyY2hhbmdlRXhwb3J0RmlsdGVyX19Hcm91cF8xX18wKT8KKwl7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YUludGVyY2hhbmdlRXhwb3J0RmlsdGVyQWNjZXNzKCkuZ2V0R3JvdXBfMSgpKTsgfQorKQorOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCitydWxlX19EYXRhSW50ZXJjaGFuZ2VFeHBvcnRGaWx0ZXJfX0dyb3VwX18yCisJQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworCX0KKzoKKwlydWxlX19EYXRhSW50ZXJjaGFuZ2VFeHBvcnRGaWx0ZXJfX0dyb3VwX18yX19JbXBsCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKK3J1bGVfX0RhdGFJbnRlcmNoYW5nZUV4cG9ydEZpbHRlcl9fR3JvdXBfXzJfX0ltcGwKKwlAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisJfQorOgorKAorCXsgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YUludGVyY2hhbmdlRXhwb3J0RmlsdGVyQWNjZXNzKCkuZ2V0R3JvdXBfMigpKTsgfQorCShydWxlX19EYXRhSW50ZXJjaGFuZ2VFeHBvcnRGaWx0ZXJfX0dyb3VwXzJfXzApPworCXsgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXREYXRhSW50ZXJjaGFuZ2VFeHBvcnRGaWx0ZXJBY2Nlc3MoKS5nZXRHcm91cF8yKCkpOyB9CispCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKKworcnVsZV9fRGF0YUludGVyY2hhbmdlRXhwb3J0RmlsdGVyX19Hcm91cF8xX18wCisJQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworCX0KKzoKKwlydWxlX19EYXRhSW50ZXJjaGFuZ2VFeHBvcnRGaWx0ZXJfX0dyb3VwXzFfXzBfX0ltcGwKKwlydWxlX19EYXRhSW50ZXJjaGFuZ2VFeHBvcnRGaWx0ZXJfX0dyb3VwXzFfXzEKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworcnVsZV9fRGF0YUludGVyY2hhbmdlRXhwb3J0RmlsdGVyX19Hcm91cF8xX18wX19JbXBsCisJQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworCX0KKzoKKygKKwl7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldERhdGFJbnRlcmNoYW5nZUV4cG9ydEZpbHRlckFjY2VzcygpLmdldFdoZXJlS2V5d29yZF8xXzAoKSk7IH0KKwknd2hlcmUnCisJeyBhZnRlcihncmFtbWFyQWNjZXNzLmdldERhdGFJbnRlcmNoYW5nZUV4cG9ydEZpbHRlckFjY2VzcygpLmdldFdoZXJlS2V5d29yZF8xXzAoKSk7IH0KKykKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworcnVsZV9fRGF0YUludGVyY2hhbmdlRXhwb3J0RmlsdGVyX19Hcm91cF8xX18xCisJQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworCX0KKzoKKwlydWxlX19EYXRhSW50ZXJjaGFuZ2VFeHBvcnRGaWx0ZXJfX0dyb3VwXzFfXzFfX0ltcGwKKwlydWxlX19EYXRhSW50ZXJjaGFuZ2VFeHBvcnRGaWx0ZXJfX0dyb3VwXzFfXzIKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworcnVsZV9fRGF0YUludGVyY2hhbmdlRXhwb3J0RmlsdGVyX19Hcm91cF8xX18xX19JbXBsCisJQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworCX0KKzoKKygKKwl7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldERhdGFJbnRlcmNoYW5nZUV4cG9ydEZpbHRlckFjY2VzcygpLmdldExlZnRDdXJseUJyYWNrZXRLZXl3b3JkXzFfMSgpKTsgfQorCSd7JworCXsgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXREYXRhSW50ZXJjaGFuZ2VFeHBvcnRGaWx0ZXJBY2Nlc3MoKS5nZXRMZWZ0Q3VybHlCcmFja2V0S2V5d29yZF8xXzEoKSk7IH0KKykKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworcnVsZV9fRGF0YUludGVyY2hhbmdlRXhwb3J0RmlsdGVyX19Hcm91cF8xX18yCisJQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworCX0KKzoKKwlydWxlX19EYXRhSW50ZXJjaGFuZ2VFeHBvcnRGaWx0ZXJfX0dyb3VwXzFfXzJfX0ltcGwKKwlydWxlX19EYXRhSW50ZXJjaGFuZ2VFeHBvcnRGaWx0ZXJfX0dyb3VwXzFfXzMKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworcnVsZV9fRGF0YUludGVyY2hhbmdlRXhwb3J0RmlsdGVyX19Hcm91cF8xX18yX19JbXBsCisJQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworCX0KKzoKKygKKwl7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldERhdGFJbnRlcmNoYW5nZUV4cG9ydEZpbHRlckFjY2VzcygpLmdldENvbmRpdGlvbkFzc2lnbm1lbnRfMV8yKCkpOyB9CisJKHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUV4cG9ydEZpbHRlcl9fQ29uZGl0aW9uQXNzaWdubWVudF8xXzIpCisJeyBhZnRlcihncmFtbWFyQWNjZXNzLmdldERhdGFJbnRlcmNoYW5nZUV4cG9ydEZpbHRlckFjY2VzcygpLmdldENvbmRpdGlvbkFzc2lnbm1lbnRfMV8yKCkpOyB9CispCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKK3J1bGVfX0RhdGFJbnRlcmNoYW5nZUV4cG9ydEZpbHRlcl9fR3JvdXBfMV9fMworCUBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKwl9Cis6CisJcnVsZV9fRGF0YUludGVyY2hhbmdlRXhwb3J0RmlsdGVyX19Hcm91cF8xX18zX19JbXBsCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKK3J1bGVfX0RhdGFJbnRlcmNoYW5nZUV4cG9ydEZpbHRlcl9fR3JvdXBfMV9fM19fSW1wbAorCUBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKwl9Cis6CisoCisJeyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXREYXRhSW50ZXJjaGFuZ2VFeHBvcnRGaWx0ZXJBY2Nlc3MoKS5nZXRSaWdodEN1cmx5QnJhY2tldEtleXdvcmRfMV8zKCkpOyB9CisJJ30nCisJeyBhZnRlcihncmFtbWFyQWNjZXNzLmdldERhdGFJbnRlcmNoYW5nZUV4cG9ydEZpbHRlckFjY2VzcygpLmdldFJpZ2h0Q3VybHlCcmFja2V0S2V5d29yZF8xXzMoKSk7IH0KKykKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworCitydWxlX19EYXRhSW50ZXJjaGFuZ2VFeHBvcnRGaWx0ZXJfX0dyb3VwXzJfXzAKKwlAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisJfQorOgorCXJ1bGVfX0RhdGFJbnRlcmNoYW5nZUV4cG9ydEZpbHRlcl9fR3JvdXBfMl9fMF9fSW1wbAorCXJ1bGVfX0RhdGFJbnRlcmNoYW5nZUV4cG9ydEZpbHRlcl9fR3JvdXBfMl9fMQorOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCitydWxlX19EYXRhSW50ZXJjaGFuZ2VFeHBvcnRGaWx0ZXJfX0dyb3VwXzJfXzBfX0ltcGwKKwlAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisJfQorOgorKAorCXsgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YUludGVyY2hhbmdlRXhwb3J0RmlsdGVyQWNjZXNzKCkuZ2V0SGlkZUtleXdvcmRfMl8wKCkpOyB9CisJJ2hpZGUnCisJeyBhZnRlcihncmFtbWFyQWNjZXNzLmdldERhdGFJbnRlcmNoYW5nZUV4cG9ydEZpbHRlckFjY2VzcygpLmdldEhpZGVLZXl3b3JkXzJfMCgpKTsgfQorKQorOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCitydWxlX19EYXRhSW50ZXJjaGFuZ2VFeHBvcnRGaWx0ZXJfX0dyb3VwXzJfXzEKKwlAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisJfQorOgorCXJ1bGVfX0RhdGFJbnRlcmNoYW5nZUV4cG9ydEZpbHRlcl9fR3JvdXBfMl9fMV9fSW1wbAorOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCitydWxlX19EYXRhSW50ZXJjaGFuZ2VFeHBvcnRGaWx0ZXJfX0dyb3VwXzJfXzFfX0ltcGwKKwlAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisJfQorOgorKAorCXsgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YUludGVyY2hhbmdlRXhwb3J0RmlsdGVyQWNjZXNzKCkuZ2V0SGlkZGVucHJvcGVydGllc0Fzc2lnbm1lbnRfMl8xKCkpOyB9CisJKHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUV4cG9ydEZpbHRlcl9fSGlkZGVucHJvcGVydGllc0Fzc2lnbm1lbnRfMl8xKSoKKwl7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YUludGVyY2hhbmdlRXhwb3J0RmlsdGVyQWNjZXNzKCkuZ2V0SGlkZGVucHJvcGVydGllc0Fzc2lnbm1lbnRfMl8xKCkpOyB9CispCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKKworcnVsZV9fRGF0YUludGVyY2hhbmdlRmlsdGVyQ29uZGl0aW9uX19Hcm91cF9fMAorCUBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKwl9Cis6CisJcnVsZV9fRGF0YUludGVyY2hhbmdlRmlsdGVyQ29uZGl0aW9uX19Hcm91cF9fMF9fSW1wbAorCXJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbHRlckNvbmRpdGlvbl9fR3JvdXBfXzEKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworcnVsZV9fRGF0YUludGVyY2hhbmdlRmlsdGVyQ29uZGl0aW9uX19Hcm91cF9fMF9fSW1wbAorCUBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKwl9Cis6CisoCisJeyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXREYXRhSW50ZXJjaGFuZ2VGaWx0ZXJDb25kaXRpb25BY2Nlc3MoKS5nZXRSZWZQcm9wZXJ0eUFzc2lnbm1lbnRfMCgpKTsgfQorCShydWxlX19EYXRhSW50ZXJjaGFuZ2VGaWx0ZXJDb25kaXRpb25fX1JlZlByb3BlcnR5QXNzaWdubWVudF8wKQorCXsgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXREYXRhSW50ZXJjaGFuZ2VGaWx0ZXJDb25kaXRpb25BY2Nlc3MoKS5nZXRSZWZQcm9wZXJ0eUFzc2lnbm1lbnRfMCgpKTsgfQorKQorOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCitydWxlX19EYXRhSW50ZXJjaGFuZ2VGaWx0ZXJDb25kaXRpb25fX0dyb3VwX18xCisJQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworCX0KKzoKKwlydWxlX19EYXRhSW50ZXJjaGFuZ2VGaWx0ZXJDb25kaXRpb25fX0dyb3VwX18xX19JbXBsCisJcnVsZV9fRGF0YUludGVyY2hhbmdlRmlsdGVyQ29uZGl0aW9uX19Hcm91cF9fMgorOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCitydWxlX19EYXRhSW50ZXJjaGFuZ2VGaWx0ZXJDb25kaXRpb25fX0dyb3VwX18xX19JbXBsCisJQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworCX0KKzoKKygKKwl7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldERhdGFJbnRlcmNoYW5nZUZpbHRlckNvbmRpdGlvbkFjY2VzcygpLmdldE9wZXJhdG9yQXNzaWdubWVudF8xKCkpOyB9CisJKHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbHRlckNvbmRpdGlvbl9fT3BlcmF0b3JBc3NpZ25tZW50XzEpCisJeyBhZnRlcihncmFtbWFyQWNjZXNzLmdldERhdGFJbnRlcmNoYW5nZUZpbHRlckNvbmRpdGlvbkFjY2VzcygpLmdldE9wZXJhdG9yQXNzaWdubWVudF8xKCkpOyB9CispCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKK3J1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbHRlckNvbmRpdGlvbl9fR3JvdXBfXzIKKwlAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisJfQorOgorCXJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbHRlckNvbmRpdGlvbl9fR3JvdXBfXzJfX0ltcGwKKwlydWxlX19EYXRhSW50ZXJjaGFuZ2VGaWx0ZXJDb25kaXRpb25fX0dyb3VwX18zCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKK3J1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbHRlckNvbmRpdGlvbl9fR3JvdXBfXzJfX0ltcGwKKwlAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisJfQorOgorKAorCXsgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YUludGVyY2hhbmdlRmlsdGVyQ29uZGl0aW9uQWNjZXNzKCkuZ2V0VmFsdWVBc3NpZ25tZW50XzIoKSk7IH0KKwkocnVsZV9fRGF0YUludGVyY2hhbmdlRmlsdGVyQ29uZGl0aW9uX19WYWx1ZUFzc2lnbm1lbnRfMik/CisJeyBhZnRlcihncmFtbWFyQWNjZXNzLmdldERhdGFJbnRlcmNoYW5nZUZpbHRlckNvbmRpdGlvbkFjY2VzcygpLmdldFZhbHVlQXNzaWdubWVudF8yKCkpOyB9CispCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKK3J1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbHRlckNvbmRpdGlvbl9fR3JvdXBfXzMKKwlAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisJfQorOgorCXJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbHRlckNvbmRpdGlvbl9fR3JvdXBfXzNfX0ltcGwKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworcnVsZV9fRGF0YUludGVyY2hhbmdlRmlsdGVyQ29uZGl0aW9uX19Hcm91cF9fM19fSW1wbAorCUBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKwl9Cis6CisoCisJeyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXREYXRhSW50ZXJjaGFuZ2VGaWx0ZXJDb25kaXRpb25BY2Nlc3MoKS5nZXRHcm91cF8zKCkpOyB9CisJKHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbHRlckNvbmRpdGlvbl9fR3JvdXBfM19fMCk/CisJeyBhZnRlcihncmFtbWFyQWNjZXNzLmdldERhdGFJbnRlcmNoYW5nZUZpbHRlckNvbmRpdGlvbkFjY2VzcygpLmdldEdyb3VwXzMoKSk7IH0KKykKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworCitydWxlX19EYXRhSW50ZXJjaGFuZ2VGaWx0ZXJDb25kaXRpb25fX0dyb3VwXzNfXzAKKwlAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisJfQorOgorCXJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbHRlckNvbmRpdGlvbl9fR3JvdXBfM19fMF9fSW1wbAorCXJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbHRlckNvbmRpdGlvbl9fR3JvdXBfM19fMQorOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCitydWxlX19EYXRhSW50ZXJjaGFuZ2VGaWx0ZXJDb25kaXRpb25fX0dyb3VwXzNfXzBfX0ltcGwKKwlAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisJfQorOgorKAorCXsgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YUludGVyY2hhbmdlRmlsdGVyQ29uZGl0aW9uQWNjZXNzKCkuZ2V0T3BlcmF0b3IyQXNzaWdubWVudF8zXzAoKSk7IH0KKwkocnVsZV9fRGF0YUludGVyY2hhbmdlRmlsdGVyQ29uZGl0aW9uX19PcGVyYXRvcjJBc3NpZ25tZW50XzNfMCkKKwl7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YUludGVyY2hhbmdlRmlsdGVyQ29uZGl0aW9uQWNjZXNzKCkuZ2V0T3BlcmF0b3IyQXNzaWdubWVudF8zXzAoKSk7IH0KKykKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworcnVsZV9fRGF0YUludGVyY2hhbmdlRmlsdGVyQ29uZGl0aW9uX19Hcm91cF8zX18xCisJQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworCX0KKzoKKwlydWxlX19EYXRhSW50ZXJjaGFuZ2VGaWx0ZXJDb25kaXRpb25fX0dyb3VwXzNfXzFfX0ltcGwKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworcnVsZV9fRGF0YUludGVyY2hhbmdlRmlsdGVyQ29uZGl0aW9uX19Hcm91cF8zX18xX19JbXBsCisJQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworCX0KKzoKKygKKwl7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldERhdGFJbnRlcmNoYW5nZUZpbHRlckNvbmRpdGlvbkFjY2VzcygpLmdldFN1YmNvbmRpdGlvbkFzc2lnbm1lbnRfM18xKCkpOyB9CisJKHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbHRlckNvbmRpdGlvbl9fU3ViY29uZGl0aW9uQXNzaWdubWVudF8zXzEpCisJeyBhZnRlcihncmFtbWFyQWNjZXNzLmdldERhdGFJbnRlcmNoYW5nZUZpbHRlckNvbmRpdGlvbkFjY2VzcygpLmdldFN1YmNvbmRpdGlvbkFzc2lnbm1lbnRfM18xKCkpOyB9CispCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKKworcnVsZV9fRGF0YUludGVyY2hhbmdlRXhwb3J0SGlkZV9fR3JvdXBfXzAKKwlAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisJfQorOgorCXJ1bGVfX0RhdGFJbnRlcmNoYW5nZUV4cG9ydEhpZGVfX0dyb3VwX18wX19JbXBsCisJcnVsZV9fRGF0YUludGVyY2hhbmdlRXhwb3J0SGlkZV9fR3JvdXBfXzEKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworcnVsZV9fRGF0YUludGVyY2hhbmdlRXhwb3J0SGlkZV9fR3JvdXBfXzBfX0ltcGwKKwlAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisJfQorOgorKAorCXsgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YUludGVyY2hhbmdlRXhwb3J0SGlkZUFjY2VzcygpLmdldERhdGFJbnRlcmNoYW5nZUV4cG9ydEhpZGVBY3Rpb25fMCgpKTsgfQorCSgpCisJeyBhZnRlcihncmFtbWFyQWNjZXNzLmdldERhdGFJbnRlcmNoYW5nZUV4cG9ydEhpZGVBY2Nlc3MoKS5nZXREYXRhSW50ZXJjaGFuZ2VFeHBvcnRIaWRlQWN0aW9uXzAoKSk7IH0KKykKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworcnVsZV9fRGF0YUludGVyY2hhbmdlRXhwb3J0SGlkZV9fR3JvdXBfXzEKKwlAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisJfQorOgorCXJ1bGVfX0RhdGFJbnRlcmNoYW5nZUV4cG9ydEhpZGVfX0dyb3VwX18xX19JbXBsCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKK3J1bGVfX0RhdGFJbnRlcmNoYW5nZUV4cG9ydEhpZGVfX0dyb3VwX18xX19JbXBsCisJQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworCX0KKzoKKygKKwl7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldERhdGFJbnRlcmNoYW5nZUV4cG9ydEhpZGVBY2Nlc3MoKS5nZXRQcm9wZXJ0eUFzc2lnbm1lbnRfMSgpKTsgfQorCShydWxlX19EYXRhSW50ZXJjaGFuZ2VFeHBvcnRIaWRlX19Qcm9wZXJ0eUFzc2lnbm1lbnRfMSkKKwl7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YUludGVyY2hhbmdlRXhwb3J0SGlkZUFjY2VzcygpLmdldFByb3BlcnR5QXNzaWdubWVudF8xKCkpOyB9CispCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKKwogcnVsZV9fRGF0YUludGVyY2hhbmdlUHJlZGVmaW5lZEV4cHJlc3Npb25fX0dyb3VwX18wCiAJQGluaXQgewogCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwpAQCAtMjIzNzEsMzAgKzIzNzA5LDQ5IEBACiAJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOwogfQogCi1ydWxlX19EYXRhSW50ZXJjaGFuZ2VfX0ZpbGVFbmRwb2ludEFzc2lnbm1lbnRfOQorcnVsZV9fRGF0YUludGVyY2hhbmdlX19EZWxldGVGaWxlQWZ0ZXJJbXBvcnRBc3NpZ25tZW50XzgKIAlAaW5pdCB7CiAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAJfQogOgogCSgKLQkJeyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXREYXRhSW50ZXJjaGFuZ2VBY2Nlc3MoKS5nZXRGaWxlRW5kcG9pbnREYXRhSW50ZXJjaGFuZ2VGaWxlUGFyc2VyUnVsZUNhbGxfOV8wKCkpOyB9Ci0JCXJ1bGVEYXRhSW50ZXJjaGFuZ2VGaWxlCi0JCXsgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXREYXRhSW50ZXJjaGFuZ2VBY2Nlc3MoKS5nZXRGaWxlRW5kcG9pbnREYXRhSW50ZXJjaGFuZ2VGaWxlUGFyc2VyUnVsZUNhbGxfOV8wKCkpOyB9CisJCXsgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YUludGVyY2hhbmdlQWNjZXNzKCkuZ2V0RGVsZXRlRmlsZUFmdGVySW1wb3J0RGVsZXRlRmlsZUFmdGVySW1wb3J0S2V5d29yZF84XzAoKSk7IH0KKwkJKAorCQkJeyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXREYXRhSW50ZXJjaGFuZ2VBY2Nlc3MoKS5nZXREZWxldGVGaWxlQWZ0ZXJJbXBvcnREZWxldGVGaWxlQWZ0ZXJJbXBvcnRLZXl3b3JkXzhfMCgpKTsgfQorCQkJJ2RlbGV0ZUZpbGVBZnRlckltcG9ydCcKKwkJCXsgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXREYXRhSW50ZXJjaGFuZ2VBY2Nlc3MoKS5nZXREZWxldGVGaWxlQWZ0ZXJJbXBvcnREZWxldGVGaWxlQWZ0ZXJJbXBvcnRLZXl3b3JkXzhfMCgpKTsgfQorCQkpCisJCXsgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXREYXRhSW50ZXJjaGFuZ2VBY2Nlc3MoKS5nZXREZWxldGVGaWxlQWZ0ZXJJbXBvcnREZWxldGVGaWxlQWZ0ZXJJbXBvcnRLZXl3b3JkXzhfMCgpKTsgfQogCSkKIDsKIGZpbmFsbHkgewogCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKIH0KIAotcnVsZV9fRGF0YUludGVyY2hhbmdlX19QYXRoQXNzaWdubWVudF8xMgorcnVsZV9fRGF0YUludGVyY2hhbmdlX19GaWxlRW5kcG9pbnRBc3NpZ25tZW50XzEwCiAJQGluaXQgewogCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogCX0KIDoKIAkoCi0JCXsgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YUludGVyY2hhbmdlQWNjZXNzKCkuZ2V0UGF0aERhdGFJbnRlcmNoYW5nZUJlYW5QYXJzZXJSdWxlQ2FsbF8xMl8wKCkpOyB9CisJCXsgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YUludGVyY2hhbmdlQWNjZXNzKCkuZ2V0RmlsZUVuZHBvaW50RGF0YUludGVyY2hhbmdlRmlsZVBhcnNlclJ1bGVDYWxsXzEwXzAoKSk7IH0KKwkJcnVsZURhdGFJbnRlcmNoYW5nZUZpbGUKKwkJeyBhZnRlcihncmFtbWFyQWNjZXNzLmdldERhdGFJbnRlcmNoYW5nZUFjY2VzcygpLmdldEZpbGVFbmRwb2ludERhdGFJbnRlcmNoYW5nZUZpbGVQYXJzZXJSdWxlQ2FsbF8xMF8wKCkpOyB9CisJKQorOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCitydWxlX19EYXRhSW50ZXJjaGFuZ2VfX1BhdGhBc3NpZ25tZW50XzEzCisJQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworCX0KKzoKKwkoCisJCXsgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YUludGVyY2hhbmdlQWNjZXNzKCkuZ2V0UGF0aERhdGFJbnRlcmNoYW5nZUJlYW5QYXJzZXJSdWxlQ2FsbF8xM18wKCkpOyB9CiAJCXJ1bGVEYXRhSW50ZXJjaGFuZ2VCZWFuCi0JCXsgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXREYXRhSW50ZXJjaGFuZ2VBY2Nlc3MoKS5nZXRQYXRoRGF0YUludGVyY2hhbmdlQmVhblBhcnNlclJ1bGVDYWxsXzEyXzAoKSk7IH0KKwkJeyBhZnRlcihncmFtbWFyQWNjZXNzLmdldERhdGFJbnRlcmNoYW5nZUFjY2VzcygpLmdldFBhdGhEYXRhSW50ZXJjaGFuZ2VCZWFuUGFyc2VyUnVsZUNhbGxfMTNfMCgpKTsgfQogCSkKIDsKIGZpbmFsbHkgewpAQCAtMjI3MDIsMTkgKzI0MDU5LDE5IEBACiAJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOwogfQogCi1ydWxlX19EYXRhSW50ZXJjaGFuZ2VCZWFuX19NYXJrTGF0ZXN0QXNzaWdubWVudF81XzAKK3J1bGVfX0RhdGFJbnRlcmNoYW5nZUJlYW5fX01hcmtMYXRlc3RJbXBvcnRBc3NpZ25tZW50XzVfMAogCUBpbml0IHsKIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKIAl9CiA6CiAJKAotCQl7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldERhdGFJbnRlcmNoYW5nZUJlYW5BY2Nlc3MoKS5nZXRNYXJrTGF0ZXN0TWFya2VyS2V5d29yZF81XzBfMCgpKTsgfQorCQl7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldERhdGFJbnRlcmNoYW5nZUJlYW5BY2Nlc3MoKS5nZXRNYXJrTGF0ZXN0SW1wb3J0TGF0ZXN0SW1wb3J0S2V5d29yZF81XzBfMCgpKTsgfQogCQkoCi0JCQl7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldERhdGFJbnRlcmNoYW5nZUJlYW5BY2Nlc3MoKS5nZXRNYXJrTGF0ZXN0TWFya2VyS2V5d29yZF81XzBfMCgpKTsgfQotCQkJJ21hcmtlcicKLQkJCXsgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXREYXRhSW50ZXJjaGFuZ2VCZWFuQWNjZXNzKCkuZ2V0TWFya0xhdGVzdE1hcmtlcktleXdvcmRfNV8wXzAoKSk7IH0KKwkJCXsgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YUludGVyY2hhbmdlQmVhbkFjY2VzcygpLmdldE1hcmtMYXRlc3RJbXBvcnRMYXRlc3RJbXBvcnRLZXl3b3JkXzVfMF8wKCkpOyB9CisJCQknbGF0ZXN0SW1wb3J0JworCQkJeyBhZnRlcihncmFtbWFyQWNjZXNzLmdldERhdGFJbnRlcmNoYW5nZUJlYW5BY2Nlc3MoKS5nZXRNYXJrTGF0ZXN0SW1wb3J0TGF0ZXN0SW1wb3J0S2V5d29yZF81XzBfMCgpKTsgfQogCQkpCi0JCXsgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXREYXRhSW50ZXJjaGFuZ2VCZWFuQWNjZXNzKCkuZ2V0TWFya0xhdGVzdE1hcmtlcktleXdvcmRfNV8wXzAoKSk7IH0KKwkJeyBhZnRlcihncmFtbWFyQWNjZXNzLmdldERhdGFJbnRlcmNoYW5nZUJlYW5BY2Nlc3MoKS5nZXRNYXJrTGF0ZXN0SW1wb3J0TGF0ZXN0SW1wb3J0S2V5d29yZF81XzBfMCgpKTsgfQogCSkKIDsKIGZpbmFsbHkgewpAQCAtMjI3NDAsNzUgKzI0MDk3LDE0MyBAQAogCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKIH0KIAotcnVsZV9fRGF0YUludGVyY2hhbmdlQmVhbl9fRXhwcmVzc2lvbkFzc2lnbm1lbnRfNl8yCitydWxlX19EYXRhSW50ZXJjaGFuZ2VCZWFuX19NYXJrTGF0ZXN0RXhwb3J0QXNzaWdubWVudF82XzAKIAlAaW5pdCB7CiAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAJfQogOgogCSgKLQkJeyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXREYXRhSW50ZXJjaGFuZ2VCZWFuQWNjZXNzKCkuZ2V0RXhwcmVzc2lvbkRhdGFJbnRlcmNoYW5nZUV4cHJlc3Npb25QYXJzZXJSdWxlQ2FsbF82XzJfMCgpKTsgfQorCQl7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldERhdGFJbnRlcmNoYW5nZUJlYW5BY2Nlc3MoKS5nZXRNYXJrTGF0ZXN0RXhwb3J0TGF0ZXN0RXhwb3J0S2V5d29yZF82XzBfMCgpKTsgfQorCQkoCisJCQl7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldERhdGFJbnRlcmNoYW5nZUJlYW5BY2Nlc3MoKS5nZXRNYXJrTGF0ZXN0RXhwb3J0TGF0ZXN0RXhwb3J0S2V5d29yZF82XzBfMCgpKTsgfQorCQkJJ2xhdGVzdEV4cG9ydCcKKwkJCXsgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXREYXRhSW50ZXJjaGFuZ2VCZWFuQWNjZXNzKCkuZ2V0TWFya0xhdGVzdEV4cG9ydExhdGVzdEV4cG9ydEtleXdvcmRfNl8wXzAoKSk7IH0KKwkJKQorCQl7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YUludGVyY2hhbmdlQmVhbkFjY2VzcygpLmdldE1hcmtMYXRlc3RFeHBvcnRMYXRlc3RFeHBvcnRLZXl3b3JkXzZfMF8wKCkpOyB9CisJKQorOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCitydWxlX19EYXRhSW50ZXJjaGFuZ2VCZWFuX19MYXRlc3RFeHBQcm9wZXJ0eUFzc2lnbm1lbnRfNl8xCisJQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworCX0KKzoKKwkoCisJCXsgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YUludGVyY2hhbmdlQmVhbkFjY2VzcygpLmdldExhdGVzdEV4cFByb3BlcnR5TEVudGl0eUF0dHJpYnV0ZUNyb3NzUmVmZXJlbmNlXzZfMV8wKCkpOyB9CisJCSgKKwkJCXsgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YUludGVyY2hhbmdlQmVhbkFjY2VzcygpLmdldExhdGVzdEV4cFByb3BlcnR5TEVudGl0eUF0dHJpYnV0ZUlEVGVybWluYWxSdWxlQ2FsbF82XzFfMF8xKCkpOyB9CisJCQlSVUxFX0lECisJCQl7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YUludGVyY2hhbmdlQmVhbkFjY2VzcygpLmdldExhdGVzdEV4cFByb3BlcnR5TEVudGl0eUF0dHJpYnV0ZUlEVGVybWluYWxSdWxlQ2FsbF82XzFfMF8xKCkpOyB9CisJCSkKKwkJeyBhZnRlcihncmFtbWFyQWNjZXNzLmdldERhdGFJbnRlcmNoYW5nZUJlYW5BY2Nlc3MoKS5nZXRMYXRlc3RFeHBQcm9wZXJ0eUxFbnRpdHlBdHRyaWJ1dGVDcm9zc1JlZmVyZW5jZV82XzFfMCgpKTsgfQorCSkKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworcnVsZV9fRGF0YUludGVyY2hhbmdlQmVhbl9fRXhwcmVzc2lvbkFzc2lnbm1lbnRfN18yCisJQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworCX0KKzoKKwkoCisJCXsgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YUludGVyY2hhbmdlQmVhbkFjY2VzcygpLmdldEV4cHJlc3Npb25EYXRhSW50ZXJjaGFuZ2VFeHByZXNzaW9uUGFyc2VyUnVsZUNhbGxfN18yXzAoKSk7IH0KIAkJcnVsZURhdGFJbnRlcmNoYW5nZUV4cHJlc3Npb24KLQkJeyBhZnRlcihncmFtbWFyQWNjZXNzLmdldERhdGFJbnRlcmNoYW5nZUJlYW5BY2Nlc3MoKS5nZXRFeHByZXNzaW9uRGF0YUludGVyY2hhbmdlRXhwcmVzc2lvblBhcnNlclJ1bGVDYWxsXzZfMl8wKCkpOyB9CisJCXsgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXREYXRhSW50ZXJjaGFuZ2VCZWFuQWNjZXNzKCkuZ2V0RXhwcmVzc2lvbkRhdGFJbnRlcmNoYW5nZUV4cHJlc3Npb25QYXJzZXJSdWxlQ2FsbF83XzJfMCgpKTsgfQogCSkKIDsKIGZpbmFsbHkgewogCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKIH0KIAotcnVsZV9fRGF0YUludGVyY2hhbmdlQmVhbl9fTG9va3VwQXNzaWdubWVudF83XzIKK3J1bGVfX0RhdGFJbnRlcmNoYW5nZUJlYW5fX0xvb2t1cEFzc2lnbm1lbnRfOF8yCiAJQGluaXQgewogCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogCX0KIDoKIAkoCi0JCXsgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YUludGVyY2hhbmdlQmVhbkFjY2VzcygpLmdldExvb2t1cERhdGFJbnRlcmNoYW5nZUxvb2t1cFBhcnNlclJ1bGVDYWxsXzdfMl8wKCkpOyB9CisJCXsgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YUludGVyY2hhbmdlQmVhbkFjY2VzcygpLmdldExvb2t1cERhdGFJbnRlcmNoYW5nZUxvb2t1cFBhcnNlclJ1bGVDYWxsXzhfMl8wKCkpOyB9CiAJCXJ1bGVEYXRhSW50ZXJjaGFuZ2VMb29rdXAKLQkJeyBhZnRlcihncmFtbWFyQWNjZXNzLmdldERhdGFJbnRlcmNoYW5nZUJlYW5BY2Nlc3MoKS5nZXRMb29rdXBEYXRhSW50ZXJjaGFuZ2VMb29rdXBQYXJzZXJSdWxlQ2FsbF83XzJfMCgpKTsgfQorCQl7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YUludGVyY2hhbmdlQmVhbkFjY2VzcygpLmdldExvb2t1cERhdGFJbnRlcmNoYW5nZUxvb2t1cFBhcnNlclJ1bGVDYWxsXzhfMl8wKCkpOyB9CiAJKQogOwogZmluYWxseSB7CiAJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOwogfQogCi1ydWxlX19EYXRhSW50ZXJjaGFuZ2VCZWFuX19Gb3JtYXRBc3NpZ25tZW50XzhfMgorcnVsZV9fRGF0YUludGVyY2hhbmdlQmVhbl9fRm9ybWF0QXNzaWdubWVudF85XzIKIAlAaW5pdCB7CiAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAJfQogOgogCSgKLQkJeyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXREYXRhSW50ZXJjaGFuZ2VCZWFuQWNjZXNzKCkuZ2V0Rm9ybWF0RGF0YUludGVyY2hhbmdlRm9ybWF0UGFyc2VyUnVsZUNhbGxfOF8yXzAoKSk7IH0KKwkJeyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXREYXRhSW50ZXJjaGFuZ2VCZWFuQWNjZXNzKCkuZ2V0Rm9ybWF0RGF0YUludGVyY2hhbmdlRm9ybWF0UGFyc2VyUnVsZUNhbGxfOV8yXzAoKSk7IH0KIAkJcnVsZURhdGFJbnRlcmNoYW5nZUZvcm1hdAotCQl7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YUludGVyY2hhbmdlQmVhbkFjY2VzcygpLmdldEZvcm1hdERhdGFJbnRlcmNoYW5nZUZvcm1hdFBhcnNlclJ1bGVDYWxsXzhfMl8wKCkpOyB9CisJCXsgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXREYXRhSW50ZXJjaGFuZ2VCZWFuQWNjZXNzKCkuZ2V0Rm9ybWF0RGF0YUludGVyY2hhbmdlRm9ybWF0UGFyc2VyUnVsZUNhbGxfOV8yXzAoKSk7IH0KIAkpCiA7CiBmaW5hbGx5IHsKIAlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7CiB9CiAKLXJ1bGVfX0RhdGFJbnRlcmNoYW5nZUJlYW5fX01hcHBpbmdzQXNzaWdubWVudF85XzIKK3J1bGVfX0RhdGFJbnRlcmNoYW5nZUJlYW5fX0V4cG9ydEV4cG9zZXNBc3NpZ25tZW50XzEwXzIKIAlAaW5pdCB7CiAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAJfQogOgogCSgKLQkJeyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXREYXRhSW50ZXJjaGFuZ2VCZWFuQWNjZXNzKCkuZ2V0TWFwcGluZ3NEYXRhSW50ZXJjaGFuZ2VNYXBwaW5nUGFyc2VyUnVsZUNhbGxfOV8yXzAoKSk7IH0KKwkJeyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXREYXRhSW50ZXJjaGFuZ2VCZWFuQWNjZXNzKCkuZ2V0RXhwb3J0RXhwb3Nlc0RhdGFJbnRlcmNoYW5nZUV4cG9zZVBhcnNlclJ1bGVDYWxsXzEwXzJfMCgpKTsgfQorCQlydWxlRGF0YUludGVyY2hhbmdlRXhwb3NlCisJCXsgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXREYXRhSW50ZXJjaGFuZ2VCZWFuQWNjZXNzKCkuZ2V0RXhwb3J0RXhwb3Nlc0RhdGFJbnRlcmNoYW5nZUV4cG9zZVBhcnNlclJ1bGVDYWxsXzEwXzJfMCgpKTsgfQorCSkKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworcnVsZV9fRGF0YUludGVyY2hhbmdlQmVhbl9fTWFwcGluZ3NBc3NpZ25tZW50XzExXzIKKwlAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisJfQorOgorCSgKKwkJeyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXREYXRhSW50ZXJjaGFuZ2VCZWFuQWNjZXNzKCkuZ2V0TWFwcGluZ3NEYXRhSW50ZXJjaGFuZ2VNYXBwaW5nUGFyc2VyUnVsZUNhbGxfMTFfMl8wKCkpOyB9CiAJCXJ1bGVEYXRhSW50ZXJjaGFuZ2VNYXBwaW5nCi0JCXsgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXREYXRhSW50ZXJjaGFuZ2VCZWFuQWNjZXNzKCkuZ2V0TWFwcGluZ3NEYXRhSW50ZXJjaGFuZ2VNYXBwaW5nUGFyc2VyUnVsZUNhbGxfOV8yXzAoKSk7IH0KKwkJeyBhZnRlcihncmFtbWFyQWNjZXNzLmdldERhdGFJbnRlcmNoYW5nZUJlYW5BY2Nlc3MoKS5nZXRNYXBwaW5nc0RhdGFJbnRlcmNoYW5nZU1hcHBpbmdQYXJzZXJSdWxlQ2FsbF8xMV8yXzAoKSk7IH0KIAkpCiA7CiBmaW5hbGx5IHsKIAlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7CiB9CiAKLXJ1bGVfX0RhdGFJbnRlcmNoYW5nZUJlYW5fX0xvb2t1cEtleXNBc3NpZ25tZW50XzEwXzIKK3J1bGVfX0RhdGFJbnRlcmNoYW5nZUJlYW5fX0xvb2t1cEtleXNBc3NpZ25tZW50XzEyXzIKIAlAaW5pdCB7CiAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAJfQogOgogCSgKLQkJeyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXREYXRhSW50ZXJjaGFuZ2VCZWFuQWNjZXNzKCkuZ2V0TG9va3VwS2V5c0RhdGFJbnRlcmNoYW5nZUtleVBhcnNlclJ1bGVDYWxsXzEwXzJfMCgpKTsgfQorCQl7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldERhdGFJbnRlcmNoYW5nZUJlYW5BY2Nlc3MoKS5nZXRMb29rdXBLZXlzRGF0YUludGVyY2hhbmdlS2V5UGFyc2VyUnVsZUNhbGxfMTJfMl8wKCkpOyB9CiAJCXJ1bGVEYXRhSW50ZXJjaGFuZ2VLZXkKLQkJeyBhZnRlcihncmFtbWFyQWNjZXNzLmdldERhdGFJbnRlcmNoYW5nZUJlYW5BY2Nlc3MoKS5nZXRMb29rdXBLZXlzRGF0YUludGVyY2hhbmdlS2V5UGFyc2VyUnVsZUNhbGxfMTBfMl8wKCkpOyB9CisJCXsgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXREYXRhSW50ZXJjaGFuZ2VCZWFuQWNjZXNzKCkuZ2V0TG9va3VwS2V5c0RhdGFJbnRlcmNoYW5nZUtleVBhcnNlclJ1bGVDYWxsXzEyXzJfMCgpKTsgfQorCSkKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworcnVsZV9fRGF0YUludGVyY2hhbmdlQmVhbl9fRXhwb3J0RmlsdGVyQXNzaWdubWVudF8xM18yCisJQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworCX0KKzoKKwkoCisJCXsgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YUludGVyY2hhbmdlQmVhbkFjY2VzcygpLmdldEV4cG9ydEZpbHRlckRhdGFJbnRlcmNoYW5nZUV4cG9ydEZpbHRlclBhcnNlclJ1bGVDYWxsXzEzXzJfMCgpKTsgfQorCQlydWxlRGF0YUludGVyY2hhbmdlRXhwb3J0RmlsdGVyCisJCXsgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXREYXRhSW50ZXJjaGFuZ2VCZWFuQWNjZXNzKCkuZ2V0RXhwb3J0RmlsdGVyRGF0YUludGVyY2hhbmdlRXhwb3J0RmlsdGVyUGFyc2VyUnVsZUNhbGxfMTNfMl8wKCkpOyB9CiAJKQogOwogZmluYWxseSB7CkBAIC0yMzE3MSw2ICsyNDU5NiwxODcgQEAKIAlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7CiB9CiAKK3J1bGVfX0RhdGFJbnRlcmNoYW5nZUV4cG9zZV9fUmVmRW50aXR5QXNzaWdubWVudF8yCisJQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworCX0KKzoKKwkoCisJCXsgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YUludGVyY2hhbmdlRXhwb3NlQWNjZXNzKCkuZ2V0UmVmRW50aXR5TEVudGl0eVJlZmVyZW5jZUNyb3NzUmVmZXJlbmNlXzJfMCgpKTsgfQorCQkoCisJCQl7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldERhdGFJbnRlcmNoYW5nZUV4cG9zZUFjY2VzcygpLmdldFJlZkVudGl0eUxFbnRpdHlSZWZlcmVuY2VJRFRlcm1pbmFsUnVsZUNhbGxfMl8wXzEoKSk7IH0KKwkJCVJVTEVfSUQKKwkJCXsgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXREYXRhSW50ZXJjaGFuZ2VFeHBvc2VBY2Nlc3MoKS5nZXRSZWZFbnRpdHlMRW50aXR5UmVmZXJlbmNlSURUZXJtaW5hbFJ1bGVDYWxsXzJfMF8xKCkpOyB9CisJCSkKKwkJeyBhZnRlcihncmFtbWFyQWNjZXNzLmdldERhdGFJbnRlcmNoYW5nZUV4cG9zZUFjY2VzcygpLmdldFJlZkVudGl0eUxFbnRpdHlSZWZlcmVuY2VDcm9zc1JlZmVyZW5jZV8yXzAoKSk7IH0KKwkpCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKK3J1bGVfX0RhdGFJbnRlcmNoYW5nZUV4cG9zZV9fUmVmUHJvcGVydHlBc3NpZ25tZW50XzNfMF8xCisJQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworCX0KKzoKKwkoCisJCXsgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YUludGVyY2hhbmdlRXhwb3NlQWNjZXNzKCkuZ2V0UmVmUHJvcGVydHlMRW50aXR5QXR0cmlidXRlQ3Jvc3NSZWZlcmVuY2VfM18wXzFfMCgpKTsgfQorCQkoCisJCQl7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldERhdGFJbnRlcmNoYW5nZUV4cG9zZUFjY2VzcygpLmdldFJlZlByb3BlcnR5TEVudGl0eUF0dHJpYnV0ZUlEVGVybWluYWxSdWxlQ2FsbF8zXzBfMV8wXzEoKSk7IH0KKwkJCVJVTEVfSUQKKwkJCXsgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXREYXRhSW50ZXJjaGFuZ2VFeHBvc2VBY2Nlc3MoKS5nZXRSZWZQcm9wZXJ0eUxFbnRpdHlBdHRyaWJ1dGVJRFRlcm1pbmFsUnVsZUNhbGxfM18wXzFfMF8xKCkpOyB9CisJCSkKKwkJeyBhZnRlcihncmFtbWFyQWNjZXNzLmdldERhdGFJbnRlcmNoYW5nZUV4cG9zZUFjY2VzcygpLmdldFJlZlByb3BlcnR5TEVudGl0eUF0dHJpYnV0ZUNyb3NzUmVmZXJlbmNlXzNfMF8xXzAoKSk7IH0KKwkpCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKK3J1bGVfX0RhdGFJbnRlcmNoYW5nZUV4cG9zZV9fU3ViRXhwb3NlQXNzaWdubWVudF8zXzFfMgorCUBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKwl9Cis6CisJKAorCQl7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldERhdGFJbnRlcmNoYW5nZUV4cG9zZUFjY2VzcygpLmdldFN1YkV4cG9zZURhdGFJbnRlcmNoYW5nZUV4cG9zZVBhcnNlclJ1bGVDYWxsXzNfMV8yXzAoKSk7IH0KKwkJcnVsZURhdGFJbnRlcmNoYW5nZUV4cG9zZQorCQl7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YUludGVyY2hhbmdlRXhwb3NlQWNjZXNzKCkuZ2V0U3ViRXhwb3NlRGF0YUludGVyY2hhbmdlRXhwb3NlUGFyc2VyUnVsZUNhbGxfM18xXzJfMCgpKTsgfQorCSkKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworcnVsZV9fRGF0YUludGVyY2hhbmdlRXhwb3J0RmlsdGVyX19Db25kaXRpb25Bc3NpZ25tZW50XzFfMgorCUBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKwl9Cis6CisJKAorCQl7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldERhdGFJbnRlcmNoYW5nZUV4cG9ydEZpbHRlckFjY2VzcygpLmdldENvbmRpdGlvbkRhdGFJbnRlcmNoYW5nZUZpbHRlckNvbmRpdGlvblBhcnNlclJ1bGVDYWxsXzFfMl8wKCkpOyB9CisJCXJ1bGVEYXRhSW50ZXJjaGFuZ2VGaWx0ZXJDb25kaXRpb24KKwkJeyBhZnRlcihncmFtbWFyQWNjZXNzLmdldERhdGFJbnRlcmNoYW5nZUV4cG9ydEZpbHRlckFjY2VzcygpLmdldENvbmRpdGlvbkRhdGFJbnRlcmNoYW5nZUZpbHRlckNvbmRpdGlvblBhcnNlclJ1bGVDYWxsXzFfMl8wKCkpOyB9CisJKQorOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCitydWxlX19EYXRhSW50ZXJjaGFuZ2VFeHBvcnRGaWx0ZXJfX0hpZGRlbnByb3BlcnRpZXNBc3NpZ25tZW50XzJfMQorCUBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKwl9Cis6CisJKAorCQl7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldERhdGFJbnRlcmNoYW5nZUV4cG9ydEZpbHRlckFjY2VzcygpLmdldEhpZGRlbnByb3BlcnRpZXNEYXRhSW50ZXJjaGFuZ2VFeHBvcnRIaWRlUGFyc2VyUnVsZUNhbGxfMl8xXzAoKSk7IH0KKwkJcnVsZURhdGFJbnRlcmNoYW5nZUV4cG9ydEhpZGUKKwkJeyBhZnRlcihncmFtbWFyQWNjZXNzLmdldERhdGFJbnRlcmNoYW5nZUV4cG9ydEZpbHRlckFjY2VzcygpLmdldEhpZGRlbnByb3BlcnRpZXNEYXRhSW50ZXJjaGFuZ2VFeHBvcnRIaWRlUGFyc2VyUnVsZUNhbGxfMl8xXzAoKSk7IH0KKwkpCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKK3J1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbHRlckNvbmRpdGlvbl9fUmVmUHJvcGVydHlBc3NpZ25tZW50XzAKKwlAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisJfQorOgorCSgKKwkJeyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXREYXRhSW50ZXJjaGFuZ2VGaWx0ZXJDb25kaXRpb25BY2Nlc3MoKS5nZXRSZWZQcm9wZXJ0eUxFbnRpdHlGZWF0dXJlQ3Jvc3NSZWZlcmVuY2VfMF8wKCkpOyB9CisJCSgKKwkJCXsgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YUludGVyY2hhbmdlRmlsdGVyQ29uZGl0aW9uQWNjZXNzKCkuZ2V0UmVmUHJvcGVydHlMRW50aXR5RmVhdHVyZUlEVGVybWluYWxSdWxlQ2FsbF8wXzBfMSgpKTsgfQorCQkJUlVMRV9JRAorCQkJeyBhZnRlcihncmFtbWFyQWNjZXNzLmdldERhdGFJbnRlcmNoYW5nZUZpbHRlckNvbmRpdGlvbkFjY2VzcygpLmdldFJlZlByb3BlcnR5TEVudGl0eUZlYXR1cmVJRFRlcm1pbmFsUnVsZUNhbGxfMF8wXzEoKSk7IH0KKwkJKQorCQl7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YUludGVyY2hhbmdlRmlsdGVyQ29uZGl0aW9uQWNjZXNzKCkuZ2V0UmVmUHJvcGVydHlMRW50aXR5RmVhdHVyZUNyb3NzUmVmZXJlbmNlXzBfMCgpKTsgfQorCSkKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworcnVsZV9fRGF0YUludGVyY2hhbmdlRmlsdGVyQ29uZGl0aW9uX19PcGVyYXRvckFzc2lnbm1lbnRfMQorCUBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKwl9Cis6CisJKAorCQl7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldERhdGFJbnRlcmNoYW5nZUZpbHRlckNvbmRpdGlvbkFjY2VzcygpLmdldE9wZXJhdG9yQ29uZGl0aW9uQW5kT3BlcmF0b3IxRW51bVJ1bGVDYWxsXzFfMCgpKTsgfQorCQlydWxlQ29uZGl0aW9uQW5kT3BlcmF0b3IxCisJCXsgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXREYXRhSW50ZXJjaGFuZ2VGaWx0ZXJDb25kaXRpb25BY2Nlc3MoKS5nZXRPcGVyYXRvckNvbmRpdGlvbkFuZE9wZXJhdG9yMUVudW1SdWxlQ2FsbF8xXzAoKSk7IH0KKwkpCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKK3J1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbHRlckNvbmRpdGlvbl9fVmFsdWVBc3NpZ25tZW50XzIKKwlAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisJfQorOgorCSgKKwkJeyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXREYXRhSW50ZXJjaGFuZ2VGaWx0ZXJDb25kaXRpb25BY2Nlc3MoKS5nZXRWYWx1ZVNUUklOR1Rlcm1pbmFsUnVsZUNhbGxfMl8wKCkpOyB9CisJCVJVTEVfU1RSSU5HCisJCXsgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXREYXRhSW50ZXJjaGFuZ2VGaWx0ZXJDb25kaXRpb25BY2Nlc3MoKS5nZXRWYWx1ZVNUUklOR1Rlcm1pbmFsUnVsZUNhbGxfMl8wKCkpOyB9CisJKQorOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCitydWxlX19EYXRhSW50ZXJjaGFuZ2VGaWx0ZXJDb25kaXRpb25fX09wZXJhdG9yMkFzc2lnbm1lbnRfM18wCisJQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworCX0KKzoKKwkoCisJCXsgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YUludGVyY2hhbmdlRmlsdGVyQ29uZGl0aW9uQWNjZXNzKCkuZ2V0T3BlcmF0b3IyQ29uZGl0aW9uQW5kT3BlcmF0b3IyRW51bVJ1bGVDYWxsXzNfMF8wKCkpOyB9CisJCXJ1bGVDb25kaXRpb25BbmRPcGVyYXRvcjIKKwkJeyBhZnRlcihncmFtbWFyQWNjZXNzLmdldERhdGFJbnRlcmNoYW5nZUZpbHRlckNvbmRpdGlvbkFjY2VzcygpLmdldE9wZXJhdG9yMkNvbmRpdGlvbkFuZE9wZXJhdG9yMkVudW1SdWxlQ2FsbF8zXzBfMCgpKTsgfQorCSkKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworcnVsZV9fRGF0YUludGVyY2hhbmdlRmlsdGVyQ29uZGl0aW9uX19TdWJjb25kaXRpb25Bc3NpZ25tZW50XzNfMQorCUBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKwl9Cis6CisJKAorCQl7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldERhdGFJbnRlcmNoYW5nZUZpbHRlckNvbmRpdGlvbkFjY2VzcygpLmdldFN1YmNvbmRpdGlvbkRhdGFJbnRlcmNoYW5nZUZpbHRlckNvbmRpdGlvblBhcnNlclJ1bGVDYWxsXzNfMV8wKCkpOyB9CisJCXJ1bGVEYXRhSW50ZXJjaGFuZ2VGaWx0ZXJDb25kaXRpb24KKwkJeyBhZnRlcihncmFtbWFyQWNjZXNzLmdldERhdGFJbnRlcmNoYW5nZUZpbHRlckNvbmRpdGlvbkFjY2VzcygpLmdldFN1YmNvbmRpdGlvbkRhdGFJbnRlcmNoYW5nZUZpbHRlckNvbmRpdGlvblBhcnNlclJ1bGVDYWxsXzNfMV8wKCkpOyB9CisJKQorOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCitydWxlX19EYXRhSW50ZXJjaGFuZ2VFeHBvcnRIaWRlX19Qcm9wZXJ0eUFzc2lnbm1lbnRfMQorCUBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKwl9Cis6CisJKAorCQl7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldERhdGFJbnRlcmNoYW5nZUV4cG9ydEhpZGVBY2Nlc3MoKS5nZXRQcm9wZXJ0eUxFbnRpdHlGZWF0dXJlQ3Jvc3NSZWZlcmVuY2VfMV8wKCkpOyB9CisJCSgKKwkJCXsgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YUludGVyY2hhbmdlRXhwb3J0SGlkZUFjY2VzcygpLmdldFByb3BlcnR5TEVudGl0eUZlYXR1cmVJRFRlcm1pbmFsUnVsZUNhbGxfMV8wXzEoKSk7IH0KKwkJCVJVTEVfSUQKKwkJCXsgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXREYXRhSW50ZXJjaGFuZ2VFeHBvcnRIaWRlQWNjZXNzKCkuZ2V0UHJvcGVydHlMRW50aXR5RmVhdHVyZUlEVGVybWluYWxSdWxlQ2FsbF8xXzBfMSgpKTsgfQorCQkpCisJCXsgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXREYXRhSW50ZXJjaGFuZ2VFeHBvcnRIaWRlQWNjZXNzKCkuZ2V0UHJvcGVydHlMRW50aXR5RmVhdHVyZUNyb3NzUmVmZXJlbmNlXzFfMCgpKTsgfQorCSkKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKwogcnVsZV9fRGF0YUludGVyY2hhbmdlUHJlZGVmaW5lZEV4cHJlc3Npb25fX1RhcmdldFByb3BlcnR5QXNzaWdubWVudF8yCiAJQGluaXQgewogCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5kYXRhaW50ZXJjaGFuZ2UuaWRlL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9kYXRhaW50ZXJjaGFuZ2UvaWRlL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxEYXRhRFNMLnRva2VucyBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQuZGF0YWludGVyY2hhbmdlLmlkZS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvZGF0YWludGVyY2hhbmdlL2lkZS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsRGF0YURTTC50b2tlbnMKaW5kZXggYTk2NTMyYi4uMjI4OGNhNSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5kYXRhaW50ZXJjaGFuZ2UuaWRlL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9kYXRhaW50ZXJjaGFuZ2UvaWRlL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxEYXRhRFNMLnRva2VucworKysgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmRhdGFpbnRlcmNoYW5nZS5pZGUvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2RhdGFpbnRlcmNoYW5nZS9pZGUvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbERhdGFEU0wudG9rZW5zCkBAIC0xLDIwICsxLDIwIEBACiAnISc9NDAKICchPSc9MjIKICchPT0nPTI0Ci0nIyc9MTE3CisnIyc9MTI3CiAnJSc9MzkKICclPSc9MjAKICcmJic9MTUKLScmJz0xMzgKLScoJz0xMTMKLScpJz0xMTQKKycmJz0xNDgKKycoJz0xMjMKKycpJz0xMjQKICcqJz0zNgogJyoqJz0zNwogJyo9Jz0xOAogJysnPTM0CiAnKysnPTQxCiAnKz0nPTE2Ci0nLCc9MTE1CisnLCc9MTI1CiAnLSc9MzUKICctLSc9NDIKICctPSc9MTcKQEAgLTI0LDEwICsyNCwxMSBAQAogJy4uPCc9MjkKICcvJz0zOAogJy89Jz0xOQotJzonPTEyMwotJzo6Jz0xNTAKLSc7Jz0xMTEKKyc6Jz0xMzMKKyc6Oic9MTYyCisnOyc9MTIxCiAnPCc9MjcKKyc8PSc9NjgKICc8Pic9MzIKICc9Jz0xMwogJz09Jz0yMQpAQCAtMzUsMTMgKzM2LDEzIEBACiAnPT4nPTMxCiAnPic9MjYKICc+PSc9MjUKLSc/Jz0xMzcKLSc/Lic9MTUxCisnPyc9MTQ3CisnPy4nPTE2MwogJz86Jz0zMwotJ0AnPTExMgotJ0NTVic9ODAKKydAJz0xMjIKKydDU1YnPTg1CiAnRGF0ZSc9NjAKLSdFREknPTg0CisnRURJJz04OQogJ0V4ZWN1dGVDb250ZXh0Jz02NAogJ01pbGxpc2Vjb25kcyc9NjEKICdOYW5vc2Vjb25kcyc9NjIKQEAgLTQ5LDk3ICs1MCwxMDggQEAKICdSYW5kb20nPTYzCiAnU3RhcnREYXRlJz01OAogJ1VuaXZlcnNhbGx5VW5pcXVlSWRlbnRpZmllcic9NTkKLSdYTUwnPTc3Ci0nWyc9MTE4Ci0nXSc9MTE2Ci0nYWxsb3dOb1Jlc3VsdCc9MTQ2Ci0nYWxsb3dOb251bmlxdWVSZXN1bHQnPTE0NwotJ2FzJz0xMDYKLSdhc3NpZ24nPTEwNQotJ2NhY2hlU2l6ZSc9MTQ1Ci0nY2FzZSc9MTI1Ci0nY2F0Y2gnPTEzNgotJ2NvZGluZyc9MTAxCi0nY29weSc9MTAyCi0nY3JlYXRlT24nPTg4Ci0nZGVmYXVsdCc9MTI0Ci0nZGVsaW1pdGVyJz04MQotJ2Rlc2NyaWJlZEJ5Jz0xMzkKLSdkbyc9MTI3Ci0nZWxlbWVudFNpemUnPTc2Ci0nZWxzZSc9MTIxCi0nZW5jb2RpbmcnPTc4Ci0nZW50aXR5Jz04NgotJ2V4cHJlc3Npb24nPTg5CisnWE1MJz04MgorJ1snPTEyOAorJ10nPTEyNgorJ2FsbG93Tm9SZXN1bHQnPTE1OAorJ2FsbG93Tm9udW5pcXVlUmVzdWx0Jz0xNTkKKydhbmQnPTcxCisnYXMnPTExNgorJ2Fzc2lnbic9MTE1CisnY2FjaGVTaXplJz0xNTcKKydjYXNlJz0xMzUKKydjYXRjaCc9MTQ2CisnY29kaW5nJz0xMDgKKydjb3B5Jz0xMDkKKydjcmVhdGVPbic9OTMKKydkZWZhdWx0Jz0xMzQKKydkZWxldGVGaWxlQWZ0ZXJJbXBvcnQnPTE1MQorJ2RlbGltaXRlcic9ODYKKydkZXNjcmliZWRCeSc9MTQ5CisnZG8nPTEzNworJ2VsZW1lbnRTaXplJz04MQorJ2Vsc2UnPTEzMQorJ2VuY29kaW5nJz04MworJ2VudGl0eSc9OTEKKydleHBvcnRGaWx0ZXInPTEwMAorJ2V4cG9zZSc9OTcKKydleHByZXNzaW9uJz05NAogJ2V4dGVuZHMnPTQ1CiAnZXh0ZW5zaW9uJz00OAogJ2ZhbHNlJz01MAotJ2ZpbGUnPTczCi0nZmluYWxseSc9MTM0Ci0nZm9yJz05NQotJ2Zvcm1hdCc9OTEKLSdmcm9tJz0xMDMKLSdpZic9MTIwCisnZmlsZSc9NzgKKydmaW5hbGx5Jz0xNDQKKydmb3InPTEwMgorJ2Zvcm1hdCc9OTYKKydmcm9tJz0xMTAKKydoaWRlJz0xMTQKKydpZic9MTMwCiAnaW1wb3J0Jz00NwotJ2luZGVudCc9MTQyCi0naW5zdGFuY2VvZic9MTE5Ci0naW50ZXJjaGFuZ2UnPTcyCisnaW5kZW50Jz0xNTMKKydpbnN0YW5jZW9mJz0xMjkKKydpbnRlcmNoYW5nZSc9NzcKKydpc25vdG51bGwnPTcwCisnaXNudWxsJz02OQogJ2pwZyc9NTIKLSdrZXknPTk0Ci0na2V5cyc9OTMKLSdsb2NhbGUnPTc5Ci0nbG9va3VwJz05MAotJ21hcCc9MTA3Ci0nbWFwQmxvYic9MTA5Ci0nbWFwQnlBdHRyaWJ1dGUnPTE0MQotJ21hcFRvJz05OAotJ21hcHBpbmcnPTkyCi0nbWFwcGluZ01vZGVsJz04NQotJ21hcmtlZEJ5Jz0xNDgKLSdtYXJrZXInPTE0NAotJ21hcmtlckVudGl0eSc9MTAwCi0nbWFya2VyUGF0aCc9OTkKKydrZXknPTEwMQorJ2tleXMnPTk5CisnbGF0ZXN0RXhwb3J0Jz0xNTYKKydsYXRlc3RJbXBvcnQnPTE1NQorJ2xvY2FsZSc9ODQKKydsb29rdXAnPTk1CisnbWFwJz0xMTcKKydtYXBCbG9iJz0xMTkKKydtYXBCeUF0dHJpYnV0ZSc9MTUyCisnbWFwVG8nPTEwNQorJ21hcHBpbmcnPTk4CisnbWFwcGluZ01vZGVsJz05MAorJ21hcmtlZEJ5Jz0xNjAKKydtYXJrZXJFbnRpdHknPTEwNworJ21hcmtlclBhdGgnPTEwNgogJ21lcmdlJz02NgotJ21pbWVUeXBlJz0xMTAKKydtaW1lVHlwZSc9MTIwCiAnbXBlZyc9NTQKLSduZXcnPTEyOAotJ25vZGVOYW1lJz04NwotJ25zJz0xNDkKLSdudWxsJz0xMjkKKyduZXcnPTEzOAorJ25vZGVOYW1lJz05MgorJ25zJz0xNjEKKydudWxsJz0xMzkKICdvY3RldC1zdHJlYW0nPTU1Ci0nb24nPTk2Ci0ncGFja2FnZSc9NjgKLSdwYXRoJz03NAorJ29uJz0xMDMKKydvcic9NzIKKydwYWNrYWdlJz03MworJ3BhdGgnPTc5CiAncGRmJz01NgogJ3BlcnNpc3QnPTY1CiAncGxhaW4nPTUxCiAncG5nJz01MwotJ3Byb3BlcnR5Jz0xMDQKLSdxdW90ZUNoYXJhY3Rlcic9ODIKKydwcm9wZXJ0eSc9MTExCisncXVvdGVDaGFyYWN0ZXInPTg3CisncmVmJz0xMTIKICdyZW1vdmUnPTY3Ci0ncmVwb3J0Jz0xNDAKLSdyZXR1cm4nPTEzMgotJ3NraXBMaW5lcyc9ODMKKydyZXBvcnQnPTE1MAorJ3JldHVybic9MTQyCisnc2tpcExpbmVzJz04OAogJ3N0YXRpYyc9NDYKICdzdXBlcic9NDkKLSdzd2l0Y2gnPTEyMgotJ3N5bmNocm9uaXplZCc9MTM1Ci0ndGhyb3cnPTEzMQotJ3RpdGxlJz02OQotJ3RvJz0xMDgKLSd0cnVlJz0xNTQKLSd0cnknPTEzMwotJ3R5cGVvZic9MTMwCisnc3dpdGNoJz0xMzIKKydzeW5jaHJvbml6ZWQnPTE0NQorJ3Rocm93Jz0xNDEKKyd0aXRsZSc9NzQKKyd0byc9MTE4CisndHJ1ZSc9MTY2CisndHJ5Jz0xNDMKKyd0eXBlb2YnPTE0MAogJ3ZhbCc9NDQKLSd2YWxpZGF0ZSc9MTQzCi0ndmFyJz0xNTMKLSd2ZWN0b3JOYW1lJz03NQotJ3doaWxlJz0xMjYKLSd3aXRoJz05NwotJ3snPTcwCi0nfCc9MTUyCisndmFsaWRhdGUnPTE1NAorJ3Zhcic9MTY1CisndmVjdG9yTmFtZSc9ODAKKyd3aGVyZSc9MTEzCisnd2hpbGUnPTEzNgorJ3dpdGgnPTEwNAorJ3snPTc1CisnfCc9MTY0CiAnfHwnPTE0Ci0nfSc9NzEKKyd9Jz03NgogUlVMRV9BTllfT1RIRVI9MTIKIFJVTEVfREVDSU1BTD04CiBSVUxFX0hFWD02CkBAIC0yMDYsNyArMjE4LDE5IEBACiBUX18xNTI9MTUyCiBUX18xNTM9MTUzCiBUX18xNTQ9MTU0CitUX18xNTU9MTU1CitUX18xNTY9MTU2CitUX18xNTc9MTU3CitUX18xNTg9MTU4CitUX18xNTk9MTU5CiBUX18xNT0xNQorVF9fMTYwPTE2MAorVF9fMTYxPTE2MQorVF9fMTYyPTE2MgorVF9fMTYzPTE2MworVF9fMTY0PTE2NAorVF9fMTY1PTE2NQorVF9fMTY2PTE2NgogVF9fMTY9MTYKIFRfXzE3PTE3CiBUX18xOD0xOApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5kYXRhaW50ZXJjaGFuZ2UuaWRlL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9kYXRhaW50ZXJjaGFuZ2UvaWRlL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxEYXRhRFNMTGV4ZXIuamF2YSBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQuZGF0YWludGVyY2hhbmdlLmlkZS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvZGF0YWludGVyY2hhbmdlL2lkZS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsRGF0YURTTExleGVyLmphdmEKaW5kZXggMmVjOWYzMy4uYTdmZGZlZiAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5kYXRhaW50ZXJjaGFuZ2UuaWRlL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9kYXRhaW50ZXJjaGFuZ2UvaWRlL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxEYXRhRFNMTGV4ZXIuamF2YQorKysgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmRhdGFpbnRlcmNoYW5nZS5pZGUvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2RhdGFpbnRlcmNoYW5nZS9pZGUvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbERhdGFEU0xMZXhlci5qYXZhCkBAIC01OCw2ICs1OCwxMyBAQAogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzEyOD0xMjg7CiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fNjU9NjU7CiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fMTI3PTEyNzsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX18xNjY9MTY2OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzE2NT0xNjU7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fMTYyPTE2MjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX18xNjE9MTYxOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzE2ND0xNjQ7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fMTYzPTE2MzsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX18xNjA9MTYwOwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzM3PTM3OwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzM4PTM4OwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzM5PTM5OwpAQCAtNjUsMTAgKzcyLDE1IEBACiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fMzQ9MzQ7CiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fMzU9MzU7CiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fMzY9MzY7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fMTU5PTE1OTsKICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX18zMD0zMDsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX18xNTg9MTU4OwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzMxPTMxOwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzMyPTMyOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzE1NT0xNTU7CiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fMTU0PTE1NDsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX18xNTc9MTU3OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzE1Nj0xNTY7CiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fMTUxPTE1MTsKICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX18xNTA9MTUwOwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzE1Mz0xNTM7CkBAIC0xMzI4LDEwICsxMzQwLDEwIEBACiAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICBpbnQgX3R5cGUgPSBUX182ODsKICAgICAgICAgICAgIGludCBfY2hhbm5lbCA9IERFRkFVTFRfVE9LRU5fQ0hBTk5FTDsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjY2Ojc6ICggJ3BhY2thZ2UnICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjY2Ojk6ICdwYWNrYWdlJworICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NjY6NzogKCAnPD0nICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjY2Ojk6ICc8PScKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIG1hdGNoKCJwYWNrYWdlIik7IAorICAgICAgICAgICAgbWF0Y2goIjw9Iik7IAogCiAKICAgICAgICAgICAgIH0KQEAgLTEzNDksMTAgKzEzNjEsMTAgQEAKICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgIGludCBfdHlwZSA9IFRfXzY5OwogICAgICAgICAgICAgaW50IF9jaGFubmVsID0gREVGQVVMVF9UT0tFTl9DSEFOTkVMOwotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6Njc6NzogKCAndGl0bGUnICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjY3Ojk6ICd0aXRsZScKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjY3Ojc6ICggJ2lzbnVsbCcgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6Njc6OTogJ2lzbnVsbCcKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIG1hdGNoKCJ0aXRsZSIpOyAKKyAgICAgICAgICAgIG1hdGNoKCJpc251bGwiKTsgCiAKIAogICAgICAgICAgICAgfQpAQCAtMTM3MCwxMCArMTM4MiwxMSBAQAogICAgICAgICB0cnkgewogICAgICAgICAgICAgaW50IF90eXBlID0gVF9fNzA7CiAgICAgICAgICAgICBpbnQgX2NoYW5uZWwgPSBERUZBVUxUX1RPS0VOX0NIQU5ORUw7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo2ODo3OiAoICd7JyApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo2ODo5OiAneycKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjY4Ojc6ICggJ2lzbm90bnVsbCcgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6Njg6OTogJ2lzbm90bnVsbCcKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIG1hdGNoKCd7Jyk7IAorICAgICAgICAgICAgbWF0Y2goImlzbm90bnVsbCIpOyAKKwogCiAgICAgICAgICAgICB9CiAKQEAgLTEzOTAsMTAgKzE0MDMsMTEgQEAKICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgIGludCBfdHlwZSA9IFRfXzcxOwogICAgICAgICAgICAgaW50IF9jaGFubmVsID0gREVGQVVMVF9UT0tFTl9DSEFOTkVMOwotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6Njk6NzogKCAnfScgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6Njk6OTogJ30nCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo2OTo3OiAoICdhbmQnICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjY5Ojk6ICdhbmQnCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICBtYXRjaCgnfScpOyAKKyAgICAgICAgICAgIG1hdGNoKCJhbmQiKTsgCisKIAogICAgICAgICAgICAgfQogCkBAIC0xNDEwLDEwICsxNDI0LDEwIEBACiAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICBpbnQgX3R5cGUgPSBUX183MjsKICAgICAgICAgICAgIGludCBfY2hhbm5lbCA9IERFRkFVTFRfVE9LRU5fQ0hBTk5FTDsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjcwOjc6ICggJ2ludGVyY2hhbmdlJyApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo3MDo5OiAnaW50ZXJjaGFuZ2UnCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo3MDo3OiAoICdvcicgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NzA6OTogJ29yJwogICAgICAgICAgICAgewotICAgICAgICAgICAgbWF0Y2goImludGVyY2hhbmdlIik7IAorICAgICAgICAgICAgbWF0Y2goIm9yIik7IAogCiAKICAgICAgICAgICAgIH0KQEAgLTE0MzEsMTAgKzE0NDUsMTAgQEAKICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgIGludCBfdHlwZSA9IFRfXzczOwogICAgICAgICAgICAgaW50IF9jaGFubmVsID0gREVGQVVMVF9UT0tFTl9DSEFOTkVMOwotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NzE6NzogKCAnZmlsZScgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NzE6OTogJ2ZpbGUnCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo3MTo3OiAoICdwYWNrYWdlJyApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo3MTo5OiAncGFja2FnZScKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIG1hdGNoKCJmaWxlIik7IAorICAgICAgICAgICAgbWF0Y2goInBhY2thZ2UiKTsgCiAKIAogICAgICAgICAgICAgfQpAQCAtMTQ1MiwxMCArMTQ2NiwxMCBAQAogICAgICAgICB0cnkgewogICAgICAgICAgICAgaW50IF90eXBlID0gVF9fNzQ7CiAgICAgICAgICAgICBpbnQgX2NoYW5uZWwgPSBERUZBVUxUX1RPS0VOX0NIQU5ORUw7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo3Mjo3OiAoICdwYXRoJyApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo3Mjo5OiAncGF0aCcKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjcyOjc6ICggJ3RpdGxlJyApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo3Mjo5OiAndGl0bGUnCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICBtYXRjaCgicGF0aCIpOyAKKyAgICAgICAgICAgIG1hdGNoKCJ0aXRsZSIpOyAKIAogCiAgICAgICAgICAgICB9CkBAIC0xNDczLDExICsxNDg3LDEwIEBACiAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICBpbnQgX3R5cGUgPSBUX183NTsKICAgICAgICAgICAgIGludCBfY2hhbm5lbCA9IERFRkFVTFRfVE9LRU5fQ0hBTk5FTDsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjczOjc6ICggJ3ZlY3Rvck5hbWUnICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjczOjk6ICd2ZWN0b3JOYW1lJworICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NzM6NzogKCAneycgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NzM6OTogJ3snCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICBtYXRjaCgidmVjdG9yTmFtZSIpOyAKLQorICAgICAgICAgICAgbWF0Y2goJ3snKTsgCiAKICAgICAgICAgICAgIH0KIApAQCAtMTQ5NCwxMSArMTUwNywxMCBAQAogICAgICAgICB0cnkgewogICAgICAgICAgICAgaW50IF90eXBlID0gVF9fNzY7CiAgICAgICAgICAgICBpbnQgX2NoYW5uZWwgPSBERUZBVUxUX1RPS0VOX0NIQU5ORUw7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo3NDo3OiAoICdlbGVtZW50U2l6ZScgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NzQ6OTogJ2VsZW1lbnRTaXplJworICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NzQ6NzogKCAnfScgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NzQ6OTogJ30nCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICBtYXRjaCgiZWxlbWVudFNpemUiKTsgCi0KKyAgICAgICAgICAgIG1hdGNoKCd9Jyk7IAogCiAgICAgICAgICAgICB9CiAKQEAgLTE1MTUsMTAgKzE1MjcsMTAgQEAKICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgIGludCBfdHlwZSA9IFRfXzc3OwogICAgICAgICAgICAgaW50IF9jaGFubmVsID0gREVGQVVMVF9UT0tFTl9DSEFOTkVMOwotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NzU6NzogKCAnWE1MJyApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo3NTo5OiAnWE1MJworICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NzU6NzogKCAnaW50ZXJjaGFuZ2UnICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjc1Ojk6ICdpbnRlcmNoYW5nZScKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIG1hdGNoKCJYTUwiKTsgCisgICAgICAgICAgICBtYXRjaCgiaW50ZXJjaGFuZ2UiKTsgCiAKIAogICAgICAgICAgICAgfQpAQCAtMTUzNiwxMCArMTU0OCwxMCBAQAogICAgICAgICB0cnkgewogICAgICAgICAgICAgaW50IF90eXBlID0gVF9fNzg7CiAgICAgICAgICAgICBpbnQgX2NoYW5uZWwgPSBERUZBVUxUX1RPS0VOX0NIQU5ORUw7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo3Njo3OiAoICdlbmNvZGluZycgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NzY6OTogJ2VuY29kaW5nJworICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NzY6NzogKCAnZmlsZScgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NzY6OTogJ2ZpbGUnCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICBtYXRjaCgiZW5jb2RpbmciKTsgCisgICAgICAgICAgICBtYXRjaCgiZmlsZSIpOyAKIAogCiAgICAgICAgICAgICB9CkBAIC0xNTU3LDEwICsxNTY5LDEwIEBACiAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICBpbnQgX3R5cGUgPSBUX183OTsKICAgICAgICAgICAgIGludCBfY2hhbm5lbCA9IERFRkFVTFRfVE9LRU5fQ0hBTk5FTDsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjc3Ojc6ICggJ2xvY2FsZScgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6Nzc6OTogJ2xvY2FsZScKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjc3Ojc6ICggJ3BhdGgnICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjc3Ojk6ICdwYXRoJwogICAgICAgICAgICAgewotICAgICAgICAgICAgbWF0Y2goImxvY2FsZSIpOyAKKyAgICAgICAgICAgIG1hdGNoKCJwYXRoIik7IAogCiAKICAgICAgICAgICAgIH0KQEAgLTE1NzgsMTAgKzE1OTAsMTAgQEAKICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgIGludCBfdHlwZSA9IFRfXzgwOwogICAgICAgICAgICAgaW50IF9jaGFubmVsID0gREVGQVVMVF9UT0tFTl9DSEFOTkVMOwotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6Nzg6NzogKCAnQ1NWJyApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo3ODo5OiAnQ1NWJworICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6Nzg6NzogKCAndmVjdG9yTmFtZScgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6Nzg6OTogJ3ZlY3Rvck5hbWUnCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICBtYXRjaCgiQ1NWIik7IAorICAgICAgICAgICAgbWF0Y2goInZlY3Rvck5hbWUiKTsgCiAKIAogICAgICAgICAgICAgfQpAQCAtMTU5OSwxMCArMTYxMSwxMCBAQAogICAgICAgICB0cnkgewogICAgICAgICAgICAgaW50IF90eXBlID0gVF9fODE7CiAgICAgICAgICAgICBpbnQgX2NoYW5uZWwgPSBERUZBVUxUX1RPS0VOX0NIQU5ORUw7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo3OTo3OiAoICdkZWxpbWl0ZXInICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjc5Ojk6ICdkZWxpbWl0ZXInCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo3OTo3OiAoICdlbGVtZW50U2l6ZScgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6Nzk6OTogJ2VsZW1lbnRTaXplJwogICAgICAgICAgICAgewotICAgICAgICAgICAgbWF0Y2goImRlbGltaXRlciIpOyAKKyAgICAgICAgICAgIG1hdGNoKCJlbGVtZW50U2l6ZSIpOyAKIAogCiAgICAgICAgICAgICB9CkBAIC0xNjIwLDEwICsxNjMyLDEwIEBACiAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICBpbnQgX3R5cGUgPSBUX184MjsKICAgICAgICAgICAgIGludCBfY2hhbm5lbCA9IERFRkFVTFRfVE9LRU5fQ0hBTk5FTDsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjgwOjc6ICggJ3F1b3RlQ2hhcmFjdGVyJyApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo4MDo5OiAncXVvdGVDaGFyYWN0ZXInCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo4MDo3OiAoICdYTUwnICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjgwOjk6ICdYTUwnCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICBtYXRjaCgicXVvdGVDaGFyYWN0ZXIiKTsgCisgICAgICAgICAgICBtYXRjaCgiWE1MIik7IAogCiAKICAgICAgICAgICAgIH0KQEAgLTE2NDEsMTAgKzE2NTMsMTAgQEAKICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgIGludCBfdHlwZSA9IFRfXzgzOwogICAgICAgICAgICAgaW50IF9jaGFubmVsID0gREVGQVVMVF9UT0tFTl9DSEFOTkVMOwotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6ODE6NzogKCAnc2tpcExpbmVzJyApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo4MTo5OiAnc2tpcExpbmVzJworICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6ODE6NzogKCAnZW5jb2RpbmcnICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjgxOjk6ICdlbmNvZGluZycKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIG1hdGNoKCJza2lwTGluZXMiKTsgCisgICAgICAgICAgICBtYXRjaCgiZW5jb2RpbmciKTsgCiAKIAogICAgICAgICAgICAgfQpAQCAtMTY2MiwxMCArMTY3NCwxMCBAQAogICAgICAgICB0cnkgewogICAgICAgICAgICAgaW50IF90eXBlID0gVF9fODQ7CiAgICAgICAgICAgICBpbnQgX2NoYW5uZWwgPSBERUZBVUxUX1RPS0VOX0NIQU5ORUw7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo4Mjo3OiAoICdFREknICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjgyOjk6ICdFREknCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo4Mjo3OiAoICdsb2NhbGUnICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjgyOjk6ICdsb2NhbGUnCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICBtYXRjaCgiRURJIik7IAorICAgICAgICAgICAgbWF0Y2goImxvY2FsZSIpOyAKIAogCiAgICAgICAgICAgICB9CkBAIC0xNjgzLDEwICsxNjk1LDEwIEBACiAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICBpbnQgX3R5cGUgPSBUX184NTsKICAgICAgICAgICAgIGludCBfY2hhbm5lbCA9IERFRkFVTFRfVE9LRU5fQ0hBTk5FTDsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjgzOjc6ICggJ21hcHBpbmdNb2RlbCcgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6ODM6OTogJ21hcHBpbmdNb2RlbCcKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjgzOjc6ICggJ0NTVicgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6ODM6OTogJ0NTVicKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIG1hdGNoKCJtYXBwaW5nTW9kZWwiKTsgCisgICAgICAgICAgICBtYXRjaCgiQ1NWIik7IAogCiAKICAgICAgICAgICAgIH0KQEAgLTE3MDQsMTAgKzE3MTYsMTAgQEAKICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgIGludCBfdHlwZSA9IFRfXzg2OwogICAgICAgICAgICAgaW50IF9jaGFubmVsID0gREVGQVVMVF9UT0tFTl9DSEFOTkVMOwotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6ODQ6NzogKCAnZW50aXR5JyApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo4NDo5OiAnZW50aXR5JworICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6ODQ6NzogKCAnZGVsaW1pdGVyJyApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo4NDo5OiAnZGVsaW1pdGVyJwogICAgICAgICAgICAgewotICAgICAgICAgICAgbWF0Y2goImVudGl0eSIpOyAKKyAgICAgICAgICAgIG1hdGNoKCJkZWxpbWl0ZXIiKTsgCiAKIAogICAgICAgICAgICAgfQpAQCAtMTcyNSwxMCArMTczNywxMCBAQAogICAgICAgICB0cnkgewogICAgICAgICAgICAgaW50IF90eXBlID0gVF9fODc7CiAgICAgICAgICAgICBpbnQgX2NoYW5uZWwgPSBERUZBVUxUX1RPS0VOX0NIQU5ORUw7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo4NTo3OiAoICdub2RlTmFtZScgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6ODU6OTogJ25vZGVOYW1lJworICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6ODU6NzogKCAncXVvdGVDaGFyYWN0ZXInICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjg1Ojk6ICdxdW90ZUNoYXJhY3RlcicKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIG1hdGNoKCJub2RlTmFtZSIpOyAKKyAgICAgICAgICAgIG1hdGNoKCJxdW90ZUNoYXJhY3RlciIpOyAKIAogCiAgICAgICAgICAgICB9CkBAIC0xNzQ2LDEwICsxNzU4LDEwIEBACiAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICBpbnQgX3R5cGUgPSBUX184ODsKICAgICAgICAgICAgIGludCBfY2hhbm5lbCA9IERFRkFVTFRfVE9LRU5fQ0hBTk5FTDsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjg2Ojc6ICggJ2NyZWF0ZU9uJyApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo4Njo5OiAnY3JlYXRlT24nCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo4Njo3OiAoICdza2lwTGluZXMnICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjg2Ojk6ICdza2lwTGluZXMnCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICBtYXRjaCgiY3JlYXRlT24iKTsgCisgICAgICAgICAgICBtYXRjaCgic2tpcExpbmVzIik7IAogCiAKICAgICAgICAgICAgIH0KQEAgLTE3NjcsMTAgKzE3NzksMTAgQEAKICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgIGludCBfdHlwZSA9IFRfXzg5OwogICAgICAgICAgICAgaW50IF9jaGFubmVsID0gREVGQVVMVF9UT0tFTl9DSEFOTkVMOwotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6ODc6NzogKCAnZXhwcmVzc2lvbicgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6ODc6OTogJ2V4cHJlc3Npb24nCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo4Nzo3OiAoICdFREknICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjg3Ojk6ICdFREknCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICBtYXRjaCgiZXhwcmVzc2lvbiIpOyAKKyAgICAgICAgICAgIG1hdGNoKCJFREkiKTsgCiAKIAogICAgICAgICAgICAgfQpAQCAtMTc4OCwxMCArMTgwMCwxMCBAQAogICAgICAgICB0cnkgewogICAgICAgICAgICAgaW50IF90eXBlID0gVF9fOTA7CiAgICAgICAgICAgICBpbnQgX2NoYW5uZWwgPSBERUZBVUxUX1RPS0VOX0NIQU5ORUw7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo4ODo3OiAoICdsb29rdXAnICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjg4Ojk6ICdsb29rdXAnCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo4ODo3OiAoICdtYXBwaW5nTW9kZWwnICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjg4Ojk6ICdtYXBwaW5nTW9kZWwnCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICBtYXRjaCgibG9va3VwIik7IAorICAgICAgICAgICAgbWF0Y2goIm1hcHBpbmdNb2RlbCIpOyAKIAogCiAgICAgICAgICAgICB9CkBAIC0xODA5LDEwICsxODIxLDEwIEBACiAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICBpbnQgX3R5cGUgPSBUX185MTsKICAgICAgICAgICAgIGludCBfY2hhbm5lbCA9IERFRkFVTFRfVE9LRU5fQ0hBTk5FTDsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjg5Ojc6ICggJ2Zvcm1hdCcgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6ODk6OTogJ2Zvcm1hdCcKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjg5Ojc6ICggJ2VudGl0eScgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6ODk6OTogJ2VudGl0eScKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIG1hdGNoKCJmb3JtYXQiKTsgCisgICAgICAgICAgICBtYXRjaCgiZW50aXR5Iik7IAogCiAKICAgICAgICAgICAgIH0KQEAgLTE4MzAsMTAgKzE4NDIsMTAgQEAKICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgIGludCBfdHlwZSA9IFRfXzkyOwogICAgICAgICAgICAgaW50IF9jaGFubmVsID0gREVGQVVMVF9UT0tFTl9DSEFOTkVMOwotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6OTA6NzogKCAnbWFwcGluZycgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6OTA6OTogJ21hcHBpbmcnCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo5MDo3OiAoICdub2RlTmFtZScgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6OTA6OTogJ25vZGVOYW1lJwogICAgICAgICAgICAgewotICAgICAgICAgICAgbWF0Y2goIm1hcHBpbmciKTsgCisgICAgICAgICAgICBtYXRjaCgibm9kZU5hbWUiKTsgCiAKIAogICAgICAgICAgICAgfQpAQCAtMTg1MSwxMCArMTg2MywxMCBAQAogICAgICAgICB0cnkgewogICAgICAgICAgICAgaW50IF90eXBlID0gVF9fOTM7CiAgICAgICAgICAgICBpbnQgX2NoYW5uZWwgPSBERUZBVUxUX1RPS0VOX0NIQU5ORUw7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo5MTo3OiAoICdrZXlzJyApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo5MTo5OiAna2V5cycKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjkxOjc6ICggJ2NyZWF0ZU9uJyApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo5MTo5OiAnY3JlYXRlT24nCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICBtYXRjaCgia2V5cyIpOyAKKyAgICAgICAgICAgIG1hdGNoKCJjcmVhdGVPbiIpOyAKIAogCiAgICAgICAgICAgICB9CkBAIC0xODcyLDEwICsxODg0LDEwIEBACiAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICBpbnQgX3R5cGUgPSBUX185NDsKICAgICAgICAgICAgIGludCBfY2hhbm5lbCA9IERFRkFVTFRfVE9LRU5fQ0hBTk5FTDsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjkyOjc6ICggJ2tleScgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6OTI6OTogJ2tleScKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjkyOjc6ICggJ2V4cHJlc3Npb24nICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjkyOjk6ICdleHByZXNzaW9uJwogICAgICAgICAgICAgewotICAgICAgICAgICAgbWF0Y2goImtleSIpOyAKKyAgICAgICAgICAgIG1hdGNoKCJleHByZXNzaW9uIik7IAogCiAKICAgICAgICAgICAgIH0KQEAgLTE4OTMsMTAgKzE5MDUsMTAgQEAKICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgIGludCBfdHlwZSA9IFRfXzk1OwogICAgICAgICAgICAgaW50IF9jaGFubmVsID0gREVGQVVMVF9UT0tFTl9DSEFOTkVMOwotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6OTM6NzogKCAnZm9yJyApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo5Mzo5OiAnZm9yJworICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6OTM6NzogKCAnbG9va3VwJyApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo5Mzo5OiAnbG9va3VwJwogICAgICAgICAgICAgewotICAgICAgICAgICAgbWF0Y2goImZvciIpOyAKKyAgICAgICAgICAgIG1hdGNoKCJsb29rdXAiKTsgCiAKIAogICAgICAgICAgICAgfQpAQCAtMTkxNCwxMCArMTkyNiwxMCBAQAogICAgICAgICB0cnkgewogICAgICAgICAgICAgaW50IF90eXBlID0gVF9fOTY7CiAgICAgICAgICAgICBpbnQgX2NoYW5uZWwgPSBERUZBVUxUX1RPS0VOX0NIQU5ORUw7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo5NDo3OiAoICdvbicgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6OTQ6OTogJ29uJworICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6OTQ6NzogKCAnZm9ybWF0JyApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo5NDo5OiAnZm9ybWF0JwogICAgICAgICAgICAgewotICAgICAgICAgICAgbWF0Y2goIm9uIik7IAorICAgICAgICAgICAgbWF0Y2goImZvcm1hdCIpOyAKIAogCiAgICAgICAgICAgICB9CkBAIC0xOTM1LDEwICsxOTQ3LDEwIEBACiAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICBpbnQgX3R5cGUgPSBUX185NzsKICAgICAgICAgICAgIGludCBfY2hhbm5lbCA9IERFRkFVTFRfVE9LRU5fQ0hBTk5FTDsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjk1Ojc6ICggJ3dpdGgnICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjk1Ojk6ICd3aXRoJworICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6OTU6NzogKCAnZXhwb3NlJyApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo5NTo5OiAnZXhwb3NlJwogICAgICAgICAgICAgewotICAgICAgICAgICAgbWF0Y2goIndpdGgiKTsgCisgICAgICAgICAgICBtYXRjaCgiZXhwb3NlIik7IAogCiAKICAgICAgICAgICAgIH0KQEAgLTE5NTYsMTAgKzE5NjgsMTAgQEAKICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgIGludCBfdHlwZSA9IFRfXzk4OwogICAgICAgICAgICAgaW50IF9jaGFubmVsID0gREVGQVVMVF9UT0tFTl9DSEFOTkVMOwotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6OTY6NzogKCAnbWFwVG8nICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjk2Ojk6ICdtYXBUbycKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjk2Ojc6ICggJ21hcHBpbmcnICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjk2Ojk6ICdtYXBwaW5nJwogICAgICAgICAgICAgewotICAgICAgICAgICAgbWF0Y2goIm1hcFRvIik7IAorICAgICAgICAgICAgbWF0Y2goIm1hcHBpbmciKTsgCiAKIAogICAgICAgICAgICAgfQpAQCAtMTk3NywxMCArMTk4OSwxMCBAQAogICAgICAgICB0cnkgewogICAgICAgICAgICAgaW50IF90eXBlID0gVF9fOTk7CiAgICAgICAgICAgICBpbnQgX2NoYW5uZWwgPSBERUZBVUxUX1RPS0VOX0NIQU5ORUw7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo5Nzo3OiAoICdtYXJrZXJQYXRoJyApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo5Nzo5OiAnbWFya2VyUGF0aCcKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjk3Ojc6ICggJ2tleXMnICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjk3Ojk6ICdrZXlzJwogICAgICAgICAgICAgewotICAgICAgICAgICAgbWF0Y2goIm1hcmtlclBhdGgiKTsgCisgICAgICAgICAgICBtYXRjaCgia2V5cyIpOyAKIAogCiAgICAgICAgICAgICB9CkBAIC0xOTk4LDEwICsyMDEwLDEwIEBACiAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICBpbnQgX3R5cGUgPSBUX18xMDA7CiAgICAgICAgICAgICBpbnQgX2NoYW5uZWwgPSBERUZBVUxUX1RPS0VOX0NIQU5ORUw7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo5ODo4OiAoICdtYXJrZXJFbnRpdHknICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjk4OjEwOiAnbWFya2VyRW50aXR5JworICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6OTg6ODogKCAnZXhwb3J0RmlsdGVyJyApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo5ODoxMDogJ2V4cG9ydEZpbHRlcicKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIG1hdGNoKCJtYXJrZXJFbnRpdHkiKTsgCisgICAgICAgICAgICBtYXRjaCgiZXhwb3J0RmlsdGVyIik7IAogCiAKICAgICAgICAgICAgIH0KQEAgLTIwMTksMTAgKzIwMzEsMTAgQEAKICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgIGludCBfdHlwZSA9IFRfXzEwMTsKICAgICAgICAgICAgIGludCBfY2hhbm5lbCA9IERFRkFVTFRfVE9LRU5fQ0hBTk5FTDsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjk5Ojg6ICggJ2NvZGluZycgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6OTk6MTA6ICdjb2RpbmcnCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo5OTo4OiAoICdrZXknICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjk5OjEwOiAna2V5JwogICAgICAgICAgICAgewotICAgICAgICAgICAgbWF0Y2goImNvZGluZyIpOyAKKyAgICAgICAgICAgIG1hdGNoKCJrZXkiKTsgCiAKIAogICAgICAgICAgICAgfQpAQCAtMjA0MCwxMCArMjA1MiwxMCBAQAogICAgICAgICB0cnkgewogICAgICAgICAgICAgaW50IF90eXBlID0gVF9fMTAyOwogICAgICAgICAgICAgaW50IF9jaGFubmVsID0gREVGQVVMVF9UT0tFTl9DSEFOTkVMOwotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTAwOjg6ICggJ2NvcHknICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEwMDoxMDogJ2NvcHknCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMDA6ODogKCAnZm9yJyApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMDA6MTA6ICdmb3InCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICBtYXRjaCgiY29weSIpOyAKKyAgICAgICAgICAgIG1hdGNoKCJmb3IiKTsgCiAKIAogICAgICAgICAgICAgfQpAQCAtMjA2MSwxMCArMjA3MywxMCBAQAogICAgICAgICB0cnkgewogICAgICAgICAgICAgaW50IF90eXBlID0gVF9fMTAzOwogICAgICAgICAgICAgaW50IF9jaGFubmVsID0gREVGQVVMVF9UT0tFTl9DSEFOTkVMOwotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTAxOjg6ICggJ2Zyb20nICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEwMToxMDogJ2Zyb20nCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMDE6ODogKCAnb24nICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEwMToxMDogJ29uJwogICAgICAgICAgICAgewotICAgICAgICAgICAgbWF0Y2goImZyb20iKTsgCisgICAgICAgICAgICBtYXRjaCgib24iKTsgCiAKIAogICAgICAgICAgICAgfQpAQCAtMjA4MiwxMCArMjA5NCwxMCBAQAogICAgICAgICB0cnkgewogICAgICAgICAgICAgaW50IF90eXBlID0gVF9fMTA0OwogICAgICAgICAgICAgaW50IF9jaGFubmVsID0gREVGQVVMVF9UT0tFTl9DSEFOTkVMOwotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTAyOjg6ICggJ3Byb3BlcnR5JyApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMDI6MTA6ICdwcm9wZXJ0eScKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEwMjo4OiAoICd3aXRoJyApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMDI6MTA6ICd3aXRoJwogICAgICAgICAgICAgewotICAgICAgICAgICAgbWF0Y2goInByb3BlcnR5Iik7IAorICAgICAgICAgICAgbWF0Y2goIndpdGgiKTsgCiAKIAogICAgICAgICAgICAgfQpAQCAtMjEwMywxMCArMjExNSwxMCBAQAogICAgICAgICB0cnkgewogICAgICAgICAgICAgaW50IF90eXBlID0gVF9fMTA1OwogICAgICAgICAgICAgaW50IF9jaGFubmVsID0gREVGQVVMVF9UT0tFTl9DSEFOTkVMOwotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTAzOjg6ICggJ2Fzc2lnbicgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTAzOjEwOiAnYXNzaWduJworICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTAzOjg6ICggJ21hcFRvJyApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMDM6MTA6ICdtYXBUbycKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIG1hdGNoKCJhc3NpZ24iKTsgCisgICAgICAgICAgICBtYXRjaCgibWFwVG8iKTsgCiAKIAogICAgICAgICAgICAgfQpAQCAtMjEyNCwxMCArMjEzNiwxMCBAQAogICAgICAgICB0cnkgewogICAgICAgICAgICAgaW50IF90eXBlID0gVF9fMTA2OwogICAgICAgICAgICAgaW50IF9jaGFubmVsID0gREVGQVVMVF9UT0tFTl9DSEFOTkVMOwotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTA0Ojg6ICggJ2FzJyApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMDQ6MTA6ICdhcycKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEwNDo4OiAoICdtYXJrZXJQYXRoJyApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMDQ6MTA6ICdtYXJrZXJQYXRoJwogICAgICAgICAgICAgewotICAgICAgICAgICAgbWF0Y2goImFzIik7IAorICAgICAgICAgICAgbWF0Y2goIm1hcmtlclBhdGgiKTsgCiAKIAogICAgICAgICAgICAgfQpAQCAtMjE0NSwxMCArMjE1NywxMCBAQAogICAgICAgICB0cnkgewogICAgICAgICAgICAgaW50IF90eXBlID0gVF9fMTA3OwogICAgICAgICAgICAgaW50IF9jaGFubmVsID0gREVGQVVMVF9UT0tFTl9DSEFOTkVMOwotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTA1Ojg6ICggJ21hcCcgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTA1OjEwOiAnbWFwJworICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTA1Ojg6ICggJ21hcmtlckVudGl0eScgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTA1OjEwOiAnbWFya2VyRW50aXR5JwogICAgICAgICAgICAgewotICAgICAgICAgICAgbWF0Y2goIm1hcCIpOyAKKyAgICAgICAgICAgIG1hdGNoKCJtYXJrZXJFbnRpdHkiKTsgCiAKIAogICAgICAgICAgICAgfQpAQCAtMjE2NiwxMCArMjE3OCwxMCBAQAogICAgICAgICB0cnkgewogICAgICAgICAgICAgaW50IF90eXBlID0gVF9fMTA4OwogICAgICAgICAgICAgaW50IF9jaGFubmVsID0gREVGQVVMVF9UT0tFTl9DSEFOTkVMOwotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTA2Ojg6ICggJ3RvJyApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMDY6MTA6ICd0bycKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEwNjo4OiAoICdjb2RpbmcnICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEwNjoxMDogJ2NvZGluZycKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIG1hdGNoKCJ0byIpOyAKKyAgICAgICAgICAgIG1hdGNoKCJjb2RpbmciKTsgCiAKIAogICAgICAgICAgICAgfQpAQCAtMjE4NywxMCArMjE5OSwxMCBAQAogICAgICAgICB0cnkgewogICAgICAgICAgICAgaW50IF90eXBlID0gVF9fMTA5OwogICAgICAgICAgICAgaW50IF9jaGFubmVsID0gREVGQVVMVF9UT0tFTl9DSEFOTkVMOwotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTA3Ojg6ICggJ21hcEJsb2InICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEwNzoxMDogJ21hcEJsb2InCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMDc6ODogKCAnY29weScgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTA3OjEwOiAnY29weScKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIG1hdGNoKCJtYXBCbG9iIik7IAorICAgICAgICAgICAgbWF0Y2goImNvcHkiKTsgCiAKIAogICAgICAgICAgICAgfQpAQCAtMjIwOCwxMCArMjIyMCwxMCBAQAogICAgICAgICB0cnkgewogICAgICAgICAgICAgaW50IF90eXBlID0gVF9fMTEwOwogICAgICAgICAgICAgaW50IF9jaGFubmVsID0gREVGQVVMVF9UT0tFTl9DSEFOTkVMOwotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTA4Ojg6ICggJ21pbWVUeXBlJyApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMDg6MTA6ICdtaW1lVHlwZScKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEwODo4OiAoICdmcm9tJyApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMDg6MTA6ICdmcm9tJwogICAgICAgICAgICAgewotICAgICAgICAgICAgbWF0Y2goIm1pbWVUeXBlIik7IAorICAgICAgICAgICAgbWF0Y2goImZyb20iKTsgCiAKIAogICAgICAgICAgICAgfQpAQCAtMjIyOSwxMCArMjI0MSwxMSBAQAogICAgICAgICB0cnkgewogICAgICAgICAgICAgaW50IF90eXBlID0gVF9fMTExOwogICAgICAgICAgICAgaW50IF9jaGFubmVsID0gREVGQVVMVF9UT0tFTl9DSEFOTkVMOwotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTA5Ojg6ICggJzsnICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEwOToxMDogJzsnCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMDk6ODogKCAncHJvcGVydHknICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEwOToxMDogJ3Byb3BlcnR5JwogICAgICAgICAgICAgewotICAgICAgICAgICAgbWF0Y2goJzsnKTsgCisgICAgICAgICAgICBtYXRjaCgicHJvcGVydHkiKTsgCisKIAogICAgICAgICAgICAgfQogCkBAIC0yMjQ5LDEwICsyMjYyLDExIEBACiAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICBpbnQgX3R5cGUgPSBUX18xMTI7CiAgICAgICAgICAgICBpbnQgX2NoYW5uZWwgPSBERUZBVUxUX1RPS0VOX0NIQU5ORUw7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMTA6ODogKCAnQCcgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTEwOjEwOiAnQCcKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjExMDo4OiAoICdyZWYnICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjExMDoxMDogJ3JlZicKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIG1hdGNoKCdAJyk7IAorICAgICAgICAgICAgbWF0Y2goInJlZiIpOyAKKwogCiAgICAgICAgICAgICB9CiAKQEAgLTIyNjksMTAgKzIyODMsMTEgQEAKICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgIGludCBfdHlwZSA9IFRfXzExMzsKICAgICAgICAgICAgIGludCBfY2hhbm5lbCA9IERFRkFVTFRfVE9LRU5fQ0hBTk5FTDsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjExMTo4OiAoICcoJyApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMTE6MTA6ICcoJworICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTExOjg6ICggJ3doZXJlJyApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMTE6MTA6ICd3aGVyZScKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIG1hdGNoKCcoJyk7IAorICAgICAgICAgICAgbWF0Y2goIndoZXJlIik7IAorCiAKICAgICAgICAgICAgIH0KIApAQCAtMjI4OSwxMCArMjMwNCwxMSBAQAogICAgICAgICB0cnkgewogICAgICAgICAgICAgaW50IF90eXBlID0gVF9fMTE0OwogICAgICAgICAgICAgaW50IF9jaGFubmVsID0gREVGQVVMVF9UT0tFTl9DSEFOTkVMOwotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTEyOjg6ICggJyknICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjExMjoxMDogJyknCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMTI6ODogKCAnaGlkZScgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTEyOjEwOiAnaGlkZScKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIG1hdGNoKCcpJyk7IAorICAgICAgICAgICAgbWF0Y2goImhpZGUiKTsgCisKIAogICAgICAgICAgICAgfQogCkBAIC0yMzA5LDEwICsyMzI1LDExIEBACiAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICBpbnQgX3R5cGUgPSBUX18xMTU7CiAgICAgICAgICAgICBpbnQgX2NoYW5uZWwgPSBERUZBVUxUX1RPS0VOX0NIQU5ORUw7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMTM6ODogKCAnLCcgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTEzOjEwOiAnLCcKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjExMzo4OiAoICdhc3NpZ24nICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjExMzoxMDogJ2Fzc2lnbicKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIG1hdGNoKCcsJyk7IAorICAgICAgICAgICAgbWF0Y2goImFzc2lnbiIpOyAKKwogCiAgICAgICAgICAgICB9CiAKQEAgLTIzMjksMTAgKzIzNDYsMTEgQEAKICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgIGludCBfdHlwZSA9IFRfXzExNjsKICAgICAgICAgICAgIGludCBfY2hhbm5lbCA9IERFRkFVTFRfVE9LRU5fQ0hBTk5FTDsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjExNDo4OiAoICddJyApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMTQ6MTA6ICddJworICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTE0Ojg6ICggJ2FzJyApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMTQ6MTA6ICdhcycKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIG1hdGNoKCddJyk7IAorICAgICAgICAgICAgbWF0Y2goImFzIik7IAorCiAKICAgICAgICAgICAgIH0KIApAQCAtMjM0OSwxMCArMjM2NywxMSBAQAogICAgICAgICB0cnkgewogICAgICAgICAgICAgaW50IF90eXBlID0gVF9fMTE3OwogICAgICAgICAgICAgaW50IF9jaGFubmVsID0gREVGQVVMVF9UT0tFTl9DSEFOTkVMOwotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTE1Ojg6ICggJyMnICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjExNToxMDogJyMnCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMTU6ODogKCAnbWFwJyApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMTU6MTA6ICdtYXAnCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICBtYXRjaCgnIycpOyAKKyAgICAgICAgICAgIG1hdGNoKCJtYXAiKTsgCisKIAogICAgICAgICAgICAgfQogCkBAIC0yMzY5LDEwICsyMzg4LDExIEBACiAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICBpbnQgX3R5cGUgPSBUX18xMTg7CiAgICAgICAgICAgICBpbnQgX2NoYW5uZWwgPSBERUZBVUxUX1RPS0VOX0NIQU5ORUw7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMTY6ODogKCAnWycgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTE2OjEwOiAnWycKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjExNjo4OiAoICd0bycgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTE2OjEwOiAndG8nCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICBtYXRjaCgnWycpOyAKKyAgICAgICAgICAgIG1hdGNoKCJ0byIpOyAKKwogCiAgICAgICAgICAgICB9CiAKQEAgLTIzODksMTAgKzI0MDksMTAgQEAKICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgIGludCBfdHlwZSA9IFRfXzExOTsKICAgICAgICAgICAgIGludCBfY2hhbm5lbCA9IERFRkFVTFRfVE9LRU5fQ0hBTk5FTDsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjExNzo4OiAoICdpbnN0YW5jZW9mJyApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMTc6MTA6ICdpbnN0YW5jZW9mJworICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTE3Ojg6ICggJ21hcEJsb2InICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjExNzoxMDogJ21hcEJsb2InCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICBtYXRjaCgiaW5zdGFuY2VvZiIpOyAKKyAgICAgICAgICAgIG1hdGNoKCJtYXBCbG9iIik7IAogCiAKICAgICAgICAgICAgIH0KQEAgLTI0MTAsMTAgKzI0MzAsMTAgQEAKICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgIGludCBfdHlwZSA9IFRfXzEyMDsKICAgICAgICAgICAgIGludCBfY2hhbm5lbCA9IERFRkFVTFRfVE9LRU5fQ0hBTk5FTDsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjExODo4OiAoICdpZicgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTE4OjEwOiAnaWYnCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMTg6ODogKCAnbWltZVR5cGUnICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjExODoxMDogJ21pbWVUeXBlJwogICAgICAgICAgICAgewotICAgICAgICAgICAgbWF0Y2goImlmIik7IAorICAgICAgICAgICAgbWF0Y2goIm1pbWVUeXBlIik7IAogCiAKICAgICAgICAgICAgIH0KQEAgLTI0MzEsMTEgKzI0NTEsMTAgQEAKICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgIGludCBfdHlwZSA9IFRfXzEyMTsKICAgICAgICAgICAgIGludCBfY2hhbm5lbCA9IERFRkFVTFRfVE9LRU5fQ0hBTk5FTDsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjExOTo4OiAoICdlbHNlJyApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMTk6MTA6ICdlbHNlJworICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTE5Ojg6ICggJzsnICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjExOToxMDogJzsnCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICBtYXRjaCgiZWxzZSIpOyAKLQorICAgICAgICAgICAgbWF0Y2goJzsnKTsgCiAKICAgICAgICAgICAgIH0KIApAQCAtMjQ1MiwxMSArMjQ3MSwxMCBAQAogICAgICAgICB0cnkgewogICAgICAgICAgICAgaW50IF90eXBlID0gVF9fMTIyOwogICAgICAgICAgICAgaW50IF9jaGFubmVsID0gREVGQVVMVF9UT0tFTl9DSEFOTkVMOwotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTIwOjg6ICggJ3N3aXRjaCcgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTIwOjEwOiAnc3dpdGNoJworICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTIwOjg6ICggJ0AnICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEyMDoxMDogJ0AnCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICBtYXRjaCgic3dpdGNoIik7IAotCisgICAgICAgICAgICBtYXRjaCgnQCcpOyAKIAogICAgICAgICAgICAgfQogCkBAIC0yNDczLDEwICsyNDkxLDEwIEBACiAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICBpbnQgX3R5cGUgPSBUX18xMjM7CiAgICAgICAgICAgICBpbnQgX2NoYW5uZWwgPSBERUZBVUxUX1RPS0VOX0NIQU5ORUw7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMjE6ODogKCAnOicgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTIxOjEwOiAnOicKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEyMTo4OiAoICcoJyApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMjE6MTA6ICcoJwogICAgICAgICAgICAgewotICAgICAgICAgICAgbWF0Y2goJzonKTsgCisgICAgICAgICAgICBtYXRjaCgnKCcpOyAKIAogICAgICAgICAgICAgfQogCkBAIC0yNDkzLDExICsyNTExLDEwIEBACiAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICBpbnQgX3R5cGUgPSBUX18xMjQ7CiAgICAgICAgICAgICBpbnQgX2NoYW5uZWwgPSBERUZBVUxUX1RPS0VOX0NIQU5ORUw7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMjI6ODogKCAnZGVmYXVsdCcgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTIyOjEwOiAnZGVmYXVsdCcKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEyMjo4OiAoICcpJyApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMjI6MTA6ICcpJwogICAgICAgICAgICAgewotICAgICAgICAgICAgbWF0Y2goImRlZmF1bHQiKTsgCi0KKyAgICAgICAgICAgIG1hdGNoKCcpJyk7IAogCiAgICAgICAgICAgICB9CiAKQEAgLTI1MTQsMTEgKzI1MzEsMTAgQEAKICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgIGludCBfdHlwZSA9IFRfXzEyNTsKICAgICAgICAgICAgIGludCBfY2hhbm5lbCA9IERFRkFVTFRfVE9LRU5fQ0hBTk5FTDsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEyMzo4OiAoICdjYXNlJyApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMjM6MTA6ICdjYXNlJworICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTIzOjg6ICggJywnICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEyMzoxMDogJywnCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICBtYXRjaCgiY2FzZSIpOyAKLQorICAgICAgICAgICAgbWF0Y2goJywnKTsgCiAKICAgICAgICAgICAgIH0KIApAQCAtMjUzNSwxMSArMjU1MSwxMCBAQAogICAgICAgICB0cnkgewogICAgICAgICAgICAgaW50IF90eXBlID0gVF9fMTI2OwogICAgICAgICAgICAgaW50IF9jaGFubmVsID0gREVGQVVMVF9UT0tFTl9DSEFOTkVMOwotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTI0Ojg6ICggJ3doaWxlJyApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMjQ6MTA6ICd3aGlsZScKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEyNDo4OiAoICddJyApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMjQ6MTA6ICddJwogICAgICAgICAgICAgewotICAgICAgICAgICAgbWF0Y2goIndoaWxlIik7IAotCisgICAgICAgICAgICBtYXRjaCgnXScpOyAKIAogICAgICAgICAgICAgfQogCkBAIC0yNTU2LDExICsyNTcxLDEwIEBACiAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICBpbnQgX3R5cGUgPSBUX18xMjc7CiAgICAgICAgICAgICBpbnQgX2NoYW5uZWwgPSBERUZBVUxUX1RPS0VOX0NIQU5ORUw7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMjU6ODogKCAnZG8nICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEyNToxMDogJ2RvJworICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTI1Ojg6ICggJyMnICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEyNToxMDogJyMnCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICBtYXRjaCgiZG8iKTsgCi0KKyAgICAgICAgICAgIG1hdGNoKCcjJyk7IAogCiAgICAgICAgICAgICB9CiAKQEAgLTI1NzcsMTEgKzI1OTEsMTAgQEAKICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgIGludCBfdHlwZSA9IFRfXzEyODsKICAgICAgICAgICAgIGludCBfY2hhbm5lbCA9IERFRkFVTFRfVE9LRU5fQ0hBTk5FTDsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEyNjo4OiAoICduZXcnICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEyNjoxMDogJ25ldycKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEyNjo4OiAoICdbJyApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMjY6MTA6ICdbJwogICAgICAgICAgICAgewotICAgICAgICAgICAgbWF0Y2goIm5ldyIpOyAKLQorICAgICAgICAgICAgbWF0Y2goJ1snKTsgCiAKICAgICAgICAgICAgIH0KIApAQCAtMjU5OCwxMCArMjYxMSwxMCBAQAogICAgICAgICB0cnkgewogICAgICAgICAgICAgaW50IF90eXBlID0gVF9fMTI5OwogICAgICAgICAgICAgaW50IF9jaGFubmVsID0gREVGQVVMVF9UT0tFTl9DSEFOTkVMOwotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTI3Ojg6ICggJ251bGwnICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEyNzoxMDogJ251bGwnCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMjc6ODogKCAnaW5zdGFuY2VvZicgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTI3OjEwOiAnaW5zdGFuY2VvZicKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIG1hdGNoKCJudWxsIik7IAorICAgICAgICAgICAgbWF0Y2goImluc3RhbmNlb2YiKTsgCiAKIAogICAgICAgICAgICAgfQpAQCAtMjYxOSwxMCArMjYzMiwxMCBAQAogICAgICAgICB0cnkgewogICAgICAgICAgICAgaW50IF90eXBlID0gVF9fMTMwOwogICAgICAgICAgICAgaW50IF9jaGFubmVsID0gREVGQVVMVF9UT0tFTl9DSEFOTkVMOwotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTI4Ojg6ICggJ3R5cGVvZicgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTI4OjEwOiAndHlwZW9mJworICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTI4Ojg6ICggJ2lmJyApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMjg6MTA6ICdpZicKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIG1hdGNoKCJ0eXBlb2YiKTsgCisgICAgICAgICAgICBtYXRjaCgiaWYiKTsgCiAKIAogICAgICAgICAgICAgfQpAQCAtMjY0MCwxMCArMjY1MywxMCBAQAogICAgICAgICB0cnkgewogICAgICAgICAgICAgaW50IF90eXBlID0gVF9fMTMxOwogICAgICAgICAgICAgaW50IF9jaGFubmVsID0gREVGQVVMVF9UT0tFTl9DSEFOTkVMOwotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTI5Ojg6ICggJ3Rocm93JyApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMjk6MTA6ICd0aHJvdycKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEyOTo4OiAoICdlbHNlJyApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMjk6MTA6ICdlbHNlJwogICAgICAgICAgICAgewotICAgICAgICAgICAgbWF0Y2goInRocm93Iik7IAorICAgICAgICAgICAgbWF0Y2goImVsc2UiKTsgCiAKIAogICAgICAgICAgICAgfQpAQCAtMjY2MSwxMCArMjY3NCwxMCBAQAogICAgICAgICB0cnkgewogICAgICAgICAgICAgaW50IF90eXBlID0gVF9fMTMyOwogICAgICAgICAgICAgaW50IF9jaGFubmVsID0gREVGQVVMVF9UT0tFTl9DSEFOTkVMOwotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTMwOjg6ICggJ3JldHVybicgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTMwOjEwOiAncmV0dXJuJworICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTMwOjg6ICggJ3N3aXRjaCcgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTMwOjEwOiAnc3dpdGNoJwogICAgICAgICAgICAgewotICAgICAgICAgICAgbWF0Y2goInJldHVybiIpOyAKKyAgICAgICAgICAgIG1hdGNoKCJzd2l0Y2giKTsgCiAKIAogICAgICAgICAgICAgfQpAQCAtMjY4MiwxMSArMjY5NSwxMCBAQAogICAgICAgICB0cnkgewogICAgICAgICAgICAgaW50IF90eXBlID0gVF9fMTMzOwogICAgICAgICAgICAgaW50IF9jaGFubmVsID0gREVGQVVMVF9UT0tFTl9DSEFOTkVMOwotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTMxOjg6ICggJ3RyeScgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTMxOjEwOiAndHJ5JworICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTMxOjg6ICggJzonICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEzMToxMDogJzonCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICBtYXRjaCgidHJ5Iik7IAotCisgICAgICAgICAgICBtYXRjaCgnOicpOyAKIAogICAgICAgICAgICAgfQogCkBAIC0yNzAzLDEwICsyNzE1LDEwIEBACiAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICBpbnQgX3R5cGUgPSBUX18xMzQ7CiAgICAgICAgICAgICBpbnQgX2NoYW5uZWwgPSBERUZBVUxUX1RPS0VOX0NIQU5ORUw7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMzI6ODogKCAnZmluYWxseScgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTMyOjEwOiAnZmluYWxseScKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEzMjo4OiAoICdkZWZhdWx0JyApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMzI6MTA6ICdkZWZhdWx0JwogICAgICAgICAgICAgewotICAgICAgICAgICAgbWF0Y2goImZpbmFsbHkiKTsgCisgICAgICAgICAgICBtYXRjaCgiZGVmYXVsdCIpOyAKIAogCiAgICAgICAgICAgICB9CkBAIC0yNzI0LDEwICsyNzM2LDEwIEBACiAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICBpbnQgX3R5cGUgPSBUX18xMzU7CiAgICAgICAgICAgICBpbnQgX2NoYW5uZWwgPSBERUZBVUxUX1RPS0VOX0NIQU5ORUw7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMzM6ODogKCAnc3luY2hyb25pemVkJyApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMzM6MTA6ICdzeW5jaHJvbml6ZWQnCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMzM6ODogKCAnY2FzZScgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTMzOjEwOiAnY2FzZScKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIG1hdGNoKCJzeW5jaHJvbml6ZWQiKTsgCisgICAgICAgICAgICBtYXRjaCgiY2FzZSIpOyAKIAogCiAgICAgICAgICAgICB9CkBAIC0yNzQ1LDEwICsyNzU3LDEwIEBACiAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICBpbnQgX3R5cGUgPSBUX18xMzY7CiAgICAgICAgICAgICBpbnQgX2NoYW5uZWwgPSBERUZBVUxUX1RPS0VOX0NIQU5ORUw7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMzQ6ODogKCAnY2F0Y2gnICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEzNDoxMDogJ2NhdGNoJworICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTM0Ojg6ICggJ3doaWxlJyApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMzQ6MTA6ICd3aGlsZScKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIG1hdGNoKCJjYXRjaCIpOyAKKyAgICAgICAgICAgIG1hdGNoKCJ3aGlsZSIpOyAKIAogCiAgICAgICAgICAgICB9CkBAIC0yNzY2LDEwICsyNzc4LDExIEBACiAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICBpbnQgX3R5cGUgPSBUX18xMzc7CiAgICAgICAgICAgICBpbnQgX2NoYW5uZWwgPSBERUZBVUxUX1RPS0VOX0NIQU5ORUw7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMzU6ODogKCAnPycgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTM1OjEwOiAnPycKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEzNTo4OiAoICdkbycgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTM1OjEwOiAnZG8nCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICBtYXRjaCgnPycpOyAKKyAgICAgICAgICAgIG1hdGNoKCJkbyIpOyAKKwogCiAgICAgICAgICAgICB9CiAKQEAgLTI3ODYsMTAgKzI3OTksMTEgQEAKICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgIGludCBfdHlwZSA9IFRfXzEzODsKICAgICAgICAgICAgIGludCBfY2hhbm5lbCA9IERFRkFVTFRfVE9LRU5fQ0hBTk5FTDsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEzNjo4OiAoICcmJyApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMzY6MTA6ICcmJworICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTM2Ojg6ICggJ25ldycgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTM2OjEwOiAnbmV3JwogICAgICAgICAgICAgewotICAgICAgICAgICAgbWF0Y2goJyYnKTsgCisgICAgICAgICAgICBtYXRjaCgibmV3Iik7IAorCiAKICAgICAgICAgICAgIH0KIApAQCAtMjgwNiwxMCArMjgyMCwxMCBAQAogICAgICAgICB0cnkgewogICAgICAgICAgICAgaW50IF90eXBlID0gVF9fMTM5OwogICAgICAgICAgICAgaW50IF9jaGFubmVsID0gREVGQVVMVF9UT0tFTl9DSEFOTkVMOwotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTM3Ojg6ICggJ2Rlc2NyaWJlZEJ5JyApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMzc6MTA6ICdkZXNjcmliZWRCeScKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEzNzo4OiAoICdudWxsJyApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMzc6MTA6ICdudWxsJwogICAgICAgICAgICAgewotICAgICAgICAgICAgbWF0Y2goImRlc2NyaWJlZEJ5Iik7IAorICAgICAgICAgICAgbWF0Y2goIm51bGwiKTsgCiAKIAogICAgICAgICAgICAgfQpAQCAtMjgyNywxMCArMjg0MSwxMCBAQAogICAgICAgICB0cnkgewogICAgICAgICAgICAgaW50IF90eXBlID0gVF9fMTQwOwogICAgICAgICAgICAgaW50IF9jaGFubmVsID0gREVGQVVMVF9UT0tFTl9DSEFOTkVMOwotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTM4Ojg6ICggJ3JlcG9ydCcgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTM4OjEwOiAncmVwb3J0JworICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTM4Ojg6ICggJ3R5cGVvZicgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTM4OjEwOiAndHlwZW9mJwogICAgICAgICAgICAgewotICAgICAgICAgICAgbWF0Y2goInJlcG9ydCIpOyAKKyAgICAgICAgICAgIG1hdGNoKCJ0eXBlb2YiKTsgCiAKIAogICAgICAgICAgICAgfQpAQCAtMjg0OCwxMCArMjg2MiwxMCBAQAogICAgICAgICB0cnkgewogICAgICAgICAgICAgaW50IF90eXBlID0gVF9fMTQxOwogICAgICAgICAgICAgaW50IF9jaGFubmVsID0gREVGQVVMVF9UT0tFTl9DSEFOTkVMOwotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTM5Ojg6ICggJ21hcEJ5QXR0cmlidXRlJyApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMzk6MTA6ICdtYXBCeUF0dHJpYnV0ZScKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEzOTo4OiAoICd0aHJvdycgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTM5OjEwOiAndGhyb3cnCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICBtYXRjaCgibWFwQnlBdHRyaWJ1dGUiKTsgCisgICAgICAgICAgICBtYXRjaCgidGhyb3ciKTsgCiAKIAogICAgICAgICAgICAgfQpAQCAtMjg2OSwxMCArMjg4MywxMCBAQAogICAgICAgICB0cnkgewogICAgICAgICAgICAgaW50IF90eXBlID0gVF9fMTQyOwogICAgICAgICAgICAgaW50IF9jaGFubmVsID0gREVGQVVMVF9UT0tFTl9DSEFOTkVMOwotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTQwOjg6ICggJ2luZGVudCcgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTQwOjEwOiAnaW5kZW50JworICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTQwOjg6ICggJ3JldHVybicgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTQwOjEwOiAncmV0dXJuJwogICAgICAgICAgICAgewotICAgICAgICAgICAgbWF0Y2goImluZGVudCIpOyAKKyAgICAgICAgICAgIG1hdGNoKCJyZXR1cm4iKTsgCiAKIAogICAgICAgICAgICAgfQpAQCAtMjg5MCwxMCArMjkwNCwxMCBAQAogICAgICAgICB0cnkgewogICAgICAgICAgICAgaW50IF90eXBlID0gVF9fMTQzOwogICAgICAgICAgICAgaW50IF9jaGFubmVsID0gREVGQVVMVF9UT0tFTl9DSEFOTkVMOwotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTQxOjg6ICggJ3ZhbGlkYXRlJyApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNDE6MTA6ICd2YWxpZGF0ZScKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE0MTo4OiAoICd0cnknICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE0MToxMDogJ3RyeScKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIG1hdGNoKCJ2YWxpZGF0ZSIpOyAKKyAgICAgICAgICAgIG1hdGNoKCJ0cnkiKTsgCiAKIAogICAgICAgICAgICAgfQpAQCAtMjkxMSwxMCArMjkyNSwxMCBAQAogICAgICAgICB0cnkgewogICAgICAgICAgICAgaW50IF90eXBlID0gVF9fMTQ0OwogICAgICAgICAgICAgaW50IF9jaGFubmVsID0gREVGQVVMVF9UT0tFTl9DSEFOTkVMOwotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTQyOjg6ICggJ21hcmtlcicgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTQyOjEwOiAnbWFya2VyJworICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTQyOjg6ICggJ2ZpbmFsbHknICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE0MjoxMDogJ2ZpbmFsbHknCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICBtYXRjaCgibWFya2VyIik7IAorICAgICAgICAgICAgbWF0Y2goImZpbmFsbHkiKTsgCiAKIAogICAgICAgICAgICAgfQpAQCAtMjkzMiwxMCArMjk0NiwxMCBAQAogICAgICAgICB0cnkgewogICAgICAgICAgICAgaW50IF90eXBlID0gVF9fMTQ1OwogICAgICAgICAgICAgaW50IF9jaGFubmVsID0gREVGQVVMVF9UT0tFTl9DSEFOTkVMOwotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTQzOjg6ICggJ2NhY2hlU2l6ZScgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTQzOjEwOiAnY2FjaGVTaXplJworICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTQzOjg6ICggJ3N5bmNocm9uaXplZCcgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTQzOjEwOiAnc3luY2hyb25pemVkJwogICAgICAgICAgICAgewotICAgICAgICAgICAgbWF0Y2goImNhY2hlU2l6ZSIpOyAKKyAgICAgICAgICAgIG1hdGNoKCJzeW5jaHJvbml6ZWQiKTsgCiAKIAogICAgICAgICAgICAgfQpAQCAtMjk1MywxMCArMjk2NywxMCBAQAogICAgICAgICB0cnkgewogICAgICAgICAgICAgaW50IF90eXBlID0gVF9fMTQ2OwogICAgICAgICAgICAgaW50IF9jaGFubmVsID0gREVGQVVMVF9UT0tFTl9DSEFOTkVMOwotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTQ0Ojg6ICggJ2FsbG93Tm9SZXN1bHQnICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE0NDoxMDogJ2FsbG93Tm9SZXN1bHQnCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNDQ6ODogKCAnY2F0Y2gnICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE0NDoxMDogJ2NhdGNoJwogICAgICAgICAgICAgewotICAgICAgICAgICAgbWF0Y2goImFsbG93Tm9SZXN1bHQiKTsgCisgICAgICAgICAgICBtYXRjaCgiY2F0Y2giKTsgCiAKIAogICAgICAgICAgICAgfQpAQCAtMjk3NCwxMSArMjk4OCwxMCBAQAogICAgICAgICB0cnkgewogICAgICAgICAgICAgaW50IF90eXBlID0gVF9fMTQ3OwogICAgICAgICAgICAgaW50IF9jaGFubmVsID0gREVGQVVMVF9UT0tFTl9DSEFOTkVMOwotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTQ1Ojg6ICggJ2FsbG93Tm9udW5pcXVlUmVzdWx0JyApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNDU6MTA6ICdhbGxvd05vbnVuaXF1ZVJlc3VsdCcKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE0NTo4OiAoICc/JyApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNDU6MTA6ICc/JwogICAgICAgICAgICAgewotICAgICAgICAgICAgbWF0Y2goImFsbG93Tm9udW5pcXVlUmVzdWx0Iik7IAotCisgICAgICAgICAgICBtYXRjaCgnPycpOyAKIAogICAgICAgICAgICAgfQogCkBAIC0yOTk1LDExICszMDA4LDEwIEBACiAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICBpbnQgX3R5cGUgPSBUX18xNDg7CiAgICAgICAgICAgICBpbnQgX2NoYW5uZWwgPSBERUZBVUxUX1RPS0VOX0NIQU5ORUw7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNDY6ODogKCAnbWFya2VkQnknICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE0NjoxMDogJ21hcmtlZEJ5JworICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTQ2Ojg6ICggJyYnICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE0NjoxMDogJyYnCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICBtYXRjaCgibWFya2VkQnkiKTsgCi0KKyAgICAgICAgICAgIG1hdGNoKCcmJyk7IAogCiAgICAgICAgICAgICB9CiAKQEAgLTMwMTYsMTAgKzMwMjgsMTAgQEAKICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgIGludCBfdHlwZSA9IFRfXzE0OTsKICAgICAgICAgICAgIGludCBfY2hhbm5lbCA9IERFRkFVTFRfVE9LRU5fQ0hBTk5FTDsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE0Nzo4OiAoICducycgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTQ3OjEwOiAnbnMnCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNDc6ODogKCAnZGVzY3JpYmVkQnknICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE0NzoxMDogJ2Rlc2NyaWJlZEJ5JwogICAgICAgICAgICAgewotICAgICAgICAgICAgbWF0Y2goIm5zIik7IAorICAgICAgICAgICAgbWF0Y2goImRlc2NyaWJlZEJ5Iik7IAogCiAKICAgICAgICAgICAgIH0KQEAgLTMwMzcsMTAgKzMwNDksMTAgQEAKICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgIGludCBfdHlwZSA9IFRfXzE1MDsKICAgICAgICAgICAgIGludCBfY2hhbm5lbCA9IERFRkFVTFRfVE9LRU5fQ0hBTk5FTDsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE0ODo4OiAoICc6OicgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTQ4OjEwOiAnOjonCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNDg6ODogKCAncmVwb3J0JyApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNDg6MTA6ICdyZXBvcnQnCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICBtYXRjaCgiOjoiKTsgCisgICAgICAgICAgICBtYXRjaCgicmVwb3J0Iik7IAogCiAKICAgICAgICAgICAgIH0KQEAgLTMwNTgsMTAgKzMwNzAsMTAgQEAKICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgIGludCBfdHlwZSA9IFRfXzE1MTsKICAgICAgICAgICAgIGludCBfY2hhbm5lbCA9IERFRkFVTFRfVE9LRU5fQ0hBTk5FTDsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE0OTo4OiAoICc/LicgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTQ5OjEwOiAnPy4nCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNDk6ODogKCAnZGVsZXRlRmlsZUFmdGVySW1wb3J0JyApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNDk6MTA6ICdkZWxldGVGaWxlQWZ0ZXJJbXBvcnQnCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICBtYXRjaCgiPy4iKTsgCisgICAgICAgICAgICBtYXRjaCgiZGVsZXRlRmlsZUFmdGVySW1wb3J0Iik7IAogCiAKICAgICAgICAgICAgIH0KQEAgLTMwNzksMTAgKzMwOTEsMTEgQEAKICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgIGludCBfdHlwZSA9IFRfXzE1MjsKICAgICAgICAgICAgIGludCBfY2hhbm5lbCA9IERFRkFVTFRfVE9LRU5fQ0hBTk5FTDsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE1MDo4OiAoICd8JyApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNTA6MTA6ICd8JworICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTUwOjg6ICggJ21hcEJ5QXR0cmlidXRlJyApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNTA6MTA6ICdtYXBCeUF0dHJpYnV0ZScKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIG1hdGNoKCd8Jyk7IAorICAgICAgICAgICAgbWF0Y2goIm1hcEJ5QXR0cmlidXRlIik7IAorCiAKICAgICAgICAgICAgIH0KIApAQCAtMzA5OSwxMCArMzExMiwxMCBAQAogICAgICAgICB0cnkgewogICAgICAgICAgICAgaW50IF90eXBlID0gVF9fMTUzOwogICAgICAgICAgICAgaW50IF9jaGFubmVsID0gREVGQVVMVF9UT0tFTl9DSEFOTkVMOwotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTUxOjg6ICggJ3ZhcicgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTUxOjEwOiAndmFyJworICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTUxOjg6ICggJ2luZGVudCcgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTUxOjEwOiAnaW5kZW50JwogICAgICAgICAgICAgewotICAgICAgICAgICAgbWF0Y2goInZhciIpOyAKKyAgICAgICAgICAgIG1hdGNoKCJpbmRlbnQiKTsgCiAKIAogICAgICAgICAgICAgfQpAQCAtMzEyMCwxMCArMzEzMywxMCBAQAogICAgICAgICB0cnkgewogICAgICAgICAgICAgaW50IF90eXBlID0gVF9fMTU0OwogICAgICAgICAgICAgaW50IF9jaGFubmVsID0gREVGQVVMVF9UT0tFTl9DSEFOTkVMOwotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTUyOjg6ICggJ3RydWUnICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE1MjoxMDogJ3RydWUnCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNTI6ODogKCAndmFsaWRhdGUnICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE1MjoxMDogJ3ZhbGlkYXRlJwogICAgICAgICAgICAgewotICAgICAgICAgICAgbWF0Y2goInRydWUiKTsgCisgICAgICAgICAgICBtYXRjaCgidmFsaWRhdGUiKTsgCiAKIAogICAgICAgICAgICAgfQpAQCAtMzEzNiwxNSArMzE0OSwyNjYgQEAKICAgICB9CiAgICAgLy8gJEFOVExSIGVuZCAiVF9fMTU0IgogCisgICAgLy8gJEFOVExSIHN0YXJ0ICJUX18xNTUiCisgICAgcHVibGljIGZpbmFsIHZvaWQgbVRfXzE1NSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpbnQgX3R5cGUgPSBUX18xNTU7CisgICAgICAgICAgICBpbnQgX2NoYW5uZWwgPSBERUZBVUxUX1RPS0VOX0NIQU5ORUw7CisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNTM6ODogKCAnbGF0ZXN0SW1wb3J0JyApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNTM6MTA6ICdsYXRlc3RJbXBvcnQnCisgICAgICAgICAgICB7CisgICAgICAgICAgICBtYXRjaCgibGF0ZXN0SW1wb3J0Iik7IAorCisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3RhdGUudHlwZSA9IF90eXBlOworICAgICAgICAgICAgc3RhdGUuY2hhbm5lbCA9IF9jaGFubmVsOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgIlRfXzE1NSIKKworICAgIC8vICRBTlRMUiBzdGFydCAiVF9fMTU2IgorICAgIHB1YmxpYyBmaW5hbCB2b2lkIG1UX18xNTYoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgaW50IF90eXBlID0gVF9fMTU2OworICAgICAgICAgICAgaW50IF9jaGFubmVsID0gREVGQVVMVF9UT0tFTl9DSEFOTkVMOworICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTU0Ojg6ICggJ2xhdGVzdEV4cG9ydCcgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTU0OjEwOiAnbGF0ZXN0RXhwb3J0JworICAgICAgICAgICAgeworICAgICAgICAgICAgbWF0Y2goImxhdGVzdEV4cG9ydCIpOyAKKworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN0YXRlLnR5cGUgPSBfdHlwZTsKKyAgICAgICAgICAgIHN0YXRlLmNoYW5uZWwgPSBfY2hhbm5lbDsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJUX18xNTYiCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgIlRfXzE1NyIKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBtVF9fMTU3KCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGludCBfdHlwZSA9IFRfXzE1NzsKKyAgICAgICAgICAgIGludCBfY2hhbm5lbCA9IERFRkFVTFRfVE9LRU5fQ0hBTk5FTDsKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE1NTo4OiAoICdjYWNoZVNpemUnICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE1NToxMDogJ2NhY2hlU2l6ZScKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIG1hdGNoKCJjYWNoZVNpemUiKTsgCisKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzdGF0ZS50eXBlID0gX3R5cGU7CisgICAgICAgICAgICBzdGF0ZS5jaGFubmVsID0gX2NoYW5uZWw7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAiVF9fMTU3IgorCisgICAgLy8gJEFOVExSIHN0YXJ0ICJUX18xNTgiCisgICAgcHVibGljIGZpbmFsIHZvaWQgbVRfXzE1OCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpbnQgX3R5cGUgPSBUX18xNTg7CisgICAgICAgICAgICBpbnQgX2NoYW5uZWwgPSBERUZBVUxUX1RPS0VOX0NIQU5ORUw7CisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNTY6ODogKCAnYWxsb3dOb1Jlc3VsdCcgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTU2OjEwOiAnYWxsb3dOb1Jlc3VsdCcKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIG1hdGNoKCJhbGxvd05vUmVzdWx0Iik7IAorCisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3RhdGUudHlwZSA9IF90eXBlOworICAgICAgICAgICAgc3RhdGUuY2hhbm5lbCA9IF9jaGFubmVsOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgIlRfXzE1OCIKKworICAgIC8vICRBTlRMUiBzdGFydCAiVF9fMTU5IgorICAgIHB1YmxpYyBmaW5hbCB2b2lkIG1UX18xNTkoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgaW50IF90eXBlID0gVF9fMTU5OworICAgICAgICAgICAgaW50IF9jaGFubmVsID0gREVGQVVMVF9UT0tFTl9DSEFOTkVMOworICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTU3Ojg6ICggJ2FsbG93Tm9udW5pcXVlUmVzdWx0JyApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNTc6MTA6ICdhbGxvd05vbnVuaXF1ZVJlc3VsdCcKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIG1hdGNoKCJhbGxvd05vbnVuaXF1ZVJlc3VsdCIpOyAKKworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN0YXRlLnR5cGUgPSBfdHlwZTsKKyAgICAgICAgICAgIHN0YXRlLmNoYW5uZWwgPSBfY2hhbm5lbDsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJUX18xNTkiCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgIlRfXzE2MCIKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBtVF9fMTYwKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGludCBfdHlwZSA9IFRfXzE2MDsKKyAgICAgICAgICAgIGludCBfY2hhbm5lbCA9IERFRkFVTFRfVE9LRU5fQ0hBTk5FTDsKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE1ODo4OiAoICdtYXJrZWRCeScgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTU4OjEwOiAnbWFya2VkQnknCisgICAgICAgICAgICB7CisgICAgICAgICAgICBtYXRjaCgibWFya2VkQnkiKTsgCisKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzdGF0ZS50eXBlID0gX3R5cGU7CisgICAgICAgICAgICBzdGF0ZS5jaGFubmVsID0gX2NoYW5uZWw7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAiVF9fMTYwIgorCisgICAgLy8gJEFOVExSIHN0YXJ0ICJUX18xNjEiCisgICAgcHVibGljIGZpbmFsIHZvaWQgbVRfXzE2MSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpbnQgX3R5cGUgPSBUX18xNjE7CisgICAgICAgICAgICBpbnQgX2NoYW5uZWwgPSBERUZBVUxUX1RPS0VOX0NIQU5ORUw7CisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNTk6ODogKCAnbnMnICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE1OToxMDogJ25zJworICAgICAgICAgICAgeworICAgICAgICAgICAgbWF0Y2goIm5zIik7IAorCisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3RhdGUudHlwZSA9IF90eXBlOworICAgICAgICAgICAgc3RhdGUuY2hhbm5lbCA9IF9jaGFubmVsOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgIlRfXzE2MSIKKworICAgIC8vICRBTlRMUiBzdGFydCAiVF9fMTYyIgorICAgIHB1YmxpYyBmaW5hbCB2b2lkIG1UX18xNjIoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgaW50IF90eXBlID0gVF9fMTYyOworICAgICAgICAgICAgaW50IF9jaGFubmVsID0gREVGQVVMVF9UT0tFTl9DSEFOTkVMOworICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTYwOjg6ICggJzo6JyApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNjA6MTA6ICc6OicKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIG1hdGNoKCI6OiIpOyAKKworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN0YXRlLnR5cGUgPSBfdHlwZTsKKyAgICAgICAgICAgIHN0YXRlLmNoYW5uZWwgPSBfY2hhbm5lbDsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJUX18xNjIiCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgIlRfXzE2MyIKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBtVF9fMTYzKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGludCBfdHlwZSA9IFRfXzE2MzsKKyAgICAgICAgICAgIGludCBfY2hhbm5lbCA9IERFRkFVTFRfVE9LRU5fQ0hBTk5FTDsKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE2MTo4OiAoICc/LicgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTYxOjEwOiAnPy4nCisgICAgICAgICAgICB7CisgICAgICAgICAgICBtYXRjaCgiPy4iKTsgCisKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzdGF0ZS50eXBlID0gX3R5cGU7CisgICAgICAgICAgICBzdGF0ZS5jaGFubmVsID0gX2NoYW5uZWw7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAiVF9fMTYzIgorCisgICAgLy8gJEFOVExSIHN0YXJ0ICJUX18xNjQiCisgICAgcHVibGljIGZpbmFsIHZvaWQgbVRfXzE2NCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpbnQgX3R5cGUgPSBUX18xNjQ7CisgICAgICAgICAgICBpbnQgX2NoYW5uZWwgPSBERUZBVUxUX1RPS0VOX0NIQU5ORUw7CisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNjI6ODogKCAnfCcgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTYyOjEwOiAnfCcKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIG1hdGNoKCd8Jyk7IAorCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN0YXRlLnR5cGUgPSBfdHlwZTsKKyAgICAgICAgICAgIHN0YXRlLmNoYW5uZWwgPSBfY2hhbm5lbDsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJUX18xNjQiCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgIlRfXzE2NSIKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBtVF9fMTY1KCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGludCBfdHlwZSA9IFRfXzE2NTsKKyAgICAgICAgICAgIGludCBfY2hhbm5lbCA9IERFRkFVTFRfVE9LRU5fQ0hBTk5FTDsKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE2Mzo4OiAoICd2YXInICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE2MzoxMDogJ3ZhcicKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIG1hdGNoKCJ2YXIiKTsgCisKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzdGF0ZS50eXBlID0gX3R5cGU7CisgICAgICAgICAgICBzdGF0ZS5jaGFubmVsID0gX2NoYW5uZWw7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAiVF9fMTY1IgorCisgICAgLy8gJEFOVExSIHN0YXJ0ICJUX18xNjYiCisgICAgcHVibGljIGZpbmFsIHZvaWQgbVRfXzE2NigpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpbnQgX3R5cGUgPSBUX18xNjY7CisgICAgICAgICAgICBpbnQgX2NoYW5uZWwgPSBERUZBVUxUX1RPS0VOX0NIQU5ORUw7CisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNjQ6ODogKCAndHJ1ZScgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTY0OjEwOiAndHJ1ZScKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIG1hdGNoKCJ0cnVlIik7IAorCisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3RhdGUudHlwZSA9IF90eXBlOworICAgICAgICAgICAgc3RhdGUuY2hhbm5lbCA9IF9jaGFubmVsOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgIlRfXzE2NiIKKwogICAgIC8vICRBTlRMUiBzdGFydCAiUlVMRV9IRVgiCiAgICAgcHVibGljIGZpbmFsIHZvaWQgbVJVTEVfSEVYKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgIGludCBfdHlwZSA9IFJVTEVfSEVYOwogICAgICAgICAgICAgaW50IF9jaGFubmVsID0gREVGQVVMVF9UT0tFTl9DSEFOTkVMOwotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjU3OTQ6MTA6ICggKCAnMHgnIHwgJzBYJyApICggJzAnIC4uICc5JyB8ICdhJyAuLiAnZicgfCAnQScgLi4gJ0YnIHwgJ18nICkrICggJyMnICggKCAnYicgfCAnQicgKSAoICdpJyB8ICdJJyApIHwgKCAnbCcgfCAnTCcgKSApICk/ICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI1Nzk0OjEyOiAoICcweCcgfCAnMFgnICkgKCAnMCcgLi4gJzknIHwgJ2EnIC4uICdmJyB8ICdBJyAuLiAnRicgfCAnXycgKSsgKCAnIycgKCAoICdiJyB8ICdCJyApICggJ2knIHwgJ0knICkgfCAoICdsJyB8ICdMJyApICkgKT8KKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI3NDAwOjEwOiAoICggJzB4JyB8ICcwWCcgKSAoICcwJyAuLiAnOScgfCAnYScgLi4gJ2YnIHwgJ0EnIC4uICdGJyB8ICdfJyApKyAoICcjJyAoICggJ2InIHwgJ0InICkgKCAnaScgfCAnSScgKSB8ICggJ2wnIHwgJ0wnICkgKSApPyApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNzQwMDoxMjogKCAnMHgnIHwgJzBYJyApICggJzAnIC4uICc5JyB8ICdhJyAuLiAnZicgfCAnQScgLi4gJ0YnIHwgJ18nICkrICggJyMnICggKCAnYicgfCAnQicgKSAoICdpJyB8ICdJJyApIHwgKCAnbCcgfCAnTCcgKSApICk/CiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNTc5NDoxMjogKCAnMHgnIHwgJzBYJyApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNzQwMDoxMjogKCAnMHgnIHwgJzBYJyApCiAgICAgICAgICAgICBpbnQgYWx0MT0yOwogICAgICAgICAgICAgaW50IExBMV8wID0gaW5wdXQuTEEoMSk7CiAKQEAgLTMxNzIsNyArMzQzNiw3IEBACiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBzd2l0Y2ggKGFsdDEpIHsKICAgICAgICAgICAgICAgICBjYXNlIDEgOgotICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNTc5NDoxMzogJzB4JworICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNzQwMDoxMzogJzB4JwogICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgIG1hdGNoKCIweCIpOyAKIApAQCAtMzE4MCw3ICszNDQ0LDcgQEAKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICBjYXNlIDIgOgotICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNTc5NDoxODogJzBYJworICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNzQwMDoxODogJzBYJwogICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgIG1hdGNoKCIwWCIpOyAKIApAQCAtMzE5MCw3ICszNDU0LDcgQEAKIAogICAgICAgICAgICAgfQogCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNTc5NDoyNDogKCAnMCcgLi4gJzknIHwgJ2EnIC4uICdmJyB8ICdBJyAuLiAnRicgfCAnXycgKSsKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI3NDAwOjI0OiAoICcwJyAuLiAnOScgfCAnYScgLi4gJ2YnIHwgJ0EnIC4uICdGJyB8ICdfJyApKwogICAgICAgICAgICAgaW50IGNudDI9MDsKICAgICAgICAgICAgIGxvb3AyOgogICAgICAgICAgICAgZG8gewpAQCAtMzIyOCw3ICszNDkyLDcgQEAKICAgICAgICAgICAgICAgICBjbnQyKys7CiAgICAgICAgICAgICB9IHdoaWxlICh0cnVlKTsKIAotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjU3OTQ6NTg6ICggJyMnICggKCAnYicgfCAnQicgKSAoICdpJyB8ICdJJyApIHwgKCAnbCcgfCAnTCcgKSApICk/CisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNzQwMDo1ODogKCAnIycgKCAoICdiJyB8ICdCJyApICggJ2knIHwgJ0knICkgfCAoICdsJyB8ICdMJyApICkgKT8KICAgICAgICAgICAgIGludCBhbHQ0PTI7CiAgICAgICAgICAgICBpbnQgTEE0XzAgPSBpbnB1dC5MQSgxKTsKIApAQCAtMzIzNywxMCArMzUwMSwxMCBAQAogICAgICAgICAgICAgfQogICAgICAgICAgICAgc3dpdGNoIChhbHQ0KSB7CiAgICAgICAgICAgICAgICAgY2FzZSAxIDoKLSAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjU3OTQ6NTk6ICcjJyAoICggJ2InIHwgJ0InICkgKCAnaScgfCAnSScgKSB8ICggJ2wnIHwgJ0wnICkgKQorICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNzQwMDo1OTogJyMnICggKCAnYicgfCAnQicgKSAoICdpJyB8ICdJJyApIHwgKCAnbCcgfCAnTCcgKSApCiAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgbWF0Y2goJyMnKTsgCi0gICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI1Nzk0OjYzOiAoICggJ2InIHwgJ0InICkgKCAnaScgfCAnSScgKSB8ICggJ2wnIHwgJ0wnICkgKQorICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNzQwMDo2MzogKCAoICdiJyB8ICdCJyApICggJ2knIHwgJ0knICkgfCAoICdsJyB8ICdMJyApICkKICAgICAgICAgICAgICAgICAgICAgaW50IGFsdDM9MjsKICAgICAgICAgICAgICAgICAgICAgaW50IExBM18wID0gaW5wdXQuTEEoMSk7CiAKQEAgLTMyNTgsNyArMzUyMiw3IEBACiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChhbHQzKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDEgOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI1Nzk0OjY0OiAoICdiJyB8ICdCJyApICggJ2knIHwgJ0knICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNzQwMDo2NDogKCAnYicgfCAnQicgKSAoICdpJyB8ICdJJyApCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICggaW5wdXQuTEEoMSk9PSdCJ3x8aW5wdXQuTEEoMSk9PSdiJyApIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXQuY29uc3VtZSgpOwpAQCAtMzI4Miw3ICszNTQ2LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDIgOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI1Nzk0Ojg0OiAoICdsJyB8ICdMJyApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6Mjc0MDA6ODQ6ICggJ2wnIHwgJ0wnICkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCBpbnB1dC5MQSgxKT09J0wnfHxpbnB1dC5MQSgxKT09J2wnICkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dC5jb25zdW1lKCk7CkBAIC0zMzIxLDExICszNTg1LDExIEBACiAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICBpbnQgX3R5cGUgPSBSVUxFX0lOVDsKICAgICAgICAgICAgIGludCBfY2hhbm5lbCA9IERFRkFVTFRfVE9LRU5fQ0hBTk5FTDsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI1Nzk2OjEwOiAoICcwJyAuLiAnOScgKCAnMCcgLi4gJzknIHwgJ18nICkqICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI1Nzk2OjEyOiAnMCcgLi4gJzknICggJzAnIC4uICc5JyB8ICdfJyApKgorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6Mjc0MDI6MTA6ICggJzAnIC4uICc5JyAoICcwJyAuLiAnOScgfCAnXycgKSogKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6Mjc0MDI6MTI6ICcwJyAuLiAnOScgKCAnMCcgLi4gJzknIHwgJ18nICkqCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBtYXRjaFJhbmdlKCcwJywnOScpOyAKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI1Nzk2OjIxOiAoICcwJyAuLiAnOScgfCAnXycgKSoKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI3NDAyOjIxOiAoICcwJyAuLiAnOScgfCAnXycgKSoKICAgICAgICAgICAgIGxvb3A1OgogICAgICAgICAgICAgZG8gewogICAgICAgICAgICAgICAgIGludCBhbHQ1PTI7CkBAIC0zMzc0LDExICszNjM4LDExIEBACiAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICBpbnQgX3R5cGUgPSBSVUxFX0RFQ0lNQUw7CiAgICAgICAgICAgICBpbnQgX2NoYW5uZWwgPSBERUZBVUxUX1RPS0VOX0NIQU5ORUw7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNTc5ODoxNDogKCBSVUxFX0lOVCAoICggJ2UnIHwgJ0UnICkgKCAnKycgfCAnLScgKT8gUlVMRV9JTlQgKT8gKCAoICdiJyB8ICdCJyApICggJ2knIHwgJ0knIHwgJ2QnIHwgJ0QnICkgfCAoICdsJyB8ICdMJyB8ICdkJyB8ICdEJyB8ICdmJyB8ICdGJyApICk/ICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI1Nzk4OjE2OiBSVUxFX0lOVCAoICggJ2UnIHwgJ0UnICkgKCAnKycgfCAnLScgKT8gUlVMRV9JTlQgKT8gKCAoICdiJyB8ICdCJyApICggJ2knIHwgJ0knIHwgJ2QnIHwgJ0QnICkgfCAoICdsJyB8ICdMJyB8ICdkJyB8ICdEJyB8ICdmJyB8ICdGJyApICk/CisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNzQwNDoxNDogKCBSVUxFX0lOVCAoICggJ2UnIHwgJ0UnICkgKCAnKycgfCAnLScgKT8gUlVMRV9JTlQgKT8gKCAoICdiJyB8ICdCJyApICggJ2knIHwgJ0knIHwgJ2QnIHwgJ0QnICkgfCAoICdsJyB8ICdMJyB8ICdkJyB8ICdEJyB8ICdmJyB8ICdGJyApICk/ICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI3NDA0OjE2OiBSVUxFX0lOVCAoICggJ2UnIHwgJ0UnICkgKCAnKycgfCAnLScgKT8gUlVMRV9JTlQgKT8gKCAoICdiJyB8ICdCJyApICggJ2knIHwgJ0knIHwgJ2QnIHwgJ0QnICkgfCAoICdsJyB8ICdMJyB8ICdkJyB8ICdEJyB8ICdmJyB8ICdGJyApICk/CiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBtUlVMRV9JTlQoKTsgCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNTc5ODoyNTogKCAoICdlJyB8ICdFJyApICggJysnIHwgJy0nICk/IFJVTEVfSU5UICk/CisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNzQwNDoyNTogKCAoICdlJyB8ICdFJyApICggJysnIHwgJy0nICk/IFJVTEVfSU5UICk/CiAgICAgICAgICAgICBpbnQgYWx0Nz0yOwogICAgICAgICAgICAgaW50IExBN18wID0gaW5wdXQuTEEoMSk7CiAKQEAgLTMzODcsNyArMzY1MSw3IEBACiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBzd2l0Y2ggKGFsdDcpIHsKICAgICAgICAgICAgICAgICBjYXNlIDEgOgotICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNTc5ODoyNjogKCAnZScgfCAnRScgKSAoICcrJyB8ICctJyApPyBSVUxFX0lOVAorICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNzQwNDoyNjogKCAnZScgfCAnRScgKSAoICcrJyB8ICctJyApPyBSVUxFX0lOVAogICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgIGlmICggaW5wdXQuTEEoMSk9PSdFJ3x8aW5wdXQuTEEoMSk9PSdlJyApIHsKICAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0LmNvbnN1bWUoKTsKQEAgLTMzOTgsNyArMzY2Miw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICByZWNvdmVyKG1zZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBtc2U7fQogCi0gICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI1Nzk4OjM2OiAoICcrJyB8ICctJyApPworICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNzQwNDozNjogKCAnKycgfCAnLScgKT8KICAgICAgICAgICAgICAgICAgICAgaW50IGFsdDY9MjsKICAgICAgICAgICAgICAgICAgICAgaW50IExBNl8wID0gaW5wdXQuTEEoMSk7CiAKQEAgLTM0MzEsNyArMzY5NSw3IEBACiAKICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjU3OTg6NTg6ICggKCAnYicgfCAnQicgKSAoICdpJyB8ICdJJyB8ICdkJyB8ICdEJyApIHwgKCAnbCcgfCAnTCcgfCAnZCcgfCAnRCcgfCAnZicgfCAnRicgKSApPworICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6Mjc0MDQ6NTg6ICggKCAnYicgfCAnQicgKSAoICdpJyB8ICdJJyB8ICdkJyB8ICdEJyApIHwgKCAnbCcgfCAnTCcgfCAnZCcgfCAnRCcgfCAnZicgfCAnRicgKSApPwogICAgICAgICAgICAgaW50IGFsdDg9MzsKICAgICAgICAgICAgIGludCBMQThfMCA9IGlucHV0LkxBKDEpOwogCkBAIC0zNDQzLDcgKzM3MDcsNyBAQAogICAgICAgICAgICAgfQogICAgICAgICAgICAgc3dpdGNoIChhbHQ4KSB7CiAgICAgICAgICAgICAgICAgY2FzZSAxIDoKLSAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjU3OTg6NTk6ICggJ2InIHwgJ0InICkgKCAnaScgfCAnSScgfCAnZCcgfCAnRCcgKQorICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNzQwNDo1OTogKCAnYicgfCAnQicgKSAoICdpJyB8ICdJJyB8ICdkJyB8ICdEJyApCiAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgaWYgKCBpbnB1dC5MQSgxKT09J0InfHxpbnB1dC5MQSgxKT09J2InICkgewogICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXQuY29uc3VtZSgpOwpAQCAtMzQ2Nyw3ICszNzMxLDcgQEAKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICBjYXNlIDIgOgotICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNTc5ODo4NzogKCAnbCcgfCAnTCcgfCAnZCcgfCAnRCcgfCAnZicgfCAnRicgKQorICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNzQwNDo4NzogKCAnbCcgfCAnTCcgfCAnZCcgfCAnRCcgfCAnZicgfCAnRicgKQogICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgIGlmICggaW5wdXQuTEEoMSk9PSdEJ3x8aW5wdXQuTEEoMSk9PSdGJ3x8aW5wdXQuTEEoMSk9PSdMJ3x8aW5wdXQuTEEoMSk9PSdkJ3x8aW5wdXQuTEEoMSk9PSdmJ3x8aW5wdXQuTEEoMSk9PSdsJyApIHsKICAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0LmNvbnN1bWUoKTsKQEAgLTM1MDAsMTAgKzM3NjQsMTAgQEAKICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgIGludCBfdHlwZSA9IFJVTEVfSUQ7CiAgICAgICAgICAgICBpbnQgX2NoYW5uZWwgPSBERUZBVUxUX1RPS0VOX0NIQU5ORUw7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNTgwMDo5OiAoICggJ14nICk/ICggJ2EnIC4uICd6JyB8ICdBJyAuLiAnWicgfCAnJCcgfCAnXycgKSAoICdhJyAuLiAneicgfCAnQScgLi4gJ1onIHwgJyQnIHwgJ18nIHwgJzAnIC4uICc5JyApKiApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNTgwMDoxMTogKCAnXicgKT8gKCAnYScgLi4gJ3onIHwgJ0EnIC4uICdaJyB8ICckJyB8ICdfJyApICggJ2EnIC4uICd6JyB8ICdBJyAuLiAnWicgfCAnJCcgfCAnXycgfCAnMCcgLi4gJzknICkqCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNzQwNjo5OiAoICggJ14nICk/ICggJ2EnIC4uICd6JyB8ICdBJyAuLiAnWicgfCAnJCcgfCAnXycgKSAoICdhJyAuLiAneicgfCAnQScgLi4gJ1onIHwgJyQnIHwgJ18nIHwgJzAnIC4uICc5JyApKiApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNzQwNjoxMTogKCAnXicgKT8gKCAnYScgLi4gJ3onIHwgJ0EnIC4uICdaJyB8ICckJyB8ICdfJyApICggJ2EnIC4uICd6JyB8ICdBJyAuLiAnWicgfCAnJCcgfCAnXycgfCAnMCcgLi4gJzknICkqCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNTgwMDoxMTogKCAnXicgKT8KKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI3NDA2OjExOiAoICdeJyApPwogICAgICAgICAgICAgaW50IGFsdDk9MjsKICAgICAgICAgICAgIGludCBMQTlfMCA9IGlucHV0LkxBKDEpOwogCkBAIC0zNTEyLDcgKzM3NzYsNyBAQAogICAgICAgICAgICAgfQogICAgICAgICAgICAgc3dpdGNoIChhbHQ5KSB7CiAgICAgICAgICAgICAgICAgY2FzZSAxIDoKLSAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjU4MDA6MTE6ICdeJworICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNzQwNjoxMTogJ14nCiAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgbWF0Y2goJ14nKTsgCiAKQEAgLTM1MzAsNyArMzc5NCw3IEBACiAgICAgICAgICAgICAgICAgcmVjb3Zlcihtc2UpOwogICAgICAgICAgICAgICAgIHRocm93IG1zZTt9CiAKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI1ODAwOjQ0OiAoICdhJyAuLiAneicgfCAnQScgLi4gJ1onIHwgJyQnIHwgJ18nIHwgJzAnIC4uICc5JyApKgorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6Mjc0MDY6NDQ6ICggJ2EnIC4uICd6JyB8ICdBJyAuLiAnWicgfCAnJCcgfCAnXycgfCAnMCcgLi4gJzknICkqCiAgICAgICAgICAgICBsb29wMTA6CiAgICAgICAgICAgICBkbyB7CiAgICAgICAgICAgICAgICAgaW50IGFsdDEwPTI7CkBAIC0zNTc5LDEwICszODQzLDEwIEBACiAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICBpbnQgX3R5cGUgPSBSVUxFX1NUUklORzsKICAgICAgICAgICAgIGludCBfY2hhbm5lbCA9IERFRkFVTFRfVE9LRU5fQ0hBTk5FTDsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI1ODAyOjEzOiAoICggJ1wiJyAoICdcXFxcJyAuIHwgfiAoICggJ1xcXFwnIHwgJ1wiJyApICkgKSogKCAnXCInICk/IHwgJ1xcJycgKCAnXFxcXCcgLiB8IH4gKCAoICdcXFxcJyB8ICdcXCcnICkgKSApKiAoICdcXCcnICk/ICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjU4MDI6MTU6ICggJ1wiJyAoICdcXFxcJyAuIHwgfiAoICggJ1xcXFwnIHwgJ1wiJyApICkgKSogKCAnXCInICk/IHwgJ1xcJycgKCAnXFxcXCcgLiB8IH4gKCAoICdcXFxcJyB8ICdcXCcnICkgKSApKiAoICdcXCcnICk/ICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI3NDA4OjEzOiAoICggJ1wiJyAoICdcXFxcJyAuIHwgfiAoICggJ1xcXFwnIHwgJ1wiJyApICkgKSogKCAnXCInICk/IHwgJ1xcJycgKCAnXFxcXCcgLiB8IH4gKCAoICdcXFxcJyB8ICdcXCcnICkgKSApKiAoICdcXCcnICk/ICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6Mjc0MDg6MTU6ICggJ1wiJyAoICdcXFxcJyAuIHwgfiAoICggJ1xcXFwnIHwgJ1wiJyApICkgKSogKCAnXCInICk/IHwgJ1xcJycgKCAnXFxcXCcgLiB8IH4gKCAoICdcXFxcJyB8ICdcXCcnICkgKSApKiAoICdcXCcnICk/ICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI1ODAyOjE1OiAoICdcIicgKCAnXFxcXCcgLiB8IH4gKCAoICdcXFxcJyB8ICdcIicgKSApICkqICggJ1wiJyApPyB8ICdcXCcnICggJ1xcXFwnIC4gfCB+ICggKCAnXFxcXCcgfCAnXFwnJyApICkgKSogKCAnXFwnJyApPyApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNzQwODoxNTogKCAnXCInICggJ1xcXFwnIC4gfCB+ICggKCAnXFxcXCcgfCAnXCInICkgKSApKiAoICdcIicgKT8gfCAnXFwnJyAoICdcXFxcJyAuIHwgfiAoICggJ1xcXFwnIHwgJ1xcJycgKSApICkqICggJ1xcJycgKT8gKQogICAgICAgICAgICAgaW50IGFsdDE1PTI7CiAgICAgICAgICAgICBpbnQgTEExNV8wID0gaW5wdXQuTEEoMSk7CiAKQEAgLTM2MDAsMTAgKzM4NjQsMTAgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIHN3aXRjaCAoYWx0MTUpIHsKICAgICAgICAgICAgICAgICBjYXNlIDEgOgotICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNTgwMjoxNjogJ1wiJyAoICdcXFxcJyAuIHwgfiAoICggJ1xcXFwnIHwgJ1wiJyApICkgKSogKCAnXCInICk/CisgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI3NDA4OjE2OiAnXCInICggJ1xcXFwnIC4gfCB+ICggKCAnXFxcXCcgfCAnXCInICkgKSApKiAoICdcIicgKT8KICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICBtYXRjaCgnXCInKTsgCi0gICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI1ODAyOjIwOiAoICdcXFxcJyAuIHwgfiAoICggJ1xcXFwnIHwgJ1wiJyApICkgKSoKKyAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6Mjc0MDg6MjA6ICggJ1xcXFwnIC4gfCB+ICggKCAnXFxcXCcgfCAnXCInICkgKSApKgogICAgICAgICAgICAgICAgICAgICBsb29wMTE6CiAgICAgICAgICAgICAgICAgICAgIGRvIHsKICAgICAgICAgICAgICAgICAgICAgICAgIGludCBhbHQxMT0zOwpAQCAtMzYxOSw3ICszODgzLDcgQEAKIAogICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChhbHQxMSkgewogICAgICAgICAgICAgICAgICAgICAJY2FzZSAxIDoKLSAgICAgICAgICAgICAgICAgICAgCSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNTgwMjoyMTogJ1xcXFwnIC4KKyAgICAgICAgICAgICAgICAgICAgCSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNzQwODoyMTogJ1xcXFwnIC4KICAgICAgICAgICAgICAgICAgICAgCSAgICB7CiAgICAgICAgICAgICAgICAgICAgIAkgICAgbWF0Y2goJ1xcJyk7IAogICAgICAgICAgICAgICAgICAgICAJICAgIG1hdGNoQW55KCk7IApAQCAtMzYyNyw3ICszODkxLDcgQEAKICAgICAgICAgICAgICAgICAgICAgCSAgICB9CiAgICAgICAgICAgICAgICAgICAgIAkgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgIAljYXNlIDIgOgotICAgICAgICAgICAgICAgICAgICAJICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI1ODAyOjI4OiB+ICggKCAnXFxcXCcgfCAnXCInICkgKQorICAgICAgICAgICAgICAgICAgICAJICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI3NDA4OjI4OiB+ICggKCAnXFxcXCcgfCAnXCInICkgKQogICAgICAgICAgICAgICAgICAgICAJICAgIHsKICAgICAgICAgICAgICAgICAgICAgCSAgICBpZiAoIChpbnB1dC5MQSgxKT49J1x1MDAwMCcgJiYgaW5wdXQuTEEoMSk8PSchJyl8fChpbnB1dC5MQSgxKT49JyMnICYmIGlucHV0LkxBKDEpPD0nWycpfHwoaW5wdXQuTEEoMSk+PSddJyAmJiBpbnB1dC5MQSgxKTw9J1x1RkZGRicpICkgewogICAgICAgICAgICAgICAgICAgICAJICAgICAgICBpbnB1dC5jb25zdW1lKCk7CkBAIC0zNjQ3LDcgKzM5MTEsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICB9IHdoaWxlICh0cnVlKTsKIAotICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNTgwMjo0NDogKCAnXCInICk/CisgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI3NDA4OjQ0OiAoICdcIicgKT8KICAgICAgICAgICAgICAgICAgICAgaW50IGFsdDEyPTI7CiAgICAgICAgICAgICAgICAgICAgIGludCBMQTEyXzAgPSBpbnB1dC5MQSgxKTsKIApAQCAtMzY1Niw3ICszOTIwLDcgQEAKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKGFsdDEyKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDEgOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI1ODAyOjQ0OiAnXCInCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6Mjc0MDg6NDQ6ICdcIicKICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF0Y2goJ1wiJyk7IAogCkBAIC0zNjY5LDEwICszOTMzLDEwIEBACiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgY2FzZSAyIDoKLSAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjU4MDI6NDk6ICdcXCcnICggJ1xcXFwnIC4gfCB+ICggKCAnXFxcXCcgfCAnXFwnJyApICkgKSogKCAnXFwnJyApPworICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNzQwODo0OTogJ1xcJycgKCAnXFxcXCcgLiB8IH4gKCAoICdcXFxcJyB8ICdcXCcnICkgKSApKiAoICdcXCcnICk/CiAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgbWF0Y2goJ1wnJyk7IAotICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNTgwMjo1NDogKCAnXFxcXCcgLiB8IH4gKCAoICdcXFxcJyB8ICdcXCcnICkgKSApKgorICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNzQwODo1NDogKCAnXFxcXCcgLiB8IH4gKCAoICdcXFxcJyB8ICdcXCcnICkgKSApKgogICAgICAgICAgICAgICAgICAgICBsb29wMTM6CiAgICAgICAgICAgICAgICAgICAgIGRvIHsKICAgICAgICAgICAgICAgICAgICAgICAgIGludCBhbHQxMz0zOwpAQCAtMzY4OCw3ICszOTUyLDcgQEAKIAogICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChhbHQxMykgewogICAgICAgICAgICAgICAgICAgICAJY2FzZSAxIDoKLSAgICAgICAgICAgICAgICAgICAgCSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNTgwMjo1NTogJ1xcXFwnIC4KKyAgICAgICAgICAgICAgICAgICAgCSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNzQwODo1NTogJ1xcXFwnIC4KICAgICAgICAgICAgICAgICAgICAgCSAgICB7CiAgICAgICAgICAgICAgICAgICAgIAkgICAgbWF0Y2goJ1xcJyk7IAogICAgICAgICAgICAgICAgICAgICAJICAgIG1hdGNoQW55KCk7IApAQCAtMzY5Niw3ICszOTYwLDcgQEAKICAgICAgICAgICAgICAgICAgICAgCSAgICB9CiAgICAgICAgICAgICAgICAgICAgIAkgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgIAljYXNlIDIgOgotICAgICAgICAgICAgICAgICAgICAJICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI1ODAyOjYyOiB+ICggKCAnXFxcXCcgfCAnXFwnJyApICkKKyAgICAgICAgICAgICAgICAgICAgCSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNzQwODo2MjogfiAoICggJ1xcXFwnIHwgJ1xcJycgKSApCiAgICAgICAgICAgICAgICAgICAgIAkgICAgewogICAgICAgICAgICAgICAgICAgICAJICAgIGlmICggKGlucHV0LkxBKDEpPj0nXHUwMDAwJyAmJiBpbnB1dC5MQSgxKTw9JyYnKXx8KGlucHV0LkxBKDEpPj0nKCcgJiYgaW5wdXQuTEEoMSk8PSdbJyl8fChpbnB1dC5MQSgxKT49J10nICYmIGlucHV0LkxBKDEpPD0nXHVGRkZGJykgKSB7CiAgICAgICAgICAgICAgICAgICAgIAkgICAgICAgIGlucHV0LmNvbnN1bWUoKTsKQEAgLTM3MTYsNyArMzk4MCw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIH0gd2hpbGUgKHRydWUpOwogCi0gICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI1ODAyOjc5OiAoICdcXCcnICk/CisgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI3NDA4Ojc5OiAoICdcXCcnICk/CiAgICAgICAgICAgICAgICAgICAgIGludCBhbHQxND0yOwogICAgICAgICAgICAgICAgICAgICBpbnQgTEExNF8wID0gaW5wdXQuTEEoMSk7CiAKQEAgLTM3MjUsNyArMzk4OSw3IEBACiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChhbHQxNCkgewogICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxIDoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNTgwMjo3OTogJ1xcJycKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNzQwODo3OTogJ1xcJycKICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF0Y2goJ1wnJyk7IAogCkBAIC0zNzU2LDEyICs0MDIwLDEyIEBACiAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICBpbnQgX3R5cGUgPSBSVUxFX01MX0NPTU1FTlQ7CiAgICAgICAgICAgICBpbnQgX2NoYW5uZWwgPSBERUZBVUxUX1RPS0VOX0NIQU5ORUw7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNTgwNDoxNzogKCAnLyonICggb3B0aW9ucyB7Z3JlZWR5PWZhbHNlOyB9IDogLiApKiAnKi8nICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI1ODA0OjE5OiAnLyonICggb3B0aW9ucyB7Z3JlZWR5PWZhbHNlOyB9IDogLiApKiAnKi8nCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNzQxMDoxNzogKCAnLyonICggb3B0aW9ucyB7Z3JlZWR5PWZhbHNlOyB9IDogLiApKiAnKi8nICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI3NDEwOjE5OiAnLyonICggb3B0aW9ucyB7Z3JlZWR5PWZhbHNlOyB9IDogLiApKiAnKi8nCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBtYXRjaCgiLyoiKTsgCiAKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI1ODA0OjI0OiAoIG9wdGlvbnMge2dyZWVkeT1mYWxzZTsgfSA6IC4gKSoKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI3NDEwOjI0OiAoIG9wdGlvbnMge2dyZWVkeT1mYWxzZTsgfSA6IC4gKSoKICAgICAgICAgICAgIGxvb3AxNjoKICAgICAgICAgICAgIGRvIHsKICAgICAgICAgICAgICAgICBpbnQgYWx0MTY9MjsKQEAgLTM3ODYsNyArNDA1MCw3IEBACiAKICAgICAgICAgICAgICAgICBzd2l0Y2ggKGFsdDE2KSB7CiAgICAgICAgICAgICAJY2FzZSAxIDoKLSAgICAgICAgICAgIAkgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjU4MDQ6NTI6IC4KKyAgICAgICAgICAgIAkgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6Mjc0MTA6NTI6IC4KICAgICAgICAgICAgIAkgICAgewogICAgICAgICAgICAgCSAgICBtYXRjaEFueSgpOyAKIApAQCAtMzgxNiwxMiArNDA4MCwxMiBAQAogICAgICAgICB0cnkgewogICAgICAgICAgICAgaW50IF90eXBlID0gUlVMRV9TTF9DT01NRU5UOwogICAgICAgICAgICAgaW50IF9jaGFubmVsID0gREVGQVVMVF9UT0tFTl9DSEFOTkVMOwotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjU4MDY6MTc6ICggJy8vJyAofiAoICggJ1xcbicgfCAnXFxyJyApICkgKSogKCAoICdcXHInICk/ICdcXG4nICk/ICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI1ODA2OjE5OiAnLy8nICh+ICggKCAnXFxuJyB8ICdcXHInICkgKSApKiAoICggJ1xccicgKT8gJ1xcbicgKT8KKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI3NDEyOjE3OiAoICcvLycgKH4gKCAoICdcXG4nIHwgJ1xccicgKSApICkqICggKCAnXFxyJyApPyAnXFxuJyApPyApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNzQxMjoxOTogJy8vJyAofiAoICggJ1xcbicgfCAnXFxyJyApICkgKSogKCAoICdcXHInICk/ICdcXG4nICk/CiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBtYXRjaCgiLy8iKTsgCiAKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI1ODA2OjI0OiAofiAoICggJ1xcbicgfCAnXFxyJyApICkgKSoKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI3NDEyOjI0OiAofiAoICggJ1xcbicgfCAnXFxyJyApICkgKSoKICAgICAgICAgICAgIGxvb3AxNzoKICAgICAgICAgICAgIGRvIHsKICAgICAgICAgICAgICAgICBpbnQgYWx0MTc9MjsKQEAgLTM4MzQsNyArNDA5OCw3IEBACiAKICAgICAgICAgICAgICAgICBzd2l0Y2ggKGFsdDE3KSB7CiAgICAgICAgICAgICAJY2FzZSAxIDoKLSAgICAgICAgICAgIAkgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjU4MDY6MjQ6IH4gKCAoICdcXG4nIHwgJ1xccicgKSApCisgICAgICAgICAgICAJICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI3NDEyOjI0OiB+ICggKCAnXFxuJyB8ICdcXHInICkgKQogICAgICAgICAgICAgCSAgICB7CiAgICAgICAgICAgICAJICAgIGlmICggKGlucHV0LkxBKDEpPj0nXHUwMDAwJyAmJiBpbnB1dC5MQSgxKTw9J1x0Jyl8fChpbnB1dC5MQSgxKT49J1x1MDAwQicgJiYgaW5wdXQuTEEoMSk8PSdcZicpfHwoaW5wdXQuTEEoMSk+PSdcdTAwMEUnICYmIGlucHV0LkxBKDEpPD0nXHVGRkZGJykgKSB7CiAgICAgICAgICAgICAJICAgICAgICBpbnB1dC5jb25zdW1lKCk7CkBAIC0zODU0LDcgKzQxMTgsNyBAQAogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0gd2hpbGUgKHRydWUpOwogCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNTgwNjo0MDogKCAoICdcXHInICk/ICdcXG4nICk/CisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNzQxMjo0MDogKCAoICdcXHInICk/ICdcXG4nICk/CiAgICAgICAgICAgICBpbnQgYWx0MTk9MjsKICAgICAgICAgICAgIGludCBMQTE5XzAgPSBpbnB1dC5MQSgxKTsKIApAQCAtMzg2Myw5ICs0MTI3LDkgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIHN3aXRjaCAoYWx0MTkpIHsKICAgICAgICAgICAgICAgICBjYXNlIDEgOgotICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNTgwNjo0MTogKCAnXFxyJyApPyAnXFxuJworICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNzQxMjo0MTogKCAnXFxyJyApPyAnXFxuJwogICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI1ODA2OjQxOiAoICdcXHInICk/CisgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI3NDEyOjQxOiAoICdcXHInICk/CiAgICAgICAgICAgICAgICAgICAgIGludCBhbHQxOD0yOwogICAgICAgICAgICAgICAgICAgICBpbnQgTEExOF8wID0gaW5wdXQuTEEoMSk7CiAKQEAgLTM4NzQsNyArNDEzOCw3IEBACiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChhbHQxOCkgewogICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxIDoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNTgwNjo0MTogJ1xccicKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNzQxMjo0MTogJ1xccicKICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF0Y2goJ1xyJyk7IAogCkBAIC0zOTA2LDEwICs0MTcwLDEwIEBACiAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICBpbnQgX3R5cGUgPSBSVUxFX1dTOwogICAgICAgICAgICAgaW50IF9jaGFubmVsID0gREVGQVVMVF9UT0tFTl9DSEFOTkVMOwotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjU4MDg6OTogKCAoICcgJyB8ICdcXHQnIHwgJ1xccicgfCAnXFxuJyApKyApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNTgwODoxMTogKCAnICcgfCAnXFx0JyB8ICdcXHInIHwgJ1xcbicgKSsKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI3NDE0Ojk6ICggKCAnICcgfCAnXFx0JyB8ICdcXHInIHwgJ1xcbicgKSsgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6Mjc0MTQ6MTE6ICggJyAnIHwgJ1xcdCcgfCAnXFxyJyB8ICdcXG4nICkrCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNTgwODoxMTogKCAnICcgfCAnXFx0JyB8ICdcXHInIHwgJ1xcbicgKSsKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI3NDE0OjExOiAoICcgJyB8ICdcXHQnIHwgJ1xccicgfCAnXFxuJyApKwogICAgICAgICAgICAgaW50IGNudDIwPTA7CiAgICAgICAgICAgICBsb29wMjA6CiAgICAgICAgICAgICBkbyB7CkBAIC0zOTYzLDggKzQyMjcsOCBAQAogICAgICAgICB0cnkgewogICAgICAgICAgICAgaW50IF90eXBlID0gUlVMRV9BTllfT1RIRVI7CiAgICAgICAgICAgICBpbnQgX2NoYW5uZWwgPSBERUZBVUxUX1RPS0VOX0NIQU5ORUw7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNTgxMDoxNjogKCAuICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI1ODEwOjE4OiAuCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNzQxNjoxNjogKCAuICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI3NDE2OjE4OiAuCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBtYXRjaEFueSgpOyAKIApAQCAtMzk3OSw4ICs0MjQzLDggQEAKICAgICAvLyAkQU5UTFIgZW5kICJSVUxFX0FOWV9PVEhFUiIKIAogICAgIHB1YmxpYyB2b2lkIG1Ub2tlbnMoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewotICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxOjg6ICggVF9fMTMgfCBUX18xNCB8IFRfXzE1IHwgVF9fMTYgfCBUX18xNyB8IFRfXzE4IHwgVF9fMTkgfCBUX18yMCB8IFRfXzIxIHwgVF9fMjIgfCBUX18yMyB8IFRfXzI0IHwgVF9fMjUgfCBUX18yNiB8IFRfXzI3IHwgVF9fMjggfCBUX18yOSB8IFRfXzMwIHwgVF9fMzEgfCBUX18zMiB8IFRfXzMzIHwgVF9fMzQgfCBUX18zNSB8IFRfXzM2IHwgVF9fMzcgfCBUX18zOCB8IFRfXzM5IHwgVF9fNDAgfCBUX180MSB8IFRfXzQyIHwgVF9fNDMgfCBUX180NCB8IFRfXzQ1IHwgVF9fNDYgfCBUX180NyB8IFRfXzQ4IHwgVF9fNDkgfCBUX181MCB8IFRfXzUxIHwgVF9fNTIgfCBUX181MyB8IFRfXzU0IHwgVF9fNTUgfCBUX181NiB8IFRfXzU3IHwgVF9fNTggfCBUX181OSB8IFRfXzYwIHwgVF9fNjEgfCBUX182MiB8IFRfXzYzIHwgVF9fNjQgfCBUX182NSB8IFRfXzY2IHwgVF9fNjcgfCBUX182OCB8IFRfXzY5IHwgVF9fNzAgfCBUX183MSB8IFRfXzcyIHwgVF9fNzMgfCBUX183NCB8IFRfXzc1IHwgVF9fNzYgfCBUX183NyB8IFRfXzc4IHwgVF9fNzkgfCBUX184MCB8IFRfXzgxIHwgVF9fODIgfCBUX184MyB8IFRfXzg0IHwgVF9fODUgfCBUX184NiB8IFRfXzg3IHwgVF9fODggfCBUX184OSB8IFRfXzkwIHwgVF9fOTEgfCBUX185MiB8IFRfXzkzIHwgVF9fOTQgfCBUX185NSB8IFRfXzk2IHwgVF9fOTcgfCBUX185OCB8IFRfXzk5IHwgVF9fMTAwIHwgVF9fMTAxIHwgVF9fMTAyIHwgVF9fMTAzIHwgVF9fMTA0IHwgVF9fMTA1IHwgVF9fMTA2IHwgVF9fMTA3IHwgVF9fMTA4IHwgVF9fMTA5IHwgVF9fMTEwIHwgVF9fMTExIHwgVF9fMTEyIHwgVF9fMTEzIHwgVF9fMTE0IHwgVF9fMTE1IHwgVF9fMTE2IHwgVF9fMTE3IHwgVF9fMTE4IHwgVF9fMTE5IHwgVF9fMTIwIHwgVF9fMTIxIHwgVF9fMTIyIHwgVF9fMTIzIHwgVF9fMTI0IHwgVF9fMTI1IHwgVF9fMTI2IHwgVF9fMTI3IHwgVF9fMTI4IHwgVF9fMTI5IHwgVF9fMTMwIHwgVF9fMTMxIHwgVF9fMTMyIHwgVF9fMTMzIHwgVF9fMTM0IHwgVF9fMTM1IHwgVF9fMTM2IHwgVF9fMTM3IHwgVF9fMTM4IHwgVF9fMTM5IHwgVF9fMTQwIHwgVF9fMTQxIHwgVF9fMTQyIHwgVF9fMTQzIHwgVF9fMTQ0IHwgVF9fMTQ1IHwgVF9fMTQ2IHwgVF9fMTQ3IHwgVF9fMTQ4IHwgVF9fMTQ5IHwgVF9fMTUwIHwgVF9fMTUxIHwgVF9fMTUyIHwgVF9fMTUzIHwgVF9fMTU0IHwgUlVMRV9IRVggfCBSVUxFX0lOVCB8IFJVTEVfREVDSU1BTCB8IFJVTEVfSUQgfCBSVUxFX1NUUklORyB8IFJVTEVfTUxfQ09NTUVOVCB8IFJVTEVfU0xfQ09NTUVOVCB8IFJVTEVfV1MgfCBSVUxFX0FOWV9PVEhFUiApCi0gICAgICAgIGludCBhbHQyMT0xNTE7CisgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE6ODogKCBUX18xMyB8IFRfXzE0IHwgVF9fMTUgfCBUX18xNiB8IFRfXzE3IHwgVF9fMTggfCBUX18xOSB8IFRfXzIwIHwgVF9fMjEgfCBUX18yMiB8IFRfXzIzIHwgVF9fMjQgfCBUX18yNSB8IFRfXzI2IHwgVF9fMjcgfCBUX18yOCB8IFRfXzI5IHwgVF9fMzAgfCBUX18zMSB8IFRfXzMyIHwgVF9fMzMgfCBUX18zNCB8IFRfXzM1IHwgVF9fMzYgfCBUX18zNyB8IFRfXzM4IHwgVF9fMzkgfCBUX180MCB8IFRfXzQxIHwgVF9fNDIgfCBUX180MyB8IFRfXzQ0IHwgVF9fNDUgfCBUX180NiB8IFRfXzQ3IHwgVF9fNDggfCBUX180OSB8IFRfXzUwIHwgVF9fNTEgfCBUX181MiB8IFRfXzUzIHwgVF9fNTQgfCBUX181NSB8IFRfXzU2IHwgVF9fNTcgfCBUX181OCB8IFRfXzU5IHwgVF9fNjAgfCBUX182MSB8IFRfXzYyIHwgVF9fNjMgfCBUX182NCB8IFRfXzY1IHwgVF9fNjYgfCBUX182NyB8IFRfXzY4IHwgVF9fNjkgfCBUX183MCB8IFRfXzcxIHwgVF9fNzIgfCBUX183MyB8IFRfXzc0IHwgVF9fNzUgfCBUX183NiB8IFRfXzc3IHwgVF9fNzggfCBUX183OSB8IFRfXzgwIHwgVF9fODEgfCBUX184MiB8IFRfXzgzIHwgVF9fODQgfCBUX184NSB8IFRfXzg2IHwgVF9fODcgfCBUX184OCB8IFRfXzg5IHwgVF9fOTAgfCBUX185MSB8IFRfXzkyIHwgVF9fOTMgfCBUX185NCB8IFRfXzk1IHwgVF9fOTYgfCBUX185NyB8IFRfXzk4IHwgVF9fOTkgfCBUX18xMDAgfCBUX18xMDEgfCBUX18xMDIgfCBUX18xMDMgfCBUX18xMDQgfCBUX18xMDUgfCBUX18xMDYgfCBUX18xMDcgfCBUX18xMDggfCBUX18xMDkgfCBUX18xMTAgfCBUX18xMTEgfCBUX18xMTIgfCBUX18xMTMgfCBUX18xMTQgfCBUX18xMTUgfCBUX18xMTYgfCBUX18xMTcgfCBUX18xMTggfCBUX18xMTkgfCBUX18xMjAgfCBUX18xMjEgfCBUX18xMjIgfCBUX18xMjMgfCBUX18xMjQgfCBUX18xMjUgfCBUX18xMjYgfCBUX18xMjcgfCBUX18xMjggfCBUX18xMjkgfCBUX18xMzAgfCBUX18xMzEgfCBUX18xMzIgfCBUX18xMzMgfCBUX18xMzQgfCBUX18xMzUgfCBUX18xMzYgfCBUX18xMzcgfCBUX18xMzggfCBUX18xMzkgfCBUX18xNDAgfCBUX18xNDEgfCBUX18xNDIgfCBUX18xNDMgfCBUX18xNDQgfCBUX18xNDUgfCBUX18xNDYgfCBUX18xNDcgfCBUX18xNDggfCBUX18xNDkgfCBUX18xNTAgfCBUX18xNTEgfCBUX18xNTIgfCBUX18xNTMgfCBUX18xNTQgfCBUX18xNTUgfCBUX18xNTYgfCBUX18xNTcgfCBUX18xNTggfCBUX18xNTkgfCBUX18xNjAgfCBUX18xNjEgfCBUX18xNjIgfCBUX18xNjMgfCBUX18xNjQgfCBUX18xNjUgfCBUX18xNjYgfCBSVUxFX0hFWCB8IFJVTEVfSU5UIHwgUlVMRV9ERUNJTUFMIHwgUlVMRV9JRCB8IFJVTEVfU1RSSU5HIHwgUlVMRV9NTF9DT01NRU5UIHwgUlVMRV9TTF9DT01NRU5UIHwgUlVMRV9XUyB8IFJVTEVfQU5ZX09USEVSICkKKyAgICAgICAgaW50IGFsdDIxPTE2MzsKICAgICAgICAgYWx0MjEgPSBkZmEyMS5wcmVkaWN0KGlucHV0KTsKICAgICAgICAgc3dpdGNoIChhbHQyMSkgewogICAgICAgICAgICAgY2FzZSAxIDoKQEAgLTQ5NzgsNjMgKzUyNDIsMTQ3IEBACiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgY2FzZSAxNDMgOgotICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE6OTE3OiBSVUxFX0hFWAorICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE6OTE3OiBUX18xNTUKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbVRfXzE1NSgpOyAKKworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMTQ0IDoKKyAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxOjkyNDogVF9fMTU2CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG1UX18xNTYoKTsgCisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDE0NSA6CisgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTo5MzE6IFRfXzE1NworICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBtVF9fMTU3KCk7IAorCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAxNDYgOgorICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE6OTM4OiBUX18xNTgKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbVRfXzE1OCgpOyAKKworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMTQ3IDoKKyAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxOjk0NTogVF9fMTU5CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG1UX18xNTkoKTsgCisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDE0OCA6CisgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTo5NTI6IFRfXzE2MAorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBtVF9fMTYwKCk7IAorCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAxNDkgOgorICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE6OTU5OiBUX18xNjEKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbVRfXzE2MSgpOyAKKworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMTUwIDoKKyAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxOjk2NjogVF9fMTYyCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG1UX18xNjIoKTsgCisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDE1MSA6CisgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTo5NzM6IFRfXzE2MworICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBtVF9fMTYzKCk7IAorCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAxNTIgOgorICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE6OTgwOiBUX18xNjQKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbVRfXzE2NCgpOyAKKworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMTUzIDoKKyAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxOjk4NzogVF9fMTY1CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG1UX18xNjUoKTsgCisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDE1NCA6CisgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTo5OTQ6IFRfXzE2NgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBtVF9fMTY2KCk7IAorCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAxNTUgOgorICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE6MTAwMTogUlVMRV9IRVgKICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgbVJVTEVfSEVYKCk7IAogCiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSAxNDQgOgotICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE6OTI2OiBSVUxFX0lOVAorICAgICAgICAgICAgY2FzZSAxNTYgOgorICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE6MTAxMDogUlVMRV9JTlQKICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgbVJVTEVfSU5UKCk7IAogCiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSAxNDUgOgotICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE6OTM1OiBSVUxFX0RFQ0lNQUwKKyAgICAgICAgICAgIGNhc2UgMTU3IDoKKyAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxOjEwMTk6IFJVTEVfREVDSU1BTAogICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICBtUlVMRV9ERUNJTUFMKCk7IAogCiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSAxNDYgOgotICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE6OTQ4OiBSVUxFX0lECisgICAgICAgICAgICBjYXNlIDE1OCA6CisgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MToxMDMyOiBSVUxFX0lECiAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIG1SVUxFX0lEKCk7IAogCiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSAxNDcgOgotICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE6OTU2OiBSVUxFX1NUUklORworICAgICAgICAgICAgY2FzZSAxNTkgOgorICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE6MTA0MDogUlVMRV9TVFJJTkcKICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgbVJVTEVfU1RSSU5HKCk7IAogCiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSAxNDggOgotICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE6OTY4OiBSVUxFX01MX0NPTU1FTlQKKyAgICAgICAgICAgIGNhc2UgMTYwIDoKKyAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxOjEwNTI6IFJVTEVfTUxfQ09NTUVOVAogICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICBtUlVMRV9NTF9DT01NRU5UKCk7IAogCiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSAxNDkgOgotICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE6OTg0OiBSVUxFX1NMX0NPTU1FTlQKKyAgICAgICAgICAgIGNhc2UgMTYxIDoKKyAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxOjEwNjg6IFJVTEVfU0xfQ09NTUVOVAogICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICBtUlVMRV9TTF9DT01NRU5UKCk7IAogCiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSAxNTAgOgotICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE6MTAwMDogUlVMRV9XUworICAgICAgICAgICAgY2FzZSAxNjIgOgorICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE6MTA4NDogUlVMRV9XUwogICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICBtUlVMRV9XUygpOyAKIAogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgMTUxIDoKLSAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxOjEwMDg6IFJVTEVfQU5ZX09USEVSCisgICAgICAgICAgICBjYXNlIDE2MyA6CisgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MToxMDkyOiBSVUxFX0FOWV9PVEhFUgogICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICBtUlVMRV9BTllfT1RIRVIoKTsgCiAKQEAgLTUwNDgsNjIgKzUzOTYsNjMgQEAKIAogICAgIHByb3RlY3RlZCBERkEyMSBkZmEyMSA9IG5ldyBERkEyMSh0aGlzKTsKICAgICBzdGF0aWMgZmluYWwgU3RyaW5nIERGQTIxX2VvdFMgPQotICAgICAgICAiXDFcdWZmZmZcMVw3N1wxXDEwMVwxXDEwM1wxXDEwNlwxXDExMlwxXDExNVwxXDEyMVwxXDEyM1wxXDEyNVwxXDEyN1wxXDEzMVwxXDEzM1wxXDEzNlwyMlwxNDFcMlx1ZmZmZlwxMlwxNDFcMTBcdWZmZmZcMVx1MDBhYVwyXHUwMGFkXDFcNzRcNVx1ZmZmZlwxXHUwMGIyXDI2XHVmZmZmXDFcdTAwYjRcNVx1ZmZmZlwxXHUwMGI2XDRcdWZmZmZcMlwxNDFcMVx1ZmZmZlwxMlwxNDFcMVx1MDBjOVwyMFwxNDFcMVx1MDBkZFwxM1wxNDFcMVx1MDBlYlwzXDE0MVwyXHVmZmZmXDRcMTQxXDFcdTAwZjdcNFwxNDFcMVx1MDBmY1w2XDE0MVwxXHUwMTA3XDFcMTQxXDEzXHVmZmZmXDFcdTAwYWRcMTJcdWZmZmZcMVx1MDEwYVwxXHUwMTBiXDIwXDE0MVwxXHVmZmZmXDNcMTQxXDFcdTAxMjBcMlwxNDFcMVx1MDEyM1wxXHUwMTI0XDRcMTQxXDFcdTAxMjlcMlwxNDFcMVx1MDEyZlwzXDE0MVwxXHVmZmZmXDEwXDE0MVwxXHUwMTNiXDRcMTQxXDFcdWZmZmZcMlwxNDFcMVx1MDE0MlwxXDE0MVwxXHUwMTQ0XDJcMTQxXDFcdTAxNDdcM1wxNDFcMVx1ZmZmZlwyXDE0MVwxXHUwMTRkXDFcMTQxXDFcdWZmZmZcNlwxNDFcMVx1MDE1NlwzXDE0MVwxXHVmZmZmXDJcMTQxXDJcdWZmZmZcNFwxNDFcMVx1MDE2MFwxNFwxNDFcMVx1MDE2ZFwyXDE0MVwxXHVmZmZmXDFcdTAxNzBcMVwxNDFcMlx1ZmZmZlwyXDE0MVwxXHUwMTc0XDFcMTQxXDFcdWZmZmZcMVx1MDE3Nlw0XDE0MVwxXHVmZmZmXDdcMTQxXDFcdTAxODNcM1wxNDFcMVx1ZmZmZlw2XDE0MVwxXHVmZmZmXDFcdTAxOGRcMVx1ZmZmZlwyXDE0MVwxXHVmZmZmXDVcMTQxXDFcdWZmZmZcMVx1MDE5NVwyXDE0MVwxXHUwMTk4XDFcdTAxOTlcMlwxNDFcMVx1MDE5Y1wxXHVmZmZmXDFcdTAxOWRcMTBcMTQxXDFcdWZmZmZcM1wxNDFcMVx1MDFhYVw3XDE0MVwxXHUwMWIyXDFcdWZmZmZcMlwxNDFcMVx1ZmZmZlwxXHUwMWI1XDJcMTQxXDFcdWZmZmZcMVwxNDFcMVx1ZmZmZlwxXHUwMWI5XDFcMTQxXDFcdTAxYmJcMTFcMTQxXDFcdWZmZmZcNlwxNDFcMVx1MDFjY1wxXDE0MVwxXHUwMWNlXDFcdWZmZmZcN1wxNDFcMVx1ZmZmZlwyXDE0MVwyXHVmZmZmXDFcdTAxZDhcMVwxNDFcMlx1ZmZmZlwxXHUwMWRhXDExXDE0MVwxXHUwMWU0XDFcdTAxZTVcMVx1ZmZmZlwxXDE0MVwxXHUwMWU3XDFcMTQxXDFcdTAxZTlcMlwxNDFcMVx1MDFlY1wxXHVmZmZmXDFcMTQxXDFcdTAxZWVcMVx1ZmZmZlwzXDE0MVwxXHVmZmZmXDFcMTQxXDFcdWZmZmZcMlwxNDFcMVx1MDFmN1wyXDE0MVwxXHVmZmZmXDVcMTQxXDFcdTAxZmZcMVwxNDFcMVx1MDIwMVwxXHUwMjAyXDFcdTAyMDNcMVx1ZmZmZlwxXHUwMjA0XDFcdWZmZmZcMVx1MDIwNVwxXHUwMjA2XDZcMTQxXDFcdTAyMGRcMVx1ZmZmZlwxXDE0MVwxXHVmZmZmXDFcdTAyMGZcM1wxNDFcMVx1MDIxM1w0XDE0MVwyXHVmZmZmXDFcMTQxXDFcdWZmZmZcMVwxNDFcMVx1ZmZmZlwyXDE0MVwxXHVmZmZmXDFcdTAyMWNcMVx1ZmZmZlwxXHUwMjFkXDFcdTAyMWVcMVwxNDFcMVx1MDIyMVwxXHUwMjIyXDNcMTQxXDFcdWZmZmZcMlwxNDFcMVx1MDIyOFw0XDE0MVwxXHVmZmZmXDFcMTQxXDZcdWZmZmZcMVwxNDFcMVx1MDIyZlw0XDE0MVwxXHVmZmZmXDFcMTQxXDFcdWZmZmZcMVwxNDFcMVx1MDIzN1wxXDE0MVwxXHVmZmZmXDNcMTQxXDFcdTAyM2NcNFwxNDFcM1x1ZmZmZlwxXHUwMjQxXDFcMTQxXDJcdWZmZmZcM1wxNDFcMVx1MDI0NlwxXHUwMjQ3XDFcdWZmZmZcNlwxNDFcMVx1ZmZmZlwyXDE0MVwxXHUwMjUwXDFcdTAyNTFcM1wxNDFcMVx1ZmZmZlwxXDE0MVwxXHUwMjU2XDJcMTQxXDFcdWZmZmZcMVx1MDI1OVwzXDE0MVwxXHVmZmZmXDRcMTQxXDJcdWZmZmZcMVwxNDFcMVx1MDI2MlwzXDE0MVwxXHUwMjY2XDJcMTQxXDJcdWZmZmZcMVx1MDI2OVwyXDE0MVwxXHUwMjZjXDFcdWZmZmZcMVx1MDI2ZFwxXDE0MVwxXHVmZmZmXDJcMTQxXDFcdTAyNzFcMlwxNDFcMVx1MDI3NFwyXDE0MVwxXHVmZmZmXDNcMTQxXDFcdWZmZmZcMlwxNDFcMVx1ZmZmZlwyXDE0MVwyXHVmZmZmXDFcdTAyN2VcMVwxNDFcMVx1MDI4MFwxXHVmZmZmXDJcMTQxXDFcdWZmZmZcMVwxNDFcMVx1MDI4NFwzXDE0MVwxXHUwMjg4XDNcMTQxXDFcdWZmZmZcMVx1MDI4Y1wxXHVmZmZmXDFcdTAyOGRcMVwxNDFcMVx1MDI4ZlwxXHVmZmZmXDFcMTQxXDFcdTAyOTFcMVwxNDFcMVx1ZmZmZlwzXDE0MVwyXHVmZmZmXDFcMTQxXDFcdWZmZmZcMVwxNDFcMVx1ZmZmZlwyXDE0MVwxXHUwMjlhXDFcMTQxXDFcdTAyOWNcMVwxNDFcMVx1MDI5ZVwxXHUwMjlmXDFcdWZmZmZcMVwxNDFcMVx1ZmZmZlwxXDE0MVwyXHVmZmZmXDEyXDE0MVwxXHUwMmFjXDFcMTQxXDFcdWZmZmZcNVwxNDFcMVx1MDJiM1wxXHVmZmZmIjsKKyAgICAgICAgIlwxXHVmZmZmXDFcMTAwXDFcMTAyXDFcMTA0XDFcMTA3XDFcMTEzXDFcMTE2XDFcMTIyXDFcMTI0XDFcMTI2XDFcMTMwXDFcMTMzXDFcMTM1XDFcMTQwXDIzXDE0M1wyXHVmZmZmXDEyXDE0M1wxMFx1ZmZmZlwxXHUwMGIxXDJcdTAwYjRcMVw3NVw1XHVmZmZmXDFcdTAwYjlcMjZcdWZmZmZcMVx1MDBiYlw2XHVmZmZmXDFcdTAwYmRcNFx1ZmZmZlwyXDE0M1wxXHVmZmZmXDEzXDE0M1wxXHUwMGQxXDIwXDE0M1wxXHUwMGU1XDFcdTAwZTZcMTNcMTQzXDFcdTAwZjZcMlwxNDNcMVx1MDBmOVwzXDE0M1wyXHVmZmZmXDVcMTQzXDFcdTAxMDZcNFwxNDNcMVx1MDEwYlw3XDE0M1wxM1x1ZmZmZlwxXHUwMGI0XDEyXHVmZmZmXDFcdTAxMThcMVx1MDExOVwyMVwxNDNcMVx1ZmZmZlwzXDE0M1wxXHUwMTMxXDJcMTQzXDFcdTAxMzRcMVx1MDEzNVw0XDE0M1wxXHUwMTNhXDJcMTQzXDFcdTAxNDBcM1wxNDNcMlx1ZmZmZlwxMFwxNDNcMVx1MDE0Y1wxXDE0M1wxXHUwMTRlXDJcMTQzXDFcdTAxNTFcMVwxNDNcMVx1ZmZmZlwyXDE0M1wxXHVmZmZmXDJcMTQzXDFcdTAxNTdcMVwxNDNcMVx1MDE1OVwzXDE0M1wxXHUwMTVkXDNcMTQzXDFcdWZmZmZcMlwxNDNcMVx1MDE2NFwxXDE0M1wxXHVmZmZmXDZcMTQzXDFcdTAxNmRcNVwxNDNcMlx1ZmZmZlw1XDE0M1wxXHUwMTc5XDE2XDE0M1wxXHUwMTg4XDJcMTQzXDFcdWZmZmZcMVx1MDE4YlwxXDE0M1wyXHVmZmZmXDJcMTQzXDFcdTAxOGZcMVwxNDNcMVx1ZmZmZlwxXHUwMTkxXDRcMTQzXDFcdWZmZmZcN1wxNDNcMVx1MDE5ZVwzXDE0M1wxXHVmZmZmXDFcMTQzXDFcdWZmZmZcMlwxNDNcMVx1ZmZmZlw1XDE0M1wxXHVmZmZmXDFcdTAxYWFcMVx1ZmZmZlwzXDE0M1wxXHVmZmZmXDZcMTQzXDFcdWZmZmZcMVx1MDFiNFwyXDE0M1wxXHUwMWI3XDFcdTAxYjhcMlwxNDNcMVx1MDFiYlwxXHVmZmZmXDFcdTAxYmNcMlwxNDNcMVx1MDFiZlw3XDE0M1wxXHVmZmZmXDNcMTQzXDFcdTAxY2JcMTFcMTQzXDFcdTAxZDVcMVx1ZmZmZlwyXDE0M1wxXHVmZmZmXDFcdTAxZDhcMlwxNDNcMVx1ZmZmZlwxXDE0M1wxXHVmZmZmXDFcdTAxZGNcMVwxNDNcMVx1MDFkZVwxMVwxNDNcMVx1ZmZmZlwxMFwxNDNcMVx1MDFmMVwxXDE0M1wxXHUwMWYzXDFcdWZmZmZcMTFcMTQzXDFcdWZmZmZcMlwxNDNcMlx1ZmZmZlwxXHUwMWZmXDFcMTQzXDJcdWZmZmZcMVx1MDIwMVwxXHUwMjAyXDFcdWZmZmZcNVwxNDNcMVx1MDIwOFwzXDE0M1wxXHUwMjBjXDFcdTAyMGRcMVx1ZmZmZlwxXDE0M1wxXHUwMjBmXDFcMTQzXDFcdTAyMTFcMVx1MDIxMlwzXDE0M1wxXHUwMjE2XDFcdWZmZmZcMVwxNDNcMVx1MDIxOFwxXHVmZmZmXDNcMTQzXDFcdWZmZmZcMVwxNDNcMVx1ZmZmZlw1XDE0M1wxXHVmZmZmXDVcMTQzXDFcdTAyMjhcMVwxNDNcMVx1MDIyYVwxXHUwMjJiXDFcdTAyMmNcMVx1MDIyZFwxXDE0M1wxXHVmZmZmXDFcdTAyMmZcMVx1ZmZmZlwxXHUwMjMwXDFcdTAyMzFcMTBcMTQzXDFcdTAyM2JcMVx1ZmZmZlwxXDE0M1wyXHVmZmZmXDJcMTQzXDFcdTAyM2ZcMlwxNDNcMVx1ZmZmZlwzXDE0M1wyXHVmZmZmXDFcMTQzXDFcdWZmZmZcMVwxNDNcMlx1ZmZmZlwzXDE0M1wxXHVmZmZmXDFcdTAyNGFcMVx1ZmZmZlwxXHUwMjRiXDFcdTAyNGNcMVwxNDNcMVx1MDI0ZlwxXHUwMjUwXDVcMTQzXDFcdTAyNTZcNFwxNDNcMVx1ZmZmZlwxXDE0M1w0XHVmZmZmXDFcMTQzXDNcdWZmZmZcNFwxNDNcMVx1MDI2Mlw0XDE0M1wxXHVmZmZmXDFcMTQzXDFcdTAyNjhcMVwxNDNcMVx1ZmZmZlw0XDE0M1wxXHUwMjZlXDVcMTQzXDNcdWZmZmZcMVx1MDI3NFwxXDE0M1wyXHVmZmZmXDNcMTQzXDFcdTAyNzlcMVx1MDI3YVwxXHVmZmZmXDEzXDE0M1wxXHVmZmZmXDJcMTQzXDFcdTAyODhcMVx1MDI4OVwxXDE0M1wxXHVmZmZmXDFcMTQzXDFcdTAyOGNcM1wxNDNcMVx1ZmZmZlwxXHUwMjkwXDFcMTQzXDFcdTAyOTJcMlwxNDNcMVx1ZmZmZlw0XDE0M1wyXHVmZmZmXDFcMTQzXDFcdTAyOWFcN1wxNDNcMVx1MDJhMlwzXDE0M1wyXHVmZmZmXDFcdTAyYTZcMVx1MDJhN1wxXHVmZmZmXDFcdTAyYThcMlwxNDNcMVx1ZmZmZlwxXDE0M1wxXHVmZmZmXDFcMTQzXDFcdTAyYWRcMlwxNDNcMVx1MDJiMFwyXDE0M1wxXHVmZmZmXDdcMTQzXDFcdWZmZmZcM1wxNDNcM1x1ZmZmZlwxXDE0M1wxXHUwMmJlXDFcMTQzXDFcdTAyYzBcMVx1ZmZmZlwyXDE0M1wxXHVmZmZmXDFcMTQzXDFcdTAyYzRcMTBcMTQzXDFcdTAyY2RcMVwxNDNcMVx1MDJjZlwxXHVmZmZmXDFcdTAyZDBcMVx1ZmZmZlwxXHUwMmQxXDFcMTQzXDFcdTAyZDNcMVx1ZmZmZlwxXDE0M1wxXHUwMmQ1XDNcMTQzXDFcdTAyZDlcMVx1MDJkYVwxXDE0M1wxXHVmZmZmXDFcMTQzXDNcdWZmZmZcMVwxNDNcMVx1ZmZmZlwxXDE0M1wxXHVmZmZmXDFcMTQzXDFcdTAyZTBcMVwxNDNcMlx1ZmZmZlwyXDE0M1wxXHUwMmU0XDFcMTQzXDFcdTAyZTZcMVx1ZmZmZlwyXDE0M1wxXHUwMmU5XDFcdWZmZmZcMVwxNDNcMVx1ZmZmZlwyXDE0M1wxXHVmZmZmXDE1XDE0M1wxXHUwMmZhXDJcMTQzXDFcdWZmZmZcMVx1MDJmZFwxXDE0M1wxXHVmZmZmXDRcMTQzXDFcdTAzMDNcMVx1ZmZmZiI7CiAgICAgc3RhdGljIGZpbmFsIFN0cmluZyBERkEyMV9lb2ZTID0KLSAgICAgICAgIlx1MDJiNFx1ZmZmZiI7CisgICAgICAgICJcdTAzMDRcdWZmZmYiOwogICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgREZBMjFfbWluUyA9Ci0gICAgICAgICJcMVwwXDFcNzVcMVwxNzRcMVw0NlwxXDUzXDFcNTVcMlw1MlwzXDc1XDFcNzZcMlw1NlwxXDE0MVwxXDE1NFwxXDE1M1wxXDE0NlwyXDE0MVwxXDE2MFwxXDE0MVwxXDE0M1wxXDE0MVwxXDE2NFwxXDE1NlwxXDE0MVwxXDE1MVwxXDE0MVwxXDEwNFwxXDE0NVwxXDE1MFwyXHVmZmZmXDFcMTE1XDFcMTU3XDFcMTIzXDFcMTQ1XDFcMTY1XDFcMTQ1XDFcMTQxXDFcMTQ1XDFcMTUwXDFcMTU0XDEwXHVmZmZmXDFcNzJcMlw2MFwxXDQ0XDVcdWZmZmZcMVw3NVwyNlx1ZmZmZlwxXDc1XDVcdWZmZmZcMVw3NFw0XHVmZmZmXDFcMTU0XDFcMTQzXDFcdWZmZmZcMVwxNjBcMVwxNDVcMVwxNDNcMVwxNDFcMVwxNjBcMlwxNTFcMVwxNTZcMVwxNjBcMVwxNDRcMVw0NFwyXDE1NFwxXDE2MlwxXDE1N1wxXDE0MVwxXDE0N1wxXDE0NlwxXDE2MlwxXDE0M1wxXDE1N1wxXDE0N1wxXDE0NVwxXDE2MlwxXDE2MFwxXDE1NVwxXDE2NFwxXDQ0XDFcMTY3XDFcMTU2XDFcMTQxXDFcMTUxXDFcMTY0XDFcMTU0XDFcMTU2XDFcMTQ1XDFcMTExXDFcMTU1XDFcMTY0XDFcNDRcMVwxNjBcMVwxNjJcMVwxNjVcMlx1ZmZmZlwxXDExNFwxXDE0M1wxXDEyNlwxXDE0NlwxXDQ0XDFcMTU3XDFcMTQ0XDFcMTY3XDFcMTU0XDFcNDRcMVwxNDVcMVwxNDRcMVwxNDNcMVwxNzFcMVwxNjRcMVwxNTFcMVw0NFwxXDE1NFwxM1x1ZmZmZlwxXDYwXDEyXHVmZmZmXDJcNDRcMVwxNjRcMVwxNDVcMVwxNjJcMVwxNTVcMVwxNDVcMVwxNTdcMVwxNTFcMVwxNjRcMVwxNDVcMVwxNjBcMVwxNjRcMVwxNDNcMVwxNTdcMVwxNDVcMVwxNjRcMVwxNDVcMVx1ZmZmZlwxXDE2M1wxXDE0NVwxXDE0MVwxXDQ0XDFcMTU1XDFcMTUxXDJcNDRcMVwxNjNcMVwxNTNcMVwxNTBcMVwxNjBcMVw0NFwyXDE0N1wxXDQ0XDFcMTUzXDJcMTQ1XDFcdWZmZmZcMVwxMDRcMVwxNTdcMVwxNjJcMVwxNjZcMVwxNDVcMVwxNTRcMVwxNDRcMVwxNDNcMVw0NFwxXDE1N1wxXDE2NVwxXDE1N1wxXDE1NFwxXHVmZmZmXDFcMTQ1XDFcMTU3XDFcNDRcMVwxNDVcMVw0NFwxXDE0MVwxXDE1M1wxXDQ0XDFcMTUxXDFcMTQxXDFcMTQzXDFcdWZmZmZcMVwxNjRcMVwxNDVcMVw0NFwxXDE1NFwxXHVmZmZmXDFcMTQxXDFcMTUxXDFcMTcxXDFcMTQ1XDFcMTQzXDFcMTUwXDFcNDRcMVwxNTBcMVwxNTRcMVwxNTFcMVx1ZmZmZlwxXDE1N1wxXDE0NFwyXHVmZmZmXDFcMTU3XDFcMTU2XDJcMTQ1XDFcNDRcMVwxNDRcMVwxNjRcMVwxNTFcMVwxNjJcMVwxMTRcMVwxNDNcMVwxNTBcMlwxNjJcMVwxNDFcMVwxNTZcMVwxNDVcMVw0NFwxXDE1NFwxXDE0MVwxXHVmZmZmXDFcNDRcMVwxNTZcMlx1ZmZmZlwxXDE1MVwxXDE0MVwxXDQ0XDFcMTQ1XDFcdWZmZmZcMVw0NFwxXDE0NVwxXDE1MVwxXDE1N1wxXDE1NFwxXHVmZmZmXDFcMTQ1XDFcMTI0XDFcMTY0XDFcMTQxXDFcMTYzXDFcMTY0XDFcMTQ1XDFcNDRcMVwxNTFcMVwxNTdcMVwxNjVcMVx1ZmZmZlwxXDE2NlwyXDE2MlwxXDE0NVwxXDE1N1wxXDE2N1wxXHVmZmZmXDFcNDRcMVx1ZmZmZlwxXDE1NFwxXDE2NVwxXHVmZmZmXDFcMTU1XDFcMTY1XDFcMTYyXDFcMTQ1XDFcMTE2XDFcdWZmZmZcMVw0NFwxXDE2NFwxXDE1NlwyXDQ0XDFcMTUwXDFcMTQ1XDFcNDRcMVx1ZmZmZlwxXDQ0XDFcMTQ1XDFcMTQ3XDFcMTY3XDFcMTQxXDFcMTYyXDFcMTQ0XDFcMTYzXDFcMTU2XDFcdWZmZmZcMVwxNTFcMVwxNzFcMVwxNDNcMVw0NFwxXDE1MVwxXDE1MFwxXDE2MlwxXDE2NFwxXDE0M1wxXDE1NlwxXDE2NFwxXDQ0XDFcdWZmZmZcMVwxNTRcMVwxNjRcMVx1ZmZmZlwxXDQ0XDFcMTYzXDFcMTQ3XDFcdWZmZmZcMVwxNjJcMVx1ZmZmZlwxXDQ0XDFcMTU2XDFcNDRcMVwxNTdcMVwxMDFcMVwxNDRcMVwxNzFcMVw1NVwxXDE2NFwxXDE0NVwxXDEwNFwxXDE2MlwxXHVmZmZmXDFcMTYzXDFcMTU1XDFcMTY0XDFcMTQ1XDFcMTU2XDFcMTY0XDFcNDRcMVwxNDZcMVw0NFwxXHVmZmZmXDFcMTQ1XDFcMTYwXDFcMTUxXDFcMTU0XDFcMTUxXDFcMTAzXDFcMTQxXDFcdWZmZmZcMVwxNDVcMVwxNDdcMlx1ZmZmZlwxXDQ0XDFcMTIzXDJcdWZmZmZcMVw0NFwxXDE1NlwxXDExNlwxXDE2NFwxXDExNlwxXDE2M1wxXDE1MVwxXDE2M1wxXDE2NFwxXDE1NlwyXDQ0XDFcdWZmZmZcMVwxNTZcMVw0NFwxXDE1N1wxXDQ0XDFcMTUwXDFcMTQzXDFcNDRcMVx1ZmZmZlwxXDE3MVwxXDQ0XDFcdWZmZmZcMVwxNjRcMVwxNDVcMVwxNjRcMVx1ZmZmZlwxXDE0N1wxXHVmZmZmXDFcMTQyXDFcMTY0XDFcNDRcMVwxMDJcMVwxNjBcMVx1ZmZmZlwxXDE0NVwxXDE0M1wxXDE0MVwxXDE2M1wxXDE0NVwxXDQ0XDFcMTQ1XDNcNDRcMVx1ZmZmZlwxXDQ0XDFcdWZmZmZcMlw0NFwyXDE2NFwxXDE0MlwxXDE1MFwxXDE1NVwxXDExN1wxXDQ0XDFcdWZmZmZcMVwxNTFcMVx1ZmZmZlwxXDQ0XDFcMTU3XDFcMTQ1XDFcMTQxXDFcNDRcMVwxNTdcMVwxNTFcMVwxMjNcMVwxNDdcMlx1ZmZmZlwxXDE0NVwxXHVmZmZmXDFcMTU2XDFcdWZmZmZcMVwxNDFcMVwxNDVcMVx1ZmZmZlwxXDQ0XDFcdWZmZmZcMlw0NFwxXDE3MVwyXDQ0XDFcMTY0XDFcMTQxXDFcMTU2XDFcdWZmZmZcMVwxNzFcMVwxNDVcMVw0NFwxXDE1N1wxXDE2NFwxXDE0MVwxXDE0M1wxXHVmZmZmXDFcMTAzXDZcdWZmZmZcMVwxNDVcMVw0NFwxXDE0NVwxXDE0MVwxXDE0NVwxXDE1NlwxXHVmZmZmXDFcMTcyXDFcdWZmZmZcMVwxMjJcMVw0NFwxXDE1NVwxXHVmZmZmXDFcMTU2XDFcMTU3XDFcMTUxXDFcNDRcMVwxNjNcMVwxNTFcMVwxNTZcMVwxNTdcM1x1ZmZmZlwxXDQ0XDFcMTU3XDJcdWZmZmZcMVwxNjJcMlwxNjRcMlw0NFwxXHVmZmZmXDFcMTU2XDFcMTQ1XDFcMTU0XDJcMTU3XDFcMTYyXDFcdWZmZmZcMVwxNDRcMVwxNjJcMlw0NFwyXDE0NVwxXDE2NVwxXHVmZmZmXDFcMTQ1XDFcNDRcMVwxNTZcMVwxNzJcMVx1ZmZmZlwxXDQ0XDFcMTcyXDFcMTQ3XDFcMTQ2XDFcdWZmZmZcMVwxNDRcMVwxNTFcMVwxNTBcMVwxNTFcMlx1ZmZmZlwxXDE0NFwxXDQ0XDFcMTU0XDJcMTU2XDFcNDRcMVwxMDJcMVwxNDFcMlx1ZmZmZlwxXDQ0XDFcMTYzXDFcMTU2XDFcNDRcMVx1ZmZmZlwxXDQ0XDFcMTQ1XDFcdWZmZmZcMlwxNDVcMVw0NFwxXDE0NVwxXDE0MlwxXDQ0XDFcMTY0XDFcMTYzXDFcdWZmZmZcMVwxNzFcMVwxNDRcMVwxNjRcMVx1ZmZmZlwxXDE3MVwxXDE0M1wxXHVmZmZmXDFcMTY1XDFcMTUxXDJcdWZmZmZcMVw0NFwxXDE0NFwxXDQ0XDFcdWZmZmZcMVwxNTRcMVwxNjVcMVx1ZmZmZlwxXDE3MVwxXDQ0XDFcMTI1XDFcMTYzXDFcMTQ1XDFcNDRcMVwxNjRcMVwxNTRcMVwxNjFcMVx1ZmZmZlwxXDQ0XDFcdWZmZmZcMVw0NFwxXDE2NFwxXDQ0XDFcdWZmZmZcMVwxNTZcMVw0NFwxXDE3MFwxXHVmZmZmXDFcMTQ1XDFcMTY0XDFcMTY1XDJcdWZmZmZcMVwxNDVcMVx1ZmZmZlwxXDE1MVwxXHVmZmZmXDFcMTY0XDFcMTYyXDFcNDRcMVwxNDVcMVw0NFwxXDE2MVwyXDQ0XDFcdWZmZmZcMVwxMjJcMVx1ZmZmZlwxXDE2NVwyXHVmZmZmXDJcMTQ1XDFcMTYzXDFcMTExXDFcMTY1XDFcMTQ0XDFcMTU0XDFcMTQ1XDFcMTY0XDFcMTU2XDFcNDRcMVwxNjRcMVx1ZmZmZlwxXDE1MVwxXDE0NlwxXDE1MVwxXDE0NVwxXDE2MlwxXDQ0XDFcdWZmZmYiOworICAgICAgICAiXDFcMFwxXDc1XDFcMTc0XDFcNDZcMVw1M1wxXDU1XDJcNTJcNFw3NVwyXDU2XDFcMTQxXDFcMTU0XDFcMTUzXDFcMTQ2XDJcMTQxXDFcMTYwXDFcMTQxXDFcMTQzXDFcMTQxXDFcMTY0XDFcMTU2XDFcMTQxXDFcMTUxXDFcMTQxXDFcMTA0XDFcMTQ1XDFcMTU0XDFcMTUwXDJcdWZmZmZcMVwxMTVcMVwxNDFcMVwxMjNcMVwxNDVcMVwxNjVcMVwxNDVcMVwxNDFcMVwxNDVcMVwxNTBcMVwxNTFcMTBcdWZmZmZcMVw3MlwyXDYwXDFcNDRcNVx1ZmZmZlwxXDc1XDI2XHVmZmZmXDFcNzVcNlx1ZmZmZlwxXDc0XDRcdWZmZmZcMVwxNTRcMVwxNDNcMVx1ZmZmZlwxXDE2MFwxXDE0NVwxXDE0M1wxXDE0MVwxXDE2MFwyXDE1MVwxXDE1NlwxXDE2MFwxXDE1NlwxXDE0NFwxXDQ0XDJcMTU0XDFcMTYyXDFcMTU3XDFcMTQxXDFcMTQ3XDFcMTQ2XDFcMTYyXDFcMTQzXDFcMTU3XDFcMTQ3XDFcMTQ1XDFcMTYyXDFcMTYwXDFcMTU1XDFcMTY0XDJcNDRcMVwxNjdcMVwxNTZcMVwxNDFcMVwxNTFcMVwxNjRcMVwxNTRcMVwxNTZcMVwxNDVcMVwxMTFcMVwxNDZcMVwxNDRcMVw0NFwxXDE1NFwxXDE2NFwxXDQ0XDFcMTYwXDFcMTYyXDFcMTY1XDJcdWZmZmZcMVwxMTRcMVwxNDNcMVwxNjRcMVwxMjZcMVwxNDZcMVw0NFwxXDE1N1wxXDE0NFwxXDE2N1wxXDE1NFwxXDQ0XDFcMTQ1XDFcMTQ0XDFcMTQzXDFcMTcxXDFcMTY0XDFcMTQ1XDFcMTQ0XDEzXHVmZmZmXDFcNjBcMTJcdWZmZmZcMlw0NFwxXDE2NFwxXDE0NVwxXDE1N1wxXDE1NVwxXDE0NVwxXDE1N1wxXDE1MVwxXDE2NFwxXDE0NVwxXDE2MFwxXDE2NFwxXDE0M1wyXDE1N1wxXDE0NVwxXDE2NFwxXDE0NVwxXHVmZmZmXDFcMTYzXDFcMTQ1XDFcMTQxXDFcNDRcMVwxNTVcMVwxNTFcMlw0NFwxXDE2M1wxXDE1M1wxXDE1MFwxXDE2MFwxXDQ0XDJcMTQ3XDFcNDRcMVwxNTNcMlwxNDVcMlx1ZmZmZlwxXDEwNFwxXDE1N1wxXDE2MlwxXDE2NlwxXDE0NVwxXDE1NFwxXDE0NFwxXDE0M1wxXDQ0XDFcMTU3XDFcNDRcMVwxNjVcMVwxNTdcMVw0NFwxXDE1MVwxXHVmZmZmXDFcMTU3XDFcMTU0XDFcdWZmZmZcMVwxNDVcMVwxNTdcMVw0NFwxXDE0NVwxXDQ0XDFcMTQxXDFcMTUzXDFcMTQ1XDFcNDRcMVwxNDVcMVwxNDFcMVwxNDNcMVx1ZmZmZlwxXDE2NFwxXDE0NVwxXDQ0XDFcMTU0XDFcdWZmZmZcMVwxNDFcMVwxNTFcMVwxNzFcMVwxNDVcMVwxNDNcMVwxNTBcMVw0NFwxXDE1MFwxXDE2MlwxXDE1NFwxXDE0NVwxXDE0NFwyXHVmZmZmXDFcMTU3XDFcMTU2XDFcMTQ1XDFcMTYyXDFcMTQ1XDFcNDRcMVwxNDRcMVwxNjRcMVwxNTFcMVwxNjJcMVwxMTRcMVwxNDNcMVwxNTBcMVwxNjJcMVwxNTRcMVwxNjRcMVwxNjJcMVwxNDFcMVwxNTZcMVwxNDVcMVw0NFwxXDE1NFwxXDE0MVwxXHVmZmZmXDFcNDRcMVwxNTZcMlx1ZmZmZlwxXDE1MVwxXDE0MVwxXDQ0XDFcMTQ1XDFcdWZmZmZcMVw0NFwxXDE0NVwxXDE1MVwxXDE1N1wxXDE1NFwxXHVmZmZmXDFcMTQ1XDFcMTI0XDFcMTY0XDFcMTQxXDFcMTYzXDFcMTY0XDFcMTQ1XDFcNDRcMVwxNTFcMVwxNTdcMVwxNjVcMVx1ZmZmZlwxXDE2NlwxXHVmZmZmXDJcMTYyXDFcdWZmZmZcMVwxNDdcMVwxNjdcMVwxNDVcMVwxNTdcMVwxNjdcMVx1ZmZmZlwxXDQ0XDFcdWZmZmZcMVwxNTRcMVwxNjVcMVwxNjNcMVx1ZmZmZlwxXDE1NVwxXDE2NFwxXDE2NVwxXDE2MlwxXDE0NVwxXDExNlwxXHVmZmZmXDFcNDRcMVwxNjRcMVwxNTZcMlw0NFwxXDE1MFwxXDE0NVwxXDQ0XDFcdWZmZmZcMVw0NFwyXDE0NVwxXDQ0XDFcMTQxXDFcMTYyXDFcMTQ0XDFcMTYzXDFcMTQ1XDFcMTY0XDFcMTU2XDFcdWZmZmZcMVwxNTFcMVwxNzFcMVwxNDNcMVw0NFwxXDE1MVwxXDE1MFwxXDE2MlwxXDE2NFwxXDE1NFwxXDE1NlwxXDE0M1wxXDE1NlwxXDE2NFwxXDQ0XDFcdWZmZmZcMVwxNTRcMVwxNjRcMVx1ZmZmZlwxXDQ0XDFcMTYzXDFcMTQ3XDFcdWZmZmZcMVwxNjJcMVx1ZmZmZlwxXDQ0XDFcMTU2XDFcNDRcMVwxNTdcMVwxMDFcMVwxNDRcMVwxNzFcMVw1NVwxXDE2NFwxXDE0NVwxXDEwNFwxXDE2MlwxXHVmZmZmXDFcMTYzXDFcMTU1XDFcMTY0XDFcMTQ1XDFcMTU2XDFcMTY0XDFcMTU2XDFcMTE2XDFcNDRcMVwxNDZcMVw0NFwxXHVmZmZmXDFcMTQ1XDFcMTYwXDFcMTY0XDFcMTUxXDFcMTQ1XDFcMTU0XDFcMTUxXDFcMTAzXDFcMTQxXDFcdWZmZmZcMVwxNDVcMVwxNDdcMlx1ZmZmZlwxXDQ0XDFcMTIzXDJcdWZmZmZcMlw0NFwxXHVmZmZmXDFcMTY0XDFcMTE2XDFcMTYzXDFcMTUxXDFcMTYzXDFcNDRcMVwxMDZcMVwxNjRcMVwxNTZcMlw0NFwxXHVmZmZmXDFcMTU2XDFcNDRcMVwxNTdcMlw0NFwxXDE2NVwxXDE1MFwxXDE0M1wxXDQ0XDFcdWZmZmZcMVwxNzFcMVw0NFwxXHVmZmZmXDFcMTY0XDFcMTQ1XDFcMTY0XDFcdWZmZmZcMVwxNDdcMVx1ZmZmZlwxXDE0MlwxXDE2NFwxXDEwNVwxXDEwMlwxXDE2MFwxXHVmZmZmXDFcMTQ1XDFcMTQzXDFcMTQxXDFcMTYzXDFcMTQ1XDFcNDRcMVwxNDVcNFw0NFwxXDE1N1wxXHVmZmZmXDFcNDRcMVx1ZmZmZlwyXDQ0XDFcMTA1XDFcMTY0XDFcMTA2XDFcMTY0XDFcMTQyXDFcMTUwXDFcMTU1XDFcMTE3XDFcNDRcMVx1ZmZmZlwxXDE1MVwyXHVmZmZmXDFcMTQ1XDFcMTQxXDFcNDRcMVwxNTdcMVwxNTFcMVx1ZmZmZlwxXDE1MVwxXDEyM1wxXDE0N1wyXHVmZmZmXDFcMTQ1XDFcdWZmZmZcMVwxNTZcMlx1ZmZmZlwxXDE1NFwxXDE0MVwxXDE0NVwxXHVmZmZmXDFcNDRcMVx1ZmZmZlwyXDQ0XDFcMTcxXDJcNDRcMVwxNjRcMVwxNDFcMVwxNTZcMVwxNzFcMVwxNDVcMVw0NFwxXDE1N1wxXDE2NFwxXDE0MVwxXDE0M1wxXHVmZmZmXDFcMTAzXDRcdWZmZmZcMVwxMjJcM1x1ZmZmZlwxXDE1NVwxXDE3MFwxXDE0NVwxXDE1MVwxXDQ0XDFcMTQ1XDFcMTQxXDFcMTQ1XDFcMTU2XDFcdWZmZmZcMVwxNzJcMVw0NFwxXDE1NVwxXHVmZmZmXDFcMTU2XDFcMTU3XDFcMTU0XDFcMTUxXDFcNDRcMVwxNjNcMVwxNTFcMVwxNTRcMVwxNTZcMVwxNTdcM1x1ZmZmZlwxXDQ0XDFcMTU3XDJcdWZmZmZcMVwxNjJcMlwxNjRcMlw0NFwxXHVmZmZmXDFcMTU2XDFcMTQ1XDFcMTU0XDJcMTU3XDFcMTQ1XDFcMTY1XDJcMTYwXDFcMTYyXDFcMTU0XDFcdWZmZmZcMVwxNDRcMVwxNjJcMlw0NFwxXDE0NVwxXHVmZmZmXDFcMTQ1XDFcNDRcMVwxNTZcMVwxNjRcMVwxNzJcMVx1ZmZmZlwxXDQ0XDFcMTcyXDFcNDRcMVwxNDdcMVwxNDZcMVx1ZmZmZlwxXDE0NFwxXDE1MVwxXDE1MFwxXDE1MVwyXHVmZmZmXDFcMTQ0XDFcNDRcMVwxNTRcMlwxNTZcMVwxNjNcMVwxNTZcMlwxNTdcMVw0NFwxXDE0NVwxXDEwMlwxXDE0MVwyXHVmZmZmXDJcNDRcMVx1ZmZmZlwxXDQ0XDJcMTQ1XDFcdWZmZmZcMVwxNDVcMVx1ZmZmZlwxXDE0NVwxXDQ0XDFcMTQ1XDFcMTQyXDFcNDRcMVwxNjRcMVwxNjNcMVx1ZmZmZlwxXDE3MVwxXDE0NFwxXDE2NFwxXDE2NVwxXDE1MVwyXDE2MlwxXHVmZmZmXDFcMTAxXDFcMTcxXDFcMTQzXDNcdWZmZmZcMVwxNjJcMVw0NFwxXDE0NFwxXDQ0XDFcdWZmZmZcMVwxNTRcMVwxNjVcMVx1ZmZmZlwxXDE3MVwxXDQ0XDFcMTI1XDFcMTYzXDFcMTQ1XDFcMTU0XDFcMTYxXDJcMTY0XDFcMTQ2XDFcNDRcMVwxNjRcMVw0NFwxXHVmZmZmXDFcNDRcMVx1ZmZmZlwxXDQ0XDFcMTY0XDFcNDRcMVx1ZmZmZlwxXDE1NlwxXDQ0XDFcMTcwXDFcMTY0XDFcMTY1XDJcNDRcMVwxNjRcMVx1ZmZmZlwxXDE0NVwzXHVmZmZmXDFcMTQ1XDFcdWZmZmZcMVwxNTFcMVx1ZmZmZlwxXDE2NFwxXDQ0XDFcMTQ1XDJcdWZmZmZcMVwxNDVcMVwxNjJcMVw0NFwxXDE2MVwxXDQ0XDFcdWZmZmZcMVwxMjJcMVwxNjJcMVw0NFwxXHVmZmZmXDFcMTY1XDFcdWZmZmZcMVwxNDVcMVwxMTFcMVx1ZmZmZlwxXDE0NVwxXDE2M1wxXDE1NVwxXDExMVwxXDE2NVwxXDE2MFwxXDE0NFwxXDE1NFwxXDE1N1wxXDE0NVwxXDE2NFwxXDE2MlwxXDE1NlwxXDQ0XDJcMTY0XDFcdWZmZmZcMVw0NFwxXDE1MVwxXHVmZmZmXDFcMTQ2XDFcMTUxXDFcMTQ1XDFcMTYyXDFcNDRcMVx1ZmZmZiI7CiAgICAgc3RhdGljIGZpbmFsIFN0cmluZyBERkEyMV9tYXhTID0KLSAgICAgICAgIlwxXHVmZmZmXDFcNzZcMVwxNzRcMVw0NlwxXDc1XDFcNzZcNVw3NVwxXDc2XDFcNTZcMVw3MlwxXDE0NVwxXDE3MFwxXDE3MVwxXDE1NlwyXDE2MlwyXDE2MFwxXDE1NlwxXDE1N1wxXDE2NFwxXDE1NlwxXDE0MVwxXDE1MVwxXDE0MVwxXDE3MFwxXDE0NVwxXDE3MVwyXHVmZmZmXDFcMTE1XDFcMTU3XDFcMTIzXDFcMTU3XDJcMTY1XDFcMTYyXDFcMTQ1XDFcMTUxXDFcMTYzXDEwXHVmZmZmXDFcNzJcMVwxNzBcMVwxNTRcMVwxNzJcNVx1ZmZmZlwxXDc1XDI2XHVmZmZmXDFcNzVcNVx1ZmZmZlwxXDc0XDRcdWZmZmZcMVwxNjJcMVwxNDNcMVx1ZmZmZlwxXDE2NFwxXDE2M1wxXDE2NFwxXDE0MVwxXDE2MFwyXDE1MVwxXDE1NlwxXDE2MFwxXDE2NFwxXDE3MlwxXDE1NFwxXDE1NlwxXDE2MlwxXDE1N1wxXDE0MVwxXDE0N1wxXDE0NlwxXDE2MlwxXDE2NFwxXDE1N1wxXDE0N1wxXDE0NVwyXDE2MlwxXDE1NVwxXDE2NFwxXDE3MlwxXDE2N1wxXDE1NlwxXDE0MVwxXDE1MVwxXDE2NFwxXDE1NFwxXDE1NlwxXDE0NVwxXDExMVwyXDE2NFwxXDE3MlwxXDE2MFwxXDE2MlwxXDE3MVwyXHVmZmZmXDFcMTE0XDFcMTU3XDFcMTI2XDFcMTYzXDFcMTcyXDFcMTU3XDFcMTQ0XDFcMTY3XDFcMTU0XDFcMTcyXDFcMTQ1XDFcMTYwXDFcMTY0XDFcMTcxXDFcMTY0XDFcMTUxXDFcMTcyXDFcMTU0XDEzXHVmZmZmXDFcMTU0XDEyXHVmZmZmXDJcMTcyXDFcMTY0XDFcMTQ1XDFcMTYyXDFcMTU1XDFcMTQ1XDFcMTU3XDFcMTUxXDFcMTY0XDFcMTQ1XDFcMTYwXDFcMTY0XDFcMTQzXDFcMTU3XDFcMTQ1XDFcMTY0XDFcMTQ1XDFcdWZmZmZcMVwxNjNcMVwxNDVcMVwxNDFcMVwxNzJcMVwxNTVcMVwxNTFcMlwxNzJcMVwxNjNcMVwxNTNcMVwxNTBcMVwxNjBcMVwxNzJcMlwxNDdcMVwxNzJcMVwxNTNcMlwxNDVcMVx1ZmZmZlwxXDEwNFwxXDE1N1wxXDE2MlwxXDE2NlwxXDE0NVwxXDE1NFwxXDE0NFwxXDE0M1wxXDE3MlwxXDE1N1wxXDE2NVwxXDE1N1wxXDE1NFwxXHVmZmZmXDFcMTQ1XDFcMTU3XDFcMTcyXDFcMTQ1XDFcMTcyXDFcMTQxXDFcMTUzXDFcMTcyXDFcMTUxXDFcMTQxXDFcMTQzXDFcdWZmZmZcMVwxNjRcMVwxNDVcMVwxNzJcMVwxNTRcMVx1ZmZmZlwxXDE0MVwxXDE1MVwxXDE3MVwxXDE0NVwxXDE0M1wxXDE1MFwxXDE3MlwxXDE1MFwxXDE1NFwxXDE1MVwxXHVmZmZmXDFcMTU3XDFcMTQ0XDJcdWZmZmZcMVwxNTdcMVwxNTZcMlwxNDVcMVwxNzJcMVwxNDRcMVwxNjRcMVwxNTFcMVwxNjJcMVwxMTRcMVwxNDNcMVwxNTBcMlwxNjJcMVwxNDFcMVwxNTZcMVwxNDVcMVwxNzJcMVwxNTRcMVwxNDFcMVx1ZmZmZlwxXDE3MlwxXDE1NlwyXHVmZmZmXDFcMTUxXDFcMTQxXDFcMTcyXDFcMTQ1XDFcdWZmZmZcMVwxNzJcMVwxNDVcMVwxNTFcMVwxNTdcMVwxNzFcMVx1ZmZmZlwxXDE0NVwxXDEyNFwxXDE2NFwxXDE0MVwxXDE2M1wxXDE2NFwxXDE0NVwxXDE3MlwxXDE1MVwxXDE1N1wxXDE2NVwxXHVmZmZmXDFcMTY2XDJcMTYyXDFcMTQ1XDFcMTU3XDFcMTY3XDFcdWZmZmZcMVwxNzJcMVx1ZmZmZlwxXDE1NFwxXDE2NVwxXHVmZmZmXDFcMTU1XDFcMTY1XDFcMTYyXDFcMTQ1XDFcMTE2XDFcdWZmZmZcMVwxNzJcMVwxNjRcMVwxNTZcMlwxNzJcMVwxNTBcMVwxNDVcMVwxNzJcMVx1ZmZmZlwxXDE3MlwxXDE0NVwxXDE0N1wxXDE2N1wxXDE0MVwxXDE2MlwyXDE2M1wxXDE1NlwxXHVmZmZmXDFcMTUxXDFcMTcxXDFcMTQzXDFcMTcyXDFcMTUxXDFcMTUwXDFcMTYyXDFcMTY0XDFcMTQzXDFcMTU2XDFcMTY0XDFcMTcyXDFcdWZmZmZcMVwxNTRcMVwxNjRcMVx1ZmZmZlwxXDE3MlwxXDE2M1wxXDE0N1wxXHVmZmZmXDFcMTYyXDFcdWZmZmZcMVwxNzJcMVwxNTZcMVwxNzJcMVwxNTdcMVwxMDFcMVwxNjJcMVwxNzFcMVw1NVwxXDE2NFwxXDE0NVwxXDEwNFwxXDE2MlwxXHVmZmZmXDFcMTYzXDFcMTU1XDFcMTY0XDFcMTQ1XDFcMTU2XDFcMTY0XDFcMTcyXDFcMTQ2XDFcMTcyXDFcdWZmZmZcMVwxNDVcMVwxNjBcMVwxNTFcMVwxNTRcMVwxNTFcMVwxMDNcMVwxNDFcMVx1ZmZmZlwxXDE0NVwxXDE0N1wyXHVmZmZmXDFcMTcyXDFcMTIzXDJcdWZmZmZcMVwxNzJcMVwxNTZcMVwxMTZcMVwxNjRcMVwxMTZcMVwxNjNcMVwxNTFcMVwxNjNcMVwxNjRcMVwxNTZcMlwxNzJcMVx1ZmZmZlwxXDE1NlwxXDE3MlwxXDE1N1wxXDE3MlwxXDE1MFwxXDE0M1wxXDE3MlwxXHVmZmZmXDFcMTcxXDFcMTcyXDFcdWZmZmZcMVwxNjRcMVwxNDVcMVwxNjRcMVx1ZmZmZlwxXDE0N1wxXHVmZmZmXDFcMTQyXDFcMTY0XDFcMTcyXDFcMTAyXDFcMTYwXDFcdWZmZmZcMVwxNDVcMVwxNDNcMVwxNDFcMVwxNjNcMVwxNDVcMVwxNzJcMVwxNDVcM1wxNzJcMVx1ZmZmZlwxXDE3MlwxXHVmZmZmXDJcMTcyXDJcMTY0XDFcMTQyXDFcMTUwXDFcMTU1XDFcMTE3XDFcMTcyXDFcdWZmZmZcMVwxNTFcMVx1ZmZmZlwxXDE3MlwxXDE1N1wxXDE0NVwxXDE0MVwxXDE3MlwxXDE1N1wxXDE1MVwxXDEyM1wxXDE0N1wyXHVmZmZmXDFcMTQ1XDFcdWZmZmZcMVwxNTZcMVx1ZmZmZlwxXDE0MVwxXDE0NVwxXHVmZmZmXDFcMTcyXDFcdWZmZmZcMlwxNzJcMVwxNzFcMlwxNzJcMVwxNjRcMVwxNDFcMVwxNTZcMVx1ZmZmZlwxXDE3MVwxXDE0NVwxXDE3MlwxXDE1N1wxXDE2NFwxXDE0MVwxXDE0M1wxXHVmZmZmXDFcMTAzXDZcdWZmZmZcMVwxNDVcMVwxNzJcMVwxNDVcMVwxNDFcMVwxNDVcMVwxNTZcMVx1ZmZmZlwxXDE3MlwxXHVmZmZmXDFcMTU2XDFcMTcyXDFcMTU1XDFcdWZmZmZcMVwxNTZcMVwxNTdcMVwxNTFcMVwxNzJcMVwxNjNcMVwxNTFcMVwxNTZcMVwxNTdcM1x1ZmZmZlwxXDE3MlwxXDE1N1wyXHVmZmZmXDFcMTYyXDJcMTY0XDJcMTcyXDFcdWZmZmZcMVwxNTZcMVwxNDVcMVwxNTRcMlwxNTdcMVwxNjJcMVx1ZmZmZlwxXDE0NFwxXDE2MlwyXDE3MlwyXDE0NVwxXDE2NVwxXHVmZmZmXDFcMTQ1XDFcMTcyXDFcMTU2XDFcMTcyXDFcdWZmZmZcMlwxNzJcMVwxNDdcMVwxNDZcMVx1ZmZmZlwxXDE0NFwxXDE1MVwxXDE1MFwxXDE1MVwyXHVmZmZmXDFcMTQ0XDFcMTcyXDFcMTU0XDJcMTU2XDFcMTcyXDFcMTAyXDFcMTQxXDJcdWZmZmZcMVwxNzJcMVwxNjNcMVwxNTZcMVwxNzJcMVx1ZmZmZlwxXDE3MlwxXDE0NVwxXHVmZmZmXDJcMTQ1XDFcMTcyXDFcMTQ1XDFcMTQyXDFcMTcyXDFcMTY0XDFcMTYzXDFcdWZmZmZcMVwxNzFcMVwxNDRcMVwxNjRcMVx1ZmZmZlwxXDE3MVwxXDE0M1wxXHVmZmZmXDFcMTY1XDFcMTUxXDJcdWZmZmZcMVwxNzJcMVwxNDRcMVwxNzJcMVx1ZmZmZlwxXDE1NFwxXDE2NVwxXHVmZmZmXDFcMTcxXDFcMTcyXDFcMTI1XDFcMTYzXDFcMTQ1XDFcMTcyXDFcMTY0XDFcMTU0XDFcMTYxXDFcdWZmZmZcMVwxNzJcMVx1ZmZmZlwxXDE3MlwxXDE2NFwxXDE3MlwxXHVmZmZmXDFcMTU2XDFcMTcyXDFcMTcwXDFcdWZmZmZcMVwxNDVcMVwxNjRcMVwxNjVcMlx1ZmZmZlwxXDE0NVwxXHVmZmZmXDFcMTUxXDFcdWZmZmZcMVwxNjRcMVwxNjJcMVwxNzJcMVwxNDVcMVwxNzJcMVwxNjFcMlwxNzJcMVx1ZmZmZlwxXDEyMlwxXHVmZmZmXDFcMTY1XDJcdWZmZmZcMlwxNDVcMVwxNjNcMVwxMTFcMVwxNjVcMVwxNDRcMVwxNTRcMVwxNDVcMVwxNjRcMVwxNTZcMVwxNzJcMVwxNjRcMVx1ZmZmZlwxXDE1MVwxXDE0NlwxXDE1MVwxXDE0NVwxXDE2MlwxXDE3MlwxXHVmZmZmIjsKKyAgICAgICAgIlwxXHVmZmZmXDFcNzZcMVwxNzRcMVw0NlwxXDc1XDFcNzZcNVw3NVwxXDc2XDFcNTZcMVw3MlwxXDE0NVwxXDE3MFwxXDE3MVwxXDE2M1wyXDE2MlwyXDE2MFwxXDE2MlwxXDE1N1wxXDE2NFwxXDE1NlwxXDE0MVwxXDE1MVwxXDE0MVwxXDE3MFwxXDE0NVwxXDE2M1wxXDE3MVwyXHVmZmZmXDFcMTE1XDFcMTU3XDFcMTIzXDFcMTU3XDJcMTY1XDFcMTYyXDFcMTQ1XDJcMTUxXDEwXHVmZmZmXDFcNzJcMVwxNzBcMVwxNTRcMVwxNzJcNVx1ZmZmZlwxXDc1XDI2XHVmZmZmXDFcNzVcNlx1ZmZmZlwxXDc0XDRcdWZmZmZcMVwxNjJcMVwxNDNcMVx1ZmZmZlwxXDE2NFwxXDE2M1wxXDE2NFwxXDE0MVwxXDE2MFwyXDE1MVwxXDE1NlwxXDE2MFwxXDE1NlwxXDE2NFwxXDE3MlwxXDE1NFwxXDE1NlwxXDE2MlwxXDE1N1wxXDE0MVwxXDE0N1wxXDE0NlwxXDE2MlwxXDE2NFwxXDE1N1wxXDE0N1wxXDE0NVwyXDE2MlwxXDE1NVwxXDE2NFwyXDE3MlwxXDE2N1wxXDE1NlwxXDE0MVwxXDE1MVwxXDE2NFwxXDE1NFwxXDE1NlwxXDE0NVwxXDExMVwxXDE2NFwxXDE0NFwxXDE3MlwxXDE1NFwxXDE2NFwxXDE3MlwxXDE2MFwxXDE2MlwxXDE3MVwyXHVmZmZmXDFcMTE0XDFcMTU3XDFcMTY0XDFcMTI2XDFcMTYzXDFcMTcyXDFcMTU3XDFcMTQ0XDFcMTY3XDFcMTU0XDFcMTcyXDFcMTQ1XDFcMTYwXDFcMTY0XDFcMTcxXDFcMTY0XDFcMTUxXDFcMTQ0XDEzXHVmZmZmXDFcMTU0XDEyXHVmZmZmXDJcMTcyXDFcMTY0XDFcMTQ1XDFcMTYyXDFcMTU1XDFcMTQ1XDFcMTU3XDFcMTUxXDFcMTY0XDFcMTQ1XDFcMTYwXDFcMTY0XDFcMTQzXDFcMTU3XDFcMTY1XDFcMTQ1XDFcMTY0XDFcMTQ1XDFcdWZmZmZcMVwxNjNcMVwxNDVcMVwxNDFcMVwxNzJcMVwxNTVcMVwxNTFcMlwxNzJcMVwxNjNcMVwxNTNcMVwxNTBcMVwxNjBcMVwxNzJcMlwxNDdcMVwxNzJcMVwxNTNcMlwxNDVcMlx1ZmZmZlwxXDEwNFwxXDE1N1wxXDE2MlwxXDE2NlwxXDE0NVwxXDE1NFwxXDE0NFwxXDE0M1wxXDE3MlwxXDE1N1wxXDE3MlwxXDE2NVwxXDE1N1wxXDE3MlwxXDE1MVwxXHVmZmZmXDFcMTU3XDFcMTU0XDFcdWZmZmZcMVwxNDVcMVwxNTdcMVwxNzJcMVwxNDVcMVwxNzJcMVwxNDFcMVwxNTNcMVwxNDVcMVwxNzJcMVwxNTFcMVwxNDFcMVwxNDNcMVx1ZmZmZlwxXDE2NFwxXDE0NVwxXDE3MlwxXDE1NFwxXHVmZmZmXDFcMTQxXDFcMTUxXDFcMTcxXDFcMTQ1XDFcMTQzXDFcMTUwXDFcMTcyXDFcMTUwXDFcMTYyXDFcMTU0XDFcMTQ1XDFcMTQ0XDJcdWZmZmZcMVwxNTdcMVwxNTZcMVwxNDVcMVwxNjNcMVwxNDVcMVwxNzJcMVwxNDRcMVwxNjRcMVwxNTFcMVwxNjJcMVwxMTRcMVwxNDNcMVwxNTBcMVwxNjJcMVwxNTRcMVwxNjRcMVwxNjJcMVwxNDFcMVwxNTZcMVwxNDVcMVwxNzJcMVwxNTRcMVwxNDFcMVx1ZmZmZlwxXDE3MlwxXDE1NlwyXHVmZmZmXDFcMTUxXDFcMTQxXDFcMTcyXDFcMTQ1XDFcdWZmZmZcMVwxNzJcMVwxNDVcMVwxNTFcMVwxNTdcMVwxNzFcMVx1ZmZmZlwxXDE0NVwxXDEyNFwxXDE2NFwxXDE0MVwxXDE2M1wxXDE2NFwxXDE0NVwxXDE3MlwxXDE1MVwxXDE1N1wxXDE2NVwxXHVmZmZmXDFcMTY2XDFcdWZmZmZcMlwxNjJcMVx1ZmZmZlwxXDE0N1wxXDE2N1wxXDE0NVwxXDE1N1wxXDE2N1wxXHVmZmZmXDFcMTcyXDFcdWZmZmZcMVwxNTRcMVwxNjVcMVwxNjNcMVx1ZmZmZlwxXDE1NVwxXDE2NFwxXDE2NVwxXDE2MlwxXDE0NVwxXDExNlwxXHVmZmZmXDFcMTcyXDFcMTY0XDFcMTU2XDJcMTcyXDFcMTUwXDFcMTQ1XDFcMTcyXDFcdWZmZmZcMVwxNzJcMlwxNDVcMVwxNzJcMVwxNDFcMVwxNjJcMlwxNjNcMVwxNDVcMVwxNjRcMVwxNTZcMVx1ZmZmZlwxXDE1MVwxXDE3MVwxXDE0M1wxXDE3MlwxXDE1MVwxXDE1MFwxXDE2MlwxXDE2NFwxXDE1NFwxXDE1NlwxXDE0M1wxXDE1NlwxXDE2NFwxXDE3MlwxXHVmZmZmXDFcMTU0XDFcMTY0XDFcdWZmZmZcMVwxNzJcMVwxNjNcMVwxNDdcMVx1ZmZmZlwxXDE2MlwxXHVmZmZmXDFcMTcyXDFcMTU2XDFcMTcyXDFcMTU3XDFcMTAxXDFcMTYyXDFcMTcxXDFcNTVcMVwxNjRcMVwxNDVcMVwxMDRcMVwxNjJcMVx1ZmZmZlwxXDE2M1wxXDE1NVwxXDE2NFwxXDE0NVwxXDE1NlwxXDE2NFwxXDE1NlwxXDExNlwxXDE3MlwxXDE0NlwxXDE3MlwxXHVmZmZmXDFcMTQ1XDFcMTYwXDFcMTY0XDFcMTUxXDFcMTQ1XDFcMTU0XDFcMTUxXDFcMTAzXDFcMTQxXDFcdWZmZmZcMVwxNDVcMVwxNDdcMlx1ZmZmZlwxXDE3MlwxXDEyM1wyXHVmZmZmXDJcMTcyXDFcdWZmZmZcMVwxNjRcMVwxMTZcMVwxNjNcMVwxNTFcMVwxNjNcMVwxNzJcMVwxMDZcMVwxNjRcMVwxNTZcMlwxNzJcMVx1ZmZmZlwxXDE1NlwxXDE3MlwxXDE1N1wyXDE3MlwxXDE2NVwxXDE1MFwxXDE0M1wxXDE3MlwxXHVmZmZmXDFcMTcxXDFcMTcyXDFcdWZmZmZcMVwxNjRcMVwxNDVcMVwxNjRcMVx1ZmZmZlwxXDE0N1wxXHVmZmZmXDFcMTQyXDFcMTY0XDFcMTIwXDFcMTAyXDFcMTYwXDFcdWZmZmZcMVwxNDVcMVwxNDNcMVwxNDFcMVwxNjNcMVwxNDVcMVwxNzJcMVwxNDVcNFwxNzJcMVwxNTdcMVx1ZmZmZlwxXDE3MlwxXHVmZmZmXDJcMTcyXDFcMTExXDFcMTY0XDFcMTA2XDFcMTY0XDFcMTQyXDFcMTUwXDFcMTU1XDFcMTE3XDFcMTcyXDFcdWZmZmZcMVwxNTFcMlx1ZmZmZlwxXDE0NVwxXDE0MVwxXDE3MlwxXDE1N1wxXDE1MVwxXHVmZmZmXDFcMTUxXDFcMTIzXDFcMTQ3XDJcdWZmZmZcMVwxNDVcMVx1ZmZmZlwxXDE1NlwyXHVmZmZmXDFcMTU0XDFcMTQxXDFcMTQ1XDFcdWZmZmZcMVwxNzJcMVx1ZmZmZlwyXDE3MlwxXDE3MVwyXDE3MlwxXDE2NFwxXDE0MVwxXDE1NlwxXDE3MVwxXDE0NVwxXDE3MlwxXDE1N1wxXDE2NFwxXDE0MVwxXDE0M1wxXHVmZmZmXDFcMTAzXDRcdWZmZmZcMVwxNTZcM1x1ZmZmZlwxXDE1NVwxXDE3MFwxXDE0NVwxXDE1MVwxXDE3MlwxXDE0NVwxXDE0MVwxXDE0NVwxXDE1NlwxXHVmZmZmXDJcMTcyXDFcMTU1XDFcdWZmZmZcMVwxNTZcMVwxNTdcMVwxNTRcMVwxNTFcMVwxNzJcMVwxNjNcMVwxNTFcMVwxNTRcMVwxNTZcMVwxNTdcM1x1ZmZmZlwxXDE3MlwxXDE1N1wyXHVmZmZmXDFcMTYyXDJcMTY0XDJcMTcyXDFcdWZmZmZcMVwxNTZcMVwxNDVcMVwxNTRcMlwxNTdcMVwxNDVcMVwxNjVcMlwxNjBcMVwxNjJcMVwxNTRcMVx1ZmZmZlwxXDE0NFwxXDE2MlwyXDE3MlwxXDE0NVwxXHVmZmZmXDFcMTQ1XDFcMTcyXDFcMTU2XDFcMTY0XDFcMTcyXDFcdWZmZmZcM1wxNzJcMVwxNDdcMVwxNDZcMVx1ZmZmZlwxXDE0NFwxXDE1MVwxXDE1MFwxXDE1MVwyXHVmZmZmXDFcMTQ0XDFcMTcyXDFcMTU0XDJcMTU2XDFcMTYzXDFcMTU2XDJcMTU3XDFcMTcyXDFcMTQ1XDFcMTAyXDFcMTQxXDJcdWZmZmZcMlwxNzJcMVx1ZmZmZlwxXDE3MlwyXDE0NVwxXHVmZmZmXDFcMTQ1XDFcdWZmZmZcMVwxNDVcMVwxNzJcMVwxNDVcMVwxNDJcMVwxNzJcMVwxNjRcMVwxNjNcMVx1ZmZmZlwxXDE3MVwxXDE0NFwxXDE2NFwxXDE2NVwxXDE1MVwyXDE2MlwxXHVmZmZmXDFcMTAxXDFcMTcxXDFcMTQzXDNcdWZmZmZcMVwxNjJcMVwxNzJcMVwxNDRcMVwxNzJcMVx1ZmZmZlwxXDE1NFwxXDE2NVwxXHVmZmZmXDFcMTcxXDFcMTcyXDFcMTI1XDFcMTYzXDFcMTQ1XDFcMTU0XDFcMTYxXDJcMTY0XDFcMTQ2XDFcMTcyXDFcMTY0XDFcMTcyXDFcdWZmZmZcMVwxNzJcMVx1ZmZmZlwxXDE3MlwxXDE2NFwxXDE3MlwxXHVmZmZmXDFcMTU2XDFcMTcyXDFcMTcwXDFcMTY0XDFcMTY1XDJcMTcyXDFcMTY0XDFcdWZmZmZcMVwxNDVcM1x1ZmZmZlwxXDE0NVwxXHVmZmZmXDFcMTUxXDFcdWZmZmZcMVwxNjRcMVwxNzJcMVwxNDVcMlx1ZmZmZlwxXDE0NVwxXDE2MlwxXDE3MlwxXDE2MVwxXDE3MlwxXHVmZmZmXDFcMTIyXDFcMTYyXDFcMTcyXDFcdWZmZmZcMVwxNjVcMVx1ZmZmZlwxXDE0NVwxXDExMVwxXHVmZmZmXDFcMTQ1XDFcMTYzXDFcMTU1XDFcMTExXDFcMTY1XDFcMTYwXDFcMTQ0XDFcMTU0XDFcMTU3XDFcMTQ1XDFcMTY0XDFcMTYyXDFcMTU2XDFcMTcyXDJcMTY0XDFcdWZmZmZcMVwxNzJcMVwxNTFcMVx1ZmZmZlwxXDE0NlwxXDE1MVwxXDE0NVwxXDE2MlwxXDE3MlwxXHVmZmZmIjsKICAgICBzdGF0aWMgZmluYWwgU3RyaW5nIERGQTIxX2FjY2VwdFMgPQotICAgICAgICAiXDQwXHVmZmZmXDFcNzJcMVw3M1wxMlx1ZmZmZlwxXDE0M1wxXDE0NFwxXDE0NVwxXDE0NlwxXDE0N1wxXDE1MFwxXDE1MVwxXDE1Mlw0XHVmZmZmXDFcdTAwOTJcMlx1MDA5M1wxXHUwMDk2XDFcdTAwOTdcMVx1ZmZmZlwxXDIzXDFcMVwxXDJcMVx1MDA4Y1wxXDNcMVwxNzZcMVw0XDFcMzVcMVwyNlwxXDVcMVwyMFwxXDM2XDFcMjdcMVw2XDFcMzFcMVwzMFwxXDdcMVx1MDA5NFwxXHUwMDk1XDFcMzJcMVwxMFwxXDMzXDFcdWZmZmZcMVwzNFwxXDE1XDFcMTZcMVwyNFwxXDE3XDFcdWZmZmZcMVwzN1wxXDI1XDFcdTAwOGJcMVwxNzVcMlx1ZmZmZlwxXHUwMDkyXDUzXHVmZmZmXDFcNzJcMVw3M1wyMlx1ZmZmZlwxXDE0M1wxXDE0NFwxXDE0NVwxXDE0NlwxXDE0N1wxXDE1MFwxXDE1MVwxXDE1MlwxXHUwMDhhXDFcMTU3XDFcdTAwOGZcMVx1ZmZmZlwxXHUwMDkwXDFcdTAwOTFcMVx1MDA5M1wxXHUwMDk2XDFcMTNcMVwxMVwxXDE0XDFcMTJcMVwyMVwxXDIyXDIyXHVmZmZmXDFcMTU0XDIzXHVmZmZmXDFcMTI0XDE1XHVmZmZmXDFcMTQwXDEzXHVmZmZmXDFcMTYzXDRcdWZmZmZcMVx1MDA4OVwxMlx1ZmZmZlwxXDEzNlwyXHVmZmZmXDFcNDBcMVx1MDA4ZFwyNFx1ZmZmZlwxXDEyM1wyXHVmZmZmXDFcNTFcMVw1NFw0XHVmZmZmXDFcNTBcNVx1ZmZmZlwxXDEzN1wxM1x1ZmZmZlwxXDExMFw2XHVmZmZmXDFcMTcxXDFcdWZmZmZcMVwxMDFcMlx1ZmZmZlwxXDEwNFw1XHVmZmZmXDFcMTY0XDEwXHVmZmZmXDFcMTIyXDExXHVmZmZmXDFcMTU1XDE0XHVmZmZmXDFcNzVcMlx1ZmZmZlwxXDEzM1wzXHVmZmZmXDFcNzZcMVx1ZmZmZlwxXDUyXDE0XHVmZmZmXDFcNjBcMTFcdWZmZmZcMVx1MDA4ZVw3XHVmZmZmXDFcMTY1XDJcdWZmZmZcMVwxMzJcMVwxNjFcMlx1ZmZmZlwxXDEyMVwxXDEyNVwxNFx1ZmZmZlwxXDQ1XDdcdWZmZmZcMVw0NlwyXHVmZmZmXDFcNDdcM1x1ZmZmZlwxXDY2XDFcdWZmZmZcMVwxMjZcNVx1ZmZmZlwxXDUzXDEyXHVmZmZmXDFcNzFcMVx1ZmZmZlwxXDE2N1wxMVx1ZmZmZlwxXDE3NFwxXHVmZmZmXDFcMTYyXDExXHVmZmZmXDFcMTEyXDFcNDJcMVx1ZmZmZlwxXDE1NlwxXHVmZmZmXDFcNDNcMlx1ZmZmZlwxXHUwMDgyXDFcdWZmZmZcMVwxMTdcMTBcdWZmZmZcMVx1MDA4NFw3XHVmZmZmXDFcNjNcMVx1ZmZmZlwxXDY3XDFcMTcwXDFcdTAwODBcMVwxNjZcMVwxMDNcMVwxMTZcNlx1ZmZmZlwxXDEzMVwxXHVmZmZmXDFcMTM1XDNcdWZmZmZcMVw0MVwxMFx1ZmZmZlwxXDE3MlwxXDY1XDFcNzBcMlx1ZmZmZlwxXDEyMFwxXDE0MVw1XHVmZmZmXDFcNTVcNlx1ZmZmZlwxXDE2MFw3XHVmZmZmXDFcdTAwODNcNFx1ZmZmZlwxXDEwMlw0XHVmZmZmXDFcMTM0XDRcdWZmZmZcMVx1MDA4OFwxXDE0MlwxMFx1ZmZmZlwxXDExM1wxXDExNFw0XHVmZmZmXDFcNDRcMlx1ZmZmZlwxXDEwN1wxMFx1ZmZmZlwxXDU2XDNcdWZmZmZcMVwxMDVcMlx1ZmZmZlwxXHUwMDg1XDJcdWZmZmZcMVw3N1wxXDExNVwzXHVmZmZmXDFcMTUzXDJcdWZmZmZcMVwxMjdcMTFcdWZmZmZcMVwxMDBcMVx1ZmZmZlwxXDc0XDNcdWZmZmZcMVw2MlwzXHVmZmZmXDFcMTc3XDNcdWZmZmZcMVwxNzNcMVwxMTFcMVx1ZmZmZlwxXDEzMFwxXHVmZmZmXDFcNjFcMTBcdWZmZmZcMVx1MDA4NlwxXHVmZmZmXDFcdTAwODFcMVx1ZmZmZlwxXDY0XDFcMTA2XDE0XHVmZmZmXDFcdTAwODdcNlx1ZmZmZlwxXDU3IjsKKyAgICAgICAgIlw0MVx1ZmZmZlwxXDc3XDFcMTAwXDEyXHVmZmZmXDFcMTU1XDFcMTU2XDFcMTU3XDFcMTYwXDFcMTYxXDFcMTYyXDFcMTYzXDFcMTY0XDRcdWZmZmZcMVx1MDA5ZVwyXHUwMDlmXDFcdTAwYTJcMVx1MDBhM1wxXHVmZmZmXDFcMjNcMVwxXDFcMlwxXHUwMDk4XDFcM1wxXHUwMDg4XDFcNFwxXDM1XDFcMjZcMVw1XDFcMjBcMVwzNlwxXDI3XDFcNlwxXDMxXDFcMzBcMVw3XDFcdTAwYTBcMVx1MDBhMVwxXDMyXDFcMTBcMVwzM1wxXHVmZmZmXDFcMzRcMVwxNVwxXDE2XDFcMjRcMVw3MFwxXDE3XDFcdWZmZmZcMVwzN1wxXDI1XDFcdTAwOTdcMVx1MDA4N1wyXHVmZmZmXDFcdTAwOWVcNjBcdWZmZmZcMVw3N1wxXDEwMFwyMlx1ZmZmZlwxXDE1NVwxXDE1NlwxXDE1N1wxXDE2MFwxXDE2MVwxXDE2MlwxXDE2M1wxXDE2NFwxXHUwMDk2XDFcMTcxXDFcdTAwOWJcMVx1ZmZmZlwxXHUwMDljXDFcdTAwOWRcMVx1MDA5ZlwxXHUwMGEyXDFcMTNcMVwxMVwxXDE0XDFcMTJcMVwyMVwxXDIyXDIzXHVmZmZmXDFcMTY2XDIzXHVmZmZmXDFcNzRcMVwxMzNcMTdcdWZmZmZcMVwxNTBcMlx1ZmZmZlwxXDE1MlwxNFx1ZmZmZlwxXDE3NVw0XHVmZmZmXDFcdTAwOTVcMTRcdWZmZmZcMVw0MFwxXHUwMDk5XDI3XHVmZmZmXDFcMTMyXDJcdWZmZmZcMVw1MVwxXDU0XDRcdWZmZmZcMVw1MFw1XHVmZmZmXDFcMTUxXDEzXHVmZmZmXDFcMTE1XDFcdWZmZmZcMVwxNDRcMlx1ZmZmZlwxXDczXDVcdWZmZmZcMVx1MDA4M1wxXHVmZmZmXDFcMTA2XDNcdWZmZmZcMVwxMTFcNlx1ZmZmZlwxXDE3NlwxMFx1ZmZmZlwxXDEzMVwxM1x1ZmZmZlwxXDE2N1wxNlx1ZmZmZlwxXDEwMlwyXHVmZmZmXDFcMTQyXDNcdWZmZmZcMVwxMDNcMVx1ZmZmZlwxXDUyXDE0XHVmZmZmXDFcNjBcMTNcdWZmZmZcMVx1MDA5YVwxMVx1ZmZmZlwxXDE3N1wyXHVmZmZmXDFcMTQxXDFcMTczXDJcdWZmZmZcMVwxMjdcMVwxMzRcMlx1ZmZmZlwxXDE0NlwxM1x1ZmZmZlwxXDQ1XDExXHVmZmZmXDFcNDZcMlx1ZmZmZlwxXDQ3XDNcdWZmZmZcMVw2NlwxXHVmZmZmXDFcMTM1XDVcdWZmZmZcMVw1M1wxNFx1ZmZmZlwxXDc2XDFcdWZmZmZcMVx1MDA4MVwxM1x1ZmZmZlwxXHUwMDg2XDFcdWZmZmZcMVwxNDVcMVwxNzRcNVx1ZmZmZlwxXDEyNVwzXHVmZmZmXDFcMTE3XDFcNDJcMVx1ZmZmZlwxXDE3MFwxXHVmZmZmXDFcNDNcMVw3MVwzXHVmZmZmXDFcdTAwOGRcMVx1ZmZmZlwxXDEyNFwxN1x1ZmZmZlwxXDYzXDFcdWZmZmZcMVw2N1wxXHUwMDgyXDFcdTAwOGFcMVwxNDdcMVx1ZmZmZlwxXHUwMDgwXDFcMTEwXDFcMTIzXDExXHVmZmZmXDFcMTQwXDNcdWZmZmZcMVw0MVwxMlx1ZmZmZlwxXHUwMDg0XDFcNjVcMVw3NVwyXHVmZmZmXDFcMTI2XDFcMTUzXDVcdWZmZmZcMVw1NVwxM1x1ZmZmZlwxXDE3Mlw1XHVmZmZmXDFcdTAwOGVcNVx1ZmZmZlwxXDEwN1w1XHVmZmZmXDFcMTQzXDRcdWZmZmZcMVx1MDA5NFwxXDE1NFwxNVx1ZmZmZlwxXDEyMFwxXDEyMVwyXHVmZmZmXDFcNDRcM1x1ZmZmZlwxXDExNFwxXHVmZmZmXDFcNzJcN1x1ZmZmZlwxXDU2XDdcdWZmZmZcMVwxMTJcM1x1ZmZmZlwxXHUwMDkxXDFcMTA0XDFcMTIyXDRcdWZmZmZcMVwxNjVcMlx1ZmZmZlwxXDEzNlwxNVx1ZmZmZlwxXDEwNVwxXHVmZmZmXDFcMTAxXDNcdWZmZmZcMVw2MlwxMFx1ZmZmZlwxXHUwMDg5XDFcdWZmZmZcMVwxMzBcMVx1MDA4NVwxXDExNlwxXHVmZmZmXDFcMTM3XDFcdWZmZmZcMVw2MVwzXHVmZmZmXDFcdTAwOGZcMVx1MDA5MFw1XHVmZmZmXDFcdTAwOTJcM1x1ZmZmZlwxXHUwMDhjXDFcdWZmZmZcMVw2NFwyXHVmZmZmXDFcMTEzXDIwXHVmZmZmXDFcdTAwOTNcMlx1ZmZmZlwxXHUwMDhiXDVcdWZmZmZcMVw1NyI7CiAgICAgc3RhdGljIGZpbmFsIFN0cmluZyBERkEyMV9zcGVjaWFsUyA9Ci0gICAgICAgICJcMVwwXHUwMmIzXHVmZmZmfT4iOworICAgICAgICAiXDFcMFx1MDMwM1x1ZmZmZn0+IjsKICAgICBzdGF0aWMgZmluYWwgU3RyaW5nW10gREZBMjFfdHJhbnNpdGlvblMgPSB7Ci0gICAgICAgICAgICAiXDExXDc0XDJcNzNcMlw3NFwxXDczXDIyXDc0XDFcNzNcMVwxMVwxXDcxXDFcNjJcMVw3MFwxXDEwXDFcM1wxXDcyXDFcNTZcMVw1N1wxXDZcMVw0XDFcNjBcMVw1XDFcMTRcMVw3XDFcNjVcMTFcNjZcMVw2NFwxXDU0XDFcMTNcMVwxXDFcMTJcMVwxNVwxXDU1XDJcNzBcMVw0NFwxXDMyXDFcMzVcN1w3MFwxXDMzXDFcMjdcM1w3MFwxXDM0XDFcMzBcMVw3MFwxXDMxXDJcNzBcMVw0MlwyXDcwXDFcNjNcMVw3NFwxXDYxXDFcNjdcMVw3MFwxXDc0XDFcNTNcMVw3MFwxXDUwXDFcNDVcMVwxN1wxXDIyXDJcNzBcMVwyMVwxXDI0XDFcNTFcMVw0M1wxXDI1XDFcNDdcMVwyNlwxXDIzXDFcNDZcMVwzNlwxXDIwXDFcMzdcMVw3MFwxXDE2XDFcNTJcM1w3MFwxXDQwXDFcMlwxXDQxXHVmZjgyXDc0IiwKLSAgICAgICAgICAgICJcMVw3NVwxXDc2IiwKLSAgICAgICAgICAgICJcMVwxMDAiLAotICAgICAgICAgICAgIlwxXDEwMiIsCi0gICAgICAgICAgICAiXDFcMTA1XDIxXHVmZmZmXDFcMTA0IiwKLSAgICAgICAgICAgICJcMVwxMTFcMTdcdWZmZmZcMVwxMDdcMVwxMTAiLAotICAgICAgICAgICAgIlwxXDExNFwyMlx1ZmZmZlwxXDExMyIsCi0gICAgICAgICAgICAiXDFcMTE3XDRcdWZmZmZcMVwxMjBcMTVcdWZmZmZcMVwxMTYiLAotICAgICAgICAgICAgIlwxXDEyMiIsCi0gICAgICAgICAgICAiXDFcMTI0IiwKLSAgICAgICAgICAgICJcMVwxMjYiLAotICAgICAgICAgICAgIlwxXDEzMCIsCi0gICAgICAgICAgICAiXDFcMTMyIiwKLSAgICAgICAgICAgICJcMVwxMzVcMTNcdWZmZmZcMVwxMzQiLAotICAgICAgICAgICAgIlwxXDEzN1wzXHVmZmZmXDFcMTQwIiwKLSAgICAgICAgICAgICJcMVwxNDNcMVx1ZmZmZlwxXDE0NFwxMVx1ZmZmZlwxXDE0MiIsCi0gICAgICAgICAgICAiXDFcMTQ3XDEwXHVmZmZmXDFcMTQ1XDFcMTQ2XDFcdWZmZmZcMVwxNTBcMVx1ZmZmZlwxXDE1MSIsCi0gICAgICAgICAgICAiXDFcMTU0XDZcdWZmZmZcMVwxNTJcMVwxNTMiLAotICAgICAgICAgICAgIlwxXDE1NVw3XHVmZmZmXDFcMTU2XDVcdWZmZmZcMVwxNTdcMlx1ZmZmZlwxXDE2MCIsCi0gICAgICAgICAgICAiXDFcMTY1XDJcdWZmZmZcMVwxNjNcMVwxNjRcNlx1ZmZmZlwxXDE2MVwxXHVmZmZmXDFcMTYyXDNcdWZmZmZcMVwxNjYiLAotICAgICAgICAgICAgIlwxXDE2NyIsCi0gICAgICAgICAgICAiXDFcMTcyXDNcdWZmZmZcMVwxNzFcM1x1ZmZmZlwxXDE3M1w2XHVmZmZmXDFcMTcwIiwKLSAgICAgICAgICAgICJcMVwxNzRcMTJcdWZmZmZcMVwxNzUiLAotICAgICAgICAgICAgIlwxXDE3N1wxNVx1ZmZmZlwxXDE3NiIsCi0gICAgICAgICAgICAiXDFcdTAwODAiLAotICAgICAgICAgICAgIlwxXHUwMDgxIiwKLSAgICAgICAgICAgICJcMVx1MDA4MiIsCi0gICAgICAgICAgICAiXDFcdTAwODMiLAorICAgICAgICAgICAgIlwxMVw3NVwyXDc0XDJcNzVcMVw3NFwyMlw3NVwxXDc0XDFcMTFcMVw3MlwxXDYzXDFcNzFcMVwxMFwxXDNcMVw3M1wxXDU3XDFcNjBcMVw2XDFcNFwxXDYxXDFcNVwxXDE0XDFcN1wxXDY2XDExXDY3XDFcNjVcMVw1NVwxXDEzXDFcMVwxXDEyXDFcMTVcMVw1NlwyXDcxXDFcNDVcMVwzMlwxXDM1XDdcNzFcMVwzM1wxXDI3XDNcNzFcMVwzNFwxXDMwXDFcNzFcMVwzMVwyXDcxXDFcNDNcMlw3MVwxXDY0XDFcNzVcMVw2MlwxXDcwXDFcNzFcMVw3NVwxXDM3XDFcNzFcMVw1MVwxXDQ2XDFcMTdcMVwyMlwxXDcxXDFcNTRcMVwyMVwxXDI0XDFcNTJcMVw0NFwxXDI1XDFcNTBcMVwyNlwxXDIzXDFcNDdcMVwzNlwxXDIwXDFcNDBcMVw3MVwxXDE2XDFcNTNcM1w3MVwxXDQxXDFcMlwxXDQyXHVmZjgyXDc1IiwKKyAgICAgICAgICAgICJcMVw3NlwxXDc3IiwKKyAgICAgICAgICAgICJcMVwxMDEiLAorICAgICAgICAgICAgIlwxXDEwMyIsCisgICAgICAgICAgICAiXDFcMTA2XDIxXHVmZmZmXDFcMTA1IiwKKyAgICAgICAgICAgICJcMVwxMTJcMTdcdWZmZmZcMVwxMTBcMVwxMTEiLAorICAgICAgICAgICAgIlwxXDExNVwyMlx1ZmZmZlwxXDExNCIsCisgICAgICAgICAgICAiXDFcMTIwXDRcdWZmZmZcMVwxMjFcMTVcdWZmZmZcMVwxMTciLAorICAgICAgICAgICAgIlwxXDEyMyIsCisgICAgICAgICAgICAiXDFcMTI1IiwKKyAgICAgICAgICAgICJcMVwxMjciLAorICAgICAgICAgICAgIlwxXDEzMlwxXDEzMSIsCisgICAgICAgICAgICAiXDFcMTM0IiwKKyAgICAgICAgICAgICJcMVwxMzdcMTNcdWZmZmZcMVwxMzYiLAorICAgICAgICAgICAgIlwxXDE0MVwzXHVmZmZmXDFcMTQyIiwKKyAgICAgICAgICAgICJcMVwxNDVcMVx1ZmZmZlwxXDE0NlwxMVx1ZmZmZlwxXDE0NCIsCisgICAgICAgICAgICAiXDFcMTUxXDEwXHVmZmZmXDFcMTQ3XDFcMTUwXDFcdWZmZmZcMVwxNTJcMVx1ZmZmZlwxXDE1MyIsCisgICAgICAgICAgICAiXDFcMTU3XDZcdWZmZmZcMVwxNTRcMVwxNTZcNFx1ZmZmZlwxXDE1NSIsCisgICAgICAgICAgICAiXDFcMTYwXDdcdWZmZmZcMVwxNjFcNVx1ZmZmZlwxXDE2MlwyXHVmZmZmXDFcMTYzIiwKKyAgICAgICAgICAgICJcMVwxNzBcMlx1ZmZmZlwxXDE2NlwxXDE2N1w2XHVmZmZmXDFcMTY0XDFcdWZmZmZcMVwxNjVcM1x1ZmZmZlwxXDE3MSIsCisgICAgICAgICAgICAiXDFcMTcyIiwKKyAgICAgICAgICAgICJcMVwxNzVcM1x1ZmZmZlwxXDE3NFwzXHVmZmZmXDFcMTc2XDZcdWZmZmZcMVwxNzMiLAorICAgICAgICAgICAgIlwxXDE3N1wxMlx1ZmZmZlwxXHUwMDgxXDNcdWZmZmZcMVx1MDA4MCIsCisgICAgICAgICAgICAiXDFcdTAwODNcMTVcdWZmZmZcMVx1MDA4MiIsCiAgICAgICAgICAgICAiXDFcdTAwODQiLAotICAgICAgICAgICAgIlwxXHUwMDg2XDYzXHVmZmZmXDFcdTAwODUiLAorICAgICAgICAgICAgIlwxXHUwMDg1IiwKKyAgICAgICAgICAgICJcMVx1MDA4NiIsCiAgICAgICAgICAgICAiXDFcdTAwODciLAotICAgICAgICAgICAgIlwxXHUwMDhiXDFcdTAwODhcNVx1ZmZmZlwxXHUwMDg5XDJcdWZmZmZcMVx1MDA4Y1w2XHVmZmZmXDFcdTAwOGEiLAorICAgICAgICAgICAgIlwxXHUwMDg4IiwKKyAgICAgICAgICAgICJcMVx1MDA4YVw2M1x1ZmZmZlwxXHUwMDg5IiwKKyAgICAgICAgICAgICJcMVx1MDA4YiIsCisgICAgICAgICAgICAiXDFcdTAwOGVcMVx1ZmZmZlwxXHUwMDhjXDRcdWZmZmZcMVx1MDA4ZCIsCisgICAgICAgICAgICAiXDFcdTAwOTJcMVx1MDA4Zlw1XHVmZmZmXDFcdTAwOTBcMlx1ZmZmZlwxXHUwMDkzXDZcdWZmZmZcMVx1MDA5MSIsCiAgICAgICAgICAgICAiIiwKICAgICAgICAgICAgICIiLAotICAgICAgICAgICAgIlwxXHUwMDhmIiwKLSAgICAgICAgICAgICJcMVx1MDA5MCIsCi0gICAgICAgICAgICAiXDFcdTAwOTEiLAotICAgICAgICAgICAgIlwxXHUwMDkyXDExXHVmZmZmXDFcdTAwOTMiLAotICAgICAgICAgICAgIlwxXHUwMDk0IiwKLSAgICAgICAgICAgICJcMVx1MDA5NlwxMVx1ZmZmZlwxXHUwMDk1XDNcdWZmZmZcMVx1MDA5OFwxXHVmZmZmXDFcdTAwOTciLAotICAgICAgICAgICAgIlwxXHUwMDliXDE1XHVmZmZmXDFcdTAwOWFcMlx1ZmZmZlwxXHUwMDk5IiwKKyAgICAgICAgICAgICJcMVx1MDA5NiIsCisgICAgICAgICAgICAiXDFcdTAwOThcMTVcdWZmZmZcMVx1MDA5NyIsCisgICAgICAgICAgICAiXDFcdTAwOTkiLAorICAgICAgICAgICAgIlwxXHUwMDlhXDExXHVmZmZmXDFcdTAwOWIiLAogICAgICAgICAgICAgIlwxXHUwMDljIiwKLSAgICAgICAgICAgICJcMVx1MDA5ZVwxXHUwMDlkIiwKLSAgICAgICAgICAgICJcMVx1MDBhMFw2XHVmZmZmXDFcdTAwOWYiLAorICAgICAgICAgICAgIlwxXHUwMDllXDExXHVmZmZmXDFcdTAwOWRcM1x1ZmZmZlwxXHUwMGEwXDFcdWZmZmZcMVx1MDA5ZiIsCisgICAgICAgICAgICAiXDFcdTAwYTNcMTVcdWZmZmZcMVx1MDBhMlwyXHVmZmZmXDFcdTAwYTEiLAorICAgICAgICAgICAgIlwxXHUwMGE0IiwKKyAgICAgICAgICAgICJcMVx1MDBhNlwxXHUwMGE1IiwKKyAgICAgICAgICAgICJcMVx1MDBhNyIsCiAgICAgICAgICAgICAiIiwKICAgICAgICAgICAgICIiLAogICAgICAgICAgICAgIiIsCkBAIC01MTEyLDE2ICs1NDYxLDE2IEBACiAgICAgICAgICAgICAiIiwKICAgICAgICAgICAgICIiLAogICAgICAgICAgICAgIiIsCi0gICAgICAgICAgICAiXDFcdTAwYTkiLAotICAgICAgICAgICAgIlwxMlx1MDBhY1wxMFx1ZmZmZlwxXHUwMGFlXDFcdWZmZmZcM1x1MDBhZVw1XHVmZmZmXDFcdTAwYWVcMTNcdWZmZmZcMVx1MDBhYlw2XHVmZmZmXDFcdTAwYWNcMlx1ZmZmZlwxXHUwMGFlXDFcdWZmZmZcM1x1MDBhZVw1XHVmZmZmXDFcdTAwYWVcMTNcdWZmZmZcMVx1MDBhYiIsCi0gICAgICAgICAgICAiXDEyXHUwMGFjXDEwXHVmZmZmXDFcdTAwYWVcMVx1ZmZmZlwzXHUwMGFlXDVcdWZmZmZcMVx1MDBhZVwyMlx1ZmZmZlwxXHUwMGFjXDJcdWZmZmZcMVx1MDBhZVwxXHVmZmZmXDNcdTAwYWVcNVx1ZmZmZlwxXHUwMGFlIiwKLSAgICAgICAgICAgICJcMVwxNDFcMzRcdWZmZmZcMzJcMTQxXDRcdWZmZmZcMVwxNDFcMVx1ZmZmZlwzMlwxNDEiLAorICAgICAgICAgICAgIlwxXHUwMGIwIiwKKyAgICAgICAgICAgICJcMTJcdTAwYjNcMTBcdWZmZmZcMVx1MDBiNVwxXHVmZmZmXDNcdTAwYjVcNVx1ZmZmZlwxXHUwMGI1XDEzXHVmZmZmXDFcdTAwYjJcNlx1ZmZmZlwxXHUwMGIzXDJcdWZmZmZcMVx1MDBiNVwxXHVmZmZmXDNcdTAwYjVcNVx1ZmZmZlwxXHUwMGI1XDEzXHVmZmZmXDFcdTAwYjIiLAorICAgICAgICAgICAgIlwxMlx1MDBiM1wxMFx1ZmZmZlwxXHUwMGI1XDFcdWZmZmZcM1x1MDBiNVw1XHVmZmZmXDFcdTAwYjVcMjJcdWZmZmZcMVx1MDBiM1wyXHVmZmZmXDFcdTAwYjVcMVx1ZmZmZlwzXHUwMGI1XDVcdWZmZmZcMVx1MDBiNSIsCisgICAgICAgICAgICAiXDFcMTQzXDM0XHVmZmZmXDMyXDE0M1w0XHVmZmZmXDFcMTQzXDFcdWZmZmZcMzJcMTQzIiwKICAgICAgICAgICAgICIiLAogICAgICAgICAgICAgIiIsCiAgICAgICAgICAgICAiIiwKICAgICAgICAgICAgICIiLAogICAgICAgICAgICAgIiIsCi0gICAgICAgICAgICAiXDFcdTAwYjEiLAorICAgICAgICAgICAgIlwxXHUwMGI4IiwKICAgICAgICAgICAgICIiLAogICAgICAgICAgICAgIiIsCiAgICAgICAgICAgICAiIiwKQEAgLTUxNDQsMjI2ICs1NDkzLDIxMSBAQAogICAgICAgICAgICAgIiIsCiAgICAgICAgICAgICAiIiwKICAgICAgICAgICAgICIiLAotICAgICAgICAgICAgIlwxXHUwMGIzIiwKKyAgICAgICAgICAgICJcMVx1MDBiYSIsCiAgICAgICAgICAgICAiIiwKICAgICAgICAgICAgICIiLAogICAgICAgICAgICAgIiIsCiAgICAgICAgICAgICAiIiwKICAgICAgICAgICAgICIiLAotICAgICAgICAgICAgIlwxXHUwMGI1IiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIlwxXHUwMGJjIiwKICAgICAgICAgICAgICIiLAogICAgICAgICAgICAgIiIsCiAgICAgICAgICAgICAiIiwKICAgICAgICAgICAgICIiLAotICAgICAgICAgICAgIlwxXHUwMGI3XDVcdWZmZmZcMVx1MDBiOCIsCi0gICAgICAgICAgICAiXDFcdTAwYjkiLAotICAgICAgICAgICAgIiIsCi0gICAgICAgICAgICAiXDFcdTAwYmJcM1x1ZmZmZlwxXHUwMGJhIiwKLSAgICAgICAgICAgICJcMVx1MDBiY1wxNVx1ZmZmZlwxXHUwMGJkIiwKLSAgICAgICAgICAgICJcMVx1MDBiZVwyMFx1ZmZmZlwxXHUwMGJmIiwKKyAgICAgICAgICAgICJcMVx1MDBiZVw1XHVmZmZmXDFcdTAwYmYiLAogICAgICAgICAgICAgIlwxXHUwMGMwIiwKLSAgICAgICAgICAgICJcMVx1MDBjMSIsCi0gICAgICAgICAgICAiXDFcdTAwYzIiLAotICAgICAgICAgICAgIlwxXHUwMGMzIiwKLSAgICAgICAgICAgICJcMVx1MDBjNCIsCi0gICAgICAgICAgICAiXDFcdTAwYzUiLAotICAgICAgICAgICAgIlwxXHUwMGM4XDE2XHVmZmZmXDFcdTAwYzdcMVx1MDBjNiIsCi0gICAgICAgICAgICAiXDFcMTQxXDEzXHVmZmZmXDEyXDE0MVw3XHVmZmZmXDMyXDE0MVw0XHVmZmZmXDFcMTQxXDFcdWZmZmZcMzJcMTQxIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIlwxXHUwMGMyXDNcdWZmZmZcMVx1MDBjMSIsCisgICAgICAgICAgICAiXDFcdTAwYzNcMTVcdWZmZmZcMVx1MDBjNCIsCisgICAgICAgICAgICAiXDFcdTAwYzVcMjBcdWZmZmZcMVx1MDBjNiIsCisgICAgICAgICAgICAiXDFcdTAwYzciLAorICAgICAgICAgICAgIlwxXHUwMGM4IiwKKyAgICAgICAgICAgICJcMVx1MDBjOSIsCiAgICAgICAgICAgICAiXDFcdTAwY2EiLAotICAgICAgICAgICAgIlwxXHUwMGNiXDFcdWZmZmZcMVx1MDBjYyIsCisgICAgICAgICAgICAiXDFcdTAwY2IiLAorICAgICAgICAgICAgIlwxXHUwMGNjIiwKICAgICAgICAgICAgICJcMVx1MDBjZCIsCi0gICAgICAgICAgICAiXDFcdTAwY2UiLAotICAgICAgICAgICAgIlwxXHUwMGNmIiwKLSAgICAgICAgICAgICJcMVx1MDBkMCIsCi0gICAgICAgICAgICAiXDFcdTAwZDEiLAorICAgICAgICAgICAgIlwxXHUwMGQwXDE2XHVmZmZmXDFcdTAwY2ZcMVx1MDBjZSIsCisgICAgICAgICAgICAiXDFcMTQzXDEzXHVmZmZmXDEyXDE0M1w3XHVmZmZmXDMyXDE0M1w0XHVmZmZmXDFcMTQzXDFcdWZmZmZcMzJcMTQzIiwKICAgICAgICAgICAgICJcMVx1MDBkMiIsCi0gICAgICAgICAgICAiXDFcdTAwZDNcMjBcdWZmZmZcMVx1MDBkNCIsCisgICAgICAgICAgICAiXDFcdTAwZDNcMVx1ZmZmZlwxXHUwMGQ0IiwKICAgICAgICAgICAgICJcMVx1MDBkNSIsCiAgICAgICAgICAgICAiXDFcdTAwZDYiLAogICAgICAgICAgICAgIlwxXHUwMGQ3IiwKICAgICAgICAgICAgICJcMVx1MDBkOCIsCi0gICAgICAgICAgICAiXDFcdTAwZDlcMVx1ZmZmZlwxXHUwMGRhIiwKLSAgICAgICAgICAgICJcMVx1MDBkYiIsCi0gICAgICAgICAgICAiXDFcdTAwZGMiLAotICAgICAgICAgICAgIlwxXDE0MVwxM1x1ZmZmZlwxMlwxNDFcN1x1ZmZmZlwzMlwxNDFcNFx1ZmZmZlwxXDE0MVwxXHVmZmZmXDMyXDE0MSIsCisgICAgICAgICAgICAiXDFcdTAwZDkiLAorICAgICAgICAgICAgIlwxXHUwMGRhIiwKKyAgICAgICAgICAgICJcMVx1MDBkYlwyMFx1ZmZmZlwxXHUwMGRjIiwKKyAgICAgICAgICAgICJcMVx1MDBkZCIsCiAgICAgICAgICAgICAiXDFcdTAwZGUiLAogICAgICAgICAgICAgIlwxXHUwMGRmIiwKICAgICAgICAgICAgICJcMVx1MDBlMCIsCi0gICAgICAgICAgICAiXDFcdTAwZTEiLAotICAgICAgICAgICAgIlwxXHUwMGUyIiwKKyAgICAgICAgICAgICJcMVx1MDBlMVwxXHVmZmZmXDFcdTAwZTIiLAogICAgICAgICAgICAgIlwxXHUwMGUzIiwKICAgICAgICAgICAgICJcMVx1MDBlNCIsCi0gICAgICAgICAgICAiXDFcdTAwZTUiLAotICAgICAgICAgICAgIlwxXHUwMGU2IiwKLSAgICAgICAgICAgICJcMVx1MDBlN1wyXHVmZmZmXDFcdTAwZTlcM1x1ZmZmZlwxXHUwMGU4IiwKKyAgICAgICAgICAgICJcMVwxNDNcMTNcdWZmZmZcMTJcMTQzXDdcdWZmZmZcMzJcMTQzXDRcdWZmZmZcMVwxNDNcMVx1ZmZmZlwzMlwxNDMiLAorICAgICAgICAgICAgIlwxXDE0M1wxM1x1ZmZmZlwxMlwxNDNcN1x1ZmZmZlwzMlwxNDNcNFx1ZmZmZlwxXDE0M1wxXHVmZmZmXDMyXDE0MyIsCisgICAgICAgICAgICAiXDFcdTAwZTciLAorICAgICAgICAgICAgIlwxXHUwMGU4IiwKKyAgICAgICAgICAgICJcMVx1MDBlOSIsCiAgICAgICAgICAgICAiXDFcdTAwZWEiLAotICAgICAgICAgICAgIlwxXDE0MVwxM1x1ZmZmZlwxMlwxNDFcN1x1ZmZmZlwzMlwxNDFcNFx1ZmZmZlwxXDE0MVwxXHVmZmZmXDMyXDE0MSIsCisgICAgICAgICAgICAiXDFcdTAwZWIiLAogICAgICAgICAgICAgIlwxXHUwMGVjIiwKICAgICAgICAgICAgICJcMVx1MDBlZCIsCi0gICAgICAgICAgICAiXDFcdTAwZWZcM1x1ZmZmZlwxXHUwMGVlIiwKLSAgICAgICAgICAgICIiLAotICAgICAgICAgICAgIiIsCi0gICAgICAgICAgICAiXDFcdTAwZjAiLAotICAgICAgICAgICAgIlwxXHUwMGYxXDEzXHVmZmZmXDFcdTAwZjIiLAotICAgICAgICAgICAgIlwxXHUwMGYzIiwKLSAgICAgICAgICAgICJcMVx1MDBmNVw1XHVmZmZmXDFcdTAwZjRcNlx1ZmZmZlwxXHUwMGY2IiwKLSAgICAgICAgICAgICJcMVwxNDFcMTNcdWZmZmZcMTJcMTQxXDdcdWZmZmZcMzJcMTQxXDRcdWZmZmZcMVwxNDFcMVx1ZmZmZlwzMlwxNDEiLAorICAgICAgICAgICAgIlwxXHUwMGVlIiwKKyAgICAgICAgICAgICJcMVx1MDBlZiIsCisgICAgICAgICAgICAiXDFcdTAwZjFcNlx1ZmZmZlwxXHUwMGYwXDJcdWZmZmZcMVx1MDBmM1wzXHVmZmZmXDFcdTAwZjIiLAorICAgICAgICAgICAgIlwxXHUwMGY0IiwKKyAgICAgICAgICAgICJcMVwxNDNcMTNcdWZmZmZcMTJcMTQzXDdcdWZmZmZcMzJcMTQzXDRcdWZmZmZcMVwxNDNcMVx1ZmZmZlwyMlwxNDNcMVx1MDBmNVw3XDE0MyIsCisgICAgICAgICAgICAiXDFcdTAwZjciLAogICAgICAgICAgICAgIlwxXHUwMGY4IiwKLSAgICAgICAgICAgICJcMVx1MDBmOSIsCisgICAgICAgICAgICAiXDFcMTQzXDEzXHVmZmZmXDEyXDE0M1w3XHVmZmZmXDMyXDE0M1w0XHVmZmZmXDFcMTQzXDFcdWZmZmZcMzJcMTQzIiwKICAgICAgICAgICAgICJcMVx1MDBmYSIsCiAgICAgICAgICAgICAiXDFcdTAwZmIiLAotICAgICAgICAgICAgIlwxXDE0MVwxM1x1ZmZmZlwxMlwxNDFcN1x1ZmZmZlwzMlwxNDFcNFx1ZmZmZlwxXDE0MVwxXHVmZmZmXDMyXDE0MSIsCi0gICAgICAgICAgICAiXDFcdTAwZmQiLAotICAgICAgICAgICAgIlwxXHUwMGZlXDEzXHVmZmZmXDFcdTAwZmYiLAotICAgICAgICAgICAgIlwxXHUwMTAyXDE3XHVmZmZmXDFcdTAxMDBcMVx1MDEwMSIsCi0gICAgICAgICAgICAiXDFcdTAxMDMiLAotICAgICAgICAgICAgIlwxXHUwMTA0IiwKLSAgICAgICAgICAgICJcMVx1MDEwNSIsCi0gICAgICAgICAgICAiXDFcMTQxXDEzXHVmZmZmXDEyXDE0MVw3XHVmZmZmXDMyXDE0MVw0XHVmZmZmXDFcMTQxXDFcdWZmZmZcMjJcMTQxXDFcdTAxMDZcN1wxNDEiLAorICAgICAgICAgICAgIlwxXHUwMGZkXDNcdWZmZmZcMVx1MDBmYyIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIlwxXHUwMGZlIiwKKyAgICAgICAgICAgICJcMVx1MDBmZlwxM1x1ZmZmZlwxXHUwMTAwIiwKKyAgICAgICAgICAgICJcMVx1MDEwMSIsCisgICAgICAgICAgICAiXDFcdTAxMDIiLAorICAgICAgICAgICAgIlwxXHUwMTA0XDVcdWZmZmZcMVx1MDEwM1w2XHVmZmZmXDFcdTAxMDUiLAorICAgICAgICAgICAgIlwxXDE0M1wxM1x1ZmZmZlwxMlwxNDNcN1x1ZmZmZlwzMlwxNDNcNFx1ZmZmZlwxXDE0M1wxXHVmZmZmXDMyXDE0MyIsCisgICAgICAgICAgICAiXDFcdTAxMDciLAogICAgICAgICAgICAgIlwxXHUwMTA4IiwKLSAgICAgICAgICAgICIiLAotICAgICAgICAgICAgIiIsCi0gICAgICAgICAgICAiIiwKLSAgICAgICAgICAgICIiLAotICAgICAgICAgICAgIiIsCi0gICAgICAgICAgICAiIiwKLSAgICAgICAgICAgICIiLAotICAgICAgICAgICAgIiIsCi0gICAgICAgICAgICAiIiwKLSAgICAgICAgICAgICIiLAotICAgICAgICAgICAgIiIsCi0gICAgICAgICAgICAiXDEyXHUwMGFjXDEwXHVmZmZmXDFcdTAwYWVcMVx1ZmZmZlwzXHUwMGFlXDVcdWZmZmZcMVx1MDBhZVwyMlx1ZmZmZlwxXHUwMGFjXDJcdWZmZmZcMVx1MDBhZVwxXHVmZmZmXDNcdTAwYWVcNVx1ZmZmZlwxXHUwMGFlIiwKLSAgICAgICAgICAgICIiLAotICAgICAgICAgICAgIiIsCi0gICAgICAgICAgICAiIiwKLSAgICAgICAgICAgICIiLAotICAgICAgICAgICAgIiIsCi0gICAgICAgICAgICAiIiwKLSAgICAgICAgICAgICIiLAotICAgICAgICAgICAgIiIsCi0gICAgICAgICAgICAiIiwKLSAgICAgICAgICAgICIiLAotICAgICAgICAgICAgIlwxXDE0MVwxM1x1ZmZmZlwxMlwxNDFcN1x1ZmZmZlwzMlwxNDFcNFx1ZmZmZlwxXDE0MVwxXHVmZmZmXDEwXDE0MVwxXHUwMTA5XDIxXDE0MSIsCi0gICAgICAgICAgICAiXDFcMTQxXDEzXHVmZmZmXDEyXDE0MVw3XHVmZmZmXDMyXDE0MVw0XHVmZmZmXDFcMTQxXDFcdWZmZmZcMzJcMTQxIiwKKyAgICAgICAgICAgICJcMVx1MDEwOSIsCisgICAgICAgICAgICAiXDFcdTAxMGEiLAorICAgICAgICAgICAgIlwxXDE0M1wxM1x1ZmZmZlwxMlwxNDNcN1x1ZmZmZlwzMlwxNDNcNFx1ZmZmZlwxXDE0M1wxXHVmZmZmXDMyXDE0MyIsCiAgICAgICAgICAgICAiXDFcdTAxMGMiLAotICAgICAgICAgICAgIlwxXHUwMTBkIiwKLSAgICAgICAgICAgICJcMVx1MDEwZSIsCi0gICAgICAgICAgICAiXDFcdTAxMGYiLAotICAgICAgICAgICAgIlwxXHUwMTEwIiwKLSAgICAgICAgICAgICJcMVx1MDExMSIsCisgICAgICAgICAgICAiXDFcdTAxMGRcMTNcdWZmZmZcMVx1MDEwZSIsCisgICAgICAgICAgICAiXDFcdTAxMTFcMTdcdWZmZmZcMVx1MDEwZlwxXHUwMTEwIiwKICAgICAgICAgICAgICJcMVx1MDExMiIsCiAgICAgICAgICAgICAiXDFcdTAxMTMiLAotICAgICAgICAgICAgIlwxXHUwMTE0IiwKLSAgICAgICAgICAgICJcMVx1MDExNSIsCisgICAgICAgICAgICAiXDFcdTAxMTRcM1x1ZmZmZlwxXHUwMTE1IiwKICAgICAgICAgICAgICJcMVx1MDExNiIsCi0gICAgICAgICAgICAiXDFcdTAxMTciLAotICAgICAgICAgICAgIlwxXHUwMTE4IiwKLSAgICAgICAgICAgICJcMVx1MDExOSIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIlwxMlx1MDBiM1wxMFx1ZmZmZlwxXHUwMGI1XDFcdWZmZmZcM1x1MDBiNVw1XHVmZmZmXDFcdTAwYjVcMjJcdWZmZmZcMVx1MDBiM1wyXHVmZmZmXDFcdTAwYjVcMVx1ZmZmZlwzXHUwMGI1XDVcdWZmZmZcMVx1MDBiNSIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICJcMVwxNDNcMTNcdWZmZmZcMTJcMTQzXDdcdWZmZmZcMzJcMTQzXDRcdWZmZmZcMVwxNDNcMVx1ZmZmZlwxMFwxNDNcMVx1MDExN1wyMVwxNDMiLAorICAgICAgICAgICAgIlwxXDE0M1wxM1x1ZmZmZlwxMlwxNDNcN1x1ZmZmZlwzMlwxNDNcNFx1ZmZmZlwxXDE0M1wxXHVmZmZmXDMyXDE0MyIsCiAgICAgICAgICAgICAiXDFcdTAxMWEiLAogICAgICAgICAgICAgIlwxXHUwMTFiIiwKLSAgICAgICAgICAgICIiLAotICAgICAgICAgICAgIlwxXHUwMTFjIiwKLSAgICAgICAgICAgICJcMVx1MDExZCIsCisgICAgICAgICAgICAiXDFcdTAxMWRcMlx1ZmZmZlwxXHUwMTFjIiwKICAgICAgICAgICAgICJcMVx1MDExZSIsCi0gICAgICAgICAgICAiXDFcMTQxXDEzXHVmZmZmXDEyXDE0MVw3XHVmZmZmXDMyXDE0MVw0XHVmZmZmXDFcMTQxXDFcdWZmZmZcMTRcMTQxXDFcdTAxMWZcMTVcMTQxIiwKKyAgICAgICAgICAgICJcMVx1MDExZiIsCisgICAgICAgICAgICAiXDFcdTAxMjAiLAogICAgICAgICAgICAgIlwxXHUwMTIxIiwKICAgICAgICAgICAgICJcMVx1MDEyMiIsCi0gICAgICAgICAgICAiXDFcMTQxXDEzXHVmZmZmXDEyXDE0MVw3XHVmZmZmXDMyXDE0MVw0XHVmZmZmXDFcMTQxXDFcdWZmZmZcMzJcMTQxIiwKLSAgICAgICAgICAgICJcMVwxNDFcMTNcdWZmZmZcMTJcMTQxXDdcdWZmZmZcMzJcMTQxXDRcdWZmZmZcMVwxNDFcMVx1ZmZmZlwzMlwxNDEiLAorICAgICAgICAgICAgIlwxXHUwMTIzIiwKKyAgICAgICAgICAgICJcMVx1MDEyNCIsCiAgICAgICAgICAgICAiXDFcdTAxMjUiLAogICAgICAgICAgICAgIlwxXHUwMTI2IiwKICAgICAgICAgICAgICJcMVx1MDEyNyIsCi0gICAgICAgICAgICAiXDFcdTAxMjgiLAotICAgICAgICAgICAgIlwxXDE0MVwxM1x1ZmZmZlwxMlwxNDFcN1x1ZmZmZlwzMlwxNDFcNFx1ZmZmZlwxXDE0MVwxXHVmZmZmXDMyXDE0MSIsCisgICAgICAgICAgICAiXDFcdTAxMjlcNVx1ZmZmZlwxXHUwMTI4IiwKICAgICAgICAgICAgICJcMVx1MDEyYSIsCiAgICAgICAgICAgICAiXDFcdTAxMmIiLAotICAgICAgICAgICAgIlwxXDE0MVwxM1x1ZmZmZlwxMlwxNDFcN1x1ZmZmZlwxXDE0MVwxXHUwMTJlXDIxXDE0MVwxXHUwMTJkXDZcMTQxXDRcdWZmZmZcMVwxNDFcMVx1ZmZmZlwxN1wxNDFcMVx1MDEyY1wxMlwxNDEiLAotICAgICAgICAgICAgIlwxXHUwMTMwIiwKLSAgICAgICAgICAgICJcMVx1MDEzMSIsCi0gICAgICAgICAgICAiXDFcdTAxMzIiLAorICAgICAgICAgICAgIlwxXHUwMTJjIiwKICAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIlwxXHUwMTJkIiwKKyAgICAgICAgICAgICJcMVx1MDEyZSIsCisgICAgICAgICAgICAiXDFcdTAxMmYiLAorICAgICAgICAgICAgIlwxXDE0M1wxM1x1ZmZmZlwxMlwxNDNcN1x1ZmZmZlwzMlwxNDNcNFx1ZmZmZlwxXDE0M1wxXHVmZmZmXDE0XDE0M1wxXHUwMTMwXDE1XDE0MyIsCisgICAgICAgICAgICAiXDFcdTAxMzIiLAogICAgICAgICAgICAgIlwxXHUwMTMzIiwKLSAgICAgICAgICAgICJcMVx1MDEzNCIsCi0gICAgICAgICAgICAiXDFcdTAxMzUiLAorICAgICAgICAgICAgIlwxXDE0M1wxM1x1ZmZmZlwxMlwxNDNcN1x1ZmZmZlwzMlwxNDNcNFx1ZmZmZlwxXDE0M1wxXHVmZmZmXDMyXDE0MyIsCisgICAgICAgICAgICAiXDFcMTQzXDEzXHVmZmZmXDEyXDE0M1w3XHVmZmZmXDMyXDE0M1w0XHVmZmZmXDFcMTQzXDFcdWZmZmZcMzJcMTQzIiwKICAgICAgICAgICAgICJcMVx1MDEzNiIsCiAgICAgICAgICAgICAiXDFcdTAxMzciLAogICAgICAgICAgICAgIlwxXHUwMTM4IiwKICAgICAgICAgICAgICJcMVx1MDEzOSIsCi0gICAgICAgICAgICAiXDFcdTAxM2EiLAotICAgICAgICAgICAgIlwxXDE0MVwxM1x1ZmZmZlwxMlwxNDFcN1x1ZmZmZlwzMlwxNDFcNFx1ZmZmZlwxXDE0MVwxXHVmZmZmXDMyXDE0MSIsCisgICAgICAgICAgICAiXDFcMTQzXDEzXHVmZmZmXDEyXDE0M1w3XHVmZmZmXDMyXDE0M1w0XHVmZmZmXDFcMTQzXDFcdWZmZmZcMzJcMTQzIiwKKyAgICAgICAgICAgICJcMVx1MDEzYiIsCiAgICAgICAgICAgICAiXDFcdTAxM2MiLAotICAgICAgICAgICAgIlwxXHUwMTNkIiwKLSAgICAgICAgICAgICJcMVx1MDEzZSIsCi0gICAgICAgICAgICAiXDFcdTAxM2YiLAotICAgICAgICAgICAgIiIsCi0gICAgICAgICAgICAiXDFcdTAxNDAiLAorICAgICAgICAgICAgIlwxXDE0M1wxM1x1ZmZmZlwxMlwxNDNcN1x1ZmZmZlwxXDE0M1wxXHUwMTNmXDIxXDE0M1wxXHUwMTNlXDZcMTQzXDRcdWZmZmZcMVwxNDNcMVx1ZmZmZlwxN1wxNDNcMVx1MDEzZFwxMlwxNDMiLAogICAgICAgICAgICAgIlwxXHUwMTQxIiwKLSAgICAgICAgICAgICJcMVwxNDFcMTNcdWZmZmZcMTJcMTQxXDdcdWZmZmZcMzJcMTQxXDRcdWZmZmZcMVwxNDFcMVx1ZmZmZlwzMlwxNDEiLAorICAgICAgICAgICAgIlwxXHUwMTQyIiwKICAgICAgICAgICAgICJcMVx1MDE0MyIsCi0gICAgICAgICAgICAiXDFcMTQxXDEzXHVmZmZmXDEyXDE0MVw3XHVmZmZmXDMyXDE0MVw0XHVmZmZmXDFcMTQxXDFcdWZmZmZcMzJcMTQxIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiXDFcdTAxNDQiLAogICAgICAgICAgICAgIlwxXHUwMTQ1IiwKICAgICAgICAgICAgICJcMVx1MDE0NiIsCi0gICAgICAgICAgICAiXDFcMTQxXDEzXHVmZmZmXDEyXDE0MVw3XHVmZmZmXDMyXDE0MVw0XHVmZmZmXDFcMTQxXDFcdWZmZmZcMzJcMTQxIiwKKyAgICAgICAgICAgICJcMVx1MDE0NyIsCiAgICAgICAgICAgICAiXDFcdTAxNDgiLAogICAgICAgICAgICAgIlwxXHUwMTQ5IiwKICAgICAgICAgICAgICJcMVx1MDE0YSIsCi0gICAgICAgICAgICAiIiwKICAgICAgICAgICAgICJcMVx1MDE0YiIsCi0gICAgICAgICAgICAiXDFcdTAxNGMiLAotICAgICAgICAgICAgIlwxXDE0MVwxM1x1ZmZmZlwxMlwxNDFcN1x1ZmZmZlwzMlwxNDFcNFx1ZmZmZlwxXDE0MVwxXHVmZmZmXDMyXDE0MSIsCi0gICAgICAgICAgICAiXDFcdTAxNGUiLAotICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiXDFcMTQzXDEzXHVmZmZmXDEyXDE0M1w3XHVmZmZmXDMyXDE0M1w0XHVmZmZmXDFcMTQzXDFcdWZmZmZcMzJcMTQzIiwKKyAgICAgICAgICAgICJcMVx1MDE0ZCIsCisgICAgICAgICAgICAiXDFcMTQzXDEzXHVmZmZmXDEyXDE0M1w3XHVmZmZmXDMyXDE0M1w0XHVmZmZmXDFcMTQzXDFcdWZmZmZcMzJcMTQzIiwKICAgICAgICAgICAgICJcMVx1MDE0ZiIsCiAgICAgICAgICAgICAiXDFcdTAxNTAiLAotICAgICAgICAgICAgIlwxXHUwMTUxIiwKKyAgICAgICAgICAgICJcMVwxNDNcMTNcdWZmZmZcMTJcMTQzXDdcdWZmZmZcMzJcMTQzXDRcdWZmZmZcMVwxNDNcMVx1ZmZmZlwzMlwxNDMiLAogICAgICAgICAgICAgIlwxXHUwMTUyIiwKKyAgICAgICAgICAgICIiLAogICAgICAgICAgICAgIlwxXHUwMTUzIiwKICAgICAgICAgICAgICJcMVx1MDE1NCIsCi0gICAgICAgICAgICAiXDFcMTQxXDEzXHVmZmZmXDEyXDE0MVw3XHVmZmZmXDMyXDE0MVw0XHVmZmZmXDFcMTQxXDFcdWZmZmZcMjJcMTQxXDFcdTAxNTVcN1wxNDEiLAotICAgICAgICAgICAgIlwxXHUwMTU3IiwKLSAgICAgICAgICAgICJcMVx1MDE1OCIsCi0gICAgICAgICAgICAiXDFcdTAxNTkiLAogICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiXDFcdTAxNTUiLAorICAgICAgICAgICAgIlwxXHUwMTU2IiwKKyAgICAgICAgICAgICJcMVwxNDNcMTNcdWZmZmZcMTJcMTQzXDdcdWZmZmZcMzJcMTQzXDRcdWZmZmZcMVwxNDNcMVx1ZmZmZlwzMlwxNDMiLAorICAgICAgICAgICAgIlwxXHUwMTU4IiwKKyAgICAgICAgICAgICJcMVwxNDNcMTNcdWZmZmZcMTJcMTQzXDdcdWZmZmZcMzJcMTQzXDRcdWZmZmZcMVwxNDNcMVx1ZmZmZlwzMlwxNDMiLAogICAgICAgICAgICAgIlwxXHUwMTVhIiwKICAgICAgICAgICAgICJcMVx1MDE1YiIsCi0gICAgICAgICAgICAiIiwKLSAgICAgICAgICAgICIiLAogICAgICAgICAgICAgIlwxXHUwMTVjIiwKLSAgICAgICAgICAgICJcMVx1MDE1ZCIsCi0gICAgICAgICAgICAiXDFcdTAxNWUiLAotICAgICAgICAgICAgIlwxXHUwMTVmIiwKLSAgICAgICAgICAgICJcMVwxNDFcMTNcdWZmZmZcMTJcMTQxXDdcdWZmZmZcMzJcMTQxXDRcdWZmZmZcMVwxNDFcMVx1ZmZmZlwzMlwxNDEiLAorICAgICAgICAgICAgIlwxXDE0M1wxM1x1ZmZmZlwxMlwxNDNcN1x1ZmZmZlwzMlwxNDNcNFx1ZmZmZlwxXDE0M1wxXHVmZmZmXDMyXDE0MyIsCisgICAgICAgICAgICAiXDFcdTAxNWZcM1x1ZmZmZlwxXHUwMTVlIiwKKyAgICAgICAgICAgICJcMVx1MDE2MCIsCiAgICAgICAgICAgICAiXDFcdTAxNjEiLAorICAgICAgICAgICAgIiIsCiAgICAgICAgICAgICAiXDFcdTAxNjIiLAogICAgICAgICAgICAgIlwxXHUwMTYzIiwKLSAgICAgICAgICAgICJcMVx1MDE2NCIsCisgICAgICAgICAgICAiXDFcMTQzXDEzXHVmZmZmXDEyXDE0M1w3XHVmZmZmXDMyXDE0M1w0XHVmZmZmXDFcMTQzXDFcdWZmZmZcMzJcMTQzIiwKICAgICAgICAgICAgICJcMVx1MDE2NSIsCisgICAgICAgICAgICAiIiwKICAgICAgICAgICAgICJcMVx1MDE2NiIsCiAgICAgICAgICAgICAiXDFcdTAxNjciLAogICAgICAgICAgICAgIlwxXHUwMTY4IiwKICAgICAgICAgICAgICJcMVx1MDE2OSIsCiAgICAgICAgICAgICAiXDFcdTAxNmEiLAogICAgICAgICAgICAgIlwxXHUwMTZiIiwKLSAgICAgICAgICAgICJcMVx1MDE2YyIsCi0gICAgICAgICAgICAiXDFcMTQxXDEzXHVmZmZmXDEyXDE0MVw3XHVmZmZmXDMyXDE0MVw0XHVmZmZmXDFcMTQxXDFcdWZmZmZcMzJcMTQxIiwKKyAgICAgICAgICAgICJcMVwxNDNcMTNcdWZmZmZcMTJcMTQzXDdcdWZmZmZcMzJcMTQzXDRcdWZmZmZcMVwxNDNcMVx1ZmZmZlwyMlwxNDNcMVx1MDE2Y1w3XDE0MyIsCiAgICAgICAgICAgICAiXDFcdTAxNmUiLAogICAgICAgICAgICAgIlwxXHUwMTZmIiwKLSAgICAgICAgICAgICIiLAotICAgICAgICAgICAgIlwxXDE0MVwxM1x1ZmZmZlwxMlwxNDFcN1x1ZmZmZlwzMlwxNDFcNFx1ZmZmZlwxXDE0MVwxXHVmZmZmXDMyXDE0MSIsCisgICAgICAgICAgICAiXDFcdTAxNzAiLAogICAgICAgICAgICAgIlwxXHUwMTcxIiwKLSAgICAgICAgICAgICIiLAotICAgICAgICAgICAgIiIsCiAgICAgICAgICAgICAiXDFcdTAxNzIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiIiwKICAgICAgICAgICAgICJcMVx1MDE3MyIsCi0gICAgICAgICAgICAiXDFcMTQxXDEzXHVmZmZmXDEyXDE0MVw3XHVmZmZmXDMyXDE0MVw0XHVmZmZmXDFcMTQxXDFcdWZmZmZcMzJcMTQxIiwKKyAgICAgICAgICAgICJcMVx1MDE3NCIsCiAgICAgICAgICAgICAiXDFcdTAxNzUiLAotICAgICAgICAgICAgIiIsCi0gICAgICAgICAgICAiXDFcMTQxXDEzXHVmZmZmXDEyXDE0MVw3XHVmZmZmXDMyXDE0MVw0XHVmZmZmXDFcMTQxXDFcdWZmZmZcMzJcMTQxIiwKLSAgICAgICAgICAgICJcMVx1MDE3NyIsCisgICAgICAgICAgICAiXDFcdTAxNzdcMVx1MDE3NiIsCiAgICAgICAgICAgICAiXDFcdTAxNzgiLAotICAgICAgICAgICAgIlwxXHUwMTc5IiwKLSAgICAgICAgICAgICJcMVx1MDE3YVwxNFx1ZmZmZlwxXHUwMTdiIiwKLSAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIlwxXDE0M1wxM1x1ZmZmZlwxMlwxNDNcN1x1ZmZmZlwzMlwxNDNcNFx1ZmZmZlwxXDE0M1wxXHVmZmZmXDMyXDE0MyIsCisgICAgICAgICAgICAiXDFcdTAxN2EiLAorICAgICAgICAgICAgIlwxXHUwMTdiIiwKICAgICAgICAgICAgICJcMVx1MDE3YyIsCiAgICAgICAgICAgICAiXDFcdTAxN2QiLAogICAgICAgICAgICAgIlwxXHUwMTdlIiwKQEAgLTUzNzEsMzg2ICs1NzA1LDQ4MCBAQAogICAgICAgICAgICAgIlwxXHUwMTgwIiwKICAgICAgICAgICAgICJcMVx1MDE4MSIsCiAgICAgICAgICAgICAiXDFcdTAxODIiLAotICAgICAgICAgICAgIlwxXDE0MVwxM1x1ZmZmZlwxMlwxNDFcN1x1ZmZmZlwzMlwxNDFcNFx1ZmZmZlwxXDE0MVwxXHVmZmZmXDMyXDE0MSIsCisgICAgICAgICAgICAiXDFcdTAxODMiLAogICAgICAgICAgICAgIlwxXHUwMTg0IiwKICAgICAgICAgICAgICJcMVx1MDE4NSIsCiAgICAgICAgICAgICAiXDFcdTAxODYiLAotICAgICAgICAgICAgIiIsCiAgICAgICAgICAgICAiXDFcdTAxODciLAotICAgICAgICAgICAgIlwxXHUwMTg4IiwKKyAgICAgICAgICAgICJcMVwxNDNcMTNcdWZmZmZcMTJcMTQzXDdcdWZmZmZcMzJcMTQzXDRcdWZmZmZcMVwxNDNcMVx1ZmZmZlwzMlwxNDMiLAogICAgICAgICAgICAgIlwxXHUwMTg5IiwKICAgICAgICAgICAgICJcMVx1MDE4YSIsCi0gICAgICAgICAgICAiXDFcdTAxOGIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiXDFcMTQzXDEzXHVmZmZmXDEyXDE0M1w3XHVmZmZmXDMyXDE0M1w0XHVmZmZmXDFcMTQzXDFcdWZmZmZcMzJcMTQzIiwKICAgICAgICAgICAgICJcMVx1MDE4YyIsCiAgICAgICAgICAgICAiIiwKLSAgICAgICAgICAgICJcMVwxNDFcMTNcdWZmZmZcMTJcMTQxXDdcdWZmZmZcMzJcMTQxXDRcdWZmZmZcMVwxNDFcMVx1ZmZmZlwzMlwxNDEiLAogICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiXDFcdTAxOGQiLAogICAgICAgICAgICAgIlwxXHUwMThlIiwKLSAgICAgICAgICAgICJcMVx1MDE4ZiIsCi0gICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICJcMVwxNDNcMTNcdWZmZmZcMTJcMTQzXDdcdWZmZmZcMzJcMTQzXDRcdWZmZmZcMVwxNDNcMVx1ZmZmZlwzMlwxNDMiLAogICAgICAgICAgICAgIlwxXHUwMTkwIiwKLSAgICAgICAgICAgICJcMVx1MDE5MSIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICJcMVwxNDNcMTNcdWZmZmZcMTJcMTQzXDdcdWZmZmZcMzJcMTQzXDRcdWZmZmZcMVwxNDNcMVx1ZmZmZlwzMlwxNDMiLAogICAgICAgICAgICAgIlwxXHUwMTkyIiwKICAgICAgICAgICAgICJcMVx1MDE5MyIsCiAgICAgICAgICAgICAiXDFcdTAxOTQiLAorICAgICAgICAgICAgIlwxXHUwMTk1XDE0XHVmZmZmXDFcdTAxOTYiLAogICAgICAgICAgICAgIiIsCi0gICAgICAgICAgICAiXDFcMTQxXDEzXHVmZmZmXDEyXDE0MVw3XHVmZmZmXDMyXDE0MVw0XHVmZmZmXDFcMTQxXDFcdWZmZmZcMzJcMTQxIiwKLSAgICAgICAgICAgICJcMVx1MDE5NiIsCiAgICAgICAgICAgICAiXDFcdTAxOTciLAotICAgICAgICAgICAgIlwxXDE0MVwxM1x1ZmZmZlwxMlwxNDFcN1x1ZmZmZlwzMlwxNDFcNFx1ZmZmZlwxXDE0MVwxXHVmZmZmXDMyXDE0MSIsCi0gICAgICAgICAgICAiXDFcMTQxXDEzXHVmZmZmXDEyXDE0MVw3XHVmZmZmXDMyXDE0MVw0XHVmZmZmXDFcMTQxXDFcdWZmZmZcMzJcMTQxIiwKKyAgICAgICAgICAgICJcMVx1MDE5OCIsCisgICAgICAgICAgICAiXDFcdTAxOTkiLAogICAgICAgICAgICAgIlwxXHUwMTlhIiwKICAgICAgICAgICAgICJcMVx1MDE5YiIsCi0gICAgICAgICAgICAiXDFcMTQxXDEzXHVmZmZmXDEyXDE0MVw3XHVmZmZmXDMyXDE0MVw0XHVmZmZmXDFcMTQxXDFcdWZmZmZcMzJcMTQxIiwKLSAgICAgICAgICAgICIiLAotICAgICAgICAgICAgIlwxXDE0MVwxM1x1ZmZmZlwxMlwxNDFcN1x1ZmZmZlwzMlwxNDFcNFx1ZmZmZlwxXDE0MVwxXHVmZmZmXDMyXDE0MSIsCi0gICAgICAgICAgICAiXDFcdTAxOWUiLAorICAgICAgICAgICAgIlwxXHUwMTljIiwKKyAgICAgICAgICAgICJcMVx1MDE5ZCIsCisgICAgICAgICAgICAiXDFcMTQzXDEzXHVmZmZmXDEyXDE0M1w3XHVmZmZmXDMyXDE0M1w0XHVmZmZmXDFcMTQzXDFcdWZmZmZcMzJcMTQzIiwKICAgICAgICAgICAgICJcMVx1MDE5ZiIsCiAgICAgICAgICAgICAiXDFcdTAxYTAiLAogICAgICAgICAgICAgIlwxXHUwMWExIiwKKyAgICAgICAgICAgICIiLAogICAgICAgICAgICAgIlwxXHUwMWEyIiwKLSAgICAgICAgICAgICJcMVx1MDFhM1wxNlx1ZmZmZlwxXHUwMWE0IiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIlwxXHUwMWEzIiwKKyAgICAgICAgICAgICJcMVx1MDFhNCIsCisgICAgICAgICAgICAiIiwKICAgICAgICAgICAgICJcMVx1MDFhNSIsCiAgICAgICAgICAgICAiXDFcdTAxYTYiLAotICAgICAgICAgICAgIiIsCiAgICAgICAgICAgICAiXDFcdTAxYTciLAogICAgICAgICAgICAgIlwxXHUwMWE4IiwKICAgICAgICAgICAgICJcMVx1MDFhOSIsCi0gICAgICAgICAgICAiXDFcMTQxXDEzXHVmZmZmXDEyXDE0MVw3XHVmZmZmXDMyXDE0MVw0XHVmZmZmXDFcMTQxXDFcdWZmZmZcMzJcMTQxIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIlwxXDE0M1wxM1x1ZmZmZlwxMlwxNDNcN1x1ZmZmZlwzMlwxNDNcNFx1ZmZmZlwxXDE0M1wxXHVmZmZmXDMyXDE0MyIsCisgICAgICAgICAgICAiIiwKICAgICAgICAgICAgICJcMVx1MDFhYiIsCiAgICAgICAgICAgICAiXDFcdTAxYWMiLAogICAgICAgICAgICAgIlwxXHUwMWFkIiwKKyAgICAgICAgICAgICIiLAogICAgICAgICAgICAgIlwxXHUwMWFlIiwKICAgICAgICAgICAgICJcMVx1MDFhZiIsCiAgICAgICAgICAgICAiXDFcdTAxYjAiLAogICAgICAgICAgICAgIlwxXHUwMWIxIiwKLSAgICAgICAgICAgICJcMVwxNDFcMTNcdWZmZmZcMTJcMTQxXDdcdWZmZmZcMzJcMTQxXDRcdWZmZmZcMVwxNDFcMVx1ZmZmZlwzMlwxNDEiLAotICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiXDFcdTAxYjIiLAogICAgICAgICAgICAgIlwxXHUwMWIzIiwKLSAgICAgICAgICAgICJcMVx1MDFiNCIsCiAgICAgICAgICAgICAiIiwKLSAgICAgICAgICAgICJcMVwxNDFcMTNcdWZmZmZcMTJcMTQxXDdcdWZmZmZcMzJcMTQxXDRcdWZmZmZcMVwxNDFcMVx1ZmZmZlwzMlwxNDEiLAorICAgICAgICAgICAgIlwxXDE0M1wxM1x1ZmZmZlwxMlwxNDNcN1x1ZmZmZlwzMlwxNDNcNFx1ZmZmZlwxXDE0M1wxXHVmZmZmXDMyXDE0MyIsCisgICAgICAgICAgICAiXDFcdTAxYjUiLAogICAgICAgICAgICAgIlwxXHUwMWI2IiwKLSAgICAgICAgICAgICJcMVx1MDFiNyIsCi0gICAgICAgICAgICAiIiwKLSAgICAgICAgICAgICJcMVx1MDFiOCIsCi0gICAgICAgICAgICAiIiwKLSAgICAgICAgICAgICJcMVwxNDFcMTNcdWZmZmZcMTJcMTQxXDdcdWZmZmZcMzJcMTQxXDRcdWZmZmZcMVwxNDFcMVx1ZmZmZlwzMlwxNDEiLAorICAgICAgICAgICAgIlwxXDE0M1wxM1x1ZmZmZlwxMlwxNDNcN1x1ZmZmZlwzMlwxNDNcNFx1ZmZmZlwxXDE0M1wxXHVmZmZmXDMyXDE0MyIsCisgICAgICAgICAgICAiXDFcMTQzXDEzXHVmZmZmXDEyXDE0M1w3XHVmZmZmXDMyXDE0M1w0XHVmZmZmXDFcMTQzXDFcdWZmZmZcMzJcMTQzIiwKKyAgICAgICAgICAgICJcMVx1MDFiOSIsCiAgICAgICAgICAgICAiXDFcdTAxYmEiLAotICAgICAgICAgICAgIlwxXDE0MVwxM1x1ZmZmZlwxMlwxNDFcN1x1ZmZmZlwzMlwxNDFcNFx1ZmZmZlwxXDE0MVwxXHVmZmZmXDMyXDE0MSIsCi0gICAgICAgICAgICAiXDFcdTAxYmMiLAorICAgICAgICAgICAgIlwxXDE0M1wxM1x1ZmZmZlwxMlwxNDNcN1x1ZmZmZlwzMlwxNDNcNFx1ZmZmZlwxXDE0M1wxXHVmZmZmXDMyXDE0MyIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICJcMVwxNDNcMTNcdWZmZmZcMTJcMTQzXDdcdWZmZmZcMzJcMTQzXDRcdWZmZmZcMVwxNDNcMVx1ZmZmZlwzMlwxNDMiLAogICAgICAgICAgICAgIlwxXHUwMWJkIiwKLSAgICAgICAgICAgICJcMVx1MDFiZlwxNVx1ZmZmZlwxXHUwMWJlIiwKKyAgICAgICAgICAgICJcMVx1MDFiZSIsCisgICAgICAgICAgICAiXDFcMTQzXDEzXHVmZmZmXDEyXDE0M1w3XHVmZmZmXDMyXDE0M1w0XHVmZmZmXDFcMTQzXDFcdWZmZmZcMzJcMTQzIiwKICAgICAgICAgICAgICJcMVx1MDFjMCIsCiAgICAgICAgICAgICAiXDFcdTAxYzEiLAotICAgICAgICAgICAgIlwxXHUwMWMyIiwKLSAgICAgICAgICAgICJcMVx1MDFjMyIsCisgICAgICAgICAgICAiXDFcdTAxYzJcMTZcdWZmZmZcMVx1MDFjMyIsCiAgICAgICAgICAgICAiXDFcdTAxYzQiLAogICAgICAgICAgICAgIlwxXHUwMWM1IiwKLSAgICAgICAgICAgICIiLAogICAgICAgICAgICAgIlwxXHUwMWM2IiwKICAgICAgICAgICAgICJcMVx1MDFjNyIsCisgICAgICAgICAgICAiIiwKICAgICAgICAgICAgICJcMVx1MDFjOCIsCiAgICAgICAgICAgICAiXDFcdTAxYzkiLAogICAgICAgICAgICAgIlwxXHUwMWNhIiwKLSAgICAgICAgICAgICJcMVx1MDFjYiIsCi0gICAgICAgICAgICAiXDFcMTQxXDEzXHVmZmZmXDEyXDE0MVw3XHVmZmZmXDMyXDE0MVw0XHVmZmZmXDFcMTQxXDFcdWZmZmZcMzJcMTQxIiwKKyAgICAgICAgICAgICJcMVwxNDNcMTNcdWZmZmZcMTJcMTQzXDdcdWZmZmZcMzJcMTQzXDRcdWZmZmZcMVwxNDNcMVx1ZmZmZlwzMlwxNDMiLAorICAgICAgICAgICAgIlwxXHUwMWNjIiwKICAgICAgICAgICAgICJcMVx1MDFjZCIsCi0gICAgICAgICAgICAiXDFcMTQxXDEzXHVmZmZmXDEyXDE0MVw3XHVmZmZmXDMyXDE0MVw0XHVmZmZmXDFcMTQxXDFcdWZmZmZcMzJcMTQxIiwKLSAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIlwxXHUwMWNlIiwKICAgICAgICAgICAgICJcMVx1MDFjZiIsCiAgICAgICAgICAgICAiXDFcdTAxZDAiLAogICAgICAgICAgICAgIlwxXHUwMWQxIiwKICAgICAgICAgICAgICJcMVx1MDFkMiIsCiAgICAgICAgICAgICAiXDFcdTAxZDMiLAogICAgICAgICAgICAgIlwxXHUwMWQ0IiwKLSAgICAgICAgICAgICJcMVx1MDFkNSIsCisgICAgICAgICAgICAiXDFcMTQzXDEzXHVmZmZmXDEyXDE0M1w3XHVmZmZmXDMyXDE0M1w0XHVmZmZmXDFcMTQzXDFcdWZmZmZcMzJcMTQzIiwKICAgICAgICAgICAgICIiLAogICAgICAgICAgICAgIlwxXHUwMWQ2IiwKICAgICAgICAgICAgICJcMVx1MDFkNyIsCiAgICAgICAgICAgICAiIiwKLSAgICAgICAgICAgICIiLAotICAgICAgICAgICAgIlwxXDE0MVwxM1x1ZmZmZlwxMlwxNDFcN1x1ZmZmZlwzMlwxNDFcNFx1ZmZmZlwxXDE0MVwxXHVmZmZmXDMyXDE0MSIsCisgICAgICAgICAgICAiXDFcMTQzXDEzXHVmZmZmXDEyXDE0M1w3XHVmZmZmXDMyXDE0M1w0XHVmZmZmXDFcMTQzXDFcdWZmZmZcMzJcMTQzIiwKICAgICAgICAgICAgICJcMVx1MDFkOSIsCisgICAgICAgICAgICAiXDFcdTAxZGEiLAogICAgICAgICAgICAgIiIsCi0gICAgICAgICAgICAiIiwKLSAgICAgICAgICAgICJcMVwxNDFcMTNcdWZmZmZcMTJcMTQxXDdcdWZmZmZcMzJcMTQxXDRcdWZmZmZcMVwxNDFcMVx1ZmZmZlwzMlwxNDEiLAogICAgICAgICAgICAgIlwxXHUwMWRiIiwKLSAgICAgICAgICAgICJcMVx1MDFkYyIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICJcMVwxNDNcMTNcdWZmZmZcMTJcMTQzXDdcdWZmZmZcMzJcMTQzXDRcdWZmZmZcMVwxNDNcMVx1ZmZmZlwzMlwxNDMiLAogICAgICAgICAgICAgIlwxXHUwMWRkIiwKLSAgICAgICAgICAgICJcMVx1MDFkZSIsCisgICAgICAgICAgICAiXDFcMTQzXDEzXHVmZmZmXDEyXDE0M1w3XHVmZmZmXDMyXDE0M1w0XHVmZmZmXDFcMTQzXDFcdWZmZmZcMzJcMTQzIiwKICAgICAgICAgICAgICJcMVx1MDFkZiIsCiAgICAgICAgICAgICAiXDFcdTAxZTAiLAotICAgICAgICAgICAgIlwxXHUwMWUxIiwKLSAgICAgICAgICAgICJcMVx1MDFlMiIsCisgICAgICAgICAgICAiXDFcdTAxZTJcMTVcdWZmZmZcMVx1MDFlMSIsCiAgICAgICAgICAgICAiXDFcdTAxZTMiLAotICAgICAgICAgICAgIlwxXDE0MVwxM1x1ZmZmZlwxMlwxNDFcN1x1ZmZmZlwzMlwxNDFcNFx1ZmZmZlwxXDE0MVwxXHVmZmZmXDMyXDE0MSIsCi0gICAgICAgICAgICAiXDFcMTQxXDEzXHVmZmZmXDEyXDE0MVw3XHVmZmZmXDMyXDE0MVw0XHVmZmZmXDFcMTQxXDFcdWZmZmZcMzJcMTQxIiwKLSAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIlwxXHUwMWU0IiwKKyAgICAgICAgICAgICJcMVx1MDFlNSIsCiAgICAgICAgICAgICAiXDFcdTAxZTYiLAotICAgICAgICAgICAgIlwxXDE0MVwxM1x1ZmZmZlwxMlwxNDFcN1x1ZmZmZlwzMlwxNDFcNFx1ZmZmZlwxXDE0MVwxXHVmZmZmXDMyXDE0MSIsCisgICAgICAgICAgICAiXDFcdTAxZTciLAogICAgICAgICAgICAgIlwxXHUwMWU4IiwKLSAgICAgICAgICAgICJcMVwxNDFcMTNcdWZmZmZcMTJcMTQxXDdcdWZmZmZcMzJcMTQxXDRcdWZmZmZcMVwxNDFcMVx1ZmZmZlwzMlwxNDEiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiXDFcdTAxZTkiLAogICAgICAgICAgICAgIlwxXHUwMWVhIiwKICAgICAgICAgICAgICJcMVx1MDFlYiIsCi0gICAgICAgICAgICAiXDFcMTQxXDEzXHVmZmZmXDEyXDE0MVw3XHVmZmZmXDMyXDE0MVw0XHVmZmZmXDFcMTQxXDFcdWZmZmZcMzJcMTQxIiwKLSAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIlwxXHUwMWVjIiwKICAgICAgICAgICAgICJcMVx1MDFlZCIsCi0gICAgICAgICAgICAiXDFcMTQxXDEzXHVmZmZmXDEyXDE0MVw3XHVmZmZmXDMyXDE0MVw0XHVmZmZmXDFcMTQxXDFcdWZmZmZcMzJcMTQxIiwKLSAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIlwxXHUwMWVlIiwKICAgICAgICAgICAgICJcMVx1MDFlZiIsCiAgICAgICAgICAgICAiXDFcdTAxZjAiLAotICAgICAgICAgICAgIlwxXHUwMWYxIiwKLSAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIlwxXDE0M1wxM1x1ZmZmZlwxMlwxNDNcN1x1ZmZmZlwzMlwxNDNcNFx1ZmZmZlwxXDE0M1wxXHVmZmZmXDMyXDE0MyIsCiAgICAgICAgICAgICAiXDFcdTAxZjIiLAorICAgICAgICAgICAgIlwxXDE0M1wxM1x1ZmZmZlwxMlwxNDNcN1x1ZmZmZlwzMlwxNDNcNFx1ZmZmZlwxXDE0M1wxXHVmZmZmXDMyXDE0MyIsCiAgICAgICAgICAgICAiIiwKLSAgICAgICAgICAgICJcMVx1MDFmMyIsCiAgICAgICAgICAgICAiXDFcdTAxZjQiLAotICAgICAgICAgICAgIlwxXDE0MVwxM1x1ZmZmZlwxMlwxNDFcN1x1ZmZmZlw0XDE0MVwxXHUwMWY2XDEyXDE0MVwxXHUwMWY1XDEyXDE0MVw0XHVmZmZmXDFcMTQxXDFcdWZmZmZcMzJcMTQxIiwKKyAgICAgICAgICAgICJcMVx1MDFmNSIsCisgICAgICAgICAgICAiXDFcdTAxZjYiLAorICAgICAgICAgICAgIlwxXHUwMWY3IiwKICAgICAgICAgICAgICJcMVx1MDFmOCIsCiAgICAgICAgICAgICAiXDFcdTAxZjkiLAotICAgICAgICAgICAgIiIsCiAgICAgICAgICAgICAiXDFcdTAxZmEiLAogICAgICAgICAgICAgIlwxXHUwMWZiIiwKICAgICAgICAgICAgICJcMVx1MDFmYyIsCisgICAgICAgICAgICAiIiwKICAgICAgICAgICAgICJcMVx1MDFmZCIsCiAgICAgICAgICAgICAiXDFcdTAxZmUiLAotICAgICAgICAgICAgIlwxXDE0MVwxM1x1ZmZmZlwxMlwxNDFcN1x1ZmZmZlwzMlwxNDFcNFx1ZmZmZlwxXDE0MVwxXHVmZmZmXDMyXDE0MSIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIlwxXDE0M1wxM1x1ZmZmZlwxMlwxNDNcN1x1ZmZmZlwzMlwxNDNcNFx1ZmZmZlwxXDE0M1wxXHVmZmZmXDMyXDE0MyIsCiAgICAgICAgICAgICAiXDFcdTAyMDAiLAotICAgICAgICAgICAgIlwxXDE0MVwxM1x1ZmZmZlwxMlwxNDFcN1x1ZmZmZlwzMlwxNDFcNFx1ZmZmZlwxXDE0MVwxXHVmZmZmXDMyXDE0MSIsCi0gICAgICAgICAgICAiXDFcMTQxXDEzXHVmZmZmXDEyXDE0MVw3XHVmZmZmXDMyXDE0MVw0XHVmZmZmXDFcMTQxXDFcdWZmZmZcMzJcMTQxIiwKLSAgICAgICAgICAgICJcMVwxNDFcMTNcdWZmZmZcMTJcMTQxXDdcdWZmZmZcMzJcMTQxXDRcdWZmZmZcMVwxNDFcMVx1ZmZmZlwzMlwxNDEiLAogICAgICAgICAgICAgIiIsCi0gICAgICAgICAgICAiXDFcMTQxXDEzXHVmZmZmXDEyXDE0MVw3XHVmZmZmXDMyXDE0MVw0XHVmZmZmXDFcMTQxXDFcdWZmZmZcMzJcMTQxIiwKICAgICAgICAgICAgICIiLAotICAgICAgICAgICAgIlwxXDE0MVwxM1x1ZmZmZlwxMlwxNDFcN1x1ZmZmZlwzMlwxNDFcNFx1ZmZmZlwxXDE0MVwxXHVmZmZmXDMyXDE0MSIsCi0gICAgICAgICAgICAiXDFcMTQxXDEzXHVmZmZmXDEyXDE0MVw3XHVmZmZmXDMyXDE0MVw0XHVmZmZmXDFcMTQxXDFcdWZmZmZcMzJcMTQxIiwKKyAgICAgICAgICAgICJcMVwxNDNcMTNcdWZmZmZcMTJcMTQzXDdcdWZmZmZcMzJcMTQzXDRcdWZmZmZcMVwxNDNcMVx1ZmZmZlwzMlwxNDMiLAorICAgICAgICAgICAgIlwxXDE0M1wxM1x1ZmZmZlwxMlwxNDNcN1x1ZmZmZlwzMlwxNDNcNFx1ZmZmZlwxXDE0M1wxXHVmZmZmXDMyXDE0MyIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICJcMVx1MDIwMyIsCisgICAgICAgICAgICAiXDFcdTAyMDQiLAorICAgICAgICAgICAgIlwxXHUwMjA1IiwKKyAgICAgICAgICAgICJcMVx1MDIwNiIsCiAgICAgICAgICAgICAiXDFcdTAyMDciLAotICAgICAgICAgICAgIlwxXHUwMjA4IiwKKyAgICAgICAgICAgICJcMVwxNDNcMTNcdWZmZmZcMTJcMTQzXDdcdWZmZmZcMzJcMTQzXDRcdWZmZmZcMVwxNDNcMVx1ZmZmZlwzMlwxNDMiLAogICAgICAgICAgICAgIlwxXHUwMjA5IiwKICAgICAgICAgICAgICJcMVx1MDIwYSIsCiAgICAgICAgICAgICAiXDFcdTAyMGIiLAotICAgICAgICAgICAgIlwxXHUwMjBjIiwKLSAgICAgICAgICAgICJcMVwxNDFcMTNcdWZmZmZcMTJcMTQxXDdcdWZmZmZcMzJcMTQxXDRcdWZmZmZcMVwxNDFcMVx1ZmZmZlwzMlwxNDEiLAorICAgICAgICAgICAgIlwxXDE0M1wxM1x1ZmZmZlwxMlwxNDNcN1x1ZmZmZlwzMlwxNDNcNFx1ZmZmZlwxXDE0M1wxXHVmZmZmXDMyXDE0MyIsCisgICAgICAgICAgICAiXDFcMTQzXDEzXHVmZmZmXDEyXDE0M1w3XHVmZmZmXDMyXDE0M1w0XHVmZmZmXDFcMTQzXDFcdWZmZmZcMzJcMTQzIiwKICAgICAgICAgICAgICIiLAogICAgICAgICAgICAgIlwxXHUwMjBlIiwKLSAgICAgICAgICAgICIiLAotICAgICAgICAgICAgIlwxXDE0MVwxM1x1ZmZmZlwxMlwxNDFcN1x1ZmZmZlwzMlwxNDFcNFx1ZmZmZlwxXDE0MVwxXHVmZmZmXDMyXDE0MSIsCisgICAgICAgICAgICAiXDFcMTQzXDEzXHVmZmZmXDEyXDE0M1w3XHVmZmZmXDMyXDE0M1w0XHVmZmZmXDFcMTQzXDFcdWZmZmZcMzJcMTQzIiwKICAgICAgICAgICAgICJcMVx1MDIxMCIsCi0gICAgICAgICAgICAiXDFcdTAyMTEiLAotICAgICAgICAgICAgIlwxXHUwMjEyIiwKLSAgICAgICAgICAgICJcMVwxNDFcMTNcdWZmZmZcMTJcMTQxXDdcdWZmZmZcMzJcMTQxXDRcdWZmZmZcMVwxNDFcMVx1ZmZmZlwzMlwxNDEiLAorICAgICAgICAgICAgIlwxXDE0M1wxM1x1ZmZmZlwxMlwxNDNcN1x1ZmZmZlwzMlwxNDNcNFx1ZmZmZlwxXDE0M1wxXHVmZmZmXDMyXDE0MyIsCisgICAgICAgICAgICAiXDFcMTQzXDEzXHVmZmZmXDEyXDE0M1w3XHVmZmZmXDMyXDE0M1w0XHVmZmZmXDFcMTQzXDFcdWZmZmZcMzJcMTQzIiwKKyAgICAgICAgICAgICJcMVx1MDIxMyIsCiAgICAgICAgICAgICAiXDFcdTAyMTQiLAogICAgICAgICAgICAgIlwxXHUwMjE1IiwKLSAgICAgICAgICAgICJcMVx1MDIxNiIsCisgICAgICAgICAgICAiXDFcMTQzXDEzXHVmZmZmXDEyXDE0M1w3XHVmZmZmXDMyXDE0M1w0XHVmZmZmXDFcMTQzXDFcdWZmZmZcMzJcMTQzIiwKKyAgICAgICAgICAgICIiLAogICAgICAgICAgICAgIlwxXHUwMjE3IiwKLSAgICAgICAgICAgICIiLAotICAgICAgICAgICAgIiIsCi0gICAgICAgICAgICAiXDFcdTAyMTgiLAorICAgICAgICAgICAgIlwxXDE0M1wxM1x1ZmZmZlwxMlwxNDNcN1x1ZmZmZlwzMlwxNDNcNFx1ZmZmZlwxXDE0M1wxXHVmZmZmXDMyXDE0MyIsCiAgICAgICAgICAgICAiIiwKICAgICAgICAgICAgICJcMVx1MDIxOSIsCi0gICAgICAgICAgICAiIiwKICAgICAgICAgICAgICJcMVx1MDIxYSIsCiAgICAgICAgICAgICAiXDFcdTAyMWIiLAogICAgICAgICAgICAgIiIsCi0gICAgICAgICAgICAiXDFcMTQxXDEzXHVmZmZmXDEyXDE0MVw3XHVmZmZmXDMyXDE0MVw0XHVmZmZmXDFcMTQxXDFcdWZmZmZcMzJcMTQxIiwKKyAgICAgICAgICAgICJcMVx1MDIxYyIsCiAgICAgICAgICAgICAiIiwKLSAgICAgICAgICAgICJcMVwxNDFcMTNcdWZmZmZcMTJcMTQxXDdcdWZmZmZcMzJcMTQxXDRcdWZmZmZcMVwxNDFcMVx1ZmZmZlwzMlwxNDEiLAotICAgICAgICAgICAgIlwxXDE0MVwxM1x1ZmZmZlwxMlwxNDFcN1x1ZmZmZlwzMlwxNDFcNFx1ZmZmZlwxXDE0MVwxXHVmZmZmXDMyXDE0MSIsCi0gICAgICAgICAgICAiXDFcdTAyMWYiLAotICAgICAgICAgICAgIlwxXDE0MVwxM1x1ZmZmZlwxMlwxNDFcN1x1ZmZmZlwxNFwxNDFcMVx1MDIyMFwxNVwxNDFcNFx1ZmZmZlwxXDE0MVwxXHVmZmZmXDMyXDE0MSIsCi0gICAgICAgICAgICAiXDFcMTQxXDEzXHVmZmZmXDEyXDE0MVw3XHVmZmZmXDMyXDE0MVw0XHVmZmZmXDFcMTQxXDFcdWZmZmZcMzJcMTQxIiwKKyAgICAgICAgICAgICJcMVx1MDIxZCIsCisgICAgICAgICAgICAiXDFcdTAyMWUiLAorICAgICAgICAgICAgIlwxXHUwMjIwXDEyXHVmZmZmXDFcdTAyMWYiLAorICAgICAgICAgICAgIlwxXHUwMjIxIiwKKyAgICAgICAgICAgICJcMVx1MDIyMiIsCisgICAgICAgICAgICAiIiwKICAgICAgICAgICAgICJcMVx1MDIyMyIsCiAgICAgICAgICAgICAiXDFcdTAyMjQiLAogICAgICAgICAgICAgIlwxXHUwMjI1IiwKLSAgICAgICAgICAgICIiLAogICAgICAgICAgICAgIlwxXHUwMjI2IiwKICAgICAgICAgICAgICJcMVx1MDIyNyIsCi0gICAgICAgICAgICAiXDFcMTQxXDEzXHVmZmZmXDEyXDE0MVw3XHVmZmZmXDMyXDE0MVw0XHVmZmZmXDFcMTQxXDFcdWZmZmZcMzJcMTQxIiwKKyAgICAgICAgICAgICJcMVwxNDNcMTNcdWZmZmZcMTJcMTQzXDdcdWZmZmZcMzJcMTQzXDRcdWZmZmZcMVwxNDNcMVx1ZmZmZlwzMlwxNDMiLAogICAgICAgICAgICAgIlwxXHUwMjI5IiwKLSAgICAgICAgICAgICJcMVx1MDIyYSIsCi0gICAgICAgICAgICAiXDFcdTAyMmIiLAotICAgICAgICAgICAgIlwxXHUwMjJjIiwKLSAgICAgICAgICAgICIiLAotICAgICAgICAgICAgIlwxXHUwMjJkIiwKLSAgICAgICAgICAgICIiLAotICAgICAgICAgICAgIiIsCi0gICAgICAgICAgICAiIiwKLSAgICAgICAgICAgICIiLAotICAgICAgICAgICAgIiIsCi0gICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICJcMVwxNDNcMTNcdWZmZmZcMTJcMTQzXDdcdWZmZmZcMzJcMTQzXDRcdWZmZmZcMVwxNDNcMVx1ZmZmZlwzMlwxNDMiLAorICAgICAgICAgICAgIlwxXDE0M1wxM1x1ZmZmZlwxMlwxNDNcN1x1ZmZmZlwzMlwxNDNcNFx1ZmZmZlwxXDE0M1wxXHVmZmZmXDMyXDE0MyIsCisgICAgICAgICAgICAiXDFcMTQzXDEzXHVmZmZmXDEyXDE0M1w3XHVmZmZmXDMyXDE0M1w0XHVmZmZmXDFcMTQzXDFcdWZmZmZcMzJcMTQzIiwKKyAgICAgICAgICAgICJcMVwxNDNcMTNcdWZmZmZcMTJcMTQzXDdcdWZmZmZcMzJcMTQzXDRcdWZmZmZcMVwxNDNcMVx1ZmZmZlwzMlwxNDMiLAogICAgICAgICAgICAgIlwxXHUwMjJlIiwKLSAgICAgICAgICAgICJcMVwxNDFcMTNcdWZmZmZcMTJcMTQxXDdcdWZmZmZcMzJcMTQxXDRcdWZmZmZcMVwxNDFcMVx1ZmZmZlwzMlwxNDEiLAotICAgICAgICAgICAgIlwxXHUwMjMwIiwKLSAgICAgICAgICAgICJcMVx1MDIzMSIsCi0gICAgICAgICAgICAiXDFcdTAyMzIiLAotICAgICAgICAgICAgIlwxXHUwMjMzIiwKICAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIlwxXDE0M1wxM1x1ZmZmZlwxMlwxNDNcN1x1ZmZmZlwzMlwxNDNcNFx1ZmZmZlwxXDE0M1wxXHVmZmZmXDMyXDE0MyIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICJcMVwxNDNcMTNcdWZmZmZcMTJcMTQzXDdcdWZmZmZcMzJcMTQzXDRcdWZmZmZcMVwxNDNcMVx1ZmZmZlwzMlwxNDMiLAorICAgICAgICAgICAgIlwxXDE0M1wxM1x1ZmZmZlwxMlwxNDNcN1x1ZmZmZlwzMlwxNDNcNFx1ZmZmZlwxXDE0M1wxXHVmZmZmXDMyXDE0MyIsCisgICAgICAgICAgICAiXDFcdTAyMzNcM1x1ZmZmZlwxXHUwMjMyIiwKICAgICAgICAgICAgICJcMVx1MDIzNCIsCi0gICAgICAgICAgICAiIiwKLSAgICAgICAgICAgICJcMVx1MDIzNVwzM1x1ZmZmZlwxXHUwMjM2IiwKLSAgICAgICAgICAgICJcMVwxNDFcMTNcdWZmZmZcMTJcMTQxXDdcdWZmZmZcMzJcMTQxXDRcdWZmZmZcMVwxNDFcMVx1ZmZmZlwzMlwxNDEiLAorICAgICAgICAgICAgIlwxXHUwMjM1IiwKKyAgICAgICAgICAgICJcMVx1MDIzNiIsCisgICAgICAgICAgICAiXDFcdTAyMzciLAogICAgICAgICAgICAgIlwxXHUwMjM4IiwKLSAgICAgICAgICAgICIiLAogICAgICAgICAgICAgIlwxXHUwMjM5IiwKICAgICAgICAgICAgICJcMVx1MDIzYSIsCi0gICAgICAgICAgICAiXDFcdTAyM2IiLAotICAgICAgICAgICAgIlwxXDE0MVwxM1x1ZmZmZlwxMlwxNDFcN1x1ZmZmZlwzMlwxNDFcNFx1ZmZmZlwxXDE0MVwxXHVmZmZmXDMyXDE0MSIsCisgICAgICAgICAgICAiXDFcMTQzXDEzXHVmZmZmXDEyXDE0M1w3XHVmZmZmXDMyXDE0M1w0XHVmZmZmXDFcMTQzXDFcdWZmZmZcMzJcMTQzIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIlwxXHUwMjNjIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIsCiAgICAgICAgICAgICAiXDFcdTAyM2QiLAogICAgICAgICAgICAgIlwxXHUwMjNlIiwKLSAgICAgICAgICAgICJcMVx1MDIzZiIsCisgICAgICAgICAgICAiXDFcMTQzXDEzXHVmZmZmXDEyXDE0M1w3XHVmZmZmXDMyXDE0M1w0XHVmZmZmXDFcMTQzXDFcdWZmZmZcMzJcMTQzIiwKICAgICAgICAgICAgICJcMVx1MDI0MCIsCisgICAgICAgICAgICAiXDFcdTAyNDEiLAogICAgICAgICAgICAgIiIsCi0gICAgICAgICAgICAiIiwKLSAgICAgICAgICAgICIiLAotICAgICAgICAgICAgIlwxXDE0MVwxM1x1ZmZmZlwxMlwxNDFcN1x1ZmZmZlwzMlwxNDFcNFx1ZmZmZlwxXDE0MVwxXHVmZmZmXDMyXDE0MSIsCiAgICAgICAgICAgICAiXDFcdTAyNDIiLAotICAgICAgICAgICAgIiIsCi0gICAgICAgICAgICAiIiwKICAgICAgICAgICAgICJcMVx1MDI0MyIsCiAgICAgICAgICAgICAiXDFcdTAyNDQiLAotICAgICAgICAgICAgIlwxXHUwMjQ1IiwKLSAgICAgICAgICAgICJcMVwxNDFcMTNcdWZmZmZcMTJcMTQxXDdcdWZmZmZcMzJcMTQxXDRcdWZmZmZcMVwxNDFcMVx1ZmZmZlwzMlwxNDEiLAotICAgICAgICAgICAgIlwxXDE0MVwxM1x1ZmZmZlwxMlwxNDFcN1x1ZmZmZlwzMlwxNDFcNFx1ZmZmZlwxXDE0MVwxXHVmZmZmXDMyXDE0MSIsCiAgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIlwxXHUwMjQ1IiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIlwxXHUwMjQ2IiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiXDFcdTAyNDciLAogICAgICAgICAgICAgIlwxXHUwMjQ4IiwKICAgICAgICAgICAgICJcMVx1MDI0OSIsCi0gICAgICAgICAgICAiXDFcdTAyNGEiLAotICAgICAgICAgICAgIlwxXHUwMjRiIiwKLSAgICAgICAgICAgICJcMVx1MDI0YyIsCi0gICAgICAgICAgICAiXDFcdTAyNGQiLAogICAgICAgICAgICAgIiIsCi0gICAgICAgICAgICAiXDFcdTAyNGUiLAotICAgICAgICAgICAgIlwxXHUwMjRmIiwKLSAgICAgICAgICAgICJcMVwxNDFcMTNcdWZmZmZcMTJcMTQxXDdcdWZmZmZcMzJcMTQxXDRcdWZmZmZcMVwxNDFcMVx1ZmZmZlwzMlwxNDEiLAotICAgICAgICAgICAgIlwxXDE0MVwxM1x1ZmZmZlwxMlwxNDFcN1x1ZmZmZlwzMlwxNDFcNFx1ZmZmZlwxXDE0MVwxXHVmZmZmXDMyXDE0MSIsCisgICAgICAgICAgICAiXDFcMTQzXDEzXHVmZmZmXDEyXDE0M1w3XHVmZmZmXDMyXDE0M1w0XHVmZmZmXDFcMTQzXDFcdWZmZmZcMzJcMTQzIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIlwxXDE0M1wxM1x1ZmZmZlwxMlwxNDNcN1x1ZmZmZlwzMlwxNDNcNFx1ZmZmZlwxXDE0M1wxXHVmZmZmXDMyXDE0MyIsCisgICAgICAgICAgICAiXDFcMTQzXDEzXHVmZmZmXDEyXDE0M1w3XHVmZmZmXDMyXDE0M1w0XHVmZmZmXDFcMTQzXDFcdWZmZmZcMzJcMTQzIiwKKyAgICAgICAgICAgICJcMVx1MDI0ZCIsCisgICAgICAgICAgICAiXDFcMTQzXDEzXHVmZmZmXDEyXDE0M1w3XHVmZmZmXDE0XDE0M1wxXHUwMjRlXDE1XDE0M1w0XHVmZmZmXDFcMTQzXDFcdWZmZmZcMzJcMTQzIiwKKyAgICAgICAgICAgICJcMVwxNDNcMTNcdWZmZmZcMTJcMTQzXDdcdWZmZmZcMzJcMTQzXDRcdWZmZmZcMVwxNDNcMVx1ZmZmZlwzMlwxNDMiLAorICAgICAgICAgICAgIlwxXHUwMjUxIiwKICAgICAgICAgICAgICJcMVx1MDI1MiIsCiAgICAgICAgICAgICAiXDFcdTAyNTMiLAogICAgICAgICAgICAgIlwxXHUwMjU0IiwKLSAgICAgICAgICAgICIiLAogICAgICAgICAgICAgIlwxXHUwMjU1IiwKLSAgICAgICAgICAgICJcMVwxNDFcMTNcdWZmZmZcMTJcMTQxXDdcdWZmZmZcMzJcMTQxXDRcdWZmZmZcMVwxNDFcMVx1ZmZmZlwzMlwxNDEiLAorICAgICAgICAgICAgIlwxXDE0M1wxM1x1ZmZmZlwxMlwxNDNcN1x1ZmZmZlwzMlwxNDNcNFx1ZmZmZlwxXDE0M1wxXHVmZmZmXDMyXDE0MyIsCiAgICAgICAgICAgICAiXDFcdTAyNTciLAogICAgICAgICAgICAgIlwxXHUwMjU4IiwKLSAgICAgICAgICAgICIiLAotICAgICAgICAgICAgIlwxXDE0MVwxM1x1ZmZmZlwxMlwxNDFcN1x1ZmZmZlwzMlwxNDFcNFx1ZmZmZlwxXDE0MVwxXHVmZmZmXDMyXDE0MSIsCisgICAgICAgICAgICAiXDFcdTAyNTkiLAogICAgICAgICAgICAgIlwxXHUwMjVhIiwKLSAgICAgICAgICAgICJcMVx1MDI1YiIsCi0gICAgICAgICAgICAiXDFcdTAyNWMiLAogICAgICAgICAgICAgIiIsCi0gICAgICAgICAgICAiXDFcdTAyNWQiLAorICAgICAgICAgICAgIlwxXHUwMjViIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIlwxXHUwMjVjXDMzXHVmZmZmXDFcdTAyNWQiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAogICAgICAgICAgICAgIlwxXHUwMjVlIiwKICAgICAgICAgICAgICJcMVx1MDI1ZiIsCiAgICAgICAgICAgICAiXDFcdTAyNjAiLAotICAgICAgICAgICAgIiIsCi0gICAgICAgICAgICAiIiwKICAgICAgICAgICAgICJcMVx1MDI2MSIsCi0gICAgICAgICAgICAiXDFcMTQxXDEzXHVmZmZmXDEyXDE0MVw3XHVmZmZmXDMyXDE0MVw0XHVmZmZmXDFcMTQxXDFcdWZmZmZcMzJcMTQxIiwKKyAgICAgICAgICAgICJcMVwxNDNcMTNcdWZmZmZcMTJcMTQzXDdcdWZmZmZcMzJcMTQzXDRcdWZmZmZcMVwxNDNcMVx1ZmZmZlwzMlwxNDMiLAogICAgICAgICAgICAgIlwxXHUwMjYzIiwKICAgICAgICAgICAgICJcMVx1MDI2NCIsCiAgICAgICAgICAgICAiXDFcdTAyNjUiLAotICAgICAgICAgICAgIlwxXDE0MVwxM1x1ZmZmZlwxMlwxNDFcN1x1ZmZmZlwzMlwxNDFcNFx1ZmZmZlwxXDE0MVwxXHVmZmZmXDMyXDE0MSIsCisgICAgICAgICAgICAiXDFcdTAyNjYiLAorICAgICAgICAgICAgIiIsCiAgICAgICAgICAgICAiXDFcdTAyNjciLAotICAgICAgICAgICAgIlwxXHUwMjY4IiwKKyAgICAgICAgICAgICJcMVwxNDNcMTNcdWZmZmZcMTJcMTQzXDdcdWZmZmZcMzJcMTQzXDRcdWZmZmZcMVwxNDNcMVx1ZmZmZlwzMlwxNDMiLAorICAgICAgICAgICAgIlwxXHUwMjY5IiwKICAgICAgICAgICAgICIiLAotICAgICAgICAgICAgIiIsCi0gICAgICAgICAgICAiXDFcMTQxXDEzXHVmZmZmXDEyXDE0MVw3XHVmZmZmXDMyXDE0MVw0XHVmZmZmXDFcMTQxXDFcdWZmZmZcMzJcMTQxIiwKICAgICAgICAgICAgICJcMVx1MDI2YSIsCiAgICAgICAgICAgICAiXDFcdTAyNmIiLAotICAgICAgICAgICAgIlwxXDE0MVwxM1x1ZmZmZlwxMlwxNDFcN1x1ZmZmZlwzMlwxNDFcNFx1ZmZmZlwxXDE0MVwxXHVmZmZmXDMyXDE0MSIsCi0gICAgICAgICAgICAiIiwKLSAgICAgICAgICAgICJcMVwxNDFcMTNcdWZmZmZcMTJcMTQxXDdcdWZmZmZcMzJcMTQxXDRcdWZmZmZcMVwxNDFcMVx1ZmZmZlwzMlwxNDEiLAotICAgICAgICAgICAgIlwxXHUwMjZlIiwKLSAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIlwxXHUwMjZjIiwKKyAgICAgICAgICAgICJcMVx1MDI2ZCIsCisgICAgICAgICAgICAiXDFcMTQzXDEzXHVmZmZmXDEyXDE0M1w3XHVmZmZmXDMyXDE0M1w0XHVmZmZmXDFcMTQzXDFcdWZmZmZcMzJcMTQzIiwKICAgICAgICAgICAgICJcMVx1MDI2ZiIsCiAgICAgICAgICAgICAiXDFcdTAyNzAiLAotICAgICAgICAgICAgIlwxXDE0MVwxM1x1ZmZmZlwxMlwxNDFcN1x1ZmZmZlwzMlwxNDFcNFx1ZmZmZlwxXDE0MVwxXHVmZmZmXDMyXDE0MSIsCisgICAgICAgICAgICAiXDFcdTAyNzEiLAogICAgICAgICAgICAgIlwxXHUwMjcyIiwKICAgICAgICAgICAgICJcMVx1MDI3MyIsCi0gICAgICAgICAgICAiXDFcMTQxXDEzXHVmZmZmXDEyXDE0MVw3XHVmZmZmXDMyXDE0MVw0XHVmZmZmXDFcMTQxXDFcdWZmZmZcMzJcMTQxIiwKLSAgICAgICAgICAgICJcMVx1MDI3NSIsCi0gICAgICAgICAgICAiXDFcdTAyNzYiLAogICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIlwxXDE0M1wxM1x1ZmZmZlwxMlwxNDNcN1x1ZmZmZlwzMlwxNDNcNFx1ZmZmZlwxXDE0M1wxXHVmZmZmXDMyXDE0MyIsCisgICAgICAgICAgICAiXDFcdTAyNzUiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICJcMVx1MDI3NiIsCiAgICAgICAgICAgICAiXDFcdTAyNzciLAogICAgICAgICAgICAgIlwxXHUwMjc4IiwKLSAgICAgICAgICAgICJcMVx1MDI3OSIsCisgICAgICAgICAgICAiXDFcMTQzXDEzXHVmZmZmXDEyXDE0M1w3XHVmZmZmXDMyXDE0M1w0XHVmZmZmXDFcMTQzXDFcdWZmZmZcMzJcMTQzIiwKKyAgICAgICAgICAgICJcMVwxNDNcMTNcdWZmZmZcMTJcMTQzXDdcdWZmZmZcMzJcMTQzXDRcdWZmZmZcMVwxNDNcMVx1ZmZmZlwzMlwxNDMiLAogICAgICAgICAgICAgIiIsCi0gICAgICAgICAgICAiXDFcdTAyN2EiLAogICAgICAgICAgICAgIlwxXHUwMjdiIiwKLSAgICAgICAgICAgICIiLAogICAgICAgICAgICAgIlwxXHUwMjdjIiwKICAgICAgICAgICAgICJcMVx1MDI3ZCIsCi0gICAgICAgICAgICAiIiwKLSAgICAgICAgICAgICIiLAotICAgICAgICAgICAgIlwxXDE0MVwxM1x1ZmZmZlwxMlwxNDFcN1x1ZmZmZlwzMlwxNDFcNFx1ZmZmZlwxXDE0MVwxXHVmZmZmXDMyXDE0MSIsCisgICAgICAgICAgICAiXDFcdTAyN2UiLAogICAgICAgICAgICAgIlwxXHUwMjdmIiwKLSAgICAgICAgICAgICJcMVwxNDFcMTNcdWZmZmZcMTJcMTQxXDdcdWZmZmZcMzJcMTQxXDRcdWZmZmZcMVwxNDFcMVx1ZmZmZlwzMlwxNDEiLAotICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiXDFcdTAyODAiLAogICAgICAgICAgICAgIlwxXHUwMjgxIiwKICAgICAgICAgICAgICJcMVx1MDI4MiIsCi0gICAgICAgICAgICAiIiwKICAgICAgICAgICAgICJcMVx1MDI4MyIsCi0gICAgICAgICAgICAiXDFcMTQxXDEzXHVmZmZmXDEyXDE0MVw3XHVmZmZmXDMyXDE0MVw0XHVmZmZmXDFcMTQxXDFcdWZmZmZcMzJcMTQxIiwKKyAgICAgICAgICAgICJcMVx1MDI4NCIsCiAgICAgICAgICAgICAiXDFcdTAyODUiLAorICAgICAgICAgICAgIiIsCiAgICAgICAgICAgICAiXDFcdTAyODYiLAogICAgICAgICAgICAgIlwxXHUwMjg3IiwKLSAgICAgICAgICAgICJcMVwxNDFcMTNcdWZmZmZcMTJcMTQxXDdcdWZmZmZcMzJcMTQxXDRcdWZmZmZcMVwxNDFcMVx1ZmZmZlwzMlwxNDEiLAotICAgICAgICAgICAgIlwxXHUwMjg5IiwKKyAgICAgICAgICAgICJcMVwxNDNcMTNcdWZmZmZcMTJcMTQzXDdcdWZmZmZcMzJcMTQzXDRcdWZmZmZcMVwxNDNcMVx1ZmZmZlwzMlwxNDMiLAorICAgICAgICAgICAgIlwxXDE0M1wxM1x1ZmZmZlwxMlwxNDNcN1x1ZmZmZlwzMlwxNDNcNFx1ZmZmZlwxXDE0M1wxXHVmZmZmXDMyXDE0MyIsCiAgICAgICAgICAgICAiXDFcdTAyOGEiLAorICAgICAgICAgICAgIiIsCiAgICAgICAgICAgICAiXDFcdTAyOGIiLAotICAgICAgICAgICAgIiIsCi0gICAgICAgICAgICAiXDFcMTQxXDEzXHVmZmZmXDEyXDE0MVw3XHVmZmZmXDMyXDE0MVw0XHVmZmZmXDFcMTQxXDFcdWZmZmZcMzJcMTQxIiwKLSAgICAgICAgICAgICIiLAotICAgICAgICAgICAgIlwxXDE0MVwxM1x1ZmZmZlwxMlwxNDFcN1x1ZmZmZlwzMlwxNDFcNFx1ZmZmZlwxXDE0MVwxXHVmZmZmXDMyXDE0MSIsCisgICAgICAgICAgICAiXDFcMTQzXDEzXHVmZmZmXDEyXDE0M1w3XHVmZmZmXDMyXDE0M1w0XHVmZmZmXDFcMTQzXDFcdWZmZmZcMzJcMTQzIiwKKyAgICAgICAgICAgICJcMVx1MDI4ZCIsCiAgICAgICAgICAgICAiXDFcdTAyOGUiLAotICAgICAgICAgICAgIlwxXDE0MVwxM1x1ZmZmZlwxMlwxNDFcN1x1ZmZmZlwzMlwxNDFcNFx1ZmZmZlwxXDE0MVwxXHVmZmZmXDMyXDE0MSIsCisgICAgICAgICAgICAiXDFcdTAyOGYiLAogICAgICAgICAgICAgIiIsCi0gICAgICAgICAgICAiXDFcdTAyOTAiLAotICAgICAgICAgICAgIlwxXDE0MVwxM1x1ZmZmZlwxMlwxNDFcN1x1ZmZmZlwzMlwxNDFcNFx1ZmZmZlwxXDE0MVwxXHVmZmZmXDMyXDE0MSIsCi0gICAgICAgICAgICAiXDFcdTAyOTIiLAotICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiXDFcMTQzXDEzXHVmZmZmXDEyXDE0M1w3XHVmZmZmXDMyXDE0M1w0XHVmZmZmXDFcMTQzXDFcdWZmZmZcMzJcMTQzIiwKKyAgICAgICAgICAgICJcMVx1MDI5MSIsCisgICAgICAgICAgICAiXDFcMTQzXDEzXHVmZmZmXDEyXDE0M1w3XHVmZmZmXDMyXDE0M1w0XHVmZmZmXDFcMTQzXDFcdWZmZmZcMzJcMTQzIiwKICAgICAgICAgICAgICJcMVx1MDI5MyIsCiAgICAgICAgICAgICAiXDFcdTAyOTQiLAorICAgICAgICAgICAgIiIsCiAgICAgICAgICAgICAiXDFcdTAyOTUiLAotICAgICAgICAgICAgIiIsCi0gICAgICAgICAgICAiIiwKICAgICAgICAgICAgICJcMVx1MDI5NiIsCi0gICAgICAgICAgICAiIiwKICAgICAgICAgICAgICJcMVx1MDI5NyIsCi0gICAgICAgICAgICAiIiwKICAgICAgICAgICAgICJcMVx1MDI5OCIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAogICAgICAgICAgICAgIlwxXHUwMjk5IiwKLSAgICAgICAgICAgICJcMVwxNDFcMTNcdWZmZmZcMTJcMTQxXDdcdWZmZmZcMzJcMTQxXDRcdWZmZmZcMVwxNDFcMVx1ZmZmZlwzMlwxNDEiLAorICAgICAgICAgICAgIlwxXDE0M1wxM1x1ZmZmZlwxMlwxNDNcN1x1ZmZmZlwzMlwxNDNcNFx1ZmZmZlwxXDE0M1wxXHVmZmZmXDMyXDE0MyIsCiAgICAgICAgICAgICAiXDFcdTAyOWIiLAotICAgICAgICAgICAgIlwxXDE0MVwxM1x1ZmZmZlwxMlwxNDFcN1x1ZmZmZlwzMlwxNDFcNFx1ZmZmZlwxXDE0MVwxXHVmZmZmXDMyXDE0MSIsCisgICAgICAgICAgICAiXDFcdTAyOWMiLAogICAgICAgICAgICAgIlwxXHUwMjlkIiwKLSAgICAgICAgICAgICJcMVwxNDFcMTNcdWZmZmZcMTJcMTQxXDdcdWZmZmZcMzJcMTQxXDRcdWZmZmZcMVwxNDFcMVx1ZmZmZlwzMlwxNDEiLAotICAgICAgICAgICAgIlwxXDE0MVwxM1x1ZmZmZlwxMlwxNDFcN1x1ZmZmZlwzMlwxNDFcNFx1ZmZmZlwxXDE0MVwxXHVmZmZmXDMyXDE0MSIsCi0gICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICJcMVx1MDI5ZSIsCisgICAgICAgICAgICAiXDFcdTAyOWYiLAogICAgICAgICAgICAgIlwxXHUwMmEwIiwKLSAgICAgICAgICAgICIiLAogICAgICAgICAgICAgIlwxXHUwMmExIiwKLSAgICAgICAgICAgICIiLAotICAgICAgICAgICAgIiIsCi0gICAgICAgICAgICAiXDFcdTAyYTIiLAorICAgICAgICAgICAgIlwxXDE0M1wxM1x1ZmZmZlwxMlwxNDNcN1x1ZmZmZlwzMlwxNDNcNFx1ZmZmZlwxXDE0M1wxXHVmZmZmXDMyXDE0MyIsCiAgICAgICAgICAgICAiXDFcdTAyYTMiLAogICAgICAgICAgICAgIlwxXHUwMmE0IiwKICAgICAgICAgICAgICJcMVx1MDJhNSIsCi0gICAgICAgICAgICAiXDFcdTAyYTYiLAotICAgICAgICAgICAgIlwxXHUwMmE3IiwKLSAgICAgICAgICAgICJcMVx1MDJhOCIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIlwxXDE0M1wxM1x1ZmZmZlwxMlwxNDNcN1x1ZmZmZlwzMlwxNDNcNFx1ZmZmZlwxXDE0M1wxXHVmZmZmXDMyXDE0MyIsCisgICAgICAgICAgICAiXDFcMTQzXDEzXHVmZmZmXDEyXDE0M1w3XHVmZmZmXDMyXDE0M1w0XHVmZmZmXDFcMTQzXDFcdWZmZmZcMzJcMTQzIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIlwxXDE0M1wxM1x1ZmZmZlwxMlwxNDNcN1x1ZmZmZlwzMlwxNDNcNFx1ZmZmZlwxXDE0M1wxXHVmZmZmXDMyXDE0MyIsCiAgICAgICAgICAgICAiXDFcdTAyYTkiLAogICAgICAgICAgICAgIlwxXHUwMmFhIiwKLSAgICAgICAgICAgICJcMVx1MDJhYiIsCi0gICAgICAgICAgICAiXDFcMTQxXDEzXHVmZmZmXDEyXDE0MVw3XHVmZmZmXDMyXDE0MVw0XHVmZmZmXDFcMTQxXDFcdWZmZmZcMzJcMTQxIiwKLSAgICAgICAgICAgICJcMVx1MDJhZCIsCiAgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICJcMVx1MDJhYiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICJcMVx1MDJhYyIsCisgICAgICAgICAgICAiXDFcMTQzXDEzXHVmZmZmXDEyXDE0M1w3XHVmZmZmXDMyXDE0M1w0XHVmZmZmXDFcMTQzXDFcdWZmZmZcMzJcMTQzIiwKICAgICAgICAgICAgICJcMVx1MDJhZSIsCiAgICAgICAgICAgICAiXDFcdTAyYWYiLAotICAgICAgICAgICAgIlwxXHUwMmIwIiwKKyAgICAgICAgICAgICJcMVwxNDNcMTNcdWZmZmZcMTJcMTQzXDdcdWZmZmZcMzJcMTQzXDRcdWZmZmZcMVwxNDNcMVx1ZmZmZlwzMlwxNDMiLAogICAgICAgICAgICAgIlwxXHUwMmIxIiwKICAgICAgICAgICAgICJcMVx1MDJiMiIsCi0gICAgICAgICAgICAiXDFcMTQxXDEzXHVmZmZmXDEyXDE0MVw3XHVmZmZmXDMyXDE0MVw0XHVmZmZmXDFcMTQxXDFcdWZmZmZcMzJcMTQxIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIlwxXHUwMmIzIiwKKyAgICAgICAgICAgICJcMVx1MDJiNCIsCisgICAgICAgICAgICAiXDFcdTAyYjUiLAorICAgICAgICAgICAgIlwxXHUwMmI2IiwKKyAgICAgICAgICAgICJcMVx1MDJiNyIsCisgICAgICAgICAgICAiXDFcdTAyYjgiLAorICAgICAgICAgICAgIlwxXHUwMmI5IiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIlwxXHUwMmJhIiwKKyAgICAgICAgICAgICJcMVx1MDJiYiIsCisgICAgICAgICAgICAiXDFcdTAyYmMiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIlwxXHUwMmJkIiwKKyAgICAgICAgICAgICJcMVwxNDNcMTNcdWZmZmZcMTJcMTQzXDdcdWZmZmZcMzJcMTQzXDRcdWZmZmZcMVwxNDNcMVx1ZmZmZlwzMlwxNDMiLAorICAgICAgICAgICAgIlwxXHUwMmJmIiwKKyAgICAgICAgICAgICJcMVwxNDNcMTNcdWZmZmZcMTJcMTQzXDdcdWZmZmZcMzJcMTQzXDRcdWZmZmZcMVwxNDNcMVx1ZmZmZlwzMlwxNDMiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiXDFcdTAyYzEiLAorICAgICAgICAgICAgIlwxXHUwMmMyIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIlwxXHUwMmMzIiwKKyAgICAgICAgICAgICJcMVwxNDNcMTNcdWZmZmZcMTJcMTQzXDdcdWZmZmZcMzJcMTQzXDRcdWZmZmZcMVwxNDNcMVx1ZmZmZlwzMlwxNDMiLAorICAgICAgICAgICAgIlwxXHUwMmM1IiwKKyAgICAgICAgICAgICJcMVx1MDJjNiIsCisgICAgICAgICAgICAiXDFcdTAyYzciLAorICAgICAgICAgICAgIlwxXHUwMmM4IiwKKyAgICAgICAgICAgICJcMVx1MDJjOSIsCisgICAgICAgICAgICAiXDFcdTAyY2EiLAorICAgICAgICAgICAgIlwxXHUwMmNiIiwKKyAgICAgICAgICAgICJcMVx1MDJjYyIsCisgICAgICAgICAgICAiXDFcMTQzXDEzXHVmZmZmXDEyXDE0M1w3XHVmZmZmXDMyXDE0M1w0XHVmZmZmXDFcMTQzXDFcdWZmZmZcMzJcMTQzIiwKKyAgICAgICAgICAgICJcMVx1MDJjZSIsCisgICAgICAgICAgICAiXDFcMTQzXDEzXHVmZmZmXDEyXDE0M1w3XHVmZmZmXDMyXDE0M1w0XHVmZmZmXDFcMTQzXDFcdWZmZmZcMzJcMTQzIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIlwxXDE0M1wxM1x1ZmZmZlwxMlwxNDNcN1x1ZmZmZlwzMlwxNDNcNFx1ZmZmZlwxXDE0M1wxXHVmZmZmXDMyXDE0MyIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICJcMVwxNDNcMTNcdWZmZmZcMTJcMTQzXDdcdWZmZmZcMzJcMTQzXDRcdWZmZmZcMVwxNDNcMVx1ZmZmZlwzMlwxNDMiLAorICAgICAgICAgICAgIlwxXHUwMmQyIiwKKyAgICAgICAgICAgICJcMVwxNDNcMTNcdWZmZmZcMTJcMTQzXDdcdWZmZmZcMzJcMTQzXDRcdWZmZmZcMVwxNDNcMVx1ZmZmZlwzMlwxNDMiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiXDFcdTAyZDQiLAorICAgICAgICAgICAgIlwxXDE0M1wxM1x1ZmZmZlwxMlwxNDNcN1x1ZmZmZlwzMlwxNDNcNFx1ZmZmZlwxXDE0M1wxXHVmZmZmXDMyXDE0MyIsCisgICAgICAgICAgICAiXDFcdTAyZDYiLAorICAgICAgICAgICAgIlwxXHUwMmQ3IiwKKyAgICAgICAgICAgICJcMVx1MDJkOCIsCisgICAgICAgICAgICAiXDFcMTQzXDEzXHVmZmZmXDEyXDE0M1w3XHVmZmZmXDMyXDE0M1w0XHVmZmZmXDFcMTQzXDFcdWZmZmZcMzJcMTQzIiwKKyAgICAgICAgICAgICJcMVwxNDNcMTNcdWZmZmZcMTJcMTQzXDdcdWZmZmZcMzJcMTQzXDRcdWZmZmZcMVwxNDNcMVx1ZmZmZlwzMlwxNDMiLAorICAgICAgICAgICAgIlwxXHUwMmRiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIlwxXHUwMmRjIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICJcMVx1MDJkZCIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICJcMVx1MDJkZSIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICJcMVx1MDJkZiIsCisgICAgICAgICAgICAiXDFcMTQzXDEzXHVmZmZmXDEyXDE0M1w3XHVmZmZmXDMyXDE0M1w0XHVmZmZmXDFcMTQzXDFcdWZmZmZcMzJcMTQzIiwKKyAgICAgICAgICAgICJcMVx1MDJlMSIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIlwxXHUwMmUyIiwKKyAgICAgICAgICAgICJcMVx1MDJlMyIsCisgICAgICAgICAgICAiXDFcMTQzXDEzXHVmZmZmXDEyXDE0M1w3XHVmZmZmXDMyXDE0M1w0XHVmZmZmXDFcMTQzXDFcdWZmZmZcMzJcMTQzIiwKKyAgICAgICAgICAgICJcMVx1MDJlNSIsCisgICAgICAgICAgICAiXDFcMTQzXDEzXHVmZmZmXDEyXDE0M1w3XHVmZmZmXDMyXDE0M1w0XHVmZmZmXDFcMTQzXDFcdWZmZmZcMzJcMTQzIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIlwxXHUwMmU3IiwKKyAgICAgICAgICAgICJcMVx1MDJlOCIsCisgICAgICAgICAgICAiXDFcMTQzXDEzXHVmZmZmXDEyXDE0M1w3XHVmZmZmXDMyXDE0M1w0XHVmZmZmXDFcMTQzXDFcdWZmZmZcMzJcMTQzIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIlwxXHUwMmVhIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIlwxXHUwMmViIiwKKyAgICAgICAgICAgICJcMVx1MDJlYyIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICJcMVx1MDJlZCIsCisgICAgICAgICAgICAiXDFcdTAyZWUiLAorICAgICAgICAgICAgIlwxXHUwMmVmIiwKKyAgICAgICAgICAgICJcMVx1MDJmMCIsCisgICAgICAgICAgICAiXDFcdTAyZjEiLAorICAgICAgICAgICAgIlwxXHUwMmYyIiwKKyAgICAgICAgICAgICJcMVx1MDJmMyIsCisgICAgICAgICAgICAiXDFcdTAyZjQiLAorICAgICAgICAgICAgIlwxXHUwMmY1IiwKKyAgICAgICAgICAgICJcMVx1MDJmNiIsCisgICAgICAgICAgICAiXDFcdTAyZjciLAorICAgICAgICAgICAgIlwxXHUwMmY4IiwKKyAgICAgICAgICAgICJcMVx1MDJmOSIsCisgICAgICAgICAgICAiXDFcMTQzXDEzXHVmZmZmXDEyXDE0M1w3XHVmZmZmXDMyXDE0M1w0XHVmZmZmXDFcMTQzXDFcdWZmZmZcMzJcMTQzIiwKKyAgICAgICAgICAgICJcMVx1MDJmYiIsCisgICAgICAgICAgICAiXDFcdTAyZmMiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiXDFcMTQzXDEzXHVmZmZmXDEyXDE0M1w3XHVmZmZmXDMyXDE0M1w0XHVmZmZmXDFcMTQzXDFcdWZmZmZcMzJcMTQzIiwKKyAgICAgICAgICAgICJcMVx1MDJmZSIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICJcMVx1MDJmZiIsCisgICAgICAgICAgICAiXDFcdTAzMDAiLAorICAgICAgICAgICAgIlwxXHUwMzAxIiwKKyAgICAgICAgICAgICJcMVx1MDMwMiIsCisgICAgICAgICAgICAiXDFcMTQzXDEzXHVmZmZmXDEyXDE0M1w3XHVmZmZmXDMyXDE0M1w0XHVmZmZmXDFcMTQzXDFcdWZmZmZcMzJcMTQzIiwKICAgICAgICAgICAgICIiCiAgICAgfTsKIApAQCAtNTc4NCw3ICs2MjEyLDcgQEAKICAgICAgICAgICAgIHRoaXMudHJhbnNpdGlvbiA9IERGQTIxX3RyYW5zaXRpb247CiAgICAgICAgIH0KICAgICAgICAgcHVibGljIFN0cmluZyBnZXREZXNjcmlwdGlvbigpIHsKLSAgICAgICAgICAgIHJldHVybiAiMToxOiBUb2tlbnMgOiAoIFRfXzEzIHwgVF9fMTQgfCBUX18xNSB8IFRfXzE2IHwgVF9fMTcgfCBUX18xOCB8IFRfXzE5IHwgVF9fMjAgfCBUX18yMSB8IFRfXzIyIHwgVF9fMjMgfCBUX18yNCB8IFRfXzI1IHwgVF9fMjYgfCBUX18yNyB8IFRfXzI4IHwgVF9fMjkgfCBUX18zMCB8IFRfXzMxIHwgVF9fMzIgfCBUX18zMyB8IFRfXzM0IHwgVF9fMzUgfCBUX18zNiB8IFRfXzM3IHwgVF9fMzggfCBUX18zOSB8IFRfXzQwIHwgVF9fNDEgfCBUX180MiB8IFRfXzQzIHwgVF9fNDQgfCBUX180NSB8IFRfXzQ2IHwgVF9fNDcgfCBUX180OCB8IFRfXzQ5IHwgVF9fNTAgfCBUX181MSB8IFRfXzUyIHwgVF9fNTMgfCBUX181NCB8IFRfXzU1IHwgVF9fNTYgfCBUX181NyB8IFRfXzU4IHwgVF9fNTkgfCBUX182MCB8IFRfXzYxIHwgVF9fNjIgfCBUX182MyB8IFRfXzY0IHwgVF9fNjUgfCBUX182NiB8IFRfXzY3IHwgVF9fNjggfCBUX182OSB8IFRfXzcwIHwgVF9fNzEgfCBUX183MiB8IFRfXzczIHwgVF9fNzQgfCBUX183NSB8IFRfXzc2IHwgVF9fNzcgfCBUX183OCB8IFRfXzc5IHwgVF9fODAgfCBUX184MSB8IFRfXzgyIHwgVF9fODMgfCBUX184NCB8IFRfXzg1IHwgVF9fODYgfCBUX184NyB8IFRfXzg4IHwgVF9fODkgfCBUX185MCB8IFRfXzkxIHwgVF9fOTIgfCBUX185MyB8IFRfXzk0IHwgVF9fOTUgfCBUX185NiB8IFRfXzk3IHwgVF9fOTggfCBUX185OSB8IFRfXzEwMCB8IFRfXzEwMSB8IFRfXzEwMiB8IFRfXzEwMyB8IFRfXzEwNCB8IFRfXzEwNSB8IFRfXzEwNiB8IFRfXzEwNyB8IFRfXzEwOCB8IFRfXzEwOSB8IFRfXzExMCB8IFRfXzExMSB8IFRfXzExMiB8IFRfXzExMyB8IFRfXzExNCB8IFRfXzExNSB8IFRfXzExNiB8IFRfXzExNyB8IFRfXzExOCB8IFRfXzExOSB8IFRfXzEyMCB8IFRfXzEyMSB8IFRfXzEyMiB8IFRfXzEyMyB8IFRfXzEyNCB8IFRfXzEyNSB8IFRfXzEyNiB8IFRfXzEyNyB8IFRfXzEyOCB8IFRfXzEyOSB8IFRfXzEzMCB8IFRfXzEzMSB8IFRfXzEzMiB8IFRfXzEzMyB8IFRfXzEzNCB8IFRfXzEzNSB8IFRfXzEzNiB8IFRfXzEzNyB8IFRfXzEzOCB8IFRfXzEzOSB8IFRfXzE0MCB8IFRfXzE0MSB8IFRfXzE0MiB8IFRfXzE0MyB8IFRfXzE0NCB8IFRfXzE0NSB8IFRfXzE0NiB8IFRfXzE0NyB8IFRfXzE0OCB8IFRfXzE0OSB8IFRfXzE1MCB8IFRfXzE1MSB8IFRfXzE1MiB8IFRfXzE1MyB8IFRfXzE1NCB8IFJVTEVfSEVYIHwgUlVMRV9JTlQgfCBSVUxFX0RFQ0lNQUwgfCBSVUxFX0lEIHwgUlVMRV9TVFJJTkcgfCBSVUxFX01MX0NPTU1FTlQgfCBSVUxFX1NMX0NPTU1FTlQgfCBSVUxFX1dTIHwgUlVMRV9BTllfT1RIRVIgKTsiOworICAgICAgICAgICAgcmV0dXJuICIxOjE6IFRva2VucyA6ICggVF9fMTMgfCBUX18xNCB8IFRfXzE1IHwgVF9fMTYgfCBUX18xNyB8IFRfXzE4IHwgVF9fMTkgfCBUX18yMCB8IFRfXzIxIHwgVF9fMjIgfCBUX18yMyB8IFRfXzI0IHwgVF9fMjUgfCBUX18yNiB8IFRfXzI3IHwgVF9fMjggfCBUX18yOSB8IFRfXzMwIHwgVF9fMzEgfCBUX18zMiB8IFRfXzMzIHwgVF9fMzQgfCBUX18zNSB8IFRfXzM2IHwgVF9fMzcgfCBUX18zOCB8IFRfXzM5IHwgVF9fNDAgfCBUX180MSB8IFRfXzQyIHwgVF9fNDMgfCBUX180NCB8IFRfXzQ1IHwgVF9fNDYgfCBUX180NyB8IFRfXzQ4IHwgVF9fNDkgfCBUX181MCB8IFRfXzUxIHwgVF9fNTIgfCBUX181MyB8IFRfXzU0IHwgVF9fNTUgfCBUX181NiB8IFRfXzU3IHwgVF9fNTggfCBUX181OSB8IFRfXzYwIHwgVF9fNjEgfCBUX182MiB8IFRfXzYzIHwgVF9fNjQgfCBUX182NSB8IFRfXzY2IHwgVF9fNjcgfCBUX182OCB8IFRfXzY5IHwgVF9fNzAgfCBUX183MSB8IFRfXzcyIHwgVF9fNzMgfCBUX183NCB8IFRfXzc1IHwgVF9fNzYgfCBUX183NyB8IFRfXzc4IHwgVF9fNzkgfCBUX184MCB8IFRfXzgxIHwgVF9fODIgfCBUX184MyB8IFRfXzg0IHwgVF9fODUgfCBUX184NiB8IFRfXzg3IHwgVF9fODggfCBUX184OSB8IFRfXzkwIHwgVF9fOTEgfCBUX185MiB8IFRfXzkzIHwgVF9fOTQgfCBUX185NSB8IFRfXzk2IHwgVF9fOTcgfCBUX185OCB8IFRfXzk5IHwgVF9fMTAwIHwgVF9fMTAxIHwgVF9fMTAyIHwgVF9fMTAzIHwgVF9fMTA0IHwgVF9fMTA1IHwgVF9fMTA2IHwgVF9fMTA3IHwgVF9fMTA4IHwgVF9fMTA5IHwgVF9fMTEwIHwgVF9fMTExIHwgVF9fMTEyIHwgVF9fMTEzIHwgVF9fMTE0IHwgVF9fMTE1IHwgVF9fMTE2IHwgVF9fMTE3IHwgVF9fMTE4IHwgVF9fMTE5IHwgVF9fMTIwIHwgVF9fMTIxIHwgVF9fMTIyIHwgVF9fMTIzIHwgVF9fMTI0IHwgVF9fMTI1IHwgVF9fMTI2IHwgVF9fMTI3IHwgVF9fMTI4IHwgVF9fMTI5IHwgVF9fMTMwIHwgVF9fMTMxIHwgVF9fMTMyIHwgVF9fMTMzIHwgVF9fMTM0IHwgVF9fMTM1IHwgVF9fMTM2IHwgVF9fMTM3IHwgVF9fMTM4IHwgVF9fMTM5IHwgVF9fMTQwIHwgVF9fMTQxIHwgVF9fMTQyIHwgVF9fMTQzIHwgVF9fMTQ0IHwgVF9fMTQ1IHwgVF9fMTQ2IHwgVF9fMTQ3IHwgVF9fMTQ4IHwgVF9fMTQ5IHwgVF9fMTUwIHwgVF9fMTUxIHwgVF9fMTUyIHwgVF9fMTUzIHwgVF9fMTU0IHwgVF9fMTU1IHwgVF9fMTU2IHwgVF9fMTU3IHwgVF9fMTU4IHwgVF9fMTU5IHwgVF9fMTYwIHwgVF9fMTYxIHwgVF9fMTYyIHwgVF9fMTYzIHwgVF9fMTY0IHwgVF9fMTY1IHwgVF9fMTY2IHwgUlVMRV9IRVggfCBSVUxFX0lOVCB8IFJVTEVfREVDSU1BTCB8IFJVTEVfSUQgfCBSVUxFX1NUUklORyB8IFJVTEVfTUxfQ09NTUVOVCB8IFJVTEVfU0xfQ09NTUVOVCB8IFJVTEVfV1MgfCBSVUxFX0FOWV9PVEhFUiApOyI7CiAgICAgICAgIH0KICAgICAgICAgcHVibGljIGludCBzcGVjaWFsU3RhdGVUcmFuc2l0aW9uKGludCBzLCBJbnRTdHJlYW0gX2lucHV0KSB0aHJvd3MgTm9WaWFibGVBbHRFeGNlcHRpb24gewogICAgICAgICAgICAgSW50U3RyZWFtIGlucHV0ID0gX2lucHV0OwpAQCAtNTg1NCw2NSArNjI4Miw2NyBAQAogCiAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICggKExBMjFfMD09J3InKSApIHtzID0gMzA7fQogCi0gICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICggKExBMjFfMD09J3QnKSApIHtzID0gMzE7fQorICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoIChMQTIxXzA9PSdhJykgKSB7cyA9IDMxO30KIAotICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoIChMQTIxXzA9PSd7JykgKSB7cyA9IDMyO30KKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKCAoTEEyMV8wPT0ndCcpICkge3MgPSAzMjt9CiAKLSAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKCAoTEEyMV8wPT0nfScpICkge3MgPSAzMzt9CisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICggKExBMjFfMD09J3snKSApIHtzID0gMzM7fQogCi0gICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICggKExBMjFfMD09J1gnKSApIHtzID0gMzQ7fQorICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoIChMQTIxXzA9PSd9JykgKSB7cyA9IDM0O30KIAotICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoIChMQTIxXzA9PSdsJykgKSB7cyA9IDM1O30KKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKCAoTEEyMV8wPT0nWCcpICkge3MgPSAzNTt9CiAKLSAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKCAoTEEyMV8wPT0nQycpICkge3MgPSAzNjt9CisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICggKExBMjFfMD09J2wnKSApIHtzID0gMzY7fQogCi0gICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICggKExBMjFfMD09J2QnKSApIHtzID0gMzc7fQorICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoIChMQTIxXzA9PSdDJykgKSB7cyA9IDM3O30KIAotICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoIChMQTIxXzA9PSdxJykgKSB7cyA9IDM4O30KKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKCAoTEEyMV8wPT0nZCcpICkge3MgPSAzODt9CiAKLSAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKCAoTEEyMV8wPT0nbicpICkge3MgPSAzOTt9CisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICggKExBMjFfMD09J3EnKSApIHtzID0gMzk7fQogCi0gICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICggKExBMjFfMD09J2MnKSApIHtzID0gNDA7fQorICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoIChMQTIxXzA9PSduJykgKSB7cyA9IDQwO30KIAotICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoIChMQTIxXzA9PSdrJykgKSB7cyA9IDQxO30KKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKCAoTEEyMV8wPT0nYycpICkge3MgPSA0MTt9CiAKLSAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKCAoTEEyMV8wPT0ndycpICkge3MgPSA0Mjt9CisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICggKExBMjFfMD09J2snKSApIHtzID0gNDI7fQogCi0gICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICggKExBMjFfMD09J2EnKSApIHtzID0gNDM7fQorICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoIChMQTIxXzA9PSd3JykgKSB7cyA9IDQzO30KIAotICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoIChMQTIxXzA9PSc7JykgKSB7cyA9IDQ0O30KKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKCAoTEEyMV8wPT0naCcpICkge3MgPSA0NDt9CiAKLSAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKCAoTEEyMV8wPT0nQCcpICkge3MgPSA0NTt9CisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICggKExBMjFfMD09JzsnKSApIHtzID0gNDU7fQogCi0gICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICggKExBMjFfMD09JygnKSApIHtzID0gNDY7fQorICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoIChMQTIxXzA9PSdAJykgKSB7cyA9IDQ2O30KIAotICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoIChMQTIxXzA9PScpJykgKSB7cyA9IDQ3O30KKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKCAoTEEyMV8wPT0nKCcpICkge3MgPSA0Nzt9CiAKLSAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKCAoTEEyMV8wPT0nLCcpICkge3MgPSA0ODt9CisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICggKExBMjFfMD09JyknKSApIHtzID0gNDg7fQogCi0gICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICggKExBMjFfMD09J10nKSApIHtzID0gNDk7fQorICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoIChMQTIxXzA9PScsJykgKSB7cyA9IDQ5O30KIAotICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoIChMQTIxXzA9PScjJykgKSB7cyA9IDUwO30KKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKCAoTEEyMV8wPT0nXScpICkge3MgPSA1MDt9CiAKLSAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKCAoTEEyMV8wPT0nWycpICkge3MgPSA1MTt9CisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICggKExBMjFfMD09JyMnKSApIHtzID0gNTE7fQogCi0gICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICggKExBMjFfMD09JzonKSApIHtzID0gNTI7fQorICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoIChMQTIxXzA9PSdbJykgKSB7cyA9IDUyO30KIAotICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoIChMQTIxXzA9PScwJykgKSB7cyA9IDUzO30KKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKCAoTEEyMV8wPT0nOicpICkge3MgPSA1Mzt9CiAKLSAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKCAoKExBMjFfMD49JzEnICYmIExBMjFfMDw9JzknKSkgKSB7cyA9IDU0O30KKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKCAoTEEyMV8wPT0nMCcpICkge3MgPSA1NDt9CiAKLSAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKCAoTEEyMV8wPT0nXicpICkge3MgPSA1NTt9CisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICggKChMQTIxXzA+PScxJyAmJiBMQTIxXzA8PSc5JykpICkge3MgPSA1NTt9CiAKLSAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKCAoTEEyMV8wPT0nJCd8fChMQTIxXzA+PSdBJyAmJiBMQTIxXzA8PSdCJyl8fChMQTIxXzA+PSdGJyAmJiBMQTIxXzA8PSdMJyl8fChMQTIxXzA+PSdPJyAmJiBMQTIxXzA8PSdRJyl8fExBMjFfMD09J1QnfHwoTEEyMV8wPj0nVicgJiYgTEEyMV8wPD0nVycpfHwoTEEyMV8wPj0nWScgJiYgTEEyMV8wPD0nWicpfHxMQTIxXzA9PSdfJ3x8TEEyMV8wPT0nYid8fChMQTIxXzA+PSdnJyAmJiBMQTIxXzA8PSdoJyl8fExBMjFfMD09J3UnfHwoTEEyMV8wPj0neCcgJiYgTEEyMV8wPD0neicpKSApIHtzID0gNTY7fQorICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoIChMQTIxXzA9PSdeJykgKSB7cyA9IDU2O30KIAotICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoIChMQTIxXzA9PSdcIicpICkge3MgPSA1Nzt9CisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICggKExBMjFfMD09JyQnfHwoTEEyMV8wPj0nQScgJiYgTEEyMV8wPD0nQicpfHwoTEEyMV8wPj0nRicgJiYgTEEyMV8wPD0nTCcpfHwoTEEyMV8wPj0nTycgJiYgTEEyMV8wPD0nUScpfHxMQTIxXzA9PSdUJ3x8KExBMjFfMD49J1YnICYmIExBMjFfMDw9J1cnKXx8KExBMjFfMD49J1knICYmIExBMjFfMDw9J1onKXx8TEEyMV8wPT0nXyd8fExBMjFfMD09J2InfHxMQTIxXzA9PSdnJ3x8TEEyMV8wPT0ndSd8fChMQTIxXzA+PSd4JyAmJiBMQTIxXzA8PSd6JykpICkge3MgPSA1Nzt9CiAKLSAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKCAoTEEyMV8wPT0nXCcnKSApIHtzID0gNTg7fQorICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoIChMQTIxXzA9PSdcIicpICkge3MgPSA1ODt9CiAKLSAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKCAoKExBMjFfMD49J1x0JyAmJiBMQTIxXzA8PSdcbicpfHxMQTIxXzA9PSdccid8fExBMjFfMD09JyAnKSApIHtzID0gNTk7fQorICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoIChMQTIxXzA9PSdcJycpICkge3MgPSA1OTt9CiAKLSAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKCAoKExBMjFfMD49J1x1MDAwMCcgJiYgTEEyMV8wPD0nXGInKXx8KExBMjFfMD49J1x1MDAwQicgJiYgTEEyMV8wPD0nXGYnKXx8KExBMjFfMD49J1x1MDAwRScgJiYgTEEyMV8wPD0nXHUwMDFGJyl8fExBMjFfMD09J1xcJ3x8TEEyMV8wPT0nYCd8fChMQTIxXzA+PSd+JyAmJiBMQTIxXzA8PSdcdUZGRkYnKSkgKSB7cyA9IDYwO30KKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKCAoKExBMjFfMD49J1x0JyAmJiBMQTIxXzA8PSdcbicpfHxMQTIxXzA9PSdccid8fExBMjFfMD09JyAnKSApIHtzID0gNjA7fQorCisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICggKChMQTIxXzA+PSdcdTAwMDAnICYmIExBMjFfMDw9J1xiJyl8fChMQTIxXzA+PSdcdTAwMEInICYmIExBMjFfMDw9J1xmJyl8fChMQTIxXzA+PSdcdTAwMEUnICYmIExBMjFfMDw9J1x1MDAxRicpfHxMQTIxXzA9PSdcXCd8fExBMjFfMD09J2AnfHwoTEEyMV8wPj0nficgJiYgTEEyMV8wPD0nXHVGRkZGJykpICkge3MgPSA2MTt9CiAKICAgICAgICAgICAgICAgICAgICAgICAgIGlmICggcz49MCApIHJldHVybiBzOwogICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmRhdGFpbnRlcmNoYW5nZS5pZGUvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2RhdGFpbnRlcmNoYW5nZS9pZGUvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbERhdGFEU0xQYXJzZXIuamF2YSBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQuZGF0YWludGVyY2hhbmdlLmlkZS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvZGF0YWludGVyY2hhbmdlL2lkZS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsRGF0YURTTFBhcnNlci5qYXZhCmluZGV4IDU2NmI2MTMuLmYyZGZhMTUgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLm9zYnAueHRleHQuZGF0YWludGVyY2hhbmdlLmlkZS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvZGF0YWludGVyY2hhbmdlL2lkZS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsRGF0YURTTFBhcnNlci5qYXZhCisrKyBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQuZGF0YWludGVyY2hhbmdlLmlkZS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvZGF0YWludGVyY2hhbmdlL2lkZS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsRGF0YURTTFBhcnNlci5qYXZhCkBAIC0yNSw5ICsyNSwxMSBAQAogICogIENvcHlyaWdodCAoYykgMjAxMSwgMjAxNiAtIExvZXR6IEdtYkgmQ28uS0cgKDY5MTE1IEhlaWRlbGJlcmcsIEdlcm1hbnkpIAogICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgKiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAgICAgICAgICAgCi0gKiAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wICAgICAgIAorICogIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgMi4wICAgICAgICAKICAqICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAgICAgICAgICAgICAgICAgIAotICogIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKiAgaHR0cHM6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKiAgU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICogIENvbnRyaWJ1dG9yczogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAqIAkgICBDaHJpc3RvcGhlIExvZXR6IChMb2V0eiBHbWJIJkNvLktHKSAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KQEAgLTM4LDcgKzQwLDcgQEAKIEBTdXBwcmVzc1dhcm5pbmdzKCJhbGwiKQogcHVibGljIGNsYXNzIEludGVybmFsRGF0YURTTFBhcnNlciBleHRlbmRzIEFic3RyYWN0SW50ZXJuYWxDb250ZW50QXNzaXN0UGFyc2VyIHsKICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZ1tdIHRva2VuTmFtZXMgPSBuZXcgU3RyaW5nW10gewotICAgICAgICAiPGludmFsaWQ+IiwgIjxFT1I+IiwgIjxET1dOPiIsICI8VVA+IiwgIlJVTEVfU1RSSU5HIiwgIlJVTEVfSUQiLCAiUlVMRV9IRVgiLCAiUlVMRV9JTlQiLCAiUlVMRV9ERUNJTUFMIiwgIlJVTEVfTUxfQ09NTUVOVCIsICJSVUxFX1NMX0NPTU1FTlQiLCAiUlVMRV9XUyIsICJSVUxFX0FOWV9PVEhFUiIsICInPSciLCAiJ3x8JyIsICInJiYnIiwgIicrPSciLCAiJy09JyIsICInKj0nIiwgIicvPSciLCAiJyU9JyIsICInPT0nIiwgIichPSciLCAiJz09PSciLCAiJyE9PSciLCAiJz49JyIsICInPiciLCAiJzwnIiwgIictPiciLCAiJy4uPCciLCAiJy4uJyIsICInPT4nIiwgIic8PiciLCAiJz86JyIsICInKyciLCAiJy0nIiwgIicqJyIsICInKionIiwgIicvJyIsICInJSciLCAiJyEnIiwgIicrKyciLCAiJy0tJyIsICInLiciLCAiJ3ZhbCciLCAiJ2V4dGVuZHMnIiwgIidzdGF0aWMnIiwgIidpbXBvcnQnIiwgIidleHRlbnNpb24nIiwgIidzdXBlciciLCAiJ2ZhbHNlJyIsICIncGxhaW4nIiwgIidqcGcnIiwgIidwbmcnIiwgIidtcGVnJyIsICInb2N0ZXQtc3RyZWFtJyIsICIncGRmJyIsICInTm93RGF0ZSciLCAiJ1N0YXJ0RGF0ZSciLCAiJ1VuaXZlcnNhbGx5VW5pcXVlSWRlbnRpZmllciciLCAiJ0RhdGUnIiwgIidNaWxsaXNlY29uZHMnIiwgIidOYW5vc2Vjb25kcyciLCAiJ1JhbmRvbSciLCAiJ0V4ZWN1dGVDb250ZXh0JyIsICIncGVyc2lzdCciLCAiJ21lcmdlJyIsICIncmVtb3ZlJyIsICIncGFja2FnZSciLCAiJ3RpdGxlJyIsICIneyciLCAiJ30nIiwgIidpbnRlcmNoYW5nZSciLCAiJ2ZpbGUnIiwgIidwYXRoJyIsICIndmVjdG9yTmFtZSciLCAiJ2VsZW1lbnRTaXplJyIsICInWE1MJyIsICInZW5jb2RpbmcnIiwgIidsb2NhbGUnIiwgIidDU1YnIiwgIidkZWxpbWl0ZXInIiwgIidxdW90ZUNoYXJhY3RlciciLCAiJ3NraXBMaW5lcyciLCAiJ0VESSciLCAiJ21hcHBpbmdNb2RlbCciLCAiJ2VudGl0eSciLCAiJ25vZGVOYW1lJyIsICInY3JlYXRlT24nIiwgIidleHByZXNzaW9uJyIsICInbG9va3VwJyIsICInZm9ybWF0JyIsICInbWFwcGluZyciLCAiJ2tleXMnIiwgIidrZXknIiwgIidmb3InIiwgIidvbiciLCAiJ3dpdGgnIiwgIidtYXBUbyciLCAiJ21hcmtlclBhdGgnIiwgIidtYXJrZXJFbnRpdHknIiwgIidjb2RpbmcnIiwgIidjb3B5JyIsICInZnJvbSciLCAiJ3Byb3BlcnR5JyIsICInYXNzaWduJyIsICInYXMnIiwgIidtYXAnIiwgIid0byciLCAiJ21hcEJsb2InIiwgIidtaW1lVHlwZSciLCAiJzsnIiwgIidAJyIsICInKCciLCAiJyknIiwgIicsJyIsICInXSciLCAiJyMnIiwgIidbJyIsICInaW5zdGFuY2VvZiciLCAiJ2lmJyIsICInZWxzZSciLCAiJ3N3aXRjaCciLCAiJzonIiwgIidkZWZhdWx0JyIsICInY2FzZSciLCAiJ3doaWxlJyIsICInZG8nIiwgIiduZXcnIiwgIidudWxsJyIsICIndHlwZW9mJyIsICIndGhyb3cnIiwgIidyZXR1cm4nIiwgIid0cnknIiwgIidmaW5hbGx5JyIsICInc3luY2hyb25pemVkJyIsICInY2F0Y2gnIiwgIic/JyIsICInJiciLCAiJ2Rlc2NyaWJlZEJ5JyIsICIncmVwb3J0JyIsICInbWFwQnlBdHRyaWJ1dGUnIiwgIidpbmRlbnQnIiwgIid2YWxpZGF0ZSciLCAiJ21hcmtlciciLCAiJ2NhY2hlU2l6ZSciLCAiJ2FsbG93Tm9SZXN1bHQnIiwgIidhbGxvd05vbnVuaXF1ZVJlc3VsdCciLCAiJ21hcmtlZEJ5JyIsICInbnMnIiwgIic6OiciLCAiJz8uJyIsICInfCciLCAiJ3ZhciciLCAiJ3RydWUnIgorICAgICAgICAiPGludmFsaWQ+IiwgIjxFT1I+IiwgIjxET1dOPiIsICI8VVA+IiwgIlJVTEVfU1RSSU5HIiwgIlJVTEVfSUQiLCAiUlVMRV9IRVgiLCAiUlVMRV9JTlQiLCAiUlVMRV9ERUNJTUFMIiwgIlJVTEVfTUxfQ09NTUVOVCIsICJSVUxFX1NMX0NPTU1FTlQiLCAiUlVMRV9XUyIsICJSVUxFX0FOWV9PVEhFUiIsICInPSciLCAiJ3x8JyIsICInJiYnIiwgIicrPSciLCAiJy09JyIsICInKj0nIiwgIicvPSciLCAiJyU9JyIsICInPT0nIiwgIichPSciLCAiJz09PSciLCAiJyE9PSciLCAiJz49JyIsICInPiciLCAiJzwnIiwgIictPiciLCAiJy4uPCciLCAiJy4uJyIsICInPT4nIiwgIic8PiciLCAiJz86JyIsICInKyciLCAiJy0nIiwgIicqJyIsICInKionIiwgIicvJyIsICInJSciLCAiJyEnIiwgIicrKyciLCAiJy0tJyIsICInLiciLCAiJ3ZhbCciLCAiJ2V4dGVuZHMnIiwgIidzdGF0aWMnIiwgIidpbXBvcnQnIiwgIidleHRlbnNpb24nIiwgIidzdXBlciciLCAiJ2ZhbHNlJyIsICIncGxhaW4nIiwgIidqcGcnIiwgIidwbmcnIiwgIidtcGVnJyIsICInb2N0ZXQtc3RyZWFtJyIsICIncGRmJyIsICInTm93RGF0ZSciLCAiJ1N0YXJ0RGF0ZSciLCAiJ1VuaXZlcnNhbGx5VW5pcXVlSWRlbnRpZmllciciLCAiJ0RhdGUnIiwgIidNaWxsaXNlY29uZHMnIiwgIidOYW5vc2Vjb25kcyciLCAiJ1JhbmRvbSciLCAiJ0V4ZWN1dGVDb250ZXh0JyIsICIncGVyc2lzdCciLCAiJ21lcmdlJyIsICIncmVtb3ZlJyIsICInPD0nIiwgIidpc251bGwnIiwgIidpc25vdG51bGwnIiwgIidhbmQnIiwgIidvciciLCAiJ3BhY2thZ2UnIiwgIid0aXRsZSciLCAiJ3snIiwgIid9JyIsICInaW50ZXJjaGFuZ2UnIiwgIidmaWxlJyIsICIncGF0aCciLCAiJ3ZlY3Rvck5hbWUnIiwgIidlbGVtZW50U2l6ZSciLCAiJ1hNTCciLCAiJ2VuY29kaW5nJyIsICInbG9jYWxlJyIsICInQ1NWJyIsICInZGVsaW1pdGVyJyIsICIncXVvdGVDaGFyYWN0ZXInIiwgIidza2lwTGluZXMnIiwgIidFREknIiwgIidtYXBwaW5nTW9kZWwnIiwgIidlbnRpdHknIiwgIidub2RlTmFtZSciLCAiJ2NyZWF0ZU9uJyIsICInZXhwcmVzc2lvbiciLCAiJ2xvb2t1cCciLCAiJ2Zvcm1hdCciLCAiJ2V4cG9zZSciLCAiJ21hcHBpbmcnIiwgIidrZXlzJyIsICInZXhwb3J0RmlsdGVyJyIsICIna2V5JyIsICInZm9yJyIsICInb24nIiwgIid3aXRoJyIsICInbWFwVG8nIiwgIidtYXJrZXJQYXRoJyIsICInbWFya2VyRW50aXR5JyIsICInY29kaW5nJyIsICInY29weSciLCAiJ2Zyb20nIiwgIidwcm9wZXJ0eSciLCAiJ3JlZiciLCAiJ3doZXJlJyIsICInaGlkZSciLCAiJ2Fzc2lnbiciLCAiJ2FzJyIsICInbWFwJyIsICIndG8nIiwgIidtYXBCbG9iJyIsICInbWltZVR5cGUnIiwgIic7JyIsICInQCciLCAiJygnIiwgIicpJyIsICInLCciLCAiJ10nIiwgIicjJyIsICInWyciLCAiJ2luc3RhbmNlb2YnIiwgIidpZiciLCAiJ2Vsc2UnIiwgIidzd2l0Y2gnIiwgIic6JyIsICInZGVmYXVsdCciLCAiJ2Nhc2UnIiwgIid3aGlsZSciLCAiJ2RvJyIsICInbmV3JyIsICInbnVsbCciLCAiJ3R5cGVvZiciLCAiJ3Rocm93JyIsICIncmV0dXJuJyIsICIndHJ5JyIsICInZmluYWxseSciLCAiJ3N5bmNocm9uaXplZCciLCAiJ2NhdGNoJyIsICInPyciLCAiJyYnIiwgIidkZXNjcmliZWRCeSciLCAiJ3JlcG9ydCciLCAiJ2RlbGV0ZUZpbGVBZnRlckltcG9ydCciLCAiJ21hcEJ5QXR0cmlidXRlJyIsICInaW5kZW50JyIsICIndmFsaWRhdGUnIiwgIidsYXRlc3RJbXBvcnQnIiwgIidsYXRlc3RFeHBvcnQnIiwgIidjYWNoZVNpemUnIiwgIidhbGxvd05vUmVzdWx0JyIsICInYWxsb3dOb251bmlxdWVSZXN1bHQnIiwgIidtYXJrZWRCeSciLCAiJ25zJyIsICInOjonIiwgIic/LiciLCAiJ3wnIiwgIid2YXInIiwgIid0cnVlJyIKICAgICB9OwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzE0ND0xNDQ7CiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fMTQzPTE0MzsKQEAgLTg2LDYgKzg4LDEzIEBACiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fMTI4PTEyODsKICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX182NT02NTsKICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX18xMjc9MTI3OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzE2Nj0xNjY7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fMTY1PTE2NTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX18xNjI9MTYyOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzE2MT0xNjE7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fMTY0PTE2NDsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX18xNjM9MTYzOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzE2MD0xNjA7CiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fMzc9Mzc7CiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fMzg9Mzg7CiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fMzk9Mzk7CkBAIC05MywxMCArMTAyLDE1IEBACiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fMzQ9MzQ7CiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fMzU9MzU7CiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fMzY9MzY7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fMTU5PTE1OTsKICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX18zMD0zMDsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX18xNTg9MTU4OwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzMxPTMxOwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzMyPTMyOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzE1NT0xNTU7CiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fMTU0PTE1NDsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX18xNTc9MTU3OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzE1Nj0xNTY7CiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fMTUxPTE1MTsKICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX18xNTA9MTUwOwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzE1Mz0xNTM7CkBAIC0xNTAzLDEyICsxNTE3LDM1MiBAQAogICAgIC8vICRBTlRMUiBlbmQgInJ1bGVEYXRhSW50ZXJjaGFuZ2VFbnRpdHlFeHByZXNzaW9uIgogCiAKKyAgICAvLyAkQU5UTFIgc3RhcnQgImVudHJ5UnVsZURhdGFJbnRlcmNoYW5nZUV4cG9zZSIKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo0NDI6MTogZW50cnlSdWxlRGF0YUludGVyY2hhbmdlRXhwb3NlIDogcnVsZURhdGFJbnRlcmNoYW5nZUV4cG9zZSBFT0YgOworICAgIHB1YmxpYyBmaW5hbCB2b2lkIGVudHJ5UnVsZURhdGFJbnRlcmNoYW5nZUV4cG9zZSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo0NDM6MTogKCBydWxlRGF0YUludGVyY2hhbmdlRXhwb3NlIEVPRiApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo0NDQ6MTogcnVsZURhdGFJbnRlcmNoYW5nZUV4cG9zZSBFT0YKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YUludGVyY2hhbmdlRXhwb3NlUnVsZSgpKTsgCisgICAgICAgICAgICB9CisgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV18xKTsKKyAgICAgICAgICAgIHJ1bGVEYXRhSW50ZXJjaGFuZ2VFeHBvc2UoKTsKKworICAgICAgICAgICAgc3RhdGUuX2ZzcC0tOworICAgICAgICAgICAgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXREYXRhSW50ZXJjaGFuZ2VFeHBvc2VSdWxlKCkpOyAKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1hdGNoKGlucHV0LEVPRixGT0xMT1dfMik7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CisKKyAgICAgICAgICAgIH0KKworICAgICAgICB9CisgICAgICAgIGNhdGNoIChSZWNvZ25pdGlvbkV4Y2VwdGlvbiByZSkgeworICAgICAgICAgICAgcmVwb3J0RXJyb3IocmUpOworICAgICAgICAgICAgcmVjb3ZlcihpbnB1dCxyZSk7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIDsKKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAiZW50cnlSdWxlRGF0YUludGVyY2hhbmdlRXhwb3NlIgorCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVEYXRhSW50ZXJjaGFuZ2VFeHBvc2UiCisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NDUxOjE6IHJ1bGVEYXRhSW50ZXJjaGFuZ2VFeHBvc2UgOiAoICggcnVsZV9fRGF0YUludGVyY2hhbmdlRXhwb3NlX19Hcm91cF9fMCApICkgOworICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVEYXRhSW50ZXJjaGFuZ2VFeHBvc2UoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworCisgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICAgICAgCQorICAgICAgICB0cnkgeworICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NDU1OjI6ICggKCAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUV4cG9zZV9fR3JvdXBfXzAgKSApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjQ1NjoyOiAoICggcnVsZV9fRGF0YUludGVyY2hhbmdlRXhwb3NlX19Hcm91cF9fMCApICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjQ1NjoyOiAoICggcnVsZV9fRGF0YUludGVyY2hhbmdlRXhwb3NlX19Hcm91cF9fMCApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjQ1NzozOiAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUV4cG9zZV9fR3JvdXBfXzAgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXREYXRhSW50ZXJjaGFuZ2VFeHBvc2VBY2Nlc3MoKS5nZXRHcm91cCgpKTsgCisgICAgICAgICAgICB9CisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo0NTg6MzogKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VFeHBvc2VfX0dyb3VwX18wICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjQ1ODo0OiBydWxlX19EYXRhSW50ZXJjaGFuZ2VFeHBvc2VfX0dyb3VwX18wCisgICAgICAgICAgICB7CisgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV18yKTsKKyAgICAgICAgICAgIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUV4cG9zZV9fR3JvdXBfXzAoKTsKKworICAgICAgICAgICAgc3RhdGUuX2ZzcC0tOworICAgICAgICAgICAgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YUludGVyY2hhbmdlRXhwb3NlQWNjZXNzKCkuZ2V0R3JvdXAoKSk7IAorICAgICAgICAgICAgfQorCisgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgfQorCisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKFJlY29nbml0aW9uRXhjZXB0aW9uIHJlKSB7CisgICAgICAgICAgICByZXBvcnRFcnJvcihyZSk7CisgICAgICAgICAgICByZWNvdmVyKGlucHV0LHJlKTsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKworICAgICAgICAgICAgCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKKworICAgICAgICB9CisgICAgICAgIHJldHVybiA7CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgInJ1bGVEYXRhSW50ZXJjaGFuZ2VFeHBvc2UiCisKKworICAgIC8vICRBTlRMUiBzdGFydCAiZW50cnlSdWxlRGF0YUludGVyY2hhbmdlRXhwb3J0RmlsdGVyIgorICAgIC8vIEludGVybmFsRGF0YURTTC5nOjQ2NzoxOiBlbnRyeVJ1bGVEYXRhSW50ZXJjaGFuZ2VFeHBvcnRGaWx0ZXIgOiBydWxlRGF0YUludGVyY2hhbmdlRXhwb3J0RmlsdGVyIEVPRiA7CisgICAgcHVibGljIGZpbmFsIHZvaWQgZW50cnlSdWxlRGF0YUludGVyY2hhbmdlRXhwb3J0RmlsdGVyKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjQ2ODoxOiAoIHJ1bGVEYXRhSW50ZXJjaGFuZ2VFeHBvcnRGaWx0ZXIgRU9GICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjQ2OToxOiBydWxlRGF0YUludGVyY2hhbmdlRXhwb3J0RmlsdGVyIEVPRgorICAgICAgICAgICAgeworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXREYXRhSW50ZXJjaGFuZ2VFeHBvcnRGaWx0ZXJSdWxlKCkpOyAKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzEpOworICAgICAgICAgICAgcnVsZURhdGFJbnRlcmNoYW5nZUV4cG9ydEZpbHRlcigpOworCisgICAgICAgICAgICBzdGF0ZS5fZnNwLS07CisgICAgICAgICAgICBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBhZnRlcihncmFtbWFyQWNjZXNzLmdldERhdGFJbnRlcmNoYW5nZUV4cG9ydEZpbHRlclJ1bGUoKSk7IAorICAgICAgICAgICAgfQorICAgICAgICAgICAgbWF0Y2goaW5wdXQsRU9GLEZPTExPV18yKTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKKworICAgICAgICAgICAgfQorCisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKFJlY29nbml0aW9uRXhjZXB0aW9uIHJlKSB7CisgICAgICAgICAgICByZXBvcnRFcnJvcihyZSk7CisgICAgICAgICAgICByZWNvdmVyKGlucHV0LHJlKTsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gOworICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJlbnRyeVJ1bGVEYXRhSW50ZXJjaGFuZ2VFeHBvcnRGaWx0ZXIiCisKKworICAgIC8vICRBTlRMUiBzdGFydCAicnVsZURhdGFJbnRlcmNoYW5nZUV4cG9ydEZpbHRlciIKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo0NzY6MTogcnVsZURhdGFJbnRlcmNoYW5nZUV4cG9ydEZpbHRlciA6ICggKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VFeHBvcnRGaWx0ZXJfX0dyb3VwX18wICkgKSA7CisgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZURhdGFJbnRlcmNoYW5nZUV4cG9ydEZpbHRlcigpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisKKyAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgICAgICAJCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo0ODA6MjogKCAoICggcnVsZV9fRGF0YUludGVyY2hhbmdlRXhwb3J0RmlsdGVyX19Hcm91cF9fMCApICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NDgxOjI6ICggKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VFeHBvcnRGaWx0ZXJfX0dyb3VwX18wICkgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NDgxOjI6ICggKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VFeHBvcnRGaWx0ZXJfX0dyb3VwX18wICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NDgyOjM6ICggcnVsZV9fRGF0YUludGVyY2hhbmdlRXhwb3J0RmlsdGVyX19Hcm91cF9fMCApCisgICAgICAgICAgICB7CisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldERhdGFJbnRlcmNoYW5nZUV4cG9ydEZpbHRlckFjY2VzcygpLmdldEdyb3VwKCkpOyAKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjQ4MzozOiAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUV4cG9ydEZpbHRlcl9fR3JvdXBfXzAgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NDgzOjQ6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUV4cG9ydEZpbHRlcl9fR3JvdXBfXzAKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzIpOworICAgICAgICAgICAgcnVsZV9fRGF0YUludGVyY2hhbmdlRXhwb3J0RmlsdGVyX19Hcm91cF9fMCgpOworCisgICAgICAgICAgICBzdGF0ZS5fZnNwLS07CisgICAgICAgICAgICBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXREYXRhSW50ZXJjaGFuZ2VFeHBvcnRGaWx0ZXJBY2Nlc3MoKS5nZXRHcm91cCgpKTsgCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICB9CisKKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoUmVjb2duaXRpb25FeGNlcHRpb24gcmUpIHsKKyAgICAgICAgICAgIHJlcG9ydEVycm9yKHJlKTsKKyAgICAgICAgICAgIHJlY292ZXIoaW5wdXQscmUpOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworCisgICAgICAgICAgICAJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworCisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIDsKKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAicnVsZURhdGFJbnRlcmNoYW5nZUV4cG9ydEZpbHRlciIKKworCisgICAgLy8gJEFOVExSIHN0YXJ0ICJlbnRyeVJ1bGVEYXRhSW50ZXJjaGFuZ2VGaWx0ZXJDb25kaXRpb24iCisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NDkyOjE6IGVudHJ5UnVsZURhdGFJbnRlcmNoYW5nZUZpbHRlckNvbmRpdGlvbiA6IHJ1bGVEYXRhSW50ZXJjaGFuZ2VGaWx0ZXJDb25kaXRpb24gRU9GIDsKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBlbnRyeVJ1bGVEYXRhSW50ZXJjaGFuZ2VGaWx0ZXJDb25kaXRpb24oKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NDkzOjE6ICggcnVsZURhdGFJbnRlcmNoYW5nZUZpbHRlckNvbmRpdGlvbiBFT0YgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NDk0OjE6IHJ1bGVEYXRhSW50ZXJjaGFuZ2VGaWx0ZXJDb25kaXRpb24gRU9GCisgICAgICAgICAgICB7CisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldERhdGFJbnRlcmNoYW5nZUZpbHRlckNvbmRpdGlvblJ1bGUoKSk7IAorICAgICAgICAgICAgfQorICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMSk7CisgICAgICAgICAgICBydWxlRGF0YUludGVyY2hhbmdlRmlsdGVyQ29uZGl0aW9uKCk7CisKKyAgICAgICAgICAgIHN0YXRlLl9mc3AtLTsKKyAgICAgICAgICAgIGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YUludGVyY2hhbmdlRmlsdGVyQ29uZGl0aW9uUnVsZSgpKTsgCisgICAgICAgICAgICB9CisgICAgICAgICAgICBtYXRjaChpbnB1dCxFT0YsRk9MTE9XXzIpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOworCisgICAgICAgICAgICB9CisKKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoUmVjb2duaXRpb25FeGNlcHRpb24gcmUpIHsKKyAgICAgICAgICAgIHJlcG9ydEVycm9yKHJlKTsKKyAgICAgICAgICAgIHJlY292ZXIoaW5wdXQscmUpOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgICAgIHJldHVybiA7CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgImVudHJ5UnVsZURhdGFJbnRlcmNoYW5nZUZpbHRlckNvbmRpdGlvbiIKKworCisgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlRGF0YUludGVyY2hhbmdlRmlsdGVyQ29uZGl0aW9uIgorICAgIC8vIEludGVybmFsRGF0YURTTC5nOjUwMToxOiBydWxlRGF0YUludGVyY2hhbmdlRmlsdGVyQ29uZGl0aW9uIDogKCAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbHRlckNvbmRpdGlvbl9fR3JvdXBfXzAgKSApIDsKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlRGF0YUludGVyY2hhbmdlRmlsdGVyQ29uZGl0aW9uKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKworICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgICAgIAkKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjUwNToyOiAoICggKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VGaWx0ZXJDb25kaXRpb25fX0dyb3VwX18wICkgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo1MDY6MjogKCAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbHRlckNvbmRpdGlvbl9fR3JvdXBfXzAgKSApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo1MDY6MjogKCAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbHRlckNvbmRpdGlvbl9fR3JvdXBfXzAgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo1MDc6MzogKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VGaWx0ZXJDb25kaXRpb25fX0dyb3VwX18wICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YUludGVyY2hhbmdlRmlsdGVyQ29uZGl0aW9uQWNjZXNzKCkuZ2V0R3JvdXAoKSk7IAorICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NTA4OjM6ICggcnVsZV9fRGF0YUludGVyY2hhbmdlRmlsdGVyQ29uZGl0aW9uX19Hcm91cF9fMCApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo1MDg6NDogcnVsZV9fRGF0YUludGVyY2hhbmdlRmlsdGVyQ29uZGl0aW9uX19Hcm91cF9fMAorICAgICAgICAgICAgeworICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMik7CisgICAgICAgICAgICBydWxlX19EYXRhSW50ZXJjaGFuZ2VGaWx0ZXJDb25kaXRpb25fX0dyb3VwX18wKCk7CisKKyAgICAgICAgICAgIHN0YXRlLl9mc3AtLTsKKyAgICAgICAgICAgIGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBhZnRlcihncmFtbWFyQWNjZXNzLmdldERhdGFJbnRlcmNoYW5nZUZpbHRlckNvbmRpdGlvbkFjY2VzcygpLmdldEdyb3VwKCkpOyAKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgIH0KKworICAgICAgICB9CisgICAgICAgIGNhdGNoIChSZWNvZ25pdGlvbkV4Y2VwdGlvbiByZSkgeworICAgICAgICAgICAgcmVwb3J0RXJyb3IocmUpOworICAgICAgICAgICAgcmVjb3ZlcihpbnB1dCxyZSk7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisKKyAgICAgICAgICAgIAlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7CisKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gOworICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJydWxlRGF0YUludGVyY2hhbmdlRmlsdGVyQ29uZGl0aW9uIgorCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgImVudHJ5UnVsZURhdGFJbnRlcmNoYW5nZUV4cG9ydEhpZGUiCisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NTE3OjE6IGVudHJ5UnVsZURhdGFJbnRlcmNoYW5nZUV4cG9ydEhpZGUgOiBydWxlRGF0YUludGVyY2hhbmdlRXhwb3J0SGlkZSBFT0YgOworICAgIHB1YmxpYyBmaW5hbCB2b2lkIGVudHJ5UnVsZURhdGFJbnRlcmNoYW5nZUV4cG9ydEhpZGUoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NTE4OjE6ICggcnVsZURhdGFJbnRlcmNoYW5nZUV4cG9ydEhpZGUgRU9GICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjUxOToxOiBydWxlRGF0YUludGVyY2hhbmdlRXhwb3J0SGlkZSBFT0YKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YUludGVyY2hhbmdlRXhwb3J0SGlkZVJ1bGUoKSk7IAorICAgICAgICAgICAgfQorICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMSk7CisgICAgICAgICAgICBydWxlRGF0YUludGVyY2hhbmdlRXhwb3J0SGlkZSgpOworCisgICAgICAgICAgICBzdGF0ZS5fZnNwLS07CisgICAgICAgICAgICBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBhZnRlcihncmFtbWFyQWNjZXNzLmdldERhdGFJbnRlcmNoYW5nZUV4cG9ydEhpZGVSdWxlKCkpOyAKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1hdGNoKGlucHV0LEVPRixGT0xMT1dfMik7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CisKKyAgICAgICAgICAgIH0KKworICAgICAgICB9CisgICAgICAgIGNhdGNoIChSZWNvZ25pdGlvbkV4Y2VwdGlvbiByZSkgeworICAgICAgICAgICAgcmVwb3J0RXJyb3IocmUpOworICAgICAgICAgICAgcmVjb3ZlcihpbnB1dCxyZSk7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIDsKKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAiZW50cnlSdWxlRGF0YUludGVyY2hhbmdlRXhwb3J0SGlkZSIKKworCisgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlRGF0YUludGVyY2hhbmdlRXhwb3J0SGlkZSIKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo1MjY6MTogcnVsZURhdGFJbnRlcmNoYW5nZUV4cG9ydEhpZGUgOiAoICggcnVsZV9fRGF0YUludGVyY2hhbmdlRXhwb3J0SGlkZV9fR3JvdXBfXzAgKSApIDsKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlRGF0YUludGVyY2hhbmdlRXhwb3J0SGlkZSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisKKyAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgICAgICAJCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo1MzA6MjogKCAoICggcnVsZV9fRGF0YUludGVyY2hhbmdlRXhwb3J0SGlkZV9fR3JvdXBfXzAgKSApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjUzMToyOiAoICggcnVsZV9fRGF0YUludGVyY2hhbmdlRXhwb3J0SGlkZV9fR3JvdXBfXzAgKSApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo1MzE6MjogKCAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUV4cG9ydEhpZGVfX0dyb3VwX18wICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NTMyOjM6ICggcnVsZV9fRGF0YUludGVyY2hhbmdlRXhwb3J0SGlkZV9fR3JvdXBfXzAgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXREYXRhSW50ZXJjaGFuZ2VFeHBvcnRIaWRlQWNjZXNzKCkuZ2V0R3JvdXAoKSk7IAorICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NTMzOjM6ICggcnVsZV9fRGF0YUludGVyY2hhbmdlRXhwb3J0SGlkZV9fR3JvdXBfXzAgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NTMzOjQ6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUV4cG9ydEhpZGVfX0dyb3VwX18wCisgICAgICAgICAgICB7CisgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV18yKTsKKyAgICAgICAgICAgIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUV4cG9ydEhpZGVfX0dyb3VwX18wKCk7CisKKyAgICAgICAgICAgIHN0YXRlLl9mc3AtLTsKKyAgICAgICAgICAgIGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBhZnRlcihncmFtbWFyQWNjZXNzLmdldERhdGFJbnRlcmNoYW5nZUV4cG9ydEhpZGVBY2Nlc3MoKS5nZXRHcm91cCgpKTsgCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICB9CisKKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoUmVjb2duaXRpb25FeGNlcHRpb24gcmUpIHsKKyAgICAgICAgICAgIHJlcG9ydEVycm9yKHJlKTsKKyAgICAgICAgICAgIHJlY292ZXIoaW5wdXQscmUpOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworCisgICAgICAgICAgICAJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworCisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIDsKKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAicnVsZURhdGFJbnRlcmNoYW5nZUV4cG9ydEhpZGUiCisKKwogICAgIC8vICRBTlRMUiBzdGFydCAiZW50cnlSdWxlRGF0YUludGVyY2hhbmdlUHJlZGVmaW5lZEV4cHJlc3Npb24iCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NDQyOjE6IGVudHJ5UnVsZURhdGFJbnRlcmNoYW5nZVByZWRlZmluZWRFeHByZXNzaW9uIDogcnVsZURhdGFJbnRlcmNoYW5nZVByZWRlZmluZWRFeHByZXNzaW9uIEVPRiA7CisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NTQyOjE6IGVudHJ5UnVsZURhdGFJbnRlcmNoYW5nZVByZWRlZmluZWRFeHByZXNzaW9uIDogcnVsZURhdGFJbnRlcmNoYW5nZVByZWRlZmluZWRFeHByZXNzaW9uIEVPRiA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgZW50cnlSdWxlRGF0YUludGVyY2hhbmdlUHJlZGVmaW5lZEV4cHJlc3Npb24oKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NDQzOjE6ICggcnVsZURhdGFJbnRlcmNoYW5nZVByZWRlZmluZWRFeHByZXNzaW9uIEVPRiApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo0NDQ6MTogcnVsZURhdGFJbnRlcmNoYW5nZVByZWRlZmluZWRFeHByZXNzaW9uIEVPRgorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NTQzOjE6ICggcnVsZURhdGFJbnRlcmNoYW5nZVByZWRlZmluZWRFeHByZXNzaW9uIEVPRiApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo1NDQ6MTogcnVsZURhdGFJbnRlcmNoYW5nZVByZWRlZmluZWRFeHByZXNzaW9uIEVPRgogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXREYXRhSW50ZXJjaGFuZ2VQcmVkZWZpbmVkRXhwcmVzc2lvblJ1bGUoKSk7IApAQCAtMTUzOCwyMyArMTg5MiwyMyBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVEYXRhSW50ZXJjaGFuZ2VQcmVkZWZpbmVkRXhwcmVzc2lvbiIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo0NTE6MTogcnVsZURhdGFJbnRlcmNoYW5nZVByZWRlZmluZWRFeHByZXNzaW9uIDogKCAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZVByZWRlZmluZWRFeHByZXNzaW9uX19Hcm91cF9fMCApICkgOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjU1MToxOiBydWxlRGF0YUludGVyY2hhbmdlUHJlZGVmaW5lZEV4cHJlc3Npb24gOiAoICggcnVsZV9fRGF0YUludGVyY2hhbmdlUHJlZGVmaW5lZEV4cHJlc3Npb25fX0dyb3VwX18wICkgKSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZURhdGFJbnRlcmNoYW5nZVByZWRlZmluZWRFeHByZXNzaW9uKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjQ1NToyOiAoICggKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VQcmVkZWZpbmVkRXhwcmVzc2lvbl9fR3JvdXBfXzAgKSApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjQ1NjoyOiAoICggcnVsZV9fRGF0YUludGVyY2hhbmdlUHJlZGVmaW5lZEV4cHJlc3Npb25fX0dyb3VwX18wICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NTU1OjI6ICggKCAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZVByZWRlZmluZWRFeHByZXNzaW9uX19Hcm91cF9fMCApICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NTU2OjI6ICggKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VQcmVkZWZpbmVkRXhwcmVzc2lvbl9fR3JvdXBfXzAgKSApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo0NTY6MjogKCAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZVByZWRlZmluZWRFeHByZXNzaW9uX19Hcm91cF9fMCApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjQ1NzozOiAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZVByZWRlZmluZWRFeHByZXNzaW9uX19Hcm91cF9fMCApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo1NTY6MjogKCAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZVByZWRlZmluZWRFeHByZXNzaW9uX19Hcm91cF9fMCApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjU1NzozOiAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZVByZWRlZmluZWRFeHByZXNzaW9uX19Hcm91cF9fMCApCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldERhdGFJbnRlcmNoYW5nZVByZWRlZmluZWRFeHByZXNzaW9uQWNjZXNzKCkuZ2V0R3JvdXAoKSk7IAogICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NDU4OjM6ICggcnVsZV9fRGF0YUludGVyY2hhbmdlUHJlZGVmaW5lZEV4cHJlc3Npb25fX0dyb3VwX18wICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjQ1ODo0OiBydWxlX19EYXRhSW50ZXJjaGFuZ2VQcmVkZWZpbmVkRXhwcmVzc2lvbl9fR3JvdXBfXzAKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjU1ODozOiAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZVByZWRlZmluZWRFeHByZXNzaW9uX19Hcm91cF9fMCApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo1NTg6NDogcnVsZV9fRGF0YUludGVyY2hhbmdlUHJlZGVmaW5lZEV4cHJlc3Npb25fX0dyb3VwX18wCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV18yKTsKICAgICAgICAgICAgIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZVByZWRlZmluZWRFeHByZXNzaW9uX19Hcm91cF9fMCgpOwpAQCAtMTU4OSwxMSArMTk0MywxMSBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgImVudHJ5UnVsZURhdGFJbnRlcmNoYW5nZU1hcHBpbmciCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NDY3OjE6IGVudHJ5UnVsZURhdGFJbnRlcmNoYW5nZU1hcHBpbmcgOiBydWxlRGF0YUludGVyY2hhbmdlTWFwcGluZyBFT0YgOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjU2NzoxOiBlbnRyeVJ1bGVEYXRhSW50ZXJjaGFuZ2VNYXBwaW5nIDogcnVsZURhdGFJbnRlcmNoYW5nZU1hcHBpbmcgRU9GIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBlbnRyeVJ1bGVEYXRhSW50ZXJjaGFuZ2VNYXBwaW5nKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjQ2ODoxOiAoIHJ1bGVEYXRhSW50ZXJjaGFuZ2VNYXBwaW5nIEVPRiApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo0Njk6MTogcnVsZURhdGFJbnRlcmNoYW5nZU1hcHBpbmcgRU9GCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo1Njg6MTogKCBydWxlRGF0YUludGVyY2hhbmdlTWFwcGluZyBFT0YgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NTY5OjE6IHJ1bGVEYXRhSW50ZXJjaGFuZ2VNYXBwaW5nIEVPRgogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXREYXRhSW50ZXJjaGFuZ2VNYXBwaW5nUnVsZSgpKTsgCkBAIC0xNjIzLDIzICsxOTc3LDIzIEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZURhdGFJbnRlcmNoYW5nZU1hcHBpbmciCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NDc2OjE6IHJ1bGVEYXRhSW50ZXJjaGFuZ2VNYXBwaW5nIDogKCAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZU1hcHBpbmdfX0FsdGVybmF0aXZlcyApICkgOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjU3NjoxOiBydWxlRGF0YUludGVyY2hhbmdlTWFwcGluZyA6ICggKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VNYXBwaW5nX19BbHRlcm5hdGl2ZXMgKSApIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlRGF0YUludGVyY2hhbmdlTWFwcGluZygpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo0ODA6MjogKCAoICggcnVsZV9fRGF0YUludGVyY2hhbmdlTWFwcGluZ19fQWx0ZXJuYXRpdmVzICkgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo0ODE6MjogKCAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZU1hcHBpbmdfX0FsdGVybmF0aXZlcyApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjU4MDoyOiAoICggKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VNYXBwaW5nX19BbHRlcm5hdGl2ZXMgKSApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjU4MToyOiAoICggcnVsZV9fRGF0YUludGVyY2hhbmdlTWFwcGluZ19fQWx0ZXJuYXRpdmVzICkgKQogICAgICAgICAgICAgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NDgxOjI6ICggKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VNYXBwaW5nX19BbHRlcm5hdGl2ZXMgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo0ODI6MzogKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VNYXBwaW5nX19BbHRlcm5hdGl2ZXMgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NTgxOjI6ICggKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VNYXBwaW5nX19BbHRlcm5hdGl2ZXMgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo1ODI6MzogKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VNYXBwaW5nX19BbHRlcm5hdGl2ZXMgKQogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXREYXRhSW50ZXJjaGFuZ2VNYXBwaW5nQWNjZXNzKCkuZ2V0QWx0ZXJuYXRpdmVzKCkpOyAKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjQ4MzozOiAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZU1hcHBpbmdfX0FsdGVybmF0aXZlcyApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo0ODM6NDogcnVsZV9fRGF0YUludGVyY2hhbmdlTWFwcGluZ19fQWx0ZXJuYXRpdmVzCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo1ODM6MzogKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VNYXBwaW5nX19BbHRlcm5hdGl2ZXMgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NTgzOjQ6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZU1hcHBpbmdfX0FsdGVybmF0aXZlcwogICAgICAgICAgICAgewogICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMik7CiAgICAgICAgICAgICBydWxlX19EYXRhSW50ZXJjaGFuZ2VNYXBwaW5nX19BbHRlcm5hdGl2ZXMoKTsKQEAgLTE2NzQsMTEgKzIwMjgsMTEgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJlbnRyeVJ1bGVEYXRhSW50ZXJjaGFuZ2VWYWx1ZU1hcHBpbmciCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NDkyOjE6IGVudHJ5UnVsZURhdGFJbnRlcmNoYW5nZVZhbHVlTWFwcGluZyA6IHJ1bGVEYXRhSW50ZXJjaGFuZ2VWYWx1ZU1hcHBpbmcgRU9GIDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo1OTI6MTogZW50cnlSdWxlRGF0YUludGVyY2hhbmdlVmFsdWVNYXBwaW5nIDogcnVsZURhdGFJbnRlcmNoYW5nZVZhbHVlTWFwcGluZyBFT0YgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIGVudHJ5UnVsZURhdGFJbnRlcmNoYW5nZVZhbHVlTWFwcGluZygpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo0OTM6MTogKCBydWxlRGF0YUludGVyY2hhbmdlVmFsdWVNYXBwaW5nIEVPRiApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo0OTQ6MTogcnVsZURhdGFJbnRlcmNoYW5nZVZhbHVlTWFwcGluZyBFT0YKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjU5MzoxOiAoIHJ1bGVEYXRhSW50ZXJjaGFuZ2VWYWx1ZU1hcHBpbmcgRU9GICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjU5NDoxOiBydWxlRGF0YUludGVyY2hhbmdlVmFsdWVNYXBwaW5nIEVPRgogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXREYXRhSW50ZXJjaGFuZ2VWYWx1ZU1hcHBpbmdSdWxlKCkpOyAKQEAgLTE3MDgsMjMgKzIwNjIsMjMgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlRGF0YUludGVyY2hhbmdlVmFsdWVNYXBwaW5nIgotICAgIC8vIEludGVybmFsRGF0YURTTC5nOjUwMToxOiBydWxlRGF0YUludGVyY2hhbmdlVmFsdWVNYXBwaW5nIDogKCAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZVZhbHVlTWFwcGluZ19fR3JvdXBfXzAgKSApIDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo2MDE6MTogcnVsZURhdGFJbnRlcmNoYW5nZVZhbHVlTWFwcGluZyA6ICggKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VWYWx1ZU1hcHBpbmdfX0dyb3VwX18wICkgKSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZURhdGFJbnRlcmNoYW5nZVZhbHVlTWFwcGluZygpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo1MDU6MjogKCAoICggcnVsZV9fRGF0YUludGVyY2hhbmdlVmFsdWVNYXBwaW5nX19Hcm91cF9fMCApICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NTA2OjI6ICggKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VWYWx1ZU1hcHBpbmdfX0dyb3VwX18wICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NjA1OjI6ICggKCAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZVZhbHVlTWFwcGluZ19fR3JvdXBfXzAgKSApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjYwNjoyOiAoICggcnVsZV9fRGF0YUludGVyY2hhbmdlVmFsdWVNYXBwaW5nX19Hcm91cF9fMCApICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjUwNjoyOiAoICggcnVsZV9fRGF0YUludGVyY2hhbmdlVmFsdWVNYXBwaW5nX19Hcm91cF9fMCApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjUwNzozOiAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZVZhbHVlTWFwcGluZ19fR3JvdXBfXzAgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NjA2OjI6ICggKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VWYWx1ZU1hcHBpbmdfX0dyb3VwX18wICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NjA3OjM6ICggcnVsZV9fRGF0YUludGVyY2hhbmdlVmFsdWVNYXBwaW5nX19Hcm91cF9fMCApCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldERhdGFJbnRlcmNoYW5nZVZhbHVlTWFwcGluZ0FjY2VzcygpLmdldEdyb3VwKCkpOyAKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjUwODozOiAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZVZhbHVlTWFwcGluZ19fR3JvdXBfXzAgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NTA4OjQ6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZVZhbHVlTWFwcGluZ19fR3JvdXBfXzAKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjYwODozOiAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZVZhbHVlTWFwcGluZ19fR3JvdXBfXzAgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NjA4OjQ6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZVZhbHVlTWFwcGluZ19fR3JvdXBfXzAKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzIpOwogICAgICAgICAgICAgcnVsZV9fRGF0YUludGVyY2hhbmdlVmFsdWVNYXBwaW5nX19Hcm91cF9fMCgpOwpAQCAtMTc1OSwxMSArMjExMywxMSBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgImVudHJ5UnVsZURhdGFJbnRlcmNoYW5nZUJsb2JNYXBwaW5nIgotICAgIC8vIEludGVybmFsRGF0YURTTC5nOjUxNzoxOiBlbnRyeVJ1bGVEYXRhSW50ZXJjaGFuZ2VCbG9iTWFwcGluZyA6IHJ1bGVEYXRhSW50ZXJjaGFuZ2VCbG9iTWFwcGluZyBFT0YgOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjYxNzoxOiBlbnRyeVJ1bGVEYXRhSW50ZXJjaGFuZ2VCbG9iTWFwcGluZyA6IHJ1bGVEYXRhSW50ZXJjaGFuZ2VCbG9iTWFwcGluZyBFT0YgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIGVudHJ5UnVsZURhdGFJbnRlcmNoYW5nZUJsb2JNYXBwaW5nKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjUxODoxOiAoIHJ1bGVEYXRhSW50ZXJjaGFuZ2VCbG9iTWFwcGluZyBFT0YgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NTE5OjE6IHJ1bGVEYXRhSW50ZXJjaGFuZ2VCbG9iTWFwcGluZyBFT0YKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjYxODoxOiAoIHJ1bGVEYXRhSW50ZXJjaGFuZ2VCbG9iTWFwcGluZyBFT0YgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NjE5OjE6IHJ1bGVEYXRhSW50ZXJjaGFuZ2VCbG9iTWFwcGluZyBFT0YKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YUludGVyY2hhbmdlQmxvYk1hcHBpbmdSdWxlKCkpOyAKQEAgLTE3OTMsMjMgKzIxNDcsMjMgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlRGF0YUludGVyY2hhbmdlQmxvYk1hcHBpbmciCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NTI2OjE6IHJ1bGVEYXRhSW50ZXJjaGFuZ2VCbG9iTWFwcGluZyA6ICggKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VCbG9iTWFwcGluZ19fR3JvdXBfXzAgKSApIDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo2MjY6MTogcnVsZURhdGFJbnRlcmNoYW5nZUJsb2JNYXBwaW5nIDogKCAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUJsb2JNYXBwaW5nX19Hcm91cF9fMCApICkgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVEYXRhSW50ZXJjaGFuZ2VCbG9iTWFwcGluZygpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo1MzA6MjogKCAoICggcnVsZV9fRGF0YUludGVyY2hhbmdlQmxvYk1hcHBpbmdfX0dyb3VwX18wICkgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo1MzE6MjogKCAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUJsb2JNYXBwaW5nX19Hcm91cF9fMCApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjYzMDoyOiAoICggKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VCbG9iTWFwcGluZ19fR3JvdXBfXzAgKSApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjYzMToyOiAoICggcnVsZV9fRGF0YUludGVyY2hhbmdlQmxvYk1hcHBpbmdfX0dyb3VwX18wICkgKQogICAgICAgICAgICAgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NTMxOjI6ICggKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VCbG9iTWFwcGluZ19fR3JvdXBfXzAgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo1MzI6MzogKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VCbG9iTWFwcGluZ19fR3JvdXBfXzAgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NjMxOjI6ICggKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VCbG9iTWFwcGluZ19fR3JvdXBfXzAgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo2MzI6MzogKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VCbG9iTWFwcGluZ19fR3JvdXBfXzAgKQogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXREYXRhSW50ZXJjaGFuZ2VCbG9iTWFwcGluZ0FjY2VzcygpLmdldEdyb3VwKCkpOyAKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjUzMzozOiAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUJsb2JNYXBwaW5nX19Hcm91cF9fMCApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo1MzM6NDogcnVsZV9fRGF0YUludGVyY2hhbmdlQmxvYk1hcHBpbmdfX0dyb3VwX18wCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo2MzM6MzogKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VCbG9iTWFwcGluZ19fR3JvdXBfXzAgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NjMzOjQ6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUJsb2JNYXBwaW5nX19Hcm91cF9fMAogICAgICAgICAgICAgewogICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMik7CiAgICAgICAgICAgICBydWxlX19EYXRhSW50ZXJjaGFuZ2VCbG9iTWFwcGluZ19fR3JvdXBfXzAoKTsKQEAgLTE4NDQsMTEgKzIxOTgsMTEgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJlbnRyeVJ1bGVMRlFOIgotICAgIC8vIEludGVybmFsRGF0YURTTC5nOjU0MjoxOiBlbnRyeVJ1bGVMRlFOIDogcnVsZUxGUU4gRU9GIDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo2NDI6MTogZW50cnlSdWxlTEZRTiA6IHJ1bGVMRlFOIEVPRiA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgZW50cnlSdWxlTEZRTigpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo1NDM6MTogKCBydWxlTEZRTiBFT0YgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NTQ0OjE6IHJ1bGVMRlFOIEVPRgorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NjQzOjE6ICggcnVsZUxGUU4gRU9GICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjY0NDoxOiBydWxlTEZRTiBFT0YKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0TEZRTlJ1bGUoKSk7IApAQCAtMTg3OCwyMyArMjIzMiwyMyBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVMRlFOIgotICAgIC8vIEludGVybmFsRGF0YURTTC5nOjU1MToxOiBydWxlTEZRTiA6ICggKCBydWxlX19MRlFOX19Hcm91cF9fMCApICkgOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjY1MToxOiBydWxlTEZRTiA6ICggKCBydWxlX19MRlFOX19Hcm91cF9fMCApICkgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVMRlFOKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjU1NToyOiAoICggKCBydWxlX19MRlFOX19Hcm91cF9fMCApICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NTU2OjI6ICggKCBydWxlX19MRlFOX19Hcm91cF9fMCApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjY1NToyOiAoICggKCBydWxlX19MRlFOX19Hcm91cF9fMCApICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NjU2OjI6ICggKCBydWxlX19MRlFOX19Hcm91cF9fMCApICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjU1NjoyOiAoICggcnVsZV9fTEZRTl9fR3JvdXBfXzAgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo1NTc6MzogKCBydWxlX19MRlFOX19Hcm91cF9fMCApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo2NTY6MjogKCAoIHJ1bGVfX0xGUU5fX0dyb3VwX18wICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NjU3OjM6ICggcnVsZV9fTEZRTl9fR3JvdXBfXzAgKQogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRMRlFOQWNjZXNzKCkuZ2V0R3JvdXAoKSk7IAogICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NTU4OjM6ICggcnVsZV9fTEZRTl9fR3JvdXBfXzAgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NTU4OjQ6IHJ1bGVfX0xGUU5fX0dyb3VwX18wCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo2NTg6MzogKCBydWxlX19MRlFOX19Hcm91cF9fMCApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo2NTg6NDogcnVsZV9fTEZRTl9fR3JvdXBfXzAKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzIpOwogICAgICAgICAgICAgcnVsZV9fTEZRTl9fR3JvdXBfXzAoKTsKQEAgLTE5MjksMTEgKzIyODMsMTEgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJlbnRyeVJ1bGVUUkFOU0xBVEFCTEVTVFJJTkciCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NTY3OjE6IGVudHJ5UnVsZVRSQU5TTEFUQUJMRVNUUklORyA6IHJ1bGVUUkFOU0xBVEFCTEVTVFJJTkcgRU9GIDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo2Njc6MTogZW50cnlSdWxlVFJBTlNMQVRBQkxFU1RSSU5HIDogcnVsZVRSQU5TTEFUQUJMRVNUUklORyBFT0YgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIGVudHJ5UnVsZVRSQU5TTEFUQUJMRVNUUklORygpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo1Njg6MTogKCBydWxlVFJBTlNMQVRBQkxFU1RSSU5HIEVPRiApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo1Njk6MTogcnVsZVRSQU5TTEFUQUJMRVNUUklORyBFT0YKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjY2ODoxOiAoIHJ1bGVUUkFOU0xBVEFCTEVTVFJJTkcgRU9GICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjY2OToxOiBydWxlVFJBTlNMQVRBQkxFU1RSSU5HIEVPRgogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRUUkFOU0xBVEFCTEVTVFJJTkdSdWxlKCkpOyAKQEAgLTE5NjMsMTcgKzIzMTcsMTcgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlVFJBTlNMQVRBQkxFU1RSSU5HIgotICAgIC8vIEludGVybmFsRGF0YURTTC5nOjU3NjoxOiBydWxlVFJBTlNMQVRBQkxFU1RSSU5HIDogKCBSVUxFX1NUUklORyApIDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo2NzY6MTogcnVsZVRSQU5TTEFUQUJMRVNUUklORyA6ICggUlVMRV9TVFJJTkcgKSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZVRSQU5TTEFUQUJMRVNUUklORygpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo1ODA6MjogKCAoIFJVTEVfU1RSSU5HICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NTgxOjI6ICggUlVMRV9TVFJJTkcgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NjgwOjI6ICggKCBSVUxFX1NUUklORyApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjY4MToyOiAoIFJVTEVfU1RSSU5HICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjU4MToyOiAoIFJVTEVfU1RSSU5HICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjU4MjozOiBSVUxFX1NUUklORworICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NjgxOjI6ICggUlVMRV9TVFJJTkcgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NjgyOjM6IFJVTEVfU1RSSU5HCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFRSQU5TTEFUQUJMRVNUUklOR0FjY2VzcygpLmdldFNUUklOR1Rlcm1pbmFsUnVsZUNhbGwoKSk7IApAQCAtMjAwNCwxMSArMjM1OCwxMSBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgImVudHJ5UnVsZVRSQU5TTEFUQUJMRUlEIgotICAgIC8vIEludGVybmFsRGF0YURTTC5nOjU5MjoxOiBlbnRyeVJ1bGVUUkFOU0xBVEFCTEVJRCA6IHJ1bGVUUkFOU0xBVEFCTEVJRCBFT0YgOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjY5MjoxOiBlbnRyeVJ1bGVUUkFOU0xBVEFCTEVJRCA6IHJ1bGVUUkFOU0xBVEFCTEVJRCBFT0YgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIGVudHJ5UnVsZVRSQU5TTEFUQUJMRUlEKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjU5MzoxOiAoIHJ1bGVUUkFOU0xBVEFCTEVJRCBFT0YgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NTk0OjE6IHJ1bGVUUkFOU0xBVEFCTEVJRCBFT0YKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjY5MzoxOiAoIHJ1bGVUUkFOU0xBVEFCTEVJRCBFT0YgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6Njk0OjE6IHJ1bGVUUkFOU0xBVEFCTEVJRCBFT0YKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0VFJBTlNMQVRBQkxFSURSdWxlKCkpOyAKQEAgLTIwMzgsMTcgKzIzOTIsMTcgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlVFJBTlNMQVRBQkxFSUQiCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NjAxOjE6IHJ1bGVUUkFOU0xBVEFCTEVJRCA6ICggUlVMRV9JRCApIDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo3MDE6MTogcnVsZVRSQU5TTEFUQUJMRUlEIDogKCBSVUxFX0lEICkgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVUUkFOU0xBVEFCTEVJRCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo2MDU6MjogKCAoIFJVTEVfSUQgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo2MDY6MjogKCBSVUxFX0lEICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjcwNToyOiAoICggUlVMRV9JRCApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjcwNjoyOiAoIFJVTEVfSUQgKQogICAgICAgICAgICAgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NjA2OjI6ICggUlVMRV9JRCApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo2MDc6MzogUlVMRV9JRAorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NzA2OjI6ICggUlVMRV9JRCApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo3MDc6MzogUlVMRV9JRAogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRUUkFOU0xBVEFCTEVJREFjY2VzcygpLmdldElEVGVybWluYWxSdWxlQ2FsbCgpKTsgCkBAIC0yMDc5LDExICsyNDMzLDExIEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAiZW50cnlSdWxlWEltcG9ydERlY2xhcmF0aW9uIgotICAgIC8vIEludGVybmFsRGF0YURTTC5nOjYxNzoxOiBlbnRyeVJ1bGVYSW1wb3J0RGVjbGFyYXRpb24gOiBydWxlWEltcG9ydERlY2xhcmF0aW9uIEVPRiA7CisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NzE3OjE6IGVudHJ5UnVsZVhJbXBvcnREZWNsYXJhdGlvbiA6IHJ1bGVYSW1wb3J0RGVjbGFyYXRpb24gRU9GIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBlbnRyeVJ1bGVYSW1wb3J0RGVjbGFyYXRpb24oKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NjE4OjE6ICggcnVsZVhJbXBvcnREZWNsYXJhdGlvbiBFT0YgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NjE5OjE6IHJ1bGVYSW1wb3J0RGVjbGFyYXRpb24gRU9GCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo3MTg6MTogKCBydWxlWEltcG9ydERlY2xhcmF0aW9uIEVPRiApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo3MTk6MTogcnVsZVhJbXBvcnREZWNsYXJhdGlvbiBFT0YKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WEltcG9ydERlY2xhcmF0aW9uUnVsZSgpKTsgCkBAIC0yMTEzLDIzICsyNDY3LDIzIEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZVhJbXBvcnREZWNsYXJhdGlvbiIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo2MjY6MTogcnVsZVhJbXBvcnREZWNsYXJhdGlvbiA6ICggKCBydWxlX19YSW1wb3J0RGVjbGFyYXRpb25fX0dyb3VwX18wICkgKSA7CisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NzI2OjE6IHJ1bGVYSW1wb3J0RGVjbGFyYXRpb24gOiAoICggcnVsZV9fWEltcG9ydERlY2xhcmF0aW9uX19Hcm91cF9fMCApICkgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVYSW1wb3J0RGVjbGFyYXRpb24oKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NjMwOjI6ICggKCAoIHJ1bGVfX1hJbXBvcnREZWNsYXJhdGlvbl9fR3JvdXBfXzAgKSApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjYzMToyOiAoICggcnVsZV9fWEltcG9ydERlY2xhcmF0aW9uX19Hcm91cF9fMCApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjczMDoyOiAoICggKCBydWxlX19YSW1wb3J0RGVjbGFyYXRpb25fX0dyb3VwX18wICkgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo3MzE6MjogKCAoIHJ1bGVfX1hJbXBvcnREZWNsYXJhdGlvbl9fR3JvdXBfXzAgKSApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo2MzE6MjogKCAoIHJ1bGVfX1hJbXBvcnREZWNsYXJhdGlvbl9fR3JvdXBfXzAgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo2MzI6MzogKCBydWxlX19YSW1wb3J0RGVjbGFyYXRpb25fX0dyb3VwX18wICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjczMToyOiAoICggcnVsZV9fWEltcG9ydERlY2xhcmF0aW9uX19Hcm91cF9fMCApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjczMjozOiAoIHJ1bGVfX1hJbXBvcnREZWNsYXJhdGlvbl9fR3JvdXBfXzAgKQogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYSW1wb3J0RGVjbGFyYXRpb25BY2Nlc3MoKS5nZXRHcm91cCgpKTsgCiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo2MzM6MzogKCBydWxlX19YSW1wb3J0RGVjbGFyYXRpb25fX0dyb3VwX18wICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjYzMzo0OiBydWxlX19YSW1wb3J0RGVjbGFyYXRpb25fX0dyb3VwX18wCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo3MzM6MzogKCBydWxlX19YSW1wb3J0RGVjbGFyYXRpb25fX0dyb3VwX18wICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjczMzo0OiBydWxlX19YSW1wb3J0RGVjbGFyYXRpb25fX0dyb3VwX18wCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV18yKTsKICAgICAgICAgICAgIHJ1bGVfX1hJbXBvcnREZWNsYXJhdGlvbl9fR3JvdXBfXzAoKTsKQEAgLTIxNjQsMTEgKzI1MTgsMTEgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJlbnRyeVJ1bGVYQW5ub3RhdGlvbiIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo2NDI6MTogZW50cnlSdWxlWEFubm90YXRpb24gOiBydWxlWEFubm90YXRpb24gRU9GIDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo3NDI6MTogZW50cnlSdWxlWEFubm90YXRpb24gOiBydWxlWEFubm90YXRpb24gRU9GIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBlbnRyeVJ1bGVYQW5ub3RhdGlvbigpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo2NDM6MTogKCBydWxlWEFubm90YXRpb24gRU9GICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjY0NDoxOiBydWxlWEFubm90YXRpb24gRU9GCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo3NDM6MTogKCBydWxlWEFubm90YXRpb24gRU9GICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjc0NDoxOiBydWxlWEFubm90YXRpb24gRU9GCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhBbm5vdGF0aW9uUnVsZSgpKTsgCkBAIC0yMTk4LDIzICsyNTUyLDIzIEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZVhBbm5vdGF0aW9uIgotICAgIC8vIEludGVybmFsRGF0YURTTC5nOjY1MToxOiBydWxlWEFubm90YXRpb24gOiAoICggcnVsZV9fWEFubm90YXRpb25fX0dyb3VwX18wICkgKSA7CisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NzUxOjE6IHJ1bGVYQW5ub3RhdGlvbiA6ICggKCBydWxlX19YQW5ub3RhdGlvbl9fR3JvdXBfXzAgKSApIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlWEFubm90YXRpb24oKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NjU1OjI6ICggKCAoIHJ1bGVfX1hBbm5vdGF0aW9uX19Hcm91cF9fMCApICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NjU2OjI6ICggKCBydWxlX19YQW5ub3RhdGlvbl9fR3JvdXBfXzAgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo3NTU6MjogKCAoICggcnVsZV9fWEFubm90YXRpb25fX0dyb3VwX18wICkgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo3NTY6MjogKCAoIHJ1bGVfX1hBbm5vdGF0aW9uX19Hcm91cF9fMCApICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjY1NjoyOiAoICggcnVsZV9fWEFubm90YXRpb25fX0dyb3VwX18wICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NjU3OjM6ICggcnVsZV9fWEFubm90YXRpb25fX0dyb3VwX18wICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjc1NjoyOiAoICggcnVsZV9fWEFubm90YXRpb25fX0dyb3VwX18wICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NzU3OjM6ICggcnVsZV9fWEFubm90YXRpb25fX0dyb3VwX18wICkKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WEFubm90YXRpb25BY2Nlc3MoKS5nZXRHcm91cCgpKTsgCiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo2NTg6MzogKCBydWxlX19YQW5ub3RhdGlvbl9fR3JvdXBfXzAgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NjU4OjQ6IHJ1bGVfX1hBbm5vdGF0aW9uX19Hcm91cF9fMAorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NzU4OjM6ICggcnVsZV9fWEFubm90YXRpb25fX0dyb3VwX18wICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjc1ODo0OiBydWxlX19YQW5ub3RhdGlvbl9fR3JvdXBfXzAKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzIpOwogICAgICAgICAgICAgcnVsZV9fWEFubm90YXRpb25fX0dyb3VwX18wKCk7CkBAIC0yMjQ5LDExICsyNjAzLDExIEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAiZW50cnlSdWxlWEFubm90YXRpb25FbGVtZW50VmFsdWVQYWlyIgotICAgIC8vIEludGVybmFsRGF0YURTTC5nOjY2NzoxOiBlbnRyeVJ1bGVYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZVBhaXIgOiBydWxlWEFubm90YXRpb25FbGVtZW50VmFsdWVQYWlyIEVPRiA7CisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NzY3OjE6IGVudHJ5UnVsZVhBbm5vdGF0aW9uRWxlbWVudFZhbHVlUGFpciA6IHJ1bGVYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZVBhaXIgRU9GIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBlbnRyeVJ1bGVYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZVBhaXIoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NjY4OjE6ICggcnVsZVhBbm5vdGF0aW9uRWxlbWVudFZhbHVlUGFpciBFT0YgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NjY5OjE6IHJ1bGVYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZVBhaXIgRU9GCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo3Njg6MTogKCBydWxlWEFubm90YXRpb25FbGVtZW50VmFsdWVQYWlyIEVPRiApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo3Njk6MTogcnVsZVhBbm5vdGF0aW9uRWxlbWVudFZhbHVlUGFpciBFT0YKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WEFubm90YXRpb25FbGVtZW50VmFsdWVQYWlyUnVsZSgpKTsgCkBAIC0yMjgzLDIzICsyNjM3LDIzIEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZVhBbm5vdGF0aW9uRWxlbWVudFZhbHVlUGFpciIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo2NzY6MTogcnVsZVhBbm5vdGF0aW9uRWxlbWVudFZhbHVlUGFpciA6ICggKCBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZVBhaXJfX0dyb3VwX18wICkgKSA7CisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6Nzc2OjE6IHJ1bGVYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZVBhaXIgOiAoICggcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVQYWlyX19Hcm91cF9fMCApICkgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZVBhaXIoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NjgwOjI6ICggKCAoIHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlUGFpcl9fR3JvdXBfXzAgKSApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjY4MToyOiAoICggcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVQYWlyX19Hcm91cF9fMCApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjc4MDoyOiAoICggKCBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZVBhaXJfX0dyb3VwX18wICkgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo3ODE6MjogKCAoIHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlUGFpcl9fR3JvdXBfXzAgKSApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo2ODE6MjogKCAoIHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlUGFpcl9fR3JvdXBfXzAgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo2ODI6MzogKCBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZVBhaXJfX0dyb3VwX18wICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjc4MToyOiAoICggcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVQYWlyX19Hcm91cF9fMCApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjc4MjozOiAoIHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlUGFpcl9fR3JvdXBfXzAgKQogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZVBhaXJBY2Nlc3MoKS5nZXRHcm91cCgpKTsgCiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo2ODM6MzogKCBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZVBhaXJfX0dyb3VwX18wICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjY4Mzo0OiBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZVBhaXJfX0dyb3VwX18wCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo3ODM6MzogKCBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZVBhaXJfX0dyb3VwX18wICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjc4Mzo0OiBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZVBhaXJfX0dyb3VwX18wCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV18yKTsKICAgICAgICAgICAgIHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlUGFpcl9fR3JvdXBfXzAoKTsKQEAgLTIzMzQsMTEgKzI2ODgsMTEgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJlbnRyeVJ1bGVYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0IgotICAgIC8vIEludGVybmFsRGF0YURTTC5nOjY5MjoxOiBlbnRyeVJ1bGVYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0IDogcnVsZVhBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3QgRU9GIDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo3OTI6MTogZW50cnlSdWxlWEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdCA6IHJ1bGVYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0IEVPRiA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgZW50cnlSdWxlWEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo2OTM6MTogKCBydWxlWEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdCBFT0YgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6Njk0OjE6IHJ1bGVYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0IEVPRgorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NzkzOjE6ICggcnVsZVhBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3QgRU9GICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjc5NDoxOiBydWxlWEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdCBFT0YKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdFJ1bGUoKSk7IApAQCAtMjM2OCwyMyArMjcyMiwyMyBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0IgotICAgIC8vIEludGVybmFsRGF0YURTTC5nOjcwMToxOiBydWxlWEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdCA6ICggKCBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0X19BbHRlcm5hdGl2ZXMgKSApIDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo4MDE6MTogcnVsZVhBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3QgOiAoICggcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdF9fQWx0ZXJuYXRpdmVzICkgKSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZVhBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3QoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NzA1OjI6ICggKCAoIHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RfX0FsdGVybmF0aXZlcyApICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NzA2OjI6ICggKCBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0X19BbHRlcm5hdGl2ZXMgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo4MDU6MjogKCAoICggcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdF9fQWx0ZXJuYXRpdmVzICkgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo4MDY6MjogKCAoIHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RfX0FsdGVybmF0aXZlcyApICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjcwNjoyOiAoICggcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdF9fQWx0ZXJuYXRpdmVzICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NzA3OjM6ICggcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdF9fQWx0ZXJuYXRpdmVzICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjgwNjoyOiAoICggcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdF9fQWx0ZXJuYXRpdmVzICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6ODA3OjM6ICggcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdF9fQWx0ZXJuYXRpdmVzICkKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdEFjY2VzcygpLmdldEFsdGVybmF0aXZlcygpKTsgCiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo3MDg6MzogKCBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0X19BbHRlcm5hdGl2ZXMgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NzA4OjQ6IHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RfX0FsdGVybmF0aXZlcworICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6ODA4OjM6ICggcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdF9fQWx0ZXJuYXRpdmVzICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjgwODo0OiBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0X19BbHRlcm5hdGl2ZXMKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzIpOwogICAgICAgICAgICAgcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdF9fQWx0ZXJuYXRpdmVzKCk7CkBAIC0yNDE5LDExICsyNzczLDExIEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAiZW50cnlSdWxlWEFubm90YXRpb25FbGVtZW50VmFsdWUiCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NzE3OjE6IGVudHJ5UnVsZVhBbm5vdGF0aW9uRWxlbWVudFZhbHVlIDogcnVsZVhBbm5vdGF0aW9uRWxlbWVudFZhbHVlIEVPRiA7CisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6ODE3OjE6IGVudHJ5UnVsZVhBbm5vdGF0aW9uRWxlbWVudFZhbHVlIDogcnVsZVhBbm5vdGF0aW9uRWxlbWVudFZhbHVlIEVPRiA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgZW50cnlSdWxlWEFubm90YXRpb25FbGVtZW50VmFsdWUoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NzE4OjE6ICggcnVsZVhBbm5vdGF0aW9uRWxlbWVudFZhbHVlIEVPRiApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo3MTk6MTogcnVsZVhBbm5vdGF0aW9uRWxlbWVudFZhbHVlIEVPRgorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6ODE4OjE6ICggcnVsZVhBbm5vdGF0aW9uRWxlbWVudFZhbHVlIEVPRiApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo4MTk6MTogcnVsZVhBbm5vdGF0aW9uRWxlbWVudFZhbHVlIEVPRgogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZVJ1bGUoKSk7IApAQCAtMjQ1MywyMyArMjgwNywyMyBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZSIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo3MjY6MTogcnVsZVhBbm5vdGF0aW9uRWxlbWVudFZhbHVlIDogKCAoIHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlX19BbHRlcm5hdGl2ZXMgKSApIDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo4MjY6MTogcnVsZVhBbm5vdGF0aW9uRWxlbWVudFZhbHVlIDogKCAoIHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlX19BbHRlcm5hdGl2ZXMgKSApIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlWEFubm90YXRpb25FbGVtZW50VmFsdWUoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NzMwOjI6ICggKCAoIHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlX19BbHRlcm5hdGl2ZXMgKSApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjczMToyOiAoICggcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVfX0FsdGVybmF0aXZlcyApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjgzMDoyOiAoICggKCBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZV9fQWx0ZXJuYXRpdmVzICkgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo4MzE6MjogKCAoIHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlX19BbHRlcm5hdGl2ZXMgKSApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo3MzE6MjogKCAoIHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlX19BbHRlcm5hdGl2ZXMgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo3MzI6MzogKCBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZV9fQWx0ZXJuYXRpdmVzICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjgzMToyOiAoICggcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVfX0FsdGVybmF0aXZlcyApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjgzMjozOiAoIHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlX19BbHRlcm5hdGl2ZXMgKQogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZUFjY2VzcygpLmdldEFsdGVybmF0aXZlcygpKTsgCiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo3MzM6MzogKCBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZV9fQWx0ZXJuYXRpdmVzICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjczMzo0OiBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZV9fQWx0ZXJuYXRpdmVzCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo4MzM6MzogKCBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZV9fQWx0ZXJuYXRpdmVzICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjgzMzo0OiBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZV9fQWx0ZXJuYXRpdmVzCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV18yKTsKICAgICAgICAgICAgIHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlX19BbHRlcm5hdGl2ZXMoKTsKQEAgLTI1MDQsMTEgKzI4NTgsMTEgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJlbnRyeVJ1bGVYQW5ub3RhdGlvbk9yRXhwcmVzc2lvbiIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo3NDI6MTogZW50cnlSdWxlWEFubm90YXRpb25PckV4cHJlc3Npb24gOiBydWxlWEFubm90YXRpb25PckV4cHJlc3Npb24gRU9GIDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo4NDI6MTogZW50cnlSdWxlWEFubm90YXRpb25PckV4cHJlc3Npb24gOiBydWxlWEFubm90YXRpb25PckV4cHJlc3Npb24gRU9GIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBlbnRyeVJ1bGVYQW5ub3RhdGlvbk9yRXhwcmVzc2lvbigpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo3NDM6MTogKCBydWxlWEFubm90YXRpb25PckV4cHJlc3Npb24gRU9GICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjc0NDoxOiBydWxlWEFubm90YXRpb25PckV4cHJlc3Npb24gRU9GCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo4NDM6MTogKCBydWxlWEFubm90YXRpb25PckV4cHJlc3Npb24gRU9GICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjg0NDoxOiBydWxlWEFubm90YXRpb25PckV4cHJlc3Npb24gRU9GCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhBbm5vdGF0aW9uT3JFeHByZXNzaW9uUnVsZSgpKTsgCkBAIC0yNTM4LDIzICsyODkyLDIzIEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZVhBbm5vdGF0aW9uT3JFeHByZXNzaW9uIgotICAgIC8vIEludGVybmFsRGF0YURTTC5nOjc1MToxOiBydWxlWEFubm90YXRpb25PckV4cHJlc3Npb24gOiAoICggcnVsZV9fWEFubm90YXRpb25PckV4cHJlc3Npb25fX0FsdGVybmF0aXZlcyApICkgOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjg1MToxOiBydWxlWEFubm90YXRpb25PckV4cHJlc3Npb24gOiAoICggcnVsZV9fWEFubm90YXRpb25PckV4cHJlc3Npb25fX0FsdGVybmF0aXZlcyApICkgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVYQW5ub3RhdGlvbk9yRXhwcmVzc2lvbigpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo3NTU6MjogKCAoICggcnVsZV9fWEFubm90YXRpb25PckV4cHJlc3Npb25fX0FsdGVybmF0aXZlcyApICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NzU2OjI6ICggKCBydWxlX19YQW5ub3RhdGlvbk9yRXhwcmVzc2lvbl9fQWx0ZXJuYXRpdmVzICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6ODU1OjI6ICggKCAoIHJ1bGVfX1hBbm5vdGF0aW9uT3JFeHByZXNzaW9uX19BbHRlcm5hdGl2ZXMgKSApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjg1NjoyOiAoICggcnVsZV9fWEFubm90YXRpb25PckV4cHJlc3Npb25fX0FsdGVybmF0aXZlcyApICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjc1NjoyOiAoICggcnVsZV9fWEFubm90YXRpb25PckV4cHJlc3Npb25fX0FsdGVybmF0aXZlcyApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjc1NzozOiAoIHJ1bGVfX1hBbm5vdGF0aW9uT3JFeHByZXNzaW9uX19BbHRlcm5hdGl2ZXMgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6ODU2OjI6ICggKCBydWxlX19YQW5ub3RhdGlvbk9yRXhwcmVzc2lvbl9fQWx0ZXJuYXRpdmVzICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6ODU3OjM6ICggcnVsZV9fWEFubm90YXRpb25PckV4cHJlc3Npb25fX0FsdGVybmF0aXZlcyApCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhBbm5vdGF0aW9uT3JFeHByZXNzaW9uQWNjZXNzKCkuZ2V0QWx0ZXJuYXRpdmVzKCkpOyAKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjc1ODozOiAoIHJ1bGVfX1hBbm5vdGF0aW9uT3JFeHByZXNzaW9uX19BbHRlcm5hdGl2ZXMgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NzU4OjQ6IHJ1bGVfX1hBbm5vdGF0aW9uT3JFeHByZXNzaW9uX19BbHRlcm5hdGl2ZXMKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjg1ODozOiAoIHJ1bGVfX1hBbm5vdGF0aW9uT3JFeHByZXNzaW9uX19BbHRlcm5hdGl2ZXMgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6ODU4OjQ6IHJ1bGVfX1hBbm5vdGF0aW9uT3JFeHByZXNzaW9uX19BbHRlcm5hdGl2ZXMKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzIpOwogICAgICAgICAgICAgcnVsZV9fWEFubm90YXRpb25PckV4cHJlc3Npb25fX0FsdGVybmF0aXZlcygpOwpAQCAtMjU4OSwxMSArMjk0MywxMSBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgImVudHJ5UnVsZVhFeHByZXNzaW9uIgotICAgIC8vIEludGVybmFsRGF0YURTTC5nOjc2NzoxOiBlbnRyeVJ1bGVYRXhwcmVzc2lvbiA6IHJ1bGVYRXhwcmVzc2lvbiBFT0YgOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjg2NzoxOiBlbnRyeVJ1bGVYRXhwcmVzc2lvbiA6IHJ1bGVYRXhwcmVzc2lvbiBFT0YgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIGVudHJ5UnVsZVhFeHByZXNzaW9uKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjc2ODoxOiAoIHJ1bGVYRXhwcmVzc2lvbiBFT0YgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NzY5OjE6IHJ1bGVYRXhwcmVzc2lvbiBFT0YKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjg2ODoxOiAoIHJ1bGVYRXhwcmVzc2lvbiBFT0YgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6ODY5OjE6IHJ1bGVYRXhwcmVzc2lvbiBFT0YKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WEV4cHJlc3Npb25SdWxlKCkpOyAKQEAgLTI2MjMsMTcgKzI5NzcsMTcgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlWEV4cHJlc3Npb24iCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6Nzc2OjE6IHJ1bGVYRXhwcmVzc2lvbiA6ICggcnVsZVhBc3NpZ25tZW50ICkgOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjg3NjoxOiBydWxlWEV4cHJlc3Npb24gOiAoIHJ1bGVYQXNzaWdubWVudCApIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlWEV4cHJlc3Npb24oKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NzgwOjI6ICggKCBydWxlWEFzc2lnbm1lbnQgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo3ODE6MjogKCBydWxlWEFzc2lnbm1lbnQgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6ODgwOjI6ICggKCBydWxlWEFzc2lnbm1lbnQgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo4ODE6MjogKCBydWxlWEFzc2lnbm1lbnQgKQogICAgICAgICAgICAgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NzgxOjI6ICggcnVsZVhBc3NpZ25tZW50ICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjc4MjozOiBydWxlWEFzc2lnbm1lbnQKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjg4MToyOiAoIHJ1bGVYQXNzaWdubWVudCApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo4ODI6MzogcnVsZVhBc3NpZ25tZW50CiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhFeHByZXNzaW9uQWNjZXNzKCkuZ2V0WEFzc2lnbm1lbnRQYXJzZXJSdWxlQ2FsbCgpKTsgCkBAIC0yNjY4LDExICszMDIyLDExIEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAiZW50cnlSdWxlWEFzc2lnbm1lbnQiCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NzkyOjE6IGVudHJ5UnVsZVhBc3NpZ25tZW50IDogcnVsZVhBc3NpZ25tZW50IEVPRiA7CisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6ODkyOjE6IGVudHJ5UnVsZVhBc3NpZ25tZW50IDogcnVsZVhBc3NpZ25tZW50IEVPRiA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgZW50cnlSdWxlWEFzc2lnbm1lbnQoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NzkzOjE6ICggcnVsZVhBc3NpZ25tZW50IEVPRiApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo3OTQ6MTogcnVsZVhBc3NpZ25tZW50IEVPRgorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6ODkzOjE6ICggcnVsZVhBc3NpZ25tZW50IEVPRiApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo4OTQ6MTogcnVsZVhBc3NpZ25tZW50IEVPRgogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYQXNzaWdubWVudFJ1bGUoKSk7IApAQCAtMjcwMiwyMyArMzA1NiwyMyBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVYQXNzaWdubWVudCIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo4MDE6MTogcnVsZVhBc3NpZ25tZW50IDogKCAoIHJ1bGVfX1hBc3NpZ25tZW50X19BbHRlcm5hdGl2ZXMgKSApIDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo5MDE6MTogcnVsZVhBc3NpZ25tZW50IDogKCAoIHJ1bGVfX1hBc3NpZ25tZW50X19BbHRlcm5hdGl2ZXMgKSApIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlWEFzc2lnbm1lbnQoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6ODA1OjI6ICggKCAoIHJ1bGVfX1hBc3NpZ25tZW50X19BbHRlcm5hdGl2ZXMgKSApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjgwNjoyOiAoICggcnVsZV9fWEFzc2lnbm1lbnRfX0FsdGVybmF0aXZlcyApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjkwNToyOiAoICggKCBydWxlX19YQXNzaWdubWVudF9fQWx0ZXJuYXRpdmVzICkgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo5MDY6MjogKCAoIHJ1bGVfX1hBc3NpZ25tZW50X19BbHRlcm5hdGl2ZXMgKSApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo4MDY6MjogKCAoIHJ1bGVfX1hBc3NpZ25tZW50X19BbHRlcm5hdGl2ZXMgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo4MDc6MzogKCBydWxlX19YQXNzaWdubWVudF9fQWx0ZXJuYXRpdmVzICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjkwNjoyOiAoICggcnVsZV9fWEFzc2lnbm1lbnRfX0FsdGVybmF0aXZlcyApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjkwNzozOiAoIHJ1bGVfX1hBc3NpZ25tZW50X19BbHRlcm5hdGl2ZXMgKQogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYQXNzaWdubWVudEFjY2VzcygpLmdldEFsdGVybmF0aXZlcygpKTsgCiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo4MDg6MzogKCBydWxlX19YQXNzaWdubWVudF9fQWx0ZXJuYXRpdmVzICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjgwODo0OiBydWxlX19YQXNzaWdubWVudF9fQWx0ZXJuYXRpdmVzCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo5MDg6MzogKCBydWxlX19YQXNzaWdubWVudF9fQWx0ZXJuYXRpdmVzICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjkwODo0OiBydWxlX19YQXNzaWdubWVudF9fQWx0ZXJuYXRpdmVzCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV18yKTsKICAgICAgICAgICAgIHJ1bGVfX1hBc3NpZ25tZW50X19BbHRlcm5hdGl2ZXMoKTsKQEAgLTI3NTMsMTEgKzMxMDcsMTEgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJlbnRyeVJ1bGVPcFNpbmdsZUFzc2lnbiIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo4MTc6MTogZW50cnlSdWxlT3BTaW5nbGVBc3NpZ24gOiBydWxlT3BTaW5nbGVBc3NpZ24gRU9GIDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo5MTc6MTogZW50cnlSdWxlT3BTaW5nbGVBc3NpZ24gOiBydWxlT3BTaW5nbGVBc3NpZ24gRU9GIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBlbnRyeVJ1bGVPcFNpbmdsZUFzc2lnbigpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo4MTg6MTogKCBydWxlT3BTaW5nbGVBc3NpZ24gRU9GICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjgxOToxOiBydWxlT3BTaW5nbGVBc3NpZ24gRU9GCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo5MTg6MTogKCBydWxlT3BTaW5nbGVBc3NpZ24gRU9GICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjkxOToxOiBydWxlT3BTaW5nbGVBc3NpZ24gRU9GCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldE9wU2luZ2xlQXNzaWduUnVsZSgpKTsgCkBAIC0yNzg3LDE3ICszMTQxLDE3IEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZU9wU2luZ2xlQXNzaWduIgotICAgIC8vIEludGVybmFsRGF0YURTTC5nOjgyNjoxOiBydWxlT3BTaW5nbGVBc3NpZ24gOiAoICc9JyApIDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo5MjY6MTogcnVsZU9wU2luZ2xlQXNzaWduIDogKCAnPScgKSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZU9wU2luZ2xlQXNzaWduKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjgzMDoyOiAoICggJz0nICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6ODMxOjI6ICggJz0nICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjkzMDoyOiAoICggJz0nICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6OTMxOjI6ICggJz0nICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjgzMToyOiAoICc9JyApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo4MzI6MzogJz0nCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo5MzE6MjogKCAnPScgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6OTMyOjM6ICc9JwogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRPcFNpbmdsZUFzc2lnbkFjY2VzcygpLmdldEVxdWFsc1NpZ25LZXl3b3JkKCkpOyAKQEAgLTI4MjgsMTEgKzMxODIsMTEgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJlbnRyeVJ1bGVPcE11bHRpQXNzaWduIgotICAgIC8vIEludGVybmFsRGF0YURTTC5nOjg0MjoxOiBlbnRyeVJ1bGVPcE11bHRpQXNzaWduIDogcnVsZU9wTXVsdGlBc3NpZ24gRU9GIDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo5NDI6MTogZW50cnlSdWxlT3BNdWx0aUFzc2lnbiA6IHJ1bGVPcE11bHRpQXNzaWduIEVPRiA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgZW50cnlSdWxlT3BNdWx0aUFzc2lnbigpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo4NDM6MTogKCBydWxlT3BNdWx0aUFzc2lnbiBFT0YgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6ODQ0OjE6IHJ1bGVPcE11bHRpQXNzaWduIEVPRgorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6OTQzOjE6ICggcnVsZU9wTXVsdGlBc3NpZ24gRU9GICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjk0NDoxOiBydWxlT3BNdWx0aUFzc2lnbiBFT0YKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0T3BNdWx0aUFzc2lnblJ1bGUoKSk7IApAQCAtMjg2MiwyMyArMzIxNiwyMyBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVPcE11bHRpQXNzaWduIgotICAgIC8vIEludGVybmFsRGF0YURTTC5nOjg1MToxOiBydWxlT3BNdWx0aUFzc2lnbiA6ICggKCBydWxlX19PcE11bHRpQXNzaWduX19BbHRlcm5hdGl2ZXMgKSApIDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo5NTE6MTogcnVsZU9wTXVsdGlBc3NpZ24gOiAoICggcnVsZV9fT3BNdWx0aUFzc2lnbl9fQWx0ZXJuYXRpdmVzICkgKSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZU9wTXVsdGlBc3NpZ24oKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6ODU1OjI6ICggKCAoIHJ1bGVfX09wTXVsdGlBc3NpZ25fX0FsdGVybmF0aXZlcyApICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6ODU2OjI6ICggKCBydWxlX19PcE11bHRpQXNzaWduX19BbHRlcm5hdGl2ZXMgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo5NTU6MjogKCAoICggcnVsZV9fT3BNdWx0aUFzc2lnbl9fQWx0ZXJuYXRpdmVzICkgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo5NTY6MjogKCAoIHJ1bGVfX09wTXVsdGlBc3NpZ25fX0FsdGVybmF0aXZlcyApICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjg1NjoyOiAoICggcnVsZV9fT3BNdWx0aUFzc2lnbl9fQWx0ZXJuYXRpdmVzICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6ODU3OjM6ICggcnVsZV9fT3BNdWx0aUFzc2lnbl9fQWx0ZXJuYXRpdmVzICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjk1NjoyOiAoICggcnVsZV9fT3BNdWx0aUFzc2lnbl9fQWx0ZXJuYXRpdmVzICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6OTU3OjM6ICggcnVsZV9fT3BNdWx0aUFzc2lnbl9fQWx0ZXJuYXRpdmVzICkKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0T3BNdWx0aUFzc2lnbkFjY2VzcygpLmdldEFsdGVybmF0aXZlcygpKTsgCiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo4NTg6MzogKCBydWxlX19PcE11bHRpQXNzaWduX19BbHRlcm5hdGl2ZXMgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6ODU4OjQ6IHJ1bGVfX09wTXVsdGlBc3NpZ25fX0FsdGVybmF0aXZlcworICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6OTU4OjM6ICggcnVsZV9fT3BNdWx0aUFzc2lnbl9fQWx0ZXJuYXRpdmVzICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjk1ODo0OiBydWxlX19PcE11bHRpQXNzaWduX19BbHRlcm5hdGl2ZXMKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzIpOwogICAgICAgICAgICAgcnVsZV9fT3BNdWx0aUFzc2lnbl9fQWx0ZXJuYXRpdmVzKCk7CkBAIC0yOTEzLDExICszMjY3LDExIEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAiZW50cnlSdWxlWE9yRXhwcmVzc2lvbiIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo4Njc6MTogZW50cnlSdWxlWE9yRXhwcmVzc2lvbiA6IHJ1bGVYT3JFeHByZXNzaW9uIEVPRiA7CisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6OTY3OjE6IGVudHJ5UnVsZVhPckV4cHJlc3Npb24gOiBydWxlWE9yRXhwcmVzc2lvbiBFT0YgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIGVudHJ5UnVsZVhPckV4cHJlc3Npb24oKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6ODY4OjE6ICggcnVsZVhPckV4cHJlc3Npb24gRU9GICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjg2OToxOiBydWxlWE9yRXhwcmVzc2lvbiBFT0YKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjk2ODoxOiAoIHJ1bGVYT3JFeHByZXNzaW9uIEVPRiApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo5Njk6MTogcnVsZVhPckV4cHJlc3Npb24gRU9GCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhPckV4cHJlc3Npb25SdWxlKCkpOyAKQEAgLTI5NDcsMjMgKzMzMDEsMjMgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlWE9yRXhwcmVzc2lvbiIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo4NzY6MTogcnVsZVhPckV4cHJlc3Npb24gOiAoICggcnVsZV9fWE9yRXhwcmVzc2lvbl9fR3JvdXBfXzAgKSApIDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo5NzY6MTogcnVsZVhPckV4cHJlc3Npb24gOiAoICggcnVsZV9fWE9yRXhwcmVzc2lvbl9fR3JvdXBfXzAgKSApIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlWE9yRXhwcmVzc2lvbigpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo4ODA6MjogKCAoICggcnVsZV9fWE9yRXhwcmVzc2lvbl9fR3JvdXBfXzAgKSApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjg4MToyOiAoICggcnVsZV9fWE9yRXhwcmVzc2lvbl9fR3JvdXBfXzAgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo5ODA6MjogKCAoICggcnVsZV9fWE9yRXhwcmVzc2lvbl9fR3JvdXBfXzAgKSApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjk4MToyOiAoICggcnVsZV9fWE9yRXhwcmVzc2lvbl9fR3JvdXBfXzAgKSApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo4ODE6MjogKCAoIHJ1bGVfX1hPckV4cHJlc3Npb25fX0dyb3VwX18wICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6ODgyOjM6ICggcnVsZV9fWE9yRXhwcmVzc2lvbl9fR3JvdXBfXzAgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6OTgxOjI6ICggKCBydWxlX19YT3JFeHByZXNzaW9uX19Hcm91cF9fMCApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjk4MjozOiAoIHJ1bGVfX1hPckV4cHJlc3Npb25fX0dyb3VwX18wICkKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WE9yRXhwcmVzc2lvbkFjY2VzcygpLmdldEdyb3VwKCkpOyAKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjg4MzozOiAoIHJ1bGVfX1hPckV4cHJlc3Npb25fX0dyb3VwX18wICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjg4Mzo0OiBydWxlX19YT3JFeHByZXNzaW9uX19Hcm91cF9fMAorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6OTgzOjM6ICggcnVsZV9fWE9yRXhwcmVzc2lvbl9fR3JvdXBfXzAgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6OTgzOjQ6IHJ1bGVfX1hPckV4cHJlc3Npb25fX0dyb3VwX18wCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV18yKTsKICAgICAgICAgICAgIHJ1bGVfX1hPckV4cHJlc3Npb25fX0dyb3VwX18wKCk7CkBAIC0yOTk4LDExICszMzUyLDExIEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAiZW50cnlSdWxlT3BPciIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo4OTI6MTogZW50cnlSdWxlT3BPciA6IHJ1bGVPcE9yIEVPRiA7CisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6OTkyOjE6IGVudHJ5UnVsZU9wT3IgOiBydWxlT3BPciBFT0YgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIGVudHJ5UnVsZU9wT3IoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6ODkzOjE6ICggcnVsZU9wT3IgRU9GICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjg5NDoxOiBydWxlT3BPciBFT0YKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjk5MzoxOiAoIHJ1bGVPcE9yIEVPRiApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo5OTQ6MTogcnVsZU9wT3IgRU9GCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldE9wT3JSdWxlKCkpOyAKQEAgLTMwMzIsMTcgKzMzODYsMTcgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlT3BPciIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo5MDE6MTogcnVsZU9wT3IgOiAoICd8fCcgKSA7CisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTAwMToxOiBydWxlT3BPciA6ICggJ3x8JyApIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlT3BPcigpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo5MDU6MjogKCAoICd8fCcgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo5MDY6MjogKCAnfHwnICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEwMDU6MjogKCAoICd8fCcgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMDA2OjI6ICggJ3x8JyApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo5MDY6MjogKCAnfHwnICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjkwNzozOiAnfHwnCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMDA2OjI6ICggJ3x8JyApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMDA3OjM6ICd8fCcKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0T3BPckFjY2VzcygpLmdldFZlcnRpY2FsTGluZVZlcnRpY2FsTGluZUtleXdvcmQoKSk7IApAQCAtMzA3MywxMSArMzQyNywxMSBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgImVudHJ5UnVsZVhBbmRFeHByZXNzaW9uIgotICAgIC8vIEludGVybmFsRGF0YURTTC5nOjkxNzoxOiBlbnRyeVJ1bGVYQW5kRXhwcmVzc2lvbiA6IHJ1bGVYQW5kRXhwcmVzc2lvbiBFT0YgOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEwMTc6MTogZW50cnlSdWxlWEFuZEV4cHJlc3Npb24gOiBydWxlWEFuZEV4cHJlc3Npb24gRU9GIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBlbnRyeVJ1bGVYQW5kRXhwcmVzc2lvbigpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo5MTg6MTogKCBydWxlWEFuZEV4cHJlc3Npb24gRU9GICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjkxOToxOiBydWxlWEFuZEV4cHJlc3Npb24gRU9GCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMDE4OjE6ICggcnVsZVhBbmRFeHByZXNzaW9uIEVPRiApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMDE5OjE6IHJ1bGVYQW5kRXhwcmVzc2lvbiBFT0YKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WEFuZEV4cHJlc3Npb25SdWxlKCkpOyAKQEAgLTMxMDcsMjMgKzM0NjEsMjMgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlWEFuZEV4cHJlc3Npb24iCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6OTI2OjE6IHJ1bGVYQW5kRXhwcmVzc2lvbiA6ICggKCBydWxlX19YQW5kRXhwcmVzc2lvbl9fR3JvdXBfXzAgKSApIDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMDI2OjE6IHJ1bGVYQW5kRXhwcmVzc2lvbiA6ICggKCBydWxlX19YQW5kRXhwcmVzc2lvbl9fR3JvdXBfXzAgKSApIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlWEFuZEV4cHJlc3Npb24oKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6OTMwOjI6ICggKCAoIHJ1bGVfX1hBbmRFeHByZXNzaW9uX19Hcm91cF9fMCApICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6OTMxOjI6ICggKCBydWxlX19YQW5kRXhwcmVzc2lvbl9fR3JvdXBfXzAgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMDMwOjI6ICggKCAoIHJ1bGVfX1hBbmRFeHByZXNzaW9uX19Hcm91cF9fMCApICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTAzMToyOiAoICggcnVsZV9fWEFuZEV4cHJlc3Npb25fX0dyb3VwX18wICkgKQogICAgICAgICAgICAgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6OTMxOjI6ICggKCBydWxlX19YQW5kRXhwcmVzc2lvbl9fR3JvdXBfXzAgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo5MzI6MzogKCBydWxlX19YQW5kRXhwcmVzc2lvbl9fR3JvdXBfXzAgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTAzMToyOiAoICggcnVsZV9fWEFuZEV4cHJlc3Npb25fX0dyb3VwX18wICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTAzMjozOiAoIHJ1bGVfX1hBbmRFeHByZXNzaW9uX19Hcm91cF9fMCApCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhBbmRFeHByZXNzaW9uQWNjZXNzKCkuZ2V0R3JvdXAoKSk7IAogICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6OTMzOjM6ICggcnVsZV9fWEFuZEV4cHJlc3Npb25fX0dyb3VwX18wICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjkzMzo0OiBydWxlX19YQW5kRXhwcmVzc2lvbl9fR3JvdXBfXzAKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEwMzM6MzogKCBydWxlX19YQW5kRXhwcmVzc2lvbl9fR3JvdXBfXzAgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTAzMzo0OiBydWxlX19YQW5kRXhwcmVzc2lvbl9fR3JvdXBfXzAKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzIpOwogICAgICAgICAgICAgcnVsZV9fWEFuZEV4cHJlc3Npb25fX0dyb3VwX18wKCk7CkBAIC0zMTU4LDExICszNTEyLDExIEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAiZW50cnlSdWxlT3BBbmQiCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6OTQyOjE6IGVudHJ5UnVsZU9wQW5kIDogcnVsZU9wQW5kIEVPRiA7CisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTA0MjoxOiBlbnRyeVJ1bGVPcEFuZCA6IHJ1bGVPcEFuZCBFT0YgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIGVudHJ5UnVsZU9wQW5kKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjk0MzoxOiAoIHJ1bGVPcEFuZCBFT0YgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6OTQ0OjE6IHJ1bGVPcEFuZCBFT0YKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEwNDM6MTogKCBydWxlT3BBbmQgRU9GICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEwNDQ6MTogcnVsZU9wQW5kIEVPRgogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRPcEFuZFJ1bGUoKSk7IApAQCAtMzE5MiwxNyArMzU0NiwxNyBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVPcEFuZCIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo5NTE6MTogcnVsZU9wQW5kIDogKCAnJiYnICkgOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEwNTE6MTogcnVsZU9wQW5kIDogKCAnJiYnICkgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVPcEFuZCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo5NTU6MjogKCAoICcmJicgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo5NTY6MjogKCAnJiYnICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEwNTU6MjogKCAoICcmJicgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMDU2OjI6ICggJyYmJyApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo5NTY6MjogKCAnJiYnICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjk1NzozOiAnJiYnCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMDU2OjI6ICggJyYmJyApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMDU3OjM6ICcmJicKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0T3BBbmRBY2Nlc3MoKS5nZXRBbXBlcnNhbmRBbXBlcnNhbmRLZXl3b3JkKCkpOyAKQEAgLTMyMzMsMTEgKzM1ODcsMTEgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJlbnRyeVJ1bGVYRXF1YWxpdHlFeHByZXNzaW9uIgotICAgIC8vIEludGVybmFsRGF0YURTTC5nOjk2NzoxOiBlbnRyeVJ1bGVYRXF1YWxpdHlFeHByZXNzaW9uIDogcnVsZVhFcXVhbGl0eUV4cHJlc3Npb24gRU9GIDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMDY3OjE6IGVudHJ5UnVsZVhFcXVhbGl0eUV4cHJlc3Npb24gOiBydWxlWEVxdWFsaXR5RXhwcmVzc2lvbiBFT0YgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIGVudHJ5UnVsZVhFcXVhbGl0eUV4cHJlc3Npb24oKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6OTY4OjE6ICggcnVsZVhFcXVhbGl0eUV4cHJlc3Npb24gRU9GICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjk2OToxOiBydWxlWEVxdWFsaXR5RXhwcmVzc2lvbiBFT0YKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEwNjg6MTogKCBydWxlWEVxdWFsaXR5RXhwcmVzc2lvbiBFT0YgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTA2OToxOiBydWxlWEVxdWFsaXR5RXhwcmVzc2lvbiBFT0YKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WEVxdWFsaXR5RXhwcmVzc2lvblJ1bGUoKSk7IApAQCAtMzI2NywyMyArMzYyMSwyMyBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVYRXF1YWxpdHlFeHByZXNzaW9uIgotICAgIC8vIEludGVybmFsRGF0YURTTC5nOjk3NjoxOiBydWxlWEVxdWFsaXR5RXhwcmVzc2lvbiA6ICggKCBydWxlX19YRXF1YWxpdHlFeHByZXNzaW9uX19Hcm91cF9fMCApICkgOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEwNzY6MTogcnVsZVhFcXVhbGl0eUV4cHJlc3Npb24gOiAoICggcnVsZV9fWEVxdWFsaXR5RXhwcmVzc2lvbl9fR3JvdXBfXzAgKSApIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlWEVxdWFsaXR5RXhwcmVzc2lvbigpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo5ODA6MjogKCAoICggcnVsZV9fWEVxdWFsaXR5RXhwcmVzc2lvbl9fR3JvdXBfXzAgKSApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjk4MToyOiAoICggcnVsZV9fWEVxdWFsaXR5RXhwcmVzc2lvbl9fR3JvdXBfXzAgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMDgwOjI6ICggKCAoIHJ1bGVfX1hFcXVhbGl0eUV4cHJlc3Npb25fX0dyb3VwX18wICkgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMDgxOjI6ICggKCBydWxlX19YRXF1YWxpdHlFeHByZXNzaW9uX19Hcm91cF9fMCApICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjk4MToyOiAoICggcnVsZV9fWEVxdWFsaXR5RXhwcmVzc2lvbl9fR3JvdXBfXzAgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo5ODI6MzogKCBydWxlX19YRXF1YWxpdHlFeHByZXNzaW9uX19Hcm91cF9fMCApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMDgxOjI6ICggKCBydWxlX19YRXF1YWxpdHlFeHByZXNzaW9uX19Hcm91cF9fMCApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEwODI6MzogKCBydWxlX19YRXF1YWxpdHlFeHByZXNzaW9uX19Hcm91cF9fMCApCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhFcXVhbGl0eUV4cHJlc3Npb25BY2Nlc3MoKS5nZXRHcm91cCgpKTsgCiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo5ODM6MzogKCBydWxlX19YRXF1YWxpdHlFeHByZXNzaW9uX19Hcm91cF9fMCApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo5ODM6NDogcnVsZV9fWEVxdWFsaXR5RXhwcmVzc2lvbl9fR3JvdXBfXzAKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEwODM6MzogKCBydWxlX19YRXF1YWxpdHlFeHByZXNzaW9uX19Hcm91cF9fMCApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMDgzOjQ6IHJ1bGVfX1hFcXVhbGl0eUV4cHJlc3Npb25fX0dyb3VwX18wCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV18yKTsKICAgICAgICAgICAgIHJ1bGVfX1hFcXVhbGl0eUV4cHJlc3Npb25fX0dyb3VwX18wKCk7CkBAIC0zMzE4LDExICszNjcyLDExIEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAiZW50cnlSdWxlT3BFcXVhbGl0eSIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo5OTI6MTogZW50cnlSdWxlT3BFcXVhbGl0eSA6IHJ1bGVPcEVxdWFsaXR5IEVPRiA7CisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTA5MjoxOiBlbnRyeVJ1bGVPcEVxdWFsaXR5IDogcnVsZU9wRXF1YWxpdHkgRU9GIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBlbnRyeVJ1bGVPcEVxdWFsaXR5KCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjk5MzoxOiAoIHJ1bGVPcEVxdWFsaXR5IEVPRiApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo5OTQ6MTogcnVsZU9wRXF1YWxpdHkgRU9GCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMDkzOjE6ICggcnVsZU9wRXF1YWxpdHkgRU9GICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEwOTQ6MTogcnVsZU9wRXF1YWxpdHkgRU9GCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldE9wRXF1YWxpdHlSdWxlKCkpOyAKQEAgLTMzNTIsMjMgKzM3MDYsMjMgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlT3BFcXVhbGl0eSIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMDAxOjE6IHJ1bGVPcEVxdWFsaXR5IDogKCAoIHJ1bGVfX09wRXF1YWxpdHlfX0FsdGVybmF0aXZlcyApICkgOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjExMDE6MTogcnVsZU9wRXF1YWxpdHkgOiAoICggcnVsZV9fT3BFcXVhbGl0eV9fQWx0ZXJuYXRpdmVzICkgKSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZU9wRXF1YWxpdHkoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTAwNToyOiAoICggKCBydWxlX19PcEVxdWFsaXR5X19BbHRlcm5hdGl2ZXMgKSApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEwMDY6MjogKCAoIHJ1bGVfX09wRXF1YWxpdHlfX0FsdGVybmF0aXZlcyApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjExMDU6MjogKCAoICggcnVsZV9fT3BFcXVhbGl0eV9fQWx0ZXJuYXRpdmVzICkgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMTA2OjI6ICggKCBydWxlX19PcEVxdWFsaXR5X19BbHRlcm5hdGl2ZXMgKSApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMDA2OjI6ICggKCBydWxlX19PcEVxdWFsaXR5X19BbHRlcm5hdGl2ZXMgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMDA3OjM6ICggcnVsZV9fT3BFcXVhbGl0eV9fQWx0ZXJuYXRpdmVzICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjExMDY6MjogKCAoIHJ1bGVfX09wRXF1YWxpdHlfX0FsdGVybmF0aXZlcyApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjExMDc6MzogKCBydWxlX19PcEVxdWFsaXR5X19BbHRlcm5hdGl2ZXMgKQogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRPcEVxdWFsaXR5QWNjZXNzKCkuZ2V0QWx0ZXJuYXRpdmVzKCkpOyAKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEwMDg6MzogKCBydWxlX19PcEVxdWFsaXR5X19BbHRlcm5hdGl2ZXMgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTAwODo0OiBydWxlX19PcEVxdWFsaXR5X19BbHRlcm5hdGl2ZXMKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjExMDg6MzogKCBydWxlX19PcEVxdWFsaXR5X19BbHRlcm5hdGl2ZXMgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTEwODo0OiBydWxlX19PcEVxdWFsaXR5X19BbHRlcm5hdGl2ZXMKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzIpOwogICAgICAgICAgICAgcnVsZV9fT3BFcXVhbGl0eV9fQWx0ZXJuYXRpdmVzKCk7CkBAIC0zNDAzLDExICszNzU3LDExIEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAiZW50cnlSdWxlWFJlbGF0aW9uYWxFeHByZXNzaW9uIgotICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEwMTc6MTogZW50cnlSdWxlWFJlbGF0aW9uYWxFeHByZXNzaW9uIDogcnVsZVhSZWxhdGlvbmFsRXhwcmVzc2lvbiBFT0YgOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjExMTc6MTogZW50cnlSdWxlWFJlbGF0aW9uYWxFeHByZXNzaW9uIDogcnVsZVhSZWxhdGlvbmFsRXhwcmVzc2lvbiBFT0YgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIGVudHJ5UnVsZVhSZWxhdGlvbmFsRXhwcmVzc2lvbigpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMDE4OjE6ICggcnVsZVhSZWxhdGlvbmFsRXhwcmVzc2lvbiBFT0YgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTAxOToxOiBydWxlWFJlbGF0aW9uYWxFeHByZXNzaW9uIEVPRgorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTExODoxOiAoIHJ1bGVYUmVsYXRpb25hbEV4cHJlc3Npb24gRU9GICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjExMTk6MTogcnVsZVhSZWxhdGlvbmFsRXhwcmVzc2lvbiBFT0YKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WFJlbGF0aW9uYWxFeHByZXNzaW9uUnVsZSgpKTsgCkBAIC0zNDM3LDIzICszNzkxLDIzIEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZVhSZWxhdGlvbmFsRXhwcmVzc2lvbiIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMDI2OjE6IHJ1bGVYUmVsYXRpb25hbEV4cHJlc3Npb24gOiAoICggcnVsZV9fWFJlbGF0aW9uYWxFeHByZXNzaW9uX19Hcm91cF9fMCApICkgOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjExMjY6MTogcnVsZVhSZWxhdGlvbmFsRXhwcmVzc2lvbiA6ICggKCBydWxlX19YUmVsYXRpb25hbEV4cHJlc3Npb25fX0dyb3VwX18wICkgKSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZVhSZWxhdGlvbmFsRXhwcmVzc2lvbigpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMDMwOjI6ICggKCAoIHJ1bGVfX1hSZWxhdGlvbmFsRXhwcmVzc2lvbl9fR3JvdXBfXzAgKSApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEwMzE6MjogKCAoIHJ1bGVfX1hSZWxhdGlvbmFsRXhwcmVzc2lvbl9fR3JvdXBfXzAgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMTMwOjI6ICggKCAoIHJ1bGVfX1hSZWxhdGlvbmFsRXhwcmVzc2lvbl9fR3JvdXBfXzAgKSApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjExMzE6MjogKCAoIHJ1bGVfX1hSZWxhdGlvbmFsRXhwcmVzc2lvbl9fR3JvdXBfXzAgKSApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMDMxOjI6ICggKCBydWxlX19YUmVsYXRpb25hbEV4cHJlc3Npb25fX0dyb3VwX18wICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTAzMjozOiAoIHJ1bGVfX1hSZWxhdGlvbmFsRXhwcmVzc2lvbl9fR3JvdXBfXzAgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTEzMToyOiAoICggcnVsZV9fWFJlbGF0aW9uYWxFeHByZXNzaW9uX19Hcm91cF9fMCApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjExMzI6MzogKCBydWxlX19YUmVsYXRpb25hbEV4cHJlc3Npb25fX0dyb3VwX18wICkKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WFJlbGF0aW9uYWxFeHByZXNzaW9uQWNjZXNzKCkuZ2V0R3JvdXAoKSk7IAogICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTAzMzozOiAoIHJ1bGVfX1hSZWxhdGlvbmFsRXhwcmVzc2lvbl9fR3JvdXBfXzAgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTAzMzo0OiBydWxlX19YUmVsYXRpb25hbEV4cHJlc3Npb25fX0dyb3VwX18wCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMTMzOjM6ICggcnVsZV9fWFJlbGF0aW9uYWxFeHByZXNzaW9uX19Hcm91cF9fMCApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMTMzOjQ6IHJ1bGVfX1hSZWxhdGlvbmFsRXhwcmVzc2lvbl9fR3JvdXBfXzAKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzIpOwogICAgICAgICAgICAgcnVsZV9fWFJlbGF0aW9uYWxFeHByZXNzaW9uX19Hcm91cF9fMCgpOwpAQCAtMzQ4OCwxMSArMzg0MiwxMSBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgImVudHJ5UnVsZU9wQ29tcGFyZSIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMDQyOjE6IGVudHJ5UnVsZU9wQ29tcGFyZSA6IHJ1bGVPcENvbXBhcmUgRU9GIDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMTQyOjE6IGVudHJ5UnVsZU9wQ29tcGFyZSA6IHJ1bGVPcENvbXBhcmUgRU9GIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBlbnRyeVJ1bGVPcENvbXBhcmUoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTA0MzoxOiAoIHJ1bGVPcENvbXBhcmUgRU9GICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEwNDQ6MTogcnVsZU9wQ29tcGFyZSBFT0YKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjExNDM6MTogKCBydWxlT3BDb21wYXJlIEVPRiApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMTQ0OjE6IHJ1bGVPcENvbXBhcmUgRU9GCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldE9wQ29tcGFyZVJ1bGUoKSk7IApAQCAtMzUyMiwyMyArMzg3NiwyMyBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVPcENvbXBhcmUiCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTA1MToxOiBydWxlT3BDb21wYXJlIDogKCAoIHJ1bGVfX09wQ29tcGFyZV9fQWx0ZXJuYXRpdmVzICkgKSA7CisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTE1MToxOiBydWxlT3BDb21wYXJlIDogKCAoIHJ1bGVfX09wQ29tcGFyZV9fQWx0ZXJuYXRpdmVzICkgKSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZU9wQ29tcGFyZSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMDU1OjI6ICggKCAoIHJ1bGVfX09wQ29tcGFyZV9fQWx0ZXJuYXRpdmVzICkgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMDU2OjI6ICggKCBydWxlX19PcENvbXBhcmVfX0FsdGVybmF0aXZlcyApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjExNTU6MjogKCAoICggcnVsZV9fT3BDb21wYXJlX19BbHRlcm5hdGl2ZXMgKSApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjExNTY6MjogKCAoIHJ1bGVfX09wQ29tcGFyZV9fQWx0ZXJuYXRpdmVzICkgKQogICAgICAgICAgICAgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTA1NjoyOiAoICggcnVsZV9fT3BDb21wYXJlX19BbHRlcm5hdGl2ZXMgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMDU3OjM6ICggcnVsZV9fT3BDb21wYXJlX19BbHRlcm5hdGl2ZXMgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTE1NjoyOiAoICggcnVsZV9fT3BDb21wYXJlX19BbHRlcm5hdGl2ZXMgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMTU3OjM6ICggcnVsZV9fT3BDb21wYXJlX19BbHRlcm5hdGl2ZXMgKQogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRPcENvbXBhcmVBY2Nlc3MoKS5nZXRBbHRlcm5hdGl2ZXMoKSk7IAogICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTA1ODozOiAoIHJ1bGVfX09wQ29tcGFyZV9fQWx0ZXJuYXRpdmVzICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEwNTg6NDogcnVsZV9fT3BDb21wYXJlX19BbHRlcm5hdGl2ZXMKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjExNTg6MzogKCBydWxlX19PcENvbXBhcmVfX0FsdGVybmF0aXZlcyApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMTU4OjQ6IHJ1bGVfX09wQ29tcGFyZV9fQWx0ZXJuYXRpdmVzCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV18yKTsKICAgICAgICAgICAgIHJ1bGVfX09wQ29tcGFyZV9fQWx0ZXJuYXRpdmVzKCk7CkBAIC0zNTczLDExICszOTI3LDExIEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAiZW50cnlSdWxlWE90aGVyT3BlcmF0b3JFeHByZXNzaW9uIgotICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEwNjc6MTogZW50cnlSdWxlWE90aGVyT3BlcmF0b3JFeHByZXNzaW9uIDogcnVsZVhPdGhlck9wZXJhdG9yRXhwcmVzc2lvbiBFT0YgOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjExNjc6MTogZW50cnlSdWxlWE90aGVyT3BlcmF0b3JFeHByZXNzaW9uIDogcnVsZVhPdGhlck9wZXJhdG9yRXhwcmVzc2lvbiBFT0YgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIGVudHJ5UnVsZVhPdGhlck9wZXJhdG9yRXhwcmVzc2lvbigpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMDY4OjE6ICggcnVsZVhPdGhlck9wZXJhdG9yRXhwcmVzc2lvbiBFT0YgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTA2OToxOiBydWxlWE90aGVyT3BlcmF0b3JFeHByZXNzaW9uIEVPRgorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTE2ODoxOiAoIHJ1bGVYT3RoZXJPcGVyYXRvckV4cHJlc3Npb24gRU9GICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjExNjk6MTogcnVsZVhPdGhlck9wZXJhdG9yRXhwcmVzc2lvbiBFT0YKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WE90aGVyT3BlcmF0b3JFeHByZXNzaW9uUnVsZSgpKTsgCkBAIC0zNjA3LDIzICszOTYxLDIzIEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZVhPdGhlck9wZXJhdG9yRXhwcmVzc2lvbiIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMDc2OjE6IHJ1bGVYT3RoZXJPcGVyYXRvckV4cHJlc3Npb24gOiAoICggcnVsZV9fWE90aGVyT3BlcmF0b3JFeHByZXNzaW9uX19Hcm91cF9fMCApICkgOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjExNzY6MTogcnVsZVhPdGhlck9wZXJhdG9yRXhwcmVzc2lvbiA6ICggKCBydWxlX19YT3RoZXJPcGVyYXRvckV4cHJlc3Npb25fX0dyb3VwX18wICkgKSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZVhPdGhlck9wZXJhdG9yRXhwcmVzc2lvbigpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMDgwOjI6ICggKCAoIHJ1bGVfX1hPdGhlck9wZXJhdG9yRXhwcmVzc2lvbl9fR3JvdXBfXzAgKSApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEwODE6MjogKCAoIHJ1bGVfX1hPdGhlck9wZXJhdG9yRXhwcmVzc2lvbl9fR3JvdXBfXzAgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMTgwOjI6ICggKCAoIHJ1bGVfX1hPdGhlck9wZXJhdG9yRXhwcmVzc2lvbl9fR3JvdXBfXzAgKSApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjExODE6MjogKCAoIHJ1bGVfX1hPdGhlck9wZXJhdG9yRXhwcmVzc2lvbl9fR3JvdXBfXzAgKSApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMDgxOjI6ICggKCBydWxlX19YT3RoZXJPcGVyYXRvckV4cHJlc3Npb25fX0dyb3VwX18wICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTA4MjozOiAoIHJ1bGVfX1hPdGhlck9wZXJhdG9yRXhwcmVzc2lvbl9fR3JvdXBfXzAgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTE4MToyOiAoICggcnVsZV9fWE90aGVyT3BlcmF0b3JFeHByZXNzaW9uX19Hcm91cF9fMCApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjExODI6MzogKCBydWxlX19YT3RoZXJPcGVyYXRvckV4cHJlc3Npb25fX0dyb3VwX18wICkKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WE90aGVyT3BlcmF0b3JFeHByZXNzaW9uQWNjZXNzKCkuZ2V0R3JvdXAoKSk7IAogICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTA4MzozOiAoIHJ1bGVfX1hPdGhlck9wZXJhdG9yRXhwcmVzc2lvbl9fR3JvdXBfXzAgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTA4Mzo0OiBydWxlX19YT3RoZXJPcGVyYXRvckV4cHJlc3Npb25fX0dyb3VwX18wCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMTgzOjM6ICggcnVsZV9fWE90aGVyT3BlcmF0b3JFeHByZXNzaW9uX19Hcm91cF9fMCApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMTgzOjQ6IHJ1bGVfX1hPdGhlck9wZXJhdG9yRXhwcmVzc2lvbl9fR3JvdXBfXzAKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzIpOwogICAgICAgICAgICAgcnVsZV9fWE90aGVyT3BlcmF0b3JFeHByZXNzaW9uX19Hcm91cF9fMCgpOwpAQCAtMzY1OCwxMSArNDAxMiwxMSBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgImVudHJ5UnVsZU9wT3RoZXIiCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTA5MjoxOiBlbnRyeVJ1bGVPcE90aGVyIDogcnVsZU9wT3RoZXIgRU9GIDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMTkyOjE6IGVudHJ5UnVsZU9wT3RoZXIgOiBydWxlT3BPdGhlciBFT0YgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIGVudHJ5UnVsZU9wT3RoZXIoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTA5MzoxOiAoIHJ1bGVPcE90aGVyIEVPRiApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMDk0OjE6IHJ1bGVPcE90aGVyIEVPRgorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTE5MzoxOiAoIHJ1bGVPcE90aGVyIEVPRiApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMTk0OjE6IHJ1bGVPcE90aGVyIEVPRgogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRPcE90aGVyUnVsZSgpKTsgCkBAIC0zNjkyLDIzICs0MDQ2LDIzIEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZU9wT3RoZXIiCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTEwMToxOiBydWxlT3BPdGhlciA6ICggKCBydWxlX19PcE90aGVyX19BbHRlcm5hdGl2ZXMgKSApIDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMjAxOjE6IHJ1bGVPcE90aGVyIDogKCAoIHJ1bGVfX09wT3RoZXJfX0FsdGVybmF0aXZlcyApICkgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVPcE90aGVyKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjExMDU6MjogKCAoICggcnVsZV9fT3BPdGhlcl9fQWx0ZXJuYXRpdmVzICkgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMTA2OjI6ICggKCBydWxlX19PcE90aGVyX19BbHRlcm5hdGl2ZXMgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMjA1OjI6ICggKCAoIHJ1bGVfX09wT3RoZXJfX0FsdGVybmF0aXZlcyApICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTIwNjoyOiAoICggcnVsZV9fT3BPdGhlcl9fQWx0ZXJuYXRpdmVzICkgKQogICAgICAgICAgICAgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTEwNjoyOiAoICggcnVsZV9fT3BPdGhlcl9fQWx0ZXJuYXRpdmVzICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTEwNzozOiAoIHJ1bGVfX09wT3RoZXJfX0FsdGVybmF0aXZlcyApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMjA2OjI6ICggKCBydWxlX19PcE90aGVyX19BbHRlcm5hdGl2ZXMgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMjA3OjM6ICggcnVsZV9fT3BPdGhlcl9fQWx0ZXJuYXRpdmVzICkKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0T3BPdGhlckFjY2VzcygpLmdldEFsdGVybmF0aXZlcygpKTsgCiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMTA4OjM6ICggcnVsZV9fT3BPdGhlcl9fQWx0ZXJuYXRpdmVzICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjExMDg6NDogcnVsZV9fT3BPdGhlcl9fQWx0ZXJuYXRpdmVzCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMjA4OjM6ICggcnVsZV9fT3BPdGhlcl9fQWx0ZXJuYXRpdmVzICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEyMDg6NDogcnVsZV9fT3BPdGhlcl9fQWx0ZXJuYXRpdmVzCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV18yKTsKICAgICAgICAgICAgIHJ1bGVfX09wT3RoZXJfX0FsdGVybmF0aXZlcygpOwpAQCAtMzc0MywxMSArNDA5NywxMSBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgImVudHJ5UnVsZVhBZGRpdGl2ZUV4cHJlc3Npb24iCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTExNzoxOiBlbnRyeVJ1bGVYQWRkaXRpdmVFeHByZXNzaW9uIDogcnVsZVhBZGRpdGl2ZUV4cHJlc3Npb24gRU9GIDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMjE3OjE6IGVudHJ5UnVsZVhBZGRpdGl2ZUV4cHJlc3Npb24gOiBydWxlWEFkZGl0aXZlRXhwcmVzc2lvbiBFT0YgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIGVudHJ5UnVsZVhBZGRpdGl2ZUV4cHJlc3Npb24oKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTExODoxOiAoIHJ1bGVYQWRkaXRpdmVFeHByZXNzaW9uIEVPRiApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMTE5OjE6IHJ1bGVYQWRkaXRpdmVFeHByZXNzaW9uIEVPRgorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTIxODoxOiAoIHJ1bGVYQWRkaXRpdmVFeHByZXNzaW9uIEVPRiApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMjE5OjE6IHJ1bGVYQWRkaXRpdmVFeHByZXNzaW9uIEVPRgogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYQWRkaXRpdmVFeHByZXNzaW9uUnVsZSgpKTsgCkBAIC0zNzc3LDIzICs0MTMxLDIzIEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZVhBZGRpdGl2ZUV4cHJlc3Npb24iCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTEyNjoxOiBydWxlWEFkZGl0aXZlRXhwcmVzc2lvbiA6ICggKCBydWxlX19YQWRkaXRpdmVFeHByZXNzaW9uX19Hcm91cF9fMCApICkgOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEyMjY6MTogcnVsZVhBZGRpdGl2ZUV4cHJlc3Npb24gOiAoICggcnVsZV9fWEFkZGl0aXZlRXhwcmVzc2lvbl9fR3JvdXBfXzAgKSApIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlWEFkZGl0aXZlRXhwcmVzc2lvbigpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMTMwOjI6ICggKCAoIHJ1bGVfX1hBZGRpdGl2ZUV4cHJlc3Npb25fX0dyb3VwX18wICkgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMTMxOjI6ICggKCBydWxlX19YQWRkaXRpdmVFeHByZXNzaW9uX19Hcm91cF9fMCApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEyMzA6MjogKCAoICggcnVsZV9fWEFkZGl0aXZlRXhwcmVzc2lvbl9fR3JvdXBfXzAgKSApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEyMzE6MjogKCAoIHJ1bGVfX1hBZGRpdGl2ZUV4cHJlc3Npb25fX0dyb3VwX18wICkgKQogICAgICAgICAgICAgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTEzMToyOiAoICggcnVsZV9fWEFkZGl0aXZlRXhwcmVzc2lvbl9fR3JvdXBfXzAgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMTMyOjM6ICggcnVsZV9fWEFkZGl0aXZlRXhwcmVzc2lvbl9fR3JvdXBfXzAgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTIzMToyOiAoICggcnVsZV9fWEFkZGl0aXZlRXhwcmVzc2lvbl9fR3JvdXBfXzAgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMjMyOjM6ICggcnVsZV9fWEFkZGl0aXZlRXhwcmVzc2lvbl9fR3JvdXBfXzAgKQogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYQWRkaXRpdmVFeHByZXNzaW9uQWNjZXNzKCkuZ2V0R3JvdXAoKSk7IAogICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTEzMzozOiAoIHJ1bGVfX1hBZGRpdGl2ZUV4cHJlc3Npb25fX0dyb3VwX18wICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjExMzM6NDogcnVsZV9fWEFkZGl0aXZlRXhwcmVzc2lvbl9fR3JvdXBfXzAKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEyMzM6MzogKCBydWxlX19YQWRkaXRpdmVFeHByZXNzaW9uX19Hcm91cF9fMCApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMjMzOjQ6IHJ1bGVfX1hBZGRpdGl2ZUV4cHJlc3Npb25fX0dyb3VwX18wCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV18yKTsKICAgICAgICAgICAgIHJ1bGVfX1hBZGRpdGl2ZUV4cHJlc3Npb25fX0dyb3VwX18wKCk7CkBAIC0zODI4LDExICs0MTgyLDExIEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAiZW50cnlSdWxlT3BBZGQiCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTE0MjoxOiBlbnRyeVJ1bGVPcEFkZCA6IHJ1bGVPcEFkZCBFT0YgOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEyNDI6MTogZW50cnlSdWxlT3BBZGQgOiBydWxlT3BBZGQgRU9GIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBlbnRyeVJ1bGVPcEFkZCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMTQzOjE6ICggcnVsZU9wQWRkIEVPRiApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMTQ0OjE6IHJ1bGVPcEFkZCBFT0YKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEyNDM6MTogKCBydWxlT3BBZGQgRU9GICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEyNDQ6MTogcnVsZU9wQWRkIEVPRgogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRPcEFkZFJ1bGUoKSk7IApAQCAtMzg2MiwyMyArNDIxNiwyMyBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVPcEFkZCIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMTUxOjE6IHJ1bGVPcEFkZCA6ICggKCBydWxlX19PcEFkZF9fQWx0ZXJuYXRpdmVzICkgKSA7CisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTI1MToxOiBydWxlT3BBZGQgOiAoICggcnVsZV9fT3BBZGRfX0FsdGVybmF0aXZlcyApICkgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVPcEFkZCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMTU1OjI6ICggKCAoIHJ1bGVfX09wQWRkX19BbHRlcm5hdGl2ZXMgKSApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjExNTY6MjogKCAoIHJ1bGVfX09wQWRkX19BbHRlcm5hdGl2ZXMgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMjU1OjI6ICggKCAoIHJ1bGVfX09wQWRkX19BbHRlcm5hdGl2ZXMgKSApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEyNTY6MjogKCAoIHJ1bGVfX09wQWRkX19BbHRlcm5hdGl2ZXMgKSApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMTU2OjI6ICggKCBydWxlX19PcEFkZF9fQWx0ZXJuYXRpdmVzICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTE1NzozOiAoIHJ1bGVfX09wQWRkX19BbHRlcm5hdGl2ZXMgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTI1NjoyOiAoICggcnVsZV9fT3BBZGRfX0FsdGVybmF0aXZlcyApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEyNTc6MzogKCBydWxlX19PcEFkZF9fQWx0ZXJuYXRpdmVzICkKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0T3BBZGRBY2Nlc3MoKS5nZXRBbHRlcm5hdGl2ZXMoKSk7IAogICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTE1ODozOiAoIHJ1bGVfX09wQWRkX19BbHRlcm5hdGl2ZXMgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTE1ODo0OiBydWxlX19PcEFkZF9fQWx0ZXJuYXRpdmVzCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMjU4OjM6ICggcnVsZV9fT3BBZGRfX0FsdGVybmF0aXZlcyApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMjU4OjQ6IHJ1bGVfX09wQWRkX19BbHRlcm5hdGl2ZXMKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzIpOwogICAgICAgICAgICAgcnVsZV9fT3BBZGRfX0FsdGVybmF0aXZlcygpOwpAQCAtMzkxMywxMSArNDI2NywxMSBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgImVudHJ5UnVsZVhNdWx0aXBsaWNhdGl2ZUV4cHJlc3Npb24iCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTE2NzoxOiBlbnRyeVJ1bGVYTXVsdGlwbGljYXRpdmVFeHByZXNzaW9uIDogcnVsZVhNdWx0aXBsaWNhdGl2ZUV4cHJlc3Npb24gRU9GIDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMjY3OjE6IGVudHJ5UnVsZVhNdWx0aXBsaWNhdGl2ZUV4cHJlc3Npb24gOiBydWxlWE11bHRpcGxpY2F0aXZlRXhwcmVzc2lvbiBFT0YgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIGVudHJ5UnVsZVhNdWx0aXBsaWNhdGl2ZUV4cHJlc3Npb24oKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTE2ODoxOiAoIHJ1bGVYTXVsdGlwbGljYXRpdmVFeHByZXNzaW9uIEVPRiApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMTY5OjE6IHJ1bGVYTXVsdGlwbGljYXRpdmVFeHByZXNzaW9uIEVPRgorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTI2ODoxOiAoIHJ1bGVYTXVsdGlwbGljYXRpdmVFeHByZXNzaW9uIEVPRiApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMjY5OjE6IHJ1bGVYTXVsdGlwbGljYXRpdmVFeHByZXNzaW9uIEVPRgogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYTXVsdGlwbGljYXRpdmVFeHByZXNzaW9uUnVsZSgpKTsgCkBAIC0zOTQ3LDIzICs0MzAxLDIzIEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZVhNdWx0aXBsaWNhdGl2ZUV4cHJlc3Npb24iCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTE3NjoxOiBydWxlWE11bHRpcGxpY2F0aXZlRXhwcmVzc2lvbiA6ICggKCBydWxlX19YTXVsdGlwbGljYXRpdmVFeHByZXNzaW9uX19Hcm91cF9fMCApICkgOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEyNzY6MTogcnVsZVhNdWx0aXBsaWNhdGl2ZUV4cHJlc3Npb24gOiAoICggcnVsZV9fWE11bHRpcGxpY2F0aXZlRXhwcmVzc2lvbl9fR3JvdXBfXzAgKSApIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlWE11bHRpcGxpY2F0aXZlRXhwcmVzc2lvbigpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMTgwOjI6ICggKCAoIHJ1bGVfX1hNdWx0aXBsaWNhdGl2ZUV4cHJlc3Npb25fX0dyb3VwX18wICkgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMTgxOjI6ICggKCBydWxlX19YTXVsdGlwbGljYXRpdmVFeHByZXNzaW9uX19Hcm91cF9fMCApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEyODA6MjogKCAoICggcnVsZV9fWE11bHRpcGxpY2F0aXZlRXhwcmVzc2lvbl9fR3JvdXBfXzAgKSApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEyODE6MjogKCAoIHJ1bGVfX1hNdWx0aXBsaWNhdGl2ZUV4cHJlc3Npb25fX0dyb3VwX18wICkgKQogICAgICAgICAgICAgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTE4MToyOiAoICggcnVsZV9fWE11bHRpcGxpY2F0aXZlRXhwcmVzc2lvbl9fR3JvdXBfXzAgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMTgyOjM6ICggcnVsZV9fWE11bHRpcGxpY2F0aXZlRXhwcmVzc2lvbl9fR3JvdXBfXzAgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTI4MToyOiAoICggcnVsZV9fWE11bHRpcGxpY2F0aXZlRXhwcmVzc2lvbl9fR3JvdXBfXzAgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMjgyOjM6ICggcnVsZV9fWE11bHRpcGxpY2F0aXZlRXhwcmVzc2lvbl9fR3JvdXBfXzAgKQogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYTXVsdGlwbGljYXRpdmVFeHByZXNzaW9uQWNjZXNzKCkuZ2V0R3JvdXAoKSk7IAogICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTE4MzozOiAoIHJ1bGVfX1hNdWx0aXBsaWNhdGl2ZUV4cHJlc3Npb25fX0dyb3VwX18wICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjExODM6NDogcnVsZV9fWE11bHRpcGxpY2F0aXZlRXhwcmVzc2lvbl9fR3JvdXBfXzAKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEyODM6MzogKCBydWxlX19YTXVsdGlwbGljYXRpdmVFeHByZXNzaW9uX19Hcm91cF9fMCApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMjgzOjQ6IHJ1bGVfX1hNdWx0aXBsaWNhdGl2ZUV4cHJlc3Npb25fX0dyb3VwX18wCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV18yKTsKICAgICAgICAgICAgIHJ1bGVfX1hNdWx0aXBsaWNhdGl2ZUV4cHJlc3Npb25fX0dyb3VwX18wKCk7CkBAIC0zOTk4LDExICs0MzUyLDExIEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAiZW50cnlSdWxlT3BNdWx0aSIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMTkyOjE6IGVudHJ5UnVsZU9wTXVsdGkgOiBydWxlT3BNdWx0aSBFT0YgOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEyOTI6MTogZW50cnlSdWxlT3BNdWx0aSA6IHJ1bGVPcE11bHRpIEVPRiA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgZW50cnlSdWxlT3BNdWx0aSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMTkzOjE6ICggcnVsZU9wTXVsdGkgRU9GICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjExOTQ6MTogcnVsZU9wTXVsdGkgRU9GCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMjkzOjE6ICggcnVsZU9wTXVsdGkgRU9GICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEyOTQ6MTogcnVsZU9wTXVsdGkgRU9GCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldE9wTXVsdGlSdWxlKCkpOyAKQEAgLTQwMzIsMjMgKzQzODYsMjMgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlT3BNdWx0aSIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMjAxOjE6IHJ1bGVPcE11bHRpIDogKCAoIHJ1bGVfX09wTXVsdGlfX0FsdGVybmF0aXZlcyApICkgOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEzMDE6MTogcnVsZU9wTXVsdGkgOiAoICggcnVsZV9fT3BNdWx0aV9fQWx0ZXJuYXRpdmVzICkgKSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZU9wTXVsdGkoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTIwNToyOiAoICggKCBydWxlX19PcE11bHRpX19BbHRlcm5hdGl2ZXMgKSApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEyMDY6MjogKCAoIHJ1bGVfX09wTXVsdGlfX0FsdGVybmF0aXZlcyApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEzMDU6MjogKCAoICggcnVsZV9fT3BNdWx0aV9fQWx0ZXJuYXRpdmVzICkgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMzA2OjI6ICggKCBydWxlX19PcE11bHRpX19BbHRlcm5hdGl2ZXMgKSApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMjA2OjI6ICggKCBydWxlX19PcE11bHRpX19BbHRlcm5hdGl2ZXMgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMjA3OjM6ICggcnVsZV9fT3BNdWx0aV9fQWx0ZXJuYXRpdmVzICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEzMDY6MjogKCAoIHJ1bGVfX09wTXVsdGlfX0FsdGVybmF0aXZlcyApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEzMDc6MzogKCBydWxlX19PcE11bHRpX19BbHRlcm5hdGl2ZXMgKQogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRPcE11bHRpQWNjZXNzKCkuZ2V0QWx0ZXJuYXRpdmVzKCkpOyAKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEyMDg6MzogKCBydWxlX19PcE11bHRpX19BbHRlcm5hdGl2ZXMgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTIwODo0OiBydWxlX19PcE11bHRpX19BbHRlcm5hdGl2ZXMKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEzMDg6MzogKCBydWxlX19PcE11bHRpX19BbHRlcm5hdGl2ZXMgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTMwODo0OiBydWxlX19PcE11bHRpX19BbHRlcm5hdGl2ZXMKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzIpOwogICAgICAgICAgICAgcnVsZV9fT3BNdWx0aV9fQWx0ZXJuYXRpdmVzKCk7CkBAIC00MDgzLDExICs0NDM3LDExIEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAiZW50cnlSdWxlWFVuYXJ5T3BlcmF0aW9uIgotICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEyMTc6MTogZW50cnlSdWxlWFVuYXJ5T3BlcmF0aW9uIDogcnVsZVhVbmFyeU9wZXJhdGlvbiBFT0YgOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEzMTc6MTogZW50cnlSdWxlWFVuYXJ5T3BlcmF0aW9uIDogcnVsZVhVbmFyeU9wZXJhdGlvbiBFT0YgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIGVudHJ5UnVsZVhVbmFyeU9wZXJhdGlvbigpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMjE4OjE6ICggcnVsZVhVbmFyeU9wZXJhdGlvbiBFT0YgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTIxOToxOiBydWxlWFVuYXJ5T3BlcmF0aW9uIEVPRgorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTMxODoxOiAoIHJ1bGVYVW5hcnlPcGVyYXRpb24gRU9GICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEzMTk6MTogcnVsZVhVbmFyeU9wZXJhdGlvbiBFT0YKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WFVuYXJ5T3BlcmF0aW9uUnVsZSgpKTsgCkBAIC00MTE3LDIzICs0NDcxLDIzIEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZVhVbmFyeU9wZXJhdGlvbiIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMjI2OjE6IHJ1bGVYVW5hcnlPcGVyYXRpb24gOiAoICggcnVsZV9fWFVuYXJ5T3BlcmF0aW9uX19BbHRlcm5hdGl2ZXMgKSApIDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMzI2OjE6IHJ1bGVYVW5hcnlPcGVyYXRpb24gOiAoICggcnVsZV9fWFVuYXJ5T3BlcmF0aW9uX19BbHRlcm5hdGl2ZXMgKSApIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlWFVuYXJ5T3BlcmF0aW9uKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEyMzA6MjogKCAoICggcnVsZV9fWFVuYXJ5T3BlcmF0aW9uX19BbHRlcm5hdGl2ZXMgKSApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEyMzE6MjogKCAoIHJ1bGVfX1hVbmFyeU9wZXJhdGlvbl9fQWx0ZXJuYXRpdmVzICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTMzMDoyOiAoICggKCBydWxlX19YVW5hcnlPcGVyYXRpb25fX0FsdGVybmF0aXZlcyApICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTMzMToyOiAoICggcnVsZV9fWFVuYXJ5T3BlcmF0aW9uX19BbHRlcm5hdGl2ZXMgKSApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMjMxOjI6ICggKCBydWxlX19YVW5hcnlPcGVyYXRpb25fX0FsdGVybmF0aXZlcyApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEyMzI6MzogKCBydWxlX19YVW5hcnlPcGVyYXRpb25fX0FsdGVybmF0aXZlcyApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMzMxOjI6ICggKCBydWxlX19YVW5hcnlPcGVyYXRpb25fX0FsdGVybmF0aXZlcyApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEzMzI6MzogKCBydWxlX19YVW5hcnlPcGVyYXRpb25fX0FsdGVybmF0aXZlcyApCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhVbmFyeU9wZXJhdGlvbkFjY2VzcygpLmdldEFsdGVybmF0aXZlcygpKTsgCiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMjMzOjM6ICggcnVsZV9fWFVuYXJ5T3BlcmF0aW9uX19BbHRlcm5hdGl2ZXMgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTIzMzo0OiBydWxlX19YVW5hcnlPcGVyYXRpb25fX0FsdGVybmF0aXZlcworICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTMzMzozOiAoIHJ1bGVfX1hVbmFyeU9wZXJhdGlvbl9fQWx0ZXJuYXRpdmVzICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEzMzM6NDogcnVsZV9fWFVuYXJ5T3BlcmF0aW9uX19BbHRlcm5hdGl2ZXMKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzIpOwogICAgICAgICAgICAgcnVsZV9fWFVuYXJ5T3BlcmF0aW9uX19BbHRlcm5hdGl2ZXMoKTsKQEAgLTQxNjgsMTEgKzQ1MjIsMTEgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJlbnRyeVJ1bGVPcFVuYXJ5IgotICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEyNDI6MTogZW50cnlSdWxlT3BVbmFyeSA6IHJ1bGVPcFVuYXJ5IEVPRiA7CisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTM0MjoxOiBlbnRyeVJ1bGVPcFVuYXJ5IDogcnVsZU9wVW5hcnkgRU9GIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBlbnRyeVJ1bGVPcFVuYXJ5KCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEyNDM6MTogKCBydWxlT3BVbmFyeSBFT0YgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTI0NDoxOiBydWxlT3BVbmFyeSBFT0YKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEzNDM6MTogKCBydWxlT3BVbmFyeSBFT0YgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTM0NDoxOiBydWxlT3BVbmFyeSBFT0YKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0T3BVbmFyeVJ1bGUoKSk7IApAQCAtNDIwMiwyMyArNDU1NiwyMyBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVPcFVuYXJ5IgotICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEyNTE6MTogcnVsZU9wVW5hcnkgOiAoICggcnVsZV9fT3BVbmFyeV9fQWx0ZXJuYXRpdmVzICkgKSA7CisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTM1MToxOiBydWxlT3BVbmFyeSA6ICggKCBydWxlX19PcFVuYXJ5X19BbHRlcm5hdGl2ZXMgKSApIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlT3BVbmFyeSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMjU1OjI6ICggKCAoIHJ1bGVfX09wVW5hcnlfX0FsdGVybmF0aXZlcyApICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTI1NjoyOiAoICggcnVsZV9fT3BVbmFyeV9fQWx0ZXJuYXRpdmVzICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTM1NToyOiAoICggKCBydWxlX19PcFVuYXJ5X19BbHRlcm5hdGl2ZXMgKSApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEzNTY6MjogKCAoIHJ1bGVfX09wVW5hcnlfX0FsdGVybmF0aXZlcyApICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEyNTY6MjogKCAoIHJ1bGVfX09wVW5hcnlfX0FsdGVybmF0aXZlcyApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEyNTc6MzogKCBydWxlX19PcFVuYXJ5X19BbHRlcm5hdGl2ZXMgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTM1NjoyOiAoICggcnVsZV9fT3BVbmFyeV9fQWx0ZXJuYXRpdmVzICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTM1NzozOiAoIHJ1bGVfX09wVW5hcnlfX0FsdGVybmF0aXZlcyApCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldE9wVW5hcnlBY2Nlc3MoKS5nZXRBbHRlcm5hdGl2ZXMoKSk7IAogICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTI1ODozOiAoIHJ1bGVfX09wVW5hcnlfX0FsdGVybmF0aXZlcyApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMjU4OjQ6IHJ1bGVfX09wVW5hcnlfX0FsdGVybmF0aXZlcworICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTM1ODozOiAoIHJ1bGVfX09wVW5hcnlfX0FsdGVybmF0aXZlcyApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMzU4OjQ6IHJ1bGVfX09wVW5hcnlfX0FsdGVybmF0aXZlcwogICAgICAgICAgICAgewogICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMik7CiAgICAgICAgICAgICBydWxlX19PcFVuYXJ5X19BbHRlcm5hdGl2ZXMoKTsKQEAgLTQyNTMsMTEgKzQ2MDcsMTEgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJlbnRyeVJ1bGVYQ2FzdGVkRXhwcmVzc2lvbiIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMjY3OjE6IGVudHJ5UnVsZVhDYXN0ZWRFeHByZXNzaW9uIDogcnVsZVhDYXN0ZWRFeHByZXNzaW9uIEVPRiA7CisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTM2NzoxOiBlbnRyeVJ1bGVYQ2FzdGVkRXhwcmVzc2lvbiA6IHJ1bGVYQ2FzdGVkRXhwcmVzc2lvbiBFT0YgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIGVudHJ5UnVsZVhDYXN0ZWRFeHByZXNzaW9uKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEyNjg6MTogKCBydWxlWENhc3RlZEV4cHJlc3Npb24gRU9GICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEyNjk6MTogcnVsZVhDYXN0ZWRFeHByZXNzaW9uIEVPRgorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTM2ODoxOiAoIHJ1bGVYQ2FzdGVkRXhwcmVzc2lvbiBFT0YgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTM2OToxOiBydWxlWENhc3RlZEV4cHJlc3Npb24gRU9GCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhDYXN0ZWRFeHByZXNzaW9uUnVsZSgpKTsgCkBAIC00Mjg3LDIzICs0NjQxLDIzIEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZVhDYXN0ZWRFeHByZXNzaW9uIgotICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEyNzY6MTogcnVsZVhDYXN0ZWRFeHByZXNzaW9uIDogKCAoIHJ1bGVfX1hDYXN0ZWRFeHByZXNzaW9uX19Hcm91cF9fMCApICkgOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEzNzY6MTogcnVsZVhDYXN0ZWRFeHByZXNzaW9uIDogKCAoIHJ1bGVfX1hDYXN0ZWRFeHByZXNzaW9uX19Hcm91cF9fMCApICkgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVYQ2FzdGVkRXhwcmVzc2lvbigpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMjgwOjI6ICggKCAoIHJ1bGVfX1hDYXN0ZWRFeHByZXNzaW9uX19Hcm91cF9fMCApICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTI4MToyOiAoICggcnVsZV9fWENhc3RlZEV4cHJlc3Npb25fX0dyb3VwX18wICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTM4MDoyOiAoICggKCBydWxlX19YQ2FzdGVkRXhwcmVzc2lvbl9fR3JvdXBfXzAgKSApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEzODE6MjogKCAoIHJ1bGVfX1hDYXN0ZWRFeHByZXNzaW9uX19Hcm91cF9fMCApICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEyODE6MjogKCAoIHJ1bGVfX1hDYXN0ZWRFeHByZXNzaW9uX19Hcm91cF9fMCApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEyODI6MzogKCBydWxlX19YQ2FzdGVkRXhwcmVzc2lvbl9fR3JvdXBfXzAgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTM4MToyOiAoICggcnVsZV9fWENhc3RlZEV4cHJlc3Npb25fX0dyb3VwX18wICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTM4MjozOiAoIHJ1bGVfX1hDYXN0ZWRFeHByZXNzaW9uX19Hcm91cF9fMCApCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhDYXN0ZWRFeHByZXNzaW9uQWNjZXNzKCkuZ2V0R3JvdXAoKSk7IAogICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTI4MzozOiAoIHJ1bGVfX1hDYXN0ZWRFeHByZXNzaW9uX19Hcm91cF9fMCApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMjgzOjQ6IHJ1bGVfX1hDYXN0ZWRFeHByZXNzaW9uX19Hcm91cF9fMAorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTM4MzozOiAoIHJ1bGVfX1hDYXN0ZWRFeHByZXNzaW9uX19Hcm91cF9fMCApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMzgzOjQ6IHJ1bGVfX1hDYXN0ZWRFeHByZXNzaW9uX19Hcm91cF9fMAogICAgICAgICAgICAgewogICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMik7CiAgICAgICAgICAgICBydWxlX19YQ2FzdGVkRXhwcmVzc2lvbl9fR3JvdXBfXzAoKTsKQEAgLTQzMzgsMTEgKzQ2OTIsMTEgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJlbnRyeVJ1bGVYUG9zdGZpeE9wZXJhdGlvbiIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMjkyOjE6IGVudHJ5UnVsZVhQb3N0Zml4T3BlcmF0aW9uIDogcnVsZVhQb3N0Zml4T3BlcmF0aW9uIEVPRiA7CisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTM5MjoxOiBlbnRyeVJ1bGVYUG9zdGZpeE9wZXJhdGlvbiA6IHJ1bGVYUG9zdGZpeE9wZXJhdGlvbiBFT0YgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIGVudHJ5UnVsZVhQb3N0Zml4T3BlcmF0aW9uKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEyOTM6MTogKCBydWxlWFBvc3RmaXhPcGVyYXRpb24gRU9GICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEyOTQ6MTogcnVsZVhQb3N0Zml4T3BlcmF0aW9uIEVPRgorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTM5MzoxOiAoIHJ1bGVYUG9zdGZpeE9wZXJhdGlvbiBFT0YgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTM5NDoxOiBydWxlWFBvc3RmaXhPcGVyYXRpb24gRU9GCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhQb3N0Zml4T3BlcmF0aW9uUnVsZSgpKTsgCkBAIC00MzcyLDIzICs0NzI2LDIzIEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZVhQb3N0Zml4T3BlcmF0aW9uIgotICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEzMDE6MTogcnVsZVhQb3N0Zml4T3BlcmF0aW9uIDogKCAoIHJ1bGVfX1hQb3N0Zml4T3BlcmF0aW9uX19Hcm91cF9fMCApICkgOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE0MDE6MTogcnVsZVhQb3N0Zml4T3BlcmF0aW9uIDogKCAoIHJ1bGVfX1hQb3N0Zml4T3BlcmF0aW9uX19Hcm91cF9fMCApICkgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVYUG9zdGZpeE9wZXJhdGlvbigpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMzA1OjI6ICggKCAoIHJ1bGVfX1hQb3N0Zml4T3BlcmF0aW9uX19Hcm91cF9fMCApICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTMwNjoyOiAoICggcnVsZV9fWFBvc3RmaXhPcGVyYXRpb25fX0dyb3VwX18wICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTQwNToyOiAoICggKCBydWxlX19YUG9zdGZpeE9wZXJhdGlvbl9fR3JvdXBfXzAgKSApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE0MDY6MjogKCAoIHJ1bGVfX1hQb3N0Zml4T3BlcmF0aW9uX19Hcm91cF9fMCApICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEzMDY6MjogKCAoIHJ1bGVfX1hQb3N0Zml4T3BlcmF0aW9uX19Hcm91cF9fMCApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEzMDc6MzogKCBydWxlX19YUG9zdGZpeE9wZXJhdGlvbl9fR3JvdXBfXzAgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTQwNjoyOiAoICggcnVsZV9fWFBvc3RmaXhPcGVyYXRpb25fX0dyb3VwX18wICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTQwNzozOiAoIHJ1bGVfX1hQb3N0Zml4T3BlcmF0aW9uX19Hcm91cF9fMCApCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhQb3N0Zml4T3BlcmF0aW9uQWNjZXNzKCkuZ2V0R3JvdXAoKSk7IAogICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTMwODozOiAoIHJ1bGVfX1hQb3N0Zml4T3BlcmF0aW9uX19Hcm91cF9fMCApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMzA4OjQ6IHJ1bGVfX1hQb3N0Zml4T3BlcmF0aW9uX19Hcm91cF9fMAorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTQwODozOiAoIHJ1bGVfX1hQb3N0Zml4T3BlcmF0aW9uX19Hcm91cF9fMCApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNDA4OjQ6IHJ1bGVfX1hQb3N0Zml4T3BlcmF0aW9uX19Hcm91cF9fMAogICAgICAgICAgICAgewogICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMik7CiAgICAgICAgICAgICBydWxlX19YUG9zdGZpeE9wZXJhdGlvbl9fR3JvdXBfXzAoKTsKQEAgLTQ0MjMsMTEgKzQ3NzcsMTEgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJlbnRyeVJ1bGVPcFBvc3RmaXgiCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTMxNzoxOiBlbnRyeVJ1bGVPcFBvc3RmaXggOiBydWxlT3BQb3N0Zml4IEVPRiA7CisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTQxNzoxOiBlbnRyeVJ1bGVPcFBvc3RmaXggOiBydWxlT3BQb3N0Zml4IEVPRiA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgZW50cnlSdWxlT3BQb3N0Zml4KCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEzMTg6MTogKCBydWxlT3BQb3N0Zml4IEVPRiApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMzE5OjE6IHJ1bGVPcFBvc3RmaXggRU9GCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNDE4OjE6ICggcnVsZU9wUG9zdGZpeCBFT0YgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTQxOToxOiBydWxlT3BQb3N0Zml4IEVPRgogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRPcFBvc3RmaXhSdWxlKCkpOyAKQEAgLTQ0NTcsMjMgKzQ4MTEsMjMgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlT3BQb3N0Zml4IgotICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEzMjY6MTogcnVsZU9wUG9zdGZpeCA6ICggKCBydWxlX19PcFBvc3RmaXhfX0FsdGVybmF0aXZlcyApICkgOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE0MjY6MTogcnVsZU9wUG9zdGZpeCA6ICggKCBydWxlX19PcFBvc3RmaXhfX0FsdGVybmF0aXZlcyApICkgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVPcFBvc3RmaXgoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTMzMDoyOiAoICggKCBydWxlX19PcFBvc3RmaXhfX0FsdGVybmF0aXZlcyApICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTMzMToyOiAoICggcnVsZV9fT3BQb3N0Zml4X19BbHRlcm5hdGl2ZXMgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNDMwOjI6ICggKCAoIHJ1bGVfX09wUG9zdGZpeF9fQWx0ZXJuYXRpdmVzICkgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNDMxOjI6ICggKCBydWxlX19PcFBvc3RmaXhfX0FsdGVybmF0aXZlcyApICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEzMzE6MjogKCAoIHJ1bGVfX09wUG9zdGZpeF9fQWx0ZXJuYXRpdmVzICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTMzMjozOiAoIHJ1bGVfX09wUG9zdGZpeF9fQWx0ZXJuYXRpdmVzICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE0MzE6MjogKCAoIHJ1bGVfX09wUG9zdGZpeF9fQWx0ZXJuYXRpdmVzICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTQzMjozOiAoIHJ1bGVfX09wUG9zdGZpeF9fQWx0ZXJuYXRpdmVzICkKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0T3BQb3N0Zml4QWNjZXNzKCkuZ2V0QWx0ZXJuYXRpdmVzKCkpOyAKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEzMzM6MzogKCBydWxlX19PcFBvc3RmaXhfX0FsdGVybmF0aXZlcyApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMzMzOjQ6IHJ1bGVfX09wUG9zdGZpeF9fQWx0ZXJuYXRpdmVzCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNDMzOjM6ICggcnVsZV9fT3BQb3N0Zml4X19BbHRlcm5hdGl2ZXMgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTQzMzo0OiBydWxlX19PcFBvc3RmaXhfX0FsdGVybmF0aXZlcwogICAgICAgICAgICAgewogICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMik7CiAgICAgICAgICAgICBydWxlX19PcFBvc3RmaXhfX0FsdGVybmF0aXZlcygpOwpAQCAtNDUwOCwxMSArNDg2MiwxMSBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgImVudHJ5UnVsZVhNZW1iZXJGZWF0dXJlQ2FsbCIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMzQyOjE6IGVudHJ5UnVsZVhNZW1iZXJGZWF0dXJlQ2FsbCA6IHJ1bGVYTWVtYmVyRmVhdHVyZUNhbGwgRU9GIDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNDQyOjE6IGVudHJ5UnVsZVhNZW1iZXJGZWF0dXJlQ2FsbCA6IHJ1bGVYTWVtYmVyRmVhdHVyZUNhbGwgRU9GIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBlbnRyeVJ1bGVYTWVtYmVyRmVhdHVyZUNhbGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTM0MzoxOiAoIHJ1bGVYTWVtYmVyRmVhdHVyZUNhbGwgRU9GICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEzNDQ6MTogcnVsZVhNZW1iZXJGZWF0dXJlQ2FsbCBFT0YKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE0NDM6MTogKCBydWxlWE1lbWJlckZlYXR1cmVDYWxsIEVPRiApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNDQ0OjE6IHJ1bGVYTWVtYmVyRmVhdHVyZUNhbGwgRU9GCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhNZW1iZXJGZWF0dXJlQ2FsbFJ1bGUoKSk7IApAQCAtNDU0MiwyMyArNDg5NiwyMyBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVYTWVtYmVyRmVhdHVyZUNhbGwiCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTM1MToxOiBydWxlWE1lbWJlckZlYXR1cmVDYWxsIDogKCAoIHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fR3JvdXBfXzAgKSApIDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNDUxOjE6IHJ1bGVYTWVtYmVyRmVhdHVyZUNhbGwgOiAoICggcnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19Hcm91cF9fMCApICkgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVYTWVtYmVyRmVhdHVyZUNhbGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTM1NToyOiAoICggKCBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX0dyb3VwX18wICkgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMzU2OjI6ICggKCBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX0dyb3VwX18wICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTQ1NToyOiAoICggKCBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX0dyb3VwX18wICkgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNDU2OjI6ICggKCBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX0dyb3VwX18wICkgKQogICAgICAgICAgICAgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTM1NjoyOiAoICggcnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19Hcm91cF9fMCApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEzNTc6MzogKCBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX0dyb3VwX18wICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE0NTY6MjogKCAoIHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fR3JvdXBfXzAgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNDU3OjM6ICggcnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19Hcm91cF9fMCApCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhNZW1iZXJGZWF0dXJlQ2FsbEFjY2VzcygpLmdldEdyb3VwKCkpOyAKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEzNTg6MzogKCBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX0dyb3VwX18wICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEzNTg6NDogcnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19Hcm91cF9fMAorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTQ1ODozOiAoIHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fR3JvdXBfXzAgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTQ1ODo0OiBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX0dyb3VwX18wCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV18yKTsKICAgICAgICAgICAgIHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fR3JvdXBfXzAoKTsKQEAgLTQ1OTMsMTEgKzQ5NDcsMTEgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJlbnRyeVJ1bGVYUHJpbWFyeUV4cHJlc3Npb24iCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTM2NzoxOiBlbnRyeVJ1bGVYUHJpbWFyeUV4cHJlc3Npb24gOiBydWxlWFByaW1hcnlFeHByZXNzaW9uIEVPRiA7CisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTQ2NzoxOiBlbnRyeVJ1bGVYUHJpbWFyeUV4cHJlc3Npb24gOiBydWxlWFByaW1hcnlFeHByZXNzaW9uIEVPRiA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgZW50cnlSdWxlWFByaW1hcnlFeHByZXNzaW9uKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEzNjg6MTogKCBydWxlWFByaW1hcnlFeHByZXNzaW9uIEVPRiApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMzY5OjE6IHJ1bGVYUHJpbWFyeUV4cHJlc3Npb24gRU9GCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNDY4OjE6ICggcnVsZVhQcmltYXJ5RXhwcmVzc2lvbiBFT0YgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTQ2OToxOiBydWxlWFByaW1hcnlFeHByZXNzaW9uIEVPRgogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYUHJpbWFyeUV4cHJlc3Npb25SdWxlKCkpOyAKQEAgLTQ2MjcsMjMgKzQ5ODEsMjMgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlWFByaW1hcnlFeHByZXNzaW9uIgotICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEzNzY6MTogcnVsZVhQcmltYXJ5RXhwcmVzc2lvbiA6ICggKCBydWxlX19YUHJpbWFyeUV4cHJlc3Npb25fX0FsdGVybmF0aXZlcyApICkgOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE0NzY6MTogcnVsZVhQcmltYXJ5RXhwcmVzc2lvbiA6ICggKCBydWxlX19YUHJpbWFyeUV4cHJlc3Npb25fX0FsdGVybmF0aXZlcyApICkgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVYUHJpbWFyeUV4cHJlc3Npb24oKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTM4MDoyOiAoICggKCBydWxlX19YUHJpbWFyeUV4cHJlc3Npb25fX0FsdGVybmF0aXZlcyApICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTM4MToyOiAoICggcnVsZV9fWFByaW1hcnlFeHByZXNzaW9uX19BbHRlcm5hdGl2ZXMgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNDgwOjI6ICggKCAoIHJ1bGVfX1hQcmltYXJ5RXhwcmVzc2lvbl9fQWx0ZXJuYXRpdmVzICkgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNDgxOjI6ICggKCBydWxlX19YUHJpbWFyeUV4cHJlc3Npb25fX0FsdGVybmF0aXZlcyApICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEzODE6MjogKCAoIHJ1bGVfX1hQcmltYXJ5RXhwcmVzc2lvbl9fQWx0ZXJuYXRpdmVzICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTM4MjozOiAoIHJ1bGVfX1hQcmltYXJ5RXhwcmVzc2lvbl9fQWx0ZXJuYXRpdmVzICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE0ODE6MjogKCAoIHJ1bGVfX1hQcmltYXJ5RXhwcmVzc2lvbl9fQWx0ZXJuYXRpdmVzICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTQ4MjozOiAoIHJ1bGVfX1hQcmltYXJ5RXhwcmVzc2lvbl9fQWx0ZXJuYXRpdmVzICkKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WFByaW1hcnlFeHByZXNzaW9uQWNjZXNzKCkuZ2V0QWx0ZXJuYXRpdmVzKCkpOyAKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEzODM6MzogKCBydWxlX19YUHJpbWFyeUV4cHJlc3Npb25fX0FsdGVybmF0aXZlcyApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMzgzOjQ6IHJ1bGVfX1hQcmltYXJ5RXhwcmVzc2lvbl9fQWx0ZXJuYXRpdmVzCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNDgzOjM6ICggcnVsZV9fWFByaW1hcnlFeHByZXNzaW9uX19BbHRlcm5hdGl2ZXMgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTQ4Mzo0OiBydWxlX19YUHJpbWFyeUV4cHJlc3Npb25fX0FsdGVybmF0aXZlcwogICAgICAgICAgICAgewogICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMik7CiAgICAgICAgICAgICBydWxlX19YUHJpbWFyeUV4cHJlc3Npb25fX0FsdGVybmF0aXZlcygpOwpAQCAtNDY3OCwxMSArNTAzMiwxMSBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgImVudHJ5UnVsZVhMaXRlcmFsIgotICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEzOTI6MTogZW50cnlSdWxlWExpdGVyYWwgOiBydWxlWExpdGVyYWwgRU9GIDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNDkyOjE6IGVudHJ5UnVsZVhMaXRlcmFsIDogcnVsZVhMaXRlcmFsIEVPRiA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgZW50cnlSdWxlWExpdGVyYWwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTM5MzoxOiAoIHJ1bGVYTGl0ZXJhbCBFT0YgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTM5NDoxOiBydWxlWExpdGVyYWwgRU9GCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNDkzOjE6ICggcnVsZVhMaXRlcmFsIEVPRiApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNDk0OjE6IHJ1bGVYTGl0ZXJhbCBFT0YKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WExpdGVyYWxSdWxlKCkpOyAKQEAgLTQ3MTIsMjMgKzUwNjYsMjMgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlWExpdGVyYWwiCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTQwMToxOiBydWxlWExpdGVyYWwgOiAoICggcnVsZV9fWExpdGVyYWxfX0FsdGVybmF0aXZlcyApICkgOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE1MDE6MTogcnVsZVhMaXRlcmFsIDogKCAoIHJ1bGVfX1hMaXRlcmFsX19BbHRlcm5hdGl2ZXMgKSApIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlWExpdGVyYWwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTQwNToyOiAoICggKCBydWxlX19YTGl0ZXJhbF9fQWx0ZXJuYXRpdmVzICkgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNDA2OjI6ICggKCBydWxlX19YTGl0ZXJhbF9fQWx0ZXJuYXRpdmVzICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTUwNToyOiAoICggKCBydWxlX19YTGl0ZXJhbF9fQWx0ZXJuYXRpdmVzICkgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNTA2OjI6ICggKCBydWxlX19YTGl0ZXJhbF9fQWx0ZXJuYXRpdmVzICkgKQogICAgICAgICAgICAgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTQwNjoyOiAoICggcnVsZV9fWExpdGVyYWxfX0FsdGVybmF0aXZlcyApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE0MDc6MzogKCBydWxlX19YTGl0ZXJhbF9fQWx0ZXJuYXRpdmVzICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE1MDY6MjogKCAoIHJ1bGVfX1hMaXRlcmFsX19BbHRlcm5hdGl2ZXMgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNTA3OjM6ICggcnVsZV9fWExpdGVyYWxfX0FsdGVybmF0aXZlcyApCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhMaXRlcmFsQWNjZXNzKCkuZ2V0QWx0ZXJuYXRpdmVzKCkpOyAKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE0MDg6MzogKCBydWxlX19YTGl0ZXJhbF9fQWx0ZXJuYXRpdmVzICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE0MDg6NDogcnVsZV9fWExpdGVyYWxfX0FsdGVybmF0aXZlcworICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTUwODozOiAoIHJ1bGVfX1hMaXRlcmFsX19BbHRlcm5hdGl2ZXMgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTUwODo0OiBydWxlX19YTGl0ZXJhbF9fQWx0ZXJuYXRpdmVzCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV18yKTsKICAgICAgICAgICAgIHJ1bGVfX1hMaXRlcmFsX19BbHRlcm5hdGl2ZXMoKTsKQEAgLTQ3NjMsMTEgKzUxMTcsMTEgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJlbnRyeVJ1bGVYQ29sbGVjdGlvbkxpdGVyYWwiCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTQxNzoxOiBlbnRyeVJ1bGVYQ29sbGVjdGlvbkxpdGVyYWwgOiBydWxlWENvbGxlY3Rpb25MaXRlcmFsIEVPRiA7CisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTUxNzoxOiBlbnRyeVJ1bGVYQ29sbGVjdGlvbkxpdGVyYWwgOiBydWxlWENvbGxlY3Rpb25MaXRlcmFsIEVPRiA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgZW50cnlSdWxlWENvbGxlY3Rpb25MaXRlcmFsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE0MTg6MTogKCBydWxlWENvbGxlY3Rpb25MaXRlcmFsIEVPRiApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNDE5OjE6IHJ1bGVYQ29sbGVjdGlvbkxpdGVyYWwgRU9GCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNTE4OjE6ICggcnVsZVhDb2xsZWN0aW9uTGl0ZXJhbCBFT0YgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTUxOToxOiBydWxlWENvbGxlY3Rpb25MaXRlcmFsIEVPRgogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYQ29sbGVjdGlvbkxpdGVyYWxSdWxlKCkpOyAKQEAgLTQ3OTcsMjMgKzUxNTEsMjMgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlWENvbGxlY3Rpb25MaXRlcmFsIgotICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE0MjY6MTogcnVsZVhDb2xsZWN0aW9uTGl0ZXJhbCA6ICggKCBydWxlX19YQ29sbGVjdGlvbkxpdGVyYWxfX0FsdGVybmF0aXZlcyApICkgOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE1MjY6MTogcnVsZVhDb2xsZWN0aW9uTGl0ZXJhbCA6ICggKCBydWxlX19YQ29sbGVjdGlvbkxpdGVyYWxfX0FsdGVybmF0aXZlcyApICkgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVYQ29sbGVjdGlvbkxpdGVyYWwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTQzMDoyOiAoICggKCBydWxlX19YQ29sbGVjdGlvbkxpdGVyYWxfX0FsdGVybmF0aXZlcyApICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTQzMToyOiAoICggcnVsZV9fWENvbGxlY3Rpb25MaXRlcmFsX19BbHRlcm5hdGl2ZXMgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNTMwOjI6ICggKCAoIHJ1bGVfX1hDb2xsZWN0aW9uTGl0ZXJhbF9fQWx0ZXJuYXRpdmVzICkgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNTMxOjI6ICggKCBydWxlX19YQ29sbGVjdGlvbkxpdGVyYWxfX0FsdGVybmF0aXZlcyApICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE0MzE6MjogKCAoIHJ1bGVfX1hDb2xsZWN0aW9uTGl0ZXJhbF9fQWx0ZXJuYXRpdmVzICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTQzMjozOiAoIHJ1bGVfX1hDb2xsZWN0aW9uTGl0ZXJhbF9fQWx0ZXJuYXRpdmVzICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE1MzE6MjogKCAoIHJ1bGVfX1hDb2xsZWN0aW9uTGl0ZXJhbF9fQWx0ZXJuYXRpdmVzICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTUzMjozOiAoIHJ1bGVfX1hDb2xsZWN0aW9uTGl0ZXJhbF9fQWx0ZXJuYXRpdmVzICkKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WENvbGxlY3Rpb25MaXRlcmFsQWNjZXNzKCkuZ2V0QWx0ZXJuYXRpdmVzKCkpOyAKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE0MzM6MzogKCBydWxlX19YQ29sbGVjdGlvbkxpdGVyYWxfX0FsdGVybmF0aXZlcyApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNDMzOjQ6IHJ1bGVfX1hDb2xsZWN0aW9uTGl0ZXJhbF9fQWx0ZXJuYXRpdmVzCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNTMzOjM6ICggcnVsZV9fWENvbGxlY3Rpb25MaXRlcmFsX19BbHRlcm5hdGl2ZXMgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTUzMzo0OiBydWxlX19YQ29sbGVjdGlvbkxpdGVyYWxfX0FsdGVybmF0aXZlcwogICAgICAgICAgICAgewogICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMik7CiAgICAgICAgICAgICBydWxlX19YQ29sbGVjdGlvbkxpdGVyYWxfX0FsdGVybmF0aXZlcygpOwpAQCAtNDg0OCwxMSArNTIwMiwxMSBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgImVudHJ5UnVsZVhTZXRMaXRlcmFsIgotICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE0NDI6MTogZW50cnlSdWxlWFNldExpdGVyYWwgOiBydWxlWFNldExpdGVyYWwgRU9GIDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNTQyOjE6IGVudHJ5UnVsZVhTZXRMaXRlcmFsIDogcnVsZVhTZXRMaXRlcmFsIEVPRiA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgZW50cnlSdWxlWFNldExpdGVyYWwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTQ0MzoxOiAoIHJ1bGVYU2V0TGl0ZXJhbCBFT0YgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTQ0NDoxOiBydWxlWFNldExpdGVyYWwgRU9GCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNTQzOjE6ICggcnVsZVhTZXRMaXRlcmFsIEVPRiApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNTQ0OjE6IHJ1bGVYU2V0TGl0ZXJhbCBFT0YKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WFNldExpdGVyYWxSdWxlKCkpOyAKQEAgLTQ4ODIsMjMgKzUyMzYsMjMgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlWFNldExpdGVyYWwiCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTQ1MToxOiBydWxlWFNldExpdGVyYWwgOiAoICggcnVsZV9fWFNldExpdGVyYWxfX0dyb3VwX18wICkgKSA7CisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTU1MToxOiBydWxlWFNldExpdGVyYWwgOiAoICggcnVsZV9fWFNldExpdGVyYWxfX0dyb3VwX18wICkgKSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZVhTZXRMaXRlcmFsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE0NTU6MjogKCAoICggcnVsZV9fWFNldExpdGVyYWxfX0dyb3VwX18wICkgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNDU2OjI6ICggKCBydWxlX19YU2V0TGl0ZXJhbF9fR3JvdXBfXzAgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNTU1OjI6ICggKCAoIHJ1bGVfX1hTZXRMaXRlcmFsX19Hcm91cF9fMCApICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTU1NjoyOiAoICggcnVsZV9fWFNldExpdGVyYWxfX0dyb3VwX18wICkgKQogICAgICAgICAgICAgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTQ1NjoyOiAoICggcnVsZV9fWFNldExpdGVyYWxfX0dyb3VwX18wICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTQ1NzozOiAoIHJ1bGVfX1hTZXRMaXRlcmFsX19Hcm91cF9fMCApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNTU2OjI6ICggKCBydWxlX19YU2V0TGl0ZXJhbF9fR3JvdXBfXzAgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNTU3OjM6ICggcnVsZV9fWFNldExpdGVyYWxfX0dyb3VwX18wICkKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WFNldExpdGVyYWxBY2Nlc3MoKS5nZXRHcm91cCgpKTsgCiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNDU4OjM6ICggcnVsZV9fWFNldExpdGVyYWxfX0dyb3VwX18wICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE0NTg6NDogcnVsZV9fWFNldExpdGVyYWxfX0dyb3VwX18wCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNTU4OjM6ICggcnVsZV9fWFNldExpdGVyYWxfX0dyb3VwX18wICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE1NTg6NDogcnVsZV9fWFNldExpdGVyYWxfX0dyb3VwX18wCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV18yKTsKICAgICAgICAgICAgIHJ1bGVfX1hTZXRMaXRlcmFsX19Hcm91cF9fMCgpOwpAQCAtNDkzMywxMSArNTI4NywxMSBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgImVudHJ5UnVsZVhMaXN0TGl0ZXJhbCIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNDY3OjE6IGVudHJ5UnVsZVhMaXN0TGl0ZXJhbCA6IHJ1bGVYTGlzdExpdGVyYWwgRU9GIDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNTY3OjE6IGVudHJ5UnVsZVhMaXN0TGl0ZXJhbCA6IHJ1bGVYTGlzdExpdGVyYWwgRU9GIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBlbnRyeVJ1bGVYTGlzdExpdGVyYWwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTQ2ODoxOiAoIHJ1bGVYTGlzdExpdGVyYWwgRU9GICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE0Njk6MTogcnVsZVhMaXN0TGl0ZXJhbCBFT0YKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE1Njg6MTogKCBydWxlWExpc3RMaXRlcmFsIEVPRiApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNTY5OjE6IHJ1bGVYTGlzdExpdGVyYWwgRU9GCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhMaXN0TGl0ZXJhbFJ1bGUoKSk7IApAQCAtNDk2NywyMyArNTMyMSwyMyBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVYTGlzdExpdGVyYWwiCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTQ3NjoxOiBydWxlWExpc3RMaXRlcmFsIDogKCAoIHJ1bGVfX1hMaXN0TGl0ZXJhbF9fR3JvdXBfXzAgKSApIDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNTc2OjE6IHJ1bGVYTGlzdExpdGVyYWwgOiAoICggcnVsZV9fWExpc3RMaXRlcmFsX19Hcm91cF9fMCApICkgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVYTGlzdExpdGVyYWwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTQ4MDoyOiAoICggKCBydWxlX19YTGlzdExpdGVyYWxfX0dyb3VwX18wICkgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNDgxOjI6ICggKCBydWxlX19YTGlzdExpdGVyYWxfX0dyb3VwX18wICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTU4MDoyOiAoICggKCBydWxlX19YTGlzdExpdGVyYWxfX0dyb3VwX18wICkgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNTgxOjI6ICggKCBydWxlX19YTGlzdExpdGVyYWxfX0dyb3VwX18wICkgKQogICAgICAgICAgICAgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTQ4MToyOiAoICggcnVsZV9fWExpc3RMaXRlcmFsX19Hcm91cF9fMCApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE0ODI6MzogKCBydWxlX19YTGlzdExpdGVyYWxfX0dyb3VwX18wICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE1ODE6MjogKCAoIHJ1bGVfX1hMaXN0TGl0ZXJhbF9fR3JvdXBfXzAgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNTgyOjM6ICggcnVsZV9fWExpc3RMaXRlcmFsX19Hcm91cF9fMCApCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhMaXN0TGl0ZXJhbEFjY2VzcygpLmdldEdyb3VwKCkpOyAKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE0ODM6MzogKCBydWxlX19YTGlzdExpdGVyYWxfX0dyb3VwX18wICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE0ODM6NDogcnVsZV9fWExpc3RMaXRlcmFsX19Hcm91cF9fMAorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTU4MzozOiAoIHJ1bGVfX1hMaXN0TGl0ZXJhbF9fR3JvdXBfXzAgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTU4Mzo0OiBydWxlX19YTGlzdExpdGVyYWxfX0dyb3VwX18wCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV18yKTsKICAgICAgICAgICAgIHJ1bGVfX1hMaXN0TGl0ZXJhbF9fR3JvdXBfXzAoKTsKQEAgLTUwMTgsMTEgKzUzNzIsMTEgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJlbnRyeVJ1bGVYQ2xvc3VyZSIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNDkyOjE6IGVudHJ5UnVsZVhDbG9zdXJlIDogcnVsZVhDbG9zdXJlIEVPRiA7CisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTU5MjoxOiBlbnRyeVJ1bGVYQ2xvc3VyZSA6IHJ1bGVYQ2xvc3VyZSBFT0YgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIGVudHJ5UnVsZVhDbG9zdXJlKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE0OTM6MTogKCBydWxlWENsb3N1cmUgRU9GICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE0OTQ6MTogcnVsZVhDbG9zdXJlIEVPRgorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTU5MzoxOiAoIHJ1bGVYQ2xvc3VyZSBFT0YgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTU5NDoxOiBydWxlWENsb3N1cmUgRU9GCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhDbG9zdXJlUnVsZSgpKTsgCkBAIC01MDUyLDIzICs1NDA2LDIzIEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZVhDbG9zdXJlIgotICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE1MDE6MTogcnVsZVhDbG9zdXJlIDogKCAoIHJ1bGVfX1hDbG9zdXJlX19Hcm91cF9fMCApICkgOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE2MDE6MTogcnVsZVhDbG9zdXJlIDogKCAoIHJ1bGVfX1hDbG9zdXJlX19Hcm91cF9fMCApICkgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVYQ2xvc3VyZSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNTA1OjI6ICggKCAoIHJ1bGVfX1hDbG9zdXJlX19Hcm91cF9fMCApICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTUwNjoyOiAoICggcnVsZV9fWENsb3N1cmVfX0dyb3VwX18wICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTYwNToyOiAoICggKCBydWxlX19YQ2xvc3VyZV9fR3JvdXBfXzAgKSApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE2MDY6MjogKCAoIHJ1bGVfX1hDbG9zdXJlX19Hcm91cF9fMCApICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE1MDY6MjogKCAoIHJ1bGVfX1hDbG9zdXJlX19Hcm91cF9fMCApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE1MDc6MzogKCBydWxlX19YQ2xvc3VyZV9fR3JvdXBfXzAgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTYwNjoyOiAoICggcnVsZV9fWENsb3N1cmVfX0dyb3VwX18wICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTYwNzozOiAoIHJ1bGVfX1hDbG9zdXJlX19Hcm91cF9fMCApCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhDbG9zdXJlQWNjZXNzKCkuZ2V0R3JvdXAoKSk7IAogICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTUwODozOiAoIHJ1bGVfX1hDbG9zdXJlX19Hcm91cF9fMCApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNTA4OjQ6IHJ1bGVfX1hDbG9zdXJlX19Hcm91cF9fMAorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTYwODozOiAoIHJ1bGVfX1hDbG9zdXJlX19Hcm91cF9fMCApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNjA4OjQ6IHJ1bGVfX1hDbG9zdXJlX19Hcm91cF9fMAogICAgICAgICAgICAgewogICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMik7CiAgICAgICAgICAgICBydWxlX19YQ2xvc3VyZV9fR3JvdXBfXzAoKTsKQEAgLTUxMDMsMTEgKzU0NTcsMTEgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJlbnRyeVJ1bGVYRXhwcmVzc2lvbkluQ2xvc3VyZSIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNTE3OjE6IGVudHJ5UnVsZVhFeHByZXNzaW9uSW5DbG9zdXJlIDogcnVsZVhFeHByZXNzaW9uSW5DbG9zdXJlIEVPRiA7CisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTYxNzoxOiBlbnRyeVJ1bGVYRXhwcmVzc2lvbkluQ2xvc3VyZSA6IHJ1bGVYRXhwcmVzc2lvbkluQ2xvc3VyZSBFT0YgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIGVudHJ5UnVsZVhFeHByZXNzaW9uSW5DbG9zdXJlKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE1MTg6MTogKCBydWxlWEV4cHJlc3Npb25JbkNsb3N1cmUgRU9GICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE1MTk6MTogcnVsZVhFeHByZXNzaW9uSW5DbG9zdXJlIEVPRgorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTYxODoxOiAoIHJ1bGVYRXhwcmVzc2lvbkluQ2xvc3VyZSBFT0YgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTYxOToxOiBydWxlWEV4cHJlc3Npb25JbkNsb3N1cmUgRU9GCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhFeHByZXNzaW9uSW5DbG9zdXJlUnVsZSgpKTsgCkBAIC01MTM3LDIzICs1NDkxLDIzIEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZVhFeHByZXNzaW9uSW5DbG9zdXJlIgotICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE1MjY6MTogcnVsZVhFeHByZXNzaW9uSW5DbG9zdXJlIDogKCAoIHJ1bGVfX1hFeHByZXNzaW9uSW5DbG9zdXJlX19Hcm91cF9fMCApICkgOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE2MjY6MTogcnVsZVhFeHByZXNzaW9uSW5DbG9zdXJlIDogKCAoIHJ1bGVfX1hFeHByZXNzaW9uSW5DbG9zdXJlX19Hcm91cF9fMCApICkgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVYRXhwcmVzc2lvbkluQ2xvc3VyZSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNTMwOjI6ICggKCAoIHJ1bGVfX1hFeHByZXNzaW9uSW5DbG9zdXJlX19Hcm91cF9fMCApICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTUzMToyOiAoICggcnVsZV9fWEV4cHJlc3Npb25JbkNsb3N1cmVfX0dyb3VwX18wICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTYzMDoyOiAoICggKCBydWxlX19YRXhwcmVzc2lvbkluQ2xvc3VyZV9fR3JvdXBfXzAgKSApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE2MzE6MjogKCAoIHJ1bGVfX1hFeHByZXNzaW9uSW5DbG9zdXJlX19Hcm91cF9fMCApICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE1MzE6MjogKCAoIHJ1bGVfX1hFeHByZXNzaW9uSW5DbG9zdXJlX19Hcm91cF9fMCApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE1MzI6MzogKCBydWxlX19YRXhwcmVzc2lvbkluQ2xvc3VyZV9fR3JvdXBfXzAgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTYzMToyOiAoICggcnVsZV9fWEV4cHJlc3Npb25JbkNsb3N1cmVfX0dyb3VwX18wICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTYzMjozOiAoIHJ1bGVfX1hFeHByZXNzaW9uSW5DbG9zdXJlX19Hcm91cF9fMCApCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhFeHByZXNzaW9uSW5DbG9zdXJlQWNjZXNzKCkuZ2V0R3JvdXAoKSk7IAogICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTUzMzozOiAoIHJ1bGVfX1hFeHByZXNzaW9uSW5DbG9zdXJlX19Hcm91cF9fMCApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNTMzOjQ6IHJ1bGVfX1hFeHByZXNzaW9uSW5DbG9zdXJlX19Hcm91cF9fMAorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTYzMzozOiAoIHJ1bGVfX1hFeHByZXNzaW9uSW5DbG9zdXJlX19Hcm91cF9fMCApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNjMzOjQ6IHJ1bGVfX1hFeHByZXNzaW9uSW5DbG9zdXJlX19Hcm91cF9fMAogICAgICAgICAgICAgewogICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMik7CiAgICAgICAgICAgICBydWxlX19YRXhwcmVzc2lvbkluQ2xvc3VyZV9fR3JvdXBfXzAoKTsKQEAgLTUxODgsMTEgKzU1NDIsMTEgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJlbnRyeVJ1bGVYU2hvcnRDbG9zdXJlIgotICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE1NDI6MTogZW50cnlSdWxlWFNob3J0Q2xvc3VyZSA6IHJ1bGVYU2hvcnRDbG9zdXJlIEVPRiA7CisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTY0MjoxOiBlbnRyeVJ1bGVYU2hvcnRDbG9zdXJlIDogcnVsZVhTaG9ydENsb3N1cmUgRU9GIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBlbnRyeVJ1bGVYU2hvcnRDbG9zdXJlKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE1NDM6MTogKCBydWxlWFNob3J0Q2xvc3VyZSBFT0YgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTU0NDoxOiBydWxlWFNob3J0Q2xvc3VyZSBFT0YKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE2NDM6MTogKCBydWxlWFNob3J0Q2xvc3VyZSBFT0YgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTY0NDoxOiBydWxlWFNob3J0Q2xvc3VyZSBFT0YKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WFNob3J0Q2xvc3VyZVJ1bGUoKSk7IApAQCAtNTIyMiwyMyArNTU3NiwyMyBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVYU2hvcnRDbG9zdXJlIgotICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE1NTE6MTogcnVsZVhTaG9ydENsb3N1cmUgOiAoICggcnVsZV9fWFNob3J0Q2xvc3VyZV9fR3JvdXBfXzAgKSApIDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNjUxOjE6IHJ1bGVYU2hvcnRDbG9zdXJlIDogKCAoIHJ1bGVfX1hTaG9ydENsb3N1cmVfX0dyb3VwX18wICkgKSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZVhTaG9ydENsb3N1cmUoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTU1NToyOiAoICggKCBydWxlX19YU2hvcnRDbG9zdXJlX19Hcm91cF9fMCApICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTU1NjoyOiAoICggcnVsZV9fWFNob3J0Q2xvc3VyZV9fR3JvdXBfXzAgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNjU1OjI6ICggKCAoIHJ1bGVfX1hTaG9ydENsb3N1cmVfX0dyb3VwX18wICkgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNjU2OjI6ICggKCBydWxlX19YU2hvcnRDbG9zdXJlX19Hcm91cF9fMCApICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE1NTY6MjogKCAoIHJ1bGVfX1hTaG9ydENsb3N1cmVfX0dyb3VwX18wICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTU1NzozOiAoIHJ1bGVfX1hTaG9ydENsb3N1cmVfX0dyb3VwX18wICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE2NTY6MjogKCAoIHJ1bGVfX1hTaG9ydENsb3N1cmVfX0dyb3VwX18wICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTY1NzozOiAoIHJ1bGVfX1hTaG9ydENsb3N1cmVfX0dyb3VwX18wICkKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WFNob3J0Q2xvc3VyZUFjY2VzcygpLmdldEdyb3VwKCkpOyAKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE1NTg6MzogKCBydWxlX19YU2hvcnRDbG9zdXJlX19Hcm91cF9fMCApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNTU4OjQ6IHJ1bGVfX1hTaG9ydENsb3N1cmVfX0dyb3VwX18wCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNjU4OjM6ICggcnVsZV9fWFNob3J0Q2xvc3VyZV9fR3JvdXBfXzAgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTY1ODo0OiBydWxlX19YU2hvcnRDbG9zdXJlX19Hcm91cF9fMAogICAgICAgICAgICAgewogICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMik7CiAgICAgICAgICAgICBydWxlX19YU2hvcnRDbG9zdXJlX19Hcm91cF9fMCgpOwpAQCAtNTI3MywxMSArNTYyNywxMSBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgImVudHJ5UnVsZVhQYXJlbnRoZXNpemVkRXhwcmVzc2lvbiIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNTY3OjE6IGVudHJ5UnVsZVhQYXJlbnRoZXNpemVkRXhwcmVzc2lvbiA6IHJ1bGVYUGFyZW50aGVzaXplZEV4cHJlc3Npb24gRU9GIDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNjY3OjE6IGVudHJ5UnVsZVhQYXJlbnRoZXNpemVkRXhwcmVzc2lvbiA6IHJ1bGVYUGFyZW50aGVzaXplZEV4cHJlc3Npb24gRU9GIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBlbnRyeVJ1bGVYUGFyZW50aGVzaXplZEV4cHJlc3Npb24oKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTU2ODoxOiAoIHJ1bGVYUGFyZW50aGVzaXplZEV4cHJlc3Npb24gRU9GICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE1Njk6MTogcnVsZVhQYXJlbnRoZXNpemVkRXhwcmVzc2lvbiBFT0YKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE2Njg6MTogKCBydWxlWFBhcmVudGhlc2l6ZWRFeHByZXNzaW9uIEVPRiApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNjY5OjE6IHJ1bGVYUGFyZW50aGVzaXplZEV4cHJlc3Npb24gRU9GCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhQYXJlbnRoZXNpemVkRXhwcmVzc2lvblJ1bGUoKSk7IApAQCAtNTMwNywyMyArNTY2MSwyMyBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVYUGFyZW50aGVzaXplZEV4cHJlc3Npb24iCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTU3NjoxOiBydWxlWFBhcmVudGhlc2l6ZWRFeHByZXNzaW9uIDogKCAoIHJ1bGVfX1hQYXJlbnRoZXNpemVkRXhwcmVzc2lvbl9fR3JvdXBfXzAgKSApIDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNjc2OjE6IHJ1bGVYUGFyZW50aGVzaXplZEV4cHJlc3Npb24gOiAoICggcnVsZV9fWFBhcmVudGhlc2l6ZWRFeHByZXNzaW9uX19Hcm91cF9fMCApICkgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVYUGFyZW50aGVzaXplZEV4cHJlc3Npb24oKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTU4MDoyOiAoICggKCBydWxlX19YUGFyZW50aGVzaXplZEV4cHJlc3Npb25fX0dyb3VwX18wICkgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNTgxOjI6ICggKCBydWxlX19YUGFyZW50aGVzaXplZEV4cHJlc3Npb25fX0dyb3VwX18wICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTY4MDoyOiAoICggKCBydWxlX19YUGFyZW50aGVzaXplZEV4cHJlc3Npb25fX0dyb3VwX18wICkgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNjgxOjI6ICggKCBydWxlX19YUGFyZW50aGVzaXplZEV4cHJlc3Npb25fX0dyb3VwX18wICkgKQogICAgICAgICAgICAgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTU4MToyOiAoICggcnVsZV9fWFBhcmVudGhlc2l6ZWRFeHByZXNzaW9uX19Hcm91cF9fMCApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE1ODI6MzogKCBydWxlX19YUGFyZW50aGVzaXplZEV4cHJlc3Npb25fX0dyb3VwX18wICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE2ODE6MjogKCAoIHJ1bGVfX1hQYXJlbnRoZXNpemVkRXhwcmVzc2lvbl9fR3JvdXBfXzAgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNjgyOjM6ICggcnVsZV9fWFBhcmVudGhlc2l6ZWRFeHByZXNzaW9uX19Hcm91cF9fMCApCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhQYXJlbnRoZXNpemVkRXhwcmVzc2lvbkFjY2VzcygpLmdldEdyb3VwKCkpOyAKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE1ODM6MzogKCBydWxlX19YUGFyZW50aGVzaXplZEV4cHJlc3Npb25fX0dyb3VwX18wICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE1ODM6NDogcnVsZV9fWFBhcmVudGhlc2l6ZWRFeHByZXNzaW9uX19Hcm91cF9fMAorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTY4MzozOiAoIHJ1bGVfX1hQYXJlbnRoZXNpemVkRXhwcmVzc2lvbl9fR3JvdXBfXzAgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTY4Mzo0OiBydWxlX19YUGFyZW50aGVzaXplZEV4cHJlc3Npb25fX0dyb3VwX18wCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV18yKTsKICAgICAgICAgICAgIHJ1bGVfX1hQYXJlbnRoZXNpemVkRXhwcmVzc2lvbl9fR3JvdXBfXzAoKTsKQEAgLTUzNTgsMTEgKzU3MTIsMTEgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJlbnRyeVJ1bGVYSWZFeHByZXNzaW9uIgotICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE1OTI6MTogZW50cnlSdWxlWElmRXhwcmVzc2lvbiA6IHJ1bGVYSWZFeHByZXNzaW9uIEVPRiA7CisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTY5MjoxOiBlbnRyeVJ1bGVYSWZFeHByZXNzaW9uIDogcnVsZVhJZkV4cHJlc3Npb24gRU9GIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBlbnRyeVJ1bGVYSWZFeHByZXNzaW9uKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE1OTM6MTogKCBydWxlWElmRXhwcmVzc2lvbiBFT0YgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTU5NDoxOiBydWxlWElmRXhwcmVzc2lvbiBFT0YKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE2OTM6MTogKCBydWxlWElmRXhwcmVzc2lvbiBFT0YgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTY5NDoxOiBydWxlWElmRXhwcmVzc2lvbiBFT0YKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WElmRXhwcmVzc2lvblJ1bGUoKSk7IApAQCAtNTM5MiwyMyArNTc0NiwyMyBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVYSWZFeHByZXNzaW9uIgotICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE2MDE6MTogcnVsZVhJZkV4cHJlc3Npb24gOiAoICggcnVsZV9fWElmRXhwcmVzc2lvbl9fR3JvdXBfXzAgKSApIDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNzAxOjE6IHJ1bGVYSWZFeHByZXNzaW9uIDogKCAoIHJ1bGVfX1hJZkV4cHJlc3Npb25fX0dyb3VwX18wICkgKSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZVhJZkV4cHJlc3Npb24oKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTYwNToyOiAoICggKCBydWxlX19YSWZFeHByZXNzaW9uX19Hcm91cF9fMCApICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTYwNjoyOiAoICggcnVsZV9fWElmRXhwcmVzc2lvbl9fR3JvdXBfXzAgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNzA1OjI6ICggKCAoIHJ1bGVfX1hJZkV4cHJlc3Npb25fX0dyb3VwX18wICkgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNzA2OjI6ICggKCBydWxlX19YSWZFeHByZXNzaW9uX19Hcm91cF9fMCApICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE2MDY6MjogKCAoIHJ1bGVfX1hJZkV4cHJlc3Npb25fX0dyb3VwX18wICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTYwNzozOiAoIHJ1bGVfX1hJZkV4cHJlc3Npb25fX0dyb3VwX18wICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE3MDY6MjogKCAoIHJ1bGVfX1hJZkV4cHJlc3Npb25fX0dyb3VwX18wICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTcwNzozOiAoIHJ1bGVfX1hJZkV4cHJlc3Npb25fX0dyb3VwX18wICkKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WElmRXhwcmVzc2lvbkFjY2VzcygpLmdldEdyb3VwKCkpOyAKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE2MDg6MzogKCBydWxlX19YSWZFeHByZXNzaW9uX19Hcm91cF9fMCApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNjA4OjQ6IHJ1bGVfX1hJZkV4cHJlc3Npb25fX0dyb3VwX18wCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNzA4OjM6ICggcnVsZV9fWElmRXhwcmVzc2lvbl9fR3JvdXBfXzAgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTcwODo0OiBydWxlX19YSWZFeHByZXNzaW9uX19Hcm91cF9fMAogICAgICAgICAgICAgewogICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMik7CiAgICAgICAgICAgICBydWxlX19YSWZFeHByZXNzaW9uX19Hcm91cF9fMCgpOwpAQCAtNTQ0MywxMSArNTc5NywxMSBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgImVudHJ5UnVsZVhTd2l0Y2hFeHByZXNzaW9uIgotICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE2MTc6MTogZW50cnlSdWxlWFN3aXRjaEV4cHJlc3Npb24gOiBydWxlWFN3aXRjaEV4cHJlc3Npb24gRU9GIDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNzE3OjE6IGVudHJ5UnVsZVhTd2l0Y2hFeHByZXNzaW9uIDogcnVsZVhTd2l0Y2hFeHByZXNzaW9uIEVPRiA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgZW50cnlSdWxlWFN3aXRjaEV4cHJlc3Npb24oKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTYxODoxOiAoIHJ1bGVYU3dpdGNoRXhwcmVzc2lvbiBFT0YgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTYxOToxOiBydWxlWFN3aXRjaEV4cHJlc3Npb24gRU9GCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNzE4OjE6ICggcnVsZVhTd2l0Y2hFeHByZXNzaW9uIEVPRiApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNzE5OjE6IHJ1bGVYU3dpdGNoRXhwcmVzc2lvbiBFT0YKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WFN3aXRjaEV4cHJlc3Npb25SdWxlKCkpOyAKQEAgLTU0NzcsMjMgKzU4MzEsMjMgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlWFN3aXRjaEV4cHJlc3Npb24iCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTYyNjoxOiBydWxlWFN3aXRjaEV4cHJlc3Npb24gOiAoICggcnVsZV9fWFN3aXRjaEV4cHJlc3Npb25fX0dyb3VwX18wICkgKSA7CisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTcyNjoxOiBydWxlWFN3aXRjaEV4cHJlc3Npb24gOiAoICggcnVsZV9fWFN3aXRjaEV4cHJlc3Npb25fX0dyb3VwX18wICkgKSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZVhTd2l0Y2hFeHByZXNzaW9uKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE2MzA6MjogKCAoICggcnVsZV9fWFN3aXRjaEV4cHJlc3Npb25fX0dyb3VwX18wICkgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNjMxOjI6ICggKCBydWxlX19YU3dpdGNoRXhwcmVzc2lvbl9fR3JvdXBfXzAgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNzMwOjI6ICggKCAoIHJ1bGVfX1hTd2l0Y2hFeHByZXNzaW9uX19Hcm91cF9fMCApICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTczMToyOiAoICggcnVsZV9fWFN3aXRjaEV4cHJlc3Npb25fX0dyb3VwX18wICkgKQogICAgICAgICAgICAgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTYzMToyOiAoICggcnVsZV9fWFN3aXRjaEV4cHJlc3Npb25fX0dyb3VwX18wICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTYzMjozOiAoIHJ1bGVfX1hTd2l0Y2hFeHByZXNzaW9uX19Hcm91cF9fMCApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNzMxOjI6ICggKCBydWxlX19YU3dpdGNoRXhwcmVzc2lvbl9fR3JvdXBfXzAgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNzMyOjM6ICggcnVsZV9fWFN3aXRjaEV4cHJlc3Npb25fX0dyb3VwX18wICkKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WFN3aXRjaEV4cHJlc3Npb25BY2Nlc3MoKS5nZXRHcm91cCgpKTsgCiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNjMzOjM6ICggcnVsZV9fWFN3aXRjaEV4cHJlc3Npb25fX0dyb3VwX18wICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE2MzM6NDogcnVsZV9fWFN3aXRjaEV4cHJlc3Npb25fX0dyb3VwX18wCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNzMzOjM6ICggcnVsZV9fWFN3aXRjaEV4cHJlc3Npb25fX0dyb3VwX18wICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE3MzM6NDogcnVsZV9fWFN3aXRjaEV4cHJlc3Npb25fX0dyb3VwX18wCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV18yKTsKICAgICAgICAgICAgIHJ1bGVfX1hTd2l0Y2hFeHByZXNzaW9uX19Hcm91cF9fMCgpOwpAQCAtNTUyOCwxMSArNTg4MiwxMSBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgImVudHJ5UnVsZVhDYXNlUGFydCIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNjQyOjE6IGVudHJ5UnVsZVhDYXNlUGFydCA6IHJ1bGVYQ2FzZVBhcnQgRU9GIDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNzQyOjE6IGVudHJ5UnVsZVhDYXNlUGFydCA6IHJ1bGVYQ2FzZVBhcnQgRU9GIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBlbnRyeVJ1bGVYQ2FzZVBhcnQoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTY0MzoxOiAoIHJ1bGVYQ2FzZVBhcnQgRU9GICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE2NDQ6MTogcnVsZVhDYXNlUGFydCBFT0YKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE3NDM6MTogKCBydWxlWENhc2VQYXJ0IEVPRiApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNzQ0OjE6IHJ1bGVYQ2FzZVBhcnQgRU9GCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhDYXNlUGFydFJ1bGUoKSk7IApAQCAtNTU2MiwyMyArNTkxNiwyMyBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVYQ2FzZVBhcnQiCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTY1MToxOiBydWxlWENhc2VQYXJ0IDogKCAoIHJ1bGVfX1hDYXNlUGFydF9fR3JvdXBfXzAgKSApIDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNzUxOjE6IHJ1bGVYQ2FzZVBhcnQgOiAoICggcnVsZV9fWENhc2VQYXJ0X19Hcm91cF9fMCApICkgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVYQ2FzZVBhcnQoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTY1NToyOiAoICggKCBydWxlX19YQ2FzZVBhcnRfX0dyb3VwX18wICkgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNjU2OjI6ICggKCBydWxlX19YQ2FzZVBhcnRfX0dyb3VwX18wICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTc1NToyOiAoICggKCBydWxlX19YQ2FzZVBhcnRfX0dyb3VwX18wICkgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNzU2OjI6ICggKCBydWxlX19YQ2FzZVBhcnRfX0dyb3VwX18wICkgKQogICAgICAgICAgICAgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTY1NjoyOiAoICggcnVsZV9fWENhc2VQYXJ0X19Hcm91cF9fMCApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE2NTc6MzogKCBydWxlX19YQ2FzZVBhcnRfX0dyb3VwX18wICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE3NTY6MjogKCAoIHJ1bGVfX1hDYXNlUGFydF9fR3JvdXBfXzAgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNzU3OjM6ICggcnVsZV9fWENhc2VQYXJ0X19Hcm91cF9fMCApCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhDYXNlUGFydEFjY2VzcygpLmdldEdyb3VwKCkpOyAKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE2NTg6MzogKCBydWxlX19YQ2FzZVBhcnRfX0dyb3VwX18wICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE2NTg6NDogcnVsZV9fWENhc2VQYXJ0X19Hcm91cF9fMAorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTc1ODozOiAoIHJ1bGVfX1hDYXNlUGFydF9fR3JvdXBfXzAgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTc1ODo0OiBydWxlX19YQ2FzZVBhcnRfX0dyb3VwX18wCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV18yKTsKICAgICAgICAgICAgIHJ1bGVfX1hDYXNlUGFydF9fR3JvdXBfXzAoKTsKQEAgLTU2MTMsMTEgKzU5NjcsMTEgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJlbnRyeVJ1bGVYRm9yTG9vcEV4cHJlc3Npb24iCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTY2NzoxOiBlbnRyeVJ1bGVYRm9yTG9vcEV4cHJlc3Npb24gOiBydWxlWEZvckxvb3BFeHByZXNzaW9uIEVPRiA7CisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTc2NzoxOiBlbnRyeVJ1bGVYRm9yTG9vcEV4cHJlc3Npb24gOiBydWxlWEZvckxvb3BFeHByZXNzaW9uIEVPRiA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgZW50cnlSdWxlWEZvckxvb3BFeHByZXNzaW9uKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE2Njg6MTogKCBydWxlWEZvckxvb3BFeHByZXNzaW9uIEVPRiApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNjY5OjE6IHJ1bGVYRm9yTG9vcEV4cHJlc3Npb24gRU9GCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNzY4OjE6ICggcnVsZVhGb3JMb29wRXhwcmVzc2lvbiBFT0YgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTc2OToxOiBydWxlWEZvckxvb3BFeHByZXNzaW9uIEVPRgogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYRm9yTG9vcEV4cHJlc3Npb25SdWxlKCkpOyAKQEAgLTU2NDcsMjMgKzYwMDEsMjMgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlWEZvckxvb3BFeHByZXNzaW9uIgotICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE2NzY6MTogcnVsZVhGb3JMb29wRXhwcmVzc2lvbiA6ICggKCBydWxlX19YRm9yTG9vcEV4cHJlc3Npb25fX0dyb3VwX18wICkgKSA7CisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTc3NjoxOiBydWxlWEZvckxvb3BFeHByZXNzaW9uIDogKCAoIHJ1bGVfX1hGb3JMb29wRXhwcmVzc2lvbl9fR3JvdXBfXzAgKSApIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlWEZvckxvb3BFeHByZXNzaW9uKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE2ODA6MjogKCAoICggcnVsZV9fWEZvckxvb3BFeHByZXNzaW9uX19Hcm91cF9fMCApICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTY4MToyOiAoICggcnVsZV9fWEZvckxvb3BFeHByZXNzaW9uX19Hcm91cF9fMCApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE3ODA6MjogKCAoICggcnVsZV9fWEZvckxvb3BFeHByZXNzaW9uX19Hcm91cF9fMCApICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTc4MToyOiAoICggcnVsZV9fWEZvckxvb3BFeHByZXNzaW9uX19Hcm91cF9fMCApICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE2ODE6MjogKCAoIHJ1bGVfX1hGb3JMb29wRXhwcmVzc2lvbl9fR3JvdXBfXzAgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNjgyOjM6ICggcnVsZV9fWEZvckxvb3BFeHByZXNzaW9uX19Hcm91cF9fMCApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNzgxOjI6ICggKCBydWxlX19YRm9yTG9vcEV4cHJlc3Npb25fX0dyb3VwX18wICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTc4MjozOiAoIHJ1bGVfX1hGb3JMb29wRXhwcmVzc2lvbl9fR3JvdXBfXzAgKQogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYRm9yTG9vcEV4cHJlc3Npb25BY2Nlc3MoKS5nZXRHcm91cCgpKTsgCiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNjgzOjM6ICggcnVsZV9fWEZvckxvb3BFeHByZXNzaW9uX19Hcm91cF9fMCApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNjgzOjQ6IHJ1bGVfX1hGb3JMb29wRXhwcmVzc2lvbl9fR3JvdXBfXzAKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE3ODM6MzogKCBydWxlX19YRm9yTG9vcEV4cHJlc3Npb25fX0dyb3VwX18wICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE3ODM6NDogcnVsZV9fWEZvckxvb3BFeHByZXNzaW9uX19Hcm91cF9fMAogICAgICAgICAgICAgewogICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMik7CiAgICAgICAgICAgICBydWxlX19YRm9yTG9vcEV4cHJlc3Npb25fX0dyb3VwX18wKCk7CkBAIC01Njk4LDExICs2MDUyLDExIEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAiZW50cnlSdWxlWEJhc2ljRm9yTG9vcEV4cHJlc3Npb24iCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTY5MjoxOiBlbnRyeVJ1bGVYQmFzaWNGb3JMb29wRXhwcmVzc2lvbiA6IHJ1bGVYQmFzaWNGb3JMb29wRXhwcmVzc2lvbiBFT0YgOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE3OTI6MTogZW50cnlSdWxlWEJhc2ljRm9yTG9vcEV4cHJlc3Npb24gOiBydWxlWEJhc2ljRm9yTG9vcEV4cHJlc3Npb24gRU9GIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBlbnRyeVJ1bGVYQmFzaWNGb3JMb29wRXhwcmVzc2lvbigpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNjkzOjE6ICggcnVsZVhCYXNpY0Zvckxvb3BFeHByZXNzaW9uIEVPRiApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNjk0OjE6IHJ1bGVYQmFzaWNGb3JMb29wRXhwcmVzc2lvbiBFT0YKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE3OTM6MTogKCBydWxlWEJhc2ljRm9yTG9vcEV4cHJlc3Npb24gRU9GICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE3OTQ6MTogcnVsZVhCYXNpY0Zvckxvb3BFeHByZXNzaW9uIEVPRgogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYQmFzaWNGb3JMb29wRXhwcmVzc2lvblJ1bGUoKSk7IApAQCAtNTczMiwyMyArNjA4NiwyMyBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVYQmFzaWNGb3JMb29wRXhwcmVzc2lvbiIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNzAxOjE6IHJ1bGVYQmFzaWNGb3JMb29wRXhwcmVzc2lvbiA6ICggKCBydWxlX19YQmFzaWNGb3JMb29wRXhwcmVzc2lvbl9fR3JvdXBfXzAgKSApIDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxODAxOjE6IHJ1bGVYQmFzaWNGb3JMb29wRXhwcmVzc2lvbiA6ICggKCBydWxlX19YQmFzaWNGb3JMb29wRXhwcmVzc2lvbl9fR3JvdXBfXzAgKSApIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlWEJhc2ljRm9yTG9vcEV4cHJlc3Npb24oKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTcwNToyOiAoICggKCBydWxlX19YQmFzaWNGb3JMb29wRXhwcmVzc2lvbl9fR3JvdXBfXzAgKSApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE3MDY6MjogKCAoIHJ1bGVfX1hCYXNpY0Zvckxvb3BFeHByZXNzaW9uX19Hcm91cF9fMCApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE4MDU6MjogKCAoICggcnVsZV9fWEJhc2ljRm9yTG9vcEV4cHJlc3Npb25fX0dyb3VwX18wICkgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxODA2OjI6ICggKCBydWxlX19YQmFzaWNGb3JMb29wRXhwcmVzc2lvbl9fR3JvdXBfXzAgKSApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNzA2OjI6ICggKCBydWxlX19YQmFzaWNGb3JMb29wRXhwcmVzc2lvbl9fR3JvdXBfXzAgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNzA3OjM6ICggcnVsZV9fWEJhc2ljRm9yTG9vcEV4cHJlc3Npb25fX0dyb3VwX18wICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE4MDY6MjogKCAoIHJ1bGVfX1hCYXNpY0Zvckxvb3BFeHByZXNzaW9uX19Hcm91cF9fMCApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE4MDc6MzogKCBydWxlX19YQmFzaWNGb3JMb29wRXhwcmVzc2lvbl9fR3JvdXBfXzAgKQogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYQmFzaWNGb3JMb29wRXhwcmVzc2lvbkFjY2VzcygpLmdldEdyb3VwKCkpOyAKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE3MDg6MzogKCBydWxlX19YQmFzaWNGb3JMb29wRXhwcmVzc2lvbl9fR3JvdXBfXzAgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTcwODo0OiBydWxlX19YQmFzaWNGb3JMb29wRXhwcmVzc2lvbl9fR3JvdXBfXzAKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE4MDg6MzogKCBydWxlX19YQmFzaWNGb3JMb29wRXhwcmVzc2lvbl9fR3JvdXBfXzAgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTgwODo0OiBydWxlX19YQmFzaWNGb3JMb29wRXhwcmVzc2lvbl9fR3JvdXBfXzAKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzIpOwogICAgICAgICAgICAgcnVsZV9fWEJhc2ljRm9yTG9vcEV4cHJlc3Npb25fX0dyb3VwX18wKCk7CkBAIC01NzgzLDExICs2MTM3LDExIEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAiZW50cnlSdWxlWFdoaWxlRXhwcmVzc2lvbiIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNzE3OjE6IGVudHJ5UnVsZVhXaGlsZUV4cHJlc3Npb24gOiBydWxlWFdoaWxlRXhwcmVzc2lvbiBFT0YgOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE4MTc6MTogZW50cnlSdWxlWFdoaWxlRXhwcmVzc2lvbiA6IHJ1bGVYV2hpbGVFeHByZXNzaW9uIEVPRiA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgZW50cnlSdWxlWFdoaWxlRXhwcmVzc2lvbigpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNzE4OjE6ICggcnVsZVhXaGlsZUV4cHJlc3Npb24gRU9GICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE3MTk6MTogcnVsZVhXaGlsZUV4cHJlc3Npb24gRU9GCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxODE4OjE6ICggcnVsZVhXaGlsZUV4cHJlc3Npb24gRU9GICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE4MTk6MTogcnVsZVhXaGlsZUV4cHJlc3Npb24gRU9GCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhXaGlsZUV4cHJlc3Npb25SdWxlKCkpOyAKQEAgLTU4MTcsMjMgKzYxNzEsMjMgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlWFdoaWxlRXhwcmVzc2lvbiIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNzI2OjE6IHJ1bGVYV2hpbGVFeHByZXNzaW9uIDogKCAoIHJ1bGVfX1hXaGlsZUV4cHJlc3Npb25fX0dyb3VwX18wICkgKSA7CisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTgyNjoxOiBydWxlWFdoaWxlRXhwcmVzc2lvbiA6ICggKCBydWxlX19YV2hpbGVFeHByZXNzaW9uX19Hcm91cF9fMCApICkgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVYV2hpbGVFeHByZXNzaW9uKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE3MzA6MjogKCAoICggcnVsZV9fWFdoaWxlRXhwcmVzc2lvbl9fR3JvdXBfXzAgKSApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE3MzE6MjogKCAoIHJ1bGVfX1hXaGlsZUV4cHJlc3Npb25fX0dyb3VwX18wICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTgzMDoyOiAoICggKCBydWxlX19YV2hpbGVFeHByZXNzaW9uX19Hcm91cF9fMCApICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTgzMToyOiAoICggcnVsZV9fWFdoaWxlRXhwcmVzc2lvbl9fR3JvdXBfXzAgKSApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNzMxOjI6ICggKCBydWxlX19YV2hpbGVFeHByZXNzaW9uX19Hcm91cF9fMCApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE3MzI6MzogKCBydWxlX19YV2hpbGVFeHByZXNzaW9uX19Hcm91cF9fMCApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxODMxOjI6ICggKCBydWxlX19YV2hpbGVFeHByZXNzaW9uX19Hcm91cF9fMCApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE4MzI6MzogKCBydWxlX19YV2hpbGVFeHByZXNzaW9uX19Hcm91cF9fMCApCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhXaGlsZUV4cHJlc3Npb25BY2Nlc3MoKS5nZXRHcm91cCgpKTsgCiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNzMzOjM6ICggcnVsZV9fWFdoaWxlRXhwcmVzc2lvbl9fR3JvdXBfXzAgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTczMzo0OiBydWxlX19YV2hpbGVFeHByZXNzaW9uX19Hcm91cF9fMAorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTgzMzozOiAoIHJ1bGVfX1hXaGlsZUV4cHJlc3Npb25fX0dyb3VwX18wICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE4MzM6NDogcnVsZV9fWFdoaWxlRXhwcmVzc2lvbl9fR3JvdXBfXzAKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzIpOwogICAgICAgICAgICAgcnVsZV9fWFdoaWxlRXhwcmVzc2lvbl9fR3JvdXBfXzAoKTsKQEAgLTU4NjgsMTEgKzYyMjIsMTEgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJlbnRyeVJ1bGVYRG9XaGlsZUV4cHJlc3Npb24iCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTc0MjoxOiBlbnRyeVJ1bGVYRG9XaGlsZUV4cHJlc3Npb24gOiBydWxlWERvV2hpbGVFeHByZXNzaW9uIEVPRiA7CisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTg0MjoxOiBlbnRyeVJ1bGVYRG9XaGlsZUV4cHJlc3Npb24gOiBydWxlWERvV2hpbGVFeHByZXNzaW9uIEVPRiA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgZW50cnlSdWxlWERvV2hpbGVFeHByZXNzaW9uKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE3NDM6MTogKCBydWxlWERvV2hpbGVFeHByZXNzaW9uIEVPRiApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNzQ0OjE6IHJ1bGVYRG9XaGlsZUV4cHJlc3Npb24gRU9GCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxODQzOjE6ICggcnVsZVhEb1doaWxlRXhwcmVzc2lvbiBFT0YgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTg0NDoxOiBydWxlWERvV2hpbGVFeHByZXNzaW9uIEVPRgogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYRG9XaGlsZUV4cHJlc3Npb25SdWxlKCkpOyAKQEAgLTU5MDIsMjMgKzYyNTYsMjMgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlWERvV2hpbGVFeHByZXNzaW9uIgotICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE3NTE6MTogcnVsZVhEb1doaWxlRXhwcmVzc2lvbiA6ICggKCBydWxlX19YRG9XaGlsZUV4cHJlc3Npb25fX0dyb3VwX18wICkgKSA7CisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTg1MToxOiBydWxlWERvV2hpbGVFeHByZXNzaW9uIDogKCAoIHJ1bGVfX1hEb1doaWxlRXhwcmVzc2lvbl9fR3JvdXBfXzAgKSApIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlWERvV2hpbGVFeHByZXNzaW9uKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE3NTU6MjogKCAoICggcnVsZV9fWERvV2hpbGVFeHByZXNzaW9uX19Hcm91cF9fMCApICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTc1NjoyOiAoICggcnVsZV9fWERvV2hpbGVFeHByZXNzaW9uX19Hcm91cF9fMCApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE4NTU6MjogKCAoICggcnVsZV9fWERvV2hpbGVFeHByZXNzaW9uX19Hcm91cF9fMCApICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTg1NjoyOiAoICggcnVsZV9fWERvV2hpbGVFeHByZXNzaW9uX19Hcm91cF9fMCApICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE3NTY6MjogKCAoIHJ1bGVfX1hEb1doaWxlRXhwcmVzc2lvbl9fR3JvdXBfXzAgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNzU3OjM6ICggcnVsZV9fWERvV2hpbGVFeHByZXNzaW9uX19Hcm91cF9fMCApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxODU2OjI6ICggKCBydWxlX19YRG9XaGlsZUV4cHJlc3Npb25fX0dyb3VwX18wICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTg1NzozOiAoIHJ1bGVfX1hEb1doaWxlRXhwcmVzc2lvbl9fR3JvdXBfXzAgKQogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYRG9XaGlsZUV4cHJlc3Npb25BY2Nlc3MoKS5nZXRHcm91cCgpKTsgCiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNzU4OjM6ICggcnVsZV9fWERvV2hpbGVFeHByZXNzaW9uX19Hcm91cF9fMCApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNzU4OjQ6IHJ1bGVfX1hEb1doaWxlRXhwcmVzc2lvbl9fR3JvdXBfXzAKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE4NTg6MzogKCBydWxlX19YRG9XaGlsZUV4cHJlc3Npb25fX0dyb3VwX18wICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE4NTg6NDogcnVsZV9fWERvV2hpbGVFeHByZXNzaW9uX19Hcm91cF9fMAogICAgICAgICAgICAgewogICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMik7CiAgICAgICAgICAgICBydWxlX19YRG9XaGlsZUV4cHJlc3Npb25fX0dyb3VwX18wKCk7CkBAIC01OTUzLDExICs2MzA3LDExIEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAiZW50cnlSdWxlWEJsb2NrRXhwcmVzc2lvbiIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNzY3OjE6IGVudHJ5UnVsZVhCbG9ja0V4cHJlc3Npb24gOiBydWxlWEJsb2NrRXhwcmVzc2lvbiBFT0YgOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE4Njc6MTogZW50cnlSdWxlWEJsb2NrRXhwcmVzc2lvbiA6IHJ1bGVYQmxvY2tFeHByZXNzaW9uIEVPRiA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgZW50cnlSdWxlWEJsb2NrRXhwcmVzc2lvbigpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNzY4OjE6ICggcnVsZVhCbG9ja0V4cHJlc3Npb24gRU9GICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE3Njk6MTogcnVsZVhCbG9ja0V4cHJlc3Npb24gRU9GCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxODY4OjE6ICggcnVsZVhCbG9ja0V4cHJlc3Npb24gRU9GICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE4Njk6MTogcnVsZVhCbG9ja0V4cHJlc3Npb24gRU9GCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhCbG9ja0V4cHJlc3Npb25SdWxlKCkpOyAKQEAgLTU5ODcsMjMgKzYzNDEsMjMgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlWEJsb2NrRXhwcmVzc2lvbiIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNzc2OjE6IHJ1bGVYQmxvY2tFeHByZXNzaW9uIDogKCAoIHJ1bGVfX1hCbG9ja0V4cHJlc3Npb25fX0dyb3VwX18wICkgKSA7CisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTg3NjoxOiBydWxlWEJsb2NrRXhwcmVzc2lvbiA6ICggKCBydWxlX19YQmxvY2tFeHByZXNzaW9uX19Hcm91cF9fMCApICkgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVYQmxvY2tFeHByZXNzaW9uKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE3ODA6MjogKCAoICggcnVsZV9fWEJsb2NrRXhwcmVzc2lvbl9fR3JvdXBfXzAgKSApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE3ODE6MjogKCAoIHJ1bGVfX1hCbG9ja0V4cHJlc3Npb25fX0dyb3VwX18wICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTg4MDoyOiAoICggKCBydWxlX19YQmxvY2tFeHByZXNzaW9uX19Hcm91cF9fMCApICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTg4MToyOiAoICggcnVsZV9fWEJsb2NrRXhwcmVzc2lvbl9fR3JvdXBfXzAgKSApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNzgxOjI6ICggKCBydWxlX19YQmxvY2tFeHByZXNzaW9uX19Hcm91cF9fMCApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE3ODI6MzogKCBydWxlX19YQmxvY2tFeHByZXNzaW9uX19Hcm91cF9fMCApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxODgxOjI6ICggKCBydWxlX19YQmxvY2tFeHByZXNzaW9uX19Hcm91cF9fMCApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE4ODI6MzogKCBydWxlX19YQmxvY2tFeHByZXNzaW9uX19Hcm91cF9fMCApCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhCbG9ja0V4cHJlc3Npb25BY2Nlc3MoKS5nZXRHcm91cCgpKTsgCiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNzgzOjM6ICggcnVsZV9fWEJsb2NrRXhwcmVzc2lvbl9fR3JvdXBfXzAgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTc4Mzo0OiBydWxlX19YQmxvY2tFeHByZXNzaW9uX19Hcm91cF9fMAorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTg4MzozOiAoIHJ1bGVfX1hCbG9ja0V4cHJlc3Npb25fX0dyb3VwX18wICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE4ODM6NDogcnVsZV9fWEJsb2NrRXhwcmVzc2lvbl9fR3JvdXBfXzAKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzIpOwogICAgICAgICAgICAgcnVsZV9fWEJsb2NrRXhwcmVzc2lvbl9fR3JvdXBfXzAoKTsKQEAgLTYwMzgsMTEgKzYzOTIsMTEgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJlbnRyeVJ1bGVYRXhwcmVzc2lvbk9yVmFyRGVjbGFyYXRpb24iCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTc5MjoxOiBlbnRyeVJ1bGVYRXhwcmVzc2lvbk9yVmFyRGVjbGFyYXRpb24gOiBydWxlWEV4cHJlc3Npb25PclZhckRlY2xhcmF0aW9uIEVPRiA7CisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTg5MjoxOiBlbnRyeVJ1bGVYRXhwcmVzc2lvbk9yVmFyRGVjbGFyYXRpb24gOiBydWxlWEV4cHJlc3Npb25PclZhckRlY2xhcmF0aW9uIEVPRiA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgZW50cnlSdWxlWEV4cHJlc3Npb25PclZhckRlY2xhcmF0aW9uKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE3OTM6MTogKCBydWxlWEV4cHJlc3Npb25PclZhckRlY2xhcmF0aW9uIEVPRiApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNzk0OjE6IHJ1bGVYRXhwcmVzc2lvbk9yVmFyRGVjbGFyYXRpb24gRU9GCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxODkzOjE6ICggcnVsZVhFeHByZXNzaW9uT3JWYXJEZWNsYXJhdGlvbiBFT0YgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTg5NDoxOiBydWxlWEV4cHJlc3Npb25PclZhckRlY2xhcmF0aW9uIEVPRgogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYRXhwcmVzc2lvbk9yVmFyRGVjbGFyYXRpb25SdWxlKCkpOyAKQEAgLTYwNzIsMjMgKzY0MjYsMjMgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlWEV4cHJlc3Npb25PclZhckRlY2xhcmF0aW9uIgotICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE4MDE6MTogcnVsZVhFeHByZXNzaW9uT3JWYXJEZWNsYXJhdGlvbiA6ICggKCBydWxlX19YRXhwcmVzc2lvbk9yVmFyRGVjbGFyYXRpb25fX0FsdGVybmF0aXZlcyApICkgOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE5MDE6MTogcnVsZVhFeHByZXNzaW9uT3JWYXJEZWNsYXJhdGlvbiA6ICggKCBydWxlX19YRXhwcmVzc2lvbk9yVmFyRGVjbGFyYXRpb25fX0FsdGVybmF0aXZlcyApICkgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVYRXhwcmVzc2lvbk9yVmFyRGVjbGFyYXRpb24oKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTgwNToyOiAoICggKCBydWxlX19YRXhwcmVzc2lvbk9yVmFyRGVjbGFyYXRpb25fX0FsdGVybmF0aXZlcyApICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTgwNjoyOiAoICggcnVsZV9fWEV4cHJlc3Npb25PclZhckRlY2xhcmF0aW9uX19BbHRlcm5hdGl2ZXMgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxOTA1OjI6ICggKCAoIHJ1bGVfX1hFeHByZXNzaW9uT3JWYXJEZWNsYXJhdGlvbl9fQWx0ZXJuYXRpdmVzICkgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxOTA2OjI6ICggKCBydWxlX19YRXhwcmVzc2lvbk9yVmFyRGVjbGFyYXRpb25fX0FsdGVybmF0aXZlcyApICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE4MDY6MjogKCAoIHJ1bGVfX1hFeHByZXNzaW9uT3JWYXJEZWNsYXJhdGlvbl9fQWx0ZXJuYXRpdmVzICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTgwNzozOiAoIHJ1bGVfX1hFeHByZXNzaW9uT3JWYXJEZWNsYXJhdGlvbl9fQWx0ZXJuYXRpdmVzICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE5MDY6MjogKCAoIHJ1bGVfX1hFeHByZXNzaW9uT3JWYXJEZWNsYXJhdGlvbl9fQWx0ZXJuYXRpdmVzICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTkwNzozOiAoIHJ1bGVfX1hFeHByZXNzaW9uT3JWYXJEZWNsYXJhdGlvbl9fQWx0ZXJuYXRpdmVzICkKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WEV4cHJlc3Npb25PclZhckRlY2xhcmF0aW9uQWNjZXNzKCkuZ2V0QWx0ZXJuYXRpdmVzKCkpOyAKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE4MDg6MzogKCBydWxlX19YRXhwcmVzc2lvbk9yVmFyRGVjbGFyYXRpb25fX0FsdGVybmF0aXZlcyApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxODA4OjQ6IHJ1bGVfX1hFeHByZXNzaW9uT3JWYXJEZWNsYXJhdGlvbl9fQWx0ZXJuYXRpdmVzCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxOTA4OjM6ICggcnVsZV9fWEV4cHJlc3Npb25PclZhckRlY2xhcmF0aW9uX19BbHRlcm5hdGl2ZXMgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTkwODo0OiBydWxlX19YRXhwcmVzc2lvbk9yVmFyRGVjbGFyYXRpb25fX0FsdGVybmF0aXZlcwogICAgICAgICAgICAgewogICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMik7CiAgICAgICAgICAgICBydWxlX19YRXhwcmVzc2lvbk9yVmFyRGVjbGFyYXRpb25fX0FsdGVybmF0aXZlcygpOwpAQCAtNjEyMywxMSArNjQ3NywxMSBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgImVudHJ5UnVsZVhWYXJpYWJsZURlY2xhcmF0aW9uIgotICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE4MTc6MTogZW50cnlSdWxlWFZhcmlhYmxlRGVjbGFyYXRpb24gOiBydWxlWFZhcmlhYmxlRGVjbGFyYXRpb24gRU9GIDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxOTE3OjE6IGVudHJ5UnVsZVhWYXJpYWJsZURlY2xhcmF0aW9uIDogcnVsZVhWYXJpYWJsZURlY2xhcmF0aW9uIEVPRiA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgZW50cnlSdWxlWFZhcmlhYmxlRGVjbGFyYXRpb24oKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTgxODoxOiAoIHJ1bGVYVmFyaWFibGVEZWNsYXJhdGlvbiBFT0YgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTgxOToxOiBydWxlWFZhcmlhYmxlRGVjbGFyYXRpb24gRU9GCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxOTE4OjE6ICggcnVsZVhWYXJpYWJsZURlY2xhcmF0aW9uIEVPRiApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxOTE5OjE6IHJ1bGVYVmFyaWFibGVEZWNsYXJhdGlvbiBFT0YKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WFZhcmlhYmxlRGVjbGFyYXRpb25SdWxlKCkpOyAKQEAgLTYxNTcsMjMgKzY1MTEsMjMgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlWFZhcmlhYmxlRGVjbGFyYXRpb24iCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTgyNjoxOiBydWxlWFZhcmlhYmxlRGVjbGFyYXRpb24gOiAoICggcnVsZV9fWFZhcmlhYmxlRGVjbGFyYXRpb25fX0dyb3VwX18wICkgKSA7CisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTkyNjoxOiBydWxlWFZhcmlhYmxlRGVjbGFyYXRpb24gOiAoICggcnVsZV9fWFZhcmlhYmxlRGVjbGFyYXRpb25fX0dyb3VwX18wICkgKSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZVhWYXJpYWJsZURlY2xhcmF0aW9uKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE4MzA6MjogKCAoICggcnVsZV9fWFZhcmlhYmxlRGVjbGFyYXRpb25fX0dyb3VwX18wICkgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxODMxOjI6ICggKCBydWxlX19YVmFyaWFibGVEZWNsYXJhdGlvbl9fR3JvdXBfXzAgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxOTMwOjI6ICggKCAoIHJ1bGVfX1hWYXJpYWJsZURlY2xhcmF0aW9uX19Hcm91cF9fMCApICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTkzMToyOiAoICggcnVsZV9fWFZhcmlhYmxlRGVjbGFyYXRpb25fX0dyb3VwX18wICkgKQogICAgICAgICAgICAgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTgzMToyOiAoICggcnVsZV9fWFZhcmlhYmxlRGVjbGFyYXRpb25fX0dyb3VwX18wICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTgzMjozOiAoIHJ1bGVfX1hWYXJpYWJsZURlY2xhcmF0aW9uX19Hcm91cF9fMCApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxOTMxOjI6ICggKCBydWxlX19YVmFyaWFibGVEZWNsYXJhdGlvbl9fR3JvdXBfXzAgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxOTMyOjM6ICggcnVsZV9fWFZhcmlhYmxlRGVjbGFyYXRpb25fX0dyb3VwX18wICkKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WFZhcmlhYmxlRGVjbGFyYXRpb25BY2Nlc3MoKS5nZXRHcm91cCgpKTsgCiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxODMzOjM6ICggcnVsZV9fWFZhcmlhYmxlRGVjbGFyYXRpb25fX0dyb3VwX18wICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE4MzM6NDogcnVsZV9fWFZhcmlhYmxlRGVjbGFyYXRpb25fX0dyb3VwX18wCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxOTMzOjM6ICggcnVsZV9fWFZhcmlhYmxlRGVjbGFyYXRpb25fX0dyb3VwX18wICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE5MzM6NDogcnVsZV9fWFZhcmlhYmxlRGVjbGFyYXRpb25fX0dyb3VwX18wCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV18yKTsKICAgICAgICAgICAgIHJ1bGVfX1hWYXJpYWJsZURlY2xhcmF0aW9uX19Hcm91cF9fMCgpOwpAQCAtNjIwOCwxMSArNjU2MiwxMSBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgImVudHJ5UnVsZUp2bUZvcm1hbFBhcmFtZXRlciIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxODQyOjE6IGVudHJ5UnVsZUp2bUZvcm1hbFBhcmFtZXRlciA6IHJ1bGVKdm1Gb3JtYWxQYXJhbWV0ZXIgRU9GIDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxOTQyOjE6IGVudHJ5UnVsZUp2bUZvcm1hbFBhcmFtZXRlciA6IHJ1bGVKdm1Gb3JtYWxQYXJhbWV0ZXIgRU9GIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBlbnRyeVJ1bGVKdm1Gb3JtYWxQYXJhbWV0ZXIoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTg0MzoxOiAoIHJ1bGVKdm1Gb3JtYWxQYXJhbWV0ZXIgRU9GICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE4NDQ6MTogcnVsZUp2bUZvcm1hbFBhcmFtZXRlciBFT0YKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE5NDM6MTogKCBydWxlSnZtRm9ybWFsUGFyYW1ldGVyIEVPRiApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxOTQ0OjE6IHJ1bGVKdm1Gb3JtYWxQYXJhbWV0ZXIgRU9GCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldEp2bUZvcm1hbFBhcmFtZXRlclJ1bGUoKSk7IApAQCAtNjI0MiwyMyArNjU5NiwyMyBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVKdm1Gb3JtYWxQYXJhbWV0ZXIiCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTg1MToxOiBydWxlSnZtRm9ybWFsUGFyYW1ldGVyIDogKCAoIHJ1bGVfX0p2bUZvcm1hbFBhcmFtZXRlcl9fR3JvdXBfXzAgKSApIDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxOTUxOjE6IHJ1bGVKdm1Gb3JtYWxQYXJhbWV0ZXIgOiAoICggcnVsZV9fSnZtRm9ybWFsUGFyYW1ldGVyX19Hcm91cF9fMCApICkgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVKdm1Gb3JtYWxQYXJhbWV0ZXIoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTg1NToyOiAoICggKCBydWxlX19Kdm1Gb3JtYWxQYXJhbWV0ZXJfX0dyb3VwX18wICkgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxODU2OjI6ICggKCBydWxlX19Kdm1Gb3JtYWxQYXJhbWV0ZXJfX0dyb3VwX18wICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTk1NToyOiAoICggKCBydWxlX19Kdm1Gb3JtYWxQYXJhbWV0ZXJfX0dyb3VwX18wICkgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxOTU2OjI6ICggKCBydWxlX19Kdm1Gb3JtYWxQYXJhbWV0ZXJfX0dyb3VwX18wICkgKQogICAgICAgICAgICAgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTg1NjoyOiAoICggcnVsZV9fSnZtRm9ybWFsUGFyYW1ldGVyX19Hcm91cF9fMCApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE4NTc6MzogKCBydWxlX19Kdm1Gb3JtYWxQYXJhbWV0ZXJfX0dyb3VwX18wICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE5NTY6MjogKCAoIHJ1bGVfX0p2bUZvcm1hbFBhcmFtZXRlcl9fR3JvdXBfXzAgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxOTU3OjM6ICggcnVsZV9fSnZtRm9ybWFsUGFyYW1ldGVyX19Hcm91cF9fMCApCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldEp2bUZvcm1hbFBhcmFtZXRlckFjY2VzcygpLmdldEdyb3VwKCkpOyAKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE4NTg6MzogKCBydWxlX19Kdm1Gb3JtYWxQYXJhbWV0ZXJfX0dyb3VwX18wICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE4NTg6NDogcnVsZV9fSnZtRm9ybWFsUGFyYW1ldGVyX19Hcm91cF9fMAorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTk1ODozOiAoIHJ1bGVfX0p2bUZvcm1hbFBhcmFtZXRlcl9fR3JvdXBfXzAgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTk1ODo0OiBydWxlX19Kdm1Gb3JtYWxQYXJhbWV0ZXJfX0dyb3VwX18wCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV18yKTsKICAgICAgICAgICAgIHJ1bGVfX0p2bUZvcm1hbFBhcmFtZXRlcl9fR3JvdXBfXzAoKTsKQEAgLTYyOTMsMTEgKzY2NDcsMTEgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJlbnRyeVJ1bGVGdWxsSnZtRm9ybWFsUGFyYW1ldGVyIgotICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE4Njc6MTogZW50cnlSdWxlRnVsbEp2bUZvcm1hbFBhcmFtZXRlciA6IHJ1bGVGdWxsSnZtRm9ybWFsUGFyYW1ldGVyIEVPRiA7CisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTk2NzoxOiBlbnRyeVJ1bGVGdWxsSnZtRm9ybWFsUGFyYW1ldGVyIDogcnVsZUZ1bGxKdm1Gb3JtYWxQYXJhbWV0ZXIgRU9GIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBlbnRyeVJ1bGVGdWxsSnZtRm9ybWFsUGFyYW1ldGVyKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE4Njg6MTogKCBydWxlRnVsbEp2bUZvcm1hbFBhcmFtZXRlciBFT0YgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTg2OToxOiBydWxlRnVsbEp2bUZvcm1hbFBhcmFtZXRlciBFT0YKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE5Njg6MTogKCBydWxlRnVsbEp2bUZvcm1hbFBhcmFtZXRlciBFT0YgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTk2OToxOiBydWxlRnVsbEp2bUZvcm1hbFBhcmFtZXRlciBFT0YKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0RnVsbEp2bUZvcm1hbFBhcmFtZXRlclJ1bGUoKSk7IApAQCAtNjMyNywyMyArNjY4MSwyMyBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVGdWxsSnZtRm9ybWFsUGFyYW1ldGVyIgotICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE4NzY6MTogcnVsZUZ1bGxKdm1Gb3JtYWxQYXJhbWV0ZXIgOiAoICggcnVsZV9fRnVsbEp2bUZvcm1hbFBhcmFtZXRlcl9fR3JvdXBfXzAgKSApIDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxOTc2OjE6IHJ1bGVGdWxsSnZtRm9ybWFsUGFyYW1ldGVyIDogKCAoIHJ1bGVfX0Z1bGxKdm1Gb3JtYWxQYXJhbWV0ZXJfX0dyb3VwX18wICkgKSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZUZ1bGxKdm1Gb3JtYWxQYXJhbWV0ZXIoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTg4MDoyOiAoICggKCBydWxlX19GdWxsSnZtRm9ybWFsUGFyYW1ldGVyX19Hcm91cF9fMCApICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTg4MToyOiAoICggcnVsZV9fRnVsbEp2bUZvcm1hbFBhcmFtZXRlcl9fR3JvdXBfXzAgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxOTgwOjI6ICggKCAoIHJ1bGVfX0Z1bGxKdm1Gb3JtYWxQYXJhbWV0ZXJfX0dyb3VwX18wICkgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxOTgxOjI6ICggKCBydWxlX19GdWxsSnZtRm9ybWFsUGFyYW1ldGVyX19Hcm91cF9fMCApICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE4ODE6MjogKCAoIHJ1bGVfX0Z1bGxKdm1Gb3JtYWxQYXJhbWV0ZXJfX0dyb3VwX18wICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTg4MjozOiAoIHJ1bGVfX0Z1bGxKdm1Gb3JtYWxQYXJhbWV0ZXJfX0dyb3VwX18wICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE5ODE6MjogKCAoIHJ1bGVfX0Z1bGxKdm1Gb3JtYWxQYXJhbWV0ZXJfX0dyb3VwX18wICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTk4MjozOiAoIHJ1bGVfX0Z1bGxKdm1Gb3JtYWxQYXJhbWV0ZXJfX0dyb3VwX18wICkKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0RnVsbEp2bUZvcm1hbFBhcmFtZXRlckFjY2VzcygpLmdldEdyb3VwKCkpOyAKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE4ODM6MzogKCBydWxlX19GdWxsSnZtRm9ybWFsUGFyYW1ldGVyX19Hcm91cF9fMCApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxODgzOjQ6IHJ1bGVfX0Z1bGxKdm1Gb3JtYWxQYXJhbWV0ZXJfX0dyb3VwX18wCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxOTgzOjM6ICggcnVsZV9fRnVsbEp2bUZvcm1hbFBhcmFtZXRlcl9fR3JvdXBfXzAgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTk4Mzo0OiBydWxlX19GdWxsSnZtRm9ybWFsUGFyYW1ldGVyX19Hcm91cF9fMAogICAgICAgICAgICAgewogICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMik7CiAgICAgICAgICAgICBydWxlX19GdWxsSnZtRm9ybWFsUGFyYW1ldGVyX19Hcm91cF9fMCgpOwpAQCAtNjM3OCwxMSArNjczMiwxMSBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgImVudHJ5UnVsZVhGZWF0dXJlQ2FsbCIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxODkyOjE6IGVudHJ5UnVsZVhGZWF0dXJlQ2FsbCA6IHJ1bGVYRmVhdHVyZUNhbGwgRU9GIDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxOTkyOjE6IGVudHJ5UnVsZVhGZWF0dXJlQ2FsbCA6IHJ1bGVYRmVhdHVyZUNhbGwgRU9GIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBlbnRyeVJ1bGVYRmVhdHVyZUNhbGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTg5MzoxOiAoIHJ1bGVYRmVhdHVyZUNhbGwgRU9GICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE4OTQ6MTogcnVsZVhGZWF0dXJlQ2FsbCBFT0YKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE5OTM6MTogKCBydWxlWEZlYXR1cmVDYWxsIEVPRiApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxOTk0OjE6IHJ1bGVYRmVhdHVyZUNhbGwgRU9GCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhGZWF0dXJlQ2FsbFJ1bGUoKSk7IApAQCAtNjQxMiwyMyArNjc2NiwyMyBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVYRmVhdHVyZUNhbGwiCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTkwMToxOiBydWxlWEZlYXR1cmVDYWxsIDogKCAoIHJ1bGVfX1hGZWF0dXJlQ2FsbF9fR3JvdXBfXzAgKSApIDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMDAxOjE6IHJ1bGVYRmVhdHVyZUNhbGwgOiAoICggcnVsZV9fWEZlYXR1cmVDYWxsX19Hcm91cF9fMCApICkgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVYRmVhdHVyZUNhbGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTkwNToyOiAoICggKCBydWxlX19YRmVhdHVyZUNhbGxfX0dyb3VwX18wICkgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxOTA2OjI6ICggKCBydWxlX19YRmVhdHVyZUNhbGxfX0dyb3VwX18wICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjAwNToyOiAoICggKCBydWxlX19YRmVhdHVyZUNhbGxfX0dyb3VwX18wICkgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMDA2OjI6ICggKCBydWxlX19YRmVhdHVyZUNhbGxfX0dyb3VwX18wICkgKQogICAgICAgICAgICAgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTkwNjoyOiAoICggcnVsZV9fWEZlYXR1cmVDYWxsX19Hcm91cF9fMCApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE5MDc6MzogKCBydWxlX19YRmVhdHVyZUNhbGxfX0dyb3VwX18wICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIwMDY6MjogKCAoIHJ1bGVfX1hGZWF0dXJlQ2FsbF9fR3JvdXBfXzAgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMDA3OjM6ICggcnVsZV9fWEZlYXR1cmVDYWxsX19Hcm91cF9fMCApCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhGZWF0dXJlQ2FsbEFjY2VzcygpLmdldEdyb3VwKCkpOyAKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE5MDg6MzogKCBydWxlX19YRmVhdHVyZUNhbGxfX0dyb3VwX18wICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE5MDg6NDogcnVsZV9fWEZlYXR1cmVDYWxsX19Hcm91cF9fMAorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjAwODozOiAoIHJ1bGVfX1hGZWF0dXJlQ2FsbF9fR3JvdXBfXzAgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjAwODo0OiBydWxlX19YRmVhdHVyZUNhbGxfX0dyb3VwX18wCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV18yKTsKICAgICAgICAgICAgIHJ1bGVfX1hGZWF0dXJlQ2FsbF9fR3JvdXBfXzAoKTsKQEAgLTY0NjMsMTEgKzY4MTcsMTEgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJlbnRyeVJ1bGVGZWF0dXJlQ2FsbElEIgotICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE5MTc6MTogZW50cnlSdWxlRmVhdHVyZUNhbGxJRCA6IHJ1bGVGZWF0dXJlQ2FsbElEIEVPRiA7CisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjAxNzoxOiBlbnRyeVJ1bGVGZWF0dXJlQ2FsbElEIDogcnVsZUZlYXR1cmVDYWxsSUQgRU9GIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBlbnRyeVJ1bGVGZWF0dXJlQ2FsbElEKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE5MTg6MTogKCBydWxlRmVhdHVyZUNhbGxJRCBFT0YgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTkxOToxOiBydWxlRmVhdHVyZUNhbGxJRCBFT0YKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIwMTg6MTogKCBydWxlRmVhdHVyZUNhbGxJRCBFT0YgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjAxOToxOiBydWxlRmVhdHVyZUNhbGxJRCBFT0YKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0RmVhdHVyZUNhbGxJRFJ1bGUoKSk7IApAQCAtNjQ5NywyMyArNjg1MSwyMyBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVGZWF0dXJlQ2FsbElEIgotICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE5MjY6MTogcnVsZUZlYXR1cmVDYWxsSUQgOiAoICggcnVsZV9fRmVhdHVyZUNhbGxJRF9fQWx0ZXJuYXRpdmVzICkgKSA7CisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjAyNjoxOiBydWxlRmVhdHVyZUNhbGxJRCA6ICggKCBydWxlX19GZWF0dXJlQ2FsbElEX19BbHRlcm5hdGl2ZXMgKSApIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlRmVhdHVyZUNhbGxJRCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxOTMwOjI6ICggKCAoIHJ1bGVfX0ZlYXR1cmVDYWxsSURfX0FsdGVybmF0aXZlcyApICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTkzMToyOiAoICggcnVsZV9fRmVhdHVyZUNhbGxJRF9fQWx0ZXJuYXRpdmVzICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjAzMDoyOiAoICggKCBydWxlX19GZWF0dXJlQ2FsbElEX19BbHRlcm5hdGl2ZXMgKSApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIwMzE6MjogKCAoIHJ1bGVfX0ZlYXR1cmVDYWxsSURfX0FsdGVybmF0aXZlcyApICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE5MzE6MjogKCAoIHJ1bGVfX0ZlYXR1cmVDYWxsSURfX0FsdGVybmF0aXZlcyApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE5MzI6MzogKCBydWxlX19GZWF0dXJlQ2FsbElEX19BbHRlcm5hdGl2ZXMgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjAzMToyOiAoICggcnVsZV9fRmVhdHVyZUNhbGxJRF9fQWx0ZXJuYXRpdmVzICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjAzMjozOiAoIHJ1bGVfX0ZlYXR1cmVDYWxsSURfX0FsdGVybmF0aXZlcyApCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldEZlYXR1cmVDYWxsSURBY2Nlc3MoKS5nZXRBbHRlcm5hdGl2ZXMoKSk7IAogICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTkzMzozOiAoIHJ1bGVfX0ZlYXR1cmVDYWxsSURfX0FsdGVybmF0aXZlcyApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxOTMzOjQ6IHJ1bGVfX0ZlYXR1cmVDYWxsSURfX0FsdGVybmF0aXZlcworICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjAzMzozOiAoIHJ1bGVfX0ZlYXR1cmVDYWxsSURfX0FsdGVybmF0aXZlcyApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMDMzOjQ6IHJ1bGVfX0ZlYXR1cmVDYWxsSURfX0FsdGVybmF0aXZlcwogICAgICAgICAgICAgewogICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMik7CiAgICAgICAgICAgICBydWxlX19GZWF0dXJlQ2FsbElEX19BbHRlcm5hdGl2ZXMoKTsKQEAgLTY1NDgsMTEgKzY5MDIsMTEgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJlbnRyeVJ1bGVJZE9yU3VwZXIiCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTk0MjoxOiBlbnRyeVJ1bGVJZE9yU3VwZXIgOiBydWxlSWRPclN1cGVyIEVPRiA7CisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjA0MjoxOiBlbnRyeVJ1bGVJZE9yU3VwZXIgOiBydWxlSWRPclN1cGVyIEVPRiA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgZW50cnlSdWxlSWRPclN1cGVyKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE5NDM6MTogKCBydWxlSWRPclN1cGVyIEVPRiApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxOTQ0OjE6IHJ1bGVJZE9yU3VwZXIgRU9GCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMDQzOjE6ICggcnVsZUlkT3JTdXBlciBFT0YgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjA0NDoxOiBydWxlSWRPclN1cGVyIEVPRgogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRJZE9yU3VwZXJSdWxlKCkpOyAKQEAgLTY1ODIsMjMgKzY5MzYsMjMgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlSWRPclN1cGVyIgotICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE5NTE6MTogcnVsZUlkT3JTdXBlciA6ICggKCBydWxlX19JZE9yU3VwZXJfX0FsdGVybmF0aXZlcyApICkgOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIwNTE6MTogcnVsZUlkT3JTdXBlciA6ICggKCBydWxlX19JZE9yU3VwZXJfX0FsdGVybmF0aXZlcyApICkgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVJZE9yU3VwZXIoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTk1NToyOiAoICggKCBydWxlX19JZE9yU3VwZXJfX0FsdGVybmF0aXZlcyApICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTk1NjoyOiAoICggcnVsZV9fSWRPclN1cGVyX19BbHRlcm5hdGl2ZXMgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMDU1OjI6ICggKCAoIHJ1bGVfX0lkT3JTdXBlcl9fQWx0ZXJuYXRpdmVzICkgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMDU2OjI6ICggKCBydWxlX19JZE9yU3VwZXJfX0FsdGVybmF0aXZlcyApICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE5NTY6MjogKCAoIHJ1bGVfX0lkT3JTdXBlcl9fQWx0ZXJuYXRpdmVzICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTk1NzozOiAoIHJ1bGVfX0lkT3JTdXBlcl9fQWx0ZXJuYXRpdmVzICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIwNTY6MjogKCAoIHJ1bGVfX0lkT3JTdXBlcl9fQWx0ZXJuYXRpdmVzICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjA1NzozOiAoIHJ1bGVfX0lkT3JTdXBlcl9fQWx0ZXJuYXRpdmVzICkKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0SWRPclN1cGVyQWNjZXNzKCkuZ2V0QWx0ZXJuYXRpdmVzKCkpOyAKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE5NTg6MzogKCBydWxlX19JZE9yU3VwZXJfX0FsdGVybmF0aXZlcyApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxOTU4OjQ6IHJ1bGVfX0lkT3JTdXBlcl9fQWx0ZXJuYXRpdmVzCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMDU4OjM6ICggcnVsZV9fSWRPclN1cGVyX19BbHRlcm5hdGl2ZXMgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjA1ODo0OiBydWxlX19JZE9yU3VwZXJfX0FsdGVybmF0aXZlcwogICAgICAgICAgICAgewogICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMik7CiAgICAgICAgICAgICBydWxlX19JZE9yU3VwZXJfX0FsdGVybmF0aXZlcygpOwpAQCAtNjYzMywxMSArNjk4NywxMSBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgImVudHJ5UnVsZVhDb25zdHJ1Y3RvckNhbGwiCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTk2NzoxOiBlbnRyeVJ1bGVYQ29uc3RydWN0b3JDYWxsIDogcnVsZVhDb25zdHJ1Y3RvckNhbGwgRU9GIDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMDY3OjE6IGVudHJ5UnVsZVhDb25zdHJ1Y3RvckNhbGwgOiBydWxlWENvbnN0cnVjdG9yQ2FsbCBFT0YgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIGVudHJ5UnVsZVhDb25zdHJ1Y3RvckNhbGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTk2ODoxOiAoIHJ1bGVYQ29uc3RydWN0b3JDYWxsIEVPRiApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxOTY5OjE6IHJ1bGVYQ29uc3RydWN0b3JDYWxsIEVPRgorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjA2ODoxOiAoIHJ1bGVYQ29uc3RydWN0b3JDYWxsIEVPRiApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMDY5OjE6IHJ1bGVYQ29uc3RydWN0b3JDYWxsIEVPRgogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYQ29uc3RydWN0b3JDYWxsUnVsZSgpKTsgCkBAIC02NjY3LDIzICs3MDIxLDIzIEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZVhDb25zdHJ1Y3RvckNhbGwiCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTk3NjoxOiBydWxlWENvbnN0cnVjdG9yQ2FsbCA6ICggKCBydWxlX19YQ29uc3RydWN0b3JDYWxsX19Hcm91cF9fMCApICkgOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIwNzY6MTogcnVsZVhDb25zdHJ1Y3RvckNhbGwgOiAoICggcnVsZV9fWENvbnN0cnVjdG9yQ2FsbF9fR3JvdXBfXzAgKSApIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlWENvbnN0cnVjdG9yQ2FsbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxOTgwOjI6ICggKCAoIHJ1bGVfX1hDb25zdHJ1Y3RvckNhbGxfX0dyb3VwX18wICkgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxOTgxOjI6ICggKCBydWxlX19YQ29uc3RydWN0b3JDYWxsX19Hcm91cF9fMCApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIwODA6MjogKCAoICggcnVsZV9fWENvbnN0cnVjdG9yQ2FsbF9fR3JvdXBfXzAgKSApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIwODE6MjogKCAoIHJ1bGVfX1hDb25zdHJ1Y3RvckNhbGxfX0dyb3VwX18wICkgKQogICAgICAgICAgICAgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTk4MToyOiAoICggcnVsZV9fWENvbnN0cnVjdG9yQ2FsbF9fR3JvdXBfXzAgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxOTgyOjM6ICggcnVsZV9fWENvbnN0cnVjdG9yQ2FsbF9fR3JvdXBfXzAgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjA4MToyOiAoICggcnVsZV9fWENvbnN0cnVjdG9yQ2FsbF9fR3JvdXBfXzAgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMDgyOjM6ICggcnVsZV9fWENvbnN0cnVjdG9yQ2FsbF9fR3JvdXBfXzAgKQogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYQ29uc3RydWN0b3JDYWxsQWNjZXNzKCkuZ2V0R3JvdXAoKSk7IAogICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTk4MzozOiAoIHJ1bGVfX1hDb25zdHJ1Y3RvckNhbGxfX0dyb3VwX18wICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE5ODM6NDogcnVsZV9fWENvbnN0cnVjdG9yQ2FsbF9fR3JvdXBfXzAKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIwODM6MzogKCBydWxlX19YQ29uc3RydWN0b3JDYWxsX19Hcm91cF9fMCApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMDgzOjQ6IHJ1bGVfX1hDb25zdHJ1Y3RvckNhbGxfX0dyb3VwX18wCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV18yKTsKICAgICAgICAgICAgIHJ1bGVfX1hDb25zdHJ1Y3RvckNhbGxfX0dyb3VwX18wKCk7CkBAIC02NzE4LDExICs3MDcyLDExIEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAiZW50cnlSdWxlWEJvb2xlYW5MaXRlcmFsIgotICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE5OTI6MTogZW50cnlSdWxlWEJvb2xlYW5MaXRlcmFsIDogcnVsZVhCb29sZWFuTGl0ZXJhbCBFT0YgOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIwOTI6MTogZW50cnlSdWxlWEJvb2xlYW5MaXRlcmFsIDogcnVsZVhCb29sZWFuTGl0ZXJhbCBFT0YgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIGVudHJ5UnVsZVhCb29sZWFuTGl0ZXJhbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxOTkzOjE6ICggcnVsZVhCb29sZWFuTGl0ZXJhbCBFT0YgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTk5NDoxOiBydWxlWEJvb2xlYW5MaXRlcmFsIEVPRgorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjA5MzoxOiAoIHJ1bGVYQm9vbGVhbkxpdGVyYWwgRU9GICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIwOTQ6MTogcnVsZVhCb29sZWFuTGl0ZXJhbCBFT0YKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WEJvb2xlYW5MaXRlcmFsUnVsZSgpKTsgCkBAIC02NzUyLDIzICs3MTA2LDIzIEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZVhCb29sZWFuTGl0ZXJhbCIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMDAxOjE6IHJ1bGVYQm9vbGVhbkxpdGVyYWwgOiAoICggcnVsZV9fWEJvb2xlYW5MaXRlcmFsX19Hcm91cF9fMCApICkgOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIxMDE6MTogcnVsZVhCb29sZWFuTGl0ZXJhbCA6ICggKCBydWxlX19YQm9vbGVhbkxpdGVyYWxfX0dyb3VwX18wICkgKSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZVhCb29sZWFuTGl0ZXJhbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMDA1OjI6ICggKCAoIHJ1bGVfX1hCb29sZWFuTGl0ZXJhbF9fR3JvdXBfXzAgKSApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIwMDY6MjogKCAoIHJ1bGVfX1hCb29sZWFuTGl0ZXJhbF9fR3JvdXBfXzAgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMTA1OjI6ICggKCAoIHJ1bGVfX1hCb29sZWFuTGl0ZXJhbF9fR3JvdXBfXzAgKSApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIxMDY6MjogKCAoIHJ1bGVfX1hCb29sZWFuTGl0ZXJhbF9fR3JvdXBfXzAgKSApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMDA2OjI6ICggKCBydWxlX19YQm9vbGVhbkxpdGVyYWxfX0dyb3VwX18wICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjAwNzozOiAoIHJ1bGVfX1hCb29sZWFuTGl0ZXJhbF9fR3JvdXBfXzAgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjEwNjoyOiAoICggcnVsZV9fWEJvb2xlYW5MaXRlcmFsX19Hcm91cF9fMCApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIxMDc6MzogKCBydWxlX19YQm9vbGVhbkxpdGVyYWxfX0dyb3VwX18wICkKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WEJvb2xlYW5MaXRlcmFsQWNjZXNzKCkuZ2V0R3JvdXAoKSk7IAogICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjAwODozOiAoIHJ1bGVfX1hCb29sZWFuTGl0ZXJhbF9fR3JvdXBfXzAgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjAwODo0OiBydWxlX19YQm9vbGVhbkxpdGVyYWxfX0dyb3VwX18wCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMTA4OjM6ICggcnVsZV9fWEJvb2xlYW5MaXRlcmFsX19Hcm91cF9fMCApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMTA4OjQ6IHJ1bGVfX1hCb29sZWFuTGl0ZXJhbF9fR3JvdXBfXzAKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzIpOwogICAgICAgICAgICAgcnVsZV9fWEJvb2xlYW5MaXRlcmFsX19Hcm91cF9fMCgpOwpAQCAtNjgwMywxMSArNzE1NywxMSBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgImVudHJ5UnVsZVhOdWxsTGl0ZXJhbCIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMDE3OjE6IGVudHJ5UnVsZVhOdWxsTGl0ZXJhbCA6IHJ1bGVYTnVsbExpdGVyYWwgRU9GIDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMTE3OjE6IGVudHJ5UnVsZVhOdWxsTGl0ZXJhbCA6IHJ1bGVYTnVsbExpdGVyYWwgRU9GIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBlbnRyeVJ1bGVYTnVsbExpdGVyYWwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjAxODoxOiAoIHJ1bGVYTnVsbExpdGVyYWwgRU9GICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIwMTk6MTogcnVsZVhOdWxsTGl0ZXJhbCBFT0YKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIxMTg6MTogKCBydWxlWE51bGxMaXRlcmFsIEVPRiApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMTE5OjE6IHJ1bGVYTnVsbExpdGVyYWwgRU9GCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhOdWxsTGl0ZXJhbFJ1bGUoKSk7IApAQCAtNjgzNywyMyArNzE5MSwyMyBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVYTnVsbExpdGVyYWwiCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjAyNjoxOiBydWxlWE51bGxMaXRlcmFsIDogKCAoIHJ1bGVfX1hOdWxsTGl0ZXJhbF9fR3JvdXBfXzAgKSApIDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMTI2OjE6IHJ1bGVYTnVsbExpdGVyYWwgOiAoICggcnVsZV9fWE51bGxMaXRlcmFsX19Hcm91cF9fMCApICkgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVYTnVsbExpdGVyYWwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjAzMDoyOiAoICggKCBydWxlX19YTnVsbExpdGVyYWxfX0dyb3VwX18wICkgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMDMxOjI6ICggKCBydWxlX19YTnVsbExpdGVyYWxfX0dyb3VwX18wICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjEzMDoyOiAoICggKCBydWxlX19YTnVsbExpdGVyYWxfX0dyb3VwX18wICkgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMTMxOjI6ICggKCBydWxlX19YTnVsbExpdGVyYWxfX0dyb3VwX18wICkgKQogICAgICAgICAgICAgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjAzMToyOiAoICggcnVsZV9fWE51bGxMaXRlcmFsX19Hcm91cF9fMCApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIwMzI6MzogKCBydWxlX19YTnVsbExpdGVyYWxfX0dyb3VwX18wICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIxMzE6MjogKCAoIHJ1bGVfX1hOdWxsTGl0ZXJhbF9fR3JvdXBfXzAgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMTMyOjM6ICggcnVsZV9fWE51bGxMaXRlcmFsX19Hcm91cF9fMCApCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhOdWxsTGl0ZXJhbEFjY2VzcygpLmdldEdyb3VwKCkpOyAKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIwMzM6MzogKCBydWxlX19YTnVsbExpdGVyYWxfX0dyb3VwX18wICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIwMzM6NDogcnVsZV9fWE51bGxMaXRlcmFsX19Hcm91cF9fMAorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjEzMzozOiAoIHJ1bGVfX1hOdWxsTGl0ZXJhbF9fR3JvdXBfXzAgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjEzMzo0OiBydWxlX19YTnVsbExpdGVyYWxfX0dyb3VwX18wCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV18yKTsKICAgICAgICAgICAgIHJ1bGVfX1hOdWxsTGl0ZXJhbF9fR3JvdXBfXzAoKTsKQEAgLTY4ODgsMTEgKzcyNDIsMTEgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJlbnRyeVJ1bGVYTnVtYmVyTGl0ZXJhbCIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMDQyOjE6IGVudHJ5UnVsZVhOdW1iZXJMaXRlcmFsIDogcnVsZVhOdW1iZXJMaXRlcmFsIEVPRiA7CisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjE0MjoxOiBlbnRyeVJ1bGVYTnVtYmVyTGl0ZXJhbCA6IHJ1bGVYTnVtYmVyTGl0ZXJhbCBFT0YgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIGVudHJ5UnVsZVhOdW1iZXJMaXRlcmFsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIwNDM6MTogKCBydWxlWE51bWJlckxpdGVyYWwgRU9GICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIwNDQ6MTogcnVsZVhOdW1iZXJMaXRlcmFsIEVPRgorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjE0MzoxOiAoIHJ1bGVYTnVtYmVyTGl0ZXJhbCBFT0YgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjE0NDoxOiBydWxlWE51bWJlckxpdGVyYWwgRU9GCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhOdW1iZXJMaXRlcmFsUnVsZSgpKTsgCkBAIC02OTIyLDIzICs3Mjc2LDIzIEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZVhOdW1iZXJMaXRlcmFsIgotICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIwNTE6MTogcnVsZVhOdW1iZXJMaXRlcmFsIDogKCAoIHJ1bGVfX1hOdW1iZXJMaXRlcmFsX19Hcm91cF9fMCApICkgOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIxNTE6MTogcnVsZVhOdW1iZXJMaXRlcmFsIDogKCAoIHJ1bGVfX1hOdW1iZXJMaXRlcmFsX19Hcm91cF9fMCApICkgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVYTnVtYmVyTGl0ZXJhbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMDU1OjI6ICggKCAoIHJ1bGVfX1hOdW1iZXJMaXRlcmFsX19Hcm91cF9fMCApICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjA1NjoyOiAoICggcnVsZV9fWE51bWJlckxpdGVyYWxfX0dyb3VwX18wICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjE1NToyOiAoICggKCBydWxlX19YTnVtYmVyTGl0ZXJhbF9fR3JvdXBfXzAgKSApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIxNTY6MjogKCAoIHJ1bGVfX1hOdW1iZXJMaXRlcmFsX19Hcm91cF9fMCApICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIwNTY6MjogKCAoIHJ1bGVfX1hOdW1iZXJMaXRlcmFsX19Hcm91cF9fMCApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIwNTc6MzogKCBydWxlX19YTnVtYmVyTGl0ZXJhbF9fR3JvdXBfXzAgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjE1NjoyOiAoICggcnVsZV9fWE51bWJlckxpdGVyYWxfX0dyb3VwX18wICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjE1NzozOiAoIHJ1bGVfX1hOdW1iZXJMaXRlcmFsX19Hcm91cF9fMCApCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhOdW1iZXJMaXRlcmFsQWNjZXNzKCkuZ2V0R3JvdXAoKSk7IAogICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjA1ODozOiAoIHJ1bGVfX1hOdW1iZXJMaXRlcmFsX19Hcm91cF9fMCApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMDU4OjQ6IHJ1bGVfX1hOdW1iZXJMaXRlcmFsX19Hcm91cF9fMAorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjE1ODozOiAoIHJ1bGVfX1hOdW1iZXJMaXRlcmFsX19Hcm91cF9fMCApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMTU4OjQ6IHJ1bGVfX1hOdW1iZXJMaXRlcmFsX19Hcm91cF9fMAogICAgICAgICAgICAgewogICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMik7CiAgICAgICAgICAgICBydWxlX19YTnVtYmVyTGl0ZXJhbF9fR3JvdXBfXzAoKTsKQEAgLTY5NzMsMTEgKzczMjcsMTEgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJlbnRyeVJ1bGVYU3RyaW5nTGl0ZXJhbCIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMDY3OjE6IGVudHJ5UnVsZVhTdHJpbmdMaXRlcmFsIDogcnVsZVhTdHJpbmdMaXRlcmFsIEVPRiA7CisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjE2NzoxOiBlbnRyeVJ1bGVYU3RyaW5nTGl0ZXJhbCA6IHJ1bGVYU3RyaW5nTGl0ZXJhbCBFT0YgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIGVudHJ5UnVsZVhTdHJpbmdMaXRlcmFsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIwNjg6MTogKCBydWxlWFN0cmluZ0xpdGVyYWwgRU9GICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIwNjk6MTogcnVsZVhTdHJpbmdMaXRlcmFsIEVPRgorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjE2ODoxOiAoIHJ1bGVYU3RyaW5nTGl0ZXJhbCBFT0YgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjE2OToxOiBydWxlWFN0cmluZ0xpdGVyYWwgRU9GCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhTdHJpbmdMaXRlcmFsUnVsZSgpKTsgCkBAIC03MDA3LDIzICs3MzYxLDIzIEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZVhTdHJpbmdMaXRlcmFsIgotICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIwNzY6MTogcnVsZVhTdHJpbmdMaXRlcmFsIDogKCAoIHJ1bGVfX1hTdHJpbmdMaXRlcmFsX19Hcm91cF9fMCApICkgOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIxNzY6MTogcnVsZVhTdHJpbmdMaXRlcmFsIDogKCAoIHJ1bGVfX1hTdHJpbmdMaXRlcmFsX19Hcm91cF9fMCApICkgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVYU3RyaW5nTGl0ZXJhbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMDgwOjI6ICggKCAoIHJ1bGVfX1hTdHJpbmdMaXRlcmFsX19Hcm91cF9fMCApICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjA4MToyOiAoICggcnVsZV9fWFN0cmluZ0xpdGVyYWxfX0dyb3VwX18wICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjE4MDoyOiAoICggKCBydWxlX19YU3RyaW5nTGl0ZXJhbF9fR3JvdXBfXzAgKSApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIxODE6MjogKCAoIHJ1bGVfX1hTdHJpbmdMaXRlcmFsX19Hcm91cF9fMCApICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIwODE6MjogKCAoIHJ1bGVfX1hTdHJpbmdMaXRlcmFsX19Hcm91cF9fMCApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIwODI6MzogKCBydWxlX19YU3RyaW5nTGl0ZXJhbF9fR3JvdXBfXzAgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjE4MToyOiAoICggcnVsZV9fWFN0cmluZ0xpdGVyYWxfX0dyb3VwX18wICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjE4MjozOiAoIHJ1bGVfX1hTdHJpbmdMaXRlcmFsX19Hcm91cF9fMCApCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhTdHJpbmdMaXRlcmFsQWNjZXNzKCkuZ2V0R3JvdXAoKSk7IAogICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjA4MzozOiAoIHJ1bGVfX1hTdHJpbmdMaXRlcmFsX19Hcm91cF9fMCApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMDgzOjQ6IHJ1bGVfX1hTdHJpbmdMaXRlcmFsX19Hcm91cF9fMAorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjE4MzozOiAoIHJ1bGVfX1hTdHJpbmdMaXRlcmFsX19Hcm91cF9fMCApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMTgzOjQ6IHJ1bGVfX1hTdHJpbmdMaXRlcmFsX19Hcm91cF9fMAogICAgICAgICAgICAgewogICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMik7CiAgICAgICAgICAgICBydWxlX19YU3RyaW5nTGl0ZXJhbF9fR3JvdXBfXzAoKTsKQEAgLTcwNTgsMTEgKzc0MTIsMTEgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJlbnRyeVJ1bGVYVHlwZUxpdGVyYWwiCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjA5MjoxOiBlbnRyeVJ1bGVYVHlwZUxpdGVyYWwgOiBydWxlWFR5cGVMaXRlcmFsIEVPRiA7CisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjE5MjoxOiBlbnRyeVJ1bGVYVHlwZUxpdGVyYWwgOiBydWxlWFR5cGVMaXRlcmFsIEVPRiA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgZW50cnlSdWxlWFR5cGVMaXRlcmFsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIwOTM6MTogKCBydWxlWFR5cGVMaXRlcmFsIEVPRiApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMDk0OjE6IHJ1bGVYVHlwZUxpdGVyYWwgRU9GCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMTkzOjE6ICggcnVsZVhUeXBlTGl0ZXJhbCBFT0YgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjE5NDoxOiBydWxlWFR5cGVMaXRlcmFsIEVPRgogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYVHlwZUxpdGVyYWxSdWxlKCkpOyAKQEAgLTcwOTIsMjMgKzc0NDYsMjMgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlWFR5cGVMaXRlcmFsIgotICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIxMDE6MTogcnVsZVhUeXBlTGl0ZXJhbCA6ICggKCBydWxlX19YVHlwZUxpdGVyYWxfX0dyb3VwX18wICkgKSA7CisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjIwMToxOiBydWxlWFR5cGVMaXRlcmFsIDogKCAoIHJ1bGVfX1hUeXBlTGl0ZXJhbF9fR3JvdXBfXzAgKSApIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlWFR5cGVMaXRlcmFsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIxMDU6MjogKCAoICggcnVsZV9fWFR5cGVMaXRlcmFsX19Hcm91cF9fMCApICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjEwNjoyOiAoICggcnVsZV9fWFR5cGVMaXRlcmFsX19Hcm91cF9fMCApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIyMDU6MjogKCAoICggcnVsZV9fWFR5cGVMaXRlcmFsX19Hcm91cF9fMCApICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjIwNjoyOiAoICggcnVsZV9fWFR5cGVMaXRlcmFsX19Hcm91cF9fMCApICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIxMDY6MjogKCAoIHJ1bGVfX1hUeXBlTGl0ZXJhbF9fR3JvdXBfXzAgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMTA3OjM6ICggcnVsZV9fWFR5cGVMaXRlcmFsX19Hcm91cF9fMCApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMjA2OjI6ICggKCBydWxlX19YVHlwZUxpdGVyYWxfX0dyb3VwX18wICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjIwNzozOiAoIHJ1bGVfX1hUeXBlTGl0ZXJhbF9fR3JvdXBfXzAgKQogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYVHlwZUxpdGVyYWxBY2Nlc3MoKS5nZXRHcm91cCgpKTsgCiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMTA4OjM6ICggcnVsZV9fWFR5cGVMaXRlcmFsX19Hcm91cF9fMCApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMTA4OjQ6IHJ1bGVfX1hUeXBlTGl0ZXJhbF9fR3JvdXBfXzAKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIyMDg6MzogKCBydWxlX19YVHlwZUxpdGVyYWxfX0dyb3VwX18wICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIyMDg6NDogcnVsZV9fWFR5cGVMaXRlcmFsX19Hcm91cF9fMAogICAgICAgICAgICAgewogICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMik7CiAgICAgICAgICAgICBydWxlX19YVHlwZUxpdGVyYWxfX0dyb3VwX18wKCk7CkBAIC03MTQzLDExICs3NDk3LDExIEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAiZW50cnlSdWxlWFRocm93RXhwcmVzc2lvbiIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMTE3OjE6IGVudHJ5UnVsZVhUaHJvd0V4cHJlc3Npb24gOiBydWxlWFRocm93RXhwcmVzc2lvbiBFT0YgOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIyMTc6MTogZW50cnlSdWxlWFRocm93RXhwcmVzc2lvbiA6IHJ1bGVYVGhyb3dFeHByZXNzaW9uIEVPRiA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgZW50cnlSdWxlWFRocm93RXhwcmVzc2lvbigpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMTE4OjE6ICggcnVsZVhUaHJvd0V4cHJlc3Npb24gRU9GICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIxMTk6MTogcnVsZVhUaHJvd0V4cHJlc3Npb24gRU9GCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMjE4OjE6ICggcnVsZVhUaHJvd0V4cHJlc3Npb24gRU9GICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIyMTk6MTogcnVsZVhUaHJvd0V4cHJlc3Npb24gRU9GCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhUaHJvd0V4cHJlc3Npb25SdWxlKCkpOyAKQEAgLTcxNzcsMjMgKzc1MzEsMjMgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlWFRocm93RXhwcmVzc2lvbiIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMTI2OjE6IHJ1bGVYVGhyb3dFeHByZXNzaW9uIDogKCAoIHJ1bGVfX1hUaHJvd0V4cHJlc3Npb25fX0dyb3VwX18wICkgKSA7CisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjIyNjoxOiBydWxlWFRocm93RXhwcmVzc2lvbiA6ICggKCBydWxlX19YVGhyb3dFeHByZXNzaW9uX19Hcm91cF9fMCApICkgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVYVGhyb3dFeHByZXNzaW9uKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIxMzA6MjogKCAoICggcnVsZV9fWFRocm93RXhwcmVzc2lvbl9fR3JvdXBfXzAgKSApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIxMzE6MjogKCAoIHJ1bGVfX1hUaHJvd0V4cHJlc3Npb25fX0dyb3VwX18wICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjIzMDoyOiAoICggKCBydWxlX19YVGhyb3dFeHByZXNzaW9uX19Hcm91cF9fMCApICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjIzMToyOiAoICggcnVsZV9fWFRocm93RXhwcmVzc2lvbl9fR3JvdXBfXzAgKSApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMTMxOjI6ICggKCBydWxlX19YVGhyb3dFeHByZXNzaW9uX19Hcm91cF9fMCApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIxMzI6MzogKCBydWxlX19YVGhyb3dFeHByZXNzaW9uX19Hcm91cF9fMCApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMjMxOjI6ICggKCBydWxlX19YVGhyb3dFeHByZXNzaW9uX19Hcm91cF9fMCApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIyMzI6MzogKCBydWxlX19YVGhyb3dFeHByZXNzaW9uX19Hcm91cF9fMCApCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhUaHJvd0V4cHJlc3Npb25BY2Nlc3MoKS5nZXRHcm91cCgpKTsgCiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMTMzOjM6ICggcnVsZV9fWFRocm93RXhwcmVzc2lvbl9fR3JvdXBfXzAgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjEzMzo0OiBydWxlX19YVGhyb3dFeHByZXNzaW9uX19Hcm91cF9fMAorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjIzMzozOiAoIHJ1bGVfX1hUaHJvd0V4cHJlc3Npb25fX0dyb3VwX18wICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIyMzM6NDogcnVsZV9fWFRocm93RXhwcmVzc2lvbl9fR3JvdXBfXzAKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzIpOwogICAgICAgICAgICAgcnVsZV9fWFRocm93RXhwcmVzc2lvbl9fR3JvdXBfXzAoKTsKQEAgLTcyMjgsMTEgKzc1ODIsMTEgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJlbnRyeVJ1bGVYUmV0dXJuRXhwcmVzc2lvbiIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMTQyOjE6IGVudHJ5UnVsZVhSZXR1cm5FeHByZXNzaW9uIDogcnVsZVhSZXR1cm5FeHByZXNzaW9uIEVPRiA7CisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjI0MjoxOiBlbnRyeVJ1bGVYUmV0dXJuRXhwcmVzc2lvbiA6IHJ1bGVYUmV0dXJuRXhwcmVzc2lvbiBFT0YgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIGVudHJ5UnVsZVhSZXR1cm5FeHByZXNzaW9uKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIxNDM6MTogKCBydWxlWFJldHVybkV4cHJlc3Npb24gRU9GICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIxNDQ6MTogcnVsZVhSZXR1cm5FeHByZXNzaW9uIEVPRgorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjI0MzoxOiAoIHJ1bGVYUmV0dXJuRXhwcmVzc2lvbiBFT0YgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjI0NDoxOiBydWxlWFJldHVybkV4cHJlc3Npb24gRU9GCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhSZXR1cm5FeHByZXNzaW9uUnVsZSgpKTsgCkBAIC03MjYyLDIzICs3NjE2LDIzIEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZVhSZXR1cm5FeHByZXNzaW9uIgotICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIxNTE6MTogcnVsZVhSZXR1cm5FeHByZXNzaW9uIDogKCAoIHJ1bGVfX1hSZXR1cm5FeHByZXNzaW9uX19Hcm91cF9fMCApICkgOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIyNTE6MTogcnVsZVhSZXR1cm5FeHByZXNzaW9uIDogKCAoIHJ1bGVfX1hSZXR1cm5FeHByZXNzaW9uX19Hcm91cF9fMCApICkgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVYUmV0dXJuRXhwcmVzc2lvbigpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMTU1OjI6ICggKCAoIHJ1bGVfX1hSZXR1cm5FeHByZXNzaW9uX19Hcm91cF9fMCApICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjE1NjoyOiAoICggcnVsZV9fWFJldHVybkV4cHJlc3Npb25fX0dyb3VwX18wICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjI1NToyOiAoICggKCBydWxlX19YUmV0dXJuRXhwcmVzc2lvbl9fR3JvdXBfXzAgKSApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIyNTY6MjogKCAoIHJ1bGVfX1hSZXR1cm5FeHByZXNzaW9uX19Hcm91cF9fMCApICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIxNTY6MjogKCAoIHJ1bGVfX1hSZXR1cm5FeHByZXNzaW9uX19Hcm91cF9fMCApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIxNTc6MzogKCBydWxlX19YUmV0dXJuRXhwcmVzc2lvbl9fR3JvdXBfXzAgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjI1NjoyOiAoICggcnVsZV9fWFJldHVybkV4cHJlc3Npb25fX0dyb3VwX18wICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjI1NzozOiAoIHJ1bGVfX1hSZXR1cm5FeHByZXNzaW9uX19Hcm91cF9fMCApCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhSZXR1cm5FeHByZXNzaW9uQWNjZXNzKCkuZ2V0R3JvdXAoKSk7IAogICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjE1ODozOiAoIHJ1bGVfX1hSZXR1cm5FeHByZXNzaW9uX19Hcm91cF9fMCApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMTU4OjQ6IHJ1bGVfX1hSZXR1cm5FeHByZXNzaW9uX19Hcm91cF9fMAorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjI1ODozOiAoIHJ1bGVfX1hSZXR1cm5FeHByZXNzaW9uX19Hcm91cF9fMCApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMjU4OjQ6IHJ1bGVfX1hSZXR1cm5FeHByZXNzaW9uX19Hcm91cF9fMAogICAgICAgICAgICAgewogICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMik7CiAgICAgICAgICAgICBydWxlX19YUmV0dXJuRXhwcmVzc2lvbl9fR3JvdXBfXzAoKTsKQEAgLTczMTMsMTEgKzc2NjcsMTEgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJlbnRyeVJ1bGVYVHJ5Q2F0Y2hGaW5hbGx5RXhwcmVzc2lvbiIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMTY3OjE6IGVudHJ5UnVsZVhUcnlDYXRjaEZpbmFsbHlFeHByZXNzaW9uIDogcnVsZVhUcnlDYXRjaEZpbmFsbHlFeHByZXNzaW9uIEVPRiA7CisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjI2NzoxOiBlbnRyeVJ1bGVYVHJ5Q2F0Y2hGaW5hbGx5RXhwcmVzc2lvbiA6IHJ1bGVYVHJ5Q2F0Y2hGaW5hbGx5RXhwcmVzc2lvbiBFT0YgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIGVudHJ5UnVsZVhUcnlDYXRjaEZpbmFsbHlFeHByZXNzaW9uKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIxNjg6MTogKCBydWxlWFRyeUNhdGNoRmluYWxseUV4cHJlc3Npb24gRU9GICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIxNjk6MTogcnVsZVhUcnlDYXRjaEZpbmFsbHlFeHByZXNzaW9uIEVPRgorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjI2ODoxOiAoIHJ1bGVYVHJ5Q2F0Y2hGaW5hbGx5RXhwcmVzc2lvbiBFT0YgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjI2OToxOiBydWxlWFRyeUNhdGNoRmluYWxseUV4cHJlc3Npb24gRU9GCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhUcnlDYXRjaEZpbmFsbHlFeHByZXNzaW9uUnVsZSgpKTsgCkBAIC03MzQ3LDIzICs3NzAxLDIzIEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZVhUcnlDYXRjaEZpbmFsbHlFeHByZXNzaW9uIgotICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIxNzY6MTogcnVsZVhUcnlDYXRjaEZpbmFsbHlFeHByZXNzaW9uIDogKCAoIHJ1bGVfX1hUcnlDYXRjaEZpbmFsbHlFeHByZXNzaW9uX19Hcm91cF9fMCApICkgOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIyNzY6MTogcnVsZVhUcnlDYXRjaEZpbmFsbHlFeHByZXNzaW9uIDogKCAoIHJ1bGVfX1hUcnlDYXRjaEZpbmFsbHlFeHByZXNzaW9uX19Hcm91cF9fMCApICkgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVYVHJ5Q2F0Y2hGaW5hbGx5RXhwcmVzc2lvbigpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMTgwOjI6ICggKCAoIHJ1bGVfX1hUcnlDYXRjaEZpbmFsbHlFeHByZXNzaW9uX19Hcm91cF9fMCApICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjE4MToyOiAoICggcnVsZV9fWFRyeUNhdGNoRmluYWxseUV4cHJlc3Npb25fX0dyb3VwX18wICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjI4MDoyOiAoICggKCBydWxlX19YVHJ5Q2F0Y2hGaW5hbGx5RXhwcmVzc2lvbl9fR3JvdXBfXzAgKSApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIyODE6MjogKCAoIHJ1bGVfX1hUcnlDYXRjaEZpbmFsbHlFeHByZXNzaW9uX19Hcm91cF9fMCApICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIxODE6MjogKCAoIHJ1bGVfX1hUcnlDYXRjaEZpbmFsbHlFeHByZXNzaW9uX19Hcm91cF9fMCApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIxODI6MzogKCBydWxlX19YVHJ5Q2F0Y2hGaW5hbGx5RXhwcmVzc2lvbl9fR3JvdXBfXzAgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjI4MToyOiAoICggcnVsZV9fWFRyeUNhdGNoRmluYWxseUV4cHJlc3Npb25fX0dyb3VwX18wICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjI4MjozOiAoIHJ1bGVfX1hUcnlDYXRjaEZpbmFsbHlFeHByZXNzaW9uX19Hcm91cF9fMCApCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhUcnlDYXRjaEZpbmFsbHlFeHByZXNzaW9uQWNjZXNzKCkuZ2V0R3JvdXAoKSk7IAogICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjE4MzozOiAoIHJ1bGVfX1hUcnlDYXRjaEZpbmFsbHlFeHByZXNzaW9uX19Hcm91cF9fMCApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMTgzOjQ6IHJ1bGVfX1hUcnlDYXRjaEZpbmFsbHlFeHByZXNzaW9uX19Hcm91cF9fMAorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjI4MzozOiAoIHJ1bGVfX1hUcnlDYXRjaEZpbmFsbHlFeHByZXNzaW9uX19Hcm91cF9fMCApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMjgzOjQ6IHJ1bGVfX1hUcnlDYXRjaEZpbmFsbHlFeHByZXNzaW9uX19Hcm91cF9fMAogICAgICAgICAgICAgewogICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMik7CiAgICAgICAgICAgICBydWxlX19YVHJ5Q2F0Y2hGaW5hbGx5RXhwcmVzc2lvbl9fR3JvdXBfXzAoKTsKQEAgLTczOTgsMTEgKzc3NTIsMTEgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJlbnRyeVJ1bGVYU3luY2hyb25pemVkRXhwcmVzc2lvbiIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMTkyOjE6IGVudHJ5UnVsZVhTeW5jaHJvbml6ZWRFeHByZXNzaW9uIDogcnVsZVhTeW5jaHJvbml6ZWRFeHByZXNzaW9uIEVPRiA7CisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjI5MjoxOiBlbnRyeVJ1bGVYU3luY2hyb25pemVkRXhwcmVzc2lvbiA6IHJ1bGVYU3luY2hyb25pemVkRXhwcmVzc2lvbiBFT0YgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIGVudHJ5UnVsZVhTeW5jaHJvbml6ZWRFeHByZXNzaW9uKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIxOTM6MTogKCBydWxlWFN5bmNocm9uaXplZEV4cHJlc3Npb24gRU9GICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIxOTQ6MTogcnVsZVhTeW5jaHJvbml6ZWRFeHByZXNzaW9uIEVPRgorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjI5MzoxOiAoIHJ1bGVYU3luY2hyb25pemVkRXhwcmVzc2lvbiBFT0YgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjI5NDoxOiBydWxlWFN5bmNocm9uaXplZEV4cHJlc3Npb24gRU9GCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhTeW5jaHJvbml6ZWRFeHByZXNzaW9uUnVsZSgpKTsgCkBAIC03NDMyLDIzICs3Nzg2LDIzIEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZVhTeW5jaHJvbml6ZWRFeHByZXNzaW9uIgotICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIyMDE6MTogcnVsZVhTeW5jaHJvbml6ZWRFeHByZXNzaW9uIDogKCAoIHJ1bGVfX1hTeW5jaHJvbml6ZWRFeHByZXNzaW9uX19Hcm91cF9fMCApICkgOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIzMDE6MTogcnVsZVhTeW5jaHJvbml6ZWRFeHByZXNzaW9uIDogKCAoIHJ1bGVfX1hTeW5jaHJvbml6ZWRFeHByZXNzaW9uX19Hcm91cF9fMCApICkgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVYU3luY2hyb25pemVkRXhwcmVzc2lvbigpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMjA1OjI6ICggKCAoIHJ1bGVfX1hTeW5jaHJvbml6ZWRFeHByZXNzaW9uX19Hcm91cF9fMCApICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjIwNjoyOiAoICggcnVsZV9fWFN5bmNocm9uaXplZEV4cHJlc3Npb25fX0dyb3VwX18wICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjMwNToyOiAoICggKCBydWxlX19YU3luY2hyb25pemVkRXhwcmVzc2lvbl9fR3JvdXBfXzAgKSApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIzMDY6MjogKCAoIHJ1bGVfX1hTeW5jaHJvbml6ZWRFeHByZXNzaW9uX19Hcm91cF9fMCApICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIyMDY6MjogKCAoIHJ1bGVfX1hTeW5jaHJvbml6ZWRFeHByZXNzaW9uX19Hcm91cF9fMCApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIyMDc6MzogKCBydWxlX19YU3luY2hyb25pemVkRXhwcmVzc2lvbl9fR3JvdXBfXzAgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjMwNjoyOiAoICggcnVsZV9fWFN5bmNocm9uaXplZEV4cHJlc3Npb25fX0dyb3VwX18wICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjMwNzozOiAoIHJ1bGVfX1hTeW5jaHJvbml6ZWRFeHByZXNzaW9uX19Hcm91cF9fMCApCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhTeW5jaHJvbml6ZWRFeHByZXNzaW9uQWNjZXNzKCkuZ2V0R3JvdXAoKSk7IAogICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjIwODozOiAoIHJ1bGVfX1hTeW5jaHJvbml6ZWRFeHByZXNzaW9uX19Hcm91cF9fMCApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMjA4OjQ6IHJ1bGVfX1hTeW5jaHJvbml6ZWRFeHByZXNzaW9uX19Hcm91cF9fMAorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjMwODozOiAoIHJ1bGVfX1hTeW5jaHJvbml6ZWRFeHByZXNzaW9uX19Hcm91cF9fMCApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMzA4OjQ6IHJ1bGVfX1hTeW5jaHJvbml6ZWRFeHByZXNzaW9uX19Hcm91cF9fMAogICAgICAgICAgICAgewogICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMik7CiAgICAgICAgICAgICBydWxlX19YU3luY2hyb25pemVkRXhwcmVzc2lvbl9fR3JvdXBfXzAoKTsKQEAgLTc0ODMsMTEgKzc4MzcsMTEgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJlbnRyeVJ1bGVYQ2F0Y2hDbGF1c2UiCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjIxNzoxOiBlbnRyeVJ1bGVYQ2F0Y2hDbGF1c2UgOiBydWxlWENhdGNoQ2xhdXNlIEVPRiA7CisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjMxNzoxOiBlbnRyeVJ1bGVYQ2F0Y2hDbGF1c2UgOiBydWxlWENhdGNoQ2xhdXNlIEVPRiA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgZW50cnlSdWxlWENhdGNoQ2xhdXNlKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIyMTg6MTogKCBydWxlWENhdGNoQ2xhdXNlIEVPRiApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMjE5OjE6IHJ1bGVYQ2F0Y2hDbGF1c2UgRU9GCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMzE4OjE6ICggcnVsZVhDYXRjaENsYXVzZSBFT0YgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjMxOToxOiBydWxlWENhdGNoQ2xhdXNlIEVPRgogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYQ2F0Y2hDbGF1c2VSdWxlKCkpOyAKQEAgLTc1MTcsMjMgKzc4NzEsMjMgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlWENhdGNoQ2xhdXNlIgotICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIyMjY6MTogcnVsZVhDYXRjaENsYXVzZSA6ICggKCBydWxlX19YQ2F0Y2hDbGF1c2VfX0dyb3VwX18wICkgKSA7CisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjMyNjoxOiBydWxlWENhdGNoQ2xhdXNlIDogKCAoIHJ1bGVfX1hDYXRjaENsYXVzZV9fR3JvdXBfXzAgKSApIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlWENhdGNoQ2xhdXNlKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIyMzA6MjogKCAoICggcnVsZV9fWENhdGNoQ2xhdXNlX19Hcm91cF9fMCApICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjIzMToyOiAoICggcnVsZV9fWENhdGNoQ2xhdXNlX19Hcm91cF9fMCApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIzMzA6MjogKCAoICggcnVsZV9fWENhdGNoQ2xhdXNlX19Hcm91cF9fMCApICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjMzMToyOiAoICggcnVsZV9fWENhdGNoQ2xhdXNlX19Hcm91cF9fMCApICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIyMzE6MjogKCAoIHJ1bGVfX1hDYXRjaENsYXVzZV9fR3JvdXBfXzAgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMjMyOjM6ICggcnVsZV9fWENhdGNoQ2xhdXNlX19Hcm91cF9fMCApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMzMxOjI6ICggKCBydWxlX19YQ2F0Y2hDbGF1c2VfX0dyb3VwX18wICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjMzMjozOiAoIHJ1bGVfX1hDYXRjaENsYXVzZV9fR3JvdXBfXzAgKQogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYQ2F0Y2hDbGF1c2VBY2Nlc3MoKS5nZXRHcm91cCgpKTsgCiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMjMzOjM6ICggcnVsZV9fWENhdGNoQ2xhdXNlX19Hcm91cF9fMCApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMjMzOjQ6IHJ1bGVfX1hDYXRjaENsYXVzZV9fR3JvdXBfXzAKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIzMzM6MzogKCBydWxlX19YQ2F0Y2hDbGF1c2VfX0dyb3VwX18wICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIzMzM6NDogcnVsZV9fWENhdGNoQ2xhdXNlX19Hcm91cF9fMAogICAgICAgICAgICAgewogICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMik7CiAgICAgICAgICAgICBydWxlX19YQ2F0Y2hDbGF1c2VfX0dyb3VwX18wKCk7CkBAIC03NTY4LDExICs3OTIyLDExIEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAiZW50cnlSdWxlUXVhbGlmaWVkTmFtZSIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMjQyOjE6IGVudHJ5UnVsZVF1YWxpZmllZE5hbWUgOiBydWxlUXVhbGlmaWVkTmFtZSBFT0YgOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIzNDI6MTogZW50cnlSdWxlUXVhbGlmaWVkTmFtZSA6IHJ1bGVRdWFsaWZpZWROYW1lIEVPRiA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgZW50cnlSdWxlUXVhbGlmaWVkTmFtZSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMjQzOjE6ICggcnVsZVF1YWxpZmllZE5hbWUgRU9GICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIyNDQ6MTogcnVsZVF1YWxpZmllZE5hbWUgRU9GCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMzQzOjE6ICggcnVsZVF1YWxpZmllZE5hbWUgRU9GICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIzNDQ6MTogcnVsZVF1YWxpZmllZE5hbWUgRU9GCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFF1YWxpZmllZE5hbWVSdWxlKCkpOyAKQEAgLTc2MDIsMjMgKzc5NTYsMjMgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlUXVhbGlmaWVkTmFtZSIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMjUxOjE6IHJ1bGVRdWFsaWZpZWROYW1lIDogKCAoIHJ1bGVfX1F1YWxpZmllZE5hbWVfX0dyb3VwX18wICkgKSA7CisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjM1MToxOiBydWxlUXVhbGlmaWVkTmFtZSA6ICggKCBydWxlX19RdWFsaWZpZWROYW1lX19Hcm91cF9fMCApICkgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVRdWFsaWZpZWROYW1lKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIyNTU6MjogKCAoICggcnVsZV9fUXVhbGlmaWVkTmFtZV9fR3JvdXBfXzAgKSApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIyNTY6MjogKCAoIHJ1bGVfX1F1YWxpZmllZE5hbWVfX0dyb3VwX18wICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjM1NToyOiAoICggKCBydWxlX19RdWFsaWZpZWROYW1lX19Hcm91cF9fMCApICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjM1NjoyOiAoICggcnVsZV9fUXVhbGlmaWVkTmFtZV9fR3JvdXBfXzAgKSApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMjU2OjI6ICggKCBydWxlX19RdWFsaWZpZWROYW1lX19Hcm91cF9fMCApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIyNTc6MzogKCBydWxlX19RdWFsaWZpZWROYW1lX19Hcm91cF9fMCApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMzU2OjI6ICggKCBydWxlX19RdWFsaWZpZWROYW1lX19Hcm91cF9fMCApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIzNTc6MzogKCBydWxlX19RdWFsaWZpZWROYW1lX19Hcm91cF9fMCApCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFF1YWxpZmllZE5hbWVBY2Nlc3MoKS5nZXRHcm91cCgpKTsgCiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMjU4OjM6ICggcnVsZV9fUXVhbGlmaWVkTmFtZV9fR3JvdXBfXzAgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjI1ODo0OiBydWxlX19RdWFsaWZpZWROYW1lX19Hcm91cF9fMAorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjM1ODozOiAoIHJ1bGVfX1F1YWxpZmllZE5hbWVfX0dyb3VwX18wICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIzNTg6NDogcnVsZV9fUXVhbGlmaWVkTmFtZV9fR3JvdXBfXzAKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzIpOwogICAgICAgICAgICAgcnVsZV9fUXVhbGlmaWVkTmFtZV9fR3JvdXBfXzAoKTsKQEAgLTc2NTMsMTQgKzgwMDcsMTQgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJlbnRyeVJ1bGVOdW1iZXIiCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjI2NzoxOiBlbnRyeVJ1bGVOdW1iZXIgOiBydWxlTnVtYmVyIEVPRiA7CisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjM2NzoxOiBlbnRyeVJ1bGVOdW1iZXIgOiBydWxlTnVtYmVyIEVPRiA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgZW50cnlSdWxlTnVtYmVyKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKICAgICAgICAgIAogICAgICAgICAJSGlkZGVuVG9rZW5zIG15SGlkZGVuVG9rZW5TdGF0ZSA9ICgoWHRleHRUb2tlblN0cmVhbSlpbnB1dCkuc2V0SGlkZGVuVG9rZW5zKCk7CiAKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIyNzE6MTogKCBydWxlTnVtYmVyIEVPRiApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMjcyOjE6IHJ1bGVOdW1iZXIgRU9GCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMzcxOjE6ICggcnVsZU51bWJlciBFT0YgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjM3MjoxOiBydWxlTnVtYmVyIEVPRgogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXROdW1iZXJSdWxlKCkpOyAKQEAgLTc2OTMsMjQgKzgwNDcsMjQgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlTnVtYmVyIgotICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIyODI6MTogcnVsZU51bWJlciA6ICggKCBydWxlX19OdW1iZXJfX0FsdGVybmF0aXZlcyApICkgOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIzODI6MTogcnVsZU51bWJlciA6ICggKCBydWxlX19OdW1iZXJfX0FsdGVybmF0aXZlcyApICkgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVOdW1iZXIoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJSGlkZGVuVG9rZW5zIG15SGlkZGVuVG9rZW5TdGF0ZSA9ICgoWHRleHRUb2tlblN0cmVhbSlpbnB1dCkuc2V0SGlkZGVuVG9rZW5zKCk7CiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjI4NzoyOiAoICggKCBydWxlX19OdW1iZXJfX0FsdGVybmF0aXZlcyApICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjI4ODoyOiAoICggcnVsZV9fTnVtYmVyX19BbHRlcm5hdGl2ZXMgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMzg3OjI6ICggKCAoIHJ1bGVfX051bWJlcl9fQWx0ZXJuYXRpdmVzICkgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMzg4OjI6ICggKCBydWxlX19OdW1iZXJfX0FsdGVybmF0aXZlcyApICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIyODg6MjogKCAoIHJ1bGVfX051bWJlcl9fQWx0ZXJuYXRpdmVzICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjI4OTozOiAoIHJ1bGVfX051bWJlcl9fQWx0ZXJuYXRpdmVzICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIzODg6MjogKCAoIHJ1bGVfX051bWJlcl9fQWx0ZXJuYXRpdmVzICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjM4OTozOiAoIHJ1bGVfX051bWJlcl9fQWx0ZXJuYXRpdmVzICkKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0TnVtYmVyQWNjZXNzKCkuZ2V0QWx0ZXJuYXRpdmVzKCkpOyAKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIyOTA6MzogKCBydWxlX19OdW1iZXJfX0FsdGVybmF0aXZlcyApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMjkwOjQ6IHJ1bGVfX051bWJlcl9fQWx0ZXJuYXRpdmVzCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMzkwOjM6ICggcnVsZV9fTnVtYmVyX19BbHRlcm5hdGl2ZXMgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjM5MDo0OiBydWxlX19OdW1iZXJfX0FsdGVybmF0aXZlcwogICAgICAgICAgICAgewogICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMik7CiAgICAgICAgICAgICBydWxlX19OdW1iZXJfX0FsdGVybmF0aXZlcygpOwpAQCAtNzc0NiwxMSArODEwMCwxMSBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgImVudHJ5UnVsZUp2bVR5cGVSZWZlcmVuY2UiCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjMwMDoxOiBlbnRyeVJ1bGVKdm1UeXBlUmVmZXJlbmNlIDogcnVsZUp2bVR5cGVSZWZlcmVuY2UgRU9GIDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNDAwOjE6IGVudHJ5UnVsZUp2bVR5cGVSZWZlcmVuY2UgOiBydWxlSnZtVHlwZVJlZmVyZW5jZSBFT0YgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIGVudHJ5UnVsZUp2bVR5cGVSZWZlcmVuY2UoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjMwMToxOiAoIHJ1bGVKdm1UeXBlUmVmZXJlbmNlIEVPRiApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMzAyOjE6IHJ1bGVKdm1UeXBlUmVmZXJlbmNlIEVPRgorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjQwMToxOiAoIHJ1bGVKdm1UeXBlUmVmZXJlbmNlIEVPRiApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNDAyOjE6IHJ1bGVKdm1UeXBlUmVmZXJlbmNlIEVPRgogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRKdm1UeXBlUmVmZXJlbmNlUnVsZSgpKTsgCkBAIC03NzgwLDIzICs4MTM0LDIzIEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZUp2bVR5cGVSZWZlcmVuY2UiCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjMwOToxOiBydWxlSnZtVHlwZVJlZmVyZW5jZSA6ICggKCBydWxlX19Kdm1UeXBlUmVmZXJlbmNlX19BbHRlcm5hdGl2ZXMgKSApIDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNDA5OjE6IHJ1bGVKdm1UeXBlUmVmZXJlbmNlIDogKCAoIHJ1bGVfX0p2bVR5cGVSZWZlcmVuY2VfX0FsdGVybmF0aXZlcyApICkgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVKdm1UeXBlUmVmZXJlbmNlKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIzMTM6MjogKCAoICggcnVsZV9fSnZtVHlwZVJlZmVyZW5jZV9fQWx0ZXJuYXRpdmVzICkgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMzE0OjI6ICggKCBydWxlX19Kdm1UeXBlUmVmZXJlbmNlX19BbHRlcm5hdGl2ZXMgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNDEzOjI6ICggKCAoIHJ1bGVfX0p2bVR5cGVSZWZlcmVuY2VfX0FsdGVybmF0aXZlcyApICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjQxNDoyOiAoICggcnVsZV9fSnZtVHlwZVJlZmVyZW5jZV9fQWx0ZXJuYXRpdmVzICkgKQogICAgICAgICAgICAgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjMxNDoyOiAoICggcnVsZV9fSnZtVHlwZVJlZmVyZW5jZV9fQWx0ZXJuYXRpdmVzICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjMxNTozOiAoIHJ1bGVfX0p2bVR5cGVSZWZlcmVuY2VfX0FsdGVybmF0aXZlcyApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNDE0OjI6ICggKCBydWxlX19Kdm1UeXBlUmVmZXJlbmNlX19BbHRlcm5hdGl2ZXMgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNDE1OjM6ICggcnVsZV9fSnZtVHlwZVJlZmVyZW5jZV9fQWx0ZXJuYXRpdmVzICkKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0SnZtVHlwZVJlZmVyZW5jZUFjY2VzcygpLmdldEFsdGVybmF0aXZlcygpKTsgCiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMzE2OjM6ICggcnVsZV9fSnZtVHlwZVJlZmVyZW5jZV9fQWx0ZXJuYXRpdmVzICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIzMTY6NDogcnVsZV9fSnZtVHlwZVJlZmVyZW5jZV9fQWx0ZXJuYXRpdmVzCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNDE2OjM6ICggcnVsZV9fSnZtVHlwZVJlZmVyZW5jZV9fQWx0ZXJuYXRpdmVzICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI0MTY6NDogcnVsZV9fSnZtVHlwZVJlZmVyZW5jZV9fQWx0ZXJuYXRpdmVzCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV18yKTsKICAgICAgICAgICAgIHJ1bGVfX0p2bVR5cGVSZWZlcmVuY2VfX0FsdGVybmF0aXZlcygpOwpAQCAtNzgzMSwxMSArODE4NSwxMSBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgImVudHJ5UnVsZUFycmF5QnJhY2tldHMiCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjMyNToxOiBlbnRyeVJ1bGVBcnJheUJyYWNrZXRzIDogcnVsZUFycmF5QnJhY2tldHMgRU9GIDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNDI1OjE6IGVudHJ5UnVsZUFycmF5QnJhY2tldHMgOiBydWxlQXJyYXlCcmFja2V0cyBFT0YgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIGVudHJ5UnVsZUFycmF5QnJhY2tldHMoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjMyNjoxOiAoIHJ1bGVBcnJheUJyYWNrZXRzIEVPRiApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMzI3OjE6IHJ1bGVBcnJheUJyYWNrZXRzIEVPRgorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjQyNjoxOiAoIHJ1bGVBcnJheUJyYWNrZXRzIEVPRiApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNDI3OjE6IHJ1bGVBcnJheUJyYWNrZXRzIEVPRgogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRBcnJheUJyYWNrZXRzUnVsZSgpKTsgCkBAIC03ODY1LDIzICs4MjE5LDIzIEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZUFycmF5QnJhY2tldHMiCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjMzNDoxOiBydWxlQXJyYXlCcmFja2V0cyA6ICggKCBydWxlX19BcnJheUJyYWNrZXRzX19Hcm91cF9fMCApICkgOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI0MzQ6MTogcnVsZUFycmF5QnJhY2tldHMgOiAoICggcnVsZV9fQXJyYXlCcmFja2V0c19fR3JvdXBfXzAgKSApIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlQXJyYXlCcmFja2V0cygpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMzM4OjI6ICggKCAoIHJ1bGVfX0FycmF5QnJhY2tldHNfX0dyb3VwX18wICkgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMzM5OjI6ICggKCBydWxlX19BcnJheUJyYWNrZXRzX19Hcm91cF9fMCApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI0Mzg6MjogKCAoICggcnVsZV9fQXJyYXlCcmFja2V0c19fR3JvdXBfXzAgKSApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI0Mzk6MjogKCAoIHJ1bGVfX0FycmF5QnJhY2tldHNfX0dyb3VwX18wICkgKQogICAgICAgICAgICAgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjMzOToyOiAoICggcnVsZV9fQXJyYXlCcmFja2V0c19fR3JvdXBfXzAgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMzQwOjM6ICggcnVsZV9fQXJyYXlCcmFja2V0c19fR3JvdXBfXzAgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjQzOToyOiAoICggcnVsZV9fQXJyYXlCcmFja2V0c19fR3JvdXBfXzAgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNDQwOjM6ICggcnVsZV9fQXJyYXlCcmFja2V0c19fR3JvdXBfXzAgKQogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRBcnJheUJyYWNrZXRzQWNjZXNzKCkuZ2V0R3JvdXAoKSk7IAogICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjM0MTozOiAoIHJ1bGVfX0FycmF5QnJhY2tldHNfX0dyb3VwX18wICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIzNDE6NDogcnVsZV9fQXJyYXlCcmFja2V0c19fR3JvdXBfXzAKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI0NDE6MzogKCBydWxlX19BcnJheUJyYWNrZXRzX19Hcm91cF9fMCApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNDQxOjQ6IHJ1bGVfX0FycmF5QnJhY2tldHNfX0dyb3VwX18wCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV18yKTsKICAgICAgICAgICAgIHJ1bGVfX0FycmF5QnJhY2tldHNfX0dyb3VwX18wKCk7CkBAIC03OTE2LDExICs4MjcwLDExIEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAiZW50cnlSdWxlWEZ1bmN0aW9uVHlwZVJlZiIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMzUwOjE6IGVudHJ5UnVsZVhGdW5jdGlvblR5cGVSZWYgOiBydWxlWEZ1bmN0aW9uVHlwZVJlZiBFT0YgOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI0NTA6MTogZW50cnlSdWxlWEZ1bmN0aW9uVHlwZVJlZiA6IHJ1bGVYRnVuY3Rpb25UeXBlUmVmIEVPRiA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgZW50cnlSdWxlWEZ1bmN0aW9uVHlwZVJlZigpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMzUxOjE6ICggcnVsZVhGdW5jdGlvblR5cGVSZWYgRU9GICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIzNTI6MTogcnVsZVhGdW5jdGlvblR5cGVSZWYgRU9GCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNDUxOjE6ICggcnVsZVhGdW5jdGlvblR5cGVSZWYgRU9GICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI0NTI6MTogcnVsZVhGdW5jdGlvblR5cGVSZWYgRU9GCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhGdW5jdGlvblR5cGVSZWZSdWxlKCkpOyAKQEAgLTc5NTAsMjMgKzgzMDQsMjMgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlWEZ1bmN0aW9uVHlwZVJlZiIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMzU5OjE6IHJ1bGVYRnVuY3Rpb25UeXBlUmVmIDogKCAoIHJ1bGVfX1hGdW5jdGlvblR5cGVSZWZfX0dyb3VwX18wICkgKSA7CisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjQ1OToxOiBydWxlWEZ1bmN0aW9uVHlwZVJlZiA6ICggKCBydWxlX19YRnVuY3Rpb25UeXBlUmVmX19Hcm91cF9fMCApICkgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVYRnVuY3Rpb25UeXBlUmVmKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIzNjM6MjogKCAoICggcnVsZV9fWEZ1bmN0aW9uVHlwZVJlZl9fR3JvdXBfXzAgKSApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIzNjQ6MjogKCAoIHJ1bGVfX1hGdW5jdGlvblR5cGVSZWZfX0dyb3VwX18wICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjQ2MzoyOiAoICggKCBydWxlX19YRnVuY3Rpb25UeXBlUmVmX19Hcm91cF9fMCApICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjQ2NDoyOiAoICggcnVsZV9fWEZ1bmN0aW9uVHlwZVJlZl9fR3JvdXBfXzAgKSApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMzY0OjI6ICggKCBydWxlX19YRnVuY3Rpb25UeXBlUmVmX19Hcm91cF9fMCApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIzNjU6MzogKCBydWxlX19YRnVuY3Rpb25UeXBlUmVmX19Hcm91cF9fMCApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNDY0OjI6ICggKCBydWxlX19YRnVuY3Rpb25UeXBlUmVmX19Hcm91cF9fMCApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI0NjU6MzogKCBydWxlX19YRnVuY3Rpb25UeXBlUmVmX19Hcm91cF9fMCApCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhGdW5jdGlvblR5cGVSZWZBY2Nlc3MoKS5nZXRHcm91cCgpKTsgCiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMzY2OjM6ICggcnVsZV9fWEZ1bmN0aW9uVHlwZVJlZl9fR3JvdXBfXzAgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjM2Njo0OiBydWxlX19YRnVuY3Rpb25UeXBlUmVmX19Hcm91cF9fMAorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjQ2NjozOiAoIHJ1bGVfX1hGdW5jdGlvblR5cGVSZWZfX0dyb3VwX18wICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI0NjY6NDogcnVsZV9fWEZ1bmN0aW9uVHlwZVJlZl9fR3JvdXBfXzAKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzIpOwogICAgICAgICAgICAgcnVsZV9fWEZ1bmN0aW9uVHlwZVJlZl9fR3JvdXBfXzAoKTsKQEAgLTgwMDEsMTEgKzgzNTUsMTEgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJlbnRyeVJ1bGVKdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZSIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMzc1OjE6IGVudHJ5UnVsZUp2bVBhcmFtZXRlcml6ZWRUeXBlUmVmZXJlbmNlIDogcnVsZUp2bVBhcmFtZXRlcml6ZWRUeXBlUmVmZXJlbmNlIEVPRiA7CisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjQ3NToxOiBlbnRyeVJ1bGVKdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZSA6IHJ1bGVKdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZSBFT0YgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIGVudHJ5UnVsZUp2bVBhcmFtZXRlcml6ZWRUeXBlUmVmZXJlbmNlKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIzNzY6MTogKCBydWxlSnZtUGFyYW1ldGVyaXplZFR5cGVSZWZlcmVuY2UgRU9GICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIzNzc6MTogcnVsZUp2bVBhcmFtZXRlcml6ZWRUeXBlUmVmZXJlbmNlIEVPRgorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjQ3NjoxOiAoIHJ1bGVKdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZSBFT0YgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjQ3NzoxOiBydWxlSnZtUGFyYW1ldGVyaXplZFR5cGVSZWZlcmVuY2UgRU9GCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldEp2bVBhcmFtZXRlcml6ZWRUeXBlUmVmZXJlbmNlUnVsZSgpKTsgCkBAIC04MDM1LDIzICs4Mzg5LDIzIEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZUp2bVBhcmFtZXRlcml6ZWRUeXBlUmVmZXJlbmNlIgotICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIzODQ6MTogcnVsZUp2bVBhcmFtZXRlcml6ZWRUeXBlUmVmZXJlbmNlIDogKCAoIHJ1bGVfX0p2bVBhcmFtZXRlcml6ZWRUeXBlUmVmZXJlbmNlX19Hcm91cF9fMCApICkgOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI0ODQ6MTogcnVsZUp2bVBhcmFtZXRlcml6ZWRUeXBlUmVmZXJlbmNlIDogKCAoIHJ1bGVfX0p2bVBhcmFtZXRlcml6ZWRUeXBlUmVmZXJlbmNlX19Hcm91cF9fMCApICkgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVKdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMzg4OjI6ICggKCAoIHJ1bGVfX0p2bVBhcmFtZXRlcml6ZWRUeXBlUmVmZXJlbmNlX19Hcm91cF9fMCApICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjM4OToyOiAoICggcnVsZV9fSnZtUGFyYW1ldGVyaXplZFR5cGVSZWZlcmVuY2VfX0dyb3VwX18wICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjQ4ODoyOiAoICggKCBydWxlX19Kdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZV9fR3JvdXBfXzAgKSApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI0ODk6MjogKCAoIHJ1bGVfX0p2bVBhcmFtZXRlcml6ZWRUeXBlUmVmZXJlbmNlX19Hcm91cF9fMCApICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIzODk6MjogKCAoIHJ1bGVfX0p2bVBhcmFtZXRlcml6ZWRUeXBlUmVmZXJlbmNlX19Hcm91cF9fMCApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIzOTA6MzogKCBydWxlX19Kdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZV9fR3JvdXBfXzAgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjQ4OToyOiAoICggcnVsZV9fSnZtUGFyYW1ldGVyaXplZFR5cGVSZWZlcmVuY2VfX0dyb3VwX18wICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjQ5MDozOiAoIHJ1bGVfX0p2bVBhcmFtZXRlcml6ZWRUeXBlUmVmZXJlbmNlX19Hcm91cF9fMCApCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldEp2bVBhcmFtZXRlcml6ZWRUeXBlUmVmZXJlbmNlQWNjZXNzKCkuZ2V0R3JvdXAoKSk7IAogICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjM5MTozOiAoIHJ1bGVfX0p2bVBhcmFtZXRlcml6ZWRUeXBlUmVmZXJlbmNlX19Hcm91cF9fMCApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMzkxOjQ6IHJ1bGVfX0p2bVBhcmFtZXRlcml6ZWRUeXBlUmVmZXJlbmNlX19Hcm91cF9fMAorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjQ5MTozOiAoIHJ1bGVfX0p2bVBhcmFtZXRlcml6ZWRUeXBlUmVmZXJlbmNlX19Hcm91cF9fMCApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNDkxOjQ6IHJ1bGVfX0p2bVBhcmFtZXRlcml6ZWRUeXBlUmVmZXJlbmNlX19Hcm91cF9fMAogICAgICAgICAgICAgewogICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMik7CiAgICAgICAgICAgICBydWxlX19Kdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZV9fR3JvdXBfXzAoKTsKQEAgLTgwODYsMTEgKzg0NDAsMTEgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJlbnRyeVJ1bGVKdm1Bcmd1bWVudFR5cGVSZWZlcmVuY2UiCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjQwMDoxOiBlbnRyeVJ1bGVKdm1Bcmd1bWVudFR5cGVSZWZlcmVuY2UgOiBydWxlSnZtQXJndW1lbnRUeXBlUmVmZXJlbmNlIEVPRiA7CisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjUwMDoxOiBlbnRyeVJ1bGVKdm1Bcmd1bWVudFR5cGVSZWZlcmVuY2UgOiBydWxlSnZtQXJndW1lbnRUeXBlUmVmZXJlbmNlIEVPRiA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgZW50cnlSdWxlSnZtQXJndW1lbnRUeXBlUmVmZXJlbmNlKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI0MDE6MTogKCBydWxlSnZtQXJndW1lbnRUeXBlUmVmZXJlbmNlIEVPRiApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNDAyOjE6IHJ1bGVKdm1Bcmd1bWVudFR5cGVSZWZlcmVuY2UgRU9GCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNTAxOjE6ICggcnVsZUp2bUFyZ3VtZW50VHlwZVJlZmVyZW5jZSBFT0YgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjUwMjoxOiBydWxlSnZtQXJndW1lbnRUeXBlUmVmZXJlbmNlIEVPRgogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRKdm1Bcmd1bWVudFR5cGVSZWZlcmVuY2VSdWxlKCkpOyAKQEAgLTgxMjAsMjMgKzg0NzQsMjMgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlSnZtQXJndW1lbnRUeXBlUmVmZXJlbmNlIgotICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI0MDk6MTogcnVsZUp2bUFyZ3VtZW50VHlwZVJlZmVyZW5jZSA6ICggKCBydWxlX19Kdm1Bcmd1bWVudFR5cGVSZWZlcmVuY2VfX0FsdGVybmF0aXZlcyApICkgOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI1MDk6MTogcnVsZUp2bUFyZ3VtZW50VHlwZVJlZmVyZW5jZSA6ICggKCBydWxlX19Kdm1Bcmd1bWVudFR5cGVSZWZlcmVuY2VfX0FsdGVybmF0aXZlcyApICkgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVKdm1Bcmd1bWVudFR5cGVSZWZlcmVuY2UoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjQxMzoyOiAoICggKCBydWxlX19Kdm1Bcmd1bWVudFR5cGVSZWZlcmVuY2VfX0FsdGVybmF0aXZlcyApICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjQxNDoyOiAoICggcnVsZV9fSnZtQXJndW1lbnRUeXBlUmVmZXJlbmNlX19BbHRlcm5hdGl2ZXMgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNTEzOjI6ICggKCAoIHJ1bGVfX0p2bUFyZ3VtZW50VHlwZVJlZmVyZW5jZV9fQWx0ZXJuYXRpdmVzICkgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNTE0OjI6ICggKCBydWxlX19Kdm1Bcmd1bWVudFR5cGVSZWZlcmVuY2VfX0FsdGVybmF0aXZlcyApICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI0MTQ6MjogKCAoIHJ1bGVfX0p2bUFyZ3VtZW50VHlwZVJlZmVyZW5jZV9fQWx0ZXJuYXRpdmVzICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjQxNTozOiAoIHJ1bGVfX0p2bUFyZ3VtZW50VHlwZVJlZmVyZW5jZV9fQWx0ZXJuYXRpdmVzICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI1MTQ6MjogKCAoIHJ1bGVfX0p2bUFyZ3VtZW50VHlwZVJlZmVyZW5jZV9fQWx0ZXJuYXRpdmVzICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjUxNTozOiAoIHJ1bGVfX0p2bUFyZ3VtZW50VHlwZVJlZmVyZW5jZV9fQWx0ZXJuYXRpdmVzICkKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0SnZtQXJndW1lbnRUeXBlUmVmZXJlbmNlQWNjZXNzKCkuZ2V0QWx0ZXJuYXRpdmVzKCkpOyAKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI0MTY6MzogKCBydWxlX19Kdm1Bcmd1bWVudFR5cGVSZWZlcmVuY2VfX0FsdGVybmF0aXZlcyApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNDE2OjQ6IHJ1bGVfX0p2bUFyZ3VtZW50VHlwZVJlZmVyZW5jZV9fQWx0ZXJuYXRpdmVzCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNTE2OjM6ICggcnVsZV9fSnZtQXJndW1lbnRUeXBlUmVmZXJlbmNlX19BbHRlcm5hdGl2ZXMgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjUxNjo0OiBydWxlX19Kdm1Bcmd1bWVudFR5cGVSZWZlcmVuY2VfX0FsdGVybmF0aXZlcwogICAgICAgICAgICAgewogICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMik7CiAgICAgICAgICAgICBydWxlX19Kdm1Bcmd1bWVudFR5cGVSZWZlcmVuY2VfX0FsdGVybmF0aXZlcygpOwpAQCAtODE3MSwxMSArODUyNSwxMSBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgImVudHJ5UnVsZUp2bVdpbGRjYXJkVHlwZVJlZmVyZW5jZSIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNDI1OjE6IGVudHJ5UnVsZUp2bVdpbGRjYXJkVHlwZVJlZmVyZW5jZSA6IHJ1bGVKdm1XaWxkY2FyZFR5cGVSZWZlcmVuY2UgRU9GIDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNTI1OjE6IGVudHJ5UnVsZUp2bVdpbGRjYXJkVHlwZVJlZmVyZW5jZSA6IHJ1bGVKdm1XaWxkY2FyZFR5cGVSZWZlcmVuY2UgRU9GIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBlbnRyeVJ1bGVKdm1XaWxkY2FyZFR5cGVSZWZlcmVuY2UoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjQyNjoxOiAoIHJ1bGVKdm1XaWxkY2FyZFR5cGVSZWZlcmVuY2UgRU9GICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI0Mjc6MTogcnVsZUp2bVdpbGRjYXJkVHlwZVJlZmVyZW5jZSBFT0YKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI1MjY6MTogKCBydWxlSnZtV2lsZGNhcmRUeXBlUmVmZXJlbmNlIEVPRiApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNTI3OjE6IHJ1bGVKdm1XaWxkY2FyZFR5cGVSZWZlcmVuY2UgRU9GCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldEp2bVdpbGRjYXJkVHlwZVJlZmVyZW5jZVJ1bGUoKSk7IApAQCAtODIwNSwyMyArODU1OSwyMyBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVKdm1XaWxkY2FyZFR5cGVSZWZlcmVuY2UiCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjQzNDoxOiBydWxlSnZtV2lsZGNhcmRUeXBlUmVmZXJlbmNlIDogKCAoIHJ1bGVfX0p2bVdpbGRjYXJkVHlwZVJlZmVyZW5jZV9fR3JvdXBfXzAgKSApIDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNTM0OjE6IHJ1bGVKdm1XaWxkY2FyZFR5cGVSZWZlcmVuY2UgOiAoICggcnVsZV9fSnZtV2lsZGNhcmRUeXBlUmVmZXJlbmNlX19Hcm91cF9fMCApICkgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVKdm1XaWxkY2FyZFR5cGVSZWZlcmVuY2UoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjQzODoyOiAoICggKCBydWxlX19Kdm1XaWxkY2FyZFR5cGVSZWZlcmVuY2VfX0dyb3VwX18wICkgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNDM5OjI6ICggKCBydWxlX19Kdm1XaWxkY2FyZFR5cGVSZWZlcmVuY2VfX0dyb3VwX18wICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjUzODoyOiAoICggKCBydWxlX19Kdm1XaWxkY2FyZFR5cGVSZWZlcmVuY2VfX0dyb3VwX18wICkgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNTM5OjI6ICggKCBydWxlX19Kdm1XaWxkY2FyZFR5cGVSZWZlcmVuY2VfX0dyb3VwX18wICkgKQogICAgICAgICAgICAgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjQzOToyOiAoICggcnVsZV9fSnZtV2lsZGNhcmRUeXBlUmVmZXJlbmNlX19Hcm91cF9fMCApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI0NDA6MzogKCBydWxlX19Kdm1XaWxkY2FyZFR5cGVSZWZlcmVuY2VfX0dyb3VwX18wICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI1Mzk6MjogKCAoIHJ1bGVfX0p2bVdpbGRjYXJkVHlwZVJlZmVyZW5jZV9fR3JvdXBfXzAgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNTQwOjM6ICggcnVsZV9fSnZtV2lsZGNhcmRUeXBlUmVmZXJlbmNlX19Hcm91cF9fMCApCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldEp2bVdpbGRjYXJkVHlwZVJlZmVyZW5jZUFjY2VzcygpLmdldEdyb3VwKCkpOyAKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI0NDE6MzogKCBydWxlX19Kdm1XaWxkY2FyZFR5cGVSZWZlcmVuY2VfX0dyb3VwX18wICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI0NDE6NDogcnVsZV9fSnZtV2lsZGNhcmRUeXBlUmVmZXJlbmNlX19Hcm91cF9fMAorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjU0MTozOiAoIHJ1bGVfX0p2bVdpbGRjYXJkVHlwZVJlZmVyZW5jZV9fR3JvdXBfXzAgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjU0MTo0OiBydWxlX19Kdm1XaWxkY2FyZFR5cGVSZWZlcmVuY2VfX0dyb3VwX18wCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV18yKTsKICAgICAgICAgICAgIHJ1bGVfX0p2bVdpbGRjYXJkVHlwZVJlZmVyZW5jZV9fR3JvdXBfXzAoKTsKQEAgLTgyNTYsMTEgKzg2MTAsMTEgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJlbnRyeVJ1bGVKdm1VcHBlckJvdW5kIgotICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI0NTA6MTogZW50cnlSdWxlSnZtVXBwZXJCb3VuZCA6IHJ1bGVKdm1VcHBlckJvdW5kIEVPRiA7CisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjU1MDoxOiBlbnRyeVJ1bGVKdm1VcHBlckJvdW5kIDogcnVsZUp2bVVwcGVyQm91bmQgRU9GIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBlbnRyeVJ1bGVKdm1VcHBlckJvdW5kKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI0NTE6MTogKCBydWxlSnZtVXBwZXJCb3VuZCBFT0YgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjQ1MjoxOiBydWxlSnZtVXBwZXJCb3VuZCBFT0YKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI1NTE6MTogKCBydWxlSnZtVXBwZXJCb3VuZCBFT0YgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjU1MjoxOiBydWxlSnZtVXBwZXJCb3VuZCBFT0YKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0SnZtVXBwZXJCb3VuZFJ1bGUoKSk7IApAQCAtODI5MCwyMyArODY0NCwyMyBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVKdm1VcHBlckJvdW5kIgotICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI0NTk6MTogcnVsZUp2bVVwcGVyQm91bmQgOiAoICggcnVsZV9fSnZtVXBwZXJCb3VuZF9fR3JvdXBfXzAgKSApIDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNTU5OjE6IHJ1bGVKdm1VcHBlckJvdW5kIDogKCAoIHJ1bGVfX0p2bVVwcGVyQm91bmRfX0dyb3VwX18wICkgKSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZUp2bVVwcGVyQm91bmQoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjQ2MzoyOiAoICggKCBydWxlX19Kdm1VcHBlckJvdW5kX19Hcm91cF9fMCApICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjQ2NDoyOiAoICggcnVsZV9fSnZtVXBwZXJCb3VuZF9fR3JvdXBfXzAgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNTYzOjI6ICggKCAoIHJ1bGVfX0p2bVVwcGVyQm91bmRfX0dyb3VwX18wICkgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNTY0OjI6ICggKCBydWxlX19Kdm1VcHBlckJvdW5kX19Hcm91cF9fMCApICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI0NjQ6MjogKCAoIHJ1bGVfX0p2bVVwcGVyQm91bmRfX0dyb3VwX18wICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjQ2NTozOiAoIHJ1bGVfX0p2bVVwcGVyQm91bmRfX0dyb3VwX18wICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI1NjQ6MjogKCAoIHJ1bGVfX0p2bVVwcGVyQm91bmRfX0dyb3VwX18wICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjU2NTozOiAoIHJ1bGVfX0p2bVVwcGVyQm91bmRfX0dyb3VwX18wICkKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0SnZtVXBwZXJCb3VuZEFjY2VzcygpLmdldEdyb3VwKCkpOyAKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI0NjY6MzogKCBydWxlX19Kdm1VcHBlckJvdW5kX19Hcm91cF9fMCApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNDY2OjQ6IHJ1bGVfX0p2bVVwcGVyQm91bmRfX0dyb3VwX18wCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNTY2OjM6ICggcnVsZV9fSnZtVXBwZXJCb3VuZF9fR3JvdXBfXzAgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjU2Njo0OiBydWxlX19Kdm1VcHBlckJvdW5kX19Hcm91cF9fMAogICAgICAgICAgICAgewogICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMik7CiAgICAgICAgICAgICBydWxlX19Kdm1VcHBlckJvdW5kX19Hcm91cF9fMCgpOwpAQCAtODM0MSwxMSArODY5NSwxMSBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgImVudHJ5UnVsZUp2bVVwcGVyQm91bmRBbmRlZCIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNDc1OjE6IGVudHJ5UnVsZUp2bVVwcGVyQm91bmRBbmRlZCA6IHJ1bGVKdm1VcHBlckJvdW5kQW5kZWQgRU9GIDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNTc1OjE6IGVudHJ5UnVsZUp2bVVwcGVyQm91bmRBbmRlZCA6IHJ1bGVKdm1VcHBlckJvdW5kQW5kZWQgRU9GIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBlbnRyeVJ1bGVKdm1VcHBlckJvdW5kQW5kZWQoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjQ3NjoxOiAoIHJ1bGVKdm1VcHBlckJvdW5kQW5kZWQgRU9GICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI0Nzc6MTogcnVsZUp2bVVwcGVyQm91bmRBbmRlZCBFT0YKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI1NzY6MTogKCBydWxlSnZtVXBwZXJCb3VuZEFuZGVkIEVPRiApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNTc3OjE6IHJ1bGVKdm1VcHBlckJvdW5kQW5kZWQgRU9GCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldEp2bVVwcGVyQm91bmRBbmRlZFJ1bGUoKSk7IApAQCAtODM3NSwyMyArODcyOSwyMyBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVKdm1VcHBlckJvdW5kQW5kZWQiCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjQ4NDoxOiBydWxlSnZtVXBwZXJCb3VuZEFuZGVkIDogKCAoIHJ1bGVfX0p2bVVwcGVyQm91bmRBbmRlZF9fR3JvdXBfXzAgKSApIDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNTg0OjE6IHJ1bGVKdm1VcHBlckJvdW5kQW5kZWQgOiAoICggcnVsZV9fSnZtVXBwZXJCb3VuZEFuZGVkX19Hcm91cF9fMCApICkgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVKdm1VcHBlckJvdW5kQW5kZWQoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjQ4ODoyOiAoICggKCBydWxlX19Kdm1VcHBlckJvdW5kQW5kZWRfX0dyb3VwX18wICkgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNDg5OjI6ICggKCBydWxlX19Kdm1VcHBlckJvdW5kQW5kZWRfX0dyb3VwX18wICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjU4ODoyOiAoICggKCBydWxlX19Kdm1VcHBlckJvdW5kQW5kZWRfX0dyb3VwX18wICkgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNTg5OjI6ICggKCBydWxlX19Kdm1VcHBlckJvdW5kQW5kZWRfX0dyb3VwX18wICkgKQogICAgICAgICAgICAgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjQ4OToyOiAoICggcnVsZV9fSnZtVXBwZXJCb3VuZEFuZGVkX19Hcm91cF9fMCApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI0OTA6MzogKCBydWxlX19Kdm1VcHBlckJvdW5kQW5kZWRfX0dyb3VwX18wICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI1ODk6MjogKCAoIHJ1bGVfX0p2bVVwcGVyQm91bmRBbmRlZF9fR3JvdXBfXzAgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNTkwOjM6ICggcnVsZV9fSnZtVXBwZXJCb3VuZEFuZGVkX19Hcm91cF9fMCApCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldEp2bVVwcGVyQm91bmRBbmRlZEFjY2VzcygpLmdldEdyb3VwKCkpOyAKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI0OTE6MzogKCBydWxlX19Kdm1VcHBlckJvdW5kQW5kZWRfX0dyb3VwX18wICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI0OTE6NDogcnVsZV9fSnZtVXBwZXJCb3VuZEFuZGVkX19Hcm91cF9fMAorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjU5MTozOiAoIHJ1bGVfX0p2bVVwcGVyQm91bmRBbmRlZF9fR3JvdXBfXzAgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjU5MTo0OiBydWxlX19Kdm1VcHBlckJvdW5kQW5kZWRfX0dyb3VwX18wCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV18yKTsKICAgICAgICAgICAgIHJ1bGVfX0p2bVVwcGVyQm91bmRBbmRlZF9fR3JvdXBfXzAoKTsKQEAgLTg0MjYsMTEgKzg3ODAsMTEgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJlbnRyeVJ1bGVKdm1Mb3dlckJvdW5kIgotICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI1MDA6MTogZW50cnlSdWxlSnZtTG93ZXJCb3VuZCA6IHJ1bGVKdm1Mb3dlckJvdW5kIEVPRiA7CisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjYwMDoxOiBlbnRyeVJ1bGVKdm1Mb3dlckJvdW5kIDogcnVsZUp2bUxvd2VyQm91bmQgRU9GIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBlbnRyeVJ1bGVKdm1Mb3dlckJvdW5kKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI1MDE6MTogKCBydWxlSnZtTG93ZXJCb3VuZCBFT0YgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjUwMjoxOiBydWxlSnZtTG93ZXJCb3VuZCBFT0YKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI2MDE6MTogKCBydWxlSnZtTG93ZXJCb3VuZCBFT0YgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjYwMjoxOiBydWxlSnZtTG93ZXJCb3VuZCBFT0YKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0SnZtTG93ZXJCb3VuZFJ1bGUoKSk7IApAQCAtODQ2MCwyMyArODgxNCwyMyBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVKdm1Mb3dlckJvdW5kIgotICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI1MDk6MTogcnVsZUp2bUxvd2VyQm91bmQgOiAoICggcnVsZV9fSnZtTG93ZXJCb3VuZF9fR3JvdXBfXzAgKSApIDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNjA5OjE6IHJ1bGVKdm1Mb3dlckJvdW5kIDogKCAoIHJ1bGVfX0p2bUxvd2VyQm91bmRfX0dyb3VwX18wICkgKSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZUp2bUxvd2VyQm91bmQoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjUxMzoyOiAoICggKCBydWxlX19Kdm1Mb3dlckJvdW5kX19Hcm91cF9fMCApICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjUxNDoyOiAoICggcnVsZV9fSnZtTG93ZXJCb3VuZF9fR3JvdXBfXzAgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNjEzOjI6ICggKCAoIHJ1bGVfX0p2bUxvd2VyQm91bmRfX0dyb3VwX18wICkgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNjE0OjI6ICggKCBydWxlX19Kdm1Mb3dlckJvdW5kX19Hcm91cF9fMCApICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI1MTQ6MjogKCAoIHJ1bGVfX0p2bUxvd2VyQm91bmRfX0dyb3VwX18wICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjUxNTozOiAoIHJ1bGVfX0p2bUxvd2VyQm91bmRfX0dyb3VwX18wICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI2MTQ6MjogKCAoIHJ1bGVfX0p2bUxvd2VyQm91bmRfX0dyb3VwX18wICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjYxNTozOiAoIHJ1bGVfX0p2bUxvd2VyQm91bmRfX0dyb3VwX18wICkKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0SnZtTG93ZXJCb3VuZEFjY2VzcygpLmdldEdyb3VwKCkpOyAKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI1MTY6MzogKCBydWxlX19Kdm1Mb3dlckJvdW5kX19Hcm91cF9fMCApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNTE2OjQ6IHJ1bGVfX0p2bUxvd2VyQm91bmRfX0dyb3VwX18wCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNjE2OjM6ICggcnVsZV9fSnZtTG93ZXJCb3VuZF9fR3JvdXBfXzAgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjYxNjo0OiBydWxlX19Kdm1Mb3dlckJvdW5kX19Hcm91cF9fMAogICAgICAgICAgICAgewogICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMik7CiAgICAgICAgICAgICBydWxlX19Kdm1Mb3dlckJvdW5kX19Hcm91cF9fMCgpOwpAQCAtODUxMSwxMSArODg2NSwxMSBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgImVudHJ5UnVsZUp2bUxvd2VyQm91bmRBbmRlZCIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNTI1OjE6IGVudHJ5UnVsZUp2bUxvd2VyQm91bmRBbmRlZCA6IHJ1bGVKdm1Mb3dlckJvdW5kQW5kZWQgRU9GIDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNjI1OjE6IGVudHJ5UnVsZUp2bUxvd2VyQm91bmRBbmRlZCA6IHJ1bGVKdm1Mb3dlckJvdW5kQW5kZWQgRU9GIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBlbnRyeVJ1bGVKdm1Mb3dlckJvdW5kQW5kZWQoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjUyNjoxOiAoIHJ1bGVKdm1Mb3dlckJvdW5kQW5kZWQgRU9GICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI1Mjc6MTogcnVsZUp2bUxvd2VyQm91bmRBbmRlZCBFT0YKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI2MjY6MTogKCBydWxlSnZtTG93ZXJCb3VuZEFuZGVkIEVPRiApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNjI3OjE6IHJ1bGVKdm1Mb3dlckJvdW5kQW5kZWQgRU9GCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldEp2bUxvd2VyQm91bmRBbmRlZFJ1bGUoKSk7IApAQCAtODU0NSwyMyArODg5OSwyMyBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVKdm1Mb3dlckJvdW5kQW5kZWQiCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjUzNDoxOiBydWxlSnZtTG93ZXJCb3VuZEFuZGVkIDogKCAoIHJ1bGVfX0p2bUxvd2VyQm91bmRBbmRlZF9fR3JvdXBfXzAgKSApIDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNjM0OjE6IHJ1bGVKdm1Mb3dlckJvdW5kQW5kZWQgOiAoICggcnVsZV9fSnZtTG93ZXJCb3VuZEFuZGVkX19Hcm91cF9fMCApICkgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVKdm1Mb3dlckJvdW5kQW5kZWQoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjUzODoyOiAoICggKCBydWxlX19Kdm1Mb3dlckJvdW5kQW5kZWRfX0dyb3VwX18wICkgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNTM5OjI6ICggKCBydWxlX19Kdm1Mb3dlckJvdW5kQW5kZWRfX0dyb3VwX18wICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjYzODoyOiAoICggKCBydWxlX19Kdm1Mb3dlckJvdW5kQW5kZWRfX0dyb3VwX18wICkgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNjM5OjI6ICggKCBydWxlX19Kdm1Mb3dlckJvdW5kQW5kZWRfX0dyb3VwX18wICkgKQogICAgICAgICAgICAgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjUzOToyOiAoICggcnVsZV9fSnZtTG93ZXJCb3VuZEFuZGVkX19Hcm91cF9fMCApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI1NDA6MzogKCBydWxlX19Kdm1Mb3dlckJvdW5kQW5kZWRfX0dyb3VwX18wICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI2Mzk6MjogKCAoIHJ1bGVfX0p2bUxvd2VyQm91bmRBbmRlZF9fR3JvdXBfXzAgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNjQwOjM6ICggcnVsZV9fSnZtTG93ZXJCb3VuZEFuZGVkX19Hcm91cF9fMCApCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldEp2bUxvd2VyQm91bmRBbmRlZEFjY2VzcygpLmdldEdyb3VwKCkpOyAKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI1NDE6MzogKCBydWxlX19Kdm1Mb3dlckJvdW5kQW5kZWRfX0dyb3VwX18wICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI1NDE6NDogcnVsZV9fSnZtTG93ZXJCb3VuZEFuZGVkX19Hcm91cF9fMAorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjY0MTozOiAoIHJ1bGVfX0p2bUxvd2VyQm91bmRBbmRlZF9fR3JvdXBfXzAgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjY0MTo0OiBydWxlX19Kdm1Mb3dlckJvdW5kQW5kZWRfX0dyb3VwX18wCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV18yKTsKICAgICAgICAgICAgIHJ1bGVfX0p2bUxvd2VyQm91bmRBbmRlZF9fR3JvdXBfXzAoKTsKQEAgLTg1OTYsMTEgKzg5NTAsMTEgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJlbnRyeVJ1bGVRdWFsaWZpZWROYW1lV2l0aFdpbGRjYXJkIgotICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI1NTA6MTogZW50cnlSdWxlUXVhbGlmaWVkTmFtZVdpdGhXaWxkY2FyZCA6IHJ1bGVRdWFsaWZpZWROYW1lV2l0aFdpbGRjYXJkIEVPRiA7CisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjY1MDoxOiBlbnRyeVJ1bGVRdWFsaWZpZWROYW1lV2l0aFdpbGRjYXJkIDogcnVsZVF1YWxpZmllZE5hbWVXaXRoV2lsZGNhcmQgRU9GIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBlbnRyeVJ1bGVRdWFsaWZpZWROYW1lV2l0aFdpbGRjYXJkKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI1NTE6MTogKCBydWxlUXVhbGlmaWVkTmFtZVdpdGhXaWxkY2FyZCBFT0YgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjU1MjoxOiBydWxlUXVhbGlmaWVkTmFtZVdpdGhXaWxkY2FyZCBFT0YKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI2NTE6MTogKCBydWxlUXVhbGlmaWVkTmFtZVdpdGhXaWxkY2FyZCBFT0YgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjY1MjoxOiBydWxlUXVhbGlmaWVkTmFtZVdpdGhXaWxkY2FyZCBFT0YKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0UXVhbGlmaWVkTmFtZVdpdGhXaWxkY2FyZFJ1bGUoKSk7IApAQCAtODYzMCwyMyArODk4NCwyMyBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVRdWFsaWZpZWROYW1lV2l0aFdpbGRjYXJkIgotICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI1NTk6MTogcnVsZVF1YWxpZmllZE5hbWVXaXRoV2lsZGNhcmQgOiAoICggcnVsZV9fUXVhbGlmaWVkTmFtZVdpdGhXaWxkY2FyZF9fR3JvdXBfXzAgKSApIDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNjU5OjE6IHJ1bGVRdWFsaWZpZWROYW1lV2l0aFdpbGRjYXJkIDogKCAoIHJ1bGVfX1F1YWxpZmllZE5hbWVXaXRoV2lsZGNhcmRfX0dyb3VwX18wICkgKSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZVF1YWxpZmllZE5hbWVXaXRoV2lsZGNhcmQoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjU2MzoyOiAoICggKCBydWxlX19RdWFsaWZpZWROYW1lV2l0aFdpbGRjYXJkX19Hcm91cF9fMCApICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjU2NDoyOiAoICggcnVsZV9fUXVhbGlmaWVkTmFtZVdpdGhXaWxkY2FyZF9fR3JvdXBfXzAgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNjYzOjI6ICggKCAoIHJ1bGVfX1F1YWxpZmllZE5hbWVXaXRoV2lsZGNhcmRfX0dyb3VwX18wICkgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNjY0OjI6ICggKCBydWxlX19RdWFsaWZpZWROYW1lV2l0aFdpbGRjYXJkX19Hcm91cF9fMCApICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI1NjQ6MjogKCAoIHJ1bGVfX1F1YWxpZmllZE5hbWVXaXRoV2lsZGNhcmRfX0dyb3VwX18wICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjU2NTozOiAoIHJ1bGVfX1F1YWxpZmllZE5hbWVXaXRoV2lsZGNhcmRfX0dyb3VwX18wICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI2NjQ6MjogKCAoIHJ1bGVfX1F1YWxpZmllZE5hbWVXaXRoV2lsZGNhcmRfX0dyb3VwX18wICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjY2NTozOiAoIHJ1bGVfX1F1YWxpZmllZE5hbWVXaXRoV2lsZGNhcmRfX0dyb3VwX18wICkKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0UXVhbGlmaWVkTmFtZVdpdGhXaWxkY2FyZEFjY2VzcygpLmdldEdyb3VwKCkpOyAKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI1NjY6MzogKCBydWxlX19RdWFsaWZpZWROYW1lV2l0aFdpbGRjYXJkX19Hcm91cF9fMCApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNTY2OjQ6IHJ1bGVfX1F1YWxpZmllZE5hbWVXaXRoV2lsZGNhcmRfX0dyb3VwX18wCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNjY2OjM6ICggcnVsZV9fUXVhbGlmaWVkTmFtZVdpdGhXaWxkY2FyZF9fR3JvdXBfXzAgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjY2Njo0OiBydWxlX19RdWFsaWZpZWROYW1lV2l0aFdpbGRjYXJkX19Hcm91cF9fMAogICAgICAgICAgICAgewogICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMik7CiAgICAgICAgICAgICBydWxlX19RdWFsaWZpZWROYW1lV2l0aFdpbGRjYXJkX19Hcm91cF9fMCgpOwpAQCAtODY4MSwxMSArOTAzNSwxMSBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgImVudHJ5UnVsZVZhbGlkSUQiCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjU3NToxOiBlbnRyeVJ1bGVWYWxpZElEIDogcnVsZVZhbGlkSUQgRU9GIDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNjc1OjE6IGVudHJ5UnVsZVZhbGlkSUQgOiBydWxlVmFsaWRJRCBFT0YgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIGVudHJ5UnVsZVZhbGlkSUQoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjU3NjoxOiAoIHJ1bGVWYWxpZElEIEVPRiApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNTc3OjE6IHJ1bGVWYWxpZElEIEVPRgorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjY3NjoxOiAoIHJ1bGVWYWxpZElEIEVPRiApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNjc3OjE6IHJ1bGVWYWxpZElEIEVPRgogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRWYWxpZElEUnVsZSgpKTsgCkBAIC04NzE1LDE3ICs5MDY5LDE3IEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZVZhbGlkSUQiCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjU4NDoxOiBydWxlVmFsaWRJRCA6ICggUlVMRV9JRCApIDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNjg0OjE6IHJ1bGVWYWxpZElEIDogKCBSVUxFX0lEICkgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVWYWxpZElEKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI1ODg6MjogKCAoIFJVTEVfSUQgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNTg5OjI6ICggUlVMRV9JRCApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNjg4OjI6ICggKCBSVUxFX0lEICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjY4OToyOiAoIFJVTEVfSUQgKQogICAgICAgICAgICAgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjU4OToyOiAoIFJVTEVfSUQgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjU5MDozOiBSVUxFX0lECisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNjg5OjI6ICggUlVMRV9JRCApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNjkwOjM6IFJVTEVfSUQKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0VmFsaWRJREFjY2VzcygpLmdldElEVGVybWluYWxSdWxlQ2FsbCgpKTsgCkBAIC04NzU2LDExICs5MTEwLDExIEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAiZW50cnlSdWxlWEltcG9ydFNlY3Rpb24iCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjYwMDoxOiBlbnRyeVJ1bGVYSW1wb3J0U2VjdGlvbiA6IHJ1bGVYSW1wb3J0U2VjdGlvbiBFT0YgOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI3MDA6MTogZW50cnlSdWxlWEltcG9ydFNlY3Rpb24gOiBydWxlWEltcG9ydFNlY3Rpb24gRU9GIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBlbnRyeVJ1bGVYSW1wb3J0U2VjdGlvbigpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNjAxOjE6ICggcnVsZVhJbXBvcnRTZWN0aW9uIEVPRiApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNjAyOjE6IHJ1bGVYSW1wb3J0U2VjdGlvbiBFT0YKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI3MDE6MTogKCBydWxlWEltcG9ydFNlY3Rpb24gRU9GICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI3MDI6MTogcnVsZVhJbXBvcnRTZWN0aW9uIEVPRgogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYSW1wb3J0U2VjdGlvblJ1bGUoKSk7IApAQCAtODc5MCwyNiArOTE0NCwyNiBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVYSW1wb3J0U2VjdGlvbiIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNjA5OjE6IHJ1bGVYSW1wb3J0U2VjdGlvbiA6ICggKCAoIHJ1bGVfX1hJbXBvcnRTZWN0aW9uX19JbXBvcnREZWNsYXJhdGlvbnNBc3NpZ25tZW50ICkgKSAoICggcnVsZV9fWEltcG9ydFNlY3Rpb25fX0ltcG9ydERlY2xhcmF0aW9uc0Fzc2lnbm1lbnQgKSogKSApIDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNzA5OjE6IHJ1bGVYSW1wb3J0U2VjdGlvbiA6ICggKCAoIHJ1bGVfX1hJbXBvcnRTZWN0aW9uX19JbXBvcnREZWNsYXJhdGlvbnNBc3NpZ25tZW50ICkgKSAoICggcnVsZV9fWEltcG9ydFNlY3Rpb25fX0ltcG9ydERlY2xhcmF0aW9uc0Fzc2lnbm1lbnQgKSogKSApIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlWEltcG9ydFNlY3Rpb24oKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjYxMzoyOiAoICggKCAoIHJ1bGVfX1hJbXBvcnRTZWN0aW9uX19JbXBvcnREZWNsYXJhdGlvbnNBc3NpZ25tZW50ICkgKSAoICggcnVsZV9fWEltcG9ydFNlY3Rpb25fX0ltcG9ydERlY2xhcmF0aW9uc0Fzc2lnbm1lbnQgKSogKSApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI2MTQ6MjogKCAoICggcnVsZV9fWEltcG9ydFNlY3Rpb25fX0ltcG9ydERlY2xhcmF0aW9uc0Fzc2lnbm1lbnQgKSApICggKCBydWxlX19YSW1wb3J0U2VjdGlvbl9fSW1wb3J0RGVjbGFyYXRpb25zQXNzaWdubWVudCApKiApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI3MTM6MjogKCAoICggKCBydWxlX19YSW1wb3J0U2VjdGlvbl9fSW1wb3J0RGVjbGFyYXRpb25zQXNzaWdubWVudCApICkgKCAoIHJ1bGVfX1hJbXBvcnRTZWN0aW9uX19JbXBvcnREZWNsYXJhdGlvbnNBc3NpZ25tZW50ICkqICkgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNzE0OjI6ICggKCAoIHJ1bGVfX1hJbXBvcnRTZWN0aW9uX19JbXBvcnREZWNsYXJhdGlvbnNBc3NpZ25tZW50ICkgKSAoICggcnVsZV9fWEltcG9ydFNlY3Rpb25fX0ltcG9ydERlY2xhcmF0aW9uc0Fzc2lnbm1lbnQgKSogKSApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNjE0OjI6ICggKCAoIHJ1bGVfX1hJbXBvcnRTZWN0aW9uX19JbXBvcnREZWNsYXJhdGlvbnNBc3NpZ25tZW50ICkgKSAoICggcnVsZV9fWEltcG9ydFNlY3Rpb25fX0ltcG9ydERlY2xhcmF0aW9uc0Fzc2lnbm1lbnQgKSogKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNjE1OjM6ICggKCBydWxlX19YSW1wb3J0U2VjdGlvbl9fSW1wb3J0RGVjbGFyYXRpb25zQXNzaWdubWVudCApICkgKCAoIHJ1bGVfX1hJbXBvcnRTZWN0aW9uX19JbXBvcnREZWNsYXJhdGlvbnNBc3NpZ25tZW50ICkqICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI3MTQ6MjogKCAoICggcnVsZV9fWEltcG9ydFNlY3Rpb25fX0ltcG9ydERlY2xhcmF0aW9uc0Fzc2lnbm1lbnQgKSApICggKCBydWxlX19YSW1wb3J0U2VjdGlvbl9fSW1wb3J0RGVjbGFyYXRpb25zQXNzaWdubWVudCApKiApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI3MTU6MzogKCAoIHJ1bGVfX1hJbXBvcnRTZWN0aW9uX19JbXBvcnREZWNsYXJhdGlvbnNBc3NpZ25tZW50ICkgKSAoICggcnVsZV9fWEltcG9ydFNlY3Rpb25fX0ltcG9ydERlY2xhcmF0aW9uc0Fzc2lnbm1lbnQgKSogKQogICAgICAgICAgICAgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjYxNTozOiAoICggcnVsZV9fWEltcG9ydFNlY3Rpb25fX0ltcG9ydERlY2xhcmF0aW9uc0Fzc2lnbm1lbnQgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNjE2OjQ6ICggcnVsZV9fWEltcG9ydFNlY3Rpb25fX0ltcG9ydERlY2xhcmF0aW9uc0Fzc2lnbm1lbnQgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjcxNTozOiAoICggcnVsZV9fWEltcG9ydFNlY3Rpb25fX0ltcG9ydERlY2xhcmF0aW9uc0Fzc2lnbm1lbnQgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNzE2OjQ6ICggcnVsZV9fWEltcG9ydFNlY3Rpb25fX0ltcG9ydERlY2xhcmF0aW9uc0Fzc2lnbm1lbnQgKQogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYSW1wb3J0U2VjdGlvbkFjY2VzcygpLmdldEltcG9ydERlY2xhcmF0aW9uc0Fzc2lnbm1lbnQoKSk7IAogICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjYxNzo0OiAoIHJ1bGVfX1hJbXBvcnRTZWN0aW9uX19JbXBvcnREZWNsYXJhdGlvbnNBc3NpZ25tZW50ICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI2MTc6NTogcnVsZV9fWEltcG9ydFNlY3Rpb25fX0ltcG9ydERlY2xhcmF0aW9uc0Fzc2lnbm1lbnQKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI3MTc6NDogKCBydWxlX19YSW1wb3J0U2VjdGlvbl9fSW1wb3J0RGVjbGFyYXRpb25zQXNzaWdubWVudCApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNzE3OjU6IHJ1bGVfX1hJbXBvcnRTZWN0aW9uX19JbXBvcnREZWNsYXJhdGlvbnNBc3NpZ25tZW50CiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV18zKTsKICAgICAgICAgICAgIHJ1bGVfX1hJbXBvcnRTZWN0aW9uX19JbXBvcnREZWNsYXJhdGlvbnNBc3NpZ25tZW50KCk7CkBAIC04ODI1LDEzICs5MTc5LDEzIEBACiAKICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjYyMDozOiAoICggcnVsZV9fWEltcG9ydFNlY3Rpb25fX0ltcG9ydERlY2xhcmF0aW9uc0Fzc2lnbm1lbnQgKSogKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjYyMTo0OiAoIHJ1bGVfX1hJbXBvcnRTZWN0aW9uX19JbXBvcnREZWNsYXJhdGlvbnNBc3NpZ25tZW50ICkqCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNzIwOjM6ICggKCBydWxlX19YSW1wb3J0U2VjdGlvbl9fSW1wb3J0RGVjbGFyYXRpb25zQXNzaWdubWVudCApKiApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNzIxOjQ6ICggcnVsZV9fWEltcG9ydFNlY3Rpb25fX0ltcG9ydERlY2xhcmF0aW9uc0Fzc2lnbm1lbnQgKSoKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WEltcG9ydFNlY3Rpb25BY2Nlc3MoKS5nZXRJbXBvcnREZWNsYXJhdGlvbnNBc3NpZ25tZW50KCkpOyAKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI2MjI6NDogKCBydWxlX19YSW1wb3J0U2VjdGlvbl9fSW1wb3J0RGVjbGFyYXRpb25zQXNzaWdubWVudCApKgorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjcyMjo0OiAoIHJ1bGVfX1hJbXBvcnRTZWN0aW9uX19JbXBvcnREZWNsYXJhdGlvbnNBc3NpZ25tZW50ICkqCiAgICAgICAgICAgICBsb29wMToKICAgICAgICAgICAgIGRvIHsKICAgICAgICAgICAgICAgICBpbnQgYWx0MT0yOwpAQCAtODg0NCw3ICs5MTk4LDcgQEAKIAogICAgICAgICAgICAgICAgIHN3aXRjaCAoYWx0MSkgewogICAgICAgICAgICAgCWNhc2UgMSA6Ci0gICAgICAgICAgICAJICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI2MjI6NTogcnVsZV9fWEltcG9ydFNlY3Rpb25fX0ltcG9ydERlY2xhcmF0aW9uc0Fzc2lnbm1lbnQKKyAgICAgICAgICAgIAkgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjcyMjo1OiBydWxlX19YSW1wb3J0U2VjdGlvbl9fSW1wb3J0RGVjbGFyYXRpb25zQXNzaWdubWVudAogICAgICAgICAgICAgCSAgICB7CiAgICAgICAgICAgICAJICAgIHB1c2hGb2xsb3coRk9MTE9XXzMpOwogICAgICAgICAgICAgCSAgICBydWxlX19YSW1wb3J0U2VjdGlvbl9fSW1wb3J0RGVjbGFyYXRpb25zQXNzaWdubWVudCgpOwpAQCAtODg4OCwxMSArOTI0MiwxMSBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgImVudHJ5UnVsZVF1YWxpZmllZE5hbWVJblN0YXRpY0ltcG9ydCIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNjMyOjE6IGVudHJ5UnVsZVF1YWxpZmllZE5hbWVJblN0YXRpY0ltcG9ydCA6IHJ1bGVRdWFsaWZpZWROYW1lSW5TdGF0aWNJbXBvcnQgRU9GIDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNzMyOjE6IGVudHJ5UnVsZVF1YWxpZmllZE5hbWVJblN0YXRpY0ltcG9ydCA6IHJ1bGVRdWFsaWZpZWROYW1lSW5TdGF0aWNJbXBvcnQgRU9GIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBlbnRyeVJ1bGVRdWFsaWZpZWROYW1lSW5TdGF0aWNJbXBvcnQoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjYzMzoxOiAoIHJ1bGVRdWFsaWZpZWROYW1lSW5TdGF0aWNJbXBvcnQgRU9GICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI2MzQ6MTogcnVsZVF1YWxpZmllZE5hbWVJblN0YXRpY0ltcG9ydCBFT0YKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI3MzM6MTogKCBydWxlUXVhbGlmaWVkTmFtZUluU3RhdGljSW1wb3J0IEVPRiApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNzM0OjE6IHJ1bGVRdWFsaWZpZWROYW1lSW5TdGF0aWNJbXBvcnQgRU9GCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFF1YWxpZmllZE5hbWVJblN0YXRpY0ltcG9ydFJ1bGUoKSk7IApAQCAtODkyMiwyNiArOTI3NiwyNiBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVRdWFsaWZpZWROYW1lSW5TdGF0aWNJbXBvcnQiCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjY0MToxOiBydWxlUXVhbGlmaWVkTmFtZUluU3RhdGljSW1wb3J0IDogKCAoICggcnVsZV9fUXVhbGlmaWVkTmFtZUluU3RhdGljSW1wb3J0X19Hcm91cF9fMCApICkgKCAoIHJ1bGVfX1F1YWxpZmllZE5hbWVJblN0YXRpY0ltcG9ydF9fR3JvdXBfXzAgKSogKSApIDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNzQxOjE6IHJ1bGVRdWFsaWZpZWROYW1lSW5TdGF0aWNJbXBvcnQgOiAoICggKCBydWxlX19RdWFsaWZpZWROYW1lSW5TdGF0aWNJbXBvcnRfX0dyb3VwX18wICkgKSAoICggcnVsZV9fUXVhbGlmaWVkTmFtZUluU3RhdGljSW1wb3J0X19Hcm91cF9fMCApKiApICkgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVRdWFsaWZpZWROYW1lSW5TdGF0aWNJbXBvcnQoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjY0NToyOiAoICggKCAoIHJ1bGVfX1F1YWxpZmllZE5hbWVJblN0YXRpY0ltcG9ydF9fR3JvdXBfXzAgKSApICggKCBydWxlX19RdWFsaWZpZWROYW1lSW5TdGF0aWNJbXBvcnRfX0dyb3VwX18wICkqICkgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNjQ2OjI6ICggKCAoIHJ1bGVfX1F1YWxpZmllZE5hbWVJblN0YXRpY0ltcG9ydF9fR3JvdXBfXzAgKSApICggKCBydWxlX19RdWFsaWZpZWROYW1lSW5TdGF0aWNJbXBvcnRfX0dyb3VwX18wICkqICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6Mjc0NToyOiAoICggKCAoIHJ1bGVfX1F1YWxpZmllZE5hbWVJblN0YXRpY0ltcG9ydF9fR3JvdXBfXzAgKSApICggKCBydWxlX19RdWFsaWZpZWROYW1lSW5TdGF0aWNJbXBvcnRfX0dyb3VwX18wICkqICkgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNzQ2OjI6ICggKCAoIHJ1bGVfX1F1YWxpZmllZE5hbWVJblN0YXRpY0ltcG9ydF9fR3JvdXBfXzAgKSApICggKCBydWxlX19RdWFsaWZpZWROYW1lSW5TdGF0aWNJbXBvcnRfX0dyb3VwX18wICkqICkgKQogICAgICAgICAgICAgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjY0NjoyOiAoICggKCBydWxlX19RdWFsaWZpZWROYW1lSW5TdGF0aWNJbXBvcnRfX0dyb3VwX18wICkgKSAoICggcnVsZV9fUXVhbGlmaWVkTmFtZUluU3RhdGljSW1wb3J0X19Hcm91cF9fMCApKiApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI2NDc6MzogKCAoIHJ1bGVfX1F1YWxpZmllZE5hbWVJblN0YXRpY0ltcG9ydF9fR3JvdXBfXzAgKSApICggKCBydWxlX19RdWFsaWZpZWROYW1lSW5TdGF0aWNJbXBvcnRfX0dyb3VwX18wICkqICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI3NDY6MjogKCAoICggcnVsZV9fUXVhbGlmaWVkTmFtZUluU3RhdGljSW1wb3J0X19Hcm91cF9fMCApICkgKCAoIHJ1bGVfX1F1YWxpZmllZE5hbWVJblN0YXRpY0ltcG9ydF9fR3JvdXBfXzAgKSogKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNzQ3OjM6ICggKCBydWxlX19RdWFsaWZpZWROYW1lSW5TdGF0aWNJbXBvcnRfX0dyb3VwX18wICkgKSAoICggcnVsZV9fUXVhbGlmaWVkTmFtZUluU3RhdGljSW1wb3J0X19Hcm91cF9fMCApKiApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNjQ3OjM6ICggKCBydWxlX19RdWFsaWZpZWROYW1lSW5TdGF0aWNJbXBvcnRfX0dyb3VwX18wICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjY0ODo0OiAoIHJ1bGVfX1F1YWxpZmllZE5hbWVJblN0YXRpY0ltcG9ydF9fR3JvdXBfXzAgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6Mjc0NzozOiAoICggcnVsZV9fUXVhbGlmaWVkTmFtZUluU3RhdGljSW1wb3J0X19Hcm91cF9fMCApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI3NDg6NDogKCBydWxlX19RdWFsaWZpZWROYW1lSW5TdGF0aWNJbXBvcnRfX0dyb3VwX18wICkKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0UXVhbGlmaWVkTmFtZUluU3RhdGljSW1wb3J0QWNjZXNzKCkuZ2V0R3JvdXAoKSk7IAogICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjY0OTo0OiAoIHJ1bGVfX1F1YWxpZmllZE5hbWVJblN0YXRpY0ltcG9ydF9fR3JvdXBfXzAgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjY0OTo1OiBydWxlX19RdWFsaWZpZWROYW1lSW5TdGF0aWNJbXBvcnRfX0dyb3VwX18wCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNzQ5OjQ6ICggcnVsZV9fUXVhbGlmaWVkTmFtZUluU3RhdGljSW1wb3J0X19Hcm91cF9fMCApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNzQ5OjU6IHJ1bGVfX1F1YWxpZmllZE5hbWVJblN0YXRpY0ltcG9ydF9fR3JvdXBfXzAKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzQpOwogICAgICAgICAgICAgcnVsZV9fUXVhbGlmaWVkTmFtZUluU3RhdGljSW1wb3J0X19Hcm91cF9fMCgpOwpAQCAtODk1NywxMyArOTMxMSwxMyBAQAogCiAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI2NTI6MzogKCAoIHJ1bGVfX1F1YWxpZmllZE5hbWVJblN0YXRpY0ltcG9ydF9fR3JvdXBfXzAgKSogKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjY1Mzo0OiAoIHJ1bGVfX1F1YWxpZmllZE5hbWVJblN0YXRpY0ltcG9ydF9fR3JvdXBfXzAgKSoKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI3NTI6MzogKCAoIHJ1bGVfX1F1YWxpZmllZE5hbWVJblN0YXRpY0ltcG9ydF9fR3JvdXBfXzAgKSogKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6Mjc1Mzo0OiAoIHJ1bGVfX1F1YWxpZmllZE5hbWVJblN0YXRpY0ltcG9ydF9fR3JvdXBfXzAgKSoKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0UXVhbGlmaWVkTmFtZUluU3RhdGljSW1wb3J0QWNjZXNzKCkuZ2V0R3JvdXAoKSk7IAogICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjY1NDo0OiAoIHJ1bGVfX1F1YWxpZmllZE5hbWVJblN0YXRpY0ltcG9ydF9fR3JvdXBfXzAgKSoKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI3NTQ6NDogKCBydWxlX19RdWFsaWZpZWROYW1lSW5TdGF0aWNJbXBvcnRfX0dyb3VwX18wICkqCiAgICAgICAgICAgICBsb29wMjoKICAgICAgICAgICAgIGRvIHsKICAgICAgICAgICAgICAgICBpbnQgYWx0Mj0yOwpAQCAtODk4Miw3ICs5MzM2LDcgQEAKIAogICAgICAgICAgICAgICAgIHN3aXRjaCAoYWx0MikgewogICAgICAgICAgICAgCWNhc2UgMSA6Ci0gICAgICAgICAgICAJICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI2NTQ6NTogcnVsZV9fUXVhbGlmaWVkTmFtZUluU3RhdGljSW1wb3J0X19Hcm91cF9fMAorICAgICAgICAgICAgCSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNzU0OjU6IHJ1bGVfX1F1YWxpZmllZE5hbWVJblN0YXRpY0ltcG9ydF9fR3JvdXBfXzAKICAgICAgICAgICAgIAkgICAgewogICAgICAgICAgICAgCSAgICBwdXNoRm9sbG93KEZPTExPV180KTsKICAgICAgICAgICAgIAkgICAgcnVsZV9fUXVhbGlmaWVkTmFtZUluU3RhdGljSW1wb3J0X19Hcm91cF9fMCgpOwpAQCAtOTAyNiwyMyArOTM4MCwyMyBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVQcmVkZWZpbmVkQmxvYk1pbWVUeXBlRW51bSIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNjY0OjE6IHJ1bGVQcmVkZWZpbmVkQmxvYk1pbWVUeXBlRW51bSA6ICggKCBydWxlX19QcmVkZWZpbmVkQmxvYk1pbWVUeXBlRW51bV9fQWx0ZXJuYXRpdmVzICkgKSA7CisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6Mjc2NDoxOiBydWxlUHJlZGVmaW5lZEJsb2JNaW1lVHlwZUVudW0gOiAoICggcnVsZV9fUHJlZGVmaW5lZEJsb2JNaW1lVHlwZUVudW1fX0FsdGVybmF0aXZlcyApICkgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVQcmVkZWZpbmVkQmxvYk1pbWVUeXBlRW51bSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNjY4OjE6ICggKCAoIHJ1bGVfX1ByZWRlZmluZWRCbG9iTWltZVR5cGVFbnVtX19BbHRlcm5hdGl2ZXMgKSApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI2Njk6MjogKCAoIHJ1bGVfX1ByZWRlZmluZWRCbG9iTWltZVR5cGVFbnVtX19BbHRlcm5hdGl2ZXMgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNzY4OjE6ICggKCAoIHJ1bGVfX1ByZWRlZmluZWRCbG9iTWltZVR5cGVFbnVtX19BbHRlcm5hdGl2ZXMgKSApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI3Njk6MjogKCAoIHJ1bGVfX1ByZWRlZmluZWRCbG9iTWltZVR5cGVFbnVtX19BbHRlcm5hdGl2ZXMgKSApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNjY5OjI6ICggKCBydWxlX19QcmVkZWZpbmVkQmxvYk1pbWVUeXBlRW51bV9fQWx0ZXJuYXRpdmVzICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjY3MDozOiAoIHJ1bGVfX1ByZWRlZmluZWRCbG9iTWltZVR5cGVFbnVtX19BbHRlcm5hdGl2ZXMgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6Mjc2OToyOiAoICggcnVsZV9fUHJlZGVmaW5lZEJsb2JNaW1lVHlwZUVudW1fX0FsdGVybmF0aXZlcyApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI3NzA6MzogKCBydWxlX19QcmVkZWZpbmVkQmxvYk1pbWVUeXBlRW51bV9fQWx0ZXJuYXRpdmVzICkKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0UHJlZGVmaW5lZEJsb2JNaW1lVHlwZUVudW1BY2Nlc3MoKS5nZXRBbHRlcm5hdGl2ZXMoKSk7IAogICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjY3MTozOiAoIHJ1bGVfX1ByZWRlZmluZWRCbG9iTWltZVR5cGVFbnVtX19BbHRlcm5hdGl2ZXMgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjY3MTo0OiBydWxlX19QcmVkZWZpbmVkQmxvYk1pbWVUeXBlRW51bV9fQWx0ZXJuYXRpdmVzCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNzcxOjM6ICggcnVsZV9fUHJlZGVmaW5lZEJsb2JNaW1lVHlwZUVudW1fX0FsdGVybmF0aXZlcyApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNzcxOjQ6IHJ1bGVfX1ByZWRlZmluZWRCbG9iTWltZVR5cGVFbnVtX19BbHRlcm5hdGl2ZXMKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzIpOwogICAgICAgICAgICAgcnVsZV9fUHJlZGVmaW5lZEJsb2JNaW1lVHlwZUVudW1fX0FsdGVybmF0aXZlcygpOwpAQCAtOTA3NywyMyArOTQzMSwyMyBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVQcmVkZWZpbmVkQmVhbkVudW0iCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjY4MDoxOiBydWxlUHJlZGVmaW5lZEJlYW5FbnVtIDogKCAoIHJ1bGVfX1ByZWRlZmluZWRCZWFuRW51bV9fQWx0ZXJuYXRpdmVzICkgKSA7CisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6Mjc4MDoxOiBydWxlUHJlZGVmaW5lZEJlYW5FbnVtIDogKCAoIHJ1bGVfX1ByZWRlZmluZWRCZWFuRW51bV9fQWx0ZXJuYXRpdmVzICkgKSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZVByZWRlZmluZWRCZWFuRW51bSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNjg0OjE6ICggKCAoIHJ1bGVfX1ByZWRlZmluZWRCZWFuRW51bV9fQWx0ZXJuYXRpdmVzICkgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNjg1OjI6ICggKCBydWxlX19QcmVkZWZpbmVkQmVhbkVudW1fX0FsdGVybmF0aXZlcyApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI3ODQ6MTogKCAoICggcnVsZV9fUHJlZGVmaW5lZEJlYW5FbnVtX19BbHRlcm5hdGl2ZXMgKSApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI3ODU6MjogKCAoIHJ1bGVfX1ByZWRlZmluZWRCZWFuRW51bV9fQWx0ZXJuYXRpdmVzICkgKQogICAgICAgICAgICAgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjY4NToyOiAoICggcnVsZV9fUHJlZGVmaW5lZEJlYW5FbnVtX19BbHRlcm5hdGl2ZXMgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNjg2OjM6ICggcnVsZV9fUHJlZGVmaW5lZEJlYW5FbnVtX19BbHRlcm5hdGl2ZXMgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6Mjc4NToyOiAoICggcnVsZV9fUHJlZGVmaW5lZEJlYW5FbnVtX19BbHRlcm5hdGl2ZXMgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNzg2OjM6ICggcnVsZV9fUHJlZGVmaW5lZEJlYW5FbnVtX19BbHRlcm5hdGl2ZXMgKQogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRQcmVkZWZpbmVkQmVhbkVudW1BY2Nlc3MoKS5nZXRBbHRlcm5hdGl2ZXMoKSk7IAogICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjY4NzozOiAoIHJ1bGVfX1ByZWRlZmluZWRCZWFuRW51bV9fQWx0ZXJuYXRpdmVzICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI2ODc6NDogcnVsZV9fUHJlZGVmaW5lZEJlYW5FbnVtX19BbHRlcm5hdGl2ZXMKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI3ODc6MzogKCBydWxlX19QcmVkZWZpbmVkQmVhbkVudW1fX0FsdGVybmF0aXZlcyApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNzg3OjQ6IHJ1bGVfX1ByZWRlZmluZWRCZWFuRW51bV9fQWx0ZXJuYXRpdmVzCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV18yKTsKICAgICAgICAgICAgIHJ1bGVfX1ByZWRlZmluZWRCZWFuRW51bV9fQWx0ZXJuYXRpdmVzKCk7CkBAIC05MTI4LDIzICs5NDgyLDIzIEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZVByZWRlZmluZWRCZWFuVHlwZUVudW0iCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjY5NjoxOiBydWxlUHJlZGVmaW5lZEJlYW5UeXBlRW51bSA6ICggKCBydWxlX19QcmVkZWZpbmVkQmVhblR5cGVFbnVtX19BbHRlcm5hdGl2ZXMgKSApIDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNzk2OjE6IHJ1bGVQcmVkZWZpbmVkQmVhblR5cGVFbnVtIDogKCAoIHJ1bGVfX1ByZWRlZmluZWRCZWFuVHlwZUVudW1fX0FsdGVybmF0aXZlcyApICkgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVQcmVkZWZpbmVkQmVhblR5cGVFbnVtKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI3MDA6MTogKCAoICggcnVsZV9fUHJlZGVmaW5lZEJlYW5UeXBlRW51bV9fQWx0ZXJuYXRpdmVzICkgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNzAxOjI6ICggKCBydWxlX19QcmVkZWZpbmVkQmVhblR5cGVFbnVtX19BbHRlcm5hdGl2ZXMgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyODAwOjE6ICggKCAoIHJ1bGVfX1ByZWRlZmluZWRCZWFuVHlwZUVudW1fX0FsdGVybmF0aXZlcyApICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjgwMToyOiAoICggcnVsZV9fUHJlZGVmaW5lZEJlYW5UeXBlRW51bV9fQWx0ZXJuYXRpdmVzICkgKQogICAgICAgICAgICAgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjcwMToyOiAoICggcnVsZV9fUHJlZGVmaW5lZEJlYW5UeXBlRW51bV9fQWx0ZXJuYXRpdmVzICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjcwMjozOiAoIHJ1bGVfX1ByZWRlZmluZWRCZWFuVHlwZUVudW1fX0FsdGVybmF0aXZlcyApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyODAxOjI6ICggKCBydWxlX19QcmVkZWZpbmVkQmVhblR5cGVFbnVtX19BbHRlcm5hdGl2ZXMgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyODAyOjM6ICggcnVsZV9fUHJlZGVmaW5lZEJlYW5UeXBlRW51bV9fQWx0ZXJuYXRpdmVzICkKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0UHJlZGVmaW5lZEJlYW5UeXBlRW51bUFjY2VzcygpLmdldEFsdGVybmF0aXZlcygpKTsgCiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNzAzOjM6ICggcnVsZV9fUHJlZGVmaW5lZEJlYW5UeXBlRW51bV9fQWx0ZXJuYXRpdmVzICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI3MDM6NDogcnVsZV9fUHJlZGVmaW5lZEJlYW5UeXBlRW51bV9fQWx0ZXJuYXRpdmVzCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyODAzOjM6ICggcnVsZV9fUHJlZGVmaW5lZEJlYW5UeXBlRW51bV9fQWx0ZXJuYXRpdmVzICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI4MDM6NDogcnVsZV9fUHJlZGVmaW5lZEJlYW5UeXBlRW51bV9fQWx0ZXJuYXRpdmVzCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV18yKTsKICAgICAgICAgICAgIHJ1bGVfX1ByZWRlZmluZWRCZWFuVHlwZUVudW1fX0FsdGVybmF0aXZlcygpOwpAQCAtOTE3OSwyMyArOTUzMywyMyBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVFbnRpdHlNYW5hZ2VyTW9kZSIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNzEyOjE6IHJ1bGVFbnRpdHlNYW5hZ2VyTW9kZSA6ICggKCBydWxlX19FbnRpdHlNYW5hZ2VyTW9kZV9fQWx0ZXJuYXRpdmVzICkgKSA7CisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjgxMjoxOiBydWxlRW50aXR5TWFuYWdlck1vZGUgOiAoICggcnVsZV9fRW50aXR5TWFuYWdlck1vZGVfX0FsdGVybmF0aXZlcyApICkgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVFbnRpdHlNYW5hZ2VyTW9kZSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNzE2OjE6ICggKCAoIHJ1bGVfX0VudGl0eU1hbmFnZXJNb2RlX19BbHRlcm5hdGl2ZXMgKSApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI3MTc6MjogKCAoIHJ1bGVfX0VudGl0eU1hbmFnZXJNb2RlX19BbHRlcm5hdGl2ZXMgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyODE2OjE6ICggKCAoIHJ1bGVfX0VudGl0eU1hbmFnZXJNb2RlX19BbHRlcm5hdGl2ZXMgKSApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI4MTc6MjogKCAoIHJ1bGVfX0VudGl0eU1hbmFnZXJNb2RlX19BbHRlcm5hdGl2ZXMgKSApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNzE3OjI6ICggKCBydWxlX19FbnRpdHlNYW5hZ2VyTW9kZV9fQWx0ZXJuYXRpdmVzICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjcxODozOiAoIHJ1bGVfX0VudGl0eU1hbmFnZXJNb2RlX19BbHRlcm5hdGl2ZXMgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjgxNzoyOiAoICggcnVsZV9fRW50aXR5TWFuYWdlck1vZGVfX0FsdGVybmF0aXZlcyApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI4MTg6MzogKCBydWxlX19FbnRpdHlNYW5hZ2VyTW9kZV9fQWx0ZXJuYXRpdmVzICkKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0RW50aXR5TWFuYWdlck1vZGVBY2Nlc3MoKS5nZXRBbHRlcm5hdGl2ZXMoKSk7IAogICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjcxOTozOiAoIHJ1bGVfX0VudGl0eU1hbmFnZXJNb2RlX19BbHRlcm5hdGl2ZXMgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjcxOTo0OiBydWxlX19FbnRpdHlNYW5hZ2VyTW9kZV9fQWx0ZXJuYXRpdmVzCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyODE5OjM6ICggcnVsZV9fRW50aXR5TWFuYWdlck1vZGVfX0FsdGVybmF0aXZlcyApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyODE5OjQ6IHJ1bGVfX0VudGl0eU1hbmFnZXJNb2RlX19BbHRlcm5hdGl2ZXMKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzIpOwogICAgICAgICAgICAgcnVsZV9fRW50aXR5TWFuYWdlck1vZGVfX0FsdGVybmF0aXZlcygpOwpAQCAtOTIyOSwyNyArOTU4MywxMjkgQEAKICAgICAvLyAkQU5UTFIgZW5kICJydWxlRW50aXR5TWFuYWdlck1vZGUiCiAKIAorICAgIC8vICRBTlRMUiBzdGFydCAicnVsZUNvbmRpdGlvbkFuZE9wZXJhdG9yMSIKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyODI4OjE6IHJ1bGVDb25kaXRpb25BbmRPcGVyYXRvcjEgOiAoICggcnVsZV9fQ29uZGl0aW9uQW5kT3BlcmF0b3IxX19BbHRlcm5hdGl2ZXMgKSApIDsKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlQ29uZGl0aW9uQW5kT3BlcmF0b3IxKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKworICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgICAgIAkKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI4MzI6MTogKCAoICggcnVsZV9fQ29uZGl0aW9uQW5kT3BlcmF0b3IxX19BbHRlcm5hdGl2ZXMgKSApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI4MzM6MjogKCAoIHJ1bGVfX0NvbmRpdGlvbkFuZE9wZXJhdG9yMV9fQWx0ZXJuYXRpdmVzICkgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjgzMzoyOiAoICggcnVsZV9fQ29uZGl0aW9uQW5kT3BlcmF0b3IxX19BbHRlcm5hdGl2ZXMgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyODM0OjM6ICggcnVsZV9fQ29uZGl0aW9uQW5kT3BlcmF0b3IxX19BbHRlcm5hdGl2ZXMgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRDb25kaXRpb25BbmRPcGVyYXRvcjFBY2Nlc3MoKS5nZXRBbHRlcm5hdGl2ZXMoKSk7IAorICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjgzNTozOiAoIHJ1bGVfX0NvbmRpdGlvbkFuZE9wZXJhdG9yMV9fQWx0ZXJuYXRpdmVzICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI4MzU6NDogcnVsZV9fQ29uZGl0aW9uQW5kT3BlcmF0b3IxX19BbHRlcm5hdGl2ZXMKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzIpOworICAgICAgICAgICAgcnVsZV9fQ29uZGl0aW9uQW5kT3BlcmF0b3IxX19BbHRlcm5hdGl2ZXMoKTsKKworICAgICAgICAgICAgc3RhdGUuX2ZzcC0tOworICAgICAgICAgICAgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0Q29uZGl0aW9uQW5kT3BlcmF0b3IxQWNjZXNzKCkuZ2V0QWx0ZXJuYXRpdmVzKCkpOyAKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgIH0KKworICAgICAgICB9CisgICAgICAgIGNhdGNoIChSZWNvZ25pdGlvbkV4Y2VwdGlvbiByZSkgeworICAgICAgICAgICAgcmVwb3J0RXJyb3IocmUpOworICAgICAgICAgICAgcmVjb3ZlcihpbnB1dCxyZSk7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisKKyAgICAgICAgICAgIAlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7CisKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gOworICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJydWxlQ29uZGl0aW9uQW5kT3BlcmF0b3IxIgorCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVDb25kaXRpb25BbmRPcGVyYXRvcjIiCisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6Mjg0NDoxOiBydWxlQ29uZGl0aW9uQW5kT3BlcmF0b3IyIDogKCAoIHJ1bGVfX0NvbmRpdGlvbkFuZE9wZXJhdG9yMl9fQWx0ZXJuYXRpdmVzICkgKSA7CisgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZUNvbmRpdGlvbkFuZE9wZXJhdG9yMigpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisKKyAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgICAgICAJCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyODQ4OjE6ICggKCAoIHJ1bGVfX0NvbmRpdGlvbkFuZE9wZXJhdG9yMl9fQWx0ZXJuYXRpdmVzICkgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyODQ5OjI6ICggKCBydWxlX19Db25kaXRpb25BbmRPcGVyYXRvcjJfX0FsdGVybmF0aXZlcyApICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI4NDk6MjogKCAoIHJ1bGVfX0NvbmRpdGlvbkFuZE9wZXJhdG9yMl9fQWx0ZXJuYXRpdmVzICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6Mjg1MDozOiAoIHJ1bGVfX0NvbmRpdGlvbkFuZE9wZXJhdG9yMl9fQWx0ZXJuYXRpdmVzICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0Q29uZGl0aW9uQW5kT3BlcmF0b3IyQWNjZXNzKCkuZ2V0QWx0ZXJuYXRpdmVzKCkpOyAKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI4NTE6MzogKCBydWxlX19Db25kaXRpb25BbmRPcGVyYXRvcjJfX0FsdGVybmF0aXZlcyApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyODUxOjQ6IHJ1bGVfX0NvbmRpdGlvbkFuZE9wZXJhdG9yMl9fQWx0ZXJuYXRpdmVzCisgICAgICAgICAgICB7CisgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV18yKTsKKyAgICAgICAgICAgIHJ1bGVfX0NvbmRpdGlvbkFuZE9wZXJhdG9yMl9fQWx0ZXJuYXRpdmVzKCk7CisKKyAgICAgICAgICAgIHN0YXRlLl9mc3AtLTsKKyAgICAgICAgICAgIGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBhZnRlcihncmFtbWFyQWNjZXNzLmdldENvbmRpdGlvbkFuZE9wZXJhdG9yMkFjY2VzcygpLmdldEFsdGVybmF0aXZlcygpKTsgCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICB9CisKKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoUmVjb2duaXRpb25FeGNlcHRpb24gcmUpIHsKKyAgICAgICAgICAgIHJlcG9ydEVycm9yKHJlKTsKKyAgICAgICAgICAgIHJlY292ZXIoaW5wdXQscmUpOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworCisgICAgICAgICAgICAJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworCisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIDsKKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAicnVsZUNvbmRpdGlvbkFuZE9wZXJhdG9yMiIKKworCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19EYXRhSW50ZXJjaGFuZ2VGaWxlX19BbHRlcm5hdGl2ZXMiCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjcyNzoxOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VGaWxlX19BbHRlcm5hdGl2ZXMgOiAoICggcnVsZURhdGFJbnRlcmNoYW5nZUZpbGVYTUwgKSB8ICggcnVsZURhdGFJbnRlcmNoYW5nZUZpbGVDU1YgKSB8ICggcnVsZURhdGFJbnRlcmNoYW5nZUZpbGVFREkgKSApOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI4NTk6MTogcnVsZV9fRGF0YUludGVyY2hhbmdlRmlsZV9fQWx0ZXJuYXRpdmVzIDogKCAoIHJ1bGVEYXRhSW50ZXJjaGFuZ2VGaWxlWE1MICkgfCAoIHJ1bGVEYXRhSW50ZXJjaGFuZ2VGaWxlQ1NWICkgfCAoIHJ1bGVEYXRhSW50ZXJjaGFuZ2VGaWxlRURJICkgKTsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19EYXRhSW50ZXJjaGFuZ2VGaWxlX19BbHRlcm5hdGl2ZXMoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjczMToxOiAoICggcnVsZURhdGFJbnRlcmNoYW5nZUZpbGVYTUwgKSB8ICggcnVsZURhdGFJbnRlcmNoYW5nZUZpbGVDU1YgKSB8ICggcnVsZURhdGFJbnRlcmNoYW5nZUZpbGVFREkgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyODYzOjE6ICggKCBydWxlRGF0YUludGVyY2hhbmdlRmlsZVhNTCApIHwgKCBydWxlRGF0YUludGVyY2hhbmdlRmlsZUNTViApIHwgKCBydWxlRGF0YUludGVyY2hhbmdlRmlsZUVESSApICkKICAgICAgICAgICAgIGludCBhbHQzPTM7CiAgICAgICAgICAgICBzd2l0Y2ggKCBpbnB1dC5MQSgxKSApIHsKLSAgICAgICAgICAgIGNhc2UgNzc6CisgICAgICAgICAgICBjYXNlIDgyOgogICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICBhbHQzPTE7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSA4MDoKKyAgICAgICAgICAgIGNhc2UgODU6CiAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIGFsdDM9MjsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIDg0OgorICAgICAgICAgICAgY2FzZSA4OToKICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgYWx0Mz0zOwogICAgICAgICAgICAgICAgIH0KQEAgLTkyNjQsMTAgKzk3MjAsMTAgQEAKIAogICAgICAgICAgICAgc3dpdGNoIChhbHQzKSB7CiAgICAgICAgICAgICAgICAgY2FzZSAxIDoKLSAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjczMjoyOiAoIHJ1bGVEYXRhSW50ZXJjaGFuZ2VGaWxlWE1MICkKKyAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6Mjg2NDoyOiAoIHJ1bGVEYXRhSW50ZXJjaGFuZ2VGaWxlWE1MICkKICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNzMyOjI6ICggcnVsZURhdGFJbnRlcmNoYW5nZUZpbGVYTUwgKQotICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNzMzOjM6IHJ1bGVEYXRhSW50ZXJjaGFuZ2VGaWxlWE1MCisgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI4NjQ6MjogKCBydWxlRGF0YUludGVyY2hhbmdlRmlsZVhNTCApCisgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI4NjU6MzogcnVsZURhdGFJbnRlcmNoYW5nZUZpbGVYTUwKICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YUludGVyY2hhbmdlRmlsZUFjY2VzcygpLmdldERhdGFJbnRlcmNoYW5nZUZpbGVYTUxQYXJzZXJSdWxlQ2FsbF8wKCkpOyAKQEAgLTkyODcsMTAgKzk3NDMsMTAgQEAKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICBjYXNlIDIgOgotICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNzM4OjI6ICggcnVsZURhdGFJbnRlcmNoYW5nZUZpbGVDU1YgKQorICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyODcwOjI6ICggcnVsZURhdGFJbnRlcmNoYW5nZUZpbGVDU1YgKQogICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI3Mzg6MjogKCBydWxlRGF0YUludGVyY2hhbmdlRmlsZUNTViApCi0gICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI3Mzk6MzogcnVsZURhdGFJbnRlcmNoYW5nZUZpbGVDU1YKKyAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6Mjg3MDoyOiAoIHJ1bGVEYXRhSW50ZXJjaGFuZ2VGaWxlQ1NWICkKKyAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6Mjg3MTozOiBydWxlRGF0YUludGVyY2hhbmdlRmlsZUNTVgogICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXREYXRhSW50ZXJjaGFuZ2VGaWxlQWNjZXNzKCkuZ2V0RGF0YUludGVyY2hhbmdlRmlsZUNTVlBhcnNlclJ1bGVDYWxsXzEoKSk7IApAQCAtOTMxMCwxMCArOTc2NiwxMCBAQAogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgIGNhc2UgMyA6Ci0gICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI3NDQ6MjogKCBydWxlRGF0YUludGVyY2hhbmdlRmlsZUVESSApCisgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI4NzY6MjogKCBydWxlRGF0YUludGVyY2hhbmdlRmlsZUVESSApCiAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6Mjc0NDoyOiAoIHJ1bGVEYXRhSW50ZXJjaGFuZ2VGaWxlRURJICkKLSAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6Mjc0NTozOiBydWxlRGF0YUludGVyY2hhbmdlRmlsZUVESQorICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyODc2OjI6ICggcnVsZURhdGFJbnRlcmNoYW5nZUZpbGVFREkgKQorICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyODc3OjM6IHJ1bGVEYXRhSW50ZXJjaGFuZ2VGaWxlRURJCiAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldERhdGFJbnRlcmNoYW5nZUZpbGVBY2Nlc3MoKS5nZXREYXRhSW50ZXJjaGFuZ2VGaWxlRURJUGFyc2VyUnVsZUNhbGxfMigpKTsgCkBAIC05MzUwLDIwICs5ODA2LDIwIEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fRGF0YUludGVyY2hhbmdlRXhwcmVzc2lvbl9fQWx0ZXJuYXRpdmVzIgotICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI3NTQ6MTogcnVsZV9fRGF0YUludGVyY2hhbmdlRXhwcmVzc2lvbl9fQWx0ZXJuYXRpdmVzIDogKCAoIHJ1bGVEYXRhSW50ZXJjaGFuZ2VFbnRpdHlFeHByZXNzaW9uICkgfCAoIHJ1bGVEYXRhSW50ZXJjaGFuZ2VQcmVkZWZpbmVkRXhwcmVzc2lvbiApICk7CisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6Mjg4NjoxOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VFeHByZXNzaW9uX19BbHRlcm5hdGl2ZXMgOiAoICggcnVsZURhdGFJbnRlcmNoYW5nZUVudGl0eUV4cHJlc3Npb24gKSB8ICggcnVsZURhdGFJbnRlcmNoYW5nZVByZWRlZmluZWRFeHByZXNzaW9uICkgKTsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19EYXRhSW50ZXJjaGFuZ2VFeHByZXNzaW9uX19BbHRlcm5hdGl2ZXMoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6Mjc1ODoxOiAoICggcnVsZURhdGFJbnRlcmNoYW5nZUVudGl0eUV4cHJlc3Npb24gKSB8ICggcnVsZURhdGFJbnRlcmNoYW5nZVByZWRlZmluZWRFeHByZXNzaW9uICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6Mjg5MDoxOiAoICggcnVsZURhdGFJbnRlcmNoYW5nZUVudGl0eUV4cHJlc3Npb24gKSB8ICggcnVsZURhdGFJbnRlcmNoYW5nZVByZWRlZmluZWRFeHByZXNzaW9uICkgKQogICAgICAgICAgICAgaW50IGFsdDQ9MjsKICAgICAgICAgICAgIGludCBMQTRfMCA9IGlucHV0LkxBKDEpOwogCi0gICAgICAgICAgICBpZiAoIChMQTRfMD09MTAyKSApIHsKKyAgICAgICAgICAgIGlmICggKExBNF8wPT0xMDkpICkgewogICAgICAgICAgICAgICAgIGFsdDQ9MTsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgaWYgKCAoTEE0XzA9PTEwNSkgKSB7CisgICAgICAgICAgICBlbHNlIGlmICggKExBNF8wPT0xMTUpICkgewogICAgICAgICAgICAgICAgIGFsdDQ9MjsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGVsc2UgewpAQCAtOTM3NSwxMCArOTgzMSwxMCBAQAogICAgICAgICAgICAgfQogICAgICAgICAgICAgc3dpdGNoIChhbHQ0KSB7CiAgICAgICAgICAgICAgICAgY2FzZSAxIDoKLSAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6Mjc1OToyOiAoIHJ1bGVEYXRhSW50ZXJjaGFuZ2VFbnRpdHlFeHByZXNzaW9uICkKKyAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6Mjg5MToyOiAoIHJ1bGVEYXRhSW50ZXJjaGFuZ2VFbnRpdHlFeHByZXNzaW9uICkKICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNzU5OjI6ICggcnVsZURhdGFJbnRlcmNoYW5nZUVudGl0eUV4cHJlc3Npb24gKQotICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNzYwOjM6IHJ1bGVEYXRhSW50ZXJjaGFuZ2VFbnRpdHlFeHByZXNzaW9uCisgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI4OTE6MjogKCBydWxlRGF0YUludGVyY2hhbmdlRW50aXR5RXhwcmVzc2lvbiApCisgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI4OTI6MzogcnVsZURhdGFJbnRlcmNoYW5nZUVudGl0eUV4cHJlc3Npb24KICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YUludGVyY2hhbmdlRXhwcmVzc2lvbkFjY2VzcygpLmdldERhdGFJbnRlcmNoYW5nZUVudGl0eUV4cHJlc3Npb25QYXJzZXJSdWxlQ2FsbF8wKCkpOyAKQEAgLTkzOTgsMTAgKzk4NTQsMTAgQEAKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICBjYXNlIDIgOgotICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNzY1OjI6ICggcnVsZURhdGFJbnRlcmNoYW5nZVByZWRlZmluZWRFeHByZXNzaW9uICkKKyAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6Mjg5NzoyOiAoIHJ1bGVEYXRhSW50ZXJjaGFuZ2VQcmVkZWZpbmVkRXhwcmVzc2lvbiApCiAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6Mjc2NToyOiAoIHJ1bGVEYXRhSW50ZXJjaGFuZ2VQcmVkZWZpbmVkRXhwcmVzc2lvbiApCi0gICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI3NjY6MzogcnVsZURhdGFJbnRlcmNoYW5nZVByZWRlZmluZWRFeHByZXNzaW9uCisgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI4OTc6MjogKCBydWxlRGF0YUludGVyY2hhbmdlUHJlZGVmaW5lZEV4cHJlc3Npb24gKQorICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyODk4OjM6IHJ1bGVEYXRhSW50ZXJjaGFuZ2VQcmVkZWZpbmVkRXhwcmVzc2lvbgogICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXREYXRhSW50ZXJjaGFuZ2VFeHByZXNzaW9uQWNjZXNzKCkuZ2V0RGF0YUludGVyY2hhbmdlUHJlZGVmaW5lZEV4cHJlc3Npb25QYXJzZXJSdWxlQ2FsbF8xKCkpOyAKQEAgLTk0MzcsMjEgKzk4OTMsMjEgQEAKICAgICAvLyAkQU5UTFIgZW5kICJydWxlX19EYXRhSW50ZXJjaGFuZ2VFeHByZXNzaW9uX19BbHRlcm5hdGl2ZXMiCiAKIAotICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fRGF0YUludGVyY2hhbmdlTWFwcGluZ19fQWx0ZXJuYXRpdmVzIgotICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI3NzU6MTogcnVsZV9fRGF0YUludGVyY2hhbmdlTWFwcGluZ19fQWx0ZXJuYXRpdmVzIDogKCAoIHJ1bGVEYXRhSW50ZXJjaGFuZ2VWYWx1ZU1hcHBpbmcgKSB8ICggcnVsZURhdGFJbnRlcmNoYW5nZUJsb2JNYXBwaW5nICkgKTsKLSAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19EYXRhSW50ZXJjaGFuZ2VNYXBwaW5nX19BbHRlcm5hdGl2ZXMoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fRGF0YUludGVyY2hhbmdlRXhwb3NlX19BbHRlcm5hdGl2ZXNfMyIKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyOTA3OjE6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUV4cG9zZV9fQWx0ZXJuYXRpdmVzXzMgOiAoICggKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VFeHBvc2VfX0dyb3VwXzNfMF9fMCApICkgfCAoICggcnVsZV9fRGF0YUludGVyY2hhbmdlRXhwb3NlX19Hcm91cF8zXzFfXzAgKSApICk7CisgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fRGF0YUludGVyY2hhbmdlRXhwb3NlX19BbHRlcm5hdGl2ZXNfMygpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNzc5OjE6ICggKCBydWxlRGF0YUludGVyY2hhbmdlVmFsdWVNYXBwaW5nICkgfCAoIHJ1bGVEYXRhSW50ZXJjaGFuZ2VCbG9iTWFwcGluZyApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI5MTE6MTogKCAoICggcnVsZV9fRGF0YUludGVyY2hhbmdlRXhwb3NlX19Hcm91cF8zXzBfXzAgKSApIHwgKCAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUV4cG9zZV9fR3JvdXBfM18xX18wICkgKSApCiAgICAgICAgICAgICBpbnQgYWx0NT0yOwogICAgICAgICAgICAgaW50IExBNV8wID0gaW5wdXQuTEEoMSk7CiAKLSAgICAgICAgICAgIGlmICggKExBNV8wPT0xMDcpICkgeworICAgICAgICAgICAgaWYgKCAoTEE1XzA9PTEwMykgKSB7CiAgICAgICAgICAgICAgICAgYWx0NT0xOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSBpZiAoIChMQTVfMD09MTA5KSApIHsKKyAgICAgICAgICAgIGVsc2UgaWYgKCAoTEE1XzA9PTk3KSApIHsKICAgICAgICAgICAgICAgICBhbHQ1PTI7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBlbHNlIHsKQEAgLTk0NjMsMTAgKzk5MTksMTEwIEBACiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBzd2l0Y2ggKGFsdDUpIHsKICAgICAgICAgICAgICAgICBjYXNlIDEgOgotICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNzgwOjI6ICggcnVsZURhdGFJbnRlcmNoYW5nZVZhbHVlTWFwcGluZyApCisgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI5MTI6MjogKCAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUV4cG9zZV9fR3JvdXBfM18wX18wICkgKQogICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI3ODA6MjogKCBydWxlRGF0YUludGVyY2hhbmdlVmFsdWVNYXBwaW5nICkKLSAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6Mjc4MTozOiBydWxlRGF0YUludGVyY2hhbmdlVmFsdWVNYXBwaW5nCisgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI5MTI6MjogKCAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUV4cG9zZV9fR3JvdXBfM18wX18wICkgKQorICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyOTEzOjM6ICggcnVsZV9fRGF0YUludGVyY2hhbmdlRXhwb3NlX19Hcm91cF8zXzBfXzAgKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXREYXRhSW50ZXJjaGFuZ2VFeHBvc2VBY2Nlc3MoKS5nZXRHcm91cF8zXzAoKSk7IAorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI5MTQ6MzogKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VFeHBvc2VfX0dyb3VwXzNfMF9fMCApCisgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI5MTQ6NDogcnVsZV9fRGF0YUludGVyY2hhbmdlRXhwb3NlX19Hcm91cF8zXzBfXzAKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV18yKTsKKyAgICAgICAgICAgICAgICAgICAgcnVsZV9fRGF0YUludGVyY2hhbmdlRXhwb3NlX19Hcm91cF8zXzBfXzAoKTsKKworICAgICAgICAgICAgICAgICAgICBzdGF0ZS5fZnNwLS07CisgICAgICAgICAgICAgICAgICAgIGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CisKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgICAgICAgICBhZnRlcihncmFtbWFyQWNjZXNzLmdldERhdGFJbnRlcmNoYW5nZUV4cG9zZUFjY2VzcygpLmdldEdyb3VwXzNfMCgpKTsgCisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgMiA6CisgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI5MTg6MjogKCAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUV4cG9zZV9fR3JvdXBfM18xX18wICkgKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI5MTg6MjogKCAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUV4cG9zZV9fR3JvdXBfM18xX18wICkgKQorICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyOTE5OjM6ICggcnVsZV9fRGF0YUludGVyY2hhbmdlRXhwb3NlX19Hcm91cF8zXzFfXzAgKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXREYXRhSW50ZXJjaGFuZ2VFeHBvc2VBY2Nlc3MoKS5nZXRHcm91cF8zXzEoKSk7IAorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI5MjA6MzogKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VFeHBvc2VfX0dyb3VwXzNfMV9fMCApCisgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI5MjA6NDogcnVsZV9fRGF0YUludGVyY2hhbmdlRXhwb3NlX19Hcm91cF8zXzFfXzAKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV18yKTsKKyAgICAgICAgICAgICAgICAgICAgcnVsZV9fRGF0YUludGVyY2hhbmdlRXhwb3NlX19Hcm91cF8zXzFfXzAoKTsKKworICAgICAgICAgICAgICAgICAgICBzdGF0ZS5fZnNwLS07CisgICAgICAgICAgICAgICAgICAgIGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CisKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgICAgICAgICBhZnRlcihncmFtbWFyQWNjZXNzLmdldERhdGFJbnRlcmNoYW5nZUV4cG9zZUFjY2VzcygpLmdldEdyb3VwXzNfMSgpKTsgCisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKFJlY29nbml0aW9uRXhjZXB0aW9uIHJlKSB7CisgICAgICAgICAgICByZXBvcnRFcnJvcihyZSk7CisgICAgICAgICAgICByZWNvdmVyKGlucHV0LHJlKTsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKworICAgICAgICAgICAgCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKKworICAgICAgICB9CisgICAgICAgIHJldHVybiA7CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgInJ1bGVfX0RhdGFJbnRlcmNoYW5nZUV4cG9zZV9fQWx0ZXJuYXRpdmVzXzMiCisKKworICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fRGF0YUludGVyY2hhbmdlTWFwcGluZ19fQWx0ZXJuYXRpdmVzIgorICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI5Mjg6MTogcnVsZV9fRGF0YUludGVyY2hhbmdlTWFwcGluZ19fQWx0ZXJuYXRpdmVzIDogKCAoIHJ1bGVEYXRhSW50ZXJjaGFuZ2VWYWx1ZU1hcHBpbmcgKSB8ICggcnVsZURhdGFJbnRlcmNoYW5nZUJsb2JNYXBwaW5nICkgKTsKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19EYXRhSW50ZXJjaGFuZ2VNYXBwaW5nX19BbHRlcm5hdGl2ZXMoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworCisgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICAgICAgCQorICAgICAgICB0cnkgeworICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjkzMjoxOiAoICggcnVsZURhdGFJbnRlcmNoYW5nZVZhbHVlTWFwcGluZyApIHwgKCBydWxlRGF0YUludGVyY2hhbmdlQmxvYk1hcHBpbmcgKSApCisgICAgICAgICAgICBpbnQgYWx0Nj0yOworICAgICAgICAgICAgaW50IExBNl8wID0gaW5wdXQuTEEoMSk7CisKKyAgICAgICAgICAgIGlmICggKExBNl8wPT0xMTcpICkgeworICAgICAgICAgICAgICAgIGFsdDY9MTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYgKCAoTEE2XzA9PTExOSkgKSB7CisgICAgICAgICAgICAgICAgYWx0Nj0yOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgaWYgKHN0YXRlLmJhY2t0cmFja2luZz4wKSB7c3RhdGUuZmFpbGVkPXRydWU7IHJldHVybiA7fQorICAgICAgICAgICAgICAgIE5vVmlhYmxlQWx0RXhjZXB0aW9uIG52YWUgPQorICAgICAgICAgICAgICAgICAgICBuZXcgTm9WaWFibGVBbHRFeGNlcHRpb24oIiIsIDYsIDAsIGlucHV0KTsKKworICAgICAgICAgICAgICAgIHRocm93IG52YWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzd2l0Y2ggKGFsdDYpIHsKKyAgICAgICAgICAgICAgICBjYXNlIDEgOgorICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyOTMzOjI6ICggcnVsZURhdGFJbnRlcmNoYW5nZVZhbHVlTWFwcGluZyApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjkzMzoyOiAoIHJ1bGVEYXRhSW50ZXJjaGFuZ2VWYWx1ZU1hcHBpbmcgKQorICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyOTM0OjM6IHJ1bGVEYXRhSW50ZXJjaGFuZ2VWYWx1ZU1hcHBpbmcKICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YUludGVyY2hhbmdlTWFwcGluZ0FjY2VzcygpLmdldERhdGFJbnRlcmNoYW5nZVZhbHVlTWFwcGluZ1BhcnNlclJ1bGVDYWxsXzAoKSk7IApAQCAtOTQ4NiwxMCArMTAwNDIsMTAgQEAKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICBjYXNlIDIgOgotICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNzg2OjI6ICggcnVsZURhdGFJbnRlcmNoYW5nZUJsb2JNYXBwaW5nICkKKyAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjkzOToyOiAoIHJ1bGVEYXRhSW50ZXJjaGFuZ2VCbG9iTWFwcGluZyApCiAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6Mjc4NjoyOiAoIHJ1bGVEYXRhSW50ZXJjaGFuZ2VCbG9iTWFwcGluZyApCi0gICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI3ODc6MzogcnVsZURhdGFJbnRlcmNoYW5nZUJsb2JNYXBwaW5nCisgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI5Mzk6MjogKCBydWxlRGF0YUludGVyY2hhbmdlQmxvYk1hcHBpbmcgKQorICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyOTQwOjM6IHJ1bGVEYXRhSW50ZXJjaGFuZ2VCbG9iTWFwcGluZwogICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXREYXRhSW50ZXJjaGFuZ2VNYXBwaW5nQWNjZXNzKCkuZ2V0RGF0YUludGVyY2hhbmdlQmxvYk1hcHBpbmdQYXJzZXJSdWxlQ2FsbF8xKCkpOyAKQEAgLTk1MjYsMjcgKzEwMDgyLDI3IEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fWEltcG9ydERlY2xhcmF0aW9uX19BbHRlcm5hdGl2ZXNfMiIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNzk2OjE6IHJ1bGVfX1hJbXBvcnREZWNsYXJhdGlvbl9fQWx0ZXJuYXRpdmVzXzIgOiAoICggKCBydWxlX19YSW1wb3J0RGVjbGFyYXRpb25fX0dyb3VwXzJfMF9fMCApICkgfCAoICggcnVsZV9fWEltcG9ydERlY2xhcmF0aW9uX19JbXBvcnRlZFR5cGVBc3NpZ25tZW50XzJfMSApICkgfCAoICggcnVsZV9fWEltcG9ydERlY2xhcmF0aW9uX19JbXBvcnRlZE5hbWVzcGFjZUFzc2lnbm1lbnRfMl8yICkgKSB8ICggKCBydWxlX19YSW1wb3J0RGVjbGFyYXRpb25fX0dyb3VwXzJfM19fMCApICkgKTsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyOTQ5OjE6IHJ1bGVfX1hJbXBvcnREZWNsYXJhdGlvbl9fQWx0ZXJuYXRpdmVzXzIgOiAoICggKCBydWxlX19YSW1wb3J0RGVjbGFyYXRpb25fX0dyb3VwXzJfMF9fMCApICkgfCAoICggcnVsZV9fWEltcG9ydERlY2xhcmF0aW9uX19JbXBvcnRlZFR5cGVBc3NpZ25tZW50XzJfMSApICkgfCAoICggcnVsZV9fWEltcG9ydERlY2xhcmF0aW9uX19JbXBvcnRlZE5hbWVzcGFjZUFzc2lnbm1lbnRfMl8yICkgKSB8ICggKCBydWxlX19YSW1wb3J0RGVjbGFyYXRpb25fX0dyb3VwXzJfM19fMCApICkgKTsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YSW1wb3J0RGVjbGFyYXRpb25fX0FsdGVybmF0aXZlc18yKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI4MDA6MTogKCAoICggcnVsZV9fWEltcG9ydERlY2xhcmF0aW9uX19Hcm91cF8yXzBfXzAgKSApIHwgKCAoIHJ1bGVfX1hJbXBvcnREZWNsYXJhdGlvbl9fSW1wb3J0ZWRUeXBlQXNzaWdubWVudF8yXzEgKSApIHwgKCAoIHJ1bGVfX1hJbXBvcnREZWNsYXJhdGlvbl9fSW1wb3J0ZWROYW1lc3BhY2VBc3NpZ25tZW50XzJfMiApICkgfCAoICggcnVsZV9fWEltcG9ydERlY2xhcmF0aW9uX19Hcm91cF8yXzNfXzAgKSApICkKLSAgICAgICAgICAgIGludCBhbHQ2PTQ7Ci0gICAgICAgICAgICBhbHQ2ID0gZGZhNi5wcmVkaWN0KGlucHV0KTsKLSAgICAgICAgICAgIHN3aXRjaCAoYWx0NikgeworICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6Mjk1MzoxOiAoICggKCBydWxlX19YSW1wb3J0RGVjbGFyYXRpb25fX0dyb3VwXzJfMF9fMCApICkgfCAoICggcnVsZV9fWEltcG9ydERlY2xhcmF0aW9uX19JbXBvcnRlZFR5cGVBc3NpZ25tZW50XzJfMSApICkgfCAoICggcnVsZV9fWEltcG9ydERlY2xhcmF0aW9uX19JbXBvcnRlZE5hbWVzcGFjZUFzc2lnbm1lbnRfMl8yICkgKSB8ICggKCBydWxlX19YSW1wb3J0RGVjbGFyYXRpb25fX0dyb3VwXzJfM19fMCApICkgKQorICAgICAgICAgICAgaW50IGFsdDc9NDsKKyAgICAgICAgICAgIGFsdDcgPSBkZmE3LnByZWRpY3QoaW5wdXQpOworICAgICAgICAgICAgc3dpdGNoIChhbHQ3KSB7CiAgICAgICAgICAgICAgICAgY2FzZSAxIDoKLSAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjgwMToyOiAoICggcnVsZV9fWEltcG9ydERlY2xhcmF0aW9uX19Hcm91cF8yXzBfXzAgKSApCisgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI5NTQ6MjogKCAoIHJ1bGVfX1hJbXBvcnREZWNsYXJhdGlvbl9fR3JvdXBfMl8wX18wICkgKQogICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI4MDE6MjogKCAoIHJ1bGVfX1hJbXBvcnREZWNsYXJhdGlvbl9fR3JvdXBfMl8wX18wICkgKQotICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyODAyOjM6ICggcnVsZV9fWEltcG9ydERlY2xhcmF0aW9uX19Hcm91cF8yXzBfXzAgKQorICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyOTU0OjI6ICggKCBydWxlX19YSW1wb3J0RGVjbGFyYXRpb25fX0dyb3VwXzJfMF9fMCApICkKKyAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6Mjk1NTozOiAoIHJ1bGVfX1hJbXBvcnREZWNsYXJhdGlvbl9fR3JvdXBfMl8wX18wICkKICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WEltcG9ydERlY2xhcmF0aW9uQWNjZXNzKCkuZ2V0R3JvdXBfMl8wKCkpOyAKICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyODAzOjM6ICggcnVsZV9fWEltcG9ydERlY2xhcmF0aW9uX19Hcm91cF8yXzBfXzAgKQotICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyODAzOjQ6IHJ1bGVfX1hJbXBvcnREZWNsYXJhdGlvbl9fR3JvdXBfMl8wX18wCisgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI5NTY6MzogKCBydWxlX19YSW1wb3J0RGVjbGFyYXRpb25fX0dyb3VwXzJfMF9fMCApCisgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI5NTY6NDogcnVsZV9fWEltcG9ydERlY2xhcmF0aW9uX19Hcm91cF8yXzBfXzAKICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV18yKTsKICAgICAgICAgICAgICAgICAgICAgcnVsZV9fWEltcG9ydERlY2xhcmF0aW9uX19Hcm91cF8yXzBfXzAoKTsKQEAgLTk1NjYsMTYgKzEwMTIyLDE2IEBACiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgY2FzZSAyIDoKLSAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjgwNzoyOiAoICggcnVsZV9fWEltcG9ydERlY2xhcmF0aW9uX19JbXBvcnRlZFR5cGVBc3NpZ25tZW50XzJfMSApICkKKyAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6Mjk2MDoyOiAoICggcnVsZV9fWEltcG9ydERlY2xhcmF0aW9uX19JbXBvcnRlZFR5cGVBc3NpZ25tZW50XzJfMSApICkKICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyODA3OjI6ICggKCBydWxlX19YSW1wb3J0RGVjbGFyYXRpb25fX0ltcG9ydGVkVHlwZUFzc2lnbm1lbnRfMl8xICkgKQotICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyODA4OjM6ICggcnVsZV9fWEltcG9ydERlY2xhcmF0aW9uX19JbXBvcnRlZFR5cGVBc3NpZ25tZW50XzJfMSApCisgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI5NjA6MjogKCAoIHJ1bGVfX1hJbXBvcnREZWNsYXJhdGlvbl9fSW1wb3J0ZWRUeXBlQXNzaWdubWVudF8yXzEgKSApCisgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI5NjE6MzogKCBydWxlX19YSW1wb3J0RGVjbGFyYXRpb25fX0ltcG9ydGVkVHlwZUFzc2lnbm1lbnRfMl8xICkKICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WEltcG9ydERlY2xhcmF0aW9uQWNjZXNzKCkuZ2V0SW1wb3J0ZWRUeXBlQXNzaWdubWVudF8yXzEoKSk7IAogICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI4MDk6MzogKCBydWxlX19YSW1wb3J0RGVjbGFyYXRpb25fX0ltcG9ydGVkVHlwZUFzc2lnbm1lbnRfMl8xICkKLSAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjgwOTo0OiBydWxlX19YSW1wb3J0RGVjbGFyYXRpb25fX0ltcG9ydGVkVHlwZUFzc2lnbm1lbnRfMl8xCisgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI5NjI6MzogKCBydWxlX19YSW1wb3J0RGVjbGFyYXRpb25fX0ltcG9ydGVkVHlwZUFzc2lnbm1lbnRfMl8xICkKKyAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6Mjk2Mjo0OiBydWxlX19YSW1wb3J0RGVjbGFyYXRpb25fX0ltcG9ydGVkVHlwZUFzc2lnbm1lbnRfMl8xCiAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMik7CiAgICAgICAgICAgICAgICAgICAgIHJ1bGVfX1hJbXBvcnREZWNsYXJhdGlvbl9fSW1wb3J0ZWRUeXBlQXNzaWdubWVudF8yXzEoKTsKQEAgLTk1OTUsMTYgKzEwMTUxLDE2IEBACiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgY2FzZSAzIDoKLSAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjgxMzoyOiAoICggcnVsZV9fWEltcG9ydERlY2xhcmF0aW9uX19JbXBvcnRlZE5hbWVzcGFjZUFzc2lnbm1lbnRfMl8yICkgKQorICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyOTY2OjI6ICggKCBydWxlX19YSW1wb3J0RGVjbGFyYXRpb25fX0ltcG9ydGVkTmFtZXNwYWNlQXNzaWdubWVudF8yXzIgKSApCiAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjgxMzoyOiAoICggcnVsZV9fWEltcG9ydERlY2xhcmF0aW9uX19JbXBvcnRlZE5hbWVzcGFjZUFzc2lnbm1lbnRfMl8yICkgKQotICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyODE0OjM6ICggcnVsZV9fWEltcG9ydERlY2xhcmF0aW9uX19JbXBvcnRlZE5hbWVzcGFjZUFzc2lnbm1lbnRfMl8yICkKKyAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6Mjk2NjoyOiAoICggcnVsZV9fWEltcG9ydERlY2xhcmF0aW9uX19JbXBvcnRlZE5hbWVzcGFjZUFzc2lnbm1lbnRfMl8yICkgKQorICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyOTY3OjM6ICggcnVsZV9fWEltcG9ydERlY2xhcmF0aW9uX19JbXBvcnRlZE5hbWVzcGFjZUFzc2lnbm1lbnRfMl8yICkKICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WEltcG9ydERlY2xhcmF0aW9uQWNjZXNzKCkuZ2V0SW1wb3J0ZWROYW1lc3BhY2VBc3NpZ25tZW50XzJfMigpKTsgCiAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjgxNTozOiAoIHJ1bGVfX1hJbXBvcnREZWNsYXJhdGlvbl9fSW1wb3J0ZWROYW1lc3BhY2VBc3NpZ25tZW50XzJfMiApCi0gICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI4MTU6NDogcnVsZV9fWEltcG9ydERlY2xhcmF0aW9uX19JbXBvcnRlZE5hbWVzcGFjZUFzc2lnbm1lbnRfMl8yCisgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI5Njg6MzogKCBydWxlX19YSW1wb3J0RGVjbGFyYXRpb25fX0ltcG9ydGVkTmFtZXNwYWNlQXNzaWdubWVudF8yXzIgKQorICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyOTY4OjQ6IHJ1bGVfX1hJbXBvcnREZWNsYXJhdGlvbl9fSW1wb3J0ZWROYW1lc3BhY2VBc3NpZ25tZW50XzJfMgogICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzIpOwogICAgICAgICAgICAgICAgICAgICBydWxlX19YSW1wb3J0RGVjbGFyYXRpb25fX0ltcG9ydGVkTmFtZXNwYWNlQXNzaWdubWVudF8yXzIoKTsKQEAgLTk2MjQsMTYgKzEwMTgwLDE2IEBACiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgY2FzZSA0IDoKLSAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjgxOToyOiAoICggcnVsZV9fWEltcG9ydERlY2xhcmF0aW9uX19Hcm91cF8yXzNfXzAgKSApCisgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI5NzI6MjogKCAoIHJ1bGVfX1hJbXBvcnREZWNsYXJhdGlvbl9fR3JvdXBfMl8zX18wICkgKQogICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI4MTk6MjogKCAoIHJ1bGVfX1hJbXBvcnREZWNsYXJhdGlvbl9fR3JvdXBfMl8zX18wICkgKQotICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyODIwOjM6ICggcnVsZV9fWEltcG9ydERlY2xhcmF0aW9uX19Hcm91cF8yXzNfXzAgKQorICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyOTcyOjI6ICggKCBydWxlX19YSW1wb3J0RGVjbGFyYXRpb25fX0dyb3VwXzJfM19fMCApICkKKyAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6Mjk3MzozOiAoIHJ1bGVfX1hJbXBvcnREZWNsYXJhdGlvbl9fR3JvdXBfMl8zX18wICkKICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WEltcG9ydERlY2xhcmF0aW9uQWNjZXNzKCkuZ2V0R3JvdXBfMl8zKCkpOyAKICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyODIxOjM6ICggcnVsZV9fWEltcG9ydERlY2xhcmF0aW9uX19Hcm91cF8yXzNfXzAgKQotICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyODIxOjQ6IHJ1bGVfX1hJbXBvcnREZWNsYXJhdGlvbl9fR3JvdXBfMl8zX18wCisgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI5NzQ6MzogKCBydWxlX19YSW1wb3J0RGVjbGFyYXRpb25fX0dyb3VwXzJfM19fMCApCisgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI5NzQ6NDogcnVsZV9fWEltcG9ydERlY2xhcmF0aW9uX19Hcm91cF8yXzNfXzAKICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV18yKTsKICAgICAgICAgICAgICAgICAgICAgcnVsZV9fWEltcG9ydERlY2xhcmF0aW9uX19Hcm91cF8yXzNfXzAoKTsKQEAgLTk2NzAsNDEgKzEwMjI2LDQxIEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fWEltcG9ydERlY2xhcmF0aW9uX19BbHRlcm5hdGl2ZXNfMl8wXzMiCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjgyOToxOiBydWxlX19YSW1wb3J0RGVjbGFyYXRpb25fX0FsdGVybmF0aXZlc18yXzBfMyA6ICggKCAoIHJ1bGVfX1hJbXBvcnREZWNsYXJhdGlvbl9fV2lsZGNhcmRBc3NpZ25tZW50XzJfMF8zXzAgKSApIHwgKCAoIHJ1bGVfX1hJbXBvcnREZWNsYXJhdGlvbl9fTWVtYmVyTmFtZUFzc2lnbm1lbnRfMl8wXzNfMSApICkgKTsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyOTgyOjE6IHJ1bGVfX1hJbXBvcnREZWNsYXJhdGlvbl9fQWx0ZXJuYXRpdmVzXzJfMF8zIDogKCAoICggcnVsZV9fWEltcG9ydERlY2xhcmF0aW9uX19XaWxkY2FyZEFzc2lnbm1lbnRfMl8wXzNfMCApICkgfCAoICggcnVsZV9fWEltcG9ydERlY2xhcmF0aW9uX19NZW1iZXJOYW1lQXNzaWdubWVudF8yXzBfM18xICkgKSApOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1hJbXBvcnREZWNsYXJhdGlvbl9fQWx0ZXJuYXRpdmVzXzJfMF8zKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI4MzM6MTogKCAoICggcnVsZV9fWEltcG9ydERlY2xhcmF0aW9uX19XaWxkY2FyZEFzc2lnbm1lbnRfMl8wXzNfMCApICkgfCAoICggcnVsZV9fWEltcG9ydERlY2xhcmF0aW9uX19NZW1iZXJOYW1lQXNzaWdubWVudF8yXzBfM18xICkgKSApCi0gICAgICAgICAgICBpbnQgYWx0Nz0yOwotICAgICAgICAgICAgaW50IExBN18wID0gaW5wdXQuTEEoMSk7CisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyOTg2OjE6ICggKCAoIHJ1bGVfX1hJbXBvcnREZWNsYXJhdGlvbl9fV2lsZGNhcmRBc3NpZ25tZW50XzJfMF8zXzAgKSApIHwgKCAoIHJ1bGVfX1hJbXBvcnREZWNsYXJhdGlvbl9fTWVtYmVyTmFtZUFzc2lnbm1lbnRfMl8wXzNfMSApICkgKQorICAgICAgICAgICAgaW50IGFsdDg9MjsKKyAgICAgICAgICAgIGludCBMQThfMCA9IGlucHV0LkxBKDEpOwogCi0gICAgICAgICAgICBpZiAoIChMQTdfMD09MzYpICkgewotICAgICAgICAgICAgICAgIGFsdDc9MTsKKyAgICAgICAgICAgIGlmICggKExBOF8wPT0zNikgKSB7CisgICAgICAgICAgICAgICAgYWx0OD0xOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSBpZiAoIChMQTdfMD09UlVMRV9JRCkgKSB7Ci0gICAgICAgICAgICAgICAgYWx0Nz0yOworICAgICAgICAgICAgZWxzZSBpZiAoIChMQThfMD09UlVMRV9JRCkgKSB7CisgICAgICAgICAgICAgICAgYWx0OD0yOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgaWYgKHN0YXRlLmJhY2t0cmFja2luZz4wKSB7c3RhdGUuZmFpbGVkPXRydWU7IHJldHVybiA7fQogICAgICAgICAgICAgICAgIE5vVmlhYmxlQWx0RXhjZXB0aW9uIG52YWUgPQotICAgICAgICAgICAgICAgICAgICBuZXcgTm9WaWFibGVBbHRFeGNlcHRpb24oIiIsIDcsIDAsIGlucHV0KTsKKyAgICAgICAgICAgICAgICAgICAgbmV3IE5vVmlhYmxlQWx0RXhjZXB0aW9uKCIiLCA4LCAwLCBpbnB1dCk7CiAKICAgICAgICAgICAgICAgICB0aHJvdyBudmFlOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgc3dpdGNoIChhbHQ3KSB7CisgICAgICAgICAgICBzd2l0Y2ggKGFsdDgpIHsKICAgICAgICAgICAgICAgICBjYXNlIDEgOgotICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyODM0OjI6ICggKCBydWxlX19YSW1wb3J0RGVjbGFyYXRpb25fX1dpbGRjYXJkQXNzaWdubWVudF8yXzBfM18wICkgKQorICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyOTg3OjI6ICggKCBydWxlX19YSW1wb3J0RGVjbGFyYXRpb25fX1dpbGRjYXJkQXNzaWdubWVudF8yXzBfM18wICkgKQogICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI4MzQ6MjogKCAoIHJ1bGVfX1hJbXBvcnREZWNsYXJhdGlvbl9fV2lsZGNhcmRBc3NpZ25tZW50XzJfMF8zXzAgKSApCi0gICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI4MzU6MzogKCBydWxlX19YSW1wb3J0RGVjbGFyYXRpb25fX1dpbGRjYXJkQXNzaWdubWVudF8yXzBfM18wICkKKyAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6Mjk4NzoyOiAoICggcnVsZV9fWEltcG9ydERlY2xhcmF0aW9uX19XaWxkY2FyZEFzc2lnbm1lbnRfMl8wXzNfMCApICkKKyAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6Mjk4ODozOiAoIHJ1bGVfX1hJbXBvcnREZWNsYXJhdGlvbl9fV2lsZGNhcmRBc3NpZ25tZW50XzJfMF8zXzAgKQogICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYSW1wb3J0RGVjbGFyYXRpb25BY2Nlc3MoKS5nZXRXaWxkY2FyZEFzc2lnbm1lbnRfMl8wXzNfMCgpKTsgCiAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjgzNjozOiAoIHJ1bGVfX1hJbXBvcnREZWNsYXJhdGlvbl9fV2lsZGNhcmRBc3NpZ25tZW50XzJfMF8zXzAgKQotICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyODM2OjQ6IHJ1bGVfX1hJbXBvcnREZWNsYXJhdGlvbl9fV2lsZGNhcmRBc3NpZ25tZW50XzJfMF8zXzAKKyAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6Mjk4OTozOiAoIHJ1bGVfX1hJbXBvcnREZWNsYXJhdGlvbl9fV2lsZGNhcmRBc3NpZ25tZW50XzJfMF8zXzAgKQorICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyOTg5OjQ6IHJ1bGVfX1hJbXBvcnREZWNsYXJhdGlvbl9fV2lsZGNhcmRBc3NpZ25tZW50XzJfMF8zXzAKICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV18yKTsKICAgICAgICAgICAgICAgICAgICAgcnVsZV9fWEltcG9ydERlY2xhcmF0aW9uX19XaWxkY2FyZEFzc2lnbm1lbnRfMl8wXzNfMCgpOwpAQCAtOTcyNCwxNiArMTAyODAsMTYgQEAKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICBjYXNlIDIgOgotICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyODQwOjI6ICggKCBydWxlX19YSW1wb3J0RGVjbGFyYXRpb25fX01lbWJlck5hbWVBc3NpZ25tZW50XzJfMF8zXzEgKSApCisgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI5OTM6MjogKCAoIHJ1bGVfX1hJbXBvcnREZWNsYXJhdGlvbl9fTWVtYmVyTmFtZUFzc2lnbm1lbnRfMl8wXzNfMSApICkKICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyODQwOjI6ICggKCBydWxlX19YSW1wb3J0RGVjbGFyYXRpb25fX01lbWJlck5hbWVBc3NpZ25tZW50XzJfMF8zXzEgKSApCi0gICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI4NDE6MzogKCBydWxlX19YSW1wb3J0RGVjbGFyYXRpb25fX01lbWJlck5hbWVBc3NpZ25tZW50XzJfMF8zXzEgKQorICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyOTkzOjI6ICggKCBydWxlX19YSW1wb3J0RGVjbGFyYXRpb25fX01lbWJlck5hbWVBc3NpZ25tZW50XzJfMF8zXzEgKSApCisgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI5OTQ6MzogKCBydWxlX19YSW1wb3J0RGVjbGFyYXRpb25fX01lbWJlck5hbWVBc3NpZ25tZW50XzJfMF8zXzEgKQogICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYSW1wb3J0RGVjbGFyYXRpb25BY2Nlc3MoKS5nZXRNZW1iZXJOYW1lQXNzaWdubWVudF8yXzBfM18xKCkpOyAKICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyODQyOjM6ICggcnVsZV9fWEltcG9ydERlY2xhcmF0aW9uX19NZW1iZXJOYW1lQXNzaWdubWVudF8yXzBfM18xICkKLSAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6Mjg0Mjo0OiBydWxlX19YSW1wb3J0RGVjbGFyYXRpb25fX01lbWJlck5hbWVBc3NpZ25tZW50XzJfMF8zXzEKKyAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6Mjk5NTozOiAoIHJ1bGVfX1hJbXBvcnREZWNsYXJhdGlvbl9fTWVtYmVyTmFtZUFzc2lnbm1lbnRfMl8wXzNfMSApCisgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI5OTU6NDogcnVsZV9fWEltcG9ydERlY2xhcmF0aW9uX19NZW1iZXJOYW1lQXNzaWdubWVudF8yXzBfM18xCiAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMik7CiAgICAgICAgICAgICAgICAgICAgIHJ1bGVfX1hJbXBvcnREZWNsYXJhdGlvbl9fTWVtYmVyTmFtZUFzc2lnbm1lbnRfMl8wXzNfMSgpOwpAQCAtOTc3MCwyNyArMTAzMjYsMjcgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YQW5ub3RhdGlvbl9fQWx0ZXJuYXRpdmVzXzNfMSIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyODUwOjE6IHJ1bGVfX1hBbm5vdGF0aW9uX19BbHRlcm5hdGl2ZXNfM18xIDogKCAoICggcnVsZV9fWEFubm90YXRpb25fX0dyb3VwXzNfMV8wX18wICkgKSB8ICggKCBydWxlX19YQW5ub3RhdGlvbl9fVmFsdWVBc3NpZ25tZW50XzNfMV8xICkgKSApOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjMwMDM6MTogcnVsZV9fWEFubm90YXRpb25fX0FsdGVybmF0aXZlc18zXzEgOiAoICggKCBydWxlX19YQW5ub3RhdGlvbl9fR3JvdXBfM18xXzBfXzAgKSApIHwgKCAoIHJ1bGVfX1hBbm5vdGF0aW9uX19WYWx1ZUFzc2lnbm1lbnRfM18xXzEgKSApICk7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fWEFubm90YXRpb25fX0FsdGVybmF0aXZlc18zXzEoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6Mjg1NDoxOiAoICggKCBydWxlX19YQW5ub3RhdGlvbl9fR3JvdXBfM18xXzBfXzAgKSApIHwgKCAoIHJ1bGVfX1hBbm5vdGF0aW9uX19WYWx1ZUFzc2lnbm1lbnRfM18xXzEgKSApICkKLSAgICAgICAgICAgIGludCBhbHQ4PTI7Ci0gICAgICAgICAgICBhbHQ4ID0gZGZhOC5wcmVkaWN0KGlucHV0KTsKLSAgICAgICAgICAgIHN3aXRjaCAoYWx0OCkgeworICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MzAwNzoxOiAoICggKCBydWxlX19YQW5ub3RhdGlvbl9fR3JvdXBfM18xXzBfXzAgKSApIHwgKCAoIHJ1bGVfX1hBbm5vdGF0aW9uX19WYWx1ZUFzc2lnbm1lbnRfM18xXzEgKSApICkKKyAgICAgICAgICAgIGludCBhbHQ5PTI7CisgICAgICAgICAgICBhbHQ5ID0gZGZhOS5wcmVkaWN0KGlucHV0KTsKKyAgICAgICAgICAgIHN3aXRjaCAoYWx0OSkgewogICAgICAgICAgICAgICAgIGNhc2UgMSA6Ci0gICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI4NTU6MjogKCAoIHJ1bGVfX1hBbm5vdGF0aW9uX19Hcm91cF8zXzFfMF9fMCApICkKKyAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MzAwODoyOiAoICggcnVsZV9fWEFubm90YXRpb25fX0dyb3VwXzNfMV8wX18wICkgKQogICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI4NTU6MjogKCAoIHJ1bGVfX1hBbm5vdGF0aW9uX19Hcm91cF8zXzFfMF9fMCApICkKLSAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6Mjg1NjozOiAoIHJ1bGVfX1hBbm5vdGF0aW9uX19Hcm91cF8zXzFfMF9fMCApCisgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjMwMDg6MjogKCAoIHJ1bGVfX1hBbm5vdGF0aW9uX19Hcm91cF8zXzFfMF9fMCApICkKKyAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MzAwOTozOiAoIHJ1bGVfX1hBbm5vdGF0aW9uX19Hcm91cF8zXzFfMF9fMCApCiAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhBbm5vdGF0aW9uQWNjZXNzKCkuZ2V0R3JvdXBfM18xXzAoKSk7IAogICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI4NTc6MzogKCBydWxlX19YQW5ub3RhdGlvbl9fR3JvdXBfM18xXzBfXzAgKQotICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyODU3OjQ6IHJ1bGVfX1hBbm5vdGF0aW9uX19Hcm91cF8zXzFfMF9fMAorICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzozMDEwOjM6ICggcnVsZV9fWEFubm90YXRpb25fX0dyb3VwXzNfMV8wX18wICkKKyAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MzAxMDo0OiBydWxlX19YQW5ub3RhdGlvbl9fR3JvdXBfM18xXzBfXzAKICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV18yKTsKICAgICAgICAgICAgICAgICAgICAgcnVsZV9fWEFubm90YXRpb25fX0dyb3VwXzNfMV8wX18wKCk7CkBAIC05ODEwLDE2ICsxMDM2NiwxNiBAQAogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgIGNhc2UgMiA6Ci0gICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI4NjE6MjogKCAoIHJ1bGVfX1hBbm5vdGF0aW9uX19WYWx1ZUFzc2lnbm1lbnRfM18xXzEgKSApCisgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjMwMTQ6MjogKCAoIHJ1bGVfX1hBbm5vdGF0aW9uX19WYWx1ZUFzc2lnbm1lbnRfM18xXzEgKSApCiAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6Mjg2MToyOiAoICggcnVsZV9fWEFubm90YXRpb25fX1ZhbHVlQXNzaWdubWVudF8zXzFfMSApICkKLSAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6Mjg2MjozOiAoIHJ1bGVfX1hBbm5vdGF0aW9uX19WYWx1ZUFzc2lnbm1lbnRfM18xXzEgKQorICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzozMDE0OjI6ICggKCBydWxlX19YQW5ub3RhdGlvbl9fVmFsdWVBc3NpZ25tZW50XzNfMV8xICkgKQorICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzozMDE1OjM6ICggcnVsZV9fWEFubm90YXRpb25fX1ZhbHVlQXNzaWdubWVudF8zXzFfMSApCiAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhBbm5vdGF0aW9uQWNjZXNzKCkuZ2V0VmFsdWVBc3NpZ25tZW50XzNfMV8xKCkpOyAKICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyODYzOjM6ICggcnVsZV9fWEFubm90YXRpb25fX1ZhbHVlQXNzaWdubWVudF8zXzFfMSApCi0gICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI4NjM6NDogcnVsZV9fWEFubm90YXRpb25fX1ZhbHVlQXNzaWdubWVudF8zXzFfMQorICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzozMDE2OjM6ICggcnVsZV9fWEFubm90YXRpb25fX1ZhbHVlQXNzaWdubWVudF8zXzFfMSApCisgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjMwMTY6NDogcnVsZV9fWEFubm90YXRpb25fX1ZhbHVlQXNzaWdubWVudF8zXzFfMQogICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzIpOwogICAgICAgICAgICAgICAgICAgICBydWxlX19YQW5ub3RhdGlvbl9fVmFsdWVBc3NpZ25tZW50XzNfMV8xKCk7CkBAIC05ODU2LDI3ICsxMDQxMiwyNyBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RfX0FsdGVybmF0aXZlcyIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyODcxOjE6IHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RfX0FsdGVybmF0aXZlcyA6ICggKCAoIHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RfX0dyb3VwXzBfXzAgKSApIHwgKCAoIHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RfX0dyb3VwXzFfXzAgKSApICk7CisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MzAyNDoxOiBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0X19BbHRlcm5hdGl2ZXMgOiAoICggKCBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0X19Hcm91cF8wX18wICkgKSB8ICggKCBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0X19Hcm91cF8xX18wICkgKSApOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RfX0FsdGVybmF0aXZlcygpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyODc1OjE6ICggKCAoIHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RfX0dyb3VwXzBfXzAgKSApIHwgKCAoIHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RfX0dyb3VwXzFfXzAgKSApICkKLSAgICAgICAgICAgIGludCBhbHQ5PTI7Ci0gICAgICAgICAgICBhbHQ5ID0gZGZhOS5wcmVkaWN0KGlucHV0KTsKLSAgICAgICAgICAgIHN3aXRjaCAoYWx0OSkgeworICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MzAyODoxOiAoICggKCBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0X19Hcm91cF8wX18wICkgKSB8ICggKCBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0X19Hcm91cF8xX18wICkgKSApCisgICAgICAgICAgICBpbnQgYWx0MTA9MjsKKyAgICAgICAgICAgIGFsdDEwID0gZGZhMTAucHJlZGljdChpbnB1dCk7CisgICAgICAgICAgICBzd2l0Y2ggKGFsdDEwKSB7CiAgICAgICAgICAgICAgICAgY2FzZSAxIDoKLSAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6Mjg3NjoyOiAoICggcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdF9fR3JvdXBfMF9fMCApICkKKyAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MzAyOToyOiAoICggcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdF9fR3JvdXBfMF9fMCApICkKICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyODc2OjI6ICggKCBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0X19Hcm91cF8wX18wICkgKQotICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyODc3OjM6ICggcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdF9fR3JvdXBfMF9fMCApCisgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjMwMjk6MjogKCAoIHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RfX0dyb3VwXzBfXzAgKSApCisgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjMwMzA6MzogKCBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0X19Hcm91cF8wX18wICkKICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdEFjY2VzcygpLmdldEdyb3VwXzAoKSk7IAogICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI4Nzg6MzogKCBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0X19Hcm91cF8wX18wICkKLSAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6Mjg3ODo0OiBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0X19Hcm91cF8wX18wCisgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjMwMzE6MzogKCBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0X19Hcm91cF8wX18wICkKKyAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MzAzMTo0OiBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0X19Hcm91cF8wX18wCiAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMik7CiAgICAgICAgICAgICAgICAgICAgIHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RfX0dyb3VwXzBfXzAoKTsKQEAgLTk4OTYsMTYgKzEwNDUyLDE2IEBACiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgY2FzZSAyIDoKLSAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6Mjg4MjoyOiAoICggcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdF9fR3JvdXBfMV9fMCApICkKKyAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MzAzNToyOiAoICggcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdF9fR3JvdXBfMV9fMCApICkKICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyODgyOjI6ICggKCBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0X19Hcm91cF8xX18wICkgKQotICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyODgzOjM6ICggcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdF9fR3JvdXBfMV9fMCApCisgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjMwMzU6MjogKCAoIHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RfX0dyb3VwXzFfXzAgKSApCisgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjMwMzY6MzogKCBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0X19Hcm91cF8xX18wICkKICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdEFjY2VzcygpLmdldEdyb3VwXzEoKSk7IAogICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI4ODQ6MzogKCBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0X19Hcm91cF8xX18wICkKLSAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6Mjg4NDo0OiBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0X19Hcm91cF8xX18wCisgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjMwMzc6MzogKCBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0X19Hcm91cF8xX18wICkKKyAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MzAzNzo0OiBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0X19Hcm91cF8xX18wCiAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMik7CiAgICAgICAgICAgICAgICAgICAgIHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RfX0dyb3VwXzFfXzAoKTsKQEAgLTk5NDIsMjcgKzEwNDk4LDI3IEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVfX0FsdGVybmF0aXZlcyIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyODkyOjE6IHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlX19BbHRlcm5hdGl2ZXMgOiAoICggKCBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZV9fR3JvdXBfMF9fMCApICkgfCAoIHJ1bGVYQW5ub3RhdGlvbk9yRXhwcmVzc2lvbiApICk7CisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MzA0NToxOiBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZV9fQWx0ZXJuYXRpdmVzIDogKCAoICggcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVfX0dyb3VwXzBfXzAgKSApIHwgKCBydWxlWEFubm90YXRpb25PckV4cHJlc3Npb24gKSApOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlX19BbHRlcm5hdGl2ZXMoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6Mjg5NjoxOiAoICggKCBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZV9fR3JvdXBfMF9fMCApICkgfCAoIHJ1bGVYQW5ub3RhdGlvbk9yRXhwcmVzc2lvbiApICkKLSAgICAgICAgICAgIGludCBhbHQxMD0yOwotICAgICAgICAgICAgYWx0MTAgPSBkZmExMC5wcmVkaWN0KGlucHV0KTsKLSAgICAgICAgICAgIHN3aXRjaCAoYWx0MTApIHsKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjMwNDk6MTogKCAoICggcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVfX0dyb3VwXzBfXzAgKSApIHwgKCBydWxlWEFubm90YXRpb25PckV4cHJlc3Npb24gKSApCisgICAgICAgICAgICBpbnQgYWx0MTE9MjsKKyAgICAgICAgICAgIGFsdDExID0gZGZhMTEucHJlZGljdChpbnB1dCk7CisgICAgICAgICAgICBzd2l0Y2ggKGFsdDExKSB7CiAgICAgICAgICAgICAgICAgY2FzZSAxIDoKLSAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6Mjg5NzoyOiAoICggcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVfX0dyb3VwXzBfXzAgKSApCisgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjMwNTA6MjogKCAoIHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlX19Hcm91cF8wX18wICkgKQogICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI4OTc6MjogKCAoIHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlX19Hcm91cF8wX18wICkgKQotICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyODk4OjM6ICggcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVfX0dyb3VwXzBfXzAgKQorICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzozMDUwOjI6ICggKCBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZV9fR3JvdXBfMF9fMCApICkKKyAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MzA1MTozOiAoIHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlX19Hcm91cF8wX18wICkKICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WEFubm90YXRpb25FbGVtZW50VmFsdWVBY2Nlc3MoKS5nZXRHcm91cF8wKCkpOyAKICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyODk5OjM6ICggcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVfX0dyb3VwXzBfXzAgKQotICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyODk5OjQ6IHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlX19Hcm91cF8wX18wCisgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjMwNTI6MzogKCBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZV9fR3JvdXBfMF9fMCApCisgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjMwNTI6NDogcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVfX0dyb3VwXzBfXzAKICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV18yKTsKICAgICAgICAgICAgICAgICAgICAgcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVfX0dyb3VwXzBfXzAoKTsKQEAgLTk5ODIsMTAgKzEwNTM4LDEwIEBACiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgY2FzZSAyIDoKLSAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjkwMzoyOiAoIHJ1bGVYQW5ub3RhdGlvbk9yRXhwcmVzc2lvbiApCisgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjMwNTY6MjogKCBydWxlWEFubm90YXRpb25PckV4cHJlc3Npb24gKQogICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI5MDM6MjogKCBydWxlWEFubm90YXRpb25PckV4cHJlc3Npb24gKQotICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyOTA0OjM6IHJ1bGVYQW5ub3RhdGlvbk9yRXhwcmVzc2lvbgorICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzozMDU2OjI6ICggcnVsZVhBbm5vdGF0aW9uT3JFeHByZXNzaW9uICkKKyAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MzA1NzozOiBydWxlWEFubm90YXRpb25PckV4cHJlc3Npb24KICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WEFubm90YXRpb25FbGVtZW50VmFsdWVBY2Nlc3MoKS5nZXRYQW5ub3RhdGlvbk9yRXhwcmVzc2lvblBhcnNlclJ1bGVDYWxsXzEoKSk7IApAQCAtMTAwMjIsMzUgKzEwNTc4LDM1IEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fWEFubm90YXRpb25PckV4cHJlc3Npb25fX0FsdGVybmF0aXZlcyIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyOTEzOjE6IHJ1bGVfX1hBbm5vdGF0aW9uT3JFeHByZXNzaW9uX19BbHRlcm5hdGl2ZXMgOiAoICggcnVsZVhBbm5vdGF0aW9uICkgfCAoIHJ1bGVYRXhwcmVzc2lvbiApICk7CisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MzA2NjoxOiBydWxlX19YQW5ub3RhdGlvbk9yRXhwcmVzc2lvbl9fQWx0ZXJuYXRpdmVzIDogKCAoIHJ1bGVYQW5ub3RhdGlvbiApIHwgKCBydWxlWEV4cHJlc3Npb24gKSApOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1hBbm5vdGF0aW9uT3JFeHByZXNzaW9uX19BbHRlcm5hdGl2ZXMoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjkxNzoxOiAoICggcnVsZVhBbm5vdGF0aW9uICkgfCAoIHJ1bGVYRXhwcmVzc2lvbiApICkKLSAgICAgICAgICAgIGludCBhbHQxMT0yOwotICAgICAgICAgICAgaW50IExBMTFfMCA9IGlucHV0LkxBKDEpOworICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MzA3MDoxOiAoICggcnVsZVhBbm5vdGF0aW9uICkgfCAoIHJ1bGVYRXhwcmVzc2lvbiApICkKKyAgICAgICAgICAgIGludCBhbHQxMj0yOworICAgICAgICAgICAgaW50IExBMTJfMCA9IGlucHV0LkxBKDEpOwogCi0gICAgICAgICAgICBpZiAoIChMQTExXzA9PTExMikgKSB7Ci0gICAgICAgICAgICAgICAgYWx0MTE9MTsKKyAgICAgICAgICAgIGlmICggKExBMTJfMD09MTIyKSApIHsKKyAgICAgICAgICAgICAgICBhbHQxMj0xOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSBpZiAoICgoTEExMV8wPj1SVUxFX1NUUklORyAmJiBMQTExXzA8PVJVTEVfREVDSU1BTCl8fExBMTFfMD09Mjd8fChMQTExXzA+PTM0ICYmIExBMTFfMDw9MzUpfHxMQTExXzA9PTQwfHwoTEExMV8wPj00NSAmJiBMQTExXzA8PTUwKXx8TEExMV8wPT03MHx8TEExMV8wPT05NXx8TEExMV8wPT0xMTN8fChMQTExXzA+PTExNyAmJiBMQTExXzA8PTExOCl8fExBMTFfMD09MTIwfHxMQTExXzA9PTEyMnx8KExBMTFfMD49MTI2ICYmIExBMTFfMDw9MTMzKXx8TEExMV8wPT0xMzV8fExBMTFfMD09MTU0KSApIHsKLSAgICAgICAgICAgICAgICBhbHQxMT0yOworICAgICAgICAgICAgZWxzZSBpZiAoICgoTEExMl8wPj1SVUxFX1NUUklORyAmJiBMQTEyXzA8PVJVTEVfREVDSU1BTCl8fExBMTJfMD09Mjd8fChMQTEyXzA+PTM0ICYmIExBMTJfMDw9MzUpfHxMQTEyXzA9PTQwfHwoTEExMl8wPj00NSAmJiBMQTEyXzA8PTUwKXx8TEExMl8wPT03NXx8TEExMl8wPT0xMDJ8fExBMTJfMD09MTIzfHwoTEExMl8wPj0xMjcgJiYgTEExMl8wPD0xMjgpfHxMQTEyXzA9PTEzMHx8TEExMl8wPT0xMzJ8fChMQTEyXzA+PTEzNiAmJiBMQTEyXzA8PTE0Myl8fExBMTJfMD09MTQ1fHxMQTEyXzA9PTE2NikgKSB7CisgICAgICAgICAgICAgICAgYWx0MTI9MjsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgIGlmIChzdGF0ZS5iYWNrdHJhY2tpbmc+MCkge3N0YXRlLmZhaWxlZD10cnVlOyByZXR1cm4gO30KICAgICAgICAgICAgICAgICBOb1ZpYWJsZUFsdEV4Y2VwdGlvbiBudmFlID0KLSAgICAgICAgICAgICAgICAgICAgbmV3IE5vVmlhYmxlQWx0RXhjZXB0aW9uKCIiLCAxMSwgMCwgaW5wdXQpOworICAgICAgICAgICAgICAgICAgICBuZXcgTm9WaWFibGVBbHRFeGNlcHRpb24oIiIsIDEyLCAwLCBpbnB1dCk7CiAKICAgICAgICAgICAgICAgICB0aHJvdyBudmFlOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgc3dpdGNoIChhbHQxMSkgeworICAgICAgICAgICAgc3dpdGNoIChhbHQxMikgewogICAgICAgICAgICAgICAgIGNhc2UgMSA6Ci0gICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI5MTg6MjogKCBydWxlWEFubm90YXRpb24gKQorICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzozMDcxOjI6ICggcnVsZVhBbm5vdGF0aW9uICkKICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyOTE4OjI6ICggcnVsZVhBbm5vdGF0aW9uICkKLSAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjkxOTozOiBydWxlWEFubm90YXRpb24KKyAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MzA3MToyOiAoIHJ1bGVYQW5ub3RhdGlvbiApCisgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjMwNzI6MzogcnVsZVhBbm5vdGF0aW9uCiAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhBbm5vdGF0aW9uT3JFeHByZXNzaW9uQWNjZXNzKCkuZ2V0WEFubm90YXRpb25QYXJzZXJSdWxlQ2FsbF8wKCkpOyAKQEAgLTEwMDcwLDEwICsxMDYyNiwxMCBAQAogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgIGNhc2UgMiA6Ci0gICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI5MjQ6MjogKCBydWxlWEV4cHJlc3Npb24gKQorICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzozMDc3OjI6ICggcnVsZVhFeHByZXNzaW9uICkKICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyOTI0OjI6ICggcnVsZVhFeHByZXNzaW9uICkKLSAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjkyNTozOiBydWxlWEV4cHJlc3Npb24KKyAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MzA3NzoyOiAoIHJ1bGVYRXhwcmVzc2lvbiApCisgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjMwNzg6MzogcnVsZVhFeHByZXNzaW9uCiAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhBbm5vdGF0aW9uT3JFeHByZXNzaW9uQWNjZXNzKCkuZ2V0WEV4cHJlc3Npb25QYXJzZXJSdWxlQ2FsbF8xKCkpOyAKQEAgLTEwMTEwLDI5ICsxMDY2NiwyOSBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX1hBc3NpZ25tZW50X19BbHRlcm5hdGl2ZXMiCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjkzNDoxOiBydWxlX19YQXNzaWdubWVudF9fQWx0ZXJuYXRpdmVzIDogKCAoICggcnVsZV9fWEFzc2lnbm1lbnRfX0dyb3VwXzBfXzAgKSApIHwgKCAoIHJ1bGVfX1hBc3NpZ25tZW50X19Hcm91cF8xX18wICkgKSApOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjMwODc6MTogcnVsZV9fWEFzc2lnbm1lbnRfX0FsdGVybmF0aXZlcyA6ICggKCAoIHJ1bGVfX1hBc3NpZ25tZW50X19Hcm91cF8wX18wICkgKSB8ICggKCBydWxlX19YQXNzaWdubWVudF9fR3JvdXBfMV9fMCApICkgKTsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YQXNzaWdubWVudF9fQWx0ZXJuYXRpdmVzKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI5Mzg6MTogKCAoICggcnVsZV9fWEFzc2lnbm1lbnRfX0dyb3VwXzBfXzAgKSApIHwgKCAoIHJ1bGVfX1hBc3NpZ25tZW50X19Hcm91cF8xX18wICkgKSApCi0gICAgICAgICAgICBpbnQgYWx0MTI9MjsKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjMwOTE6MTogKCAoICggcnVsZV9fWEFzc2lnbm1lbnRfX0dyb3VwXzBfXzAgKSApIHwgKCAoIHJ1bGVfX1hBc3NpZ25tZW50X19Hcm91cF8xX18wICkgKSApCisgICAgICAgICAgICBpbnQgYWx0MTM9MjsKICAgICAgICAgICAgIHN3aXRjaCAoIGlucHV0LkxBKDEpICkgewogICAgICAgICAgICAgY2FzZSBSVUxFX0lEOgogICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpbnQgTEExMl8xID0gaW5wdXQuTEEoMik7CisgICAgICAgICAgICAgICAgaW50IExBMTNfMSA9IGlucHV0LkxBKDIpOwogCi0gICAgICAgICAgICAgICAgaWYgKCAoTEExMl8xPT0xMykgKSB7Ci0gICAgICAgICAgICAgICAgICAgIGFsdDEyPTE7CisgICAgICAgICAgICAgICAgaWYgKCAoTEExM18xPT0xMykgKSB7CisgICAgICAgICAgICAgICAgICAgIGFsdDEzPTE7CiAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UgaWYgKCAoTEExMl8xPT1FT0Z8fChMQTEyXzE+PVJVTEVfU1RSSU5HICYmIExBMTJfMTw9UlVMRV9ERUNJTUFMKXx8KExBMTJfMT49MTQgJiYgTEExMl8xPD01MCl8fChMQTEyXzE+PTcwICYmIExBMTJfMTw9NzEpfHxMQTEyXzE9PTk1fHxMQTEyXzE9PTEwNnx8TEExMl8xPT0xMTF8fChMQTEyXzE+PTExMyAmJiBMQTEyXzE8PTEzNil8fChMQTEyXzE+PTE1MCAmJiBMQTEyXzE8PTE1MSl8fChMQTEyXzE+PTE1MyAmJiBMQTEyXzE8PTE1NCkpICkgewotICAgICAgICAgICAgICAgICAgICBhbHQxMj0yOworICAgICAgICAgICAgICAgIGVsc2UgaWYgKCAoTEExM18xPT1FT0Z8fChMQTEzXzE+PVJVTEVfU1RSSU5HICYmIExBMTNfMTw9UlVMRV9ERUNJTUFMKXx8KExBMTNfMT49MTQgJiYgTEExM18xPD01MCl8fChMQTEzXzE+PTc1ICYmIExBMTNfMTw9NzYpfHxMQTEzXzE9PTEwMnx8TEExM18xPT0xMTZ8fExBMTNfMT09MTIxfHwoTEExM18xPj0xMjMgJiYgTEExM18xPD0xNDYpfHwoTEExM18xPj0xNjIgJiYgTEExM18xPD0xNjMpfHwoTEExM18xPj0xNjUgJiYgTEExM18xPD0xNjYpKSApIHsKKyAgICAgICAgICAgICAgICAgICAgYWx0MTM9MjsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgIGlmIChzdGF0ZS5iYWNrdHJhY2tpbmc+MCkge3N0YXRlLmZhaWxlZD10cnVlOyByZXR1cm4gO30KICAgICAgICAgICAgICAgICAgICAgTm9WaWFibGVBbHRFeGNlcHRpb24gbnZhZSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICBuZXcgTm9WaWFibGVBbHRFeGNlcHRpb24oIiIsIDEyLCAxLCBpbnB1dCk7CisgICAgICAgICAgICAgICAgICAgICAgICBuZXcgTm9WaWFibGVBbHRFeGNlcHRpb24oIiIsIDEzLCAxLCBpbnB1dCk7CiAKICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbnZhZTsKICAgICAgICAgICAgICAgICB9CkBAIC0xMDE0MCwxOCArMTA2OTYsMTggQEAKICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIGNhc2UgNDU6CiAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGludCBMQTEyXzIgPSBpbnB1dC5MQSgyKTsKKyAgICAgICAgICAgICAgICBpbnQgTEExM18yID0gaW5wdXQuTEEoMik7CiAKLSAgICAgICAgICAgICAgICBpZiAoIChMQTEyXzI9PUVPRnx8KExBMTJfMj49UlVMRV9TVFJJTkcgJiYgTEExMl8yPD1SVUxFX0RFQ0lNQUwpfHwoTEExMl8yPj0xNCAmJiBMQTEyXzI8PTUwKXx8KExBMTJfMj49NzAgJiYgTEExMl8yPD03MSl8fExBMTJfMj09OTV8fExBMTJfMj09MTA2fHxMQTEyXzI9PTExMXx8KExBMTJfMj49MTEzICYmIExBMTJfMjw9MTM2KXx8KExBMTJfMj49MTUwICYmIExBMTJfMjw9MTUxKXx8KExBMTJfMj49MTUzICYmIExBMTJfMjw9MTU0KSkgKSB7Ci0gICAgICAgICAgICAgICAgICAgIGFsdDEyPTI7CisgICAgICAgICAgICAgICAgaWYgKCAoTEExM18yPT0xMykgKSB7CisgICAgICAgICAgICAgICAgICAgIGFsdDEzPTE7CiAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UgaWYgKCAoTEExMl8yPT0xMykgKSB7Ci0gICAgICAgICAgICAgICAgICAgIGFsdDEyPTE7CisgICAgICAgICAgICAgICAgZWxzZSBpZiAoIChMQTEzXzI9PUVPRnx8KExBMTNfMj49UlVMRV9TVFJJTkcgJiYgTEExM18yPD1SVUxFX0RFQ0lNQUwpfHwoTEExM18yPj0xNCAmJiBMQTEzXzI8PTUwKXx8KExBMTNfMj49NzUgJiYgTEExM18yPD03Nil8fExBMTNfMj09MTAyfHxMQTEzXzI9PTExNnx8TEExM18yPT0xMjF8fChMQTEzXzI+PTEyMyAmJiBMQTEzXzI8PTE0Nil8fChMQTEzXzI+PTE2MiAmJiBMQTEzXzI8PTE2Myl8fChMQTEzXzI+PTE2NSAmJiBMQTEzXzI8PTE2NikpICkgeworICAgICAgICAgICAgICAgICAgICBhbHQxMz0yOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgaWYgKHN0YXRlLmJhY2t0cmFja2luZz4wKSB7c3RhdGUuZmFpbGVkPXRydWU7IHJldHVybiA7fQogICAgICAgICAgICAgICAgICAgICBOb1ZpYWJsZUFsdEV4Y2VwdGlvbiBudmFlID0KLSAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBOb1ZpYWJsZUFsdEV4Y2VwdGlvbigiIiwgMTIsIDIsIGlucHV0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBOb1ZpYWJsZUFsdEV4Y2VwdGlvbigiIiwgMTMsIDIsIGlucHV0KTsKIAogICAgICAgICAgICAgICAgICAgICB0aHJvdyBudmFlOwogICAgICAgICAgICAgICAgIH0KQEAgLTEwMTU5LDE4ICsxMDcxNSwxOCBAQAogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgY2FzZSA0NjoKICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaW50IExBMTJfMyA9IGlucHV0LkxBKDIpOworICAgICAgICAgICAgICAgIGludCBMQTEzXzMgPSBpbnB1dC5MQSgyKTsKIAotICAgICAgICAgICAgICAgIGlmICggKExBMTJfMz09RU9GfHwoTEExMl8zPj1SVUxFX1NUUklORyAmJiBMQTEyXzM8PVJVTEVfREVDSU1BTCl8fChMQTEyXzM+PTE0ICYmIExBMTJfMzw9NTApfHwoTEExMl8zPj03MCAmJiBMQTEyXzM8PTcxKXx8TEExMl8zPT05NXx8TEExMl8zPT0xMDZ8fExBMTJfMz09MTExfHwoTEExMl8zPj0xMTMgJiYgTEExMl8zPD0xMzYpfHwoTEExMl8zPj0xNTAgJiYgTEExMl8zPD0xNTEpfHwoTEExMl8zPj0xNTMgJiYgTEExMl8zPD0xNTQpKSApIHsKLSAgICAgICAgICAgICAgICAgICAgYWx0MTI9MjsKKyAgICAgICAgICAgICAgICBpZiAoIChMQTEzXzM9PUVPRnx8KExBMTNfMz49UlVMRV9TVFJJTkcgJiYgTEExM18zPD1SVUxFX0RFQ0lNQUwpfHwoTEExM18zPj0xNCAmJiBMQTEzXzM8PTUwKXx8KExBMTNfMz49NzUgJiYgTEExM18zPD03Nil8fExBMTNfMz09MTAyfHxMQTEzXzM9PTExNnx8TEExM18zPT0xMjF8fChMQTEzXzM+PTEyMyAmJiBMQTEzXzM8PTE0Nil8fChMQTEzXzM+PTE2MiAmJiBMQTEzXzM8PTE2Myl8fChMQTEzXzM+PTE2NSAmJiBMQTEzXzM8PTE2NikpICkgeworICAgICAgICAgICAgICAgICAgICBhbHQxMz0yOwogICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlIGlmICggKExBMTJfMz09MTMpICkgewotICAgICAgICAgICAgICAgICAgICBhbHQxMj0xOworICAgICAgICAgICAgICAgIGVsc2UgaWYgKCAoTEExM18zPT0xMykgKSB7CisgICAgICAgICAgICAgICAgICAgIGFsdDEzPTE7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICBpZiAoc3RhdGUuYmFja3RyYWNraW5nPjApIHtzdGF0ZS5mYWlsZWQ9dHJ1ZTsgcmV0dXJuIDt9CiAgICAgICAgICAgICAgICAgICAgIE5vVmlhYmxlQWx0RXhjZXB0aW9uIG52YWUgPQotICAgICAgICAgICAgICAgICAgICAgICAgbmV3IE5vVmlhYmxlQWx0RXhjZXB0aW9uKCIiLCAxMiwgMywgaW5wdXQpOworICAgICAgICAgICAgICAgICAgICAgICAgbmV3IE5vVmlhYmxlQWx0RXhjZXB0aW9uKCIiLCAxMywgMywgaW5wdXQpOwogCiAgICAgICAgICAgICAgICAgICAgIHRocm93IG52YWU7CiAgICAgICAgICAgICAgICAgfQpAQCAtMTAxNzgsMTggKzEwNzM0LDE4IEBACiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICBjYXNlIDQ3OgogICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpbnQgTEExMl80ID0gaW5wdXQuTEEoMik7CisgICAgICAgICAgICAgICAgaW50IExBMTNfNCA9IGlucHV0LkxBKDIpOwogCi0gICAgICAgICAgICAgICAgaWYgKCAoTEExMl80PT1FT0Z8fChMQTEyXzQ+PVJVTEVfU1RSSU5HICYmIExBMTJfNDw9UlVMRV9ERUNJTUFMKXx8KExBMTJfND49MTQgJiYgTEExMl80PD01MCl8fChMQTEyXzQ+PTcwICYmIExBMTJfNDw9NzEpfHxMQTEyXzQ9PTk1fHxMQTEyXzQ9PTEwNnx8TEExMl80PT0xMTF8fChMQTEyXzQ+PTExMyAmJiBMQTEyXzQ8PTEzNil8fChMQTEyXzQ+PTE1MCAmJiBMQTEyXzQ8PTE1MSl8fChMQTEyXzQ+PTE1MyAmJiBMQTEyXzQ8PTE1NCkpICkgewotICAgICAgICAgICAgICAgICAgICBhbHQxMj0yOworICAgICAgICAgICAgICAgIGlmICggKExBMTNfND09MTMpICkgeworICAgICAgICAgICAgICAgICAgICBhbHQxMz0xOwogICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlIGlmICggKExBMTJfND09MTMpICkgewotICAgICAgICAgICAgICAgICAgICBhbHQxMj0xOworICAgICAgICAgICAgICAgIGVsc2UgaWYgKCAoTEExM180PT1FT0Z8fChMQTEzXzQ+PVJVTEVfU1RSSU5HICYmIExBMTNfNDw9UlVMRV9ERUNJTUFMKXx8KExBMTNfND49MTQgJiYgTEExM180PD01MCl8fChMQTEzXzQ+PTc1ICYmIExBMTNfNDw9NzYpfHxMQTEzXzQ9PTEwMnx8TEExM180PT0xMTZ8fExBMTNfND09MTIxfHwoTEExM180Pj0xMjMgJiYgTEExM180PD0xNDYpfHwoTEExM180Pj0xNjIgJiYgTEExM180PD0xNjMpfHwoTEExM180Pj0xNjUgJiYgTEExM180PD0xNjYpKSApIHsKKyAgICAgICAgICAgICAgICAgICAgYWx0MTM9MjsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgIGlmIChzdGF0ZS5iYWNrdHJhY2tpbmc+MCkge3N0YXRlLmZhaWxlZD10cnVlOyByZXR1cm4gO30KICAgICAgICAgICAgICAgICAgICAgTm9WaWFibGVBbHRFeGNlcHRpb24gbnZhZSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICBuZXcgTm9WaWFibGVBbHRFeGNlcHRpb24oIiIsIDEyLCA0LCBpbnB1dCk7CisgICAgICAgICAgICAgICAgICAgICAgICBuZXcgTm9WaWFibGVBbHRFeGNlcHRpb24oIiIsIDEzLCA0LCBpbnB1dCk7CiAKICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbnZhZTsKICAgICAgICAgICAgICAgICB9CkBAIC0xMDE5NywxOCArMTA3NTMsMTggQEAKICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIGNhc2UgNDg6CiAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGludCBMQTEyXzUgPSBpbnB1dC5MQSgyKTsKKyAgICAgICAgICAgICAgICBpbnQgTEExM181ID0gaW5wdXQuTEEoMik7CiAKLSAgICAgICAgICAgICAgICBpZiAoIChMQTEyXzU9PUVPRnx8KExBMTJfNT49UlVMRV9TVFJJTkcgJiYgTEExMl81PD1SVUxFX0RFQ0lNQUwpfHwoTEExMl81Pj0xNCAmJiBMQTEyXzU8PTUwKXx8KExBMTJfNT49NzAgJiYgTEExMl81PD03MSl8fExBMTJfNT09OTV8fExBMTJfNT09MTA2fHxMQTEyXzU9PTExMXx8KExBMTJfNT49MTEzICYmIExBMTJfNTw9MTM2KXx8KExBMTJfNT49MTUwICYmIExBMTJfNTw9MTUxKXx8KExBMTJfNT49MTUzICYmIExBMTJfNTw9MTU0KSkgKSB7Ci0gICAgICAgICAgICAgICAgICAgIGFsdDEyPTI7CisgICAgICAgICAgICAgICAgaWYgKCAoTEExM181PT1FT0Z8fChMQTEzXzU+PVJVTEVfU1RSSU5HICYmIExBMTNfNTw9UlVMRV9ERUNJTUFMKXx8KExBMTNfNT49MTQgJiYgTEExM181PD01MCl8fChMQTEzXzU+PTc1ICYmIExBMTNfNTw9NzYpfHxMQTEzXzU9PTEwMnx8TEExM181PT0xMTZ8fExBMTNfNT09MTIxfHwoTEExM181Pj0xMjMgJiYgTEExM181PD0xNDYpfHwoTEExM181Pj0xNjIgJiYgTEExM181PD0xNjMpfHwoTEExM181Pj0xNjUgJiYgTEExM181PD0xNjYpKSApIHsKKyAgICAgICAgICAgICAgICAgICAgYWx0MTM9MjsKICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZSBpZiAoIChMQTEyXzU9PTEzKSApIHsKLSAgICAgICAgICAgICAgICAgICAgYWx0MTI9MTsKKyAgICAgICAgICAgICAgICBlbHNlIGlmICggKExBMTNfNT09MTMpICkgeworICAgICAgICAgICAgICAgICAgICBhbHQxMz0xOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgaWYgKHN0YXRlLmJhY2t0cmFja2luZz4wKSB7c3RhdGUuZmFpbGVkPXRydWU7IHJldHVybiA7fQogICAgICAgICAgICAgICAgICAgICBOb1ZpYWJsZUFsdEV4Y2VwdGlvbiBudmFlID0KLSAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBOb1ZpYWJsZUFsdEV4Y2VwdGlvbigiIiwgMTIsIDUsIGlucHV0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBOb1ZpYWJsZUFsdEV4Y2VwdGlvbigiIiwgMTMsIDUsIGlucHV0KTsKIAogICAgICAgICAgICAgICAgICAgICB0aHJvdyBudmFlOwogICAgICAgICAgICAgICAgIH0KQEAgLTEwMjI0LDQ3ICsxMDc4MCw0NyBAQAogICAgICAgICAgICAgY2FzZSA0MDoKICAgICAgICAgICAgIGNhc2UgNDk6CiAgICAgICAgICAgICBjYXNlIDUwOgotICAgICAgICAgICAgY2FzZSA3MDoKLSAgICAgICAgICAgIGNhc2UgOTU6Ci0gICAgICAgICAgICBjYXNlIDExMzoKLSAgICAgICAgICAgIGNhc2UgMTE3OgotICAgICAgICAgICAgY2FzZSAxMTg6Ci0gICAgICAgICAgICBjYXNlIDEyMDoKLSAgICAgICAgICAgIGNhc2UgMTIyOgotICAgICAgICAgICAgY2FzZSAxMjY6CisgICAgICAgICAgICBjYXNlIDc1OgorICAgICAgICAgICAgY2FzZSAxMDI6CisgICAgICAgICAgICBjYXNlIDEyMzoKICAgICAgICAgICAgIGNhc2UgMTI3OgogICAgICAgICAgICAgY2FzZSAxMjg6Ci0gICAgICAgICAgICBjYXNlIDEyOToKICAgICAgICAgICAgIGNhc2UgMTMwOgotICAgICAgICAgICAgY2FzZSAxMzE6CiAgICAgICAgICAgICBjYXNlIDEzMjoKLSAgICAgICAgICAgIGNhc2UgMTMzOgotICAgICAgICAgICAgY2FzZSAxMzU6Ci0gICAgICAgICAgICBjYXNlIDE1NDoKKyAgICAgICAgICAgIGNhc2UgMTM2OgorICAgICAgICAgICAgY2FzZSAxMzc6CisgICAgICAgICAgICBjYXNlIDEzODoKKyAgICAgICAgICAgIGNhc2UgMTM5OgorICAgICAgICAgICAgY2FzZSAxNDA6CisgICAgICAgICAgICBjYXNlIDE0MToKKyAgICAgICAgICAgIGNhc2UgMTQyOgorICAgICAgICAgICAgY2FzZSAxNDM6CisgICAgICAgICAgICBjYXNlIDE0NToKKyAgICAgICAgICAgIGNhc2UgMTY2OgogICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBhbHQxMj0yOworICAgICAgICAgICAgICAgIGFsdDEzPTI7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgICAgICBpZiAoc3RhdGUuYmFja3RyYWNraW5nPjApIHtzdGF0ZS5mYWlsZWQ9dHJ1ZTsgcmV0dXJuIDt9CiAgICAgICAgICAgICAgICAgTm9WaWFibGVBbHRFeGNlcHRpb24gbnZhZSA9Ci0gICAgICAgICAgICAgICAgICAgIG5ldyBOb1ZpYWJsZUFsdEV4Y2VwdGlvbigiIiwgMTIsIDAsIGlucHV0KTsKKyAgICAgICAgICAgICAgICAgICAgbmV3IE5vVmlhYmxlQWx0RXhjZXB0aW9uKCIiLCAxMywgMCwgaW5wdXQpOwogCiAgICAgICAgICAgICAgICAgdGhyb3cgbnZhZTsKICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgc3dpdGNoIChhbHQxMikgeworICAgICAgICAgICAgc3dpdGNoIChhbHQxMykgewogICAgICAgICAgICAgICAgIGNhc2UgMSA6Ci0gICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI5Mzk6MjogKCAoIHJ1bGVfX1hBc3NpZ25tZW50X19Hcm91cF8wX18wICkgKQorICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzozMDkyOjI6ICggKCBydWxlX19YQXNzaWdubWVudF9fR3JvdXBfMF9fMCApICkKICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyOTM5OjI6ICggKCBydWxlX19YQXNzaWdubWVudF9fR3JvdXBfMF9fMCApICkKLSAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6Mjk0MDozOiAoIHJ1bGVfX1hBc3NpZ25tZW50X19Hcm91cF8wX18wICkKKyAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MzA5MjoyOiAoICggcnVsZV9fWEFzc2lnbm1lbnRfX0dyb3VwXzBfXzAgKSApCisgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjMwOTM6MzogKCBydWxlX19YQXNzaWdubWVudF9fR3JvdXBfMF9fMCApCiAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhBc3NpZ25tZW50QWNjZXNzKCkuZ2V0R3JvdXBfMCgpKTsgCiAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6Mjk0MTozOiAoIHJ1bGVfX1hBc3NpZ25tZW50X19Hcm91cF8wX18wICkKLSAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6Mjk0MTo0OiBydWxlX19YQXNzaWdubWVudF9fR3JvdXBfMF9fMAorICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzozMDk0OjM6ICggcnVsZV9fWEFzc2lnbm1lbnRfX0dyb3VwXzBfXzAgKQorICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzozMDk0OjQ6IHJ1bGVfX1hBc3NpZ25tZW50X19Hcm91cF8wX18wCiAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMik7CiAgICAgICAgICAgICAgICAgICAgIHJ1bGVfX1hBc3NpZ25tZW50X19Hcm91cF8wX18wKCk7CkBAIC0xMDI4NCwxNiArMTA4NDAsMTYgQEAKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICBjYXNlIDIgOgotICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyOTQ1OjI6ICggKCBydWxlX19YQXNzaWdubWVudF9fR3JvdXBfMV9fMCApICkKKyAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MzA5ODoyOiAoICggcnVsZV9fWEFzc2lnbm1lbnRfX0dyb3VwXzFfXzAgKSApCiAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6Mjk0NToyOiAoICggcnVsZV9fWEFzc2lnbm1lbnRfX0dyb3VwXzFfXzAgKSApCi0gICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI5NDY6MzogKCBydWxlX19YQXNzaWdubWVudF9fR3JvdXBfMV9fMCApCisgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjMwOTg6MjogKCAoIHJ1bGVfX1hBc3NpZ25tZW50X19Hcm91cF8xX18wICkgKQorICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzozMDk5OjM6ICggcnVsZV9fWEFzc2lnbm1lbnRfX0dyb3VwXzFfXzAgKQogICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYQXNzaWdubWVudEFjY2VzcygpLmdldEdyb3VwXzEoKSk7IAogICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI5NDc6MzogKCBydWxlX19YQXNzaWdubWVudF9fR3JvdXBfMV9fMCApCi0gICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI5NDc6NDogcnVsZV9fWEFzc2lnbm1lbnRfX0dyb3VwXzFfXzAKKyAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MzEwMDozOiAoIHJ1bGVfX1hBc3NpZ25tZW50X19Hcm91cF8xX18wICkKKyAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MzEwMDo0OiBydWxlX19YQXNzaWdubWVudF9fR3JvdXBfMV9fMAogICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzIpOwogICAgICAgICAgICAgICAgICAgICBydWxlX19YQXNzaWdubWVudF9fR3JvdXBfMV9fMCgpOwpAQCAtMTAzMzAsNjQgKzEwODg2LDY0IEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fT3BNdWx0aUFzc2lnbl9fQWx0ZXJuYXRpdmVzIgotICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI5NTU6MTogcnVsZV9fT3BNdWx0aUFzc2lnbl9fQWx0ZXJuYXRpdmVzIDogKCAoICcrPScgKSB8ICggJy09JyApIHwgKCAnKj0nICkgfCAoICcvPScgKSB8ICggJyU9JyApIHwgKCAoIHJ1bGVfX09wTXVsdGlBc3NpZ25fX0dyb3VwXzVfXzAgKSApIHwgKCAoIHJ1bGVfX09wTXVsdGlBc3NpZ25fX0dyb3VwXzZfXzAgKSApICk7CisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MzEwODoxOiBydWxlX19PcE11bHRpQXNzaWduX19BbHRlcm5hdGl2ZXMgOiAoICggJys9JyApIHwgKCAnLT0nICkgfCAoICcqPScgKSB8ICggJy89JyApIHwgKCAnJT0nICkgfCAoICggcnVsZV9fT3BNdWx0aUFzc2lnbl9fR3JvdXBfNV9fMCApICkgfCAoICggcnVsZV9fT3BNdWx0aUFzc2lnbl9fR3JvdXBfNl9fMCApICkgKTsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19PcE11bHRpQXNzaWduX19BbHRlcm5hdGl2ZXMoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6Mjk1OToxOiAoICggJys9JyApIHwgKCAnLT0nICkgfCAoICcqPScgKSB8ICggJy89JyApIHwgKCAnJT0nICkgfCAoICggcnVsZV9fT3BNdWx0aUFzc2lnbl9fR3JvdXBfNV9fMCApICkgfCAoICggcnVsZV9fT3BNdWx0aUFzc2lnbl9fR3JvdXBfNl9fMCApICkgKQotICAgICAgICAgICAgaW50IGFsdDEzPTc7CisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzozMTEyOjE6ICggKCAnKz0nICkgfCAoICctPScgKSB8ICggJyo9JyApIHwgKCAnLz0nICkgfCAoICclPScgKSB8ICggKCBydWxlX19PcE11bHRpQXNzaWduX19Hcm91cF81X18wICkgKSB8ICggKCBydWxlX19PcE11bHRpQXNzaWduX19Hcm91cF82X18wICkgKSApCisgICAgICAgICAgICBpbnQgYWx0MTQ9NzsKICAgICAgICAgICAgIHN3aXRjaCAoIGlucHV0LkxBKDEpICkgewogICAgICAgICAgICAgY2FzZSAxNjoKICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgYWx0MTM9MTsKKyAgICAgICAgICAgICAgICBhbHQxND0xOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIGNhc2UgMTc6CiAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGFsdDEzPTI7CisgICAgICAgICAgICAgICAgYWx0MTQ9MjsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICBjYXNlIDE4OgogICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBhbHQxMz0zOworICAgICAgICAgICAgICAgIGFsdDE0PTM7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgY2FzZSAxOToKICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgYWx0MTM9NDsKKyAgICAgICAgICAgICAgICBhbHQxND00OwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIGNhc2UgMjA6CiAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGFsdDEzPTU7CisgICAgICAgICAgICAgICAgYWx0MTQ9NTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICBjYXNlIDI3OgogICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBhbHQxMz02OworICAgICAgICAgICAgICAgIGFsdDE0PTY7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgY2FzZSAyNjoKICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgYWx0MTM9NzsKKyAgICAgICAgICAgICAgICBhbHQxND03OwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICAgICAgaWYgKHN0YXRlLmJhY2t0cmFja2luZz4wKSB7c3RhdGUuZmFpbGVkPXRydWU7IHJldHVybiA7fQogICAgICAgICAgICAgICAgIE5vVmlhYmxlQWx0RXhjZXB0aW9uIG52YWUgPQotICAgICAgICAgICAgICAgICAgICBuZXcgTm9WaWFibGVBbHRFeGNlcHRpb24oIiIsIDEzLCAwLCBpbnB1dCk7CisgICAgICAgICAgICAgICAgICAgIG5ldyBOb1ZpYWJsZUFsdEV4Y2VwdGlvbigiIiwgMTQsIDAsIGlucHV0KTsKIAogICAgICAgICAgICAgICAgIHRocm93IG52YWU7CiAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgIHN3aXRjaCAoYWx0MTMpIHsKKyAgICAgICAgICAgIHN3aXRjaCAoYWx0MTQpIHsKICAgICAgICAgICAgICAgICBjYXNlIDEgOgotICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyOTYwOjI6ICggJys9JyApCisgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjMxMTM6MjogKCAnKz0nICkKICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyOTYwOjI6ICggJys9JyApCi0gICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI5NjE6MzogJys9JworICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzozMTEzOjI6ICggJys9JyApCisgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjMxMTQ6MzogJys9JwogICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRPcE11bHRpQXNzaWduQWNjZXNzKCkuZ2V0UGx1c1NpZ25FcXVhbHNTaWduS2V5d29yZF8wKCkpOyAKQEAgLTEwNDAzLDEwICsxMDk1OSwxMCBAQAogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgIGNhc2UgMiA6Ci0gICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI5NjY6MjogKCAnLT0nICkKKyAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MzExOToyOiAoICctPScgKQogICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI5NjY6MjogKCAnLT0nICkKLSAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6Mjk2NzozOiAnLT0nCisgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjMxMTk6MjogKCAnLT0nICkKKyAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MzEyMDozOiAnLT0nCiAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldE9wTXVsdGlBc3NpZ25BY2Nlc3MoKS5nZXRIeXBoZW5NaW51c0VxdWFsc1NpZ25LZXl3b3JkXzEoKSk7IApAQCAtMTA0MjIsMTAgKzEwOTc4LDEwIEBACiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgY2FzZSAzIDoKLSAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6Mjk3MjoyOiAoICcqPScgKQorICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzozMTI1OjI6ICggJyo9JyApCiAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6Mjk3MjoyOiAoICcqPScgKQotICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyOTczOjM6ICcqPScKKyAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MzEyNToyOiAoICcqPScgKQorICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzozMTI2OjM6ICcqPScKICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0T3BNdWx0aUFzc2lnbkFjY2VzcygpLmdldEFzdGVyaXNrRXF1YWxzU2lnbktleXdvcmRfMigpKTsgCkBAIC0xMDQ0MSwxMCArMTA5OTcsMTAgQEAKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICBjYXNlIDQgOgotICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyOTc4OjI6ICggJy89JyApCisgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjMxMzE6MjogKCAnLz0nICkKICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyOTc4OjI6ICggJy89JyApCi0gICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI5Nzk6MzogJy89JworICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzozMTMxOjI6ICggJy89JyApCisgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjMxMzI6MzogJy89JwogICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRPcE11bHRpQXNzaWduQWNjZXNzKCkuZ2V0U29saWR1c0VxdWFsc1NpZ25LZXl3b3JkXzMoKSk7IApAQCAtMTA0NjAsMTAgKzExMDE2LDEwIEBACiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgY2FzZSA1IDoKLSAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6Mjk4NDoyOiAoICclPScgKQorICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzozMTM3OjI6ICggJyU9JyApCiAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6Mjk4NDoyOiAoICclPScgKQotICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyOTg1OjM6ICclPScKKyAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MzEzNzoyOiAoICclPScgKQorICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzozMTM4OjM6ICclPScKICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0T3BNdWx0aUFzc2lnbkFjY2VzcygpLmdldFBlcmNlbnRTaWduRXF1YWxzU2lnbktleXdvcmRfNCgpKTsgCkBAIC0xMDQ3OSwxNiArMTEwMzUsMTYgQEAKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICBjYXNlIDYgOgotICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyOTkwOjI6ICggKCBydWxlX19PcE11bHRpQXNzaWduX19Hcm91cF81X18wICkgKQorICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzozMTQzOjI6ICggKCBydWxlX19PcE11bHRpQXNzaWduX19Hcm91cF81X18wICkgKQogICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI5OTA6MjogKCAoIHJ1bGVfX09wTXVsdGlBc3NpZ25fX0dyb3VwXzVfXzAgKSApCi0gICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI5OTE6MzogKCBydWxlX19PcE11bHRpQXNzaWduX19Hcm91cF81X18wICkKKyAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MzE0MzoyOiAoICggcnVsZV9fT3BNdWx0aUFzc2lnbl9fR3JvdXBfNV9fMCApICkKKyAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MzE0NDozOiAoIHJ1bGVfX09wTXVsdGlBc3NpZ25fX0dyb3VwXzVfXzAgKQogICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRPcE11bHRpQXNzaWduQWNjZXNzKCkuZ2V0R3JvdXBfNSgpKTsgCiAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6Mjk5MjozOiAoIHJ1bGVfX09wTXVsdGlBc3NpZ25fX0dyb3VwXzVfXzAgKQotICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyOTkyOjQ6IHJ1bGVfX09wTXVsdGlBc3NpZ25fX0dyb3VwXzVfXzAKKyAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MzE0NTozOiAoIHJ1bGVfX09wTXVsdGlBc3NpZ25fX0dyb3VwXzVfXzAgKQorICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzozMTQ1OjQ6IHJ1bGVfX09wTXVsdGlBc3NpZ25fX0dyb3VwXzVfXzAKICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV18yKTsKICAgICAgICAgICAgICAgICAgICAgcnVsZV9fT3BNdWx0aUFzc2lnbl9fR3JvdXBfNV9fMCgpOwpAQCAtMTA1MDgsMTYgKzExMDY0LDE2IEBACiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgY2FzZSA3IDoKLSAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6Mjk5NjoyOiAoICggcnVsZV9fT3BNdWx0aUFzc2lnbl9fR3JvdXBfNl9fMCApICkKKyAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MzE0OToyOiAoICggcnVsZV9fT3BNdWx0aUFzc2lnbl9fR3JvdXBfNl9fMCApICkKICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyOTk2OjI6ICggKCBydWxlX19PcE11bHRpQXNzaWduX19Hcm91cF82X18wICkgKQotICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyOTk3OjM6ICggcnVsZV9fT3BNdWx0aUFzc2lnbl9fR3JvdXBfNl9fMCApCisgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjMxNDk6MjogKCAoIHJ1bGVfX09wTXVsdGlBc3NpZ25fX0dyb3VwXzZfXzAgKSApCisgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjMxNTA6MzogKCBydWxlX19PcE11bHRpQXNzaWduX19Hcm91cF82X18wICkKICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0T3BNdWx0aUFzc2lnbkFjY2VzcygpLmdldEdyb3VwXzYoKSk7IAogICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI5OTg6MzogKCBydWxlX19PcE11bHRpQXNzaWduX19Hcm91cF82X18wICkKLSAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6Mjk5ODo0OiBydWxlX19PcE11bHRpQXNzaWduX19Hcm91cF82X18wCisgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjMxNTE6MzogKCBydWxlX19PcE11bHRpQXNzaWduX19Hcm91cF82X18wICkKKyAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MzE1MTo0OiBydWxlX19PcE11bHRpQXNzaWduX19Hcm91cF82X18wCiAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMik7CiAgICAgICAgICAgICAgICAgICAgIHJ1bGVfX09wTXVsdGlBc3NpZ25fX0dyb3VwXzZfXzAoKTsKQEAgLTEwNTU0LDQ5ICsxMTExMCw0OSBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX09wRXF1YWxpdHlfX0FsdGVybmF0aXZlcyIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzozMDA2OjE6IHJ1bGVfX09wRXF1YWxpdHlfX0FsdGVybmF0aXZlcyA6ICggKCAnPT0nICkgfCAoICchPScgKSB8ICggJz09PScgKSB8ICggJyE9PScgKSApOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjMxNTk6MTogcnVsZV9fT3BFcXVhbGl0eV9fQWx0ZXJuYXRpdmVzIDogKCAoICc9PScgKSB8ICggJyE9JyApIHwgKCAnPT09JyApIHwgKCAnIT09JyApICk7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fT3BFcXVhbGl0eV9fQWx0ZXJuYXRpdmVzKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjMwMTA6MTogKCAoICc9PScgKSB8ICggJyE9JyApIHwgKCAnPT09JyApIHwgKCAnIT09JyApICkKLSAgICAgICAgICAgIGludCBhbHQxND00OworICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MzE2MzoxOiAoICggJz09JyApIHwgKCAnIT0nICkgfCAoICc9PT0nICkgfCAoICchPT0nICkgKQorICAgICAgICAgICAgaW50IGFsdDE1PTQ7CiAgICAgICAgICAgICBzd2l0Y2ggKCBpbnB1dC5MQSgxKSApIHsKICAgICAgICAgICAgIGNhc2UgMjE6CiAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGFsdDE0PTE7CisgICAgICAgICAgICAgICAgYWx0MTU9MTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICBjYXNlIDIyOgogICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBhbHQxND0yOworICAgICAgICAgICAgICAgIGFsdDE1PTI7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgY2FzZSAyMzoKICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgYWx0MTQ9MzsKKyAgICAgICAgICAgICAgICBhbHQxNT0zOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIGNhc2UgMjQ6CiAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGFsdDE0PTQ7CisgICAgICAgICAgICAgICAgYWx0MTU9NDsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgICAgIGlmIChzdGF0ZS5iYWNrdHJhY2tpbmc+MCkge3N0YXRlLmZhaWxlZD10cnVlOyByZXR1cm4gO30KICAgICAgICAgICAgICAgICBOb1ZpYWJsZUFsdEV4Y2VwdGlvbiBudmFlID0KLSAgICAgICAgICAgICAgICAgICAgbmV3IE5vVmlhYmxlQWx0RXhjZXB0aW9uKCIiLCAxNCwgMCwgaW5wdXQpOworICAgICAgICAgICAgICAgICAgICBuZXcgTm9WaWFibGVBbHRFeGNlcHRpb24oIiIsIDE1LCAwLCBpbnB1dCk7CiAKICAgICAgICAgICAgICAgICB0aHJvdyBudmFlOwogICAgICAgICAgICAgfQogCi0gICAgICAgICAgICBzd2l0Y2ggKGFsdDE0KSB7CisgICAgICAgICAgICBzd2l0Y2ggKGFsdDE1KSB7CiAgICAgICAgICAgICAgICAgY2FzZSAxIDoKLSAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MzAxMToyOiAoICc9PScgKQorICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzozMTY0OjI6ICggJz09JyApCiAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MzAxMToyOiAoICc9PScgKQotICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzozMDEyOjM6ICc9PScKKyAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MzE2NDoyOiAoICc9PScgKQorICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzozMTY1OjM6ICc9PScKICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0T3BFcXVhbGl0eUFjY2VzcygpLmdldEVxdWFsc1NpZ25FcXVhbHNTaWduS2V5d29yZF8wKCkpOyAKQEAgLTEwNjEyLDEwICsxMTE2OCwxMCBAQAogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgIGNhc2UgMiA6Ci0gICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjMwMTc6MjogKCAnIT0nICkKKyAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MzE3MDoyOiAoICchPScgKQogICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjMwMTc6MjogKCAnIT0nICkKLSAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MzAxODozOiAnIT0nCisgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjMxNzA6MjogKCAnIT0nICkKKyAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MzE3MTozOiAnIT0nCiAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldE9wRXF1YWxpdHlBY2Nlc3MoKS5nZXRFeGNsYW1hdGlvbk1hcmtFcXVhbHNTaWduS2V5d29yZF8xKCkpOyAKQEAgLTEwNjMxLDEwICsxMTE4NywxMCBAQAogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgIGNhc2UgMyA6Ci0gICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjMwMjM6MjogKCAnPT09JyApCisgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjMxNzY6MjogKCAnPT09JyApCiAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MzAyMzoyOiAoICc9PT0nICkKLSAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MzAyNDozOiAnPT09JworICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzozMTc2OjI6ICggJz09PScgKQorICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzozMTc3OjM6ICc9PT0nCiAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldE9wRXF1YWxpdHlBY2Nlc3MoKS5nZXRFcXVhbHNTaWduRXF1YWxzU2lnbkVxdWFsc1NpZ25LZXl3b3JkXzIoKSk7IApAQCAtMTA2NTAsMTAgKzExMjA2LDEwIEBACiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgY2FzZSA0IDoKLSAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MzAyOToyOiAoICchPT0nICkKKyAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MzE4MjoyOiAoICchPT0nICkKICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzozMDI5OjI6ICggJyE9PScgKQotICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzozMDMwOjM6ICchPT0nCisgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjMxODI6MjogKCAnIT09JyApCisgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjMxODM6MzogJyE9PScKICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0T3BFcXVhbGl0eUFjY2VzcygpLmdldEV4Y2xhbWF0aW9uTWFya0VxdWFsc1NpZ25FcXVhbHNTaWduS2V5d29yZF8zKCkpOyAKQEAgLTEwNjg2LDQxICsxMTI0Miw0MSBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX1hSZWxhdGlvbmFsRXhwcmVzc2lvbl9fQWx0ZXJuYXRpdmVzXzEiCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MzAzOToxOiBydWxlX19YUmVsYXRpb25hbEV4cHJlc3Npb25fX0FsdGVybmF0aXZlc18xIDogKCAoICggcnVsZV9fWFJlbGF0aW9uYWxFeHByZXNzaW9uX19Hcm91cF8xXzBfXzAgKSApIHwgKCAoIHJ1bGVfX1hSZWxhdGlvbmFsRXhwcmVzc2lvbl9fR3JvdXBfMV8xX18wICkgKSApOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjMxOTI6MTogcnVsZV9fWFJlbGF0aW9uYWxFeHByZXNzaW9uX19BbHRlcm5hdGl2ZXNfMSA6ICggKCAoIHJ1bGVfX1hSZWxhdGlvbmFsRXhwcmVzc2lvbl9fR3JvdXBfMV8wX18wICkgKSB8ICggKCBydWxlX19YUmVsYXRpb25hbEV4cHJlc3Npb25fX0dyb3VwXzFfMV9fMCApICkgKTsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YUmVsYXRpb25hbEV4cHJlc3Npb25fX0FsdGVybmF0aXZlc18xKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjMwNDM6MTogKCAoICggcnVsZV9fWFJlbGF0aW9uYWxFeHByZXNzaW9uX19Hcm91cF8xXzBfXzAgKSApIHwgKCAoIHJ1bGVfX1hSZWxhdGlvbmFsRXhwcmVzc2lvbl9fR3JvdXBfMV8xX18wICkgKSApCi0gICAgICAgICAgICBpbnQgYWx0MTU9MjsKLSAgICAgICAgICAgIGludCBMQTE1XzAgPSBpbnB1dC5MQSgxKTsKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjMxOTY6MTogKCAoICggcnVsZV9fWFJlbGF0aW9uYWxFeHByZXNzaW9uX19Hcm91cF8xXzBfXzAgKSApIHwgKCAoIHJ1bGVfX1hSZWxhdGlvbmFsRXhwcmVzc2lvbl9fR3JvdXBfMV8xX18wICkgKSApCisgICAgICAgICAgICBpbnQgYWx0MTY9MjsKKyAgICAgICAgICAgIGludCBMQTE2XzAgPSBpbnB1dC5MQSgxKTsKIAotICAgICAgICAgICAgaWYgKCAoTEExNV8wPT0xMTkpICkgewotICAgICAgICAgICAgICAgIGFsdDE1PTE7CisgICAgICAgICAgICBpZiAoIChMQTE2XzA9PTEyOSkgKSB7CisgICAgICAgICAgICAgICAgYWx0MTY9MTsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgaWYgKCAoKExBMTVfMD49MjUgJiYgTEExNV8wPD0yNykpICkgewotICAgICAgICAgICAgICAgIGFsdDE1PTI7CisgICAgICAgICAgICBlbHNlIGlmICggKChMQTE2XzA+PTI1ICYmIExBMTZfMDw9MjcpKSApIHsKKyAgICAgICAgICAgICAgICBhbHQxNj0yOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgaWYgKHN0YXRlLmJhY2t0cmFja2luZz4wKSB7c3RhdGUuZmFpbGVkPXRydWU7IHJldHVybiA7fQogICAgICAgICAgICAgICAgIE5vVmlhYmxlQWx0RXhjZXB0aW9uIG52YWUgPQotICAgICAgICAgICAgICAgICAgICBuZXcgTm9WaWFibGVBbHRFeGNlcHRpb24oIiIsIDE1LCAwLCBpbnB1dCk7CisgICAgICAgICAgICAgICAgICAgIG5ldyBOb1ZpYWJsZUFsdEV4Y2VwdGlvbigiIiwgMTYsIDAsIGlucHV0KTsKIAogICAgICAgICAgICAgICAgIHRocm93IG52YWU7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBzd2l0Y2ggKGFsdDE1KSB7CisgICAgICAgICAgICBzd2l0Y2ggKGFsdDE2KSB7CiAgICAgICAgICAgICAgICAgY2FzZSAxIDoKLSAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MzA0NDoyOiAoICggcnVsZV9fWFJlbGF0aW9uYWxFeHByZXNzaW9uX19Hcm91cF8xXzBfXzAgKSApCisgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjMxOTc6MjogKCAoIHJ1bGVfX1hSZWxhdGlvbmFsRXhwcmVzc2lvbl9fR3JvdXBfMV8wX18wICkgKQogICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjMwNDQ6MjogKCAoIHJ1bGVfX1hSZWxhdGlvbmFsRXhwcmVzc2lvbl9fR3JvdXBfMV8wX18wICkgKQotICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzozMDQ1OjM6ICggcnVsZV9fWFJlbGF0aW9uYWxFeHByZXNzaW9uX19Hcm91cF8xXzBfXzAgKQorICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzozMTk3OjI6ICggKCBydWxlX19YUmVsYXRpb25hbEV4cHJlc3Npb25fX0dyb3VwXzFfMF9fMCApICkKKyAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MzE5ODozOiAoIHJ1bGVfX1hSZWxhdGlvbmFsRXhwcmVzc2lvbl9fR3JvdXBfMV8wX18wICkKICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WFJlbGF0aW9uYWxFeHByZXNzaW9uQWNjZXNzKCkuZ2V0R3JvdXBfMV8wKCkpOyAKICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzozMDQ2OjM6ICggcnVsZV9fWFJlbGF0aW9uYWxFeHByZXNzaW9uX19Hcm91cF8xXzBfXzAgKQotICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzozMDQ2OjQ6IHJ1bGVfX1hSZWxhdGlvbmFsRXhwcmVzc2lvbl9fR3JvdXBfMV8wX18wCisgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjMxOTk6MzogKCBydWxlX19YUmVsYXRpb25hbEV4cHJlc3Npb25fX0dyb3VwXzFfMF9fMCApCisgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjMxOTk6NDogcnVsZV9fWFJlbGF0aW9uYWxFeHByZXNzaW9uX19Hcm91cF8xXzBfXzAKICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV18yKTsKICAgICAgICAgICAgICAgICAgICAgcnVsZV9fWFJlbGF0aW9uYWxFeHByZXNzaW9uX19Hcm91cF8xXzBfXzAoKTsKQEAgLTEwNzQwLDE2ICsxMTI5NiwxNiBAQAogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgIGNhc2UgMiA6Ci0gICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjMwNTA6MjogKCAoIHJ1bGVfX1hSZWxhdGlvbmFsRXhwcmVzc2lvbl9fR3JvdXBfMV8xX18wICkgKQorICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzozMjAzOjI6ICggKCBydWxlX19YUmVsYXRpb25hbEV4cHJlc3Npb25fX0dyb3VwXzFfMV9fMCApICkKICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzozMDUwOjI6ICggKCBydWxlX19YUmVsYXRpb25hbEV4cHJlc3Npb25fX0dyb3VwXzFfMV9fMCApICkKLSAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MzA1MTozOiAoIHJ1bGVfX1hSZWxhdGlvbmFsRXhwcmVzc2lvbl9fR3JvdXBfMV8xX18wICkKKyAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MzIwMzoyOiAoICggcnVsZV9fWFJlbGF0aW9uYWxFeHByZXNzaW9uX19Hcm91cF8xXzFfXzAgKSApCisgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjMyMDQ6MzogKCBydWxlX19YUmVsYXRpb25hbEV4cHJlc3Npb25fX0dyb3VwXzFfMV9fMCApCiAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhSZWxhdGlvbmFsRXhwcmVzc2lvbkFjY2VzcygpLmdldEdyb3VwXzFfMSgpKTsgCiAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MzA1MjozOiAoIHJ1bGVfX1hSZWxhdGlvbmFsRXhwcmVzc2lvbl9fR3JvdXBfMV8xX18wICkKLSAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MzA1Mjo0OiBydWxlX19YUmVsYXRpb25hbEV4cHJlc3Npb25fX0dyb3VwXzFfMV9fMAorICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzozMjA1OjM6ICggcnVsZV9fWFJlbGF0aW9uYWxFeHByZXNzaW9uX19Hcm91cF8xXzFfXzAgKQorICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzozMjA1OjQ6IHJ1bGVfX1hSZWxhdGlvbmFsRXhwcmVzc2lvbl9fR3JvdXBfMV8xX18wCiAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMik7CiAgICAgICAgICAgICAgICAgICAgIHJ1bGVfX1hSZWxhdGlvbmFsRXhwcmVzc2lvbl9fR3JvdXBfMV8xX18wKCk7CkBAIC0xMDc4NiwzNCArMTEzNDIsMzQgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19PcENvbXBhcmVfX0FsdGVybmF0aXZlcyIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzozMDYwOjE6IHJ1bGVfX09wQ29tcGFyZV9fQWx0ZXJuYXRpdmVzIDogKCAoICc+PScgKSB8ICggKCBydWxlX19PcENvbXBhcmVfX0dyb3VwXzFfXzAgKSApIHwgKCAnPicgKSB8ICggJzwnICkgKTsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzozMjEzOjE6IHJ1bGVfX09wQ29tcGFyZV9fQWx0ZXJuYXRpdmVzIDogKCAoICc+PScgKSB8ICggKCBydWxlX19PcENvbXBhcmVfX0dyb3VwXzFfXzAgKSApIHwgKCAnPicgKSB8ICggJzwnICkgKTsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19PcENvbXBhcmVfX0FsdGVybmF0aXZlcygpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzozMDY0OjE6ICggKCAnPj0nICkgfCAoICggcnVsZV9fT3BDb21wYXJlX19Hcm91cF8xX18wICkgKSB8ICggJz4nICkgfCAoICc8JyApICkKLSAgICAgICAgICAgIGludCBhbHQxNj00OworICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MzIxNzoxOiAoICggJz49JyApIHwgKCAoIHJ1bGVfX09wQ29tcGFyZV9fR3JvdXBfMV9fMCApICkgfCAoICc+JyApIHwgKCAnPCcgKSApCisgICAgICAgICAgICBpbnQgYWx0MTc9NDsKICAgICAgICAgICAgIHN3aXRjaCAoIGlucHV0LkxBKDEpICkgewogICAgICAgICAgICAgY2FzZSAyNToKICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgYWx0MTY9MTsKKyAgICAgICAgICAgICAgICBhbHQxNz0xOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIGNhc2UgMjc6CiAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGludCBMQTE2XzIgPSBpbnB1dC5MQSgyKTsKKyAgICAgICAgICAgICAgICBpbnQgTEExN18yID0gaW5wdXQuTEEoMik7CiAKLSAgICAgICAgICAgICAgICBpZiAoIChMQTE2XzI9PTEzKSApIHsKLSAgICAgICAgICAgICAgICAgICAgYWx0MTY9MjsKKyAgICAgICAgICAgICAgICBpZiAoIChMQTE3XzI9PUVPRnx8KExBMTdfMj49UlVMRV9TVFJJTkcgJiYgTEExN18yPD1SVUxFX0RFQ0lNQUwpfHxMQTE3XzI9PTI3fHwoTEExN18yPj0zNCAmJiBMQTE3XzI8PTM1KXx8TEExN18yPT00MHx8KExBMTdfMj49NDUgJiYgTEExN18yPD01MCl8fExBMTdfMj09NzV8fExBMTdfMj09MTAyfHxMQTE3XzI9PTEyM3x8KExBMTdfMj49MTI3ICYmIExBMTdfMjw9MTI4KXx8TEExN18yPT0xMzB8fExBMTdfMj09MTMyfHwoTEExN18yPj0xMzYgJiYgTEExN18yPD0xNDMpfHxMQTE3XzI9PTE0NXx8TEExN18yPT0xNjYpICkgeworICAgICAgICAgICAgICAgICAgICBhbHQxNz00OwogICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlIGlmICggKExBMTZfMj09RU9GfHwoTEExNl8yPj1SVUxFX1NUUklORyAmJiBMQTE2XzI8PVJVTEVfREVDSU1BTCl8fExBMTZfMj09Mjd8fChMQTE2XzI+PTM0ICYmIExBMTZfMjw9MzUpfHxMQTE2XzI9PTQwfHwoTEExNl8yPj00NSAmJiBMQTE2XzI8PTUwKXx8TEExNl8yPT03MHx8TEExNl8yPT05NXx8TEExNl8yPT0xMTN8fChMQTE2XzI+PTExNyAmJiBMQTE2XzI8PTExOCl8fExBMTZfMj09MTIwfHxMQTE2XzI9PTEyMnx8KExBMTZfMj49MTI2ICYmIExBMTZfMjw9MTMzKXx8TEExNl8yPT0xMzV8fExBMTZfMj09MTU0KSApIHsKLSAgICAgICAgICAgICAgICAgICAgYWx0MTY9NDsKKyAgICAgICAgICAgICAgICBlbHNlIGlmICggKExBMTdfMj09MTMpICkgeworICAgICAgICAgICAgICAgICAgICBhbHQxNz0yOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgaWYgKHN0YXRlLmJhY2t0cmFja2luZz4wKSB7c3RhdGUuZmFpbGVkPXRydWU7IHJldHVybiA7fQogICAgICAgICAgICAgICAgICAgICBOb1ZpYWJsZUFsdEV4Y2VwdGlvbiBudmFlID0KLSAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBOb1ZpYWJsZUFsdEV4Y2VwdGlvbigiIiwgMTYsIDIsIGlucHV0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBOb1ZpYWJsZUFsdEV4Y2VwdGlvbigiIiwgMTcsIDIsIGlucHV0KTsKIAogICAgICAgICAgICAgICAgICAgICB0aHJvdyBudmFlOwogICAgICAgICAgICAgICAgIH0KQEAgLTEwODIxLDIzICsxMTM3NywyMyBAQAogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgY2FzZSAyNjoKICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgYWx0MTY9MzsKKyAgICAgICAgICAgICAgICBhbHQxNz0zOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICAgICAgaWYgKHN0YXRlLmJhY2t0cmFja2luZz4wKSB7c3RhdGUuZmFpbGVkPXRydWU7IHJldHVybiA7fQogICAgICAgICAgICAgICAgIE5vVmlhYmxlQWx0RXhjZXB0aW9uIG52YWUgPQotICAgICAgICAgICAgICAgICAgICBuZXcgTm9WaWFibGVBbHRFeGNlcHRpb24oIiIsIDE2LCAwLCBpbnB1dCk7CisgICAgICAgICAgICAgICAgICAgIG5ldyBOb1ZpYWJsZUFsdEV4Y2VwdGlvbigiIiwgMTcsIDAsIGlucHV0KTsKIAogICAgICAgICAgICAgICAgIHRocm93IG52YWU7CiAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgIHN3aXRjaCAoYWx0MTYpIHsKKyAgICAgICAgICAgIHN3aXRjaCAoYWx0MTcpIHsKICAgICAgICAgICAgICAgICBjYXNlIDEgOgotICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzozMDY1OjI6ICggJz49JyApCisgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjMyMTg6MjogKCAnPj0nICkKICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzozMDY1OjI6ICggJz49JyApCi0gICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjMwNjY6MzogJz49JworICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzozMjE4OjI6ICggJz49JyApCisgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjMyMTk6MzogJz49JwogICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRPcENvbXBhcmVBY2Nlc3MoKS5nZXRHcmVhdGVyVGhhblNpZ25FcXVhbHNTaWduS2V5d29yZF8wKCkpOyAKQEAgLTEwODUzLDE2ICsxMTQwOSwxNiBAQAogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgIGNhc2UgMiA6Ci0gICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjMwNzE6MjogKCAoIHJ1bGVfX09wQ29tcGFyZV9fR3JvdXBfMV9fMCApICkKKyAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MzIyNDoyOiAoICggcnVsZV9fT3BDb21wYXJlX19Hcm91cF8xX18wICkgKQogICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjMwNzE6MjogKCAoIHJ1bGVfX09wQ29tcGFyZV9fR3JvdXBfMV9fMCApICkKLSAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MzA3MjozOiAoIHJ1bGVfX09wQ29tcGFyZV9fR3JvdXBfMV9fMCApCisgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjMyMjQ6MjogKCAoIHJ1bGVfX09wQ29tcGFyZV9fR3JvdXBfMV9fMCApICkKKyAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MzIyNTozOiAoIHJ1bGVfX09wQ29tcGFyZV9fR3JvdXBfMV9fMCApCiAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldE9wQ29tcGFyZUFjY2VzcygpLmdldEdyb3VwXzEoKSk7IAogICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjMwNzM6MzogKCBydWxlX19PcENvbXBhcmVfX0dyb3VwXzFfXzAgKQotICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzozMDczOjQ6IHJ1bGVfX09wQ29tcGFyZV9fR3JvdXBfMV9fMAorICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzozMjI2OjM6ICggcnVsZV9fT3BDb21wYXJlX19Hcm91cF8xX18wICkKKyAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MzIyNjo0OiBydWxlX19PcENvbXBhcmVfX0dyb3VwXzFfXzAKICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV18yKTsKICAgICAgICAgICAgICAgICAgICAgcnVsZV9fT3BDb21wYXJlX19Hcm91cF8xX18wKCk7CkBAIC0xMDg4MiwxMCArMTE0MzgsMTAgQEAKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICBjYXNlIDMgOgotICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzozMDc3OjI6ICggJz4nICkKKyAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MzIzMDoyOiAoICc+JyApCiAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MzA3NzoyOiAoICc+JyApCi0gICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjMwNzg6MzogJz4nCisgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjMyMzA6MjogKCAnPicgKQorICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzozMjMxOjM6ICc+JwogICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRPcENvbXBhcmVBY2Nlc3MoKS5nZXRHcmVhdGVyVGhhblNpZ25LZXl3b3JkXzIoKSk7IApAQCAtMTA5MDEsMTAgKzExNDU3LDEwIEBACiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgY2FzZSA0IDoKLSAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MzA4MzoyOiAoICc8JyApCisgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjMyMzY6MjogKCAnPCcgKQogICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjMwODM6MjogKCAnPCcgKQotICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzozMDg0OjM6ICc8JworICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzozMjM2OjI6ICggJzwnICkKKyAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MzIzNzozOiAnPCcKICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0T3BDb21wYXJlQWNjZXNzKCkuZ2V0TGVzc1RoYW5TaWduS2V5d29yZF8zKCkpOyAKQEAgLTEwOTM3LDIxICsxMTQ5MywyMSBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX09wT3RoZXJfX0FsdGVybmF0aXZlcyIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzozMDkzOjE6IHJ1bGVfX09wT3RoZXJfX0FsdGVybmF0aXZlcyA6ICggKCAnLT4nICkgfCAoICcuLjwnICkgfCAoICggcnVsZV9fT3BPdGhlcl9fR3JvdXBfMl9fMCApICkgfCAoICcuLicgKSB8ICggJz0+JyApIHwgKCAoIHJ1bGVfX09wT3RoZXJfX0dyb3VwXzVfXzAgKSApIHwgKCAoIHJ1bGVfX09wT3RoZXJfX0dyb3VwXzZfXzAgKSApIHwgKCAnPD4nICkgfCAoICc/OicgKSApOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjMyNDY6MTogcnVsZV9fT3BPdGhlcl9fQWx0ZXJuYXRpdmVzIDogKCAoICctPicgKSB8ICggJy4uPCcgKSB8ICggKCBydWxlX19PcE90aGVyX19Hcm91cF8yX18wICkgKSB8ICggJy4uJyApIHwgKCAnPT4nICkgfCAoICggcnVsZV9fT3BPdGhlcl9fR3JvdXBfNV9fMCApICkgfCAoICggcnVsZV9fT3BPdGhlcl9fR3JvdXBfNl9fMCApICkgfCAoICc8PicgKSB8ICggJz86JyApICk7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fT3BPdGhlcl9fQWx0ZXJuYXRpdmVzKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjMwOTc6MTogKCAoICctPicgKSB8ICggJy4uPCcgKSB8ICggKCBydWxlX19PcE90aGVyX19Hcm91cF8yX18wICkgKSB8ICggJy4uJyApIHwgKCAnPT4nICkgfCAoICggcnVsZV9fT3BPdGhlcl9fR3JvdXBfNV9fMCApICkgfCAoICggcnVsZV9fT3BPdGhlcl9fR3JvdXBfNl9fMCApICkgfCAoICc8PicgKSB8ICggJz86JyApICkKLSAgICAgICAgICAgIGludCBhbHQxNz05OwotICAgICAgICAgICAgYWx0MTcgPSBkZmExNy5wcmVkaWN0KGlucHV0KTsKLSAgICAgICAgICAgIHN3aXRjaCAoYWx0MTcpIHsKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjMyNTA6MTogKCAoICctPicgKSB8ICggJy4uPCcgKSB8ICggKCBydWxlX19PcE90aGVyX19Hcm91cF8yX18wICkgKSB8ICggJy4uJyApIHwgKCAnPT4nICkgfCAoICggcnVsZV9fT3BPdGhlcl9fR3JvdXBfNV9fMCApICkgfCAoICggcnVsZV9fT3BPdGhlcl9fR3JvdXBfNl9fMCApICkgfCAoICc8PicgKSB8ICggJz86JyApICkKKyAgICAgICAgICAgIGludCBhbHQxOD05OworICAgICAgICAgICAgYWx0MTggPSBkZmExOC5wcmVkaWN0KGlucHV0KTsKKyAgICAgICAgICAgIHN3aXRjaCAoYWx0MTgpIHsKICAgICAgICAgICAgICAgICBjYXNlIDEgOgotICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzozMDk4OjI6ICggJy0+JyApCisgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjMyNTE6MjogKCAnLT4nICkKICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzozMDk4OjI6ICggJy0+JyApCi0gICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjMwOTk6MzogJy0+JworICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzozMjUxOjI6ICggJy0+JyApCisgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjMyNTI6MzogJy0+JwogICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRPcE90aGVyQWNjZXNzKCkuZ2V0SHlwaGVuTWludXNHcmVhdGVyVGhhblNpZ25LZXl3b3JkXzAoKSk7IApAQCAtMTA5NjcsMTAgKzExNTIzLDEwIEBACiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgY2FzZSAyIDoKLSAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MzEwNDoyOiAoICcuLjwnICkKKyAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MzI1NzoyOiAoICcuLjwnICkKICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzozMTA0OjI6ICggJy4uPCcgKQotICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzozMTA1OjM6ICcuLjwnCisgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjMyNTc6MjogKCAnLi48JyApCisgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjMyNTg6MzogJy4uPCcKICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0T3BPdGhlckFjY2VzcygpLmdldEZ1bGxTdG9wRnVsbFN0b3BMZXNzVGhhblNpZ25LZXl3b3JkXzEoKSk7IApAQCAtMTA5ODYsMTYgKzExNTQyLDE2IEBACiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgY2FzZSAzIDoKLSAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MzExMDoyOiAoICggcnVsZV9fT3BPdGhlcl9fR3JvdXBfMl9fMCApICkKKyAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MzI2MzoyOiAoICggcnVsZV9fT3BPdGhlcl9fR3JvdXBfMl9fMCApICkKICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzozMTEwOjI6ICggKCBydWxlX19PcE90aGVyX19Hcm91cF8yX18wICkgKQotICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzozMTExOjM6ICggcnVsZV9fT3BPdGhlcl9fR3JvdXBfMl9fMCApCisgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjMyNjM6MjogKCAoIHJ1bGVfX09wT3RoZXJfX0dyb3VwXzJfXzAgKSApCisgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjMyNjQ6MzogKCBydWxlX19PcE90aGVyX19Hcm91cF8yX18wICkKICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0T3BPdGhlckFjY2VzcygpLmdldEdyb3VwXzIoKSk7IAogICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjMxMTI6MzogKCBydWxlX19PcE90aGVyX19Hcm91cF8yX18wICkKLSAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MzExMjo0OiBydWxlX19PcE90aGVyX19Hcm91cF8yX18wCisgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjMyNjU6MzogKCBydWxlX19PcE90aGVyX19Hcm91cF8yX18wICkKKyAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MzI2NTo0OiBydWxlX19PcE90aGVyX19Hcm91cF8yX18wCiAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMik7CiAgICAgICAgICAgICAgICAgICAgIHJ1bGVfX09wT3RoZXJfX0dyb3VwXzJfXzAoKTsKQEAgLTExMDE1LDEwICsxMTU3MSwxMCBAQAogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgIGNhc2UgNCA6Ci0gICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjMxMTY6MjogKCAnLi4nICkKKyAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MzI2OToyOiAoICcuLicgKQogICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjMxMTY6MjogKCAnLi4nICkKLSAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MzExNzozOiAnLi4nCisgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjMyNjk6MjogKCAnLi4nICkKKyAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MzI3MDozOiAnLi4nCiAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldE9wT3RoZXJBY2Nlc3MoKS5nZXRGdWxsU3RvcEZ1bGxTdG9wS2V5d29yZF8zKCkpOyAKQEAgLTExMDM0LDEwICsxMTU5MCwxMCBAQAogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgIGNhc2UgNSA6Ci0gICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjMxMjI6MjogKCAnPT4nICkKKyAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MzI3NToyOiAoICc9PicgKQogICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjMxMjI6MjogKCAnPT4nICkKLSAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MzEyMzozOiAnPT4nCisgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjMyNzU6MjogKCAnPT4nICkKKyAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MzI3NjozOiAnPT4nCiAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldE9wT3RoZXJBY2Nlc3MoKS5nZXRFcXVhbHNTaWduR3JlYXRlclRoYW5TaWduS2V5d29yZF80KCkpOyAKQEAgLTExMDUzLDE2ICsxMTYwOSwxNiBAQAogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgIGNhc2UgNiA6Ci0gICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjMxMjg6MjogKCAoIHJ1bGVfX09wT3RoZXJfX0dyb3VwXzVfXzAgKSApCisgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjMyODE6MjogKCAoIHJ1bGVfX09wT3RoZXJfX0dyb3VwXzVfXzAgKSApCiAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MzEyODoyOiAoICggcnVsZV9fT3BPdGhlcl9fR3JvdXBfNV9fMCApICkKLSAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MzEyOTozOiAoIHJ1bGVfX09wT3RoZXJfX0dyb3VwXzVfXzAgKQorICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzozMjgxOjI6ICggKCBydWxlX19PcE90aGVyX19Hcm91cF81X18wICkgKQorICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzozMjgyOjM6ICggcnVsZV9fT3BPdGhlcl9fR3JvdXBfNV9fMCApCiAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldE9wT3RoZXJBY2Nlc3MoKS5nZXRHcm91cF81KCkpOyAKICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzozMTMwOjM6ICggcnVsZV9fT3BPdGhlcl9fR3JvdXBfNV9fMCApCi0gICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjMxMzA6NDogcnVsZV9fT3BPdGhlcl9fR3JvdXBfNV9fMAorICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzozMjgzOjM6ICggcnVsZV9fT3BPdGhlcl9fR3JvdXBfNV9fMCApCisgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjMyODM6NDogcnVsZV9fT3BPdGhlcl9fR3JvdXBfNV9fMAogICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzIpOwogICAgICAgICAgICAgICAgICAgICBydWxlX19PcE90aGVyX19Hcm91cF81X18wKCk7CkBAIC0xMTA4MiwxNiArMTE2MzgsMTYgQEAKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICBjYXNlIDcgOgotICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzozMTM0OjI6ICggKCBydWxlX19PcE90aGVyX19Hcm91cF82X18wICkgKQorICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzozMjg3OjI6ICggKCBydWxlX19PcE90aGVyX19Hcm91cF82X18wICkgKQogICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjMxMzQ6MjogKCAoIHJ1bGVfX09wT3RoZXJfX0dyb3VwXzZfXzAgKSApCi0gICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjMxMzU6MzogKCBydWxlX19PcE90aGVyX19Hcm91cF82X18wICkKKyAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MzI4NzoyOiAoICggcnVsZV9fT3BPdGhlcl9fR3JvdXBfNl9fMCApICkKKyAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MzI4ODozOiAoIHJ1bGVfX09wT3RoZXJfX0dyb3VwXzZfXzAgKQogICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRPcE90aGVyQWNjZXNzKCkuZ2V0R3JvdXBfNigpKTsgCiAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MzEzNjozOiAoIHJ1bGVfX09wT3RoZXJfX0dyb3VwXzZfXzAgKQotICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzozMTM2OjQ6IHJ1bGVfX09wT3RoZXJfX0dyb3VwXzZfXzAKKyAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MzI4OTozOiAoIHJ1bGVfX09wT3RoZXJfX0dyb3VwXzZfXzAgKQorICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzozMjg5OjQ6IHJ1bGVfX09wT3RoZXJfX0dyb3VwXzZfXzAKICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV18yKTsKICAgICAgICAgICAgICAgICAgICAgcnVsZV9fT3BPdGhlcl9fR3JvdXBfNl9fMCgpOwpAQCAtMTExMTEsMTAgKzExNjY3LDEwIEBACiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgY2FzZSA4IDoKLSAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MzE0MDoyOiAoICc8PicgKQorICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzozMjkzOjI6ICggJzw+JyApCiAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MzE0MDoyOiAoICc8PicgKQotICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzozMTQxOjM6ICc8PicKKyAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MzI5MzoyOiAoICc8PicgKQorICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzozMjk0OjM6ICc8PicKICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0T3BPdGhlckFjY2VzcygpLmdldExlc3NUaGFuU2lnbkdyZWF0ZXJUaGFuU2lnbktleXdvcmRfNygpKTsgCkBAIC0xMTEzMCwxMCArMTE2ODYsMTAgQEAKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICBjYXNlIDkgOgotICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzozMTQ2OjI6ICggJz86JyApCisgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjMyOTk6MjogKCAnPzonICkKICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzozMTQ2OjI6ICggJz86JyApCi0gICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjMxNDc6MzogJz86JworICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzozMjk5OjI6ICggJz86JyApCisgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjMzMDA6MzogJz86JwogICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRPcE90aGVyQWNjZXNzKCkuZ2V0UXVlc3Rpb25NYXJrQ29sb25LZXl3b3JkXzgoKSk7IApAQCAtMTExNjYsMjkgKzExNzIyLDI5IEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fT3BPdGhlcl9fQWx0ZXJuYXRpdmVzXzVfMSIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzozMTU2OjE6IHJ1bGVfX09wT3RoZXJfX0FsdGVybmF0aXZlc181XzEgOiAoICggKCBydWxlX19PcE90aGVyX19Hcm91cF81XzFfMF9fMCApICkgfCAoICc+JyApICk7CisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MzMwOToxOiBydWxlX19PcE90aGVyX19BbHRlcm5hdGl2ZXNfNV8xIDogKCAoICggcnVsZV9fT3BPdGhlcl9fR3JvdXBfNV8xXzBfXzAgKSApIHwgKCAnPicgKSApOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX09wT3RoZXJfX0FsdGVybmF0aXZlc181XzEoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MzE2MDoxOiAoICggKCBydWxlX19PcE90aGVyX19Hcm91cF81XzFfMF9fMCApICkgfCAoICc+JyApICkKLSAgICAgICAgICAgIGludCBhbHQxOD0yOwotICAgICAgICAgICAgaW50IExBMThfMCA9IGlucHV0LkxBKDEpOworICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MzMxMzoxOiAoICggKCBydWxlX19PcE90aGVyX19Hcm91cF81XzFfMF9fMCApICkgfCAoICc+JyApICkKKyAgICAgICAgICAgIGludCBhbHQxOT0yOworICAgICAgICAgICAgaW50IExBMTlfMCA9IGlucHV0LkxBKDEpOwogCi0gICAgICAgICAgICBpZiAoIChMQTE4XzA9PTI2KSApIHsKLSAgICAgICAgICAgICAgICBpbnQgTEExOF8xID0gaW5wdXQuTEEoMik7CisgICAgICAgICAgICBpZiAoIChMQTE5XzA9PTI2KSApIHsKKyAgICAgICAgICAgICAgICBpbnQgTEExOV8xID0gaW5wdXQuTEEoMik7CiAKLSAgICAgICAgICAgICAgICBpZiAoIChMQTE4XzE9PTI2KSApIHsKLSAgICAgICAgICAgICAgICAgICAgYWx0MTg9MTsKKyAgICAgICAgICAgICAgICBpZiAoIChMQTE5XzE9PUVPRnx8KExBMTlfMT49UlVMRV9TVFJJTkcgJiYgTEExOV8xPD1SVUxFX0RFQ0lNQUwpfHxMQTE5XzE9PTI3fHwoTEExOV8xPj0zNCAmJiBMQTE5XzE8PTM1KXx8TEExOV8xPT00MHx8KExBMTlfMT49NDUgJiYgTEExOV8xPD01MCl8fExBMTlfMT09NzV8fExBMTlfMT09MTAyfHxMQTE5XzE9PTEyM3x8KExBMTlfMT49MTI3ICYmIExBMTlfMTw9MTI4KXx8TEExOV8xPT0xMzB8fExBMTlfMT09MTMyfHwoTEExOV8xPj0xMzYgJiYgTEExOV8xPD0xNDMpfHxMQTE5XzE9PTE0NXx8TEExOV8xPT0xNjYpICkgeworICAgICAgICAgICAgICAgICAgICBhbHQxOT0yOwogICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlIGlmICggKExBMThfMT09RU9GfHwoTEExOF8xPj1SVUxFX1NUUklORyAmJiBMQTE4XzE8PVJVTEVfREVDSU1BTCl8fExBMThfMT09Mjd8fChMQTE4XzE+PTM0ICYmIExBMThfMTw9MzUpfHxMQTE4XzE9PTQwfHwoTEExOF8xPj00NSAmJiBMQTE4XzE8PTUwKXx8TEExOF8xPT03MHx8TEExOF8xPT05NXx8TEExOF8xPT0xMTN8fChMQTE4XzE+PTExNyAmJiBMQTE4XzE8PTExOCl8fExBMThfMT09MTIwfHxMQTE4XzE9PTEyMnx8KExBMThfMT49MTI2ICYmIExBMThfMTw9MTMzKXx8TEExOF8xPT0xMzV8fExBMThfMT09MTU0KSApIHsKLSAgICAgICAgICAgICAgICAgICAgYWx0MTg9MjsKKyAgICAgICAgICAgICAgICBlbHNlIGlmICggKExBMTlfMT09MjYpICkgeworICAgICAgICAgICAgICAgICAgICBhbHQxOT0xOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgaWYgKHN0YXRlLmJhY2t0cmFja2luZz4wKSB7c3RhdGUuZmFpbGVkPXRydWU7IHJldHVybiA7fQogICAgICAgICAgICAgICAgICAgICBOb1ZpYWJsZUFsdEV4Y2VwdGlvbiBudmFlID0KLSAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBOb1ZpYWJsZUFsdEV4Y2VwdGlvbigiIiwgMTgsIDEsIGlucHV0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBOb1ZpYWJsZUFsdEV4Y2VwdGlvbigiIiwgMTksIDEsIGlucHV0KTsKIAogICAgICAgICAgICAgICAgICAgICB0aHJvdyBudmFlOwogICAgICAgICAgICAgICAgIH0KQEAgLTExMTk2LDIyICsxMTc1MiwyMiBAQAogICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgaWYgKHN0YXRlLmJhY2t0cmFja2luZz4wKSB7c3RhdGUuZmFpbGVkPXRydWU7IHJldHVybiA7fQogICAgICAgICAgICAgICAgIE5vVmlhYmxlQWx0RXhjZXB0aW9uIG52YWUgPQotICAgICAgICAgICAgICAgICAgICBuZXcgTm9WaWFibGVBbHRFeGNlcHRpb24oIiIsIDE4LCAwLCBpbnB1dCk7CisgICAgICAgICAgICAgICAgICAgIG5ldyBOb1ZpYWJsZUFsdEV4Y2VwdGlvbigiIiwgMTksIDAsIGlucHV0KTsKIAogICAgICAgICAgICAgICAgIHRocm93IG52YWU7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBzd2l0Y2ggKGFsdDE4KSB7CisgICAgICAgICAgICBzd2l0Y2ggKGFsdDE5KSB7CiAgICAgICAgICAgICAgICAgY2FzZSAxIDoKLSAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MzE2MToyOiAoICggcnVsZV9fT3BPdGhlcl9fR3JvdXBfNV8xXzBfXzAgKSApCisgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjMzMTQ6MjogKCAoIHJ1bGVfX09wT3RoZXJfX0dyb3VwXzVfMV8wX18wICkgKQogICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjMxNjE6MjogKCAoIHJ1bGVfX09wT3RoZXJfX0dyb3VwXzVfMV8wX18wICkgKQotICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzozMTYyOjM6ICggcnVsZV9fT3BPdGhlcl9fR3JvdXBfNV8xXzBfXzAgKQorICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzozMzE0OjI6ICggKCBydWxlX19PcE90aGVyX19Hcm91cF81XzFfMF9fMCApICkKKyAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MzMxNTozOiAoIHJ1bGVfX09wT3RoZXJfX0dyb3VwXzVfMV8wX18wICkKICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0T3BPdGhlckFjY2VzcygpLmdldEdyb3VwXzVfMV8wKCkpOyAKICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzozMTYzOjM6ICggcnVsZV9fT3BPdGhlcl9fR3JvdXBfNV8xXzBfXzAgKQotICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzozMTYzOjQ6IHJ1bGVfX09wT3RoZXJfX0dyb3VwXzVfMV8wX18wCisgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjMzMTY6MzogKCBydWxlX19PcE90aGVyX19Hcm91cF81XzFfMF9fMCApCisgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjMzMTY6NDogcnVsZV9fT3BPdGhlcl9fR3JvdXBfNV8xXzBfXzAKICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV18yKTsKICAgICAgICAgICAgICAgICAgICAgcnVsZV9fT3BPdGhlcl9fR3JvdXBfNV8xXzBfXzAoKTsKQEAgLTExMjMxLDEwICsxMTc4NywxMCBAQAogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgIGNhc2UgMiA6Ci0gICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjMxNjc6MjogKCAnPicgKQorICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzozMzIwOjI6ICggJz4nICkKICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzozMTY3OjI6ICggJz4nICkKLSAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MzE2ODozOiAnPicKKyAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MzMyMDoyOiAoICc+JyApCisgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjMzMjE6MzogJz4nCiAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldE9wT3RoZXJBY2Nlc3MoKS5nZXRHcmVhdGVyVGhhblNpZ25LZXl3b3JkXzVfMV8xKCkpOyAKQEAgLTExMjY3LDU1ICsxMTgyMyw1NSBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX09wT3RoZXJfX0FsdGVybmF0aXZlc182XzEiCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MzE3NzoxOiBydWxlX19PcE90aGVyX19BbHRlcm5hdGl2ZXNfNl8xIDogKCAoICggcnVsZV9fT3BPdGhlcl9fR3JvdXBfNl8xXzBfXzAgKSApIHwgKCAnPCcgKSB8ICggJz0+JyApICk7CisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MzMzMDoxOiBydWxlX19PcE90aGVyX19BbHRlcm5hdGl2ZXNfNl8xIDogKCAoICggcnVsZV9fT3BPdGhlcl9fR3JvdXBfNl8xXzBfXzAgKSApIHwgKCAnPCcgKSB8ICggJz0+JyApICk7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fT3BPdGhlcl9fQWx0ZXJuYXRpdmVzXzZfMSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzozMTgxOjE6ICggKCAoIHJ1bGVfX09wT3RoZXJfX0dyb3VwXzZfMV8wX18wICkgKSB8ICggJzwnICkgfCAoICc9PicgKSApCi0gICAgICAgICAgICBpbnQgYWx0MTk9MzsKLSAgICAgICAgICAgIGludCBMQTE5XzAgPSBpbnB1dC5MQSgxKTsKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjMzMzQ6MTogKCAoICggcnVsZV9fT3BPdGhlcl9fR3JvdXBfNl8xXzBfXzAgKSApIHwgKCAnPCcgKSB8ICggJz0+JyApICkKKyAgICAgICAgICAgIGludCBhbHQyMD0zOworICAgICAgICAgICAgaW50IExBMjBfMCA9IGlucHV0LkxBKDEpOwogCi0gICAgICAgICAgICBpZiAoIChMQTE5XzA9PTI3KSApIHsKLSAgICAgICAgICAgICAgICBpbnQgTEExOV8xID0gaW5wdXQuTEEoMik7CisgICAgICAgICAgICBpZiAoIChMQTIwXzA9PTI3KSApIHsKKyAgICAgICAgICAgICAgICBpbnQgTEEyMF8xID0gaW5wdXQuTEEoMik7CiAKLSAgICAgICAgICAgICAgICBpZiAoIChzeW5wcmVkMzhfSW50ZXJuYWxEYXRhRFNMKCkpICkgewotICAgICAgICAgICAgICAgICAgICBhbHQxOT0xOworICAgICAgICAgICAgICAgIGlmICggKHN5bnByZWQzOV9JbnRlcm5hbERhdGFEU0woKSkgKSB7CisgICAgICAgICAgICAgICAgICAgIGFsdDIwPTE7CiAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UgaWYgKCAoc3lucHJlZDM5X0ludGVybmFsRGF0YURTTCgpKSApIHsKLSAgICAgICAgICAgICAgICAgICAgYWx0MTk9MjsKKyAgICAgICAgICAgICAgICBlbHNlIGlmICggKHN5bnByZWQ0MF9JbnRlcm5hbERhdGFEU0woKSkgKSB7CisgICAgICAgICAgICAgICAgICAgIGFsdDIwPTI7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICBpZiAoc3RhdGUuYmFja3RyYWNraW5nPjApIHtzdGF0ZS5mYWlsZWQ9dHJ1ZTsgcmV0dXJuIDt9CiAgICAgICAgICAgICAgICAgICAgIE5vVmlhYmxlQWx0RXhjZXB0aW9uIG52YWUgPQotICAgICAgICAgICAgICAgICAgICAgICAgbmV3IE5vVmlhYmxlQWx0RXhjZXB0aW9uKCIiLCAxOSwgMSwgaW5wdXQpOworICAgICAgICAgICAgICAgICAgICAgICAgbmV3IE5vVmlhYmxlQWx0RXhjZXB0aW9uKCIiLCAyMCwgMSwgaW5wdXQpOwogCiAgICAgICAgICAgICAgICAgICAgIHRocm93IG52YWU7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSBpZiAoIChMQTE5XzA9PTMxKSApIHsKLSAgICAgICAgICAgICAgICBhbHQxOT0zOworICAgICAgICAgICAgZWxzZSBpZiAoIChMQTIwXzA9PTMxKSApIHsKKyAgICAgICAgICAgICAgICBhbHQyMD0zOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgaWYgKHN0YXRlLmJhY2t0cmFja2luZz4wKSB7c3RhdGUuZmFpbGVkPXRydWU7IHJldHVybiA7fQogICAgICAgICAgICAgICAgIE5vVmlhYmxlQWx0RXhjZXB0aW9uIG52YWUgPQotICAgICAgICAgICAgICAgICAgICBuZXcgTm9WaWFibGVBbHRFeGNlcHRpb24oIiIsIDE5LCAwLCBpbnB1dCk7CisgICAgICAgICAgICAgICAgICAgIG5ldyBOb1ZpYWJsZUFsdEV4Y2VwdGlvbigiIiwgMjAsIDAsIGlucHV0KTsKIAogICAgICAgICAgICAgICAgIHRocm93IG52YWU7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBzd2l0Y2ggKGFsdDE5KSB7CisgICAgICAgICAgICBzd2l0Y2ggKGFsdDIwKSB7CiAgICAgICAgICAgICAgICAgY2FzZSAxIDoKLSAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MzE4MjoyOiAoICggcnVsZV9fT3BPdGhlcl9fR3JvdXBfNl8xXzBfXzAgKSApCisgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjMzMzU6MjogKCAoIHJ1bGVfX09wT3RoZXJfX0dyb3VwXzZfMV8wX18wICkgKQogICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjMxODI6MjogKCAoIHJ1bGVfX09wT3RoZXJfX0dyb3VwXzZfMV8wX18wICkgKQotICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzozMTgzOjM6ICggcnVsZV9fT3BPdGhlcl9fR3JvdXBfNl8xXzBfXzAgKQorICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzozMzM1OjI6ICggKCBydWxlX19PcE90aGVyX19Hcm91cF82XzFfMF9fMCApICkKKyAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MzMzNjozOiAoIHJ1bGVfX09wT3RoZXJfX0dyb3VwXzZfMV8wX18wICkKICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0T3BPdGhlckFjY2VzcygpLmdldEdyb3VwXzZfMV8wKCkpOyAKICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzozMTg0OjM6ICggcnVsZV9fT3BPdGhlcl9fR3JvdXBfNl8xXzBfXzAgKQotICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzozMTg0OjQ6IHJ1bGVfX09wT3RoZXJfX0dyb3VwXzZfMV8wX18wCisgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjMzMzc6MzogKCBydWxlX19PcE90aGVyX19Hcm91cF82XzFfMF9fMCApCisgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjMzMzc6NDogcnVsZV9fT3BPdGhlcl9fR3JvdXBfNl8xXzBfXzAKICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV18yKTsKICAgICAgICAgICAgICAgICAgICAgcnVsZV9fT3BPdGhlcl9fR3JvdXBfNl8xXzBfXzAoKTsKQEAgLTExMzM1LDEwICsxMTg5MSwxMCBAQAogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgIGNhc2UgMiA6Ci0gICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjMxODg6MjogKCAnPCcgKQorICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzozMzQxOjI6ICggJzwnICkKICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzozMTg4OjI6ICggJzwnICkKLSAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MzE4OTozOiAnPCcKKyAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MzM0MToyOiAoICc8JyApCisgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjMzNDI6MzogJzwnCiAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldE9wT3RoZXJBY2Nlc3MoKS5nZXRMZXNzVGhhblNpZ25LZXl3b3JkXzZfMV8xKCkpOyAKQEAgLTExMzU0LDEwICsxMTkxMCwxMCBAQAogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgIGNhc2UgMyA6Ci0gICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjMxOTQ6MjogKCAnPT4nICkKKyAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MzM0NzoyOiAoICc9PicgKQogICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjMxOTQ6MjogKCAnPT4nICkKLSAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MzE5NTozOiAnPT4nCisgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjMzNDc6MjogKCAnPT4nICkKKyAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MzM0ODozOiAnPT4nCiAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldE9wT3RoZXJBY2Nlc3MoKS5nZXRFcXVhbHNTaWduR3JlYXRlclRoYW5TaWduS2V5d29yZF82XzFfMigpKTsgCkBAIC0xMTM5MCwzNSArMTE5NDYsMzUgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19PcEFkZF9fQWx0ZXJuYXRpdmVzIgotICAgIC8vIEludGVybmFsRGF0YURTTC5nOjMyMDQ6MTogcnVsZV9fT3BBZGRfX0FsdGVybmF0aXZlcyA6ICggKCAnKycgKSB8ICggJy0nICkgKTsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzozMzU3OjE6IHJ1bGVfX09wQWRkX19BbHRlcm5hdGl2ZXMgOiAoICggJysnICkgfCAoICctJyApICk7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fT3BBZGRfX0FsdGVybmF0aXZlcygpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzozMjA4OjE6ICggKCAnKycgKSB8ICggJy0nICkgKQotICAgICAgICAgICAgaW50IGFsdDIwPTI7Ci0gICAgICAgICAgICBpbnQgTEEyMF8wID0gaW5wdXQuTEEoMSk7CisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzozMzYxOjE6ICggKCAnKycgKSB8ICggJy0nICkgKQorICAgICAgICAgICAgaW50IGFsdDIxPTI7CisgICAgICAgICAgICBpbnQgTEEyMV8wID0gaW5wdXQuTEEoMSk7CiAKLSAgICAgICAgICAgIGlmICggKExBMjBfMD09MzQpICkgewotICAgICAgICAgICAgICAgIGFsdDIwPTE7CisgICAgICAgICAgICBpZiAoIChMQTIxXzA9PTM0KSApIHsKKyAgICAgICAgICAgICAgICBhbHQyMT0xOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSBpZiAoIChMQTIwXzA9PTM1KSApIHsKLSAgICAgICAgICAgICAgICBhbHQyMD0yOworICAgICAgICAgICAgZWxzZSBpZiAoIChMQTIxXzA9PTM1KSApIHsKKyAgICAgICAgICAgICAgICBhbHQyMT0yOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgaWYgKHN0YXRlLmJhY2t0cmFja2luZz4wKSB7c3RhdGUuZmFpbGVkPXRydWU7IHJldHVybiA7fQogICAgICAgICAgICAgICAgIE5vVmlhYmxlQWx0RXhjZXB0aW9uIG52YWUgPQotICAgICAgICAgICAgICAgICAgICBuZXcgTm9WaWFibGVBbHRFeGNlcHRpb24oIiIsIDIwLCAwLCBpbnB1dCk7CisgICAgICAgICAgICAgICAgICAgIG5ldyBOb1ZpYWJsZUFsdEV4Y2VwdGlvbigiIiwgMjEsIDAsIGlucHV0KTsKIAogICAgICAgICAgICAgICAgIHRocm93IG52YWU7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBzd2l0Y2ggKGFsdDIwKSB7CisgICAgICAgICAgICBzd2l0Y2ggKGFsdDIxKSB7CiAgICAgICAgICAgICAgICAgY2FzZSAxIDoKLSAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MzIwOToyOiAoICcrJyApCisgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjMzNjI6MjogKCAnKycgKQogICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjMyMDk6MjogKCAnKycgKQotICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzozMjEwOjM6ICcrJworICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzozMzYyOjI6ICggJysnICkKKyAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MzM2MzozOiAnKycKICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0T3BBZGRBY2Nlc3MoKS5nZXRQbHVzU2lnbktleXdvcmRfMCgpKTsgCkBAIC0xMTQzNCwxMCArMTE5OTAsMTAgQEAKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICBjYXNlIDIgOgotICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzozMjE1OjI6ICggJy0nICkKKyAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MzM2ODoyOiAoICctJyApCiAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MzIxNToyOiAoICctJyApCi0gICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjMyMTY6MzogJy0nCisgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjMzNjg6MjogKCAnLScgKQorICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzozMzY5OjM6ICctJwogICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRPcEFkZEFjY2VzcygpLmdldEh5cGhlbk1pbnVzS2V5d29yZF8xKCkpOyAKQEAgLTExNDcwLDQ5ICsxMjAyNiw0OSBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX09wTXVsdGlfX0FsdGVybmF0aXZlcyIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzozMjI1OjE6IHJ1bGVfX09wTXVsdGlfX0FsdGVybmF0aXZlcyA6ICggKCAnKicgKSB8ICggJyoqJyApIHwgKCAnLycgKSB8ICggJyUnICkgKTsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzozMzc4OjE6IHJ1bGVfX09wTXVsdGlfX0FsdGVybmF0aXZlcyA6ICggKCAnKicgKSB8ICggJyoqJyApIHwgKCAnLycgKSB8ICggJyUnICkgKTsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19PcE11bHRpX19BbHRlcm5hdGl2ZXMoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MzIyOToxOiAoICggJyonICkgfCAoICcqKicgKSB8ICggJy8nICkgfCAoICclJyApICkKLSAgICAgICAgICAgIGludCBhbHQyMT00OworICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MzM4MjoxOiAoICggJyonICkgfCAoICcqKicgKSB8ICggJy8nICkgfCAoICclJyApICkKKyAgICAgICAgICAgIGludCBhbHQyMj00OwogICAgICAgICAgICAgc3dpdGNoICggaW5wdXQuTEEoMSkgKSB7CiAgICAgICAgICAgICBjYXNlIDM2OgogICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBhbHQyMT0xOworICAgICAgICAgICAgICAgIGFsdDIyPTE7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgY2FzZSAzNzoKICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgYWx0MjE9MjsKKyAgICAgICAgICAgICAgICBhbHQyMj0yOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIGNhc2UgMzg6CiAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGFsdDIxPTM7CisgICAgICAgICAgICAgICAgYWx0MjI9MzsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICBjYXNlIDM5OgogICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBhbHQyMT00OworICAgICAgICAgICAgICAgIGFsdDIyPTQ7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgICAgICBpZiAoc3RhdGUuYmFja3RyYWNraW5nPjApIHtzdGF0ZS5mYWlsZWQ9dHJ1ZTsgcmV0dXJuIDt9CiAgICAgICAgICAgICAgICAgTm9WaWFibGVBbHRFeGNlcHRpb24gbnZhZSA9Ci0gICAgICAgICAgICAgICAgICAgIG5ldyBOb1ZpYWJsZUFsdEV4Y2VwdGlvbigiIiwgMjEsIDAsIGlucHV0KTsKKyAgICAgICAgICAgICAgICAgICAgbmV3IE5vVmlhYmxlQWx0RXhjZXB0aW9uKCIiLCAyMiwgMCwgaW5wdXQpOwogCiAgICAgICAgICAgICAgICAgdGhyb3cgbnZhZTsKICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgc3dpdGNoIChhbHQyMSkgeworICAgICAgICAgICAgc3dpdGNoIChhbHQyMikgewogICAgICAgICAgICAgICAgIGNhc2UgMSA6Ci0gICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjMyMzA6MjogKCAnKicgKQorICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzozMzgzOjI6ICggJyonICkKICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzozMjMwOjI6ICggJyonICkKLSAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MzIzMTozOiAnKicKKyAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MzM4MzoyOiAoICcqJyApCisgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjMzODQ6MzogJyonCiAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldE9wTXVsdGlBY2Nlc3MoKS5nZXRBc3Rlcmlza0tleXdvcmRfMCgpKTsgCkBAIC0xMTUyOCwxMCArMTIwODQsMTAgQEAKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICBjYXNlIDIgOgotICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzozMjM2OjI6ICggJyoqJyApCisgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjMzODk6MjogKCAnKionICkKICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzozMjM2OjI6ICggJyoqJyApCi0gICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjMyMzc6MzogJyoqJworICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzozMzg5OjI6ICggJyoqJyApCisgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjMzOTA6MzogJyoqJwogICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRPcE11bHRpQWNjZXNzKCkuZ2V0QXN0ZXJpc2tBc3Rlcmlza0tleXdvcmRfMSgpKTsgCkBAIC0xMTU0NywxMCArMTIxMDMsMTAgQEAKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICBjYXNlIDMgOgotICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzozMjQyOjI6ICggJy8nICkKKyAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MzM5NToyOiAoICcvJyApCiAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MzI0MjoyOiAoICcvJyApCi0gICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjMyNDM6MzogJy8nCisgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjMzOTU6MjogKCAnLycgKQorICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzozMzk2OjM6ICcvJwogICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRPcE11bHRpQWNjZXNzKCkuZ2V0U29saWR1c0tleXdvcmRfMigpKTsgCkBAIC0xMTU2NiwxMCArMTIxMjIsMTAgQEAKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICBjYXNlIDQgOgotICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzozMjQ4OjI6ICggJyUnICkKKyAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MzQwMToyOiAoICclJyApCiAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MzI0ODoyOiAoICclJyApCi0gICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjMyNDk6MzogJyUnCisgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjM0MDE6MjogKCAnJScgKQorICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzozNDAyOjM6ICclJwogICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRPcE11bHRpQWNjZXNzKCkuZ2V0UGVyY2VudFNpZ25LZXl3b3JkXzMoKSk7IApAQCAtMTE2MDIsNDEgKzEyMTU4LDQxIEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fWFVuYXJ5T3BlcmF0aW9uX19BbHRlcm5hdGl2ZXMiCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MzI1ODoxOiBydWxlX19YVW5hcnlPcGVyYXRpb25fX0FsdGVybmF0aXZlcyA6ICggKCAoIHJ1bGVfX1hVbmFyeU9wZXJhdGlvbl9fR3JvdXBfMF9fMCApICkgfCAoIHJ1bGVYQ2FzdGVkRXhwcmVzc2lvbiApICk7CisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MzQxMToxOiBydWxlX19YVW5hcnlPcGVyYXRpb25fX0FsdGVybmF0aXZlcyA6ICggKCAoIHJ1bGVfX1hVbmFyeU9wZXJhdGlvbl9fR3JvdXBfMF9fMCApICkgfCAoIHJ1bGVYQ2FzdGVkRXhwcmVzc2lvbiApICk7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fWFVuYXJ5T3BlcmF0aW9uX19BbHRlcm5hdGl2ZXMoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MzI2MjoxOiAoICggKCBydWxlX19YVW5hcnlPcGVyYXRpb25fX0dyb3VwXzBfXzAgKSApIHwgKCBydWxlWENhc3RlZEV4cHJlc3Npb24gKSApCi0gICAgICAgICAgICBpbnQgYWx0MjI9MjsKLSAgICAgICAgICAgIGludCBMQTIyXzAgPSBpbnB1dC5MQSgxKTsKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjM0MTU6MTogKCAoICggcnVsZV9fWFVuYXJ5T3BlcmF0aW9uX19Hcm91cF8wX18wICkgKSB8ICggcnVsZVhDYXN0ZWRFeHByZXNzaW9uICkgKQorICAgICAgICAgICAgaW50IGFsdDIzPTI7CisgICAgICAgICAgICBpbnQgTEEyM18wID0gaW5wdXQuTEEoMSk7CiAKLSAgICAgICAgICAgIGlmICggKChMQTIyXzA+PTM0ICYmIExBMjJfMDw9MzUpfHxMQTIyXzA9PTQwKSApIHsKLSAgICAgICAgICAgICAgICBhbHQyMj0xOworICAgICAgICAgICAgaWYgKCAoKExBMjNfMD49MzQgJiYgTEEyM18wPD0zNSl8fExBMjNfMD09NDApICkgeworICAgICAgICAgICAgICAgIGFsdDIzPTE7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIGlmICggKChMQTIyXzA+PVJVTEVfU1RSSU5HICYmIExBMjJfMDw9UlVMRV9ERUNJTUFMKXx8TEEyMl8wPT0yN3x8KExBMjJfMD49NDUgJiYgTEEyMl8wPD01MCl8fExBMjJfMD09NzB8fExBMjJfMD09OTV8fExBMjJfMD09MTEzfHwoTEEyMl8wPj0xMTcgJiYgTEEyMl8wPD0xMTgpfHxMQTIyXzA9PTEyMHx8TEEyMl8wPT0xMjJ8fChMQTIyXzA+PTEyNiAmJiBMQTIyXzA8PTEzMyl8fExBMjJfMD09MTM1fHxMQTIyXzA9PTE1NCkgKSB7Ci0gICAgICAgICAgICAgICAgYWx0MjI9MjsKKyAgICAgICAgICAgIGVsc2UgaWYgKCAoKExBMjNfMD49UlVMRV9TVFJJTkcgJiYgTEEyM18wPD1SVUxFX0RFQ0lNQUwpfHxMQTIzXzA9PTI3fHwoTEEyM18wPj00NSAmJiBMQTIzXzA8PTUwKXx8TEEyM18wPT03NXx8TEEyM18wPT0xMDJ8fExBMjNfMD09MTIzfHwoTEEyM18wPj0xMjcgJiYgTEEyM18wPD0xMjgpfHxMQTIzXzA9PTEzMHx8TEEyM18wPT0xMzJ8fChMQTIzXzA+PTEzNiAmJiBMQTIzXzA8PTE0Myl8fExBMjNfMD09MTQ1fHxMQTIzXzA9PTE2NikgKSB7CisgICAgICAgICAgICAgICAgYWx0MjM9MjsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgIGlmIChzdGF0ZS5iYWNrdHJhY2tpbmc+MCkge3N0YXRlLmZhaWxlZD10cnVlOyByZXR1cm4gO30KICAgICAgICAgICAgICAgICBOb1ZpYWJsZUFsdEV4Y2VwdGlvbiBudmFlID0KLSAgICAgICAgICAgICAgICAgICAgbmV3IE5vVmlhYmxlQWx0RXhjZXB0aW9uKCIiLCAyMiwgMCwgaW5wdXQpOworICAgICAgICAgICAgICAgICAgICBuZXcgTm9WaWFibGVBbHRFeGNlcHRpb24oIiIsIDIzLCAwLCBpbnB1dCk7CiAKICAgICAgICAgICAgICAgICB0aHJvdyBudmFlOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgc3dpdGNoIChhbHQyMikgeworICAgICAgICAgICAgc3dpdGNoIChhbHQyMykgewogICAgICAgICAgICAgICAgIGNhc2UgMSA6Ci0gICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjMyNjM6MjogKCAoIHJ1bGVfX1hVbmFyeU9wZXJhdGlvbl9fR3JvdXBfMF9fMCApICkKKyAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MzQxNjoyOiAoICggcnVsZV9fWFVuYXJ5T3BlcmF0aW9uX19Hcm91cF8wX18wICkgKQogICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjMyNjM6MjogKCAoIHJ1bGVfX1hVbmFyeU9wZXJhdGlvbl9fR3JvdXBfMF9fMCApICkKLSAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MzI2NDozOiAoIHJ1bGVfX1hVbmFyeU9wZXJhdGlvbl9fR3JvdXBfMF9fMCApCisgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjM0MTY6MjogKCAoIHJ1bGVfX1hVbmFyeU9wZXJhdGlvbl9fR3JvdXBfMF9fMCApICkKKyAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MzQxNzozOiAoIHJ1bGVfX1hVbmFyeU9wZXJhdGlvbl9fR3JvdXBfMF9fMCApCiAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhVbmFyeU9wZXJhdGlvbkFjY2VzcygpLmdldEdyb3VwXzAoKSk7IAogICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjMyNjU6MzogKCBydWxlX19YVW5hcnlPcGVyYXRpb25fX0dyb3VwXzBfXzAgKQotICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzozMjY1OjQ6IHJ1bGVfX1hVbmFyeU9wZXJhdGlvbl9fR3JvdXBfMF9fMAorICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzozNDE4OjM6ICggcnVsZV9fWFVuYXJ5T3BlcmF0aW9uX19Hcm91cF8wX18wICkKKyAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MzQxODo0OiBydWxlX19YVW5hcnlPcGVyYXRpb25fX0dyb3VwXzBfXzAKICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV18yKTsKICAgICAgICAgICAgICAgICAgICAgcnVsZV9fWFVuYXJ5T3BlcmF0aW9uX19Hcm91cF8wX18wKCk7CkBAIC0xMTY1NiwxMCArMTIyMTIsMTAgQEAKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICBjYXNlIDIgOgotICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzozMjY5OjI6ICggcnVsZVhDYXN0ZWRFeHByZXNzaW9uICkKKyAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MzQyMjoyOiAoIHJ1bGVYQ2FzdGVkRXhwcmVzc2lvbiApCiAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MzI2OToyOiAoIHJ1bGVYQ2FzdGVkRXhwcmVzc2lvbiApCi0gICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjMyNzA6MzogcnVsZVhDYXN0ZWRFeHByZXNzaW9uCisgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjM0MjI6MjogKCBydWxlWENhc3RlZEV4cHJlc3Npb24gKQorICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzozNDIzOjM6IHJ1bGVYQ2FzdGVkRXhwcmVzc2lvbgogICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYVW5hcnlPcGVyYXRpb25BY2Nlc3MoKS5nZXRYQ2FzdGVkRXhwcmVzc2lvblBhcnNlclJ1bGVDYWxsXzEoKSk7IApAQCAtMTE2OTYsNDQgKzEyMjUyLDQ0IEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fT3BVbmFyeV9fQWx0ZXJuYXRpdmVzIgotICAgIC8vIEludGVybmFsRGF0YURTTC5nOjMyNzk6MTogcnVsZV9fT3BVbmFyeV9fQWx0ZXJuYXRpdmVzIDogKCAoICchJyApIHwgKCAnLScgKSB8ICggJysnICkgKTsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzozNDMyOjE6IHJ1bGVfX09wVW5hcnlfX0FsdGVybmF0aXZlcyA6ICggKCAnIScgKSB8ICggJy0nICkgfCAoICcrJyApICk7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fT3BVbmFyeV9fQWx0ZXJuYXRpdmVzKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjMyODM6MTogKCAoICchJyApIHwgKCAnLScgKSB8ICggJysnICkgKQotICAgICAgICAgICAgaW50IGFsdDIzPTM7CisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzozNDM2OjE6ICggKCAnIScgKSB8ICggJy0nICkgfCAoICcrJyApICkKKyAgICAgICAgICAgIGludCBhbHQyND0zOwogICAgICAgICAgICAgc3dpdGNoICggaW5wdXQuTEEoMSkgKSB7CiAgICAgICAgICAgICBjYXNlIDQwOgogICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBhbHQyMz0xOworICAgICAgICAgICAgICAgIGFsdDI0PTE7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgY2FzZSAzNToKICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgYWx0MjM9MjsKKyAgICAgICAgICAgICAgICBhbHQyND0yOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIGNhc2UgMzQ6CiAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGFsdDIzPTM7CisgICAgICAgICAgICAgICAgYWx0MjQ9MzsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgICAgIGlmIChzdGF0ZS5iYWNrdHJhY2tpbmc+MCkge3N0YXRlLmZhaWxlZD10cnVlOyByZXR1cm4gO30KICAgICAgICAgICAgICAgICBOb1ZpYWJsZUFsdEV4Y2VwdGlvbiBudmFlID0KLSAgICAgICAgICAgICAgICAgICAgbmV3IE5vVmlhYmxlQWx0RXhjZXB0aW9uKCIiLCAyMywgMCwgaW5wdXQpOworICAgICAgICAgICAgICAgICAgICBuZXcgTm9WaWFibGVBbHRFeGNlcHRpb24oIiIsIDI0LCAwLCBpbnB1dCk7CiAKICAgICAgICAgICAgICAgICB0aHJvdyBudmFlOwogICAgICAgICAgICAgfQogCi0gICAgICAgICAgICBzd2l0Y2ggKGFsdDIzKSB7CisgICAgICAgICAgICBzd2l0Y2ggKGFsdDI0KSB7CiAgICAgICAgICAgICAgICAgY2FzZSAxIDoKLSAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MzI4NDoyOiAoICchJyApCisgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjM0Mzc6MjogKCAnIScgKQogICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjMyODQ6MjogKCAnIScgKQotICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzozMjg1OjM6ICchJworICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzozNDM3OjI6ICggJyEnICkKKyAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MzQzODozOiAnIScKICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0T3BVbmFyeUFjY2VzcygpLmdldEV4Y2xhbWF0aW9uTWFya0tleXdvcmRfMCgpKTsgCkBAIC0xMTc0OSwxMCArMTIzMDUsMTAgQEAKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICBjYXNlIDIgOgotICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzozMjkwOjI6ICggJy0nICkKKyAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MzQ0MzoyOiAoICctJyApCiAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MzI5MDoyOiAoICctJyApCi0gICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjMyOTE6MzogJy0nCisgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjM0NDM6MjogKCAnLScgKQorICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzozNDQ0OjM6ICctJwogICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRPcFVuYXJ5QWNjZXNzKCkuZ2V0SHlwaGVuTWludXNLZXl3b3JkXzEoKSk7IApAQCAtMTE3NjgsMTAgKzEyMzI0LDEwIEBACiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgY2FzZSAzIDoKLSAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MzI5NjoyOiAoICcrJyApCisgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjM0NDk6MjogKCAnKycgKQogICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjMyOTY6MjogKCAnKycgKQotICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzozMjk3OjM6ICcrJworICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzozNDQ5OjI6ICggJysnICkKKyAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MzQ1MDozOiAnKycKICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0T3BVbmFyeUFjY2VzcygpLmdldFBsdXNTaWduS2V5d29yZF8yKCkpOyAKQEAgLTExODA0LDM1ICsxMjM2MCwzNSBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX09wUG9zdGZpeF9fQWx0ZXJuYXRpdmVzIgotICAgIC8vIEludGVybmFsRGF0YURTTC5nOjMzMDY6MTogcnVsZV9fT3BQb3N0Zml4X19BbHRlcm5hdGl2ZXMgOiAoICggJysrJyApIHwgKCAnLS0nICkgKTsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzozNDU5OjE6IHJ1bGVfX09wUG9zdGZpeF9fQWx0ZXJuYXRpdmVzIDogKCAoICcrKycgKSB8ICggJy0tJyApICk7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fT3BQb3N0Zml4X19BbHRlcm5hdGl2ZXMoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MzMxMDoxOiAoICggJysrJyApIHwgKCAnLS0nICkgKQotICAgICAgICAgICAgaW50IGFsdDI0PTI7Ci0gICAgICAgICAgICBpbnQgTEEyNF8wID0gaW5wdXQuTEEoMSk7CisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzozNDYzOjE6ICggKCAnKysnICkgfCAoICctLScgKSApCisgICAgICAgICAgICBpbnQgYWx0MjU9MjsKKyAgICAgICAgICAgIGludCBMQTI1XzAgPSBpbnB1dC5MQSgxKTsKIAotICAgICAgICAgICAgaWYgKCAoTEEyNF8wPT00MSkgKSB7Ci0gICAgICAgICAgICAgICAgYWx0MjQ9MTsKKyAgICAgICAgICAgIGlmICggKExBMjVfMD09NDEpICkgeworICAgICAgICAgICAgICAgIGFsdDI1PTE7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIGlmICggKExBMjRfMD09NDIpICkgewotICAgICAgICAgICAgICAgIGFsdDI0PTI7CisgICAgICAgICAgICBlbHNlIGlmICggKExBMjVfMD09NDIpICkgeworICAgICAgICAgICAgICAgIGFsdDI1PTI7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICBpZiAoc3RhdGUuYmFja3RyYWNraW5nPjApIHtzdGF0ZS5mYWlsZWQ9dHJ1ZTsgcmV0dXJuIDt9CiAgICAgICAgICAgICAgICAgTm9WaWFibGVBbHRFeGNlcHRpb24gbnZhZSA9Ci0gICAgICAgICAgICAgICAgICAgIG5ldyBOb1ZpYWJsZUFsdEV4Y2VwdGlvbigiIiwgMjQsIDAsIGlucHV0KTsKKyAgICAgICAgICAgICAgICAgICAgbmV3IE5vVmlhYmxlQWx0RXhjZXB0aW9uKCIiLCAyNSwgMCwgaW5wdXQpOwogCiAgICAgICAgICAgICAgICAgdGhyb3cgbnZhZTsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHN3aXRjaCAoYWx0MjQpIHsKKyAgICAgICAgICAgIHN3aXRjaCAoYWx0MjUpIHsKICAgICAgICAgICAgICAgICBjYXNlIDEgOgotICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzozMzExOjI6ICggJysrJyApCisgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjM0NjQ6MjogKCAnKysnICkKICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzozMzExOjI6ICggJysrJyApCi0gICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjMzMTI6MzogJysrJworICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzozNDY0OjI6ICggJysrJyApCisgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjM0NjU6MzogJysrJwogICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRPcFBvc3RmaXhBY2Nlc3MoKS5nZXRQbHVzU2lnblBsdXNTaWduS2V5d29yZF8wKCkpOyAKQEAgLTExODQ4LDEwICsxMjQwNCwxMCBAQAogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgIGNhc2UgMiA6Ci0gICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjMzMTc6MjogKCAnLS0nICkKKyAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MzQ3MDoyOiAoICctLScgKQogICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjMzMTc6MjogKCAnLS0nICkKLSAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MzMxODozOiAnLS0nCisgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjM0NzA6MjogKCAnLS0nICkKKyAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MzQ3MTozOiAnLS0nCiAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldE9wUG9zdGZpeEFjY2VzcygpLmdldEh5cGhlbk1pbnVzSHlwaGVuTWludXNLZXl3b3JkXzEoKSk7IApAQCAtMTE4ODQsMjcgKzEyNDQwLDI3IEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19BbHRlcm5hdGl2ZXNfMSIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzozMzI3OjE6IHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fQWx0ZXJuYXRpdmVzXzEgOiAoICggKCBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX0dyb3VwXzFfMF9fMCApICkgfCAoICggcnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19Hcm91cF8xXzFfXzAgKSApICk7CisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MzQ4MDoxOiBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX0FsdGVybmF0aXZlc18xIDogKCAoICggcnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19Hcm91cF8xXzBfXzAgKSApIHwgKCAoIHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fR3JvdXBfMV8xX18wICkgKSApOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fQWx0ZXJuYXRpdmVzXzEoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MzMzMToxOiAoICggKCBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX0dyb3VwXzFfMF9fMCApICkgfCAoICggcnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19Hcm91cF8xXzFfXzAgKSApICkKLSAgICAgICAgICAgIGludCBhbHQyNT0yOwotICAgICAgICAgICAgYWx0MjUgPSBkZmEyNS5wcmVkaWN0KGlucHV0KTsKLSAgICAgICAgICAgIHN3aXRjaCAoYWx0MjUpIHsKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjM0ODQ6MTogKCAoICggcnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19Hcm91cF8xXzBfXzAgKSApIHwgKCAoIHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fR3JvdXBfMV8xX18wICkgKSApCisgICAgICAgICAgICBpbnQgYWx0MjY9MjsKKyAgICAgICAgICAgIGFsdDI2ID0gZGZhMjYucHJlZGljdChpbnB1dCk7CisgICAgICAgICAgICBzd2l0Y2ggKGFsdDI2KSB7CiAgICAgICAgICAgICAgICAgY2FzZSAxIDoKLSAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MzMzMjoyOiAoICggcnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19Hcm91cF8xXzBfXzAgKSApCisgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjM0ODU6MjogKCAoIHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fR3JvdXBfMV8wX18wICkgKQogICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjMzMzI6MjogKCAoIHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fR3JvdXBfMV8wX18wICkgKQotICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzozMzMzOjM6ICggcnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19Hcm91cF8xXzBfXzAgKQorICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzozNDg1OjI6ICggKCBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX0dyb3VwXzFfMF9fMCApICkKKyAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MzQ4NjozOiAoIHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fR3JvdXBfMV8wX18wICkKICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WE1lbWJlckZlYXR1cmVDYWxsQWNjZXNzKCkuZ2V0R3JvdXBfMV8wKCkpOyAKICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzozMzM0OjM6ICggcnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19Hcm91cF8xXzBfXzAgKQotICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzozMzM0OjQ6IHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fR3JvdXBfMV8wX18wCisgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjM0ODc6MzogKCBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX0dyb3VwXzFfMF9fMCApCisgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjM0ODc6NDogcnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19Hcm91cF8xXzBfXzAKICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV18yKTsKICAgICAgICAgICAgICAgICAgICAgcnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19Hcm91cF8xXzBfXzAoKTsKQEAgLTExOTI0LDE2ICsxMjQ4MCwxNiBAQAogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgIGNhc2UgMiA6Ci0gICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjMzMzg6MjogKCAoIHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fR3JvdXBfMV8xX18wICkgKQorICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzozNDkxOjI6ICggKCBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX0dyb3VwXzFfMV9fMCApICkKICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzozMzM4OjI6ICggKCBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX0dyb3VwXzFfMV9fMCApICkKLSAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MzMzOTozOiAoIHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fR3JvdXBfMV8xX18wICkKKyAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MzQ5MToyOiAoICggcnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19Hcm91cF8xXzFfXzAgKSApCisgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjM0OTI6MzogKCBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX0dyb3VwXzFfMV9fMCApCiAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhNZW1iZXJGZWF0dXJlQ2FsbEFjY2VzcygpLmdldEdyb3VwXzFfMSgpKTsgCiAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MzM0MDozOiAoIHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fR3JvdXBfMV8xX18wICkKLSAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MzM0MDo0OiBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX0dyb3VwXzFfMV9fMAorICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzozNDkzOjM6ICggcnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19Hcm91cF8xXzFfXzAgKQorICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzozNDkzOjQ6IHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fR3JvdXBfMV8xX18wCiAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMik7CiAgICAgICAgICAgICAgICAgICAgIHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fR3JvdXBfMV8xX18wKCk7CkBAIC0xMTk3MCwzNSArMTI1MjYsMzUgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX0FsdGVybmF0aXZlc18xXzBfMF8wXzEiCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MzM0ODoxOiBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX0FsdGVybmF0aXZlc18xXzBfMF8wXzEgOiAoICggJy4nICkgfCAoICggcnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19FeHBsaWNpdFN0YXRpY0Fzc2lnbm1lbnRfMV8wXzBfMF8xXzEgKSApICk7CisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MzUwMToxOiBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX0FsdGVybmF0aXZlc18xXzBfMF8wXzEgOiAoICggJy4nICkgfCAoICggcnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19FeHBsaWNpdFN0YXRpY0Fzc2lnbm1lbnRfMV8wXzBfMF8xXzEgKSApICk7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19BbHRlcm5hdGl2ZXNfMV8wXzBfMF8xKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjMzNTI6MTogKCAoICcuJyApIHwgKCAoIHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fRXhwbGljaXRTdGF0aWNBc3NpZ25tZW50XzFfMF8wXzBfMV8xICkgKSApCi0gICAgICAgICAgICBpbnQgYWx0MjY9MjsKLSAgICAgICAgICAgIGludCBMQTI2XzAgPSBpbnB1dC5MQSgxKTsKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjM1MDU6MTogKCAoICcuJyApIHwgKCAoIHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fRXhwbGljaXRTdGF0aWNBc3NpZ25tZW50XzFfMF8wXzBfMV8xICkgKSApCisgICAgICAgICAgICBpbnQgYWx0Mjc9MjsKKyAgICAgICAgICAgIGludCBMQTI3XzAgPSBpbnB1dC5MQSgxKTsKIAotICAgICAgICAgICAgaWYgKCAoTEEyNl8wPT00MykgKSB7Ci0gICAgICAgICAgICAgICAgYWx0MjY9MTsKKyAgICAgICAgICAgIGlmICggKExBMjdfMD09NDMpICkgeworICAgICAgICAgICAgICAgIGFsdDI3PTE7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIGlmICggKExBMjZfMD09MTUwKSApIHsKLSAgICAgICAgICAgICAgICBhbHQyNj0yOworICAgICAgICAgICAgZWxzZSBpZiAoIChMQTI3XzA9PTE2MikgKSB7CisgICAgICAgICAgICAgICAgYWx0Mjc9MjsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgIGlmIChzdGF0ZS5iYWNrdHJhY2tpbmc+MCkge3N0YXRlLmZhaWxlZD10cnVlOyByZXR1cm4gO30KICAgICAgICAgICAgICAgICBOb1ZpYWJsZUFsdEV4Y2VwdGlvbiBudmFlID0KLSAgICAgICAgICAgICAgICAgICAgbmV3IE5vVmlhYmxlQWx0RXhjZXB0aW9uKCIiLCAyNiwgMCwgaW5wdXQpOworICAgICAgICAgICAgICAgICAgICBuZXcgTm9WaWFibGVBbHRFeGNlcHRpb24oIiIsIDI3LCAwLCBpbnB1dCk7CiAKICAgICAgICAgICAgICAgICB0aHJvdyBudmFlOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgc3dpdGNoIChhbHQyNikgeworICAgICAgICAgICAgc3dpdGNoIChhbHQyNykgewogICAgICAgICAgICAgICAgIGNhc2UgMSA6Ci0gICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjMzNTM6MjogKCAnLicgKQorICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzozNTA2OjI6ICggJy4nICkKICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzozMzUzOjI6ICggJy4nICkKLSAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MzM1NDozOiAnLicKKyAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MzUwNjoyOiAoICcuJyApCisgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjM1MDc6MzogJy4nCiAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhNZW1iZXJGZWF0dXJlQ2FsbEFjY2VzcygpLmdldEZ1bGxTdG9wS2V5d29yZF8xXzBfMF8wXzFfMCgpKTsgCkBAIC0xMjAxNCwxNiArMTI1NzAsMTYgQEAKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICBjYXNlIDIgOgotICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzozMzU5OjI6ICggKCBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX0V4cGxpY2l0U3RhdGljQXNzaWdubWVudF8xXzBfMF8wXzFfMSApICkKKyAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MzUxMjoyOiAoICggcnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19FeHBsaWNpdFN0YXRpY0Fzc2lnbm1lbnRfMV8wXzBfMF8xXzEgKSApCiAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MzM1OToyOiAoICggcnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19FeHBsaWNpdFN0YXRpY0Fzc2lnbm1lbnRfMV8wXzBfMF8xXzEgKSApCi0gICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjMzNjA6MzogKCBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX0V4cGxpY2l0U3RhdGljQXNzaWdubWVudF8xXzBfMF8wXzFfMSApCisgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjM1MTI6MjogKCAoIHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fRXhwbGljaXRTdGF0aWNBc3NpZ25tZW50XzFfMF8wXzBfMV8xICkgKQorICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzozNTEzOjM6ICggcnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19FeHBsaWNpdFN0YXRpY0Fzc2lnbm1lbnRfMV8wXzBfMF8xXzEgKQogICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYTWVtYmVyRmVhdHVyZUNhbGxBY2Nlc3MoKS5nZXRFeHBsaWNpdFN0YXRpY0Fzc2lnbm1lbnRfMV8wXzBfMF8xXzEoKSk7IAogICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjMzNjE6MzogKCBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX0V4cGxpY2l0U3RhdGljQXNzaWdubWVudF8xXzBfMF8wXzFfMSApCi0gICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjMzNjE6NDogcnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19FeHBsaWNpdFN0YXRpY0Fzc2lnbm1lbnRfMV8wXzBfMF8xXzEKKyAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MzUxNDozOiAoIHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fRXhwbGljaXRTdGF0aWNBc3NpZ25tZW50XzFfMF8wXzBfMV8xICkKKyAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MzUxNDo0OiBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX0V4cGxpY2l0U3RhdGljQXNzaWdubWVudF8xXzBfMF8wXzFfMQogICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzIpOwogICAgICAgICAgICAgICAgICAgICBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX0V4cGxpY2l0U3RhdGljQXNzaWdubWVudF8xXzBfMF8wXzFfMSgpOwpAQCAtMTIwNjAsNDQgKzEyNjE2LDQ0IEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19BbHRlcm5hdGl2ZXNfMV8xXzBfMF8xIgotICAgIC8vIEludGVybmFsRGF0YURTTC5nOjMzNjk6MTogcnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19BbHRlcm5hdGl2ZXNfMV8xXzBfMF8xIDogKCAoICcuJyApIHwgKCAoIHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fTnVsbFNhZmVBc3NpZ25tZW50XzFfMV8wXzBfMV8xICkgKSB8ICggKCBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX0V4cGxpY2l0U3RhdGljQXNzaWdubWVudF8xXzFfMF8wXzFfMiApICkgKTsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzozNTIyOjE6IHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fQWx0ZXJuYXRpdmVzXzFfMV8wXzBfMSA6ICggKCAnLicgKSB8ICggKCBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX051bGxTYWZlQXNzaWdubWVudF8xXzFfMF8wXzFfMSApICkgfCAoICggcnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19FeHBsaWNpdFN0YXRpY0Fzc2lnbm1lbnRfMV8xXzBfMF8xXzIgKSApICk7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19BbHRlcm5hdGl2ZXNfMV8xXzBfMF8xKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjMzNzM6MTogKCAoICcuJyApIHwgKCAoIHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fTnVsbFNhZmVBc3NpZ25tZW50XzFfMV8wXzBfMV8xICkgKSB8ICggKCBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX0V4cGxpY2l0U3RhdGljQXNzaWdubWVudF8xXzFfMF8wXzFfMiApICkgKQotICAgICAgICAgICAgaW50IGFsdDI3PTM7CisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzozNTI2OjE6ICggKCAnLicgKSB8ICggKCBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX051bGxTYWZlQXNzaWdubWVudF8xXzFfMF8wXzFfMSApICkgfCAoICggcnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19FeHBsaWNpdFN0YXRpY0Fzc2lnbm1lbnRfMV8xXzBfMF8xXzIgKSApICkKKyAgICAgICAgICAgIGludCBhbHQyOD0zOwogICAgICAgICAgICAgc3dpdGNoICggaW5wdXQuTEEoMSkgKSB7CiAgICAgICAgICAgICBjYXNlIDQzOgogICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBhbHQyNz0xOworICAgICAgICAgICAgICAgIGFsdDI4PTE7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSAxNTE6CisgICAgICAgICAgICBjYXNlIDE2MzoKICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgYWx0Mjc9MjsKKyAgICAgICAgICAgICAgICBhbHQyOD0yOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgMTUwOgorICAgICAgICAgICAgY2FzZSAxNjI6CiAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGFsdDI3PTM7CisgICAgICAgICAgICAgICAgYWx0Mjg9MzsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgICAgIGlmIChzdGF0ZS5iYWNrdHJhY2tpbmc+MCkge3N0YXRlLmZhaWxlZD10cnVlOyByZXR1cm4gO30KICAgICAgICAgICAgICAgICBOb1ZpYWJsZUFsdEV4Y2VwdGlvbiBudmFlID0KLSAgICAgICAgICAgICAgICAgICAgbmV3IE5vVmlhYmxlQWx0RXhjZXB0aW9uKCIiLCAyNywgMCwgaW5wdXQpOworICAgICAgICAgICAgICAgICAgICBuZXcgTm9WaWFibGVBbHRFeGNlcHRpb24oIiIsIDI4LCAwLCBpbnB1dCk7CiAKICAgICAgICAgICAgICAgICB0aHJvdyBudmFlOwogICAgICAgICAgICAgfQogCi0gICAgICAgICAgICBzd2l0Y2ggKGFsdDI3KSB7CisgICAgICAgICAgICBzd2l0Y2ggKGFsdDI4KSB7CiAgICAgICAgICAgICAgICAgY2FzZSAxIDoKLSAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MzM3NDoyOiAoICcuJyApCisgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjM1Mjc6MjogKCAnLicgKQogICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjMzNzQ6MjogKCAnLicgKQotICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzozMzc1OjM6ICcuJworICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzozNTI3OjI6ICggJy4nICkKKyAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MzUyODozOiAnLicKICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WE1lbWJlckZlYXR1cmVDYWxsQWNjZXNzKCkuZ2V0RnVsbFN0b3BLZXl3b3JkXzFfMV8wXzBfMV8wKCkpOyAKQEAgLTEyMTEzLDE2ICsxMjY2OSwxNiBAQAogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgIGNhc2UgMiA6Ci0gICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjMzODA6MjogKCAoIHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fTnVsbFNhZmVBc3NpZ25tZW50XzFfMV8wXzBfMV8xICkgKQorICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzozNTMzOjI6ICggKCBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX051bGxTYWZlQXNzaWdubWVudF8xXzFfMF8wXzFfMSApICkKICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzozMzgwOjI6ICggKCBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX051bGxTYWZlQXNzaWdubWVudF8xXzFfMF8wXzFfMSApICkKLSAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MzM4MTozOiAoIHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fTnVsbFNhZmVBc3NpZ25tZW50XzFfMV8wXzBfMV8xICkKKyAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MzUzMzoyOiAoICggcnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19OdWxsU2FmZUFzc2lnbm1lbnRfMV8xXzBfMF8xXzEgKSApCisgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjM1MzQ6MzogKCBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX051bGxTYWZlQXNzaWdubWVudF8xXzFfMF8wXzFfMSApCiAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhNZW1iZXJGZWF0dXJlQ2FsbEFjY2VzcygpLmdldE51bGxTYWZlQXNzaWdubWVudF8xXzFfMF8wXzFfMSgpKTsgCiAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MzM4MjozOiAoIHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fTnVsbFNhZmVBc3NpZ25tZW50XzFfMV8wXzBfMV8xICkKLSAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MzM4Mjo0OiBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX051bGxTYWZlQXNzaWdubWVudF8xXzFfMF8wXzFfMQorICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzozNTM1OjM6ICggcnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19OdWxsU2FmZUFzc2lnbm1lbnRfMV8xXzBfMF8xXzEgKQorICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzozNTM1OjQ6IHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fTnVsbFNhZmVBc3NpZ25tZW50XzFfMV8wXzBfMV8xCiAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMik7CiAgICAgICAgICAgICAgICAgICAgIHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fTnVsbFNhZmVBc3NpZ25tZW50XzFfMV8wXzBfMV8xKCk7CkBAIC0xMjE0MiwxNiArMTI2OTgsMTYgQEAKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICBjYXNlIDMgOgotICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzozMzg2OjI6ICggKCBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX0V4cGxpY2l0U3RhdGljQXNzaWdubWVudF8xXzFfMF8wXzFfMiApICkKKyAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MzUzOToyOiAoICggcnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19FeHBsaWNpdFN0YXRpY0Fzc2lnbm1lbnRfMV8xXzBfMF8xXzIgKSApCiAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MzM4NjoyOiAoICggcnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19FeHBsaWNpdFN0YXRpY0Fzc2lnbm1lbnRfMV8xXzBfMF8xXzIgKSApCi0gICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjMzODc6MzogKCBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX0V4cGxpY2l0U3RhdGljQXNzaWdubWVudF8xXzFfMF8wXzFfMiApCisgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjM1Mzk6MjogKCAoIHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fRXhwbGljaXRTdGF0aWNBc3NpZ25tZW50XzFfMV8wXzBfMV8yICkgKQorICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzozNTQwOjM6ICggcnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19FeHBsaWNpdFN0YXRpY0Fzc2lnbm1lbnRfMV8xXzBfMF8xXzIgKQogICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYTWVtYmVyRmVhdHVyZUNhbGxBY2Nlc3MoKS5nZXRFeHBsaWNpdFN0YXRpY0Fzc2lnbm1lbnRfMV8xXzBfMF8xXzIoKSk7IAogICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjMzODg6MzogKCBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX0V4cGxpY2l0U3RhdGljQXNzaWdubWVudF8xXzFfMF8wXzFfMiApCi0gICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjMzODg6NDogcnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19FeHBsaWNpdFN0YXRpY0Fzc2lnbm1lbnRfMV8xXzBfMF8xXzIKKyAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MzU0MTozOiAoIHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fRXhwbGljaXRTdGF0aWNBc3NpZ25tZW50XzFfMV8wXzBfMV8yICkKKyAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MzU0MTo0OiBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX0V4cGxpY2l0U3RhdGljQXNzaWdubWVudF8xXzFfMF8wXzFfMgogICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzIpOwogICAgICAgICAgICAgICAgICAgICBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX0V4cGxpY2l0U3RhdGljQXNzaWdubWVudF8xXzFfMF8wXzFfMigpOwpAQCAtMTIxODgsMjcgKzEyNzQ0LDI3IEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19BbHRlcm5hdGl2ZXNfMV8xXzNfMSIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzozMzk2OjE6IHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fQWx0ZXJuYXRpdmVzXzFfMV8zXzEgOiAoICggKCBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX01lbWJlckNhbGxBcmd1bWVudHNBc3NpZ25tZW50XzFfMV8zXzFfMCApICkgfCAoICggcnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19Hcm91cF8xXzFfM18xXzFfXzAgKSApICk7CisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MzU0OToxOiBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX0FsdGVybmF0aXZlc18xXzFfM18xIDogKCAoICggcnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19NZW1iZXJDYWxsQXJndW1lbnRzQXNzaWdubWVudF8xXzFfM18xXzAgKSApIHwgKCAoIHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fR3JvdXBfMV8xXzNfMV8xX18wICkgKSApOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fQWx0ZXJuYXRpdmVzXzFfMV8zXzEoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MzQwMDoxOiAoICggKCBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX01lbWJlckNhbGxBcmd1bWVudHNBc3NpZ25tZW50XzFfMV8zXzFfMCApICkgfCAoICggcnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19Hcm91cF8xXzFfM18xXzFfXzAgKSApICkKLSAgICAgICAgICAgIGludCBhbHQyOD0yOwotICAgICAgICAgICAgYWx0MjggPSBkZmEyOC5wcmVkaWN0KGlucHV0KTsKLSAgICAgICAgICAgIHN3aXRjaCAoYWx0MjgpIHsKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjM1NTM6MTogKCAoICggcnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19NZW1iZXJDYWxsQXJndW1lbnRzQXNzaWdubWVudF8xXzFfM18xXzAgKSApIHwgKCAoIHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fR3JvdXBfMV8xXzNfMV8xX18wICkgKSApCisgICAgICAgICAgICBpbnQgYWx0Mjk9MjsKKyAgICAgICAgICAgIGFsdDI5ID0gZGZhMjkucHJlZGljdChpbnB1dCk7CisgICAgICAgICAgICBzd2l0Y2ggKGFsdDI5KSB7CiAgICAgICAgICAgICAgICAgY2FzZSAxIDoKLSAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MzQwMToyOiAoICggcnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19NZW1iZXJDYWxsQXJndW1lbnRzQXNzaWdubWVudF8xXzFfM18xXzAgKSApCisgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjM1NTQ6MjogKCAoIHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fTWVtYmVyQ2FsbEFyZ3VtZW50c0Fzc2lnbm1lbnRfMV8xXzNfMV8wICkgKQogICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjM0MDE6MjogKCAoIHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fTWVtYmVyQ2FsbEFyZ3VtZW50c0Fzc2lnbm1lbnRfMV8xXzNfMV8wICkgKQotICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzozNDAyOjM6ICggcnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19NZW1iZXJDYWxsQXJndW1lbnRzQXNzaWdubWVudF8xXzFfM18xXzAgKQorICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzozNTU0OjI6ICggKCBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX01lbWJlckNhbGxBcmd1bWVudHNBc3NpZ25tZW50XzFfMV8zXzFfMCApICkKKyAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MzU1NTozOiAoIHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fTWVtYmVyQ2FsbEFyZ3VtZW50c0Fzc2lnbm1lbnRfMV8xXzNfMV8wICkKICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WE1lbWJlckZlYXR1cmVDYWxsQWNjZXNzKCkuZ2V0TWVtYmVyQ2FsbEFyZ3VtZW50c0Fzc2lnbm1lbnRfMV8xXzNfMV8wKCkpOyAKICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzozNDAzOjM6ICggcnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19NZW1iZXJDYWxsQXJndW1lbnRzQXNzaWdubWVudF8xXzFfM18xXzAgKQotICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzozNDAzOjQ6IHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fTWVtYmVyQ2FsbEFyZ3VtZW50c0Fzc2lnbm1lbnRfMV8xXzNfMV8wCisgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjM1NTY6MzogKCBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX01lbWJlckNhbGxBcmd1bWVudHNBc3NpZ25tZW50XzFfMV8zXzFfMCApCisgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjM1NTY6NDogcnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19NZW1iZXJDYWxsQXJndW1lbnRzQXNzaWdubWVudF8xXzFfM18xXzAKICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV18yKTsKICAgICAgICAgICAgICAgICAgICAgcnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19NZW1iZXJDYWxsQXJndW1lbnRzQXNzaWdubWVudF8xXzFfM18xXzAoKTsKQEAgLTEyMjI4LDE2ICsxMjc4NCwxNiBAQAogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgIGNhc2UgMiA6Ci0gICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjM0MDc6MjogKCAoIHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fR3JvdXBfMV8xXzNfMV8xX18wICkgKQorICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzozNTYwOjI6ICggKCBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX0dyb3VwXzFfMV8zXzFfMV9fMCApICkKICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzozNDA3OjI6ICggKCBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX0dyb3VwXzFfMV8zXzFfMV9fMCApICkKLSAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MzQwODozOiAoIHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fR3JvdXBfMV8xXzNfMV8xX18wICkKKyAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MzU2MDoyOiAoICggcnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19Hcm91cF8xXzFfM18xXzFfXzAgKSApCisgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjM1NjE6MzogKCBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX0dyb3VwXzFfMV8zXzFfMV9fMCApCiAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhNZW1iZXJGZWF0dXJlQ2FsbEFjY2VzcygpLmdldEdyb3VwXzFfMV8zXzFfMSgpKTsgCiAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MzQwOTozOiAoIHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fR3JvdXBfMV8xXzNfMV8xX18wICkKLSAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MzQwOTo0OiBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX0dyb3VwXzFfMV8zXzFfMV9fMAorICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzozNTYyOjM6ICggcnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19Hcm91cF8xXzFfM18xXzFfXzAgKQorICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzozNTYyOjQ6IHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fR3JvdXBfMV8xXzNfMV8xX18wCiAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMik7CiAgICAgICAgICAgICAgICAgICAgIHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fR3JvdXBfMV8xXzNfMV8xX18wKCk7CkBAIC0xMjI3NCwyMSArMTI4MzAsMjEgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YUHJpbWFyeUV4cHJlc3Npb25fX0FsdGVybmF0aXZlcyIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzozNDE3OjE6IHJ1bGVfX1hQcmltYXJ5RXhwcmVzc2lvbl9fQWx0ZXJuYXRpdmVzIDogKCAoIHJ1bGVYQ29uc3RydWN0b3JDYWxsICkgfCAoIHJ1bGVYQmxvY2tFeHByZXNzaW9uICkgfCAoIHJ1bGVYU3dpdGNoRXhwcmVzc2lvbiApIHwgKCAoIHJ1bGVYU3luY2hyb25pemVkRXhwcmVzc2lvbiApICkgfCAoIHJ1bGVYRmVhdHVyZUNhbGwgKSB8ICggcnVsZVhMaXRlcmFsICkgfCAoIHJ1bGVYSWZFeHByZXNzaW9uICkgfCAoICggcnVsZVhGb3JMb29wRXhwcmVzc2lvbiApICkgfCAoIHJ1bGVYQmFzaWNGb3JMb29wRXhwcmVzc2lvbiApIHwgKCBydWxlWFdoaWxlRXhwcmVzc2lvbiApIHwgKCBydWxlWERvV2hpbGVFeHByZXNzaW9uICkgfCAoIHJ1bGVYVGhyb3dFeHByZXNzaW9uICkgfCAoIHJ1bGVYUmV0dXJuRXhwcmVzc2lvbiApIHwgKCBydWxlWFRyeUNhdGNoRmluYWxseUV4cHJlc3Npb24gKSB8ICggcnVsZVhQYXJlbnRoZXNpemVkRXhwcmVzc2lvbiApICk7CisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MzU3MDoxOiBydWxlX19YUHJpbWFyeUV4cHJlc3Npb25fX0FsdGVybmF0aXZlcyA6ICggKCBydWxlWENvbnN0cnVjdG9yQ2FsbCApIHwgKCBydWxlWEJsb2NrRXhwcmVzc2lvbiApIHwgKCBydWxlWFN3aXRjaEV4cHJlc3Npb24gKSB8ICggKCBydWxlWFN5bmNocm9uaXplZEV4cHJlc3Npb24gKSApIHwgKCBydWxlWEZlYXR1cmVDYWxsICkgfCAoIHJ1bGVYTGl0ZXJhbCApIHwgKCBydWxlWElmRXhwcmVzc2lvbiApIHwgKCAoIHJ1bGVYRm9yTG9vcEV4cHJlc3Npb24gKSApIHwgKCBydWxlWEJhc2ljRm9yTG9vcEV4cHJlc3Npb24gKSB8ICggcnVsZVhXaGlsZUV4cHJlc3Npb24gKSB8ICggcnVsZVhEb1doaWxlRXhwcmVzc2lvbiApIHwgKCBydWxlWFRocm93RXhwcmVzc2lvbiApIHwgKCBydWxlWFJldHVybkV4cHJlc3Npb24gKSB8ICggcnVsZVhUcnlDYXRjaEZpbmFsbHlFeHByZXNzaW9uICkgfCAoIHJ1bGVYUGFyZW50aGVzaXplZEV4cHJlc3Npb24gKSApOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1hQcmltYXJ5RXhwcmVzc2lvbl9fQWx0ZXJuYXRpdmVzKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjM0MjE6MTogKCAoIHJ1bGVYQ29uc3RydWN0b3JDYWxsICkgfCAoIHJ1bGVYQmxvY2tFeHByZXNzaW9uICkgfCAoIHJ1bGVYU3dpdGNoRXhwcmVzc2lvbiApIHwgKCAoIHJ1bGVYU3luY2hyb25pemVkRXhwcmVzc2lvbiApICkgfCAoIHJ1bGVYRmVhdHVyZUNhbGwgKSB8ICggcnVsZVhMaXRlcmFsICkgfCAoIHJ1bGVYSWZFeHByZXNzaW9uICkgfCAoICggcnVsZVhGb3JMb29wRXhwcmVzc2lvbiApICkgfCAoIHJ1bGVYQmFzaWNGb3JMb29wRXhwcmVzc2lvbiApIHwgKCBydWxlWFdoaWxlRXhwcmVzc2lvbiApIHwgKCBydWxlWERvV2hpbGVFeHByZXNzaW9uICkgfCAoIHJ1bGVYVGhyb3dFeHByZXNzaW9uICkgfCAoIHJ1bGVYUmV0dXJuRXhwcmVzc2lvbiApIHwgKCBydWxlWFRyeUNhdGNoRmluYWxseUV4cHJlc3Npb24gKSB8ICggcnVsZVhQYXJlbnRoZXNpemVkRXhwcmVzc2lvbiApICkKLSAgICAgICAgICAgIGludCBhbHQyOT0xNTsKLSAgICAgICAgICAgIGFsdDI5ID0gZGZhMjkucHJlZGljdChpbnB1dCk7Ci0gICAgICAgICAgICBzd2l0Y2ggKGFsdDI5KSB7CisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzozNTc0OjE6ICggKCBydWxlWENvbnN0cnVjdG9yQ2FsbCApIHwgKCBydWxlWEJsb2NrRXhwcmVzc2lvbiApIHwgKCBydWxlWFN3aXRjaEV4cHJlc3Npb24gKSB8ICggKCBydWxlWFN5bmNocm9uaXplZEV4cHJlc3Npb24gKSApIHwgKCBydWxlWEZlYXR1cmVDYWxsICkgfCAoIHJ1bGVYTGl0ZXJhbCApIHwgKCBydWxlWElmRXhwcmVzc2lvbiApIHwgKCAoIHJ1bGVYRm9yTG9vcEV4cHJlc3Npb24gKSApIHwgKCBydWxlWEJhc2ljRm9yTG9vcEV4cHJlc3Npb24gKSB8ICggcnVsZVhXaGlsZUV4cHJlc3Npb24gKSB8ICggcnVsZVhEb1doaWxlRXhwcmVzc2lvbiApIHwgKCBydWxlWFRocm93RXhwcmVzc2lvbiApIHwgKCBydWxlWFJldHVybkV4cHJlc3Npb24gKSB8ICggcnVsZVhUcnlDYXRjaEZpbmFsbHlFeHByZXNzaW9uICkgfCAoIHJ1bGVYUGFyZW50aGVzaXplZEV4cHJlc3Npb24gKSApCisgICAgICAgICAgICBpbnQgYWx0MzA9MTU7CisgICAgICAgICAgICBhbHQzMCA9IGRmYTMwLnByZWRpY3QoaW5wdXQpOworICAgICAgICAgICAgc3dpdGNoIChhbHQzMCkgewogICAgICAgICAgICAgICAgIGNhc2UgMSA6Ci0gICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjM0MjI6MjogKCBydWxlWENvbnN0cnVjdG9yQ2FsbCApCisgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjM1NzU6MjogKCBydWxlWENvbnN0cnVjdG9yQ2FsbCApCiAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MzQyMjoyOiAoIHJ1bGVYQ29uc3RydWN0b3JDYWxsICkKLSAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MzQyMzozOiBydWxlWENvbnN0cnVjdG9yQ2FsbAorICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzozNTc1OjI6ICggcnVsZVhDb25zdHJ1Y3RvckNhbGwgKQorICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzozNTc2OjM6IHJ1bGVYQ29uc3RydWN0b3JDYWxsCiAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhQcmltYXJ5RXhwcmVzc2lvbkFjY2VzcygpLmdldFhDb25zdHJ1Y3RvckNhbGxQYXJzZXJSdWxlQ2FsbF8wKCkpOyAKQEAgLTEyMzA4LDEwICsxMjg2NCwxMCBAQAogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgIGNhc2UgMiA6Ci0gICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjM0Mjg6MjogKCBydWxlWEJsb2NrRXhwcmVzc2lvbiApCisgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjM1ODE6MjogKCBydWxlWEJsb2NrRXhwcmVzc2lvbiApCiAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MzQyODoyOiAoIHJ1bGVYQmxvY2tFeHByZXNzaW9uICkKLSAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MzQyOTozOiBydWxlWEJsb2NrRXhwcmVzc2lvbgorICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzozNTgxOjI6ICggcnVsZVhCbG9ja0V4cHJlc3Npb24gKQorICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzozNTgyOjM6IHJ1bGVYQmxvY2tFeHByZXNzaW9uCiAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhQcmltYXJ5RXhwcmVzc2lvbkFjY2VzcygpLmdldFhCbG9ja0V4cHJlc3Npb25QYXJzZXJSdWxlQ2FsbF8xKCkpOyAKQEAgLTEyMzMxLDEwICsxMjg4NywxMCBAQAogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgIGNhc2UgMyA6Ci0gICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjM0MzQ6MjogKCBydWxlWFN3aXRjaEV4cHJlc3Npb24gKQorICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzozNTg3OjI6ICggcnVsZVhTd2l0Y2hFeHByZXNzaW9uICkKICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzozNDM0OjI6ICggcnVsZVhTd2l0Y2hFeHByZXNzaW9uICkKLSAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MzQzNTozOiBydWxlWFN3aXRjaEV4cHJlc3Npb24KKyAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MzU4NzoyOiAoIHJ1bGVYU3dpdGNoRXhwcmVzc2lvbiApCisgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjM1ODg6MzogcnVsZVhTd2l0Y2hFeHByZXNzaW9uCiAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhQcmltYXJ5RXhwcmVzc2lvbkFjY2VzcygpLmdldFhTd2l0Y2hFeHByZXNzaW9uUGFyc2VyUnVsZUNhbGxfMigpKTsgCkBAIC0xMjM1NCwxNiArMTI5MTAsMTYgQEAKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICBjYXNlIDQgOgotICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzozNDQwOjI6ICggKCBydWxlWFN5bmNocm9uaXplZEV4cHJlc3Npb24gKSApCisgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjM1OTM6MjogKCAoIHJ1bGVYU3luY2hyb25pemVkRXhwcmVzc2lvbiApICkKICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzozNDQwOjI6ICggKCBydWxlWFN5bmNocm9uaXplZEV4cHJlc3Npb24gKSApCi0gICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjM0NDE6MzogKCBydWxlWFN5bmNocm9uaXplZEV4cHJlc3Npb24gKQorICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzozNTkzOjI6ICggKCBydWxlWFN5bmNocm9uaXplZEV4cHJlc3Npb24gKSApCisgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjM1OTQ6MzogKCBydWxlWFN5bmNocm9uaXplZEV4cHJlc3Npb24gKQogICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYUHJpbWFyeUV4cHJlc3Npb25BY2Nlc3MoKS5nZXRYU3luY2hyb25pemVkRXhwcmVzc2lvblBhcnNlclJ1bGVDYWxsXzMoKSk7IAogICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjM0NDI6MzogKCBydWxlWFN5bmNocm9uaXplZEV4cHJlc3Npb24gKQotICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzozNDQyOjQ6IHJ1bGVYU3luY2hyb25pemVkRXhwcmVzc2lvbgorICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzozNTk1OjM6ICggcnVsZVhTeW5jaHJvbml6ZWRFeHByZXNzaW9uICkKKyAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MzU5NTo0OiBydWxlWFN5bmNocm9uaXplZEV4cHJlc3Npb24KICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV18yKTsKICAgICAgICAgICAgICAgICAgICAgcnVsZVhTeW5jaHJvbml6ZWRFeHByZXNzaW9uKCk7CkBAIC0xMjM4MywxMCArMTI5MzksMTAgQEAKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICBjYXNlIDUgOgotICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzozNDQ2OjI6ICggcnVsZVhGZWF0dXJlQ2FsbCApCisgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjM1OTk6MjogKCBydWxlWEZlYXR1cmVDYWxsICkKICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzozNDQ2OjI6ICggcnVsZVhGZWF0dXJlQ2FsbCApCi0gICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjM0NDc6MzogcnVsZVhGZWF0dXJlQ2FsbAorICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzozNTk5OjI6ICggcnVsZVhGZWF0dXJlQ2FsbCApCisgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjM2MDA6MzogcnVsZVhGZWF0dXJlQ2FsbAogICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYUHJpbWFyeUV4cHJlc3Npb25BY2Nlc3MoKS5nZXRYRmVhdHVyZUNhbGxQYXJzZXJSdWxlQ2FsbF80KCkpOyAKQEAgLTEyNDA2LDEwICsxMjk2MiwxMCBAQAogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgIGNhc2UgNiA6Ci0gICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjM0NTI6MjogKCBydWxlWExpdGVyYWwgKQorICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzozNjA1OjI6ICggcnVsZVhMaXRlcmFsICkKICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzozNDUyOjI6ICggcnVsZVhMaXRlcmFsICkKLSAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MzQ1MzozOiBydWxlWExpdGVyYWwKKyAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MzYwNToyOiAoIHJ1bGVYTGl0ZXJhbCApCisgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjM2MDY6MzogcnVsZVhMaXRlcmFsCiAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhQcmltYXJ5RXhwcmVzc2lvbkFjY2VzcygpLmdldFhMaXRlcmFsUGFyc2VyUnVsZUNhbGxfNSgpKTsgCkBAIC0xMjQyOSwxMCArMTI5ODUsMTAgQEAKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICBjYXNlIDcgOgotICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzozNDU4OjI6ICggcnVsZVhJZkV4cHJlc3Npb24gKQorICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzozNjExOjI6ICggcnVsZVhJZkV4cHJlc3Npb24gKQogICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjM0NTg6MjogKCBydWxlWElmRXhwcmVzc2lvbiApCi0gICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjM0NTk6MzogcnVsZVhJZkV4cHJlc3Npb24KKyAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MzYxMToyOiAoIHJ1bGVYSWZFeHByZXNzaW9uICkKKyAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MzYxMjozOiBydWxlWElmRXhwcmVzc2lvbgogICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYUHJpbWFyeUV4cHJlc3Npb25BY2Nlc3MoKS5nZXRYSWZFeHByZXNzaW9uUGFyc2VyUnVsZUNhbGxfNigpKTsgCkBAIC0xMjQ1MiwxNiArMTMwMDgsMTYgQEAKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICBjYXNlIDggOgotICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzozNDY0OjI6ICggKCBydWxlWEZvckxvb3BFeHByZXNzaW9uICkgKQorICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzozNjE3OjI6ICggKCBydWxlWEZvckxvb3BFeHByZXNzaW9uICkgKQogICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjM0NjQ6MjogKCAoIHJ1bGVYRm9yTG9vcEV4cHJlc3Npb24gKSApCi0gICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjM0NjU6MzogKCBydWxlWEZvckxvb3BFeHByZXNzaW9uICkKKyAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MzYxNzoyOiAoICggcnVsZVhGb3JMb29wRXhwcmVzc2lvbiApICkKKyAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MzYxODozOiAoIHJ1bGVYRm9yTG9vcEV4cHJlc3Npb24gKQogICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYUHJpbWFyeUV4cHJlc3Npb25BY2Nlc3MoKS5nZXRYRm9yTG9vcEV4cHJlc3Npb25QYXJzZXJSdWxlQ2FsbF83KCkpOyAKICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzozNDY2OjM6ICggcnVsZVhGb3JMb29wRXhwcmVzc2lvbiApCi0gICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjM0NjY6NDogcnVsZVhGb3JMb29wRXhwcmVzc2lvbgorICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzozNjE5OjM6ICggcnVsZVhGb3JMb29wRXhwcmVzc2lvbiApCisgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjM2MTk6NDogcnVsZVhGb3JMb29wRXhwcmVzc2lvbgogICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzIpOwogICAgICAgICAgICAgICAgICAgICBydWxlWEZvckxvb3BFeHByZXNzaW9uKCk7CkBAIC0xMjQ4MSwxMCArMTMwMzcsMTAgQEAKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICBjYXNlIDkgOgotICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzozNDcwOjI6ICggcnVsZVhCYXNpY0Zvckxvb3BFeHByZXNzaW9uICkKKyAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MzYyMzoyOiAoIHJ1bGVYQmFzaWNGb3JMb29wRXhwcmVzc2lvbiApCiAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MzQ3MDoyOiAoIHJ1bGVYQmFzaWNGb3JMb29wRXhwcmVzc2lvbiApCi0gICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjM0NzE6MzogcnVsZVhCYXNpY0Zvckxvb3BFeHByZXNzaW9uCisgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjM2MjM6MjogKCBydWxlWEJhc2ljRm9yTG9vcEV4cHJlc3Npb24gKQorICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzozNjI0OjM6IHJ1bGVYQmFzaWNGb3JMb29wRXhwcmVzc2lvbgogICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYUHJpbWFyeUV4cHJlc3Npb25BY2Nlc3MoKS5nZXRYQmFzaWNGb3JMb29wRXhwcmVzc2lvblBhcnNlclJ1bGVDYWxsXzgoKSk7IApAQCAtMTI1MDQsMTAgKzEzMDYwLDEwIEBACiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgY2FzZSAxMCA6Ci0gICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjM0NzY6MjogKCBydWxlWFdoaWxlRXhwcmVzc2lvbiApCisgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjM2Mjk6MjogKCBydWxlWFdoaWxlRXhwcmVzc2lvbiApCiAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MzQ3NjoyOiAoIHJ1bGVYV2hpbGVFeHByZXNzaW9uICkKLSAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MzQ3NzozOiBydWxlWFdoaWxlRXhwcmVzc2lvbgorICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzozNjI5OjI6ICggcnVsZVhXaGlsZUV4cHJlc3Npb24gKQorICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzozNjMwOjM6IHJ1bGVYV2hpbGVFeHByZXNzaW9uCiAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhQcmltYXJ5RXhwcmVzc2lvbkFjY2VzcygpLmdldFhXaGlsZUV4cHJlc3Npb25QYXJzZXJSdWxlQ2FsbF85KCkpOyAKQEAgLTEyNTI3LDEwICsxMzA4MywxMCBAQAogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgIGNhc2UgMTEgOgotICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzozNDgyOjI6ICggcnVsZVhEb1doaWxlRXhwcmVzc2lvbiApCisgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjM2MzU6MjogKCBydWxlWERvV2hpbGVFeHByZXNzaW9uICkKICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzozNDgyOjI6ICggcnVsZVhEb1doaWxlRXhwcmVzc2lvbiApCi0gICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjM0ODM6MzogcnVsZVhEb1doaWxlRXhwcmVzc2lvbgorICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzozNjM1OjI6ICggcnVsZVhEb1doaWxlRXhwcmVzc2lvbiApCisgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjM2MzY6MzogcnVsZVhEb1doaWxlRXhwcmVzc2lvbgogICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYUHJpbWFyeUV4cHJlc3Npb25BY2Nlc3MoKS5nZXRYRG9XaGlsZUV4cHJlc3Npb25QYXJzZXJSdWxlQ2FsbF8xMCgpKTsgCkBAIC0xMjU1MCwxMCArMTMxMDYsMTAgQEAKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICBjYXNlIDEyIDoKLSAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MzQ4ODoyOiAoIHJ1bGVYVGhyb3dFeHByZXNzaW9uICkKKyAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MzY0MToyOiAoIHJ1bGVYVGhyb3dFeHByZXNzaW9uICkKICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzozNDg4OjI6ICggcnVsZVhUaHJvd0V4cHJlc3Npb24gKQotICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzozNDg5OjM6IHJ1bGVYVGhyb3dFeHByZXNzaW9uCisgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjM2NDE6MjogKCBydWxlWFRocm93RXhwcmVzc2lvbiApCisgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjM2NDI6MzogcnVsZVhUaHJvd0V4cHJlc3Npb24KICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WFByaW1hcnlFeHByZXNzaW9uQWNjZXNzKCkuZ2V0WFRocm93RXhwcmVzc2lvblBhcnNlclJ1bGVDYWxsXzExKCkpOyAKQEAgLTEyNTczLDEwICsxMzEyOSwxMCBAQAogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgIGNhc2UgMTMgOgotICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzozNDk0OjI6ICggcnVsZVhSZXR1cm5FeHByZXNzaW9uICkKKyAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MzY0NzoyOiAoIHJ1bGVYUmV0dXJuRXhwcmVzc2lvbiApCiAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MzQ5NDoyOiAoIHJ1bGVYUmV0dXJuRXhwcmVzc2lvbiApCi0gICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjM0OTU6MzogcnVsZVhSZXR1cm5FeHByZXNzaW9uCisgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjM2NDc6MjogKCBydWxlWFJldHVybkV4cHJlc3Npb24gKQorICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzozNjQ4OjM6IHJ1bGVYUmV0dXJuRXhwcmVzc2lvbgogICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYUHJpbWFyeUV4cHJlc3Npb25BY2Nlc3MoKS5nZXRYUmV0dXJuRXhwcmVzc2lvblBhcnNlclJ1bGVDYWxsXzEyKCkpOyAKQEAgLTEyNTk2LDEwICsxMzE1MiwxMCBAQAogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgIGNhc2UgMTQgOgotICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzozNTAwOjI6ICggcnVsZVhUcnlDYXRjaEZpbmFsbHlFeHByZXNzaW9uICkKKyAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MzY1MzoyOiAoIHJ1bGVYVHJ5Q2F0Y2hGaW5hbGx5RXhwcmVzc2lvbiApCiAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MzUwMDoyOiAoIHJ1bGVYVHJ5Q2F0Y2hGaW5hbGx5RXhwcmVzc2lvbiApCi0gICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjM1MDE6MzogcnVsZVhUcnlDYXRjaEZpbmFsbHlFeHByZXNzaW9uCisgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjM2NTM6MjogKCBydWxlWFRyeUNhdGNoRmluYWxseUV4cHJlc3Npb24gKQorICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzozNjU0OjM6IHJ1bGVYVHJ5Q2F0Y2hGaW5hbGx5RXhwcmVzc2lvbgogICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYUHJpbWFyeUV4cHJlc3Npb25BY2Nlc3MoKS5nZXRYVHJ5Q2F0Y2hGaW5hbGx5RXhwcmVzc2lvblBhcnNlclJ1bGVDYWxsXzEzKCkpOyAKQEAgLTEyNjE5LDEwICsxMzE3NSwxMCBAQAogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgIGNhc2UgMTUgOgotICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzozNTA2OjI6ICggcnVsZVhQYXJlbnRoZXNpemVkRXhwcmVzc2lvbiApCisgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjM2NTk6MjogKCBydWxlWFBhcmVudGhlc2l6ZWRFeHByZXNzaW9uICkKICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzozNTA2OjI6ICggcnVsZVhQYXJlbnRoZXNpemVkRXhwcmVzc2lvbiApCi0gICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjM1MDc6MzogcnVsZVhQYXJlbnRoZXNpemVkRXhwcmVzc2lvbgorICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzozNjU5OjI6ICggcnVsZVhQYXJlbnRoZXNpemVkRXhwcmVzc2lvbiApCisgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjM2NjA6MzogcnVsZVhQYXJlbnRoZXNpemVkRXhwcmVzc2lvbgogICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYUHJpbWFyeUV4cHJlc3Npb25BY2Nlc3MoKS5nZXRYUGFyZW50aGVzaXplZEV4cHJlc3Npb25QYXJzZXJSdWxlQ2FsbF8xNCgpKTsgCkBAIC0xMjY1OSw2NyArMTMyMTUsNjcgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YTGl0ZXJhbF9fQWx0ZXJuYXRpdmVzIgotICAgIC8vIEludGVybmFsRGF0YURTTC5nOjM1MTY6MTogcnVsZV9fWExpdGVyYWxfX0FsdGVybmF0aXZlcyA6ICggKCBydWxlWENvbGxlY3Rpb25MaXRlcmFsICkgfCAoICggcnVsZVhDbG9zdXJlICkgKSB8ICggcnVsZVhCb29sZWFuTGl0ZXJhbCApIHwgKCBydWxlWE51bWJlckxpdGVyYWwgKSB8ICggcnVsZVhOdWxsTGl0ZXJhbCApIHwgKCBydWxlWFN0cmluZ0xpdGVyYWwgKSB8ICggcnVsZVhUeXBlTGl0ZXJhbCApICk7CisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MzY2OToxOiBydWxlX19YTGl0ZXJhbF9fQWx0ZXJuYXRpdmVzIDogKCAoIHJ1bGVYQ29sbGVjdGlvbkxpdGVyYWwgKSB8ICggKCBydWxlWENsb3N1cmUgKSApIHwgKCBydWxlWEJvb2xlYW5MaXRlcmFsICkgfCAoIHJ1bGVYTnVtYmVyTGl0ZXJhbCApIHwgKCBydWxlWE51bGxMaXRlcmFsICkgfCAoIHJ1bGVYU3RyaW5nTGl0ZXJhbCApIHwgKCBydWxlWFR5cGVMaXRlcmFsICkgKTsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YTGl0ZXJhbF9fQWx0ZXJuYXRpdmVzKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjM1MjA6MTogKCAoIHJ1bGVYQ29sbGVjdGlvbkxpdGVyYWwgKSB8ICggKCBydWxlWENsb3N1cmUgKSApIHwgKCBydWxlWEJvb2xlYW5MaXRlcmFsICkgfCAoIHJ1bGVYTnVtYmVyTGl0ZXJhbCApIHwgKCBydWxlWE51bGxMaXRlcmFsICkgfCAoIHJ1bGVYU3RyaW5nTGl0ZXJhbCApIHwgKCBydWxlWFR5cGVMaXRlcmFsICkgKQotICAgICAgICAgICAgaW50IGFsdDMwPTc7CisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzozNjczOjE6ICggKCBydWxlWENvbGxlY3Rpb25MaXRlcmFsICkgfCAoICggcnVsZVhDbG9zdXJlICkgKSB8ICggcnVsZVhCb29sZWFuTGl0ZXJhbCApIHwgKCBydWxlWE51bWJlckxpdGVyYWwgKSB8ICggcnVsZVhOdWxsTGl0ZXJhbCApIHwgKCBydWxlWFN0cmluZ0xpdGVyYWwgKSB8ICggcnVsZVhUeXBlTGl0ZXJhbCApICkKKyAgICAgICAgICAgIGludCBhbHQzMT03OwogICAgICAgICAgICAgc3dpdGNoICggaW5wdXQuTEEoMSkgKSB7Ci0gICAgICAgICAgICBjYXNlIDExNzoKKyAgICAgICAgICAgIGNhc2UgMTI3OgogICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBhbHQzMD0xOworICAgICAgICAgICAgICAgIGFsdDMxPTE7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSAxMTg6CisgICAgICAgICAgICBjYXNlIDEyODoKICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgYWx0MzA9MjsKKyAgICAgICAgICAgICAgICBhbHQzMT0yOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIGNhc2UgNTA6Ci0gICAgICAgICAgICBjYXNlIDE1NDoKKyAgICAgICAgICAgIGNhc2UgMTY2OgogICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBhbHQzMD0zOworICAgICAgICAgICAgICAgIGFsdDMxPTM7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgY2FzZSBSVUxFX0hFWDoKICAgICAgICAgICAgIGNhc2UgUlVMRV9JTlQ6CiAgICAgICAgICAgICBjYXNlIFJVTEVfREVDSU1BTDoKICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgYWx0MzA9NDsKKyAgICAgICAgICAgICAgICBhbHQzMT00OwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgMTI5OgorICAgICAgICAgICAgY2FzZSAxMzk6CiAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGFsdDMwPTU7CisgICAgICAgICAgICAgICAgYWx0MzE9NTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICBjYXNlIFJVTEVfU1RSSU5HOgogICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBhbHQzMD02OworICAgICAgICAgICAgICAgIGFsdDMxPTY7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSAxMzA6CisgICAgICAgICAgICBjYXNlIDE0MDoKICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgYWx0MzA9NzsKKyAgICAgICAgICAgICAgICBhbHQzMT03OwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICAgICAgaWYgKHN0YXRlLmJhY2t0cmFja2luZz4wKSB7c3RhdGUuZmFpbGVkPXRydWU7IHJldHVybiA7fQogICAgICAgICAgICAgICAgIE5vVmlhYmxlQWx0RXhjZXB0aW9uIG52YWUgPQotICAgICAgICAgICAgICAgICAgICBuZXcgTm9WaWFibGVBbHRFeGNlcHRpb24oIiIsIDMwLCAwLCBpbnB1dCk7CisgICAgICAgICAgICAgICAgICAgIG5ldyBOb1ZpYWJsZUFsdEV4Y2VwdGlvbigiIiwgMzEsIDAsIGlucHV0KTsKIAogICAgICAgICAgICAgICAgIHRocm93IG52YWU7CiAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgIHN3aXRjaCAoYWx0MzApIHsKKyAgICAgICAgICAgIHN3aXRjaCAoYWx0MzEpIHsKICAgICAgICAgICAgICAgICBjYXNlIDEgOgotICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzozNTIxOjI6ICggcnVsZVhDb2xsZWN0aW9uTGl0ZXJhbCApCisgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjM2NzQ6MjogKCBydWxlWENvbGxlY3Rpb25MaXRlcmFsICkKICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzozNTIxOjI6ICggcnVsZVhDb2xsZWN0aW9uTGl0ZXJhbCApCi0gICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjM1MjI6MzogcnVsZVhDb2xsZWN0aW9uTGl0ZXJhbAorICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzozNjc0OjI6ICggcnVsZVhDb2xsZWN0aW9uTGl0ZXJhbCApCisgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjM2NzU6MzogcnVsZVhDb2xsZWN0aW9uTGl0ZXJhbAogICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYTGl0ZXJhbEFjY2VzcygpLmdldFhDb2xsZWN0aW9uTGl0ZXJhbFBhcnNlclJ1bGVDYWxsXzAoKSk7IApAQCAtMTI3MzksMTYgKzEzMjk1LDE2IEBACiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgY2FzZSAyIDoKLSAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MzUyNzoyOiAoICggcnVsZVhDbG9zdXJlICkgKQorICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzozNjgwOjI6ICggKCBydWxlWENsb3N1cmUgKSApCiAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MzUyNzoyOiAoICggcnVsZVhDbG9zdXJlICkgKQotICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzozNTI4OjM6ICggcnVsZVhDbG9zdXJlICkKKyAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MzY4MDoyOiAoICggcnVsZVhDbG9zdXJlICkgKQorICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzozNjgxOjM6ICggcnVsZVhDbG9zdXJlICkKICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WExpdGVyYWxBY2Nlc3MoKS5nZXRYQ2xvc3VyZVBhcnNlclJ1bGVDYWxsXzEoKSk7IAogICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjM1Mjk6MzogKCBydWxlWENsb3N1cmUgKQotICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzozNTI5OjQ6IHJ1bGVYQ2xvc3VyZQorICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzozNjgyOjM6ICggcnVsZVhDbG9zdXJlICkKKyAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MzY4Mjo0OiBydWxlWENsb3N1cmUKICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV18yKTsKICAgICAgICAgICAgICAgICAgICAgcnVsZVhDbG9zdXJlKCk7CkBAIC0xMjc2OCwxMCArMTMzMjQsMTAgQEAKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICBjYXNlIDMgOgotICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzozNTMzOjI6ICggcnVsZVhCb29sZWFuTGl0ZXJhbCApCisgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjM2ODY6MjogKCBydWxlWEJvb2xlYW5MaXRlcmFsICkKICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzozNTMzOjI6ICggcnVsZVhCb29sZWFuTGl0ZXJhbCApCi0gICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjM1MzQ6MzogcnVsZVhCb29sZWFuTGl0ZXJhbAorICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzozNjg2OjI6ICggcnVsZVhCb29sZWFuTGl0ZXJhbCApCisgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjM2ODc6MzogcnVsZVhCb29sZWFuTGl0ZXJhbAogICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYTGl0ZXJhbEFjY2VzcygpLmdldFhCb29sZWFuTGl0ZXJhbFBhcnNlclJ1bGVDYWxsXzIoKSk7IApAQCAtMTI3OTEsMTAgKzEzMzQ3LDEwIEBACiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgY2FzZSA0IDoKLSAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MzUzOToyOiAoIHJ1bGVYTnVtYmVyTGl0ZXJhbCApCisgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjM2OTI6MjogKCBydWxlWE51bWJlckxpdGVyYWwgKQogICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjM1Mzk6MjogKCBydWxlWE51bWJlckxpdGVyYWwgKQotICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzozNTQwOjM6IHJ1bGVYTnVtYmVyTGl0ZXJhbAorICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzozNjkyOjI6ICggcnVsZVhOdW1iZXJMaXRlcmFsICkKKyAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MzY5MzozOiBydWxlWE51bWJlckxpdGVyYWwKICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WExpdGVyYWxBY2Nlc3MoKS5nZXRYTnVtYmVyTGl0ZXJhbFBhcnNlclJ1bGVDYWxsXzMoKSk7IApAQCAtMTI4MTQsMTAgKzEzMzcwLDEwIEBACiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgY2FzZSA1IDoKLSAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MzU0NToyOiAoIHJ1bGVYTnVsbExpdGVyYWwgKQorICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzozNjk4OjI6ICggcnVsZVhOdWxsTGl0ZXJhbCApCiAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MzU0NToyOiAoIHJ1bGVYTnVsbExpdGVyYWwgKQotICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzozNTQ2OjM6IHJ1bGVYTnVsbExpdGVyYWwKKyAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MzY5ODoyOiAoIHJ1bGVYTnVsbExpdGVyYWwgKQorICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzozNjk5OjM6IHJ1bGVYTnVsbExpdGVyYWwKICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WExpdGVyYWxBY2Nlc3MoKS5nZXRYTnVsbExpdGVyYWxQYXJzZXJSdWxlQ2FsbF80KCkpOyAKQEAgLTEyODM3LDEwICsxMzM5MywxMCBAQAogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgIGNhc2UgNiA6Ci0gICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjM1NTE6MjogKCBydWxlWFN0cmluZ0xpdGVyYWwgKQorICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzozNzA0OjI6ICggcnVsZVhTdHJpbmdMaXRlcmFsICkKICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzozNTUxOjI6ICggcnVsZVhTdHJpbmdMaXRlcmFsICkKLSAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MzU1MjozOiBydWxlWFN0cmluZ0xpdGVyYWwKKyAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MzcwNDoyOiAoIHJ1bGVYU3RyaW5nTGl0ZXJhbCApCisgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjM3MDU6MzogcnVsZVhTdHJpbmdMaXRlcmFsCiAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhMaXRlcmFsQWNjZXNzKCkuZ2V0WFN0cmluZ0xpdGVyYWxQYXJzZXJSdWxlQ2FsbF81KCkpOyAKQEAgLTEyODYwLDEwICsxMzQxNiwxMCBAQAogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgIGNhc2UgNyA6Ci0gICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjM1NTc6MjogKCBydWxlWFR5cGVMaXRlcmFsICkKKyAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MzcxMDoyOiAoIHJ1bGVYVHlwZUxpdGVyYWwgKQogICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjM1NTc6MjogKCBydWxlWFR5cGVMaXRlcmFsICkKLSAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MzU1ODozOiBydWxlWFR5cGVMaXRlcmFsCisgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjM3MTA6MjogKCBydWxlWFR5cGVMaXRlcmFsICkKKyAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MzcxMTozOiBydWxlWFR5cGVMaXRlcmFsCiAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhMaXRlcmFsQWNjZXNzKCkuZ2V0WFR5cGVMaXRlcmFsUGFyc2VyUnVsZUNhbGxfNigpKTsgCkBAIC0xMjkwMCwyOSArMTM0NTYsMjkgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YQ29sbGVjdGlvbkxpdGVyYWxfX0FsdGVybmF0aXZlcyIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzozNTY3OjE6IHJ1bGVfX1hDb2xsZWN0aW9uTGl0ZXJhbF9fQWx0ZXJuYXRpdmVzIDogKCAoIHJ1bGVYU2V0TGl0ZXJhbCApIHwgKCBydWxlWExpc3RMaXRlcmFsICkgKTsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzozNzIwOjE6IHJ1bGVfX1hDb2xsZWN0aW9uTGl0ZXJhbF9fQWx0ZXJuYXRpdmVzIDogKCAoIHJ1bGVYU2V0TGl0ZXJhbCApIHwgKCBydWxlWExpc3RMaXRlcmFsICkgKTsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YQ29sbGVjdGlvbkxpdGVyYWxfX0FsdGVybmF0aXZlcygpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzozNTcxOjE6ICggKCBydWxlWFNldExpdGVyYWwgKSB8ICggcnVsZVhMaXN0TGl0ZXJhbCApICkKLSAgICAgICAgICAgIGludCBhbHQzMT0yOwotICAgICAgICAgICAgaW50IExBMzFfMCA9IGlucHV0LkxBKDEpOworICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MzcyNDoxOiAoICggcnVsZVhTZXRMaXRlcmFsICkgfCAoIHJ1bGVYTGlzdExpdGVyYWwgKSApCisgICAgICAgICAgICBpbnQgYWx0MzI9MjsKKyAgICAgICAgICAgIGludCBMQTMyXzAgPSBpbnB1dC5MQSgxKTsKIAotICAgICAgICAgICAgaWYgKCAoTEEzMV8wPT0xMTcpICkgewotICAgICAgICAgICAgICAgIGludCBMQTMxXzEgPSBpbnB1dC5MQSgyKTsKKyAgICAgICAgICAgIGlmICggKExBMzJfMD09MTI3KSApIHsKKyAgICAgICAgICAgICAgICBpbnQgTEEzMl8xID0gaW5wdXQuTEEoMik7CiAKLSAgICAgICAgICAgICAgICBpZiAoIChMQTMxXzE9PTcwKSApIHsKLSAgICAgICAgICAgICAgICAgICAgYWx0MzE9MTsKKyAgICAgICAgICAgICAgICBpZiAoIChMQTMyXzE9PTc1KSApIHsKKyAgICAgICAgICAgICAgICAgICAgYWx0MzI9MTsKICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZSBpZiAoIChMQTMxXzE9PTExOCkgKSB7Ci0gICAgICAgICAgICAgICAgICAgIGFsdDMxPTI7CisgICAgICAgICAgICAgICAgZWxzZSBpZiAoIChMQTMyXzE9PTEyOCkgKSB7CisgICAgICAgICAgICAgICAgICAgIGFsdDMyPTI7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICBpZiAoc3RhdGUuYmFja3RyYWNraW5nPjApIHtzdGF0ZS5mYWlsZWQ9dHJ1ZTsgcmV0dXJuIDt9CiAgICAgICAgICAgICAgICAgICAgIE5vVmlhYmxlQWx0RXhjZXB0aW9uIG52YWUgPQotICAgICAgICAgICAgICAgICAgICAgICAgbmV3IE5vVmlhYmxlQWx0RXhjZXB0aW9uKCIiLCAzMSwgMSwgaW5wdXQpOworICAgICAgICAgICAgICAgICAgICAgICAgbmV3IE5vVmlhYmxlQWx0RXhjZXB0aW9uKCIiLCAzMiwgMSwgaW5wdXQpOwogCiAgICAgICAgICAgICAgICAgICAgIHRocm93IG52YWU7CiAgICAgICAgICAgICAgICAgfQpAQCAtMTI5MzAsMTYgKzEzNDg2LDE2IEBACiAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICBpZiAoc3RhdGUuYmFja3RyYWNraW5nPjApIHtzdGF0ZS5mYWlsZWQ9dHJ1ZTsgcmV0dXJuIDt9CiAgICAgICAgICAgICAgICAgTm9WaWFibGVBbHRFeGNlcHRpb24gbnZhZSA9Ci0gICAgICAgICAgICAgICAgICAgIG5ldyBOb1ZpYWJsZUFsdEV4Y2VwdGlvbigiIiwgMzEsIDAsIGlucHV0KTsKKyAgICAgICAgICAgICAgICAgICAgbmV3IE5vVmlhYmxlQWx0RXhjZXB0aW9uKCIiLCAzMiwgMCwgaW5wdXQpOwogCiAgICAgICAgICAgICAgICAgdGhyb3cgbnZhZTsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHN3aXRjaCAoYWx0MzEpIHsKKyAgICAgICAgICAgIHN3aXRjaCAoYWx0MzIpIHsKICAgICAgICAgICAgICAgICBjYXNlIDEgOgotICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzozNTcyOjI6ICggcnVsZVhTZXRMaXRlcmFsICkKKyAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MzcyNToyOiAoIHJ1bGVYU2V0TGl0ZXJhbCApCiAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MzU3MjoyOiAoIHJ1bGVYU2V0TGl0ZXJhbCApCi0gICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjM1NzM6MzogcnVsZVhTZXRMaXRlcmFsCisgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjM3MjU6MjogKCBydWxlWFNldExpdGVyYWwgKQorICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzozNzI2OjM6IHJ1bGVYU2V0TGl0ZXJhbAogICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYQ29sbGVjdGlvbkxpdGVyYWxBY2Nlc3MoKS5nZXRYU2V0TGl0ZXJhbFBhcnNlclJ1bGVDYWxsXzAoKSk7IApAQCAtMTI5NTksMTAgKzEzNTE1LDEwIEBACiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgY2FzZSAyIDoKLSAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MzU3ODoyOiAoIHJ1bGVYTGlzdExpdGVyYWwgKQorICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzozNzMxOjI6ICggcnVsZVhMaXN0TGl0ZXJhbCApCiAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MzU3ODoyOiAoIHJ1bGVYTGlzdExpdGVyYWwgKQotICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzozNTc5OjM6IHJ1bGVYTGlzdExpdGVyYWwKKyAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MzczMToyOiAoIHJ1bGVYTGlzdExpdGVyYWwgKQorICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzozNzMyOjM6IHJ1bGVYTGlzdExpdGVyYWwKICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WENvbGxlY3Rpb25MaXRlcmFsQWNjZXNzKCkuZ2V0WExpc3RMaXRlcmFsUGFyc2VyUnVsZUNhbGxfMSgpKTsgCkBAIC0xMjk5OSwyNyArMTM1NTUsMjcgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YU3dpdGNoRXhwcmVzc2lvbl9fQWx0ZXJuYXRpdmVzXzIiCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MzU4ODoxOiBydWxlX19YU3dpdGNoRXhwcmVzc2lvbl9fQWx0ZXJuYXRpdmVzXzIgOiAoICggKCBydWxlX19YU3dpdGNoRXhwcmVzc2lvbl9fR3JvdXBfMl8wX18wICkgKSB8ICggKCBydWxlX19YU3dpdGNoRXhwcmVzc2lvbl9fR3JvdXBfMl8xX18wICkgKSApOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjM3NDE6MTogcnVsZV9fWFN3aXRjaEV4cHJlc3Npb25fX0FsdGVybmF0aXZlc18yIDogKCAoICggcnVsZV9fWFN3aXRjaEV4cHJlc3Npb25fX0dyb3VwXzJfMF9fMCApICkgfCAoICggcnVsZV9fWFN3aXRjaEV4cHJlc3Npb25fX0dyb3VwXzJfMV9fMCApICkgKTsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YU3dpdGNoRXhwcmVzc2lvbl9fQWx0ZXJuYXRpdmVzXzIoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MzU5MjoxOiAoICggKCBydWxlX19YU3dpdGNoRXhwcmVzc2lvbl9fR3JvdXBfMl8wX18wICkgKSB8ICggKCBydWxlX19YU3dpdGNoRXhwcmVzc2lvbl9fR3JvdXBfMl8xX18wICkgKSApCi0gICAgICAgICAgICBpbnQgYWx0MzI9MjsKLSAgICAgICAgICAgIGFsdDMyID0gZGZhMzIucHJlZGljdChpbnB1dCk7Ci0gICAgICAgICAgICBzd2l0Y2ggKGFsdDMyKSB7CisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzozNzQ1OjE6ICggKCAoIHJ1bGVfX1hTd2l0Y2hFeHByZXNzaW9uX19Hcm91cF8yXzBfXzAgKSApIHwgKCAoIHJ1bGVfX1hTd2l0Y2hFeHByZXNzaW9uX19Hcm91cF8yXzFfXzAgKSApICkKKyAgICAgICAgICAgIGludCBhbHQzMz0yOworICAgICAgICAgICAgYWx0MzMgPSBkZmEzMy5wcmVkaWN0KGlucHV0KTsKKyAgICAgICAgICAgIHN3aXRjaCAoYWx0MzMpIHsKICAgICAgICAgICAgICAgICBjYXNlIDEgOgotICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzozNTkzOjI6ICggKCBydWxlX19YU3dpdGNoRXhwcmVzc2lvbl9fR3JvdXBfMl8wX18wICkgKQorICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzozNzQ2OjI6ICggKCBydWxlX19YU3dpdGNoRXhwcmVzc2lvbl9fR3JvdXBfMl8wX18wICkgKQogICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjM1OTM6MjogKCAoIHJ1bGVfX1hTd2l0Y2hFeHByZXNzaW9uX19Hcm91cF8yXzBfXzAgKSApCi0gICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjM1OTQ6MzogKCBydWxlX19YU3dpdGNoRXhwcmVzc2lvbl9fR3JvdXBfMl8wX18wICkKKyAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6Mzc0NjoyOiAoICggcnVsZV9fWFN3aXRjaEV4cHJlc3Npb25fX0dyb3VwXzJfMF9fMCApICkKKyAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6Mzc0NzozOiAoIHJ1bGVfX1hTd2l0Y2hFeHByZXNzaW9uX19Hcm91cF8yXzBfXzAgKQogICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYU3dpdGNoRXhwcmVzc2lvbkFjY2VzcygpLmdldEdyb3VwXzJfMCgpKTsgCiAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MzU5NTozOiAoIHJ1bGVfX1hTd2l0Y2hFeHByZXNzaW9uX19Hcm91cF8yXzBfXzAgKQotICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzozNTk1OjQ6IHJ1bGVfX1hTd2l0Y2hFeHByZXNzaW9uX19Hcm91cF8yXzBfXzAKKyAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6Mzc0ODozOiAoIHJ1bGVfX1hTd2l0Y2hFeHByZXNzaW9uX19Hcm91cF8yXzBfXzAgKQorICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzozNzQ4OjQ6IHJ1bGVfX1hTd2l0Y2hFeHByZXNzaW9uX19Hcm91cF8yXzBfXzAKICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV18yKTsKICAgICAgICAgICAgICAgICAgICAgcnVsZV9fWFN3aXRjaEV4cHJlc3Npb25fX0dyb3VwXzJfMF9fMCgpOwpAQCAtMTMwMzksMTYgKzEzNTk1LDE2IEBACiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgY2FzZSAyIDoKLSAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MzU5OToyOiAoICggcnVsZV9fWFN3aXRjaEV4cHJlc3Npb25fX0dyb3VwXzJfMV9fMCApICkKKyAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6Mzc1MjoyOiAoICggcnVsZV9fWFN3aXRjaEV4cHJlc3Npb25fX0dyb3VwXzJfMV9fMCApICkKICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzozNTk5OjI6ICggKCBydWxlX19YU3dpdGNoRXhwcmVzc2lvbl9fR3JvdXBfMl8xX18wICkgKQotICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzozNjAwOjM6ICggcnVsZV9fWFN3aXRjaEV4cHJlc3Npb25fX0dyb3VwXzJfMV9fMCApCisgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjM3NTI6MjogKCAoIHJ1bGVfX1hTd2l0Y2hFeHByZXNzaW9uX19Hcm91cF8yXzFfXzAgKSApCisgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjM3NTM6MzogKCBydWxlX19YU3dpdGNoRXhwcmVzc2lvbl9fR3JvdXBfMl8xX18wICkKICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WFN3aXRjaEV4cHJlc3Npb25BY2Nlc3MoKS5nZXRHcm91cF8yXzEoKSk7IAogICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjM2MDE6MzogKCBydWxlX19YU3dpdGNoRXhwcmVzc2lvbl9fR3JvdXBfMl8xX18wICkKLSAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MzYwMTo0OiBydWxlX19YU3dpdGNoRXhwcmVzc2lvbl9fR3JvdXBfMl8xX18wCisgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjM3NTQ6MzogKCBydWxlX19YU3dpdGNoRXhwcmVzc2lvbl9fR3JvdXBfMl8xX18wICkKKyAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6Mzc1NDo0OiBydWxlX19YU3dpdGNoRXhwcmVzc2lvbl9fR3JvdXBfMl8xX18wCiAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMik7CiAgICAgICAgICAgICAgICAgICAgIHJ1bGVfX1hTd2l0Y2hFeHByZXNzaW9uX19Hcm91cF8yXzFfXzAoKTsKQEAgLTEzMDg1LDQxICsxMzY0MSw0MSBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX1hDYXNlUGFydF9fQWx0ZXJuYXRpdmVzXzMiCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MzYwOToxOiBydWxlX19YQ2FzZVBhcnRfX0FsdGVybmF0aXZlc18zIDogKCAoICggcnVsZV9fWENhc2VQYXJ0X19Hcm91cF8zXzBfXzAgKSApIHwgKCAoIHJ1bGVfX1hDYXNlUGFydF9fRmFsbFRocm91Z2hBc3NpZ25tZW50XzNfMSApICkgKTsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzozNzYyOjE6IHJ1bGVfX1hDYXNlUGFydF9fQWx0ZXJuYXRpdmVzXzMgOiAoICggKCBydWxlX19YQ2FzZVBhcnRfX0dyb3VwXzNfMF9fMCApICkgfCAoICggcnVsZV9fWENhc2VQYXJ0X19GYWxsVGhyb3VnaEFzc2lnbm1lbnRfM18xICkgKSApOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1hDYXNlUGFydF9fQWx0ZXJuYXRpdmVzXzMoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MzYxMzoxOiAoICggKCBydWxlX19YQ2FzZVBhcnRfX0dyb3VwXzNfMF9fMCApICkgfCAoICggcnVsZV9fWENhc2VQYXJ0X19GYWxsVGhyb3VnaEFzc2lnbm1lbnRfM18xICkgKSApCi0gICAgICAgICAgICBpbnQgYWx0MzM9MjsKLSAgICAgICAgICAgIGludCBMQTMzXzAgPSBpbnB1dC5MQSgxKTsKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjM3NjY6MTogKCAoICggcnVsZV9fWENhc2VQYXJ0X19Hcm91cF8zXzBfXzAgKSApIHwgKCAoIHJ1bGVfX1hDYXNlUGFydF9fRmFsbFRocm91Z2hBc3NpZ25tZW50XzNfMSApICkgKQorICAgICAgICAgICAgaW50IGFsdDM0PTI7CisgICAgICAgICAgICBpbnQgTEEzNF8wID0gaW5wdXQuTEEoMSk7CiAKLSAgICAgICAgICAgIGlmICggKExBMzNfMD09MTIzKSApIHsKLSAgICAgICAgICAgICAgICBhbHQzMz0xOworICAgICAgICAgICAgaWYgKCAoTEEzNF8wPT0xMzMpICkgeworICAgICAgICAgICAgICAgIGFsdDM0PTE7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIGlmICggKExBMzNfMD09MTE1KSApIHsKLSAgICAgICAgICAgICAgICBhbHQzMz0yOworICAgICAgICAgICAgZWxzZSBpZiAoIChMQTM0XzA9PTEyNSkgKSB7CisgICAgICAgICAgICAgICAgYWx0MzQ9MjsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgIGlmIChzdGF0ZS5iYWNrdHJhY2tpbmc+MCkge3N0YXRlLmZhaWxlZD10cnVlOyByZXR1cm4gO30KICAgICAgICAgICAgICAgICBOb1ZpYWJsZUFsdEV4Y2VwdGlvbiBudmFlID0KLSAgICAgICAgICAgICAgICAgICAgbmV3IE5vVmlhYmxlQWx0RXhjZXB0aW9uKCIiLCAzMywgMCwgaW5wdXQpOworICAgICAgICAgICAgICAgICAgICBuZXcgTm9WaWFibGVBbHRFeGNlcHRpb24oIiIsIDM0LCAwLCBpbnB1dCk7CiAKICAgICAgICAgICAgICAgICB0aHJvdyBudmFlOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgc3dpdGNoIChhbHQzMykgeworICAgICAgICAgICAgc3dpdGNoIChhbHQzNCkgewogICAgICAgICAgICAgICAgIGNhc2UgMSA6Ci0gICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjM2MTQ6MjogKCAoIHJ1bGVfX1hDYXNlUGFydF9fR3JvdXBfM18wX18wICkgKQorICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzozNzY3OjI6ICggKCBydWxlX19YQ2FzZVBhcnRfX0dyb3VwXzNfMF9fMCApICkKICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzozNjE0OjI6ICggKCBydWxlX19YQ2FzZVBhcnRfX0dyb3VwXzNfMF9fMCApICkKLSAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MzYxNTozOiAoIHJ1bGVfX1hDYXNlUGFydF9fR3JvdXBfM18wX18wICkKKyAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6Mzc2NzoyOiAoICggcnVsZV9fWENhc2VQYXJ0X19Hcm91cF8zXzBfXzAgKSApCisgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjM3Njg6MzogKCBydWxlX19YQ2FzZVBhcnRfX0dyb3VwXzNfMF9fMCApCiAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhDYXNlUGFydEFjY2VzcygpLmdldEdyb3VwXzNfMCgpKTsgCiAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MzYxNjozOiAoIHJ1bGVfX1hDYXNlUGFydF9fR3JvdXBfM18wX18wICkKLSAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MzYxNjo0OiBydWxlX19YQ2FzZVBhcnRfX0dyb3VwXzNfMF9fMAorICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzozNzY5OjM6ICggcnVsZV9fWENhc2VQYXJ0X19Hcm91cF8zXzBfXzAgKQorICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzozNzY5OjQ6IHJ1bGVfX1hDYXNlUGFydF9fR3JvdXBfM18wX18wCiAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMik7CiAgICAgICAgICAgICAgICAgICAgIHJ1bGVfX1hDYXNlUGFydF9fR3JvdXBfM18wX18wKCk7CkBAIC0xMzEzOSwxNiArMTM2OTUsMTYgQEAKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICBjYXNlIDIgOgotICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzozNjIwOjI6ICggKCBydWxlX19YQ2FzZVBhcnRfX0ZhbGxUaHJvdWdoQXNzaWdubWVudF8zXzEgKSApCisgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjM3NzM6MjogKCAoIHJ1bGVfX1hDYXNlUGFydF9fRmFsbFRocm91Z2hBc3NpZ25tZW50XzNfMSApICkKICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzozNjIwOjI6ICggKCBydWxlX19YQ2FzZVBhcnRfX0ZhbGxUaHJvdWdoQXNzaWdubWVudF8zXzEgKSApCi0gICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjM2MjE6MzogKCBydWxlX19YQ2FzZVBhcnRfX0ZhbGxUaHJvdWdoQXNzaWdubWVudF8zXzEgKQorICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzozNzczOjI6ICggKCBydWxlX19YQ2FzZVBhcnRfX0ZhbGxUaHJvdWdoQXNzaWdubWVudF8zXzEgKSApCisgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjM3NzQ6MzogKCBydWxlX19YQ2FzZVBhcnRfX0ZhbGxUaHJvdWdoQXNzaWdubWVudF8zXzEgKQogICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYQ2FzZVBhcnRBY2Nlc3MoKS5nZXRGYWxsVGhyb3VnaEFzc2lnbm1lbnRfM18xKCkpOyAKICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzozNjIyOjM6ICggcnVsZV9fWENhc2VQYXJ0X19GYWxsVGhyb3VnaEFzc2lnbm1lbnRfM18xICkKLSAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MzYyMjo0OiBydWxlX19YQ2FzZVBhcnRfX0ZhbGxUaHJvdWdoQXNzaWdubWVudF8zXzEKKyAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6Mzc3NTozOiAoIHJ1bGVfX1hDYXNlUGFydF9fRmFsbFRocm91Z2hBc3NpZ25tZW50XzNfMSApCisgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjM3NzU6NDogcnVsZV9fWENhc2VQYXJ0X19GYWxsVGhyb3VnaEFzc2lnbm1lbnRfM18xCiAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMik7CiAgICAgICAgICAgICAgICAgICAgIHJ1bGVfX1hDYXNlUGFydF9fRmFsbFRocm91Z2hBc3NpZ25tZW50XzNfMSgpOwpAQCAtMTMxODUsMzUgKzEzNzQxLDM1IEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fWEV4cHJlc3Npb25PclZhckRlY2xhcmF0aW9uX19BbHRlcm5hdGl2ZXMiCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MzYzMDoxOiBydWxlX19YRXhwcmVzc2lvbk9yVmFyRGVjbGFyYXRpb25fX0FsdGVybmF0aXZlcyA6ICggKCBydWxlWFZhcmlhYmxlRGVjbGFyYXRpb24gKSB8ICggcnVsZVhFeHByZXNzaW9uICkgKTsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzozNzgzOjE6IHJ1bGVfX1hFeHByZXNzaW9uT3JWYXJEZWNsYXJhdGlvbl9fQWx0ZXJuYXRpdmVzIDogKCAoIHJ1bGVYVmFyaWFibGVEZWNsYXJhdGlvbiApIHwgKCBydWxlWEV4cHJlc3Npb24gKSApOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1hFeHByZXNzaW9uT3JWYXJEZWNsYXJhdGlvbl9fQWx0ZXJuYXRpdmVzKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjM2MzQ6MTogKCAoIHJ1bGVYVmFyaWFibGVEZWNsYXJhdGlvbiApIHwgKCBydWxlWEV4cHJlc3Npb24gKSApCi0gICAgICAgICAgICBpbnQgYWx0MzQ9MjsKLSAgICAgICAgICAgIGludCBMQTM0XzAgPSBpbnB1dC5MQSgxKTsKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjM3ODc6MTogKCAoIHJ1bGVYVmFyaWFibGVEZWNsYXJhdGlvbiApIHwgKCBydWxlWEV4cHJlc3Npb24gKSApCisgICAgICAgICAgICBpbnQgYWx0MzU9MjsKKyAgICAgICAgICAgIGludCBMQTM1XzAgPSBpbnB1dC5MQSgxKTsKIAotICAgICAgICAgICAgaWYgKCAoTEEzNF8wPT00NHx8TEEzNF8wPT0xNTMpICkgewotICAgICAgICAgICAgICAgIGFsdDM0PTE7CisgICAgICAgICAgICBpZiAoIChMQTM1XzA9PTQ0fHxMQTM1XzA9PTE2NSkgKSB7CisgICAgICAgICAgICAgICAgYWx0MzU9MTsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgaWYgKCAoKExBMzRfMD49UlVMRV9TVFJJTkcgJiYgTEEzNF8wPD1SVUxFX0RFQ0lNQUwpfHxMQTM0XzA9PTI3fHwoTEEzNF8wPj0zNCAmJiBMQTM0XzA8PTM1KXx8TEEzNF8wPT00MHx8KExBMzRfMD49NDUgJiYgTEEzNF8wPD01MCl8fExBMzRfMD09NzB8fExBMzRfMD09OTV8fExBMzRfMD09MTEzfHwoTEEzNF8wPj0xMTcgJiYgTEEzNF8wPD0xMTgpfHxMQTM0XzA9PTEyMHx8TEEzNF8wPT0xMjJ8fChMQTM0XzA+PTEyNiAmJiBMQTM0XzA8PTEzMyl8fExBMzRfMD09MTM1fHxMQTM0XzA9PTE1NCkgKSB7Ci0gICAgICAgICAgICAgICAgYWx0MzQ9MjsKKyAgICAgICAgICAgIGVsc2UgaWYgKCAoKExBMzVfMD49UlVMRV9TVFJJTkcgJiYgTEEzNV8wPD1SVUxFX0RFQ0lNQUwpfHxMQTM1XzA9PTI3fHwoTEEzNV8wPj0zNCAmJiBMQTM1XzA8PTM1KXx8TEEzNV8wPT00MHx8KExBMzVfMD49NDUgJiYgTEEzNV8wPD01MCl8fExBMzVfMD09NzV8fExBMzVfMD09MTAyfHxMQTM1XzA9PTEyM3x8KExBMzVfMD49MTI3ICYmIExBMzVfMDw9MTI4KXx8TEEzNV8wPT0xMzB8fExBMzVfMD09MTMyfHwoTEEzNV8wPj0xMzYgJiYgTEEzNV8wPD0xNDMpfHxMQTM1XzA9PTE0NXx8TEEzNV8wPT0xNjYpICkgeworICAgICAgICAgICAgICAgIGFsdDM1PTI7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICBpZiAoc3RhdGUuYmFja3RyYWNraW5nPjApIHtzdGF0ZS5mYWlsZWQ9dHJ1ZTsgcmV0dXJuIDt9CiAgICAgICAgICAgICAgICAgTm9WaWFibGVBbHRFeGNlcHRpb24gbnZhZSA9Ci0gICAgICAgICAgICAgICAgICAgIG5ldyBOb1ZpYWJsZUFsdEV4Y2VwdGlvbigiIiwgMzQsIDAsIGlucHV0KTsKKyAgICAgICAgICAgICAgICAgICAgbmV3IE5vVmlhYmxlQWx0RXhjZXB0aW9uKCIiLCAzNSwgMCwgaW5wdXQpOwogCiAgICAgICAgICAgICAgICAgdGhyb3cgbnZhZTsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHN3aXRjaCAoYWx0MzQpIHsKKyAgICAgICAgICAgIHN3aXRjaCAoYWx0MzUpIHsKICAgICAgICAgICAgICAgICBjYXNlIDEgOgotICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzozNjM1OjI6ICggcnVsZVhWYXJpYWJsZURlY2xhcmF0aW9uICkKKyAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6Mzc4ODoyOiAoIHJ1bGVYVmFyaWFibGVEZWNsYXJhdGlvbiApCiAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MzYzNToyOiAoIHJ1bGVYVmFyaWFibGVEZWNsYXJhdGlvbiApCi0gICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjM2MzY6MzogcnVsZVhWYXJpYWJsZURlY2xhcmF0aW9uCisgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjM3ODg6MjogKCBydWxlWFZhcmlhYmxlRGVjbGFyYXRpb24gKQorICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzozNzg5OjM6IHJ1bGVYVmFyaWFibGVEZWNsYXJhdGlvbgogICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYRXhwcmVzc2lvbk9yVmFyRGVjbGFyYXRpb25BY2Nlc3MoKS5nZXRYVmFyaWFibGVEZWNsYXJhdGlvblBhcnNlclJ1bGVDYWxsXzAoKSk7IApAQCAtMTMyMzMsMTAgKzEzNzg5LDEwIEBACiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgY2FzZSAyIDoKLSAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MzY0MToyOiAoIHJ1bGVYRXhwcmVzc2lvbiApCisgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjM3OTQ6MjogKCBydWxlWEV4cHJlc3Npb24gKQogICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjM2NDE6MjogKCBydWxlWEV4cHJlc3Npb24gKQotICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzozNjQyOjM6IHJ1bGVYRXhwcmVzc2lvbgorICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzozNzk0OjI6ICggcnVsZVhFeHByZXNzaW9uICkKKyAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6Mzc5NTozOiBydWxlWEV4cHJlc3Npb24KICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WEV4cHJlc3Npb25PclZhckRlY2xhcmF0aW9uQWNjZXNzKCkuZ2V0WEV4cHJlc3Npb25QYXJzZXJSdWxlQ2FsbF8xKCkpOyAKQEAgLTEzMjczLDQxICsxMzgyOSw0MSBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX1hWYXJpYWJsZURlY2xhcmF0aW9uX19BbHRlcm5hdGl2ZXNfMSIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzozNjUxOjE6IHJ1bGVfX1hWYXJpYWJsZURlY2xhcmF0aW9uX19BbHRlcm5hdGl2ZXNfMSA6ICggKCAoIHJ1bGVfX1hWYXJpYWJsZURlY2xhcmF0aW9uX19Xcml0ZWFibGVBc3NpZ25tZW50XzFfMCApICkgfCAoICd2YWwnICkgKTsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzozODA0OjE6IHJ1bGVfX1hWYXJpYWJsZURlY2xhcmF0aW9uX19BbHRlcm5hdGl2ZXNfMSA6ICggKCAoIHJ1bGVfX1hWYXJpYWJsZURlY2xhcmF0aW9uX19Xcml0ZWFibGVBc3NpZ25tZW50XzFfMCApICkgfCAoICd2YWwnICkgKTsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YVmFyaWFibGVEZWNsYXJhdGlvbl9fQWx0ZXJuYXRpdmVzXzEoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MzY1NToxOiAoICggKCBydWxlX19YVmFyaWFibGVEZWNsYXJhdGlvbl9fV3JpdGVhYmxlQXNzaWdubWVudF8xXzAgKSApIHwgKCAndmFsJyApICkKLSAgICAgICAgICAgIGludCBhbHQzNT0yOwotICAgICAgICAgICAgaW50IExBMzVfMCA9IGlucHV0LkxBKDEpOworICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MzgwODoxOiAoICggKCBydWxlX19YVmFyaWFibGVEZWNsYXJhdGlvbl9fV3JpdGVhYmxlQXNzaWdubWVudF8xXzAgKSApIHwgKCAndmFsJyApICkKKyAgICAgICAgICAgIGludCBhbHQzNj0yOworICAgICAgICAgICAgaW50IExBMzZfMCA9IGlucHV0LkxBKDEpOwogCi0gICAgICAgICAgICBpZiAoIChMQTM1XzA9PTE1MykgKSB7Ci0gICAgICAgICAgICAgICAgYWx0MzU9MTsKKyAgICAgICAgICAgIGlmICggKExBMzZfMD09MTY1KSApIHsKKyAgICAgICAgICAgICAgICBhbHQzNj0xOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSBpZiAoIChMQTM1XzA9PTQ0KSApIHsKLSAgICAgICAgICAgICAgICBhbHQzNT0yOworICAgICAgICAgICAgZWxzZSBpZiAoIChMQTM2XzA9PTQ0KSApIHsKKyAgICAgICAgICAgICAgICBhbHQzNj0yOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgaWYgKHN0YXRlLmJhY2t0cmFja2luZz4wKSB7c3RhdGUuZmFpbGVkPXRydWU7IHJldHVybiA7fQogICAgICAgICAgICAgICAgIE5vVmlhYmxlQWx0RXhjZXB0aW9uIG52YWUgPQotICAgICAgICAgICAgICAgICAgICBuZXcgTm9WaWFibGVBbHRFeGNlcHRpb24oIiIsIDM1LCAwLCBpbnB1dCk7CisgICAgICAgICAgICAgICAgICAgIG5ldyBOb1ZpYWJsZUFsdEV4Y2VwdGlvbigiIiwgMzYsIDAsIGlucHV0KTsKIAogICAgICAgICAgICAgICAgIHRocm93IG52YWU7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBzd2l0Y2ggKGFsdDM1KSB7CisgICAgICAgICAgICBzd2l0Y2ggKGFsdDM2KSB7CiAgICAgICAgICAgICAgICAgY2FzZSAxIDoKLSAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MzY1NjoyOiAoICggcnVsZV9fWFZhcmlhYmxlRGVjbGFyYXRpb25fX1dyaXRlYWJsZUFzc2lnbm1lbnRfMV8wICkgKQorICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzozODA5OjI6ICggKCBydWxlX19YVmFyaWFibGVEZWNsYXJhdGlvbl9fV3JpdGVhYmxlQXNzaWdubWVudF8xXzAgKSApCiAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MzY1NjoyOiAoICggcnVsZV9fWFZhcmlhYmxlRGVjbGFyYXRpb25fX1dyaXRlYWJsZUFzc2lnbm1lbnRfMV8wICkgKQotICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzozNjU3OjM6ICggcnVsZV9fWFZhcmlhYmxlRGVjbGFyYXRpb25fX1dyaXRlYWJsZUFzc2lnbm1lbnRfMV8wICkKKyAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MzgwOToyOiAoICggcnVsZV9fWFZhcmlhYmxlRGVjbGFyYXRpb25fX1dyaXRlYWJsZUFzc2lnbm1lbnRfMV8wICkgKQorICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzozODEwOjM6ICggcnVsZV9fWFZhcmlhYmxlRGVjbGFyYXRpb25fX1dyaXRlYWJsZUFzc2lnbm1lbnRfMV8wICkKICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WFZhcmlhYmxlRGVjbGFyYXRpb25BY2Nlc3MoKS5nZXRXcml0ZWFibGVBc3NpZ25tZW50XzFfMCgpKTsgCiAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MzY1ODozOiAoIHJ1bGVfX1hWYXJpYWJsZURlY2xhcmF0aW9uX19Xcml0ZWFibGVBc3NpZ25tZW50XzFfMCApCi0gICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjM2NTg6NDogcnVsZV9fWFZhcmlhYmxlRGVjbGFyYXRpb25fX1dyaXRlYWJsZUFzc2lnbm1lbnRfMV8wCisgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjM4MTE6MzogKCBydWxlX19YVmFyaWFibGVEZWNsYXJhdGlvbl9fV3JpdGVhYmxlQXNzaWdubWVudF8xXzAgKQorICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzozODExOjQ6IHJ1bGVfX1hWYXJpYWJsZURlY2xhcmF0aW9uX19Xcml0ZWFibGVBc3NpZ25tZW50XzFfMAogICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzIpOwogICAgICAgICAgICAgICAgICAgICBydWxlX19YVmFyaWFibGVEZWNsYXJhdGlvbl9fV3JpdGVhYmxlQXNzaWdubWVudF8xXzAoKTsKQEAgLTEzMzI3LDEwICsxMzg4MywxMCBAQAogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgIGNhc2UgMiA6Ci0gICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjM2NjI6MjogKCAndmFsJyApCisgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjM4MTU6MjogKCAndmFsJyApCiAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MzY2MjoyOiAoICd2YWwnICkKLSAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MzY2MzozOiAndmFsJworICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzozODE1OjI6ICggJ3ZhbCcgKQorICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzozODE2OjM6ICd2YWwnCiAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhWYXJpYWJsZURlY2xhcmF0aW9uQWNjZXNzKCkuZ2V0VmFsS2V5d29yZF8xXzEoKSk7IApAQCAtMTMzNjMsNTUgKzEzOTE5LDU1IEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fWFZhcmlhYmxlRGVjbGFyYXRpb25fX0FsdGVybmF0aXZlc18yIgotICAgIC8vIEludGVybmFsRGF0YURTTC5nOjM2NzI6MTogcnVsZV9fWFZhcmlhYmxlRGVjbGFyYXRpb25fX0FsdGVybmF0aXZlc18yIDogKCAoICggcnVsZV9fWFZhcmlhYmxlRGVjbGFyYXRpb25fX0dyb3VwXzJfMF9fMCApICkgfCAoICggcnVsZV9fWFZhcmlhYmxlRGVjbGFyYXRpb25fX05hbWVBc3NpZ25tZW50XzJfMSApICkgKTsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzozODI1OjE6IHJ1bGVfX1hWYXJpYWJsZURlY2xhcmF0aW9uX19BbHRlcm5hdGl2ZXNfMiA6ICggKCAoIHJ1bGVfX1hWYXJpYWJsZURlY2xhcmF0aW9uX19Hcm91cF8yXzBfXzAgKSApIHwgKCAoIHJ1bGVfX1hWYXJpYWJsZURlY2xhcmF0aW9uX19OYW1lQXNzaWdubWVudF8yXzEgKSApICk7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fWFZhcmlhYmxlRGVjbGFyYXRpb25fX0FsdGVybmF0aXZlc18yKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjM2NzY6MTogKCAoICggcnVsZV9fWFZhcmlhYmxlRGVjbGFyYXRpb25fX0dyb3VwXzJfMF9fMCApICkgfCAoICggcnVsZV9fWFZhcmlhYmxlRGVjbGFyYXRpb25fX05hbWVBc3NpZ25tZW50XzJfMSApICkgKQotICAgICAgICAgICAgaW50IGFsdDM2PTI7Ci0gICAgICAgICAgICBpbnQgTEEzNl8wID0gaW5wdXQuTEEoMSk7CisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzozODI5OjE6ICggKCAoIHJ1bGVfX1hWYXJpYWJsZURlY2xhcmF0aW9uX19Hcm91cF8yXzBfXzAgKSApIHwgKCAoIHJ1bGVfX1hWYXJpYWJsZURlY2xhcmF0aW9uX19OYW1lQXNzaWdubWVudF8yXzEgKSApICkKKyAgICAgICAgICAgIGludCBhbHQzNz0yOworICAgICAgICAgICAgaW50IExBMzdfMCA9IGlucHV0LkxBKDEpOwogCi0gICAgICAgICAgICBpZiAoIChMQTM2XzA9PVJVTEVfSUQpICkgewotICAgICAgICAgICAgICAgIGludCBMQTM2XzEgPSBpbnB1dC5MQSgyKTsKKyAgICAgICAgICAgIGlmICggKExBMzdfMD09UlVMRV9JRCkgKSB7CisgICAgICAgICAgICAgICAgaW50IExBMzdfMSA9IGlucHV0LkxBKDIpOwogCi0gICAgICAgICAgICAgICAgaWYgKCAoc3lucHJlZDc4X0ludGVybmFsRGF0YURTTCgpKSApIHsKLSAgICAgICAgICAgICAgICAgICAgYWx0MzY9MTsKKyAgICAgICAgICAgICAgICBpZiAoIChzeW5wcmVkNzlfSW50ZXJuYWxEYXRhRFNMKCkpICkgeworICAgICAgICAgICAgICAgICAgICBhbHQzNz0xOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBlbHNlIGlmICggKHRydWUpICkgewotICAgICAgICAgICAgICAgICAgICBhbHQzNj0yOworICAgICAgICAgICAgICAgICAgICBhbHQzNz0yOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgaWYgKHN0YXRlLmJhY2t0cmFja2luZz4wKSB7c3RhdGUuZmFpbGVkPXRydWU7IHJldHVybiA7fQogICAgICAgICAgICAgICAgICAgICBOb1ZpYWJsZUFsdEV4Y2VwdGlvbiBudmFlID0KLSAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBOb1ZpYWJsZUFsdEV4Y2VwdGlvbigiIiwgMzYsIDEsIGlucHV0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBOb1ZpYWJsZUFsdEV4Y2VwdGlvbigiIiwgMzcsIDEsIGlucHV0KTsKIAogICAgICAgICAgICAgICAgICAgICB0aHJvdyBudmFlOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgaWYgKCAoTEEzNl8wPT0zMXx8TEEzNl8wPT0xMTMpICkgewotICAgICAgICAgICAgICAgIGFsdDM2PTE7CisgICAgICAgICAgICBlbHNlIGlmICggKExBMzdfMD09MzF8fExBMzdfMD09MTIzKSApIHsKKyAgICAgICAgICAgICAgICBhbHQzNz0xOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgaWYgKHN0YXRlLmJhY2t0cmFja2luZz4wKSB7c3RhdGUuZmFpbGVkPXRydWU7IHJldHVybiA7fQogICAgICAgICAgICAgICAgIE5vVmlhYmxlQWx0RXhjZXB0aW9uIG52YWUgPQotICAgICAgICAgICAgICAgICAgICBuZXcgTm9WaWFibGVBbHRFeGNlcHRpb24oIiIsIDM2LCAwLCBpbnB1dCk7CisgICAgICAgICAgICAgICAgICAgIG5ldyBOb1ZpYWJsZUFsdEV4Y2VwdGlvbigiIiwgMzcsIDAsIGlucHV0KTsKIAogICAgICAgICAgICAgICAgIHRocm93IG52YWU7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBzd2l0Y2ggKGFsdDM2KSB7CisgICAgICAgICAgICBzd2l0Y2ggKGFsdDM3KSB7CiAgICAgICAgICAgICAgICAgY2FzZSAxIDoKLSAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MzY3NzoyOiAoICggcnVsZV9fWFZhcmlhYmxlRGVjbGFyYXRpb25fX0dyb3VwXzJfMF9fMCApICkKKyAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MzgzMDoyOiAoICggcnVsZV9fWFZhcmlhYmxlRGVjbGFyYXRpb25fX0dyb3VwXzJfMF9fMCApICkKICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzozNjc3OjI6ICggKCBydWxlX19YVmFyaWFibGVEZWNsYXJhdGlvbl9fR3JvdXBfMl8wX18wICkgKQotICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzozNjc4OjM6ICggcnVsZV9fWFZhcmlhYmxlRGVjbGFyYXRpb25fX0dyb3VwXzJfMF9fMCApCisgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjM4MzA6MjogKCAoIHJ1bGVfX1hWYXJpYWJsZURlY2xhcmF0aW9uX19Hcm91cF8yXzBfXzAgKSApCisgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjM4MzE6MzogKCBydWxlX19YVmFyaWFibGVEZWNsYXJhdGlvbl9fR3JvdXBfMl8wX18wICkKICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WFZhcmlhYmxlRGVjbGFyYXRpb25BY2Nlc3MoKS5nZXRHcm91cF8yXzAoKSk7IAogICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjM2Nzk6MzogKCBydWxlX19YVmFyaWFibGVEZWNsYXJhdGlvbl9fR3JvdXBfMl8wX18wICkKLSAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MzY3OTo0OiBydWxlX19YVmFyaWFibGVEZWNsYXJhdGlvbl9fR3JvdXBfMl8wX18wCisgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjM4MzI6MzogKCBydWxlX19YVmFyaWFibGVEZWNsYXJhdGlvbl9fR3JvdXBfMl8wX18wICkKKyAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MzgzMjo0OiBydWxlX19YVmFyaWFibGVEZWNsYXJhdGlvbl9fR3JvdXBfMl8wX18wCiAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMik7CiAgICAgICAgICAgICAgICAgICAgIHJ1bGVfX1hWYXJpYWJsZURlY2xhcmF0aW9uX19Hcm91cF8yXzBfXzAoKTsKQEAgLTEzNDMxLDE2ICsxMzk4NywxNiBAQAogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgIGNhc2UgMiA6Ci0gICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjM2ODM6MjogKCAoIHJ1bGVfX1hWYXJpYWJsZURlY2xhcmF0aW9uX19OYW1lQXNzaWdubWVudF8yXzEgKSApCisgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjM4MzY6MjogKCAoIHJ1bGVfX1hWYXJpYWJsZURlY2xhcmF0aW9uX19OYW1lQXNzaWdubWVudF8yXzEgKSApCiAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MzY4MzoyOiAoICggcnVsZV9fWFZhcmlhYmxlRGVjbGFyYXRpb25fX05hbWVBc3NpZ25tZW50XzJfMSApICkKLSAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MzY4NDozOiAoIHJ1bGVfX1hWYXJpYWJsZURlY2xhcmF0aW9uX19OYW1lQXNzaWdubWVudF8yXzEgKQorICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzozODM2OjI6ICggKCBydWxlX19YVmFyaWFibGVEZWNsYXJhdGlvbl9fTmFtZUFzc2lnbm1lbnRfMl8xICkgKQorICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzozODM3OjM6ICggcnVsZV9fWFZhcmlhYmxlRGVjbGFyYXRpb25fX05hbWVBc3NpZ25tZW50XzJfMSApCiAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhWYXJpYWJsZURlY2xhcmF0aW9uQWNjZXNzKCkuZ2V0TmFtZUFzc2lnbm1lbnRfMl8xKCkpOyAKICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzozNjg1OjM6ICggcnVsZV9fWFZhcmlhYmxlRGVjbGFyYXRpb25fX05hbWVBc3NpZ25tZW50XzJfMSApCi0gICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjM2ODU6NDogcnVsZV9fWFZhcmlhYmxlRGVjbGFyYXRpb25fX05hbWVBc3NpZ25tZW50XzJfMQorICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzozODM4OjM6ICggcnVsZV9fWFZhcmlhYmxlRGVjbGFyYXRpb25fX05hbWVBc3NpZ25tZW50XzJfMSApCisgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjM4Mzg6NDogcnVsZV9fWFZhcmlhYmxlRGVjbGFyYXRpb25fX05hbWVBc3NpZ25tZW50XzJfMQogICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzIpOwogICAgICAgICAgICAgICAgICAgICBydWxlX19YVmFyaWFibGVEZWNsYXJhdGlvbl9fTmFtZUFzc2lnbm1lbnRfMl8xKCk7CkBAIC0xMzQ3NywyNyArMTQwMzMsMjcgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YRmVhdHVyZUNhbGxfX0FsdGVybmF0aXZlc18zXzEiCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MzY5MzoxOiBydWxlX19YRmVhdHVyZUNhbGxfX0FsdGVybmF0aXZlc18zXzEgOiAoICggKCBydWxlX19YRmVhdHVyZUNhbGxfX0ZlYXR1cmVDYWxsQXJndW1lbnRzQXNzaWdubWVudF8zXzFfMCApICkgfCAoICggcnVsZV9fWEZlYXR1cmVDYWxsX19Hcm91cF8zXzFfMV9fMCApICkgKTsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzozODQ2OjE6IHJ1bGVfX1hGZWF0dXJlQ2FsbF9fQWx0ZXJuYXRpdmVzXzNfMSA6ICggKCAoIHJ1bGVfX1hGZWF0dXJlQ2FsbF9fRmVhdHVyZUNhbGxBcmd1bWVudHNBc3NpZ25tZW50XzNfMV8wICkgKSB8ICggKCBydWxlX19YRmVhdHVyZUNhbGxfX0dyb3VwXzNfMV8xX18wICkgKSApOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1hGZWF0dXJlQ2FsbF9fQWx0ZXJuYXRpdmVzXzNfMSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzozNjk3OjE6ICggKCAoIHJ1bGVfX1hGZWF0dXJlQ2FsbF9fRmVhdHVyZUNhbGxBcmd1bWVudHNBc3NpZ25tZW50XzNfMV8wICkgKSB8ICggKCBydWxlX19YRmVhdHVyZUNhbGxfX0dyb3VwXzNfMV8xX18wICkgKSApCi0gICAgICAgICAgICBpbnQgYWx0Mzc9MjsKLSAgICAgICAgICAgIGFsdDM3ID0gZGZhMzcucHJlZGljdChpbnB1dCk7Ci0gICAgICAgICAgICBzd2l0Y2ggKGFsdDM3KSB7CisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzozODUwOjE6ICggKCAoIHJ1bGVfX1hGZWF0dXJlQ2FsbF9fRmVhdHVyZUNhbGxBcmd1bWVudHNBc3NpZ25tZW50XzNfMV8wICkgKSB8ICggKCBydWxlX19YRmVhdHVyZUNhbGxfX0dyb3VwXzNfMV8xX18wICkgKSApCisgICAgICAgICAgICBpbnQgYWx0Mzg9MjsKKyAgICAgICAgICAgIGFsdDM4ID0gZGZhMzgucHJlZGljdChpbnB1dCk7CisgICAgICAgICAgICBzd2l0Y2ggKGFsdDM4KSB7CiAgICAgICAgICAgICAgICAgY2FzZSAxIDoKLSAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MzY5ODoyOiAoICggcnVsZV9fWEZlYXR1cmVDYWxsX19GZWF0dXJlQ2FsbEFyZ3VtZW50c0Fzc2lnbm1lbnRfM18xXzAgKSApCisgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjM4NTE6MjogKCAoIHJ1bGVfX1hGZWF0dXJlQ2FsbF9fRmVhdHVyZUNhbGxBcmd1bWVudHNBc3NpZ25tZW50XzNfMV8wICkgKQogICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjM2OTg6MjogKCAoIHJ1bGVfX1hGZWF0dXJlQ2FsbF9fRmVhdHVyZUNhbGxBcmd1bWVudHNBc3NpZ25tZW50XzNfMV8wICkgKQotICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzozNjk5OjM6ICggcnVsZV9fWEZlYXR1cmVDYWxsX19GZWF0dXJlQ2FsbEFyZ3VtZW50c0Fzc2lnbm1lbnRfM18xXzAgKQorICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzozODUxOjI6ICggKCBydWxlX19YRmVhdHVyZUNhbGxfX0ZlYXR1cmVDYWxsQXJndW1lbnRzQXNzaWdubWVudF8zXzFfMCApICkKKyAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6Mzg1MjozOiAoIHJ1bGVfX1hGZWF0dXJlQ2FsbF9fRmVhdHVyZUNhbGxBcmd1bWVudHNBc3NpZ25tZW50XzNfMV8wICkKICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WEZlYXR1cmVDYWxsQWNjZXNzKCkuZ2V0RmVhdHVyZUNhbGxBcmd1bWVudHNBc3NpZ25tZW50XzNfMV8wKCkpOyAKICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzozNzAwOjM6ICggcnVsZV9fWEZlYXR1cmVDYWxsX19GZWF0dXJlQ2FsbEFyZ3VtZW50c0Fzc2lnbm1lbnRfM18xXzAgKQotICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzozNzAwOjQ6IHJ1bGVfX1hGZWF0dXJlQ2FsbF9fRmVhdHVyZUNhbGxBcmd1bWVudHNBc3NpZ25tZW50XzNfMV8wCisgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjM4NTM6MzogKCBydWxlX19YRmVhdHVyZUNhbGxfX0ZlYXR1cmVDYWxsQXJndW1lbnRzQXNzaWdubWVudF8zXzFfMCApCisgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjM4NTM6NDogcnVsZV9fWEZlYXR1cmVDYWxsX19GZWF0dXJlQ2FsbEFyZ3VtZW50c0Fzc2lnbm1lbnRfM18xXzAKICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV18yKTsKICAgICAgICAgICAgICAgICAgICAgcnVsZV9fWEZlYXR1cmVDYWxsX19GZWF0dXJlQ2FsbEFyZ3VtZW50c0Fzc2lnbm1lbnRfM18xXzAoKTsKQEAgLTEzNTE3LDE2ICsxNDA3MywxNiBAQAogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgIGNhc2UgMiA6Ci0gICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjM3MDQ6MjogKCAoIHJ1bGVfX1hGZWF0dXJlQ2FsbF9fR3JvdXBfM18xXzFfXzAgKSApCisgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjM4NTc6MjogKCAoIHJ1bGVfX1hGZWF0dXJlQ2FsbF9fR3JvdXBfM18xXzFfXzAgKSApCiAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MzcwNDoyOiAoICggcnVsZV9fWEZlYXR1cmVDYWxsX19Hcm91cF8zXzFfMV9fMCApICkKLSAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MzcwNTozOiAoIHJ1bGVfX1hGZWF0dXJlQ2FsbF9fR3JvdXBfM18xXzFfXzAgKQorICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzozODU3OjI6ICggKCBydWxlX19YRmVhdHVyZUNhbGxfX0dyb3VwXzNfMV8xX18wICkgKQorICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzozODU4OjM6ICggcnVsZV9fWEZlYXR1cmVDYWxsX19Hcm91cF8zXzFfMV9fMCApCiAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhGZWF0dXJlQ2FsbEFjY2VzcygpLmdldEdyb3VwXzNfMV8xKCkpOyAKICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzozNzA2OjM6ICggcnVsZV9fWEZlYXR1cmVDYWxsX19Hcm91cF8zXzFfMV9fMCApCi0gICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjM3MDY6NDogcnVsZV9fWEZlYXR1cmVDYWxsX19Hcm91cF8zXzFfMV9fMAorICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzozODU5OjM6ICggcnVsZV9fWEZlYXR1cmVDYWxsX19Hcm91cF8zXzFfMV9fMCApCisgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjM4NTk6NDogcnVsZV9fWEZlYXR1cmVDYWxsX19Hcm91cF8zXzFfMV9fMAogICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzIpOwogICAgICAgICAgICAgICAgICAgICBydWxlX19YRmVhdHVyZUNhbGxfX0dyb3VwXzNfMV8xX18wKCk7CkBAIC0xMzU2Myw1NCArMTQxMTksNTQgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19GZWF0dXJlQ2FsbElEX19BbHRlcm5hdGl2ZXMiCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MzcxNDoxOiBydWxlX19GZWF0dXJlQ2FsbElEX19BbHRlcm5hdGl2ZXMgOiAoICggcnVsZVZhbGlkSUQgKSB8ICggJ2V4dGVuZHMnICkgfCAoICdzdGF0aWMnICkgfCAoICdpbXBvcnQnICkgfCAoICdleHRlbnNpb24nICkgKTsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzozODY3OjE6IHJ1bGVfX0ZlYXR1cmVDYWxsSURfX0FsdGVybmF0aXZlcyA6ICggKCBydWxlVmFsaWRJRCApIHwgKCAnZXh0ZW5kcycgKSB8ICggJ3N0YXRpYycgKSB8ICggJ2ltcG9ydCcgKSB8ICggJ2V4dGVuc2lvbicgKSApOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX0ZlYXR1cmVDYWxsSURfX0FsdGVybmF0aXZlcygpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzozNzE4OjE6ICggKCBydWxlVmFsaWRJRCApIHwgKCAnZXh0ZW5kcycgKSB8ICggJ3N0YXRpYycgKSB8ICggJ2ltcG9ydCcgKSB8ICggJ2V4dGVuc2lvbicgKSApCi0gICAgICAgICAgICBpbnQgYWx0Mzg9NTsKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjM4NzE6MTogKCAoIHJ1bGVWYWxpZElEICkgfCAoICdleHRlbmRzJyApIHwgKCAnc3RhdGljJyApIHwgKCAnaW1wb3J0JyApIHwgKCAnZXh0ZW5zaW9uJyApICkKKyAgICAgICAgICAgIGludCBhbHQzOT01OwogICAgICAgICAgICAgc3dpdGNoICggaW5wdXQuTEEoMSkgKSB7CiAgICAgICAgICAgICBjYXNlIFJVTEVfSUQ6CiAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGFsdDM4PTE7CisgICAgICAgICAgICAgICAgYWx0Mzk9MTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICBjYXNlIDQ1OgogICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBhbHQzOD0yOworICAgICAgICAgICAgICAgIGFsdDM5PTI7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgY2FzZSA0NjoKICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgYWx0Mzg9MzsKKyAgICAgICAgICAgICAgICBhbHQzOT0zOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIGNhc2UgNDc6CiAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGFsdDM4PTQ7CisgICAgICAgICAgICAgICAgYWx0Mzk9NDsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICBjYXNlIDQ4OgogICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBhbHQzOD01OworICAgICAgICAgICAgICAgIGFsdDM5PTU7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgICAgICBpZiAoc3RhdGUuYmFja3RyYWNraW5nPjApIHtzdGF0ZS5mYWlsZWQ9dHJ1ZTsgcmV0dXJuIDt9CiAgICAgICAgICAgICAgICAgTm9WaWFibGVBbHRFeGNlcHRpb24gbnZhZSA9Ci0gICAgICAgICAgICAgICAgICAgIG5ldyBOb1ZpYWJsZUFsdEV4Y2VwdGlvbigiIiwgMzgsIDAsIGlucHV0KTsKKyAgICAgICAgICAgICAgICAgICAgbmV3IE5vVmlhYmxlQWx0RXhjZXB0aW9uKCIiLCAzOSwgMCwgaW5wdXQpOwogCiAgICAgICAgICAgICAgICAgdGhyb3cgbnZhZTsKICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgc3dpdGNoIChhbHQzOCkgeworICAgICAgICAgICAgc3dpdGNoIChhbHQzOSkgewogICAgICAgICAgICAgICAgIGNhc2UgMSA6Ci0gICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjM3MTk6MjogKCBydWxlVmFsaWRJRCApCisgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjM4NzI6MjogKCBydWxlVmFsaWRJRCApCiAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MzcxOToyOiAoIHJ1bGVWYWxpZElEICkKLSAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MzcyMDozOiBydWxlVmFsaWRJRAorICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzozODcyOjI6ICggcnVsZVZhbGlkSUQgKQorICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzozODczOjM6IHJ1bGVWYWxpZElECiAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldEZlYXR1cmVDYWxsSURBY2Nlc3MoKS5nZXRWYWxpZElEUGFyc2VyUnVsZUNhbGxfMCgpKTsgCkBAIC0xMzYzMCwxMCArMTQxODYsMTAgQEAKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICBjYXNlIDIgOgotICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzozNzI1OjI6ICggJ2V4dGVuZHMnICkKKyAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6Mzg3ODoyOiAoICdleHRlbmRzJyApCiAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MzcyNToyOiAoICdleHRlbmRzJyApCi0gICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjM3MjY6MzogJ2V4dGVuZHMnCisgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjM4Nzg6MjogKCAnZXh0ZW5kcycgKQorICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzozODc5OjM6ICdleHRlbmRzJwogICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRGZWF0dXJlQ2FsbElEQWNjZXNzKCkuZ2V0RXh0ZW5kc0tleXdvcmRfMSgpKTsgCkBAIC0xMzY0OSwxMCArMTQyMDUsMTAgQEAKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICBjYXNlIDMgOgotICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzozNzMxOjI6ICggJ3N0YXRpYycgKQorICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzozODg0OjI6ICggJ3N0YXRpYycgKQogICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjM3MzE6MjogKCAnc3RhdGljJyApCi0gICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjM3MzI6MzogJ3N0YXRpYycKKyAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6Mzg4NDoyOiAoICdzdGF0aWMnICkKKyAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6Mzg4NTozOiAnc3RhdGljJwogICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRGZWF0dXJlQ2FsbElEQWNjZXNzKCkuZ2V0U3RhdGljS2V5d29yZF8yKCkpOyAKQEAgLTEzNjY4LDEwICsxNDIyNCwxMCBAQAogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgIGNhc2UgNCA6Ci0gICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjM3Mzc6MjogKCAnaW1wb3J0JyApCisgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjM4OTA6MjogKCAnaW1wb3J0JyApCiAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MzczNzoyOiAoICdpbXBvcnQnICkKLSAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MzczODozOiAnaW1wb3J0JworICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzozODkwOjI6ICggJ2ltcG9ydCcgKQorICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzozODkxOjM6ICdpbXBvcnQnCiAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldEZlYXR1cmVDYWxsSURBY2Nlc3MoKS5nZXRJbXBvcnRLZXl3b3JkXzMoKSk7IApAQCAtMTM2ODcsMTAgKzE0MjQzLDEwIEBACiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgY2FzZSA1IDoKLSAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6Mzc0MzoyOiAoICdleHRlbnNpb24nICkKKyAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6Mzg5NjoyOiAoICdleHRlbnNpb24nICkKICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzozNzQzOjI6ICggJ2V4dGVuc2lvbicgKQotICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzozNzQ0OjM6ICdleHRlbnNpb24nCisgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjM4OTY6MjogKCAnZXh0ZW5zaW9uJyApCisgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjM4OTc6MzogJ2V4dGVuc2lvbicKICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0RmVhdHVyZUNhbGxJREFjY2VzcygpLmdldEV4dGVuc2lvbktleXdvcmRfNCgpKTsgCkBAIC0xMzcyMywzNSArMTQyNzksMzUgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19JZE9yU3VwZXJfX0FsdGVybmF0aXZlcyIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzozNzUzOjE6IHJ1bGVfX0lkT3JTdXBlcl9fQWx0ZXJuYXRpdmVzIDogKCAoIHJ1bGVGZWF0dXJlQ2FsbElEICkgfCAoICdzdXBlcicgKSApOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjM5MDY6MTogcnVsZV9fSWRPclN1cGVyX19BbHRlcm5hdGl2ZXMgOiAoICggcnVsZUZlYXR1cmVDYWxsSUQgKSB8ICggJ3N1cGVyJyApICk7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fSWRPclN1cGVyX19BbHRlcm5hdGl2ZXMoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6Mzc1NzoxOiAoICggcnVsZUZlYXR1cmVDYWxsSUQgKSB8ICggJ3N1cGVyJyApICkKLSAgICAgICAgICAgIGludCBhbHQzOT0yOwotICAgICAgICAgICAgaW50IExBMzlfMCA9IGlucHV0LkxBKDEpOworICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MzkxMDoxOiAoICggcnVsZUZlYXR1cmVDYWxsSUQgKSB8ICggJ3N1cGVyJyApICkKKyAgICAgICAgICAgIGludCBhbHQ0MD0yOworICAgICAgICAgICAgaW50IExBNDBfMCA9IGlucHV0LkxBKDEpOwogCi0gICAgICAgICAgICBpZiAoIChMQTM5XzA9PVJVTEVfSUR8fChMQTM5XzA+PTQ1ICYmIExBMzlfMDw9NDgpKSApIHsKLSAgICAgICAgICAgICAgICBhbHQzOT0xOworICAgICAgICAgICAgaWYgKCAoTEE0MF8wPT1SVUxFX0lEfHwoTEE0MF8wPj00NSAmJiBMQTQwXzA8PTQ4KSkgKSB7CisgICAgICAgICAgICAgICAgYWx0NDA9MTsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgaWYgKCAoTEEzOV8wPT00OSkgKSB7Ci0gICAgICAgICAgICAgICAgYWx0Mzk9MjsKKyAgICAgICAgICAgIGVsc2UgaWYgKCAoTEE0MF8wPT00OSkgKSB7CisgICAgICAgICAgICAgICAgYWx0NDA9MjsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgIGlmIChzdGF0ZS5iYWNrdHJhY2tpbmc+MCkge3N0YXRlLmZhaWxlZD10cnVlOyByZXR1cm4gO30KICAgICAgICAgICAgICAgICBOb1ZpYWJsZUFsdEV4Y2VwdGlvbiBudmFlID0KLSAgICAgICAgICAgICAgICAgICAgbmV3IE5vVmlhYmxlQWx0RXhjZXB0aW9uKCIiLCAzOSwgMCwgaW5wdXQpOworICAgICAgICAgICAgICAgICAgICBuZXcgTm9WaWFibGVBbHRFeGNlcHRpb24oIiIsIDQwLCAwLCBpbnB1dCk7CiAKICAgICAgICAgICAgICAgICB0aHJvdyBudmFlOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgc3dpdGNoIChhbHQzOSkgeworICAgICAgICAgICAgc3dpdGNoIChhbHQ0MCkgewogICAgICAgICAgICAgICAgIGNhc2UgMSA6Ci0gICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjM3NTg6MjogKCBydWxlRmVhdHVyZUNhbGxJRCApCisgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjM5MTE6MjogKCBydWxlRmVhdHVyZUNhbGxJRCApCiAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6Mzc1ODoyOiAoIHJ1bGVGZWF0dXJlQ2FsbElEICkKLSAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6Mzc1OTozOiBydWxlRmVhdHVyZUNhbGxJRAorICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzozOTExOjI6ICggcnVsZUZlYXR1cmVDYWxsSUQgKQorICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzozOTEyOjM6IHJ1bGVGZWF0dXJlQ2FsbElECiAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldElkT3JTdXBlckFjY2VzcygpLmdldEZlYXR1cmVDYWxsSURQYXJzZXJSdWxlQ2FsbF8wKCkpOyAKQEAgLTEzNzcxLDEwICsxNDMyNywxMCBAQAogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgIGNhc2UgMiA6Ci0gICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjM3NjQ6MjogKCAnc3VwZXInICkKKyAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MzkxNzoyOiAoICdzdXBlcicgKQogICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjM3NjQ6MjogKCAnc3VwZXInICkKLSAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6Mzc2NTozOiAnc3VwZXInCisgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjM5MTc6MjogKCAnc3VwZXInICkKKyAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MzkxODozOiAnc3VwZXInCiAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldElkT3JTdXBlckFjY2VzcygpLmdldFN1cGVyS2V5d29yZF8xKCkpOyAKQEAgLTEzODA3LDI3ICsxNDM2MywyNyBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX1hDb25zdHJ1Y3RvckNhbGxfX0FsdGVybmF0aXZlc180XzEiCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6Mzc3NDoxOiBydWxlX19YQ29uc3RydWN0b3JDYWxsX19BbHRlcm5hdGl2ZXNfNF8xIDogKCAoICggcnVsZV9fWENvbnN0cnVjdG9yQ2FsbF9fQXJndW1lbnRzQXNzaWdubWVudF80XzFfMCApICkgfCAoICggcnVsZV9fWENvbnN0cnVjdG9yQ2FsbF9fR3JvdXBfNF8xXzFfXzAgKSApICk7CisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MzkyNzoxOiBydWxlX19YQ29uc3RydWN0b3JDYWxsX19BbHRlcm5hdGl2ZXNfNF8xIDogKCAoICggcnVsZV9fWENvbnN0cnVjdG9yQ2FsbF9fQXJndW1lbnRzQXNzaWdubWVudF80XzFfMCApICkgfCAoICggcnVsZV9fWENvbnN0cnVjdG9yQ2FsbF9fR3JvdXBfNF8xXzFfXzAgKSApICk7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fWENvbnN0cnVjdG9yQ2FsbF9fQWx0ZXJuYXRpdmVzXzRfMSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzozNzc4OjE6ICggKCAoIHJ1bGVfX1hDb25zdHJ1Y3RvckNhbGxfX0FyZ3VtZW50c0Fzc2lnbm1lbnRfNF8xXzAgKSApIHwgKCAoIHJ1bGVfX1hDb25zdHJ1Y3RvckNhbGxfX0dyb3VwXzRfMV8xX18wICkgKSApCi0gICAgICAgICAgICBpbnQgYWx0NDA9MjsKLSAgICAgICAgICAgIGFsdDQwID0gZGZhNDAucHJlZGljdChpbnB1dCk7Ci0gICAgICAgICAgICBzd2l0Y2ggKGFsdDQwKSB7CisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzozOTMxOjE6ICggKCAoIHJ1bGVfX1hDb25zdHJ1Y3RvckNhbGxfX0FyZ3VtZW50c0Fzc2lnbm1lbnRfNF8xXzAgKSApIHwgKCAoIHJ1bGVfX1hDb25zdHJ1Y3RvckNhbGxfX0dyb3VwXzRfMV8xX18wICkgKSApCisgICAgICAgICAgICBpbnQgYWx0NDE9MjsKKyAgICAgICAgICAgIGFsdDQxID0gZGZhNDEucHJlZGljdChpbnB1dCk7CisgICAgICAgICAgICBzd2l0Y2ggKGFsdDQxKSB7CiAgICAgICAgICAgICAgICAgY2FzZSAxIDoKLSAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6Mzc3OToyOiAoICggcnVsZV9fWENvbnN0cnVjdG9yQ2FsbF9fQXJndW1lbnRzQXNzaWdubWVudF80XzFfMCApICkKKyAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MzkzMjoyOiAoICggcnVsZV9fWENvbnN0cnVjdG9yQ2FsbF9fQXJndW1lbnRzQXNzaWdubWVudF80XzFfMCApICkKICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzozNzc5OjI6ICggKCBydWxlX19YQ29uc3RydWN0b3JDYWxsX19Bcmd1bWVudHNBc3NpZ25tZW50XzRfMV8wICkgKQotICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzozNzgwOjM6ICggcnVsZV9fWENvbnN0cnVjdG9yQ2FsbF9fQXJndW1lbnRzQXNzaWdubWVudF80XzFfMCApCisgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjM5MzI6MjogKCAoIHJ1bGVfX1hDb25zdHJ1Y3RvckNhbGxfX0FyZ3VtZW50c0Fzc2lnbm1lbnRfNF8xXzAgKSApCisgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjM5MzM6MzogKCBydWxlX19YQ29uc3RydWN0b3JDYWxsX19Bcmd1bWVudHNBc3NpZ25tZW50XzRfMV8wICkKICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WENvbnN0cnVjdG9yQ2FsbEFjY2VzcygpLmdldEFyZ3VtZW50c0Fzc2lnbm1lbnRfNF8xXzAoKSk7IAogICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjM3ODE6MzogKCBydWxlX19YQ29uc3RydWN0b3JDYWxsX19Bcmd1bWVudHNBc3NpZ25tZW50XzRfMV8wICkKLSAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6Mzc4MTo0OiBydWxlX19YQ29uc3RydWN0b3JDYWxsX19Bcmd1bWVudHNBc3NpZ25tZW50XzRfMV8wCisgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjM5MzQ6MzogKCBydWxlX19YQ29uc3RydWN0b3JDYWxsX19Bcmd1bWVudHNBc3NpZ25tZW50XzRfMV8wICkKKyAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MzkzNDo0OiBydWxlX19YQ29uc3RydWN0b3JDYWxsX19Bcmd1bWVudHNBc3NpZ25tZW50XzRfMV8wCiAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMik7CiAgICAgICAgICAgICAgICAgICAgIHJ1bGVfX1hDb25zdHJ1Y3RvckNhbGxfX0FyZ3VtZW50c0Fzc2lnbm1lbnRfNF8xXzAoKTsKQEAgLTEzODQ3LDE2ICsxNDQwMywxNiBAQAogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgIGNhc2UgMiA6Ci0gICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjM3ODU6MjogKCAoIHJ1bGVfX1hDb25zdHJ1Y3RvckNhbGxfX0dyb3VwXzRfMV8xX18wICkgKQorICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzozOTM4OjI6ICggKCBydWxlX19YQ29uc3RydWN0b3JDYWxsX19Hcm91cF80XzFfMV9fMCApICkKICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzozNzg1OjI6ICggKCBydWxlX19YQ29uc3RydWN0b3JDYWxsX19Hcm91cF80XzFfMV9fMCApICkKLSAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6Mzc4NjozOiAoIHJ1bGVfX1hDb25zdHJ1Y3RvckNhbGxfX0dyb3VwXzRfMV8xX18wICkKKyAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MzkzODoyOiAoICggcnVsZV9fWENvbnN0cnVjdG9yQ2FsbF9fR3JvdXBfNF8xXzFfXzAgKSApCisgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjM5Mzk6MzogKCBydWxlX19YQ29uc3RydWN0b3JDYWxsX19Hcm91cF80XzFfMV9fMCApCiAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhDb25zdHJ1Y3RvckNhbGxBY2Nlc3MoKS5nZXRHcm91cF80XzFfMSgpKTsgCiAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6Mzc4NzozOiAoIHJ1bGVfX1hDb25zdHJ1Y3RvckNhbGxfX0dyb3VwXzRfMV8xX18wICkKLSAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6Mzc4Nzo0OiBydWxlX19YQ29uc3RydWN0b3JDYWxsX19Hcm91cF80XzFfMV9fMAorICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzozOTQwOjM6ICggcnVsZV9fWENvbnN0cnVjdG9yQ2FsbF9fR3JvdXBfNF8xXzFfXzAgKQorICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzozOTQwOjQ6IHJ1bGVfX1hDb25zdHJ1Y3RvckNhbGxfX0dyb3VwXzRfMV8xX18wCiAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMik7CiAgICAgICAgICAgICAgICAgICAgIHJ1bGVfX1hDb25zdHJ1Y3RvckNhbGxfX0dyb3VwXzRfMV8xX18wKCk7CkBAIC0xMzg5MywzNSArMTQ0NDksMzUgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YQm9vbGVhbkxpdGVyYWxfX0FsdGVybmF0aXZlc18xIgotICAgIC8vIEludGVybmFsRGF0YURTTC5nOjM3OTU6MTogcnVsZV9fWEJvb2xlYW5MaXRlcmFsX19BbHRlcm5hdGl2ZXNfMSA6ICggKCAnZmFsc2UnICkgfCAoICggcnVsZV9fWEJvb2xlYW5MaXRlcmFsX19Jc1RydWVBc3NpZ25tZW50XzFfMSApICkgKTsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzozOTQ4OjE6IHJ1bGVfX1hCb29sZWFuTGl0ZXJhbF9fQWx0ZXJuYXRpdmVzXzEgOiAoICggJ2ZhbHNlJyApIHwgKCAoIHJ1bGVfX1hCb29sZWFuTGl0ZXJhbF9fSXNUcnVlQXNzaWdubWVudF8xXzEgKSApICk7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fWEJvb2xlYW5MaXRlcmFsX19BbHRlcm5hdGl2ZXNfMSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzozNzk5OjE6ICggKCAnZmFsc2UnICkgfCAoICggcnVsZV9fWEJvb2xlYW5MaXRlcmFsX19Jc1RydWVBc3NpZ25tZW50XzFfMSApICkgKQotICAgICAgICAgICAgaW50IGFsdDQxPTI7Ci0gICAgICAgICAgICBpbnQgTEE0MV8wID0gaW5wdXQuTEEoMSk7CisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzozOTUyOjE6ICggKCAnZmFsc2UnICkgfCAoICggcnVsZV9fWEJvb2xlYW5MaXRlcmFsX19Jc1RydWVBc3NpZ25tZW50XzFfMSApICkgKQorICAgICAgICAgICAgaW50IGFsdDQyPTI7CisgICAgICAgICAgICBpbnQgTEE0Ml8wID0gaW5wdXQuTEEoMSk7CiAKLSAgICAgICAgICAgIGlmICggKExBNDFfMD09NTApICkgewotICAgICAgICAgICAgICAgIGFsdDQxPTE7CisgICAgICAgICAgICBpZiAoIChMQTQyXzA9PTUwKSApIHsKKyAgICAgICAgICAgICAgICBhbHQ0Mj0xOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSBpZiAoIChMQTQxXzA9PTE1NCkgKSB7Ci0gICAgICAgICAgICAgICAgYWx0NDE9MjsKKyAgICAgICAgICAgIGVsc2UgaWYgKCAoTEE0Ml8wPT0xNjYpICkgeworICAgICAgICAgICAgICAgIGFsdDQyPTI7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICBpZiAoc3RhdGUuYmFja3RyYWNraW5nPjApIHtzdGF0ZS5mYWlsZWQ9dHJ1ZTsgcmV0dXJuIDt9CiAgICAgICAgICAgICAgICAgTm9WaWFibGVBbHRFeGNlcHRpb24gbnZhZSA9Ci0gICAgICAgICAgICAgICAgICAgIG5ldyBOb1ZpYWJsZUFsdEV4Y2VwdGlvbigiIiwgNDEsIDAsIGlucHV0KTsKKyAgICAgICAgICAgICAgICAgICAgbmV3IE5vVmlhYmxlQWx0RXhjZXB0aW9uKCIiLCA0MiwgMCwgaW5wdXQpOwogCiAgICAgICAgICAgICAgICAgdGhyb3cgbnZhZTsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHN3aXRjaCAoYWx0NDEpIHsKKyAgICAgICAgICAgIHN3aXRjaCAoYWx0NDIpIHsKICAgICAgICAgICAgICAgICBjYXNlIDEgOgotICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzozODAwOjI6ICggJ2ZhbHNlJyApCisgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjM5NTM6MjogKCAnZmFsc2UnICkKICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzozODAwOjI6ICggJ2ZhbHNlJyApCi0gICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjM4MDE6MzogJ2ZhbHNlJworICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzozOTUzOjI6ICggJ2ZhbHNlJyApCisgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjM5NTQ6MzogJ2ZhbHNlJwogICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYQm9vbGVhbkxpdGVyYWxBY2Nlc3MoKS5nZXRGYWxzZUtleXdvcmRfMV8wKCkpOyAKQEAgLTEzOTM3LDE2ICsxNDQ5MywxNiBAQAogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgIGNhc2UgMiA6Ci0gICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjM4MDY6MjogKCAoIHJ1bGVfX1hCb29sZWFuTGl0ZXJhbF9fSXNUcnVlQXNzaWdubWVudF8xXzEgKSApCisgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjM5NTk6MjogKCAoIHJ1bGVfX1hCb29sZWFuTGl0ZXJhbF9fSXNUcnVlQXNzaWdubWVudF8xXzEgKSApCiAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MzgwNjoyOiAoICggcnVsZV9fWEJvb2xlYW5MaXRlcmFsX19Jc1RydWVBc3NpZ25tZW50XzFfMSApICkKLSAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MzgwNzozOiAoIHJ1bGVfX1hCb29sZWFuTGl0ZXJhbF9fSXNUcnVlQXNzaWdubWVudF8xXzEgKQorICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzozOTU5OjI6ICggKCBydWxlX19YQm9vbGVhbkxpdGVyYWxfX0lzVHJ1ZUFzc2lnbm1lbnRfMV8xICkgKQorICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzozOTYwOjM6ICggcnVsZV9fWEJvb2xlYW5MaXRlcmFsX19Jc1RydWVBc3NpZ25tZW50XzFfMSApCiAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhCb29sZWFuTGl0ZXJhbEFjY2VzcygpLmdldElzVHJ1ZUFzc2lnbm1lbnRfMV8xKCkpOyAKICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzozODA4OjM6ICggcnVsZV9fWEJvb2xlYW5MaXRlcmFsX19Jc1RydWVBc3NpZ25tZW50XzFfMSApCi0gICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjM4MDg6NDogcnVsZV9fWEJvb2xlYW5MaXRlcmFsX19Jc1RydWVBc3NpZ25tZW50XzFfMQorICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzozOTYxOjM6ICggcnVsZV9fWEJvb2xlYW5MaXRlcmFsX19Jc1RydWVBc3NpZ25tZW50XzFfMSApCisgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjM5NjE6NDogcnVsZV9fWEJvb2xlYW5MaXRlcmFsX19Jc1RydWVBc3NpZ25tZW50XzFfMQogICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzIpOwogICAgICAgICAgICAgICAgICAgICBydWxlX19YQm9vbGVhbkxpdGVyYWxfX0lzVHJ1ZUFzc2lnbm1lbnRfMV8xKCk7CkBAIC0xMzk4Myw0MSArMTQ1MzksNDEgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YVHJ5Q2F0Y2hGaW5hbGx5RXhwcmVzc2lvbl9fQWx0ZXJuYXRpdmVzXzMiCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MzgxNjoxOiBydWxlX19YVHJ5Q2F0Y2hGaW5hbGx5RXhwcmVzc2lvbl9fQWx0ZXJuYXRpdmVzXzMgOiAoICggKCBydWxlX19YVHJ5Q2F0Y2hGaW5hbGx5RXhwcmVzc2lvbl9fR3JvdXBfM18wX18wICkgKSB8ICggKCBydWxlX19YVHJ5Q2F0Y2hGaW5hbGx5RXhwcmVzc2lvbl9fR3JvdXBfM18xX18wICkgKSApOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjM5Njk6MTogcnVsZV9fWFRyeUNhdGNoRmluYWxseUV4cHJlc3Npb25fX0FsdGVybmF0aXZlc18zIDogKCAoICggcnVsZV9fWFRyeUNhdGNoRmluYWxseUV4cHJlc3Npb25fX0dyb3VwXzNfMF9fMCApICkgfCAoICggcnVsZV9fWFRyeUNhdGNoRmluYWxseUV4cHJlc3Npb25fX0dyb3VwXzNfMV9fMCApICkgKTsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YVHJ5Q2F0Y2hGaW5hbGx5RXhwcmVzc2lvbl9fQWx0ZXJuYXRpdmVzXzMoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MzgyMDoxOiAoICggKCBydWxlX19YVHJ5Q2F0Y2hGaW5hbGx5RXhwcmVzc2lvbl9fR3JvdXBfM18wX18wICkgKSB8ICggKCBydWxlX19YVHJ5Q2F0Y2hGaW5hbGx5RXhwcmVzc2lvbl9fR3JvdXBfM18xX18wICkgKSApCi0gICAgICAgICAgICBpbnQgYWx0NDI9MjsKLSAgICAgICAgICAgIGludCBMQTQyXzAgPSBpbnB1dC5MQSgxKTsKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjM5NzM6MTogKCAoICggcnVsZV9fWFRyeUNhdGNoRmluYWxseUV4cHJlc3Npb25fX0dyb3VwXzNfMF9fMCApICkgfCAoICggcnVsZV9fWFRyeUNhdGNoRmluYWxseUV4cHJlc3Npb25fX0dyb3VwXzNfMV9fMCApICkgKQorICAgICAgICAgICAgaW50IGFsdDQzPTI7CisgICAgICAgICAgICBpbnQgTEE0M18wID0gaW5wdXQuTEEoMSk7CiAKLSAgICAgICAgICAgIGlmICggKExBNDJfMD09MTM2KSApIHsKLSAgICAgICAgICAgICAgICBhbHQ0Mj0xOworICAgICAgICAgICAgaWYgKCAoTEE0M18wPT0xNDYpICkgeworICAgICAgICAgICAgICAgIGFsdDQzPTE7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIGlmICggKExBNDJfMD09MTM0KSApIHsKLSAgICAgICAgICAgICAgICBhbHQ0Mj0yOworICAgICAgICAgICAgZWxzZSBpZiAoIChMQTQzXzA9PTE0NCkgKSB7CisgICAgICAgICAgICAgICAgYWx0NDM9MjsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgIGlmIChzdGF0ZS5iYWNrdHJhY2tpbmc+MCkge3N0YXRlLmZhaWxlZD10cnVlOyByZXR1cm4gO30KICAgICAgICAgICAgICAgICBOb1ZpYWJsZUFsdEV4Y2VwdGlvbiBudmFlID0KLSAgICAgICAgICAgICAgICAgICAgbmV3IE5vVmlhYmxlQWx0RXhjZXB0aW9uKCIiLCA0MiwgMCwgaW5wdXQpOworICAgICAgICAgICAgICAgICAgICBuZXcgTm9WaWFibGVBbHRFeGNlcHRpb24oIiIsIDQzLCAwLCBpbnB1dCk7CiAKICAgICAgICAgICAgICAgICB0aHJvdyBudmFlOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgc3dpdGNoIChhbHQ0MikgeworICAgICAgICAgICAgc3dpdGNoIChhbHQ0MykgewogICAgICAgICAgICAgICAgIGNhc2UgMSA6Ci0gICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjM4MjE6MjogKCAoIHJ1bGVfX1hUcnlDYXRjaEZpbmFsbHlFeHByZXNzaW9uX19Hcm91cF8zXzBfXzAgKSApCisgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjM5NzQ6MjogKCAoIHJ1bGVfX1hUcnlDYXRjaEZpbmFsbHlFeHByZXNzaW9uX19Hcm91cF8zXzBfXzAgKSApCiAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MzgyMToyOiAoICggcnVsZV9fWFRyeUNhdGNoRmluYWxseUV4cHJlc3Npb25fX0dyb3VwXzNfMF9fMCApICkKLSAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MzgyMjozOiAoIHJ1bGVfX1hUcnlDYXRjaEZpbmFsbHlFeHByZXNzaW9uX19Hcm91cF8zXzBfXzAgKQorICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzozOTc0OjI6ICggKCBydWxlX19YVHJ5Q2F0Y2hGaW5hbGx5RXhwcmVzc2lvbl9fR3JvdXBfM18wX18wICkgKQorICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzozOTc1OjM6ICggcnVsZV9fWFRyeUNhdGNoRmluYWxseUV4cHJlc3Npb25fX0dyb3VwXzNfMF9fMCApCiAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhUcnlDYXRjaEZpbmFsbHlFeHByZXNzaW9uQWNjZXNzKCkuZ2V0R3JvdXBfM18wKCkpOyAKICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzozODIzOjM6ICggcnVsZV9fWFRyeUNhdGNoRmluYWxseUV4cHJlc3Npb25fX0dyb3VwXzNfMF9fMCApCi0gICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjM4MjM6NDogcnVsZV9fWFRyeUNhdGNoRmluYWxseUV4cHJlc3Npb25fX0dyb3VwXzNfMF9fMAorICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzozOTc2OjM6ICggcnVsZV9fWFRyeUNhdGNoRmluYWxseUV4cHJlc3Npb25fX0dyb3VwXzNfMF9fMCApCisgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjM5NzY6NDogcnVsZV9fWFRyeUNhdGNoRmluYWxseUV4cHJlc3Npb25fX0dyb3VwXzNfMF9fMAogICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzIpOwogICAgICAgICAgICAgICAgICAgICBydWxlX19YVHJ5Q2F0Y2hGaW5hbGx5RXhwcmVzc2lvbl9fR3JvdXBfM18wX18wKCk7CkBAIC0xNDAzNywxNiArMTQ1OTMsMTYgQEAKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICBjYXNlIDIgOgotICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzozODI3OjI6ICggKCBydWxlX19YVHJ5Q2F0Y2hGaW5hbGx5RXhwcmVzc2lvbl9fR3JvdXBfM18xX18wICkgKQorICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzozOTgwOjI6ICggKCBydWxlX19YVHJ5Q2F0Y2hGaW5hbGx5RXhwcmVzc2lvbl9fR3JvdXBfM18xX18wICkgKQogICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjM4Mjc6MjogKCAoIHJ1bGVfX1hUcnlDYXRjaEZpbmFsbHlFeHByZXNzaW9uX19Hcm91cF8zXzFfXzAgKSApCi0gICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjM4Mjg6MzogKCBydWxlX19YVHJ5Q2F0Y2hGaW5hbGx5RXhwcmVzc2lvbl9fR3JvdXBfM18xX18wICkKKyAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6Mzk4MDoyOiAoICggcnVsZV9fWFRyeUNhdGNoRmluYWxseUV4cHJlc3Npb25fX0dyb3VwXzNfMV9fMCApICkKKyAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6Mzk4MTozOiAoIHJ1bGVfX1hUcnlDYXRjaEZpbmFsbHlFeHByZXNzaW9uX19Hcm91cF8zXzFfXzAgKQogICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYVHJ5Q2F0Y2hGaW5hbGx5RXhwcmVzc2lvbkFjY2VzcygpLmdldEdyb3VwXzNfMSgpKTsgCiAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MzgyOTozOiAoIHJ1bGVfX1hUcnlDYXRjaEZpbmFsbHlFeHByZXNzaW9uX19Hcm91cF8zXzFfXzAgKQotICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzozODI5OjQ6IHJ1bGVfX1hUcnlDYXRjaEZpbmFsbHlFeHByZXNzaW9uX19Hcm91cF8zXzFfXzAKKyAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6Mzk4MjozOiAoIHJ1bGVfX1hUcnlDYXRjaEZpbmFsbHlFeHByZXNzaW9uX19Hcm91cF8zXzFfXzAgKQorICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzozOTgyOjQ6IHJ1bGVfX1hUcnlDYXRjaEZpbmFsbHlFeHByZXNzaW9uX19Hcm91cF8zXzFfXzAKICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV18yKTsKICAgICAgICAgICAgICAgICAgICAgcnVsZV9fWFRyeUNhdGNoRmluYWxseUV4cHJlc3Npb25fX0dyb3VwXzNfMV9fMCgpOwpAQCAtMTQwODMsMzUgKzE0NjM5LDM1IEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fTnVtYmVyX19BbHRlcm5hdGl2ZXMiCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MzgzNzoxOiBydWxlX19OdW1iZXJfX0FsdGVybmF0aXZlcyA6ICggKCBSVUxFX0hFWCApIHwgKCAoIHJ1bGVfX051bWJlcl9fR3JvdXBfMV9fMCApICkgKTsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzozOTkwOjE6IHJ1bGVfX051bWJlcl9fQWx0ZXJuYXRpdmVzIDogKCAoIFJVTEVfSEVYICkgfCAoICggcnVsZV9fTnVtYmVyX19Hcm91cF8xX18wICkgKSApOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX051bWJlcl9fQWx0ZXJuYXRpdmVzKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjM4NDE6MTogKCAoIFJVTEVfSEVYICkgfCAoICggcnVsZV9fTnVtYmVyX19Hcm91cF8xX18wICkgKSApCi0gICAgICAgICAgICBpbnQgYWx0NDM9MjsKLSAgICAgICAgICAgIGludCBMQTQzXzAgPSBpbnB1dC5MQSgxKTsKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjM5OTQ6MTogKCAoIFJVTEVfSEVYICkgfCAoICggcnVsZV9fTnVtYmVyX19Hcm91cF8xX18wICkgKSApCisgICAgICAgICAgICBpbnQgYWx0NDQ9MjsKKyAgICAgICAgICAgIGludCBMQTQ0XzAgPSBpbnB1dC5MQSgxKTsKIAotICAgICAgICAgICAgaWYgKCAoTEE0M18wPT1SVUxFX0hFWCkgKSB7Ci0gICAgICAgICAgICAgICAgYWx0NDM9MTsKKyAgICAgICAgICAgIGlmICggKExBNDRfMD09UlVMRV9IRVgpICkgeworICAgICAgICAgICAgICAgIGFsdDQ0PTE7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIGlmICggKChMQTQzXzA+PVJVTEVfSU5UICYmIExBNDNfMDw9UlVMRV9ERUNJTUFMKSkgKSB7Ci0gICAgICAgICAgICAgICAgYWx0NDM9MjsKKyAgICAgICAgICAgIGVsc2UgaWYgKCAoKExBNDRfMD49UlVMRV9JTlQgJiYgTEE0NF8wPD1SVUxFX0RFQ0lNQUwpKSApIHsKKyAgICAgICAgICAgICAgICBhbHQ0ND0yOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgaWYgKHN0YXRlLmJhY2t0cmFja2luZz4wKSB7c3RhdGUuZmFpbGVkPXRydWU7IHJldHVybiA7fQogICAgICAgICAgICAgICAgIE5vVmlhYmxlQWx0RXhjZXB0aW9uIG52YWUgPQotICAgICAgICAgICAgICAgICAgICBuZXcgTm9WaWFibGVBbHRFeGNlcHRpb24oIiIsIDQzLCAwLCBpbnB1dCk7CisgICAgICAgICAgICAgICAgICAgIG5ldyBOb1ZpYWJsZUFsdEV4Y2VwdGlvbigiIiwgNDQsIDAsIGlucHV0KTsKIAogICAgICAgICAgICAgICAgIHRocm93IG52YWU7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBzd2l0Y2ggKGFsdDQzKSB7CisgICAgICAgICAgICBzd2l0Y2ggKGFsdDQ0KSB7CiAgICAgICAgICAgICAgICAgY2FzZSAxIDoKLSAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6Mzg0MjoyOiAoIFJVTEVfSEVYICkKKyAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6Mzk5NToyOiAoIFJVTEVfSEVYICkKICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzozODQyOjI6ICggUlVMRV9IRVggKQotICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzozODQzOjM6IFJVTEVfSEVYCisgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjM5OTU6MjogKCBSVUxFX0hFWCApCisgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjM5OTY6MzogUlVMRV9IRVgKICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0TnVtYmVyQWNjZXNzKCkuZ2V0SEVYVGVybWluYWxSdWxlQ2FsbF8wKCkpOyAKQEAgLTE0MTI3LDE2ICsxNDY4MywxNiBAQAogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgIGNhc2UgMiA6Ci0gICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjM4NDg6MjogKCAoIHJ1bGVfX051bWJlcl9fR3JvdXBfMV9fMCApICkKKyAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NDAwMToyOiAoICggcnVsZV9fTnVtYmVyX19Hcm91cF8xX18wICkgKQogICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjM4NDg6MjogKCAoIHJ1bGVfX051bWJlcl9fR3JvdXBfMV9fMCApICkKLSAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6Mzg0OTozOiAoIHJ1bGVfX051bWJlcl9fR3JvdXBfMV9fMCApCisgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjQwMDE6MjogKCAoIHJ1bGVfX051bWJlcl9fR3JvdXBfMV9fMCApICkKKyAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NDAwMjozOiAoIHJ1bGVfX051bWJlcl9fR3JvdXBfMV9fMCApCiAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldE51bWJlckFjY2VzcygpLmdldEdyb3VwXzEoKSk7IAogICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjM4NTA6MzogKCBydWxlX19OdW1iZXJfX0dyb3VwXzFfXzAgKQotICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzozODUwOjQ6IHJ1bGVfX051bWJlcl9fR3JvdXBfMV9fMAorICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo0MDAzOjM6ICggcnVsZV9fTnVtYmVyX19Hcm91cF8xX18wICkKKyAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NDAwMzo0OiBydWxlX19OdW1iZXJfX0dyb3VwXzFfXzAKICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV18yKTsKICAgICAgICAgICAgICAgICAgICAgcnVsZV9fTnVtYmVyX19Hcm91cF8xX18wKCk7CkBAIC0xNDE3MywzNSArMTQ3MjksMzUgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19OdW1iZXJfX0FsdGVybmF0aXZlc18xXzAiCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6Mzg1ODoxOiBydWxlX19OdW1iZXJfX0FsdGVybmF0aXZlc18xXzAgOiAoICggUlVMRV9JTlQgKSB8ICggUlVMRV9ERUNJTUFMICkgKTsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo0MDExOjE6IHJ1bGVfX051bWJlcl9fQWx0ZXJuYXRpdmVzXzFfMCA6ICggKCBSVUxFX0lOVCApIHwgKCBSVUxFX0RFQ0lNQUwgKSApOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX051bWJlcl9fQWx0ZXJuYXRpdmVzXzFfMCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzozODYyOjE6ICggKCBSVUxFX0lOVCApIHwgKCBSVUxFX0RFQ0lNQUwgKSApCi0gICAgICAgICAgICBpbnQgYWx0NDQ9MjsKLSAgICAgICAgICAgIGludCBMQTQ0XzAgPSBpbnB1dC5MQSgxKTsKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjQwMTU6MTogKCAoIFJVTEVfSU5UICkgfCAoIFJVTEVfREVDSU1BTCApICkKKyAgICAgICAgICAgIGludCBhbHQ0NT0yOworICAgICAgICAgICAgaW50IExBNDVfMCA9IGlucHV0LkxBKDEpOwogCi0gICAgICAgICAgICBpZiAoIChMQTQ0XzA9PVJVTEVfSU5UKSApIHsKLSAgICAgICAgICAgICAgICBhbHQ0ND0xOworICAgICAgICAgICAgaWYgKCAoTEE0NV8wPT1SVUxFX0lOVCkgKSB7CisgICAgICAgICAgICAgICAgYWx0NDU9MTsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgaWYgKCAoTEE0NF8wPT1SVUxFX0RFQ0lNQUwpICkgewotICAgICAgICAgICAgICAgIGFsdDQ0PTI7CisgICAgICAgICAgICBlbHNlIGlmICggKExBNDVfMD09UlVMRV9ERUNJTUFMKSApIHsKKyAgICAgICAgICAgICAgICBhbHQ0NT0yOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgaWYgKHN0YXRlLmJhY2t0cmFja2luZz4wKSB7c3RhdGUuZmFpbGVkPXRydWU7IHJldHVybiA7fQogICAgICAgICAgICAgICAgIE5vVmlhYmxlQWx0RXhjZXB0aW9uIG52YWUgPQotICAgICAgICAgICAgICAgICAgICBuZXcgTm9WaWFibGVBbHRFeGNlcHRpb24oIiIsIDQ0LCAwLCBpbnB1dCk7CisgICAgICAgICAgICAgICAgICAgIG5ldyBOb1ZpYWJsZUFsdEV4Y2VwdGlvbigiIiwgNDUsIDAsIGlucHV0KTsKIAogICAgICAgICAgICAgICAgIHRocm93IG52YWU7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBzd2l0Y2ggKGFsdDQ0KSB7CisgICAgICAgICAgICBzd2l0Y2ggKGFsdDQ1KSB7CiAgICAgICAgICAgICAgICAgY2FzZSAxIDoKLSAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6Mzg2MzoyOiAoIFJVTEVfSU5UICkKKyAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NDAxNjoyOiAoIFJVTEVfSU5UICkKICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzozODYzOjI6ICggUlVMRV9JTlQgKQotICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzozODY0OjM6IFJVTEVfSU5UCisgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjQwMTY6MjogKCBSVUxFX0lOVCApCisgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjQwMTc6MzogUlVMRV9JTlQKICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0TnVtYmVyQWNjZXNzKCkuZ2V0SU5UVGVybWluYWxSdWxlQ2FsbF8xXzBfMCgpKTsgCkBAIC0xNDIxNywxMCArMTQ3NzMsMTAgQEAKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICBjYXNlIDIgOgotICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzozODY5OjI6ICggUlVMRV9ERUNJTUFMICkKKyAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NDAyMjoyOiAoIFJVTEVfREVDSU1BTCApCiAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6Mzg2OToyOiAoIFJVTEVfREVDSU1BTCApCi0gICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjM4NzA6MzogUlVMRV9ERUNJTUFMCisgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjQwMjI6MjogKCBSVUxFX0RFQ0lNQUwgKQorICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo0MDIzOjM6IFJVTEVfREVDSU1BTAogICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXROdW1iZXJBY2Nlc3MoKS5nZXRERUNJTUFMVGVybWluYWxSdWxlQ2FsbF8xXzBfMSgpKTsgCkBAIC0xNDI1MywzNSArMTQ4MDksMzUgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19OdW1iZXJfX0FsdGVybmF0aXZlc18xXzFfMSIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzozODc5OjE6IHJ1bGVfX051bWJlcl9fQWx0ZXJuYXRpdmVzXzFfMV8xIDogKCAoIFJVTEVfSU5UICkgfCAoIFJVTEVfREVDSU1BTCApICk7CisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NDAzMjoxOiBydWxlX19OdW1iZXJfX0FsdGVybmF0aXZlc18xXzFfMSA6ICggKCBSVUxFX0lOVCApIHwgKCBSVUxFX0RFQ0lNQUwgKSApOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX051bWJlcl9fQWx0ZXJuYXRpdmVzXzFfMV8xKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjM4ODM6MTogKCAoIFJVTEVfSU5UICkgfCAoIFJVTEVfREVDSU1BTCApICkKLSAgICAgICAgICAgIGludCBhbHQ0NT0yOwotICAgICAgICAgICAgaW50IExBNDVfMCA9IGlucHV0LkxBKDEpOworICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NDAzNjoxOiAoICggUlVMRV9JTlQgKSB8ICggUlVMRV9ERUNJTUFMICkgKQorICAgICAgICAgICAgaW50IGFsdDQ2PTI7CisgICAgICAgICAgICBpbnQgTEE0Nl8wID0gaW5wdXQuTEEoMSk7CiAKLSAgICAgICAgICAgIGlmICggKExBNDVfMD09UlVMRV9JTlQpICkgewotICAgICAgICAgICAgICAgIGFsdDQ1PTE7CisgICAgICAgICAgICBpZiAoIChMQTQ2XzA9PVJVTEVfSU5UKSApIHsKKyAgICAgICAgICAgICAgICBhbHQ0Nj0xOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSBpZiAoIChMQTQ1XzA9PVJVTEVfREVDSU1BTCkgKSB7Ci0gICAgICAgICAgICAgICAgYWx0NDU9MjsKKyAgICAgICAgICAgIGVsc2UgaWYgKCAoTEE0Nl8wPT1SVUxFX0RFQ0lNQUwpICkgeworICAgICAgICAgICAgICAgIGFsdDQ2PTI7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICBpZiAoc3RhdGUuYmFja3RyYWNraW5nPjApIHtzdGF0ZS5mYWlsZWQ9dHJ1ZTsgcmV0dXJuIDt9CiAgICAgICAgICAgICAgICAgTm9WaWFibGVBbHRFeGNlcHRpb24gbnZhZSA9Ci0gICAgICAgICAgICAgICAgICAgIG5ldyBOb1ZpYWJsZUFsdEV4Y2VwdGlvbigiIiwgNDUsIDAsIGlucHV0KTsKKyAgICAgICAgICAgICAgICAgICAgbmV3IE5vVmlhYmxlQWx0RXhjZXB0aW9uKCIiLCA0NiwgMCwgaW5wdXQpOwogCiAgICAgICAgICAgICAgICAgdGhyb3cgbnZhZTsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHN3aXRjaCAoYWx0NDUpIHsKKyAgICAgICAgICAgIHN3aXRjaCAoYWx0NDYpIHsKICAgICAgICAgICAgICAgICBjYXNlIDEgOgotICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzozODg0OjI6ICggUlVMRV9JTlQgKQorICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo0MDM3OjI6ICggUlVMRV9JTlQgKQogICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjM4ODQ6MjogKCBSVUxFX0lOVCApCi0gICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjM4ODU6MzogUlVMRV9JTlQKKyAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NDAzNzoyOiAoIFJVTEVfSU5UICkKKyAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NDAzODozOiBSVUxFX0lOVAogICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXROdW1iZXJBY2Nlc3MoKS5nZXRJTlRUZXJtaW5hbFJ1bGVDYWxsXzFfMV8xXzAoKSk7IApAQCAtMTQyOTcsMTAgKzE0ODUzLDEwIEBACiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgY2FzZSAyIDoKLSAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6Mzg5MDoyOiAoIFJVTEVfREVDSU1BTCApCisgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjQwNDM6MjogKCBSVUxFX0RFQ0lNQUwgKQogICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjM4OTA6MjogKCBSVUxFX0RFQ0lNQUwgKQotICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzozODkxOjM6IFJVTEVfREVDSU1BTAorICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo0MDQzOjI6ICggUlVMRV9ERUNJTUFMICkKKyAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NDA0NDozOiBSVUxFX0RFQ0lNQUwKICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0TnVtYmVyQWNjZXNzKCkuZ2V0REVDSU1BTFRlcm1pbmFsUnVsZUNhbGxfMV8xXzFfMSgpKTsgCkBAIC0xNDMzMyw0MSArMTQ4ODksNDEgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19Kdm1UeXBlUmVmZXJlbmNlX19BbHRlcm5hdGl2ZXMiCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MzkwMDoxOiBydWxlX19Kdm1UeXBlUmVmZXJlbmNlX19BbHRlcm5hdGl2ZXMgOiAoICggKCBydWxlX19Kdm1UeXBlUmVmZXJlbmNlX19Hcm91cF8wX18wICkgKSB8ICggcnVsZVhGdW5jdGlvblR5cGVSZWYgKSApOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjQwNTM6MTogcnVsZV9fSnZtVHlwZVJlZmVyZW5jZV9fQWx0ZXJuYXRpdmVzIDogKCAoICggcnVsZV9fSnZtVHlwZVJlZmVyZW5jZV9fR3JvdXBfMF9fMCApICkgfCAoIHJ1bGVYRnVuY3Rpb25UeXBlUmVmICkgKTsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19Kdm1UeXBlUmVmZXJlbmNlX19BbHRlcm5hdGl2ZXMoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MzkwNDoxOiAoICggKCBydWxlX19Kdm1UeXBlUmVmZXJlbmNlX19Hcm91cF8wX18wICkgKSB8ICggcnVsZVhGdW5jdGlvblR5cGVSZWYgKSApCi0gICAgICAgICAgICBpbnQgYWx0NDY9MjsKLSAgICAgICAgICAgIGludCBMQTQ2XzAgPSBpbnB1dC5MQSgxKTsKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjQwNTc6MTogKCAoICggcnVsZV9fSnZtVHlwZVJlZmVyZW5jZV9fR3JvdXBfMF9fMCApICkgfCAoIHJ1bGVYRnVuY3Rpb25UeXBlUmVmICkgKQorICAgICAgICAgICAgaW50IGFsdDQ3PTI7CisgICAgICAgICAgICBpbnQgTEE0N18wID0gaW5wdXQuTEEoMSk7CiAKLSAgICAgICAgICAgIGlmICggKExBNDZfMD09UlVMRV9JRCkgKSB7Ci0gICAgICAgICAgICAgICAgYWx0NDY9MTsKKyAgICAgICAgICAgIGlmICggKExBNDdfMD09UlVMRV9JRCkgKSB7CisgICAgICAgICAgICAgICAgYWx0NDc9MTsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgaWYgKCAoTEE0Nl8wPT0zMXx8TEE0Nl8wPT0xMTMpICkgewotICAgICAgICAgICAgICAgIGFsdDQ2PTI7CisgICAgICAgICAgICBlbHNlIGlmICggKExBNDdfMD09MzF8fExBNDdfMD09MTIzKSApIHsKKyAgICAgICAgICAgICAgICBhbHQ0Nz0yOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgaWYgKHN0YXRlLmJhY2t0cmFja2luZz4wKSB7c3RhdGUuZmFpbGVkPXRydWU7IHJldHVybiA7fQogICAgICAgICAgICAgICAgIE5vVmlhYmxlQWx0RXhjZXB0aW9uIG52YWUgPQotICAgICAgICAgICAgICAgICAgICBuZXcgTm9WaWFibGVBbHRFeGNlcHRpb24oIiIsIDQ2LCAwLCBpbnB1dCk7CisgICAgICAgICAgICAgICAgICAgIG5ldyBOb1ZpYWJsZUFsdEV4Y2VwdGlvbigiIiwgNDcsIDAsIGlucHV0KTsKIAogICAgICAgICAgICAgICAgIHRocm93IG52YWU7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBzd2l0Y2ggKGFsdDQ2KSB7CisgICAgICAgICAgICBzd2l0Y2ggKGFsdDQ3KSB7CiAgICAgICAgICAgICAgICAgY2FzZSAxIDoKLSAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MzkwNToyOiAoICggcnVsZV9fSnZtVHlwZVJlZmVyZW5jZV9fR3JvdXBfMF9fMCApICkKKyAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NDA1ODoyOiAoICggcnVsZV9fSnZtVHlwZVJlZmVyZW5jZV9fR3JvdXBfMF9fMCApICkKICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzozOTA1OjI6ICggKCBydWxlX19Kdm1UeXBlUmVmZXJlbmNlX19Hcm91cF8wX18wICkgKQotICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzozOTA2OjM6ICggcnVsZV9fSnZtVHlwZVJlZmVyZW5jZV9fR3JvdXBfMF9fMCApCisgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjQwNTg6MjogKCAoIHJ1bGVfX0p2bVR5cGVSZWZlcmVuY2VfX0dyb3VwXzBfXzAgKSApCisgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjQwNTk6MzogKCBydWxlX19Kdm1UeXBlUmVmZXJlbmNlX19Hcm91cF8wX18wICkKICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0SnZtVHlwZVJlZmVyZW5jZUFjY2VzcygpLmdldEdyb3VwXzAoKSk7IAogICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjM5MDc6MzogKCBydWxlX19Kdm1UeXBlUmVmZXJlbmNlX19Hcm91cF8wX18wICkKLSAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MzkwNzo0OiBydWxlX19Kdm1UeXBlUmVmZXJlbmNlX19Hcm91cF8wX18wCisgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjQwNjA6MzogKCBydWxlX19Kdm1UeXBlUmVmZXJlbmNlX19Hcm91cF8wX18wICkKKyAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NDA2MDo0OiBydWxlX19Kdm1UeXBlUmVmZXJlbmNlX19Hcm91cF8wX18wCiAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMik7CiAgICAgICAgICAgICAgICAgICAgIHJ1bGVfX0p2bVR5cGVSZWZlcmVuY2VfX0dyb3VwXzBfXzAoKTsKQEAgLTE0Mzg3LDEwICsxNDk0MywxMCBAQAogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgIGNhc2UgMiA6Ci0gICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjM5MTE6MjogKCBydWxlWEZ1bmN0aW9uVHlwZVJlZiApCisgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjQwNjQ6MjogKCBydWxlWEZ1bmN0aW9uVHlwZVJlZiApCiAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MzkxMToyOiAoIHJ1bGVYRnVuY3Rpb25UeXBlUmVmICkKLSAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MzkxMjozOiBydWxlWEZ1bmN0aW9uVHlwZVJlZgorICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo0MDY0OjI6ICggcnVsZVhGdW5jdGlvblR5cGVSZWYgKQorICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo0MDY1OjM6IHJ1bGVYRnVuY3Rpb25UeXBlUmVmCiAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldEp2bVR5cGVSZWZlcmVuY2VBY2Nlc3MoKS5nZXRYRnVuY3Rpb25UeXBlUmVmUGFyc2VyUnVsZUNhbGxfMSgpKTsgCkBAIC0xNDQyNywzNSArMTQ5ODMsMzUgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19Kdm1Bcmd1bWVudFR5cGVSZWZlcmVuY2VfX0FsdGVybmF0aXZlcyIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzozOTIxOjE6IHJ1bGVfX0p2bUFyZ3VtZW50VHlwZVJlZmVyZW5jZV9fQWx0ZXJuYXRpdmVzIDogKCAoIHJ1bGVKdm1UeXBlUmVmZXJlbmNlICkgfCAoIHJ1bGVKdm1XaWxkY2FyZFR5cGVSZWZlcmVuY2UgKSApOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjQwNzQ6MTogcnVsZV9fSnZtQXJndW1lbnRUeXBlUmVmZXJlbmNlX19BbHRlcm5hdGl2ZXMgOiAoICggcnVsZUp2bVR5cGVSZWZlcmVuY2UgKSB8ICggcnVsZUp2bVdpbGRjYXJkVHlwZVJlZmVyZW5jZSApICk7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fSnZtQXJndW1lbnRUeXBlUmVmZXJlbmNlX19BbHRlcm5hdGl2ZXMoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MzkyNToxOiAoICggcnVsZUp2bVR5cGVSZWZlcmVuY2UgKSB8ICggcnVsZUp2bVdpbGRjYXJkVHlwZVJlZmVyZW5jZSApICkKLSAgICAgICAgICAgIGludCBhbHQ0Nz0yOwotICAgICAgICAgICAgaW50IExBNDdfMCA9IGlucHV0LkxBKDEpOworICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NDA3ODoxOiAoICggcnVsZUp2bVR5cGVSZWZlcmVuY2UgKSB8ICggcnVsZUp2bVdpbGRjYXJkVHlwZVJlZmVyZW5jZSApICkKKyAgICAgICAgICAgIGludCBhbHQ0OD0yOworICAgICAgICAgICAgaW50IExBNDhfMCA9IGlucHV0LkxBKDEpOwogCi0gICAgICAgICAgICBpZiAoIChMQTQ3XzA9PVJVTEVfSUR8fExBNDdfMD09MzF8fExBNDdfMD09MTEzKSApIHsKLSAgICAgICAgICAgICAgICBhbHQ0Nz0xOworICAgICAgICAgICAgaWYgKCAoTEE0OF8wPT1SVUxFX0lEfHxMQTQ4XzA9PTMxfHxMQTQ4XzA9PTEyMykgKSB7CisgICAgICAgICAgICAgICAgYWx0NDg9MTsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgaWYgKCAoTEE0N18wPT0xMzcpICkgewotICAgICAgICAgICAgICAgIGFsdDQ3PTI7CisgICAgICAgICAgICBlbHNlIGlmICggKExBNDhfMD09MTQ3KSApIHsKKyAgICAgICAgICAgICAgICBhbHQ0OD0yOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgaWYgKHN0YXRlLmJhY2t0cmFja2luZz4wKSB7c3RhdGUuZmFpbGVkPXRydWU7IHJldHVybiA7fQogICAgICAgICAgICAgICAgIE5vVmlhYmxlQWx0RXhjZXB0aW9uIG52YWUgPQotICAgICAgICAgICAgICAgICAgICBuZXcgTm9WaWFibGVBbHRFeGNlcHRpb24oIiIsIDQ3LCAwLCBpbnB1dCk7CisgICAgICAgICAgICAgICAgICAgIG5ldyBOb1ZpYWJsZUFsdEV4Y2VwdGlvbigiIiwgNDgsIDAsIGlucHV0KTsKIAogICAgICAgICAgICAgICAgIHRocm93IG52YWU7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBzd2l0Y2ggKGFsdDQ3KSB7CisgICAgICAgICAgICBzd2l0Y2ggKGFsdDQ4KSB7CiAgICAgICAgICAgICAgICAgY2FzZSAxIDoKLSAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MzkyNjoyOiAoIHJ1bGVKdm1UeXBlUmVmZXJlbmNlICkKKyAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NDA3OToyOiAoIHJ1bGVKdm1UeXBlUmVmZXJlbmNlICkKICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzozOTI2OjI6ICggcnVsZUp2bVR5cGVSZWZlcmVuY2UgKQotICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzozOTI3OjM6IHJ1bGVKdm1UeXBlUmVmZXJlbmNlCisgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjQwNzk6MjogKCBydWxlSnZtVHlwZVJlZmVyZW5jZSApCisgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjQwODA6MzogcnVsZUp2bVR5cGVSZWZlcmVuY2UKICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0SnZtQXJndW1lbnRUeXBlUmVmZXJlbmNlQWNjZXNzKCkuZ2V0SnZtVHlwZVJlZmVyZW5jZVBhcnNlclJ1bGVDYWxsXzAoKSk7IApAQCAtMTQ0NzUsMTAgKzE1MDMxLDEwIEBACiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgY2FzZSAyIDoKLSAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MzkzMjoyOiAoIHJ1bGVKdm1XaWxkY2FyZFR5cGVSZWZlcmVuY2UgKQorICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo0MDg1OjI6ICggcnVsZUp2bVdpbGRjYXJkVHlwZVJlZmVyZW5jZSApCiAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MzkzMjoyOiAoIHJ1bGVKdm1XaWxkY2FyZFR5cGVSZWZlcmVuY2UgKQotICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzozOTMzOjM6IHJ1bGVKdm1XaWxkY2FyZFR5cGVSZWZlcmVuY2UKKyAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NDA4NToyOiAoIHJ1bGVKdm1XaWxkY2FyZFR5cGVSZWZlcmVuY2UgKQorICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo0MDg2OjM6IHJ1bGVKdm1XaWxkY2FyZFR5cGVSZWZlcmVuY2UKICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0SnZtQXJndW1lbnRUeXBlUmVmZXJlbmNlQWNjZXNzKCkuZ2V0SnZtV2lsZGNhcmRUeXBlUmVmZXJlbmNlUGFyc2VyUnVsZUNhbGxfMSgpKTsgCkBAIC0xNDUxNSw0MSArMTUwNzEsNDEgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19Kdm1XaWxkY2FyZFR5cGVSZWZlcmVuY2VfX0FsdGVybmF0aXZlc18yIgotICAgIC8vIEludGVybmFsRGF0YURTTC5nOjM5NDI6MTogcnVsZV9fSnZtV2lsZGNhcmRUeXBlUmVmZXJlbmNlX19BbHRlcm5hdGl2ZXNfMiA6ICggKCAoIHJ1bGVfX0p2bVdpbGRjYXJkVHlwZVJlZmVyZW5jZV9fR3JvdXBfMl8wX18wICkgKSB8ICggKCBydWxlX19Kdm1XaWxkY2FyZFR5cGVSZWZlcmVuY2VfX0dyb3VwXzJfMV9fMCApICkgKTsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo0MDk1OjE6IHJ1bGVfX0p2bVdpbGRjYXJkVHlwZVJlZmVyZW5jZV9fQWx0ZXJuYXRpdmVzXzIgOiAoICggKCBydWxlX19Kdm1XaWxkY2FyZFR5cGVSZWZlcmVuY2VfX0dyb3VwXzJfMF9fMCApICkgfCAoICggcnVsZV9fSnZtV2lsZGNhcmRUeXBlUmVmZXJlbmNlX19Hcm91cF8yXzFfXzAgKSApICk7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fSnZtV2lsZGNhcmRUeXBlUmVmZXJlbmNlX19BbHRlcm5hdGl2ZXNfMigpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzozOTQ2OjE6ICggKCAoIHJ1bGVfX0p2bVdpbGRjYXJkVHlwZVJlZmVyZW5jZV9fR3JvdXBfMl8wX18wICkgKSB8ICggKCBydWxlX19Kdm1XaWxkY2FyZFR5cGVSZWZlcmVuY2VfX0dyb3VwXzJfMV9fMCApICkgKQotICAgICAgICAgICAgaW50IGFsdDQ4PTI7Ci0gICAgICAgICAgICBpbnQgTEE0OF8wID0gaW5wdXQuTEEoMSk7CisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo0MDk5OjE6ICggKCAoIHJ1bGVfX0p2bVdpbGRjYXJkVHlwZVJlZmVyZW5jZV9fR3JvdXBfMl8wX18wICkgKSB8ICggKCBydWxlX19Kdm1XaWxkY2FyZFR5cGVSZWZlcmVuY2VfX0dyb3VwXzJfMV9fMCApICkgKQorICAgICAgICAgICAgaW50IGFsdDQ5PTI7CisgICAgICAgICAgICBpbnQgTEE0OV8wID0gaW5wdXQuTEEoMSk7CiAKLSAgICAgICAgICAgIGlmICggKExBNDhfMD09NDUpICkgewotICAgICAgICAgICAgICAgIGFsdDQ4PTE7CisgICAgICAgICAgICBpZiAoIChMQTQ5XzA9PTQ1KSApIHsKKyAgICAgICAgICAgICAgICBhbHQ0OT0xOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSBpZiAoIChMQTQ4XzA9PTQ5KSApIHsKLSAgICAgICAgICAgICAgICBhbHQ0OD0yOworICAgICAgICAgICAgZWxzZSBpZiAoIChMQTQ5XzA9PTQ5KSApIHsKKyAgICAgICAgICAgICAgICBhbHQ0OT0yOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgaWYgKHN0YXRlLmJhY2t0cmFja2luZz4wKSB7c3RhdGUuZmFpbGVkPXRydWU7IHJldHVybiA7fQogICAgICAgICAgICAgICAgIE5vVmlhYmxlQWx0RXhjZXB0aW9uIG52YWUgPQotICAgICAgICAgICAgICAgICAgICBuZXcgTm9WaWFibGVBbHRFeGNlcHRpb24oIiIsIDQ4LCAwLCBpbnB1dCk7CisgICAgICAgICAgICAgICAgICAgIG5ldyBOb1ZpYWJsZUFsdEV4Y2VwdGlvbigiIiwgNDksIDAsIGlucHV0KTsKIAogICAgICAgICAgICAgICAgIHRocm93IG52YWU7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBzd2l0Y2ggKGFsdDQ4KSB7CisgICAgICAgICAgICBzd2l0Y2ggKGFsdDQ5KSB7CiAgICAgICAgICAgICAgICAgY2FzZSAxIDoKLSAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6Mzk0NzoyOiAoICggcnVsZV9fSnZtV2lsZGNhcmRUeXBlUmVmZXJlbmNlX19Hcm91cF8yXzBfXzAgKSApCisgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjQxMDA6MjogKCAoIHJ1bGVfX0p2bVdpbGRjYXJkVHlwZVJlZmVyZW5jZV9fR3JvdXBfMl8wX18wICkgKQogICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjM5NDc6MjogKCAoIHJ1bGVfX0p2bVdpbGRjYXJkVHlwZVJlZmVyZW5jZV9fR3JvdXBfMl8wX18wICkgKQotICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzozOTQ4OjM6ICggcnVsZV9fSnZtV2lsZGNhcmRUeXBlUmVmZXJlbmNlX19Hcm91cF8yXzBfXzAgKQorICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo0MTAwOjI6ICggKCBydWxlX19Kdm1XaWxkY2FyZFR5cGVSZWZlcmVuY2VfX0dyb3VwXzJfMF9fMCApICkKKyAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NDEwMTozOiAoIHJ1bGVfX0p2bVdpbGRjYXJkVHlwZVJlZmVyZW5jZV9fR3JvdXBfMl8wX18wICkKICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0SnZtV2lsZGNhcmRUeXBlUmVmZXJlbmNlQWNjZXNzKCkuZ2V0R3JvdXBfMl8wKCkpOyAKICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzozOTQ5OjM6ICggcnVsZV9fSnZtV2lsZGNhcmRUeXBlUmVmZXJlbmNlX19Hcm91cF8yXzBfXzAgKQotICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzozOTQ5OjQ6IHJ1bGVfX0p2bVdpbGRjYXJkVHlwZVJlZmVyZW5jZV9fR3JvdXBfMl8wX18wCisgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjQxMDI6MzogKCBydWxlX19Kdm1XaWxkY2FyZFR5cGVSZWZlcmVuY2VfX0dyb3VwXzJfMF9fMCApCisgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjQxMDI6NDogcnVsZV9fSnZtV2lsZGNhcmRUeXBlUmVmZXJlbmNlX19Hcm91cF8yXzBfXzAKICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV18yKTsKICAgICAgICAgICAgICAgICAgICAgcnVsZV9fSnZtV2lsZGNhcmRUeXBlUmVmZXJlbmNlX19Hcm91cF8yXzBfXzAoKTsKQEAgLTE0NTY5LDE2ICsxNTEyNSwxNiBAQAogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgIGNhc2UgMiA6Ci0gICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjM5NTM6MjogKCAoIHJ1bGVfX0p2bVdpbGRjYXJkVHlwZVJlZmVyZW5jZV9fR3JvdXBfMl8xX18wICkgKQorICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo0MTA2OjI6ICggKCBydWxlX19Kdm1XaWxkY2FyZFR5cGVSZWZlcmVuY2VfX0dyb3VwXzJfMV9fMCApICkKICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzozOTUzOjI6ICggKCBydWxlX19Kdm1XaWxkY2FyZFR5cGVSZWZlcmVuY2VfX0dyb3VwXzJfMV9fMCApICkKLSAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6Mzk1NDozOiAoIHJ1bGVfX0p2bVdpbGRjYXJkVHlwZVJlZmVyZW5jZV9fR3JvdXBfMl8xX18wICkKKyAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NDEwNjoyOiAoICggcnVsZV9fSnZtV2lsZGNhcmRUeXBlUmVmZXJlbmNlX19Hcm91cF8yXzFfXzAgKSApCisgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjQxMDc6MzogKCBydWxlX19Kdm1XaWxkY2FyZFR5cGVSZWZlcmVuY2VfX0dyb3VwXzJfMV9fMCApCiAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldEp2bVdpbGRjYXJkVHlwZVJlZmVyZW5jZUFjY2VzcygpLmdldEdyb3VwXzJfMSgpKTsgCiAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6Mzk1NTozOiAoIHJ1bGVfX0p2bVdpbGRjYXJkVHlwZVJlZmVyZW5jZV9fR3JvdXBfMl8xX18wICkKLSAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6Mzk1NTo0OiBydWxlX19Kdm1XaWxkY2FyZFR5cGVSZWZlcmVuY2VfX0dyb3VwXzJfMV9fMAorICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo0MTA4OjM6ICggcnVsZV9fSnZtV2lsZGNhcmRUeXBlUmVmZXJlbmNlX19Hcm91cF8yXzFfXzAgKQorICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo0MTA4OjQ6IHJ1bGVfX0p2bVdpbGRjYXJkVHlwZVJlZmVyZW5jZV9fR3JvdXBfMl8xX18wCiAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMik7CiAgICAgICAgICAgICAgICAgICAgIHJ1bGVfX0p2bVdpbGRjYXJkVHlwZVJlZmVyZW5jZV9fR3JvdXBfMl8xX18wKCk7CkBAIC0xNDYxNSw2NSArMTUxNzEsNjUgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19QcmVkZWZpbmVkQmxvYk1pbWVUeXBlRW51bV9fQWx0ZXJuYXRpdmVzIgotICAgIC8vIEludGVybmFsRGF0YURTTC5nOjM5NjM6MTogcnVsZV9fUHJlZGVmaW5lZEJsb2JNaW1lVHlwZUVudW1fX0FsdGVybmF0aXZlcyA6ICggKCAoICdwbGFpbicgKSApIHwgKCAoICdqcGcnICkgKSB8ICggKCAncG5nJyApICkgfCAoICggJ21wZWcnICkgKSB8ICggKCAnb2N0ZXQtc3RyZWFtJyApICkgfCAoICggJ3BkZicgKSApICk7CisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NDExNjoxOiBydWxlX19QcmVkZWZpbmVkQmxvYk1pbWVUeXBlRW51bV9fQWx0ZXJuYXRpdmVzIDogKCAoICggJ3BsYWluJyApICkgfCAoICggJ2pwZycgKSApIHwgKCAoICdwbmcnICkgKSB8ICggKCAnbXBlZycgKSApIHwgKCAoICdvY3RldC1zdHJlYW0nICkgKSB8ICggKCAncGRmJyApICkgKTsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19QcmVkZWZpbmVkQmxvYk1pbWVUeXBlRW51bV9fQWx0ZXJuYXRpdmVzKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjM5Njc6MTogKCAoICggJ3BsYWluJyApICkgfCAoICggJ2pwZycgKSApIHwgKCAoICdwbmcnICkgKSB8ICggKCAnbXBlZycgKSApIHwgKCAoICdvY3RldC1zdHJlYW0nICkgKSB8ICggKCAncGRmJyApICkgKQotICAgICAgICAgICAgaW50IGFsdDQ5PTY7CisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo0MTIwOjE6ICggKCAoICdwbGFpbicgKSApIHwgKCAoICdqcGcnICkgKSB8ICggKCAncG5nJyApICkgfCAoICggJ21wZWcnICkgKSB8ICggKCAnb2N0ZXQtc3RyZWFtJyApICkgfCAoICggJ3BkZicgKSApICkKKyAgICAgICAgICAgIGludCBhbHQ1MD02OwogICAgICAgICAgICAgc3dpdGNoICggaW5wdXQuTEEoMSkgKSB7CiAgICAgICAgICAgICBjYXNlIDUxOgogICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBhbHQ0OT0xOworICAgICAgICAgICAgICAgIGFsdDUwPTE7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgY2FzZSA1MjoKICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgYWx0NDk9MjsKKyAgICAgICAgICAgICAgICBhbHQ1MD0yOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIGNhc2UgNTM6CiAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGFsdDQ5PTM7CisgICAgICAgICAgICAgICAgYWx0NTA9MzsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICBjYXNlIDU0OgogICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBhbHQ0OT00OworICAgICAgICAgICAgICAgIGFsdDUwPTQ7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgY2FzZSA1NToKICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgYWx0NDk9NTsKKyAgICAgICAgICAgICAgICBhbHQ1MD01OwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIGNhc2UgNTY6CiAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGFsdDQ5PTY7CisgICAgICAgICAgICAgICAgYWx0NTA9NjsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgICAgIGlmIChzdGF0ZS5iYWNrdHJhY2tpbmc+MCkge3N0YXRlLmZhaWxlZD10cnVlOyByZXR1cm4gO30KICAgICAgICAgICAgICAgICBOb1ZpYWJsZUFsdEV4Y2VwdGlvbiBudmFlID0KLSAgICAgICAgICAgICAgICAgICAgbmV3IE5vVmlhYmxlQWx0RXhjZXB0aW9uKCIiLCA0OSwgMCwgaW5wdXQpOworICAgICAgICAgICAgICAgICAgICBuZXcgTm9WaWFibGVBbHRFeGNlcHRpb24oIiIsIDUwLCAwLCBpbnB1dCk7CiAKICAgICAgICAgICAgICAgICB0aHJvdyBudmFlOwogICAgICAgICAgICAgfQogCi0gICAgICAgICAgICBzd2l0Y2ggKGFsdDQ5KSB7CisgICAgICAgICAgICBzd2l0Y2ggKGFsdDUwKSB7CiAgICAgICAgICAgICAgICAgY2FzZSAxIDoKLSAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6Mzk2ODoyOiAoICggJ3BsYWluJyApICkKKyAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NDEyMToyOiAoICggJ3BsYWluJyApICkKICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzozOTY4OjI6ICggKCAncGxhaW4nICkgKQotICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzozOTY5OjM6ICggJ3BsYWluJyApCisgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjQxMjE6MjogKCAoICdwbGFpbicgKSApCisgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjQxMjI6MzogKCAncGxhaW4nICkKICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0UHJlZGVmaW5lZEJsb2JNaW1lVHlwZUVudW1BY2Nlc3MoKS5nZXRQbGFpbkVudW1MaXRlcmFsRGVjbGFyYXRpb25fMCgpKTsgCiAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6Mzk3MDozOiAoICdwbGFpbicgKQotICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzozOTcwOjQ6ICdwbGFpbicKKyAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NDEyMzozOiAoICdwbGFpbicgKQorICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo0MTIzOjQ6ICdwbGFpbicKICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICBtYXRjaChpbnB1dCw1MSxGT0xMT1dfMik7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CiAKQEAgLTE0Njg5LDE2ICsxNTI0NSwxNiBAQAogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgIGNhc2UgMiA6Ci0gICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjM5NzQ6MjogKCAoICdqcGcnICkgKQorICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo0MTI3OjI6ICggKCAnanBnJyApICkKICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzozOTc0OjI6ICggKCAnanBnJyApICkKLSAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6Mzk3NTozOiAoICdqcGcnICkKKyAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NDEyNzoyOiAoICggJ2pwZycgKSApCisgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjQxMjg6MzogKCAnanBnJyApCiAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFByZWRlZmluZWRCbG9iTWltZVR5cGVFbnVtQWNjZXNzKCkuZ2V0SnBnRW51bUxpdGVyYWxEZWNsYXJhdGlvbl8xKCkpOyAKICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzozOTc2OjM6ICggJ2pwZycgKQotICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzozOTc2OjQ6ICdqcGcnCisgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjQxMjk6MzogKCAnanBnJyApCisgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjQxMjk6NDogJ2pwZycKICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICBtYXRjaChpbnB1dCw1MixGT0xMT1dfMik7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CiAKQEAgLTE0NzE0LDE2ICsxNTI3MCwxNiBAQAogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgIGNhc2UgMyA6Ci0gICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjM5ODA6MjogKCAoICdwbmcnICkgKQorICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo0MTMzOjI6ICggKCAncG5nJyApICkKICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzozOTgwOjI6ICggKCAncG5nJyApICkKLSAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6Mzk4MTozOiAoICdwbmcnICkKKyAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NDEzMzoyOiAoICggJ3BuZycgKSApCisgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjQxMzQ6MzogKCAncG5nJyApCiAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFByZWRlZmluZWRCbG9iTWltZVR5cGVFbnVtQWNjZXNzKCkuZ2V0UG5nRW51bUxpdGVyYWxEZWNsYXJhdGlvbl8yKCkpOyAKICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzozOTgyOjM6ICggJ3BuZycgKQotICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzozOTgyOjQ6ICdwbmcnCisgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjQxMzU6MzogKCAncG5nJyApCisgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjQxMzU6NDogJ3BuZycKICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICBtYXRjaChpbnB1dCw1MyxGT0xMT1dfMik7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CiAKQEAgLTE0NzM5LDE2ICsxNTI5NSwxNiBAQAogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgIGNhc2UgNCA6Ci0gICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjM5ODY6MjogKCAoICdtcGVnJyApICkKKyAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NDEzOToyOiAoICggJ21wZWcnICkgKQogICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjM5ODY6MjogKCAoICdtcGVnJyApICkKLSAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6Mzk4NzozOiAoICdtcGVnJyApCisgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjQxMzk6MjogKCAoICdtcGVnJyApICkKKyAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NDE0MDozOiAoICdtcGVnJyApCiAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFByZWRlZmluZWRCbG9iTWltZVR5cGVFbnVtQWNjZXNzKCkuZ2V0TXBlZ0VudW1MaXRlcmFsRGVjbGFyYXRpb25fMygpKTsgCiAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6Mzk4ODozOiAoICdtcGVnJyApCi0gICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjM5ODg6NDogJ21wZWcnCisgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjQxNDE6MzogKCAnbXBlZycgKQorICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo0MTQxOjQ6ICdtcGVnJwogICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgIG1hdGNoKGlucHV0LDU0LEZPTExPV18yKTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKIApAQCAtMTQ3NjQsMTYgKzE1MzIwLDE2IEBACiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgY2FzZSA1IDoKLSAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6Mzk5MjoyOiAoICggJ29jdGV0LXN0cmVhbScgKSApCisgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjQxNDU6MjogKCAoICdvY3RldC1zdHJlYW0nICkgKQogICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjM5OTI6MjogKCAoICdvY3RldC1zdHJlYW0nICkgKQotICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzozOTkzOjM6ICggJ29jdGV0LXN0cmVhbScgKQorICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo0MTQ1OjI6ICggKCAnb2N0ZXQtc3RyZWFtJyApICkKKyAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NDE0NjozOiAoICdvY3RldC1zdHJlYW0nICkKICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0UHJlZGVmaW5lZEJsb2JNaW1lVHlwZUVudW1BY2Nlc3MoKS5nZXRPY3RldHN0cmVhbUVudW1MaXRlcmFsRGVjbGFyYXRpb25fNCgpKTsgCiAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6Mzk5NDozOiAoICdvY3RldC1zdHJlYW0nICkKLSAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6Mzk5NDo0OiAnb2N0ZXQtc3RyZWFtJworICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo0MTQ3OjM6ICggJ29jdGV0LXN0cmVhbScgKQorICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo0MTQ3OjQ6ICdvY3RldC1zdHJlYW0nCiAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgbWF0Y2goaW5wdXQsNTUsRk9MTE9XXzIpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOwogCkBAIC0xNDc4OSwxNiArMTUzNDUsMTYgQEAKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICBjYXNlIDYgOgotICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzozOTk4OjI6ICggKCAncGRmJyApICkKKyAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NDE1MToyOiAoICggJ3BkZicgKSApCiAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6Mzk5ODoyOiAoICggJ3BkZicgKSApCi0gICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjM5OTk6MzogKCAncGRmJyApCisgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjQxNTE6MjogKCAoICdwZGYnICkgKQorICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo0MTUyOjM6ICggJ3BkZicgKQogICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRQcmVkZWZpbmVkQmxvYk1pbWVUeXBlRW51bUFjY2VzcygpLmdldFBkZkVudW1MaXRlcmFsRGVjbGFyYXRpb25fNSgpKTsgCiAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NDAwMDozOiAoICdwZGYnICkKLSAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NDAwMDo0OiAncGRmJworICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo0MTUzOjM6ICggJ3BkZicgKQorICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo0MTUzOjQ6ICdwZGYnCiAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgbWF0Y2goaW5wdXQsNTYsRk9MTE9XXzIpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOwogCkBAIC0xNDgzMSw1MCArMTUzODcsNTAgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19QcmVkZWZpbmVkQmVhbkVudW1fX0FsdGVybmF0aXZlcyIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo0MDA4OjE6IHJ1bGVfX1ByZWRlZmluZWRCZWFuRW51bV9fQWx0ZXJuYXRpdmVzIDogKCAoICggJ05vd0RhdGUnICkgKSB8ICggKCAnU3RhcnREYXRlJyApICkgfCAoICggJ1VuaXZlcnNhbGx5VW5pcXVlSWRlbnRpZmllcicgKSApICk7CisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NDE2MToxOiBydWxlX19QcmVkZWZpbmVkQmVhbkVudW1fX0FsdGVybmF0aXZlcyA6ICggKCAoICdOb3dEYXRlJyApICkgfCAoICggJ1N0YXJ0RGF0ZScgKSApIHwgKCAoICdVbml2ZXJzYWxseVVuaXF1ZUlkZW50aWZpZXInICkgKSApOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1ByZWRlZmluZWRCZWFuRW51bV9fQWx0ZXJuYXRpdmVzKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjQwMTI6MTogKCAoICggJ05vd0RhdGUnICkgKSB8ICggKCAnU3RhcnREYXRlJyApICkgfCAoICggJ1VuaXZlcnNhbGx5VW5pcXVlSWRlbnRpZmllcicgKSApICkKLSAgICAgICAgICAgIGludCBhbHQ1MD0zOworICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NDE2NToxOiAoICggKCAnTm93RGF0ZScgKSApIHwgKCAoICdTdGFydERhdGUnICkgKSB8ICggKCAnVW5pdmVyc2FsbHlVbmlxdWVJZGVudGlmaWVyJyApICkgKQorICAgICAgICAgICAgaW50IGFsdDUxPTM7CiAgICAgICAgICAgICBzd2l0Y2ggKCBpbnB1dC5MQSgxKSApIHsKICAgICAgICAgICAgIGNhc2UgNTc6CiAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGFsdDUwPTE7CisgICAgICAgICAgICAgICAgYWx0NTE9MTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICBjYXNlIDU4OgogICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBhbHQ1MD0yOworICAgICAgICAgICAgICAgIGFsdDUxPTI7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgY2FzZSA1OToKICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgYWx0NTA9MzsKKyAgICAgICAgICAgICAgICBhbHQ1MT0zOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICAgICAgaWYgKHN0YXRlLmJhY2t0cmFja2luZz4wKSB7c3RhdGUuZmFpbGVkPXRydWU7IHJldHVybiA7fQogICAgICAgICAgICAgICAgIE5vVmlhYmxlQWx0RXhjZXB0aW9uIG52YWUgPQotICAgICAgICAgICAgICAgICAgICBuZXcgTm9WaWFibGVBbHRFeGNlcHRpb24oIiIsIDUwLCAwLCBpbnB1dCk7CisgICAgICAgICAgICAgICAgICAgIG5ldyBOb1ZpYWJsZUFsdEV4Y2VwdGlvbigiIiwgNTEsIDAsIGlucHV0KTsKIAogICAgICAgICAgICAgICAgIHRocm93IG52YWU7CiAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgIHN3aXRjaCAoYWx0NTApIHsKKyAgICAgICAgICAgIHN3aXRjaCAoYWx0NTEpIHsKICAgICAgICAgICAgICAgICBjYXNlIDEgOgotICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo0MDEzOjI6ICggKCAnTm93RGF0ZScgKSApCisgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjQxNjY6MjogKCAoICdOb3dEYXRlJyApICkKICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo0MDEzOjI6ICggKCAnTm93RGF0ZScgKSApCi0gICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjQwMTQ6MzogKCAnTm93RGF0ZScgKQorICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo0MTY2OjI6ICggKCAnTm93RGF0ZScgKSApCisgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjQxNjc6MzogKCAnTm93RGF0ZScgKQogICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRQcmVkZWZpbmVkQmVhbkVudW1BY2Nlc3MoKS5nZXROb3dFbnVtTGl0ZXJhbERlY2xhcmF0aW9uXzAoKSk7IAogICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjQwMTU6MzogKCAnTm93RGF0ZScgKQotICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo0MDE1OjQ6ICdOb3dEYXRlJworICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo0MTY4OjM6ICggJ05vd0RhdGUnICkKKyAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NDE2ODo0OiAnTm93RGF0ZScKICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICBtYXRjaChpbnB1dCw1NyxGT0xMT1dfMik7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CiAKQEAgLTE0ODkwLDE2ICsxNTQ0NiwxNiBAQAogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgIGNhc2UgMiA6Ci0gICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjQwMTk6MjogKCAoICdTdGFydERhdGUnICkgKQorICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo0MTcyOjI6ICggKCAnU3RhcnREYXRlJyApICkKICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo0MDE5OjI6ICggKCAnU3RhcnREYXRlJyApICkKLSAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NDAyMDozOiAoICdTdGFydERhdGUnICkKKyAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NDE3MjoyOiAoICggJ1N0YXJ0RGF0ZScgKSApCisgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjQxNzM6MzogKCAnU3RhcnREYXRlJyApCiAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFByZWRlZmluZWRCZWFuRW51bUFjY2VzcygpLmdldFN0YXJ0RW51bUxpdGVyYWxEZWNsYXJhdGlvbl8xKCkpOyAKICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo0MDIxOjM6ICggJ1N0YXJ0RGF0ZScgKQotICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo0MDIxOjQ6ICdTdGFydERhdGUnCisgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjQxNzQ6MzogKCAnU3RhcnREYXRlJyApCisgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjQxNzQ6NDogJ1N0YXJ0RGF0ZScKICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICBtYXRjaChpbnB1dCw1OCxGT0xMT1dfMik7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CiAKQEAgLTE0OTE1LDE2ICsxNTQ3MSwxNiBAQAogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgIGNhc2UgMyA6Ci0gICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjQwMjU6MjogKCAoICdVbml2ZXJzYWxseVVuaXF1ZUlkZW50aWZpZXInICkgKQorICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo0MTc4OjI6ICggKCAnVW5pdmVyc2FsbHlVbmlxdWVJZGVudGlmaWVyJyApICkKICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo0MDI1OjI6ICggKCAnVW5pdmVyc2FsbHlVbmlxdWVJZGVudGlmaWVyJyApICkKLSAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NDAyNjozOiAoICdVbml2ZXJzYWxseVVuaXF1ZUlkZW50aWZpZXInICkKKyAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NDE3ODoyOiAoICggJ1VuaXZlcnNhbGx5VW5pcXVlSWRlbnRpZmllcicgKSApCisgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjQxNzk6MzogKCAnVW5pdmVyc2FsbHlVbmlxdWVJZGVudGlmaWVyJyApCiAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFByZWRlZmluZWRCZWFuRW51bUFjY2VzcygpLmdldFVVSURFbnVtTGl0ZXJhbERlY2xhcmF0aW9uXzIoKSk7IAogICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjQwMjc6MzogKCAnVW5pdmVyc2FsbHlVbmlxdWVJZGVudGlmaWVyJyApCi0gICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjQwMjc6NDogJ1VuaXZlcnNhbGx5VW5pcXVlSWRlbnRpZmllcicKKyAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NDE4MDozOiAoICdVbml2ZXJzYWxseVVuaXF1ZUlkZW50aWZpZXInICkKKyAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NDE4MDo0OiAnVW5pdmVyc2FsbHlVbmlxdWVJZGVudGlmaWVyJwogICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgIG1hdGNoKGlucHV0LDU5LEZPTExPV18yKTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKIApAQCAtMTQ5NTcsNjAgKzE1NTEzLDYwIEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fUHJlZGVmaW5lZEJlYW5UeXBlRW51bV9fQWx0ZXJuYXRpdmVzIgotICAgIC8vIEludGVybmFsRGF0YURTTC5nOjQwMzU6MTogcnVsZV9fUHJlZGVmaW5lZEJlYW5UeXBlRW51bV9fQWx0ZXJuYXRpdmVzIDogKCAoICggJ0RhdGUnICkgKSB8ICggKCAnTWlsbGlzZWNvbmRzJyApICkgfCAoICggJ05hbm9zZWNvbmRzJyApICkgfCAoICggJ1JhbmRvbScgKSApIHwgKCAoICdFeGVjdXRlQ29udGV4dCcgKSApICk7CisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NDE4ODoxOiBydWxlX19QcmVkZWZpbmVkQmVhblR5cGVFbnVtX19BbHRlcm5hdGl2ZXMgOiAoICggKCAnRGF0ZScgKSApIHwgKCAoICdNaWxsaXNlY29uZHMnICkgKSB8ICggKCAnTmFub3NlY29uZHMnICkgKSB8ICggKCAnUmFuZG9tJyApICkgfCAoICggJ0V4ZWN1dGVDb250ZXh0JyApICkgKTsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19QcmVkZWZpbmVkQmVhblR5cGVFbnVtX19BbHRlcm5hdGl2ZXMoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NDAzOToxOiAoICggKCAnRGF0ZScgKSApIHwgKCAoICdNaWxsaXNlY29uZHMnICkgKSB8ICggKCAnTmFub3NlY29uZHMnICkgKSB8ICggKCAnUmFuZG9tJyApICkgfCAoICggJ0V4ZWN1dGVDb250ZXh0JyApICkgKQotICAgICAgICAgICAgaW50IGFsdDUxPTU7CisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo0MTkyOjE6ICggKCAoICdEYXRlJyApICkgfCAoICggJ01pbGxpc2Vjb25kcycgKSApIHwgKCAoICdOYW5vc2Vjb25kcycgKSApIHwgKCAoICdSYW5kb20nICkgKSB8ICggKCAnRXhlY3V0ZUNvbnRleHQnICkgKSApCisgICAgICAgICAgICBpbnQgYWx0NTI9NTsKICAgICAgICAgICAgIHN3aXRjaCAoIGlucHV0LkxBKDEpICkgewogICAgICAgICAgICAgY2FzZSA2MDoKICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgYWx0NTE9MTsKKyAgICAgICAgICAgICAgICBhbHQ1Mj0xOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIGNhc2UgNjE6CiAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGFsdDUxPTI7CisgICAgICAgICAgICAgICAgYWx0NTI9MjsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICBjYXNlIDYyOgogICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBhbHQ1MT0zOworICAgICAgICAgICAgICAgIGFsdDUyPTM7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgY2FzZSA2MzoKICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgYWx0NTE9NDsKKyAgICAgICAgICAgICAgICBhbHQ1Mj00OwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIGNhc2UgNjQ6CiAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGFsdDUxPTU7CisgICAgICAgICAgICAgICAgYWx0NTI9NTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgICAgIGlmIChzdGF0ZS5iYWNrdHJhY2tpbmc+MCkge3N0YXRlLmZhaWxlZD10cnVlOyByZXR1cm4gO30KICAgICAgICAgICAgICAgICBOb1ZpYWJsZUFsdEV4Y2VwdGlvbiBudmFlID0KLSAgICAgICAgICAgICAgICAgICAgbmV3IE5vVmlhYmxlQWx0RXhjZXB0aW9uKCIiLCA1MSwgMCwgaW5wdXQpOworICAgICAgICAgICAgICAgICAgICBuZXcgTm9WaWFibGVBbHRFeGNlcHRpb24oIiIsIDUyLCAwLCBpbnB1dCk7CiAKICAgICAgICAgICAgICAgICB0aHJvdyBudmFlOwogICAgICAgICAgICAgfQogCi0gICAgICAgICAgICBzd2l0Y2ggKGFsdDUxKSB7CisgICAgICAgICAgICBzd2l0Y2ggKGFsdDUyKSB7CiAgICAgICAgICAgICAgICAgY2FzZSAxIDoKLSAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NDA0MDoyOiAoICggJ0RhdGUnICkgKQorICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo0MTkzOjI6ICggKCAnRGF0ZScgKSApCiAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NDA0MDoyOiAoICggJ0RhdGUnICkgKQotICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo0MDQxOjM6ICggJ0RhdGUnICkKKyAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NDE5MzoyOiAoICggJ0RhdGUnICkgKQorICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo0MTk0OjM6ICggJ0RhdGUnICkKICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0UHJlZGVmaW5lZEJlYW5UeXBlRW51bUFjY2VzcygpLmdldERhdGVFbnVtTGl0ZXJhbERlY2xhcmF0aW9uXzAoKSk7IAogICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjQwNDI6MzogKCAnRGF0ZScgKQotICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo0MDQyOjQ6ICdEYXRlJworICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo0MTk1OjM6ICggJ0RhdGUnICkKKyAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NDE5NTo0OiAnRGF0ZScKICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICBtYXRjaChpbnB1dCw2MCxGT0xMT1dfMik7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CiAKQEAgLTE1MDI2LDE2ICsxNTU4MiwxNiBAQAogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgIGNhc2UgMiA6Ci0gICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjQwNDY6MjogKCAoICdNaWxsaXNlY29uZHMnICkgKQorICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo0MTk5OjI6ICggKCAnTWlsbGlzZWNvbmRzJyApICkKICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo0MDQ2OjI6ICggKCAnTWlsbGlzZWNvbmRzJyApICkKLSAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NDA0NzozOiAoICdNaWxsaXNlY29uZHMnICkKKyAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NDE5OToyOiAoICggJ01pbGxpc2Vjb25kcycgKSApCisgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjQyMDA6MzogKCAnTWlsbGlzZWNvbmRzJyApCiAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFByZWRlZmluZWRCZWFuVHlwZUVudW1BY2Nlc3MoKS5nZXRNaWxsaXNFbnVtTGl0ZXJhbERlY2xhcmF0aW9uXzEoKSk7IAogICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjQwNDg6MzogKCAnTWlsbGlzZWNvbmRzJyApCi0gICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjQwNDg6NDogJ01pbGxpc2Vjb25kcycKKyAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NDIwMTozOiAoICdNaWxsaXNlY29uZHMnICkKKyAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NDIwMTo0OiAnTWlsbGlzZWNvbmRzJwogICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgIG1hdGNoKGlucHV0LDYxLEZPTExPV18yKTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKIApAQCAtMTUwNTEsMTYgKzE1NjA3LDE2IEBACiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgY2FzZSAzIDoKLSAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NDA1MjoyOiAoICggJ05hbm9zZWNvbmRzJyApICkKKyAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NDIwNToyOiAoICggJ05hbm9zZWNvbmRzJyApICkKICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo0MDUyOjI6ICggKCAnTmFub3NlY29uZHMnICkgKQotICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo0MDUzOjM6ICggJ05hbm9zZWNvbmRzJyApCisgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjQyMDU6MjogKCAoICdOYW5vc2Vjb25kcycgKSApCisgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjQyMDY6MzogKCAnTmFub3NlY29uZHMnICkKICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0UHJlZGVmaW5lZEJlYW5UeXBlRW51bUFjY2VzcygpLmdldE5hbm9zRW51bUxpdGVyYWxEZWNsYXJhdGlvbl8yKCkpOyAKICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo0MDU0OjM6ICggJ05hbm9zZWNvbmRzJyApCi0gICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjQwNTQ6NDogJ05hbm9zZWNvbmRzJworICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo0MjA3OjM6ICggJ05hbm9zZWNvbmRzJyApCisgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjQyMDc6NDogJ05hbm9zZWNvbmRzJwogICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgIG1hdGNoKGlucHV0LDYyLEZPTExPV18yKTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKIApAQCAtMTUwNzYsMTYgKzE1NjMyLDE2IEBACiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgY2FzZSA0IDoKLSAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NDA1ODoyOiAoICggJ1JhbmRvbScgKSApCisgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjQyMTE6MjogKCAoICdSYW5kb20nICkgKQogICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjQwNTg6MjogKCAoICdSYW5kb20nICkgKQotICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo0MDU5OjM6ICggJ1JhbmRvbScgKQorICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo0MjExOjI6ICggKCAnUmFuZG9tJyApICkKKyAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NDIxMjozOiAoICdSYW5kb20nICkKICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0UHJlZGVmaW5lZEJlYW5UeXBlRW51bUFjY2VzcygpLmdldFJhbmRvbUVudW1MaXRlcmFsRGVjbGFyYXRpb25fMygpKTsgCiAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NDA2MDozOiAoICdSYW5kb20nICkKLSAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NDA2MDo0OiAnUmFuZG9tJworICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo0MjEzOjM6ICggJ1JhbmRvbScgKQorICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo0MjEzOjQ6ICdSYW5kb20nCiAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgbWF0Y2goaW5wdXQsNjMsRk9MTE9XXzIpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOwogCkBAIC0xNTEwMSwxNiArMTU2NTcsMTYgQEAKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICBjYXNlIDUgOgotICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo0MDY0OjI6ICggKCAnRXhlY3V0ZUNvbnRleHQnICkgKQorICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo0MjE3OjI6ICggKCAnRXhlY3V0ZUNvbnRleHQnICkgKQogICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjQwNjQ6MjogKCAoICdFeGVjdXRlQ29udGV4dCcgKSApCi0gICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjQwNjU6MzogKCAnRXhlY3V0ZUNvbnRleHQnICkKKyAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NDIxNzoyOiAoICggJ0V4ZWN1dGVDb250ZXh0JyApICkKKyAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NDIxODozOiAoICdFeGVjdXRlQ29udGV4dCcgKQogICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRQcmVkZWZpbmVkQmVhblR5cGVFbnVtQWNjZXNzKCkuZ2V0RXhlY0NvbnRleHRFbnVtTGl0ZXJhbERlY2xhcmF0aW9uXzQoKSk7IAogICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjQwNjY6MzogKCAnRXhlY3V0ZUNvbnRleHQnICkKLSAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NDA2Njo0OiAnRXhlY3V0ZUNvbnRleHQnCisgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjQyMTk6MzogKCAnRXhlY3V0ZUNvbnRleHQnICkKKyAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NDIxOTo0OiAnRXhlY3V0ZUNvbnRleHQnCiAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgbWF0Y2goaW5wdXQsNjQsRk9MTE9XXzIpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOwogCkBAIC0xNTE0Myw1MCArMTU2OTksNTAgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19FbnRpdHlNYW5hZ2VyTW9kZV9fQWx0ZXJuYXRpdmVzIgotICAgIC8vIEludGVybmFsRGF0YURTTC5nOjQwNzQ6MTogcnVsZV9fRW50aXR5TWFuYWdlck1vZGVfX0FsdGVybmF0aXZlcyA6ICggKCAoICdwZXJzaXN0JyApICkgfCAoICggJ21lcmdlJyApICkgfCAoICggJ3JlbW92ZScgKSApICk7CisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NDIyNzoxOiBydWxlX19FbnRpdHlNYW5hZ2VyTW9kZV9fQWx0ZXJuYXRpdmVzIDogKCAoICggJ3BlcnNpc3QnICkgKSB8ICggKCAnbWVyZ2UnICkgKSB8ICggKCAncmVtb3ZlJyApICkgKTsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19FbnRpdHlNYW5hZ2VyTW9kZV9fQWx0ZXJuYXRpdmVzKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjQwNzg6MTogKCAoICggJ3BlcnNpc3QnICkgKSB8ICggKCAnbWVyZ2UnICkgKSB8ICggKCAncmVtb3ZlJyApICkgKQotICAgICAgICAgICAgaW50IGFsdDUyPTM7CisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo0MjMxOjE6ICggKCAoICdwZXJzaXN0JyApICkgfCAoICggJ21lcmdlJyApICkgfCAoICggJ3JlbW92ZScgKSApICkKKyAgICAgICAgICAgIGludCBhbHQ1Mz0zOwogICAgICAgICAgICAgc3dpdGNoICggaW5wdXQuTEEoMSkgKSB7CiAgICAgICAgICAgICBjYXNlIDY1OgogICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBhbHQ1Mj0xOworICAgICAgICAgICAgICAgIGFsdDUzPTE7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgY2FzZSA2NjoKICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgYWx0NTI9MjsKKyAgICAgICAgICAgICAgICBhbHQ1Mz0yOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIGNhc2UgNjc6CiAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGFsdDUyPTM7CisgICAgICAgICAgICAgICAgYWx0NTM9MzsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgICAgIGlmIChzdGF0ZS5iYWNrdHJhY2tpbmc+MCkge3N0YXRlLmZhaWxlZD10cnVlOyByZXR1cm4gO30KICAgICAgICAgICAgICAgICBOb1ZpYWJsZUFsdEV4Y2VwdGlvbiBudmFlID0KLSAgICAgICAgICAgICAgICAgICAgbmV3IE5vVmlhYmxlQWx0RXhjZXB0aW9uKCIiLCA1MiwgMCwgaW5wdXQpOworICAgICAgICAgICAgICAgICAgICBuZXcgTm9WaWFibGVBbHRFeGNlcHRpb24oIiIsIDUzLCAwLCBpbnB1dCk7CiAKICAgICAgICAgICAgICAgICB0aHJvdyBudmFlOwogICAgICAgICAgICAgfQogCi0gICAgICAgICAgICBzd2l0Y2ggKGFsdDUyKSB7CisgICAgICAgICAgICBzd2l0Y2ggKGFsdDUzKSB7CiAgICAgICAgICAgICAgICAgY2FzZSAxIDoKLSAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NDA3OToyOiAoICggJ3BlcnNpc3QnICkgKQorICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo0MjMyOjI6ICggKCAncGVyc2lzdCcgKSApCiAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NDA3OToyOiAoICggJ3BlcnNpc3QnICkgKQotICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo0MDgwOjM6ICggJ3BlcnNpc3QnICkKKyAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NDIzMjoyOiAoICggJ3BlcnNpc3QnICkgKQorICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo0MjMzOjM6ICggJ3BlcnNpc3QnICkKICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0RW50aXR5TWFuYWdlck1vZGVBY2Nlc3MoKS5nZXRQZXJzaXN0RW51bUxpdGVyYWxEZWNsYXJhdGlvbl8wKCkpOyAKICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo0MDgxOjM6ICggJ3BlcnNpc3QnICkKLSAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NDA4MTo0OiAncGVyc2lzdCcKKyAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NDIzNDozOiAoICdwZXJzaXN0JyApCisgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjQyMzQ6NDogJ3BlcnNpc3QnCiAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgbWF0Y2goaW5wdXQsNjUsRk9MTE9XXzIpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOwogCkBAIC0xNTIwMiwxNiArMTU3NTgsMTYgQEAKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICBjYXNlIDIgOgotICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo0MDg1OjI6ICggKCAnbWVyZ2UnICkgKQorICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo0MjM4OjI6ICggKCAnbWVyZ2UnICkgKQogICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjQwODU6MjogKCAoICdtZXJnZScgKSApCi0gICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjQwODY6MzogKCAnbWVyZ2UnICkKKyAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NDIzODoyOiAoICggJ21lcmdlJyApICkKKyAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NDIzOTozOiAoICdtZXJnZScgKQogICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRFbnRpdHlNYW5hZ2VyTW9kZUFjY2VzcygpLmdldE1lcmdlRW51bUxpdGVyYWxEZWNsYXJhdGlvbl8xKCkpOyAKICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo0MDg3OjM6ICggJ21lcmdlJyApCi0gICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjQwODc6NDogJ21lcmdlJworICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo0MjQwOjM6ICggJ21lcmdlJyApCisgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjQyNDA6NDogJ21lcmdlJwogICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgIG1hdGNoKGlucHV0LDY2LEZPTExPV18yKTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKIApAQCAtMTUyMjcsMTYgKzE1NzgzLDE2IEBACiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgY2FzZSAzIDoKLSAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NDA5MToyOiAoICggJ3JlbW92ZScgKSApCisgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjQyNDQ6MjogKCAoICdyZW1vdmUnICkgKQogICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjQwOTE6MjogKCAoICdyZW1vdmUnICkgKQotICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo0MDkyOjM6ICggJ3JlbW92ZScgKQorICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo0MjQ0OjI6ICggKCAncmVtb3ZlJyApICkKKyAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NDI0NTozOiAoICdyZW1vdmUnICkKICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0RW50aXR5TWFuYWdlck1vZGVBY2Nlc3MoKS5nZXRSZW1vdmVFbnVtTGl0ZXJhbERlY2xhcmF0aW9uXzIoKSk7IAogICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjQwOTM6MzogKCAncmVtb3ZlJyApCi0gICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjQwOTM6NDogJ3JlbW92ZScKKyAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NDI0NjozOiAoICdyZW1vdmUnICkKKyAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NDI0Njo0OiAncmVtb3ZlJwogICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgIG1hdGNoKGlucHV0LDY3LEZPTExPV18yKTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKIApAQCAtMTUyNjgsMTUgKzE1ODI0LDM4MyBAQAogICAgIC8vICRBTlRMUiBlbmQgInJ1bGVfX0VudGl0eU1hbmFnZXJNb2RlX19BbHRlcm5hdGl2ZXMiCiAKIAorICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fQ29uZGl0aW9uQW5kT3BlcmF0b3IxX19BbHRlcm5hdGl2ZXMiCisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NDI1NDoxOiBydWxlX19Db25kaXRpb25BbmRPcGVyYXRvcjFfX0FsdGVybmF0aXZlcyA6ICggKCAoICc9JyApICkgfCAoICggJyE9JyApICkgfCAoICggJz4nICkgKSB8ICggKCAnPj0nICkgKSB8ICggKCAnPCcgKSApIHwgKCAoICc8PScgKSApIHwgKCAoICdpc251bGwnICkgKSB8ICggKCAnaXNub3RudWxsJyApICkgKTsKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19Db25kaXRpb25BbmRPcGVyYXRvcjFfX0FsdGVybmF0aXZlcygpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisKKyAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgICAgICAJCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo0MjU4OjE6ICggKCAoICc9JyApICkgfCAoICggJyE9JyApICkgfCAoICggJz4nICkgKSB8ICggKCAnPj0nICkgKSB8ICggKCAnPCcgKSApIHwgKCAoICc8PScgKSApIHwgKCAoICdpc251bGwnICkgKSB8ICggKCAnaXNub3RudWxsJyApICkgKQorICAgICAgICAgICAgaW50IGFsdDU0PTg7CisgICAgICAgICAgICBzd2l0Y2ggKCBpbnB1dC5MQSgxKSApIHsKKyAgICAgICAgICAgIGNhc2UgMTM6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGFsdDU0PTE7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAyMjoKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYWx0NTQ9MjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDI2OgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBhbHQ1ND0zOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMjU6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGFsdDU0PTQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAyNzoKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYWx0NTQ9NTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDY4OgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBhbHQ1ND02OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgNjk6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGFsdDU0PTc7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSA3MDoKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYWx0NTQ9ODsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIGlmIChzdGF0ZS5iYWNrdHJhY2tpbmc+MCkge3N0YXRlLmZhaWxlZD10cnVlOyByZXR1cm4gO30KKyAgICAgICAgICAgICAgICBOb1ZpYWJsZUFsdEV4Y2VwdGlvbiBudmFlID0KKyAgICAgICAgICAgICAgICAgICAgbmV3IE5vVmlhYmxlQWx0RXhjZXB0aW9uKCIiLCA1NCwgMCwgaW5wdXQpOworCisgICAgICAgICAgICAgICAgdGhyb3cgbnZhZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3dpdGNoIChhbHQ1NCkgeworICAgICAgICAgICAgICAgIGNhc2UgMSA6CisgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjQyNTk6MjogKCAoICc9JyApICkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo0MjU5OjI6ICggKCAnPScgKSApCisgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjQyNjA6MzogKCAnPScgKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRDb25kaXRpb25BbmRPcGVyYXRvcjFBY2Nlc3MoKS5nZXRFcXVhbHNFbnVtTGl0ZXJhbERlY2xhcmF0aW9uXzAoKSk7IAorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjQyNjE6MzogKCAnPScgKQorICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo0MjYxOjQ6ICc9JworICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIG1hdGNoKGlucHV0LDEzLEZPTExPV18yKTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKKworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICAgICAgICAgIGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0Q29uZGl0aW9uQW5kT3BlcmF0b3IxQWNjZXNzKCkuZ2V0RXF1YWxzRW51bUxpdGVyYWxEZWNsYXJhdGlvbl8wKCkpOyAKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSAyIDoKKyAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NDI2NToyOiAoICggJyE9JyApICkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo0MjY1OjI6ICggKCAnIT0nICkgKQorICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo0MjY2OjM6ICggJyE9JyApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldENvbmRpdGlvbkFuZE9wZXJhdG9yMUFjY2VzcygpLmdldE5vdGVxdWFsc0VudW1MaXRlcmFsRGVjbGFyYXRpb25fMSgpKTsgCisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NDI2NzozOiAoICchPScgKQorICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo0MjY3OjQ6ICchPScKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBtYXRjaChpbnB1dCwyMixGT0xMT1dfMik7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CisKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgICAgICAgICBhZnRlcihncmFtbWFyQWNjZXNzLmdldENvbmRpdGlvbkFuZE9wZXJhdG9yMUFjY2VzcygpLmdldE5vdGVxdWFsc0VudW1MaXRlcmFsRGVjbGFyYXRpb25fMSgpKTsgCisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgMyA6CisgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjQyNzE6MjogKCAoICc+JyApICkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo0MjcxOjI6ICggKCAnPicgKSApCisgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjQyNzI6MzogKCAnPicgKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRDb25kaXRpb25BbmRPcGVyYXRvcjFBY2Nlc3MoKS5nZXRHcmVhdGVydGhlbkVudW1MaXRlcmFsRGVjbGFyYXRpb25fMigpKTsgCisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NDI3MzozOiAoICc+JyApCisgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjQyNzM6NDogJz4nCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgbWF0Y2goaW5wdXQsMjYsRk9MTE9XXzIpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOworCisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRDb25kaXRpb25BbmRPcGVyYXRvcjFBY2Nlc3MoKS5nZXRHcmVhdGVydGhlbkVudW1MaXRlcmFsRGVjbGFyYXRpb25fMigpKTsgCisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgNCA6CisgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjQyNzc6MjogKCAoICc+PScgKSApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NDI3NzoyOiAoICggJz49JyApICkKKyAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NDI3ODozOiAoICc+PScgKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRDb25kaXRpb25BbmRPcGVyYXRvcjFBY2Nlc3MoKS5nZXRHcmVhdGVydGhlbm9yZXF1YWx0b0VudW1MaXRlcmFsRGVjbGFyYXRpb25fMygpKTsgCisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NDI3OTozOiAoICc+PScgKQorICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo0Mjc5OjQ6ICc+PScKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBtYXRjaChpbnB1dCwyNSxGT0xMT1dfMik7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CisKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgICAgICAgICBhZnRlcihncmFtbWFyQWNjZXNzLmdldENvbmRpdGlvbkFuZE9wZXJhdG9yMUFjY2VzcygpLmdldEdyZWF0ZXJ0aGVub3JlcXVhbHRvRW51bUxpdGVyYWxEZWNsYXJhdGlvbl8zKCkpOyAKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSA1IDoKKyAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NDI4MzoyOiAoICggJzwnICkgKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjQyODM6MjogKCAoICc8JyApICkKKyAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NDI4NDozOiAoICc8JyApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldENvbmRpdGlvbkFuZE9wZXJhdG9yMUFjY2VzcygpLmdldExlc3N0aGVuRW51bUxpdGVyYWxEZWNsYXJhdGlvbl80KCkpOyAKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo0Mjg1OjM6ICggJzwnICkKKyAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NDI4NTo0OiAnPCcKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBtYXRjaChpbnB1dCwyNyxGT0xMT1dfMik7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CisKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgICAgICAgICBhZnRlcihncmFtbWFyQWNjZXNzLmdldENvbmRpdGlvbkFuZE9wZXJhdG9yMUFjY2VzcygpLmdldExlc3N0aGVuRW51bUxpdGVyYWxEZWNsYXJhdGlvbl80KCkpOyAKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSA2IDoKKyAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NDI4OToyOiAoICggJzw9JyApICkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo0Mjg5OjI6ICggKCAnPD0nICkgKQorICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo0MjkwOjM6ICggJzw9JyApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldENvbmRpdGlvbkFuZE9wZXJhdG9yMUFjY2VzcygpLmdldExlc3N0aGVub3JlcXVhbHRvRW51bUxpdGVyYWxEZWNsYXJhdGlvbl81KCkpOyAKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo0MjkxOjM6ICggJzw9JyApCisgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjQyOTE6NDogJzw9JworICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIG1hdGNoKGlucHV0LDY4LEZPTExPV18yKTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKKworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICAgICAgICAgIGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0Q29uZGl0aW9uQW5kT3BlcmF0b3IxQWNjZXNzKCkuZ2V0TGVzc3RoZW5vcmVxdWFsdG9FbnVtTGl0ZXJhbERlY2xhcmF0aW9uXzUoKSk7IAorICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIDcgOgorICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo0Mjk1OjI6ICggKCAnaXNudWxsJyApICkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo0Mjk1OjI6ICggKCAnaXNudWxsJyApICkKKyAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NDI5NjozOiAoICdpc251bGwnICkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0Q29uZGl0aW9uQW5kT3BlcmF0b3IxQWNjZXNzKCkuZ2V0SXNudWxsRW51bUxpdGVyYWxEZWNsYXJhdGlvbl82KCkpOyAKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo0Mjk3OjM6ICggJ2lzbnVsbCcgKQorICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo0Mjk3OjQ6ICdpc251bGwnCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgbWF0Y2goaW5wdXQsNjksRk9MTE9XXzIpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOworCisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRDb25kaXRpb25BbmRPcGVyYXRvcjFBY2Nlc3MoKS5nZXRJc251bGxFbnVtTGl0ZXJhbERlY2xhcmF0aW9uXzYoKSk7IAorICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIDggOgorICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo0MzAxOjI6ICggKCAnaXNub3RudWxsJyApICkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo0MzAxOjI6ICggKCAnaXNub3RudWxsJyApICkKKyAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NDMwMjozOiAoICdpc25vdG51bGwnICkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0Q29uZGl0aW9uQW5kT3BlcmF0b3IxQWNjZXNzKCkuZ2V0SXNub3RudWxsRW51bUxpdGVyYWxEZWNsYXJhdGlvbl83KCkpOyAKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo0MzAzOjM6ICggJ2lzbm90bnVsbCcgKQorICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo0MzAzOjQ6ICdpc25vdG51bGwnCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgbWF0Y2goaW5wdXQsNzAsRk9MTE9XXzIpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOworCisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRDb25kaXRpb25BbmRPcGVyYXRvcjFBY2Nlc3MoKS5nZXRJc25vdG51bGxFbnVtTGl0ZXJhbERlY2xhcmF0aW9uXzcoKSk7IAorICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGNhdGNoIChSZWNvZ25pdGlvbkV4Y2VwdGlvbiByZSkgeworICAgICAgICAgICAgcmVwb3J0RXJyb3IocmUpOworICAgICAgICAgICAgcmVjb3ZlcihpbnB1dCxyZSk7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisKKyAgICAgICAgICAgIAlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7CisKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gOworICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJydWxlX19Db25kaXRpb25BbmRPcGVyYXRvcjFfX0FsdGVybmF0aXZlcyIKKworCisgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19Db25kaXRpb25BbmRPcGVyYXRvcjJfX0FsdGVybmF0aXZlcyIKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo0MzExOjE6IHJ1bGVfX0NvbmRpdGlvbkFuZE9wZXJhdG9yMl9fQWx0ZXJuYXRpdmVzIDogKCAoICggJ2FuZCcgKSApIHwgKCAoICdvcicgKSApICk7CisgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fQ29uZGl0aW9uQW5kT3BlcmF0b3IyX19BbHRlcm5hdGl2ZXMoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworCisgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICAgICAgCQorICAgICAgICB0cnkgeworICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NDMxNToxOiAoICggKCAnYW5kJyApICkgfCAoICggJ29yJyApICkgKQorICAgICAgICAgICAgaW50IGFsdDU1PTI7CisgICAgICAgICAgICBpbnQgTEE1NV8wID0gaW5wdXQuTEEoMSk7CisKKyAgICAgICAgICAgIGlmICggKExBNTVfMD09NzEpICkgeworICAgICAgICAgICAgICAgIGFsdDU1PTE7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmICggKExBNTVfMD09NzIpICkgeworICAgICAgICAgICAgICAgIGFsdDU1PTI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICBpZiAoc3RhdGUuYmFja3RyYWNraW5nPjApIHtzdGF0ZS5mYWlsZWQ9dHJ1ZTsgcmV0dXJuIDt9CisgICAgICAgICAgICAgICAgTm9WaWFibGVBbHRFeGNlcHRpb24gbnZhZSA9CisgICAgICAgICAgICAgICAgICAgIG5ldyBOb1ZpYWJsZUFsdEV4Y2VwdGlvbigiIiwgNTUsIDAsIGlucHV0KTsKKworICAgICAgICAgICAgICAgIHRocm93IG52YWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzd2l0Y2ggKGFsdDU1KSB7CisgICAgICAgICAgICAgICAgY2FzZSAxIDoKKyAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NDMxNjoyOiAoICggJ2FuZCcgKSApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NDMxNjoyOiAoICggJ2FuZCcgKSApCisgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjQzMTc6MzogKCAnYW5kJyApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldENvbmRpdGlvbkFuZE9wZXJhdG9yMkFjY2VzcygpLmdldEFuZEVudW1MaXRlcmFsRGVjbGFyYXRpb25fMCgpKTsgCisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NDMxODozOiAoICdhbmQnICkKKyAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NDMxODo0OiAnYW5kJworICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIG1hdGNoKGlucHV0LDcxLEZPTExPV18yKTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKKworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICAgICAgICAgIGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0Q29uZGl0aW9uQW5kT3BlcmF0b3IyQWNjZXNzKCkuZ2V0QW5kRW51bUxpdGVyYWxEZWNsYXJhdGlvbl8wKCkpOyAKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSAyIDoKKyAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NDMyMjoyOiAoICggJ29yJyApICkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo0MzIyOjI6ICggKCAnb3InICkgKQorICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo0MzIzOjM6ICggJ29yJyApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldENvbmRpdGlvbkFuZE9wZXJhdG9yMkFjY2VzcygpLmdldE9yRW51bUxpdGVyYWxEZWNsYXJhdGlvbl8xKCkpOyAKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo0MzI0OjM6ICggJ29yJyApCisgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjQzMjQ6NDogJ29yJworICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIG1hdGNoKGlucHV0LDcyLEZPTExPV18yKTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKKworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICAgICAgICAgIGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0Q29uZGl0aW9uQW5kT3BlcmF0b3IyQWNjZXNzKCkuZ2V0T3JFbnVtTGl0ZXJhbERlY2xhcmF0aW9uXzEoKSk7IAorICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGNhdGNoIChSZWNvZ25pdGlvbkV4Y2VwdGlvbiByZSkgeworICAgICAgICAgICAgcmVwb3J0RXJyb3IocmUpOworICAgICAgICAgICAgcmVjb3ZlcihpbnB1dCxyZSk7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisKKyAgICAgICAgICAgIAlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7CisKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gOworICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJydWxlX19Db25kaXRpb25BbmRPcGVyYXRvcjJfX0FsdGVybmF0aXZlcyIKKworCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19EYXRhSW50ZXJjaGFuZ2VNb2RlbF9fR3JvdXBfXzAiCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NDEwMToxOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VNb2RlbF9fR3JvdXBfXzAgOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VNb2RlbF9fR3JvdXBfXzBfX0ltcGwgcnVsZV9fRGF0YUludGVyY2hhbmdlTW9kZWxfX0dyb3VwX18xIDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo0MzMyOjE6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZU1vZGVsX19Hcm91cF9fMCA6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZU1vZGVsX19Hcm91cF9fMF9fSW1wbCBydWxlX19EYXRhSW50ZXJjaGFuZ2VNb2RlbF9fR3JvdXBfXzEgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZU1vZGVsX19Hcm91cF9fMCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo0MTA1OjE6ICggcnVsZV9fRGF0YUludGVyY2hhbmdlTW9kZWxfX0dyb3VwX18wX19JbXBsIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZU1vZGVsX19Hcm91cF9fMSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo0MTA2OjI6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZU1vZGVsX19Hcm91cF9fMF9fSW1wbCBydWxlX19EYXRhSW50ZXJjaGFuZ2VNb2RlbF9fR3JvdXBfXzEKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjQzMzY6MTogKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VNb2RlbF9fR3JvdXBfXzBfX0ltcGwgcnVsZV9fRGF0YUludGVyY2hhbmdlTW9kZWxfX0dyb3VwX18xICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjQzMzc6MjogcnVsZV9fRGF0YUludGVyY2hhbmdlTW9kZWxfX0dyb3VwX18wX19JbXBsIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZU1vZGVsX19Hcm91cF9fMQogICAgICAgICAgICAgewogICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfNSk7CiAgICAgICAgICAgICBydWxlX19EYXRhSW50ZXJjaGFuZ2VNb2RlbF9fR3JvdXBfXzBfX0ltcGwoKTsKQEAgLTE1MzA3LDMxICsxNjIzMSwzMSBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX0RhdGFJbnRlcmNoYW5nZU1vZGVsX19Hcm91cF9fMF9fSW1wbCIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo0MTEzOjE6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZU1vZGVsX19Hcm91cF9fMF9fSW1wbCA6ICggKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VNb2RlbF9fSW1wb3J0U2VjdGlvbkFzc2lnbm1lbnRfMCApPyApIDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo0MzQ0OjE6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZU1vZGVsX19Hcm91cF9fMF9fSW1wbCA6ICggKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VNb2RlbF9fSW1wb3J0U2VjdGlvbkFzc2lnbm1lbnRfMCApPyApIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19EYXRhSW50ZXJjaGFuZ2VNb2RlbF9fR3JvdXBfXzBfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NDExNzoxOiAoICggKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VNb2RlbF9fSW1wb3J0U2VjdGlvbkFzc2lnbm1lbnRfMCApPyApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjQxMTg6MTogKCAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZU1vZGVsX19JbXBvcnRTZWN0aW9uQXNzaWdubWVudF8wICk/ICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjQzNDg6MTogKCAoICggcnVsZV9fRGF0YUludGVyY2hhbmdlTW9kZWxfX0ltcG9ydFNlY3Rpb25Bc3NpZ25tZW50XzAgKT8gKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo0MzQ5OjE6ICggKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VNb2RlbF9fSW1wb3J0U2VjdGlvbkFzc2lnbm1lbnRfMCApPyApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo0MTE4OjE6ICggKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VNb2RlbF9fSW1wb3J0U2VjdGlvbkFzc2lnbm1lbnRfMCApPyApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo0MTE5OjI6ICggcnVsZV9fRGF0YUludGVyY2hhbmdlTW9kZWxfX0ltcG9ydFNlY3Rpb25Bc3NpZ25tZW50XzAgKT8KKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjQzNDk6MTogKCAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZU1vZGVsX19JbXBvcnRTZWN0aW9uQXNzaWdubWVudF8wICk/ICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjQzNTA6MjogKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VNb2RlbF9fSW1wb3J0U2VjdGlvbkFzc2lnbm1lbnRfMCApPwogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXREYXRhSW50ZXJjaGFuZ2VNb2RlbEFjY2VzcygpLmdldEltcG9ydFNlY3Rpb25Bc3NpZ25tZW50XzAoKSk7IAogICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NDEyMDoyOiAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZU1vZGVsX19JbXBvcnRTZWN0aW9uQXNzaWdubWVudF8wICk/Ci0gICAgICAgICAgICBpbnQgYWx0NTM9MjsKLSAgICAgICAgICAgIGludCBMQTUzXzAgPSBpbnB1dC5MQSgxKTsKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjQzNTE6MjogKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VNb2RlbF9fSW1wb3J0U2VjdGlvbkFzc2lnbm1lbnRfMCApPworICAgICAgICAgICAgaW50IGFsdDU2PTI7CisgICAgICAgICAgICBpbnQgTEE1Nl8wID0gaW5wdXQuTEEoMSk7CiAKLSAgICAgICAgICAgIGlmICggKExBNTNfMD09NDcpICkgewotICAgICAgICAgICAgICAgIGFsdDUzPTE7CisgICAgICAgICAgICBpZiAoIChMQTU2XzA9PTQ3KSApIHsKKyAgICAgICAgICAgICAgICBhbHQ1Nj0xOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgc3dpdGNoIChhbHQ1MykgeworICAgICAgICAgICAgc3dpdGNoIChhbHQ1NikgewogICAgICAgICAgICAgICAgIGNhc2UgMSA6Ci0gICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjQxMjA6MzogcnVsZV9fRGF0YUludGVyY2hhbmdlTW9kZWxfX0ltcG9ydFNlY3Rpb25Bc3NpZ25tZW50XzAKKyAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NDM1MTozOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VNb2RlbF9fSW1wb3J0U2VjdGlvbkFzc2lnbm1lbnRfMAogICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzIpOwogICAgICAgICAgICAgICAgICAgICBydWxlX19EYXRhSW50ZXJjaGFuZ2VNb2RlbF9fSW1wb3J0U2VjdGlvbkFzc2lnbm1lbnRfMCgpOwpAQCAtMTUzNjksMTQgKzE2MjkzLDE0IEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fRGF0YUludGVyY2hhbmdlTW9kZWxfX0dyb3VwX18xIgotICAgIC8vIEludGVybmFsRGF0YURTTC5nOjQxMjg6MTogcnVsZV9fRGF0YUludGVyY2hhbmdlTW9kZWxfX0dyb3VwX18xIDogcnVsZV9fRGF0YUludGVyY2hhbmdlTW9kZWxfX0dyb3VwX18xX19JbXBsIDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo0MzU5OjE6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZU1vZGVsX19Hcm91cF9fMSA6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZU1vZGVsX19Hcm91cF9fMV9fSW1wbCA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fRGF0YUludGVyY2hhbmdlTW9kZWxfX0dyb3VwX18xKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjQxMzI6MTogKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VNb2RlbF9fR3JvdXBfXzFfX0ltcGwgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NDEzMzoyOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VNb2RlbF9fR3JvdXBfXzFfX0ltcGwKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjQzNjM6MTogKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VNb2RlbF9fR3JvdXBfXzFfX0ltcGwgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NDM2NDoyOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VNb2RlbF9fR3JvdXBfXzFfX0ltcGwKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzIpOwogICAgICAgICAgICAgcnVsZV9fRGF0YUludGVyY2hhbmdlTW9kZWxfX0dyb3VwX18xX19JbXBsKCk7CkBAIC0xNTQwMiwzNSArMTYzMjYsMzUgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19EYXRhSW50ZXJjaGFuZ2VNb2RlbF9fR3JvdXBfXzFfX0ltcGwiCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NDEzOToxOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VNb2RlbF9fR3JvdXBfXzFfX0ltcGwgOiAoICggcnVsZV9fRGF0YUludGVyY2hhbmdlTW9kZWxfX1BhY2thZ2VzQXNzaWdubWVudF8xICkqICkgOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjQzNzA6MTogcnVsZV9fRGF0YUludGVyY2hhbmdlTW9kZWxfX0dyb3VwX18xX19JbXBsIDogKCAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZU1vZGVsX19QYWNrYWdlc0Fzc2lnbm1lbnRfMSApKiApIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19EYXRhSW50ZXJjaGFuZ2VNb2RlbF9fR3JvdXBfXzFfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NDE0MzoxOiAoICggKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VNb2RlbF9fUGFja2FnZXNBc3NpZ25tZW50XzEgKSogKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo0MTQ0OjE6ICggKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VNb2RlbF9fUGFja2FnZXNBc3NpZ25tZW50XzEgKSogKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NDM3NDoxOiAoICggKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VNb2RlbF9fUGFja2FnZXNBc3NpZ25tZW50XzEgKSogKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo0Mzc1OjE6ICggKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VNb2RlbF9fUGFja2FnZXNBc3NpZ25tZW50XzEgKSogKQogICAgICAgICAgICAgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NDE0NDoxOiAoICggcnVsZV9fRGF0YUludGVyY2hhbmdlTW9kZWxfX1BhY2thZ2VzQXNzaWdubWVudF8xICkqICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjQxNDU6MjogKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VNb2RlbF9fUGFja2FnZXNBc3NpZ25tZW50XzEgKSoKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjQzNzU6MTogKCAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZU1vZGVsX19QYWNrYWdlc0Fzc2lnbm1lbnRfMSApKiApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo0Mzc2OjI6ICggcnVsZV9fRGF0YUludGVyY2hhbmdlTW9kZWxfX1BhY2thZ2VzQXNzaWdubWVudF8xICkqCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldERhdGFJbnRlcmNoYW5nZU1vZGVsQWNjZXNzKCkuZ2V0UGFja2FnZXNBc3NpZ25tZW50XzEoKSk7IAogICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NDE0NjoyOiAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZU1vZGVsX19QYWNrYWdlc0Fzc2lnbm1lbnRfMSApKgotICAgICAgICAgICAgbG9vcDU0OgorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NDM3NzoyOiAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZU1vZGVsX19QYWNrYWdlc0Fzc2lnbm1lbnRfMSApKgorICAgICAgICAgICAgbG9vcDU3OgogICAgICAgICAgICAgZG8gewotICAgICAgICAgICAgICAgIGludCBhbHQ1ND0yOwotICAgICAgICAgICAgICAgIGludCBMQTU0XzAgPSBpbnB1dC5MQSgxKTsKKyAgICAgICAgICAgICAgICBpbnQgYWx0NTc9MjsKKyAgICAgICAgICAgICAgICBpbnQgTEE1N18wID0gaW5wdXQuTEEoMSk7CiAKLSAgICAgICAgICAgICAgICBpZiAoIChMQTU0XzA9PTY4KSApIHsKLSAgICAgICAgICAgICAgICAgICAgYWx0NTQ9MTsKKyAgICAgICAgICAgICAgICBpZiAoIChMQTU3XzA9PTczKSApIHsKKyAgICAgICAgICAgICAgICAgICAgYWx0NTc9MTsKICAgICAgICAgICAgICAgICB9CiAKIAotICAgICAgICAgICAgICAgIHN3aXRjaCAoYWx0NTQpIHsKKyAgICAgICAgICAgICAgICBzd2l0Y2ggKGFsdDU3KSB7CiAgICAgICAgICAgICAJY2FzZSAxIDoKLSAgICAgICAgICAgIAkgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NDE0NjozOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VNb2RlbF9fUGFja2FnZXNBc3NpZ25tZW50XzEKKyAgICAgICAgICAgIAkgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NDM3NzozOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VNb2RlbF9fUGFja2FnZXNBc3NpZ25tZW50XzEKICAgICAgICAgICAgIAkgICAgewogICAgICAgICAgICAgCSAgICBwdXNoRm9sbG93KEZPTExPV182KTsKICAgICAgICAgICAgIAkgICAgcnVsZV9fRGF0YUludGVyY2hhbmdlTW9kZWxfX1BhY2thZ2VzQXNzaWdubWVudF8xKCk7CkBAIC0xNTQ0Miw3ICsxNjM2Niw3IEBACiAgICAgICAgICAgICAJICAgIGJyZWFrOwogCiAgICAgICAgICAgICAJZGVmYXVsdCA6Ci0gICAgICAgICAgICAJICAgIGJyZWFrIGxvb3A1NDsKKyAgICAgICAgICAgIAkgICAgYnJlYWsgbG9vcDU3OwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0gd2hpbGUgKHRydWUpOwogCkBAIC0xNTQ3MSwxNCArMTYzOTUsMTQgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19EYXRhSW50ZXJjaGFuZ2VQYWNrYWdlX19Hcm91cF9fMCIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo0MTU1OjE6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZVBhY2thZ2VfX0dyb3VwX18wIDogcnVsZV9fRGF0YUludGVyY2hhbmdlUGFja2FnZV9fR3JvdXBfXzBfX0ltcGwgcnVsZV9fRGF0YUludGVyY2hhbmdlUGFja2FnZV9fR3JvdXBfXzEgOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjQzODY6MTogcnVsZV9fRGF0YUludGVyY2hhbmdlUGFja2FnZV9fR3JvdXBfXzAgOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VQYWNrYWdlX19Hcm91cF9fMF9fSW1wbCBydWxlX19EYXRhSW50ZXJjaGFuZ2VQYWNrYWdlX19Hcm91cF9fMSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fRGF0YUludGVyY2hhbmdlUGFja2FnZV9fR3JvdXBfXzAoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NDE1OToxOiAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZVBhY2thZ2VfX0dyb3VwX18wX19JbXBsIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZVBhY2thZ2VfX0dyb3VwX18xICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjQxNjA6MjogcnVsZV9fRGF0YUludGVyY2hhbmdlUGFja2FnZV9fR3JvdXBfXzBfX0ltcGwgcnVsZV9fRGF0YUludGVyY2hhbmdlUGFja2FnZV9fR3JvdXBfXzEKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjQzOTA6MTogKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VQYWNrYWdlX19Hcm91cF9fMF9fSW1wbCBydWxlX19EYXRhSW50ZXJjaGFuZ2VQYWNrYWdlX19Hcm91cF9fMSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo0MzkxOjI6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZVBhY2thZ2VfX0dyb3VwX18wX19JbXBsIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZVBhY2thZ2VfX0dyb3VwX18xCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV181KTsKICAgICAgICAgICAgIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZVBhY2thZ2VfX0dyb3VwX18wX19JbXBsKCk7CkBAIC0xNTUwOSwyMyArMTY0MzMsMjMgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19EYXRhSW50ZXJjaGFuZ2VQYWNrYWdlX19Hcm91cF9fMF9fSW1wbCIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo0MTY3OjE6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZVBhY2thZ2VfX0dyb3VwX18wX19JbXBsIDogKCAoKSApIDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo0Mzk4OjE6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZVBhY2thZ2VfX0dyb3VwX18wX19JbXBsIDogKCAoKSApIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19EYXRhSW50ZXJjaGFuZ2VQYWNrYWdlX19Hcm91cF9fMF9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo0MTcxOjE6ICggKCAoKSApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjQxNzI6MTogKCAoKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo0NDAyOjE6ICggKCAoKSApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjQ0MDM6MTogKCAoKSApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo0MTcyOjE6ICggKCkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NDE3MzoyOiAoKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NDQwMzoxOiAoICgpICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjQ0MDQ6MjogKCkKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YUludGVyY2hhbmdlUGFja2FnZUFjY2VzcygpLmdldERhdGFJbnRlcmNoYW5nZVBhY2thZ2VBY3Rpb25fMCgpKTsgCiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo0MTc0OjI6ICgpCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo0MTc0OjM6IAorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NDQwNToyOiAoKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NDQwNTozOiAKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIH0KIApAQCAtMTU1NTAsMTQgKzE2NDc0LDE0IEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fRGF0YUludGVyY2hhbmdlUGFja2FnZV9fR3JvdXBfXzEiCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NDE4MjoxOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VQYWNrYWdlX19Hcm91cF9fMSA6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZVBhY2thZ2VfX0dyb3VwX18xX19JbXBsIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZVBhY2thZ2VfX0dyb3VwX18yIDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo0NDEzOjE6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZVBhY2thZ2VfX0dyb3VwX18xIDogcnVsZV9fRGF0YUludGVyY2hhbmdlUGFja2FnZV9fR3JvdXBfXzFfX0ltcGwgcnVsZV9fRGF0YUludGVyY2hhbmdlUGFja2FnZV9fR3JvdXBfXzIgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZVBhY2thZ2VfX0dyb3VwX18xKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjQxODY6MTogKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VQYWNrYWdlX19Hcm91cF9fMV9fSW1wbCBydWxlX19EYXRhSW50ZXJjaGFuZ2VQYWNrYWdlX19Hcm91cF9fMiApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo0MTg3OjI6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZVBhY2thZ2VfX0dyb3VwX18xX19JbXBsIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZVBhY2thZ2VfX0dyb3VwX18yCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo0NDE3OjE6ICggcnVsZV9fRGF0YUludGVyY2hhbmdlUGFja2FnZV9fR3JvdXBfXzFfX0ltcGwgcnVsZV9fRGF0YUludGVyY2hhbmdlUGFja2FnZV9fR3JvdXBfXzIgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NDQxODoyOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VQYWNrYWdlX19Hcm91cF9fMV9fSW1wbCBydWxlX19EYXRhSW50ZXJjaGFuZ2VQYWNrYWdlX19Hcm91cF9fMgogICAgICAgICAgICAgewogICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfNyk7CiAgICAgICAgICAgICBydWxlX19EYXRhSW50ZXJjaGFuZ2VQYWNrYWdlX19Hcm91cF9fMV9fSW1wbCgpOwpAQCAtMTU1ODgsMjIgKzE2NTEyLDIyIEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fRGF0YUludGVyY2hhbmdlUGFja2FnZV9fR3JvdXBfXzFfX0ltcGwiCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NDE5NDoxOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VQYWNrYWdlX19Hcm91cF9fMV9fSW1wbCA6ICggJ3BhY2thZ2UnICkgOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjQ0MjU6MTogcnVsZV9fRGF0YUludGVyY2hhbmdlUGFja2FnZV9fR3JvdXBfXzFfX0ltcGwgOiAoICdwYWNrYWdlJyApIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19EYXRhSW50ZXJjaGFuZ2VQYWNrYWdlX19Hcm91cF9fMV9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo0MTk4OjE6ICggKCAncGFja2FnZScgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo0MTk5OjE6ICggJ3BhY2thZ2UnICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjQ0Mjk6MTogKCAoICdwYWNrYWdlJyApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjQ0MzA6MTogKCAncGFja2FnZScgKQogICAgICAgICAgICAgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NDE5OToxOiAoICdwYWNrYWdlJyApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo0MjAwOjI6ICdwYWNrYWdlJworICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NDQzMDoxOiAoICdwYWNrYWdlJyApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo0NDMxOjI6ICdwYWNrYWdlJwogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXREYXRhSW50ZXJjaGFuZ2VQYWNrYWdlQWNjZXNzKCkuZ2V0UGFja2FnZUtleXdvcmRfMSgpKTsgCiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBtYXRjaChpbnB1dCw2OCxGT0xMT1dfMik7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CisgICAgICAgICAgICBtYXRjaChpbnB1dCw3MyxGT0xMT1dfMik7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YUludGVyY2hhbmdlUGFja2FnZUFjY2VzcygpLmdldFBhY2thZ2VLZXl3b3JkXzEoKSk7IAogICAgICAgICAgICAgfQpAQCAtMTU2MjksMTQgKzE2NTUzLDE0IEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fRGF0YUludGVyY2hhbmdlUGFja2FnZV9fR3JvdXBfXzIiCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NDIwOToxOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VQYWNrYWdlX19Hcm91cF9fMiA6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZVBhY2thZ2VfX0dyb3VwX18yX19JbXBsIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZVBhY2thZ2VfX0dyb3VwX18zIDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo0NDQwOjE6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZVBhY2thZ2VfX0dyb3VwX18yIDogcnVsZV9fRGF0YUludGVyY2hhbmdlUGFja2FnZV9fR3JvdXBfXzJfX0ltcGwgcnVsZV9fRGF0YUludGVyY2hhbmdlUGFja2FnZV9fR3JvdXBfXzMgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZVBhY2thZ2VfX0dyb3VwX18yKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjQyMTM6MTogKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VQYWNrYWdlX19Hcm91cF9fMl9fSW1wbCBydWxlX19EYXRhSW50ZXJjaGFuZ2VQYWNrYWdlX19Hcm91cF9fMyApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo0MjE0OjI6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZVBhY2thZ2VfX0dyb3VwX18yX19JbXBsIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZVBhY2thZ2VfX0dyb3VwX18zCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo0NDQ0OjE6ICggcnVsZV9fRGF0YUludGVyY2hhbmdlUGFja2FnZV9fR3JvdXBfXzJfX0ltcGwgcnVsZV9fRGF0YUludGVyY2hhbmdlUGFja2FnZV9fR3JvdXBfXzMgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NDQ0NToyOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VQYWNrYWdlX19Hcm91cF9fMl9fSW1wbCBydWxlX19EYXRhSW50ZXJjaGFuZ2VQYWNrYWdlX19Hcm91cF9fMwogICAgICAgICAgICAgewogICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfOCk7CiAgICAgICAgICAgICBydWxlX19EYXRhSW50ZXJjaGFuZ2VQYWNrYWdlX19Hcm91cF9fMl9fSW1wbCgpOwpAQCAtMTU2NjcsMjMgKzE2NTkxLDIzIEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fRGF0YUludGVyY2hhbmdlUGFja2FnZV9fR3JvdXBfXzJfX0ltcGwiCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NDIyMToxOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VQYWNrYWdlX19Hcm91cF9fMl9fSW1wbCA6ICggKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VQYWNrYWdlX19OYW1lQXNzaWdubWVudF8yICkgKSA7CisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NDQ1MjoxOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VQYWNrYWdlX19Hcm91cF9fMl9fSW1wbCA6ICggKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VQYWNrYWdlX19OYW1lQXNzaWdubWVudF8yICkgKSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fRGF0YUludGVyY2hhbmdlUGFja2FnZV9fR3JvdXBfXzJfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NDIyNToxOiAoICggKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VQYWNrYWdlX19OYW1lQXNzaWdubWVudF8yICkgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo0MjI2OjE6ICggKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VQYWNrYWdlX19OYW1lQXNzaWdubWVudF8yICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NDQ1NjoxOiAoICggKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VQYWNrYWdlX19OYW1lQXNzaWdubWVudF8yICkgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo0NDU3OjE6ICggKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VQYWNrYWdlX19OYW1lQXNzaWdubWVudF8yICkgKQogICAgICAgICAgICAgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NDIyNjoxOiAoICggcnVsZV9fRGF0YUludGVyY2hhbmdlUGFja2FnZV9fTmFtZUFzc2lnbm1lbnRfMiApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjQyMjc6MjogKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VQYWNrYWdlX19OYW1lQXNzaWdubWVudF8yICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjQ0NTc6MTogKCAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZVBhY2thZ2VfX05hbWVBc3NpZ25tZW50XzIgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo0NDU4OjI6ICggcnVsZV9fRGF0YUludGVyY2hhbmdlUGFja2FnZV9fTmFtZUFzc2lnbm1lbnRfMiApCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldERhdGFJbnRlcmNoYW5nZVBhY2thZ2VBY2Nlc3MoKS5nZXROYW1lQXNzaWdubWVudF8yKCkpOyAKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjQyMjg6MjogKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VQYWNrYWdlX19OYW1lQXNzaWdubWVudF8yICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjQyMjg6MzogcnVsZV9fRGF0YUludGVyY2hhbmdlUGFja2FnZV9fTmFtZUFzc2lnbm1lbnRfMgorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NDQ1OToyOiAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZVBhY2thZ2VfX05hbWVBc3NpZ25tZW50XzIgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NDQ1OTozOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VQYWNrYWdlX19OYW1lQXNzaWdubWVudF8yCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV18yKTsKICAgICAgICAgICAgIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZVBhY2thZ2VfX05hbWVBc3NpZ25tZW50XzIoKTsKQEAgLTE1NzE4LDE0ICsxNjY0MiwxNCBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX0RhdGFJbnRlcmNoYW5nZVBhY2thZ2VfX0dyb3VwX18zIgotICAgIC8vIEludGVybmFsRGF0YURTTC5nOjQyMzY6MTogcnVsZV9fRGF0YUludGVyY2hhbmdlUGFja2FnZV9fR3JvdXBfXzMgOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VQYWNrYWdlX19Hcm91cF9fM19fSW1wbCBydWxlX19EYXRhSW50ZXJjaGFuZ2VQYWNrYWdlX19Hcm91cF9fNCA7CisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NDQ2NzoxOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VQYWNrYWdlX19Hcm91cF9fMyA6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZVBhY2thZ2VfX0dyb3VwX18zX19JbXBsIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZVBhY2thZ2VfX0dyb3VwX180IDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19EYXRhSW50ZXJjaGFuZ2VQYWNrYWdlX19Hcm91cF9fMygpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo0MjQwOjE6ICggcnVsZV9fRGF0YUludGVyY2hhbmdlUGFja2FnZV9fR3JvdXBfXzNfX0ltcGwgcnVsZV9fRGF0YUludGVyY2hhbmdlUGFja2FnZV9fR3JvdXBfXzQgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NDI0MToyOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VQYWNrYWdlX19Hcm91cF9fM19fSW1wbCBydWxlX19EYXRhSW50ZXJjaGFuZ2VQYWNrYWdlX19Hcm91cF9fNAorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NDQ3MToxOiAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZVBhY2thZ2VfX0dyb3VwX18zX19JbXBsIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZVBhY2thZ2VfX0dyb3VwX180ICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjQ0NzI6MjogcnVsZV9fRGF0YUludGVyY2hhbmdlUGFja2FnZV9fR3JvdXBfXzNfX0ltcGwgcnVsZV9fRGF0YUludGVyY2hhbmdlUGFja2FnZV9fR3JvdXBfXzQKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzkpOwogICAgICAgICAgICAgcnVsZV9fRGF0YUludGVyY2hhbmdlUGFja2FnZV9fR3JvdXBfXzNfX0ltcGwoKTsKQEAgLTE1NzU2LDIyICsxNjY4MCwyMiBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX0RhdGFJbnRlcmNoYW5nZVBhY2thZ2VfX0dyb3VwX18zX19JbXBsIgotICAgIC8vIEludGVybmFsRGF0YURTTC5nOjQyNDg6MTogcnVsZV9fRGF0YUludGVyY2hhbmdlUGFja2FnZV9fR3JvdXBfXzNfX0ltcGwgOiAoICd0aXRsZScgKSA7CisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NDQ3OToxOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VQYWNrYWdlX19Hcm91cF9fM19fSW1wbCA6ICggJ3RpdGxlJyApIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19EYXRhSW50ZXJjaGFuZ2VQYWNrYWdlX19Hcm91cF9fM19fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo0MjUyOjE6ICggKCAndGl0bGUnICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NDI1MzoxOiAoICd0aXRsZScgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NDQ4MzoxOiAoICggJ3RpdGxlJyApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjQ0ODQ6MTogKCAndGl0bGUnICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjQyNTM6MTogKCAndGl0bGUnICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjQyNTQ6MjogJ3RpdGxlJworICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NDQ4NDoxOiAoICd0aXRsZScgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NDQ4NToyOiAndGl0bGUnCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldERhdGFJbnRlcmNoYW5nZVBhY2thZ2VBY2Nlc3MoKS5nZXRUaXRsZUtleXdvcmRfMygpKTsgCiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBtYXRjaChpbnB1dCw2OSxGT0xMT1dfMik7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CisgICAgICAgICAgICBtYXRjaChpbnB1dCw3NCxGT0xMT1dfMik7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YUludGVyY2hhbmdlUGFja2FnZUFjY2VzcygpLmdldFRpdGxlS2V5d29yZF8zKCkpOyAKICAgICAgICAgICAgIH0KQEAgLTE1Nzk3LDE0ICsxNjcyMSwxNCBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX0RhdGFJbnRlcmNoYW5nZVBhY2thZ2VfX0dyb3VwX180IgotICAgIC8vIEludGVybmFsRGF0YURTTC5nOjQyNjM6MTogcnVsZV9fRGF0YUludGVyY2hhbmdlUGFja2FnZV9fR3JvdXBfXzQgOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VQYWNrYWdlX19Hcm91cF9fNF9fSW1wbCBydWxlX19EYXRhSW50ZXJjaGFuZ2VQYWNrYWdlX19Hcm91cF9fNSA7CisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NDQ5NDoxOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VQYWNrYWdlX19Hcm91cF9fNCA6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZVBhY2thZ2VfX0dyb3VwX180X19JbXBsIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZVBhY2thZ2VfX0dyb3VwX181IDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19EYXRhSW50ZXJjaGFuZ2VQYWNrYWdlX19Hcm91cF9fNCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo0MjY3OjE6ICggcnVsZV9fRGF0YUludGVyY2hhbmdlUGFja2FnZV9fR3JvdXBfXzRfX0ltcGwgcnVsZV9fRGF0YUludGVyY2hhbmdlUGFja2FnZV9fR3JvdXBfXzUgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NDI2ODoyOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VQYWNrYWdlX19Hcm91cF9fNF9fSW1wbCBydWxlX19EYXRhSW50ZXJjaGFuZ2VQYWNrYWdlX19Hcm91cF9fNQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NDQ5ODoxOiAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZVBhY2thZ2VfX0dyb3VwX180X19JbXBsIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZVBhY2thZ2VfX0dyb3VwX181ICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjQ0OTk6MjogcnVsZV9fRGF0YUludGVyY2hhbmdlUGFja2FnZV9fR3JvdXBfXzRfX0ltcGwgcnVsZV9fRGF0YUludGVyY2hhbmdlUGFja2FnZV9fR3JvdXBfXzUKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzEwKTsKICAgICAgICAgICAgIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZVBhY2thZ2VfX0dyb3VwX180X19JbXBsKCk7CkBAIC0xNTgzNSwyMyArMTY3NTksMjMgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19EYXRhSW50ZXJjaGFuZ2VQYWNrYWdlX19Hcm91cF9fNF9fSW1wbCIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo0Mjc1OjE6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZVBhY2thZ2VfX0dyb3VwX180X19JbXBsIDogKCAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZVBhY2thZ2VfX1RpdGxlQXNzaWdubWVudF80ICkgKSA7CisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NDUwNjoxOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VQYWNrYWdlX19Hcm91cF9fNF9fSW1wbCA6ICggKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VQYWNrYWdlX19UaXRsZUFzc2lnbm1lbnRfNCApICkgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZVBhY2thZ2VfX0dyb3VwX180X19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjQyNzk6MTogKCAoICggcnVsZV9fRGF0YUludGVyY2hhbmdlUGFja2FnZV9fVGl0bGVBc3NpZ25tZW50XzQgKSApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjQyODA6MTogKCAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZVBhY2thZ2VfX1RpdGxlQXNzaWdubWVudF80ICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NDUxMDoxOiAoICggKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VQYWNrYWdlX19UaXRsZUFzc2lnbm1lbnRfNCApICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NDUxMToxOiAoICggcnVsZV9fRGF0YUludGVyY2hhbmdlUGFja2FnZV9fVGl0bGVBc3NpZ25tZW50XzQgKSApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo0MjgwOjE6ICggKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VQYWNrYWdlX19UaXRsZUFzc2lnbm1lbnRfNCApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjQyODE6MjogKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VQYWNrYWdlX19UaXRsZUFzc2lnbm1lbnRfNCApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo0NTExOjE6ICggKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VQYWNrYWdlX19UaXRsZUFzc2lnbm1lbnRfNCApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjQ1MTI6MjogKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VQYWNrYWdlX19UaXRsZUFzc2lnbm1lbnRfNCApCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldERhdGFJbnRlcmNoYW5nZVBhY2thZ2VBY2Nlc3MoKS5nZXRUaXRsZUFzc2lnbm1lbnRfNCgpKTsgCiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo0MjgyOjI6ICggcnVsZV9fRGF0YUludGVyY2hhbmdlUGFja2FnZV9fVGl0bGVBc3NpZ25tZW50XzQgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NDI4MjozOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VQYWNrYWdlX19UaXRsZUFzc2lnbm1lbnRfNAorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NDUxMzoyOiAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZVBhY2thZ2VfX1RpdGxlQXNzaWdubWVudF80ICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjQ1MTM6MzogcnVsZV9fRGF0YUludGVyY2hhbmdlUGFja2FnZV9fVGl0bGVBc3NpZ25tZW50XzQKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzIpOwogICAgICAgICAgICAgcnVsZV9fRGF0YUludGVyY2hhbmdlUGFja2FnZV9fVGl0bGVBc3NpZ25tZW50XzQoKTsKQEAgLTE1ODg2LDE0ICsxNjgxMCwxNCBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX0RhdGFJbnRlcmNoYW5nZVBhY2thZ2VfX0dyb3VwX181IgotICAgIC8vIEludGVybmFsRGF0YURTTC5nOjQyOTA6MTogcnVsZV9fRGF0YUludGVyY2hhbmdlUGFja2FnZV9fR3JvdXBfXzUgOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VQYWNrYWdlX19Hcm91cF9fNV9fSW1wbCA7CisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NDUyMToxOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VQYWNrYWdlX19Hcm91cF9fNSA6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZVBhY2thZ2VfX0dyb3VwX181X19JbXBsIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19EYXRhSW50ZXJjaGFuZ2VQYWNrYWdlX19Hcm91cF9fNSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo0Mjk0OjE6ICggcnVsZV9fRGF0YUludGVyY2hhbmdlUGFja2FnZV9fR3JvdXBfXzVfX0ltcGwgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NDI5NToyOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VQYWNrYWdlX19Hcm91cF9fNV9fSW1wbAorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NDUyNToxOiAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZVBhY2thZ2VfX0dyb3VwX181X19JbXBsICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjQ1MjY6MjogcnVsZV9fRGF0YUludGVyY2hhbmdlUGFja2FnZV9fR3JvdXBfXzVfX0ltcGwKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzIpOwogICAgICAgICAgICAgcnVsZV9fRGF0YUludGVyY2hhbmdlUGFja2FnZV9fR3JvdXBfXzVfX0ltcGwoKTsKQEAgLTE1OTE5LDMxICsxNjg0MywzMSBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX0RhdGFJbnRlcmNoYW5nZVBhY2thZ2VfX0dyb3VwX181X19JbXBsIgotICAgIC8vIEludGVybmFsRGF0YURTTC5nOjQzMDE6MTogcnVsZV9fRGF0YUludGVyY2hhbmdlUGFja2FnZV9fR3JvdXBfXzVfX0ltcGwgOiAoICggcnVsZV9fRGF0YUludGVyY2hhbmdlUGFja2FnZV9fR3JvdXBfNV9fMCApPyApIDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo0NTMyOjE6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZVBhY2thZ2VfX0dyb3VwX181X19JbXBsIDogKCAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZVBhY2thZ2VfX0dyb3VwXzVfXzAgKT8gKSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fRGF0YUludGVyY2hhbmdlUGFja2FnZV9fR3JvdXBfXzVfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NDMwNToxOiAoICggKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VQYWNrYWdlX19Hcm91cF81X18wICk/ICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NDMwNjoxOiAoICggcnVsZV9fRGF0YUludGVyY2hhbmdlUGFja2FnZV9fR3JvdXBfNV9fMCApPyApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo0NTM2OjE6ICggKCAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZVBhY2thZ2VfX0dyb3VwXzVfXzAgKT8gKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo0NTM3OjE6ICggKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VQYWNrYWdlX19Hcm91cF81X18wICk/ICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjQzMDY6MTogKCAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZVBhY2thZ2VfX0dyb3VwXzVfXzAgKT8gKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NDMwNzoyOiAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZVBhY2thZ2VfX0dyb3VwXzVfXzAgKT8KKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjQ1Mzc6MTogKCAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZVBhY2thZ2VfX0dyb3VwXzVfXzAgKT8gKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NDUzODoyOiAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZVBhY2thZ2VfX0dyb3VwXzVfXzAgKT8KICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YUludGVyY2hhbmdlUGFja2FnZUFjY2VzcygpLmdldEdyb3VwXzUoKSk7IAogICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NDMwODoyOiAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZVBhY2thZ2VfX0dyb3VwXzVfXzAgKT8KLSAgICAgICAgICAgIGludCBhbHQ1NT0yOwotICAgICAgICAgICAgaW50IExBNTVfMCA9IGlucHV0LkxBKDEpOworICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NDUzOToyOiAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZVBhY2thZ2VfX0dyb3VwXzVfXzAgKT8KKyAgICAgICAgICAgIGludCBhbHQ1OD0yOworICAgICAgICAgICAgaW50IExBNThfMCA9IGlucHV0LkxBKDEpOwogCi0gICAgICAgICAgICBpZiAoIChMQTU1XzA9PTcwKSApIHsKLSAgICAgICAgICAgICAgICBhbHQ1NT0xOworICAgICAgICAgICAgaWYgKCAoTEE1OF8wPT03NSkgKSB7CisgICAgICAgICAgICAgICAgYWx0NTg9MTsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHN3aXRjaCAoYWx0NTUpIHsKKyAgICAgICAgICAgIHN3aXRjaCAoYWx0NTgpIHsKICAgICAgICAgICAgICAgICBjYXNlIDEgOgotICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo0MzA4OjM6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZVBhY2thZ2VfX0dyb3VwXzVfXzAKKyAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NDUzOTozOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VQYWNrYWdlX19Hcm91cF81X18wCiAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMik7CiAgICAgICAgICAgICAgICAgICAgIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZVBhY2thZ2VfX0dyb3VwXzVfXzAoKTsKQEAgLTE1OTgxLDE0ICsxNjkwNSwxNCBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX0RhdGFJbnRlcmNoYW5nZVBhY2thZ2VfX0dyb3VwXzVfXzAiCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NDMxNzoxOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VQYWNrYWdlX19Hcm91cF81X18wIDogcnVsZV9fRGF0YUludGVyY2hhbmdlUGFja2FnZV9fR3JvdXBfNV9fMF9fSW1wbCBydWxlX19EYXRhSW50ZXJjaGFuZ2VQYWNrYWdlX19Hcm91cF81X18xIDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo0NTQ4OjE6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZVBhY2thZ2VfX0dyb3VwXzVfXzAgOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VQYWNrYWdlX19Hcm91cF81X18wX19JbXBsIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZVBhY2thZ2VfX0dyb3VwXzVfXzEgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZVBhY2thZ2VfX0dyb3VwXzVfXzAoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NDMyMToxOiAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZVBhY2thZ2VfX0dyb3VwXzVfXzBfX0ltcGwgcnVsZV9fRGF0YUludGVyY2hhbmdlUGFja2FnZV9fR3JvdXBfNV9fMSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo0MzIyOjI6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZVBhY2thZ2VfX0dyb3VwXzVfXzBfX0ltcGwgcnVsZV9fRGF0YUludGVyY2hhbmdlUGFja2FnZV9fR3JvdXBfNV9fMQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NDU1MjoxOiAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZVBhY2thZ2VfX0dyb3VwXzVfXzBfX0ltcGwgcnVsZV9fRGF0YUludGVyY2hhbmdlUGFja2FnZV9fR3JvdXBfNV9fMSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo0NTUzOjI6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZVBhY2thZ2VfX0dyb3VwXzVfXzBfX0ltcGwgcnVsZV9fRGF0YUludGVyY2hhbmdlUGFja2FnZV9fR3JvdXBfNV9fMQogICAgICAgICAgICAgewogICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMTEpOwogICAgICAgICAgICAgcnVsZV9fRGF0YUludGVyY2hhbmdlUGFja2FnZV9fR3JvdXBfNV9fMF9fSW1wbCgpOwpAQCAtMTYwMTksMjIgKzE2OTQzLDIyIEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fRGF0YUludGVyY2hhbmdlUGFja2FnZV9fR3JvdXBfNV9fMF9fSW1wbCIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo0MzI5OjE6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZVBhY2thZ2VfX0dyb3VwXzVfXzBfX0ltcGwgOiAoICd7JyApIDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo0NTYwOjE6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZVBhY2thZ2VfX0dyb3VwXzVfXzBfX0ltcGwgOiAoICd7JyApIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19EYXRhSW50ZXJjaGFuZ2VQYWNrYWdlX19Hcm91cF81X18wX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjQzMzM6MTogKCAoICd7JyApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjQzMzQ6MTogKCAneycgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NDU2NDoxOiAoICggJ3snICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NDU2NToxOiAoICd7JyApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo0MzM0OjE6ICggJ3snICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjQzMzU6MjogJ3snCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo0NTY1OjE6ICggJ3snICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjQ1NjY6MjogJ3snCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldERhdGFJbnRlcmNoYW5nZVBhY2thZ2VBY2Nlc3MoKS5nZXRMZWZ0Q3VybHlCcmFja2V0S2V5d29yZF81XzAoKSk7IAogICAgICAgICAgICAgfQotICAgICAgICAgICAgbWF0Y2goaW5wdXQsNzAsRk9MTE9XXzIpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOworICAgICAgICAgICAgbWF0Y2goaW5wdXQsNzUsRk9MTE9XXzIpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOwogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBhZnRlcihncmFtbWFyQWNjZXNzLmdldERhdGFJbnRlcmNoYW5nZVBhY2thZ2VBY2Nlc3MoKS5nZXRMZWZ0Q3VybHlCcmFja2V0S2V5d29yZF81XzAoKSk7IAogICAgICAgICAgICAgfQpAQCAtMTYwNjAsMTQgKzE2OTg0LDE0IEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fRGF0YUludGVyY2hhbmdlUGFja2FnZV9fR3JvdXBfNV9fMSIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo0MzQ0OjE6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZVBhY2thZ2VfX0dyb3VwXzVfXzEgOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VQYWNrYWdlX19Hcm91cF81X18xX19JbXBsIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZVBhY2thZ2VfX0dyb3VwXzVfXzIgOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjQ1NzU6MTogcnVsZV9fRGF0YUludGVyY2hhbmdlUGFja2FnZV9fR3JvdXBfNV9fMSA6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZVBhY2thZ2VfX0dyb3VwXzVfXzFfX0ltcGwgcnVsZV9fRGF0YUludGVyY2hhbmdlUGFja2FnZV9fR3JvdXBfNV9fMiA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fRGF0YUludGVyY2hhbmdlUGFja2FnZV9fR3JvdXBfNV9fMSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo0MzQ4OjE6ICggcnVsZV9fRGF0YUludGVyY2hhbmdlUGFja2FnZV9fR3JvdXBfNV9fMV9fSW1wbCBydWxlX19EYXRhSW50ZXJjaGFuZ2VQYWNrYWdlX19Hcm91cF81X18yICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjQzNDk6MjogcnVsZV9fRGF0YUludGVyY2hhbmdlUGFja2FnZV9fR3JvdXBfNV9fMV9fSW1wbCBydWxlX19EYXRhSW50ZXJjaGFuZ2VQYWNrYWdlX19Hcm91cF81X18yCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo0NTc5OjE6ICggcnVsZV9fRGF0YUludGVyY2hhbmdlUGFja2FnZV9fR3JvdXBfNV9fMV9fSW1wbCBydWxlX19EYXRhSW50ZXJjaGFuZ2VQYWNrYWdlX19Hcm91cF81X18yICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjQ1ODA6MjogcnVsZV9fRGF0YUludGVyY2hhbmdlUGFja2FnZV9fR3JvdXBfNV9fMV9fSW1wbCBydWxlX19EYXRhSW50ZXJjaGFuZ2VQYWNrYWdlX19Hcm91cF81X18yCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV18xMSk7CiAgICAgICAgICAgICBydWxlX19EYXRhSW50ZXJjaGFuZ2VQYWNrYWdlX19Hcm91cF81X18xX19JbXBsKCk7CkBAIC0xNjA5OCwzNSArMTcwMjIsMzUgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19EYXRhSW50ZXJjaGFuZ2VQYWNrYWdlX19Hcm91cF81X18xX19JbXBsIgotICAgIC8vIEludGVybmFsRGF0YURTTC5nOjQzNTY6MTogcnVsZV9fRGF0YUludGVyY2hhbmdlUGFja2FnZV9fR3JvdXBfNV9fMV9fSW1wbCA6ICggKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VQYWNrYWdlX19EYXRJbnRzQXNzaWdubWVudF81XzEgKSogKSA7CisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NDU4NzoxOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VQYWNrYWdlX19Hcm91cF81X18xX19JbXBsIDogKCAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZVBhY2thZ2VfX0RhdEludHNBc3NpZ25tZW50XzVfMSApKiApIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19EYXRhSW50ZXJjaGFuZ2VQYWNrYWdlX19Hcm91cF81X18xX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjQzNjA6MTogKCAoICggcnVsZV9fRGF0YUludGVyY2hhbmdlUGFja2FnZV9fRGF0SW50c0Fzc2lnbm1lbnRfNV8xICkqICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NDM2MToxOiAoICggcnVsZV9fRGF0YUludGVyY2hhbmdlUGFja2FnZV9fRGF0SW50c0Fzc2lnbm1lbnRfNV8xICkqICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjQ1OTE6MTogKCAoICggcnVsZV9fRGF0YUludGVyY2hhbmdlUGFja2FnZV9fRGF0SW50c0Fzc2lnbm1lbnRfNV8xICkqICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NDU5MjoxOiAoICggcnVsZV9fRGF0YUludGVyY2hhbmdlUGFja2FnZV9fRGF0SW50c0Fzc2lnbm1lbnRfNV8xICkqICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjQzNjE6MTogKCAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZVBhY2thZ2VfX0RhdEludHNBc3NpZ25tZW50XzVfMSApKiApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo0MzYyOjI6ICggcnVsZV9fRGF0YUludGVyY2hhbmdlUGFja2FnZV9fRGF0SW50c0Fzc2lnbm1lbnRfNV8xICkqCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo0NTkyOjE6ICggKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VQYWNrYWdlX19EYXRJbnRzQXNzaWdubWVudF81XzEgKSogKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NDU5MzoyOiAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZVBhY2thZ2VfX0RhdEludHNBc3NpZ25tZW50XzVfMSApKgogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXREYXRhSW50ZXJjaGFuZ2VQYWNrYWdlQWNjZXNzKCkuZ2V0RGF0SW50c0Fzc2lnbm1lbnRfNV8xKCkpOyAKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjQzNjM6MjogKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VQYWNrYWdlX19EYXRJbnRzQXNzaWdubWVudF81XzEgKSoKLSAgICAgICAgICAgIGxvb3A1NjoKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjQ1OTQ6MjogKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VQYWNrYWdlX19EYXRJbnRzQXNzaWdubWVudF81XzEgKSoKKyAgICAgICAgICAgIGxvb3A1OToKICAgICAgICAgICAgIGRvIHsKLSAgICAgICAgICAgICAgICBpbnQgYWx0NTY9MjsKLSAgICAgICAgICAgICAgICBpbnQgTEE1Nl8wID0gaW5wdXQuTEEoMSk7CisgICAgICAgICAgICAgICAgaW50IGFsdDU5PTI7CisgICAgICAgICAgICAgICAgaW50IExBNTlfMCA9IGlucHV0LkxBKDEpOwogCi0gICAgICAgICAgICAgICAgaWYgKCAoTEE1Nl8wPT03MikgKSB7Ci0gICAgICAgICAgICAgICAgICAgIGFsdDU2PTE7CisgICAgICAgICAgICAgICAgaWYgKCAoTEE1OV8wPT03NykgKSB7CisgICAgICAgICAgICAgICAgICAgIGFsdDU5PTE7CiAgICAgICAgICAgICAgICAgfQogCiAKLSAgICAgICAgICAgICAgICBzd2l0Y2ggKGFsdDU2KSB7CisgICAgICAgICAgICAgICAgc3dpdGNoIChhbHQ1OSkgewogICAgICAgICAgICAgCWNhc2UgMSA6Ci0gICAgICAgICAgICAJICAgIC8vIEludGVybmFsRGF0YURTTC5nOjQzNjM6MzogcnVsZV9fRGF0YUludGVyY2hhbmdlUGFja2FnZV9fRGF0SW50c0Fzc2lnbm1lbnRfNV8xCisgICAgICAgICAgICAJICAgIC8vIEludGVybmFsRGF0YURTTC5nOjQ1OTQ6MzogcnVsZV9fRGF0YUludGVyY2hhbmdlUGFja2FnZV9fRGF0SW50c0Fzc2lnbm1lbnRfNV8xCiAgICAgICAgICAgICAJICAgIHsKICAgICAgICAgICAgIAkgICAgcHVzaEZvbGxvdyhGT0xMT1dfMTIpOwogICAgICAgICAgICAgCSAgICBydWxlX19EYXRhSW50ZXJjaGFuZ2VQYWNrYWdlX19EYXRJbnRzQXNzaWdubWVudF81XzEoKTsKQEAgLTE2MTM4LDcgKzE3MDYyLDcgQEAKICAgICAgICAgICAgIAkgICAgYnJlYWs7CiAKICAgICAgICAgICAgIAlkZWZhdWx0IDoKLSAgICAgICAgICAgIAkgICAgYnJlYWsgbG9vcDU2OworICAgICAgICAgICAgCSAgICBicmVhayBsb29wNTk7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfSB3aGlsZSAodHJ1ZSk7CiAKQEAgLTE2MTY3LDE0ICsxNzA5MSwxNCBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX0RhdGFJbnRlcmNoYW5nZVBhY2thZ2VfX0dyb3VwXzVfXzIiCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NDM3MToxOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VQYWNrYWdlX19Hcm91cF81X18yIDogcnVsZV9fRGF0YUludGVyY2hhbmdlUGFja2FnZV9fR3JvdXBfNV9fMl9fSW1wbCA7CisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NDYwMjoxOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VQYWNrYWdlX19Hcm91cF81X18yIDogcnVsZV9fRGF0YUludGVyY2hhbmdlUGFja2FnZV9fR3JvdXBfNV9fMl9fSW1wbCA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fRGF0YUludGVyY2hhbmdlUGFja2FnZV9fR3JvdXBfNV9fMigpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo0Mzc1OjE6ICggcnVsZV9fRGF0YUludGVyY2hhbmdlUGFja2FnZV9fR3JvdXBfNV9fMl9fSW1wbCApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo0Mzc2OjI6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZVBhY2thZ2VfX0dyb3VwXzVfXzJfX0ltcGwKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjQ2MDY6MTogKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VQYWNrYWdlX19Hcm91cF81X18yX19JbXBsICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjQ2MDc6MjogcnVsZV9fRGF0YUludGVyY2hhbmdlUGFja2FnZV9fR3JvdXBfNV9fMl9fSW1wbAogICAgICAgICAgICAgewogICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMik7CiAgICAgICAgICAgICBydWxlX19EYXRhSW50ZXJjaGFuZ2VQYWNrYWdlX19Hcm91cF81X18yX19JbXBsKCk7CkBAIC0xNjIwMCwyMiArMTcxMjQsMjIgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19EYXRhSW50ZXJjaGFuZ2VQYWNrYWdlX19Hcm91cF81X18yX19JbXBsIgotICAgIC8vIEludGVybmFsRGF0YURTTC5nOjQzODI6MTogcnVsZV9fRGF0YUludGVyY2hhbmdlUGFja2FnZV9fR3JvdXBfNV9fMl9fSW1wbCA6ICggJ30nICkgOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjQ2MTM6MTogcnVsZV9fRGF0YUludGVyY2hhbmdlUGFja2FnZV9fR3JvdXBfNV9fMl9fSW1wbCA6ICggJ30nICkgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZVBhY2thZ2VfX0dyb3VwXzVfXzJfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NDM4NjoxOiAoICggJ30nICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NDM4NzoxOiAoICd9JyApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo0NjE3OjE6ICggKCAnfScgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo0NjE4OjE6ICggJ30nICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjQzODc6MTogKCAnfScgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NDM4ODoyOiAnfScKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjQ2MTg6MTogKCAnfScgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NDYxOToyOiAnfScKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YUludGVyY2hhbmdlUGFja2FnZUFjY2VzcygpLmdldFJpZ2h0Q3VybHlCcmFja2V0S2V5d29yZF81XzIoKSk7IAogICAgICAgICAgICAgfQotICAgICAgICAgICAgbWF0Y2goaW5wdXQsNzEsRk9MTE9XXzIpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOworICAgICAgICAgICAgbWF0Y2goaW5wdXQsNzYsRk9MTE9XXzIpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOwogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBhZnRlcihncmFtbWFyQWNjZXNzLmdldERhdGFJbnRlcmNoYW5nZVBhY2thZ2VBY2Nlc3MoKS5nZXRSaWdodEN1cmx5QnJhY2tldEtleXdvcmRfNV8yKCkpOyAKICAgICAgICAgICAgIH0KQEAgLTE2MjQxLDE0ICsxNzE2NSwxNCBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX0RhdGFJbnRlcmNoYW5nZV9fR3JvdXBfXzAiCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NDM5ODoxOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VfX0dyb3VwX18wIDogcnVsZV9fRGF0YUludGVyY2hhbmdlX19Hcm91cF9fMF9fSW1wbCBydWxlX19EYXRhSW50ZXJjaGFuZ2VfX0dyb3VwX18xIDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo0NjI5OjE6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZV9fR3JvdXBfXzAgOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VfX0dyb3VwX18wX19JbXBsIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZV9fR3JvdXBfXzEgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZV9fR3JvdXBfXzAoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NDQwMjoxOiAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZV9fR3JvdXBfXzBfX0ltcGwgcnVsZV9fRGF0YUludGVyY2hhbmdlX19Hcm91cF9fMSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo0NDAzOjI6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZV9fR3JvdXBfXzBfX0ltcGwgcnVsZV9fRGF0YUludGVyY2hhbmdlX19Hcm91cF9fMQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NDYzMzoxOiAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZV9fR3JvdXBfXzBfX0ltcGwgcnVsZV9fRGF0YUludGVyY2hhbmdlX19Hcm91cF9fMSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo0NjM0OjI6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZV9fR3JvdXBfXzBfX0ltcGwgcnVsZV9fRGF0YUludGVyY2hhbmdlX19Hcm91cF9fMQogICAgICAgICAgICAgewogICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMTMpOwogICAgICAgICAgICAgcnVsZV9fRGF0YUludGVyY2hhbmdlX19Hcm91cF9fMF9fSW1wbCgpOwpAQCAtMTYyNzksMjMgKzE3MjAzLDIzIEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fRGF0YUludGVyY2hhbmdlX19Hcm91cF9fMF9fSW1wbCIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo0NDEwOjE6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZV9fR3JvdXBfXzBfX0ltcGwgOiAoICgpICkgOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjQ2NDE6MTogcnVsZV9fRGF0YUludGVyY2hhbmdlX19Hcm91cF9fMF9fSW1wbCA6ICggKCkgKSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fRGF0YUludGVyY2hhbmdlX19Hcm91cF9fMF9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo0NDE0OjE6ICggKCAoKSApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjQ0MTU6MTogKCAoKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo0NjQ1OjE6ICggKCAoKSApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjQ2NDY6MTogKCAoKSApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo0NDE1OjE6ICggKCkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NDQxNjoyOiAoKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NDY0NjoxOiAoICgpICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjQ2NDc6MjogKCkKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YUludGVyY2hhbmdlQWNjZXNzKCkuZ2V0RGF0YUludGVyY2hhbmdlQWN0aW9uXzAoKSk7IAogICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NDQxNzoyOiAoKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NDQxNzozOiAKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjQ2NDg6MjogKCkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjQ2NDg6MzogCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICB9CiAKQEAgLTE2MzIwLDE0ICsxNzI0NCwxNCBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX0RhdGFJbnRlcmNoYW5nZV9fR3JvdXBfXzEiCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NDQyNToxOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VfX0dyb3VwX18xIDogcnVsZV9fRGF0YUludGVyY2hhbmdlX19Hcm91cF9fMV9fSW1wbCBydWxlX19EYXRhSW50ZXJjaGFuZ2VfX0dyb3VwX18yIDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo0NjU2OjE6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZV9fR3JvdXBfXzEgOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VfX0dyb3VwX18xX19JbXBsIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZV9fR3JvdXBfXzIgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZV9fR3JvdXBfXzEoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NDQyOToxOiAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZV9fR3JvdXBfXzFfX0ltcGwgcnVsZV9fRGF0YUludGVyY2hhbmdlX19Hcm91cF9fMiApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo0NDMwOjI6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZV9fR3JvdXBfXzFfX0ltcGwgcnVsZV9fRGF0YUludGVyY2hhbmdlX19Hcm91cF9fMgorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NDY2MDoxOiAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZV9fR3JvdXBfXzFfX0ltcGwgcnVsZV9fRGF0YUludGVyY2hhbmdlX19Hcm91cF9fMiApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo0NjYxOjI6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZV9fR3JvdXBfXzFfX0ltcGwgcnVsZV9fRGF0YUludGVyY2hhbmdlX19Hcm91cF9fMgogICAgICAgICAgICAgewogICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfNyk7CiAgICAgICAgICAgICBydWxlX19EYXRhSW50ZXJjaGFuZ2VfX0dyb3VwX18xX19JbXBsKCk7CkBAIC0xNjM1OCwyMiArMTcyODIsMjIgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19EYXRhSW50ZXJjaGFuZ2VfX0dyb3VwX18xX19JbXBsIgotICAgIC8vIEludGVybmFsRGF0YURTTC5nOjQ0Mzc6MTogcnVsZV9fRGF0YUludGVyY2hhbmdlX19Hcm91cF9fMV9fSW1wbCA6ICggJ2ludGVyY2hhbmdlJyApIDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo0NjY4OjE6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZV9fR3JvdXBfXzFfX0ltcGwgOiAoICdpbnRlcmNoYW5nZScgKSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fRGF0YUludGVyY2hhbmdlX19Hcm91cF9fMV9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo0NDQxOjE6ICggKCAnaW50ZXJjaGFuZ2UnICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NDQ0MjoxOiAoICdpbnRlcmNoYW5nZScgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NDY3MjoxOiAoICggJ2ludGVyY2hhbmdlJyApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjQ2NzM6MTogKCAnaW50ZXJjaGFuZ2UnICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjQ0NDI6MTogKCAnaW50ZXJjaGFuZ2UnICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjQ0NDM6MjogJ2ludGVyY2hhbmdlJworICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NDY3MzoxOiAoICdpbnRlcmNoYW5nZScgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NDY3NDoyOiAnaW50ZXJjaGFuZ2UnCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldERhdGFJbnRlcmNoYW5nZUFjY2VzcygpLmdldEludGVyY2hhbmdlS2V5d29yZF8xKCkpOyAKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1hdGNoKGlucHV0LDcyLEZPTExPV18yKTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKKyAgICAgICAgICAgIG1hdGNoKGlucHV0LDc3LEZPTExPV18yKTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXREYXRhSW50ZXJjaGFuZ2VBY2Nlc3MoKS5nZXRJbnRlcmNoYW5nZUtleXdvcmRfMSgpKTsgCiAgICAgICAgICAgICB9CkBAIC0xNjM5OSwxNCArMTczMjMsMTQgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19EYXRhSW50ZXJjaGFuZ2VfX0dyb3VwX18yIgotICAgIC8vIEludGVybmFsRGF0YURTTC5nOjQ0NTI6MTogcnVsZV9fRGF0YUludGVyY2hhbmdlX19Hcm91cF9fMiA6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZV9fR3JvdXBfXzJfX0ltcGwgcnVsZV9fRGF0YUludGVyY2hhbmdlX19Hcm91cF9fMyA7CisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NDY4MzoxOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VfX0dyb3VwX18yIDogcnVsZV9fRGF0YUludGVyY2hhbmdlX19Hcm91cF9fMl9fSW1wbCBydWxlX19EYXRhSW50ZXJjaGFuZ2VfX0dyb3VwX18zIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19EYXRhSW50ZXJjaGFuZ2VfX0dyb3VwX18yKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjQ0NTY6MTogKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VfX0dyb3VwX18yX19JbXBsIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZV9fR3JvdXBfXzMgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NDQ1NzoyOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VfX0dyb3VwX18yX19JbXBsIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZV9fR3JvdXBfXzMKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjQ2ODc6MTogKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VfX0dyb3VwX18yX19JbXBsIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZV9fR3JvdXBfXzMgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NDY4ODoyOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VfX0dyb3VwX18yX19JbXBsIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZV9fR3JvdXBfXzMKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzE0KTsKICAgICAgICAgICAgIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZV9fR3JvdXBfXzJfX0ltcGwoKTsKQEAgLTE2NDM3LDIzICsxNzM2MSwyMyBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX0RhdGFJbnRlcmNoYW5nZV9fR3JvdXBfXzJfX0ltcGwiCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NDQ2NDoxOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VfX0dyb3VwX18yX19JbXBsIDogKCAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZV9fTmFtZUFzc2lnbm1lbnRfMiApICkgOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjQ2OTU6MTogcnVsZV9fRGF0YUludGVyY2hhbmdlX19Hcm91cF9fMl9fSW1wbCA6ICggKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VfX05hbWVBc3NpZ25tZW50XzIgKSApIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19EYXRhSW50ZXJjaGFuZ2VfX0dyb3VwX18yX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjQ0Njg6MTogKCAoICggcnVsZV9fRGF0YUludGVyY2hhbmdlX19OYW1lQXNzaWdubWVudF8yICkgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo0NDY5OjE6ICggKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VfX05hbWVBc3NpZ25tZW50XzIgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo0Njk5OjE6ICggKCAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZV9fTmFtZUFzc2lnbm1lbnRfMiApICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NDcwMDoxOiAoICggcnVsZV9fRGF0YUludGVyY2hhbmdlX19OYW1lQXNzaWdubWVudF8yICkgKQogICAgICAgICAgICAgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NDQ2OToxOiAoICggcnVsZV9fRGF0YUludGVyY2hhbmdlX19OYW1lQXNzaWdubWVudF8yICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NDQ3MDoyOiAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZV9fTmFtZUFzc2lnbm1lbnRfMiApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo0NzAwOjE6ICggKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VfX05hbWVBc3NpZ25tZW50XzIgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo0NzAxOjI6ICggcnVsZV9fRGF0YUludGVyY2hhbmdlX19OYW1lQXNzaWdubWVudF8yICkKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YUludGVyY2hhbmdlQWNjZXNzKCkuZ2V0TmFtZUFzc2lnbm1lbnRfMigpKTsgCiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo0NDcxOjI6ICggcnVsZV9fRGF0YUludGVyY2hhbmdlX19OYW1lQXNzaWdubWVudF8yICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjQ0NzE6MzogcnVsZV9fRGF0YUludGVyY2hhbmdlX19OYW1lQXNzaWdubWVudF8yCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo0NzAyOjI6ICggcnVsZV9fRGF0YUludGVyY2hhbmdlX19OYW1lQXNzaWdubWVudF8yICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjQ3MDI6MzogcnVsZV9fRGF0YUludGVyY2hhbmdlX19OYW1lQXNzaWdubWVudF8yCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV18yKTsKICAgICAgICAgICAgIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZV9fTmFtZUFzc2lnbm1lbnRfMigpOwpAQCAtMTY0ODgsMTQgKzE3NDEyLDE0IEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fRGF0YUludGVyY2hhbmdlX19Hcm91cF9fMyIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo0NDc5OjE6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZV9fR3JvdXBfXzMgOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VfX0dyb3VwX18zX19JbXBsIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZV9fR3JvdXBfXzQgOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjQ3MTA6MTogcnVsZV9fRGF0YUludGVyY2hhbmdlX19Hcm91cF9fMyA6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZV9fR3JvdXBfXzNfX0ltcGwgcnVsZV9fRGF0YUludGVyY2hhbmdlX19Hcm91cF9fNCA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fRGF0YUludGVyY2hhbmdlX19Hcm91cF9fMygpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo0NDgzOjE6ICggcnVsZV9fRGF0YUludGVyY2hhbmdlX19Hcm91cF9fM19fSW1wbCBydWxlX19EYXRhSW50ZXJjaGFuZ2VfX0dyb3VwX180ICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjQ0ODQ6MjogcnVsZV9fRGF0YUludGVyY2hhbmdlX19Hcm91cF9fM19fSW1wbCBydWxlX19EYXRhSW50ZXJjaGFuZ2VfX0dyb3VwX180CisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo0NzE0OjE6ICggcnVsZV9fRGF0YUludGVyY2hhbmdlX19Hcm91cF9fM19fSW1wbCBydWxlX19EYXRhSW50ZXJjaGFuZ2VfX0dyb3VwX180ICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjQ3MTU6MjogcnVsZV9fRGF0YUludGVyY2hhbmdlX19Hcm91cF9fM19fSW1wbCBydWxlX19EYXRhSW50ZXJjaGFuZ2VfX0dyb3VwX180CiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV18xNCk7CiAgICAgICAgICAgICBydWxlX19EYXRhSW50ZXJjaGFuZ2VfX0dyb3VwX18zX19JbXBsKCk7CkBAIC0xNjUyNiwzMSArMTc0NTAsMzEgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19EYXRhSW50ZXJjaGFuZ2VfX0dyb3VwX18zX19JbXBsIgotICAgIC8vIEludGVybmFsRGF0YURTTC5nOjQ0OTE6MTogcnVsZV9fRGF0YUludGVyY2hhbmdlX19Hcm91cF9fM19fSW1wbCA6ICggKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VfX0dyb3VwXzNfXzAgKT8gKSA7CisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NDcyMjoxOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VfX0dyb3VwX18zX19JbXBsIDogKCAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZV9fR3JvdXBfM19fMCApPyApIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19EYXRhSW50ZXJjaGFuZ2VfX0dyb3VwX18zX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjQ0OTU6MTogKCAoICggcnVsZV9fRGF0YUludGVyY2hhbmdlX19Hcm91cF8zX18wICk/ICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NDQ5NjoxOiAoICggcnVsZV9fRGF0YUludGVyY2hhbmdlX19Hcm91cF8zX18wICk/ICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjQ3MjY6MTogKCAoICggcnVsZV9fRGF0YUludGVyY2hhbmdlX19Hcm91cF8zX18wICk/ICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NDcyNzoxOiAoICggcnVsZV9fRGF0YUludGVyY2hhbmdlX19Hcm91cF8zX18wICk/ICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjQ0OTY6MTogKCAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZV9fR3JvdXBfM19fMCApPyApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo0NDk3OjI6ICggcnVsZV9fRGF0YUludGVyY2hhbmdlX19Hcm91cF8zX18wICk/CisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo0NzI3OjE6ICggKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VfX0dyb3VwXzNfXzAgKT8gKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NDcyODoyOiAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZV9fR3JvdXBfM19fMCApPwogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXREYXRhSW50ZXJjaGFuZ2VBY2Nlc3MoKS5nZXRHcm91cF8zKCkpOyAKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjQ0OTg6MjogKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VfX0dyb3VwXzNfXzAgKT8KLSAgICAgICAgICAgIGludCBhbHQ1Nz0yOwotICAgICAgICAgICAgaW50IExBNTdfMCA9IGlucHV0LkxBKDEpOworICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NDcyOToyOiAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZV9fR3JvdXBfM19fMCApPworICAgICAgICAgICAgaW50IGFsdDYwPTI7CisgICAgICAgICAgICBpbnQgTEE2MF8wID0gaW5wdXQuTEEoMSk7CiAKLSAgICAgICAgICAgIGlmICggKExBNTdfMD09MTM5KSApIHsKLSAgICAgICAgICAgICAgICBhbHQ1Nz0xOworICAgICAgICAgICAgaWYgKCAoTEE2MF8wPT0xNDkpICkgeworICAgICAgICAgICAgICAgIGFsdDYwPTE7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBzd2l0Y2ggKGFsdDU3KSB7CisgICAgICAgICAgICBzd2l0Y2ggKGFsdDYwKSB7CiAgICAgICAgICAgICAgICAgY2FzZSAxIDoKLSAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NDQ5ODozOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VfX0dyb3VwXzNfXzAKKyAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NDcyOTozOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VfX0dyb3VwXzNfXzAKICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV18yKTsKICAgICAgICAgICAgICAgICAgICAgcnVsZV9fRGF0YUludGVyY2hhbmdlX19Hcm91cF8zX18wKCk7CkBAIC0xNjU4OCwxNCArMTc1MTIsMTQgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19EYXRhSW50ZXJjaGFuZ2VfX0dyb3VwX180IgotICAgIC8vIEludGVybmFsRGF0YURTTC5nOjQ1MDY6MTogcnVsZV9fRGF0YUludGVyY2hhbmdlX19Hcm91cF9fNCA6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZV9fR3JvdXBfXzRfX0ltcGwgcnVsZV9fRGF0YUludGVyY2hhbmdlX19Hcm91cF9fNSA7CisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NDczNzoxOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VfX0dyb3VwX180IDogcnVsZV9fRGF0YUludGVyY2hhbmdlX19Hcm91cF9fNF9fSW1wbCBydWxlX19EYXRhSW50ZXJjaGFuZ2VfX0dyb3VwX181IDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19EYXRhSW50ZXJjaGFuZ2VfX0dyb3VwX180KCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjQ1MTA6MTogKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VfX0dyb3VwX180X19JbXBsIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZV9fR3JvdXBfXzUgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NDUxMToyOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VfX0dyb3VwX180X19JbXBsIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZV9fR3JvdXBfXzUKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjQ3NDE6MTogKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VfX0dyb3VwX180X19JbXBsIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZV9fR3JvdXBfXzUgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NDc0MjoyOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VfX0dyb3VwX180X19JbXBsIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZV9fR3JvdXBfXzUKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzE1KTsKICAgICAgICAgICAgIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZV9fR3JvdXBfXzRfX0ltcGwoKTsKQEAgLTE2NjI2LDIzICsxNzU1MCwyMyBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX0RhdGFJbnRlcmNoYW5nZV9fR3JvdXBfXzRfX0ltcGwiCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NDUxODoxOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VfX0dyb3VwX180X19JbXBsIDogKCAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZV9fTW9kZUFzc2lnbm1lbnRfNCApICkgOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjQ3NDk6MTogcnVsZV9fRGF0YUludGVyY2hhbmdlX19Hcm91cF9fNF9fSW1wbCA6ICggKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VfX01vZGVBc3NpZ25tZW50XzQgKSApIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19EYXRhSW50ZXJjaGFuZ2VfX0dyb3VwX180X19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjQ1MjI6MTogKCAoICggcnVsZV9fRGF0YUludGVyY2hhbmdlX19Nb2RlQXNzaWdubWVudF80ICkgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo0NTIzOjE6ICggKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VfX01vZGVBc3NpZ25tZW50XzQgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo0NzUzOjE6ICggKCAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZV9fTW9kZUFzc2lnbm1lbnRfNCApICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NDc1NDoxOiAoICggcnVsZV9fRGF0YUludGVyY2hhbmdlX19Nb2RlQXNzaWdubWVudF80ICkgKQogICAgICAgICAgICAgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NDUyMzoxOiAoICggcnVsZV9fRGF0YUludGVyY2hhbmdlX19Nb2RlQXNzaWdubWVudF80ICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NDUyNDoyOiAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZV9fTW9kZUFzc2lnbm1lbnRfNCApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo0NzU0OjE6ICggKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VfX01vZGVBc3NpZ25tZW50XzQgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo0NzU1OjI6ICggcnVsZV9fRGF0YUludGVyY2hhbmdlX19Nb2RlQXNzaWdubWVudF80ICkKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YUludGVyY2hhbmdlQWNjZXNzKCkuZ2V0TW9kZUFzc2lnbm1lbnRfNCgpKTsgCiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo0NTI1OjI6ICggcnVsZV9fRGF0YUludGVyY2hhbmdlX19Nb2RlQXNzaWdubWVudF80ICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjQ1MjU6MzogcnVsZV9fRGF0YUludGVyY2hhbmdlX19Nb2RlQXNzaWdubWVudF80CisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo0NzU2OjI6ICggcnVsZV9fRGF0YUludGVyY2hhbmdlX19Nb2RlQXNzaWdubWVudF80ICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjQ3NTY6MzogcnVsZV9fRGF0YUludGVyY2hhbmdlX19Nb2RlQXNzaWdubWVudF80CiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV18yKTsKICAgICAgICAgICAgIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZV9fTW9kZUFzc2lnbm1lbnRfNCgpOwpAQCAtMTY2NzcsMTQgKzE3NjAxLDE0IEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fRGF0YUludGVyY2hhbmdlX19Hcm91cF9fNSIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo0NTMzOjE6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZV9fR3JvdXBfXzUgOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VfX0dyb3VwX181X19JbXBsIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZV9fR3JvdXBfXzYgOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjQ3NjQ6MTogcnVsZV9fRGF0YUludGVyY2hhbmdlX19Hcm91cF9fNSA6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZV9fR3JvdXBfXzVfX0ltcGwgcnVsZV9fRGF0YUludGVyY2hhbmdlX19Hcm91cF9fNiA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fRGF0YUludGVyY2hhbmdlX19Hcm91cF9fNSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo0NTM3OjE6ICggcnVsZV9fRGF0YUludGVyY2hhbmdlX19Hcm91cF9fNV9fSW1wbCBydWxlX19EYXRhSW50ZXJjaGFuZ2VfX0dyb3VwX182ICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjQ1Mzg6MjogcnVsZV9fRGF0YUludGVyY2hhbmdlX19Hcm91cF9fNV9fSW1wbCBydWxlX19EYXRhSW50ZXJjaGFuZ2VfX0dyb3VwX182CisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo0NzY4OjE6ICggcnVsZV9fRGF0YUludGVyY2hhbmdlX19Hcm91cF9fNV9fSW1wbCBydWxlX19EYXRhSW50ZXJjaGFuZ2VfX0dyb3VwX182ICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjQ3Njk6MjogcnVsZV9fRGF0YUludGVyY2hhbmdlX19Hcm91cF9fNV9fSW1wbCBydWxlX19EYXRhSW50ZXJjaGFuZ2VfX0dyb3VwX182CiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV18xNSk7CiAgICAgICAgICAgICBydWxlX19EYXRhSW50ZXJjaGFuZ2VfX0dyb3VwX181X19JbXBsKCk7CkBAIC0xNjcxNSwzMSArMTc2MzksMzEgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19EYXRhSW50ZXJjaGFuZ2VfX0dyb3VwX181X19JbXBsIgotICAgIC8vIEludGVybmFsRGF0YURTTC5nOjQ1NDU6MTogcnVsZV9fRGF0YUludGVyY2hhbmdlX19Hcm91cF9fNV9fSW1wbCA6ICggKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VfX0dyb3VwXzVfXzAgKT8gKSA7CisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NDc3NjoxOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VfX0dyb3VwX181X19JbXBsIDogKCAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZV9fR3JvdXBfNV9fMCApPyApIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19EYXRhSW50ZXJjaGFuZ2VfX0dyb3VwX181X19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjQ1NDk6MTogKCAoICggcnVsZV9fRGF0YUludGVyY2hhbmdlX19Hcm91cF81X18wICk/ICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NDU1MDoxOiAoICggcnVsZV9fRGF0YUludGVyY2hhbmdlX19Hcm91cF81X18wICk/ICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjQ3ODA6MTogKCAoICggcnVsZV9fRGF0YUludGVyY2hhbmdlX19Hcm91cF81X18wICk/ICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NDc4MToxOiAoICggcnVsZV9fRGF0YUludGVyY2hhbmdlX19Hcm91cF81X18wICk/ICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjQ1NTA6MTogKCAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZV9fR3JvdXBfNV9fMCApPyApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo0NTUxOjI6ICggcnVsZV9fRGF0YUludGVyY2hhbmdlX19Hcm91cF81X18wICk/CisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo0NzgxOjE6ICggKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VfX0dyb3VwXzVfXzAgKT8gKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NDc4MjoyOiAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZV9fR3JvdXBfNV9fMCApPwogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXREYXRhSW50ZXJjaGFuZ2VBY2Nlc3MoKS5nZXRHcm91cF81KCkpOyAKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjQ1NTI6MjogKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VfX0dyb3VwXzVfXzAgKT8KLSAgICAgICAgICAgIGludCBhbHQ1OD0yOwotICAgICAgICAgICAgaW50IExBNThfMCA9IGlucHV0LkxBKDEpOworICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NDc4MzoyOiAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZV9fR3JvdXBfNV9fMCApPworICAgICAgICAgICAgaW50IGFsdDYxPTI7CisgICAgICAgICAgICBpbnQgTEE2MV8wID0gaW5wdXQuTEEoMSk7CiAKLSAgICAgICAgICAgIGlmICggKExBNThfMD09NzUpICkgewotICAgICAgICAgICAgICAgIGFsdDU4PTE7CisgICAgICAgICAgICBpZiAoIChMQTYxXzA9PTgwKSApIHsKKyAgICAgICAgICAgICAgICBhbHQ2MT0xOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgc3dpdGNoIChhbHQ1OCkgeworICAgICAgICAgICAgc3dpdGNoIChhbHQ2MSkgewogICAgICAgICAgICAgICAgIGNhc2UgMSA6Ci0gICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjQ1NTI6MzogcnVsZV9fRGF0YUludGVyY2hhbmdlX19Hcm91cF81X18wCisgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjQ3ODM6MzogcnVsZV9fRGF0YUludGVyY2hhbmdlX19Hcm91cF81X18wCiAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMik7CiAgICAgICAgICAgICAgICAgICAgIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZV9fR3JvdXBfNV9fMCgpOwpAQCAtMTY3NzcsMTQgKzE3NzAxLDE0IEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fRGF0YUludGVyY2hhbmdlX19Hcm91cF9fNiIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo0NTYwOjE6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZV9fR3JvdXBfXzYgOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VfX0dyb3VwX182X19JbXBsIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZV9fR3JvdXBfXzcgOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjQ3OTE6MTogcnVsZV9fRGF0YUludGVyY2hhbmdlX19Hcm91cF9fNiA6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZV9fR3JvdXBfXzZfX0ltcGwgcnVsZV9fRGF0YUludGVyY2hhbmdlX19Hcm91cF9fNyA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fRGF0YUludGVyY2hhbmdlX19Hcm91cF9fNigpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo0NTY0OjE6ICggcnVsZV9fRGF0YUludGVyY2hhbmdlX19Hcm91cF9fNl9fSW1wbCBydWxlX19EYXRhSW50ZXJjaGFuZ2VfX0dyb3VwX183ICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjQ1NjU6MjogcnVsZV9fRGF0YUludGVyY2hhbmdlX19Hcm91cF9fNl9fSW1wbCBydWxlX19EYXRhSW50ZXJjaGFuZ2VfX0dyb3VwX183CisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo0Nzk1OjE6ICggcnVsZV9fRGF0YUludGVyY2hhbmdlX19Hcm91cF9fNl9fSW1wbCBydWxlX19EYXRhSW50ZXJjaGFuZ2VfX0dyb3VwX183ICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjQ3OTY6MjogcnVsZV9fRGF0YUludGVyY2hhbmdlX19Hcm91cF9fNl9fSW1wbCBydWxlX19EYXRhSW50ZXJjaGFuZ2VfX0dyb3VwX183CiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV18xNSk7CiAgICAgICAgICAgICBydWxlX19EYXRhSW50ZXJjaGFuZ2VfX0dyb3VwX182X19JbXBsKCk7CkBAIC0xNjgxNSwzMSArMTc3MzksMzEgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19EYXRhSW50ZXJjaGFuZ2VfX0dyb3VwX182X19JbXBsIgotICAgIC8vIEludGVybmFsRGF0YURTTC5nOjQ1NzI6MTogcnVsZV9fRGF0YUludGVyY2hhbmdlX19Hcm91cF9fNl9fSW1wbCA6ICggKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VfX0NyZWF0ZVJlcG9ydEFzc2lnbm1lbnRfNiApPyApIDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo0ODAzOjE6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZV9fR3JvdXBfXzZfX0ltcGwgOiAoICggcnVsZV9fRGF0YUludGVyY2hhbmdlX19DcmVhdGVSZXBvcnRBc3NpZ25tZW50XzYgKT8gKSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fRGF0YUludGVyY2hhbmdlX19Hcm91cF9fNl9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo0NTc2OjE6ICggKCAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZV9fQ3JlYXRlUmVwb3J0QXNzaWdubWVudF82ICk/ICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NDU3NzoxOiAoICggcnVsZV9fRGF0YUludGVyY2hhbmdlX19DcmVhdGVSZXBvcnRBc3NpZ25tZW50XzYgKT8gKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NDgwNzoxOiAoICggKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VfX0NyZWF0ZVJlcG9ydEFzc2lnbm1lbnRfNiApPyApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjQ4MDg6MTogKCAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZV9fQ3JlYXRlUmVwb3J0QXNzaWdubWVudF82ICk/ICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjQ1Nzc6MTogKCAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZV9fQ3JlYXRlUmVwb3J0QXNzaWdubWVudF82ICk/ICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjQ1Nzg6MjogKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VfX0NyZWF0ZVJlcG9ydEFzc2lnbm1lbnRfNiApPworICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NDgwODoxOiAoICggcnVsZV9fRGF0YUludGVyY2hhbmdlX19DcmVhdGVSZXBvcnRBc3NpZ25tZW50XzYgKT8gKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NDgwOToyOiAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZV9fQ3JlYXRlUmVwb3J0QXNzaWdubWVudF82ICk/CiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldERhdGFJbnRlcmNoYW5nZUFjY2VzcygpLmdldENyZWF0ZVJlcG9ydEFzc2lnbm1lbnRfNigpKTsgCiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo0NTc5OjI6ICggcnVsZV9fRGF0YUludGVyY2hhbmdlX19DcmVhdGVSZXBvcnRBc3NpZ25tZW50XzYgKT8KLSAgICAgICAgICAgIGludCBhbHQ1OT0yOwotICAgICAgICAgICAgaW50IExBNTlfMCA9IGlucHV0LkxBKDEpOworICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NDgxMDoyOiAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZV9fQ3JlYXRlUmVwb3J0QXNzaWdubWVudF82ICk/CisgICAgICAgICAgICBpbnQgYWx0NjI9MjsKKyAgICAgICAgICAgIGludCBMQTYyXzAgPSBpbnB1dC5MQSgxKTsKIAotICAgICAgICAgICAgaWYgKCAoTEE1OV8wPT0xNDApICkgewotICAgICAgICAgICAgICAgIGFsdDU5PTE7CisgICAgICAgICAgICBpZiAoIChMQTYyXzA9PTE1MCkgKSB7CisgICAgICAgICAgICAgICAgYWx0NjI9MTsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHN3aXRjaCAoYWx0NTkpIHsKKyAgICAgICAgICAgIHN3aXRjaCAoYWx0NjIpIHsKICAgICAgICAgICAgICAgICBjYXNlIDEgOgotICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo0NTc5OjM6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZV9fQ3JlYXRlUmVwb3J0QXNzaWdubWVudF82CisgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjQ4MTA6MzogcnVsZV9fRGF0YUludGVyY2hhbmdlX19DcmVhdGVSZXBvcnRBc3NpZ25tZW50XzYKICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV18yKTsKICAgICAgICAgICAgICAgICAgICAgcnVsZV9fRGF0YUludGVyY2hhbmdlX19DcmVhdGVSZXBvcnRBc3NpZ25tZW50XzYoKTsKQEAgLTE2ODc3LDE0ICsxNzgwMSwxNCBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX0RhdGFJbnRlcmNoYW5nZV9fR3JvdXBfXzciCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NDU4NzoxOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VfX0dyb3VwX183IDogcnVsZV9fRGF0YUludGVyY2hhbmdlX19Hcm91cF9fN19fSW1wbCBydWxlX19EYXRhSW50ZXJjaGFuZ2VfX0dyb3VwX184IDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo0ODE4OjE6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZV9fR3JvdXBfXzcgOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VfX0dyb3VwX183X19JbXBsIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZV9fR3JvdXBfXzggOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZV9fR3JvdXBfXzcoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NDU5MToxOiAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZV9fR3JvdXBfXzdfX0ltcGwgcnVsZV9fRGF0YUludGVyY2hhbmdlX19Hcm91cF9fOCApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo0NTkyOjI6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZV9fR3JvdXBfXzdfX0ltcGwgcnVsZV9fRGF0YUludGVyY2hhbmdlX19Hcm91cF9fOAorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NDgyMjoxOiAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZV9fR3JvdXBfXzdfX0ltcGwgcnVsZV9fRGF0YUludGVyY2hhbmdlX19Hcm91cF9fOCApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo0ODIzOjI6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZV9fR3JvdXBfXzdfX0ltcGwgcnVsZV9fRGF0YUludGVyY2hhbmdlX19Hcm91cF9fOAogICAgICAgICAgICAgewogICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMTUpOwogICAgICAgICAgICAgcnVsZV9fRGF0YUludGVyY2hhbmdlX19Hcm91cF9fN19fSW1wbCgpOwpAQCAtMTY5MTUsMzEgKzE3ODM5LDMxIEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fRGF0YUludGVyY2hhbmdlX19Hcm91cF9fN19fSW1wbCIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo0NTk5OjE6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZV9fR3JvdXBfXzdfX0ltcGwgOiAoICggcnVsZV9fRGF0YUludGVyY2hhbmdlX19Hcm91cF83X18wICk/ICkgOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjQ4MzA6MTogcnVsZV9fRGF0YUludGVyY2hhbmdlX19Hcm91cF9fN19fSW1wbCA6ICggKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VfX0dyb3VwXzdfXzAgKT8gKSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fRGF0YUludGVyY2hhbmdlX19Hcm91cF9fN19fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo0NjAzOjE6ICggKCAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZV9fR3JvdXBfN19fMCApPyApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjQ2MDQ6MTogKCAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZV9fR3JvdXBfN19fMCApPyApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo0ODM0OjE6ICggKCAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZV9fR3JvdXBfN19fMCApPyApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjQ4MzU6MTogKCAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZV9fR3JvdXBfN19fMCApPyApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo0NjA0OjE6ICggKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VfX0dyb3VwXzdfXzAgKT8gKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NDYwNToyOiAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZV9fR3JvdXBfN19fMCApPworICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NDgzNToxOiAoICggcnVsZV9fRGF0YUludGVyY2hhbmdlX19Hcm91cF83X18wICk/ICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjQ4MzY6MjogKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VfX0dyb3VwXzdfXzAgKT8KICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YUludGVyY2hhbmdlQWNjZXNzKCkuZ2V0R3JvdXBfNygpKTsgCiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo0NjA2OjI6ICggcnVsZV9fRGF0YUludGVyY2hhbmdlX19Hcm91cF83X18wICk/Ci0gICAgICAgICAgICBpbnQgYWx0NjA9MjsKLSAgICAgICAgICAgIGludCBMQTYwXzAgPSBpbnB1dC5MQSgxKTsKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjQ4Mzc6MjogKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VfX0dyb3VwXzdfXzAgKT8KKyAgICAgICAgICAgIGludCBhbHQ2Mz0yOworICAgICAgICAgICAgaW50IExBNjNfMCA9IGlucHV0LkxBKDEpOwogCi0gICAgICAgICAgICBpZiAoIChMQTYwXzA9PTc2KSApIHsKLSAgICAgICAgICAgICAgICBhbHQ2MD0xOworICAgICAgICAgICAgaWYgKCAoTEE2M18wPT04MSkgKSB7CisgICAgICAgICAgICAgICAgYWx0NjM9MTsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHN3aXRjaCAoYWx0NjApIHsKKyAgICAgICAgICAgIHN3aXRjaCAoYWx0NjMpIHsKICAgICAgICAgICAgICAgICBjYXNlIDEgOgotICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo0NjA2OjM6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZV9fR3JvdXBfN19fMAorICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo0ODM3OjM6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZV9fR3JvdXBfN19fMAogICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzIpOwogICAgICAgICAgICAgICAgICAgICBydWxlX19EYXRhSW50ZXJjaGFuZ2VfX0dyb3VwXzdfXzAoKTsKQEAgLTE2OTc3LDE2ICsxNzkwMSwxNiBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX0RhdGFJbnRlcmNoYW5nZV9fR3JvdXBfXzgiCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NDYxNDoxOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VfX0dyb3VwX184IDogcnVsZV9fRGF0YUludGVyY2hhbmdlX19Hcm91cF9fOF9fSW1wbCBydWxlX19EYXRhSW50ZXJjaGFuZ2VfX0dyb3VwX185IDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo0ODQ1OjE6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZV9fR3JvdXBfXzggOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VfX0dyb3VwX184X19JbXBsIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZV9fR3JvdXBfXzkgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZV9fR3JvdXBfXzgoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NDYxODoxOiAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZV9fR3JvdXBfXzhfX0ltcGwgcnVsZV9fRGF0YUludGVyY2hhbmdlX19Hcm91cF9fOSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo0NjE5OjI6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZV9fR3JvdXBfXzhfX0ltcGwgcnVsZV9fRGF0YUludGVyY2hhbmdlX19Hcm91cF9fOQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NDg0OToxOiAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZV9fR3JvdXBfXzhfX0ltcGwgcnVsZV9fRGF0YUludGVyY2hhbmdlX19Hcm91cF9fOSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo0ODUwOjI6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZV9fR3JvdXBfXzhfX0ltcGwgcnVsZV9fRGF0YUludGVyY2hhbmdlX19Hcm91cF9fOQogICAgICAgICAgICAgewotICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMTYpOworICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMTUpOwogICAgICAgICAgICAgcnVsZV9fRGF0YUludGVyY2hhbmdlX19Hcm91cF9fOF9fSW1wbCgpOwogCiAgICAgICAgICAgICBzdGF0ZS5fZnNwLS07CkBAIC0xNzAxNSwyNCArMTc5MzksNDUgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19EYXRhSW50ZXJjaGFuZ2VfX0dyb3VwX184X19JbXBsIgotICAgIC8vIEludGVybmFsRGF0YURTTC5nOjQ2MjY6MTogcnVsZV9fRGF0YUludGVyY2hhbmdlX19Hcm91cF9fOF9fSW1wbCA6ICggJ2ZpbGUnICkgOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjQ4NTc6MTogcnVsZV9fRGF0YUludGVyY2hhbmdlX19Hcm91cF9fOF9fSW1wbCA6ICggKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VfX0RlbGV0ZUZpbGVBZnRlckltcG9ydEFzc2lnbm1lbnRfOCApPyApIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19EYXRhSW50ZXJjaGFuZ2VfX0dyb3VwX184X19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjQ2MzA6MTogKCAoICdmaWxlJyApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjQ2MzE6MTogKCAnZmlsZScgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NDg2MToxOiAoICggKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VfX0RlbGV0ZUZpbGVBZnRlckltcG9ydEFzc2lnbm1lbnRfOCApPyApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjQ4NjI6MTogKCAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZV9fRGVsZXRlRmlsZUFmdGVySW1wb3J0QXNzaWdubWVudF84ICk/ICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjQ2MzE6MTogKCAnZmlsZScgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NDYzMjoyOiAnZmlsZScKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjQ4NjI6MTogKCAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZV9fRGVsZXRlRmlsZUFmdGVySW1wb3J0QXNzaWdubWVudF84ICk/ICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjQ4NjM6MjogKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VfX0RlbGV0ZUZpbGVBZnRlckltcG9ydEFzc2lnbm1lbnRfOCApPwogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7Ci0gICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXREYXRhSW50ZXJjaGFuZ2VBY2Nlc3MoKS5nZXRGaWxlS2V5d29yZF84KCkpOyAKKyAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldERhdGFJbnRlcmNoYW5nZUFjY2VzcygpLmdldERlbGV0ZUZpbGVBZnRlckltcG9ydEFzc2lnbm1lbnRfOCgpKTsgCiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBtYXRjaChpbnB1dCw3MyxGT0xMT1dfMik7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo0ODY0OjI6ICggcnVsZV9fRGF0YUludGVyY2hhbmdlX19EZWxldGVGaWxlQWZ0ZXJJbXBvcnRBc3NpZ25tZW50XzggKT8KKyAgICAgICAgICAgIGludCBhbHQ2ND0yOworICAgICAgICAgICAgaW50IExBNjRfMCA9IGlucHV0LkxBKDEpOworCisgICAgICAgICAgICBpZiAoIChMQTY0XzA9PTE1MSkgKSB7CisgICAgICAgICAgICAgICAgYWx0NjQ9MTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHN3aXRjaCAoYWx0NjQpIHsKKyAgICAgICAgICAgICAgICBjYXNlIDEgOgorICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo0ODY0OjM6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZV9fRGVsZXRlRmlsZUFmdGVySW1wb3J0QXNzaWdubWVudF84CisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMik7CisgICAgICAgICAgICAgICAgICAgIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZV9fRGVsZXRlRmlsZUFmdGVySW1wb3J0QXNzaWdubWVudF84KCk7CisKKyAgICAgICAgICAgICAgICAgICAgc3RhdGUuX2ZzcC0tOworICAgICAgICAgICAgICAgICAgICBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOworCisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIH0KKwogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7Ci0gICAgICAgICAgICAgICBhZnRlcihncmFtbWFyQWNjZXNzLmdldERhdGFJbnRlcmNoYW5nZUFjY2VzcygpLmdldEZpbGVLZXl3b3JkXzgoKSk7IAorICAgICAgICAgICAgICAgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXREYXRhSW50ZXJjaGFuZ2VBY2Nlc3MoKS5nZXREZWxldGVGaWxlQWZ0ZXJJbXBvcnRBc3NpZ25tZW50XzgoKSk7IAogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICB9CkBAIC0xNzA1NiwxNiArMTgwMDEsMTYgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19EYXRhSW50ZXJjaGFuZ2VfX0dyb3VwX185IgotICAgIC8vIEludGVybmFsRGF0YURTTC5nOjQ2NDE6MTogcnVsZV9fRGF0YUludGVyY2hhbmdlX19Hcm91cF9fOSA6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZV9fR3JvdXBfXzlfX0ltcGwgcnVsZV9fRGF0YUludGVyY2hhbmdlX19Hcm91cF9fMTAgOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjQ4NzI6MTogcnVsZV9fRGF0YUludGVyY2hhbmdlX19Hcm91cF9fOSA6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZV9fR3JvdXBfXzlfX0ltcGwgcnVsZV9fRGF0YUludGVyY2hhbmdlX19Hcm91cF9fMTAgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZV9fR3JvdXBfXzkoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NDY0NToxOiAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZV9fR3JvdXBfXzlfX0ltcGwgcnVsZV9fRGF0YUludGVyY2hhbmdlX19Hcm91cF9fMTAgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NDY0NjoyOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VfX0dyb3VwX185X19JbXBsIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZV9fR3JvdXBfXzEwCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo0ODc2OjE6ICggcnVsZV9fRGF0YUludGVyY2hhbmdlX19Hcm91cF9fOV9fSW1wbCBydWxlX19EYXRhSW50ZXJjaGFuZ2VfX0dyb3VwX18xMCApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo0ODc3OjI6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZV9fR3JvdXBfXzlfX0ltcGwgcnVsZV9fRGF0YUludGVyY2hhbmdlX19Hcm91cF9fMTAKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzE3KTsKKyAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzE2KTsKICAgICAgICAgICAgIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZV9fR3JvdXBfXzlfX0ltcGwoKTsKIAogICAgICAgICAgICAgc3RhdGUuX2ZzcC0tOwpAQCAtMTcwOTQsMzQgKzE4MDM5LDI0IEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fRGF0YUludGVyY2hhbmdlX19Hcm91cF9fOV9fSW1wbCIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo0NjUzOjE6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZV9fR3JvdXBfXzlfX0ltcGwgOiAoICggcnVsZV9fRGF0YUludGVyY2hhbmdlX19GaWxlRW5kcG9pbnRBc3NpZ25tZW50XzkgKSApIDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo0ODg0OjE6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZV9fR3JvdXBfXzlfX0ltcGwgOiAoICdmaWxlJyApIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19EYXRhSW50ZXJjaGFuZ2VfX0dyb3VwX185X19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjQ2NTc6MTogKCAoICggcnVsZV9fRGF0YUludGVyY2hhbmdlX19GaWxlRW5kcG9pbnRBc3NpZ25tZW50XzkgKSApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjQ2NTg6MTogKCAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZV9fRmlsZUVuZHBvaW50QXNzaWdubWVudF85ICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NDg4ODoxOiAoICggJ2ZpbGUnICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NDg4OToxOiAoICdmaWxlJyApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo0NjU4OjE6ICggKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VfX0ZpbGVFbmRwb2ludEFzc2lnbm1lbnRfOSApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjQ2NTk6MjogKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VfX0ZpbGVFbmRwb2ludEFzc2lnbm1lbnRfOSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo0ODg5OjE6ICggJ2ZpbGUnICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjQ4OTA6MjogJ2ZpbGUnCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKLSAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldERhdGFJbnRlcmNoYW5nZUFjY2VzcygpLmdldEZpbGVFbmRwb2ludEFzc2lnbm1lbnRfOSgpKTsgCisgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXREYXRhSW50ZXJjaGFuZ2VBY2Nlc3MoKS5nZXRGaWxlS2V5d29yZF85KCkpOyAKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjQ2NjA6MjogKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VfX0ZpbGVFbmRwb2ludEFzc2lnbm1lbnRfOSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo0NjYwOjM6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZV9fRmlsZUVuZHBvaW50QXNzaWdubWVudF85Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV18yKTsKLSAgICAgICAgICAgIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZV9fRmlsZUVuZHBvaW50QXNzaWdubWVudF85KCk7Ci0KLSAgICAgICAgICAgIHN0YXRlLl9mc3AtLTsKLSAgICAgICAgICAgIGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7Ci0KLSAgICAgICAgICAgIH0KLQorICAgICAgICAgICAgbWF0Y2goaW5wdXQsNzgsRk9MTE9XXzIpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOwogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7Ci0gICAgICAgICAgICAgICBhZnRlcihncmFtbWFyQWNjZXNzLmdldERhdGFJbnRlcmNoYW5nZUFjY2VzcygpLmdldEZpbGVFbmRwb2ludEFzc2lnbm1lbnRfOSgpKTsgCisgICAgICAgICAgICAgICBhZnRlcihncmFtbWFyQWNjZXNzLmdldERhdGFJbnRlcmNoYW5nZUFjY2VzcygpLmdldEZpbGVLZXl3b3JkXzkoKSk7IAogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICB9CkBAIC0xNzE0NSwxNiArMTgwODAsMTYgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19EYXRhSW50ZXJjaGFuZ2VfX0dyb3VwX18xMCIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo0NjY4OjE6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZV9fR3JvdXBfXzEwIDogcnVsZV9fRGF0YUludGVyY2hhbmdlX19Hcm91cF9fMTBfX0ltcGwgcnVsZV9fRGF0YUludGVyY2hhbmdlX19Hcm91cF9fMTEgOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjQ4OTk6MTogcnVsZV9fRGF0YUludGVyY2hhbmdlX19Hcm91cF9fMTAgOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VfX0dyb3VwX18xMF9fSW1wbCBydWxlX19EYXRhSW50ZXJjaGFuZ2VfX0dyb3VwX18xMSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fRGF0YUludGVyY2hhbmdlX19Hcm91cF9fMTAoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NDY3MjoxOiAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZV9fR3JvdXBfXzEwX19JbXBsIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZV9fR3JvdXBfXzExICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjQ2NzM6MjogcnVsZV9fRGF0YUludGVyY2hhbmdlX19Hcm91cF9fMTBfX0ltcGwgcnVsZV9fRGF0YUludGVyY2hhbmdlX19Hcm91cF9fMTEKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjQ5MDM6MTogKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VfX0dyb3VwX18xMF9fSW1wbCBydWxlX19EYXRhSW50ZXJjaGFuZ2VfX0dyb3VwX18xMSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo0OTA0OjI6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZV9fR3JvdXBfXzEwX19JbXBsIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZV9fR3JvdXBfXzExCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV18xMCk7CisgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV18xNyk7CiAgICAgICAgICAgICBydWxlX19EYXRhSW50ZXJjaGFuZ2VfX0dyb3VwX18xMF9fSW1wbCgpOwogCiAgICAgICAgICAgICBzdGF0ZS5fZnNwLS07CkBAIC0xNzE4MywyNCArMTgxMTgsMzQgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19EYXRhSW50ZXJjaGFuZ2VfX0dyb3VwX18xMF9fSW1wbCIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo0NjgwOjE6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZV9fR3JvdXBfXzEwX19JbXBsIDogKCAncGF0aCcgKSA7CisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NDkxMToxOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VfX0dyb3VwX18xMF9fSW1wbCA6ICggKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VfX0ZpbGVFbmRwb2ludEFzc2lnbm1lbnRfMTAgKSApIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19EYXRhSW50ZXJjaGFuZ2VfX0dyb3VwX18xMF9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo0Njg0OjE6ICggKCAncGF0aCcgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo0Njg1OjE6ICggJ3BhdGgnICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjQ5MTU6MTogKCAoICggcnVsZV9fRGF0YUludGVyY2hhbmdlX19GaWxlRW5kcG9pbnRBc3NpZ25tZW50XzEwICkgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo0OTE2OjE6ICggKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VfX0ZpbGVFbmRwb2ludEFzc2lnbm1lbnRfMTAgKSApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo0Njg1OjE6ICggJ3BhdGgnICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjQ2ODY6MjogJ3BhdGgnCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo0OTE2OjE6ICggKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VfX0ZpbGVFbmRwb2ludEFzc2lnbm1lbnRfMTAgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo0OTE3OjI6ICggcnVsZV9fRGF0YUludGVyY2hhbmdlX19GaWxlRW5kcG9pbnRBc3NpZ25tZW50XzEwICkKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewotICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YUludGVyY2hhbmdlQWNjZXNzKCkuZ2V0UGF0aEtleXdvcmRfMTAoKSk7IAorICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YUludGVyY2hhbmdlQWNjZXNzKCkuZ2V0RmlsZUVuZHBvaW50QXNzaWdubWVudF8xMCgpKTsgCiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBtYXRjaChpbnB1dCw3NCxGT0xMT1dfMik7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo0OTE4OjI6ICggcnVsZV9fRGF0YUludGVyY2hhbmdlX19GaWxlRW5kcG9pbnRBc3NpZ25tZW50XzEwICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjQ5MTg6MzogcnVsZV9fRGF0YUludGVyY2hhbmdlX19GaWxlRW5kcG9pbnRBc3NpZ25tZW50XzEwCisgICAgICAgICAgICB7CisgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV18yKTsKKyAgICAgICAgICAgIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZV9fRmlsZUVuZHBvaW50QXNzaWdubWVudF8xMCgpOworCisgICAgICAgICAgICBzdGF0ZS5fZnNwLS07CisgICAgICAgICAgICBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOworCisgICAgICAgICAgICB9CisKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewotICAgICAgICAgICAgICAgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXREYXRhSW50ZXJjaGFuZ2VBY2Nlc3MoKS5nZXRQYXRoS2V5d29yZF8xMCgpKTsgCisgICAgICAgICAgICAgICBhZnRlcihncmFtbWFyQWNjZXNzLmdldERhdGFJbnRlcmNoYW5nZUFjY2VzcygpLmdldEZpbGVFbmRwb2ludEFzc2lnbm1lbnRfMTAoKSk7IAogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICB9CkBAIC0xNzIyNCwxNiArMTgxNjksMTYgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19EYXRhSW50ZXJjaGFuZ2VfX0dyb3VwX18xMSIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo0Njk1OjE6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZV9fR3JvdXBfXzExIDogcnVsZV9fRGF0YUludGVyY2hhbmdlX19Hcm91cF9fMTFfX0ltcGwgcnVsZV9fRGF0YUludGVyY2hhbmdlX19Hcm91cF9fMTIgOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjQ5MjY6MTogcnVsZV9fRGF0YUludGVyY2hhbmdlX19Hcm91cF9fMTEgOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VfX0dyb3VwX18xMV9fSW1wbCBydWxlX19EYXRhSW50ZXJjaGFuZ2VfX0dyb3VwX18xMiA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fRGF0YUludGVyY2hhbmdlX19Hcm91cF9fMTEoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NDY5OToxOiAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZV9fR3JvdXBfXzExX19JbXBsIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZV9fR3JvdXBfXzEyICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjQ3MDA6MjogcnVsZV9fRGF0YUludGVyY2hhbmdlX19Hcm91cF9fMTFfX0ltcGwgcnVsZV9fRGF0YUludGVyY2hhbmdlX19Hcm91cF9fMTIKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjQ5MzA6MTogKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VfX0dyb3VwX18xMV9fSW1wbCBydWxlX19EYXRhSW50ZXJjaGFuZ2VfX0dyb3VwX18xMiApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo0OTMxOjI6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZV9fR3JvdXBfXzExX19JbXBsIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZV9fR3JvdXBfXzEyCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV18xOCk7CisgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV18xMCk7CiAgICAgICAgICAgICBydWxlX19EYXRhSW50ZXJjaGFuZ2VfX0dyb3VwX18xMV9fSW1wbCgpOwogCiAgICAgICAgICAgICBzdGF0ZS5fZnNwLS07CkBAIC0xNzI2MiwyNCArMTgyMDcsMjQgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19EYXRhSW50ZXJjaGFuZ2VfX0dyb3VwX18xMV9fSW1wbCIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo0NzA3OjE6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZV9fR3JvdXBfXzExX19JbXBsIDogKCAneycgKSA7CisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NDkzODoxOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VfX0dyb3VwX18xMV9fSW1wbCA6ICggJ3BhdGgnICkgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZV9fR3JvdXBfXzExX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjQ3MTE6MTogKCAoICd7JyApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjQ3MTI6MTogKCAneycgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NDk0MjoxOiAoICggJ3BhdGgnICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NDk0MzoxOiAoICdwYXRoJyApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo0NzEyOjE6ICggJ3snICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjQ3MTM6MjogJ3snCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo0OTQzOjE6ICggJ3BhdGgnICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjQ5NDQ6MjogJ3BhdGgnCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKLSAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldERhdGFJbnRlcmNoYW5nZUFjY2VzcygpLmdldExlZnRDdXJseUJyYWNrZXRLZXl3b3JkXzExKCkpOyAKKyAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldERhdGFJbnRlcmNoYW5nZUFjY2VzcygpLmdldFBhdGhLZXl3b3JkXzExKCkpOyAKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1hdGNoKGlucHV0LDcwLEZPTExPV18yKTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKKyAgICAgICAgICAgIG1hdGNoKGlucHV0LDc5LEZPTExPV18yKTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewotICAgICAgICAgICAgICAgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXREYXRhSW50ZXJjaGFuZ2VBY2Nlc3MoKS5nZXRMZWZ0Q3VybHlCcmFja2V0S2V5d29yZF8xMSgpKTsgCisgICAgICAgICAgICAgICBhZnRlcihncmFtbWFyQWNjZXNzLmdldERhdGFJbnRlcmNoYW5nZUFjY2VzcygpLmdldFBhdGhLZXl3b3JkXzExKCkpOyAKICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgfQpAQCAtMTczMDMsMTQgKzE4MjQ4LDE0IEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fRGF0YUludGVyY2hhbmdlX19Hcm91cF9fMTIiCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NDcyMjoxOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VfX0dyb3VwX18xMiA6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZV9fR3JvdXBfXzEyX19JbXBsIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZV9fR3JvdXBfXzEzIDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo0OTUzOjE6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZV9fR3JvdXBfXzEyIDogcnVsZV9fRGF0YUludGVyY2hhbmdlX19Hcm91cF9fMTJfX0ltcGwgcnVsZV9fRGF0YUludGVyY2hhbmdlX19Hcm91cF9fMTMgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZV9fR3JvdXBfXzEyKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjQ3MjY6MTogKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VfX0dyb3VwX18xMl9fSW1wbCBydWxlX19EYXRhSW50ZXJjaGFuZ2VfX0dyb3VwX18xMyApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo0NzI3OjI6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZV9fR3JvdXBfXzEyX19JbXBsIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZV9fR3JvdXBfXzEzCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo0OTU3OjE6ICggcnVsZV9fRGF0YUludGVyY2hhbmdlX19Hcm91cF9fMTJfX0ltcGwgcnVsZV9fRGF0YUludGVyY2hhbmdlX19Hcm91cF9fMTMgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NDk1ODoyOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VfX0dyb3VwX18xMl9fSW1wbCBydWxlX19EYXRhSW50ZXJjaGFuZ2VfX0dyb3VwX18xMwogICAgICAgICAgICAgewogICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMTgpOwogICAgICAgICAgICAgcnVsZV9fRGF0YUludGVyY2hhbmdlX19Hcm91cF9fMTJfX0ltcGwoKTsKQEAgLTE3MzQxLDUyICsxODI4NiwyNCBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX0RhdGFJbnRlcmNoYW5nZV9fR3JvdXBfXzEyX19JbXBsIgotICAgIC8vIEludGVybmFsRGF0YURTTC5nOjQ3MzQ6MTogcnVsZV9fRGF0YUludGVyY2hhbmdlX19Hcm91cF9fMTJfX0ltcGwgOiAoICggcnVsZV9fRGF0YUludGVyY2hhbmdlX19QYXRoQXNzaWdubWVudF8xMiApKiApIDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo0OTY1OjE6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZV9fR3JvdXBfXzEyX19JbXBsIDogKCAneycgKSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fRGF0YUludGVyY2hhbmdlX19Hcm91cF9fMTJfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NDczODoxOiAoICggKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VfX1BhdGhBc3NpZ25tZW50XzEyICkqICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NDczOToxOiAoICggcnVsZV9fRGF0YUludGVyY2hhbmdlX19QYXRoQXNzaWdubWVudF8xMiApKiApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo0OTY5OjE6ICggKCAneycgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo0OTcwOjE6ICggJ3snICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjQ3Mzk6MTogKCAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZV9fUGF0aEFzc2lnbm1lbnRfMTIgKSogKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NDc0MDoyOiAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZV9fUGF0aEFzc2lnbm1lbnRfMTIgKSoKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjQ5NzA6MTogKCAneycgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NDk3MToyOiAneycKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewotICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YUludGVyY2hhbmdlQWNjZXNzKCkuZ2V0UGF0aEFzc2lnbm1lbnRfMTIoKSk7IAorICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YUludGVyY2hhbmdlQWNjZXNzKCkuZ2V0TGVmdEN1cmx5QnJhY2tldEtleXdvcmRfMTIoKSk7IAogICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NDc0MToyOiAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZV9fUGF0aEFzc2lnbm1lbnRfMTIgKSoKLSAgICAgICAgICAgIGxvb3A2MToKLSAgICAgICAgICAgIGRvIHsKLSAgICAgICAgICAgICAgICBpbnQgYWx0NjE9MjsKLSAgICAgICAgICAgICAgICBpbnQgTEE2MV8wID0gaW5wdXQuTEEoMSk7Ci0KLSAgICAgICAgICAgICAgICBpZiAoIChMQTYxXzA9PTg2KSApIHsKLSAgICAgICAgICAgICAgICAgICAgYWx0NjE9MTsKLSAgICAgICAgICAgICAgICB9Ci0KLQotICAgICAgICAgICAgICAgIHN3aXRjaCAoYWx0NjEpIHsKLSAgICAgICAgICAgIAljYXNlIDEgOgotICAgICAgICAgICAgCSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo0NzQxOjM6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZV9fUGF0aEFzc2lnbm1lbnRfMTIKLSAgICAgICAgICAgIAkgICAgewotICAgICAgICAgICAgCSAgICBwdXNoRm9sbG93KEZPTExPV18xOSk7Ci0gICAgICAgICAgICAJICAgIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZV9fUGF0aEFzc2lnbm1lbnRfMTIoKTsKLQotICAgICAgICAgICAgCSAgICBzdGF0ZS5fZnNwLS07Ci0gICAgICAgICAgICAJICAgIGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7Ci0KLSAgICAgICAgICAgIAkgICAgfQotICAgICAgICAgICAgCSAgICBicmVhazsKLQotICAgICAgICAgICAgCWRlZmF1bHQgOgotICAgICAgICAgICAgCSAgICBicmVhayBsb29wNjE7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSB3aGlsZSAodHJ1ZSk7Ci0KKyAgICAgICAgICAgIG1hdGNoKGlucHV0LDc1LEZPTExPV18yKTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewotICAgICAgICAgICAgICAgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXREYXRhSW50ZXJjaGFuZ2VBY2Nlc3MoKS5nZXRQYXRoQXNzaWdubWVudF8xMigpKTsgCisgICAgICAgICAgICAgICBhZnRlcihncmFtbWFyQWNjZXNzLmdldERhdGFJbnRlcmNoYW5nZUFjY2VzcygpLmdldExlZnRDdXJseUJyYWNrZXRLZXl3b3JkXzEyKCkpOyAKICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgfQpAQCAtMTc0MTAsMjAgKzE4MzI3LDI1IEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fRGF0YUludGVyY2hhbmdlX19Hcm91cF9fMTMiCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NDc0OToxOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VfX0dyb3VwX18xMyA6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZV9fR3JvdXBfXzEzX19JbXBsIDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo0OTgwOjE6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZV9fR3JvdXBfXzEzIDogcnVsZV9fRGF0YUludGVyY2hhbmdlX19Hcm91cF9fMTNfX0ltcGwgcnVsZV9fRGF0YUludGVyY2hhbmdlX19Hcm91cF9fMTQgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZV9fR3JvdXBfXzEzKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjQ3NTM6MTogKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VfX0dyb3VwX18xM19fSW1wbCApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo0NzU0OjI6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZV9fR3JvdXBfXzEzX19JbXBsCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo0OTg0OjE6ICggcnVsZV9fRGF0YUludGVyY2hhbmdlX19Hcm91cF9fMTNfX0ltcGwgcnVsZV9fRGF0YUludGVyY2hhbmdlX19Hcm91cF9fMTQgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NDk4NToyOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VfX0dyb3VwX18xM19fSW1wbCBydWxlX19EYXRhSW50ZXJjaGFuZ2VfX0dyb3VwX18xNAogICAgICAgICAgICAgewotICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMik7CisgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV18xOCk7CiAgICAgICAgICAgICBydWxlX19EYXRhSW50ZXJjaGFuZ2VfX0dyb3VwX18xM19fSW1wbCgpOwogCiAgICAgICAgICAgICBzdGF0ZS5fZnNwLS07CiAgICAgICAgICAgICBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOworICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMik7CisgICAgICAgICAgICBydWxlX19EYXRhSW50ZXJjaGFuZ2VfX0dyb3VwX18xNCgpOworCisgICAgICAgICAgICBzdGF0ZS5fZnNwLS07CisgICAgICAgICAgICBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOwogCiAgICAgICAgICAgICB9CiAKQEAgLTE3NDQzLDI0ICsxODM2NSw1MiBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX0RhdGFJbnRlcmNoYW5nZV9fR3JvdXBfXzEzX19JbXBsIgotICAgIC8vIEludGVybmFsRGF0YURTTC5nOjQ3NjA6MTogcnVsZV9fRGF0YUludGVyY2hhbmdlX19Hcm91cF9fMTNfX0ltcGwgOiAoICd9JyApIDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo0OTkyOjE6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZV9fR3JvdXBfXzEzX19JbXBsIDogKCAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZV9fUGF0aEFzc2lnbm1lbnRfMTMgKSogKSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fRGF0YUludGVyY2hhbmdlX19Hcm91cF9fMTNfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NDc2NDoxOiAoICggJ30nICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NDc2NToxOiAoICd9JyApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo0OTk2OjE6ICggKCAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZV9fUGF0aEFzc2lnbm1lbnRfMTMgKSogKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo0OTk3OjE6ICggKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VfX1BhdGhBc3NpZ25tZW50XzEzICkqICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjQ3NjU6MTogKCAnfScgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NDc2NjoyOiAnfScKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjQ5OTc6MTogKCAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZV9fUGF0aEFzc2lnbm1lbnRfMTMgKSogKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NDk5ODoyOiAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZV9fUGF0aEFzc2lnbm1lbnRfMTMgKSoKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewotICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YUludGVyY2hhbmdlQWNjZXNzKCkuZ2V0UmlnaHRDdXJseUJyYWNrZXRLZXl3b3JkXzEzKCkpOyAKKyAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldERhdGFJbnRlcmNoYW5nZUFjY2VzcygpLmdldFBhdGhBc3NpZ25tZW50XzEzKCkpOyAKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1hdGNoKGlucHV0LDcxLEZPTExPV18yKTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjQ5OTk6MjogKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VfX1BhdGhBc3NpZ25tZW50XzEzICkqCisgICAgICAgICAgICBsb29wNjU6CisgICAgICAgICAgICBkbyB7CisgICAgICAgICAgICAgICAgaW50IGFsdDY1PTI7CisgICAgICAgICAgICAgICAgaW50IExBNjVfMCA9IGlucHV0LkxBKDEpOworCisgICAgICAgICAgICAgICAgaWYgKCAoTEE2NV8wPT05MSkgKSB7CisgICAgICAgICAgICAgICAgICAgIGFsdDY1PTE7CisgICAgICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgICAgICBzd2l0Y2ggKGFsdDY1KSB7CisgICAgICAgICAgICAJY2FzZSAxIDoKKyAgICAgICAgICAgIAkgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NDk5OTozOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VfX1BhdGhBc3NpZ25tZW50XzEzCisgICAgICAgICAgICAJICAgIHsKKyAgICAgICAgICAgIAkgICAgcHVzaEZvbGxvdyhGT0xMT1dfMTkpOworICAgICAgICAgICAgCSAgICBydWxlX19EYXRhSW50ZXJjaGFuZ2VfX1BhdGhBc3NpZ25tZW50XzEzKCk7CisKKyAgICAgICAgICAgIAkgICAgc3RhdGUuX2ZzcC0tOworICAgICAgICAgICAgCSAgICBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOworCisgICAgICAgICAgICAJICAgIH0KKyAgICAgICAgICAgIAkgICAgYnJlYWs7CisKKyAgICAgICAgICAgIAlkZWZhdWx0IDoKKyAgICAgICAgICAgIAkgICAgYnJlYWsgbG9vcDY1OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gd2hpbGUgKHRydWUpOworCiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKLSAgICAgICAgICAgICAgIGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YUludGVyY2hhbmdlQWNjZXNzKCkuZ2V0UmlnaHRDdXJseUJyYWNrZXRLZXl3b3JkXzEzKCkpOyAKKyAgICAgICAgICAgICAgIGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YUludGVyY2hhbmdlQWNjZXNzKCkuZ2V0UGF0aEFzc2lnbm1lbnRfMTMoKSk7IAogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICB9CkBAIC0xNzQ4MywxNSArMTg0MzMsODkgQEAKICAgICAvLyAkQU5UTFIgZW5kICJydWxlX19EYXRhSW50ZXJjaGFuZ2VfX0dyb3VwX18xM19fSW1wbCIKIAogCisgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19EYXRhSW50ZXJjaGFuZ2VfX0dyb3VwX18xNCIKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo1MDA3OjE6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZV9fR3JvdXBfXzE0IDogcnVsZV9fRGF0YUludGVyY2hhbmdlX19Hcm91cF9fMTRfX0ltcGwgOworICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZV9fR3JvdXBfXzE0KCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKworICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgICAgIAkKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjUwMTE6MTogKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VfX0dyb3VwX18xNF9fSW1wbCApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo1MDEyOjI6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZV9fR3JvdXBfXzE0X19JbXBsCisgICAgICAgICAgICB7CisgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV18yKTsKKyAgICAgICAgICAgIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZV9fR3JvdXBfXzE0X19JbXBsKCk7CisKKyAgICAgICAgICAgIHN0YXRlLl9mc3AtLTsKKyAgICAgICAgICAgIGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CisKKyAgICAgICAgICAgIH0KKworICAgICAgICB9CisgICAgICAgIGNhdGNoIChSZWNvZ25pdGlvbkV4Y2VwdGlvbiByZSkgeworICAgICAgICAgICAgcmVwb3J0RXJyb3IocmUpOworICAgICAgICAgICAgcmVjb3ZlcihpbnB1dCxyZSk7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisKKyAgICAgICAgICAgIAlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7CisKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gOworICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJydWxlX19EYXRhSW50ZXJjaGFuZ2VfX0dyb3VwX18xNCIKKworCisgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19EYXRhSW50ZXJjaGFuZ2VfX0dyb3VwX18xNF9fSW1wbCIKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo1MDE4OjE6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZV9fR3JvdXBfXzE0X19JbXBsIDogKCAnfScgKSA7CisgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fRGF0YUludGVyY2hhbmdlX19Hcm91cF9fMTRfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworCisgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICAgICAgCQorICAgICAgICB0cnkgeworICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NTAyMjoxOiAoICggJ30nICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NTAyMzoxOiAoICd9JyApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo1MDIzOjE6ICggJ30nICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjUwMjQ6MjogJ30nCisgICAgICAgICAgICB7CisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldERhdGFJbnRlcmNoYW5nZUFjY2VzcygpLmdldFJpZ2h0Q3VybHlCcmFja2V0S2V5d29yZF8xNCgpKTsgCisgICAgICAgICAgICB9CisgICAgICAgICAgICBtYXRjaChpbnB1dCw3NixGT0xMT1dfMik7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YUludGVyY2hhbmdlQWNjZXNzKCkuZ2V0UmlnaHRDdXJseUJyYWNrZXRLZXl3b3JkXzE0KCkpOyAKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgIH0KKworICAgICAgICB9CisgICAgICAgIGNhdGNoIChSZWNvZ25pdGlvbkV4Y2VwdGlvbiByZSkgeworICAgICAgICAgICAgcmVwb3J0RXJyb3IocmUpOworICAgICAgICAgICAgcmVjb3ZlcihpbnB1dCxyZSk7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisKKyAgICAgICAgICAgIAlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7CisKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gOworICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJydWxlX19EYXRhSW50ZXJjaGFuZ2VfX0dyb3VwX18xNF9fSW1wbCIKKworCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19EYXRhSW50ZXJjaGFuZ2VfX0dyb3VwXzNfXzAiCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NDc3NjoxOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VfX0dyb3VwXzNfXzAgOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VfX0dyb3VwXzNfXzBfX0ltcGwgcnVsZV9fRGF0YUludGVyY2hhbmdlX19Hcm91cF8zX18xIDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo1MDM0OjE6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZV9fR3JvdXBfM19fMCA6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZV9fR3JvdXBfM19fMF9fSW1wbCBydWxlX19EYXRhSW50ZXJjaGFuZ2VfX0dyb3VwXzNfXzEgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZV9fR3JvdXBfM19fMCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo0NzgwOjE6ICggcnVsZV9fRGF0YUludGVyY2hhbmdlX19Hcm91cF8zX18wX19JbXBsIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZV9fR3JvdXBfM19fMSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo0NzgxOjI6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZV9fR3JvdXBfM19fMF9fSW1wbCBydWxlX19EYXRhSW50ZXJjaGFuZ2VfX0dyb3VwXzNfXzEKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjUwMzg6MTogKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VfX0dyb3VwXzNfXzBfX0ltcGwgcnVsZV9fRGF0YUludGVyY2hhbmdlX19Hcm91cF8zX18xICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjUwMzk6MjogcnVsZV9fRGF0YUludGVyY2hhbmdlX19Hcm91cF8zX18wX19JbXBsIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZV9fR3JvdXBfM19fMQogICAgICAgICAgICAgewogICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfOSk7CiAgICAgICAgICAgICBydWxlX19EYXRhSW50ZXJjaGFuZ2VfX0dyb3VwXzNfXzBfX0ltcGwoKTsKQEAgLTE3NTIyLDIzICsxODU0NiwyMyBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX0RhdGFJbnRlcmNoYW5nZV9fR3JvdXBfM19fMF9fSW1wbCIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo0Nzg4OjE6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZV9fR3JvdXBfM19fMF9fSW1wbCA6ICggKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VfX0Rlc2NyaXB0aW9uQXNzaWdubWVudF8zXzAgKSApIDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo1MDQ2OjE6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZV9fR3JvdXBfM19fMF9fSW1wbCA6ICggKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VfX0Rlc2NyaXB0aW9uQXNzaWdubWVudF8zXzAgKSApIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19EYXRhSW50ZXJjaGFuZ2VfX0dyb3VwXzNfXzBfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NDc5MjoxOiAoICggKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VfX0Rlc2NyaXB0aW9uQXNzaWdubWVudF8zXzAgKSApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjQ3OTM6MTogKCAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZV9fRGVzY3JpcHRpb25Bc3NpZ25tZW50XzNfMCApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjUwNTA6MTogKCAoICggcnVsZV9fRGF0YUludGVyY2hhbmdlX19EZXNjcmlwdGlvbkFzc2lnbm1lbnRfM18wICkgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo1MDUxOjE6ICggKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VfX0Rlc2NyaXB0aW9uQXNzaWdubWVudF8zXzAgKSApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo0NzkzOjE6ICggKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VfX0Rlc2NyaXB0aW9uQXNzaWdubWVudF8zXzAgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo0Nzk0OjI6ICggcnVsZV9fRGF0YUludGVyY2hhbmdlX19EZXNjcmlwdGlvbkFzc2lnbm1lbnRfM18wICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjUwNTE6MTogKCAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZV9fRGVzY3JpcHRpb25Bc3NpZ25tZW50XzNfMCApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjUwNTI6MjogKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VfX0Rlc2NyaXB0aW9uQXNzaWdubWVudF8zXzAgKQogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXREYXRhSW50ZXJjaGFuZ2VBY2Nlc3MoKS5nZXREZXNjcmlwdGlvbkFzc2lnbm1lbnRfM18wKCkpOyAKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjQ3OTU6MjogKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VfX0Rlc2NyaXB0aW9uQXNzaWdubWVudF8zXzAgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NDc5NTozOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VfX0Rlc2NyaXB0aW9uQXNzaWdubWVudF8zXzAKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjUwNTM6MjogKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VfX0Rlc2NyaXB0aW9uQXNzaWdubWVudF8zXzAgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NTA1MzozOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VfX0Rlc2NyaXB0aW9uQXNzaWdubWVudF8zXzAKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzIpOwogICAgICAgICAgICAgcnVsZV9fRGF0YUludGVyY2hhbmdlX19EZXNjcmlwdGlvbkFzc2lnbm1lbnRfM18wKCk7CkBAIC0xNzU3MywxNCArMTg1OTcsMTQgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19EYXRhSW50ZXJjaGFuZ2VfX0dyb3VwXzNfXzEiCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NDgwMzoxOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VfX0dyb3VwXzNfXzEgOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VfX0dyb3VwXzNfXzFfX0ltcGwgOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjUwNjE6MTogcnVsZV9fRGF0YUludGVyY2hhbmdlX19Hcm91cF8zX18xIDogcnVsZV9fRGF0YUludGVyY2hhbmdlX19Hcm91cF8zX18xX19JbXBsIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19EYXRhSW50ZXJjaGFuZ2VfX0dyb3VwXzNfXzEoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NDgwNzoxOiAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZV9fR3JvdXBfM19fMV9fSW1wbCApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo0ODA4OjI6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZV9fR3JvdXBfM19fMV9fSW1wbAorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NTA2NToxOiAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZV9fR3JvdXBfM19fMV9fSW1wbCApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo1MDY2OjI6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZV9fR3JvdXBfM19fMV9fSW1wbAogICAgICAgICAgICAgewogICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMik7CiAgICAgICAgICAgICBydWxlX19EYXRhSW50ZXJjaGFuZ2VfX0dyb3VwXzNfXzFfX0ltcGwoKTsKQEAgLTE3NjA2LDIzICsxODYzMCwyMyBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX0RhdGFJbnRlcmNoYW5nZV9fR3JvdXBfM19fMV9fSW1wbCIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo0ODE0OjE6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZV9fR3JvdXBfM19fMV9fSW1wbCA6ICggKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VfX0Rlc2NyaXB0aW9uVmFsdWVBc3NpZ25tZW50XzNfMSApICkgOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjUwNzI6MTogcnVsZV9fRGF0YUludGVyY2hhbmdlX19Hcm91cF8zX18xX19JbXBsIDogKCAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZV9fRGVzY3JpcHRpb25WYWx1ZUFzc2lnbm1lbnRfM18xICkgKSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fRGF0YUludGVyY2hhbmdlX19Hcm91cF8zX18xX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjQ4MTg6MTogKCAoICggcnVsZV9fRGF0YUludGVyY2hhbmdlX19EZXNjcmlwdGlvblZhbHVlQXNzaWdubWVudF8zXzEgKSApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjQ4MTk6MTogKCAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZV9fRGVzY3JpcHRpb25WYWx1ZUFzc2lnbm1lbnRfM18xICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NTA3NjoxOiAoICggKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VfX0Rlc2NyaXB0aW9uVmFsdWVBc3NpZ25tZW50XzNfMSApICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NTA3NzoxOiAoICggcnVsZV9fRGF0YUludGVyY2hhbmdlX19EZXNjcmlwdGlvblZhbHVlQXNzaWdubWVudF8zXzEgKSApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo0ODE5OjE6ICggKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VfX0Rlc2NyaXB0aW9uVmFsdWVBc3NpZ25tZW50XzNfMSApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjQ4MjA6MjogKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VfX0Rlc2NyaXB0aW9uVmFsdWVBc3NpZ25tZW50XzNfMSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo1MDc3OjE6ICggKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VfX0Rlc2NyaXB0aW9uVmFsdWVBc3NpZ25tZW50XzNfMSApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjUwNzg6MjogKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VfX0Rlc2NyaXB0aW9uVmFsdWVBc3NpZ25tZW50XzNfMSApCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldERhdGFJbnRlcmNoYW5nZUFjY2VzcygpLmdldERlc2NyaXB0aW9uVmFsdWVBc3NpZ25tZW50XzNfMSgpKTsgCiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo0ODIxOjI6ICggcnVsZV9fRGF0YUludGVyY2hhbmdlX19EZXNjcmlwdGlvblZhbHVlQXNzaWdubWVudF8zXzEgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NDgyMTozOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VfX0Rlc2NyaXB0aW9uVmFsdWVBc3NpZ25tZW50XzNfMQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NTA3OToyOiAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZV9fRGVzY3JpcHRpb25WYWx1ZUFzc2lnbm1lbnRfM18xICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjUwNzk6MzogcnVsZV9fRGF0YUludGVyY2hhbmdlX19EZXNjcmlwdGlvblZhbHVlQXNzaWdubWVudF8zXzEKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzIpOwogICAgICAgICAgICAgcnVsZV9fRGF0YUludGVyY2hhbmdlX19EZXNjcmlwdGlvblZhbHVlQXNzaWdubWVudF8zXzEoKTsKQEAgLTE3NjU3LDE0ICsxODY4MSwxNCBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX0RhdGFJbnRlcmNoYW5nZV9fR3JvdXBfNV9fMCIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo0ODMwOjE6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZV9fR3JvdXBfNV9fMCA6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZV9fR3JvdXBfNV9fMF9fSW1wbCBydWxlX19EYXRhSW50ZXJjaGFuZ2VfX0dyb3VwXzVfXzEgOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjUwODg6MTogcnVsZV9fRGF0YUludGVyY2hhbmdlX19Hcm91cF81X18wIDogcnVsZV9fRGF0YUludGVyY2hhbmdlX19Hcm91cF81X18wX19JbXBsIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZV9fR3JvdXBfNV9fMSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fRGF0YUludGVyY2hhbmdlX19Hcm91cF81X18wKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjQ4MzQ6MTogKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VfX0dyb3VwXzVfXzBfX0ltcGwgcnVsZV9fRGF0YUludGVyY2hhbmdlX19Hcm91cF81X18xICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjQ4MzU6MjogcnVsZV9fRGF0YUludGVyY2hhbmdlX19Hcm91cF81X18wX19JbXBsIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZV9fR3JvdXBfNV9fMQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NTA5MjoxOiAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZV9fR3JvdXBfNV9fMF9fSW1wbCBydWxlX19EYXRhSW50ZXJjaGFuZ2VfX0dyb3VwXzVfXzEgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NTA5MzoyOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VfX0dyb3VwXzVfXzBfX0ltcGwgcnVsZV9fRGF0YUludGVyY2hhbmdlX19Hcm91cF81X18xCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV185KTsKICAgICAgICAgICAgIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZV9fR3JvdXBfNV9fMF9fSW1wbCgpOwpAQCAtMTc2OTUsMjIgKzE4NzE5LDIyIEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fRGF0YUludGVyY2hhbmdlX19Hcm91cF81X18wX19JbXBsIgotICAgIC8vIEludGVybmFsRGF0YURTTC5nOjQ4NDI6MTogcnVsZV9fRGF0YUludGVyY2hhbmdlX19Hcm91cF81X18wX19JbXBsIDogKCAndmVjdG9yTmFtZScgKSA7CisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NTEwMDoxOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VfX0dyb3VwXzVfXzBfX0ltcGwgOiAoICd2ZWN0b3JOYW1lJyApIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19EYXRhSW50ZXJjaGFuZ2VfX0dyb3VwXzVfXzBfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NDg0NjoxOiAoICggJ3ZlY3Rvck5hbWUnICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NDg0NzoxOiAoICd2ZWN0b3JOYW1lJyApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo1MTA0OjE6ICggKCAndmVjdG9yTmFtZScgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo1MTA1OjE6ICggJ3ZlY3Rvck5hbWUnICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjQ4NDc6MTogKCAndmVjdG9yTmFtZScgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NDg0ODoyOiAndmVjdG9yTmFtZScKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjUxMDU6MTogKCAndmVjdG9yTmFtZScgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NTEwNjoyOiAndmVjdG9yTmFtZScKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YUludGVyY2hhbmdlQWNjZXNzKCkuZ2V0VmVjdG9yTmFtZUtleXdvcmRfNV8wKCkpOyAKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1hdGNoKGlucHV0LDc1LEZPTExPV18yKTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKKyAgICAgICAgICAgIG1hdGNoKGlucHV0LDgwLEZPTExPV18yKTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXREYXRhSW50ZXJjaGFuZ2VBY2Nlc3MoKS5nZXRWZWN0b3JOYW1lS2V5d29yZF81XzAoKSk7IAogICAgICAgICAgICAgfQpAQCAtMTc3MzYsMTQgKzE4NzYwLDE0IEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fRGF0YUludGVyY2hhbmdlX19Hcm91cF81X18xIgotICAgIC8vIEludGVybmFsRGF0YURTTC5nOjQ4NTc6MTogcnVsZV9fRGF0YUludGVyY2hhbmdlX19Hcm91cF81X18xIDogcnVsZV9fRGF0YUludGVyY2hhbmdlX19Hcm91cF81X18xX19JbXBsIDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo1MTE1OjE6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZV9fR3JvdXBfNV9fMSA6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZV9fR3JvdXBfNV9fMV9fSW1wbCA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fRGF0YUludGVyY2hhbmdlX19Hcm91cF81X18xKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjQ4NjE6MTogKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VfX0dyb3VwXzVfXzFfX0ltcGwgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NDg2MjoyOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VfX0dyb3VwXzVfXzFfX0ltcGwKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjUxMTk6MTogKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VfX0dyb3VwXzVfXzFfX0ltcGwgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NTEyMDoyOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VfX0dyb3VwXzVfXzFfX0ltcGwKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzIpOwogICAgICAgICAgICAgcnVsZV9fRGF0YUludGVyY2hhbmdlX19Hcm91cF81X18xX19JbXBsKCk7CkBAIC0xNzc2OSwyMyArMTg3OTMsMjMgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19EYXRhSW50ZXJjaGFuZ2VfX0dyb3VwXzVfXzFfX0ltcGwiCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NDg2ODoxOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VfX0dyb3VwXzVfXzFfX0ltcGwgOiAoICggcnVsZV9fRGF0YUludGVyY2hhbmdlX19WZWN0b3JOYW1lQXNzaWdubWVudF81XzEgKSApIDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo1MTI2OjE6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZV9fR3JvdXBfNV9fMV9fSW1wbCA6ICggKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VfX1ZlY3Rvck5hbWVBc3NpZ25tZW50XzVfMSApICkgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZV9fR3JvdXBfNV9fMV9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo0ODcyOjE6ICggKCAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZV9fVmVjdG9yTmFtZUFzc2lnbm1lbnRfNV8xICkgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo0ODczOjE6ICggKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VfX1ZlY3Rvck5hbWVBc3NpZ25tZW50XzVfMSApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjUxMzA6MTogKCAoICggcnVsZV9fRGF0YUludGVyY2hhbmdlX19WZWN0b3JOYW1lQXNzaWdubWVudF81XzEgKSApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjUxMzE6MTogKCAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZV9fVmVjdG9yTmFtZUFzc2lnbm1lbnRfNV8xICkgKQogICAgICAgICAgICAgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NDg3MzoxOiAoICggcnVsZV9fRGF0YUludGVyY2hhbmdlX19WZWN0b3JOYW1lQXNzaWdubWVudF81XzEgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo0ODc0OjI6ICggcnVsZV9fRGF0YUludGVyY2hhbmdlX19WZWN0b3JOYW1lQXNzaWdubWVudF81XzEgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NTEzMToxOiAoICggcnVsZV9fRGF0YUludGVyY2hhbmdlX19WZWN0b3JOYW1lQXNzaWdubWVudF81XzEgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo1MTMyOjI6ICggcnVsZV9fRGF0YUludGVyY2hhbmdlX19WZWN0b3JOYW1lQXNzaWdubWVudF81XzEgKQogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXREYXRhSW50ZXJjaGFuZ2VBY2Nlc3MoKS5nZXRWZWN0b3JOYW1lQXNzaWdubWVudF81XzEoKSk7IAogICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NDg3NToyOiAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZV9fVmVjdG9yTmFtZUFzc2lnbm1lbnRfNV8xICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjQ4NzU6MzogcnVsZV9fRGF0YUludGVyY2hhbmdlX19WZWN0b3JOYW1lQXNzaWdubWVudF81XzEKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjUxMzM6MjogKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VfX1ZlY3Rvck5hbWVBc3NpZ25tZW50XzVfMSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo1MTMzOjM6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZV9fVmVjdG9yTmFtZUFzc2lnbm1lbnRfNV8xCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV18yKTsKICAgICAgICAgICAgIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZV9fVmVjdG9yTmFtZUFzc2lnbm1lbnRfNV8xKCk7CkBAIC0xNzgyMCwxNCArMTg4NDQsMTQgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19EYXRhSW50ZXJjaGFuZ2VfX0dyb3VwXzdfXzAiCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NDg4NDoxOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VfX0dyb3VwXzdfXzAgOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VfX0dyb3VwXzdfXzBfX0ltcGwgcnVsZV9fRGF0YUludGVyY2hhbmdlX19Hcm91cF83X18xIDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo1MTQyOjE6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZV9fR3JvdXBfN19fMCA6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZV9fR3JvdXBfN19fMF9fSW1wbCBydWxlX19EYXRhSW50ZXJjaGFuZ2VfX0dyb3VwXzdfXzEgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZV9fR3JvdXBfN19fMCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo0ODg4OjE6ICggcnVsZV9fRGF0YUludGVyY2hhbmdlX19Hcm91cF83X18wX19JbXBsIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZV9fR3JvdXBfN19fMSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo0ODg5OjI6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZV9fR3JvdXBfN19fMF9fSW1wbCBydWxlX19EYXRhSW50ZXJjaGFuZ2VfX0dyb3VwXzdfXzEKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjUxNDY6MTogKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VfX0dyb3VwXzdfXzBfX0ltcGwgcnVsZV9fRGF0YUludGVyY2hhbmdlX19Hcm91cF83X18xICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjUxNDc6MjogcnVsZV9fRGF0YUludGVyY2hhbmdlX19Hcm91cF83X18wX19JbXBsIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZV9fR3JvdXBfN19fMQogICAgICAgICAgICAgewogICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMjApOwogICAgICAgICAgICAgcnVsZV9fRGF0YUludGVyY2hhbmdlX19Hcm91cF83X18wX19JbXBsKCk7CkBAIC0xNzg1OCwyMiArMTg4ODIsMjIgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19EYXRhSW50ZXJjaGFuZ2VfX0dyb3VwXzdfXzBfX0ltcGwiCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NDg5NjoxOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VfX0dyb3VwXzdfXzBfX0ltcGwgOiAoICdlbGVtZW50U2l6ZScgKSA7CisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NTE1NDoxOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VfX0dyb3VwXzdfXzBfX0ltcGwgOiAoICdlbGVtZW50U2l6ZScgKSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fRGF0YUludGVyY2hhbmdlX19Hcm91cF83X18wX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjQ5MDA6MTogKCAoICdlbGVtZW50U2l6ZScgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo0OTAxOjE6ICggJ2VsZW1lbnRTaXplJyApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo1MTU4OjE6ICggKCAnZWxlbWVudFNpemUnICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NTE1OToxOiAoICdlbGVtZW50U2l6ZScgKQogICAgICAgICAgICAgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NDkwMToxOiAoICdlbGVtZW50U2l6ZScgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NDkwMjoyOiAnZWxlbWVudFNpemUnCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo1MTU5OjE6ICggJ2VsZW1lbnRTaXplJyApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo1MTYwOjI6ICdlbGVtZW50U2l6ZScKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YUludGVyY2hhbmdlQWNjZXNzKCkuZ2V0RWxlbWVudFNpemVLZXl3b3JkXzdfMCgpKTsgCiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBtYXRjaChpbnB1dCw3NixGT0xMT1dfMik7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CisgICAgICAgICAgICBtYXRjaChpbnB1dCw4MSxGT0xMT1dfMik7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YUludGVyY2hhbmdlQWNjZXNzKCkuZ2V0RWxlbWVudFNpemVLZXl3b3JkXzdfMCgpKTsgCiAgICAgICAgICAgICB9CkBAIC0xNzg5OSwxNCArMTg5MjMsMTQgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19EYXRhSW50ZXJjaGFuZ2VfX0dyb3VwXzdfXzEiCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NDkxMToxOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VfX0dyb3VwXzdfXzEgOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VfX0dyb3VwXzdfXzFfX0ltcGwgOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjUxNjk6MTogcnVsZV9fRGF0YUludGVyY2hhbmdlX19Hcm91cF83X18xIDogcnVsZV9fRGF0YUludGVyY2hhbmdlX19Hcm91cF83X18xX19JbXBsIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19EYXRhSW50ZXJjaGFuZ2VfX0dyb3VwXzdfXzEoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NDkxNToxOiAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZV9fR3JvdXBfN19fMV9fSW1wbCApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo0OTE2OjI6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZV9fR3JvdXBfN19fMV9fSW1wbAorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NTE3MzoxOiAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZV9fR3JvdXBfN19fMV9fSW1wbCApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo1MTc0OjI6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZV9fR3JvdXBfN19fMV9fSW1wbAogICAgICAgICAgICAgewogICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMik7CiAgICAgICAgICAgICBydWxlX19EYXRhSW50ZXJjaGFuZ2VfX0dyb3VwXzdfXzFfX0ltcGwoKTsKQEAgLTE3OTMyLDIzICsxODk1NiwyMyBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX0RhdGFJbnRlcmNoYW5nZV9fR3JvdXBfN19fMV9fSW1wbCIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo0OTIyOjE6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZV9fR3JvdXBfN19fMV9fSW1wbCA6ICggKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VfX0VsZW1lbnRTaXplQXNzaWdubWVudF83XzEgKSApIDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo1MTgwOjE6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZV9fR3JvdXBfN19fMV9fSW1wbCA6ICggKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VfX0VsZW1lbnRTaXplQXNzaWdubWVudF83XzEgKSApIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19EYXRhSW50ZXJjaGFuZ2VfX0dyb3VwXzdfXzFfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NDkyNjoxOiAoICggKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VfX0VsZW1lbnRTaXplQXNzaWdubWVudF83XzEgKSApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjQ5Mjc6MTogKCAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZV9fRWxlbWVudFNpemVBc3NpZ25tZW50XzdfMSApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjUxODQ6MTogKCAoICggcnVsZV9fRGF0YUludGVyY2hhbmdlX19FbGVtZW50U2l6ZUFzc2lnbm1lbnRfN18xICkgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo1MTg1OjE6ICggKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VfX0VsZW1lbnRTaXplQXNzaWdubWVudF83XzEgKSApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo0OTI3OjE6ICggKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VfX0VsZW1lbnRTaXplQXNzaWdubWVudF83XzEgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo0OTI4OjI6ICggcnVsZV9fRGF0YUludGVyY2hhbmdlX19FbGVtZW50U2l6ZUFzc2lnbm1lbnRfN18xICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjUxODU6MTogKCAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZV9fRWxlbWVudFNpemVBc3NpZ25tZW50XzdfMSApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjUxODY6MjogKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VfX0VsZW1lbnRTaXplQXNzaWdubWVudF83XzEgKQogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXREYXRhSW50ZXJjaGFuZ2VBY2Nlc3MoKS5nZXRFbGVtZW50U2l6ZUFzc2lnbm1lbnRfN18xKCkpOyAKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjQ5Mjk6MjogKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VfX0VsZW1lbnRTaXplQXNzaWdubWVudF83XzEgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NDkyOTozOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VfX0VsZW1lbnRTaXplQXNzaWdubWVudF83XzEKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjUxODc6MjogKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VfX0VsZW1lbnRTaXplQXNzaWdubWVudF83XzEgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NTE4NzozOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VfX0VsZW1lbnRTaXplQXNzaWdubWVudF83XzEKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzIpOwogICAgICAgICAgICAgcnVsZV9fRGF0YUludGVyY2hhbmdlX19FbGVtZW50U2l6ZUFzc2lnbm1lbnRfN18xKCk7CkBAIC0xNzk4MywxNCArMTkwMDcsMTQgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19EYXRhSW50ZXJjaGFuZ2VGaWxlWE1MX19Hcm91cF9fMCIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo0OTM4OjE6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbGVYTUxfX0dyb3VwX18wIDogcnVsZV9fRGF0YUludGVyY2hhbmdlRmlsZVhNTF9fR3JvdXBfXzBfX0ltcGwgcnVsZV9fRGF0YUludGVyY2hhbmdlRmlsZVhNTF9fR3JvdXBfXzEgOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjUxOTY6MTogcnVsZV9fRGF0YUludGVyY2hhbmdlRmlsZVhNTF9fR3JvdXBfXzAgOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VGaWxlWE1MX19Hcm91cF9fMF9fSW1wbCBydWxlX19EYXRhSW50ZXJjaGFuZ2VGaWxlWE1MX19Hcm91cF9fMSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fRGF0YUludGVyY2hhbmdlRmlsZVhNTF9fR3JvdXBfXzAoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NDk0MjoxOiAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbGVYTUxfX0dyb3VwX18wX19JbXBsIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbGVYTUxfX0dyb3VwX18xICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjQ5NDM6MjogcnVsZV9fRGF0YUludGVyY2hhbmdlRmlsZVhNTF9fR3JvdXBfXzBfX0ltcGwgcnVsZV9fRGF0YUludGVyY2hhbmdlRmlsZVhNTF9fR3JvdXBfXzEKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjUyMDA6MTogKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VGaWxlWE1MX19Hcm91cF9fMF9fSW1wbCBydWxlX19EYXRhSW50ZXJjaGFuZ2VGaWxlWE1MX19Hcm91cF9fMSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo1MjAxOjI6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbGVYTUxfX0dyb3VwX18wX19JbXBsIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbGVYTUxfX0dyb3VwX18xCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV18yMSk7CiAgICAgICAgICAgICBydWxlX19EYXRhSW50ZXJjaGFuZ2VGaWxlWE1MX19Hcm91cF9fMF9fSW1wbCgpOwpAQCAtMTgwMjEsMjMgKzE5MDQ1LDIzIEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fRGF0YUludGVyY2hhbmdlRmlsZVhNTF9fR3JvdXBfXzBfX0ltcGwiCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NDk1MDoxOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VGaWxlWE1MX19Hcm91cF9fMF9fSW1wbCA6ICggKCkgKSA7CisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NTIwODoxOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VGaWxlWE1MX19Hcm91cF9fMF9fSW1wbCA6ICggKCkgKSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fRGF0YUludGVyY2hhbmdlRmlsZVhNTF9fR3JvdXBfXzBfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NDk1NDoxOiAoICggKCkgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo0OTU1OjE6ICggKCkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NTIxMjoxOiAoICggKCkgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo1MjEzOjE6ICggKCkgKQogICAgICAgICAgICAgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NDk1NToxOiAoICgpICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjQ5NTY6MjogKCkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjUyMTM6MTogKCAoKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo1MjE0OjI6ICgpCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldERhdGFJbnRlcmNoYW5nZUZpbGVYTUxBY2Nlc3MoKS5nZXREYXRhSW50ZXJjaGFuZ2VGaWxlWE1MQWN0aW9uXzAoKSk7IAogICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NDk1NzoyOiAoKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NDk1NzozOiAKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjUyMTU6MjogKCkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjUyMTU6MzogCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICB9CiAKQEAgLTE4MDYyLDE0ICsxOTA4NiwxNCBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbGVYTUxfX0dyb3VwX18xIgotICAgIC8vIEludGVybmFsRGF0YURTTC5nOjQ5NjU6MTogcnVsZV9fRGF0YUludGVyY2hhbmdlRmlsZVhNTF9fR3JvdXBfXzEgOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VGaWxlWE1MX19Hcm91cF9fMV9fSW1wbCBydWxlX19EYXRhSW50ZXJjaGFuZ2VGaWxlWE1MX19Hcm91cF9fMiA7CisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NTIyMzoxOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VGaWxlWE1MX19Hcm91cF9fMSA6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbGVYTUxfX0dyb3VwX18xX19JbXBsIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbGVYTUxfX0dyb3VwX18yIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19EYXRhSW50ZXJjaGFuZ2VGaWxlWE1MX19Hcm91cF9fMSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo0OTY5OjE6ICggcnVsZV9fRGF0YUludGVyY2hhbmdlRmlsZVhNTF9fR3JvdXBfXzFfX0ltcGwgcnVsZV9fRGF0YUludGVyY2hhbmdlRmlsZVhNTF9fR3JvdXBfXzIgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NDk3MDoyOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VGaWxlWE1MX19Hcm91cF9fMV9fSW1wbCBydWxlX19EYXRhSW50ZXJjaGFuZ2VGaWxlWE1MX19Hcm91cF9fMgorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NTIyNzoxOiAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbGVYTUxfX0dyb3VwX18xX19JbXBsIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbGVYTUxfX0dyb3VwX18yICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjUyMjg6MjogcnVsZV9fRGF0YUludGVyY2hhbmdlRmlsZVhNTF9fR3JvdXBfXzFfX0ltcGwgcnVsZV9fRGF0YUludGVyY2hhbmdlRmlsZVhNTF9fR3JvdXBfXzIKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzkpOwogICAgICAgICAgICAgcnVsZV9fRGF0YUludGVyY2hhbmdlRmlsZVhNTF9fR3JvdXBfXzFfX0ltcGwoKTsKQEAgLTE4MTAwLDIyICsxOTEyNCwyMiBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbGVYTUxfX0dyb3VwX18xX19JbXBsIgotICAgIC8vIEludGVybmFsRGF0YURTTC5nOjQ5Nzc6MTogcnVsZV9fRGF0YUludGVyY2hhbmdlRmlsZVhNTF9fR3JvdXBfXzFfX0ltcGwgOiAoICdYTUwnICkgOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjUyMzU6MTogcnVsZV9fRGF0YUludGVyY2hhbmdlRmlsZVhNTF9fR3JvdXBfXzFfX0ltcGwgOiAoICdYTUwnICkgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbGVYTUxfX0dyb3VwX18xX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjQ5ODE6MTogKCAoICdYTUwnICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NDk4MjoxOiAoICdYTUwnICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjUyMzk6MTogKCAoICdYTUwnICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NTI0MDoxOiAoICdYTUwnICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjQ5ODI6MTogKCAnWE1MJyApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo0OTgzOjI6ICdYTUwnCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo1MjQwOjE6ICggJ1hNTCcgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NTI0MToyOiAnWE1MJwogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXREYXRhSW50ZXJjaGFuZ2VGaWxlWE1MQWNjZXNzKCkuZ2V0WE1MS2V5d29yZF8xKCkpOyAKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1hdGNoKGlucHV0LDc3LEZPTExPV18yKTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKKyAgICAgICAgICAgIG1hdGNoKGlucHV0LDgyLEZPTExPV18yKTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXREYXRhSW50ZXJjaGFuZ2VGaWxlWE1MQWNjZXNzKCkuZ2V0WE1MS2V5d29yZF8xKCkpOyAKICAgICAgICAgICAgIH0KQEAgLTE4MTQxLDE0ICsxOTE2NSwxNCBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbGVYTUxfX0dyb3VwX18yIgotICAgIC8vIEludGVybmFsRGF0YURTTC5nOjQ5OTI6MTogcnVsZV9fRGF0YUludGVyY2hhbmdlRmlsZVhNTF9fR3JvdXBfXzIgOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VGaWxlWE1MX19Hcm91cF9fMl9fSW1wbCBydWxlX19EYXRhSW50ZXJjaGFuZ2VGaWxlWE1MX19Hcm91cF9fMyA7CisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NTI1MDoxOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VGaWxlWE1MX19Hcm91cF9fMiA6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbGVYTUxfX0dyb3VwX18yX19JbXBsIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbGVYTUxfX0dyb3VwX18zIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19EYXRhSW50ZXJjaGFuZ2VGaWxlWE1MX19Hcm91cF9fMigpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo0OTk2OjE6ICggcnVsZV9fRGF0YUludGVyY2hhbmdlRmlsZVhNTF9fR3JvdXBfXzJfX0ltcGwgcnVsZV9fRGF0YUludGVyY2hhbmdlRmlsZVhNTF9fR3JvdXBfXzMgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NDk5NzoyOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VGaWxlWE1MX19Hcm91cF9fMl9fSW1wbCBydWxlX19EYXRhSW50ZXJjaGFuZ2VGaWxlWE1MX19Hcm91cF9fMworICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NTI1NDoxOiAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbGVYTUxfX0dyb3VwX18yX19JbXBsIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbGVYTUxfX0dyb3VwX18zICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjUyNTU6MjogcnVsZV9fRGF0YUludGVyY2hhbmdlRmlsZVhNTF9fR3JvdXBfXzJfX0ltcGwgcnVsZV9fRGF0YUludGVyY2hhbmdlRmlsZVhNTF9fR3JvdXBfXzMKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzIyKTsKICAgICAgICAgICAgIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbGVYTUxfX0dyb3VwX18yX19JbXBsKCk7CkBAIC0xODE3OSwyMyArMTkyMDMsMjMgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19EYXRhSW50ZXJjaGFuZ2VGaWxlWE1MX19Hcm91cF9fMl9fSW1wbCIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo1MDA0OjE6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbGVYTUxfX0dyb3VwX18yX19JbXBsIDogKCAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbGVYTUxfX0ZpbGVVUkxBc3NpZ25tZW50XzIgKSApIDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo1MjYyOjE6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbGVYTUxfX0dyb3VwX18yX19JbXBsIDogKCAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbGVYTUxfX0ZpbGVVUkxBc3NpZ25tZW50XzIgKSApIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19EYXRhSW50ZXJjaGFuZ2VGaWxlWE1MX19Hcm91cF9fMl9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo1MDA4OjE6ICggKCAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbGVYTUxfX0ZpbGVVUkxBc3NpZ25tZW50XzIgKSApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjUwMDk6MTogKCAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbGVYTUxfX0ZpbGVVUkxBc3NpZ25tZW50XzIgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo1MjY2OjE6ICggKCAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbGVYTUxfX0ZpbGVVUkxBc3NpZ25tZW50XzIgKSApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjUyNjc6MTogKCAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbGVYTUxfX0ZpbGVVUkxBc3NpZ25tZW50XzIgKSApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo1MDA5OjE6ICggKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VGaWxlWE1MX19GaWxlVVJMQXNzaWdubWVudF8yICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NTAxMDoyOiAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbGVYTUxfX0ZpbGVVUkxBc3NpZ25tZW50XzIgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NTI2NzoxOiAoICggcnVsZV9fRGF0YUludGVyY2hhbmdlRmlsZVhNTF9fRmlsZVVSTEFzc2lnbm1lbnRfMiApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjUyNjg6MjogKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VGaWxlWE1MX19GaWxlVVJMQXNzaWdubWVudF8yICkKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YUludGVyY2hhbmdlRmlsZVhNTEFjY2VzcygpLmdldEZpbGVVUkxBc3NpZ25tZW50XzIoKSk7IAogICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NTAxMToyOiAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbGVYTUxfX0ZpbGVVUkxBc3NpZ25tZW50XzIgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NTAxMTozOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VGaWxlWE1MX19GaWxlVVJMQXNzaWdubWVudF8yCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo1MjY5OjI6ICggcnVsZV9fRGF0YUludGVyY2hhbmdlRmlsZVhNTF9fRmlsZVVSTEFzc2lnbm1lbnRfMiApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo1MjY5OjM6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbGVYTUxfX0ZpbGVVUkxBc3NpZ25tZW50XzIKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzIpOwogICAgICAgICAgICAgcnVsZV9fRGF0YUludGVyY2hhbmdlRmlsZVhNTF9fRmlsZVVSTEFzc2lnbm1lbnRfMigpOwpAQCAtMTgyMzAsMTQgKzE5MjU0LDE0IEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fRGF0YUludGVyY2hhbmdlRmlsZVhNTF9fR3JvdXBfXzMiCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NTAxOToxOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VGaWxlWE1MX19Hcm91cF9fMyA6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbGVYTUxfX0dyb3VwX18zX19JbXBsIDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo1Mjc3OjE6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbGVYTUxfX0dyb3VwX18zIDogcnVsZV9fRGF0YUludGVyY2hhbmdlRmlsZVhNTF9fR3JvdXBfXzNfX0ltcGwgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbGVYTUxfX0dyb3VwX18zKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjUwMjM6MTogKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VGaWxlWE1MX19Hcm91cF9fM19fSW1wbCApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo1MDI0OjI6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbGVYTUxfX0dyb3VwX18zX19JbXBsCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo1MjgxOjE6ICggcnVsZV9fRGF0YUludGVyY2hhbmdlRmlsZVhNTF9fR3JvdXBfXzNfX0ltcGwgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NTI4MjoyOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VGaWxlWE1MX19Hcm91cF9fM19fSW1wbAogICAgICAgICAgICAgewogICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMik7CiAgICAgICAgICAgICBydWxlX19EYXRhSW50ZXJjaGFuZ2VGaWxlWE1MX19Hcm91cF9fM19fSW1wbCgpOwpAQCAtMTgyNjMsMjMgKzE5Mjg3LDIzIEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fRGF0YUludGVyY2hhbmdlRmlsZVhNTF9fR3JvdXBfXzNfX0ltcGwiCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NTAzMDoxOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VGaWxlWE1MX19Hcm91cF9fM19fSW1wbCA6ICggKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VGaWxlWE1MX19Vbm9yZGVyZWRHcm91cF8zICkgKSA7CisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NTI4ODoxOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VGaWxlWE1MX19Hcm91cF9fM19fSW1wbCA6ICggKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VGaWxlWE1MX19Vbm9yZGVyZWRHcm91cF8zICkgKSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fRGF0YUludGVyY2hhbmdlRmlsZVhNTF9fR3JvdXBfXzNfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NTAzNDoxOiAoICggKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VGaWxlWE1MX19Vbm9yZGVyZWRHcm91cF8zICkgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo1MDM1OjE6ICggKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VGaWxlWE1MX19Vbm9yZGVyZWRHcm91cF8zICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NTI5MjoxOiAoICggKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VGaWxlWE1MX19Vbm9yZGVyZWRHcm91cF8zICkgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo1MjkzOjE6ICggKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VGaWxlWE1MX19Vbm9yZGVyZWRHcm91cF8zICkgKQogICAgICAgICAgICAgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NTAzNToxOiAoICggcnVsZV9fRGF0YUludGVyY2hhbmdlRmlsZVhNTF9fVW5vcmRlcmVkR3JvdXBfMyApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjUwMzY6MjogKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VGaWxlWE1MX19Vbm9yZGVyZWRHcm91cF8zICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjUyOTM6MTogKCAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbGVYTUxfX1Vub3JkZXJlZEdyb3VwXzMgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo1Mjk0OjI6ICggcnVsZV9fRGF0YUludGVyY2hhbmdlRmlsZVhNTF9fVW5vcmRlcmVkR3JvdXBfMyApCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldERhdGFJbnRlcmNoYW5nZUZpbGVYTUxBY2Nlc3MoKS5nZXRVbm9yZGVyZWRHcm91cF8zKCkpOyAKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjUwMzc6MjogKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VGaWxlWE1MX19Vbm9yZGVyZWRHcm91cF8zICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjUwMzc6MzogcnVsZV9fRGF0YUludGVyY2hhbmdlRmlsZVhNTF9fVW5vcmRlcmVkR3JvdXBfMworICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NTI5NToyOiAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbGVYTUxfX1Vub3JkZXJlZEdyb3VwXzMgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NTI5NTozOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VGaWxlWE1MX19Vbm9yZGVyZWRHcm91cF8zCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV18yKTsKICAgICAgICAgICAgIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbGVYTUxfX1Vub3JkZXJlZEdyb3VwXzMoKTsKQEAgLTE4MzE0LDE0ICsxOTMzOCwxNCBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbGVYTUxfX0dyb3VwXzNfMV9fMCIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo1MDQ2OjE6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbGVYTUxfX0dyb3VwXzNfMV9fMCA6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbGVYTUxfX0dyb3VwXzNfMV9fMF9fSW1wbCBydWxlX19EYXRhSW50ZXJjaGFuZ2VGaWxlWE1MX19Hcm91cF8zXzFfXzEgOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjUzMDQ6MTogcnVsZV9fRGF0YUludGVyY2hhbmdlRmlsZVhNTF9fR3JvdXBfM18xX18wIDogcnVsZV9fRGF0YUludGVyY2hhbmdlRmlsZVhNTF9fR3JvdXBfM18xX18wX19JbXBsIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbGVYTUxfX0dyb3VwXzNfMV9fMSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fRGF0YUludGVyY2hhbmdlRmlsZVhNTF9fR3JvdXBfM18xX18wKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjUwNTA6MTogKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VGaWxlWE1MX19Hcm91cF8zXzFfXzBfX0ltcGwgcnVsZV9fRGF0YUludGVyY2hhbmdlRmlsZVhNTF9fR3JvdXBfM18xX18xICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjUwNTE6MjogcnVsZV9fRGF0YUludGVyY2hhbmdlRmlsZVhNTF9fR3JvdXBfM18xX18wX19JbXBsIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbGVYTUxfX0dyb3VwXzNfMV9fMQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NTMwODoxOiAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbGVYTUxfX0dyb3VwXzNfMV9fMF9fSW1wbCBydWxlX19EYXRhSW50ZXJjaGFuZ2VGaWxlWE1MX19Hcm91cF8zXzFfXzEgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NTMwOToyOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VGaWxlWE1MX19Hcm91cF8zXzFfXzBfX0ltcGwgcnVsZV9fRGF0YUludGVyY2hhbmdlRmlsZVhNTF9fR3JvdXBfM18xX18xCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV185KTsKICAgICAgICAgICAgIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbGVYTUxfX0dyb3VwXzNfMV9fMF9fSW1wbCgpOwpAQCAtMTgzNTIsMjIgKzE5Mzc2LDIyIEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fRGF0YUludGVyY2hhbmdlRmlsZVhNTF9fR3JvdXBfM18xX18wX19JbXBsIgotICAgIC8vIEludGVybmFsRGF0YURTTC5nOjUwNTg6MTogcnVsZV9fRGF0YUludGVyY2hhbmdlRmlsZVhNTF9fR3JvdXBfM18xX18wX19JbXBsIDogKCAnZW5jb2RpbmcnICkgOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjUzMTY6MTogcnVsZV9fRGF0YUludGVyY2hhbmdlRmlsZVhNTF9fR3JvdXBfM18xX18wX19JbXBsIDogKCAnZW5jb2RpbmcnICkgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbGVYTUxfX0dyb3VwXzNfMV9fMF9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo1MDYyOjE6ICggKCAnZW5jb2RpbmcnICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NTA2MzoxOiAoICdlbmNvZGluZycgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NTMyMDoxOiAoICggJ2VuY29kaW5nJyApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjUzMjE6MTogKCAnZW5jb2RpbmcnICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjUwNjM6MTogKCAnZW5jb2RpbmcnICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjUwNjQ6MjogJ2VuY29kaW5nJworICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NTMyMToxOiAoICdlbmNvZGluZycgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NTMyMjoyOiAnZW5jb2RpbmcnCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldERhdGFJbnRlcmNoYW5nZUZpbGVYTUxBY2Nlc3MoKS5nZXRFbmNvZGluZ0tleXdvcmRfM18xXzAoKSk7IAogICAgICAgICAgICAgfQotICAgICAgICAgICAgbWF0Y2goaW5wdXQsNzgsRk9MTE9XXzIpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOworICAgICAgICAgICAgbWF0Y2goaW5wdXQsODMsRk9MTE9XXzIpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOwogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBhZnRlcihncmFtbWFyQWNjZXNzLmdldERhdGFJbnRlcmNoYW5nZUZpbGVYTUxBY2Nlc3MoKS5nZXRFbmNvZGluZ0tleXdvcmRfM18xXzAoKSk7IAogICAgICAgICAgICAgfQpAQCAtMTgzOTMsMTQgKzE5NDE3LDE0IEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fRGF0YUludGVyY2hhbmdlRmlsZVhNTF9fR3JvdXBfM18xX18xIgotICAgIC8vIEludGVybmFsRGF0YURTTC5nOjUwNzM6MTogcnVsZV9fRGF0YUludGVyY2hhbmdlRmlsZVhNTF9fR3JvdXBfM18xX18xIDogcnVsZV9fRGF0YUludGVyY2hhbmdlRmlsZVhNTF9fR3JvdXBfM18xX18xX19JbXBsIDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo1MzMxOjE6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbGVYTUxfX0dyb3VwXzNfMV9fMSA6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbGVYTUxfX0dyb3VwXzNfMV9fMV9fSW1wbCA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fRGF0YUludGVyY2hhbmdlRmlsZVhNTF9fR3JvdXBfM18xX18xKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjUwNzc6MTogKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VGaWxlWE1MX19Hcm91cF8zXzFfXzFfX0ltcGwgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NTA3ODoyOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VGaWxlWE1MX19Hcm91cF8zXzFfXzFfX0ltcGwKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjUzMzU6MTogKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VGaWxlWE1MX19Hcm91cF8zXzFfXzFfX0ltcGwgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NTMzNjoyOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VGaWxlWE1MX19Hcm91cF8zXzFfXzFfX0ltcGwKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzIpOwogICAgICAgICAgICAgcnVsZV9fRGF0YUludGVyY2hhbmdlRmlsZVhNTF9fR3JvdXBfM18xX18xX19JbXBsKCk7CkBAIC0xODQyNiwyMyArMTk0NTAsMjMgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19EYXRhSW50ZXJjaGFuZ2VGaWxlWE1MX19Hcm91cF8zXzFfXzFfX0ltcGwiCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NTA4NDoxOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VGaWxlWE1MX19Hcm91cF8zXzFfXzFfX0ltcGwgOiAoICggcnVsZV9fRGF0YUludGVyY2hhbmdlRmlsZVhNTF9fRW5jb2RpbmdBc3NpZ25tZW50XzNfMV8xICkgKSA7CisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NTM0MjoxOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VGaWxlWE1MX19Hcm91cF8zXzFfXzFfX0ltcGwgOiAoICggcnVsZV9fRGF0YUludGVyY2hhbmdlRmlsZVhNTF9fRW5jb2RpbmdBc3NpZ25tZW50XzNfMV8xICkgKSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fRGF0YUludGVyY2hhbmdlRmlsZVhNTF9fR3JvdXBfM18xX18xX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjUwODg6MTogKCAoICggcnVsZV9fRGF0YUludGVyY2hhbmdlRmlsZVhNTF9fRW5jb2RpbmdBc3NpZ25tZW50XzNfMV8xICkgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo1MDg5OjE6ICggKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VGaWxlWE1MX19FbmNvZGluZ0Fzc2lnbm1lbnRfM18xXzEgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo1MzQ2OjE6ICggKCAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbGVYTUxfX0VuY29kaW5nQXNzaWdubWVudF8zXzFfMSApICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NTM0NzoxOiAoICggcnVsZV9fRGF0YUludGVyY2hhbmdlRmlsZVhNTF9fRW5jb2RpbmdBc3NpZ25tZW50XzNfMV8xICkgKQogICAgICAgICAgICAgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NTA4OToxOiAoICggcnVsZV9fRGF0YUludGVyY2hhbmdlRmlsZVhNTF9fRW5jb2RpbmdBc3NpZ25tZW50XzNfMV8xICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NTA5MDoyOiAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbGVYTUxfX0VuY29kaW5nQXNzaWdubWVudF8zXzFfMSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo1MzQ3OjE6ICggKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VGaWxlWE1MX19FbmNvZGluZ0Fzc2lnbm1lbnRfM18xXzEgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo1MzQ4OjI6ICggcnVsZV9fRGF0YUludGVyY2hhbmdlRmlsZVhNTF9fRW5jb2RpbmdBc3NpZ25tZW50XzNfMV8xICkKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YUludGVyY2hhbmdlRmlsZVhNTEFjY2VzcygpLmdldEVuY29kaW5nQXNzaWdubWVudF8zXzFfMSgpKTsgCiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo1MDkxOjI6ICggcnVsZV9fRGF0YUludGVyY2hhbmdlRmlsZVhNTF9fRW5jb2RpbmdBc3NpZ25tZW50XzNfMV8xICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjUwOTE6MzogcnVsZV9fRGF0YUludGVyY2hhbmdlRmlsZVhNTF9fRW5jb2RpbmdBc3NpZ25tZW50XzNfMV8xCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo1MzQ5OjI6ICggcnVsZV9fRGF0YUludGVyY2hhbmdlRmlsZVhNTF9fRW5jb2RpbmdBc3NpZ25tZW50XzNfMV8xICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjUzNDk6MzogcnVsZV9fRGF0YUludGVyY2hhbmdlRmlsZVhNTF9fRW5jb2RpbmdBc3NpZ25tZW50XzNfMV8xCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV18yKTsKICAgICAgICAgICAgIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbGVYTUxfX0VuY29kaW5nQXNzaWdubWVudF8zXzFfMSgpOwpAQCAtMTg0NzcsMTQgKzE5NTAxLDE0IEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fRGF0YUludGVyY2hhbmdlRmlsZVhNTF9fR3JvdXBfM18yX18wIgotICAgIC8vIEludGVybmFsRGF0YURTTC5nOjUxMDA6MTogcnVsZV9fRGF0YUludGVyY2hhbmdlRmlsZVhNTF9fR3JvdXBfM18yX18wIDogcnVsZV9fRGF0YUludGVyY2hhbmdlRmlsZVhNTF9fR3JvdXBfM18yX18wX19JbXBsIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbGVYTUxfX0dyb3VwXzNfMl9fMSA7CisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NTM1ODoxOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VGaWxlWE1MX19Hcm91cF8zXzJfXzAgOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VGaWxlWE1MX19Hcm91cF8zXzJfXzBfX0ltcGwgcnVsZV9fRGF0YUludGVyY2hhbmdlRmlsZVhNTF9fR3JvdXBfM18yX18xIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19EYXRhSW50ZXJjaGFuZ2VGaWxlWE1MX19Hcm91cF8zXzJfXzAoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NTEwNDoxOiAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbGVYTUxfX0dyb3VwXzNfMl9fMF9fSW1wbCBydWxlX19EYXRhSW50ZXJjaGFuZ2VGaWxlWE1MX19Hcm91cF8zXzJfXzEgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NTEwNToyOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VGaWxlWE1MX19Hcm91cF8zXzJfXzBfX0ltcGwgcnVsZV9fRGF0YUludGVyY2hhbmdlRmlsZVhNTF9fR3JvdXBfM18yX18xCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo1MzYyOjE6ICggcnVsZV9fRGF0YUludGVyY2hhbmdlRmlsZVhNTF9fR3JvdXBfM18yX18wX19JbXBsIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbGVYTUxfX0dyb3VwXzNfMl9fMSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo1MzYzOjI6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbGVYTUxfX0dyb3VwXzNfMl9fMF9fSW1wbCBydWxlX19EYXRhSW50ZXJjaGFuZ2VGaWxlWE1MX19Hcm91cF8zXzJfXzEKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzkpOwogICAgICAgICAgICAgcnVsZV9fRGF0YUludGVyY2hhbmdlRmlsZVhNTF9fR3JvdXBfM18yX18wX19JbXBsKCk7CkBAIC0xODUxNSwyMiArMTk1MzksMjIgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19EYXRhSW50ZXJjaGFuZ2VGaWxlWE1MX19Hcm91cF8zXzJfXzBfX0ltcGwiCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NTExMjoxOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VGaWxlWE1MX19Hcm91cF8zXzJfXzBfX0ltcGwgOiAoICdsb2NhbGUnICkgOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjUzNzA6MTogcnVsZV9fRGF0YUludGVyY2hhbmdlRmlsZVhNTF9fR3JvdXBfM18yX18wX19JbXBsIDogKCAnbG9jYWxlJyApIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19EYXRhSW50ZXJjaGFuZ2VGaWxlWE1MX19Hcm91cF8zXzJfXzBfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NTExNjoxOiAoICggJ2xvY2FsZScgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo1MTE3OjE6ICggJ2xvY2FsZScgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NTM3NDoxOiAoICggJ2xvY2FsZScgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo1Mzc1OjE6ICggJ2xvY2FsZScgKQogICAgICAgICAgICAgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NTExNzoxOiAoICdsb2NhbGUnICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjUxMTg6MjogJ2xvY2FsZScKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjUzNzU6MTogKCAnbG9jYWxlJyApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo1Mzc2OjI6ICdsb2NhbGUnCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldERhdGFJbnRlcmNoYW5nZUZpbGVYTUxBY2Nlc3MoKS5nZXRMb2NhbGVLZXl3b3JkXzNfMl8wKCkpOyAKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1hdGNoKGlucHV0LDc5LEZPTExPV18yKTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKKyAgICAgICAgICAgIG1hdGNoKGlucHV0LDg0LEZPTExPV18yKTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXREYXRhSW50ZXJjaGFuZ2VGaWxlWE1MQWNjZXNzKCkuZ2V0TG9jYWxlS2V5d29yZF8zXzJfMCgpKTsgCiAgICAgICAgICAgICB9CkBAIC0xODU1NiwxNCArMTk1ODAsMTQgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19EYXRhSW50ZXJjaGFuZ2VGaWxlWE1MX19Hcm91cF8zXzJfXzEiCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NTEyNzoxOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VGaWxlWE1MX19Hcm91cF8zXzJfXzEgOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VGaWxlWE1MX19Hcm91cF8zXzJfXzFfX0ltcGwgOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjUzODU6MTogcnVsZV9fRGF0YUludGVyY2hhbmdlRmlsZVhNTF9fR3JvdXBfM18yX18xIDogcnVsZV9fRGF0YUludGVyY2hhbmdlRmlsZVhNTF9fR3JvdXBfM18yX18xX19JbXBsIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19EYXRhSW50ZXJjaGFuZ2VGaWxlWE1MX19Hcm91cF8zXzJfXzEoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NTEzMToxOiAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbGVYTUxfX0dyb3VwXzNfMl9fMV9fSW1wbCApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo1MTMyOjI6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbGVYTUxfX0dyb3VwXzNfMl9fMV9fSW1wbAorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NTM4OToxOiAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbGVYTUxfX0dyb3VwXzNfMl9fMV9fSW1wbCApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo1MzkwOjI6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbGVYTUxfX0dyb3VwXzNfMl9fMV9fSW1wbAogICAgICAgICAgICAgewogICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMik7CiAgICAgICAgICAgICBydWxlX19EYXRhSW50ZXJjaGFuZ2VGaWxlWE1MX19Hcm91cF8zXzJfXzFfX0ltcGwoKTsKQEAgLTE4NTg5LDIzICsxOTYxMywyMyBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbGVYTUxfX0dyb3VwXzNfMl9fMV9fSW1wbCIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo1MTM4OjE6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbGVYTUxfX0dyb3VwXzNfMl9fMV9fSW1wbCA6ICggKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VGaWxlWE1MX19Mb2NhbGVBc3NpZ25tZW50XzNfMl8xICkgKSA7CisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NTM5NjoxOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VGaWxlWE1MX19Hcm91cF8zXzJfXzFfX0ltcGwgOiAoICggcnVsZV9fRGF0YUludGVyY2hhbmdlRmlsZVhNTF9fTG9jYWxlQXNzaWdubWVudF8zXzJfMSApICkgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbGVYTUxfX0dyb3VwXzNfMl9fMV9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo1MTQyOjE6ICggKCAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbGVYTUxfX0xvY2FsZUFzc2lnbm1lbnRfM18yXzEgKSApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjUxNDM6MTogKCAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbGVYTUxfX0xvY2FsZUFzc2lnbm1lbnRfM18yXzEgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo1NDAwOjE6ICggKCAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbGVYTUxfX0xvY2FsZUFzc2lnbm1lbnRfM18yXzEgKSApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjU0MDE6MTogKCAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbGVYTUxfX0xvY2FsZUFzc2lnbm1lbnRfM18yXzEgKSApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo1MTQzOjE6ICggKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VGaWxlWE1MX19Mb2NhbGVBc3NpZ25tZW50XzNfMl8xICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NTE0NDoyOiAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbGVYTUxfX0xvY2FsZUFzc2lnbm1lbnRfM18yXzEgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NTQwMToxOiAoICggcnVsZV9fRGF0YUludGVyY2hhbmdlRmlsZVhNTF9fTG9jYWxlQXNzaWdubWVudF8zXzJfMSApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjU0MDI6MjogKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VGaWxlWE1MX19Mb2NhbGVBc3NpZ25tZW50XzNfMl8xICkKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YUludGVyY2hhbmdlRmlsZVhNTEFjY2VzcygpLmdldExvY2FsZUFzc2lnbm1lbnRfM18yXzEoKSk7IAogICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NTE0NToyOiAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbGVYTUxfX0xvY2FsZUFzc2lnbm1lbnRfM18yXzEgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NTE0NTozOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VGaWxlWE1MX19Mb2NhbGVBc3NpZ25tZW50XzNfMl8xCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo1NDAzOjI6ICggcnVsZV9fRGF0YUludGVyY2hhbmdlRmlsZVhNTF9fTG9jYWxlQXNzaWdubWVudF8zXzJfMSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo1NDAzOjM6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbGVYTUxfX0xvY2FsZUFzc2lnbm1lbnRfM18yXzEKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzIpOwogICAgICAgICAgICAgcnVsZV9fRGF0YUludGVyY2hhbmdlRmlsZVhNTF9fTG9jYWxlQXNzaWdubWVudF8zXzJfMSgpOwpAQCAtMTg2NDAsMTQgKzE5NjY0LDE0IEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fRGF0YUludGVyY2hhbmdlRmlsZUNTVl9fR3JvdXBfXzAiCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NTE1NDoxOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VGaWxlQ1NWX19Hcm91cF9fMCA6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbGVDU1ZfX0dyb3VwX18wX19JbXBsIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbGVDU1ZfX0dyb3VwX18xIDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo1NDEyOjE6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbGVDU1ZfX0dyb3VwX18wIDogcnVsZV9fRGF0YUludGVyY2hhbmdlRmlsZUNTVl9fR3JvdXBfXzBfX0ltcGwgcnVsZV9fRGF0YUludGVyY2hhbmdlRmlsZUNTVl9fR3JvdXBfXzEgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbGVDU1ZfX0dyb3VwX18wKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjUxNTg6MTogKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VGaWxlQ1NWX19Hcm91cF9fMF9fSW1wbCBydWxlX19EYXRhSW50ZXJjaGFuZ2VGaWxlQ1NWX19Hcm91cF9fMSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo1MTU5OjI6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbGVDU1ZfX0dyb3VwX18wX19JbXBsIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbGVDU1ZfX0dyb3VwX18xCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo1NDE2OjE6ICggcnVsZV9fRGF0YUludGVyY2hhbmdlRmlsZUNTVl9fR3JvdXBfXzBfX0ltcGwgcnVsZV9fRGF0YUludGVyY2hhbmdlRmlsZUNTVl9fR3JvdXBfXzEgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NTQxNzoyOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VGaWxlQ1NWX19Hcm91cF9fMF9fSW1wbCBydWxlX19EYXRhSW50ZXJjaGFuZ2VGaWxlQ1NWX19Hcm91cF9fMQogICAgICAgICAgICAgewogICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMjMpOwogICAgICAgICAgICAgcnVsZV9fRGF0YUludGVyY2hhbmdlRmlsZUNTVl9fR3JvdXBfXzBfX0ltcGwoKTsKQEAgLTE4Njc4LDIzICsxOTcwMiwyMyBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbGVDU1ZfX0dyb3VwX18wX19JbXBsIgotICAgIC8vIEludGVybmFsRGF0YURTTC5nOjUxNjY6MTogcnVsZV9fRGF0YUludGVyY2hhbmdlRmlsZUNTVl9fR3JvdXBfXzBfX0ltcGwgOiAoICgpICkgOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjU0MjQ6MTogcnVsZV9fRGF0YUludGVyY2hhbmdlRmlsZUNTVl9fR3JvdXBfXzBfX0ltcGwgOiAoICgpICkgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbGVDU1ZfX0dyb3VwX18wX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjUxNzA6MTogKCAoICgpICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NTE3MToxOiAoICgpICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjU0Mjg6MTogKCAoICgpICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NTQyOToxOiAoICgpICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjUxNzE6MTogKCAoKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo1MTcyOjI6ICgpCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo1NDI5OjE6ICggKCkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NTQzMDoyOiAoKQogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXREYXRhSW50ZXJjaGFuZ2VGaWxlQ1NWQWNjZXNzKCkuZ2V0RGF0YUludGVyY2hhbmdlRmlsZUNTVkFjdGlvbl8wKCkpOyAKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjUxNzM6MjogKCkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjUxNzM6MzogCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo1NDMxOjI6ICgpCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo1NDMxOjM6IAogICAgICAgICAgICAgewogICAgICAgICAgICAgfQogCkBAIC0xODcxOSwxNCArMTk3NDMsMTQgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19EYXRhSW50ZXJjaGFuZ2VGaWxlQ1NWX19Hcm91cF9fMSIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo1MTgxOjE6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbGVDU1ZfX0dyb3VwX18xIDogcnVsZV9fRGF0YUludGVyY2hhbmdlRmlsZUNTVl9fR3JvdXBfXzFfX0ltcGwgcnVsZV9fRGF0YUludGVyY2hhbmdlRmlsZUNTVl9fR3JvdXBfXzIgOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjU0Mzk6MTogcnVsZV9fRGF0YUludGVyY2hhbmdlRmlsZUNTVl9fR3JvdXBfXzEgOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VGaWxlQ1NWX19Hcm91cF9fMV9fSW1wbCBydWxlX19EYXRhSW50ZXJjaGFuZ2VGaWxlQ1NWX19Hcm91cF9fMiA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fRGF0YUludGVyY2hhbmdlRmlsZUNTVl9fR3JvdXBfXzEoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NTE4NToxOiAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbGVDU1ZfX0dyb3VwX18xX19JbXBsIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbGVDU1ZfX0dyb3VwX18yICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjUxODY6MjogcnVsZV9fRGF0YUludGVyY2hhbmdlRmlsZUNTVl9fR3JvdXBfXzFfX0ltcGwgcnVsZV9fRGF0YUludGVyY2hhbmdlRmlsZUNTVl9fR3JvdXBfXzIKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjU0NDM6MTogKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VGaWxlQ1NWX19Hcm91cF9fMV9fSW1wbCBydWxlX19EYXRhSW50ZXJjaGFuZ2VGaWxlQ1NWX19Hcm91cF9fMiApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo1NDQ0OjI6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbGVDU1ZfX0dyb3VwX18xX19JbXBsIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbGVDU1ZfX0dyb3VwX18yCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV185KTsKICAgICAgICAgICAgIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbGVDU1ZfX0dyb3VwX18xX19JbXBsKCk7CkBAIC0xODc1NywyMiArMTk3ODEsMjIgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19EYXRhSW50ZXJjaGFuZ2VGaWxlQ1NWX19Hcm91cF9fMV9fSW1wbCIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo1MTkzOjE6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbGVDU1ZfX0dyb3VwX18xX19JbXBsIDogKCAnQ1NWJyApIDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo1NDUxOjE6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbGVDU1ZfX0dyb3VwX18xX19JbXBsIDogKCAnQ1NWJyApIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19EYXRhSW50ZXJjaGFuZ2VGaWxlQ1NWX19Hcm91cF9fMV9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo1MTk3OjE6ICggKCAnQ1NWJyApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjUxOTg6MTogKCAnQ1NWJyApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo1NDU1OjE6ICggKCAnQ1NWJyApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjU0NTY6MTogKCAnQ1NWJyApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo1MTk4OjE6ICggJ0NTVicgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NTE5OToyOiAnQ1NWJworICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NTQ1NjoxOiAoICdDU1YnICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjU0NTc6MjogJ0NTVicKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YUludGVyY2hhbmdlRmlsZUNTVkFjY2VzcygpLmdldENTVktleXdvcmRfMSgpKTsgCiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBtYXRjaChpbnB1dCw4MCxGT0xMT1dfMik7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CisgICAgICAgICAgICBtYXRjaChpbnB1dCw4NSxGT0xMT1dfMik7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YUludGVyY2hhbmdlRmlsZUNTVkFjY2VzcygpLmdldENTVktleXdvcmRfMSgpKTsgCiAgICAgICAgICAgICB9CkBAIC0xODc5OCwxNCArMTk4MjIsMTQgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19EYXRhSW50ZXJjaGFuZ2VGaWxlQ1NWX19Hcm91cF9fMiIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo1MjA4OjE6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbGVDU1ZfX0dyb3VwX18yIDogcnVsZV9fRGF0YUludGVyY2hhbmdlRmlsZUNTVl9fR3JvdXBfXzJfX0ltcGwgcnVsZV9fRGF0YUludGVyY2hhbmdlRmlsZUNTVl9fR3JvdXBfXzMgOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjU0NjY6MTogcnVsZV9fRGF0YUludGVyY2hhbmdlRmlsZUNTVl9fR3JvdXBfXzIgOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VGaWxlQ1NWX19Hcm91cF9fMl9fSW1wbCBydWxlX19EYXRhSW50ZXJjaGFuZ2VGaWxlQ1NWX19Hcm91cF9fMyA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fRGF0YUludGVyY2hhbmdlRmlsZUNTVl9fR3JvdXBfXzIoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NTIxMjoxOiAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbGVDU1ZfX0dyb3VwX18yX19JbXBsIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbGVDU1ZfX0dyb3VwX18zICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjUyMTM6MjogcnVsZV9fRGF0YUludGVyY2hhbmdlRmlsZUNTVl9fR3JvdXBfXzJfX0ltcGwgcnVsZV9fRGF0YUludGVyY2hhbmdlRmlsZUNTVl9fR3JvdXBfXzMKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjU0NzA6MTogKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VGaWxlQ1NWX19Hcm91cF9fMl9fSW1wbCBydWxlX19EYXRhSW50ZXJjaGFuZ2VGaWxlQ1NWX19Hcm91cF9fMyApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo1NDcxOjI6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbGVDU1ZfX0dyb3VwX18yX19JbXBsIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbGVDU1ZfX0dyb3VwX18zCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV18yNCk7CiAgICAgICAgICAgICBydWxlX19EYXRhSW50ZXJjaGFuZ2VGaWxlQ1NWX19Hcm91cF9fMl9fSW1wbCgpOwpAQCAtMTg4MzYsMjMgKzE5ODYwLDIzIEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fRGF0YUludGVyY2hhbmdlRmlsZUNTVl9fR3JvdXBfXzJfX0ltcGwiCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NTIyMDoxOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VGaWxlQ1NWX19Hcm91cF9fMl9fSW1wbCA6ICggKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VGaWxlQ1NWX19GaWxlVVJMQXNzaWdubWVudF8yICkgKSA7CisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NTQ3ODoxOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VGaWxlQ1NWX19Hcm91cF9fMl9fSW1wbCA6ICggKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VGaWxlQ1NWX19GaWxlVVJMQXNzaWdubWVudF8yICkgKSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fRGF0YUludGVyY2hhbmdlRmlsZUNTVl9fR3JvdXBfXzJfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NTIyNDoxOiAoICggKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VGaWxlQ1NWX19GaWxlVVJMQXNzaWdubWVudF8yICkgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo1MjI1OjE6ICggKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VGaWxlQ1NWX19GaWxlVVJMQXNzaWdubWVudF8yICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NTQ4MjoxOiAoICggKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VGaWxlQ1NWX19GaWxlVVJMQXNzaWdubWVudF8yICkgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo1NDgzOjE6ICggKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VGaWxlQ1NWX19GaWxlVVJMQXNzaWdubWVudF8yICkgKQogICAgICAgICAgICAgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NTIyNToxOiAoICggcnVsZV9fRGF0YUludGVyY2hhbmdlRmlsZUNTVl9fRmlsZVVSTEFzc2lnbm1lbnRfMiApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjUyMjY6MjogKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VGaWxlQ1NWX19GaWxlVVJMQXNzaWdubWVudF8yICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjU0ODM6MTogKCAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbGVDU1ZfX0ZpbGVVUkxBc3NpZ25tZW50XzIgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo1NDg0OjI6ICggcnVsZV9fRGF0YUludGVyY2hhbmdlRmlsZUNTVl9fRmlsZVVSTEFzc2lnbm1lbnRfMiApCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldERhdGFJbnRlcmNoYW5nZUZpbGVDU1ZBY2Nlc3MoKS5nZXRGaWxlVVJMQXNzaWdubWVudF8yKCkpOyAKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjUyMjc6MjogKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VGaWxlQ1NWX19GaWxlVVJMQXNzaWdubWVudF8yICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjUyMjc6MzogcnVsZV9fRGF0YUludGVyY2hhbmdlRmlsZUNTVl9fRmlsZVVSTEFzc2lnbm1lbnRfMgorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NTQ4NToyOiAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbGVDU1ZfX0ZpbGVVUkxBc3NpZ25tZW50XzIgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NTQ4NTozOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VGaWxlQ1NWX19GaWxlVVJMQXNzaWdubWVudF8yCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV18yKTsKICAgICAgICAgICAgIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbGVDU1ZfX0ZpbGVVUkxBc3NpZ25tZW50XzIoKTsKQEAgLTE4ODg3LDE0ICsxOTkxMSwxNCBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbGVDU1ZfX0dyb3VwX18zIgotICAgIC8vIEludGVybmFsRGF0YURTTC5nOjUyMzU6MTogcnVsZV9fRGF0YUludGVyY2hhbmdlRmlsZUNTVl9fR3JvdXBfXzMgOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VGaWxlQ1NWX19Hcm91cF9fM19fSW1wbCA7CisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NTQ5MzoxOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VGaWxlQ1NWX19Hcm91cF9fMyA6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbGVDU1ZfX0dyb3VwX18zX19JbXBsIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19EYXRhSW50ZXJjaGFuZ2VGaWxlQ1NWX19Hcm91cF9fMygpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo1MjM5OjE6ICggcnVsZV9fRGF0YUludGVyY2hhbmdlRmlsZUNTVl9fR3JvdXBfXzNfX0ltcGwgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NTI0MDoyOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VGaWxlQ1NWX19Hcm91cF9fM19fSW1wbAorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NTQ5NzoxOiAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbGVDU1ZfX0dyb3VwX18zX19JbXBsICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjU0OTg6MjogcnVsZV9fRGF0YUludGVyY2hhbmdlRmlsZUNTVl9fR3JvdXBfXzNfX0ltcGwKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzIpOwogICAgICAgICAgICAgcnVsZV9fRGF0YUludGVyY2hhbmdlRmlsZUNTVl9fR3JvdXBfXzNfX0ltcGwoKTsKQEAgLTE4OTIwLDIzICsxOTk0NCwyMyBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbGVDU1ZfX0dyb3VwX18zX19JbXBsIgotICAgIC8vIEludGVybmFsRGF0YURTTC5nOjUyNDY6MTogcnVsZV9fRGF0YUludGVyY2hhbmdlRmlsZUNTVl9fR3JvdXBfXzNfX0ltcGwgOiAoICggcnVsZV9fRGF0YUludGVyY2hhbmdlRmlsZUNTVl9fVW5vcmRlcmVkR3JvdXBfMyApICkgOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjU1MDQ6MTogcnVsZV9fRGF0YUludGVyY2hhbmdlRmlsZUNTVl9fR3JvdXBfXzNfX0ltcGwgOiAoICggcnVsZV9fRGF0YUludGVyY2hhbmdlRmlsZUNTVl9fVW5vcmRlcmVkR3JvdXBfMyApICkgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbGVDU1ZfX0dyb3VwX18zX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjUyNTA6MTogKCAoICggcnVsZV9fRGF0YUludGVyY2hhbmdlRmlsZUNTVl9fVW5vcmRlcmVkR3JvdXBfMyApICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NTI1MToxOiAoICggcnVsZV9fRGF0YUludGVyY2hhbmdlRmlsZUNTVl9fVW5vcmRlcmVkR3JvdXBfMyApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjU1MDg6MTogKCAoICggcnVsZV9fRGF0YUludGVyY2hhbmdlRmlsZUNTVl9fVW5vcmRlcmVkR3JvdXBfMyApICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NTUwOToxOiAoICggcnVsZV9fRGF0YUludGVyY2hhbmdlRmlsZUNTVl9fVW5vcmRlcmVkR3JvdXBfMyApICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjUyNTE6MTogKCAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbGVDU1ZfX1Vub3JkZXJlZEdyb3VwXzMgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo1MjUyOjI6ICggcnVsZV9fRGF0YUludGVyY2hhbmdlRmlsZUNTVl9fVW5vcmRlcmVkR3JvdXBfMyApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo1NTA5OjE6ICggKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VGaWxlQ1NWX19Vbm9yZGVyZWRHcm91cF8zICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NTUxMDoyOiAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbGVDU1ZfX1Vub3JkZXJlZEdyb3VwXzMgKQogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXREYXRhSW50ZXJjaGFuZ2VGaWxlQ1NWQWNjZXNzKCkuZ2V0VW5vcmRlcmVkR3JvdXBfMygpKTsgCiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo1MjUzOjI6ICggcnVsZV9fRGF0YUludGVyY2hhbmdlRmlsZUNTVl9fVW5vcmRlcmVkR3JvdXBfMyApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo1MjUzOjM6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbGVDU1ZfX1Vub3JkZXJlZEdyb3VwXzMKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjU1MTE6MjogKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VGaWxlQ1NWX19Vbm9yZGVyZWRHcm91cF8zICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjU1MTE6MzogcnVsZV9fRGF0YUludGVyY2hhbmdlRmlsZUNTVl9fVW5vcmRlcmVkR3JvdXBfMwogICAgICAgICAgICAgewogICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMik7CiAgICAgICAgICAgICBydWxlX19EYXRhSW50ZXJjaGFuZ2VGaWxlQ1NWX19Vbm9yZGVyZWRHcm91cF8zKCk7CkBAIC0xODk3MSwxNCArMTk5OTUsMTQgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19EYXRhSW50ZXJjaGFuZ2VGaWxlQ1NWX19Hcm91cF8zXzBfXzAiCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NTI2MjoxOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VGaWxlQ1NWX19Hcm91cF8zXzBfXzAgOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VGaWxlQ1NWX19Hcm91cF8zXzBfXzBfX0ltcGwgcnVsZV9fRGF0YUludGVyY2hhbmdlRmlsZUNTVl9fR3JvdXBfM18wX18xIDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo1NTIwOjE6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbGVDU1ZfX0dyb3VwXzNfMF9fMCA6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbGVDU1ZfX0dyb3VwXzNfMF9fMF9fSW1wbCBydWxlX19EYXRhSW50ZXJjaGFuZ2VGaWxlQ1NWX19Hcm91cF8zXzBfXzEgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbGVDU1ZfX0dyb3VwXzNfMF9fMCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo1MjY2OjE6ICggcnVsZV9fRGF0YUludGVyY2hhbmdlRmlsZUNTVl9fR3JvdXBfM18wX18wX19JbXBsIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbGVDU1ZfX0dyb3VwXzNfMF9fMSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo1MjY3OjI6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbGVDU1ZfX0dyb3VwXzNfMF9fMF9fSW1wbCBydWxlX19EYXRhSW50ZXJjaGFuZ2VGaWxlQ1NWX19Hcm91cF8zXzBfXzEKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjU1MjQ6MTogKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VGaWxlQ1NWX19Hcm91cF8zXzBfXzBfX0ltcGwgcnVsZV9fRGF0YUludGVyY2hhbmdlRmlsZUNTVl9fR3JvdXBfM18wX18xICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjU1MjU6MjogcnVsZV9fRGF0YUludGVyY2hhbmdlRmlsZUNTVl9fR3JvdXBfM18wX18wX19JbXBsIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbGVDU1ZfX0dyb3VwXzNfMF9fMQogICAgICAgICAgICAgewogICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfOSk7CiAgICAgICAgICAgICBydWxlX19EYXRhSW50ZXJjaGFuZ2VGaWxlQ1NWX19Hcm91cF8zXzBfXzBfX0ltcGwoKTsKQEAgLTE5MDA5LDIyICsyMDAzMywyMiBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbGVDU1ZfX0dyb3VwXzNfMF9fMF9fSW1wbCIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo1Mjc0OjE6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbGVDU1ZfX0dyb3VwXzNfMF9fMF9fSW1wbCA6ICggJ2RlbGltaXRlcicgKSA7CisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NTUzMjoxOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VGaWxlQ1NWX19Hcm91cF8zXzBfXzBfX0ltcGwgOiAoICdkZWxpbWl0ZXInICkgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbGVDU1ZfX0dyb3VwXzNfMF9fMF9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo1Mjc4OjE6ICggKCAnZGVsaW1pdGVyJyApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjUyNzk6MTogKCAnZGVsaW1pdGVyJyApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo1NTM2OjE6ICggKCAnZGVsaW1pdGVyJyApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjU1Mzc6MTogKCAnZGVsaW1pdGVyJyApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo1Mjc5OjE6ICggJ2RlbGltaXRlcicgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NTI4MDoyOiAnZGVsaW1pdGVyJworICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NTUzNzoxOiAoICdkZWxpbWl0ZXInICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjU1Mzg6MjogJ2RlbGltaXRlcicKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YUludGVyY2hhbmdlRmlsZUNTVkFjY2VzcygpLmdldERlbGltaXRlcktleXdvcmRfM18wXzAoKSk7IAogICAgICAgICAgICAgfQotICAgICAgICAgICAgbWF0Y2goaW5wdXQsODEsRk9MTE9XXzIpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOworICAgICAgICAgICAgbWF0Y2goaW5wdXQsODYsRk9MTE9XXzIpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOwogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBhZnRlcihncmFtbWFyQWNjZXNzLmdldERhdGFJbnRlcmNoYW5nZUZpbGVDU1ZBY2Nlc3MoKS5nZXREZWxpbWl0ZXJLZXl3b3JkXzNfMF8wKCkpOyAKICAgICAgICAgICAgIH0KQEAgLTE5MDUwLDE0ICsyMDA3NCwxNCBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbGVDU1ZfX0dyb3VwXzNfMF9fMSIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo1Mjg5OjE6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbGVDU1ZfX0dyb3VwXzNfMF9fMSA6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbGVDU1ZfX0dyb3VwXzNfMF9fMV9fSW1wbCA7CisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NTU0NzoxOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VGaWxlQ1NWX19Hcm91cF8zXzBfXzEgOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VGaWxlQ1NWX19Hcm91cF8zXzBfXzFfX0ltcGwgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbGVDU1ZfX0dyb3VwXzNfMF9fMSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo1MjkzOjE6ICggcnVsZV9fRGF0YUludGVyY2hhbmdlRmlsZUNTVl9fR3JvdXBfM18wX18xX19JbXBsICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjUyOTQ6MjogcnVsZV9fRGF0YUludGVyY2hhbmdlRmlsZUNTVl9fR3JvdXBfM18wX18xX19JbXBsCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo1NTUxOjE6ICggcnVsZV9fRGF0YUludGVyY2hhbmdlRmlsZUNTVl9fR3JvdXBfM18wX18xX19JbXBsICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjU1NTI6MjogcnVsZV9fRGF0YUludGVyY2hhbmdlRmlsZUNTVl9fR3JvdXBfM18wX18xX19JbXBsCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV18yKTsKICAgICAgICAgICAgIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbGVDU1ZfX0dyb3VwXzNfMF9fMV9fSW1wbCgpOwpAQCAtMTkwODMsMjMgKzIwMTA3LDIzIEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fRGF0YUludGVyY2hhbmdlRmlsZUNTVl9fR3JvdXBfM18wX18xX19JbXBsIgotICAgIC8vIEludGVybmFsRGF0YURTTC5nOjUzMDA6MTogcnVsZV9fRGF0YUludGVyY2hhbmdlRmlsZUNTVl9fR3JvdXBfM18wX18xX19JbXBsIDogKCAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbGVDU1ZfX0RlbGltaXRlckFzc2lnbm1lbnRfM18wXzEgKSApIDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo1NTU4OjE6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbGVDU1ZfX0dyb3VwXzNfMF9fMV9fSW1wbCA6ICggKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VGaWxlQ1NWX19EZWxpbWl0ZXJBc3NpZ25tZW50XzNfMF8xICkgKSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fRGF0YUludGVyY2hhbmdlRmlsZUNTVl9fR3JvdXBfM18wX18xX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjUzMDQ6MTogKCAoICggcnVsZV9fRGF0YUludGVyY2hhbmdlRmlsZUNTVl9fRGVsaW1pdGVyQXNzaWdubWVudF8zXzBfMSApICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NTMwNToxOiAoICggcnVsZV9fRGF0YUludGVyY2hhbmdlRmlsZUNTVl9fRGVsaW1pdGVyQXNzaWdubWVudF8zXzBfMSApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjU1NjI6MTogKCAoICggcnVsZV9fRGF0YUludGVyY2hhbmdlRmlsZUNTVl9fRGVsaW1pdGVyQXNzaWdubWVudF8zXzBfMSApICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NTU2MzoxOiAoICggcnVsZV9fRGF0YUludGVyY2hhbmdlRmlsZUNTVl9fRGVsaW1pdGVyQXNzaWdubWVudF8zXzBfMSApICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjUzMDU6MTogKCAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbGVDU1ZfX0RlbGltaXRlckFzc2lnbm1lbnRfM18wXzEgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo1MzA2OjI6ICggcnVsZV9fRGF0YUludGVyY2hhbmdlRmlsZUNTVl9fRGVsaW1pdGVyQXNzaWdubWVudF8zXzBfMSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo1NTYzOjE6ICggKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VGaWxlQ1NWX19EZWxpbWl0ZXJBc3NpZ25tZW50XzNfMF8xICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NTU2NDoyOiAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbGVDU1ZfX0RlbGltaXRlckFzc2lnbm1lbnRfM18wXzEgKQogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXREYXRhSW50ZXJjaGFuZ2VGaWxlQ1NWQWNjZXNzKCkuZ2V0RGVsaW1pdGVyQXNzaWdubWVudF8zXzBfMSgpKTsgCiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo1MzA3OjI6ICggcnVsZV9fRGF0YUludGVyY2hhbmdlRmlsZUNTVl9fRGVsaW1pdGVyQXNzaWdubWVudF8zXzBfMSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo1MzA3OjM6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbGVDU1ZfX0RlbGltaXRlckFzc2lnbm1lbnRfM18wXzEKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjU1NjU6MjogKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VGaWxlQ1NWX19EZWxpbWl0ZXJBc3NpZ25tZW50XzNfMF8xICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjU1NjU6MzogcnVsZV9fRGF0YUludGVyY2hhbmdlRmlsZUNTVl9fRGVsaW1pdGVyQXNzaWdubWVudF8zXzBfMQogICAgICAgICAgICAgewogICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMik7CiAgICAgICAgICAgICBydWxlX19EYXRhSW50ZXJjaGFuZ2VGaWxlQ1NWX19EZWxpbWl0ZXJBc3NpZ25tZW50XzNfMF8xKCk7CkBAIC0xOTEzNCwxNCArMjAxNTgsMTQgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19EYXRhSW50ZXJjaGFuZ2VGaWxlQ1NWX19Hcm91cF8zXzFfXzAiCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NTMxNjoxOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VGaWxlQ1NWX19Hcm91cF8zXzFfXzAgOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VGaWxlQ1NWX19Hcm91cF8zXzFfXzBfX0ltcGwgcnVsZV9fRGF0YUludGVyY2hhbmdlRmlsZUNTVl9fR3JvdXBfM18xX18xIDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo1NTc0OjE6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbGVDU1ZfX0dyb3VwXzNfMV9fMCA6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbGVDU1ZfX0dyb3VwXzNfMV9fMF9fSW1wbCBydWxlX19EYXRhSW50ZXJjaGFuZ2VGaWxlQ1NWX19Hcm91cF8zXzFfXzEgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbGVDU1ZfX0dyb3VwXzNfMV9fMCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo1MzIwOjE6ICggcnVsZV9fRGF0YUludGVyY2hhbmdlRmlsZUNTVl9fR3JvdXBfM18xX18wX19JbXBsIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbGVDU1ZfX0dyb3VwXzNfMV9fMSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo1MzIxOjI6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbGVDU1ZfX0dyb3VwXzNfMV9fMF9fSW1wbCBydWxlX19EYXRhSW50ZXJjaGFuZ2VGaWxlQ1NWX19Hcm91cF8zXzFfXzEKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjU1Nzg6MTogKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VGaWxlQ1NWX19Hcm91cF8zXzFfXzBfX0ltcGwgcnVsZV9fRGF0YUludGVyY2hhbmdlRmlsZUNTVl9fR3JvdXBfM18xX18xICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjU1Nzk6MjogcnVsZV9fRGF0YUludGVyY2hhbmdlRmlsZUNTVl9fR3JvdXBfM18xX18wX19JbXBsIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbGVDU1ZfX0dyb3VwXzNfMV9fMQogICAgICAgICAgICAgewogICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfOSk7CiAgICAgICAgICAgICBydWxlX19EYXRhSW50ZXJjaGFuZ2VGaWxlQ1NWX19Hcm91cF8zXzFfXzBfX0ltcGwoKTsKQEAgLTE5MTcyLDIyICsyMDE5NiwyMiBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbGVDU1ZfX0dyb3VwXzNfMV9fMF9fSW1wbCIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo1MzI4OjE6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbGVDU1ZfX0dyb3VwXzNfMV9fMF9fSW1wbCA6ICggJ3F1b3RlQ2hhcmFjdGVyJyApIDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo1NTg2OjE6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbGVDU1ZfX0dyb3VwXzNfMV9fMF9fSW1wbCA6ICggJ3F1b3RlQ2hhcmFjdGVyJyApIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19EYXRhSW50ZXJjaGFuZ2VGaWxlQ1NWX19Hcm91cF8zXzFfXzBfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NTMzMjoxOiAoICggJ3F1b3RlQ2hhcmFjdGVyJyApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjUzMzM6MTogKCAncXVvdGVDaGFyYWN0ZXInICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjU1OTA6MTogKCAoICdxdW90ZUNoYXJhY3RlcicgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo1NTkxOjE6ICggJ3F1b3RlQ2hhcmFjdGVyJyApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo1MzMzOjE6ICggJ3F1b3RlQ2hhcmFjdGVyJyApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo1MzM0OjI6ICdxdW90ZUNoYXJhY3RlcicKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjU1OTE6MTogKCAncXVvdGVDaGFyYWN0ZXInICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjU1OTI6MjogJ3F1b3RlQ2hhcmFjdGVyJwogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXREYXRhSW50ZXJjaGFuZ2VGaWxlQ1NWQWNjZXNzKCkuZ2V0UXVvdGVDaGFyYWN0ZXJLZXl3b3JkXzNfMV8wKCkpOyAKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1hdGNoKGlucHV0LDgyLEZPTExPV18yKTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKKyAgICAgICAgICAgIG1hdGNoKGlucHV0LDg3LEZPTExPV18yKTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXREYXRhSW50ZXJjaGFuZ2VGaWxlQ1NWQWNjZXNzKCkuZ2V0UXVvdGVDaGFyYWN0ZXJLZXl3b3JkXzNfMV8wKCkpOyAKICAgICAgICAgICAgIH0KQEAgLTE5MjEzLDE0ICsyMDIzNywxNCBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbGVDU1ZfX0dyb3VwXzNfMV9fMSIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo1MzQzOjE6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbGVDU1ZfX0dyb3VwXzNfMV9fMSA6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbGVDU1ZfX0dyb3VwXzNfMV9fMV9fSW1wbCA7CisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NTYwMToxOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VGaWxlQ1NWX19Hcm91cF8zXzFfXzEgOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VGaWxlQ1NWX19Hcm91cF8zXzFfXzFfX0ltcGwgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbGVDU1ZfX0dyb3VwXzNfMV9fMSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo1MzQ3OjE6ICggcnVsZV9fRGF0YUludGVyY2hhbmdlRmlsZUNTVl9fR3JvdXBfM18xX18xX19JbXBsICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjUzNDg6MjogcnVsZV9fRGF0YUludGVyY2hhbmdlRmlsZUNTVl9fR3JvdXBfM18xX18xX19JbXBsCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo1NjA1OjE6ICggcnVsZV9fRGF0YUludGVyY2hhbmdlRmlsZUNTVl9fR3JvdXBfM18xX18xX19JbXBsICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjU2MDY6MjogcnVsZV9fRGF0YUludGVyY2hhbmdlRmlsZUNTVl9fR3JvdXBfM18xX18xX19JbXBsCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV18yKTsKICAgICAgICAgICAgIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbGVDU1ZfX0dyb3VwXzNfMV9fMV9fSW1wbCgpOwpAQCAtMTkyNDYsMjMgKzIwMjcwLDIzIEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fRGF0YUludGVyY2hhbmdlRmlsZUNTVl9fR3JvdXBfM18xX18xX19JbXBsIgotICAgIC8vIEludGVybmFsRGF0YURTTC5nOjUzNTQ6MTogcnVsZV9fRGF0YUludGVyY2hhbmdlRmlsZUNTVl9fR3JvdXBfM18xX18xX19JbXBsIDogKCAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbGVDU1ZfX1F1b3RlQ2hhcmFjdGVyQXNzaWdubWVudF8zXzFfMSApICkgOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjU2MTI6MTogcnVsZV9fRGF0YUludGVyY2hhbmdlRmlsZUNTVl9fR3JvdXBfM18xX18xX19JbXBsIDogKCAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbGVDU1ZfX1F1b3RlQ2hhcmFjdGVyQXNzaWdubWVudF8zXzFfMSApICkgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbGVDU1ZfX0dyb3VwXzNfMV9fMV9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo1MzU4OjE6ICggKCAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbGVDU1ZfX1F1b3RlQ2hhcmFjdGVyQXNzaWdubWVudF8zXzFfMSApICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NTM1OToxOiAoICggcnVsZV9fRGF0YUludGVyY2hhbmdlRmlsZUNTVl9fUXVvdGVDaGFyYWN0ZXJBc3NpZ25tZW50XzNfMV8xICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NTYxNjoxOiAoICggKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VGaWxlQ1NWX19RdW90ZUNoYXJhY3RlckFzc2lnbm1lbnRfM18xXzEgKSApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjU2MTc6MTogKCAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbGVDU1ZfX1F1b3RlQ2hhcmFjdGVyQXNzaWdubWVudF8zXzFfMSApICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjUzNTk6MTogKCAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbGVDU1ZfX1F1b3RlQ2hhcmFjdGVyQXNzaWdubWVudF8zXzFfMSApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjUzNjA6MjogKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VGaWxlQ1NWX19RdW90ZUNoYXJhY3RlckFzc2lnbm1lbnRfM18xXzEgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NTYxNzoxOiAoICggcnVsZV9fRGF0YUludGVyY2hhbmdlRmlsZUNTVl9fUXVvdGVDaGFyYWN0ZXJBc3NpZ25tZW50XzNfMV8xICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NTYxODoyOiAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbGVDU1ZfX1F1b3RlQ2hhcmFjdGVyQXNzaWdubWVudF8zXzFfMSApCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldERhdGFJbnRlcmNoYW5nZUZpbGVDU1ZBY2Nlc3MoKS5nZXRRdW90ZUNoYXJhY3RlckFzc2lnbm1lbnRfM18xXzEoKSk7IAogICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NTM2MToyOiAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbGVDU1ZfX1F1b3RlQ2hhcmFjdGVyQXNzaWdubWVudF8zXzFfMSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo1MzYxOjM6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbGVDU1ZfX1F1b3RlQ2hhcmFjdGVyQXNzaWdubWVudF8zXzFfMQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NTYxOToyOiAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbGVDU1ZfX1F1b3RlQ2hhcmFjdGVyQXNzaWdubWVudF8zXzFfMSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo1NjE5OjM6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbGVDU1ZfX1F1b3RlQ2hhcmFjdGVyQXNzaWdubWVudF8zXzFfMQogICAgICAgICAgICAgewogICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMik7CiAgICAgICAgICAgICBydWxlX19EYXRhSW50ZXJjaGFuZ2VGaWxlQ1NWX19RdW90ZUNoYXJhY3RlckFzc2lnbm1lbnRfM18xXzEoKTsKQEAgLTE5Mjk3LDE0ICsyMDMyMSwxNCBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbGVDU1ZfX0dyb3VwXzNfMl9fMCIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo1MzcwOjE6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbGVDU1ZfX0dyb3VwXzNfMl9fMCA6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbGVDU1ZfX0dyb3VwXzNfMl9fMF9fSW1wbCBydWxlX19EYXRhSW50ZXJjaGFuZ2VGaWxlQ1NWX19Hcm91cF8zXzJfXzEgOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjU2Mjg6MTogcnVsZV9fRGF0YUludGVyY2hhbmdlRmlsZUNTVl9fR3JvdXBfM18yX18wIDogcnVsZV9fRGF0YUludGVyY2hhbmdlRmlsZUNTVl9fR3JvdXBfM18yX18wX19JbXBsIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbGVDU1ZfX0dyb3VwXzNfMl9fMSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fRGF0YUludGVyY2hhbmdlRmlsZUNTVl9fR3JvdXBfM18yX18wKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjUzNzQ6MTogKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VGaWxlQ1NWX19Hcm91cF8zXzJfXzBfX0ltcGwgcnVsZV9fRGF0YUludGVyY2hhbmdlRmlsZUNTVl9fR3JvdXBfM18yX18xICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjUzNzU6MjogcnVsZV9fRGF0YUludGVyY2hhbmdlRmlsZUNTVl9fR3JvdXBfM18yX18wX19JbXBsIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbGVDU1ZfX0dyb3VwXzNfMl9fMQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NTYzMjoxOiAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbGVDU1ZfX0dyb3VwXzNfMl9fMF9fSW1wbCBydWxlX19EYXRhSW50ZXJjaGFuZ2VGaWxlQ1NWX19Hcm91cF8zXzJfXzEgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NTYzMzoyOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VGaWxlQ1NWX19Hcm91cF8zXzJfXzBfX0ltcGwgcnVsZV9fRGF0YUludGVyY2hhbmdlRmlsZUNTVl9fR3JvdXBfM18yX18xCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV18yMCk7CiAgICAgICAgICAgICBydWxlX19EYXRhSW50ZXJjaGFuZ2VGaWxlQ1NWX19Hcm91cF8zXzJfXzBfX0ltcGwoKTsKQEAgLTE5MzM1LDIyICsyMDM1OSwyMiBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbGVDU1ZfX0dyb3VwXzNfMl9fMF9fSW1wbCIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo1MzgyOjE6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbGVDU1ZfX0dyb3VwXzNfMl9fMF9fSW1wbCA6ICggJ3NraXBMaW5lcycgKSA7CisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NTY0MDoxOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VGaWxlQ1NWX19Hcm91cF8zXzJfXzBfX0ltcGwgOiAoICdza2lwTGluZXMnICkgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbGVDU1ZfX0dyb3VwXzNfMl9fMF9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo1Mzg2OjE6ICggKCAnc2tpcExpbmVzJyApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjUzODc6MTogKCAnc2tpcExpbmVzJyApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo1NjQ0OjE6ICggKCAnc2tpcExpbmVzJyApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjU2NDU6MTogKCAnc2tpcExpbmVzJyApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo1Mzg3OjE6ICggJ3NraXBMaW5lcycgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NTM4ODoyOiAnc2tpcExpbmVzJworICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NTY0NToxOiAoICdza2lwTGluZXMnICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjU2NDY6MjogJ3NraXBMaW5lcycKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YUludGVyY2hhbmdlRmlsZUNTVkFjY2VzcygpLmdldFNraXBMaW5lc0tleXdvcmRfM18yXzAoKSk7IAogICAgICAgICAgICAgfQotICAgICAgICAgICAgbWF0Y2goaW5wdXQsODMsRk9MTE9XXzIpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOworICAgICAgICAgICAgbWF0Y2goaW5wdXQsODgsRk9MTE9XXzIpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOwogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBhZnRlcihncmFtbWFyQWNjZXNzLmdldERhdGFJbnRlcmNoYW5nZUZpbGVDU1ZBY2Nlc3MoKS5nZXRTa2lwTGluZXNLZXl3b3JkXzNfMl8wKCkpOyAKICAgICAgICAgICAgIH0KQEAgLTE5Mzc2LDE0ICsyMDQwMCwxNCBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbGVDU1ZfX0dyb3VwXzNfMl9fMSIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo1Mzk3OjE6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbGVDU1ZfX0dyb3VwXzNfMl9fMSA6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbGVDU1ZfX0dyb3VwXzNfMl9fMV9fSW1wbCA7CisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NTY1NToxOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VGaWxlQ1NWX19Hcm91cF8zXzJfXzEgOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VGaWxlQ1NWX19Hcm91cF8zXzJfXzFfX0ltcGwgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbGVDU1ZfX0dyb3VwXzNfMl9fMSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo1NDAxOjE6ICggcnVsZV9fRGF0YUludGVyY2hhbmdlRmlsZUNTVl9fR3JvdXBfM18yX18xX19JbXBsICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjU0MDI6MjogcnVsZV9fRGF0YUludGVyY2hhbmdlRmlsZUNTVl9fR3JvdXBfM18yX18xX19JbXBsCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo1NjU5OjE6ICggcnVsZV9fRGF0YUludGVyY2hhbmdlRmlsZUNTVl9fR3JvdXBfM18yX18xX19JbXBsICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjU2NjA6MjogcnVsZV9fRGF0YUludGVyY2hhbmdlRmlsZUNTVl9fR3JvdXBfM18yX18xX19JbXBsCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV18yKTsKICAgICAgICAgICAgIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbGVDU1ZfX0dyb3VwXzNfMl9fMV9fSW1wbCgpOwpAQCAtMTk0MDksMjMgKzIwNDMzLDIzIEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fRGF0YUludGVyY2hhbmdlRmlsZUNTVl9fR3JvdXBfM18yX18xX19JbXBsIgotICAgIC8vIEludGVybmFsRGF0YURTTC5nOjU0MDg6MTogcnVsZV9fRGF0YUludGVyY2hhbmdlRmlsZUNTVl9fR3JvdXBfM18yX18xX19JbXBsIDogKCAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbGVDU1ZfX1NraXBMaW5lc0Fzc2lnbm1lbnRfM18yXzEgKSApIDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo1NjY2OjE6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbGVDU1ZfX0dyb3VwXzNfMl9fMV9fSW1wbCA6ICggKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VGaWxlQ1NWX19Ta2lwTGluZXNBc3NpZ25tZW50XzNfMl8xICkgKSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fRGF0YUludGVyY2hhbmdlRmlsZUNTVl9fR3JvdXBfM18yX18xX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjU0MTI6MTogKCAoICggcnVsZV9fRGF0YUludGVyY2hhbmdlRmlsZUNTVl9fU2tpcExpbmVzQXNzaWdubWVudF8zXzJfMSApICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NTQxMzoxOiAoICggcnVsZV9fRGF0YUludGVyY2hhbmdlRmlsZUNTVl9fU2tpcExpbmVzQXNzaWdubWVudF8zXzJfMSApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjU2NzA6MTogKCAoICggcnVsZV9fRGF0YUludGVyY2hhbmdlRmlsZUNTVl9fU2tpcExpbmVzQXNzaWdubWVudF8zXzJfMSApICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NTY3MToxOiAoICggcnVsZV9fRGF0YUludGVyY2hhbmdlRmlsZUNTVl9fU2tpcExpbmVzQXNzaWdubWVudF8zXzJfMSApICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjU0MTM6MTogKCAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbGVDU1ZfX1NraXBMaW5lc0Fzc2lnbm1lbnRfM18yXzEgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo1NDE0OjI6ICggcnVsZV9fRGF0YUludGVyY2hhbmdlRmlsZUNTVl9fU2tpcExpbmVzQXNzaWdubWVudF8zXzJfMSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo1NjcxOjE6ICggKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VGaWxlQ1NWX19Ta2lwTGluZXNBc3NpZ25tZW50XzNfMl8xICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NTY3MjoyOiAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbGVDU1ZfX1NraXBMaW5lc0Fzc2lnbm1lbnRfM18yXzEgKQogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXREYXRhSW50ZXJjaGFuZ2VGaWxlQ1NWQWNjZXNzKCkuZ2V0U2tpcExpbmVzQXNzaWdubWVudF8zXzJfMSgpKTsgCiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo1NDE1OjI6ICggcnVsZV9fRGF0YUludGVyY2hhbmdlRmlsZUNTVl9fU2tpcExpbmVzQXNzaWdubWVudF8zXzJfMSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo1NDE1OjM6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbGVDU1ZfX1NraXBMaW5lc0Fzc2lnbm1lbnRfM18yXzEKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjU2NzM6MjogKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VGaWxlQ1NWX19Ta2lwTGluZXNBc3NpZ25tZW50XzNfMl8xICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjU2NzM6MzogcnVsZV9fRGF0YUludGVyY2hhbmdlRmlsZUNTVl9fU2tpcExpbmVzQXNzaWdubWVudF8zXzJfMQogICAgICAgICAgICAgewogICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMik7CiAgICAgICAgICAgICBydWxlX19EYXRhSW50ZXJjaGFuZ2VGaWxlQ1NWX19Ta2lwTGluZXNBc3NpZ25tZW50XzNfMl8xKCk7CkBAIC0xOTQ2MCwxNCArMjA0ODQsMTQgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19EYXRhSW50ZXJjaGFuZ2VGaWxlQ1NWX19Hcm91cF8zXzRfXzAiCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NTQyNDoxOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VGaWxlQ1NWX19Hcm91cF8zXzRfXzAgOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VGaWxlQ1NWX19Hcm91cF8zXzRfXzBfX0ltcGwgcnVsZV9fRGF0YUludGVyY2hhbmdlRmlsZUNTVl9fR3JvdXBfM180X18xIDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo1NjgyOjE6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbGVDU1ZfX0dyb3VwXzNfNF9fMCA6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbGVDU1ZfX0dyb3VwXzNfNF9fMF9fSW1wbCBydWxlX19EYXRhSW50ZXJjaGFuZ2VGaWxlQ1NWX19Hcm91cF8zXzRfXzEgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbGVDU1ZfX0dyb3VwXzNfNF9fMCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo1NDI4OjE6ICggcnVsZV9fRGF0YUludGVyY2hhbmdlRmlsZUNTVl9fR3JvdXBfM180X18wX19JbXBsIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbGVDU1ZfX0dyb3VwXzNfNF9fMSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo1NDI5OjI6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbGVDU1ZfX0dyb3VwXzNfNF9fMF9fSW1wbCBydWxlX19EYXRhSW50ZXJjaGFuZ2VGaWxlQ1NWX19Hcm91cF8zXzRfXzEKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjU2ODY6MTogKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VGaWxlQ1NWX19Hcm91cF8zXzRfXzBfX0ltcGwgcnVsZV9fRGF0YUludGVyY2hhbmdlRmlsZUNTVl9fR3JvdXBfM180X18xICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjU2ODc6MjogcnVsZV9fRGF0YUludGVyY2hhbmdlRmlsZUNTVl9fR3JvdXBfM180X18wX19JbXBsIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbGVDU1ZfX0dyb3VwXzNfNF9fMQogICAgICAgICAgICAgewogICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfOSk7CiAgICAgICAgICAgICBydWxlX19EYXRhSW50ZXJjaGFuZ2VGaWxlQ1NWX19Hcm91cF8zXzRfXzBfX0ltcGwoKTsKQEAgLTE5NDk4LDIyICsyMDUyMiwyMiBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbGVDU1ZfX0dyb3VwXzNfNF9fMF9fSW1wbCIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo1NDM2OjE6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbGVDU1ZfX0dyb3VwXzNfNF9fMF9fSW1wbCA6ICggJ2VuY29kaW5nJyApIDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo1Njk0OjE6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbGVDU1ZfX0dyb3VwXzNfNF9fMF9fSW1wbCA6ICggJ2VuY29kaW5nJyApIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19EYXRhSW50ZXJjaGFuZ2VGaWxlQ1NWX19Hcm91cF8zXzRfXzBfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NTQ0MDoxOiAoICggJ2VuY29kaW5nJyApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjU0NDE6MTogKCAnZW5jb2RpbmcnICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjU2OTg6MTogKCAoICdlbmNvZGluZycgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo1Njk5OjE6ICggJ2VuY29kaW5nJyApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo1NDQxOjE6ICggJ2VuY29kaW5nJyApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo1NDQyOjI6ICdlbmNvZGluZycKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjU2OTk6MTogKCAnZW5jb2RpbmcnICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjU3MDA6MjogJ2VuY29kaW5nJwogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXREYXRhSW50ZXJjaGFuZ2VGaWxlQ1NWQWNjZXNzKCkuZ2V0RW5jb2RpbmdLZXl3b3JkXzNfNF8wKCkpOyAKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1hdGNoKGlucHV0LDc4LEZPTExPV18yKTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKKyAgICAgICAgICAgIG1hdGNoKGlucHV0LDgzLEZPTExPV18yKTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXREYXRhSW50ZXJjaGFuZ2VGaWxlQ1NWQWNjZXNzKCkuZ2V0RW5jb2RpbmdLZXl3b3JkXzNfNF8wKCkpOyAKICAgICAgICAgICAgIH0KQEAgLTE5NTM5LDE0ICsyMDU2MywxNCBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbGVDU1ZfX0dyb3VwXzNfNF9fMSIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo1NDUxOjE6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbGVDU1ZfX0dyb3VwXzNfNF9fMSA6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbGVDU1ZfX0dyb3VwXzNfNF9fMV9fSW1wbCA7CisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NTcwOToxOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VGaWxlQ1NWX19Hcm91cF8zXzRfXzEgOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VGaWxlQ1NWX19Hcm91cF8zXzRfXzFfX0ltcGwgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbGVDU1ZfX0dyb3VwXzNfNF9fMSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo1NDU1OjE6ICggcnVsZV9fRGF0YUludGVyY2hhbmdlRmlsZUNTVl9fR3JvdXBfM180X18xX19JbXBsICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjU0NTY6MjogcnVsZV9fRGF0YUludGVyY2hhbmdlRmlsZUNTVl9fR3JvdXBfM180X18xX19JbXBsCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo1NzEzOjE6ICggcnVsZV9fRGF0YUludGVyY2hhbmdlRmlsZUNTVl9fR3JvdXBfM180X18xX19JbXBsICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjU3MTQ6MjogcnVsZV9fRGF0YUludGVyY2hhbmdlRmlsZUNTVl9fR3JvdXBfM180X18xX19JbXBsCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV18yKTsKICAgICAgICAgICAgIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbGVDU1ZfX0dyb3VwXzNfNF9fMV9fSW1wbCgpOwpAQCAtMTk1NzIsMjMgKzIwNTk2LDIzIEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fRGF0YUludGVyY2hhbmdlRmlsZUNTVl9fR3JvdXBfM180X18xX19JbXBsIgotICAgIC8vIEludGVybmFsRGF0YURTTC5nOjU0NjI6MTogcnVsZV9fRGF0YUludGVyY2hhbmdlRmlsZUNTVl9fR3JvdXBfM180X18xX19JbXBsIDogKCAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbGVDU1ZfX0VuY29kaW5nQXNzaWdubWVudF8zXzRfMSApICkgOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjU3MjA6MTogcnVsZV9fRGF0YUludGVyY2hhbmdlRmlsZUNTVl9fR3JvdXBfM180X18xX19JbXBsIDogKCAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbGVDU1ZfX0VuY29kaW5nQXNzaWdubWVudF8zXzRfMSApICkgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbGVDU1ZfX0dyb3VwXzNfNF9fMV9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo1NDY2OjE6ICggKCAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbGVDU1ZfX0VuY29kaW5nQXNzaWdubWVudF8zXzRfMSApICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NTQ2NzoxOiAoICggcnVsZV9fRGF0YUludGVyY2hhbmdlRmlsZUNTVl9fRW5jb2RpbmdBc3NpZ25tZW50XzNfNF8xICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NTcyNDoxOiAoICggKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VGaWxlQ1NWX19FbmNvZGluZ0Fzc2lnbm1lbnRfM180XzEgKSApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjU3MjU6MTogKCAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbGVDU1ZfX0VuY29kaW5nQXNzaWdubWVudF8zXzRfMSApICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjU0Njc6MTogKCAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbGVDU1ZfX0VuY29kaW5nQXNzaWdubWVudF8zXzRfMSApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjU0Njg6MjogKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VGaWxlQ1NWX19FbmNvZGluZ0Fzc2lnbm1lbnRfM180XzEgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NTcyNToxOiAoICggcnVsZV9fRGF0YUludGVyY2hhbmdlRmlsZUNTVl9fRW5jb2RpbmdBc3NpZ25tZW50XzNfNF8xICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NTcyNjoyOiAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbGVDU1ZfX0VuY29kaW5nQXNzaWdubWVudF8zXzRfMSApCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldERhdGFJbnRlcmNoYW5nZUZpbGVDU1ZBY2Nlc3MoKS5nZXRFbmNvZGluZ0Fzc2lnbm1lbnRfM180XzEoKSk7IAogICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NTQ2OToyOiAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbGVDU1ZfX0VuY29kaW5nQXNzaWdubWVudF8zXzRfMSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo1NDY5OjM6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbGVDU1ZfX0VuY29kaW5nQXNzaWdubWVudF8zXzRfMQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NTcyNzoyOiAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbGVDU1ZfX0VuY29kaW5nQXNzaWdubWVudF8zXzRfMSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo1NzI3OjM6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbGVDU1ZfX0VuY29kaW5nQXNzaWdubWVudF8zXzRfMQogICAgICAgICAgICAgewogICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMik7CiAgICAgICAgICAgICBydWxlX19EYXRhSW50ZXJjaGFuZ2VGaWxlQ1NWX19FbmNvZGluZ0Fzc2lnbm1lbnRfM180XzEoKTsKQEAgLTE5NjIzLDE0ICsyMDY0NywxNCBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbGVDU1ZfX0dyb3VwXzNfNV9fMCIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo1NDc4OjE6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbGVDU1ZfX0dyb3VwXzNfNV9fMCA6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbGVDU1ZfX0dyb3VwXzNfNV9fMF9fSW1wbCBydWxlX19EYXRhSW50ZXJjaGFuZ2VGaWxlQ1NWX19Hcm91cF8zXzVfXzEgOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjU3MzY6MTogcnVsZV9fRGF0YUludGVyY2hhbmdlRmlsZUNTVl9fR3JvdXBfM181X18wIDogcnVsZV9fRGF0YUludGVyY2hhbmdlRmlsZUNTVl9fR3JvdXBfM181X18wX19JbXBsIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbGVDU1ZfX0dyb3VwXzNfNV9fMSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fRGF0YUludGVyY2hhbmdlRmlsZUNTVl9fR3JvdXBfM181X18wKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjU0ODI6MTogKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VGaWxlQ1NWX19Hcm91cF8zXzVfXzBfX0ltcGwgcnVsZV9fRGF0YUludGVyY2hhbmdlRmlsZUNTVl9fR3JvdXBfM181X18xICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjU0ODM6MjogcnVsZV9fRGF0YUludGVyY2hhbmdlRmlsZUNTVl9fR3JvdXBfM181X18wX19JbXBsIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbGVDU1ZfX0dyb3VwXzNfNV9fMQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NTc0MDoxOiAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbGVDU1ZfX0dyb3VwXzNfNV9fMF9fSW1wbCBydWxlX19EYXRhSW50ZXJjaGFuZ2VGaWxlQ1NWX19Hcm91cF8zXzVfXzEgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NTc0MToyOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VGaWxlQ1NWX19Hcm91cF8zXzVfXzBfX0ltcGwgcnVsZV9fRGF0YUludGVyY2hhbmdlRmlsZUNTVl9fR3JvdXBfM181X18xCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV185KTsKICAgICAgICAgICAgIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbGVDU1ZfX0dyb3VwXzNfNV9fMF9fSW1wbCgpOwpAQCAtMTk2NjEsMjIgKzIwNjg1LDIyIEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fRGF0YUludGVyY2hhbmdlRmlsZUNTVl9fR3JvdXBfM181X18wX19JbXBsIgotICAgIC8vIEludGVybmFsRGF0YURTTC5nOjU0OTA6MTogcnVsZV9fRGF0YUludGVyY2hhbmdlRmlsZUNTVl9fR3JvdXBfM181X18wX19JbXBsIDogKCAnbG9jYWxlJyApIDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo1NzQ4OjE6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbGVDU1ZfX0dyb3VwXzNfNV9fMF9fSW1wbCA6ICggJ2xvY2FsZScgKSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fRGF0YUludGVyY2hhbmdlRmlsZUNTVl9fR3JvdXBfM181X18wX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjU0OTQ6MTogKCAoICdsb2NhbGUnICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NTQ5NToxOiAoICdsb2NhbGUnICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjU3NTI6MTogKCAoICdsb2NhbGUnICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NTc1MzoxOiAoICdsb2NhbGUnICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjU0OTU6MTogKCAnbG9jYWxlJyApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo1NDk2OjI6ICdsb2NhbGUnCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo1NzUzOjE6ICggJ2xvY2FsZScgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NTc1NDoyOiAnbG9jYWxlJwogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXREYXRhSW50ZXJjaGFuZ2VGaWxlQ1NWQWNjZXNzKCkuZ2V0TG9jYWxlS2V5d29yZF8zXzVfMCgpKTsgCiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBtYXRjaChpbnB1dCw3OSxGT0xMT1dfMik7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CisgICAgICAgICAgICBtYXRjaChpbnB1dCw4NCxGT0xMT1dfMik7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YUludGVyY2hhbmdlRmlsZUNTVkFjY2VzcygpLmdldExvY2FsZUtleXdvcmRfM181XzAoKSk7IAogICAgICAgICAgICAgfQpAQCAtMTk3MDIsMTQgKzIwNzI2LDE0IEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fRGF0YUludGVyY2hhbmdlRmlsZUNTVl9fR3JvdXBfM181X18xIgotICAgIC8vIEludGVybmFsRGF0YURTTC5nOjU1MDU6MTogcnVsZV9fRGF0YUludGVyY2hhbmdlRmlsZUNTVl9fR3JvdXBfM181X18xIDogcnVsZV9fRGF0YUludGVyY2hhbmdlRmlsZUNTVl9fR3JvdXBfM181X18xX19JbXBsIDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo1NzYzOjE6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbGVDU1ZfX0dyb3VwXzNfNV9fMSA6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbGVDU1ZfX0dyb3VwXzNfNV9fMV9fSW1wbCA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fRGF0YUludGVyY2hhbmdlRmlsZUNTVl9fR3JvdXBfM181X18xKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjU1MDk6MTogKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VGaWxlQ1NWX19Hcm91cF8zXzVfXzFfX0ltcGwgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NTUxMDoyOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VGaWxlQ1NWX19Hcm91cF8zXzVfXzFfX0ltcGwKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjU3Njc6MTogKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VGaWxlQ1NWX19Hcm91cF8zXzVfXzFfX0ltcGwgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NTc2ODoyOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VGaWxlQ1NWX19Hcm91cF8zXzVfXzFfX0ltcGwKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzIpOwogICAgICAgICAgICAgcnVsZV9fRGF0YUludGVyY2hhbmdlRmlsZUNTVl9fR3JvdXBfM181X18xX19JbXBsKCk7CkBAIC0xOTczNSwyMyArMjA3NTksMjMgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19EYXRhSW50ZXJjaGFuZ2VGaWxlQ1NWX19Hcm91cF8zXzVfXzFfX0ltcGwiCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NTUxNjoxOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VGaWxlQ1NWX19Hcm91cF8zXzVfXzFfX0ltcGwgOiAoICggcnVsZV9fRGF0YUludGVyY2hhbmdlRmlsZUNTVl9fTG9jYWxlQXNzaWdubWVudF8zXzVfMSApICkgOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjU3NzQ6MTogcnVsZV9fRGF0YUludGVyY2hhbmdlRmlsZUNTVl9fR3JvdXBfM181X18xX19JbXBsIDogKCAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbGVDU1ZfX0xvY2FsZUFzc2lnbm1lbnRfM181XzEgKSApIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19EYXRhSW50ZXJjaGFuZ2VGaWxlQ1NWX19Hcm91cF8zXzVfXzFfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NTUyMDoxOiAoICggKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VGaWxlQ1NWX19Mb2NhbGVBc3NpZ25tZW50XzNfNV8xICkgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo1NTIxOjE6ICggKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VGaWxlQ1NWX19Mb2NhbGVBc3NpZ25tZW50XzNfNV8xICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NTc3ODoxOiAoICggKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VGaWxlQ1NWX19Mb2NhbGVBc3NpZ25tZW50XzNfNV8xICkgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo1Nzc5OjE6ICggKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VGaWxlQ1NWX19Mb2NhbGVBc3NpZ25tZW50XzNfNV8xICkgKQogICAgICAgICAgICAgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NTUyMToxOiAoICggcnVsZV9fRGF0YUludGVyY2hhbmdlRmlsZUNTVl9fTG9jYWxlQXNzaWdubWVudF8zXzVfMSApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjU1MjI6MjogKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VGaWxlQ1NWX19Mb2NhbGVBc3NpZ25tZW50XzNfNV8xICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjU3Nzk6MTogKCAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbGVDU1ZfX0xvY2FsZUFzc2lnbm1lbnRfM181XzEgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo1NzgwOjI6ICggcnVsZV9fRGF0YUludGVyY2hhbmdlRmlsZUNTVl9fTG9jYWxlQXNzaWdubWVudF8zXzVfMSApCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldERhdGFJbnRlcmNoYW5nZUZpbGVDU1ZBY2Nlc3MoKS5nZXRMb2NhbGVBc3NpZ25tZW50XzNfNV8xKCkpOyAKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjU1MjM6MjogKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VGaWxlQ1NWX19Mb2NhbGVBc3NpZ25tZW50XzNfNV8xICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjU1MjM6MzogcnVsZV9fRGF0YUludGVyY2hhbmdlRmlsZUNTVl9fTG9jYWxlQXNzaWdubWVudF8zXzVfMQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NTc4MToyOiAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbGVDU1ZfX0xvY2FsZUFzc2lnbm1lbnRfM181XzEgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NTc4MTozOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VGaWxlQ1NWX19Mb2NhbGVBc3NpZ25tZW50XzNfNV8xCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV18yKTsKICAgICAgICAgICAgIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbGVDU1ZfX0xvY2FsZUFzc2lnbm1lbnRfM181XzEoKTsKQEAgLTE5Nzg2LDE0ICsyMDgxMCwxNCBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbGVFRElfX0dyb3VwX18wIgotICAgIC8vIEludGVybmFsRGF0YURTTC5nOjU1MzI6MTogcnVsZV9fRGF0YUludGVyY2hhbmdlRmlsZUVESV9fR3JvdXBfXzAgOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VGaWxlRURJX19Hcm91cF9fMF9fSW1wbCBydWxlX19EYXRhSW50ZXJjaGFuZ2VGaWxlRURJX19Hcm91cF9fMSA7CisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NTc5MDoxOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VGaWxlRURJX19Hcm91cF9fMCA6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbGVFRElfX0dyb3VwX18wX19JbXBsIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbGVFRElfX0dyb3VwX18xIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19EYXRhSW50ZXJjaGFuZ2VGaWxlRURJX19Hcm91cF9fMCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo1NTM2OjE6ICggcnVsZV9fRGF0YUludGVyY2hhbmdlRmlsZUVESV9fR3JvdXBfXzBfX0ltcGwgcnVsZV9fRGF0YUludGVyY2hhbmdlRmlsZUVESV9fR3JvdXBfXzEgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NTUzNzoyOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VGaWxlRURJX19Hcm91cF9fMF9fSW1wbCBydWxlX19EYXRhSW50ZXJjaGFuZ2VGaWxlRURJX19Hcm91cF9fMQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NTc5NDoxOiAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbGVFRElfX0dyb3VwX18wX19JbXBsIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbGVFRElfX0dyb3VwX18xICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjU3OTU6MjogcnVsZV9fRGF0YUludGVyY2hhbmdlRmlsZUVESV9fR3JvdXBfXzBfX0ltcGwgcnVsZV9fRGF0YUludGVyY2hhbmdlRmlsZUVESV9fR3JvdXBfXzEKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzE2KTsKICAgICAgICAgICAgIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbGVFRElfX0dyb3VwX18wX19JbXBsKCk7CkBAIC0xOTgyNCwyMyArMjA4NDgsMjMgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19EYXRhSW50ZXJjaGFuZ2VGaWxlRURJX19Hcm91cF9fMF9fSW1wbCIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo1NTQ0OjE6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbGVFRElfX0dyb3VwX18wX19JbXBsIDogKCAoKSApIDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo1ODAyOjE6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbGVFRElfX0dyb3VwX18wX19JbXBsIDogKCAoKSApIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19EYXRhSW50ZXJjaGFuZ2VGaWxlRURJX19Hcm91cF9fMF9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo1NTQ4OjE6ICggKCAoKSApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjU1NDk6MTogKCAoKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo1ODA2OjE6ICggKCAoKSApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjU4MDc6MTogKCAoKSApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo1NTQ5OjE6ICggKCkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NTU1MDoyOiAoKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NTgwNzoxOiAoICgpICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjU4MDg6MjogKCkKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YUludGVyY2hhbmdlRmlsZUVESUFjY2VzcygpLmdldERhdGFJbnRlcmNoYW5nZUZpbGVFRElBY3Rpb25fMCgpKTsgCiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo1NTUxOjI6ICgpCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo1NTUxOjM6IAorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NTgwOToyOiAoKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NTgwOTozOiAKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIH0KIApAQCAtMTk4NjUsMTQgKzIwODg5LDE0IEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fRGF0YUludGVyY2hhbmdlRmlsZUVESV9fR3JvdXBfXzEiCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NTU1OToxOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VGaWxlRURJX19Hcm91cF9fMSA6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbGVFRElfX0dyb3VwX18xX19JbXBsIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbGVFRElfX0dyb3VwX18yIDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo1ODE3OjE6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbGVFRElfX0dyb3VwX18xIDogcnVsZV9fRGF0YUludGVyY2hhbmdlRmlsZUVESV9fR3JvdXBfXzFfX0ltcGwgcnVsZV9fRGF0YUludGVyY2hhbmdlRmlsZUVESV9fR3JvdXBfXzIgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbGVFRElfX0dyb3VwX18xKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjU1NjM6MTogKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VGaWxlRURJX19Hcm91cF9fMV9fSW1wbCBydWxlX19EYXRhSW50ZXJjaGFuZ2VGaWxlRURJX19Hcm91cF9fMiApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo1NTY0OjI6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbGVFRElfX0dyb3VwX18xX19JbXBsIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbGVFRElfX0dyb3VwX18yCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo1ODIxOjE6ICggcnVsZV9fRGF0YUludGVyY2hhbmdlRmlsZUVESV9fR3JvdXBfXzFfX0ltcGwgcnVsZV9fRGF0YUludGVyY2hhbmdlRmlsZUVESV9fR3JvdXBfXzIgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NTgyMjoyOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VGaWxlRURJX19Hcm91cF9fMV9fSW1wbCBydWxlX19EYXRhSW50ZXJjaGFuZ2VGaWxlRURJX19Hcm91cF9fMgogICAgICAgICAgICAgewogICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfOSk7CiAgICAgICAgICAgICBydWxlX19EYXRhSW50ZXJjaGFuZ2VGaWxlRURJX19Hcm91cF9fMV9fSW1wbCgpOwpAQCAtMTk5MDMsMjIgKzIwOTI3LDIyIEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fRGF0YUludGVyY2hhbmdlRmlsZUVESV9fR3JvdXBfXzFfX0ltcGwiCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NTU3MToxOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VGaWxlRURJX19Hcm91cF9fMV9fSW1wbCA6ICggJ0VESScgKSA7CisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NTgyOToxOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VGaWxlRURJX19Hcm91cF9fMV9fSW1wbCA6ICggJ0VESScgKSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fRGF0YUludGVyY2hhbmdlRmlsZUVESV9fR3JvdXBfXzFfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NTU3NToxOiAoICggJ0VESScgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo1NTc2OjE6ICggJ0VESScgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NTgzMzoxOiAoICggJ0VESScgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo1ODM0OjE6ICggJ0VESScgKQogICAgICAgICAgICAgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NTU3NjoxOiAoICdFREknICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjU1Nzc6MjogJ0VESScKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjU4MzQ6MTogKCAnRURJJyApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo1ODM1OjI6ICdFREknCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldERhdGFJbnRlcmNoYW5nZUZpbGVFRElBY2Nlc3MoKS5nZXRFRElLZXl3b3JkXzEoKSk7IAogICAgICAgICAgICAgfQotICAgICAgICAgICAgbWF0Y2goaW5wdXQsODQsRk9MTE9XXzIpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOworICAgICAgICAgICAgbWF0Y2goaW5wdXQsODksRk9MTE9XXzIpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOwogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBhZnRlcihncmFtbWFyQWNjZXNzLmdldERhdGFJbnRlcmNoYW5nZUZpbGVFRElBY2Nlc3MoKS5nZXRFRElLZXl3b3JkXzEoKSk7IAogICAgICAgICAgICAgfQpAQCAtMTk5NDQsMTQgKzIwOTY4LDE0IEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fRGF0YUludGVyY2hhbmdlRmlsZUVESV9fR3JvdXBfXzIiCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NTU4NjoxOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VGaWxlRURJX19Hcm91cF9fMiA6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbGVFRElfX0dyb3VwX18yX19JbXBsIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbGVFRElfX0dyb3VwX18zIDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo1ODQ0OjE6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbGVFRElfX0dyb3VwX18yIDogcnVsZV9fRGF0YUludGVyY2hhbmdlRmlsZUVESV9fR3JvdXBfXzJfX0ltcGwgcnVsZV9fRGF0YUludGVyY2hhbmdlRmlsZUVESV9fR3JvdXBfXzMgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbGVFRElfX0dyb3VwX18yKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjU1OTA6MTogKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VGaWxlRURJX19Hcm91cF9fMl9fSW1wbCBydWxlX19EYXRhSW50ZXJjaGFuZ2VGaWxlRURJX19Hcm91cF9fMyApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo1NTkxOjI6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbGVFRElfX0dyb3VwX18yX19JbXBsIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbGVFRElfX0dyb3VwX18zCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo1ODQ4OjE6ICggcnVsZV9fRGF0YUludGVyY2hhbmdlRmlsZUVESV9fR3JvdXBfXzJfX0ltcGwgcnVsZV9fRGF0YUludGVyY2hhbmdlRmlsZUVESV9fR3JvdXBfXzMgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NTg0OToyOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VGaWxlRURJX19Hcm91cF9fMl9fSW1wbCBydWxlX19EYXRhSW50ZXJjaGFuZ2VGaWxlRURJX19Hcm91cF9fMwogICAgICAgICAgICAgewogICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMjUpOwogICAgICAgICAgICAgcnVsZV9fRGF0YUludGVyY2hhbmdlRmlsZUVESV9fR3JvdXBfXzJfX0ltcGwoKTsKQEAgLTE5OTgyLDIzICsyMTAwNiwyMyBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbGVFRElfX0dyb3VwX18yX19JbXBsIgotICAgIC8vIEludGVybmFsRGF0YURTTC5nOjU1OTg6MTogcnVsZV9fRGF0YUludGVyY2hhbmdlRmlsZUVESV9fR3JvdXBfXzJfX0ltcGwgOiAoICggcnVsZV9fRGF0YUludGVyY2hhbmdlRmlsZUVESV9fRmlsZVVSTEFzc2lnbm1lbnRfMiApICkgOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjU4NTY6MTogcnVsZV9fRGF0YUludGVyY2hhbmdlRmlsZUVESV9fR3JvdXBfXzJfX0ltcGwgOiAoICggcnVsZV9fRGF0YUludGVyY2hhbmdlRmlsZUVESV9fRmlsZVVSTEFzc2lnbm1lbnRfMiApICkgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbGVFRElfX0dyb3VwX18yX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjU2MDI6MTogKCAoICggcnVsZV9fRGF0YUludGVyY2hhbmdlRmlsZUVESV9fRmlsZVVSTEFzc2lnbm1lbnRfMiApICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NTYwMzoxOiAoICggcnVsZV9fRGF0YUludGVyY2hhbmdlRmlsZUVESV9fRmlsZVVSTEFzc2lnbm1lbnRfMiApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjU4NjA6MTogKCAoICggcnVsZV9fRGF0YUludGVyY2hhbmdlRmlsZUVESV9fRmlsZVVSTEFzc2lnbm1lbnRfMiApICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NTg2MToxOiAoICggcnVsZV9fRGF0YUludGVyY2hhbmdlRmlsZUVESV9fRmlsZVVSTEFzc2lnbm1lbnRfMiApICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjU2MDM6MTogKCAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbGVFRElfX0ZpbGVVUkxBc3NpZ25tZW50XzIgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo1NjA0OjI6ICggcnVsZV9fRGF0YUludGVyY2hhbmdlRmlsZUVESV9fRmlsZVVSTEFzc2lnbm1lbnRfMiApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo1ODYxOjE6ICggKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VGaWxlRURJX19GaWxlVVJMQXNzaWdubWVudF8yICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NTg2MjoyOiAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbGVFRElfX0ZpbGVVUkxBc3NpZ25tZW50XzIgKQogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXREYXRhSW50ZXJjaGFuZ2VGaWxlRURJQWNjZXNzKCkuZ2V0RmlsZVVSTEFzc2lnbm1lbnRfMigpKTsgCiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo1NjA1OjI6ICggcnVsZV9fRGF0YUludGVyY2hhbmdlRmlsZUVESV9fRmlsZVVSTEFzc2lnbm1lbnRfMiApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo1NjA1OjM6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbGVFRElfX0ZpbGVVUkxBc3NpZ25tZW50XzIKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjU4NjM6MjogKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VGaWxlRURJX19GaWxlVVJMQXNzaWdubWVudF8yICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjU4NjM6MzogcnVsZV9fRGF0YUludGVyY2hhbmdlRmlsZUVESV9fRmlsZVVSTEFzc2lnbm1lbnRfMgogICAgICAgICAgICAgewogICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMik7CiAgICAgICAgICAgICBydWxlX19EYXRhSW50ZXJjaGFuZ2VGaWxlRURJX19GaWxlVVJMQXNzaWdubWVudF8yKCk7CkBAIC0yMDAzMywxNCArMjEwNTcsMTQgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19EYXRhSW50ZXJjaGFuZ2VGaWxlRURJX19Hcm91cF9fMyIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo1NjEzOjE6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbGVFRElfX0dyb3VwX18zIDogcnVsZV9fRGF0YUludGVyY2hhbmdlRmlsZUVESV9fR3JvdXBfXzNfX0ltcGwgcnVsZV9fRGF0YUludGVyY2hhbmdlRmlsZUVESV9fR3JvdXBfXzQgOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjU4NzE6MTogcnVsZV9fRGF0YUludGVyY2hhbmdlRmlsZUVESV9fR3JvdXBfXzMgOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VGaWxlRURJX19Hcm91cF9fM19fSW1wbCBydWxlX19EYXRhSW50ZXJjaGFuZ2VGaWxlRURJX19Hcm91cF9fNCA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fRGF0YUludGVyY2hhbmdlRmlsZUVESV9fR3JvdXBfXzMoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NTYxNzoxOiAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbGVFRElfX0dyb3VwX18zX19JbXBsIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbGVFRElfX0dyb3VwX180ICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjU2MTg6MjogcnVsZV9fRGF0YUludGVyY2hhbmdlRmlsZUVESV9fR3JvdXBfXzNfX0ltcGwgcnVsZV9fRGF0YUludGVyY2hhbmdlRmlsZUVESV9fR3JvdXBfXzQKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjU4NzU6MTogKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VGaWxlRURJX19Hcm91cF9fM19fSW1wbCBydWxlX19EYXRhSW50ZXJjaGFuZ2VGaWxlRURJX19Hcm91cF9fNCApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo1ODc2OjI6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbGVFRElfX0dyb3VwX18zX19JbXBsIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbGVFRElfX0dyb3VwX180CiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV18yNik7CiAgICAgICAgICAgICBydWxlX19EYXRhSW50ZXJjaGFuZ2VGaWxlRURJX19Hcm91cF9fM19fSW1wbCgpOwpAQCAtMjAwNzEsMjMgKzIxMDk1LDIzIEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fRGF0YUludGVyY2hhbmdlRmlsZUVESV9fR3JvdXBfXzNfX0ltcGwiCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NTYyNToxOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VGaWxlRURJX19Hcm91cF9fM19fSW1wbCA6ICggKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VGaWxlRURJX19Vbm9yZGVyZWRHcm91cF8zICkgKSA7CisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NTg4MzoxOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VGaWxlRURJX19Hcm91cF9fM19fSW1wbCA6ICggKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VGaWxlRURJX19Vbm9yZGVyZWRHcm91cF8zICkgKSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fRGF0YUludGVyY2hhbmdlRmlsZUVESV9fR3JvdXBfXzNfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NTYyOToxOiAoICggKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VGaWxlRURJX19Vbm9yZGVyZWRHcm91cF8zICkgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo1NjMwOjE6ICggKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VGaWxlRURJX19Vbm9yZGVyZWRHcm91cF8zICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NTg4NzoxOiAoICggKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VGaWxlRURJX19Vbm9yZGVyZWRHcm91cF8zICkgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo1ODg4OjE6ICggKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VGaWxlRURJX19Vbm9yZGVyZWRHcm91cF8zICkgKQogICAgICAgICAgICAgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NTYzMDoxOiAoICggcnVsZV9fRGF0YUludGVyY2hhbmdlRmlsZUVESV9fVW5vcmRlcmVkR3JvdXBfMyApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjU2MzE6MjogKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VGaWxlRURJX19Vbm9yZGVyZWRHcm91cF8zICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjU4ODg6MTogKCAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbGVFRElfX1Vub3JkZXJlZEdyb3VwXzMgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo1ODg5OjI6ICggcnVsZV9fRGF0YUludGVyY2hhbmdlRmlsZUVESV9fVW5vcmRlcmVkR3JvdXBfMyApCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldERhdGFJbnRlcmNoYW5nZUZpbGVFRElBY2Nlc3MoKS5nZXRVbm9yZGVyZWRHcm91cF8zKCkpOyAKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjU2MzI6MjogKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VGaWxlRURJX19Vbm9yZGVyZWRHcm91cF8zICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjU2MzI6MzogcnVsZV9fRGF0YUludGVyY2hhbmdlRmlsZUVESV9fVW5vcmRlcmVkR3JvdXBfMworICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NTg5MDoyOiAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbGVFRElfX1Vub3JkZXJlZEdyb3VwXzMgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NTg5MDozOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VGaWxlRURJX19Vbm9yZGVyZWRHcm91cF8zCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV18yKTsKICAgICAgICAgICAgIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbGVFRElfX1Vub3JkZXJlZEdyb3VwXzMoKTsKQEAgLTIwMTIyLDE0ICsyMTE0NiwxNCBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbGVFRElfX0dyb3VwX180IgotICAgIC8vIEludGVybmFsRGF0YURTTC5nOjU2NDA6MTogcnVsZV9fRGF0YUludGVyY2hhbmdlRmlsZUVESV9fR3JvdXBfXzQgOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VGaWxlRURJX19Hcm91cF9fNF9fSW1wbCBydWxlX19EYXRhSW50ZXJjaGFuZ2VGaWxlRURJX19Hcm91cF9fNSA7CisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NTg5ODoxOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VGaWxlRURJX19Hcm91cF9fNCA6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbGVFRElfX0dyb3VwX180X19JbXBsIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbGVFRElfX0dyb3VwX181IDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19EYXRhSW50ZXJjaGFuZ2VGaWxlRURJX19Hcm91cF9fNCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo1NjQ0OjE6ICggcnVsZV9fRGF0YUludGVyY2hhbmdlRmlsZUVESV9fR3JvdXBfXzRfX0ltcGwgcnVsZV9fRGF0YUludGVyY2hhbmdlRmlsZUVESV9fR3JvdXBfXzUgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NTY0NToyOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VGaWxlRURJX19Hcm91cF9fNF9fSW1wbCBydWxlX19EYXRhSW50ZXJjaGFuZ2VGaWxlRURJX19Hcm91cF9fNQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NTkwMjoxOiAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbGVFRElfX0dyb3VwX180X19JbXBsIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbGVFRElfX0dyb3VwX181ICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjU5MDM6MjogcnVsZV9fRGF0YUludGVyY2hhbmdlRmlsZUVESV9fR3JvdXBfXzRfX0ltcGwgcnVsZV9fRGF0YUludGVyY2hhbmdlRmlsZUVESV9fR3JvdXBfXzUKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzkpOwogICAgICAgICAgICAgcnVsZV9fRGF0YUludGVyY2hhbmdlRmlsZUVESV9fR3JvdXBfXzRfX0ltcGwoKTsKQEAgLTIwMTYwLDIyICsyMTE4NCwyMiBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbGVFRElfX0dyb3VwX180X19JbXBsIgotICAgIC8vIEludGVybmFsRGF0YURTTC5nOjU2NTI6MTogcnVsZV9fRGF0YUludGVyY2hhbmdlRmlsZUVESV9fR3JvdXBfXzRfX0ltcGwgOiAoICdtYXBwaW5nTW9kZWwnICkgOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjU5MTA6MTogcnVsZV9fRGF0YUludGVyY2hhbmdlRmlsZUVESV9fR3JvdXBfXzRfX0ltcGwgOiAoICdtYXBwaW5nTW9kZWwnICkgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbGVFRElfX0dyb3VwX180X19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjU2NTY6MTogKCAoICdtYXBwaW5nTW9kZWwnICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NTY1NzoxOiAoICdtYXBwaW5nTW9kZWwnICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjU5MTQ6MTogKCAoICdtYXBwaW5nTW9kZWwnICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NTkxNToxOiAoICdtYXBwaW5nTW9kZWwnICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjU2NTc6MTogKCAnbWFwcGluZ01vZGVsJyApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo1NjU4OjI6ICdtYXBwaW5nTW9kZWwnCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo1OTE1OjE6ICggJ21hcHBpbmdNb2RlbCcgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NTkxNjoyOiAnbWFwcGluZ01vZGVsJwogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXREYXRhSW50ZXJjaGFuZ2VGaWxlRURJQWNjZXNzKCkuZ2V0TWFwcGluZ01vZGVsS2V5d29yZF80KCkpOyAKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1hdGNoKGlucHV0LDg1LEZPTExPV18yKTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKKyAgICAgICAgICAgIG1hdGNoKGlucHV0LDkwLEZPTExPV18yKTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXREYXRhSW50ZXJjaGFuZ2VGaWxlRURJQWNjZXNzKCkuZ2V0TWFwcGluZ01vZGVsS2V5d29yZF80KCkpOyAKICAgICAgICAgICAgIH0KQEAgLTIwMjAxLDE0ICsyMTIyNSwxNCBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbGVFRElfX0dyb3VwX181IgotICAgIC8vIEludGVybmFsRGF0YURTTC5nOjU2Njc6MTogcnVsZV9fRGF0YUludGVyY2hhbmdlRmlsZUVESV9fR3JvdXBfXzUgOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VGaWxlRURJX19Hcm91cF9fNV9fSW1wbCBydWxlX19EYXRhSW50ZXJjaGFuZ2VGaWxlRURJX19Hcm91cF9fNiA7CisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NTkyNToxOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VGaWxlRURJX19Hcm91cF9fNSA6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbGVFRElfX0dyb3VwX181X19JbXBsIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbGVFRElfX0dyb3VwX182IDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19EYXRhSW50ZXJjaGFuZ2VGaWxlRURJX19Hcm91cF9fNSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo1NjcxOjE6ICggcnVsZV9fRGF0YUludGVyY2hhbmdlRmlsZUVESV9fR3JvdXBfXzVfX0ltcGwgcnVsZV9fRGF0YUludGVyY2hhbmdlRmlsZUVESV9fR3JvdXBfXzYgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NTY3MjoyOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VGaWxlRURJX19Hcm91cF9fNV9fSW1wbCBydWxlX19EYXRhSW50ZXJjaGFuZ2VGaWxlRURJX19Hcm91cF9fNgorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NTkyOToxOiAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbGVFRElfX0dyb3VwX181X19JbXBsIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbGVFRElfX0dyb3VwX182ICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjU5MzA6MjogcnVsZV9fRGF0YUludGVyY2hhbmdlRmlsZUVESV9fR3JvdXBfXzVfX0ltcGwgcnVsZV9fRGF0YUludGVyY2hhbmdlRmlsZUVESV9fR3JvdXBfXzYKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzI3KTsKICAgICAgICAgICAgIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbGVFRElfX0dyb3VwX181X19JbXBsKCk7CkBAIC0yMDIzOSwyMyArMjEyNjMsMjMgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19EYXRhSW50ZXJjaGFuZ2VGaWxlRURJX19Hcm91cF9fNV9fSW1wbCIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo1Njc5OjE6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbGVFRElfX0dyb3VwX181X19JbXBsIDogKCAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbGVFRElfX01hcHBpbmdNb2RlbEFzc2lnbm1lbnRfNSApICkgOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjU5Mzc6MTogcnVsZV9fRGF0YUludGVyY2hhbmdlRmlsZUVESV9fR3JvdXBfXzVfX0ltcGwgOiAoICggcnVsZV9fRGF0YUludGVyY2hhbmdlRmlsZUVESV9fTWFwcGluZ01vZGVsQXNzaWdubWVudF81ICkgKSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fRGF0YUludGVyY2hhbmdlRmlsZUVESV9fR3JvdXBfXzVfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NTY4MzoxOiAoICggKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VGaWxlRURJX19NYXBwaW5nTW9kZWxBc3NpZ25tZW50XzUgKSApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjU2ODQ6MTogKCAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbGVFRElfX01hcHBpbmdNb2RlbEFzc2lnbm1lbnRfNSApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjU5NDE6MTogKCAoICggcnVsZV9fRGF0YUludGVyY2hhbmdlRmlsZUVESV9fTWFwcGluZ01vZGVsQXNzaWdubWVudF81ICkgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo1OTQyOjE6ICggKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VGaWxlRURJX19NYXBwaW5nTW9kZWxBc3NpZ25tZW50XzUgKSApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo1Njg0OjE6ICggKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VGaWxlRURJX19NYXBwaW5nTW9kZWxBc3NpZ25tZW50XzUgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo1Njg1OjI6ICggcnVsZV9fRGF0YUludGVyY2hhbmdlRmlsZUVESV9fTWFwcGluZ01vZGVsQXNzaWdubWVudF81ICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjU5NDI6MTogKCAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbGVFRElfX01hcHBpbmdNb2RlbEFzc2lnbm1lbnRfNSApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjU5NDM6MjogKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VGaWxlRURJX19NYXBwaW5nTW9kZWxBc3NpZ25tZW50XzUgKQogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXREYXRhSW50ZXJjaGFuZ2VGaWxlRURJQWNjZXNzKCkuZ2V0TWFwcGluZ01vZGVsQXNzaWdubWVudF81KCkpOyAKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjU2ODY6MjogKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VGaWxlRURJX19NYXBwaW5nTW9kZWxBc3NpZ25tZW50XzUgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NTY4NjozOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VGaWxlRURJX19NYXBwaW5nTW9kZWxBc3NpZ25tZW50XzUKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjU5NDQ6MjogKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VGaWxlRURJX19NYXBwaW5nTW9kZWxBc3NpZ25tZW50XzUgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NTk0NDozOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VGaWxlRURJX19NYXBwaW5nTW9kZWxBc3NpZ25tZW50XzUKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzIpOwogICAgICAgICAgICAgcnVsZV9fRGF0YUludGVyY2hhbmdlRmlsZUVESV9fTWFwcGluZ01vZGVsQXNzaWdubWVudF81KCk7CkBAIC0yMDI5MCwxNCArMjEzMTQsMTQgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19EYXRhSW50ZXJjaGFuZ2VGaWxlRURJX19Hcm91cF9fNiIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo1Njk0OjE6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbGVFRElfX0dyb3VwX182IDogcnVsZV9fRGF0YUludGVyY2hhbmdlRmlsZUVESV9fR3JvdXBfXzZfX0ltcGwgOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjU5NTI6MTogcnVsZV9fRGF0YUludGVyY2hhbmdlRmlsZUVESV9fR3JvdXBfXzYgOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VGaWxlRURJX19Hcm91cF9fNl9fSW1wbCA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fRGF0YUludGVyY2hhbmdlRmlsZUVESV9fR3JvdXBfXzYoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NTY5ODoxOiAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbGVFRElfX0dyb3VwX182X19JbXBsICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjU2OTk6MjogcnVsZV9fRGF0YUludGVyY2hhbmdlRmlsZUVESV9fR3JvdXBfXzZfX0ltcGwKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjU5NTY6MTogKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VGaWxlRURJX19Hcm91cF9fNl9fSW1wbCApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo1OTU3OjI6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbGVFRElfX0dyb3VwX182X19JbXBsCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV18yKTsKICAgICAgICAgICAgIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbGVFRElfX0dyb3VwX182X19JbXBsKCk7CkBAIC0yMDMyMywzMSArMjEzNDcsMzEgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19EYXRhSW50ZXJjaGFuZ2VGaWxlRURJX19Hcm91cF9fNl9fSW1wbCIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo1NzA1OjE6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbGVFRElfX0dyb3VwX182X19JbXBsIDogKCAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbGVFRElfX1ZhbGlkYXRlQXNzaWdubWVudF82ICk/ICkgOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjU5NjM6MTogcnVsZV9fRGF0YUludGVyY2hhbmdlRmlsZUVESV9fR3JvdXBfXzZfX0ltcGwgOiAoICggcnVsZV9fRGF0YUludGVyY2hhbmdlRmlsZUVESV9fVmFsaWRhdGVBc3NpZ25tZW50XzYgKT8gKSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fRGF0YUludGVyY2hhbmdlRmlsZUVESV9fR3JvdXBfXzZfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NTcwOToxOiAoICggKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VGaWxlRURJX19WYWxpZGF0ZUFzc2lnbm1lbnRfNiApPyApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjU3MTA6MTogKCAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbGVFRElfX1ZhbGlkYXRlQXNzaWdubWVudF82ICk/ICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjU5Njc6MTogKCAoICggcnVsZV9fRGF0YUludGVyY2hhbmdlRmlsZUVESV9fVmFsaWRhdGVBc3NpZ25tZW50XzYgKT8gKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo1OTY4OjE6ICggKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VGaWxlRURJX19WYWxpZGF0ZUFzc2lnbm1lbnRfNiApPyApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo1NzEwOjE6ICggKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VGaWxlRURJX19WYWxpZGF0ZUFzc2lnbm1lbnRfNiApPyApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo1NzExOjI6ICggcnVsZV9fRGF0YUludGVyY2hhbmdlRmlsZUVESV9fVmFsaWRhdGVBc3NpZ25tZW50XzYgKT8KKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjU5Njg6MTogKCAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbGVFRElfX1ZhbGlkYXRlQXNzaWdubWVudF82ICk/ICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjU5Njk6MjogKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VGaWxlRURJX19WYWxpZGF0ZUFzc2lnbm1lbnRfNiApPwogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXREYXRhSW50ZXJjaGFuZ2VGaWxlRURJQWNjZXNzKCkuZ2V0VmFsaWRhdGVBc3NpZ25tZW50XzYoKSk7IAogICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NTcxMjoyOiAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbGVFRElfX1ZhbGlkYXRlQXNzaWdubWVudF82ICk/Ci0gICAgICAgICAgICBpbnQgYWx0NjI9MjsKLSAgICAgICAgICAgIGludCBMQTYyXzAgPSBpbnB1dC5MQSgxKTsKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjU5NzA6MjogKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VGaWxlRURJX19WYWxpZGF0ZUFzc2lnbm1lbnRfNiApPworICAgICAgICAgICAgaW50IGFsdDY2PTI7CisgICAgICAgICAgICBpbnQgTEE2Nl8wID0gaW5wdXQuTEEoMSk7CiAKLSAgICAgICAgICAgIGlmICggKExBNjJfMD09MTQzKSApIHsKLSAgICAgICAgICAgICAgICBhbHQ2Mj0xOworICAgICAgICAgICAgaWYgKCAoTEE2Nl8wPT0xNTQpICkgeworICAgICAgICAgICAgICAgIGFsdDY2PTE7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBzd2l0Y2ggKGFsdDYyKSB7CisgICAgICAgICAgICBzd2l0Y2ggKGFsdDY2KSB7CiAgICAgICAgICAgICAgICAgY2FzZSAxIDoKLSAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NTcxMjozOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VGaWxlRURJX19WYWxpZGF0ZUFzc2lnbm1lbnRfNgorICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo1OTcwOjM6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbGVFRElfX1ZhbGlkYXRlQXNzaWdubWVudF82CiAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMik7CiAgICAgICAgICAgICAgICAgICAgIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbGVFRElfX1ZhbGlkYXRlQXNzaWdubWVudF82KCk7CkBAIC0yMDM4NSwxNCArMjE0MDksMTQgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19EYXRhSW50ZXJjaGFuZ2VGaWxlRURJX19Hcm91cF8zXzBfXzAiCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NTcyMToxOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VGaWxlRURJX19Hcm91cF8zXzBfXzAgOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VGaWxlRURJX19Hcm91cF8zXzBfXzBfX0ltcGwgcnVsZV9fRGF0YUludGVyY2hhbmdlRmlsZUVESV9fR3JvdXBfM18wX18xIDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo1OTc5OjE6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbGVFRElfX0dyb3VwXzNfMF9fMCA6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbGVFRElfX0dyb3VwXzNfMF9fMF9fSW1wbCBydWxlX19EYXRhSW50ZXJjaGFuZ2VGaWxlRURJX19Hcm91cF8zXzBfXzEgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbGVFRElfX0dyb3VwXzNfMF9fMCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo1NzI1OjE6ICggcnVsZV9fRGF0YUludGVyY2hhbmdlRmlsZUVESV9fR3JvdXBfM18wX18wX19JbXBsIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbGVFRElfX0dyb3VwXzNfMF9fMSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo1NzI2OjI6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbGVFRElfX0dyb3VwXzNfMF9fMF9fSW1wbCBydWxlX19EYXRhSW50ZXJjaGFuZ2VGaWxlRURJX19Hcm91cF8zXzBfXzEKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjU5ODM6MTogKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VGaWxlRURJX19Hcm91cF8zXzBfXzBfX0ltcGwgcnVsZV9fRGF0YUludGVyY2hhbmdlRmlsZUVESV9fR3JvdXBfM18wX18xICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjU5ODQ6MjogcnVsZV9fRGF0YUludGVyY2hhbmdlRmlsZUVESV9fR3JvdXBfM18wX18wX19JbXBsIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbGVFRElfX0dyb3VwXzNfMF9fMQogICAgICAgICAgICAgewogICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfOSk7CiAgICAgICAgICAgICBydWxlX19EYXRhSW50ZXJjaGFuZ2VGaWxlRURJX19Hcm91cF8zXzBfXzBfX0ltcGwoKTsKQEAgLTIwNDIzLDIyICsyMTQ0NywyMiBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbGVFRElfX0dyb3VwXzNfMF9fMF9fSW1wbCIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo1NzMzOjE6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbGVFRElfX0dyb3VwXzNfMF9fMF9fSW1wbCA6ICggJ2VuY29kaW5nJyApIDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo1OTkxOjE6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbGVFRElfX0dyb3VwXzNfMF9fMF9fSW1wbCA6ICggJ2VuY29kaW5nJyApIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19EYXRhSW50ZXJjaGFuZ2VGaWxlRURJX19Hcm91cF8zXzBfXzBfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NTczNzoxOiAoICggJ2VuY29kaW5nJyApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjU3Mzg6MTogKCAnZW5jb2RpbmcnICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjU5OTU6MTogKCAoICdlbmNvZGluZycgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo1OTk2OjE6ICggJ2VuY29kaW5nJyApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo1NzM4OjE6ICggJ2VuY29kaW5nJyApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo1NzM5OjI6ICdlbmNvZGluZycKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjU5OTY6MTogKCAnZW5jb2RpbmcnICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjU5OTc6MjogJ2VuY29kaW5nJwogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXREYXRhSW50ZXJjaGFuZ2VGaWxlRURJQWNjZXNzKCkuZ2V0RW5jb2RpbmdLZXl3b3JkXzNfMF8wKCkpOyAKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1hdGNoKGlucHV0LDc4LEZPTExPV18yKTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKKyAgICAgICAgICAgIG1hdGNoKGlucHV0LDgzLEZPTExPV18yKTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXREYXRhSW50ZXJjaGFuZ2VGaWxlRURJQWNjZXNzKCkuZ2V0RW5jb2RpbmdLZXl3b3JkXzNfMF8wKCkpOyAKICAgICAgICAgICAgIH0KQEAgLTIwNDY0LDE0ICsyMTQ4OCwxNCBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbGVFRElfX0dyb3VwXzNfMF9fMSIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo1NzQ4OjE6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbGVFRElfX0dyb3VwXzNfMF9fMSA6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbGVFRElfX0dyb3VwXzNfMF9fMV9fSW1wbCA7CisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NjAwNjoxOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VGaWxlRURJX19Hcm91cF8zXzBfXzEgOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VGaWxlRURJX19Hcm91cF8zXzBfXzFfX0ltcGwgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbGVFRElfX0dyb3VwXzNfMF9fMSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo1NzUyOjE6ICggcnVsZV9fRGF0YUludGVyY2hhbmdlRmlsZUVESV9fR3JvdXBfM18wX18xX19JbXBsICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjU3NTM6MjogcnVsZV9fRGF0YUludGVyY2hhbmdlRmlsZUVESV9fR3JvdXBfM18wX18xX19JbXBsCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo2MDEwOjE6ICggcnVsZV9fRGF0YUludGVyY2hhbmdlRmlsZUVESV9fR3JvdXBfM18wX18xX19JbXBsICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjYwMTE6MjogcnVsZV9fRGF0YUludGVyY2hhbmdlRmlsZUVESV9fR3JvdXBfM18wX18xX19JbXBsCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV18yKTsKICAgICAgICAgICAgIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbGVFRElfX0dyb3VwXzNfMF9fMV9fSW1wbCgpOwpAQCAtMjA0OTcsMjMgKzIxNTIxLDIzIEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fRGF0YUludGVyY2hhbmdlRmlsZUVESV9fR3JvdXBfM18wX18xX19JbXBsIgotICAgIC8vIEludGVybmFsRGF0YURTTC5nOjU3NTk6MTogcnVsZV9fRGF0YUludGVyY2hhbmdlRmlsZUVESV9fR3JvdXBfM18wX18xX19JbXBsIDogKCAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbGVFRElfX0VuY29kaW5nQXNzaWdubWVudF8zXzBfMSApICkgOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjYwMTc6MTogcnVsZV9fRGF0YUludGVyY2hhbmdlRmlsZUVESV9fR3JvdXBfM18wX18xX19JbXBsIDogKCAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbGVFRElfX0VuY29kaW5nQXNzaWdubWVudF8zXzBfMSApICkgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbGVFRElfX0dyb3VwXzNfMF9fMV9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo1NzYzOjE6ICggKCAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbGVFRElfX0VuY29kaW5nQXNzaWdubWVudF8zXzBfMSApICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NTc2NDoxOiAoICggcnVsZV9fRGF0YUludGVyY2hhbmdlRmlsZUVESV9fRW5jb2RpbmdBc3NpZ25tZW50XzNfMF8xICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NjAyMToxOiAoICggKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VGaWxlRURJX19FbmNvZGluZ0Fzc2lnbm1lbnRfM18wXzEgKSApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjYwMjI6MTogKCAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbGVFRElfX0VuY29kaW5nQXNzaWdubWVudF8zXzBfMSApICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjU3NjQ6MTogKCAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbGVFRElfX0VuY29kaW5nQXNzaWdubWVudF8zXzBfMSApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjU3NjU6MjogKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VGaWxlRURJX19FbmNvZGluZ0Fzc2lnbm1lbnRfM18wXzEgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NjAyMjoxOiAoICggcnVsZV9fRGF0YUludGVyY2hhbmdlRmlsZUVESV9fRW5jb2RpbmdBc3NpZ25tZW50XzNfMF8xICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NjAyMzoyOiAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbGVFRElfX0VuY29kaW5nQXNzaWdubWVudF8zXzBfMSApCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldERhdGFJbnRlcmNoYW5nZUZpbGVFRElBY2Nlc3MoKS5nZXRFbmNvZGluZ0Fzc2lnbm1lbnRfM18wXzEoKSk7IAogICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NTc2NjoyOiAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbGVFRElfX0VuY29kaW5nQXNzaWdubWVudF8zXzBfMSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo1NzY2OjM6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbGVFRElfX0VuY29kaW5nQXNzaWdubWVudF8zXzBfMQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NjAyNDoyOiAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbGVFRElfX0VuY29kaW5nQXNzaWdubWVudF8zXzBfMSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo2MDI0OjM6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbGVFRElfX0VuY29kaW5nQXNzaWdubWVudF8zXzBfMQogICAgICAgICAgICAgewogICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMik7CiAgICAgICAgICAgICBydWxlX19EYXRhSW50ZXJjaGFuZ2VGaWxlRURJX19FbmNvZGluZ0Fzc2lnbm1lbnRfM18wXzEoKTsKQEAgLTIwNTQ4LDE0ICsyMTU3MiwxNCBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbGVFRElfX0dyb3VwXzNfMV9fMCIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo1Nzc1OjE6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbGVFRElfX0dyb3VwXzNfMV9fMCA6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbGVFRElfX0dyb3VwXzNfMV9fMF9fSW1wbCBydWxlX19EYXRhSW50ZXJjaGFuZ2VGaWxlRURJX19Hcm91cF8zXzFfXzEgOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjYwMzM6MTogcnVsZV9fRGF0YUludGVyY2hhbmdlRmlsZUVESV9fR3JvdXBfM18xX18wIDogcnVsZV9fRGF0YUludGVyY2hhbmdlRmlsZUVESV9fR3JvdXBfM18xX18wX19JbXBsIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbGVFRElfX0dyb3VwXzNfMV9fMSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fRGF0YUludGVyY2hhbmdlRmlsZUVESV9fR3JvdXBfM18xX18wKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjU3Nzk6MTogKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VGaWxlRURJX19Hcm91cF8zXzFfXzBfX0ltcGwgcnVsZV9fRGF0YUludGVyY2hhbmdlRmlsZUVESV9fR3JvdXBfM18xX18xICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjU3ODA6MjogcnVsZV9fRGF0YUludGVyY2hhbmdlRmlsZUVESV9fR3JvdXBfM18xX18wX19JbXBsIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbGVFRElfX0dyb3VwXzNfMV9fMQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NjAzNzoxOiAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbGVFRElfX0dyb3VwXzNfMV9fMF9fSW1wbCBydWxlX19EYXRhSW50ZXJjaGFuZ2VGaWxlRURJX19Hcm91cF8zXzFfXzEgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NjAzODoyOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VGaWxlRURJX19Hcm91cF8zXzFfXzBfX0ltcGwgcnVsZV9fRGF0YUludGVyY2hhbmdlRmlsZUVESV9fR3JvdXBfM18xX18xCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV185KTsKICAgICAgICAgICAgIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbGVFRElfX0dyb3VwXzNfMV9fMF9fSW1wbCgpOwpAQCAtMjA1ODYsMjIgKzIxNjEwLDIyIEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fRGF0YUludGVyY2hhbmdlRmlsZUVESV9fR3JvdXBfM18xX18wX19JbXBsIgotICAgIC8vIEludGVybmFsRGF0YURTTC5nOjU3ODc6MTogcnVsZV9fRGF0YUludGVyY2hhbmdlRmlsZUVESV9fR3JvdXBfM18xX18wX19JbXBsIDogKCAnbG9jYWxlJyApIDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo2MDQ1OjE6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbGVFRElfX0dyb3VwXzNfMV9fMF9fSW1wbCA6ICggJ2xvY2FsZScgKSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fRGF0YUludGVyY2hhbmdlRmlsZUVESV9fR3JvdXBfM18xX18wX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjU3OTE6MTogKCAoICdsb2NhbGUnICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NTc5MjoxOiAoICdsb2NhbGUnICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjYwNDk6MTogKCAoICdsb2NhbGUnICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NjA1MDoxOiAoICdsb2NhbGUnICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjU3OTI6MTogKCAnbG9jYWxlJyApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo1NzkzOjI6ICdsb2NhbGUnCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo2MDUwOjE6ICggJ2xvY2FsZScgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NjA1MToyOiAnbG9jYWxlJwogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXREYXRhSW50ZXJjaGFuZ2VGaWxlRURJQWNjZXNzKCkuZ2V0TG9jYWxlS2V5d29yZF8zXzFfMCgpKTsgCiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBtYXRjaChpbnB1dCw3OSxGT0xMT1dfMik7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CisgICAgICAgICAgICBtYXRjaChpbnB1dCw4NCxGT0xMT1dfMik7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YUludGVyY2hhbmdlRmlsZUVESUFjY2VzcygpLmdldExvY2FsZUtleXdvcmRfM18xXzAoKSk7IAogICAgICAgICAgICAgfQpAQCAtMjA2MjcsMTQgKzIxNjUxLDE0IEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fRGF0YUludGVyY2hhbmdlRmlsZUVESV9fR3JvdXBfM18xX18xIgotICAgIC8vIEludGVybmFsRGF0YURTTC5nOjU4MDI6MTogcnVsZV9fRGF0YUludGVyY2hhbmdlRmlsZUVESV9fR3JvdXBfM18xX18xIDogcnVsZV9fRGF0YUludGVyY2hhbmdlRmlsZUVESV9fR3JvdXBfM18xX18xX19JbXBsIDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo2MDYwOjE6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbGVFRElfX0dyb3VwXzNfMV9fMSA6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbGVFRElfX0dyb3VwXzNfMV9fMV9fSW1wbCA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fRGF0YUludGVyY2hhbmdlRmlsZUVESV9fR3JvdXBfM18xX18xKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjU4MDY6MTogKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VGaWxlRURJX19Hcm91cF8zXzFfXzFfX0ltcGwgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NTgwNzoyOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VGaWxlRURJX19Hcm91cF8zXzFfXzFfX0ltcGwKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjYwNjQ6MTogKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VGaWxlRURJX19Hcm91cF8zXzFfXzFfX0ltcGwgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NjA2NToyOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VGaWxlRURJX19Hcm91cF8zXzFfXzFfX0ltcGwKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzIpOwogICAgICAgICAgICAgcnVsZV9fRGF0YUludGVyY2hhbmdlRmlsZUVESV9fR3JvdXBfM18xX18xX19JbXBsKCk7CkBAIC0yMDY2MCwyMyArMjE2ODQsMjMgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19EYXRhSW50ZXJjaGFuZ2VGaWxlRURJX19Hcm91cF8zXzFfXzFfX0ltcGwiCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NTgxMzoxOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VGaWxlRURJX19Hcm91cF8zXzFfXzFfX0ltcGwgOiAoICggcnVsZV9fRGF0YUludGVyY2hhbmdlRmlsZUVESV9fTG9jYWxlQXNzaWdubWVudF8zXzFfMSApICkgOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjYwNzE6MTogcnVsZV9fRGF0YUludGVyY2hhbmdlRmlsZUVESV9fR3JvdXBfM18xX18xX19JbXBsIDogKCAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbGVFRElfX0xvY2FsZUFzc2lnbm1lbnRfM18xXzEgKSApIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19EYXRhSW50ZXJjaGFuZ2VGaWxlRURJX19Hcm91cF8zXzFfXzFfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NTgxNzoxOiAoICggKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VGaWxlRURJX19Mb2NhbGVBc3NpZ25tZW50XzNfMV8xICkgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo1ODE4OjE6ICggKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VGaWxlRURJX19Mb2NhbGVBc3NpZ25tZW50XzNfMV8xICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NjA3NToxOiAoICggKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VGaWxlRURJX19Mb2NhbGVBc3NpZ25tZW50XzNfMV8xICkgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo2MDc2OjE6ICggKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VGaWxlRURJX19Mb2NhbGVBc3NpZ25tZW50XzNfMV8xICkgKQogICAgICAgICAgICAgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NTgxODoxOiAoICggcnVsZV9fRGF0YUludGVyY2hhbmdlRmlsZUVESV9fTG9jYWxlQXNzaWdubWVudF8zXzFfMSApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjU4MTk6MjogKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VGaWxlRURJX19Mb2NhbGVBc3NpZ25tZW50XzNfMV8xICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjYwNzY6MTogKCAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbGVFRElfX0xvY2FsZUFzc2lnbm1lbnRfM18xXzEgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo2MDc3OjI6ICggcnVsZV9fRGF0YUludGVyY2hhbmdlRmlsZUVESV9fTG9jYWxlQXNzaWdubWVudF8zXzFfMSApCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldERhdGFJbnRlcmNoYW5nZUZpbGVFRElBY2Nlc3MoKS5nZXRMb2NhbGVBc3NpZ25tZW50XzNfMV8xKCkpOyAKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjU4MjA6MjogKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VGaWxlRURJX19Mb2NhbGVBc3NpZ25tZW50XzNfMV8xICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjU4MjA6MzogcnVsZV9fRGF0YUludGVyY2hhbmdlRmlsZUVESV9fTG9jYWxlQXNzaWdubWVudF8zXzFfMQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NjA3ODoyOiAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbGVFRElfX0xvY2FsZUFzc2lnbm1lbnRfM18xXzEgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NjA3ODozOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VGaWxlRURJX19Mb2NhbGVBc3NpZ25tZW50XzNfMV8xCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV18yKTsKICAgICAgICAgICAgIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbGVFRElfX0xvY2FsZUFzc2lnbm1lbnRfM18xXzEoKTsKQEAgLTIwNzExLDE0ICsyMTczNSwxNCBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX0RhdGFJbnRlcmNoYW5nZUJlYW5fX0dyb3VwX18wIgotICAgIC8vIEludGVybmFsRGF0YURTTC5nOjU4Mjk6MTogcnVsZV9fRGF0YUludGVyY2hhbmdlQmVhbl9fR3JvdXBfXzAgOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VCZWFuX19Hcm91cF9fMF9fSW1wbCBydWxlX19EYXRhSW50ZXJjaGFuZ2VCZWFuX19Hcm91cF9fMSA7CisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NjA4NzoxOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VCZWFuX19Hcm91cF9fMCA6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUJlYW5fX0dyb3VwX18wX19JbXBsIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUJlYW5fX0dyb3VwX18xIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19EYXRhSW50ZXJjaGFuZ2VCZWFuX19Hcm91cF9fMCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo1ODMzOjE6ICggcnVsZV9fRGF0YUludGVyY2hhbmdlQmVhbl9fR3JvdXBfXzBfX0ltcGwgcnVsZV9fRGF0YUludGVyY2hhbmdlQmVhbl9fR3JvdXBfXzEgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NTgzNDoyOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VCZWFuX19Hcm91cF9fMF9fSW1wbCBydWxlX19EYXRhSW50ZXJjaGFuZ2VCZWFuX19Hcm91cF9fMQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NjA5MToxOiAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUJlYW5fX0dyb3VwX18wX19JbXBsIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUJlYW5fX0dyb3VwX18xICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjYwOTI6MjogcnVsZV9fRGF0YUludGVyY2hhbmdlQmVhbl9fR3JvdXBfXzBfX0ltcGwgcnVsZV9fRGF0YUludGVyY2hhbmdlQmVhbl9fR3JvdXBfXzEKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzI4KTsKICAgICAgICAgICAgIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUJlYW5fX0dyb3VwX18wX19JbXBsKCk7CkBAIC0yMDc0OSwyMyArMjE3NzMsMjMgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19EYXRhSW50ZXJjaGFuZ2VCZWFuX19Hcm91cF9fMF9fSW1wbCIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo1ODQxOjE6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUJlYW5fX0dyb3VwX18wX19JbXBsIDogKCAoKSApIDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo2MDk5OjE6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUJlYW5fX0dyb3VwX18wX19JbXBsIDogKCAoKSApIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19EYXRhSW50ZXJjaGFuZ2VCZWFuX19Hcm91cF9fMF9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo1ODQ1OjE6ICggKCAoKSApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjU4NDY6MTogKCAoKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo2MTAzOjE6ICggKCAoKSApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjYxMDQ6MTogKCAoKSApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo1ODQ2OjE6ICggKCkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NTg0NzoyOiAoKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NjEwNDoxOiAoICgpICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjYxMDU6MjogKCkKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YUludGVyY2hhbmdlQmVhbkFjY2VzcygpLmdldERhdGFJbnRlcmNoYW5nZUJlYW5BY3Rpb25fMCgpKTsgCiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo1ODQ4OjI6ICgpCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo1ODQ4OjM6IAorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NjEwNjoyOiAoKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NjEwNjozOiAKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIH0KIApAQCAtMjA3OTAsMTQgKzIxODE0LDE0IEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fRGF0YUludGVyY2hhbmdlQmVhbl9fR3JvdXBfXzEiCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NTg1NjoxOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VCZWFuX19Hcm91cF9fMSA6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUJlYW5fX0dyb3VwX18xX19JbXBsIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUJlYW5fX0dyb3VwX18yIDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo2MTE0OjE6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUJlYW5fX0dyb3VwX18xIDogcnVsZV9fRGF0YUludGVyY2hhbmdlQmVhbl9fR3JvdXBfXzFfX0ltcGwgcnVsZV9fRGF0YUludGVyY2hhbmdlQmVhbl9fR3JvdXBfXzIgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUJlYW5fX0dyb3VwX18xKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjU4NjA6MTogKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VCZWFuX19Hcm91cF9fMV9fSW1wbCBydWxlX19EYXRhSW50ZXJjaGFuZ2VCZWFuX19Hcm91cF9fMiApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo1ODYxOjI6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUJlYW5fX0dyb3VwX18xX19JbXBsIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUJlYW5fX0dyb3VwX18yCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo2MTE4OjE6ICggcnVsZV9fRGF0YUludGVyY2hhbmdlQmVhbl9fR3JvdXBfXzFfX0ltcGwgcnVsZV9fRGF0YUludGVyY2hhbmdlQmVhbl9fR3JvdXBfXzIgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NjExOToyOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VCZWFuX19Hcm91cF9fMV9fSW1wbCBydWxlX19EYXRhSW50ZXJjaGFuZ2VCZWFuX19Hcm91cF9fMgogICAgICAgICAgICAgewogICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfNyk7CiAgICAgICAgICAgICBydWxlX19EYXRhSW50ZXJjaGFuZ2VCZWFuX19Hcm91cF9fMV9fSW1wbCgpOwpAQCAtMjA4MjgsMjIgKzIxODUyLDIyIEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fRGF0YUludGVyY2hhbmdlQmVhbl9fR3JvdXBfXzFfX0ltcGwiCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NTg2ODoxOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VCZWFuX19Hcm91cF9fMV9fSW1wbCA6ICggJ2VudGl0eScgKSA7CisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NjEyNjoxOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VCZWFuX19Hcm91cF9fMV9fSW1wbCA6ICggJ2VudGl0eScgKSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fRGF0YUludGVyY2hhbmdlQmVhbl9fR3JvdXBfXzFfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NTg3MjoxOiAoICggJ2VudGl0eScgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo1ODczOjE6ICggJ2VudGl0eScgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NjEzMDoxOiAoICggJ2VudGl0eScgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo2MTMxOjE6ICggJ2VudGl0eScgKQogICAgICAgICAgICAgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NTg3MzoxOiAoICdlbnRpdHknICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjU4NzQ6MjogJ2VudGl0eScKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjYxMzE6MTogKCAnZW50aXR5JyApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo2MTMyOjI6ICdlbnRpdHknCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldERhdGFJbnRlcmNoYW5nZUJlYW5BY2Nlc3MoKS5nZXRFbnRpdHlLZXl3b3JkXzEoKSk7IAogICAgICAgICAgICAgfQotICAgICAgICAgICAgbWF0Y2goaW5wdXQsODYsRk9MTE9XXzIpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOworICAgICAgICAgICAgbWF0Y2goaW5wdXQsOTEsRk9MTE9XXzIpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOwogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBhZnRlcihncmFtbWFyQWNjZXNzLmdldERhdGFJbnRlcmNoYW5nZUJlYW5BY2Nlc3MoKS5nZXRFbnRpdHlLZXl3b3JkXzEoKSk7IAogICAgICAgICAgICAgfQpAQCAtMjA4NjksMTQgKzIxODkzLDE0IEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fRGF0YUludGVyY2hhbmdlQmVhbl9fR3JvdXBfXzIiCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NTg4MzoxOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VCZWFuX19Hcm91cF9fMiA6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUJlYW5fX0dyb3VwX18yX19JbXBsIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUJlYW5fX0dyb3VwX18zIDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo2MTQxOjE6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUJlYW5fX0dyb3VwX18yIDogcnVsZV9fRGF0YUludGVyY2hhbmdlQmVhbl9fR3JvdXBfXzJfX0ltcGwgcnVsZV9fRGF0YUludGVyY2hhbmdlQmVhbl9fR3JvdXBfXzMgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUJlYW5fX0dyb3VwX18yKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjU4ODc6MTogKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VCZWFuX19Hcm91cF9fMl9fSW1wbCBydWxlX19EYXRhSW50ZXJjaGFuZ2VCZWFuX19Hcm91cF9fMyApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo1ODg4OjI6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUJlYW5fX0dyb3VwX18yX19JbXBsIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUJlYW5fX0dyb3VwX18zCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo2MTQ1OjE6ICggcnVsZV9fRGF0YUludGVyY2hhbmdlQmVhbl9fR3JvdXBfXzJfX0ltcGwgcnVsZV9fRGF0YUludGVyY2hhbmdlQmVhbl9fR3JvdXBfXzMgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NjE0NjoyOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VCZWFuX19Hcm91cF9fMl9fSW1wbCBydWxlX19EYXRhSW50ZXJjaGFuZ2VCZWFuX19Hcm91cF9fMwogICAgICAgICAgICAgewogICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMjkpOwogICAgICAgICAgICAgcnVsZV9fRGF0YUludGVyY2hhbmdlQmVhbl9fR3JvdXBfXzJfX0ltcGwoKTsKQEAgLTIwOTA3LDIzICsyMTkzMSwyMyBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX0RhdGFJbnRlcmNoYW5nZUJlYW5fX0dyb3VwX18yX19JbXBsIgotICAgIC8vIEludGVybmFsRGF0YURTTC5nOjU4OTU6MTogcnVsZV9fRGF0YUludGVyY2hhbmdlQmVhbl9fR3JvdXBfXzJfX0ltcGwgOiAoICggcnVsZV9fRGF0YUludGVyY2hhbmdlQmVhbl9fRW50aXR5QXNzaWdubWVudF8yICkgKSA7CisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NjE1MzoxOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VCZWFuX19Hcm91cF9fMl9fSW1wbCA6ICggKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VCZWFuX19FbnRpdHlBc3NpZ25tZW50XzIgKSApIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19EYXRhSW50ZXJjaGFuZ2VCZWFuX19Hcm91cF9fMl9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo1ODk5OjE6ICggKCAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUJlYW5fX0VudGl0eUFzc2lnbm1lbnRfMiApICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NTkwMDoxOiAoICggcnVsZV9fRGF0YUludGVyY2hhbmdlQmVhbl9fRW50aXR5QXNzaWdubWVudF8yICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NjE1NzoxOiAoICggKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VCZWFuX19FbnRpdHlBc3NpZ25tZW50XzIgKSApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjYxNTg6MTogKCAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUJlYW5fX0VudGl0eUFzc2lnbm1lbnRfMiApICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjU5MDA6MTogKCAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUJlYW5fX0VudGl0eUFzc2lnbm1lbnRfMiApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjU5MDE6MjogKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VCZWFuX19FbnRpdHlBc3NpZ25tZW50XzIgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NjE1ODoxOiAoICggcnVsZV9fRGF0YUludGVyY2hhbmdlQmVhbl9fRW50aXR5QXNzaWdubWVudF8yICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NjE1OToyOiAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUJlYW5fX0VudGl0eUFzc2lnbm1lbnRfMiApCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldERhdGFJbnRlcmNoYW5nZUJlYW5BY2Nlc3MoKS5nZXRFbnRpdHlBc3NpZ25tZW50XzIoKSk7IAogICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NTkwMjoyOiAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUJlYW5fX0VudGl0eUFzc2lnbm1lbnRfMiApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo1OTAyOjM6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUJlYW5fX0VudGl0eUFzc2lnbm1lbnRfMgorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NjE2MDoyOiAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUJlYW5fX0VudGl0eUFzc2lnbm1lbnRfMiApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo2MTYwOjM6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUJlYW5fX0VudGl0eUFzc2lnbm1lbnRfMgogICAgICAgICAgICAgewogICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMik7CiAgICAgICAgICAgICBydWxlX19EYXRhSW50ZXJjaGFuZ2VCZWFuX19FbnRpdHlBc3NpZ25tZW50XzIoKTsKQEAgLTIwOTU4LDE0ICsyMTk4MiwxNCBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX0RhdGFJbnRlcmNoYW5nZUJlYW5fX0dyb3VwX18zIgotICAgIC8vIEludGVybmFsRGF0YURTTC5nOjU5MTA6MTogcnVsZV9fRGF0YUludGVyY2hhbmdlQmVhbl9fR3JvdXBfXzMgOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VCZWFuX19Hcm91cF9fM19fSW1wbCBydWxlX19EYXRhSW50ZXJjaGFuZ2VCZWFuX19Hcm91cF9fNCA7CisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NjE2ODoxOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VCZWFuX19Hcm91cF9fMyA6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUJlYW5fX0dyb3VwX18zX19JbXBsIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUJlYW5fX0dyb3VwX180IDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19EYXRhSW50ZXJjaGFuZ2VCZWFuX19Hcm91cF9fMygpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo1OTE0OjE6ICggcnVsZV9fRGF0YUludGVyY2hhbmdlQmVhbl9fR3JvdXBfXzNfX0ltcGwgcnVsZV9fRGF0YUludGVyY2hhbmdlQmVhbl9fR3JvdXBfXzQgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NTkxNToyOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VCZWFuX19Hcm91cF9fM19fSW1wbCBydWxlX19EYXRhSW50ZXJjaGFuZ2VCZWFuX19Hcm91cF9fNAorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NjE3MjoxOiAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUJlYW5fX0dyb3VwX18zX19JbXBsIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUJlYW5fX0dyb3VwX180ICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjYxNzM6MjogcnVsZV9fRGF0YUludGVyY2hhbmdlQmVhbl9fR3JvdXBfXzNfX0ltcGwgcnVsZV9fRGF0YUludGVyY2hhbmdlQmVhbl9fR3JvdXBfXzQKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzI5KTsKICAgICAgICAgICAgIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUJlYW5fX0dyb3VwX18zX19JbXBsKCk7CkBAIC0yMDk5NiwzMSArMjIwMjAsMzEgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19EYXRhSW50ZXJjaGFuZ2VCZWFuX19Hcm91cF9fM19fSW1wbCIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo1OTIyOjE6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUJlYW5fX0dyb3VwX18zX19JbXBsIDogKCAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUJlYW5fX0dyb3VwXzNfXzAgKT8gKSA7CisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NjE4MDoxOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VCZWFuX19Hcm91cF9fM19fSW1wbCA6ICggKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VCZWFuX19Hcm91cF8zX18wICk/ICkgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUJlYW5fX0dyb3VwX18zX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjU5MjY6MTogKCAoICggcnVsZV9fRGF0YUludGVyY2hhbmdlQmVhbl9fR3JvdXBfM19fMCApPyApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjU5Mjc6MTogKCAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUJlYW5fX0dyb3VwXzNfXzAgKT8gKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NjE4NDoxOiAoICggKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VCZWFuX19Hcm91cF8zX18wICk/ICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NjE4NToxOiAoICggcnVsZV9fRGF0YUludGVyY2hhbmdlQmVhbl9fR3JvdXBfM19fMCApPyApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo1OTI3OjE6ICggKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VCZWFuX19Hcm91cF8zX18wICk/ICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjU5Mjg6MjogKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VCZWFuX19Hcm91cF8zX18wICk/CisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo2MTg1OjE6ICggKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VCZWFuX19Hcm91cF8zX18wICk/ICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjYxODY6MjogKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VCZWFuX19Hcm91cF8zX18wICk/CiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldERhdGFJbnRlcmNoYW5nZUJlYW5BY2Nlc3MoKS5nZXRHcm91cF8zKCkpOyAKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjU5Mjk6MjogKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VCZWFuX19Hcm91cF8zX18wICk/Ci0gICAgICAgICAgICBpbnQgYWx0NjM9MjsKLSAgICAgICAgICAgIGludCBMQTYzXzAgPSBpbnB1dC5MQSgxKTsKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjYxODc6MjogKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VCZWFuX19Hcm91cF8zX18wICk/CisgICAgICAgICAgICBpbnQgYWx0Njc9MjsKKyAgICAgICAgICAgIGludCBMQTY3XzAgPSBpbnB1dC5MQSgxKTsKIAotICAgICAgICAgICAgaWYgKCAoTEE2M18wPT04NykgKSB7Ci0gICAgICAgICAgICAgICAgYWx0NjM9MTsKKyAgICAgICAgICAgIGlmICggKExBNjdfMD09OTIpICkgeworICAgICAgICAgICAgICAgIGFsdDY3PTE7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBzd2l0Y2ggKGFsdDYzKSB7CisgICAgICAgICAgICBzd2l0Y2ggKGFsdDY3KSB7CiAgICAgICAgICAgICAgICAgY2FzZSAxIDoKLSAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NTkyOTozOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VCZWFuX19Hcm91cF8zX18wCisgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjYxODc6MzogcnVsZV9fRGF0YUludGVyY2hhbmdlQmVhbl9fR3JvdXBfM19fMAogICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzIpOwogICAgICAgICAgICAgICAgICAgICBydWxlX19EYXRhSW50ZXJjaGFuZ2VCZWFuX19Hcm91cF8zX18wKCk7CkBAIC0yMTA1OCwxNCArMjIwODIsMTQgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19EYXRhSW50ZXJjaGFuZ2VCZWFuX19Hcm91cF9fNCIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo1OTM3OjE6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUJlYW5fX0dyb3VwX180IDogcnVsZV9fRGF0YUludGVyY2hhbmdlQmVhbl9fR3JvdXBfXzRfX0ltcGwgcnVsZV9fRGF0YUludGVyY2hhbmdlQmVhbl9fR3JvdXBfXzUgOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjYxOTU6MTogcnVsZV9fRGF0YUludGVyY2hhbmdlQmVhbl9fR3JvdXBfXzQgOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VCZWFuX19Hcm91cF9fNF9fSW1wbCBydWxlX19EYXRhSW50ZXJjaGFuZ2VCZWFuX19Hcm91cF9fNSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fRGF0YUludGVyY2hhbmdlQmVhbl9fR3JvdXBfXzQoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NTk0MToxOiAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUJlYW5fX0dyb3VwX180X19JbXBsIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUJlYW5fX0dyb3VwX181ICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjU5NDI6MjogcnVsZV9fRGF0YUludGVyY2hhbmdlQmVhbl9fR3JvdXBfXzRfX0ltcGwgcnVsZV9fRGF0YUludGVyY2hhbmdlQmVhbl9fR3JvdXBfXzUKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjYxOTk6MTogKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VCZWFuX19Hcm91cF9fNF9fSW1wbCBydWxlX19EYXRhSW50ZXJjaGFuZ2VCZWFuX19Hcm91cF9fNSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo2MjAwOjI6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUJlYW5fX0dyb3VwX180X19JbXBsIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUJlYW5fX0dyb3VwX181CiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV18yOSk7CiAgICAgICAgICAgICBydWxlX19EYXRhSW50ZXJjaGFuZ2VCZWFuX19Hcm91cF9fNF9fSW1wbCgpOwpAQCAtMjEwOTYsMzEgKzIyMTIwLDMxIEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fRGF0YUludGVyY2hhbmdlQmVhbl9fR3JvdXBfXzRfX0ltcGwiCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NTk0OToxOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VCZWFuX19Hcm91cF9fNF9fSW1wbCA6ICggKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VCZWFuX19Hcm91cF80X18wICk/ICkgOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjYyMDc6MTogcnVsZV9fRGF0YUludGVyY2hhbmdlQmVhbl9fR3JvdXBfXzRfX0ltcGwgOiAoICggcnVsZV9fRGF0YUludGVyY2hhbmdlQmVhbl9fR3JvdXBfNF9fMCApPyApIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19EYXRhSW50ZXJjaGFuZ2VCZWFuX19Hcm91cF9fNF9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo1OTUzOjE6ICggKCAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUJlYW5fX0dyb3VwXzRfXzAgKT8gKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo1OTU0OjE6ICggKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VCZWFuX19Hcm91cF80X18wICk/ICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjYyMTE6MTogKCAoICggcnVsZV9fRGF0YUludGVyY2hhbmdlQmVhbl9fR3JvdXBfNF9fMCApPyApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjYyMTI6MTogKCAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUJlYW5fX0dyb3VwXzRfXzAgKT8gKQogICAgICAgICAgICAgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NTk1NDoxOiAoICggcnVsZV9fRGF0YUludGVyY2hhbmdlQmVhbl9fR3JvdXBfNF9fMCApPyApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo1OTU1OjI6ICggcnVsZV9fRGF0YUludGVyY2hhbmdlQmVhbl9fR3JvdXBfNF9fMCApPworICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NjIxMjoxOiAoICggcnVsZV9fRGF0YUludGVyY2hhbmdlQmVhbl9fR3JvdXBfNF9fMCApPyApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo2MjEzOjI6ICggcnVsZV9fRGF0YUludGVyY2hhbmdlQmVhbl9fR3JvdXBfNF9fMCApPwogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXREYXRhSW50ZXJjaGFuZ2VCZWFuQWNjZXNzKCkuZ2V0R3JvdXBfNCgpKTsgCiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo1OTU2OjI6ICggcnVsZV9fRGF0YUludGVyY2hhbmdlQmVhbl9fR3JvdXBfNF9fMCApPwotICAgICAgICAgICAgaW50IGFsdDY0PTI7Ci0gICAgICAgICAgICBpbnQgTEE2NF8wID0gaW5wdXQuTEEoMSk7CisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo2MjE0OjI6ICggcnVsZV9fRGF0YUludGVyY2hhbmdlQmVhbl9fR3JvdXBfNF9fMCApPworICAgICAgICAgICAgaW50IGFsdDY4PTI7CisgICAgICAgICAgICBpbnQgTEE2OF8wID0gaW5wdXQuTEEoMSk7CiAKLSAgICAgICAgICAgIGlmICggKExBNjRfMD09ODgpICkgewotICAgICAgICAgICAgICAgIGFsdDY0PTE7CisgICAgICAgICAgICBpZiAoIChMQTY4XzA9PTkzKSApIHsKKyAgICAgICAgICAgICAgICBhbHQ2OD0xOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgc3dpdGNoIChhbHQ2NCkgeworICAgICAgICAgICAgc3dpdGNoIChhbHQ2OCkgewogICAgICAgICAgICAgICAgIGNhc2UgMSA6Ci0gICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjU5NTY6MzogcnVsZV9fRGF0YUludGVyY2hhbmdlQmVhbl9fR3JvdXBfNF9fMAorICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo2MjE0OjM6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUJlYW5fX0dyb3VwXzRfXzAKICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV18yKTsKICAgICAgICAgICAgICAgICAgICAgcnVsZV9fRGF0YUludGVyY2hhbmdlQmVhbl9fR3JvdXBfNF9fMCgpOwpAQCAtMjExNTgsMTQgKzIyMTgyLDE0IEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fRGF0YUludGVyY2hhbmdlQmVhbl9fR3JvdXBfXzUiCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NTk2NDoxOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VCZWFuX19Hcm91cF9fNSA6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUJlYW5fX0dyb3VwX181X19JbXBsIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUJlYW5fX0dyb3VwX182IDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo2MjIyOjE6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUJlYW5fX0dyb3VwX181IDogcnVsZV9fRGF0YUludGVyY2hhbmdlQmVhbl9fR3JvdXBfXzVfX0ltcGwgcnVsZV9fRGF0YUludGVyY2hhbmdlQmVhbl9fR3JvdXBfXzYgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUJlYW5fX0dyb3VwX181KCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjU5Njg6MTogKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VCZWFuX19Hcm91cF9fNV9fSW1wbCBydWxlX19EYXRhSW50ZXJjaGFuZ2VCZWFuX19Hcm91cF9fNiApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo1OTY5OjI6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUJlYW5fX0dyb3VwX181X19JbXBsIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUJlYW5fX0dyb3VwX182CisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo2MjI2OjE6ICggcnVsZV9fRGF0YUludGVyY2hhbmdlQmVhbl9fR3JvdXBfXzVfX0ltcGwgcnVsZV9fRGF0YUludGVyY2hhbmdlQmVhbl9fR3JvdXBfXzYgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NjIyNzoyOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VCZWFuX19Hcm91cF9fNV9fSW1wbCBydWxlX19EYXRhSW50ZXJjaGFuZ2VCZWFuX19Hcm91cF9fNgogICAgICAgICAgICAgewogICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMjkpOwogICAgICAgICAgICAgcnVsZV9fRGF0YUludGVyY2hhbmdlQmVhbl9fR3JvdXBfXzVfX0ltcGwoKTsKQEAgLTIxMTk2LDMxICsyMjIyMCwzMSBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX0RhdGFJbnRlcmNoYW5nZUJlYW5fX0dyb3VwX181X19JbXBsIgotICAgIC8vIEludGVybmFsRGF0YURTTC5nOjU5NzY6MTogcnVsZV9fRGF0YUludGVyY2hhbmdlQmVhbl9fR3JvdXBfXzVfX0ltcGwgOiAoICggcnVsZV9fRGF0YUludGVyY2hhbmdlQmVhbl9fR3JvdXBfNV9fMCApPyApIDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo2MjM0OjE6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUJlYW5fX0dyb3VwX181X19JbXBsIDogKCAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUJlYW5fX0dyb3VwXzVfXzAgKT8gKSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fRGF0YUludGVyY2hhbmdlQmVhbl9fR3JvdXBfXzVfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NTk4MDoxOiAoICggKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VCZWFuX19Hcm91cF81X18wICk/ICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NTk4MToxOiAoICggcnVsZV9fRGF0YUludGVyY2hhbmdlQmVhbl9fR3JvdXBfNV9fMCApPyApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo2MjM4OjE6ICggKCAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUJlYW5fX0dyb3VwXzVfXzAgKT8gKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo2MjM5OjE6ICggKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VCZWFuX19Hcm91cF81X18wICk/ICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjU5ODE6MTogKCAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUJlYW5fX0dyb3VwXzVfXzAgKT8gKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NTk4MjoyOiAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUJlYW5fX0dyb3VwXzVfXzAgKT8KKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjYyMzk6MTogKCAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUJlYW5fX0dyb3VwXzVfXzAgKT8gKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NjI0MDoyOiAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUJlYW5fX0dyb3VwXzVfXzAgKT8KICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YUludGVyY2hhbmdlQmVhbkFjY2VzcygpLmdldEdyb3VwXzUoKSk7IAogICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NTk4MzoyOiAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUJlYW5fX0dyb3VwXzVfXzAgKT8KLSAgICAgICAgICAgIGludCBhbHQ2NT0yOwotICAgICAgICAgICAgaW50IExBNjVfMCA9IGlucHV0LkxBKDEpOworICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NjI0MToyOiAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUJlYW5fX0dyb3VwXzVfXzAgKT8KKyAgICAgICAgICAgIGludCBhbHQ2OT0yOworICAgICAgICAgICAgaW50IExBNjlfMCA9IGlucHV0LkxBKDEpOwogCi0gICAgICAgICAgICBpZiAoIChMQTY1XzA9PTE0NCkgKSB7Ci0gICAgICAgICAgICAgICAgYWx0NjU9MTsKKyAgICAgICAgICAgIGlmICggKExBNjlfMD09MTU1KSApIHsKKyAgICAgICAgICAgICAgICBhbHQ2OT0xOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgc3dpdGNoIChhbHQ2NSkgeworICAgICAgICAgICAgc3dpdGNoIChhbHQ2OSkgewogICAgICAgICAgICAgICAgIGNhc2UgMSA6Ci0gICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjU5ODM6MzogcnVsZV9fRGF0YUludGVyY2hhbmdlQmVhbl9fR3JvdXBfNV9fMAorICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo2MjQxOjM6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUJlYW5fX0dyb3VwXzVfXzAKICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV18yKTsKICAgICAgICAgICAgICAgICAgICAgcnVsZV9fRGF0YUludGVyY2hhbmdlQmVhbl9fR3JvdXBfNV9fMCgpOwpAQCAtMjEyNTgsMTQgKzIyMjgyLDE0IEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fRGF0YUludGVyY2hhbmdlQmVhbl9fR3JvdXBfXzYiCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NTk5MToxOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VCZWFuX19Hcm91cF9fNiA6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUJlYW5fX0dyb3VwX182X19JbXBsIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUJlYW5fX0dyb3VwX183IDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo2MjQ5OjE6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUJlYW5fX0dyb3VwX182IDogcnVsZV9fRGF0YUludGVyY2hhbmdlQmVhbl9fR3JvdXBfXzZfX0ltcGwgcnVsZV9fRGF0YUludGVyY2hhbmdlQmVhbl9fR3JvdXBfXzcgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUJlYW5fX0dyb3VwX182KCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjU5OTU6MTogKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VCZWFuX19Hcm91cF9fNl9fSW1wbCBydWxlX19EYXRhSW50ZXJjaGFuZ2VCZWFuX19Hcm91cF9fNyApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo1OTk2OjI6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUJlYW5fX0dyb3VwX182X19JbXBsIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUJlYW5fX0dyb3VwX183CisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo2MjUzOjE6ICggcnVsZV9fRGF0YUludGVyY2hhbmdlQmVhbl9fR3JvdXBfXzZfX0ltcGwgcnVsZV9fRGF0YUludGVyY2hhbmdlQmVhbl9fR3JvdXBfXzcgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NjI1NDoyOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VCZWFuX19Hcm91cF9fNl9fSW1wbCBydWxlX19EYXRhSW50ZXJjaGFuZ2VCZWFuX19Hcm91cF9fNwogICAgICAgICAgICAgewogICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMjkpOwogICAgICAgICAgICAgcnVsZV9fRGF0YUludGVyY2hhbmdlQmVhbl9fR3JvdXBfXzZfX0ltcGwoKTsKQEAgLTIxMjk2LDMxICsyMjMyMCwzMSBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX0RhdGFJbnRlcmNoYW5nZUJlYW5fX0dyb3VwX182X19JbXBsIgotICAgIC8vIEludGVybmFsRGF0YURTTC5nOjYwMDM6MTogcnVsZV9fRGF0YUludGVyY2hhbmdlQmVhbl9fR3JvdXBfXzZfX0ltcGwgOiAoICggcnVsZV9fRGF0YUludGVyY2hhbmdlQmVhbl9fR3JvdXBfNl9fMCApPyApIDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo2MjYxOjE6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUJlYW5fX0dyb3VwX182X19JbXBsIDogKCAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUJlYW5fX0dyb3VwXzZfXzAgKT8gKSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fRGF0YUludGVyY2hhbmdlQmVhbl9fR3JvdXBfXzZfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NjAwNzoxOiAoICggKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VCZWFuX19Hcm91cF82X18wICk/ICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NjAwODoxOiAoICggcnVsZV9fRGF0YUludGVyY2hhbmdlQmVhbl9fR3JvdXBfNl9fMCApPyApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo2MjY1OjE6ICggKCAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUJlYW5fX0dyb3VwXzZfXzAgKT8gKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo2MjY2OjE6ICggKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VCZWFuX19Hcm91cF82X18wICk/ICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjYwMDg6MTogKCAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUJlYW5fX0dyb3VwXzZfXzAgKT8gKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NjAwOToyOiAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUJlYW5fX0dyb3VwXzZfXzAgKT8KKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjYyNjY6MTogKCAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUJlYW5fX0dyb3VwXzZfXzAgKT8gKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NjI2NzoyOiAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUJlYW5fX0dyb3VwXzZfXzAgKT8KICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YUludGVyY2hhbmdlQmVhbkFjY2VzcygpLmdldEdyb3VwXzYoKSk7IAogICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NjAxMDoyOiAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUJlYW5fX0dyb3VwXzZfXzAgKT8KLSAgICAgICAgICAgIGludCBhbHQ2Nj0yOwotICAgICAgICAgICAgaW50IExBNjZfMCA9IGlucHV0LkxBKDEpOworICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NjI2ODoyOiAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUJlYW5fX0dyb3VwXzZfXzAgKT8KKyAgICAgICAgICAgIGludCBhbHQ3MD0yOworICAgICAgICAgICAgaW50IExBNzBfMCA9IGlucHV0LkxBKDEpOwogCi0gICAgICAgICAgICBpZiAoIChMQTY2XzA9PTg5KSApIHsKLSAgICAgICAgICAgICAgICBhbHQ2Nj0xOworICAgICAgICAgICAgaWYgKCAoTEE3MF8wPT0xNTYpICkgeworICAgICAgICAgICAgICAgIGFsdDcwPTE7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBzd2l0Y2ggKGFsdDY2KSB7CisgICAgICAgICAgICBzd2l0Y2ggKGFsdDcwKSB7CiAgICAgICAgICAgICAgICAgY2FzZSAxIDoKLSAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NjAxMDozOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VCZWFuX19Hcm91cF82X18wCisgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjYyNjg6MzogcnVsZV9fRGF0YUludGVyY2hhbmdlQmVhbl9fR3JvdXBfNl9fMAogICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzIpOwogICAgICAgICAgICAgICAgICAgICBydWxlX19EYXRhSW50ZXJjaGFuZ2VCZWFuX19Hcm91cF82X18wKCk7CkBAIC0yMTM1OCwxNCArMjIzODIsMTQgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19EYXRhSW50ZXJjaGFuZ2VCZWFuX19Hcm91cF9fNyIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo2MDE4OjE6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUJlYW5fX0dyb3VwX183IDogcnVsZV9fRGF0YUludGVyY2hhbmdlQmVhbl9fR3JvdXBfXzdfX0ltcGwgcnVsZV9fRGF0YUludGVyY2hhbmdlQmVhbl9fR3JvdXBfXzggOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjYyNzY6MTogcnVsZV9fRGF0YUludGVyY2hhbmdlQmVhbl9fR3JvdXBfXzcgOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VCZWFuX19Hcm91cF9fN19fSW1wbCBydWxlX19EYXRhSW50ZXJjaGFuZ2VCZWFuX19Hcm91cF9fOCA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fRGF0YUludGVyY2hhbmdlQmVhbl9fR3JvdXBfXzcoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NjAyMjoxOiAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUJlYW5fX0dyb3VwX183X19JbXBsIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUJlYW5fX0dyb3VwX184ICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjYwMjM6MjogcnVsZV9fRGF0YUludGVyY2hhbmdlQmVhbl9fR3JvdXBfXzdfX0ltcGwgcnVsZV9fRGF0YUludGVyY2hhbmdlQmVhbl9fR3JvdXBfXzgKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjYyODA6MTogKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VCZWFuX19Hcm91cF9fN19fSW1wbCBydWxlX19EYXRhSW50ZXJjaGFuZ2VCZWFuX19Hcm91cF9fOCApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo2MjgxOjI6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUJlYW5fX0dyb3VwX183X19JbXBsIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUJlYW5fX0dyb3VwX184CiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV18yOSk7CiAgICAgICAgICAgICBydWxlX19EYXRhSW50ZXJjaGFuZ2VCZWFuX19Hcm91cF9fN19fSW1wbCgpOwpAQCAtMjEzOTYsMzEgKzIyNDIwLDMxIEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fRGF0YUludGVyY2hhbmdlQmVhbl9fR3JvdXBfXzdfX0ltcGwiCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NjAzMDoxOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VCZWFuX19Hcm91cF9fN19fSW1wbCA6ICggKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VCZWFuX19Hcm91cF83X18wICk/ICkgOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjYyODg6MTogcnVsZV9fRGF0YUludGVyY2hhbmdlQmVhbl9fR3JvdXBfXzdfX0ltcGwgOiAoICggcnVsZV9fRGF0YUludGVyY2hhbmdlQmVhbl9fR3JvdXBfN19fMCApPyApIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19EYXRhSW50ZXJjaGFuZ2VCZWFuX19Hcm91cF9fN19fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo2MDM0OjE6ICggKCAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUJlYW5fX0dyb3VwXzdfXzAgKT8gKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo2MDM1OjE6ICggKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VCZWFuX19Hcm91cF83X18wICk/ICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjYyOTI6MTogKCAoICggcnVsZV9fRGF0YUludGVyY2hhbmdlQmVhbl9fR3JvdXBfN19fMCApPyApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjYyOTM6MTogKCAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUJlYW5fX0dyb3VwXzdfXzAgKT8gKQogICAgICAgICAgICAgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NjAzNToxOiAoICggcnVsZV9fRGF0YUludGVyY2hhbmdlQmVhbl9fR3JvdXBfN19fMCApPyApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo2MDM2OjI6ICggcnVsZV9fRGF0YUludGVyY2hhbmdlQmVhbl9fR3JvdXBfN19fMCApPworICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NjI5MzoxOiAoICggcnVsZV9fRGF0YUludGVyY2hhbmdlQmVhbl9fR3JvdXBfN19fMCApPyApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo2Mjk0OjI6ICggcnVsZV9fRGF0YUludGVyY2hhbmdlQmVhbl9fR3JvdXBfN19fMCApPwogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXREYXRhSW50ZXJjaGFuZ2VCZWFuQWNjZXNzKCkuZ2V0R3JvdXBfNygpKTsgCiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo2MDM3OjI6ICggcnVsZV9fRGF0YUludGVyY2hhbmdlQmVhbl9fR3JvdXBfN19fMCApPwotICAgICAgICAgICAgaW50IGFsdDY3PTI7Ci0gICAgICAgICAgICBpbnQgTEE2N18wID0gaW5wdXQuTEEoMSk7CisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo2Mjk1OjI6ICggcnVsZV9fRGF0YUludGVyY2hhbmdlQmVhbl9fR3JvdXBfN19fMCApPworICAgICAgICAgICAgaW50IGFsdDcxPTI7CisgICAgICAgICAgICBpbnQgTEE3MV8wID0gaW5wdXQuTEEoMSk7CiAKLSAgICAgICAgICAgIGlmICggKExBNjdfMD09OTApICkgewotICAgICAgICAgICAgICAgIGFsdDY3PTE7CisgICAgICAgICAgICBpZiAoIChMQTcxXzA9PTk0KSApIHsKKyAgICAgICAgICAgICAgICBhbHQ3MT0xOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgc3dpdGNoIChhbHQ2NykgeworICAgICAgICAgICAgc3dpdGNoIChhbHQ3MSkgewogICAgICAgICAgICAgICAgIGNhc2UgMSA6Ci0gICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjYwMzc6MzogcnVsZV9fRGF0YUludGVyY2hhbmdlQmVhbl9fR3JvdXBfN19fMAorICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo2Mjk1OjM6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUJlYW5fX0dyb3VwXzdfXzAKICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV18yKTsKICAgICAgICAgICAgICAgICAgICAgcnVsZV9fRGF0YUludGVyY2hhbmdlQmVhbl9fR3JvdXBfN19fMCgpOwpAQCAtMjE0NTgsMTQgKzIyNDgyLDE0IEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fRGF0YUludGVyY2hhbmdlQmVhbl9fR3JvdXBfXzgiCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NjA0NToxOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VCZWFuX19Hcm91cF9fOCA6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUJlYW5fX0dyb3VwX184X19JbXBsIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUJlYW5fX0dyb3VwX185IDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo2MzAzOjE6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUJlYW5fX0dyb3VwX184IDogcnVsZV9fRGF0YUludGVyY2hhbmdlQmVhbl9fR3JvdXBfXzhfX0ltcGwgcnVsZV9fRGF0YUludGVyY2hhbmdlQmVhbl9fR3JvdXBfXzkgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUJlYW5fX0dyb3VwX184KCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjYwNDk6MTogKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VCZWFuX19Hcm91cF9fOF9fSW1wbCBydWxlX19EYXRhSW50ZXJjaGFuZ2VCZWFuX19Hcm91cF9fOSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo2MDUwOjI6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUJlYW5fX0dyb3VwX184X19JbXBsIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUJlYW5fX0dyb3VwX185CisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo2MzA3OjE6ICggcnVsZV9fRGF0YUludGVyY2hhbmdlQmVhbl9fR3JvdXBfXzhfX0ltcGwgcnVsZV9fRGF0YUludGVyY2hhbmdlQmVhbl9fR3JvdXBfXzkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NjMwODoyOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VCZWFuX19Hcm91cF9fOF9fSW1wbCBydWxlX19EYXRhSW50ZXJjaGFuZ2VCZWFuX19Hcm91cF9fOQogICAgICAgICAgICAgewogICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMjkpOwogICAgICAgICAgICAgcnVsZV9fRGF0YUludGVyY2hhbmdlQmVhbl9fR3JvdXBfXzhfX0ltcGwoKTsKQEAgLTIxNDk2LDMxICsyMjUyMCwzMSBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX0RhdGFJbnRlcmNoYW5nZUJlYW5fX0dyb3VwX184X19JbXBsIgotICAgIC8vIEludGVybmFsRGF0YURTTC5nOjYwNTc6MTogcnVsZV9fRGF0YUludGVyY2hhbmdlQmVhbl9fR3JvdXBfXzhfX0ltcGwgOiAoICggcnVsZV9fRGF0YUludGVyY2hhbmdlQmVhbl9fR3JvdXBfOF9fMCApPyApIDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo2MzE1OjE6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUJlYW5fX0dyb3VwX184X19JbXBsIDogKCAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUJlYW5fX0dyb3VwXzhfXzAgKT8gKSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fRGF0YUludGVyY2hhbmdlQmVhbl9fR3JvdXBfXzhfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NjA2MToxOiAoICggKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VCZWFuX19Hcm91cF84X18wICk/ICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NjA2MjoxOiAoICggcnVsZV9fRGF0YUludGVyY2hhbmdlQmVhbl9fR3JvdXBfOF9fMCApPyApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo2MzE5OjE6ICggKCAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUJlYW5fX0dyb3VwXzhfXzAgKT8gKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo2MzIwOjE6ICggKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VCZWFuX19Hcm91cF84X18wICk/ICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjYwNjI6MTogKCAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUJlYW5fX0dyb3VwXzhfXzAgKT8gKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NjA2MzoyOiAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUJlYW5fX0dyb3VwXzhfXzAgKT8KKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjYzMjA6MTogKCAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUJlYW5fX0dyb3VwXzhfXzAgKT8gKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NjMyMToyOiAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUJlYW5fX0dyb3VwXzhfXzAgKT8KICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YUludGVyY2hhbmdlQmVhbkFjY2VzcygpLmdldEdyb3VwXzgoKSk7IAogICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NjA2NDoyOiAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUJlYW5fX0dyb3VwXzhfXzAgKT8KLSAgICAgICAgICAgIGludCBhbHQ2OD0yOwotICAgICAgICAgICAgaW50IExBNjhfMCA9IGlucHV0LkxBKDEpOworICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NjMyMjoyOiAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUJlYW5fX0dyb3VwXzhfXzAgKT8KKyAgICAgICAgICAgIGludCBhbHQ3Mj0yOworICAgICAgICAgICAgaW50IExBNzJfMCA9IGlucHV0LkxBKDEpOwogCi0gICAgICAgICAgICBpZiAoIChMQTY4XzA9PTkxKSApIHsKLSAgICAgICAgICAgICAgICBhbHQ2OD0xOworICAgICAgICAgICAgaWYgKCAoTEE3Ml8wPT05NSkgKSB7CisgICAgICAgICAgICAgICAgYWx0NzI9MTsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHN3aXRjaCAoYWx0NjgpIHsKKyAgICAgICAgICAgIHN3aXRjaCAoYWx0NzIpIHsKICAgICAgICAgICAgICAgICBjYXNlIDEgOgotICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo2MDY0OjM6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUJlYW5fX0dyb3VwXzhfXzAKKyAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NjMyMjozOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VCZWFuX19Hcm91cF84X18wCiAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMik7CiAgICAgICAgICAgICAgICAgICAgIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUJlYW5fX0dyb3VwXzhfXzAoKTsKQEAgLTIxNTU4LDE0ICsyMjU4MiwxNCBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX0RhdGFJbnRlcmNoYW5nZUJlYW5fX0dyb3VwX185IgotICAgIC8vIEludGVybmFsRGF0YURTTC5nOjYwNzI6MTogcnVsZV9fRGF0YUludGVyY2hhbmdlQmVhbl9fR3JvdXBfXzkgOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VCZWFuX19Hcm91cF9fOV9fSW1wbCBydWxlX19EYXRhSW50ZXJjaGFuZ2VCZWFuX19Hcm91cF9fMTAgOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjYzMzA6MTogcnVsZV9fRGF0YUludGVyY2hhbmdlQmVhbl9fR3JvdXBfXzkgOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VCZWFuX19Hcm91cF9fOV9fSW1wbCBydWxlX19EYXRhSW50ZXJjaGFuZ2VCZWFuX19Hcm91cF9fMTAgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUJlYW5fX0dyb3VwX185KCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjYwNzY6MTogKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VCZWFuX19Hcm91cF9fOV9fSW1wbCBydWxlX19EYXRhSW50ZXJjaGFuZ2VCZWFuX19Hcm91cF9fMTAgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NjA3NzoyOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VCZWFuX19Hcm91cF9fOV9fSW1wbCBydWxlX19EYXRhSW50ZXJjaGFuZ2VCZWFuX19Hcm91cF9fMTAKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjYzMzQ6MTogKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VCZWFuX19Hcm91cF9fOV9fSW1wbCBydWxlX19EYXRhSW50ZXJjaGFuZ2VCZWFuX19Hcm91cF9fMTAgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NjMzNToyOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VCZWFuX19Hcm91cF9fOV9fSW1wbCBydWxlX19EYXRhSW50ZXJjaGFuZ2VCZWFuX19Hcm91cF9fMTAKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzI5KTsKICAgICAgICAgICAgIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUJlYW5fX0dyb3VwX185X19JbXBsKCk7CkBAIC0yMTU5NiwzMSArMjI2MjAsMzEgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19EYXRhSW50ZXJjaGFuZ2VCZWFuX19Hcm91cF9fOV9fSW1wbCIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo2MDg0OjE6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUJlYW5fX0dyb3VwX185X19JbXBsIDogKCAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUJlYW5fX0dyb3VwXzlfXzAgKT8gKSA7CisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NjM0MjoxOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VCZWFuX19Hcm91cF9fOV9fSW1wbCA6ICggKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VCZWFuX19Hcm91cF85X18wICk/ICkgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUJlYW5fX0dyb3VwX185X19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjYwODg6MTogKCAoICggcnVsZV9fRGF0YUludGVyY2hhbmdlQmVhbl9fR3JvdXBfOV9fMCApPyApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjYwODk6MTogKCAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUJlYW5fX0dyb3VwXzlfXzAgKT8gKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NjM0NjoxOiAoICggKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VCZWFuX19Hcm91cF85X18wICk/ICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NjM0NzoxOiAoICggcnVsZV9fRGF0YUludGVyY2hhbmdlQmVhbl9fR3JvdXBfOV9fMCApPyApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo2MDg5OjE6ICggKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VCZWFuX19Hcm91cF85X18wICk/ICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjYwOTA6MjogKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VCZWFuX19Hcm91cF85X18wICk/CisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo2MzQ3OjE6ICggKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VCZWFuX19Hcm91cF85X18wICk/ICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjYzNDg6MjogKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VCZWFuX19Hcm91cF85X18wICk/CiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldERhdGFJbnRlcmNoYW5nZUJlYW5BY2Nlc3MoKS5nZXRHcm91cF85KCkpOyAKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjYwOTE6MjogKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VCZWFuX19Hcm91cF85X18wICk/Ci0gICAgICAgICAgICBpbnQgYWx0Njk9MjsKLSAgICAgICAgICAgIGludCBMQTY5XzAgPSBpbnB1dC5MQSgxKTsKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjYzNDk6MjogKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VCZWFuX19Hcm91cF85X18wICk/CisgICAgICAgICAgICBpbnQgYWx0NzM9MjsKKyAgICAgICAgICAgIGludCBMQTczXzAgPSBpbnB1dC5MQSgxKTsKIAotICAgICAgICAgICAgaWYgKCAoTEE2OV8wPT05MikgKSB7Ci0gICAgICAgICAgICAgICAgYWx0Njk9MTsKKyAgICAgICAgICAgIGlmICggKExBNzNfMD09OTYpICkgeworICAgICAgICAgICAgICAgIGFsdDczPTE7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBzd2l0Y2ggKGFsdDY5KSB7CisgICAgICAgICAgICBzd2l0Y2ggKGFsdDczKSB7CiAgICAgICAgICAgICAgICAgY2FzZSAxIDoKLSAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NjA5MTozOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VCZWFuX19Hcm91cF85X18wCisgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjYzNDk6MzogcnVsZV9fRGF0YUludGVyY2hhbmdlQmVhbl9fR3JvdXBfOV9fMAogICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzIpOwogICAgICAgICAgICAgICAgICAgICBydWxlX19EYXRhSW50ZXJjaGFuZ2VCZWFuX19Hcm91cF85X18wKCk7CkBAIC0yMTY1OCwyMCArMjI2ODIsMjUgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19EYXRhSW50ZXJjaGFuZ2VCZWFuX19Hcm91cF9fMTAiCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NjA5OToxOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VCZWFuX19Hcm91cF9fMTAgOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VCZWFuX19Hcm91cF9fMTBfX0ltcGwgOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjYzNTc6MTogcnVsZV9fRGF0YUludGVyY2hhbmdlQmVhbl9fR3JvdXBfXzEwIDogcnVsZV9fRGF0YUludGVyY2hhbmdlQmVhbl9fR3JvdXBfXzEwX19JbXBsIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUJlYW5fX0dyb3VwX18xMSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fRGF0YUludGVyY2hhbmdlQmVhbl9fR3JvdXBfXzEwKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjYxMDM6MTogKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VCZWFuX19Hcm91cF9fMTBfX0ltcGwgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NjEwNDoyOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VCZWFuX19Hcm91cF9fMTBfX0ltcGwKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjYzNjE6MTogKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VCZWFuX19Hcm91cF9fMTBfX0ltcGwgcnVsZV9fRGF0YUludGVyY2hhbmdlQmVhbl9fR3JvdXBfXzExICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjYzNjI6MjogcnVsZV9fRGF0YUludGVyY2hhbmdlQmVhbl9fR3JvdXBfXzEwX19JbXBsIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUJlYW5fX0dyb3VwX18xMQogICAgICAgICAgICAgewotICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMik7CisgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV18yOSk7CiAgICAgICAgICAgICBydWxlX19EYXRhSW50ZXJjaGFuZ2VCZWFuX19Hcm91cF9fMTBfX0ltcGwoKTsKIAogICAgICAgICAgICAgc3RhdGUuX2ZzcC0tOwogICAgICAgICAgICAgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKKyAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzIpOworICAgICAgICAgICAgcnVsZV9fRGF0YUludGVyY2hhbmdlQmVhbl9fR3JvdXBfXzExKCk7CisKKyAgICAgICAgICAgIHN0YXRlLl9mc3AtLTsKKyAgICAgICAgICAgIGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CiAKICAgICAgICAgICAgIH0KIApAQCAtMjE2OTEsMzEgKzIyNzIwLDMxIEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fRGF0YUludGVyY2hhbmdlQmVhbl9fR3JvdXBfXzEwX19JbXBsIgotICAgIC8vIEludGVybmFsRGF0YURTTC5nOjYxMTA6MTogcnVsZV9fRGF0YUludGVyY2hhbmdlQmVhbl9fR3JvdXBfXzEwX19JbXBsIDogKCAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUJlYW5fX0dyb3VwXzEwX18wICk/ICkgOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjYzNjk6MTogcnVsZV9fRGF0YUludGVyY2hhbmdlQmVhbl9fR3JvdXBfXzEwX19JbXBsIDogKCAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUJlYW5fX0dyb3VwXzEwX18wICk/ICkgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUJlYW5fX0dyb3VwX18xMF9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo2MTE0OjE6ICggKCAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUJlYW5fX0dyb3VwXzEwX18wICk/ICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NjExNToxOiAoICggcnVsZV9fRGF0YUludGVyY2hhbmdlQmVhbl9fR3JvdXBfMTBfXzAgKT8gKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NjM3MzoxOiAoICggKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VCZWFuX19Hcm91cF8xMF9fMCApPyApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjYzNzQ6MTogKCAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUJlYW5fX0dyb3VwXzEwX18wICk/ICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjYxMTU6MTogKCAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUJlYW5fX0dyb3VwXzEwX18wICk/ICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjYxMTY6MjogKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VCZWFuX19Hcm91cF8xMF9fMCApPworICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NjM3NDoxOiAoICggcnVsZV9fRGF0YUludGVyY2hhbmdlQmVhbl9fR3JvdXBfMTBfXzAgKT8gKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NjM3NToyOiAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUJlYW5fX0dyb3VwXzEwX18wICk/CiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldERhdGFJbnRlcmNoYW5nZUJlYW5BY2Nlc3MoKS5nZXRHcm91cF8xMCgpKTsgCiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo2MTE3OjI6ICggcnVsZV9fRGF0YUludGVyY2hhbmdlQmVhbl9fR3JvdXBfMTBfXzAgKT8KLSAgICAgICAgICAgIGludCBhbHQ3MD0yOwotICAgICAgICAgICAgaW50IExBNzBfMCA9IGlucHV0LkxBKDEpOworICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NjM3NjoyOiAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUJlYW5fX0dyb3VwXzEwX18wICk/CisgICAgICAgICAgICBpbnQgYWx0NzQ9MjsKKyAgICAgICAgICAgIGludCBMQTc0XzAgPSBpbnB1dC5MQSgxKTsKIAotICAgICAgICAgICAgaWYgKCAoTEE3MF8wPT05MykgKSB7Ci0gICAgICAgICAgICAgICAgYWx0NzA9MTsKKyAgICAgICAgICAgIGlmICggKExBNzRfMD09OTcpICkgeworICAgICAgICAgICAgICAgIGFsdDc0PTE7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBzd2l0Y2ggKGFsdDcwKSB7CisgICAgICAgICAgICBzd2l0Y2ggKGFsdDc0KSB7CiAgICAgICAgICAgICAgICAgY2FzZSAxIDoKLSAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NjExNzozOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VCZWFuX19Hcm91cF8xMF9fMAorICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo2Mzc2OjM6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUJlYW5fX0dyb3VwXzEwX18wCiAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMik7CiAgICAgICAgICAgICAgICAgICAgIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUJlYW5fX0dyb3VwXzEwX18wKCk7CkBAIC0yMTc1MiwxNSArMjI3ODEsMzEwIEBACiAgICAgLy8gJEFOVExSIGVuZCAicnVsZV9fRGF0YUludGVyY2hhbmdlQmVhbl9fR3JvdXBfXzEwX19JbXBsIgogCiAKKyAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX0RhdGFJbnRlcmNoYW5nZUJlYW5fX0dyb3VwX18xMSIKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo2Mzg0OjE6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUJlYW5fX0dyb3VwX18xMSA6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUJlYW5fX0dyb3VwX18xMV9fSW1wbCBydWxlX19EYXRhSW50ZXJjaGFuZ2VCZWFuX19Hcm91cF9fMTIgOworICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUJlYW5fX0dyb3VwX18xMSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisKKyAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgICAgICAJCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo2Mzg4OjE6ICggcnVsZV9fRGF0YUludGVyY2hhbmdlQmVhbl9fR3JvdXBfXzExX19JbXBsIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUJlYW5fX0dyb3VwX18xMiApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo2Mzg5OjI6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUJlYW5fX0dyb3VwX18xMV9fSW1wbCBydWxlX19EYXRhSW50ZXJjaGFuZ2VCZWFuX19Hcm91cF9fMTIKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzI5KTsKKyAgICAgICAgICAgIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUJlYW5fX0dyb3VwX18xMV9fSW1wbCgpOworCisgICAgICAgICAgICBzdGF0ZS5fZnNwLS07CisgICAgICAgICAgICBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOworICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMik7CisgICAgICAgICAgICBydWxlX19EYXRhSW50ZXJjaGFuZ2VCZWFuX19Hcm91cF9fMTIoKTsKKworICAgICAgICAgICAgc3RhdGUuX2ZzcC0tOworICAgICAgICAgICAgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKKworICAgICAgICAgICAgfQorCisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKFJlY29nbml0aW9uRXhjZXB0aW9uIHJlKSB7CisgICAgICAgICAgICByZXBvcnRFcnJvcihyZSk7CisgICAgICAgICAgICByZWNvdmVyKGlucHV0LHJlKTsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKworICAgICAgICAgICAgCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKKworICAgICAgICB9CisgICAgICAgIHJldHVybiA7CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgInJ1bGVfX0RhdGFJbnRlcmNoYW5nZUJlYW5fX0dyb3VwX18xMSIKKworCisgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19EYXRhSW50ZXJjaGFuZ2VCZWFuX19Hcm91cF9fMTFfX0ltcGwiCisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NjM5NjoxOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VCZWFuX19Hcm91cF9fMTFfX0ltcGwgOiAoICggcnVsZV9fRGF0YUludGVyY2hhbmdlQmVhbl9fR3JvdXBfMTFfXzAgKT8gKSA7CisgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fRGF0YUludGVyY2hhbmdlQmVhbl9fR3JvdXBfXzExX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKworICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgICAgIAkKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjY0MDA6MTogKCAoICggcnVsZV9fRGF0YUludGVyY2hhbmdlQmVhbl9fR3JvdXBfMTFfXzAgKT8gKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo2NDAxOjE6ICggKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VCZWFuX19Hcm91cF8xMV9fMCApPyApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo2NDAxOjE6ICggKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VCZWFuX19Hcm91cF8xMV9fMCApPyApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo2NDAyOjI6ICggcnVsZV9fRGF0YUludGVyY2hhbmdlQmVhbl9fR3JvdXBfMTFfXzAgKT8KKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YUludGVyY2hhbmdlQmVhbkFjY2VzcygpLmdldEdyb3VwXzExKCkpOyAKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjY0MDM6MjogKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VCZWFuX19Hcm91cF8xMV9fMCApPworICAgICAgICAgICAgaW50IGFsdDc1PTI7CisgICAgICAgICAgICBpbnQgTEE3NV8wID0gaW5wdXQuTEEoMSk7CisKKyAgICAgICAgICAgIGlmICggKExBNzVfMD09OTgpICkgeworICAgICAgICAgICAgICAgIGFsdDc1PTE7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzd2l0Y2ggKGFsdDc1KSB7CisgICAgICAgICAgICAgICAgY2FzZSAxIDoKKyAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NjQwMzozOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VCZWFuX19Hcm91cF8xMV9fMAorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzIpOworICAgICAgICAgICAgICAgICAgICBydWxlX19EYXRhSW50ZXJjaGFuZ2VCZWFuX19Hcm91cF8xMV9fMCgpOworCisgICAgICAgICAgICAgICAgICAgIHN0YXRlLl9mc3AtLTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKKworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXREYXRhSW50ZXJjaGFuZ2VCZWFuQWNjZXNzKCkuZ2V0R3JvdXBfMTEoKSk7IAorICAgICAgICAgICAgfQorCisgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgfQorCisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKFJlY29nbml0aW9uRXhjZXB0aW9uIHJlKSB7CisgICAgICAgICAgICByZXBvcnRFcnJvcihyZSk7CisgICAgICAgICAgICByZWNvdmVyKGlucHV0LHJlKTsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKworICAgICAgICAgICAgCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKKworICAgICAgICB9CisgICAgICAgIHJldHVybiA7CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgInJ1bGVfX0RhdGFJbnRlcmNoYW5nZUJlYW5fX0dyb3VwX18xMV9fSW1wbCIKKworCisgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19EYXRhSW50ZXJjaGFuZ2VCZWFuX19Hcm91cF9fMTIiCisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NjQxMToxOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VCZWFuX19Hcm91cF9fMTIgOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VCZWFuX19Hcm91cF9fMTJfX0ltcGwgcnVsZV9fRGF0YUludGVyY2hhbmdlQmVhbl9fR3JvdXBfXzEzIDsKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19EYXRhSW50ZXJjaGFuZ2VCZWFuX19Hcm91cF9fMTIoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworCisgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICAgICAgCQorICAgICAgICB0cnkgeworICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NjQxNToxOiAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUJlYW5fX0dyb3VwX18xMl9fSW1wbCBydWxlX19EYXRhSW50ZXJjaGFuZ2VCZWFuX19Hcm91cF9fMTMgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NjQxNjoyOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VCZWFuX19Hcm91cF9fMTJfX0ltcGwgcnVsZV9fRGF0YUludGVyY2hhbmdlQmVhbl9fR3JvdXBfXzEzCisgICAgICAgICAgICB7CisgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV18yOSk7CisgICAgICAgICAgICBydWxlX19EYXRhSW50ZXJjaGFuZ2VCZWFuX19Hcm91cF9fMTJfX0ltcGwoKTsKKworICAgICAgICAgICAgc3RhdGUuX2ZzcC0tOworICAgICAgICAgICAgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKKyAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzIpOworICAgICAgICAgICAgcnVsZV9fRGF0YUludGVyY2hhbmdlQmVhbl9fR3JvdXBfXzEzKCk7CisKKyAgICAgICAgICAgIHN0YXRlLl9mc3AtLTsKKyAgICAgICAgICAgIGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CisKKyAgICAgICAgICAgIH0KKworICAgICAgICB9CisgICAgICAgIGNhdGNoIChSZWNvZ25pdGlvbkV4Y2VwdGlvbiByZSkgeworICAgICAgICAgICAgcmVwb3J0RXJyb3IocmUpOworICAgICAgICAgICAgcmVjb3ZlcihpbnB1dCxyZSk7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisKKyAgICAgICAgICAgIAlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7CisKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gOworICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJydWxlX19EYXRhSW50ZXJjaGFuZ2VCZWFuX19Hcm91cF9fMTIiCisKKworICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fRGF0YUludGVyY2hhbmdlQmVhbl9fR3JvdXBfXzEyX19JbXBsIgorICAgIC8vIEludGVybmFsRGF0YURTTC5nOjY0MjM6MTogcnVsZV9fRGF0YUludGVyY2hhbmdlQmVhbl9fR3JvdXBfXzEyX19JbXBsIDogKCAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUJlYW5fX0dyb3VwXzEyX18wICk/ICkgOworICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUJlYW5fX0dyb3VwX18xMl9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisKKyAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgICAgICAJCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo2NDI3OjE6ICggKCAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUJlYW5fX0dyb3VwXzEyX18wICk/ICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NjQyODoxOiAoICggcnVsZV9fRGF0YUludGVyY2hhbmdlQmVhbl9fR3JvdXBfMTJfXzAgKT8gKQorICAgICAgICAgICAgeworICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NjQyODoxOiAoICggcnVsZV9fRGF0YUludGVyY2hhbmdlQmVhbl9fR3JvdXBfMTJfXzAgKT8gKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NjQyOToyOiAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUJlYW5fX0dyb3VwXzEyX18wICk/CisgICAgICAgICAgICB7CisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldERhdGFJbnRlcmNoYW5nZUJlYW5BY2Nlc3MoKS5nZXRHcm91cF8xMigpKTsgCisgICAgICAgICAgICB9CisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo2NDMwOjI6ICggcnVsZV9fRGF0YUludGVyY2hhbmdlQmVhbl9fR3JvdXBfMTJfXzAgKT8KKyAgICAgICAgICAgIGludCBhbHQ3Nj0yOworICAgICAgICAgICAgaW50IExBNzZfMCA9IGlucHV0LkxBKDEpOworCisgICAgICAgICAgICBpZiAoIChMQTc2XzA9PTk5KSApIHsKKyAgICAgICAgICAgICAgICBhbHQ3Nj0xOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc3dpdGNoIChhbHQ3NikgeworICAgICAgICAgICAgICAgIGNhc2UgMSA6CisgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjY0MzA6MzogcnVsZV9fRGF0YUludGVyY2hhbmdlQmVhbl9fR3JvdXBfMTJfXzAKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV18yKTsKKyAgICAgICAgICAgICAgICAgICAgcnVsZV9fRGF0YUludGVyY2hhbmdlQmVhbl9fR3JvdXBfMTJfXzAoKTsKKworICAgICAgICAgICAgICAgICAgICBzdGF0ZS5fZnNwLS07CisgICAgICAgICAgICAgICAgICAgIGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CisKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YUludGVyY2hhbmdlQmVhbkFjY2VzcygpLmdldEdyb3VwXzEyKCkpOyAKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgIH0KKworICAgICAgICB9CisgICAgICAgIGNhdGNoIChSZWNvZ25pdGlvbkV4Y2VwdGlvbiByZSkgeworICAgICAgICAgICAgcmVwb3J0RXJyb3IocmUpOworICAgICAgICAgICAgcmVjb3ZlcihpbnB1dCxyZSk7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisKKyAgICAgICAgICAgIAlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7CisKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gOworICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJydWxlX19EYXRhSW50ZXJjaGFuZ2VCZWFuX19Hcm91cF9fMTJfX0ltcGwiCisKKworICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fRGF0YUludGVyY2hhbmdlQmVhbl9fR3JvdXBfXzEzIgorICAgIC8vIEludGVybmFsRGF0YURTTC5nOjY0Mzg6MTogcnVsZV9fRGF0YUludGVyY2hhbmdlQmVhbl9fR3JvdXBfXzEzIDogcnVsZV9fRGF0YUludGVyY2hhbmdlQmVhbl9fR3JvdXBfXzEzX19JbXBsIDsKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19EYXRhSW50ZXJjaGFuZ2VCZWFuX19Hcm91cF9fMTMoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworCisgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICAgICAgCQorICAgICAgICB0cnkgeworICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NjQ0MjoxOiAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUJlYW5fX0dyb3VwX18xM19fSW1wbCApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo2NDQzOjI6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUJlYW5fX0dyb3VwX18xM19fSW1wbAorICAgICAgICAgICAgeworICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMik7CisgICAgICAgICAgICBydWxlX19EYXRhSW50ZXJjaGFuZ2VCZWFuX19Hcm91cF9fMTNfX0ltcGwoKTsKKworICAgICAgICAgICAgc3RhdGUuX2ZzcC0tOworICAgICAgICAgICAgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKKworICAgICAgICAgICAgfQorCisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKFJlY29nbml0aW9uRXhjZXB0aW9uIHJlKSB7CisgICAgICAgICAgICByZXBvcnRFcnJvcihyZSk7CisgICAgICAgICAgICByZWNvdmVyKGlucHV0LHJlKTsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKworICAgICAgICAgICAgCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKKworICAgICAgICB9CisgICAgICAgIHJldHVybiA7CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgInJ1bGVfX0RhdGFJbnRlcmNoYW5nZUJlYW5fX0dyb3VwX18xMyIKKworCisgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19EYXRhSW50ZXJjaGFuZ2VCZWFuX19Hcm91cF9fMTNfX0ltcGwiCisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NjQ0OToxOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VCZWFuX19Hcm91cF9fMTNfX0ltcGwgOiAoICggcnVsZV9fRGF0YUludGVyY2hhbmdlQmVhbl9fR3JvdXBfMTNfXzAgKT8gKSA7CisgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fRGF0YUludGVyY2hhbmdlQmVhbl9fR3JvdXBfXzEzX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKworICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgICAgIAkKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjY0NTM6MTogKCAoICggcnVsZV9fRGF0YUludGVyY2hhbmdlQmVhbl9fR3JvdXBfMTNfXzAgKT8gKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo2NDU0OjE6ICggKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VCZWFuX19Hcm91cF8xM19fMCApPyApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo2NDU0OjE6ICggKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VCZWFuX19Hcm91cF8xM19fMCApPyApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo2NDU1OjI6ICggcnVsZV9fRGF0YUludGVyY2hhbmdlQmVhbl9fR3JvdXBfMTNfXzAgKT8KKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YUludGVyY2hhbmdlQmVhbkFjY2VzcygpLmdldEdyb3VwXzEzKCkpOyAKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjY0NTY6MjogKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VCZWFuX19Hcm91cF8xM19fMCApPworICAgICAgICAgICAgaW50IGFsdDc3PTI7CisgICAgICAgICAgICBpbnQgTEE3N18wID0gaW5wdXQuTEEoMSk7CisKKyAgICAgICAgICAgIGlmICggKExBNzdfMD09MTAwKSApIHsKKyAgICAgICAgICAgICAgICBhbHQ3Nz0xOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc3dpdGNoIChhbHQ3NykgeworICAgICAgICAgICAgICAgIGNhc2UgMSA6CisgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjY0NTY6MzogcnVsZV9fRGF0YUludGVyY2hhbmdlQmVhbl9fR3JvdXBfMTNfXzAKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV18yKTsKKyAgICAgICAgICAgICAgICAgICAgcnVsZV9fRGF0YUludGVyY2hhbmdlQmVhbl9fR3JvdXBfMTNfXzAoKTsKKworICAgICAgICAgICAgICAgICAgICBzdGF0ZS5fZnNwLS07CisgICAgICAgICAgICAgICAgICAgIGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CisKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YUludGVyY2hhbmdlQmVhbkFjY2VzcygpLmdldEdyb3VwXzEzKCkpOyAKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgIH0KKworICAgICAgICB9CisgICAgICAgIGNhdGNoIChSZWNvZ25pdGlvbkV4Y2VwdGlvbiByZSkgeworICAgICAgICAgICAgcmVwb3J0RXJyb3IocmUpOworICAgICAgICAgICAgcmVjb3ZlcihpbnB1dCxyZSk7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisKKyAgICAgICAgICAgIAlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7CisKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gOworICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJydWxlX19EYXRhSW50ZXJjaGFuZ2VCZWFuX19Hcm91cF9fMTNfX0ltcGwiCisKKwogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fRGF0YUludGVyY2hhbmdlQmVhbl9fR3JvdXBfM19fMCIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo2MTI2OjE6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUJlYW5fX0dyb3VwXzNfXzAgOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VCZWFuX19Hcm91cF8zX18wX19JbXBsIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUJlYW5fX0dyb3VwXzNfXzEgOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjY0NjU6MTogcnVsZV9fRGF0YUludGVyY2hhbmdlQmVhbl9fR3JvdXBfM19fMCA6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUJlYW5fX0dyb3VwXzNfXzBfX0ltcGwgcnVsZV9fRGF0YUludGVyY2hhbmdlQmVhbl9fR3JvdXBfM19fMSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fRGF0YUludGVyY2hhbmdlQmVhbl9fR3JvdXBfM19fMCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo2MTMwOjE6ICggcnVsZV9fRGF0YUludGVyY2hhbmdlQmVhbl9fR3JvdXBfM19fMF9fSW1wbCBydWxlX19EYXRhSW50ZXJjaGFuZ2VCZWFuX19Hcm91cF8zX18xICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjYxMzE6MjogcnVsZV9fRGF0YUludGVyY2hhbmdlQmVhbl9fR3JvdXBfM19fMF9fSW1wbCBydWxlX19EYXRhSW50ZXJjaGFuZ2VCZWFuX19Hcm91cF8zX18xCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo2NDY5OjE6ICggcnVsZV9fRGF0YUludGVyY2hhbmdlQmVhbl9fR3JvdXBfM19fMF9fSW1wbCBydWxlX19EYXRhSW50ZXJjaGFuZ2VCZWFuX19Hcm91cF8zX18xICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjY0NzA6MjogcnVsZV9fRGF0YUludGVyY2hhbmdlQmVhbl9fR3JvdXBfM19fMF9fSW1wbCBydWxlX19EYXRhSW50ZXJjaGFuZ2VCZWFuX19Hcm91cF8zX18xCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV185KTsKICAgICAgICAgICAgIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUJlYW5fX0dyb3VwXzNfXzBfX0ltcGwoKTsKQEAgLTIxNzkxLDIyICsyMzExNSwyMiBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX0RhdGFJbnRlcmNoYW5nZUJlYW5fX0dyb3VwXzNfXzBfX0ltcGwiCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NjEzODoxOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VCZWFuX19Hcm91cF8zX18wX19JbXBsIDogKCAnbm9kZU5hbWUnICkgOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjY0Nzc6MTogcnVsZV9fRGF0YUludGVyY2hhbmdlQmVhbl9fR3JvdXBfM19fMF9fSW1wbCA6ICggJ25vZGVOYW1lJyApIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19EYXRhSW50ZXJjaGFuZ2VCZWFuX19Hcm91cF8zX18wX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjYxNDI6MTogKCAoICdub2RlTmFtZScgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo2MTQzOjE6ICggJ25vZGVOYW1lJyApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo2NDgxOjE6ICggKCAnbm9kZU5hbWUnICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NjQ4MjoxOiAoICdub2RlTmFtZScgKQogICAgICAgICAgICAgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NjE0MzoxOiAoICdub2RlTmFtZScgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NjE0NDoyOiAnbm9kZU5hbWUnCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo2NDgyOjE6ICggJ25vZGVOYW1lJyApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo2NDgzOjI6ICdub2RlTmFtZScKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YUludGVyY2hhbmdlQmVhbkFjY2VzcygpLmdldE5vZGVOYW1lS2V5d29yZF8zXzAoKSk7IAogICAgICAgICAgICAgfQotICAgICAgICAgICAgbWF0Y2goaW5wdXQsODcsRk9MTE9XXzIpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOworICAgICAgICAgICAgbWF0Y2goaW5wdXQsOTIsRk9MTE9XXzIpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOwogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBhZnRlcihncmFtbWFyQWNjZXNzLmdldERhdGFJbnRlcmNoYW5nZUJlYW5BY2Nlc3MoKS5nZXROb2RlTmFtZUtleXdvcmRfM18wKCkpOyAKICAgICAgICAgICAgIH0KQEAgLTIxODMyLDE0ICsyMzE1NiwxNCBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX0RhdGFJbnRlcmNoYW5nZUJlYW5fX0dyb3VwXzNfXzEiCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NjE1MzoxOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VCZWFuX19Hcm91cF8zX18xIDogcnVsZV9fRGF0YUludGVyY2hhbmdlQmVhbl9fR3JvdXBfM19fMV9fSW1wbCA7CisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NjQ5MjoxOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VCZWFuX19Hcm91cF8zX18xIDogcnVsZV9fRGF0YUludGVyY2hhbmdlQmVhbl9fR3JvdXBfM19fMV9fSW1wbCA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fRGF0YUludGVyY2hhbmdlQmVhbl9fR3JvdXBfM19fMSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo2MTU3OjE6ICggcnVsZV9fRGF0YUludGVyY2hhbmdlQmVhbl9fR3JvdXBfM19fMV9fSW1wbCApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo2MTU4OjI6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUJlYW5fX0dyb3VwXzNfXzFfX0ltcGwKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjY0OTY6MTogKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VCZWFuX19Hcm91cF8zX18xX19JbXBsICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjY0OTc6MjogcnVsZV9fRGF0YUludGVyY2hhbmdlQmVhbl9fR3JvdXBfM19fMV9fSW1wbAogICAgICAgICAgICAgewogICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMik7CiAgICAgICAgICAgICBydWxlX19EYXRhSW50ZXJjaGFuZ2VCZWFuX19Hcm91cF8zX18xX19JbXBsKCk7CkBAIC0yMTg2NSwyMyArMjMxODksMjMgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19EYXRhSW50ZXJjaGFuZ2VCZWFuX19Hcm91cF8zX18xX19JbXBsIgotICAgIC8vIEludGVybmFsRGF0YURTTC5nOjYxNjQ6MTogcnVsZV9fRGF0YUludGVyY2hhbmdlQmVhbl9fR3JvdXBfM19fMV9fSW1wbCA6ICggKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VCZWFuX19Ob2RlTmFtZUFzc2lnbm1lbnRfM18xICkgKSA7CisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NjUwMzoxOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VCZWFuX19Hcm91cF8zX18xX19JbXBsIDogKCAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUJlYW5fX05vZGVOYW1lQXNzaWdubWVudF8zXzEgKSApIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19EYXRhSW50ZXJjaGFuZ2VCZWFuX19Hcm91cF8zX18xX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjYxNjg6MTogKCAoICggcnVsZV9fRGF0YUludGVyY2hhbmdlQmVhbl9fTm9kZU5hbWVBc3NpZ25tZW50XzNfMSApICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NjE2OToxOiAoICggcnVsZV9fRGF0YUludGVyY2hhbmdlQmVhbl9fTm9kZU5hbWVBc3NpZ25tZW50XzNfMSApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjY1MDc6MTogKCAoICggcnVsZV9fRGF0YUludGVyY2hhbmdlQmVhbl9fTm9kZU5hbWVBc3NpZ25tZW50XzNfMSApICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NjUwODoxOiAoICggcnVsZV9fRGF0YUludGVyY2hhbmdlQmVhbl9fTm9kZU5hbWVBc3NpZ25tZW50XzNfMSApICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjYxNjk6MTogKCAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUJlYW5fX05vZGVOYW1lQXNzaWdubWVudF8zXzEgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo2MTcwOjI6ICggcnVsZV9fRGF0YUludGVyY2hhbmdlQmVhbl9fTm9kZU5hbWVBc3NpZ25tZW50XzNfMSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo2NTA4OjE6ICggKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VCZWFuX19Ob2RlTmFtZUFzc2lnbm1lbnRfM18xICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NjUwOToyOiAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUJlYW5fX05vZGVOYW1lQXNzaWdubWVudF8zXzEgKQogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXREYXRhSW50ZXJjaGFuZ2VCZWFuQWNjZXNzKCkuZ2V0Tm9kZU5hbWVBc3NpZ25tZW50XzNfMSgpKTsgCiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo2MTcxOjI6ICggcnVsZV9fRGF0YUludGVyY2hhbmdlQmVhbl9fTm9kZU5hbWVBc3NpZ25tZW50XzNfMSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo2MTcxOjM6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUJlYW5fX05vZGVOYW1lQXNzaWdubWVudF8zXzEKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjY1MTA6MjogKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VCZWFuX19Ob2RlTmFtZUFzc2lnbm1lbnRfM18xICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjY1MTA6MzogcnVsZV9fRGF0YUludGVyY2hhbmdlQmVhbl9fTm9kZU5hbWVBc3NpZ25tZW50XzNfMQogICAgICAgICAgICAgewogICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMik7CiAgICAgICAgICAgICBydWxlX19EYXRhSW50ZXJjaGFuZ2VCZWFuX19Ob2RlTmFtZUFzc2lnbm1lbnRfM18xKCk7CkBAIC0yMTkxNiwxNCArMjMyNDAsMTQgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19EYXRhSW50ZXJjaGFuZ2VCZWFuX19Hcm91cF80X18wIgotICAgIC8vIEludGVybmFsRGF0YURTTC5nOjYxODA6MTogcnVsZV9fRGF0YUludGVyY2hhbmdlQmVhbl9fR3JvdXBfNF9fMCA6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUJlYW5fX0dyb3VwXzRfXzBfX0ltcGwgcnVsZV9fRGF0YUludGVyY2hhbmdlQmVhbl9fR3JvdXBfNF9fMSA7CisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NjUxOToxOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VCZWFuX19Hcm91cF80X18wIDogcnVsZV9fRGF0YUludGVyY2hhbmdlQmVhbl9fR3JvdXBfNF9fMF9fSW1wbCBydWxlX19EYXRhSW50ZXJjaGFuZ2VCZWFuX19Hcm91cF80X18xIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19EYXRhSW50ZXJjaGFuZ2VCZWFuX19Hcm91cF80X18wKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjYxODQ6MTogKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VCZWFuX19Hcm91cF80X18wX19JbXBsIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUJlYW5fX0dyb3VwXzRfXzEgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NjE4NToyOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VCZWFuX19Hcm91cF80X18wX19JbXBsIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUJlYW5fX0dyb3VwXzRfXzEKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjY1MjM6MTogKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VCZWFuX19Hcm91cF80X18wX19JbXBsIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUJlYW5fX0dyb3VwXzRfXzEgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NjUyNDoyOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VCZWFuX19Hcm91cF80X18wX19JbXBsIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUJlYW5fX0dyb3VwXzRfXzEKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzkpOwogICAgICAgICAgICAgcnVsZV9fRGF0YUludGVyY2hhbmdlQmVhbl9fR3JvdXBfNF9fMF9fSW1wbCgpOwpAQCAtMjE5NTQsMjIgKzIzMjc4LDIyIEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fRGF0YUludGVyY2hhbmdlQmVhbl9fR3JvdXBfNF9fMF9fSW1wbCIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo2MTkyOjE6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUJlYW5fX0dyb3VwXzRfXzBfX0ltcGwgOiAoICdjcmVhdGVPbicgKSA7CisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NjUzMToxOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VCZWFuX19Hcm91cF80X18wX19JbXBsIDogKCAnY3JlYXRlT24nICkgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUJlYW5fX0dyb3VwXzRfXzBfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NjE5NjoxOiAoICggJ2NyZWF0ZU9uJyApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjYxOTc6MTogKCAnY3JlYXRlT24nICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjY1MzU6MTogKCAoICdjcmVhdGVPbicgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo2NTM2OjE6ICggJ2NyZWF0ZU9uJyApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo2MTk3OjE6ICggJ2NyZWF0ZU9uJyApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo2MTk4OjI6ICdjcmVhdGVPbicKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjY1MzY6MTogKCAnY3JlYXRlT24nICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjY1Mzc6MjogJ2NyZWF0ZU9uJwogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXREYXRhSW50ZXJjaGFuZ2VCZWFuQWNjZXNzKCkuZ2V0Q3JlYXRlT25LZXl3b3JkXzRfMCgpKTsgCiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBtYXRjaChpbnB1dCw4OCxGT0xMT1dfMik7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CisgICAgICAgICAgICBtYXRjaChpbnB1dCw5MyxGT0xMT1dfMik7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YUludGVyY2hhbmdlQmVhbkFjY2VzcygpLmdldENyZWF0ZU9uS2V5d29yZF80XzAoKSk7IAogICAgICAgICAgICAgfQpAQCAtMjE5OTUsMTQgKzIzMzE5LDE0IEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fRGF0YUludGVyY2hhbmdlQmVhbl9fR3JvdXBfNF9fMSIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo2MjA3OjE6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUJlYW5fX0dyb3VwXzRfXzEgOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VCZWFuX19Hcm91cF80X18xX19JbXBsIDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo2NTQ2OjE6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUJlYW5fX0dyb3VwXzRfXzEgOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VCZWFuX19Hcm91cF80X18xX19JbXBsIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19EYXRhSW50ZXJjaGFuZ2VCZWFuX19Hcm91cF80X18xKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjYyMTE6MTogKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VCZWFuX19Hcm91cF80X18xX19JbXBsICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjYyMTI6MjogcnVsZV9fRGF0YUludGVyY2hhbmdlQmVhbl9fR3JvdXBfNF9fMV9fSW1wbAorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NjU1MDoxOiAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUJlYW5fX0dyb3VwXzRfXzFfX0ltcGwgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NjU1MToyOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VCZWFuX19Hcm91cF80X18xX19JbXBsCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV18yKTsKICAgICAgICAgICAgIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUJlYW5fX0dyb3VwXzRfXzFfX0ltcGwoKTsKQEAgLTIyMDI4LDIzICsyMzM1MiwyMyBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX0RhdGFJbnRlcmNoYW5nZUJlYW5fX0dyb3VwXzRfXzFfX0ltcGwiCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NjIxODoxOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VCZWFuX19Hcm91cF80X18xX19JbXBsIDogKCAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUJlYW5fX0VsZW1lbnRNYXBBc3NpZ25tZW50XzRfMSApICkgOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjY1NTc6MTogcnVsZV9fRGF0YUludGVyY2hhbmdlQmVhbl9fR3JvdXBfNF9fMV9fSW1wbCA6ICggKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VCZWFuX19FbGVtZW50TWFwQXNzaWdubWVudF80XzEgKSApIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19EYXRhSW50ZXJjaGFuZ2VCZWFuX19Hcm91cF80X18xX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjYyMjI6MTogKCAoICggcnVsZV9fRGF0YUludGVyY2hhbmdlQmVhbl9fRWxlbWVudE1hcEFzc2lnbm1lbnRfNF8xICkgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo2MjIzOjE6ICggKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VCZWFuX19FbGVtZW50TWFwQXNzaWdubWVudF80XzEgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo2NTYxOjE6ICggKCAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUJlYW5fX0VsZW1lbnRNYXBBc3NpZ25tZW50XzRfMSApICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NjU2MjoxOiAoICggcnVsZV9fRGF0YUludGVyY2hhbmdlQmVhbl9fRWxlbWVudE1hcEFzc2lnbm1lbnRfNF8xICkgKQogICAgICAgICAgICAgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NjIyMzoxOiAoICggcnVsZV9fRGF0YUludGVyY2hhbmdlQmVhbl9fRWxlbWVudE1hcEFzc2lnbm1lbnRfNF8xICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NjIyNDoyOiAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUJlYW5fX0VsZW1lbnRNYXBBc3NpZ25tZW50XzRfMSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo2NTYyOjE6ICggKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VCZWFuX19FbGVtZW50TWFwQXNzaWdubWVudF80XzEgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo2NTYzOjI6ICggcnVsZV9fRGF0YUludGVyY2hhbmdlQmVhbl9fRWxlbWVudE1hcEFzc2lnbm1lbnRfNF8xICkKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YUludGVyY2hhbmdlQmVhbkFjY2VzcygpLmdldEVsZW1lbnRNYXBBc3NpZ25tZW50XzRfMSgpKTsgCiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo2MjI1OjI6ICggcnVsZV9fRGF0YUludGVyY2hhbmdlQmVhbl9fRWxlbWVudE1hcEFzc2lnbm1lbnRfNF8xICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjYyMjU6MzogcnVsZV9fRGF0YUludGVyY2hhbmdlQmVhbl9fRWxlbWVudE1hcEFzc2lnbm1lbnRfNF8xCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo2NTY0OjI6ICggcnVsZV9fRGF0YUludGVyY2hhbmdlQmVhbl9fRWxlbWVudE1hcEFzc2lnbm1lbnRfNF8xICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjY1NjQ6MzogcnVsZV9fRGF0YUludGVyY2hhbmdlQmVhbl9fRWxlbWVudE1hcEFzc2lnbm1lbnRfNF8xCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV18yKTsKICAgICAgICAgICAgIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUJlYW5fX0VsZW1lbnRNYXBBc3NpZ25tZW50XzRfMSgpOwpAQCAtMjIwNzksMTQgKzIzNDAzLDE0IEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fRGF0YUludGVyY2hhbmdlQmVhbl9fR3JvdXBfNV9fMCIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo2MjM0OjE6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUJlYW5fX0dyb3VwXzVfXzAgOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VCZWFuX19Hcm91cF81X18wX19JbXBsIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUJlYW5fX0dyb3VwXzVfXzEgOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjY1NzM6MTogcnVsZV9fRGF0YUludGVyY2hhbmdlQmVhbl9fR3JvdXBfNV9fMCA6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUJlYW5fX0dyb3VwXzVfXzBfX0ltcGwgcnVsZV9fRGF0YUludGVyY2hhbmdlQmVhbl9fR3JvdXBfNV9fMSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fRGF0YUludGVyY2hhbmdlQmVhbl9fR3JvdXBfNV9fMCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo2MjM4OjE6ICggcnVsZV9fRGF0YUludGVyY2hhbmdlQmVhbl9fR3JvdXBfNV9fMF9fSW1wbCBydWxlX19EYXRhSW50ZXJjaGFuZ2VCZWFuX19Hcm91cF81X18xICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjYyMzk6MjogcnVsZV9fRGF0YUludGVyY2hhbmdlQmVhbl9fR3JvdXBfNV9fMF9fSW1wbCBydWxlX19EYXRhSW50ZXJjaGFuZ2VCZWFuX19Hcm91cF81X18xCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo2NTc3OjE6ICggcnVsZV9fRGF0YUludGVyY2hhbmdlQmVhbl9fR3JvdXBfNV9fMF9fSW1wbCBydWxlX19EYXRhSW50ZXJjaGFuZ2VCZWFuX19Hcm91cF81X18xICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjY1Nzg6MjogcnVsZV9fRGF0YUludGVyY2hhbmdlQmVhbl9fR3JvdXBfNV9fMF9fSW1wbCBydWxlX19EYXRhSW50ZXJjaGFuZ2VCZWFuX19Hcm91cF81X18xCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV183KTsKICAgICAgICAgICAgIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUJlYW5fX0dyb3VwXzVfXzBfX0ltcGwoKTsKQEAgLTIyMTE3LDI2ICsyMzQ0MSwyNiBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX0RhdGFJbnRlcmNoYW5nZUJlYW5fX0dyb3VwXzVfXzBfX0ltcGwiCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NjI0NjoxOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VCZWFuX19Hcm91cF81X18wX19JbXBsIDogKCAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUJlYW5fX01hcmtMYXRlc3RBc3NpZ25tZW50XzVfMCApICkgOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjY1ODU6MTogcnVsZV9fRGF0YUludGVyY2hhbmdlQmVhbl9fR3JvdXBfNV9fMF9fSW1wbCA6ICggKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VCZWFuX19NYXJrTGF0ZXN0SW1wb3J0QXNzaWdubWVudF81XzAgKSApIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19EYXRhSW50ZXJjaGFuZ2VCZWFuX19Hcm91cF81X18wX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjYyNTA6MTogKCAoICggcnVsZV9fRGF0YUludGVyY2hhbmdlQmVhbl9fTWFya0xhdGVzdEFzc2lnbm1lbnRfNV8wICkgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo2MjUxOjE6ICggKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VCZWFuX19NYXJrTGF0ZXN0QXNzaWdubWVudF81XzAgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo2NTg5OjE6ICggKCAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUJlYW5fX01hcmtMYXRlc3RJbXBvcnRBc3NpZ25tZW50XzVfMCApICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NjU5MDoxOiAoICggcnVsZV9fRGF0YUludGVyY2hhbmdlQmVhbl9fTWFya0xhdGVzdEltcG9ydEFzc2lnbm1lbnRfNV8wICkgKQogICAgICAgICAgICAgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NjI1MToxOiAoICggcnVsZV9fRGF0YUludGVyY2hhbmdlQmVhbl9fTWFya0xhdGVzdEFzc2lnbm1lbnRfNV8wICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NjI1MjoyOiAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUJlYW5fX01hcmtMYXRlc3RBc3NpZ25tZW50XzVfMCApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo2NTkwOjE6ICggKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VCZWFuX19NYXJrTGF0ZXN0SW1wb3J0QXNzaWdubWVudF81XzAgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo2NTkxOjI6ICggcnVsZV9fRGF0YUludGVyY2hhbmdlQmVhbl9fTWFya0xhdGVzdEltcG9ydEFzc2lnbm1lbnRfNV8wICkKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewotICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YUludGVyY2hhbmdlQmVhbkFjY2VzcygpLmdldE1hcmtMYXRlc3RBc3NpZ25tZW50XzVfMCgpKTsgCisgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXREYXRhSW50ZXJjaGFuZ2VCZWFuQWNjZXNzKCkuZ2V0TWFya0xhdGVzdEltcG9ydEFzc2lnbm1lbnRfNV8wKCkpOyAKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjYyNTM6MjogKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VCZWFuX19NYXJrTGF0ZXN0QXNzaWdubWVudF81XzAgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NjI1MzozOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VCZWFuX19NYXJrTGF0ZXN0QXNzaWdubWVudF81XzAKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjY1OTI6MjogKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VCZWFuX19NYXJrTGF0ZXN0SW1wb3J0QXNzaWdubWVudF81XzAgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NjU5MjozOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VCZWFuX19NYXJrTGF0ZXN0SW1wb3J0QXNzaWdubWVudF81XzAKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzIpOwotICAgICAgICAgICAgcnVsZV9fRGF0YUludGVyY2hhbmdlQmVhbl9fTWFya0xhdGVzdEFzc2lnbm1lbnRfNV8wKCk7CisgICAgICAgICAgICBydWxlX19EYXRhSW50ZXJjaGFuZ2VCZWFuX19NYXJrTGF0ZXN0SW1wb3J0QXNzaWdubWVudF81XzAoKTsKIAogICAgICAgICAgICAgc3RhdGUuX2ZzcC0tOwogICAgICAgICAgICAgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKQEAgLTIyMTQ0LDcgKzIzNDY4LDcgQEAKICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7Ci0gICAgICAgICAgICAgICBhZnRlcihncmFtbWFyQWNjZXNzLmdldERhdGFJbnRlcmNoYW5nZUJlYW5BY2Nlc3MoKS5nZXRNYXJrTGF0ZXN0QXNzaWdubWVudF81XzAoKSk7IAorICAgICAgICAgICAgICAgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXREYXRhSW50ZXJjaGFuZ2VCZWFuQWNjZXNzKCkuZ2V0TWFya0xhdGVzdEltcG9ydEFzc2lnbm1lbnRfNV8wKCkpOyAKICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgfQpAQCAtMjIxNjgsMTQgKzIzNDkyLDE0IEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fRGF0YUludGVyY2hhbmdlQmVhbl9fR3JvdXBfNV9fMSIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo2MjYxOjE6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUJlYW5fX0dyb3VwXzVfXzEgOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VCZWFuX19Hcm91cF81X18xX19JbXBsIDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo2NjAwOjE6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUJlYW5fX0dyb3VwXzVfXzEgOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VCZWFuX19Hcm91cF81X18xX19JbXBsIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19EYXRhSW50ZXJjaGFuZ2VCZWFuX19Hcm91cF81X18xKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjYyNjU6MTogKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VCZWFuX19Hcm91cF81X18xX19JbXBsICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjYyNjY6MjogcnVsZV9fRGF0YUludGVyY2hhbmdlQmVhbl9fR3JvdXBfNV9fMV9fSW1wbAorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NjYwNDoxOiAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUJlYW5fX0dyb3VwXzVfXzFfX0ltcGwgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NjYwNToyOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VCZWFuX19Hcm91cF81X18xX19JbXBsCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV18yKTsKICAgICAgICAgICAgIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUJlYW5fX0dyb3VwXzVfXzFfX0ltcGwoKTsKQEAgLTIyMjAxLDIzICsyMzUyNSwyMyBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX0RhdGFJbnRlcmNoYW5nZUJlYW5fX0dyb3VwXzVfXzFfX0ltcGwiCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NjI3MjoxOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VCZWFuX19Hcm91cF81X18xX19JbXBsIDogKCAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUJlYW5fX0xhdGVzdFByb3BlcnR5QXNzaWdubWVudF81XzEgKSApIDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo2NjExOjE6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUJlYW5fX0dyb3VwXzVfXzFfX0ltcGwgOiAoICggcnVsZV9fRGF0YUludGVyY2hhbmdlQmVhbl9fTGF0ZXN0UHJvcGVydHlBc3NpZ25tZW50XzVfMSApICkgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUJlYW5fX0dyb3VwXzVfXzFfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NjI3NjoxOiAoICggKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VCZWFuX19MYXRlc3RQcm9wZXJ0eUFzc2lnbm1lbnRfNV8xICkgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo2Mjc3OjE6ICggKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VCZWFuX19MYXRlc3RQcm9wZXJ0eUFzc2lnbm1lbnRfNV8xICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NjYxNToxOiAoICggKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VCZWFuX19MYXRlc3RQcm9wZXJ0eUFzc2lnbm1lbnRfNV8xICkgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo2NjE2OjE6ICggKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VCZWFuX19MYXRlc3RQcm9wZXJ0eUFzc2lnbm1lbnRfNV8xICkgKQogICAgICAgICAgICAgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NjI3NzoxOiAoICggcnVsZV9fRGF0YUludGVyY2hhbmdlQmVhbl9fTGF0ZXN0UHJvcGVydHlBc3NpZ25tZW50XzVfMSApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjYyNzg6MjogKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VCZWFuX19MYXRlc3RQcm9wZXJ0eUFzc2lnbm1lbnRfNV8xICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjY2MTY6MTogKCAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUJlYW5fX0xhdGVzdFByb3BlcnR5QXNzaWdubWVudF81XzEgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo2NjE3OjI6ICggcnVsZV9fRGF0YUludGVyY2hhbmdlQmVhbl9fTGF0ZXN0UHJvcGVydHlBc3NpZ25tZW50XzVfMSApCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldERhdGFJbnRlcmNoYW5nZUJlYW5BY2Nlc3MoKS5nZXRMYXRlc3RQcm9wZXJ0eUFzc2lnbm1lbnRfNV8xKCkpOyAKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjYyNzk6MjogKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VCZWFuX19MYXRlc3RQcm9wZXJ0eUFzc2lnbm1lbnRfNV8xICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjYyNzk6MzogcnVsZV9fRGF0YUludGVyY2hhbmdlQmVhbl9fTGF0ZXN0UHJvcGVydHlBc3NpZ25tZW50XzVfMQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NjYxODoyOiAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUJlYW5fX0xhdGVzdFByb3BlcnR5QXNzaWdubWVudF81XzEgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NjYxODozOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VCZWFuX19MYXRlc3RQcm9wZXJ0eUFzc2lnbm1lbnRfNV8xCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV18yKTsKICAgICAgICAgICAgIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUJlYW5fX0xhdGVzdFByb3BlcnR5QXNzaWdubWVudF81XzEoKTsKQEAgLTIyMjUyLDE2ICsyMzU3NiwxNiBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX0RhdGFJbnRlcmNoYW5nZUJlYW5fX0dyb3VwXzZfXzAiCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NjI4ODoxOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VCZWFuX19Hcm91cF82X18wIDogcnVsZV9fRGF0YUludGVyY2hhbmdlQmVhbl9fR3JvdXBfNl9fMF9fSW1wbCBydWxlX19EYXRhSW50ZXJjaGFuZ2VCZWFuX19Hcm91cF82X18xIDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo2NjI3OjE6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUJlYW5fX0dyb3VwXzZfXzAgOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VCZWFuX19Hcm91cF82X18wX19JbXBsIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUJlYW5fX0dyb3VwXzZfXzEgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUJlYW5fX0dyb3VwXzZfXzAoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NjI5MjoxOiAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUJlYW5fX0dyb3VwXzZfXzBfX0ltcGwgcnVsZV9fRGF0YUludGVyY2hhbmdlQmVhbl9fR3JvdXBfNl9fMSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo2MjkzOjI6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUJlYW5fX0dyb3VwXzZfXzBfX0ltcGwgcnVsZV9fRGF0YUludGVyY2hhbmdlQmVhbl9fR3JvdXBfNl9fMQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NjYzMToxOiAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUJlYW5fX0dyb3VwXzZfXzBfX0ltcGwgcnVsZV9fRGF0YUludGVyY2hhbmdlQmVhbl9fR3JvdXBfNl9fMSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo2NjMyOjI6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUJlYW5fX0dyb3VwXzZfXzBfX0ltcGwgcnVsZV9fRGF0YUludGVyY2hhbmdlQmVhbl9fR3JvdXBfNl9fMQogICAgICAgICAgICAgewotICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMTApOworICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfNyk7CiAgICAgICAgICAgICBydWxlX19EYXRhSW50ZXJjaGFuZ2VCZWFuX19Hcm91cF82X18wX19JbXBsKCk7CiAKICAgICAgICAgICAgIHN0YXRlLl9mc3AtLTsKQEAgLTIyMjkwLDI0ICsyMzYxNCwzNCBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX0RhdGFJbnRlcmNoYW5nZUJlYW5fX0dyb3VwXzZfXzBfX0ltcGwiCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NjMwMDoxOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VCZWFuX19Hcm91cF82X18wX19JbXBsIDogKCAnZXhwcmVzc2lvbicgKSA7CisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NjYzOToxOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VCZWFuX19Hcm91cF82X18wX19JbXBsIDogKCAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUJlYW5fX01hcmtMYXRlc3RFeHBvcnRBc3NpZ25tZW50XzZfMCApICkgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUJlYW5fX0dyb3VwXzZfXzBfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NjMwNDoxOiAoICggJ2V4cHJlc3Npb24nICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NjMwNToxOiAoICdleHByZXNzaW9uJyApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo2NjQzOjE6ICggKCAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUJlYW5fX01hcmtMYXRlc3RFeHBvcnRBc3NpZ25tZW50XzZfMCApICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NjY0NDoxOiAoICggcnVsZV9fRGF0YUludGVyY2hhbmdlQmVhbl9fTWFya0xhdGVzdEV4cG9ydEFzc2lnbm1lbnRfNl8wICkgKQogICAgICAgICAgICAgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NjMwNToxOiAoICdleHByZXNzaW9uJyApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo2MzA2OjI6ICdleHByZXNzaW9uJworICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NjY0NDoxOiAoICggcnVsZV9fRGF0YUludGVyY2hhbmdlQmVhbl9fTWFya0xhdGVzdEV4cG9ydEFzc2lnbm1lbnRfNl8wICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NjY0NToyOiAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUJlYW5fX01hcmtMYXRlc3RFeHBvcnRBc3NpZ25tZW50XzZfMCApCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKLSAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldERhdGFJbnRlcmNoYW5nZUJlYW5BY2Nlc3MoKS5nZXRFeHByZXNzaW9uS2V5d29yZF82XzAoKSk7IAorICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YUludGVyY2hhbmdlQmVhbkFjY2VzcygpLmdldE1hcmtMYXRlc3RFeHBvcnRBc3NpZ25tZW50XzZfMCgpKTsgCiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBtYXRjaChpbnB1dCw4OSxGT0xMT1dfMik7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo2NjQ2OjI6ICggcnVsZV9fRGF0YUludGVyY2hhbmdlQmVhbl9fTWFya0xhdGVzdEV4cG9ydEFzc2lnbm1lbnRfNl8wICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjY2NDY6MzogcnVsZV9fRGF0YUludGVyY2hhbmdlQmVhbl9fTWFya0xhdGVzdEV4cG9ydEFzc2lnbm1lbnRfNl8wCisgICAgICAgICAgICB7CisgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV18yKTsKKyAgICAgICAgICAgIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUJlYW5fX01hcmtMYXRlc3RFeHBvcnRBc3NpZ25tZW50XzZfMCgpOworCisgICAgICAgICAgICBzdGF0ZS5fZnNwLS07CisgICAgICAgICAgICBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOworCisgICAgICAgICAgICB9CisKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewotICAgICAgICAgICAgICAgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXREYXRhSW50ZXJjaGFuZ2VCZWFuQWNjZXNzKCkuZ2V0RXhwcmVzc2lvbktleXdvcmRfNl8wKCkpOyAKKyAgICAgICAgICAgICAgIGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YUludGVyY2hhbmdlQmVhbkFjY2VzcygpLmdldE1hcmtMYXRlc3RFeHBvcnRBc3NpZ25tZW50XzZfMCgpKTsgCiAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIH0KQEAgLTIyMzMxLDIyICsyMzY2NSwxNyBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX0RhdGFJbnRlcmNoYW5nZUJlYW5fX0dyb3VwXzZfXzEiCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NjMxNToxOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VCZWFuX19Hcm91cF82X18xIDogcnVsZV9fRGF0YUludGVyY2hhbmdlQmVhbl9fR3JvdXBfNl9fMV9fSW1wbCBydWxlX19EYXRhSW50ZXJjaGFuZ2VCZWFuX19Hcm91cF82X18yIDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo2NjU0OjE6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUJlYW5fX0dyb3VwXzZfXzEgOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VCZWFuX19Hcm91cF82X18xX19JbXBsIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19EYXRhSW50ZXJjaGFuZ2VCZWFuX19Hcm91cF82X18xKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjYzMTk6MTogKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VCZWFuX19Hcm91cF82X18xX19JbXBsIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUJlYW5fX0dyb3VwXzZfXzIgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NjMyMDoyOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VCZWFuX19Hcm91cF82X18xX19JbXBsIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUJlYW5fX0dyb3VwXzZfXzIKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjY2NTg6MTogKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VCZWFuX19Hcm91cF82X18xX19JbXBsICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjY2NTk6MjogcnVsZV9fRGF0YUludGVyY2hhbmdlQmVhbl9fR3JvdXBfNl9fMV9fSW1wbAogICAgICAgICAgICAgewotICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMzApOwotICAgICAgICAgICAgcnVsZV9fRGF0YUludGVyY2hhbmdlQmVhbl9fR3JvdXBfNl9fMV9fSW1wbCgpOwotCi0gICAgICAgICAgICBzdGF0ZS5fZnNwLS07Ci0gICAgICAgICAgICBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOwogICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMik7Ci0gICAgICAgICAgICBydWxlX19EYXRhSW50ZXJjaGFuZ2VCZWFuX19Hcm91cF82X18yKCk7CisgICAgICAgICAgICBydWxlX19EYXRhSW50ZXJjaGFuZ2VCZWFuX19Hcm91cF82X18xX19JbXBsKCk7CiAKICAgICAgICAgICAgIHN0YXRlLl9mc3AtLTsKICAgICAgICAgICAgIGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CkBAIC0yMjM2OSwyNCArMjM2OTgsMzQgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19EYXRhSW50ZXJjaGFuZ2VCZWFuX19Hcm91cF82X18xX19JbXBsIgotICAgIC8vIEludGVybmFsRGF0YURTTC5nOjYzMjc6MTogcnVsZV9fRGF0YUludGVyY2hhbmdlQmVhbl9fR3JvdXBfNl9fMV9fSW1wbCA6ICggJ3snICkgOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjY2NjU6MTogcnVsZV9fRGF0YUludGVyY2hhbmdlQmVhbl9fR3JvdXBfNl9fMV9fSW1wbCA6ICggKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VCZWFuX19MYXRlc3RFeHBQcm9wZXJ0eUFzc2lnbm1lbnRfNl8xICkgKSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fRGF0YUludGVyY2hhbmdlQmVhbl9fR3JvdXBfNl9fMV9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo2MzMxOjE6ICggKCAneycgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo2MzMyOjE6ICggJ3snICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjY2Njk6MTogKCAoICggcnVsZV9fRGF0YUludGVyY2hhbmdlQmVhbl9fTGF0ZXN0RXhwUHJvcGVydHlBc3NpZ25tZW50XzZfMSApICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NjY3MDoxOiAoICggcnVsZV9fRGF0YUludGVyY2hhbmdlQmVhbl9fTGF0ZXN0RXhwUHJvcGVydHlBc3NpZ25tZW50XzZfMSApICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjYzMzI6MTogKCAneycgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NjMzMzoyOiAneycKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjY2NzA6MTogKCAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUJlYW5fX0xhdGVzdEV4cFByb3BlcnR5QXNzaWdubWVudF82XzEgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo2NjcxOjI6ICggcnVsZV9fRGF0YUludGVyY2hhbmdlQmVhbl9fTGF0ZXN0RXhwUHJvcGVydHlBc3NpZ25tZW50XzZfMSApCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKLSAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldERhdGFJbnRlcmNoYW5nZUJlYW5BY2Nlc3MoKS5nZXRMZWZ0Q3VybHlCcmFja2V0S2V5d29yZF82XzEoKSk7IAorICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YUludGVyY2hhbmdlQmVhbkFjY2VzcygpLmdldExhdGVzdEV4cFByb3BlcnR5QXNzaWdubWVudF82XzEoKSk7IAogICAgICAgICAgICAgfQotICAgICAgICAgICAgbWF0Y2goaW5wdXQsNzAsRk9MTE9XXzIpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOworICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NjY3MjoyOiAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUJlYW5fX0xhdGVzdEV4cFByb3BlcnR5QXNzaWdubWVudF82XzEgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NjY3MjozOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VCZWFuX19MYXRlc3RFeHBQcm9wZXJ0eUFzc2lnbm1lbnRfNl8xCisgICAgICAgICAgICB7CisgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV18yKTsKKyAgICAgICAgICAgIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUJlYW5fX0xhdGVzdEV4cFByb3BlcnR5QXNzaWdubWVudF82XzEoKTsKKworICAgICAgICAgICAgc3RhdGUuX2ZzcC0tOworICAgICAgICAgICAgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKKworICAgICAgICAgICAgfQorCiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKLSAgICAgICAgICAgICAgIGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YUludGVyY2hhbmdlQmVhbkFjY2VzcygpLmdldExlZnRDdXJseUJyYWNrZXRLZXl3b3JkXzZfMSgpKTsgCisgICAgICAgICAgICAgICBhZnRlcihncmFtbWFyQWNjZXNzLmdldERhdGFJbnRlcmNoYW5nZUJlYW5BY2Nlc3MoKS5nZXRMYXRlc3RFeHBQcm9wZXJ0eUFzc2lnbm1lbnRfNl8xKCkpOyAKICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgfQpAQCAtMjI0MDksMTk2ICsyMzc0OCwxNSBAQAogICAgIC8vICRBTlRMUiBlbmQgInJ1bGVfX0RhdGFJbnRlcmNoYW5nZUJlYW5fX0dyb3VwXzZfXzFfX0ltcGwiCiAKIAotICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fRGF0YUludGVyY2hhbmdlQmVhbl9fR3JvdXBfNl9fMiIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo2MzQyOjE6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUJlYW5fX0dyb3VwXzZfXzIgOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VCZWFuX19Hcm91cF82X18yX19JbXBsIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUJlYW5fX0dyb3VwXzZfXzMgOwotICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUJlYW5fX0dyb3VwXzZfXzIoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewotCi0gICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKLSAgICAgICAgCQotICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NjM0NjoxOiAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUJlYW5fX0dyb3VwXzZfXzJfX0ltcGwgcnVsZV9fRGF0YUludGVyY2hhbmdlQmVhbl9fR3JvdXBfNl9fMyApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo2MzQ3OjI6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUJlYW5fX0dyb3VwXzZfXzJfX0ltcGwgcnVsZV9fRGF0YUludGVyY2hhbmdlQmVhbl9fR3JvdXBfNl9fMwotICAgICAgICAgICAgewotICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMzApOwotICAgICAgICAgICAgcnVsZV9fRGF0YUludGVyY2hhbmdlQmVhbl9fR3JvdXBfNl9fMl9fSW1wbCgpOwotCi0gICAgICAgICAgICBzdGF0ZS5fZnNwLS07Ci0gICAgICAgICAgICBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOwotICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMik7Ci0gICAgICAgICAgICBydWxlX19EYXRhSW50ZXJjaGFuZ2VCZWFuX19Hcm91cF82X18zKCk7Ci0KLSAgICAgICAgICAgIHN0YXRlLl9mc3AtLTsKLSAgICAgICAgICAgIGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7Ci0KLSAgICAgICAgICAgIH0KLQotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChSZWNvZ25pdGlvbkV4Y2VwdGlvbiByZSkgewotICAgICAgICAgICAgcmVwb3J0RXJyb3IocmUpOwotICAgICAgICAgICAgcmVjb3ZlcihpbnB1dCxyZSk7Ci0gICAgICAgIH0KLSAgICAgICAgZmluYWxseSB7Ci0KLSAgICAgICAgICAgIAlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Ci0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gOwotICAgIH0KLSAgICAvLyAkQU5UTFIgZW5kICJydWxlX19EYXRhSW50ZXJjaGFuZ2VCZWFuX19Hcm91cF82X18yIgotCi0KLSAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX0RhdGFJbnRlcmNoYW5nZUJlYW5fX0dyb3VwXzZfXzJfX0ltcGwiCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NjM1NDoxOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VCZWFuX19Hcm91cF82X18yX19JbXBsIDogKCAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUJlYW5fX0V4cHJlc3Npb25Bc3NpZ25tZW50XzZfMiApKiApIDsKLSAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19EYXRhSW50ZXJjaGFuZ2VCZWFuX19Hcm91cF82X18yX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKLQotICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7Ci0gICAgICAgIAkKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjYzNTg6MTogKCAoICggcnVsZV9fRGF0YUludGVyY2hhbmdlQmVhbl9fRXhwcmVzc2lvbkFzc2lnbm1lbnRfNl8yICkqICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NjM1OToxOiAoICggcnVsZV9fRGF0YUludGVyY2hhbmdlQmVhbl9fRXhwcmVzc2lvbkFzc2lnbm1lbnRfNl8yICkqICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjYzNTk6MTogKCAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUJlYW5fX0V4cHJlc3Npb25Bc3NpZ25tZW50XzZfMiApKiApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo2MzYwOjI6ICggcnVsZV9fRGF0YUludGVyY2hhbmdlQmVhbl9fRXhwcmVzc2lvbkFzc2lnbm1lbnRfNl8yICkqCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKLSAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldERhdGFJbnRlcmNoYW5nZUJlYW5BY2Nlc3MoKS5nZXRFeHByZXNzaW9uQXNzaWdubWVudF82XzIoKSk7IAotICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NjM2MToyOiAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUJlYW5fX0V4cHJlc3Npb25Bc3NpZ25tZW50XzZfMiApKgotICAgICAgICAgICAgbG9vcDcxOgotICAgICAgICAgICAgZG8gewotICAgICAgICAgICAgICAgIGludCBhbHQ3MT0yOwotICAgICAgICAgICAgICAgIGludCBMQTcxXzAgPSBpbnB1dC5MQSgxKTsKLQotICAgICAgICAgICAgICAgIGlmICggKExBNzFfMD09MTAyfHxMQTcxXzA9PTEwNSkgKSB7Ci0gICAgICAgICAgICAgICAgICAgIGFsdDcxPTE7Ci0gICAgICAgICAgICAgICAgfQotCi0KLSAgICAgICAgICAgICAgICBzd2l0Y2ggKGFsdDcxKSB7Ci0gICAgICAgICAgICAJY2FzZSAxIDoKLSAgICAgICAgICAgIAkgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NjM2MTozOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VCZWFuX19FeHByZXNzaW9uQXNzaWdubWVudF82XzIKLSAgICAgICAgICAgIAkgICAgewotICAgICAgICAgICAgCSAgICBwdXNoRm9sbG93KEZPTExPV18zMSk7Ci0gICAgICAgICAgICAJICAgIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUJlYW5fX0V4cHJlc3Npb25Bc3NpZ25tZW50XzZfMigpOwotCi0gICAgICAgICAgICAJICAgIHN0YXRlLl9mc3AtLTsKLSAgICAgICAgICAgIAkgICAgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKLQotICAgICAgICAgICAgCSAgICB9Ci0gICAgICAgICAgICAJICAgIGJyZWFrOwotCi0gICAgICAgICAgICAJZGVmYXVsdCA6Ci0gICAgICAgICAgICAJICAgIGJyZWFrIGxvb3A3MTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IHdoaWxlICh0cnVlKTsKLQotICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7Ci0gICAgICAgICAgICAgICBhZnRlcihncmFtbWFyQWNjZXNzLmdldERhdGFJbnRlcmNoYW5nZUJlYW5BY2Nlc3MoKS5nZXRFeHByZXNzaW9uQXNzaWdubWVudF82XzIoKSk7IAotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICB9Ci0KLQotICAgICAgICAgICAgfQotCi0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKFJlY29nbml0aW9uRXhjZXB0aW9uIHJlKSB7Ci0gICAgICAgICAgICByZXBvcnRFcnJvcihyZSk7Ci0gICAgICAgICAgICByZWNvdmVyKGlucHV0LHJlKTsKLSAgICAgICAgfQotICAgICAgICBmaW5hbGx5IHsKLQotICAgICAgICAgICAgCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKLQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiA7Ci0gICAgfQotICAgIC8vICRBTlRMUiBlbmQgInJ1bGVfX0RhdGFJbnRlcmNoYW5nZUJlYW5fX0dyb3VwXzZfXzJfX0ltcGwiCi0KLQotICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fRGF0YUludGVyY2hhbmdlQmVhbl9fR3JvdXBfNl9fMyIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo2MzY5OjE6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUJlYW5fX0dyb3VwXzZfXzMgOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VCZWFuX19Hcm91cF82X18zX19JbXBsIDsKLSAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19EYXRhSW50ZXJjaGFuZ2VCZWFuX19Hcm91cF82X18zKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKLQotICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7Ci0gICAgICAgIAkKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjYzNzM6MTogKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VCZWFuX19Hcm91cF82X18zX19JbXBsICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjYzNzQ6MjogcnVsZV9fRGF0YUludGVyY2hhbmdlQmVhbl9fR3JvdXBfNl9fM19fSW1wbAotICAgICAgICAgICAgewotICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMik7Ci0gICAgICAgICAgICBydWxlX19EYXRhSW50ZXJjaGFuZ2VCZWFuX19Hcm91cF82X18zX19JbXBsKCk7Ci0KLSAgICAgICAgICAgIHN0YXRlLl9mc3AtLTsKLSAgICAgICAgICAgIGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7Ci0KLSAgICAgICAgICAgIH0KLQotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChSZWNvZ25pdGlvbkV4Y2VwdGlvbiByZSkgewotICAgICAgICAgICAgcmVwb3J0RXJyb3IocmUpOwotICAgICAgICAgICAgcmVjb3ZlcihpbnB1dCxyZSk7Ci0gICAgICAgIH0KLSAgICAgICAgZmluYWxseSB7Ci0KLSAgICAgICAgICAgIAlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Ci0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gOwotICAgIH0KLSAgICAvLyAkQU5UTFIgZW5kICJydWxlX19EYXRhSW50ZXJjaGFuZ2VCZWFuX19Hcm91cF82X18zIgotCi0KLSAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX0RhdGFJbnRlcmNoYW5nZUJlYW5fX0dyb3VwXzZfXzNfX0ltcGwiCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NjM4MDoxOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VCZWFuX19Hcm91cF82X18zX19JbXBsIDogKCAnfScgKSA7Ci0gICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fRGF0YUludGVyY2hhbmdlQmVhbl9fR3JvdXBfNl9fM19fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7Ci0KLSAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwotICAgICAgICAJCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo2Mzg0OjE6ICggKCAnfScgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo2Mzg1OjE6ICggJ30nICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjYzODU6MTogKCAnfScgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NjM4NjoyOiAnfScKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewotICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YUludGVyY2hhbmdlQmVhbkFjY2VzcygpLmdldFJpZ2h0Q3VybHlCcmFja2V0S2V5d29yZF82XzMoKSk7IAotICAgICAgICAgICAgfQotICAgICAgICAgICAgbWF0Y2goaW5wdXQsNzEsRk9MTE9XXzIpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOwotICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7Ci0gICAgICAgICAgICAgICBhZnRlcihncmFtbWFyQWNjZXNzLmdldERhdGFJbnRlcmNoYW5nZUJlYW5BY2Nlc3MoKS5nZXRSaWdodEN1cmx5QnJhY2tldEtleXdvcmRfNl8zKCkpOyAKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgfQotCi0KLSAgICAgICAgICAgIH0KLQotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChSZWNvZ25pdGlvbkV4Y2VwdGlvbiByZSkgewotICAgICAgICAgICAgcmVwb3J0RXJyb3IocmUpOwotICAgICAgICAgICAgcmVjb3ZlcihpbnB1dCxyZSk7Ci0gICAgICAgIH0KLSAgICAgICAgZmluYWxseSB7Ci0KLSAgICAgICAgICAgIAlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Ci0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gOwotICAgIH0KLSAgICAvLyAkQU5UTFIgZW5kICJydWxlX19EYXRhSW50ZXJjaGFuZ2VCZWFuX19Hcm91cF82X18zX19JbXBsIgotCi0KICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX0RhdGFJbnRlcmNoYW5nZUJlYW5fX0dyb3VwXzdfXzAiCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NjM5NjoxOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VCZWFuX19Hcm91cF83X18wIDogcnVsZV9fRGF0YUludGVyY2hhbmdlQmVhbl9fR3JvdXBfN19fMF9fSW1wbCBydWxlX19EYXRhSW50ZXJjaGFuZ2VCZWFuX19Hcm91cF83X18xIDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo2NjgxOjE6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUJlYW5fX0dyb3VwXzdfXzAgOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VCZWFuX19Hcm91cF83X18wX19JbXBsIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUJlYW5fX0dyb3VwXzdfXzEgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUJlYW5fX0dyb3VwXzdfXzAoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NjQwMDoxOiAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUJlYW5fX0dyb3VwXzdfXzBfX0ltcGwgcnVsZV9fRGF0YUludGVyY2hhbmdlQmVhbl9fR3JvdXBfN19fMSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo2NDAxOjI6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUJlYW5fX0dyb3VwXzdfXzBfX0ltcGwgcnVsZV9fRGF0YUludGVyY2hhbmdlQmVhbl9fR3JvdXBfN19fMQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NjY4NToxOiAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUJlYW5fX0dyb3VwXzdfXzBfX0ltcGwgcnVsZV9fRGF0YUludGVyY2hhbmdlQmVhbl9fR3JvdXBfN19fMSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo2Njg2OjI6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUJlYW5fX0dyb3VwXzdfXzBfX0ltcGwgcnVsZV9fRGF0YUludGVyY2hhbmdlQmVhbl9fR3JvdXBfN19fMQogICAgICAgICAgICAgewogICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMTApOwogICAgICAgICAgICAgcnVsZV9fRGF0YUludGVyY2hhbmdlQmVhbl9fR3JvdXBfN19fMF9fSW1wbCgpOwpAQCAtMjI2MjksMjQgKzIzNzg3LDI0IEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fRGF0YUludGVyY2hhbmdlQmVhbl9fR3JvdXBfN19fMF9fSW1wbCIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo2NDA4OjE6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUJlYW5fX0dyb3VwXzdfXzBfX0ltcGwgOiAoICdsb29rdXAnICkgOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjY2OTM6MTogcnVsZV9fRGF0YUludGVyY2hhbmdlQmVhbl9fR3JvdXBfN19fMF9fSW1wbCA6ICggJ2V4cHJlc3Npb24nICkgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUJlYW5fX0dyb3VwXzdfXzBfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NjQxMjoxOiAoICggJ2xvb2t1cCcgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo2NDEzOjE6ICggJ2xvb2t1cCcgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NjY5NzoxOiAoICggJ2V4cHJlc3Npb24nICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NjY5ODoxOiAoICdleHByZXNzaW9uJyApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo2NDEzOjE6ICggJ2xvb2t1cCcgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NjQxNDoyOiAnbG9va3VwJworICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NjY5ODoxOiAoICdleHByZXNzaW9uJyApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo2Njk5OjI6ICdleHByZXNzaW9uJwogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7Ci0gICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXREYXRhSW50ZXJjaGFuZ2VCZWFuQWNjZXNzKCkuZ2V0TG9va3VwS2V5d29yZF83XzAoKSk7IAorICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YUludGVyY2hhbmdlQmVhbkFjY2VzcygpLmdldEV4cHJlc3Npb25LZXl3b3JkXzdfMCgpKTsgCiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBtYXRjaChpbnB1dCw5MCxGT0xMT1dfMik7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CisgICAgICAgICAgICBtYXRjaChpbnB1dCw5NCxGT0xMT1dfMik7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKLSAgICAgICAgICAgICAgIGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YUludGVyY2hhbmdlQmVhbkFjY2VzcygpLmdldExvb2t1cEtleXdvcmRfN18wKCkpOyAKKyAgICAgICAgICAgICAgIGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YUludGVyY2hhbmdlQmVhbkFjY2VzcygpLmdldEV4cHJlc3Npb25LZXl3b3JkXzdfMCgpKTsgCiAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIH0KQEAgLTIyNjcwLDE2ICsyMzgyOCwxNiBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX0RhdGFJbnRlcmNoYW5nZUJlYW5fX0dyb3VwXzdfXzEiCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NjQyMzoxOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VCZWFuX19Hcm91cF83X18xIDogcnVsZV9fRGF0YUludGVyY2hhbmdlQmVhbl9fR3JvdXBfN19fMV9fSW1wbCBydWxlX19EYXRhSW50ZXJjaGFuZ2VCZWFuX19Hcm91cF83X18yIDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo2NzA4OjE6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUJlYW5fX0dyb3VwXzdfXzEgOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VCZWFuX19Hcm91cF83X18xX19JbXBsIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUJlYW5fX0dyb3VwXzdfXzIgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUJlYW5fX0dyb3VwXzdfXzEoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NjQyNzoxOiAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUJlYW5fX0dyb3VwXzdfXzFfX0ltcGwgcnVsZV9fRGF0YUludGVyY2hhbmdlQmVhbl9fR3JvdXBfN19fMiApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo2NDI4OjI6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUJlYW5fX0dyb3VwXzdfXzFfX0ltcGwgcnVsZV9fRGF0YUludGVyY2hhbmdlQmVhbl9fR3JvdXBfN19fMgorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NjcxMjoxOiAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUJlYW5fX0dyb3VwXzdfXzFfX0ltcGwgcnVsZV9fRGF0YUludGVyY2hhbmdlQmVhbl9fR3JvdXBfN19fMiApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo2NzEzOjI6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUJlYW5fX0dyb3VwXzdfXzFfX0ltcGwgcnVsZV9fRGF0YUludGVyY2hhbmdlQmVhbl9fR3JvdXBfN19fMgogICAgICAgICAgICAgewotICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMzIpOworICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMzApOwogICAgICAgICAgICAgcnVsZV9fRGF0YUludGVyY2hhbmdlQmVhbl9fR3JvdXBfN19fMV9fSW1wbCgpOwogCiAgICAgICAgICAgICBzdGF0ZS5fZnNwLS07CkBAIC0yMjcwOCwyMiArMjM4NjYsMjIgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19EYXRhSW50ZXJjaGFuZ2VCZWFuX19Hcm91cF83X18xX19JbXBsIgotICAgIC8vIEludGVybmFsRGF0YURTTC5nOjY0MzU6MTogcnVsZV9fRGF0YUludGVyY2hhbmdlQmVhbl9fR3JvdXBfN19fMV9fSW1wbCA6ICggJ3snICkgOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjY3MjA6MTogcnVsZV9fRGF0YUludGVyY2hhbmdlQmVhbl9fR3JvdXBfN19fMV9fSW1wbCA6ICggJ3snICkgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUJlYW5fX0dyb3VwXzdfXzFfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NjQzOToxOiAoICggJ3snICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NjQ0MDoxOiAoICd7JyApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo2NzI0OjE6ICggKCAneycgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo2NzI1OjE6ICggJ3snICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjY0NDA6MTogKCAneycgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NjQ0MToyOiAneycKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjY3MjU6MTogKCAneycgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NjcyNjoyOiAneycKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YUludGVyY2hhbmdlQmVhbkFjY2VzcygpLmdldExlZnRDdXJseUJyYWNrZXRLZXl3b3JkXzdfMSgpKTsgCiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBtYXRjaChpbnB1dCw3MCxGT0xMT1dfMik7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CisgICAgICAgICAgICBtYXRjaChpbnB1dCw3NSxGT0xMT1dfMik7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YUludGVyY2hhbmdlQmVhbkFjY2VzcygpLmdldExlZnRDdXJseUJyYWNrZXRLZXl3b3JkXzdfMSgpKTsgCiAgICAgICAgICAgICB9CkBAIC0yMjc0OSwxNiArMjM5MDcsMTYgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19EYXRhSW50ZXJjaGFuZ2VCZWFuX19Hcm91cF83X18yIgotICAgIC8vIEludGVybmFsRGF0YURTTC5nOjY0NTA6MTogcnVsZV9fRGF0YUludGVyY2hhbmdlQmVhbl9fR3JvdXBfN19fMiA6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUJlYW5fX0dyb3VwXzdfXzJfX0ltcGwgcnVsZV9fRGF0YUludGVyY2hhbmdlQmVhbl9fR3JvdXBfN19fMyA7CisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NjczNToxOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VCZWFuX19Hcm91cF83X18yIDogcnVsZV9fRGF0YUludGVyY2hhbmdlQmVhbl9fR3JvdXBfN19fMl9fSW1wbCBydWxlX19EYXRhSW50ZXJjaGFuZ2VCZWFuX19Hcm91cF83X18zIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19EYXRhSW50ZXJjaGFuZ2VCZWFuX19Hcm91cF83X18yKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjY0NTQ6MTogKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VCZWFuX19Hcm91cF83X18yX19JbXBsIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUJlYW5fX0dyb3VwXzdfXzMgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NjQ1NToyOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VCZWFuX19Hcm91cF83X18yX19JbXBsIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUJlYW5fX0dyb3VwXzdfXzMKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjY3Mzk6MTogKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VCZWFuX19Hcm91cF83X18yX19JbXBsIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUJlYW5fX0dyb3VwXzdfXzMgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6Njc0MDoyOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VCZWFuX19Hcm91cF83X18yX19JbXBsIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUJlYW5fX0dyb3VwXzdfXzMKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzMyKTsKKyAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzMwKTsKICAgICAgICAgICAgIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUJlYW5fX0dyb3VwXzdfXzJfX0ltcGwoKTsKIAogICAgICAgICAgICAgc3RhdGUuX2ZzcC0tOwpAQCAtMjI3ODcsMzggKzIzOTQ1LDM4IEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fRGF0YUludGVyY2hhbmdlQmVhbl9fR3JvdXBfN19fMl9fSW1wbCIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo2NDYyOjE6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUJlYW5fX0dyb3VwXzdfXzJfX0ltcGwgOiAoICggcnVsZV9fRGF0YUludGVyY2hhbmdlQmVhbl9fTG9va3VwQXNzaWdubWVudF83XzIgKSogKSA7CisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6Njc0NzoxOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VCZWFuX19Hcm91cF83X18yX19JbXBsIDogKCAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUJlYW5fX0V4cHJlc3Npb25Bc3NpZ25tZW50XzdfMiApKiApIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19EYXRhSW50ZXJjaGFuZ2VCZWFuX19Hcm91cF83X18yX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjY0NjY6MTogKCAoICggcnVsZV9fRGF0YUludGVyY2hhbmdlQmVhbl9fTG9va3VwQXNzaWdubWVudF83XzIgKSogKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo2NDY3OjE6ICggKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VCZWFuX19Mb29rdXBBc3NpZ25tZW50XzdfMiApKiApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo2NzUxOjE6ICggKCAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUJlYW5fX0V4cHJlc3Npb25Bc3NpZ25tZW50XzdfMiApKiApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjY3NTI6MTogKCAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUJlYW5fX0V4cHJlc3Npb25Bc3NpZ25tZW50XzdfMiApKiApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo2NDY3OjE6ICggKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VCZWFuX19Mb29rdXBBc3NpZ25tZW50XzdfMiApKiApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo2NDY4OjI6ICggcnVsZV9fRGF0YUludGVyY2hhbmdlQmVhbl9fTG9va3VwQXNzaWdubWVudF83XzIgKSoKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjY3NTI6MTogKCAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUJlYW5fX0V4cHJlc3Npb25Bc3NpZ25tZW50XzdfMiApKiApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo2NzUzOjI6ICggcnVsZV9fRGF0YUludGVyY2hhbmdlQmVhbl9fRXhwcmVzc2lvbkFzc2lnbm1lbnRfN18yICkqCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKLSAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldERhdGFJbnRlcmNoYW5nZUJlYW5BY2Nlc3MoKS5nZXRMb29rdXBBc3NpZ25tZW50XzdfMigpKTsgCisgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXREYXRhSW50ZXJjaGFuZ2VCZWFuQWNjZXNzKCkuZ2V0RXhwcmVzc2lvbkFzc2lnbm1lbnRfN18yKCkpOyAKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjY0Njk6MjogKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VCZWFuX19Mb29rdXBBc3NpZ25tZW50XzdfMiApKgotICAgICAgICAgICAgbG9vcDcyOgorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6Njc1NDoyOiAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUJlYW5fX0V4cHJlc3Npb25Bc3NpZ25tZW50XzdfMiApKgorICAgICAgICAgICAgbG9vcDc4OgogICAgICAgICAgICAgZG8gewotICAgICAgICAgICAgICAgIGludCBhbHQ3Mj0yOwotICAgICAgICAgICAgICAgIGludCBMQTcyXzAgPSBpbnB1dC5MQSgxKTsKKyAgICAgICAgICAgICAgICBpbnQgYWx0Nzg9MjsKKyAgICAgICAgICAgICAgICBpbnQgTEE3OF8wID0gaW5wdXQuTEEoMSk7CiAKLSAgICAgICAgICAgICAgICBpZiAoIChMQTcyXzA9PTk1KSApIHsKLSAgICAgICAgICAgICAgICAgICAgYWx0NzI9MTsKKyAgICAgICAgICAgICAgICBpZiAoIChMQTc4XzA9PTEwOXx8TEE3OF8wPT0xMTUpICkgeworICAgICAgICAgICAgICAgICAgICBhbHQ3OD0xOwogICAgICAgICAgICAgICAgIH0KIAogCi0gICAgICAgICAgICAgICAgc3dpdGNoIChhbHQ3MikgeworICAgICAgICAgICAgICAgIHN3aXRjaCAoYWx0NzgpIHsKICAgICAgICAgICAgIAljYXNlIDEgOgotICAgICAgICAgICAgCSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo2NDY5OjM6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUJlYW5fX0xvb2t1cEFzc2lnbm1lbnRfN18yCisgICAgICAgICAgICAJICAgIC8vIEludGVybmFsRGF0YURTTC5nOjY3NTQ6MzogcnVsZV9fRGF0YUludGVyY2hhbmdlQmVhbl9fRXhwcmVzc2lvbkFzc2lnbm1lbnRfN18yCiAgICAgICAgICAgICAJICAgIHsKLSAgICAgICAgICAgIAkgICAgcHVzaEZvbGxvdyhGT0xMT1dfMzMpOwotICAgICAgICAgICAgCSAgICBydWxlX19EYXRhSW50ZXJjaGFuZ2VCZWFuX19Mb29rdXBBc3NpZ25tZW50XzdfMigpOworICAgICAgICAgICAgCSAgICBwdXNoRm9sbG93KEZPTExPV18zMSk7CisgICAgICAgICAgICAJICAgIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUJlYW5fX0V4cHJlc3Npb25Bc3NpZ25tZW50XzdfMigpOwogCiAgICAgICAgICAgICAJICAgIHN0YXRlLl9mc3AtLTsKICAgICAgICAgICAgIAkgICAgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKQEAgLTIyODI3LDEyICsyMzk4NSwxMiBAQAogICAgICAgICAgICAgCSAgICBicmVhazsKIAogICAgICAgICAgICAgCWRlZmF1bHQgOgotICAgICAgICAgICAgCSAgICBicmVhayBsb29wNzI7CisgICAgICAgICAgICAJICAgIGJyZWFrIGxvb3A3ODsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9IHdoaWxlICh0cnVlKTsKIAogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7Ci0gICAgICAgICAgICAgICBhZnRlcihncmFtbWFyQWNjZXNzLmdldERhdGFJbnRlcmNoYW5nZUJlYW5BY2Nlc3MoKS5nZXRMb29rdXBBc3NpZ25tZW50XzdfMigpKTsgCisgICAgICAgICAgICAgICBhZnRlcihncmFtbWFyQWNjZXNzLmdldERhdGFJbnRlcmNoYW5nZUJlYW5BY2Nlc3MoKS5nZXRFeHByZXNzaW9uQXNzaWdubWVudF83XzIoKSk7IAogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICB9CkBAIC0yMjg1NiwxNCArMjQwMTQsMTQgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19EYXRhSW50ZXJjaGFuZ2VCZWFuX19Hcm91cF83X18zIgotICAgIC8vIEludGVybmFsRGF0YURTTC5nOjY0Nzc6MTogcnVsZV9fRGF0YUludGVyY2hhbmdlQmVhbl9fR3JvdXBfN19fMyA6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUJlYW5fX0dyb3VwXzdfXzNfX0ltcGwgOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjY3NjI6MTogcnVsZV9fRGF0YUludGVyY2hhbmdlQmVhbl9fR3JvdXBfN19fMyA6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUJlYW5fX0dyb3VwXzdfXzNfX0ltcGwgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUJlYW5fX0dyb3VwXzdfXzMoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NjQ4MToxOiAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUJlYW5fX0dyb3VwXzdfXzNfX0ltcGwgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NjQ4MjoyOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VCZWFuX19Hcm91cF83X18zX19JbXBsCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo2NzY2OjE6ICggcnVsZV9fRGF0YUludGVyY2hhbmdlQmVhbl9fR3JvdXBfN19fM19fSW1wbCApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo2NzY3OjI6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUJlYW5fX0dyb3VwXzdfXzNfX0ltcGwKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzIpOwogICAgICAgICAgICAgcnVsZV9fRGF0YUludGVyY2hhbmdlQmVhbl9fR3JvdXBfN19fM19fSW1wbCgpOwpAQCAtMjI4ODksMjIgKzI0MDQ3LDIyIEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fRGF0YUludGVyY2hhbmdlQmVhbl9fR3JvdXBfN19fM19fSW1wbCIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo2NDg4OjE6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUJlYW5fX0dyb3VwXzdfXzNfX0ltcGwgOiAoICd9JyApIDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo2NzczOjE6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUJlYW5fX0dyb3VwXzdfXzNfX0ltcGwgOiAoICd9JyApIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19EYXRhSW50ZXJjaGFuZ2VCZWFuX19Hcm91cF83X18zX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjY0OTI6MTogKCAoICd9JyApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjY0OTM6MTogKCAnfScgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6Njc3NzoxOiAoICggJ30nICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6Njc3ODoxOiAoICd9JyApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo2NDkzOjE6ICggJ30nICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjY0OTQ6MjogJ30nCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo2Nzc4OjE6ICggJ30nICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjY3Nzk6MjogJ30nCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldERhdGFJbnRlcmNoYW5nZUJlYW5BY2Nlc3MoKS5nZXRSaWdodEN1cmx5QnJhY2tldEtleXdvcmRfN18zKCkpOyAKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1hdGNoKGlucHV0LDcxLEZPTExPV18yKTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKKyAgICAgICAgICAgIG1hdGNoKGlucHV0LDc2LEZPTExPV18yKTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXREYXRhSW50ZXJjaGFuZ2VCZWFuQWNjZXNzKCkuZ2V0UmlnaHRDdXJseUJyYWNrZXRLZXl3b3JkXzdfMygpKTsgCiAgICAgICAgICAgICB9CkBAIC0yMjkzMCwxNCArMjQwODgsMTQgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19EYXRhSW50ZXJjaGFuZ2VCZWFuX19Hcm91cF84X18wIgotICAgIC8vIEludGVybmFsRGF0YURTTC5nOjY1MDQ6MTogcnVsZV9fRGF0YUludGVyY2hhbmdlQmVhbl9fR3JvdXBfOF9fMCA6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUJlYW5fX0dyb3VwXzhfXzBfX0ltcGwgcnVsZV9fRGF0YUludGVyY2hhbmdlQmVhbl9fR3JvdXBfOF9fMSA7CisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6Njc4OToxOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VCZWFuX19Hcm91cF84X18wIDogcnVsZV9fRGF0YUludGVyY2hhbmdlQmVhbl9fR3JvdXBfOF9fMF9fSW1wbCBydWxlX19EYXRhSW50ZXJjaGFuZ2VCZWFuX19Hcm91cF84X18xIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19EYXRhSW50ZXJjaGFuZ2VCZWFuX19Hcm91cF84X18wKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjY1MDg6MTogKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VCZWFuX19Hcm91cF84X18wX19JbXBsIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUJlYW5fX0dyb3VwXzhfXzEgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NjUwOToyOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VCZWFuX19Hcm91cF84X18wX19JbXBsIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUJlYW5fX0dyb3VwXzhfXzEKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjY3OTM6MTogKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VCZWFuX19Hcm91cF84X18wX19JbXBsIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUJlYW5fX0dyb3VwXzhfXzEgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6Njc5NDoyOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VCZWFuX19Hcm91cF84X18wX19JbXBsIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUJlYW5fX0dyb3VwXzhfXzEKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzEwKTsKICAgICAgICAgICAgIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUJlYW5fX0dyb3VwXzhfXzBfX0ltcGwoKTsKQEAgLTIyOTY4LDI0ICsyNDEyNiwyNCBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX0RhdGFJbnRlcmNoYW5nZUJlYW5fX0dyb3VwXzhfXzBfX0ltcGwiCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NjUxNjoxOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VCZWFuX19Hcm91cF84X18wX19JbXBsIDogKCAnZm9ybWF0JyApIDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo2ODAxOjE6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUJlYW5fX0dyb3VwXzhfXzBfX0ltcGwgOiAoICdsb29rdXAnICkgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUJlYW5fX0dyb3VwXzhfXzBfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NjUyMDoxOiAoICggJ2Zvcm1hdCcgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo2NTIxOjE6ICggJ2Zvcm1hdCcgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NjgwNToxOiAoICggJ2xvb2t1cCcgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo2ODA2OjE6ICggJ2xvb2t1cCcgKQogICAgICAgICAgICAgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NjUyMToxOiAoICdmb3JtYXQnICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjY1MjI6MjogJ2Zvcm1hdCcKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjY4MDY6MTogKCAnbG9va3VwJyApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo2ODA3OjI6ICdsb29rdXAnCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKLSAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldERhdGFJbnRlcmNoYW5nZUJlYW5BY2Nlc3MoKS5nZXRGb3JtYXRLZXl3b3JkXzhfMCgpKTsgCisgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXREYXRhSW50ZXJjaGFuZ2VCZWFuQWNjZXNzKCkuZ2V0TG9va3VwS2V5d29yZF84XzAoKSk7IAogICAgICAgICAgICAgfQotICAgICAgICAgICAgbWF0Y2goaW5wdXQsOTEsRk9MTE9XXzIpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOworICAgICAgICAgICAgbWF0Y2goaW5wdXQsOTUsRk9MTE9XXzIpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOwogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7Ci0gICAgICAgICAgICAgICBhZnRlcihncmFtbWFyQWNjZXNzLmdldERhdGFJbnRlcmNoYW5nZUJlYW5BY2Nlc3MoKS5nZXRGb3JtYXRLZXl3b3JkXzhfMCgpKTsgCisgICAgICAgICAgICAgICBhZnRlcihncmFtbWFyQWNjZXNzLmdldERhdGFJbnRlcmNoYW5nZUJlYW5BY2Nlc3MoKS5nZXRMb29rdXBLZXl3b3JkXzhfMCgpKTsgCiAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIH0KQEAgLTIzMDA5LDE0ICsyNDE2NywxNCBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX0RhdGFJbnRlcmNoYW5nZUJlYW5fX0dyb3VwXzhfXzEiCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NjUzMToxOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VCZWFuX19Hcm91cF84X18xIDogcnVsZV9fRGF0YUludGVyY2hhbmdlQmVhbl9fR3JvdXBfOF9fMV9fSW1wbCBydWxlX19EYXRhSW50ZXJjaGFuZ2VCZWFuX19Hcm91cF84X18yIDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo2ODE2OjE6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUJlYW5fX0dyb3VwXzhfXzEgOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VCZWFuX19Hcm91cF84X18xX19JbXBsIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUJlYW5fX0dyb3VwXzhfXzIgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUJlYW5fX0dyb3VwXzhfXzEoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NjUzNToxOiAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUJlYW5fX0dyb3VwXzhfXzFfX0ltcGwgcnVsZV9fRGF0YUludGVyY2hhbmdlQmVhbl9fR3JvdXBfOF9fMiApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo2NTM2OjI6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUJlYW5fX0dyb3VwXzhfXzFfX0ltcGwgcnVsZV9fRGF0YUludGVyY2hhbmdlQmVhbl9fR3JvdXBfOF9fMgorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NjgyMDoxOiAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUJlYW5fX0dyb3VwXzhfXzFfX0ltcGwgcnVsZV9fRGF0YUludGVyY2hhbmdlQmVhbl9fR3JvdXBfOF9fMiApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo2ODIxOjI6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUJlYW5fX0dyb3VwXzhfXzFfX0ltcGwgcnVsZV9fRGF0YUludGVyY2hhbmdlQmVhbl9fR3JvdXBfOF9fMgogICAgICAgICAgICAgewogICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMzIpOwogICAgICAgICAgICAgcnVsZV9fRGF0YUludGVyY2hhbmdlQmVhbl9fR3JvdXBfOF9fMV9fSW1wbCgpOwpAQCAtMjMwNDcsMjIgKzI0MjA1LDIyIEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fRGF0YUludGVyY2hhbmdlQmVhbl9fR3JvdXBfOF9fMV9fSW1wbCIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo2NTQzOjE6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUJlYW5fX0dyb3VwXzhfXzFfX0ltcGwgOiAoICd7JyApIDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo2ODI4OjE6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUJlYW5fX0dyb3VwXzhfXzFfX0ltcGwgOiAoICd7JyApIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19EYXRhSW50ZXJjaGFuZ2VCZWFuX19Hcm91cF84X18xX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjY1NDc6MTogKCAoICd7JyApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjY1NDg6MTogKCAneycgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NjgzMjoxOiAoICggJ3snICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NjgzMzoxOiAoICd7JyApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo2NTQ4OjE6ICggJ3snICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjY1NDk6MjogJ3snCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo2ODMzOjE6ICggJ3snICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjY4MzQ6MjogJ3snCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldERhdGFJbnRlcmNoYW5nZUJlYW5BY2Nlc3MoKS5nZXRMZWZ0Q3VybHlCcmFja2V0S2V5d29yZF84XzEoKSk7IAogICAgICAgICAgICAgfQotICAgICAgICAgICAgbWF0Y2goaW5wdXQsNzAsRk9MTE9XXzIpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOworICAgICAgICAgICAgbWF0Y2goaW5wdXQsNzUsRk9MTE9XXzIpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOwogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBhZnRlcihncmFtbWFyQWNjZXNzLmdldERhdGFJbnRlcmNoYW5nZUJlYW5BY2Nlc3MoKS5nZXRMZWZ0Q3VybHlCcmFja2V0S2V5d29yZF84XzEoKSk7IAogICAgICAgICAgICAgfQpAQCAtMjMwODgsMTQgKzI0MjQ2LDE0IEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fRGF0YUludGVyY2hhbmdlQmVhbl9fR3JvdXBfOF9fMiIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo2NTU4OjE6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUJlYW5fX0dyb3VwXzhfXzIgOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VCZWFuX19Hcm91cF84X18yX19JbXBsIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUJlYW5fX0dyb3VwXzhfXzMgOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjY4NDM6MTogcnVsZV9fRGF0YUludGVyY2hhbmdlQmVhbl9fR3JvdXBfOF9fMiA6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUJlYW5fX0dyb3VwXzhfXzJfX0ltcGwgcnVsZV9fRGF0YUludGVyY2hhbmdlQmVhbl9fR3JvdXBfOF9fMyA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fRGF0YUludGVyY2hhbmdlQmVhbl9fR3JvdXBfOF9fMigpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo2NTYyOjE6ICggcnVsZV9fRGF0YUludGVyY2hhbmdlQmVhbl9fR3JvdXBfOF9fMl9fSW1wbCBydWxlX19EYXRhSW50ZXJjaGFuZ2VCZWFuX19Hcm91cF84X18zICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjY1NjM6MjogcnVsZV9fRGF0YUludGVyY2hhbmdlQmVhbl9fR3JvdXBfOF9fMl9fSW1wbCBydWxlX19EYXRhSW50ZXJjaGFuZ2VCZWFuX19Hcm91cF84X18zCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo2ODQ3OjE6ICggcnVsZV9fRGF0YUludGVyY2hhbmdlQmVhbl9fR3JvdXBfOF9fMl9fSW1wbCBydWxlX19EYXRhSW50ZXJjaGFuZ2VCZWFuX19Hcm91cF84X18zICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjY4NDg6MjogcnVsZV9fRGF0YUludGVyY2hhbmdlQmVhbl9fR3JvdXBfOF9fMl9fSW1wbCBydWxlX19EYXRhSW50ZXJjaGFuZ2VCZWFuX19Hcm91cF84X18zCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV18zMik7CiAgICAgICAgICAgICBydWxlX19EYXRhSW50ZXJjaGFuZ2VCZWFuX19Hcm91cF84X18yX19JbXBsKCk7CkBAIC0yMzEyNiwzOCArMjQyODQsMzggQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19EYXRhSW50ZXJjaGFuZ2VCZWFuX19Hcm91cF84X18yX19JbXBsIgotICAgIC8vIEludGVybmFsRGF0YURTTC5nOjY1NzA6MTogcnVsZV9fRGF0YUludGVyY2hhbmdlQmVhbl9fR3JvdXBfOF9fMl9fSW1wbCA6ICggKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VCZWFuX19Gb3JtYXRBc3NpZ25tZW50XzhfMiApKiApIDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo2ODU1OjE6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUJlYW5fX0dyb3VwXzhfXzJfX0ltcGwgOiAoICggcnVsZV9fRGF0YUludGVyY2hhbmdlQmVhbl9fTG9va3VwQXNzaWdubWVudF84XzIgKSogKSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fRGF0YUludGVyY2hhbmdlQmVhbl9fR3JvdXBfOF9fMl9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo2NTc0OjE6ICggKCAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUJlYW5fX0Zvcm1hdEFzc2lnbm1lbnRfOF8yICkqICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NjU3NToxOiAoICggcnVsZV9fRGF0YUludGVyY2hhbmdlQmVhbl9fRm9ybWF0QXNzaWdubWVudF84XzIgKSogKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6Njg1OToxOiAoICggKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VCZWFuX19Mb29rdXBBc3NpZ25tZW50XzhfMiApKiApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjY4NjA6MTogKCAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUJlYW5fX0xvb2t1cEFzc2lnbm1lbnRfOF8yICkqICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjY1NzU6MTogKCAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUJlYW5fX0Zvcm1hdEFzc2lnbm1lbnRfOF8yICkqICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjY1NzY6MjogKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VCZWFuX19Gb3JtYXRBc3NpZ25tZW50XzhfMiApKgorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6Njg2MDoxOiAoICggcnVsZV9fRGF0YUludGVyY2hhbmdlQmVhbl9fTG9va3VwQXNzaWdubWVudF84XzIgKSogKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6Njg2MToyOiAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUJlYW5fX0xvb2t1cEFzc2lnbm1lbnRfOF8yICkqCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKLSAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldERhdGFJbnRlcmNoYW5nZUJlYW5BY2Nlc3MoKS5nZXRGb3JtYXRBc3NpZ25tZW50XzhfMigpKTsgCisgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXREYXRhSW50ZXJjaGFuZ2VCZWFuQWNjZXNzKCkuZ2V0TG9va3VwQXNzaWdubWVudF84XzIoKSk7IAogICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NjU3NzoyOiAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUJlYW5fX0Zvcm1hdEFzc2lnbm1lbnRfOF8yICkqCi0gICAgICAgICAgICBsb29wNzM6CisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo2ODYyOjI6ICggcnVsZV9fRGF0YUludGVyY2hhbmdlQmVhbl9fTG9va3VwQXNzaWdubWVudF84XzIgKSoKKyAgICAgICAgICAgIGxvb3A3OToKICAgICAgICAgICAgIGRvIHsKLSAgICAgICAgICAgICAgICBpbnQgYWx0NzM9MjsKLSAgICAgICAgICAgICAgICBpbnQgTEE3M18wID0gaW5wdXQuTEEoMSk7CisgICAgICAgICAgICAgICAgaW50IGFsdDc5PTI7CisgICAgICAgICAgICAgICAgaW50IExBNzlfMCA9IGlucHV0LkxBKDEpOwogCi0gICAgICAgICAgICAgICAgaWYgKCAoTEE3M18wPT05NSkgKSB7Ci0gICAgICAgICAgICAgICAgICAgIGFsdDczPTE7CisgICAgICAgICAgICAgICAgaWYgKCAoTEE3OV8wPT0xMDIpICkgeworICAgICAgICAgICAgICAgICAgICBhbHQ3OT0xOwogICAgICAgICAgICAgICAgIH0KIAogCi0gICAgICAgICAgICAgICAgc3dpdGNoIChhbHQ3MykgeworICAgICAgICAgICAgICAgIHN3aXRjaCAoYWx0NzkpIHsKICAgICAgICAgICAgIAljYXNlIDEgOgotICAgICAgICAgICAgCSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo2NTc3OjM6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUJlYW5fX0Zvcm1hdEFzc2lnbm1lbnRfOF8yCisgICAgICAgICAgICAJICAgIC8vIEludGVybmFsRGF0YURTTC5nOjY4NjI6MzogcnVsZV9fRGF0YUludGVyY2hhbmdlQmVhbl9fTG9va3VwQXNzaWdubWVudF84XzIKICAgICAgICAgICAgIAkgICAgewogICAgICAgICAgICAgCSAgICBwdXNoRm9sbG93KEZPTExPV18zMyk7Ci0gICAgICAgICAgICAJICAgIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUJlYW5fX0Zvcm1hdEFzc2lnbm1lbnRfOF8yKCk7CisgICAgICAgICAgICAJICAgIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUJlYW5fX0xvb2t1cEFzc2lnbm1lbnRfOF8yKCk7CiAKICAgICAgICAgICAgIAkgICAgc3RhdGUuX2ZzcC0tOwogICAgICAgICAgICAgCSAgICBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOwpAQCAtMjMxNjYsMTIgKzI0MzI0LDEyIEBACiAgICAgICAgICAgICAJICAgIGJyZWFrOwogCiAgICAgICAgICAgICAJZGVmYXVsdCA6Ci0gICAgICAgICAgICAJICAgIGJyZWFrIGxvb3A3MzsKKyAgICAgICAgICAgIAkgICAgYnJlYWsgbG9vcDc5OwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0gd2hpbGUgKHRydWUpOwogCiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKLSAgICAgICAgICAgICAgIGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YUludGVyY2hhbmdlQmVhbkFjY2VzcygpLmdldEZvcm1hdEFzc2lnbm1lbnRfOF8yKCkpOyAKKyAgICAgICAgICAgICAgIGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YUludGVyY2hhbmdlQmVhbkFjY2VzcygpLmdldExvb2t1cEFzc2lnbm1lbnRfOF8yKCkpOyAKICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgfQpAQCAtMjMxOTUsMTQgKzI0MzUzLDE0IEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fRGF0YUludGVyY2hhbmdlQmVhbl9fR3JvdXBfOF9fMyIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo2NTg1OjE6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUJlYW5fX0dyb3VwXzhfXzMgOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VCZWFuX19Hcm91cF84X18zX19JbXBsIDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo2ODcwOjE6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUJlYW5fX0dyb3VwXzhfXzMgOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VCZWFuX19Hcm91cF84X18zX19JbXBsIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19EYXRhSW50ZXJjaGFuZ2VCZWFuX19Hcm91cF84X18zKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjY1ODk6MTogKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VCZWFuX19Hcm91cF84X18zX19JbXBsICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjY1OTA6MjogcnVsZV9fRGF0YUludGVyY2hhbmdlQmVhbl9fR3JvdXBfOF9fM19fSW1wbAorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6Njg3NDoxOiAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUJlYW5fX0dyb3VwXzhfXzNfX0ltcGwgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6Njg3NToyOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VCZWFuX19Hcm91cF84X18zX19JbXBsCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV18yKTsKICAgICAgICAgICAgIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUJlYW5fX0dyb3VwXzhfXzNfX0ltcGwoKTsKQEAgLTIzMjI4LDIyICsyNDM4NiwyMiBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX0RhdGFJbnRlcmNoYW5nZUJlYW5fX0dyb3VwXzhfXzNfX0ltcGwiCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NjU5NjoxOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VCZWFuX19Hcm91cF84X18zX19JbXBsIDogKCAnfScgKSA7CisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6Njg4MToxOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VCZWFuX19Hcm91cF84X18zX19JbXBsIDogKCAnfScgKSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fRGF0YUludGVyY2hhbmdlQmVhbl9fR3JvdXBfOF9fM19fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo2NjAwOjE6ICggKCAnfScgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo2NjAxOjE6ICggJ30nICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjY4ODU6MTogKCAoICd9JyApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjY4ODY6MTogKCAnfScgKQogICAgICAgICAgICAgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NjYwMToxOiAoICd9JyApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo2NjAyOjI6ICd9JworICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6Njg4NjoxOiAoICd9JyApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo2ODg3OjI6ICd9JwogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXREYXRhSW50ZXJjaGFuZ2VCZWFuQWNjZXNzKCkuZ2V0UmlnaHRDdXJseUJyYWNrZXRLZXl3b3JkXzhfMygpKTsgCiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBtYXRjaChpbnB1dCw3MSxGT0xMT1dfMik7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CisgICAgICAgICAgICBtYXRjaChpbnB1dCw3NixGT0xMT1dfMik7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YUludGVyY2hhbmdlQmVhbkFjY2VzcygpLmdldFJpZ2h0Q3VybHlCcmFja2V0S2V5d29yZF84XzMoKSk7IAogICAgICAgICAgICAgfQpAQCAtMjMyNjksMTQgKzI0NDI3LDE0IEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fRGF0YUludGVyY2hhbmdlQmVhbl9fR3JvdXBfOV9fMCIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo2NjEyOjE6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUJlYW5fX0dyb3VwXzlfXzAgOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VCZWFuX19Hcm91cF85X18wX19JbXBsIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUJlYW5fX0dyb3VwXzlfXzEgOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjY4OTc6MTogcnVsZV9fRGF0YUludGVyY2hhbmdlQmVhbl9fR3JvdXBfOV9fMCA6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUJlYW5fX0dyb3VwXzlfXzBfX0ltcGwgcnVsZV9fRGF0YUludGVyY2hhbmdlQmVhbl9fR3JvdXBfOV9fMSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fRGF0YUludGVyY2hhbmdlQmVhbl9fR3JvdXBfOV9fMCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo2NjE2OjE6ICggcnVsZV9fRGF0YUludGVyY2hhbmdlQmVhbl9fR3JvdXBfOV9fMF9fSW1wbCBydWxlX19EYXRhSW50ZXJjaGFuZ2VCZWFuX19Hcm91cF85X18xICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjY2MTc6MjogcnVsZV9fRGF0YUludGVyY2hhbmdlQmVhbl9fR3JvdXBfOV9fMF9fSW1wbCBydWxlX19EYXRhSW50ZXJjaGFuZ2VCZWFuX19Hcm91cF85X18xCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo2OTAxOjE6ICggcnVsZV9fRGF0YUludGVyY2hhbmdlQmVhbl9fR3JvdXBfOV9fMF9fSW1wbCBydWxlX19EYXRhSW50ZXJjaGFuZ2VCZWFuX19Hcm91cF85X18xICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjY5MDI6MjogcnVsZV9fRGF0YUludGVyY2hhbmdlQmVhbl9fR3JvdXBfOV9fMF9fSW1wbCBydWxlX19EYXRhSW50ZXJjaGFuZ2VCZWFuX19Hcm91cF85X18xCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV18xMCk7CiAgICAgICAgICAgICBydWxlX19EYXRhSW50ZXJjaGFuZ2VCZWFuX19Hcm91cF85X18wX19JbXBsKCk7CkBAIC0yMzMwNywyNCArMjQ0NjUsMjQgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19EYXRhSW50ZXJjaGFuZ2VCZWFuX19Hcm91cF85X18wX19JbXBsIgotICAgIC8vIEludGVybmFsRGF0YURTTC5nOjY2MjQ6MTogcnVsZV9fRGF0YUludGVyY2hhbmdlQmVhbl9fR3JvdXBfOV9fMF9fSW1wbCA6ICggJ21hcHBpbmcnICkgOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjY5MDk6MTogcnVsZV9fRGF0YUludGVyY2hhbmdlQmVhbl9fR3JvdXBfOV9fMF9fSW1wbCA6ICggJ2Zvcm1hdCcgKSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fRGF0YUludGVyY2hhbmdlQmVhbl9fR3JvdXBfOV9fMF9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo2NjI4OjE6ICggKCAnbWFwcGluZycgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo2NjI5OjE6ICggJ21hcHBpbmcnICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjY5MTM6MTogKCAoICdmb3JtYXQnICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NjkxNDoxOiAoICdmb3JtYXQnICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjY2Mjk6MTogKCAnbWFwcGluZycgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NjYzMDoyOiAnbWFwcGluZycKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjY5MTQ6MTogKCAnZm9ybWF0JyApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo2OTE1OjI6ICdmb3JtYXQnCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKLSAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldERhdGFJbnRlcmNoYW5nZUJlYW5BY2Nlc3MoKS5nZXRNYXBwaW5nS2V5d29yZF85XzAoKSk7IAorICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YUludGVyY2hhbmdlQmVhbkFjY2VzcygpLmdldEZvcm1hdEtleXdvcmRfOV8wKCkpOyAKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1hdGNoKGlucHV0LDkyLEZPTExPV18yKTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKKyAgICAgICAgICAgIG1hdGNoKGlucHV0LDk2LEZPTExPV18yKTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewotICAgICAgICAgICAgICAgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXREYXRhSW50ZXJjaGFuZ2VCZWFuQWNjZXNzKCkuZ2V0TWFwcGluZ0tleXdvcmRfOV8wKCkpOyAKKyAgICAgICAgICAgICAgIGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YUludGVyY2hhbmdlQmVhbkFjY2VzcygpLmdldEZvcm1hdEtleXdvcmRfOV8wKCkpOyAKICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgfQpAQCAtMjMzNDgsMTYgKzI0NTA2LDE2IEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fRGF0YUludGVyY2hhbmdlQmVhbl9fR3JvdXBfOV9fMSIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo2NjM5OjE6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUJlYW5fX0dyb3VwXzlfXzEgOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VCZWFuX19Hcm91cF85X18xX19JbXBsIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUJlYW5fX0dyb3VwXzlfXzIgOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjY5MjQ6MTogcnVsZV9fRGF0YUludGVyY2hhbmdlQmVhbl9fR3JvdXBfOV9fMSA6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUJlYW5fX0dyb3VwXzlfXzFfX0ltcGwgcnVsZV9fRGF0YUludGVyY2hhbmdlQmVhbl9fR3JvdXBfOV9fMiA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fRGF0YUludGVyY2hhbmdlQmVhbl9fR3JvdXBfOV9fMSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo2NjQzOjE6ICggcnVsZV9fRGF0YUludGVyY2hhbmdlQmVhbl9fR3JvdXBfOV9fMV9fSW1wbCBydWxlX19EYXRhSW50ZXJjaGFuZ2VCZWFuX19Hcm91cF85X18yICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjY2NDQ6MjogcnVsZV9fRGF0YUludGVyY2hhbmdlQmVhbl9fR3JvdXBfOV9fMV9fSW1wbCBydWxlX19EYXRhSW50ZXJjaGFuZ2VCZWFuX19Hcm91cF85X18yCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo2OTI4OjE6ICggcnVsZV9fRGF0YUludGVyY2hhbmdlQmVhbl9fR3JvdXBfOV9fMV9fSW1wbCBydWxlX19EYXRhSW50ZXJjaGFuZ2VCZWFuX19Hcm91cF85X18yICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjY5Mjk6MjogcnVsZV9fRGF0YUludGVyY2hhbmdlQmVhbl9fR3JvdXBfOV9fMV9fSW1wbCBydWxlX19EYXRhSW50ZXJjaGFuZ2VCZWFuX19Hcm91cF85X18yCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV18zNCk7CisgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV18zMik7CiAgICAgICAgICAgICBydWxlX19EYXRhSW50ZXJjaGFuZ2VCZWFuX19Hcm91cF85X18xX19JbXBsKCk7CiAKICAgICAgICAgICAgIHN0YXRlLl9mc3AtLTsKQEAgLTIzMzg2LDIyICsyNDU0NCwyMiBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX0RhdGFJbnRlcmNoYW5nZUJlYW5fX0dyb3VwXzlfXzFfX0ltcGwiCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NjY1MToxOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VCZWFuX19Hcm91cF85X18xX19JbXBsIDogKCAneycgKSA7CisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NjkzNjoxOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VCZWFuX19Hcm91cF85X18xX19JbXBsIDogKCAneycgKSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fRGF0YUludGVyY2hhbmdlQmVhbl9fR3JvdXBfOV9fMV9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo2NjU1OjE6ICggKCAneycgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo2NjU2OjE6ICggJ3snICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjY5NDA6MTogKCAoICd7JyApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjY5NDE6MTogKCAneycgKQogICAgICAgICAgICAgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NjY1NjoxOiAoICd7JyApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo2NjU3OjI6ICd7JworICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6Njk0MToxOiAoICd7JyApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo2OTQyOjI6ICd7JwogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXREYXRhSW50ZXJjaGFuZ2VCZWFuQWNjZXNzKCkuZ2V0TGVmdEN1cmx5QnJhY2tldEtleXdvcmRfOV8xKCkpOyAKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1hdGNoKGlucHV0LDcwLEZPTExPV18yKTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKKyAgICAgICAgICAgIG1hdGNoKGlucHV0LDc1LEZPTExPV18yKTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXREYXRhSW50ZXJjaGFuZ2VCZWFuQWNjZXNzKCkuZ2V0TGVmdEN1cmx5QnJhY2tldEtleXdvcmRfOV8xKCkpOyAKICAgICAgICAgICAgIH0KQEAgLTIzNDI3LDE2ICsyNDU4NSwxNiBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX0RhdGFJbnRlcmNoYW5nZUJlYW5fX0dyb3VwXzlfXzIiCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NjY2NjoxOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VCZWFuX19Hcm91cF85X18yIDogcnVsZV9fRGF0YUludGVyY2hhbmdlQmVhbl9fR3JvdXBfOV9fMl9fSW1wbCBydWxlX19EYXRhSW50ZXJjaGFuZ2VCZWFuX19Hcm91cF85X18zIDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo2OTUxOjE6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUJlYW5fX0dyb3VwXzlfXzIgOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VCZWFuX19Hcm91cF85X18yX19JbXBsIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUJlYW5fX0dyb3VwXzlfXzMgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUJlYW5fX0dyb3VwXzlfXzIoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NjY3MDoxOiAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUJlYW5fX0dyb3VwXzlfXzJfX0ltcGwgcnVsZV9fRGF0YUludGVyY2hhbmdlQmVhbl9fR3JvdXBfOV9fMyApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo2NjcxOjI6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUJlYW5fX0dyb3VwXzlfXzJfX0ltcGwgcnVsZV9fRGF0YUludGVyY2hhbmdlQmVhbl9fR3JvdXBfOV9fMworICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6Njk1NToxOiAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUJlYW5fX0dyb3VwXzlfXzJfX0ltcGwgcnVsZV9fRGF0YUludGVyY2hhbmdlQmVhbl9fR3JvdXBfOV9fMyApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo2OTU2OjI6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUJlYW5fX0dyb3VwXzlfXzJfX0ltcGwgcnVsZV9fRGF0YUludGVyY2hhbmdlQmVhbl9fR3JvdXBfOV9fMwogICAgICAgICAgICAgewotICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMzQpOworICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMzIpOwogICAgICAgICAgICAgcnVsZV9fRGF0YUludGVyY2hhbmdlQmVhbl9fR3JvdXBfOV9fMl9fSW1wbCgpOwogCiAgICAgICAgICAgICBzdGF0ZS5fZnNwLS07CkBAIC0yMzQ2NSwzOCArMjQ2MjMsMzggQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19EYXRhSW50ZXJjaGFuZ2VCZWFuX19Hcm91cF85X18yX19JbXBsIgotICAgIC8vIEludGVybmFsRGF0YURTTC5nOjY2Nzg6MTogcnVsZV9fRGF0YUludGVyY2hhbmdlQmVhbl9fR3JvdXBfOV9fMl9fSW1wbCA6ICggKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VCZWFuX19NYXBwaW5nc0Fzc2lnbm1lbnRfOV8yICkqICkgOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjY5NjM6MTogcnVsZV9fRGF0YUludGVyY2hhbmdlQmVhbl9fR3JvdXBfOV9fMl9fSW1wbCA6ICggKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VCZWFuX19Gb3JtYXRBc3NpZ25tZW50XzlfMiApKiApIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19EYXRhSW50ZXJjaGFuZ2VCZWFuX19Hcm91cF85X18yX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjY2ODI6MTogKCAoICggcnVsZV9fRGF0YUludGVyY2hhbmdlQmVhbl9fTWFwcGluZ3NBc3NpZ25tZW50XzlfMiApKiApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjY2ODM6MTogKCAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUJlYW5fX01hcHBpbmdzQXNzaWdubWVudF85XzIgKSogKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6Njk2NzoxOiAoICggKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VCZWFuX19Gb3JtYXRBc3NpZ25tZW50XzlfMiApKiApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjY5Njg6MTogKCAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUJlYW5fX0Zvcm1hdEFzc2lnbm1lbnRfOV8yICkqICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjY2ODM6MTogKCAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUJlYW5fX01hcHBpbmdzQXNzaWdubWVudF85XzIgKSogKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NjY4NDoyOiAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUJlYW5fX01hcHBpbmdzQXNzaWdubWVudF85XzIgKSoKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjY5Njg6MTogKCAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUJlYW5fX0Zvcm1hdEFzc2lnbm1lbnRfOV8yICkqICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjY5Njk6MjogKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VCZWFuX19Gb3JtYXRBc3NpZ25tZW50XzlfMiApKgogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7Ci0gICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXREYXRhSW50ZXJjaGFuZ2VCZWFuQWNjZXNzKCkuZ2V0TWFwcGluZ3NBc3NpZ25tZW50XzlfMigpKTsgCisgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXREYXRhSW50ZXJjaGFuZ2VCZWFuQWNjZXNzKCkuZ2V0Rm9ybWF0QXNzaWdubWVudF85XzIoKSk7IAogICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NjY4NToyOiAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUJlYW5fX01hcHBpbmdzQXNzaWdubWVudF85XzIgKSoKLSAgICAgICAgICAgIGxvb3A3NDoKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjY5NzA6MjogKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VCZWFuX19Gb3JtYXRBc3NpZ25tZW50XzlfMiApKgorICAgICAgICAgICAgbG9vcDgwOgogICAgICAgICAgICAgZG8gewotICAgICAgICAgICAgICAgIGludCBhbHQ3ND0yOwotICAgICAgICAgICAgICAgIGludCBMQTc0XzAgPSBpbnB1dC5MQSgxKTsKKyAgICAgICAgICAgICAgICBpbnQgYWx0ODA9MjsKKyAgICAgICAgICAgICAgICBpbnQgTEE4MF8wID0gaW5wdXQuTEEoMSk7CiAKLSAgICAgICAgICAgICAgICBpZiAoIChMQTc0XzA9PTEwN3x8TEE3NF8wPT0xMDkpICkgewotICAgICAgICAgICAgICAgICAgICBhbHQ3ND0xOworICAgICAgICAgICAgICAgIGlmICggKExBODBfMD09MTAyKSApIHsKKyAgICAgICAgICAgICAgICAgICAgYWx0ODA9MTsKICAgICAgICAgICAgICAgICB9CiAKIAotICAgICAgICAgICAgICAgIHN3aXRjaCAoYWx0NzQpIHsKKyAgICAgICAgICAgICAgICBzd2l0Y2ggKGFsdDgwKSB7CiAgICAgICAgICAgICAJY2FzZSAxIDoKLSAgICAgICAgICAgIAkgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NjY4NTozOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VCZWFuX19NYXBwaW5nc0Fzc2lnbm1lbnRfOV8yCisgICAgICAgICAgICAJICAgIC8vIEludGVybmFsRGF0YURTTC5nOjY5NzA6MzogcnVsZV9fRGF0YUludGVyY2hhbmdlQmVhbl9fRm9ybWF0QXNzaWdubWVudF85XzIKICAgICAgICAgICAgIAkgICAgewotICAgICAgICAgICAgCSAgICBwdXNoRm9sbG93KEZPTExPV18zNSk7Ci0gICAgICAgICAgICAJICAgIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUJlYW5fX01hcHBpbmdzQXNzaWdubWVudF85XzIoKTsKKyAgICAgICAgICAgIAkgICAgcHVzaEZvbGxvdyhGT0xMT1dfMzMpOworICAgICAgICAgICAgCSAgICBydWxlX19EYXRhSW50ZXJjaGFuZ2VCZWFuX19Gb3JtYXRBc3NpZ25tZW50XzlfMigpOwogCiAgICAgICAgICAgICAJICAgIHN0YXRlLl9mc3AtLTsKICAgICAgICAgICAgIAkgICAgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKQEAgLTIzNTA1LDEyICsyNDY2MywxMiBAQAogICAgICAgICAgICAgCSAgICBicmVhazsKIAogICAgICAgICAgICAgCWRlZmF1bHQgOgotICAgICAgICAgICAgCSAgICBicmVhayBsb29wNzQ7CisgICAgICAgICAgICAJICAgIGJyZWFrIGxvb3A4MDsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9IHdoaWxlICh0cnVlKTsKIAogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7Ci0gICAgICAgICAgICAgICBhZnRlcihncmFtbWFyQWNjZXNzLmdldERhdGFJbnRlcmNoYW5nZUJlYW5BY2Nlc3MoKS5nZXRNYXBwaW5nc0Fzc2lnbm1lbnRfOV8yKCkpOyAKKyAgICAgICAgICAgICAgIGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YUludGVyY2hhbmdlQmVhbkFjY2VzcygpLmdldEZvcm1hdEFzc2lnbm1lbnRfOV8yKCkpOyAKICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgfQpAQCAtMjM1MzQsMTQgKzI0NjkyLDE0IEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fRGF0YUludGVyY2hhbmdlQmVhbl9fR3JvdXBfOV9fMyIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo2NjkzOjE6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUJlYW5fX0dyb3VwXzlfXzMgOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VCZWFuX19Hcm91cF85X18zX19JbXBsIDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo2OTc4OjE6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUJlYW5fX0dyb3VwXzlfXzMgOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VCZWFuX19Hcm91cF85X18zX19JbXBsIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19EYXRhSW50ZXJjaGFuZ2VCZWFuX19Hcm91cF85X18zKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjY2OTc6MTogKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VCZWFuX19Hcm91cF85X18zX19JbXBsICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjY2OTg6MjogcnVsZV9fRGF0YUludGVyY2hhbmdlQmVhbl9fR3JvdXBfOV9fM19fSW1wbAorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6Njk4MjoxOiAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUJlYW5fX0dyb3VwXzlfXzNfX0ltcGwgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6Njk4MzoyOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VCZWFuX19Hcm91cF85X18zX19JbXBsCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV18yKTsKICAgICAgICAgICAgIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUJlYW5fX0dyb3VwXzlfXzNfX0ltcGwoKTsKQEAgLTIzNTY3LDIyICsyNDcyNSwyMiBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX0RhdGFJbnRlcmNoYW5nZUJlYW5fX0dyb3VwXzlfXzNfX0ltcGwiCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NjcwNDoxOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VCZWFuX19Hcm91cF85X18zX19JbXBsIDogKCAnfScgKSA7CisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6Njk4OToxOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VCZWFuX19Hcm91cF85X18zX19JbXBsIDogKCAnfScgKSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fRGF0YUludGVyY2hhbmdlQmVhbl9fR3JvdXBfOV9fM19fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo2NzA4OjE6ICggKCAnfScgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo2NzA5OjE6ICggJ30nICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjY5OTM6MTogKCAoICd9JyApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjY5OTQ6MTogKCAnfScgKQogICAgICAgICAgICAgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NjcwOToxOiAoICd9JyApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo2NzEwOjI6ICd9JworICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6Njk5NDoxOiAoICd9JyApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo2OTk1OjI6ICd9JwogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXREYXRhSW50ZXJjaGFuZ2VCZWFuQWNjZXNzKCkuZ2V0UmlnaHRDdXJseUJyYWNrZXRLZXl3b3JkXzlfMygpKTsgCiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBtYXRjaChpbnB1dCw3MSxGT0xMT1dfMik7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CisgICAgICAgICAgICBtYXRjaChpbnB1dCw3NixGT0xMT1dfMik7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YUludGVyY2hhbmdlQmVhbkFjY2VzcygpLmdldFJpZ2h0Q3VybHlCcmFja2V0S2V5d29yZF85XzMoKSk7IAogICAgICAgICAgICAgfQpAQCAtMjM2MDgsMTQgKzI0NzY2LDE0IEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fRGF0YUludGVyY2hhbmdlQmVhbl9fR3JvdXBfMTBfXzAiCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NjcyMDoxOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VCZWFuX19Hcm91cF8xMF9fMCA6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUJlYW5fX0dyb3VwXzEwX18wX19JbXBsIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUJlYW5fX0dyb3VwXzEwX18xIDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo3MDA1OjE6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUJlYW5fX0dyb3VwXzEwX18wIDogcnVsZV9fRGF0YUludGVyY2hhbmdlQmVhbl9fR3JvdXBfMTBfXzBfX0ltcGwgcnVsZV9fRGF0YUludGVyY2hhbmdlQmVhbl9fR3JvdXBfMTBfXzEgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUJlYW5fX0dyb3VwXzEwX18wKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjY3MjQ6MTogKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VCZWFuX19Hcm91cF8xMF9fMF9fSW1wbCBydWxlX19EYXRhSW50ZXJjaGFuZ2VCZWFuX19Hcm91cF8xMF9fMSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo2NzI1OjI6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUJlYW5fX0dyb3VwXzEwX18wX19JbXBsIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUJlYW5fX0dyb3VwXzEwX18xCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo3MDA5OjE6ICggcnVsZV9fRGF0YUludGVyY2hhbmdlQmVhbl9fR3JvdXBfMTBfXzBfX0ltcGwgcnVsZV9fRGF0YUludGVyY2hhbmdlQmVhbl9fR3JvdXBfMTBfXzEgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NzAxMDoyOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VCZWFuX19Hcm91cF8xMF9fMF9fSW1wbCBydWxlX19EYXRhSW50ZXJjaGFuZ2VCZWFuX19Hcm91cF8xMF9fMQogICAgICAgICAgICAgewogICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMTApOwogICAgICAgICAgICAgcnVsZV9fRGF0YUludGVyY2hhbmdlQmVhbl9fR3JvdXBfMTBfXzBfX0ltcGwoKTsKQEAgLTIzNjQ2LDI0ICsyNDgwNCwyNCBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX0RhdGFJbnRlcmNoYW5nZUJlYW5fX0dyb3VwXzEwX18wX19JbXBsIgotICAgIC8vIEludGVybmFsRGF0YURTTC5nOjY3MzI6MTogcnVsZV9fRGF0YUludGVyY2hhbmdlQmVhbl9fR3JvdXBfMTBfXzBfX0ltcGwgOiAoICdrZXlzJyApIDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo3MDE3OjE6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUJlYW5fX0dyb3VwXzEwX18wX19JbXBsIDogKCAnZXhwb3NlJyApIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19EYXRhSW50ZXJjaGFuZ2VCZWFuX19Hcm91cF8xMF9fMF9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo2NzM2OjE6ICggKCAna2V5cycgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo2NzM3OjE6ICggJ2tleXMnICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjcwMjE6MTogKCAoICdleHBvc2UnICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NzAyMjoxOiAoICdleHBvc2UnICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjY3Mzc6MTogKCAna2V5cycgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NjczODoyOiAna2V5cycKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjcwMjI6MTogKCAnZXhwb3NlJyApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo3MDIzOjI6ICdleHBvc2UnCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKLSAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldERhdGFJbnRlcmNoYW5nZUJlYW5BY2Nlc3MoKS5nZXRLZXlzS2V5d29yZF8xMF8wKCkpOyAKKyAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldERhdGFJbnRlcmNoYW5nZUJlYW5BY2Nlc3MoKS5nZXRFeHBvc2VLZXl3b3JkXzEwXzAoKSk7IAogICAgICAgICAgICAgfQotICAgICAgICAgICAgbWF0Y2goaW5wdXQsOTMsRk9MTE9XXzIpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOworICAgICAgICAgICAgbWF0Y2goaW5wdXQsOTcsRk9MTE9XXzIpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOwogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7Ci0gICAgICAgICAgICAgICBhZnRlcihncmFtbWFyQWNjZXNzLmdldERhdGFJbnRlcmNoYW5nZUJlYW5BY2Nlc3MoKS5nZXRLZXlzS2V5d29yZF8xMF8wKCkpOyAKKyAgICAgICAgICAgICAgIGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YUludGVyY2hhbmdlQmVhbkFjY2VzcygpLmdldEV4cG9zZUtleXdvcmRfMTBfMCgpKTsgCiAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIH0KQEAgLTIzNjg3LDE2ICsyNDg0NSwxNiBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX0RhdGFJbnRlcmNoYW5nZUJlYW5fX0dyb3VwXzEwX18xIgotICAgIC8vIEludGVybmFsRGF0YURTTC5nOjY3NDc6MTogcnVsZV9fRGF0YUludGVyY2hhbmdlQmVhbl9fR3JvdXBfMTBfXzEgOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VCZWFuX19Hcm91cF8xMF9fMV9fSW1wbCBydWxlX19EYXRhSW50ZXJjaGFuZ2VCZWFuX19Hcm91cF8xMF9fMiA7CisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NzAzMjoxOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VCZWFuX19Hcm91cF8xMF9fMSA6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUJlYW5fX0dyb3VwXzEwX18xX19JbXBsIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUJlYW5fX0dyb3VwXzEwX18yIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19EYXRhSW50ZXJjaGFuZ2VCZWFuX19Hcm91cF8xMF9fMSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo2NzUxOjE6ICggcnVsZV9fRGF0YUludGVyY2hhbmdlQmVhbl9fR3JvdXBfMTBfXzFfX0ltcGwgcnVsZV9fRGF0YUludGVyY2hhbmdlQmVhbl9fR3JvdXBfMTBfXzIgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6Njc1MjoyOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VCZWFuX19Hcm91cF8xMF9fMV9fSW1wbCBydWxlX19EYXRhSW50ZXJjaGFuZ2VCZWFuX19Hcm91cF8xMF9fMgorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NzAzNjoxOiAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUJlYW5fX0dyb3VwXzEwX18xX19JbXBsIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUJlYW5fX0dyb3VwXzEwX18yICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjcwMzc6MjogcnVsZV9fRGF0YUludGVyY2hhbmdlQmVhbl9fR3JvdXBfMTBfXzFfX0ltcGwgcnVsZV9fRGF0YUludGVyY2hhbmdlQmVhbl9fR3JvdXBfMTBfXzIKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzM2KTsKKyAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzM0KTsKICAgICAgICAgICAgIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUJlYW5fX0dyb3VwXzEwX18xX19JbXBsKCk7CiAKICAgICAgICAgICAgIHN0YXRlLl9mc3AtLTsKQEAgLTIzNzI1LDIyICsyNDg4MywyMiBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX0RhdGFJbnRlcmNoYW5nZUJlYW5fX0dyb3VwXzEwX18xX19JbXBsIgotICAgIC8vIEludGVybmFsRGF0YURTTC5nOjY3NTk6MTogcnVsZV9fRGF0YUludGVyY2hhbmdlQmVhbl9fR3JvdXBfMTBfXzFfX0ltcGwgOiAoICd7JyApIDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo3MDQ0OjE6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUJlYW5fX0dyb3VwXzEwX18xX19JbXBsIDogKCAneycgKSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fRGF0YUludGVyY2hhbmdlQmVhbl9fR3JvdXBfMTBfXzFfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6Njc2MzoxOiAoICggJ3snICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6Njc2NDoxOiAoICd7JyApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo3MDQ4OjE6ICggKCAneycgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo3MDQ5OjE6ICggJ3snICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjY3NjQ6MTogKCAneycgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6Njc2NToyOiAneycKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjcwNDk6MTogKCAneycgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NzA1MDoyOiAneycKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YUludGVyY2hhbmdlQmVhbkFjY2VzcygpLmdldExlZnRDdXJseUJyYWNrZXRLZXl3b3JkXzEwXzEoKSk7IAogICAgICAgICAgICAgfQotICAgICAgICAgICAgbWF0Y2goaW5wdXQsNzAsRk9MTE9XXzIpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOworICAgICAgICAgICAgbWF0Y2goaW5wdXQsNzUsRk9MTE9XXzIpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOwogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBhZnRlcihncmFtbWFyQWNjZXNzLmdldERhdGFJbnRlcmNoYW5nZUJlYW5BY2Nlc3MoKS5nZXRMZWZ0Q3VybHlCcmFja2V0S2V5d29yZF8xMF8xKCkpOyAKICAgICAgICAgICAgIH0KQEAgLTIzNzY2LDE2ICsyNDkyNCwxNiBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX0RhdGFJbnRlcmNoYW5nZUJlYW5fX0dyb3VwXzEwX18yIgotICAgIC8vIEludGVybmFsRGF0YURTTC5nOjY3NzQ6MTogcnVsZV9fRGF0YUludGVyY2hhbmdlQmVhbl9fR3JvdXBfMTBfXzIgOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VCZWFuX19Hcm91cF8xMF9fMl9fSW1wbCBydWxlX19EYXRhSW50ZXJjaGFuZ2VCZWFuX19Hcm91cF8xMF9fMyA7CisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NzA1OToxOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VCZWFuX19Hcm91cF8xMF9fMiA6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUJlYW5fX0dyb3VwXzEwX18yX19JbXBsIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUJlYW5fX0dyb3VwXzEwX18zIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19EYXRhSW50ZXJjaGFuZ2VCZWFuX19Hcm91cF8xMF9fMigpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo2Nzc4OjE6ICggcnVsZV9fRGF0YUludGVyY2hhbmdlQmVhbl9fR3JvdXBfMTBfXzJfX0ltcGwgcnVsZV9fRGF0YUludGVyY2hhbmdlQmVhbl9fR3JvdXBfMTBfXzMgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6Njc3OToyOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VCZWFuX19Hcm91cF8xMF9fMl9fSW1wbCBydWxlX19EYXRhSW50ZXJjaGFuZ2VCZWFuX19Hcm91cF8xMF9fMworICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NzA2MzoxOiAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUJlYW5fX0dyb3VwXzEwX18yX19JbXBsIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUJlYW5fX0dyb3VwXzEwX18zICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjcwNjQ6MjogcnVsZV9fRGF0YUludGVyY2hhbmdlQmVhbl9fR3JvdXBfMTBfXzJfX0ltcGwgcnVsZV9fRGF0YUludGVyY2hhbmdlQmVhbl9fR3JvdXBfMTBfXzMKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzM2KTsKKyAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzM0KTsKICAgICAgICAgICAgIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUJlYW5fX0dyb3VwXzEwX18yX19JbXBsKCk7CiAKICAgICAgICAgICAgIHN0YXRlLl9mc3AtLTsKQEAgLTIzODA0LDM4ICsyNDk2MiwzOCBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX0RhdGFJbnRlcmNoYW5nZUJlYW5fX0dyb3VwXzEwX18yX19JbXBsIgotICAgIC8vIEludGVybmFsRGF0YURTTC5nOjY3ODY6MTogcnVsZV9fRGF0YUludGVyY2hhbmdlQmVhbl9fR3JvdXBfMTBfXzJfX0ltcGwgOiAoICggcnVsZV9fRGF0YUludGVyY2hhbmdlQmVhbl9fTG9va3VwS2V5c0Fzc2lnbm1lbnRfMTBfMiApKiApIDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo3MDcxOjE6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUJlYW5fX0dyb3VwXzEwX18yX19JbXBsIDogKCAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUJlYW5fX0V4cG9ydEV4cG9zZXNBc3NpZ25tZW50XzEwXzIgKSogKSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fRGF0YUludGVyY2hhbmdlQmVhbl9fR3JvdXBfMTBfXzJfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6Njc5MDoxOiAoICggKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VCZWFuX19Mb29rdXBLZXlzQXNzaWdubWVudF8xMF8yICkqICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6Njc5MToxOiAoICggcnVsZV9fRGF0YUludGVyY2hhbmdlQmVhbl9fTG9va3VwS2V5c0Fzc2lnbm1lbnRfMTBfMiApKiApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo3MDc1OjE6ICggKCAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUJlYW5fX0V4cG9ydEV4cG9zZXNBc3NpZ25tZW50XzEwXzIgKSogKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo3MDc2OjE6ICggKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VCZWFuX19FeHBvcnRFeHBvc2VzQXNzaWdubWVudF8xMF8yICkqICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjY3OTE6MTogKCAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUJlYW5fX0xvb2t1cEtleXNBc3NpZ25tZW50XzEwXzIgKSogKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6Njc5MjoyOiAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUJlYW5fX0xvb2t1cEtleXNBc3NpZ25tZW50XzEwXzIgKSoKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjcwNzY6MTogKCAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUJlYW5fX0V4cG9ydEV4cG9zZXNBc3NpZ25tZW50XzEwXzIgKSogKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NzA3NzoyOiAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUJlYW5fX0V4cG9ydEV4cG9zZXNBc3NpZ25tZW50XzEwXzIgKSoKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewotICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YUludGVyY2hhbmdlQmVhbkFjY2VzcygpLmdldExvb2t1cEtleXNBc3NpZ25tZW50XzEwXzIoKSk7IAorICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YUludGVyY2hhbmdlQmVhbkFjY2VzcygpLmdldEV4cG9ydEV4cG9zZXNBc3NpZ25tZW50XzEwXzIoKSk7IAogICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6Njc5MzoyOiAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUJlYW5fX0xvb2t1cEtleXNBc3NpZ25tZW50XzEwXzIgKSoKLSAgICAgICAgICAgIGxvb3A3NToKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjcwNzg6MjogKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VCZWFuX19FeHBvcnRFeHBvc2VzQXNzaWdubWVudF8xMF8yICkqCisgICAgICAgICAgICBsb29wODE6CiAgICAgICAgICAgICBkbyB7Ci0gICAgICAgICAgICAgICAgaW50IGFsdDc1PTI7Ci0gICAgICAgICAgICAgICAgaW50IExBNzVfMCA9IGlucHV0LkxBKDEpOworICAgICAgICAgICAgICAgIGludCBhbHQ4MT0yOworICAgICAgICAgICAgICAgIGludCBMQTgxXzAgPSBpbnB1dC5MQSgxKTsKIAotICAgICAgICAgICAgICAgIGlmICggKExBNzVfMD09OTQpICkgewotICAgICAgICAgICAgICAgICAgICBhbHQ3NT0xOworICAgICAgICAgICAgICAgIGlmICggKExBODFfMD09MTEyKSApIHsKKyAgICAgICAgICAgICAgICAgICAgYWx0ODE9MTsKICAgICAgICAgICAgICAgICB9CiAKIAotICAgICAgICAgICAgICAgIHN3aXRjaCAoYWx0NzUpIHsKKyAgICAgICAgICAgICAgICBzd2l0Y2ggKGFsdDgxKSB7CiAgICAgICAgICAgICAJY2FzZSAxIDoKLSAgICAgICAgICAgIAkgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6Njc5MzozOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VCZWFuX19Mb29rdXBLZXlzQXNzaWdubWVudF8xMF8yCisgICAgICAgICAgICAJICAgIC8vIEludGVybmFsRGF0YURTTC5nOjcwNzg6MzogcnVsZV9fRGF0YUludGVyY2hhbmdlQmVhbl9fRXhwb3J0RXhwb3Nlc0Fzc2lnbm1lbnRfMTBfMgogICAgICAgICAgICAgCSAgICB7Ci0gICAgICAgICAgICAJICAgIHB1c2hGb2xsb3coRk9MTE9XXzM3KTsKLSAgICAgICAgICAgIAkgICAgcnVsZV9fRGF0YUludGVyY2hhbmdlQmVhbl9fTG9va3VwS2V5c0Fzc2lnbm1lbnRfMTBfMigpOworICAgICAgICAgICAgCSAgICBwdXNoRm9sbG93KEZPTExPV18zNSk7CisgICAgICAgICAgICAJICAgIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUJlYW5fX0V4cG9ydEV4cG9zZXNBc3NpZ25tZW50XzEwXzIoKTsKIAogICAgICAgICAgICAgCSAgICBzdGF0ZS5fZnNwLS07CiAgICAgICAgICAgICAJICAgIGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CkBAIC0yMzg0NCwxMiArMjUwMDIsMTIgQEAKICAgICAgICAgICAgIAkgICAgYnJlYWs7CiAKICAgICAgICAgICAgIAlkZWZhdWx0IDoKLSAgICAgICAgICAgIAkgICAgYnJlYWsgbG9vcDc1OworICAgICAgICAgICAgCSAgICBicmVhayBsb29wODE7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfSB3aGlsZSAodHJ1ZSk7CiAKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewotICAgICAgICAgICAgICAgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXREYXRhSW50ZXJjaGFuZ2VCZWFuQWNjZXNzKCkuZ2V0TG9va3VwS2V5c0Fzc2lnbm1lbnRfMTBfMigpKTsgCisgICAgICAgICAgICAgICBhZnRlcihncmFtbWFyQWNjZXNzLmdldERhdGFJbnRlcmNoYW5nZUJlYW5BY2Nlc3MoKS5nZXRFeHBvcnRFeHBvc2VzQXNzaWdubWVudF8xMF8yKCkpOyAKICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgfQpAQCAtMjM4NzMsMTQgKzI1MDMxLDE0IEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fRGF0YUludGVyY2hhbmdlQmVhbl9fR3JvdXBfMTBfXzMiCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NjgwMToxOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VCZWFuX19Hcm91cF8xMF9fMyA6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUJlYW5fX0dyb3VwXzEwX18zX19JbXBsIDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo3MDg2OjE6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUJlYW5fX0dyb3VwXzEwX18zIDogcnVsZV9fRGF0YUludGVyY2hhbmdlQmVhbl9fR3JvdXBfMTBfXzNfX0ltcGwgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUJlYW5fX0dyb3VwXzEwX18zKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjY4MDU6MTogKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VCZWFuX19Hcm91cF8xMF9fM19fSW1wbCApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo2ODA2OjI6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUJlYW5fX0dyb3VwXzEwX18zX19JbXBsCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo3MDkwOjE6ICggcnVsZV9fRGF0YUludGVyY2hhbmdlQmVhbl9fR3JvdXBfMTBfXzNfX0ltcGwgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NzA5MToyOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VCZWFuX19Hcm91cF8xMF9fM19fSW1wbAogICAgICAgICAgICAgewogICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMik7CiAgICAgICAgICAgICBydWxlX19EYXRhSW50ZXJjaGFuZ2VCZWFuX19Hcm91cF8xMF9fM19fSW1wbCgpOwpAQCAtMjM5MDYsMjIgKzI1MDY0LDIyIEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fRGF0YUludGVyY2hhbmdlQmVhbl9fR3JvdXBfMTBfXzNfX0ltcGwiCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NjgxMjoxOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VCZWFuX19Hcm91cF8xMF9fM19fSW1wbCA6ICggJ30nICkgOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjcwOTc6MTogcnVsZV9fRGF0YUludGVyY2hhbmdlQmVhbl9fR3JvdXBfMTBfXzNfX0ltcGwgOiAoICd9JyApIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19EYXRhSW50ZXJjaGFuZ2VCZWFuX19Hcm91cF8xMF9fM19fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo2ODE2OjE6ICggKCAnfScgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo2ODE3OjE6ICggJ30nICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjcxMDE6MTogKCAoICd9JyApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjcxMDI6MTogKCAnfScgKQogICAgICAgICAgICAgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NjgxNzoxOiAoICd9JyApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo2ODE4OjI6ICd9JworICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NzEwMjoxOiAoICd9JyApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo3MTAzOjI6ICd9JwogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXREYXRhSW50ZXJjaGFuZ2VCZWFuQWNjZXNzKCkuZ2V0UmlnaHRDdXJseUJyYWNrZXRLZXl3b3JkXzEwXzMoKSk7IAogICAgICAgICAgICAgfQotICAgICAgICAgICAgbWF0Y2goaW5wdXQsNzEsRk9MTE9XXzIpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOworICAgICAgICAgICAgbWF0Y2goaW5wdXQsNzYsRk9MTE9XXzIpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOwogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBhZnRlcihncmFtbWFyQWNjZXNzLmdldERhdGFJbnRlcmNoYW5nZUJlYW5BY2Nlc3MoKS5nZXRSaWdodEN1cmx5QnJhY2tldEtleXdvcmRfMTBfMygpKTsgCiAgICAgICAgICAgICB9CkBAIC0yMzk0NiwxNyArMjUxMDQsMTAxNiBAQAogICAgIC8vICRBTlRMUiBlbmQgInJ1bGVfX0RhdGFJbnRlcmNoYW5nZUJlYW5fX0dyb3VwXzEwX18zX19JbXBsIgogCiAKKyAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX0RhdGFJbnRlcmNoYW5nZUJlYW5fX0dyb3VwXzExX18wIgorICAgIC8vIEludGVybmFsRGF0YURTTC5nOjcxMTM6MTogcnVsZV9fRGF0YUludGVyY2hhbmdlQmVhbl9fR3JvdXBfMTFfXzAgOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VCZWFuX19Hcm91cF8xMV9fMF9fSW1wbCBydWxlX19EYXRhSW50ZXJjaGFuZ2VCZWFuX19Hcm91cF8xMV9fMSA7CisgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fRGF0YUludGVyY2hhbmdlQmVhbl9fR3JvdXBfMTFfXzAoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworCisgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICAgICAgCQorICAgICAgICB0cnkgeworICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NzExNzoxOiAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUJlYW5fX0dyb3VwXzExX18wX19JbXBsIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUJlYW5fX0dyb3VwXzExX18xICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjcxMTg6MjogcnVsZV9fRGF0YUludGVyY2hhbmdlQmVhbl9fR3JvdXBfMTFfXzBfX0ltcGwgcnVsZV9fRGF0YUludGVyY2hhbmdlQmVhbl9fR3JvdXBfMTFfXzEKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzEwKTsKKyAgICAgICAgICAgIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUJlYW5fX0dyb3VwXzExX18wX19JbXBsKCk7CisKKyAgICAgICAgICAgIHN0YXRlLl9mc3AtLTsKKyAgICAgICAgICAgIGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CisgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV18yKTsKKyAgICAgICAgICAgIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUJlYW5fX0dyb3VwXzExX18xKCk7CisKKyAgICAgICAgICAgIHN0YXRlLl9mc3AtLTsKKyAgICAgICAgICAgIGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CisKKyAgICAgICAgICAgIH0KKworICAgICAgICB9CisgICAgICAgIGNhdGNoIChSZWNvZ25pdGlvbkV4Y2VwdGlvbiByZSkgeworICAgICAgICAgICAgcmVwb3J0RXJyb3IocmUpOworICAgICAgICAgICAgcmVjb3ZlcihpbnB1dCxyZSk7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisKKyAgICAgICAgICAgIAlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7CisKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gOworICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJydWxlX19EYXRhSW50ZXJjaGFuZ2VCZWFuX19Hcm91cF8xMV9fMCIKKworCisgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19EYXRhSW50ZXJjaGFuZ2VCZWFuX19Hcm91cF8xMV9fMF9fSW1wbCIKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo3MTI1OjE6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUJlYW5fX0dyb3VwXzExX18wX19JbXBsIDogKCAnbWFwcGluZycgKSA7CisgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fRGF0YUludGVyY2hhbmdlQmVhbl9fR3JvdXBfMTFfXzBfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworCisgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICAgICAgCQorICAgICAgICB0cnkgeworICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NzEyOToxOiAoICggJ21hcHBpbmcnICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NzEzMDoxOiAoICdtYXBwaW5nJyApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo3MTMwOjE6ICggJ21hcHBpbmcnICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjcxMzE6MjogJ21hcHBpbmcnCisgICAgICAgICAgICB7CisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldERhdGFJbnRlcmNoYW5nZUJlYW5BY2Nlc3MoKS5nZXRNYXBwaW5nS2V5d29yZF8xMV8wKCkpOyAKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1hdGNoKGlucHV0LDk4LEZPTExPV18yKTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXREYXRhSW50ZXJjaGFuZ2VCZWFuQWNjZXNzKCkuZ2V0TWFwcGluZ0tleXdvcmRfMTFfMCgpKTsgCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICB9CisKKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoUmVjb2duaXRpb25FeGNlcHRpb24gcmUpIHsKKyAgICAgICAgICAgIHJlcG9ydEVycm9yKHJlKTsKKyAgICAgICAgICAgIHJlY292ZXIoaW5wdXQscmUpOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworCisgICAgICAgICAgICAJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworCisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIDsKKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAicnVsZV9fRGF0YUludGVyY2hhbmdlQmVhbl9fR3JvdXBfMTFfXzBfX0ltcGwiCisKKworICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fRGF0YUludGVyY2hhbmdlQmVhbl9fR3JvdXBfMTFfXzEiCisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NzE0MDoxOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VCZWFuX19Hcm91cF8xMV9fMSA6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUJlYW5fX0dyb3VwXzExX18xX19JbXBsIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUJlYW5fX0dyb3VwXzExX18yIDsKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19EYXRhSW50ZXJjaGFuZ2VCZWFuX19Hcm91cF8xMV9fMSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisKKyAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgICAgICAJCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo3MTQ0OjE6ICggcnVsZV9fRGF0YUludGVyY2hhbmdlQmVhbl9fR3JvdXBfMTFfXzFfX0ltcGwgcnVsZV9fRGF0YUludGVyY2hhbmdlQmVhbl9fR3JvdXBfMTFfXzIgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NzE0NToyOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VCZWFuX19Hcm91cF8xMV9fMV9fSW1wbCBydWxlX19EYXRhSW50ZXJjaGFuZ2VCZWFuX19Hcm91cF8xMV9fMgorICAgICAgICAgICAgeworICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMzYpOworICAgICAgICAgICAgcnVsZV9fRGF0YUludGVyY2hhbmdlQmVhbl9fR3JvdXBfMTFfXzFfX0ltcGwoKTsKKworICAgICAgICAgICAgc3RhdGUuX2ZzcC0tOworICAgICAgICAgICAgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKKyAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzIpOworICAgICAgICAgICAgcnVsZV9fRGF0YUludGVyY2hhbmdlQmVhbl9fR3JvdXBfMTFfXzIoKTsKKworICAgICAgICAgICAgc3RhdGUuX2ZzcC0tOworICAgICAgICAgICAgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKKworICAgICAgICAgICAgfQorCisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKFJlY29nbml0aW9uRXhjZXB0aW9uIHJlKSB7CisgICAgICAgICAgICByZXBvcnRFcnJvcihyZSk7CisgICAgICAgICAgICByZWNvdmVyKGlucHV0LHJlKTsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKworICAgICAgICAgICAgCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKKworICAgICAgICB9CisgICAgICAgIHJldHVybiA7CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgInJ1bGVfX0RhdGFJbnRlcmNoYW5nZUJlYW5fX0dyb3VwXzExX18xIgorCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX0RhdGFJbnRlcmNoYW5nZUJlYW5fX0dyb3VwXzExX18xX19JbXBsIgorICAgIC8vIEludGVybmFsRGF0YURTTC5nOjcxNTI6MTogcnVsZV9fRGF0YUludGVyY2hhbmdlQmVhbl9fR3JvdXBfMTFfXzFfX0ltcGwgOiAoICd7JyApIDsKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19EYXRhSW50ZXJjaGFuZ2VCZWFuX19Hcm91cF8xMV9fMV9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisKKyAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgICAgICAJCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo3MTU2OjE6ICggKCAneycgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo3MTU3OjE6ICggJ3snICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjcxNTc6MTogKCAneycgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NzE1ODoyOiAneycKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YUludGVyY2hhbmdlQmVhbkFjY2VzcygpLmdldExlZnRDdXJseUJyYWNrZXRLZXl3b3JkXzExXzEoKSk7IAorICAgICAgICAgICAgfQorICAgICAgICAgICAgbWF0Y2goaW5wdXQsNzUsRk9MTE9XXzIpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBhZnRlcihncmFtbWFyQWNjZXNzLmdldERhdGFJbnRlcmNoYW5nZUJlYW5BY2Nlc3MoKS5nZXRMZWZ0Q3VybHlCcmFja2V0S2V5d29yZF8xMV8xKCkpOyAKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgIH0KKworICAgICAgICB9CisgICAgICAgIGNhdGNoIChSZWNvZ25pdGlvbkV4Y2VwdGlvbiByZSkgeworICAgICAgICAgICAgcmVwb3J0RXJyb3IocmUpOworICAgICAgICAgICAgcmVjb3ZlcihpbnB1dCxyZSk7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisKKyAgICAgICAgICAgIAlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7CisKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gOworICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJydWxlX19EYXRhSW50ZXJjaGFuZ2VCZWFuX19Hcm91cF8xMV9fMV9fSW1wbCIKKworCisgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19EYXRhSW50ZXJjaGFuZ2VCZWFuX19Hcm91cF8xMV9fMiIKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo3MTY3OjE6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUJlYW5fX0dyb3VwXzExX18yIDogcnVsZV9fRGF0YUludGVyY2hhbmdlQmVhbl9fR3JvdXBfMTFfXzJfX0ltcGwgcnVsZV9fRGF0YUludGVyY2hhbmdlQmVhbl9fR3JvdXBfMTFfXzMgOworICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUJlYW5fX0dyb3VwXzExX18yKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKworICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgICAgIAkKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjcxNzE6MTogKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VCZWFuX19Hcm91cF8xMV9fMl9fSW1wbCBydWxlX19EYXRhSW50ZXJjaGFuZ2VCZWFuX19Hcm91cF8xMV9fMyApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo3MTcyOjI6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUJlYW5fX0dyb3VwXzExX18yX19JbXBsIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUJlYW5fX0dyb3VwXzExX18zCisgICAgICAgICAgICB7CisgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV18zNik7CisgICAgICAgICAgICBydWxlX19EYXRhSW50ZXJjaGFuZ2VCZWFuX19Hcm91cF8xMV9fMl9fSW1wbCgpOworCisgICAgICAgICAgICBzdGF0ZS5fZnNwLS07CisgICAgICAgICAgICBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOworICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMik7CisgICAgICAgICAgICBydWxlX19EYXRhSW50ZXJjaGFuZ2VCZWFuX19Hcm91cF8xMV9fMygpOworCisgICAgICAgICAgICBzdGF0ZS5fZnNwLS07CisgICAgICAgICAgICBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOworCisgICAgICAgICAgICB9CisKKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoUmVjb2duaXRpb25FeGNlcHRpb24gcmUpIHsKKyAgICAgICAgICAgIHJlcG9ydEVycm9yKHJlKTsKKyAgICAgICAgICAgIHJlY292ZXIoaW5wdXQscmUpOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworCisgICAgICAgICAgICAJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworCisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIDsKKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAicnVsZV9fRGF0YUludGVyY2hhbmdlQmVhbl9fR3JvdXBfMTFfXzIiCisKKworICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fRGF0YUludGVyY2hhbmdlQmVhbl9fR3JvdXBfMTFfXzJfX0ltcGwiCisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NzE3OToxOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VCZWFuX19Hcm91cF8xMV9fMl9fSW1wbCA6ICggKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VCZWFuX19NYXBwaW5nc0Fzc2lnbm1lbnRfMTFfMiApKiApIDsKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19EYXRhSW50ZXJjaGFuZ2VCZWFuX19Hcm91cF8xMV9fMl9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisKKyAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgICAgICAJCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo3MTgzOjE6ICggKCAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUJlYW5fX01hcHBpbmdzQXNzaWdubWVudF8xMV8yICkqICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NzE4NDoxOiAoICggcnVsZV9fRGF0YUludGVyY2hhbmdlQmVhbl9fTWFwcGluZ3NBc3NpZ25tZW50XzExXzIgKSogKQorICAgICAgICAgICAgeworICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NzE4NDoxOiAoICggcnVsZV9fRGF0YUludGVyY2hhbmdlQmVhbl9fTWFwcGluZ3NBc3NpZ25tZW50XzExXzIgKSogKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NzE4NToyOiAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUJlYW5fX01hcHBpbmdzQXNzaWdubWVudF8xMV8yICkqCisgICAgICAgICAgICB7CisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldERhdGFJbnRlcmNoYW5nZUJlYW5BY2Nlc3MoKS5nZXRNYXBwaW5nc0Fzc2lnbm1lbnRfMTFfMigpKTsgCisgICAgICAgICAgICB9CisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo3MTg2OjI6ICggcnVsZV9fRGF0YUludGVyY2hhbmdlQmVhbl9fTWFwcGluZ3NBc3NpZ25tZW50XzExXzIgKSoKKyAgICAgICAgICAgIGxvb3A4MjoKKyAgICAgICAgICAgIGRvIHsKKyAgICAgICAgICAgICAgICBpbnQgYWx0ODI9MjsKKyAgICAgICAgICAgICAgICBpbnQgTEE4Ml8wID0gaW5wdXQuTEEoMSk7CisKKyAgICAgICAgICAgICAgICBpZiAoIChMQTgyXzA9PTExN3x8TEE4Ml8wPT0xMTkpICkgeworICAgICAgICAgICAgICAgICAgICBhbHQ4Mj0xOworICAgICAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICAgICAgc3dpdGNoIChhbHQ4MikgeworICAgICAgICAgICAgCWNhc2UgMSA6CisgICAgICAgICAgICAJICAgIC8vIEludGVybmFsRGF0YURTTC5nOjcxODY6MzogcnVsZV9fRGF0YUludGVyY2hhbmdlQmVhbl9fTWFwcGluZ3NBc3NpZ25tZW50XzExXzIKKyAgICAgICAgICAgIAkgICAgeworICAgICAgICAgICAgCSAgICBwdXNoRm9sbG93KEZPTExPV18zNyk7CisgICAgICAgICAgICAJICAgIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUJlYW5fX01hcHBpbmdzQXNzaWdubWVudF8xMV8yKCk7CisKKyAgICAgICAgICAgIAkgICAgc3RhdGUuX2ZzcC0tOworICAgICAgICAgICAgCSAgICBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOworCisgICAgICAgICAgICAJICAgIH0KKyAgICAgICAgICAgIAkgICAgYnJlYWs7CisKKyAgICAgICAgICAgIAlkZWZhdWx0IDoKKyAgICAgICAgICAgIAkgICAgYnJlYWsgbG9vcDgyOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gd2hpbGUgKHRydWUpOworCisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YUludGVyY2hhbmdlQmVhbkFjY2VzcygpLmdldE1hcHBpbmdzQXNzaWdubWVudF8xMV8yKCkpOyAKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgIH0KKworICAgICAgICB9CisgICAgICAgIGNhdGNoIChSZWNvZ25pdGlvbkV4Y2VwdGlvbiByZSkgeworICAgICAgICAgICAgcmVwb3J0RXJyb3IocmUpOworICAgICAgICAgICAgcmVjb3ZlcihpbnB1dCxyZSk7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisKKyAgICAgICAgICAgIAlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7CisKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gOworICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJydWxlX19EYXRhSW50ZXJjaGFuZ2VCZWFuX19Hcm91cF8xMV9fMl9fSW1wbCIKKworCisgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19EYXRhSW50ZXJjaGFuZ2VCZWFuX19Hcm91cF8xMV9fMyIKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo3MTk0OjE6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUJlYW5fX0dyb3VwXzExX18zIDogcnVsZV9fRGF0YUludGVyY2hhbmdlQmVhbl9fR3JvdXBfMTFfXzNfX0ltcGwgOworICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUJlYW5fX0dyb3VwXzExX18zKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKworICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgICAgIAkKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjcxOTg6MTogKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VCZWFuX19Hcm91cF8xMV9fM19fSW1wbCApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo3MTk5OjI6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUJlYW5fX0dyb3VwXzExX18zX19JbXBsCisgICAgICAgICAgICB7CisgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV18yKTsKKyAgICAgICAgICAgIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUJlYW5fX0dyb3VwXzExX18zX19JbXBsKCk7CisKKyAgICAgICAgICAgIHN0YXRlLl9mc3AtLTsKKyAgICAgICAgICAgIGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CisKKyAgICAgICAgICAgIH0KKworICAgICAgICB9CisgICAgICAgIGNhdGNoIChSZWNvZ25pdGlvbkV4Y2VwdGlvbiByZSkgeworICAgICAgICAgICAgcmVwb3J0RXJyb3IocmUpOworICAgICAgICAgICAgcmVjb3ZlcihpbnB1dCxyZSk7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisKKyAgICAgICAgICAgIAlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7CisKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gOworICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJydWxlX19EYXRhSW50ZXJjaGFuZ2VCZWFuX19Hcm91cF8xMV9fMyIKKworCisgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19EYXRhSW50ZXJjaGFuZ2VCZWFuX19Hcm91cF8xMV9fM19fSW1wbCIKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo3MjA1OjE6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUJlYW5fX0dyb3VwXzExX18zX19JbXBsIDogKCAnfScgKSA7CisgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fRGF0YUludGVyY2hhbmdlQmVhbl9fR3JvdXBfMTFfXzNfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworCisgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICAgICAgCQorICAgICAgICB0cnkgeworICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NzIwOToxOiAoICggJ30nICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NzIxMDoxOiAoICd9JyApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo3MjEwOjE6ICggJ30nICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjcyMTE6MjogJ30nCisgICAgICAgICAgICB7CisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldERhdGFJbnRlcmNoYW5nZUJlYW5BY2Nlc3MoKS5nZXRSaWdodEN1cmx5QnJhY2tldEtleXdvcmRfMTFfMygpKTsgCisgICAgICAgICAgICB9CisgICAgICAgICAgICBtYXRjaChpbnB1dCw3NixGT0xMT1dfMik7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YUludGVyY2hhbmdlQmVhbkFjY2VzcygpLmdldFJpZ2h0Q3VybHlCcmFja2V0S2V5d29yZF8xMV8zKCkpOyAKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgIH0KKworICAgICAgICB9CisgICAgICAgIGNhdGNoIChSZWNvZ25pdGlvbkV4Y2VwdGlvbiByZSkgeworICAgICAgICAgICAgcmVwb3J0RXJyb3IocmUpOworICAgICAgICAgICAgcmVjb3ZlcihpbnB1dCxyZSk7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisKKyAgICAgICAgICAgIAlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7CisKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gOworICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJydWxlX19EYXRhSW50ZXJjaGFuZ2VCZWFuX19Hcm91cF8xMV9fM19fSW1wbCIKKworCisgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19EYXRhSW50ZXJjaGFuZ2VCZWFuX19Hcm91cF8xMl9fMCIKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo3MjIxOjE6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUJlYW5fX0dyb3VwXzEyX18wIDogcnVsZV9fRGF0YUludGVyY2hhbmdlQmVhbl9fR3JvdXBfMTJfXzBfX0ltcGwgcnVsZV9fRGF0YUludGVyY2hhbmdlQmVhbl9fR3JvdXBfMTJfXzEgOworICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUJlYW5fX0dyb3VwXzEyX18wKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKworICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgICAgIAkKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjcyMjU6MTogKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VCZWFuX19Hcm91cF8xMl9fMF9fSW1wbCBydWxlX19EYXRhSW50ZXJjaGFuZ2VCZWFuX19Hcm91cF8xMl9fMSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo3MjI2OjI6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUJlYW5fX0dyb3VwXzEyX18wX19JbXBsIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUJlYW5fX0dyb3VwXzEyX18xCisgICAgICAgICAgICB7CisgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV18xMCk7CisgICAgICAgICAgICBydWxlX19EYXRhSW50ZXJjaGFuZ2VCZWFuX19Hcm91cF8xMl9fMF9fSW1wbCgpOworCisgICAgICAgICAgICBzdGF0ZS5fZnNwLS07CisgICAgICAgICAgICBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOworICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMik7CisgICAgICAgICAgICBydWxlX19EYXRhSW50ZXJjaGFuZ2VCZWFuX19Hcm91cF8xMl9fMSgpOworCisgICAgICAgICAgICBzdGF0ZS5fZnNwLS07CisgICAgICAgICAgICBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOworCisgICAgICAgICAgICB9CisKKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoUmVjb2duaXRpb25FeGNlcHRpb24gcmUpIHsKKyAgICAgICAgICAgIHJlcG9ydEVycm9yKHJlKTsKKyAgICAgICAgICAgIHJlY292ZXIoaW5wdXQscmUpOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworCisgICAgICAgICAgICAJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworCisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIDsKKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAicnVsZV9fRGF0YUludGVyY2hhbmdlQmVhbl9fR3JvdXBfMTJfXzAiCisKKworICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fRGF0YUludGVyY2hhbmdlQmVhbl9fR3JvdXBfMTJfXzBfX0ltcGwiCisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NzIzMzoxOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VCZWFuX19Hcm91cF8xMl9fMF9fSW1wbCA6ICggJ2tleXMnICkgOworICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUJlYW5fX0dyb3VwXzEyX18wX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKworICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgICAgIAkKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjcyMzc6MTogKCAoICdrZXlzJyApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjcyMzg6MTogKCAna2V5cycgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NzIzODoxOiAoICdrZXlzJyApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo3MjM5OjI6ICdrZXlzJworICAgICAgICAgICAgeworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXREYXRhSW50ZXJjaGFuZ2VCZWFuQWNjZXNzKCkuZ2V0S2V5c0tleXdvcmRfMTJfMCgpKTsgCisgICAgICAgICAgICB9CisgICAgICAgICAgICBtYXRjaChpbnB1dCw5OSxGT0xMT1dfMik7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YUludGVyY2hhbmdlQmVhbkFjY2VzcygpLmdldEtleXNLZXl3b3JkXzEyXzAoKSk7IAorICAgICAgICAgICAgfQorCisgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgfQorCisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKFJlY29nbml0aW9uRXhjZXB0aW9uIHJlKSB7CisgICAgICAgICAgICByZXBvcnRFcnJvcihyZSk7CisgICAgICAgICAgICByZWNvdmVyKGlucHV0LHJlKTsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKworICAgICAgICAgICAgCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKKworICAgICAgICB9CisgICAgICAgIHJldHVybiA7CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgInJ1bGVfX0RhdGFJbnRlcmNoYW5nZUJlYW5fX0dyb3VwXzEyX18wX19JbXBsIgorCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX0RhdGFJbnRlcmNoYW5nZUJlYW5fX0dyb3VwXzEyX18xIgorICAgIC8vIEludGVybmFsRGF0YURTTC5nOjcyNDg6MTogcnVsZV9fRGF0YUludGVyY2hhbmdlQmVhbl9fR3JvdXBfMTJfXzEgOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VCZWFuX19Hcm91cF8xMl9fMV9fSW1wbCBydWxlX19EYXRhSW50ZXJjaGFuZ2VCZWFuX19Hcm91cF8xMl9fMiA7CisgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fRGF0YUludGVyY2hhbmdlQmVhbl9fR3JvdXBfMTJfXzEoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworCisgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICAgICAgCQorICAgICAgICB0cnkgeworICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NzI1MjoxOiAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUJlYW5fX0dyb3VwXzEyX18xX19JbXBsIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUJlYW5fX0dyb3VwXzEyX18yICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjcyNTM6MjogcnVsZV9fRGF0YUludGVyY2hhbmdlQmVhbl9fR3JvdXBfMTJfXzFfX0ltcGwgcnVsZV9fRGF0YUludGVyY2hhbmdlQmVhbl9fR3JvdXBfMTJfXzIKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzM4KTsKKyAgICAgICAgICAgIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUJlYW5fX0dyb3VwXzEyX18xX19JbXBsKCk7CisKKyAgICAgICAgICAgIHN0YXRlLl9mc3AtLTsKKyAgICAgICAgICAgIGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CisgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV18yKTsKKyAgICAgICAgICAgIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUJlYW5fX0dyb3VwXzEyX18yKCk7CisKKyAgICAgICAgICAgIHN0YXRlLl9mc3AtLTsKKyAgICAgICAgICAgIGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CisKKyAgICAgICAgICAgIH0KKworICAgICAgICB9CisgICAgICAgIGNhdGNoIChSZWNvZ25pdGlvbkV4Y2VwdGlvbiByZSkgeworICAgICAgICAgICAgcmVwb3J0RXJyb3IocmUpOworICAgICAgICAgICAgcmVjb3ZlcihpbnB1dCxyZSk7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisKKyAgICAgICAgICAgIAlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7CisKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gOworICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJydWxlX19EYXRhSW50ZXJjaGFuZ2VCZWFuX19Hcm91cF8xMl9fMSIKKworCisgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19EYXRhSW50ZXJjaGFuZ2VCZWFuX19Hcm91cF8xMl9fMV9fSW1wbCIKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo3MjYwOjE6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUJlYW5fX0dyb3VwXzEyX18xX19JbXBsIDogKCAneycgKSA7CisgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fRGF0YUludGVyY2hhbmdlQmVhbl9fR3JvdXBfMTJfXzFfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworCisgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICAgICAgCQorICAgICAgICB0cnkgeworICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NzI2NDoxOiAoICggJ3snICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NzI2NToxOiAoICd7JyApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo3MjY1OjE6ICggJ3snICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjcyNjY6MjogJ3snCisgICAgICAgICAgICB7CisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldERhdGFJbnRlcmNoYW5nZUJlYW5BY2Nlc3MoKS5nZXRMZWZ0Q3VybHlCcmFja2V0S2V5d29yZF8xMl8xKCkpOyAKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1hdGNoKGlucHV0LDc1LEZPTExPV18yKTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXREYXRhSW50ZXJjaGFuZ2VCZWFuQWNjZXNzKCkuZ2V0TGVmdEN1cmx5QnJhY2tldEtleXdvcmRfMTJfMSgpKTsgCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICB9CisKKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoUmVjb2duaXRpb25FeGNlcHRpb24gcmUpIHsKKyAgICAgICAgICAgIHJlcG9ydEVycm9yKHJlKTsKKyAgICAgICAgICAgIHJlY292ZXIoaW5wdXQscmUpOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworCisgICAgICAgICAgICAJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworCisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIDsKKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAicnVsZV9fRGF0YUludGVyY2hhbmdlQmVhbl9fR3JvdXBfMTJfXzFfX0ltcGwiCisKKworICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fRGF0YUludGVyY2hhbmdlQmVhbl9fR3JvdXBfMTJfXzIiCisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NzI3NToxOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VCZWFuX19Hcm91cF8xMl9fMiA6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUJlYW5fX0dyb3VwXzEyX18yX19JbXBsIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUJlYW5fX0dyb3VwXzEyX18zIDsKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19EYXRhSW50ZXJjaGFuZ2VCZWFuX19Hcm91cF8xMl9fMigpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisKKyAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgICAgICAJCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo3Mjc5OjE6ICggcnVsZV9fRGF0YUludGVyY2hhbmdlQmVhbl9fR3JvdXBfMTJfXzJfX0ltcGwgcnVsZV9fRGF0YUludGVyY2hhbmdlQmVhbl9fR3JvdXBfMTJfXzMgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NzI4MDoyOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VCZWFuX19Hcm91cF8xMl9fMl9fSW1wbCBydWxlX19EYXRhSW50ZXJjaGFuZ2VCZWFuX19Hcm91cF8xMl9fMworICAgICAgICAgICAgeworICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMzgpOworICAgICAgICAgICAgcnVsZV9fRGF0YUludGVyY2hhbmdlQmVhbl9fR3JvdXBfMTJfXzJfX0ltcGwoKTsKKworICAgICAgICAgICAgc3RhdGUuX2ZzcC0tOworICAgICAgICAgICAgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKKyAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzIpOworICAgICAgICAgICAgcnVsZV9fRGF0YUludGVyY2hhbmdlQmVhbl9fR3JvdXBfMTJfXzMoKTsKKworICAgICAgICAgICAgc3RhdGUuX2ZzcC0tOworICAgICAgICAgICAgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKKworICAgICAgICAgICAgfQorCisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKFJlY29nbml0aW9uRXhjZXB0aW9uIHJlKSB7CisgICAgICAgICAgICByZXBvcnRFcnJvcihyZSk7CisgICAgICAgICAgICByZWNvdmVyKGlucHV0LHJlKTsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKworICAgICAgICAgICAgCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKKworICAgICAgICB9CisgICAgICAgIHJldHVybiA7CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgInJ1bGVfX0RhdGFJbnRlcmNoYW5nZUJlYW5fX0dyb3VwXzEyX18yIgorCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX0RhdGFJbnRlcmNoYW5nZUJlYW5fX0dyb3VwXzEyX18yX19JbXBsIgorICAgIC8vIEludGVybmFsRGF0YURTTC5nOjcyODc6MTogcnVsZV9fRGF0YUludGVyY2hhbmdlQmVhbl9fR3JvdXBfMTJfXzJfX0ltcGwgOiAoICggcnVsZV9fRGF0YUludGVyY2hhbmdlQmVhbl9fTG9va3VwS2V5c0Fzc2lnbm1lbnRfMTJfMiApKiApIDsKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19EYXRhSW50ZXJjaGFuZ2VCZWFuX19Hcm91cF8xMl9fMl9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisKKyAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgICAgICAJCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo3MjkxOjE6ICggKCAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUJlYW5fX0xvb2t1cEtleXNBc3NpZ25tZW50XzEyXzIgKSogKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo3MjkyOjE6ICggKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VCZWFuX19Mb29rdXBLZXlzQXNzaWdubWVudF8xMl8yICkqICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjcyOTI6MTogKCAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUJlYW5fX0xvb2t1cEtleXNBc3NpZ25tZW50XzEyXzIgKSogKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NzI5MzoyOiAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUJlYW5fX0xvb2t1cEtleXNBc3NpZ25tZW50XzEyXzIgKSoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YUludGVyY2hhbmdlQmVhbkFjY2VzcygpLmdldExvb2t1cEtleXNBc3NpZ25tZW50XzEyXzIoKSk7IAorICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NzI5NDoyOiAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUJlYW5fX0xvb2t1cEtleXNBc3NpZ25tZW50XzEyXzIgKSoKKyAgICAgICAgICAgIGxvb3A4MzoKKyAgICAgICAgICAgIGRvIHsKKyAgICAgICAgICAgICAgICBpbnQgYWx0ODM9MjsKKyAgICAgICAgICAgICAgICBpbnQgTEE4M18wID0gaW5wdXQuTEEoMSk7CisKKyAgICAgICAgICAgICAgICBpZiAoIChMQTgzXzA9PTEwMSkgKSB7CisgICAgICAgICAgICAgICAgICAgIGFsdDgzPTE7CisgICAgICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgICAgICBzd2l0Y2ggKGFsdDgzKSB7CisgICAgICAgICAgICAJY2FzZSAxIDoKKyAgICAgICAgICAgIAkgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NzI5NDozOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VCZWFuX19Mb29rdXBLZXlzQXNzaWdubWVudF8xMl8yCisgICAgICAgICAgICAJICAgIHsKKyAgICAgICAgICAgIAkgICAgcHVzaEZvbGxvdyhGT0xMT1dfMzkpOworICAgICAgICAgICAgCSAgICBydWxlX19EYXRhSW50ZXJjaGFuZ2VCZWFuX19Mb29rdXBLZXlzQXNzaWdubWVudF8xMl8yKCk7CisKKyAgICAgICAgICAgIAkgICAgc3RhdGUuX2ZzcC0tOworICAgICAgICAgICAgCSAgICBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOworCisgICAgICAgICAgICAJICAgIH0KKyAgICAgICAgICAgIAkgICAgYnJlYWs7CisKKyAgICAgICAgICAgIAlkZWZhdWx0IDoKKyAgICAgICAgICAgIAkgICAgYnJlYWsgbG9vcDgzOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gd2hpbGUgKHRydWUpOworCisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YUludGVyY2hhbmdlQmVhbkFjY2VzcygpLmdldExvb2t1cEtleXNBc3NpZ25tZW50XzEyXzIoKSk7IAorICAgICAgICAgICAgfQorCisgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgfQorCisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKFJlY29nbml0aW9uRXhjZXB0aW9uIHJlKSB7CisgICAgICAgICAgICByZXBvcnRFcnJvcihyZSk7CisgICAgICAgICAgICByZWNvdmVyKGlucHV0LHJlKTsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKworICAgICAgICAgICAgCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKKworICAgICAgICB9CisgICAgICAgIHJldHVybiA7CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgInJ1bGVfX0RhdGFJbnRlcmNoYW5nZUJlYW5fX0dyb3VwXzEyX18yX19JbXBsIgorCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX0RhdGFJbnRlcmNoYW5nZUJlYW5fX0dyb3VwXzEyX18zIgorICAgIC8vIEludGVybmFsRGF0YURTTC5nOjczMDI6MTogcnVsZV9fRGF0YUludGVyY2hhbmdlQmVhbl9fR3JvdXBfMTJfXzMgOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VCZWFuX19Hcm91cF8xMl9fM19fSW1wbCA7CisgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fRGF0YUludGVyY2hhbmdlQmVhbl9fR3JvdXBfMTJfXzMoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworCisgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICAgICAgCQorICAgICAgICB0cnkgeworICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NzMwNjoxOiAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUJlYW5fX0dyb3VwXzEyX18zX19JbXBsICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjczMDc6MjogcnVsZV9fRGF0YUludGVyY2hhbmdlQmVhbl9fR3JvdXBfMTJfXzNfX0ltcGwKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzIpOworICAgICAgICAgICAgcnVsZV9fRGF0YUludGVyY2hhbmdlQmVhbl9fR3JvdXBfMTJfXzNfX0ltcGwoKTsKKworICAgICAgICAgICAgc3RhdGUuX2ZzcC0tOworICAgICAgICAgICAgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKKworICAgICAgICAgICAgfQorCisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKFJlY29nbml0aW9uRXhjZXB0aW9uIHJlKSB7CisgICAgICAgICAgICByZXBvcnRFcnJvcihyZSk7CisgICAgICAgICAgICByZWNvdmVyKGlucHV0LHJlKTsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKworICAgICAgICAgICAgCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKKworICAgICAgICB9CisgICAgICAgIHJldHVybiA7CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgInJ1bGVfX0RhdGFJbnRlcmNoYW5nZUJlYW5fX0dyb3VwXzEyX18zIgorCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX0RhdGFJbnRlcmNoYW5nZUJlYW5fX0dyb3VwXzEyX18zX19JbXBsIgorICAgIC8vIEludGVybmFsRGF0YURTTC5nOjczMTM6MTogcnVsZV9fRGF0YUludGVyY2hhbmdlQmVhbl9fR3JvdXBfMTJfXzNfX0ltcGwgOiAoICd9JyApIDsKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19EYXRhSW50ZXJjaGFuZ2VCZWFuX19Hcm91cF8xMl9fM19fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisKKyAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgICAgICAJCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo3MzE3OjE6ICggKCAnfScgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo3MzE4OjE6ICggJ30nICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjczMTg6MTogKCAnfScgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NzMxOToyOiAnfScKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YUludGVyY2hhbmdlQmVhbkFjY2VzcygpLmdldFJpZ2h0Q3VybHlCcmFja2V0S2V5d29yZF8xMl8zKCkpOyAKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1hdGNoKGlucHV0LDc2LEZPTExPV18yKTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXREYXRhSW50ZXJjaGFuZ2VCZWFuQWNjZXNzKCkuZ2V0UmlnaHRDdXJseUJyYWNrZXRLZXl3b3JkXzEyXzMoKSk7IAorICAgICAgICAgICAgfQorCisgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgfQorCisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKFJlY29nbml0aW9uRXhjZXB0aW9uIHJlKSB7CisgICAgICAgICAgICByZXBvcnRFcnJvcihyZSk7CisgICAgICAgICAgICByZWNvdmVyKGlucHV0LHJlKTsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKworICAgICAgICAgICAgCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKKworICAgICAgICB9CisgICAgICAgIHJldHVybiA7CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgInJ1bGVfX0RhdGFJbnRlcmNoYW5nZUJlYW5fX0dyb3VwXzEyX18zX19JbXBsIgorCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX0RhdGFJbnRlcmNoYW5nZUJlYW5fX0dyb3VwXzEzX18wIgorICAgIC8vIEludGVybmFsRGF0YURTTC5nOjczMjk6MTogcnVsZV9fRGF0YUludGVyY2hhbmdlQmVhbl9fR3JvdXBfMTNfXzAgOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VCZWFuX19Hcm91cF8xM19fMF9fSW1wbCBydWxlX19EYXRhSW50ZXJjaGFuZ2VCZWFuX19Hcm91cF8xM19fMSA7CisgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fRGF0YUludGVyY2hhbmdlQmVhbl9fR3JvdXBfMTNfXzAoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworCisgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICAgICAgCQorICAgICAgICB0cnkgeworICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NzMzMzoxOiAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUJlYW5fX0dyb3VwXzEzX18wX19JbXBsIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUJlYW5fX0dyb3VwXzEzX18xICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjczMzQ6MjogcnVsZV9fRGF0YUludGVyY2hhbmdlQmVhbl9fR3JvdXBfMTNfXzBfX0ltcGwgcnVsZV9fRGF0YUludGVyY2hhbmdlQmVhbl9fR3JvdXBfMTNfXzEKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzEwKTsKKyAgICAgICAgICAgIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUJlYW5fX0dyb3VwXzEzX18wX19JbXBsKCk7CisKKyAgICAgICAgICAgIHN0YXRlLl9mc3AtLTsKKyAgICAgICAgICAgIGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CisgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV18yKTsKKyAgICAgICAgICAgIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUJlYW5fX0dyb3VwXzEzX18xKCk7CisKKyAgICAgICAgICAgIHN0YXRlLl9mc3AtLTsKKyAgICAgICAgICAgIGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CisKKyAgICAgICAgICAgIH0KKworICAgICAgICB9CisgICAgICAgIGNhdGNoIChSZWNvZ25pdGlvbkV4Y2VwdGlvbiByZSkgeworICAgICAgICAgICAgcmVwb3J0RXJyb3IocmUpOworICAgICAgICAgICAgcmVjb3ZlcihpbnB1dCxyZSk7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisKKyAgICAgICAgICAgIAlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7CisKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gOworICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJydWxlX19EYXRhSW50ZXJjaGFuZ2VCZWFuX19Hcm91cF8xM19fMCIKKworCisgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19EYXRhSW50ZXJjaGFuZ2VCZWFuX19Hcm91cF8xM19fMF9fSW1wbCIKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo3MzQxOjE6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUJlYW5fX0dyb3VwXzEzX18wX19JbXBsIDogKCAnZXhwb3J0RmlsdGVyJyApIDsKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19EYXRhSW50ZXJjaGFuZ2VCZWFuX19Hcm91cF8xM19fMF9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisKKyAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgICAgICAJCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo3MzQ1OjE6ICggKCAnZXhwb3J0RmlsdGVyJyApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjczNDY6MTogKCAnZXhwb3J0RmlsdGVyJyApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo3MzQ2OjE6ICggJ2V4cG9ydEZpbHRlcicgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NzM0NzoyOiAnZXhwb3J0RmlsdGVyJworICAgICAgICAgICAgeworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXREYXRhSW50ZXJjaGFuZ2VCZWFuQWNjZXNzKCkuZ2V0RXhwb3J0RmlsdGVyS2V5d29yZF8xM18wKCkpOyAKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1hdGNoKGlucHV0LDEwMCxGT0xMT1dfMik7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YUludGVyY2hhbmdlQmVhbkFjY2VzcygpLmdldEV4cG9ydEZpbHRlcktleXdvcmRfMTNfMCgpKTsgCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICB9CisKKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoUmVjb2duaXRpb25FeGNlcHRpb24gcmUpIHsKKyAgICAgICAgICAgIHJlcG9ydEVycm9yKHJlKTsKKyAgICAgICAgICAgIHJlY292ZXIoaW5wdXQscmUpOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworCisgICAgICAgICAgICAJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworCisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIDsKKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAicnVsZV9fRGF0YUludGVyY2hhbmdlQmVhbl9fR3JvdXBfMTNfXzBfX0ltcGwiCisKKworICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fRGF0YUludGVyY2hhbmdlQmVhbl9fR3JvdXBfMTNfXzEiCisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NzM1NjoxOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VCZWFuX19Hcm91cF8xM19fMSA6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUJlYW5fX0dyb3VwXzEzX18xX19JbXBsIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUJlYW5fX0dyb3VwXzEzX18yIDsKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19EYXRhSW50ZXJjaGFuZ2VCZWFuX19Hcm91cF8xM19fMSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisKKyAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgICAgICAJCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo3MzYwOjE6ICggcnVsZV9fRGF0YUludGVyY2hhbmdlQmVhbl9fR3JvdXBfMTNfXzFfX0ltcGwgcnVsZV9fRGF0YUludGVyY2hhbmdlQmVhbl9fR3JvdXBfMTNfXzIgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NzM2MToyOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VCZWFuX19Hcm91cF8xM19fMV9fSW1wbCBydWxlX19EYXRhSW50ZXJjaGFuZ2VCZWFuX19Hcm91cF8xM19fMgorICAgICAgICAgICAgeworICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfNDApOworICAgICAgICAgICAgcnVsZV9fRGF0YUludGVyY2hhbmdlQmVhbl9fR3JvdXBfMTNfXzFfX0ltcGwoKTsKKworICAgICAgICAgICAgc3RhdGUuX2ZzcC0tOworICAgICAgICAgICAgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKKyAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzIpOworICAgICAgICAgICAgcnVsZV9fRGF0YUludGVyY2hhbmdlQmVhbl9fR3JvdXBfMTNfXzIoKTsKKworICAgICAgICAgICAgc3RhdGUuX2ZzcC0tOworICAgICAgICAgICAgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKKworICAgICAgICAgICAgfQorCisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKFJlY29nbml0aW9uRXhjZXB0aW9uIHJlKSB7CisgICAgICAgICAgICByZXBvcnRFcnJvcihyZSk7CisgICAgICAgICAgICByZWNvdmVyKGlucHV0LHJlKTsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKworICAgICAgICAgICAgCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKKworICAgICAgICB9CisgICAgICAgIHJldHVybiA7CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgInJ1bGVfX0RhdGFJbnRlcmNoYW5nZUJlYW5fX0dyb3VwXzEzX18xIgorCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX0RhdGFJbnRlcmNoYW5nZUJlYW5fX0dyb3VwXzEzX18xX19JbXBsIgorICAgIC8vIEludGVybmFsRGF0YURTTC5nOjczNjg6MTogcnVsZV9fRGF0YUludGVyY2hhbmdlQmVhbl9fR3JvdXBfMTNfXzFfX0ltcGwgOiAoICd7JyApIDsKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19EYXRhSW50ZXJjaGFuZ2VCZWFuX19Hcm91cF8xM19fMV9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisKKyAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgICAgICAJCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo3MzcyOjE6ICggKCAneycgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo3MzczOjE6ICggJ3snICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjczNzM6MTogKCAneycgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NzM3NDoyOiAneycKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YUludGVyY2hhbmdlQmVhbkFjY2VzcygpLmdldExlZnRDdXJseUJyYWNrZXRLZXl3b3JkXzEzXzEoKSk7IAorICAgICAgICAgICAgfQorICAgICAgICAgICAgbWF0Y2goaW5wdXQsNzUsRk9MTE9XXzIpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBhZnRlcihncmFtbWFyQWNjZXNzLmdldERhdGFJbnRlcmNoYW5nZUJlYW5BY2Nlc3MoKS5nZXRMZWZ0Q3VybHlCcmFja2V0S2V5d29yZF8xM18xKCkpOyAKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgIH0KKworICAgICAgICB9CisgICAgICAgIGNhdGNoIChSZWNvZ25pdGlvbkV4Y2VwdGlvbiByZSkgeworICAgICAgICAgICAgcmVwb3J0RXJyb3IocmUpOworICAgICAgICAgICAgcmVjb3ZlcihpbnB1dCxyZSk7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisKKyAgICAgICAgICAgIAlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7CisKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gOworICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJydWxlX19EYXRhSW50ZXJjaGFuZ2VCZWFuX19Hcm91cF8xM19fMV9fSW1wbCIKKworCisgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19EYXRhSW50ZXJjaGFuZ2VCZWFuX19Hcm91cF8xM19fMiIKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo3MzgzOjE6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUJlYW5fX0dyb3VwXzEzX18yIDogcnVsZV9fRGF0YUludGVyY2hhbmdlQmVhbl9fR3JvdXBfMTNfXzJfX0ltcGwgcnVsZV9fRGF0YUludGVyY2hhbmdlQmVhbl9fR3JvdXBfMTNfXzMgOworICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUJlYW5fX0dyb3VwXzEzX18yKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKworICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgICAgIAkKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjczODc6MTogKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VCZWFuX19Hcm91cF8xM19fMl9fSW1wbCBydWxlX19EYXRhSW50ZXJjaGFuZ2VCZWFuX19Hcm91cF8xM19fMyApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo3Mzg4OjI6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUJlYW5fX0dyb3VwXzEzX18yX19JbXBsIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUJlYW5fX0dyb3VwXzEzX18zCisgICAgICAgICAgICB7CisgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV180MSk7CisgICAgICAgICAgICBydWxlX19EYXRhSW50ZXJjaGFuZ2VCZWFuX19Hcm91cF8xM19fMl9fSW1wbCgpOworCisgICAgICAgICAgICBzdGF0ZS5fZnNwLS07CisgICAgICAgICAgICBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOworICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMik7CisgICAgICAgICAgICBydWxlX19EYXRhSW50ZXJjaGFuZ2VCZWFuX19Hcm91cF8xM19fMygpOworCisgICAgICAgICAgICBzdGF0ZS5fZnNwLS07CisgICAgICAgICAgICBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOworCisgICAgICAgICAgICB9CisKKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoUmVjb2duaXRpb25FeGNlcHRpb24gcmUpIHsKKyAgICAgICAgICAgIHJlcG9ydEVycm9yKHJlKTsKKyAgICAgICAgICAgIHJlY292ZXIoaW5wdXQscmUpOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworCisgICAgICAgICAgICAJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworCisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIDsKKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAicnVsZV9fRGF0YUludGVyY2hhbmdlQmVhbl9fR3JvdXBfMTNfXzIiCisKKworICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fRGF0YUludGVyY2hhbmdlQmVhbl9fR3JvdXBfMTNfXzJfX0ltcGwiCisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NzM5NToxOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VCZWFuX19Hcm91cF8xM19fMl9fSW1wbCA6ICggKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VCZWFuX19FeHBvcnRGaWx0ZXJBc3NpZ25tZW50XzEzXzIgKSApIDsKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19EYXRhSW50ZXJjaGFuZ2VCZWFuX19Hcm91cF8xM19fMl9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisKKyAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgICAgICAJCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo3Mzk5OjE6ICggKCAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUJlYW5fX0V4cG9ydEZpbHRlckFzc2lnbm1lbnRfMTNfMiApICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NzQwMDoxOiAoICggcnVsZV9fRGF0YUludGVyY2hhbmdlQmVhbl9fRXhwb3J0RmlsdGVyQXNzaWdubWVudF8xM18yICkgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NzQwMDoxOiAoICggcnVsZV9fRGF0YUludGVyY2hhbmdlQmVhbl9fRXhwb3J0RmlsdGVyQXNzaWdubWVudF8xM18yICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NzQwMToyOiAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUJlYW5fX0V4cG9ydEZpbHRlckFzc2lnbm1lbnRfMTNfMiApCisgICAgICAgICAgICB7CisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldERhdGFJbnRlcmNoYW5nZUJlYW5BY2Nlc3MoKS5nZXRFeHBvcnRGaWx0ZXJBc3NpZ25tZW50XzEzXzIoKSk7IAorICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NzQwMjoyOiAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUJlYW5fX0V4cG9ydEZpbHRlckFzc2lnbm1lbnRfMTNfMiApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo3NDAyOjM6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUJlYW5fX0V4cG9ydEZpbHRlckFzc2lnbm1lbnRfMTNfMgorICAgICAgICAgICAgeworICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMik7CisgICAgICAgICAgICBydWxlX19EYXRhSW50ZXJjaGFuZ2VCZWFuX19FeHBvcnRGaWx0ZXJBc3NpZ25tZW50XzEzXzIoKTsKKworICAgICAgICAgICAgc3RhdGUuX2ZzcC0tOworICAgICAgICAgICAgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YUludGVyY2hhbmdlQmVhbkFjY2VzcygpLmdldEV4cG9ydEZpbHRlckFzc2lnbm1lbnRfMTNfMigpKTsgCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICB9CisKKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoUmVjb2duaXRpb25FeGNlcHRpb24gcmUpIHsKKyAgICAgICAgICAgIHJlcG9ydEVycm9yKHJlKTsKKyAgICAgICAgICAgIHJlY292ZXIoaW5wdXQscmUpOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworCisgICAgICAgICAgICAJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworCisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIDsKKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAicnVsZV9fRGF0YUludGVyY2hhbmdlQmVhbl9fR3JvdXBfMTNfXzJfX0ltcGwiCisKKworICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fRGF0YUludGVyY2hhbmdlQmVhbl9fR3JvdXBfMTNfXzMiCisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NzQxMDoxOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VCZWFuX19Hcm91cF8xM19fMyA6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUJlYW5fX0dyb3VwXzEzX18zX19JbXBsIDsKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19EYXRhSW50ZXJjaGFuZ2VCZWFuX19Hcm91cF8xM19fMygpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisKKyAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgICAgICAJCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo3NDE0OjE6ICggcnVsZV9fRGF0YUludGVyY2hhbmdlQmVhbl9fR3JvdXBfMTNfXzNfX0ltcGwgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NzQxNToyOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VCZWFuX19Hcm91cF8xM19fM19fSW1wbAorICAgICAgICAgICAgeworICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMik7CisgICAgICAgICAgICBydWxlX19EYXRhSW50ZXJjaGFuZ2VCZWFuX19Hcm91cF8xM19fM19fSW1wbCgpOworCisgICAgICAgICAgICBzdGF0ZS5fZnNwLS07CisgICAgICAgICAgICBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOworCisgICAgICAgICAgICB9CisKKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoUmVjb2duaXRpb25FeGNlcHRpb24gcmUpIHsKKyAgICAgICAgICAgIHJlcG9ydEVycm9yKHJlKTsKKyAgICAgICAgICAgIHJlY292ZXIoaW5wdXQscmUpOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworCisgICAgICAgICAgICAJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworCisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIDsKKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAicnVsZV9fRGF0YUludGVyY2hhbmdlQmVhbl9fR3JvdXBfMTNfXzMiCisKKworICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fRGF0YUludGVyY2hhbmdlQmVhbl9fR3JvdXBfMTNfXzNfX0ltcGwiCisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NzQyMToxOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VCZWFuX19Hcm91cF8xM19fM19fSW1wbCA6ICggJ30nICkgOworICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUJlYW5fX0dyb3VwXzEzX18zX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKworICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgICAgIAkKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjc0MjU6MTogKCAoICd9JyApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjc0MjY6MTogKCAnfScgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NzQyNjoxOiAoICd9JyApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo3NDI3OjI6ICd9JworICAgICAgICAgICAgeworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXREYXRhSW50ZXJjaGFuZ2VCZWFuQWNjZXNzKCkuZ2V0UmlnaHRDdXJseUJyYWNrZXRLZXl3b3JkXzEzXzMoKSk7IAorICAgICAgICAgICAgfQorICAgICAgICAgICAgbWF0Y2goaW5wdXQsNzYsRk9MTE9XXzIpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBhZnRlcihncmFtbWFyQWNjZXNzLmdldERhdGFJbnRlcmNoYW5nZUJlYW5BY2Nlc3MoKS5nZXRSaWdodEN1cmx5QnJhY2tldEtleXdvcmRfMTNfMygpKTsgCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICB9CisKKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoUmVjb2duaXRpb25FeGNlcHRpb24gcmUpIHsKKyAgICAgICAgICAgIHJlcG9ydEVycm9yKHJlKTsKKyAgICAgICAgICAgIHJlY292ZXIoaW5wdXQscmUpOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworCisgICAgICAgICAgICAJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworCisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIDsKKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAicnVsZV9fRGF0YUludGVyY2hhbmdlQmVhbl9fR3JvdXBfMTNfXzNfX0ltcGwiCisKKwogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fRGF0YUludGVyY2hhbmdlS2V5X19Hcm91cF9fMCIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo2ODI4OjE6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUtleV9fR3JvdXBfXzAgOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VLZXlfX0dyb3VwX18wX19JbXBsIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUtleV9fR3JvdXBfXzEgOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjc0Mzc6MTogcnVsZV9fRGF0YUludGVyY2hhbmdlS2V5X19Hcm91cF9fMCA6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUtleV9fR3JvdXBfXzBfX0ltcGwgcnVsZV9fRGF0YUludGVyY2hhbmdlS2V5X19Hcm91cF9fMSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fRGF0YUludGVyY2hhbmdlS2V5X19Hcm91cF9fMCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo2ODMyOjE6ICggcnVsZV9fRGF0YUludGVyY2hhbmdlS2V5X19Hcm91cF9fMF9fSW1wbCBydWxlX19EYXRhSW50ZXJjaGFuZ2VLZXlfX0dyb3VwX18xICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjY4MzM6MjogcnVsZV9fRGF0YUludGVyY2hhbmdlS2V5X19Hcm91cF9fMF9fSW1wbCBydWxlX19EYXRhSW50ZXJjaGFuZ2VLZXlfX0dyb3VwX18xCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo3NDQxOjE6ICggcnVsZV9fRGF0YUludGVyY2hhbmdlS2V5X19Hcm91cF9fMF9fSW1wbCBydWxlX19EYXRhSW50ZXJjaGFuZ2VLZXlfX0dyb3VwX18xICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjc0NDI6MjogcnVsZV9fRGF0YUludGVyY2hhbmdlS2V5X19Hcm91cF9fMF9fSW1wbCBydWxlX19EYXRhSW50ZXJjaGFuZ2VLZXlfX0dyb3VwX18xCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV18zOCk7CisgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV180Mik7CiAgICAgICAgICAgICBydWxlX19EYXRhSW50ZXJjaGFuZ2VLZXlfX0dyb3VwX18wX19JbXBsKCk7CiAKICAgICAgICAgICAgIHN0YXRlLl9mc3AtLTsKQEAgLTIzOTg1LDIzICsyNjE0MiwyMyBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX0RhdGFJbnRlcmNoYW5nZUtleV9fR3JvdXBfXzBfX0ltcGwiCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6Njg0MDoxOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VLZXlfX0dyb3VwX18wX19JbXBsIDogKCAoKSApIDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo3NDQ5OjE6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUtleV9fR3JvdXBfXzBfX0ltcGwgOiAoICgpICkgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUtleV9fR3JvdXBfXzBfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6Njg0NDoxOiAoICggKCkgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo2ODQ1OjE6ICggKCkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NzQ1MzoxOiAoICggKCkgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo3NDU0OjE6ICggKCkgKQogICAgICAgICAgICAgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6Njg0NToxOiAoICgpICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjY4NDY6MjogKCkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjc0NTQ6MTogKCAoKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo3NDU1OjI6ICgpCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldERhdGFJbnRlcmNoYW5nZUtleUFjY2VzcygpLmdldERhdGFJbnRlcmNoYW5nZUtleUFjdGlvbl8wKCkpOyAKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjY4NDc6MjogKCkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjY4NDc6MzogCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo3NDU2OjI6ICgpCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo3NDU2OjM6IAogICAgICAgICAgICAgewogICAgICAgICAgICAgfQogCkBAIC0yNDAyNiwxNCArMjYxODMsMTQgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19EYXRhSW50ZXJjaGFuZ2VLZXlfX0dyb3VwX18xIgotICAgIC8vIEludGVybmFsRGF0YURTTC5nOjY4NTU6MTogcnVsZV9fRGF0YUludGVyY2hhbmdlS2V5X19Hcm91cF9fMSA6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUtleV9fR3JvdXBfXzFfX0ltcGwgcnVsZV9fRGF0YUludGVyY2hhbmdlS2V5X19Hcm91cF9fMiA7CisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NzQ2NDoxOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VLZXlfX0dyb3VwX18xIDogcnVsZV9fRGF0YUludGVyY2hhbmdlS2V5X19Hcm91cF9fMV9fSW1wbCBydWxlX19EYXRhSW50ZXJjaGFuZ2VLZXlfX0dyb3VwX18yIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19EYXRhSW50ZXJjaGFuZ2VLZXlfX0dyb3VwX18xKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjY4NTk6MTogKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VLZXlfX0dyb3VwX18xX19JbXBsIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUtleV9fR3JvdXBfXzIgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6Njg2MDoyOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VLZXlfX0dyb3VwX18xX19JbXBsIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUtleV9fR3JvdXBfXzIKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjc0Njg6MTogKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VLZXlfX0dyb3VwX18xX19JbXBsIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUtleV9fR3JvdXBfXzIgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NzQ2OToyOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VLZXlfX0dyb3VwX18xX19JbXBsIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUtleV9fR3JvdXBfXzIKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzcpOwogICAgICAgICAgICAgcnVsZV9fRGF0YUludGVyY2hhbmdlS2V5X19Hcm91cF9fMV9fSW1wbCgpOwpAQCAtMjQwNjQsMjIgKzI2MjIxLDIyIEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fRGF0YUludGVyY2hhbmdlS2V5X19Hcm91cF9fMV9fSW1wbCIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo2ODY3OjE6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUtleV9fR3JvdXBfXzFfX0ltcGwgOiAoICdrZXknICkgOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjc0NzY6MTogcnVsZV9fRGF0YUludGVyY2hhbmdlS2V5X19Hcm91cF9fMV9fSW1wbCA6ICggJ2tleScgKSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fRGF0YUludGVyY2hhbmdlS2V5X19Hcm91cF9fMV9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo2ODcxOjE6ICggKCAna2V5JyApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjY4NzI6MTogKCAna2V5JyApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo3NDgwOjE6ICggKCAna2V5JyApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjc0ODE6MTogKCAna2V5JyApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo2ODcyOjE6ICggJ2tleScgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6Njg3MzoyOiAna2V5JworICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NzQ4MToxOiAoICdrZXknICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjc0ODI6MjogJ2tleScKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YUludGVyY2hhbmdlS2V5QWNjZXNzKCkuZ2V0S2V5S2V5d29yZF8xKCkpOyAKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1hdGNoKGlucHV0LDk0LEZPTExPV18yKTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKKyAgICAgICAgICAgIG1hdGNoKGlucHV0LDEwMSxGT0xMT1dfMik7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YUludGVyY2hhbmdlS2V5QWNjZXNzKCkuZ2V0S2V5S2V5d29yZF8xKCkpOyAKICAgICAgICAgICAgIH0KQEAgLTI0MTA1LDE0ICsyNjI2MiwxNCBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX0RhdGFJbnRlcmNoYW5nZUtleV9fR3JvdXBfXzIiCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6Njg4MjoxOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VLZXlfX0dyb3VwX18yIDogcnVsZV9fRGF0YUludGVyY2hhbmdlS2V5X19Hcm91cF9fMl9fSW1wbCA7CisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NzQ5MToxOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VLZXlfX0dyb3VwX18yIDogcnVsZV9fRGF0YUludGVyY2hhbmdlS2V5X19Hcm91cF9fMl9fSW1wbCA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fRGF0YUludGVyY2hhbmdlS2V5X19Hcm91cF9fMigpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo2ODg2OjE6ICggcnVsZV9fRGF0YUludGVyY2hhbmdlS2V5X19Hcm91cF9fMl9fSW1wbCApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo2ODg3OjI6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUtleV9fR3JvdXBfXzJfX0ltcGwKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjc0OTU6MTogKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VLZXlfX0dyb3VwX18yX19JbXBsICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjc0OTY6MjogcnVsZV9fRGF0YUludGVyY2hhbmdlS2V5X19Hcm91cF9fMl9fSW1wbAogICAgICAgICAgICAgewogICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMik7CiAgICAgICAgICAgICBydWxlX19EYXRhSW50ZXJjaGFuZ2VLZXlfX0dyb3VwX18yX19JbXBsKCk7CkBAIC0yNDEzOCwyMyArMjYyOTUsMjMgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19EYXRhSW50ZXJjaGFuZ2VLZXlfX0dyb3VwX18yX19JbXBsIgotICAgIC8vIEludGVybmFsRGF0YURTTC5nOjY4OTM6MTogcnVsZV9fRGF0YUludGVyY2hhbmdlS2V5X19Hcm91cF9fMl9fSW1wbCA6ICggKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VLZXlfX1Byb3BlcnR5QXNzaWdubWVudF8yICkgKSA7CisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NzUwMjoxOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VLZXlfX0dyb3VwX18yX19JbXBsIDogKCAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUtleV9fUHJvcGVydHlBc3NpZ25tZW50XzIgKSApIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19EYXRhSW50ZXJjaGFuZ2VLZXlfX0dyb3VwX18yX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjY4OTc6MTogKCAoICggcnVsZV9fRGF0YUludGVyY2hhbmdlS2V5X19Qcm9wZXJ0eUFzc2lnbm1lbnRfMiApICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6Njg5ODoxOiAoICggcnVsZV9fRGF0YUludGVyY2hhbmdlS2V5X19Qcm9wZXJ0eUFzc2lnbm1lbnRfMiApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjc1MDY6MTogKCAoICggcnVsZV9fRGF0YUludGVyY2hhbmdlS2V5X19Qcm9wZXJ0eUFzc2lnbm1lbnRfMiApICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NzUwNzoxOiAoICggcnVsZV9fRGF0YUludGVyY2hhbmdlS2V5X19Qcm9wZXJ0eUFzc2lnbm1lbnRfMiApICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjY4OTg6MTogKCAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUtleV9fUHJvcGVydHlBc3NpZ25tZW50XzIgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo2ODk5OjI6ICggcnVsZV9fRGF0YUludGVyY2hhbmdlS2V5X19Qcm9wZXJ0eUFzc2lnbm1lbnRfMiApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo3NTA3OjE6ICggKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VLZXlfX1Byb3BlcnR5QXNzaWdubWVudF8yICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NzUwODoyOiAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUtleV9fUHJvcGVydHlBc3NpZ25tZW50XzIgKQogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXREYXRhSW50ZXJjaGFuZ2VLZXlBY2Nlc3MoKS5nZXRQcm9wZXJ0eUFzc2lnbm1lbnRfMigpKTsgCiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo2OTAwOjI6ICggcnVsZV9fRGF0YUludGVyY2hhbmdlS2V5X19Qcm9wZXJ0eUFzc2lnbm1lbnRfMiApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo2OTAwOjM6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUtleV9fUHJvcGVydHlBc3NpZ25tZW50XzIKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjc1MDk6MjogKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VLZXlfX1Byb3BlcnR5QXNzaWdubWVudF8yICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjc1MDk6MzogcnVsZV9fRGF0YUludGVyY2hhbmdlS2V5X19Qcm9wZXJ0eUFzc2lnbm1lbnRfMgogICAgICAgICAgICAgewogICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMik7CiAgICAgICAgICAgICBydWxlX19EYXRhSW50ZXJjaGFuZ2VLZXlfX1Byb3BlcnR5QXNzaWdubWVudF8yKCk7CkBAIC0yNDE4OSwxNiArMjYzNDYsMTYgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19EYXRhSW50ZXJjaGFuZ2VMb29rdXBfX0dyb3VwX18wIgotICAgIC8vIEludGVybmFsRGF0YURTTC5nOjY5MDk6MTogcnVsZV9fRGF0YUludGVyY2hhbmdlTG9va3VwX19Hcm91cF9fMCA6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUxvb2t1cF9fR3JvdXBfXzBfX0ltcGwgcnVsZV9fRGF0YUludGVyY2hhbmdlTG9va3VwX19Hcm91cF9fMSA7CisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NzUxODoxOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VMb29rdXBfX0dyb3VwX18wIDogcnVsZV9fRGF0YUludGVyY2hhbmdlTG9va3VwX19Hcm91cF9fMF9fSW1wbCBydWxlX19EYXRhSW50ZXJjaGFuZ2VMb29rdXBfX0dyb3VwX18xIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19EYXRhSW50ZXJjaGFuZ2VMb29rdXBfX0dyb3VwX18wKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjY5MTM6MTogKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VMb29rdXBfX0dyb3VwX18wX19JbXBsIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUxvb2t1cF9fR3JvdXBfXzEgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NjkxNDoyOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VMb29rdXBfX0dyb3VwX18wX19JbXBsIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUxvb2t1cF9fR3JvdXBfXzEKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjc1MjI6MTogKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VMb29rdXBfX0dyb3VwX18wX19JbXBsIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUxvb2t1cF9fR3JvdXBfXzEgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NzUyMzoyOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VMb29rdXBfX0dyb3VwX18wX19JbXBsIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUxvb2t1cF9fR3JvdXBfXzEKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzM5KTsKKyAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzQzKTsKICAgICAgICAgICAgIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUxvb2t1cF9fR3JvdXBfXzBfX0ltcGwoKTsKIAogICAgICAgICAgICAgc3RhdGUuX2ZzcC0tOwpAQCAtMjQyMjcsMjMgKzI2Mzg0LDIzIEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fRGF0YUludGVyY2hhbmdlTG9va3VwX19Hcm91cF9fMF9fSW1wbCIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo2OTIxOjE6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUxvb2t1cF9fR3JvdXBfXzBfX0ltcGwgOiAoICgpICkgOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjc1MzA6MTogcnVsZV9fRGF0YUludGVyY2hhbmdlTG9va3VwX19Hcm91cF9fMF9fSW1wbCA6ICggKCkgKSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fRGF0YUludGVyY2hhbmdlTG9va3VwX19Hcm91cF9fMF9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo2OTI1OjE6ICggKCAoKSApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjY5MjY6MTogKCAoKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo3NTM0OjE6ICggKCAoKSApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjc1MzU6MTogKCAoKSApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo2OTI2OjE6ICggKCkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NjkyNzoyOiAoKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NzUzNToxOiAoICgpICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjc1MzY6MjogKCkKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YUludGVyY2hhbmdlTG9va3VwQWNjZXNzKCkuZ2V0RGF0YUludGVyY2hhbmdlTG9va3VwQWN0aW9uXzAoKSk7IAogICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NjkyODoyOiAoKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NjkyODozOiAKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjc1Mzc6MjogKCkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjc1Mzc6MzogCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICB9CiAKQEAgLTI0MjY4LDE0ICsyNjQyNSwxNCBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX0RhdGFJbnRlcmNoYW5nZUxvb2t1cF9fR3JvdXBfXzEiCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NjkzNjoxOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VMb29rdXBfX0dyb3VwX18xIDogcnVsZV9fRGF0YUludGVyY2hhbmdlTG9va3VwX19Hcm91cF9fMV9fSW1wbCBydWxlX19EYXRhSW50ZXJjaGFuZ2VMb29rdXBfX0dyb3VwX18yIDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo3NTQ1OjE6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUxvb2t1cF9fR3JvdXBfXzEgOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VMb29rdXBfX0dyb3VwX18xX19JbXBsIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUxvb2t1cF9fR3JvdXBfXzIgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUxvb2t1cF9fR3JvdXBfXzEoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6Njk0MDoxOiAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUxvb2t1cF9fR3JvdXBfXzFfX0ltcGwgcnVsZV9fRGF0YUludGVyY2hhbmdlTG9va3VwX19Hcm91cF9fMiApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo2OTQxOjI6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUxvb2t1cF9fR3JvdXBfXzFfX0ltcGwgcnVsZV9fRGF0YUludGVyY2hhbmdlTG9va3VwX19Hcm91cF9fMgorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NzU0OToxOiAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUxvb2t1cF9fR3JvdXBfXzFfX0ltcGwgcnVsZV9fRGF0YUludGVyY2hhbmdlTG9va3VwX19Hcm91cF9fMiApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo3NTUwOjI6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUxvb2t1cF9fR3JvdXBfXzFfX0ltcGwgcnVsZV9fRGF0YUludGVyY2hhbmdlTG9va3VwX19Hcm91cF9fMgogICAgICAgICAgICAgewogICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfNyk7CiAgICAgICAgICAgICBydWxlX19EYXRhSW50ZXJjaGFuZ2VMb29rdXBfX0dyb3VwX18xX19JbXBsKCk7CkBAIC0yNDMwNiwyMiArMjY0NjMsMjIgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19EYXRhSW50ZXJjaGFuZ2VMb29rdXBfX0dyb3VwX18xX19JbXBsIgotICAgIC8vIEludGVybmFsRGF0YURTTC5nOjY5NDg6MTogcnVsZV9fRGF0YUludGVyY2hhbmdlTG9va3VwX19Hcm91cF9fMV9fSW1wbCA6ICggJ2ZvcicgKSA7CisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NzU1NzoxOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VMb29rdXBfX0dyb3VwX18xX19JbXBsIDogKCAnZm9yJyApIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19EYXRhSW50ZXJjaGFuZ2VMb29rdXBfX0dyb3VwX18xX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjY5NTI6MTogKCAoICdmb3InICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6Njk1MzoxOiAoICdmb3InICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjc1NjE6MTogKCAoICdmb3InICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NzU2MjoxOiAoICdmb3InICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjY5NTM6MTogKCAnZm9yJyApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo2OTU0OjI6ICdmb3InCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo3NTYyOjE6ICggJ2ZvcicgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NzU2MzoyOiAnZm9yJwogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXREYXRhSW50ZXJjaGFuZ2VMb29rdXBBY2Nlc3MoKS5nZXRGb3JLZXl3b3JkXzEoKSk7IAogICAgICAgICAgICAgfQotICAgICAgICAgICAgbWF0Y2goaW5wdXQsOTUsRk9MTE9XXzIpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOworICAgICAgICAgICAgbWF0Y2goaW5wdXQsMTAyLEZPTExPV18yKTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXREYXRhSW50ZXJjaGFuZ2VMb29rdXBBY2Nlc3MoKS5nZXRGb3JLZXl3b3JkXzEoKSk7IAogICAgICAgICAgICAgfQpAQCAtMjQzNDcsMTYgKzI2NTA0LDE2IEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fRGF0YUludGVyY2hhbmdlTG9va3VwX19Hcm91cF9fMiIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo2OTYzOjE6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUxvb2t1cF9fR3JvdXBfXzIgOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VMb29rdXBfX0dyb3VwX18yX19JbXBsIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUxvb2t1cF9fR3JvdXBfXzMgOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjc1NzI6MTogcnVsZV9fRGF0YUludGVyY2hhbmdlTG9va3VwX19Hcm91cF9fMiA6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUxvb2t1cF9fR3JvdXBfXzJfX0ltcGwgcnVsZV9fRGF0YUludGVyY2hhbmdlTG9va3VwX19Hcm91cF9fMyA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fRGF0YUludGVyY2hhbmdlTG9va3VwX19Hcm91cF9fMigpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo2OTY3OjE6ICggcnVsZV9fRGF0YUludGVyY2hhbmdlTG9va3VwX19Hcm91cF9fMl9fSW1wbCBydWxlX19EYXRhSW50ZXJjaGFuZ2VMb29rdXBfX0dyb3VwX18zICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjY5Njg6MjogcnVsZV9fRGF0YUludGVyY2hhbmdlTG9va3VwX19Hcm91cF9fMl9fSW1wbCBydWxlX19EYXRhSW50ZXJjaGFuZ2VMb29rdXBfX0dyb3VwX18zCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo3NTc2OjE6ICggcnVsZV9fRGF0YUludGVyY2hhbmdlTG9va3VwX19Hcm91cF9fMl9fSW1wbCBydWxlX19EYXRhSW50ZXJjaGFuZ2VMb29rdXBfX0dyb3VwX18zICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjc1Nzc6MjogcnVsZV9fRGF0YUludGVyY2hhbmdlTG9va3VwX19Hcm91cF9fMl9fSW1wbCBydWxlX19EYXRhSW50ZXJjaGFuZ2VMb29rdXBfX0dyb3VwX18zCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV180MCk7CisgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV180NCk7CiAgICAgICAgICAgICBydWxlX19EYXRhSW50ZXJjaGFuZ2VMb29rdXBfX0dyb3VwX18yX19JbXBsKCk7CiAKICAgICAgICAgICAgIHN0YXRlLl9mc3AtLTsKQEAgLTI0Mzg1LDIzICsyNjU0MiwyMyBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX0RhdGFJbnRlcmNoYW5nZUxvb2t1cF9fR3JvdXBfXzJfX0ltcGwiCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6Njk3NToxOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VMb29rdXBfX0dyb3VwX18yX19JbXBsIDogKCAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUxvb2t1cF9fVGFyZ2V0UHJvcGVydHlBc3NpZ25tZW50XzIgKSApIDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo3NTg0OjE6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUxvb2t1cF9fR3JvdXBfXzJfX0ltcGwgOiAoICggcnVsZV9fRGF0YUludGVyY2hhbmdlTG9va3VwX19UYXJnZXRQcm9wZXJ0eUFzc2lnbm1lbnRfMiApICkgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUxvb2t1cF9fR3JvdXBfXzJfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6Njk3OToxOiAoICggKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VMb29rdXBfX1RhcmdldFByb3BlcnR5QXNzaWdubWVudF8yICkgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo2OTgwOjE6ICggKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VMb29rdXBfX1RhcmdldFByb3BlcnR5QXNzaWdubWVudF8yICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NzU4ODoxOiAoICggKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VMb29rdXBfX1RhcmdldFByb3BlcnR5QXNzaWdubWVudF8yICkgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo3NTg5OjE6ICggKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VMb29rdXBfX1RhcmdldFByb3BlcnR5QXNzaWdubWVudF8yICkgKQogICAgICAgICAgICAgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6Njk4MDoxOiAoICggcnVsZV9fRGF0YUludGVyY2hhbmdlTG9va3VwX19UYXJnZXRQcm9wZXJ0eUFzc2lnbm1lbnRfMiApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjY5ODE6MjogKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VMb29rdXBfX1RhcmdldFByb3BlcnR5QXNzaWdubWVudF8yICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjc1ODk6MTogKCAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUxvb2t1cF9fVGFyZ2V0UHJvcGVydHlBc3NpZ25tZW50XzIgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo3NTkwOjI6ICggcnVsZV9fRGF0YUludGVyY2hhbmdlTG9va3VwX19UYXJnZXRQcm9wZXJ0eUFzc2lnbm1lbnRfMiApCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldERhdGFJbnRlcmNoYW5nZUxvb2t1cEFjY2VzcygpLmdldFRhcmdldFByb3BlcnR5QXNzaWdubWVudF8yKCkpOyAKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjY5ODI6MjogKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VMb29rdXBfX1RhcmdldFByb3BlcnR5QXNzaWdubWVudF8yICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjY5ODI6MzogcnVsZV9fRGF0YUludGVyY2hhbmdlTG9va3VwX19UYXJnZXRQcm9wZXJ0eUFzc2lnbm1lbnRfMgorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NzU5MToyOiAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUxvb2t1cF9fVGFyZ2V0UHJvcGVydHlBc3NpZ25tZW50XzIgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NzU5MTozOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VMb29rdXBfX1RhcmdldFByb3BlcnR5QXNzaWdubWVudF8yCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV18yKTsKICAgICAgICAgICAgIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUxvb2t1cF9fVGFyZ2V0UHJvcGVydHlBc3NpZ25tZW50XzIoKTsKQEAgLTI0NDM2LDE0ICsyNjU5MywxNCBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX0RhdGFJbnRlcmNoYW5nZUxvb2t1cF9fR3JvdXBfXzMiCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6Njk5MDoxOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VMb29rdXBfX0dyb3VwX18zIDogcnVsZV9fRGF0YUludGVyY2hhbmdlTG9va3VwX19Hcm91cF9fM19fSW1wbCBydWxlX19EYXRhSW50ZXJjaGFuZ2VMb29rdXBfX0dyb3VwX180IDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo3NTk5OjE6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUxvb2t1cF9fR3JvdXBfXzMgOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VMb29rdXBfX0dyb3VwX18zX19JbXBsIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUxvb2t1cF9fR3JvdXBfXzQgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUxvb2t1cF9fR3JvdXBfXzMoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6Njk5NDoxOiAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUxvb2t1cF9fR3JvdXBfXzNfX0ltcGwgcnVsZV9fRGF0YUludGVyY2hhbmdlTG9va3VwX19Hcm91cF9fNCApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo2OTk1OjI6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUxvb2t1cF9fR3JvdXBfXzNfX0ltcGwgcnVsZV9fRGF0YUludGVyY2hhbmdlTG9va3VwX19Hcm91cF9fNAorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NzYwMzoxOiAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUxvb2t1cF9fR3JvdXBfXzNfX0ltcGwgcnVsZV9fRGF0YUludGVyY2hhbmdlTG9va3VwX19Hcm91cF9fNCApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo3NjA0OjI6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUxvb2t1cF9fR3JvdXBfXzNfX0ltcGwgcnVsZV9fRGF0YUludGVyY2hhbmdlTG9va3VwX19Hcm91cF9fNAogICAgICAgICAgICAgewogICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfNyk7CiAgICAgICAgICAgICBydWxlX19EYXRhSW50ZXJjaGFuZ2VMb29rdXBfX0dyb3VwX18zX19JbXBsKCk7CkBAIC0yNDQ3NCwyMiArMjY2MzEsMjIgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19EYXRhSW50ZXJjaGFuZ2VMb29rdXBfX0dyb3VwX18zX19JbXBsIgotICAgIC8vIEludGVybmFsRGF0YURTTC5nOjcwMDI6MTogcnVsZV9fRGF0YUludGVyY2hhbmdlTG9va3VwX19Hcm91cF9fM19fSW1wbCA6ICggJ29uJyApIDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo3NjExOjE6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUxvb2t1cF9fR3JvdXBfXzNfX0ltcGwgOiAoICdvbicgKSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fRGF0YUludGVyY2hhbmdlTG9va3VwX19Hcm91cF9fM19fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo3MDA2OjE6ICggKCAnb24nICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NzAwNzoxOiAoICdvbicgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NzYxNToxOiAoICggJ29uJyApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjc2MTY6MTogKCAnb24nICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjcwMDc6MTogKCAnb24nICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjcwMDg6MjogJ29uJworICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NzYxNjoxOiAoICdvbicgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NzYxNzoyOiAnb24nCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldERhdGFJbnRlcmNoYW5nZUxvb2t1cEFjY2VzcygpLmdldE9uS2V5d29yZF8zKCkpOyAKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1hdGNoKGlucHV0LDk2LEZPTExPV18yKTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKKyAgICAgICAgICAgIG1hdGNoKGlucHV0LDEwMyxGT0xMT1dfMik7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YUludGVyY2hhbmdlTG9va3VwQWNjZXNzKCkuZ2V0T25LZXl3b3JkXzMoKSk7IAogICAgICAgICAgICAgfQpAQCAtMjQ1MTUsMTYgKzI2NjcyLDE2IEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fRGF0YUludGVyY2hhbmdlTG9va3VwX19Hcm91cF9fNCIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo3MDE3OjE6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUxvb2t1cF9fR3JvdXBfXzQgOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VMb29rdXBfX0dyb3VwX180X19JbXBsIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUxvb2t1cF9fR3JvdXBfXzUgOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjc2MjY6MTogcnVsZV9fRGF0YUludGVyY2hhbmdlTG9va3VwX19Hcm91cF9fNCA6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUxvb2t1cF9fR3JvdXBfXzRfX0ltcGwgcnVsZV9fRGF0YUludGVyY2hhbmdlTG9va3VwX19Hcm91cF9fNSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fRGF0YUludGVyY2hhbmdlTG9va3VwX19Hcm91cF9fNCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo3MDIxOjE6ICggcnVsZV9fRGF0YUludGVyY2hhbmdlTG9va3VwX19Hcm91cF9fNF9fSW1wbCBydWxlX19EYXRhSW50ZXJjaGFuZ2VMb29rdXBfX0dyb3VwX181ICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjcwMjI6MjogcnVsZV9fRGF0YUludGVyY2hhbmdlTG9va3VwX19Hcm91cF9fNF9fSW1wbCBydWxlX19EYXRhSW50ZXJjaGFuZ2VMb29rdXBfX0dyb3VwX181CisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo3NjMwOjE6ICggcnVsZV9fRGF0YUludGVyY2hhbmdlTG9va3VwX19Hcm91cF9fNF9fSW1wbCBydWxlX19EYXRhSW50ZXJjaGFuZ2VMb29rdXBfX0dyb3VwX181ICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjc2MzE6MjogcnVsZV9fRGF0YUludGVyY2hhbmdlTG9va3VwX19Hcm91cF9fNF9fSW1wbCBydWxlX19EYXRhSW50ZXJjaGFuZ2VMb29rdXBfX0dyb3VwX181CiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV180MSk7CisgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV180NSk7CiAgICAgICAgICAgICBydWxlX19EYXRhSW50ZXJjaGFuZ2VMb29rdXBfX0dyb3VwX180X19JbXBsKCk7CiAKICAgICAgICAgICAgIHN0YXRlLl9mc3AtLTsKQEAgLTI0NTUzLDIzICsyNjcxMCwyMyBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX0RhdGFJbnRlcmNoYW5nZUxvb2t1cF9fR3JvdXBfXzRfX0ltcGwiCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NzAyOToxOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VMb29rdXBfX0dyb3VwX180X19JbXBsIDogKCAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUxvb2t1cF9fRW50aXR5QXNzaWdubWVudF80ICkgKSA7CisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NzYzODoxOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VMb29rdXBfX0dyb3VwX180X19JbXBsIDogKCAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUxvb2t1cF9fRW50aXR5QXNzaWdubWVudF80ICkgKSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fRGF0YUludGVyY2hhbmdlTG9va3VwX19Hcm91cF9fNF9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo3MDMzOjE6ICggKCAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUxvb2t1cF9fRW50aXR5QXNzaWdubWVudF80ICkgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo3MDM0OjE6ICggKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VMb29rdXBfX0VudGl0eUFzc2lnbm1lbnRfNCApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjc2NDI6MTogKCAoICggcnVsZV9fRGF0YUludGVyY2hhbmdlTG9va3VwX19FbnRpdHlBc3NpZ25tZW50XzQgKSApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjc2NDM6MTogKCAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUxvb2t1cF9fRW50aXR5QXNzaWdubWVudF80ICkgKQogICAgICAgICAgICAgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NzAzNDoxOiAoICggcnVsZV9fRGF0YUludGVyY2hhbmdlTG9va3VwX19FbnRpdHlBc3NpZ25tZW50XzQgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo3MDM1OjI6ICggcnVsZV9fRGF0YUludGVyY2hhbmdlTG9va3VwX19FbnRpdHlBc3NpZ25tZW50XzQgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NzY0MzoxOiAoICggcnVsZV9fRGF0YUludGVyY2hhbmdlTG9va3VwX19FbnRpdHlBc3NpZ25tZW50XzQgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo3NjQ0OjI6ICggcnVsZV9fRGF0YUludGVyY2hhbmdlTG9va3VwX19FbnRpdHlBc3NpZ25tZW50XzQgKQogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXREYXRhSW50ZXJjaGFuZ2VMb29rdXBBY2Nlc3MoKS5nZXRFbnRpdHlBc3NpZ25tZW50XzQoKSk7IAogICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NzAzNjoyOiAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUxvb2t1cF9fRW50aXR5QXNzaWdubWVudF80ICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjcwMzY6MzogcnVsZV9fRGF0YUludGVyY2hhbmdlTG9va3VwX19FbnRpdHlBc3NpZ25tZW50XzQKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjc2NDU6MjogKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VMb29rdXBfX0VudGl0eUFzc2lnbm1lbnRfNCApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo3NjQ1OjM6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUxvb2t1cF9fRW50aXR5QXNzaWdubWVudF80CiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV18yKTsKICAgICAgICAgICAgIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUxvb2t1cF9fRW50aXR5QXNzaWdubWVudF80KCk7CkBAIC0yNDYwNCwxNiArMjY3NjEsMTYgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19EYXRhSW50ZXJjaGFuZ2VMb29rdXBfX0dyb3VwX181IgotICAgIC8vIEludGVybmFsRGF0YURTTC5nOjcwNDQ6MTogcnVsZV9fRGF0YUludGVyY2hhbmdlTG9va3VwX19Hcm91cF9fNSA6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUxvb2t1cF9fR3JvdXBfXzVfX0ltcGwgcnVsZV9fRGF0YUludGVyY2hhbmdlTG9va3VwX19Hcm91cF9fNiA7CisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NzY1MzoxOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VMb29rdXBfX0dyb3VwX181IDogcnVsZV9fRGF0YUludGVyY2hhbmdlTG9va3VwX19Hcm91cF9fNV9fSW1wbCBydWxlX19EYXRhSW50ZXJjaGFuZ2VMb29rdXBfX0dyb3VwX182IDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19EYXRhSW50ZXJjaGFuZ2VMb29rdXBfX0dyb3VwX181KCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjcwNDg6MTogKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VMb29rdXBfX0dyb3VwX181X19JbXBsIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUxvb2t1cF9fR3JvdXBfXzYgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NzA0OToyOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VMb29rdXBfX0dyb3VwX181X19JbXBsIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUxvb2t1cF9fR3JvdXBfXzYKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjc2NTc6MTogKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VMb29rdXBfX0dyb3VwX181X19JbXBsIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUxvb2t1cF9fR3JvdXBfXzYgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NzY1ODoyOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VMb29rdXBfX0dyb3VwX181X19JbXBsIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUxvb2t1cF9fR3JvdXBfXzYKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzQxKTsKKyAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzQ1KTsKICAgICAgICAgICAgIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUxvb2t1cF9fR3JvdXBfXzVfX0ltcGwoKTsKIAogICAgICAgICAgICAgc3RhdGUuX2ZzcC0tOwpAQCAtMjQ2NDIsMzEgKzI2Nzk5LDMxIEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fRGF0YUludGVyY2hhbmdlTG9va3VwX19Hcm91cF9fNV9fSW1wbCIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo3MDU2OjE6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUxvb2t1cF9fR3JvdXBfXzVfX0ltcGwgOiAoICggcnVsZV9fRGF0YUludGVyY2hhbmdlTG9va3VwX19Hcm91cF81X18wICk/ICkgOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjc2NjU6MTogcnVsZV9fRGF0YUludGVyY2hhbmdlTG9va3VwX19Hcm91cF9fNV9fSW1wbCA6ICggKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VMb29rdXBfX0dyb3VwXzVfXzAgKT8gKSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fRGF0YUludGVyY2hhbmdlTG9va3VwX19Hcm91cF9fNV9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo3MDYwOjE6ICggKCAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUxvb2t1cF9fR3JvdXBfNV9fMCApPyApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjcwNjE6MTogKCAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUxvb2t1cF9fR3JvdXBfNV9fMCApPyApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo3NjY5OjE6ICggKCAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUxvb2t1cF9fR3JvdXBfNV9fMCApPyApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjc2NzA6MTogKCAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUxvb2t1cF9fR3JvdXBfNV9fMCApPyApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo3MDYxOjE6ICggKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VMb29rdXBfX0dyb3VwXzVfXzAgKT8gKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NzA2MjoyOiAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUxvb2t1cF9fR3JvdXBfNV9fMCApPworICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NzY3MDoxOiAoICggcnVsZV9fRGF0YUludGVyY2hhbmdlTG9va3VwX19Hcm91cF81X18wICk/ICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjc2NzE6MjogKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VMb29rdXBfX0dyb3VwXzVfXzAgKT8KICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YUludGVyY2hhbmdlTG9va3VwQWNjZXNzKCkuZ2V0R3JvdXBfNSgpKTsgCiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo3MDYzOjI6ICggcnVsZV9fRGF0YUludGVyY2hhbmdlTG9va3VwX19Hcm91cF81X18wICk/Ci0gICAgICAgICAgICBpbnQgYWx0NzY9MjsKLSAgICAgICAgICAgIGludCBMQTc2XzAgPSBpbnB1dC5MQSgxKTsKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjc2NzI6MjogKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VMb29rdXBfX0dyb3VwXzVfXzAgKT8KKyAgICAgICAgICAgIGludCBhbHQ4ND0yOworICAgICAgICAgICAgaW50IExBODRfMCA9IGlucHV0LkxBKDEpOwogCi0gICAgICAgICAgICBpZiAoIChMQTc2XzA9PTg4KSApIHsKLSAgICAgICAgICAgICAgICBhbHQ3Nj0xOworICAgICAgICAgICAgaWYgKCAoTEE4NF8wPT05MykgKSB7CisgICAgICAgICAgICAgICAgYWx0ODQ9MTsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHN3aXRjaCAoYWx0NzYpIHsKKyAgICAgICAgICAgIHN3aXRjaCAoYWx0ODQpIHsKICAgICAgICAgICAgICAgICBjYXNlIDEgOgotICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo3MDYzOjM6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUxvb2t1cF9fR3JvdXBfNV9fMAorICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo3NjcyOjM6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUxvb2t1cF9fR3JvdXBfNV9fMAogICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzIpOwogICAgICAgICAgICAgICAgICAgICBydWxlX19EYXRhSW50ZXJjaGFuZ2VMb29rdXBfX0dyb3VwXzVfXzAoKTsKQEAgLTI0NzA0LDE0ICsyNjg2MSwxNCBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX0RhdGFJbnRlcmNoYW5nZUxvb2t1cF9fR3JvdXBfXzYiCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NzA3MToxOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VMb29rdXBfX0dyb3VwX182IDogcnVsZV9fRGF0YUludGVyY2hhbmdlTG9va3VwX19Hcm91cF9fNl9fSW1wbCBydWxlX19EYXRhSW50ZXJjaGFuZ2VMb29rdXBfX0dyb3VwX183IDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo3NjgwOjE6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUxvb2t1cF9fR3JvdXBfXzYgOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VMb29rdXBfX0dyb3VwX182X19JbXBsIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUxvb2t1cF9fR3JvdXBfXzcgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUxvb2t1cF9fR3JvdXBfXzYoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NzA3NToxOiAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUxvb2t1cF9fR3JvdXBfXzZfX0ltcGwgcnVsZV9fRGF0YUludGVyY2hhbmdlTG9va3VwX19Hcm91cF9fNyApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo3MDc2OjI6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUxvb2t1cF9fR3JvdXBfXzZfX0ltcGwgcnVsZV9fRGF0YUludGVyY2hhbmdlTG9va3VwX19Hcm91cF9fNworICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NzY4NDoxOiAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUxvb2t1cF9fR3JvdXBfXzZfX0ltcGwgcnVsZV9fRGF0YUludGVyY2hhbmdlTG9va3VwX19Hcm91cF9fNyApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo3Njg1OjI6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUxvb2t1cF9fR3JvdXBfXzZfX0ltcGwgcnVsZV9fRGF0YUludGVyY2hhbmdlTG9va3VwX19Hcm91cF9fNwogICAgICAgICAgICAgewogICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfNyk7CiAgICAgICAgICAgICBydWxlX19EYXRhSW50ZXJjaGFuZ2VMb29rdXBfX0dyb3VwX182X19JbXBsKCk7CkBAIC0yNDc0MiwyMiArMjY4OTksMjIgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19EYXRhSW50ZXJjaGFuZ2VMb29rdXBfX0dyb3VwX182X19JbXBsIgotICAgIC8vIEludGVybmFsRGF0YURTTC5nOjcwODM6MTogcnVsZV9fRGF0YUludGVyY2hhbmdlTG9va3VwX19Hcm91cF9fNl9fSW1wbCA6ICggJ3dpdGgnICkgOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjc2OTI6MTogcnVsZV9fRGF0YUludGVyY2hhbmdlTG9va3VwX19Hcm91cF9fNl9fSW1wbCA6ICggJ3dpdGgnICkgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUxvb2t1cF9fR3JvdXBfXzZfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NzA4NzoxOiAoICggJ3dpdGgnICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NzA4ODoxOiAoICd3aXRoJyApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo3Njk2OjE6ICggKCAnd2l0aCcgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo3Njk3OjE6ICggJ3dpdGgnICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjcwODg6MTogKCAnd2l0aCcgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NzA4OToyOiAnd2l0aCcKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjc2OTc6MTogKCAnd2l0aCcgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NzY5ODoyOiAnd2l0aCcKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YUludGVyY2hhbmdlTG9va3VwQWNjZXNzKCkuZ2V0V2l0aEtleXdvcmRfNigpKTsgCiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBtYXRjaChpbnB1dCw5NyxGT0xMT1dfMik7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CisgICAgICAgICAgICBtYXRjaChpbnB1dCwxMDQsRk9MTE9XXzIpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOwogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBhZnRlcihncmFtbWFyQWNjZXNzLmdldERhdGFJbnRlcmNoYW5nZUxvb2t1cEFjY2VzcygpLmdldFdpdGhLZXl3b3JkXzYoKSk7IAogICAgICAgICAgICAgfQpAQCAtMjQ3ODMsMTYgKzI2OTQwLDE2IEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fRGF0YUludGVyY2hhbmdlTG9va3VwX19Hcm91cF9fNyIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo3MDk4OjE6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUxvb2t1cF9fR3JvdXBfXzcgOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VMb29rdXBfX0dyb3VwX183X19JbXBsIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUxvb2t1cF9fR3JvdXBfXzggOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjc3MDc6MTogcnVsZV9fRGF0YUludGVyY2hhbmdlTG9va3VwX19Hcm91cF9fNyA6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUxvb2t1cF9fR3JvdXBfXzdfX0ltcGwgcnVsZV9fRGF0YUludGVyY2hhbmdlTG9va3VwX19Hcm91cF9fOCA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fRGF0YUludGVyY2hhbmdlTG9va3VwX19Hcm91cF9fNygpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo3MTAyOjE6ICggcnVsZV9fRGF0YUludGVyY2hhbmdlTG9va3VwX19Hcm91cF9fN19fSW1wbCBydWxlX19EYXRhSW50ZXJjaGFuZ2VMb29rdXBfX0dyb3VwX184ICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjcxMDM6MjogcnVsZV9fRGF0YUludGVyY2hhbmdlTG9va3VwX19Hcm91cF9fN19fSW1wbCBydWxlX19EYXRhSW50ZXJjaGFuZ2VMb29rdXBfX0dyb3VwX184CisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo3NzExOjE6ICggcnVsZV9fRGF0YUludGVyY2hhbmdlTG9va3VwX19Hcm91cF9fN19fSW1wbCBydWxlX19EYXRhSW50ZXJjaGFuZ2VMb29rdXBfX0dyb3VwX184ICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjc3MTI6MjogcnVsZV9fRGF0YUludGVyY2hhbmdlTG9va3VwX19Hcm91cF9fN19fSW1wbCBydWxlX19EYXRhSW50ZXJjaGFuZ2VMb29rdXBfX0dyb3VwX184CiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV180Mik7CisgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV180Nik7CiAgICAgICAgICAgICBydWxlX19EYXRhSW50ZXJjaGFuZ2VMb29rdXBfX0dyb3VwX183X19JbXBsKCk7CiAKICAgICAgICAgICAgIHN0YXRlLl9mc3AtLTsKQEAgLTI0ODIxLDIzICsyNjk3OCwyMyBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX0RhdGFJbnRlcmNoYW5nZUxvb2t1cF9fR3JvdXBfXzdfX0ltcGwiCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NzExMDoxOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VMb29rdXBfX0dyb3VwX183X19JbXBsIDogKCAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUxvb2t1cF9fUXVlcnlQcm9wZXJ0eUFzc2lnbm1lbnRfNyApICkgOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjc3MTk6MTogcnVsZV9fRGF0YUludGVyY2hhbmdlTG9va3VwX19Hcm91cF9fN19fSW1wbCA6ICggKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VMb29rdXBfX1F1ZXJ5UHJvcGVydHlBc3NpZ25tZW50XzcgKSApIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19EYXRhSW50ZXJjaGFuZ2VMb29rdXBfX0dyb3VwX183X19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjcxMTQ6MTogKCAoICggcnVsZV9fRGF0YUludGVyY2hhbmdlTG9va3VwX19RdWVyeVByb3BlcnR5QXNzaWdubWVudF83ICkgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo3MTE1OjE6ICggKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VMb29rdXBfX1F1ZXJ5UHJvcGVydHlBc3NpZ25tZW50XzcgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo3NzIzOjE6ICggKCAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUxvb2t1cF9fUXVlcnlQcm9wZXJ0eUFzc2lnbm1lbnRfNyApICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NzcyNDoxOiAoICggcnVsZV9fRGF0YUludGVyY2hhbmdlTG9va3VwX19RdWVyeVByb3BlcnR5QXNzaWdubWVudF83ICkgKQogICAgICAgICAgICAgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NzExNToxOiAoICggcnVsZV9fRGF0YUludGVyY2hhbmdlTG9va3VwX19RdWVyeVByb3BlcnR5QXNzaWdubWVudF83ICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NzExNjoyOiAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUxvb2t1cF9fUXVlcnlQcm9wZXJ0eUFzc2lnbm1lbnRfNyApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo3NzI0OjE6ICggKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VMb29rdXBfX1F1ZXJ5UHJvcGVydHlBc3NpZ25tZW50XzcgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo3NzI1OjI6ICggcnVsZV9fRGF0YUludGVyY2hhbmdlTG9va3VwX19RdWVyeVByb3BlcnR5QXNzaWdubWVudF83ICkKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YUludGVyY2hhbmdlTG9va3VwQWNjZXNzKCkuZ2V0UXVlcnlQcm9wZXJ0eUFzc2lnbm1lbnRfNygpKTsgCiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo3MTE3OjI6ICggcnVsZV9fRGF0YUludGVyY2hhbmdlTG9va3VwX19RdWVyeVByb3BlcnR5QXNzaWdubWVudF83ICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjcxMTc6MzogcnVsZV9fRGF0YUludGVyY2hhbmdlTG9va3VwX19RdWVyeVByb3BlcnR5QXNzaWdubWVudF83CisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo3NzI2OjI6ICggcnVsZV9fRGF0YUludGVyY2hhbmdlTG9va3VwX19RdWVyeVByb3BlcnR5QXNzaWdubWVudF83ICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjc3MjY6MzogcnVsZV9fRGF0YUludGVyY2hhbmdlTG9va3VwX19RdWVyeVByb3BlcnR5QXNzaWdubWVudF83CiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV18yKTsKICAgICAgICAgICAgIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUxvb2t1cF9fUXVlcnlQcm9wZXJ0eUFzc2lnbm1lbnRfNygpOwpAQCAtMjQ4NzIsMTYgKzI3MDI5LDE2IEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fRGF0YUludGVyY2hhbmdlTG9va3VwX19Hcm91cF9fOCIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo3MTI1OjE6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUxvb2t1cF9fR3JvdXBfXzggOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VMb29rdXBfX0dyb3VwX184X19JbXBsIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUxvb2t1cF9fR3JvdXBfXzkgOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjc3MzQ6MTogcnVsZV9fRGF0YUludGVyY2hhbmdlTG9va3VwX19Hcm91cF9fOCA6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUxvb2t1cF9fR3JvdXBfXzhfX0ltcGwgcnVsZV9fRGF0YUludGVyY2hhbmdlTG9va3VwX19Hcm91cF9fOSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fRGF0YUludGVyY2hhbmdlTG9va3VwX19Hcm91cF9fOCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo3MTI5OjE6ICggcnVsZV9fRGF0YUludGVyY2hhbmdlTG9va3VwX19Hcm91cF9fOF9fSW1wbCBydWxlX19EYXRhSW50ZXJjaGFuZ2VMb29rdXBfX0dyb3VwX185ICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjcxMzA6MjogcnVsZV9fRGF0YUludGVyY2hhbmdlTG9va3VwX19Hcm91cF9fOF9fSW1wbCBydWxlX19EYXRhSW50ZXJjaGFuZ2VMb29rdXBfX0dyb3VwX185CisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo3NzM4OjE6ICggcnVsZV9fRGF0YUludGVyY2hhbmdlTG9va3VwX19Hcm91cF9fOF9fSW1wbCBydWxlX19EYXRhSW50ZXJjaGFuZ2VMb29rdXBfX0dyb3VwX185ICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjc3Mzk6MjogcnVsZV9fRGF0YUludGVyY2hhbmdlTG9va3VwX19Hcm91cF9fOF9fSW1wbCBydWxlX19EYXRhSW50ZXJjaGFuZ2VMb29rdXBfX0dyb3VwX185CiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV180Mik7CisgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV180Nik7CiAgICAgICAgICAgICBydWxlX19EYXRhSW50ZXJjaGFuZ2VMb29rdXBfX0dyb3VwX184X19JbXBsKCk7CiAKICAgICAgICAgICAgIHN0YXRlLl9mc3AtLTsKQEAgLTI0OTEwLDMxICsyNzA2NywzMSBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX0RhdGFJbnRlcmNoYW5nZUxvb2t1cF9fR3JvdXBfXzhfX0ltcGwiCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NzEzNzoxOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VMb29rdXBfX0dyb3VwX184X19JbXBsIDogKCAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUxvb2t1cF9fR3JvdXBfOF9fMCApPyApIDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo3NzQ2OjE6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUxvb2t1cF9fR3JvdXBfXzhfX0ltcGwgOiAoICggcnVsZV9fRGF0YUludGVyY2hhbmdlTG9va3VwX19Hcm91cF84X18wICk/ICkgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUxvb2t1cF9fR3JvdXBfXzhfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NzE0MToxOiAoICggKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VMb29rdXBfX0dyb3VwXzhfXzAgKT8gKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo3MTQyOjE6ICggKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VMb29rdXBfX0dyb3VwXzhfXzAgKT8gKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6Nzc1MDoxOiAoICggKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VMb29rdXBfX0dyb3VwXzhfXzAgKT8gKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo3NzUxOjE6ICggKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VMb29rdXBfX0dyb3VwXzhfXzAgKT8gKQogICAgICAgICAgICAgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NzE0MjoxOiAoICggcnVsZV9fRGF0YUludGVyY2hhbmdlTG9va3VwX19Hcm91cF84X18wICk/ICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjcxNDM6MjogKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VMb29rdXBfX0dyb3VwXzhfXzAgKT8KKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjc3NTE6MTogKCAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUxvb2t1cF9fR3JvdXBfOF9fMCApPyApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo3NzUyOjI6ICggcnVsZV9fRGF0YUludGVyY2hhbmdlTG9va3VwX19Hcm91cF84X18wICk/CiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldERhdGFJbnRlcmNoYW5nZUxvb2t1cEFjY2VzcygpLmdldEdyb3VwXzgoKSk7IAogICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NzE0NDoyOiAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUxvb2t1cF9fR3JvdXBfOF9fMCApPwotICAgICAgICAgICAgaW50IGFsdDc3PTI7Ci0gICAgICAgICAgICBpbnQgTEE3N18wID0gaW5wdXQuTEEoMSk7CisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo3NzUzOjI6ICggcnVsZV9fRGF0YUludGVyY2hhbmdlTG9va3VwX19Hcm91cF84X18wICk/CisgICAgICAgICAgICBpbnQgYWx0ODU9MjsKKyAgICAgICAgICAgIGludCBMQTg1XzAgPSBpbnB1dC5MQSgxKTsKIAotICAgICAgICAgICAgaWYgKCAoTEE3N18wPT0xNDUpICkgewotICAgICAgICAgICAgICAgIGFsdDc3PTE7CisgICAgICAgICAgICBpZiAoIChMQTg1XzA9PTE1NykgKSB7CisgICAgICAgICAgICAgICAgYWx0ODU9MTsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHN3aXRjaCAoYWx0NzcpIHsKKyAgICAgICAgICAgIHN3aXRjaCAoYWx0ODUpIHsKICAgICAgICAgICAgICAgICBjYXNlIDEgOgotICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo3MTQ0OjM6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUxvb2t1cF9fR3JvdXBfOF9fMAorICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo3NzUzOjM6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUxvb2t1cF9fR3JvdXBfOF9fMAogICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzIpOwogICAgICAgICAgICAgICAgICAgICBydWxlX19EYXRhSW50ZXJjaGFuZ2VMb29rdXBfX0dyb3VwXzhfXzAoKTsKQEAgLTI0OTcyLDE2ICsyNzEyOSwxNiBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX0RhdGFJbnRlcmNoYW5nZUxvb2t1cF9fR3JvdXBfXzkiCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NzE1MjoxOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VMb29rdXBfX0dyb3VwX185IDogcnVsZV9fRGF0YUludGVyY2hhbmdlTG9va3VwX19Hcm91cF9fOV9fSW1wbCBydWxlX19EYXRhSW50ZXJjaGFuZ2VMb29rdXBfX0dyb3VwX18xMCA7CisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6Nzc2MToxOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VMb29rdXBfX0dyb3VwX185IDogcnVsZV9fRGF0YUludGVyY2hhbmdlTG9va3VwX19Hcm91cF9fOV9fSW1wbCBydWxlX19EYXRhSW50ZXJjaGFuZ2VMb29rdXBfX0dyb3VwX18xMCA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fRGF0YUludGVyY2hhbmdlTG9va3VwX19Hcm91cF9fOSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo3MTU2OjE6ICggcnVsZV9fRGF0YUludGVyY2hhbmdlTG9va3VwX19Hcm91cF9fOV9fSW1wbCBydWxlX19EYXRhSW50ZXJjaGFuZ2VMb29rdXBfX0dyb3VwX18xMCApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo3MTU3OjI6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUxvb2t1cF9fR3JvdXBfXzlfX0ltcGwgcnVsZV9fRGF0YUludGVyY2hhbmdlTG9va3VwX19Hcm91cF9fMTAKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjc3NjU6MTogKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VMb29rdXBfX0dyb3VwX185X19JbXBsIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUxvb2t1cF9fR3JvdXBfXzEwICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjc3NjY6MjogcnVsZV9fRGF0YUludGVyY2hhbmdlTG9va3VwX19Hcm91cF9fOV9fSW1wbCBydWxlX19EYXRhSW50ZXJjaGFuZ2VMb29rdXBfX0dyb3VwX18xMAogICAgICAgICAgICAgewotICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfNDIpOworICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfNDYpOwogICAgICAgICAgICAgcnVsZV9fRGF0YUludGVyY2hhbmdlTG9va3VwX19Hcm91cF9fOV9fSW1wbCgpOwogCiAgICAgICAgICAgICBzdGF0ZS5fZnNwLS07CkBAIC0yNTAxMCwzMSArMjcxNjcsMzEgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19EYXRhSW50ZXJjaGFuZ2VMb29rdXBfX0dyb3VwX185X19JbXBsIgotICAgIC8vIEludGVybmFsRGF0YURTTC5nOjcxNjQ6MTogcnVsZV9fRGF0YUludGVyY2hhbmdlTG9va3VwX19Hcm91cF9fOV9fSW1wbCA6ICggKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VMb29rdXBfX0dyb3VwXzlfXzAgKT8gKSA7CisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6Nzc3MzoxOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VMb29rdXBfX0dyb3VwX185X19JbXBsIDogKCAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUxvb2t1cF9fR3JvdXBfOV9fMCApPyApIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19EYXRhSW50ZXJjaGFuZ2VMb29rdXBfX0dyb3VwX185X19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjcxNjg6MTogKCAoICggcnVsZV9fRGF0YUludGVyY2hhbmdlTG9va3VwX19Hcm91cF85X18wICk/ICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NzE2OToxOiAoICggcnVsZV9fRGF0YUludGVyY2hhbmdlTG9va3VwX19Hcm91cF85X18wICk/ICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjc3Nzc6MTogKCAoICggcnVsZV9fRGF0YUludGVyY2hhbmdlTG9va3VwX19Hcm91cF85X18wICk/ICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6Nzc3ODoxOiAoICggcnVsZV9fRGF0YUludGVyY2hhbmdlTG9va3VwX19Hcm91cF85X18wICk/ICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjcxNjk6MTogKCAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUxvb2t1cF9fR3JvdXBfOV9fMCApPyApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo3MTcwOjI6ICggcnVsZV9fRGF0YUludGVyY2hhbmdlTG9va3VwX19Hcm91cF85X18wICk/CisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo3Nzc4OjE6ICggKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VMb29rdXBfX0dyb3VwXzlfXzAgKT8gKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6Nzc3OToyOiAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUxvb2t1cF9fR3JvdXBfOV9fMCApPwogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXREYXRhSW50ZXJjaGFuZ2VMb29rdXBBY2Nlc3MoKS5nZXRHcm91cF85KCkpOyAKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjcxNzE6MjogKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VMb29rdXBfX0dyb3VwXzlfXzAgKT8KLSAgICAgICAgICAgIGludCBhbHQ3OD0yOwotICAgICAgICAgICAgaW50IExBNzhfMCA9IGlucHV0LkxBKDEpOworICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6Nzc4MDoyOiAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUxvb2t1cF9fR3JvdXBfOV9fMCApPworICAgICAgICAgICAgaW50IGFsdDg2PTI7CisgICAgICAgICAgICBpbnQgTEE4Nl8wID0gaW5wdXQuTEEoMSk7CiAKLSAgICAgICAgICAgIGlmICggKExBNzhfMD09OTgpICkgewotICAgICAgICAgICAgICAgIGFsdDc4PTE7CisgICAgICAgICAgICBpZiAoIChMQTg2XzA9PTEwNSkgKSB7CisgICAgICAgICAgICAgICAgYWx0ODY9MTsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHN3aXRjaCAoYWx0NzgpIHsKKyAgICAgICAgICAgIHN3aXRjaCAoYWx0ODYpIHsKICAgICAgICAgICAgICAgICBjYXNlIDEgOgotICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo3MTcxOjM6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUxvb2t1cF9fR3JvdXBfOV9fMAorICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo3NzgwOjM6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUxvb2t1cF9fR3JvdXBfOV9fMAogICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzIpOwogICAgICAgICAgICAgICAgICAgICBydWxlX19EYXRhSW50ZXJjaGFuZ2VMb29rdXBfX0dyb3VwXzlfXzAoKTsKQEAgLTI1MDcyLDE0ICsyNzIyOSwxNCBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX0RhdGFJbnRlcmNoYW5nZUxvb2t1cF9fR3JvdXBfXzEwIgotICAgIC8vIEludGVybmFsRGF0YURTTC5nOjcxNzk6MTogcnVsZV9fRGF0YUludGVyY2hhbmdlTG9va3VwX19Hcm91cF9fMTAgOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VMb29rdXBfX0dyb3VwX18xMF9fSW1wbCA7CisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6Nzc4ODoxOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VMb29rdXBfX0dyb3VwX18xMCA6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUxvb2t1cF9fR3JvdXBfXzEwX19JbXBsIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19EYXRhSW50ZXJjaGFuZ2VMb29rdXBfX0dyb3VwX18xMCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo3MTgzOjE6ICggcnVsZV9fRGF0YUludGVyY2hhbmdlTG9va3VwX19Hcm91cF9fMTBfX0ltcGwgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NzE4NDoyOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VMb29rdXBfX0dyb3VwX18xMF9fSW1wbAorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6Nzc5MjoxOiAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUxvb2t1cF9fR3JvdXBfXzEwX19JbXBsICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjc3OTM6MjogcnVsZV9fRGF0YUludGVyY2hhbmdlTG9va3VwX19Hcm91cF9fMTBfX0ltcGwKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzIpOwogICAgICAgICAgICAgcnVsZV9fRGF0YUludGVyY2hhbmdlTG9va3VwX19Hcm91cF9fMTBfX0ltcGwoKTsKQEAgLTI1MTA1LDIzICsyNzI2MiwyMyBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX0RhdGFJbnRlcmNoYW5nZUxvb2t1cF9fR3JvdXBfXzEwX19JbXBsIgotICAgIC8vIEludGVybmFsRGF0YURTTC5nOjcxOTA6MTogcnVsZV9fRGF0YUludGVyY2hhbmdlTG9va3VwX19Hcm91cF9fMTBfX0ltcGwgOiAoICggcnVsZV9fRGF0YUludGVyY2hhbmdlTG9va3VwX19Vbm9yZGVyZWRHcm91cF8xMCApICkgOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjc3OTk6MTogcnVsZV9fRGF0YUludGVyY2hhbmdlTG9va3VwX19Hcm91cF9fMTBfX0ltcGwgOiAoICggcnVsZV9fRGF0YUludGVyY2hhbmdlTG9va3VwX19Vbm9yZGVyZWRHcm91cF8xMCApICkgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUxvb2t1cF9fR3JvdXBfXzEwX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjcxOTQ6MTogKCAoICggcnVsZV9fRGF0YUludGVyY2hhbmdlTG9va3VwX19Vbm9yZGVyZWRHcm91cF8xMCApICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NzE5NToxOiAoICggcnVsZV9fRGF0YUludGVyY2hhbmdlTG9va3VwX19Vbm9yZGVyZWRHcm91cF8xMCApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjc4MDM6MTogKCAoICggcnVsZV9fRGF0YUludGVyY2hhbmdlTG9va3VwX19Vbm9yZGVyZWRHcm91cF8xMCApICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NzgwNDoxOiAoICggcnVsZV9fRGF0YUludGVyY2hhbmdlTG9va3VwX19Vbm9yZGVyZWRHcm91cF8xMCApICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjcxOTU6MTogKCAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUxvb2t1cF9fVW5vcmRlcmVkR3JvdXBfMTAgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo3MTk2OjI6ICggcnVsZV9fRGF0YUludGVyY2hhbmdlTG9va3VwX19Vbm9yZGVyZWRHcm91cF8xMCApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo3ODA0OjE6ICggKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VMb29rdXBfX1Vub3JkZXJlZEdyb3VwXzEwICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NzgwNToyOiAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUxvb2t1cF9fVW5vcmRlcmVkR3JvdXBfMTAgKQogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXREYXRhSW50ZXJjaGFuZ2VMb29rdXBBY2Nlc3MoKS5nZXRVbm9yZGVyZWRHcm91cF8xMCgpKTsgCiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo3MTk3OjI6ICggcnVsZV9fRGF0YUludGVyY2hhbmdlTG9va3VwX19Vbm9yZGVyZWRHcm91cF8xMCApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo3MTk3OjM6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUxvb2t1cF9fVW5vcmRlcmVkR3JvdXBfMTAKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjc4MDY6MjogKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VMb29rdXBfX1Vub3JkZXJlZEdyb3VwXzEwICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjc4MDY6MzogcnVsZV9fRGF0YUludGVyY2hhbmdlTG9va3VwX19Vbm9yZGVyZWRHcm91cF8xMAogICAgICAgICAgICAgewogICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMik7CiAgICAgICAgICAgICBydWxlX19EYXRhSW50ZXJjaGFuZ2VMb29rdXBfX1Vub3JkZXJlZEdyb3VwXzEwKCk7CkBAIC0yNTE1NiwxNCArMjczMTMsMTQgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19EYXRhSW50ZXJjaGFuZ2VMb29rdXBfX0dyb3VwXzVfXzAiCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NzIwNjoxOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VMb29rdXBfX0dyb3VwXzVfXzAgOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VMb29rdXBfX0dyb3VwXzVfXzBfX0ltcGwgcnVsZV9fRGF0YUludGVyY2hhbmdlTG9va3VwX19Hcm91cF81X18xIDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo3ODE1OjE6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUxvb2t1cF9fR3JvdXBfNV9fMCA6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUxvb2t1cF9fR3JvdXBfNV9fMF9fSW1wbCBydWxlX19EYXRhSW50ZXJjaGFuZ2VMb29rdXBfX0dyb3VwXzVfXzEgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUxvb2t1cF9fR3JvdXBfNV9fMCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo3MjEwOjE6ICggcnVsZV9fRGF0YUludGVyY2hhbmdlTG9va3VwX19Hcm91cF81X18wX19JbXBsIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUxvb2t1cF9fR3JvdXBfNV9fMSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo3MjExOjI6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUxvb2t1cF9fR3JvdXBfNV9fMF9fSW1wbCBydWxlX19EYXRhSW50ZXJjaGFuZ2VMb29rdXBfX0dyb3VwXzVfXzEKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjc4MTk6MTogKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VMb29rdXBfX0dyb3VwXzVfXzBfX0ltcGwgcnVsZV9fRGF0YUludGVyY2hhbmdlTG9va3VwX19Hcm91cF81X18xICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjc4MjA6MjogcnVsZV9fRGF0YUludGVyY2hhbmdlTG9va3VwX19Hcm91cF81X18wX19JbXBsIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUxvb2t1cF9fR3JvdXBfNV9fMQogICAgICAgICAgICAgewogICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfOSk7CiAgICAgICAgICAgICBydWxlX19EYXRhSW50ZXJjaGFuZ2VMb29rdXBfX0dyb3VwXzVfXzBfX0ltcGwoKTsKQEAgLTI1MTk0LDIyICsyNzM1MSwyMiBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX0RhdGFJbnRlcmNoYW5nZUxvb2t1cF9fR3JvdXBfNV9fMF9fSW1wbCIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo3MjE4OjE6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUxvb2t1cF9fR3JvdXBfNV9fMF9fSW1wbCA6ICggJ2NyZWF0ZU9uJyApIDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo3ODI3OjE6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUxvb2t1cF9fR3JvdXBfNV9fMF9fSW1wbCA6ICggJ2NyZWF0ZU9uJyApIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19EYXRhSW50ZXJjaGFuZ2VMb29rdXBfX0dyb3VwXzVfXzBfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NzIyMjoxOiAoICggJ2NyZWF0ZU9uJyApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjcyMjM6MTogKCAnY3JlYXRlT24nICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjc4MzE6MTogKCAoICdjcmVhdGVPbicgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo3ODMyOjE6ICggJ2NyZWF0ZU9uJyApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo3MjIzOjE6ICggJ2NyZWF0ZU9uJyApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo3MjI0OjI6ICdjcmVhdGVPbicKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjc4MzI6MTogKCAnY3JlYXRlT24nICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjc4MzM6MjogJ2NyZWF0ZU9uJwogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXREYXRhSW50ZXJjaGFuZ2VMb29rdXBBY2Nlc3MoKS5nZXRDcmVhdGVPbktleXdvcmRfNV8wKCkpOyAKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1hdGNoKGlucHV0LDg4LEZPTExPV18yKTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKKyAgICAgICAgICAgIG1hdGNoKGlucHV0LDkzLEZPTExPV18yKTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXREYXRhSW50ZXJjaGFuZ2VMb29rdXBBY2Nlc3MoKS5nZXRDcmVhdGVPbktleXdvcmRfNV8wKCkpOyAKICAgICAgICAgICAgIH0KQEAgLTI1MjM1LDE0ICsyNzM5MiwxNCBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX0RhdGFJbnRlcmNoYW5nZUxvb2t1cF9fR3JvdXBfNV9fMSIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo3MjMzOjE6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUxvb2t1cF9fR3JvdXBfNV9fMSA6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUxvb2t1cF9fR3JvdXBfNV9fMV9fSW1wbCA7CisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6Nzg0MjoxOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VMb29rdXBfX0dyb3VwXzVfXzEgOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VMb29rdXBfX0dyb3VwXzVfXzFfX0ltcGwgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUxvb2t1cF9fR3JvdXBfNV9fMSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo3MjM3OjE6ICggcnVsZV9fRGF0YUludGVyY2hhbmdlTG9va3VwX19Hcm91cF81X18xX19JbXBsICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjcyMzg6MjogcnVsZV9fRGF0YUludGVyY2hhbmdlTG9va3VwX19Hcm91cF81X18xX19JbXBsCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo3ODQ2OjE6ICggcnVsZV9fRGF0YUludGVyY2hhbmdlTG9va3VwX19Hcm91cF81X18xX19JbXBsICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjc4NDc6MjogcnVsZV9fRGF0YUludGVyY2hhbmdlTG9va3VwX19Hcm91cF81X18xX19JbXBsCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV18yKTsKICAgICAgICAgICAgIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUxvb2t1cF9fR3JvdXBfNV9fMV9fSW1wbCgpOwpAQCAtMjUyNjgsMjMgKzI3NDI1LDIzIEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fRGF0YUludGVyY2hhbmdlTG9va3VwX19Hcm91cF81X18xX19JbXBsIgotICAgIC8vIEludGVybmFsRGF0YURTTC5nOjcyNDQ6MTogcnVsZV9fRGF0YUludGVyY2hhbmdlTG9va3VwX19Hcm91cF81X18xX19JbXBsIDogKCAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUxvb2t1cF9fRWxlbWVudE1hcEFzc2lnbm1lbnRfNV8xICkgKSA7CisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6Nzg1MzoxOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VMb29rdXBfX0dyb3VwXzVfXzFfX0ltcGwgOiAoICggcnVsZV9fRGF0YUludGVyY2hhbmdlTG9va3VwX19FbGVtZW50TWFwQXNzaWdubWVudF81XzEgKSApIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19EYXRhSW50ZXJjaGFuZ2VMb29rdXBfX0dyb3VwXzVfXzFfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NzI0ODoxOiAoICggKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VMb29rdXBfX0VsZW1lbnRNYXBBc3NpZ25tZW50XzVfMSApICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NzI0OToxOiAoICggcnVsZV9fRGF0YUludGVyY2hhbmdlTG9va3VwX19FbGVtZW50TWFwQXNzaWdubWVudF81XzEgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo3ODU3OjE6ICggKCAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUxvb2t1cF9fRWxlbWVudE1hcEFzc2lnbm1lbnRfNV8xICkgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo3ODU4OjE6ICggKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VMb29rdXBfX0VsZW1lbnRNYXBBc3NpZ25tZW50XzVfMSApICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjcyNDk6MTogKCAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUxvb2t1cF9fRWxlbWVudE1hcEFzc2lnbm1lbnRfNV8xICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NzI1MDoyOiAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUxvb2t1cF9fRWxlbWVudE1hcEFzc2lnbm1lbnRfNV8xICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjc4NTg6MTogKCAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUxvb2t1cF9fRWxlbWVudE1hcEFzc2lnbm1lbnRfNV8xICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6Nzg1OToyOiAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUxvb2t1cF9fRWxlbWVudE1hcEFzc2lnbm1lbnRfNV8xICkKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YUludGVyY2hhbmdlTG9va3VwQWNjZXNzKCkuZ2V0RWxlbWVudE1hcEFzc2lnbm1lbnRfNV8xKCkpOyAKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjcyNTE6MjogKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VMb29rdXBfX0VsZW1lbnRNYXBBc3NpZ25tZW50XzVfMSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo3MjUxOjM6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUxvb2t1cF9fRWxlbWVudE1hcEFzc2lnbm1lbnRfNV8xCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo3ODYwOjI6ICggcnVsZV9fRGF0YUludGVyY2hhbmdlTG9va3VwX19FbGVtZW50TWFwQXNzaWdubWVudF81XzEgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6Nzg2MDozOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VMb29rdXBfX0VsZW1lbnRNYXBBc3NpZ25tZW50XzVfMQogICAgICAgICAgICAgewogICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMik7CiAgICAgICAgICAgICBydWxlX19EYXRhSW50ZXJjaGFuZ2VMb29rdXBfX0VsZW1lbnRNYXBBc3NpZ25tZW50XzVfMSgpOwpAQCAtMjUzMTksMTQgKzI3NDc2LDE0IEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fRGF0YUludGVyY2hhbmdlTG9va3VwX19Hcm91cF84X18wIgotICAgIC8vIEludGVybmFsRGF0YURTTC5nOjcyNjA6MTogcnVsZV9fRGF0YUludGVyY2hhbmdlTG9va3VwX19Hcm91cF84X18wIDogcnVsZV9fRGF0YUludGVyY2hhbmdlTG9va3VwX19Hcm91cF84X18wX19JbXBsIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUxvb2t1cF9fR3JvdXBfOF9fMSA7CisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6Nzg2OToxOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VMb29rdXBfX0dyb3VwXzhfXzAgOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VMb29rdXBfX0dyb3VwXzhfXzBfX0ltcGwgcnVsZV9fRGF0YUludGVyY2hhbmdlTG9va3VwX19Hcm91cF84X18xIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19EYXRhSW50ZXJjaGFuZ2VMb29rdXBfX0dyb3VwXzhfXzAoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NzI2NDoxOiAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUxvb2t1cF9fR3JvdXBfOF9fMF9fSW1wbCBydWxlX19EYXRhSW50ZXJjaGFuZ2VMb29rdXBfX0dyb3VwXzhfXzEgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NzI2NToyOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VMb29rdXBfX0dyb3VwXzhfXzBfX0ltcGwgcnVsZV9fRGF0YUludGVyY2hhbmdlTG9va3VwX19Hcm91cF84X18xCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo3ODczOjE6ICggcnVsZV9fRGF0YUludGVyY2hhbmdlTG9va3VwX19Hcm91cF84X18wX19JbXBsIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUxvb2t1cF9fR3JvdXBfOF9fMSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo3ODc0OjI6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUxvb2t1cF9fR3JvdXBfOF9fMF9fSW1wbCBydWxlX19EYXRhSW50ZXJjaGFuZ2VMb29rdXBfX0dyb3VwXzhfXzEKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzIwKTsKICAgICAgICAgICAgIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUxvb2t1cF9fR3JvdXBfOF9fMF9fSW1wbCgpOwpAQCAtMjUzNTcsMjMgKzI3NTE0LDIzIEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fRGF0YUludGVyY2hhbmdlTG9va3VwX19Hcm91cF84X18wX19JbXBsIgotICAgIC8vIEludGVybmFsRGF0YURTTC5nOjcyNzI6MTogcnVsZV9fRGF0YUludGVyY2hhbmdlTG9va3VwX19Hcm91cF84X18wX19JbXBsIDogKCAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUxvb2t1cF9fQ2FjaGVkQXNzaWdubWVudF84XzAgKSApIDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo3ODgxOjE6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUxvb2t1cF9fR3JvdXBfOF9fMF9fSW1wbCA6ICggKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VMb29rdXBfX0NhY2hlZEFzc2lnbm1lbnRfOF8wICkgKSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fRGF0YUludGVyY2hhbmdlTG9va3VwX19Hcm91cF84X18wX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjcyNzY6MTogKCAoICggcnVsZV9fRGF0YUludGVyY2hhbmdlTG9va3VwX19DYWNoZWRBc3NpZ25tZW50XzhfMCApICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NzI3NzoxOiAoICggcnVsZV9fRGF0YUludGVyY2hhbmdlTG9va3VwX19DYWNoZWRBc3NpZ25tZW50XzhfMCApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjc4ODU6MTogKCAoICggcnVsZV9fRGF0YUludGVyY2hhbmdlTG9va3VwX19DYWNoZWRBc3NpZ25tZW50XzhfMCApICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6Nzg4NjoxOiAoICggcnVsZV9fRGF0YUludGVyY2hhbmdlTG9va3VwX19DYWNoZWRBc3NpZ25tZW50XzhfMCApICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjcyNzc6MTogKCAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUxvb2t1cF9fQ2FjaGVkQXNzaWdubWVudF84XzAgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo3Mjc4OjI6ICggcnVsZV9fRGF0YUludGVyY2hhbmdlTG9va3VwX19DYWNoZWRBc3NpZ25tZW50XzhfMCApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo3ODg2OjE6ICggKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VMb29rdXBfX0NhY2hlZEFzc2lnbm1lbnRfOF8wICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6Nzg4NzoyOiAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUxvb2t1cF9fQ2FjaGVkQXNzaWdubWVudF84XzAgKQogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXREYXRhSW50ZXJjaGFuZ2VMb29rdXBBY2Nlc3MoKS5nZXRDYWNoZWRBc3NpZ25tZW50XzhfMCgpKTsgCiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo3Mjc5OjI6ICggcnVsZV9fRGF0YUludGVyY2hhbmdlTG9va3VwX19DYWNoZWRBc3NpZ25tZW50XzhfMCApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo3Mjc5OjM6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUxvb2t1cF9fQ2FjaGVkQXNzaWdubWVudF84XzAKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjc4ODg6MjogKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VMb29rdXBfX0NhY2hlZEFzc2lnbm1lbnRfOF8wICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjc4ODg6MzogcnVsZV9fRGF0YUludGVyY2hhbmdlTG9va3VwX19DYWNoZWRBc3NpZ25tZW50XzhfMAogICAgICAgICAgICAgewogICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMik7CiAgICAgICAgICAgICBydWxlX19EYXRhSW50ZXJjaGFuZ2VMb29rdXBfX0NhY2hlZEFzc2lnbm1lbnRfOF8wKCk7CkBAIC0yNTQwOCwxNCArMjc1NjUsMTQgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19EYXRhSW50ZXJjaGFuZ2VMb29rdXBfX0dyb3VwXzhfXzEiCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NzI4NzoxOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VMb29rdXBfX0dyb3VwXzhfXzEgOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VMb29rdXBfX0dyb3VwXzhfXzFfX0ltcGwgOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjc4OTY6MTogcnVsZV9fRGF0YUludGVyY2hhbmdlTG9va3VwX19Hcm91cF84X18xIDogcnVsZV9fRGF0YUludGVyY2hhbmdlTG9va3VwX19Hcm91cF84X18xX19JbXBsIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19EYXRhSW50ZXJjaGFuZ2VMb29rdXBfX0dyb3VwXzhfXzEoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NzI5MToxOiAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUxvb2t1cF9fR3JvdXBfOF9fMV9fSW1wbCApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo3MjkyOjI6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUxvb2t1cF9fR3JvdXBfOF9fMV9fSW1wbAorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NzkwMDoxOiAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUxvb2t1cF9fR3JvdXBfOF9fMV9fSW1wbCApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo3OTAxOjI6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUxvb2t1cF9fR3JvdXBfOF9fMV9fSW1wbAogICAgICAgICAgICAgewogICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMik7CiAgICAgICAgICAgICBydWxlX19EYXRhSW50ZXJjaGFuZ2VMb29rdXBfX0dyb3VwXzhfXzFfX0ltcGwoKTsKQEAgLTI1NDQxLDIzICsyNzU5OCwyMyBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX0RhdGFJbnRlcmNoYW5nZUxvb2t1cF9fR3JvdXBfOF9fMV9fSW1wbCIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo3Mjk4OjE6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUxvb2t1cF9fR3JvdXBfOF9fMV9fSW1wbCA6ICggKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VMb29rdXBfX0NhY2hlU2l6ZUFzc2lnbm1lbnRfOF8xICkgKSA7CisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NzkwNzoxOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VMb29rdXBfX0dyb3VwXzhfXzFfX0ltcGwgOiAoICggcnVsZV9fRGF0YUludGVyY2hhbmdlTG9va3VwX19DYWNoZVNpemVBc3NpZ25tZW50XzhfMSApICkgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUxvb2t1cF9fR3JvdXBfOF9fMV9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo3MzAyOjE6ICggKCAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUxvb2t1cF9fQ2FjaGVTaXplQXNzaWdubWVudF84XzEgKSApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjczMDM6MTogKCAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUxvb2t1cF9fQ2FjaGVTaXplQXNzaWdubWVudF84XzEgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo3OTExOjE6ICggKCAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUxvb2t1cF9fQ2FjaGVTaXplQXNzaWdubWVudF84XzEgKSApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjc5MTI6MTogKCAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUxvb2t1cF9fQ2FjaGVTaXplQXNzaWdubWVudF84XzEgKSApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo3MzAzOjE6ICggKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VMb29rdXBfX0NhY2hlU2l6ZUFzc2lnbm1lbnRfOF8xICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NzMwNDoyOiAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUxvb2t1cF9fQ2FjaGVTaXplQXNzaWdubWVudF84XzEgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NzkxMjoxOiAoICggcnVsZV9fRGF0YUludGVyY2hhbmdlTG9va3VwX19DYWNoZVNpemVBc3NpZ25tZW50XzhfMSApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjc5MTM6MjogKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VMb29rdXBfX0NhY2hlU2l6ZUFzc2lnbm1lbnRfOF8xICkKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YUludGVyY2hhbmdlTG9va3VwQWNjZXNzKCkuZ2V0Q2FjaGVTaXplQXNzaWdubWVudF84XzEoKSk7IAogICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NzMwNToyOiAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUxvb2t1cF9fQ2FjaGVTaXplQXNzaWdubWVudF84XzEgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NzMwNTozOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VMb29rdXBfX0NhY2hlU2l6ZUFzc2lnbm1lbnRfOF8xCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo3OTE0OjI6ICggcnVsZV9fRGF0YUludGVyY2hhbmdlTG9va3VwX19DYWNoZVNpemVBc3NpZ25tZW50XzhfMSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo3OTE0OjM6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUxvb2t1cF9fQ2FjaGVTaXplQXNzaWdubWVudF84XzEKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzIpOwogICAgICAgICAgICAgcnVsZV9fRGF0YUludGVyY2hhbmdlTG9va3VwX19DYWNoZVNpemVBc3NpZ25tZW50XzhfMSgpOwpAQCAtMjU0OTIsMTQgKzI3NjQ5LDE0IEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fRGF0YUludGVyY2hhbmdlTG9va3VwX19Hcm91cF85X18wIgotICAgIC8vIEludGVybmFsRGF0YURTTC5nOjczMTQ6MTogcnVsZV9fRGF0YUludGVyY2hhbmdlTG9va3VwX19Hcm91cF85X18wIDogcnVsZV9fRGF0YUludGVyY2hhbmdlTG9va3VwX19Hcm91cF85X18wX19JbXBsIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUxvb2t1cF9fR3JvdXBfOV9fMSA7CisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NzkyMzoxOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VMb29rdXBfX0dyb3VwXzlfXzAgOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VMb29rdXBfX0dyb3VwXzlfXzBfX0ltcGwgcnVsZV9fRGF0YUludGVyY2hhbmdlTG9va3VwX19Hcm91cF85X18xIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19EYXRhSW50ZXJjaGFuZ2VMb29rdXBfX0dyb3VwXzlfXzAoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NzMxODoxOiAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUxvb2t1cF9fR3JvdXBfOV9fMF9fSW1wbCBydWxlX19EYXRhSW50ZXJjaGFuZ2VMb29rdXBfX0dyb3VwXzlfXzEgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NzMxOToyOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VMb29rdXBfX0dyb3VwXzlfXzBfX0ltcGwgcnVsZV9fRGF0YUludGVyY2hhbmdlTG9va3VwX19Hcm91cF85X18xCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo3OTI3OjE6ICggcnVsZV9fRGF0YUludGVyY2hhbmdlTG9va3VwX19Hcm91cF85X18wX19JbXBsIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUxvb2t1cF9fR3JvdXBfOV9fMSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo3OTI4OjI6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUxvb2t1cF9fR3JvdXBfOV9fMF9fSW1wbCBydWxlX19EYXRhSW50ZXJjaGFuZ2VMb29rdXBfX0dyb3VwXzlfXzEKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzkpOwogICAgICAgICAgICAgcnVsZV9fRGF0YUludGVyY2hhbmdlTG9va3VwX19Hcm91cF85X18wX19JbXBsKCk7CkBAIC0yNTUzMCwyMiArMjc2ODcsMjIgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19EYXRhSW50ZXJjaGFuZ2VMb29rdXBfX0dyb3VwXzlfXzBfX0ltcGwiCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NzMyNjoxOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VMb29rdXBfX0dyb3VwXzlfXzBfX0ltcGwgOiAoICdtYXBUbycgKSA7CisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NzkzNToxOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VMb29rdXBfX0dyb3VwXzlfXzBfX0ltcGwgOiAoICdtYXBUbycgKSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fRGF0YUludGVyY2hhbmdlTG9va3VwX19Hcm91cF85X18wX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjczMzA6MTogKCAoICdtYXBUbycgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo3MzMxOjE6ICggJ21hcFRvJyApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo3OTM5OjE6ICggKCAnbWFwVG8nICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6Nzk0MDoxOiAoICdtYXBUbycgKQogICAgICAgICAgICAgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NzMzMToxOiAoICdtYXBUbycgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NzMzMjoyOiAnbWFwVG8nCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo3OTQwOjE6ICggJ21hcFRvJyApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo3OTQxOjI6ICdtYXBUbycKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YUludGVyY2hhbmdlTG9va3VwQWNjZXNzKCkuZ2V0TWFwVG9LZXl3b3JkXzlfMCgpKTsgCiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBtYXRjaChpbnB1dCw5OCxGT0xMT1dfMik7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CisgICAgICAgICAgICBtYXRjaChpbnB1dCwxMDUsRk9MTE9XXzIpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOwogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBhZnRlcihncmFtbWFyQWNjZXNzLmdldERhdGFJbnRlcmNoYW5nZUxvb2t1cEFjY2VzcygpLmdldE1hcFRvS2V5d29yZF85XzAoKSk7IAogICAgICAgICAgICAgfQpAQCAtMjU1NzEsMTQgKzI3NzI4LDE0IEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fRGF0YUludGVyY2hhbmdlTG9va3VwX19Hcm91cF85X18xIgotICAgIC8vIEludGVybmFsRGF0YURTTC5nOjczNDE6MTogcnVsZV9fRGF0YUludGVyY2hhbmdlTG9va3VwX19Hcm91cF85X18xIDogcnVsZV9fRGF0YUludGVyY2hhbmdlTG9va3VwX19Hcm91cF85X18xX19JbXBsIDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo3OTUwOjE6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUxvb2t1cF9fR3JvdXBfOV9fMSA6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUxvb2t1cF9fR3JvdXBfOV9fMV9fSW1wbCA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fRGF0YUludGVyY2hhbmdlTG9va3VwX19Hcm91cF85X18xKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjczNDU6MTogKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VMb29rdXBfX0dyb3VwXzlfXzFfX0ltcGwgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NzM0NjoyOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VMb29rdXBfX0dyb3VwXzlfXzFfX0ltcGwKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjc5NTQ6MTogKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VMb29rdXBfX0dyb3VwXzlfXzFfX0ltcGwgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6Nzk1NToyOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VMb29rdXBfX0dyb3VwXzlfXzFfX0ltcGwKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzIpOwogICAgICAgICAgICAgcnVsZV9fRGF0YUludGVyY2hhbmdlTG9va3VwX19Hcm91cF85X18xX19JbXBsKCk7CkBAIC0yNTYwNCwyMyArMjc3NjEsMjMgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19EYXRhSW50ZXJjaGFuZ2VMb29rdXBfX0dyb3VwXzlfXzFfX0ltcGwiCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NzM1MjoxOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VMb29rdXBfX0dyb3VwXzlfXzFfX0ltcGwgOiAoICggcnVsZV9fRGF0YUludGVyY2hhbmdlTG9va3VwX19EYXRhTWFwQXNzaWdubWVudF85XzEgKSApIDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo3OTYxOjE6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUxvb2t1cF9fR3JvdXBfOV9fMV9fSW1wbCA6ICggKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VMb29rdXBfX0RhdGFNYXBBc3NpZ25tZW50XzlfMSApICkgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUxvb2t1cF9fR3JvdXBfOV9fMV9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo3MzU2OjE6ICggKCAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUxvb2t1cF9fRGF0YU1hcEFzc2lnbm1lbnRfOV8xICkgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo3MzU3OjE6ICggKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VMb29rdXBfX0RhdGFNYXBBc3NpZ25tZW50XzlfMSApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjc5NjU6MTogKCAoICggcnVsZV9fRGF0YUludGVyY2hhbmdlTG9va3VwX19EYXRhTWFwQXNzaWdubWVudF85XzEgKSApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjc5NjY6MTogKCAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUxvb2t1cF9fRGF0YU1hcEFzc2lnbm1lbnRfOV8xICkgKQogICAgICAgICAgICAgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NzM1NzoxOiAoICggcnVsZV9fRGF0YUludGVyY2hhbmdlTG9va3VwX19EYXRhTWFwQXNzaWdubWVudF85XzEgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo3MzU4OjI6ICggcnVsZV9fRGF0YUludGVyY2hhbmdlTG9va3VwX19EYXRhTWFwQXNzaWdubWVudF85XzEgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6Nzk2NjoxOiAoICggcnVsZV9fRGF0YUludGVyY2hhbmdlTG9va3VwX19EYXRhTWFwQXNzaWdubWVudF85XzEgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo3OTY3OjI6ICggcnVsZV9fRGF0YUludGVyY2hhbmdlTG9va3VwX19EYXRhTWFwQXNzaWdubWVudF85XzEgKQogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXREYXRhSW50ZXJjaGFuZ2VMb29rdXBBY2Nlc3MoKS5nZXREYXRhTWFwQXNzaWdubWVudF85XzEoKSk7IAogICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NzM1OToyOiAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUxvb2t1cF9fRGF0YU1hcEFzc2lnbm1lbnRfOV8xICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjczNTk6MzogcnVsZV9fRGF0YUludGVyY2hhbmdlTG9va3VwX19EYXRhTWFwQXNzaWdubWVudF85XzEKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjc5Njg6MjogKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VMb29rdXBfX0RhdGFNYXBBc3NpZ25tZW50XzlfMSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo3OTY4OjM6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUxvb2t1cF9fRGF0YU1hcEFzc2lnbm1lbnRfOV8xCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV18yKTsKICAgICAgICAgICAgIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUxvb2t1cF9fRGF0YU1hcEFzc2lnbm1lbnRfOV8xKCk7CkBAIC0yNTY1NSwxNiArMjc4MTIsMTYgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19EYXRhSW50ZXJjaGFuZ2VNYXJrZXJQYXRoX19Hcm91cF9fMCIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo3MzY4OjE6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZU1hcmtlclBhdGhfX0dyb3VwX18wIDogcnVsZV9fRGF0YUludGVyY2hhbmdlTWFya2VyUGF0aF9fR3JvdXBfXzBfX0ltcGwgcnVsZV9fRGF0YUludGVyY2hhbmdlTWFya2VyUGF0aF9fR3JvdXBfXzEgOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjc5Nzc6MTogcnVsZV9fRGF0YUludGVyY2hhbmdlTWFya2VyUGF0aF9fR3JvdXBfXzAgOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VNYXJrZXJQYXRoX19Hcm91cF9fMF9fSW1wbCBydWxlX19EYXRhSW50ZXJjaGFuZ2VNYXJrZXJQYXRoX19Hcm91cF9fMSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fRGF0YUludGVyY2hhbmdlTWFya2VyUGF0aF9fR3JvdXBfXzAoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NzM3MjoxOiAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZU1hcmtlclBhdGhfX0dyb3VwX18wX19JbXBsIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZU1hcmtlclBhdGhfX0dyb3VwX18xICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjczNzM6MjogcnVsZV9fRGF0YUludGVyY2hhbmdlTWFya2VyUGF0aF9fR3JvdXBfXzBfX0ltcGwgcnVsZV9fRGF0YUludGVyY2hhbmdlTWFya2VyUGF0aF9fR3JvdXBfXzEKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjc5ODE6MTogKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VNYXJrZXJQYXRoX19Hcm91cF9fMF9fSW1wbCBydWxlX19EYXRhSW50ZXJjaGFuZ2VNYXJrZXJQYXRoX19Hcm91cF9fMSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo3OTgyOjI6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZU1hcmtlclBhdGhfX0dyb3VwX18wX19JbXBsIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZU1hcmtlclBhdGhfX0dyb3VwX18xCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV180Myk7CisgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV180Nyk7CiAgICAgICAgICAgICBydWxlX19EYXRhSW50ZXJjaGFuZ2VNYXJrZXJQYXRoX19Hcm91cF9fMF9fSW1wbCgpOwogCiAgICAgICAgICAgICBzdGF0ZS5fZnNwLS07CkBAIC0yNTY5MywyMyArMjc4NTAsMjMgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19EYXRhSW50ZXJjaGFuZ2VNYXJrZXJQYXRoX19Hcm91cF9fMF9fSW1wbCIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo3MzgwOjE6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZU1hcmtlclBhdGhfX0dyb3VwX18wX19JbXBsIDogKCAoKSApIDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo3OTg5OjE6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZU1hcmtlclBhdGhfX0dyb3VwX18wX19JbXBsIDogKCAoKSApIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19EYXRhSW50ZXJjaGFuZ2VNYXJrZXJQYXRoX19Hcm91cF9fMF9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo3Mzg0OjE6ICggKCAoKSApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjczODU6MTogKCAoKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo3OTkzOjE6ICggKCAoKSApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjc5OTQ6MTogKCAoKSApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo3Mzg1OjE6ICggKCkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NzM4NjoyOiAoKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6Nzk5NDoxOiAoICgpICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjc5OTU6MjogKCkKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YUludGVyY2hhbmdlTWFya2VyUGF0aEFjY2VzcygpLmdldERhdGFJbnRlcmNoYW5nZU1hcmtlclBhdGhBY3Rpb25fMCgpKTsgCiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo3Mzg3OjI6ICgpCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo3Mzg3OjM6IAorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6Nzk5NjoyOiAoKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6Nzk5NjozOiAKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIH0KIApAQCAtMjU3MzQsMTQgKzI3ODkxLDE0IEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fRGF0YUludGVyY2hhbmdlTWFya2VyUGF0aF9fR3JvdXBfXzEiCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NzM5NToxOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VNYXJrZXJQYXRoX19Hcm91cF9fMSA6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZU1hcmtlclBhdGhfX0dyb3VwX18xX19JbXBsIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZU1hcmtlclBhdGhfX0dyb3VwX18yIDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo4MDA0OjE6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZU1hcmtlclBhdGhfX0dyb3VwX18xIDogcnVsZV9fRGF0YUludGVyY2hhbmdlTWFya2VyUGF0aF9fR3JvdXBfXzFfX0ltcGwgcnVsZV9fRGF0YUludGVyY2hhbmdlTWFya2VyUGF0aF9fR3JvdXBfXzIgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZU1hcmtlclBhdGhfX0dyb3VwX18xKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjczOTk6MTogKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VNYXJrZXJQYXRoX19Hcm91cF9fMV9fSW1wbCBydWxlX19EYXRhSW50ZXJjaGFuZ2VNYXJrZXJQYXRoX19Hcm91cF9fMiApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo3NDAwOjI6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZU1hcmtlclBhdGhfX0dyb3VwX18xX19JbXBsIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZU1hcmtlclBhdGhfX0dyb3VwX18yCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo4MDA4OjE6ICggcnVsZV9fRGF0YUludGVyY2hhbmdlTWFya2VyUGF0aF9fR3JvdXBfXzFfX0ltcGwgcnVsZV9fRGF0YUludGVyY2hhbmdlTWFya2VyUGF0aF9fR3JvdXBfXzIgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6ODAwOToyOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VNYXJrZXJQYXRoX19Hcm91cF9fMV9fSW1wbCBydWxlX19EYXRhSW50ZXJjaGFuZ2VNYXJrZXJQYXRoX19Hcm91cF9fMgogICAgICAgICAgICAgewogICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMTApOwogICAgICAgICAgICAgcnVsZV9fRGF0YUludGVyY2hhbmdlTWFya2VyUGF0aF9fR3JvdXBfXzFfX0ltcGwoKTsKQEAgLTI1NzcyLDIyICsyNzkyOSwyMiBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX0RhdGFJbnRlcmNoYW5nZU1hcmtlclBhdGhfX0dyb3VwX18xX19JbXBsIgotICAgIC8vIEludGVybmFsRGF0YURTTC5nOjc0MDc6MTogcnVsZV9fRGF0YUludGVyY2hhbmdlTWFya2VyUGF0aF9fR3JvdXBfXzFfX0ltcGwgOiAoICdtYXJrZXJQYXRoJyApIDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo4MDE2OjE6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZU1hcmtlclBhdGhfX0dyb3VwX18xX19JbXBsIDogKCAnbWFya2VyUGF0aCcgKSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fRGF0YUludGVyY2hhbmdlTWFya2VyUGF0aF9fR3JvdXBfXzFfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NzQxMToxOiAoICggJ21hcmtlclBhdGgnICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NzQxMjoxOiAoICdtYXJrZXJQYXRoJyApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo4MDIwOjE6ICggKCAnbWFya2VyUGF0aCcgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo4MDIxOjE6ICggJ21hcmtlclBhdGgnICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjc0MTI6MTogKCAnbWFya2VyUGF0aCcgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NzQxMzoyOiAnbWFya2VyUGF0aCcKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjgwMjE6MTogKCAnbWFya2VyUGF0aCcgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6ODAyMjoyOiAnbWFya2VyUGF0aCcKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YUludGVyY2hhbmdlTWFya2VyUGF0aEFjY2VzcygpLmdldE1hcmtlclBhdGhLZXl3b3JkXzEoKSk7IAogICAgICAgICAgICAgfQotICAgICAgICAgICAgbWF0Y2goaW5wdXQsOTksRk9MTE9XXzIpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOworICAgICAgICAgICAgbWF0Y2goaW5wdXQsMTA2LEZPTExPV18yKTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXREYXRhSW50ZXJjaGFuZ2VNYXJrZXJQYXRoQWNjZXNzKCkuZ2V0TWFya2VyUGF0aEtleXdvcmRfMSgpKTsgCiAgICAgICAgICAgICB9CkBAIC0yNTgxMywxNiArMjc5NzAsMTYgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19EYXRhSW50ZXJjaGFuZ2VNYXJrZXJQYXRoX19Hcm91cF9fMiIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo3NDIyOjE6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZU1hcmtlclBhdGhfX0dyb3VwX18yIDogcnVsZV9fRGF0YUludGVyY2hhbmdlTWFya2VyUGF0aF9fR3JvdXBfXzJfX0ltcGwgcnVsZV9fRGF0YUludGVyY2hhbmdlTWFya2VyUGF0aF9fR3JvdXBfXzMgOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjgwMzE6MTogcnVsZV9fRGF0YUludGVyY2hhbmdlTWFya2VyUGF0aF9fR3JvdXBfXzIgOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VNYXJrZXJQYXRoX19Hcm91cF9fMl9fSW1wbCBydWxlX19EYXRhSW50ZXJjaGFuZ2VNYXJrZXJQYXRoX19Hcm91cF9fMyA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fRGF0YUludGVyY2hhbmdlTWFya2VyUGF0aF9fR3JvdXBfXzIoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NzQyNjoxOiAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZU1hcmtlclBhdGhfX0dyb3VwX18yX19JbXBsIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZU1hcmtlclBhdGhfX0dyb3VwX18zICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjc0Mjc6MjogcnVsZV9fRGF0YUludGVyY2hhbmdlTWFya2VyUGF0aF9fR3JvdXBfXzJfX0ltcGwgcnVsZV9fRGF0YUludGVyY2hhbmdlTWFya2VyUGF0aF9fR3JvdXBfXzMKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjgwMzU6MTogKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VNYXJrZXJQYXRoX19Hcm91cF9fMl9fSW1wbCBydWxlX19EYXRhSW50ZXJjaGFuZ2VNYXJrZXJQYXRoX19Hcm91cF9fMyApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo4MDM2OjI6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZU1hcmtlclBhdGhfX0dyb3VwX18yX19JbXBsIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZU1hcmtlclBhdGhfX0dyb3VwX18zCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV180NCk7CisgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV180OCk7CiAgICAgICAgICAgICBydWxlX19EYXRhSW50ZXJjaGFuZ2VNYXJrZXJQYXRoX19Hcm91cF9fMl9fSW1wbCgpOwogCiAgICAgICAgICAgICBzdGF0ZS5fZnNwLS07CkBAIC0yNTg1MSwyMiArMjgwMDgsMjIgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19EYXRhSW50ZXJjaGFuZ2VNYXJrZXJQYXRoX19Hcm91cF9fMl9fSW1wbCIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo3NDM0OjE6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZU1hcmtlclBhdGhfX0dyb3VwX18yX19JbXBsIDogKCAneycgKSA7CisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6ODA0MzoxOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VNYXJrZXJQYXRoX19Hcm91cF9fMl9fSW1wbCA6ICggJ3snICkgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZU1hcmtlclBhdGhfX0dyb3VwX18yX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjc0Mzg6MTogKCAoICd7JyApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjc0Mzk6MTogKCAneycgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6ODA0NzoxOiAoICggJ3snICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6ODA0ODoxOiAoICd7JyApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo3NDM5OjE6ICggJ3snICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjc0NDA6MjogJ3snCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo4MDQ4OjE6ICggJ3snICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjgwNDk6MjogJ3snCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldERhdGFJbnRlcmNoYW5nZU1hcmtlclBhdGhBY2Nlc3MoKS5nZXRMZWZ0Q3VybHlCcmFja2V0S2V5d29yZF8yKCkpOyAKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1hdGNoKGlucHV0LDcwLEZPTExPV18yKTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKKyAgICAgICAgICAgIG1hdGNoKGlucHV0LDc1LEZPTExPV18yKTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXREYXRhSW50ZXJjaGFuZ2VNYXJrZXJQYXRoQWNjZXNzKCkuZ2V0TGVmdEN1cmx5QnJhY2tldEtleXdvcmRfMigpKTsgCiAgICAgICAgICAgICB9CkBAIC0yNTg5MiwxNiArMjgwNDksMTYgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19EYXRhSW50ZXJjaGFuZ2VNYXJrZXJQYXRoX19Hcm91cF9fMyIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo3NDQ5OjE6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZU1hcmtlclBhdGhfX0dyb3VwX18zIDogcnVsZV9fRGF0YUludGVyY2hhbmdlTWFya2VyUGF0aF9fR3JvdXBfXzNfX0ltcGwgcnVsZV9fRGF0YUludGVyY2hhbmdlTWFya2VyUGF0aF9fR3JvdXBfXzQgOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjgwNTg6MTogcnVsZV9fRGF0YUludGVyY2hhbmdlTWFya2VyUGF0aF9fR3JvdXBfXzMgOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VNYXJrZXJQYXRoX19Hcm91cF9fM19fSW1wbCBydWxlX19EYXRhSW50ZXJjaGFuZ2VNYXJrZXJQYXRoX19Hcm91cF9fNCA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fRGF0YUludGVyY2hhbmdlTWFya2VyUGF0aF9fR3JvdXBfXzMoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NzQ1MzoxOiAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZU1hcmtlclBhdGhfX0dyb3VwX18zX19JbXBsIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZU1hcmtlclBhdGhfX0dyb3VwX180ICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjc0NTQ6MjogcnVsZV9fRGF0YUludGVyY2hhbmdlTWFya2VyUGF0aF9fR3JvdXBfXzNfX0ltcGwgcnVsZV9fRGF0YUludGVyY2hhbmdlTWFya2VyUGF0aF9fR3JvdXBfXzQKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjgwNjI6MTogKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VNYXJrZXJQYXRoX19Hcm91cF9fM19fSW1wbCBydWxlX19EYXRhSW50ZXJjaGFuZ2VNYXJrZXJQYXRoX19Hcm91cF9fNCApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo4MDYzOjI6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZU1hcmtlclBhdGhfX0dyb3VwX18zX19JbXBsIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZU1hcmtlclBhdGhfX0dyb3VwX180CiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV180NCk7CisgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV180OCk7CiAgICAgICAgICAgICBydWxlX19EYXRhSW50ZXJjaGFuZ2VNYXJrZXJQYXRoX19Hcm91cF9fM19fSW1wbCgpOwogCiAgICAgICAgICAgICBzdGF0ZS5fZnNwLS07CkBAIC0yNTkzMCwzNyArMjgwODcsMzcgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19EYXRhSW50ZXJjaGFuZ2VNYXJrZXJQYXRoX19Hcm91cF9fM19fSW1wbCIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo3NDYxOjE6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZU1hcmtlclBhdGhfX0dyb3VwX18zX19JbXBsIDogKCAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZU1hcmtlclBhdGhfX1BhdGhBc3NpZ25tZW50XzMgKSogKSA7CisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6ODA3MDoxOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VNYXJrZXJQYXRoX19Hcm91cF9fM19fSW1wbCA6ICggKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VNYXJrZXJQYXRoX19QYXRoQXNzaWdubWVudF8zICkqICkgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZU1hcmtlclBhdGhfX0dyb3VwX18zX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjc0NjU6MTogKCAoICggcnVsZV9fRGF0YUludGVyY2hhbmdlTWFya2VyUGF0aF9fUGF0aEFzc2lnbm1lbnRfMyApKiApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjc0NjY6MTogKCAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZU1hcmtlclBhdGhfX1BhdGhBc3NpZ25tZW50XzMgKSogKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6ODA3NDoxOiAoICggKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VNYXJrZXJQYXRoX19QYXRoQXNzaWdubWVudF8zICkqICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6ODA3NToxOiAoICggcnVsZV9fRGF0YUludGVyY2hhbmdlTWFya2VyUGF0aF9fUGF0aEFzc2lnbm1lbnRfMyApKiApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo3NDY2OjE6ICggKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VNYXJrZXJQYXRoX19QYXRoQXNzaWdubWVudF8zICkqICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjc0Njc6MjogKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VNYXJrZXJQYXRoX19QYXRoQXNzaWdubWVudF8zICkqCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo4MDc1OjE6ICggKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VNYXJrZXJQYXRoX19QYXRoQXNzaWdubWVudF8zICkqICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjgwNzY6MjogKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VNYXJrZXJQYXRoX19QYXRoQXNzaWdubWVudF8zICkqCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldERhdGFJbnRlcmNoYW5nZU1hcmtlclBhdGhBY2Nlc3MoKS5nZXRQYXRoQXNzaWdubWVudF8zKCkpOyAKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjc0Njg6MjogKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VNYXJrZXJQYXRoX19QYXRoQXNzaWdubWVudF8zICkqCi0gICAgICAgICAgICBsb29wNzk6CisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo4MDc3OjI6ICggcnVsZV9fRGF0YUludGVyY2hhbmdlTWFya2VyUGF0aF9fUGF0aEFzc2lnbm1lbnRfMyApKgorICAgICAgICAgICAgbG9vcDg3OgogICAgICAgICAgICAgZG8gewotICAgICAgICAgICAgICAgIGludCBhbHQ3OT0yOwotICAgICAgICAgICAgICAgIGludCBMQTc5XzAgPSBpbnB1dC5MQSgxKTsKKyAgICAgICAgICAgICAgICBpbnQgYWx0ODc9MjsKKyAgICAgICAgICAgICAgICBpbnQgTEE4N18wID0gaW5wdXQuTEEoMSk7CiAKLSAgICAgICAgICAgICAgICBpZiAoIChMQTc5XzA9PTEwMCkgKSB7Ci0gICAgICAgICAgICAgICAgICAgIGFsdDc5PTE7CisgICAgICAgICAgICAgICAgaWYgKCAoTEE4N18wPT0xMDcpICkgeworICAgICAgICAgICAgICAgICAgICBhbHQ4Nz0xOwogICAgICAgICAgICAgICAgIH0KIAogCi0gICAgICAgICAgICAgICAgc3dpdGNoIChhbHQ3OSkgeworICAgICAgICAgICAgICAgIHN3aXRjaCAoYWx0ODcpIHsKICAgICAgICAgICAgIAljYXNlIDEgOgotICAgICAgICAgICAgCSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo3NDY4OjM6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZU1hcmtlclBhdGhfX1BhdGhBc3NpZ25tZW50XzMKKyAgICAgICAgICAgIAkgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6ODA3NzozOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VNYXJrZXJQYXRoX19QYXRoQXNzaWdubWVudF8zCiAgICAgICAgICAgICAJICAgIHsKLSAgICAgICAgICAgIAkgICAgcHVzaEZvbGxvdyhGT0xMT1dfNDUpOworICAgICAgICAgICAgCSAgICBwdXNoRm9sbG93KEZPTExPV180OSk7CiAgICAgICAgICAgICAJICAgIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZU1hcmtlclBhdGhfX1BhdGhBc3NpZ25tZW50XzMoKTsKIAogICAgICAgICAgICAgCSAgICBzdGF0ZS5fZnNwLS07CkBAIC0yNTk3MCw3ICsyODEyNyw3IEBACiAgICAgICAgICAgICAJICAgIGJyZWFrOwogCiAgICAgICAgICAgICAJZGVmYXVsdCA6Ci0gICAgICAgICAgICAJICAgIGJyZWFrIGxvb3A3OTsKKyAgICAgICAgICAgIAkgICAgYnJlYWsgbG9vcDg3OwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0gd2hpbGUgKHRydWUpOwogCkBAIC0yNTk5OSwxNCArMjgxNTYsMTQgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19EYXRhSW50ZXJjaGFuZ2VNYXJrZXJQYXRoX19Hcm91cF9fNCIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo3NDc2OjE6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZU1hcmtlclBhdGhfX0dyb3VwX180IDogcnVsZV9fRGF0YUludGVyY2hhbmdlTWFya2VyUGF0aF9fR3JvdXBfXzRfX0ltcGwgOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjgwODU6MTogcnVsZV9fRGF0YUludGVyY2hhbmdlTWFya2VyUGF0aF9fR3JvdXBfXzQgOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VNYXJrZXJQYXRoX19Hcm91cF9fNF9fSW1wbCA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fRGF0YUludGVyY2hhbmdlTWFya2VyUGF0aF9fR3JvdXBfXzQoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NzQ4MDoxOiAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZU1hcmtlclBhdGhfX0dyb3VwX180X19JbXBsICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjc0ODE6MjogcnVsZV9fRGF0YUludGVyY2hhbmdlTWFya2VyUGF0aF9fR3JvdXBfXzRfX0ltcGwKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjgwODk6MTogKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VNYXJrZXJQYXRoX19Hcm91cF9fNF9fSW1wbCApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo4MDkwOjI6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZU1hcmtlclBhdGhfX0dyb3VwX180X19JbXBsCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV18yKTsKICAgICAgICAgICAgIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZU1hcmtlclBhdGhfX0dyb3VwX180X19JbXBsKCk7CkBAIC0yNjAzMiwyMiArMjgxODksMjIgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19EYXRhSW50ZXJjaGFuZ2VNYXJrZXJQYXRoX19Hcm91cF9fNF9fSW1wbCIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo3NDg3OjE6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZU1hcmtlclBhdGhfX0dyb3VwX180X19JbXBsIDogKCAnfScgKSA7CisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6ODA5NjoxOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VNYXJrZXJQYXRoX19Hcm91cF9fNF9fSW1wbCA6ICggJ30nICkgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZU1hcmtlclBhdGhfX0dyb3VwX180X19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjc0OTE6MTogKCAoICd9JyApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjc0OTI6MTogKCAnfScgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6ODEwMDoxOiAoICggJ30nICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6ODEwMToxOiAoICd9JyApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo3NDkyOjE6ICggJ30nICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjc0OTM6MjogJ30nCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo4MTAxOjE6ICggJ30nICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjgxMDI6MjogJ30nCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldERhdGFJbnRlcmNoYW5nZU1hcmtlclBhdGhBY2Nlc3MoKS5nZXRSaWdodEN1cmx5QnJhY2tldEtleXdvcmRfNCgpKTsgCiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBtYXRjaChpbnB1dCw3MSxGT0xMT1dfMik7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CisgICAgICAgICAgICBtYXRjaChpbnB1dCw3NixGT0xMT1dfMik7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YUludGVyY2hhbmdlTWFya2VyUGF0aEFjY2VzcygpLmdldFJpZ2h0Q3VybHlCcmFja2V0S2V5d29yZF80KCkpOyAKICAgICAgICAgICAgIH0KQEAgLTI2MDczLDE2ICsyODIzMCwxNiBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX0RhdGFJbnRlcmNoYW5nZU1hcmtlckVudGl0eV9fR3JvdXBfXzAiCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NzUwMzoxOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VNYXJrZXJFbnRpdHlfX0dyb3VwX18wIDogcnVsZV9fRGF0YUludGVyY2hhbmdlTWFya2VyRW50aXR5X19Hcm91cF9fMF9fSW1wbCBydWxlX19EYXRhSW50ZXJjaGFuZ2VNYXJrZXJFbnRpdHlfX0dyb3VwX18xIDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo4MTEyOjE6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZU1hcmtlckVudGl0eV9fR3JvdXBfXzAgOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VNYXJrZXJFbnRpdHlfX0dyb3VwX18wX19JbXBsIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZU1hcmtlckVudGl0eV9fR3JvdXBfXzEgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZU1hcmtlckVudGl0eV9fR3JvdXBfXzAoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NzUwNzoxOiAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZU1hcmtlckVudGl0eV9fR3JvdXBfXzBfX0ltcGwgcnVsZV9fRGF0YUludGVyY2hhbmdlTWFya2VyRW50aXR5X19Hcm91cF9fMSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo3NTA4OjI6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZU1hcmtlckVudGl0eV9fR3JvdXBfXzBfX0ltcGwgcnVsZV9fRGF0YUludGVyY2hhbmdlTWFya2VyRW50aXR5X19Hcm91cF9fMQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6ODExNjoxOiAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZU1hcmtlckVudGl0eV9fR3JvdXBfXzBfX0ltcGwgcnVsZV9fRGF0YUludGVyY2hhbmdlTWFya2VyRW50aXR5X19Hcm91cF9fMSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo4MTE3OjI6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZU1hcmtlckVudGl0eV9fR3JvdXBfXzBfX0ltcGwgcnVsZV9fRGF0YUludGVyY2hhbmdlTWFya2VyRW50aXR5X19Hcm91cF9fMQogICAgICAgICAgICAgewotICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfNDYpOworICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfNTApOwogICAgICAgICAgICAgcnVsZV9fRGF0YUludGVyY2hhbmdlTWFya2VyRW50aXR5X19Hcm91cF9fMF9fSW1wbCgpOwogCiAgICAgICAgICAgICBzdGF0ZS5fZnNwLS07CkBAIC0yNjExMSwyMyArMjgyNjgsMjMgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19EYXRhSW50ZXJjaGFuZ2VNYXJrZXJFbnRpdHlfX0dyb3VwX18wX19JbXBsIgotICAgIC8vIEludGVybmFsRGF0YURTTC5nOjc1MTU6MTogcnVsZV9fRGF0YUludGVyY2hhbmdlTWFya2VyRW50aXR5X19Hcm91cF9fMF9fSW1wbCA6ICggKCkgKSA7CisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6ODEyNDoxOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VNYXJrZXJFbnRpdHlfX0dyb3VwX18wX19JbXBsIDogKCAoKSApIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19EYXRhSW50ZXJjaGFuZ2VNYXJrZXJFbnRpdHlfX0dyb3VwX18wX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjc1MTk6MTogKCAoICgpICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NzUyMDoxOiAoICgpICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjgxMjg6MTogKCAoICgpICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6ODEyOToxOiAoICgpICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjc1MjA6MTogKCAoKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo3NTIxOjI6ICgpCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo4MTI5OjE6ICggKCkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6ODEzMDoyOiAoKQogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXREYXRhSW50ZXJjaGFuZ2VNYXJrZXJFbnRpdHlBY2Nlc3MoKS5nZXREYXRhSW50ZXJjaGFuZ2VNYXJrZXJFbnRpdHlBY3Rpb25fMCgpKTsgCiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo3NTIyOjI6ICgpCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo3NTIyOjM6IAorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6ODEzMToyOiAoKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6ODEzMTozOiAKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIH0KIApAQCAtMjYxNTIsMTQgKzI4MzA5LDE0IEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fRGF0YUludGVyY2hhbmdlTWFya2VyRW50aXR5X19Hcm91cF9fMSIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo3NTMwOjE6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZU1hcmtlckVudGl0eV9fR3JvdXBfXzEgOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VNYXJrZXJFbnRpdHlfX0dyb3VwX18xX19JbXBsIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZU1hcmtlckVudGl0eV9fR3JvdXBfXzIgOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjgxMzk6MTogcnVsZV9fRGF0YUludGVyY2hhbmdlTWFya2VyRW50aXR5X19Hcm91cF9fMSA6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZU1hcmtlckVudGl0eV9fR3JvdXBfXzFfX0ltcGwgcnVsZV9fRGF0YUludGVyY2hhbmdlTWFya2VyRW50aXR5X19Hcm91cF9fMiA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fRGF0YUludGVyY2hhbmdlTWFya2VyRW50aXR5X19Hcm91cF9fMSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo3NTM0OjE6ICggcnVsZV9fRGF0YUludGVyY2hhbmdlTWFya2VyRW50aXR5X19Hcm91cF9fMV9fSW1wbCBydWxlX19EYXRhSW50ZXJjaGFuZ2VNYXJrZXJFbnRpdHlfX0dyb3VwX18yICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjc1MzU6MjogcnVsZV9fRGF0YUludGVyY2hhbmdlTWFya2VyRW50aXR5X19Hcm91cF9fMV9fSW1wbCBydWxlX19EYXRhSW50ZXJjaGFuZ2VNYXJrZXJFbnRpdHlfX0dyb3VwX18yCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo4MTQzOjE6ICggcnVsZV9fRGF0YUludGVyY2hhbmdlTWFya2VyRW50aXR5X19Hcm91cF9fMV9fSW1wbCBydWxlX19EYXRhSW50ZXJjaGFuZ2VNYXJrZXJFbnRpdHlfX0dyb3VwX18yICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjgxNDQ6MjogcnVsZV9fRGF0YUludGVyY2hhbmdlTWFya2VyRW50aXR5X19Hcm91cF9fMV9fSW1wbCBydWxlX19EYXRhSW50ZXJjaGFuZ2VNYXJrZXJFbnRpdHlfX0dyb3VwX18yCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV183KTsKICAgICAgICAgICAgIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZU1hcmtlckVudGl0eV9fR3JvdXBfXzFfX0ltcGwoKTsKQEAgLTI2MTkwLDIyICsyODM0NywyMiBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX0RhdGFJbnRlcmNoYW5nZU1hcmtlckVudGl0eV9fR3JvdXBfXzFfX0ltcGwiCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NzU0MjoxOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VNYXJrZXJFbnRpdHlfX0dyb3VwX18xX19JbXBsIDogKCAnbWFya2VyRW50aXR5JyApIDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo4MTUxOjE6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZU1hcmtlckVudGl0eV9fR3JvdXBfXzFfX0ltcGwgOiAoICdtYXJrZXJFbnRpdHknICkgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZU1hcmtlckVudGl0eV9fR3JvdXBfXzFfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NzU0NjoxOiAoICggJ21hcmtlckVudGl0eScgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo3NTQ3OjE6ICggJ21hcmtlckVudGl0eScgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6ODE1NToxOiAoICggJ21hcmtlckVudGl0eScgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo4MTU2OjE6ICggJ21hcmtlckVudGl0eScgKQogICAgICAgICAgICAgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NzU0NzoxOiAoICdtYXJrZXJFbnRpdHknICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjc1NDg6MjogJ21hcmtlckVudGl0eScKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjgxNTY6MTogKCAnbWFya2VyRW50aXR5JyApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo4MTU3OjI6ICdtYXJrZXJFbnRpdHknCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldERhdGFJbnRlcmNoYW5nZU1hcmtlckVudGl0eUFjY2VzcygpLmdldE1hcmtlckVudGl0eUtleXdvcmRfMSgpKTsgCiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBtYXRjaChpbnB1dCwxMDAsRk9MTE9XXzIpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOworICAgICAgICAgICAgbWF0Y2goaW5wdXQsMTA3LEZPTExPV18yKTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXREYXRhSW50ZXJjaGFuZ2VNYXJrZXJFbnRpdHlBY2Nlc3MoKS5nZXRNYXJrZXJFbnRpdHlLZXl3b3JkXzEoKSk7IAogICAgICAgICAgICAgfQpAQCAtMjYyMzEsMTYgKzI4Mzg4LDE2IEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fRGF0YUludGVyY2hhbmdlTWFya2VyRW50aXR5X19Hcm91cF9fMiIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo3NTU3OjE6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZU1hcmtlckVudGl0eV9fR3JvdXBfXzIgOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VNYXJrZXJFbnRpdHlfX0dyb3VwX18yX19JbXBsIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZU1hcmtlckVudGl0eV9fR3JvdXBfXzMgOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjgxNjY6MTogcnVsZV9fRGF0YUludGVyY2hhbmdlTWFya2VyRW50aXR5X19Hcm91cF9fMiA6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZU1hcmtlckVudGl0eV9fR3JvdXBfXzJfX0ltcGwgcnVsZV9fRGF0YUludGVyY2hhbmdlTWFya2VyRW50aXR5X19Hcm91cF9fMyA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fRGF0YUludGVyY2hhbmdlTWFya2VyRW50aXR5X19Hcm91cF9fMigpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo3NTYxOjE6ICggcnVsZV9fRGF0YUludGVyY2hhbmdlTWFya2VyRW50aXR5X19Hcm91cF9fMl9fSW1wbCBydWxlX19EYXRhSW50ZXJjaGFuZ2VNYXJrZXJFbnRpdHlfX0dyb3VwX18zICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjc1NjI6MjogcnVsZV9fRGF0YUludGVyY2hhbmdlTWFya2VyRW50aXR5X19Hcm91cF9fMl9fSW1wbCBydWxlX19EYXRhSW50ZXJjaGFuZ2VNYXJrZXJFbnRpdHlfX0dyb3VwX18zCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo4MTcwOjE6ICggcnVsZV9fRGF0YUludGVyY2hhbmdlTWFya2VyRW50aXR5X19Hcm91cF9fMl9fSW1wbCBydWxlX19EYXRhSW50ZXJjaGFuZ2VNYXJrZXJFbnRpdHlfX0dyb3VwX18zICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjgxNzE6MjogcnVsZV9fRGF0YUludGVyY2hhbmdlTWFya2VyRW50aXR5X19Hcm91cF9fMl9fSW1wbCBydWxlX19EYXRhSW50ZXJjaGFuZ2VNYXJrZXJFbnRpdHlfX0dyb3VwX18zCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV180Nyk7CisgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV181MSk7CiAgICAgICAgICAgICBydWxlX19EYXRhSW50ZXJjaGFuZ2VNYXJrZXJFbnRpdHlfX0dyb3VwX18yX19JbXBsKCk7CiAKICAgICAgICAgICAgIHN0YXRlLl9mc3AtLTsKQEAgLTI2MjY5LDIzICsyODQyNiwyMyBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX0RhdGFJbnRlcmNoYW5nZU1hcmtlckVudGl0eV9fR3JvdXBfXzJfX0ltcGwiCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NzU2OToxOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VNYXJrZXJFbnRpdHlfX0dyb3VwX18yX19JbXBsIDogKCAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZU1hcmtlckVudGl0eV9fTWFya2VyRW50aXR5QXNzaWdubWVudF8yICkgKSA7CisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6ODE3ODoxOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VNYXJrZXJFbnRpdHlfX0dyb3VwX18yX19JbXBsIDogKCAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZU1hcmtlckVudGl0eV9fTWFya2VyRW50aXR5QXNzaWdubWVudF8yICkgKSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fRGF0YUludGVyY2hhbmdlTWFya2VyRW50aXR5X19Hcm91cF9fMl9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo3NTczOjE6ICggKCAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZU1hcmtlckVudGl0eV9fTWFya2VyRW50aXR5QXNzaWdubWVudF8yICkgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo3NTc0OjE6ICggKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VNYXJrZXJFbnRpdHlfX01hcmtlckVudGl0eUFzc2lnbm1lbnRfMiApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjgxODI6MTogKCAoICggcnVsZV9fRGF0YUludGVyY2hhbmdlTWFya2VyRW50aXR5X19NYXJrZXJFbnRpdHlBc3NpZ25tZW50XzIgKSApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjgxODM6MTogKCAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZU1hcmtlckVudGl0eV9fTWFya2VyRW50aXR5QXNzaWdubWVudF8yICkgKQogICAgICAgICAgICAgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NzU3NDoxOiAoICggcnVsZV9fRGF0YUludGVyY2hhbmdlTWFya2VyRW50aXR5X19NYXJrZXJFbnRpdHlBc3NpZ25tZW50XzIgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo3NTc1OjI6ICggcnVsZV9fRGF0YUludGVyY2hhbmdlTWFya2VyRW50aXR5X19NYXJrZXJFbnRpdHlBc3NpZ25tZW50XzIgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6ODE4MzoxOiAoICggcnVsZV9fRGF0YUludGVyY2hhbmdlTWFya2VyRW50aXR5X19NYXJrZXJFbnRpdHlBc3NpZ25tZW50XzIgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo4MTg0OjI6ICggcnVsZV9fRGF0YUludGVyY2hhbmdlTWFya2VyRW50aXR5X19NYXJrZXJFbnRpdHlBc3NpZ25tZW50XzIgKQogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXREYXRhSW50ZXJjaGFuZ2VNYXJrZXJFbnRpdHlBY2Nlc3MoKS5nZXRNYXJrZXJFbnRpdHlBc3NpZ25tZW50XzIoKSk7IAogICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NzU3NjoyOiAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZU1hcmtlckVudGl0eV9fTWFya2VyRW50aXR5QXNzaWdubWVudF8yICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjc1NzY6MzogcnVsZV9fRGF0YUludGVyY2hhbmdlTWFya2VyRW50aXR5X19NYXJrZXJFbnRpdHlBc3NpZ25tZW50XzIKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjgxODU6MjogKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VNYXJrZXJFbnRpdHlfX01hcmtlckVudGl0eUFzc2lnbm1lbnRfMiApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo4MTg1OjM6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZU1hcmtlckVudGl0eV9fTWFya2VyRW50aXR5QXNzaWdubWVudF8yCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV18yKTsKICAgICAgICAgICAgIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZU1hcmtlckVudGl0eV9fTWFya2VyRW50aXR5QXNzaWdubWVudF8yKCk7CkBAIC0yNjMyMCwxNCArMjg0NzcsMTQgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19EYXRhSW50ZXJjaGFuZ2VNYXJrZXJFbnRpdHlfX0dyb3VwX18zIgotICAgIC8vIEludGVybmFsRGF0YURTTC5nOjc1ODQ6MTogcnVsZV9fRGF0YUludGVyY2hhbmdlTWFya2VyRW50aXR5X19Hcm91cF9fMyA6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZU1hcmtlckVudGl0eV9fR3JvdXBfXzNfX0ltcGwgOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjgxOTM6MTogcnVsZV9fRGF0YUludGVyY2hhbmdlTWFya2VyRW50aXR5X19Hcm91cF9fMyA6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZU1hcmtlckVudGl0eV9fR3JvdXBfXzNfX0ltcGwgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZU1hcmtlckVudGl0eV9fR3JvdXBfXzMoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NzU4ODoxOiAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZU1hcmtlckVudGl0eV9fR3JvdXBfXzNfX0ltcGwgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NzU4OToyOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VNYXJrZXJFbnRpdHlfX0dyb3VwX18zX19JbXBsCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo4MTk3OjE6ICggcnVsZV9fRGF0YUludGVyY2hhbmdlTWFya2VyRW50aXR5X19Hcm91cF9fM19fSW1wbCApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo4MTk4OjI6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZU1hcmtlckVudGl0eV9fR3JvdXBfXzNfX0ltcGwKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzIpOwogICAgICAgICAgICAgcnVsZV9fRGF0YUludGVyY2hhbmdlTWFya2VyRW50aXR5X19Hcm91cF9fM19fSW1wbCgpOwpAQCAtMjYzNTMsMzEgKzI4NTEwLDMxIEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fRGF0YUludGVyY2hhbmdlTWFya2VyRW50aXR5X19Hcm91cF9fM19fSW1wbCIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo3NTk1OjE6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZU1hcmtlckVudGl0eV9fR3JvdXBfXzNfX0ltcGwgOiAoICggcnVsZV9fRGF0YUludGVyY2hhbmdlTWFya2VyRW50aXR5X19Hcm91cF8zX18wICk/ICkgOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjgyMDQ6MTogcnVsZV9fRGF0YUludGVyY2hhbmdlTWFya2VyRW50aXR5X19Hcm91cF9fM19fSW1wbCA6ICggKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VNYXJrZXJFbnRpdHlfX0dyb3VwXzNfXzAgKT8gKSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fRGF0YUludGVyY2hhbmdlTWFya2VyRW50aXR5X19Hcm91cF9fM19fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo3NTk5OjE6ICggKCAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZU1hcmtlckVudGl0eV9fR3JvdXBfM19fMCApPyApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjc2MDA6MTogKCAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZU1hcmtlckVudGl0eV9fR3JvdXBfM19fMCApPyApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo4MjA4OjE6ICggKCAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZU1hcmtlckVudGl0eV9fR3JvdXBfM19fMCApPyApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjgyMDk6MTogKCAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZU1hcmtlckVudGl0eV9fR3JvdXBfM19fMCApPyApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo3NjAwOjE6ICggKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VNYXJrZXJFbnRpdHlfX0dyb3VwXzNfXzAgKT8gKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NzYwMToyOiAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZU1hcmtlckVudGl0eV9fR3JvdXBfM19fMCApPworICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6ODIwOToxOiAoICggcnVsZV9fRGF0YUludGVyY2hhbmdlTWFya2VyRW50aXR5X19Hcm91cF8zX18wICk/ICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjgyMTA6MjogKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VNYXJrZXJFbnRpdHlfX0dyb3VwXzNfXzAgKT8KICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YUludGVyY2hhbmdlTWFya2VyRW50aXR5QWNjZXNzKCkuZ2V0R3JvdXBfMygpKTsgCiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo3NjAyOjI6ICggcnVsZV9fRGF0YUludGVyY2hhbmdlTWFya2VyRW50aXR5X19Hcm91cF8zX18wICk/Ci0gICAgICAgICAgICBpbnQgYWx0ODA9MjsKLSAgICAgICAgICAgIGludCBMQTgwXzAgPSBpbnB1dC5MQSgxKTsKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjgyMTE6MjogKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VNYXJrZXJFbnRpdHlfX0dyb3VwXzNfXzAgKT8KKyAgICAgICAgICAgIGludCBhbHQ4OD0yOworICAgICAgICAgICAgaW50IExBODhfMCA9IGlucHV0LkxBKDEpOwogCi0gICAgICAgICAgICBpZiAoIChMQTgwXzA9PTE0OCkgKSB7Ci0gICAgICAgICAgICAgICAgYWx0ODA9MTsKKyAgICAgICAgICAgIGlmICggKExBODhfMD09MTYwKSApIHsKKyAgICAgICAgICAgICAgICBhbHQ4OD0xOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgc3dpdGNoIChhbHQ4MCkgeworICAgICAgICAgICAgc3dpdGNoIChhbHQ4OCkgewogICAgICAgICAgICAgICAgIGNhc2UgMSA6Ci0gICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjc2MDI6MzogcnVsZV9fRGF0YUludGVyY2hhbmdlTWFya2VyRW50aXR5X19Hcm91cF8zX18wCisgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjgyMTE6MzogcnVsZV9fRGF0YUludGVyY2hhbmdlTWFya2VyRW50aXR5X19Hcm91cF8zX18wCiAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMik7CiAgICAgICAgICAgICAgICAgICAgIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZU1hcmtlckVudGl0eV9fR3JvdXBfM19fMCgpOwpAQCAtMjY0MTUsMTQgKzI4NTcyLDE0IEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fRGF0YUludGVyY2hhbmdlTWFya2VyRW50aXR5X19Hcm91cF8zX18wIgotICAgIC8vIEludGVybmFsRGF0YURTTC5nOjc2MTE6MTogcnVsZV9fRGF0YUludGVyY2hhbmdlTWFya2VyRW50aXR5X19Hcm91cF8zX18wIDogcnVsZV9fRGF0YUludGVyY2hhbmdlTWFya2VyRW50aXR5X19Hcm91cF8zX18wX19JbXBsIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZU1hcmtlckVudGl0eV9fR3JvdXBfM19fMSA7CisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6ODIyMDoxOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VNYXJrZXJFbnRpdHlfX0dyb3VwXzNfXzAgOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VNYXJrZXJFbnRpdHlfX0dyb3VwXzNfXzBfX0ltcGwgcnVsZV9fRGF0YUludGVyY2hhbmdlTWFya2VyRW50aXR5X19Hcm91cF8zX18xIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19EYXRhSW50ZXJjaGFuZ2VNYXJrZXJFbnRpdHlfX0dyb3VwXzNfXzAoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NzYxNToxOiAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZU1hcmtlckVudGl0eV9fR3JvdXBfM19fMF9fSW1wbCBydWxlX19EYXRhSW50ZXJjaGFuZ2VNYXJrZXJFbnRpdHlfX0dyb3VwXzNfXzEgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NzYxNjoyOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VNYXJrZXJFbnRpdHlfX0dyb3VwXzNfXzBfX0ltcGwgcnVsZV9fRGF0YUludGVyY2hhbmdlTWFya2VyRW50aXR5X19Hcm91cF8zX18xCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo4MjI0OjE6ICggcnVsZV9fRGF0YUludGVyY2hhbmdlTWFya2VyRW50aXR5X19Hcm91cF8zX18wX19JbXBsIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZU1hcmtlckVudGl0eV9fR3JvdXBfM19fMSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo4MjI1OjI6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZU1hcmtlckVudGl0eV9fR3JvdXBfM19fMF9fSW1wbCBydWxlX19EYXRhSW50ZXJjaGFuZ2VNYXJrZXJFbnRpdHlfX0dyb3VwXzNfXzEKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzcpOwogICAgICAgICAgICAgcnVsZV9fRGF0YUludGVyY2hhbmdlTWFya2VyRW50aXR5X19Hcm91cF8zX18wX19JbXBsKCk7CkBAIC0yNjQ1MywyMyArMjg2MTAsMjMgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19EYXRhSW50ZXJjaGFuZ2VNYXJrZXJFbnRpdHlfX0dyb3VwXzNfXzBfX0ltcGwiCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NzYyMzoxOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VNYXJrZXJFbnRpdHlfX0dyb3VwXzNfXzBfX0ltcGwgOiAoICggcnVsZV9fRGF0YUludGVyY2hhbmdlTWFya2VyRW50aXR5X19NYXJrTGF0ZXN0QXNzaWdubWVudF8zXzAgKSApIDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo4MjMyOjE6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZU1hcmtlckVudGl0eV9fR3JvdXBfM19fMF9fSW1wbCA6ICggKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VNYXJrZXJFbnRpdHlfX01hcmtMYXRlc3RBc3NpZ25tZW50XzNfMCApICkgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZU1hcmtlckVudGl0eV9fR3JvdXBfM19fMF9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo3NjI3OjE6ICggKCAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZU1hcmtlckVudGl0eV9fTWFya0xhdGVzdEFzc2lnbm1lbnRfM18wICkgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo3NjI4OjE6ICggKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VNYXJrZXJFbnRpdHlfX01hcmtMYXRlc3RBc3NpZ25tZW50XzNfMCApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjgyMzY6MTogKCAoICggcnVsZV9fRGF0YUludGVyY2hhbmdlTWFya2VyRW50aXR5X19NYXJrTGF0ZXN0QXNzaWdubWVudF8zXzAgKSApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjgyMzc6MTogKCAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZU1hcmtlckVudGl0eV9fTWFya0xhdGVzdEFzc2lnbm1lbnRfM18wICkgKQogICAgICAgICAgICAgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NzYyODoxOiAoICggcnVsZV9fRGF0YUludGVyY2hhbmdlTWFya2VyRW50aXR5X19NYXJrTGF0ZXN0QXNzaWdubWVudF8zXzAgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo3NjI5OjI6ICggcnVsZV9fRGF0YUludGVyY2hhbmdlTWFya2VyRW50aXR5X19NYXJrTGF0ZXN0QXNzaWdubWVudF8zXzAgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6ODIzNzoxOiAoICggcnVsZV9fRGF0YUludGVyY2hhbmdlTWFya2VyRW50aXR5X19NYXJrTGF0ZXN0QXNzaWdubWVudF8zXzAgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo4MjM4OjI6ICggcnVsZV9fRGF0YUludGVyY2hhbmdlTWFya2VyRW50aXR5X19NYXJrTGF0ZXN0QXNzaWdubWVudF8zXzAgKQogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXREYXRhSW50ZXJjaGFuZ2VNYXJrZXJFbnRpdHlBY2Nlc3MoKS5nZXRNYXJrTGF0ZXN0QXNzaWdubWVudF8zXzAoKSk7IAogICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NzYzMDoyOiAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZU1hcmtlckVudGl0eV9fTWFya0xhdGVzdEFzc2lnbm1lbnRfM18wICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjc2MzA6MzogcnVsZV9fRGF0YUludGVyY2hhbmdlTWFya2VyRW50aXR5X19NYXJrTGF0ZXN0QXNzaWdubWVudF8zXzAKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjgyMzk6MjogKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VNYXJrZXJFbnRpdHlfX01hcmtMYXRlc3RBc3NpZ25tZW50XzNfMCApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo4MjM5OjM6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZU1hcmtlckVudGl0eV9fTWFya0xhdGVzdEFzc2lnbm1lbnRfM18wCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV18yKTsKICAgICAgICAgICAgIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZU1hcmtlckVudGl0eV9fTWFya0xhdGVzdEFzc2lnbm1lbnRfM18wKCk7CkBAIC0yNjUwNCwxNCArMjg2NjEsMTQgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19EYXRhSW50ZXJjaGFuZ2VNYXJrZXJFbnRpdHlfX0dyb3VwXzNfXzEiCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NzYzODoxOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VNYXJrZXJFbnRpdHlfX0dyb3VwXzNfXzEgOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VNYXJrZXJFbnRpdHlfX0dyb3VwXzNfXzFfX0ltcGwgOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjgyNDc6MTogcnVsZV9fRGF0YUludGVyY2hhbmdlTWFya2VyRW50aXR5X19Hcm91cF8zX18xIDogcnVsZV9fRGF0YUludGVyY2hhbmdlTWFya2VyRW50aXR5X19Hcm91cF8zX18xX19JbXBsIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19EYXRhSW50ZXJjaGFuZ2VNYXJrZXJFbnRpdHlfX0dyb3VwXzNfXzEoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NzY0MjoxOiAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZU1hcmtlckVudGl0eV9fR3JvdXBfM19fMV9fSW1wbCApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo3NjQzOjI6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZU1hcmtlckVudGl0eV9fR3JvdXBfM19fMV9fSW1wbAorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6ODI1MToxOiAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZU1hcmtlckVudGl0eV9fR3JvdXBfM19fMV9fSW1wbCApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo4MjUyOjI6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZU1hcmtlckVudGl0eV9fR3JvdXBfM19fMV9fSW1wbAogICAgICAgICAgICAgewogICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMik7CiAgICAgICAgICAgICBydWxlX19EYXRhSW50ZXJjaGFuZ2VNYXJrZXJFbnRpdHlfX0dyb3VwXzNfXzFfX0ltcGwoKTsKQEAgLTI2NTM3LDIzICsyODY5NCwyMyBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX0RhdGFJbnRlcmNoYW5nZU1hcmtlckVudGl0eV9fR3JvdXBfM19fMV9fSW1wbCIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo3NjQ5OjE6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZU1hcmtlckVudGl0eV9fR3JvdXBfM19fMV9fSW1wbCA6ICggKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VNYXJrZXJFbnRpdHlfX01hcmtlclByb3BlcnR5QXNzaWdubWVudF8zXzEgKSApIDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo4MjU4OjE6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZU1hcmtlckVudGl0eV9fR3JvdXBfM19fMV9fSW1wbCA6ICggKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VNYXJrZXJFbnRpdHlfX01hcmtlclByb3BlcnR5QXNzaWdubWVudF8zXzEgKSApIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19EYXRhSW50ZXJjaGFuZ2VNYXJrZXJFbnRpdHlfX0dyb3VwXzNfXzFfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NzY1MzoxOiAoICggKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VNYXJrZXJFbnRpdHlfX01hcmtlclByb3BlcnR5QXNzaWdubWVudF8zXzEgKSApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjc2NTQ6MTogKCAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZU1hcmtlckVudGl0eV9fTWFya2VyUHJvcGVydHlBc3NpZ25tZW50XzNfMSApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjgyNjI6MTogKCAoICggcnVsZV9fRGF0YUludGVyY2hhbmdlTWFya2VyRW50aXR5X19NYXJrZXJQcm9wZXJ0eUFzc2lnbm1lbnRfM18xICkgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo4MjYzOjE6ICggKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VNYXJrZXJFbnRpdHlfX01hcmtlclByb3BlcnR5QXNzaWdubWVudF8zXzEgKSApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo3NjU0OjE6ICggKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VNYXJrZXJFbnRpdHlfX01hcmtlclByb3BlcnR5QXNzaWdubWVudF8zXzEgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo3NjU1OjI6ICggcnVsZV9fRGF0YUludGVyY2hhbmdlTWFya2VyRW50aXR5X19NYXJrZXJQcm9wZXJ0eUFzc2lnbm1lbnRfM18xICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjgyNjM6MTogKCAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZU1hcmtlckVudGl0eV9fTWFya2VyUHJvcGVydHlBc3NpZ25tZW50XzNfMSApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjgyNjQ6MjogKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VNYXJrZXJFbnRpdHlfX01hcmtlclByb3BlcnR5QXNzaWdubWVudF8zXzEgKQogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXREYXRhSW50ZXJjaGFuZ2VNYXJrZXJFbnRpdHlBY2Nlc3MoKS5nZXRNYXJrZXJQcm9wZXJ0eUFzc2lnbm1lbnRfM18xKCkpOyAKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjc2NTY6MjogKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VNYXJrZXJFbnRpdHlfX01hcmtlclByb3BlcnR5QXNzaWdubWVudF8zXzEgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NzY1NjozOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VNYXJrZXJFbnRpdHlfX01hcmtlclByb3BlcnR5QXNzaWdubWVudF8zXzEKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjgyNjU6MjogKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VNYXJrZXJFbnRpdHlfX01hcmtlclByb3BlcnR5QXNzaWdubWVudF8zXzEgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6ODI2NTozOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VNYXJrZXJFbnRpdHlfX01hcmtlclByb3BlcnR5QXNzaWdubWVudF8zXzEKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzIpOwogICAgICAgICAgICAgcnVsZV9fRGF0YUludGVyY2hhbmdlTWFya2VyRW50aXR5X19NYXJrZXJQcm9wZXJ0eUFzc2lnbm1lbnRfM18xKCk7CkBAIC0yNjU4OCwxNiArMjg3NDUsMTYgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19EYXRhSW50ZXJjaGFuZ2VGb3JtYXRfX0dyb3VwX18wIgotICAgIC8vIEludGVybmFsRGF0YURTTC5nOjc2NjU6MTogcnVsZV9fRGF0YUludGVyY2hhbmdlRm9ybWF0X19Hcm91cF9fMCA6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZvcm1hdF9fR3JvdXBfXzBfX0ltcGwgcnVsZV9fRGF0YUludGVyY2hhbmdlRm9ybWF0X19Hcm91cF9fMSA7CisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6ODI3NDoxOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VGb3JtYXRfX0dyb3VwX18wIDogcnVsZV9fRGF0YUludGVyY2hhbmdlRm9ybWF0X19Hcm91cF9fMF9fSW1wbCBydWxlX19EYXRhSW50ZXJjaGFuZ2VGb3JtYXRfX0dyb3VwX18xIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19EYXRhSW50ZXJjaGFuZ2VGb3JtYXRfX0dyb3VwX18wKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjc2Njk6MTogKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VGb3JtYXRfX0dyb3VwX18wX19JbXBsIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZvcm1hdF9fR3JvdXBfXzEgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NzY3MDoyOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VGb3JtYXRfX0dyb3VwX18wX19JbXBsIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZvcm1hdF9fR3JvdXBfXzEKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjgyNzg6MTogKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VGb3JtYXRfX0dyb3VwX18wX19JbXBsIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZvcm1hdF9fR3JvdXBfXzEgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6ODI3OToyOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VGb3JtYXRfX0dyb3VwX18wX19JbXBsIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZvcm1hdF9fR3JvdXBfXzEKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzM5KTsKKyAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzQzKTsKICAgICAgICAgICAgIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZvcm1hdF9fR3JvdXBfXzBfX0ltcGwoKTsKIAogICAgICAgICAgICAgc3RhdGUuX2ZzcC0tOwpAQCAtMjY2MjYsMjMgKzI4NzgzLDIzIEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fRGF0YUludGVyY2hhbmdlRm9ybWF0X19Hcm91cF9fMF9fSW1wbCIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo3Njc3OjE6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZvcm1hdF9fR3JvdXBfXzBfX0ltcGwgOiAoICgpICkgOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjgyODY6MTogcnVsZV9fRGF0YUludGVyY2hhbmdlRm9ybWF0X19Hcm91cF9fMF9fSW1wbCA6ICggKCkgKSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fRGF0YUludGVyY2hhbmdlRm9ybWF0X19Hcm91cF9fMF9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo3NjgxOjE6ICggKCAoKSApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjc2ODI6MTogKCAoKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo4MjkwOjE6ICggKCAoKSApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjgyOTE6MTogKCAoKSApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo3NjgyOjE6ICggKCkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NzY4MzoyOiAoKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6ODI5MToxOiAoICgpICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjgyOTI6MjogKCkKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YUludGVyY2hhbmdlRm9ybWF0QWNjZXNzKCkuZ2V0RGF0YUludGVyY2hhbmdlRm9ybWF0QWN0aW9uXzAoKSk7IAogICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NzY4NDoyOiAoKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NzY4NDozOiAKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjgyOTM6MjogKCkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjgyOTM6MzogCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICB9CiAKQEAgLTI2NjY3LDE0ICsyODgyNCwxNCBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZvcm1hdF9fR3JvdXBfXzEiCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NzY5MjoxOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VGb3JtYXRfX0dyb3VwX18xIDogcnVsZV9fRGF0YUludGVyY2hhbmdlRm9ybWF0X19Hcm91cF9fMV9fSW1wbCBydWxlX19EYXRhSW50ZXJjaGFuZ2VGb3JtYXRfX0dyb3VwX18yIDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo4MzAxOjE6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZvcm1hdF9fR3JvdXBfXzEgOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VGb3JtYXRfX0dyb3VwX18xX19JbXBsIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZvcm1hdF9fR3JvdXBfXzIgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZvcm1hdF9fR3JvdXBfXzEoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NzY5NjoxOiAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZvcm1hdF9fR3JvdXBfXzFfX0ltcGwgcnVsZV9fRGF0YUludGVyY2hhbmdlRm9ybWF0X19Hcm91cF9fMiApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo3Njk3OjI6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZvcm1hdF9fR3JvdXBfXzFfX0ltcGwgcnVsZV9fRGF0YUludGVyY2hhbmdlRm9ybWF0X19Hcm91cF9fMgorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6ODMwNToxOiAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZvcm1hdF9fR3JvdXBfXzFfX0ltcGwgcnVsZV9fRGF0YUludGVyY2hhbmdlRm9ybWF0X19Hcm91cF9fMiApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo4MzA2OjI6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZvcm1hdF9fR3JvdXBfXzFfX0ltcGwgcnVsZV9fRGF0YUludGVyY2hhbmdlRm9ybWF0X19Hcm91cF9fMgogICAgICAgICAgICAgewogICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfNyk7CiAgICAgICAgICAgICBydWxlX19EYXRhSW50ZXJjaGFuZ2VGb3JtYXRfX0dyb3VwX18xX19JbXBsKCk7CkBAIC0yNjcwNSwyMiArMjg4NjIsMjIgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19EYXRhSW50ZXJjaGFuZ2VGb3JtYXRfX0dyb3VwX18xX19JbXBsIgotICAgIC8vIEludGVybmFsRGF0YURTTC5nOjc3MDQ6MTogcnVsZV9fRGF0YUludGVyY2hhbmdlRm9ybWF0X19Hcm91cF9fMV9fSW1wbCA6ICggJ2ZvcicgKSA7CisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6ODMxMzoxOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VGb3JtYXRfX0dyb3VwX18xX19JbXBsIDogKCAnZm9yJyApIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19EYXRhSW50ZXJjaGFuZ2VGb3JtYXRfX0dyb3VwX18xX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjc3MDg6MTogKCAoICdmb3InICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NzcwOToxOiAoICdmb3InICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjgzMTc6MTogKCAoICdmb3InICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6ODMxODoxOiAoICdmb3InICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjc3MDk6MTogKCAnZm9yJyApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo3NzEwOjI6ICdmb3InCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo4MzE4OjE6ICggJ2ZvcicgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6ODMxOToyOiAnZm9yJwogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXREYXRhSW50ZXJjaGFuZ2VGb3JtYXRBY2Nlc3MoKS5nZXRGb3JLZXl3b3JkXzEoKSk7IAogICAgICAgICAgICAgfQotICAgICAgICAgICAgbWF0Y2goaW5wdXQsOTUsRk9MTE9XXzIpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOworICAgICAgICAgICAgbWF0Y2goaW5wdXQsMTAyLEZPTExPV18yKTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXREYXRhSW50ZXJjaGFuZ2VGb3JtYXRBY2Nlc3MoKS5nZXRGb3JLZXl3b3JkXzEoKSk7IAogICAgICAgICAgICAgfQpAQCAtMjY3NDYsMTYgKzI4OTAzLDE2IEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fRGF0YUludGVyY2hhbmdlRm9ybWF0X19Hcm91cF9fMiIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo3NzE5OjE6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZvcm1hdF9fR3JvdXBfXzIgOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VGb3JtYXRfX0dyb3VwX18yX19JbXBsIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZvcm1hdF9fR3JvdXBfXzMgOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjgzMjg6MTogcnVsZV9fRGF0YUludGVyY2hhbmdlRm9ybWF0X19Hcm91cF9fMiA6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZvcm1hdF9fR3JvdXBfXzJfX0ltcGwgcnVsZV9fRGF0YUludGVyY2hhbmdlRm9ybWF0X19Hcm91cF9fMyA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fRGF0YUludGVyY2hhbmdlRm9ybWF0X19Hcm91cF9fMigpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo3NzIzOjE6ICggcnVsZV9fRGF0YUludGVyY2hhbmdlRm9ybWF0X19Hcm91cF9fMl9fSW1wbCBydWxlX19EYXRhSW50ZXJjaGFuZ2VGb3JtYXRfX0dyb3VwX18zICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjc3MjQ6MjogcnVsZV9fRGF0YUludGVyY2hhbmdlRm9ybWF0X19Hcm91cF9fMl9fSW1wbCBydWxlX19EYXRhSW50ZXJjaGFuZ2VGb3JtYXRfX0dyb3VwX18zCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo4MzMyOjE6ICggcnVsZV9fRGF0YUludGVyY2hhbmdlRm9ybWF0X19Hcm91cF9fMl9fSW1wbCBydWxlX19EYXRhSW50ZXJjaGFuZ2VGb3JtYXRfX0dyb3VwX18zICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjgzMzM6MjogcnVsZV9fRGF0YUludGVyY2hhbmdlRm9ybWF0X19Hcm91cF9fMl9fSW1wbCBydWxlX19EYXRhSW50ZXJjaGFuZ2VGb3JtYXRfX0dyb3VwX18zCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV180OCk7CisgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV181Mik7CiAgICAgICAgICAgICBydWxlX19EYXRhSW50ZXJjaGFuZ2VGb3JtYXRfX0dyb3VwX18yX19JbXBsKCk7CiAKICAgICAgICAgICAgIHN0YXRlLl9mc3AtLTsKQEAgLTI2Nzg0LDIzICsyODk0MSwyMyBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZvcm1hdF9fR3JvdXBfXzJfX0ltcGwiCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NzczMToxOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VGb3JtYXRfX0dyb3VwX18yX19JbXBsIDogKCAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZvcm1hdF9fVGFyZ2V0UHJvcGVydHlBc3NpZ25tZW50XzIgKSApIDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo4MzQwOjE6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZvcm1hdF9fR3JvdXBfXzJfX0ltcGwgOiAoICggcnVsZV9fRGF0YUludGVyY2hhbmdlRm9ybWF0X19UYXJnZXRQcm9wZXJ0eUFzc2lnbm1lbnRfMiApICkgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZvcm1hdF9fR3JvdXBfXzJfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NzczNToxOiAoICggKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VGb3JtYXRfX1RhcmdldFByb3BlcnR5QXNzaWdubWVudF8yICkgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo3NzM2OjE6ICggKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VGb3JtYXRfX1RhcmdldFByb3BlcnR5QXNzaWdubWVudF8yICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6ODM0NDoxOiAoICggKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VGb3JtYXRfX1RhcmdldFByb3BlcnR5QXNzaWdubWVudF8yICkgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo4MzQ1OjE6ICggKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VGb3JtYXRfX1RhcmdldFByb3BlcnR5QXNzaWdubWVudF8yICkgKQogICAgICAgICAgICAgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NzczNjoxOiAoICggcnVsZV9fRGF0YUludGVyY2hhbmdlRm9ybWF0X19UYXJnZXRQcm9wZXJ0eUFzc2lnbm1lbnRfMiApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjc3Mzc6MjogKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VGb3JtYXRfX1RhcmdldFByb3BlcnR5QXNzaWdubWVudF8yICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjgzNDU6MTogKCAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZvcm1hdF9fVGFyZ2V0UHJvcGVydHlBc3NpZ25tZW50XzIgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo4MzQ2OjI6ICggcnVsZV9fRGF0YUludGVyY2hhbmdlRm9ybWF0X19UYXJnZXRQcm9wZXJ0eUFzc2lnbm1lbnRfMiApCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldERhdGFJbnRlcmNoYW5nZUZvcm1hdEFjY2VzcygpLmdldFRhcmdldFByb3BlcnR5QXNzaWdubWVudF8yKCkpOyAKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjc3Mzg6MjogKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VGb3JtYXRfX1RhcmdldFByb3BlcnR5QXNzaWdubWVudF8yICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjc3Mzg6MzogcnVsZV9fRGF0YUludGVyY2hhbmdlRm9ybWF0X19UYXJnZXRQcm9wZXJ0eUFzc2lnbm1lbnRfMgorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6ODM0NzoyOiAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZvcm1hdF9fVGFyZ2V0UHJvcGVydHlBc3NpZ25tZW50XzIgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6ODM0NzozOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VGb3JtYXRfX1RhcmdldFByb3BlcnR5QXNzaWdubWVudF8yCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV18yKTsKICAgICAgICAgICAgIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZvcm1hdF9fVGFyZ2V0UHJvcGVydHlBc3NpZ25tZW50XzIoKTsKQEAgLTI2ODM1LDE0ICsyODk5MiwxNCBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZvcm1hdF9fR3JvdXBfXzMiCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6Nzc0NjoxOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VGb3JtYXRfX0dyb3VwX18zIDogcnVsZV9fRGF0YUludGVyY2hhbmdlRm9ybWF0X19Hcm91cF9fM19fSW1wbCBydWxlX19EYXRhSW50ZXJjaGFuZ2VGb3JtYXRfX0dyb3VwX180IDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo4MzU1OjE6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZvcm1hdF9fR3JvdXBfXzMgOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VGb3JtYXRfX0dyb3VwX18zX19JbXBsIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZvcm1hdF9fR3JvdXBfXzQgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZvcm1hdF9fR3JvdXBfXzMoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6Nzc1MDoxOiAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZvcm1hdF9fR3JvdXBfXzNfX0ltcGwgcnVsZV9fRGF0YUludGVyY2hhbmdlRm9ybWF0X19Hcm91cF9fNCApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo3NzUxOjI6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZvcm1hdF9fR3JvdXBfXzNfX0ltcGwgcnVsZV9fRGF0YUludGVyY2hhbmdlRm9ybWF0X19Hcm91cF9fNAorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6ODM1OToxOiAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZvcm1hdF9fR3JvdXBfXzNfX0ltcGwgcnVsZV9fRGF0YUludGVyY2hhbmdlRm9ybWF0X19Hcm91cF9fNCApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo4MzYwOjI6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZvcm1hdF9fR3JvdXBfXzNfX0ltcGwgcnVsZV9fRGF0YUludGVyY2hhbmdlRm9ybWF0X19Hcm91cF9fNAogICAgICAgICAgICAgewogICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfOSk7CiAgICAgICAgICAgICBydWxlX19EYXRhSW50ZXJjaGFuZ2VGb3JtYXRfX0dyb3VwX18zX19JbXBsKCk7CkBAIC0yNjg3MywyMiArMjkwMzAsMjIgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19EYXRhSW50ZXJjaGFuZ2VGb3JtYXRfX0dyb3VwX18zX19JbXBsIgotICAgIC8vIEludGVybmFsRGF0YURTTC5nOjc3NTg6MTogcnVsZV9fRGF0YUludGVyY2hhbmdlRm9ybWF0X19Hcm91cF9fM19fSW1wbCA6ICggJ2NvZGluZycgKSA7CisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6ODM2NzoxOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VGb3JtYXRfX0dyb3VwX18zX19JbXBsIDogKCAnY29kaW5nJyApIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19EYXRhSW50ZXJjaGFuZ2VGb3JtYXRfX0dyb3VwX18zX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjc3NjI6MTogKCAoICdjb2RpbmcnICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6Nzc2MzoxOiAoICdjb2RpbmcnICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjgzNzE6MTogKCAoICdjb2RpbmcnICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6ODM3MjoxOiAoICdjb2RpbmcnICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjc3NjM6MTogKCAnY29kaW5nJyApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo3NzY0OjI6ICdjb2RpbmcnCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo4MzcyOjE6ICggJ2NvZGluZycgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6ODM3MzoyOiAnY29kaW5nJwogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXREYXRhSW50ZXJjaGFuZ2VGb3JtYXRBY2Nlc3MoKS5nZXRDb2RpbmdLZXl3b3JkXzMoKSk7IAogICAgICAgICAgICAgfQotICAgICAgICAgICAgbWF0Y2goaW5wdXQsMTAxLEZPTExPV18yKTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKKyAgICAgICAgICAgIG1hdGNoKGlucHV0LDEwOCxGT0xMT1dfMik7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YUludGVyY2hhbmdlRm9ybWF0QWNjZXNzKCkuZ2V0Q29kaW5nS2V5d29yZF8zKCkpOyAKICAgICAgICAgICAgIH0KQEAgLTI2OTE0LDE0ICsyOTA3MSwxNCBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZvcm1hdF9fR3JvdXBfXzQiCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6Nzc3MzoxOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VGb3JtYXRfX0dyb3VwX180IDogcnVsZV9fRGF0YUludGVyY2hhbmdlRm9ybWF0X19Hcm91cF9fNF9fSW1wbCA7CisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6ODM4MjoxOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VGb3JtYXRfX0dyb3VwX180IDogcnVsZV9fRGF0YUludGVyY2hhbmdlRm9ybWF0X19Hcm91cF9fNF9fSW1wbCA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fRGF0YUludGVyY2hhbmdlRm9ybWF0X19Hcm91cF9fNCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo3Nzc3OjE6ICggcnVsZV9fRGF0YUludGVyY2hhbmdlRm9ybWF0X19Hcm91cF9fNF9fSW1wbCApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo3Nzc4OjI6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZvcm1hdF9fR3JvdXBfXzRfX0ltcGwKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjgzODY6MTogKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VGb3JtYXRfX0dyb3VwX180X19JbXBsICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjgzODc6MjogcnVsZV9fRGF0YUludGVyY2hhbmdlRm9ybWF0X19Hcm91cF9fNF9fSW1wbAogICAgICAgICAgICAgewogICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMik7CiAgICAgICAgICAgICBydWxlX19EYXRhSW50ZXJjaGFuZ2VGb3JtYXRfX0dyb3VwX180X19JbXBsKCk7CkBAIC0yNjk0NywyMyArMjkxMDQsMjMgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19EYXRhSW50ZXJjaGFuZ2VGb3JtYXRfX0dyb3VwX180X19JbXBsIgotICAgIC8vIEludGVybmFsRGF0YURTTC5nOjc3ODQ6MTogcnVsZV9fRGF0YUludGVyY2hhbmdlRm9ybWF0X19Hcm91cF9fNF9fSW1wbCA6ICggKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VGb3JtYXRfX0Zvcm1hdEFzc2lnbm1lbnRfNCApICkgOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjgzOTM6MTogcnVsZV9fRGF0YUludGVyY2hhbmdlRm9ybWF0X19Hcm91cF9fNF9fSW1wbCA6ICggKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VGb3JtYXRfX0Zvcm1hdEFzc2lnbm1lbnRfNCApICkgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZvcm1hdF9fR3JvdXBfXzRfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6Nzc4ODoxOiAoICggKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VGb3JtYXRfX0Zvcm1hdEFzc2lnbm1lbnRfNCApICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6Nzc4OToxOiAoICggcnVsZV9fRGF0YUludGVyY2hhbmdlRm9ybWF0X19Gb3JtYXRBc3NpZ25tZW50XzQgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo4Mzk3OjE6ICggKCAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZvcm1hdF9fRm9ybWF0QXNzaWdubWVudF80ICkgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo4Mzk4OjE6ICggKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VGb3JtYXRfX0Zvcm1hdEFzc2lnbm1lbnRfNCApICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjc3ODk6MTogKCAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZvcm1hdF9fRm9ybWF0QXNzaWdubWVudF80ICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6Nzc5MDoyOiAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZvcm1hdF9fRm9ybWF0QXNzaWdubWVudF80ICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjgzOTg6MTogKCAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZvcm1hdF9fRm9ybWF0QXNzaWdubWVudF80ICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6ODM5OToyOiAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZvcm1hdF9fRm9ybWF0QXNzaWdubWVudF80ICkKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YUludGVyY2hhbmdlRm9ybWF0QWNjZXNzKCkuZ2V0Rm9ybWF0QXNzaWdubWVudF80KCkpOyAKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjc3OTE6MjogKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VGb3JtYXRfX0Zvcm1hdEFzc2lnbm1lbnRfNCApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo3NzkxOjM6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZvcm1hdF9fRm9ybWF0QXNzaWdubWVudF80CisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo4NDAwOjI6ICggcnVsZV9fRGF0YUludGVyY2hhbmdlRm9ybWF0X19Gb3JtYXRBc3NpZ25tZW50XzQgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6ODQwMDozOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VGb3JtYXRfX0Zvcm1hdEFzc2lnbm1lbnRfNAogICAgICAgICAgICAgewogICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMik7CiAgICAgICAgICAgICBydWxlX19EYXRhSW50ZXJjaGFuZ2VGb3JtYXRfX0Zvcm1hdEFzc2lnbm1lbnRfNCgpOwpAQCAtMjY5OTgsMTYgKzI5MTU1LDE2IEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fRGF0YUludGVyY2hhbmdlRW50aXR5RXhwcmVzc2lvbl9fR3JvdXBfXzAiCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NzgwMDoxOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VFbnRpdHlFeHByZXNzaW9uX19Hcm91cF9fMCA6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUVudGl0eUV4cHJlc3Npb25fX0dyb3VwX18wX19JbXBsIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUVudGl0eUV4cHJlc3Npb25fX0dyb3VwX18xIDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo4NDA5OjE6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUVudGl0eUV4cHJlc3Npb25fX0dyb3VwX18wIDogcnVsZV9fRGF0YUludGVyY2hhbmdlRW50aXR5RXhwcmVzc2lvbl9fR3JvdXBfXzBfX0ltcGwgcnVsZV9fRGF0YUludGVyY2hhbmdlRW50aXR5RXhwcmVzc2lvbl9fR3JvdXBfXzEgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUVudGl0eUV4cHJlc3Npb25fX0dyb3VwX18wKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjc4MDQ6MTogKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VFbnRpdHlFeHByZXNzaW9uX19Hcm91cF9fMF9fSW1wbCBydWxlX19EYXRhSW50ZXJjaGFuZ2VFbnRpdHlFeHByZXNzaW9uX19Hcm91cF9fMSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo3ODA1OjI6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUVudGl0eUV4cHJlc3Npb25fX0dyb3VwX18wX19JbXBsIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUVudGl0eUV4cHJlc3Npb25fX0dyb3VwX18xCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo4NDEzOjE6ICggcnVsZV9fRGF0YUludGVyY2hhbmdlRW50aXR5RXhwcmVzc2lvbl9fR3JvdXBfXzBfX0ltcGwgcnVsZV9fRGF0YUludGVyY2hhbmdlRW50aXR5RXhwcmVzc2lvbl9fR3JvdXBfXzEgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6ODQxNDoyOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VFbnRpdHlFeHByZXNzaW9uX19Hcm91cF9fMF9fSW1wbCBydWxlX19EYXRhSW50ZXJjaGFuZ2VFbnRpdHlFeHByZXNzaW9uX19Hcm91cF9fMQogICAgICAgICAgICAgewotICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfNDkpOworICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfNTMpOwogICAgICAgICAgICAgcnVsZV9fRGF0YUludGVyY2hhbmdlRW50aXR5RXhwcmVzc2lvbl9fR3JvdXBfXzBfX0ltcGwoKTsKIAogICAgICAgICAgICAgc3RhdGUuX2ZzcC0tOwpAQCAtMjcwMzYsMjMgKzI5MTkzLDIzIEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fRGF0YUludGVyY2hhbmdlRW50aXR5RXhwcmVzc2lvbl9fR3JvdXBfXzBfX0ltcGwiCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NzgxMjoxOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VFbnRpdHlFeHByZXNzaW9uX19Hcm91cF9fMF9fSW1wbCA6ICggKCkgKSA7CisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6ODQyMToxOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VFbnRpdHlFeHByZXNzaW9uX19Hcm91cF9fMF9fSW1wbCA6ICggKCkgKSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fRGF0YUludGVyY2hhbmdlRW50aXR5RXhwcmVzc2lvbl9fR3JvdXBfXzBfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NzgxNjoxOiAoICggKCkgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo3ODE3OjE6ICggKCkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6ODQyNToxOiAoICggKCkgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo4NDI2OjE6ICggKCkgKQogICAgICAgICAgICAgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NzgxNzoxOiAoICgpICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjc4MTg6MjogKCkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjg0MjY6MTogKCAoKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo4NDI3OjI6ICgpCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldERhdGFJbnRlcmNoYW5nZUVudGl0eUV4cHJlc3Npb25BY2Nlc3MoKS5nZXREYXRhSW50ZXJjaGFuZ2VFbnRpdHlFeHByZXNzaW9uQWN0aW9uXzAoKSk7IAogICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NzgxOToyOiAoKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NzgxOTozOiAKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjg0Mjg6MjogKCkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjg0Mjg6MzogCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICB9CiAKQEAgLTI3MDc3LDE0ICsyOTIzNCwxNCBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX0RhdGFJbnRlcmNoYW5nZUVudGl0eUV4cHJlc3Npb25fX0dyb3VwX18xIgotICAgIC8vIEludGVybmFsRGF0YURTTC5nOjc4Mjc6MTogcnVsZV9fRGF0YUludGVyY2hhbmdlRW50aXR5RXhwcmVzc2lvbl9fR3JvdXBfXzEgOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VFbnRpdHlFeHByZXNzaW9uX19Hcm91cF9fMV9fSW1wbCBydWxlX19EYXRhSW50ZXJjaGFuZ2VFbnRpdHlFeHByZXNzaW9uX19Hcm91cF9fMiA7CisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6ODQzNjoxOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VFbnRpdHlFeHByZXNzaW9uX19Hcm91cF9fMSA6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUVudGl0eUV4cHJlc3Npb25fX0dyb3VwX18xX19JbXBsIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUVudGl0eUV4cHJlc3Npb25fX0dyb3VwX18yIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19EYXRhSW50ZXJjaGFuZ2VFbnRpdHlFeHByZXNzaW9uX19Hcm91cF9fMSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo3ODMxOjE6ICggcnVsZV9fRGF0YUludGVyY2hhbmdlRW50aXR5RXhwcmVzc2lvbl9fR3JvdXBfXzFfX0ltcGwgcnVsZV9fRGF0YUludGVyY2hhbmdlRW50aXR5RXhwcmVzc2lvbl9fR3JvdXBfXzIgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NzgzMjoyOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VFbnRpdHlFeHByZXNzaW9uX19Hcm91cF9fMV9fSW1wbCBydWxlX19EYXRhSW50ZXJjaGFuZ2VFbnRpdHlFeHByZXNzaW9uX19Hcm91cF9fMgorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6ODQ0MDoxOiAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUVudGl0eUV4cHJlc3Npb25fX0dyb3VwX18xX19JbXBsIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUVudGl0eUV4cHJlc3Npb25fX0dyb3VwX18yICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjg0NDE6MjogcnVsZV9fRGF0YUludGVyY2hhbmdlRW50aXR5RXhwcmVzc2lvbl9fR3JvdXBfXzFfX0ltcGwgcnVsZV9fRGF0YUludGVyY2hhbmdlRW50aXR5RXhwcmVzc2lvbl9fR3JvdXBfXzIKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzcpOwogICAgICAgICAgICAgcnVsZV9fRGF0YUludGVyY2hhbmdlRW50aXR5RXhwcmVzc2lvbl9fR3JvdXBfXzFfX0ltcGwoKTsKQEAgLTI3MTE1LDIyICsyOTI3MiwyMiBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX0RhdGFJbnRlcmNoYW5nZUVudGl0eUV4cHJlc3Npb25fX0dyb3VwX18xX19JbXBsIgotICAgIC8vIEludGVybmFsRGF0YURTTC5nOjc4Mzk6MTogcnVsZV9fRGF0YUludGVyY2hhbmdlRW50aXR5RXhwcmVzc2lvbl9fR3JvdXBfXzFfX0ltcGwgOiAoICdjb3B5JyApIDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo4NDQ4OjE6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUVudGl0eUV4cHJlc3Npb25fX0dyb3VwX18xX19JbXBsIDogKCAnY29weScgKSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fRGF0YUludGVyY2hhbmdlRW50aXR5RXhwcmVzc2lvbl9fR3JvdXBfXzFfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6Nzg0MzoxOiAoICggJ2NvcHknICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6Nzg0NDoxOiAoICdjb3B5JyApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo4NDUyOjE6ICggKCAnY29weScgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo4NDUzOjE6ICggJ2NvcHknICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjc4NDQ6MTogKCAnY29weScgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6Nzg0NToyOiAnY29weScKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjg0NTM6MTogKCAnY29weScgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6ODQ1NDoyOiAnY29weScKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YUludGVyY2hhbmdlRW50aXR5RXhwcmVzc2lvbkFjY2VzcygpLmdldENvcHlLZXl3b3JkXzEoKSk7IAogICAgICAgICAgICAgfQotICAgICAgICAgICAgbWF0Y2goaW5wdXQsMTAyLEZPTExPV18yKTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKKyAgICAgICAgICAgIG1hdGNoKGlucHV0LDEwOSxGT0xMT1dfMik7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YUludGVyY2hhbmdlRW50aXR5RXhwcmVzc2lvbkFjY2VzcygpLmdldENvcHlLZXl3b3JkXzEoKSk7IAogICAgICAgICAgICAgfQpAQCAtMjcxNTYsMTYgKzI5MzEzLDE2IEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fRGF0YUludGVyY2hhbmdlRW50aXR5RXhwcmVzc2lvbl9fR3JvdXBfXzIiCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6Nzg1NDoxOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VFbnRpdHlFeHByZXNzaW9uX19Hcm91cF9fMiA6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUVudGl0eUV4cHJlc3Npb25fX0dyb3VwX18yX19JbXBsIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUVudGl0eUV4cHJlc3Npb25fX0dyb3VwX18zIDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo4NDYzOjE6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUVudGl0eUV4cHJlc3Npb25fX0dyb3VwX18yIDogcnVsZV9fRGF0YUludGVyY2hhbmdlRW50aXR5RXhwcmVzc2lvbl9fR3JvdXBfXzJfX0ltcGwgcnVsZV9fRGF0YUludGVyY2hhbmdlRW50aXR5RXhwcmVzc2lvbl9fR3JvdXBfXzMgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUVudGl0eUV4cHJlc3Npb25fX0dyb3VwX18yKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjc4NTg6MTogKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VFbnRpdHlFeHByZXNzaW9uX19Hcm91cF9fMl9fSW1wbCBydWxlX19EYXRhSW50ZXJjaGFuZ2VFbnRpdHlFeHByZXNzaW9uX19Hcm91cF9fMyApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo3ODU5OjI6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUVudGl0eUV4cHJlc3Npb25fX0dyb3VwX18yX19JbXBsIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUVudGl0eUV4cHJlc3Npb25fX0dyb3VwX18zCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo4NDY3OjE6ICggcnVsZV9fRGF0YUludGVyY2hhbmdlRW50aXR5RXhwcmVzc2lvbl9fR3JvdXBfXzJfX0ltcGwgcnVsZV9fRGF0YUludGVyY2hhbmdlRW50aXR5RXhwcmVzc2lvbl9fR3JvdXBfXzMgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6ODQ2ODoyOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VFbnRpdHlFeHByZXNzaW9uX19Hcm91cF9fMl9fSW1wbCBydWxlX19EYXRhSW50ZXJjaGFuZ2VFbnRpdHlFeHByZXNzaW9uX19Hcm91cF9fMwogICAgICAgICAgICAgewotICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfNTApOworICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfNTQpOwogICAgICAgICAgICAgcnVsZV9fRGF0YUludGVyY2hhbmdlRW50aXR5RXhwcmVzc2lvbl9fR3JvdXBfXzJfX0ltcGwoKTsKIAogICAgICAgICAgICAgc3RhdGUuX2ZzcC0tOwpAQCAtMjcxOTQsMjMgKzI5MzUxLDIzIEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fRGF0YUludGVyY2hhbmdlRW50aXR5RXhwcmVzc2lvbl9fR3JvdXBfXzJfX0ltcGwiCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6Nzg2NjoxOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VFbnRpdHlFeHByZXNzaW9uX19Hcm91cF9fMl9fSW1wbCA6ICggKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VFbnRpdHlFeHByZXNzaW9uX19UYXJnZXRQcm9wZXJ0eUFzc2lnbm1lbnRfMiApICkgOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjg0NzU6MTogcnVsZV9fRGF0YUludGVyY2hhbmdlRW50aXR5RXhwcmVzc2lvbl9fR3JvdXBfXzJfX0ltcGwgOiAoICggcnVsZV9fRGF0YUludGVyY2hhbmdlRW50aXR5RXhwcmVzc2lvbl9fVGFyZ2V0UHJvcGVydHlBc3NpZ25tZW50XzIgKSApIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19EYXRhSW50ZXJjaGFuZ2VFbnRpdHlFeHByZXNzaW9uX19Hcm91cF9fMl9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo3ODcwOjE6ICggKCAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUVudGl0eUV4cHJlc3Npb25fX1RhcmdldFByb3BlcnR5QXNzaWdubWVudF8yICkgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo3ODcxOjE6ICggKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VFbnRpdHlFeHByZXNzaW9uX19UYXJnZXRQcm9wZXJ0eUFzc2lnbm1lbnRfMiApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjg0Nzk6MTogKCAoICggcnVsZV9fRGF0YUludGVyY2hhbmdlRW50aXR5RXhwcmVzc2lvbl9fVGFyZ2V0UHJvcGVydHlBc3NpZ25tZW50XzIgKSApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjg0ODA6MTogKCAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUVudGl0eUV4cHJlc3Npb25fX1RhcmdldFByb3BlcnR5QXNzaWdubWVudF8yICkgKQogICAgICAgICAgICAgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6Nzg3MToxOiAoICggcnVsZV9fRGF0YUludGVyY2hhbmdlRW50aXR5RXhwcmVzc2lvbl9fVGFyZ2V0UHJvcGVydHlBc3NpZ25tZW50XzIgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo3ODcyOjI6ICggcnVsZV9fRGF0YUludGVyY2hhbmdlRW50aXR5RXhwcmVzc2lvbl9fVGFyZ2V0UHJvcGVydHlBc3NpZ25tZW50XzIgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6ODQ4MDoxOiAoICggcnVsZV9fRGF0YUludGVyY2hhbmdlRW50aXR5RXhwcmVzc2lvbl9fVGFyZ2V0UHJvcGVydHlBc3NpZ25tZW50XzIgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo4NDgxOjI6ICggcnVsZV9fRGF0YUludGVyY2hhbmdlRW50aXR5RXhwcmVzc2lvbl9fVGFyZ2V0UHJvcGVydHlBc3NpZ25tZW50XzIgKQogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXREYXRhSW50ZXJjaGFuZ2VFbnRpdHlFeHByZXNzaW9uQWNjZXNzKCkuZ2V0VGFyZ2V0UHJvcGVydHlBc3NpZ25tZW50XzIoKSk7IAogICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6Nzg3MzoyOiAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUVudGl0eUV4cHJlc3Npb25fX1RhcmdldFByb3BlcnR5QXNzaWdubWVudF8yICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjc4NzM6MzogcnVsZV9fRGF0YUludGVyY2hhbmdlRW50aXR5RXhwcmVzc2lvbl9fVGFyZ2V0UHJvcGVydHlBc3NpZ25tZW50XzIKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjg0ODI6MjogKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VFbnRpdHlFeHByZXNzaW9uX19UYXJnZXRQcm9wZXJ0eUFzc2lnbm1lbnRfMiApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo4NDgyOjM6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUVudGl0eUV4cHJlc3Npb25fX1RhcmdldFByb3BlcnR5QXNzaWdubWVudF8yCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV18yKTsKICAgICAgICAgICAgIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUVudGl0eUV4cHJlc3Npb25fX1RhcmdldFByb3BlcnR5QXNzaWdubWVudF8yKCk7CkBAIC0yNzI0NSwxNCArMjk0MDIsMTQgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19EYXRhSW50ZXJjaGFuZ2VFbnRpdHlFeHByZXNzaW9uX19Hcm91cF9fMyIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo3ODgxOjE6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUVudGl0eUV4cHJlc3Npb25fX0dyb3VwX18zIDogcnVsZV9fRGF0YUludGVyY2hhbmdlRW50aXR5RXhwcmVzc2lvbl9fR3JvdXBfXzNfX0ltcGwgcnVsZV9fRGF0YUludGVyY2hhbmdlRW50aXR5RXhwcmVzc2lvbl9fR3JvdXBfXzQgOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjg0OTA6MTogcnVsZV9fRGF0YUludGVyY2hhbmdlRW50aXR5RXhwcmVzc2lvbl9fR3JvdXBfXzMgOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VFbnRpdHlFeHByZXNzaW9uX19Hcm91cF9fM19fSW1wbCBydWxlX19EYXRhSW50ZXJjaGFuZ2VFbnRpdHlFeHByZXNzaW9uX19Hcm91cF9fNCA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fRGF0YUludGVyY2hhbmdlRW50aXR5RXhwcmVzc2lvbl9fR3JvdXBfXzMoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6Nzg4NToxOiAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUVudGl0eUV4cHJlc3Npb25fX0dyb3VwX18zX19JbXBsIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUVudGl0eUV4cHJlc3Npb25fX0dyb3VwX180ICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjc4ODY6MjogcnVsZV9fRGF0YUludGVyY2hhbmdlRW50aXR5RXhwcmVzc2lvbl9fR3JvdXBfXzNfX0ltcGwgcnVsZV9fRGF0YUludGVyY2hhbmdlRW50aXR5RXhwcmVzc2lvbl9fR3JvdXBfXzQKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjg0OTQ6MTogKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VFbnRpdHlFeHByZXNzaW9uX19Hcm91cF9fM19fSW1wbCBydWxlX19EYXRhSW50ZXJjaGFuZ2VFbnRpdHlFeHByZXNzaW9uX19Hcm91cF9fNCApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo4NDk1OjI6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUVudGl0eUV4cHJlc3Npb25fX0dyb3VwX18zX19JbXBsIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUVudGl0eUV4cHJlc3Npb25fX0dyb3VwX180CiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV183KTsKICAgICAgICAgICAgIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUVudGl0eUV4cHJlc3Npb25fX0dyb3VwX18zX19JbXBsKCk7CkBAIC0yNzI4MywyMiArMjk0NDAsMjIgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19EYXRhSW50ZXJjaGFuZ2VFbnRpdHlFeHByZXNzaW9uX19Hcm91cF9fM19fSW1wbCIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo3ODkzOjE6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUVudGl0eUV4cHJlc3Npb25fX0dyb3VwX18zX19JbXBsIDogKCAnZnJvbScgKSA7CisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6ODUwMjoxOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VFbnRpdHlFeHByZXNzaW9uX19Hcm91cF9fM19fSW1wbCA6ICggJ2Zyb20nICkgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUVudGl0eUV4cHJlc3Npb25fX0dyb3VwX18zX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjc4OTc6MTogKCAoICdmcm9tJyApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjc4OTg6MTogKCAnZnJvbScgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6ODUwNjoxOiAoICggJ2Zyb20nICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6ODUwNzoxOiAoICdmcm9tJyApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo3ODk4OjE6ICggJ2Zyb20nICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjc4OTk6MjogJ2Zyb20nCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo4NTA3OjE6ICggJ2Zyb20nICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjg1MDg6MjogJ2Zyb20nCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldERhdGFJbnRlcmNoYW5nZUVudGl0eUV4cHJlc3Npb25BY2Nlc3MoKS5nZXRGcm9tS2V5d29yZF8zKCkpOyAKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1hdGNoKGlucHV0LDEwMyxGT0xMT1dfMik7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CisgICAgICAgICAgICBtYXRjaChpbnB1dCwxMTAsRk9MTE9XXzIpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOwogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBhZnRlcihncmFtbWFyQWNjZXNzLmdldERhdGFJbnRlcmNoYW5nZUVudGl0eUV4cHJlc3Npb25BY2Nlc3MoKS5nZXRGcm9tS2V5d29yZF8zKCkpOyAKICAgICAgICAgICAgIH0KQEAgLTI3MzI0LDE2ICsyOTQ4MSwxNiBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX0RhdGFJbnRlcmNoYW5nZUVudGl0eUV4cHJlc3Npb25fX0dyb3VwX180IgotICAgIC8vIEludGVybmFsRGF0YURTTC5nOjc5MDg6MTogcnVsZV9fRGF0YUludGVyY2hhbmdlRW50aXR5RXhwcmVzc2lvbl9fR3JvdXBfXzQgOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VFbnRpdHlFeHByZXNzaW9uX19Hcm91cF9fNF9fSW1wbCBydWxlX19EYXRhSW50ZXJjaGFuZ2VFbnRpdHlFeHByZXNzaW9uX19Hcm91cF9fNSA7CisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6ODUxNzoxOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VFbnRpdHlFeHByZXNzaW9uX19Hcm91cF9fNCA6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUVudGl0eUV4cHJlc3Npb25fX0dyb3VwX180X19JbXBsIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUVudGl0eUV4cHJlc3Npb25fX0dyb3VwX181IDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19EYXRhSW50ZXJjaGFuZ2VFbnRpdHlFeHByZXNzaW9uX19Hcm91cF9fNCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo3OTEyOjE6ICggcnVsZV9fRGF0YUludGVyY2hhbmdlRW50aXR5RXhwcmVzc2lvbl9fR3JvdXBfXzRfX0ltcGwgcnVsZV9fRGF0YUludGVyY2hhbmdlRW50aXR5RXhwcmVzc2lvbl9fR3JvdXBfXzUgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NzkxMzoyOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VFbnRpdHlFeHByZXNzaW9uX19Hcm91cF9fNF9fSW1wbCBydWxlX19EYXRhSW50ZXJjaGFuZ2VFbnRpdHlFeHByZXNzaW9uX19Hcm91cF9fNQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6ODUyMToxOiAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUVudGl0eUV4cHJlc3Npb25fX0dyb3VwX180X19JbXBsIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUVudGl0eUV4cHJlc3Npb25fX0dyb3VwX181ICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjg1MjI6MjogcnVsZV9fRGF0YUludGVyY2hhbmdlRW50aXR5RXhwcmVzc2lvbl9fR3JvdXBfXzRfX0ltcGwgcnVsZV9fRGF0YUludGVyY2hhbmdlRW50aXR5RXhwcmVzc2lvbl9fR3JvdXBfXzUKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzUxKTsKKyAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzU1KTsKICAgICAgICAgICAgIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUVudGl0eUV4cHJlc3Npb25fX0dyb3VwX180X19JbXBsKCk7CiAKICAgICAgICAgICAgIHN0YXRlLl9mc3AtLTsKQEAgLTI3MzYyLDIzICsyOTUxOSwyMyBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX0RhdGFJbnRlcmNoYW5nZUVudGl0eUV4cHJlc3Npb25fX0dyb3VwX180X19JbXBsIgotICAgIC8vIEludGVybmFsRGF0YURTTC5nOjc5MjA6MTogcnVsZV9fRGF0YUludGVyY2hhbmdlRW50aXR5RXhwcmVzc2lvbl9fR3JvdXBfXzRfX0ltcGwgOiAoICggcnVsZV9fRGF0YUludGVyY2hhbmdlRW50aXR5RXhwcmVzc2lvbl9fRW50aXR5QXNzaWdubWVudF80ICkgKSA7CisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6ODUyOToxOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VFbnRpdHlFeHByZXNzaW9uX19Hcm91cF9fNF9fSW1wbCA6ICggKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VFbnRpdHlFeHByZXNzaW9uX19FbnRpdHlBc3NpZ25tZW50XzQgKSApIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19EYXRhSW50ZXJjaGFuZ2VFbnRpdHlFeHByZXNzaW9uX19Hcm91cF9fNF9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo3OTI0OjE6ICggKCAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUVudGl0eUV4cHJlc3Npb25fX0VudGl0eUFzc2lnbm1lbnRfNCApICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NzkyNToxOiAoICggcnVsZV9fRGF0YUludGVyY2hhbmdlRW50aXR5RXhwcmVzc2lvbl9fRW50aXR5QXNzaWdubWVudF80ICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6ODUzMzoxOiAoICggKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VFbnRpdHlFeHByZXNzaW9uX19FbnRpdHlBc3NpZ25tZW50XzQgKSApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjg1MzQ6MTogKCAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUVudGl0eUV4cHJlc3Npb25fX0VudGl0eUFzc2lnbm1lbnRfNCApICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjc5MjU6MTogKCAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUVudGl0eUV4cHJlc3Npb25fX0VudGl0eUFzc2lnbm1lbnRfNCApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjc5MjY6MjogKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VFbnRpdHlFeHByZXNzaW9uX19FbnRpdHlBc3NpZ25tZW50XzQgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6ODUzNDoxOiAoICggcnVsZV9fRGF0YUludGVyY2hhbmdlRW50aXR5RXhwcmVzc2lvbl9fRW50aXR5QXNzaWdubWVudF80ICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6ODUzNToyOiAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUVudGl0eUV4cHJlc3Npb25fX0VudGl0eUFzc2lnbm1lbnRfNCApCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldERhdGFJbnRlcmNoYW5nZUVudGl0eUV4cHJlc3Npb25BY2Nlc3MoKS5nZXRFbnRpdHlBc3NpZ25tZW50XzQoKSk7IAogICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NzkyNzoyOiAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUVudGl0eUV4cHJlc3Npb25fX0VudGl0eUFzc2lnbm1lbnRfNCApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo3OTI3OjM6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUVudGl0eUV4cHJlc3Npb25fX0VudGl0eUFzc2lnbm1lbnRfNAorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6ODUzNjoyOiAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUVudGl0eUV4cHJlc3Npb25fX0VudGl0eUFzc2lnbm1lbnRfNCApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo4NTM2OjM6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUVudGl0eUV4cHJlc3Npb25fX0VudGl0eUFzc2lnbm1lbnRfNAogICAgICAgICAgICAgewogICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMik7CiAgICAgICAgICAgICBydWxlX19EYXRhSW50ZXJjaGFuZ2VFbnRpdHlFeHByZXNzaW9uX19FbnRpdHlBc3NpZ25tZW50XzQoKTsKQEAgLTI3NDEzLDE0ICsyOTU3MCwxNCBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX0RhdGFJbnRlcmNoYW5nZUVudGl0eUV4cHJlc3Npb25fX0dyb3VwX181IgotICAgIC8vIEludGVybmFsRGF0YURTTC5nOjc5MzU6MTogcnVsZV9fRGF0YUludGVyY2hhbmdlRW50aXR5RXhwcmVzc2lvbl9fR3JvdXBfXzUgOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VFbnRpdHlFeHByZXNzaW9uX19Hcm91cF9fNV9fSW1wbCBydWxlX19EYXRhSW50ZXJjaGFuZ2VFbnRpdHlFeHByZXNzaW9uX19Hcm91cF9fNiA7CisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6ODU0NDoxOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VFbnRpdHlFeHByZXNzaW9uX19Hcm91cF9fNSA6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUVudGl0eUV4cHJlc3Npb25fX0dyb3VwX181X19JbXBsIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUVudGl0eUV4cHJlc3Npb25fX0dyb3VwX182IDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19EYXRhSW50ZXJjaGFuZ2VFbnRpdHlFeHByZXNzaW9uX19Hcm91cF9fNSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo3OTM5OjE6ICggcnVsZV9fRGF0YUludGVyY2hhbmdlRW50aXR5RXhwcmVzc2lvbl9fR3JvdXBfXzVfX0ltcGwgcnVsZV9fRGF0YUludGVyY2hhbmdlRW50aXR5RXhwcmVzc2lvbl9fR3JvdXBfXzYgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6Nzk0MDoyOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VFbnRpdHlFeHByZXNzaW9uX19Hcm91cF9fNV9fSW1wbCBydWxlX19EYXRhSW50ZXJjaGFuZ2VFbnRpdHlFeHByZXNzaW9uX19Hcm91cF9fNgorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6ODU0ODoxOiAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUVudGl0eUV4cHJlc3Npb25fX0dyb3VwX181X19JbXBsIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUVudGl0eUV4cHJlc3Npb25fX0dyb3VwX182ICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjg1NDk6MjogcnVsZV9fRGF0YUludGVyY2hhbmdlRW50aXR5RXhwcmVzc2lvbl9fR3JvdXBfXzVfX0ltcGwgcnVsZV9fRGF0YUludGVyY2hhbmdlRW50aXR5RXhwcmVzc2lvbl9fR3JvdXBfXzYKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzcpOwogICAgICAgICAgICAgcnVsZV9fRGF0YUludGVyY2hhbmdlRW50aXR5RXhwcmVzc2lvbl9fR3JvdXBfXzVfX0ltcGwoKTsKQEAgLTI3NDUxLDIyICsyOTYwOCwyMiBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX0RhdGFJbnRlcmNoYW5nZUVudGl0eUV4cHJlc3Npb25fX0dyb3VwX181X19JbXBsIgotICAgIC8vIEludGVybmFsRGF0YURTTC5nOjc5NDc6MTogcnVsZV9fRGF0YUludGVyY2hhbmdlRW50aXR5RXhwcmVzc2lvbl9fR3JvdXBfXzVfX0ltcGwgOiAoICdwcm9wZXJ0eScgKSA7CisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6ODU1NjoxOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VFbnRpdHlFeHByZXNzaW9uX19Hcm91cF9fNV9fSW1wbCA6ICggJ3Byb3BlcnR5JyApIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19EYXRhSW50ZXJjaGFuZ2VFbnRpdHlFeHByZXNzaW9uX19Hcm91cF9fNV9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo3OTUxOjE6ICggKCAncHJvcGVydHknICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6Nzk1MjoxOiAoICdwcm9wZXJ0eScgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6ODU2MDoxOiAoICggJ3Byb3BlcnR5JyApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjg1NjE6MTogKCAncHJvcGVydHknICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjc5NTI6MTogKCAncHJvcGVydHknICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjc5NTM6MjogJ3Byb3BlcnR5JworICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6ODU2MToxOiAoICdwcm9wZXJ0eScgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6ODU2MjoyOiAncHJvcGVydHknCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldERhdGFJbnRlcmNoYW5nZUVudGl0eUV4cHJlc3Npb25BY2Nlc3MoKS5nZXRQcm9wZXJ0eUtleXdvcmRfNSgpKTsgCiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBtYXRjaChpbnB1dCwxMDQsRk9MTE9XXzIpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOworICAgICAgICAgICAgbWF0Y2goaW5wdXQsMTExLEZPTExPV18yKTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXREYXRhSW50ZXJjaGFuZ2VFbnRpdHlFeHByZXNzaW9uQWNjZXNzKCkuZ2V0UHJvcGVydHlLZXl3b3JkXzUoKSk7IAogICAgICAgICAgICAgfQpAQCAtMjc0OTIsMTQgKzI5NjQ5LDE0IEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fRGF0YUludGVyY2hhbmdlRW50aXR5RXhwcmVzc2lvbl9fR3JvdXBfXzYiCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6Nzk2MjoxOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VFbnRpdHlFeHByZXNzaW9uX19Hcm91cF9fNiA6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUVudGl0eUV4cHJlc3Npb25fX0dyb3VwX182X19JbXBsIDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo4NTcxOjE6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUVudGl0eUV4cHJlc3Npb25fX0dyb3VwX182IDogcnVsZV9fRGF0YUludGVyY2hhbmdlRW50aXR5RXhwcmVzc2lvbl9fR3JvdXBfXzZfX0ltcGwgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUVudGl0eUV4cHJlc3Npb25fX0dyb3VwX182KCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjc5NjY6MTogKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VFbnRpdHlFeHByZXNzaW9uX19Hcm91cF9fNl9fSW1wbCApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo3OTY3OjI6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUVudGl0eUV4cHJlc3Npb25fX0dyb3VwX182X19JbXBsCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo4NTc1OjE6ICggcnVsZV9fRGF0YUludGVyY2hhbmdlRW50aXR5RXhwcmVzc2lvbl9fR3JvdXBfXzZfX0ltcGwgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6ODU3NjoyOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VFbnRpdHlFeHByZXNzaW9uX19Hcm91cF9fNl9fSW1wbAogICAgICAgICAgICAgewogICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMik7CiAgICAgICAgICAgICBydWxlX19EYXRhSW50ZXJjaGFuZ2VFbnRpdHlFeHByZXNzaW9uX19Hcm91cF9fNl9fSW1wbCgpOwpAQCAtMjc1MjUsMjMgKzI5NjgyLDIzIEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fRGF0YUludGVyY2hhbmdlRW50aXR5RXhwcmVzc2lvbl9fR3JvdXBfXzZfX0ltcGwiCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6Nzk3MzoxOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VFbnRpdHlFeHByZXNzaW9uX19Hcm91cF9fNl9fSW1wbCA6ICggKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VFbnRpdHlFeHByZXNzaW9uX19Qcm9wZXJ0eUFzc2lnbm1lbnRfNiApICkgOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjg1ODI6MTogcnVsZV9fRGF0YUludGVyY2hhbmdlRW50aXR5RXhwcmVzc2lvbl9fR3JvdXBfXzZfX0ltcGwgOiAoICggcnVsZV9fRGF0YUludGVyY2hhbmdlRW50aXR5RXhwcmVzc2lvbl9fUHJvcGVydHlBc3NpZ25tZW50XzYgKSApIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19EYXRhSW50ZXJjaGFuZ2VFbnRpdHlFeHByZXNzaW9uX19Hcm91cF9fNl9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo3OTc3OjE6ICggKCAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUVudGl0eUV4cHJlc3Npb25fX1Byb3BlcnR5QXNzaWdubWVudF82ICkgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo3OTc4OjE6ICggKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VFbnRpdHlFeHByZXNzaW9uX19Qcm9wZXJ0eUFzc2lnbm1lbnRfNiApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjg1ODY6MTogKCAoICggcnVsZV9fRGF0YUludGVyY2hhbmdlRW50aXR5RXhwcmVzc2lvbl9fUHJvcGVydHlBc3NpZ25tZW50XzYgKSApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjg1ODc6MTogKCAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUVudGl0eUV4cHJlc3Npb25fX1Byb3BlcnR5QXNzaWdubWVudF82ICkgKQogICAgICAgICAgICAgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6Nzk3ODoxOiAoICggcnVsZV9fRGF0YUludGVyY2hhbmdlRW50aXR5RXhwcmVzc2lvbl9fUHJvcGVydHlBc3NpZ25tZW50XzYgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo3OTc5OjI6ICggcnVsZV9fRGF0YUludGVyY2hhbmdlRW50aXR5RXhwcmVzc2lvbl9fUHJvcGVydHlBc3NpZ25tZW50XzYgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6ODU4NzoxOiAoICggcnVsZV9fRGF0YUludGVyY2hhbmdlRW50aXR5RXhwcmVzc2lvbl9fUHJvcGVydHlBc3NpZ25tZW50XzYgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo4NTg4OjI6ICggcnVsZV9fRGF0YUludGVyY2hhbmdlRW50aXR5RXhwcmVzc2lvbl9fUHJvcGVydHlBc3NpZ25tZW50XzYgKQogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXREYXRhSW50ZXJjaGFuZ2VFbnRpdHlFeHByZXNzaW9uQWNjZXNzKCkuZ2V0UHJvcGVydHlBc3NpZ25tZW50XzYoKSk7IAogICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6Nzk4MDoyOiAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUVudGl0eUV4cHJlc3Npb25fX1Byb3BlcnR5QXNzaWdubWVudF82ICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjc5ODA6MzogcnVsZV9fRGF0YUludGVyY2hhbmdlRW50aXR5RXhwcmVzc2lvbl9fUHJvcGVydHlBc3NpZ25tZW50XzYKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjg1ODk6MjogKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VFbnRpdHlFeHByZXNzaW9uX19Qcm9wZXJ0eUFzc2lnbm1lbnRfNiApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo4NTg5OjM6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUVudGl0eUV4cHJlc3Npb25fX1Byb3BlcnR5QXNzaWdubWVudF82CiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV18yKTsKICAgICAgICAgICAgIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUVudGl0eUV4cHJlc3Npb25fX1Byb3BlcnR5QXNzaWdubWVudF82KCk7CkBAIC0yNzU3NSwxNyArMjk3MzIsMjMxNyBAQAogICAgIC8vICRBTlRMUiBlbmQgInJ1bGVfX0RhdGFJbnRlcmNoYW5nZUVudGl0eUV4cHJlc3Npb25fX0dyb3VwX182X19JbXBsIgogCiAKKyAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX0RhdGFJbnRlcmNoYW5nZUV4cG9zZV9fR3JvdXBfXzAiCisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6ODU5ODoxOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VFeHBvc2VfX0dyb3VwX18wIDogcnVsZV9fRGF0YUludGVyY2hhbmdlRXhwb3NlX19Hcm91cF9fMF9fSW1wbCBydWxlX19EYXRhSW50ZXJjaGFuZ2VFeHBvc2VfX0dyb3VwX18xIDsKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19EYXRhSW50ZXJjaGFuZ2VFeHBvc2VfX0dyb3VwX18wKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKworICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgICAgIAkKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjg2MDI6MTogKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VFeHBvc2VfX0dyb3VwX18wX19JbXBsIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUV4cG9zZV9fR3JvdXBfXzEgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6ODYwMzoyOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VFeHBvc2VfX0dyb3VwX18wX19JbXBsIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUV4cG9zZV9fR3JvdXBfXzEKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzU2KTsKKyAgICAgICAgICAgIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUV4cG9zZV9fR3JvdXBfXzBfX0ltcGwoKTsKKworICAgICAgICAgICAgc3RhdGUuX2ZzcC0tOworICAgICAgICAgICAgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKKyAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzIpOworICAgICAgICAgICAgcnVsZV9fRGF0YUludGVyY2hhbmdlRXhwb3NlX19Hcm91cF9fMSgpOworCisgICAgICAgICAgICBzdGF0ZS5fZnNwLS07CisgICAgICAgICAgICBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOworCisgICAgICAgICAgICB9CisKKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoUmVjb2duaXRpb25FeGNlcHRpb24gcmUpIHsKKyAgICAgICAgICAgIHJlcG9ydEVycm9yKHJlKTsKKyAgICAgICAgICAgIHJlY292ZXIoaW5wdXQscmUpOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworCisgICAgICAgICAgICAJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworCisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIDsKKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAicnVsZV9fRGF0YUludGVyY2hhbmdlRXhwb3NlX19Hcm91cF9fMCIKKworCisgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19EYXRhSW50ZXJjaGFuZ2VFeHBvc2VfX0dyb3VwX18wX19JbXBsIgorICAgIC8vIEludGVybmFsRGF0YURTTC5nOjg2MTA6MTogcnVsZV9fRGF0YUludGVyY2hhbmdlRXhwb3NlX19Hcm91cF9fMF9fSW1wbCA6ICggKCkgKSA7CisgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fRGF0YUludGVyY2hhbmdlRXhwb3NlX19Hcm91cF9fMF9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisKKyAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgICAgICAJCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo4NjE0OjE6ICggKCAoKSApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjg2MTU6MTogKCAoKSApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo4NjE1OjE6ICggKCkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6ODYxNjoyOiAoKQorICAgICAgICAgICAgeworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXREYXRhSW50ZXJjaGFuZ2VFeHBvc2VBY2Nlc3MoKS5nZXREYXRhSW50ZXJjaGFuZ2VFeHBvc2VBY3Rpb25fMCgpKTsgCisgICAgICAgICAgICB9CisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo4NjE3OjI6ICgpCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo4NjE3OjM6IAorICAgICAgICAgICAgeworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YUludGVyY2hhbmdlRXhwb3NlQWNjZXNzKCkuZ2V0RGF0YUludGVyY2hhbmdlRXhwb3NlQWN0aW9uXzAoKSk7IAorICAgICAgICAgICAgfQorCisgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgfQorCisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisKKyAgICAgICAgICAgIAlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7CisKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gOworICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJydWxlX19EYXRhSW50ZXJjaGFuZ2VFeHBvc2VfX0dyb3VwX18wX19JbXBsIgorCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX0RhdGFJbnRlcmNoYW5nZUV4cG9zZV9fR3JvdXBfXzEiCisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6ODYyNToxOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VFeHBvc2VfX0dyb3VwX18xIDogcnVsZV9fRGF0YUludGVyY2hhbmdlRXhwb3NlX19Hcm91cF9fMV9fSW1wbCBydWxlX19EYXRhSW50ZXJjaGFuZ2VFeHBvc2VfX0dyb3VwX18yIDsKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19EYXRhSW50ZXJjaGFuZ2VFeHBvc2VfX0dyb3VwX18xKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKworICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgICAgIAkKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjg2Mjk6MTogKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VFeHBvc2VfX0dyb3VwX18xX19JbXBsIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUV4cG9zZV9fR3JvdXBfXzIgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6ODYzMDoyOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VFeHBvc2VfX0dyb3VwX18xX19JbXBsIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUV4cG9zZV9fR3JvdXBfXzIKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzcpOworICAgICAgICAgICAgcnVsZV9fRGF0YUludGVyY2hhbmdlRXhwb3NlX19Hcm91cF9fMV9fSW1wbCgpOworCisgICAgICAgICAgICBzdGF0ZS5fZnNwLS07CisgICAgICAgICAgICBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOworICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMik7CisgICAgICAgICAgICBydWxlX19EYXRhSW50ZXJjaGFuZ2VFeHBvc2VfX0dyb3VwX18yKCk7CisKKyAgICAgICAgICAgIHN0YXRlLl9mc3AtLTsKKyAgICAgICAgICAgIGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CisKKyAgICAgICAgICAgIH0KKworICAgICAgICB9CisgICAgICAgIGNhdGNoIChSZWNvZ25pdGlvbkV4Y2VwdGlvbiByZSkgeworICAgICAgICAgICAgcmVwb3J0RXJyb3IocmUpOworICAgICAgICAgICAgcmVjb3ZlcihpbnB1dCxyZSk7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisKKyAgICAgICAgICAgIAlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7CisKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gOworICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJydWxlX19EYXRhSW50ZXJjaGFuZ2VFeHBvc2VfX0dyb3VwX18xIgorCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX0RhdGFJbnRlcmNoYW5nZUV4cG9zZV9fR3JvdXBfXzFfX0ltcGwiCisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6ODYzNzoxOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VFeHBvc2VfX0dyb3VwX18xX19JbXBsIDogKCAncmVmJyApIDsKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19EYXRhSW50ZXJjaGFuZ2VFeHBvc2VfX0dyb3VwX18xX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKworICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgICAgIAkKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjg2NDE6MTogKCAoICdyZWYnICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6ODY0MjoxOiAoICdyZWYnICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjg2NDI6MTogKCAncmVmJyApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo4NjQzOjI6ICdyZWYnCisgICAgICAgICAgICB7CisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldERhdGFJbnRlcmNoYW5nZUV4cG9zZUFjY2VzcygpLmdldFJlZktleXdvcmRfMSgpKTsgCisgICAgICAgICAgICB9CisgICAgICAgICAgICBtYXRjaChpbnB1dCwxMTIsRk9MTE9XXzIpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBhZnRlcihncmFtbWFyQWNjZXNzLmdldERhdGFJbnRlcmNoYW5nZUV4cG9zZUFjY2VzcygpLmdldFJlZktleXdvcmRfMSgpKTsgCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICB9CisKKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoUmVjb2duaXRpb25FeGNlcHRpb24gcmUpIHsKKyAgICAgICAgICAgIHJlcG9ydEVycm9yKHJlKTsKKyAgICAgICAgICAgIHJlY292ZXIoaW5wdXQscmUpOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworCisgICAgICAgICAgICAJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworCisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIDsKKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAicnVsZV9fRGF0YUludGVyY2hhbmdlRXhwb3NlX19Hcm91cF9fMV9fSW1wbCIKKworCisgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19EYXRhSW50ZXJjaGFuZ2VFeHBvc2VfX0dyb3VwX18yIgorICAgIC8vIEludGVybmFsRGF0YURTTC5nOjg2NTI6MTogcnVsZV9fRGF0YUludGVyY2hhbmdlRXhwb3NlX19Hcm91cF9fMiA6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUV4cG9zZV9fR3JvdXBfXzJfX0ltcGwgcnVsZV9fRGF0YUludGVyY2hhbmdlRXhwb3NlX19Hcm91cF9fMyA7CisgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fRGF0YUludGVyY2hhbmdlRXhwb3NlX19Hcm91cF9fMigpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisKKyAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgICAgICAJCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo4NjU2OjE6ICggcnVsZV9fRGF0YUludGVyY2hhbmdlRXhwb3NlX19Hcm91cF9fMl9fSW1wbCBydWxlX19EYXRhSW50ZXJjaGFuZ2VFeHBvc2VfX0dyb3VwX18zICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjg2NTc6MjogcnVsZV9fRGF0YUludGVyY2hhbmdlRXhwb3NlX19Hcm91cF9fMl9fSW1wbCBydWxlX19EYXRhSW50ZXJjaGFuZ2VFeHBvc2VfX0dyb3VwX18zCisgICAgICAgICAgICB7CisgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV181Nyk7CisgICAgICAgICAgICBydWxlX19EYXRhSW50ZXJjaGFuZ2VFeHBvc2VfX0dyb3VwX18yX19JbXBsKCk7CisKKyAgICAgICAgICAgIHN0YXRlLl9mc3AtLTsKKyAgICAgICAgICAgIGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CisgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV18yKTsKKyAgICAgICAgICAgIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUV4cG9zZV9fR3JvdXBfXzMoKTsKKworICAgICAgICAgICAgc3RhdGUuX2ZzcC0tOworICAgICAgICAgICAgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKKworICAgICAgICAgICAgfQorCisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKFJlY29nbml0aW9uRXhjZXB0aW9uIHJlKSB7CisgICAgICAgICAgICByZXBvcnRFcnJvcihyZSk7CisgICAgICAgICAgICByZWNvdmVyKGlucHV0LHJlKTsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKworICAgICAgICAgICAgCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKKworICAgICAgICB9CisgICAgICAgIHJldHVybiA7CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgInJ1bGVfX0RhdGFJbnRlcmNoYW5nZUV4cG9zZV9fR3JvdXBfXzIiCisKKworICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fRGF0YUludGVyY2hhbmdlRXhwb3NlX19Hcm91cF9fMl9fSW1wbCIKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo4NjY0OjE6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUV4cG9zZV9fR3JvdXBfXzJfX0ltcGwgOiAoICggcnVsZV9fRGF0YUludGVyY2hhbmdlRXhwb3NlX19SZWZFbnRpdHlBc3NpZ25tZW50XzIgKSApIDsKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19EYXRhSW50ZXJjaGFuZ2VFeHBvc2VfX0dyb3VwX18yX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKworICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgICAgIAkKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjg2Njg6MTogKCAoICggcnVsZV9fRGF0YUludGVyY2hhbmdlRXhwb3NlX19SZWZFbnRpdHlBc3NpZ25tZW50XzIgKSApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjg2Njk6MTogKCAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUV4cG9zZV9fUmVmRW50aXR5QXNzaWdubWVudF8yICkgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6ODY2OToxOiAoICggcnVsZV9fRGF0YUludGVyY2hhbmdlRXhwb3NlX19SZWZFbnRpdHlBc3NpZ25tZW50XzIgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo4NjcwOjI6ICggcnVsZV9fRGF0YUludGVyY2hhbmdlRXhwb3NlX19SZWZFbnRpdHlBc3NpZ25tZW50XzIgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXREYXRhSW50ZXJjaGFuZ2VFeHBvc2VBY2Nlc3MoKS5nZXRSZWZFbnRpdHlBc3NpZ25tZW50XzIoKSk7IAorICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6ODY3MToyOiAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUV4cG9zZV9fUmVmRW50aXR5QXNzaWdubWVudF8yICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjg2NzE6MzogcnVsZV9fRGF0YUludGVyY2hhbmdlRXhwb3NlX19SZWZFbnRpdHlBc3NpZ25tZW50XzIKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzIpOworICAgICAgICAgICAgcnVsZV9fRGF0YUludGVyY2hhbmdlRXhwb3NlX19SZWZFbnRpdHlBc3NpZ25tZW50XzIoKTsKKworICAgICAgICAgICAgc3RhdGUuX2ZzcC0tOworICAgICAgICAgICAgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YUludGVyY2hhbmdlRXhwb3NlQWNjZXNzKCkuZ2V0UmVmRW50aXR5QXNzaWdubWVudF8yKCkpOyAKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgIH0KKworICAgICAgICB9CisgICAgICAgIGNhdGNoIChSZWNvZ25pdGlvbkV4Y2VwdGlvbiByZSkgeworICAgICAgICAgICAgcmVwb3J0RXJyb3IocmUpOworICAgICAgICAgICAgcmVjb3ZlcihpbnB1dCxyZSk7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisKKyAgICAgICAgICAgIAlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7CisKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gOworICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJydWxlX19EYXRhSW50ZXJjaGFuZ2VFeHBvc2VfX0dyb3VwX18yX19JbXBsIgorCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX0RhdGFJbnRlcmNoYW5nZUV4cG9zZV9fR3JvdXBfXzMiCisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6ODY3OToxOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VFeHBvc2VfX0dyb3VwX18zIDogcnVsZV9fRGF0YUludGVyY2hhbmdlRXhwb3NlX19Hcm91cF9fM19fSW1wbCA7CisgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fRGF0YUludGVyY2hhbmdlRXhwb3NlX19Hcm91cF9fMygpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisKKyAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgICAgICAJCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo4NjgzOjE6ICggcnVsZV9fRGF0YUludGVyY2hhbmdlRXhwb3NlX19Hcm91cF9fM19fSW1wbCApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo4Njg0OjI6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUV4cG9zZV9fR3JvdXBfXzNfX0ltcGwKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzIpOworICAgICAgICAgICAgcnVsZV9fRGF0YUludGVyY2hhbmdlRXhwb3NlX19Hcm91cF9fM19fSW1wbCgpOworCisgICAgICAgICAgICBzdGF0ZS5fZnNwLS07CisgICAgICAgICAgICBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOworCisgICAgICAgICAgICB9CisKKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoUmVjb2duaXRpb25FeGNlcHRpb24gcmUpIHsKKyAgICAgICAgICAgIHJlcG9ydEVycm9yKHJlKTsKKyAgICAgICAgICAgIHJlY292ZXIoaW5wdXQscmUpOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworCisgICAgICAgICAgICAJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworCisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIDsKKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAicnVsZV9fRGF0YUludGVyY2hhbmdlRXhwb3NlX19Hcm91cF9fMyIKKworCisgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19EYXRhSW50ZXJjaGFuZ2VFeHBvc2VfX0dyb3VwX18zX19JbXBsIgorICAgIC8vIEludGVybmFsRGF0YURTTC5nOjg2OTA6MTogcnVsZV9fRGF0YUludGVyY2hhbmdlRXhwb3NlX19Hcm91cF9fM19fSW1wbCA6ICggKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VFeHBvc2VfX0FsdGVybmF0aXZlc18zICkgKSA7CisgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fRGF0YUludGVyY2hhbmdlRXhwb3NlX19Hcm91cF9fM19fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisKKyAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgICAgICAJCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo4Njk0OjE6ICggKCAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUV4cG9zZV9fQWx0ZXJuYXRpdmVzXzMgKSApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjg2OTU6MTogKCAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUV4cG9zZV9fQWx0ZXJuYXRpdmVzXzMgKSApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo4Njk1OjE6ICggKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VFeHBvc2VfX0FsdGVybmF0aXZlc18zICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6ODY5NjoyOiAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUV4cG9zZV9fQWx0ZXJuYXRpdmVzXzMgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXREYXRhSW50ZXJjaGFuZ2VFeHBvc2VBY2Nlc3MoKS5nZXRBbHRlcm5hdGl2ZXNfMygpKTsgCisgICAgICAgICAgICB9CisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo4Njk3OjI6ICggcnVsZV9fRGF0YUludGVyY2hhbmdlRXhwb3NlX19BbHRlcm5hdGl2ZXNfMyApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo4Njk3OjM6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUV4cG9zZV9fQWx0ZXJuYXRpdmVzXzMKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzIpOworICAgICAgICAgICAgcnVsZV9fRGF0YUludGVyY2hhbmdlRXhwb3NlX19BbHRlcm5hdGl2ZXNfMygpOworCisgICAgICAgICAgICBzdGF0ZS5fZnNwLS07CisgICAgICAgICAgICBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXREYXRhSW50ZXJjaGFuZ2VFeHBvc2VBY2Nlc3MoKS5nZXRBbHRlcm5hdGl2ZXNfMygpKTsgCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICB9CisKKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoUmVjb2duaXRpb25FeGNlcHRpb24gcmUpIHsKKyAgICAgICAgICAgIHJlcG9ydEVycm9yKHJlKTsKKyAgICAgICAgICAgIHJlY292ZXIoaW5wdXQscmUpOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworCisgICAgICAgICAgICAJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworCisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIDsKKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAicnVsZV9fRGF0YUludGVyY2hhbmdlRXhwb3NlX19Hcm91cF9fM19fSW1wbCIKKworCisgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19EYXRhSW50ZXJjaGFuZ2VFeHBvc2VfX0dyb3VwXzNfMF9fMCIKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo4NzA2OjE6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUV4cG9zZV9fR3JvdXBfM18wX18wIDogcnVsZV9fRGF0YUludGVyY2hhbmdlRXhwb3NlX19Hcm91cF8zXzBfXzBfX0ltcGwgcnVsZV9fRGF0YUludGVyY2hhbmdlRXhwb3NlX19Hcm91cF8zXzBfXzEgOworICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUV4cG9zZV9fR3JvdXBfM18wX18wKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKworICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgICAgIAkKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjg3MTA6MTogKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VFeHBvc2VfX0dyb3VwXzNfMF9fMF9fSW1wbCBydWxlX19EYXRhSW50ZXJjaGFuZ2VFeHBvc2VfX0dyb3VwXzNfMF9fMSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo4NzExOjI6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUV4cG9zZV9fR3JvdXBfM18wX18wX19JbXBsIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUV4cG9zZV9fR3JvdXBfM18wX18xCisgICAgICAgICAgICB7CisgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV183KTsKKyAgICAgICAgICAgIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUV4cG9zZV9fR3JvdXBfM18wX18wX19JbXBsKCk7CisKKyAgICAgICAgICAgIHN0YXRlLl9mc3AtLTsKKyAgICAgICAgICAgIGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CisgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV18yKTsKKyAgICAgICAgICAgIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUV4cG9zZV9fR3JvdXBfM18wX18xKCk7CisKKyAgICAgICAgICAgIHN0YXRlLl9mc3AtLTsKKyAgICAgICAgICAgIGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CisKKyAgICAgICAgICAgIH0KKworICAgICAgICB9CisgICAgICAgIGNhdGNoIChSZWNvZ25pdGlvbkV4Y2VwdGlvbiByZSkgeworICAgICAgICAgICAgcmVwb3J0RXJyb3IocmUpOworICAgICAgICAgICAgcmVjb3ZlcihpbnB1dCxyZSk7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisKKyAgICAgICAgICAgIAlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7CisKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gOworICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJydWxlX19EYXRhSW50ZXJjaGFuZ2VFeHBvc2VfX0dyb3VwXzNfMF9fMCIKKworCisgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19EYXRhSW50ZXJjaGFuZ2VFeHBvc2VfX0dyb3VwXzNfMF9fMF9fSW1wbCIKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo4NzE4OjE6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUV4cG9zZV9fR3JvdXBfM18wX18wX19JbXBsIDogKCAnb24nICkgOworICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUV4cG9zZV9fR3JvdXBfM18wX18wX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKworICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgICAgIAkKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjg3MjI6MTogKCAoICdvbicgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo4NzIzOjE6ICggJ29uJyApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo4NzIzOjE6ICggJ29uJyApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo4NzI0OjI6ICdvbicKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YUludGVyY2hhbmdlRXhwb3NlQWNjZXNzKCkuZ2V0T25LZXl3b3JkXzNfMF8wKCkpOyAKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1hdGNoKGlucHV0LDEwMyxGT0xMT1dfMik7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YUludGVyY2hhbmdlRXhwb3NlQWNjZXNzKCkuZ2V0T25LZXl3b3JkXzNfMF8wKCkpOyAKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgIH0KKworICAgICAgICB9CisgICAgICAgIGNhdGNoIChSZWNvZ25pdGlvbkV4Y2VwdGlvbiByZSkgeworICAgICAgICAgICAgcmVwb3J0RXJyb3IocmUpOworICAgICAgICAgICAgcmVjb3ZlcihpbnB1dCxyZSk7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisKKyAgICAgICAgICAgIAlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7CisKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gOworICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJydWxlX19EYXRhSW50ZXJjaGFuZ2VFeHBvc2VfX0dyb3VwXzNfMF9fMF9fSW1wbCIKKworCisgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19EYXRhSW50ZXJjaGFuZ2VFeHBvc2VfX0dyb3VwXzNfMF9fMSIKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo4NzMzOjE6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUV4cG9zZV9fR3JvdXBfM18wX18xIDogcnVsZV9fRGF0YUludGVyY2hhbmdlRXhwb3NlX19Hcm91cF8zXzBfXzFfX0ltcGwgOworICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUV4cG9zZV9fR3JvdXBfM18wX18xKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKworICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgICAgIAkKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjg3Mzc6MTogKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VFeHBvc2VfX0dyb3VwXzNfMF9fMV9fSW1wbCApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo4NzM4OjI6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUV4cG9zZV9fR3JvdXBfM18wX18xX19JbXBsCisgICAgICAgICAgICB7CisgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV18yKTsKKyAgICAgICAgICAgIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUV4cG9zZV9fR3JvdXBfM18wX18xX19JbXBsKCk7CisKKyAgICAgICAgICAgIHN0YXRlLl9mc3AtLTsKKyAgICAgICAgICAgIGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CisKKyAgICAgICAgICAgIH0KKworICAgICAgICB9CisgICAgICAgIGNhdGNoIChSZWNvZ25pdGlvbkV4Y2VwdGlvbiByZSkgeworICAgICAgICAgICAgcmVwb3J0RXJyb3IocmUpOworICAgICAgICAgICAgcmVjb3ZlcihpbnB1dCxyZSk7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisKKyAgICAgICAgICAgIAlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7CisKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gOworICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJydWxlX19EYXRhSW50ZXJjaGFuZ2VFeHBvc2VfX0dyb3VwXzNfMF9fMSIKKworCisgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19EYXRhSW50ZXJjaGFuZ2VFeHBvc2VfX0dyb3VwXzNfMF9fMV9fSW1wbCIKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo4NzQ0OjE6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUV4cG9zZV9fR3JvdXBfM18wX18xX19JbXBsIDogKCAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUV4cG9zZV9fUmVmUHJvcGVydHlBc3NpZ25tZW50XzNfMF8xICkgKSA7CisgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fRGF0YUludGVyY2hhbmdlRXhwb3NlX19Hcm91cF8zXzBfXzFfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworCisgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICAgICAgCQorICAgICAgICB0cnkgeworICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6ODc0ODoxOiAoICggKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VFeHBvc2VfX1JlZlByb3BlcnR5QXNzaWdubWVudF8zXzBfMSApICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6ODc0OToxOiAoICggcnVsZV9fRGF0YUludGVyY2hhbmdlRXhwb3NlX19SZWZQcm9wZXJ0eUFzc2lnbm1lbnRfM18wXzEgKSApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo4NzQ5OjE6ICggKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VFeHBvc2VfX1JlZlByb3BlcnR5QXNzaWdubWVudF8zXzBfMSApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjg3NTA6MjogKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VFeHBvc2VfX1JlZlByb3BlcnR5QXNzaWdubWVudF8zXzBfMSApCisgICAgICAgICAgICB7CisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldERhdGFJbnRlcmNoYW5nZUV4cG9zZUFjY2VzcygpLmdldFJlZlByb3BlcnR5QXNzaWdubWVudF8zXzBfMSgpKTsgCisgICAgICAgICAgICB9CisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo4NzUxOjI6ICggcnVsZV9fRGF0YUludGVyY2hhbmdlRXhwb3NlX19SZWZQcm9wZXJ0eUFzc2lnbm1lbnRfM18wXzEgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6ODc1MTozOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VFeHBvc2VfX1JlZlByb3BlcnR5QXNzaWdubWVudF8zXzBfMQorICAgICAgICAgICAgeworICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMik7CisgICAgICAgICAgICBydWxlX19EYXRhSW50ZXJjaGFuZ2VFeHBvc2VfX1JlZlByb3BlcnR5QXNzaWdubWVudF8zXzBfMSgpOworCisgICAgICAgICAgICBzdGF0ZS5fZnNwLS07CisgICAgICAgICAgICBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXREYXRhSW50ZXJjaGFuZ2VFeHBvc2VBY2Nlc3MoKS5nZXRSZWZQcm9wZXJ0eUFzc2lnbm1lbnRfM18wXzEoKSk7IAorICAgICAgICAgICAgfQorCisgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgfQorCisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKFJlY29nbml0aW9uRXhjZXB0aW9uIHJlKSB7CisgICAgICAgICAgICByZXBvcnRFcnJvcihyZSk7CisgICAgICAgICAgICByZWNvdmVyKGlucHV0LHJlKTsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKworICAgICAgICAgICAgCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKKworICAgICAgICB9CisgICAgICAgIHJldHVybiA7CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgInJ1bGVfX0RhdGFJbnRlcmNoYW5nZUV4cG9zZV9fR3JvdXBfM18wX18xX19JbXBsIgorCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX0RhdGFJbnRlcmNoYW5nZUV4cG9zZV9fR3JvdXBfM18xX18wIgorICAgIC8vIEludGVybmFsRGF0YURTTC5nOjg3NjA6MTogcnVsZV9fRGF0YUludGVyY2hhbmdlRXhwb3NlX19Hcm91cF8zXzFfXzAgOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VFeHBvc2VfX0dyb3VwXzNfMV9fMF9fSW1wbCBydWxlX19EYXRhSW50ZXJjaGFuZ2VFeHBvc2VfX0dyb3VwXzNfMV9fMSA7CisgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fRGF0YUludGVyY2hhbmdlRXhwb3NlX19Hcm91cF8zXzFfXzAoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworCisgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICAgICAgCQorICAgICAgICB0cnkgeworICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6ODc2NDoxOiAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUV4cG9zZV9fR3JvdXBfM18xX18wX19JbXBsIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUV4cG9zZV9fR3JvdXBfM18xX18xICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjg3NjU6MjogcnVsZV9fRGF0YUludGVyY2hhbmdlRXhwb3NlX19Hcm91cF8zXzFfXzBfX0ltcGwgcnVsZV9fRGF0YUludGVyY2hhbmdlRXhwb3NlX19Hcm91cF8zXzFfXzEKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzEwKTsKKyAgICAgICAgICAgIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUV4cG9zZV9fR3JvdXBfM18xX18wX19JbXBsKCk7CisKKyAgICAgICAgICAgIHN0YXRlLl9mc3AtLTsKKyAgICAgICAgICAgIGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CisgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV18yKTsKKyAgICAgICAgICAgIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUV4cG9zZV9fR3JvdXBfM18xX18xKCk7CisKKyAgICAgICAgICAgIHN0YXRlLl9mc3AtLTsKKyAgICAgICAgICAgIGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CisKKyAgICAgICAgICAgIH0KKworICAgICAgICB9CisgICAgICAgIGNhdGNoIChSZWNvZ25pdGlvbkV4Y2VwdGlvbiByZSkgeworICAgICAgICAgICAgcmVwb3J0RXJyb3IocmUpOworICAgICAgICAgICAgcmVjb3ZlcihpbnB1dCxyZSk7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisKKyAgICAgICAgICAgIAlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7CisKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gOworICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJydWxlX19EYXRhSW50ZXJjaGFuZ2VFeHBvc2VfX0dyb3VwXzNfMV9fMCIKKworCisgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19EYXRhSW50ZXJjaGFuZ2VFeHBvc2VfX0dyb3VwXzNfMV9fMF9fSW1wbCIKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo4NzcyOjE6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUV4cG9zZV9fR3JvdXBfM18xX18wX19JbXBsIDogKCAnZXhwb3NlJyApIDsKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19EYXRhSW50ZXJjaGFuZ2VFeHBvc2VfX0dyb3VwXzNfMV9fMF9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisKKyAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgICAgICAJCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo4Nzc2OjE6ICggKCAnZXhwb3NlJyApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjg3Nzc6MTogKCAnZXhwb3NlJyApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo4Nzc3OjE6ICggJ2V4cG9zZScgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6ODc3ODoyOiAnZXhwb3NlJworICAgICAgICAgICAgeworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXREYXRhSW50ZXJjaGFuZ2VFeHBvc2VBY2Nlc3MoKS5nZXRFeHBvc2VLZXl3b3JkXzNfMV8wKCkpOyAKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1hdGNoKGlucHV0LDk3LEZPTExPV18yKTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXREYXRhSW50ZXJjaGFuZ2VFeHBvc2VBY2Nlc3MoKS5nZXRFeHBvc2VLZXl3b3JkXzNfMV8wKCkpOyAKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgIH0KKworICAgICAgICB9CisgICAgICAgIGNhdGNoIChSZWNvZ25pdGlvbkV4Y2VwdGlvbiByZSkgeworICAgICAgICAgICAgcmVwb3J0RXJyb3IocmUpOworICAgICAgICAgICAgcmVjb3ZlcihpbnB1dCxyZSk7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisKKyAgICAgICAgICAgIAlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7CisKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gOworICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJydWxlX19EYXRhSW50ZXJjaGFuZ2VFeHBvc2VfX0dyb3VwXzNfMV9fMF9fSW1wbCIKKworCisgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19EYXRhSW50ZXJjaGFuZ2VFeHBvc2VfX0dyb3VwXzNfMV9fMSIKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo4Nzg3OjE6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUV4cG9zZV9fR3JvdXBfM18xX18xIDogcnVsZV9fRGF0YUludGVyY2hhbmdlRXhwb3NlX19Hcm91cF8zXzFfXzFfX0ltcGwgcnVsZV9fRGF0YUludGVyY2hhbmdlRXhwb3NlX19Hcm91cF8zXzFfXzIgOworICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUV4cG9zZV9fR3JvdXBfM18xX18xKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKworICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgICAgIAkKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjg3OTE6MTogKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VFeHBvc2VfX0dyb3VwXzNfMV9fMV9fSW1wbCBydWxlX19EYXRhSW50ZXJjaGFuZ2VFeHBvc2VfX0dyb3VwXzNfMV9fMiApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo4NzkyOjI6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUV4cG9zZV9fR3JvdXBfM18xX18xX19JbXBsIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUV4cG9zZV9fR3JvdXBfM18xX18yCisgICAgICAgICAgICB7CisgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV181Nik7CisgICAgICAgICAgICBydWxlX19EYXRhSW50ZXJjaGFuZ2VFeHBvc2VfX0dyb3VwXzNfMV9fMV9fSW1wbCgpOworCisgICAgICAgICAgICBzdGF0ZS5fZnNwLS07CisgICAgICAgICAgICBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOworICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMik7CisgICAgICAgICAgICBydWxlX19EYXRhSW50ZXJjaGFuZ2VFeHBvc2VfX0dyb3VwXzNfMV9fMigpOworCisgICAgICAgICAgICBzdGF0ZS5fZnNwLS07CisgICAgICAgICAgICBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOworCisgICAgICAgICAgICB9CisKKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoUmVjb2duaXRpb25FeGNlcHRpb24gcmUpIHsKKyAgICAgICAgICAgIHJlcG9ydEVycm9yKHJlKTsKKyAgICAgICAgICAgIHJlY292ZXIoaW5wdXQscmUpOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworCisgICAgICAgICAgICAJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworCisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIDsKKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAicnVsZV9fRGF0YUludGVyY2hhbmdlRXhwb3NlX19Hcm91cF8zXzFfXzEiCisKKworICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fRGF0YUludGVyY2hhbmdlRXhwb3NlX19Hcm91cF8zXzFfXzFfX0ltcGwiCisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6ODc5OToxOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VFeHBvc2VfX0dyb3VwXzNfMV9fMV9fSW1wbCA6ICggJ3snICkgOworICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUV4cG9zZV9fR3JvdXBfM18xX18xX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKworICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgICAgIAkKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjg4MDM6MTogKCAoICd7JyApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjg4MDQ6MTogKCAneycgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6ODgwNDoxOiAoICd7JyApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo4ODA1OjI6ICd7JworICAgICAgICAgICAgeworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXREYXRhSW50ZXJjaGFuZ2VFeHBvc2VBY2Nlc3MoKS5nZXRMZWZ0Q3VybHlCcmFja2V0S2V5d29yZF8zXzFfMSgpKTsgCisgICAgICAgICAgICB9CisgICAgICAgICAgICBtYXRjaChpbnB1dCw3NSxGT0xMT1dfMik7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YUludGVyY2hhbmdlRXhwb3NlQWNjZXNzKCkuZ2V0TGVmdEN1cmx5QnJhY2tldEtleXdvcmRfM18xXzEoKSk7IAorICAgICAgICAgICAgfQorCisgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgfQorCisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKFJlY29nbml0aW9uRXhjZXB0aW9uIHJlKSB7CisgICAgICAgICAgICByZXBvcnRFcnJvcihyZSk7CisgICAgICAgICAgICByZWNvdmVyKGlucHV0LHJlKTsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKworICAgICAgICAgICAgCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKKworICAgICAgICB9CisgICAgICAgIHJldHVybiA7CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgInJ1bGVfX0RhdGFJbnRlcmNoYW5nZUV4cG9zZV9fR3JvdXBfM18xX18xX19JbXBsIgorCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX0RhdGFJbnRlcmNoYW5nZUV4cG9zZV9fR3JvdXBfM18xX18yIgorICAgIC8vIEludGVybmFsRGF0YURTTC5nOjg4MTQ6MTogcnVsZV9fRGF0YUludGVyY2hhbmdlRXhwb3NlX19Hcm91cF8zXzFfXzIgOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VFeHBvc2VfX0dyb3VwXzNfMV9fMl9fSW1wbCBydWxlX19EYXRhSW50ZXJjaGFuZ2VFeHBvc2VfX0dyb3VwXzNfMV9fMyA7CisgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fRGF0YUludGVyY2hhbmdlRXhwb3NlX19Hcm91cF8zXzFfXzIoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworCisgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICAgICAgCQorICAgICAgICB0cnkgeworICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6ODgxODoxOiAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUV4cG9zZV9fR3JvdXBfM18xX18yX19JbXBsIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUV4cG9zZV9fR3JvdXBfM18xX18zICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjg4MTk6MjogcnVsZV9fRGF0YUludGVyY2hhbmdlRXhwb3NlX19Hcm91cF8zXzFfXzJfX0ltcGwgcnVsZV9fRGF0YUludGVyY2hhbmdlRXhwb3NlX19Hcm91cF8zXzFfXzMKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzQxKTsKKyAgICAgICAgICAgIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUV4cG9zZV9fR3JvdXBfM18xX18yX19JbXBsKCk7CisKKyAgICAgICAgICAgIHN0YXRlLl9mc3AtLTsKKyAgICAgICAgICAgIGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CisgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV18yKTsKKyAgICAgICAgICAgIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUV4cG9zZV9fR3JvdXBfM18xX18zKCk7CisKKyAgICAgICAgICAgIHN0YXRlLl9mc3AtLTsKKyAgICAgICAgICAgIGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CisKKyAgICAgICAgICAgIH0KKworICAgICAgICB9CisgICAgICAgIGNhdGNoIChSZWNvZ25pdGlvbkV4Y2VwdGlvbiByZSkgeworICAgICAgICAgICAgcmVwb3J0RXJyb3IocmUpOworICAgICAgICAgICAgcmVjb3ZlcihpbnB1dCxyZSk7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisKKyAgICAgICAgICAgIAlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7CisKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gOworICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJydWxlX19EYXRhSW50ZXJjaGFuZ2VFeHBvc2VfX0dyb3VwXzNfMV9fMiIKKworCisgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19EYXRhSW50ZXJjaGFuZ2VFeHBvc2VfX0dyb3VwXzNfMV9fMl9fSW1wbCIKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo4ODI2OjE6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUV4cG9zZV9fR3JvdXBfM18xX18yX19JbXBsIDogKCAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUV4cG9zZV9fU3ViRXhwb3NlQXNzaWdubWVudF8zXzFfMiApICkgOworICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUV4cG9zZV9fR3JvdXBfM18xX18yX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKworICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgICAgIAkKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjg4MzA6MTogKCAoICggcnVsZV9fRGF0YUludGVyY2hhbmdlRXhwb3NlX19TdWJFeHBvc2VBc3NpZ25tZW50XzNfMV8yICkgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo4ODMxOjE6ICggKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VFeHBvc2VfX1N1YkV4cG9zZUFzc2lnbm1lbnRfM18xXzIgKSApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo4ODMxOjE6ICggKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VFeHBvc2VfX1N1YkV4cG9zZUFzc2lnbm1lbnRfM18xXzIgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo4ODMyOjI6ICggcnVsZV9fRGF0YUludGVyY2hhbmdlRXhwb3NlX19TdWJFeHBvc2VBc3NpZ25tZW50XzNfMV8yICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YUludGVyY2hhbmdlRXhwb3NlQWNjZXNzKCkuZ2V0U3ViRXhwb3NlQXNzaWdubWVudF8zXzFfMigpKTsgCisgICAgICAgICAgICB9CisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo4ODMzOjI6ICggcnVsZV9fRGF0YUludGVyY2hhbmdlRXhwb3NlX19TdWJFeHBvc2VBc3NpZ25tZW50XzNfMV8yICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjg4MzM6MzogcnVsZV9fRGF0YUludGVyY2hhbmdlRXhwb3NlX19TdWJFeHBvc2VBc3NpZ25tZW50XzNfMV8yCisgICAgICAgICAgICB7CisgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV18yKTsKKyAgICAgICAgICAgIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUV4cG9zZV9fU3ViRXhwb3NlQXNzaWdubWVudF8zXzFfMigpOworCisgICAgICAgICAgICBzdGF0ZS5fZnNwLS07CisgICAgICAgICAgICBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXREYXRhSW50ZXJjaGFuZ2VFeHBvc2VBY2Nlc3MoKS5nZXRTdWJFeHBvc2VBc3NpZ25tZW50XzNfMV8yKCkpOyAKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgIH0KKworICAgICAgICB9CisgICAgICAgIGNhdGNoIChSZWNvZ25pdGlvbkV4Y2VwdGlvbiByZSkgeworICAgICAgICAgICAgcmVwb3J0RXJyb3IocmUpOworICAgICAgICAgICAgcmVjb3ZlcihpbnB1dCxyZSk7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisKKyAgICAgICAgICAgIAlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7CisKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gOworICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJydWxlX19EYXRhSW50ZXJjaGFuZ2VFeHBvc2VfX0dyb3VwXzNfMV9fMl9fSW1wbCIKKworCisgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19EYXRhSW50ZXJjaGFuZ2VFeHBvc2VfX0dyb3VwXzNfMV9fMyIKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo4ODQxOjE6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUV4cG9zZV9fR3JvdXBfM18xX18zIDogcnVsZV9fRGF0YUludGVyY2hhbmdlRXhwb3NlX19Hcm91cF8zXzFfXzNfX0ltcGwgOworICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUV4cG9zZV9fR3JvdXBfM18xX18zKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKworICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgICAgIAkKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjg4NDU6MTogKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VFeHBvc2VfX0dyb3VwXzNfMV9fM19fSW1wbCApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo4ODQ2OjI6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUV4cG9zZV9fR3JvdXBfM18xX18zX19JbXBsCisgICAgICAgICAgICB7CisgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV18yKTsKKyAgICAgICAgICAgIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUV4cG9zZV9fR3JvdXBfM18xX18zX19JbXBsKCk7CisKKyAgICAgICAgICAgIHN0YXRlLl9mc3AtLTsKKyAgICAgICAgICAgIGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CisKKyAgICAgICAgICAgIH0KKworICAgICAgICB9CisgICAgICAgIGNhdGNoIChSZWNvZ25pdGlvbkV4Y2VwdGlvbiByZSkgeworICAgICAgICAgICAgcmVwb3J0RXJyb3IocmUpOworICAgICAgICAgICAgcmVjb3ZlcihpbnB1dCxyZSk7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisKKyAgICAgICAgICAgIAlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7CisKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gOworICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJydWxlX19EYXRhSW50ZXJjaGFuZ2VFeHBvc2VfX0dyb3VwXzNfMV9fMyIKKworCisgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19EYXRhSW50ZXJjaGFuZ2VFeHBvc2VfX0dyb3VwXzNfMV9fM19fSW1wbCIKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo4ODUyOjE6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUV4cG9zZV9fR3JvdXBfM18xX18zX19JbXBsIDogKCAnfScgKSA7CisgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fRGF0YUludGVyY2hhbmdlRXhwb3NlX19Hcm91cF8zXzFfXzNfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworCisgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICAgICAgCQorICAgICAgICB0cnkgeworICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6ODg1NjoxOiAoICggJ30nICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6ODg1NzoxOiAoICd9JyApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo4ODU3OjE6ICggJ30nICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjg4NTg6MjogJ30nCisgICAgICAgICAgICB7CisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldERhdGFJbnRlcmNoYW5nZUV4cG9zZUFjY2VzcygpLmdldFJpZ2h0Q3VybHlCcmFja2V0S2V5d29yZF8zXzFfMygpKTsgCisgICAgICAgICAgICB9CisgICAgICAgICAgICBtYXRjaChpbnB1dCw3NixGT0xMT1dfMik7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YUludGVyY2hhbmdlRXhwb3NlQWNjZXNzKCkuZ2V0UmlnaHRDdXJseUJyYWNrZXRLZXl3b3JkXzNfMV8zKCkpOyAKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgIH0KKworICAgICAgICB9CisgICAgICAgIGNhdGNoIChSZWNvZ25pdGlvbkV4Y2VwdGlvbiByZSkgeworICAgICAgICAgICAgcmVwb3J0RXJyb3IocmUpOworICAgICAgICAgICAgcmVjb3ZlcihpbnB1dCxyZSk7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisKKyAgICAgICAgICAgIAlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7CisKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gOworICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJydWxlX19EYXRhSW50ZXJjaGFuZ2VFeHBvc2VfX0dyb3VwXzNfMV9fM19fSW1wbCIKKworCisgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19EYXRhSW50ZXJjaGFuZ2VFeHBvcnRGaWx0ZXJfX0dyb3VwX18wIgorICAgIC8vIEludGVybmFsRGF0YURTTC5nOjg4Njg6MTogcnVsZV9fRGF0YUludGVyY2hhbmdlRXhwb3J0RmlsdGVyX19Hcm91cF9fMCA6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUV4cG9ydEZpbHRlcl9fR3JvdXBfXzBfX0ltcGwgcnVsZV9fRGF0YUludGVyY2hhbmdlRXhwb3J0RmlsdGVyX19Hcm91cF9fMSA7CisgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fRGF0YUludGVyY2hhbmdlRXhwb3J0RmlsdGVyX19Hcm91cF9fMCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisKKyAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgICAgICAJCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo4ODcyOjE6ICggcnVsZV9fRGF0YUludGVyY2hhbmdlRXhwb3J0RmlsdGVyX19Hcm91cF9fMF9fSW1wbCBydWxlX19EYXRhSW50ZXJjaGFuZ2VFeHBvcnRGaWx0ZXJfX0dyb3VwX18xICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjg4NzM6MjogcnVsZV9fRGF0YUludGVyY2hhbmdlRXhwb3J0RmlsdGVyX19Hcm91cF9fMF9fSW1wbCBydWxlX19EYXRhSW50ZXJjaGFuZ2VFeHBvcnRGaWx0ZXJfX0dyb3VwX18xCisgICAgICAgICAgICB7CisgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV180MCk7CisgICAgICAgICAgICBydWxlX19EYXRhSW50ZXJjaGFuZ2VFeHBvcnRGaWx0ZXJfX0dyb3VwX18wX19JbXBsKCk7CisKKyAgICAgICAgICAgIHN0YXRlLl9mc3AtLTsKKyAgICAgICAgICAgIGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CisgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV18yKTsKKyAgICAgICAgICAgIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUV4cG9ydEZpbHRlcl9fR3JvdXBfXzEoKTsKKworICAgICAgICAgICAgc3RhdGUuX2ZzcC0tOworICAgICAgICAgICAgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKKworICAgICAgICAgICAgfQorCisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKFJlY29nbml0aW9uRXhjZXB0aW9uIHJlKSB7CisgICAgICAgICAgICByZXBvcnRFcnJvcihyZSk7CisgICAgICAgICAgICByZWNvdmVyKGlucHV0LHJlKTsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKworICAgICAgICAgICAgCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKKworICAgICAgICB9CisgICAgICAgIHJldHVybiA7CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgInJ1bGVfX0RhdGFJbnRlcmNoYW5nZUV4cG9ydEZpbHRlcl9fR3JvdXBfXzAiCisKKworICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fRGF0YUludGVyY2hhbmdlRXhwb3J0RmlsdGVyX19Hcm91cF9fMF9fSW1wbCIKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo4ODgwOjE6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUV4cG9ydEZpbHRlcl9fR3JvdXBfXzBfX0ltcGwgOiAoICgpICkgOworICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUV4cG9ydEZpbHRlcl9fR3JvdXBfXzBfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworCisgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICAgICAgCQorICAgICAgICB0cnkgeworICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6ODg4NDoxOiAoICggKCkgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo4ODg1OjE6ICggKCkgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6ODg4NToxOiAoICgpICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjg4ODY6MjogKCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YUludGVyY2hhbmdlRXhwb3J0RmlsdGVyQWNjZXNzKCkuZ2V0RGF0YUludGVyY2hhbmdlRXhwb3J0RmlsdGVyQWN0aW9uXzAoKSk7IAorICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6ODg4NzoyOiAoKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6ODg4NzozOiAKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBhZnRlcihncmFtbWFyQWNjZXNzLmdldERhdGFJbnRlcmNoYW5nZUV4cG9ydEZpbHRlckFjY2VzcygpLmdldERhdGFJbnRlcmNoYW5nZUV4cG9ydEZpbHRlckFjdGlvbl8wKCkpOyAKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgIH0KKworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworCisgICAgICAgICAgICAJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworCisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIDsKKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAicnVsZV9fRGF0YUludGVyY2hhbmdlRXhwb3J0RmlsdGVyX19Hcm91cF9fMF9fSW1wbCIKKworCisgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19EYXRhSW50ZXJjaGFuZ2VFeHBvcnRGaWx0ZXJfX0dyb3VwX18xIgorICAgIC8vIEludGVybmFsRGF0YURTTC5nOjg4OTU6MTogcnVsZV9fRGF0YUludGVyY2hhbmdlRXhwb3J0RmlsdGVyX19Hcm91cF9fMSA6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUV4cG9ydEZpbHRlcl9fR3JvdXBfXzFfX0ltcGwgcnVsZV9fRGF0YUludGVyY2hhbmdlRXhwb3J0RmlsdGVyX19Hcm91cF9fMiA7CisgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fRGF0YUludGVyY2hhbmdlRXhwb3J0RmlsdGVyX19Hcm91cF9fMSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisKKyAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgICAgICAJCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo4ODk5OjE6ICggcnVsZV9fRGF0YUludGVyY2hhbmdlRXhwb3J0RmlsdGVyX19Hcm91cF9fMV9fSW1wbCBydWxlX19EYXRhSW50ZXJjaGFuZ2VFeHBvcnRGaWx0ZXJfX0dyb3VwX18yICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjg5MDA6MjogcnVsZV9fRGF0YUludGVyY2hhbmdlRXhwb3J0RmlsdGVyX19Hcm91cF9fMV9fSW1wbCBydWxlX19EYXRhSW50ZXJjaGFuZ2VFeHBvcnRGaWx0ZXJfX0dyb3VwX18yCisgICAgICAgICAgICB7CisgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV180MCk7CisgICAgICAgICAgICBydWxlX19EYXRhSW50ZXJjaGFuZ2VFeHBvcnRGaWx0ZXJfX0dyb3VwX18xX19JbXBsKCk7CisKKyAgICAgICAgICAgIHN0YXRlLl9mc3AtLTsKKyAgICAgICAgICAgIGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CisgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV18yKTsKKyAgICAgICAgICAgIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUV4cG9ydEZpbHRlcl9fR3JvdXBfXzIoKTsKKworICAgICAgICAgICAgc3RhdGUuX2ZzcC0tOworICAgICAgICAgICAgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKKworICAgICAgICAgICAgfQorCisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKFJlY29nbml0aW9uRXhjZXB0aW9uIHJlKSB7CisgICAgICAgICAgICByZXBvcnRFcnJvcihyZSk7CisgICAgICAgICAgICByZWNvdmVyKGlucHV0LHJlKTsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKworICAgICAgICAgICAgCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKKworICAgICAgICB9CisgICAgICAgIHJldHVybiA7CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgInJ1bGVfX0RhdGFJbnRlcmNoYW5nZUV4cG9ydEZpbHRlcl9fR3JvdXBfXzEiCisKKworICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fRGF0YUludGVyY2hhbmdlRXhwb3J0RmlsdGVyX19Hcm91cF9fMV9fSW1wbCIKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo4OTA3OjE6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUV4cG9ydEZpbHRlcl9fR3JvdXBfXzFfX0ltcGwgOiAoICggcnVsZV9fRGF0YUludGVyY2hhbmdlRXhwb3J0RmlsdGVyX19Hcm91cF8xX18wICk/ICkgOworICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUV4cG9ydEZpbHRlcl9fR3JvdXBfXzFfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworCisgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICAgICAgCQorICAgICAgICB0cnkgeworICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6ODkxMToxOiAoICggKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VFeHBvcnRGaWx0ZXJfX0dyb3VwXzFfXzAgKT8gKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo4OTEyOjE6ICggKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VFeHBvcnRGaWx0ZXJfX0dyb3VwXzFfXzAgKT8gKQorICAgICAgICAgICAgeworICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6ODkxMjoxOiAoICggcnVsZV9fRGF0YUludGVyY2hhbmdlRXhwb3J0RmlsdGVyX19Hcm91cF8xX18wICk/ICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjg5MTM6MjogKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VFeHBvcnRGaWx0ZXJfX0dyb3VwXzFfXzAgKT8KKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YUludGVyY2hhbmdlRXhwb3J0RmlsdGVyQWNjZXNzKCkuZ2V0R3JvdXBfMSgpKTsgCisgICAgICAgICAgICB9CisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo4OTE0OjI6ICggcnVsZV9fRGF0YUludGVyY2hhbmdlRXhwb3J0RmlsdGVyX19Hcm91cF8xX18wICk/CisgICAgICAgICAgICBpbnQgYWx0ODk9MjsKKyAgICAgICAgICAgIGludCBMQTg5XzAgPSBpbnB1dC5MQSgxKTsKKworICAgICAgICAgICAgaWYgKCAoTEE4OV8wPT0xMTMpICkgeworICAgICAgICAgICAgICAgIGFsdDg5PTE7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzd2l0Y2ggKGFsdDg5KSB7CisgICAgICAgICAgICAgICAgY2FzZSAxIDoKKyAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6ODkxNDozOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VFeHBvcnRGaWx0ZXJfX0dyb3VwXzFfXzAKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV18yKTsKKyAgICAgICAgICAgICAgICAgICAgcnVsZV9fRGF0YUludGVyY2hhbmdlRXhwb3J0RmlsdGVyX19Hcm91cF8xX18wKCk7CisKKyAgICAgICAgICAgICAgICAgICAgc3RhdGUuX2ZzcC0tOworICAgICAgICAgICAgICAgICAgICBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOworCisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBhZnRlcihncmFtbWFyQWNjZXNzLmdldERhdGFJbnRlcmNoYW5nZUV4cG9ydEZpbHRlckFjY2VzcygpLmdldEdyb3VwXzEoKSk7IAorICAgICAgICAgICAgfQorCisgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgfQorCisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKFJlY29nbml0aW9uRXhjZXB0aW9uIHJlKSB7CisgICAgICAgICAgICByZXBvcnRFcnJvcihyZSk7CisgICAgICAgICAgICByZWNvdmVyKGlucHV0LHJlKTsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKworICAgICAgICAgICAgCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKKworICAgICAgICB9CisgICAgICAgIHJldHVybiA7CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgInJ1bGVfX0RhdGFJbnRlcmNoYW5nZUV4cG9ydEZpbHRlcl9fR3JvdXBfXzFfX0ltcGwiCisKKworICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fRGF0YUludGVyY2hhbmdlRXhwb3J0RmlsdGVyX19Hcm91cF9fMiIKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo4OTIyOjE6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUV4cG9ydEZpbHRlcl9fR3JvdXBfXzIgOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VFeHBvcnRGaWx0ZXJfX0dyb3VwX18yX19JbXBsIDsKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19EYXRhSW50ZXJjaGFuZ2VFeHBvcnRGaWx0ZXJfX0dyb3VwX18yKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKworICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgICAgIAkKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjg5MjY6MTogKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VFeHBvcnRGaWx0ZXJfX0dyb3VwX18yX19JbXBsICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjg5Mjc6MjogcnVsZV9fRGF0YUludGVyY2hhbmdlRXhwb3J0RmlsdGVyX19Hcm91cF9fMl9fSW1wbAorICAgICAgICAgICAgeworICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMik7CisgICAgICAgICAgICBydWxlX19EYXRhSW50ZXJjaGFuZ2VFeHBvcnRGaWx0ZXJfX0dyb3VwX18yX19JbXBsKCk7CisKKyAgICAgICAgICAgIHN0YXRlLl9mc3AtLTsKKyAgICAgICAgICAgIGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CisKKyAgICAgICAgICAgIH0KKworICAgICAgICB9CisgICAgICAgIGNhdGNoIChSZWNvZ25pdGlvbkV4Y2VwdGlvbiByZSkgeworICAgICAgICAgICAgcmVwb3J0RXJyb3IocmUpOworICAgICAgICAgICAgcmVjb3ZlcihpbnB1dCxyZSk7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisKKyAgICAgICAgICAgIAlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7CisKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gOworICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJydWxlX19EYXRhSW50ZXJjaGFuZ2VFeHBvcnRGaWx0ZXJfX0dyb3VwX18yIgorCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX0RhdGFJbnRlcmNoYW5nZUV4cG9ydEZpbHRlcl9fR3JvdXBfXzJfX0ltcGwiCisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6ODkzMzoxOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VFeHBvcnRGaWx0ZXJfX0dyb3VwX18yX19JbXBsIDogKCAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUV4cG9ydEZpbHRlcl9fR3JvdXBfMl9fMCApPyApIDsKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19EYXRhSW50ZXJjaGFuZ2VFeHBvcnRGaWx0ZXJfX0dyb3VwX18yX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKworICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgICAgIAkKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjg5Mzc6MTogKCAoICggcnVsZV9fRGF0YUludGVyY2hhbmdlRXhwb3J0RmlsdGVyX19Hcm91cF8yX18wICk/ICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6ODkzODoxOiAoICggcnVsZV9fRGF0YUludGVyY2hhbmdlRXhwb3J0RmlsdGVyX19Hcm91cF8yX18wICk/ICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjg5Mzg6MTogKCAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUV4cG9ydEZpbHRlcl9fR3JvdXBfMl9fMCApPyApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo4OTM5OjI6ICggcnVsZV9fRGF0YUludGVyY2hhbmdlRXhwb3J0RmlsdGVyX19Hcm91cF8yX18wICk/CisgICAgICAgICAgICB7CisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldERhdGFJbnRlcmNoYW5nZUV4cG9ydEZpbHRlckFjY2VzcygpLmdldEdyb3VwXzIoKSk7IAorICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6ODk0MDoyOiAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUV4cG9ydEZpbHRlcl9fR3JvdXBfMl9fMCApPworICAgICAgICAgICAgaW50IGFsdDkwPTI7CisgICAgICAgICAgICBpbnQgTEE5MF8wID0gaW5wdXQuTEEoMSk7CisKKyAgICAgICAgICAgIGlmICggKExBOTBfMD09MTE0KSApIHsKKyAgICAgICAgICAgICAgICBhbHQ5MD0xOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc3dpdGNoIChhbHQ5MCkgeworICAgICAgICAgICAgICAgIGNhc2UgMSA6CisgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjg5NDA6MzogcnVsZV9fRGF0YUludGVyY2hhbmdlRXhwb3J0RmlsdGVyX19Hcm91cF8yX18wCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMik7CisgICAgICAgICAgICAgICAgICAgIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUV4cG9ydEZpbHRlcl9fR3JvdXBfMl9fMCgpOworCisgICAgICAgICAgICAgICAgICAgIHN0YXRlLl9mc3AtLTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKKworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXREYXRhSW50ZXJjaGFuZ2VFeHBvcnRGaWx0ZXJBY2Nlc3MoKS5nZXRHcm91cF8yKCkpOyAKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgIH0KKworICAgICAgICB9CisgICAgICAgIGNhdGNoIChSZWNvZ25pdGlvbkV4Y2VwdGlvbiByZSkgeworICAgICAgICAgICAgcmVwb3J0RXJyb3IocmUpOworICAgICAgICAgICAgcmVjb3ZlcihpbnB1dCxyZSk7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisKKyAgICAgICAgICAgIAlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7CisKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gOworICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJydWxlX19EYXRhSW50ZXJjaGFuZ2VFeHBvcnRGaWx0ZXJfX0dyb3VwX18yX19JbXBsIgorCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX0RhdGFJbnRlcmNoYW5nZUV4cG9ydEZpbHRlcl9fR3JvdXBfMV9fMCIKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo4OTQ5OjE6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUV4cG9ydEZpbHRlcl9fR3JvdXBfMV9fMCA6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUV4cG9ydEZpbHRlcl9fR3JvdXBfMV9fMF9fSW1wbCBydWxlX19EYXRhSW50ZXJjaGFuZ2VFeHBvcnRGaWx0ZXJfX0dyb3VwXzFfXzEgOworICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUV4cG9ydEZpbHRlcl9fR3JvdXBfMV9fMCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisKKyAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgICAgICAJCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo4OTUzOjE6ICggcnVsZV9fRGF0YUludGVyY2hhbmdlRXhwb3J0RmlsdGVyX19Hcm91cF8xX18wX19JbXBsIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUV4cG9ydEZpbHRlcl9fR3JvdXBfMV9fMSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo4OTU0OjI6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUV4cG9ydEZpbHRlcl9fR3JvdXBfMV9fMF9fSW1wbCBydWxlX19EYXRhSW50ZXJjaGFuZ2VFeHBvcnRGaWx0ZXJfX0dyb3VwXzFfXzEKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzEwKTsKKyAgICAgICAgICAgIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUV4cG9ydEZpbHRlcl9fR3JvdXBfMV9fMF9fSW1wbCgpOworCisgICAgICAgICAgICBzdGF0ZS5fZnNwLS07CisgICAgICAgICAgICBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOworICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMik7CisgICAgICAgICAgICBydWxlX19EYXRhSW50ZXJjaGFuZ2VFeHBvcnRGaWx0ZXJfX0dyb3VwXzFfXzEoKTsKKworICAgICAgICAgICAgc3RhdGUuX2ZzcC0tOworICAgICAgICAgICAgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKKworICAgICAgICAgICAgfQorCisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKFJlY29nbml0aW9uRXhjZXB0aW9uIHJlKSB7CisgICAgICAgICAgICByZXBvcnRFcnJvcihyZSk7CisgICAgICAgICAgICByZWNvdmVyKGlucHV0LHJlKTsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKworICAgICAgICAgICAgCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKKworICAgICAgICB9CisgICAgICAgIHJldHVybiA7CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgInJ1bGVfX0RhdGFJbnRlcmNoYW5nZUV4cG9ydEZpbHRlcl9fR3JvdXBfMV9fMCIKKworCisgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19EYXRhSW50ZXJjaGFuZ2VFeHBvcnRGaWx0ZXJfX0dyb3VwXzFfXzBfX0ltcGwiCisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6ODk2MToxOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VFeHBvcnRGaWx0ZXJfX0dyb3VwXzFfXzBfX0ltcGwgOiAoICd3aGVyZScgKSA7CisgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fRGF0YUludGVyY2hhbmdlRXhwb3J0RmlsdGVyX19Hcm91cF8xX18wX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKworICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgICAgIAkKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjg5NjU6MTogKCAoICd3aGVyZScgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo4OTY2OjE6ICggJ3doZXJlJyApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo4OTY2OjE6ICggJ3doZXJlJyApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo4OTY3OjI6ICd3aGVyZScKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YUludGVyY2hhbmdlRXhwb3J0RmlsdGVyQWNjZXNzKCkuZ2V0V2hlcmVLZXl3b3JkXzFfMCgpKTsgCisgICAgICAgICAgICB9CisgICAgICAgICAgICBtYXRjaChpbnB1dCwxMTMsRk9MTE9XXzIpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBhZnRlcihncmFtbWFyQWNjZXNzLmdldERhdGFJbnRlcmNoYW5nZUV4cG9ydEZpbHRlckFjY2VzcygpLmdldFdoZXJlS2V5d29yZF8xXzAoKSk7IAorICAgICAgICAgICAgfQorCisgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgfQorCisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKFJlY29nbml0aW9uRXhjZXB0aW9uIHJlKSB7CisgICAgICAgICAgICByZXBvcnRFcnJvcihyZSk7CisgICAgICAgICAgICByZWNvdmVyKGlucHV0LHJlKTsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKworICAgICAgICAgICAgCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKKworICAgICAgICB9CisgICAgICAgIHJldHVybiA7CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgInJ1bGVfX0RhdGFJbnRlcmNoYW5nZUV4cG9ydEZpbHRlcl9fR3JvdXBfMV9fMF9fSW1wbCIKKworCisgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19EYXRhSW50ZXJjaGFuZ2VFeHBvcnRGaWx0ZXJfX0dyb3VwXzFfXzEiCisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6ODk3NjoxOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VFeHBvcnRGaWx0ZXJfX0dyb3VwXzFfXzEgOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VFeHBvcnRGaWx0ZXJfX0dyb3VwXzFfXzFfX0ltcGwgcnVsZV9fRGF0YUludGVyY2hhbmdlRXhwb3J0RmlsdGVyX19Hcm91cF8xX18yIDsKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19EYXRhSW50ZXJjaGFuZ2VFeHBvcnRGaWx0ZXJfX0dyb3VwXzFfXzEoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworCisgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICAgICAgCQorICAgICAgICB0cnkgeworICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6ODk4MDoxOiAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUV4cG9ydEZpbHRlcl9fR3JvdXBfMV9fMV9fSW1wbCBydWxlX19EYXRhSW50ZXJjaGFuZ2VFeHBvcnRGaWx0ZXJfX0dyb3VwXzFfXzIgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6ODk4MToyOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VFeHBvcnRGaWx0ZXJfX0dyb3VwXzFfXzFfX0ltcGwgcnVsZV9fRGF0YUludGVyY2hhbmdlRXhwb3J0RmlsdGVyX19Hcm91cF8xX18yCisgICAgICAgICAgICB7CisgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV183KTsKKyAgICAgICAgICAgIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUV4cG9ydEZpbHRlcl9fR3JvdXBfMV9fMV9fSW1wbCgpOworCisgICAgICAgICAgICBzdGF0ZS5fZnNwLS07CisgICAgICAgICAgICBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOworICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMik7CisgICAgICAgICAgICBydWxlX19EYXRhSW50ZXJjaGFuZ2VFeHBvcnRGaWx0ZXJfX0dyb3VwXzFfXzIoKTsKKworICAgICAgICAgICAgc3RhdGUuX2ZzcC0tOworICAgICAgICAgICAgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKKworICAgICAgICAgICAgfQorCisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKFJlY29nbml0aW9uRXhjZXB0aW9uIHJlKSB7CisgICAgICAgICAgICByZXBvcnRFcnJvcihyZSk7CisgICAgICAgICAgICByZWNvdmVyKGlucHV0LHJlKTsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKworICAgICAgICAgICAgCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKKworICAgICAgICB9CisgICAgICAgIHJldHVybiA7CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgInJ1bGVfX0RhdGFJbnRlcmNoYW5nZUV4cG9ydEZpbHRlcl9fR3JvdXBfMV9fMSIKKworCisgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19EYXRhSW50ZXJjaGFuZ2VFeHBvcnRGaWx0ZXJfX0dyb3VwXzFfXzFfX0ltcGwiCisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6ODk4ODoxOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VFeHBvcnRGaWx0ZXJfX0dyb3VwXzFfXzFfX0ltcGwgOiAoICd7JyApIDsKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19EYXRhSW50ZXJjaGFuZ2VFeHBvcnRGaWx0ZXJfX0dyb3VwXzFfXzFfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworCisgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICAgICAgCQorICAgICAgICB0cnkgeworICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6ODk5MjoxOiAoICggJ3snICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6ODk5MzoxOiAoICd7JyApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo4OTkzOjE6ICggJ3snICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjg5OTQ6MjogJ3snCisgICAgICAgICAgICB7CisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldERhdGFJbnRlcmNoYW5nZUV4cG9ydEZpbHRlckFjY2VzcygpLmdldExlZnRDdXJseUJyYWNrZXRLZXl3b3JkXzFfMSgpKTsgCisgICAgICAgICAgICB9CisgICAgICAgICAgICBtYXRjaChpbnB1dCw3NSxGT0xMT1dfMik7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YUludGVyY2hhbmdlRXhwb3J0RmlsdGVyQWNjZXNzKCkuZ2V0TGVmdEN1cmx5QnJhY2tldEtleXdvcmRfMV8xKCkpOyAKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgIH0KKworICAgICAgICB9CisgICAgICAgIGNhdGNoIChSZWNvZ25pdGlvbkV4Y2VwdGlvbiByZSkgeworICAgICAgICAgICAgcmVwb3J0RXJyb3IocmUpOworICAgICAgICAgICAgcmVjb3ZlcihpbnB1dCxyZSk7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisKKyAgICAgICAgICAgIAlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7CisKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gOworICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJydWxlX19EYXRhSW50ZXJjaGFuZ2VFeHBvcnRGaWx0ZXJfX0dyb3VwXzFfXzFfX0ltcGwiCisKKworICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fRGF0YUludGVyY2hhbmdlRXhwb3J0RmlsdGVyX19Hcm91cF8xX18yIgorICAgIC8vIEludGVybmFsRGF0YURTTC5nOjkwMDM6MTogcnVsZV9fRGF0YUludGVyY2hhbmdlRXhwb3J0RmlsdGVyX19Hcm91cF8xX18yIDogcnVsZV9fRGF0YUludGVyY2hhbmdlRXhwb3J0RmlsdGVyX19Hcm91cF8xX18yX19JbXBsIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUV4cG9ydEZpbHRlcl9fR3JvdXBfMV9fMyA7CisgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fRGF0YUludGVyY2hhbmdlRXhwb3J0RmlsdGVyX19Hcm91cF8xX18yKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKworICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgICAgIAkKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjkwMDc6MTogKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VFeHBvcnRGaWx0ZXJfX0dyb3VwXzFfXzJfX0ltcGwgcnVsZV9fRGF0YUludGVyY2hhbmdlRXhwb3J0RmlsdGVyX19Hcm91cF8xX18zICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjkwMDg6MjogcnVsZV9fRGF0YUludGVyY2hhbmdlRXhwb3J0RmlsdGVyX19Hcm91cF8xX18yX19JbXBsIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUV4cG9ydEZpbHRlcl9fR3JvdXBfMV9fMworICAgICAgICAgICAgeworICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfNDEpOworICAgICAgICAgICAgcnVsZV9fRGF0YUludGVyY2hhbmdlRXhwb3J0RmlsdGVyX19Hcm91cF8xX18yX19JbXBsKCk7CisKKyAgICAgICAgICAgIHN0YXRlLl9mc3AtLTsKKyAgICAgICAgICAgIGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CisgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV18yKTsKKyAgICAgICAgICAgIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUV4cG9ydEZpbHRlcl9fR3JvdXBfMV9fMygpOworCisgICAgICAgICAgICBzdGF0ZS5fZnNwLS07CisgICAgICAgICAgICBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOworCisgICAgICAgICAgICB9CisKKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoUmVjb2duaXRpb25FeGNlcHRpb24gcmUpIHsKKyAgICAgICAgICAgIHJlcG9ydEVycm9yKHJlKTsKKyAgICAgICAgICAgIHJlY292ZXIoaW5wdXQscmUpOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworCisgICAgICAgICAgICAJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworCisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIDsKKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAicnVsZV9fRGF0YUludGVyY2hhbmdlRXhwb3J0RmlsdGVyX19Hcm91cF8xX18yIgorCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX0RhdGFJbnRlcmNoYW5nZUV4cG9ydEZpbHRlcl9fR3JvdXBfMV9fMl9fSW1wbCIKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo5MDE1OjE6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUV4cG9ydEZpbHRlcl9fR3JvdXBfMV9fMl9fSW1wbCA6ICggKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VFeHBvcnRGaWx0ZXJfX0NvbmRpdGlvbkFzc2lnbm1lbnRfMV8yICkgKSA7CisgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fRGF0YUludGVyY2hhbmdlRXhwb3J0RmlsdGVyX19Hcm91cF8xX18yX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKworICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgICAgIAkKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjkwMTk6MTogKCAoICggcnVsZV9fRGF0YUludGVyY2hhbmdlRXhwb3J0RmlsdGVyX19Db25kaXRpb25Bc3NpZ25tZW50XzFfMiApICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6OTAyMDoxOiAoICggcnVsZV9fRGF0YUludGVyY2hhbmdlRXhwb3J0RmlsdGVyX19Db25kaXRpb25Bc3NpZ25tZW50XzFfMiApICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjkwMjA6MTogKCAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUV4cG9ydEZpbHRlcl9fQ29uZGl0aW9uQXNzaWdubWVudF8xXzIgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo5MDIxOjI6ICggcnVsZV9fRGF0YUludGVyY2hhbmdlRXhwb3J0RmlsdGVyX19Db25kaXRpb25Bc3NpZ25tZW50XzFfMiApCisgICAgICAgICAgICB7CisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldERhdGFJbnRlcmNoYW5nZUV4cG9ydEZpbHRlckFjY2VzcygpLmdldENvbmRpdGlvbkFzc2lnbm1lbnRfMV8yKCkpOyAKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjkwMjI6MjogKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VFeHBvcnRGaWx0ZXJfX0NvbmRpdGlvbkFzc2lnbm1lbnRfMV8yICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjkwMjI6MzogcnVsZV9fRGF0YUludGVyY2hhbmdlRXhwb3J0RmlsdGVyX19Db25kaXRpb25Bc3NpZ25tZW50XzFfMgorICAgICAgICAgICAgeworICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMik7CisgICAgICAgICAgICBydWxlX19EYXRhSW50ZXJjaGFuZ2VFeHBvcnRGaWx0ZXJfX0NvbmRpdGlvbkFzc2lnbm1lbnRfMV8yKCk7CisKKyAgICAgICAgICAgIHN0YXRlLl9mc3AtLTsKKyAgICAgICAgICAgIGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBhZnRlcihncmFtbWFyQWNjZXNzLmdldERhdGFJbnRlcmNoYW5nZUV4cG9ydEZpbHRlckFjY2VzcygpLmdldENvbmRpdGlvbkFzc2lnbm1lbnRfMV8yKCkpOyAKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgIH0KKworICAgICAgICB9CisgICAgICAgIGNhdGNoIChSZWNvZ25pdGlvbkV4Y2VwdGlvbiByZSkgeworICAgICAgICAgICAgcmVwb3J0RXJyb3IocmUpOworICAgICAgICAgICAgcmVjb3ZlcihpbnB1dCxyZSk7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisKKyAgICAgICAgICAgIAlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7CisKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gOworICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJydWxlX19EYXRhSW50ZXJjaGFuZ2VFeHBvcnRGaWx0ZXJfX0dyb3VwXzFfXzJfX0ltcGwiCisKKworICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fRGF0YUludGVyY2hhbmdlRXhwb3J0RmlsdGVyX19Hcm91cF8xX18zIgorICAgIC8vIEludGVybmFsRGF0YURTTC5nOjkwMzA6MTogcnVsZV9fRGF0YUludGVyY2hhbmdlRXhwb3J0RmlsdGVyX19Hcm91cF8xX18zIDogcnVsZV9fRGF0YUludGVyY2hhbmdlRXhwb3J0RmlsdGVyX19Hcm91cF8xX18zX19JbXBsIDsKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19EYXRhSW50ZXJjaGFuZ2VFeHBvcnRGaWx0ZXJfX0dyb3VwXzFfXzMoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworCisgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICAgICAgCQorICAgICAgICB0cnkgeworICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6OTAzNDoxOiAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUV4cG9ydEZpbHRlcl9fR3JvdXBfMV9fM19fSW1wbCApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo5MDM1OjI6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUV4cG9ydEZpbHRlcl9fR3JvdXBfMV9fM19fSW1wbAorICAgICAgICAgICAgeworICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMik7CisgICAgICAgICAgICBydWxlX19EYXRhSW50ZXJjaGFuZ2VFeHBvcnRGaWx0ZXJfX0dyb3VwXzFfXzNfX0ltcGwoKTsKKworICAgICAgICAgICAgc3RhdGUuX2ZzcC0tOworICAgICAgICAgICAgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKKworICAgICAgICAgICAgfQorCisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKFJlY29nbml0aW9uRXhjZXB0aW9uIHJlKSB7CisgICAgICAgICAgICByZXBvcnRFcnJvcihyZSk7CisgICAgICAgICAgICByZWNvdmVyKGlucHV0LHJlKTsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKworICAgICAgICAgICAgCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKKworICAgICAgICB9CisgICAgICAgIHJldHVybiA7CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgInJ1bGVfX0RhdGFJbnRlcmNoYW5nZUV4cG9ydEZpbHRlcl9fR3JvdXBfMV9fMyIKKworCisgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19EYXRhSW50ZXJjaGFuZ2VFeHBvcnRGaWx0ZXJfX0dyb3VwXzFfXzNfX0ltcGwiCisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6OTA0MToxOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VFeHBvcnRGaWx0ZXJfX0dyb3VwXzFfXzNfX0ltcGwgOiAoICd9JyApIDsKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19EYXRhSW50ZXJjaGFuZ2VFeHBvcnRGaWx0ZXJfX0dyb3VwXzFfXzNfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworCisgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICAgICAgCQorICAgICAgICB0cnkgeworICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6OTA0NToxOiAoICggJ30nICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6OTA0NjoxOiAoICd9JyApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo5MDQ2OjE6ICggJ30nICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjkwNDc6MjogJ30nCisgICAgICAgICAgICB7CisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldERhdGFJbnRlcmNoYW5nZUV4cG9ydEZpbHRlckFjY2VzcygpLmdldFJpZ2h0Q3VybHlCcmFja2V0S2V5d29yZF8xXzMoKSk7IAorICAgICAgICAgICAgfQorICAgICAgICAgICAgbWF0Y2goaW5wdXQsNzYsRk9MTE9XXzIpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBhZnRlcihncmFtbWFyQWNjZXNzLmdldERhdGFJbnRlcmNoYW5nZUV4cG9ydEZpbHRlckFjY2VzcygpLmdldFJpZ2h0Q3VybHlCcmFja2V0S2V5d29yZF8xXzMoKSk7IAorICAgICAgICAgICAgfQorCisgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgfQorCisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKFJlY29nbml0aW9uRXhjZXB0aW9uIHJlKSB7CisgICAgICAgICAgICByZXBvcnRFcnJvcihyZSk7CisgICAgICAgICAgICByZWNvdmVyKGlucHV0LHJlKTsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKworICAgICAgICAgICAgCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKKworICAgICAgICB9CisgICAgICAgIHJldHVybiA7CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgInJ1bGVfX0RhdGFJbnRlcmNoYW5nZUV4cG9ydEZpbHRlcl9fR3JvdXBfMV9fM19fSW1wbCIKKworCisgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19EYXRhSW50ZXJjaGFuZ2VFeHBvcnRGaWx0ZXJfX0dyb3VwXzJfXzAiCisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6OTA1NzoxOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VFeHBvcnRGaWx0ZXJfX0dyb3VwXzJfXzAgOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VFeHBvcnRGaWx0ZXJfX0dyb3VwXzJfXzBfX0ltcGwgcnVsZV9fRGF0YUludGVyY2hhbmdlRXhwb3J0RmlsdGVyX19Hcm91cF8yX18xIDsKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19EYXRhSW50ZXJjaGFuZ2VFeHBvcnRGaWx0ZXJfX0dyb3VwXzJfXzAoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworCisgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICAgICAgCQorICAgICAgICB0cnkgeworICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6OTA2MToxOiAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUV4cG9ydEZpbHRlcl9fR3JvdXBfMl9fMF9fSW1wbCBydWxlX19EYXRhSW50ZXJjaGFuZ2VFeHBvcnRGaWx0ZXJfX0dyb3VwXzJfXzEgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6OTA2MjoyOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VFeHBvcnRGaWx0ZXJfX0dyb3VwXzJfXzBfX0ltcGwgcnVsZV9fRGF0YUludGVyY2hhbmdlRXhwb3J0RmlsdGVyX19Hcm91cF8yX18xCisgICAgICAgICAgICB7CisgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV183KTsKKyAgICAgICAgICAgIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUV4cG9ydEZpbHRlcl9fR3JvdXBfMl9fMF9fSW1wbCgpOworCisgICAgICAgICAgICBzdGF0ZS5fZnNwLS07CisgICAgICAgICAgICBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOworICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMik7CisgICAgICAgICAgICBydWxlX19EYXRhSW50ZXJjaGFuZ2VFeHBvcnRGaWx0ZXJfX0dyb3VwXzJfXzEoKTsKKworICAgICAgICAgICAgc3RhdGUuX2ZzcC0tOworICAgICAgICAgICAgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKKworICAgICAgICAgICAgfQorCisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKFJlY29nbml0aW9uRXhjZXB0aW9uIHJlKSB7CisgICAgICAgICAgICByZXBvcnRFcnJvcihyZSk7CisgICAgICAgICAgICByZWNvdmVyKGlucHV0LHJlKTsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKworICAgICAgICAgICAgCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKKworICAgICAgICB9CisgICAgICAgIHJldHVybiA7CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgInJ1bGVfX0RhdGFJbnRlcmNoYW5nZUV4cG9ydEZpbHRlcl9fR3JvdXBfMl9fMCIKKworCisgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19EYXRhSW50ZXJjaGFuZ2VFeHBvcnRGaWx0ZXJfX0dyb3VwXzJfXzBfX0ltcGwiCisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6OTA2OToxOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VFeHBvcnRGaWx0ZXJfX0dyb3VwXzJfXzBfX0ltcGwgOiAoICdoaWRlJyApIDsKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19EYXRhSW50ZXJjaGFuZ2VFeHBvcnRGaWx0ZXJfX0dyb3VwXzJfXzBfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworCisgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICAgICAgCQorICAgICAgICB0cnkgeworICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6OTA3MzoxOiAoICggJ2hpZGUnICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6OTA3NDoxOiAoICdoaWRlJyApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo5MDc0OjE6ICggJ2hpZGUnICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjkwNzU6MjogJ2hpZGUnCisgICAgICAgICAgICB7CisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldERhdGFJbnRlcmNoYW5nZUV4cG9ydEZpbHRlckFjY2VzcygpLmdldEhpZGVLZXl3b3JkXzJfMCgpKTsgCisgICAgICAgICAgICB9CisgICAgICAgICAgICBtYXRjaChpbnB1dCwxMTQsRk9MTE9XXzIpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBhZnRlcihncmFtbWFyQWNjZXNzLmdldERhdGFJbnRlcmNoYW5nZUV4cG9ydEZpbHRlckFjY2VzcygpLmdldEhpZGVLZXl3b3JkXzJfMCgpKTsgCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICB9CisKKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoUmVjb2duaXRpb25FeGNlcHRpb24gcmUpIHsKKyAgICAgICAgICAgIHJlcG9ydEVycm9yKHJlKTsKKyAgICAgICAgICAgIHJlY292ZXIoaW5wdXQscmUpOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworCisgICAgICAgICAgICAJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworCisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIDsKKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAicnVsZV9fRGF0YUludGVyY2hhbmdlRXhwb3J0RmlsdGVyX19Hcm91cF8yX18wX19JbXBsIgorCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX0RhdGFJbnRlcmNoYW5nZUV4cG9ydEZpbHRlcl9fR3JvdXBfMl9fMSIKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo5MDg0OjE6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUV4cG9ydEZpbHRlcl9fR3JvdXBfMl9fMSA6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUV4cG9ydEZpbHRlcl9fR3JvdXBfMl9fMV9fSW1wbCA7CisgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fRGF0YUludGVyY2hhbmdlRXhwb3J0RmlsdGVyX19Hcm91cF8yX18xKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKworICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgICAgIAkKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjkwODg6MTogKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VFeHBvcnRGaWx0ZXJfX0dyb3VwXzJfXzFfX0ltcGwgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6OTA4OToyOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VFeHBvcnRGaWx0ZXJfX0dyb3VwXzJfXzFfX0ltcGwKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzIpOworICAgICAgICAgICAgcnVsZV9fRGF0YUludGVyY2hhbmdlRXhwb3J0RmlsdGVyX19Hcm91cF8yX18xX19JbXBsKCk7CisKKyAgICAgICAgICAgIHN0YXRlLl9mc3AtLTsKKyAgICAgICAgICAgIGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CisKKyAgICAgICAgICAgIH0KKworICAgICAgICB9CisgICAgICAgIGNhdGNoIChSZWNvZ25pdGlvbkV4Y2VwdGlvbiByZSkgeworICAgICAgICAgICAgcmVwb3J0RXJyb3IocmUpOworICAgICAgICAgICAgcmVjb3ZlcihpbnB1dCxyZSk7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisKKyAgICAgICAgICAgIAlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7CisKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gOworICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJydWxlX19EYXRhSW50ZXJjaGFuZ2VFeHBvcnRGaWx0ZXJfX0dyb3VwXzJfXzEiCisKKworICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fRGF0YUludGVyY2hhbmdlRXhwb3J0RmlsdGVyX19Hcm91cF8yX18xX19JbXBsIgorICAgIC8vIEludGVybmFsRGF0YURTTC5nOjkwOTU6MTogcnVsZV9fRGF0YUludGVyY2hhbmdlRXhwb3J0RmlsdGVyX19Hcm91cF8yX18xX19JbXBsIDogKCAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUV4cG9ydEZpbHRlcl9fSGlkZGVucHJvcGVydGllc0Fzc2lnbm1lbnRfMl8xICkqICkgOworICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUV4cG9ydEZpbHRlcl9fR3JvdXBfMl9fMV9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisKKyAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgICAgICAJCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo5MDk5OjE6ICggKCAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUV4cG9ydEZpbHRlcl9fSGlkZGVucHJvcGVydGllc0Fzc2lnbm1lbnRfMl8xICkqICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6OTEwMDoxOiAoICggcnVsZV9fRGF0YUludGVyY2hhbmdlRXhwb3J0RmlsdGVyX19IaWRkZW5wcm9wZXJ0aWVzQXNzaWdubWVudF8yXzEgKSogKQorICAgICAgICAgICAgeworICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6OTEwMDoxOiAoICggcnVsZV9fRGF0YUludGVyY2hhbmdlRXhwb3J0RmlsdGVyX19IaWRkZW5wcm9wZXJ0aWVzQXNzaWdubWVudF8yXzEgKSogKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6OTEwMToyOiAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUV4cG9ydEZpbHRlcl9fSGlkZGVucHJvcGVydGllc0Fzc2lnbm1lbnRfMl8xICkqCisgICAgICAgICAgICB7CisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldERhdGFJbnRlcmNoYW5nZUV4cG9ydEZpbHRlckFjY2VzcygpLmdldEhpZGRlbnByb3BlcnRpZXNBc3NpZ25tZW50XzJfMSgpKTsgCisgICAgICAgICAgICB9CisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo5MTAyOjI6ICggcnVsZV9fRGF0YUludGVyY2hhbmdlRXhwb3J0RmlsdGVyX19IaWRkZW5wcm9wZXJ0aWVzQXNzaWdubWVudF8yXzEgKSoKKyAgICAgICAgICAgIGxvb3A5MToKKyAgICAgICAgICAgIGRvIHsKKyAgICAgICAgICAgICAgICBpbnQgYWx0OTE9MjsKKyAgICAgICAgICAgICAgICBpbnQgTEE5MV8wID0gaW5wdXQuTEEoMSk7CisKKyAgICAgICAgICAgICAgICBpZiAoIChMQTkxXzA9PVJVTEVfSUQpICkgeworICAgICAgICAgICAgICAgICAgICBhbHQ5MT0xOworICAgICAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICAgICAgc3dpdGNoIChhbHQ5MSkgeworICAgICAgICAgICAgCWNhc2UgMSA6CisgICAgICAgICAgICAJICAgIC8vIEludGVybmFsRGF0YURTTC5nOjkxMDI6MzogcnVsZV9fRGF0YUludGVyY2hhbmdlRXhwb3J0RmlsdGVyX19IaWRkZW5wcm9wZXJ0aWVzQXNzaWdubWVudF8yXzEKKyAgICAgICAgICAgIAkgICAgeworICAgICAgICAgICAgCSAgICBwdXNoRm9sbG93KEZPTExPV180KTsKKyAgICAgICAgICAgIAkgICAgcnVsZV9fRGF0YUludGVyY2hhbmdlRXhwb3J0RmlsdGVyX19IaWRkZW5wcm9wZXJ0aWVzQXNzaWdubWVudF8yXzEoKTsKKworICAgICAgICAgICAgCSAgICBzdGF0ZS5fZnNwLS07CisgICAgICAgICAgICAJICAgIGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CisKKyAgICAgICAgICAgIAkgICAgfQorICAgICAgICAgICAgCSAgICBicmVhazsKKworICAgICAgICAgICAgCWRlZmF1bHQgOgorICAgICAgICAgICAgCSAgICBicmVhayBsb29wOTE7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSB3aGlsZSAodHJ1ZSk7CisKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXREYXRhSW50ZXJjaGFuZ2VFeHBvcnRGaWx0ZXJBY2Nlc3MoKS5nZXRIaWRkZW5wcm9wZXJ0aWVzQXNzaWdubWVudF8yXzEoKSk7IAorICAgICAgICAgICAgfQorCisgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgfQorCisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKFJlY29nbml0aW9uRXhjZXB0aW9uIHJlKSB7CisgICAgICAgICAgICByZXBvcnRFcnJvcihyZSk7CisgICAgICAgICAgICByZWNvdmVyKGlucHV0LHJlKTsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKworICAgICAgICAgICAgCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKKworICAgICAgICB9CisgICAgICAgIHJldHVybiA7CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgInJ1bGVfX0RhdGFJbnRlcmNoYW5nZUV4cG9ydEZpbHRlcl9fR3JvdXBfMl9fMV9fSW1wbCIKKworCisgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19EYXRhSW50ZXJjaGFuZ2VGaWx0ZXJDb25kaXRpb25fX0dyb3VwX18wIgorICAgIC8vIEludGVybmFsRGF0YURTTC5nOjkxMTE6MTogcnVsZV9fRGF0YUludGVyY2hhbmdlRmlsdGVyQ29uZGl0aW9uX19Hcm91cF9fMCA6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbHRlckNvbmRpdGlvbl9fR3JvdXBfXzBfX0ltcGwgcnVsZV9fRGF0YUludGVyY2hhbmdlRmlsdGVyQ29uZGl0aW9uX19Hcm91cF9fMSA7CisgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fRGF0YUludGVyY2hhbmdlRmlsdGVyQ29uZGl0aW9uX19Hcm91cF9fMCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisKKyAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgICAgICAJCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo5MTE1OjE6ICggcnVsZV9fRGF0YUludGVyY2hhbmdlRmlsdGVyQ29uZGl0aW9uX19Hcm91cF9fMF9fSW1wbCBydWxlX19EYXRhSW50ZXJjaGFuZ2VGaWx0ZXJDb25kaXRpb25fX0dyb3VwX18xICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjkxMTY6MjogcnVsZV9fRGF0YUludGVyY2hhbmdlRmlsdGVyQ29uZGl0aW9uX19Hcm91cF9fMF9fSW1wbCBydWxlX19EYXRhSW50ZXJjaGFuZ2VGaWx0ZXJDb25kaXRpb25fX0dyb3VwX18xCisgICAgICAgICAgICB7CisgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV181OCk7CisgICAgICAgICAgICBydWxlX19EYXRhSW50ZXJjaGFuZ2VGaWx0ZXJDb25kaXRpb25fX0dyb3VwX18wX19JbXBsKCk7CisKKyAgICAgICAgICAgIHN0YXRlLl9mc3AtLTsKKyAgICAgICAgICAgIGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CisgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV18yKTsKKyAgICAgICAgICAgIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbHRlckNvbmRpdGlvbl9fR3JvdXBfXzEoKTsKKworICAgICAgICAgICAgc3RhdGUuX2ZzcC0tOworICAgICAgICAgICAgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKKworICAgICAgICAgICAgfQorCisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKFJlY29nbml0aW9uRXhjZXB0aW9uIHJlKSB7CisgICAgICAgICAgICByZXBvcnRFcnJvcihyZSk7CisgICAgICAgICAgICByZWNvdmVyKGlucHV0LHJlKTsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKworICAgICAgICAgICAgCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKKworICAgICAgICB9CisgICAgICAgIHJldHVybiA7CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgInJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbHRlckNvbmRpdGlvbl9fR3JvdXBfXzAiCisKKworICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fRGF0YUludGVyY2hhbmdlRmlsdGVyQ29uZGl0aW9uX19Hcm91cF9fMF9fSW1wbCIKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo5MTIzOjE6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbHRlckNvbmRpdGlvbl9fR3JvdXBfXzBfX0ltcGwgOiAoICggcnVsZV9fRGF0YUludGVyY2hhbmdlRmlsdGVyQ29uZGl0aW9uX19SZWZQcm9wZXJ0eUFzc2lnbm1lbnRfMCApICkgOworICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbHRlckNvbmRpdGlvbl9fR3JvdXBfXzBfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworCisgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICAgICAgCQorICAgICAgICB0cnkgeworICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6OTEyNzoxOiAoICggKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VGaWx0ZXJDb25kaXRpb25fX1JlZlByb3BlcnR5QXNzaWdubWVudF8wICkgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo5MTI4OjE6ICggKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VGaWx0ZXJDb25kaXRpb25fX1JlZlByb3BlcnR5QXNzaWdubWVudF8wICkgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6OTEyODoxOiAoICggcnVsZV9fRGF0YUludGVyY2hhbmdlRmlsdGVyQ29uZGl0aW9uX19SZWZQcm9wZXJ0eUFzc2lnbm1lbnRfMCApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjkxMjk6MjogKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VGaWx0ZXJDb25kaXRpb25fX1JlZlByb3BlcnR5QXNzaWdubWVudF8wICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YUludGVyY2hhbmdlRmlsdGVyQ29uZGl0aW9uQWNjZXNzKCkuZ2V0UmVmUHJvcGVydHlBc3NpZ25tZW50XzAoKSk7IAorICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6OTEzMDoyOiAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbHRlckNvbmRpdGlvbl9fUmVmUHJvcGVydHlBc3NpZ25tZW50XzAgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6OTEzMDozOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VGaWx0ZXJDb25kaXRpb25fX1JlZlByb3BlcnR5QXNzaWdubWVudF8wCisgICAgICAgICAgICB7CisgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV18yKTsKKyAgICAgICAgICAgIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbHRlckNvbmRpdGlvbl9fUmVmUHJvcGVydHlBc3NpZ25tZW50XzAoKTsKKworICAgICAgICAgICAgc3RhdGUuX2ZzcC0tOworICAgICAgICAgICAgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YUludGVyY2hhbmdlRmlsdGVyQ29uZGl0aW9uQWNjZXNzKCkuZ2V0UmVmUHJvcGVydHlBc3NpZ25tZW50XzAoKSk7IAorICAgICAgICAgICAgfQorCisgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgfQorCisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKFJlY29nbml0aW9uRXhjZXB0aW9uIHJlKSB7CisgICAgICAgICAgICByZXBvcnRFcnJvcihyZSk7CisgICAgICAgICAgICByZWNvdmVyKGlucHV0LHJlKTsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKworICAgICAgICAgICAgCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKKworICAgICAgICB9CisgICAgICAgIHJldHVybiA7CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgInJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbHRlckNvbmRpdGlvbl9fR3JvdXBfXzBfX0ltcGwiCisKKworICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fRGF0YUludGVyY2hhbmdlRmlsdGVyQ29uZGl0aW9uX19Hcm91cF9fMSIKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo5MTM4OjE6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbHRlckNvbmRpdGlvbl9fR3JvdXBfXzEgOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VGaWx0ZXJDb25kaXRpb25fX0dyb3VwX18xX19JbXBsIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbHRlckNvbmRpdGlvbl9fR3JvdXBfXzIgOworICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbHRlckNvbmRpdGlvbl9fR3JvdXBfXzEoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworCisgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICAgICAgCQorICAgICAgICB0cnkgeworICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6OTE0MjoxOiAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbHRlckNvbmRpdGlvbl9fR3JvdXBfXzFfX0ltcGwgcnVsZV9fRGF0YUludGVyY2hhbmdlRmlsdGVyQ29uZGl0aW9uX19Hcm91cF9fMiApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo5MTQzOjI6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbHRlckNvbmRpdGlvbl9fR3JvdXBfXzFfX0ltcGwgcnVsZV9fRGF0YUludGVyY2hhbmdlRmlsdGVyQ29uZGl0aW9uX19Hcm91cF9fMgorICAgICAgICAgICAgeworICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfNTkpOworICAgICAgICAgICAgcnVsZV9fRGF0YUludGVyY2hhbmdlRmlsdGVyQ29uZGl0aW9uX19Hcm91cF9fMV9fSW1wbCgpOworCisgICAgICAgICAgICBzdGF0ZS5fZnNwLS07CisgICAgICAgICAgICBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOworICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMik7CisgICAgICAgICAgICBydWxlX19EYXRhSW50ZXJjaGFuZ2VGaWx0ZXJDb25kaXRpb25fX0dyb3VwX18yKCk7CisKKyAgICAgICAgICAgIHN0YXRlLl9mc3AtLTsKKyAgICAgICAgICAgIGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CisKKyAgICAgICAgICAgIH0KKworICAgICAgICB9CisgICAgICAgIGNhdGNoIChSZWNvZ25pdGlvbkV4Y2VwdGlvbiByZSkgeworICAgICAgICAgICAgcmVwb3J0RXJyb3IocmUpOworICAgICAgICAgICAgcmVjb3ZlcihpbnB1dCxyZSk7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisKKyAgICAgICAgICAgIAlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7CisKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gOworICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJydWxlX19EYXRhSW50ZXJjaGFuZ2VGaWx0ZXJDb25kaXRpb25fX0dyb3VwX18xIgorCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbHRlckNvbmRpdGlvbl9fR3JvdXBfXzFfX0ltcGwiCisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6OTE1MDoxOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VGaWx0ZXJDb25kaXRpb25fX0dyb3VwX18xX19JbXBsIDogKCAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbHRlckNvbmRpdGlvbl9fT3BlcmF0b3JBc3NpZ25tZW50XzEgKSApIDsKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19EYXRhSW50ZXJjaGFuZ2VGaWx0ZXJDb25kaXRpb25fX0dyb3VwX18xX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKworICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgICAgIAkKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjkxNTQ6MTogKCAoICggcnVsZV9fRGF0YUludGVyY2hhbmdlRmlsdGVyQ29uZGl0aW9uX19PcGVyYXRvckFzc2lnbm1lbnRfMSApICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6OTE1NToxOiAoICggcnVsZV9fRGF0YUludGVyY2hhbmdlRmlsdGVyQ29uZGl0aW9uX19PcGVyYXRvckFzc2lnbm1lbnRfMSApICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjkxNTU6MTogKCAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbHRlckNvbmRpdGlvbl9fT3BlcmF0b3JBc3NpZ25tZW50XzEgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo5MTU2OjI6ICggcnVsZV9fRGF0YUludGVyY2hhbmdlRmlsdGVyQ29uZGl0aW9uX19PcGVyYXRvckFzc2lnbm1lbnRfMSApCisgICAgICAgICAgICB7CisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldERhdGFJbnRlcmNoYW5nZUZpbHRlckNvbmRpdGlvbkFjY2VzcygpLmdldE9wZXJhdG9yQXNzaWdubWVudF8xKCkpOyAKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjkxNTc6MjogKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VGaWx0ZXJDb25kaXRpb25fX09wZXJhdG9yQXNzaWdubWVudF8xICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjkxNTc6MzogcnVsZV9fRGF0YUludGVyY2hhbmdlRmlsdGVyQ29uZGl0aW9uX19PcGVyYXRvckFzc2lnbm1lbnRfMQorICAgICAgICAgICAgeworICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMik7CisgICAgICAgICAgICBydWxlX19EYXRhSW50ZXJjaGFuZ2VGaWx0ZXJDb25kaXRpb25fX09wZXJhdG9yQXNzaWdubWVudF8xKCk7CisKKyAgICAgICAgICAgIHN0YXRlLl9mc3AtLTsKKyAgICAgICAgICAgIGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBhZnRlcihncmFtbWFyQWNjZXNzLmdldERhdGFJbnRlcmNoYW5nZUZpbHRlckNvbmRpdGlvbkFjY2VzcygpLmdldE9wZXJhdG9yQXNzaWdubWVudF8xKCkpOyAKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgIH0KKworICAgICAgICB9CisgICAgICAgIGNhdGNoIChSZWNvZ25pdGlvbkV4Y2VwdGlvbiByZSkgeworICAgICAgICAgICAgcmVwb3J0RXJyb3IocmUpOworICAgICAgICAgICAgcmVjb3ZlcihpbnB1dCxyZSk7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisKKyAgICAgICAgICAgIAlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7CisKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gOworICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJydWxlX19EYXRhSW50ZXJjaGFuZ2VGaWx0ZXJDb25kaXRpb25fX0dyb3VwX18xX19JbXBsIgorCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbHRlckNvbmRpdGlvbl9fR3JvdXBfXzIiCisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6OTE2NToxOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VGaWx0ZXJDb25kaXRpb25fX0dyb3VwX18yIDogcnVsZV9fRGF0YUludGVyY2hhbmdlRmlsdGVyQ29uZGl0aW9uX19Hcm91cF9fMl9fSW1wbCBydWxlX19EYXRhSW50ZXJjaGFuZ2VGaWx0ZXJDb25kaXRpb25fX0dyb3VwX18zIDsKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19EYXRhSW50ZXJjaGFuZ2VGaWx0ZXJDb25kaXRpb25fX0dyb3VwX18yKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKworICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgICAgIAkKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjkxNjk6MTogKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VGaWx0ZXJDb25kaXRpb25fX0dyb3VwX18yX19JbXBsIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbHRlckNvbmRpdGlvbl9fR3JvdXBfXzMgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6OTE3MDoyOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VGaWx0ZXJDb25kaXRpb25fX0dyb3VwX18yX19JbXBsIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbHRlckNvbmRpdGlvbl9fR3JvdXBfXzMKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzU5KTsKKyAgICAgICAgICAgIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbHRlckNvbmRpdGlvbl9fR3JvdXBfXzJfX0ltcGwoKTsKKworICAgICAgICAgICAgc3RhdGUuX2ZzcC0tOworICAgICAgICAgICAgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKKyAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzIpOworICAgICAgICAgICAgcnVsZV9fRGF0YUludGVyY2hhbmdlRmlsdGVyQ29uZGl0aW9uX19Hcm91cF9fMygpOworCisgICAgICAgICAgICBzdGF0ZS5fZnNwLS07CisgICAgICAgICAgICBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOworCisgICAgICAgICAgICB9CisKKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoUmVjb2duaXRpb25FeGNlcHRpb24gcmUpIHsKKyAgICAgICAgICAgIHJlcG9ydEVycm9yKHJlKTsKKyAgICAgICAgICAgIHJlY292ZXIoaW5wdXQscmUpOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworCisgICAgICAgICAgICAJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworCisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIDsKKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAicnVsZV9fRGF0YUludGVyY2hhbmdlRmlsdGVyQ29uZGl0aW9uX19Hcm91cF9fMiIKKworCisgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19EYXRhSW50ZXJjaGFuZ2VGaWx0ZXJDb25kaXRpb25fX0dyb3VwX18yX19JbXBsIgorICAgIC8vIEludGVybmFsRGF0YURTTC5nOjkxNzc6MTogcnVsZV9fRGF0YUludGVyY2hhbmdlRmlsdGVyQ29uZGl0aW9uX19Hcm91cF9fMl9fSW1wbCA6ICggKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VGaWx0ZXJDb25kaXRpb25fX1ZhbHVlQXNzaWdubWVudF8yICk/ICkgOworICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbHRlckNvbmRpdGlvbl9fR3JvdXBfXzJfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworCisgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICAgICAgCQorICAgICAgICB0cnkgeworICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6OTE4MToxOiAoICggKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VGaWx0ZXJDb25kaXRpb25fX1ZhbHVlQXNzaWdubWVudF8yICk/ICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6OTE4MjoxOiAoICggcnVsZV9fRGF0YUludGVyY2hhbmdlRmlsdGVyQ29uZGl0aW9uX19WYWx1ZUFzc2lnbm1lbnRfMiApPyApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo5MTgyOjE6ICggKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VGaWx0ZXJDb25kaXRpb25fX1ZhbHVlQXNzaWdubWVudF8yICk/ICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjkxODM6MjogKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VGaWx0ZXJDb25kaXRpb25fX1ZhbHVlQXNzaWdubWVudF8yICk/CisgICAgICAgICAgICB7CisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldERhdGFJbnRlcmNoYW5nZUZpbHRlckNvbmRpdGlvbkFjY2VzcygpLmdldFZhbHVlQXNzaWdubWVudF8yKCkpOyAKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjkxODQ6MjogKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VGaWx0ZXJDb25kaXRpb25fX1ZhbHVlQXNzaWdubWVudF8yICk/CisgICAgICAgICAgICBpbnQgYWx0OTI9MjsKKyAgICAgICAgICAgIGludCBMQTkyXzAgPSBpbnB1dC5MQSgxKTsKKworICAgICAgICAgICAgaWYgKCAoTEE5Ml8wPT1SVUxFX1NUUklORykgKSB7CisgICAgICAgICAgICAgICAgYWx0OTI9MTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHN3aXRjaCAoYWx0OTIpIHsKKyAgICAgICAgICAgICAgICBjYXNlIDEgOgorICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo5MTg0OjM6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbHRlckNvbmRpdGlvbl9fVmFsdWVBc3NpZ25tZW50XzIKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV18yKTsKKyAgICAgICAgICAgICAgICAgICAgcnVsZV9fRGF0YUludGVyY2hhbmdlRmlsdGVyQ29uZGl0aW9uX19WYWx1ZUFzc2lnbm1lbnRfMigpOworCisgICAgICAgICAgICAgICAgICAgIHN0YXRlLl9mc3AtLTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKKworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXREYXRhSW50ZXJjaGFuZ2VGaWx0ZXJDb25kaXRpb25BY2Nlc3MoKS5nZXRWYWx1ZUFzc2lnbm1lbnRfMigpKTsgCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICB9CisKKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoUmVjb2duaXRpb25FeGNlcHRpb24gcmUpIHsKKyAgICAgICAgICAgIHJlcG9ydEVycm9yKHJlKTsKKyAgICAgICAgICAgIHJlY292ZXIoaW5wdXQscmUpOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworCisgICAgICAgICAgICAJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworCisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIDsKKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAicnVsZV9fRGF0YUludGVyY2hhbmdlRmlsdGVyQ29uZGl0aW9uX19Hcm91cF9fMl9fSW1wbCIKKworCisgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19EYXRhSW50ZXJjaGFuZ2VGaWx0ZXJDb25kaXRpb25fX0dyb3VwX18zIgorICAgIC8vIEludGVybmFsRGF0YURTTC5nOjkxOTI6MTogcnVsZV9fRGF0YUludGVyY2hhbmdlRmlsdGVyQ29uZGl0aW9uX19Hcm91cF9fMyA6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbHRlckNvbmRpdGlvbl9fR3JvdXBfXzNfX0ltcGwgOworICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbHRlckNvbmRpdGlvbl9fR3JvdXBfXzMoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworCisgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICAgICAgCQorICAgICAgICB0cnkgeworICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6OTE5NjoxOiAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbHRlckNvbmRpdGlvbl9fR3JvdXBfXzNfX0ltcGwgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6OTE5NzoyOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VGaWx0ZXJDb25kaXRpb25fX0dyb3VwX18zX19JbXBsCisgICAgICAgICAgICB7CisgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV18yKTsKKyAgICAgICAgICAgIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbHRlckNvbmRpdGlvbl9fR3JvdXBfXzNfX0ltcGwoKTsKKworICAgICAgICAgICAgc3RhdGUuX2ZzcC0tOworICAgICAgICAgICAgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKKworICAgICAgICAgICAgfQorCisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKFJlY29nbml0aW9uRXhjZXB0aW9uIHJlKSB7CisgICAgICAgICAgICByZXBvcnRFcnJvcihyZSk7CisgICAgICAgICAgICByZWNvdmVyKGlucHV0LHJlKTsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKworICAgICAgICAgICAgCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKKworICAgICAgICB9CisgICAgICAgIHJldHVybiA7CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgInJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbHRlckNvbmRpdGlvbl9fR3JvdXBfXzMiCisKKworICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fRGF0YUludGVyY2hhbmdlRmlsdGVyQ29uZGl0aW9uX19Hcm91cF9fM19fSW1wbCIKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo5MjAzOjE6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbHRlckNvbmRpdGlvbl9fR3JvdXBfXzNfX0ltcGwgOiAoICggcnVsZV9fRGF0YUludGVyY2hhbmdlRmlsdGVyQ29uZGl0aW9uX19Hcm91cF8zX18wICk/ICkgOworICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbHRlckNvbmRpdGlvbl9fR3JvdXBfXzNfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworCisgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICAgICAgCQorICAgICAgICB0cnkgeworICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6OTIwNzoxOiAoICggKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VGaWx0ZXJDb25kaXRpb25fX0dyb3VwXzNfXzAgKT8gKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo5MjA4OjE6ICggKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VGaWx0ZXJDb25kaXRpb25fX0dyb3VwXzNfXzAgKT8gKQorICAgICAgICAgICAgeworICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6OTIwODoxOiAoICggcnVsZV9fRGF0YUludGVyY2hhbmdlRmlsdGVyQ29uZGl0aW9uX19Hcm91cF8zX18wICk/ICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjkyMDk6MjogKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VGaWx0ZXJDb25kaXRpb25fX0dyb3VwXzNfXzAgKT8KKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YUludGVyY2hhbmdlRmlsdGVyQ29uZGl0aW9uQWNjZXNzKCkuZ2V0R3JvdXBfMygpKTsgCisgICAgICAgICAgICB9CisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo5MjEwOjI6ICggcnVsZV9fRGF0YUludGVyY2hhbmdlRmlsdGVyQ29uZGl0aW9uX19Hcm91cF8zX18wICk/CisgICAgICAgICAgICBpbnQgYWx0OTM9MjsKKyAgICAgICAgICAgIGludCBMQTkzXzAgPSBpbnB1dC5MQSgxKTsKKworICAgICAgICAgICAgaWYgKCAoKExBOTNfMD49NzEgJiYgTEE5M18wPD03MikpICkgeworICAgICAgICAgICAgICAgIGFsdDkzPTE7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzd2l0Y2ggKGFsdDkzKSB7CisgICAgICAgICAgICAgICAgY2FzZSAxIDoKKyAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6OTIxMDozOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VGaWx0ZXJDb25kaXRpb25fX0dyb3VwXzNfXzAKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV18yKTsKKyAgICAgICAgICAgICAgICAgICAgcnVsZV9fRGF0YUludGVyY2hhbmdlRmlsdGVyQ29uZGl0aW9uX19Hcm91cF8zX18wKCk7CisKKyAgICAgICAgICAgICAgICAgICAgc3RhdGUuX2ZzcC0tOworICAgICAgICAgICAgICAgICAgICBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOworCisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBhZnRlcihncmFtbWFyQWNjZXNzLmdldERhdGFJbnRlcmNoYW5nZUZpbHRlckNvbmRpdGlvbkFjY2VzcygpLmdldEdyb3VwXzMoKSk7IAorICAgICAgICAgICAgfQorCisgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgfQorCisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKFJlY29nbml0aW9uRXhjZXB0aW9uIHJlKSB7CisgICAgICAgICAgICByZXBvcnRFcnJvcihyZSk7CisgICAgICAgICAgICByZWNvdmVyKGlucHV0LHJlKTsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKworICAgICAgICAgICAgCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKKworICAgICAgICB9CisgICAgICAgIHJldHVybiA7CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgInJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbHRlckNvbmRpdGlvbl9fR3JvdXBfXzNfX0ltcGwiCisKKworICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fRGF0YUludGVyY2hhbmdlRmlsdGVyQ29uZGl0aW9uX19Hcm91cF8zX18wIgorICAgIC8vIEludGVybmFsRGF0YURTTC5nOjkyMTk6MTogcnVsZV9fRGF0YUludGVyY2hhbmdlRmlsdGVyQ29uZGl0aW9uX19Hcm91cF8zX18wIDogcnVsZV9fRGF0YUludGVyY2hhbmdlRmlsdGVyQ29uZGl0aW9uX19Hcm91cF8zX18wX19JbXBsIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbHRlckNvbmRpdGlvbl9fR3JvdXBfM19fMSA7CisgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fRGF0YUludGVyY2hhbmdlRmlsdGVyQ29uZGl0aW9uX19Hcm91cF8zX18wKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKworICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgICAgIAkKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjkyMjM6MTogKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VGaWx0ZXJDb25kaXRpb25fX0dyb3VwXzNfXzBfX0ltcGwgcnVsZV9fRGF0YUludGVyY2hhbmdlRmlsdGVyQ29uZGl0aW9uX19Hcm91cF8zX18xICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjkyMjQ6MjogcnVsZV9fRGF0YUludGVyY2hhbmdlRmlsdGVyQ29uZGl0aW9uX19Hcm91cF8zX18wX19JbXBsIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbHRlckNvbmRpdGlvbl9fR3JvdXBfM19fMQorICAgICAgICAgICAgeworICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfNyk7CisgICAgICAgICAgICBydWxlX19EYXRhSW50ZXJjaGFuZ2VGaWx0ZXJDb25kaXRpb25fX0dyb3VwXzNfXzBfX0ltcGwoKTsKKworICAgICAgICAgICAgc3RhdGUuX2ZzcC0tOworICAgICAgICAgICAgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKKyAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzIpOworICAgICAgICAgICAgcnVsZV9fRGF0YUludGVyY2hhbmdlRmlsdGVyQ29uZGl0aW9uX19Hcm91cF8zX18xKCk7CisKKyAgICAgICAgICAgIHN0YXRlLl9mc3AtLTsKKyAgICAgICAgICAgIGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CisKKyAgICAgICAgICAgIH0KKworICAgICAgICB9CisgICAgICAgIGNhdGNoIChSZWNvZ25pdGlvbkV4Y2VwdGlvbiByZSkgeworICAgICAgICAgICAgcmVwb3J0RXJyb3IocmUpOworICAgICAgICAgICAgcmVjb3ZlcihpbnB1dCxyZSk7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisKKyAgICAgICAgICAgIAlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7CisKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gOworICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJydWxlX19EYXRhSW50ZXJjaGFuZ2VGaWx0ZXJDb25kaXRpb25fX0dyb3VwXzNfXzAiCisKKworICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fRGF0YUludGVyY2hhbmdlRmlsdGVyQ29uZGl0aW9uX19Hcm91cF8zX18wX19JbXBsIgorICAgIC8vIEludGVybmFsRGF0YURTTC5nOjkyMzE6MTogcnVsZV9fRGF0YUludGVyY2hhbmdlRmlsdGVyQ29uZGl0aW9uX19Hcm91cF8zX18wX19JbXBsIDogKCAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbHRlckNvbmRpdGlvbl9fT3BlcmF0b3IyQXNzaWdubWVudF8zXzAgKSApIDsKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19EYXRhSW50ZXJjaGFuZ2VGaWx0ZXJDb25kaXRpb25fX0dyb3VwXzNfXzBfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworCisgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICAgICAgCQorICAgICAgICB0cnkgeworICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6OTIzNToxOiAoICggKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VGaWx0ZXJDb25kaXRpb25fX09wZXJhdG9yMkFzc2lnbm1lbnRfM18wICkgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo5MjM2OjE6ICggKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VGaWx0ZXJDb25kaXRpb25fX09wZXJhdG9yMkFzc2lnbm1lbnRfM18wICkgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6OTIzNjoxOiAoICggcnVsZV9fRGF0YUludGVyY2hhbmdlRmlsdGVyQ29uZGl0aW9uX19PcGVyYXRvcjJBc3NpZ25tZW50XzNfMCApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjkyMzc6MjogKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VGaWx0ZXJDb25kaXRpb25fX09wZXJhdG9yMkFzc2lnbm1lbnRfM18wICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YUludGVyY2hhbmdlRmlsdGVyQ29uZGl0aW9uQWNjZXNzKCkuZ2V0T3BlcmF0b3IyQXNzaWdubWVudF8zXzAoKSk7IAorICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6OTIzODoyOiAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbHRlckNvbmRpdGlvbl9fT3BlcmF0b3IyQXNzaWdubWVudF8zXzAgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6OTIzODozOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VGaWx0ZXJDb25kaXRpb25fX09wZXJhdG9yMkFzc2lnbm1lbnRfM18wCisgICAgICAgICAgICB7CisgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV18yKTsKKyAgICAgICAgICAgIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbHRlckNvbmRpdGlvbl9fT3BlcmF0b3IyQXNzaWdubWVudF8zXzAoKTsKKworICAgICAgICAgICAgc3RhdGUuX2ZzcC0tOworICAgICAgICAgICAgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YUludGVyY2hhbmdlRmlsdGVyQ29uZGl0aW9uQWNjZXNzKCkuZ2V0T3BlcmF0b3IyQXNzaWdubWVudF8zXzAoKSk7IAorICAgICAgICAgICAgfQorCisgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgfQorCisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKFJlY29nbml0aW9uRXhjZXB0aW9uIHJlKSB7CisgICAgICAgICAgICByZXBvcnRFcnJvcihyZSk7CisgICAgICAgICAgICByZWNvdmVyKGlucHV0LHJlKTsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKworICAgICAgICAgICAgCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKKworICAgICAgICB9CisgICAgICAgIHJldHVybiA7CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgInJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbHRlckNvbmRpdGlvbl9fR3JvdXBfM19fMF9fSW1wbCIKKworCisgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19EYXRhSW50ZXJjaGFuZ2VGaWx0ZXJDb25kaXRpb25fX0dyb3VwXzNfXzEiCisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6OTI0NjoxOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VGaWx0ZXJDb25kaXRpb25fX0dyb3VwXzNfXzEgOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VGaWx0ZXJDb25kaXRpb25fX0dyb3VwXzNfXzFfX0ltcGwgOworICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbHRlckNvbmRpdGlvbl9fR3JvdXBfM19fMSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisKKyAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgICAgICAJCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo5MjUwOjE6ICggcnVsZV9fRGF0YUludGVyY2hhbmdlRmlsdGVyQ29uZGl0aW9uX19Hcm91cF8zX18xX19JbXBsICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjkyNTE6MjogcnVsZV9fRGF0YUludGVyY2hhbmdlRmlsdGVyQ29uZGl0aW9uX19Hcm91cF8zX18xX19JbXBsCisgICAgICAgICAgICB7CisgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV18yKTsKKyAgICAgICAgICAgIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbHRlckNvbmRpdGlvbl9fR3JvdXBfM19fMV9fSW1wbCgpOworCisgICAgICAgICAgICBzdGF0ZS5fZnNwLS07CisgICAgICAgICAgICBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOworCisgICAgICAgICAgICB9CisKKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoUmVjb2duaXRpb25FeGNlcHRpb24gcmUpIHsKKyAgICAgICAgICAgIHJlcG9ydEVycm9yKHJlKTsKKyAgICAgICAgICAgIHJlY292ZXIoaW5wdXQscmUpOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworCisgICAgICAgICAgICAJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworCisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIDsKKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAicnVsZV9fRGF0YUludGVyY2hhbmdlRmlsdGVyQ29uZGl0aW9uX19Hcm91cF8zX18xIgorCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbHRlckNvbmRpdGlvbl9fR3JvdXBfM19fMV9fSW1wbCIKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo5MjU3OjE6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbHRlckNvbmRpdGlvbl9fR3JvdXBfM19fMV9fSW1wbCA6ICggKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VGaWx0ZXJDb25kaXRpb25fX1N1YmNvbmRpdGlvbkFzc2lnbm1lbnRfM18xICkgKSA7CisgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fRGF0YUludGVyY2hhbmdlRmlsdGVyQ29uZGl0aW9uX19Hcm91cF8zX18xX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKworICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgICAgIAkKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjkyNjE6MTogKCAoICggcnVsZV9fRGF0YUludGVyY2hhbmdlRmlsdGVyQ29uZGl0aW9uX19TdWJjb25kaXRpb25Bc3NpZ25tZW50XzNfMSApICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6OTI2MjoxOiAoICggcnVsZV9fRGF0YUludGVyY2hhbmdlRmlsdGVyQ29uZGl0aW9uX19TdWJjb25kaXRpb25Bc3NpZ25tZW50XzNfMSApICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjkyNjI6MTogKCAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbHRlckNvbmRpdGlvbl9fU3ViY29uZGl0aW9uQXNzaWdubWVudF8zXzEgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo5MjYzOjI6ICggcnVsZV9fRGF0YUludGVyY2hhbmdlRmlsdGVyQ29uZGl0aW9uX19TdWJjb25kaXRpb25Bc3NpZ25tZW50XzNfMSApCisgICAgICAgICAgICB7CisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldERhdGFJbnRlcmNoYW5nZUZpbHRlckNvbmRpdGlvbkFjY2VzcygpLmdldFN1YmNvbmRpdGlvbkFzc2lnbm1lbnRfM18xKCkpOyAKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjkyNjQ6MjogKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VGaWx0ZXJDb25kaXRpb25fX1N1YmNvbmRpdGlvbkFzc2lnbm1lbnRfM18xICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjkyNjQ6MzogcnVsZV9fRGF0YUludGVyY2hhbmdlRmlsdGVyQ29uZGl0aW9uX19TdWJjb25kaXRpb25Bc3NpZ25tZW50XzNfMQorICAgICAgICAgICAgeworICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMik7CisgICAgICAgICAgICBydWxlX19EYXRhSW50ZXJjaGFuZ2VGaWx0ZXJDb25kaXRpb25fX1N1YmNvbmRpdGlvbkFzc2lnbm1lbnRfM18xKCk7CisKKyAgICAgICAgICAgIHN0YXRlLl9mc3AtLTsKKyAgICAgICAgICAgIGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBhZnRlcihncmFtbWFyQWNjZXNzLmdldERhdGFJbnRlcmNoYW5nZUZpbHRlckNvbmRpdGlvbkFjY2VzcygpLmdldFN1YmNvbmRpdGlvbkFzc2lnbm1lbnRfM18xKCkpOyAKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgIH0KKworICAgICAgICB9CisgICAgICAgIGNhdGNoIChSZWNvZ25pdGlvbkV4Y2VwdGlvbiByZSkgeworICAgICAgICAgICAgcmVwb3J0RXJyb3IocmUpOworICAgICAgICAgICAgcmVjb3ZlcihpbnB1dCxyZSk7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisKKyAgICAgICAgICAgIAlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7CisKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gOworICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJydWxlX19EYXRhSW50ZXJjaGFuZ2VGaWx0ZXJDb25kaXRpb25fX0dyb3VwXzNfXzFfX0ltcGwiCisKKworICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fRGF0YUludGVyY2hhbmdlRXhwb3J0SGlkZV9fR3JvdXBfXzAiCisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6OTI3MzoxOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VFeHBvcnRIaWRlX19Hcm91cF9fMCA6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUV4cG9ydEhpZGVfX0dyb3VwX18wX19JbXBsIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUV4cG9ydEhpZGVfX0dyb3VwX18xIDsKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19EYXRhSW50ZXJjaGFuZ2VFeHBvcnRIaWRlX19Hcm91cF9fMCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisKKyAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgICAgICAJCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo5Mjc3OjE6ICggcnVsZV9fRGF0YUludGVyY2hhbmdlRXhwb3J0SGlkZV9fR3JvdXBfXzBfX0ltcGwgcnVsZV9fRGF0YUludGVyY2hhbmdlRXhwb3J0SGlkZV9fR3JvdXBfXzEgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6OTI3ODoyOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VFeHBvcnRIaWRlX19Hcm91cF9fMF9fSW1wbCBydWxlX19EYXRhSW50ZXJjaGFuZ2VFeHBvcnRIaWRlX19Hcm91cF9fMQorICAgICAgICAgICAgeworICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfNyk7CisgICAgICAgICAgICBydWxlX19EYXRhSW50ZXJjaGFuZ2VFeHBvcnRIaWRlX19Hcm91cF9fMF9fSW1wbCgpOworCisgICAgICAgICAgICBzdGF0ZS5fZnNwLS07CisgICAgICAgICAgICBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOworICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMik7CisgICAgICAgICAgICBydWxlX19EYXRhSW50ZXJjaGFuZ2VFeHBvcnRIaWRlX19Hcm91cF9fMSgpOworCisgICAgICAgICAgICBzdGF0ZS5fZnNwLS07CisgICAgICAgICAgICBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOworCisgICAgICAgICAgICB9CisKKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoUmVjb2duaXRpb25FeGNlcHRpb24gcmUpIHsKKyAgICAgICAgICAgIHJlcG9ydEVycm9yKHJlKTsKKyAgICAgICAgICAgIHJlY292ZXIoaW5wdXQscmUpOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworCisgICAgICAgICAgICAJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworCisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIDsKKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAicnVsZV9fRGF0YUludGVyY2hhbmdlRXhwb3J0SGlkZV9fR3JvdXBfXzAiCisKKworICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fRGF0YUludGVyY2hhbmdlRXhwb3J0SGlkZV9fR3JvdXBfXzBfX0ltcGwiCisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6OTI4NToxOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VFeHBvcnRIaWRlX19Hcm91cF9fMF9fSW1wbCA6ICggKCkgKSA7CisgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fRGF0YUludGVyY2hhbmdlRXhwb3J0SGlkZV9fR3JvdXBfXzBfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworCisgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICAgICAgCQorICAgICAgICB0cnkgeworICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6OTI4OToxOiAoICggKCkgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo5MjkwOjE6ICggKCkgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6OTI5MDoxOiAoICgpICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjkyOTE6MjogKCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YUludGVyY2hhbmdlRXhwb3J0SGlkZUFjY2VzcygpLmdldERhdGFJbnRlcmNoYW5nZUV4cG9ydEhpZGVBY3Rpb25fMCgpKTsgCisgICAgICAgICAgICB9CisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo5MjkyOjI6ICgpCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo5MjkyOjM6IAorICAgICAgICAgICAgeworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YUludGVyY2hhbmdlRXhwb3J0SGlkZUFjY2VzcygpLmdldERhdGFJbnRlcmNoYW5nZUV4cG9ydEhpZGVBY3Rpb25fMCgpKTsgCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICB9CisKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKworICAgICAgICAgICAgCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKKworICAgICAgICB9CisgICAgICAgIHJldHVybiA7CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgInJ1bGVfX0RhdGFJbnRlcmNoYW5nZUV4cG9ydEhpZGVfX0dyb3VwX18wX19JbXBsIgorCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX0RhdGFJbnRlcmNoYW5nZUV4cG9ydEhpZGVfX0dyb3VwX18xIgorICAgIC8vIEludGVybmFsRGF0YURTTC5nOjkzMDA6MTogcnVsZV9fRGF0YUludGVyY2hhbmdlRXhwb3J0SGlkZV9fR3JvdXBfXzEgOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VFeHBvcnRIaWRlX19Hcm91cF9fMV9fSW1wbCA7CisgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fRGF0YUludGVyY2hhbmdlRXhwb3J0SGlkZV9fR3JvdXBfXzEoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworCisgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICAgICAgCQorICAgICAgICB0cnkgeworICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6OTMwNDoxOiAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUV4cG9ydEhpZGVfX0dyb3VwX18xX19JbXBsICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjkzMDU6MjogcnVsZV9fRGF0YUludGVyY2hhbmdlRXhwb3J0SGlkZV9fR3JvdXBfXzFfX0ltcGwKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzIpOworICAgICAgICAgICAgcnVsZV9fRGF0YUludGVyY2hhbmdlRXhwb3J0SGlkZV9fR3JvdXBfXzFfX0ltcGwoKTsKKworICAgICAgICAgICAgc3RhdGUuX2ZzcC0tOworICAgICAgICAgICAgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKKworICAgICAgICAgICAgfQorCisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKFJlY29nbml0aW9uRXhjZXB0aW9uIHJlKSB7CisgICAgICAgICAgICByZXBvcnRFcnJvcihyZSk7CisgICAgICAgICAgICByZWNvdmVyKGlucHV0LHJlKTsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKworICAgICAgICAgICAgCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKKworICAgICAgICB9CisgICAgICAgIHJldHVybiA7CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgInJ1bGVfX0RhdGFJbnRlcmNoYW5nZUV4cG9ydEhpZGVfX0dyb3VwX18xIgorCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX0RhdGFJbnRlcmNoYW5nZUV4cG9ydEhpZGVfX0dyb3VwX18xX19JbXBsIgorICAgIC8vIEludGVybmFsRGF0YURTTC5nOjkzMTE6MTogcnVsZV9fRGF0YUludGVyY2hhbmdlRXhwb3J0SGlkZV9fR3JvdXBfXzFfX0ltcGwgOiAoICggcnVsZV9fRGF0YUludGVyY2hhbmdlRXhwb3J0SGlkZV9fUHJvcGVydHlBc3NpZ25tZW50XzEgKSApIDsKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19EYXRhSW50ZXJjaGFuZ2VFeHBvcnRIaWRlX19Hcm91cF9fMV9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisKKyAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgICAgICAJCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo5MzE1OjE6ICggKCAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUV4cG9ydEhpZGVfX1Byb3BlcnR5QXNzaWdubWVudF8xICkgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo5MzE2OjE6ICggKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VFeHBvcnRIaWRlX19Qcm9wZXJ0eUFzc2lnbm1lbnRfMSApICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjkzMTY6MTogKCAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUV4cG9ydEhpZGVfX1Byb3BlcnR5QXNzaWdubWVudF8xICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6OTMxNzoyOiAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUV4cG9ydEhpZGVfX1Byb3BlcnR5QXNzaWdubWVudF8xICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YUludGVyY2hhbmdlRXhwb3J0SGlkZUFjY2VzcygpLmdldFByb3BlcnR5QXNzaWdubWVudF8xKCkpOyAKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjkzMTg6MjogKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VFeHBvcnRIaWRlX19Qcm9wZXJ0eUFzc2lnbm1lbnRfMSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo5MzE4OjM6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUV4cG9ydEhpZGVfX1Byb3BlcnR5QXNzaWdubWVudF8xCisgICAgICAgICAgICB7CisgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV18yKTsKKyAgICAgICAgICAgIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUV4cG9ydEhpZGVfX1Byb3BlcnR5QXNzaWdubWVudF8xKCk7CisKKyAgICAgICAgICAgIHN0YXRlLl9mc3AtLTsKKyAgICAgICAgICAgIGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBhZnRlcihncmFtbWFyQWNjZXNzLmdldERhdGFJbnRlcmNoYW5nZUV4cG9ydEhpZGVBY2Nlc3MoKS5nZXRQcm9wZXJ0eUFzc2lnbm1lbnRfMSgpKTsgCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICB9CisKKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoUmVjb2duaXRpb25FeGNlcHRpb24gcmUpIHsKKyAgICAgICAgICAgIHJlcG9ydEVycm9yKHJlKTsKKyAgICAgICAgICAgIHJlY292ZXIoaW5wdXQscmUpOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworCisgICAgICAgICAgICAJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworCisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIDsKKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAicnVsZV9fRGF0YUludGVyY2hhbmdlRXhwb3J0SGlkZV9fR3JvdXBfXzFfX0ltcGwiCisKKwogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fRGF0YUludGVyY2hhbmdlUHJlZGVmaW5lZEV4cHJlc3Npb25fX0dyb3VwX18wIgotICAgIC8vIEludGVybmFsRGF0YURTTC5nOjc5ODk6MTogcnVsZV9fRGF0YUludGVyY2hhbmdlUHJlZGVmaW5lZEV4cHJlc3Npb25fX0dyb3VwX18wIDogcnVsZV9fRGF0YUludGVyY2hhbmdlUHJlZGVmaW5lZEV4cHJlc3Npb25fX0dyb3VwX18wX19JbXBsIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZVByZWRlZmluZWRFeHByZXNzaW9uX19Hcm91cF9fMSA7CisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6OTMyNzoxOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VQcmVkZWZpbmVkRXhwcmVzc2lvbl9fR3JvdXBfXzAgOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VQcmVkZWZpbmVkRXhwcmVzc2lvbl9fR3JvdXBfXzBfX0ltcGwgcnVsZV9fRGF0YUludGVyY2hhbmdlUHJlZGVmaW5lZEV4cHJlc3Npb25fX0dyb3VwX18xIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19EYXRhSW50ZXJjaGFuZ2VQcmVkZWZpbmVkRXhwcmVzc2lvbl9fR3JvdXBfXzAoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6Nzk5MzoxOiAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZVByZWRlZmluZWRFeHByZXNzaW9uX19Hcm91cF9fMF9fSW1wbCBydWxlX19EYXRhSW50ZXJjaGFuZ2VQcmVkZWZpbmVkRXhwcmVzc2lvbl9fR3JvdXBfXzEgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6Nzk5NDoyOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VQcmVkZWZpbmVkRXhwcmVzc2lvbl9fR3JvdXBfXzBfX0ltcGwgcnVsZV9fRGF0YUludGVyY2hhbmdlUHJlZGVmaW5lZEV4cHJlc3Npb25fX0dyb3VwX18xCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo5MzMxOjE6ICggcnVsZV9fRGF0YUludGVyY2hhbmdlUHJlZGVmaW5lZEV4cHJlc3Npb25fX0dyb3VwX18wX19JbXBsIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZVByZWRlZmluZWRFeHByZXNzaW9uX19Hcm91cF9fMSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo5MzMyOjI6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZVByZWRlZmluZWRFeHByZXNzaW9uX19Hcm91cF9fMF9fSW1wbCBydWxlX19EYXRhSW50ZXJjaGFuZ2VQcmVkZWZpbmVkRXhwcmVzc2lvbl9fR3JvdXBfXzEKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzUyKTsKKyAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzYwKTsKICAgICAgICAgICAgIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZVByZWRlZmluZWRFeHByZXNzaW9uX19Hcm91cF9fMF9fSW1wbCgpOwogCiAgICAgICAgICAgICBzdGF0ZS5fZnNwLS07CkBAIC0yNzYxNCwyMyArMzIwNzEsMjMgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19EYXRhSW50ZXJjaGFuZ2VQcmVkZWZpbmVkRXhwcmVzc2lvbl9fR3JvdXBfXzBfX0ltcGwiCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6ODAwMToxOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VQcmVkZWZpbmVkRXhwcmVzc2lvbl9fR3JvdXBfXzBfX0ltcGwgOiAoICgpICkgOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjkzMzk6MTogcnVsZV9fRGF0YUludGVyY2hhbmdlUHJlZGVmaW5lZEV4cHJlc3Npb25fX0dyb3VwX18wX19JbXBsIDogKCAoKSApIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19EYXRhSW50ZXJjaGFuZ2VQcmVkZWZpbmVkRXhwcmVzc2lvbl9fR3JvdXBfXzBfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6ODAwNToxOiAoICggKCkgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo4MDA2OjE6ICggKCkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6OTM0MzoxOiAoICggKCkgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo5MzQ0OjE6ICggKCkgKQogICAgICAgICAgICAgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6ODAwNjoxOiAoICgpICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjgwMDc6MjogKCkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjkzNDQ6MTogKCAoKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo5MzQ1OjI6ICgpCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldERhdGFJbnRlcmNoYW5nZVByZWRlZmluZWRFeHByZXNzaW9uQWNjZXNzKCkuZ2V0RGF0YUludGVyY2hhbmdlUHJlZGVmaW5lZEV4cHJlc3Npb25BY3Rpb25fMCgpKTsgCiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo4MDA4OjI6ICgpCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo4MDA4OjM6IAorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6OTM0NjoyOiAoKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6OTM0NjozOiAKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIH0KIApAQCAtMjc2NTUsMTQgKzMyMTEyLDE0IEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fRGF0YUludGVyY2hhbmdlUHJlZGVmaW5lZEV4cHJlc3Npb25fX0dyb3VwX18xIgotICAgIC8vIEludGVybmFsRGF0YURTTC5nOjgwMTY6MTogcnVsZV9fRGF0YUludGVyY2hhbmdlUHJlZGVmaW5lZEV4cHJlc3Npb25fX0dyb3VwX18xIDogcnVsZV9fRGF0YUludGVyY2hhbmdlUHJlZGVmaW5lZEV4cHJlc3Npb25fX0dyb3VwX18xX19JbXBsIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZVByZWRlZmluZWRFeHByZXNzaW9uX19Hcm91cF9fMiA7CisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6OTM1NDoxOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VQcmVkZWZpbmVkRXhwcmVzc2lvbl9fR3JvdXBfXzEgOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VQcmVkZWZpbmVkRXhwcmVzc2lvbl9fR3JvdXBfXzFfX0ltcGwgcnVsZV9fRGF0YUludGVyY2hhbmdlUHJlZGVmaW5lZEV4cHJlc3Npb25fX0dyb3VwX18yIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19EYXRhSW50ZXJjaGFuZ2VQcmVkZWZpbmVkRXhwcmVzc2lvbl9fR3JvdXBfXzEoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6ODAyMDoxOiAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZVByZWRlZmluZWRFeHByZXNzaW9uX19Hcm91cF9fMV9fSW1wbCBydWxlX19EYXRhSW50ZXJjaGFuZ2VQcmVkZWZpbmVkRXhwcmVzc2lvbl9fR3JvdXBfXzIgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6ODAyMToyOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VQcmVkZWZpbmVkRXhwcmVzc2lvbl9fR3JvdXBfXzFfX0ltcGwgcnVsZV9fRGF0YUludGVyY2hhbmdlUHJlZGVmaW5lZEV4cHJlc3Npb25fX0dyb3VwX18yCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo5MzU4OjE6ICggcnVsZV9fRGF0YUludGVyY2hhbmdlUHJlZGVmaW5lZEV4cHJlc3Npb25fX0dyb3VwX18xX19JbXBsIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZVByZWRlZmluZWRFeHByZXNzaW9uX19Hcm91cF9fMiApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo5MzU5OjI6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZVByZWRlZmluZWRFeHByZXNzaW9uX19Hcm91cF9fMV9fSW1wbCBydWxlX19EYXRhSW50ZXJjaGFuZ2VQcmVkZWZpbmVkRXhwcmVzc2lvbl9fR3JvdXBfXzIKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzcpOwogICAgICAgICAgICAgcnVsZV9fRGF0YUludGVyY2hhbmdlUHJlZGVmaW5lZEV4cHJlc3Npb25fX0dyb3VwX18xX19JbXBsKCk7CkBAIC0yNzY5MywyMiArMzIxNTAsMjIgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19EYXRhSW50ZXJjaGFuZ2VQcmVkZWZpbmVkRXhwcmVzc2lvbl9fR3JvdXBfXzFfX0ltcGwiCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6ODAyODoxOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VQcmVkZWZpbmVkRXhwcmVzc2lvbl9fR3JvdXBfXzFfX0ltcGwgOiAoICdhc3NpZ24nICkgOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjkzNjY6MTogcnVsZV9fRGF0YUludGVyY2hhbmdlUHJlZGVmaW5lZEV4cHJlc3Npb25fX0dyb3VwX18xX19JbXBsIDogKCAnYXNzaWduJyApIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19EYXRhSW50ZXJjaGFuZ2VQcmVkZWZpbmVkRXhwcmVzc2lvbl9fR3JvdXBfXzFfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6ODAzMjoxOiAoICggJ2Fzc2lnbicgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo4MDMzOjE6ICggJ2Fzc2lnbicgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6OTM3MDoxOiAoICggJ2Fzc2lnbicgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo5MzcxOjE6ICggJ2Fzc2lnbicgKQogICAgICAgICAgICAgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6ODAzMzoxOiAoICdhc3NpZ24nICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjgwMzQ6MjogJ2Fzc2lnbicKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjkzNzE6MTogKCAnYXNzaWduJyApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo5MzcyOjI6ICdhc3NpZ24nCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldERhdGFJbnRlcmNoYW5nZVByZWRlZmluZWRFeHByZXNzaW9uQWNjZXNzKCkuZ2V0QXNzaWduS2V5d29yZF8xKCkpOyAKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1hdGNoKGlucHV0LDEwNSxGT0xMT1dfMik7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CisgICAgICAgICAgICBtYXRjaChpbnB1dCwxMTUsRk9MTE9XXzIpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOwogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBhZnRlcihncmFtbWFyQWNjZXNzLmdldERhdGFJbnRlcmNoYW5nZVByZWRlZmluZWRFeHByZXNzaW9uQWNjZXNzKCkuZ2V0QXNzaWduS2V5d29yZF8xKCkpOyAKICAgICAgICAgICAgIH0KQEAgLTI3NzM0LDE2ICszMjE5MSwxNiBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX0RhdGFJbnRlcmNoYW5nZVByZWRlZmluZWRFeHByZXNzaW9uX19Hcm91cF9fMiIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo4MDQzOjE6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZVByZWRlZmluZWRFeHByZXNzaW9uX19Hcm91cF9fMiA6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZVByZWRlZmluZWRFeHByZXNzaW9uX19Hcm91cF9fMl9fSW1wbCBydWxlX19EYXRhSW50ZXJjaGFuZ2VQcmVkZWZpbmVkRXhwcmVzc2lvbl9fR3JvdXBfXzMgOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjkzODE6MTogcnVsZV9fRGF0YUludGVyY2hhbmdlUHJlZGVmaW5lZEV4cHJlc3Npb25fX0dyb3VwX18yIDogcnVsZV9fRGF0YUludGVyY2hhbmdlUHJlZGVmaW5lZEV4cHJlc3Npb25fX0dyb3VwX18yX19JbXBsIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZVByZWRlZmluZWRFeHByZXNzaW9uX19Hcm91cF9fMyA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fRGF0YUludGVyY2hhbmdlUHJlZGVmaW5lZEV4cHJlc3Npb25fX0dyb3VwX18yKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjgwNDc6MTogKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VQcmVkZWZpbmVkRXhwcmVzc2lvbl9fR3JvdXBfXzJfX0ltcGwgcnVsZV9fRGF0YUludGVyY2hhbmdlUHJlZGVmaW5lZEV4cHJlc3Npb25fX0dyb3VwX18zICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjgwNDg6MjogcnVsZV9fRGF0YUludGVyY2hhbmdlUHJlZGVmaW5lZEV4cHJlc3Npb25fX0dyb3VwX18yX19JbXBsIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZVByZWRlZmluZWRFeHByZXNzaW9uX19Hcm91cF9fMworICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6OTM4NToxOiAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZVByZWRlZmluZWRFeHByZXNzaW9uX19Hcm91cF9fMl9fSW1wbCBydWxlX19EYXRhSW50ZXJjaGFuZ2VQcmVkZWZpbmVkRXhwcmVzc2lvbl9fR3JvdXBfXzMgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6OTM4NjoyOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VQcmVkZWZpbmVkRXhwcmVzc2lvbl9fR3JvdXBfXzJfX0ltcGwgcnVsZV9fRGF0YUludGVyY2hhbmdlUHJlZGVmaW5lZEV4cHJlc3Npb25fX0dyb3VwX18zCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV181Myk7CisgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV182MSk7CiAgICAgICAgICAgICBydWxlX19EYXRhSW50ZXJjaGFuZ2VQcmVkZWZpbmVkRXhwcmVzc2lvbl9fR3JvdXBfXzJfX0ltcGwoKTsKIAogICAgICAgICAgICAgc3RhdGUuX2ZzcC0tOwpAQCAtMjc3NzIsMjMgKzMyMjI5LDIzIEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fRGF0YUludGVyY2hhbmdlUHJlZGVmaW5lZEV4cHJlc3Npb25fX0dyb3VwX18yX19JbXBsIgotICAgIC8vIEludGVybmFsRGF0YURTTC5nOjgwNTU6MTogcnVsZV9fRGF0YUludGVyY2hhbmdlUHJlZGVmaW5lZEV4cHJlc3Npb25fX0dyb3VwX18yX19JbXBsIDogKCAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZVByZWRlZmluZWRFeHByZXNzaW9uX19UYXJnZXRQcm9wZXJ0eUFzc2lnbm1lbnRfMiApICkgOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjkzOTM6MTogcnVsZV9fRGF0YUludGVyY2hhbmdlUHJlZGVmaW5lZEV4cHJlc3Npb25fX0dyb3VwX18yX19JbXBsIDogKCAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZVByZWRlZmluZWRFeHByZXNzaW9uX19UYXJnZXRQcm9wZXJ0eUFzc2lnbm1lbnRfMiApICkgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZVByZWRlZmluZWRFeHByZXNzaW9uX19Hcm91cF9fMl9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo4MDU5OjE6ICggKCAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZVByZWRlZmluZWRFeHByZXNzaW9uX19UYXJnZXRQcm9wZXJ0eUFzc2lnbm1lbnRfMiApICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6ODA2MDoxOiAoICggcnVsZV9fRGF0YUludGVyY2hhbmdlUHJlZGVmaW5lZEV4cHJlc3Npb25fX1RhcmdldFByb3BlcnR5QXNzaWdubWVudF8yICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6OTM5NzoxOiAoICggKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VQcmVkZWZpbmVkRXhwcmVzc2lvbl9fVGFyZ2V0UHJvcGVydHlBc3NpZ25tZW50XzIgKSApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjkzOTg6MTogKCAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZVByZWRlZmluZWRFeHByZXNzaW9uX19UYXJnZXRQcm9wZXJ0eUFzc2lnbm1lbnRfMiApICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjgwNjA6MTogKCAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZVByZWRlZmluZWRFeHByZXNzaW9uX19UYXJnZXRQcm9wZXJ0eUFzc2lnbm1lbnRfMiApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjgwNjE6MjogKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VQcmVkZWZpbmVkRXhwcmVzc2lvbl9fVGFyZ2V0UHJvcGVydHlBc3NpZ25tZW50XzIgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6OTM5ODoxOiAoICggcnVsZV9fRGF0YUludGVyY2hhbmdlUHJlZGVmaW5lZEV4cHJlc3Npb25fX1RhcmdldFByb3BlcnR5QXNzaWdubWVudF8yICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6OTM5OToyOiAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZVByZWRlZmluZWRFeHByZXNzaW9uX19UYXJnZXRQcm9wZXJ0eUFzc2lnbm1lbnRfMiApCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldERhdGFJbnRlcmNoYW5nZVByZWRlZmluZWRFeHByZXNzaW9uQWNjZXNzKCkuZ2V0VGFyZ2V0UHJvcGVydHlBc3NpZ25tZW50XzIoKSk7IAogICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6ODA2MjoyOiAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZVByZWRlZmluZWRFeHByZXNzaW9uX19UYXJnZXRQcm9wZXJ0eUFzc2lnbm1lbnRfMiApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo4MDYyOjM6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZVByZWRlZmluZWRFeHByZXNzaW9uX19UYXJnZXRQcm9wZXJ0eUFzc2lnbm1lbnRfMgorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6OTQwMDoyOiAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZVByZWRlZmluZWRFeHByZXNzaW9uX19UYXJnZXRQcm9wZXJ0eUFzc2lnbm1lbnRfMiApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo5NDAwOjM6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZVByZWRlZmluZWRFeHByZXNzaW9uX19UYXJnZXRQcm9wZXJ0eUFzc2lnbm1lbnRfMgogICAgICAgICAgICAgewogICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMik7CiAgICAgICAgICAgICBydWxlX19EYXRhSW50ZXJjaGFuZ2VQcmVkZWZpbmVkRXhwcmVzc2lvbl9fVGFyZ2V0UHJvcGVydHlBc3NpZ25tZW50XzIoKTsKQEAgLTI3ODIzLDE2ICszMjI4MCwxNiBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX0RhdGFJbnRlcmNoYW5nZVByZWRlZmluZWRFeHByZXNzaW9uX19Hcm91cF9fMyIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo4MDcwOjE6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZVByZWRlZmluZWRFeHByZXNzaW9uX19Hcm91cF9fMyA6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZVByZWRlZmluZWRFeHByZXNzaW9uX19Hcm91cF9fM19fSW1wbCBydWxlX19EYXRhSW50ZXJjaGFuZ2VQcmVkZWZpbmVkRXhwcmVzc2lvbl9fR3JvdXBfXzQgOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjk0MDg6MTogcnVsZV9fRGF0YUludGVyY2hhbmdlUHJlZGVmaW5lZEV4cHJlc3Npb25fX0dyb3VwX18zIDogcnVsZV9fRGF0YUludGVyY2hhbmdlUHJlZGVmaW5lZEV4cHJlc3Npb25fX0dyb3VwX18zX19JbXBsIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZVByZWRlZmluZWRFeHByZXNzaW9uX19Hcm91cF9fNCA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fRGF0YUludGVyY2hhbmdlUHJlZGVmaW5lZEV4cHJlc3Npb25fX0dyb3VwX18zKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjgwNzQ6MTogKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VQcmVkZWZpbmVkRXhwcmVzc2lvbl9fR3JvdXBfXzNfX0ltcGwgcnVsZV9fRGF0YUludGVyY2hhbmdlUHJlZGVmaW5lZEV4cHJlc3Npb25fX0dyb3VwX180ICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjgwNzU6MjogcnVsZV9fRGF0YUludGVyY2hhbmdlUHJlZGVmaW5lZEV4cHJlc3Npb25fX0dyb3VwX18zX19JbXBsIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZVByZWRlZmluZWRFeHByZXNzaW9uX19Hcm91cF9fNAorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6OTQxMjoxOiAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZVByZWRlZmluZWRFeHByZXNzaW9uX19Hcm91cF9fM19fSW1wbCBydWxlX19EYXRhSW50ZXJjaGFuZ2VQcmVkZWZpbmVkRXhwcmVzc2lvbl9fR3JvdXBfXzQgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6OTQxMzoyOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VQcmVkZWZpbmVkRXhwcmVzc2lvbl9fR3JvdXBfXzNfX0ltcGwgcnVsZV9fRGF0YUludGVyY2hhbmdlUHJlZGVmaW5lZEV4cHJlc3Npb25fX0dyb3VwX180CiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV181NCk7CisgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV182Mik7CiAgICAgICAgICAgICBydWxlX19EYXRhSW50ZXJjaGFuZ2VQcmVkZWZpbmVkRXhwcmVzc2lvbl9fR3JvdXBfXzNfX0ltcGwoKTsKIAogICAgICAgICAgICAgc3RhdGUuX2ZzcC0tOwpAQCAtMjc4NjEsMjIgKzMyMzE4LDIyIEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fRGF0YUludGVyY2hhbmdlUHJlZGVmaW5lZEV4cHJlc3Npb25fX0dyb3VwX18zX19JbXBsIgotICAgIC8vIEludGVybmFsRGF0YURTTC5nOjgwODI6MTogcnVsZV9fRGF0YUludGVyY2hhbmdlUHJlZGVmaW5lZEV4cHJlc3Npb25fX0dyb3VwX18zX19JbXBsIDogKCAnd2l0aCcgKSA7CisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6OTQyMDoxOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VQcmVkZWZpbmVkRXhwcmVzc2lvbl9fR3JvdXBfXzNfX0ltcGwgOiAoICd3aXRoJyApIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19EYXRhSW50ZXJjaGFuZ2VQcmVkZWZpbmVkRXhwcmVzc2lvbl9fR3JvdXBfXzNfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6ODA4NjoxOiAoICggJ3dpdGgnICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6ODA4NzoxOiAoICd3aXRoJyApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo5NDI0OjE6ICggKCAnd2l0aCcgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo5NDI1OjE6ICggJ3dpdGgnICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjgwODc6MTogKCAnd2l0aCcgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6ODA4ODoyOiAnd2l0aCcKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjk0MjU6MTogKCAnd2l0aCcgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6OTQyNjoyOiAnd2l0aCcKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YUludGVyY2hhbmdlUHJlZGVmaW5lZEV4cHJlc3Npb25BY2Nlc3MoKS5nZXRXaXRoS2V5d29yZF8zKCkpOyAKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1hdGNoKGlucHV0LDk3LEZPTExPV18yKTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKKyAgICAgICAgICAgIG1hdGNoKGlucHV0LDEwNCxGT0xMT1dfMik7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YUludGVyY2hhbmdlUHJlZGVmaW5lZEV4cHJlc3Npb25BY2Nlc3MoKS5nZXRXaXRoS2V5d29yZF8zKCkpOyAKICAgICAgICAgICAgIH0KQEAgLTI3OTAyLDE2ICszMjM1OSwxNiBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX0RhdGFJbnRlcmNoYW5nZVByZWRlZmluZWRFeHByZXNzaW9uX19Hcm91cF9fNCIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo4MDk3OjE6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZVByZWRlZmluZWRFeHByZXNzaW9uX19Hcm91cF9fNCA6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZVByZWRlZmluZWRFeHByZXNzaW9uX19Hcm91cF9fNF9fSW1wbCBydWxlX19EYXRhSW50ZXJjaGFuZ2VQcmVkZWZpbmVkRXhwcmVzc2lvbl9fR3JvdXBfXzUgOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjk0MzU6MTogcnVsZV9fRGF0YUludGVyY2hhbmdlUHJlZGVmaW5lZEV4cHJlc3Npb25fX0dyb3VwX180IDogcnVsZV9fRGF0YUludGVyY2hhbmdlUHJlZGVmaW5lZEV4cHJlc3Npb25fX0dyb3VwX180X19JbXBsIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZVByZWRlZmluZWRFeHByZXNzaW9uX19Hcm91cF9fNSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fRGF0YUludGVyY2hhbmdlUHJlZGVmaW5lZEV4cHJlc3Npb25fX0dyb3VwX180KCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjgxMDE6MTogKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VQcmVkZWZpbmVkRXhwcmVzc2lvbl9fR3JvdXBfXzRfX0ltcGwgcnVsZV9fRGF0YUludGVyY2hhbmdlUHJlZGVmaW5lZEV4cHJlc3Npb25fX0dyb3VwX181ICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjgxMDI6MjogcnVsZV9fRGF0YUludGVyY2hhbmdlUHJlZGVmaW5lZEV4cHJlc3Npb25fX0dyb3VwX180X19JbXBsIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZVByZWRlZmluZWRFeHByZXNzaW9uX19Hcm91cF9fNQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6OTQzOToxOiAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZVByZWRlZmluZWRFeHByZXNzaW9uX19Hcm91cF9fNF9fSW1wbCBydWxlX19EYXRhSW50ZXJjaGFuZ2VQcmVkZWZpbmVkRXhwcmVzc2lvbl9fR3JvdXBfXzUgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6OTQ0MDoyOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VQcmVkZWZpbmVkRXhwcmVzc2lvbl9fR3JvdXBfXzRfX0ltcGwgcnVsZV9fRGF0YUludGVyY2hhbmdlUHJlZGVmaW5lZEV4cHJlc3Npb25fX0dyb3VwX181CiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV181NSk7CisgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV182Myk7CiAgICAgICAgICAgICBydWxlX19EYXRhSW50ZXJjaGFuZ2VQcmVkZWZpbmVkRXhwcmVzc2lvbl9fR3JvdXBfXzRfX0ltcGwoKTsKIAogICAgICAgICAgICAgc3RhdGUuX2ZzcC0tOwpAQCAtMjc5NDAsMjMgKzMyMzk3LDIzIEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fRGF0YUludGVyY2hhbmdlUHJlZGVmaW5lZEV4cHJlc3Npb25fX0dyb3VwX180X19JbXBsIgotICAgIC8vIEludGVybmFsRGF0YURTTC5nOjgxMDk6MTogcnVsZV9fRGF0YUludGVyY2hhbmdlUHJlZGVmaW5lZEV4cHJlc3Npb25fX0dyb3VwX180X19JbXBsIDogKCAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZVByZWRlZmluZWRFeHByZXNzaW9uX19CZWFuQXNzaWdubWVudF80ICkgKSA7CisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6OTQ0NzoxOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VQcmVkZWZpbmVkRXhwcmVzc2lvbl9fR3JvdXBfXzRfX0ltcGwgOiAoICggcnVsZV9fRGF0YUludGVyY2hhbmdlUHJlZGVmaW5lZEV4cHJlc3Npb25fX0JlYW5Bc3NpZ25tZW50XzQgKSApIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19EYXRhSW50ZXJjaGFuZ2VQcmVkZWZpbmVkRXhwcmVzc2lvbl9fR3JvdXBfXzRfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6ODExMzoxOiAoICggKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VQcmVkZWZpbmVkRXhwcmVzc2lvbl9fQmVhbkFzc2lnbm1lbnRfNCApICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6ODExNDoxOiAoICggcnVsZV9fRGF0YUludGVyY2hhbmdlUHJlZGVmaW5lZEV4cHJlc3Npb25fX0JlYW5Bc3NpZ25tZW50XzQgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo5NDUxOjE6ICggKCAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZVByZWRlZmluZWRFeHByZXNzaW9uX19CZWFuQXNzaWdubWVudF80ICkgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo5NDUyOjE6ICggKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VQcmVkZWZpbmVkRXhwcmVzc2lvbl9fQmVhbkFzc2lnbm1lbnRfNCApICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjgxMTQ6MTogKCAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZVByZWRlZmluZWRFeHByZXNzaW9uX19CZWFuQXNzaWdubWVudF80ICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6ODExNToyOiAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZVByZWRlZmluZWRFeHByZXNzaW9uX19CZWFuQXNzaWdubWVudF80ICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjk0NTI6MTogKCAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZVByZWRlZmluZWRFeHByZXNzaW9uX19CZWFuQXNzaWdubWVudF80ICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6OTQ1MzoyOiAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZVByZWRlZmluZWRFeHByZXNzaW9uX19CZWFuQXNzaWdubWVudF80ICkKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YUludGVyY2hhbmdlUHJlZGVmaW5lZEV4cHJlc3Npb25BY2Nlc3MoKS5nZXRCZWFuQXNzaWdubWVudF80KCkpOyAKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjgxMTY6MjogKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VQcmVkZWZpbmVkRXhwcmVzc2lvbl9fQmVhbkFzc2lnbm1lbnRfNCApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo4MTE2OjM6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZVByZWRlZmluZWRFeHByZXNzaW9uX19CZWFuQXNzaWdubWVudF80CisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo5NDU0OjI6ICggcnVsZV9fRGF0YUludGVyY2hhbmdlUHJlZGVmaW5lZEV4cHJlc3Npb25fX0JlYW5Bc3NpZ25tZW50XzQgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6OTQ1NDozOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VQcmVkZWZpbmVkRXhwcmVzc2lvbl9fQmVhbkFzc2lnbm1lbnRfNAogICAgICAgICAgICAgewogICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMik7CiAgICAgICAgICAgICBydWxlX19EYXRhSW50ZXJjaGFuZ2VQcmVkZWZpbmVkRXhwcmVzc2lvbl9fQmVhbkFzc2lnbm1lbnRfNCgpOwpAQCAtMjc5OTEsMTYgKzMyNDQ4LDE2IEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fRGF0YUludGVyY2hhbmdlUHJlZGVmaW5lZEV4cHJlc3Npb25fX0dyb3VwX181IgotICAgIC8vIEludGVybmFsRGF0YURTTC5nOjgxMjQ6MTogcnVsZV9fRGF0YUludGVyY2hhbmdlUHJlZGVmaW5lZEV4cHJlc3Npb25fX0dyb3VwX181IDogcnVsZV9fRGF0YUludGVyY2hhbmdlUHJlZGVmaW5lZEV4cHJlc3Npb25fX0dyb3VwX181X19JbXBsIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZVByZWRlZmluZWRFeHByZXNzaW9uX19Hcm91cF9fNiA7CisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6OTQ2MjoxOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VQcmVkZWZpbmVkRXhwcmVzc2lvbl9fR3JvdXBfXzUgOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VQcmVkZWZpbmVkRXhwcmVzc2lvbl9fR3JvdXBfXzVfX0ltcGwgcnVsZV9fRGF0YUludGVyY2hhbmdlUHJlZGVmaW5lZEV4cHJlc3Npb25fX0dyb3VwX182IDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19EYXRhSW50ZXJjaGFuZ2VQcmVkZWZpbmVkRXhwcmVzc2lvbl9fR3JvdXBfXzUoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6ODEyODoxOiAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZVByZWRlZmluZWRFeHByZXNzaW9uX19Hcm91cF9fNV9fSW1wbCBydWxlX19EYXRhSW50ZXJjaGFuZ2VQcmVkZWZpbmVkRXhwcmVzc2lvbl9fR3JvdXBfXzYgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6ODEyOToyOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VQcmVkZWZpbmVkRXhwcmVzc2lvbl9fR3JvdXBfXzVfX0ltcGwgcnVsZV9fRGF0YUludGVyY2hhbmdlUHJlZGVmaW5lZEV4cHJlc3Npb25fX0dyb3VwX182CisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo5NDY2OjE6ICggcnVsZV9fRGF0YUludGVyY2hhbmdlUHJlZGVmaW5lZEV4cHJlc3Npb25fX0dyb3VwX181X19JbXBsIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZVByZWRlZmluZWRFeHByZXNzaW9uX19Hcm91cF9fNiApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo5NDY3OjI6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZVByZWRlZmluZWRFeHByZXNzaW9uX19Hcm91cF9fNV9fSW1wbCBydWxlX19EYXRhSW50ZXJjaGFuZ2VQcmVkZWZpbmVkRXhwcmVzc2lvbl9fR3JvdXBfXzYKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzU2KTsKKyAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzY0KTsKICAgICAgICAgICAgIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZVByZWRlZmluZWRFeHByZXNzaW9uX19Hcm91cF9fNV9fSW1wbCgpOwogCiAgICAgICAgICAgICBzdGF0ZS5fZnNwLS07CkBAIC0yODAyOSwyMiArMzI0ODYsMjIgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19EYXRhSW50ZXJjaGFuZ2VQcmVkZWZpbmVkRXhwcmVzc2lvbl9fR3JvdXBfXzVfX0ltcGwiCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6ODEzNjoxOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VQcmVkZWZpbmVkRXhwcmVzc2lvbl9fR3JvdXBfXzVfX0ltcGwgOiAoICdhcycgKSA7CisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6OTQ3NDoxOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VQcmVkZWZpbmVkRXhwcmVzc2lvbl9fR3JvdXBfXzVfX0ltcGwgOiAoICdhcycgKSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fRGF0YUludGVyY2hhbmdlUHJlZGVmaW5lZEV4cHJlc3Npb25fX0dyb3VwX181X19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjgxNDA6MTogKCAoICdhcycgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo4MTQxOjE6ICggJ2FzJyApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo5NDc4OjE6ICggKCAnYXMnICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6OTQ3OToxOiAoICdhcycgKQogICAgICAgICAgICAgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6ODE0MToxOiAoICdhcycgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6ODE0MjoyOiAnYXMnCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo5NDc5OjE6ICggJ2FzJyApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo5NDgwOjI6ICdhcycKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YUludGVyY2hhbmdlUHJlZGVmaW5lZEV4cHJlc3Npb25BY2Nlc3MoKS5nZXRBc0tleXdvcmRfNSgpKTsgCiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBtYXRjaChpbnB1dCwxMDYsRk9MTE9XXzIpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOworICAgICAgICAgICAgbWF0Y2goaW5wdXQsMTE2LEZPTExPV18yKTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXREYXRhSW50ZXJjaGFuZ2VQcmVkZWZpbmVkRXhwcmVzc2lvbkFjY2VzcygpLmdldEFzS2V5d29yZF81KCkpOyAKICAgICAgICAgICAgIH0KQEAgLTI4MDcwLDE0ICszMjUyNywxNCBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX0RhdGFJbnRlcmNoYW5nZVByZWRlZmluZWRFeHByZXNzaW9uX19Hcm91cF9fNiIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo4MTUxOjE6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZVByZWRlZmluZWRFeHByZXNzaW9uX19Hcm91cF9fNiA6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZVByZWRlZmluZWRFeHByZXNzaW9uX19Hcm91cF9fNl9fSW1wbCA7CisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6OTQ4OToxOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VQcmVkZWZpbmVkRXhwcmVzc2lvbl9fR3JvdXBfXzYgOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VQcmVkZWZpbmVkRXhwcmVzc2lvbl9fR3JvdXBfXzZfX0ltcGwgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZVByZWRlZmluZWRFeHByZXNzaW9uX19Hcm91cF9fNigpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo4MTU1OjE6ICggcnVsZV9fRGF0YUludGVyY2hhbmdlUHJlZGVmaW5lZEV4cHJlc3Npb25fX0dyb3VwX182X19JbXBsICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjgxNTY6MjogcnVsZV9fRGF0YUludGVyY2hhbmdlUHJlZGVmaW5lZEV4cHJlc3Npb25fX0dyb3VwX182X19JbXBsCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo5NDkzOjE6ICggcnVsZV9fRGF0YUludGVyY2hhbmdlUHJlZGVmaW5lZEV4cHJlc3Npb25fX0dyb3VwX182X19JbXBsICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjk0OTQ6MjogcnVsZV9fRGF0YUludGVyY2hhbmdlUHJlZGVmaW5lZEV4cHJlc3Npb25fX0dyb3VwX182X19JbXBsCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV18yKTsKICAgICAgICAgICAgIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZVByZWRlZmluZWRFeHByZXNzaW9uX19Hcm91cF9fNl9fSW1wbCgpOwpAQCAtMjgxMDMsMjMgKzMyNTYwLDIzIEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fRGF0YUludGVyY2hhbmdlUHJlZGVmaW5lZEV4cHJlc3Npb25fX0dyb3VwX182X19JbXBsIgotICAgIC8vIEludGVybmFsRGF0YURTTC5nOjgxNjI6MTogcnVsZV9fRGF0YUludGVyY2hhbmdlUHJlZGVmaW5lZEV4cHJlc3Npb25fX0dyb3VwX182X19JbXBsIDogKCAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZVByZWRlZmluZWRFeHByZXNzaW9uX19CZWFuVHlwZUFzc2lnbm1lbnRfNiApICkgOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjk1MDA6MTogcnVsZV9fRGF0YUludGVyY2hhbmdlUHJlZGVmaW5lZEV4cHJlc3Npb25fX0dyb3VwX182X19JbXBsIDogKCAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZVByZWRlZmluZWRFeHByZXNzaW9uX19CZWFuVHlwZUFzc2lnbm1lbnRfNiApICkgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZVByZWRlZmluZWRFeHByZXNzaW9uX19Hcm91cF9fNl9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo4MTY2OjE6ICggKCAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZVByZWRlZmluZWRFeHByZXNzaW9uX19CZWFuVHlwZUFzc2lnbm1lbnRfNiApICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6ODE2NzoxOiAoICggcnVsZV9fRGF0YUludGVyY2hhbmdlUHJlZGVmaW5lZEV4cHJlc3Npb25fX0JlYW5UeXBlQXNzaWdubWVudF82ICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6OTUwNDoxOiAoICggKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VQcmVkZWZpbmVkRXhwcmVzc2lvbl9fQmVhblR5cGVBc3NpZ25tZW50XzYgKSApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjk1MDU6MTogKCAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZVByZWRlZmluZWRFeHByZXNzaW9uX19CZWFuVHlwZUFzc2lnbm1lbnRfNiApICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjgxNjc6MTogKCAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZVByZWRlZmluZWRFeHByZXNzaW9uX19CZWFuVHlwZUFzc2lnbm1lbnRfNiApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjgxNjg6MjogKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VQcmVkZWZpbmVkRXhwcmVzc2lvbl9fQmVhblR5cGVBc3NpZ25tZW50XzYgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6OTUwNToxOiAoICggcnVsZV9fRGF0YUludGVyY2hhbmdlUHJlZGVmaW5lZEV4cHJlc3Npb25fX0JlYW5UeXBlQXNzaWdubWVudF82ICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6OTUwNjoyOiAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZVByZWRlZmluZWRFeHByZXNzaW9uX19CZWFuVHlwZUFzc2lnbm1lbnRfNiApCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldERhdGFJbnRlcmNoYW5nZVByZWRlZmluZWRFeHByZXNzaW9uQWNjZXNzKCkuZ2V0QmVhblR5cGVBc3NpZ25tZW50XzYoKSk7IAogICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6ODE2OToyOiAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZVByZWRlZmluZWRFeHByZXNzaW9uX19CZWFuVHlwZUFzc2lnbm1lbnRfNiApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo4MTY5OjM6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZVByZWRlZmluZWRFeHByZXNzaW9uX19CZWFuVHlwZUFzc2lnbm1lbnRfNgorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6OTUwNzoyOiAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZVByZWRlZmluZWRFeHByZXNzaW9uX19CZWFuVHlwZUFzc2lnbm1lbnRfNiApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo5NTA3OjM6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZVByZWRlZmluZWRFeHByZXNzaW9uX19CZWFuVHlwZUFzc2lnbm1lbnRfNgogICAgICAgICAgICAgewogICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMik7CiAgICAgICAgICAgICBydWxlX19EYXRhSW50ZXJjaGFuZ2VQcmVkZWZpbmVkRXhwcmVzc2lvbl9fQmVhblR5cGVBc3NpZ25tZW50XzYoKTsKQEAgLTI4MTU0LDE2ICszMjYxMSwxNiBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX0RhdGFJbnRlcmNoYW5nZVZhbHVlTWFwcGluZ19fR3JvdXBfXzAiCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6ODE3ODoxOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VWYWx1ZU1hcHBpbmdfX0dyb3VwX18wIDogcnVsZV9fRGF0YUludGVyY2hhbmdlVmFsdWVNYXBwaW5nX19Hcm91cF9fMF9fSW1wbCBydWxlX19EYXRhSW50ZXJjaGFuZ2VWYWx1ZU1hcHBpbmdfX0dyb3VwX18xIDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo5NTE2OjE6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZVZhbHVlTWFwcGluZ19fR3JvdXBfXzAgOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VWYWx1ZU1hcHBpbmdfX0dyb3VwX18wX19JbXBsIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZVZhbHVlTWFwcGluZ19fR3JvdXBfXzEgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZVZhbHVlTWFwcGluZ19fR3JvdXBfXzAoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6ODE4MjoxOiAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZVZhbHVlTWFwcGluZ19fR3JvdXBfXzBfX0ltcGwgcnVsZV9fRGF0YUludGVyY2hhbmdlVmFsdWVNYXBwaW5nX19Hcm91cF9fMSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo4MTgzOjI6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZVZhbHVlTWFwcGluZ19fR3JvdXBfXzBfX0ltcGwgcnVsZV9fRGF0YUludGVyY2hhbmdlVmFsdWVNYXBwaW5nX19Hcm91cF9fMQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6OTUyMDoxOiAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZVZhbHVlTWFwcGluZ19fR3JvdXBfXzBfX0ltcGwgcnVsZV9fRGF0YUludGVyY2hhbmdlVmFsdWVNYXBwaW5nX19Hcm91cF9fMSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo5NTIxOjI6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZVZhbHVlTWFwcGluZ19fR3JvdXBfXzBfX0ltcGwgcnVsZV9fRGF0YUludGVyY2hhbmdlVmFsdWVNYXBwaW5nX19Hcm91cF9fMQogICAgICAgICAgICAgewotICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfNTcpOworICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfNjUpOwogICAgICAgICAgICAgcnVsZV9fRGF0YUludGVyY2hhbmdlVmFsdWVNYXBwaW5nX19Hcm91cF9fMF9fSW1wbCgpOwogCiAgICAgICAgICAgICBzdGF0ZS5fZnNwLS07CkBAIC0yODE5MiwyMyArMzI2NDksMjMgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19EYXRhSW50ZXJjaGFuZ2VWYWx1ZU1hcHBpbmdfX0dyb3VwX18wX19JbXBsIgotICAgIC8vIEludGVybmFsRGF0YURTTC5nOjgxOTA6MTogcnVsZV9fRGF0YUludGVyY2hhbmdlVmFsdWVNYXBwaW5nX19Hcm91cF9fMF9fSW1wbCA6ICggKCkgKSA7CisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6OTUyODoxOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VWYWx1ZU1hcHBpbmdfX0dyb3VwX18wX19JbXBsIDogKCAoKSApIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19EYXRhSW50ZXJjaGFuZ2VWYWx1ZU1hcHBpbmdfX0dyb3VwX18wX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjgxOTQ6MTogKCAoICgpICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6ODE5NToxOiAoICgpICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjk1MzI6MTogKCAoICgpICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6OTUzMzoxOiAoICgpICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjgxOTU6MTogKCAoKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo4MTk2OjI6ICgpCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo5NTMzOjE6ICggKCkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6OTUzNDoyOiAoKQogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXREYXRhSW50ZXJjaGFuZ2VWYWx1ZU1hcHBpbmdBY2Nlc3MoKS5nZXREYXRhSW50ZXJjaGFuZ2VWYWx1ZU1hcHBpbmdBY3Rpb25fMCgpKTsgCiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo4MTk3OjI6ICgpCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo4MTk3OjM6IAorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6OTUzNToyOiAoKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6OTUzNTozOiAKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIH0KIApAQCAtMjgyMzMsMTQgKzMyNjkwLDE0IEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fRGF0YUludGVyY2hhbmdlVmFsdWVNYXBwaW5nX19Hcm91cF9fMSIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo4MjA1OjE6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZVZhbHVlTWFwcGluZ19fR3JvdXBfXzEgOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VWYWx1ZU1hcHBpbmdfX0dyb3VwX18xX19JbXBsIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZVZhbHVlTWFwcGluZ19fR3JvdXBfXzIgOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjk1NDM6MTogcnVsZV9fRGF0YUludGVyY2hhbmdlVmFsdWVNYXBwaW5nX19Hcm91cF9fMSA6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZVZhbHVlTWFwcGluZ19fR3JvdXBfXzFfX0ltcGwgcnVsZV9fRGF0YUludGVyY2hhbmdlVmFsdWVNYXBwaW5nX19Hcm91cF9fMiA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fRGF0YUludGVyY2hhbmdlVmFsdWVNYXBwaW5nX19Hcm91cF9fMSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo4MjA5OjE6ICggcnVsZV9fRGF0YUludGVyY2hhbmdlVmFsdWVNYXBwaW5nX19Hcm91cF9fMV9fSW1wbCBydWxlX19EYXRhSW50ZXJjaGFuZ2VWYWx1ZU1hcHBpbmdfX0dyb3VwX18yICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjgyMTA6MjogcnVsZV9fRGF0YUludGVyY2hhbmdlVmFsdWVNYXBwaW5nX19Hcm91cF9fMV9fSW1wbCBydWxlX19EYXRhSW50ZXJjaGFuZ2VWYWx1ZU1hcHBpbmdfX0dyb3VwX18yCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo5NTQ3OjE6ICggcnVsZV9fRGF0YUludGVyY2hhbmdlVmFsdWVNYXBwaW5nX19Hcm91cF9fMV9fSW1wbCBydWxlX19EYXRhSW50ZXJjaGFuZ2VWYWx1ZU1hcHBpbmdfX0dyb3VwX18yICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjk1NDg6MjogcnVsZV9fRGF0YUludGVyY2hhbmdlVmFsdWVNYXBwaW5nX19Hcm91cF9fMV9fSW1wbCBydWxlX19EYXRhSW50ZXJjaGFuZ2VWYWx1ZU1hcHBpbmdfX0dyb3VwX18yCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV183KTsKICAgICAgICAgICAgIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZVZhbHVlTWFwcGluZ19fR3JvdXBfXzFfX0ltcGwoKTsKQEAgLTI4MjcxLDIyICszMjcyOCwyMiBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX0RhdGFJbnRlcmNoYW5nZVZhbHVlTWFwcGluZ19fR3JvdXBfXzFfX0ltcGwiCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6ODIxNzoxOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VWYWx1ZU1hcHBpbmdfX0dyb3VwX18xX19JbXBsIDogKCAnbWFwJyApIDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo5NTU1OjE6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZVZhbHVlTWFwcGluZ19fR3JvdXBfXzFfX0ltcGwgOiAoICdtYXAnICkgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZVZhbHVlTWFwcGluZ19fR3JvdXBfXzFfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6ODIyMToxOiAoICggJ21hcCcgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo4MjIyOjE6ICggJ21hcCcgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6OTU1OToxOiAoICggJ21hcCcgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo5NTYwOjE6ICggJ21hcCcgKQogICAgICAgICAgICAgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6ODIyMjoxOiAoICdtYXAnICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjgyMjM6MjogJ21hcCcKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjk1NjA6MTogKCAnbWFwJyApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo5NTYxOjI6ICdtYXAnCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldERhdGFJbnRlcmNoYW5nZVZhbHVlTWFwcGluZ0FjY2VzcygpLmdldE1hcEtleXdvcmRfMSgpKTsgCiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBtYXRjaChpbnB1dCwxMDcsRk9MTE9XXzIpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOworICAgICAgICAgICAgbWF0Y2goaW5wdXQsMTE3LEZPTExPV18yKTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXREYXRhSW50ZXJjaGFuZ2VWYWx1ZU1hcHBpbmdBY2Nlc3MoKS5nZXRNYXBLZXl3b3JkXzEoKSk7IAogICAgICAgICAgICAgfQpAQCAtMjgzMTIsMTYgKzMyNzY5LDE2IEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fRGF0YUludGVyY2hhbmdlVmFsdWVNYXBwaW5nX19Hcm91cF9fMiIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo4MjMyOjE6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZVZhbHVlTWFwcGluZ19fR3JvdXBfXzIgOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VWYWx1ZU1hcHBpbmdfX0dyb3VwX18yX19JbXBsIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZVZhbHVlTWFwcGluZ19fR3JvdXBfXzMgOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjk1NzA6MTogcnVsZV9fRGF0YUludGVyY2hhbmdlVmFsdWVNYXBwaW5nX19Hcm91cF9fMiA6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZVZhbHVlTWFwcGluZ19fR3JvdXBfXzJfX0ltcGwgcnVsZV9fRGF0YUludGVyY2hhbmdlVmFsdWVNYXBwaW5nX19Hcm91cF9fMyA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fRGF0YUludGVyY2hhbmdlVmFsdWVNYXBwaW5nX19Hcm91cF9fMigpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo4MjM2OjE6ICggcnVsZV9fRGF0YUludGVyY2hhbmdlVmFsdWVNYXBwaW5nX19Hcm91cF9fMl9fSW1wbCBydWxlX19EYXRhSW50ZXJjaGFuZ2VWYWx1ZU1hcHBpbmdfX0dyb3VwX18zICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjgyMzc6MjogcnVsZV9fRGF0YUludGVyY2hhbmdlVmFsdWVNYXBwaW5nX19Hcm91cF9fMl9fSW1wbCBydWxlX19EYXRhSW50ZXJjaGFuZ2VWYWx1ZU1hcHBpbmdfX0dyb3VwX18zCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo5NTc0OjE6ICggcnVsZV9fRGF0YUludGVyY2hhbmdlVmFsdWVNYXBwaW5nX19Hcm91cF9fMl9fSW1wbCBydWxlX19EYXRhSW50ZXJjaGFuZ2VWYWx1ZU1hcHBpbmdfX0dyb3VwX18zICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjk1NzU6MjogcnVsZV9fRGF0YUludGVyY2hhbmdlVmFsdWVNYXBwaW5nX19Hcm91cF9fMl9fSW1wbCBydWxlX19EYXRhSW50ZXJjaGFuZ2VWYWx1ZU1hcHBpbmdfX0dyb3VwX18zCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV181OCk7CisgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV182Nik7CiAgICAgICAgICAgICBydWxlX19EYXRhSW50ZXJjaGFuZ2VWYWx1ZU1hcHBpbmdfX0dyb3VwX18yX19JbXBsKCk7CiAKICAgICAgICAgICAgIHN0YXRlLl9mc3AtLTsKQEAgLTI4MzUwLDIzICszMjgwNywyMyBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX0RhdGFJbnRlcmNoYW5nZVZhbHVlTWFwcGluZ19fR3JvdXBfXzJfX0ltcGwiCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6ODI0NDoxOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VWYWx1ZU1hcHBpbmdfX0dyb3VwX18yX19JbXBsIDogKCAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZVZhbHVlTWFwcGluZ19fUHJvcGVydHlBc3NpZ25tZW50XzIgKSApIDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo5NTgyOjE6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZVZhbHVlTWFwcGluZ19fR3JvdXBfXzJfX0ltcGwgOiAoICggcnVsZV9fRGF0YUludGVyY2hhbmdlVmFsdWVNYXBwaW5nX19Qcm9wZXJ0eUFzc2lnbm1lbnRfMiApICkgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZVZhbHVlTWFwcGluZ19fR3JvdXBfXzJfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6ODI0ODoxOiAoICggKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VWYWx1ZU1hcHBpbmdfX1Byb3BlcnR5QXNzaWdubWVudF8yICkgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo4MjQ5OjE6ICggKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VWYWx1ZU1hcHBpbmdfX1Byb3BlcnR5QXNzaWdubWVudF8yICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6OTU4NjoxOiAoICggKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VWYWx1ZU1hcHBpbmdfX1Byb3BlcnR5QXNzaWdubWVudF8yICkgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo5NTg3OjE6ICggKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VWYWx1ZU1hcHBpbmdfX1Byb3BlcnR5QXNzaWdubWVudF8yICkgKQogICAgICAgICAgICAgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6ODI0OToxOiAoICggcnVsZV9fRGF0YUludGVyY2hhbmdlVmFsdWVNYXBwaW5nX19Qcm9wZXJ0eUFzc2lnbm1lbnRfMiApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjgyNTA6MjogKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VWYWx1ZU1hcHBpbmdfX1Byb3BlcnR5QXNzaWdubWVudF8yICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjk1ODc6MTogKCAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZVZhbHVlTWFwcGluZ19fUHJvcGVydHlBc3NpZ25tZW50XzIgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo5NTg4OjI6ICggcnVsZV9fRGF0YUludGVyY2hhbmdlVmFsdWVNYXBwaW5nX19Qcm9wZXJ0eUFzc2lnbm1lbnRfMiApCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldERhdGFJbnRlcmNoYW5nZVZhbHVlTWFwcGluZ0FjY2VzcygpLmdldFByb3BlcnR5QXNzaWdubWVudF8yKCkpOyAKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjgyNTE6MjogKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VWYWx1ZU1hcHBpbmdfX1Byb3BlcnR5QXNzaWdubWVudF8yICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjgyNTE6MzogcnVsZV9fRGF0YUludGVyY2hhbmdlVmFsdWVNYXBwaW5nX19Qcm9wZXJ0eUFzc2lnbm1lbnRfMgorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6OTU4OToyOiAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZVZhbHVlTWFwcGluZ19fUHJvcGVydHlBc3NpZ25tZW50XzIgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6OTU4OTozOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VWYWx1ZU1hcHBpbmdfX1Byb3BlcnR5QXNzaWdubWVudF8yCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV18yKTsKICAgICAgICAgICAgIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZVZhbHVlTWFwcGluZ19fUHJvcGVydHlBc3NpZ25tZW50XzIoKTsKQEAgLTI4NDAxLDE0ICszMjg1OCwxNCBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX0RhdGFJbnRlcmNoYW5nZVZhbHVlTWFwcGluZ19fR3JvdXBfXzMiCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6ODI1OToxOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VWYWx1ZU1hcHBpbmdfX0dyb3VwX18zIDogcnVsZV9fRGF0YUludGVyY2hhbmdlVmFsdWVNYXBwaW5nX19Hcm91cF9fM19fSW1wbCBydWxlX19EYXRhSW50ZXJjaGFuZ2VWYWx1ZU1hcHBpbmdfX0dyb3VwX180IDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo5NTk3OjE6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZVZhbHVlTWFwcGluZ19fR3JvdXBfXzMgOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VWYWx1ZU1hcHBpbmdfX0dyb3VwX18zX19JbXBsIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZVZhbHVlTWFwcGluZ19fR3JvdXBfXzQgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZVZhbHVlTWFwcGluZ19fR3JvdXBfXzMoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6ODI2MzoxOiAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZVZhbHVlTWFwcGluZ19fR3JvdXBfXzNfX0ltcGwgcnVsZV9fRGF0YUludGVyY2hhbmdlVmFsdWVNYXBwaW5nX19Hcm91cF9fNCApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo4MjY0OjI6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZVZhbHVlTWFwcGluZ19fR3JvdXBfXzNfX0ltcGwgcnVsZV9fRGF0YUludGVyY2hhbmdlVmFsdWVNYXBwaW5nX19Hcm91cF9fNAorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6OTYwMToxOiAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZVZhbHVlTWFwcGluZ19fR3JvdXBfXzNfX0ltcGwgcnVsZV9fRGF0YUludGVyY2hhbmdlVmFsdWVNYXBwaW5nX19Hcm91cF9fNCApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo5NjAyOjI6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZVZhbHVlTWFwcGluZ19fR3JvdXBfXzNfX0ltcGwgcnVsZV9fRGF0YUludGVyY2hhbmdlVmFsdWVNYXBwaW5nX19Hcm91cF9fNAogICAgICAgICAgICAgewogICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfOSk7CiAgICAgICAgICAgICBydWxlX19EYXRhSW50ZXJjaGFuZ2VWYWx1ZU1hcHBpbmdfX0dyb3VwX18zX19JbXBsKCk7CkBAIC0yODQzOSwyMiArMzI4OTYsMjIgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19EYXRhSW50ZXJjaGFuZ2VWYWx1ZU1hcHBpbmdfX0dyb3VwX18zX19JbXBsIgotICAgIC8vIEludGVybmFsRGF0YURTTC5nOjgyNzE6MTogcnVsZV9fRGF0YUludGVyY2hhbmdlVmFsdWVNYXBwaW5nX19Hcm91cF9fM19fSW1wbCA6ICggJ3RvJyApIDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo5NjA5OjE6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZVZhbHVlTWFwcGluZ19fR3JvdXBfXzNfX0ltcGwgOiAoICd0bycgKSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fRGF0YUludGVyY2hhbmdlVmFsdWVNYXBwaW5nX19Hcm91cF9fM19fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo4Mjc1OjE6ICggKCAndG8nICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6ODI3NjoxOiAoICd0bycgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6OTYxMzoxOiAoICggJ3RvJyApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjk2MTQ6MTogKCAndG8nICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjgyNzY6MTogKCAndG8nICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjgyNzc6MjogJ3RvJworICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6OTYxNDoxOiAoICd0bycgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6OTYxNToyOiAndG8nCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldERhdGFJbnRlcmNoYW5nZVZhbHVlTWFwcGluZ0FjY2VzcygpLmdldFRvS2V5d29yZF8zKCkpOyAKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1hdGNoKGlucHV0LDEwOCxGT0xMT1dfMik7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CisgICAgICAgICAgICBtYXRjaChpbnB1dCwxMTgsRk9MTE9XXzIpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOwogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBhZnRlcihncmFtbWFyQWNjZXNzLmdldERhdGFJbnRlcmNoYW5nZVZhbHVlTWFwcGluZ0FjY2VzcygpLmdldFRvS2V5d29yZF8zKCkpOyAKICAgICAgICAgICAgIH0KQEAgLTI4NDgwLDE0ICszMjkzNywxNCBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX0RhdGFJbnRlcmNoYW5nZVZhbHVlTWFwcGluZ19fR3JvdXBfXzQiCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6ODI4NjoxOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VWYWx1ZU1hcHBpbmdfX0dyb3VwX180IDogcnVsZV9fRGF0YUludGVyY2hhbmdlVmFsdWVNYXBwaW5nX19Hcm91cF9fNF9fSW1wbCA7CisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6OTYyNDoxOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VWYWx1ZU1hcHBpbmdfX0dyb3VwX180IDogcnVsZV9fRGF0YUludGVyY2hhbmdlVmFsdWVNYXBwaW5nX19Hcm91cF9fNF9fSW1wbCA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fRGF0YUludGVyY2hhbmdlVmFsdWVNYXBwaW5nX19Hcm91cF9fNCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo4MjkwOjE6ICggcnVsZV9fRGF0YUludGVyY2hhbmdlVmFsdWVNYXBwaW5nX19Hcm91cF9fNF9fSW1wbCApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo4MjkxOjI6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZVZhbHVlTWFwcGluZ19fR3JvdXBfXzRfX0ltcGwKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjk2Mjg6MTogKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VWYWx1ZU1hcHBpbmdfX0dyb3VwX180X19JbXBsICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjk2Mjk6MjogcnVsZV9fRGF0YUludGVyY2hhbmdlVmFsdWVNYXBwaW5nX19Hcm91cF9fNF9fSW1wbAogICAgICAgICAgICAgewogICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMik7CiAgICAgICAgICAgICBydWxlX19EYXRhSW50ZXJjaGFuZ2VWYWx1ZU1hcHBpbmdfX0dyb3VwX180X19JbXBsKCk7CkBAIC0yODUxMywyMyArMzI5NzAsMjMgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19EYXRhSW50ZXJjaGFuZ2VWYWx1ZU1hcHBpbmdfX0dyb3VwX180X19JbXBsIgotICAgIC8vIEludGVybmFsRGF0YURTTC5nOjgyOTc6MTogcnVsZV9fRGF0YUludGVyY2hhbmdlVmFsdWVNYXBwaW5nX19Hcm91cF9fNF9fSW1wbCA6ICggKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VWYWx1ZU1hcHBpbmdfX0RhdGFBc3NpZ25tZW50XzQgKSApIDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo5NjM1OjE6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZVZhbHVlTWFwcGluZ19fR3JvdXBfXzRfX0ltcGwgOiAoICggcnVsZV9fRGF0YUludGVyY2hhbmdlVmFsdWVNYXBwaW5nX19EYXRhQXNzaWdubWVudF80ICkgKSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fRGF0YUludGVyY2hhbmdlVmFsdWVNYXBwaW5nX19Hcm91cF9fNF9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo4MzAxOjE6ICggKCAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZVZhbHVlTWFwcGluZ19fRGF0YUFzc2lnbm1lbnRfNCApICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6ODMwMjoxOiAoICggcnVsZV9fRGF0YUludGVyY2hhbmdlVmFsdWVNYXBwaW5nX19EYXRhQXNzaWdubWVudF80ICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6OTYzOToxOiAoICggKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VWYWx1ZU1hcHBpbmdfX0RhdGFBc3NpZ25tZW50XzQgKSApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjk2NDA6MTogKCAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZVZhbHVlTWFwcGluZ19fRGF0YUFzc2lnbm1lbnRfNCApICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjgzMDI6MTogKCAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZVZhbHVlTWFwcGluZ19fRGF0YUFzc2lnbm1lbnRfNCApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjgzMDM6MjogKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VWYWx1ZU1hcHBpbmdfX0RhdGFBc3NpZ25tZW50XzQgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6OTY0MDoxOiAoICggcnVsZV9fRGF0YUludGVyY2hhbmdlVmFsdWVNYXBwaW5nX19EYXRhQXNzaWdubWVudF80ICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6OTY0MToyOiAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZVZhbHVlTWFwcGluZ19fRGF0YUFzc2lnbm1lbnRfNCApCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldERhdGFJbnRlcmNoYW5nZVZhbHVlTWFwcGluZ0FjY2VzcygpLmdldERhdGFBc3NpZ25tZW50XzQoKSk7IAogICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6ODMwNDoyOiAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZVZhbHVlTWFwcGluZ19fRGF0YUFzc2lnbm1lbnRfNCApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo4MzA0OjM6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZVZhbHVlTWFwcGluZ19fRGF0YUFzc2lnbm1lbnRfNAorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6OTY0MjoyOiAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZVZhbHVlTWFwcGluZ19fRGF0YUFzc2lnbm1lbnRfNCApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo5NjQyOjM6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZVZhbHVlTWFwcGluZ19fRGF0YUFzc2lnbm1lbnRfNAogICAgICAgICAgICAgewogICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMik7CiAgICAgICAgICAgICBydWxlX19EYXRhSW50ZXJjaGFuZ2VWYWx1ZU1hcHBpbmdfX0RhdGFBc3NpZ25tZW50XzQoKTsKQEAgLTI4NTY0LDE2ICszMzAyMSwxNiBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX0RhdGFJbnRlcmNoYW5nZUJsb2JNYXBwaW5nX19Hcm91cF9fMCIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo4MzEzOjE6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUJsb2JNYXBwaW5nX19Hcm91cF9fMCA6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUJsb2JNYXBwaW5nX19Hcm91cF9fMF9fSW1wbCBydWxlX19EYXRhSW50ZXJjaGFuZ2VCbG9iTWFwcGluZ19fR3JvdXBfXzEgOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjk2NTE6MTogcnVsZV9fRGF0YUludGVyY2hhbmdlQmxvYk1hcHBpbmdfX0dyb3VwX18wIDogcnVsZV9fRGF0YUludGVyY2hhbmdlQmxvYk1hcHBpbmdfX0dyb3VwX18wX19JbXBsIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUJsb2JNYXBwaW5nX19Hcm91cF9fMSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fRGF0YUludGVyY2hhbmdlQmxvYk1hcHBpbmdfX0dyb3VwX18wKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjgzMTc6MTogKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VCbG9iTWFwcGluZ19fR3JvdXBfXzBfX0ltcGwgcnVsZV9fRGF0YUludGVyY2hhbmdlQmxvYk1hcHBpbmdfX0dyb3VwX18xICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjgzMTg6MjogcnVsZV9fRGF0YUludGVyY2hhbmdlQmxvYk1hcHBpbmdfX0dyb3VwX18wX19JbXBsIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUJsb2JNYXBwaW5nX19Hcm91cF9fMQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6OTY1NToxOiAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUJsb2JNYXBwaW5nX19Hcm91cF9fMF9fSW1wbCBydWxlX19EYXRhSW50ZXJjaGFuZ2VCbG9iTWFwcGluZ19fR3JvdXBfXzEgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6OTY1NjoyOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VCbG9iTWFwcGluZ19fR3JvdXBfXzBfX0ltcGwgcnVsZV9fRGF0YUludGVyY2hhbmdlQmxvYk1hcHBpbmdfX0dyb3VwX18xCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV181OSk7CisgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV182Nyk7CiAgICAgICAgICAgICBydWxlX19EYXRhSW50ZXJjaGFuZ2VCbG9iTWFwcGluZ19fR3JvdXBfXzBfX0ltcGwoKTsKIAogICAgICAgICAgICAgc3RhdGUuX2ZzcC0tOwpAQCAtMjg2MDIsMjMgKzMzMDU5LDIzIEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fRGF0YUludGVyY2hhbmdlQmxvYk1hcHBpbmdfX0dyb3VwX18wX19JbXBsIgotICAgIC8vIEludGVybmFsRGF0YURTTC5nOjgzMjU6MTogcnVsZV9fRGF0YUludGVyY2hhbmdlQmxvYk1hcHBpbmdfX0dyb3VwX18wX19JbXBsIDogKCAoKSApIDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo5NjYzOjE6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUJsb2JNYXBwaW5nX19Hcm91cF9fMF9fSW1wbCA6ICggKCkgKSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fRGF0YUludGVyY2hhbmdlQmxvYk1hcHBpbmdfX0dyb3VwX18wX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjgzMjk6MTogKCAoICgpICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6ODMzMDoxOiAoICgpICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjk2Njc6MTogKCAoICgpICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6OTY2ODoxOiAoICgpICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjgzMzA6MTogKCAoKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo4MzMxOjI6ICgpCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo5NjY4OjE6ICggKCkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6OTY2OToyOiAoKQogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXREYXRhSW50ZXJjaGFuZ2VCbG9iTWFwcGluZ0FjY2VzcygpLmdldERhdGFJbnRlcmNoYW5nZUJsb2JNYXBwaW5nQWN0aW9uXzAoKSk7IAogICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6ODMzMjoyOiAoKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6ODMzMjozOiAKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjk2NzA6MjogKCkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjk2NzA6MzogCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICB9CiAKQEAgLTI4NjQzLDE0ICszMzEwMCwxNCBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX0RhdGFJbnRlcmNoYW5nZUJsb2JNYXBwaW5nX19Hcm91cF9fMSIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo4MzQwOjE6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUJsb2JNYXBwaW5nX19Hcm91cF9fMSA6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUJsb2JNYXBwaW5nX19Hcm91cF9fMV9fSW1wbCBydWxlX19EYXRhSW50ZXJjaGFuZ2VCbG9iTWFwcGluZ19fR3JvdXBfXzIgOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjk2Nzg6MTogcnVsZV9fRGF0YUludGVyY2hhbmdlQmxvYk1hcHBpbmdfX0dyb3VwX18xIDogcnVsZV9fRGF0YUludGVyY2hhbmdlQmxvYk1hcHBpbmdfX0dyb3VwX18xX19JbXBsIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUJsb2JNYXBwaW5nX19Hcm91cF9fMiA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fRGF0YUludGVyY2hhbmdlQmxvYk1hcHBpbmdfX0dyb3VwX18xKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjgzNDQ6MTogKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VCbG9iTWFwcGluZ19fR3JvdXBfXzFfX0ltcGwgcnVsZV9fRGF0YUludGVyY2hhbmdlQmxvYk1hcHBpbmdfX0dyb3VwX18yICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjgzNDU6MjogcnVsZV9fRGF0YUludGVyY2hhbmdlQmxvYk1hcHBpbmdfX0dyb3VwX18xX19JbXBsIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUJsb2JNYXBwaW5nX19Hcm91cF9fMgorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6OTY4MjoxOiAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUJsb2JNYXBwaW5nX19Hcm91cF9fMV9fSW1wbCBydWxlX19EYXRhSW50ZXJjaGFuZ2VCbG9iTWFwcGluZ19fR3JvdXBfXzIgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6OTY4MzoyOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VCbG9iTWFwcGluZ19fR3JvdXBfXzFfX0ltcGwgcnVsZV9fRGF0YUludGVyY2hhbmdlQmxvYk1hcHBpbmdfX0dyb3VwX18yCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV183KTsKICAgICAgICAgICAgIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUJsb2JNYXBwaW5nX19Hcm91cF9fMV9fSW1wbCgpOwpAQCAtMjg2ODEsMjIgKzMzMTM4LDIyIEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fRGF0YUludGVyY2hhbmdlQmxvYk1hcHBpbmdfX0dyb3VwX18xX19JbXBsIgotICAgIC8vIEludGVybmFsRGF0YURTTC5nOjgzNTI6MTogcnVsZV9fRGF0YUludGVyY2hhbmdlQmxvYk1hcHBpbmdfX0dyb3VwX18xX19JbXBsIDogKCAnbWFwQmxvYicgKSA7CisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6OTY5MDoxOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VCbG9iTWFwcGluZ19fR3JvdXBfXzFfX0ltcGwgOiAoICdtYXBCbG9iJyApIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19EYXRhSW50ZXJjaGFuZ2VCbG9iTWFwcGluZ19fR3JvdXBfXzFfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6ODM1NjoxOiAoICggJ21hcEJsb2InICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6ODM1NzoxOiAoICdtYXBCbG9iJyApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo5Njk0OjE6ICggKCAnbWFwQmxvYicgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo5Njk1OjE6ICggJ21hcEJsb2InICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjgzNTc6MTogKCAnbWFwQmxvYicgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6ODM1ODoyOiAnbWFwQmxvYicKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjk2OTU6MTogKCAnbWFwQmxvYicgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6OTY5NjoyOiAnbWFwQmxvYicKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YUludGVyY2hhbmdlQmxvYk1hcHBpbmdBY2Nlc3MoKS5nZXRNYXBCbG9iS2V5d29yZF8xKCkpOyAKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1hdGNoKGlucHV0LDEwOSxGT0xMT1dfMik7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CisgICAgICAgICAgICBtYXRjaChpbnB1dCwxMTksRk9MTE9XXzIpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOwogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBhZnRlcihncmFtbWFyQWNjZXNzLmdldERhdGFJbnRlcmNoYW5nZUJsb2JNYXBwaW5nQWNjZXNzKCkuZ2V0TWFwQmxvYktleXdvcmRfMSgpKTsgCiAgICAgICAgICAgICB9CkBAIC0yODcyMiwxNiArMzMxNzksMTYgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19EYXRhSW50ZXJjaGFuZ2VCbG9iTWFwcGluZ19fR3JvdXBfXzIiCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6ODM2NzoxOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VCbG9iTWFwcGluZ19fR3JvdXBfXzIgOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VCbG9iTWFwcGluZ19fR3JvdXBfXzJfX0ltcGwgcnVsZV9fRGF0YUludGVyY2hhbmdlQmxvYk1hcHBpbmdfX0dyb3VwX18zIDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo5NzA1OjE6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUJsb2JNYXBwaW5nX19Hcm91cF9fMiA6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUJsb2JNYXBwaW5nX19Hcm91cF9fMl9fSW1wbCBydWxlX19EYXRhSW50ZXJjaGFuZ2VCbG9iTWFwcGluZ19fR3JvdXBfXzMgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUJsb2JNYXBwaW5nX19Hcm91cF9fMigpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo4MzcxOjE6ICggcnVsZV9fRGF0YUludGVyY2hhbmdlQmxvYk1hcHBpbmdfX0dyb3VwX18yX19JbXBsIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUJsb2JNYXBwaW5nX19Hcm91cF9fMyApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo4MzcyOjI6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUJsb2JNYXBwaW5nX19Hcm91cF9fMl9fSW1wbCBydWxlX19EYXRhSW50ZXJjaGFuZ2VCbG9iTWFwcGluZ19fR3JvdXBfXzMKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjk3MDk6MTogKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VCbG9iTWFwcGluZ19fR3JvdXBfXzJfX0ltcGwgcnVsZV9fRGF0YUludGVyY2hhbmdlQmxvYk1hcHBpbmdfX0dyb3VwX18zICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjk3MTA6MjogcnVsZV9fRGF0YUludGVyY2hhbmdlQmxvYk1hcHBpbmdfX0dyb3VwX18yX19JbXBsIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUJsb2JNYXBwaW5nX19Hcm91cF9fMwogICAgICAgICAgICAgewotICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfNTgpOworICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfNjYpOwogICAgICAgICAgICAgcnVsZV9fRGF0YUludGVyY2hhbmdlQmxvYk1hcHBpbmdfX0dyb3VwX18yX19JbXBsKCk7CiAKICAgICAgICAgICAgIHN0YXRlLl9mc3AtLTsKQEAgLTI4NzYwLDIzICszMzIxNywyMyBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX0RhdGFJbnRlcmNoYW5nZUJsb2JNYXBwaW5nX19Hcm91cF9fMl9fSW1wbCIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo4Mzc5OjE6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUJsb2JNYXBwaW5nX19Hcm91cF9fMl9fSW1wbCA6ICggKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VCbG9iTWFwcGluZ19fUHJvcGVydHlBc3NpZ25tZW50XzIgKSApIDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo5NzE3OjE6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUJsb2JNYXBwaW5nX19Hcm91cF9fMl9fSW1wbCA6ICggKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VCbG9iTWFwcGluZ19fUHJvcGVydHlBc3NpZ25tZW50XzIgKSApIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19EYXRhSW50ZXJjaGFuZ2VCbG9iTWFwcGluZ19fR3JvdXBfXzJfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6ODM4MzoxOiAoICggKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VCbG9iTWFwcGluZ19fUHJvcGVydHlBc3NpZ25tZW50XzIgKSApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjgzODQ6MTogKCAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUJsb2JNYXBwaW5nX19Qcm9wZXJ0eUFzc2lnbm1lbnRfMiApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjk3MjE6MTogKCAoICggcnVsZV9fRGF0YUludGVyY2hhbmdlQmxvYk1hcHBpbmdfX1Byb3BlcnR5QXNzaWdubWVudF8yICkgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo5NzIyOjE6ICggKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VCbG9iTWFwcGluZ19fUHJvcGVydHlBc3NpZ25tZW50XzIgKSApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo4Mzg0OjE6ICggKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VCbG9iTWFwcGluZ19fUHJvcGVydHlBc3NpZ25tZW50XzIgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo4Mzg1OjI6ICggcnVsZV9fRGF0YUludGVyY2hhbmdlQmxvYk1hcHBpbmdfX1Byb3BlcnR5QXNzaWdubWVudF8yICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjk3MjI6MTogKCAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUJsb2JNYXBwaW5nX19Qcm9wZXJ0eUFzc2lnbm1lbnRfMiApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjk3MjM6MjogKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VCbG9iTWFwcGluZ19fUHJvcGVydHlBc3NpZ25tZW50XzIgKQogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXREYXRhSW50ZXJjaGFuZ2VCbG9iTWFwcGluZ0FjY2VzcygpLmdldFByb3BlcnR5QXNzaWdubWVudF8yKCkpOyAKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjgzODY6MjogKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VCbG9iTWFwcGluZ19fUHJvcGVydHlBc3NpZ25tZW50XzIgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6ODM4NjozOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VCbG9iTWFwcGluZ19fUHJvcGVydHlBc3NpZ25tZW50XzIKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjk3MjQ6MjogKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VCbG9iTWFwcGluZ19fUHJvcGVydHlBc3NpZ25tZW50XzIgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6OTcyNDozOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VCbG9iTWFwcGluZ19fUHJvcGVydHlBc3NpZ25tZW50XzIKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzIpOwogICAgICAgICAgICAgcnVsZV9fRGF0YUludGVyY2hhbmdlQmxvYk1hcHBpbmdfX1Byb3BlcnR5QXNzaWdubWVudF8yKCk7CkBAIC0yODgxMSwxNCArMzMyNjgsMTQgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19EYXRhSW50ZXJjaGFuZ2VCbG9iTWFwcGluZ19fR3JvdXBfXzMiCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6ODM5NDoxOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VCbG9iTWFwcGluZ19fR3JvdXBfXzMgOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VCbG9iTWFwcGluZ19fR3JvdXBfXzNfX0ltcGwgcnVsZV9fRGF0YUludGVyY2hhbmdlQmxvYk1hcHBpbmdfX0dyb3VwX180IDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo5NzMyOjE6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUJsb2JNYXBwaW5nX19Hcm91cF9fMyA6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUJsb2JNYXBwaW5nX19Hcm91cF9fM19fSW1wbCBydWxlX19EYXRhSW50ZXJjaGFuZ2VCbG9iTWFwcGluZ19fR3JvdXBfXzQgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUJsb2JNYXBwaW5nX19Hcm91cF9fMygpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo4Mzk4OjE6ICggcnVsZV9fRGF0YUludGVyY2hhbmdlQmxvYk1hcHBpbmdfX0dyb3VwX18zX19JbXBsIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUJsb2JNYXBwaW5nX19Hcm91cF9fNCApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo4Mzk5OjI6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUJsb2JNYXBwaW5nX19Hcm91cF9fM19fSW1wbCBydWxlX19EYXRhSW50ZXJjaGFuZ2VCbG9iTWFwcGluZ19fR3JvdXBfXzQKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjk3MzY6MTogKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VCbG9iTWFwcGluZ19fR3JvdXBfXzNfX0ltcGwgcnVsZV9fRGF0YUludGVyY2hhbmdlQmxvYk1hcHBpbmdfX0dyb3VwX180ICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjk3Mzc6MjogcnVsZV9fRGF0YUludGVyY2hhbmdlQmxvYk1hcHBpbmdfX0dyb3VwX18zX19JbXBsIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUJsb2JNYXBwaW5nX19Hcm91cF9fNAogICAgICAgICAgICAgewogICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfOSk7CiAgICAgICAgICAgICBydWxlX19EYXRhSW50ZXJjaGFuZ2VCbG9iTWFwcGluZ19fR3JvdXBfXzNfX0ltcGwoKTsKQEAgLTI4ODQ5LDIyICszMzMwNiwyMiBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX0RhdGFJbnRlcmNoYW5nZUJsb2JNYXBwaW5nX19Hcm91cF9fM19fSW1wbCIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo4NDA2OjE6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUJsb2JNYXBwaW5nX19Hcm91cF9fM19fSW1wbCA6ICggJ3RvJyApIDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo5NzQ0OjE6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUJsb2JNYXBwaW5nX19Hcm91cF9fM19fSW1wbCA6ICggJ3RvJyApIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19EYXRhSW50ZXJjaGFuZ2VCbG9iTWFwcGluZ19fR3JvdXBfXzNfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6ODQxMDoxOiAoICggJ3RvJyApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjg0MTE6MTogKCAndG8nICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjk3NDg6MTogKCAoICd0bycgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo5NzQ5OjE6ICggJ3RvJyApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo4NDExOjE6ICggJ3RvJyApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo4NDEyOjI6ICd0bycKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjk3NDk6MTogKCAndG8nICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjk3NTA6MjogJ3RvJwogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXREYXRhSW50ZXJjaGFuZ2VCbG9iTWFwcGluZ0FjY2VzcygpLmdldFRvS2V5d29yZF8zKCkpOyAKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1hdGNoKGlucHV0LDEwOCxGT0xMT1dfMik7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CisgICAgICAgICAgICBtYXRjaChpbnB1dCwxMTgsRk9MTE9XXzIpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOwogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBhZnRlcihncmFtbWFyQWNjZXNzLmdldERhdGFJbnRlcmNoYW5nZUJsb2JNYXBwaW5nQWNjZXNzKCkuZ2V0VG9LZXl3b3JkXzMoKSk7IAogICAgICAgICAgICAgfQpAQCAtMjg4OTAsMTYgKzMzMzQ3LDE2IEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fRGF0YUludGVyY2hhbmdlQmxvYk1hcHBpbmdfX0dyb3VwX180IgotICAgIC8vIEludGVybmFsRGF0YURTTC5nOjg0MjE6MTogcnVsZV9fRGF0YUludGVyY2hhbmdlQmxvYk1hcHBpbmdfX0dyb3VwX180IDogcnVsZV9fRGF0YUludGVyY2hhbmdlQmxvYk1hcHBpbmdfX0dyb3VwX180X19JbXBsIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUJsb2JNYXBwaW5nX19Hcm91cF9fNSA7CisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6OTc1OToxOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VCbG9iTWFwcGluZ19fR3JvdXBfXzQgOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VCbG9iTWFwcGluZ19fR3JvdXBfXzRfX0ltcGwgcnVsZV9fRGF0YUludGVyY2hhbmdlQmxvYk1hcHBpbmdfX0dyb3VwX181IDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19EYXRhSW50ZXJjaGFuZ2VCbG9iTWFwcGluZ19fR3JvdXBfXzQoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6ODQyNToxOiAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUJsb2JNYXBwaW5nX19Hcm91cF9fNF9fSW1wbCBydWxlX19EYXRhSW50ZXJjaGFuZ2VCbG9iTWFwcGluZ19fR3JvdXBfXzUgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6ODQyNjoyOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VCbG9iTWFwcGluZ19fR3JvdXBfXzRfX0ltcGwgcnVsZV9fRGF0YUludGVyY2hhbmdlQmxvYk1hcHBpbmdfX0dyb3VwX181CisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo5NzYzOjE6ICggcnVsZV9fRGF0YUludGVyY2hhbmdlQmxvYk1hcHBpbmdfX0dyb3VwX180X19JbXBsIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUJsb2JNYXBwaW5nX19Hcm91cF9fNSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo5NzY0OjI6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUJsb2JNYXBwaW5nX19Hcm91cF9fNF9fSW1wbCBydWxlX19EYXRhSW50ZXJjaGFuZ2VCbG9iTWFwcGluZ19fR3JvdXBfXzUKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzYwKTsKKyAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzY4KTsKICAgICAgICAgICAgIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUJsb2JNYXBwaW5nX19Hcm91cF9fNF9fSW1wbCgpOwogCiAgICAgICAgICAgICBzdGF0ZS5fZnNwLS07CkBAIC0yODkyOCwyMyArMzMzODUsMjMgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19EYXRhSW50ZXJjaGFuZ2VCbG9iTWFwcGluZ19fR3JvdXBfXzRfX0ltcGwiCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6ODQzMzoxOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VCbG9iTWFwcGluZ19fR3JvdXBfXzRfX0ltcGwgOiAoICggcnVsZV9fRGF0YUludGVyY2hhbmdlQmxvYk1hcHBpbmdfX0RhdGFBc3NpZ25tZW50XzQgKSApIDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo5NzcxOjE6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUJsb2JNYXBwaW5nX19Hcm91cF9fNF9fSW1wbCA6ICggKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VCbG9iTWFwcGluZ19fRGF0YUFzc2lnbm1lbnRfNCApICkgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUJsb2JNYXBwaW5nX19Hcm91cF9fNF9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo4NDM3OjE6ICggKCAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUJsb2JNYXBwaW5nX19EYXRhQXNzaWdubWVudF80ICkgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo4NDM4OjE6ICggKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VCbG9iTWFwcGluZ19fRGF0YUFzc2lnbm1lbnRfNCApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjk3NzU6MTogKCAoICggcnVsZV9fRGF0YUludGVyY2hhbmdlQmxvYk1hcHBpbmdfX0RhdGFBc3NpZ25tZW50XzQgKSApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjk3NzY6MTogKCAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUJsb2JNYXBwaW5nX19EYXRhQXNzaWdubWVudF80ICkgKQogICAgICAgICAgICAgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6ODQzODoxOiAoICggcnVsZV9fRGF0YUludGVyY2hhbmdlQmxvYk1hcHBpbmdfX0RhdGFBc3NpZ25tZW50XzQgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo4NDM5OjI6ICggcnVsZV9fRGF0YUludGVyY2hhbmdlQmxvYk1hcHBpbmdfX0RhdGFBc3NpZ25tZW50XzQgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6OTc3NjoxOiAoICggcnVsZV9fRGF0YUludGVyY2hhbmdlQmxvYk1hcHBpbmdfX0RhdGFBc3NpZ25tZW50XzQgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo5Nzc3OjI6ICggcnVsZV9fRGF0YUludGVyY2hhbmdlQmxvYk1hcHBpbmdfX0RhdGFBc3NpZ25tZW50XzQgKQogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXREYXRhSW50ZXJjaGFuZ2VCbG9iTWFwcGluZ0FjY2VzcygpLmdldERhdGFBc3NpZ25tZW50XzQoKSk7IAogICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6ODQ0MDoyOiAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUJsb2JNYXBwaW5nX19EYXRhQXNzaWdubWVudF80ICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjg0NDA6MzogcnVsZV9fRGF0YUludGVyY2hhbmdlQmxvYk1hcHBpbmdfX0RhdGFBc3NpZ25tZW50XzQKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjk3Nzg6MjogKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VCbG9iTWFwcGluZ19fRGF0YUFzc2lnbm1lbnRfNCApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo5Nzc4OjM6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUJsb2JNYXBwaW5nX19EYXRhQXNzaWdubWVudF80CiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV18yKTsKICAgICAgICAgICAgIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUJsb2JNYXBwaW5nX19EYXRhQXNzaWdubWVudF80KCk7CkBAIC0yODk3OSwxNiArMzM0MzYsMTYgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19EYXRhSW50ZXJjaGFuZ2VCbG9iTWFwcGluZ19fR3JvdXBfXzUiCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6ODQ0ODoxOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VCbG9iTWFwcGluZ19fR3JvdXBfXzUgOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VCbG9iTWFwcGluZ19fR3JvdXBfXzVfX0ltcGwgcnVsZV9fRGF0YUludGVyY2hhbmdlQmxvYk1hcHBpbmdfX0dyb3VwX182IDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo5Nzg2OjE6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUJsb2JNYXBwaW5nX19Hcm91cF9fNSA6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUJsb2JNYXBwaW5nX19Hcm91cF9fNV9fSW1wbCBydWxlX19EYXRhSW50ZXJjaGFuZ2VCbG9iTWFwcGluZ19fR3JvdXBfXzYgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUJsb2JNYXBwaW5nX19Hcm91cF9fNSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo4NDUyOjE6ICggcnVsZV9fRGF0YUludGVyY2hhbmdlQmxvYk1hcHBpbmdfX0dyb3VwX181X19JbXBsIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUJsb2JNYXBwaW5nX19Hcm91cF9fNiApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo4NDUzOjI6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUJsb2JNYXBwaW5nX19Hcm91cF9fNV9fSW1wbCBydWxlX19EYXRhSW50ZXJjaGFuZ2VCbG9iTWFwcGluZ19fR3JvdXBfXzYKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjk3OTA6MTogKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VCbG9iTWFwcGluZ19fR3JvdXBfXzVfX0ltcGwgcnVsZV9fRGF0YUludGVyY2hhbmdlQmxvYk1hcHBpbmdfX0dyb3VwX182ICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjk3OTE6MjogcnVsZV9fRGF0YUludGVyY2hhbmdlQmxvYk1hcHBpbmdfX0dyb3VwX181X19JbXBsIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUJsb2JNYXBwaW5nX19Hcm91cF9fNgogICAgICAgICAgICAgewotICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfNjApOworICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfNjgpOwogICAgICAgICAgICAgcnVsZV9fRGF0YUludGVyY2hhbmdlQmxvYk1hcHBpbmdfX0dyb3VwX181X19JbXBsKCk7CiAKICAgICAgICAgICAgIHN0YXRlLl9mc3AtLTsKQEAgLTI5MDE3LDMxICszMzQ3NCwzMSBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX0RhdGFJbnRlcmNoYW5nZUJsb2JNYXBwaW5nX19Hcm91cF9fNV9fSW1wbCIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo4NDYwOjE6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUJsb2JNYXBwaW5nX19Hcm91cF9fNV9fSW1wbCA6ICggKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VCbG9iTWFwcGluZ19fR3JvdXBfNV9fMCApPyApIDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo5Nzk4OjE6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUJsb2JNYXBwaW5nX19Hcm91cF9fNV9fSW1wbCA6ICggKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VCbG9iTWFwcGluZ19fR3JvdXBfNV9fMCApPyApIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19EYXRhSW50ZXJjaGFuZ2VCbG9iTWFwcGluZ19fR3JvdXBfXzVfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6ODQ2NDoxOiAoICggKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VCbG9iTWFwcGluZ19fR3JvdXBfNV9fMCApPyApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjg0NjU6MTogKCAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUJsb2JNYXBwaW5nX19Hcm91cF81X18wICk/ICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjk4MDI6MTogKCAoICggcnVsZV9fRGF0YUludGVyY2hhbmdlQmxvYk1hcHBpbmdfX0dyb3VwXzVfXzAgKT8gKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo5ODAzOjE6ICggKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VCbG9iTWFwcGluZ19fR3JvdXBfNV9fMCApPyApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo4NDY1OjE6ICggKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VCbG9iTWFwcGluZ19fR3JvdXBfNV9fMCApPyApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo4NDY2OjI6ICggcnVsZV9fRGF0YUludGVyY2hhbmdlQmxvYk1hcHBpbmdfX0dyb3VwXzVfXzAgKT8KKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjk4MDM6MTogKCAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUJsb2JNYXBwaW5nX19Hcm91cF81X18wICk/ICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjk4MDQ6MjogKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VCbG9iTWFwcGluZ19fR3JvdXBfNV9fMCApPwogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXREYXRhSW50ZXJjaGFuZ2VCbG9iTWFwcGluZ0FjY2VzcygpLmdldEdyb3VwXzUoKSk7IAogICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6ODQ2NzoyOiAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUJsb2JNYXBwaW5nX19Hcm91cF81X18wICk/Ci0gICAgICAgICAgICBpbnQgYWx0ODE9MjsKLSAgICAgICAgICAgIGludCBMQTgxXzAgPSBpbnB1dC5MQSgxKTsKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjk4MDU6MjogKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VCbG9iTWFwcGluZ19fR3JvdXBfNV9fMCApPworICAgICAgICAgICAgaW50IGFsdDk0PTI7CisgICAgICAgICAgICBpbnQgTEE5NF8wID0gaW5wdXQuTEEoMSk7CiAKLSAgICAgICAgICAgIGlmICggKExBODFfMD09NDgpICkgewotICAgICAgICAgICAgICAgIGFsdDgxPTE7CisgICAgICAgICAgICBpZiAoIChMQTk0XzA9PTQ4KSApIHsKKyAgICAgICAgICAgICAgICBhbHQ5ND0xOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgc3dpdGNoIChhbHQ4MSkgeworICAgICAgICAgICAgc3dpdGNoIChhbHQ5NCkgewogICAgICAgICAgICAgICAgIGNhc2UgMSA6Ci0gICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjg0Njc6MzogcnVsZV9fRGF0YUludGVyY2hhbmdlQmxvYk1hcHBpbmdfX0dyb3VwXzVfXzAKKyAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6OTgwNTozOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VCbG9iTWFwcGluZ19fR3JvdXBfNV9fMAogICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzIpOwogICAgICAgICAgICAgICAgICAgICBydWxlX19EYXRhSW50ZXJjaGFuZ2VCbG9iTWFwcGluZ19fR3JvdXBfNV9fMCgpOwpAQCAtMjkwNzksMTYgKzMzNTM2LDE2IEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fRGF0YUludGVyY2hhbmdlQmxvYk1hcHBpbmdfX0dyb3VwX182IgotICAgIC8vIEludGVybmFsRGF0YURTTC5nOjg0NzU6MTogcnVsZV9fRGF0YUludGVyY2hhbmdlQmxvYk1hcHBpbmdfX0dyb3VwX182IDogcnVsZV9fRGF0YUludGVyY2hhbmdlQmxvYk1hcHBpbmdfX0dyb3VwX182X19JbXBsIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUJsb2JNYXBwaW5nX19Hcm91cF9fNyA7CisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6OTgxMzoxOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VCbG9iTWFwcGluZ19fR3JvdXBfXzYgOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VCbG9iTWFwcGluZ19fR3JvdXBfXzZfX0ltcGwgcnVsZV9fRGF0YUludGVyY2hhbmdlQmxvYk1hcHBpbmdfX0dyb3VwX183IDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19EYXRhSW50ZXJjaGFuZ2VCbG9iTWFwcGluZ19fR3JvdXBfXzYoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6ODQ3OToxOiAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUJsb2JNYXBwaW5nX19Hcm91cF9fNl9fSW1wbCBydWxlX19EYXRhSW50ZXJjaGFuZ2VCbG9iTWFwcGluZ19fR3JvdXBfXzcgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6ODQ4MDoyOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VCbG9iTWFwcGluZ19fR3JvdXBfXzZfX0ltcGwgcnVsZV9fRGF0YUludGVyY2hhbmdlQmxvYk1hcHBpbmdfX0dyb3VwX183CisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo5ODE3OjE6ICggcnVsZV9fRGF0YUludGVyY2hhbmdlQmxvYk1hcHBpbmdfX0dyb3VwX182X19JbXBsIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUJsb2JNYXBwaW5nX19Hcm91cF9fNyApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo5ODE4OjI6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUJsb2JNYXBwaW5nX19Hcm91cF9fNl9fSW1wbCBydWxlX19EYXRhSW50ZXJjaGFuZ2VCbG9iTWFwcGluZ19fR3JvdXBfXzcKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzYwKTsKKyAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzY4KTsKICAgICAgICAgICAgIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUJsb2JNYXBwaW5nX19Hcm91cF9fNl9fSW1wbCgpOwogCiAgICAgICAgICAgICBzdGF0ZS5fZnNwLS07CkBAIC0yOTExNywzMSArMzM1NzQsMzEgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19EYXRhSW50ZXJjaGFuZ2VCbG9iTWFwcGluZ19fR3JvdXBfXzZfX0ltcGwiCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6ODQ4NzoxOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VCbG9iTWFwcGluZ19fR3JvdXBfXzZfX0ltcGwgOiAoICggcnVsZV9fRGF0YUludGVyY2hhbmdlQmxvYk1hcHBpbmdfX0dyb3VwXzZfXzAgKT8gKSA7CisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6OTgyNToxOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VCbG9iTWFwcGluZ19fR3JvdXBfXzZfX0ltcGwgOiAoICggcnVsZV9fRGF0YUludGVyY2hhbmdlQmxvYk1hcHBpbmdfX0dyb3VwXzZfXzAgKT8gKSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fRGF0YUludGVyY2hhbmdlQmxvYk1hcHBpbmdfX0dyb3VwX182X19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjg0OTE6MTogKCAoICggcnVsZV9fRGF0YUludGVyY2hhbmdlQmxvYk1hcHBpbmdfX0dyb3VwXzZfXzAgKT8gKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo4NDkyOjE6ICggKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VCbG9iTWFwcGluZ19fR3JvdXBfNl9fMCApPyApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo5ODI5OjE6ICggKCAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUJsb2JNYXBwaW5nX19Hcm91cF82X18wICk/ICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6OTgzMDoxOiAoICggcnVsZV9fRGF0YUludGVyY2hhbmdlQmxvYk1hcHBpbmdfX0dyb3VwXzZfXzAgKT8gKQogICAgICAgICAgICAgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6ODQ5MjoxOiAoICggcnVsZV9fRGF0YUludGVyY2hhbmdlQmxvYk1hcHBpbmdfX0dyb3VwXzZfXzAgKT8gKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6ODQ5MzoyOiAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUJsb2JNYXBwaW5nX19Hcm91cF82X18wICk/CisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo5ODMwOjE6ICggKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VCbG9iTWFwcGluZ19fR3JvdXBfNl9fMCApPyApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo5ODMxOjI6ICggcnVsZV9fRGF0YUludGVyY2hhbmdlQmxvYk1hcHBpbmdfX0dyb3VwXzZfXzAgKT8KICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YUludGVyY2hhbmdlQmxvYk1hcHBpbmdBY2Nlc3MoKS5nZXRHcm91cF82KCkpOyAKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjg0OTQ6MjogKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VCbG9iTWFwcGluZ19fR3JvdXBfNl9fMCApPwotICAgICAgICAgICAgaW50IGFsdDgyPTI7Ci0gICAgICAgICAgICBpbnQgTEE4Ml8wID0gaW5wdXQuTEEoMSk7CisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo5ODMyOjI6ICggcnVsZV9fRGF0YUludGVyY2hhbmdlQmxvYk1hcHBpbmdfX0dyb3VwXzZfXzAgKT8KKyAgICAgICAgICAgIGludCBhbHQ5NT0yOworICAgICAgICAgICAgaW50IExBOTVfMCA9IGlucHV0LkxBKDEpOwogCi0gICAgICAgICAgICBpZiAoIChMQTgyXzA9PTc0KSApIHsKLSAgICAgICAgICAgICAgICBhbHQ4Mj0xOworICAgICAgICAgICAgaWYgKCAoTEE5NV8wPT03OSkgKSB7CisgICAgICAgICAgICAgICAgYWx0OTU9MTsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHN3aXRjaCAoYWx0ODIpIHsKKyAgICAgICAgICAgIHN3aXRjaCAoYWx0OTUpIHsKICAgICAgICAgICAgICAgICBjYXNlIDEgOgotICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo4NDk0OjM6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUJsb2JNYXBwaW5nX19Hcm91cF82X18wCisgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjk4MzI6MzogcnVsZV9fRGF0YUludGVyY2hhbmdlQmxvYk1hcHBpbmdfX0dyb3VwXzZfXzAKICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV18yKTsKICAgICAgICAgICAgICAgICAgICAgcnVsZV9fRGF0YUludGVyY2hhbmdlQmxvYk1hcHBpbmdfX0dyb3VwXzZfXzAoKTsKQEAgLTI5MTc5LDE2ICszMzYzNiwxNiBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX0RhdGFJbnRlcmNoYW5nZUJsb2JNYXBwaW5nX19Hcm91cF9fNyIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo4NTAyOjE6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUJsb2JNYXBwaW5nX19Hcm91cF9fNyA6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUJsb2JNYXBwaW5nX19Hcm91cF9fN19fSW1wbCBydWxlX19EYXRhSW50ZXJjaGFuZ2VCbG9iTWFwcGluZ19fR3JvdXBfXzggOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjk4NDA6MTogcnVsZV9fRGF0YUludGVyY2hhbmdlQmxvYk1hcHBpbmdfX0dyb3VwX183IDogcnVsZV9fRGF0YUludGVyY2hhbmdlQmxvYk1hcHBpbmdfX0dyb3VwX183X19JbXBsIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUJsb2JNYXBwaW5nX19Hcm91cF9fOCA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fRGF0YUludGVyY2hhbmdlQmxvYk1hcHBpbmdfX0dyb3VwX183KCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjg1MDY6MTogKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VCbG9iTWFwcGluZ19fR3JvdXBfXzdfX0ltcGwgcnVsZV9fRGF0YUludGVyY2hhbmdlQmxvYk1hcHBpbmdfX0dyb3VwX184ICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjg1MDc6MjogcnVsZV9fRGF0YUludGVyY2hhbmdlQmxvYk1hcHBpbmdfX0dyb3VwX183X19JbXBsIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUJsb2JNYXBwaW5nX19Hcm91cF9fOAorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6OTg0NDoxOiAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUJsb2JNYXBwaW5nX19Hcm91cF9fN19fSW1wbCBydWxlX19EYXRhSW50ZXJjaGFuZ2VCbG9iTWFwcGluZ19fR3JvdXBfXzggKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6OTg0NToyOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VCbG9iTWFwcGluZ19fR3JvdXBfXzdfX0ltcGwgcnVsZV9fRGF0YUludGVyY2hhbmdlQmxvYk1hcHBpbmdfX0dyb3VwX184CiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV182MSk7CisgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV182OSk7CiAgICAgICAgICAgICBydWxlX19EYXRhSW50ZXJjaGFuZ2VCbG9iTWFwcGluZ19fR3JvdXBfXzdfX0ltcGwoKTsKIAogICAgICAgICAgICAgc3RhdGUuX2ZzcC0tOwpAQCAtMjkyMTcsMjIgKzMzNjc0LDIyIEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fRGF0YUludGVyY2hhbmdlQmxvYk1hcHBpbmdfX0dyb3VwX183X19JbXBsIgotICAgIC8vIEludGVybmFsRGF0YURTTC5nOjg1MTQ6MTogcnVsZV9fRGF0YUludGVyY2hhbmdlQmxvYk1hcHBpbmdfX0dyb3VwX183X19JbXBsIDogKCAnbWltZVR5cGUnICkgOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjk4NTI6MTogcnVsZV9fRGF0YUludGVyY2hhbmdlQmxvYk1hcHBpbmdfX0dyb3VwX183X19JbXBsIDogKCAnbWltZVR5cGUnICkgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUJsb2JNYXBwaW5nX19Hcm91cF9fN19fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo4NTE4OjE6ICggKCAnbWltZVR5cGUnICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6ODUxOToxOiAoICdtaW1lVHlwZScgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6OTg1NjoxOiAoICggJ21pbWVUeXBlJyApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjk4NTc6MTogKCAnbWltZVR5cGUnICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjg1MTk6MTogKCAnbWltZVR5cGUnICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjg1MjA6MjogJ21pbWVUeXBlJworICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6OTg1NzoxOiAoICdtaW1lVHlwZScgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6OTg1ODoyOiAnbWltZVR5cGUnCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldERhdGFJbnRlcmNoYW5nZUJsb2JNYXBwaW5nQWNjZXNzKCkuZ2V0TWltZVR5cGVLZXl3b3JkXzcoKSk7IAogICAgICAgICAgICAgfQotICAgICAgICAgICAgbWF0Y2goaW5wdXQsMTEwLEZPTExPV18yKTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKKyAgICAgICAgICAgIG1hdGNoKGlucHV0LDEyMCxGT0xMT1dfMik7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YUludGVyY2hhbmdlQmxvYk1hcHBpbmdBY2Nlc3MoKS5nZXRNaW1lVHlwZUtleXdvcmRfNygpKTsgCiAgICAgICAgICAgICB9CkBAIC0yOTI1OCwxNCArMzM3MTUsMTQgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19EYXRhSW50ZXJjaGFuZ2VCbG9iTWFwcGluZ19fR3JvdXBfXzgiCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6ODUyOToxOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VCbG9iTWFwcGluZ19fR3JvdXBfXzggOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VCbG9iTWFwcGluZ19fR3JvdXBfXzhfX0ltcGwgOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjk4Njc6MTogcnVsZV9fRGF0YUludGVyY2hhbmdlQmxvYk1hcHBpbmdfX0dyb3VwX184IDogcnVsZV9fRGF0YUludGVyY2hhbmdlQmxvYk1hcHBpbmdfX0dyb3VwX184X19JbXBsIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19EYXRhSW50ZXJjaGFuZ2VCbG9iTWFwcGluZ19fR3JvdXBfXzgoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6ODUzMzoxOiAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUJsb2JNYXBwaW5nX19Hcm91cF9fOF9fSW1wbCApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo4NTM0OjI6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUJsb2JNYXBwaW5nX19Hcm91cF9fOF9fSW1wbAorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6OTg3MToxOiAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUJsb2JNYXBwaW5nX19Hcm91cF9fOF9fSW1wbCApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo5ODcyOjI6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUJsb2JNYXBwaW5nX19Hcm91cF9fOF9fSW1wbAogICAgICAgICAgICAgewogICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMik7CiAgICAgICAgICAgICBydWxlX19EYXRhSW50ZXJjaGFuZ2VCbG9iTWFwcGluZ19fR3JvdXBfXzhfX0ltcGwoKTsKQEAgLTI5MjkxLDIzICszMzc0OCwyMyBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX0RhdGFJbnRlcmNoYW5nZUJsb2JNYXBwaW5nX19Hcm91cF9fOF9fSW1wbCIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo4NTQwOjE6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUJsb2JNYXBwaW5nX19Hcm91cF9fOF9fSW1wbCA6ICggKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VCbG9iTWFwcGluZ19fTWltZVR5cGVBc3NpZ25tZW50XzggKSApIDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo5ODc4OjE6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUJsb2JNYXBwaW5nX19Hcm91cF9fOF9fSW1wbCA6ICggKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VCbG9iTWFwcGluZ19fTWltZVR5cGVBc3NpZ25tZW50XzggKSApIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19EYXRhSW50ZXJjaGFuZ2VCbG9iTWFwcGluZ19fR3JvdXBfXzhfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6ODU0NDoxOiAoICggKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VCbG9iTWFwcGluZ19fTWltZVR5cGVBc3NpZ25tZW50XzggKSApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjg1NDU6MTogKCAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUJsb2JNYXBwaW5nX19NaW1lVHlwZUFzc2lnbm1lbnRfOCApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjk4ODI6MTogKCAoICggcnVsZV9fRGF0YUludGVyY2hhbmdlQmxvYk1hcHBpbmdfX01pbWVUeXBlQXNzaWdubWVudF84ICkgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo5ODgzOjE6ICggKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VCbG9iTWFwcGluZ19fTWltZVR5cGVBc3NpZ25tZW50XzggKSApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo4NTQ1OjE6ICggKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VCbG9iTWFwcGluZ19fTWltZVR5cGVBc3NpZ25tZW50XzggKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo4NTQ2OjI6ICggcnVsZV9fRGF0YUludGVyY2hhbmdlQmxvYk1hcHBpbmdfX01pbWVUeXBlQXNzaWdubWVudF84ICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjk4ODM6MTogKCAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUJsb2JNYXBwaW5nX19NaW1lVHlwZUFzc2lnbm1lbnRfOCApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjk4ODQ6MjogKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VCbG9iTWFwcGluZ19fTWltZVR5cGVBc3NpZ25tZW50XzggKQogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXREYXRhSW50ZXJjaGFuZ2VCbG9iTWFwcGluZ0FjY2VzcygpLmdldE1pbWVUeXBlQXNzaWdubWVudF84KCkpOyAKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjg1NDc6MjogKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VCbG9iTWFwcGluZ19fTWltZVR5cGVBc3NpZ25tZW50XzggKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6ODU0NzozOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VCbG9iTWFwcGluZ19fTWltZVR5cGVBc3NpZ25tZW50XzgKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjk4ODU6MjogKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VCbG9iTWFwcGluZ19fTWltZVR5cGVBc3NpZ25tZW50XzggKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6OTg4NTozOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VCbG9iTWFwcGluZ19fTWltZVR5cGVBc3NpZ25tZW50XzgKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzIpOwogICAgICAgICAgICAgcnVsZV9fRGF0YUludGVyY2hhbmdlQmxvYk1hcHBpbmdfX01pbWVUeXBlQXNzaWdubWVudF84KCk7CkBAIC0yOTM0MiwxNCArMzM3OTksMTQgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19EYXRhSW50ZXJjaGFuZ2VCbG9iTWFwcGluZ19fR3JvdXBfNV9fMCIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo4NTU2OjE6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUJsb2JNYXBwaW5nX19Hcm91cF81X18wIDogcnVsZV9fRGF0YUludGVyY2hhbmdlQmxvYk1hcHBpbmdfX0dyb3VwXzVfXzBfX0ltcGwgcnVsZV9fRGF0YUludGVyY2hhbmdlQmxvYk1hcHBpbmdfX0dyb3VwXzVfXzEgOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjk4OTQ6MTogcnVsZV9fRGF0YUludGVyY2hhbmdlQmxvYk1hcHBpbmdfX0dyb3VwXzVfXzAgOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VCbG9iTWFwcGluZ19fR3JvdXBfNV9fMF9fSW1wbCBydWxlX19EYXRhSW50ZXJjaGFuZ2VCbG9iTWFwcGluZ19fR3JvdXBfNV9fMSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fRGF0YUludGVyY2hhbmdlQmxvYk1hcHBpbmdfX0dyb3VwXzVfXzAoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6ODU2MDoxOiAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUJsb2JNYXBwaW5nX19Hcm91cF81X18wX19JbXBsIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUJsb2JNYXBwaW5nX19Hcm91cF81X18xICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjg1NjE6MjogcnVsZV9fRGF0YUludGVyY2hhbmdlQmxvYk1hcHBpbmdfX0dyb3VwXzVfXzBfX0ltcGwgcnVsZV9fRGF0YUludGVyY2hhbmdlQmxvYk1hcHBpbmdfX0dyb3VwXzVfXzEKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjk4OTg6MTogKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VCbG9iTWFwcGluZ19fR3JvdXBfNV9fMF9fSW1wbCBydWxlX19EYXRhSW50ZXJjaGFuZ2VCbG9iTWFwcGluZ19fR3JvdXBfNV9fMSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo5ODk5OjI6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUJsb2JNYXBwaW5nX19Hcm91cF81X18wX19JbXBsIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUJsb2JNYXBwaW5nX19Hcm91cF81X18xCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV185KTsKICAgICAgICAgICAgIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUJsb2JNYXBwaW5nX19Hcm91cF81X18wX19JbXBsKCk7CkBAIC0yOTM4MCwxNyArMzM4MzcsMTcgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19EYXRhSW50ZXJjaGFuZ2VCbG9iTWFwcGluZ19fR3JvdXBfNV9fMF9fSW1wbCIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo4NTY4OjE6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUJsb2JNYXBwaW5nX19Hcm91cF81X18wX19JbXBsIDogKCAnZXh0ZW5zaW9uJyApIDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo5OTA2OjE6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUJsb2JNYXBwaW5nX19Hcm91cF81X18wX19JbXBsIDogKCAnZXh0ZW5zaW9uJyApIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19EYXRhSW50ZXJjaGFuZ2VCbG9iTWFwcGluZ19fR3JvdXBfNV9fMF9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo4NTcyOjE6ICggKCAnZXh0ZW5zaW9uJyApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjg1NzM6MTogKCAnZXh0ZW5zaW9uJyApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo5OTEwOjE6ICggKCAnZXh0ZW5zaW9uJyApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjk5MTE6MTogKCAnZXh0ZW5zaW9uJyApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo4NTczOjE6ICggJ2V4dGVuc2lvbicgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6ODU3NDoyOiAnZXh0ZW5zaW9uJworICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6OTkxMToxOiAoICdleHRlbnNpb24nICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjk5MTI6MjogJ2V4dGVuc2lvbicKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YUludGVyY2hhbmdlQmxvYk1hcHBpbmdBY2Nlc3MoKS5nZXRFeHRlbnNpb25LZXl3b3JkXzVfMCgpKTsgCkBAIC0yOTQyMSwxNCArMzM4NzgsMTQgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19EYXRhSW50ZXJjaGFuZ2VCbG9iTWFwcGluZ19fR3JvdXBfNV9fMSIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo4NTgzOjE6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUJsb2JNYXBwaW5nX19Hcm91cF81X18xIDogcnVsZV9fRGF0YUludGVyY2hhbmdlQmxvYk1hcHBpbmdfX0dyb3VwXzVfXzFfX0ltcGwgOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjk5MjE6MTogcnVsZV9fRGF0YUludGVyY2hhbmdlQmxvYk1hcHBpbmdfX0dyb3VwXzVfXzEgOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VCbG9iTWFwcGluZ19fR3JvdXBfNV9fMV9fSW1wbCA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fRGF0YUludGVyY2hhbmdlQmxvYk1hcHBpbmdfX0dyb3VwXzVfXzEoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6ODU4NzoxOiAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUJsb2JNYXBwaW5nX19Hcm91cF81X18xX19JbXBsICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjg1ODg6MjogcnVsZV9fRGF0YUludGVyY2hhbmdlQmxvYk1hcHBpbmdfX0dyb3VwXzVfXzFfX0ltcGwKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjk5MjU6MTogKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VCbG9iTWFwcGluZ19fR3JvdXBfNV9fMV9fSW1wbCApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo5OTI2OjI6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUJsb2JNYXBwaW5nX19Hcm91cF81X18xX19JbXBsCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV18yKTsKICAgICAgICAgICAgIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUJsb2JNYXBwaW5nX19Hcm91cF81X18xX19JbXBsKCk7CkBAIC0yOTQ1NCwyMyArMzM5MTEsMjMgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19EYXRhSW50ZXJjaGFuZ2VCbG9iTWFwcGluZ19fR3JvdXBfNV9fMV9fSW1wbCIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo4NTk0OjE6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUJsb2JNYXBwaW5nX19Hcm91cF81X18xX19JbXBsIDogKCAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUJsb2JNYXBwaW5nX19CbG9iRmlsZUV4dGVuc2lvbkFzc2lnbm1lbnRfNV8xICkgKSA7CisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6OTkzMjoxOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VCbG9iTWFwcGluZ19fR3JvdXBfNV9fMV9fSW1wbCA6ICggKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VCbG9iTWFwcGluZ19fQmxvYkZpbGVFeHRlbnNpb25Bc3NpZ25tZW50XzVfMSApICkgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUJsb2JNYXBwaW5nX19Hcm91cF81X18xX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjg1OTg6MTogKCAoICggcnVsZV9fRGF0YUludGVyY2hhbmdlQmxvYk1hcHBpbmdfX0Jsb2JGaWxlRXh0ZW5zaW9uQXNzaWdubWVudF81XzEgKSApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjg1OTk6MTogKCAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUJsb2JNYXBwaW5nX19CbG9iRmlsZUV4dGVuc2lvbkFzc2lnbm1lbnRfNV8xICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6OTkzNjoxOiAoICggKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VCbG9iTWFwcGluZ19fQmxvYkZpbGVFeHRlbnNpb25Bc3NpZ25tZW50XzVfMSApICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6OTkzNzoxOiAoICggcnVsZV9fRGF0YUludGVyY2hhbmdlQmxvYk1hcHBpbmdfX0Jsb2JGaWxlRXh0ZW5zaW9uQXNzaWdubWVudF81XzEgKSApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo4NTk5OjE6ICggKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VCbG9iTWFwcGluZ19fQmxvYkZpbGVFeHRlbnNpb25Bc3NpZ25tZW50XzVfMSApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjg2MDA6MjogKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VCbG9iTWFwcGluZ19fQmxvYkZpbGVFeHRlbnNpb25Bc3NpZ25tZW50XzVfMSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo5OTM3OjE6ICggKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VCbG9iTWFwcGluZ19fQmxvYkZpbGVFeHRlbnNpb25Bc3NpZ25tZW50XzVfMSApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjk5Mzg6MjogKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VCbG9iTWFwcGluZ19fQmxvYkZpbGVFeHRlbnNpb25Bc3NpZ25tZW50XzVfMSApCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldERhdGFJbnRlcmNoYW5nZUJsb2JNYXBwaW5nQWNjZXNzKCkuZ2V0QmxvYkZpbGVFeHRlbnNpb25Bc3NpZ25tZW50XzVfMSgpKTsgCiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo4NjAxOjI6ICggcnVsZV9fRGF0YUludGVyY2hhbmdlQmxvYk1hcHBpbmdfX0Jsb2JGaWxlRXh0ZW5zaW9uQXNzaWdubWVudF81XzEgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6ODYwMTozOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VCbG9iTWFwcGluZ19fQmxvYkZpbGVFeHRlbnNpb25Bc3NpZ25tZW50XzVfMQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6OTkzOToyOiAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUJsb2JNYXBwaW5nX19CbG9iRmlsZUV4dGVuc2lvbkFzc2lnbm1lbnRfNV8xICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjk5Mzk6MzogcnVsZV9fRGF0YUludGVyY2hhbmdlQmxvYk1hcHBpbmdfX0Jsb2JGaWxlRXh0ZW5zaW9uQXNzaWdubWVudF81XzEKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzIpOwogICAgICAgICAgICAgcnVsZV9fRGF0YUludGVyY2hhbmdlQmxvYk1hcHBpbmdfX0Jsb2JGaWxlRXh0ZW5zaW9uQXNzaWdubWVudF81XzEoKTsKQEAgLTI5NTA1LDE0ICszMzk2MiwxNCBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX0RhdGFJbnRlcmNoYW5nZUJsb2JNYXBwaW5nX19Hcm91cF82X18wIgotICAgIC8vIEludGVybmFsRGF0YURTTC5nOjg2MTA6MTogcnVsZV9fRGF0YUludGVyY2hhbmdlQmxvYk1hcHBpbmdfX0dyb3VwXzZfXzAgOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VCbG9iTWFwcGluZ19fR3JvdXBfNl9fMF9fSW1wbCBydWxlX19EYXRhSW50ZXJjaGFuZ2VCbG9iTWFwcGluZ19fR3JvdXBfNl9fMSA7CisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6OTk0ODoxOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VCbG9iTWFwcGluZ19fR3JvdXBfNl9fMCA6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUJsb2JNYXBwaW5nX19Hcm91cF82X18wX19JbXBsIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUJsb2JNYXBwaW5nX19Hcm91cF82X18xIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19EYXRhSW50ZXJjaGFuZ2VCbG9iTWFwcGluZ19fR3JvdXBfNl9fMCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo4NjE0OjE6ICggcnVsZV9fRGF0YUludGVyY2hhbmdlQmxvYk1hcHBpbmdfX0dyb3VwXzZfXzBfX0ltcGwgcnVsZV9fRGF0YUludGVyY2hhbmdlQmxvYk1hcHBpbmdfX0dyb3VwXzZfXzEgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6ODYxNToyOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VCbG9iTWFwcGluZ19fR3JvdXBfNl9fMF9fSW1wbCBydWxlX19EYXRhSW50ZXJjaGFuZ2VCbG9iTWFwcGluZ19fR3JvdXBfNl9fMQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6OTk1MjoxOiAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUJsb2JNYXBwaW5nX19Hcm91cF82X18wX19JbXBsIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUJsb2JNYXBwaW5nX19Hcm91cF82X18xICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjk5NTM6MjogcnVsZV9fRGF0YUludGVyY2hhbmdlQmxvYk1hcHBpbmdfX0dyb3VwXzZfXzBfX0ltcGwgcnVsZV9fRGF0YUludGVyY2hhbmdlQmxvYk1hcHBpbmdfX0dyb3VwXzZfXzEKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzkpOwogICAgICAgICAgICAgcnVsZV9fRGF0YUludGVyY2hhbmdlQmxvYk1hcHBpbmdfX0dyb3VwXzZfXzBfX0ltcGwoKTsKQEAgLTI5NTQzLDIyICszNDAwMCwyMiBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX0RhdGFJbnRlcmNoYW5nZUJsb2JNYXBwaW5nX19Hcm91cF82X18wX19JbXBsIgotICAgIC8vIEludGVybmFsRGF0YURTTC5nOjg2MjI6MTogcnVsZV9fRGF0YUludGVyY2hhbmdlQmxvYk1hcHBpbmdfX0dyb3VwXzZfXzBfX0ltcGwgOiAoICdwYXRoJyApIDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo5OTYwOjE6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUJsb2JNYXBwaW5nX19Hcm91cF82X18wX19JbXBsIDogKCAncGF0aCcgKSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fRGF0YUludGVyY2hhbmdlQmxvYk1hcHBpbmdfX0dyb3VwXzZfXzBfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6ODYyNjoxOiAoICggJ3BhdGgnICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6ODYyNzoxOiAoICdwYXRoJyApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo5OTY0OjE6ICggKCAncGF0aCcgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo5OTY1OjE6ICggJ3BhdGgnICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjg2Mjc6MTogKCAncGF0aCcgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6ODYyODoyOiAncGF0aCcKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjk5NjU6MTogKCAncGF0aCcgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6OTk2NjoyOiAncGF0aCcKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YUludGVyY2hhbmdlQmxvYk1hcHBpbmdBY2Nlc3MoKS5nZXRQYXRoS2V5d29yZF82XzAoKSk7IAogICAgICAgICAgICAgfQotICAgICAgICAgICAgbWF0Y2goaW5wdXQsNzQsRk9MTE9XXzIpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOworICAgICAgICAgICAgbWF0Y2goaW5wdXQsNzksRk9MTE9XXzIpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOwogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBhZnRlcihncmFtbWFyQWNjZXNzLmdldERhdGFJbnRlcmNoYW5nZUJsb2JNYXBwaW5nQWNjZXNzKCkuZ2V0UGF0aEtleXdvcmRfNl8wKCkpOyAKICAgICAgICAgICAgIH0KQEAgLTI5NTg0LDE0ICszNDA0MSwxNCBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX0RhdGFJbnRlcmNoYW5nZUJsb2JNYXBwaW5nX19Hcm91cF82X18xIgotICAgIC8vIEludGVybmFsRGF0YURTTC5nOjg2Mzc6MTogcnVsZV9fRGF0YUludGVyY2hhbmdlQmxvYk1hcHBpbmdfX0dyb3VwXzZfXzEgOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VCbG9iTWFwcGluZ19fR3JvdXBfNl9fMV9fSW1wbCA7CisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6OTk3NToxOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VCbG9iTWFwcGluZ19fR3JvdXBfNl9fMSA6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUJsb2JNYXBwaW5nX19Hcm91cF82X18xX19JbXBsIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19EYXRhSW50ZXJjaGFuZ2VCbG9iTWFwcGluZ19fR3JvdXBfNl9fMSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo4NjQxOjE6ICggcnVsZV9fRGF0YUludGVyY2hhbmdlQmxvYk1hcHBpbmdfX0dyb3VwXzZfXzFfX0ltcGwgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6ODY0MjoyOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VCbG9iTWFwcGluZ19fR3JvdXBfNl9fMV9fSW1wbAorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6OTk3OToxOiAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUJsb2JNYXBwaW5nX19Hcm91cF82X18xX19JbXBsICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjk5ODA6MjogcnVsZV9fRGF0YUludGVyY2hhbmdlQmxvYk1hcHBpbmdfX0dyb3VwXzZfXzFfX0ltcGwKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzIpOwogICAgICAgICAgICAgcnVsZV9fRGF0YUludGVyY2hhbmdlQmxvYk1hcHBpbmdfX0dyb3VwXzZfXzFfX0ltcGwoKTsKQEAgLTI5NjE3LDIzICszNDA3NCwyMyBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX0RhdGFJbnRlcmNoYW5nZUJsb2JNYXBwaW5nX19Hcm91cF82X18xX19JbXBsIgotICAgIC8vIEludGVybmFsRGF0YURTTC5nOjg2NDg6MTogcnVsZV9fRGF0YUludGVyY2hhbmdlQmxvYk1hcHBpbmdfX0dyb3VwXzZfXzFfX0ltcGwgOiAoICggcnVsZV9fRGF0YUludGVyY2hhbmdlQmxvYk1hcHBpbmdfX0Jsb2JQYXRoQXNzaWdubWVudF82XzEgKSApIDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo5OTg2OjE6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUJsb2JNYXBwaW5nX19Hcm91cF82X18xX19JbXBsIDogKCAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUJsb2JNYXBwaW5nX19CbG9iUGF0aEFzc2lnbm1lbnRfNl8xICkgKSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fRGF0YUludGVyY2hhbmdlQmxvYk1hcHBpbmdfX0dyb3VwXzZfXzFfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6ODY1MjoxOiAoICggKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VCbG9iTWFwcGluZ19fQmxvYlBhdGhBc3NpZ25tZW50XzZfMSApICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6ODY1MzoxOiAoICggcnVsZV9fRGF0YUludGVyY2hhbmdlQmxvYk1hcHBpbmdfX0Jsb2JQYXRoQXNzaWdubWVudF82XzEgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo5OTkwOjE6ICggKCAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUJsb2JNYXBwaW5nX19CbG9iUGF0aEFzc2lnbm1lbnRfNl8xICkgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo5OTkxOjE6ICggKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VCbG9iTWFwcGluZ19fQmxvYlBhdGhBc3NpZ25tZW50XzZfMSApICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjg2NTM6MTogKCAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUJsb2JNYXBwaW5nX19CbG9iUGF0aEFzc2lnbm1lbnRfNl8xICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6ODY1NDoyOiAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUJsb2JNYXBwaW5nX19CbG9iUGF0aEFzc2lnbm1lbnRfNl8xICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjk5OTE6MTogKCAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUJsb2JNYXBwaW5nX19CbG9iUGF0aEFzc2lnbm1lbnRfNl8xICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6OTk5MjoyOiAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUJsb2JNYXBwaW5nX19CbG9iUGF0aEFzc2lnbm1lbnRfNl8xICkKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YUludGVyY2hhbmdlQmxvYk1hcHBpbmdBY2Nlc3MoKS5nZXRCbG9iUGF0aEFzc2lnbm1lbnRfNl8xKCkpOyAKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjg2NTU6MjogKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VCbG9iTWFwcGluZ19fQmxvYlBhdGhBc3NpZ25tZW50XzZfMSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo4NjU1OjM6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUJsb2JNYXBwaW5nX19CbG9iUGF0aEFzc2lnbm1lbnRfNl8xCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo5OTkzOjI6ICggcnVsZV9fRGF0YUludGVyY2hhbmdlQmxvYk1hcHBpbmdfX0Jsb2JQYXRoQXNzaWdubWVudF82XzEgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6OTk5MzozOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VCbG9iTWFwcGluZ19fQmxvYlBhdGhBc3NpZ25tZW50XzZfMQogICAgICAgICAgICAgewogICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMik7CiAgICAgICAgICAgICBydWxlX19EYXRhSW50ZXJjaGFuZ2VCbG9iTWFwcGluZ19fQmxvYlBhdGhBc3NpZ25tZW50XzZfMSgpOwpAQCAtMjk2NjgsMTYgKzM0MTI1LDE2IEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fTEZRTl9fR3JvdXBfXzAiCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6ODY2NDoxOiBydWxlX19MRlFOX19Hcm91cF9fMCA6IHJ1bGVfX0xGUU5fX0dyb3VwX18wX19JbXBsIHJ1bGVfX0xGUU5fX0dyb3VwX18xIDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMDAwMjoxOiBydWxlX19MRlFOX19Hcm91cF9fMCA6IHJ1bGVfX0xGUU5fX0dyb3VwX18wX19JbXBsIHJ1bGVfX0xGUU5fX0dyb3VwX18xIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19MRlFOX19Hcm91cF9fMCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo4NjY4OjE6ICggcnVsZV9fTEZRTl9fR3JvdXBfXzBfX0ltcGwgcnVsZV9fTEZRTl9fR3JvdXBfXzEgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6ODY2OToyOiBydWxlX19MRlFOX19Hcm91cF9fMF9fSW1wbCBydWxlX19MRlFOX19Hcm91cF9fMQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTAwMDY6MTogKCBydWxlX19MRlFOX19Hcm91cF9fMF9fSW1wbCBydWxlX19MRlFOX19Hcm91cF9fMSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMDAwNzoyOiBydWxlX19MRlFOX19Hcm91cF9fMF9fSW1wbCBydWxlX19MRlFOX19Hcm91cF9fMQogICAgICAgICAgICAgewotICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfNjIpOworICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfNzApOwogICAgICAgICAgICAgcnVsZV9fTEZRTl9fR3JvdXBfXzBfX0ltcGwoKTsKIAogICAgICAgICAgICAgc3RhdGUuX2ZzcC0tOwpAQCAtMjk3MDYsMTcgKzM0MTYzLDE3IEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fTEZRTl9fR3JvdXBfXzBfX0ltcGwiCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6ODY3NjoxOiBydWxlX19MRlFOX19Hcm91cF9fMF9fSW1wbCA6ICggUlVMRV9JRCApIDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMDAxNDoxOiBydWxlX19MRlFOX19Hcm91cF9fMF9fSW1wbCA6ICggUlVMRV9JRCApIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19MRlFOX19Hcm91cF9fMF9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo4NjgwOjE6ICggKCBSVUxFX0lEICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6ODY4MToxOiAoIFJVTEVfSUQgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTAwMTg6MTogKCAoIFJVTEVfSUQgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMDAxOToxOiAoIFJVTEVfSUQgKQogICAgICAgICAgICAgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6ODY4MToxOiAoIFJVTEVfSUQgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6ODY4MjoyOiBSVUxFX0lECisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMDAxOToxOiAoIFJVTEVfSUQgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTAwMjA6MjogUlVMRV9JRAogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRMRlFOQWNjZXNzKCkuZ2V0SURUZXJtaW5hbFJ1bGVDYWxsXzAoKSk7IApAQCAtMjk3NDcsMTQgKzM0MjA0LDE0IEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fTEZRTl9fR3JvdXBfXzEiCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6ODY5MToxOiBydWxlX19MRlFOX19Hcm91cF9fMSA6IHJ1bGVfX0xGUU5fX0dyb3VwX18xX19JbXBsIDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMDAyOToxOiBydWxlX19MRlFOX19Hcm91cF9fMSA6IHJ1bGVfX0xGUU5fX0dyb3VwX18xX19JbXBsIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19MRlFOX19Hcm91cF9fMSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo4Njk1OjE6ICggcnVsZV9fTEZRTl9fR3JvdXBfXzFfX0ltcGwgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6ODY5NjoyOiBydWxlX19MRlFOX19Hcm91cF9fMV9fSW1wbAorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTAwMzM6MTogKCBydWxlX19MRlFOX19Hcm91cF9fMV9fSW1wbCApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMDAzNDoyOiBydWxlX19MRlFOX19Hcm91cF9fMV9fSW1wbAogICAgICAgICAgICAgewogICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMik7CiAgICAgICAgICAgICBydWxlX19MRlFOX19Hcm91cF9fMV9fSW1wbCgpOwpAQCAtMjk3ODAsMzcgKzM0MjM3LDM3IEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fTEZRTl9fR3JvdXBfXzFfX0ltcGwiCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6ODcwMjoxOiBydWxlX19MRlFOX19Hcm91cF9fMV9fSW1wbCA6ICggKCBydWxlX19MRlFOX19Hcm91cF8xX18wICkqICkgOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEwMDQwOjE6IHJ1bGVfX0xGUU5fX0dyb3VwX18xX19JbXBsIDogKCAoIHJ1bGVfX0xGUU5fX0dyb3VwXzFfXzAgKSogKSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fTEZRTl9fR3JvdXBfXzFfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6ODcwNjoxOiAoICggKCBydWxlX19MRlFOX19Hcm91cF8xX18wICkqICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6ODcwNzoxOiAoICggcnVsZV9fTEZRTl9fR3JvdXBfMV9fMCApKiApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMDA0NDoxOiAoICggKCBydWxlX19MRlFOX19Hcm91cF8xX18wICkqICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTAwNDU6MTogKCAoIHJ1bGVfX0xGUU5fX0dyb3VwXzFfXzAgKSogKQogICAgICAgICAgICAgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6ODcwNzoxOiAoICggcnVsZV9fTEZRTl9fR3JvdXBfMV9fMCApKiApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo4NzA4OjI6ICggcnVsZV9fTEZRTl9fR3JvdXBfMV9fMCApKgorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTAwNDU6MTogKCAoIHJ1bGVfX0xGUU5fX0dyb3VwXzFfXzAgKSogKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTAwNDY6MjogKCBydWxlX19MRlFOX19Hcm91cF8xX18wICkqCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldExGUU5BY2Nlc3MoKS5nZXRHcm91cF8xKCkpOyAKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjg3MDk6MjogKCBydWxlX19MRlFOX19Hcm91cF8xX18wICkqCi0gICAgICAgICAgICBsb29wODM6CisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMDA0NzoyOiAoIHJ1bGVfX0xGUU5fX0dyb3VwXzFfXzAgKSoKKyAgICAgICAgICAgIGxvb3A5NjoKICAgICAgICAgICAgIGRvIHsKLSAgICAgICAgICAgICAgICBpbnQgYWx0ODM9MjsKLSAgICAgICAgICAgICAgICBpbnQgTEE4M18wID0gaW5wdXQuTEEoMSk7CisgICAgICAgICAgICAgICAgaW50IGFsdDk2PTI7CisgICAgICAgICAgICAgICAgaW50IExBOTZfMCA9IGlucHV0LkxBKDEpOwogCi0gICAgICAgICAgICAgICAgaWYgKCAoTEE4M18wPT00MykgKSB7Ci0gICAgICAgICAgICAgICAgICAgIGFsdDgzPTE7CisgICAgICAgICAgICAgICAgaWYgKCAoTEE5Nl8wPT00MykgKSB7CisgICAgICAgICAgICAgICAgICAgIGFsdDk2PTE7CiAgICAgICAgICAgICAgICAgfQogCiAKLSAgICAgICAgICAgICAgICBzd2l0Y2ggKGFsdDgzKSB7CisgICAgICAgICAgICAgICAgc3dpdGNoIChhbHQ5NikgewogICAgICAgICAgICAgCWNhc2UgMSA6Ci0gICAgICAgICAgICAJICAgIC8vIEludGVybmFsRGF0YURTTC5nOjg3MDk6MzogcnVsZV9fTEZRTl9fR3JvdXBfMV9fMAorICAgICAgICAgICAgCSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMDA0NzozOiBydWxlX19MRlFOX19Hcm91cF8xX18wCiAgICAgICAgICAgICAJICAgIHsKLSAgICAgICAgICAgIAkgICAgcHVzaEZvbGxvdyhGT0xMT1dfNjMpOworICAgICAgICAgICAgCSAgICBwdXNoRm9sbG93KEZPTExPV183MSk7CiAgICAgICAgICAgICAJICAgIHJ1bGVfX0xGUU5fX0dyb3VwXzFfXzAoKTsKIAogICAgICAgICAgICAgCSAgICBzdGF0ZS5fZnNwLS07CkBAIC0yOTgyMCw3ICszNDI3Nyw3IEBACiAgICAgICAgICAgICAJICAgIGJyZWFrOwogCiAgICAgICAgICAgICAJZGVmYXVsdCA6Ci0gICAgICAgICAgICAJICAgIGJyZWFrIGxvb3A4MzsKKyAgICAgICAgICAgIAkgICAgYnJlYWsgbG9vcDk2OwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0gd2hpbGUgKHRydWUpOwogCkBAIC0yOTg0OSwxNCArMzQzMDYsMTQgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19MRlFOX19Hcm91cF8xX18wIgotICAgIC8vIEludGVybmFsRGF0YURTTC5nOjg3MTg6MTogcnVsZV9fTEZRTl9fR3JvdXBfMV9fMCA6IHJ1bGVfX0xGUU5fX0dyb3VwXzFfXzBfX0ltcGwgcnVsZV9fTEZRTl9fR3JvdXBfMV9fMSA7CisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTAwNTY6MTogcnVsZV9fTEZRTl9fR3JvdXBfMV9fMCA6IHJ1bGVfX0xGUU5fX0dyb3VwXzFfXzBfX0ltcGwgcnVsZV9fTEZRTl9fR3JvdXBfMV9fMSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fTEZRTl9fR3JvdXBfMV9fMCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo4NzIyOjE6ICggcnVsZV9fTEZRTl9fR3JvdXBfMV9fMF9fSW1wbCBydWxlX19MRlFOX19Hcm91cF8xX18xICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjg3MjM6MjogcnVsZV9fTEZRTl9fR3JvdXBfMV9fMF9fSW1wbCBydWxlX19MRlFOX19Hcm91cF8xX18xCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMDA2MDoxOiAoIHJ1bGVfX0xGUU5fX0dyb3VwXzFfXzBfX0ltcGwgcnVsZV9fTEZRTl9fR3JvdXBfMV9fMSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMDA2MToyOiBydWxlX19MRlFOX19Hcm91cF8xX18wX19JbXBsIHJ1bGVfX0xGUU5fX0dyb3VwXzFfXzEKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzcpOwogICAgICAgICAgICAgcnVsZV9fTEZRTl9fR3JvdXBfMV9fMF9fSW1wbCgpOwpAQCAtMjk4ODcsMTcgKzM0MzQ0LDE3IEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fTEZRTl9fR3JvdXBfMV9fMF9fSW1wbCIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo4NzMwOjE6IHJ1bGVfX0xGUU5fX0dyb3VwXzFfXzBfX0ltcGwgOiAoICcuJyApIDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMDA2ODoxOiBydWxlX19MRlFOX19Hcm91cF8xX18wX19JbXBsIDogKCAnLicgKSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fTEZRTl9fR3JvdXBfMV9fMF9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo4NzM0OjE6ICggKCAnLicgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo4NzM1OjE6ICggJy4nICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEwMDcyOjE6ICggKCAnLicgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMDA3MzoxOiAoICcuJyApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo4NzM1OjE6ICggJy4nICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjg3MzY6MjogJy4nCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMDA3MzoxOiAoICcuJyApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMDA3NDoyOiAnLicKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0TEZRTkFjY2VzcygpLmdldEZ1bGxTdG9wS2V5d29yZF8xXzAoKSk7IApAQCAtMjk5MjgsMTQgKzM0Mzg1LDE0IEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fTEZRTl9fR3JvdXBfMV9fMSIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo4NzQ1OjE6IHJ1bGVfX0xGUU5fX0dyb3VwXzFfXzEgOiBydWxlX19MRlFOX19Hcm91cF8xX18xX19JbXBsIDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMDA4MzoxOiBydWxlX19MRlFOX19Hcm91cF8xX18xIDogcnVsZV9fTEZRTl9fR3JvdXBfMV9fMV9fSW1wbCA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fTEZRTl9fR3JvdXBfMV9fMSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo4NzQ5OjE6ICggcnVsZV9fTEZRTl9fR3JvdXBfMV9fMV9fSW1wbCApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo4NzUwOjI6IHJ1bGVfX0xGUU5fX0dyb3VwXzFfXzFfX0ltcGwKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEwMDg3OjE6ICggcnVsZV9fTEZRTl9fR3JvdXBfMV9fMV9fSW1wbCApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMDA4ODoyOiBydWxlX19MRlFOX19Hcm91cF8xX18xX19JbXBsCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV18yKTsKICAgICAgICAgICAgIHJ1bGVfX0xGUU5fX0dyb3VwXzFfXzFfX0ltcGwoKTsKQEAgLTI5OTYxLDE3ICszNDQxOCwxNyBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX0xGUU5fX0dyb3VwXzFfXzFfX0ltcGwiCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6ODc1NjoxOiBydWxlX19MRlFOX19Hcm91cF8xX18xX19JbXBsIDogKCBSVUxFX0lEICkgOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEwMDk0OjE6IHJ1bGVfX0xGUU5fX0dyb3VwXzFfXzFfX0ltcGwgOiAoIFJVTEVfSUQgKSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fTEZRTl9fR3JvdXBfMV9fMV9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo4NzYwOjE6ICggKCBSVUxFX0lEICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6ODc2MToxOiAoIFJVTEVfSUQgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTAwOTg6MTogKCAoIFJVTEVfSUQgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMDA5OToxOiAoIFJVTEVfSUQgKQogICAgICAgICAgICAgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6ODc2MToxOiAoIFJVTEVfSUQgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6ODc2MjoyOiBSVUxFX0lECisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMDA5OToxOiAoIFJVTEVfSUQgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTAxMDA6MjogUlVMRV9JRAogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRMRlFOQWNjZXNzKCkuZ2V0SURUZXJtaW5hbFJ1bGVDYWxsXzFfMSgpKTsgCkBAIC0zMDAwMiwxNiArMzQ0NTksMTYgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YSW1wb3J0RGVjbGFyYXRpb25fX0dyb3VwX18wIgotICAgIC8vIEludGVybmFsRGF0YURTTC5nOjg3NzI6MTogcnVsZV9fWEltcG9ydERlY2xhcmF0aW9uX19Hcm91cF9fMCA6IHJ1bGVfX1hJbXBvcnREZWNsYXJhdGlvbl9fR3JvdXBfXzBfX0ltcGwgcnVsZV9fWEltcG9ydERlY2xhcmF0aW9uX19Hcm91cF9fMSA7CisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTAxMTA6MTogcnVsZV9fWEltcG9ydERlY2xhcmF0aW9uX19Hcm91cF9fMCA6IHJ1bGVfX1hJbXBvcnREZWNsYXJhdGlvbl9fR3JvdXBfXzBfX0ltcGwgcnVsZV9fWEltcG9ydERlY2xhcmF0aW9uX19Hcm91cF9fMSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fWEltcG9ydERlY2xhcmF0aW9uX19Hcm91cF9fMCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo4Nzc2OjE6ICggcnVsZV9fWEltcG9ydERlY2xhcmF0aW9uX19Hcm91cF9fMF9fSW1wbCBydWxlX19YSW1wb3J0RGVjbGFyYXRpb25fX0dyb3VwX18xICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjg3Nzc6MjogcnVsZV9fWEltcG9ydERlY2xhcmF0aW9uX19Hcm91cF9fMF9fSW1wbCBydWxlX19YSW1wb3J0RGVjbGFyYXRpb25fX0dyb3VwX18xCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMDExNDoxOiAoIHJ1bGVfX1hJbXBvcnREZWNsYXJhdGlvbl9fR3JvdXBfXzBfX0ltcGwgcnVsZV9fWEltcG9ydERlY2xhcmF0aW9uX19Hcm91cF9fMSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMDExNToyOiBydWxlX19YSW1wb3J0RGVjbGFyYXRpb25fX0dyb3VwX18wX19JbXBsIHJ1bGVfX1hJbXBvcnREZWNsYXJhdGlvbl9fR3JvdXBfXzEKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzY0KTsKKyAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzcyKTsKICAgICAgICAgICAgIHJ1bGVfX1hJbXBvcnREZWNsYXJhdGlvbl9fR3JvdXBfXzBfX0ltcGwoKTsKIAogICAgICAgICAgICAgc3RhdGUuX2ZzcC0tOwpAQCAtMzAwNDAsMjMgKzM0NDk3LDIzIEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fWEltcG9ydERlY2xhcmF0aW9uX19Hcm91cF9fMF9fSW1wbCIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo4Nzg0OjE6IHJ1bGVfX1hJbXBvcnREZWNsYXJhdGlvbl9fR3JvdXBfXzBfX0ltcGwgOiAoICgpICkgOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEwMTIyOjE6IHJ1bGVfX1hJbXBvcnREZWNsYXJhdGlvbl9fR3JvdXBfXzBfX0ltcGwgOiAoICgpICkgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1hJbXBvcnREZWNsYXJhdGlvbl9fR3JvdXBfXzBfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6ODc4ODoxOiAoICggKCkgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo4Nzg5OjE6ICggKCkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTAxMjY6MTogKCAoICgpICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTAxMjc6MTogKCAoKSApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo4Nzg5OjE6ICggKCkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6ODc5MDoyOiAoKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTAxMjc6MTogKCAoKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMDEyODoyOiAoKQogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYSW1wb3J0RGVjbGFyYXRpb25BY2Nlc3MoKS5nZXRPWEltcG9ydERlY2xhcmF0aW9uQWN0aW9uXzAoKSk7IAogICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6ODc5MToyOiAoKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6ODc5MTozOiAKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEwMTI5OjI6ICgpCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMDEyOTozOiAKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIH0KIApAQCAtMzAwODEsMTYgKzM0NTM4LDE2IEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fWEltcG9ydERlY2xhcmF0aW9uX19Hcm91cF9fMSIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo4Nzk5OjE6IHJ1bGVfX1hJbXBvcnREZWNsYXJhdGlvbl9fR3JvdXBfXzEgOiBydWxlX19YSW1wb3J0RGVjbGFyYXRpb25fX0dyb3VwX18xX19JbXBsIHJ1bGVfX1hJbXBvcnREZWNsYXJhdGlvbl9fR3JvdXBfXzIgOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEwMTM3OjE6IHJ1bGVfX1hJbXBvcnREZWNsYXJhdGlvbl9fR3JvdXBfXzEgOiBydWxlX19YSW1wb3J0RGVjbGFyYXRpb25fX0dyb3VwX18xX19JbXBsIHJ1bGVfX1hJbXBvcnREZWNsYXJhdGlvbl9fR3JvdXBfXzIgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1hJbXBvcnREZWNsYXJhdGlvbl9fR3JvdXBfXzEoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6ODgwMzoxOiAoIHJ1bGVfX1hJbXBvcnREZWNsYXJhdGlvbl9fR3JvdXBfXzFfX0ltcGwgcnVsZV9fWEltcG9ydERlY2xhcmF0aW9uX19Hcm91cF9fMiApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo4ODA0OjI6IHJ1bGVfX1hJbXBvcnREZWNsYXJhdGlvbl9fR3JvdXBfXzFfX0ltcGwgcnVsZV9fWEltcG9ydERlY2xhcmF0aW9uX19Hcm91cF9fMgorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTAxNDE6MTogKCBydWxlX19YSW1wb3J0RGVjbGFyYXRpb25fX0dyb3VwX18xX19JbXBsIHJ1bGVfX1hJbXBvcnREZWNsYXJhdGlvbl9fR3JvdXBfXzIgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTAxNDI6MjogcnVsZV9fWEltcG9ydERlY2xhcmF0aW9uX19Hcm91cF9fMV9fSW1wbCBydWxlX19YSW1wb3J0RGVjbGFyYXRpb25fX0dyb3VwX18yCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV182NSk7CisgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV183Myk7CiAgICAgICAgICAgICBydWxlX19YSW1wb3J0RGVjbGFyYXRpb25fX0dyb3VwX18xX19JbXBsKCk7CiAKICAgICAgICAgICAgIHN0YXRlLl9mc3AtLTsKQEAgLTMwMTE5LDE3ICszNDU3NiwxNyBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX1hJbXBvcnREZWNsYXJhdGlvbl9fR3JvdXBfXzFfX0ltcGwiCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6ODgxMToxOiBydWxlX19YSW1wb3J0RGVjbGFyYXRpb25fX0dyb3VwX18xX19JbXBsIDogKCAnaW1wb3J0JyApIDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMDE0OToxOiBydWxlX19YSW1wb3J0RGVjbGFyYXRpb25fX0dyb3VwX18xX19JbXBsIDogKCAnaW1wb3J0JyApIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YSW1wb3J0RGVjbGFyYXRpb25fX0dyb3VwX18xX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjg4MTU6MTogKCAoICdpbXBvcnQnICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6ODgxNjoxOiAoICdpbXBvcnQnICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEwMTUzOjE6ICggKCAnaW1wb3J0JyApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEwMTU0OjE6ICggJ2ltcG9ydCcgKQogICAgICAgICAgICAgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6ODgxNjoxOiAoICdpbXBvcnQnICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjg4MTc6MjogJ2ltcG9ydCcKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEwMTU0OjE6ICggJ2ltcG9ydCcgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTAxNTU6MjogJ2ltcG9ydCcKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WEltcG9ydERlY2xhcmF0aW9uQWNjZXNzKCkuZ2V0SW1wb3J0S2V5d29yZF8xKCkpOyAKQEAgLTMwMTYwLDE2ICszNDYxNywxNiBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX1hJbXBvcnREZWNsYXJhdGlvbl9fR3JvdXBfXzIiCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6ODgyNjoxOiBydWxlX19YSW1wb3J0RGVjbGFyYXRpb25fX0dyb3VwX18yIDogcnVsZV9fWEltcG9ydERlY2xhcmF0aW9uX19Hcm91cF9fMl9fSW1wbCBydWxlX19YSW1wb3J0RGVjbGFyYXRpb25fX0dyb3VwX18zIDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMDE2NDoxOiBydWxlX19YSW1wb3J0RGVjbGFyYXRpb25fX0dyb3VwX18yIDogcnVsZV9fWEltcG9ydERlY2xhcmF0aW9uX19Hcm91cF9fMl9fSW1wbCBydWxlX19YSW1wb3J0RGVjbGFyYXRpb25fX0dyb3VwX18zIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YSW1wb3J0RGVjbGFyYXRpb25fX0dyb3VwX18yKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjg4MzA6MTogKCBydWxlX19YSW1wb3J0RGVjbGFyYXRpb25fX0dyb3VwX18yX19JbXBsIHJ1bGVfX1hJbXBvcnREZWNsYXJhdGlvbl9fR3JvdXBfXzMgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6ODgzMToyOiBydWxlX19YSW1wb3J0RGVjbGFyYXRpb25fX0dyb3VwX18yX19JbXBsIHJ1bGVfX1hJbXBvcnREZWNsYXJhdGlvbl9fR3JvdXBfXzMKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEwMTY4OjE6ICggcnVsZV9fWEltcG9ydERlY2xhcmF0aW9uX19Hcm91cF9fMl9fSW1wbCBydWxlX19YSW1wb3J0RGVjbGFyYXRpb25fX0dyb3VwX18zICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEwMTY5OjI6IHJ1bGVfX1hJbXBvcnREZWNsYXJhdGlvbl9fR3JvdXBfXzJfX0ltcGwgcnVsZV9fWEltcG9ydERlY2xhcmF0aW9uX19Hcm91cF9fMwogICAgICAgICAgICAgewotICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfNjYpOworICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfNzQpOwogICAgICAgICAgICAgcnVsZV9fWEltcG9ydERlY2xhcmF0aW9uX19Hcm91cF9fMl9fSW1wbCgpOwogCiAgICAgICAgICAgICBzdGF0ZS5fZnNwLS07CkBAIC0zMDE5OCwyMyArMzQ2NTUsMjMgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YSW1wb3J0RGVjbGFyYXRpb25fX0dyb3VwX18yX19JbXBsIgotICAgIC8vIEludGVybmFsRGF0YURTTC5nOjg4Mzg6MTogcnVsZV9fWEltcG9ydERlY2xhcmF0aW9uX19Hcm91cF9fMl9fSW1wbCA6ICggKCBydWxlX19YSW1wb3J0RGVjbGFyYXRpb25fX0FsdGVybmF0aXZlc18yICkgKSA7CisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTAxNzY6MTogcnVsZV9fWEltcG9ydERlY2xhcmF0aW9uX19Hcm91cF9fMl9fSW1wbCA6ICggKCBydWxlX19YSW1wb3J0RGVjbGFyYXRpb25fX0FsdGVybmF0aXZlc18yICkgKSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fWEltcG9ydERlY2xhcmF0aW9uX19Hcm91cF9fMl9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo4ODQyOjE6ICggKCAoIHJ1bGVfX1hJbXBvcnREZWNsYXJhdGlvbl9fQWx0ZXJuYXRpdmVzXzIgKSApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjg4NDM6MTogKCAoIHJ1bGVfX1hJbXBvcnREZWNsYXJhdGlvbl9fQWx0ZXJuYXRpdmVzXzIgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMDE4MDoxOiAoICggKCBydWxlX19YSW1wb3J0RGVjbGFyYXRpb25fX0FsdGVybmF0aXZlc18yICkgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMDE4MToxOiAoICggcnVsZV9fWEltcG9ydERlY2xhcmF0aW9uX19BbHRlcm5hdGl2ZXNfMiApICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjg4NDM6MTogKCAoIHJ1bGVfX1hJbXBvcnREZWNsYXJhdGlvbl9fQWx0ZXJuYXRpdmVzXzIgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo4ODQ0OjI6ICggcnVsZV9fWEltcG9ydERlY2xhcmF0aW9uX19BbHRlcm5hdGl2ZXNfMiApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMDE4MToxOiAoICggcnVsZV9fWEltcG9ydERlY2xhcmF0aW9uX19BbHRlcm5hdGl2ZXNfMiApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEwMTgyOjI6ICggcnVsZV9fWEltcG9ydERlY2xhcmF0aW9uX19BbHRlcm5hdGl2ZXNfMiApCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhJbXBvcnREZWNsYXJhdGlvbkFjY2VzcygpLmdldEFsdGVybmF0aXZlc18yKCkpOyAKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjg4NDU6MjogKCBydWxlX19YSW1wb3J0RGVjbGFyYXRpb25fX0FsdGVybmF0aXZlc18yICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjg4NDU6MzogcnVsZV9fWEltcG9ydERlY2xhcmF0aW9uX19BbHRlcm5hdGl2ZXNfMgorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTAxODM6MjogKCBydWxlX19YSW1wb3J0RGVjbGFyYXRpb25fX0FsdGVybmF0aXZlc18yICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEwMTgzOjM6IHJ1bGVfX1hJbXBvcnREZWNsYXJhdGlvbl9fQWx0ZXJuYXRpdmVzXzIKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzIpOwogICAgICAgICAgICAgcnVsZV9fWEltcG9ydERlY2xhcmF0aW9uX19BbHRlcm5hdGl2ZXNfMigpOwpAQCAtMzAyNDksMTQgKzM0NzA2LDE0IEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fWEltcG9ydERlY2xhcmF0aW9uX19Hcm91cF9fMyIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo4ODUzOjE6IHJ1bGVfX1hJbXBvcnREZWNsYXJhdGlvbl9fR3JvdXBfXzMgOiBydWxlX19YSW1wb3J0RGVjbGFyYXRpb25fX0dyb3VwX18zX19JbXBsIDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMDE5MToxOiBydWxlX19YSW1wb3J0RGVjbGFyYXRpb25fX0dyb3VwX18zIDogcnVsZV9fWEltcG9ydERlY2xhcmF0aW9uX19Hcm91cF9fM19fSW1wbCA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fWEltcG9ydERlY2xhcmF0aW9uX19Hcm91cF9fMygpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo4ODU3OjE6ICggcnVsZV9fWEltcG9ydERlY2xhcmF0aW9uX19Hcm91cF9fM19fSW1wbCApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo4ODU4OjI6IHJ1bGVfX1hJbXBvcnREZWNsYXJhdGlvbl9fR3JvdXBfXzNfX0ltcGwKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEwMTk1OjE6ICggcnVsZV9fWEltcG9ydERlY2xhcmF0aW9uX19Hcm91cF9fM19fSW1wbCApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMDE5NjoyOiBydWxlX19YSW1wb3J0RGVjbGFyYXRpb25fX0dyb3VwX18zX19JbXBsCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV18yKTsKICAgICAgICAgICAgIHJ1bGVfX1hJbXBvcnREZWNsYXJhdGlvbl9fR3JvdXBfXzNfX0ltcGwoKTsKQEAgLTMwMjgyLDMzICszNDczOSwzMyBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX1hJbXBvcnREZWNsYXJhdGlvbl9fR3JvdXBfXzNfX0ltcGwiCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6ODg2NDoxOiBydWxlX19YSW1wb3J0RGVjbGFyYXRpb25fX0dyb3VwX18zX19JbXBsIDogKCAoICc7JyApPyApIDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMDIwMjoxOiBydWxlX19YSW1wb3J0RGVjbGFyYXRpb25fX0dyb3VwX18zX19JbXBsIDogKCAoICc7JyApPyApIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YSW1wb3J0RGVjbGFyYXRpb25fX0dyb3VwX18zX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjg4Njg6MTogKCAoICggJzsnICk/ICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6ODg2OToxOiAoICggJzsnICk/ICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEwMjA2OjE6ICggKCAoICc7JyApPyApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEwMjA3OjE6ICggKCAnOycgKT8gKQogICAgICAgICAgICAgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6ODg2OToxOiAoICggJzsnICk/ICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjg4NzA6MjogKCAnOycgKT8KKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEwMjA3OjE6ICggKCAnOycgKT8gKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTAyMDg6MjogKCAnOycgKT8KICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WEltcG9ydERlY2xhcmF0aW9uQWNjZXNzKCkuZ2V0U2VtaWNvbG9uS2V5d29yZF8zKCkpOyAKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjg4NzE6MjogKCAnOycgKT8KLSAgICAgICAgICAgIGludCBhbHQ4ND0yOwotICAgICAgICAgICAgaW50IExBODRfMCA9IGlucHV0LkxBKDEpOworICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTAyMDk6MjogKCAnOycgKT8KKyAgICAgICAgICAgIGludCBhbHQ5Nz0yOworICAgICAgICAgICAgaW50IExBOTdfMCA9IGlucHV0LkxBKDEpOwogCi0gICAgICAgICAgICBpZiAoIChMQTg0XzA9PTExMSkgKSB7Ci0gICAgICAgICAgICAgICAgYWx0ODQ9MTsKKyAgICAgICAgICAgIGlmICggKExBOTdfMD09MTIxKSApIHsKKyAgICAgICAgICAgICAgICBhbHQ5Nz0xOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgc3dpdGNoIChhbHQ4NCkgeworICAgICAgICAgICAgc3dpdGNoIChhbHQ5NykgewogICAgICAgICAgICAgICAgIGNhc2UgMSA6Ci0gICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjg4NzE6MzogJzsnCisgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEwMjA5OjM6ICc7JwogICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIG1hdGNoKGlucHV0LDExMSxGT0xMT1dfMik7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CisgICAgICAgICAgICAgICAgICAgIG1hdGNoKGlucHV0LDEyMSxGT0xMT1dfMik7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CiAKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICBicmVhazsKQEAgLTMwMzQwLDE2ICszNDc5NywxNiBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX1hJbXBvcnREZWNsYXJhdGlvbl9fR3JvdXBfMl8wX18wIgotICAgIC8vIEludGVybmFsRGF0YURTTC5nOjg4ODA6MTogcnVsZV9fWEltcG9ydERlY2xhcmF0aW9uX19Hcm91cF8yXzBfXzAgOiBydWxlX19YSW1wb3J0RGVjbGFyYXRpb25fX0dyb3VwXzJfMF9fMF9fSW1wbCBydWxlX19YSW1wb3J0RGVjbGFyYXRpb25fX0dyb3VwXzJfMF9fMSA7CisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTAyMTg6MTogcnVsZV9fWEltcG9ydERlY2xhcmF0aW9uX19Hcm91cF8yXzBfXzAgOiBydWxlX19YSW1wb3J0RGVjbGFyYXRpb25fX0dyb3VwXzJfMF9fMF9fSW1wbCBydWxlX19YSW1wb3J0RGVjbGFyYXRpb25fX0dyb3VwXzJfMF9fMSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fWEltcG9ydERlY2xhcmF0aW9uX19Hcm91cF8yXzBfXzAoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6ODg4NDoxOiAoIHJ1bGVfX1hJbXBvcnREZWNsYXJhdGlvbl9fR3JvdXBfMl8wX18wX19JbXBsIHJ1bGVfX1hJbXBvcnREZWNsYXJhdGlvbl9fR3JvdXBfMl8wX18xICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjg4ODU6MjogcnVsZV9fWEltcG9ydERlY2xhcmF0aW9uX19Hcm91cF8yXzBfXzBfX0ltcGwgcnVsZV9fWEltcG9ydERlY2xhcmF0aW9uX19Hcm91cF8yXzBfXzEKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEwMjIyOjE6ICggcnVsZV9fWEltcG9ydERlY2xhcmF0aW9uX19Hcm91cF8yXzBfXzBfX0ltcGwgcnVsZV9fWEltcG9ydERlY2xhcmF0aW9uX19Hcm91cF8yXzBfXzEgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTAyMjM6MjogcnVsZV9fWEltcG9ydERlY2xhcmF0aW9uX19Hcm91cF8yXzBfXzBfX0ltcGwgcnVsZV9fWEltcG9ydERlY2xhcmF0aW9uX19Hcm91cF8yXzBfXzEKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzY3KTsKKyAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzc1KTsKICAgICAgICAgICAgIHJ1bGVfX1hJbXBvcnREZWNsYXJhdGlvbl9fR3JvdXBfMl8wX18wX19JbXBsKCk7CiAKICAgICAgICAgICAgIHN0YXRlLl9mc3AtLTsKQEAgLTMwMzc4LDIzICszNDgzNSwyMyBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX1hJbXBvcnREZWNsYXJhdGlvbl9fR3JvdXBfMl8wX18wX19JbXBsIgotICAgIC8vIEludGVybmFsRGF0YURTTC5nOjg4OTI6MTogcnVsZV9fWEltcG9ydERlY2xhcmF0aW9uX19Hcm91cF8yXzBfXzBfX0ltcGwgOiAoICggcnVsZV9fWEltcG9ydERlY2xhcmF0aW9uX19TdGF0aWNBc3NpZ25tZW50XzJfMF8wICkgKSA7CisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTAyMzA6MTogcnVsZV9fWEltcG9ydERlY2xhcmF0aW9uX19Hcm91cF8yXzBfXzBfX0ltcGwgOiAoICggcnVsZV9fWEltcG9ydERlY2xhcmF0aW9uX19TdGF0aWNBc3NpZ25tZW50XzJfMF8wICkgKSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fWEltcG9ydERlY2xhcmF0aW9uX19Hcm91cF8yXzBfXzBfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6ODg5NjoxOiAoICggKCBydWxlX19YSW1wb3J0RGVjbGFyYXRpb25fX1N0YXRpY0Fzc2lnbm1lbnRfMl8wXzAgKSApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjg4OTc6MTogKCAoIHJ1bGVfX1hJbXBvcnREZWNsYXJhdGlvbl9fU3RhdGljQXNzaWdubWVudF8yXzBfMCApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEwMjM0OjE6ICggKCAoIHJ1bGVfX1hJbXBvcnREZWNsYXJhdGlvbl9fU3RhdGljQXNzaWdubWVudF8yXzBfMCApICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTAyMzU6MTogKCAoIHJ1bGVfX1hJbXBvcnREZWNsYXJhdGlvbl9fU3RhdGljQXNzaWdubWVudF8yXzBfMCApICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjg4OTc6MTogKCAoIHJ1bGVfX1hJbXBvcnREZWNsYXJhdGlvbl9fU3RhdGljQXNzaWdubWVudF8yXzBfMCApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjg4OTg6MjogKCBydWxlX19YSW1wb3J0RGVjbGFyYXRpb25fX1N0YXRpY0Fzc2lnbm1lbnRfMl8wXzAgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTAyMzU6MTogKCAoIHJ1bGVfX1hJbXBvcnREZWNsYXJhdGlvbl9fU3RhdGljQXNzaWdubWVudF8yXzBfMCApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEwMjM2OjI6ICggcnVsZV9fWEltcG9ydERlY2xhcmF0aW9uX19TdGF0aWNBc3NpZ25tZW50XzJfMF8wICkKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WEltcG9ydERlY2xhcmF0aW9uQWNjZXNzKCkuZ2V0U3RhdGljQXNzaWdubWVudF8yXzBfMCgpKTsgCiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo4ODk5OjI6ICggcnVsZV9fWEltcG9ydERlY2xhcmF0aW9uX19TdGF0aWNBc3NpZ25tZW50XzJfMF8wICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjg4OTk6MzogcnVsZV9fWEltcG9ydERlY2xhcmF0aW9uX19TdGF0aWNBc3NpZ25tZW50XzJfMF8wCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMDIzNzoyOiAoIHJ1bGVfX1hJbXBvcnREZWNsYXJhdGlvbl9fU3RhdGljQXNzaWdubWVudF8yXzBfMCApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMDIzNzozOiBydWxlX19YSW1wb3J0RGVjbGFyYXRpb25fX1N0YXRpY0Fzc2lnbm1lbnRfMl8wXzAKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzIpOwogICAgICAgICAgICAgcnVsZV9fWEltcG9ydERlY2xhcmF0aW9uX19TdGF0aWNBc3NpZ25tZW50XzJfMF8wKCk7CkBAIC0zMDQyOSwxNiArMzQ4ODYsMTYgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YSW1wb3J0RGVjbGFyYXRpb25fX0dyb3VwXzJfMF9fMSIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo4OTA3OjE6IHJ1bGVfX1hJbXBvcnREZWNsYXJhdGlvbl9fR3JvdXBfMl8wX18xIDogcnVsZV9fWEltcG9ydERlY2xhcmF0aW9uX19Hcm91cF8yXzBfXzFfX0ltcGwgcnVsZV9fWEltcG9ydERlY2xhcmF0aW9uX19Hcm91cF8yXzBfXzIgOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEwMjQ1OjE6IHJ1bGVfX1hJbXBvcnREZWNsYXJhdGlvbl9fR3JvdXBfMl8wX18xIDogcnVsZV9fWEltcG9ydERlY2xhcmF0aW9uX19Hcm91cF8yXzBfXzFfX0ltcGwgcnVsZV9fWEltcG9ydERlY2xhcmF0aW9uX19Hcm91cF8yXzBfXzIgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1hJbXBvcnREZWNsYXJhdGlvbl9fR3JvdXBfMl8wX18xKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjg5MTE6MTogKCBydWxlX19YSW1wb3J0RGVjbGFyYXRpb25fX0dyb3VwXzJfMF9fMV9fSW1wbCBydWxlX19YSW1wb3J0RGVjbGFyYXRpb25fX0dyb3VwXzJfMF9fMiApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo4OTEyOjI6IHJ1bGVfX1hJbXBvcnREZWNsYXJhdGlvbl9fR3JvdXBfMl8wX18xX19JbXBsIHJ1bGVfX1hJbXBvcnREZWNsYXJhdGlvbl9fR3JvdXBfMl8wX18yCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMDI0OToxOiAoIHJ1bGVfX1hJbXBvcnREZWNsYXJhdGlvbl9fR3JvdXBfMl8wX18xX19JbXBsIHJ1bGVfX1hJbXBvcnREZWNsYXJhdGlvbl9fR3JvdXBfMl8wX18yICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEwMjUwOjI6IHJ1bGVfX1hJbXBvcnREZWNsYXJhdGlvbl9fR3JvdXBfMl8wX18xX19JbXBsIHJ1bGVfX1hJbXBvcnREZWNsYXJhdGlvbl9fR3JvdXBfMl8wX18yCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV182Nyk7CisgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV183NSk7CiAgICAgICAgICAgICBydWxlX19YSW1wb3J0RGVjbGFyYXRpb25fX0dyb3VwXzJfMF9fMV9fSW1wbCgpOwogCiAgICAgICAgICAgICBzdGF0ZS5fZnNwLS07CkBAIC0zMDQ2NywzMSArMzQ5MjQsMzEgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YSW1wb3J0RGVjbGFyYXRpb25fX0dyb3VwXzJfMF9fMV9fSW1wbCIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo4OTE5OjE6IHJ1bGVfX1hJbXBvcnREZWNsYXJhdGlvbl9fR3JvdXBfMl8wX18xX19JbXBsIDogKCAoIHJ1bGVfX1hJbXBvcnREZWNsYXJhdGlvbl9fRXh0ZW5zaW9uQXNzaWdubWVudF8yXzBfMSApPyApIDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMDI1NzoxOiBydWxlX19YSW1wb3J0RGVjbGFyYXRpb25fX0dyb3VwXzJfMF9fMV9fSW1wbCA6ICggKCBydWxlX19YSW1wb3J0RGVjbGFyYXRpb25fX0V4dGVuc2lvbkFzc2lnbm1lbnRfMl8wXzEgKT8gKSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fWEltcG9ydERlY2xhcmF0aW9uX19Hcm91cF8yXzBfXzFfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6ODkyMzoxOiAoICggKCBydWxlX19YSW1wb3J0RGVjbGFyYXRpb25fX0V4dGVuc2lvbkFzc2lnbm1lbnRfMl8wXzEgKT8gKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo4OTI0OjE6ICggKCBydWxlX19YSW1wb3J0RGVjbGFyYXRpb25fX0V4dGVuc2lvbkFzc2lnbm1lbnRfMl8wXzEgKT8gKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTAyNjE6MTogKCAoICggcnVsZV9fWEltcG9ydERlY2xhcmF0aW9uX19FeHRlbnNpb25Bc3NpZ25tZW50XzJfMF8xICk/ICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTAyNjI6MTogKCAoIHJ1bGVfX1hJbXBvcnREZWNsYXJhdGlvbl9fRXh0ZW5zaW9uQXNzaWdubWVudF8yXzBfMSApPyApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo4OTI0OjE6ICggKCBydWxlX19YSW1wb3J0RGVjbGFyYXRpb25fX0V4dGVuc2lvbkFzc2lnbm1lbnRfMl8wXzEgKT8gKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6ODkyNToyOiAoIHJ1bGVfX1hJbXBvcnREZWNsYXJhdGlvbl9fRXh0ZW5zaW9uQXNzaWdubWVudF8yXzBfMSApPworICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTAyNjI6MTogKCAoIHJ1bGVfX1hJbXBvcnREZWNsYXJhdGlvbl9fRXh0ZW5zaW9uQXNzaWdubWVudF8yXzBfMSApPyApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMDI2MzoyOiAoIHJ1bGVfX1hJbXBvcnREZWNsYXJhdGlvbl9fRXh0ZW5zaW9uQXNzaWdubWVudF8yXzBfMSApPwogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYSW1wb3J0RGVjbGFyYXRpb25BY2Nlc3MoKS5nZXRFeHRlbnNpb25Bc3NpZ25tZW50XzJfMF8xKCkpOyAKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjg5MjY6MjogKCBydWxlX19YSW1wb3J0RGVjbGFyYXRpb25fX0V4dGVuc2lvbkFzc2lnbm1lbnRfMl8wXzEgKT8KLSAgICAgICAgICAgIGludCBhbHQ4NT0yOwotICAgICAgICAgICAgaW50IExBODVfMCA9IGlucHV0LkxBKDEpOworICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTAyNjQ6MjogKCBydWxlX19YSW1wb3J0RGVjbGFyYXRpb25fX0V4dGVuc2lvbkFzc2lnbm1lbnRfMl8wXzEgKT8KKyAgICAgICAgICAgIGludCBhbHQ5OD0yOworICAgICAgICAgICAgaW50IExBOThfMCA9IGlucHV0LkxBKDEpOwogCi0gICAgICAgICAgICBpZiAoIChMQTg1XzA9PTQ4KSApIHsKLSAgICAgICAgICAgICAgICBhbHQ4NT0xOworICAgICAgICAgICAgaWYgKCAoTEE5OF8wPT00OCkgKSB7CisgICAgICAgICAgICAgICAgYWx0OTg9MTsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHN3aXRjaCAoYWx0ODUpIHsKKyAgICAgICAgICAgIHN3aXRjaCAoYWx0OTgpIHsKICAgICAgICAgICAgICAgICBjYXNlIDEgOgotICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo4OTI2OjM6IHJ1bGVfX1hJbXBvcnREZWNsYXJhdGlvbl9fRXh0ZW5zaW9uQXNzaWdubWVudF8yXzBfMQorICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMDI2NDozOiBydWxlX19YSW1wb3J0RGVjbGFyYXRpb25fX0V4dGVuc2lvbkFzc2lnbm1lbnRfMl8wXzEKICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV18yKTsKICAgICAgICAgICAgICAgICAgICAgcnVsZV9fWEltcG9ydERlY2xhcmF0aW9uX19FeHRlbnNpb25Bc3NpZ25tZW50XzJfMF8xKCk7CkBAIC0zMDUyOSwxNiArMzQ5ODYsMTYgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YSW1wb3J0RGVjbGFyYXRpb25fX0dyb3VwXzJfMF9fMiIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo4OTM0OjE6IHJ1bGVfX1hJbXBvcnREZWNsYXJhdGlvbl9fR3JvdXBfMl8wX18yIDogcnVsZV9fWEltcG9ydERlY2xhcmF0aW9uX19Hcm91cF8yXzBfXzJfX0ltcGwgcnVsZV9fWEltcG9ydERlY2xhcmF0aW9uX19Hcm91cF8yXzBfXzMgOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEwMjcyOjE6IHJ1bGVfX1hJbXBvcnREZWNsYXJhdGlvbl9fR3JvdXBfMl8wX18yIDogcnVsZV9fWEltcG9ydERlY2xhcmF0aW9uX19Hcm91cF8yXzBfXzJfX0ltcGwgcnVsZV9fWEltcG9ydERlY2xhcmF0aW9uX19Hcm91cF8yXzBfXzMgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1hJbXBvcnREZWNsYXJhdGlvbl9fR3JvdXBfMl8wX18yKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjg5Mzg6MTogKCBydWxlX19YSW1wb3J0RGVjbGFyYXRpb25fX0dyb3VwXzJfMF9fMl9fSW1wbCBydWxlX19YSW1wb3J0RGVjbGFyYXRpb25fX0dyb3VwXzJfMF9fMyApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo4OTM5OjI6IHJ1bGVfX1hJbXBvcnREZWNsYXJhdGlvbl9fR3JvdXBfMl8wX18yX19JbXBsIHJ1bGVfX1hJbXBvcnREZWNsYXJhdGlvbl9fR3JvdXBfMl8wX18zCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMDI3NjoxOiAoIHJ1bGVfX1hJbXBvcnREZWNsYXJhdGlvbl9fR3JvdXBfMl8wX18yX19JbXBsIHJ1bGVfX1hJbXBvcnREZWNsYXJhdGlvbl9fR3JvdXBfMl8wX18zICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEwMjc3OjI6IHJ1bGVfX1hJbXBvcnREZWNsYXJhdGlvbl9fR3JvdXBfMl8wX18yX19JbXBsIHJ1bGVfX1hJbXBvcnREZWNsYXJhdGlvbl9fR3JvdXBfMl8wX18zCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV182OCk7CisgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV183Nik7CiAgICAgICAgICAgICBydWxlX19YSW1wb3J0RGVjbGFyYXRpb25fX0dyb3VwXzJfMF9fMl9fSW1wbCgpOwogCiAgICAgICAgICAgICBzdGF0ZS5fZnNwLS07CkBAIC0zMDU2NywyMyArMzUwMjQsMjMgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YSW1wb3J0RGVjbGFyYXRpb25fX0dyb3VwXzJfMF9fMl9fSW1wbCIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo4OTQ2OjE6IHJ1bGVfX1hJbXBvcnREZWNsYXJhdGlvbl9fR3JvdXBfMl8wX18yX19JbXBsIDogKCAoIHJ1bGVfX1hJbXBvcnREZWNsYXJhdGlvbl9fSW1wb3J0ZWRUeXBlQXNzaWdubWVudF8yXzBfMiApICkgOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEwMjg0OjE6IHJ1bGVfX1hJbXBvcnREZWNsYXJhdGlvbl9fR3JvdXBfMl8wX18yX19JbXBsIDogKCAoIHJ1bGVfX1hJbXBvcnREZWNsYXJhdGlvbl9fSW1wb3J0ZWRUeXBlQXNzaWdubWVudF8yXzBfMiApICkgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1hJbXBvcnREZWNsYXJhdGlvbl9fR3JvdXBfMl8wX18yX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjg5NTA6MTogKCAoICggcnVsZV9fWEltcG9ydERlY2xhcmF0aW9uX19JbXBvcnRlZFR5cGVBc3NpZ25tZW50XzJfMF8yICkgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo4OTUxOjE6ICggKCBydWxlX19YSW1wb3J0RGVjbGFyYXRpb25fX0ltcG9ydGVkVHlwZUFzc2lnbm1lbnRfMl8wXzIgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMDI4ODoxOiAoICggKCBydWxlX19YSW1wb3J0RGVjbGFyYXRpb25fX0ltcG9ydGVkVHlwZUFzc2lnbm1lbnRfMl8wXzIgKSApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEwMjg5OjE6ICggKCBydWxlX19YSW1wb3J0RGVjbGFyYXRpb25fX0ltcG9ydGVkVHlwZUFzc2lnbm1lbnRfMl8wXzIgKSApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo4OTUxOjE6ICggKCBydWxlX19YSW1wb3J0RGVjbGFyYXRpb25fX0ltcG9ydGVkVHlwZUFzc2lnbm1lbnRfMl8wXzIgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo4OTUyOjI6ICggcnVsZV9fWEltcG9ydERlY2xhcmF0aW9uX19JbXBvcnRlZFR5cGVBc3NpZ25tZW50XzJfMF8yICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEwMjg5OjE6ICggKCBydWxlX19YSW1wb3J0RGVjbGFyYXRpb25fX0ltcG9ydGVkVHlwZUFzc2lnbm1lbnRfMl8wXzIgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMDI5MDoyOiAoIHJ1bGVfX1hJbXBvcnREZWNsYXJhdGlvbl9fSW1wb3J0ZWRUeXBlQXNzaWdubWVudF8yXzBfMiApCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhJbXBvcnREZWNsYXJhdGlvbkFjY2VzcygpLmdldEltcG9ydGVkVHlwZUFzc2lnbm1lbnRfMl8wXzIoKSk7IAogICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6ODk1MzoyOiAoIHJ1bGVfX1hJbXBvcnREZWNsYXJhdGlvbl9fSW1wb3J0ZWRUeXBlQXNzaWdubWVudF8yXzBfMiApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo4OTUzOjM6IHJ1bGVfX1hJbXBvcnREZWNsYXJhdGlvbl9fSW1wb3J0ZWRUeXBlQXNzaWdubWVudF8yXzBfMgorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTAyOTE6MjogKCBydWxlX19YSW1wb3J0RGVjbGFyYXRpb25fX0ltcG9ydGVkVHlwZUFzc2lnbm1lbnRfMl8wXzIgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTAyOTE6MzogcnVsZV9fWEltcG9ydERlY2xhcmF0aW9uX19JbXBvcnRlZFR5cGVBc3NpZ25tZW50XzJfMF8yCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV18yKTsKICAgICAgICAgICAgIHJ1bGVfX1hJbXBvcnREZWNsYXJhdGlvbl9fSW1wb3J0ZWRUeXBlQXNzaWdubWVudF8yXzBfMigpOwpAQCAtMzA2MTgsMTQgKzM1MDc1LDE0IEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fWEltcG9ydERlY2xhcmF0aW9uX19Hcm91cF8yXzBfXzMiCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6ODk2MToxOiBydWxlX19YSW1wb3J0RGVjbGFyYXRpb25fX0dyb3VwXzJfMF9fMyA6IHJ1bGVfX1hJbXBvcnREZWNsYXJhdGlvbl9fR3JvdXBfMl8wX18zX19JbXBsIDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMDI5OToxOiBydWxlX19YSW1wb3J0RGVjbGFyYXRpb25fX0dyb3VwXzJfMF9fMyA6IHJ1bGVfX1hJbXBvcnREZWNsYXJhdGlvbl9fR3JvdXBfMl8wX18zX19JbXBsIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YSW1wb3J0RGVjbGFyYXRpb25fX0dyb3VwXzJfMF9fMygpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo4OTY1OjE6ICggcnVsZV9fWEltcG9ydERlY2xhcmF0aW9uX19Hcm91cF8yXzBfXzNfX0ltcGwgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6ODk2NjoyOiBydWxlX19YSW1wb3J0RGVjbGFyYXRpb25fX0dyb3VwXzJfMF9fM19fSW1wbAorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTAzMDM6MTogKCBydWxlX19YSW1wb3J0RGVjbGFyYXRpb25fX0dyb3VwXzJfMF9fM19fSW1wbCApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMDMwNDoyOiBydWxlX19YSW1wb3J0RGVjbGFyYXRpb25fX0dyb3VwXzJfMF9fM19fSW1wbAogICAgICAgICAgICAgewogICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMik7CiAgICAgICAgICAgICBydWxlX19YSW1wb3J0RGVjbGFyYXRpb25fX0dyb3VwXzJfMF9fM19fSW1wbCgpOwpAQCAtMzA2NTEsMjMgKzM1MTA4LDIzIEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fWEltcG9ydERlY2xhcmF0aW9uX19Hcm91cF8yXzBfXzNfX0ltcGwiCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6ODk3MjoxOiBydWxlX19YSW1wb3J0RGVjbGFyYXRpb25fX0dyb3VwXzJfMF9fM19fSW1wbCA6ICggKCBydWxlX19YSW1wb3J0RGVjbGFyYXRpb25fX0FsdGVybmF0aXZlc18yXzBfMyApICkgOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEwMzEwOjE6IHJ1bGVfX1hJbXBvcnREZWNsYXJhdGlvbl9fR3JvdXBfMl8wX18zX19JbXBsIDogKCAoIHJ1bGVfX1hJbXBvcnREZWNsYXJhdGlvbl9fQWx0ZXJuYXRpdmVzXzJfMF8zICkgKSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fWEltcG9ydERlY2xhcmF0aW9uX19Hcm91cF8yXzBfXzNfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6ODk3NjoxOiAoICggKCBydWxlX19YSW1wb3J0RGVjbGFyYXRpb25fX0FsdGVybmF0aXZlc18yXzBfMyApICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6ODk3NzoxOiAoICggcnVsZV9fWEltcG9ydERlY2xhcmF0aW9uX19BbHRlcm5hdGl2ZXNfMl8wXzMgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMDMxNDoxOiAoICggKCBydWxlX19YSW1wb3J0RGVjbGFyYXRpb25fX0FsdGVybmF0aXZlc18yXzBfMyApICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTAzMTU6MTogKCAoIHJ1bGVfX1hJbXBvcnREZWNsYXJhdGlvbl9fQWx0ZXJuYXRpdmVzXzJfMF8zICkgKQogICAgICAgICAgICAgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6ODk3NzoxOiAoICggcnVsZV9fWEltcG9ydERlY2xhcmF0aW9uX19BbHRlcm5hdGl2ZXNfMl8wXzMgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo4OTc4OjI6ICggcnVsZV9fWEltcG9ydERlY2xhcmF0aW9uX19BbHRlcm5hdGl2ZXNfMl8wXzMgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTAzMTU6MTogKCAoIHJ1bGVfX1hJbXBvcnREZWNsYXJhdGlvbl9fQWx0ZXJuYXRpdmVzXzJfMF8zICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTAzMTY6MjogKCBydWxlX19YSW1wb3J0RGVjbGFyYXRpb25fX0FsdGVybmF0aXZlc18yXzBfMyApCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhJbXBvcnREZWNsYXJhdGlvbkFjY2VzcygpLmdldEFsdGVybmF0aXZlc18yXzBfMygpKTsgCiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo4OTc5OjI6ICggcnVsZV9fWEltcG9ydERlY2xhcmF0aW9uX19BbHRlcm5hdGl2ZXNfMl8wXzMgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6ODk3OTozOiBydWxlX19YSW1wb3J0RGVjbGFyYXRpb25fX0FsdGVybmF0aXZlc18yXzBfMworICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTAzMTc6MjogKCBydWxlX19YSW1wb3J0RGVjbGFyYXRpb25fX0FsdGVybmF0aXZlc18yXzBfMyApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMDMxNzozOiBydWxlX19YSW1wb3J0RGVjbGFyYXRpb25fX0FsdGVybmF0aXZlc18yXzBfMwogICAgICAgICAgICAgewogICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMik7CiAgICAgICAgICAgICBydWxlX19YSW1wb3J0RGVjbGFyYXRpb25fX0FsdGVybmF0aXZlc18yXzBfMygpOwpAQCAtMzA3MDIsMTQgKzM1MTU5LDE0IEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fWEltcG9ydERlY2xhcmF0aW9uX19Hcm91cF8yXzNfXzAiCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6ODk4ODoxOiBydWxlX19YSW1wb3J0RGVjbGFyYXRpb25fX0dyb3VwXzJfM19fMCA6IHJ1bGVfX1hJbXBvcnREZWNsYXJhdGlvbl9fR3JvdXBfMl8zX18wX19JbXBsIHJ1bGVfX1hJbXBvcnREZWNsYXJhdGlvbl9fR3JvdXBfMl8zX18xIDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMDMyNjoxOiBydWxlX19YSW1wb3J0RGVjbGFyYXRpb25fX0dyb3VwXzJfM19fMCA6IHJ1bGVfX1hJbXBvcnREZWNsYXJhdGlvbl9fR3JvdXBfMl8zX18wX19JbXBsIHJ1bGVfX1hJbXBvcnREZWNsYXJhdGlvbl9fR3JvdXBfMl8zX18xIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YSW1wb3J0RGVjbGFyYXRpb25fX0dyb3VwXzJfM19fMCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo4OTkyOjE6ICggcnVsZV9fWEltcG9ydERlY2xhcmF0aW9uX19Hcm91cF8yXzNfXzBfX0ltcGwgcnVsZV9fWEltcG9ydERlY2xhcmF0aW9uX19Hcm91cF8yXzNfXzEgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6ODk5MzoyOiBydWxlX19YSW1wb3J0RGVjbGFyYXRpb25fX0dyb3VwXzJfM19fMF9fSW1wbCBydWxlX19YSW1wb3J0RGVjbGFyYXRpb25fX0dyb3VwXzJfM19fMQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTAzMzA6MTogKCBydWxlX19YSW1wb3J0RGVjbGFyYXRpb25fX0dyb3VwXzJfM19fMF9fSW1wbCBydWxlX19YSW1wb3J0RGVjbGFyYXRpb25fX0dyb3VwXzJfM19fMSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMDMzMToyOiBydWxlX19YSW1wb3J0RGVjbGFyYXRpb25fX0dyb3VwXzJfM19fMF9fSW1wbCBydWxlX19YSW1wb3J0RGVjbGFyYXRpb25fX0dyb3VwXzJfM19fMQogICAgICAgICAgICAgewogICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfNyk7CiAgICAgICAgICAgICBydWxlX19YSW1wb3J0RGVjbGFyYXRpb25fX0dyb3VwXzJfM19fMF9fSW1wbCgpOwpAQCAtMzA3NDAsMjMgKzM1MTk3LDIzIEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fWEltcG9ydERlY2xhcmF0aW9uX19Hcm91cF8yXzNfXzBfX0ltcGwiCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6OTAwMDoxOiBydWxlX19YSW1wb3J0RGVjbGFyYXRpb25fX0dyb3VwXzJfM19fMF9fSW1wbCA6ICggKCBydWxlX19YSW1wb3J0RGVjbGFyYXRpb25fX0ZxbkltcG9ydEFzc2lnbm1lbnRfMl8zXzAgKSApIDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMDMzODoxOiBydWxlX19YSW1wb3J0RGVjbGFyYXRpb25fX0dyb3VwXzJfM19fMF9fSW1wbCA6ICggKCBydWxlX19YSW1wb3J0RGVjbGFyYXRpb25fX0ZxbkltcG9ydEFzc2lnbm1lbnRfMl8zXzAgKSApIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YSW1wb3J0RGVjbGFyYXRpb25fX0dyb3VwXzJfM19fMF9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo5MDA0OjE6ICggKCAoIHJ1bGVfX1hJbXBvcnREZWNsYXJhdGlvbl9fRnFuSW1wb3J0QXNzaWdubWVudF8yXzNfMCApICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6OTAwNToxOiAoICggcnVsZV9fWEltcG9ydERlY2xhcmF0aW9uX19GcW5JbXBvcnRBc3NpZ25tZW50XzJfM18wICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTAzNDI6MTogKCAoICggcnVsZV9fWEltcG9ydERlY2xhcmF0aW9uX19GcW5JbXBvcnRBc3NpZ25tZW50XzJfM18wICkgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMDM0MzoxOiAoICggcnVsZV9fWEltcG9ydERlY2xhcmF0aW9uX19GcW5JbXBvcnRBc3NpZ25tZW50XzJfM18wICkgKQogICAgICAgICAgICAgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6OTAwNToxOiAoICggcnVsZV9fWEltcG9ydERlY2xhcmF0aW9uX19GcW5JbXBvcnRBc3NpZ25tZW50XzJfM18wICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6OTAwNjoyOiAoIHJ1bGVfX1hJbXBvcnREZWNsYXJhdGlvbl9fRnFuSW1wb3J0QXNzaWdubWVudF8yXzNfMCApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMDM0MzoxOiAoICggcnVsZV9fWEltcG9ydERlY2xhcmF0aW9uX19GcW5JbXBvcnRBc3NpZ25tZW50XzJfM18wICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTAzNDQ6MjogKCBydWxlX19YSW1wb3J0RGVjbGFyYXRpb25fX0ZxbkltcG9ydEFzc2lnbm1lbnRfMl8zXzAgKQogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYSW1wb3J0RGVjbGFyYXRpb25BY2Nlc3MoKS5nZXRGcW5JbXBvcnRBc3NpZ25tZW50XzJfM18wKCkpOyAKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjkwMDc6MjogKCBydWxlX19YSW1wb3J0RGVjbGFyYXRpb25fX0ZxbkltcG9ydEFzc2lnbm1lbnRfMl8zXzAgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6OTAwNzozOiBydWxlX19YSW1wb3J0RGVjbGFyYXRpb25fX0ZxbkltcG9ydEFzc2lnbm1lbnRfMl8zXzAKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEwMzQ1OjI6ICggcnVsZV9fWEltcG9ydERlY2xhcmF0aW9uX19GcW5JbXBvcnRBc3NpZ25tZW50XzJfM18wICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEwMzQ1OjM6IHJ1bGVfX1hJbXBvcnREZWNsYXJhdGlvbl9fRnFuSW1wb3J0QXNzaWdubWVudF8yXzNfMAogICAgICAgICAgICAgewogICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMik7CiAgICAgICAgICAgICBydWxlX19YSW1wb3J0RGVjbGFyYXRpb25fX0ZxbkltcG9ydEFzc2lnbm1lbnRfMl8zXzAoKTsKQEAgLTMwNzkxLDE0ICszNTI0OCwxNCBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX1hJbXBvcnREZWNsYXJhdGlvbl9fR3JvdXBfMl8zX18xIgotICAgIC8vIEludGVybmFsRGF0YURTTC5nOjkwMTU6MTogcnVsZV9fWEltcG9ydERlY2xhcmF0aW9uX19Hcm91cF8yXzNfXzEgOiBydWxlX19YSW1wb3J0RGVjbGFyYXRpb25fX0dyb3VwXzJfM19fMV9fSW1wbCA7CisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTAzNTM6MTogcnVsZV9fWEltcG9ydERlY2xhcmF0aW9uX19Hcm91cF8yXzNfXzEgOiBydWxlX19YSW1wb3J0RGVjbGFyYXRpb25fX0dyb3VwXzJfM19fMV9fSW1wbCA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fWEltcG9ydERlY2xhcmF0aW9uX19Hcm91cF8yXzNfXzEoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6OTAxOToxOiAoIHJ1bGVfX1hJbXBvcnREZWNsYXJhdGlvbl9fR3JvdXBfMl8zX18xX19JbXBsICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjkwMjA6MjogcnVsZV9fWEltcG9ydERlY2xhcmF0aW9uX19Hcm91cF8yXzNfXzFfX0ltcGwKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEwMzU3OjE6ICggcnVsZV9fWEltcG9ydERlY2xhcmF0aW9uX19Hcm91cF8yXzNfXzFfX0ltcGwgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTAzNTg6MjogcnVsZV9fWEltcG9ydERlY2xhcmF0aW9uX19Hcm91cF8yXzNfXzFfX0ltcGwKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzIpOwogICAgICAgICAgICAgcnVsZV9fWEltcG9ydERlY2xhcmF0aW9uX19Hcm91cF8yXzNfXzFfX0ltcGwoKTsKQEAgLTMwODI0LDIzICszNTI4MSwyMyBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX1hJbXBvcnREZWNsYXJhdGlvbl9fR3JvdXBfMl8zX18xX19JbXBsIgotICAgIC8vIEludGVybmFsRGF0YURTTC5nOjkwMjY6MTogcnVsZV9fWEltcG9ydERlY2xhcmF0aW9uX19Hcm91cF8yXzNfXzFfX0ltcGwgOiAoICggcnVsZV9fWEltcG9ydERlY2xhcmF0aW9uX19JbXBvcnRlZEZ1bGx5UXVhbGlmaWVkTmFtZUFzc2lnbm1lbnRfMl8zXzEgKSApIDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMDM2NDoxOiBydWxlX19YSW1wb3J0RGVjbGFyYXRpb25fX0dyb3VwXzJfM19fMV9fSW1wbCA6ICggKCBydWxlX19YSW1wb3J0RGVjbGFyYXRpb25fX0ltcG9ydGVkRnVsbHlRdWFsaWZpZWROYW1lQXNzaWdubWVudF8yXzNfMSApICkgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1hJbXBvcnREZWNsYXJhdGlvbl9fR3JvdXBfMl8zX18xX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjkwMzA6MTogKCAoICggcnVsZV9fWEltcG9ydERlY2xhcmF0aW9uX19JbXBvcnRlZEZ1bGx5UXVhbGlmaWVkTmFtZUFzc2lnbm1lbnRfMl8zXzEgKSApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjkwMzE6MTogKCAoIHJ1bGVfX1hJbXBvcnREZWNsYXJhdGlvbl9fSW1wb3J0ZWRGdWxseVF1YWxpZmllZE5hbWVBc3NpZ25tZW50XzJfM18xICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTAzNjg6MTogKCAoICggcnVsZV9fWEltcG9ydERlY2xhcmF0aW9uX19JbXBvcnRlZEZ1bGx5UXVhbGlmaWVkTmFtZUFzc2lnbm1lbnRfMl8zXzEgKSApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEwMzY5OjE6ICggKCBydWxlX19YSW1wb3J0RGVjbGFyYXRpb25fX0ltcG9ydGVkRnVsbHlRdWFsaWZpZWROYW1lQXNzaWdubWVudF8yXzNfMSApICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjkwMzE6MTogKCAoIHJ1bGVfX1hJbXBvcnREZWNsYXJhdGlvbl9fSW1wb3J0ZWRGdWxseVF1YWxpZmllZE5hbWVBc3NpZ25tZW50XzJfM18xICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6OTAzMjoyOiAoIHJ1bGVfX1hJbXBvcnREZWNsYXJhdGlvbl9fSW1wb3J0ZWRGdWxseVF1YWxpZmllZE5hbWVBc3NpZ25tZW50XzJfM18xICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEwMzY5OjE6ICggKCBydWxlX19YSW1wb3J0RGVjbGFyYXRpb25fX0ltcG9ydGVkRnVsbHlRdWFsaWZpZWROYW1lQXNzaWdubWVudF8yXzNfMSApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEwMzcwOjI6ICggcnVsZV9fWEltcG9ydERlY2xhcmF0aW9uX19JbXBvcnRlZEZ1bGx5UXVhbGlmaWVkTmFtZUFzc2lnbm1lbnRfMl8zXzEgKQogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYSW1wb3J0RGVjbGFyYXRpb25BY2Nlc3MoKS5nZXRJbXBvcnRlZEZ1bGx5UXVhbGlmaWVkTmFtZUFzc2lnbm1lbnRfMl8zXzEoKSk7IAogICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6OTAzMzoyOiAoIHJ1bGVfX1hJbXBvcnREZWNsYXJhdGlvbl9fSW1wb3J0ZWRGdWxseVF1YWxpZmllZE5hbWVBc3NpZ25tZW50XzJfM18xICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjkwMzM6MzogcnVsZV9fWEltcG9ydERlY2xhcmF0aW9uX19JbXBvcnRlZEZ1bGx5UXVhbGlmaWVkTmFtZUFzc2lnbm1lbnRfMl8zXzEKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEwMzcxOjI6ICggcnVsZV9fWEltcG9ydERlY2xhcmF0aW9uX19JbXBvcnRlZEZ1bGx5UXVhbGlmaWVkTmFtZUFzc2lnbm1lbnRfMl8zXzEgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTAzNzE6MzogcnVsZV9fWEltcG9ydERlY2xhcmF0aW9uX19JbXBvcnRlZEZ1bGx5UXVhbGlmaWVkTmFtZUFzc2lnbm1lbnRfMl8zXzEKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzIpOwogICAgICAgICAgICAgcnVsZV9fWEltcG9ydERlY2xhcmF0aW9uX19JbXBvcnRlZEZ1bGx5UXVhbGlmaWVkTmFtZUFzc2lnbm1lbnRfMl8zXzEoKTsKQEAgLTMwODc1LDE2ICszNTMzMiwxNiBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX1hBbm5vdGF0aW9uX19Hcm91cF9fMCIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo5MDQyOjE6IHJ1bGVfX1hBbm5vdGF0aW9uX19Hcm91cF9fMCA6IHJ1bGVfX1hBbm5vdGF0aW9uX19Hcm91cF9fMF9fSW1wbCBydWxlX19YQW5ub3RhdGlvbl9fR3JvdXBfXzEgOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEwMzgwOjE6IHJ1bGVfX1hBbm5vdGF0aW9uX19Hcm91cF9fMCA6IHJ1bGVfX1hBbm5vdGF0aW9uX19Hcm91cF9fMF9fSW1wbCBydWxlX19YQW5ub3RhdGlvbl9fR3JvdXBfXzEgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1hBbm5vdGF0aW9uX19Hcm91cF9fMCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo5MDQ2OjE6ICggcnVsZV9fWEFubm90YXRpb25fX0dyb3VwX18wX19JbXBsIHJ1bGVfX1hBbm5vdGF0aW9uX19Hcm91cF9fMSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo5MDQ3OjI6IHJ1bGVfX1hBbm5vdGF0aW9uX19Hcm91cF9fMF9fSW1wbCBydWxlX19YQW5ub3RhdGlvbl9fR3JvdXBfXzEKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEwMzg0OjE6ICggcnVsZV9fWEFubm90YXRpb25fX0dyb3VwX18wX19JbXBsIHJ1bGVfX1hBbm5vdGF0aW9uX19Hcm91cF9fMSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMDM4NToyOiBydWxlX19YQW5ub3RhdGlvbl9fR3JvdXBfXzBfX0ltcGwgcnVsZV9fWEFubm90YXRpb25fX0dyb3VwX18xCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV182OSk7CisgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV183Nyk7CiAgICAgICAgICAgICBydWxlX19YQW5ub3RhdGlvbl9fR3JvdXBfXzBfX0ltcGwoKTsKIAogICAgICAgICAgICAgc3RhdGUuX2ZzcC0tOwpAQCAtMzA5MTMsMjMgKzM1MzcwLDIzIEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fWEFubm90YXRpb25fX0dyb3VwX18wX19JbXBsIgotICAgIC8vIEludGVybmFsRGF0YURTTC5nOjkwNTQ6MTogcnVsZV9fWEFubm90YXRpb25fX0dyb3VwX18wX19JbXBsIDogKCAoKSApIDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMDM5MjoxOiBydWxlX19YQW5ub3RhdGlvbl9fR3JvdXBfXzBfX0ltcGwgOiAoICgpICkgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1hBbm5vdGF0aW9uX19Hcm91cF9fMF9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo5MDU4OjE6ICggKCAoKSApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjkwNTk6MTogKCAoKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMDM5NjoxOiAoICggKCkgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMDM5NzoxOiAoICgpICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjkwNTk6MTogKCAoKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo5MDYwOjI6ICgpCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMDM5NzoxOiAoICgpICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEwMzk4OjI6ICgpCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhBbm5vdGF0aW9uQWNjZXNzKCkuZ2V0WEFubm90YXRpb25BY3Rpb25fMCgpKTsgCiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo5MDYxOjI6ICgpCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo5MDYxOjM6IAorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTAzOTk6MjogKCkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEwMzk5OjM6IAogICAgICAgICAgICAgewogICAgICAgICAgICAgfQogCkBAIC0zMDk1NCwxNCArMzU0MTEsMTQgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YQW5ub3RhdGlvbl9fR3JvdXBfXzEiCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6OTA2OToxOiBydWxlX19YQW5ub3RhdGlvbl9fR3JvdXBfXzEgOiBydWxlX19YQW5ub3RhdGlvbl9fR3JvdXBfXzFfX0ltcGwgcnVsZV9fWEFubm90YXRpb25fX0dyb3VwX18yIDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMDQwNzoxOiBydWxlX19YQW5ub3RhdGlvbl9fR3JvdXBfXzEgOiBydWxlX19YQW5ub3RhdGlvbl9fR3JvdXBfXzFfX0ltcGwgcnVsZV9fWEFubm90YXRpb25fX0dyb3VwX18yIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YQW5ub3RhdGlvbl9fR3JvdXBfXzEoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6OTA3MzoxOiAoIHJ1bGVfX1hBbm5vdGF0aW9uX19Hcm91cF9fMV9fSW1wbCBydWxlX19YQW5ub3RhdGlvbl9fR3JvdXBfXzIgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6OTA3NDoyOiBydWxlX19YQW5ub3RhdGlvbl9fR3JvdXBfXzFfX0ltcGwgcnVsZV9fWEFubm90YXRpb25fX0dyb3VwX18yCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMDQxMToxOiAoIHJ1bGVfX1hBbm5vdGF0aW9uX19Hcm91cF9fMV9fSW1wbCBydWxlX19YQW5ub3RhdGlvbl9fR3JvdXBfXzIgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTA0MTI6MjogcnVsZV9fWEFubm90YXRpb25fX0dyb3VwX18xX19JbXBsIHJ1bGVfX1hBbm5vdGF0aW9uX19Hcm91cF9fMgogICAgICAgICAgICAgewogICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfNyk7CiAgICAgICAgICAgICBydWxlX19YQW5ub3RhdGlvbl9fR3JvdXBfXzFfX0ltcGwoKTsKQEAgLTMwOTkyLDIyICszNTQ0OSwyMiBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX1hBbm5vdGF0aW9uX19Hcm91cF9fMV9fSW1wbCIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo5MDgxOjE6IHJ1bGVfX1hBbm5vdGF0aW9uX19Hcm91cF9fMV9fSW1wbCA6ICggJ0AnICkgOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEwNDE5OjE6IHJ1bGVfX1hBbm5vdGF0aW9uX19Hcm91cF9fMV9fSW1wbCA6ICggJ0AnICkgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1hBbm5vdGF0aW9uX19Hcm91cF9fMV9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo5MDg1OjE6ICggKCAnQCcgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo5MDg2OjE6ICggJ0AnICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEwNDIzOjE6ICggKCAnQCcgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMDQyNDoxOiAoICdAJyApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo5MDg2OjE6ICggJ0AnICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjkwODc6MjogJ0AnCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMDQyNDoxOiAoICdAJyApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMDQyNToyOiAnQCcKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WEFubm90YXRpb25BY2Nlc3MoKS5nZXRDb21tZXJjaWFsQXRLZXl3b3JkXzEoKSk7IAogICAgICAgICAgICAgfQotICAgICAgICAgICAgbWF0Y2goaW5wdXQsMTEyLEZPTExPV18yKTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKKyAgICAgICAgICAgIG1hdGNoKGlucHV0LDEyMixGT0xMT1dfMik7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0WEFubm90YXRpb25BY2Nlc3MoKS5nZXRDb21tZXJjaWFsQXRLZXl3b3JkXzEoKSk7IAogICAgICAgICAgICAgfQpAQCAtMzEwMzMsMTYgKzM1NDkwLDE2IEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fWEFubm90YXRpb25fX0dyb3VwX18yIgotICAgIC8vIEludGVybmFsRGF0YURTTC5nOjkwOTY6MTogcnVsZV9fWEFubm90YXRpb25fX0dyb3VwX18yIDogcnVsZV9fWEFubm90YXRpb25fX0dyb3VwX18yX19JbXBsIHJ1bGVfX1hBbm5vdGF0aW9uX19Hcm91cF9fMyA7CisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTA0MzQ6MTogcnVsZV9fWEFubm90YXRpb25fX0dyb3VwX18yIDogcnVsZV9fWEFubm90YXRpb25fX0dyb3VwX18yX19JbXBsIHJ1bGVfX1hBbm5vdGF0aW9uX19Hcm91cF9fMyA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fWEFubm90YXRpb25fX0dyb3VwX18yKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjkxMDA6MTogKCBydWxlX19YQW5ub3RhdGlvbl9fR3JvdXBfXzJfX0ltcGwgcnVsZV9fWEFubm90YXRpb25fX0dyb3VwX18zICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjkxMDE6MjogcnVsZV9fWEFubm90YXRpb25fX0dyb3VwX18yX19JbXBsIHJ1bGVfX1hBbm5vdGF0aW9uX19Hcm91cF9fMworICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTA0Mzg6MTogKCBydWxlX19YQW5ub3RhdGlvbl9fR3JvdXBfXzJfX0ltcGwgcnVsZV9fWEFubm90YXRpb25fX0dyb3VwX18zICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEwNDM5OjI6IHJ1bGVfX1hBbm5vdGF0aW9uX19Hcm91cF9fMl9fSW1wbCBydWxlX19YQW5ub3RhdGlvbl9fR3JvdXBfXzMKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzcwKTsKKyAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzc4KTsKICAgICAgICAgICAgIHJ1bGVfX1hBbm5vdGF0aW9uX19Hcm91cF9fMl9fSW1wbCgpOwogCiAgICAgICAgICAgICBzdGF0ZS5fZnNwLS07CkBAIC0zMTA3MSwyMyArMzU1MjgsMjMgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YQW5ub3RhdGlvbl9fR3JvdXBfXzJfX0ltcGwiCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6OTEwODoxOiBydWxlX19YQW5ub3RhdGlvbl9fR3JvdXBfXzJfX0ltcGwgOiAoICggcnVsZV9fWEFubm90YXRpb25fX0Fubm90YXRpb25UeXBlQXNzaWdubWVudF8yICkgKSA7CisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTA0NDY6MTogcnVsZV9fWEFubm90YXRpb25fX0dyb3VwX18yX19JbXBsIDogKCAoIHJ1bGVfX1hBbm5vdGF0aW9uX19Bbm5vdGF0aW9uVHlwZUFzc2lnbm1lbnRfMiApICkgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1hBbm5vdGF0aW9uX19Hcm91cF9fMl9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo5MTEyOjE6ICggKCAoIHJ1bGVfX1hBbm5vdGF0aW9uX19Bbm5vdGF0aW9uVHlwZUFzc2lnbm1lbnRfMiApICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6OTExMzoxOiAoICggcnVsZV9fWEFubm90YXRpb25fX0Fubm90YXRpb25UeXBlQXNzaWdubWVudF8yICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTA0NTA6MTogKCAoICggcnVsZV9fWEFubm90YXRpb25fX0Fubm90YXRpb25UeXBlQXNzaWdubWVudF8yICkgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMDQ1MToxOiAoICggcnVsZV9fWEFubm90YXRpb25fX0Fubm90YXRpb25UeXBlQXNzaWdubWVudF8yICkgKQogICAgICAgICAgICAgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6OTExMzoxOiAoICggcnVsZV9fWEFubm90YXRpb25fX0Fubm90YXRpb25UeXBlQXNzaWdubWVudF8yICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6OTExNDoyOiAoIHJ1bGVfX1hBbm5vdGF0aW9uX19Bbm5vdGF0aW9uVHlwZUFzc2lnbm1lbnRfMiApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMDQ1MToxOiAoICggcnVsZV9fWEFubm90YXRpb25fX0Fubm90YXRpb25UeXBlQXNzaWdubWVudF8yICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTA0NTI6MjogKCBydWxlX19YQW5ub3RhdGlvbl9fQW5ub3RhdGlvblR5cGVBc3NpZ25tZW50XzIgKQogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYQW5ub3RhdGlvbkFjY2VzcygpLmdldEFubm90YXRpb25UeXBlQXNzaWdubWVudF8yKCkpOyAKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjkxMTU6MjogKCBydWxlX19YQW5ub3RhdGlvbl9fQW5ub3RhdGlvblR5cGVBc3NpZ25tZW50XzIgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6OTExNTozOiBydWxlX19YQW5ub3RhdGlvbl9fQW5ub3RhdGlvblR5cGVBc3NpZ25tZW50XzIKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEwNDUzOjI6ICggcnVsZV9fWEFubm90YXRpb25fX0Fubm90YXRpb25UeXBlQXNzaWdubWVudF8yICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEwNDUzOjM6IHJ1bGVfX1hBbm5vdGF0aW9uX19Bbm5vdGF0aW9uVHlwZUFzc2lnbm1lbnRfMgogICAgICAgICAgICAgewogICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMik7CiAgICAgICAgICAgICBydWxlX19YQW5ub3RhdGlvbl9fQW5ub3RhdGlvblR5cGVBc3NpZ25tZW50XzIoKTsKQEAgLTMxMTIyLDE0ICszNTU3OSwxNCBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX1hBbm5vdGF0aW9uX19Hcm91cF9fMyIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo5MTIzOjE6IHJ1bGVfX1hBbm5vdGF0aW9uX19Hcm91cF9fMyA6IHJ1bGVfX1hBbm5vdGF0aW9uX19Hcm91cF9fM19fSW1wbCA7CisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTA0NjE6MTogcnVsZV9fWEFubm90YXRpb25fX0dyb3VwX18zIDogcnVsZV9fWEFubm90YXRpb25fX0dyb3VwX18zX19JbXBsIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YQW5ub3RhdGlvbl9fR3JvdXBfXzMoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6OTEyNzoxOiAoIHJ1bGVfX1hBbm5vdGF0aW9uX19Hcm91cF9fM19fSW1wbCApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo5MTI4OjI6IHJ1bGVfX1hBbm5vdGF0aW9uX19Hcm91cF9fM19fSW1wbAorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTA0NjU6MTogKCBydWxlX19YQW5ub3RhdGlvbl9fR3JvdXBfXzNfX0ltcGwgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTA0NjY6MjogcnVsZV9fWEFubm90YXRpb25fX0dyb3VwX18zX19JbXBsCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV18yKTsKICAgICAgICAgICAgIHJ1bGVfX1hBbm5vdGF0aW9uX19Hcm91cF9fM19fSW1wbCgpOwpAQCAtMzExNTUsMzEgKzM1NjEyLDMxIEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fWEFubm90YXRpb25fX0dyb3VwX18zX19JbXBsIgotICAgIC8vIEludGVybmFsRGF0YURTTC5nOjkxMzQ6MTogcnVsZV9fWEFubm90YXRpb25fX0dyb3VwX18zX19JbXBsIDogKCAoIHJ1bGVfX1hBbm5vdGF0aW9uX19Hcm91cF8zX18wICk/ICkgOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEwNDcyOjE6IHJ1bGVfX1hBbm5vdGF0aW9uX19Hcm91cF9fM19fSW1wbCA6ICggKCBydWxlX19YQW5ub3RhdGlvbl9fR3JvdXBfM19fMCApPyApIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YQW5ub3RhdGlvbl9fR3JvdXBfXzNfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6OTEzODoxOiAoICggKCBydWxlX19YQW5ub3RhdGlvbl9fR3JvdXBfM19fMCApPyApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjkxMzk6MTogKCAoIHJ1bGVfX1hBbm5vdGF0aW9uX19Hcm91cF8zX18wICk/ICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEwNDc2OjE6ICggKCAoIHJ1bGVfX1hBbm5vdGF0aW9uX19Hcm91cF8zX18wICk/ICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTA0Nzc6MTogKCAoIHJ1bGVfX1hBbm5vdGF0aW9uX19Hcm91cF8zX18wICk/ICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjkxMzk6MTogKCAoIHJ1bGVfX1hBbm5vdGF0aW9uX19Hcm91cF8zX18wICk/ICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjkxNDA6MjogKCBydWxlX19YQW5ub3RhdGlvbl9fR3JvdXBfM19fMCApPworICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTA0Nzc6MTogKCAoIHJ1bGVfX1hBbm5vdGF0aW9uX19Hcm91cF8zX18wICk/ICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEwNDc4OjI6ICggcnVsZV9fWEFubm90YXRpb25fX0dyb3VwXzNfXzAgKT8KICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WEFubm90YXRpb25BY2Nlc3MoKS5nZXRHcm91cF8zKCkpOyAKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjkxNDE6MjogKCBydWxlX19YQW5ub3RhdGlvbl9fR3JvdXBfM19fMCApPwotICAgICAgICAgICAgaW50IGFsdDg2PTI7Ci0gICAgICAgICAgICBpbnQgTEE4Nl8wID0gaW5wdXQuTEEoMSk7CisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMDQ3OToyOiAoIHJ1bGVfX1hBbm5vdGF0aW9uX19Hcm91cF8zX18wICk/CisgICAgICAgICAgICBpbnQgYWx0OTk9MjsKKyAgICAgICAgICAgIGludCBMQTk5XzAgPSBpbnB1dC5MQSgxKTsKIAotICAgICAgICAgICAgaWYgKCAoTEE4Nl8wPT0xMTMpICkgewotICAgICAgICAgICAgICAgIGFsdDg2PTE7CisgICAgICAgICAgICBpZiAoIChMQTk5XzA9PTEyMykgKSB7CisgICAgICAgICAgICAgICAgYWx0OTk9MTsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHN3aXRjaCAoYWx0ODYpIHsKKyAgICAgICAgICAgIHN3aXRjaCAoYWx0OTkpIHsKICAgICAgICAgICAgICAgICBjYXNlIDEgOgotICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo5MTQxOjM6IHJ1bGVfX1hBbm5vdGF0aW9uX19Hcm91cF8zX18wCisgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEwNDc5OjM6IHJ1bGVfX1hBbm5vdGF0aW9uX19Hcm91cF8zX18wCiAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMik7CiAgICAgICAgICAgICAgICAgICAgIHJ1bGVfX1hBbm5vdGF0aW9uX19Hcm91cF8zX18wKCk7CkBAIC0zMTIxNywxNiArMzU2NzQsMTYgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YQW5ub3RhdGlvbl9fR3JvdXBfM19fMCIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo5MTUwOjE6IHJ1bGVfX1hBbm5vdGF0aW9uX19Hcm91cF8zX18wIDogcnVsZV9fWEFubm90YXRpb25fX0dyb3VwXzNfXzBfX0ltcGwgcnVsZV9fWEFubm90YXRpb25fX0dyb3VwXzNfXzEgOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEwNDg4OjE6IHJ1bGVfX1hBbm5vdGF0aW9uX19Hcm91cF8zX18wIDogcnVsZV9fWEFubm90YXRpb25fX0dyb3VwXzNfXzBfX0ltcGwgcnVsZV9fWEFubm90YXRpb25fX0dyb3VwXzNfXzEgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1hBbm5vdGF0aW9uX19Hcm91cF8zX18wKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjkxNTQ6MTogKCBydWxlX19YQW5ub3RhdGlvbl9fR3JvdXBfM19fMF9fSW1wbCBydWxlX19YQW5ub3RhdGlvbl9fR3JvdXBfM19fMSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo5MTU1OjI6IHJ1bGVfX1hBbm5vdGF0aW9uX19Hcm91cF8zX18wX19JbXBsIHJ1bGVfX1hBbm5vdGF0aW9uX19Hcm91cF8zX18xCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMDQ5MjoxOiAoIHJ1bGVfX1hBbm5vdGF0aW9uX19Hcm91cF8zX18wX19JbXBsIHJ1bGVfX1hBbm5vdGF0aW9uX19Hcm91cF8zX18xICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEwNDkzOjI6IHJ1bGVfX1hBbm5vdGF0aW9uX19Hcm91cF8zX18wX19JbXBsIHJ1bGVfX1hBbm5vdGF0aW9uX19Hcm91cF8zX18xCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV183MSk7CisgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV183OSk7CiAgICAgICAgICAgICBydWxlX19YQW5ub3RhdGlvbl9fR3JvdXBfM19fMF9fSW1wbCgpOwogCiAgICAgICAgICAgICBzdGF0ZS5fZnNwLS07CkBAIC0zMTI1NSwyNSArMzU3MTIsMjUgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YQW5ub3RhdGlvbl9fR3JvdXBfM19fMF9fSW1wbCIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo5MTYyOjE6IHJ1bGVfX1hBbm5vdGF0aW9uX19Hcm91cF8zX18wX19JbXBsIDogKCAoICcoJyApICkgOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEwNTAwOjE6IHJ1bGVfX1hBbm5vdGF0aW9uX19Hcm91cF8zX18wX19JbXBsIDogKCAoICcoJyApICkgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1hBbm5vdGF0aW9uX19Hcm91cF8zX18wX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjkxNjY6MTogKCAoICggJygnICkgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo5MTY3OjE6ICggKCAnKCcgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMDUwNDoxOiAoICggKCAnKCcgKSApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEwNTA1OjE6ICggKCAnKCcgKSApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo5MTY3OjE6ICggKCAnKCcgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo5MTY4OjI6ICggJygnICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEwNTA1OjE6ICggKCAnKCcgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMDUwNjoyOiAoICcoJyApCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhBbm5vdGF0aW9uQWNjZXNzKCkuZ2V0TGVmdFBhcmVudGhlc2lzS2V5d29yZF8zXzAoKSk7IAogICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6OTE2OToyOiAoICcoJyApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo5MTY5OjM6ICcoJworICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTA1MDc6MjogKCAnKCcgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTA1MDc6MzogJygnCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICBtYXRjaChpbnB1dCwxMTMsRk9MTE9XXzIpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOworICAgICAgICAgICAgbWF0Y2goaW5wdXQsMTIzLEZPTExPV18yKTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKIAogICAgICAgICAgICAgfQogCkBAIC0zMTMwMiwxNiArMzU3NTksMTYgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YQW5ub3RhdGlvbl9fR3JvdXBfM19fMSIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo5MTc3OjE6IHJ1bGVfX1hBbm5vdGF0aW9uX19Hcm91cF8zX18xIDogcnVsZV9fWEFubm90YXRpb25fX0dyb3VwXzNfXzFfX0ltcGwgcnVsZV9fWEFubm90YXRpb25fX0dyb3VwXzNfXzIgOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEwNTE1OjE6IHJ1bGVfX1hBbm5vdGF0aW9uX19Hcm91cF8zX18xIDogcnVsZV9fWEFubm90YXRpb25fX0dyb3VwXzNfXzFfX0ltcGwgcnVsZV9fWEFubm90YXRpb25fX0dyb3VwXzNfXzIgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1hBbm5vdGF0aW9uX19Hcm91cF8zX18xKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjkxODE6MTogKCBydWxlX19YQW5ub3RhdGlvbl9fR3JvdXBfM19fMV9fSW1wbCBydWxlX19YQW5ub3RhdGlvbl9fR3JvdXBfM19fMiApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo5MTgyOjI6IHJ1bGVfX1hBbm5vdGF0aW9uX19Hcm91cF8zX18xX19JbXBsIHJ1bGVfX1hBbm5vdGF0aW9uX19Hcm91cF8zX18yCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMDUxOToxOiAoIHJ1bGVfX1hBbm5vdGF0aW9uX19Hcm91cF8zX18xX19JbXBsIHJ1bGVfX1hBbm5vdGF0aW9uX19Hcm91cF8zX18yICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEwNTIwOjI6IHJ1bGVfX1hBbm5vdGF0aW9uX19Hcm91cF8zX18xX19JbXBsIHJ1bGVfX1hBbm5vdGF0aW9uX19Hcm91cF8zX18yCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV183MSk7CisgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV183OSk7CiAgICAgICAgICAgICBydWxlX19YQW5ub3RhdGlvbl9fR3JvdXBfM19fMV9fSW1wbCgpOwogCiAgICAgICAgICAgICBzdGF0ZS5fZnNwLS07CkBAIC0zMTM0MCwzMSArMzU3OTcsMzEgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YQW5ub3RhdGlvbl9fR3JvdXBfM19fMV9fSW1wbCIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo5MTg5OjE6IHJ1bGVfX1hBbm5vdGF0aW9uX19Hcm91cF8zX18xX19JbXBsIDogKCAoIHJ1bGVfX1hBbm5vdGF0aW9uX19BbHRlcm5hdGl2ZXNfM18xICk/ICkgOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEwNTI3OjE6IHJ1bGVfX1hBbm5vdGF0aW9uX19Hcm91cF8zX18xX19JbXBsIDogKCAoIHJ1bGVfX1hBbm5vdGF0aW9uX19BbHRlcm5hdGl2ZXNfM18xICk/ICkgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1hBbm5vdGF0aW9uX19Hcm91cF8zX18xX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjkxOTM6MTogKCAoICggcnVsZV9fWEFubm90YXRpb25fX0FsdGVybmF0aXZlc18zXzEgKT8gKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo5MTk0OjE6ICggKCBydWxlX19YQW5ub3RhdGlvbl9fQWx0ZXJuYXRpdmVzXzNfMSApPyApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMDUzMToxOiAoICggKCBydWxlX19YQW5ub3RhdGlvbl9fQWx0ZXJuYXRpdmVzXzNfMSApPyApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEwNTMyOjE6ICggKCBydWxlX19YQW5ub3RhdGlvbl9fQWx0ZXJuYXRpdmVzXzNfMSApPyApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo5MTk0OjE6ICggKCBydWxlX19YQW5ub3RhdGlvbl9fQWx0ZXJuYXRpdmVzXzNfMSApPyApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo5MTk1OjI6ICggcnVsZV9fWEFubm90YXRpb25fX0FsdGVybmF0aXZlc18zXzEgKT8KKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEwNTMyOjE6ICggKCBydWxlX19YQW5ub3RhdGlvbl9fQWx0ZXJuYXRpdmVzXzNfMSApPyApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMDUzMzoyOiAoIHJ1bGVfX1hBbm5vdGF0aW9uX19BbHRlcm5hdGl2ZXNfM18xICk/CiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhBbm5vdGF0aW9uQWNjZXNzKCkuZ2V0QWx0ZXJuYXRpdmVzXzNfMSgpKTsgCiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo5MTk2OjI6ICggcnVsZV9fWEFubm90YXRpb25fX0FsdGVybmF0aXZlc18zXzEgKT8KLSAgICAgICAgICAgIGludCBhbHQ4Nz0yOwotICAgICAgICAgICAgaW50IExBODdfMCA9IGlucHV0LkxBKDEpOworICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTA1MzQ6MjogKCBydWxlX19YQW5ub3RhdGlvbl9fQWx0ZXJuYXRpdmVzXzNfMSApPworICAgICAgICAgICAgaW50IGFsdDEwMD0yOworICAgICAgICAgICAgaW50IExBMTAwXzAgPSBpbnB1dC5MQSgxKTsKIAotICAgICAgICAgICAgaWYgKCAoKExBODdfMD49UlVMRV9TVFJJTkcgJiYgTEE4N18wPD1SVUxFX0RFQ0lNQUwpfHxMQTg3XzA9PTI3fHwoTEE4N18wPj0zNCAmJiBMQTg3XzA8PTM1KXx8TEE4N18wPT00MHx8KExBODdfMD49NDUgJiYgTEE4N18wPD01MCl8fExBODdfMD09NzB8fExBODdfMD09OTV8fChMQTg3XzA+PTExMiAmJiBMQTg3XzA8PTExMyl8fChMQTg3XzA+PTExNyAmJiBMQTg3XzA8PTExOCl8fExBODdfMD09MTIwfHxMQTg3XzA9PTEyMnx8KExBODdfMD49MTI2ICYmIExBODdfMDw9MTMzKXx8TEE4N18wPT0xMzV8fExBODdfMD09MTU0KSApIHsKLSAgICAgICAgICAgICAgICBhbHQ4Nz0xOworICAgICAgICAgICAgaWYgKCAoKExBMTAwXzA+PVJVTEVfU1RSSU5HICYmIExBMTAwXzA8PVJVTEVfREVDSU1BTCl8fExBMTAwXzA9PTI3fHwoTEExMDBfMD49MzQgJiYgTEExMDBfMDw9MzUpfHxMQTEwMF8wPT00MHx8KExBMTAwXzA+PTQ1ICYmIExBMTAwXzA8PTUwKXx8TEExMDBfMD09NzV8fExBMTAwXzA9PTEwMnx8KExBMTAwXzA+PTEyMiAmJiBMQTEwMF8wPD0xMjMpfHwoTEExMDBfMD49MTI3ICYmIExBMTAwXzA8PTEyOCl8fExBMTAwXzA9PTEzMHx8TEExMDBfMD09MTMyfHwoTEExMDBfMD49MTM2ICYmIExBMTAwXzA8PTE0Myl8fExBMTAwXzA9PTE0NXx8TEExMDBfMD09MTY2KSApIHsKKyAgICAgICAgICAgICAgICBhbHQxMDA9MTsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHN3aXRjaCAoYWx0ODcpIHsKKyAgICAgICAgICAgIHN3aXRjaCAoYWx0MTAwKSB7CiAgICAgICAgICAgICAgICAgY2FzZSAxIDoKLSAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6OTE5NjozOiBydWxlX19YQW5ub3RhdGlvbl9fQWx0ZXJuYXRpdmVzXzNfMQorICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMDUzNDozOiBydWxlX19YQW5ub3RhdGlvbl9fQWx0ZXJuYXRpdmVzXzNfMQogICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzIpOwogICAgICAgICAgICAgICAgICAgICBydWxlX19YQW5ub3RhdGlvbl9fQWx0ZXJuYXRpdmVzXzNfMSgpOwpAQCAtMzE0MDIsMTQgKzM1ODU5LDE0IEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fWEFubm90YXRpb25fX0dyb3VwXzNfXzIiCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6OTIwNDoxOiBydWxlX19YQW5ub3RhdGlvbl9fR3JvdXBfM19fMiA6IHJ1bGVfX1hBbm5vdGF0aW9uX19Hcm91cF8zX18yX19JbXBsIDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMDU0MjoxOiBydWxlX19YQW5ub3RhdGlvbl9fR3JvdXBfM19fMiA6IHJ1bGVfX1hBbm5vdGF0aW9uX19Hcm91cF8zX18yX19JbXBsIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YQW5ub3RhdGlvbl9fR3JvdXBfM19fMigpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo5MjA4OjE6ICggcnVsZV9fWEFubm90YXRpb25fX0dyb3VwXzNfXzJfX0ltcGwgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6OTIwOToyOiBydWxlX19YQW5ub3RhdGlvbl9fR3JvdXBfM19fMl9fSW1wbAorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTA1NDY6MTogKCBydWxlX19YQW5ub3RhdGlvbl9fR3JvdXBfM19fMl9fSW1wbCApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMDU0NzoyOiBydWxlX19YQW5ub3RhdGlvbl9fR3JvdXBfM19fMl9fSW1wbAogICAgICAgICAgICAgewogICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMik7CiAgICAgICAgICAgICBydWxlX19YQW5ub3RhdGlvbl9fR3JvdXBfM19fMl9fSW1wbCgpOwpAQCAtMzE0MzUsMjIgKzM1ODkyLDIyIEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fWEFubm90YXRpb25fX0dyb3VwXzNfXzJfX0ltcGwiCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6OTIxNToxOiBydWxlX19YQW5ub3RhdGlvbl9fR3JvdXBfM19fMl9fSW1wbCA6ICggJyknICkgOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEwNTUzOjE6IHJ1bGVfX1hBbm5vdGF0aW9uX19Hcm91cF8zX18yX19JbXBsIDogKCAnKScgKSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fWEFubm90YXRpb25fX0dyb3VwXzNfXzJfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6OTIxOToxOiAoICggJyknICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6OTIyMDoxOiAoICcpJyApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMDU1NzoxOiAoICggJyknICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTA1NTg6MTogKCAnKScgKQogICAgICAgICAgICAgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6OTIyMDoxOiAoICcpJyApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo5MjIxOjI6ICcpJworICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTA1NTg6MTogKCAnKScgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTA1NTk6MjogJyknCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhBbm5vdGF0aW9uQWNjZXNzKCkuZ2V0UmlnaHRQYXJlbnRoZXNpc0tleXdvcmRfM18yKCkpOyAKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1hdGNoKGlucHV0LDExNCxGT0xMT1dfMik7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CisgICAgICAgICAgICBtYXRjaChpbnB1dCwxMjQsRk9MTE9XXzIpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOwogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBhZnRlcihncmFtbWFyQWNjZXNzLmdldFhBbm5vdGF0aW9uQWNjZXNzKCkuZ2V0UmlnaHRQYXJlbnRoZXNpc0tleXdvcmRfM18yKCkpOyAKICAgICAgICAgICAgIH0KQEAgLTMxNDc2LDE2ICszNTkzMywxNiBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX1hBbm5vdGF0aW9uX19Hcm91cF8zXzFfMF9fMCIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo5MjMxOjE6IHJ1bGVfX1hBbm5vdGF0aW9uX19Hcm91cF8zXzFfMF9fMCA6IHJ1bGVfX1hBbm5vdGF0aW9uX19Hcm91cF8zXzFfMF9fMF9fSW1wbCBydWxlX19YQW5ub3RhdGlvbl9fR3JvdXBfM18xXzBfXzEgOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEwNTY5OjE6IHJ1bGVfX1hBbm5vdGF0aW9uX19Hcm91cF8zXzFfMF9fMCA6IHJ1bGVfX1hBbm5vdGF0aW9uX19Hcm91cF8zXzFfMF9fMF9fSW1wbCBydWxlX19YQW5ub3RhdGlvbl9fR3JvdXBfM18xXzBfXzEgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1hBbm5vdGF0aW9uX19Hcm91cF8zXzFfMF9fMCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo5MjM1OjE6ICggcnVsZV9fWEFubm90YXRpb25fX0dyb3VwXzNfMV8wX18wX19JbXBsIHJ1bGVfX1hBbm5vdGF0aW9uX19Hcm91cF8zXzFfMF9fMSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo5MjM2OjI6IHJ1bGVfX1hBbm5vdGF0aW9uX19Hcm91cF8zXzFfMF9fMF9fSW1wbCBydWxlX19YQW5ub3RhdGlvbl9fR3JvdXBfM18xXzBfXzEKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEwNTczOjE6ICggcnVsZV9fWEFubm90YXRpb25fX0dyb3VwXzNfMV8wX18wX19JbXBsIHJ1bGVfX1hBbm5vdGF0aW9uX19Hcm91cF8zXzFfMF9fMSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMDU3NDoyOiBydWxlX19YQW5ub3RhdGlvbl9fR3JvdXBfM18xXzBfXzBfX0ltcGwgcnVsZV9fWEFubm90YXRpb25fX0dyb3VwXzNfMV8wX18xCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV183Mik7CisgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV184MCk7CiAgICAgICAgICAgICBydWxlX19YQW5ub3RhdGlvbl9fR3JvdXBfM18xXzBfXzBfX0ltcGwoKTsKIAogICAgICAgICAgICAgc3RhdGUuX2ZzcC0tOwpAQCAtMzE1MTQsMjMgKzM1OTcxLDIzIEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fWEFubm90YXRpb25fX0dyb3VwXzNfMV8wX18wX19JbXBsIgotICAgIC8vIEludGVybmFsRGF0YURTTC5nOjkyNDM6MTogcnVsZV9fWEFubm90YXRpb25fX0dyb3VwXzNfMV8wX18wX19JbXBsIDogKCAoIHJ1bGVfX1hBbm5vdGF0aW9uX19FbGVtZW50VmFsdWVQYWlyc0Fzc2lnbm1lbnRfM18xXzBfMCApICkgOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEwNTgxOjE6IHJ1bGVfX1hBbm5vdGF0aW9uX19Hcm91cF8zXzFfMF9fMF9fSW1wbCA6ICggKCBydWxlX19YQW5ub3RhdGlvbl9fRWxlbWVudFZhbHVlUGFpcnNBc3NpZ25tZW50XzNfMV8wXzAgKSApIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YQW5ub3RhdGlvbl9fR3JvdXBfM18xXzBfXzBfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6OTI0NzoxOiAoICggKCBydWxlX19YQW5ub3RhdGlvbl9fRWxlbWVudFZhbHVlUGFpcnNBc3NpZ25tZW50XzNfMV8wXzAgKSApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjkyNDg6MTogKCAoIHJ1bGVfX1hBbm5vdGF0aW9uX19FbGVtZW50VmFsdWVQYWlyc0Fzc2lnbm1lbnRfM18xXzBfMCApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEwNTg1OjE6ICggKCAoIHJ1bGVfX1hBbm5vdGF0aW9uX19FbGVtZW50VmFsdWVQYWlyc0Fzc2lnbm1lbnRfM18xXzBfMCApICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTA1ODY6MTogKCAoIHJ1bGVfX1hBbm5vdGF0aW9uX19FbGVtZW50VmFsdWVQYWlyc0Fzc2lnbm1lbnRfM18xXzBfMCApICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjkyNDg6MTogKCAoIHJ1bGVfX1hBbm5vdGF0aW9uX19FbGVtZW50VmFsdWVQYWlyc0Fzc2lnbm1lbnRfM18xXzBfMCApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjkyNDk6MjogKCBydWxlX19YQW5ub3RhdGlvbl9fRWxlbWVudFZhbHVlUGFpcnNBc3NpZ25tZW50XzNfMV8wXzAgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTA1ODY6MTogKCAoIHJ1bGVfX1hBbm5vdGF0aW9uX19FbGVtZW50VmFsdWVQYWlyc0Fzc2lnbm1lbnRfM18xXzBfMCApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEwNTg3OjI6ICggcnVsZV9fWEFubm90YXRpb25fX0VsZW1lbnRWYWx1ZVBhaXJzQXNzaWdubWVudF8zXzFfMF8wICkKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WEFubm90YXRpb25BY2Nlc3MoKS5nZXRFbGVtZW50VmFsdWVQYWlyc0Fzc2lnbm1lbnRfM18xXzBfMCgpKTsgCiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo5MjUwOjI6ICggcnVsZV9fWEFubm90YXRpb25fX0VsZW1lbnRWYWx1ZVBhaXJzQXNzaWdubWVudF8zXzFfMF8wICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjkyNTA6MzogcnVsZV9fWEFubm90YXRpb25fX0VsZW1lbnRWYWx1ZVBhaXJzQXNzaWdubWVudF8zXzFfMF8wCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMDU4ODoyOiAoIHJ1bGVfX1hBbm5vdGF0aW9uX19FbGVtZW50VmFsdWVQYWlyc0Fzc2lnbm1lbnRfM18xXzBfMCApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMDU4ODozOiBydWxlX19YQW5ub3RhdGlvbl9fRWxlbWVudFZhbHVlUGFpcnNBc3NpZ25tZW50XzNfMV8wXzAKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzIpOwogICAgICAgICAgICAgcnVsZV9fWEFubm90YXRpb25fX0VsZW1lbnRWYWx1ZVBhaXJzQXNzaWdubWVudF8zXzFfMF8wKCk7CkBAIC0zMTU2NSwxNCArMzYwMjIsMTQgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YQW5ub3RhdGlvbl9fR3JvdXBfM18xXzBfXzEiCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6OTI1ODoxOiBydWxlX19YQW5ub3RhdGlvbl9fR3JvdXBfM18xXzBfXzEgOiBydWxlX19YQW5ub3RhdGlvbl9fR3JvdXBfM18xXzBfXzFfX0ltcGwgOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEwNTk2OjE6IHJ1bGVfX1hBbm5vdGF0aW9uX19Hcm91cF8zXzFfMF9fMSA6IHJ1bGVfX1hBbm5vdGF0aW9uX19Hcm91cF8zXzFfMF9fMV9fSW1wbCA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fWEFubm90YXRpb25fX0dyb3VwXzNfMV8wX18xKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjkyNjI6MTogKCBydWxlX19YQW5ub3RhdGlvbl9fR3JvdXBfM18xXzBfXzFfX0ltcGwgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6OTI2MzoyOiBydWxlX19YQW5ub3RhdGlvbl9fR3JvdXBfM18xXzBfXzFfX0ltcGwKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEwNjAwOjE6ICggcnVsZV9fWEFubm90YXRpb25fX0dyb3VwXzNfMV8wX18xX19JbXBsICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEwNjAxOjI6IHJ1bGVfX1hBbm5vdGF0aW9uX19Hcm91cF8zXzFfMF9fMV9fSW1wbAogICAgICAgICAgICAgewogICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMik7CiAgICAgICAgICAgICBydWxlX19YQW5ub3RhdGlvbl9fR3JvdXBfM18xXzBfXzFfX0ltcGwoKTsKQEAgLTMxNTk4LDM3ICszNjA1NSwzNyBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX1hBbm5vdGF0aW9uX19Hcm91cF8zXzFfMF9fMV9fSW1wbCIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo5MjY5OjE6IHJ1bGVfX1hBbm5vdGF0aW9uX19Hcm91cF8zXzFfMF9fMV9fSW1wbCA6ICggKCBydWxlX19YQW5ub3RhdGlvbl9fR3JvdXBfM18xXzBfMV9fMCApKiApIDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMDYwNzoxOiBydWxlX19YQW5ub3RhdGlvbl9fR3JvdXBfM18xXzBfXzFfX0ltcGwgOiAoICggcnVsZV9fWEFubm90YXRpb25fX0dyb3VwXzNfMV8wXzFfXzAgKSogKSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fWEFubm90YXRpb25fX0dyb3VwXzNfMV8wX18xX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjkyNzM6MTogKCAoICggcnVsZV9fWEFubm90YXRpb25fX0dyb3VwXzNfMV8wXzFfXzAgKSogKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo5Mjc0OjE6ICggKCBydWxlX19YQW5ub3RhdGlvbl9fR3JvdXBfM18xXzBfMV9fMCApKiApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMDYxMToxOiAoICggKCBydWxlX19YQW5ub3RhdGlvbl9fR3JvdXBfM18xXzBfMV9fMCApKiApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEwNjEyOjE6ICggKCBydWxlX19YQW5ub3RhdGlvbl9fR3JvdXBfM18xXzBfMV9fMCApKiApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo5Mjc0OjE6ICggKCBydWxlX19YQW5ub3RhdGlvbl9fR3JvdXBfM18xXzBfMV9fMCApKiApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo5Mjc1OjI6ICggcnVsZV9fWEFubm90YXRpb25fX0dyb3VwXzNfMV8wXzFfXzAgKSoKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEwNjEyOjE6ICggKCBydWxlX19YQW5ub3RhdGlvbl9fR3JvdXBfM18xXzBfMV9fMCApKiApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMDYxMzoyOiAoIHJ1bGVfX1hBbm5vdGF0aW9uX19Hcm91cF8zXzFfMF8xX18wICkqCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhBbm5vdGF0aW9uQWNjZXNzKCkuZ2V0R3JvdXBfM18xXzBfMSgpKTsgCiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo5Mjc2OjI6ICggcnVsZV9fWEFubm90YXRpb25fX0dyb3VwXzNfMV8wXzFfXzAgKSoKLSAgICAgICAgICAgIGxvb3A4ODoKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEwNjE0OjI6ICggcnVsZV9fWEFubm90YXRpb25fX0dyb3VwXzNfMV8wXzFfXzAgKSoKKyAgICAgICAgICAgIGxvb3AxMDE6CiAgICAgICAgICAgICBkbyB7Ci0gICAgICAgICAgICAgICAgaW50IGFsdDg4PTI7Ci0gICAgICAgICAgICAgICAgaW50IExBODhfMCA9IGlucHV0LkxBKDEpOworICAgICAgICAgICAgICAgIGludCBhbHQxMDE9MjsKKyAgICAgICAgICAgICAgICBpbnQgTEExMDFfMCA9IGlucHV0LkxBKDEpOwogCi0gICAgICAgICAgICAgICAgaWYgKCAoTEE4OF8wPT0xMTUpICkgewotICAgICAgICAgICAgICAgICAgICBhbHQ4OD0xOworICAgICAgICAgICAgICAgIGlmICggKExBMTAxXzA9PTEyNSkgKSB7CisgICAgICAgICAgICAgICAgICAgIGFsdDEwMT0xOwogICAgICAgICAgICAgICAgIH0KIAogCi0gICAgICAgICAgICAgICAgc3dpdGNoIChhbHQ4OCkgeworICAgICAgICAgICAgICAgIHN3aXRjaCAoYWx0MTAxKSB7CiAgICAgICAgICAgICAJY2FzZSAxIDoKLSAgICAgICAgICAgIAkgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6OTI3NjozOiBydWxlX19YQW5ub3RhdGlvbl9fR3JvdXBfM18xXzBfMV9fMAorICAgICAgICAgICAgCSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMDYxNDozOiBydWxlX19YQW5ub3RhdGlvbl9fR3JvdXBfM18xXzBfMV9fMAogICAgICAgICAgICAgCSAgICB7Ci0gICAgICAgICAgICAJICAgIHB1c2hGb2xsb3coRk9MTE9XXzczKTsKKyAgICAgICAgICAgIAkgICAgcHVzaEZvbGxvdyhGT0xMT1dfODEpOwogICAgICAgICAgICAgCSAgICBydWxlX19YQW5ub3RhdGlvbl9fR3JvdXBfM18xXzBfMV9fMCgpOwogCiAgICAgICAgICAgICAJICAgIHN0YXRlLl9mc3AtLTsKQEAgLTMxNjM4LDcgKzM2MDk1LDcgQEAKICAgICAgICAgICAgIAkgICAgYnJlYWs7CiAKICAgICAgICAgICAgIAlkZWZhdWx0IDoKLSAgICAgICAgICAgIAkgICAgYnJlYWsgbG9vcDg4OworICAgICAgICAgICAgCSAgICBicmVhayBsb29wMTAxOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0gd2hpbGUgKHRydWUpOwogCkBAIC0zMTY2NywxNCArMzYxMjQsMTQgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YQW5ub3RhdGlvbl9fR3JvdXBfM18xXzBfMV9fMCIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo5Mjg1OjE6IHJ1bGVfX1hBbm5vdGF0aW9uX19Hcm91cF8zXzFfMF8xX18wIDogcnVsZV9fWEFubm90YXRpb25fX0dyb3VwXzNfMV8wXzFfXzBfX0ltcGwgcnVsZV9fWEFubm90YXRpb25fX0dyb3VwXzNfMV8wXzFfXzEgOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEwNjIzOjE6IHJ1bGVfX1hBbm5vdGF0aW9uX19Hcm91cF8zXzFfMF8xX18wIDogcnVsZV9fWEFubm90YXRpb25fX0dyb3VwXzNfMV8wXzFfXzBfX0ltcGwgcnVsZV9fWEFubm90YXRpb25fX0dyb3VwXzNfMV8wXzFfXzEgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1hBbm5vdGF0aW9uX19Hcm91cF8zXzFfMF8xX18wKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjkyODk6MTogKCBydWxlX19YQW5ub3RhdGlvbl9fR3JvdXBfM18xXzBfMV9fMF9fSW1wbCBydWxlX19YQW5ub3RhdGlvbl9fR3JvdXBfM18xXzBfMV9fMSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo5MjkwOjI6IHJ1bGVfX1hBbm5vdGF0aW9uX19Hcm91cF8zXzFfMF8xX18wX19JbXBsIHJ1bGVfX1hBbm5vdGF0aW9uX19Hcm91cF8zXzFfMF8xX18xCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMDYyNzoxOiAoIHJ1bGVfX1hBbm5vdGF0aW9uX19Hcm91cF8zXzFfMF8xX18wX19JbXBsIHJ1bGVfX1hBbm5vdGF0aW9uX19Hcm91cF8zXzFfMF8xX18xICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEwNjI4OjI6IHJ1bGVfX1hBbm5vdGF0aW9uX19Hcm91cF8zXzFfMF8xX18wX19JbXBsIHJ1bGVfX1hBbm5vdGF0aW9uX19Hcm91cF8zXzFfMF8xX18xCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV183KTsKICAgICAgICAgICAgIHJ1bGVfX1hBbm5vdGF0aW9uX19Hcm91cF8zXzFfMF8xX18wX19JbXBsKCk7CkBAIC0zMTcwNSwyMiArMzYxNjIsMjIgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YQW5ub3RhdGlvbl9fR3JvdXBfM18xXzBfMV9fMF9fSW1wbCIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo5Mjk3OjE6IHJ1bGVfX1hBbm5vdGF0aW9uX19Hcm91cF8zXzFfMF8xX18wX19JbXBsIDogKCAnLCcgKSA7CisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTA2MzU6MTogcnVsZV9fWEFubm90YXRpb25fX0dyb3VwXzNfMV8wXzFfXzBfX0ltcGwgOiAoICcsJyApIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YQW5ub3RhdGlvbl9fR3JvdXBfM18xXzBfMV9fMF9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo5MzAxOjE6ICggKCAnLCcgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo5MzAyOjE6ICggJywnICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEwNjM5OjE6ICggKCAnLCcgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMDY0MDoxOiAoICcsJyApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo5MzAyOjE6ICggJywnICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjkzMDM6MjogJywnCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMDY0MDoxOiAoICcsJyApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMDY0MToyOiAnLCcKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WEFubm90YXRpb25BY2Nlc3MoKS5nZXRDb21tYUtleXdvcmRfM18xXzBfMV8wKCkpOyAKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1hdGNoKGlucHV0LDExNSxGT0xMT1dfMik7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CisgICAgICAgICAgICBtYXRjaChpbnB1dCwxMjUsRk9MTE9XXzIpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOwogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBhZnRlcihncmFtbWFyQWNjZXNzLmdldFhBbm5vdGF0aW9uQWNjZXNzKCkuZ2V0Q29tbWFLZXl3b3JkXzNfMV8wXzFfMCgpKTsgCiAgICAgICAgICAgICB9CkBAIC0zMTc0NiwxNCArMzYyMDMsMTQgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YQW5ub3RhdGlvbl9fR3JvdXBfM18xXzBfMV9fMSIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo5MzEyOjE6IHJ1bGVfX1hBbm5vdGF0aW9uX19Hcm91cF8zXzFfMF8xX18xIDogcnVsZV9fWEFubm90YXRpb25fX0dyb3VwXzNfMV8wXzFfXzFfX0ltcGwgOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEwNjUwOjE6IHJ1bGVfX1hBbm5vdGF0aW9uX19Hcm91cF8zXzFfMF8xX18xIDogcnVsZV9fWEFubm90YXRpb25fX0dyb3VwXzNfMV8wXzFfXzFfX0ltcGwgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1hBbm5vdGF0aW9uX19Hcm91cF8zXzFfMF8xX18xKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjkzMTY6MTogKCBydWxlX19YQW5ub3RhdGlvbl9fR3JvdXBfM18xXzBfMV9fMV9fSW1wbCApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo5MzE3OjI6IHJ1bGVfX1hBbm5vdGF0aW9uX19Hcm91cF8zXzFfMF8xX18xX19JbXBsCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMDY1NDoxOiAoIHJ1bGVfX1hBbm5vdGF0aW9uX19Hcm91cF8zXzFfMF8xX18xX19JbXBsICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEwNjU1OjI6IHJ1bGVfX1hBbm5vdGF0aW9uX19Hcm91cF8zXzFfMF8xX18xX19JbXBsCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV18yKTsKICAgICAgICAgICAgIHJ1bGVfX1hBbm5vdGF0aW9uX19Hcm91cF8zXzFfMF8xX18xX19JbXBsKCk7CkBAIC0zMTc3OSwyMyArMzYyMzYsMjMgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YQW5ub3RhdGlvbl9fR3JvdXBfM18xXzBfMV9fMV9fSW1wbCIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo5MzIzOjE6IHJ1bGVfX1hBbm5vdGF0aW9uX19Hcm91cF8zXzFfMF8xX18xX19JbXBsIDogKCAoIHJ1bGVfX1hBbm5vdGF0aW9uX19FbGVtZW50VmFsdWVQYWlyc0Fzc2lnbm1lbnRfM18xXzBfMV8xICkgKSA7CisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTA2NjE6MTogcnVsZV9fWEFubm90YXRpb25fX0dyb3VwXzNfMV8wXzFfXzFfX0ltcGwgOiAoICggcnVsZV9fWEFubm90YXRpb25fX0VsZW1lbnRWYWx1ZVBhaXJzQXNzaWdubWVudF8zXzFfMF8xXzEgKSApIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YQW5ub3RhdGlvbl9fR3JvdXBfM18xXzBfMV9fMV9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo5MzI3OjE6ICggKCAoIHJ1bGVfX1hBbm5vdGF0aW9uX19FbGVtZW50VmFsdWVQYWlyc0Fzc2lnbm1lbnRfM18xXzBfMV8xICkgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo5MzI4OjE6ICggKCBydWxlX19YQW5ub3RhdGlvbl9fRWxlbWVudFZhbHVlUGFpcnNBc3NpZ25tZW50XzNfMV8wXzFfMSApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEwNjY1OjE6ICggKCAoIHJ1bGVfX1hBbm5vdGF0aW9uX19FbGVtZW50VmFsdWVQYWlyc0Fzc2lnbm1lbnRfM18xXzBfMV8xICkgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMDY2NjoxOiAoICggcnVsZV9fWEFubm90YXRpb25fX0VsZW1lbnRWYWx1ZVBhaXJzQXNzaWdubWVudF8zXzFfMF8xXzEgKSApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo5MzI4OjE6ICggKCBydWxlX19YQW5ub3RhdGlvbl9fRWxlbWVudFZhbHVlUGFpcnNBc3NpZ25tZW50XzNfMV8wXzFfMSApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjkzMjk6MjogKCBydWxlX19YQW5ub3RhdGlvbl9fRWxlbWVudFZhbHVlUGFpcnNBc3NpZ25tZW50XzNfMV8wXzFfMSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMDY2NjoxOiAoICggcnVsZV9fWEFubm90YXRpb25fX0VsZW1lbnRWYWx1ZVBhaXJzQXNzaWdubWVudF8zXzFfMF8xXzEgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMDY2NzoyOiAoIHJ1bGVfX1hBbm5vdGF0aW9uX19FbGVtZW50VmFsdWVQYWlyc0Fzc2lnbm1lbnRfM18xXzBfMV8xICkKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WEFubm90YXRpb25BY2Nlc3MoKS5nZXRFbGVtZW50VmFsdWVQYWlyc0Fzc2lnbm1lbnRfM18xXzBfMV8xKCkpOyAKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjkzMzA6MjogKCBydWxlX19YQW5ub3RhdGlvbl9fRWxlbWVudFZhbHVlUGFpcnNBc3NpZ25tZW50XzNfMV8wXzFfMSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo5MzMwOjM6IHJ1bGVfX1hBbm5vdGF0aW9uX19FbGVtZW50VmFsdWVQYWlyc0Fzc2lnbm1lbnRfM18xXzBfMV8xCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMDY2ODoyOiAoIHJ1bGVfX1hBbm5vdGF0aW9uX19FbGVtZW50VmFsdWVQYWlyc0Fzc2lnbm1lbnRfM18xXzBfMV8xICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEwNjY4OjM6IHJ1bGVfX1hBbm5vdGF0aW9uX19FbGVtZW50VmFsdWVQYWlyc0Fzc2lnbm1lbnRfM18xXzBfMV8xCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV18yKTsKICAgICAgICAgICAgIHJ1bGVfX1hBbm5vdGF0aW9uX19FbGVtZW50VmFsdWVQYWlyc0Fzc2lnbm1lbnRfM18xXzBfMV8xKCk7CkBAIC0zMTgzMCwxNiArMzYyODcsMTYgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZVBhaXJfX0dyb3VwX18wIgotICAgIC8vIEludGVybmFsRGF0YURTTC5nOjkzMzk6MTogcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVQYWlyX19Hcm91cF9fMCA6IHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlUGFpcl9fR3JvdXBfXzBfX0ltcGwgcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVQYWlyX19Hcm91cF9fMSA7CisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTA2Nzc6MTogcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVQYWlyX19Hcm91cF9fMCA6IHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlUGFpcl9fR3JvdXBfXzBfX0ltcGwgcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVQYWlyX19Hcm91cF9fMSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVQYWlyX19Hcm91cF9fMCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo5MzQzOjE6ICggcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVQYWlyX19Hcm91cF9fMF9fSW1wbCBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZVBhaXJfX0dyb3VwX18xICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjkzNDQ6MjogcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVQYWlyX19Hcm91cF9fMF9fSW1wbCBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZVBhaXJfX0dyb3VwX18xCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMDY4MToxOiAoIHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlUGFpcl9fR3JvdXBfXzBfX0ltcGwgcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVQYWlyX19Hcm91cF9fMSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMDY4MjoyOiBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZVBhaXJfX0dyb3VwX18wX19JbXBsIHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlUGFpcl9fR3JvdXBfXzEKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzc0KTsKKyAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzgyKTsKICAgICAgICAgICAgIHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlUGFpcl9fR3JvdXBfXzBfX0ltcGwoKTsKIAogICAgICAgICAgICAgc3RhdGUuX2ZzcC0tOwpAQCAtMzE4NjgsMjMgKzM2MzI1LDIzIEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVQYWlyX19Hcm91cF9fMF9fSW1wbCIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo5MzUxOjE6IHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlUGFpcl9fR3JvdXBfXzBfX0ltcGwgOiAoICggcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVQYWlyX19Hcm91cF8wX18wICkgKSA7CisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTA2ODk6MTogcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVQYWlyX19Hcm91cF9fMF9fSW1wbCA6ICggKCBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZVBhaXJfX0dyb3VwXzBfXzAgKSApIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZVBhaXJfX0dyb3VwX18wX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjkzNTU6MTogKCAoICggcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVQYWlyX19Hcm91cF8wX18wICkgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo5MzU2OjE6ICggKCBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZVBhaXJfX0dyb3VwXzBfXzAgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMDY5MzoxOiAoICggKCBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZVBhaXJfX0dyb3VwXzBfXzAgKSApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEwNjk0OjE6ICggKCBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZVBhaXJfX0dyb3VwXzBfXzAgKSApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo5MzU2OjE6ICggKCBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZVBhaXJfX0dyb3VwXzBfXzAgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo5MzU3OjI6ICggcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVQYWlyX19Hcm91cF8wX18wICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEwNjk0OjE6ICggKCBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZVBhaXJfX0dyb3VwXzBfXzAgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMDY5NToyOiAoIHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlUGFpcl9fR3JvdXBfMF9fMCApCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhBbm5vdGF0aW9uRWxlbWVudFZhbHVlUGFpckFjY2VzcygpLmdldEdyb3VwXzAoKSk7IAogICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6OTM1ODoyOiAoIHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlUGFpcl9fR3JvdXBfMF9fMCApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo5MzU4OjM6IHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlUGFpcl9fR3JvdXBfMF9fMAorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTA2OTY6MjogKCBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZVBhaXJfX0dyb3VwXzBfXzAgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTA2OTY6MzogcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVQYWlyX19Hcm91cF8wX18wCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV18yKTsKICAgICAgICAgICAgIHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlUGFpcl9fR3JvdXBfMF9fMCgpOwpAQCAtMzE5MTksMTQgKzM2Mzc2LDE0IEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVQYWlyX19Hcm91cF9fMSIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo5MzY2OjE6IHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlUGFpcl9fR3JvdXBfXzEgOiBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZVBhaXJfX0dyb3VwX18xX19JbXBsIDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMDcwNDoxOiBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZVBhaXJfX0dyb3VwX18xIDogcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVQYWlyX19Hcm91cF9fMV9fSW1wbCA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVQYWlyX19Hcm91cF9fMSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo5MzcwOjE6ICggcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVQYWlyX19Hcm91cF9fMV9fSW1wbCApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo5MzcxOjI6IHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlUGFpcl9fR3JvdXBfXzFfX0ltcGwKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEwNzA4OjE6ICggcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVQYWlyX19Hcm91cF9fMV9fSW1wbCApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMDcwOToyOiBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZVBhaXJfX0dyb3VwX18xX19JbXBsCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV18yKTsKICAgICAgICAgICAgIHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlUGFpcl9fR3JvdXBfXzFfX0ltcGwoKTsKQEAgLTMxOTUyLDIzICszNjQwOSwyMyBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlUGFpcl9fR3JvdXBfXzFfX0ltcGwiCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6OTM3NzoxOiBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZVBhaXJfX0dyb3VwX18xX19JbXBsIDogKCAoIHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlUGFpcl9fVmFsdWVBc3NpZ25tZW50XzEgKSApIDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMDcxNToxOiBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZVBhaXJfX0dyb3VwX18xX19JbXBsIDogKCAoIHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlUGFpcl9fVmFsdWVBc3NpZ25tZW50XzEgKSApIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZVBhaXJfX0dyb3VwX18xX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjkzODE6MTogKCAoICggcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVQYWlyX19WYWx1ZUFzc2lnbm1lbnRfMSApICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6OTM4MjoxOiAoICggcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVQYWlyX19WYWx1ZUFzc2lnbm1lbnRfMSApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEwNzE5OjE6ICggKCAoIHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlUGFpcl9fVmFsdWVBc3NpZ25tZW50XzEgKSApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEwNzIwOjE6ICggKCBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZVBhaXJfX1ZhbHVlQXNzaWdubWVudF8xICkgKQogICAgICAgICAgICAgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6OTM4MjoxOiAoICggcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVQYWlyX19WYWx1ZUFzc2lnbm1lbnRfMSApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjkzODM6MjogKCBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZVBhaXJfX1ZhbHVlQXNzaWdubWVudF8xICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEwNzIwOjE6ICggKCBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZVBhaXJfX1ZhbHVlQXNzaWdubWVudF8xICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTA3MjE6MjogKCBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZVBhaXJfX1ZhbHVlQXNzaWdubWVudF8xICkKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WEFubm90YXRpb25FbGVtZW50VmFsdWVQYWlyQWNjZXNzKCkuZ2V0VmFsdWVBc3NpZ25tZW50XzEoKSk7IAogICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6OTM4NDoyOiAoIHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlUGFpcl9fVmFsdWVBc3NpZ25tZW50XzEgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6OTM4NDozOiBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZVBhaXJfX1ZhbHVlQXNzaWdubWVudF8xCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMDcyMjoyOiAoIHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlUGFpcl9fVmFsdWVBc3NpZ25tZW50XzEgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTA3MjI6MzogcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVQYWlyX19WYWx1ZUFzc2lnbm1lbnRfMQogICAgICAgICAgICAgewogICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMik7CiAgICAgICAgICAgICBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZVBhaXJfX1ZhbHVlQXNzaWdubWVudF8xKCk7CkBAIC0zMjAwMywxNCArMzY0NjAsMTQgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZVBhaXJfX0dyb3VwXzBfXzAiCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6OTM5MzoxOiBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZVBhaXJfX0dyb3VwXzBfXzAgOiBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZVBhaXJfX0dyb3VwXzBfXzBfX0ltcGwgOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEwNzMxOjE6IHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlUGFpcl9fR3JvdXBfMF9fMCA6IHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlUGFpcl9fR3JvdXBfMF9fMF9fSW1wbCA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVQYWlyX19Hcm91cF8wX18wKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjkzOTc6MTogKCBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZVBhaXJfX0dyb3VwXzBfXzBfX0ltcGwgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6OTM5ODoyOiBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZVBhaXJfX0dyb3VwXzBfXzBfX0ltcGwKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEwNzM1OjE6ICggcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVQYWlyX19Hcm91cF8wX18wX19JbXBsICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEwNzM2OjI6IHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlUGFpcl9fR3JvdXBfMF9fMF9fSW1wbAogICAgICAgICAgICAgewogICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMik7CiAgICAgICAgICAgICBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZVBhaXJfX0dyb3VwXzBfXzBfX0ltcGwoKTsKQEAgLTMyMDM2LDIzICszNjQ5MywyMyBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlUGFpcl9fR3JvdXBfMF9fMF9fSW1wbCIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo5NDA0OjE6IHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlUGFpcl9fR3JvdXBfMF9fMF9fSW1wbCA6ICggKCBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZVBhaXJfX0dyb3VwXzBfMF9fMCApICkgOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEwNzQyOjE6IHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlUGFpcl9fR3JvdXBfMF9fMF9fSW1wbCA6ICggKCBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZVBhaXJfX0dyb3VwXzBfMF9fMCApICkgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlUGFpcl9fR3JvdXBfMF9fMF9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo5NDA4OjE6ICggKCAoIHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlUGFpcl9fR3JvdXBfMF8wX18wICkgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo5NDA5OjE6ICggKCBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZVBhaXJfX0dyb3VwXzBfMF9fMCApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEwNzQ2OjE6ICggKCAoIHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlUGFpcl9fR3JvdXBfMF8wX18wICkgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMDc0NzoxOiAoICggcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVQYWlyX19Hcm91cF8wXzBfXzAgKSApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo5NDA5OjE6ICggKCBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZVBhaXJfX0dyb3VwXzBfMF9fMCApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjk0MTA6MjogKCBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZVBhaXJfX0dyb3VwXzBfMF9fMCApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMDc0NzoxOiAoICggcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVQYWlyX19Hcm91cF8wXzBfXzAgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMDc0ODoyOiAoIHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlUGFpcl9fR3JvdXBfMF8wX18wICkKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WEFubm90YXRpb25FbGVtZW50VmFsdWVQYWlyQWNjZXNzKCkuZ2V0R3JvdXBfMF8wKCkpOyAKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjk0MTE6MjogKCBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZVBhaXJfX0dyb3VwXzBfMF9fMCApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo5NDExOjM6IHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlUGFpcl9fR3JvdXBfMF8wX18wCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMDc0OToyOiAoIHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlUGFpcl9fR3JvdXBfMF8wX18wICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEwNzQ5OjM6IHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlUGFpcl9fR3JvdXBfMF8wX18wCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV18yKTsKICAgICAgICAgICAgIHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlUGFpcl9fR3JvdXBfMF8wX18wKCk7CkBAIC0zMjA4NywxNiArMzY1NDQsMTYgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZVBhaXJfX0dyb3VwXzBfMF9fMCIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo5NDIwOjE6IHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlUGFpcl9fR3JvdXBfMF8wX18wIDogcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVQYWlyX19Hcm91cF8wXzBfXzBfX0ltcGwgcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVQYWlyX19Hcm91cF8wXzBfXzEgOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEwNzU4OjE6IHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlUGFpcl9fR3JvdXBfMF8wX18wIDogcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVQYWlyX19Hcm91cF8wXzBfXzBfX0ltcGwgcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVQYWlyX19Hcm91cF8wXzBfXzEgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlUGFpcl9fR3JvdXBfMF8wX18wKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjk0MjQ6MTogKCBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZVBhaXJfX0dyb3VwXzBfMF9fMF9fSW1wbCBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZVBhaXJfX0dyb3VwXzBfMF9fMSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo5NDI1OjI6IHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlUGFpcl9fR3JvdXBfMF8wX18wX19JbXBsIHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlUGFpcl9fR3JvdXBfMF8wX18xCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMDc2MjoxOiAoIHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlUGFpcl9fR3JvdXBfMF8wX18wX19JbXBsIHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlUGFpcl9fR3JvdXBfMF8wX18xICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEwNzYzOjI6IHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlUGFpcl9fR3JvdXBfMF8wX18wX19JbXBsIHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlUGFpcl9fR3JvdXBfMF8wX18xCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV183NSk7CisgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV184Myk7CiAgICAgICAgICAgICBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZVBhaXJfX0dyb3VwXzBfMF9fMF9fSW1wbCgpOwogCiAgICAgICAgICAgICBzdGF0ZS5fZnNwLS07CkBAIC0zMjEyNSwyMyArMzY1ODIsMjMgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZVBhaXJfX0dyb3VwXzBfMF9fMF9fSW1wbCIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo5NDMyOjE6IHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlUGFpcl9fR3JvdXBfMF8wX18wX19JbXBsIDogKCAoIHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlUGFpcl9fRWxlbWVudEFzc2lnbm1lbnRfMF8wXzAgKSApIDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMDc3MDoxOiBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZVBhaXJfX0dyb3VwXzBfMF9fMF9fSW1wbCA6ICggKCBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZVBhaXJfX0VsZW1lbnRBc3NpZ25tZW50XzBfMF8wICkgKSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVQYWlyX19Hcm91cF8wXzBfXzBfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6OTQzNjoxOiAoICggKCBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZVBhaXJfX0VsZW1lbnRBc3NpZ25tZW50XzBfMF8wICkgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo5NDM3OjE6ICggKCBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZVBhaXJfX0VsZW1lbnRBc3NpZ25tZW50XzBfMF8wICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTA3NzQ6MTogKCAoICggcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVQYWlyX19FbGVtZW50QXNzaWdubWVudF8wXzBfMCApICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTA3NzU6MTogKCAoIHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlUGFpcl9fRWxlbWVudEFzc2lnbm1lbnRfMF8wXzAgKSApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo5NDM3OjE6ICggKCBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZVBhaXJfX0VsZW1lbnRBc3NpZ25tZW50XzBfMF8wICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6OTQzODoyOiAoIHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlUGFpcl9fRWxlbWVudEFzc2lnbm1lbnRfMF8wXzAgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTA3NzU6MTogKCAoIHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlUGFpcl9fRWxlbWVudEFzc2lnbm1lbnRfMF8wXzAgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMDc3NjoyOiAoIHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlUGFpcl9fRWxlbWVudEFzc2lnbm1lbnRfMF8wXzAgKQogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZVBhaXJBY2Nlc3MoKS5nZXRFbGVtZW50QXNzaWdubWVudF8wXzBfMCgpKTsgCiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo5NDM5OjI6ICggcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVQYWlyX19FbGVtZW50QXNzaWdubWVudF8wXzBfMCApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo5NDM5OjM6IHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlUGFpcl9fRWxlbWVudEFzc2lnbm1lbnRfMF8wXzAKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEwNzc3OjI6ICggcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVQYWlyX19FbGVtZW50QXNzaWdubWVudF8wXzBfMCApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMDc3NzozOiBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZVBhaXJfX0VsZW1lbnRBc3NpZ25tZW50XzBfMF8wCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV18yKTsKICAgICAgICAgICAgIHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlUGFpcl9fRWxlbWVudEFzc2lnbm1lbnRfMF8wXzAoKTsKQEAgLTMyMTc2LDE0ICszNjYzMywxNCBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlUGFpcl9fR3JvdXBfMF8wX18xIgotICAgIC8vIEludGVybmFsRGF0YURTTC5nOjk0NDc6MTogcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVQYWlyX19Hcm91cF8wXzBfXzEgOiBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZVBhaXJfX0dyb3VwXzBfMF9fMV9fSW1wbCA7CisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTA3ODU6MTogcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVQYWlyX19Hcm91cF8wXzBfXzEgOiBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZVBhaXJfX0dyb3VwXzBfMF9fMV9fSW1wbCA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVQYWlyX19Hcm91cF8wXzBfXzEoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6OTQ1MToxOiAoIHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlUGFpcl9fR3JvdXBfMF8wX18xX19JbXBsICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjk0NTI6MjogcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVQYWlyX19Hcm91cF8wXzBfXzFfX0ltcGwKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEwNzg5OjE6ICggcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVQYWlyX19Hcm91cF8wXzBfXzFfX0ltcGwgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTA3OTA6MjogcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVQYWlyX19Hcm91cF8wXzBfXzFfX0ltcGwKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzIpOwogICAgICAgICAgICAgcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVQYWlyX19Hcm91cF8wXzBfXzFfX0ltcGwoKTsKQEAgLTMyMjA5LDE3ICszNjY2NiwxNyBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlUGFpcl9fR3JvdXBfMF8wX18xX19JbXBsIgotICAgIC8vIEludGVybmFsRGF0YURTTC5nOjk0NTg6MTogcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVQYWlyX19Hcm91cF8wXzBfXzFfX0ltcGwgOiAoICc9JyApIDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMDc5NjoxOiBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZVBhaXJfX0dyb3VwXzBfMF9fMV9fSW1wbCA6ICggJz0nICkgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlUGFpcl9fR3JvdXBfMF8wX18xX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjk0NjI6MTogKCAoICc9JyApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjk0NjM6MTogKCAnPScgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTA4MDA6MTogKCAoICc9JyApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEwODAxOjE6ICggJz0nICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjk0NjM6MTogKCAnPScgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6OTQ2NDoyOiAnPScKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEwODAxOjE6ICggJz0nICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEwODAyOjI6ICc9JwogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZVBhaXJBY2Nlc3MoKS5nZXRFcXVhbHNTaWduS2V5d29yZF8wXzBfMSgpKTsgCkBAIC0zMjI1MCwxNiArMzY3MDcsMTYgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0X19Hcm91cF8wX18wIgotICAgIC8vIEludGVybmFsRGF0YURTTC5nOjk0NzQ6MTogcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdF9fR3JvdXBfMF9fMCA6IHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RfX0dyb3VwXzBfXzBfX0ltcGwgcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdF9fR3JvdXBfMF9fMSA7CisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTA4MTI6MTogcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdF9fR3JvdXBfMF9fMCA6IHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RfX0dyb3VwXzBfXzBfX0ltcGwgcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdF9fR3JvdXBfMF9fMSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdF9fR3JvdXBfMF9fMCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo5NDc4OjE6ICggcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdF9fR3JvdXBfMF9fMF9fSW1wbCBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0X19Hcm91cF8wX18xICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjk0Nzk6MjogcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdF9fR3JvdXBfMF9fMF9fSW1wbCBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0X19Hcm91cF8wX18xCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMDgxNjoxOiAoIHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RfX0dyb3VwXzBfXzBfX0ltcGwgcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdF9fR3JvdXBfMF9fMSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMDgxNzoyOiBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0X19Hcm91cF8wX18wX19JbXBsIHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RfX0dyb3VwXzBfXzEKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzc2KTsKKyAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzg0KTsKICAgICAgICAgICAgIHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RfX0dyb3VwXzBfXzBfX0ltcGwoKTsKIAogICAgICAgICAgICAgc3RhdGUuX2ZzcC0tOwpAQCAtMzIyODgsMjMgKzM2NzQ1LDIzIEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdF9fR3JvdXBfMF9fMF9fSW1wbCIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo5NDg2OjE6IHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RfX0dyb3VwXzBfXzBfX0ltcGwgOiAoICggcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdF9fR3JvdXBfMF8wX18wICkgKSA7CisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTA4MjQ6MTogcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdF9fR3JvdXBfMF9fMF9fSW1wbCA6ICggKCBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0X19Hcm91cF8wXzBfXzAgKSApIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0X19Hcm91cF8wX18wX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjk0OTA6MTogKCAoICggcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdF9fR3JvdXBfMF8wX18wICkgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo5NDkxOjE6ICggKCBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0X19Hcm91cF8wXzBfXzAgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMDgyODoxOiAoICggKCBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0X19Hcm91cF8wXzBfXzAgKSApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEwODI5OjE6ICggKCBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0X19Hcm91cF8wXzBfXzAgKSApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo5NDkxOjE6ICggKCBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0X19Hcm91cF8wXzBfXzAgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo5NDkyOjI6ICggcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdF9fR3JvdXBfMF8wX18wICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEwODI5OjE6ICggKCBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0X19Hcm91cF8wXzBfXzAgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMDgzMDoyOiAoIHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RfX0dyb3VwXzBfMF9fMCApCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RBY2Nlc3MoKS5nZXRHcm91cF8wXzAoKSk7IAogICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6OTQ5MzoyOiAoIHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RfX0dyb3VwXzBfMF9fMCApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo5NDkzOjM6IHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RfX0dyb3VwXzBfMF9fMAorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTA4MzE6MjogKCBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0X19Hcm91cF8wXzBfXzAgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTA4MzE6MzogcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdF9fR3JvdXBfMF8wX18wCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV18yKTsKICAgICAgICAgICAgIHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RfX0dyb3VwXzBfMF9fMCgpOwpAQCAtMzIzMzksMTYgKzM2Nzk2LDE2IEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdF9fR3JvdXBfMF9fMSIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo5NTAxOjE6IHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RfX0dyb3VwXzBfXzEgOiBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0X19Hcm91cF8wX18xX19JbXBsIHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RfX0dyb3VwXzBfXzIgOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEwODM5OjE6IHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RfX0dyb3VwXzBfXzEgOiBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0X19Hcm91cF8wX18xX19JbXBsIHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RfX0dyb3VwXzBfXzIgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RfX0dyb3VwXzBfXzEoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6OTUwNToxOiAoIHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RfX0dyb3VwXzBfXzFfX0ltcGwgcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdF9fR3JvdXBfMF9fMiApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo5NTA2OjI6IHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RfX0dyb3VwXzBfXzFfX0ltcGwgcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdF9fR3JvdXBfMF9fMgorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTA4NDM6MTogKCBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0X19Hcm91cF8wX18xX19JbXBsIHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RfX0dyb3VwXzBfXzIgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTA4NDQ6MjogcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdF9fR3JvdXBfMF9fMV9fSW1wbCBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0X19Hcm91cF8wX18yCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV183Nik7CisgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV184NCk7CiAgICAgICAgICAgICBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0X19Hcm91cF8wX18xX19JbXBsKCk7CiAKICAgICAgICAgICAgIHN0YXRlLl9mc3AtLTsKQEAgLTMyMzc3LDMxICszNjgzNCwzMSBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RfX0dyb3VwXzBfXzFfX0ltcGwiCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6OTUxMzoxOiBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0X19Hcm91cF8wX18xX19JbXBsIDogKCAoIHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RfX0dyb3VwXzBfMV9fMCApPyApIDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMDg1MToxOiBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0X19Hcm91cF8wX18xX19JbXBsIDogKCAoIHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RfX0dyb3VwXzBfMV9fMCApPyApIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0X19Hcm91cF8wX18xX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjk1MTc6MTogKCAoICggcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdF9fR3JvdXBfMF8xX18wICk/ICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6OTUxODoxOiAoICggcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdF9fR3JvdXBfMF8xX18wICk/ICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEwODU1OjE6ICggKCAoIHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RfX0dyb3VwXzBfMV9fMCApPyApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEwODU2OjE6ICggKCBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0X19Hcm91cF8wXzFfXzAgKT8gKQogICAgICAgICAgICAgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6OTUxODoxOiAoICggcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdF9fR3JvdXBfMF8xX18wICk/ICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjk1MTk6MjogKCBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0X19Hcm91cF8wXzFfXzAgKT8KKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEwODU2OjE6ICggKCBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0X19Hcm91cF8wXzFfXzAgKT8gKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTA4NTc6MjogKCBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0X19Hcm91cF8wXzFfXzAgKT8KICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdEFjY2VzcygpLmdldEdyb3VwXzBfMSgpKTsgCiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo5NTIwOjI6ICggcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdF9fR3JvdXBfMF8xX18wICk/Ci0gICAgICAgICAgICBpbnQgYWx0ODk9MjsKLSAgICAgICAgICAgIGludCBMQTg5XzAgPSBpbnB1dC5MQSgxKTsKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEwODU4OjI6ICggcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdF9fR3JvdXBfMF8xX18wICk/CisgICAgICAgICAgICBpbnQgYWx0MTAyPTI7CisgICAgICAgICAgICBpbnQgTEExMDJfMCA9IGlucHV0LkxBKDEpOwogCi0gICAgICAgICAgICBpZiAoICgoTEE4OV8wPj1SVUxFX1NUUklORyAmJiBMQTg5XzA8PVJVTEVfREVDSU1BTCl8fExBODlfMD09Mjd8fChMQTg5XzA+PTM0ICYmIExBODlfMDw9MzUpfHxMQTg5XzA9PTQwfHwoTEE4OV8wPj00NSAmJiBMQTg5XzA8PTUwKXx8TEE4OV8wPT03MHx8TEE4OV8wPT05NXx8KExBODlfMD49MTEyICYmIExBODlfMDw9MTEzKXx8KExBODlfMD49MTE3ICYmIExBODlfMDw9MTE4KXx8TEE4OV8wPT0xMjB8fExBODlfMD09MTIyfHwoTEE4OV8wPj0xMjYgJiYgTEE4OV8wPD0xMzMpfHxMQTg5XzA9PTEzNXx8TEE4OV8wPT0xNTQpICkgewotICAgICAgICAgICAgICAgIGFsdDg5PTE7CisgICAgICAgICAgICBpZiAoICgoTEExMDJfMD49UlVMRV9TVFJJTkcgJiYgTEExMDJfMDw9UlVMRV9ERUNJTUFMKXx8TEExMDJfMD09Mjd8fChMQTEwMl8wPj0zNCAmJiBMQTEwMl8wPD0zNSl8fExBMTAyXzA9PTQwfHwoTEExMDJfMD49NDUgJiYgTEExMDJfMDw9NTApfHxMQTEwMl8wPT03NXx8TEExMDJfMD09MTAyfHwoTEExMDJfMD49MTIyICYmIExBMTAyXzA8PTEyMyl8fChMQTEwMl8wPj0xMjcgJiYgTEExMDJfMDw9MTI4KXx8TEExMDJfMD09MTMwfHxMQTEwMl8wPT0xMzJ8fChMQTEwMl8wPj0xMzYgJiYgTEExMDJfMDw9MTQzKXx8TEExMDJfMD09MTQ1fHxMQTEwMl8wPT0xNjYpICkgeworICAgICAgICAgICAgICAgIGFsdDEwMj0xOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgc3dpdGNoIChhbHQ4OSkgeworICAgICAgICAgICAgc3dpdGNoIChhbHQxMDIpIHsKICAgICAgICAgICAgICAgICBjYXNlIDEgOgotICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo5NTIwOjM6IHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RfX0dyb3VwXzBfMV9fMAorICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMDg1ODozOiBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0X19Hcm91cF8wXzFfXzAKICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV18yKTsKICAgICAgICAgICAgICAgICAgICAgcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdF9fR3JvdXBfMF8xX18wKCk7CkBAIC0zMjQzOSwxNCArMzY4OTYsMTQgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0X19Hcm91cF8wX18yIgotICAgIC8vIEludGVybmFsRGF0YURTTC5nOjk1Mjg6MTogcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdF9fR3JvdXBfMF9fMiA6IHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RfX0dyb3VwXzBfXzJfX0ltcGwgOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEwODY2OjE6IHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RfX0dyb3VwXzBfXzIgOiBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0X19Hcm91cF8wX18yX19JbXBsIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0X19Hcm91cF8wX18yKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjk1MzI6MTogKCBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0X19Hcm91cF8wX18yX19JbXBsICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjk1MzM6MjogcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdF9fR3JvdXBfMF9fMl9fSW1wbAorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTA4NzA6MTogKCBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0X19Hcm91cF8wX18yX19JbXBsICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEwODcxOjI6IHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RfX0dyb3VwXzBfXzJfX0ltcGwKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzIpOwogICAgICAgICAgICAgcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdF9fR3JvdXBfMF9fMl9fSW1wbCgpOwpAQCAtMzI0NzIsMjIgKzM2OTI5LDIyIEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdF9fR3JvdXBfMF9fMl9fSW1wbCIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo5NTM5OjE6IHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RfX0dyb3VwXzBfXzJfX0ltcGwgOiAoICddJyApIDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMDg3NzoxOiBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0X19Hcm91cF8wX18yX19JbXBsIDogKCAnXScgKSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdF9fR3JvdXBfMF9fMl9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo5NTQzOjE6ICggKCAnXScgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo5NTQ0OjE6ICggJ10nICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEwODgxOjE6ICggKCAnXScgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMDg4MjoxOiAoICddJyApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo5NTQ0OjE6ICggJ10nICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjk1NDU6MjogJ10nCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMDg4MjoxOiAoICddJyApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMDg4MzoyOiAnXScKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdEFjY2VzcygpLmdldFJpZ2h0U3F1YXJlQnJhY2tldEtleXdvcmRfMF8yKCkpOyAKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1hdGNoKGlucHV0LDExNixGT0xMT1dfMik7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CisgICAgICAgICAgICBtYXRjaChpbnB1dCwxMjYsRk9MTE9XXzIpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOwogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBhZnRlcihncmFtbWFyQWNjZXNzLmdldFhBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RBY2Nlc3MoKS5nZXRSaWdodFNxdWFyZUJyYWNrZXRLZXl3b3JkXzBfMigpKTsgCiAgICAgICAgICAgICB9CkBAIC0zMjUxMywxNCArMzY5NzAsMTQgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0X19Hcm91cF8wXzBfXzAiCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6OTU1NToxOiBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0X19Hcm91cF8wXzBfXzAgOiBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0X19Hcm91cF8wXzBfXzBfX0ltcGwgOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEwODkzOjE6IHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RfX0dyb3VwXzBfMF9fMCA6IHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RfX0dyb3VwXzBfMF9fMF9fSW1wbCA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdF9fR3JvdXBfMF8wX18wKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjk1NTk6MTogKCBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0X19Hcm91cF8wXzBfXzBfX0ltcGwgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6OTU2MDoyOiBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0X19Hcm91cF8wXzBfXzBfX0ltcGwKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEwODk3OjE6ICggcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdF9fR3JvdXBfMF8wX18wX19JbXBsICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEwODk4OjI6IHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RfX0dyb3VwXzBfMF9fMF9fSW1wbAogICAgICAgICAgICAgewogICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMik7CiAgICAgICAgICAgICBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0X19Hcm91cF8wXzBfXzBfX0ltcGwoKTsKQEAgLTMyNTQ2LDIzICszNzAwMywyMyBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RfX0dyb3VwXzBfMF9fMF9fSW1wbCIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo5NTY2OjE6IHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RfX0dyb3VwXzBfMF9fMF9fSW1wbCA6ICggKCBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0X19Hcm91cF8wXzBfMF9fMCApICkgOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEwOTA0OjE6IHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RfX0dyb3VwXzBfMF9fMF9fSW1wbCA6ICggKCBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0X19Hcm91cF8wXzBfMF9fMCApICkgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RfX0dyb3VwXzBfMF9fMF9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo5NTcwOjE6ICggKCAoIHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RfX0dyb3VwXzBfMF8wX18wICkgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo5NTcxOjE6ICggKCBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0X19Hcm91cF8wXzBfMF9fMCApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEwOTA4OjE6ICggKCAoIHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RfX0dyb3VwXzBfMF8wX18wICkgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMDkwOToxOiAoICggcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdF9fR3JvdXBfMF8wXzBfXzAgKSApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo5NTcxOjE6ICggKCBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0X19Hcm91cF8wXzBfMF9fMCApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjk1NzI6MjogKCBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0X19Hcm91cF8wXzBfMF9fMCApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMDkwOToxOiAoICggcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdF9fR3JvdXBfMF8wXzBfXzAgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMDkxMDoyOiAoIHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RfX0dyb3VwXzBfMF8wX18wICkKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdEFjY2VzcygpLmdldEdyb3VwXzBfMF8wKCkpOyAKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjk1NzM6MjogKCBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0X19Hcm91cF8wXzBfMF9fMCApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo5NTczOjM6IHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RfX0dyb3VwXzBfMF8wX18wCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMDkxMToyOiAoIHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RfX0dyb3VwXzBfMF8wX18wICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEwOTExOjM6IHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RfX0dyb3VwXzBfMF8wX18wCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV18yKTsKICAgICAgICAgICAgIHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RfX0dyb3VwXzBfMF8wX18wKCk7CkBAIC0zMjU5NywxNiArMzcwNTQsMTYgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0X19Hcm91cF8wXzBfMF9fMCIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo5NTgyOjE6IHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RfX0dyb3VwXzBfMF8wX18wIDogcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdF9fR3JvdXBfMF8wXzBfXzBfX0ltcGwgcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdF9fR3JvdXBfMF8wXzBfXzEgOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEwOTIwOjE6IHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RfX0dyb3VwXzBfMF8wX18wIDogcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdF9fR3JvdXBfMF8wXzBfXzBfX0ltcGwgcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdF9fR3JvdXBfMF8wXzBfXzEgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RfX0dyb3VwXzBfMF8wX18wKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjk1ODY6MTogKCBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0X19Hcm91cF8wXzBfMF9fMF9fSW1wbCBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0X19Hcm91cF8wXzBfMF9fMSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo5NTg3OjI6IHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RfX0dyb3VwXzBfMF8wX18wX19JbXBsIHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RfX0dyb3VwXzBfMF8wX18xCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMDkyNDoxOiAoIHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RfX0dyb3VwXzBfMF8wX18wX19JbXBsIHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RfX0dyb3VwXzBfMF8wX18xICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEwOTI1OjI6IHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RfX0dyb3VwXzBfMF8wX18wX19JbXBsIHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RfX0dyb3VwXzBfMF8wX18xCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV183Nyk7CisgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV184NSk7CiAgICAgICAgICAgICBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0X19Hcm91cF8wXzBfMF9fMF9fSW1wbCgpOwogCiAgICAgICAgICAgICBzdGF0ZS5fZnNwLS07CkBAIC0zMjYzNSwyMyArMzcwOTIsMjMgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0X19Hcm91cF8wXzBfMF9fMF9fSW1wbCIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo5NTk0OjE6IHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RfX0dyb3VwXzBfMF8wX18wX19JbXBsIDogKCAoKSApIDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMDkzMjoxOiBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0X19Hcm91cF8wXzBfMF9fMF9fSW1wbCA6ICggKCkgKSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdF9fR3JvdXBfMF8wXzBfXzBfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6OTU5ODoxOiAoICggKCkgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo5NTk5OjE6ICggKCkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTA5MzY6MTogKCAoICgpICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTA5Mzc6MTogKCAoKSApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo5NTk5OjE6ICggKCkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6OTYwMDoyOiAoKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTA5Mzc6MTogKCAoKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMDkzODoyOiAoKQogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0QWNjZXNzKCkuZ2V0WExpc3RMaXRlcmFsQWN0aW9uXzBfMF8wXzAoKSk7IAogICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6OTYwMToyOiAoKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6OTYwMTozOiAKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEwOTM5OjI6ICgpCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMDkzOTozOiAKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIH0KIApAQCAtMzI2NzYsMTYgKzM3MTMzLDE2IEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdF9fR3JvdXBfMF8wXzBfXzEiCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6OTYwOToxOiBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0X19Hcm91cF8wXzBfMF9fMSA6IHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RfX0dyb3VwXzBfMF8wX18xX19JbXBsIHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RfX0dyb3VwXzBfMF8wX18yIDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMDk0NzoxOiBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0X19Hcm91cF8wXzBfMF9fMSA6IHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RfX0dyb3VwXzBfMF8wX18xX19JbXBsIHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RfX0dyb3VwXzBfMF8wX18yIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0X19Hcm91cF8wXzBfMF9fMSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo5NjEzOjE6ICggcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdF9fR3JvdXBfMF8wXzBfXzFfX0ltcGwgcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdF9fR3JvdXBfMF8wXzBfXzIgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6OTYxNDoyOiBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0X19Hcm91cF8wXzBfMF9fMV9fSW1wbCBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0X19Hcm91cF8wXzBfMF9fMgorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTA5NTE6MTogKCBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0X19Hcm91cF8wXzBfMF9fMV9fSW1wbCBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0X19Hcm91cF8wXzBfMF9fMiApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMDk1MjoyOiBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0X19Hcm91cF8wXzBfMF9fMV9fSW1wbCBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0X19Hcm91cF8wXzBfMF9fMgogICAgICAgICAgICAgewotICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfNzgpOworICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfODYpOwogICAgICAgICAgICAgcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdF9fR3JvdXBfMF8wXzBfXzFfX0ltcGwoKTsKIAogICAgICAgICAgICAgc3RhdGUuX2ZzcC0tOwpAQCAtMzI3MTQsMjIgKzM3MTcxLDIyIEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdF9fR3JvdXBfMF8wXzBfXzFfX0ltcGwiCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6OTYyMToxOiBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0X19Hcm91cF8wXzBfMF9fMV9fSW1wbCA6ICggJyMnICkgOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEwOTU5OjE6IHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RfX0dyb3VwXzBfMF8wX18xX19JbXBsIDogKCAnIycgKSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdF9fR3JvdXBfMF8wXzBfXzFfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6OTYyNToxOiAoICggJyMnICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6OTYyNjoxOiAoICcjJyApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMDk2MzoxOiAoICggJyMnICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTA5NjQ6MTogKCAnIycgKQogICAgICAgICAgICAgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6OTYyNjoxOiAoICcjJyApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo5NjI3OjI6ICcjJworICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTA5NjQ6MTogKCAnIycgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTA5NjU6MjogJyMnCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RBY2Nlc3MoKS5nZXROdW1iZXJTaWduS2V5d29yZF8wXzBfMF8xKCkpOyAKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1hdGNoKGlucHV0LDExNyxGT0xMT1dfMik7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CisgICAgICAgICAgICBtYXRjaChpbnB1dCwxMjcsRk9MTE9XXzIpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOwogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBhZnRlcihncmFtbWFyQWNjZXNzLmdldFhBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RBY2Nlc3MoKS5nZXROdW1iZXJTaWduS2V5d29yZF8wXzBfMF8xKCkpOyAKICAgICAgICAgICAgIH0KQEAgLTMyNzU1LDE0ICszNzIxMiwxNCBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RfX0dyb3VwXzBfMF8wX18yIgotICAgIC8vIEludGVybmFsRGF0YURTTC5nOjk2MzY6MTogcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdF9fR3JvdXBfMF8wXzBfXzIgOiBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0X19Hcm91cF8wXzBfMF9fMl9fSW1wbCA7CisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTA5NzQ6MTogcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdF9fR3JvdXBfMF8wXzBfXzIgOiBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0X19Hcm91cF8wXzBfMF9fMl9fSW1wbCA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdF9fR3JvdXBfMF8wXzBfXzIoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6OTY0MDoxOiAoIHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RfX0dyb3VwXzBfMF8wX18yX19JbXBsICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjk2NDE6MjogcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdF9fR3JvdXBfMF8wXzBfXzJfX0ltcGwKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEwOTc4OjE6ICggcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdF9fR3JvdXBfMF8wXzBfXzJfX0ltcGwgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTA5Nzk6MjogcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdF9fR3JvdXBfMF8wXzBfXzJfX0ltcGwKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzIpOwogICAgICAgICAgICAgcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdF9fR3JvdXBfMF8wXzBfXzJfX0ltcGwoKTsKQEAgLTMyNzg4LDIyICszNzI0NSwyMiBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RfX0dyb3VwXzBfMF8wX18yX19JbXBsIgotICAgIC8vIEludGVybmFsRGF0YURTTC5nOjk2NDc6MTogcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdF9fR3JvdXBfMF8wXzBfXzJfX0ltcGwgOiAoICdbJyApIDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMDk4NToxOiBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0X19Hcm91cF8wXzBfMF9fMl9fSW1wbCA6ICggJ1snICkgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RfX0dyb3VwXzBfMF8wX18yX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjk2NTE6MTogKCAoICdbJyApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjk2NTI6MTogKCAnWycgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTA5ODk6MTogKCAoICdbJyApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEwOTkwOjE6ICggJ1snICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjk2NTI6MTogKCAnWycgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6OTY1MzoyOiAnWycKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEwOTkwOjE6ICggJ1snICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEwOTkxOjI6ICdbJwogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0QWNjZXNzKCkuZ2V0TGVmdFNxdWFyZUJyYWNrZXRLZXl3b3JkXzBfMF8wXzIoKSk7IAogICAgICAgICAgICAgfQotICAgICAgICAgICAgbWF0Y2goaW5wdXQsMTE4LEZPTExPV18yKTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKKyAgICAgICAgICAgIG1hdGNoKGlucHV0LDEyOCxGT0xMT1dfMik7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0WEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdEFjY2VzcygpLmdldExlZnRTcXVhcmVCcmFja2V0S2V5d29yZF8wXzBfMF8yKCkpOyAKICAgICAgICAgICAgIH0KQEAgLTMyODI5LDE2ICszNzI4NiwxNiBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RfX0dyb3VwXzBfMV9fMCIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo5NjYzOjE6IHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RfX0dyb3VwXzBfMV9fMCA6IHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RfX0dyb3VwXzBfMV9fMF9fSW1wbCBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0X19Hcm91cF8wXzFfXzEgOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjExMDAxOjE6IHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RfX0dyb3VwXzBfMV9fMCA6IHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RfX0dyb3VwXzBfMV9fMF9fSW1wbCBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0X19Hcm91cF8wXzFfXzEgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RfX0dyb3VwXzBfMV9fMCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo5NjY3OjE6ICggcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdF9fR3JvdXBfMF8xX18wX19JbXBsIHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RfX0dyb3VwXzBfMV9fMSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo5NjY4OjI6IHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RfX0dyb3VwXzBfMV9fMF9fSW1wbCBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0X19Hcm91cF8wXzFfXzEKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjExMDA1OjE6ICggcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdF9fR3JvdXBfMF8xX18wX19JbXBsIHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RfX0dyb3VwXzBfMV9fMSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMTAwNjoyOiBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0X19Hcm91cF8wXzFfXzBfX0ltcGwgcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdF9fR3JvdXBfMF8xX18xCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV183Mik7CisgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV184MCk7CiAgICAgICAgICAgICBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0X19Hcm91cF8wXzFfXzBfX0ltcGwoKTsKIAogICAgICAgICAgICAgc3RhdGUuX2ZzcC0tOwpAQCAtMzI4NjcsMjMgKzM3MzI0LDIzIEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdF9fR3JvdXBfMF8xX18wX19JbXBsIgotICAgIC8vIEludGVybmFsRGF0YURTTC5nOjk2NzU6MTogcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdF9fR3JvdXBfMF8xX18wX19JbXBsIDogKCAoIHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RfX0VsZW1lbnRzQXNzaWdubWVudF8wXzFfMCApICkgOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjExMDEzOjE6IHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RfX0dyb3VwXzBfMV9fMF9fSW1wbCA6ICggKCBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0X19FbGVtZW50c0Fzc2lnbm1lbnRfMF8xXzAgKSApIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0X19Hcm91cF8wXzFfXzBfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6OTY3OToxOiAoICggKCBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0X19FbGVtZW50c0Fzc2lnbm1lbnRfMF8xXzAgKSApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjk2ODA6MTogKCAoIHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RfX0VsZW1lbnRzQXNzaWdubWVudF8wXzFfMCApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjExMDE3OjE6ICggKCAoIHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RfX0VsZW1lbnRzQXNzaWdubWVudF8wXzFfMCApICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTEwMTg6MTogKCAoIHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RfX0VsZW1lbnRzQXNzaWdubWVudF8wXzFfMCApICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjk2ODA6MTogKCAoIHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RfX0VsZW1lbnRzQXNzaWdubWVudF8wXzFfMCApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjk2ODE6MjogKCBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0X19FbGVtZW50c0Fzc2lnbm1lbnRfMF8xXzAgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTEwMTg6MTogKCAoIHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RfX0VsZW1lbnRzQXNzaWdubWVudF8wXzFfMCApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjExMDE5OjI6ICggcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdF9fRWxlbWVudHNBc3NpZ25tZW50XzBfMV8wICkKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdEFjY2VzcygpLmdldEVsZW1lbnRzQXNzaWdubWVudF8wXzFfMCgpKTsgCiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo5NjgyOjI6ICggcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdF9fRWxlbWVudHNBc3NpZ25tZW50XzBfMV8wICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjk2ODI6MzogcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdF9fRWxlbWVudHNBc3NpZ25tZW50XzBfMV8wCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMTAyMDoyOiAoIHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RfX0VsZW1lbnRzQXNzaWdubWVudF8wXzFfMCApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMTAyMDozOiBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0X19FbGVtZW50c0Fzc2lnbm1lbnRfMF8xXzAKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzIpOwogICAgICAgICAgICAgcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdF9fRWxlbWVudHNBc3NpZ25tZW50XzBfMV8wKCk7CkBAIC0zMjkxOCwxNCArMzczNzUsMTQgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0X19Hcm91cF8wXzFfXzEiCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6OTY5MDoxOiBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0X19Hcm91cF8wXzFfXzEgOiBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0X19Hcm91cF8wXzFfXzFfX0ltcGwgOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjExMDI4OjE6IHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RfX0dyb3VwXzBfMV9fMSA6IHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RfX0dyb3VwXzBfMV9fMV9fSW1wbCA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdF9fR3JvdXBfMF8xX18xKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjk2OTQ6MTogKCBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0X19Hcm91cF8wXzFfXzFfX0ltcGwgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6OTY5NToyOiBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0X19Hcm91cF8wXzFfXzFfX0ltcGwKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjExMDMyOjE6ICggcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdF9fR3JvdXBfMF8xX18xX19JbXBsICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjExMDMzOjI6IHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RfX0dyb3VwXzBfMV9fMV9fSW1wbAogICAgICAgICAgICAgewogICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMik7CiAgICAgICAgICAgICBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0X19Hcm91cF8wXzFfXzFfX0ltcGwoKTsKQEAgLTMyOTUxLDM3ICszNzQwOCwzNyBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RfX0dyb3VwXzBfMV9fMV9fSW1wbCIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo5NzAxOjE6IHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RfX0dyb3VwXzBfMV9fMV9fSW1wbCA6ICggKCBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0X19Hcm91cF8wXzFfMV9fMCApKiApIDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMTAzOToxOiBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0X19Hcm91cF8wXzFfXzFfX0ltcGwgOiAoICggcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdF9fR3JvdXBfMF8xXzFfXzAgKSogKSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdF9fR3JvdXBfMF8xX18xX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjk3MDU6MTogKCAoICggcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdF9fR3JvdXBfMF8xXzFfXzAgKSogKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo5NzA2OjE6ICggKCBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0X19Hcm91cF8wXzFfMV9fMCApKiApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMTA0MzoxOiAoICggKCBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0X19Hcm91cF8wXzFfMV9fMCApKiApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjExMDQ0OjE6ICggKCBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0X19Hcm91cF8wXzFfMV9fMCApKiApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo5NzA2OjE6ICggKCBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0X19Hcm91cF8wXzFfMV9fMCApKiApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo5NzA3OjI6ICggcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdF9fR3JvdXBfMF8xXzFfXzAgKSoKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjExMDQ0OjE6ICggKCBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0X19Hcm91cF8wXzFfMV9fMCApKiApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMTA0NToyOiAoIHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RfX0dyb3VwXzBfMV8xX18wICkqCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RBY2Nlc3MoKS5nZXRHcm91cF8wXzFfMSgpKTsgCiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo5NzA4OjI6ICggcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdF9fR3JvdXBfMF8xXzFfXzAgKSoKLSAgICAgICAgICAgIGxvb3A5MDoKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjExMDQ2OjI6ICggcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdF9fR3JvdXBfMF8xXzFfXzAgKSoKKyAgICAgICAgICAgIGxvb3AxMDM6CiAgICAgICAgICAgICBkbyB7Ci0gICAgICAgICAgICAgICAgaW50IGFsdDkwPTI7Ci0gICAgICAgICAgICAgICAgaW50IExBOTBfMCA9IGlucHV0LkxBKDEpOworICAgICAgICAgICAgICAgIGludCBhbHQxMDM9MjsKKyAgICAgICAgICAgICAgICBpbnQgTEExMDNfMCA9IGlucHV0LkxBKDEpOwogCi0gICAgICAgICAgICAgICAgaWYgKCAoTEE5MF8wPT0xMTUpICkgewotICAgICAgICAgICAgICAgICAgICBhbHQ5MD0xOworICAgICAgICAgICAgICAgIGlmICggKExBMTAzXzA9PTEyNSkgKSB7CisgICAgICAgICAgICAgICAgICAgIGFsdDEwMz0xOwogICAgICAgICAgICAgICAgIH0KIAogCi0gICAgICAgICAgICAgICAgc3dpdGNoIChhbHQ5MCkgeworICAgICAgICAgICAgICAgIHN3aXRjaCAoYWx0MTAzKSB7CiAgICAgICAgICAgICAJY2FzZSAxIDoKLSAgICAgICAgICAgIAkgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6OTcwODozOiBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0X19Hcm91cF8wXzFfMV9fMAorICAgICAgICAgICAgCSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMTA0NjozOiBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0X19Hcm91cF8wXzFfMV9fMAogICAgICAgICAgICAgCSAgICB7Ci0gICAgICAgICAgICAJICAgIHB1c2hGb2xsb3coRk9MTE9XXzczKTsKKyAgICAgICAgICAgIAkgICAgcHVzaEZvbGxvdyhGT0xMT1dfODEpOwogICAgICAgICAgICAgCSAgICBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0X19Hcm91cF8wXzFfMV9fMCgpOwogCiAgICAgICAgICAgICAJICAgIHN0YXRlLl9mc3AtLTsKQEAgLTMyOTkxLDcgKzM3NDQ4LDcgQEAKICAgICAgICAgICAgIAkgICAgYnJlYWs7CiAKICAgICAgICAgICAgIAlkZWZhdWx0IDoKLSAgICAgICAgICAgIAkgICAgYnJlYWsgbG9vcDkwOworICAgICAgICAgICAgCSAgICBicmVhayBsb29wMTAzOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0gd2hpbGUgKHRydWUpOwogCkBAIC0zMzAyMCwxNiArMzc0NzcsMTYgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0X19Hcm91cF8wXzFfMV9fMCIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo5NzE3OjE6IHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RfX0dyb3VwXzBfMV8xX18wIDogcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdF9fR3JvdXBfMF8xXzFfXzBfX0ltcGwgcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdF9fR3JvdXBfMF8xXzFfXzEgOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjExMDU1OjE6IHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RfX0dyb3VwXzBfMV8xX18wIDogcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdF9fR3JvdXBfMF8xXzFfXzBfX0ltcGwgcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdF9fR3JvdXBfMF8xXzFfXzEgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RfX0dyb3VwXzBfMV8xX18wKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjk3MjE6MTogKCBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0X19Hcm91cF8wXzFfMV9fMF9fSW1wbCBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0X19Hcm91cF8wXzFfMV9fMSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo5NzIyOjI6IHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RfX0dyb3VwXzBfMV8xX18wX19JbXBsIHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RfX0dyb3VwXzBfMV8xX18xCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMTA1OToxOiAoIHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RfX0dyb3VwXzBfMV8xX18wX19JbXBsIHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RfX0dyb3VwXzBfMV8xX18xICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjExMDYwOjI6IHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RfX0dyb3VwXzBfMV8xX18wX19JbXBsIHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RfX0dyb3VwXzBfMV8xX18xCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV183NCk7CisgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV184Mik7CiAgICAgICAgICAgICBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0X19Hcm91cF8wXzFfMV9fMF9fSW1wbCgpOwogCiAgICAgICAgICAgICBzdGF0ZS5fZnNwLS07CkBAIC0zMzA1OCwyMiArMzc1MTUsMjIgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0X19Hcm91cF8wXzFfMV9fMF9fSW1wbCIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo5NzI5OjE6IHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RfX0dyb3VwXzBfMV8xX18wX19JbXBsIDogKCAnLCcgKSA7CisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTEwNjc6MTogcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdF9fR3JvdXBfMF8xXzFfXzBfX0ltcGwgOiAoICcsJyApIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0X19Hcm91cF8wXzFfMV9fMF9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo5NzMzOjE6ICggKCAnLCcgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo5NzM0OjE6ICggJywnICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjExMDcxOjE6ICggKCAnLCcgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMTA3MjoxOiAoICcsJyApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo5NzM0OjE6ICggJywnICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjk3MzU6MjogJywnCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMTA3MjoxOiAoICcsJyApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMTA3MzoyOiAnLCcKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdEFjY2VzcygpLmdldENvbW1hS2V5d29yZF8wXzFfMV8wKCkpOyAKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1hdGNoKGlucHV0LDExNSxGT0xMT1dfMik7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CisgICAgICAgICAgICBtYXRjaChpbnB1dCwxMjUsRk9MTE9XXzIpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOwogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBhZnRlcihncmFtbWFyQWNjZXNzLmdldFhBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RBY2Nlc3MoKS5nZXRDb21tYUtleXdvcmRfMF8xXzFfMCgpKTsgCiAgICAgICAgICAgICB9CkBAIC0zMzA5OSwxNCArMzc1NTYsMTQgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0X19Hcm91cF8wXzFfMV9fMSIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo5NzQ0OjE6IHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RfX0dyb3VwXzBfMV8xX18xIDogcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdF9fR3JvdXBfMF8xXzFfXzFfX0ltcGwgOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjExMDgyOjE6IHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RfX0dyb3VwXzBfMV8xX18xIDogcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdF9fR3JvdXBfMF8xXzFfXzFfX0ltcGwgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RfX0dyb3VwXzBfMV8xX18xKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjk3NDg6MTogKCBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0X19Hcm91cF8wXzFfMV9fMV9fSW1wbCApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo5NzQ5OjI6IHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RfX0dyb3VwXzBfMV8xX18xX19JbXBsCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMTA4NjoxOiAoIHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RfX0dyb3VwXzBfMV8xX18xX19JbXBsICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjExMDg3OjI6IHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RfX0dyb3VwXzBfMV8xX18xX19JbXBsCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV18yKTsKICAgICAgICAgICAgIHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RfX0dyb3VwXzBfMV8xX18xX19JbXBsKCk7CkBAIC0zMzEzMiwyMyArMzc1ODksMjMgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0X19Hcm91cF8wXzFfMV9fMV9fSW1wbCIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo5NzU1OjE6IHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RfX0dyb3VwXzBfMV8xX18xX19JbXBsIDogKCAoIHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RfX0VsZW1lbnRzQXNzaWdubWVudF8wXzFfMV8xICkgKSA7CisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTEwOTM6MTogcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdF9fR3JvdXBfMF8xXzFfXzFfX0ltcGwgOiAoICggcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdF9fRWxlbWVudHNBc3NpZ25tZW50XzBfMV8xXzEgKSApIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0X19Hcm91cF8wXzFfMV9fMV9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo5NzU5OjE6ICggKCAoIHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RfX0VsZW1lbnRzQXNzaWdubWVudF8wXzFfMV8xICkgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo5NzYwOjE6ICggKCBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0X19FbGVtZW50c0Fzc2lnbm1lbnRfMF8xXzFfMSApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjExMDk3OjE6ICggKCAoIHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RfX0VsZW1lbnRzQXNzaWdubWVudF8wXzFfMV8xICkgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMTA5ODoxOiAoICggcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdF9fRWxlbWVudHNBc3NpZ25tZW50XzBfMV8xXzEgKSApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo5NzYwOjE6ICggKCBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0X19FbGVtZW50c0Fzc2lnbm1lbnRfMF8xXzFfMSApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjk3NjE6MjogKCBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0X19FbGVtZW50c0Fzc2lnbm1lbnRfMF8xXzFfMSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMTA5ODoxOiAoICggcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdF9fRWxlbWVudHNBc3NpZ25tZW50XzBfMV8xXzEgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMTA5OToyOiAoIHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RfX0VsZW1lbnRzQXNzaWdubWVudF8wXzFfMV8xICkKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdEFjY2VzcygpLmdldEVsZW1lbnRzQXNzaWdubWVudF8wXzFfMV8xKCkpOyAKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjk3NjI6MjogKCBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0X19FbGVtZW50c0Fzc2lnbm1lbnRfMF8xXzFfMSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo5NzYyOjM6IHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RfX0VsZW1lbnRzQXNzaWdubWVudF8wXzFfMV8xCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMTEwMDoyOiAoIHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RfX0VsZW1lbnRzQXNzaWdubWVudF8wXzFfMV8xICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjExMTAwOjM6IHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RfX0VsZW1lbnRzQXNzaWdubWVudF8wXzFfMV8xCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV18yKTsKICAgICAgICAgICAgIHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RfX0VsZW1lbnRzQXNzaWdubWVudF8wXzFfMV8xKCk7CkBAIC0zMzE4MywxNiArMzc2NDAsMTYgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0X19Hcm91cF8xX18wIgotICAgIC8vIEludGVybmFsRGF0YURTTC5nOjk3NzE6MTogcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdF9fR3JvdXBfMV9fMCA6IHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RfX0dyb3VwXzFfXzBfX0ltcGwgcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdF9fR3JvdXBfMV9fMSA7CisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTExMDk6MTogcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdF9fR3JvdXBfMV9fMCA6IHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RfX0dyb3VwXzFfXzBfX0ltcGwgcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdF9fR3JvdXBfMV9fMSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdF9fR3JvdXBfMV9fMCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo5Nzc1OjE6ICggcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdF9fR3JvdXBfMV9fMF9fSW1wbCBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0X19Hcm91cF8xX18xICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjk3NzY6MjogcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdF9fR3JvdXBfMV9fMF9fSW1wbCBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0X19Hcm91cF8xX18xCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMTExMzoxOiAoIHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RfX0dyb3VwXzFfXzBfX0ltcGwgcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdF9fR3JvdXBfMV9fMSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMTExNDoyOiBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0X19Hcm91cF8xX18wX19JbXBsIHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RfX0dyb3VwXzFfXzEKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzcyKTsKKyAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzgwKTsKICAgICAgICAgICAgIHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RfX0dyb3VwXzFfXzBfX0ltcGwoKTsKIAogICAgICAgICAgICAgc3RhdGUuX2ZzcC0tOwpAQCAtMzMyMjEsMTcgKzM3Njc4LDE3IEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdF9fR3JvdXBfMV9fMF9fSW1wbCIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo5NzgzOjE6IHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RfX0dyb3VwXzFfXzBfX0ltcGwgOiAoIHJ1bGVYQW5ub3RhdGlvbk9yRXhwcmVzc2lvbiApIDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMTEyMToxOiBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0X19Hcm91cF8xX18wX19JbXBsIDogKCBydWxlWEFubm90YXRpb25PckV4cHJlc3Npb24gKSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdF9fR3JvdXBfMV9fMF9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo5Nzg3OjE6ICggKCBydWxlWEFubm90YXRpb25PckV4cHJlc3Npb24gKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo5Nzg4OjE6ICggcnVsZVhBbm5vdGF0aW9uT3JFeHByZXNzaW9uICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjExMTI1OjE6ICggKCBydWxlWEFubm90YXRpb25PckV4cHJlc3Npb24gKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMTEyNjoxOiAoIHJ1bGVYQW5ub3RhdGlvbk9yRXhwcmVzc2lvbiApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo5Nzg4OjE6ICggcnVsZVhBbm5vdGF0aW9uT3JFeHByZXNzaW9uICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjk3ODk6MjogcnVsZVhBbm5vdGF0aW9uT3JFeHByZXNzaW9uCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMTEyNjoxOiAoIHJ1bGVYQW5ub3RhdGlvbk9yRXhwcmVzc2lvbiApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMTEyNzoyOiBydWxlWEFubm90YXRpb25PckV4cHJlc3Npb24KICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdEFjY2VzcygpLmdldFhBbm5vdGF0aW9uT3JFeHByZXNzaW9uUGFyc2VyUnVsZUNhbGxfMV8wKCkpOyAKQEAgLTMzMjY2LDE0ICszNzcyMywxNCBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RfX0dyb3VwXzFfXzEiCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6OTc5ODoxOiBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0X19Hcm91cF8xX18xIDogcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdF9fR3JvdXBfMV9fMV9fSW1wbCA7CisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTExMzY6MTogcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdF9fR3JvdXBfMV9fMSA6IHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RfX0dyb3VwXzFfXzFfX0ltcGwgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RfX0dyb3VwXzFfXzEoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6OTgwMjoxOiAoIHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RfX0dyb3VwXzFfXzFfX0ltcGwgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6OTgwMzoyOiBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0X19Hcm91cF8xX18xX19JbXBsCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMTE0MDoxOiAoIHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RfX0dyb3VwXzFfXzFfX0ltcGwgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTExNDE6MjogcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdF9fR3JvdXBfMV9fMV9fSW1wbAogICAgICAgICAgICAgewogICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMik7CiAgICAgICAgICAgICBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0X19Hcm91cF8xX18xX19JbXBsKCk7CkBAIC0zMzI5OSwzMSArMzc3NTYsMzEgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0X19Hcm91cF8xX18xX19JbXBsIgotICAgIC8vIEludGVybmFsRGF0YURTTC5nOjk4MDk6MTogcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdF9fR3JvdXBfMV9fMV9fSW1wbCA6ICggKCBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0X19Hcm91cF8xXzFfXzAgKT8gKSA7CisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTExNDc6MTogcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdF9fR3JvdXBfMV9fMV9fSW1wbCA6ICggKCBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0X19Hcm91cF8xXzFfXzAgKT8gKSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdF9fR3JvdXBfMV9fMV9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo5ODEzOjE6ICggKCAoIHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RfX0dyb3VwXzFfMV9fMCApPyApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjk4MTQ6MTogKCAoIHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RfX0dyb3VwXzFfMV9fMCApPyApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMTE1MToxOiAoICggKCBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0X19Hcm91cF8xXzFfXzAgKT8gKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMTE1MjoxOiAoICggcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdF9fR3JvdXBfMV8xX18wICk/ICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjk4MTQ6MTogKCAoIHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RfX0dyb3VwXzFfMV9fMCApPyApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo5ODE1OjI6ICggcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdF9fR3JvdXBfMV8xX18wICk/CisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMTE1MjoxOiAoICggcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdF9fR3JvdXBfMV8xX18wICk/ICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjExMTUzOjI6ICggcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdF9fR3JvdXBfMV8xX18wICk/CiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RBY2Nlc3MoKS5nZXRHcm91cF8xXzEoKSk7IAogICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6OTgxNjoyOiAoIHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RfX0dyb3VwXzFfMV9fMCApPwotICAgICAgICAgICAgaW50IGFsdDkxPTI7Ci0gICAgICAgICAgICBpbnQgTEE5MV8wID0gaW5wdXQuTEEoMSk7CisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMTE1NDoyOiAoIHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RfX0dyb3VwXzFfMV9fMCApPworICAgICAgICAgICAgaW50IGFsdDEwND0yOworICAgICAgICAgICAgaW50IExBMTA0XzAgPSBpbnB1dC5MQSgxKTsKIAotICAgICAgICAgICAgaWYgKCAoTEE5MV8wPT0xMTUpICkgewotICAgICAgICAgICAgICAgIGFsdDkxPTE7CisgICAgICAgICAgICBpZiAoIChMQTEwNF8wPT0xMjUpICkgeworICAgICAgICAgICAgICAgIGFsdDEwND0xOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgc3dpdGNoIChhbHQ5MSkgeworICAgICAgICAgICAgc3dpdGNoIChhbHQxMDQpIHsKICAgICAgICAgICAgICAgICBjYXNlIDEgOgotICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo5ODE2OjM6IHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RfX0dyb3VwXzFfMV9fMAorICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMTE1NDozOiBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0X19Hcm91cF8xXzFfXzAKICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV18yKTsKICAgICAgICAgICAgICAgICAgICAgcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdF9fR3JvdXBfMV8xX18wKCk7CkBAIC0zMzM2MSwxNiArMzc4MTgsMTYgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0X19Hcm91cF8xXzFfXzAiCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6OTgyNToxOiBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0X19Hcm91cF8xXzFfXzAgOiBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0X19Hcm91cF8xXzFfXzBfX0ltcGwgcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdF9fR3JvdXBfMV8xX18xIDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMTE2MzoxOiBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0X19Hcm91cF8xXzFfXzAgOiBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0X19Hcm91cF8xXzFfXzBfX0ltcGwgcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdF9fR3JvdXBfMV8xX18xIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0X19Hcm91cF8xXzFfXzAoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6OTgyOToxOiAoIHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RfX0dyb3VwXzFfMV9fMF9fSW1wbCBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0X19Hcm91cF8xXzFfXzEgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6OTgzMDoyOiBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0X19Hcm91cF8xXzFfXzBfX0ltcGwgcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdF9fR3JvdXBfMV8xX18xCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMTE2NzoxOiAoIHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RfX0dyb3VwXzFfMV9fMF9fSW1wbCBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0X19Hcm91cF8xXzFfXzEgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTExNjg6MjogcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdF9fR3JvdXBfMV8xX18wX19JbXBsIHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RfX0dyb3VwXzFfMV9fMQogICAgICAgICAgICAgewotICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfNzIpOworICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfODApOwogICAgICAgICAgICAgcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdF9fR3JvdXBfMV8xX18wX19JbXBsKCk7CiAKICAgICAgICAgICAgIHN0YXRlLl9mc3AtLTsKQEAgLTMzMzk5LDIzICszNzg1NiwyMyBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RfX0dyb3VwXzFfMV9fMF9fSW1wbCIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo5ODM3OjE6IHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RfX0dyb3VwXzFfMV9fMF9fSW1wbCA6ICggKCkgKSA7CisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTExNzU6MTogcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdF9fR3JvdXBfMV8xX18wX19JbXBsIDogKCAoKSApIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0X19Hcm91cF8xXzFfXzBfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6OTg0MToxOiAoICggKCkgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo5ODQyOjE6ICggKCkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTExNzk6MTogKCAoICgpICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTExODA6MTogKCAoKSApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo5ODQyOjE6ICggKCkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6OTg0MzoyOiAoKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTExODA6MTogKCAoKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMTE4MToyOiAoKQogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0QWNjZXNzKCkuZ2V0WExpc3RMaXRlcmFsRWxlbWVudHNBY3Rpb25fMV8xXzAoKSk7IAogICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6OTg0NDoyOiAoKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6OTg0NDozOiAKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjExMTgyOjI6ICgpCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMTE4MjozOiAKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIH0KIApAQCAtMzM0NDAsMTQgKzM3ODk3LDE0IEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdF9fR3JvdXBfMV8xX18xIgotICAgIC8vIEludGVybmFsRGF0YURTTC5nOjk4NTI6MTogcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdF9fR3JvdXBfMV8xX18xIDogcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdF9fR3JvdXBfMV8xX18xX19JbXBsIDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMTE5MDoxOiBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0X19Hcm91cF8xXzFfXzEgOiBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0X19Hcm91cF8xXzFfXzFfX0ltcGwgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RfX0dyb3VwXzFfMV9fMSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo5ODU2OjE6ICggcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdF9fR3JvdXBfMV8xX18xX19JbXBsICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjk4NTc6MjogcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdF9fR3JvdXBfMV8xX18xX19JbXBsCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMTE5NDoxOiAoIHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RfX0dyb3VwXzFfMV9fMV9fSW1wbCApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMTE5NToyOiBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0X19Hcm91cF8xXzFfXzFfX0ltcGwKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzIpOwogICAgICAgICAgICAgcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdF9fR3JvdXBfMV8xX18xX19JbXBsKCk7CkBAIC0zMzQ3MywyOCArMzc5MzAsMjggQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0X19Hcm91cF8xXzFfXzFfX0ltcGwiCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6OTg2MzoxOiBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0X19Hcm91cF8xXzFfXzFfX0ltcGwgOiAoICggKCBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0X19Hcm91cF8xXzFfMV9fMCApICkgKCAoIHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RfX0dyb3VwXzFfMV8xX18wICkqICkgKSA7CisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTEyMDE6MTogcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdF9fR3JvdXBfMV8xX18xX19JbXBsIDogKCAoICggcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdF9fR3JvdXBfMV8xXzFfXzAgKSApICggKCBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0X19Hcm91cF8xXzFfMV9fMCApKiApICkgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RfX0dyb3VwXzFfMV9fMV9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo5ODY3OjE6ICggKCAoICggcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdF9fR3JvdXBfMV8xXzFfXzAgKSApICggKCBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0X19Hcm91cF8xXzFfMV9fMCApKiApICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6OTg2ODoxOiAoICggKCBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0X19Hcm91cF8xXzFfMV9fMCApICkgKCAoIHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RfX0dyb3VwXzFfMV8xX18wICkqICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTEyMDU6MTogKCAoICggKCBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0X19Hcm91cF8xXzFfMV9fMCApICkgKCAoIHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RfX0dyb3VwXzFfMV8xX18wICkqICkgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMTIwNjoxOiAoICggKCBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0X19Hcm91cF8xXzFfMV9fMCApICkgKCAoIHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RfX0dyb3VwXzFfMV8xX18wICkqICkgKQogICAgICAgICAgICAgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6OTg2ODoxOiAoICggKCBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0X19Hcm91cF8xXzFfMV9fMCApICkgKCAoIHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RfX0dyb3VwXzFfMV8xX18wICkqICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6OTg2OToyOiAoICggcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdF9fR3JvdXBfMV8xXzFfXzAgKSApICggKCBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0X19Hcm91cF8xXzFfMV9fMCApKiApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMTIwNjoxOiAoICggKCBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0X19Hcm91cF8xXzFfMV9fMCApICkgKCAoIHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RfX0dyb3VwXzFfMV8xX18wICkqICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTEyMDc6MjogKCAoIHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RfX0dyb3VwXzFfMV8xX18wICkgKSAoICggcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdF9fR3JvdXBfMV8xXzFfXzAgKSogKQogICAgICAgICAgICAgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6OTg2OToyOiAoICggcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdF9fR3JvdXBfMV8xXzFfXzAgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo5ODcwOjM6ICggcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdF9fR3JvdXBfMV8xXzFfXzAgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTEyMDc6MjogKCAoIHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RfX0dyb3VwXzFfMV8xX18wICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTEyMDg6MzogKCBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0X19Hcm91cF8xXzFfMV9fMCApCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RBY2Nlc3MoKS5nZXRHcm91cF8xXzFfMSgpKTsgCiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo5ODcxOjM6ICggcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdF9fR3JvdXBfMV8xXzFfXzAgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6OTg3MTo0OiBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0X19Hcm91cF8xXzFfMV9fMAorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTEyMDk6MzogKCBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0X19Hcm91cF8xXzFfMV9fMCApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMTIwOTo0OiBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0X19Hcm91cF8xXzFfMV9fMAogICAgICAgICAgICAgewotICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfNzMpOworICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfODEpOwogICAgICAgICAgICAgcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdF9fR3JvdXBfMV8xXzFfXzAoKTsKIAogICAgICAgICAgICAgc3RhdGUuX2ZzcC0tOwpAQCAtMzM1MDgsMjggKzM3OTY1LDI4IEBACiAKICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6OTg3NDoyOiAoICggcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdF9fR3JvdXBfMV8xXzFfXzAgKSogKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6OTg3NTozOiAoIHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RfX0dyb3VwXzFfMV8xX18wICkqCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMTIxMjoyOiAoICggcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdF9fR3JvdXBfMV8xXzFfXzAgKSogKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTEyMTM6MzogKCBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0X19Hcm91cF8xXzFfMV9fMCApKgogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0QWNjZXNzKCkuZ2V0R3JvdXBfMV8xXzEoKSk7IAogICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6OTg3NjozOiAoIHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RfX0dyb3VwXzFfMV8xX18wICkqCi0gICAgICAgICAgICBsb29wOTI6CisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMTIxNDozOiAoIHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RfX0dyb3VwXzFfMV8xX18wICkqCisgICAgICAgICAgICBsb29wMTA1OgogICAgICAgICAgICAgZG8gewotICAgICAgICAgICAgICAgIGludCBhbHQ5Mj0yOwotICAgICAgICAgICAgICAgIGludCBMQTkyXzAgPSBpbnB1dC5MQSgxKTsKKyAgICAgICAgICAgICAgICBpbnQgYWx0MTA1PTI7CisgICAgICAgICAgICAgICAgaW50IExBMTA1XzAgPSBpbnB1dC5MQSgxKTsKIAotICAgICAgICAgICAgICAgIGlmICggKExBOTJfMD09MTE1KSApIHsKLSAgICAgICAgICAgICAgICAgICAgYWx0OTI9MTsKKyAgICAgICAgICAgICAgICBpZiAoIChMQTEwNV8wPT0xMjUpICkgeworICAgICAgICAgICAgICAgICAgICBhbHQxMDU9MTsKICAgICAgICAgICAgICAgICB9CiAKIAotICAgICAgICAgICAgICAgIHN3aXRjaCAoYWx0OTIpIHsKKyAgICAgICAgICAgICAgICBzd2l0Y2ggKGFsdDEwNSkgewogICAgICAgICAgICAgCWNhc2UgMSA6Ci0gICAgICAgICAgICAJICAgIC8vIEludGVybmFsRGF0YURTTC5nOjk4NzY6NDogcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdF9fR3JvdXBfMV8xXzFfXzAKKyAgICAgICAgICAgIAkgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTEyMTQ6NDogcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdF9fR3JvdXBfMV8xXzFfXzAKICAgICAgICAgICAgIAkgICAgewotICAgICAgICAgICAgCSAgICBwdXNoRm9sbG93KEZPTExPV183Myk7CisgICAgICAgICAgICAJICAgIHB1c2hGb2xsb3coRk9MTE9XXzgxKTsKICAgICAgICAgICAgIAkgICAgcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdF9fR3JvdXBfMV8xXzFfXzAoKTsKIAogICAgICAgICAgICAgCSAgICBzdGF0ZS5fZnNwLS07CkBAIC0zMzUzOSw3ICszNzk5Niw3IEBACiAgICAgICAgICAgICAJICAgIGJyZWFrOwogCiAgICAgICAgICAgICAJZGVmYXVsdCA6Ci0gICAgICAgICAgICAJICAgIGJyZWFrIGxvb3A5MjsKKyAgICAgICAgICAgIAkgICAgYnJlYWsgbG9vcDEwNTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9IHdoaWxlICh0cnVlKTsKIApAQCAtMzM1NzEsMTYgKzM4MDI4LDE2IEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdF9fR3JvdXBfMV8xXzFfXzAiCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6OTg4NjoxOiBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0X19Hcm91cF8xXzFfMV9fMCA6IHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RfX0dyb3VwXzFfMV8xX18wX19JbXBsIHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RfX0dyb3VwXzFfMV8xX18xIDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMTIyNDoxOiBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0X19Hcm91cF8xXzFfMV9fMCA6IHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RfX0dyb3VwXzFfMV8xX18wX19JbXBsIHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RfX0dyb3VwXzFfMV8xX18xIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0X19Hcm91cF8xXzFfMV9fMCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo5ODkwOjE6ICggcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdF9fR3JvdXBfMV8xXzFfXzBfX0ltcGwgcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdF9fR3JvdXBfMV8xXzFfXzEgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6OTg5MToyOiBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0X19Hcm91cF8xXzFfMV9fMF9fSW1wbCBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0X19Hcm91cF8xXzFfMV9fMQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTEyMjg6MTogKCBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0X19Hcm91cF8xXzFfMV9fMF9fSW1wbCBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0X19Hcm91cF8xXzFfMV9fMSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMTIyOToyOiBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0X19Hcm91cF8xXzFfMV9fMF9fSW1wbCBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0X19Hcm91cF8xXzFfMV9fMQogICAgICAgICAgICAgewotICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfNzQpOworICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfODIpOwogICAgICAgICAgICAgcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdF9fR3JvdXBfMV8xXzFfXzBfX0ltcGwoKTsKIAogICAgICAgICAgICAgc3RhdGUuX2ZzcC0tOwpAQCAtMzM2MDksMjIgKzM4MDY2LDIyIEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdF9fR3JvdXBfMV8xXzFfXzBfX0ltcGwiCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6OTg5ODoxOiBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0X19Hcm91cF8xXzFfMV9fMF9fSW1wbCA6ICggJywnICkgOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjExMjM2OjE6IHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RfX0dyb3VwXzFfMV8xX18wX19JbXBsIDogKCAnLCcgKSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdF9fR3JvdXBfMV8xXzFfXzBfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6OTkwMjoxOiAoICggJywnICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6OTkwMzoxOiAoICcsJyApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMTI0MDoxOiAoICggJywnICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTEyNDE6MTogKCAnLCcgKQogICAgICAgICAgICAgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6OTkwMzoxOiAoICcsJyApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo5OTA0OjI6ICcsJworICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTEyNDE6MTogKCAnLCcgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTEyNDI6MjogJywnCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RBY2Nlc3MoKS5nZXRDb21tYUtleXdvcmRfMV8xXzFfMCgpKTsgCiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBtYXRjaChpbnB1dCwxMTUsRk9MTE9XXzIpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOworICAgICAgICAgICAgbWF0Y2goaW5wdXQsMTI1LEZPTExPV18yKTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0QWNjZXNzKCkuZ2V0Q29tbWFLZXl3b3JkXzFfMV8xXzAoKSk7IAogICAgICAgICAgICAgfQpAQCAtMzM2NTAsMTQgKzM4MTA3LDE0IEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdF9fR3JvdXBfMV8xXzFfXzEiCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6OTkxMzoxOiBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0X19Hcm91cF8xXzFfMV9fMSA6IHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RfX0dyb3VwXzFfMV8xX18xX19JbXBsIDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMTI1MToxOiBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0X19Hcm91cF8xXzFfMV9fMSA6IHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RfX0dyb3VwXzFfMV8xX18xX19JbXBsIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0X19Hcm91cF8xXzFfMV9fMSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo5OTE3OjE6ICggcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdF9fR3JvdXBfMV8xXzFfXzFfX0ltcGwgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6OTkxODoyOiBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0X19Hcm91cF8xXzFfMV9fMV9fSW1wbAorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTEyNTU6MTogKCBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0X19Hcm91cF8xXzFfMV9fMV9fSW1wbCApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMTI1NjoyOiBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0X19Hcm91cF8xXzFfMV9fMV9fSW1wbAogICAgICAgICAgICAgewogICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMik7CiAgICAgICAgICAgICBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0X19Hcm91cF8xXzFfMV9fMV9fSW1wbCgpOwpAQCAtMzM2ODMsMjMgKzM4MTQwLDIzIEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdF9fR3JvdXBfMV8xXzFfXzFfX0ltcGwiCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6OTkyNDoxOiBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0X19Hcm91cF8xXzFfMV9fMV9fSW1wbCA6ICggKCBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0X19FbGVtZW50c0Fzc2lnbm1lbnRfMV8xXzFfMSApICkgOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjExMjYyOjE6IHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RfX0dyb3VwXzFfMV8xX18xX19JbXBsIDogKCAoIHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RfX0VsZW1lbnRzQXNzaWdubWVudF8xXzFfMV8xICkgKSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdF9fR3JvdXBfMV8xXzFfXzFfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6OTkyODoxOiAoICggKCBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0X19FbGVtZW50c0Fzc2lnbm1lbnRfMV8xXzFfMSApICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6OTkyOToxOiAoICggcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdF9fRWxlbWVudHNBc3NpZ25tZW50XzFfMV8xXzEgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMTI2NjoxOiAoICggKCBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0X19FbGVtZW50c0Fzc2lnbm1lbnRfMV8xXzFfMSApICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTEyNjc6MTogKCAoIHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RfX0VsZW1lbnRzQXNzaWdubWVudF8xXzFfMV8xICkgKQogICAgICAgICAgICAgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6OTkyOToxOiAoICggcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdF9fRWxlbWVudHNBc3NpZ25tZW50XzFfMV8xXzEgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo5OTMwOjI6ICggcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdF9fRWxlbWVudHNBc3NpZ25tZW50XzFfMV8xXzEgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTEyNjc6MTogKCAoIHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RfX0VsZW1lbnRzQXNzaWdubWVudF8xXzFfMV8xICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTEyNjg6MjogKCBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0X19FbGVtZW50c0Fzc2lnbm1lbnRfMV8xXzFfMSApCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RBY2Nlc3MoKS5nZXRFbGVtZW50c0Fzc2lnbm1lbnRfMV8xXzFfMSgpKTsgCiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo5OTMxOjI6ICggcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdF9fRWxlbWVudHNBc3NpZ25tZW50XzFfMV8xXzEgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6OTkzMTozOiBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0X19FbGVtZW50c0Fzc2lnbm1lbnRfMV8xXzFfMQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTEyNjk6MjogKCBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0X19FbGVtZW50c0Fzc2lnbm1lbnRfMV8xXzFfMSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMTI2OTozOiBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0X19FbGVtZW50c0Fzc2lnbm1lbnRfMV8xXzFfMQogICAgICAgICAgICAgewogICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMik7CiAgICAgICAgICAgICBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0X19FbGVtZW50c0Fzc2lnbm1lbnRfMV8xXzFfMSgpOwpAQCAtMzM3MzQsMTYgKzM4MTkxLDE2IEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVfX0dyb3VwXzBfXzAiCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6OTk0MDoxOiBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZV9fR3JvdXBfMF9fMCA6IHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlX19Hcm91cF8wX18wX19JbXBsIHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlX19Hcm91cF8wX18xIDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMTI3ODoxOiBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZV9fR3JvdXBfMF9fMCA6IHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlX19Hcm91cF8wX18wX19JbXBsIHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlX19Hcm91cF8wX18xIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZV9fR3JvdXBfMF9fMCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo5OTQ0OjE6ICggcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVfX0dyb3VwXzBfXzBfX0ltcGwgcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVfX0dyb3VwXzBfXzEgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6OTk0NToyOiBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZV9fR3JvdXBfMF9fMF9fSW1wbCBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZV9fR3JvdXBfMF9fMQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTEyODI6MTogKCBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZV9fR3JvdXBfMF9fMF9fSW1wbCBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZV9fR3JvdXBfMF9fMSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMTI4MzoyOiBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZV9fR3JvdXBfMF9fMF9fSW1wbCBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZV9fR3JvdXBfMF9fMQogICAgICAgICAgICAgewotICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfNzYpOworICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfODQpOwogICAgICAgICAgICAgcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVfX0dyb3VwXzBfXzBfX0ltcGwoKTsKIAogICAgICAgICAgICAgc3RhdGUuX2ZzcC0tOwpAQCAtMzM3NzIsMjMgKzM4MjI5LDIzIEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVfX0dyb3VwXzBfXzBfX0ltcGwiCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6OTk1MjoxOiBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZV9fR3JvdXBfMF9fMF9fSW1wbCA6ICggKCBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZV9fR3JvdXBfMF8wX18wICkgKSA7CisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTEyOTA6MTogcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVfX0dyb3VwXzBfXzBfX0ltcGwgOiAoICggcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVfX0dyb3VwXzBfMF9fMCApICkgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlX19Hcm91cF8wX18wX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjk5NTY6MTogKCAoICggcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVfX0dyb3VwXzBfMF9fMCApICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6OTk1NzoxOiAoICggcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVfX0dyb3VwXzBfMF9fMCApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjExMjk0OjE6ICggKCAoIHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlX19Hcm91cF8wXzBfXzAgKSApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjExMjk1OjE6ICggKCBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZV9fR3JvdXBfMF8wX18wICkgKQogICAgICAgICAgICAgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6OTk1NzoxOiAoICggcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVfX0dyb3VwXzBfMF9fMCApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjk5NTg6MjogKCBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZV9fR3JvdXBfMF8wX18wICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjExMjk1OjE6ICggKCBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZV9fR3JvdXBfMF8wX18wICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTEyOTY6MjogKCBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZV9fR3JvdXBfMF8wX18wICkKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WEFubm90YXRpb25FbGVtZW50VmFsdWVBY2Nlc3MoKS5nZXRHcm91cF8wXzAoKSk7IAogICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6OTk1OToyOiAoIHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlX19Hcm91cF8wXzBfXzAgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6OTk1OTozOiBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZV9fR3JvdXBfMF8wX18wCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMTI5NzoyOiAoIHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlX19Hcm91cF8wXzBfXzAgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTEyOTc6MzogcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVfX0dyb3VwXzBfMF9fMAogICAgICAgICAgICAgewogICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMik7CiAgICAgICAgICAgICBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZV9fR3JvdXBfMF8wX18wKCk7CkBAIC0zMzgyMywxNiArMzgyODAsMTYgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZV9fR3JvdXBfMF9fMSIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo5OTY3OjE6IHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlX19Hcm91cF8wX18xIDogcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVfX0dyb3VwXzBfXzFfX0ltcGwgcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVfX0dyb3VwXzBfXzIgOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjExMzA1OjE6IHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlX19Hcm91cF8wX18xIDogcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVfX0dyb3VwXzBfXzFfX0ltcGwgcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVfX0dyb3VwXzBfXzIgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlX19Hcm91cF8wX18xKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjk5NzE6MTogKCBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZV9fR3JvdXBfMF9fMV9fSW1wbCBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZV9fR3JvdXBfMF9fMiApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo5OTcyOjI6IHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlX19Hcm91cF8wX18xX19JbXBsIHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlX19Hcm91cF8wX18yCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMTMwOToxOiAoIHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlX19Hcm91cF8wX18xX19JbXBsIHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlX19Hcm91cF8wX18yICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjExMzEwOjI6IHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlX19Hcm91cF8wX18xX19JbXBsIHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlX19Hcm91cF8wX18yCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV183Nik7CisgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV184NCk7CiAgICAgICAgICAgICBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZV9fR3JvdXBfMF9fMV9fSW1wbCgpOwogCiAgICAgICAgICAgICBzdGF0ZS5fZnNwLS07CkBAIC0zMzg2MSwzMSArMzgzMTgsMzEgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZV9fR3JvdXBfMF9fMV9fSW1wbCIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo5OTc5OjE6IHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlX19Hcm91cF8wX18xX19JbXBsIDogKCAoIHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlX19Hcm91cF8wXzFfXzAgKT8gKSA7CisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTEzMTc6MTogcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVfX0dyb3VwXzBfXzFfX0ltcGwgOiAoICggcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVfX0dyb3VwXzBfMV9fMCApPyApIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZV9fR3JvdXBfMF9fMV9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo5OTgzOjE6ICggKCAoIHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlX19Hcm91cF8wXzFfXzAgKT8gKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo5OTg0OjE6ICggKCBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZV9fR3JvdXBfMF8xX18wICk/ICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjExMzIxOjE6ICggKCAoIHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlX19Hcm91cF8wXzFfXzAgKT8gKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMTMyMjoxOiAoICggcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVfX0dyb3VwXzBfMV9fMCApPyApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo5OTg0OjE6ICggKCBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZV9fR3JvdXBfMF8xX18wICk/ICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjk5ODU6MjogKCBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZV9fR3JvdXBfMF8xX18wICk/CisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMTMyMjoxOiAoICggcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVfX0dyb3VwXzBfMV9fMCApPyApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMTMyMzoyOiAoIHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlX19Hcm91cF8wXzFfXzAgKT8KICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WEFubm90YXRpb25FbGVtZW50VmFsdWVBY2Nlc3MoKS5nZXRHcm91cF8wXzEoKSk7IAogICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6OTk4NjoyOiAoIHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlX19Hcm91cF8wXzFfXzAgKT8KLSAgICAgICAgICAgIGludCBhbHQ5Mz0yOwotICAgICAgICAgICAgaW50IExBOTNfMCA9IGlucHV0LkxBKDEpOworICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTEzMjQ6MjogKCBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZV9fR3JvdXBfMF8xX18wICk/CisgICAgICAgICAgICBpbnQgYWx0MTA2PTI7CisgICAgICAgICAgICBpbnQgTEExMDZfMCA9IGlucHV0LkxBKDEpOwogCi0gICAgICAgICAgICBpZiAoICgoTEE5M18wPj1SVUxFX1NUUklORyAmJiBMQTkzXzA8PVJVTEVfREVDSU1BTCl8fExBOTNfMD09Mjd8fChMQTkzXzA+PTM0ICYmIExBOTNfMDw9MzUpfHxMQTkzXzA9PTQwfHwoTEE5M18wPj00NSAmJiBMQTkzXzA8PTUwKXx8TEE5M18wPT03MHx8TEE5M18wPT05NXx8KExBOTNfMD49MTEyICYmIExBOTNfMDw9MTEzKXx8KExBOTNfMD49MTE3ICYmIExBOTNfMDw9MTE4KXx8TEE5M18wPT0xMjB8fExBOTNfMD09MTIyfHwoTEE5M18wPj0xMjYgJiYgTEE5M18wPD0xMzMpfHxMQTkzXzA9PTEzNXx8TEE5M18wPT0xNTQpICkgewotICAgICAgICAgICAgICAgIGFsdDkzPTE7CisgICAgICAgICAgICBpZiAoICgoTEExMDZfMD49UlVMRV9TVFJJTkcgJiYgTEExMDZfMDw9UlVMRV9ERUNJTUFMKXx8TEExMDZfMD09Mjd8fChMQTEwNl8wPj0zNCAmJiBMQTEwNl8wPD0zNSl8fExBMTA2XzA9PTQwfHwoTEExMDZfMD49NDUgJiYgTEExMDZfMDw9NTApfHxMQTEwNl8wPT03NXx8TEExMDZfMD09MTAyfHwoTEExMDZfMD49MTIyICYmIExBMTA2XzA8PTEyMyl8fChMQTEwNl8wPj0xMjcgJiYgTEExMDZfMDw9MTI4KXx8TEExMDZfMD09MTMwfHxMQTEwNl8wPT0xMzJ8fChMQTEwNl8wPj0xMzYgJiYgTEExMDZfMDw9MTQzKXx8TEExMDZfMD09MTQ1fHxMQTEwNl8wPT0xNjYpICkgeworICAgICAgICAgICAgICAgIGFsdDEwNj0xOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgc3dpdGNoIChhbHQ5MykgeworICAgICAgICAgICAgc3dpdGNoIChhbHQxMDYpIHsKICAgICAgICAgICAgICAgICBjYXNlIDEgOgotICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo5OTg2OjM6IHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlX19Hcm91cF8wXzFfXzAKKyAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTEzMjQ6MzogcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVfX0dyb3VwXzBfMV9fMAogICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzIpOwogICAgICAgICAgICAgICAgICAgICBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZV9fR3JvdXBfMF8xX18wKCk7CkBAIC0zMzkyMywxNCArMzgzODAsMTQgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZV9fR3JvdXBfMF9fMiIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo5OTk0OjE6IHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlX19Hcm91cF8wX18yIDogcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVfX0dyb3VwXzBfXzJfX0ltcGwgOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjExMzMyOjE6IHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlX19Hcm91cF8wX18yIDogcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVfX0dyb3VwXzBfXzJfX0ltcGwgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlX19Hcm91cF8wX18yKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjk5OTg6MTogKCBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZV9fR3JvdXBfMF9fMl9fSW1wbCApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo5OTk5OjI6IHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlX19Hcm91cF8wX18yX19JbXBsCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMTMzNjoxOiAoIHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlX19Hcm91cF8wX18yX19JbXBsICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjExMzM3OjI6IHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlX19Hcm91cF8wX18yX19JbXBsCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV18yKTsKICAgICAgICAgICAgIHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlX19Hcm91cF8wX18yX19JbXBsKCk7CkBAIC0zMzk1NiwyMiArMzg0MTMsMjIgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZV9fR3JvdXBfMF9fMl9fSW1wbCIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMDAwNToxOiBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZV9fR3JvdXBfMF9fMl9fSW1wbCA6ICggJ10nICkgOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjExMzQzOjE6IHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlX19Hcm91cF8wX18yX19JbXBsIDogKCAnXScgKSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVfX0dyb3VwXzBfXzJfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTAwMDk6MTogKCAoICddJyApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEwMDEwOjE6ICggJ10nICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjExMzQ3OjE6ICggKCAnXScgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMTM0ODoxOiAoICddJyApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMDAxMDoxOiAoICddJyApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMDAxMToyOiAnXScKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjExMzQ4OjE6ICggJ10nICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjExMzQ5OjI6ICddJwogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZUFjY2VzcygpLmdldFJpZ2h0U3F1YXJlQnJhY2tldEtleXdvcmRfMF8yKCkpOyAKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1hdGNoKGlucHV0LDExNixGT0xMT1dfMik7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CisgICAgICAgICAgICBtYXRjaChpbnB1dCwxMjYsRk9MTE9XXzIpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOwogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBhZnRlcihncmFtbWFyQWNjZXNzLmdldFhBbm5vdGF0aW9uRWxlbWVudFZhbHVlQWNjZXNzKCkuZ2V0UmlnaHRTcXVhcmVCcmFja2V0S2V5d29yZF8wXzIoKSk7IAogICAgICAgICAgICAgfQpAQCAtMzM5OTcsMTQgKzM4NDU0LDE0IEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVfX0dyb3VwXzBfMF9fMCIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMDAyMToxOiBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZV9fR3JvdXBfMF8wX18wIDogcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVfX0dyb3VwXzBfMF9fMF9fSW1wbCA7CisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTEzNTk6MTogcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVfX0dyb3VwXzBfMF9fMCA6IHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlX19Hcm91cF8wXzBfXzBfX0ltcGwgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlX19Hcm91cF8wXzBfXzAoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTAwMjU6MTogKCBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZV9fR3JvdXBfMF8wX18wX19JbXBsICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEwMDI2OjI6IHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlX19Hcm91cF8wXzBfXzBfX0ltcGwKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjExMzYzOjE6ICggcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVfX0dyb3VwXzBfMF9fMF9fSW1wbCApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMTM2NDoyOiBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZV9fR3JvdXBfMF8wX18wX19JbXBsCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV18yKTsKICAgICAgICAgICAgIHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlX19Hcm91cF8wXzBfXzBfX0ltcGwoKTsKQEAgLTM0MDMwLDIzICszODQ4NywyMyBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlX19Hcm91cF8wXzBfXzBfX0ltcGwiCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTAwMzI6MTogcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVfX0dyb3VwXzBfMF9fMF9fSW1wbCA6ICggKCBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZV9fR3JvdXBfMF8wXzBfXzAgKSApIDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMTM3MDoxOiBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZV9fR3JvdXBfMF8wX18wX19JbXBsIDogKCAoIHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlX19Hcm91cF8wXzBfMF9fMCApICkgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlX19Hcm91cF8wXzBfXzBfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTAwMzY6MTogKCAoICggcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVfX0dyb3VwXzBfMF8wX18wICkgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMDAzNzoxOiAoICggcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVfX0dyb3VwXzBfMF8wX18wICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTEzNzQ6MTogKCAoICggcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVfX0dyb3VwXzBfMF8wX18wICkgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMTM3NToxOiAoICggcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVfX0dyb3VwXzBfMF8wX18wICkgKQogICAgICAgICAgICAgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTAwMzc6MTogKCAoIHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlX19Hcm91cF8wXzBfMF9fMCApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEwMDM4OjI6ICggcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVfX0dyb3VwXzBfMF8wX18wICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjExMzc1OjE6ICggKCBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZV9fR3JvdXBfMF8wXzBfXzAgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMTM3NjoyOiAoIHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlX19Hcm91cF8wXzBfMF9fMCApCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhBbm5vdGF0aW9uRWxlbWVudFZhbHVlQWNjZXNzKCkuZ2V0R3JvdXBfMF8wXzAoKSk7IAogICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTAwMzk6MjogKCBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZV9fR3JvdXBfMF8wXzBfXzAgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTAwMzk6MzogcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVfX0dyb3VwXzBfMF8wX18wCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMTM3NzoyOiAoIHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlX19Hcm91cF8wXzBfMF9fMCApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMTM3NzozOiBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZV9fR3JvdXBfMF8wXzBfXzAKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzIpOwogICAgICAgICAgICAgcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVfX0dyb3VwXzBfMF8wX18wKCk7CkBAIC0zNDA4MSwxNiArMzg1MzgsMTYgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZV9fR3JvdXBfMF8wXzBfXzAiCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTAwNDg6MTogcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVfX0dyb3VwXzBfMF8wX18wIDogcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVfX0dyb3VwXzBfMF8wX18wX19JbXBsIHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlX19Hcm91cF8wXzBfMF9fMSA7CisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTEzODY6MTogcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVfX0dyb3VwXzBfMF8wX18wIDogcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVfX0dyb3VwXzBfMF8wX18wX19JbXBsIHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlX19Hcm91cF8wXzBfMF9fMSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVfX0dyb3VwXzBfMF8wX18wKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEwMDUyOjE6ICggcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVfX0dyb3VwXzBfMF8wX18wX19JbXBsIHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlX19Hcm91cF8wXzBfMF9fMSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMDA1MzoyOiBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZV9fR3JvdXBfMF8wXzBfXzBfX0ltcGwgcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVfX0dyb3VwXzBfMF8wX18xCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMTM5MDoxOiAoIHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlX19Hcm91cF8wXzBfMF9fMF9fSW1wbCBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZV9fR3JvdXBfMF8wXzBfXzEgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTEzOTE6MjogcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVfX0dyb3VwXzBfMF8wX18wX19JbXBsIHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlX19Hcm91cF8wXzBfMF9fMQogICAgICAgICAgICAgewotICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfNzcpOworICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfODUpOwogICAgICAgICAgICAgcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVfX0dyb3VwXzBfMF8wX18wX19JbXBsKCk7CiAKICAgICAgICAgICAgIHN0YXRlLl9mc3AtLTsKQEAgLTM0MTE5LDIzICszODU3NiwyMyBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlX19Hcm91cF8wXzBfMF9fMF9fSW1wbCIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMDA2MDoxOiBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZV9fR3JvdXBfMF8wXzBfXzBfX0ltcGwgOiAoICgpICkgOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjExMzk4OjE6IHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlX19Hcm91cF8wXzBfMF9fMF9fSW1wbCA6ICggKCkgKSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVfX0dyb3VwXzBfMF8wX18wX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEwMDY0OjE6ICggKCAoKSApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEwMDY1OjE6ICggKCkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTE0MDI6MTogKCAoICgpICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTE0MDM6MTogKCAoKSApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMDA2NToxOiAoICgpICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEwMDY2OjI6ICgpCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMTQwMzoxOiAoICgpICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjExNDA0OjI6ICgpCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhBbm5vdGF0aW9uRWxlbWVudFZhbHVlQWNjZXNzKCkuZ2V0WExpc3RMaXRlcmFsQWN0aW9uXzBfMF8wXzAoKSk7IAogICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTAwNjc6MjogKCkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEwMDY3OjM6IAorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTE0MDU6MjogKCkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjExNDA1OjM6IAogICAgICAgICAgICAgewogICAgICAgICAgICAgfQogCkBAIC0zNDE2MCwxNiArMzg2MTcsMTYgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZV9fR3JvdXBfMF8wXzBfXzEiCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTAwNzU6MTogcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVfX0dyb3VwXzBfMF8wX18xIDogcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVfX0dyb3VwXzBfMF8wX18xX19JbXBsIHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlX19Hcm91cF8wXzBfMF9fMiA7CisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTE0MTM6MTogcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVfX0dyb3VwXzBfMF8wX18xIDogcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVfX0dyb3VwXzBfMF8wX18xX19JbXBsIHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlX19Hcm91cF8wXzBfMF9fMiA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVfX0dyb3VwXzBfMF8wX18xKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEwMDc5OjE6ICggcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVfX0dyb3VwXzBfMF8wX18xX19JbXBsIHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlX19Hcm91cF8wXzBfMF9fMiApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMDA4MDoyOiBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZV9fR3JvdXBfMF8wXzBfXzFfX0ltcGwgcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVfX0dyb3VwXzBfMF8wX18yCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMTQxNzoxOiAoIHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlX19Hcm91cF8wXzBfMF9fMV9fSW1wbCBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZV9fR3JvdXBfMF8wXzBfXzIgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTE0MTg6MjogcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVfX0dyb3VwXzBfMF8wX18xX19JbXBsIHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlX19Hcm91cF8wXzBfMF9fMgogICAgICAgICAgICAgewotICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfNzgpOworICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfODYpOwogICAgICAgICAgICAgcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVfX0dyb3VwXzBfMF8wX18xX19JbXBsKCk7CiAKICAgICAgICAgICAgIHN0YXRlLl9mc3AtLTsKQEAgLTM0MTk4LDIyICszODY1NSwyMiBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlX19Hcm91cF8wXzBfMF9fMV9fSW1wbCIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMDA4NzoxOiBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZV9fR3JvdXBfMF8wXzBfXzFfX0ltcGwgOiAoICcjJyApIDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMTQyNToxOiBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZV9fR3JvdXBfMF8wXzBfXzFfX0ltcGwgOiAoICcjJyApIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZV9fR3JvdXBfMF8wXzBfXzFfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTAwOTE6MTogKCAoICcjJyApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEwMDkyOjE6ICggJyMnICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjExNDI5OjE6ICggKCAnIycgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMTQzMDoxOiAoICcjJyApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMDA5MjoxOiAoICcjJyApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMDA5MzoyOiAnIycKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjExNDMwOjE6ICggJyMnICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjExNDMxOjI6ICcjJwogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZUFjY2VzcygpLmdldE51bWJlclNpZ25LZXl3b3JkXzBfMF8wXzEoKSk7IAogICAgICAgICAgICAgfQotICAgICAgICAgICAgbWF0Y2goaW5wdXQsMTE3LEZPTExPV18yKTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKKyAgICAgICAgICAgIG1hdGNoKGlucHV0LDEyNyxGT0xMT1dfMik7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0WEFubm90YXRpb25FbGVtZW50VmFsdWVBY2Nlc3MoKS5nZXROdW1iZXJTaWduS2V5d29yZF8wXzBfMF8xKCkpOyAKICAgICAgICAgICAgIH0KQEAgLTM0MjM5LDE0ICszODY5NiwxNCBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlX19Hcm91cF8wXzBfMF9fMiIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMDEwMjoxOiBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZV9fR3JvdXBfMF8wXzBfXzIgOiBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZV9fR3JvdXBfMF8wXzBfXzJfX0ltcGwgOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjExNDQwOjE6IHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlX19Hcm91cF8wXzBfMF9fMiA6IHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlX19Hcm91cF8wXzBfMF9fMl9fSW1wbCA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVfX0dyb3VwXzBfMF8wX18yKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEwMTA2OjE6ICggcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVfX0dyb3VwXzBfMF8wX18yX19JbXBsICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEwMTA3OjI6IHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlX19Hcm91cF8wXzBfMF9fMl9fSW1wbAorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTE0NDQ6MTogKCBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZV9fR3JvdXBfMF8wXzBfXzJfX0ltcGwgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTE0NDU6MjogcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVfX0dyb3VwXzBfMF8wX18yX19JbXBsCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV18yKTsKICAgICAgICAgICAgIHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlX19Hcm91cF8wXzBfMF9fMl9fSW1wbCgpOwpAQCAtMzQyNzIsMjIgKzM4NzI5LDIyIEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVfX0dyb3VwXzBfMF8wX18yX19JbXBsIgotICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEwMTEzOjE6IHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlX19Hcm91cF8wXzBfMF9fMl9fSW1wbCA6ICggJ1snICkgOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjExNDUxOjE6IHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlX19Hcm91cF8wXzBfMF9fMl9fSW1wbCA6ICggJ1snICkgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlX19Hcm91cF8wXzBfMF9fMl9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMDExNzoxOiAoICggJ1snICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTAxMTg6MTogKCAnWycgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTE0NTU6MTogKCAoICdbJyApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjExNDU2OjE6ICggJ1snICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEwMTE4OjE6ICggJ1snICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEwMTE5OjI6ICdbJworICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTE0NTY6MTogKCAnWycgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTE0NTc6MjogJ1snCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhBbm5vdGF0aW9uRWxlbWVudFZhbHVlQWNjZXNzKCkuZ2V0TGVmdFNxdWFyZUJyYWNrZXRLZXl3b3JkXzBfMF8wXzIoKSk7IAogICAgICAgICAgICAgfQotICAgICAgICAgICAgbWF0Y2goaW5wdXQsMTE4LEZPTExPV18yKTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKKyAgICAgICAgICAgIG1hdGNoKGlucHV0LDEyOCxGT0xMT1dfMik7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0WEFubm90YXRpb25FbGVtZW50VmFsdWVBY2Nlc3MoKS5nZXRMZWZ0U3F1YXJlQnJhY2tldEtleXdvcmRfMF8wXzBfMigpKTsgCiAgICAgICAgICAgICB9CkBAIC0zNDMxMywxNiArMzg3NzAsMTYgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZV9fR3JvdXBfMF8xX18wIgotICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEwMTI5OjE6IHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlX19Hcm91cF8wXzFfXzAgOiBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZV9fR3JvdXBfMF8xX18wX19JbXBsIHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlX19Hcm91cF8wXzFfXzEgOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjExNDY3OjE6IHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlX19Hcm91cF8wXzFfXzAgOiBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZV9fR3JvdXBfMF8xX18wX19JbXBsIHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlX19Hcm91cF8wXzFfXzEgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlX19Hcm91cF8wXzFfXzAoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTAxMzM6MTogKCBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZV9fR3JvdXBfMF8xX18wX19JbXBsIHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlX19Hcm91cF8wXzFfXzEgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTAxMzQ6MjogcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVfX0dyb3VwXzBfMV9fMF9fSW1wbCBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZV9fR3JvdXBfMF8xX18xCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMTQ3MToxOiAoIHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlX19Hcm91cF8wXzFfXzBfX0ltcGwgcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVfX0dyb3VwXzBfMV9fMSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMTQ3MjoyOiBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZV9fR3JvdXBfMF8xX18wX19JbXBsIHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlX19Hcm91cF8wXzFfXzEKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzcyKTsKKyAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzgwKTsKICAgICAgICAgICAgIHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlX19Hcm91cF8wXzFfXzBfX0ltcGwoKTsKIAogICAgICAgICAgICAgc3RhdGUuX2ZzcC0tOwpAQCAtMzQzNTEsMjMgKzM4ODA4LDIzIEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVfX0dyb3VwXzBfMV9fMF9fSW1wbCIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMDE0MToxOiBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZV9fR3JvdXBfMF8xX18wX19JbXBsIDogKCAoIHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlX19FbGVtZW50c0Fzc2lnbm1lbnRfMF8xXzAgKSApIDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMTQ3OToxOiBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZV9fR3JvdXBfMF8xX18wX19JbXBsIDogKCAoIHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlX19FbGVtZW50c0Fzc2lnbm1lbnRfMF8xXzAgKSApIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZV9fR3JvdXBfMF8xX18wX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEwMTQ1OjE6ICggKCAoIHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlX19FbGVtZW50c0Fzc2lnbm1lbnRfMF8xXzAgKSApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEwMTQ2OjE6ICggKCBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZV9fRWxlbWVudHNBc3NpZ25tZW50XzBfMV8wICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTE0ODM6MTogKCAoICggcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVfX0VsZW1lbnRzQXNzaWdubWVudF8wXzFfMCApICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTE0ODQ6MTogKCAoIHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlX19FbGVtZW50c0Fzc2lnbm1lbnRfMF8xXzAgKSApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMDE0NjoxOiAoICggcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVfX0VsZW1lbnRzQXNzaWdubWVudF8wXzFfMCApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEwMTQ3OjI6ICggcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVfX0VsZW1lbnRzQXNzaWdubWVudF8wXzFfMCApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMTQ4NDoxOiAoICggcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVfX0VsZW1lbnRzQXNzaWdubWVudF8wXzFfMCApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjExNDg1OjI6ICggcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVfX0VsZW1lbnRzQXNzaWdubWVudF8wXzFfMCApCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhBbm5vdGF0aW9uRWxlbWVudFZhbHVlQWNjZXNzKCkuZ2V0RWxlbWVudHNBc3NpZ25tZW50XzBfMV8wKCkpOyAKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEwMTQ4OjI6ICggcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVfX0VsZW1lbnRzQXNzaWdubWVudF8wXzFfMCApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMDE0ODozOiBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZV9fRWxlbWVudHNBc3NpZ25tZW50XzBfMV8wCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMTQ4NjoyOiAoIHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlX19FbGVtZW50c0Fzc2lnbm1lbnRfMF8xXzAgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTE0ODY6MzogcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVfX0VsZW1lbnRzQXNzaWdubWVudF8wXzFfMAogICAgICAgICAgICAgewogICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMik7CiAgICAgICAgICAgICBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZV9fRWxlbWVudHNBc3NpZ25tZW50XzBfMV8wKCk7CkBAIC0zNDQwMiwxNCArMzg4NTksMTQgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZV9fR3JvdXBfMF8xX18xIgotICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEwMTU2OjE6IHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlX19Hcm91cF8wXzFfXzEgOiBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZV9fR3JvdXBfMF8xX18xX19JbXBsIDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMTQ5NDoxOiBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZV9fR3JvdXBfMF8xX18xIDogcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVfX0dyb3VwXzBfMV9fMV9fSW1wbCA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVfX0dyb3VwXzBfMV9fMSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMDE2MDoxOiAoIHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlX19Hcm91cF8wXzFfXzFfX0ltcGwgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTAxNjE6MjogcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVfX0dyb3VwXzBfMV9fMV9fSW1wbAorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTE0OTg6MTogKCBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZV9fR3JvdXBfMF8xX18xX19JbXBsICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjExNDk5OjI6IHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlX19Hcm91cF8wXzFfXzFfX0ltcGwKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzIpOwogICAgICAgICAgICAgcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVfX0dyb3VwXzBfMV9fMV9fSW1wbCgpOwpAQCAtMzQ0MzUsMzcgKzM4ODkyLDM3IEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVfX0dyb3VwXzBfMV9fMV9fSW1wbCIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMDE2NzoxOiBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZV9fR3JvdXBfMF8xX18xX19JbXBsIDogKCAoIHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlX19Hcm91cF8wXzFfMV9fMCApKiApIDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMTUwNToxOiBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZV9fR3JvdXBfMF8xX18xX19JbXBsIDogKCAoIHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlX19Hcm91cF8wXzFfMV9fMCApKiApIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZV9fR3JvdXBfMF8xX18xX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEwMTcxOjE6ICggKCAoIHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlX19Hcm91cF8wXzFfMV9fMCApKiApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEwMTcyOjE6ICggKCBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZV9fR3JvdXBfMF8xXzFfXzAgKSogKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTE1MDk6MTogKCAoICggcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVfX0dyb3VwXzBfMV8xX18wICkqICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTE1MTA6MTogKCAoIHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlX19Hcm91cF8wXzFfMV9fMCApKiApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMDE3MjoxOiAoICggcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVfX0dyb3VwXzBfMV8xX18wICkqICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEwMTczOjI6ICggcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVfX0dyb3VwXzBfMV8xX18wICkqCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMTUxMDoxOiAoICggcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVfX0dyb3VwXzBfMV8xX18wICkqICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjExNTExOjI6ICggcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVfX0dyb3VwXzBfMV8xX18wICkqCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhBbm5vdGF0aW9uRWxlbWVudFZhbHVlQWNjZXNzKCkuZ2V0R3JvdXBfMF8xXzEoKSk7IAogICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTAxNzQ6MjogKCBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZV9fR3JvdXBfMF8xXzFfXzAgKSoKLSAgICAgICAgICAgIGxvb3A5NDoKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjExNTEyOjI6ICggcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVfX0dyb3VwXzBfMV8xX18wICkqCisgICAgICAgICAgICBsb29wMTA3OgogICAgICAgICAgICAgZG8gewotICAgICAgICAgICAgICAgIGludCBhbHQ5ND0yOwotICAgICAgICAgICAgICAgIGludCBMQTk0XzAgPSBpbnB1dC5MQSgxKTsKKyAgICAgICAgICAgICAgICBpbnQgYWx0MTA3PTI7CisgICAgICAgICAgICAgICAgaW50IExBMTA3XzAgPSBpbnB1dC5MQSgxKTsKIAotICAgICAgICAgICAgICAgIGlmICggKExBOTRfMD09MTE1KSApIHsKLSAgICAgICAgICAgICAgICAgICAgYWx0OTQ9MTsKKyAgICAgICAgICAgICAgICBpZiAoIChMQTEwN18wPT0xMjUpICkgeworICAgICAgICAgICAgICAgICAgICBhbHQxMDc9MTsKICAgICAgICAgICAgICAgICB9CiAKIAotICAgICAgICAgICAgICAgIHN3aXRjaCAoYWx0OTQpIHsKKyAgICAgICAgICAgICAgICBzd2l0Y2ggKGFsdDEwNykgewogICAgICAgICAgICAgCWNhc2UgMSA6Ci0gICAgICAgICAgICAJICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEwMTc0OjM6IHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlX19Hcm91cF8wXzFfMV9fMAorICAgICAgICAgICAgCSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMTUxMjozOiBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZV9fR3JvdXBfMF8xXzFfXzAKICAgICAgICAgICAgIAkgICAgewotICAgICAgICAgICAgCSAgICBwdXNoRm9sbG93KEZPTExPV183Myk7CisgICAgICAgICAgICAJICAgIHB1c2hGb2xsb3coRk9MTE9XXzgxKTsKICAgICAgICAgICAgIAkgICAgcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVfX0dyb3VwXzBfMV8xX18wKCk7CiAKICAgICAgICAgICAgIAkgICAgc3RhdGUuX2ZzcC0tOwpAQCAtMzQ0NzUsNyArMzg5MzIsNyBAQAogICAgICAgICAgICAgCSAgICBicmVhazsKIAogICAgICAgICAgICAgCWRlZmF1bHQgOgotICAgICAgICAgICAgCSAgICBicmVhayBsb29wOTQ7CisgICAgICAgICAgICAJICAgIGJyZWFrIGxvb3AxMDc7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfSB3aGlsZSAodHJ1ZSk7CiAKQEAgLTM0NTA0LDE2ICszODk2MSwxNiBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlX19Hcm91cF8wXzFfMV9fMCIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMDE4MzoxOiBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZV9fR3JvdXBfMF8xXzFfXzAgOiBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZV9fR3JvdXBfMF8xXzFfXzBfX0ltcGwgcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVfX0dyb3VwXzBfMV8xX18xIDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMTUyMToxOiBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZV9fR3JvdXBfMF8xXzFfXzAgOiBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZV9fR3JvdXBfMF8xXzFfXzBfX0ltcGwgcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVfX0dyb3VwXzBfMV8xX18xIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZV9fR3JvdXBfMF8xXzFfXzAoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTAxODc6MTogKCBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZV9fR3JvdXBfMF8xXzFfXzBfX0ltcGwgcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVfX0dyb3VwXzBfMV8xX18xICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEwMTg4OjI6IHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlX19Hcm91cF8wXzFfMV9fMF9fSW1wbCBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZV9fR3JvdXBfMF8xXzFfXzEKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjExNTI1OjE6ICggcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVfX0dyb3VwXzBfMV8xX18wX19JbXBsIHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlX19Hcm91cF8wXzFfMV9fMSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMTUyNjoyOiBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZV9fR3JvdXBfMF8xXzFfXzBfX0ltcGwgcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVfX0dyb3VwXzBfMV8xX18xCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV183NCk7CisgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV184Mik7CiAgICAgICAgICAgICBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZV9fR3JvdXBfMF8xXzFfXzBfX0ltcGwoKTsKIAogICAgICAgICAgICAgc3RhdGUuX2ZzcC0tOwpAQCAtMzQ1NDIsMjIgKzM4OTk5LDIyIEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVfX0dyb3VwXzBfMV8xX18wX19JbXBsIgotICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEwMTk1OjE6IHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlX19Hcm91cF8wXzFfMV9fMF9fSW1wbCA6ICggJywnICkgOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjExNTMzOjE6IHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlX19Hcm91cF8wXzFfMV9fMF9fSW1wbCA6ICggJywnICkgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlX19Hcm91cF8wXzFfMV9fMF9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMDE5OToxOiAoICggJywnICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTAyMDA6MTogKCAnLCcgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTE1Mzc6MTogKCAoICcsJyApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjExNTM4OjE6ICggJywnICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEwMjAwOjE6ICggJywnICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEwMjAxOjI6ICcsJworICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTE1Mzg6MTogKCAnLCcgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTE1Mzk6MjogJywnCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhBbm5vdGF0aW9uRWxlbWVudFZhbHVlQWNjZXNzKCkuZ2V0Q29tbWFLZXl3b3JkXzBfMV8xXzAoKSk7IAogICAgICAgICAgICAgfQotICAgICAgICAgICAgbWF0Y2goaW5wdXQsMTE1LEZPTExPV18yKTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKKyAgICAgICAgICAgIG1hdGNoKGlucHV0LDEyNSxGT0xMT1dfMik7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0WEFubm90YXRpb25FbGVtZW50VmFsdWVBY2Nlc3MoKS5nZXRDb21tYUtleXdvcmRfMF8xXzFfMCgpKTsgCiAgICAgICAgICAgICB9CkBAIC0zNDU4MywxNCArMzkwNDAsMTQgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZV9fR3JvdXBfMF8xXzFfXzEiCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTAyMTA6MTogcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVfX0dyb3VwXzBfMV8xX18xIDogcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVfX0dyb3VwXzBfMV8xX18xX19JbXBsIDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMTU0ODoxOiBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZV9fR3JvdXBfMF8xXzFfXzEgOiBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZV9fR3JvdXBfMF8xXzFfXzFfX0ltcGwgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlX19Hcm91cF8wXzFfMV9fMSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMDIxNDoxOiAoIHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlX19Hcm91cF8wXzFfMV9fMV9fSW1wbCApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMDIxNToyOiBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZV9fR3JvdXBfMF8xXzFfXzFfX0ltcGwKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjExNTUyOjE6ICggcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVfX0dyb3VwXzBfMV8xX18xX19JbXBsICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjExNTUzOjI6IHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlX19Hcm91cF8wXzFfMV9fMV9fSW1wbAogICAgICAgICAgICAgewogICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMik7CiAgICAgICAgICAgICBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZV9fR3JvdXBfMF8xXzFfXzFfX0ltcGwoKTsKQEAgLTM0NjE2LDIzICszOTA3MywyMyBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlX19Hcm91cF8wXzFfMV9fMV9fSW1wbCIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMDIyMToxOiBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZV9fR3JvdXBfMF8xXzFfXzFfX0ltcGwgOiAoICggcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVfX0VsZW1lbnRzQXNzaWdubWVudF8wXzFfMV8xICkgKSA7CisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTE1NTk6MTogcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVfX0dyb3VwXzBfMV8xX18xX19JbXBsIDogKCAoIHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlX19FbGVtZW50c0Fzc2lnbm1lbnRfMF8xXzFfMSApICkgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlX19Hcm91cF8wXzFfMV9fMV9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMDIyNToxOiAoICggKCBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZV9fRWxlbWVudHNBc3NpZ25tZW50XzBfMV8xXzEgKSApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEwMjI2OjE6ICggKCBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZV9fRWxlbWVudHNBc3NpZ25tZW50XzBfMV8xXzEgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMTU2MzoxOiAoICggKCBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZV9fRWxlbWVudHNBc3NpZ25tZW50XzBfMV8xXzEgKSApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjExNTY0OjE6ICggKCBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZV9fRWxlbWVudHNBc3NpZ25tZW50XzBfMV8xXzEgKSApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMDIyNjoxOiAoICggcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVfX0VsZW1lbnRzQXNzaWdubWVudF8wXzFfMV8xICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTAyMjc6MjogKCBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZV9fRWxlbWVudHNBc3NpZ25tZW50XzBfMV8xXzEgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTE1NjQ6MTogKCAoIHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlX19FbGVtZW50c0Fzc2lnbm1lbnRfMF8xXzFfMSApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjExNTY1OjI6ICggcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVfX0VsZW1lbnRzQXNzaWdubWVudF8wXzFfMV8xICkKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WEFubm90YXRpb25FbGVtZW50VmFsdWVBY2Nlc3MoKS5nZXRFbGVtZW50c0Fzc2lnbm1lbnRfMF8xXzFfMSgpKTsgCiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMDIyODoyOiAoIHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlX19FbGVtZW50c0Fzc2lnbm1lbnRfMF8xXzFfMSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMDIyODozOiBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZV9fRWxlbWVudHNBc3NpZ25tZW50XzBfMV8xXzEKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjExNTY2OjI6ICggcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVfX0VsZW1lbnRzQXNzaWdubWVudF8wXzFfMV8xICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjExNTY2OjM6IHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlX19FbGVtZW50c0Fzc2lnbm1lbnRfMF8xXzFfMQogICAgICAgICAgICAgewogICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMik7CiAgICAgICAgICAgICBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZV9fRWxlbWVudHNBc3NpZ25tZW50XzBfMV8xXzEoKTsKQEAgLTM0NjY3LDE2ICszOTEyNCwxNiBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX1hBc3NpZ25tZW50X19Hcm91cF8wX18wIgotICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEwMjM3OjE6IHJ1bGVfX1hBc3NpZ25tZW50X19Hcm91cF8wX18wIDogcnVsZV9fWEFzc2lnbm1lbnRfX0dyb3VwXzBfXzBfX0ltcGwgcnVsZV9fWEFzc2lnbm1lbnRfX0dyb3VwXzBfXzEgOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjExNTc1OjE6IHJ1bGVfX1hBc3NpZ25tZW50X19Hcm91cF8wX18wIDogcnVsZV9fWEFzc2lnbm1lbnRfX0dyb3VwXzBfXzBfX0ltcGwgcnVsZV9fWEFzc2lnbm1lbnRfX0dyb3VwXzBfXzEgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1hBc3NpZ25tZW50X19Hcm91cF8wX18wKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEwMjQxOjE6ICggcnVsZV9fWEFzc2lnbm1lbnRfX0dyb3VwXzBfXzBfX0ltcGwgcnVsZV9fWEFzc2lnbm1lbnRfX0dyb3VwXzBfXzEgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTAyNDI6MjogcnVsZV9fWEFzc2lnbm1lbnRfX0dyb3VwXzBfXzBfX0ltcGwgcnVsZV9fWEFzc2lnbm1lbnRfX0dyb3VwXzBfXzEKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjExNTc5OjE6ICggcnVsZV9fWEFzc2lnbm1lbnRfX0dyb3VwXzBfXzBfX0ltcGwgcnVsZV9fWEFzc2lnbm1lbnRfX0dyb3VwXzBfXzEgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTE1ODA6MjogcnVsZV9fWEFzc2lnbm1lbnRfX0dyb3VwXzBfXzBfX0ltcGwgcnVsZV9fWEFzc2lnbm1lbnRfX0dyb3VwXzBfXzEKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzc5KTsKKyAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzg3KTsKICAgICAgICAgICAgIHJ1bGVfX1hBc3NpZ25tZW50X19Hcm91cF8wX18wX19JbXBsKCk7CiAKICAgICAgICAgICAgIHN0YXRlLl9mc3AtLTsKQEAgLTM0NzA1LDIzICszOTE2MiwyMyBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX1hBc3NpZ25tZW50X19Hcm91cF8wX18wX19JbXBsIgotICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEwMjQ5OjE6IHJ1bGVfX1hBc3NpZ25tZW50X19Hcm91cF8wX18wX19JbXBsIDogKCAoKSApIDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMTU4NzoxOiBydWxlX19YQXNzaWdubWVudF9fR3JvdXBfMF9fMF9fSW1wbCA6ICggKCkgKSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fWEFzc2lnbm1lbnRfX0dyb3VwXzBfXzBfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTAyNTM6MTogKCAoICgpICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTAyNTQ6MTogKCAoKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMTU5MToxOiAoICggKCkgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMTU5MjoxOiAoICgpICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEwMjU0OjE6ICggKCkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTAyNTU6MjogKCkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjExNTkyOjE6ICggKCkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTE1OTM6MjogKCkKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WEFzc2lnbm1lbnRBY2Nlc3MoKS5nZXRYQXNzaWdubWVudEFjdGlvbl8wXzAoKSk7IAogICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTAyNTY6MjogKCkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEwMjU2OjM6IAorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTE1OTQ6MjogKCkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjExNTk0OjM6IAogICAgICAgICAgICAgewogICAgICAgICAgICAgfQogCkBAIC0zNDc0NiwxNiArMzkyMDMsMTYgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YQXNzaWdubWVudF9fR3JvdXBfMF9fMSIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMDI2NDoxOiBydWxlX19YQXNzaWdubWVudF9fR3JvdXBfMF9fMSA6IHJ1bGVfX1hBc3NpZ25tZW50X19Hcm91cF8wX18xX19JbXBsIHJ1bGVfX1hBc3NpZ25tZW50X19Hcm91cF8wX18yIDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMTYwMjoxOiBydWxlX19YQXNzaWdubWVudF9fR3JvdXBfMF9fMSA6IHJ1bGVfX1hBc3NpZ25tZW50X19Hcm91cF8wX18xX19JbXBsIHJ1bGVfX1hBc3NpZ25tZW50X19Hcm91cF8wX18yIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YQXNzaWdubWVudF9fR3JvdXBfMF9fMSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMDI2ODoxOiAoIHJ1bGVfX1hBc3NpZ25tZW50X19Hcm91cF8wX18xX19JbXBsIHJ1bGVfX1hBc3NpZ25tZW50X19Hcm91cF8wX18yICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEwMjY5OjI6IHJ1bGVfX1hBc3NpZ25tZW50X19Hcm91cF8wX18xX19JbXBsIHJ1bGVfX1hBc3NpZ25tZW50X19Hcm91cF8wX18yCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMTYwNjoxOiAoIHJ1bGVfX1hBc3NpZ25tZW50X19Hcm91cF8wX18xX19JbXBsIHJ1bGVfX1hBc3NpZ25tZW50X19Hcm91cF8wX18yICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjExNjA3OjI6IHJ1bGVfX1hBc3NpZ25tZW50X19Hcm91cF8wX18xX19JbXBsIHJ1bGVfX1hBc3NpZ25tZW50X19Hcm91cF8wX18yCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV183NSk7CisgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV184Myk7CiAgICAgICAgICAgICBydWxlX19YQXNzaWdubWVudF9fR3JvdXBfMF9fMV9fSW1wbCgpOwogCiAgICAgICAgICAgICBzdGF0ZS5fZnNwLS07CkBAIC0zNDc4NCwyMyArMzkyNDEsMjMgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YQXNzaWdubWVudF9fR3JvdXBfMF9fMV9fSW1wbCIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMDI3NjoxOiBydWxlX19YQXNzaWdubWVudF9fR3JvdXBfMF9fMV9fSW1wbCA6ICggKCBydWxlX19YQXNzaWdubWVudF9fRmVhdHVyZUFzc2lnbm1lbnRfMF8xICkgKSA7CisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTE2MTQ6MTogcnVsZV9fWEFzc2lnbm1lbnRfX0dyb3VwXzBfXzFfX0ltcGwgOiAoICggcnVsZV9fWEFzc2lnbm1lbnRfX0ZlYXR1cmVBc3NpZ25tZW50XzBfMSApICkgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1hBc3NpZ25tZW50X19Hcm91cF8wX18xX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEwMjgwOjE6ICggKCAoIHJ1bGVfX1hBc3NpZ25tZW50X19GZWF0dXJlQXNzaWdubWVudF8wXzEgKSApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEwMjgxOjE6ICggKCBydWxlX19YQXNzaWdubWVudF9fRmVhdHVyZUFzc2lnbm1lbnRfMF8xICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTE2MTg6MTogKCAoICggcnVsZV9fWEFzc2lnbm1lbnRfX0ZlYXR1cmVBc3NpZ25tZW50XzBfMSApICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTE2MTk6MTogKCAoIHJ1bGVfX1hBc3NpZ25tZW50X19GZWF0dXJlQXNzaWdubWVudF8wXzEgKSApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMDI4MToxOiAoICggcnVsZV9fWEFzc2lnbm1lbnRfX0ZlYXR1cmVBc3NpZ25tZW50XzBfMSApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEwMjgyOjI6ICggcnVsZV9fWEFzc2lnbm1lbnRfX0ZlYXR1cmVBc3NpZ25tZW50XzBfMSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMTYxOToxOiAoICggcnVsZV9fWEFzc2lnbm1lbnRfX0ZlYXR1cmVBc3NpZ25tZW50XzBfMSApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjExNjIwOjI6ICggcnVsZV9fWEFzc2lnbm1lbnRfX0ZlYXR1cmVBc3NpZ25tZW50XzBfMSApCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhBc3NpZ25tZW50QWNjZXNzKCkuZ2V0RmVhdHVyZUFzc2lnbm1lbnRfMF8xKCkpOyAKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEwMjgzOjI6ICggcnVsZV9fWEFzc2lnbm1lbnRfX0ZlYXR1cmVBc3NpZ25tZW50XzBfMSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMDI4MzozOiBydWxlX19YQXNzaWdubWVudF9fRmVhdHVyZUFzc2lnbm1lbnRfMF8xCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMTYyMToyOiAoIHJ1bGVfX1hBc3NpZ25tZW50X19GZWF0dXJlQXNzaWdubWVudF8wXzEgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTE2MjE6MzogcnVsZV9fWEFzc2lnbm1lbnRfX0ZlYXR1cmVBc3NpZ25tZW50XzBfMQogICAgICAgICAgICAgewogICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMik7CiAgICAgICAgICAgICBydWxlX19YQXNzaWdubWVudF9fRmVhdHVyZUFzc2lnbm1lbnRfMF8xKCk7CkBAIC0zNDgzNSwxNiArMzkyOTIsMTYgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YQXNzaWdubWVudF9fR3JvdXBfMF9fMiIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMDI5MToxOiBydWxlX19YQXNzaWdubWVudF9fR3JvdXBfMF9fMiA6IHJ1bGVfX1hBc3NpZ25tZW50X19Hcm91cF8wX18yX19JbXBsIHJ1bGVfX1hBc3NpZ25tZW50X19Hcm91cF8wX18zIDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMTYyOToxOiBydWxlX19YQXNzaWdubWVudF9fR3JvdXBfMF9fMiA6IHJ1bGVfX1hBc3NpZ25tZW50X19Hcm91cF8wX18yX19JbXBsIHJ1bGVfX1hBc3NpZ25tZW50X19Hcm91cF8wX18zIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YQXNzaWdubWVudF9fR3JvdXBfMF9fMigpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMDI5NToxOiAoIHJ1bGVfX1hBc3NpZ25tZW50X19Hcm91cF8wX18yX19JbXBsIHJ1bGVfX1hBc3NpZ25tZW50X19Hcm91cF8wX18zICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEwMjk2OjI6IHJ1bGVfX1hBc3NpZ25tZW50X19Hcm91cF8wX18yX19JbXBsIHJ1bGVfX1hBc3NpZ25tZW50X19Hcm91cF8wX18zCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMTYzMzoxOiAoIHJ1bGVfX1hBc3NpZ25tZW50X19Hcm91cF8wX18yX19JbXBsIHJ1bGVfX1hBc3NpZ25tZW50X19Hcm91cF8wX18zICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjExNjM0OjI6IHJ1bGVfX1hBc3NpZ25tZW50X19Hcm91cF8wX18yX19JbXBsIHJ1bGVfX1hBc3NpZ25tZW50X19Hcm91cF8wX18zCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV183NCk7CisgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV184Mik7CiAgICAgICAgICAgICBydWxlX19YQXNzaWdubWVudF9fR3JvdXBfMF9fMl9fSW1wbCgpOwogCiAgICAgICAgICAgICBzdGF0ZS5fZnNwLS07CkBAIC0zNDg3MywxNyArMzkzMzAsMTcgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YQXNzaWdubWVudF9fR3JvdXBfMF9fMl9fSW1wbCIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMDMwMzoxOiBydWxlX19YQXNzaWdubWVudF9fR3JvdXBfMF9fMl9fSW1wbCA6ICggcnVsZU9wU2luZ2xlQXNzaWduICkgOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjExNjQxOjE6IHJ1bGVfX1hBc3NpZ25tZW50X19Hcm91cF8wX18yX19JbXBsIDogKCBydWxlT3BTaW5nbGVBc3NpZ24gKSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fWEFzc2lnbm1lbnRfX0dyb3VwXzBfXzJfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTAzMDc6MTogKCAoIHJ1bGVPcFNpbmdsZUFzc2lnbiApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEwMzA4OjE6ICggcnVsZU9wU2luZ2xlQXNzaWduICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjExNjQ1OjE6ICggKCBydWxlT3BTaW5nbGVBc3NpZ24gKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMTY0NjoxOiAoIHJ1bGVPcFNpbmdsZUFzc2lnbiApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMDMwODoxOiAoIHJ1bGVPcFNpbmdsZUFzc2lnbiApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMDMwOToyOiBydWxlT3BTaW5nbGVBc3NpZ24KKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjExNjQ2OjE6ICggcnVsZU9wU2luZ2xlQXNzaWduICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjExNjQ3OjI6IHJ1bGVPcFNpbmdsZUFzc2lnbgogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYQXNzaWdubWVudEFjY2VzcygpLmdldE9wU2luZ2xlQXNzaWduUGFyc2VyUnVsZUNhbGxfMF8yKCkpOyAKQEAgLTM0OTE4LDE0ICszOTM3NSwxNCBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX1hBc3NpZ25tZW50X19Hcm91cF8wX18zIgotICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEwMzE4OjE6IHJ1bGVfX1hBc3NpZ25tZW50X19Hcm91cF8wX18zIDogcnVsZV9fWEFzc2lnbm1lbnRfX0dyb3VwXzBfXzNfX0ltcGwgOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjExNjU2OjE6IHJ1bGVfX1hBc3NpZ25tZW50X19Hcm91cF8wX18zIDogcnVsZV9fWEFzc2lnbm1lbnRfX0dyb3VwXzBfXzNfX0ltcGwgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1hBc3NpZ25tZW50X19Hcm91cF8wX18zKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEwMzIyOjE6ICggcnVsZV9fWEFzc2lnbm1lbnRfX0dyb3VwXzBfXzNfX0ltcGwgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTAzMjM6MjogcnVsZV9fWEFzc2lnbm1lbnRfX0dyb3VwXzBfXzNfX0ltcGwKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjExNjYwOjE6ICggcnVsZV9fWEFzc2lnbm1lbnRfX0dyb3VwXzBfXzNfX0ltcGwgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTE2NjE6MjogcnVsZV9fWEFzc2lnbm1lbnRfX0dyb3VwXzBfXzNfX0ltcGwKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzIpOwogICAgICAgICAgICAgcnVsZV9fWEFzc2lnbm1lbnRfX0dyb3VwXzBfXzNfX0ltcGwoKTsKQEAgLTM0OTUxLDIzICszOTQwOCwyMyBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX1hBc3NpZ25tZW50X19Hcm91cF8wX18zX19JbXBsIgotICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEwMzI5OjE6IHJ1bGVfX1hBc3NpZ25tZW50X19Hcm91cF8wX18zX19JbXBsIDogKCAoIHJ1bGVfX1hBc3NpZ25tZW50X19WYWx1ZUFzc2lnbm1lbnRfMF8zICkgKSA7CisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTE2Njc6MTogcnVsZV9fWEFzc2lnbm1lbnRfX0dyb3VwXzBfXzNfX0ltcGwgOiAoICggcnVsZV9fWEFzc2lnbm1lbnRfX1ZhbHVlQXNzaWdubWVudF8wXzMgKSApIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YQXNzaWdubWVudF9fR3JvdXBfMF9fM19fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMDMzMzoxOiAoICggKCBydWxlX19YQXNzaWdubWVudF9fVmFsdWVBc3NpZ25tZW50XzBfMyApICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTAzMzQ6MTogKCAoIHJ1bGVfX1hBc3NpZ25tZW50X19WYWx1ZUFzc2lnbm1lbnRfMF8zICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTE2NzE6MTogKCAoICggcnVsZV9fWEFzc2lnbm1lbnRfX1ZhbHVlQXNzaWdubWVudF8wXzMgKSApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjExNjcyOjE6ICggKCBydWxlX19YQXNzaWdubWVudF9fVmFsdWVBc3NpZ25tZW50XzBfMyApICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEwMzM0OjE6ICggKCBydWxlX19YQXNzaWdubWVudF9fVmFsdWVBc3NpZ25tZW50XzBfMyApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEwMzM1OjI6ICggcnVsZV9fWEFzc2lnbm1lbnRfX1ZhbHVlQXNzaWdubWVudF8wXzMgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTE2NzI6MTogKCAoIHJ1bGVfX1hBc3NpZ25tZW50X19WYWx1ZUFzc2lnbm1lbnRfMF8zICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTE2NzM6MjogKCBydWxlX19YQXNzaWdubWVudF9fVmFsdWVBc3NpZ25tZW50XzBfMyApCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhBc3NpZ25tZW50QWNjZXNzKCkuZ2V0VmFsdWVBc3NpZ25tZW50XzBfMygpKTsgCiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMDMzNjoyOiAoIHJ1bGVfX1hBc3NpZ25tZW50X19WYWx1ZUFzc2lnbm1lbnRfMF8zICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEwMzM2OjM6IHJ1bGVfX1hBc3NpZ25tZW50X19WYWx1ZUFzc2lnbm1lbnRfMF8zCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMTY3NDoyOiAoIHJ1bGVfX1hBc3NpZ25tZW50X19WYWx1ZUFzc2lnbm1lbnRfMF8zICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjExNjc0OjM6IHJ1bGVfX1hBc3NpZ25tZW50X19WYWx1ZUFzc2lnbm1lbnRfMF8zCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV18yKTsKICAgICAgICAgICAgIHJ1bGVfX1hBc3NpZ25tZW50X19WYWx1ZUFzc2lnbm1lbnRfMF8zKCk7CkBAIC0zNTAwMiwxNiArMzk0NTksMTYgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YQXNzaWdubWVudF9fR3JvdXBfMV9fMCIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMDM0NToxOiBydWxlX19YQXNzaWdubWVudF9fR3JvdXBfMV9fMCA6IHJ1bGVfX1hBc3NpZ25tZW50X19Hcm91cF8xX18wX19JbXBsIHJ1bGVfX1hBc3NpZ25tZW50X19Hcm91cF8xX18xIDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMTY4MzoxOiBydWxlX19YQXNzaWdubWVudF9fR3JvdXBfMV9fMCA6IHJ1bGVfX1hBc3NpZ25tZW50X19Hcm91cF8xX18wX19JbXBsIHJ1bGVfX1hBc3NpZ25tZW50X19Hcm91cF8xX18xIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YQXNzaWdubWVudF9fR3JvdXBfMV9fMCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMDM0OToxOiAoIHJ1bGVfX1hBc3NpZ25tZW50X19Hcm91cF8xX18wX19JbXBsIHJ1bGVfX1hBc3NpZ25tZW50X19Hcm91cF8xX18xICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEwMzUwOjI6IHJ1bGVfX1hBc3NpZ25tZW50X19Hcm91cF8xX18wX19JbXBsIHJ1bGVfX1hBc3NpZ25tZW50X19Hcm91cF8xX18xCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMTY4NzoxOiAoIHJ1bGVfX1hBc3NpZ25tZW50X19Hcm91cF8xX18wX19JbXBsIHJ1bGVfX1hBc3NpZ25tZW50X19Hcm91cF8xX18xICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjExNjg4OjI6IHJ1bGVfX1hBc3NpZ25tZW50X19Hcm91cF8xX18wX19JbXBsIHJ1bGVfX1hBc3NpZ25tZW50X19Hcm91cF8xX18xCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV184MCk7CisgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV184OCk7CiAgICAgICAgICAgICBydWxlX19YQXNzaWdubWVudF9fR3JvdXBfMV9fMF9fSW1wbCgpOwogCiAgICAgICAgICAgICBzdGF0ZS5fZnNwLS07CkBAIC0zNTA0MCwxNyArMzk0OTcsMTcgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YQXNzaWdubWVudF9fR3JvdXBfMV9fMF9fSW1wbCIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMDM1NzoxOiBydWxlX19YQXNzaWdubWVudF9fR3JvdXBfMV9fMF9fSW1wbCA6ICggcnVsZVhPckV4cHJlc3Npb24gKSA7CisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTE2OTU6MTogcnVsZV9fWEFzc2lnbm1lbnRfX0dyb3VwXzFfXzBfX0ltcGwgOiAoIHJ1bGVYT3JFeHByZXNzaW9uICkgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1hBc3NpZ25tZW50X19Hcm91cF8xX18wX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEwMzYxOjE6ICggKCBydWxlWE9yRXhwcmVzc2lvbiApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEwMzYyOjE6ICggcnVsZVhPckV4cHJlc3Npb24gKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTE2OTk6MTogKCAoIHJ1bGVYT3JFeHByZXNzaW9uICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTE3MDA6MTogKCBydWxlWE9yRXhwcmVzc2lvbiApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMDM2MjoxOiAoIHJ1bGVYT3JFeHByZXNzaW9uICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEwMzYzOjI6IHJ1bGVYT3JFeHByZXNzaW9uCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMTcwMDoxOiAoIHJ1bGVYT3JFeHByZXNzaW9uICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjExNzAxOjI6IHJ1bGVYT3JFeHByZXNzaW9uCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhBc3NpZ25tZW50QWNjZXNzKCkuZ2V0WE9yRXhwcmVzc2lvblBhcnNlclJ1bGVDYWxsXzFfMCgpKTsgCkBAIC0zNTA4NSwxNCArMzk1NDIsMTQgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YQXNzaWdubWVudF9fR3JvdXBfMV9fMSIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMDM3MjoxOiBydWxlX19YQXNzaWdubWVudF9fR3JvdXBfMV9fMSA6IHJ1bGVfX1hBc3NpZ25tZW50X19Hcm91cF8xX18xX19JbXBsIDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMTcxMDoxOiBydWxlX19YQXNzaWdubWVudF9fR3JvdXBfMV9fMSA6IHJ1bGVfX1hBc3NpZ25tZW50X19Hcm91cF8xX18xX19JbXBsIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YQXNzaWdubWVudF9fR3JvdXBfMV9fMSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMDM3NjoxOiAoIHJ1bGVfX1hBc3NpZ25tZW50X19Hcm91cF8xX18xX19JbXBsICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEwMzc3OjI6IHJ1bGVfX1hBc3NpZ25tZW50X19Hcm91cF8xX18xX19JbXBsCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMTcxNDoxOiAoIHJ1bGVfX1hBc3NpZ25tZW50X19Hcm91cF8xX18xX19JbXBsICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjExNzE1OjI6IHJ1bGVfX1hBc3NpZ25tZW50X19Hcm91cF8xX18xX19JbXBsCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV18yKTsKICAgICAgICAgICAgIHJ1bGVfX1hBc3NpZ25tZW50X19Hcm91cF8xX18xX19JbXBsKCk7CkBAIC0zNTExOCwyNyArMzk1NzUsMjcgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YQXNzaWdubWVudF9fR3JvdXBfMV9fMV9fSW1wbCIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMDM4MzoxOiBydWxlX19YQXNzaWdubWVudF9fR3JvdXBfMV9fMV9fSW1wbCA6ICggKCBydWxlX19YQXNzaWdubWVudF9fR3JvdXBfMV8xX18wICk/ICkgOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjExNzIxOjE6IHJ1bGVfX1hBc3NpZ25tZW50X19Hcm91cF8xX18xX19JbXBsIDogKCAoIHJ1bGVfX1hBc3NpZ25tZW50X19Hcm91cF8xXzFfXzAgKT8gKSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fWEFzc2lnbm1lbnRfX0dyb3VwXzFfXzFfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTAzODc6MTogKCAoICggcnVsZV9fWEFzc2lnbm1lbnRfX0dyb3VwXzFfMV9fMCApPyApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEwMzg4OjE6ICggKCBydWxlX19YQXNzaWdubWVudF9fR3JvdXBfMV8xX18wICk/ICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjExNzI1OjE6ICggKCAoIHJ1bGVfX1hBc3NpZ25tZW50X19Hcm91cF8xXzFfXzAgKT8gKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMTcyNjoxOiAoICggcnVsZV9fWEFzc2lnbm1lbnRfX0dyb3VwXzFfMV9fMCApPyApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMDM4ODoxOiAoICggcnVsZV9fWEFzc2lnbm1lbnRfX0dyb3VwXzFfMV9fMCApPyApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMDM4OToyOiAoIHJ1bGVfX1hBc3NpZ25tZW50X19Hcm91cF8xXzFfXzAgKT8KKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjExNzI2OjE6ICggKCBydWxlX19YQXNzaWdubWVudF9fR3JvdXBfMV8xX18wICk/ICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjExNzI3OjI6ICggcnVsZV9fWEFzc2lnbm1lbnRfX0dyb3VwXzFfMV9fMCApPwogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYQXNzaWdubWVudEFjY2VzcygpLmdldEdyb3VwXzFfMSgpKTsgCiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMDM5MDoyOiAoIHJ1bGVfX1hBc3NpZ25tZW50X19Hcm91cF8xXzFfXzAgKT8KLSAgICAgICAgICAgIGludCBhbHQ5NT0yOwotICAgICAgICAgICAgYWx0OTUgPSBkZmE5NS5wcmVkaWN0KGlucHV0KTsKLSAgICAgICAgICAgIHN3aXRjaCAoYWx0OTUpIHsKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjExNzI4OjI6ICggcnVsZV9fWEFzc2lnbm1lbnRfX0dyb3VwXzFfMV9fMCApPworICAgICAgICAgICAgaW50IGFsdDEwOD0yOworICAgICAgICAgICAgYWx0MTA4ID0gZGZhMTA4LnByZWRpY3QoaW5wdXQpOworICAgICAgICAgICAgc3dpdGNoIChhbHQxMDgpIHsKICAgICAgICAgICAgICAgICBjYXNlIDEgOgotICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMDM5MDozOiBydWxlX19YQXNzaWdubWVudF9fR3JvdXBfMV8xX18wCisgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjExNzI4OjM6IHJ1bGVfX1hBc3NpZ25tZW50X19Hcm91cF8xXzFfXzAKICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV18yKTsKICAgICAgICAgICAgICAgICAgICAgcnVsZV9fWEFzc2lnbm1lbnRfX0dyb3VwXzFfMV9fMCgpOwpAQCAtMzUxNzYsMTYgKzM5NjMzLDE2IEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fWEFzc2lnbm1lbnRfX0dyb3VwXzFfMV9fMCIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMDM5OToxOiBydWxlX19YQXNzaWdubWVudF9fR3JvdXBfMV8xX18wIDogcnVsZV9fWEFzc2lnbm1lbnRfX0dyb3VwXzFfMV9fMF9fSW1wbCBydWxlX19YQXNzaWdubWVudF9fR3JvdXBfMV8xX18xIDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMTczNzoxOiBydWxlX19YQXNzaWdubWVudF9fR3JvdXBfMV8xX18wIDogcnVsZV9fWEFzc2lnbm1lbnRfX0dyb3VwXzFfMV9fMF9fSW1wbCBydWxlX19YQXNzaWdubWVudF9fR3JvdXBfMV8xX18xIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YQXNzaWdubWVudF9fR3JvdXBfMV8xX18wKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEwNDAzOjE6ICggcnVsZV9fWEFzc2lnbm1lbnRfX0dyb3VwXzFfMV9fMF9fSW1wbCBydWxlX19YQXNzaWdubWVudF9fR3JvdXBfMV8xX18xICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEwNDA0OjI6IHJ1bGVfX1hBc3NpZ25tZW50X19Hcm91cF8xXzFfXzBfX0ltcGwgcnVsZV9fWEFzc2lnbm1lbnRfX0dyb3VwXzFfMV9fMQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTE3NDE6MTogKCBydWxlX19YQXNzaWdubWVudF9fR3JvdXBfMV8xX18wX19JbXBsIHJ1bGVfX1hBc3NpZ25tZW50X19Hcm91cF8xXzFfXzEgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTE3NDI6MjogcnVsZV9fWEFzc2lnbm1lbnRfX0dyb3VwXzFfMV9fMF9fSW1wbCBydWxlX19YQXNzaWdubWVudF9fR3JvdXBfMV8xX18xCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV183NCk7CisgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV184Mik7CiAgICAgICAgICAgICBydWxlX19YQXNzaWdubWVudF9fR3JvdXBfMV8xX18wX19JbXBsKCk7CiAKICAgICAgICAgICAgIHN0YXRlLl9mc3AtLTsKQEAgLTM1MjE0LDIzICszOTY3MSwyMyBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX1hBc3NpZ25tZW50X19Hcm91cF8xXzFfXzBfX0ltcGwiCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTA0MTE6MTogcnVsZV9fWEFzc2lnbm1lbnRfX0dyb3VwXzFfMV9fMF9fSW1wbCA6ICggKCBydWxlX19YQXNzaWdubWVudF9fR3JvdXBfMV8xXzBfXzAgKSApIDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMTc0OToxOiBydWxlX19YQXNzaWdubWVudF9fR3JvdXBfMV8xX18wX19JbXBsIDogKCAoIHJ1bGVfX1hBc3NpZ25tZW50X19Hcm91cF8xXzFfMF9fMCApICkgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1hBc3NpZ25tZW50X19Hcm91cF8xXzFfXzBfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTA0MTU6MTogKCAoICggcnVsZV9fWEFzc2lnbm1lbnRfX0dyb3VwXzFfMV8wX18wICkgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMDQxNjoxOiAoICggcnVsZV9fWEFzc2lnbm1lbnRfX0dyb3VwXzFfMV8wX18wICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTE3NTM6MTogKCAoICggcnVsZV9fWEFzc2lnbm1lbnRfX0dyb3VwXzFfMV8wX18wICkgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMTc1NDoxOiAoICggcnVsZV9fWEFzc2lnbm1lbnRfX0dyb3VwXzFfMV8wX18wICkgKQogICAgICAgICAgICAgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTA0MTY6MTogKCAoIHJ1bGVfX1hBc3NpZ25tZW50X19Hcm91cF8xXzFfMF9fMCApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEwNDE3OjI6ICggcnVsZV9fWEFzc2lnbm1lbnRfX0dyb3VwXzFfMV8wX18wICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjExNzU0OjE6ICggKCBydWxlX19YQXNzaWdubWVudF9fR3JvdXBfMV8xXzBfXzAgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMTc1NToyOiAoIHJ1bGVfX1hBc3NpZ25tZW50X19Hcm91cF8xXzFfMF9fMCApCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhBc3NpZ25tZW50QWNjZXNzKCkuZ2V0R3JvdXBfMV8xXzAoKSk7IAogICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTA0MTg6MjogKCBydWxlX19YQXNzaWdubWVudF9fR3JvdXBfMV8xXzBfXzAgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTA0MTg6MzogcnVsZV9fWEFzc2lnbm1lbnRfX0dyb3VwXzFfMV8wX18wCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMTc1NjoyOiAoIHJ1bGVfX1hBc3NpZ25tZW50X19Hcm91cF8xXzFfMF9fMCApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMTc1NjozOiBydWxlX19YQXNzaWdubWVudF9fR3JvdXBfMV8xXzBfXzAKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzIpOwogICAgICAgICAgICAgcnVsZV9fWEFzc2lnbm1lbnRfX0dyb3VwXzFfMV8wX18wKCk7CkBAIC0zNTI2NSwxNCArMzk3MjIsMTQgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YQXNzaWdubWVudF9fR3JvdXBfMV8xX18xIgotICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEwNDI2OjE6IHJ1bGVfX1hBc3NpZ25tZW50X19Hcm91cF8xXzFfXzEgOiBydWxlX19YQXNzaWdubWVudF9fR3JvdXBfMV8xX18xX19JbXBsIDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMTc2NDoxOiBydWxlX19YQXNzaWdubWVudF9fR3JvdXBfMV8xX18xIDogcnVsZV9fWEFzc2lnbm1lbnRfX0dyb3VwXzFfMV9fMV9fSW1wbCA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fWEFzc2lnbm1lbnRfX0dyb3VwXzFfMV9fMSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMDQzMDoxOiAoIHJ1bGVfX1hBc3NpZ25tZW50X19Hcm91cF8xXzFfXzFfX0ltcGwgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTA0MzE6MjogcnVsZV9fWEFzc2lnbm1lbnRfX0dyb3VwXzFfMV9fMV9fSW1wbAorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTE3Njg6MTogKCBydWxlX19YQXNzaWdubWVudF9fR3JvdXBfMV8xX18xX19JbXBsICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjExNzY5OjI6IHJ1bGVfX1hBc3NpZ25tZW50X19Hcm91cF8xXzFfXzFfX0ltcGwKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzIpOwogICAgICAgICAgICAgcnVsZV9fWEFzc2lnbm1lbnRfX0dyb3VwXzFfMV9fMV9fSW1wbCgpOwpAQCAtMzUyOTgsMjMgKzM5NzU1LDIzIEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fWEFzc2lnbm1lbnRfX0dyb3VwXzFfMV9fMV9fSW1wbCIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMDQzNzoxOiBydWxlX19YQXNzaWdubWVudF9fR3JvdXBfMV8xX18xX19JbXBsIDogKCAoIHJ1bGVfX1hBc3NpZ25tZW50X19SaWdodE9wZXJhbmRBc3NpZ25tZW50XzFfMV8xICkgKSA7CisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTE3NzU6MTogcnVsZV9fWEFzc2lnbm1lbnRfX0dyb3VwXzFfMV9fMV9fSW1wbCA6ICggKCBydWxlX19YQXNzaWdubWVudF9fUmlnaHRPcGVyYW5kQXNzaWdubWVudF8xXzFfMSApICkgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1hBc3NpZ25tZW50X19Hcm91cF8xXzFfXzFfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTA0NDE6MTogKCAoICggcnVsZV9fWEFzc2lnbm1lbnRfX1JpZ2h0T3BlcmFuZEFzc2lnbm1lbnRfMV8xXzEgKSApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEwNDQyOjE6ICggKCBydWxlX19YQXNzaWdubWVudF9fUmlnaHRPcGVyYW5kQXNzaWdubWVudF8xXzFfMSApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjExNzc5OjE6ICggKCAoIHJ1bGVfX1hBc3NpZ25tZW50X19SaWdodE9wZXJhbmRBc3NpZ25tZW50XzFfMV8xICkgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMTc4MDoxOiAoICggcnVsZV9fWEFzc2lnbm1lbnRfX1JpZ2h0T3BlcmFuZEFzc2lnbm1lbnRfMV8xXzEgKSApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMDQ0MjoxOiAoICggcnVsZV9fWEFzc2lnbm1lbnRfX1JpZ2h0T3BlcmFuZEFzc2lnbm1lbnRfMV8xXzEgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMDQ0MzoyOiAoIHJ1bGVfX1hBc3NpZ25tZW50X19SaWdodE9wZXJhbmRBc3NpZ25tZW50XzFfMV8xICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjExNzgwOjE6ICggKCBydWxlX19YQXNzaWdubWVudF9fUmlnaHRPcGVyYW5kQXNzaWdubWVudF8xXzFfMSApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjExNzgxOjI6ICggcnVsZV9fWEFzc2lnbm1lbnRfX1JpZ2h0T3BlcmFuZEFzc2lnbm1lbnRfMV8xXzEgKQogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYQXNzaWdubWVudEFjY2VzcygpLmdldFJpZ2h0T3BlcmFuZEFzc2lnbm1lbnRfMV8xXzEoKSk7IAogICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTA0NDQ6MjogKCBydWxlX19YQXNzaWdubWVudF9fUmlnaHRPcGVyYW5kQXNzaWdubWVudF8xXzFfMSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMDQ0NDozOiBydWxlX19YQXNzaWdubWVudF9fUmlnaHRPcGVyYW5kQXNzaWdubWVudF8xXzFfMQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTE3ODI6MjogKCBydWxlX19YQXNzaWdubWVudF9fUmlnaHRPcGVyYW5kQXNzaWdubWVudF8xXzFfMSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMTc4MjozOiBydWxlX19YQXNzaWdubWVudF9fUmlnaHRPcGVyYW5kQXNzaWdubWVudF8xXzFfMQogICAgICAgICAgICAgewogICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMik7CiAgICAgICAgICAgICBydWxlX19YQXNzaWdubWVudF9fUmlnaHRPcGVyYW5kQXNzaWdubWVudF8xXzFfMSgpOwpAQCAtMzUzNDksMTQgKzM5ODA2LDE0IEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fWEFzc2lnbm1lbnRfX0dyb3VwXzFfMV8wX18wIgotICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEwNDUzOjE6IHJ1bGVfX1hBc3NpZ25tZW50X19Hcm91cF8xXzFfMF9fMCA6IHJ1bGVfX1hBc3NpZ25tZW50X19Hcm91cF8xXzFfMF9fMF9fSW1wbCA7CisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTE3OTE6MTogcnVsZV9fWEFzc2lnbm1lbnRfX0dyb3VwXzFfMV8wX18wIDogcnVsZV9fWEFzc2lnbm1lbnRfX0dyb3VwXzFfMV8wX18wX19JbXBsIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YQXNzaWdubWVudF9fR3JvdXBfMV8xXzBfXzAoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTA0NTc6MTogKCBydWxlX19YQXNzaWdubWVudF9fR3JvdXBfMV8xXzBfXzBfX0ltcGwgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTA0NTg6MjogcnVsZV9fWEFzc2lnbm1lbnRfX0dyb3VwXzFfMV8wX18wX19JbXBsCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMTc5NToxOiAoIHJ1bGVfX1hBc3NpZ25tZW50X19Hcm91cF8xXzFfMF9fMF9fSW1wbCApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMTc5NjoyOiBydWxlX19YQXNzaWdubWVudF9fR3JvdXBfMV8xXzBfXzBfX0ltcGwKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzIpOwogICAgICAgICAgICAgcnVsZV9fWEFzc2lnbm1lbnRfX0dyb3VwXzFfMV8wX18wX19JbXBsKCk7CkBAIC0zNTM4MiwyMyArMzk4MzksMjMgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YQXNzaWdubWVudF9fR3JvdXBfMV8xXzBfXzBfX0ltcGwiCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTA0NjQ6MTogcnVsZV9fWEFzc2lnbm1lbnRfX0dyb3VwXzFfMV8wX18wX19JbXBsIDogKCAoIHJ1bGVfX1hBc3NpZ25tZW50X19Hcm91cF8xXzFfMF8wX18wICkgKSA7CisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTE4MDI6MTogcnVsZV9fWEFzc2lnbm1lbnRfX0dyb3VwXzFfMV8wX18wX19JbXBsIDogKCAoIHJ1bGVfX1hBc3NpZ25tZW50X19Hcm91cF8xXzFfMF8wX18wICkgKSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fWEFzc2lnbm1lbnRfX0dyb3VwXzFfMV8wX18wX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEwNDY4OjE6ICggKCAoIHJ1bGVfX1hBc3NpZ25tZW50X19Hcm91cF8xXzFfMF8wX18wICkgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMDQ2OToxOiAoICggcnVsZV9fWEFzc2lnbm1lbnRfX0dyb3VwXzFfMV8wXzBfXzAgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMTgwNjoxOiAoICggKCBydWxlX19YQXNzaWdubWVudF9fR3JvdXBfMV8xXzBfMF9fMCApICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTE4MDc6MTogKCAoIHJ1bGVfX1hBc3NpZ25tZW50X19Hcm91cF8xXzFfMF8wX18wICkgKQogICAgICAgICAgICAgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTA0Njk6MTogKCAoIHJ1bGVfX1hBc3NpZ25tZW50X19Hcm91cF8xXzFfMF8wX18wICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTA0NzA6MjogKCBydWxlX19YQXNzaWdubWVudF9fR3JvdXBfMV8xXzBfMF9fMCApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMTgwNzoxOiAoICggcnVsZV9fWEFzc2lnbm1lbnRfX0dyb3VwXzFfMV8wXzBfXzAgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMTgwODoyOiAoIHJ1bGVfX1hBc3NpZ25tZW50X19Hcm91cF8xXzFfMF8wX18wICkKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WEFzc2lnbm1lbnRBY2Nlc3MoKS5nZXRHcm91cF8xXzFfMF8wKCkpOyAKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEwNDcxOjI6ICggcnVsZV9fWEFzc2lnbm1lbnRfX0dyb3VwXzFfMV8wXzBfXzAgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTA0NzE6MzogcnVsZV9fWEFzc2lnbm1lbnRfX0dyb3VwXzFfMV8wXzBfXzAKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjExODA5OjI6ICggcnVsZV9fWEFzc2lnbm1lbnRfX0dyb3VwXzFfMV8wXzBfXzAgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTE4MDk6MzogcnVsZV9fWEFzc2lnbm1lbnRfX0dyb3VwXzFfMV8wXzBfXzAKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzIpOwogICAgICAgICAgICAgcnVsZV9fWEFzc2lnbm1lbnRfX0dyb3VwXzFfMV8wXzBfXzAoKTsKQEAgLTM1NDMzLDE2ICszOTg5MCwxNiBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX1hBc3NpZ25tZW50X19Hcm91cF8xXzFfMF8wX18wIgotICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEwNDgwOjE6IHJ1bGVfX1hBc3NpZ25tZW50X19Hcm91cF8xXzFfMF8wX18wIDogcnVsZV9fWEFzc2lnbm1lbnRfX0dyb3VwXzFfMV8wXzBfXzBfX0ltcGwgcnVsZV9fWEFzc2lnbm1lbnRfX0dyb3VwXzFfMV8wXzBfXzEgOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjExODE4OjE6IHJ1bGVfX1hBc3NpZ25tZW50X19Hcm91cF8xXzFfMF8wX18wIDogcnVsZV9fWEFzc2lnbm1lbnRfX0dyb3VwXzFfMV8wXzBfXzBfX0ltcGwgcnVsZV9fWEFzc2lnbm1lbnRfX0dyb3VwXzFfMV8wXzBfXzEgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1hBc3NpZ25tZW50X19Hcm91cF8xXzFfMF8wX18wKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEwNDg0OjE6ICggcnVsZV9fWEFzc2lnbm1lbnRfX0dyb3VwXzFfMV8wXzBfXzBfX0ltcGwgcnVsZV9fWEFzc2lnbm1lbnRfX0dyb3VwXzFfMV8wXzBfXzEgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTA0ODU6MjogcnVsZV9fWEFzc2lnbm1lbnRfX0dyb3VwXzFfMV8wXzBfXzBfX0ltcGwgcnVsZV9fWEFzc2lnbm1lbnRfX0dyb3VwXzFfMV8wXzBfXzEKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjExODIyOjE6ICggcnVsZV9fWEFzc2lnbm1lbnRfX0dyb3VwXzFfMV8wXzBfXzBfX0ltcGwgcnVsZV9fWEFzc2lnbm1lbnRfX0dyb3VwXzFfMV8wXzBfXzEgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTE4MjM6MjogcnVsZV9fWEFzc2lnbm1lbnRfX0dyb3VwXzFfMV8wXzBfXzBfX0ltcGwgcnVsZV9fWEFzc2lnbm1lbnRfX0dyb3VwXzFfMV8wXzBfXzEKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzgwKTsKKyAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzg4KTsKICAgICAgICAgICAgIHJ1bGVfX1hBc3NpZ25tZW50X19Hcm91cF8xXzFfMF8wX18wX19JbXBsKCk7CiAKICAgICAgICAgICAgIHN0YXRlLl9mc3AtLTsKQEAgLTM1NDcxLDIzICszOTkyOCwyMyBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX1hBc3NpZ25tZW50X19Hcm91cF8xXzFfMF8wX18wX19JbXBsIgotICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEwNDkyOjE6IHJ1bGVfX1hBc3NpZ25tZW50X19Hcm91cF8xXzFfMF8wX18wX19JbXBsIDogKCAoKSApIDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMTgzMDoxOiBydWxlX19YQXNzaWdubWVudF9fR3JvdXBfMV8xXzBfMF9fMF9fSW1wbCA6ICggKCkgKSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fWEFzc2lnbm1lbnRfX0dyb3VwXzFfMV8wXzBfXzBfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTA0OTY6MTogKCAoICgpICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTA0OTc6MTogKCAoKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMTgzNDoxOiAoICggKCkgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMTgzNToxOiAoICgpICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEwNDk3OjE6ICggKCkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTA0OTg6MjogKCkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjExODM1OjE6ICggKCkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTE4MzY6MjogKCkKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WEFzc2lnbm1lbnRBY2Nlc3MoKS5nZXRYQmluYXJ5T3BlcmF0aW9uTGVmdE9wZXJhbmRBY3Rpb25fMV8xXzBfMF8wKCkpOyAKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEwNDk5OjI6ICgpCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMDQ5OTozOiAKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjExODM3OjI6ICgpCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMTgzNzozOiAKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIH0KIApAQCAtMzU1MTIsMTQgKzM5OTY5LDE0IEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fWEFzc2lnbm1lbnRfX0dyb3VwXzFfMV8wXzBfXzEiCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTA1MDc6MTogcnVsZV9fWEFzc2lnbm1lbnRfX0dyb3VwXzFfMV8wXzBfXzEgOiBydWxlX19YQXNzaWdubWVudF9fR3JvdXBfMV8xXzBfMF9fMV9fSW1wbCA7CisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTE4NDU6MTogcnVsZV9fWEFzc2lnbm1lbnRfX0dyb3VwXzFfMV8wXzBfXzEgOiBydWxlX19YQXNzaWdubWVudF9fR3JvdXBfMV8xXzBfMF9fMV9fSW1wbCA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fWEFzc2lnbm1lbnRfX0dyb3VwXzFfMV8wXzBfXzEoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTA1MTE6MTogKCBydWxlX19YQXNzaWdubWVudF9fR3JvdXBfMV8xXzBfMF9fMV9fSW1wbCApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMDUxMjoyOiBydWxlX19YQXNzaWdubWVudF9fR3JvdXBfMV8xXzBfMF9fMV9fSW1wbAorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTE4NDk6MTogKCBydWxlX19YQXNzaWdubWVudF9fR3JvdXBfMV8xXzBfMF9fMV9fSW1wbCApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMTg1MDoyOiBydWxlX19YQXNzaWdubWVudF9fR3JvdXBfMV8xXzBfMF9fMV9fSW1wbAogICAgICAgICAgICAgewogICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMik7CiAgICAgICAgICAgICBydWxlX19YQXNzaWdubWVudF9fR3JvdXBfMV8xXzBfMF9fMV9fSW1wbCgpOwpAQCAtMzU1NDUsMjMgKzQwMDAyLDIzIEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fWEFzc2lnbm1lbnRfX0dyb3VwXzFfMV8wXzBfXzFfX0ltcGwiCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTA1MTg6MTogcnVsZV9fWEFzc2lnbm1lbnRfX0dyb3VwXzFfMV8wXzBfXzFfX0ltcGwgOiAoICggcnVsZV9fWEFzc2lnbm1lbnRfX0ZlYXR1cmVBc3NpZ25tZW50XzFfMV8wXzBfMSApICkgOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjExODU2OjE6IHJ1bGVfX1hBc3NpZ25tZW50X19Hcm91cF8xXzFfMF8wX18xX19JbXBsIDogKCAoIHJ1bGVfX1hBc3NpZ25tZW50X19GZWF0dXJlQXNzaWdubWVudF8xXzFfMF8wXzEgKSApIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YQXNzaWdubWVudF9fR3JvdXBfMV8xXzBfMF9fMV9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMDUyMjoxOiAoICggKCBydWxlX19YQXNzaWdubWVudF9fRmVhdHVyZUFzc2lnbm1lbnRfMV8xXzBfMF8xICkgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMDUyMzoxOiAoICggcnVsZV9fWEFzc2lnbm1lbnRfX0ZlYXR1cmVBc3NpZ25tZW50XzFfMV8wXzBfMSApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjExODYwOjE6ICggKCAoIHJ1bGVfX1hBc3NpZ25tZW50X19GZWF0dXJlQXNzaWdubWVudF8xXzFfMF8wXzEgKSApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjExODYxOjE6ICggKCBydWxlX19YQXNzaWdubWVudF9fRmVhdHVyZUFzc2lnbm1lbnRfMV8xXzBfMF8xICkgKQogICAgICAgICAgICAgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTA1MjM6MTogKCAoIHJ1bGVfX1hBc3NpZ25tZW50X19GZWF0dXJlQXNzaWdubWVudF8xXzFfMF8wXzEgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMDUyNDoyOiAoIHJ1bGVfX1hBc3NpZ25tZW50X19GZWF0dXJlQXNzaWdubWVudF8xXzFfMF8wXzEgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTE4NjE6MTogKCAoIHJ1bGVfX1hBc3NpZ25tZW50X19GZWF0dXJlQXNzaWdubWVudF8xXzFfMF8wXzEgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMTg2MjoyOiAoIHJ1bGVfX1hBc3NpZ25tZW50X19GZWF0dXJlQXNzaWdubWVudF8xXzFfMF8wXzEgKQogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYQXNzaWdubWVudEFjY2VzcygpLmdldEZlYXR1cmVBc3NpZ25tZW50XzFfMV8wXzBfMSgpKTsgCiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMDUyNToyOiAoIHJ1bGVfX1hBc3NpZ25tZW50X19GZWF0dXJlQXNzaWdubWVudF8xXzFfMF8wXzEgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTA1MjU6MzogcnVsZV9fWEFzc2lnbm1lbnRfX0ZlYXR1cmVBc3NpZ25tZW50XzFfMV8wXzBfMQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTE4NjM6MjogKCBydWxlX19YQXNzaWdubWVudF9fRmVhdHVyZUFzc2lnbm1lbnRfMV8xXzBfMF8xICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjExODYzOjM6IHJ1bGVfX1hBc3NpZ25tZW50X19GZWF0dXJlQXNzaWdubWVudF8xXzFfMF8wXzEKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzIpOwogICAgICAgICAgICAgcnVsZV9fWEFzc2lnbm1lbnRfX0ZlYXR1cmVBc3NpZ25tZW50XzFfMV8wXzBfMSgpOwpAQCAtMzU1OTYsMTYgKzQwMDUzLDE2IEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fT3BNdWx0aUFzc2lnbl9fR3JvdXBfNV9fMCIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMDUzNDoxOiBydWxlX19PcE11bHRpQXNzaWduX19Hcm91cF81X18wIDogcnVsZV9fT3BNdWx0aUFzc2lnbl9fR3JvdXBfNV9fMF9fSW1wbCBydWxlX19PcE11bHRpQXNzaWduX19Hcm91cF81X18xIDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMTg3MjoxOiBydWxlX19PcE11bHRpQXNzaWduX19Hcm91cF81X18wIDogcnVsZV9fT3BNdWx0aUFzc2lnbl9fR3JvdXBfNV9fMF9fSW1wbCBydWxlX19PcE11bHRpQXNzaWduX19Hcm91cF81X18xIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19PcE11bHRpQXNzaWduX19Hcm91cF81X18wKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEwNTM4OjE6ICggcnVsZV9fT3BNdWx0aUFzc2lnbl9fR3JvdXBfNV9fMF9fSW1wbCBydWxlX19PcE11bHRpQXNzaWduX19Hcm91cF81X18xICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEwNTM5OjI6IHJ1bGVfX09wTXVsdGlBc3NpZ25fX0dyb3VwXzVfXzBfX0ltcGwgcnVsZV9fT3BNdWx0aUFzc2lnbl9fR3JvdXBfNV9fMQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTE4NzY6MTogKCBydWxlX19PcE11bHRpQXNzaWduX19Hcm91cF81X18wX19JbXBsIHJ1bGVfX09wTXVsdGlBc3NpZ25fX0dyb3VwXzVfXzEgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTE4Nzc6MjogcnVsZV9fT3BNdWx0aUFzc2lnbl9fR3JvdXBfNV9fMF9fSW1wbCBydWxlX19PcE11bHRpQXNzaWduX19Hcm91cF81X18xCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV184MSk7CisgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV184OSk7CiAgICAgICAgICAgICBydWxlX19PcE11bHRpQXNzaWduX19Hcm91cF81X18wX19JbXBsKCk7CiAKICAgICAgICAgICAgIHN0YXRlLl9mc3AtLTsKQEAgLTM1NjM0LDE3ICs0MDA5MSwxNyBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX09wTXVsdGlBc3NpZ25fX0dyb3VwXzVfXzBfX0ltcGwiCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTA1NDY6MTogcnVsZV9fT3BNdWx0aUFzc2lnbl9fR3JvdXBfNV9fMF9fSW1wbCA6ICggJzwnICkgOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjExODg0OjE6IHJ1bGVfX09wTXVsdGlBc3NpZ25fX0dyb3VwXzVfXzBfX0ltcGwgOiAoICc8JyApIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19PcE11bHRpQXNzaWduX19Hcm91cF81X18wX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEwNTUwOjE6ICggKCAnPCcgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMDU1MToxOiAoICc8JyApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMTg4ODoxOiAoICggJzwnICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTE4ODk6MTogKCAnPCcgKQogICAgICAgICAgICAgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTA1NTE6MTogKCAnPCcgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTA1NTI6MjogJzwnCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMTg4OToxOiAoICc8JyApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMTg5MDoyOiAnPCcKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0T3BNdWx0aUFzc2lnbkFjY2VzcygpLmdldExlc3NUaGFuU2lnbktleXdvcmRfNV8wKCkpOyAKQEAgLTM1Njc1LDE2ICs0MDEzMiwxNiBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX09wTXVsdGlBc3NpZ25fX0dyb3VwXzVfXzEiCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTA1NjE6MTogcnVsZV9fT3BNdWx0aUFzc2lnbl9fR3JvdXBfNV9fMSA6IHJ1bGVfX09wTXVsdGlBc3NpZ25fX0dyb3VwXzVfXzFfX0ltcGwgcnVsZV9fT3BNdWx0aUFzc2lnbl9fR3JvdXBfNV9fMiA7CisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTE4OTk6MTogcnVsZV9fT3BNdWx0aUFzc2lnbl9fR3JvdXBfNV9fMSA6IHJ1bGVfX09wTXVsdGlBc3NpZ25fX0dyb3VwXzVfXzFfX0ltcGwgcnVsZV9fT3BNdWx0aUFzc2lnbl9fR3JvdXBfNV9fMiA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fT3BNdWx0aUFzc2lnbl9fR3JvdXBfNV9fMSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMDU2NToxOiAoIHJ1bGVfX09wTXVsdGlBc3NpZ25fX0dyb3VwXzVfXzFfX0ltcGwgcnVsZV9fT3BNdWx0aUFzc2lnbl9fR3JvdXBfNV9fMiApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMDU2NjoyOiBydWxlX19PcE11bHRpQXNzaWduX19Hcm91cF81X18xX19JbXBsIHJ1bGVfX09wTXVsdGlBc3NpZ25fX0dyb3VwXzVfXzIKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjExOTAzOjE6ICggcnVsZV9fT3BNdWx0aUFzc2lnbl9fR3JvdXBfNV9fMV9fSW1wbCBydWxlX19PcE11bHRpQXNzaWduX19Hcm91cF81X18yICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjExOTA0OjI6IHJ1bGVfX09wTXVsdGlBc3NpZ25fX0dyb3VwXzVfXzFfX0ltcGwgcnVsZV9fT3BNdWx0aUFzc2lnbl9fR3JvdXBfNV9fMgogICAgICAgICAgICAgewotICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfNzUpOworICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfODMpOwogICAgICAgICAgICAgcnVsZV9fT3BNdWx0aUFzc2lnbl9fR3JvdXBfNV9fMV9fSW1wbCgpOwogCiAgICAgICAgICAgICBzdGF0ZS5fZnNwLS07CkBAIC0zNTcxMywxNyArNDAxNzAsMTcgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19PcE11bHRpQXNzaWduX19Hcm91cF81X18xX19JbXBsIgotICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEwNTczOjE6IHJ1bGVfX09wTXVsdGlBc3NpZ25fX0dyb3VwXzVfXzFfX0ltcGwgOiAoICc8JyApIDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMTkxMToxOiBydWxlX19PcE11bHRpQXNzaWduX19Hcm91cF81X18xX19JbXBsIDogKCAnPCcgKSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fT3BNdWx0aUFzc2lnbl9fR3JvdXBfNV9fMV9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMDU3NzoxOiAoICggJzwnICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTA1Nzg6MTogKCAnPCcgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTE5MTU6MTogKCAoICc8JyApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjExOTE2OjE6ICggJzwnICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEwNTc4OjE6ICggJzwnICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEwNTc5OjI6ICc8JworICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTE5MTY6MTogKCAnPCcgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTE5MTc6MjogJzwnCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldE9wTXVsdGlBc3NpZ25BY2Nlc3MoKS5nZXRMZXNzVGhhblNpZ25LZXl3b3JkXzVfMSgpKTsgCkBAIC0zNTc1NCwxNCArNDAyMTEsMTQgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19PcE11bHRpQXNzaWduX19Hcm91cF81X18yIgotICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEwNTg4OjE6IHJ1bGVfX09wTXVsdGlBc3NpZ25fX0dyb3VwXzVfXzIgOiBydWxlX19PcE11bHRpQXNzaWduX19Hcm91cF81X18yX19JbXBsIDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMTkyNjoxOiBydWxlX19PcE11bHRpQXNzaWduX19Hcm91cF81X18yIDogcnVsZV9fT3BNdWx0aUFzc2lnbl9fR3JvdXBfNV9fMl9fSW1wbCA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fT3BNdWx0aUFzc2lnbl9fR3JvdXBfNV9fMigpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMDU5MjoxOiAoIHJ1bGVfX09wTXVsdGlBc3NpZ25fX0dyb3VwXzVfXzJfX0ltcGwgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTA1OTM6MjogcnVsZV9fT3BNdWx0aUFzc2lnbl9fR3JvdXBfNV9fMl9fSW1wbAorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTE5MzA6MTogKCBydWxlX19PcE11bHRpQXNzaWduX19Hcm91cF81X18yX19JbXBsICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjExOTMxOjI6IHJ1bGVfX09wTXVsdGlBc3NpZ25fX0dyb3VwXzVfXzJfX0ltcGwKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzIpOwogICAgICAgICAgICAgcnVsZV9fT3BNdWx0aUFzc2lnbl9fR3JvdXBfNV9fMl9fSW1wbCgpOwpAQCAtMzU3ODcsMTcgKzQwMjQ0LDE3IEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fT3BNdWx0aUFzc2lnbl9fR3JvdXBfNV9fMl9fSW1wbCIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMDU5OToxOiBydWxlX19PcE11bHRpQXNzaWduX19Hcm91cF81X18yX19JbXBsIDogKCAnPScgKSA7CisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTE5Mzc6MTogcnVsZV9fT3BNdWx0aUFzc2lnbl9fR3JvdXBfNV9fMl9fSW1wbCA6ICggJz0nICkgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX09wTXVsdGlBc3NpZ25fX0dyb3VwXzVfXzJfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTA2MDM6MTogKCAoICc9JyApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEwNjA0OjE6ICggJz0nICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjExOTQxOjE6ICggKCAnPScgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMTk0MjoxOiAoICc9JyApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMDYwNDoxOiAoICc9JyApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMDYwNToyOiAnPScKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjExOTQyOjE6ICggJz0nICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjExOTQzOjI6ICc9JwogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRPcE11bHRpQXNzaWduQWNjZXNzKCkuZ2V0RXF1YWxzU2lnbktleXdvcmRfNV8yKCkpOyAKQEAgLTM1ODI4LDE2ICs0MDI4NSwxNiBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX09wTXVsdGlBc3NpZ25fX0dyb3VwXzZfXzAiCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTA2MTU6MTogcnVsZV9fT3BNdWx0aUFzc2lnbl9fR3JvdXBfNl9fMCA6IHJ1bGVfX09wTXVsdGlBc3NpZ25fX0dyb3VwXzZfXzBfX0ltcGwgcnVsZV9fT3BNdWx0aUFzc2lnbl9fR3JvdXBfNl9fMSA7CisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTE5NTM6MTogcnVsZV9fT3BNdWx0aUFzc2lnbl9fR3JvdXBfNl9fMCA6IHJ1bGVfX09wTXVsdGlBc3NpZ25fX0dyb3VwXzZfXzBfX0ltcGwgcnVsZV9fT3BNdWx0aUFzc2lnbl9fR3JvdXBfNl9fMSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fT3BNdWx0aUFzc2lnbl9fR3JvdXBfNl9fMCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMDYxOToxOiAoIHJ1bGVfX09wTXVsdGlBc3NpZ25fX0dyb3VwXzZfXzBfX0ltcGwgcnVsZV9fT3BNdWx0aUFzc2lnbl9fR3JvdXBfNl9fMSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMDYyMDoyOiBydWxlX19PcE11bHRpQXNzaWduX19Hcm91cF82X18wX19JbXBsIHJ1bGVfX09wTXVsdGlBc3NpZ25fX0dyb3VwXzZfXzEKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjExOTU3OjE6ICggcnVsZV9fT3BNdWx0aUFzc2lnbl9fR3JvdXBfNl9fMF9fSW1wbCBydWxlX19PcE11bHRpQXNzaWduX19Hcm91cF82X18xICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjExOTU4OjI6IHJ1bGVfX09wTXVsdGlBc3NpZ25fX0dyb3VwXzZfXzBfX0ltcGwgcnVsZV9fT3BNdWx0aUFzc2lnbl9fR3JvdXBfNl9fMQogICAgICAgICAgICAgewotICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfODIpOworICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfOTApOwogICAgICAgICAgICAgcnVsZV9fT3BNdWx0aUFzc2lnbl9fR3JvdXBfNl9fMF9fSW1wbCgpOwogCiAgICAgICAgICAgICBzdGF0ZS5fZnNwLS07CkBAIC0zNTg2NiwxNyArNDAzMjMsMTcgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19PcE11bHRpQXNzaWduX19Hcm91cF82X18wX19JbXBsIgotICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEwNjI3OjE6IHJ1bGVfX09wTXVsdGlBc3NpZ25fX0dyb3VwXzZfXzBfX0ltcGwgOiAoICc+JyApIDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMTk2NToxOiBydWxlX19PcE11bHRpQXNzaWduX19Hcm91cF82X18wX19JbXBsIDogKCAnPicgKSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fT3BNdWx0aUFzc2lnbl9fR3JvdXBfNl9fMF9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMDYzMToxOiAoICggJz4nICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTA2MzI6MTogKCAnPicgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTE5Njk6MTogKCAoICc+JyApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjExOTcwOjE6ICggJz4nICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEwNjMyOjE6ICggJz4nICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEwNjMzOjI6ICc+JworICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTE5NzA6MTogKCAnPicgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTE5NzE6MjogJz4nCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldE9wTXVsdGlBc3NpZ25BY2Nlc3MoKS5nZXRHcmVhdGVyVGhhblNpZ25LZXl3b3JkXzZfMCgpKTsgCkBAIC0zNTkwNywxNiArNDAzNjQsMTYgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19PcE11bHRpQXNzaWduX19Hcm91cF82X18xIgotICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEwNjQyOjE6IHJ1bGVfX09wTXVsdGlBc3NpZ25fX0dyb3VwXzZfXzEgOiBydWxlX19PcE11bHRpQXNzaWduX19Hcm91cF82X18xX19JbXBsIHJ1bGVfX09wTXVsdGlBc3NpZ25fX0dyb3VwXzZfXzIgOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjExOTgwOjE6IHJ1bGVfX09wTXVsdGlBc3NpZ25fX0dyb3VwXzZfXzEgOiBydWxlX19PcE11bHRpQXNzaWduX19Hcm91cF82X18xX19JbXBsIHJ1bGVfX09wTXVsdGlBc3NpZ25fX0dyb3VwXzZfXzIgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX09wTXVsdGlBc3NpZ25fX0dyb3VwXzZfXzEoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTA2NDY6MTogKCBydWxlX19PcE11bHRpQXNzaWduX19Hcm91cF82X18xX19JbXBsIHJ1bGVfX09wTXVsdGlBc3NpZ25fX0dyb3VwXzZfXzIgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTA2NDc6MjogcnVsZV9fT3BNdWx0aUFzc2lnbl9fR3JvdXBfNl9fMV9fSW1wbCBydWxlX19PcE11bHRpQXNzaWduX19Hcm91cF82X18yCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMTk4NDoxOiAoIHJ1bGVfX09wTXVsdGlBc3NpZ25fX0dyb3VwXzZfXzFfX0ltcGwgcnVsZV9fT3BNdWx0aUFzc2lnbl9fR3JvdXBfNl9fMiApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMTk4NToyOiBydWxlX19PcE11bHRpQXNzaWduX19Hcm91cF82X18xX19JbXBsIHJ1bGVfX09wTXVsdGlBc3NpZ25fX0dyb3VwXzZfXzIKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzgyKTsKKyAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzkwKTsKICAgICAgICAgICAgIHJ1bGVfX09wTXVsdGlBc3NpZ25fX0dyb3VwXzZfXzFfX0ltcGwoKTsKIAogICAgICAgICAgICAgc3RhdGUuX2ZzcC0tOwpAQCAtMzU5NDUsMzEgKzQwNDAyLDMxIEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fT3BNdWx0aUFzc2lnbl9fR3JvdXBfNl9fMV9fSW1wbCIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMDY1NDoxOiBydWxlX19PcE11bHRpQXNzaWduX19Hcm91cF82X18xX19JbXBsIDogKCAoICc+JyApPyApIDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMTk5MjoxOiBydWxlX19PcE11bHRpQXNzaWduX19Hcm91cF82X18xX19JbXBsIDogKCAoICc+JyApPyApIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19PcE11bHRpQXNzaWduX19Hcm91cF82X18xX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEwNjU4OjE6ICggKCAoICc+JyApPyApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEwNjU5OjE6ICggKCAnPicgKT8gKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTE5OTY6MTogKCAoICggJz4nICk/ICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTE5OTc6MTogKCAoICc+JyApPyApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMDY1OToxOiAoICggJz4nICk/ICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEwNjYwOjI6ICggJz4nICk/CisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMTk5NzoxOiAoICggJz4nICk/ICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjExOTk4OjI6ICggJz4nICk/CiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldE9wTXVsdGlBc3NpZ25BY2Nlc3MoKS5nZXRHcmVhdGVyVGhhblNpZ25LZXl3b3JkXzZfMSgpKTsgCiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMDY2MToyOiAoICc+JyApPwotICAgICAgICAgICAgaW50IGFsdDk2PTI7Ci0gICAgICAgICAgICBpbnQgTEE5Nl8wID0gaW5wdXQuTEEoMSk7CisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMTk5OToyOiAoICc+JyApPworICAgICAgICAgICAgaW50IGFsdDEwOT0yOworICAgICAgICAgICAgaW50IExBMTA5XzAgPSBpbnB1dC5MQSgxKTsKIAotICAgICAgICAgICAgaWYgKCAoTEE5Nl8wPT0yNikgKSB7Ci0gICAgICAgICAgICAgICAgYWx0OTY9MTsKKyAgICAgICAgICAgIGlmICggKExBMTA5XzA9PTI2KSApIHsKKyAgICAgICAgICAgICAgICBhbHQxMDk9MTsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHN3aXRjaCAoYWx0OTYpIHsKKyAgICAgICAgICAgIHN3aXRjaCAoYWx0MTA5KSB7CiAgICAgICAgICAgICAgICAgY2FzZSAxIDoKLSAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTA2NjE6MzogJz4nCisgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjExOTk5OjM6ICc+JwogICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgIG1hdGNoKGlucHV0LDI2LEZPTExPV18yKTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKIApAQCAtMzYwMDMsMTQgKzQwNDYwLDE0IEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fT3BNdWx0aUFzc2lnbl9fR3JvdXBfNl9fMiIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMDY2OToxOiBydWxlX19PcE11bHRpQXNzaWduX19Hcm91cF82X18yIDogcnVsZV9fT3BNdWx0aUFzc2lnbl9fR3JvdXBfNl9fMl9fSW1wbCA7CisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTIwMDc6MTogcnVsZV9fT3BNdWx0aUFzc2lnbl9fR3JvdXBfNl9fMiA6IHJ1bGVfX09wTXVsdGlBc3NpZ25fX0dyb3VwXzZfXzJfX0ltcGwgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX09wTXVsdGlBc3NpZ25fX0dyb3VwXzZfXzIoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTA2NzM6MTogKCBydWxlX19PcE11bHRpQXNzaWduX19Hcm91cF82X18yX19JbXBsICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEwNjc0OjI6IHJ1bGVfX09wTXVsdGlBc3NpZ25fX0dyb3VwXzZfXzJfX0ltcGwKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEyMDExOjE6ICggcnVsZV9fT3BNdWx0aUFzc2lnbl9fR3JvdXBfNl9fMl9fSW1wbCApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMjAxMjoyOiBydWxlX19PcE11bHRpQXNzaWduX19Hcm91cF82X18yX19JbXBsCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV18yKTsKICAgICAgICAgICAgIHJ1bGVfX09wTXVsdGlBc3NpZ25fX0dyb3VwXzZfXzJfX0ltcGwoKTsKQEAgLTM2MDM2LDE3ICs0MDQ5MywxNyBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX09wTXVsdGlBc3NpZ25fX0dyb3VwXzZfXzJfX0ltcGwiCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTA2ODA6MTogcnVsZV9fT3BNdWx0aUFzc2lnbl9fR3JvdXBfNl9fMl9fSW1wbCA6ICggJz49JyApIDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMjAxODoxOiBydWxlX19PcE11bHRpQXNzaWduX19Hcm91cF82X18yX19JbXBsIDogKCAnPj0nICkgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX09wTXVsdGlBc3NpZ25fX0dyb3VwXzZfXzJfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTA2ODQ6MTogKCAoICc+PScgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMDY4NToxOiAoICc+PScgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTIwMjI6MTogKCAoICc+PScgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMjAyMzoxOiAoICc+PScgKQogICAgICAgICAgICAgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTA2ODU6MTogKCAnPj0nICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEwNjg2OjI6ICc+PScKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEyMDIzOjE6ICggJz49JyApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMjAyNDoyOiAnPj0nCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldE9wTXVsdGlBc3NpZ25BY2Nlc3MoKS5nZXRHcmVhdGVyVGhhblNpZ25FcXVhbHNTaWduS2V5d29yZF82XzIoKSk7IApAQCAtMzYwNzcsMTYgKzQwNTM0LDE2IEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fWE9yRXhwcmVzc2lvbl9fR3JvdXBfXzAiCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTA2OTY6MTogcnVsZV9fWE9yRXhwcmVzc2lvbl9fR3JvdXBfXzAgOiBydWxlX19YT3JFeHByZXNzaW9uX19Hcm91cF9fMF9fSW1wbCBydWxlX19YT3JFeHByZXNzaW9uX19Hcm91cF9fMSA7CisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTIwMzQ6MTogcnVsZV9fWE9yRXhwcmVzc2lvbl9fR3JvdXBfXzAgOiBydWxlX19YT3JFeHByZXNzaW9uX19Hcm91cF9fMF9fSW1wbCBydWxlX19YT3JFeHByZXNzaW9uX19Hcm91cF9fMSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fWE9yRXhwcmVzc2lvbl9fR3JvdXBfXzAoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTA3MDA6MTogKCBydWxlX19YT3JFeHByZXNzaW9uX19Hcm91cF9fMF9fSW1wbCBydWxlX19YT3JFeHByZXNzaW9uX19Hcm91cF9fMSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMDcwMToyOiBydWxlX19YT3JFeHByZXNzaW9uX19Hcm91cF9fMF9fSW1wbCBydWxlX19YT3JFeHByZXNzaW9uX19Hcm91cF9fMQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTIwMzg6MTogKCBydWxlX19YT3JFeHByZXNzaW9uX19Hcm91cF9fMF9fSW1wbCBydWxlX19YT3JFeHByZXNzaW9uX19Hcm91cF9fMSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMjAzOToyOiBydWxlX19YT3JFeHByZXNzaW9uX19Hcm91cF9fMF9fSW1wbCBydWxlX19YT3JFeHByZXNzaW9uX19Hcm91cF9fMQogICAgICAgICAgICAgewotICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfODMpOworICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfOTEpOwogICAgICAgICAgICAgcnVsZV9fWE9yRXhwcmVzc2lvbl9fR3JvdXBfXzBfX0ltcGwoKTsKIAogICAgICAgICAgICAgc3RhdGUuX2ZzcC0tOwpAQCAtMzYxMTUsMTcgKzQwNTcyLDE3IEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fWE9yRXhwcmVzc2lvbl9fR3JvdXBfXzBfX0ltcGwiCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTA3MDg6MTogcnVsZV9fWE9yRXhwcmVzc2lvbl9fR3JvdXBfXzBfX0ltcGwgOiAoIHJ1bGVYQW5kRXhwcmVzc2lvbiApIDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMjA0NjoxOiBydWxlX19YT3JFeHByZXNzaW9uX19Hcm91cF9fMF9fSW1wbCA6ICggcnVsZVhBbmRFeHByZXNzaW9uICkgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1hPckV4cHJlc3Npb25fX0dyb3VwX18wX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEwNzEyOjE6ICggKCBydWxlWEFuZEV4cHJlc3Npb24gKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMDcxMzoxOiAoIHJ1bGVYQW5kRXhwcmVzc2lvbiApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMjA1MDoxOiAoICggcnVsZVhBbmRFeHByZXNzaW9uICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTIwNTE6MTogKCBydWxlWEFuZEV4cHJlc3Npb24gKQogICAgICAgICAgICAgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTA3MTM6MTogKCBydWxlWEFuZEV4cHJlc3Npb24gKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTA3MTQ6MjogcnVsZVhBbmRFeHByZXNzaW9uCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMjA1MToxOiAoIHJ1bGVYQW5kRXhwcmVzc2lvbiApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMjA1MjoyOiBydWxlWEFuZEV4cHJlc3Npb24KICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WE9yRXhwcmVzc2lvbkFjY2VzcygpLmdldFhBbmRFeHByZXNzaW9uUGFyc2VyUnVsZUNhbGxfMCgpKTsgCkBAIC0zNjE2MCwxNCArNDA2MTcsMTQgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YT3JFeHByZXNzaW9uX19Hcm91cF9fMSIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMDcyMzoxOiBydWxlX19YT3JFeHByZXNzaW9uX19Hcm91cF9fMSA6IHJ1bGVfX1hPckV4cHJlc3Npb25fX0dyb3VwX18xX19JbXBsIDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMjA2MToxOiBydWxlX19YT3JFeHByZXNzaW9uX19Hcm91cF9fMSA6IHJ1bGVfX1hPckV4cHJlc3Npb25fX0dyb3VwX18xX19JbXBsIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YT3JFeHByZXNzaW9uX19Hcm91cF9fMSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMDcyNzoxOiAoIHJ1bGVfX1hPckV4cHJlc3Npb25fX0dyb3VwX18xX19JbXBsICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEwNzI4OjI6IHJ1bGVfX1hPckV4cHJlc3Npb25fX0dyb3VwX18xX19JbXBsCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMjA2NToxOiAoIHJ1bGVfX1hPckV4cHJlc3Npb25fX0dyb3VwX18xX19JbXBsICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEyMDY2OjI6IHJ1bGVfX1hPckV4cHJlc3Npb25fX0dyb3VwX18xX19JbXBsCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV18yKTsKICAgICAgICAgICAgIHJ1bGVfX1hPckV4cHJlc3Npb25fX0dyb3VwX18xX19JbXBsKCk7CkBAIC0zNjE5Myw0MyArNDA2NTAsNDMgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YT3JFeHByZXNzaW9uX19Hcm91cF9fMV9fSW1wbCIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMDczNDoxOiBydWxlX19YT3JFeHByZXNzaW9uX19Hcm91cF9fMV9fSW1wbCA6ICggKCBydWxlX19YT3JFeHByZXNzaW9uX19Hcm91cF8xX18wICkqICkgOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEyMDcyOjE6IHJ1bGVfX1hPckV4cHJlc3Npb25fX0dyb3VwX18xX19JbXBsIDogKCAoIHJ1bGVfX1hPckV4cHJlc3Npb25fX0dyb3VwXzFfXzAgKSogKSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fWE9yRXhwcmVzc2lvbl9fR3JvdXBfXzFfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTA3Mzg6MTogKCAoICggcnVsZV9fWE9yRXhwcmVzc2lvbl9fR3JvdXBfMV9fMCApKiApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEwNzM5OjE6ICggKCBydWxlX19YT3JFeHByZXNzaW9uX19Hcm91cF8xX18wICkqICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEyMDc2OjE6ICggKCAoIHJ1bGVfX1hPckV4cHJlc3Npb25fX0dyb3VwXzFfXzAgKSogKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMjA3NzoxOiAoICggcnVsZV9fWE9yRXhwcmVzc2lvbl9fR3JvdXBfMV9fMCApKiApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMDczOToxOiAoICggcnVsZV9fWE9yRXhwcmVzc2lvbl9fR3JvdXBfMV9fMCApKiApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMDc0MDoyOiAoIHJ1bGVfX1hPckV4cHJlc3Npb25fX0dyb3VwXzFfXzAgKSoKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEyMDc3OjE6ICggKCBydWxlX19YT3JFeHByZXNzaW9uX19Hcm91cF8xX18wICkqICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEyMDc4OjI6ICggcnVsZV9fWE9yRXhwcmVzc2lvbl9fR3JvdXBfMV9fMCApKgogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYT3JFeHByZXNzaW9uQWNjZXNzKCkuZ2V0R3JvdXBfMSgpKTsgCiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMDc0MToyOiAoIHJ1bGVfX1hPckV4cHJlc3Npb25fX0dyb3VwXzFfXzAgKSoKLSAgICAgICAgICAgIGxvb3A5NzoKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEyMDc5OjI6ICggcnVsZV9fWE9yRXhwcmVzc2lvbl9fR3JvdXBfMV9fMCApKgorICAgICAgICAgICAgbG9vcDExMDoKICAgICAgICAgICAgIGRvIHsKLSAgICAgICAgICAgICAgICBpbnQgYWx0OTc9MjsKLSAgICAgICAgICAgICAgICBpbnQgTEE5N18wID0gaW5wdXQuTEEoMSk7CisgICAgICAgICAgICAgICAgaW50IGFsdDExMD0yOworICAgICAgICAgICAgICAgIGludCBMQTExMF8wID0gaW5wdXQuTEEoMSk7CiAKLSAgICAgICAgICAgICAgICBpZiAoIChMQTk3XzA9PTE0KSApIHsKLSAgICAgICAgICAgICAgICAgICAgaW50IExBOTdfMiA9IGlucHV0LkxBKDIpOworICAgICAgICAgICAgICAgIGlmICggKExBMTEwXzA9PTE0KSApIHsKKyAgICAgICAgICAgICAgICAgICAgaW50IExBMTEwXzIgPSBpbnB1dC5MQSgyKTsKIAotICAgICAgICAgICAgICAgICAgICBpZiAoIChzeW5wcmVkMTUxX0ludGVybmFsRGF0YURTTCgpKSApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGFsdDk3PTE7CisgICAgICAgICAgICAgICAgICAgIGlmICggKHN5bnByZWQxNzBfSW50ZXJuYWxEYXRhRFNMKCkpICkgeworICAgICAgICAgICAgICAgICAgICAgICAgYWx0MTEwPTE7CiAgICAgICAgICAgICAgICAgICAgIH0KIAogCiAgICAgICAgICAgICAgICAgfQogCiAKLSAgICAgICAgICAgICAgICBzd2l0Y2ggKGFsdDk3KSB7CisgICAgICAgICAgICAgICAgc3dpdGNoIChhbHQxMTApIHsKICAgICAgICAgICAgIAljYXNlIDEgOgotICAgICAgICAgICAgCSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMDc0MTozOiBydWxlX19YT3JFeHByZXNzaW9uX19Hcm91cF8xX18wCisgICAgICAgICAgICAJICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEyMDc5OjM6IHJ1bGVfX1hPckV4cHJlc3Npb25fX0dyb3VwXzFfXzAKICAgICAgICAgICAgIAkgICAgewotICAgICAgICAgICAgCSAgICBwdXNoRm9sbG93KEZPTExPV184NCk7CisgICAgICAgICAgICAJICAgIHB1c2hGb2xsb3coRk9MTE9XXzkyKTsKICAgICAgICAgICAgIAkgICAgcnVsZV9fWE9yRXhwcmVzc2lvbl9fR3JvdXBfMV9fMCgpOwogCiAgICAgICAgICAgICAJICAgIHN0YXRlLl9mc3AtLTsKQEAgLTM2MjM5LDcgKzQwNjk2LDcgQEAKICAgICAgICAgICAgIAkgICAgYnJlYWs7CiAKICAgICAgICAgICAgIAlkZWZhdWx0IDoKLSAgICAgICAgICAgIAkgICAgYnJlYWsgbG9vcDk3OworICAgICAgICAgICAgCSAgICBicmVhayBsb29wMTEwOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0gd2hpbGUgKHRydWUpOwogCkBAIC0zNjI2OCwxNiArNDA3MjUsMTYgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YT3JFeHByZXNzaW9uX19Hcm91cF8xX18wIgotICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEwNzUwOjE6IHJ1bGVfX1hPckV4cHJlc3Npb25fX0dyb3VwXzFfXzAgOiBydWxlX19YT3JFeHByZXNzaW9uX19Hcm91cF8xX18wX19JbXBsIHJ1bGVfX1hPckV4cHJlc3Npb25fX0dyb3VwXzFfXzEgOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEyMDg4OjE6IHJ1bGVfX1hPckV4cHJlc3Npb25fX0dyb3VwXzFfXzAgOiBydWxlX19YT3JFeHByZXNzaW9uX19Hcm91cF8xX18wX19JbXBsIHJ1bGVfX1hPckV4cHJlc3Npb25fX0dyb3VwXzFfXzEgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1hPckV4cHJlc3Npb25fX0dyb3VwXzFfXzAoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTA3NTQ6MTogKCBydWxlX19YT3JFeHByZXNzaW9uX19Hcm91cF8xX18wX19JbXBsIHJ1bGVfX1hPckV4cHJlc3Npb25fX0dyb3VwXzFfXzEgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTA3NTU6MjogcnVsZV9fWE9yRXhwcmVzc2lvbl9fR3JvdXBfMV9fMF9fSW1wbCBydWxlX19YT3JFeHByZXNzaW9uX19Hcm91cF8xX18xCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMjA5MjoxOiAoIHJ1bGVfX1hPckV4cHJlc3Npb25fX0dyb3VwXzFfXzBfX0ltcGwgcnVsZV9fWE9yRXhwcmVzc2lvbl9fR3JvdXBfMV9fMSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMjA5MzoyOiBydWxlX19YT3JFeHByZXNzaW9uX19Hcm91cF8xX18wX19JbXBsIHJ1bGVfX1hPckV4cHJlc3Npb25fX0dyb3VwXzFfXzEKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzc0KTsKKyAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzgyKTsKICAgICAgICAgICAgIHJ1bGVfX1hPckV4cHJlc3Npb25fX0dyb3VwXzFfXzBfX0ltcGwoKTsKIAogICAgICAgICAgICAgc3RhdGUuX2ZzcC0tOwpAQCAtMzYzMDYsMjMgKzQwNzYzLDIzIEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fWE9yRXhwcmVzc2lvbl9fR3JvdXBfMV9fMF9fSW1wbCIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMDc2MjoxOiBydWxlX19YT3JFeHByZXNzaW9uX19Hcm91cF8xX18wX19JbXBsIDogKCAoIHJ1bGVfX1hPckV4cHJlc3Npb25fX0dyb3VwXzFfMF9fMCApICkgOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEyMTAwOjE6IHJ1bGVfX1hPckV4cHJlc3Npb25fX0dyb3VwXzFfXzBfX0ltcGwgOiAoICggcnVsZV9fWE9yRXhwcmVzc2lvbl9fR3JvdXBfMV8wX18wICkgKSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fWE9yRXhwcmVzc2lvbl9fR3JvdXBfMV9fMF9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMDc2NjoxOiAoICggKCBydWxlX19YT3JFeHByZXNzaW9uX19Hcm91cF8xXzBfXzAgKSApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEwNzY3OjE6ICggKCBydWxlX19YT3JFeHByZXNzaW9uX19Hcm91cF8xXzBfXzAgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMjEwNDoxOiAoICggKCBydWxlX19YT3JFeHByZXNzaW9uX19Hcm91cF8xXzBfXzAgKSApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEyMTA1OjE6ICggKCBydWxlX19YT3JFeHByZXNzaW9uX19Hcm91cF8xXzBfXzAgKSApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMDc2NzoxOiAoICggcnVsZV9fWE9yRXhwcmVzc2lvbl9fR3JvdXBfMV8wX18wICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTA3Njg6MjogKCBydWxlX19YT3JFeHByZXNzaW9uX19Hcm91cF8xXzBfXzAgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTIxMDU6MTogKCAoIHJ1bGVfX1hPckV4cHJlc3Npb25fX0dyb3VwXzFfMF9fMCApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEyMTA2OjI6ICggcnVsZV9fWE9yRXhwcmVzc2lvbl9fR3JvdXBfMV8wX18wICkKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WE9yRXhwcmVzc2lvbkFjY2VzcygpLmdldEdyb3VwXzFfMCgpKTsgCiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMDc2OToyOiAoIHJ1bGVfX1hPckV4cHJlc3Npb25fX0dyb3VwXzFfMF9fMCApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMDc2OTozOiBydWxlX19YT3JFeHByZXNzaW9uX19Hcm91cF8xXzBfXzAKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEyMTA3OjI6ICggcnVsZV9fWE9yRXhwcmVzc2lvbl9fR3JvdXBfMV8wX18wICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEyMTA3OjM6IHJ1bGVfX1hPckV4cHJlc3Npb25fX0dyb3VwXzFfMF9fMAogICAgICAgICAgICAgewogICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMik7CiAgICAgICAgICAgICBydWxlX19YT3JFeHByZXNzaW9uX19Hcm91cF8xXzBfXzAoKTsKQEAgLTM2MzU3LDE0ICs0MDgxNCwxNCBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX1hPckV4cHJlc3Npb25fX0dyb3VwXzFfXzEiCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTA3Nzc6MTogcnVsZV9fWE9yRXhwcmVzc2lvbl9fR3JvdXBfMV9fMSA6IHJ1bGVfX1hPckV4cHJlc3Npb25fX0dyb3VwXzFfXzFfX0ltcGwgOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEyMTE1OjE6IHJ1bGVfX1hPckV4cHJlc3Npb25fX0dyb3VwXzFfXzEgOiBydWxlX19YT3JFeHByZXNzaW9uX19Hcm91cF8xX18xX19JbXBsIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YT3JFeHByZXNzaW9uX19Hcm91cF8xX18xKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEwNzgxOjE6ICggcnVsZV9fWE9yRXhwcmVzc2lvbl9fR3JvdXBfMV9fMV9fSW1wbCApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMDc4MjoyOiBydWxlX19YT3JFeHByZXNzaW9uX19Hcm91cF8xX18xX19JbXBsCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMjExOToxOiAoIHJ1bGVfX1hPckV4cHJlc3Npb25fX0dyb3VwXzFfXzFfX0ltcGwgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTIxMjA6MjogcnVsZV9fWE9yRXhwcmVzc2lvbl9fR3JvdXBfMV9fMV9fSW1wbAogICAgICAgICAgICAgewogICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMik7CiAgICAgICAgICAgICBydWxlX19YT3JFeHByZXNzaW9uX19Hcm91cF8xX18xX19JbXBsKCk7CkBAIC0zNjM5MCwyMyArNDA4NDcsMjMgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YT3JFeHByZXNzaW9uX19Hcm91cF8xX18xX19JbXBsIgotICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEwNzg4OjE6IHJ1bGVfX1hPckV4cHJlc3Npb25fX0dyb3VwXzFfXzFfX0ltcGwgOiAoICggcnVsZV9fWE9yRXhwcmVzc2lvbl9fUmlnaHRPcGVyYW5kQXNzaWdubWVudF8xXzEgKSApIDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMjEyNjoxOiBydWxlX19YT3JFeHByZXNzaW9uX19Hcm91cF8xX18xX19JbXBsIDogKCAoIHJ1bGVfX1hPckV4cHJlc3Npb25fX1JpZ2h0T3BlcmFuZEFzc2lnbm1lbnRfMV8xICkgKSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fWE9yRXhwcmVzc2lvbl9fR3JvdXBfMV9fMV9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMDc5MjoxOiAoICggKCBydWxlX19YT3JFeHByZXNzaW9uX19SaWdodE9wZXJhbmRBc3NpZ25tZW50XzFfMSApICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTA3OTM6MTogKCAoIHJ1bGVfX1hPckV4cHJlc3Npb25fX1JpZ2h0T3BlcmFuZEFzc2lnbm1lbnRfMV8xICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTIxMzA6MTogKCAoICggcnVsZV9fWE9yRXhwcmVzc2lvbl9fUmlnaHRPcGVyYW5kQXNzaWdubWVudF8xXzEgKSApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEyMTMxOjE6ICggKCBydWxlX19YT3JFeHByZXNzaW9uX19SaWdodE9wZXJhbmRBc3NpZ25tZW50XzFfMSApICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEwNzkzOjE6ICggKCBydWxlX19YT3JFeHByZXNzaW9uX19SaWdodE9wZXJhbmRBc3NpZ25tZW50XzFfMSApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEwNzk0OjI6ICggcnVsZV9fWE9yRXhwcmVzc2lvbl9fUmlnaHRPcGVyYW5kQXNzaWdubWVudF8xXzEgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTIxMzE6MTogKCAoIHJ1bGVfX1hPckV4cHJlc3Npb25fX1JpZ2h0T3BlcmFuZEFzc2lnbm1lbnRfMV8xICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTIxMzI6MjogKCBydWxlX19YT3JFeHByZXNzaW9uX19SaWdodE9wZXJhbmRBc3NpZ25tZW50XzFfMSApCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhPckV4cHJlc3Npb25BY2Nlc3MoKS5nZXRSaWdodE9wZXJhbmRBc3NpZ25tZW50XzFfMSgpKTsgCiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMDc5NToyOiAoIHJ1bGVfX1hPckV4cHJlc3Npb25fX1JpZ2h0T3BlcmFuZEFzc2lnbm1lbnRfMV8xICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEwNzk1OjM6IHJ1bGVfX1hPckV4cHJlc3Npb25fX1JpZ2h0T3BlcmFuZEFzc2lnbm1lbnRfMV8xCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMjEzMzoyOiAoIHJ1bGVfX1hPckV4cHJlc3Npb25fX1JpZ2h0T3BlcmFuZEFzc2lnbm1lbnRfMV8xICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEyMTMzOjM6IHJ1bGVfX1hPckV4cHJlc3Npb25fX1JpZ2h0T3BlcmFuZEFzc2lnbm1lbnRfMV8xCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV18yKTsKICAgICAgICAgICAgIHJ1bGVfX1hPckV4cHJlc3Npb25fX1JpZ2h0T3BlcmFuZEFzc2lnbm1lbnRfMV8xKCk7CkBAIC0zNjQ0MSwxNCArNDA4OTgsMTQgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YT3JFeHByZXNzaW9uX19Hcm91cF8xXzBfXzAiCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTA4MDQ6MTogcnVsZV9fWE9yRXhwcmVzc2lvbl9fR3JvdXBfMV8wX18wIDogcnVsZV9fWE9yRXhwcmVzc2lvbl9fR3JvdXBfMV8wX18wX19JbXBsIDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMjE0MjoxOiBydWxlX19YT3JFeHByZXNzaW9uX19Hcm91cF8xXzBfXzAgOiBydWxlX19YT3JFeHByZXNzaW9uX19Hcm91cF8xXzBfXzBfX0ltcGwgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1hPckV4cHJlc3Npb25fX0dyb3VwXzFfMF9fMCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMDgwODoxOiAoIHJ1bGVfX1hPckV4cHJlc3Npb25fX0dyb3VwXzFfMF9fMF9fSW1wbCApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMDgwOToyOiBydWxlX19YT3JFeHByZXNzaW9uX19Hcm91cF8xXzBfXzBfX0ltcGwKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEyMTQ2OjE6ICggcnVsZV9fWE9yRXhwcmVzc2lvbl9fR3JvdXBfMV8wX18wX19JbXBsICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEyMTQ3OjI6IHJ1bGVfX1hPckV4cHJlc3Npb25fX0dyb3VwXzFfMF9fMF9fSW1wbAogICAgICAgICAgICAgewogICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMik7CiAgICAgICAgICAgICBydWxlX19YT3JFeHByZXNzaW9uX19Hcm91cF8xXzBfXzBfX0ltcGwoKTsKQEAgLTM2NDc0LDIzICs0MDkzMSwyMyBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX1hPckV4cHJlc3Npb25fX0dyb3VwXzFfMF9fMF9fSW1wbCIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMDgxNToxOiBydWxlX19YT3JFeHByZXNzaW9uX19Hcm91cF8xXzBfXzBfX0ltcGwgOiAoICggcnVsZV9fWE9yRXhwcmVzc2lvbl9fR3JvdXBfMV8wXzBfXzAgKSApIDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMjE1MzoxOiBydWxlX19YT3JFeHByZXNzaW9uX19Hcm91cF8xXzBfXzBfX0ltcGwgOiAoICggcnVsZV9fWE9yRXhwcmVzc2lvbl9fR3JvdXBfMV8wXzBfXzAgKSApIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YT3JFeHByZXNzaW9uX19Hcm91cF8xXzBfXzBfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTA4MTk6MTogKCAoICggcnVsZV9fWE9yRXhwcmVzc2lvbl9fR3JvdXBfMV8wXzBfXzAgKSApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEwODIwOjE6ICggKCBydWxlX19YT3JFeHByZXNzaW9uX19Hcm91cF8xXzBfMF9fMCApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEyMTU3OjE6ICggKCAoIHJ1bGVfX1hPckV4cHJlc3Npb25fX0dyb3VwXzFfMF8wX18wICkgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMjE1ODoxOiAoICggcnVsZV9fWE9yRXhwcmVzc2lvbl9fR3JvdXBfMV8wXzBfXzAgKSApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMDgyMDoxOiAoICggcnVsZV9fWE9yRXhwcmVzc2lvbl9fR3JvdXBfMV8wXzBfXzAgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMDgyMToyOiAoIHJ1bGVfX1hPckV4cHJlc3Npb25fX0dyb3VwXzFfMF8wX18wICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEyMTU4OjE6ICggKCBydWxlX19YT3JFeHByZXNzaW9uX19Hcm91cF8xXzBfMF9fMCApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEyMTU5OjI6ICggcnVsZV9fWE9yRXhwcmVzc2lvbl9fR3JvdXBfMV8wXzBfXzAgKQogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYT3JFeHByZXNzaW9uQWNjZXNzKCkuZ2V0R3JvdXBfMV8wXzAoKSk7IAogICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTA4MjI6MjogKCBydWxlX19YT3JFeHByZXNzaW9uX19Hcm91cF8xXzBfMF9fMCApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMDgyMjozOiBydWxlX19YT3JFeHByZXNzaW9uX19Hcm91cF8xXzBfMF9fMAorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTIxNjA6MjogKCBydWxlX19YT3JFeHByZXNzaW9uX19Hcm91cF8xXzBfMF9fMCApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMjE2MDozOiBydWxlX19YT3JFeHByZXNzaW9uX19Hcm91cF8xXzBfMF9fMAogICAgICAgICAgICAgewogICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMik7CiAgICAgICAgICAgICBydWxlX19YT3JFeHByZXNzaW9uX19Hcm91cF8xXzBfMF9fMCgpOwpAQCAtMzY1MjUsMTYgKzQwOTgyLDE2IEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fWE9yRXhwcmVzc2lvbl9fR3JvdXBfMV8wXzBfXzAiCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTA4MzE6MTogcnVsZV9fWE9yRXhwcmVzc2lvbl9fR3JvdXBfMV8wXzBfXzAgOiBydWxlX19YT3JFeHByZXNzaW9uX19Hcm91cF8xXzBfMF9fMF9fSW1wbCBydWxlX19YT3JFeHByZXNzaW9uX19Hcm91cF8xXzBfMF9fMSA7CisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTIxNjk6MTogcnVsZV9fWE9yRXhwcmVzc2lvbl9fR3JvdXBfMV8wXzBfXzAgOiBydWxlX19YT3JFeHByZXNzaW9uX19Hcm91cF8xXzBfMF9fMF9fSW1wbCBydWxlX19YT3JFeHByZXNzaW9uX19Hcm91cF8xXzBfMF9fMSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fWE9yRXhwcmVzc2lvbl9fR3JvdXBfMV8wXzBfXzAoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTA4MzU6MTogKCBydWxlX19YT3JFeHByZXNzaW9uX19Hcm91cF8xXzBfMF9fMF9fSW1wbCBydWxlX19YT3JFeHByZXNzaW9uX19Hcm91cF8xXzBfMF9fMSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMDgzNjoyOiBydWxlX19YT3JFeHByZXNzaW9uX19Hcm91cF8xXzBfMF9fMF9fSW1wbCBydWxlX19YT3JFeHByZXNzaW9uX19Hcm91cF8xXzBfMF9fMQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTIxNzM6MTogKCBydWxlX19YT3JFeHByZXNzaW9uX19Hcm91cF8xXzBfMF9fMF9fSW1wbCBydWxlX19YT3JFeHByZXNzaW9uX19Hcm91cF8xXzBfMF9fMSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMjE3NDoyOiBydWxlX19YT3JFeHByZXNzaW9uX19Hcm91cF8xXzBfMF9fMF9fSW1wbCBydWxlX19YT3JFeHByZXNzaW9uX19Hcm91cF8xXzBfMF9fMQogICAgICAgICAgICAgewotICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfODMpOworICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfOTEpOwogICAgICAgICAgICAgcnVsZV9fWE9yRXhwcmVzc2lvbl9fR3JvdXBfMV8wXzBfXzBfX0ltcGwoKTsKIAogICAgICAgICAgICAgc3RhdGUuX2ZzcC0tOwpAQCAtMzY1NjMsMjMgKzQxMDIwLDIzIEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fWE9yRXhwcmVzc2lvbl9fR3JvdXBfMV8wXzBfXzBfX0ltcGwiCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTA4NDM6MTogcnVsZV9fWE9yRXhwcmVzc2lvbl9fR3JvdXBfMV8wXzBfXzBfX0ltcGwgOiAoICgpICkgOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEyMTgxOjE6IHJ1bGVfX1hPckV4cHJlc3Npb25fX0dyb3VwXzFfMF8wX18wX19JbXBsIDogKCAoKSApIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YT3JFeHByZXNzaW9uX19Hcm91cF8xXzBfMF9fMF9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMDg0NzoxOiAoICggKCkgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMDg0ODoxOiAoICgpICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEyMTg1OjE6ICggKCAoKSApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEyMTg2OjE6ICggKCkgKQogICAgICAgICAgICAgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTA4NDg6MTogKCAoKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMDg0OToyOiAoKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTIxODY6MTogKCAoKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMjE4NzoyOiAoKQogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYT3JFeHByZXNzaW9uQWNjZXNzKCkuZ2V0WEJpbmFyeU9wZXJhdGlvbkxlZnRPcGVyYW5kQWN0aW9uXzFfMF8wXzAoKSk7IAogICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTA4NTA6MjogKCkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEwODUwOjM6IAorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTIxODg6MjogKCkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEyMTg4OjM6IAogICAgICAgICAgICAgewogICAgICAgICAgICAgfQogCkBAIC0zNjYwNCwxNCArNDEwNjEsMTQgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YT3JFeHByZXNzaW9uX19Hcm91cF8xXzBfMF9fMSIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMDg1ODoxOiBydWxlX19YT3JFeHByZXNzaW9uX19Hcm91cF8xXzBfMF9fMSA6IHJ1bGVfX1hPckV4cHJlc3Npb25fX0dyb3VwXzFfMF8wX18xX19JbXBsIDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMjE5NjoxOiBydWxlX19YT3JFeHByZXNzaW9uX19Hcm91cF8xXzBfMF9fMSA6IHJ1bGVfX1hPckV4cHJlc3Npb25fX0dyb3VwXzFfMF8wX18xX19JbXBsIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YT3JFeHByZXNzaW9uX19Hcm91cF8xXzBfMF9fMSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMDg2MjoxOiAoIHJ1bGVfX1hPckV4cHJlc3Npb25fX0dyb3VwXzFfMF8wX18xX19JbXBsICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEwODYzOjI6IHJ1bGVfX1hPckV4cHJlc3Npb25fX0dyb3VwXzFfMF8wX18xX19JbXBsCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMjIwMDoxOiAoIHJ1bGVfX1hPckV4cHJlc3Npb25fX0dyb3VwXzFfMF8wX18xX19JbXBsICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEyMjAxOjI6IHJ1bGVfX1hPckV4cHJlc3Npb25fX0dyb3VwXzFfMF8wX18xX19JbXBsCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV18yKTsKICAgICAgICAgICAgIHJ1bGVfX1hPckV4cHJlc3Npb25fX0dyb3VwXzFfMF8wX18xX19JbXBsKCk7CkBAIC0zNjYzNywyMyArNDEwOTQsMjMgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YT3JFeHByZXNzaW9uX19Hcm91cF8xXzBfMF9fMV9fSW1wbCIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMDg2OToxOiBydWxlX19YT3JFeHByZXNzaW9uX19Hcm91cF8xXzBfMF9fMV9fSW1wbCA6ICggKCBydWxlX19YT3JFeHByZXNzaW9uX19GZWF0dXJlQXNzaWdubWVudF8xXzBfMF8xICkgKSA7CisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTIyMDc6MTogcnVsZV9fWE9yRXhwcmVzc2lvbl9fR3JvdXBfMV8wXzBfXzFfX0ltcGwgOiAoICggcnVsZV9fWE9yRXhwcmVzc2lvbl9fRmVhdHVyZUFzc2lnbm1lbnRfMV8wXzBfMSApICkgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1hPckV4cHJlc3Npb25fX0dyb3VwXzFfMF8wX18xX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEwODczOjE6ICggKCAoIHJ1bGVfX1hPckV4cHJlc3Npb25fX0ZlYXR1cmVBc3NpZ25tZW50XzFfMF8wXzEgKSApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEwODc0OjE6ICggKCBydWxlX19YT3JFeHByZXNzaW9uX19GZWF0dXJlQXNzaWdubWVudF8xXzBfMF8xICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTIyMTE6MTogKCAoICggcnVsZV9fWE9yRXhwcmVzc2lvbl9fRmVhdHVyZUFzc2lnbm1lbnRfMV8wXzBfMSApICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTIyMTI6MTogKCAoIHJ1bGVfX1hPckV4cHJlc3Npb25fX0ZlYXR1cmVBc3NpZ25tZW50XzFfMF8wXzEgKSApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMDg3NDoxOiAoICggcnVsZV9fWE9yRXhwcmVzc2lvbl9fRmVhdHVyZUFzc2lnbm1lbnRfMV8wXzBfMSApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEwODc1OjI6ICggcnVsZV9fWE9yRXhwcmVzc2lvbl9fRmVhdHVyZUFzc2lnbm1lbnRfMV8wXzBfMSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMjIxMjoxOiAoICggcnVsZV9fWE9yRXhwcmVzc2lvbl9fRmVhdHVyZUFzc2lnbm1lbnRfMV8wXzBfMSApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEyMjEzOjI6ICggcnVsZV9fWE9yRXhwcmVzc2lvbl9fRmVhdHVyZUFzc2lnbm1lbnRfMV8wXzBfMSApCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhPckV4cHJlc3Npb25BY2Nlc3MoKS5nZXRGZWF0dXJlQXNzaWdubWVudF8xXzBfMF8xKCkpOyAKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEwODc2OjI6ICggcnVsZV9fWE9yRXhwcmVzc2lvbl9fRmVhdHVyZUFzc2lnbm1lbnRfMV8wXzBfMSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMDg3NjozOiBydWxlX19YT3JFeHByZXNzaW9uX19GZWF0dXJlQXNzaWdubWVudF8xXzBfMF8xCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMjIxNDoyOiAoIHJ1bGVfX1hPckV4cHJlc3Npb25fX0ZlYXR1cmVBc3NpZ25tZW50XzFfMF8wXzEgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTIyMTQ6MzogcnVsZV9fWE9yRXhwcmVzc2lvbl9fRmVhdHVyZUFzc2lnbm1lbnRfMV8wXzBfMQogICAgICAgICAgICAgewogICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMik7CiAgICAgICAgICAgICBydWxlX19YT3JFeHByZXNzaW9uX19GZWF0dXJlQXNzaWdubWVudF8xXzBfMF8xKCk7CkBAIC0zNjY4OCwxNiArNDExNDUsMTYgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YQW5kRXhwcmVzc2lvbl9fR3JvdXBfXzAiCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTA4ODU6MTogcnVsZV9fWEFuZEV4cHJlc3Npb25fX0dyb3VwX18wIDogcnVsZV9fWEFuZEV4cHJlc3Npb25fX0dyb3VwX18wX19JbXBsIHJ1bGVfX1hBbmRFeHByZXNzaW9uX19Hcm91cF9fMSA7CisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTIyMjM6MTogcnVsZV9fWEFuZEV4cHJlc3Npb25fX0dyb3VwX18wIDogcnVsZV9fWEFuZEV4cHJlc3Npb25fX0dyb3VwX18wX19JbXBsIHJ1bGVfX1hBbmRFeHByZXNzaW9uX19Hcm91cF9fMSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fWEFuZEV4cHJlc3Npb25fX0dyb3VwX18wKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEwODg5OjE6ICggcnVsZV9fWEFuZEV4cHJlc3Npb25fX0dyb3VwX18wX19JbXBsIHJ1bGVfX1hBbmRFeHByZXNzaW9uX19Hcm91cF9fMSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMDg5MDoyOiBydWxlX19YQW5kRXhwcmVzc2lvbl9fR3JvdXBfXzBfX0ltcGwgcnVsZV9fWEFuZEV4cHJlc3Npb25fX0dyb3VwX18xCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMjIyNzoxOiAoIHJ1bGVfX1hBbmRFeHByZXNzaW9uX19Hcm91cF9fMF9fSW1wbCBydWxlX19YQW5kRXhwcmVzc2lvbl9fR3JvdXBfXzEgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTIyMjg6MjogcnVsZV9fWEFuZEV4cHJlc3Npb25fX0dyb3VwX18wX19JbXBsIHJ1bGVfX1hBbmRFeHByZXNzaW9uX19Hcm91cF9fMQogICAgICAgICAgICAgewotICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfODUpOworICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfOTMpOwogICAgICAgICAgICAgcnVsZV9fWEFuZEV4cHJlc3Npb25fX0dyb3VwX18wX19JbXBsKCk7CiAKICAgICAgICAgICAgIHN0YXRlLl9mc3AtLTsKQEAgLTM2NzI2LDE3ICs0MTE4MywxNyBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX1hBbmRFeHByZXNzaW9uX19Hcm91cF9fMF9fSW1wbCIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMDg5NzoxOiBydWxlX19YQW5kRXhwcmVzc2lvbl9fR3JvdXBfXzBfX0ltcGwgOiAoIHJ1bGVYRXF1YWxpdHlFeHByZXNzaW9uICkgOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEyMjM1OjE6IHJ1bGVfX1hBbmRFeHByZXNzaW9uX19Hcm91cF9fMF9fSW1wbCA6ICggcnVsZVhFcXVhbGl0eUV4cHJlc3Npb24gKSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fWEFuZEV4cHJlc3Npb25fX0dyb3VwX18wX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEwOTAxOjE6ICggKCBydWxlWEVxdWFsaXR5RXhwcmVzc2lvbiApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEwOTAyOjE6ICggcnVsZVhFcXVhbGl0eUV4cHJlc3Npb24gKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTIyMzk6MTogKCAoIHJ1bGVYRXF1YWxpdHlFeHByZXNzaW9uICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTIyNDA6MTogKCBydWxlWEVxdWFsaXR5RXhwcmVzc2lvbiApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMDkwMjoxOiAoIHJ1bGVYRXF1YWxpdHlFeHByZXNzaW9uICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEwOTAzOjI6IHJ1bGVYRXF1YWxpdHlFeHByZXNzaW9uCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMjI0MDoxOiAoIHJ1bGVYRXF1YWxpdHlFeHByZXNzaW9uICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEyMjQxOjI6IHJ1bGVYRXF1YWxpdHlFeHByZXNzaW9uCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhBbmRFeHByZXNzaW9uQWNjZXNzKCkuZ2V0WEVxdWFsaXR5RXhwcmVzc2lvblBhcnNlclJ1bGVDYWxsXzAoKSk7IApAQCAtMzY3NzEsMTQgKzQxMjI4LDE0IEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fWEFuZEV4cHJlc3Npb25fX0dyb3VwX18xIgotICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEwOTEyOjE6IHJ1bGVfX1hBbmRFeHByZXNzaW9uX19Hcm91cF9fMSA6IHJ1bGVfX1hBbmRFeHByZXNzaW9uX19Hcm91cF9fMV9fSW1wbCA7CisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTIyNTA6MTogcnVsZV9fWEFuZEV4cHJlc3Npb25fX0dyb3VwX18xIDogcnVsZV9fWEFuZEV4cHJlc3Npb25fX0dyb3VwX18xX19JbXBsIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YQW5kRXhwcmVzc2lvbl9fR3JvdXBfXzEoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTA5MTY6MTogKCBydWxlX19YQW5kRXhwcmVzc2lvbl9fR3JvdXBfXzFfX0ltcGwgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTA5MTc6MjogcnVsZV9fWEFuZEV4cHJlc3Npb25fX0dyb3VwX18xX19JbXBsCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMjI1NDoxOiAoIHJ1bGVfX1hBbmRFeHByZXNzaW9uX19Hcm91cF9fMV9fSW1wbCApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMjI1NToyOiBydWxlX19YQW5kRXhwcmVzc2lvbl9fR3JvdXBfXzFfX0ltcGwKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzIpOwogICAgICAgICAgICAgcnVsZV9fWEFuZEV4cHJlc3Npb25fX0dyb3VwX18xX19JbXBsKCk7CkBAIC0zNjgwNCw0MyArNDEyNjEsNDMgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YQW5kRXhwcmVzc2lvbl9fR3JvdXBfXzFfX0ltcGwiCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTA5MjM6MTogcnVsZV9fWEFuZEV4cHJlc3Npb25fX0dyb3VwX18xX19JbXBsIDogKCAoIHJ1bGVfX1hBbmRFeHByZXNzaW9uX19Hcm91cF8xX18wICkqICkgOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEyMjYxOjE6IHJ1bGVfX1hBbmRFeHByZXNzaW9uX19Hcm91cF9fMV9fSW1wbCA6ICggKCBydWxlX19YQW5kRXhwcmVzc2lvbl9fR3JvdXBfMV9fMCApKiApIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YQW5kRXhwcmVzc2lvbl9fR3JvdXBfXzFfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTA5Mjc6MTogKCAoICggcnVsZV9fWEFuZEV4cHJlc3Npb25fX0dyb3VwXzFfXzAgKSogKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMDkyODoxOiAoICggcnVsZV9fWEFuZEV4cHJlc3Npb25fX0dyb3VwXzFfXzAgKSogKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTIyNjU6MTogKCAoICggcnVsZV9fWEFuZEV4cHJlc3Npb25fX0dyb3VwXzFfXzAgKSogKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMjI2NjoxOiAoICggcnVsZV9fWEFuZEV4cHJlc3Npb25fX0dyb3VwXzFfXzAgKSogKQogICAgICAgICAgICAgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTA5Mjg6MTogKCAoIHJ1bGVfX1hBbmRFeHByZXNzaW9uX19Hcm91cF8xX18wICkqICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEwOTI5OjI6ICggcnVsZV9fWEFuZEV4cHJlc3Npb25fX0dyb3VwXzFfXzAgKSoKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEyMjY2OjE6ICggKCBydWxlX19YQW5kRXhwcmVzc2lvbl9fR3JvdXBfMV9fMCApKiApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMjI2NzoyOiAoIHJ1bGVfX1hBbmRFeHByZXNzaW9uX19Hcm91cF8xX18wICkqCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhBbmRFeHByZXNzaW9uQWNjZXNzKCkuZ2V0R3JvdXBfMSgpKTsgCiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMDkzMDoyOiAoIHJ1bGVfX1hBbmRFeHByZXNzaW9uX19Hcm91cF8xX18wICkqCi0gICAgICAgICAgICBsb29wOTg6CisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMjI2ODoyOiAoIHJ1bGVfX1hBbmRFeHByZXNzaW9uX19Hcm91cF8xX18wICkqCisgICAgICAgICAgICBsb29wMTExOgogICAgICAgICAgICAgZG8gewotICAgICAgICAgICAgICAgIGludCBhbHQ5OD0yOwotICAgICAgICAgICAgICAgIGludCBMQTk4XzAgPSBpbnB1dC5MQSgxKTsKKyAgICAgICAgICAgICAgICBpbnQgYWx0MTExPTI7CisgICAgICAgICAgICAgICAgaW50IExBMTExXzAgPSBpbnB1dC5MQSgxKTsKIAotICAgICAgICAgICAgICAgIGlmICggKExBOThfMD09MTUpICkgewotICAgICAgICAgICAgICAgICAgICBpbnQgTEE5OF8yID0gaW5wdXQuTEEoMik7CisgICAgICAgICAgICAgICAgaWYgKCAoTEExMTFfMD09MTUpICkgeworICAgICAgICAgICAgICAgICAgICBpbnQgTEExMTFfMiA9IGlucHV0LkxBKDIpOwogCi0gICAgICAgICAgICAgICAgICAgIGlmICggKHN5bnByZWQxNTJfSW50ZXJuYWxEYXRhRFNMKCkpICkgewotICAgICAgICAgICAgICAgICAgICAgICAgYWx0OTg9MTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCAoc3lucHJlZDE3MV9JbnRlcm5hbERhdGFEU0woKSkgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBhbHQxMTE9MTsKICAgICAgICAgICAgICAgICAgICAgfQogCiAKICAgICAgICAgICAgICAgICB9CiAKIAotICAgICAgICAgICAgICAgIHN3aXRjaCAoYWx0OTgpIHsKKyAgICAgICAgICAgICAgICBzd2l0Y2ggKGFsdDExMSkgewogICAgICAgICAgICAgCWNhc2UgMSA6Ci0gICAgICAgICAgICAJICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEwOTMwOjM6IHJ1bGVfX1hBbmRFeHByZXNzaW9uX19Hcm91cF8xX18wCisgICAgICAgICAgICAJICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEyMjY4OjM6IHJ1bGVfX1hBbmRFeHByZXNzaW9uX19Hcm91cF8xX18wCiAgICAgICAgICAgICAJICAgIHsKLSAgICAgICAgICAgIAkgICAgcHVzaEZvbGxvdyhGT0xMT1dfODYpOworICAgICAgICAgICAgCSAgICBwdXNoRm9sbG93KEZPTExPV185NCk7CiAgICAgICAgICAgICAJICAgIHJ1bGVfX1hBbmRFeHByZXNzaW9uX19Hcm91cF8xX18wKCk7CiAKICAgICAgICAgICAgIAkgICAgc3RhdGUuX2ZzcC0tOwpAQCAtMzY4NTAsNyArNDEzMDcsNyBAQAogICAgICAgICAgICAgCSAgICBicmVhazsKIAogICAgICAgICAgICAgCWRlZmF1bHQgOgotICAgICAgICAgICAgCSAgICBicmVhayBsb29wOTg7CisgICAgICAgICAgICAJICAgIGJyZWFrIGxvb3AxMTE7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfSB3aGlsZSAodHJ1ZSk7CiAKQEAgLTM2ODc5LDE2ICs0MTMzNiwxNiBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX1hBbmRFeHByZXNzaW9uX19Hcm91cF8xX18wIgotICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEwOTM5OjE6IHJ1bGVfX1hBbmRFeHByZXNzaW9uX19Hcm91cF8xX18wIDogcnVsZV9fWEFuZEV4cHJlc3Npb25fX0dyb3VwXzFfXzBfX0ltcGwgcnVsZV9fWEFuZEV4cHJlc3Npb25fX0dyb3VwXzFfXzEgOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEyMjc3OjE6IHJ1bGVfX1hBbmRFeHByZXNzaW9uX19Hcm91cF8xX18wIDogcnVsZV9fWEFuZEV4cHJlc3Npb25fX0dyb3VwXzFfXzBfX0ltcGwgcnVsZV9fWEFuZEV4cHJlc3Npb25fX0dyb3VwXzFfXzEgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1hBbmRFeHByZXNzaW9uX19Hcm91cF8xX18wKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEwOTQzOjE6ICggcnVsZV9fWEFuZEV4cHJlc3Npb25fX0dyb3VwXzFfXzBfX0ltcGwgcnVsZV9fWEFuZEV4cHJlc3Npb25fX0dyb3VwXzFfXzEgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTA5NDQ6MjogcnVsZV9fWEFuZEV4cHJlc3Npb25fX0dyb3VwXzFfXzBfX0ltcGwgcnVsZV9fWEFuZEV4cHJlc3Npb25fX0dyb3VwXzFfXzEKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEyMjgxOjE6ICggcnVsZV9fWEFuZEV4cHJlc3Npb25fX0dyb3VwXzFfXzBfX0ltcGwgcnVsZV9fWEFuZEV4cHJlc3Npb25fX0dyb3VwXzFfXzEgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTIyODI6MjogcnVsZV9fWEFuZEV4cHJlc3Npb25fX0dyb3VwXzFfXzBfX0ltcGwgcnVsZV9fWEFuZEV4cHJlc3Npb25fX0dyb3VwXzFfXzEKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzc0KTsKKyAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzgyKTsKICAgICAgICAgICAgIHJ1bGVfX1hBbmRFeHByZXNzaW9uX19Hcm91cF8xX18wX19JbXBsKCk7CiAKICAgICAgICAgICAgIHN0YXRlLl9mc3AtLTsKQEAgLTM2OTE3LDIzICs0MTM3NCwyMyBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX1hBbmRFeHByZXNzaW9uX19Hcm91cF8xX18wX19JbXBsIgotICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEwOTUxOjE6IHJ1bGVfX1hBbmRFeHByZXNzaW9uX19Hcm91cF8xX18wX19JbXBsIDogKCAoIHJ1bGVfX1hBbmRFeHByZXNzaW9uX19Hcm91cF8xXzBfXzAgKSApIDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMjI4OToxOiBydWxlX19YQW5kRXhwcmVzc2lvbl9fR3JvdXBfMV9fMF9fSW1wbCA6ICggKCBydWxlX19YQW5kRXhwcmVzc2lvbl9fR3JvdXBfMV8wX18wICkgKSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fWEFuZEV4cHJlc3Npb25fX0dyb3VwXzFfXzBfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTA5NTU6MTogKCAoICggcnVsZV9fWEFuZEV4cHJlc3Npb25fX0dyb3VwXzFfMF9fMCApICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTA5NTY6MTogKCAoIHJ1bGVfX1hBbmRFeHByZXNzaW9uX19Hcm91cF8xXzBfXzAgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMjI5MzoxOiAoICggKCBydWxlX19YQW5kRXhwcmVzc2lvbl9fR3JvdXBfMV8wX18wICkgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMjI5NDoxOiAoICggcnVsZV9fWEFuZEV4cHJlc3Npb25fX0dyb3VwXzFfMF9fMCApICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEwOTU2OjE6ICggKCBydWxlX19YQW5kRXhwcmVzc2lvbl9fR3JvdXBfMV8wX18wICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTA5NTc6MjogKCBydWxlX19YQW5kRXhwcmVzc2lvbl9fR3JvdXBfMV8wX18wICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEyMjk0OjE6ICggKCBydWxlX19YQW5kRXhwcmVzc2lvbl9fR3JvdXBfMV8wX18wICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTIyOTU6MjogKCBydWxlX19YQW5kRXhwcmVzc2lvbl9fR3JvdXBfMV8wX18wICkKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WEFuZEV4cHJlc3Npb25BY2Nlc3MoKS5nZXRHcm91cF8xXzAoKSk7IAogICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTA5NTg6MjogKCBydWxlX19YQW5kRXhwcmVzc2lvbl9fR3JvdXBfMV8wX18wICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEwOTU4OjM6IHJ1bGVfX1hBbmRFeHByZXNzaW9uX19Hcm91cF8xXzBfXzAKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEyMjk2OjI6ICggcnVsZV9fWEFuZEV4cHJlc3Npb25fX0dyb3VwXzFfMF9fMCApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMjI5NjozOiBydWxlX19YQW5kRXhwcmVzc2lvbl9fR3JvdXBfMV8wX18wCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV18yKTsKICAgICAgICAgICAgIHJ1bGVfX1hBbmRFeHByZXNzaW9uX19Hcm91cF8xXzBfXzAoKTsKQEAgLTM2OTY4LDE0ICs0MTQyNSwxNCBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX1hBbmRFeHByZXNzaW9uX19Hcm91cF8xX18xIgotICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEwOTY2OjE6IHJ1bGVfX1hBbmRFeHByZXNzaW9uX19Hcm91cF8xX18xIDogcnVsZV9fWEFuZEV4cHJlc3Npb25fX0dyb3VwXzFfXzFfX0ltcGwgOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEyMzA0OjE6IHJ1bGVfX1hBbmRFeHByZXNzaW9uX19Hcm91cF8xX18xIDogcnVsZV9fWEFuZEV4cHJlc3Npb25fX0dyb3VwXzFfXzFfX0ltcGwgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1hBbmRFeHByZXNzaW9uX19Hcm91cF8xX18xKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEwOTcwOjE6ICggcnVsZV9fWEFuZEV4cHJlc3Npb25fX0dyb3VwXzFfXzFfX0ltcGwgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTA5NzE6MjogcnVsZV9fWEFuZEV4cHJlc3Npb25fX0dyb3VwXzFfXzFfX0ltcGwKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEyMzA4OjE6ICggcnVsZV9fWEFuZEV4cHJlc3Npb25fX0dyb3VwXzFfXzFfX0ltcGwgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTIzMDk6MjogcnVsZV9fWEFuZEV4cHJlc3Npb25fX0dyb3VwXzFfXzFfX0ltcGwKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzIpOwogICAgICAgICAgICAgcnVsZV9fWEFuZEV4cHJlc3Npb25fX0dyb3VwXzFfXzFfX0ltcGwoKTsKQEAgLTM3MDAxLDIzICs0MTQ1OCwyMyBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX1hBbmRFeHByZXNzaW9uX19Hcm91cF8xX18xX19JbXBsIgotICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEwOTc3OjE6IHJ1bGVfX1hBbmRFeHByZXNzaW9uX19Hcm91cF8xX18xX19JbXBsIDogKCAoIHJ1bGVfX1hBbmRFeHByZXNzaW9uX19SaWdodE9wZXJhbmRBc3NpZ25tZW50XzFfMSApICkgOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEyMzE1OjE6IHJ1bGVfX1hBbmRFeHByZXNzaW9uX19Hcm91cF8xX18xX19JbXBsIDogKCAoIHJ1bGVfX1hBbmRFeHByZXNzaW9uX19SaWdodE9wZXJhbmRBc3NpZ25tZW50XzFfMSApICkgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1hBbmRFeHByZXNzaW9uX19Hcm91cF8xX18xX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEwOTgxOjE6ICggKCAoIHJ1bGVfX1hBbmRFeHByZXNzaW9uX19SaWdodE9wZXJhbmRBc3NpZ25tZW50XzFfMSApICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTA5ODI6MTogKCAoIHJ1bGVfX1hBbmRFeHByZXNzaW9uX19SaWdodE9wZXJhbmRBc3NpZ25tZW50XzFfMSApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEyMzE5OjE6ICggKCAoIHJ1bGVfX1hBbmRFeHByZXNzaW9uX19SaWdodE9wZXJhbmRBc3NpZ25tZW50XzFfMSApICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTIzMjA6MTogKCAoIHJ1bGVfX1hBbmRFeHByZXNzaW9uX19SaWdodE9wZXJhbmRBc3NpZ25tZW50XzFfMSApICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEwOTgyOjE6ICggKCBydWxlX19YQW5kRXhwcmVzc2lvbl9fUmlnaHRPcGVyYW5kQXNzaWdubWVudF8xXzEgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMDk4MzoyOiAoIHJ1bGVfX1hBbmRFeHByZXNzaW9uX19SaWdodE9wZXJhbmRBc3NpZ25tZW50XzFfMSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMjMyMDoxOiAoICggcnVsZV9fWEFuZEV4cHJlc3Npb25fX1JpZ2h0T3BlcmFuZEFzc2lnbm1lbnRfMV8xICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTIzMjE6MjogKCBydWxlX19YQW5kRXhwcmVzc2lvbl9fUmlnaHRPcGVyYW5kQXNzaWdubWVudF8xXzEgKQogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYQW5kRXhwcmVzc2lvbkFjY2VzcygpLmdldFJpZ2h0T3BlcmFuZEFzc2lnbm1lbnRfMV8xKCkpOyAKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEwOTg0OjI6ICggcnVsZV9fWEFuZEV4cHJlc3Npb25fX1JpZ2h0T3BlcmFuZEFzc2lnbm1lbnRfMV8xICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEwOTg0OjM6IHJ1bGVfX1hBbmRFeHByZXNzaW9uX19SaWdodE9wZXJhbmRBc3NpZ25tZW50XzFfMQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTIzMjI6MjogKCBydWxlX19YQW5kRXhwcmVzc2lvbl9fUmlnaHRPcGVyYW5kQXNzaWdubWVudF8xXzEgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTIzMjI6MzogcnVsZV9fWEFuZEV4cHJlc3Npb25fX1JpZ2h0T3BlcmFuZEFzc2lnbm1lbnRfMV8xCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV18yKTsKICAgICAgICAgICAgIHJ1bGVfX1hBbmRFeHByZXNzaW9uX19SaWdodE9wZXJhbmRBc3NpZ25tZW50XzFfMSgpOwpAQCAtMzcwNTIsMTQgKzQxNTA5LDE0IEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fWEFuZEV4cHJlc3Npb25fX0dyb3VwXzFfMF9fMCIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMDk5MzoxOiBydWxlX19YQW5kRXhwcmVzc2lvbl9fR3JvdXBfMV8wX18wIDogcnVsZV9fWEFuZEV4cHJlc3Npb25fX0dyb3VwXzFfMF9fMF9fSW1wbCA7CisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTIzMzE6MTogcnVsZV9fWEFuZEV4cHJlc3Npb25fX0dyb3VwXzFfMF9fMCA6IHJ1bGVfX1hBbmRFeHByZXNzaW9uX19Hcm91cF8xXzBfXzBfX0ltcGwgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1hBbmRFeHByZXNzaW9uX19Hcm91cF8xXzBfXzAoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTA5OTc6MTogKCBydWxlX19YQW5kRXhwcmVzc2lvbl9fR3JvdXBfMV8wX18wX19JbXBsICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEwOTk4OjI6IHJ1bGVfX1hBbmRFeHByZXNzaW9uX19Hcm91cF8xXzBfXzBfX0ltcGwKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEyMzM1OjE6ICggcnVsZV9fWEFuZEV4cHJlc3Npb25fX0dyb3VwXzFfMF9fMF9fSW1wbCApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMjMzNjoyOiBydWxlX19YQW5kRXhwcmVzc2lvbl9fR3JvdXBfMV8wX18wX19JbXBsCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV18yKTsKICAgICAgICAgICAgIHJ1bGVfX1hBbmRFeHByZXNzaW9uX19Hcm91cF8xXzBfXzBfX0ltcGwoKTsKQEAgLTM3MDg1LDIzICs0MTU0MiwyMyBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX1hBbmRFeHByZXNzaW9uX19Hcm91cF8xXzBfXzBfX0ltcGwiCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTEwMDQ6MTogcnVsZV9fWEFuZEV4cHJlc3Npb25fX0dyb3VwXzFfMF9fMF9fSW1wbCA6ICggKCBydWxlX19YQW5kRXhwcmVzc2lvbl9fR3JvdXBfMV8wXzBfXzAgKSApIDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMjM0MjoxOiBydWxlX19YQW5kRXhwcmVzc2lvbl9fR3JvdXBfMV8wX18wX19JbXBsIDogKCAoIHJ1bGVfX1hBbmRFeHByZXNzaW9uX19Hcm91cF8xXzBfMF9fMCApICkgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1hBbmRFeHByZXNzaW9uX19Hcm91cF8xXzBfXzBfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTEwMDg6MTogKCAoICggcnVsZV9fWEFuZEV4cHJlc3Npb25fX0dyb3VwXzFfMF8wX18wICkgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMTAwOToxOiAoICggcnVsZV9fWEFuZEV4cHJlc3Npb25fX0dyb3VwXzFfMF8wX18wICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTIzNDY6MTogKCAoICggcnVsZV9fWEFuZEV4cHJlc3Npb25fX0dyb3VwXzFfMF8wX18wICkgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMjM0NzoxOiAoICggcnVsZV9fWEFuZEV4cHJlc3Npb25fX0dyb3VwXzFfMF8wX18wICkgKQogICAgICAgICAgICAgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTEwMDk6MTogKCAoIHJ1bGVfX1hBbmRFeHByZXNzaW9uX19Hcm91cF8xXzBfMF9fMCApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjExMDEwOjI6ICggcnVsZV9fWEFuZEV4cHJlc3Npb25fX0dyb3VwXzFfMF8wX18wICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEyMzQ3OjE6ICggKCBydWxlX19YQW5kRXhwcmVzc2lvbl9fR3JvdXBfMV8wXzBfXzAgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMjM0ODoyOiAoIHJ1bGVfX1hBbmRFeHByZXNzaW9uX19Hcm91cF8xXzBfMF9fMCApCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhBbmRFeHByZXNzaW9uQWNjZXNzKCkuZ2V0R3JvdXBfMV8wXzAoKSk7IAogICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTEwMTE6MjogKCBydWxlX19YQW5kRXhwcmVzc2lvbl9fR3JvdXBfMV8wXzBfXzAgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTEwMTE6MzogcnVsZV9fWEFuZEV4cHJlc3Npb25fX0dyb3VwXzFfMF8wX18wCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMjM0OToyOiAoIHJ1bGVfX1hBbmRFeHByZXNzaW9uX19Hcm91cF8xXzBfMF9fMCApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMjM0OTozOiBydWxlX19YQW5kRXhwcmVzc2lvbl9fR3JvdXBfMV8wXzBfXzAKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzIpOwogICAgICAgICAgICAgcnVsZV9fWEFuZEV4cHJlc3Npb25fX0dyb3VwXzFfMF8wX18wKCk7CkBAIC0zNzEzNiwxNiArNDE1OTMsMTYgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YQW5kRXhwcmVzc2lvbl9fR3JvdXBfMV8wXzBfXzAiCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTEwMjA6MTogcnVsZV9fWEFuZEV4cHJlc3Npb25fX0dyb3VwXzFfMF8wX18wIDogcnVsZV9fWEFuZEV4cHJlc3Npb25fX0dyb3VwXzFfMF8wX18wX19JbXBsIHJ1bGVfX1hBbmRFeHByZXNzaW9uX19Hcm91cF8xXzBfMF9fMSA7CisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTIzNTg6MTogcnVsZV9fWEFuZEV4cHJlc3Npb25fX0dyb3VwXzFfMF8wX18wIDogcnVsZV9fWEFuZEV4cHJlc3Npb25fX0dyb3VwXzFfMF8wX18wX19JbXBsIHJ1bGVfX1hBbmRFeHByZXNzaW9uX19Hcm91cF8xXzBfMF9fMSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fWEFuZEV4cHJlc3Npb25fX0dyb3VwXzFfMF8wX18wKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjExMDI0OjE6ICggcnVsZV9fWEFuZEV4cHJlc3Npb25fX0dyb3VwXzFfMF8wX18wX19JbXBsIHJ1bGVfX1hBbmRFeHByZXNzaW9uX19Hcm91cF8xXzBfMF9fMSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMTAyNToyOiBydWxlX19YQW5kRXhwcmVzc2lvbl9fR3JvdXBfMV8wXzBfXzBfX0ltcGwgcnVsZV9fWEFuZEV4cHJlc3Npb25fX0dyb3VwXzFfMF8wX18xCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMjM2MjoxOiAoIHJ1bGVfX1hBbmRFeHByZXNzaW9uX19Hcm91cF8xXzBfMF9fMF9fSW1wbCBydWxlX19YQW5kRXhwcmVzc2lvbl9fR3JvdXBfMV8wXzBfXzEgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTIzNjM6MjogcnVsZV9fWEFuZEV4cHJlc3Npb25fX0dyb3VwXzFfMF8wX18wX19JbXBsIHJ1bGVfX1hBbmRFeHByZXNzaW9uX19Hcm91cF8xXzBfMF9fMQogICAgICAgICAgICAgewotICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfODUpOworICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfOTMpOwogICAgICAgICAgICAgcnVsZV9fWEFuZEV4cHJlc3Npb25fX0dyb3VwXzFfMF8wX18wX19JbXBsKCk7CiAKICAgICAgICAgICAgIHN0YXRlLl9mc3AtLTsKQEAgLTM3MTc0LDIzICs0MTYzMSwyMyBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX1hBbmRFeHByZXNzaW9uX19Hcm91cF8xXzBfMF9fMF9fSW1wbCIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMTAzMjoxOiBydWxlX19YQW5kRXhwcmVzc2lvbl9fR3JvdXBfMV8wXzBfXzBfX0ltcGwgOiAoICgpICkgOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEyMzcwOjE6IHJ1bGVfX1hBbmRFeHByZXNzaW9uX19Hcm91cF8xXzBfMF9fMF9fSW1wbCA6ICggKCkgKSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fWEFuZEV4cHJlc3Npb25fX0dyb3VwXzFfMF8wX18wX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjExMDM2OjE6ICggKCAoKSApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjExMDM3OjE6ICggKCkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTIzNzQ6MTogKCAoICgpICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTIzNzU6MTogKCAoKSApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMTAzNzoxOiAoICgpICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjExMDM4OjI6ICgpCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMjM3NToxOiAoICgpICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEyMzc2OjI6ICgpCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhBbmRFeHByZXNzaW9uQWNjZXNzKCkuZ2V0WEJpbmFyeU9wZXJhdGlvbkxlZnRPcGVyYW5kQWN0aW9uXzFfMF8wXzAoKSk7IAogICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTEwMzk6MjogKCkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjExMDM5OjM6IAorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTIzNzc6MjogKCkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEyMzc3OjM6IAogICAgICAgICAgICAgewogICAgICAgICAgICAgfQogCkBAIC0zNzIxNSwxNCArNDE2NzIsMTQgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YQW5kRXhwcmVzc2lvbl9fR3JvdXBfMV8wXzBfXzEiCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTEwNDc6MTogcnVsZV9fWEFuZEV4cHJlc3Npb25fX0dyb3VwXzFfMF8wX18xIDogcnVsZV9fWEFuZEV4cHJlc3Npb25fX0dyb3VwXzFfMF8wX18xX19JbXBsIDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMjM4NToxOiBydWxlX19YQW5kRXhwcmVzc2lvbl9fR3JvdXBfMV8wXzBfXzEgOiBydWxlX19YQW5kRXhwcmVzc2lvbl9fR3JvdXBfMV8wXzBfXzFfX0ltcGwgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1hBbmRFeHByZXNzaW9uX19Hcm91cF8xXzBfMF9fMSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMTA1MToxOiAoIHJ1bGVfX1hBbmRFeHByZXNzaW9uX19Hcm91cF8xXzBfMF9fMV9fSW1wbCApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMTA1MjoyOiBydWxlX19YQW5kRXhwcmVzc2lvbl9fR3JvdXBfMV8wXzBfXzFfX0ltcGwKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEyMzg5OjE6ICggcnVsZV9fWEFuZEV4cHJlc3Npb25fX0dyb3VwXzFfMF8wX18xX19JbXBsICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEyMzkwOjI6IHJ1bGVfX1hBbmRFeHByZXNzaW9uX19Hcm91cF8xXzBfMF9fMV9fSW1wbAogICAgICAgICAgICAgewogICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMik7CiAgICAgICAgICAgICBydWxlX19YQW5kRXhwcmVzc2lvbl9fR3JvdXBfMV8wXzBfXzFfX0ltcGwoKTsKQEAgLTM3MjQ4LDIzICs0MTcwNSwyMyBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX1hBbmRFeHByZXNzaW9uX19Hcm91cF8xXzBfMF9fMV9fSW1wbCIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMTA1ODoxOiBydWxlX19YQW5kRXhwcmVzc2lvbl9fR3JvdXBfMV8wXzBfXzFfX0ltcGwgOiAoICggcnVsZV9fWEFuZEV4cHJlc3Npb25fX0ZlYXR1cmVBc3NpZ25tZW50XzFfMF8wXzEgKSApIDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMjM5NjoxOiBydWxlX19YQW5kRXhwcmVzc2lvbl9fR3JvdXBfMV8wXzBfXzFfX0ltcGwgOiAoICggcnVsZV9fWEFuZEV4cHJlc3Npb25fX0ZlYXR1cmVBc3NpZ25tZW50XzFfMF8wXzEgKSApIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YQW5kRXhwcmVzc2lvbl9fR3JvdXBfMV8wXzBfXzFfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTEwNjI6MTogKCAoICggcnVsZV9fWEFuZEV4cHJlc3Npb25fX0ZlYXR1cmVBc3NpZ25tZW50XzFfMF8wXzEgKSApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjExMDYzOjE6ICggKCBydWxlX19YQW5kRXhwcmVzc2lvbl9fRmVhdHVyZUFzc2lnbm1lbnRfMV8wXzBfMSApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEyNDAwOjE6ICggKCAoIHJ1bGVfX1hBbmRFeHByZXNzaW9uX19GZWF0dXJlQXNzaWdubWVudF8xXzBfMF8xICkgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMjQwMToxOiAoICggcnVsZV9fWEFuZEV4cHJlc3Npb25fX0ZlYXR1cmVBc3NpZ25tZW50XzFfMF8wXzEgKSApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMTA2MzoxOiAoICggcnVsZV9fWEFuZEV4cHJlc3Npb25fX0ZlYXR1cmVBc3NpZ25tZW50XzFfMF8wXzEgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMTA2NDoyOiAoIHJ1bGVfX1hBbmRFeHByZXNzaW9uX19GZWF0dXJlQXNzaWdubWVudF8xXzBfMF8xICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEyNDAxOjE6ICggKCBydWxlX19YQW5kRXhwcmVzc2lvbl9fRmVhdHVyZUFzc2lnbm1lbnRfMV8wXzBfMSApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEyNDAyOjI6ICggcnVsZV9fWEFuZEV4cHJlc3Npb25fX0ZlYXR1cmVBc3NpZ25tZW50XzFfMF8wXzEgKQogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYQW5kRXhwcmVzc2lvbkFjY2VzcygpLmdldEZlYXR1cmVBc3NpZ25tZW50XzFfMF8wXzEoKSk7IAogICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTEwNjU6MjogKCBydWxlX19YQW5kRXhwcmVzc2lvbl9fRmVhdHVyZUFzc2lnbm1lbnRfMV8wXzBfMSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMTA2NTozOiBydWxlX19YQW5kRXhwcmVzc2lvbl9fRmVhdHVyZUFzc2lnbm1lbnRfMV8wXzBfMQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTI0MDM6MjogKCBydWxlX19YQW5kRXhwcmVzc2lvbl9fRmVhdHVyZUFzc2lnbm1lbnRfMV8wXzBfMSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMjQwMzozOiBydWxlX19YQW5kRXhwcmVzc2lvbl9fRmVhdHVyZUFzc2lnbm1lbnRfMV8wXzBfMQogICAgICAgICAgICAgewogICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMik7CiAgICAgICAgICAgICBydWxlX19YQW5kRXhwcmVzc2lvbl9fRmVhdHVyZUFzc2lnbm1lbnRfMV8wXzBfMSgpOwpAQCAtMzcyOTksMTYgKzQxNzU2LDE2IEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fWEVxdWFsaXR5RXhwcmVzc2lvbl9fR3JvdXBfXzAiCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTEwNzQ6MTogcnVsZV9fWEVxdWFsaXR5RXhwcmVzc2lvbl9fR3JvdXBfXzAgOiBydWxlX19YRXF1YWxpdHlFeHByZXNzaW9uX19Hcm91cF9fMF9fSW1wbCBydWxlX19YRXF1YWxpdHlFeHByZXNzaW9uX19Hcm91cF9fMSA7CisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTI0MTI6MTogcnVsZV9fWEVxdWFsaXR5RXhwcmVzc2lvbl9fR3JvdXBfXzAgOiBydWxlX19YRXF1YWxpdHlFeHByZXNzaW9uX19Hcm91cF9fMF9fSW1wbCBydWxlX19YRXF1YWxpdHlFeHByZXNzaW9uX19Hcm91cF9fMSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fWEVxdWFsaXR5RXhwcmVzc2lvbl9fR3JvdXBfXzAoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTEwNzg6MTogKCBydWxlX19YRXF1YWxpdHlFeHByZXNzaW9uX19Hcm91cF9fMF9fSW1wbCBydWxlX19YRXF1YWxpdHlFeHByZXNzaW9uX19Hcm91cF9fMSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMTA3OToyOiBydWxlX19YRXF1YWxpdHlFeHByZXNzaW9uX19Hcm91cF9fMF9fSW1wbCBydWxlX19YRXF1YWxpdHlFeHByZXNzaW9uX19Hcm91cF9fMQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTI0MTY6MTogKCBydWxlX19YRXF1YWxpdHlFeHByZXNzaW9uX19Hcm91cF9fMF9fSW1wbCBydWxlX19YRXF1YWxpdHlFeHByZXNzaW9uX19Hcm91cF9fMSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMjQxNzoyOiBydWxlX19YRXF1YWxpdHlFeHByZXNzaW9uX19Hcm91cF9fMF9fSW1wbCBydWxlX19YRXF1YWxpdHlFeHByZXNzaW9uX19Hcm91cF9fMQogICAgICAgICAgICAgewotICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfODcpOworICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfOTUpOwogICAgICAgICAgICAgcnVsZV9fWEVxdWFsaXR5RXhwcmVzc2lvbl9fR3JvdXBfXzBfX0ltcGwoKTsKIAogICAgICAgICAgICAgc3RhdGUuX2ZzcC0tOwpAQCAtMzczMzcsMTcgKzQxNzk0LDE3IEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fWEVxdWFsaXR5RXhwcmVzc2lvbl9fR3JvdXBfXzBfX0ltcGwiCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTEwODY6MTogcnVsZV9fWEVxdWFsaXR5RXhwcmVzc2lvbl9fR3JvdXBfXzBfX0ltcGwgOiAoIHJ1bGVYUmVsYXRpb25hbEV4cHJlc3Npb24gKSA7CisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTI0MjQ6MTogcnVsZV9fWEVxdWFsaXR5RXhwcmVzc2lvbl9fR3JvdXBfXzBfX0ltcGwgOiAoIHJ1bGVYUmVsYXRpb25hbEV4cHJlc3Npb24gKSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fWEVxdWFsaXR5RXhwcmVzc2lvbl9fR3JvdXBfXzBfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTEwOTA6MTogKCAoIHJ1bGVYUmVsYXRpb25hbEV4cHJlc3Npb24gKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMTA5MToxOiAoIHJ1bGVYUmVsYXRpb25hbEV4cHJlc3Npb24gKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTI0Mjg6MTogKCAoIHJ1bGVYUmVsYXRpb25hbEV4cHJlc3Npb24gKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMjQyOToxOiAoIHJ1bGVYUmVsYXRpb25hbEV4cHJlc3Npb24gKQogICAgICAgICAgICAgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTEwOTE6MTogKCBydWxlWFJlbGF0aW9uYWxFeHByZXNzaW9uICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjExMDkyOjI6IHJ1bGVYUmVsYXRpb25hbEV4cHJlc3Npb24KKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEyNDI5OjE6ICggcnVsZVhSZWxhdGlvbmFsRXhwcmVzc2lvbiApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMjQzMDoyOiBydWxlWFJlbGF0aW9uYWxFeHByZXNzaW9uCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhFcXVhbGl0eUV4cHJlc3Npb25BY2Nlc3MoKS5nZXRYUmVsYXRpb25hbEV4cHJlc3Npb25QYXJzZXJSdWxlQ2FsbF8wKCkpOyAKQEAgLTM3MzgyLDE0ICs0MTgzOSwxNCBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX1hFcXVhbGl0eUV4cHJlc3Npb25fX0dyb3VwX18xIgotICAgIC8vIEludGVybmFsRGF0YURTTC5nOjExMTAxOjE6IHJ1bGVfX1hFcXVhbGl0eUV4cHJlc3Npb25fX0dyb3VwX18xIDogcnVsZV9fWEVxdWFsaXR5RXhwcmVzc2lvbl9fR3JvdXBfXzFfX0ltcGwgOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEyNDM5OjE6IHJ1bGVfX1hFcXVhbGl0eUV4cHJlc3Npb25fX0dyb3VwX18xIDogcnVsZV9fWEVxdWFsaXR5RXhwcmVzc2lvbl9fR3JvdXBfXzFfX0ltcGwgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1hFcXVhbGl0eUV4cHJlc3Npb25fX0dyb3VwX18xKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjExMTA1OjE6ICggcnVsZV9fWEVxdWFsaXR5RXhwcmVzc2lvbl9fR3JvdXBfXzFfX0ltcGwgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTExMDY6MjogcnVsZV9fWEVxdWFsaXR5RXhwcmVzc2lvbl9fR3JvdXBfXzFfX0ltcGwKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEyNDQzOjE6ICggcnVsZV9fWEVxdWFsaXR5RXhwcmVzc2lvbl9fR3JvdXBfXzFfX0ltcGwgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTI0NDQ6MjogcnVsZV9fWEVxdWFsaXR5RXhwcmVzc2lvbl9fR3JvdXBfXzFfX0ltcGwKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzIpOwogICAgICAgICAgICAgcnVsZV9fWEVxdWFsaXR5RXhwcmVzc2lvbl9fR3JvdXBfXzFfX0ltcGwoKTsKQEAgLTM3NDE1LDMyICs0MTg3MiwzMiBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX1hFcXVhbGl0eUV4cHJlc3Npb25fX0dyb3VwX18xX19JbXBsIgotICAgIC8vIEludGVybmFsRGF0YURTTC5nOjExMTEyOjE6IHJ1bGVfX1hFcXVhbGl0eUV4cHJlc3Npb25fX0dyb3VwX18xX19JbXBsIDogKCAoIHJ1bGVfX1hFcXVhbGl0eUV4cHJlc3Npb25fX0dyb3VwXzFfXzAgKSogKSA7CisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTI0NTA6MTogcnVsZV9fWEVxdWFsaXR5RXhwcmVzc2lvbl9fR3JvdXBfXzFfX0ltcGwgOiAoICggcnVsZV9fWEVxdWFsaXR5RXhwcmVzc2lvbl9fR3JvdXBfMV9fMCApKiApIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YRXF1YWxpdHlFeHByZXNzaW9uX19Hcm91cF9fMV9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMTExNjoxOiAoICggKCBydWxlX19YRXF1YWxpdHlFeHByZXNzaW9uX19Hcm91cF8xX18wICkqICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTExMTc6MTogKCAoIHJ1bGVfX1hFcXVhbGl0eUV4cHJlc3Npb25fX0dyb3VwXzFfXzAgKSogKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTI0NTQ6MTogKCAoICggcnVsZV9fWEVxdWFsaXR5RXhwcmVzc2lvbl9fR3JvdXBfMV9fMCApKiApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEyNDU1OjE6ICggKCBydWxlX19YRXF1YWxpdHlFeHByZXNzaW9uX19Hcm91cF8xX18wICkqICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjExMTE3OjE6ICggKCBydWxlX19YRXF1YWxpdHlFeHByZXNzaW9uX19Hcm91cF8xX18wICkqICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjExMTE4OjI6ICggcnVsZV9fWEVxdWFsaXR5RXhwcmVzc2lvbl9fR3JvdXBfMV9fMCApKgorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTI0NTU6MTogKCAoIHJ1bGVfX1hFcXVhbGl0eUV4cHJlc3Npb25fX0dyb3VwXzFfXzAgKSogKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTI0NTY6MjogKCBydWxlX19YRXF1YWxpdHlFeHByZXNzaW9uX19Hcm91cF8xX18wICkqCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhFcXVhbGl0eUV4cHJlc3Npb25BY2Nlc3MoKS5nZXRHcm91cF8xKCkpOyAKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjExMTE5OjI6ICggcnVsZV9fWEVxdWFsaXR5RXhwcmVzc2lvbl9fR3JvdXBfMV9fMCApKgotICAgICAgICAgICAgbG9vcDk5OgorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTI0NTc6MjogKCBydWxlX19YRXF1YWxpdHlFeHByZXNzaW9uX19Hcm91cF8xX18wICkqCisgICAgICAgICAgICBsb29wMTEyOgogICAgICAgICAgICAgZG8gewotICAgICAgICAgICAgICAgIGludCBhbHQ5OT0yOworICAgICAgICAgICAgICAgIGludCBhbHQxMTI9MjsKICAgICAgICAgICAgICAgICBzd2l0Y2ggKCBpbnB1dC5MQSgxKSApIHsKICAgICAgICAgICAgICAgICBjYXNlIDIxOgogICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGludCBMQTk5XzIgPSBpbnB1dC5MQSgyKTsKKyAgICAgICAgICAgICAgICAgICAgaW50IExBMTEyXzIgPSBpbnB1dC5MQSgyKTsKIAotICAgICAgICAgICAgICAgICAgICBpZiAoIChzeW5wcmVkMTUzX0ludGVybmFsRGF0YURTTCgpKSApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGFsdDk5PTE7CisgICAgICAgICAgICAgICAgICAgIGlmICggKHN5bnByZWQxNzJfSW50ZXJuYWxEYXRhRFNMKCkpICkgeworICAgICAgICAgICAgICAgICAgICAgICAgYWx0MTEyPTE7CiAgICAgICAgICAgICAgICAgICAgIH0KIAogCkBAIC0zNzQ0OCwxMCArNDE5MDUsMTAgQEAKICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgY2FzZSAyMjoKICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBpbnQgTEE5OV8zID0gaW5wdXQuTEEoMik7CisgICAgICAgICAgICAgICAgICAgIGludCBMQTExMl8zID0gaW5wdXQuTEEoMik7CiAKLSAgICAgICAgICAgICAgICAgICAgaWYgKCAoc3lucHJlZDE1M19JbnRlcm5hbERhdGFEU0woKSkgKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBhbHQ5OT0xOworICAgICAgICAgICAgICAgICAgICBpZiAoIChzeW5wcmVkMTcyX0ludGVybmFsRGF0YURTTCgpKSApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFsdDExMj0xOwogICAgICAgICAgICAgICAgICAgICB9CiAKIApAQCAtMzc0NTksMTAgKzQxOTE2LDEwIEBACiAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgIGNhc2UgMjM6CiAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgaW50IExBOTlfNCA9IGlucHV0LkxBKDIpOworICAgICAgICAgICAgICAgICAgICBpbnQgTEExMTJfNCA9IGlucHV0LkxBKDIpOwogCi0gICAgICAgICAgICAgICAgICAgIGlmICggKHN5bnByZWQxNTNfSW50ZXJuYWxEYXRhRFNMKCkpICkgewotICAgICAgICAgICAgICAgICAgICAgICAgYWx0OTk9MTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCAoc3lucHJlZDE3Ml9JbnRlcm5hbERhdGFEU0woKSkgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBhbHQxMTI9MTsKICAgICAgICAgICAgICAgICAgICAgfQogCiAKQEAgLTM3NDcwLDEwICs0MTkyNywxMCBAQAogICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICBjYXNlIDI0OgogICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGludCBMQTk5XzUgPSBpbnB1dC5MQSgyKTsKKyAgICAgICAgICAgICAgICAgICAgaW50IExBMTEyXzUgPSBpbnB1dC5MQSgyKTsKIAotICAgICAgICAgICAgICAgICAgICBpZiAoIChzeW5wcmVkMTUzX0ludGVybmFsRGF0YURTTCgpKSApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGFsdDk5PTE7CisgICAgICAgICAgICAgICAgICAgIGlmICggKHN5bnByZWQxNzJfSW50ZXJuYWxEYXRhRFNMKCkpICkgeworICAgICAgICAgICAgICAgICAgICAgICAgYWx0MTEyPTE7CiAgICAgICAgICAgICAgICAgICAgIH0KIAogCkBAIC0zNzQ4MiwxMSArNDE5MzksMTEgQEAKIAogICAgICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgICAgIHN3aXRjaCAoYWx0OTkpIHsKKyAgICAgICAgICAgICAgICBzd2l0Y2ggKGFsdDExMikgewogICAgICAgICAgICAgCWNhc2UgMSA6Ci0gICAgICAgICAgICAJICAgIC8vIEludGVybmFsRGF0YURTTC5nOjExMTE5OjM6IHJ1bGVfX1hFcXVhbGl0eUV4cHJlc3Npb25fX0dyb3VwXzFfXzAKKyAgICAgICAgICAgIAkgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTI0NTc6MzogcnVsZV9fWEVxdWFsaXR5RXhwcmVzc2lvbl9fR3JvdXBfMV9fMAogICAgICAgICAgICAgCSAgICB7Ci0gICAgICAgICAgICAJICAgIHB1c2hGb2xsb3coRk9MTE9XXzg4KTsKKyAgICAgICAgICAgIAkgICAgcHVzaEZvbGxvdyhGT0xMT1dfOTYpOwogICAgICAgICAgICAgCSAgICBydWxlX19YRXF1YWxpdHlFeHByZXNzaW9uX19Hcm91cF8xX18wKCk7CiAKICAgICAgICAgICAgIAkgICAgc3RhdGUuX2ZzcC0tOwpAQCAtMzc0OTYsNyArNDE5NTMsNyBAQAogICAgICAgICAgICAgCSAgICBicmVhazsKIAogICAgICAgICAgICAgCWRlZmF1bHQgOgotICAgICAgICAgICAgCSAgICBicmVhayBsb29wOTk7CisgICAgICAgICAgICAJICAgIGJyZWFrIGxvb3AxMTI7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfSB3aGlsZSAodHJ1ZSk7CiAKQEAgLTM3NTI1LDE2ICs0MTk4MiwxNiBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX1hFcXVhbGl0eUV4cHJlc3Npb25fX0dyb3VwXzFfXzAiCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTExMjg6MTogcnVsZV9fWEVxdWFsaXR5RXhwcmVzc2lvbl9fR3JvdXBfMV9fMCA6IHJ1bGVfX1hFcXVhbGl0eUV4cHJlc3Npb25fX0dyb3VwXzFfXzBfX0ltcGwgcnVsZV9fWEVxdWFsaXR5RXhwcmVzc2lvbl9fR3JvdXBfMV9fMSA7CisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTI0NjY6MTogcnVsZV9fWEVxdWFsaXR5RXhwcmVzc2lvbl9fR3JvdXBfMV9fMCA6IHJ1bGVfX1hFcXVhbGl0eUV4cHJlc3Npb25fX0dyb3VwXzFfXzBfX0ltcGwgcnVsZV9fWEVxdWFsaXR5RXhwcmVzc2lvbl9fR3JvdXBfMV9fMSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fWEVxdWFsaXR5RXhwcmVzc2lvbl9fR3JvdXBfMV9fMCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMTEzMjoxOiAoIHJ1bGVfX1hFcXVhbGl0eUV4cHJlc3Npb25fX0dyb3VwXzFfXzBfX0ltcGwgcnVsZV9fWEVxdWFsaXR5RXhwcmVzc2lvbl9fR3JvdXBfMV9fMSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMTEzMzoyOiBydWxlX19YRXF1YWxpdHlFeHByZXNzaW9uX19Hcm91cF8xX18wX19JbXBsIHJ1bGVfX1hFcXVhbGl0eUV4cHJlc3Npb25fX0dyb3VwXzFfXzEKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEyNDcwOjE6ICggcnVsZV9fWEVxdWFsaXR5RXhwcmVzc2lvbl9fR3JvdXBfMV9fMF9fSW1wbCBydWxlX19YRXF1YWxpdHlFeHByZXNzaW9uX19Hcm91cF8xX18xICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEyNDcxOjI6IHJ1bGVfX1hFcXVhbGl0eUV4cHJlc3Npb25fX0dyb3VwXzFfXzBfX0ltcGwgcnVsZV9fWEVxdWFsaXR5RXhwcmVzc2lvbl9fR3JvdXBfMV9fMQogICAgICAgICAgICAgewotICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfNzQpOworICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfODIpOwogICAgICAgICAgICAgcnVsZV9fWEVxdWFsaXR5RXhwcmVzc2lvbl9fR3JvdXBfMV9fMF9fSW1wbCgpOwogCiAgICAgICAgICAgICBzdGF0ZS5fZnNwLS07CkBAIC0zNzU2MywyMyArNDIwMjAsMjMgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YRXF1YWxpdHlFeHByZXNzaW9uX19Hcm91cF8xX18wX19JbXBsIgotICAgIC8vIEludGVybmFsRGF0YURTTC5nOjExMTQwOjE6IHJ1bGVfX1hFcXVhbGl0eUV4cHJlc3Npb25fX0dyb3VwXzFfXzBfX0ltcGwgOiAoICggcnVsZV9fWEVxdWFsaXR5RXhwcmVzc2lvbl9fR3JvdXBfMV8wX18wICkgKSA7CisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTI0Nzg6MTogcnVsZV9fWEVxdWFsaXR5RXhwcmVzc2lvbl9fR3JvdXBfMV9fMF9fSW1wbCA6ICggKCBydWxlX19YRXF1YWxpdHlFeHByZXNzaW9uX19Hcm91cF8xXzBfXzAgKSApIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YRXF1YWxpdHlFeHByZXNzaW9uX19Hcm91cF8xX18wX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjExMTQ0OjE6ICggKCAoIHJ1bGVfX1hFcXVhbGl0eUV4cHJlc3Npb25fX0dyb3VwXzFfMF9fMCApICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTExNDU6MTogKCAoIHJ1bGVfX1hFcXVhbGl0eUV4cHJlc3Npb25fX0dyb3VwXzFfMF9fMCApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEyNDgyOjE6ICggKCAoIHJ1bGVfX1hFcXVhbGl0eUV4cHJlc3Npb25fX0dyb3VwXzFfMF9fMCApICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTI0ODM6MTogKCAoIHJ1bGVfX1hFcXVhbGl0eUV4cHJlc3Npb25fX0dyb3VwXzFfMF9fMCApICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjExMTQ1OjE6ICggKCBydWxlX19YRXF1YWxpdHlFeHByZXNzaW9uX19Hcm91cF8xXzBfXzAgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMTE0NjoyOiAoIHJ1bGVfX1hFcXVhbGl0eUV4cHJlc3Npb25fX0dyb3VwXzFfMF9fMCApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMjQ4MzoxOiAoICggcnVsZV9fWEVxdWFsaXR5RXhwcmVzc2lvbl9fR3JvdXBfMV8wX18wICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTI0ODQ6MjogKCBydWxlX19YRXF1YWxpdHlFeHByZXNzaW9uX19Hcm91cF8xXzBfXzAgKQogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYRXF1YWxpdHlFeHByZXNzaW9uQWNjZXNzKCkuZ2V0R3JvdXBfMV8wKCkpOyAKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjExMTQ3OjI6ICggcnVsZV9fWEVxdWFsaXR5RXhwcmVzc2lvbl9fR3JvdXBfMV8wX18wICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjExMTQ3OjM6IHJ1bGVfX1hFcXVhbGl0eUV4cHJlc3Npb25fX0dyb3VwXzFfMF9fMAorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTI0ODU6MjogKCBydWxlX19YRXF1YWxpdHlFeHByZXNzaW9uX19Hcm91cF8xXzBfXzAgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTI0ODU6MzogcnVsZV9fWEVxdWFsaXR5RXhwcmVzc2lvbl9fR3JvdXBfMV8wX18wCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV18yKTsKICAgICAgICAgICAgIHJ1bGVfX1hFcXVhbGl0eUV4cHJlc3Npb25fX0dyb3VwXzFfMF9fMCgpOwpAQCAtMzc2MTQsMTQgKzQyMDcxLDE0IEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fWEVxdWFsaXR5RXhwcmVzc2lvbl9fR3JvdXBfMV9fMSIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMTE1NToxOiBydWxlX19YRXF1YWxpdHlFeHByZXNzaW9uX19Hcm91cF8xX18xIDogcnVsZV9fWEVxdWFsaXR5RXhwcmVzc2lvbl9fR3JvdXBfMV9fMV9fSW1wbCA7CisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTI0OTM6MTogcnVsZV9fWEVxdWFsaXR5RXhwcmVzc2lvbl9fR3JvdXBfMV9fMSA6IHJ1bGVfX1hFcXVhbGl0eUV4cHJlc3Npb25fX0dyb3VwXzFfXzFfX0ltcGwgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1hFcXVhbGl0eUV4cHJlc3Npb25fX0dyb3VwXzFfXzEoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTExNTk6MTogKCBydWxlX19YRXF1YWxpdHlFeHByZXNzaW9uX19Hcm91cF8xX18xX19JbXBsICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjExMTYwOjI6IHJ1bGVfX1hFcXVhbGl0eUV4cHJlc3Npb25fX0dyb3VwXzFfXzFfX0ltcGwKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEyNDk3OjE6ICggcnVsZV9fWEVxdWFsaXR5RXhwcmVzc2lvbl9fR3JvdXBfMV9fMV9fSW1wbCApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMjQ5ODoyOiBydWxlX19YRXF1YWxpdHlFeHByZXNzaW9uX19Hcm91cF8xX18xX19JbXBsCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV18yKTsKICAgICAgICAgICAgIHJ1bGVfX1hFcXVhbGl0eUV4cHJlc3Npb25fX0dyb3VwXzFfXzFfX0ltcGwoKTsKQEAgLTM3NjQ3LDIzICs0MjEwNCwyMyBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX1hFcXVhbGl0eUV4cHJlc3Npb25fX0dyb3VwXzFfXzFfX0ltcGwiCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTExNjY6MTogcnVsZV9fWEVxdWFsaXR5RXhwcmVzc2lvbl9fR3JvdXBfMV9fMV9fSW1wbCA6ICggKCBydWxlX19YRXF1YWxpdHlFeHByZXNzaW9uX19SaWdodE9wZXJhbmRBc3NpZ25tZW50XzFfMSApICkgOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEyNTA0OjE6IHJ1bGVfX1hFcXVhbGl0eUV4cHJlc3Npb25fX0dyb3VwXzFfXzFfX0ltcGwgOiAoICggcnVsZV9fWEVxdWFsaXR5RXhwcmVzc2lvbl9fUmlnaHRPcGVyYW5kQXNzaWdubWVudF8xXzEgKSApIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YRXF1YWxpdHlFeHByZXNzaW9uX19Hcm91cF8xX18xX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjExMTcwOjE6ICggKCAoIHJ1bGVfX1hFcXVhbGl0eUV4cHJlc3Npb25fX1JpZ2h0T3BlcmFuZEFzc2lnbm1lbnRfMV8xICkgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMTE3MToxOiAoICggcnVsZV9fWEVxdWFsaXR5RXhwcmVzc2lvbl9fUmlnaHRPcGVyYW5kQXNzaWdubWVudF8xXzEgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMjUwODoxOiAoICggKCBydWxlX19YRXF1YWxpdHlFeHByZXNzaW9uX19SaWdodE9wZXJhbmRBc3NpZ25tZW50XzFfMSApICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTI1MDk6MTogKCAoIHJ1bGVfX1hFcXVhbGl0eUV4cHJlc3Npb25fX1JpZ2h0T3BlcmFuZEFzc2lnbm1lbnRfMV8xICkgKQogICAgICAgICAgICAgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTExNzE6MTogKCAoIHJ1bGVfX1hFcXVhbGl0eUV4cHJlc3Npb25fX1JpZ2h0T3BlcmFuZEFzc2lnbm1lbnRfMV8xICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTExNzI6MjogKCBydWxlX19YRXF1YWxpdHlFeHByZXNzaW9uX19SaWdodE9wZXJhbmRBc3NpZ25tZW50XzFfMSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMjUwOToxOiAoICggcnVsZV9fWEVxdWFsaXR5RXhwcmVzc2lvbl9fUmlnaHRPcGVyYW5kQXNzaWdubWVudF8xXzEgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMjUxMDoyOiAoIHJ1bGVfX1hFcXVhbGl0eUV4cHJlc3Npb25fX1JpZ2h0T3BlcmFuZEFzc2lnbm1lbnRfMV8xICkKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WEVxdWFsaXR5RXhwcmVzc2lvbkFjY2VzcygpLmdldFJpZ2h0T3BlcmFuZEFzc2lnbm1lbnRfMV8xKCkpOyAKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjExMTczOjI6ICggcnVsZV9fWEVxdWFsaXR5RXhwcmVzc2lvbl9fUmlnaHRPcGVyYW5kQXNzaWdubWVudF8xXzEgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTExNzM6MzogcnVsZV9fWEVxdWFsaXR5RXhwcmVzc2lvbl9fUmlnaHRPcGVyYW5kQXNzaWdubWVudF8xXzEKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEyNTExOjI6ICggcnVsZV9fWEVxdWFsaXR5RXhwcmVzc2lvbl9fUmlnaHRPcGVyYW5kQXNzaWdubWVudF8xXzEgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTI1MTE6MzogcnVsZV9fWEVxdWFsaXR5RXhwcmVzc2lvbl9fUmlnaHRPcGVyYW5kQXNzaWdubWVudF8xXzEKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzIpOwogICAgICAgICAgICAgcnVsZV9fWEVxdWFsaXR5RXhwcmVzc2lvbl9fUmlnaHRPcGVyYW5kQXNzaWdubWVudF8xXzEoKTsKQEAgLTM3Njk4LDE0ICs0MjE1NSwxNCBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX1hFcXVhbGl0eUV4cHJlc3Npb25fX0dyb3VwXzFfMF9fMCIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMTE4MjoxOiBydWxlX19YRXF1YWxpdHlFeHByZXNzaW9uX19Hcm91cF8xXzBfXzAgOiBydWxlX19YRXF1YWxpdHlFeHByZXNzaW9uX19Hcm91cF8xXzBfXzBfX0ltcGwgOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEyNTIwOjE6IHJ1bGVfX1hFcXVhbGl0eUV4cHJlc3Npb25fX0dyb3VwXzFfMF9fMCA6IHJ1bGVfX1hFcXVhbGl0eUV4cHJlc3Npb25fX0dyb3VwXzFfMF9fMF9fSW1wbCA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fWEVxdWFsaXR5RXhwcmVzc2lvbl9fR3JvdXBfMV8wX18wKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjExMTg2OjE6ICggcnVsZV9fWEVxdWFsaXR5RXhwcmVzc2lvbl9fR3JvdXBfMV8wX18wX19JbXBsICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjExMTg3OjI6IHJ1bGVfX1hFcXVhbGl0eUV4cHJlc3Npb25fX0dyb3VwXzFfMF9fMF9fSW1wbAorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTI1MjQ6MTogKCBydWxlX19YRXF1YWxpdHlFeHByZXNzaW9uX19Hcm91cF8xXzBfXzBfX0ltcGwgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTI1MjU6MjogcnVsZV9fWEVxdWFsaXR5RXhwcmVzc2lvbl9fR3JvdXBfMV8wX18wX19JbXBsCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV18yKTsKICAgICAgICAgICAgIHJ1bGVfX1hFcXVhbGl0eUV4cHJlc3Npb25fX0dyb3VwXzFfMF9fMF9fSW1wbCgpOwpAQCAtMzc3MzEsMjMgKzQyMTg4LDIzIEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fWEVxdWFsaXR5RXhwcmVzc2lvbl9fR3JvdXBfMV8wX18wX19JbXBsIgotICAgIC8vIEludGVybmFsRGF0YURTTC5nOjExMTkzOjE6IHJ1bGVfX1hFcXVhbGl0eUV4cHJlc3Npb25fX0dyb3VwXzFfMF9fMF9fSW1wbCA6ICggKCBydWxlX19YRXF1YWxpdHlFeHByZXNzaW9uX19Hcm91cF8xXzBfMF9fMCApICkgOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEyNTMxOjE6IHJ1bGVfX1hFcXVhbGl0eUV4cHJlc3Npb25fX0dyb3VwXzFfMF9fMF9fSW1wbCA6ICggKCBydWxlX19YRXF1YWxpdHlFeHByZXNzaW9uX19Hcm91cF8xXzBfMF9fMCApICkgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1hFcXVhbGl0eUV4cHJlc3Npb25fX0dyb3VwXzFfMF9fMF9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMTE5NzoxOiAoICggKCBydWxlX19YRXF1YWxpdHlFeHByZXNzaW9uX19Hcm91cF8xXzBfMF9fMCApICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTExOTg6MTogKCAoIHJ1bGVfX1hFcXVhbGl0eUV4cHJlc3Npb25fX0dyb3VwXzFfMF8wX18wICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTI1MzU6MTogKCAoICggcnVsZV9fWEVxdWFsaXR5RXhwcmVzc2lvbl9fR3JvdXBfMV8wXzBfXzAgKSApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEyNTM2OjE6ICggKCBydWxlX19YRXF1YWxpdHlFeHByZXNzaW9uX19Hcm91cF8xXzBfMF9fMCApICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjExMTk4OjE6ICggKCBydWxlX19YRXF1YWxpdHlFeHByZXNzaW9uX19Hcm91cF8xXzBfMF9fMCApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjExMTk5OjI6ICggcnVsZV9fWEVxdWFsaXR5RXhwcmVzc2lvbl9fR3JvdXBfMV8wXzBfXzAgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTI1MzY6MTogKCAoIHJ1bGVfX1hFcXVhbGl0eUV4cHJlc3Npb25fX0dyb3VwXzFfMF8wX18wICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTI1Mzc6MjogKCBydWxlX19YRXF1YWxpdHlFeHByZXNzaW9uX19Hcm91cF8xXzBfMF9fMCApCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhFcXVhbGl0eUV4cHJlc3Npb25BY2Nlc3MoKS5nZXRHcm91cF8xXzBfMCgpKTsgCiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMTIwMDoyOiAoIHJ1bGVfX1hFcXVhbGl0eUV4cHJlc3Npb25fX0dyb3VwXzFfMF8wX18wICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjExMjAwOjM6IHJ1bGVfX1hFcXVhbGl0eUV4cHJlc3Npb25fX0dyb3VwXzFfMF8wX18wCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMjUzODoyOiAoIHJ1bGVfX1hFcXVhbGl0eUV4cHJlc3Npb25fX0dyb3VwXzFfMF8wX18wICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEyNTM4OjM6IHJ1bGVfX1hFcXVhbGl0eUV4cHJlc3Npb25fX0dyb3VwXzFfMF8wX18wCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV18yKTsKICAgICAgICAgICAgIHJ1bGVfX1hFcXVhbGl0eUV4cHJlc3Npb25fX0dyb3VwXzFfMF8wX18wKCk7CkBAIC0zNzc4MiwxNiArNDIyMzksMTYgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YRXF1YWxpdHlFeHByZXNzaW9uX19Hcm91cF8xXzBfMF9fMCIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMTIwOToxOiBydWxlX19YRXF1YWxpdHlFeHByZXNzaW9uX19Hcm91cF8xXzBfMF9fMCA6IHJ1bGVfX1hFcXVhbGl0eUV4cHJlc3Npb25fX0dyb3VwXzFfMF8wX18wX19JbXBsIHJ1bGVfX1hFcXVhbGl0eUV4cHJlc3Npb25fX0dyb3VwXzFfMF8wX18xIDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMjU0NzoxOiBydWxlX19YRXF1YWxpdHlFeHByZXNzaW9uX19Hcm91cF8xXzBfMF9fMCA6IHJ1bGVfX1hFcXVhbGl0eUV4cHJlc3Npb25fX0dyb3VwXzFfMF8wX18wX19JbXBsIHJ1bGVfX1hFcXVhbGl0eUV4cHJlc3Npb25fX0dyb3VwXzFfMF8wX18xIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YRXF1YWxpdHlFeHByZXNzaW9uX19Hcm91cF8xXzBfMF9fMCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMTIxMzoxOiAoIHJ1bGVfX1hFcXVhbGl0eUV4cHJlc3Npb25fX0dyb3VwXzFfMF8wX18wX19JbXBsIHJ1bGVfX1hFcXVhbGl0eUV4cHJlc3Npb25fX0dyb3VwXzFfMF8wX18xICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjExMjE0OjI6IHJ1bGVfX1hFcXVhbGl0eUV4cHJlc3Npb25fX0dyb3VwXzFfMF8wX18wX19JbXBsIHJ1bGVfX1hFcXVhbGl0eUV4cHJlc3Npb25fX0dyb3VwXzFfMF8wX18xCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMjU1MToxOiAoIHJ1bGVfX1hFcXVhbGl0eUV4cHJlc3Npb25fX0dyb3VwXzFfMF8wX18wX19JbXBsIHJ1bGVfX1hFcXVhbGl0eUV4cHJlc3Npb25fX0dyb3VwXzFfMF8wX18xICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEyNTUyOjI6IHJ1bGVfX1hFcXVhbGl0eUV4cHJlc3Npb25fX0dyb3VwXzFfMF8wX18wX19JbXBsIHJ1bGVfX1hFcXVhbGl0eUV4cHJlc3Npb25fX0dyb3VwXzFfMF8wX18xCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV184Nyk7CisgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV185NSk7CiAgICAgICAgICAgICBydWxlX19YRXF1YWxpdHlFeHByZXNzaW9uX19Hcm91cF8xXzBfMF9fMF9fSW1wbCgpOwogCiAgICAgICAgICAgICBzdGF0ZS5fZnNwLS07CkBAIC0zNzgyMCwyMyArNDIyNzcsMjMgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YRXF1YWxpdHlFeHByZXNzaW9uX19Hcm91cF8xXzBfMF9fMF9fSW1wbCIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMTIyMToxOiBydWxlX19YRXF1YWxpdHlFeHByZXNzaW9uX19Hcm91cF8xXzBfMF9fMF9fSW1wbCA6ICggKCkgKSA7CisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTI1NTk6MTogcnVsZV9fWEVxdWFsaXR5RXhwcmVzc2lvbl9fR3JvdXBfMV8wXzBfXzBfX0ltcGwgOiAoICgpICkgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1hFcXVhbGl0eUV4cHJlc3Npb25fX0dyb3VwXzFfMF8wX18wX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjExMjI1OjE6ICggKCAoKSApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjExMjI2OjE6ICggKCkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTI1NjM6MTogKCAoICgpICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTI1NjQ6MTogKCAoKSApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMTIyNjoxOiAoICgpICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjExMjI3OjI6ICgpCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMjU2NDoxOiAoICgpICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEyNTY1OjI6ICgpCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhFcXVhbGl0eUV4cHJlc3Npb25BY2Nlc3MoKS5nZXRYQmluYXJ5T3BlcmF0aW9uTGVmdE9wZXJhbmRBY3Rpb25fMV8wXzBfMCgpKTsgCiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMTIyODoyOiAoKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTEyMjg6MzogCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMjU2NjoyOiAoKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTI1NjY6MzogCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICB9CiAKQEAgLTM3ODYxLDE0ICs0MjMxOCwxNCBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX1hFcXVhbGl0eUV4cHJlc3Npb25fX0dyb3VwXzFfMF8wX18xIgotICAgIC8vIEludGVybmFsRGF0YURTTC5nOjExMjM2OjE6IHJ1bGVfX1hFcXVhbGl0eUV4cHJlc3Npb25fX0dyb3VwXzFfMF8wX18xIDogcnVsZV9fWEVxdWFsaXR5RXhwcmVzc2lvbl9fR3JvdXBfMV8wXzBfXzFfX0ltcGwgOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEyNTc0OjE6IHJ1bGVfX1hFcXVhbGl0eUV4cHJlc3Npb25fX0dyb3VwXzFfMF8wX18xIDogcnVsZV9fWEVxdWFsaXR5RXhwcmVzc2lvbl9fR3JvdXBfMV8wXzBfXzFfX0ltcGwgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1hFcXVhbGl0eUV4cHJlc3Npb25fX0dyb3VwXzFfMF8wX18xKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjExMjQwOjE6ICggcnVsZV9fWEVxdWFsaXR5RXhwcmVzc2lvbl9fR3JvdXBfMV8wXzBfXzFfX0ltcGwgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTEyNDE6MjogcnVsZV9fWEVxdWFsaXR5RXhwcmVzc2lvbl9fR3JvdXBfMV8wXzBfXzFfX0ltcGwKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEyNTc4OjE6ICggcnVsZV9fWEVxdWFsaXR5RXhwcmVzc2lvbl9fR3JvdXBfMV8wXzBfXzFfX0ltcGwgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTI1Nzk6MjogcnVsZV9fWEVxdWFsaXR5RXhwcmVzc2lvbl9fR3JvdXBfMV8wXzBfXzFfX0ltcGwKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzIpOwogICAgICAgICAgICAgcnVsZV9fWEVxdWFsaXR5RXhwcmVzc2lvbl9fR3JvdXBfMV8wXzBfXzFfX0ltcGwoKTsKQEAgLTM3ODk0LDIzICs0MjM1MSwyMyBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX1hFcXVhbGl0eUV4cHJlc3Npb25fX0dyb3VwXzFfMF8wX18xX19JbXBsIgotICAgIC8vIEludGVybmFsRGF0YURTTC5nOjExMjQ3OjE6IHJ1bGVfX1hFcXVhbGl0eUV4cHJlc3Npb25fX0dyb3VwXzFfMF8wX18xX19JbXBsIDogKCAoIHJ1bGVfX1hFcXVhbGl0eUV4cHJlc3Npb25fX0ZlYXR1cmVBc3NpZ25tZW50XzFfMF8wXzEgKSApIDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMjU4NToxOiBydWxlX19YRXF1YWxpdHlFeHByZXNzaW9uX19Hcm91cF8xXzBfMF9fMV9fSW1wbCA6ICggKCBydWxlX19YRXF1YWxpdHlFeHByZXNzaW9uX19GZWF0dXJlQXNzaWdubWVudF8xXzBfMF8xICkgKSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fWEVxdWFsaXR5RXhwcmVzc2lvbl9fR3JvdXBfMV8wXzBfXzFfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTEyNTE6MTogKCAoICggcnVsZV9fWEVxdWFsaXR5RXhwcmVzc2lvbl9fRmVhdHVyZUFzc2lnbm1lbnRfMV8wXzBfMSApICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTEyNTI6MTogKCAoIHJ1bGVfX1hFcXVhbGl0eUV4cHJlc3Npb25fX0ZlYXR1cmVBc3NpZ25tZW50XzFfMF8wXzEgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMjU4OToxOiAoICggKCBydWxlX19YRXF1YWxpdHlFeHByZXNzaW9uX19GZWF0dXJlQXNzaWdubWVudF8xXzBfMF8xICkgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMjU5MDoxOiAoICggcnVsZV9fWEVxdWFsaXR5RXhwcmVzc2lvbl9fRmVhdHVyZUFzc2lnbm1lbnRfMV8wXzBfMSApICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjExMjUyOjE6ICggKCBydWxlX19YRXF1YWxpdHlFeHByZXNzaW9uX19GZWF0dXJlQXNzaWdubWVudF8xXzBfMF8xICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTEyNTM6MjogKCBydWxlX19YRXF1YWxpdHlFeHByZXNzaW9uX19GZWF0dXJlQXNzaWdubWVudF8xXzBfMF8xICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEyNTkwOjE6ICggKCBydWxlX19YRXF1YWxpdHlFeHByZXNzaW9uX19GZWF0dXJlQXNzaWdubWVudF8xXzBfMF8xICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTI1OTE6MjogKCBydWxlX19YRXF1YWxpdHlFeHByZXNzaW9uX19GZWF0dXJlQXNzaWdubWVudF8xXzBfMF8xICkKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WEVxdWFsaXR5RXhwcmVzc2lvbkFjY2VzcygpLmdldEZlYXR1cmVBc3NpZ25tZW50XzFfMF8wXzEoKSk7IAogICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTEyNTQ6MjogKCBydWxlX19YRXF1YWxpdHlFeHByZXNzaW9uX19GZWF0dXJlQXNzaWdubWVudF8xXzBfMF8xICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjExMjU0OjM6IHJ1bGVfX1hFcXVhbGl0eUV4cHJlc3Npb25fX0ZlYXR1cmVBc3NpZ25tZW50XzFfMF8wXzEKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEyNTkyOjI6ICggcnVsZV9fWEVxdWFsaXR5RXhwcmVzc2lvbl9fRmVhdHVyZUFzc2lnbm1lbnRfMV8wXzBfMSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMjU5MjozOiBydWxlX19YRXF1YWxpdHlFeHByZXNzaW9uX19GZWF0dXJlQXNzaWdubWVudF8xXzBfMF8xCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV18yKTsKICAgICAgICAgICAgIHJ1bGVfX1hFcXVhbGl0eUV4cHJlc3Npb25fX0ZlYXR1cmVBc3NpZ25tZW50XzFfMF8wXzEoKTsKQEAgLTM3OTQ1LDE2ICs0MjQwMiwxNiBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX1hSZWxhdGlvbmFsRXhwcmVzc2lvbl9fR3JvdXBfXzAiCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTEyNjM6MTogcnVsZV9fWFJlbGF0aW9uYWxFeHByZXNzaW9uX19Hcm91cF9fMCA6IHJ1bGVfX1hSZWxhdGlvbmFsRXhwcmVzc2lvbl9fR3JvdXBfXzBfX0ltcGwgcnVsZV9fWFJlbGF0aW9uYWxFeHByZXNzaW9uX19Hcm91cF9fMSA7CisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTI2MDE6MTogcnVsZV9fWFJlbGF0aW9uYWxFeHByZXNzaW9uX19Hcm91cF9fMCA6IHJ1bGVfX1hSZWxhdGlvbmFsRXhwcmVzc2lvbl9fR3JvdXBfXzBfX0ltcGwgcnVsZV9fWFJlbGF0aW9uYWxFeHByZXNzaW9uX19Hcm91cF9fMSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fWFJlbGF0aW9uYWxFeHByZXNzaW9uX19Hcm91cF9fMCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMTI2NzoxOiAoIHJ1bGVfX1hSZWxhdGlvbmFsRXhwcmVzc2lvbl9fR3JvdXBfXzBfX0ltcGwgcnVsZV9fWFJlbGF0aW9uYWxFeHByZXNzaW9uX19Hcm91cF9fMSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMTI2ODoyOiBydWxlX19YUmVsYXRpb25hbEV4cHJlc3Npb25fX0dyb3VwX18wX19JbXBsIHJ1bGVfX1hSZWxhdGlvbmFsRXhwcmVzc2lvbl9fR3JvdXBfXzEKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEyNjA1OjE6ICggcnVsZV9fWFJlbGF0aW9uYWxFeHByZXNzaW9uX19Hcm91cF9fMF9fSW1wbCBydWxlX19YUmVsYXRpb25hbEV4cHJlc3Npb25fX0dyb3VwX18xICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEyNjA2OjI6IHJ1bGVfX1hSZWxhdGlvbmFsRXhwcmVzc2lvbl9fR3JvdXBfXzBfX0ltcGwgcnVsZV9fWFJlbGF0aW9uYWxFeHByZXNzaW9uX19Hcm91cF9fMQogICAgICAgICAgICAgewotICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfODkpOworICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfOTcpOwogICAgICAgICAgICAgcnVsZV9fWFJlbGF0aW9uYWxFeHByZXNzaW9uX19Hcm91cF9fMF9fSW1wbCgpOwogCiAgICAgICAgICAgICBzdGF0ZS5fZnNwLS07CkBAIC0zNzk4MywxNyArNDI0NDAsMTcgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YUmVsYXRpb25hbEV4cHJlc3Npb25fX0dyb3VwX18wX19JbXBsIgotICAgIC8vIEludGVybmFsRGF0YURTTC5nOjExMjc1OjE6IHJ1bGVfX1hSZWxhdGlvbmFsRXhwcmVzc2lvbl9fR3JvdXBfXzBfX0ltcGwgOiAoIHJ1bGVYT3RoZXJPcGVyYXRvckV4cHJlc3Npb24gKSA7CisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTI2MTM6MTogcnVsZV9fWFJlbGF0aW9uYWxFeHByZXNzaW9uX19Hcm91cF9fMF9fSW1wbCA6ICggcnVsZVhPdGhlck9wZXJhdG9yRXhwcmVzc2lvbiApIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YUmVsYXRpb25hbEV4cHJlc3Npb25fX0dyb3VwX18wX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjExMjc5OjE6ICggKCBydWxlWE90aGVyT3BlcmF0b3JFeHByZXNzaW9uICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTEyODA6MTogKCBydWxlWE90aGVyT3BlcmF0b3JFeHByZXNzaW9uICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEyNjE3OjE6ICggKCBydWxlWE90aGVyT3BlcmF0b3JFeHByZXNzaW9uICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTI2MTg6MTogKCBydWxlWE90aGVyT3BlcmF0b3JFeHByZXNzaW9uICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjExMjgwOjE6ICggcnVsZVhPdGhlck9wZXJhdG9yRXhwcmVzc2lvbiApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMTI4MToyOiBydWxlWE90aGVyT3BlcmF0b3JFeHByZXNzaW9uCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMjYxODoxOiAoIHJ1bGVYT3RoZXJPcGVyYXRvckV4cHJlc3Npb24gKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTI2MTk6MjogcnVsZVhPdGhlck9wZXJhdG9yRXhwcmVzc2lvbgogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYUmVsYXRpb25hbEV4cHJlc3Npb25BY2Nlc3MoKS5nZXRYT3RoZXJPcGVyYXRvckV4cHJlc3Npb25QYXJzZXJSdWxlQ2FsbF8wKCkpOyAKQEAgLTM4MDI4LDE0ICs0MjQ4NSwxNCBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX1hSZWxhdGlvbmFsRXhwcmVzc2lvbl9fR3JvdXBfXzEiCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTEyOTA6MTogcnVsZV9fWFJlbGF0aW9uYWxFeHByZXNzaW9uX19Hcm91cF9fMSA6IHJ1bGVfX1hSZWxhdGlvbmFsRXhwcmVzc2lvbl9fR3JvdXBfXzFfX0ltcGwgOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEyNjI4OjE6IHJ1bGVfX1hSZWxhdGlvbmFsRXhwcmVzc2lvbl9fR3JvdXBfXzEgOiBydWxlX19YUmVsYXRpb25hbEV4cHJlc3Npb25fX0dyb3VwX18xX19JbXBsIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YUmVsYXRpb25hbEV4cHJlc3Npb25fX0dyb3VwX18xKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjExMjk0OjE6ICggcnVsZV9fWFJlbGF0aW9uYWxFeHByZXNzaW9uX19Hcm91cF9fMV9fSW1wbCApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMTI5NToyOiBydWxlX19YUmVsYXRpb25hbEV4cHJlc3Npb25fX0dyb3VwX18xX19JbXBsCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMjYzMjoxOiAoIHJ1bGVfX1hSZWxhdGlvbmFsRXhwcmVzc2lvbl9fR3JvdXBfXzFfX0ltcGwgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTI2MzM6MjogcnVsZV9fWFJlbGF0aW9uYWxFeHByZXNzaW9uX19Hcm91cF9fMV9fSW1wbAogICAgICAgICAgICAgewogICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMik7CiAgICAgICAgICAgICBydWxlX19YUmVsYXRpb25hbEV4cHJlc3Npb25fX0dyb3VwX18xX19JbXBsKCk7CkBAIC0zODA2MSwzMiArNDI1MTgsMzIgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YUmVsYXRpb25hbEV4cHJlc3Npb25fX0dyb3VwX18xX19JbXBsIgotICAgIC8vIEludGVybmFsRGF0YURTTC5nOjExMzAxOjE6IHJ1bGVfX1hSZWxhdGlvbmFsRXhwcmVzc2lvbl9fR3JvdXBfXzFfX0ltcGwgOiAoICggcnVsZV9fWFJlbGF0aW9uYWxFeHByZXNzaW9uX19BbHRlcm5hdGl2ZXNfMSApKiApIDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMjYzOToxOiBydWxlX19YUmVsYXRpb25hbEV4cHJlc3Npb25fX0dyb3VwX18xX19JbXBsIDogKCAoIHJ1bGVfX1hSZWxhdGlvbmFsRXhwcmVzc2lvbl9fQWx0ZXJuYXRpdmVzXzEgKSogKSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fWFJlbGF0aW9uYWxFeHByZXNzaW9uX19Hcm91cF9fMV9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMTMwNToxOiAoICggKCBydWxlX19YUmVsYXRpb25hbEV4cHJlc3Npb25fX0FsdGVybmF0aXZlc18xICkqICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTEzMDY6MTogKCAoIHJ1bGVfX1hSZWxhdGlvbmFsRXhwcmVzc2lvbl9fQWx0ZXJuYXRpdmVzXzEgKSogKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTI2NDM6MTogKCAoICggcnVsZV9fWFJlbGF0aW9uYWxFeHByZXNzaW9uX19BbHRlcm5hdGl2ZXNfMSApKiApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEyNjQ0OjE6ICggKCBydWxlX19YUmVsYXRpb25hbEV4cHJlc3Npb25fX0FsdGVybmF0aXZlc18xICkqICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjExMzA2OjE6ICggKCBydWxlX19YUmVsYXRpb25hbEV4cHJlc3Npb25fX0FsdGVybmF0aXZlc18xICkqICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjExMzA3OjI6ICggcnVsZV9fWFJlbGF0aW9uYWxFeHByZXNzaW9uX19BbHRlcm5hdGl2ZXNfMSApKgorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTI2NDQ6MTogKCAoIHJ1bGVfX1hSZWxhdGlvbmFsRXhwcmVzc2lvbl9fQWx0ZXJuYXRpdmVzXzEgKSogKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTI2NDU6MjogKCBydWxlX19YUmVsYXRpb25hbEV4cHJlc3Npb25fX0FsdGVybmF0aXZlc18xICkqCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhSZWxhdGlvbmFsRXhwcmVzc2lvbkFjY2VzcygpLmdldEFsdGVybmF0aXZlc18xKCkpOyAKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjExMzA4OjI6ICggcnVsZV9fWFJlbGF0aW9uYWxFeHByZXNzaW9uX19BbHRlcm5hdGl2ZXNfMSApKgotICAgICAgICAgICAgbG9vcDEwMDoKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEyNjQ2OjI6ICggcnVsZV9fWFJlbGF0aW9uYWxFeHByZXNzaW9uX19BbHRlcm5hdGl2ZXNfMSApKgorICAgICAgICAgICAgbG9vcDExMzoKICAgICAgICAgICAgIGRvIHsKLSAgICAgICAgICAgICAgICBpbnQgYWx0MTAwPTI7CisgICAgICAgICAgICAgICAgaW50IGFsdDExMz0yOwogICAgICAgICAgICAgICAgIHN3aXRjaCAoIGlucHV0LkxBKDEpICkgewogICAgICAgICAgICAgICAgIGNhc2UgMjc6CiAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgaW50IExBMTAwXzIgPSBpbnB1dC5MQSgyKTsKKyAgICAgICAgICAgICAgICAgICAgaW50IExBMTEzXzIgPSBpbnB1dC5MQSgyKTsKIAotICAgICAgICAgICAgICAgICAgICBpZiAoIChzeW5wcmVkMTU0X0ludGVybmFsRGF0YURTTCgpKSApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGFsdDEwMD0xOworICAgICAgICAgICAgICAgICAgICBpZiAoIChzeW5wcmVkMTczX0ludGVybmFsRGF0YURTTCgpKSApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFsdDExMz0xOwogICAgICAgICAgICAgICAgICAgICB9CiAKIApAQCAtMzgwOTQsMjEgKzQyNTUxLDIxIEBACiAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgIGNhc2UgMjY6CiAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgaW50IExBMTAwXzMgPSBpbnB1dC5MQSgyKTsKKyAgICAgICAgICAgICAgICAgICAgaW50IExBMTEzXzMgPSBpbnB1dC5MQSgyKTsKIAotICAgICAgICAgICAgICAgICAgICBpZiAoIChzeW5wcmVkMTU0X0ludGVybmFsRGF0YURTTCgpKSApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGFsdDEwMD0xOworICAgICAgICAgICAgICAgICAgICBpZiAoIChzeW5wcmVkMTczX0ludGVybmFsRGF0YURTTCgpKSApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFsdDExMz0xOwogICAgICAgICAgICAgICAgICAgICB9CiAKIAogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgMTE5OgorICAgICAgICAgICAgICAgIGNhc2UgMTI5OgogICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGludCBMQTEwMF80ID0gaW5wdXQuTEEoMik7CisgICAgICAgICAgICAgICAgICAgIGludCBMQTExM180ID0gaW5wdXQuTEEoMik7CiAKLSAgICAgICAgICAgICAgICAgICAgaWYgKCAoc3lucHJlZDE1NF9JbnRlcm5hbERhdGFEU0woKSkgKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBhbHQxMDA9MTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCAoc3lucHJlZDE3M19JbnRlcm5hbERhdGFEU0woKSkgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBhbHQxMTM9MTsKICAgICAgICAgICAgICAgICAgICAgfQogCiAKQEAgLTM4MTE2LDEwICs0MjU3MywxMCBAQAogICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICBjYXNlIDI1OgogICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGludCBMQTEwMF81ID0gaW5wdXQuTEEoMik7CisgICAgICAgICAgICAgICAgICAgIGludCBMQTExM181ID0gaW5wdXQuTEEoMik7CiAKLSAgICAgICAgICAgICAgICAgICAgaWYgKCAoc3lucHJlZDE1NF9JbnRlcm5hbERhdGFEU0woKSkgKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBhbHQxMDA9MTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCAoc3lucHJlZDE3M19JbnRlcm5hbERhdGFEU0woKSkgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBhbHQxMTM9MTsKICAgICAgICAgICAgICAgICAgICAgfQogCiAKQEAgLTM4MTI4LDExICs0MjU4NSwxMSBAQAogCiAgICAgICAgICAgICAgICAgfQogCi0gICAgICAgICAgICAgICAgc3dpdGNoIChhbHQxMDApIHsKKyAgICAgICAgICAgICAgICBzd2l0Y2ggKGFsdDExMykgewogICAgICAgICAgICAgCWNhc2UgMSA6Ci0gICAgICAgICAgICAJICAgIC8vIEludGVybmFsRGF0YURTTC5nOjExMzA4OjM6IHJ1bGVfX1hSZWxhdGlvbmFsRXhwcmVzc2lvbl9fQWx0ZXJuYXRpdmVzXzEKKyAgICAgICAgICAgIAkgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTI2NDY6MzogcnVsZV9fWFJlbGF0aW9uYWxFeHByZXNzaW9uX19BbHRlcm5hdGl2ZXNfMQogICAgICAgICAgICAgCSAgICB7Ci0gICAgICAgICAgICAJICAgIHB1c2hGb2xsb3coRk9MTE9XXzkwKTsKKyAgICAgICAgICAgIAkgICAgcHVzaEZvbGxvdyhGT0xMT1dfOTgpOwogICAgICAgICAgICAgCSAgICBydWxlX19YUmVsYXRpb25hbEV4cHJlc3Npb25fX0FsdGVybmF0aXZlc18xKCk7CiAKICAgICAgICAgICAgIAkgICAgc3RhdGUuX2ZzcC0tOwpAQCAtMzgxNDIsNyArNDI1OTksNyBAQAogICAgICAgICAgICAgCSAgICBicmVhazsKIAogICAgICAgICAgICAgCWRlZmF1bHQgOgotICAgICAgICAgICAgCSAgICBicmVhayBsb29wMTAwOworICAgICAgICAgICAgCSAgICBicmVhayBsb29wMTEzOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0gd2hpbGUgKHRydWUpOwogCkBAIC0zODE3MSwxNiArNDI2MjgsMTYgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YUmVsYXRpb25hbEV4cHJlc3Npb25fX0dyb3VwXzFfMF9fMCIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMTMxNzoxOiBydWxlX19YUmVsYXRpb25hbEV4cHJlc3Npb25fX0dyb3VwXzFfMF9fMCA6IHJ1bGVfX1hSZWxhdGlvbmFsRXhwcmVzc2lvbl9fR3JvdXBfMV8wX18wX19JbXBsIHJ1bGVfX1hSZWxhdGlvbmFsRXhwcmVzc2lvbl9fR3JvdXBfMV8wX18xIDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMjY1NToxOiBydWxlX19YUmVsYXRpb25hbEV4cHJlc3Npb25fX0dyb3VwXzFfMF9fMCA6IHJ1bGVfX1hSZWxhdGlvbmFsRXhwcmVzc2lvbl9fR3JvdXBfMV8wX18wX19JbXBsIHJ1bGVfX1hSZWxhdGlvbmFsRXhwcmVzc2lvbl9fR3JvdXBfMV8wX18xIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YUmVsYXRpb25hbEV4cHJlc3Npb25fX0dyb3VwXzFfMF9fMCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMTMyMToxOiAoIHJ1bGVfX1hSZWxhdGlvbmFsRXhwcmVzc2lvbl9fR3JvdXBfMV8wX18wX19JbXBsIHJ1bGVfX1hSZWxhdGlvbmFsRXhwcmVzc2lvbl9fR3JvdXBfMV8wX18xICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjExMzIyOjI6IHJ1bGVfX1hSZWxhdGlvbmFsRXhwcmVzc2lvbl9fR3JvdXBfMV8wX18wX19JbXBsIHJ1bGVfX1hSZWxhdGlvbmFsRXhwcmVzc2lvbl9fR3JvdXBfMV8wX18xCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMjY1OToxOiAoIHJ1bGVfX1hSZWxhdGlvbmFsRXhwcmVzc2lvbl9fR3JvdXBfMV8wX18wX19JbXBsIHJ1bGVfX1hSZWxhdGlvbmFsRXhwcmVzc2lvbl9fR3JvdXBfMV8wX18xICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEyNjYwOjI6IHJ1bGVfX1hSZWxhdGlvbmFsRXhwcmVzc2lvbl9fR3JvdXBfMV8wX18wX19JbXBsIHJ1bGVfX1hSZWxhdGlvbmFsRXhwcmVzc2lvbl9fR3JvdXBfMV8wX18xCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV185MSk7CisgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV185OSk7CiAgICAgICAgICAgICBydWxlX19YUmVsYXRpb25hbEV4cHJlc3Npb25fX0dyb3VwXzFfMF9fMF9fSW1wbCgpOwogCiAgICAgICAgICAgICBzdGF0ZS5fZnNwLS07CkBAIC0zODIwOSwyMyArNDI2NjYsMjMgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YUmVsYXRpb25hbEV4cHJlc3Npb25fX0dyb3VwXzFfMF9fMF9fSW1wbCIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMTMyOToxOiBydWxlX19YUmVsYXRpb25hbEV4cHJlc3Npb25fX0dyb3VwXzFfMF9fMF9fSW1wbCA6ICggKCBydWxlX19YUmVsYXRpb25hbEV4cHJlc3Npb25fX0dyb3VwXzFfMF8wX18wICkgKSA7CisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTI2Njc6MTogcnVsZV9fWFJlbGF0aW9uYWxFeHByZXNzaW9uX19Hcm91cF8xXzBfXzBfX0ltcGwgOiAoICggcnVsZV9fWFJlbGF0aW9uYWxFeHByZXNzaW9uX19Hcm91cF8xXzBfMF9fMCApICkgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1hSZWxhdGlvbmFsRXhwcmVzc2lvbl9fR3JvdXBfMV8wX18wX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjExMzMzOjE6ICggKCAoIHJ1bGVfX1hSZWxhdGlvbmFsRXhwcmVzc2lvbl9fR3JvdXBfMV8wXzBfXzAgKSApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjExMzM0OjE6ICggKCBydWxlX19YUmVsYXRpb25hbEV4cHJlc3Npb25fX0dyb3VwXzFfMF8wX18wICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTI2NzE6MTogKCAoICggcnVsZV9fWFJlbGF0aW9uYWxFeHByZXNzaW9uX19Hcm91cF8xXzBfMF9fMCApICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTI2NzI6MTogKCAoIHJ1bGVfX1hSZWxhdGlvbmFsRXhwcmVzc2lvbl9fR3JvdXBfMV8wXzBfXzAgKSApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMTMzNDoxOiAoICggcnVsZV9fWFJlbGF0aW9uYWxFeHByZXNzaW9uX19Hcm91cF8xXzBfMF9fMCApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjExMzM1OjI6ICggcnVsZV9fWFJlbGF0aW9uYWxFeHByZXNzaW9uX19Hcm91cF8xXzBfMF9fMCApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMjY3MjoxOiAoICggcnVsZV9fWFJlbGF0aW9uYWxFeHByZXNzaW9uX19Hcm91cF8xXzBfMF9fMCApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEyNjczOjI6ICggcnVsZV9fWFJlbGF0aW9uYWxFeHByZXNzaW9uX19Hcm91cF8xXzBfMF9fMCApCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhSZWxhdGlvbmFsRXhwcmVzc2lvbkFjY2VzcygpLmdldEdyb3VwXzFfMF8wKCkpOyAKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjExMzM2OjI6ICggcnVsZV9fWFJlbGF0aW9uYWxFeHByZXNzaW9uX19Hcm91cF8xXzBfMF9fMCApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMTMzNjozOiBydWxlX19YUmVsYXRpb25hbEV4cHJlc3Npb25fX0dyb3VwXzFfMF8wX18wCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMjY3NDoyOiAoIHJ1bGVfX1hSZWxhdGlvbmFsRXhwcmVzc2lvbl9fR3JvdXBfMV8wXzBfXzAgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTI2NzQ6MzogcnVsZV9fWFJlbGF0aW9uYWxFeHByZXNzaW9uX19Hcm91cF8xXzBfMF9fMAogICAgICAgICAgICAgewogICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMik7CiAgICAgICAgICAgICBydWxlX19YUmVsYXRpb25hbEV4cHJlc3Npb25fX0dyb3VwXzFfMF8wX18wKCk7CkBAIC0zODI2MCwxNCArNDI3MTcsMTQgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YUmVsYXRpb25hbEV4cHJlc3Npb25fX0dyb3VwXzFfMF9fMSIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMTM0NDoxOiBydWxlX19YUmVsYXRpb25hbEV4cHJlc3Npb25fX0dyb3VwXzFfMF9fMSA6IHJ1bGVfX1hSZWxhdGlvbmFsRXhwcmVzc2lvbl9fR3JvdXBfMV8wX18xX19JbXBsIDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMjY4MjoxOiBydWxlX19YUmVsYXRpb25hbEV4cHJlc3Npb25fX0dyb3VwXzFfMF9fMSA6IHJ1bGVfX1hSZWxhdGlvbmFsRXhwcmVzc2lvbl9fR3JvdXBfMV8wX18xX19JbXBsIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YUmVsYXRpb25hbEV4cHJlc3Npb25fX0dyb3VwXzFfMF9fMSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMTM0ODoxOiAoIHJ1bGVfX1hSZWxhdGlvbmFsRXhwcmVzc2lvbl9fR3JvdXBfMV8wX18xX19JbXBsICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjExMzQ5OjI6IHJ1bGVfX1hSZWxhdGlvbmFsRXhwcmVzc2lvbl9fR3JvdXBfMV8wX18xX19JbXBsCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMjY4NjoxOiAoIHJ1bGVfX1hSZWxhdGlvbmFsRXhwcmVzc2lvbl9fR3JvdXBfMV8wX18xX19JbXBsICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEyNjg3OjI6IHJ1bGVfX1hSZWxhdGlvbmFsRXhwcmVzc2lvbl9fR3JvdXBfMV8wX18xX19JbXBsCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV18yKTsKICAgICAgICAgICAgIHJ1bGVfX1hSZWxhdGlvbmFsRXhwcmVzc2lvbl9fR3JvdXBfMV8wX18xX19JbXBsKCk7CkBAIC0zODI5MywyMyArNDI3NTAsMjMgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YUmVsYXRpb25hbEV4cHJlc3Npb25fX0dyb3VwXzFfMF9fMV9fSW1wbCIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMTM1NToxOiBydWxlX19YUmVsYXRpb25hbEV4cHJlc3Npb25fX0dyb3VwXzFfMF9fMV9fSW1wbCA6ICggKCBydWxlX19YUmVsYXRpb25hbEV4cHJlc3Npb25fX1R5cGVBc3NpZ25tZW50XzFfMF8xICkgKSA7CisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTI2OTM6MTogcnVsZV9fWFJlbGF0aW9uYWxFeHByZXNzaW9uX19Hcm91cF8xXzBfXzFfX0ltcGwgOiAoICggcnVsZV9fWFJlbGF0aW9uYWxFeHByZXNzaW9uX19UeXBlQXNzaWdubWVudF8xXzBfMSApICkgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1hSZWxhdGlvbmFsRXhwcmVzc2lvbl9fR3JvdXBfMV8wX18xX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjExMzU5OjE6ICggKCAoIHJ1bGVfX1hSZWxhdGlvbmFsRXhwcmVzc2lvbl9fVHlwZUFzc2lnbm1lbnRfMV8wXzEgKSApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjExMzYwOjE6ICggKCBydWxlX19YUmVsYXRpb25hbEV4cHJlc3Npb25fX1R5cGVBc3NpZ25tZW50XzFfMF8xICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTI2OTc6MTogKCAoICggcnVsZV9fWFJlbGF0aW9uYWxFeHByZXNzaW9uX19UeXBlQXNzaWdubWVudF8xXzBfMSApICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTI2OTg6MTogKCAoIHJ1bGVfX1hSZWxhdGlvbmFsRXhwcmVzc2lvbl9fVHlwZUFzc2lnbm1lbnRfMV8wXzEgKSApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMTM2MDoxOiAoICggcnVsZV9fWFJlbGF0aW9uYWxFeHByZXNzaW9uX19UeXBlQXNzaWdubWVudF8xXzBfMSApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjExMzYxOjI6ICggcnVsZV9fWFJlbGF0aW9uYWxFeHByZXNzaW9uX19UeXBlQXNzaWdubWVudF8xXzBfMSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMjY5ODoxOiAoICggcnVsZV9fWFJlbGF0aW9uYWxFeHByZXNzaW9uX19UeXBlQXNzaWdubWVudF8xXzBfMSApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEyNjk5OjI6ICggcnVsZV9fWFJlbGF0aW9uYWxFeHByZXNzaW9uX19UeXBlQXNzaWdubWVudF8xXzBfMSApCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhSZWxhdGlvbmFsRXhwcmVzc2lvbkFjY2VzcygpLmdldFR5cGVBc3NpZ25tZW50XzFfMF8xKCkpOyAKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjExMzYyOjI6ICggcnVsZV9fWFJlbGF0aW9uYWxFeHByZXNzaW9uX19UeXBlQXNzaWdubWVudF8xXzBfMSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMTM2MjozOiBydWxlX19YUmVsYXRpb25hbEV4cHJlc3Npb25fX1R5cGVBc3NpZ25tZW50XzFfMF8xCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMjcwMDoyOiAoIHJ1bGVfX1hSZWxhdGlvbmFsRXhwcmVzc2lvbl9fVHlwZUFzc2lnbm1lbnRfMV8wXzEgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTI3MDA6MzogcnVsZV9fWFJlbGF0aW9uYWxFeHByZXNzaW9uX19UeXBlQXNzaWdubWVudF8xXzBfMQogICAgICAgICAgICAgewogICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMik7CiAgICAgICAgICAgICBydWxlX19YUmVsYXRpb25hbEV4cHJlc3Npb25fX1R5cGVBc3NpZ25tZW50XzFfMF8xKCk7CkBAIC0zODM0NCwxNCArNDI4MDEsMTQgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YUmVsYXRpb25hbEV4cHJlc3Npb25fX0dyb3VwXzFfMF8wX18wIgotICAgIC8vIEludGVybmFsRGF0YURTTC5nOjExMzcxOjE6IHJ1bGVfX1hSZWxhdGlvbmFsRXhwcmVzc2lvbl9fR3JvdXBfMV8wXzBfXzAgOiBydWxlX19YUmVsYXRpb25hbEV4cHJlc3Npb25fX0dyb3VwXzFfMF8wX18wX19JbXBsIDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMjcwOToxOiBydWxlX19YUmVsYXRpb25hbEV4cHJlc3Npb25fX0dyb3VwXzFfMF8wX18wIDogcnVsZV9fWFJlbGF0aW9uYWxFeHByZXNzaW9uX19Hcm91cF8xXzBfMF9fMF9fSW1wbCA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fWFJlbGF0aW9uYWxFeHByZXNzaW9uX19Hcm91cF8xXzBfMF9fMCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMTM3NToxOiAoIHJ1bGVfX1hSZWxhdGlvbmFsRXhwcmVzc2lvbl9fR3JvdXBfMV8wXzBfXzBfX0ltcGwgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTEzNzY6MjogcnVsZV9fWFJlbGF0aW9uYWxFeHByZXNzaW9uX19Hcm91cF8xXzBfMF9fMF9fSW1wbAorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTI3MTM6MTogKCBydWxlX19YUmVsYXRpb25hbEV4cHJlc3Npb25fX0dyb3VwXzFfMF8wX18wX19JbXBsICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEyNzE0OjI6IHJ1bGVfX1hSZWxhdGlvbmFsRXhwcmVzc2lvbl9fR3JvdXBfMV8wXzBfXzBfX0ltcGwKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzIpOwogICAgICAgICAgICAgcnVsZV9fWFJlbGF0aW9uYWxFeHByZXNzaW9uX19Hcm91cF8xXzBfMF9fMF9fSW1wbCgpOwpAQCAtMzgzNzcsMjMgKzQyODM0LDIzIEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fWFJlbGF0aW9uYWxFeHByZXNzaW9uX19Hcm91cF8xXzBfMF9fMF9fSW1wbCIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMTM4MjoxOiBydWxlX19YUmVsYXRpb25hbEV4cHJlc3Npb25fX0dyb3VwXzFfMF8wX18wX19JbXBsIDogKCAoIHJ1bGVfX1hSZWxhdGlvbmFsRXhwcmVzc2lvbl9fR3JvdXBfMV8wXzBfMF9fMCApICkgOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEyNzIwOjE6IHJ1bGVfX1hSZWxhdGlvbmFsRXhwcmVzc2lvbl9fR3JvdXBfMV8wXzBfXzBfX0ltcGwgOiAoICggcnVsZV9fWFJlbGF0aW9uYWxFeHByZXNzaW9uX19Hcm91cF8xXzBfMF8wX18wICkgKSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fWFJlbGF0aW9uYWxFeHByZXNzaW9uX19Hcm91cF8xXzBfMF9fMF9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMTM4NjoxOiAoICggKCBydWxlX19YUmVsYXRpb25hbEV4cHJlc3Npb25fX0dyb3VwXzFfMF8wXzBfXzAgKSApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjExMzg3OjE6ICggKCBydWxlX19YUmVsYXRpb25hbEV4cHJlc3Npb25fX0dyb3VwXzFfMF8wXzBfXzAgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMjcyNDoxOiAoICggKCBydWxlX19YUmVsYXRpb25hbEV4cHJlc3Npb25fX0dyb3VwXzFfMF8wXzBfXzAgKSApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEyNzI1OjE6ICggKCBydWxlX19YUmVsYXRpb25hbEV4cHJlc3Npb25fX0dyb3VwXzFfMF8wXzBfXzAgKSApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMTM4NzoxOiAoICggcnVsZV9fWFJlbGF0aW9uYWxFeHByZXNzaW9uX19Hcm91cF8xXzBfMF8wX18wICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTEzODg6MjogKCBydWxlX19YUmVsYXRpb25hbEV4cHJlc3Npb25fX0dyb3VwXzFfMF8wXzBfXzAgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTI3MjU6MTogKCAoIHJ1bGVfX1hSZWxhdGlvbmFsRXhwcmVzc2lvbl9fR3JvdXBfMV8wXzBfMF9fMCApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEyNzI2OjI6ICggcnVsZV9fWFJlbGF0aW9uYWxFeHByZXNzaW9uX19Hcm91cF8xXzBfMF8wX18wICkKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WFJlbGF0aW9uYWxFeHByZXNzaW9uQWNjZXNzKCkuZ2V0R3JvdXBfMV8wXzBfMCgpKTsgCiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMTM4OToyOiAoIHJ1bGVfX1hSZWxhdGlvbmFsRXhwcmVzc2lvbl9fR3JvdXBfMV8wXzBfMF9fMCApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMTM4OTozOiBydWxlX19YUmVsYXRpb25hbEV4cHJlc3Npb25fX0dyb3VwXzFfMF8wXzBfXzAKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEyNzI3OjI6ICggcnVsZV9fWFJlbGF0aW9uYWxFeHByZXNzaW9uX19Hcm91cF8xXzBfMF8wX18wICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEyNzI3OjM6IHJ1bGVfX1hSZWxhdGlvbmFsRXhwcmVzc2lvbl9fR3JvdXBfMV8wXzBfMF9fMAogICAgICAgICAgICAgewogICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMik7CiAgICAgICAgICAgICBydWxlX19YUmVsYXRpb25hbEV4cHJlc3Npb25fX0dyb3VwXzFfMF8wXzBfXzAoKTsKQEAgLTM4NDI4LDE2ICs0Mjg4NSwxNiBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX1hSZWxhdGlvbmFsRXhwcmVzc2lvbl9fR3JvdXBfMV8wXzBfMF9fMCIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMTM5ODoxOiBydWxlX19YUmVsYXRpb25hbEV4cHJlc3Npb25fX0dyb3VwXzFfMF8wXzBfXzAgOiBydWxlX19YUmVsYXRpb25hbEV4cHJlc3Npb25fX0dyb3VwXzFfMF8wXzBfXzBfX0ltcGwgcnVsZV9fWFJlbGF0aW9uYWxFeHByZXNzaW9uX19Hcm91cF8xXzBfMF8wX18xIDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMjczNjoxOiBydWxlX19YUmVsYXRpb25hbEV4cHJlc3Npb25fX0dyb3VwXzFfMF8wXzBfXzAgOiBydWxlX19YUmVsYXRpb25hbEV4cHJlc3Npb25fX0dyb3VwXzFfMF8wXzBfXzBfX0ltcGwgcnVsZV9fWFJlbGF0aW9uYWxFeHByZXNzaW9uX19Hcm91cF8xXzBfMF8wX18xIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YUmVsYXRpb25hbEV4cHJlc3Npb25fX0dyb3VwXzFfMF8wXzBfXzAoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTE0MDI6MTogKCBydWxlX19YUmVsYXRpb25hbEV4cHJlc3Npb25fX0dyb3VwXzFfMF8wXzBfXzBfX0ltcGwgcnVsZV9fWFJlbGF0aW9uYWxFeHByZXNzaW9uX19Hcm91cF8xXzBfMF8wX18xICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjExNDAzOjI6IHJ1bGVfX1hSZWxhdGlvbmFsRXhwcmVzc2lvbl9fR3JvdXBfMV8wXzBfMF9fMF9fSW1wbCBydWxlX19YUmVsYXRpb25hbEV4cHJlc3Npb25fX0dyb3VwXzFfMF8wXzBfXzEKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEyNzQwOjE6ICggcnVsZV9fWFJlbGF0aW9uYWxFeHByZXNzaW9uX19Hcm91cF8xXzBfMF8wX18wX19JbXBsIHJ1bGVfX1hSZWxhdGlvbmFsRXhwcmVzc2lvbl9fR3JvdXBfMV8wXzBfMF9fMSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMjc0MToyOiBydWxlX19YUmVsYXRpb25hbEV4cHJlc3Npb25fX0dyb3VwXzFfMF8wXzBfXzBfX0ltcGwgcnVsZV9fWFJlbGF0aW9uYWxFeHByZXNzaW9uX19Hcm91cF8xXzBfMF8wX18xCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV185Mik7CisgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV18xMDApOwogICAgICAgICAgICAgcnVsZV9fWFJlbGF0aW9uYWxFeHByZXNzaW9uX19Hcm91cF8xXzBfMF8wX18wX19JbXBsKCk7CiAKICAgICAgICAgICAgIHN0YXRlLl9mc3AtLTsKQEAgLTM4NDY2LDIzICs0MjkyMywyMyBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX1hSZWxhdGlvbmFsRXhwcmVzc2lvbl9fR3JvdXBfMV8wXzBfMF9fMF9fSW1wbCIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMTQxMDoxOiBydWxlX19YUmVsYXRpb25hbEV4cHJlc3Npb25fX0dyb3VwXzFfMF8wXzBfXzBfX0ltcGwgOiAoICgpICkgOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEyNzQ4OjE6IHJ1bGVfX1hSZWxhdGlvbmFsRXhwcmVzc2lvbl9fR3JvdXBfMV8wXzBfMF9fMF9fSW1wbCA6ICggKCkgKSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fWFJlbGF0aW9uYWxFeHByZXNzaW9uX19Hcm91cF8xXzBfMF8wX18wX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjExNDE0OjE6ICggKCAoKSApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjExNDE1OjE6ICggKCkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTI3NTI6MTogKCAoICgpICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTI3NTM6MTogKCAoKSApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMTQxNToxOiAoICgpICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjExNDE2OjI6ICgpCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMjc1MzoxOiAoICgpICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEyNzU0OjI6ICgpCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhSZWxhdGlvbmFsRXhwcmVzc2lvbkFjY2VzcygpLmdldFhJbnN0YW5jZU9mRXhwcmVzc2lvbkV4cHJlc3Npb25BY3Rpb25fMV8wXzBfMF8wKCkpOyAKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjExNDE3OjI6ICgpCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMTQxNzozOiAKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEyNzU1OjI6ICgpCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMjc1NTozOiAKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIH0KIApAQCAtMzg1MDcsMTQgKzQyOTY0LDE0IEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fWFJlbGF0aW9uYWxFeHByZXNzaW9uX19Hcm91cF8xXzBfMF8wX18xIgotICAgIC8vIEludGVybmFsRGF0YURTTC5nOjExNDI1OjE6IHJ1bGVfX1hSZWxhdGlvbmFsRXhwcmVzc2lvbl9fR3JvdXBfMV8wXzBfMF9fMSA6IHJ1bGVfX1hSZWxhdGlvbmFsRXhwcmVzc2lvbl9fR3JvdXBfMV8wXzBfMF9fMV9fSW1wbCA7CisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTI3NjM6MTogcnVsZV9fWFJlbGF0aW9uYWxFeHByZXNzaW9uX19Hcm91cF8xXzBfMF8wX18xIDogcnVsZV9fWFJlbGF0aW9uYWxFeHByZXNzaW9uX19Hcm91cF8xXzBfMF8wX18xX19JbXBsIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YUmVsYXRpb25hbEV4cHJlc3Npb25fX0dyb3VwXzFfMF8wXzBfXzEoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTE0Mjk6MTogKCBydWxlX19YUmVsYXRpb25hbEV4cHJlc3Npb25fX0dyb3VwXzFfMF8wXzBfXzFfX0ltcGwgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTE0MzA6MjogcnVsZV9fWFJlbGF0aW9uYWxFeHByZXNzaW9uX19Hcm91cF8xXzBfMF8wX18xX19JbXBsCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMjc2NzoxOiAoIHJ1bGVfX1hSZWxhdGlvbmFsRXhwcmVzc2lvbl9fR3JvdXBfMV8wXzBfMF9fMV9fSW1wbCApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMjc2ODoyOiBydWxlX19YUmVsYXRpb25hbEV4cHJlc3Npb25fX0dyb3VwXzFfMF8wXzBfXzFfX0ltcGwKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzIpOwogICAgICAgICAgICAgcnVsZV9fWFJlbGF0aW9uYWxFeHByZXNzaW9uX19Hcm91cF8xXzBfMF8wX18xX19JbXBsKCk7CkBAIC0zODU0MCwyMiArNDI5OTcsMjIgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YUmVsYXRpb25hbEV4cHJlc3Npb25fX0dyb3VwXzFfMF8wXzBfXzFfX0ltcGwiCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTE0MzY6MTogcnVsZV9fWFJlbGF0aW9uYWxFeHByZXNzaW9uX19Hcm91cF8xXzBfMF8wX18xX19JbXBsIDogKCAnaW5zdGFuY2VvZicgKSA7CisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTI3NzQ6MTogcnVsZV9fWFJlbGF0aW9uYWxFeHByZXNzaW9uX19Hcm91cF8xXzBfMF8wX18xX19JbXBsIDogKCAnaW5zdGFuY2VvZicgKSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fWFJlbGF0aW9uYWxFeHByZXNzaW9uX19Hcm91cF8xXzBfMF8wX18xX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjExNDQwOjE6ICggKCAnaW5zdGFuY2VvZicgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMTQ0MToxOiAoICdpbnN0YW5jZW9mJyApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMjc3ODoxOiAoICggJ2luc3RhbmNlb2YnICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTI3Nzk6MTogKCAnaW5zdGFuY2VvZicgKQogICAgICAgICAgICAgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTE0NDE6MTogKCAnaW5zdGFuY2VvZicgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTE0NDI6MjogJ2luc3RhbmNlb2YnCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMjc3OToxOiAoICdpbnN0YW5jZW9mJyApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMjc4MDoyOiAnaW5zdGFuY2VvZicKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WFJlbGF0aW9uYWxFeHByZXNzaW9uQWNjZXNzKCkuZ2V0SW5zdGFuY2VvZktleXdvcmRfMV8wXzBfMF8xKCkpOyAKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1hdGNoKGlucHV0LDExOSxGT0xMT1dfMik7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CisgICAgICAgICAgICBtYXRjaChpbnB1dCwxMjksRk9MTE9XXzIpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOwogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBhZnRlcihncmFtbWFyQWNjZXNzLmdldFhSZWxhdGlvbmFsRXhwcmVzc2lvbkFjY2VzcygpLmdldEluc3RhbmNlb2ZLZXl3b3JkXzFfMF8wXzBfMSgpKTsgCiAgICAgICAgICAgICB9CkBAIC0zODU4MSwxNiArNDMwMzgsMTYgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YUmVsYXRpb25hbEV4cHJlc3Npb25fX0dyb3VwXzFfMV9fMCIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMTQ1MjoxOiBydWxlX19YUmVsYXRpb25hbEV4cHJlc3Npb25fX0dyb3VwXzFfMV9fMCA6IHJ1bGVfX1hSZWxhdGlvbmFsRXhwcmVzc2lvbl9fR3JvdXBfMV8xX18wX19JbXBsIHJ1bGVfX1hSZWxhdGlvbmFsRXhwcmVzc2lvbl9fR3JvdXBfMV8xX18xIDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMjc5MDoxOiBydWxlX19YUmVsYXRpb25hbEV4cHJlc3Npb25fX0dyb3VwXzFfMV9fMCA6IHJ1bGVfX1hSZWxhdGlvbmFsRXhwcmVzc2lvbl9fR3JvdXBfMV8xX18wX19JbXBsIHJ1bGVfX1hSZWxhdGlvbmFsRXhwcmVzc2lvbl9fR3JvdXBfMV8xX18xIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YUmVsYXRpb25hbEV4cHJlc3Npb25fX0dyb3VwXzFfMV9fMCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMTQ1NjoxOiAoIHJ1bGVfX1hSZWxhdGlvbmFsRXhwcmVzc2lvbl9fR3JvdXBfMV8xX18wX19JbXBsIHJ1bGVfX1hSZWxhdGlvbmFsRXhwcmVzc2lvbl9fR3JvdXBfMV8xX18xICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjExNDU3OjI6IHJ1bGVfX1hSZWxhdGlvbmFsRXhwcmVzc2lvbl9fR3JvdXBfMV8xX18wX19JbXBsIHJ1bGVfX1hSZWxhdGlvbmFsRXhwcmVzc2lvbl9fR3JvdXBfMV8xX18xCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMjc5NDoxOiAoIHJ1bGVfX1hSZWxhdGlvbmFsRXhwcmVzc2lvbl9fR3JvdXBfMV8xX18wX19JbXBsIHJ1bGVfX1hSZWxhdGlvbmFsRXhwcmVzc2lvbl9fR3JvdXBfMV8xX18xICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEyNzk1OjI6IHJ1bGVfX1hSZWxhdGlvbmFsRXhwcmVzc2lvbl9fR3JvdXBfMV8xX18wX19JbXBsIHJ1bGVfX1hSZWxhdGlvbmFsRXhwcmVzc2lvbl9fR3JvdXBfMV8xX18xCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV183NCk7CisgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV184Mik7CiAgICAgICAgICAgICBydWxlX19YUmVsYXRpb25hbEV4cHJlc3Npb25fX0dyb3VwXzFfMV9fMF9fSW1wbCgpOwogCiAgICAgICAgICAgICBzdGF0ZS5fZnNwLS07CkBAIC0zODYxOSwyMyArNDMwNzYsMjMgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YUmVsYXRpb25hbEV4cHJlc3Npb25fX0dyb3VwXzFfMV9fMF9fSW1wbCIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMTQ2NDoxOiBydWxlX19YUmVsYXRpb25hbEV4cHJlc3Npb25fX0dyb3VwXzFfMV9fMF9fSW1wbCA6ICggKCBydWxlX19YUmVsYXRpb25hbEV4cHJlc3Npb25fX0dyb3VwXzFfMV8wX18wICkgKSA7CisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTI4MDI6MTogcnVsZV9fWFJlbGF0aW9uYWxFeHByZXNzaW9uX19Hcm91cF8xXzFfXzBfX0ltcGwgOiAoICggcnVsZV9fWFJlbGF0aW9uYWxFeHByZXNzaW9uX19Hcm91cF8xXzFfMF9fMCApICkgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1hSZWxhdGlvbmFsRXhwcmVzc2lvbl9fR3JvdXBfMV8xX18wX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjExNDY4OjE6ICggKCAoIHJ1bGVfX1hSZWxhdGlvbmFsRXhwcmVzc2lvbl9fR3JvdXBfMV8xXzBfXzAgKSApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjExNDY5OjE6ICggKCBydWxlX19YUmVsYXRpb25hbEV4cHJlc3Npb25fX0dyb3VwXzFfMV8wX18wICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTI4MDY6MTogKCAoICggcnVsZV9fWFJlbGF0aW9uYWxFeHByZXNzaW9uX19Hcm91cF8xXzFfMF9fMCApICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTI4MDc6MTogKCAoIHJ1bGVfX1hSZWxhdGlvbmFsRXhwcmVzc2lvbl9fR3JvdXBfMV8xXzBfXzAgKSApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMTQ2OToxOiAoICggcnVsZV9fWFJlbGF0aW9uYWxFeHByZXNzaW9uX19Hcm91cF8xXzFfMF9fMCApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjExNDcwOjI6ICggcnVsZV9fWFJlbGF0aW9uYWxFeHByZXNzaW9uX19Hcm91cF8xXzFfMF9fMCApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMjgwNzoxOiAoICggcnVsZV9fWFJlbGF0aW9uYWxFeHByZXNzaW9uX19Hcm91cF8xXzFfMF9fMCApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEyODA4OjI6ICggcnVsZV9fWFJlbGF0aW9uYWxFeHByZXNzaW9uX19Hcm91cF8xXzFfMF9fMCApCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhSZWxhdGlvbmFsRXhwcmVzc2lvbkFjY2VzcygpLmdldEdyb3VwXzFfMV8wKCkpOyAKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjExNDcxOjI6ICggcnVsZV9fWFJlbGF0aW9uYWxFeHByZXNzaW9uX19Hcm91cF8xXzFfMF9fMCApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMTQ3MTozOiBydWxlX19YUmVsYXRpb25hbEV4cHJlc3Npb25fX0dyb3VwXzFfMV8wX18wCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMjgwOToyOiAoIHJ1bGVfX1hSZWxhdGlvbmFsRXhwcmVzc2lvbl9fR3JvdXBfMV8xXzBfXzAgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTI4MDk6MzogcnVsZV9fWFJlbGF0aW9uYWxFeHByZXNzaW9uX19Hcm91cF8xXzFfMF9fMAogICAgICAgICAgICAgewogICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMik7CiAgICAgICAgICAgICBydWxlX19YUmVsYXRpb25hbEV4cHJlc3Npb25fX0dyb3VwXzFfMV8wX18wKCk7CkBAIC0zODY3MCwxNCArNDMxMjcsMTQgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YUmVsYXRpb25hbEV4cHJlc3Npb25fX0dyb3VwXzFfMV9fMSIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMTQ3OToxOiBydWxlX19YUmVsYXRpb25hbEV4cHJlc3Npb25fX0dyb3VwXzFfMV9fMSA6IHJ1bGVfX1hSZWxhdGlvbmFsRXhwcmVzc2lvbl9fR3JvdXBfMV8xX18xX19JbXBsIDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMjgxNzoxOiBydWxlX19YUmVsYXRpb25hbEV4cHJlc3Npb25fX0dyb3VwXzFfMV9fMSA6IHJ1bGVfX1hSZWxhdGlvbmFsRXhwcmVzc2lvbl9fR3JvdXBfMV8xX18xX19JbXBsIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YUmVsYXRpb25hbEV4cHJlc3Npb25fX0dyb3VwXzFfMV9fMSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMTQ4MzoxOiAoIHJ1bGVfX1hSZWxhdGlvbmFsRXhwcmVzc2lvbl9fR3JvdXBfMV8xX18xX19JbXBsICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjExNDg0OjI6IHJ1bGVfX1hSZWxhdGlvbmFsRXhwcmVzc2lvbl9fR3JvdXBfMV8xX18xX19JbXBsCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMjgyMToxOiAoIHJ1bGVfX1hSZWxhdGlvbmFsRXhwcmVzc2lvbl9fR3JvdXBfMV8xX18xX19JbXBsICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEyODIyOjI6IHJ1bGVfX1hSZWxhdGlvbmFsRXhwcmVzc2lvbl9fR3JvdXBfMV8xX18xX19JbXBsCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV18yKTsKICAgICAgICAgICAgIHJ1bGVfX1hSZWxhdGlvbmFsRXhwcmVzc2lvbl9fR3JvdXBfMV8xX18xX19JbXBsKCk7CkBAIC0zODcwMywyMyArNDMxNjAsMjMgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YUmVsYXRpb25hbEV4cHJlc3Npb25fX0dyb3VwXzFfMV9fMV9fSW1wbCIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMTQ5MDoxOiBydWxlX19YUmVsYXRpb25hbEV4cHJlc3Npb25fX0dyb3VwXzFfMV9fMV9fSW1wbCA6ICggKCBydWxlX19YUmVsYXRpb25hbEV4cHJlc3Npb25fX1JpZ2h0T3BlcmFuZEFzc2lnbm1lbnRfMV8xXzEgKSApIDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMjgyODoxOiBydWxlX19YUmVsYXRpb25hbEV4cHJlc3Npb25fX0dyb3VwXzFfMV9fMV9fSW1wbCA6ICggKCBydWxlX19YUmVsYXRpb25hbEV4cHJlc3Npb25fX1JpZ2h0T3BlcmFuZEFzc2lnbm1lbnRfMV8xXzEgKSApIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YUmVsYXRpb25hbEV4cHJlc3Npb25fX0dyb3VwXzFfMV9fMV9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMTQ5NDoxOiAoICggKCBydWxlX19YUmVsYXRpb25hbEV4cHJlc3Npb25fX1JpZ2h0T3BlcmFuZEFzc2lnbm1lbnRfMV8xXzEgKSApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjExNDk1OjE6ICggKCBydWxlX19YUmVsYXRpb25hbEV4cHJlc3Npb25fX1JpZ2h0T3BlcmFuZEFzc2lnbm1lbnRfMV8xXzEgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMjgzMjoxOiAoICggKCBydWxlX19YUmVsYXRpb25hbEV4cHJlc3Npb25fX1JpZ2h0T3BlcmFuZEFzc2lnbm1lbnRfMV8xXzEgKSApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEyODMzOjE6ICggKCBydWxlX19YUmVsYXRpb25hbEV4cHJlc3Npb25fX1JpZ2h0T3BlcmFuZEFzc2lnbm1lbnRfMV8xXzEgKSApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMTQ5NToxOiAoICggcnVsZV9fWFJlbGF0aW9uYWxFeHByZXNzaW9uX19SaWdodE9wZXJhbmRBc3NpZ25tZW50XzFfMV8xICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTE0OTY6MjogKCBydWxlX19YUmVsYXRpb25hbEV4cHJlc3Npb25fX1JpZ2h0T3BlcmFuZEFzc2lnbm1lbnRfMV8xXzEgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTI4MzM6MTogKCAoIHJ1bGVfX1hSZWxhdGlvbmFsRXhwcmVzc2lvbl9fUmlnaHRPcGVyYW5kQXNzaWdubWVudF8xXzFfMSApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEyODM0OjI6ICggcnVsZV9fWFJlbGF0aW9uYWxFeHByZXNzaW9uX19SaWdodE9wZXJhbmRBc3NpZ25tZW50XzFfMV8xICkKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WFJlbGF0aW9uYWxFeHByZXNzaW9uQWNjZXNzKCkuZ2V0UmlnaHRPcGVyYW5kQXNzaWdubWVudF8xXzFfMSgpKTsgCiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMTQ5NzoyOiAoIHJ1bGVfX1hSZWxhdGlvbmFsRXhwcmVzc2lvbl9fUmlnaHRPcGVyYW5kQXNzaWdubWVudF8xXzFfMSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMTQ5NzozOiBydWxlX19YUmVsYXRpb25hbEV4cHJlc3Npb25fX1JpZ2h0T3BlcmFuZEFzc2lnbm1lbnRfMV8xXzEKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEyODM1OjI6ICggcnVsZV9fWFJlbGF0aW9uYWxFeHByZXNzaW9uX19SaWdodE9wZXJhbmRBc3NpZ25tZW50XzFfMV8xICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEyODM1OjM6IHJ1bGVfX1hSZWxhdGlvbmFsRXhwcmVzc2lvbl9fUmlnaHRPcGVyYW5kQXNzaWdubWVudF8xXzFfMQogICAgICAgICAgICAgewogICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMik7CiAgICAgICAgICAgICBydWxlX19YUmVsYXRpb25hbEV4cHJlc3Npb25fX1JpZ2h0T3BlcmFuZEFzc2lnbm1lbnRfMV8xXzEoKTsKQEAgLTM4NzU0LDE0ICs0MzIxMSwxNCBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX1hSZWxhdGlvbmFsRXhwcmVzc2lvbl9fR3JvdXBfMV8xXzBfXzAiCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTE1MDY6MTogcnVsZV9fWFJlbGF0aW9uYWxFeHByZXNzaW9uX19Hcm91cF8xXzFfMF9fMCA6IHJ1bGVfX1hSZWxhdGlvbmFsRXhwcmVzc2lvbl9fR3JvdXBfMV8xXzBfXzBfX0ltcGwgOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEyODQ0OjE6IHJ1bGVfX1hSZWxhdGlvbmFsRXhwcmVzc2lvbl9fR3JvdXBfMV8xXzBfXzAgOiBydWxlX19YUmVsYXRpb25hbEV4cHJlc3Npb25fX0dyb3VwXzFfMV8wX18wX19JbXBsIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YUmVsYXRpb25hbEV4cHJlc3Npb25fX0dyb3VwXzFfMV8wX18wKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjExNTEwOjE6ICggcnVsZV9fWFJlbGF0aW9uYWxFeHByZXNzaW9uX19Hcm91cF8xXzFfMF9fMF9fSW1wbCApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMTUxMToyOiBydWxlX19YUmVsYXRpb25hbEV4cHJlc3Npb25fX0dyb3VwXzFfMV8wX18wX19JbXBsCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMjg0ODoxOiAoIHJ1bGVfX1hSZWxhdGlvbmFsRXhwcmVzc2lvbl9fR3JvdXBfMV8xXzBfXzBfX0ltcGwgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTI4NDk6MjogcnVsZV9fWFJlbGF0aW9uYWxFeHByZXNzaW9uX19Hcm91cF8xXzFfMF9fMF9fSW1wbAogICAgICAgICAgICAgewogICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMik7CiAgICAgICAgICAgICBydWxlX19YUmVsYXRpb25hbEV4cHJlc3Npb25fX0dyb3VwXzFfMV8wX18wX19JbXBsKCk7CkBAIC0zODc4NywyMyArNDMyNDQsMjMgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YUmVsYXRpb25hbEV4cHJlc3Npb25fX0dyb3VwXzFfMV8wX18wX19JbXBsIgotICAgIC8vIEludGVybmFsRGF0YURTTC5nOjExNTE3OjE6IHJ1bGVfX1hSZWxhdGlvbmFsRXhwcmVzc2lvbl9fR3JvdXBfMV8xXzBfXzBfX0ltcGwgOiAoICggcnVsZV9fWFJlbGF0aW9uYWxFeHByZXNzaW9uX19Hcm91cF8xXzFfMF8wX18wICkgKSA7CisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTI4NTU6MTogcnVsZV9fWFJlbGF0aW9uYWxFeHByZXNzaW9uX19Hcm91cF8xXzFfMF9fMF9fSW1wbCA6ICggKCBydWxlX19YUmVsYXRpb25hbEV4cHJlc3Npb25fX0dyb3VwXzFfMV8wXzBfXzAgKSApIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YUmVsYXRpb25hbEV4cHJlc3Npb25fX0dyb3VwXzFfMV8wX18wX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjExNTIxOjE6ICggKCAoIHJ1bGVfX1hSZWxhdGlvbmFsRXhwcmVzc2lvbl9fR3JvdXBfMV8xXzBfMF9fMCApICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTE1MjI6MTogKCAoIHJ1bGVfX1hSZWxhdGlvbmFsRXhwcmVzc2lvbl9fR3JvdXBfMV8xXzBfMF9fMCApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEyODU5OjE6ICggKCAoIHJ1bGVfX1hSZWxhdGlvbmFsRXhwcmVzc2lvbl9fR3JvdXBfMV8xXzBfMF9fMCApICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTI4NjA6MTogKCAoIHJ1bGVfX1hSZWxhdGlvbmFsRXhwcmVzc2lvbl9fR3JvdXBfMV8xXzBfMF9fMCApICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjExNTIyOjE6ICggKCBydWxlX19YUmVsYXRpb25hbEV4cHJlc3Npb25fX0dyb3VwXzFfMV8wXzBfXzAgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMTUyMzoyOiAoIHJ1bGVfX1hSZWxhdGlvbmFsRXhwcmVzc2lvbl9fR3JvdXBfMV8xXzBfMF9fMCApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMjg2MDoxOiAoICggcnVsZV9fWFJlbGF0aW9uYWxFeHByZXNzaW9uX19Hcm91cF8xXzFfMF8wX18wICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTI4NjE6MjogKCBydWxlX19YUmVsYXRpb25hbEV4cHJlc3Npb25fX0dyb3VwXzFfMV8wXzBfXzAgKQogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYUmVsYXRpb25hbEV4cHJlc3Npb25BY2Nlc3MoKS5nZXRHcm91cF8xXzFfMF8wKCkpOyAKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjExNTI0OjI6ICggcnVsZV9fWFJlbGF0aW9uYWxFeHByZXNzaW9uX19Hcm91cF8xXzFfMF8wX18wICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjExNTI0OjM6IHJ1bGVfX1hSZWxhdGlvbmFsRXhwcmVzc2lvbl9fR3JvdXBfMV8xXzBfMF9fMAorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTI4NjI6MjogKCBydWxlX19YUmVsYXRpb25hbEV4cHJlc3Npb25fX0dyb3VwXzFfMV8wXzBfXzAgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTI4NjI6MzogcnVsZV9fWFJlbGF0aW9uYWxFeHByZXNzaW9uX19Hcm91cF8xXzFfMF8wX18wCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV18yKTsKICAgICAgICAgICAgIHJ1bGVfX1hSZWxhdGlvbmFsRXhwcmVzc2lvbl9fR3JvdXBfMV8xXzBfMF9fMCgpOwpAQCAtMzg4MzgsMTYgKzQzMjk1LDE2IEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fWFJlbGF0aW9uYWxFeHByZXNzaW9uX19Hcm91cF8xXzFfMF8wX18wIgotICAgIC8vIEludGVybmFsRGF0YURTTC5nOjExNTMzOjE6IHJ1bGVfX1hSZWxhdGlvbmFsRXhwcmVzc2lvbl9fR3JvdXBfMV8xXzBfMF9fMCA6IHJ1bGVfX1hSZWxhdGlvbmFsRXhwcmVzc2lvbl9fR3JvdXBfMV8xXzBfMF9fMF9fSW1wbCBydWxlX19YUmVsYXRpb25hbEV4cHJlc3Npb25fX0dyb3VwXzFfMV8wXzBfXzEgOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEyODcxOjE6IHJ1bGVfX1hSZWxhdGlvbmFsRXhwcmVzc2lvbl9fR3JvdXBfMV8xXzBfMF9fMCA6IHJ1bGVfX1hSZWxhdGlvbmFsRXhwcmVzc2lvbl9fR3JvdXBfMV8xXzBfMF9fMF9fSW1wbCBydWxlX19YUmVsYXRpb25hbEV4cHJlc3Npb25fX0dyb3VwXzFfMV8wXzBfXzEgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1hSZWxhdGlvbmFsRXhwcmVzc2lvbl9fR3JvdXBfMV8xXzBfMF9fMCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMTUzNzoxOiAoIHJ1bGVfX1hSZWxhdGlvbmFsRXhwcmVzc2lvbl9fR3JvdXBfMV8xXzBfMF9fMF9fSW1wbCBydWxlX19YUmVsYXRpb25hbEV4cHJlc3Npb25fX0dyb3VwXzFfMV8wXzBfXzEgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTE1Mzg6MjogcnVsZV9fWFJlbGF0aW9uYWxFeHByZXNzaW9uX19Hcm91cF8xXzFfMF8wX18wX19JbXBsIHJ1bGVfX1hSZWxhdGlvbmFsRXhwcmVzc2lvbl9fR3JvdXBfMV8xXzBfMF9fMQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTI4NzU6MTogKCBydWxlX19YUmVsYXRpb25hbEV4cHJlc3Npb25fX0dyb3VwXzFfMV8wXzBfXzBfX0ltcGwgcnVsZV9fWFJlbGF0aW9uYWxFeHByZXNzaW9uX19Hcm91cF8xXzFfMF8wX18xICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEyODc2OjI6IHJ1bGVfX1hSZWxhdGlvbmFsRXhwcmVzc2lvbl9fR3JvdXBfMV8xXzBfMF9fMF9fSW1wbCBydWxlX19YUmVsYXRpb25hbEV4cHJlc3Npb25fX0dyb3VwXzFfMV8wXzBfXzEKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzg5KTsKKyAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzk3KTsKICAgICAgICAgICAgIHJ1bGVfX1hSZWxhdGlvbmFsRXhwcmVzc2lvbl9fR3JvdXBfMV8xXzBfMF9fMF9fSW1wbCgpOwogCiAgICAgICAgICAgICBzdGF0ZS5fZnNwLS07CkBAIC0zODg3NiwyMyArNDMzMzMsMjMgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YUmVsYXRpb25hbEV4cHJlc3Npb25fX0dyb3VwXzFfMV8wXzBfXzBfX0ltcGwiCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTE1NDU6MTogcnVsZV9fWFJlbGF0aW9uYWxFeHByZXNzaW9uX19Hcm91cF8xXzFfMF8wX18wX19JbXBsIDogKCAoKSApIDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMjg4MzoxOiBydWxlX19YUmVsYXRpb25hbEV4cHJlc3Npb25fX0dyb3VwXzFfMV8wXzBfXzBfX0ltcGwgOiAoICgpICkgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1hSZWxhdGlvbmFsRXhwcmVzc2lvbl9fR3JvdXBfMV8xXzBfMF9fMF9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMTU0OToxOiAoICggKCkgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMTU1MDoxOiAoICgpICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEyODg3OjE6ICggKCAoKSApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEyODg4OjE6ICggKCkgKQogICAgICAgICAgICAgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTE1NTA6MTogKCAoKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMTU1MToyOiAoKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTI4ODg6MTogKCAoKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMjg4OToyOiAoKQogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYUmVsYXRpb25hbEV4cHJlc3Npb25BY2Nlc3MoKS5nZXRYQmluYXJ5T3BlcmF0aW9uTGVmdE9wZXJhbmRBY3Rpb25fMV8xXzBfMF8wKCkpOyAKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjExNTUyOjI6ICgpCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMTU1MjozOiAKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEyODkwOjI6ICgpCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMjg5MDozOiAKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIH0KIApAQCAtMzg5MTcsMTQgKzQzMzc0LDE0IEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fWFJlbGF0aW9uYWxFeHByZXNzaW9uX19Hcm91cF8xXzFfMF8wX18xIgotICAgIC8vIEludGVybmFsRGF0YURTTC5nOjExNTYwOjE6IHJ1bGVfX1hSZWxhdGlvbmFsRXhwcmVzc2lvbl9fR3JvdXBfMV8xXzBfMF9fMSA6IHJ1bGVfX1hSZWxhdGlvbmFsRXhwcmVzc2lvbl9fR3JvdXBfMV8xXzBfMF9fMV9fSW1wbCA7CisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTI4OTg6MTogcnVsZV9fWFJlbGF0aW9uYWxFeHByZXNzaW9uX19Hcm91cF8xXzFfMF8wX18xIDogcnVsZV9fWFJlbGF0aW9uYWxFeHByZXNzaW9uX19Hcm91cF8xXzFfMF8wX18xX19JbXBsIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YUmVsYXRpb25hbEV4cHJlc3Npb25fX0dyb3VwXzFfMV8wXzBfXzEoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTE1NjQ6MTogKCBydWxlX19YUmVsYXRpb25hbEV4cHJlc3Npb25fX0dyb3VwXzFfMV8wXzBfXzFfX0ltcGwgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTE1NjU6MjogcnVsZV9fWFJlbGF0aW9uYWxFeHByZXNzaW9uX19Hcm91cF8xXzFfMF8wX18xX19JbXBsCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMjkwMjoxOiAoIHJ1bGVfX1hSZWxhdGlvbmFsRXhwcmVzc2lvbl9fR3JvdXBfMV8xXzBfMF9fMV9fSW1wbCApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMjkwMzoyOiBydWxlX19YUmVsYXRpb25hbEV4cHJlc3Npb25fX0dyb3VwXzFfMV8wXzBfXzFfX0ltcGwKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzIpOwogICAgICAgICAgICAgcnVsZV9fWFJlbGF0aW9uYWxFeHByZXNzaW9uX19Hcm91cF8xXzFfMF8wX18xX19JbXBsKCk7CkBAIC0zODk1MCwyMyArNDM0MDcsMjMgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YUmVsYXRpb25hbEV4cHJlc3Npb25fX0dyb3VwXzFfMV8wXzBfXzFfX0ltcGwiCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTE1NzE6MTogcnVsZV9fWFJlbGF0aW9uYWxFeHByZXNzaW9uX19Hcm91cF8xXzFfMF8wX18xX19JbXBsIDogKCAoIHJ1bGVfX1hSZWxhdGlvbmFsRXhwcmVzc2lvbl9fRmVhdHVyZUFzc2lnbm1lbnRfMV8xXzBfMF8xICkgKSA7CisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTI5MDk6MTogcnVsZV9fWFJlbGF0aW9uYWxFeHByZXNzaW9uX19Hcm91cF8xXzFfMF8wX18xX19JbXBsIDogKCAoIHJ1bGVfX1hSZWxhdGlvbmFsRXhwcmVzc2lvbl9fRmVhdHVyZUFzc2lnbm1lbnRfMV8xXzBfMF8xICkgKSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fWFJlbGF0aW9uYWxFeHByZXNzaW9uX19Hcm91cF8xXzFfMF8wX18xX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjExNTc1OjE6ICggKCAoIHJ1bGVfX1hSZWxhdGlvbmFsRXhwcmVzc2lvbl9fRmVhdHVyZUFzc2lnbm1lbnRfMV8xXzBfMF8xICkgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMTU3NjoxOiAoICggcnVsZV9fWFJlbGF0aW9uYWxFeHByZXNzaW9uX19GZWF0dXJlQXNzaWdubWVudF8xXzFfMF8wXzEgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMjkxMzoxOiAoICggKCBydWxlX19YUmVsYXRpb25hbEV4cHJlc3Npb25fX0ZlYXR1cmVBc3NpZ25tZW50XzFfMV8wXzBfMSApICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTI5MTQ6MTogKCAoIHJ1bGVfX1hSZWxhdGlvbmFsRXhwcmVzc2lvbl9fRmVhdHVyZUFzc2lnbm1lbnRfMV8xXzBfMF8xICkgKQogICAgICAgICAgICAgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTE1NzY6MTogKCAoIHJ1bGVfX1hSZWxhdGlvbmFsRXhwcmVzc2lvbl9fRmVhdHVyZUFzc2lnbm1lbnRfMV8xXzBfMF8xICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTE1Nzc6MjogKCBydWxlX19YUmVsYXRpb25hbEV4cHJlc3Npb25fX0ZlYXR1cmVBc3NpZ25tZW50XzFfMV8wXzBfMSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMjkxNDoxOiAoICggcnVsZV9fWFJlbGF0aW9uYWxFeHByZXNzaW9uX19GZWF0dXJlQXNzaWdubWVudF8xXzFfMF8wXzEgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMjkxNToyOiAoIHJ1bGVfX1hSZWxhdGlvbmFsRXhwcmVzc2lvbl9fRmVhdHVyZUFzc2lnbm1lbnRfMV8xXzBfMF8xICkKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WFJlbGF0aW9uYWxFeHByZXNzaW9uQWNjZXNzKCkuZ2V0RmVhdHVyZUFzc2lnbm1lbnRfMV8xXzBfMF8xKCkpOyAKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjExNTc4OjI6ICggcnVsZV9fWFJlbGF0aW9uYWxFeHByZXNzaW9uX19GZWF0dXJlQXNzaWdubWVudF8xXzFfMF8wXzEgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTE1Nzg6MzogcnVsZV9fWFJlbGF0aW9uYWxFeHByZXNzaW9uX19GZWF0dXJlQXNzaWdubWVudF8xXzFfMF8wXzEKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEyOTE2OjI6ICggcnVsZV9fWFJlbGF0aW9uYWxFeHByZXNzaW9uX19GZWF0dXJlQXNzaWdubWVudF8xXzFfMF8wXzEgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTI5MTY6MzogcnVsZV9fWFJlbGF0aW9uYWxFeHByZXNzaW9uX19GZWF0dXJlQXNzaWdubWVudF8xXzFfMF8wXzEKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzIpOwogICAgICAgICAgICAgcnVsZV9fWFJlbGF0aW9uYWxFeHByZXNzaW9uX19GZWF0dXJlQXNzaWdubWVudF8xXzFfMF8wXzEoKTsKQEAgLTM5MDAxLDE2ICs0MzQ1OCwxNiBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX09wQ29tcGFyZV9fR3JvdXBfMV9fMCIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMTU4NzoxOiBydWxlX19PcENvbXBhcmVfX0dyb3VwXzFfXzAgOiBydWxlX19PcENvbXBhcmVfX0dyb3VwXzFfXzBfX0ltcGwgcnVsZV9fT3BDb21wYXJlX19Hcm91cF8xX18xIDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMjkyNToxOiBydWxlX19PcENvbXBhcmVfX0dyb3VwXzFfXzAgOiBydWxlX19PcENvbXBhcmVfX0dyb3VwXzFfXzBfX0ltcGwgcnVsZV9fT3BDb21wYXJlX19Hcm91cF8xX18xIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19PcENvbXBhcmVfX0dyb3VwXzFfXzAoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTE1OTE6MTogKCBydWxlX19PcENvbXBhcmVfX0dyb3VwXzFfXzBfX0ltcGwgcnVsZV9fT3BDb21wYXJlX19Hcm91cF8xX18xICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjExNTkyOjI6IHJ1bGVfX09wQ29tcGFyZV9fR3JvdXBfMV9fMF9fSW1wbCBydWxlX19PcENvbXBhcmVfX0dyb3VwXzFfXzEKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEyOTI5OjE6ICggcnVsZV9fT3BDb21wYXJlX19Hcm91cF8xX18wX19JbXBsIHJ1bGVfX09wQ29tcGFyZV9fR3JvdXBfMV9fMSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMjkzMDoyOiBydWxlX19PcENvbXBhcmVfX0dyb3VwXzFfXzBfX0ltcGwgcnVsZV9fT3BDb21wYXJlX19Hcm91cF8xX18xCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV183NSk7CisgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV184Myk7CiAgICAgICAgICAgICBydWxlX19PcENvbXBhcmVfX0dyb3VwXzFfXzBfX0ltcGwoKTsKIAogICAgICAgICAgICAgc3RhdGUuX2ZzcC0tOwpAQCAtMzkwMzksMTcgKzQzNDk2LDE3IEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fT3BDb21wYXJlX19Hcm91cF8xX18wX19JbXBsIgotICAgIC8vIEludGVybmFsRGF0YURTTC5nOjExNTk5OjE6IHJ1bGVfX09wQ29tcGFyZV9fR3JvdXBfMV9fMF9fSW1wbCA6ICggJzwnICkgOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEyOTM3OjE6IHJ1bGVfX09wQ29tcGFyZV9fR3JvdXBfMV9fMF9fSW1wbCA6ICggJzwnICkgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX09wQ29tcGFyZV9fR3JvdXBfMV9fMF9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMTYwMzoxOiAoICggJzwnICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTE2MDQ6MTogKCAnPCcgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTI5NDE6MTogKCAoICc8JyApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEyOTQyOjE6ICggJzwnICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjExNjA0OjE6ICggJzwnICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjExNjA1OjI6ICc8JworICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTI5NDI6MTogKCAnPCcgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTI5NDM6MjogJzwnCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldE9wQ29tcGFyZUFjY2VzcygpLmdldExlc3NUaGFuU2lnbktleXdvcmRfMV8wKCkpOyAKQEAgLTM5MDgwLDE0ICs0MzUzNywxNCBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX09wQ29tcGFyZV9fR3JvdXBfMV9fMSIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMTYxNDoxOiBydWxlX19PcENvbXBhcmVfX0dyb3VwXzFfXzEgOiBydWxlX19PcENvbXBhcmVfX0dyb3VwXzFfXzFfX0ltcGwgOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEyOTUyOjE6IHJ1bGVfX09wQ29tcGFyZV9fR3JvdXBfMV9fMSA6IHJ1bGVfX09wQ29tcGFyZV9fR3JvdXBfMV9fMV9fSW1wbCA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fT3BDb21wYXJlX19Hcm91cF8xX18xKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjExNjE4OjE6ICggcnVsZV9fT3BDb21wYXJlX19Hcm91cF8xX18xX19JbXBsICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjExNjE5OjI6IHJ1bGVfX09wQ29tcGFyZV9fR3JvdXBfMV9fMV9fSW1wbAorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTI5NTY6MTogKCBydWxlX19PcENvbXBhcmVfX0dyb3VwXzFfXzFfX0ltcGwgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTI5NTc6MjogcnVsZV9fT3BDb21wYXJlX19Hcm91cF8xX18xX19JbXBsCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV18yKTsKICAgICAgICAgICAgIHJ1bGVfX09wQ29tcGFyZV9fR3JvdXBfMV9fMV9fSW1wbCgpOwpAQCAtMzkxMTMsMTcgKzQzNTcwLDE3IEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fT3BDb21wYXJlX19Hcm91cF8xX18xX19JbXBsIgotICAgIC8vIEludGVybmFsRGF0YURTTC5nOjExNjI1OjE6IHJ1bGVfX09wQ29tcGFyZV9fR3JvdXBfMV9fMV9fSW1wbCA6ICggJz0nICkgOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEyOTYzOjE6IHJ1bGVfX09wQ29tcGFyZV9fR3JvdXBfMV9fMV9fSW1wbCA6ICggJz0nICkgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX09wQ29tcGFyZV9fR3JvdXBfMV9fMV9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMTYyOToxOiAoICggJz0nICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTE2MzA6MTogKCAnPScgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTI5Njc6MTogKCAoICc9JyApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEyOTY4OjE6ICggJz0nICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjExNjMwOjE6ICggJz0nICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjExNjMxOjI6ICc9JworICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTI5Njg6MTogKCAnPScgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTI5Njk6MjogJz0nCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldE9wQ29tcGFyZUFjY2VzcygpLmdldEVxdWFsc1NpZ25LZXl3b3JkXzFfMSgpKTsgCkBAIC0zOTE1NCwxNiArNDM2MTEsMTYgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YT3RoZXJPcGVyYXRvckV4cHJlc3Npb25fX0dyb3VwX18wIgotICAgIC8vIEludGVybmFsRGF0YURTTC5nOjExNjQxOjE6IHJ1bGVfX1hPdGhlck9wZXJhdG9yRXhwcmVzc2lvbl9fR3JvdXBfXzAgOiBydWxlX19YT3RoZXJPcGVyYXRvckV4cHJlc3Npb25fX0dyb3VwX18wX19JbXBsIHJ1bGVfX1hPdGhlck9wZXJhdG9yRXhwcmVzc2lvbl9fR3JvdXBfXzEgOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEyOTc5OjE6IHJ1bGVfX1hPdGhlck9wZXJhdG9yRXhwcmVzc2lvbl9fR3JvdXBfXzAgOiBydWxlX19YT3RoZXJPcGVyYXRvckV4cHJlc3Npb25fX0dyb3VwX18wX19JbXBsIHJ1bGVfX1hPdGhlck9wZXJhdG9yRXhwcmVzc2lvbl9fR3JvdXBfXzEgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1hPdGhlck9wZXJhdG9yRXhwcmVzc2lvbl9fR3JvdXBfXzAoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTE2NDU6MTogKCBydWxlX19YT3RoZXJPcGVyYXRvckV4cHJlc3Npb25fX0dyb3VwX18wX19JbXBsIHJ1bGVfX1hPdGhlck9wZXJhdG9yRXhwcmVzc2lvbl9fR3JvdXBfXzEgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTE2NDY6MjogcnVsZV9fWE90aGVyT3BlcmF0b3JFeHByZXNzaW9uX19Hcm91cF9fMF9fSW1wbCBydWxlX19YT3RoZXJPcGVyYXRvckV4cHJlc3Npb25fX0dyb3VwX18xCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMjk4MzoxOiAoIHJ1bGVfX1hPdGhlck9wZXJhdG9yRXhwcmVzc2lvbl9fR3JvdXBfXzBfX0ltcGwgcnVsZV9fWE90aGVyT3BlcmF0b3JFeHByZXNzaW9uX19Hcm91cF9fMSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMjk4NDoyOiBydWxlX19YT3RoZXJPcGVyYXRvckV4cHJlc3Npb25fX0dyb3VwX18wX19JbXBsIHJ1bGVfX1hPdGhlck9wZXJhdG9yRXhwcmVzc2lvbl9fR3JvdXBfXzEKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzkzKTsKKyAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzEwMSk7CiAgICAgICAgICAgICBydWxlX19YT3RoZXJPcGVyYXRvckV4cHJlc3Npb25fX0dyb3VwX18wX19JbXBsKCk7CiAKICAgICAgICAgICAgIHN0YXRlLl9mc3AtLTsKQEAgLTM5MTkyLDE3ICs0MzY0OSwxNyBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX1hPdGhlck9wZXJhdG9yRXhwcmVzc2lvbl9fR3JvdXBfXzBfX0ltcGwiCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTE2NTM6MTogcnVsZV9fWE90aGVyT3BlcmF0b3JFeHByZXNzaW9uX19Hcm91cF9fMF9fSW1wbCA6ICggcnVsZVhBZGRpdGl2ZUV4cHJlc3Npb24gKSA7CisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTI5OTE6MTogcnVsZV9fWE90aGVyT3BlcmF0b3JFeHByZXNzaW9uX19Hcm91cF9fMF9fSW1wbCA6ICggcnVsZVhBZGRpdGl2ZUV4cHJlc3Npb24gKSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fWE90aGVyT3BlcmF0b3JFeHByZXNzaW9uX19Hcm91cF9fMF9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMTY1NzoxOiAoICggcnVsZVhBZGRpdGl2ZUV4cHJlc3Npb24gKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMTY1ODoxOiAoIHJ1bGVYQWRkaXRpdmVFeHByZXNzaW9uICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEyOTk1OjE6ICggKCBydWxlWEFkZGl0aXZlRXhwcmVzc2lvbiApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEyOTk2OjE6ICggcnVsZVhBZGRpdGl2ZUV4cHJlc3Npb24gKQogICAgICAgICAgICAgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTE2NTg6MTogKCBydWxlWEFkZGl0aXZlRXhwcmVzc2lvbiApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMTY1OToyOiBydWxlWEFkZGl0aXZlRXhwcmVzc2lvbgorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTI5OTY6MTogKCBydWxlWEFkZGl0aXZlRXhwcmVzc2lvbiApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMjk5NzoyOiBydWxlWEFkZGl0aXZlRXhwcmVzc2lvbgogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYT3RoZXJPcGVyYXRvckV4cHJlc3Npb25BY2Nlc3MoKS5nZXRYQWRkaXRpdmVFeHByZXNzaW9uUGFyc2VyUnVsZUNhbGxfMCgpKTsgCkBAIC0zOTIzNywxNCArNDM2OTQsMTQgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YT3RoZXJPcGVyYXRvckV4cHJlc3Npb25fX0dyb3VwX18xIgotICAgIC8vIEludGVybmFsRGF0YURTTC5nOjExNjY4OjE6IHJ1bGVfX1hPdGhlck9wZXJhdG9yRXhwcmVzc2lvbl9fR3JvdXBfXzEgOiBydWxlX19YT3RoZXJPcGVyYXRvckV4cHJlc3Npb25fX0dyb3VwX18xX19JbXBsIDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMzAwNjoxOiBydWxlX19YT3RoZXJPcGVyYXRvckV4cHJlc3Npb25fX0dyb3VwX18xIDogcnVsZV9fWE90aGVyT3BlcmF0b3JFeHByZXNzaW9uX19Hcm91cF9fMV9fSW1wbCA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fWE90aGVyT3BlcmF0b3JFeHByZXNzaW9uX19Hcm91cF9fMSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMTY3MjoxOiAoIHJ1bGVfX1hPdGhlck9wZXJhdG9yRXhwcmVzc2lvbl9fR3JvdXBfXzFfX0ltcGwgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTE2NzM6MjogcnVsZV9fWE90aGVyT3BlcmF0b3JFeHByZXNzaW9uX19Hcm91cF9fMV9fSW1wbAorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTMwMTA6MTogKCBydWxlX19YT3RoZXJPcGVyYXRvckV4cHJlc3Npb25fX0dyb3VwX18xX19JbXBsICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEzMDExOjI6IHJ1bGVfX1hPdGhlck9wZXJhdG9yRXhwcmVzc2lvbl9fR3JvdXBfXzFfX0ltcGwKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzIpOwogICAgICAgICAgICAgcnVsZV9fWE90aGVyT3BlcmF0b3JFeHByZXNzaW9uX19Hcm91cF9fMV9fSW1wbCgpOwpAQCAtMzkyNzAsMzEgKzQzNzI3LDMxIEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fWE90aGVyT3BlcmF0b3JFeHByZXNzaW9uX19Hcm91cF9fMV9fSW1wbCIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMTY3OToxOiBydWxlX19YT3RoZXJPcGVyYXRvckV4cHJlc3Npb25fX0dyb3VwX18xX19JbXBsIDogKCAoIHJ1bGVfX1hPdGhlck9wZXJhdG9yRXhwcmVzc2lvbl9fR3JvdXBfMV9fMCApKiApIDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMzAxNzoxOiBydWxlX19YT3RoZXJPcGVyYXRvckV4cHJlc3Npb25fX0dyb3VwX18xX19JbXBsIDogKCAoIHJ1bGVfX1hPdGhlck9wZXJhdG9yRXhwcmVzc2lvbl9fR3JvdXBfMV9fMCApKiApIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YT3RoZXJPcGVyYXRvckV4cHJlc3Npb25fX0dyb3VwX18xX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjExNjgzOjE6ICggKCAoIHJ1bGVfX1hPdGhlck9wZXJhdG9yRXhwcmVzc2lvbl9fR3JvdXBfMV9fMCApKiApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjExNjg0OjE6ICggKCBydWxlX19YT3RoZXJPcGVyYXRvckV4cHJlc3Npb25fX0dyb3VwXzFfXzAgKSogKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTMwMjE6MTogKCAoICggcnVsZV9fWE90aGVyT3BlcmF0b3JFeHByZXNzaW9uX19Hcm91cF8xX18wICkqICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTMwMjI6MTogKCAoIHJ1bGVfX1hPdGhlck9wZXJhdG9yRXhwcmVzc2lvbl9fR3JvdXBfMV9fMCApKiApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMTY4NDoxOiAoICggcnVsZV9fWE90aGVyT3BlcmF0b3JFeHByZXNzaW9uX19Hcm91cF8xX18wICkqICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjExNjg1OjI6ICggcnVsZV9fWE90aGVyT3BlcmF0b3JFeHByZXNzaW9uX19Hcm91cF8xX18wICkqCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMzAyMjoxOiAoICggcnVsZV9fWE90aGVyT3BlcmF0b3JFeHByZXNzaW9uX19Hcm91cF8xX18wICkqICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEzMDIzOjI6ICggcnVsZV9fWE90aGVyT3BlcmF0b3JFeHByZXNzaW9uX19Hcm91cF8xX18wICkqCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhPdGhlck9wZXJhdG9yRXhwcmVzc2lvbkFjY2VzcygpLmdldEdyb3VwXzEoKSk7IAogICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTE2ODY6MjogKCBydWxlX19YT3RoZXJPcGVyYXRvckV4cHJlc3Npb25fX0dyb3VwXzFfXzAgKSoKLSAgICAgICAgICAgIGxvb3AxMDE6CisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMzAyNDoyOiAoIHJ1bGVfX1hPdGhlck9wZXJhdG9yRXhwcmVzc2lvbl9fR3JvdXBfMV9fMCApKgorICAgICAgICAgICAgbG9vcDExNDoKICAgICAgICAgICAgIGRvIHsKLSAgICAgICAgICAgICAgICBpbnQgYWx0MTAxPTI7Ci0gICAgICAgICAgICAgICAgYWx0MTAxID0gZGZhMTAxLnByZWRpY3QoaW5wdXQpOwotICAgICAgICAgICAgICAgIHN3aXRjaCAoYWx0MTAxKSB7CisgICAgICAgICAgICAgICAgaW50IGFsdDExND0yOworICAgICAgICAgICAgICAgIGFsdDExNCA9IGRmYTExNC5wcmVkaWN0KGlucHV0KTsKKyAgICAgICAgICAgICAgICBzd2l0Y2ggKGFsdDExNCkgewogICAgICAgICAgICAgCWNhc2UgMSA6Ci0gICAgICAgICAgICAJICAgIC8vIEludGVybmFsRGF0YURTTC5nOjExNjg2OjM6IHJ1bGVfX1hPdGhlck9wZXJhdG9yRXhwcmVzc2lvbl9fR3JvdXBfMV9fMAorICAgICAgICAgICAgCSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMzAyNDozOiBydWxlX19YT3RoZXJPcGVyYXRvckV4cHJlc3Npb25fX0dyb3VwXzFfXzAKICAgICAgICAgICAgIAkgICAgewotICAgICAgICAgICAgCSAgICBwdXNoRm9sbG93KEZPTExPV185NCk7CisgICAgICAgICAgICAJICAgIHB1c2hGb2xsb3coRk9MTE9XXzEwMik7CiAgICAgICAgICAgICAJICAgIHJ1bGVfX1hPdGhlck9wZXJhdG9yRXhwcmVzc2lvbl9fR3JvdXBfMV9fMCgpOwogCiAgICAgICAgICAgICAJICAgIHN0YXRlLl9mc3AtLTsKQEAgLTM5MzA0LDcgKzQzNzYxLDcgQEAKICAgICAgICAgICAgIAkgICAgYnJlYWs7CiAKICAgICAgICAgICAgIAlkZWZhdWx0IDoKLSAgICAgICAgICAgIAkgICAgYnJlYWsgbG9vcDEwMTsKKyAgICAgICAgICAgIAkgICAgYnJlYWsgbG9vcDExNDsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9IHdoaWxlICh0cnVlKTsKIApAQCAtMzkzMzMsMTYgKzQzNzkwLDE2IEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fWE90aGVyT3BlcmF0b3JFeHByZXNzaW9uX19Hcm91cF8xX18wIgotICAgIC8vIEludGVybmFsRGF0YURTTC5nOjExNjk1OjE6IHJ1bGVfX1hPdGhlck9wZXJhdG9yRXhwcmVzc2lvbl9fR3JvdXBfMV9fMCA6IHJ1bGVfX1hPdGhlck9wZXJhdG9yRXhwcmVzc2lvbl9fR3JvdXBfMV9fMF9fSW1wbCBydWxlX19YT3RoZXJPcGVyYXRvckV4cHJlc3Npb25fX0dyb3VwXzFfXzEgOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEzMDMzOjE6IHJ1bGVfX1hPdGhlck9wZXJhdG9yRXhwcmVzc2lvbl9fR3JvdXBfMV9fMCA6IHJ1bGVfX1hPdGhlck9wZXJhdG9yRXhwcmVzc2lvbl9fR3JvdXBfMV9fMF9fSW1wbCBydWxlX19YT3RoZXJPcGVyYXRvckV4cHJlc3Npb25fX0dyb3VwXzFfXzEgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1hPdGhlck9wZXJhdG9yRXhwcmVzc2lvbl9fR3JvdXBfMV9fMCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMTY5OToxOiAoIHJ1bGVfX1hPdGhlck9wZXJhdG9yRXhwcmVzc2lvbl9fR3JvdXBfMV9fMF9fSW1wbCBydWxlX19YT3RoZXJPcGVyYXRvckV4cHJlc3Npb25fX0dyb3VwXzFfXzEgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTE3MDA6MjogcnVsZV9fWE90aGVyT3BlcmF0b3JFeHByZXNzaW9uX19Hcm91cF8xX18wX19JbXBsIHJ1bGVfX1hPdGhlck9wZXJhdG9yRXhwcmVzc2lvbl9fR3JvdXBfMV9fMQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTMwMzc6MTogKCBydWxlX19YT3RoZXJPcGVyYXRvckV4cHJlc3Npb25fX0dyb3VwXzFfXzBfX0ltcGwgcnVsZV9fWE90aGVyT3BlcmF0b3JFeHByZXNzaW9uX19Hcm91cF8xX18xICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEzMDM4OjI6IHJ1bGVfX1hPdGhlck9wZXJhdG9yRXhwcmVzc2lvbl9fR3JvdXBfMV9fMF9fSW1wbCBydWxlX19YT3RoZXJPcGVyYXRvckV4cHJlc3Npb25fX0dyb3VwXzFfXzEKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzc0KTsKKyAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzgyKTsKICAgICAgICAgICAgIHJ1bGVfX1hPdGhlck9wZXJhdG9yRXhwcmVzc2lvbl9fR3JvdXBfMV9fMF9fSW1wbCgpOwogCiAgICAgICAgICAgICBzdGF0ZS5fZnNwLS07CkBAIC0zOTM3MSwyMyArNDM4MjgsMjMgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YT3RoZXJPcGVyYXRvckV4cHJlc3Npb25fX0dyb3VwXzFfXzBfX0ltcGwiCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTE3MDc6MTogcnVsZV9fWE90aGVyT3BlcmF0b3JFeHByZXNzaW9uX19Hcm91cF8xX18wX19JbXBsIDogKCAoIHJ1bGVfX1hPdGhlck9wZXJhdG9yRXhwcmVzc2lvbl9fR3JvdXBfMV8wX18wICkgKSA7CisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTMwNDU6MTogcnVsZV9fWE90aGVyT3BlcmF0b3JFeHByZXNzaW9uX19Hcm91cF8xX18wX19JbXBsIDogKCAoIHJ1bGVfX1hPdGhlck9wZXJhdG9yRXhwcmVzc2lvbl9fR3JvdXBfMV8wX18wICkgKSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fWE90aGVyT3BlcmF0b3JFeHByZXNzaW9uX19Hcm91cF8xX18wX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjExNzExOjE6ICggKCAoIHJ1bGVfX1hPdGhlck9wZXJhdG9yRXhwcmVzc2lvbl9fR3JvdXBfMV8wX18wICkgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMTcxMjoxOiAoICggcnVsZV9fWE90aGVyT3BlcmF0b3JFeHByZXNzaW9uX19Hcm91cF8xXzBfXzAgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMzA0OToxOiAoICggKCBydWxlX19YT3RoZXJPcGVyYXRvckV4cHJlc3Npb25fX0dyb3VwXzFfMF9fMCApICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTMwNTA6MTogKCAoIHJ1bGVfX1hPdGhlck9wZXJhdG9yRXhwcmVzc2lvbl9fR3JvdXBfMV8wX18wICkgKQogICAgICAgICAgICAgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTE3MTI6MTogKCAoIHJ1bGVfX1hPdGhlck9wZXJhdG9yRXhwcmVzc2lvbl9fR3JvdXBfMV8wX18wICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTE3MTM6MjogKCBydWxlX19YT3RoZXJPcGVyYXRvckV4cHJlc3Npb25fX0dyb3VwXzFfMF9fMCApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMzA1MDoxOiAoICggcnVsZV9fWE90aGVyT3BlcmF0b3JFeHByZXNzaW9uX19Hcm91cF8xXzBfXzAgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMzA1MToyOiAoIHJ1bGVfX1hPdGhlck9wZXJhdG9yRXhwcmVzc2lvbl9fR3JvdXBfMV8wX18wICkKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WE90aGVyT3BlcmF0b3JFeHByZXNzaW9uQWNjZXNzKCkuZ2V0R3JvdXBfMV8wKCkpOyAKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjExNzE0OjI6ICggcnVsZV9fWE90aGVyT3BlcmF0b3JFeHByZXNzaW9uX19Hcm91cF8xXzBfXzAgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTE3MTQ6MzogcnVsZV9fWE90aGVyT3BlcmF0b3JFeHByZXNzaW9uX19Hcm91cF8xXzBfXzAKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEzMDUyOjI6ICggcnVsZV9fWE90aGVyT3BlcmF0b3JFeHByZXNzaW9uX19Hcm91cF8xXzBfXzAgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTMwNTI6MzogcnVsZV9fWE90aGVyT3BlcmF0b3JFeHByZXNzaW9uX19Hcm91cF8xXzBfXzAKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzIpOwogICAgICAgICAgICAgcnVsZV9fWE90aGVyT3BlcmF0b3JFeHByZXNzaW9uX19Hcm91cF8xXzBfXzAoKTsKQEAgLTM5NDIyLDE0ICs0Mzg3OSwxNCBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX1hPdGhlck9wZXJhdG9yRXhwcmVzc2lvbl9fR3JvdXBfMV9fMSIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMTcyMjoxOiBydWxlX19YT3RoZXJPcGVyYXRvckV4cHJlc3Npb25fX0dyb3VwXzFfXzEgOiBydWxlX19YT3RoZXJPcGVyYXRvckV4cHJlc3Npb25fX0dyb3VwXzFfXzFfX0ltcGwgOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEzMDYwOjE6IHJ1bGVfX1hPdGhlck9wZXJhdG9yRXhwcmVzc2lvbl9fR3JvdXBfMV9fMSA6IHJ1bGVfX1hPdGhlck9wZXJhdG9yRXhwcmVzc2lvbl9fR3JvdXBfMV9fMV9fSW1wbCA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fWE90aGVyT3BlcmF0b3JFeHByZXNzaW9uX19Hcm91cF8xX18xKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjExNzI2OjE6ICggcnVsZV9fWE90aGVyT3BlcmF0b3JFeHByZXNzaW9uX19Hcm91cF8xX18xX19JbXBsICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjExNzI3OjI6IHJ1bGVfX1hPdGhlck9wZXJhdG9yRXhwcmVzc2lvbl9fR3JvdXBfMV9fMV9fSW1wbAorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTMwNjQ6MTogKCBydWxlX19YT3RoZXJPcGVyYXRvckV4cHJlc3Npb25fX0dyb3VwXzFfXzFfX0ltcGwgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTMwNjU6MjogcnVsZV9fWE90aGVyT3BlcmF0b3JFeHByZXNzaW9uX19Hcm91cF8xX18xX19JbXBsCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV18yKTsKICAgICAgICAgICAgIHJ1bGVfX1hPdGhlck9wZXJhdG9yRXhwcmVzc2lvbl9fR3JvdXBfMV9fMV9fSW1wbCgpOwpAQCAtMzk0NTUsMjMgKzQzOTEyLDIzIEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fWE90aGVyT3BlcmF0b3JFeHByZXNzaW9uX19Hcm91cF8xX18xX19JbXBsIgotICAgIC8vIEludGVybmFsRGF0YURTTC5nOjExNzMzOjE6IHJ1bGVfX1hPdGhlck9wZXJhdG9yRXhwcmVzc2lvbl9fR3JvdXBfMV9fMV9fSW1wbCA6ICggKCBydWxlX19YT3RoZXJPcGVyYXRvckV4cHJlc3Npb25fX1JpZ2h0T3BlcmFuZEFzc2lnbm1lbnRfMV8xICkgKSA7CisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTMwNzE6MTogcnVsZV9fWE90aGVyT3BlcmF0b3JFeHByZXNzaW9uX19Hcm91cF8xX18xX19JbXBsIDogKCAoIHJ1bGVfX1hPdGhlck9wZXJhdG9yRXhwcmVzc2lvbl9fUmlnaHRPcGVyYW5kQXNzaWdubWVudF8xXzEgKSApIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YT3RoZXJPcGVyYXRvckV4cHJlc3Npb25fX0dyb3VwXzFfXzFfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTE3Mzc6MTogKCAoICggcnVsZV9fWE90aGVyT3BlcmF0b3JFeHByZXNzaW9uX19SaWdodE9wZXJhbmRBc3NpZ25tZW50XzFfMSApICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTE3Mzg6MTogKCAoIHJ1bGVfX1hPdGhlck9wZXJhdG9yRXhwcmVzc2lvbl9fUmlnaHRPcGVyYW5kQXNzaWdubWVudF8xXzEgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMzA3NToxOiAoICggKCBydWxlX19YT3RoZXJPcGVyYXRvckV4cHJlc3Npb25fX1JpZ2h0T3BlcmFuZEFzc2lnbm1lbnRfMV8xICkgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMzA3NjoxOiAoICggcnVsZV9fWE90aGVyT3BlcmF0b3JFeHByZXNzaW9uX19SaWdodE9wZXJhbmRBc3NpZ25tZW50XzFfMSApICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjExNzM4OjE6ICggKCBydWxlX19YT3RoZXJPcGVyYXRvckV4cHJlc3Npb25fX1JpZ2h0T3BlcmFuZEFzc2lnbm1lbnRfMV8xICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTE3Mzk6MjogKCBydWxlX19YT3RoZXJPcGVyYXRvckV4cHJlc3Npb25fX1JpZ2h0T3BlcmFuZEFzc2lnbm1lbnRfMV8xICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEzMDc2OjE6ICggKCBydWxlX19YT3RoZXJPcGVyYXRvckV4cHJlc3Npb25fX1JpZ2h0T3BlcmFuZEFzc2lnbm1lbnRfMV8xICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTMwNzc6MjogKCBydWxlX19YT3RoZXJPcGVyYXRvckV4cHJlc3Npb25fX1JpZ2h0T3BlcmFuZEFzc2lnbm1lbnRfMV8xICkKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WE90aGVyT3BlcmF0b3JFeHByZXNzaW9uQWNjZXNzKCkuZ2V0UmlnaHRPcGVyYW5kQXNzaWdubWVudF8xXzEoKSk7IAogICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTE3NDA6MjogKCBydWxlX19YT3RoZXJPcGVyYXRvckV4cHJlc3Npb25fX1JpZ2h0T3BlcmFuZEFzc2lnbm1lbnRfMV8xICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjExNzQwOjM6IHJ1bGVfX1hPdGhlck9wZXJhdG9yRXhwcmVzc2lvbl9fUmlnaHRPcGVyYW5kQXNzaWdubWVudF8xXzEKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEzMDc4OjI6ICggcnVsZV9fWE90aGVyT3BlcmF0b3JFeHByZXNzaW9uX19SaWdodE9wZXJhbmRBc3NpZ25tZW50XzFfMSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMzA3ODozOiBydWxlX19YT3RoZXJPcGVyYXRvckV4cHJlc3Npb25fX1JpZ2h0T3BlcmFuZEFzc2lnbm1lbnRfMV8xCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV18yKTsKICAgICAgICAgICAgIHJ1bGVfX1hPdGhlck9wZXJhdG9yRXhwcmVzc2lvbl9fUmlnaHRPcGVyYW5kQXNzaWdubWVudF8xXzEoKTsKQEAgLTM5NTA2LDE0ICs0Mzk2MywxNCBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX1hPdGhlck9wZXJhdG9yRXhwcmVzc2lvbl9fR3JvdXBfMV8wX18wIgotICAgIC8vIEludGVybmFsRGF0YURTTC5nOjExNzQ5OjE6IHJ1bGVfX1hPdGhlck9wZXJhdG9yRXhwcmVzc2lvbl9fR3JvdXBfMV8wX18wIDogcnVsZV9fWE90aGVyT3BlcmF0b3JFeHByZXNzaW9uX19Hcm91cF8xXzBfXzBfX0ltcGwgOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEzMDg3OjE6IHJ1bGVfX1hPdGhlck9wZXJhdG9yRXhwcmVzc2lvbl9fR3JvdXBfMV8wX18wIDogcnVsZV9fWE90aGVyT3BlcmF0b3JFeHByZXNzaW9uX19Hcm91cF8xXzBfXzBfX0ltcGwgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1hPdGhlck9wZXJhdG9yRXhwcmVzc2lvbl9fR3JvdXBfMV8wX18wKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjExNzUzOjE6ICggcnVsZV9fWE90aGVyT3BlcmF0b3JFeHByZXNzaW9uX19Hcm91cF8xXzBfXzBfX0ltcGwgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTE3NTQ6MjogcnVsZV9fWE90aGVyT3BlcmF0b3JFeHByZXNzaW9uX19Hcm91cF8xXzBfXzBfX0ltcGwKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEzMDkxOjE6ICggcnVsZV9fWE90aGVyT3BlcmF0b3JFeHByZXNzaW9uX19Hcm91cF8xXzBfXzBfX0ltcGwgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTMwOTI6MjogcnVsZV9fWE90aGVyT3BlcmF0b3JFeHByZXNzaW9uX19Hcm91cF8xXzBfXzBfX0ltcGwKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzIpOwogICAgICAgICAgICAgcnVsZV9fWE90aGVyT3BlcmF0b3JFeHByZXNzaW9uX19Hcm91cF8xXzBfXzBfX0ltcGwoKTsKQEAgLTM5NTM5LDIzICs0Mzk5NiwyMyBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX1hPdGhlck9wZXJhdG9yRXhwcmVzc2lvbl9fR3JvdXBfMV8wX18wX19JbXBsIgotICAgIC8vIEludGVybmFsRGF0YURTTC5nOjExNzYwOjE6IHJ1bGVfX1hPdGhlck9wZXJhdG9yRXhwcmVzc2lvbl9fR3JvdXBfMV8wX18wX19JbXBsIDogKCAoIHJ1bGVfX1hPdGhlck9wZXJhdG9yRXhwcmVzc2lvbl9fR3JvdXBfMV8wXzBfXzAgKSApIDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMzA5ODoxOiBydWxlX19YT3RoZXJPcGVyYXRvckV4cHJlc3Npb25fX0dyb3VwXzFfMF9fMF9fSW1wbCA6ICggKCBydWxlX19YT3RoZXJPcGVyYXRvckV4cHJlc3Npb25fX0dyb3VwXzFfMF8wX18wICkgKSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fWE90aGVyT3BlcmF0b3JFeHByZXNzaW9uX19Hcm91cF8xXzBfXzBfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTE3NjQ6MTogKCAoICggcnVsZV9fWE90aGVyT3BlcmF0b3JFeHByZXNzaW9uX19Hcm91cF8xXzBfMF9fMCApICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTE3NjU6MTogKCAoIHJ1bGVfX1hPdGhlck9wZXJhdG9yRXhwcmVzc2lvbl9fR3JvdXBfMV8wXzBfXzAgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMzEwMjoxOiAoICggKCBydWxlX19YT3RoZXJPcGVyYXRvckV4cHJlc3Npb25fX0dyb3VwXzFfMF8wX18wICkgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMzEwMzoxOiAoICggcnVsZV9fWE90aGVyT3BlcmF0b3JFeHByZXNzaW9uX19Hcm91cF8xXzBfMF9fMCApICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjExNzY1OjE6ICggKCBydWxlX19YT3RoZXJPcGVyYXRvckV4cHJlc3Npb25fX0dyb3VwXzFfMF8wX18wICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTE3NjY6MjogKCBydWxlX19YT3RoZXJPcGVyYXRvckV4cHJlc3Npb25fX0dyb3VwXzFfMF8wX18wICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEzMTAzOjE6ICggKCBydWxlX19YT3RoZXJPcGVyYXRvckV4cHJlc3Npb25fX0dyb3VwXzFfMF8wX18wICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTMxMDQ6MjogKCBydWxlX19YT3RoZXJPcGVyYXRvckV4cHJlc3Npb25fX0dyb3VwXzFfMF8wX18wICkKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WE90aGVyT3BlcmF0b3JFeHByZXNzaW9uQWNjZXNzKCkuZ2V0R3JvdXBfMV8wXzAoKSk7IAogICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTE3Njc6MjogKCBydWxlX19YT3RoZXJPcGVyYXRvckV4cHJlc3Npb25fX0dyb3VwXzFfMF8wX18wICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjExNzY3OjM6IHJ1bGVfX1hPdGhlck9wZXJhdG9yRXhwcmVzc2lvbl9fR3JvdXBfMV8wXzBfXzAKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEzMTA1OjI6ICggcnVsZV9fWE90aGVyT3BlcmF0b3JFeHByZXNzaW9uX19Hcm91cF8xXzBfMF9fMCApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMzEwNTozOiBydWxlX19YT3RoZXJPcGVyYXRvckV4cHJlc3Npb25fX0dyb3VwXzFfMF8wX18wCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV18yKTsKICAgICAgICAgICAgIHJ1bGVfX1hPdGhlck9wZXJhdG9yRXhwcmVzc2lvbl9fR3JvdXBfMV8wXzBfXzAoKTsKQEAgLTM5NTkwLDE2ICs0NDA0NywxNiBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX1hPdGhlck9wZXJhdG9yRXhwcmVzc2lvbl9fR3JvdXBfMV8wXzBfXzAiCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTE3NzY6MTogcnVsZV9fWE90aGVyT3BlcmF0b3JFeHByZXNzaW9uX19Hcm91cF8xXzBfMF9fMCA6IHJ1bGVfX1hPdGhlck9wZXJhdG9yRXhwcmVzc2lvbl9fR3JvdXBfMV8wXzBfXzBfX0ltcGwgcnVsZV9fWE90aGVyT3BlcmF0b3JFeHByZXNzaW9uX19Hcm91cF8xXzBfMF9fMSA7CisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTMxMTQ6MTogcnVsZV9fWE90aGVyT3BlcmF0b3JFeHByZXNzaW9uX19Hcm91cF8xXzBfMF9fMCA6IHJ1bGVfX1hPdGhlck9wZXJhdG9yRXhwcmVzc2lvbl9fR3JvdXBfMV8wXzBfXzBfX0ltcGwgcnVsZV9fWE90aGVyT3BlcmF0b3JFeHByZXNzaW9uX19Hcm91cF8xXzBfMF9fMSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fWE90aGVyT3BlcmF0b3JFeHByZXNzaW9uX19Hcm91cF8xXzBfMF9fMCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMTc4MDoxOiAoIHJ1bGVfX1hPdGhlck9wZXJhdG9yRXhwcmVzc2lvbl9fR3JvdXBfMV8wXzBfXzBfX0ltcGwgcnVsZV9fWE90aGVyT3BlcmF0b3JFeHByZXNzaW9uX19Hcm91cF8xXzBfMF9fMSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMTc4MToyOiBydWxlX19YT3RoZXJPcGVyYXRvckV4cHJlc3Npb25fX0dyb3VwXzFfMF8wX18wX19JbXBsIHJ1bGVfX1hPdGhlck9wZXJhdG9yRXhwcmVzc2lvbl9fR3JvdXBfMV8wXzBfXzEKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEzMTE4OjE6ICggcnVsZV9fWE90aGVyT3BlcmF0b3JFeHByZXNzaW9uX19Hcm91cF8xXzBfMF9fMF9fSW1wbCBydWxlX19YT3RoZXJPcGVyYXRvckV4cHJlc3Npb25fX0dyb3VwXzFfMF8wX18xICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEzMTE5OjI6IHJ1bGVfX1hPdGhlck9wZXJhdG9yRXhwcmVzc2lvbl9fR3JvdXBfMV8wXzBfXzBfX0ltcGwgcnVsZV9fWE90aGVyT3BlcmF0b3JFeHByZXNzaW9uX19Hcm91cF8xXzBfMF9fMQogICAgICAgICAgICAgewotICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfOTMpOworICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMTAxKTsKICAgICAgICAgICAgIHJ1bGVfX1hPdGhlck9wZXJhdG9yRXhwcmVzc2lvbl9fR3JvdXBfMV8wXzBfXzBfX0ltcGwoKTsKIAogICAgICAgICAgICAgc3RhdGUuX2ZzcC0tOwpAQCAtMzk2MjgsMjMgKzQ0MDg1LDIzIEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fWE90aGVyT3BlcmF0b3JFeHByZXNzaW9uX19Hcm91cF8xXzBfMF9fMF9fSW1wbCIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMTc4ODoxOiBydWxlX19YT3RoZXJPcGVyYXRvckV4cHJlc3Npb25fX0dyb3VwXzFfMF8wX18wX19JbXBsIDogKCAoKSApIDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMzEyNjoxOiBydWxlX19YT3RoZXJPcGVyYXRvckV4cHJlc3Npb25fX0dyb3VwXzFfMF8wX18wX19JbXBsIDogKCAoKSApIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YT3RoZXJPcGVyYXRvckV4cHJlc3Npb25fX0dyb3VwXzFfMF8wX18wX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjExNzkyOjE6ICggKCAoKSApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjExNzkzOjE6ICggKCkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTMxMzA6MTogKCAoICgpICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTMxMzE6MTogKCAoKSApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMTc5MzoxOiAoICgpICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjExNzk0OjI6ICgpCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMzEzMToxOiAoICgpICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEzMTMyOjI6ICgpCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhPdGhlck9wZXJhdG9yRXhwcmVzc2lvbkFjY2VzcygpLmdldFhCaW5hcnlPcGVyYXRpb25MZWZ0T3BlcmFuZEFjdGlvbl8xXzBfMF8wKCkpOyAKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjExNzk1OjI6ICgpCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMTc5NTozOiAKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEzMTMzOjI6ICgpCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMzEzMzozOiAKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIH0KIApAQCAtMzk2NjksMTQgKzQ0MTI2LDE0IEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fWE90aGVyT3BlcmF0b3JFeHByZXNzaW9uX19Hcm91cF8xXzBfMF9fMSIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMTgwMzoxOiBydWxlX19YT3RoZXJPcGVyYXRvckV4cHJlc3Npb25fX0dyb3VwXzFfMF8wX18xIDogcnVsZV9fWE90aGVyT3BlcmF0b3JFeHByZXNzaW9uX19Hcm91cF8xXzBfMF9fMV9fSW1wbCA7CisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTMxNDE6MTogcnVsZV9fWE90aGVyT3BlcmF0b3JFeHByZXNzaW9uX19Hcm91cF8xXzBfMF9fMSA6IHJ1bGVfX1hPdGhlck9wZXJhdG9yRXhwcmVzc2lvbl9fR3JvdXBfMV8wXzBfXzFfX0ltcGwgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1hPdGhlck9wZXJhdG9yRXhwcmVzc2lvbl9fR3JvdXBfMV8wXzBfXzEoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTE4MDc6MTogKCBydWxlX19YT3RoZXJPcGVyYXRvckV4cHJlc3Npb25fX0dyb3VwXzFfMF8wX18xX19JbXBsICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjExODA4OjI6IHJ1bGVfX1hPdGhlck9wZXJhdG9yRXhwcmVzc2lvbl9fR3JvdXBfMV8wXzBfXzFfX0ltcGwKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEzMTQ1OjE6ICggcnVsZV9fWE90aGVyT3BlcmF0b3JFeHByZXNzaW9uX19Hcm91cF8xXzBfMF9fMV9fSW1wbCApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMzE0NjoyOiBydWxlX19YT3RoZXJPcGVyYXRvckV4cHJlc3Npb25fX0dyb3VwXzFfMF8wX18xX19JbXBsCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV18yKTsKICAgICAgICAgICAgIHJ1bGVfX1hPdGhlck9wZXJhdG9yRXhwcmVzc2lvbl9fR3JvdXBfMV8wXzBfXzFfX0ltcGwoKTsKQEAgLTM5NzAyLDIzICs0NDE1OSwyMyBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX1hPdGhlck9wZXJhdG9yRXhwcmVzc2lvbl9fR3JvdXBfMV8wXzBfXzFfX0ltcGwiCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTE4MTQ6MTogcnVsZV9fWE90aGVyT3BlcmF0b3JFeHByZXNzaW9uX19Hcm91cF8xXzBfMF9fMV9fSW1wbCA6ICggKCBydWxlX19YT3RoZXJPcGVyYXRvckV4cHJlc3Npb25fX0ZlYXR1cmVBc3NpZ25tZW50XzFfMF8wXzEgKSApIDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMzE1MjoxOiBydWxlX19YT3RoZXJPcGVyYXRvckV4cHJlc3Npb25fX0dyb3VwXzFfMF8wX18xX19JbXBsIDogKCAoIHJ1bGVfX1hPdGhlck9wZXJhdG9yRXhwcmVzc2lvbl9fRmVhdHVyZUFzc2lnbm1lbnRfMV8wXzBfMSApICkgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1hPdGhlck9wZXJhdG9yRXhwcmVzc2lvbl9fR3JvdXBfMV8wXzBfXzFfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTE4MTg6MTogKCAoICggcnVsZV9fWE90aGVyT3BlcmF0b3JFeHByZXNzaW9uX19GZWF0dXJlQXNzaWdubWVudF8xXzBfMF8xICkgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMTgxOToxOiAoICggcnVsZV9fWE90aGVyT3BlcmF0b3JFeHByZXNzaW9uX19GZWF0dXJlQXNzaWdubWVudF8xXzBfMF8xICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTMxNTY6MTogKCAoICggcnVsZV9fWE90aGVyT3BlcmF0b3JFeHByZXNzaW9uX19GZWF0dXJlQXNzaWdubWVudF8xXzBfMF8xICkgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMzE1NzoxOiAoICggcnVsZV9fWE90aGVyT3BlcmF0b3JFeHByZXNzaW9uX19GZWF0dXJlQXNzaWdubWVudF8xXzBfMF8xICkgKQogICAgICAgICAgICAgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTE4MTk6MTogKCAoIHJ1bGVfX1hPdGhlck9wZXJhdG9yRXhwcmVzc2lvbl9fRmVhdHVyZUFzc2lnbm1lbnRfMV8wXzBfMSApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjExODIwOjI6ICggcnVsZV9fWE90aGVyT3BlcmF0b3JFeHByZXNzaW9uX19GZWF0dXJlQXNzaWdubWVudF8xXzBfMF8xICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEzMTU3OjE6ICggKCBydWxlX19YT3RoZXJPcGVyYXRvckV4cHJlc3Npb25fX0ZlYXR1cmVBc3NpZ25tZW50XzFfMF8wXzEgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMzE1ODoyOiAoIHJ1bGVfX1hPdGhlck9wZXJhdG9yRXhwcmVzc2lvbl9fRmVhdHVyZUFzc2lnbm1lbnRfMV8wXzBfMSApCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhPdGhlck9wZXJhdG9yRXhwcmVzc2lvbkFjY2VzcygpLmdldEZlYXR1cmVBc3NpZ25tZW50XzFfMF8wXzEoKSk7IAogICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTE4MjE6MjogKCBydWxlX19YT3RoZXJPcGVyYXRvckV4cHJlc3Npb25fX0ZlYXR1cmVBc3NpZ25tZW50XzFfMF8wXzEgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTE4MjE6MzogcnVsZV9fWE90aGVyT3BlcmF0b3JFeHByZXNzaW9uX19GZWF0dXJlQXNzaWdubWVudF8xXzBfMF8xCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMzE1OToyOiAoIHJ1bGVfX1hPdGhlck9wZXJhdG9yRXhwcmVzc2lvbl9fRmVhdHVyZUFzc2lnbm1lbnRfMV8wXzBfMSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMzE1OTozOiBydWxlX19YT3RoZXJPcGVyYXRvckV4cHJlc3Npb25fX0ZlYXR1cmVBc3NpZ25tZW50XzFfMF8wXzEKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzIpOwogICAgICAgICAgICAgcnVsZV9fWE90aGVyT3BlcmF0b3JFeHByZXNzaW9uX19GZWF0dXJlQXNzaWdubWVudF8xXzBfMF8xKCk7CkBAIC0zOTc1MywxNiArNDQyMTAsMTYgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19PcE90aGVyX19Hcm91cF8yX18wIgotICAgIC8vIEludGVybmFsRGF0YURTTC5nOjExODMwOjE6IHJ1bGVfX09wT3RoZXJfX0dyb3VwXzJfXzAgOiBydWxlX19PcE90aGVyX19Hcm91cF8yX18wX19JbXBsIHJ1bGVfX09wT3RoZXJfX0dyb3VwXzJfXzEgOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEzMTY4OjE6IHJ1bGVfX09wT3RoZXJfX0dyb3VwXzJfXzAgOiBydWxlX19PcE90aGVyX19Hcm91cF8yX18wX19JbXBsIHJ1bGVfX09wT3RoZXJfX0dyb3VwXzJfXzEgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX09wT3RoZXJfX0dyb3VwXzJfXzAoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTE4MzQ6MTogKCBydWxlX19PcE90aGVyX19Hcm91cF8yX18wX19JbXBsIHJ1bGVfX09wT3RoZXJfX0dyb3VwXzJfXzEgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTE4MzU6MjogcnVsZV9fT3BPdGhlcl9fR3JvdXBfMl9fMF9fSW1wbCBydWxlX19PcE90aGVyX19Hcm91cF8yX18xCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMzE3MjoxOiAoIHJ1bGVfX09wT3RoZXJfX0dyb3VwXzJfXzBfX0ltcGwgcnVsZV9fT3BPdGhlcl9fR3JvdXBfMl9fMSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMzE3MzoyOiBydWxlX19PcE90aGVyX19Hcm91cF8yX18wX19JbXBsIHJ1bGVfX09wT3RoZXJfX0dyb3VwXzJfXzEKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzk1KTsKKyAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzEwMyk7CiAgICAgICAgICAgICBydWxlX19PcE90aGVyX19Hcm91cF8yX18wX19JbXBsKCk7CiAKICAgICAgICAgICAgIHN0YXRlLl9mc3AtLTsKQEAgLTM5NzkxLDE3ICs0NDI0OCwxNyBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX09wT3RoZXJfX0dyb3VwXzJfXzBfX0ltcGwiCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTE4NDI6MTogcnVsZV9fT3BPdGhlcl9fR3JvdXBfMl9fMF9fSW1wbCA6ICggJz4nICkgOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEzMTgwOjE6IHJ1bGVfX09wT3RoZXJfX0dyb3VwXzJfXzBfX0ltcGwgOiAoICc+JyApIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19PcE90aGVyX19Hcm91cF8yX18wX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjExODQ2OjE6ICggKCAnPicgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMTg0NzoxOiAoICc+JyApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMzE4NDoxOiAoICggJz4nICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTMxODU6MTogKCAnPicgKQogICAgICAgICAgICAgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTE4NDc6MTogKCAnPicgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTE4NDg6MjogJz4nCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMzE4NToxOiAoICc+JyApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMzE4NjoyOiAnPicKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0T3BPdGhlckFjY2VzcygpLmdldEdyZWF0ZXJUaGFuU2lnbktleXdvcmRfMl8wKCkpOyAKQEAgLTM5ODMyLDE0ICs0NDI4OSwxNCBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX09wT3RoZXJfX0dyb3VwXzJfXzEiCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTE4NTc6MTogcnVsZV9fT3BPdGhlcl9fR3JvdXBfMl9fMSA6IHJ1bGVfX09wT3RoZXJfX0dyb3VwXzJfXzFfX0ltcGwgOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEzMTk1OjE6IHJ1bGVfX09wT3RoZXJfX0dyb3VwXzJfXzEgOiBydWxlX19PcE90aGVyX19Hcm91cF8yX18xX19JbXBsIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19PcE90aGVyX19Hcm91cF8yX18xKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjExODYxOjE6ICggcnVsZV9fT3BPdGhlcl9fR3JvdXBfMl9fMV9fSW1wbCApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMTg2MjoyOiBydWxlX19PcE90aGVyX19Hcm91cF8yX18xX19JbXBsCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMzE5OToxOiAoIHJ1bGVfX09wT3RoZXJfX0dyb3VwXzJfXzFfX0ltcGwgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTMyMDA6MjogcnVsZV9fT3BPdGhlcl9fR3JvdXBfMl9fMV9fSW1wbAogICAgICAgICAgICAgewogICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMik7CiAgICAgICAgICAgICBydWxlX19PcE90aGVyX19Hcm91cF8yX18xX19JbXBsKCk7CkBAIC0zOTg2NSwxNyArNDQzMjIsMTcgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19PcE90aGVyX19Hcm91cF8yX18xX19JbXBsIgotICAgIC8vIEludGVybmFsRGF0YURTTC5nOjExODY4OjE6IHJ1bGVfX09wT3RoZXJfX0dyb3VwXzJfXzFfX0ltcGwgOiAoICcuLicgKSA7CisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTMyMDY6MTogcnVsZV9fT3BPdGhlcl9fR3JvdXBfMl9fMV9fSW1wbCA6ICggJy4uJyApIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19PcE90aGVyX19Hcm91cF8yX18xX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjExODcyOjE6ICggKCAnLi4nICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTE4NzM6MTogKCAnLi4nICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEzMjEwOjE6ICggKCAnLi4nICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTMyMTE6MTogKCAnLi4nICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjExODczOjE6ICggJy4uJyApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMTg3NDoyOiAnLi4nCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMzIxMToxOiAoICcuLicgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTMyMTI6MjogJy4uJwogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRPcE90aGVyQWNjZXNzKCkuZ2V0RnVsbFN0b3BGdWxsU3RvcEtleXdvcmRfMl8xKCkpOyAKQEAgLTM5OTA2LDE2ICs0NDM2MywxNiBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX09wT3RoZXJfX0dyb3VwXzVfXzAiCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTE4ODQ6MTogcnVsZV9fT3BPdGhlcl9fR3JvdXBfNV9fMCA6IHJ1bGVfX09wT3RoZXJfX0dyb3VwXzVfXzBfX0ltcGwgcnVsZV9fT3BPdGhlcl9fR3JvdXBfNV9fMSA7CisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTMyMjI6MTogcnVsZV9fT3BPdGhlcl9fR3JvdXBfNV9fMCA6IHJ1bGVfX09wT3RoZXJfX0dyb3VwXzVfXzBfX0ltcGwgcnVsZV9fT3BPdGhlcl9fR3JvdXBfNV9fMSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fT3BPdGhlcl9fR3JvdXBfNV9fMCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMTg4ODoxOiAoIHJ1bGVfX09wT3RoZXJfX0dyb3VwXzVfXzBfX0ltcGwgcnVsZV9fT3BPdGhlcl9fR3JvdXBfNV9fMSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMTg4OToyOiBydWxlX19PcE90aGVyX19Hcm91cF81X18wX19JbXBsIHJ1bGVfX09wT3RoZXJfX0dyb3VwXzVfXzEKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEzMjI2OjE6ICggcnVsZV9fT3BPdGhlcl9fR3JvdXBfNV9fMF9fSW1wbCBydWxlX19PcE90aGVyX19Hcm91cF81X18xICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEzMjI3OjI6IHJ1bGVfX09wT3RoZXJfX0dyb3VwXzVfXzBfX0ltcGwgcnVsZV9fT3BPdGhlcl9fR3JvdXBfNV9fMQogICAgICAgICAgICAgewotICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfOTYpOworICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMTA0KTsKICAgICAgICAgICAgIHJ1bGVfX09wT3RoZXJfX0dyb3VwXzVfXzBfX0ltcGwoKTsKIAogICAgICAgICAgICAgc3RhdGUuX2ZzcC0tOwpAQCAtMzk5NDQsMTcgKzQ0NDAxLDE3IEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fT3BPdGhlcl9fR3JvdXBfNV9fMF9fSW1wbCIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMTg5NjoxOiBydWxlX19PcE90aGVyX19Hcm91cF81X18wX19JbXBsIDogKCAnPicgKSA7CisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTMyMzQ6MTogcnVsZV9fT3BPdGhlcl9fR3JvdXBfNV9fMF9fSW1wbCA6ICggJz4nICkgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX09wT3RoZXJfX0dyb3VwXzVfXzBfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTE5MDA6MTogKCAoICc+JyApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjExOTAxOjE6ICggJz4nICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEzMjM4OjE6ICggKCAnPicgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMzIzOToxOiAoICc+JyApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMTkwMToxOiAoICc+JyApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMTkwMjoyOiAnPicKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEzMjM5OjE6ICggJz4nICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEzMjQwOjI6ICc+JwogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRPcE90aGVyQWNjZXNzKCkuZ2V0R3JlYXRlclRoYW5TaWduS2V5d29yZF81XzAoKSk7IApAQCAtMzk5ODUsMTQgKzQ0NDQyLDE0IEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fT3BPdGhlcl9fR3JvdXBfNV9fMSIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMTkxMToxOiBydWxlX19PcE90aGVyX19Hcm91cF81X18xIDogcnVsZV9fT3BPdGhlcl9fR3JvdXBfNV9fMV9fSW1wbCA7CisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTMyNDk6MTogcnVsZV9fT3BPdGhlcl9fR3JvdXBfNV9fMSA6IHJ1bGVfX09wT3RoZXJfX0dyb3VwXzVfXzFfX0ltcGwgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX09wT3RoZXJfX0dyb3VwXzVfXzEoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTE5MTU6MTogKCBydWxlX19PcE90aGVyX19Hcm91cF81X18xX19JbXBsICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjExOTE2OjI6IHJ1bGVfX09wT3RoZXJfX0dyb3VwXzVfXzFfX0ltcGwKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEzMjUzOjE6ICggcnVsZV9fT3BPdGhlcl9fR3JvdXBfNV9fMV9fSW1wbCApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMzI1NDoyOiBydWxlX19PcE90aGVyX19Hcm91cF81X18xX19JbXBsCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV18yKTsKICAgICAgICAgICAgIHJ1bGVfX09wT3RoZXJfX0dyb3VwXzVfXzFfX0ltcGwoKTsKQEAgLTQwMDE4LDIzICs0NDQ3NSwyMyBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX09wT3RoZXJfX0dyb3VwXzVfXzFfX0ltcGwiCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTE5MjI6MTogcnVsZV9fT3BPdGhlcl9fR3JvdXBfNV9fMV9fSW1wbCA6ICggKCBydWxlX19PcE90aGVyX19BbHRlcm5hdGl2ZXNfNV8xICkgKSA7CisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTMyNjA6MTogcnVsZV9fT3BPdGhlcl9fR3JvdXBfNV9fMV9fSW1wbCA6ICggKCBydWxlX19PcE90aGVyX19BbHRlcm5hdGl2ZXNfNV8xICkgKSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fT3BPdGhlcl9fR3JvdXBfNV9fMV9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMTkyNjoxOiAoICggKCBydWxlX19PcE90aGVyX19BbHRlcm5hdGl2ZXNfNV8xICkgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMTkyNzoxOiAoICggcnVsZV9fT3BPdGhlcl9fQWx0ZXJuYXRpdmVzXzVfMSApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEzMjY0OjE6ICggKCAoIHJ1bGVfX09wT3RoZXJfX0FsdGVybmF0aXZlc181XzEgKSApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEzMjY1OjE6ICggKCBydWxlX19PcE90aGVyX19BbHRlcm5hdGl2ZXNfNV8xICkgKQogICAgICAgICAgICAgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTE5Mjc6MTogKCAoIHJ1bGVfX09wT3RoZXJfX0FsdGVybmF0aXZlc181XzEgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMTkyODoyOiAoIHJ1bGVfX09wT3RoZXJfX0FsdGVybmF0aXZlc181XzEgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTMyNjU6MTogKCAoIHJ1bGVfX09wT3RoZXJfX0FsdGVybmF0aXZlc181XzEgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMzI2NjoyOiAoIHJ1bGVfX09wT3RoZXJfX0FsdGVybmF0aXZlc181XzEgKQogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRPcE90aGVyQWNjZXNzKCkuZ2V0QWx0ZXJuYXRpdmVzXzVfMSgpKTsgCiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMTkyOToyOiAoIHJ1bGVfX09wT3RoZXJfX0FsdGVybmF0aXZlc181XzEgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTE5Mjk6MzogcnVsZV9fT3BPdGhlcl9fQWx0ZXJuYXRpdmVzXzVfMQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTMyNjc6MjogKCBydWxlX19PcE90aGVyX19BbHRlcm5hdGl2ZXNfNV8xICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEzMjY3OjM6IHJ1bGVfX09wT3RoZXJfX0FsdGVybmF0aXZlc181XzEKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzIpOwogICAgICAgICAgICAgcnVsZV9fT3BPdGhlcl9fQWx0ZXJuYXRpdmVzXzVfMSgpOwpAQCAtNDAwNjksMTQgKzQ0NTI2LDE0IEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fT3BPdGhlcl9fR3JvdXBfNV8xXzBfXzAiCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTE5Mzg6MTogcnVsZV9fT3BPdGhlcl9fR3JvdXBfNV8xXzBfXzAgOiBydWxlX19PcE90aGVyX19Hcm91cF81XzFfMF9fMF9fSW1wbCA7CisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTMyNzY6MTogcnVsZV9fT3BPdGhlcl9fR3JvdXBfNV8xXzBfXzAgOiBydWxlX19PcE90aGVyX19Hcm91cF81XzFfMF9fMF9fSW1wbCA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fT3BPdGhlcl9fR3JvdXBfNV8xXzBfXzAoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTE5NDI6MTogKCBydWxlX19PcE90aGVyX19Hcm91cF81XzFfMF9fMF9fSW1wbCApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMTk0MzoyOiBydWxlX19PcE90aGVyX19Hcm91cF81XzFfMF9fMF9fSW1wbAorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTMyODA6MTogKCBydWxlX19PcE90aGVyX19Hcm91cF81XzFfMF9fMF9fSW1wbCApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMzI4MToyOiBydWxlX19PcE90aGVyX19Hcm91cF81XzFfMF9fMF9fSW1wbAogICAgICAgICAgICAgewogICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMik7CiAgICAgICAgICAgICBydWxlX19PcE90aGVyX19Hcm91cF81XzFfMF9fMF9fSW1wbCgpOwpAQCAtNDAxMDIsMjMgKzQ0NTU5LDIzIEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fT3BPdGhlcl9fR3JvdXBfNV8xXzBfXzBfX0ltcGwiCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTE5NDk6MTogcnVsZV9fT3BPdGhlcl9fR3JvdXBfNV8xXzBfXzBfX0ltcGwgOiAoICggcnVsZV9fT3BPdGhlcl9fR3JvdXBfNV8xXzBfMF9fMCApICkgOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEzMjg3OjE6IHJ1bGVfX09wT3RoZXJfX0dyb3VwXzVfMV8wX18wX19JbXBsIDogKCAoIHJ1bGVfX09wT3RoZXJfX0dyb3VwXzVfMV8wXzBfXzAgKSApIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19PcE90aGVyX19Hcm91cF81XzFfMF9fMF9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMTk1MzoxOiAoICggKCBydWxlX19PcE90aGVyX19Hcm91cF81XzFfMF8wX18wICkgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMTk1NDoxOiAoICggcnVsZV9fT3BPdGhlcl9fR3JvdXBfNV8xXzBfMF9fMCApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEzMjkxOjE6ICggKCAoIHJ1bGVfX09wT3RoZXJfX0dyb3VwXzVfMV8wXzBfXzAgKSApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEzMjkyOjE6ICggKCBydWxlX19PcE90aGVyX19Hcm91cF81XzFfMF8wX18wICkgKQogICAgICAgICAgICAgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTE5NTQ6MTogKCAoIHJ1bGVfX09wT3RoZXJfX0dyb3VwXzVfMV8wXzBfXzAgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMTk1NToyOiAoIHJ1bGVfX09wT3RoZXJfX0dyb3VwXzVfMV8wXzBfXzAgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTMyOTI6MTogKCAoIHJ1bGVfX09wT3RoZXJfX0dyb3VwXzVfMV8wXzBfXzAgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMzI5MzoyOiAoIHJ1bGVfX09wT3RoZXJfX0dyb3VwXzVfMV8wXzBfXzAgKQogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRPcE90aGVyQWNjZXNzKCkuZ2V0R3JvdXBfNV8xXzBfMCgpKTsgCiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMTk1NjoyOiAoIHJ1bGVfX09wT3RoZXJfX0dyb3VwXzVfMV8wXzBfXzAgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTE5NTY6MzogcnVsZV9fT3BPdGhlcl9fR3JvdXBfNV8xXzBfMF9fMAorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTMyOTQ6MjogKCBydWxlX19PcE90aGVyX19Hcm91cF81XzFfMF8wX18wICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEzMjk0OjM6IHJ1bGVfX09wT3RoZXJfX0dyb3VwXzVfMV8wXzBfXzAKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzIpOwogICAgICAgICAgICAgcnVsZV9fT3BPdGhlcl9fR3JvdXBfNV8xXzBfMF9fMCgpOwpAQCAtNDAxNTMsMTYgKzQ0NjEwLDE2IEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fT3BPdGhlcl9fR3JvdXBfNV8xXzBfMF9fMCIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMTk2NToxOiBydWxlX19PcE90aGVyX19Hcm91cF81XzFfMF8wX18wIDogcnVsZV9fT3BPdGhlcl9fR3JvdXBfNV8xXzBfMF9fMF9fSW1wbCBydWxlX19PcE90aGVyX19Hcm91cF81XzFfMF8wX18xIDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMzMwMzoxOiBydWxlX19PcE90aGVyX19Hcm91cF81XzFfMF8wX18wIDogcnVsZV9fT3BPdGhlcl9fR3JvdXBfNV8xXzBfMF9fMF9fSW1wbCBydWxlX19PcE90aGVyX19Hcm91cF81XzFfMF8wX18xIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19PcE90aGVyX19Hcm91cF81XzFfMF8wX18wKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjExOTY5OjE6ICggcnVsZV9fT3BPdGhlcl9fR3JvdXBfNV8xXzBfMF9fMF9fSW1wbCBydWxlX19PcE90aGVyX19Hcm91cF81XzFfMF8wX18xICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjExOTcwOjI6IHJ1bGVfX09wT3RoZXJfX0dyb3VwXzVfMV8wXzBfXzBfX0ltcGwgcnVsZV9fT3BPdGhlcl9fR3JvdXBfNV8xXzBfMF9fMQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTMzMDc6MTogKCBydWxlX19PcE90aGVyX19Hcm91cF81XzFfMF8wX18wX19JbXBsIHJ1bGVfX09wT3RoZXJfX0dyb3VwXzVfMV8wXzBfXzEgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTMzMDg6MjogcnVsZV9fT3BPdGhlcl9fR3JvdXBfNV8xXzBfMF9fMF9fSW1wbCBydWxlX19PcE90aGVyX19Hcm91cF81XzFfMF8wX18xCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV185Nik7CisgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV18xMDQpOwogICAgICAgICAgICAgcnVsZV9fT3BPdGhlcl9fR3JvdXBfNV8xXzBfMF9fMF9fSW1wbCgpOwogCiAgICAgICAgICAgICBzdGF0ZS5fZnNwLS07CkBAIC00MDE5MSwxNyArNDQ2NDgsMTcgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19PcE90aGVyX19Hcm91cF81XzFfMF8wX18wX19JbXBsIgotICAgIC8vIEludGVybmFsRGF0YURTTC5nOjExOTc3OjE6IHJ1bGVfX09wT3RoZXJfX0dyb3VwXzVfMV8wXzBfXzBfX0ltcGwgOiAoICc+JyApIDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMzMxNToxOiBydWxlX19PcE90aGVyX19Hcm91cF81XzFfMF8wX18wX19JbXBsIDogKCAnPicgKSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fT3BPdGhlcl9fR3JvdXBfNV8xXzBfMF9fMF9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMTk4MToxOiAoICggJz4nICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTE5ODI6MTogKCAnPicgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTMzMTk6MTogKCAoICc+JyApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEzMzIwOjE6ICggJz4nICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjExOTgyOjE6ICggJz4nICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjExOTgzOjI6ICc+JworICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTMzMjA6MTogKCAnPicgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTMzMjE6MjogJz4nCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldE9wT3RoZXJBY2Nlc3MoKS5nZXRHcmVhdGVyVGhhblNpZ25LZXl3b3JkXzVfMV8wXzBfMCgpKTsgCkBAIC00MDIzMiwxNCArNDQ2ODksMTQgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19PcE90aGVyX19Hcm91cF81XzFfMF8wX18xIgotICAgIC8vIEludGVybmFsRGF0YURTTC5nOjExOTkyOjE6IHJ1bGVfX09wT3RoZXJfX0dyb3VwXzVfMV8wXzBfXzEgOiBydWxlX19PcE90aGVyX19Hcm91cF81XzFfMF8wX18xX19JbXBsIDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMzMzMDoxOiBydWxlX19PcE90aGVyX19Hcm91cF81XzFfMF8wX18xIDogcnVsZV9fT3BPdGhlcl9fR3JvdXBfNV8xXzBfMF9fMV9fSW1wbCA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fT3BPdGhlcl9fR3JvdXBfNV8xXzBfMF9fMSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMTk5NjoxOiAoIHJ1bGVfX09wT3RoZXJfX0dyb3VwXzVfMV8wXzBfXzFfX0ltcGwgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTE5OTc6MjogcnVsZV9fT3BPdGhlcl9fR3JvdXBfNV8xXzBfMF9fMV9fSW1wbAorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTMzMzQ6MTogKCBydWxlX19PcE90aGVyX19Hcm91cF81XzFfMF8wX18xX19JbXBsICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEzMzM1OjI6IHJ1bGVfX09wT3RoZXJfX0dyb3VwXzVfMV8wXzBfXzFfX0ltcGwKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzIpOwogICAgICAgICAgICAgcnVsZV9fT3BPdGhlcl9fR3JvdXBfNV8xXzBfMF9fMV9fSW1wbCgpOwpAQCAtNDAyNjUsMTcgKzQ0NzIyLDE3IEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fT3BPdGhlcl9fR3JvdXBfNV8xXzBfMF9fMV9fSW1wbCIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMjAwMzoxOiBydWxlX19PcE90aGVyX19Hcm91cF81XzFfMF8wX18xX19JbXBsIDogKCAnPicgKSA7CisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTMzNDE6MTogcnVsZV9fT3BPdGhlcl9fR3JvdXBfNV8xXzBfMF9fMV9fSW1wbCA6ICggJz4nICkgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX09wT3RoZXJfX0dyb3VwXzVfMV8wXzBfXzFfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTIwMDc6MTogKCAoICc+JyApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEyMDA4OjE6ICggJz4nICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEzMzQ1OjE6ICggKCAnPicgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMzM0NjoxOiAoICc+JyApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMjAwODoxOiAoICc+JyApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMjAwOToyOiAnPicKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEzMzQ2OjE6ICggJz4nICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEzMzQ3OjI6ICc+JwogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRPcE90aGVyQWNjZXNzKCkuZ2V0R3JlYXRlclRoYW5TaWduS2V5d29yZF81XzFfMF8wXzEoKSk7IApAQCAtNDAzMDYsMTYgKzQ0NzYzLDE2IEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fT3BPdGhlcl9fR3JvdXBfNl9fMCIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMjAxOToxOiBydWxlX19PcE90aGVyX19Hcm91cF82X18wIDogcnVsZV9fT3BPdGhlcl9fR3JvdXBfNl9fMF9fSW1wbCBydWxlX19PcE90aGVyX19Hcm91cF82X18xIDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMzM1NzoxOiBydWxlX19PcE90aGVyX19Hcm91cF82X18wIDogcnVsZV9fT3BPdGhlcl9fR3JvdXBfNl9fMF9fSW1wbCBydWxlX19PcE90aGVyX19Hcm91cF82X18xIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19PcE90aGVyX19Hcm91cF82X18wKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEyMDIzOjE6ICggcnVsZV9fT3BPdGhlcl9fR3JvdXBfNl9fMF9fSW1wbCBydWxlX19PcE90aGVyX19Hcm91cF82X18xICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEyMDI0OjI6IHJ1bGVfX09wT3RoZXJfX0dyb3VwXzZfXzBfX0ltcGwgcnVsZV9fT3BPdGhlcl9fR3JvdXBfNl9fMQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTMzNjE6MTogKCBydWxlX19PcE90aGVyX19Hcm91cF82X18wX19JbXBsIHJ1bGVfX09wT3RoZXJfX0dyb3VwXzZfXzEgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTMzNjI6MjogcnVsZV9fT3BPdGhlcl9fR3JvdXBfNl9fMF9fSW1wbCBydWxlX19PcE90aGVyX19Hcm91cF82X18xCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV185Nyk7CisgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV18xMDUpOwogICAgICAgICAgICAgcnVsZV9fT3BPdGhlcl9fR3JvdXBfNl9fMF9fSW1wbCgpOwogCiAgICAgICAgICAgICBzdGF0ZS5fZnNwLS07CkBAIC00MDM0NCwxNyArNDQ4MDEsMTcgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19PcE90aGVyX19Hcm91cF82X18wX19JbXBsIgotICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEyMDMxOjE6IHJ1bGVfX09wT3RoZXJfX0dyb3VwXzZfXzBfX0ltcGwgOiAoICc8JyApIDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMzM2OToxOiBydWxlX19PcE90aGVyX19Hcm91cF82X18wX19JbXBsIDogKCAnPCcgKSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fT3BPdGhlcl9fR3JvdXBfNl9fMF9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMjAzNToxOiAoICggJzwnICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTIwMzY6MTogKCAnPCcgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTMzNzM6MTogKCAoICc8JyApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEzMzc0OjE6ICggJzwnICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEyMDM2OjE6ICggJzwnICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEyMDM3OjI6ICc8JworICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTMzNzQ6MTogKCAnPCcgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTMzNzU6MjogJzwnCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldE9wT3RoZXJBY2Nlc3MoKS5nZXRMZXNzVGhhblNpZ25LZXl3b3JkXzZfMCgpKTsgCkBAIC00MDM4NSwxNCArNDQ4NDIsMTQgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19PcE90aGVyX19Hcm91cF82X18xIgotICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEyMDQ2OjE6IHJ1bGVfX09wT3RoZXJfX0dyb3VwXzZfXzEgOiBydWxlX19PcE90aGVyX19Hcm91cF82X18xX19JbXBsIDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMzM4NDoxOiBydWxlX19PcE90aGVyX19Hcm91cF82X18xIDogcnVsZV9fT3BPdGhlcl9fR3JvdXBfNl9fMV9fSW1wbCA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fT3BPdGhlcl9fR3JvdXBfNl9fMSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMjA1MDoxOiAoIHJ1bGVfX09wT3RoZXJfX0dyb3VwXzZfXzFfX0ltcGwgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTIwNTE6MjogcnVsZV9fT3BPdGhlcl9fR3JvdXBfNl9fMV9fSW1wbAorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTMzODg6MTogKCBydWxlX19PcE90aGVyX19Hcm91cF82X18xX19JbXBsICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEzMzg5OjI6IHJ1bGVfX09wT3RoZXJfX0dyb3VwXzZfXzFfX0ltcGwKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzIpOwogICAgICAgICAgICAgcnVsZV9fT3BPdGhlcl9fR3JvdXBfNl9fMV9fSW1wbCgpOwpAQCAtNDA0MTgsMjMgKzQ0ODc1LDIzIEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fT3BPdGhlcl9fR3JvdXBfNl9fMV9fSW1wbCIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMjA1NzoxOiBydWxlX19PcE90aGVyX19Hcm91cF82X18xX19JbXBsIDogKCAoIHJ1bGVfX09wT3RoZXJfX0FsdGVybmF0aXZlc182XzEgKSApIDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMzM5NToxOiBydWxlX19PcE90aGVyX19Hcm91cF82X18xX19JbXBsIDogKCAoIHJ1bGVfX09wT3RoZXJfX0FsdGVybmF0aXZlc182XzEgKSApIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19PcE90aGVyX19Hcm91cF82X18xX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEyMDYxOjE6ICggKCAoIHJ1bGVfX09wT3RoZXJfX0FsdGVybmF0aXZlc182XzEgKSApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEyMDYyOjE6ICggKCBydWxlX19PcE90aGVyX19BbHRlcm5hdGl2ZXNfNl8xICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTMzOTk6MTogKCAoICggcnVsZV9fT3BPdGhlcl9fQWx0ZXJuYXRpdmVzXzZfMSApICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTM0MDA6MTogKCAoIHJ1bGVfX09wT3RoZXJfX0FsdGVybmF0aXZlc182XzEgKSApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMjA2MjoxOiAoICggcnVsZV9fT3BPdGhlcl9fQWx0ZXJuYXRpdmVzXzZfMSApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEyMDYzOjI6ICggcnVsZV9fT3BPdGhlcl9fQWx0ZXJuYXRpdmVzXzZfMSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMzQwMDoxOiAoICggcnVsZV9fT3BPdGhlcl9fQWx0ZXJuYXRpdmVzXzZfMSApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEzNDAxOjI6ICggcnVsZV9fT3BPdGhlcl9fQWx0ZXJuYXRpdmVzXzZfMSApCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldE9wT3RoZXJBY2Nlc3MoKS5nZXRBbHRlcm5hdGl2ZXNfNl8xKCkpOyAKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEyMDY0OjI6ICggcnVsZV9fT3BPdGhlcl9fQWx0ZXJuYXRpdmVzXzZfMSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMjA2NDozOiBydWxlX19PcE90aGVyX19BbHRlcm5hdGl2ZXNfNl8xCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMzQwMjoyOiAoIHJ1bGVfX09wT3RoZXJfX0FsdGVybmF0aXZlc182XzEgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTM0MDI6MzogcnVsZV9fT3BPdGhlcl9fQWx0ZXJuYXRpdmVzXzZfMQogICAgICAgICAgICAgewogICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMik7CiAgICAgICAgICAgICBydWxlX19PcE90aGVyX19BbHRlcm5hdGl2ZXNfNl8xKCk7CkBAIC00MDQ2OSwxNCArNDQ5MjYsMTQgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19PcE90aGVyX19Hcm91cF82XzFfMF9fMCIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMjA3MzoxOiBydWxlX19PcE90aGVyX19Hcm91cF82XzFfMF9fMCA6IHJ1bGVfX09wT3RoZXJfX0dyb3VwXzZfMV8wX18wX19JbXBsIDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMzQxMToxOiBydWxlX19PcE90aGVyX19Hcm91cF82XzFfMF9fMCA6IHJ1bGVfX09wT3RoZXJfX0dyb3VwXzZfMV8wX18wX19JbXBsIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19PcE90aGVyX19Hcm91cF82XzFfMF9fMCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMjA3NzoxOiAoIHJ1bGVfX09wT3RoZXJfX0dyb3VwXzZfMV8wX18wX19JbXBsICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEyMDc4OjI6IHJ1bGVfX09wT3RoZXJfX0dyb3VwXzZfMV8wX18wX19JbXBsCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMzQxNToxOiAoIHJ1bGVfX09wT3RoZXJfX0dyb3VwXzZfMV8wX18wX19JbXBsICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEzNDE2OjI6IHJ1bGVfX09wT3RoZXJfX0dyb3VwXzZfMV8wX18wX19JbXBsCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV18yKTsKICAgICAgICAgICAgIHJ1bGVfX09wT3RoZXJfX0dyb3VwXzZfMV8wX18wX19JbXBsKCk7CkBAIC00MDUwMiwyMyArNDQ5NTksMjMgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19PcE90aGVyX19Hcm91cF82XzFfMF9fMF9fSW1wbCIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMjA4NDoxOiBydWxlX19PcE90aGVyX19Hcm91cF82XzFfMF9fMF9fSW1wbCA6ICggKCBydWxlX19PcE90aGVyX19Hcm91cF82XzFfMF8wX18wICkgKSA7CisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTM0MjI6MTogcnVsZV9fT3BPdGhlcl9fR3JvdXBfNl8xXzBfXzBfX0ltcGwgOiAoICggcnVsZV9fT3BPdGhlcl9fR3JvdXBfNl8xXzBfMF9fMCApICkgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX09wT3RoZXJfX0dyb3VwXzZfMV8wX18wX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEyMDg4OjE6ICggKCAoIHJ1bGVfX09wT3RoZXJfX0dyb3VwXzZfMV8wXzBfXzAgKSApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEyMDg5OjE6ICggKCBydWxlX19PcE90aGVyX19Hcm91cF82XzFfMF8wX18wICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTM0MjY6MTogKCAoICggcnVsZV9fT3BPdGhlcl9fR3JvdXBfNl8xXzBfMF9fMCApICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTM0Mjc6MTogKCAoIHJ1bGVfX09wT3RoZXJfX0dyb3VwXzZfMV8wXzBfXzAgKSApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMjA4OToxOiAoICggcnVsZV9fT3BPdGhlcl9fR3JvdXBfNl8xXzBfMF9fMCApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEyMDkwOjI6ICggcnVsZV9fT3BPdGhlcl9fR3JvdXBfNl8xXzBfMF9fMCApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMzQyNzoxOiAoICggcnVsZV9fT3BPdGhlcl9fR3JvdXBfNl8xXzBfMF9fMCApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEzNDI4OjI6ICggcnVsZV9fT3BPdGhlcl9fR3JvdXBfNl8xXzBfMF9fMCApCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldE9wT3RoZXJBY2Nlc3MoKS5nZXRHcm91cF82XzFfMF8wKCkpOyAKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEyMDkxOjI6ICggcnVsZV9fT3BPdGhlcl9fR3JvdXBfNl8xXzBfMF9fMCApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMjA5MTozOiBydWxlX19PcE90aGVyX19Hcm91cF82XzFfMF8wX18wCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMzQyOToyOiAoIHJ1bGVfX09wT3RoZXJfX0dyb3VwXzZfMV8wXzBfXzAgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTM0Mjk6MzogcnVsZV9fT3BPdGhlcl9fR3JvdXBfNl8xXzBfMF9fMAogICAgICAgICAgICAgewogICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMik7CiAgICAgICAgICAgICBydWxlX19PcE90aGVyX19Hcm91cF82XzFfMF8wX18wKCk7CkBAIC00MDU1MywxNiArNDUwMTAsMTYgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19PcE90aGVyX19Hcm91cF82XzFfMF8wX18wIgotICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEyMTAwOjE6IHJ1bGVfX09wT3RoZXJfX0dyb3VwXzZfMV8wXzBfXzAgOiBydWxlX19PcE90aGVyX19Hcm91cF82XzFfMF8wX18wX19JbXBsIHJ1bGVfX09wT3RoZXJfX0dyb3VwXzZfMV8wXzBfXzEgOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEzNDM4OjE6IHJ1bGVfX09wT3RoZXJfX0dyb3VwXzZfMV8wXzBfXzAgOiBydWxlX19PcE90aGVyX19Hcm91cF82XzFfMF8wX18wX19JbXBsIHJ1bGVfX09wT3RoZXJfX0dyb3VwXzZfMV8wXzBfXzEgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX09wT3RoZXJfX0dyb3VwXzZfMV8wXzBfXzAoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTIxMDQ6MTogKCBydWxlX19PcE90aGVyX19Hcm91cF82XzFfMF8wX18wX19JbXBsIHJ1bGVfX09wT3RoZXJfX0dyb3VwXzZfMV8wXzBfXzEgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTIxMDU6MjogcnVsZV9fT3BPdGhlcl9fR3JvdXBfNl8xXzBfMF9fMF9fSW1wbCBydWxlX19PcE90aGVyX19Hcm91cF82XzFfMF8wX18xCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMzQ0MjoxOiAoIHJ1bGVfX09wT3RoZXJfX0dyb3VwXzZfMV8wXzBfXzBfX0ltcGwgcnVsZV9fT3BPdGhlcl9fR3JvdXBfNl8xXzBfMF9fMSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMzQ0MzoyOiBydWxlX19PcE90aGVyX19Hcm91cF82XzFfMF8wX18wX19JbXBsIHJ1bGVfX09wT3RoZXJfX0dyb3VwXzZfMV8wXzBfXzEKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzgxKTsKKyAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzg5KTsKICAgICAgICAgICAgIHJ1bGVfX09wT3RoZXJfX0dyb3VwXzZfMV8wXzBfXzBfX0ltcGwoKTsKIAogICAgICAgICAgICAgc3RhdGUuX2ZzcC0tOwpAQCAtNDA1OTEsMTcgKzQ1MDQ4LDE3IEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fT3BPdGhlcl9fR3JvdXBfNl8xXzBfMF9fMF9fSW1wbCIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMjExMjoxOiBydWxlX19PcE90aGVyX19Hcm91cF82XzFfMF8wX18wX19JbXBsIDogKCAnPCcgKSA7CisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTM0NTA6MTogcnVsZV9fT3BPdGhlcl9fR3JvdXBfNl8xXzBfMF9fMF9fSW1wbCA6ICggJzwnICkgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX09wT3RoZXJfX0dyb3VwXzZfMV8wXzBfXzBfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTIxMTY6MTogKCAoICc8JyApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEyMTE3OjE6ICggJzwnICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEzNDU0OjE6ICggKCAnPCcgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMzQ1NToxOiAoICc8JyApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMjExNzoxOiAoICc8JyApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMjExODoyOiAnPCcKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEzNDU1OjE6ICggJzwnICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEzNDU2OjI6ICc8JwogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRPcE90aGVyQWNjZXNzKCkuZ2V0TGVzc1RoYW5TaWduS2V5d29yZF82XzFfMF8wXzAoKSk7IApAQCAtNDA2MzIsMTQgKzQ1MDg5LDE0IEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fT3BPdGhlcl9fR3JvdXBfNl8xXzBfMF9fMSIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMjEyNzoxOiBydWxlX19PcE90aGVyX19Hcm91cF82XzFfMF8wX18xIDogcnVsZV9fT3BPdGhlcl9fR3JvdXBfNl8xXzBfMF9fMV9fSW1wbCA7CisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTM0NjU6MTogcnVsZV9fT3BPdGhlcl9fR3JvdXBfNl8xXzBfMF9fMSA6IHJ1bGVfX09wT3RoZXJfX0dyb3VwXzZfMV8wXzBfXzFfX0ltcGwgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX09wT3RoZXJfX0dyb3VwXzZfMV8wXzBfXzEoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTIxMzE6MTogKCBydWxlX19PcE90aGVyX19Hcm91cF82XzFfMF8wX18xX19JbXBsICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEyMTMyOjI6IHJ1bGVfX09wT3RoZXJfX0dyb3VwXzZfMV8wXzBfXzFfX0ltcGwKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEzNDY5OjE6ICggcnVsZV9fT3BPdGhlcl9fR3JvdXBfNl8xXzBfMF9fMV9fSW1wbCApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMzQ3MDoyOiBydWxlX19PcE90aGVyX19Hcm91cF82XzFfMF8wX18xX19JbXBsCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV18yKTsKICAgICAgICAgICAgIHJ1bGVfX09wT3RoZXJfX0dyb3VwXzZfMV8wXzBfXzFfX0ltcGwoKTsKQEAgLTQwNjY1LDE3ICs0NTEyMiwxNyBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX09wT3RoZXJfX0dyb3VwXzZfMV8wXzBfXzFfX0ltcGwiCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTIxMzg6MTogcnVsZV9fT3BPdGhlcl9fR3JvdXBfNl8xXzBfMF9fMV9fSW1wbCA6ICggJzwnICkgOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEzNDc2OjE6IHJ1bGVfX09wT3RoZXJfX0dyb3VwXzZfMV8wXzBfXzFfX0ltcGwgOiAoICc8JyApIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19PcE90aGVyX19Hcm91cF82XzFfMF8wX18xX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEyMTQyOjE6ICggKCAnPCcgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMjE0MzoxOiAoICc8JyApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMzQ4MDoxOiAoICggJzwnICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTM0ODE6MTogKCAnPCcgKQogICAgICAgICAgICAgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTIxNDM6MTogKCAnPCcgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTIxNDQ6MjogJzwnCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMzQ4MToxOiAoICc8JyApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMzQ4MjoyOiAnPCcKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0T3BPdGhlckFjY2VzcygpLmdldExlc3NUaGFuU2lnbktleXdvcmRfNl8xXzBfMF8xKCkpOyAKQEAgLTQwNzA2LDE2ICs0NTE2MywxNiBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX1hBZGRpdGl2ZUV4cHJlc3Npb25fX0dyb3VwX18wIgotICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEyMTU0OjE6IHJ1bGVfX1hBZGRpdGl2ZUV4cHJlc3Npb25fX0dyb3VwX18wIDogcnVsZV9fWEFkZGl0aXZlRXhwcmVzc2lvbl9fR3JvdXBfXzBfX0ltcGwgcnVsZV9fWEFkZGl0aXZlRXhwcmVzc2lvbl9fR3JvdXBfXzEgOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEzNDkyOjE6IHJ1bGVfX1hBZGRpdGl2ZUV4cHJlc3Npb25fX0dyb3VwX18wIDogcnVsZV9fWEFkZGl0aXZlRXhwcmVzc2lvbl9fR3JvdXBfXzBfX0ltcGwgcnVsZV9fWEFkZGl0aXZlRXhwcmVzc2lvbl9fR3JvdXBfXzEgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1hBZGRpdGl2ZUV4cHJlc3Npb25fX0dyb3VwX18wKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEyMTU4OjE6ICggcnVsZV9fWEFkZGl0aXZlRXhwcmVzc2lvbl9fR3JvdXBfXzBfX0ltcGwgcnVsZV9fWEFkZGl0aXZlRXhwcmVzc2lvbl9fR3JvdXBfXzEgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTIxNTk6MjogcnVsZV9fWEFkZGl0aXZlRXhwcmVzc2lvbl9fR3JvdXBfXzBfX0ltcGwgcnVsZV9fWEFkZGl0aXZlRXhwcmVzc2lvbl9fR3JvdXBfXzEKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEzNDk2OjE6ICggcnVsZV9fWEFkZGl0aXZlRXhwcmVzc2lvbl9fR3JvdXBfXzBfX0ltcGwgcnVsZV9fWEFkZGl0aXZlRXhwcmVzc2lvbl9fR3JvdXBfXzEgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTM0OTc6MjogcnVsZV9fWEFkZGl0aXZlRXhwcmVzc2lvbl9fR3JvdXBfXzBfX0ltcGwgcnVsZV9fWEFkZGl0aXZlRXhwcmVzc2lvbl9fR3JvdXBfXzEKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzk4KTsKKyAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzEwNik7CiAgICAgICAgICAgICBydWxlX19YQWRkaXRpdmVFeHByZXNzaW9uX19Hcm91cF9fMF9fSW1wbCgpOwogCiAgICAgICAgICAgICBzdGF0ZS5fZnNwLS07CkBAIC00MDc0NCwxNyArNDUyMDEsMTcgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YQWRkaXRpdmVFeHByZXNzaW9uX19Hcm91cF9fMF9fSW1wbCIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMjE2NjoxOiBydWxlX19YQWRkaXRpdmVFeHByZXNzaW9uX19Hcm91cF9fMF9fSW1wbCA6ICggcnVsZVhNdWx0aXBsaWNhdGl2ZUV4cHJlc3Npb24gKSA7CisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTM1MDQ6MTogcnVsZV9fWEFkZGl0aXZlRXhwcmVzc2lvbl9fR3JvdXBfXzBfX0ltcGwgOiAoIHJ1bGVYTXVsdGlwbGljYXRpdmVFeHByZXNzaW9uICkgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1hBZGRpdGl2ZUV4cHJlc3Npb25fX0dyb3VwX18wX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEyMTcwOjE6ICggKCBydWxlWE11bHRpcGxpY2F0aXZlRXhwcmVzc2lvbiApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEyMTcxOjE6ICggcnVsZVhNdWx0aXBsaWNhdGl2ZUV4cHJlc3Npb24gKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTM1MDg6MTogKCAoIHJ1bGVYTXVsdGlwbGljYXRpdmVFeHByZXNzaW9uICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTM1MDk6MTogKCBydWxlWE11bHRpcGxpY2F0aXZlRXhwcmVzc2lvbiApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMjE3MToxOiAoIHJ1bGVYTXVsdGlwbGljYXRpdmVFeHByZXNzaW9uICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEyMTcyOjI6IHJ1bGVYTXVsdGlwbGljYXRpdmVFeHByZXNzaW9uCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMzUwOToxOiAoIHJ1bGVYTXVsdGlwbGljYXRpdmVFeHByZXNzaW9uICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEzNTEwOjI6IHJ1bGVYTXVsdGlwbGljYXRpdmVFeHByZXNzaW9uCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhBZGRpdGl2ZUV4cHJlc3Npb25BY2Nlc3MoKS5nZXRYTXVsdGlwbGljYXRpdmVFeHByZXNzaW9uUGFyc2VyUnVsZUNhbGxfMCgpKTsgCkBAIC00MDc4OSwxNCArNDUyNDYsMTQgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YQWRkaXRpdmVFeHByZXNzaW9uX19Hcm91cF9fMSIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMjE4MToxOiBydWxlX19YQWRkaXRpdmVFeHByZXNzaW9uX19Hcm91cF9fMSA6IHJ1bGVfX1hBZGRpdGl2ZUV4cHJlc3Npb25fX0dyb3VwX18xX19JbXBsIDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMzUxOToxOiBydWxlX19YQWRkaXRpdmVFeHByZXNzaW9uX19Hcm91cF9fMSA6IHJ1bGVfX1hBZGRpdGl2ZUV4cHJlc3Npb25fX0dyb3VwX18xX19JbXBsIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YQWRkaXRpdmVFeHByZXNzaW9uX19Hcm91cF9fMSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMjE4NToxOiAoIHJ1bGVfX1hBZGRpdGl2ZUV4cHJlc3Npb25fX0dyb3VwX18xX19JbXBsICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEyMTg2OjI6IHJ1bGVfX1hBZGRpdGl2ZUV4cHJlc3Npb25fX0dyb3VwX18xX19JbXBsCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMzUyMzoxOiAoIHJ1bGVfX1hBZGRpdGl2ZUV4cHJlc3Npb25fX0dyb3VwX18xX19JbXBsICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEzNTI0OjI6IHJ1bGVfX1hBZGRpdGl2ZUV4cHJlc3Npb25fX0dyb3VwX18xX19JbXBsCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV18yKTsKICAgICAgICAgICAgIHJ1bGVfX1hBZGRpdGl2ZUV4cHJlc3Npb25fX0dyb3VwX18xX19JbXBsKCk7CkBAIC00MDgyMiw1MiArNDUyNzksNTIgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YQWRkaXRpdmVFeHByZXNzaW9uX19Hcm91cF9fMV9fSW1wbCIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMjE5MjoxOiBydWxlX19YQWRkaXRpdmVFeHByZXNzaW9uX19Hcm91cF9fMV9fSW1wbCA6ICggKCBydWxlX19YQWRkaXRpdmVFeHByZXNzaW9uX19Hcm91cF8xX18wICkqICkgOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEzNTMwOjE6IHJ1bGVfX1hBZGRpdGl2ZUV4cHJlc3Npb25fX0dyb3VwX18xX19JbXBsIDogKCAoIHJ1bGVfX1hBZGRpdGl2ZUV4cHJlc3Npb25fX0dyb3VwXzFfXzAgKSogKSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fWEFkZGl0aXZlRXhwcmVzc2lvbl9fR3JvdXBfXzFfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTIxOTY6MTogKCAoICggcnVsZV9fWEFkZGl0aXZlRXhwcmVzc2lvbl9fR3JvdXBfMV9fMCApKiApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEyMTk3OjE6ICggKCBydWxlX19YQWRkaXRpdmVFeHByZXNzaW9uX19Hcm91cF8xX18wICkqICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEzNTM0OjE6ICggKCAoIHJ1bGVfX1hBZGRpdGl2ZUV4cHJlc3Npb25fX0dyb3VwXzFfXzAgKSogKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMzUzNToxOiAoICggcnVsZV9fWEFkZGl0aXZlRXhwcmVzc2lvbl9fR3JvdXBfMV9fMCApKiApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMjE5NzoxOiAoICggcnVsZV9fWEFkZGl0aXZlRXhwcmVzc2lvbl9fR3JvdXBfMV9fMCApKiApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMjE5ODoyOiAoIHJ1bGVfX1hBZGRpdGl2ZUV4cHJlc3Npb25fX0dyb3VwXzFfXzAgKSoKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEzNTM1OjE6ICggKCBydWxlX19YQWRkaXRpdmVFeHByZXNzaW9uX19Hcm91cF8xX18wICkqICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEzNTM2OjI6ICggcnVsZV9fWEFkZGl0aXZlRXhwcmVzc2lvbl9fR3JvdXBfMV9fMCApKgogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYQWRkaXRpdmVFeHByZXNzaW9uQWNjZXNzKCkuZ2V0R3JvdXBfMSgpKTsgCiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMjE5OToyOiAoIHJ1bGVfX1hBZGRpdGl2ZUV4cHJlc3Npb25fX0dyb3VwXzFfXzAgKSoKLSAgICAgICAgICAgIGxvb3AxMDI6CisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMzUzNzoyOiAoIHJ1bGVfX1hBZGRpdGl2ZUV4cHJlc3Npb25fX0dyb3VwXzFfXzAgKSoKKyAgICAgICAgICAgIGxvb3AxMTU6CiAgICAgICAgICAgICBkbyB7Ci0gICAgICAgICAgICAgICAgaW50IGFsdDEwMj0yOwotICAgICAgICAgICAgICAgIGludCBMQTEwMl8wID0gaW5wdXQuTEEoMSk7CisgICAgICAgICAgICAgICAgaW50IGFsdDExNT0yOworICAgICAgICAgICAgICAgIGludCBMQTExNV8wID0gaW5wdXQuTEEoMSk7CiAKLSAgICAgICAgICAgICAgICBpZiAoIChMQTEwMl8wPT0zNSkgKSB7Ci0gICAgICAgICAgICAgICAgICAgIGludCBMQTEwMl8yID0gaW5wdXQuTEEoMik7CisgICAgICAgICAgICAgICAgaWYgKCAoTEExMTVfMD09MzUpICkgeworICAgICAgICAgICAgICAgICAgICBpbnQgTEExMTVfMiA9IGlucHV0LkxBKDIpOwogCi0gICAgICAgICAgICAgICAgICAgIGlmICggKHN5bnByZWQxNTZfSW50ZXJuYWxEYXRhRFNMKCkpICkgewotICAgICAgICAgICAgICAgICAgICAgICAgYWx0MTAyPTE7CisgICAgICAgICAgICAgICAgICAgIGlmICggKHN5bnByZWQxNzVfSW50ZXJuYWxEYXRhRFNMKCkpICkgeworICAgICAgICAgICAgICAgICAgICAgICAgYWx0MTE1PTE7CiAgICAgICAgICAgICAgICAgICAgIH0KIAogCiAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UgaWYgKCAoTEExMDJfMD09MzQpICkgewotICAgICAgICAgICAgICAgICAgICBpbnQgTEExMDJfMyA9IGlucHV0LkxBKDIpOworICAgICAgICAgICAgICAgIGVsc2UgaWYgKCAoTEExMTVfMD09MzQpICkgeworICAgICAgICAgICAgICAgICAgICBpbnQgTEExMTVfMyA9IGlucHV0LkxBKDIpOwogCi0gICAgICAgICAgICAgICAgICAgIGlmICggKHN5bnByZWQxNTZfSW50ZXJuYWxEYXRhRFNMKCkpICkgewotICAgICAgICAgICAgICAgICAgICAgICAgYWx0MTAyPTE7CisgICAgICAgICAgICAgICAgICAgIGlmICggKHN5bnByZWQxNzVfSW50ZXJuYWxEYXRhRFNMKCkpICkgeworICAgICAgICAgICAgICAgICAgICAgICAgYWx0MTE1PTE7CiAgICAgICAgICAgICAgICAgICAgIH0KIAogCiAgICAgICAgICAgICAgICAgfQogCiAKLSAgICAgICAgICAgICAgICBzd2l0Y2ggKGFsdDEwMikgeworICAgICAgICAgICAgICAgIHN3aXRjaCAoYWx0MTE1KSB7CiAgICAgICAgICAgICAJY2FzZSAxIDoKLSAgICAgICAgICAgIAkgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTIxOTk6MzogcnVsZV9fWEFkZGl0aXZlRXhwcmVzc2lvbl9fR3JvdXBfMV9fMAorICAgICAgICAgICAgCSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMzUzNzozOiBydWxlX19YQWRkaXRpdmVFeHByZXNzaW9uX19Hcm91cF8xX18wCiAgICAgICAgICAgICAJICAgIHsKLSAgICAgICAgICAgIAkgICAgcHVzaEZvbGxvdyhGT0xMT1dfOTkpOworICAgICAgICAgICAgCSAgICBwdXNoRm9sbG93KEZPTExPV18xMDcpOwogICAgICAgICAgICAgCSAgICBydWxlX19YQWRkaXRpdmVFeHByZXNzaW9uX19Hcm91cF8xX18wKCk7CiAKICAgICAgICAgICAgIAkgICAgc3RhdGUuX2ZzcC0tOwpAQCAtNDA4NzcsNyArNDUzMzQsNyBAQAogICAgICAgICAgICAgCSAgICBicmVhazsKIAogICAgICAgICAgICAgCWRlZmF1bHQgOgotICAgICAgICAgICAgCSAgICBicmVhayBsb29wMTAyOworICAgICAgICAgICAgCSAgICBicmVhayBsb29wMTE1OwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0gd2hpbGUgKHRydWUpOwogCkBAIC00MDkwNiwxNiArNDUzNjMsMTYgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YQWRkaXRpdmVFeHByZXNzaW9uX19Hcm91cF8xX18wIgotICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEyMjA4OjE6IHJ1bGVfX1hBZGRpdGl2ZUV4cHJlc3Npb25fX0dyb3VwXzFfXzAgOiBydWxlX19YQWRkaXRpdmVFeHByZXNzaW9uX19Hcm91cF8xX18wX19JbXBsIHJ1bGVfX1hBZGRpdGl2ZUV4cHJlc3Npb25fX0dyb3VwXzFfXzEgOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEzNTQ2OjE6IHJ1bGVfX1hBZGRpdGl2ZUV4cHJlc3Npb25fX0dyb3VwXzFfXzAgOiBydWxlX19YQWRkaXRpdmVFeHByZXNzaW9uX19Hcm91cF8xX18wX19JbXBsIHJ1bGVfX1hBZGRpdGl2ZUV4cHJlc3Npb25fX0dyb3VwXzFfXzEgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1hBZGRpdGl2ZUV4cHJlc3Npb25fX0dyb3VwXzFfXzAoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTIyMTI6MTogKCBydWxlX19YQWRkaXRpdmVFeHByZXNzaW9uX19Hcm91cF8xX18wX19JbXBsIHJ1bGVfX1hBZGRpdGl2ZUV4cHJlc3Npb25fX0dyb3VwXzFfXzEgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTIyMTM6MjogcnVsZV9fWEFkZGl0aXZlRXhwcmVzc2lvbl9fR3JvdXBfMV9fMF9fSW1wbCBydWxlX19YQWRkaXRpdmVFeHByZXNzaW9uX19Hcm91cF8xX18xCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMzU1MDoxOiAoIHJ1bGVfX1hBZGRpdGl2ZUV4cHJlc3Npb25fX0dyb3VwXzFfXzBfX0ltcGwgcnVsZV9fWEFkZGl0aXZlRXhwcmVzc2lvbl9fR3JvdXBfMV9fMSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMzU1MToyOiBydWxlX19YQWRkaXRpdmVFeHByZXNzaW9uX19Hcm91cF8xX18wX19JbXBsIHJ1bGVfX1hBZGRpdGl2ZUV4cHJlc3Npb25fX0dyb3VwXzFfXzEKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzc0KTsKKyAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzgyKTsKICAgICAgICAgICAgIHJ1bGVfX1hBZGRpdGl2ZUV4cHJlc3Npb25fX0dyb3VwXzFfXzBfX0ltcGwoKTsKIAogICAgICAgICAgICAgc3RhdGUuX2ZzcC0tOwpAQCAtNDA5NDQsMjMgKzQ1NDAxLDIzIEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fWEFkZGl0aXZlRXhwcmVzc2lvbl9fR3JvdXBfMV9fMF9fSW1wbCIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMjIyMDoxOiBydWxlX19YQWRkaXRpdmVFeHByZXNzaW9uX19Hcm91cF8xX18wX19JbXBsIDogKCAoIHJ1bGVfX1hBZGRpdGl2ZUV4cHJlc3Npb25fX0dyb3VwXzFfMF9fMCApICkgOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEzNTU4OjE6IHJ1bGVfX1hBZGRpdGl2ZUV4cHJlc3Npb25fX0dyb3VwXzFfXzBfX0ltcGwgOiAoICggcnVsZV9fWEFkZGl0aXZlRXhwcmVzc2lvbl9fR3JvdXBfMV8wX18wICkgKSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fWEFkZGl0aXZlRXhwcmVzc2lvbl9fR3JvdXBfMV9fMF9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMjIyNDoxOiAoICggKCBydWxlX19YQWRkaXRpdmVFeHByZXNzaW9uX19Hcm91cF8xXzBfXzAgKSApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEyMjI1OjE6ICggKCBydWxlX19YQWRkaXRpdmVFeHByZXNzaW9uX19Hcm91cF8xXzBfXzAgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMzU2MjoxOiAoICggKCBydWxlX19YQWRkaXRpdmVFeHByZXNzaW9uX19Hcm91cF8xXzBfXzAgKSApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEzNTYzOjE6ICggKCBydWxlX19YQWRkaXRpdmVFeHByZXNzaW9uX19Hcm91cF8xXzBfXzAgKSApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMjIyNToxOiAoICggcnVsZV9fWEFkZGl0aXZlRXhwcmVzc2lvbl9fR3JvdXBfMV8wX18wICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTIyMjY6MjogKCBydWxlX19YQWRkaXRpdmVFeHByZXNzaW9uX19Hcm91cF8xXzBfXzAgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTM1NjM6MTogKCAoIHJ1bGVfX1hBZGRpdGl2ZUV4cHJlc3Npb25fX0dyb3VwXzFfMF9fMCApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEzNTY0OjI6ICggcnVsZV9fWEFkZGl0aXZlRXhwcmVzc2lvbl9fR3JvdXBfMV8wX18wICkKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WEFkZGl0aXZlRXhwcmVzc2lvbkFjY2VzcygpLmdldEdyb3VwXzFfMCgpKTsgCiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMjIyNzoyOiAoIHJ1bGVfX1hBZGRpdGl2ZUV4cHJlc3Npb25fX0dyb3VwXzFfMF9fMCApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMjIyNzozOiBydWxlX19YQWRkaXRpdmVFeHByZXNzaW9uX19Hcm91cF8xXzBfXzAKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEzNTY1OjI6ICggcnVsZV9fWEFkZGl0aXZlRXhwcmVzc2lvbl9fR3JvdXBfMV8wX18wICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEzNTY1OjM6IHJ1bGVfX1hBZGRpdGl2ZUV4cHJlc3Npb25fX0dyb3VwXzFfMF9fMAogICAgICAgICAgICAgewogICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMik7CiAgICAgICAgICAgICBydWxlX19YQWRkaXRpdmVFeHByZXNzaW9uX19Hcm91cF8xXzBfXzAoKTsKQEAgLTQwOTk1LDE0ICs0NTQ1MiwxNCBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX1hBZGRpdGl2ZUV4cHJlc3Npb25fX0dyb3VwXzFfXzEiCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTIyMzU6MTogcnVsZV9fWEFkZGl0aXZlRXhwcmVzc2lvbl9fR3JvdXBfMV9fMSA6IHJ1bGVfX1hBZGRpdGl2ZUV4cHJlc3Npb25fX0dyb3VwXzFfXzFfX0ltcGwgOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEzNTczOjE6IHJ1bGVfX1hBZGRpdGl2ZUV4cHJlc3Npb25fX0dyb3VwXzFfXzEgOiBydWxlX19YQWRkaXRpdmVFeHByZXNzaW9uX19Hcm91cF8xX18xX19JbXBsIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YQWRkaXRpdmVFeHByZXNzaW9uX19Hcm91cF8xX18xKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEyMjM5OjE6ICggcnVsZV9fWEFkZGl0aXZlRXhwcmVzc2lvbl9fR3JvdXBfMV9fMV9fSW1wbCApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMjI0MDoyOiBydWxlX19YQWRkaXRpdmVFeHByZXNzaW9uX19Hcm91cF8xX18xX19JbXBsCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMzU3NzoxOiAoIHJ1bGVfX1hBZGRpdGl2ZUV4cHJlc3Npb25fX0dyb3VwXzFfXzFfX0ltcGwgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTM1Nzg6MjogcnVsZV9fWEFkZGl0aXZlRXhwcmVzc2lvbl9fR3JvdXBfMV9fMV9fSW1wbAogICAgICAgICAgICAgewogICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMik7CiAgICAgICAgICAgICBydWxlX19YQWRkaXRpdmVFeHByZXNzaW9uX19Hcm91cF8xX18xX19JbXBsKCk7CkBAIC00MTAyOCwyMyArNDU0ODUsMjMgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YQWRkaXRpdmVFeHByZXNzaW9uX19Hcm91cF8xX18xX19JbXBsIgotICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEyMjQ2OjE6IHJ1bGVfX1hBZGRpdGl2ZUV4cHJlc3Npb25fX0dyb3VwXzFfXzFfX0ltcGwgOiAoICggcnVsZV9fWEFkZGl0aXZlRXhwcmVzc2lvbl9fUmlnaHRPcGVyYW5kQXNzaWdubWVudF8xXzEgKSApIDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMzU4NDoxOiBydWxlX19YQWRkaXRpdmVFeHByZXNzaW9uX19Hcm91cF8xX18xX19JbXBsIDogKCAoIHJ1bGVfX1hBZGRpdGl2ZUV4cHJlc3Npb25fX1JpZ2h0T3BlcmFuZEFzc2lnbm1lbnRfMV8xICkgKSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fWEFkZGl0aXZlRXhwcmVzc2lvbl9fR3JvdXBfMV9fMV9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMjI1MDoxOiAoICggKCBydWxlX19YQWRkaXRpdmVFeHByZXNzaW9uX19SaWdodE9wZXJhbmRBc3NpZ25tZW50XzFfMSApICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTIyNTE6MTogKCAoIHJ1bGVfX1hBZGRpdGl2ZUV4cHJlc3Npb25fX1JpZ2h0T3BlcmFuZEFzc2lnbm1lbnRfMV8xICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTM1ODg6MTogKCAoICggcnVsZV9fWEFkZGl0aXZlRXhwcmVzc2lvbl9fUmlnaHRPcGVyYW5kQXNzaWdubWVudF8xXzEgKSApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEzNTg5OjE6ICggKCBydWxlX19YQWRkaXRpdmVFeHByZXNzaW9uX19SaWdodE9wZXJhbmRBc3NpZ25tZW50XzFfMSApICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEyMjUxOjE6ICggKCBydWxlX19YQWRkaXRpdmVFeHByZXNzaW9uX19SaWdodE9wZXJhbmRBc3NpZ25tZW50XzFfMSApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEyMjUyOjI6ICggcnVsZV9fWEFkZGl0aXZlRXhwcmVzc2lvbl9fUmlnaHRPcGVyYW5kQXNzaWdubWVudF8xXzEgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTM1ODk6MTogKCAoIHJ1bGVfX1hBZGRpdGl2ZUV4cHJlc3Npb25fX1JpZ2h0T3BlcmFuZEFzc2lnbm1lbnRfMV8xICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTM1OTA6MjogKCBydWxlX19YQWRkaXRpdmVFeHByZXNzaW9uX19SaWdodE9wZXJhbmRBc3NpZ25tZW50XzFfMSApCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhBZGRpdGl2ZUV4cHJlc3Npb25BY2Nlc3MoKS5nZXRSaWdodE9wZXJhbmRBc3NpZ25tZW50XzFfMSgpKTsgCiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMjI1MzoyOiAoIHJ1bGVfX1hBZGRpdGl2ZUV4cHJlc3Npb25fX1JpZ2h0T3BlcmFuZEFzc2lnbm1lbnRfMV8xICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEyMjUzOjM6IHJ1bGVfX1hBZGRpdGl2ZUV4cHJlc3Npb25fX1JpZ2h0T3BlcmFuZEFzc2lnbm1lbnRfMV8xCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMzU5MToyOiAoIHJ1bGVfX1hBZGRpdGl2ZUV4cHJlc3Npb25fX1JpZ2h0T3BlcmFuZEFzc2lnbm1lbnRfMV8xICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEzNTkxOjM6IHJ1bGVfX1hBZGRpdGl2ZUV4cHJlc3Npb25fX1JpZ2h0T3BlcmFuZEFzc2lnbm1lbnRfMV8xCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV18yKTsKICAgICAgICAgICAgIHJ1bGVfX1hBZGRpdGl2ZUV4cHJlc3Npb25fX1JpZ2h0T3BlcmFuZEFzc2lnbm1lbnRfMV8xKCk7CkBAIC00MTA3OSwxNCArNDU1MzYsMTQgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YQWRkaXRpdmVFeHByZXNzaW9uX19Hcm91cF8xXzBfXzAiCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTIyNjI6MTogcnVsZV9fWEFkZGl0aXZlRXhwcmVzc2lvbl9fR3JvdXBfMV8wX18wIDogcnVsZV9fWEFkZGl0aXZlRXhwcmVzc2lvbl9fR3JvdXBfMV8wX18wX19JbXBsIDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMzYwMDoxOiBydWxlX19YQWRkaXRpdmVFeHByZXNzaW9uX19Hcm91cF8xXzBfXzAgOiBydWxlX19YQWRkaXRpdmVFeHByZXNzaW9uX19Hcm91cF8xXzBfXzBfX0ltcGwgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1hBZGRpdGl2ZUV4cHJlc3Npb25fX0dyb3VwXzFfMF9fMCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMjI2NjoxOiAoIHJ1bGVfX1hBZGRpdGl2ZUV4cHJlc3Npb25fX0dyb3VwXzFfMF9fMF9fSW1wbCApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMjI2NzoyOiBydWxlX19YQWRkaXRpdmVFeHByZXNzaW9uX19Hcm91cF8xXzBfXzBfX0ltcGwKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEzNjA0OjE6ICggcnVsZV9fWEFkZGl0aXZlRXhwcmVzc2lvbl9fR3JvdXBfMV8wX18wX19JbXBsICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEzNjA1OjI6IHJ1bGVfX1hBZGRpdGl2ZUV4cHJlc3Npb25fX0dyb3VwXzFfMF9fMF9fSW1wbAogICAgICAgICAgICAgewogICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMik7CiAgICAgICAgICAgICBydWxlX19YQWRkaXRpdmVFeHByZXNzaW9uX19Hcm91cF8xXzBfXzBfX0ltcGwoKTsKQEAgLTQxMTEyLDIzICs0NTU2OSwyMyBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX1hBZGRpdGl2ZUV4cHJlc3Npb25fX0dyb3VwXzFfMF9fMF9fSW1wbCIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMjI3MzoxOiBydWxlX19YQWRkaXRpdmVFeHByZXNzaW9uX19Hcm91cF8xXzBfXzBfX0ltcGwgOiAoICggcnVsZV9fWEFkZGl0aXZlRXhwcmVzc2lvbl9fR3JvdXBfMV8wXzBfXzAgKSApIDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMzYxMToxOiBydWxlX19YQWRkaXRpdmVFeHByZXNzaW9uX19Hcm91cF8xXzBfXzBfX0ltcGwgOiAoICggcnVsZV9fWEFkZGl0aXZlRXhwcmVzc2lvbl9fR3JvdXBfMV8wXzBfXzAgKSApIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YQWRkaXRpdmVFeHByZXNzaW9uX19Hcm91cF8xXzBfXzBfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTIyNzc6MTogKCAoICggcnVsZV9fWEFkZGl0aXZlRXhwcmVzc2lvbl9fR3JvdXBfMV8wXzBfXzAgKSApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEyMjc4OjE6ICggKCBydWxlX19YQWRkaXRpdmVFeHByZXNzaW9uX19Hcm91cF8xXzBfMF9fMCApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEzNjE1OjE6ICggKCAoIHJ1bGVfX1hBZGRpdGl2ZUV4cHJlc3Npb25fX0dyb3VwXzFfMF8wX18wICkgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMzYxNjoxOiAoICggcnVsZV9fWEFkZGl0aXZlRXhwcmVzc2lvbl9fR3JvdXBfMV8wXzBfXzAgKSApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMjI3ODoxOiAoICggcnVsZV9fWEFkZGl0aXZlRXhwcmVzc2lvbl9fR3JvdXBfMV8wXzBfXzAgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMjI3OToyOiAoIHJ1bGVfX1hBZGRpdGl2ZUV4cHJlc3Npb25fX0dyb3VwXzFfMF8wX18wICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEzNjE2OjE6ICggKCBydWxlX19YQWRkaXRpdmVFeHByZXNzaW9uX19Hcm91cF8xXzBfMF9fMCApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEzNjE3OjI6ICggcnVsZV9fWEFkZGl0aXZlRXhwcmVzc2lvbl9fR3JvdXBfMV8wXzBfXzAgKQogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYQWRkaXRpdmVFeHByZXNzaW9uQWNjZXNzKCkuZ2V0R3JvdXBfMV8wXzAoKSk7IAogICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTIyODA6MjogKCBydWxlX19YQWRkaXRpdmVFeHByZXNzaW9uX19Hcm91cF8xXzBfMF9fMCApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMjI4MDozOiBydWxlX19YQWRkaXRpdmVFeHByZXNzaW9uX19Hcm91cF8xXzBfMF9fMAorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTM2MTg6MjogKCBydWxlX19YQWRkaXRpdmVFeHByZXNzaW9uX19Hcm91cF8xXzBfMF9fMCApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMzYxODozOiBydWxlX19YQWRkaXRpdmVFeHByZXNzaW9uX19Hcm91cF8xXzBfMF9fMAogICAgICAgICAgICAgewogICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMik7CiAgICAgICAgICAgICBydWxlX19YQWRkaXRpdmVFeHByZXNzaW9uX19Hcm91cF8xXzBfMF9fMCgpOwpAQCAtNDExNjMsMTYgKzQ1NjIwLDE2IEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fWEFkZGl0aXZlRXhwcmVzc2lvbl9fR3JvdXBfMV8wXzBfXzAiCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTIyODk6MTogcnVsZV9fWEFkZGl0aXZlRXhwcmVzc2lvbl9fR3JvdXBfMV8wXzBfXzAgOiBydWxlX19YQWRkaXRpdmVFeHByZXNzaW9uX19Hcm91cF8xXzBfMF9fMF9fSW1wbCBydWxlX19YQWRkaXRpdmVFeHByZXNzaW9uX19Hcm91cF8xXzBfMF9fMSA7CisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTM2Mjc6MTogcnVsZV9fWEFkZGl0aXZlRXhwcmVzc2lvbl9fR3JvdXBfMV8wXzBfXzAgOiBydWxlX19YQWRkaXRpdmVFeHByZXNzaW9uX19Hcm91cF8xXzBfMF9fMF9fSW1wbCBydWxlX19YQWRkaXRpdmVFeHByZXNzaW9uX19Hcm91cF8xXzBfMF9fMSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fWEFkZGl0aXZlRXhwcmVzc2lvbl9fR3JvdXBfMV8wXzBfXzAoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTIyOTM6MTogKCBydWxlX19YQWRkaXRpdmVFeHByZXNzaW9uX19Hcm91cF8xXzBfMF9fMF9fSW1wbCBydWxlX19YQWRkaXRpdmVFeHByZXNzaW9uX19Hcm91cF8xXzBfMF9fMSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMjI5NDoyOiBydWxlX19YQWRkaXRpdmVFeHByZXNzaW9uX19Hcm91cF8xXzBfMF9fMF9fSW1wbCBydWxlX19YQWRkaXRpdmVFeHByZXNzaW9uX19Hcm91cF8xXzBfMF9fMQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTM2MzE6MTogKCBydWxlX19YQWRkaXRpdmVFeHByZXNzaW9uX19Hcm91cF8xXzBfMF9fMF9fSW1wbCBydWxlX19YQWRkaXRpdmVFeHByZXNzaW9uX19Hcm91cF8xXzBfMF9fMSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMzYzMjoyOiBydWxlX19YQWRkaXRpdmVFeHByZXNzaW9uX19Hcm91cF8xXzBfMF9fMF9fSW1wbCBydWxlX19YQWRkaXRpdmVFeHByZXNzaW9uX19Hcm91cF8xXzBfMF9fMQogICAgICAgICAgICAgewotICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfOTgpOworICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMTA2KTsKICAgICAgICAgICAgIHJ1bGVfX1hBZGRpdGl2ZUV4cHJlc3Npb25fX0dyb3VwXzFfMF8wX18wX19JbXBsKCk7CiAKICAgICAgICAgICAgIHN0YXRlLl9mc3AtLTsKQEAgLTQxMjAxLDIzICs0NTY1OCwyMyBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX1hBZGRpdGl2ZUV4cHJlc3Npb25fX0dyb3VwXzFfMF8wX18wX19JbXBsIgotICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEyMzAxOjE6IHJ1bGVfX1hBZGRpdGl2ZUV4cHJlc3Npb25fX0dyb3VwXzFfMF8wX18wX19JbXBsIDogKCAoKSApIDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMzYzOToxOiBydWxlX19YQWRkaXRpdmVFeHByZXNzaW9uX19Hcm91cF8xXzBfMF9fMF9fSW1wbCA6ICggKCkgKSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fWEFkZGl0aXZlRXhwcmVzc2lvbl9fR3JvdXBfMV8wXzBfXzBfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTIzMDU6MTogKCAoICgpICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTIzMDY6MTogKCAoKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMzY0MzoxOiAoICggKCkgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMzY0NDoxOiAoICgpICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEyMzA2OjE6ICggKCkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTIzMDc6MjogKCkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEzNjQ0OjE6ICggKCkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTM2NDU6MjogKCkKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WEFkZGl0aXZlRXhwcmVzc2lvbkFjY2VzcygpLmdldFhCaW5hcnlPcGVyYXRpb25MZWZ0T3BlcmFuZEFjdGlvbl8xXzBfMF8wKCkpOyAKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEyMzA4OjI6ICgpCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMjMwODozOiAKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEzNjQ2OjI6ICgpCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMzY0NjozOiAKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIH0KIApAQCAtNDEyNDIsMTQgKzQ1Njk5LDE0IEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fWEFkZGl0aXZlRXhwcmVzc2lvbl9fR3JvdXBfMV8wXzBfXzEiCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTIzMTY6MTogcnVsZV9fWEFkZGl0aXZlRXhwcmVzc2lvbl9fR3JvdXBfMV8wXzBfXzEgOiBydWxlX19YQWRkaXRpdmVFeHByZXNzaW9uX19Hcm91cF8xXzBfMF9fMV9fSW1wbCA7CisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTM2NTQ6MTogcnVsZV9fWEFkZGl0aXZlRXhwcmVzc2lvbl9fR3JvdXBfMV8wXzBfXzEgOiBydWxlX19YQWRkaXRpdmVFeHByZXNzaW9uX19Hcm91cF8xXzBfMF9fMV9fSW1wbCA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fWEFkZGl0aXZlRXhwcmVzc2lvbl9fR3JvdXBfMV8wXzBfXzEoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTIzMjA6MTogKCBydWxlX19YQWRkaXRpdmVFeHByZXNzaW9uX19Hcm91cF8xXzBfMF9fMV9fSW1wbCApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMjMyMToyOiBydWxlX19YQWRkaXRpdmVFeHByZXNzaW9uX19Hcm91cF8xXzBfMF9fMV9fSW1wbAorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTM2NTg6MTogKCBydWxlX19YQWRkaXRpdmVFeHByZXNzaW9uX19Hcm91cF8xXzBfMF9fMV9fSW1wbCApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMzY1OToyOiBydWxlX19YQWRkaXRpdmVFeHByZXNzaW9uX19Hcm91cF8xXzBfMF9fMV9fSW1wbAogICAgICAgICAgICAgewogICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMik7CiAgICAgICAgICAgICBydWxlX19YQWRkaXRpdmVFeHByZXNzaW9uX19Hcm91cF8xXzBfMF9fMV9fSW1wbCgpOwpAQCAtNDEyNzUsMjMgKzQ1NzMyLDIzIEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fWEFkZGl0aXZlRXhwcmVzc2lvbl9fR3JvdXBfMV8wXzBfXzFfX0ltcGwiCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTIzMjc6MTogcnVsZV9fWEFkZGl0aXZlRXhwcmVzc2lvbl9fR3JvdXBfMV8wXzBfXzFfX0ltcGwgOiAoICggcnVsZV9fWEFkZGl0aXZlRXhwcmVzc2lvbl9fRmVhdHVyZUFzc2lnbm1lbnRfMV8wXzBfMSApICkgOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEzNjY1OjE6IHJ1bGVfX1hBZGRpdGl2ZUV4cHJlc3Npb25fX0dyb3VwXzFfMF8wX18xX19JbXBsIDogKCAoIHJ1bGVfX1hBZGRpdGl2ZUV4cHJlc3Npb25fX0ZlYXR1cmVBc3NpZ25tZW50XzFfMF8wXzEgKSApIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YQWRkaXRpdmVFeHByZXNzaW9uX19Hcm91cF8xXzBfMF9fMV9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMjMzMToxOiAoICggKCBydWxlX19YQWRkaXRpdmVFeHByZXNzaW9uX19GZWF0dXJlQXNzaWdubWVudF8xXzBfMF8xICkgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMjMzMjoxOiAoICggcnVsZV9fWEFkZGl0aXZlRXhwcmVzc2lvbl9fRmVhdHVyZUFzc2lnbm1lbnRfMV8wXzBfMSApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEzNjY5OjE6ICggKCAoIHJ1bGVfX1hBZGRpdGl2ZUV4cHJlc3Npb25fX0ZlYXR1cmVBc3NpZ25tZW50XzFfMF8wXzEgKSApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEzNjcwOjE6ICggKCBydWxlX19YQWRkaXRpdmVFeHByZXNzaW9uX19GZWF0dXJlQXNzaWdubWVudF8xXzBfMF8xICkgKQogICAgICAgICAgICAgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTIzMzI6MTogKCAoIHJ1bGVfX1hBZGRpdGl2ZUV4cHJlc3Npb25fX0ZlYXR1cmVBc3NpZ25tZW50XzFfMF8wXzEgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMjMzMzoyOiAoIHJ1bGVfX1hBZGRpdGl2ZUV4cHJlc3Npb25fX0ZlYXR1cmVBc3NpZ25tZW50XzFfMF8wXzEgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTM2NzA6MTogKCAoIHJ1bGVfX1hBZGRpdGl2ZUV4cHJlc3Npb25fX0ZlYXR1cmVBc3NpZ25tZW50XzFfMF8wXzEgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMzY3MToyOiAoIHJ1bGVfX1hBZGRpdGl2ZUV4cHJlc3Npb25fX0ZlYXR1cmVBc3NpZ25tZW50XzFfMF8wXzEgKQogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYQWRkaXRpdmVFeHByZXNzaW9uQWNjZXNzKCkuZ2V0RmVhdHVyZUFzc2lnbm1lbnRfMV8wXzBfMSgpKTsgCiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMjMzNDoyOiAoIHJ1bGVfX1hBZGRpdGl2ZUV4cHJlc3Npb25fX0ZlYXR1cmVBc3NpZ25tZW50XzFfMF8wXzEgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTIzMzQ6MzogcnVsZV9fWEFkZGl0aXZlRXhwcmVzc2lvbl9fRmVhdHVyZUFzc2lnbm1lbnRfMV8wXzBfMQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTM2NzI6MjogKCBydWxlX19YQWRkaXRpdmVFeHByZXNzaW9uX19GZWF0dXJlQXNzaWdubWVudF8xXzBfMF8xICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEzNjcyOjM6IHJ1bGVfX1hBZGRpdGl2ZUV4cHJlc3Npb25fX0ZlYXR1cmVBc3NpZ25tZW50XzFfMF8wXzEKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzIpOwogICAgICAgICAgICAgcnVsZV9fWEFkZGl0aXZlRXhwcmVzc2lvbl9fRmVhdHVyZUFzc2lnbm1lbnRfMV8wXzBfMSgpOwpAQCAtNDEzMjYsMTYgKzQ1NzgzLDE2IEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fWE11bHRpcGxpY2F0aXZlRXhwcmVzc2lvbl9fR3JvdXBfXzAiCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTIzNDM6MTogcnVsZV9fWE11bHRpcGxpY2F0aXZlRXhwcmVzc2lvbl9fR3JvdXBfXzAgOiBydWxlX19YTXVsdGlwbGljYXRpdmVFeHByZXNzaW9uX19Hcm91cF9fMF9fSW1wbCBydWxlX19YTXVsdGlwbGljYXRpdmVFeHByZXNzaW9uX19Hcm91cF9fMSA7CisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTM2ODE6MTogcnVsZV9fWE11bHRpcGxpY2F0aXZlRXhwcmVzc2lvbl9fR3JvdXBfXzAgOiBydWxlX19YTXVsdGlwbGljYXRpdmVFeHByZXNzaW9uX19Hcm91cF9fMF9fSW1wbCBydWxlX19YTXVsdGlwbGljYXRpdmVFeHByZXNzaW9uX19Hcm91cF9fMSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fWE11bHRpcGxpY2F0aXZlRXhwcmVzc2lvbl9fR3JvdXBfXzAoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTIzNDc6MTogKCBydWxlX19YTXVsdGlwbGljYXRpdmVFeHByZXNzaW9uX19Hcm91cF9fMF9fSW1wbCBydWxlX19YTXVsdGlwbGljYXRpdmVFeHByZXNzaW9uX19Hcm91cF9fMSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMjM0ODoyOiBydWxlX19YTXVsdGlwbGljYXRpdmVFeHByZXNzaW9uX19Hcm91cF9fMF9fSW1wbCBydWxlX19YTXVsdGlwbGljYXRpdmVFeHByZXNzaW9uX19Hcm91cF9fMQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTM2ODU6MTogKCBydWxlX19YTXVsdGlwbGljYXRpdmVFeHByZXNzaW9uX19Hcm91cF9fMF9fSW1wbCBydWxlX19YTXVsdGlwbGljYXRpdmVFeHByZXNzaW9uX19Hcm91cF9fMSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMzY4NjoyOiBydWxlX19YTXVsdGlwbGljYXRpdmVFeHByZXNzaW9uX19Hcm91cF9fMF9fSW1wbCBydWxlX19YTXVsdGlwbGljYXRpdmVFeHByZXNzaW9uX19Hcm91cF9fMQogICAgICAgICAgICAgewotICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMTAwKTsKKyAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzEwOCk7CiAgICAgICAgICAgICBydWxlX19YTXVsdGlwbGljYXRpdmVFeHByZXNzaW9uX19Hcm91cF9fMF9fSW1wbCgpOwogCiAgICAgICAgICAgICBzdGF0ZS5fZnNwLS07CkBAIC00MTM2NCwxNyArNDU4MjEsMTcgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YTXVsdGlwbGljYXRpdmVFeHByZXNzaW9uX19Hcm91cF9fMF9fSW1wbCIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMjM1NToxOiBydWxlX19YTXVsdGlwbGljYXRpdmVFeHByZXNzaW9uX19Hcm91cF9fMF9fSW1wbCA6ICggcnVsZVhVbmFyeU9wZXJhdGlvbiApIDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMzY5MzoxOiBydWxlX19YTXVsdGlwbGljYXRpdmVFeHByZXNzaW9uX19Hcm91cF9fMF9fSW1wbCA6ICggcnVsZVhVbmFyeU9wZXJhdGlvbiApIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YTXVsdGlwbGljYXRpdmVFeHByZXNzaW9uX19Hcm91cF9fMF9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMjM1OToxOiAoICggcnVsZVhVbmFyeU9wZXJhdGlvbiApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEyMzYwOjE6ICggcnVsZVhVbmFyeU9wZXJhdGlvbiApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMzY5NzoxOiAoICggcnVsZVhVbmFyeU9wZXJhdGlvbiApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEzNjk4OjE6ICggcnVsZVhVbmFyeU9wZXJhdGlvbiApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMjM2MDoxOiAoIHJ1bGVYVW5hcnlPcGVyYXRpb24gKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTIzNjE6MjogcnVsZVhVbmFyeU9wZXJhdGlvbgorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTM2OTg6MTogKCBydWxlWFVuYXJ5T3BlcmF0aW9uICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEzNjk5OjI6IHJ1bGVYVW5hcnlPcGVyYXRpb24KICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WE11bHRpcGxpY2F0aXZlRXhwcmVzc2lvbkFjY2VzcygpLmdldFhVbmFyeU9wZXJhdGlvblBhcnNlclJ1bGVDYWxsXzAoKSk7IApAQCAtNDE0MDksMTQgKzQ1ODY2LDE0IEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fWE11bHRpcGxpY2F0aXZlRXhwcmVzc2lvbl9fR3JvdXBfXzEiCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTIzNzA6MTogcnVsZV9fWE11bHRpcGxpY2F0aXZlRXhwcmVzc2lvbl9fR3JvdXBfXzEgOiBydWxlX19YTXVsdGlwbGljYXRpdmVFeHByZXNzaW9uX19Hcm91cF9fMV9fSW1wbCA7CisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTM3MDg6MTogcnVsZV9fWE11bHRpcGxpY2F0aXZlRXhwcmVzc2lvbl9fR3JvdXBfXzEgOiBydWxlX19YTXVsdGlwbGljYXRpdmVFeHByZXNzaW9uX19Hcm91cF9fMV9fSW1wbCA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fWE11bHRpcGxpY2F0aXZlRXhwcmVzc2lvbl9fR3JvdXBfXzEoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTIzNzQ6MTogKCBydWxlX19YTXVsdGlwbGljYXRpdmVFeHByZXNzaW9uX19Hcm91cF9fMV9fSW1wbCApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMjM3NToyOiBydWxlX19YTXVsdGlwbGljYXRpdmVFeHByZXNzaW9uX19Hcm91cF9fMV9fSW1wbAorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTM3MTI6MTogKCBydWxlX19YTXVsdGlwbGljYXRpdmVFeHByZXNzaW9uX19Hcm91cF9fMV9fSW1wbCApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMzcxMzoyOiBydWxlX19YTXVsdGlwbGljYXRpdmVFeHByZXNzaW9uX19Hcm91cF9fMV9fSW1wbAogICAgICAgICAgICAgewogICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMik7CiAgICAgICAgICAgICBydWxlX19YTXVsdGlwbGljYXRpdmVFeHByZXNzaW9uX19Hcm91cF9fMV9fSW1wbCgpOwpAQCAtNDE0NDIsMzIgKzQ1ODk5LDMyIEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fWE11bHRpcGxpY2F0aXZlRXhwcmVzc2lvbl9fR3JvdXBfXzFfX0ltcGwiCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTIzODE6MTogcnVsZV9fWE11bHRpcGxpY2F0aXZlRXhwcmVzc2lvbl9fR3JvdXBfXzFfX0ltcGwgOiAoICggcnVsZV9fWE11bHRpcGxpY2F0aXZlRXhwcmVzc2lvbl9fR3JvdXBfMV9fMCApKiApIDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMzcxOToxOiBydWxlX19YTXVsdGlwbGljYXRpdmVFeHByZXNzaW9uX19Hcm91cF9fMV9fSW1wbCA6ICggKCBydWxlX19YTXVsdGlwbGljYXRpdmVFeHByZXNzaW9uX19Hcm91cF8xX18wICkqICkgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1hNdWx0aXBsaWNhdGl2ZUV4cHJlc3Npb25fX0dyb3VwX18xX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEyMzg1OjE6ICggKCAoIHJ1bGVfX1hNdWx0aXBsaWNhdGl2ZUV4cHJlc3Npb25fX0dyb3VwXzFfXzAgKSogKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMjM4NjoxOiAoICggcnVsZV9fWE11bHRpcGxpY2F0aXZlRXhwcmVzc2lvbl9fR3JvdXBfMV9fMCApKiApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMzcyMzoxOiAoICggKCBydWxlX19YTXVsdGlwbGljYXRpdmVFeHByZXNzaW9uX19Hcm91cF8xX18wICkqICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTM3MjQ6MTogKCAoIHJ1bGVfX1hNdWx0aXBsaWNhdGl2ZUV4cHJlc3Npb25fX0dyb3VwXzFfXzAgKSogKQogICAgICAgICAgICAgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTIzODY6MTogKCAoIHJ1bGVfX1hNdWx0aXBsaWNhdGl2ZUV4cHJlc3Npb25fX0dyb3VwXzFfXzAgKSogKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTIzODc6MjogKCBydWxlX19YTXVsdGlwbGljYXRpdmVFeHByZXNzaW9uX19Hcm91cF8xX18wICkqCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMzcyNDoxOiAoICggcnVsZV9fWE11bHRpcGxpY2F0aXZlRXhwcmVzc2lvbl9fR3JvdXBfMV9fMCApKiApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMzcyNToyOiAoIHJ1bGVfX1hNdWx0aXBsaWNhdGl2ZUV4cHJlc3Npb25fX0dyb3VwXzFfXzAgKSoKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WE11bHRpcGxpY2F0aXZlRXhwcmVzc2lvbkFjY2VzcygpLmdldEdyb3VwXzEoKSk7IAogICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTIzODg6MjogKCBydWxlX19YTXVsdGlwbGljYXRpdmVFeHByZXNzaW9uX19Hcm91cF8xX18wICkqCi0gICAgICAgICAgICBsb29wMTAzOgorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTM3MjY6MjogKCBydWxlX19YTXVsdGlwbGljYXRpdmVFeHByZXNzaW9uX19Hcm91cF8xX18wICkqCisgICAgICAgICAgICBsb29wMTE2OgogICAgICAgICAgICAgZG8gewotICAgICAgICAgICAgICAgIGludCBhbHQxMDM9MjsKKyAgICAgICAgICAgICAgICBpbnQgYWx0MTE2PTI7CiAgICAgICAgICAgICAgICAgc3dpdGNoICggaW5wdXQuTEEoMSkgKSB7CiAgICAgICAgICAgICAgICAgY2FzZSAzNjoKICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBpbnQgTEExMDNfMiA9IGlucHV0LkxBKDIpOworICAgICAgICAgICAgICAgICAgICBpbnQgTEExMTZfMiA9IGlucHV0LkxBKDIpOwogCi0gICAgICAgICAgICAgICAgICAgIGlmICggKHN5bnByZWQxNTdfSW50ZXJuYWxEYXRhRFNMKCkpICkgewotICAgICAgICAgICAgICAgICAgICAgICAgYWx0MTAzPTE7CisgICAgICAgICAgICAgICAgICAgIGlmICggKHN5bnByZWQxNzZfSW50ZXJuYWxEYXRhRFNMKCkpICkgeworICAgICAgICAgICAgICAgICAgICAgICAgYWx0MTE2PTE7CiAgICAgICAgICAgICAgICAgICAgIH0KIAogCkBAIC00MTQ3NSwxMCArNDU5MzIsMTAgQEAKICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgY2FzZSAzNzoKICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBpbnQgTEExMDNfMyA9IGlucHV0LkxBKDIpOworICAgICAgICAgICAgICAgICAgICBpbnQgTEExMTZfMyA9IGlucHV0LkxBKDIpOwogCi0gICAgICAgICAgICAgICAgICAgIGlmICggKHN5bnByZWQxNTdfSW50ZXJuYWxEYXRhRFNMKCkpICkgewotICAgICAgICAgICAgICAgICAgICAgICAgYWx0MTAzPTE7CisgICAgICAgICAgICAgICAgICAgIGlmICggKHN5bnByZWQxNzZfSW50ZXJuYWxEYXRhRFNMKCkpICkgeworICAgICAgICAgICAgICAgICAgICAgICAgYWx0MTE2PTE7CiAgICAgICAgICAgICAgICAgICAgIH0KIAogCkBAIC00MTQ4NiwxMCArNDU5NDMsMTAgQEAKICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgY2FzZSAzODoKICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBpbnQgTEExMDNfNCA9IGlucHV0LkxBKDIpOworICAgICAgICAgICAgICAgICAgICBpbnQgTEExMTZfNCA9IGlucHV0LkxBKDIpOwogCi0gICAgICAgICAgICAgICAgICAgIGlmICggKHN5bnByZWQxNTdfSW50ZXJuYWxEYXRhRFNMKCkpICkgewotICAgICAgICAgICAgICAgICAgICAgICAgYWx0MTAzPTE7CisgICAgICAgICAgICAgICAgICAgIGlmICggKHN5bnByZWQxNzZfSW50ZXJuYWxEYXRhRFNMKCkpICkgeworICAgICAgICAgICAgICAgICAgICAgICAgYWx0MTE2PTE7CiAgICAgICAgICAgICAgICAgICAgIH0KIAogCkBAIC00MTQ5NywxMCArNDU5NTQsMTAgQEAKICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgY2FzZSAzOToKICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBpbnQgTEExMDNfNSA9IGlucHV0LkxBKDIpOworICAgICAgICAgICAgICAgICAgICBpbnQgTEExMTZfNSA9IGlucHV0LkxBKDIpOwogCi0gICAgICAgICAgICAgICAgICAgIGlmICggKHN5bnByZWQxNTdfSW50ZXJuYWxEYXRhRFNMKCkpICkgewotICAgICAgICAgICAgICAgICAgICAgICAgYWx0MTAzPTE7CisgICAgICAgICAgICAgICAgICAgIGlmICggKHN5bnByZWQxNzZfSW50ZXJuYWxEYXRhRFNMKCkpICkgeworICAgICAgICAgICAgICAgICAgICAgICAgYWx0MTE2PTE7CiAgICAgICAgICAgICAgICAgICAgIH0KIAogCkBAIC00MTUwOSwxMSArNDU5NjYsMTEgQEAKIAogICAgICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgICAgIHN3aXRjaCAoYWx0MTAzKSB7CisgICAgICAgICAgICAgICAgc3dpdGNoIChhbHQxMTYpIHsKICAgICAgICAgICAgIAljYXNlIDEgOgotICAgICAgICAgICAgCSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMjM4ODozOiBydWxlX19YTXVsdGlwbGljYXRpdmVFeHByZXNzaW9uX19Hcm91cF8xX18wCisgICAgICAgICAgICAJICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEzNzI2OjM6IHJ1bGVfX1hNdWx0aXBsaWNhdGl2ZUV4cHJlc3Npb25fX0dyb3VwXzFfXzAKICAgICAgICAgICAgIAkgICAgewotICAgICAgICAgICAgCSAgICBwdXNoRm9sbG93KEZPTExPV18xMDEpOworICAgICAgICAgICAgCSAgICBwdXNoRm9sbG93KEZPTExPV18xMDkpOwogICAgICAgICAgICAgCSAgICBydWxlX19YTXVsdGlwbGljYXRpdmVFeHByZXNzaW9uX19Hcm91cF8xX18wKCk7CiAKICAgICAgICAgICAgIAkgICAgc3RhdGUuX2ZzcC0tOwpAQCAtNDE1MjMsNyArNDU5ODAsNyBAQAogICAgICAgICAgICAgCSAgICBicmVhazsKIAogICAgICAgICAgICAgCWRlZmF1bHQgOgotICAgICAgICAgICAgCSAgICBicmVhayBsb29wMTAzOworICAgICAgICAgICAgCSAgICBicmVhayBsb29wMTE2OwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0gd2hpbGUgKHRydWUpOwogCkBAIC00MTU1MiwxNiArNDYwMDksMTYgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YTXVsdGlwbGljYXRpdmVFeHByZXNzaW9uX19Hcm91cF8xX18wIgotICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEyMzk3OjE6IHJ1bGVfX1hNdWx0aXBsaWNhdGl2ZUV4cHJlc3Npb25fX0dyb3VwXzFfXzAgOiBydWxlX19YTXVsdGlwbGljYXRpdmVFeHByZXNzaW9uX19Hcm91cF8xX18wX19JbXBsIHJ1bGVfX1hNdWx0aXBsaWNhdGl2ZUV4cHJlc3Npb25fX0dyb3VwXzFfXzEgOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEzNzM1OjE6IHJ1bGVfX1hNdWx0aXBsaWNhdGl2ZUV4cHJlc3Npb25fX0dyb3VwXzFfXzAgOiBydWxlX19YTXVsdGlwbGljYXRpdmVFeHByZXNzaW9uX19Hcm91cF8xX18wX19JbXBsIHJ1bGVfX1hNdWx0aXBsaWNhdGl2ZUV4cHJlc3Npb25fX0dyb3VwXzFfXzEgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1hNdWx0aXBsaWNhdGl2ZUV4cHJlc3Npb25fX0dyb3VwXzFfXzAoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTI0MDE6MTogKCBydWxlX19YTXVsdGlwbGljYXRpdmVFeHByZXNzaW9uX19Hcm91cF8xX18wX19JbXBsIHJ1bGVfX1hNdWx0aXBsaWNhdGl2ZUV4cHJlc3Npb25fX0dyb3VwXzFfXzEgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTI0MDI6MjogcnVsZV9fWE11bHRpcGxpY2F0aXZlRXhwcmVzc2lvbl9fR3JvdXBfMV9fMF9fSW1wbCBydWxlX19YTXVsdGlwbGljYXRpdmVFeHByZXNzaW9uX19Hcm91cF8xX18xCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMzczOToxOiAoIHJ1bGVfX1hNdWx0aXBsaWNhdGl2ZUV4cHJlc3Npb25fX0dyb3VwXzFfXzBfX0ltcGwgcnVsZV9fWE11bHRpcGxpY2F0aXZlRXhwcmVzc2lvbl9fR3JvdXBfMV9fMSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMzc0MDoyOiBydWxlX19YTXVsdGlwbGljYXRpdmVFeHByZXNzaW9uX19Hcm91cF8xX18wX19JbXBsIHJ1bGVfX1hNdWx0aXBsaWNhdGl2ZUV4cHJlc3Npb25fX0dyb3VwXzFfXzEKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzc0KTsKKyAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzgyKTsKICAgICAgICAgICAgIHJ1bGVfX1hNdWx0aXBsaWNhdGl2ZUV4cHJlc3Npb25fX0dyb3VwXzFfXzBfX0ltcGwoKTsKIAogICAgICAgICAgICAgc3RhdGUuX2ZzcC0tOwpAQCAtNDE1OTAsMjMgKzQ2MDQ3LDIzIEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fWE11bHRpcGxpY2F0aXZlRXhwcmVzc2lvbl9fR3JvdXBfMV9fMF9fSW1wbCIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMjQwOToxOiBydWxlX19YTXVsdGlwbGljYXRpdmVFeHByZXNzaW9uX19Hcm91cF8xX18wX19JbXBsIDogKCAoIHJ1bGVfX1hNdWx0aXBsaWNhdGl2ZUV4cHJlc3Npb25fX0dyb3VwXzFfMF9fMCApICkgOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEzNzQ3OjE6IHJ1bGVfX1hNdWx0aXBsaWNhdGl2ZUV4cHJlc3Npb25fX0dyb3VwXzFfXzBfX0ltcGwgOiAoICggcnVsZV9fWE11bHRpcGxpY2F0aXZlRXhwcmVzc2lvbl9fR3JvdXBfMV8wX18wICkgKSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fWE11bHRpcGxpY2F0aXZlRXhwcmVzc2lvbl9fR3JvdXBfMV9fMF9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMjQxMzoxOiAoICggKCBydWxlX19YTXVsdGlwbGljYXRpdmVFeHByZXNzaW9uX19Hcm91cF8xXzBfXzAgKSApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEyNDE0OjE6ICggKCBydWxlX19YTXVsdGlwbGljYXRpdmVFeHByZXNzaW9uX19Hcm91cF8xXzBfXzAgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMzc1MToxOiAoICggKCBydWxlX19YTXVsdGlwbGljYXRpdmVFeHByZXNzaW9uX19Hcm91cF8xXzBfXzAgKSApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEzNzUyOjE6ICggKCBydWxlX19YTXVsdGlwbGljYXRpdmVFeHByZXNzaW9uX19Hcm91cF8xXzBfXzAgKSApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMjQxNDoxOiAoICggcnVsZV9fWE11bHRpcGxpY2F0aXZlRXhwcmVzc2lvbl9fR3JvdXBfMV8wX18wICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTI0MTU6MjogKCBydWxlX19YTXVsdGlwbGljYXRpdmVFeHByZXNzaW9uX19Hcm91cF8xXzBfXzAgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTM3NTI6MTogKCAoIHJ1bGVfX1hNdWx0aXBsaWNhdGl2ZUV4cHJlc3Npb25fX0dyb3VwXzFfMF9fMCApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEzNzUzOjI6ICggcnVsZV9fWE11bHRpcGxpY2F0aXZlRXhwcmVzc2lvbl9fR3JvdXBfMV8wX18wICkKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WE11bHRpcGxpY2F0aXZlRXhwcmVzc2lvbkFjY2VzcygpLmdldEdyb3VwXzFfMCgpKTsgCiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMjQxNjoyOiAoIHJ1bGVfX1hNdWx0aXBsaWNhdGl2ZUV4cHJlc3Npb25fX0dyb3VwXzFfMF9fMCApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMjQxNjozOiBydWxlX19YTXVsdGlwbGljYXRpdmVFeHByZXNzaW9uX19Hcm91cF8xXzBfXzAKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEzNzU0OjI6ICggcnVsZV9fWE11bHRpcGxpY2F0aXZlRXhwcmVzc2lvbl9fR3JvdXBfMV8wX18wICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEzNzU0OjM6IHJ1bGVfX1hNdWx0aXBsaWNhdGl2ZUV4cHJlc3Npb25fX0dyb3VwXzFfMF9fMAogICAgICAgICAgICAgewogICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMik7CiAgICAgICAgICAgICBydWxlX19YTXVsdGlwbGljYXRpdmVFeHByZXNzaW9uX19Hcm91cF8xXzBfXzAoKTsKQEAgLTQxNjQxLDE0ICs0NjA5OCwxNCBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX1hNdWx0aXBsaWNhdGl2ZUV4cHJlc3Npb25fX0dyb3VwXzFfXzEiCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTI0MjQ6MTogcnVsZV9fWE11bHRpcGxpY2F0aXZlRXhwcmVzc2lvbl9fR3JvdXBfMV9fMSA6IHJ1bGVfX1hNdWx0aXBsaWNhdGl2ZUV4cHJlc3Npb25fX0dyb3VwXzFfXzFfX0ltcGwgOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEzNzYyOjE6IHJ1bGVfX1hNdWx0aXBsaWNhdGl2ZUV4cHJlc3Npb25fX0dyb3VwXzFfXzEgOiBydWxlX19YTXVsdGlwbGljYXRpdmVFeHByZXNzaW9uX19Hcm91cF8xX18xX19JbXBsIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YTXVsdGlwbGljYXRpdmVFeHByZXNzaW9uX19Hcm91cF8xX18xKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEyNDI4OjE6ICggcnVsZV9fWE11bHRpcGxpY2F0aXZlRXhwcmVzc2lvbl9fR3JvdXBfMV9fMV9fSW1wbCApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMjQyOToyOiBydWxlX19YTXVsdGlwbGljYXRpdmVFeHByZXNzaW9uX19Hcm91cF8xX18xX19JbXBsCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMzc2NjoxOiAoIHJ1bGVfX1hNdWx0aXBsaWNhdGl2ZUV4cHJlc3Npb25fX0dyb3VwXzFfXzFfX0ltcGwgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTM3Njc6MjogcnVsZV9fWE11bHRpcGxpY2F0aXZlRXhwcmVzc2lvbl9fR3JvdXBfMV9fMV9fSW1wbAogICAgICAgICAgICAgewogICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMik7CiAgICAgICAgICAgICBydWxlX19YTXVsdGlwbGljYXRpdmVFeHByZXNzaW9uX19Hcm91cF8xX18xX19JbXBsKCk7CkBAIC00MTY3NCwyMyArNDYxMzEsMjMgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YTXVsdGlwbGljYXRpdmVFeHByZXNzaW9uX19Hcm91cF8xX18xX19JbXBsIgotICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEyNDM1OjE6IHJ1bGVfX1hNdWx0aXBsaWNhdGl2ZUV4cHJlc3Npb25fX0dyb3VwXzFfXzFfX0ltcGwgOiAoICggcnVsZV9fWE11bHRpcGxpY2F0aXZlRXhwcmVzc2lvbl9fUmlnaHRPcGVyYW5kQXNzaWdubWVudF8xXzEgKSApIDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMzc3MzoxOiBydWxlX19YTXVsdGlwbGljYXRpdmVFeHByZXNzaW9uX19Hcm91cF8xX18xX19JbXBsIDogKCAoIHJ1bGVfX1hNdWx0aXBsaWNhdGl2ZUV4cHJlc3Npb25fX1JpZ2h0T3BlcmFuZEFzc2lnbm1lbnRfMV8xICkgKSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fWE11bHRpcGxpY2F0aXZlRXhwcmVzc2lvbl9fR3JvdXBfMV9fMV9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMjQzOToxOiAoICggKCBydWxlX19YTXVsdGlwbGljYXRpdmVFeHByZXNzaW9uX19SaWdodE9wZXJhbmRBc3NpZ25tZW50XzFfMSApICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTI0NDA6MTogKCAoIHJ1bGVfX1hNdWx0aXBsaWNhdGl2ZUV4cHJlc3Npb25fX1JpZ2h0T3BlcmFuZEFzc2lnbm1lbnRfMV8xICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTM3Nzc6MTogKCAoICggcnVsZV9fWE11bHRpcGxpY2F0aXZlRXhwcmVzc2lvbl9fUmlnaHRPcGVyYW5kQXNzaWdubWVudF8xXzEgKSApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEzNzc4OjE6ICggKCBydWxlX19YTXVsdGlwbGljYXRpdmVFeHByZXNzaW9uX19SaWdodE9wZXJhbmRBc3NpZ25tZW50XzFfMSApICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEyNDQwOjE6ICggKCBydWxlX19YTXVsdGlwbGljYXRpdmVFeHByZXNzaW9uX19SaWdodE9wZXJhbmRBc3NpZ25tZW50XzFfMSApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEyNDQxOjI6ICggcnVsZV9fWE11bHRpcGxpY2F0aXZlRXhwcmVzc2lvbl9fUmlnaHRPcGVyYW5kQXNzaWdubWVudF8xXzEgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTM3Nzg6MTogKCAoIHJ1bGVfX1hNdWx0aXBsaWNhdGl2ZUV4cHJlc3Npb25fX1JpZ2h0T3BlcmFuZEFzc2lnbm1lbnRfMV8xICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTM3Nzk6MjogKCBydWxlX19YTXVsdGlwbGljYXRpdmVFeHByZXNzaW9uX19SaWdodE9wZXJhbmRBc3NpZ25tZW50XzFfMSApCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhNdWx0aXBsaWNhdGl2ZUV4cHJlc3Npb25BY2Nlc3MoKS5nZXRSaWdodE9wZXJhbmRBc3NpZ25tZW50XzFfMSgpKTsgCiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMjQ0MjoyOiAoIHJ1bGVfX1hNdWx0aXBsaWNhdGl2ZUV4cHJlc3Npb25fX1JpZ2h0T3BlcmFuZEFzc2lnbm1lbnRfMV8xICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEyNDQyOjM6IHJ1bGVfX1hNdWx0aXBsaWNhdGl2ZUV4cHJlc3Npb25fX1JpZ2h0T3BlcmFuZEFzc2lnbm1lbnRfMV8xCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMzc4MDoyOiAoIHJ1bGVfX1hNdWx0aXBsaWNhdGl2ZUV4cHJlc3Npb25fX1JpZ2h0T3BlcmFuZEFzc2lnbm1lbnRfMV8xICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEzNzgwOjM6IHJ1bGVfX1hNdWx0aXBsaWNhdGl2ZUV4cHJlc3Npb25fX1JpZ2h0T3BlcmFuZEFzc2lnbm1lbnRfMV8xCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV18yKTsKICAgICAgICAgICAgIHJ1bGVfX1hNdWx0aXBsaWNhdGl2ZUV4cHJlc3Npb25fX1JpZ2h0T3BlcmFuZEFzc2lnbm1lbnRfMV8xKCk7CkBAIC00MTcyNSwxNCArNDYxODIsMTQgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YTXVsdGlwbGljYXRpdmVFeHByZXNzaW9uX19Hcm91cF8xXzBfXzAiCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTI0NTE6MTogcnVsZV9fWE11bHRpcGxpY2F0aXZlRXhwcmVzc2lvbl9fR3JvdXBfMV8wX18wIDogcnVsZV9fWE11bHRpcGxpY2F0aXZlRXhwcmVzc2lvbl9fR3JvdXBfMV8wX18wX19JbXBsIDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMzc4OToxOiBydWxlX19YTXVsdGlwbGljYXRpdmVFeHByZXNzaW9uX19Hcm91cF8xXzBfXzAgOiBydWxlX19YTXVsdGlwbGljYXRpdmVFeHByZXNzaW9uX19Hcm91cF8xXzBfXzBfX0ltcGwgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1hNdWx0aXBsaWNhdGl2ZUV4cHJlc3Npb25fX0dyb3VwXzFfMF9fMCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMjQ1NToxOiAoIHJ1bGVfX1hNdWx0aXBsaWNhdGl2ZUV4cHJlc3Npb25fX0dyb3VwXzFfMF9fMF9fSW1wbCApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMjQ1NjoyOiBydWxlX19YTXVsdGlwbGljYXRpdmVFeHByZXNzaW9uX19Hcm91cF8xXzBfXzBfX0ltcGwKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEzNzkzOjE6ICggcnVsZV9fWE11bHRpcGxpY2F0aXZlRXhwcmVzc2lvbl9fR3JvdXBfMV8wX18wX19JbXBsICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEzNzk0OjI6IHJ1bGVfX1hNdWx0aXBsaWNhdGl2ZUV4cHJlc3Npb25fX0dyb3VwXzFfMF9fMF9fSW1wbAogICAgICAgICAgICAgewogICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMik7CiAgICAgICAgICAgICBydWxlX19YTXVsdGlwbGljYXRpdmVFeHByZXNzaW9uX19Hcm91cF8xXzBfXzBfX0ltcGwoKTsKQEAgLTQxNzU4LDIzICs0NjIxNSwyMyBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX1hNdWx0aXBsaWNhdGl2ZUV4cHJlc3Npb25fX0dyb3VwXzFfMF9fMF9fSW1wbCIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMjQ2MjoxOiBydWxlX19YTXVsdGlwbGljYXRpdmVFeHByZXNzaW9uX19Hcm91cF8xXzBfXzBfX0ltcGwgOiAoICggcnVsZV9fWE11bHRpcGxpY2F0aXZlRXhwcmVzc2lvbl9fR3JvdXBfMV8wXzBfXzAgKSApIDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMzgwMDoxOiBydWxlX19YTXVsdGlwbGljYXRpdmVFeHByZXNzaW9uX19Hcm91cF8xXzBfXzBfX0ltcGwgOiAoICggcnVsZV9fWE11bHRpcGxpY2F0aXZlRXhwcmVzc2lvbl9fR3JvdXBfMV8wXzBfXzAgKSApIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YTXVsdGlwbGljYXRpdmVFeHByZXNzaW9uX19Hcm91cF8xXzBfXzBfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTI0NjY6MTogKCAoICggcnVsZV9fWE11bHRpcGxpY2F0aXZlRXhwcmVzc2lvbl9fR3JvdXBfMV8wXzBfXzAgKSApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEyNDY3OjE6ICggKCBydWxlX19YTXVsdGlwbGljYXRpdmVFeHByZXNzaW9uX19Hcm91cF8xXzBfMF9fMCApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEzODA0OjE6ICggKCAoIHJ1bGVfX1hNdWx0aXBsaWNhdGl2ZUV4cHJlc3Npb25fX0dyb3VwXzFfMF8wX18wICkgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMzgwNToxOiAoICggcnVsZV9fWE11bHRpcGxpY2F0aXZlRXhwcmVzc2lvbl9fR3JvdXBfMV8wXzBfXzAgKSApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMjQ2NzoxOiAoICggcnVsZV9fWE11bHRpcGxpY2F0aXZlRXhwcmVzc2lvbl9fR3JvdXBfMV8wXzBfXzAgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMjQ2ODoyOiAoIHJ1bGVfX1hNdWx0aXBsaWNhdGl2ZUV4cHJlc3Npb25fX0dyb3VwXzFfMF8wX18wICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEzODA1OjE6ICggKCBydWxlX19YTXVsdGlwbGljYXRpdmVFeHByZXNzaW9uX19Hcm91cF8xXzBfMF9fMCApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEzODA2OjI6ICggcnVsZV9fWE11bHRpcGxpY2F0aXZlRXhwcmVzc2lvbl9fR3JvdXBfMV8wXzBfXzAgKQogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYTXVsdGlwbGljYXRpdmVFeHByZXNzaW9uQWNjZXNzKCkuZ2V0R3JvdXBfMV8wXzAoKSk7IAogICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTI0Njk6MjogKCBydWxlX19YTXVsdGlwbGljYXRpdmVFeHByZXNzaW9uX19Hcm91cF8xXzBfMF9fMCApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMjQ2OTozOiBydWxlX19YTXVsdGlwbGljYXRpdmVFeHByZXNzaW9uX19Hcm91cF8xXzBfMF9fMAorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTM4MDc6MjogKCBydWxlX19YTXVsdGlwbGljYXRpdmVFeHByZXNzaW9uX19Hcm91cF8xXzBfMF9fMCApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMzgwNzozOiBydWxlX19YTXVsdGlwbGljYXRpdmVFeHByZXNzaW9uX19Hcm91cF8xXzBfMF9fMAogICAgICAgICAgICAgewogICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMik7CiAgICAgICAgICAgICBydWxlX19YTXVsdGlwbGljYXRpdmVFeHByZXNzaW9uX19Hcm91cF8xXzBfMF9fMCgpOwpAQCAtNDE4MDksMTYgKzQ2MjY2LDE2IEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fWE11bHRpcGxpY2F0aXZlRXhwcmVzc2lvbl9fR3JvdXBfMV8wXzBfXzAiCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTI0Nzg6MTogcnVsZV9fWE11bHRpcGxpY2F0aXZlRXhwcmVzc2lvbl9fR3JvdXBfMV8wXzBfXzAgOiBydWxlX19YTXVsdGlwbGljYXRpdmVFeHByZXNzaW9uX19Hcm91cF8xXzBfMF9fMF9fSW1wbCBydWxlX19YTXVsdGlwbGljYXRpdmVFeHByZXNzaW9uX19Hcm91cF8xXzBfMF9fMSA7CisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTM4MTY6MTogcnVsZV9fWE11bHRpcGxpY2F0aXZlRXhwcmVzc2lvbl9fR3JvdXBfMV8wXzBfXzAgOiBydWxlX19YTXVsdGlwbGljYXRpdmVFeHByZXNzaW9uX19Hcm91cF8xXzBfMF9fMF9fSW1wbCBydWxlX19YTXVsdGlwbGljYXRpdmVFeHByZXNzaW9uX19Hcm91cF8xXzBfMF9fMSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fWE11bHRpcGxpY2F0aXZlRXhwcmVzc2lvbl9fR3JvdXBfMV8wXzBfXzAoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTI0ODI6MTogKCBydWxlX19YTXVsdGlwbGljYXRpdmVFeHByZXNzaW9uX19Hcm91cF8xXzBfMF9fMF9fSW1wbCBydWxlX19YTXVsdGlwbGljYXRpdmVFeHByZXNzaW9uX19Hcm91cF8xXzBfMF9fMSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMjQ4MzoyOiBydWxlX19YTXVsdGlwbGljYXRpdmVFeHByZXNzaW9uX19Hcm91cF8xXzBfMF9fMF9fSW1wbCBydWxlX19YTXVsdGlwbGljYXRpdmVFeHByZXNzaW9uX19Hcm91cF8xXzBfMF9fMQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTM4MjA6MTogKCBydWxlX19YTXVsdGlwbGljYXRpdmVFeHByZXNzaW9uX19Hcm91cF8xXzBfMF9fMF9fSW1wbCBydWxlX19YTXVsdGlwbGljYXRpdmVFeHByZXNzaW9uX19Hcm91cF8xXzBfMF9fMSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMzgyMToyOiBydWxlX19YTXVsdGlwbGljYXRpdmVFeHByZXNzaW9uX19Hcm91cF8xXzBfMF9fMF9fSW1wbCBydWxlX19YTXVsdGlwbGljYXRpdmVFeHByZXNzaW9uX19Hcm91cF8xXzBfMF9fMQogICAgICAgICAgICAgewotICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMTAwKTsKKyAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzEwOCk7CiAgICAgICAgICAgICBydWxlX19YTXVsdGlwbGljYXRpdmVFeHByZXNzaW9uX19Hcm91cF8xXzBfMF9fMF9fSW1wbCgpOwogCiAgICAgICAgICAgICBzdGF0ZS5fZnNwLS07CkBAIC00MTg0NywyMyArNDYzMDQsMjMgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YTXVsdGlwbGljYXRpdmVFeHByZXNzaW9uX19Hcm91cF8xXzBfMF9fMF9fSW1wbCIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMjQ5MDoxOiBydWxlX19YTXVsdGlwbGljYXRpdmVFeHByZXNzaW9uX19Hcm91cF8xXzBfMF9fMF9fSW1wbCA6ICggKCkgKSA7CisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTM4Mjg6MTogcnVsZV9fWE11bHRpcGxpY2F0aXZlRXhwcmVzc2lvbl9fR3JvdXBfMV8wXzBfXzBfX0ltcGwgOiAoICgpICkgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1hNdWx0aXBsaWNhdGl2ZUV4cHJlc3Npb25fX0dyb3VwXzFfMF8wX18wX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEyNDk0OjE6ICggKCAoKSApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEyNDk1OjE6ICggKCkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTM4MzI6MTogKCAoICgpICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTM4MzM6MTogKCAoKSApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMjQ5NToxOiAoICgpICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEyNDk2OjI6ICgpCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMzgzMzoxOiAoICgpICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEzODM0OjI6ICgpCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhNdWx0aXBsaWNhdGl2ZUV4cHJlc3Npb25BY2Nlc3MoKS5nZXRYQmluYXJ5T3BlcmF0aW9uTGVmdE9wZXJhbmRBY3Rpb25fMV8wXzBfMCgpKTsgCiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMjQ5NzoyOiAoKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTI0OTc6MzogCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMzgzNToyOiAoKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTM4MzU6MzogCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICB9CiAKQEAgLTQxODg4LDE0ICs0NjM0NSwxNCBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX1hNdWx0aXBsaWNhdGl2ZUV4cHJlc3Npb25fX0dyb3VwXzFfMF8wX18xIgotICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEyNTA1OjE6IHJ1bGVfX1hNdWx0aXBsaWNhdGl2ZUV4cHJlc3Npb25fX0dyb3VwXzFfMF8wX18xIDogcnVsZV9fWE11bHRpcGxpY2F0aXZlRXhwcmVzc2lvbl9fR3JvdXBfMV8wXzBfXzFfX0ltcGwgOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEzODQzOjE6IHJ1bGVfX1hNdWx0aXBsaWNhdGl2ZUV4cHJlc3Npb25fX0dyb3VwXzFfMF8wX18xIDogcnVsZV9fWE11bHRpcGxpY2F0aXZlRXhwcmVzc2lvbl9fR3JvdXBfMV8wXzBfXzFfX0ltcGwgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1hNdWx0aXBsaWNhdGl2ZUV4cHJlc3Npb25fX0dyb3VwXzFfMF8wX18xKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEyNTA5OjE6ICggcnVsZV9fWE11bHRpcGxpY2F0aXZlRXhwcmVzc2lvbl9fR3JvdXBfMV8wXzBfXzFfX0ltcGwgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTI1MTA6MjogcnVsZV9fWE11bHRpcGxpY2F0aXZlRXhwcmVzc2lvbl9fR3JvdXBfMV8wXzBfXzFfX0ltcGwKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEzODQ3OjE6ICggcnVsZV9fWE11bHRpcGxpY2F0aXZlRXhwcmVzc2lvbl9fR3JvdXBfMV8wXzBfXzFfX0ltcGwgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTM4NDg6MjogcnVsZV9fWE11bHRpcGxpY2F0aXZlRXhwcmVzc2lvbl9fR3JvdXBfMV8wXzBfXzFfX0ltcGwKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzIpOwogICAgICAgICAgICAgcnVsZV9fWE11bHRpcGxpY2F0aXZlRXhwcmVzc2lvbl9fR3JvdXBfMV8wXzBfXzFfX0ltcGwoKTsKQEAgLTQxOTIxLDIzICs0NjM3OCwyMyBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX1hNdWx0aXBsaWNhdGl2ZUV4cHJlc3Npb25fX0dyb3VwXzFfMF8wX18xX19JbXBsIgotICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEyNTE2OjE6IHJ1bGVfX1hNdWx0aXBsaWNhdGl2ZUV4cHJlc3Npb25fX0dyb3VwXzFfMF8wX18xX19JbXBsIDogKCAoIHJ1bGVfX1hNdWx0aXBsaWNhdGl2ZUV4cHJlc3Npb25fX0ZlYXR1cmVBc3NpZ25tZW50XzFfMF8wXzEgKSApIDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMzg1NDoxOiBydWxlX19YTXVsdGlwbGljYXRpdmVFeHByZXNzaW9uX19Hcm91cF8xXzBfMF9fMV9fSW1wbCA6ICggKCBydWxlX19YTXVsdGlwbGljYXRpdmVFeHByZXNzaW9uX19GZWF0dXJlQXNzaWdubWVudF8xXzBfMF8xICkgKSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fWE11bHRpcGxpY2F0aXZlRXhwcmVzc2lvbl9fR3JvdXBfMV8wXzBfXzFfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTI1MjA6MTogKCAoICggcnVsZV9fWE11bHRpcGxpY2F0aXZlRXhwcmVzc2lvbl9fRmVhdHVyZUFzc2lnbm1lbnRfMV8wXzBfMSApICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTI1MjE6MTogKCAoIHJ1bGVfX1hNdWx0aXBsaWNhdGl2ZUV4cHJlc3Npb25fX0ZlYXR1cmVBc3NpZ25tZW50XzFfMF8wXzEgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMzg1ODoxOiAoICggKCBydWxlX19YTXVsdGlwbGljYXRpdmVFeHByZXNzaW9uX19GZWF0dXJlQXNzaWdubWVudF8xXzBfMF8xICkgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMzg1OToxOiAoICggcnVsZV9fWE11bHRpcGxpY2F0aXZlRXhwcmVzc2lvbl9fRmVhdHVyZUFzc2lnbm1lbnRfMV8wXzBfMSApICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEyNTIxOjE6ICggKCBydWxlX19YTXVsdGlwbGljYXRpdmVFeHByZXNzaW9uX19GZWF0dXJlQXNzaWdubWVudF8xXzBfMF8xICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTI1MjI6MjogKCBydWxlX19YTXVsdGlwbGljYXRpdmVFeHByZXNzaW9uX19GZWF0dXJlQXNzaWdubWVudF8xXzBfMF8xICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEzODU5OjE6ICggKCBydWxlX19YTXVsdGlwbGljYXRpdmVFeHByZXNzaW9uX19GZWF0dXJlQXNzaWdubWVudF8xXzBfMF8xICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTM4NjA6MjogKCBydWxlX19YTXVsdGlwbGljYXRpdmVFeHByZXNzaW9uX19GZWF0dXJlQXNzaWdubWVudF8xXzBfMF8xICkKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WE11bHRpcGxpY2F0aXZlRXhwcmVzc2lvbkFjY2VzcygpLmdldEZlYXR1cmVBc3NpZ25tZW50XzFfMF8wXzEoKSk7IAogICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTI1MjM6MjogKCBydWxlX19YTXVsdGlwbGljYXRpdmVFeHByZXNzaW9uX19GZWF0dXJlQXNzaWdubWVudF8xXzBfMF8xICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEyNTIzOjM6IHJ1bGVfX1hNdWx0aXBsaWNhdGl2ZUV4cHJlc3Npb25fX0ZlYXR1cmVBc3NpZ25tZW50XzFfMF8wXzEKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEzODYxOjI6ICggcnVsZV9fWE11bHRpcGxpY2F0aXZlRXhwcmVzc2lvbl9fRmVhdHVyZUFzc2lnbm1lbnRfMV8wXzBfMSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMzg2MTozOiBydWxlX19YTXVsdGlwbGljYXRpdmVFeHByZXNzaW9uX19GZWF0dXJlQXNzaWdubWVudF8xXzBfMF8xCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV18yKTsKICAgICAgICAgICAgIHJ1bGVfX1hNdWx0aXBsaWNhdGl2ZUV4cHJlc3Npb25fX0ZlYXR1cmVBc3NpZ25tZW50XzFfMF8wXzEoKTsKQEAgLTQxOTcyLDE2ICs0NjQyOSwxNiBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX1hVbmFyeU9wZXJhdGlvbl9fR3JvdXBfMF9fMCIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMjUzMjoxOiBydWxlX19YVW5hcnlPcGVyYXRpb25fX0dyb3VwXzBfXzAgOiBydWxlX19YVW5hcnlPcGVyYXRpb25fX0dyb3VwXzBfXzBfX0ltcGwgcnVsZV9fWFVuYXJ5T3BlcmF0aW9uX19Hcm91cF8wX18xIDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMzg3MDoxOiBydWxlX19YVW5hcnlPcGVyYXRpb25fX0dyb3VwXzBfXzAgOiBydWxlX19YVW5hcnlPcGVyYXRpb25fX0dyb3VwXzBfXzBfX0ltcGwgcnVsZV9fWFVuYXJ5T3BlcmF0aW9uX19Hcm91cF8wX18xIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YVW5hcnlPcGVyYXRpb25fX0dyb3VwXzBfXzAoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTI1MzY6MTogKCBydWxlX19YVW5hcnlPcGVyYXRpb25fX0dyb3VwXzBfXzBfX0ltcGwgcnVsZV9fWFVuYXJ5T3BlcmF0aW9uX19Hcm91cF8wX18xICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEyNTM3OjI6IHJ1bGVfX1hVbmFyeU9wZXJhdGlvbl9fR3JvdXBfMF9fMF9fSW1wbCBydWxlX19YVW5hcnlPcGVyYXRpb25fX0dyb3VwXzBfXzEKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEzODc0OjE6ICggcnVsZV9fWFVuYXJ5T3BlcmF0aW9uX19Hcm91cF8wX18wX19JbXBsIHJ1bGVfX1hVbmFyeU9wZXJhdGlvbl9fR3JvdXBfMF9fMSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMzg3NToyOiBydWxlX19YVW5hcnlPcGVyYXRpb25fX0dyb3VwXzBfXzBfX0ltcGwgcnVsZV9fWFVuYXJ5T3BlcmF0aW9uX19Hcm91cF8wX18xCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV18xMDIpOworICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMTEwKTsKICAgICAgICAgICAgIHJ1bGVfX1hVbmFyeU9wZXJhdGlvbl9fR3JvdXBfMF9fMF9fSW1wbCgpOwogCiAgICAgICAgICAgICBzdGF0ZS5fZnNwLS07CkBAIC00MjAxMCwyMyArNDY0NjcsMjMgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YVW5hcnlPcGVyYXRpb25fX0dyb3VwXzBfXzBfX0ltcGwiCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTI1NDQ6MTogcnVsZV9fWFVuYXJ5T3BlcmF0aW9uX19Hcm91cF8wX18wX19JbXBsIDogKCAoKSApIDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMzg4MjoxOiBydWxlX19YVW5hcnlPcGVyYXRpb25fX0dyb3VwXzBfXzBfX0ltcGwgOiAoICgpICkgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1hVbmFyeU9wZXJhdGlvbl9fR3JvdXBfMF9fMF9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMjU0ODoxOiAoICggKCkgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMjU0OToxOiAoICgpICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEzODg2OjE6ICggKCAoKSApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEzODg3OjE6ICggKCkgKQogICAgICAgICAgICAgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTI1NDk6MTogKCAoKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMjU1MDoyOiAoKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTM4ODc6MTogKCAoKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMzg4ODoyOiAoKQogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYVW5hcnlPcGVyYXRpb25BY2Nlc3MoKS5nZXRYVW5hcnlPcGVyYXRpb25BY3Rpb25fMF8wKCkpOyAKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEyNTUxOjI6ICgpCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMjU1MTozOiAKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEzODg5OjI6ICgpCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMzg4OTozOiAKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIH0KIApAQCAtNDIwNTEsMTYgKzQ2NTA4LDE2IEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fWFVuYXJ5T3BlcmF0aW9uX19Hcm91cF8wX18xIgotICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEyNTU5OjE6IHJ1bGVfX1hVbmFyeU9wZXJhdGlvbl9fR3JvdXBfMF9fMSA6IHJ1bGVfX1hVbmFyeU9wZXJhdGlvbl9fR3JvdXBfMF9fMV9fSW1wbCBydWxlX19YVW5hcnlPcGVyYXRpb25fX0dyb3VwXzBfXzIgOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEzODk3OjE6IHJ1bGVfX1hVbmFyeU9wZXJhdGlvbl9fR3JvdXBfMF9fMSA6IHJ1bGVfX1hVbmFyeU9wZXJhdGlvbl9fR3JvdXBfMF9fMV9fSW1wbCBydWxlX19YVW5hcnlPcGVyYXRpb25fX0dyb3VwXzBfXzIgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1hVbmFyeU9wZXJhdGlvbl9fR3JvdXBfMF9fMSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMjU2MzoxOiAoIHJ1bGVfX1hVbmFyeU9wZXJhdGlvbl9fR3JvdXBfMF9fMV9fSW1wbCBydWxlX19YVW5hcnlPcGVyYXRpb25fX0dyb3VwXzBfXzIgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTI1NjQ6MjogcnVsZV9fWFVuYXJ5T3BlcmF0aW9uX19Hcm91cF8wX18xX19JbXBsIHJ1bGVfX1hVbmFyeU9wZXJhdGlvbl9fR3JvdXBfMF9fMgorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTM5MDE6MTogKCBydWxlX19YVW5hcnlPcGVyYXRpb25fX0dyb3VwXzBfXzFfX0ltcGwgcnVsZV9fWFVuYXJ5T3BlcmF0aW9uX19Hcm91cF8wX18yICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEzOTAyOjI6IHJ1bGVfX1hVbmFyeU9wZXJhdGlvbl9fR3JvdXBfMF9fMV9fSW1wbCBydWxlX19YVW5hcnlPcGVyYXRpb25fX0dyb3VwXzBfXzIKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzc0KTsKKyAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzgyKTsKICAgICAgICAgICAgIHJ1bGVfX1hVbmFyeU9wZXJhdGlvbl9fR3JvdXBfMF9fMV9fSW1wbCgpOwogCiAgICAgICAgICAgICBzdGF0ZS5fZnNwLS07CkBAIC00MjA4OSwyMyArNDY1NDYsMjMgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YVW5hcnlPcGVyYXRpb25fX0dyb3VwXzBfXzFfX0ltcGwiCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTI1NzE6MTogcnVsZV9fWFVuYXJ5T3BlcmF0aW9uX19Hcm91cF8wX18xX19JbXBsIDogKCAoIHJ1bGVfX1hVbmFyeU9wZXJhdGlvbl9fRmVhdHVyZUFzc2lnbm1lbnRfMF8xICkgKSA7CisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTM5MDk6MTogcnVsZV9fWFVuYXJ5T3BlcmF0aW9uX19Hcm91cF8wX18xX19JbXBsIDogKCAoIHJ1bGVfX1hVbmFyeU9wZXJhdGlvbl9fRmVhdHVyZUFzc2lnbm1lbnRfMF8xICkgKSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fWFVuYXJ5T3BlcmF0aW9uX19Hcm91cF8wX18xX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEyNTc1OjE6ICggKCAoIHJ1bGVfX1hVbmFyeU9wZXJhdGlvbl9fRmVhdHVyZUFzc2lnbm1lbnRfMF8xICkgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMjU3NjoxOiAoICggcnVsZV9fWFVuYXJ5T3BlcmF0aW9uX19GZWF0dXJlQXNzaWdubWVudF8wXzEgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMzkxMzoxOiAoICggKCBydWxlX19YVW5hcnlPcGVyYXRpb25fX0ZlYXR1cmVBc3NpZ25tZW50XzBfMSApICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTM5MTQ6MTogKCAoIHJ1bGVfX1hVbmFyeU9wZXJhdGlvbl9fRmVhdHVyZUFzc2lnbm1lbnRfMF8xICkgKQogICAgICAgICAgICAgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTI1NzY6MTogKCAoIHJ1bGVfX1hVbmFyeU9wZXJhdGlvbl9fRmVhdHVyZUFzc2lnbm1lbnRfMF8xICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTI1Nzc6MjogKCBydWxlX19YVW5hcnlPcGVyYXRpb25fX0ZlYXR1cmVBc3NpZ25tZW50XzBfMSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMzkxNDoxOiAoICggcnVsZV9fWFVuYXJ5T3BlcmF0aW9uX19GZWF0dXJlQXNzaWdubWVudF8wXzEgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMzkxNToyOiAoIHJ1bGVfX1hVbmFyeU9wZXJhdGlvbl9fRmVhdHVyZUFzc2lnbm1lbnRfMF8xICkKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WFVuYXJ5T3BlcmF0aW9uQWNjZXNzKCkuZ2V0RmVhdHVyZUFzc2lnbm1lbnRfMF8xKCkpOyAKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEyNTc4OjI6ICggcnVsZV9fWFVuYXJ5T3BlcmF0aW9uX19GZWF0dXJlQXNzaWdubWVudF8wXzEgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTI1Nzg6MzogcnVsZV9fWFVuYXJ5T3BlcmF0aW9uX19GZWF0dXJlQXNzaWdubWVudF8wXzEKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEzOTE2OjI6ICggcnVsZV9fWFVuYXJ5T3BlcmF0aW9uX19GZWF0dXJlQXNzaWdubWVudF8wXzEgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTM5MTY6MzogcnVsZV9fWFVuYXJ5T3BlcmF0aW9uX19GZWF0dXJlQXNzaWdubWVudF8wXzEKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzIpOwogICAgICAgICAgICAgcnVsZV9fWFVuYXJ5T3BlcmF0aW9uX19GZWF0dXJlQXNzaWdubWVudF8wXzEoKTsKQEAgLTQyMTQwLDE0ICs0NjU5NywxNCBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX1hVbmFyeU9wZXJhdGlvbl9fR3JvdXBfMF9fMiIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMjU4NjoxOiBydWxlX19YVW5hcnlPcGVyYXRpb25fX0dyb3VwXzBfXzIgOiBydWxlX19YVW5hcnlPcGVyYXRpb25fX0dyb3VwXzBfXzJfX0ltcGwgOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEzOTI0OjE6IHJ1bGVfX1hVbmFyeU9wZXJhdGlvbl9fR3JvdXBfMF9fMiA6IHJ1bGVfX1hVbmFyeU9wZXJhdGlvbl9fR3JvdXBfMF9fMl9fSW1wbCA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fWFVuYXJ5T3BlcmF0aW9uX19Hcm91cF8wX18yKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEyNTkwOjE6ICggcnVsZV9fWFVuYXJ5T3BlcmF0aW9uX19Hcm91cF8wX18yX19JbXBsICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEyNTkxOjI6IHJ1bGVfX1hVbmFyeU9wZXJhdGlvbl9fR3JvdXBfMF9fMl9fSW1wbAorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTM5Mjg6MTogKCBydWxlX19YVW5hcnlPcGVyYXRpb25fX0dyb3VwXzBfXzJfX0ltcGwgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTM5Mjk6MjogcnVsZV9fWFVuYXJ5T3BlcmF0aW9uX19Hcm91cF8wX18yX19JbXBsCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV18yKTsKICAgICAgICAgICAgIHJ1bGVfX1hVbmFyeU9wZXJhdGlvbl9fR3JvdXBfMF9fMl9fSW1wbCgpOwpAQCAtNDIxNzMsMjMgKzQ2NjMwLDIzIEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fWFVuYXJ5T3BlcmF0aW9uX19Hcm91cF8wX18yX19JbXBsIgotICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEyNTk3OjE6IHJ1bGVfX1hVbmFyeU9wZXJhdGlvbl9fR3JvdXBfMF9fMl9fSW1wbCA6ICggKCBydWxlX19YVW5hcnlPcGVyYXRpb25fX09wZXJhbmRBc3NpZ25tZW50XzBfMiApICkgOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEzOTM1OjE6IHJ1bGVfX1hVbmFyeU9wZXJhdGlvbl9fR3JvdXBfMF9fMl9fSW1wbCA6ICggKCBydWxlX19YVW5hcnlPcGVyYXRpb25fX09wZXJhbmRBc3NpZ25tZW50XzBfMiApICkgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1hVbmFyeU9wZXJhdGlvbl9fR3JvdXBfMF9fMl9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMjYwMToxOiAoICggKCBydWxlX19YVW5hcnlPcGVyYXRpb25fX09wZXJhbmRBc3NpZ25tZW50XzBfMiApICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTI2MDI6MTogKCAoIHJ1bGVfX1hVbmFyeU9wZXJhdGlvbl9fT3BlcmFuZEFzc2lnbm1lbnRfMF8yICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTM5Mzk6MTogKCAoICggcnVsZV9fWFVuYXJ5T3BlcmF0aW9uX19PcGVyYW5kQXNzaWdubWVudF8wXzIgKSApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEzOTQwOjE6ICggKCBydWxlX19YVW5hcnlPcGVyYXRpb25fX09wZXJhbmRBc3NpZ25tZW50XzBfMiApICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEyNjAyOjE6ICggKCBydWxlX19YVW5hcnlPcGVyYXRpb25fX09wZXJhbmRBc3NpZ25tZW50XzBfMiApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEyNjAzOjI6ICggcnVsZV9fWFVuYXJ5T3BlcmF0aW9uX19PcGVyYW5kQXNzaWdubWVudF8wXzIgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTM5NDA6MTogKCAoIHJ1bGVfX1hVbmFyeU9wZXJhdGlvbl9fT3BlcmFuZEFzc2lnbm1lbnRfMF8yICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTM5NDE6MjogKCBydWxlX19YVW5hcnlPcGVyYXRpb25fX09wZXJhbmRBc3NpZ25tZW50XzBfMiApCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhVbmFyeU9wZXJhdGlvbkFjY2VzcygpLmdldE9wZXJhbmRBc3NpZ25tZW50XzBfMigpKTsgCiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMjYwNDoyOiAoIHJ1bGVfX1hVbmFyeU9wZXJhdGlvbl9fT3BlcmFuZEFzc2lnbm1lbnRfMF8yICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEyNjA0OjM6IHJ1bGVfX1hVbmFyeU9wZXJhdGlvbl9fT3BlcmFuZEFzc2lnbm1lbnRfMF8yCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMzk0MjoyOiAoIHJ1bGVfX1hVbmFyeU9wZXJhdGlvbl9fT3BlcmFuZEFzc2lnbm1lbnRfMF8yICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEzOTQyOjM6IHJ1bGVfX1hVbmFyeU9wZXJhdGlvbl9fT3BlcmFuZEFzc2lnbm1lbnRfMF8yCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV18yKTsKICAgICAgICAgICAgIHJ1bGVfX1hVbmFyeU9wZXJhdGlvbl9fT3BlcmFuZEFzc2lnbm1lbnRfMF8yKCk7CkBAIC00MjIyNCwxNiArNDY2ODEsMTYgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YQ2FzdGVkRXhwcmVzc2lvbl9fR3JvdXBfXzAiCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTI2MTM6MTogcnVsZV9fWENhc3RlZEV4cHJlc3Npb25fX0dyb3VwX18wIDogcnVsZV9fWENhc3RlZEV4cHJlc3Npb25fX0dyb3VwX18wX19JbXBsIHJ1bGVfX1hDYXN0ZWRFeHByZXNzaW9uX19Hcm91cF9fMSA7CisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTM5NTE6MTogcnVsZV9fWENhc3RlZEV4cHJlc3Npb25fX0dyb3VwX18wIDogcnVsZV9fWENhc3RlZEV4cHJlc3Npb25fX0dyb3VwX18wX19JbXBsIHJ1bGVfX1hDYXN0ZWRFeHByZXNzaW9uX19Hcm91cF9fMSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fWENhc3RlZEV4cHJlc3Npb25fX0dyb3VwX18wKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEyNjE3OjE6ICggcnVsZV9fWENhc3RlZEV4cHJlc3Npb25fX0dyb3VwX18wX19JbXBsIHJ1bGVfX1hDYXN0ZWRFeHByZXNzaW9uX19Hcm91cF9fMSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMjYxODoyOiBydWxlX19YQ2FzdGVkRXhwcmVzc2lvbl9fR3JvdXBfXzBfX0ltcGwgcnVsZV9fWENhc3RlZEV4cHJlc3Npb25fX0dyb3VwX18xCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMzk1NToxOiAoIHJ1bGVfX1hDYXN0ZWRFeHByZXNzaW9uX19Hcm91cF9fMF9fSW1wbCBydWxlX19YQ2FzdGVkRXhwcmVzc2lvbl9fR3JvdXBfXzEgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTM5NTY6MjogcnVsZV9fWENhc3RlZEV4cHJlc3Npb25fX0dyb3VwX18wX19JbXBsIHJ1bGVfX1hDYXN0ZWRFeHByZXNzaW9uX19Hcm91cF9fMQogICAgICAgICAgICAgewotICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfNTUpOworICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfNjMpOwogICAgICAgICAgICAgcnVsZV9fWENhc3RlZEV4cHJlc3Npb25fX0dyb3VwX18wX19JbXBsKCk7CiAKICAgICAgICAgICAgIHN0YXRlLl9mc3AtLTsKQEAgLTQyMjYyLDE3ICs0NjcxOSwxNyBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX1hDYXN0ZWRFeHByZXNzaW9uX19Hcm91cF9fMF9fSW1wbCIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMjYyNToxOiBydWxlX19YQ2FzdGVkRXhwcmVzc2lvbl9fR3JvdXBfXzBfX0ltcGwgOiAoIHJ1bGVYUG9zdGZpeE9wZXJhdGlvbiApIDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMzk2MzoxOiBydWxlX19YQ2FzdGVkRXhwcmVzc2lvbl9fR3JvdXBfXzBfX0ltcGwgOiAoIHJ1bGVYUG9zdGZpeE9wZXJhdGlvbiApIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YQ2FzdGVkRXhwcmVzc2lvbl9fR3JvdXBfXzBfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTI2Mjk6MTogKCAoIHJ1bGVYUG9zdGZpeE9wZXJhdGlvbiApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEyNjMwOjE6ICggcnVsZVhQb3N0Zml4T3BlcmF0aW9uICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEzOTY3OjE6ICggKCBydWxlWFBvc3RmaXhPcGVyYXRpb24gKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMzk2ODoxOiAoIHJ1bGVYUG9zdGZpeE9wZXJhdGlvbiApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMjYzMDoxOiAoIHJ1bGVYUG9zdGZpeE9wZXJhdGlvbiApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMjYzMToyOiBydWxlWFBvc3RmaXhPcGVyYXRpb24KKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEzOTY4OjE6ICggcnVsZVhQb3N0Zml4T3BlcmF0aW9uICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEzOTY5OjI6IHJ1bGVYUG9zdGZpeE9wZXJhdGlvbgogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYQ2FzdGVkRXhwcmVzc2lvbkFjY2VzcygpLmdldFhQb3N0Zml4T3BlcmF0aW9uUGFyc2VyUnVsZUNhbGxfMCgpKTsgCkBAIC00MjMwNywxNCArNDY3NjQsMTQgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YQ2FzdGVkRXhwcmVzc2lvbl9fR3JvdXBfXzEiCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTI2NDA6MTogcnVsZV9fWENhc3RlZEV4cHJlc3Npb25fX0dyb3VwX18xIDogcnVsZV9fWENhc3RlZEV4cHJlc3Npb25fX0dyb3VwX18xX19JbXBsIDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMzk3ODoxOiBydWxlX19YQ2FzdGVkRXhwcmVzc2lvbl9fR3JvdXBfXzEgOiBydWxlX19YQ2FzdGVkRXhwcmVzc2lvbl9fR3JvdXBfXzFfX0ltcGwgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1hDYXN0ZWRFeHByZXNzaW9uX19Hcm91cF9fMSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMjY0NDoxOiAoIHJ1bGVfX1hDYXN0ZWRFeHByZXNzaW9uX19Hcm91cF9fMV9fSW1wbCApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMjY0NToyOiBydWxlX19YQ2FzdGVkRXhwcmVzc2lvbl9fR3JvdXBfXzFfX0ltcGwKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEzOTgyOjE6ICggcnVsZV9fWENhc3RlZEV4cHJlc3Npb25fX0dyb3VwX18xX19JbXBsICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEzOTgzOjI6IHJ1bGVfX1hDYXN0ZWRFeHByZXNzaW9uX19Hcm91cF9fMV9fSW1wbAogICAgICAgICAgICAgewogICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMik7CiAgICAgICAgICAgICBydWxlX19YQ2FzdGVkRXhwcmVzc2lvbl9fR3JvdXBfXzFfX0ltcGwoKTsKQEAgLTQyMzQwLDQzICs0Njc5Nyw0MyBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX1hDYXN0ZWRFeHByZXNzaW9uX19Hcm91cF9fMV9fSW1wbCIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMjY1MToxOiBydWxlX19YQ2FzdGVkRXhwcmVzc2lvbl9fR3JvdXBfXzFfX0ltcGwgOiAoICggcnVsZV9fWENhc3RlZEV4cHJlc3Npb25fX0dyb3VwXzFfXzAgKSogKSA7CisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTM5ODk6MTogcnVsZV9fWENhc3RlZEV4cHJlc3Npb25fX0dyb3VwX18xX19JbXBsIDogKCAoIHJ1bGVfX1hDYXN0ZWRFeHByZXNzaW9uX19Hcm91cF8xX18wICkqICkgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1hDYXN0ZWRFeHByZXNzaW9uX19Hcm91cF9fMV9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMjY1NToxOiAoICggKCBydWxlX19YQ2FzdGVkRXhwcmVzc2lvbl9fR3JvdXBfMV9fMCApKiApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEyNjU2OjE6ICggKCBydWxlX19YQ2FzdGVkRXhwcmVzc2lvbl9fR3JvdXBfMV9fMCApKiApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMzk5MzoxOiAoICggKCBydWxlX19YQ2FzdGVkRXhwcmVzc2lvbl9fR3JvdXBfMV9fMCApKiApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEzOTk0OjE6ICggKCBydWxlX19YQ2FzdGVkRXhwcmVzc2lvbl9fR3JvdXBfMV9fMCApKiApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMjY1NjoxOiAoICggcnVsZV9fWENhc3RlZEV4cHJlc3Npb25fX0dyb3VwXzFfXzAgKSogKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTI2NTc6MjogKCBydWxlX19YQ2FzdGVkRXhwcmVzc2lvbl9fR3JvdXBfMV9fMCApKgorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTM5OTQ6MTogKCAoIHJ1bGVfX1hDYXN0ZWRFeHByZXNzaW9uX19Hcm91cF8xX18wICkqICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEzOTk1OjI6ICggcnVsZV9fWENhc3RlZEV4cHJlc3Npb25fX0dyb3VwXzFfXzAgKSoKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WENhc3RlZEV4cHJlc3Npb25BY2Nlc3MoKS5nZXRHcm91cF8xKCkpOyAKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEyNjU4OjI6ICggcnVsZV9fWENhc3RlZEV4cHJlc3Npb25fX0dyb3VwXzFfXzAgKSoKLSAgICAgICAgICAgIGxvb3AxMDQ6CisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMzk5NjoyOiAoIHJ1bGVfX1hDYXN0ZWRFeHByZXNzaW9uX19Hcm91cF8xX18wICkqCisgICAgICAgICAgICBsb29wMTE3OgogICAgICAgICAgICAgZG8gewotICAgICAgICAgICAgICAgIGludCBhbHQxMDQ9MjsKLSAgICAgICAgICAgICAgICBpbnQgTEExMDRfMCA9IGlucHV0LkxBKDEpOworICAgICAgICAgICAgICAgIGludCBhbHQxMTc9MjsKKyAgICAgICAgICAgICAgICBpbnQgTEExMTdfMCA9IGlucHV0LkxBKDEpOwogCi0gICAgICAgICAgICAgICAgaWYgKCAoTEExMDRfMD09MTA2KSApIHsKLSAgICAgICAgICAgICAgICAgICAgaW50IExBMTA0XzIgPSBpbnB1dC5MQSgyKTsKKyAgICAgICAgICAgICAgICBpZiAoIChMQTExN18wPT0xMTYpICkgeworICAgICAgICAgICAgICAgICAgICBpbnQgTEExMTdfMiA9IGlucHV0LkxBKDIpOwogCi0gICAgICAgICAgICAgICAgICAgIGlmICggKHN5bnByZWQxNThfSW50ZXJuYWxEYXRhRFNMKCkpICkgewotICAgICAgICAgICAgICAgICAgICAgICAgYWx0MTA0PTE7CisgICAgICAgICAgICAgICAgICAgIGlmICggKHN5bnByZWQxNzdfSW50ZXJuYWxEYXRhRFNMKCkpICkgeworICAgICAgICAgICAgICAgICAgICAgICAgYWx0MTE3PTE7CiAgICAgICAgICAgICAgICAgICAgIH0KIAogCiAgICAgICAgICAgICAgICAgfQogCiAKLSAgICAgICAgICAgICAgICBzd2l0Y2ggKGFsdDEwNCkgeworICAgICAgICAgICAgICAgIHN3aXRjaCAoYWx0MTE3KSB7CiAgICAgICAgICAgICAJY2FzZSAxIDoKLSAgICAgICAgICAgIAkgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTI2NTg6MzogcnVsZV9fWENhc3RlZEV4cHJlc3Npb25fX0dyb3VwXzFfXzAKKyAgICAgICAgICAgIAkgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTM5OTY6MzogcnVsZV9fWENhc3RlZEV4cHJlc3Npb25fX0dyb3VwXzFfXzAKICAgICAgICAgICAgIAkgICAgewotICAgICAgICAgICAgCSAgICBwdXNoRm9sbG93KEZPTExPV18xMDMpOworICAgICAgICAgICAgCSAgICBwdXNoRm9sbG93KEZPTExPV18xMTEpOwogICAgICAgICAgICAgCSAgICBydWxlX19YQ2FzdGVkRXhwcmVzc2lvbl9fR3JvdXBfMV9fMCgpOwogCiAgICAgICAgICAgICAJICAgIHN0YXRlLl9mc3AtLTsKQEAgLTQyMzg2LDcgKzQ2ODQzLDcgQEAKICAgICAgICAgICAgIAkgICAgYnJlYWs7CiAKICAgICAgICAgICAgIAlkZWZhdWx0IDoKLSAgICAgICAgICAgIAkgICAgYnJlYWsgbG9vcDEwNDsKKyAgICAgICAgICAgIAkgICAgYnJlYWsgbG9vcDExNzsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9IHdoaWxlICh0cnVlKTsKIApAQCAtNDI0MTUsMTYgKzQ2ODcyLDE2IEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fWENhc3RlZEV4cHJlc3Npb25fX0dyb3VwXzFfXzAiCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTI2Njc6MTogcnVsZV9fWENhc3RlZEV4cHJlc3Npb25fX0dyb3VwXzFfXzAgOiBydWxlX19YQ2FzdGVkRXhwcmVzc2lvbl9fR3JvdXBfMV9fMF9fSW1wbCBydWxlX19YQ2FzdGVkRXhwcmVzc2lvbl9fR3JvdXBfMV9fMSA7CisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTQwMDU6MTogcnVsZV9fWENhc3RlZEV4cHJlc3Npb25fX0dyb3VwXzFfXzAgOiBydWxlX19YQ2FzdGVkRXhwcmVzc2lvbl9fR3JvdXBfMV9fMF9fSW1wbCBydWxlX19YQ2FzdGVkRXhwcmVzc2lvbl9fR3JvdXBfMV9fMSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fWENhc3RlZEV4cHJlc3Npb25fX0dyb3VwXzFfXzAoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTI2NzE6MTogKCBydWxlX19YQ2FzdGVkRXhwcmVzc2lvbl9fR3JvdXBfMV9fMF9fSW1wbCBydWxlX19YQ2FzdGVkRXhwcmVzc2lvbl9fR3JvdXBfMV9fMSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMjY3MjoyOiBydWxlX19YQ2FzdGVkRXhwcmVzc2lvbl9fR3JvdXBfMV9fMF9fSW1wbCBydWxlX19YQ2FzdGVkRXhwcmVzc2lvbl9fR3JvdXBfMV9fMQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTQwMDk6MTogKCBydWxlX19YQ2FzdGVkRXhwcmVzc2lvbl9fR3JvdXBfMV9fMF9fSW1wbCBydWxlX19YQ2FzdGVkRXhwcmVzc2lvbl9fR3JvdXBfMV9fMSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNDAxMDoyOiBydWxlX19YQ2FzdGVkRXhwcmVzc2lvbl9fR3JvdXBfMV9fMF9fSW1wbCBydWxlX19YQ2FzdGVkRXhwcmVzc2lvbl9fR3JvdXBfMV9fMQogICAgICAgICAgICAgewotICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfOTEpOworICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfOTkpOwogICAgICAgICAgICAgcnVsZV9fWENhc3RlZEV4cHJlc3Npb25fX0dyb3VwXzFfXzBfX0ltcGwoKTsKIAogICAgICAgICAgICAgc3RhdGUuX2ZzcC0tOwpAQCAtNDI0NTMsMjMgKzQ2OTEwLDIzIEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fWENhc3RlZEV4cHJlc3Npb25fX0dyb3VwXzFfXzBfX0ltcGwiCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTI2Nzk6MTogcnVsZV9fWENhc3RlZEV4cHJlc3Npb25fX0dyb3VwXzFfXzBfX0ltcGwgOiAoICggcnVsZV9fWENhc3RlZEV4cHJlc3Npb25fX0dyb3VwXzFfMF9fMCApICkgOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE0MDE3OjE6IHJ1bGVfX1hDYXN0ZWRFeHByZXNzaW9uX19Hcm91cF8xX18wX19JbXBsIDogKCAoIHJ1bGVfX1hDYXN0ZWRFeHByZXNzaW9uX19Hcm91cF8xXzBfXzAgKSApIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YQ2FzdGVkRXhwcmVzc2lvbl9fR3JvdXBfMV9fMF9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMjY4MzoxOiAoICggKCBydWxlX19YQ2FzdGVkRXhwcmVzc2lvbl9fR3JvdXBfMV8wX18wICkgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMjY4NDoxOiAoICggcnVsZV9fWENhc3RlZEV4cHJlc3Npb25fX0dyb3VwXzFfMF9fMCApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE0MDIxOjE6ICggKCAoIHJ1bGVfX1hDYXN0ZWRFeHByZXNzaW9uX19Hcm91cF8xXzBfXzAgKSApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE0MDIyOjE6ICggKCBydWxlX19YQ2FzdGVkRXhwcmVzc2lvbl9fR3JvdXBfMV8wX18wICkgKQogICAgICAgICAgICAgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTI2ODQ6MTogKCAoIHJ1bGVfX1hDYXN0ZWRFeHByZXNzaW9uX19Hcm91cF8xXzBfXzAgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMjY4NToyOiAoIHJ1bGVfX1hDYXN0ZWRFeHByZXNzaW9uX19Hcm91cF8xXzBfXzAgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTQwMjI6MTogKCAoIHJ1bGVfX1hDYXN0ZWRFeHByZXNzaW9uX19Hcm91cF8xXzBfXzAgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNDAyMzoyOiAoIHJ1bGVfX1hDYXN0ZWRFeHByZXNzaW9uX19Hcm91cF8xXzBfXzAgKQogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYQ2FzdGVkRXhwcmVzc2lvbkFjY2VzcygpLmdldEdyb3VwXzFfMCgpKTsgCiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMjY4NjoyOiAoIHJ1bGVfX1hDYXN0ZWRFeHByZXNzaW9uX19Hcm91cF8xXzBfXzAgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTI2ODY6MzogcnVsZV9fWENhc3RlZEV4cHJlc3Npb25fX0dyb3VwXzFfMF9fMAorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTQwMjQ6MjogKCBydWxlX19YQ2FzdGVkRXhwcmVzc2lvbl9fR3JvdXBfMV8wX18wICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE0MDI0OjM6IHJ1bGVfX1hDYXN0ZWRFeHByZXNzaW9uX19Hcm91cF8xXzBfXzAKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzIpOwogICAgICAgICAgICAgcnVsZV9fWENhc3RlZEV4cHJlc3Npb25fX0dyb3VwXzFfMF9fMCgpOwpAQCAtNDI1MDQsMTQgKzQ2OTYxLDE0IEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fWENhc3RlZEV4cHJlc3Npb25fX0dyb3VwXzFfXzEiCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTI2OTQ6MTogcnVsZV9fWENhc3RlZEV4cHJlc3Npb25fX0dyb3VwXzFfXzEgOiBydWxlX19YQ2FzdGVkRXhwcmVzc2lvbl9fR3JvdXBfMV9fMV9fSW1wbCA7CisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTQwMzI6MTogcnVsZV9fWENhc3RlZEV4cHJlc3Npb25fX0dyb3VwXzFfXzEgOiBydWxlX19YQ2FzdGVkRXhwcmVzc2lvbl9fR3JvdXBfMV9fMV9fSW1wbCA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fWENhc3RlZEV4cHJlc3Npb25fX0dyb3VwXzFfXzEoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTI2OTg6MTogKCBydWxlX19YQ2FzdGVkRXhwcmVzc2lvbl9fR3JvdXBfMV9fMV9fSW1wbCApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMjY5OToyOiBydWxlX19YQ2FzdGVkRXhwcmVzc2lvbl9fR3JvdXBfMV9fMV9fSW1wbAorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTQwMzY6MTogKCBydWxlX19YQ2FzdGVkRXhwcmVzc2lvbl9fR3JvdXBfMV9fMV9fSW1wbCApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNDAzNzoyOiBydWxlX19YQ2FzdGVkRXhwcmVzc2lvbl9fR3JvdXBfMV9fMV9fSW1wbAogICAgICAgICAgICAgewogICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMik7CiAgICAgICAgICAgICBydWxlX19YQ2FzdGVkRXhwcmVzc2lvbl9fR3JvdXBfMV9fMV9fSW1wbCgpOwpAQCAtNDI1MzcsMjMgKzQ2OTk0LDIzIEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fWENhc3RlZEV4cHJlc3Npb25fX0dyb3VwXzFfXzFfX0ltcGwiCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTI3MDU6MTogcnVsZV9fWENhc3RlZEV4cHJlc3Npb25fX0dyb3VwXzFfXzFfX0ltcGwgOiAoICggcnVsZV9fWENhc3RlZEV4cHJlc3Npb25fX1R5cGVBc3NpZ25tZW50XzFfMSApICkgOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE0MDQzOjE6IHJ1bGVfX1hDYXN0ZWRFeHByZXNzaW9uX19Hcm91cF8xX18xX19JbXBsIDogKCAoIHJ1bGVfX1hDYXN0ZWRFeHByZXNzaW9uX19UeXBlQXNzaWdubWVudF8xXzEgKSApIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YQ2FzdGVkRXhwcmVzc2lvbl9fR3JvdXBfMV9fMV9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMjcwOToxOiAoICggKCBydWxlX19YQ2FzdGVkRXhwcmVzc2lvbl9fVHlwZUFzc2lnbm1lbnRfMV8xICkgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMjcxMDoxOiAoICggcnVsZV9fWENhc3RlZEV4cHJlc3Npb25fX1R5cGVBc3NpZ25tZW50XzFfMSApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE0MDQ3OjE6ICggKCAoIHJ1bGVfX1hDYXN0ZWRFeHByZXNzaW9uX19UeXBlQXNzaWdubWVudF8xXzEgKSApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE0MDQ4OjE6ICggKCBydWxlX19YQ2FzdGVkRXhwcmVzc2lvbl9fVHlwZUFzc2lnbm1lbnRfMV8xICkgKQogICAgICAgICAgICAgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTI3MTA6MTogKCAoIHJ1bGVfX1hDYXN0ZWRFeHByZXNzaW9uX19UeXBlQXNzaWdubWVudF8xXzEgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMjcxMToyOiAoIHJ1bGVfX1hDYXN0ZWRFeHByZXNzaW9uX19UeXBlQXNzaWdubWVudF8xXzEgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTQwNDg6MTogKCAoIHJ1bGVfX1hDYXN0ZWRFeHByZXNzaW9uX19UeXBlQXNzaWdubWVudF8xXzEgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNDA0OToyOiAoIHJ1bGVfX1hDYXN0ZWRFeHByZXNzaW9uX19UeXBlQXNzaWdubWVudF8xXzEgKQogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYQ2FzdGVkRXhwcmVzc2lvbkFjY2VzcygpLmdldFR5cGVBc3NpZ25tZW50XzFfMSgpKTsgCiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMjcxMjoyOiAoIHJ1bGVfX1hDYXN0ZWRFeHByZXNzaW9uX19UeXBlQXNzaWdubWVudF8xXzEgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTI3MTI6MzogcnVsZV9fWENhc3RlZEV4cHJlc3Npb25fX1R5cGVBc3NpZ25tZW50XzFfMQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTQwNTA6MjogKCBydWxlX19YQ2FzdGVkRXhwcmVzc2lvbl9fVHlwZUFzc2lnbm1lbnRfMV8xICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE0MDUwOjM6IHJ1bGVfX1hDYXN0ZWRFeHByZXNzaW9uX19UeXBlQXNzaWdubWVudF8xXzEKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzIpOwogICAgICAgICAgICAgcnVsZV9fWENhc3RlZEV4cHJlc3Npb25fX1R5cGVBc3NpZ25tZW50XzFfMSgpOwpAQCAtNDI1ODgsMTQgKzQ3MDQ1LDE0IEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fWENhc3RlZEV4cHJlc3Npb25fX0dyb3VwXzFfMF9fMCIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMjcyMToxOiBydWxlX19YQ2FzdGVkRXhwcmVzc2lvbl9fR3JvdXBfMV8wX18wIDogcnVsZV9fWENhc3RlZEV4cHJlc3Npb25fX0dyb3VwXzFfMF9fMF9fSW1wbCA7CisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTQwNTk6MTogcnVsZV9fWENhc3RlZEV4cHJlc3Npb25fX0dyb3VwXzFfMF9fMCA6IHJ1bGVfX1hDYXN0ZWRFeHByZXNzaW9uX19Hcm91cF8xXzBfXzBfX0ltcGwgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1hDYXN0ZWRFeHByZXNzaW9uX19Hcm91cF8xXzBfXzAoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTI3MjU6MTogKCBydWxlX19YQ2FzdGVkRXhwcmVzc2lvbl9fR3JvdXBfMV8wX18wX19JbXBsICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEyNzI2OjI6IHJ1bGVfX1hDYXN0ZWRFeHByZXNzaW9uX19Hcm91cF8xXzBfXzBfX0ltcGwKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE0MDYzOjE6ICggcnVsZV9fWENhc3RlZEV4cHJlc3Npb25fX0dyb3VwXzFfMF9fMF9fSW1wbCApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNDA2NDoyOiBydWxlX19YQ2FzdGVkRXhwcmVzc2lvbl9fR3JvdXBfMV8wX18wX19JbXBsCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV18yKTsKICAgICAgICAgICAgIHJ1bGVfX1hDYXN0ZWRFeHByZXNzaW9uX19Hcm91cF8xXzBfXzBfX0ltcGwoKTsKQEAgLTQyNjIxLDIzICs0NzA3OCwyMyBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX1hDYXN0ZWRFeHByZXNzaW9uX19Hcm91cF8xXzBfXzBfX0ltcGwiCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTI3MzI6MTogcnVsZV9fWENhc3RlZEV4cHJlc3Npb25fX0dyb3VwXzFfMF9fMF9fSW1wbCA6ICggKCBydWxlX19YQ2FzdGVkRXhwcmVzc2lvbl9fR3JvdXBfMV8wXzBfXzAgKSApIDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNDA3MDoxOiBydWxlX19YQ2FzdGVkRXhwcmVzc2lvbl9fR3JvdXBfMV8wX18wX19JbXBsIDogKCAoIHJ1bGVfX1hDYXN0ZWRFeHByZXNzaW9uX19Hcm91cF8xXzBfMF9fMCApICkgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1hDYXN0ZWRFeHByZXNzaW9uX19Hcm91cF8xXzBfXzBfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTI3MzY6MTogKCAoICggcnVsZV9fWENhc3RlZEV4cHJlc3Npb25fX0dyb3VwXzFfMF8wX18wICkgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMjczNzoxOiAoICggcnVsZV9fWENhc3RlZEV4cHJlc3Npb25fX0dyb3VwXzFfMF8wX18wICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTQwNzQ6MTogKCAoICggcnVsZV9fWENhc3RlZEV4cHJlc3Npb25fX0dyb3VwXzFfMF8wX18wICkgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNDA3NToxOiAoICggcnVsZV9fWENhc3RlZEV4cHJlc3Npb25fX0dyb3VwXzFfMF8wX18wICkgKQogICAgICAgICAgICAgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTI3Mzc6MTogKCAoIHJ1bGVfX1hDYXN0ZWRFeHByZXNzaW9uX19Hcm91cF8xXzBfMF9fMCApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEyNzM4OjI6ICggcnVsZV9fWENhc3RlZEV4cHJlc3Npb25fX0dyb3VwXzFfMF8wX18wICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE0MDc1OjE6ICggKCBydWxlX19YQ2FzdGVkRXhwcmVzc2lvbl9fR3JvdXBfMV8wXzBfXzAgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNDA3NjoyOiAoIHJ1bGVfX1hDYXN0ZWRFeHByZXNzaW9uX19Hcm91cF8xXzBfMF9fMCApCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhDYXN0ZWRFeHByZXNzaW9uQWNjZXNzKCkuZ2V0R3JvdXBfMV8wXzAoKSk7IAogICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTI3Mzk6MjogKCBydWxlX19YQ2FzdGVkRXhwcmVzc2lvbl9fR3JvdXBfMV8wXzBfXzAgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTI3Mzk6MzogcnVsZV9fWENhc3RlZEV4cHJlc3Npb25fX0dyb3VwXzFfMF8wX18wCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNDA3NzoyOiAoIHJ1bGVfX1hDYXN0ZWRFeHByZXNzaW9uX19Hcm91cF8xXzBfMF9fMCApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNDA3NzozOiBydWxlX19YQ2FzdGVkRXhwcmVzc2lvbl9fR3JvdXBfMV8wXzBfXzAKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzIpOwogICAgICAgICAgICAgcnVsZV9fWENhc3RlZEV4cHJlc3Npb25fX0dyb3VwXzFfMF8wX18wKCk7CkBAIC00MjY3MiwxNiArNDcxMjksMTYgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YQ2FzdGVkRXhwcmVzc2lvbl9fR3JvdXBfMV8wXzBfXzAiCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTI3NDg6MTogcnVsZV9fWENhc3RlZEV4cHJlc3Npb25fX0dyb3VwXzFfMF8wX18wIDogcnVsZV9fWENhc3RlZEV4cHJlc3Npb25fX0dyb3VwXzFfMF8wX18wX19JbXBsIHJ1bGVfX1hDYXN0ZWRFeHByZXNzaW9uX19Hcm91cF8xXzBfMF9fMSA7CisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTQwODY6MTogcnVsZV9fWENhc3RlZEV4cHJlc3Npb25fX0dyb3VwXzFfMF8wX18wIDogcnVsZV9fWENhc3RlZEV4cHJlc3Npb25fX0dyb3VwXzFfMF8wX18wX19JbXBsIHJ1bGVfX1hDYXN0ZWRFeHByZXNzaW9uX19Hcm91cF8xXzBfMF9fMSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fWENhc3RlZEV4cHJlc3Npb25fX0dyb3VwXzFfMF8wX18wKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEyNzUyOjE6ICggcnVsZV9fWENhc3RlZEV4cHJlc3Npb25fX0dyb3VwXzFfMF8wX18wX19JbXBsIHJ1bGVfX1hDYXN0ZWRFeHByZXNzaW9uX19Hcm91cF8xXzBfMF9fMSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMjc1MzoyOiBydWxlX19YQ2FzdGVkRXhwcmVzc2lvbl9fR3JvdXBfMV8wXzBfXzBfX0ltcGwgcnVsZV9fWENhc3RlZEV4cHJlc3Npb25fX0dyb3VwXzFfMF8wX18xCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNDA5MDoxOiAoIHJ1bGVfX1hDYXN0ZWRFeHByZXNzaW9uX19Hcm91cF8xXzBfMF9fMF9fSW1wbCBydWxlX19YQ2FzdGVkRXhwcmVzc2lvbl9fR3JvdXBfMV8wXzBfXzEgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTQwOTE6MjogcnVsZV9fWENhc3RlZEV4cHJlc3Npb25fX0dyb3VwXzFfMF8wX18wX19JbXBsIHJ1bGVfX1hDYXN0ZWRFeHByZXNzaW9uX19Hcm91cF8xXzBfMF9fMQogICAgICAgICAgICAgewotICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfNTUpOworICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfNjMpOwogICAgICAgICAgICAgcnVsZV9fWENhc3RlZEV4cHJlc3Npb25fX0dyb3VwXzFfMF8wX18wX19JbXBsKCk7CiAKICAgICAgICAgICAgIHN0YXRlLl9mc3AtLTsKQEAgLTQyNzEwLDIzICs0NzE2NywyMyBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX1hDYXN0ZWRFeHByZXNzaW9uX19Hcm91cF8xXzBfMF9fMF9fSW1wbCIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMjc2MDoxOiBydWxlX19YQ2FzdGVkRXhwcmVzc2lvbl9fR3JvdXBfMV8wXzBfXzBfX0ltcGwgOiAoICgpICkgOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE0MDk4OjE6IHJ1bGVfX1hDYXN0ZWRFeHByZXNzaW9uX19Hcm91cF8xXzBfMF9fMF9fSW1wbCA6ICggKCkgKSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fWENhc3RlZEV4cHJlc3Npb25fX0dyb3VwXzFfMF8wX18wX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEyNzY0OjE6ICggKCAoKSApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEyNzY1OjE6ICggKCkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTQxMDI6MTogKCAoICgpICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTQxMDM6MTogKCAoKSApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMjc2NToxOiAoICgpICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEyNzY2OjI6ICgpCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNDEwMzoxOiAoICgpICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE0MTA0OjI6ICgpCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhDYXN0ZWRFeHByZXNzaW9uQWNjZXNzKCkuZ2V0WENhc3RlZEV4cHJlc3Npb25UYXJnZXRBY3Rpb25fMV8wXzBfMCgpKTsgCiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMjc2NzoyOiAoKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTI3Njc6MzogCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNDEwNToyOiAoKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTQxMDU6MzogCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICB9CiAKQEAgLTQyNzUxLDE0ICs0NzIwOCwxNCBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX1hDYXN0ZWRFeHByZXNzaW9uX19Hcm91cF8xXzBfMF9fMSIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMjc3NToxOiBydWxlX19YQ2FzdGVkRXhwcmVzc2lvbl9fR3JvdXBfMV8wXzBfXzEgOiBydWxlX19YQ2FzdGVkRXhwcmVzc2lvbl9fR3JvdXBfMV8wXzBfXzFfX0ltcGwgOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE0MTEzOjE6IHJ1bGVfX1hDYXN0ZWRFeHByZXNzaW9uX19Hcm91cF8xXzBfMF9fMSA6IHJ1bGVfX1hDYXN0ZWRFeHByZXNzaW9uX19Hcm91cF8xXzBfMF9fMV9fSW1wbCA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fWENhc3RlZEV4cHJlc3Npb25fX0dyb3VwXzFfMF8wX18xKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEyNzc5OjE6ICggcnVsZV9fWENhc3RlZEV4cHJlc3Npb25fX0dyb3VwXzFfMF8wX18xX19JbXBsICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEyNzgwOjI6IHJ1bGVfX1hDYXN0ZWRFeHByZXNzaW9uX19Hcm91cF8xXzBfMF9fMV9fSW1wbAorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTQxMTc6MTogKCBydWxlX19YQ2FzdGVkRXhwcmVzc2lvbl9fR3JvdXBfMV8wXzBfXzFfX0ltcGwgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTQxMTg6MjogcnVsZV9fWENhc3RlZEV4cHJlc3Npb25fX0dyb3VwXzFfMF8wX18xX19JbXBsCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV18yKTsKICAgICAgICAgICAgIHJ1bGVfX1hDYXN0ZWRFeHByZXNzaW9uX19Hcm91cF8xXzBfMF9fMV9fSW1wbCgpOwpAQCAtNDI3ODQsMjIgKzQ3MjQxLDIyIEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fWENhc3RlZEV4cHJlc3Npb25fX0dyb3VwXzFfMF8wX18xX19JbXBsIgotICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEyNzg2OjE6IHJ1bGVfX1hDYXN0ZWRFeHByZXNzaW9uX19Hcm91cF8xXzBfMF9fMV9fSW1wbCA6ICggJ2FzJyApIDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNDEyNDoxOiBydWxlX19YQ2FzdGVkRXhwcmVzc2lvbl9fR3JvdXBfMV8wXzBfXzFfX0ltcGwgOiAoICdhcycgKSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fWENhc3RlZEV4cHJlc3Npb25fX0dyb3VwXzFfMF8wX18xX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEyNzkwOjE6ICggKCAnYXMnICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTI3OTE6MTogKCAnYXMnICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE0MTI4OjE6ICggKCAnYXMnICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTQxMjk6MTogKCAnYXMnICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEyNzkxOjE6ICggJ2FzJyApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMjc5MjoyOiAnYXMnCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNDEyOToxOiAoICdhcycgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTQxMzA6MjogJ2FzJwogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYQ2FzdGVkRXhwcmVzc2lvbkFjY2VzcygpLmdldEFzS2V5d29yZF8xXzBfMF8xKCkpOyAKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1hdGNoKGlucHV0LDEwNixGT0xMT1dfMik7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CisgICAgICAgICAgICBtYXRjaChpbnB1dCwxMTYsRk9MTE9XXzIpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOwogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBhZnRlcihncmFtbWFyQWNjZXNzLmdldFhDYXN0ZWRFeHByZXNzaW9uQWNjZXNzKCkuZ2V0QXNLZXl3b3JkXzFfMF8wXzEoKSk7IAogICAgICAgICAgICAgfQpAQCAtNDI4MjUsMTYgKzQ3MjgyLDE2IEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fWFBvc3RmaXhPcGVyYXRpb25fX0dyb3VwX18wIgotICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEyODAyOjE6IHJ1bGVfX1hQb3N0Zml4T3BlcmF0aW9uX19Hcm91cF9fMCA6IHJ1bGVfX1hQb3N0Zml4T3BlcmF0aW9uX19Hcm91cF9fMF9fSW1wbCBydWxlX19YUG9zdGZpeE9wZXJhdGlvbl9fR3JvdXBfXzEgOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE0MTQwOjE6IHJ1bGVfX1hQb3N0Zml4T3BlcmF0aW9uX19Hcm91cF9fMCA6IHJ1bGVfX1hQb3N0Zml4T3BlcmF0aW9uX19Hcm91cF9fMF9fSW1wbCBydWxlX19YUG9zdGZpeE9wZXJhdGlvbl9fR3JvdXBfXzEgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1hQb3N0Zml4T3BlcmF0aW9uX19Hcm91cF9fMCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMjgwNjoxOiAoIHJ1bGVfX1hQb3N0Zml4T3BlcmF0aW9uX19Hcm91cF9fMF9fSW1wbCBydWxlX19YUG9zdGZpeE9wZXJhdGlvbl9fR3JvdXBfXzEgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTI4MDc6MjogcnVsZV9fWFBvc3RmaXhPcGVyYXRpb25fX0dyb3VwX18wX19JbXBsIHJ1bGVfX1hQb3N0Zml4T3BlcmF0aW9uX19Hcm91cF9fMQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTQxNDQ6MTogKCBydWxlX19YUG9zdGZpeE9wZXJhdGlvbl9fR3JvdXBfXzBfX0ltcGwgcnVsZV9fWFBvc3RmaXhPcGVyYXRpb25fX0dyb3VwX18xICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE0MTQ1OjI6IHJ1bGVfX1hQb3N0Zml4T3BlcmF0aW9uX19Hcm91cF9fMF9fSW1wbCBydWxlX19YUG9zdGZpeE9wZXJhdGlvbl9fR3JvdXBfXzEKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzEwNCk7CisgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV18xMTIpOwogICAgICAgICAgICAgcnVsZV9fWFBvc3RmaXhPcGVyYXRpb25fX0dyb3VwX18wX19JbXBsKCk7CiAKICAgICAgICAgICAgIHN0YXRlLl9mc3AtLTsKQEAgLTQyODYzLDE3ICs0NzMyMCwxNyBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX1hQb3N0Zml4T3BlcmF0aW9uX19Hcm91cF9fMF9fSW1wbCIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMjgxNDoxOiBydWxlX19YUG9zdGZpeE9wZXJhdGlvbl9fR3JvdXBfXzBfX0ltcGwgOiAoIHJ1bGVYTWVtYmVyRmVhdHVyZUNhbGwgKSA7CisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTQxNTI6MTogcnVsZV9fWFBvc3RmaXhPcGVyYXRpb25fX0dyb3VwX18wX19JbXBsIDogKCBydWxlWE1lbWJlckZlYXR1cmVDYWxsICkgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1hQb3N0Zml4T3BlcmF0aW9uX19Hcm91cF9fMF9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMjgxODoxOiAoICggcnVsZVhNZW1iZXJGZWF0dXJlQ2FsbCApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEyODE5OjE6ICggcnVsZVhNZW1iZXJGZWF0dXJlQ2FsbCApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNDE1NjoxOiAoICggcnVsZVhNZW1iZXJGZWF0dXJlQ2FsbCApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE0MTU3OjE6ICggcnVsZVhNZW1iZXJGZWF0dXJlQ2FsbCApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMjgxOToxOiAoIHJ1bGVYTWVtYmVyRmVhdHVyZUNhbGwgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTI4MjA6MjogcnVsZVhNZW1iZXJGZWF0dXJlQ2FsbAorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTQxNTc6MTogKCBydWxlWE1lbWJlckZlYXR1cmVDYWxsICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE0MTU4OjI6IHJ1bGVYTWVtYmVyRmVhdHVyZUNhbGwKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WFBvc3RmaXhPcGVyYXRpb25BY2Nlc3MoKS5nZXRYTWVtYmVyRmVhdHVyZUNhbGxQYXJzZXJSdWxlQ2FsbF8wKCkpOyAKQEAgLTQyOTA4LDE0ICs0NzM2NSwxNCBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX1hQb3N0Zml4T3BlcmF0aW9uX19Hcm91cF9fMSIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMjgyOToxOiBydWxlX19YUG9zdGZpeE9wZXJhdGlvbl9fR3JvdXBfXzEgOiBydWxlX19YUG9zdGZpeE9wZXJhdGlvbl9fR3JvdXBfXzFfX0ltcGwgOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE0MTY3OjE6IHJ1bGVfX1hQb3N0Zml4T3BlcmF0aW9uX19Hcm91cF9fMSA6IHJ1bGVfX1hQb3N0Zml4T3BlcmF0aW9uX19Hcm91cF9fMV9fSW1wbCA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fWFBvc3RmaXhPcGVyYXRpb25fX0dyb3VwX18xKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEyODMzOjE6ICggcnVsZV9fWFBvc3RmaXhPcGVyYXRpb25fX0dyb3VwX18xX19JbXBsICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEyODM0OjI6IHJ1bGVfX1hQb3N0Zml4T3BlcmF0aW9uX19Hcm91cF9fMV9fSW1wbAorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTQxNzE6MTogKCBydWxlX19YUG9zdGZpeE9wZXJhdGlvbl9fR3JvdXBfXzFfX0ltcGwgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTQxNzI6MjogcnVsZV9fWFBvc3RmaXhPcGVyYXRpb25fX0dyb3VwX18xX19JbXBsCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV18yKTsKICAgICAgICAgICAgIHJ1bGVfX1hQb3N0Zml4T3BlcmF0aW9uX19Hcm91cF9fMV9fSW1wbCgpOwpAQCAtNDI5NDEsNDIgKzQ3Mzk4LDQyIEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fWFBvc3RmaXhPcGVyYXRpb25fX0dyb3VwX18xX19JbXBsIgotICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEyODQwOjE6IHJ1bGVfX1hQb3N0Zml4T3BlcmF0aW9uX19Hcm91cF9fMV9fSW1wbCA6ICggKCBydWxlX19YUG9zdGZpeE9wZXJhdGlvbl9fR3JvdXBfMV9fMCApPyApIDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNDE3ODoxOiBydWxlX19YUG9zdGZpeE9wZXJhdGlvbl9fR3JvdXBfXzFfX0ltcGwgOiAoICggcnVsZV9fWFBvc3RmaXhPcGVyYXRpb25fX0dyb3VwXzFfXzAgKT8gKSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fWFBvc3RmaXhPcGVyYXRpb25fX0dyb3VwX18xX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEyODQ0OjE6ICggKCAoIHJ1bGVfX1hQb3N0Zml4T3BlcmF0aW9uX19Hcm91cF8xX18wICk/ICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTI4NDU6MTogKCAoIHJ1bGVfX1hQb3N0Zml4T3BlcmF0aW9uX19Hcm91cF8xX18wICk/ICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE0MTgyOjE6ICggKCAoIHJ1bGVfX1hQb3N0Zml4T3BlcmF0aW9uX19Hcm91cF8xX18wICk/ICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTQxODM6MTogKCAoIHJ1bGVfX1hQb3N0Zml4T3BlcmF0aW9uX19Hcm91cF8xX18wICk/ICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEyODQ1OjE6ICggKCBydWxlX19YUG9zdGZpeE9wZXJhdGlvbl9fR3JvdXBfMV9fMCApPyApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMjg0NjoyOiAoIHJ1bGVfX1hQb3N0Zml4T3BlcmF0aW9uX19Hcm91cF8xX18wICk/CisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNDE4MzoxOiAoICggcnVsZV9fWFBvc3RmaXhPcGVyYXRpb25fX0dyb3VwXzFfXzAgKT8gKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTQxODQ6MjogKCBydWxlX19YUG9zdGZpeE9wZXJhdGlvbl9fR3JvdXBfMV9fMCApPwogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYUG9zdGZpeE9wZXJhdGlvbkFjY2VzcygpLmdldEdyb3VwXzEoKSk7IAogICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTI4NDc6MjogKCBydWxlX19YUG9zdGZpeE9wZXJhdGlvbl9fR3JvdXBfMV9fMCApPwotICAgICAgICAgICAgaW50IGFsdDEwNT0yOwotICAgICAgICAgICAgaW50IExBMTA1XzAgPSBpbnB1dC5MQSgxKTsKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE0MTg1OjI6ICggcnVsZV9fWFBvc3RmaXhPcGVyYXRpb25fX0dyb3VwXzFfXzAgKT8KKyAgICAgICAgICAgIGludCBhbHQxMTg9MjsKKyAgICAgICAgICAgIGludCBMQTExOF8wID0gaW5wdXQuTEEoMSk7CiAKLSAgICAgICAgICAgIGlmICggKExBMTA1XzA9PTQxKSApIHsKLSAgICAgICAgICAgICAgICBpbnQgTEExMDVfMSA9IGlucHV0LkxBKDIpOworICAgICAgICAgICAgaWYgKCAoTEExMThfMD09NDEpICkgeworICAgICAgICAgICAgICAgIGludCBMQTExOF8xID0gaW5wdXQuTEEoMik7CiAKLSAgICAgICAgICAgICAgICBpZiAoIChzeW5wcmVkMTU5X0ludGVybmFsRGF0YURTTCgpKSApIHsKLSAgICAgICAgICAgICAgICAgICAgYWx0MTA1PTE7CisgICAgICAgICAgICAgICAgaWYgKCAoc3lucHJlZDE3OF9JbnRlcm5hbERhdGFEU0woKSkgKSB7CisgICAgICAgICAgICAgICAgICAgIGFsdDExOD0xOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgaWYgKCAoTEExMDVfMD09NDIpICkgewotICAgICAgICAgICAgICAgIGludCBMQTEwNV8yID0gaW5wdXQuTEEoMik7CisgICAgICAgICAgICBlbHNlIGlmICggKExBMTE4XzA9PTQyKSApIHsKKyAgICAgICAgICAgICAgICBpbnQgTEExMThfMiA9IGlucHV0LkxBKDIpOwogCi0gICAgICAgICAgICAgICAgaWYgKCAoc3lucHJlZDE1OV9JbnRlcm5hbERhdGFEU0woKSkgKSB7Ci0gICAgICAgICAgICAgICAgICAgIGFsdDEwNT0xOworICAgICAgICAgICAgICAgIGlmICggKHN5bnByZWQxNzhfSW50ZXJuYWxEYXRhRFNMKCkpICkgeworICAgICAgICAgICAgICAgICAgICBhbHQxMTg9MTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBzd2l0Y2ggKGFsdDEwNSkgeworICAgICAgICAgICAgc3dpdGNoIChhbHQxMTgpIHsKICAgICAgICAgICAgICAgICBjYXNlIDEgOgotICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMjg0NzozOiBydWxlX19YUG9zdGZpeE9wZXJhdGlvbl9fR3JvdXBfMV9fMAorICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNDE4NTozOiBydWxlX19YUG9zdGZpeE9wZXJhdGlvbl9fR3JvdXBfMV9fMAogICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzIpOwogICAgICAgICAgICAgICAgICAgICBydWxlX19YUG9zdGZpeE9wZXJhdGlvbl9fR3JvdXBfMV9fMCgpOwpAQCAtNDMwMTQsMTQgKzQ3NDcxLDE0IEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fWFBvc3RmaXhPcGVyYXRpb25fX0dyb3VwXzFfXzAiCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTI4NTY6MTogcnVsZV9fWFBvc3RmaXhPcGVyYXRpb25fX0dyb3VwXzFfXzAgOiBydWxlX19YUG9zdGZpeE9wZXJhdGlvbl9fR3JvdXBfMV9fMF9fSW1wbCA7CisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTQxOTQ6MTogcnVsZV9fWFBvc3RmaXhPcGVyYXRpb25fX0dyb3VwXzFfXzAgOiBydWxlX19YUG9zdGZpeE9wZXJhdGlvbl9fR3JvdXBfMV9fMF9fSW1wbCA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fWFBvc3RmaXhPcGVyYXRpb25fX0dyb3VwXzFfXzAoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTI4NjA6MTogKCBydWxlX19YUG9zdGZpeE9wZXJhdGlvbl9fR3JvdXBfMV9fMF9fSW1wbCApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMjg2MToyOiBydWxlX19YUG9zdGZpeE9wZXJhdGlvbl9fR3JvdXBfMV9fMF9fSW1wbAorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTQxOTg6MTogKCBydWxlX19YUG9zdGZpeE9wZXJhdGlvbl9fR3JvdXBfMV9fMF9fSW1wbCApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNDE5OToyOiBydWxlX19YUG9zdGZpeE9wZXJhdGlvbl9fR3JvdXBfMV9fMF9fSW1wbAogICAgICAgICAgICAgewogICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMik7CiAgICAgICAgICAgICBydWxlX19YUG9zdGZpeE9wZXJhdGlvbl9fR3JvdXBfMV9fMF9fSW1wbCgpOwpAQCAtNDMwNDcsMjMgKzQ3NTA0LDIzIEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fWFBvc3RmaXhPcGVyYXRpb25fX0dyb3VwXzFfXzBfX0ltcGwiCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTI4Njc6MTogcnVsZV9fWFBvc3RmaXhPcGVyYXRpb25fX0dyb3VwXzFfXzBfX0ltcGwgOiAoICggcnVsZV9fWFBvc3RmaXhPcGVyYXRpb25fX0dyb3VwXzFfMF9fMCApICkgOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE0MjA1OjE6IHJ1bGVfX1hQb3N0Zml4T3BlcmF0aW9uX19Hcm91cF8xX18wX19JbXBsIDogKCAoIHJ1bGVfX1hQb3N0Zml4T3BlcmF0aW9uX19Hcm91cF8xXzBfXzAgKSApIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YUG9zdGZpeE9wZXJhdGlvbl9fR3JvdXBfMV9fMF9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMjg3MToxOiAoICggKCBydWxlX19YUG9zdGZpeE9wZXJhdGlvbl9fR3JvdXBfMV8wX18wICkgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMjg3MjoxOiAoICggcnVsZV9fWFBvc3RmaXhPcGVyYXRpb25fX0dyb3VwXzFfMF9fMCApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE0MjA5OjE6ICggKCAoIHJ1bGVfX1hQb3N0Zml4T3BlcmF0aW9uX19Hcm91cF8xXzBfXzAgKSApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE0MjEwOjE6ICggKCBydWxlX19YUG9zdGZpeE9wZXJhdGlvbl9fR3JvdXBfMV8wX18wICkgKQogICAgICAgICAgICAgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTI4NzI6MTogKCAoIHJ1bGVfX1hQb3N0Zml4T3BlcmF0aW9uX19Hcm91cF8xXzBfXzAgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMjg3MzoyOiAoIHJ1bGVfX1hQb3N0Zml4T3BlcmF0aW9uX19Hcm91cF8xXzBfXzAgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTQyMTA6MTogKCAoIHJ1bGVfX1hQb3N0Zml4T3BlcmF0aW9uX19Hcm91cF8xXzBfXzAgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNDIxMToyOiAoIHJ1bGVfX1hQb3N0Zml4T3BlcmF0aW9uX19Hcm91cF8xXzBfXzAgKQogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYUG9zdGZpeE9wZXJhdGlvbkFjY2VzcygpLmdldEdyb3VwXzFfMCgpKTsgCiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMjg3NDoyOiAoIHJ1bGVfX1hQb3N0Zml4T3BlcmF0aW9uX19Hcm91cF8xXzBfXzAgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTI4NzQ6MzogcnVsZV9fWFBvc3RmaXhPcGVyYXRpb25fX0dyb3VwXzFfMF9fMAorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTQyMTI6MjogKCBydWxlX19YUG9zdGZpeE9wZXJhdGlvbl9fR3JvdXBfMV8wX18wICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE0MjEyOjM6IHJ1bGVfX1hQb3N0Zml4T3BlcmF0aW9uX19Hcm91cF8xXzBfXzAKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzIpOwogICAgICAgICAgICAgcnVsZV9fWFBvc3RmaXhPcGVyYXRpb25fX0dyb3VwXzFfMF9fMCgpOwpAQCAtNDMwOTgsMTYgKzQ3NTU1LDE2IEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fWFBvc3RmaXhPcGVyYXRpb25fX0dyb3VwXzFfMF9fMCIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMjg4MzoxOiBydWxlX19YUG9zdGZpeE9wZXJhdGlvbl9fR3JvdXBfMV8wX18wIDogcnVsZV9fWFBvc3RmaXhPcGVyYXRpb25fX0dyb3VwXzFfMF9fMF9fSW1wbCBydWxlX19YUG9zdGZpeE9wZXJhdGlvbl9fR3JvdXBfMV8wX18xIDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNDIyMToxOiBydWxlX19YUG9zdGZpeE9wZXJhdGlvbl9fR3JvdXBfMV8wX18wIDogcnVsZV9fWFBvc3RmaXhPcGVyYXRpb25fX0dyb3VwXzFfMF9fMF9fSW1wbCBydWxlX19YUG9zdGZpeE9wZXJhdGlvbl9fR3JvdXBfMV8wX18xIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YUG9zdGZpeE9wZXJhdGlvbl9fR3JvdXBfMV8wX18wKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEyODg3OjE6ICggcnVsZV9fWFBvc3RmaXhPcGVyYXRpb25fX0dyb3VwXzFfMF9fMF9fSW1wbCBydWxlX19YUG9zdGZpeE9wZXJhdGlvbl9fR3JvdXBfMV8wX18xICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEyODg4OjI6IHJ1bGVfX1hQb3N0Zml4T3BlcmF0aW9uX19Hcm91cF8xXzBfXzBfX0ltcGwgcnVsZV9fWFBvc3RmaXhPcGVyYXRpb25fX0dyb3VwXzFfMF9fMQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTQyMjU6MTogKCBydWxlX19YUG9zdGZpeE9wZXJhdGlvbl9fR3JvdXBfMV8wX18wX19JbXBsIHJ1bGVfX1hQb3N0Zml4T3BlcmF0aW9uX19Hcm91cF8xXzBfXzEgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTQyMjY6MjogcnVsZV9fWFBvc3RmaXhPcGVyYXRpb25fX0dyb3VwXzFfMF9fMF9fSW1wbCBydWxlX19YUG9zdGZpeE9wZXJhdGlvbl9fR3JvdXBfMV8wX18xCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV18xMDQpOworICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMTEyKTsKICAgICAgICAgICAgIHJ1bGVfX1hQb3N0Zml4T3BlcmF0aW9uX19Hcm91cF8xXzBfXzBfX0ltcGwoKTsKIAogICAgICAgICAgICAgc3RhdGUuX2ZzcC0tOwpAQCAtNDMxMzYsMjMgKzQ3NTkzLDIzIEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fWFBvc3RmaXhPcGVyYXRpb25fX0dyb3VwXzFfMF9fMF9fSW1wbCIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMjg5NToxOiBydWxlX19YUG9zdGZpeE9wZXJhdGlvbl9fR3JvdXBfMV8wX18wX19JbXBsIDogKCAoKSApIDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNDIzMzoxOiBydWxlX19YUG9zdGZpeE9wZXJhdGlvbl9fR3JvdXBfMV8wX18wX19JbXBsIDogKCAoKSApIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YUG9zdGZpeE9wZXJhdGlvbl9fR3JvdXBfMV8wX18wX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEyODk5OjE6ICggKCAoKSApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEyOTAwOjE6ICggKCkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTQyMzc6MTogKCAoICgpICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTQyMzg6MTogKCAoKSApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMjkwMDoxOiAoICgpICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEyOTAxOjI6ICgpCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNDIzODoxOiAoICgpICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE0MjM5OjI6ICgpCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhQb3N0Zml4T3BlcmF0aW9uQWNjZXNzKCkuZ2V0WFBvc3RmaXhPcGVyYXRpb25PcGVyYW5kQWN0aW9uXzFfMF8wKCkpOyAKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEyOTAyOjI6ICgpCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMjkwMjozOiAKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE0MjQwOjI6ICgpCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNDI0MDozOiAKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIH0KIApAQCAtNDMxNzcsMTQgKzQ3NjM0LDE0IEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fWFBvc3RmaXhPcGVyYXRpb25fX0dyb3VwXzFfMF9fMSIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMjkxMDoxOiBydWxlX19YUG9zdGZpeE9wZXJhdGlvbl9fR3JvdXBfMV8wX18xIDogcnVsZV9fWFBvc3RmaXhPcGVyYXRpb25fX0dyb3VwXzFfMF9fMV9fSW1wbCA7CisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTQyNDg6MTogcnVsZV9fWFBvc3RmaXhPcGVyYXRpb25fX0dyb3VwXzFfMF9fMSA6IHJ1bGVfX1hQb3N0Zml4T3BlcmF0aW9uX19Hcm91cF8xXzBfXzFfX0ltcGwgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1hQb3N0Zml4T3BlcmF0aW9uX19Hcm91cF8xXzBfXzEoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTI5MTQ6MTogKCBydWxlX19YUG9zdGZpeE9wZXJhdGlvbl9fR3JvdXBfMV8wX18xX19JbXBsICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEyOTE1OjI6IHJ1bGVfX1hQb3N0Zml4T3BlcmF0aW9uX19Hcm91cF8xXzBfXzFfX0ltcGwKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE0MjUyOjE6ICggcnVsZV9fWFBvc3RmaXhPcGVyYXRpb25fX0dyb3VwXzFfMF9fMV9fSW1wbCApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNDI1MzoyOiBydWxlX19YUG9zdGZpeE9wZXJhdGlvbl9fR3JvdXBfMV8wX18xX19JbXBsCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV18yKTsKICAgICAgICAgICAgIHJ1bGVfX1hQb3N0Zml4T3BlcmF0aW9uX19Hcm91cF8xXzBfXzFfX0ltcGwoKTsKQEAgLTQzMjEwLDIzICs0NzY2NywyMyBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX1hQb3N0Zml4T3BlcmF0aW9uX19Hcm91cF8xXzBfXzFfX0ltcGwiCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTI5MjE6MTogcnVsZV9fWFBvc3RmaXhPcGVyYXRpb25fX0dyb3VwXzFfMF9fMV9fSW1wbCA6ICggKCBydWxlX19YUG9zdGZpeE9wZXJhdGlvbl9fRmVhdHVyZUFzc2lnbm1lbnRfMV8wXzEgKSApIDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNDI1OToxOiBydWxlX19YUG9zdGZpeE9wZXJhdGlvbl9fR3JvdXBfMV8wX18xX19JbXBsIDogKCAoIHJ1bGVfX1hQb3N0Zml4T3BlcmF0aW9uX19GZWF0dXJlQXNzaWdubWVudF8xXzBfMSApICkgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1hQb3N0Zml4T3BlcmF0aW9uX19Hcm91cF8xXzBfXzFfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTI5MjU6MTogKCAoICggcnVsZV9fWFBvc3RmaXhPcGVyYXRpb25fX0ZlYXR1cmVBc3NpZ25tZW50XzFfMF8xICkgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMjkyNjoxOiAoICggcnVsZV9fWFBvc3RmaXhPcGVyYXRpb25fX0ZlYXR1cmVBc3NpZ25tZW50XzFfMF8xICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTQyNjM6MTogKCAoICggcnVsZV9fWFBvc3RmaXhPcGVyYXRpb25fX0ZlYXR1cmVBc3NpZ25tZW50XzFfMF8xICkgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNDI2NDoxOiAoICggcnVsZV9fWFBvc3RmaXhPcGVyYXRpb25fX0ZlYXR1cmVBc3NpZ25tZW50XzFfMF8xICkgKQogICAgICAgICAgICAgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTI5MjY6MTogKCAoIHJ1bGVfX1hQb3N0Zml4T3BlcmF0aW9uX19GZWF0dXJlQXNzaWdubWVudF8xXzBfMSApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEyOTI3OjI6ICggcnVsZV9fWFBvc3RmaXhPcGVyYXRpb25fX0ZlYXR1cmVBc3NpZ25tZW50XzFfMF8xICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE0MjY0OjE6ICggKCBydWxlX19YUG9zdGZpeE9wZXJhdGlvbl9fRmVhdHVyZUFzc2lnbm1lbnRfMV8wXzEgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNDI2NToyOiAoIHJ1bGVfX1hQb3N0Zml4T3BlcmF0aW9uX19GZWF0dXJlQXNzaWdubWVudF8xXzBfMSApCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhQb3N0Zml4T3BlcmF0aW9uQWNjZXNzKCkuZ2V0RmVhdHVyZUFzc2lnbm1lbnRfMV8wXzEoKSk7IAogICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTI5Mjg6MjogKCBydWxlX19YUG9zdGZpeE9wZXJhdGlvbl9fRmVhdHVyZUFzc2lnbm1lbnRfMV8wXzEgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTI5Mjg6MzogcnVsZV9fWFBvc3RmaXhPcGVyYXRpb25fX0ZlYXR1cmVBc3NpZ25tZW50XzFfMF8xCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNDI2NjoyOiAoIHJ1bGVfX1hQb3N0Zml4T3BlcmF0aW9uX19GZWF0dXJlQXNzaWdubWVudF8xXzBfMSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNDI2NjozOiBydWxlX19YUG9zdGZpeE9wZXJhdGlvbl9fRmVhdHVyZUFzc2lnbm1lbnRfMV8wXzEKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzIpOwogICAgICAgICAgICAgcnVsZV9fWFBvc3RmaXhPcGVyYXRpb25fX0ZlYXR1cmVBc3NpZ25tZW50XzFfMF8xKCk7CkBAIC00MzI2MSwxNiArNDc3MTgsMTYgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX0dyb3VwX18wIgotICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEyOTM3OjE6IHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fR3JvdXBfXzAgOiBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX0dyb3VwX18wX19JbXBsIHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fR3JvdXBfXzEgOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE0Mjc1OjE6IHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fR3JvdXBfXzAgOiBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX0dyb3VwX18wX19JbXBsIHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fR3JvdXBfXzEgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fR3JvdXBfXzAoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTI5NDE6MTogKCBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX0dyb3VwX18wX19JbXBsIHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fR3JvdXBfXzEgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTI5NDI6MjogcnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19Hcm91cF9fMF9fSW1wbCBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX0dyb3VwX18xCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNDI3OToxOiAoIHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fR3JvdXBfXzBfX0ltcGwgcnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19Hcm91cF9fMSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNDI4MDoyOiBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX0dyb3VwX18wX19JbXBsIHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fR3JvdXBfXzEKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzEwNSk7CisgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV18xMTMpOwogICAgICAgICAgICAgcnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19Hcm91cF9fMF9fSW1wbCgpOwogCiAgICAgICAgICAgICBzdGF0ZS5fZnNwLS07CkBAIC00MzI5OSwxNyArNDc3NTYsMTcgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX0dyb3VwX18wX19JbXBsIgotICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEyOTQ5OjE6IHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fR3JvdXBfXzBfX0ltcGwgOiAoIHJ1bGVYUHJpbWFyeUV4cHJlc3Npb24gKSA7CisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTQyODc6MTogcnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19Hcm91cF9fMF9fSW1wbCA6ICggcnVsZVhQcmltYXJ5RXhwcmVzc2lvbiApIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX0dyb3VwX18wX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEyOTUzOjE6ICggKCBydWxlWFByaW1hcnlFeHByZXNzaW9uICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTI5NTQ6MTogKCBydWxlWFByaW1hcnlFeHByZXNzaW9uICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE0MjkxOjE6ICggKCBydWxlWFByaW1hcnlFeHByZXNzaW9uICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTQyOTI6MTogKCBydWxlWFByaW1hcnlFeHByZXNzaW9uICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEyOTU0OjE6ICggcnVsZVhQcmltYXJ5RXhwcmVzc2lvbiApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMjk1NToyOiBydWxlWFByaW1hcnlFeHByZXNzaW9uCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNDI5MjoxOiAoIHJ1bGVYUHJpbWFyeUV4cHJlc3Npb24gKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTQyOTM6MjogcnVsZVhQcmltYXJ5RXhwcmVzc2lvbgogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYTWVtYmVyRmVhdHVyZUNhbGxBY2Nlc3MoKS5nZXRYUHJpbWFyeUV4cHJlc3Npb25QYXJzZXJSdWxlQ2FsbF8wKCkpOyAKQEAgLTQzMzQ0LDE0ICs0NzgwMSwxNCBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fR3JvdXBfXzEiCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTI5NjQ6MTogcnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19Hcm91cF9fMSA6IHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fR3JvdXBfXzFfX0ltcGwgOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE0MzAyOjE6IHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fR3JvdXBfXzEgOiBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX0dyb3VwX18xX19JbXBsIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX0dyb3VwX18xKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEyOTY4OjE6ICggcnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19Hcm91cF9fMV9fSW1wbCApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMjk2OToyOiBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX0dyb3VwX18xX19JbXBsCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNDMwNjoxOiAoIHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fR3JvdXBfXzFfX0ltcGwgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTQzMDc6MjogcnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19Hcm91cF9fMV9fSW1wbAogICAgICAgICAgICAgewogICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMik7CiAgICAgICAgICAgICBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX0dyb3VwX18xX19JbXBsKCk7CkBAIC00MzM3Nyw1NCArNDc4MzQsNTQgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX0dyb3VwX18xX19JbXBsIgotICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEyOTc1OjE6IHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fR3JvdXBfXzFfX0ltcGwgOiAoICggcnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19BbHRlcm5hdGl2ZXNfMSApKiApIDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNDMxMzoxOiBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX0dyb3VwX18xX19JbXBsIDogKCAoIHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fQWx0ZXJuYXRpdmVzXzEgKSogKSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19Hcm91cF9fMV9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMjk3OToxOiAoICggKCBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX0FsdGVybmF0aXZlc18xICkqICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTI5ODA6MTogKCAoIHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fQWx0ZXJuYXRpdmVzXzEgKSogKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTQzMTc6MTogKCAoICggcnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19BbHRlcm5hdGl2ZXNfMSApKiApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE0MzE4OjE6ICggKCBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX0FsdGVybmF0aXZlc18xICkqICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEyOTgwOjE6ICggKCBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX0FsdGVybmF0aXZlc18xICkqICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEyOTgxOjI6ICggcnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19BbHRlcm5hdGl2ZXNfMSApKgorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTQzMTg6MTogKCAoIHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fQWx0ZXJuYXRpdmVzXzEgKSogKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTQzMTk6MjogKCBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX0FsdGVybmF0aXZlc18xICkqCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhNZW1iZXJGZWF0dXJlQ2FsbEFjY2VzcygpLmdldEFsdGVybmF0aXZlc18xKCkpOyAKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEyOTgyOjI6ICggcnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19BbHRlcm5hdGl2ZXNfMSApKgotICAgICAgICAgICAgbG9vcDEwNjoKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE0MzIwOjI6ICggcnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19BbHRlcm5hdGl2ZXNfMSApKgorICAgICAgICAgICAgbG9vcDExOToKICAgICAgICAgICAgIGRvIHsKLSAgICAgICAgICAgICAgICBpbnQgYWx0MTA2PTI7CisgICAgICAgICAgICAgICAgaW50IGFsdDExOT0yOwogICAgICAgICAgICAgICAgIHN3aXRjaCAoIGlucHV0LkxBKDEpICkgewogICAgICAgICAgICAgICAgIGNhc2UgNDM6CiAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgaW50IExBMTA2XzIgPSBpbnB1dC5MQSgyKTsKKyAgICAgICAgICAgICAgICAgICAgaW50IExBMTE5XzIgPSBpbnB1dC5MQSgyKTsKIAotICAgICAgICAgICAgICAgICAgICBpZiAoIChzeW5wcmVkMTYwX0ludGVybmFsRGF0YURTTCgpKSApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGFsdDEwNj0xOworICAgICAgICAgICAgICAgICAgICBpZiAoIChzeW5wcmVkMTc5X0ludGVybmFsRGF0YURTTCgpKSApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFsdDExOT0xOwogICAgICAgICAgICAgICAgICAgICB9CiAKIAogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgMTUwOgorICAgICAgICAgICAgICAgIGNhc2UgMTYyOgogICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGludCBMQTEwNl8zID0gaW5wdXQuTEEoMik7CisgICAgICAgICAgICAgICAgICAgIGludCBMQTExOV8zID0gaW5wdXQuTEEoMik7CiAKLSAgICAgICAgICAgICAgICAgICAgaWYgKCAoc3lucHJlZDE2MF9JbnRlcm5hbERhdGFEU0woKSkgKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBhbHQxMDY9MTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCAoc3lucHJlZDE3OV9JbnRlcm5hbERhdGFEU0woKSkgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBhbHQxMTk9MTsKICAgICAgICAgICAgICAgICAgICAgfQogCiAKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlIDE1MToKKyAgICAgICAgICAgICAgICBjYXNlIDE2MzoKICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBpbnQgTEExMDZfNCA9IGlucHV0LkxBKDIpOworICAgICAgICAgICAgICAgICAgICBpbnQgTEExMTlfNCA9IGlucHV0LkxBKDIpOwogCi0gICAgICAgICAgICAgICAgICAgIGlmICggKHN5bnByZWQxNjBfSW50ZXJuYWxEYXRhRFNMKCkpICkgewotICAgICAgICAgICAgICAgICAgICAgICAgYWx0MTA2PTE7CisgICAgICAgICAgICAgICAgICAgIGlmICggKHN5bnByZWQxNzlfSW50ZXJuYWxEYXRhRFNMKCkpICkgeworICAgICAgICAgICAgICAgICAgICAgICAgYWx0MTE5PTE7CiAgICAgICAgICAgICAgICAgICAgIH0KIAogCkBAIC00MzQzMywxMSArNDc4OTAsMTEgQEAKIAogICAgICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgICAgIHN3aXRjaCAoYWx0MTA2KSB7CisgICAgICAgICAgICAgICAgc3dpdGNoIChhbHQxMTkpIHsKICAgICAgICAgICAgIAljYXNlIDEgOgotICAgICAgICAgICAgCSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMjk4MjozOiBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX0FsdGVybmF0aXZlc18xCisgICAgICAgICAgICAJICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE0MzIwOjM6IHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fQWx0ZXJuYXRpdmVzXzEKICAgICAgICAgICAgIAkgICAgewotICAgICAgICAgICAgCSAgICBwdXNoRm9sbG93KEZPTExPV18xMDYpOworICAgICAgICAgICAgCSAgICBwdXNoRm9sbG93KEZPTExPV18xMTQpOwogICAgICAgICAgICAgCSAgICBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX0FsdGVybmF0aXZlc18xKCk7CiAKICAgICAgICAgICAgIAkgICAgc3RhdGUuX2ZzcC0tOwpAQCAtNDM0NDcsNyArNDc5MDQsNyBAQAogICAgICAgICAgICAgCSAgICBicmVhazsKIAogICAgICAgICAgICAgCWRlZmF1bHQgOgotICAgICAgICAgICAgCSAgICBicmVhayBsb29wMTA2OworICAgICAgICAgICAgCSAgICBicmVhayBsb29wMTE5OwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0gd2hpbGUgKHRydWUpOwogCkBAIC00MzQ3NiwxNiArNDc5MzMsMTYgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX0dyb3VwXzFfMF9fMCIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMjk5MToxOiBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX0dyb3VwXzFfMF9fMCA6IHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fR3JvdXBfMV8wX18wX19JbXBsIHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fR3JvdXBfMV8wX18xIDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNDMyOToxOiBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX0dyb3VwXzFfMF9fMCA6IHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fR3JvdXBfMV8wX18wX19JbXBsIHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fR3JvdXBfMV8wX18xIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX0dyb3VwXzFfMF9fMCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMjk5NToxOiAoIHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fR3JvdXBfMV8wX18wX19JbXBsIHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fR3JvdXBfMV8wX18xICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEyOTk2OjI6IHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fR3JvdXBfMV8wX18wX19JbXBsIHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fR3JvdXBfMV8wX18xCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNDMzMzoxOiAoIHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fR3JvdXBfMV8wX18wX19JbXBsIHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fR3JvdXBfMV8wX18xICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE0MzM0OjI6IHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fR3JvdXBfMV8wX18wX19JbXBsIHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fR3JvdXBfMV8wX18xCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV183NCk7CisgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV184Mik7CiAgICAgICAgICAgICBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX0dyb3VwXzFfMF9fMF9fSW1wbCgpOwogCiAgICAgICAgICAgICBzdGF0ZS5fZnNwLS07CkBAIC00MzUxNCwyMyArNDc5NzEsMjMgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX0dyb3VwXzFfMF9fMF9fSW1wbCIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMzAwMzoxOiBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX0dyb3VwXzFfMF9fMF9fSW1wbCA6ICggKCBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX0dyb3VwXzFfMF8wX18wICkgKSA7CisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTQzNDE6MTogcnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19Hcm91cF8xXzBfXzBfX0ltcGwgOiAoICggcnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19Hcm91cF8xXzBfMF9fMCApICkgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fR3JvdXBfMV8wX18wX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEzMDA3OjE6ICggKCAoIHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fR3JvdXBfMV8wXzBfXzAgKSApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEzMDA4OjE6ICggKCBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX0dyb3VwXzFfMF8wX18wICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTQzNDU6MTogKCAoICggcnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19Hcm91cF8xXzBfMF9fMCApICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTQzNDY6MTogKCAoIHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fR3JvdXBfMV8wXzBfXzAgKSApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMzAwODoxOiAoICggcnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19Hcm91cF8xXzBfMF9fMCApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEzMDA5OjI6ICggcnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19Hcm91cF8xXzBfMF9fMCApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNDM0NjoxOiAoICggcnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19Hcm91cF8xXzBfMF9fMCApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE0MzQ3OjI6ICggcnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19Hcm91cF8xXzBfMF9fMCApCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhNZW1iZXJGZWF0dXJlQ2FsbEFjY2VzcygpLmdldEdyb3VwXzFfMF8wKCkpOyAKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEzMDEwOjI6ICggcnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19Hcm91cF8xXzBfMF9fMCApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMzAxMDozOiBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX0dyb3VwXzFfMF8wX18wCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNDM0ODoyOiAoIHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fR3JvdXBfMV8wXzBfXzAgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTQzNDg6MzogcnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19Hcm91cF8xXzBfMF9fMAogICAgICAgICAgICAgewogICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMik7CiAgICAgICAgICAgICBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX0dyb3VwXzFfMF8wX18wKCk7CkBAIC00MzU2NSwxNCArNDgwMjIsMTQgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX0dyb3VwXzFfMF9fMSIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMzAxODoxOiBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX0dyb3VwXzFfMF9fMSA6IHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fR3JvdXBfMV8wX18xX19JbXBsIDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNDM1NjoxOiBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX0dyb3VwXzFfMF9fMSA6IHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fR3JvdXBfMV8wX18xX19JbXBsIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX0dyb3VwXzFfMF9fMSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMzAyMjoxOiAoIHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fR3JvdXBfMV8wX18xX19JbXBsICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEzMDIzOjI6IHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fR3JvdXBfMV8wX18xX19JbXBsCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNDM2MDoxOiAoIHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fR3JvdXBfMV8wX18xX19JbXBsICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE0MzYxOjI6IHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fR3JvdXBfMV8wX18xX19JbXBsCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV18yKTsKICAgICAgICAgICAgIHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fR3JvdXBfMV8wX18xX19JbXBsKCk7CkBAIC00MzU5OCwyMyArNDgwNTUsMjMgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX0dyb3VwXzFfMF9fMV9fSW1wbCIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMzAyOToxOiBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX0dyb3VwXzFfMF9fMV9fSW1wbCA6ICggKCBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX1ZhbHVlQXNzaWdubWVudF8xXzBfMSApICkgOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE0MzY3OjE6IHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fR3JvdXBfMV8wX18xX19JbXBsIDogKCAoIHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fVmFsdWVBc3NpZ25tZW50XzFfMF8xICkgKSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19Hcm91cF8xXzBfXzFfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTMwMzM6MTogKCAoICggcnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19WYWx1ZUFzc2lnbm1lbnRfMV8wXzEgKSApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEzMDM0OjE6ICggKCBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX1ZhbHVlQXNzaWdubWVudF8xXzBfMSApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE0MzcxOjE6ICggKCAoIHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fVmFsdWVBc3NpZ25tZW50XzFfMF8xICkgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNDM3MjoxOiAoICggcnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19WYWx1ZUFzc2lnbm1lbnRfMV8wXzEgKSApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMzAzNDoxOiAoICggcnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19WYWx1ZUFzc2lnbm1lbnRfMV8wXzEgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMzAzNToyOiAoIHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fVmFsdWVBc3NpZ25tZW50XzFfMF8xICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE0MzcyOjE6ICggKCBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX1ZhbHVlQXNzaWdubWVudF8xXzBfMSApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE0MzczOjI6ICggcnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19WYWx1ZUFzc2lnbm1lbnRfMV8wXzEgKQogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYTWVtYmVyRmVhdHVyZUNhbGxBY2Nlc3MoKS5nZXRWYWx1ZUFzc2lnbm1lbnRfMV8wXzEoKSk7IAogICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTMwMzY6MjogKCBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX1ZhbHVlQXNzaWdubWVudF8xXzBfMSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMzAzNjozOiBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX1ZhbHVlQXNzaWdubWVudF8xXzBfMQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTQzNzQ6MjogKCBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX1ZhbHVlQXNzaWdubWVudF8xXzBfMSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNDM3NDozOiBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX1ZhbHVlQXNzaWdubWVudF8xXzBfMQogICAgICAgICAgICAgewogICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMik7CiAgICAgICAgICAgICBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX1ZhbHVlQXNzaWdubWVudF8xXzBfMSgpOwpAQCAtNDM2NDksMTQgKzQ4MTA2LDE0IEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19Hcm91cF8xXzBfMF9fMCIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMzA0NToxOiBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX0dyb3VwXzFfMF8wX18wIDogcnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19Hcm91cF8xXzBfMF9fMF9fSW1wbCA7CisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTQzODM6MTogcnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19Hcm91cF8xXzBfMF9fMCA6IHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fR3JvdXBfMV8wXzBfXzBfX0ltcGwgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fR3JvdXBfMV8wXzBfXzAoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTMwNDk6MTogKCBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX0dyb3VwXzFfMF8wX18wX19JbXBsICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEzMDUwOjI6IHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fR3JvdXBfMV8wXzBfXzBfX0ltcGwKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE0Mzg3OjE6ICggcnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19Hcm91cF8xXzBfMF9fMF9fSW1wbCApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNDM4ODoyOiBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX0dyb3VwXzFfMF8wX18wX19JbXBsCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV18yKTsKICAgICAgICAgICAgIHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fR3JvdXBfMV8wXzBfXzBfX0ltcGwoKTsKQEAgLTQzNjgyLDIzICs0ODEzOSwyMyBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fR3JvdXBfMV8wXzBfXzBfX0ltcGwiCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTMwNTY6MTogcnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19Hcm91cF8xXzBfMF9fMF9fSW1wbCA6ICggKCBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX0dyb3VwXzFfMF8wXzBfXzAgKSApIDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNDM5NDoxOiBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX0dyb3VwXzFfMF8wX18wX19JbXBsIDogKCAoIHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fR3JvdXBfMV8wXzBfMF9fMCApICkgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fR3JvdXBfMV8wXzBfXzBfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTMwNjA6MTogKCAoICggcnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19Hcm91cF8xXzBfMF8wX18wICkgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMzA2MToxOiAoICggcnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19Hcm91cF8xXzBfMF8wX18wICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTQzOTg6MTogKCAoICggcnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19Hcm91cF8xXzBfMF8wX18wICkgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNDM5OToxOiAoICggcnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19Hcm91cF8xXzBfMF8wX18wICkgKQogICAgICAgICAgICAgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTMwNjE6MTogKCAoIHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fR3JvdXBfMV8wXzBfMF9fMCApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEzMDYyOjI6ICggcnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19Hcm91cF8xXzBfMF8wX18wICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE0Mzk5OjE6ICggKCBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX0dyb3VwXzFfMF8wXzBfXzAgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNDQwMDoyOiAoIHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fR3JvdXBfMV8wXzBfMF9fMCApCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhNZW1iZXJGZWF0dXJlQ2FsbEFjY2VzcygpLmdldEdyb3VwXzFfMF8wXzAoKSk7IAogICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTMwNjM6MjogKCBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX0dyb3VwXzFfMF8wXzBfXzAgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTMwNjM6MzogcnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19Hcm91cF8xXzBfMF8wX18wCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNDQwMToyOiAoIHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fR3JvdXBfMV8wXzBfMF9fMCApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNDQwMTozOiBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX0dyb3VwXzFfMF8wXzBfXzAKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzIpOwogICAgICAgICAgICAgcnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19Hcm91cF8xXzBfMF8wX18wKCk7CkBAIC00MzczMywxNiArNDgxOTAsMTYgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX0dyb3VwXzFfMF8wXzBfXzAiCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTMwNzI6MTogcnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19Hcm91cF8xXzBfMF8wX18wIDogcnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19Hcm91cF8xXzBfMF8wX18wX19JbXBsIHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fR3JvdXBfMV8wXzBfMF9fMSA7CisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTQ0MTA6MTogcnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19Hcm91cF8xXzBfMF8wX18wIDogcnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19Hcm91cF8xXzBfMF8wX18wX19JbXBsIHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fR3JvdXBfMV8wXzBfMF9fMSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19Hcm91cF8xXzBfMF8wX18wKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEzMDc2OjE6ICggcnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19Hcm91cF8xXzBfMF8wX18wX19JbXBsIHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fR3JvdXBfMV8wXzBfMF9fMSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMzA3NzoyOiBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX0dyb3VwXzFfMF8wXzBfXzBfX0ltcGwgcnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19Hcm91cF8xXzBfMF8wX18xCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNDQxNDoxOiAoIHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fR3JvdXBfMV8wXzBfMF9fMF9fSW1wbCBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX0dyb3VwXzFfMF8wXzBfXzEgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTQ0MTU6MjogcnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19Hcm91cF8xXzBfMF8wX18wX19JbXBsIHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fR3JvdXBfMV8wXzBfMF9fMQogICAgICAgICAgICAgewotICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMTA3KTsKKyAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzExNSk7CiAgICAgICAgICAgICBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX0dyb3VwXzFfMF8wXzBfXzBfX0ltcGwoKTsKIAogICAgICAgICAgICAgc3RhdGUuX2ZzcC0tOwpAQCAtNDM3NzEsMjMgKzQ4MjI4LDIzIEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19Hcm91cF8xXzBfMF8wX18wX19JbXBsIgotICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEzMDg0OjE6IHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fR3JvdXBfMV8wXzBfMF9fMF9fSW1wbCA6ICggKCkgKSA7CisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTQ0MjI6MTogcnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19Hcm91cF8xXzBfMF8wX18wX19JbXBsIDogKCAoKSApIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX0dyb3VwXzFfMF8wXzBfXzBfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTMwODg6MTogKCAoICgpICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTMwODk6MTogKCAoKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNDQyNjoxOiAoICggKCkgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNDQyNzoxOiAoICgpICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEzMDg5OjE6ICggKCkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTMwOTA6MjogKCkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE0NDI3OjE6ICggKCkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTQ0Mjg6MjogKCkKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WE1lbWJlckZlYXR1cmVDYWxsQWNjZXNzKCkuZ2V0WEFzc2lnbm1lbnRBc3NpZ25hYmxlQWN0aW9uXzFfMF8wXzBfMCgpKTsgCiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMzA5MToyOiAoKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTMwOTE6MzogCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNDQyOToyOiAoKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTQ0Mjk6MzogCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICB9CiAKQEAgLTQzODEyLDE2ICs0ODI2OSwxNiBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fR3JvdXBfMV8wXzBfMF9fMSIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMzA5OToxOiBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX0dyb3VwXzFfMF8wXzBfXzEgOiBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX0dyb3VwXzFfMF8wXzBfXzFfX0ltcGwgcnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19Hcm91cF8xXzBfMF8wX18yIDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNDQzNzoxOiBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX0dyb3VwXzFfMF8wXzBfXzEgOiBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX0dyb3VwXzFfMF8wXzBfXzFfX0ltcGwgcnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19Hcm91cF8xXzBfMF8wX18yIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX0dyb3VwXzFfMF8wXzBfXzEoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTMxMDM6MTogKCBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX0dyb3VwXzFfMF8wXzBfXzFfX0ltcGwgcnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19Hcm91cF8xXzBfMF8wX18yICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEzMTA0OjI6IHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fR3JvdXBfMV8wXzBfMF9fMV9fSW1wbCBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX0dyb3VwXzFfMF8wXzBfXzIKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE0NDQxOjE6ICggcnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19Hcm91cF8xXzBfMF8wX18xX19JbXBsIHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fR3JvdXBfMV8wXzBfMF9fMiApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNDQ0MjoyOiBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX0dyb3VwXzFfMF8wXzBfXzFfX0ltcGwgcnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19Hcm91cF8xXzBfMF8wX18yCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV183OSk7CisgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV184Nyk7CiAgICAgICAgICAgICBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX0dyb3VwXzFfMF8wXzBfXzFfX0ltcGwoKTsKIAogICAgICAgICAgICAgc3RhdGUuX2ZzcC0tOwpAQCAtNDM4NTAsMjMgKzQ4MzA3LDIzIEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19Hcm91cF8xXzBfMF8wX18xX19JbXBsIgotICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEzMTExOjE6IHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fR3JvdXBfMV8wXzBfMF9fMV9fSW1wbCA6ICggKCBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX0FsdGVybmF0aXZlc18xXzBfMF8wXzEgKSApIDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNDQ0OToxOiBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX0dyb3VwXzFfMF8wXzBfXzFfX0ltcGwgOiAoICggcnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19BbHRlcm5hdGl2ZXNfMV8wXzBfMF8xICkgKSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19Hcm91cF8xXzBfMF8wX18xX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEzMTE1OjE6ICggKCAoIHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fQWx0ZXJuYXRpdmVzXzFfMF8wXzBfMSApICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTMxMTY6MTogKCAoIHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fQWx0ZXJuYXRpdmVzXzFfMF8wXzBfMSApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE0NDUzOjE6ICggKCAoIHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fQWx0ZXJuYXRpdmVzXzFfMF8wXzBfMSApICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTQ0NTQ6MTogKCAoIHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fQWx0ZXJuYXRpdmVzXzFfMF8wXzBfMSApICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEzMTE2OjE6ICggKCBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX0FsdGVybmF0aXZlc18xXzBfMF8wXzEgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMzExNzoyOiAoIHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fQWx0ZXJuYXRpdmVzXzFfMF8wXzBfMSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNDQ1NDoxOiAoICggcnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19BbHRlcm5hdGl2ZXNfMV8wXzBfMF8xICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTQ0NTU6MjogKCBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX0FsdGVybmF0aXZlc18xXzBfMF8wXzEgKQogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYTWVtYmVyRmVhdHVyZUNhbGxBY2Nlc3MoKS5nZXRBbHRlcm5hdGl2ZXNfMV8wXzBfMF8xKCkpOyAKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEzMTE4OjI6ICggcnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19BbHRlcm5hdGl2ZXNfMV8wXzBfMF8xICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEzMTE4OjM6IHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fQWx0ZXJuYXRpdmVzXzFfMF8wXzBfMQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTQ0NTY6MjogKCBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX0FsdGVybmF0aXZlc18xXzBfMF8wXzEgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTQ0NTY6MzogcnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19BbHRlcm5hdGl2ZXNfMV8wXzBfMF8xCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV18yKTsKICAgICAgICAgICAgIHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fQWx0ZXJuYXRpdmVzXzFfMF8wXzBfMSgpOwpAQCAtNDM5MDEsMTYgKzQ4MzU4LDE2IEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19Hcm91cF8xXzBfMF8wX18yIgotICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEzMTI2OjE6IHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fR3JvdXBfMV8wXzBfMF9fMiA6IHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fR3JvdXBfMV8wXzBfMF9fMl9fSW1wbCBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX0dyb3VwXzFfMF8wXzBfXzMgOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE0NDY0OjE6IHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fR3JvdXBfMV8wXzBfMF9fMiA6IHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fR3JvdXBfMV8wXzBfMF9fMl9fSW1wbCBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX0dyb3VwXzFfMF8wXzBfXzMgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fR3JvdXBfMV8wXzBfMF9fMigpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMzEzMDoxOiAoIHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fR3JvdXBfMV8wXzBfMF9fMl9fSW1wbCBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX0dyb3VwXzFfMF8wXzBfXzMgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTMxMzE6MjogcnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19Hcm91cF8xXzBfMF8wX18yX19JbXBsIHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fR3JvdXBfMV8wXzBfMF9fMworICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTQ0Njg6MTogKCBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX0dyb3VwXzFfMF8wXzBfXzJfX0ltcGwgcnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19Hcm91cF8xXzBfMF8wX18zICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE0NDY5OjI6IHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fR3JvdXBfMV8wXzBfMF9fMl9fSW1wbCBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX0dyb3VwXzFfMF8wXzBfXzMKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzc1KTsKKyAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzgzKTsKICAgICAgICAgICAgIHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fR3JvdXBfMV8wXzBfMF9fMl9fSW1wbCgpOwogCiAgICAgICAgICAgICBzdGF0ZS5fZnNwLS07CkBAIC00MzkzOSwyMyArNDgzOTYsMjMgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX0dyb3VwXzFfMF8wXzBfXzJfX0ltcGwiCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTMxMzg6MTogcnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19Hcm91cF8xXzBfMF8wX18yX19JbXBsIDogKCAoIHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fRmVhdHVyZUFzc2lnbm1lbnRfMV8wXzBfMF8yICkgKSA7CisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTQ0NzY6MTogcnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19Hcm91cF8xXzBfMF8wX18yX19JbXBsIDogKCAoIHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fRmVhdHVyZUFzc2lnbm1lbnRfMV8wXzBfMF8yICkgKSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19Hcm91cF8xXzBfMF8wX18yX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEzMTQyOjE6ICggKCAoIHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fRmVhdHVyZUFzc2lnbm1lbnRfMV8wXzBfMF8yICkgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMzE0MzoxOiAoICggcnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19GZWF0dXJlQXNzaWdubWVudF8xXzBfMF8wXzIgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNDQ4MDoxOiAoICggKCBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX0ZlYXR1cmVBc3NpZ25tZW50XzFfMF8wXzBfMiApICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTQ0ODE6MTogKCAoIHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fRmVhdHVyZUFzc2lnbm1lbnRfMV8wXzBfMF8yICkgKQogICAgICAgICAgICAgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTMxNDM6MTogKCAoIHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fRmVhdHVyZUFzc2lnbm1lbnRfMV8wXzBfMF8yICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTMxNDQ6MjogKCBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX0ZlYXR1cmVBc3NpZ25tZW50XzFfMF8wXzBfMiApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNDQ4MToxOiAoICggcnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19GZWF0dXJlQXNzaWdubWVudF8xXzBfMF8wXzIgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNDQ4MjoyOiAoIHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fRmVhdHVyZUFzc2lnbm1lbnRfMV8wXzBfMF8yICkKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WE1lbWJlckZlYXR1cmVDYWxsQWNjZXNzKCkuZ2V0RmVhdHVyZUFzc2lnbm1lbnRfMV8wXzBfMF8yKCkpOyAKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEzMTQ1OjI6ICggcnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19GZWF0dXJlQXNzaWdubWVudF8xXzBfMF8wXzIgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTMxNDU6MzogcnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19GZWF0dXJlQXNzaWdubWVudF8xXzBfMF8wXzIKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE0NDgzOjI6ICggcnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19GZWF0dXJlQXNzaWdubWVudF8xXzBfMF8wXzIgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTQ0ODM6MzogcnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19GZWF0dXJlQXNzaWdubWVudF8xXzBfMF8wXzIKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzIpOwogICAgICAgICAgICAgcnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19GZWF0dXJlQXNzaWdubWVudF8xXzBfMF8wXzIoKTsKQEAgLTQzOTkwLDE0ICs0ODQ0NywxNCBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fR3JvdXBfMV8wXzBfMF9fMyIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMzE1MzoxOiBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX0dyb3VwXzFfMF8wXzBfXzMgOiBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX0dyb3VwXzFfMF8wXzBfXzNfX0ltcGwgOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE0NDkxOjE6IHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fR3JvdXBfMV8wXzBfMF9fMyA6IHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fR3JvdXBfMV8wXzBfMF9fM19fSW1wbCA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19Hcm91cF8xXzBfMF8wX18zKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEzMTU3OjE6ICggcnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19Hcm91cF8xXzBfMF8wX18zX19JbXBsICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEzMTU4OjI6IHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fR3JvdXBfMV8wXzBfMF9fM19fSW1wbAorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTQ0OTU6MTogKCBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX0dyb3VwXzFfMF8wXzBfXzNfX0ltcGwgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTQ0OTY6MjogcnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19Hcm91cF8xXzBfMF8wX18zX19JbXBsCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV18yKTsKICAgICAgICAgICAgIHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fR3JvdXBfMV8wXzBfMF9fM19fSW1wbCgpOwpAQCAtNDQwMjMsMTcgKzQ4NDgwLDE3IEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19Hcm91cF8xXzBfMF8wX18zX19JbXBsIgotICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEzMTY0OjE6IHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fR3JvdXBfMV8wXzBfMF9fM19fSW1wbCA6ICggcnVsZU9wU2luZ2xlQXNzaWduICkgOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE0NTAyOjE6IHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fR3JvdXBfMV8wXzBfMF9fM19fSW1wbCA6ICggcnVsZU9wU2luZ2xlQXNzaWduICkgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fR3JvdXBfMV8wXzBfMF9fM19fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMzE2ODoxOiAoICggcnVsZU9wU2luZ2xlQXNzaWduICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTMxNjk6MTogKCBydWxlT3BTaW5nbGVBc3NpZ24gKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTQ1MDY6MTogKCAoIHJ1bGVPcFNpbmdsZUFzc2lnbiApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE0NTA3OjE6ICggcnVsZU9wU2luZ2xlQXNzaWduICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEzMTY5OjE6ICggcnVsZU9wU2luZ2xlQXNzaWduICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEzMTcwOjI6IHJ1bGVPcFNpbmdsZUFzc2lnbgorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTQ1MDc6MTogKCBydWxlT3BTaW5nbGVBc3NpZ24gKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTQ1MDg6MjogcnVsZU9wU2luZ2xlQXNzaWduCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhNZW1iZXJGZWF0dXJlQ2FsbEFjY2VzcygpLmdldE9wU2luZ2xlQXNzaWduUGFyc2VyUnVsZUNhbGxfMV8wXzBfMF8zKCkpOyAKQEAgLTQ0MDY4LDE2ICs0ODUyNSwxNiBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fR3JvdXBfMV8xX18wIgotICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEzMTgwOjE6IHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fR3JvdXBfMV8xX18wIDogcnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19Hcm91cF8xXzFfXzBfX0ltcGwgcnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19Hcm91cF8xXzFfXzEgOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE0NTE4OjE6IHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fR3JvdXBfMV8xX18wIDogcnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19Hcm91cF8xXzFfXzBfX0ltcGwgcnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19Hcm91cF8xXzFfXzEgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fR3JvdXBfMV8xX18wKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEzMTg0OjE6ICggcnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19Hcm91cF8xXzFfXzBfX0ltcGwgcnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19Hcm91cF8xXzFfXzEgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTMxODU6MjogcnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19Hcm91cF8xXzFfXzBfX0ltcGwgcnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19Hcm91cF8xXzFfXzEKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE0NTIyOjE6ICggcnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19Hcm91cF8xXzFfXzBfX0ltcGwgcnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19Hcm91cF8xXzFfXzEgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTQ1MjM6MjogcnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19Hcm91cF8xXzFfXzBfX0ltcGwgcnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19Hcm91cF8xXzFfXzEKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzEwOCk7CisgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV18xMTYpOwogICAgICAgICAgICAgcnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19Hcm91cF8xXzFfXzBfX0ltcGwoKTsKIAogICAgICAgICAgICAgc3RhdGUuX2ZzcC0tOwpAQCAtNDQxMDYsMjMgKzQ4NTYzLDIzIEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19Hcm91cF8xXzFfXzBfX0ltcGwiCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTMxOTI6MTogcnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19Hcm91cF8xXzFfXzBfX0ltcGwgOiAoICggcnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19Hcm91cF8xXzFfMF9fMCApICkgOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE0NTMwOjE6IHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fR3JvdXBfMV8xX18wX19JbXBsIDogKCAoIHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fR3JvdXBfMV8xXzBfXzAgKSApIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX0dyb3VwXzFfMV9fMF9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMzE5NjoxOiAoICggKCBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX0dyb3VwXzFfMV8wX18wICkgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMzE5NzoxOiAoICggcnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19Hcm91cF8xXzFfMF9fMCApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE0NTM0OjE6ICggKCAoIHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fR3JvdXBfMV8xXzBfXzAgKSApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE0NTM1OjE6ICggKCBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX0dyb3VwXzFfMV8wX18wICkgKQogICAgICAgICAgICAgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTMxOTc6MTogKCAoIHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fR3JvdXBfMV8xXzBfXzAgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMzE5ODoyOiAoIHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fR3JvdXBfMV8xXzBfXzAgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTQ1MzU6MTogKCAoIHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fR3JvdXBfMV8xXzBfXzAgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNDUzNjoyOiAoIHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fR3JvdXBfMV8xXzBfXzAgKQogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYTWVtYmVyRmVhdHVyZUNhbGxBY2Nlc3MoKS5nZXRHcm91cF8xXzFfMCgpKTsgCiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMzE5OToyOiAoIHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fR3JvdXBfMV8xXzBfXzAgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTMxOTk6MzogcnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19Hcm91cF8xXzFfMF9fMAorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTQ1Mzc6MjogKCBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX0dyb3VwXzFfMV8wX18wICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE0NTM3OjM6IHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fR3JvdXBfMV8xXzBfXzAKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzIpOwogICAgICAgICAgICAgcnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19Hcm91cF8xXzFfMF9fMCgpOwpAQCAtNDQxNTcsMTYgKzQ4NjE0LDE2IEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19Hcm91cF8xXzFfXzEiCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTMyMDc6MTogcnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19Hcm91cF8xXzFfXzEgOiBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX0dyb3VwXzFfMV9fMV9fSW1wbCBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX0dyb3VwXzFfMV9fMiA7CisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTQ1NDU6MTogcnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19Hcm91cF8xXzFfXzEgOiBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX0dyb3VwXzFfMV9fMV9fSW1wbCBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX0dyb3VwXzFfMV9fMiA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19Hcm91cF8xXzFfXzEoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTMyMTE6MTogKCBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX0dyb3VwXzFfMV9fMV9fSW1wbCBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX0dyb3VwXzFfMV9fMiApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMzIxMjoyOiBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX0dyb3VwXzFfMV9fMV9fSW1wbCBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX0dyb3VwXzFfMV9fMgorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTQ1NDk6MTogKCBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX0dyb3VwXzFfMV9fMV9fSW1wbCBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX0dyb3VwXzFfMV9fMiApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNDU1MDoyOiBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX0dyb3VwXzFfMV9fMV9fSW1wbCBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX0dyb3VwXzFfMV9fMgogICAgICAgICAgICAgewotICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMTA4KTsKKyAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzExNik7CiAgICAgICAgICAgICBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX0dyb3VwXzFfMV9fMV9fSW1wbCgpOwogCiAgICAgICAgICAgICBzdGF0ZS5fZnNwLS07CkBAIC00NDE5NSwzMSArNDg2NTIsMzEgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX0dyb3VwXzFfMV9fMV9fSW1wbCIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMzIxOToxOiBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX0dyb3VwXzFfMV9fMV9fSW1wbCA6ICggKCBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX0dyb3VwXzFfMV8xX18wICk/ICkgOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE0NTU3OjE6IHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fR3JvdXBfMV8xX18xX19JbXBsIDogKCAoIHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fR3JvdXBfMV8xXzFfXzAgKT8gKSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19Hcm91cF8xXzFfXzFfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTMyMjM6MTogKCAoICggcnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19Hcm91cF8xXzFfMV9fMCApPyApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEzMjI0OjE6ICggKCBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX0dyb3VwXzFfMV8xX18wICk/ICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE0NTYxOjE6ICggKCAoIHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fR3JvdXBfMV8xXzFfXzAgKT8gKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNDU2MjoxOiAoICggcnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19Hcm91cF8xXzFfMV9fMCApPyApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMzIyNDoxOiAoICggcnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19Hcm91cF8xXzFfMV9fMCApPyApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMzIyNToyOiAoIHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fR3JvdXBfMV8xXzFfXzAgKT8KKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE0NTYyOjE6ICggKCBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX0dyb3VwXzFfMV8xX18wICk/ICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE0NTYzOjI6ICggcnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19Hcm91cF8xXzFfMV9fMCApPwogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYTWVtYmVyRmVhdHVyZUNhbGxBY2Nlc3MoKS5nZXRHcm91cF8xXzFfMSgpKTsgCiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMzIyNjoyOiAoIHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fR3JvdXBfMV8xXzFfXzAgKT8KLSAgICAgICAgICAgIGludCBhbHQxMDc9MjsKLSAgICAgICAgICAgIGludCBMQTEwN18wID0gaW5wdXQuTEEoMSk7CisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNDU2NDoyOiAoIHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fR3JvdXBfMV8xXzFfXzAgKT8KKyAgICAgICAgICAgIGludCBhbHQxMjA9MjsKKyAgICAgICAgICAgIGludCBMQTEyMF8wID0gaW5wdXQuTEEoMSk7CiAKLSAgICAgICAgICAgIGlmICggKExBMTA3XzA9PTI3KSApIHsKLSAgICAgICAgICAgICAgICBhbHQxMDc9MTsKKyAgICAgICAgICAgIGlmICggKExBMTIwXzA9PTI3KSApIHsKKyAgICAgICAgICAgICAgICBhbHQxMjA9MTsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHN3aXRjaCAoYWx0MTA3KSB7CisgICAgICAgICAgICBzd2l0Y2ggKGFsdDEyMCkgewogICAgICAgICAgICAgICAgIGNhc2UgMSA6Ci0gICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEzMjI2OjM6IHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fR3JvdXBfMV8xXzFfXzAKKyAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTQ1NjQ6MzogcnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19Hcm91cF8xXzFfMV9fMAogICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzIpOwogICAgICAgICAgICAgICAgICAgICBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX0dyb3VwXzFfMV8xX18wKCk7CkBAIC00NDI1NywxNiArNDg3MTQsMTYgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX0dyb3VwXzFfMV9fMiIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMzIzNDoxOiBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX0dyb3VwXzFfMV9fMiA6IHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fR3JvdXBfMV8xX18yX19JbXBsIHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fR3JvdXBfMV8xX18zIDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNDU3MjoxOiBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX0dyb3VwXzFfMV9fMiA6IHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fR3JvdXBfMV8xX18yX19JbXBsIHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fR3JvdXBfMV8xX18zIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX0dyb3VwXzFfMV9fMigpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMzIzODoxOiAoIHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fR3JvdXBfMV8xX18yX19JbXBsIHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fR3JvdXBfMV8xX18zICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEzMjM5OjI6IHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fR3JvdXBfMV8xX18yX19JbXBsIHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fR3JvdXBfMV8xX18zCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNDU3NjoxOiAoIHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fR3JvdXBfMV8xX18yX19JbXBsIHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fR3JvdXBfMV8xX18zICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE0NTc3OjI6IHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fR3JvdXBfMV8xX18yX19JbXBsIHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fR3JvdXBfMV8xX18zCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV18xMDkpOworICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMTE3KTsKICAgICAgICAgICAgIHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fR3JvdXBfMV8xX18yX19JbXBsKCk7CiAKICAgICAgICAgICAgIHN0YXRlLl9mc3AtLTsKQEAgLTQ0Mjk1LDIzICs0ODc1MiwyMyBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fR3JvdXBfMV8xX18yX19JbXBsIgotICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEzMjQ2OjE6IHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fR3JvdXBfMV8xX18yX19JbXBsIDogKCAoIHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fRmVhdHVyZUFzc2lnbm1lbnRfMV8xXzIgKSApIDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNDU4NDoxOiBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX0dyb3VwXzFfMV9fMl9fSW1wbCA6ICggKCBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX0ZlYXR1cmVBc3NpZ25tZW50XzFfMV8yICkgKSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19Hcm91cF8xXzFfXzJfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTMyNTA6MTogKCAoICggcnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19GZWF0dXJlQXNzaWdubWVudF8xXzFfMiApICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTMyNTE6MTogKCAoIHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fRmVhdHVyZUFzc2lnbm1lbnRfMV8xXzIgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNDU4ODoxOiAoICggKCBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX0ZlYXR1cmVBc3NpZ25tZW50XzFfMV8yICkgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNDU4OToxOiAoICggcnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19GZWF0dXJlQXNzaWdubWVudF8xXzFfMiApICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEzMjUxOjE6ICggKCBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX0ZlYXR1cmVBc3NpZ25tZW50XzFfMV8yICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTMyNTI6MjogKCBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX0ZlYXR1cmVBc3NpZ25tZW50XzFfMV8yICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE0NTg5OjE6ICggKCBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX0ZlYXR1cmVBc3NpZ25tZW50XzFfMV8yICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTQ1OTA6MjogKCBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX0ZlYXR1cmVBc3NpZ25tZW50XzFfMV8yICkKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WE1lbWJlckZlYXR1cmVDYWxsQWNjZXNzKCkuZ2V0RmVhdHVyZUFzc2lnbm1lbnRfMV8xXzIoKSk7IAogICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTMyNTM6MjogKCBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX0ZlYXR1cmVBc3NpZ25tZW50XzFfMV8yICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEzMjUzOjM6IHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fRmVhdHVyZUFzc2lnbm1lbnRfMV8xXzIKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE0NTkxOjI6ICggcnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19GZWF0dXJlQXNzaWdubWVudF8xXzFfMiApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNDU5MTozOiBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX0ZlYXR1cmVBc3NpZ25tZW50XzFfMV8yCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV18yKTsKICAgICAgICAgICAgIHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fRmVhdHVyZUFzc2lnbm1lbnRfMV8xXzIoKTsKQEAgLTQ0MzQ2LDE2ICs0ODgwMywxNiBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fR3JvdXBfMV8xX18zIgotICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEzMjYxOjE6IHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fR3JvdXBfMV8xX18zIDogcnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19Hcm91cF8xXzFfXzNfX0ltcGwgcnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19Hcm91cF8xXzFfXzQgOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE0NTk5OjE6IHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fR3JvdXBfMV8xX18zIDogcnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19Hcm91cF8xXzFfXzNfX0ltcGwgcnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19Hcm91cF8xXzFfXzQgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fR3JvdXBfMV8xX18zKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEzMjY1OjE6ICggcnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19Hcm91cF8xXzFfXzNfX0ltcGwgcnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19Hcm91cF8xXzFfXzQgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTMyNjY6MjogcnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19Hcm91cF8xXzFfXzNfX0ltcGwgcnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19Hcm91cF8xXzFfXzQKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE0NjAzOjE6ICggcnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19Hcm91cF8xXzFfXzNfX0ltcGwgcnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19Hcm91cF8xXzFfXzQgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTQ2MDQ6MjogcnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19Hcm91cF8xXzFfXzNfX0ltcGwgcnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19Hcm91cF8xXzFfXzQKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzEwOSk7CisgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV18xMTcpOwogICAgICAgICAgICAgcnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19Hcm91cF8xXzFfXzNfX0ltcGwoKTsKIAogICAgICAgICAgICAgc3RhdGUuX2ZzcC0tOwpAQCAtNDQzODQsMjcgKzQ4ODQxLDI3IEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19Hcm91cF8xXzFfXzNfX0ltcGwiCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTMyNzM6MTogcnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19Hcm91cF8xXzFfXzNfX0ltcGwgOiAoICggcnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19Hcm91cF8xXzFfM19fMCApPyApIDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNDYxMToxOiBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX0dyb3VwXzFfMV9fM19fSW1wbCA6ICggKCBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX0dyb3VwXzFfMV8zX18wICk/ICkgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fR3JvdXBfMV8xX18zX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEzMjc3OjE6ICggKCAoIHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fR3JvdXBfMV8xXzNfXzAgKT8gKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMzI3ODoxOiAoICggcnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19Hcm91cF8xXzFfM19fMCApPyApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNDYxNToxOiAoICggKCBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX0dyb3VwXzFfMV8zX18wICk/ICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTQ2MTY6MTogKCAoIHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fR3JvdXBfMV8xXzNfXzAgKT8gKQogICAgICAgICAgICAgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTMyNzg6MTogKCAoIHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fR3JvdXBfMV8xXzNfXzAgKT8gKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTMyNzk6MjogKCBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX0dyb3VwXzFfMV8zX18wICk/CisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNDYxNjoxOiAoICggcnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19Hcm91cF8xXzFfM19fMCApPyApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNDYxNzoyOiAoIHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fR3JvdXBfMV8xXzNfXzAgKT8KICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WE1lbWJlckZlYXR1cmVDYWxsQWNjZXNzKCkuZ2V0R3JvdXBfMV8xXzMoKSk7IAogICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTMyODA6MjogKCBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX0dyb3VwXzFfMV8zX18wICk/Ci0gICAgICAgICAgICBpbnQgYWx0MTA4PTI7Ci0gICAgICAgICAgICBhbHQxMDggPSBkZmExMDgucHJlZGljdChpbnB1dCk7Ci0gICAgICAgICAgICBzd2l0Y2ggKGFsdDEwOCkgeworICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTQ2MTg6MjogKCBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX0dyb3VwXzFfMV8zX18wICk/CisgICAgICAgICAgICBpbnQgYWx0MTIxPTI7CisgICAgICAgICAgICBhbHQxMjEgPSBkZmExMjEucHJlZGljdChpbnB1dCk7CisgICAgICAgICAgICBzd2l0Y2ggKGFsdDEyMSkgewogICAgICAgICAgICAgICAgIGNhc2UgMSA6Ci0gICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEzMjgwOjM6IHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fR3JvdXBfMV8xXzNfXzAKKyAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTQ2MTg6MzogcnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19Hcm91cF8xXzFfM19fMAogICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzIpOwogICAgICAgICAgICAgICAgICAgICBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX0dyb3VwXzFfMV8zX18wKCk7CkBAIC00NDQ0MiwxNCArNDg4OTksMTQgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX0dyb3VwXzFfMV9fNCIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMzI4ODoxOiBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX0dyb3VwXzFfMV9fNCA6IHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fR3JvdXBfMV8xX180X19JbXBsIDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNDYyNjoxOiBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX0dyb3VwXzFfMV9fNCA6IHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fR3JvdXBfMV8xX180X19JbXBsIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX0dyb3VwXzFfMV9fNCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMzI5MjoxOiAoIHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fR3JvdXBfMV8xX180X19JbXBsICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEzMjkzOjI6IHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fR3JvdXBfMV8xX180X19JbXBsCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNDYzMDoxOiAoIHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fR3JvdXBfMV8xX180X19JbXBsICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE0NjMxOjI6IHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fR3JvdXBfMV8xX180X19JbXBsCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV18yKTsKICAgICAgICAgICAgIHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fR3JvdXBfMV8xX180X19JbXBsKCk7CkBAIC00NDQ3NSwyNyArNDg5MzIsMjcgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX0dyb3VwXzFfMV9fNF9fSW1wbCIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMzI5OToxOiBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX0dyb3VwXzFfMV9fNF9fSW1wbCA6ICggKCBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX01lbWJlckNhbGxBcmd1bWVudHNBc3NpZ25tZW50XzFfMV80ICk/ICkgOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE0NjM3OjE6IHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fR3JvdXBfMV8xX180X19JbXBsIDogKCAoIHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fTWVtYmVyQ2FsbEFyZ3VtZW50c0Fzc2lnbm1lbnRfMV8xXzQgKT8gKSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19Hcm91cF8xXzFfXzRfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTMzMDM6MTogKCAoICggcnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19NZW1iZXJDYWxsQXJndW1lbnRzQXNzaWdubWVudF8xXzFfNCApPyApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEzMzA0OjE6ICggKCBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX01lbWJlckNhbGxBcmd1bWVudHNBc3NpZ25tZW50XzFfMV80ICk/ICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE0NjQxOjE6ICggKCAoIHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fTWVtYmVyQ2FsbEFyZ3VtZW50c0Fzc2lnbm1lbnRfMV8xXzQgKT8gKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNDY0MjoxOiAoICggcnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19NZW1iZXJDYWxsQXJndW1lbnRzQXNzaWdubWVudF8xXzFfNCApPyApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMzMwNDoxOiAoICggcnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19NZW1iZXJDYWxsQXJndW1lbnRzQXNzaWdubWVudF8xXzFfNCApPyApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMzMwNToyOiAoIHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fTWVtYmVyQ2FsbEFyZ3VtZW50c0Fzc2lnbm1lbnRfMV8xXzQgKT8KKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE0NjQyOjE6ICggKCBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX01lbWJlckNhbGxBcmd1bWVudHNBc3NpZ25tZW50XzFfMV80ICk/ICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE0NjQzOjI6ICggcnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19NZW1iZXJDYWxsQXJndW1lbnRzQXNzaWdubWVudF8xXzFfNCApPwogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYTWVtYmVyRmVhdHVyZUNhbGxBY2Nlc3MoKS5nZXRNZW1iZXJDYWxsQXJndW1lbnRzQXNzaWdubWVudF8xXzFfNCgpKTsgCiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMzMwNjoyOiAoIHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fTWVtYmVyQ2FsbEFyZ3VtZW50c0Fzc2lnbm1lbnRfMV8xXzQgKT8KLSAgICAgICAgICAgIGludCBhbHQxMDk9MjsKLSAgICAgICAgICAgIGFsdDEwOSA9IGRmYTEwOS5wcmVkaWN0KGlucHV0KTsKLSAgICAgICAgICAgIHN3aXRjaCAoYWx0MTA5KSB7CisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNDY0NDoyOiAoIHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fTWVtYmVyQ2FsbEFyZ3VtZW50c0Fzc2lnbm1lbnRfMV8xXzQgKT8KKyAgICAgICAgICAgIGludCBhbHQxMjI9MjsKKyAgICAgICAgICAgIGFsdDEyMiA9IGRmYTEyMi5wcmVkaWN0KGlucHV0KTsKKyAgICAgICAgICAgIHN3aXRjaCAoYWx0MTIyKSB7CiAgICAgICAgICAgICAgICAgY2FzZSAxIDoKLSAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTMzMDY6MzogcnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19NZW1iZXJDYWxsQXJndW1lbnRzQXNzaWdubWVudF8xXzFfNAorICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNDY0NDozOiBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX01lbWJlckNhbGxBcmd1bWVudHNBc3NpZ25tZW50XzFfMV80CiAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMik7CiAgICAgICAgICAgICAgICAgICAgIHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fTWVtYmVyQ2FsbEFyZ3VtZW50c0Fzc2lnbm1lbnRfMV8xXzQoKTsKQEAgLTQ0NTMzLDE0ICs0ODk5MCwxNCBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fR3JvdXBfMV8xXzBfXzAiCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTMzMTU6MTogcnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19Hcm91cF8xXzFfMF9fMCA6IHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fR3JvdXBfMV8xXzBfXzBfX0ltcGwgOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE0NjUzOjE6IHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fR3JvdXBfMV8xXzBfXzAgOiBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX0dyb3VwXzFfMV8wX18wX19JbXBsIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX0dyb3VwXzFfMV8wX18wKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEzMzE5OjE6ICggcnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19Hcm91cF8xXzFfMF9fMF9fSW1wbCApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMzMyMDoyOiBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX0dyb3VwXzFfMV8wX18wX19JbXBsCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNDY1NzoxOiAoIHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fR3JvdXBfMV8xXzBfXzBfX0ltcGwgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTQ2NTg6MjogcnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19Hcm91cF8xXzFfMF9fMF9fSW1wbAogICAgICAgICAgICAgewogICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMik7CiAgICAgICAgICAgICBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX0dyb3VwXzFfMV8wX18wX19JbXBsKCk7CkBAIC00NDU2NiwyMyArNDkwMjMsMjMgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX0dyb3VwXzFfMV8wX18wX19JbXBsIgotICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEzMzI2OjE6IHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fR3JvdXBfMV8xXzBfXzBfX0ltcGwgOiAoICggcnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19Hcm91cF8xXzFfMF8wX18wICkgKSA7CisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTQ2NjQ6MTogcnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19Hcm91cF8xXzFfMF9fMF9fSW1wbCA6ICggKCBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX0dyb3VwXzFfMV8wXzBfXzAgKSApIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX0dyb3VwXzFfMV8wX18wX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEzMzMwOjE6ICggKCAoIHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fR3JvdXBfMV8xXzBfMF9fMCApICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTMzMzE6MTogKCAoIHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fR3JvdXBfMV8xXzBfMF9fMCApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE0NjY4OjE6ICggKCAoIHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fR3JvdXBfMV8xXzBfMF9fMCApICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTQ2Njk6MTogKCAoIHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fR3JvdXBfMV8xXzBfMF9fMCApICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEzMzMxOjE6ICggKCBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX0dyb3VwXzFfMV8wXzBfXzAgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMzMzMjoyOiAoIHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fR3JvdXBfMV8xXzBfMF9fMCApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNDY2OToxOiAoICggcnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19Hcm91cF8xXzFfMF8wX18wICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTQ2NzA6MjogKCBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX0dyb3VwXzFfMV8wXzBfXzAgKQogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYTWVtYmVyRmVhdHVyZUNhbGxBY2Nlc3MoKS5nZXRHcm91cF8xXzFfMF8wKCkpOyAKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEzMzMzOjI6ICggcnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19Hcm91cF8xXzFfMF8wX18wICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEzMzMzOjM6IHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fR3JvdXBfMV8xXzBfMF9fMAorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTQ2NzE6MjogKCBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX0dyb3VwXzFfMV8wXzBfXzAgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTQ2NzE6MzogcnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19Hcm91cF8xXzFfMF8wX18wCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV18yKTsKICAgICAgICAgICAgIHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fR3JvdXBfMV8xXzBfMF9fMCgpOwpAQCAtNDQ2MTcsMTYgKzQ5MDc0LDE2IEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19Hcm91cF8xXzFfMF8wX18wIgotICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEzMzQyOjE6IHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fR3JvdXBfMV8xXzBfMF9fMCA6IHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fR3JvdXBfMV8xXzBfMF9fMF9fSW1wbCBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX0dyb3VwXzFfMV8wXzBfXzEgOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE0NjgwOjE6IHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fR3JvdXBfMV8xXzBfMF9fMCA6IHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fR3JvdXBfMV8xXzBfMF9fMF9fSW1wbCBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX0dyb3VwXzFfMV8wXzBfXzEgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fR3JvdXBfMV8xXzBfMF9fMCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMzM0NjoxOiAoIHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fR3JvdXBfMV8xXzBfMF9fMF9fSW1wbCBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX0dyb3VwXzFfMV8wXzBfXzEgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTMzNDc6MjogcnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19Hcm91cF8xXzFfMF8wX18wX19JbXBsIHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fR3JvdXBfMV8xXzBfMF9fMQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTQ2ODQ6MTogKCBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX0dyb3VwXzFfMV8wXzBfXzBfX0ltcGwgcnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19Hcm91cF8xXzFfMF8wX18xICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE0Njg1OjI6IHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fR3JvdXBfMV8xXzBfMF9fMF9fSW1wbCBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX0dyb3VwXzFfMV8wXzBfXzEKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzEwNSk7CisgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV18xMTMpOwogICAgICAgICAgICAgcnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19Hcm91cF8xXzFfMF8wX18wX19JbXBsKCk7CiAKICAgICAgICAgICAgIHN0YXRlLl9mc3AtLTsKQEAgLTQ0NjU1LDIzICs0OTExMiwyMyBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fR3JvdXBfMV8xXzBfMF9fMF9fSW1wbCIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMzM1NDoxOiBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX0dyb3VwXzFfMV8wXzBfXzBfX0ltcGwgOiAoICgpICkgOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE0NjkyOjE6IHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fR3JvdXBfMV8xXzBfMF9fMF9fSW1wbCA6ICggKCkgKSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19Hcm91cF8xXzFfMF8wX18wX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEzMzU4OjE6ICggKCAoKSApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEzMzU5OjE6ICggKCkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTQ2OTY6MTogKCAoICgpICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTQ2OTc6MTogKCAoKSApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMzM1OToxOiAoICgpICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEzMzYwOjI6ICgpCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNDY5NzoxOiAoICgpICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE0Njk4OjI6ICgpCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhNZW1iZXJGZWF0dXJlQ2FsbEFjY2VzcygpLmdldFhNZW1iZXJGZWF0dXJlQ2FsbE1lbWJlckNhbGxUYXJnZXRBY3Rpb25fMV8xXzBfMF8wKCkpOyAKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEzMzYxOjI6ICgpCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMzM2MTozOiAKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE0Njk5OjI6ICgpCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNDY5OTozOiAKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIH0KIApAQCAtNDQ2OTYsMTQgKzQ5MTUzLDE0IEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19Hcm91cF8xXzFfMF8wX18xIgotICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEzMzY5OjE6IHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fR3JvdXBfMV8xXzBfMF9fMSA6IHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fR3JvdXBfMV8xXzBfMF9fMV9fSW1wbCA7CisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTQ3MDc6MTogcnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19Hcm91cF8xXzFfMF8wX18xIDogcnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19Hcm91cF8xXzFfMF8wX18xX19JbXBsIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX0dyb3VwXzFfMV8wXzBfXzEoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTMzNzM6MTogKCBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX0dyb3VwXzFfMV8wXzBfXzFfX0ltcGwgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTMzNzQ6MjogcnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19Hcm91cF8xXzFfMF8wX18xX19JbXBsCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNDcxMToxOiAoIHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fR3JvdXBfMV8xXzBfMF9fMV9fSW1wbCApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNDcxMjoyOiBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX0dyb3VwXzFfMV8wXzBfXzFfX0ltcGwKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzIpOwogICAgICAgICAgICAgcnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19Hcm91cF8xXzFfMF8wX18xX19JbXBsKCk7CkBAIC00NDcyOSwyMyArNDkxODYsMjMgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX0dyb3VwXzFfMV8wXzBfXzFfX0ltcGwiCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTMzODA6MTogcnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19Hcm91cF8xXzFfMF8wX18xX19JbXBsIDogKCAoIHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fQWx0ZXJuYXRpdmVzXzFfMV8wXzBfMSApICkgOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE0NzE4OjE6IHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fR3JvdXBfMV8xXzBfMF9fMV9fSW1wbCA6ICggKCBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX0FsdGVybmF0aXZlc18xXzFfMF8wXzEgKSApIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX0dyb3VwXzFfMV8wXzBfXzFfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTMzODQ6MTogKCAoICggcnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19BbHRlcm5hdGl2ZXNfMV8xXzBfMF8xICkgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMzM4NToxOiAoICggcnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19BbHRlcm5hdGl2ZXNfMV8xXzBfMF8xICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTQ3MjI6MTogKCAoICggcnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19BbHRlcm5hdGl2ZXNfMV8xXzBfMF8xICkgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNDcyMzoxOiAoICggcnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19BbHRlcm5hdGl2ZXNfMV8xXzBfMF8xICkgKQogICAgICAgICAgICAgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTMzODU6MTogKCAoIHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fQWx0ZXJuYXRpdmVzXzFfMV8wXzBfMSApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEzMzg2OjI6ICggcnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19BbHRlcm5hdGl2ZXNfMV8xXzBfMF8xICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE0NzIzOjE6ICggKCBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX0FsdGVybmF0aXZlc18xXzFfMF8wXzEgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNDcyNDoyOiAoIHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fQWx0ZXJuYXRpdmVzXzFfMV8wXzBfMSApCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhNZW1iZXJGZWF0dXJlQ2FsbEFjY2VzcygpLmdldEFsdGVybmF0aXZlc18xXzFfMF8wXzEoKSk7IAogICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTMzODc6MjogKCBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX0FsdGVybmF0aXZlc18xXzFfMF8wXzEgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTMzODc6MzogcnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19BbHRlcm5hdGl2ZXNfMV8xXzBfMF8xCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNDcyNToyOiAoIHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fQWx0ZXJuYXRpdmVzXzFfMV8wXzBfMSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNDcyNTozOiBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX0FsdGVybmF0aXZlc18xXzFfMF8wXzEKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzIpOwogICAgICAgICAgICAgcnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19BbHRlcm5hdGl2ZXNfMV8xXzBfMF8xKCk7CkBAIC00NDc4MCwxNiArNDkyMzcsMTYgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX0dyb3VwXzFfMV8xX18wIgotICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEzMzk2OjE6IHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fR3JvdXBfMV8xXzFfXzAgOiBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX0dyb3VwXzFfMV8xX18wX19JbXBsIHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fR3JvdXBfMV8xXzFfXzEgOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE0NzM0OjE6IHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fR3JvdXBfMV8xXzFfXzAgOiBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX0dyb3VwXzFfMV8xX18wX19JbXBsIHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fR3JvdXBfMV8xXzFfXzEgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fR3JvdXBfMV8xXzFfXzAoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTM0MDA6MTogKCBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX0dyb3VwXzFfMV8xX18wX19JbXBsIHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fR3JvdXBfMV8xXzFfXzEgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTM0MDE6MjogcnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19Hcm91cF8xXzFfMV9fMF9fSW1wbCBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX0dyb3VwXzFfMV8xX18xCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNDczODoxOiAoIHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fR3JvdXBfMV8xXzFfXzBfX0ltcGwgcnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19Hcm91cF8xXzFfMV9fMSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNDczOToyOiBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX0dyb3VwXzFfMV8xX18wX19JbXBsIHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fR3JvdXBfMV8xXzFfXzEKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzExMCk7CisgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV18xMTgpOwogICAgICAgICAgICAgcnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19Hcm91cF8xXzFfMV9fMF9fSW1wbCgpOwogCiAgICAgICAgICAgICBzdGF0ZS5fZnNwLS07CkBAIC00NDgxOCwxNyArNDkyNzUsMTcgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX0dyb3VwXzFfMV8xX18wX19JbXBsIgotICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEzNDA4OjE6IHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fR3JvdXBfMV8xXzFfXzBfX0ltcGwgOiAoICc8JyApIDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNDc0NjoxOiBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX0dyb3VwXzFfMV8xX18wX19JbXBsIDogKCAnPCcgKSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19Hcm91cF8xXzFfMV9fMF9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMzQxMjoxOiAoICggJzwnICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTM0MTM6MTogKCAnPCcgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTQ3NTA6MTogKCAoICc8JyApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE0NzUxOjE6ICggJzwnICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEzNDEzOjE6ICggJzwnICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEzNDE0OjI6ICc8JworICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTQ3NTE6MTogKCAnPCcgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTQ3NTI6MjogJzwnCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhNZW1iZXJGZWF0dXJlQ2FsbEFjY2VzcygpLmdldExlc3NUaGFuU2lnbktleXdvcmRfMV8xXzFfMCgpKTsgCkBAIC00NDg1OSwxNiArNDkzMTYsMTYgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX0dyb3VwXzFfMV8xX18xIgotICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEzNDIzOjE6IHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fR3JvdXBfMV8xXzFfXzEgOiBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX0dyb3VwXzFfMV8xX18xX19JbXBsIHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fR3JvdXBfMV8xXzFfXzIgOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE0NzYxOjE6IHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fR3JvdXBfMV8xXzFfXzEgOiBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX0dyb3VwXzFfMV8xX18xX19JbXBsIHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fR3JvdXBfMV8xXzFfXzIgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fR3JvdXBfMV8xXzFfXzEoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTM0Mjc6MTogKCBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX0dyb3VwXzFfMV8xX18xX19JbXBsIHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fR3JvdXBfMV8xXzFfXzIgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTM0Mjg6MjogcnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19Hcm91cF8xXzFfMV9fMV9fSW1wbCBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX0dyb3VwXzFfMV8xX18yCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNDc2NToxOiAoIHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fR3JvdXBfMV8xXzFfXzFfX0ltcGwgcnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19Hcm91cF8xXzFfMV9fMiApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNDc2NjoyOiBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX0dyb3VwXzFfMV8xX18xX19JbXBsIHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fR3JvdXBfMV8xXzFfXzIKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzExMSk7CisgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV18xMTkpOwogICAgICAgICAgICAgcnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19Hcm91cF8xXzFfMV9fMV9fSW1wbCgpOwogCiAgICAgICAgICAgICBzdGF0ZS5fZnNwLS07CkBAIC00NDg5NywyMyArNDkzNTQsMjMgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX0dyb3VwXzFfMV8xX18xX19JbXBsIgotICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEzNDM1OjE6IHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fR3JvdXBfMV8xXzFfXzFfX0ltcGwgOiAoICggcnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19UeXBlQXJndW1lbnRzQXNzaWdubWVudF8xXzFfMV8xICkgKSA7CisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTQ3NzM6MTogcnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19Hcm91cF8xXzFfMV9fMV9fSW1wbCA6ICggKCBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX1R5cGVBcmd1bWVudHNBc3NpZ25tZW50XzFfMV8xXzEgKSApIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX0dyb3VwXzFfMV8xX18xX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEzNDM5OjE6ICggKCAoIHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fVHlwZUFyZ3VtZW50c0Fzc2lnbm1lbnRfMV8xXzFfMSApICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTM0NDA6MTogKCAoIHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fVHlwZUFyZ3VtZW50c0Fzc2lnbm1lbnRfMV8xXzFfMSApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE0Nzc3OjE6ICggKCAoIHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fVHlwZUFyZ3VtZW50c0Fzc2lnbm1lbnRfMV8xXzFfMSApICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTQ3Nzg6MTogKCAoIHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fVHlwZUFyZ3VtZW50c0Fzc2lnbm1lbnRfMV8xXzFfMSApICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEzNDQwOjE6ICggKCBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX1R5cGVBcmd1bWVudHNBc3NpZ25tZW50XzFfMV8xXzEgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMzQ0MToyOiAoIHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fVHlwZUFyZ3VtZW50c0Fzc2lnbm1lbnRfMV8xXzFfMSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNDc3ODoxOiAoICggcnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19UeXBlQXJndW1lbnRzQXNzaWdubWVudF8xXzFfMV8xICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTQ3Nzk6MjogKCBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX1R5cGVBcmd1bWVudHNBc3NpZ25tZW50XzFfMV8xXzEgKQogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYTWVtYmVyRmVhdHVyZUNhbGxBY2Nlc3MoKS5nZXRUeXBlQXJndW1lbnRzQXNzaWdubWVudF8xXzFfMV8xKCkpOyAKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEzNDQyOjI6ICggcnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19UeXBlQXJndW1lbnRzQXNzaWdubWVudF8xXzFfMV8xICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEzNDQyOjM6IHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fVHlwZUFyZ3VtZW50c0Fzc2lnbm1lbnRfMV8xXzFfMQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTQ3ODA6MjogKCBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX1R5cGVBcmd1bWVudHNBc3NpZ25tZW50XzFfMV8xXzEgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTQ3ODA6MzogcnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19UeXBlQXJndW1lbnRzQXNzaWdubWVudF8xXzFfMV8xCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV18yKTsKICAgICAgICAgICAgIHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fVHlwZUFyZ3VtZW50c0Fzc2lnbm1lbnRfMV8xXzFfMSgpOwpAQCAtNDQ5NDgsMTYgKzQ5NDA1LDE2IEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19Hcm91cF8xXzFfMV9fMiIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMzQ1MDoxOiBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX0dyb3VwXzFfMV8xX18yIDogcnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19Hcm91cF8xXzFfMV9fMl9fSW1wbCBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX0dyb3VwXzFfMV8xX18zIDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNDc4ODoxOiBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX0dyb3VwXzFfMV8xX18yIDogcnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19Hcm91cF8xXzFfMV9fMl9fSW1wbCBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX0dyb3VwXzFfMV8xX18zIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX0dyb3VwXzFfMV8xX18yKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEzNDU0OjE6ICggcnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19Hcm91cF8xXzFfMV9fMl9fSW1wbCBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX0dyb3VwXzFfMV8xX18zICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEzNDU1OjI6IHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fR3JvdXBfMV8xXzFfXzJfX0ltcGwgcnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19Hcm91cF8xXzFfMV9fMworICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTQ3OTI6MTogKCBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX0dyb3VwXzFfMV8xX18yX19JbXBsIHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fR3JvdXBfMV8xXzFfXzMgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTQ3OTM6MjogcnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19Hcm91cF8xXzFfMV9fMl9fSW1wbCBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX0dyb3VwXzFfMV8xX18zCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV18xMTEpOworICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMTE5KTsKICAgICAgICAgICAgIHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fR3JvdXBfMV8xXzFfXzJfX0ltcGwoKTsKIAogICAgICAgICAgICAgc3RhdGUuX2ZzcC0tOwpAQCAtNDQ5ODYsMzcgKzQ5NDQzLDM3IEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19Hcm91cF8xXzFfMV9fMl9fSW1wbCIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMzQ2MjoxOiBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX0dyb3VwXzFfMV8xX18yX19JbXBsIDogKCAoIHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fR3JvdXBfMV8xXzFfMl9fMCApKiApIDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNDgwMDoxOiBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX0dyb3VwXzFfMV8xX18yX19JbXBsIDogKCAoIHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fR3JvdXBfMV8xXzFfMl9fMCApKiApIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX0dyb3VwXzFfMV8xX18yX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEzNDY2OjE6ICggKCAoIHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fR3JvdXBfMV8xXzFfMl9fMCApKiApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEzNDY3OjE6ICggKCBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX0dyb3VwXzFfMV8xXzJfXzAgKSogKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTQ4MDQ6MTogKCAoICggcnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19Hcm91cF8xXzFfMV8yX18wICkqICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTQ4MDU6MTogKCAoIHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fR3JvdXBfMV8xXzFfMl9fMCApKiApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMzQ2NzoxOiAoICggcnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19Hcm91cF8xXzFfMV8yX18wICkqICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEzNDY4OjI6ICggcnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19Hcm91cF8xXzFfMV8yX18wICkqCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNDgwNToxOiAoICggcnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19Hcm91cF8xXzFfMV8yX18wICkqICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE0ODA2OjI6ICggcnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19Hcm91cF8xXzFfMV8yX18wICkqCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhNZW1iZXJGZWF0dXJlQ2FsbEFjY2VzcygpLmdldEdyb3VwXzFfMV8xXzIoKSk7IAogICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTM0Njk6MjogKCBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX0dyb3VwXzFfMV8xXzJfXzAgKSoKLSAgICAgICAgICAgIGxvb3AxMTA6CisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNDgwNzoyOiAoIHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fR3JvdXBfMV8xXzFfMl9fMCApKgorICAgICAgICAgICAgbG9vcDEyMzoKICAgICAgICAgICAgIGRvIHsKLSAgICAgICAgICAgICAgICBpbnQgYWx0MTEwPTI7Ci0gICAgICAgICAgICAgICAgaW50IExBMTEwXzAgPSBpbnB1dC5MQSgxKTsKKyAgICAgICAgICAgICAgICBpbnQgYWx0MTIzPTI7CisgICAgICAgICAgICAgICAgaW50IExBMTIzXzAgPSBpbnB1dC5MQSgxKTsKIAotICAgICAgICAgICAgICAgIGlmICggKExBMTEwXzA9PTExNSkgKSB7Ci0gICAgICAgICAgICAgICAgICAgIGFsdDExMD0xOworICAgICAgICAgICAgICAgIGlmICggKExBMTIzXzA9PTEyNSkgKSB7CisgICAgICAgICAgICAgICAgICAgIGFsdDEyMz0xOwogICAgICAgICAgICAgICAgIH0KIAogCi0gICAgICAgICAgICAgICAgc3dpdGNoIChhbHQxMTApIHsKKyAgICAgICAgICAgICAgICBzd2l0Y2ggKGFsdDEyMykgewogICAgICAgICAgICAgCWNhc2UgMSA6Ci0gICAgICAgICAgICAJICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEzNDY5OjM6IHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fR3JvdXBfMV8xXzFfMl9fMAorICAgICAgICAgICAgCSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNDgwNzozOiBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX0dyb3VwXzFfMV8xXzJfXzAKICAgICAgICAgICAgIAkgICAgewotICAgICAgICAgICAgCSAgICBwdXNoRm9sbG93KEZPTExPV183Myk7CisgICAgICAgICAgICAJICAgIHB1c2hGb2xsb3coRk9MTE9XXzgxKTsKICAgICAgICAgICAgIAkgICAgcnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19Hcm91cF8xXzFfMV8yX18wKCk7CiAKICAgICAgICAgICAgIAkgICAgc3RhdGUuX2ZzcC0tOwpAQCAtNDUwMjYsNyArNDk0ODMsNyBAQAogICAgICAgICAgICAgCSAgICBicmVhazsKIAogICAgICAgICAgICAgCWRlZmF1bHQgOgotICAgICAgICAgICAgCSAgICBicmVhayBsb29wMTEwOworICAgICAgICAgICAgCSAgICBicmVhayBsb29wMTIzOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0gd2hpbGUgKHRydWUpOwogCkBAIC00NTA1NSwxNCArNDk1MTIsMTQgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX0dyb3VwXzFfMV8xX18zIgotICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEzNDc3OjE6IHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fR3JvdXBfMV8xXzFfXzMgOiBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX0dyb3VwXzFfMV8xX18zX19JbXBsIDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNDgxNToxOiBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX0dyb3VwXzFfMV8xX18zIDogcnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19Hcm91cF8xXzFfMV9fM19fSW1wbCA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19Hcm91cF8xXzFfMV9fMygpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMzQ4MToxOiAoIHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fR3JvdXBfMV8xXzFfXzNfX0ltcGwgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTM0ODI6MjogcnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19Hcm91cF8xXzFfMV9fM19fSW1wbAorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTQ4MTk6MTogKCBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX0dyb3VwXzFfMV8xX18zX19JbXBsICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE0ODIwOjI6IHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fR3JvdXBfMV8xXzFfXzNfX0ltcGwKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzIpOwogICAgICAgICAgICAgcnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19Hcm91cF8xXzFfMV9fM19fSW1wbCgpOwpAQCAtNDUwODgsMTcgKzQ5NTQ1LDE3IEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19Hcm91cF8xXzFfMV9fM19fSW1wbCIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMzQ4ODoxOiBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX0dyb3VwXzFfMV8xX18zX19JbXBsIDogKCAnPicgKSA7CisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTQ4MjY6MTogcnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19Hcm91cF8xXzFfMV9fM19fSW1wbCA6ICggJz4nICkgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fR3JvdXBfMV8xXzFfXzNfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTM0OTI6MTogKCAoICc+JyApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEzNDkzOjE6ICggJz4nICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE0ODMwOjE6ICggKCAnPicgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNDgzMToxOiAoICc+JyApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMzQ5MzoxOiAoICc+JyApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMzQ5NDoyOiAnPicKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE0ODMxOjE6ICggJz4nICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE0ODMyOjI6ICc+JwogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYTWVtYmVyRmVhdHVyZUNhbGxBY2Nlc3MoKS5nZXRHcmVhdGVyVGhhblNpZ25LZXl3b3JkXzFfMV8xXzMoKSk7IApAQCAtNDUxMjksMTYgKzQ5NTg2LDE2IEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19Hcm91cF8xXzFfMV8yX18wIgotICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEzNTA0OjE6IHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fR3JvdXBfMV8xXzFfMl9fMCA6IHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fR3JvdXBfMV8xXzFfMl9fMF9fSW1wbCBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX0dyb3VwXzFfMV8xXzJfXzEgOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE0ODQyOjE6IHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fR3JvdXBfMV8xXzFfMl9fMCA6IHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fR3JvdXBfMV8xXzFfMl9fMF9fSW1wbCBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX0dyb3VwXzFfMV8xXzJfXzEgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fR3JvdXBfMV8xXzFfMl9fMCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMzUwODoxOiAoIHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fR3JvdXBfMV8xXzFfMl9fMF9fSW1wbCBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX0dyb3VwXzFfMV8xXzJfXzEgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTM1MDk6MjogcnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19Hcm91cF8xXzFfMV8yX18wX19JbXBsIHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fR3JvdXBfMV8xXzFfMl9fMQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTQ4NDY6MTogKCBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX0dyb3VwXzFfMV8xXzJfXzBfX0ltcGwgcnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19Hcm91cF8xXzFfMV8yX18xICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE0ODQ3OjI6IHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fR3JvdXBfMV8xXzFfMl9fMF9fSW1wbCBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX0dyb3VwXzFfMV8xXzJfXzEKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzExMCk7CisgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV18xMTgpOwogICAgICAgICAgICAgcnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19Hcm91cF8xXzFfMV8yX18wX19JbXBsKCk7CiAKICAgICAgICAgICAgIHN0YXRlLl9mc3AtLTsKQEAgLTQ1MTY3LDIyICs0OTYyNCwyMiBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fR3JvdXBfMV8xXzFfMl9fMF9fSW1wbCIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMzUxNjoxOiBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX0dyb3VwXzFfMV8xXzJfXzBfX0ltcGwgOiAoICcsJyApIDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNDg1NDoxOiBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX0dyb3VwXzFfMV8xXzJfXzBfX0ltcGwgOiAoICcsJyApIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX0dyb3VwXzFfMV8xXzJfXzBfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTM1MjA6MTogKCAoICcsJyApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEzNTIxOjE6ICggJywnICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE0ODU4OjE6ICggKCAnLCcgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNDg1OToxOiAoICcsJyApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMzUyMToxOiAoICcsJyApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMzUyMjoyOiAnLCcKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE0ODU5OjE6ICggJywnICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE0ODYwOjI6ICcsJwogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYTWVtYmVyRmVhdHVyZUNhbGxBY2Nlc3MoKS5nZXRDb21tYUtleXdvcmRfMV8xXzFfMl8wKCkpOyAKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1hdGNoKGlucHV0LDExNSxGT0xMT1dfMik7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CisgICAgICAgICAgICBtYXRjaChpbnB1dCwxMjUsRk9MTE9XXzIpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOwogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBhZnRlcihncmFtbWFyQWNjZXNzLmdldFhNZW1iZXJGZWF0dXJlQ2FsbEFjY2VzcygpLmdldENvbW1hS2V5d29yZF8xXzFfMV8yXzAoKSk7IAogICAgICAgICAgICAgfQpAQCAtNDUyMDgsMTQgKzQ5NjY1LDE0IEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19Hcm91cF8xXzFfMV8yX18xIgotICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEzNTMxOjE6IHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fR3JvdXBfMV8xXzFfMl9fMSA6IHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fR3JvdXBfMV8xXzFfMl9fMV9fSW1wbCA7CisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTQ4Njk6MTogcnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19Hcm91cF8xXzFfMV8yX18xIDogcnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19Hcm91cF8xXzFfMV8yX18xX19JbXBsIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX0dyb3VwXzFfMV8xXzJfXzEoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTM1MzU6MTogKCBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX0dyb3VwXzFfMV8xXzJfXzFfX0ltcGwgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTM1MzY6MjogcnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19Hcm91cF8xXzFfMV8yX18xX19JbXBsCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNDg3MzoxOiAoIHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fR3JvdXBfMV8xXzFfMl9fMV9fSW1wbCApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNDg3NDoyOiBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX0dyb3VwXzFfMV8xXzJfXzFfX0ltcGwKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzIpOwogICAgICAgICAgICAgcnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19Hcm91cF8xXzFfMV8yX18xX19JbXBsKCk7CkBAIC00NTI0MSwyMyArNDk2OTgsMjMgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX0dyb3VwXzFfMV8xXzJfXzFfX0ltcGwiCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTM1NDI6MTogcnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19Hcm91cF8xXzFfMV8yX18xX19JbXBsIDogKCAoIHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fVHlwZUFyZ3VtZW50c0Fzc2lnbm1lbnRfMV8xXzFfMl8xICkgKSA7CisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTQ4ODA6MTogcnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19Hcm91cF8xXzFfMV8yX18xX19JbXBsIDogKCAoIHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fVHlwZUFyZ3VtZW50c0Fzc2lnbm1lbnRfMV8xXzFfMl8xICkgKSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19Hcm91cF8xXzFfMV8yX18xX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEzNTQ2OjE6ICggKCAoIHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fVHlwZUFyZ3VtZW50c0Fzc2lnbm1lbnRfMV8xXzFfMl8xICkgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMzU0NzoxOiAoICggcnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19UeXBlQXJndW1lbnRzQXNzaWdubWVudF8xXzFfMV8yXzEgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNDg4NDoxOiAoICggKCBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX1R5cGVBcmd1bWVudHNBc3NpZ25tZW50XzFfMV8xXzJfMSApICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTQ4ODU6MTogKCAoIHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fVHlwZUFyZ3VtZW50c0Fzc2lnbm1lbnRfMV8xXzFfMl8xICkgKQogICAgICAgICAgICAgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTM1NDc6MTogKCAoIHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fVHlwZUFyZ3VtZW50c0Fzc2lnbm1lbnRfMV8xXzFfMl8xICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTM1NDg6MjogKCBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX1R5cGVBcmd1bWVudHNBc3NpZ25tZW50XzFfMV8xXzJfMSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNDg4NToxOiAoICggcnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19UeXBlQXJndW1lbnRzQXNzaWdubWVudF8xXzFfMV8yXzEgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNDg4NjoyOiAoIHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fVHlwZUFyZ3VtZW50c0Fzc2lnbm1lbnRfMV8xXzFfMl8xICkKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WE1lbWJlckZlYXR1cmVDYWxsQWNjZXNzKCkuZ2V0VHlwZUFyZ3VtZW50c0Fzc2lnbm1lbnRfMV8xXzFfMl8xKCkpOyAKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEzNTQ5OjI6ICggcnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19UeXBlQXJndW1lbnRzQXNzaWdubWVudF8xXzFfMV8yXzEgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTM1NDk6MzogcnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19UeXBlQXJndW1lbnRzQXNzaWdubWVudF8xXzFfMV8yXzEKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE0ODg3OjI6ICggcnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19UeXBlQXJndW1lbnRzQXNzaWdubWVudF8xXzFfMV8yXzEgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTQ4ODc6MzogcnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19UeXBlQXJndW1lbnRzQXNzaWdubWVudF8xXzFfMV8yXzEKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzIpOwogICAgICAgICAgICAgcnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19UeXBlQXJndW1lbnRzQXNzaWdubWVudF8xXzFfMV8yXzEoKTsKQEAgLTQ1MjkyLDE2ICs0OTc0OSwxNiBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fR3JvdXBfMV8xXzNfXzAiCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTM1NTg6MTogcnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19Hcm91cF8xXzFfM19fMCA6IHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fR3JvdXBfMV8xXzNfXzBfX0ltcGwgcnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19Hcm91cF8xXzFfM19fMSA7CisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTQ4OTY6MTogcnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19Hcm91cF8xXzFfM19fMCA6IHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fR3JvdXBfMV8xXzNfXzBfX0ltcGwgcnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19Hcm91cF8xXzFfM19fMSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19Hcm91cF8xXzFfM19fMCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMzU2MjoxOiAoIHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fR3JvdXBfMV8xXzNfXzBfX0ltcGwgcnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19Hcm91cF8xXzFfM19fMSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMzU2MzoyOiBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX0dyb3VwXzFfMV8zX18wX19JbXBsIHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fR3JvdXBfMV8xXzNfXzEKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE0OTAwOjE6ICggcnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19Hcm91cF8xXzFfM19fMF9fSW1wbCBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX0dyb3VwXzFfMV8zX18xICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE0OTAxOjI6IHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fR3JvdXBfMV8xXzNfXzBfX0ltcGwgcnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19Hcm91cF8xXzFfM19fMQogICAgICAgICAgICAgewotICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMTEyKTsKKyAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzEyMCk7CiAgICAgICAgICAgICBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX0dyb3VwXzFfMV8zX18wX19JbXBsKCk7CiAKICAgICAgICAgICAgIHN0YXRlLl9mc3AtLTsKQEAgLTQ1MzMwLDIzICs0OTc4NywyMyBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fR3JvdXBfMV8xXzNfXzBfX0ltcGwiCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTM1NzA6MTogcnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19Hcm91cF8xXzFfM19fMF9fSW1wbCA6ICggKCBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX0V4cGxpY2l0T3BlcmF0aW9uQ2FsbEFzc2lnbm1lbnRfMV8xXzNfMCApICkgOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE0OTA4OjE6IHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fR3JvdXBfMV8xXzNfXzBfX0ltcGwgOiAoICggcnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19FeHBsaWNpdE9wZXJhdGlvbkNhbGxBc3NpZ25tZW50XzFfMV8zXzAgKSApIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX0dyb3VwXzFfMV8zX18wX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEzNTc0OjE6ICggKCAoIHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fRXhwbGljaXRPcGVyYXRpb25DYWxsQXNzaWdubWVudF8xXzFfM18wICkgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMzU3NToxOiAoICggcnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19FeHBsaWNpdE9wZXJhdGlvbkNhbGxBc3NpZ25tZW50XzFfMV8zXzAgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNDkxMjoxOiAoICggKCBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX0V4cGxpY2l0T3BlcmF0aW9uQ2FsbEFzc2lnbm1lbnRfMV8xXzNfMCApICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTQ5MTM6MTogKCAoIHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fRXhwbGljaXRPcGVyYXRpb25DYWxsQXNzaWdubWVudF8xXzFfM18wICkgKQogICAgICAgICAgICAgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTM1NzU6MTogKCAoIHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fRXhwbGljaXRPcGVyYXRpb25DYWxsQXNzaWdubWVudF8xXzFfM18wICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTM1NzY6MjogKCBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX0V4cGxpY2l0T3BlcmF0aW9uQ2FsbEFzc2lnbm1lbnRfMV8xXzNfMCApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNDkxMzoxOiAoICggcnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19FeHBsaWNpdE9wZXJhdGlvbkNhbGxBc3NpZ25tZW50XzFfMV8zXzAgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNDkxNDoyOiAoIHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fRXhwbGljaXRPcGVyYXRpb25DYWxsQXNzaWdubWVudF8xXzFfM18wICkKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WE1lbWJlckZlYXR1cmVDYWxsQWNjZXNzKCkuZ2V0RXhwbGljaXRPcGVyYXRpb25DYWxsQXNzaWdubWVudF8xXzFfM18wKCkpOyAKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEzNTc3OjI6ICggcnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19FeHBsaWNpdE9wZXJhdGlvbkNhbGxBc3NpZ25tZW50XzFfMV8zXzAgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTM1Nzc6MzogcnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19FeHBsaWNpdE9wZXJhdGlvbkNhbGxBc3NpZ25tZW50XzFfMV8zXzAKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE0OTE1OjI6ICggcnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19FeHBsaWNpdE9wZXJhdGlvbkNhbGxBc3NpZ25tZW50XzFfMV8zXzAgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTQ5MTU6MzogcnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19FeHBsaWNpdE9wZXJhdGlvbkNhbGxBc3NpZ25tZW50XzFfMV8zXzAKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzIpOwogICAgICAgICAgICAgcnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19FeHBsaWNpdE9wZXJhdGlvbkNhbGxBc3NpZ25tZW50XzFfMV8zXzAoKTsKQEAgLTQ1MzgxLDE2ICs0OTgzOCwxNiBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fR3JvdXBfMV8xXzNfXzEiCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTM1ODU6MTogcnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19Hcm91cF8xXzFfM19fMSA6IHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fR3JvdXBfMV8xXzNfXzFfX0ltcGwgcnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19Hcm91cF8xXzFfM19fMiA7CisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTQ5MjM6MTogcnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19Hcm91cF8xXzFfM19fMSA6IHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fR3JvdXBfMV8xXzNfXzFfX0ltcGwgcnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19Hcm91cF8xXzFfM19fMiA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19Hcm91cF8xXzFfM19fMSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMzU4OToxOiAoIHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fR3JvdXBfMV8xXzNfXzFfX0ltcGwgcnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19Hcm91cF8xXzFfM19fMiApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMzU5MDoyOiBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX0dyb3VwXzFfMV8zX18xX19JbXBsIHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fR3JvdXBfMV8xXzNfXzIKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE0OTI3OjE6ICggcnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19Hcm91cF8xXzFfM19fMV9fSW1wbCBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX0dyb3VwXzFfMV8zX18yICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE0OTI4OjI6IHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fR3JvdXBfMV8xXzNfXzFfX0ltcGwgcnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19Hcm91cF8xXzFfM19fMgogICAgICAgICAgICAgewotICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMTEyKTsKKyAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzEyMCk7CiAgICAgICAgICAgICBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX0dyb3VwXzFfMV8zX18xX19JbXBsKCk7CiAKICAgICAgICAgICAgIHN0YXRlLl9mc3AtLTsKQEAgLTQ1NDE5LDMxICs0OTg3NiwzMSBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fR3JvdXBfMV8xXzNfXzFfX0ltcGwiCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTM1OTc6MTogcnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19Hcm91cF8xXzFfM19fMV9fSW1wbCA6ICggKCBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX0FsdGVybmF0aXZlc18xXzFfM18xICk/ICkgOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE0OTM1OjE6IHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fR3JvdXBfMV8xXzNfXzFfX0ltcGwgOiAoICggcnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19BbHRlcm5hdGl2ZXNfMV8xXzNfMSApPyApIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX0dyb3VwXzFfMV8zX18xX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEzNjAxOjE6ICggKCAoIHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fQWx0ZXJuYXRpdmVzXzFfMV8zXzEgKT8gKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMzYwMjoxOiAoICggcnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19BbHRlcm5hdGl2ZXNfMV8xXzNfMSApPyApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNDkzOToxOiAoICggKCBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX0FsdGVybmF0aXZlc18xXzFfM18xICk/ICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTQ5NDA6MTogKCAoIHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fQWx0ZXJuYXRpdmVzXzFfMV8zXzEgKT8gKQogICAgICAgICAgICAgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTM2MDI6MTogKCAoIHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fQWx0ZXJuYXRpdmVzXzFfMV8zXzEgKT8gKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTM2MDM6MjogKCBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX0FsdGVybmF0aXZlc18xXzFfM18xICk/CisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNDk0MDoxOiAoICggcnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19BbHRlcm5hdGl2ZXNfMV8xXzNfMSApPyApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNDk0MToyOiAoIHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fQWx0ZXJuYXRpdmVzXzFfMV8zXzEgKT8KICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WE1lbWJlckZlYXR1cmVDYWxsQWNjZXNzKCkuZ2V0QWx0ZXJuYXRpdmVzXzFfMV8zXzEoKSk7IAogICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTM2MDQ6MjogKCBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX0FsdGVybmF0aXZlc18xXzFfM18xICk/Ci0gICAgICAgICAgICBpbnQgYWx0MTExPTI7Ci0gICAgICAgICAgICBpbnQgTEExMTFfMCA9IGlucHV0LkxBKDEpOworICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTQ5NDI6MjogKCBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX0FsdGVybmF0aXZlc18xXzFfM18xICk/CisgICAgICAgICAgICBpbnQgYWx0MTI0PTI7CisgICAgICAgICAgICBpbnQgTEExMjRfMCA9IGlucHV0LkxBKDEpOwogCi0gICAgICAgICAgICBpZiAoICgoTEExMTFfMD49UlVMRV9TVFJJTkcgJiYgTEExMTFfMDw9UlVMRV9ERUNJTUFMKXx8TEExMTFfMD09Mjd8fExBMTExXzA9PTMxfHwoTEExMTFfMD49MzQgJiYgTEExMTFfMDw9MzUpfHxMQTExMV8wPT00MHx8KExBMTExXzA+PTQ1ICYmIExBMTExXzA8PTUwKXx8TEExMTFfMD09NzB8fExBMTExXzA9PTk1fHxMQTExMV8wPT0xMTN8fChMQTExMV8wPj0xMTcgJiYgTEExMTFfMDw9MTE4KXx8TEExMTFfMD09MTIwfHxMQTExMV8wPT0xMjJ8fChMQTExMV8wPj0xMjYgJiYgTEExMTFfMDw9MTMzKXx8TEExMTFfMD09MTM1fHxMQTExMV8wPT0xNTJ8fExBMTExXzA9PTE1NCkgKSB7Ci0gICAgICAgICAgICAgICAgYWx0MTExPTE7CisgICAgICAgICAgICBpZiAoICgoTEExMjRfMD49UlVMRV9TVFJJTkcgJiYgTEExMjRfMDw9UlVMRV9ERUNJTUFMKXx8TEExMjRfMD09Mjd8fExBMTI0XzA9PTMxfHwoTEExMjRfMD49MzQgJiYgTEExMjRfMDw9MzUpfHxMQTEyNF8wPT00MHx8KExBMTI0XzA+PTQ1ICYmIExBMTI0XzA8PTUwKXx8TEExMjRfMD09NzV8fExBMTI0XzA9PTEwMnx8TEExMjRfMD09MTIzfHwoTEExMjRfMD49MTI3ICYmIExBMTI0XzA8PTEyOCl8fExBMTI0XzA9PTEzMHx8TEExMjRfMD09MTMyfHwoTEExMjRfMD49MTM2ICYmIExBMTI0XzA8PTE0Myl8fExBMTI0XzA9PTE0NXx8TEExMjRfMD09MTY0fHxMQTEyNF8wPT0xNjYpICkgeworICAgICAgICAgICAgICAgIGFsdDEyND0xOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgc3dpdGNoIChhbHQxMTEpIHsKKyAgICAgICAgICAgIHN3aXRjaCAoYWx0MTI0KSB7CiAgICAgICAgICAgICAgICAgY2FzZSAxIDoKLSAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTM2MDQ6MzogcnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19BbHRlcm5hdGl2ZXNfMV8xXzNfMQorICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNDk0MjozOiBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX0FsdGVybmF0aXZlc18xXzFfM18xCiAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMik7CiAgICAgICAgICAgICAgICAgICAgIHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fQWx0ZXJuYXRpdmVzXzFfMV8zXzEoKTsKQEAgLTQ1NDgxLDE0ICs0OTkzOCwxNCBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fR3JvdXBfMV8xXzNfXzIiCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTM2MTI6MTogcnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19Hcm91cF8xXzFfM19fMiA6IHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fR3JvdXBfMV8xXzNfXzJfX0ltcGwgOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE0OTUwOjE6IHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fR3JvdXBfMV8xXzNfXzIgOiBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX0dyb3VwXzFfMV8zX18yX19JbXBsIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX0dyb3VwXzFfMV8zX18yKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEzNjE2OjE6ICggcnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19Hcm91cF8xXzFfM19fMl9fSW1wbCApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMzYxNzoyOiBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX0dyb3VwXzFfMV8zX18yX19JbXBsCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNDk1NDoxOiAoIHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fR3JvdXBfMV8xXzNfXzJfX0ltcGwgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTQ5NTU6MjogcnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19Hcm91cF8xXzFfM19fMl9fSW1wbAogICAgICAgICAgICAgewogICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMik7CiAgICAgICAgICAgICBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX0dyb3VwXzFfMV8zX18yX19JbXBsKCk7CkBAIC00NTUxNCwyMiArNDk5NzEsMjIgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX0dyb3VwXzFfMV8zX18yX19JbXBsIgotICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEzNjIzOjE6IHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fR3JvdXBfMV8xXzNfXzJfX0ltcGwgOiAoICcpJyApIDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNDk2MToxOiBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX0dyb3VwXzFfMV8zX18yX19JbXBsIDogKCAnKScgKSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19Hcm91cF8xXzFfM19fMl9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMzYyNzoxOiAoICggJyknICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTM2Mjg6MTogKCAnKScgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTQ5NjU6MTogKCAoICcpJyApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE0OTY2OjE6ICggJyknICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEzNjI4OjE6ICggJyknICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEzNjI5OjI6ICcpJworICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTQ5NjY6MTogKCAnKScgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTQ5Njc6MjogJyknCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhNZW1iZXJGZWF0dXJlQ2FsbEFjY2VzcygpLmdldFJpZ2h0UGFyZW50aGVzaXNLZXl3b3JkXzFfMV8zXzIoKSk7IAogICAgICAgICAgICAgfQotICAgICAgICAgICAgbWF0Y2goaW5wdXQsMTE0LEZPTExPV18yKTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKKyAgICAgICAgICAgIG1hdGNoKGlucHV0LDEyNCxGT0xMT1dfMik7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0WE1lbWJlckZlYXR1cmVDYWxsQWNjZXNzKCkuZ2V0UmlnaHRQYXJlbnRoZXNpc0tleXdvcmRfMV8xXzNfMigpKTsgCiAgICAgICAgICAgICB9CkBAIC00NTU1NSwxNiArNTAwMTIsMTYgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX0dyb3VwXzFfMV8zXzFfMV9fMCIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMzYzOToxOiBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX0dyb3VwXzFfMV8zXzFfMV9fMCA6IHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fR3JvdXBfMV8xXzNfMV8xX18wX19JbXBsIHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fR3JvdXBfMV8xXzNfMV8xX18xIDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNDk3NzoxOiBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX0dyb3VwXzFfMV8zXzFfMV9fMCA6IHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fR3JvdXBfMV8xXzNfMV8xX18wX19JbXBsIHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fR3JvdXBfMV8xXzNfMV8xX18xIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX0dyb3VwXzFfMV8zXzFfMV9fMCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMzY0MzoxOiAoIHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fR3JvdXBfMV8xXzNfMV8xX18wX19JbXBsIHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fR3JvdXBfMV8xXzNfMV8xX18xICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEzNjQ0OjI6IHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fR3JvdXBfMV8xXzNfMV8xX18wX19JbXBsIHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fR3JvdXBfMV8xXzNfMV8xX18xCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNDk4MToxOiAoIHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fR3JvdXBfMV8xXzNfMV8xX18wX19JbXBsIHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fR3JvdXBfMV8xXzNfMV8xX18xICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE0OTgyOjI6IHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fR3JvdXBfMV8xXzNfMV8xX18wX19JbXBsIHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fR3JvdXBfMV8xXzNfMV8xX18xCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV183Mik7CisgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV184MCk7CiAgICAgICAgICAgICBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX0dyb3VwXzFfMV8zXzFfMV9fMF9fSW1wbCgpOwogCiAgICAgICAgICAgICBzdGF0ZS5fZnNwLS07CkBAIC00NTU5MywyMyArNTAwNTAsMjMgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX0dyb3VwXzFfMV8zXzFfMV9fMF9fSW1wbCIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMzY1MToxOiBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX0dyb3VwXzFfMV8zXzFfMV9fMF9fSW1wbCA6ICggKCBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX01lbWJlckNhbGxBcmd1bWVudHNBc3NpZ25tZW50XzFfMV8zXzFfMV8wICkgKSA7CisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTQ5ODk6MTogcnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19Hcm91cF8xXzFfM18xXzFfXzBfX0ltcGwgOiAoICggcnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19NZW1iZXJDYWxsQXJndW1lbnRzQXNzaWdubWVudF8xXzFfM18xXzFfMCApICkgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fR3JvdXBfMV8xXzNfMV8xX18wX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEzNjU1OjE6ICggKCAoIHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fTWVtYmVyQ2FsbEFyZ3VtZW50c0Fzc2lnbm1lbnRfMV8xXzNfMV8xXzAgKSApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEzNjU2OjE6ICggKCBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX01lbWJlckNhbGxBcmd1bWVudHNBc3NpZ25tZW50XzFfMV8zXzFfMV8wICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTQ5OTM6MTogKCAoICggcnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19NZW1iZXJDYWxsQXJndW1lbnRzQXNzaWdubWVudF8xXzFfM18xXzFfMCApICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTQ5OTQ6MTogKCAoIHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fTWVtYmVyQ2FsbEFyZ3VtZW50c0Fzc2lnbm1lbnRfMV8xXzNfMV8xXzAgKSApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMzY1NjoxOiAoICggcnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19NZW1iZXJDYWxsQXJndW1lbnRzQXNzaWdubWVudF8xXzFfM18xXzFfMCApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEzNjU3OjI6ICggcnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19NZW1iZXJDYWxsQXJndW1lbnRzQXNzaWdubWVudF8xXzFfM18xXzFfMCApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNDk5NDoxOiAoICggcnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19NZW1iZXJDYWxsQXJndW1lbnRzQXNzaWdubWVudF8xXzFfM18xXzFfMCApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE0OTk1OjI6ICggcnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19NZW1iZXJDYWxsQXJndW1lbnRzQXNzaWdubWVudF8xXzFfM18xXzFfMCApCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhNZW1iZXJGZWF0dXJlQ2FsbEFjY2VzcygpLmdldE1lbWJlckNhbGxBcmd1bWVudHNBc3NpZ25tZW50XzFfMV8zXzFfMV8wKCkpOyAKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEzNjU4OjI6ICggcnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19NZW1iZXJDYWxsQXJndW1lbnRzQXNzaWdubWVudF8xXzFfM18xXzFfMCApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMzY1ODozOiBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX01lbWJlckNhbGxBcmd1bWVudHNBc3NpZ25tZW50XzFfMV8zXzFfMV8wCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNDk5NjoyOiAoIHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fTWVtYmVyQ2FsbEFyZ3VtZW50c0Fzc2lnbm1lbnRfMV8xXzNfMV8xXzAgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTQ5OTY6MzogcnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19NZW1iZXJDYWxsQXJndW1lbnRzQXNzaWdubWVudF8xXzFfM18xXzFfMAogICAgICAgICAgICAgewogICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMik7CiAgICAgICAgICAgICBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX01lbWJlckNhbGxBcmd1bWVudHNBc3NpZ25tZW50XzFfMV8zXzFfMV8wKCk7CkBAIC00NTY0NCwxNCArNTAxMDEsMTQgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX0dyb3VwXzFfMV8zXzFfMV9fMSIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMzY2NjoxOiBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX0dyb3VwXzFfMV8zXzFfMV9fMSA6IHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fR3JvdXBfMV8xXzNfMV8xX18xX19JbXBsIDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNTAwNDoxOiBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX0dyb3VwXzFfMV8zXzFfMV9fMSA6IHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fR3JvdXBfMV8xXzNfMV8xX18xX19JbXBsIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX0dyb3VwXzFfMV8zXzFfMV9fMSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMzY3MDoxOiAoIHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fR3JvdXBfMV8xXzNfMV8xX18xX19JbXBsICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEzNjcxOjI6IHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fR3JvdXBfMV8xXzNfMV8xX18xX19JbXBsCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNTAwODoxOiAoIHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fR3JvdXBfMV8xXzNfMV8xX18xX19JbXBsICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE1MDA5OjI6IHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fR3JvdXBfMV8xXzNfMV8xX18xX19JbXBsCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV18yKTsKICAgICAgICAgICAgIHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fR3JvdXBfMV8xXzNfMV8xX18xX19JbXBsKCk7CkBAIC00NTY3NywzNyArNTAxMzQsMzcgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX0dyb3VwXzFfMV8zXzFfMV9fMV9fSW1wbCIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMzY3NzoxOiBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX0dyb3VwXzFfMV8zXzFfMV9fMV9fSW1wbCA6ICggKCBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX0dyb3VwXzFfMV8zXzFfMV8xX18wICkqICkgOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE1MDE1OjE6IHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fR3JvdXBfMV8xXzNfMV8xX18xX19JbXBsIDogKCAoIHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fR3JvdXBfMV8xXzNfMV8xXzFfXzAgKSogKSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19Hcm91cF8xXzFfM18xXzFfXzFfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTM2ODE6MTogKCAoICggcnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19Hcm91cF8xXzFfM18xXzFfMV9fMCApKiApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEzNjgyOjE6ICggKCBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX0dyb3VwXzFfMV8zXzFfMV8xX18wICkqICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE1MDE5OjE6ICggKCAoIHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fR3JvdXBfMV8xXzNfMV8xXzFfXzAgKSogKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNTAyMDoxOiAoICggcnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19Hcm91cF8xXzFfM18xXzFfMV9fMCApKiApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMzY4MjoxOiAoICggcnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19Hcm91cF8xXzFfM18xXzFfMV9fMCApKiApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMzY4MzoyOiAoIHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fR3JvdXBfMV8xXzNfMV8xXzFfXzAgKSoKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE1MDIwOjE6ICggKCBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX0dyb3VwXzFfMV8zXzFfMV8xX18wICkqICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE1MDIxOjI6ICggcnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19Hcm91cF8xXzFfM18xXzFfMV9fMCApKgogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYTWVtYmVyRmVhdHVyZUNhbGxBY2Nlc3MoKS5nZXRHcm91cF8xXzFfM18xXzFfMSgpKTsgCiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMzY4NDoyOiAoIHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fR3JvdXBfMV8xXzNfMV8xXzFfXzAgKSoKLSAgICAgICAgICAgIGxvb3AxMTI6CisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNTAyMjoyOiAoIHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fR3JvdXBfMV8xXzNfMV8xXzFfXzAgKSoKKyAgICAgICAgICAgIGxvb3AxMjU6CiAgICAgICAgICAgICBkbyB7Ci0gICAgICAgICAgICAgICAgaW50IGFsdDExMj0yOwotICAgICAgICAgICAgICAgIGludCBMQTExMl8wID0gaW5wdXQuTEEoMSk7CisgICAgICAgICAgICAgICAgaW50IGFsdDEyNT0yOworICAgICAgICAgICAgICAgIGludCBMQTEyNV8wID0gaW5wdXQuTEEoMSk7CiAKLSAgICAgICAgICAgICAgICBpZiAoIChMQTExMl8wPT0xMTUpICkgewotICAgICAgICAgICAgICAgICAgICBhbHQxMTI9MTsKKyAgICAgICAgICAgICAgICBpZiAoIChMQTEyNV8wPT0xMjUpICkgeworICAgICAgICAgICAgICAgICAgICBhbHQxMjU9MTsKICAgICAgICAgICAgICAgICB9CiAKIAotICAgICAgICAgICAgICAgIHN3aXRjaCAoYWx0MTEyKSB7CisgICAgICAgICAgICAgICAgc3dpdGNoIChhbHQxMjUpIHsKICAgICAgICAgICAgIAljYXNlIDEgOgotICAgICAgICAgICAgCSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMzY4NDozOiBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX0dyb3VwXzFfMV8zXzFfMV8xX18wCisgICAgICAgICAgICAJICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE1MDIyOjM6IHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fR3JvdXBfMV8xXzNfMV8xXzFfXzAKICAgICAgICAgICAgIAkgICAgewotICAgICAgICAgICAgCSAgICBwdXNoRm9sbG93KEZPTExPV183Myk7CisgICAgICAgICAgICAJICAgIHB1c2hGb2xsb3coRk9MTE9XXzgxKTsKICAgICAgICAgICAgIAkgICAgcnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19Hcm91cF8xXzFfM18xXzFfMV9fMCgpOwogCiAgICAgICAgICAgICAJICAgIHN0YXRlLl9mc3AtLTsKQEAgLTQ1NzE3LDcgKzUwMTc0LDcgQEAKICAgICAgICAgICAgIAkgICAgYnJlYWs7CiAKICAgICAgICAgICAgIAlkZWZhdWx0IDoKLSAgICAgICAgICAgIAkgICAgYnJlYWsgbG9vcDExMjsKKyAgICAgICAgICAgIAkgICAgYnJlYWsgbG9vcDEyNTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9IHdoaWxlICh0cnVlKTsKIApAQCAtNDU3NDYsMTYgKzUwMjAzLDE2IEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19Hcm91cF8xXzFfM18xXzFfMV9fMCIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMzY5MzoxOiBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX0dyb3VwXzFfMV8zXzFfMV8xX18wIDogcnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19Hcm91cF8xXzFfM18xXzFfMV9fMF9fSW1wbCBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX0dyb3VwXzFfMV8zXzFfMV8xX18xIDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNTAzMToxOiBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX0dyb3VwXzFfMV8zXzFfMV8xX18wIDogcnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19Hcm91cF8xXzFfM18xXzFfMV9fMF9fSW1wbCBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX0dyb3VwXzFfMV8zXzFfMV8xX18xIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX0dyb3VwXzFfMV8zXzFfMV8xX18wKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEzNjk3OjE6ICggcnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19Hcm91cF8xXzFfM18xXzFfMV9fMF9fSW1wbCBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX0dyb3VwXzFfMV8zXzFfMV8xX18xICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEzNjk4OjI6IHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fR3JvdXBfMV8xXzNfMV8xXzFfXzBfX0ltcGwgcnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19Hcm91cF8xXzFfM18xXzFfMV9fMQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTUwMzU6MTogKCBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX0dyb3VwXzFfMV8zXzFfMV8xX18wX19JbXBsIHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fR3JvdXBfMV8xXzNfMV8xXzFfXzEgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTUwMzY6MjogcnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19Hcm91cF8xXzFfM18xXzFfMV9fMF9fSW1wbCBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX0dyb3VwXzFfMV8zXzFfMV8xX18xCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV183NCk7CisgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV184Mik7CiAgICAgICAgICAgICBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX0dyb3VwXzFfMV8zXzFfMV8xX18wX19JbXBsKCk7CiAKICAgICAgICAgICAgIHN0YXRlLl9mc3AtLTsKQEAgLTQ1Nzg0LDIyICs1MDI0MSwyMiBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fR3JvdXBfMV8xXzNfMV8xXzFfXzBfX0ltcGwiCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTM3MDU6MTogcnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19Hcm91cF8xXzFfM18xXzFfMV9fMF9fSW1wbCA6ICggJywnICkgOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE1MDQzOjE6IHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fR3JvdXBfMV8xXzNfMV8xXzFfXzBfX0ltcGwgOiAoICcsJyApIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX0dyb3VwXzFfMV8zXzFfMV8xX18wX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEzNzA5OjE6ICggKCAnLCcgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMzcxMDoxOiAoICcsJyApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNTA0NzoxOiAoICggJywnICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTUwNDg6MTogKCAnLCcgKQogICAgICAgICAgICAgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTM3MTA6MTogKCAnLCcgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTM3MTE6MjogJywnCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNTA0ODoxOiAoICcsJyApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNTA0OToyOiAnLCcKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WE1lbWJlckZlYXR1cmVDYWxsQWNjZXNzKCkuZ2V0Q29tbWFLZXl3b3JkXzFfMV8zXzFfMV8xXzAoKSk7IAogICAgICAgICAgICAgfQotICAgICAgICAgICAgbWF0Y2goaW5wdXQsMTE1LEZPTExPV18yKTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKKyAgICAgICAgICAgIG1hdGNoKGlucHV0LDEyNSxGT0xMT1dfMik7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0WE1lbWJlckZlYXR1cmVDYWxsQWNjZXNzKCkuZ2V0Q29tbWFLZXl3b3JkXzFfMV8zXzFfMV8xXzAoKSk7IAogICAgICAgICAgICAgfQpAQCAtNDU4MjUsMTQgKzUwMjgyLDE0IEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19Hcm91cF8xXzFfM18xXzFfMV9fMSIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMzcyMDoxOiBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX0dyb3VwXzFfMV8zXzFfMV8xX18xIDogcnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19Hcm91cF8xXzFfM18xXzFfMV9fMV9fSW1wbCA7CisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTUwNTg6MTogcnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19Hcm91cF8xXzFfM18xXzFfMV9fMSA6IHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fR3JvdXBfMV8xXzNfMV8xXzFfXzFfX0ltcGwgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fR3JvdXBfMV8xXzNfMV8xXzFfXzEoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTM3MjQ6MTogKCBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX0dyb3VwXzFfMV8zXzFfMV8xX18xX19JbXBsICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEzNzI1OjI6IHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fR3JvdXBfMV8xXzNfMV8xXzFfXzFfX0ltcGwKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE1MDYyOjE6ICggcnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19Hcm91cF8xXzFfM18xXzFfMV9fMV9fSW1wbCApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNTA2MzoyOiBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX0dyb3VwXzFfMV8zXzFfMV8xX18xX19JbXBsCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV18yKTsKICAgICAgICAgICAgIHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fR3JvdXBfMV8xXzNfMV8xXzFfXzFfX0ltcGwoKTsKQEAgLTQ1ODU4LDIzICs1MDMxNSwyMyBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fR3JvdXBfMV8xXzNfMV8xXzFfXzFfX0ltcGwiCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTM3MzE6MTogcnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19Hcm91cF8xXzFfM18xXzFfMV9fMV9fSW1wbCA6ICggKCBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX01lbWJlckNhbGxBcmd1bWVudHNBc3NpZ25tZW50XzFfMV8zXzFfMV8xXzEgKSApIDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNTA2OToxOiBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX0dyb3VwXzFfMV8zXzFfMV8xX18xX19JbXBsIDogKCAoIHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fTWVtYmVyQ2FsbEFyZ3VtZW50c0Fzc2lnbm1lbnRfMV8xXzNfMV8xXzFfMSApICkgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fR3JvdXBfMV8xXzNfMV8xXzFfXzFfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTM3MzU6MTogKCAoICggcnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19NZW1iZXJDYWxsQXJndW1lbnRzQXNzaWdubWVudF8xXzFfM18xXzFfMV8xICkgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMzczNjoxOiAoICggcnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19NZW1iZXJDYWxsQXJndW1lbnRzQXNzaWdubWVudF8xXzFfM18xXzFfMV8xICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTUwNzM6MTogKCAoICggcnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19NZW1iZXJDYWxsQXJndW1lbnRzQXNzaWdubWVudF8xXzFfM18xXzFfMV8xICkgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNTA3NDoxOiAoICggcnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19NZW1iZXJDYWxsQXJndW1lbnRzQXNzaWdubWVudF8xXzFfM18xXzFfMV8xICkgKQogICAgICAgICAgICAgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTM3MzY6MTogKCAoIHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fTWVtYmVyQ2FsbEFyZ3VtZW50c0Fzc2lnbm1lbnRfMV8xXzNfMV8xXzFfMSApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEzNzM3OjI6ICggcnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19NZW1iZXJDYWxsQXJndW1lbnRzQXNzaWdubWVudF8xXzFfM18xXzFfMV8xICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE1MDc0OjE6ICggKCBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX01lbWJlckNhbGxBcmd1bWVudHNBc3NpZ25tZW50XzFfMV8zXzFfMV8xXzEgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNTA3NToyOiAoIHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fTWVtYmVyQ2FsbEFyZ3VtZW50c0Fzc2lnbm1lbnRfMV8xXzNfMV8xXzFfMSApCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhNZW1iZXJGZWF0dXJlQ2FsbEFjY2VzcygpLmdldE1lbWJlckNhbGxBcmd1bWVudHNBc3NpZ25tZW50XzFfMV8zXzFfMV8xXzEoKSk7IAogICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTM3Mzg6MjogKCBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX01lbWJlckNhbGxBcmd1bWVudHNBc3NpZ25tZW50XzFfMV8zXzFfMV8xXzEgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTM3Mzg6MzogcnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19NZW1iZXJDYWxsQXJndW1lbnRzQXNzaWdubWVudF8xXzFfM18xXzFfMV8xCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNTA3NjoyOiAoIHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fTWVtYmVyQ2FsbEFyZ3VtZW50c0Fzc2lnbm1lbnRfMV8xXzNfMV8xXzFfMSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNTA3NjozOiBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX01lbWJlckNhbGxBcmd1bWVudHNBc3NpZ25tZW50XzFfMV8zXzFfMV8xXzEKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzIpOwogICAgICAgICAgICAgcnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19NZW1iZXJDYWxsQXJndW1lbnRzQXNzaWdubWVudF8xXzFfM18xXzFfMV8xKCk7CkBAIC00NTkwOSwxNiArNTAzNjYsMTYgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YU2V0TGl0ZXJhbF9fR3JvdXBfXzAiCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTM3NDc6MTogcnVsZV9fWFNldExpdGVyYWxfX0dyb3VwX18wIDogcnVsZV9fWFNldExpdGVyYWxfX0dyb3VwX18wX19JbXBsIHJ1bGVfX1hTZXRMaXRlcmFsX19Hcm91cF9fMSA7CisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTUwODU6MTogcnVsZV9fWFNldExpdGVyYWxfX0dyb3VwX18wIDogcnVsZV9fWFNldExpdGVyYWxfX0dyb3VwX18wX19JbXBsIHJ1bGVfX1hTZXRMaXRlcmFsX19Hcm91cF9fMSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fWFNldExpdGVyYWxfX0dyb3VwX18wKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEzNzUxOjE6ICggcnVsZV9fWFNldExpdGVyYWxfX0dyb3VwX18wX19JbXBsIHJ1bGVfX1hTZXRMaXRlcmFsX19Hcm91cF9fMSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMzc1MjoyOiBydWxlX19YU2V0TGl0ZXJhbF9fR3JvdXBfXzBfX0ltcGwgcnVsZV9fWFNldExpdGVyYWxfX0dyb3VwX18xCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNTA4OToxOiAoIHJ1bGVfX1hTZXRMaXRlcmFsX19Hcm91cF9fMF9fSW1wbCBydWxlX19YU2V0TGl0ZXJhbF9fR3JvdXBfXzEgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTUwOTA6MjogcnVsZV9fWFNldExpdGVyYWxfX0dyb3VwX18wX19JbXBsIHJ1bGVfX1hTZXRMaXRlcmFsX19Hcm91cF9fMQogICAgICAgICAgICAgewotICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfNzcpOworICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfODUpOwogICAgICAgICAgICAgcnVsZV9fWFNldExpdGVyYWxfX0dyb3VwX18wX19JbXBsKCk7CiAKICAgICAgICAgICAgIHN0YXRlLl9mc3AtLTsKQEAgLTQ1OTQ3LDIzICs1MDQwNCwyMyBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX1hTZXRMaXRlcmFsX19Hcm91cF9fMF9fSW1wbCIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMzc1OToxOiBydWxlX19YU2V0TGl0ZXJhbF9fR3JvdXBfXzBfX0ltcGwgOiAoICgpICkgOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE1MDk3OjE6IHJ1bGVfX1hTZXRMaXRlcmFsX19Hcm91cF9fMF9fSW1wbCA6ICggKCkgKSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fWFNldExpdGVyYWxfX0dyb3VwX18wX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEzNzYzOjE6ICggKCAoKSApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEzNzY0OjE6ICggKCkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTUxMDE6MTogKCAoICgpICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTUxMDI6MTogKCAoKSApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMzc2NDoxOiAoICgpICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEzNzY1OjI6ICgpCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNTEwMjoxOiAoICgpICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE1MTAzOjI6ICgpCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhTZXRMaXRlcmFsQWNjZXNzKCkuZ2V0WFNldExpdGVyYWxBY3Rpb25fMCgpKTsgCiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMzc2NjoyOiAoKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTM3NjY6MzogCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNTEwNDoyOiAoKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTUxMDQ6MzogCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICB9CiAKQEAgLTQ1OTg4LDE0ICs1MDQ0NSwxNCBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX1hTZXRMaXRlcmFsX19Hcm91cF9fMSIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMzc3NDoxOiBydWxlX19YU2V0TGl0ZXJhbF9fR3JvdXBfXzEgOiBydWxlX19YU2V0TGl0ZXJhbF9fR3JvdXBfXzFfX0ltcGwgcnVsZV9fWFNldExpdGVyYWxfX0dyb3VwX18yIDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNTExMjoxOiBydWxlX19YU2V0TGl0ZXJhbF9fR3JvdXBfXzEgOiBydWxlX19YU2V0TGl0ZXJhbF9fR3JvdXBfXzFfX0ltcGwgcnVsZV9fWFNldExpdGVyYWxfX0dyb3VwX18yIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YU2V0TGl0ZXJhbF9fR3JvdXBfXzEoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTM3Nzg6MTogKCBydWxlX19YU2V0TGl0ZXJhbF9fR3JvdXBfXzFfX0ltcGwgcnVsZV9fWFNldExpdGVyYWxfX0dyb3VwX18yICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEzNzc5OjI6IHJ1bGVfX1hTZXRMaXRlcmFsX19Hcm91cF9fMV9fSW1wbCBydWxlX19YU2V0TGl0ZXJhbF9fR3JvdXBfXzIKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE1MTE2OjE6ICggcnVsZV9fWFNldExpdGVyYWxfX0dyb3VwX18xX19JbXBsIHJ1bGVfX1hTZXRMaXRlcmFsX19Hcm91cF9fMiApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNTExNzoyOiBydWxlX19YU2V0TGl0ZXJhbF9fR3JvdXBfXzFfX0ltcGwgcnVsZV9fWFNldExpdGVyYWxfX0dyb3VwX18yCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV18xMCk7CiAgICAgICAgICAgICBydWxlX19YU2V0TGl0ZXJhbF9fR3JvdXBfXzFfX0ltcGwoKTsKQEAgLTQ2MDI2LDIyICs1MDQ4MywyMiBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX1hTZXRMaXRlcmFsX19Hcm91cF9fMV9fSW1wbCIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMzc4NjoxOiBydWxlX19YU2V0TGl0ZXJhbF9fR3JvdXBfXzFfX0ltcGwgOiAoICcjJyApIDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNTEyNDoxOiBydWxlX19YU2V0TGl0ZXJhbF9fR3JvdXBfXzFfX0ltcGwgOiAoICcjJyApIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YU2V0TGl0ZXJhbF9fR3JvdXBfXzFfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTM3OTA6MTogKCAoICcjJyApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEzNzkxOjE6ICggJyMnICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE1MTI4OjE6ICggKCAnIycgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNTEyOToxOiAoICcjJyApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMzc5MToxOiAoICcjJyApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMzc5MjoyOiAnIycKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE1MTI5OjE6ICggJyMnICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE1MTMwOjI6ICcjJwogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYU2V0TGl0ZXJhbEFjY2VzcygpLmdldE51bWJlclNpZ25LZXl3b3JkXzEoKSk7IAogICAgICAgICAgICAgfQotICAgICAgICAgICAgbWF0Y2goaW5wdXQsMTE3LEZPTExPV18yKTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKKyAgICAgICAgICAgIG1hdGNoKGlucHV0LDEyNyxGT0xMT1dfMik7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0WFNldExpdGVyYWxBY2Nlc3MoKS5nZXROdW1iZXJTaWduS2V5d29yZF8xKCkpOyAKICAgICAgICAgICAgIH0KQEAgLTQ2MDY3LDE2ICs1MDUyNCwxNiBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX1hTZXRMaXRlcmFsX19Hcm91cF9fMiIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMzgwMToxOiBydWxlX19YU2V0TGl0ZXJhbF9fR3JvdXBfXzIgOiBydWxlX19YU2V0TGl0ZXJhbF9fR3JvdXBfXzJfX0ltcGwgcnVsZV9fWFNldExpdGVyYWxfX0dyb3VwX18zIDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNTEzOToxOiBydWxlX19YU2V0TGl0ZXJhbF9fR3JvdXBfXzIgOiBydWxlX19YU2V0TGl0ZXJhbF9fR3JvdXBfXzJfX0ltcGwgcnVsZV9fWFNldExpdGVyYWxfX0dyb3VwX18zIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YU2V0TGl0ZXJhbF9fR3JvdXBfXzIoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTM4MDU6MTogKCBydWxlX19YU2V0TGl0ZXJhbF9fR3JvdXBfXzJfX0ltcGwgcnVsZV9fWFNldExpdGVyYWxfX0dyb3VwX18zICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEzODA2OjI6IHJ1bGVfX1hTZXRMaXRlcmFsX19Hcm91cF9fMl9fSW1wbCBydWxlX19YU2V0TGl0ZXJhbF9fR3JvdXBfXzMKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE1MTQzOjE6ICggcnVsZV9fWFNldExpdGVyYWxfX0dyb3VwX18yX19JbXBsIHJ1bGVfX1hTZXRMaXRlcmFsX19Hcm91cF9fMyApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNTE0NDoyOiBydWxlX19YU2V0TGl0ZXJhbF9fR3JvdXBfXzJfX0ltcGwgcnVsZV9fWFNldExpdGVyYWxfX0dyb3VwX18zCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV18xMTMpOworICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMTIxKTsKICAgICAgICAgICAgIHJ1bGVfX1hTZXRMaXRlcmFsX19Hcm91cF9fMl9fSW1wbCgpOwogCiAgICAgICAgICAgICBzdGF0ZS5fZnNwLS07CkBAIC00NjEwNSwyMiArNTA1NjIsMjIgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YU2V0TGl0ZXJhbF9fR3JvdXBfXzJfX0ltcGwiCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTM4MTM6MTogcnVsZV9fWFNldExpdGVyYWxfX0dyb3VwX18yX19JbXBsIDogKCAneycgKSA7CisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTUxNTE6MTogcnVsZV9fWFNldExpdGVyYWxfX0dyb3VwX18yX19JbXBsIDogKCAneycgKSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fWFNldExpdGVyYWxfX0dyb3VwX18yX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEzODE3OjE6ICggKCAneycgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMzgxODoxOiAoICd7JyApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNTE1NToxOiAoICggJ3snICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTUxNTY6MTogKCAneycgKQogICAgICAgICAgICAgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTM4MTg6MTogKCAneycgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTM4MTk6MjogJ3snCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNTE1NjoxOiAoICd7JyApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNTE1NzoyOiAneycKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WFNldExpdGVyYWxBY2Nlc3MoKS5nZXRMZWZ0Q3VybHlCcmFja2V0S2V5d29yZF8yKCkpOyAKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1hdGNoKGlucHV0LDcwLEZPTExPV18yKTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKKyAgICAgICAgICAgIG1hdGNoKGlucHV0LDc1LEZPTExPV18yKTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRYU2V0TGl0ZXJhbEFjY2VzcygpLmdldExlZnRDdXJseUJyYWNrZXRLZXl3b3JkXzIoKSk7IAogICAgICAgICAgICAgfQpAQCAtNDYxNDYsMTYgKzUwNjAzLDE2IEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fWFNldExpdGVyYWxfX0dyb3VwX18zIgotICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEzODI4OjE6IHJ1bGVfX1hTZXRMaXRlcmFsX19Hcm91cF9fMyA6IHJ1bGVfX1hTZXRMaXRlcmFsX19Hcm91cF9fM19fSW1wbCBydWxlX19YU2V0TGl0ZXJhbF9fR3JvdXBfXzQgOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE1MTY2OjE6IHJ1bGVfX1hTZXRMaXRlcmFsX19Hcm91cF9fMyA6IHJ1bGVfX1hTZXRMaXRlcmFsX19Hcm91cF9fM19fSW1wbCBydWxlX19YU2V0TGl0ZXJhbF9fR3JvdXBfXzQgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1hTZXRMaXRlcmFsX19Hcm91cF9fMygpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMzgzMjoxOiAoIHJ1bGVfX1hTZXRMaXRlcmFsX19Hcm91cF9fM19fSW1wbCBydWxlX19YU2V0TGl0ZXJhbF9fR3JvdXBfXzQgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTM4MzM6MjogcnVsZV9fWFNldExpdGVyYWxfX0dyb3VwX18zX19JbXBsIHJ1bGVfX1hTZXRMaXRlcmFsX19Hcm91cF9fNAorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTUxNzA6MTogKCBydWxlX19YU2V0TGl0ZXJhbF9fR3JvdXBfXzNfX0ltcGwgcnVsZV9fWFNldExpdGVyYWxfX0dyb3VwX180ICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE1MTcxOjI6IHJ1bGVfX1hTZXRMaXRlcmFsX19Hcm91cF9fM19fSW1wbCBydWxlX19YU2V0TGl0ZXJhbF9fR3JvdXBfXzQKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzExMyk7CisgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV18xMjEpOwogICAgICAgICAgICAgcnVsZV9fWFNldExpdGVyYWxfX0dyb3VwX18zX19JbXBsKCk7CiAKICAgICAgICAgICAgIHN0YXRlLl9mc3AtLTsKQEAgLTQ2MTg0LDMxICs1MDY0MSwzMSBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX1hTZXRMaXRlcmFsX19Hcm91cF9fM19fSW1wbCIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMzg0MDoxOiBydWxlX19YU2V0TGl0ZXJhbF9fR3JvdXBfXzNfX0ltcGwgOiAoICggcnVsZV9fWFNldExpdGVyYWxfX0dyb3VwXzNfXzAgKT8gKSA7CisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTUxNzg6MTogcnVsZV9fWFNldExpdGVyYWxfX0dyb3VwX18zX19JbXBsIDogKCAoIHJ1bGVfX1hTZXRMaXRlcmFsX19Hcm91cF8zX18wICk/ICkgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1hTZXRMaXRlcmFsX19Hcm91cF9fM19fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMzg0NDoxOiAoICggKCBydWxlX19YU2V0TGl0ZXJhbF9fR3JvdXBfM19fMCApPyApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEzODQ1OjE6ICggKCBydWxlX19YU2V0TGl0ZXJhbF9fR3JvdXBfM19fMCApPyApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNTE4MjoxOiAoICggKCBydWxlX19YU2V0TGl0ZXJhbF9fR3JvdXBfM19fMCApPyApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE1MTgzOjE6ICggKCBydWxlX19YU2V0TGl0ZXJhbF9fR3JvdXBfM19fMCApPyApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMzg0NToxOiAoICggcnVsZV9fWFNldExpdGVyYWxfX0dyb3VwXzNfXzAgKT8gKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTM4NDY6MjogKCBydWxlX19YU2V0TGl0ZXJhbF9fR3JvdXBfM19fMCApPworICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTUxODM6MTogKCAoIHJ1bGVfX1hTZXRMaXRlcmFsX19Hcm91cF8zX18wICk/ICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE1MTg0OjI6ICggcnVsZV9fWFNldExpdGVyYWxfX0dyb3VwXzNfXzAgKT8KICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WFNldExpdGVyYWxBY2Nlc3MoKS5nZXRHcm91cF8zKCkpOyAKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEzODQ3OjI6ICggcnVsZV9fWFNldExpdGVyYWxfX0dyb3VwXzNfXzAgKT8KLSAgICAgICAgICAgIGludCBhbHQxMTM9MjsKLSAgICAgICAgICAgIGludCBMQTExM18wID0gaW5wdXQuTEEoMSk7CisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNTE4NToyOiAoIHJ1bGVfX1hTZXRMaXRlcmFsX19Hcm91cF8zX18wICk/CisgICAgICAgICAgICBpbnQgYWx0MTI2PTI7CisgICAgICAgICAgICBpbnQgTEExMjZfMCA9IGlucHV0LkxBKDEpOwogCi0gICAgICAgICAgICBpZiAoICgoTEExMTNfMD49UlVMRV9TVFJJTkcgJiYgTEExMTNfMDw9UlVMRV9ERUNJTUFMKXx8TEExMTNfMD09Mjd8fChMQTExM18wPj0zNCAmJiBMQTExM18wPD0zNSl8fExBMTEzXzA9PTQwfHwoTEExMTNfMD49NDUgJiYgTEExMTNfMDw9NTApfHxMQTExM18wPT03MHx8TEExMTNfMD09OTV8fExBMTEzXzA9PTExM3x8KExBMTEzXzA+PTExNyAmJiBMQTExM18wPD0xMTgpfHxMQTExM18wPT0xMjB8fExBMTEzXzA9PTEyMnx8KExBMTEzXzA+PTEyNiAmJiBMQTExM18wPD0xMzMpfHxMQTExM18wPT0xMzV8fExBMTEzXzA9PTE1NCkgKSB7Ci0gICAgICAgICAgICAgICAgYWx0MTEzPTE7CisgICAgICAgICAgICBpZiAoICgoTEExMjZfMD49UlVMRV9TVFJJTkcgJiYgTEExMjZfMDw9UlVMRV9ERUNJTUFMKXx8TEExMjZfMD09Mjd8fChMQTEyNl8wPj0zNCAmJiBMQTEyNl8wPD0zNSl8fExBMTI2XzA9PTQwfHwoTEExMjZfMD49NDUgJiYgTEExMjZfMDw9NTApfHxMQTEyNl8wPT03NXx8TEExMjZfMD09MTAyfHxMQTEyNl8wPT0xMjN8fChMQTEyNl8wPj0xMjcgJiYgTEExMjZfMDw9MTI4KXx8TEExMjZfMD09MTMwfHxMQTEyNl8wPT0xMzJ8fChMQTEyNl8wPj0xMzYgJiYgTEExMjZfMDw9MTQzKXx8TEExMjZfMD09MTQ1fHxMQTEyNl8wPT0xNjYpICkgeworICAgICAgICAgICAgICAgIGFsdDEyNj0xOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgc3dpdGNoIChhbHQxMTMpIHsKKyAgICAgICAgICAgIHN3aXRjaCAoYWx0MTI2KSB7CiAgICAgICAgICAgICAgICAgY2FzZSAxIDoKLSAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTM4NDc6MzogcnVsZV9fWFNldExpdGVyYWxfX0dyb3VwXzNfXzAKKyAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTUxODU6MzogcnVsZV9fWFNldExpdGVyYWxfX0dyb3VwXzNfXzAKICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV18yKTsKICAgICAgICAgICAgICAgICAgICAgcnVsZV9fWFNldExpdGVyYWxfX0dyb3VwXzNfXzAoKTsKQEAgLTQ2MjQ2LDE0ICs1MDcwMywxNCBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX1hTZXRMaXRlcmFsX19Hcm91cF9fNCIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMzg1NToxOiBydWxlX19YU2V0TGl0ZXJhbF9fR3JvdXBfXzQgOiBydWxlX19YU2V0TGl0ZXJhbF9fR3JvdXBfXzRfX0ltcGwgOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE1MTkzOjE6IHJ1bGVfX1hTZXRMaXRlcmFsX19Hcm91cF9fNCA6IHJ1bGVfX1hTZXRMaXRlcmFsX19Hcm91cF9fNF9fSW1wbCA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fWFNldExpdGVyYWxfX0dyb3VwX180KCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEzODU5OjE6ICggcnVsZV9fWFNldExpdGVyYWxfX0dyb3VwX180X19JbXBsICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEzODYwOjI6IHJ1bGVfX1hTZXRMaXRlcmFsX19Hcm91cF9fNF9fSW1wbAorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTUxOTc6MTogKCBydWxlX19YU2V0TGl0ZXJhbF9fR3JvdXBfXzRfX0ltcGwgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTUxOTg6MjogcnVsZV9fWFNldExpdGVyYWxfX0dyb3VwX180X19JbXBsCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV18yKTsKICAgICAgICAgICAgIHJ1bGVfX1hTZXRMaXRlcmFsX19Hcm91cF9fNF9fSW1wbCgpOwpAQCAtNDYyNzksMjIgKzUwNzM2LDIyIEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fWFNldExpdGVyYWxfX0dyb3VwX180X19JbXBsIgotICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEzODY2OjE6IHJ1bGVfX1hTZXRMaXRlcmFsX19Hcm91cF9fNF9fSW1wbCA6ICggJ30nICkgOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE1MjA0OjE6IHJ1bGVfX1hTZXRMaXRlcmFsX19Hcm91cF9fNF9fSW1wbCA6ICggJ30nICkgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1hTZXRMaXRlcmFsX19Hcm91cF9fNF9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMzg3MDoxOiAoICggJ30nICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTM4NzE6MTogKCAnfScgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTUyMDg6MTogKCAoICd9JyApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE1MjA5OjE6ICggJ30nICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEzODcxOjE6ICggJ30nICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEzODcyOjI6ICd9JworICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTUyMDk6MTogKCAnfScgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTUyMTA6MjogJ30nCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhTZXRMaXRlcmFsQWNjZXNzKCkuZ2V0UmlnaHRDdXJseUJyYWNrZXRLZXl3b3JkXzQoKSk7IAogICAgICAgICAgICAgfQotICAgICAgICAgICAgbWF0Y2goaW5wdXQsNzEsRk9MTE9XXzIpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOworICAgICAgICAgICAgbWF0Y2goaW5wdXQsNzYsRk9MTE9XXzIpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOwogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBhZnRlcihncmFtbWFyQWNjZXNzLmdldFhTZXRMaXRlcmFsQWNjZXNzKCkuZ2V0UmlnaHRDdXJseUJyYWNrZXRLZXl3b3JkXzQoKSk7IAogICAgICAgICAgICAgfQpAQCAtNDYzMjAsMTYgKzUwNzc3LDE2IEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fWFNldExpdGVyYWxfX0dyb3VwXzNfXzAiCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTM4ODI6MTogcnVsZV9fWFNldExpdGVyYWxfX0dyb3VwXzNfXzAgOiBydWxlX19YU2V0TGl0ZXJhbF9fR3JvdXBfM19fMF9fSW1wbCBydWxlX19YU2V0TGl0ZXJhbF9fR3JvdXBfM19fMSA7CisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTUyMjA6MTogcnVsZV9fWFNldExpdGVyYWxfX0dyb3VwXzNfXzAgOiBydWxlX19YU2V0TGl0ZXJhbF9fR3JvdXBfM19fMF9fSW1wbCBydWxlX19YU2V0TGl0ZXJhbF9fR3JvdXBfM19fMSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fWFNldExpdGVyYWxfX0dyb3VwXzNfXzAoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTM4ODY6MTogKCBydWxlX19YU2V0TGl0ZXJhbF9fR3JvdXBfM19fMF9fSW1wbCBydWxlX19YU2V0TGl0ZXJhbF9fR3JvdXBfM19fMSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMzg4NzoyOiBydWxlX19YU2V0TGl0ZXJhbF9fR3JvdXBfM19fMF9fSW1wbCBydWxlX19YU2V0TGl0ZXJhbF9fR3JvdXBfM19fMQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTUyMjQ6MTogKCBydWxlX19YU2V0TGl0ZXJhbF9fR3JvdXBfM19fMF9fSW1wbCBydWxlX19YU2V0TGl0ZXJhbF9fR3JvdXBfM19fMSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNTIyNToyOiBydWxlX19YU2V0TGl0ZXJhbF9fR3JvdXBfM19fMF9fSW1wbCBydWxlX19YU2V0TGl0ZXJhbF9fR3JvdXBfM19fMQogICAgICAgICAgICAgewotICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfNzIpOworICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfODApOwogICAgICAgICAgICAgcnVsZV9fWFNldExpdGVyYWxfX0dyb3VwXzNfXzBfX0ltcGwoKTsKIAogICAgICAgICAgICAgc3RhdGUuX2ZzcC0tOwpAQCAtNDYzNTgsMjMgKzUwODE1LDIzIEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fWFNldExpdGVyYWxfX0dyb3VwXzNfXzBfX0ltcGwiCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTM4OTQ6MTogcnVsZV9fWFNldExpdGVyYWxfX0dyb3VwXzNfXzBfX0ltcGwgOiAoICggcnVsZV9fWFNldExpdGVyYWxfX0VsZW1lbnRzQXNzaWdubWVudF8zXzAgKSApIDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNTIzMjoxOiBydWxlX19YU2V0TGl0ZXJhbF9fR3JvdXBfM19fMF9fSW1wbCA6ICggKCBydWxlX19YU2V0TGl0ZXJhbF9fRWxlbWVudHNBc3NpZ25tZW50XzNfMCApICkgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1hTZXRMaXRlcmFsX19Hcm91cF8zX18wX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEzODk4OjE6ICggKCAoIHJ1bGVfX1hTZXRMaXRlcmFsX19FbGVtZW50c0Fzc2lnbm1lbnRfM18wICkgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMzg5OToxOiAoICggcnVsZV9fWFNldExpdGVyYWxfX0VsZW1lbnRzQXNzaWdubWVudF8zXzAgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNTIzNjoxOiAoICggKCBydWxlX19YU2V0TGl0ZXJhbF9fRWxlbWVudHNBc3NpZ25tZW50XzNfMCApICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTUyMzc6MTogKCAoIHJ1bGVfX1hTZXRMaXRlcmFsX19FbGVtZW50c0Fzc2lnbm1lbnRfM18wICkgKQogICAgICAgICAgICAgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTM4OTk6MTogKCAoIHJ1bGVfX1hTZXRMaXRlcmFsX19FbGVtZW50c0Fzc2lnbm1lbnRfM18wICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTM5MDA6MjogKCBydWxlX19YU2V0TGl0ZXJhbF9fRWxlbWVudHNBc3NpZ25tZW50XzNfMCApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNTIzNzoxOiAoICggcnVsZV9fWFNldExpdGVyYWxfX0VsZW1lbnRzQXNzaWdubWVudF8zXzAgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNTIzODoyOiAoIHJ1bGVfX1hTZXRMaXRlcmFsX19FbGVtZW50c0Fzc2lnbm1lbnRfM18wICkKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WFNldExpdGVyYWxBY2Nlc3MoKS5nZXRFbGVtZW50c0Fzc2lnbm1lbnRfM18wKCkpOyAKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEzOTAxOjI6ICggcnVsZV9fWFNldExpdGVyYWxfX0VsZW1lbnRzQXNzaWdubWVudF8zXzAgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTM5MDE6MzogcnVsZV9fWFNldExpdGVyYWxfX0VsZW1lbnRzQXNzaWdubWVudF8zXzAKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE1MjM5OjI6ICggcnVsZV9fWFNldExpdGVyYWxfX0VsZW1lbnRzQXNzaWdubWVudF8zXzAgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTUyMzk6MzogcnVsZV9fWFNldExpdGVyYWxfX0VsZW1lbnRzQXNzaWdubWVudF8zXzAKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzIpOwogICAgICAgICAgICAgcnVsZV9fWFNldExpdGVyYWxfX0VsZW1lbnRzQXNzaWdubWVudF8zXzAoKTsKQEAgLTQ2NDA5LDE0ICs1MDg2NiwxNCBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX1hTZXRMaXRlcmFsX19Hcm91cF8zX18xIgotICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEzOTA5OjE6IHJ1bGVfX1hTZXRMaXRlcmFsX19Hcm91cF8zX18xIDogcnVsZV9fWFNldExpdGVyYWxfX0dyb3VwXzNfXzFfX0ltcGwgOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE1MjQ3OjE6IHJ1bGVfX1hTZXRMaXRlcmFsX19Hcm91cF8zX18xIDogcnVsZV9fWFNldExpdGVyYWxfX0dyb3VwXzNfXzFfX0ltcGwgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1hTZXRMaXRlcmFsX19Hcm91cF8zX18xKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEzOTEzOjE6ICggcnVsZV9fWFNldExpdGVyYWxfX0dyb3VwXzNfXzFfX0ltcGwgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTM5MTQ6MjogcnVsZV9fWFNldExpdGVyYWxfX0dyb3VwXzNfXzFfX0ltcGwKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE1MjUxOjE6ICggcnVsZV9fWFNldExpdGVyYWxfX0dyb3VwXzNfXzFfX0ltcGwgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTUyNTI6MjogcnVsZV9fWFNldExpdGVyYWxfX0dyb3VwXzNfXzFfX0ltcGwKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzIpOwogICAgICAgICAgICAgcnVsZV9fWFNldExpdGVyYWxfX0dyb3VwXzNfXzFfX0ltcGwoKTsKQEAgLTQ2NDQyLDM3ICs1MDg5OSwzNyBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX1hTZXRMaXRlcmFsX19Hcm91cF8zX18xX19JbXBsIgotICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEzOTIwOjE6IHJ1bGVfX1hTZXRMaXRlcmFsX19Hcm91cF8zX18xX19JbXBsIDogKCAoIHJ1bGVfX1hTZXRMaXRlcmFsX19Hcm91cF8zXzFfXzAgKSogKSA7CisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTUyNTg6MTogcnVsZV9fWFNldExpdGVyYWxfX0dyb3VwXzNfXzFfX0ltcGwgOiAoICggcnVsZV9fWFNldExpdGVyYWxfX0dyb3VwXzNfMV9fMCApKiApIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YU2V0TGl0ZXJhbF9fR3JvdXBfM19fMV9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMzkyNDoxOiAoICggKCBydWxlX19YU2V0TGl0ZXJhbF9fR3JvdXBfM18xX18wICkqICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTM5MjU6MTogKCAoIHJ1bGVfX1hTZXRMaXRlcmFsX19Hcm91cF8zXzFfXzAgKSogKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTUyNjI6MTogKCAoICggcnVsZV9fWFNldExpdGVyYWxfX0dyb3VwXzNfMV9fMCApKiApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE1MjYzOjE6ICggKCBydWxlX19YU2V0TGl0ZXJhbF9fR3JvdXBfM18xX18wICkqICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEzOTI1OjE6ICggKCBydWxlX19YU2V0TGl0ZXJhbF9fR3JvdXBfM18xX18wICkqICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEzOTI2OjI6ICggcnVsZV9fWFNldExpdGVyYWxfX0dyb3VwXzNfMV9fMCApKgorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTUyNjM6MTogKCAoIHJ1bGVfX1hTZXRMaXRlcmFsX19Hcm91cF8zXzFfXzAgKSogKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTUyNjQ6MjogKCBydWxlX19YU2V0TGl0ZXJhbF9fR3JvdXBfM18xX18wICkqCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhTZXRMaXRlcmFsQWNjZXNzKCkuZ2V0R3JvdXBfM18xKCkpOyAKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEzOTI3OjI6ICggcnVsZV9fWFNldExpdGVyYWxfX0dyb3VwXzNfMV9fMCApKgotICAgICAgICAgICAgbG9vcDExNDoKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE1MjY1OjI6ICggcnVsZV9fWFNldExpdGVyYWxfX0dyb3VwXzNfMV9fMCApKgorICAgICAgICAgICAgbG9vcDEyNzoKICAgICAgICAgICAgIGRvIHsKLSAgICAgICAgICAgICAgICBpbnQgYWx0MTE0PTI7Ci0gICAgICAgICAgICAgICAgaW50IExBMTE0XzAgPSBpbnB1dC5MQSgxKTsKKyAgICAgICAgICAgICAgICBpbnQgYWx0MTI3PTI7CisgICAgICAgICAgICAgICAgaW50IExBMTI3XzAgPSBpbnB1dC5MQSgxKTsKIAotICAgICAgICAgICAgICAgIGlmICggKExBMTE0XzA9PTExNSkgKSB7Ci0gICAgICAgICAgICAgICAgICAgIGFsdDExND0xOworICAgICAgICAgICAgICAgIGlmICggKExBMTI3XzA9PTEyNSkgKSB7CisgICAgICAgICAgICAgICAgICAgIGFsdDEyNz0xOwogICAgICAgICAgICAgICAgIH0KIAogCi0gICAgICAgICAgICAgICAgc3dpdGNoIChhbHQxMTQpIHsKKyAgICAgICAgICAgICAgICBzd2l0Y2ggKGFsdDEyNykgewogICAgICAgICAgICAgCWNhc2UgMSA6Ci0gICAgICAgICAgICAJICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEzOTI3OjM6IHJ1bGVfX1hTZXRMaXRlcmFsX19Hcm91cF8zXzFfXzAKKyAgICAgICAgICAgIAkgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTUyNjU6MzogcnVsZV9fWFNldExpdGVyYWxfX0dyb3VwXzNfMV9fMAogICAgICAgICAgICAgCSAgICB7Ci0gICAgICAgICAgICAJICAgIHB1c2hGb2xsb3coRk9MTE9XXzczKTsKKyAgICAgICAgICAgIAkgICAgcHVzaEZvbGxvdyhGT0xMT1dfODEpOwogICAgICAgICAgICAgCSAgICBydWxlX19YU2V0TGl0ZXJhbF9fR3JvdXBfM18xX18wKCk7CiAKICAgICAgICAgICAgIAkgICAgc3RhdGUuX2ZzcC0tOwpAQCAtNDY0ODIsNyArNTA5MzksNyBAQAogICAgICAgICAgICAgCSAgICBicmVhazsKIAogICAgICAgICAgICAgCWRlZmF1bHQgOgotICAgICAgICAgICAgCSAgICBicmVhayBsb29wMTE0OworICAgICAgICAgICAgCSAgICBicmVhayBsb29wMTI3OwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0gd2hpbGUgKHRydWUpOwogCkBAIC00NjUxMSwxNiArNTA5NjgsMTYgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YU2V0TGl0ZXJhbF9fR3JvdXBfM18xX18wIgotICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEzOTM2OjE6IHJ1bGVfX1hTZXRMaXRlcmFsX19Hcm91cF8zXzFfXzAgOiBydWxlX19YU2V0TGl0ZXJhbF9fR3JvdXBfM18xX18wX19JbXBsIHJ1bGVfX1hTZXRMaXRlcmFsX19Hcm91cF8zXzFfXzEgOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE1Mjc0OjE6IHJ1bGVfX1hTZXRMaXRlcmFsX19Hcm91cF8zXzFfXzAgOiBydWxlX19YU2V0TGl0ZXJhbF9fR3JvdXBfM18xX18wX19JbXBsIHJ1bGVfX1hTZXRMaXRlcmFsX19Hcm91cF8zXzFfXzEgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1hTZXRMaXRlcmFsX19Hcm91cF8zXzFfXzAoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTM5NDA6MTogKCBydWxlX19YU2V0TGl0ZXJhbF9fR3JvdXBfM18xX18wX19JbXBsIHJ1bGVfX1hTZXRMaXRlcmFsX19Hcm91cF8zXzFfXzEgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTM5NDE6MjogcnVsZV9fWFNldExpdGVyYWxfX0dyb3VwXzNfMV9fMF9fSW1wbCBydWxlX19YU2V0TGl0ZXJhbF9fR3JvdXBfM18xX18xCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNTI3ODoxOiAoIHJ1bGVfX1hTZXRMaXRlcmFsX19Hcm91cF8zXzFfXzBfX0ltcGwgcnVsZV9fWFNldExpdGVyYWxfX0dyb3VwXzNfMV9fMSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNTI3OToyOiBydWxlX19YU2V0TGl0ZXJhbF9fR3JvdXBfM18xX18wX19JbXBsIHJ1bGVfX1hTZXRMaXRlcmFsX19Hcm91cF8zXzFfXzEKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzc0KTsKKyAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzgyKTsKICAgICAgICAgICAgIHJ1bGVfX1hTZXRMaXRlcmFsX19Hcm91cF8zXzFfXzBfX0ltcGwoKTsKIAogICAgICAgICAgICAgc3RhdGUuX2ZzcC0tOwpAQCAtNDY1NDksMjIgKzUxMDA2LDIyIEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fWFNldExpdGVyYWxfX0dyb3VwXzNfMV9fMF9fSW1wbCIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMzk0ODoxOiBydWxlX19YU2V0TGl0ZXJhbF9fR3JvdXBfM18xX18wX19JbXBsIDogKCAnLCcgKSA7CisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTUyODY6MTogcnVsZV9fWFNldExpdGVyYWxfX0dyb3VwXzNfMV9fMF9fSW1wbCA6ICggJywnICkgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1hTZXRMaXRlcmFsX19Hcm91cF8zXzFfXzBfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTM5NTI6MTogKCAoICcsJyApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEzOTUzOjE6ICggJywnICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE1MjkwOjE6ICggKCAnLCcgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNTI5MToxOiAoICcsJyApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMzk1MzoxOiAoICcsJyApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMzk1NDoyOiAnLCcKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE1MjkxOjE6ICggJywnICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE1MjkyOjI6ICcsJwogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYU2V0TGl0ZXJhbEFjY2VzcygpLmdldENvbW1hS2V5d29yZF8zXzFfMCgpKTsgCiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBtYXRjaChpbnB1dCwxMTUsRk9MTE9XXzIpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOworICAgICAgICAgICAgbWF0Y2goaW5wdXQsMTI1LEZPTExPV18yKTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRYU2V0TGl0ZXJhbEFjY2VzcygpLmdldENvbW1hS2V5d29yZF8zXzFfMCgpKTsgCiAgICAgICAgICAgICB9CkBAIC00NjU5MCwxNCArNTEwNDcsMTQgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YU2V0TGl0ZXJhbF9fR3JvdXBfM18xX18xIgotICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEzOTYzOjE6IHJ1bGVfX1hTZXRMaXRlcmFsX19Hcm91cF8zXzFfXzEgOiBydWxlX19YU2V0TGl0ZXJhbF9fR3JvdXBfM18xX18xX19JbXBsIDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNTMwMToxOiBydWxlX19YU2V0TGl0ZXJhbF9fR3JvdXBfM18xX18xIDogcnVsZV9fWFNldExpdGVyYWxfX0dyb3VwXzNfMV9fMV9fSW1wbCA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fWFNldExpdGVyYWxfX0dyb3VwXzNfMV9fMSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMzk2NzoxOiAoIHJ1bGVfX1hTZXRMaXRlcmFsX19Hcm91cF8zXzFfXzFfX0ltcGwgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTM5Njg6MjogcnVsZV9fWFNldExpdGVyYWxfX0dyb3VwXzNfMV9fMV9fSW1wbAorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTUzMDU6MTogKCBydWxlX19YU2V0TGl0ZXJhbF9fR3JvdXBfM18xX18xX19JbXBsICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE1MzA2OjI6IHJ1bGVfX1hTZXRMaXRlcmFsX19Hcm91cF8zXzFfXzFfX0ltcGwKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzIpOwogICAgICAgICAgICAgcnVsZV9fWFNldExpdGVyYWxfX0dyb3VwXzNfMV9fMV9fSW1wbCgpOwpAQCAtNDY2MjMsMjMgKzUxMDgwLDIzIEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fWFNldExpdGVyYWxfX0dyb3VwXzNfMV9fMV9fSW1wbCIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMzk3NDoxOiBydWxlX19YU2V0TGl0ZXJhbF9fR3JvdXBfM18xX18xX19JbXBsIDogKCAoIHJ1bGVfX1hTZXRMaXRlcmFsX19FbGVtZW50c0Fzc2lnbm1lbnRfM18xXzEgKSApIDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNTMxMjoxOiBydWxlX19YU2V0TGl0ZXJhbF9fR3JvdXBfM18xX18xX19JbXBsIDogKCAoIHJ1bGVfX1hTZXRMaXRlcmFsX19FbGVtZW50c0Fzc2lnbm1lbnRfM18xXzEgKSApIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YU2V0TGl0ZXJhbF9fR3JvdXBfM18xX18xX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEzOTc4OjE6ICggKCAoIHJ1bGVfX1hTZXRMaXRlcmFsX19FbGVtZW50c0Fzc2lnbm1lbnRfM18xXzEgKSApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEzOTc5OjE6ICggKCBydWxlX19YU2V0TGl0ZXJhbF9fRWxlbWVudHNBc3NpZ25tZW50XzNfMV8xICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTUzMTY6MTogKCAoICggcnVsZV9fWFNldExpdGVyYWxfX0VsZW1lbnRzQXNzaWdubWVudF8zXzFfMSApICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTUzMTc6MTogKCAoIHJ1bGVfX1hTZXRMaXRlcmFsX19FbGVtZW50c0Fzc2lnbm1lbnRfM18xXzEgKSApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMzk3OToxOiAoICggcnVsZV9fWFNldExpdGVyYWxfX0VsZW1lbnRzQXNzaWdubWVudF8zXzFfMSApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEzOTgwOjI6ICggcnVsZV9fWFNldExpdGVyYWxfX0VsZW1lbnRzQXNzaWdubWVudF8zXzFfMSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNTMxNzoxOiAoICggcnVsZV9fWFNldExpdGVyYWxfX0VsZW1lbnRzQXNzaWdubWVudF8zXzFfMSApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE1MzE4OjI6ICggcnVsZV9fWFNldExpdGVyYWxfX0VsZW1lbnRzQXNzaWdubWVudF8zXzFfMSApCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhTZXRMaXRlcmFsQWNjZXNzKCkuZ2V0RWxlbWVudHNBc3NpZ25tZW50XzNfMV8xKCkpOyAKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEzOTgxOjI6ICggcnVsZV9fWFNldExpdGVyYWxfX0VsZW1lbnRzQXNzaWdubWVudF8zXzFfMSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMzk4MTozOiBydWxlX19YU2V0TGl0ZXJhbF9fRWxlbWVudHNBc3NpZ25tZW50XzNfMV8xCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNTMxOToyOiAoIHJ1bGVfX1hTZXRMaXRlcmFsX19FbGVtZW50c0Fzc2lnbm1lbnRfM18xXzEgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTUzMTk6MzogcnVsZV9fWFNldExpdGVyYWxfX0VsZW1lbnRzQXNzaWdubWVudF8zXzFfMQogICAgICAgICAgICAgewogICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMik7CiAgICAgICAgICAgICBydWxlX19YU2V0TGl0ZXJhbF9fRWxlbWVudHNBc3NpZ25tZW50XzNfMV8xKCk7CkBAIC00NjY3NCwxNiArNTExMzEsMTYgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YTGlzdExpdGVyYWxfX0dyb3VwX18wIgotICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEzOTkwOjE6IHJ1bGVfX1hMaXN0TGl0ZXJhbF9fR3JvdXBfXzAgOiBydWxlX19YTGlzdExpdGVyYWxfX0dyb3VwX18wX19JbXBsIHJ1bGVfX1hMaXN0TGl0ZXJhbF9fR3JvdXBfXzEgOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE1MzI4OjE6IHJ1bGVfX1hMaXN0TGl0ZXJhbF9fR3JvdXBfXzAgOiBydWxlX19YTGlzdExpdGVyYWxfX0dyb3VwX18wX19JbXBsIHJ1bGVfX1hMaXN0TGl0ZXJhbF9fR3JvdXBfXzEgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1hMaXN0TGl0ZXJhbF9fR3JvdXBfXzAoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTM5OTQ6MTogKCBydWxlX19YTGlzdExpdGVyYWxfX0dyb3VwX18wX19JbXBsIHJ1bGVfX1hMaXN0TGl0ZXJhbF9fR3JvdXBfXzEgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTM5OTU6MjogcnVsZV9fWExpc3RMaXRlcmFsX19Hcm91cF9fMF9fSW1wbCBydWxlX19YTGlzdExpdGVyYWxfX0dyb3VwX18xCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNTMzMjoxOiAoIHJ1bGVfX1hMaXN0TGl0ZXJhbF9fR3JvdXBfXzBfX0ltcGwgcnVsZV9fWExpc3RMaXRlcmFsX19Hcm91cF9fMSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNTMzMzoyOiBydWxlX19YTGlzdExpdGVyYWxfX0dyb3VwX18wX19JbXBsIHJ1bGVfX1hMaXN0TGl0ZXJhbF9fR3JvdXBfXzEKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzc3KTsKKyAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzg1KTsKICAgICAgICAgICAgIHJ1bGVfX1hMaXN0TGl0ZXJhbF9fR3JvdXBfXzBfX0ltcGwoKTsKIAogICAgICAgICAgICAgc3RhdGUuX2ZzcC0tOwpAQCAtNDY3MTIsMjMgKzUxMTY5LDIzIEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fWExpc3RMaXRlcmFsX19Hcm91cF9fMF9fSW1wbCIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNDAwMjoxOiBydWxlX19YTGlzdExpdGVyYWxfX0dyb3VwX18wX19JbXBsIDogKCAoKSApIDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNTM0MDoxOiBydWxlX19YTGlzdExpdGVyYWxfX0dyb3VwX18wX19JbXBsIDogKCAoKSApIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YTGlzdExpdGVyYWxfX0dyb3VwX18wX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE0MDA2OjE6ICggKCAoKSApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE0MDA3OjE6ICggKCkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTUzNDQ6MTogKCAoICgpICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTUzNDU6MTogKCAoKSApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNDAwNzoxOiAoICgpICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE0MDA4OjI6ICgpCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNTM0NToxOiAoICgpICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE1MzQ2OjI6ICgpCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhMaXN0TGl0ZXJhbEFjY2VzcygpLmdldFhMaXN0TGl0ZXJhbEFjdGlvbl8wKCkpOyAKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE0MDA5OjI6ICgpCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNDAwOTozOiAKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE1MzQ3OjI6ICgpCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNTM0NzozOiAKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIH0KIApAQCAtNDY3NTMsMTYgKzUxMjEwLDE2IEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fWExpc3RMaXRlcmFsX19Hcm91cF9fMSIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNDAxNzoxOiBydWxlX19YTGlzdExpdGVyYWxfX0dyb3VwX18xIDogcnVsZV9fWExpc3RMaXRlcmFsX19Hcm91cF9fMV9fSW1wbCBydWxlX19YTGlzdExpdGVyYWxfX0dyb3VwX18yIDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNTM1NToxOiBydWxlX19YTGlzdExpdGVyYWxfX0dyb3VwX18xIDogcnVsZV9fWExpc3RMaXRlcmFsX19Hcm91cF9fMV9fSW1wbCBydWxlX19YTGlzdExpdGVyYWxfX0dyb3VwX18yIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YTGlzdExpdGVyYWxfX0dyb3VwX18xKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE0MDIxOjE6ICggcnVsZV9fWExpc3RMaXRlcmFsX19Hcm91cF9fMV9fSW1wbCBydWxlX19YTGlzdExpdGVyYWxfX0dyb3VwX18yICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE0MDIyOjI6IHJ1bGVfX1hMaXN0TGl0ZXJhbF9fR3JvdXBfXzFfX0ltcGwgcnVsZV9fWExpc3RMaXRlcmFsX19Hcm91cF9fMgorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTUzNTk6MTogKCBydWxlX19YTGlzdExpdGVyYWxfX0dyb3VwX18xX19JbXBsIHJ1bGVfX1hMaXN0TGl0ZXJhbF9fR3JvdXBfXzIgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTUzNjA6MjogcnVsZV9fWExpc3RMaXRlcmFsX19Hcm91cF9fMV9fSW1wbCBydWxlX19YTGlzdExpdGVyYWxfX0dyb3VwX18yCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV183OCk7CisgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV184Nik7CiAgICAgICAgICAgICBydWxlX19YTGlzdExpdGVyYWxfX0dyb3VwX18xX19JbXBsKCk7CiAKICAgICAgICAgICAgIHN0YXRlLl9mc3AtLTsKQEAgLTQ2NzkxLDIyICs1MTI0OCwyMiBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX1hMaXN0TGl0ZXJhbF9fR3JvdXBfXzFfX0ltcGwiCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTQwMjk6MTogcnVsZV9fWExpc3RMaXRlcmFsX19Hcm91cF9fMV9fSW1wbCA6ICggJyMnICkgOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE1MzY3OjE6IHJ1bGVfX1hMaXN0TGl0ZXJhbF9fR3JvdXBfXzFfX0ltcGwgOiAoICcjJyApIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YTGlzdExpdGVyYWxfX0dyb3VwX18xX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE0MDMzOjE6ICggKCAnIycgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNDAzNDoxOiAoICcjJyApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNTM3MToxOiAoICggJyMnICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTUzNzI6MTogKCAnIycgKQogICAgICAgICAgICAgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTQwMzQ6MTogKCAnIycgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTQwMzU6MjogJyMnCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNTM3MjoxOiAoICcjJyApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNTM3MzoyOiAnIycKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WExpc3RMaXRlcmFsQWNjZXNzKCkuZ2V0TnVtYmVyU2lnbktleXdvcmRfMSgpKTsgCiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBtYXRjaChpbnB1dCwxMTcsRk9MTE9XXzIpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOworICAgICAgICAgICAgbWF0Y2goaW5wdXQsMTI3LEZPTExPV18yKTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRYTGlzdExpdGVyYWxBY2Nlc3MoKS5nZXROdW1iZXJTaWduS2V5d29yZF8xKCkpOyAKICAgICAgICAgICAgIH0KQEAgLTQ2ODMyLDE2ICs1MTI4OSwxNiBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX1hMaXN0TGl0ZXJhbF9fR3JvdXBfXzIiCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTQwNDQ6MTogcnVsZV9fWExpc3RMaXRlcmFsX19Hcm91cF9fMiA6IHJ1bGVfX1hMaXN0TGl0ZXJhbF9fR3JvdXBfXzJfX0ltcGwgcnVsZV9fWExpc3RMaXRlcmFsX19Hcm91cF9fMyA7CisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTUzODI6MTogcnVsZV9fWExpc3RMaXRlcmFsX19Hcm91cF9fMiA6IHJ1bGVfX1hMaXN0TGl0ZXJhbF9fR3JvdXBfXzJfX0ltcGwgcnVsZV9fWExpc3RMaXRlcmFsX19Hcm91cF9fMyA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fWExpc3RMaXRlcmFsX19Hcm91cF9fMigpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNDA0ODoxOiAoIHJ1bGVfX1hMaXN0TGl0ZXJhbF9fR3JvdXBfXzJfX0ltcGwgcnVsZV9fWExpc3RMaXRlcmFsX19Hcm91cF9fMyApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNDA0OToyOiBydWxlX19YTGlzdExpdGVyYWxfX0dyb3VwX18yX19JbXBsIHJ1bGVfX1hMaXN0TGl0ZXJhbF9fR3JvdXBfXzMKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE1Mzg2OjE6ICggcnVsZV9fWExpc3RMaXRlcmFsX19Hcm91cF9fMl9fSW1wbCBydWxlX19YTGlzdExpdGVyYWxfX0dyb3VwX18zICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE1Mzg3OjI6IHJ1bGVfX1hMaXN0TGl0ZXJhbF9fR3JvdXBfXzJfX0ltcGwgcnVsZV9fWExpc3RMaXRlcmFsX19Hcm91cF9fMwogICAgICAgICAgICAgewotICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfNzYpOworICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfODQpOwogICAgICAgICAgICAgcnVsZV9fWExpc3RMaXRlcmFsX19Hcm91cF9fMl9fSW1wbCgpOwogCiAgICAgICAgICAgICBzdGF0ZS5fZnNwLS07CkBAIC00Njg3MCwyMiArNTEzMjcsMjIgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YTGlzdExpdGVyYWxfX0dyb3VwX18yX19JbXBsIgotICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE0MDU2OjE6IHJ1bGVfX1hMaXN0TGl0ZXJhbF9fR3JvdXBfXzJfX0ltcGwgOiAoICdbJyApIDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNTM5NDoxOiBydWxlX19YTGlzdExpdGVyYWxfX0dyb3VwX18yX19JbXBsIDogKCAnWycgKSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fWExpc3RMaXRlcmFsX19Hcm91cF9fMl9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNDA2MDoxOiAoICggJ1snICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTQwNjE6MTogKCAnWycgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTUzOTg6MTogKCAoICdbJyApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE1Mzk5OjE6ICggJ1snICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE0MDYxOjE6ICggJ1snICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE0MDYyOjI6ICdbJworICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTUzOTk6MTogKCAnWycgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTU0MDA6MjogJ1snCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhMaXN0TGl0ZXJhbEFjY2VzcygpLmdldExlZnRTcXVhcmVCcmFja2V0S2V5d29yZF8yKCkpOyAKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1hdGNoKGlucHV0LDExOCxGT0xMT1dfMik7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CisgICAgICAgICAgICBtYXRjaChpbnB1dCwxMjgsRk9MTE9XXzIpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOwogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBhZnRlcihncmFtbWFyQWNjZXNzLmdldFhMaXN0TGl0ZXJhbEFjY2VzcygpLmdldExlZnRTcXVhcmVCcmFja2V0S2V5d29yZF8yKCkpOyAKICAgICAgICAgICAgIH0KQEAgLTQ2OTExLDE2ICs1MTM2OCwxNiBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX1hMaXN0TGl0ZXJhbF9fR3JvdXBfXzMiCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTQwNzE6MTogcnVsZV9fWExpc3RMaXRlcmFsX19Hcm91cF9fMyA6IHJ1bGVfX1hMaXN0TGl0ZXJhbF9fR3JvdXBfXzNfX0ltcGwgcnVsZV9fWExpc3RMaXRlcmFsX19Hcm91cF9fNCA7CisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTU0MDk6MTogcnVsZV9fWExpc3RMaXRlcmFsX19Hcm91cF9fMyA6IHJ1bGVfX1hMaXN0TGl0ZXJhbF9fR3JvdXBfXzNfX0ltcGwgcnVsZV9fWExpc3RMaXRlcmFsX19Hcm91cF9fNCA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fWExpc3RMaXRlcmFsX19Hcm91cF9fMygpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNDA3NToxOiAoIHJ1bGVfX1hMaXN0TGl0ZXJhbF9fR3JvdXBfXzNfX0ltcGwgcnVsZV9fWExpc3RMaXRlcmFsX19Hcm91cF9fNCApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNDA3NjoyOiBydWxlX19YTGlzdExpdGVyYWxfX0dyb3VwX18zX19JbXBsIHJ1bGVfX1hMaXN0TGl0ZXJhbF9fR3JvdXBfXzQKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE1NDEzOjE6ICggcnVsZV9fWExpc3RMaXRlcmFsX19Hcm91cF9fM19fSW1wbCBydWxlX19YTGlzdExpdGVyYWxfX0dyb3VwX180ICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE1NDE0OjI6IHJ1bGVfX1hMaXN0TGl0ZXJhbF9fR3JvdXBfXzNfX0ltcGwgcnVsZV9fWExpc3RMaXRlcmFsX19Hcm91cF9fNAogICAgICAgICAgICAgewotICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfNzYpOworICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfODQpOwogICAgICAgICAgICAgcnVsZV9fWExpc3RMaXRlcmFsX19Hcm91cF9fM19fSW1wbCgpOwogCiAgICAgICAgICAgICBzdGF0ZS5fZnNwLS07CkBAIC00Njk0OSwzMSArNTE0MDYsMzEgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YTGlzdExpdGVyYWxfX0dyb3VwX18zX19JbXBsIgotICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE0MDgzOjE6IHJ1bGVfX1hMaXN0TGl0ZXJhbF9fR3JvdXBfXzNfX0ltcGwgOiAoICggcnVsZV9fWExpc3RMaXRlcmFsX19Hcm91cF8zX18wICk/ICkgOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE1NDIxOjE6IHJ1bGVfX1hMaXN0TGl0ZXJhbF9fR3JvdXBfXzNfX0ltcGwgOiAoICggcnVsZV9fWExpc3RMaXRlcmFsX19Hcm91cF8zX18wICk/ICkgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1hMaXN0TGl0ZXJhbF9fR3JvdXBfXzNfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTQwODc6MTogKCAoICggcnVsZV9fWExpc3RMaXRlcmFsX19Hcm91cF8zX18wICk/ICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTQwODg6MTogKCAoIHJ1bGVfX1hMaXN0TGl0ZXJhbF9fR3JvdXBfM19fMCApPyApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNTQyNToxOiAoICggKCBydWxlX19YTGlzdExpdGVyYWxfX0dyb3VwXzNfXzAgKT8gKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNTQyNjoxOiAoICggcnVsZV9fWExpc3RMaXRlcmFsX19Hcm91cF8zX18wICk/ICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE0MDg4OjE6ICggKCBydWxlX19YTGlzdExpdGVyYWxfX0dyb3VwXzNfXzAgKT8gKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTQwODk6MjogKCBydWxlX19YTGlzdExpdGVyYWxfX0dyb3VwXzNfXzAgKT8KKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE1NDI2OjE6ICggKCBydWxlX19YTGlzdExpdGVyYWxfX0dyb3VwXzNfXzAgKT8gKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTU0Mjc6MjogKCBydWxlX19YTGlzdExpdGVyYWxfX0dyb3VwXzNfXzAgKT8KICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WExpc3RMaXRlcmFsQWNjZXNzKCkuZ2V0R3JvdXBfMygpKTsgCiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNDA5MDoyOiAoIHJ1bGVfX1hMaXN0TGl0ZXJhbF9fR3JvdXBfM19fMCApPwotICAgICAgICAgICAgaW50IGFsdDExNT0yOwotICAgICAgICAgICAgaW50IExBMTE1XzAgPSBpbnB1dC5MQSgxKTsKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE1NDI4OjI6ICggcnVsZV9fWExpc3RMaXRlcmFsX19Hcm91cF8zX18wICk/CisgICAgICAgICAgICBpbnQgYWx0MTI4PTI7CisgICAgICAgICAgICBpbnQgTEExMjhfMCA9IGlucHV0LkxBKDEpOwogCi0gICAgICAgICAgICBpZiAoICgoTEExMTVfMD49UlVMRV9TVFJJTkcgJiYgTEExMTVfMDw9UlVMRV9ERUNJTUFMKXx8TEExMTVfMD09Mjd8fChMQTExNV8wPj0zNCAmJiBMQTExNV8wPD0zNSl8fExBMTE1XzA9PTQwfHwoTEExMTVfMD49NDUgJiYgTEExMTVfMDw9NTApfHxMQTExNV8wPT03MHx8TEExMTVfMD09OTV8fExBMTE1XzA9PTExM3x8KExBMTE1XzA+PTExNyAmJiBMQTExNV8wPD0xMTgpfHxMQTExNV8wPT0xMjB8fExBMTE1XzA9PTEyMnx8KExBMTE1XzA+PTEyNiAmJiBMQTExNV8wPD0xMzMpfHxMQTExNV8wPT0xMzV8fExBMTE1XzA9PTE1NCkgKSB7Ci0gICAgICAgICAgICAgICAgYWx0MTE1PTE7CisgICAgICAgICAgICBpZiAoICgoTEExMjhfMD49UlVMRV9TVFJJTkcgJiYgTEExMjhfMDw9UlVMRV9ERUNJTUFMKXx8TEExMjhfMD09Mjd8fChMQTEyOF8wPj0zNCAmJiBMQTEyOF8wPD0zNSl8fExBMTI4XzA9PTQwfHwoTEExMjhfMD49NDUgJiYgTEExMjhfMDw9NTApfHxMQTEyOF8wPT03NXx8TEExMjhfMD09MTAyfHxMQTEyOF8wPT0xMjN8fChMQTEyOF8wPj0xMjcgJiYgTEExMjhfMDw9MTI4KXx8TEExMjhfMD09MTMwfHxMQTEyOF8wPT0xMzJ8fChMQTEyOF8wPj0xMzYgJiYgTEExMjhfMDw9MTQzKXx8TEExMjhfMD09MTQ1fHxMQTEyOF8wPT0xNjYpICkgeworICAgICAgICAgICAgICAgIGFsdDEyOD0xOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgc3dpdGNoIChhbHQxMTUpIHsKKyAgICAgICAgICAgIHN3aXRjaCAoYWx0MTI4KSB7CiAgICAgICAgICAgICAgICAgY2FzZSAxIDoKLSAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTQwOTA6MzogcnVsZV9fWExpc3RMaXRlcmFsX19Hcm91cF8zX18wCisgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE1NDI4OjM6IHJ1bGVfX1hMaXN0TGl0ZXJhbF9fR3JvdXBfM19fMAogICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzIpOwogICAgICAgICAgICAgICAgICAgICBydWxlX19YTGlzdExpdGVyYWxfX0dyb3VwXzNfXzAoKTsKQEAgLTQ3MDExLDE0ICs1MTQ2OCwxNCBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX1hMaXN0TGl0ZXJhbF9fR3JvdXBfXzQiCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTQwOTg6MTogcnVsZV9fWExpc3RMaXRlcmFsX19Hcm91cF9fNCA6IHJ1bGVfX1hMaXN0TGl0ZXJhbF9fR3JvdXBfXzRfX0ltcGwgOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE1NDM2OjE6IHJ1bGVfX1hMaXN0TGl0ZXJhbF9fR3JvdXBfXzQgOiBydWxlX19YTGlzdExpdGVyYWxfX0dyb3VwX180X19JbXBsIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YTGlzdExpdGVyYWxfX0dyb3VwX180KCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE0MTAyOjE6ICggcnVsZV9fWExpc3RMaXRlcmFsX19Hcm91cF9fNF9fSW1wbCApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNDEwMzoyOiBydWxlX19YTGlzdExpdGVyYWxfX0dyb3VwX180X19JbXBsCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNTQ0MDoxOiAoIHJ1bGVfX1hMaXN0TGl0ZXJhbF9fR3JvdXBfXzRfX0ltcGwgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTU0NDE6MjogcnVsZV9fWExpc3RMaXRlcmFsX19Hcm91cF9fNF9fSW1wbAogICAgICAgICAgICAgewogICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMik7CiAgICAgICAgICAgICBydWxlX19YTGlzdExpdGVyYWxfX0dyb3VwX180X19JbXBsKCk7CkBAIC00NzA0NCwyMiArNTE1MDEsMjIgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YTGlzdExpdGVyYWxfX0dyb3VwX180X19JbXBsIgotICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE0MTA5OjE6IHJ1bGVfX1hMaXN0TGl0ZXJhbF9fR3JvdXBfXzRfX0ltcGwgOiAoICddJyApIDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNTQ0NzoxOiBydWxlX19YTGlzdExpdGVyYWxfX0dyb3VwX180X19JbXBsIDogKCAnXScgKSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fWExpc3RMaXRlcmFsX19Hcm91cF9fNF9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNDExMzoxOiAoICggJ10nICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTQxMTQ6MTogKCAnXScgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTU0NTE6MTogKCAoICddJyApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE1NDUyOjE6ICggJ10nICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE0MTE0OjE6ICggJ10nICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE0MTE1OjI6ICddJworICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTU0NTI6MTogKCAnXScgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTU0NTM6MjogJ10nCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhMaXN0TGl0ZXJhbEFjY2VzcygpLmdldFJpZ2h0U3F1YXJlQnJhY2tldEtleXdvcmRfNCgpKTsgCiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBtYXRjaChpbnB1dCwxMTYsRk9MTE9XXzIpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOworICAgICAgICAgICAgbWF0Y2goaW5wdXQsMTI2LEZPTExPV18yKTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRYTGlzdExpdGVyYWxBY2Nlc3MoKS5nZXRSaWdodFNxdWFyZUJyYWNrZXRLZXl3b3JkXzQoKSk7IAogICAgICAgICAgICAgfQpAQCAtNDcwODUsMTYgKzUxNTQyLDE2IEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fWExpc3RMaXRlcmFsX19Hcm91cF8zX18wIgotICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE0MTI1OjE6IHJ1bGVfX1hMaXN0TGl0ZXJhbF9fR3JvdXBfM19fMCA6IHJ1bGVfX1hMaXN0TGl0ZXJhbF9fR3JvdXBfM19fMF9fSW1wbCBydWxlX19YTGlzdExpdGVyYWxfX0dyb3VwXzNfXzEgOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE1NDYzOjE6IHJ1bGVfX1hMaXN0TGl0ZXJhbF9fR3JvdXBfM19fMCA6IHJ1bGVfX1hMaXN0TGl0ZXJhbF9fR3JvdXBfM19fMF9fSW1wbCBydWxlX19YTGlzdExpdGVyYWxfX0dyb3VwXzNfXzEgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1hMaXN0TGl0ZXJhbF9fR3JvdXBfM19fMCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNDEyOToxOiAoIHJ1bGVfX1hMaXN0TGl0ZXJhbF9fR3JvdXBfM19fMF9fSW1wbCBydWxlX19YTGlzdExpdGVyYWxfX0dyb3VwXzNfXzEgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTQxMzA6MjogcnVsZV9fWExpc3RMaXRlcmFsX19Hcm91cF8zX18wX19JbXBsIHJ1bGVfX1hMaXN0TGl0ZXJhbF9fR3JvdXBfM19fMQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTU0Njc6MTogKCBydWxlX19YTGlzdExpdGVyYWxfX0dyb3VwXzNfXzBfX0ltcGwgcnVsZV9fWExpc3RMaXRlcmFsX19Hcm91cF8zX18xICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE1NDY4OjI6IHJ1bGVfX1hMaXN0TGl0ZXJhbF9fR3JvdXBfM19fMF9fSW1wbCBydWxlX19YTGlzdExpdGVyYWxfX0dyb3VwXzNfXzEKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzcyKTsKKyAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzgwKTsKICAgICAgICAgICAgIHJ1bGVfX1hMaXN0TGl0ZXJhbF9fR3JvdXBfM19fMF9fSW1wbCgpOwogCiAgICAgICAgICAgICBzdGF0ZS5fZnNwLS07CkBAIC00NzEyMywyMyArNTE1ODAsMjMgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YTGlzdExpdGVyYWxfX0dyb3VwXzNfXzBfX0ltcGwiCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTQxMzc6MTogcnVsZV9fWExpc3RMaXRlcmFsX19Hcm91cF8zX18wX19JbXBsIDogKCAoIHJ1bGVfX1hMaXN0TGl0ZXJhbF9fRWxlbWVudHNBc3NpZ25tZW50XzNfMCApICkgOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE1NDc1OjE6IHJ1bGVfX1hMaXN0TGl0ZXJhbF9fR3JvdXBfM19fMF9fSW1wbCA6ICggKCBydWxlX19YTGlzdExpdGVyYWxfX0VsZW1lbnRzQXNzaWdubWVudF8zXzAgKSApIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YTGlzdExpdGVyYWxfX0dyb3VwXzNfXzBfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTQxNDE6MTogKCAoICggcnVsZV9fWExpc3RMaXRlcmFsX19FbGVtZW50c0Fzc2lnbm1lbnRfM18wICkgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNDE0MjoxOiAoICggcnVsZV9fWExpc3RMaXRlcmFsX19FbGVtZW50c0Fzc2lnbm1lbnRfM18wICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTU0Nzk6MTogKCAoICggcnVsZV9fWExpc3RMaXRlcmFsX19FbGVtZW50c0Fzc2lnbm1lbnRfM18wICkgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNTQ4MDoxOiAoICggcnVsZV9fWExpc3RMaXRlcmFsX19FbGVtZW50c0Fzc2lnbm1lbnRfM18wICkgKQogICAgICAgICAgICAgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTQxNDI6MTogKCAoIHJ1bGVfX1hMaXN0TGl0ZXJhbF9fRWxlbWVudHNBc3NpZ25tZW50XzNfMCApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE0MTQzOjI6ICggcnVsZV9fWExpc3RMaXRlcmFsX19FbGVtZW50c0Fzc2lnbm1lbnRfM18wICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE1NDgwOjE6ICggKCBydWxlX19YTGlzdExpdGVyYWxfX0VsZW1lbnRzQXNzaWdubWVudF8zXzAgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNTQ4MToyOiAoIHJ1bGVfX1hMaXN0TGl0ZXJhbF9fRWxlbWVudHNBc3NpZ25tZW50XzNfMCApCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhMaXN0TGl0ZXJhbEFjY2VzcygpLmdldEVsZW1lbnRzQXNzaWdubWVudF8zXzAoKSk7IAogICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTQxNDQ6MjogKCBydWxlX19YTGlzdExpdGVyYWxfX0VsZW1lbnRzQXNzaWdubWVudF8zXzAgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTQxNDQ6MzogcnVsZV9fWExpc3RMaXRlcmFsX19FbGVtZW50c0Fzc2lnbm1lbnRfM18wCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNTQ4MjoyOiAoIHJ1bGVfX1hMaXN0TGl0ZXJhbF9fRWxlbWVudHNBc3NpZ25tZW50XzNfMCApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNTQ4MjozOiBydWxlX19YTGlzdExpdGVyYWxfX0VsZW1lbnRzQXNzaWdubWVudF8zXzAKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzIpOwogICAgICAgICAgICAgcnVsZV9fWExpc3RMaXRlcmFsX19FbGVtZW50c0Fzc2lnbm1lbnRfM18wKCk7CkBAIC00NzE3NCwxNCArNTE2MzEsMTQgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YTGlzdExpdGVyYWxfX0dyb3VwXzNfXzEiCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTQxNTI6MTogcnVsZV9fWExpc3RMaXRlcmFsX19Hcm91cF8zX18xIDogcnVsZV9fWExpc3RMaXRlcmFsX19Hcm91cF8zX18xX19JbXBsIDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNTQ5MDoxOiBydWxlX19YTGlzdExpdGVyYWxfX0dyb3VwXzNfXzEgOiBydWxlX19YTGlzdExpdGVyYWxfX0dyb3VwXzNfXzFfX0ltcGwgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1hMaXN0TGl0ZXJhbF9fR3JvdXBfM19fMSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNDE1NjoxOiAoIHJ1bGVfX1hMaXN0TGl0ZXJhbF9fR3JvdXBfM19fMV9fSW1wbCApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNDE1NzoyOiBydWxlX19YTGlzdExpdGVyYWxfX0dyb3VwXzNfXzFfX0ltcGwKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE1NDk0OjE6ICggcnVsZV9fWExpc3RMaXRlcmFsX19Hcm91cF8zX18xX19JbXBsICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE1NDk1OjI6IHJ1bGVfX1hMaXN0TGl0ZXJhbF9fR3JvdXBfM19fMV9fSW1wbAogICAgICAgICAgICAgewogICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMik7CiAgICAgICAgICAgICBydWxlX19YTGlzdExpdGVyYWxfX0dyb3VwXzNfXzFfX0ltcGwoKTsKQEAgLTQ3MjA3LDM3ICs1MTY2NCwzNyBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX1hMaXN0TGl0ZXJhbF9fR3JvdXBfM19fMV9fSW1wbCIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNDE2MzoxOiBydWxlX19YTGlzdExpdGVyYWxfX0dyb3VwXzNfXzFfX0ltcGwgOiAoICggcnVsZV9fWExpc3RMaXRlcmFsX19Hcm91cF8zXzFfXzAgKSogKSA7CisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTU1MDE6MTogcnVsZV9fWExpc3RMaXRlcmFsX19Hcm91cF8zX18xX19JbXBsIDogKCAoIHJ1bGVfX1hMaXN0TGl0ZXJhbF9fR3JvdXBfM18xX18wICkqICkgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1hMaXN0TGl0ZXJhbF9fR3JvdXBfM19fMV9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNDE2NzoxOiAoICggKCBydWxlX19YTGlzdExpdGVyYWxfX0dyb3VwXzNfMV9fMCApKiApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE0MTY4OjE6ICggKCBydWxlX19YTGlzdExpdGVyYWxfX0dyb3VwXzNfMV9fMCApKiApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNTUwNToxOiAoICggKCBydWxlX19YTGlzdExpdGVyYWxfX0dyb3VwXzNfMV9fMCApKiApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE1NTA2OjE6ICggKCBydWxlX19YTGlzdExpdGVyYWxfX0dyb3VwXzNfMV9fMCApKiApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNDE2ODoxOiAoICggcnVsZV9fWExpc3RMaXRlcmFsX19Hcm91cF8zXzFfXzAgKSogKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTQxNjk6MjogKCBydWxlX19YTGlzdExpdGVyYWxfX0dyb3VwXzNfMV9fMCApKgorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTU1MDY6MTogKCAoIHJ1bGVfX1hMaXN0TGl0ZXJhbF9fR3JvdXBfM18xX18wICkqICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE1NTA3OjI6ICggcnVsZV9fWExpc3RMaXRlcmFsX19Hcm91cF8zXzFfXzAgKSoKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WExpc3RMaXRlcmFsQWNjZXNzKCkuZ2V0R3JvdXBfM18xKCkpOyAKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE0MTcwOjI6ICggcnVsZV9fWExpc3RMaXRlcmFsX19Hcm91cF8zXzFfXzAgKSoKLSAgICAgICAgICAgIGxvb3AxMTY6CisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNTUwODoyOiAoIHJ1bGVfX1hMaXN0TGl0ZXJhbF9fR3JvdXBfM18xX18wICkqCisgICAgICAgICAgICBsb29wMTI5OgogICAgICAgICAgICAgZG8gewotICAgICAgICAgICAgICAgIGludCBhbHQxMTY9MjsKLSAgICAgICAgICAgICAgICBpbnQgTEExMTZfMCA9IGlucHV0LkxBKDEpOworICAgICAgICAgICAgICAgIGludCBhbHQxMjk9MjsKKyAgICAgICAgICAgICAgICBpbnQgTEExMjlfMCA9IGlucHV0LkxBKDEpOwogCi0gICAgICAgICAgICAgICAgaWYgKCAoTEExMTZfMD09MTE1KSApIHsKLSAgICAgICAgICAgICAgICAgICAgYWx0MTE2PTE7CisgICAgICAgICAgICAgICAgaWYgKCAoTEExMjlfMD09MTI1KSApIHsKKyAgICAgICAgICAgICAgICAgICAgYWx0MTI5PTE7CiAgICAgICAgICAgICAgICAgfQogCiAKLSAgICAgICAgICAgICAgICBzd2l0Y2ggKGFsdDExNikgeworICAgICAgICAgICAgICAgIHN3aXRjaCAoYWx0MTI5KSB7CiAgICAgICAgICAgICAJY2FzZSAxIDoKLSAgICAgICAgICAgIAkgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTQxNzA6MzogcnVsZV9fWExpc3RMaXRlcmFsX19Hcm91cF8zXzFfXzAKKyAgICAgICAgICAgIAkgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTU1MDg6MzogcnVsZV9fWExpc3RMaXRlcmFsX19Hcm91cF8zXzFfXzAKICAgICAgICAgICAgIAkgICAgewotICAgICAgICAgICAgCSAgICBwdXNoRm9sbG93KEZPTExPV183Myk7CisgICAgICAgICAgICAJICAgIHB1c2hGb2xsb3coRk9MTE9XXzgxKTsKICAgICAgICAgICAgIAkgICAgcnVsZV9fWExpc3RMaXRlcmFsX19Hcm91cF8zXzFfXzAoKTsKIAogICAgICAgICAgICAgCSAgICBzdGF0ZS5fZnNwLS07CkBAIC00NzI0Nyw3ICs1MTcwNCw3IEBACiAgICAgICAgICAgICAJICAgIGJyZWFrOwogCiAgICAgICAgICAgICAJZGVmYXVsdCA6Ci0gICAgICAgICAgICAJICAgIGJyZWFrIGxvb3AxMTY7CisgICAgICAgICAgICAJICAgIGJyZWFrIGxvb3AxMjk7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfSB3aGlsZSAodHJ1ZSk7CiAKQEAgLTQ3Mjc2LDE2ICs1MTczMywxNiBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX1hMaXN0TGl0ZXJhbF9fR3JvdXBfM18xX18wIgotICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE0MTc5OjE6IHJ1bGVfX1hMaXN0TGl0ZXJhbF9fR3JvdXBfM18xX18wIDogcnVsZV9fWExpc3RMaXRlcmFsX19Hcm91cF8zXzFfXzBfX0ltcGwgcnVsZV9fWExpc3RMaXRlcmFsX19Hcm91cF8zXzFfXzEgOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE1NTE3OjE6IHJ1bGVfX1hMaXN0TGl0ZXJhbF9fR3JvdXBfM18xX18wIDogcnVsZV9fWExpc3RMaXRlcmFsX19Hcm91cF8zXzFfXzBfX0ltcGwgcnVsZV9fWExpc3RMaXRlcmFsX19Hcm91cF8zXzFfXzEgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1hMaXN0TGl0ZXJhbF9fR3JvdXBfM18xX18wKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE0MTgzOjE6ICggcnVsZV9fWExpc3RMaXRlcmFsX19Hcm91cF8zXzFfXzBfX0ltcGwgcnVsZV9fWExpc3RMaXRlcmFsX19Hcm91cF8zXzFfXzEgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTQxODQ6MjogcnVsZV9fWExpc3RMaXRlcmFsX19Hcm91cF8zXzFfXzBfX0ltcGwgcnVsZV9fWExpc3RMaXRlcmFsX19Hcm91cF8zXzFfXzEKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE1NTIxOjE6ICggcnVsZV9fWExpc3RMaXRlcmFsX19Hcm91cF8zXzFfXzBfX0ltcGwgcnVsZV9fWExpc3RMaXRlcmFsX19Hcm91cF8zXzFfXzEgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTU1MjI6MjogcnVsZV9fWExpc3RMaXRlcmFsX19Hcm91cF8zXzFfXzBfX0ltcGwgcnVsZV9fWExpc3RMaXRlcmFsX19Hcm91cF8zXzFfXzEKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzc0KTsKKyAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzgyKTsKICAgICAgICAgICAgIHJ1bGVfX1hMaXN0TGl0ZXJhbF9fR3JvdXBfM18xX18wX19JbXBsKCk7CiAKICAgICAgICAgICAgIHN0YXRlLl9mc3AtLTsKQEAgLTQ3MzE0LDIyICs1MTc3MSwyMiBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX1hMaXN0TGl0ZXJhbF9fR3JvdXBfM18xX18wX19JbXBsIgotICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE0MTkxOjE6IHJ1bGVfX1hMaXN0TGl0ZXJhbF9fR3JvdXBfM18xX18wX19JbXBsIDogKCAnLCcgKSA7CisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTU1Mjk6MTogcnVsZV9fWExpc3RMaXRlcmFsX19Hcm91cF8zXzFfXzBfX0ltcGwgOiAoICcsJyApIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YTGlzdExpdGVyYWxfX0dyb3VwXzNfMV9fMF9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNDE5NToxOiAoICggJywnICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTQxOTY6MTogKCAnLCcgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTU1MzM6MTogKCAoICcsJyApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE1NTM0OjE6ICggJywnICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE0MTk2OjE6ICggJywnICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE0MTk3OjI6ICcsJworICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTU1MzQ6MTogKCAnLCcgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTU1MzU6MjogJywnCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhMaXN0TGl0ZXJhbEFjY2VzcygpLmdldENvbW1hS2V5d29yZF8zXzFfMCgpKTsgCiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBtYXRjaChpbnB1dCwxMTUsRk9MTE9XXzIpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOworICAgICAgICAgICAgbWF0Y2goaW5wdXQsMTI1LEZPTExPV18yKTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRYTGlzdExpdGVyYWxBY2Nlc3MoKS5nZXRDb21tYUtleXdvcmRfM18xXzAoKSk7IAogICAgICAgICAgICAgfQpAQCAtNDczNTUsMTQgKzUxODEyLDE0IEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fWExpc3RMaXRlcmFsX19Hcm91cF8zXzFfXzEiCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTQyMDY6MTogcnVsZV9fWExpc3RMaXRlcmFsX19Hcm91cF8zXzFfXzEgOiBydWxlX19YTGlzdExpdGVyYWxfX0dyb3VwXzNfMV9fMV9fSW1wbCA7CisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTU1NDQ6MTogcnVsZV9fWExpc3RMaXRlcmFsX19Hcm91cF8zXzFfXzEgOiBydWxlX19YTGlzdExpdGVyYWxfX0dyb3VwXzNfMV9fMV9fSW1wbCA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fWExpc3RMaXRlcmFsX19Hcm91cF8zXzFfXzEoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTQyMTA6MTogKCBydWxlX19YTGlzdExpdGVyYWxfX0dyb3VwXzNfMV9fMV9fSW1wbCApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNDIxMToyOiBydWxlX19YTGlzdExpdGVyYWxfX0dyb3VwXzNfMV9fMV9fSW1wbAorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTU1NDg6MTogKCBydWxlX19YTGlzdExpdGVyYWxfX0dyb3VwXzNfMV9fMV9fSW1wbCApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNTU0OToyOiBydWxlX19YTGlzdExpdGVyYWxfX0dyb3VwXzNfMV9fMV9fSW1wbAogICAgICAgICAgICAgewogICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMik7CiAgICAgICAgICAgICBydWxlX19YTGlzdExpdGVyYWxfX0dyb3VwXzNfMV9fMV9fSW1wbCgpOwpAQCAtNDczODgsMjMgKzUxODQ1LDIzIEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fWExpc3RMaXRlcmFsX19Hcm91cF8zXzFfXzFfX0ltcGwiCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTQyMTc6MTogcnVsZV9fWExpc3RMaXRlcmFsX19Hcm91cF8zXzFfXzFfX0ltcGwgOiAoICggcnVsZV9fWExpc3RMaXRlcmFsX19FbGVtZW50c0Fzc2lnbm1lbnRfM18xXzEgKSApIDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNTU1NToxOiBydWxlX19YTGlzdExpdGVyYWxfX0dyb3VwXzNfMV9fMV9fSW1wbCA6ICggKCBydWxlX19YTGlzdExpdGVyYWxfX0VsZW1lbnRzQXNzaWdubWVudF8zXzFfMSApICkgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1hMaXN0TGl0ZXJhbF9fR3JvdXBfM18xX18xX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE0MjIxOjE6ICggKCAoIHJ1bGVfX1hMaXN0TGl0ZXJhbF9fRWxlbWVudHNBc3NpZ25tZW50XzNfMV8xICkgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNDIyMjoxOiAoICggcnVsZV9fWExpc3RMaXRlcmFsX19FbGVtZW50c0Fzc2lnbm1lbnRfM18xXzEgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNTU1OToxOiAoICggKCBydWxlX19YTGlzdExpdGVyYWxfX0VsZW1lbnRzQXNzaWdubWVudF8zXzFfMSApICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTU1NjA6MTogKCAoIHJ1bGVfX1hMaXN0TGl0ZXJhbF9fRWxlbWVudHNBc3NpZ25tZW50XzNfMV8xICkgKQogICAgICAgICAgICAgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTQyMjI6MTogKCAoIHJ1bGVfX1hMaXN0TGl0ZXJhbF9fRWxlbWVudHNBc3NpZ25tZW50XzNfMV8xICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTQyMjM6MjogKCBydWxlX19YTGlzdExpdGVyYWxfX0VsZW1lbnRzQXNzaWdubWVudF8zXzFfMSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNTU2MDoxOiAoICggcnVsZV9fWExpc3RMaXRlcmFsX19FbGVtZW50c0Fzc2lnbm1lbnRfM18xXzEgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNTU2MToyOiAoIHJ1bGVfX1hMaXN0TGl0ZXJhbF9fRWxlbWVudHNBc3NpZ25tZW50XzNfMV8xICkKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WExpc3RMaXRlcmFsQWNjZXNzKCkuZ2V0RWxlbWVudHNBc3NpZ25tZW50XzNfMV8xKCkpOyAKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE0MjI0OjI6ICggcnVsZV9fWExpc3RMaXRlcmFsX19FbGVtZW50c0Fzc2lnbm1lbnRfM18xXzEgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTQyMjQ6MzogcnVsZV9fWExpc3RMaXRlcmFsX19FbGVtZW50c0Fzc2lnbm1lbnRfM18xXzEKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE1NTYyOjI6ICggcnVsZV9fWExpc3RMaXRlcmFsX19FbGVtZW50c0Fzc2lnbm1lbnRfM18xXzEgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTU1NjI6MzogcnVsZV9fWExpc3RMaXRlcmFsX19FbGVtZW50c0Fzc2lnbm1lbnRfM18xXzEKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzIpOwogICAgICAgICAgICAgcnVsZV9fWExpc3RMaXRlcmFsX19FbGVtZW50c0Fzc2lnbm1lbnRfM18xXzEoKTsKQEAgLTQ3NDM5LDE2ICs1MTg5NiwxNiBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX1hDbG9zdXJlX19Hcm91cF9fMCIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNDIzMzoxOiBydWxlX19YQ2xvc3VyZV9fR3JvdXBfXzAgOiBydWxlX19YQ2xvc3VyZV9fR3JvdXBfXzBfX0ltcGwgcnVsZV9fWENsb3N1cmVfX0dyb3VwX18xIDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNTU3MToxOiBydWxlX19YQ2xvc3VyZV9fR3JvdXBfXzAgOiBydWxlX19YQ2xvc3VyZV9fR3JvdXBfXzBfX0ltcGwgcnVsZV9fWENsb3N1cmVfX0dyb3VwX18xIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YQ2xvc3VyZV9fR3JvdXBfXzAoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTQyMzc6MTogKCBydWxlX19YQ2xvc3VyZV9fR3JvdXBfXzBfX0ltcGwgcnVsZV9fWENsb3N1cmVfX0dyb3VwX18xICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE0MjM4OjI6IHJ1bGVfX1hDbG9zdXJlX19Hcm91cF9fMF9fSW1wbCBydWxlX19YQ2xvc3VyZV9fR3JvdXBfXzEKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE1NTc1OjE6ICggcnVsZV9fWENsb3N1cmVfX0dyb3VwX18wX19JbXBsIHJ1bGVfX1hDbG9zdXJlX19Hcm91cF9fMSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNTU3NjoyOiBydWxlX19YQ2xvc3VyZV9fR3JvdXBfXzBfX0ltcGwgcnVsZV9fWENsb3N1cmVfX0dyb3VwX18xCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV18xMTQpOworICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMTIyKTsKICAgICAgICAgICAgIHJ1bGVfX1hDbG9zdXJlX19Hcm91cF9fMF9fSW1wbCgpOwogCiAgICAgICAgICAgICBzdGF0ZS5fZnNwLS07CkBAIC00NzQ3NywyMyArNTE5MzQsMjMgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YQ2xvc3VyZV9fR3JvdXBfXzBfX0ltcGwiCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTQyNDU6MTogcnVsZV9fWENsb3N1cmVfX0dyb3VwX18wX19JbXBsIDogKCAoIHJ1bGVfX1hDbG9zdXJlX19Hcm91cF8wX18wICkgKSA7CisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTU1ODM6MTogcnVsZV9fWENsb3N1cmVfX0dyb3VwX18wX19JbXBsIDogKCAoIHJ1bGVfX1hDbG9zdXJlX19Hcm91cF8wX18wICkgKSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fWENsb3N1cmVfX0dyb3VwX18wX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE0MjQ5OjE6ICggKCAoIHJ1bGVfX1hDbG9zdXJlX19Hcm91cF8wX18wICkgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNDI1MDoxOiAoICggcnVsZV9fWENsb3N1cmVfX0dyb3VwXzBfXzAgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNTU4NzoxOiAoICggKCBydWxlX19YQ2xvc3VyZV9fR3JvdXBfMF9fMCApICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTU1ODg6MTogKCAoIHJ1bGVfX1hDbG9zdXJlX19Hcm91cF8wX18wICkgKQogICAgICAgICAgICAgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTQyNTA6MTogKCAoIHJ1bGVfX1hDbG9zdXJlX19Hcm91cF8wX18wICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTQyNTE6MjogKCBydWxlX19YQ2xvc3VyZV9fR3JvdXBfMF9fMCApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNTU4ODoxOiAoICggcnVsZV9fWENsb3N1cmVfX0dyb3VwXzBfXzAgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNTU4OToyOiAoIHJ1bGVfX1hDbG9zdXJlX19Hcm91cF8wX18wICkKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WENsb3N1cmVBY2Nlc3MoKS5nZXRHcm91cF8wKCkpOyAKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE0MjUyOjI6ICggcnVsZV9fWENsb3N1cmVfX0dyb3VwXzBfXzAgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTQyNTI6MzogcnVsZV9fWENsb3N1cmVfX0dyb3VwXzBfXzAKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE1NTkwOjI6ICggcnVsZV9fWENsb3N1cmVfX0dyb3VwXzBfXzAgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTU1OTA6MzogcnVsZV9fWENsb3N1cmVfX0dyb3VwXzBfXzAKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzIpOwogICAgICAgICAgICAgcnVsZV9fWENsb3N1cmVfX0dyb3VwXzBfXzAoKTsKQEAgLTQ3NTI4LDE2ICs1MTk4NSwxNiBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX1hDbG9zdXJlX19Hcm91cF9fMSIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNDI2MDoxOiBydWxlX19YQ2xvc3VyZV9fR3JvdXBfXzEgOiBydWxlX19YQ2xvc3VyZV9fR3JvdXBfXzFfX0ltcGwgcnVsZV9fWENsb3N1cmVfX0dyb3VwX18yIDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNTU5ODoxOiBydWxlX19YQ2xvc3VyZV9fR3JvdXBfXzEgOiBydWxlX19YQ2xvc3VyZV9fR3JvdXBfXzFfX0ltcGwgcnVsZV9fWENsb3N1cmVfX0dyb3VwX18yIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YQ2xvc3VyZV9fR3JvdXBfXzEoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTQyNjQ6MTogKCBydWxlX19YQ2xvc3VyZV9fR3JvdXBfXzFfX0ltcGwgcnVsZV9fWENsb3N1cmVfX0dyb3VwX18yICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE0MjY1OjI6IHJ1bGVfX1hDbG9zdXJlX19Hcm91cF9fMV9fSW1wbCBydWxlX19YQ2xvc3VyZV9fR3JvdXBfXzIKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE1NjAyOjE6ICggcnVsZV9fWENsb3N1cmVfX0dyb3VwX18xX19JbXBsIHJ1bGVfX1hDbG9zdXJlX19Hcm91cF9fMiApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNTYwMzoyOiBydWxlX19YQ2xvc3VyZV9fR3JvdXBfXzFfX0ltcGwgcnVsZV9fWENsb3N1cmVfX0dyb3VwX18yCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV18xMTQpOworICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMTIyKTsKICAgICAgICAgICAgIHJ1bGVfX1hDbG9zdXJlX19Hcm91cF9fMV9fSW1wbCgpOwogCiAgICAgICAgICAgICBzdGF0ZS5fZnNwLS07CkBAIC00NzU2NiwyNyArNTIwMjMsMjcgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YQ2xvc3VyZV9fR3JvdXBfXzFfX0ltcGwiCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTQyNzI6MTogcnVsZV9fWENsb3N1cmVfX0dyb3VwX18xX19JbXBsIDogKCAoIHJ1bGVfX1hDbG9zdXJlX19Hcm91cF8xX18wICk/ICkgOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE1NjEwOjE6IHJ1bGVfX1hDbG9zdXJlX19Hcm91cF9fMV9fSW1wbCA6ICggKCBydWxlX19YQ2xvc3VyZV9fR3JvdXBfMV9fMCApPyApIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YQ2xvc3VyZV9fR3JvdXBfXzFfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTQyNzY6MTogKCAoICggcnVsZV9fWENsb3N1cmVfX0dyb3VwXzFfXzAgKT8gKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNDI3NzoxOiAoICggcnVsZV9fWENsb3N1cmVfX0dyb3VwXzFfXzAgKT8gKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTU2MTQ6MTogKCAoICggcnVsZV9fWENsb3N1cmVfX0dyb3VwXzFfXzAgKT8gKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNTYxNToxOiAoICggcnVsZV9fWENsb3N1cmVfX0dyb3VwXzFfXzAgKT8gKQogICAgICAgICAgICAgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTQyNzc6MTogKCAoIHJ1bGVfX1hDbG9zdXJlX19Hcm91cF8xX18wICk/ICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE0Mjc4OjI6ICggcnVsZV9fWENsb3N1cmVfX0dyb3VwXzFfXzAgKT8KKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE1NjE1OjE6ICggKCBydWxlX19YQ2xvc3VyZV9fR3JvdXBfMV9fMCApPyApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNTYxNjoyOiAoIHJ1bGVfX1hDbG9zdXJlX19Hcm91cF8xX18wICk/CiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhDbG9zdXJlQWNjZXNzKCkuZ2V0R3JvdXBfMSgpKTsgCiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNDI3OToyOiAoIHJ1bGVfX1hDbG9zdXJlX19Hcm91cF8xX18wICk/Ci0gICAgICAgICAgICBpbnQgYWx0MTE3PTI7Ci0gICAgICAgICAgICBhbHQxMTcgPSBkZmExMTcucHJlZGljdChpbnB1dCk7Ci0gICAgICAgICAgICBzd2l0Y2ggKGFsdDExNykgeworICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTU2MTc6MjogKCBydWxlX19YQ2xvc3VyZV9fR3JvdXBfMV9fMCApPworICAgICAgICAgICAgaW50IGFsdDEzMD0yOworICAgICAgICAgICAgYWx0MTMwID0gZGZhMTMwLnByZWRpY3QoaW5wdXQpOworICAgICAgICAgICAgc3dpdGNoIChhbHQxMzApIHsKICAgICAgICAgICAgICAgICBjYXNlIDEgOgotICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNDI3OTozOiBydWxlX19YQ2xvc3VyZV9fR3JvdXBfMV9fMAorICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNTYxNzozOiBydWxlX19YQ2xvc3VyZV9fR3JvdXBfMV9fMAogICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzIpOwogICAgICAgICAgICAgICAgICAgICBydWxlX19YQ2xvc3VyZV9fR3JvdXBfMV9fMCgpOwpAQCAtNDc2MjQsMTYgKzUyMDgxLDE2IEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fWENsb3N1cmVfX0dyb3VwX18yIgotICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE0Mjg3OjE6IHJ1bGVfX1hDbG9zdXJlX19Hcm91cF9fMiA6IHJ1bGVfX1hDbG9zdXJlX19Hcm91cF9fMl9fSW1wbCBydWxlX19YQ2xvc3VyZV9fR3JvdXBfXzMgOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE1NjI1OjE6IHJ1bGVfX1hDbG9zdXJlX19Hcm91cF9fMiA6IHJ1bGVfX1hDbG9zdXJlX19Hcm91cF9fMl9fSW1wbCBydWxlX19YQ2xvc3VyZV9fR3JvdXBfXzMgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1hDbG9zdXJlX19Hcm91cF9fMigpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNDI5MToxOiAoIHJ1bGVfX1hDbG9zdXJlX19Hcm91cF9fMl9fSW1wbCBydWxlX19YQ2xvc3VyZV9fR3JvdXBfXzMgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTQyOTI6MjogcnVsZV9fWENsb3N1cmVfX0dyb3VwX18yX19JbXBsIHJ1bGVfX1hDbG9zdXJlX19Hcm91cF9fMworICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTU2Mjk6MTogKCBydWxlX19YQ2xvc3VyZV9fR3JvdXBfXzJfX0ltcGwgcnVsZV9fWENsb3N1cmVfX0dyb3VwX18zICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE1NjMwOjI6IHJ1bGVfX1hDbG9zdXJlX19Hcm91cF9fMl9fSW1wbCBydWxlX19YQ2xvc3VyZV9fR3JvdXBfXzMKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzExNSk7CisgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV18xMjMpOwogICAgICAgICAgICAgcnVsZV9fWENsb3N1cmVfX0dyb3VwX18yX19JbXBsKCk7CiAKICAgICAgICAgICAgIHN0YXRlLl9mc3AtLTsKQEAgLTQ3NjYyLDIzICs1MjExOSwyMyBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX1hDbG9zdXJlX19Hcm91cF9fMl9fSW1wbCIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNDI5OToxOiBydWxlX19YQ2xvc3VyZV9fR3JvdXBfXzJfX0ltcGwgOiAoICggcnVsZV9fWENsb3N1cmVfX0V4cHJlc3Npb25Bc3NpZ25tZW50XzIgKSApIDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNTYzNzoxOiBydWxlX19YQ2xvc3VyZV9fR3JvdXBfXzJfX0ltcGwgOiAoICggcnVsZV9fWENsb3N1cmVfX0V4cHJlc3Npb25Bc3NpZ25tZW50XzIgKSApIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YQ2xvc3VyZV9fR3JvdXBfXzJfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTQzMDM6MTogKCAoICggcnVsZV9fWENsb3N1cmVfX0V4cHJlc3Npb25Bc3NpZ25tZW50XzIgKSApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE0MzA0OjE6ICggKCBydWxlX19YQ2xvc3VyZV9fRXhwcmVzc2lvbkFzc2lnbm1lbnRfMiApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE1NjQxOjE6ICggKCAoIHJ1bGVfX1hDbG9zdXJlX19FeHByZXNzaW9uQXNzaWdubWVudF8yICkgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNTY0MjoxOiAoICggcnVsZV9fWENsb3N1cmVfX0V4cHJlc3Npb25Bc3NpZ25tZW50XzIgKSApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNDMwNDoxOiAoICggcnVsZV9fWENsb3N1cmVfX0V4cHJlc3Npb25Bc3NpZ25tZW50XzIgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNDMwNToyOiAoIHJ1bGVfX1hDbG9zdXJlX19FeHByZXNzaW9uQXNzaWdubWVudF8yICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE1NjQyOjE6ICggKCBydWxlX19YQ2xvc3VyZV9fRXhwcmVzc2lvbkFzc2lnbm1lbnRfMiApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE1NjQzOjI6ICggcnVsZV9fWENsb3N1cmVfX0V4cHJlc3Npb25Bc3NpZ25tZW50XzIgKQogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYQ2xvc3VyZUFjY2VzcygpLmdldEV4cHJlc3Npb25Bc3NpZ25tZW50XzIoKSk7IAogICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTQzMDY6MjogKCBydWxlX19YQ2xvc3VyZV9fRXhwcmVzc2lvbkFzc2lnbm1lbnRfMiApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNDMwNjozOiBydWxlX19YQ2xvc3VyZV9fRXhwcmVzc2lvbkFzc2lnbm1lbnRfMgorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTU2NDQ6MjogKCBydWxlX19YQ2xvc3VyZV9fRXhwcmVzc2lvbkFzc2lnbm1lbnRfMiApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNTY0NDozOiBydWxlX19YQ2xvc3VyZV9fRXhwcmVzc2lvbkFzc2lnbm1lbnRfMgogICAgICAgICAgICAgewogICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMik7CiAgICAgICAgICAgICBydWxlX19YQ2xvc3VyZV9fRXhwcmVzc2lvbkFzc2lnbm1lbnRfMigpOwpAQCAtNDc3MTMsMTQgKzUyMTcwLDE0IEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fWENsb3N1cmVfX0dyb3VwX18zIgotICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE0MzE0OjE6IHJ1bGVfX1hDbG9zdXJlX19Hcm91cF9fMyA6IHJ1bGVfX1hDbG9zdXJlX19Hcm91cF9fM19fSW1wbCA7CisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTU2NTI6MTogcnVsZV9fWENsb3N1cmVfX0dyb3VwX18zIDogcnVsZV9fWENsb3N1cmVfX0dyb3VwX18zX19JbXBsIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YQ2xvc3VyZV9fR3JvdXBfXzMoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTQzMTg6MTogKCBydWxlX19YQ2xvc3VyZV9fR3JvdXBfXzNfX0ltcGwgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTQzMTk6MjogcnVsZV9fWENsb3N1cmVfX0dyb3VwX18zX19JbXBsCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNTY1NjoxOiAoIHJ1bGVfX1hDbG9zdXJlX19Hcm91cF9fM19fSW1wbCApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNTY1NzoyOiBydWxlX19YQ2xvc3VyZV9fR3JvdXBfXzNfX0ltcGwKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzIpOwogICAgICAgICAgICAgcnVsZV9fWENsb3N1cmVfX0dyb3VwX18zX19JbXBsKCk7CkBAIC00Nzc0NiwyMiArNTIyMDMsMjIgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YQ2xvc3VyZV9fR3JvdXBfXzNfX0ltcGwiCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTQzMjU6MTogcnVsZV9fWENsb3N1cmVfX0dyb3VwX18zX19JbXBsIDogKCAnXScgKSA7CisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTU2NjM6MTogcnVsZV9fWENsb3N1cmVfX0dyb3VwX18zX19JbXBsIDogKCAnXScgKSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fWENsb3N1cmVfX0dyb3VwX18zX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE0MzI5OjE6ICggKCAnXScgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNDMzMDoxOiAoICddJyApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNTY2NzoxOiAoICggJ10nICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTU2Njg6MTogKCAnXScgKQogICAgICAgICAgICAgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTQzMzA6MTogKCAnXScgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTQzMzE6MjogJ10nCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNTY2ODoxOiAoICddJyApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNTY2OToyOiAnXScKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WENsb3N1cmVBY2Nlc3MoKS5nZXRSaWdodFNxdWFyZUJyYWNrZXRLZXl3b3JkXzMoKSk7IAogICAgICAgICAgICAgfQotICAgICAgICAgICAgbWF0Y2goaW5wdXQsMTE2LEZPTExPV18yKTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKKyAgICAgICAgICAgIG1hdGNoKGlucHV0LDEyNixGT0xMT1dfMik7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0WENsb3N1cmVBY2Nlc3MoKS5nZXRSaWdodFNxdWFyZUJyYWNrZXRLZXl3b3JkXzMoKSk7IAogICAgICAgICAgICAgfQpAQCAtNDc3ODcsMTQgKzUyMjQ0LDE0IEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fWENsb3N1cmVfX0dyb3VwXzBfXzAiCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTQzNDE6MTogcnVsZV9fWENsb3N1cmVfX0dyb3VwXzBfXzAgOiBydWxlX19YQ2xvc3VyZV9fR3JvdXBfMF9fMF9fSW1wbCA7CisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTU2Nzk6MTogcnVsZV9fWENsb3N1cmVfX0dyb3VwXzBfXzAgOiBydWxlX19YQ2xvc3VyZV9fR3JvdXBfMF9fMF9fSW1wbCA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fWENsb3N1cmVfX0dyb3VwXzBfXzAoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTQzNDU6MTogKCBydWxlX19YQ2xvc3VyZV9fR3JvdXBfMF9fMF9fSW1wbCApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNDM0NjoyOiBydWxlX19YQ2xvc3VyZV9fR3JvdXBfMF9fMF9fSW1wbAorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTU2ODM6MTogKCBydWxlX19YQ2xvc3VyZV9fR3JvdXBfMF9fMF9fSW1wbCApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNTY4NDoyOiBydWxlX19YQ2xvc3VyZV9fR3JvdXBfMF9fMF9fSW1wbAogICAgICAgICAgICAgewogICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMik7CiAgICAgICAgICAgICBydWxlX19YQ2xvc3VyZV9fR3JvdXBfMF9fMF9fSW1wbCgpOwpAQCAtNDc4MjAsMjMgKzUyMjc3LDIzIEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fWENsb3N1cmVfX0dyb3VwXzBfXzBfX0ltcGwiCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTQzNTI6MTogcnVsZV9fWENsb3N1cmVfX0dyb3VwXzBfXzBfX0ltcGwgOiAoICggcnVsZV9fWENsb3N1cmVfX0dyb3VwXzBfMF9fMCApICkgOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE1NjkwOjE6IHJ1bGVfX1hDbG9zdXJlX19Hcm91cF8wX18wX19JbXBsIDogKCAoIHJ1bGVfX1hDbG9zdXJlX19Hcm91cF8wXzBfXzAgKSApIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YQ2xvc3VyZV9fR3JvdXBfMF9fMF9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNDM1NjoxOiAoICggKCBydWxlX19YQ2xvc3VyZV9fR3JvdXBfMF8wX18wICkgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNDM1NzoxOiAoICggcnVsZV9fWENsb3N1cmVfX0dyb3VwXzBfMF9fMCApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE1Njk0OjE6ICggKCAoIHJ1bGVfX1hDbG9zdXJlX19Hcm91cF8wXzBfXzAgKSApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE1Njk1OjE6ICggKCBydWxlX19YQ2xvc3VyZV9fR3JvdXBfMF8wX18wICkgKQogICAgICAgICAgICAgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTQzNTc6MTogKCAoIHJ1bGVfX1hDbG9zdXJlX19Hcm91cF8wXzBfXzAgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNDM1ODoyOiAoIHJ1bGVfX1hDbG9zdXJlX19Hcm91cF8wXzBfXzAgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTU2OTU6MTogKCAoIHJ1bGVfX1hDbG9zdXJlX19Hcm91cF8wXzBfXzAgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNTY5NjoyOiAoIHJ1bGVfX1hDbG9zdXJlX19Hcm91cF8wXzBfXzAgKQogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYQ2xvc3VyZUFjY2VzcygpLmdldEdyb3VwXzBfMCgpKTsgCiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNDM1OToyOiAoIHJ1bGVfX1hDbG9zdXJlX19Hcm91cF8wXzBfXzAgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTQzNTk6MzogcnVsZV9fWENsb3N1cmVfX0dyb3VwXzBfMF9fMAorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTU2OTc6MjogKCBydWxlX19YQ2xvc3VyZV9fR3JvdXBfMF8wX18wICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE1Njk3OjM6IHJ1bGVfX1hDbG9zdXJlX19Hcm91cF8wXzBfXzAKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzIpOwogICAgICAgICAgICAgcnVsZV9fWENsb3N1cmVfX0dyb3VwXzBfMF9fMCgpOwpAQCAtNDc4NzEsMTYgKzUyMzI4LDE2IEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fWENsb3N1cmVfX0dyb3VwXzBfMF9fMCIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNDM2ODoxOiBydWxlX19YQ2xvc3VyZV9fR3JvdXBfMF8wX18wIDogcnVsZV9fWENsb3N1cmVfX0dyb3VwXzBfMF9fMF9fSW1wbCBydWxlX19YQ2xvc3VyZV9fR3JvdXBfMF8wX18xIDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNTcwNjoxOiBydWxlX19YQ2xvc3VyZV9fR3JvdXBfMF8wX18wIDogcnVsZV9fWENsb3N1cmVfX0dyb3VwXzBfMF9fMF9fSW1wbCBydWxlX19YQ2xvc3VyZV9fR3JvdXBfMF8wX18xIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YQ2xvc3VyZV9fR3JvdXBfMF8wX18wKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE0MzcyOjE6ICggcnVsZV9fWENsb3N1cmVfX0dyb3VwXzBfMF9fMF9fSW1wbCBydWxlX19YQ2xvc3VyZV9fR3JvdXBfMF8wX18xICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE0MzczOjI6IHJ1bGVfX1hDbG9zdXJlX19Hcm91cF8wXzBfXzBfX0ltcGwgcnVsZV9fWENsb3N1cmVfX0dyb3VwXzBfMF9fMQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTU3MTA6MTogKCBydWxlX19YQ2xvc3VyZV9fR3JvdXBfMF8wX18wX19JbXBsIHJ1bGVfX1hDbG9zdXJlX19Hcm91cF8wXzBfXzEgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTU3MTE6MjogcnVsZV9fWENsb3N1cmVfX0dyb3VwXzBfMF9fMF9fSW1wbCBydWxlX19YQ2xvc3VyZV9fR3JvdXBfMF8wX18xCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV183OCk7CisgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV184Nik7CiAgICAgICAgICAgICBydWxlX19YQ2xvc3VyZV9fR3JvdXBfMF8wX18wX19JbXBsKCk7CiAKICAgICAgICAgICAgIHN0YXRlLl9mc3AtLTsKQEAgLTQ3OTA5LDIzICs1MjM2NiwyMyBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX1hDbG9zdXJlX19Hcm91cF8wXzBfXzBfX0ltcGwiCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTQzODA6MTogcnVsZV9fWENsb3N1cmVfX0dyb3VwXzBfMF9fMF9fSW1wbCA6ICggKCkgKSA7CisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTU3MTg6MTogcnVsZV9fWENsb3N1cmVfX0dyb3VwXzBfMF9fMF9fSW1wbCA6ICggKCkgKSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fWENsb3N1cmVfX0dyb3VwXzBfMF9fMF9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNDM4NDoxOiAoICggKCkgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNDM4NToxOiAoICgpICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE1NzIyOjE6ICggKCAoKSApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE1NzIzOjE6ICggKCkgKQogICAgICAgICAgICAgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTQzODU6MTogKCAoKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNDM4NjoyOiAoKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTU3MjM6MTogKCAoKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNTcyNDoyOiAoKQogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYQ2xvc3VyZUFjY2VzcygpLmdldFhDbG9zdXJlQWN0aW9uXzBfMF8wKCkpOyAKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE0Mzg3OjI6ICgpCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNDM4NzozOiAKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE1NzI1OjI6ICgpCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNTcyNTozOiAKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIH0KIApAQCAtNDc5NTAsMTQgKzUyNDA3LDE0IEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fWENsb3N1cmVfX0dyb3VwXzBfMF9fMSIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNDM5NToxOiBydWxlX19YQ2xvc3VyZV9fR3JvdXBfMF8wX18xIDogcnVsZV9fWENsb3N1cmVfX0dyb3VwXzBfMF9fMV9fSW1wbCA7CisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTU3MzM6MTogcnVsZV9fWENsb3N1cmVfX0dyb3VwXzBfMF9fMSA6IHJ1bGVfX1hDbG9zdXJlX19Hcm91cF8wXzBfXzFfX0ltcGwgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1hDbG9zdXJlX19Hcm91cF8wXzBfXzEoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTQzOTk6MTogKCBydWxlX19YQ2xvc3VyZV9fR3JvdXBfMF8wX18xX19JbXBsICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE0NDAwOjI6IHJ1bGVfX1hDbG9zdXJlX19Hcm91cF8wXzBfXzFfX0ltcGwKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE1NzM3OjE6ICggcnVsZV9fWENsb3N1cmVfX0dyb3VwXzBfMF9fMV9fSW1wbCApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNTczODoyOiBydWxlX19YQ2xvc3VyZV9fR3JvdXBfMF8wX18xX19JbXBsCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV18yKTsKICAgICAgICAgICAgIHJ1bGVfX1hDbG9zdXJlX19Hcm91cF8wXzBfXzFfX0ltcGwoKTsKQEAgLTQ3OTgzLDIyICs1MjQ0MCwyMiBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX1hDbG9zdXJlX19Hcm91cF8wXzBfXzFfX0ltcGwiCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTQ0MDY6MTogcnVsZV9fWENsb3N1cmVfX0dyb3VwXzBfMF9fMV9fSW1wbCA6ICggJ1snICkgOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE1NzQ0OjE6IHJ1bGVfX1hDbG9zdXJlX19Hcm91cF8wXzBfXzFfX0ltcGwgOiAoICdbJyApIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YQ2xvc3VyZV9fR3JvdXBfMF8wX18xX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE0NDEwOjE6ICggKCAnWycgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNDQxMToxOiAoICdbJyApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNTc0ODoxOiAoICggJ1snICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTU3NDk6MTogKCAnWycgKQogICAgICAgICAgICAgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTQ0MTE6MTogKCAnWycgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTQ0MTI6MjogJ1snCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNTc0OToxOiAoICdbJyApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNTc1MDoyOiAnWycKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WENsb3N1cmVBY2Nlc3MoKS5nZXRMZWZ0U3F1YXJlQnJhY2tldEtleXdvcmRfMF8wXzEoKSk7IAogICAgICAgICAgICAgfQotICAgICAgICAgICAgbWF0Y2goaW5wdXQsMTE4LEZPTExPV18yKTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKKyAgICAgICAgICAgIG1hdGNoKGlucHV0LDEyOCxGT0xMT1dfMik7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0WENsb3N1cmVBY2Nlc3MoKS5nZXRMZWZ0U3F1YXJlQnJhY2tldEtleXdvcmRfMF8wXzEoKSk7IAogICAgICAgICAgICAgfQpAQCAtNDgwMjQsMTQgKzUyNDgxLDE0IEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fWENsb3N1cmVfX0dyb3VwXzFfXzAiCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTQ0MjI6MTogcnVsZV9fWENsb3N1cmVfX0dyb3VwXzFfXzAgOiBydWxlX19YQ2xvc3VyZV9fR3JvdXBfMV9fMF9fSW1wbCA7CisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTU3NjA6MTogcnVsZV9fWENsb3N1cmVfX0dyb3VwXzFfXzAgOiBydWxlX19YQ2xvc3VyZV9fR3JvdXBfMV9fMF9fSW1wbCA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fWENsb3N1cmVfX0dyb3VwXzFfXzAoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTQ0MjY6MTogKCBydWxlX19YQ2xvc3VyZV9fR3JvdXBfMV9fMF9fSW1wbCApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNDQyNzoyOiBydWxlX19YQ2xvc3VyZV9fR3JvdXBfMV9fMF9fSW1wbAorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTU3NjQ6MTogKCBydWxlX19YQ2xvc3VyZV9fR3JvdXBfMV9fMF9fSW1wbCApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNTc2NToyOiBydWxlX19YQ2xvc3VyZV9fR3JvdXBfMV9fMF9fSW1wbAogICAgICAgICAgICAgewogICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMik7CiAgICAgICAgICAgICBydWxlX19YQ2xvc3VyZV9fR3JvdXBfMV9fMF9fSW1wbCgpOwpAQCAtNDgwNTcsMjMgKzUyNTE0LDIzIEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fWENsb3N1cmVfX0dyb3VwXzFfXzBfX0ltcGwiCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTQ0MzM6MTogcnVsZV9fWENsb3N1cmVfX0dyb3VwXzFfXzBfX0ltcGwgOiAoICggcnVsZV9fWENsb3N1cmVfX0dyb3VwXzFfMF9fMCApICkgOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE1NzcxOjE6IHJ1bGVfX1hDbG9zdXJlX19Hcm91cF8xX18wX19JbXBsIDogKCAoIHJ1bGVfX1hDbG9zdXJlX19Hcm91cF8xXzBfXzAgKSApIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YQ2xvc3VyZV9fR3JvdXBfMV9fMF9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNDQzNzoxOiAoICggKCBydWxlX19YQ2xvc3VyZV9fR3JvdXBfMV8wX18wICkgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNDQzODoxOiAoICggcnVsZV9fWENsb3N1cmVfX0dyb3VwXzFfMF9fMCApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE1Nzc1OjE6ICggKCAoIHJ1bGVfX1hDbG9zdXJlX19Hcm91cF8xXzBfXzAgKSApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE1Nzc2OjE6ICggKCBydWxlX19YQ2xvc3VyZV9fR3JvdXBfMV8wX18wICkgKQogICAgICAgICAgICAgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTQ0Mzg6MTogKCAoIHJ1bGVfX1hDbG9zdXJlX19Hcm91cF8xXzBfXzAgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNDQzOToyOiAoIHJ1bGVfX1hDbG9zdXJlX19Hcm91cF8xXzBfXzAgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTU3NzY6MTogKCAoIHJ1bGVfX1hDbG9zdXJlX19Hcm91cF8xXzBfXzAgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNTc3NzoyOiAoIHJ1bGVfX1hDbG9zdXJlX19Hcm91cF8xXzBfXzAgKQogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYQ2xvc3VyZUFjY2VzcygpLmdldEdyb3VwXzFfMCgpKTsgCiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNDQ0MDoyOiAoIHJ1bGVfX1hDbG9zdXJlX19Hcm91cF8xXzBfXzAgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTQ0NDA6MzogcnVsZV9fWENsb3N1cmVfX0dyb3VwXzFfMF9fMAorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTU3Nzg6MjogKCBydWxlX19YQ2xvc3VyZV9fR3JvdXBfMV8wX18wICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE1Nzc4OjM6IHJ1bGVfX1hDbG9zdXJlX19Hcm91cF8xXzBfXzAKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzIpOwogICAgICAgICAgICAgcnVsZV9fWENsb3N1cmVfX0dyb3VwXzFfMF9fMCgpOwpAQCAtNDgxMDgsMTYgKzUyNTY1LDE2IEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fWENsb3N1cmVfX0dyb3VwXzFfMF9fMCIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNDQ0OToxOiBydWxlX19YQ2xvc3VyZV9fR3JvdXBfMV8wX18wIDogcnVsZV9fWENsb3N1cmVfX0dyb3VwXzFfMF9fMF9fSW1wbCBydWxlX19YQ2xvc3VyZV9fR3JvdXBfMV8wX18xIDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNTc4NzoxOiBydWxlX19YQ2xvc3VyZV9fR3JvdXBfMV8wX18wIDogcnVsZV9fWENsb3N1cmVfX0dyb3VwXzFfMF9fMF9fSW1wbCBydWxlX19YQ2xvc3VyZV9fR3JvdXBfMV8wX18xIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YQ2xvc3VyZV9fR3JvdXBfMV8wX18wKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE0NDUzOjE6ICggcnVsZV9fWENsb3N1cmVfX0dyb3VwXzFfMF9fMF9fSW1wbCBydWxlX19YQ2xvc3VyZV9fR3JvdXBfMV8wX18xICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE0NDU0OjI6IHJ1bGVfX1hDbG9zdXJlX19Hcm91cF8xXzBfXzBfX0ltcGwgcnVsZV9fWENsb3N1cmVfX0dyb3VwXzFfMF9fMQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTU3OTE6MTogKCBydWxlX19YQ2xvc3VyZV9fR3JvdXBfMV8wX18wX19JbXBsIHJ1bGVfX1hDbG9zdXJlX19Hcm91cF8xXzBfXzEgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTU3OTI6MjogcnVsZV9fWENsb3N1cmVfX0dyb3VwXzFfMF9fMF9fSW1wbCBydWxlX19YQ2xvc3VyZV9fR3JvdXBfMV8wX18xCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV18xMTYpOworICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMTI0KTsKICAgICAgICAgICAgIHJ1bGVfX1hDbG9zdXJlX19Hcm91cF8xXzBfXzBfX0ltcGwoKTsKIAogICAgICAgICAgICAgc3RhdGUuX2ZzcC0tOwpAQCAtNDgxNDYsMzEgKzUyNjAzLDMxIEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fWENsb3N1cmVfX0dyb3VwXzFfMF9fMF9fSW1wbCIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNDQ2MToxOiBydWxlX19YQ2xvc3VyZV9fR3JvdXBfMV8wX18wX19JbXBsIDogKCAoIHJ1bGVfX1hDbG9zdXJlX19Hcm91cF8xXzBfMF9fMCApPyApIDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNTc5OToxOiBydWxlX19YQ2xvc3VyZV9fR3JvdXBfMV8wX18wX19JbXBsIDogKCAoIHJ1bGVfX1hDbG9zdXJlX19Hcm91cF8xXzBfMF9fMCApPyApIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YQ2xvc3VyZV9fR3JvdXBfMV8wX18wX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE0NDY1OjE6ICggKCAoIHJ1bGVfX1hDbG9zdXJlX19Hcm91cF8xXzBfMF9fMCApPyApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE0NDY2OjE6ICggKCBydWxlX19YQ2xvc3VyZV9fR3JvdXBfMV8wXzBfXzAgKT8gKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTU4MDM6MTogKCAoICggcnVsZV9fWENsb3N1cmVfX0dyb3VwXzFfMF8wX18wICk/ICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTU4MDQ6MTogKCAoIHJ1bGVfX1hDbG9zdXJlX19Hcm91cF8xXzBfMF9fMCApPyApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNDQ2NjoxOiAoICggcnVsZV9fWENsb3N1cmVfX0dyb3VwXzFfMF8wX18wICk/ICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE0NDY3OjI6ICggcnVsZV9fWENsb3N1cmVfX0dyb3VwXzFfMF8wX18wICk/CisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNTgwNDoxOiAoICggcnVsZV9fWENsb3N1cmVfX0dyb3VwXzFfMF8wX18wICk/ICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE1ODA1OjI6ICggcnVsZV9fWENsb3N1cmVfX0dyb3VwXzFfMF8wX18wICk/CiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhDbG9zdXJlQWNjZXNzKCkuZ2V0R3JvdXBfMV8wXzAoKSk7IAogICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTQ0Njg6MjogKCBydWxlX19YQ2xvc3VyZV9fR3JvdXBfMV8wXzBfXzAgKT8KLSAgICAgICAgICAgIGludCBhbHQxMTg9MjsKLSAgICAgICAgICAgIGludCBMQTExOF8wID0gaW5wdXQuTEEoMSk7CisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNTgwNjoyOiAoIHJ1bGVfX1hDbG9zdXJlX19Hcm91cF8xXzBfMF9fMCApPworICAgICAgICAgICAgaW50IGFsdDEzMT0yOworICAgICAgICAgICAgaW50IExBMTMxXzAgPSBpbnB1dC5MQSgxKTsKIAotICAgICAgICAgICAgaWYgKCAoTEExMThfMD09UlVMRV9JRHx8TEExMThfMD09MzF8fExBMTE4XzA9PTExMykgKSB7Ci0gICAgICAgICAgICAgICAgYWx0MTE4PTE7CisgICAgICAgICAgICBpZiAoIChMQTEzMV8wPT1SVUxFX0lEfHxMQTEzMV8wPT0zMXx8TEExMzFfMD09MTIzKSApIHsKKyAgICAgICAgICAgICAgICBhbHQxMzE9MTsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHN3aXRjaCAoYWx0MTE4KSB7CisgICAgICAgICAgICBzd2l0Y2ggKGFsdDEzMSkgewogICAgICAgICAgICAgICAgIGNhc2UgMSA6Ci0gICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE0NDY4OjM6IHJ1bGVfX1hDbG9zdXJlX19Hcm91cF8xXzBfMF9fMAorICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNTgwNjozOiBydWxlX19YQ2xvc3VyZV9fR3JvdXBfMV8wXzBfXzAKICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV18yKTsKICAgICAgICAgICAgICAgICAgICAgcnVsZV9fWENsb3N1cmVfX0dyb3VwXzFfMF8wX18wKCk7CkBAIC00ODIwOCwxNCArNTI2NjUsMTQgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YQ2xvc3VyZV9fR3JvdXBfMV8wX18xIgotICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE0NDc2OjE6IHJ1bGVfX1hDbG9zdXJlX19Hcm91cF8xXzBfXzEgOiBydWxlX19YQ2xvc3VyZV9fR3JvdXBfMV8wX18xX19JbXBsIDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNTgxNDoxOiBydWxlX19YQ2xvc3VyZV9fR3JvdXBfMV8wX18xIDogcnVsZV9fWENsb3N1cmVfX0dyb3VwXzFfMF9fMV9fSW1wbCA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fWENsb3N1cmVfX0dyb3VwXzFfMF9fMSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNDQ4MDoxOiAoIHJ1bGVfX1hDbG9zdXJlX19Hcm91cF8xXzBfXzFfX0ltcGwgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTQ0ODE6MjogcnVsZV9fWENsb3N1cmVfX0dyb3VwXzFfMF9fMV9fSW1wbAorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTU4MTg6MTogKCBydWxlX19YQ2xvc3VyZV9fR3JvdXBfMV8wX18xX19JbXBsICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE1ODE5OjI6IHJ1bGVfX1hDbG9zdXJlX19Hcm91cF8xXzBfXzFfX0ltcGwKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzIpOwogICAgICAgICAgICAgcnVsZV9fWENsb3N1cmVfX0dyb3VwXzFfMF9fMV9fSW1wbCgpOwpAQCAtNDgyNDEsMjMgKzUyNjk4LDIzIEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fWENsb3N1cmVfX0dyb3VwXzFfMF9fMV9fSW1wbCIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNDQ4NzoxOiBydWxlX19YQ2xvc3VyZV9fR3JvdXBfMV8wX18xX19JbXBsIDogKCAoIHJ1bGVfX1hDbG9zdXJlX19FeHBsaWNpdFN5bnRheEFzc2lnbm1lbnRfMV8wXzEgKSApIDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNTgyNToxOiBydWxlX19YQ2xvc3VyZV9fR3JvdXBfMV8wX18xX19JbXBsIDogKCAoIHJ1bGVfX1hDbG9zdXJlX19FeHBsaWNpdFN5bnRheEFzc2lnbm1lbnRfMV8wXzEgKSApIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YQ2xvc3VyZV9fR3JvdXBfMV8wX18xX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE0NDkxOjE6ICggKCAoIHJ1bGVfX1hDbG9zdXJlX19FeHBsaWNpdFN5bnRheEFzc2lnbm1lbnRfMV8wXzEgKSApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE0NDkyOjE6ICggKCBydWxlX19YQ2xvc3VyZV9fRXhwbGljaXRTeW50YXhBc3NpZ25tZW50XzFfMF8xICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTU4Mjk6MTogKCAoICggcnVsZV9fWENsb3N1cmVfX0V4cGxpY2l0U3ludGF4QXNzaWdubWVudF8xXzBfMSApICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTU4MzA6MTogKCAoIHJ1bGVfX1hDbG9zdXJlX19FeHBsaWNpdFN5bnRheEFzc2lnbm1lbnRfMV8wXzEgKSApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNDQ5MjoxOiAoICggcnVsZV9fWENsb3N1cmVfX0V4cGxpY2l0U3ludGF4QXNzaWdubWVudF8xXzBfMSApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE0NDkzOjI6ICggcnVsZV9fWENsb3N1cmVfX0V4cGxpY2l0U3ludGF4QXNzaWdubWVudF8xXzBfMSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNTgzMDoxOiAoICggcnVsZV9fWENsb3N1cmVfX0V4cGxpY2l0U3ludGF4QXNzaWdubWVudF8xXzBfMSApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE1ODMxOjI6ICggcnVsZV9fWENsb3N1cmVfX0V4cGxpY2l0U3ludGF4QXNzaWdubWVudF8xXzBfMSApCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhDbG9zdXJlQWNjZXNzKCkuZ2V0RXhwbGljaXRTeW50YXhBc3NpZ25tZW50XzFfMF8xKCkpOyAKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE0NDk0OjI6ICggcnVsZV9fWENsb3N1cmVfX0V4cGxpY2l0U3ludGF4QXNzaWdubWVudF8xXzBfMSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNDQ5NDozOiBydWxlX19YQ2xvc3VyZV9fRXhwbGljaXRTeW50YXhBc3NpZ25tZW50XzFfMF8xCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNTgzMjoyOiAoIHJ1bGVfX1hDbG9zdXJlX19FeHBsaWNpdFN5bnRheEFzc2lnbm1lbnRfMV8wXzEgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTU4MzI6MzogcnVsZV9fWENsb3N1cmVfX0V4cGxpY2l0U3ludGF4QXNzaWdubWVudF8xXzBfMQogICAgICAgICAgICAgewogICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMik7CiAgICAgICAgICAgICBydWxlX19YQ2xvc3VyZV9fRXhwbGljaXRTeW50YXhBc3NpZ25tZW50XzFfMF8xKCk7CkBAIC00ODI5MiwxNiArNTI3NDksMTYgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YQ2xvc3VyZV9fR3JvdXBfMV8wXzBfXzAiCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTQ1MDM6MTogcnVsZV9fWENsb3N1cmVfX0dyb3VwXzFfMF8wX18wIDogcnVsZV9fWENsb3N1cmVfX0dyb3VwXzFfMF8wX18wX19JbXBsIHJ1bGVfX1hDbG9zdXJlX19Hcm91cF8xXzBfMF9fMSA7CisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTU4NDE6MTogcnVsZV9fWENsb3N1cmVfX0dyb3VwXzFfMF8wX18wIDogcnVsZV9fWENsb3N1cmVfX0dyb3VwXzFfMF8wX18wX19JbXBsIHJ1bGVfX1hDbG9zdXJlX19Hcm91cF8xXzBfMF9fMSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fWENsb3N1cmVfX0dyb3VwXzFfMF8wX18wKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE0NTA3OjE6ICggcnVsZV9fWENsb3N1cmVfX0dyb3VwXzFfMF8wX18wX19JbXBsIHJ1bGVfX1hDbG9zdXJlX19Hcm91cF8xXzBfMF9fMSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNDUwODoyOiBydWxlX19YQ2xvc3VyZV9fR3JvdXBfMV8wXzBfXzBfX0ltcGwgcnVsZV9fWENsb3N1cmVfX0dyb3VwXzFfMF8wX18xCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNTg0NToxOiAoIHJ1bGVfX1hDbG9zdXJlX19Hcm91cF8xXzBfMF9fMF9fSW1wbCBydWxlX19YQ2xvc3VyZV9fR3JvdXBfMV8wXzBfXzEgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTU4NDY6MjogcnVsZV9fWENsb3N1cmVfX0dyb3VwXzFfMF8wX18wX19JbXBsIHJ1bGVfX1hDbG9zdXJlX19Hcm91cF8xXzBfMF9fMQogICAgICAgICAgICAgewotICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfNzIpOworICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfODApOwogICAgICAgICAgICAgcnVsZV9fWENsb3N1cmVfX0dyb3VwXzFfMF8wX18wX19JbXBsKCk7CiAKICAgICAgICAgICAgIHN0YXRlLl9mc3AtLTsKQEAgLTQ4MzMwLDIzICs1Mjc4NywyMyBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX1hDbG9zdXJlX19Hcm91cF8xXzBfMF9fMF9fSW1wbCIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNDUxNToxOiBydWxlX19YQ2xvc3VyZV9fR3JvdXBfMV8wXzBfXzBfX0ltcGwgOiAoICggcnVsZV9fWENsb3N1cmVfX0RlY2xhcmVkRm9ybWFsUGFyYW1ldGVyc0Fzc2lnbm1lbnRfMV8wXzBfMCApICkgOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE1ODUzOjE6IHJ1bGVfX1hDbG9zdXJlX19Hcm91cF8xXzBfMF9fMF9fSW1wbCA6ICggKCBydWxlX19YQ2xvc3VyZV9fRGVjbGFyZWRGb3JtYWxQYXJhbWV0ZXJzQXNzaWdubWVudF8xXzBfMF8wICkgKSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fWENsb3N1cmVfX0dyb3VwXzFfMF8wX18wX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE0NTE5OjE6ICggKCAoIHJ1bGVfX1hDbG9zdXJlX19EZWNsYXJlZEZvcm1hbFBhcmFtZXRlcnNBc3NpZ25tZW50XzFfMF8wXzAgKSApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE0NTIwOjE6ICggKCBydWxlX19YQ2xvc3VyZV9fRGVjbGFyZWRGb3JtYWxQYXJhbWV0ZXJzQXNzaWdubWVudF8xXzBfMF8wICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTU4NTc6MTogKCAoICggcnVsZV9fWENsb3N1cmVfX0RlY2xhcmVkRm9ybWFsUGFyYW1ldGVyc0Fzc2lnbm1lbnRfMV8wXzBfMCApICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTU4NTg6MTogKCAoIHJ1bGVfX1hDbG9zdXJlX19EZWNsYXJlZEZvcm1hbFBhcmFtZXRlcnNBc3NpZ25tZW50XzFfMF8wXzAgKSApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNDUyMDoxOiAoICggcnVsZV9fWENsb3N1cmVfX0RlY2xhcmVkRm9ybWFsUGFyYW1ldGVyc0Fzc2lnbm1lbnRfMV8wXzBfMCApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE0NTIxOjI6ICggcnVsZV9fWENsb3N1cmVfX0RlY2xhcmVkRm9ybWFsUGFyYW1ldGVyc0Fzc2lnbm1lbnRfMV8wXzBfMCApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNTg1ODoxOiAoICggcnVsZV9fWENsb3N1cmVfX0RlY2xhcmVkRm9ybWFsUGFyYW1ldGVyc0Fzc2lnbm1lbnRfMV8wXzBfMCApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE1ODU5OjI6ICggcnVsZV9fWENsb3N1cmVfX0RlY2xhcmVkRm9ybWFsUGFyYW1ldGVyc0Fzc2lnbm1lbnRfMV8wXzBfMCApCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhDbG9zdXJlQWNjZXNzKCkuZ2V0RGVjbGFyZWRGb3JtYWxQYXJhbWV0ZXJzQXNzaWdubWVudF8xXzBfMF8wKCkpOyAKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE0NTIyOjI6ICggcnVsZV9fWENsb3N1cmVfX0RlY2xhcmVkRm9ybWFsUGFyYW1ldGVyc0Fzc2lnbm1lbnRfMV8wXzBfMCApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNDUyMjozOiBydWxlX19YQ2xvc3VyZV9fRGVjbGFyZWRGb3JtYWxQYXJhbWV0ZXJzQXNzaWdubWVudF8xXzBfMF8wCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNTg2MDoyOiAoIHJ1bGVfX1hDbG9zdXJlX19EZWNsYXJlZEZvcm1hbFBhcmFtZXRlcnNBc3NpZ25tZW50XzFfMF8wXzAgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTU4NjA6MzogcnVsZV9fWENsb3N1cmVfX0RlY2xhcmVkRm9ybWFsUGFyYW1ldGVyc0Fzc2lnbm1lbnRfMV8wXzBfMAogICAgICAgICAgICAgewogICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMik7CiAgICAgICAgICAgICBydWxlX19YQ2xvc3VyZV9fRGVjbGFyZWRGb3JtYWxQYXJhbWV0ZXJzQXNzaWdubWVudF8xXzBfMF8wKCk7CkBAIC00ODM4MSwxNCArNTI4MzgsMTQgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YQ2xvc3VyZV9fR3JvdXBfMV8wXzBfXzEiCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTQ1MzA6MTogcnVsZV9fWENsb3N1cmVfX0dyb3VwXzFfMF8wX18xIDogcnVsZV9fWENsb3N1cmVfX0dyb3VwXzFfMF8wX18xX19JbXBsIDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNTg2ODoxOiBydWxlX19YQ2xvc3VyZV9fR3JvdXBfMV8wXzBfXzEgOiBydWxlX19YQ2xvc3VyZV9fR3JvdXBfMV8wXzBfXzFfX0ltcGwgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1hDbG9zdXJlX19Hcm91cF8xXzBfMF9fMSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNDUzNDoxOiAoIHJ1bGVfX1hDbG9zdXJlX19Hcm91cF8xXzBfMF9fMV9fSW1wbCApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNDUzNToyOiBydWxlX19YQ2xvc3VyZV9fR3JvdXBfMV8wXzBfXzFfX0ltcGwKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE1ODcyOjE6ICggcnVsZV9fWENsb3N1cmVfX0dyb3VwXzFfMF8wX18xX19JbXBsICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE1ODczOjI6IHJ1bGVfX1hDbG9zdXJlX19Hcm91cF8xXzBfMF9fMV9fSW1wbAogICAgICAgICAgICAgewogICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMik7CiAgICAgICAgICAgICBydWxlX19YQ2xvc3VyZV9fR3JvdXBfMV8wXzBfXzFfX0ltcGwoKTsKQEAgLTQ4NDE0LDM3ICs1Mjg3MSwzNyBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX1hDbG9zdXJlX19Hcm91cF8xXzBfMF9fMV9fSW1wbCIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNDU0MToxOiBydWxlX19YQ2xvc3VyZV9fR3JvdXBfMV8wXzBfXzFfX0ltcGwgOiAoICggcnVsZV9fWENsb3N1cmVfX0dyb3VwXzFfMF8wXzFfXzAgKSogKSA7CisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTU4Nzk6MTogcnVsZV9fWENsb3N1cmVfX0dyb3VwXzFfMF8wX18xX19JbXBsIDogKCAoIHJ1bGVfX1hDbG9zdXJlX19Hcm91cF8xXzBfMF8xX18wICkqICkgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1hDbG9zdXJlX19Hcm91cF8xXzBfMF9fMV9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNDU0NToxOiAoICggKCBydWxlX19YQ2xvc3VyZV9fR3JvdXBfMV8wXzBfMV9fMCApKiApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE0NTQ2OjE6ICggKCBydWxlX19YQ2xvc3VyZV9fR3JvdXBfMV8wXzBfMV9fMCApKiApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNTg4MzoxOiAoICggKCBydWxlX19YQ2xvc3VyZV9fR3JvdXBfMV8wXzBfMV9fMCApKiApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE1ODg0OjE6ICggKCBydWxlX19YQ2xvc3VyZV9fR3JvdXBfMV8wXzBfMV9fMCApKiApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNDU0NjoxOiAoICggcnVsZV9fWENsb3N1cmVfX0dyb3VwXzFfMF8wXzFfXzAgKSogKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTQ1NDc6MjogKCBydWxlX19YQ2xvc3VyZV9fR3JvdXBfMV8wXzBfMV9fMCApKgorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTU4ODQ6MTogKCAoIHJ1bGVfX1hDbG9zdXJlX19Hcm91cF8xXzBfMF8xX18wICkqICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE1ODg1OjI6ICggcnVsZV9fWENsb3N1cmVfX0dyb3VwXzFfMF8wXzFfXzAgKSoKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WENsb3N1cmVBY2Nlc3MoKS5nZXRHcm91cF8xXzBfMF8xKCkpOyAKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE0NTQ4OjI6ICggcnVsZV9fWENsb3N1cmVfX0dyb3VwXzFfMF8wXzFfXzAgKSoKLSAgICAgICAgICAgIGxvb3AxMTk6CisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNTg4NjoyOiAoIHJ1bGVfX1hDbG9zdXJlX19Hcm91cF8xXzBfMF8xX18wICkqCisgICAgICAgICAgICBsb29wMTMyOgogICAgICAgICAgICAgZG8gewotICAgICAgICAgICAgICAgIGludCBhbHQxMTk9MjsKLSAgICAgICAgICAgICAgICBpbnQgTEExMTlfMCA9IGlucHV0LkxBKDEpOworICAgICAgICAgICAgICAgIGludCBhbHQxMzI9MjsKKyAgICAgICAgICAgICAgICBpbnQgTEExMzJfMCA9IGlucHV0LkxBKDEpOwogCi0gICAgICAgICAgICAgICAgaWYgKCAoTEExMTlfMD09MTE1KSApIHsKLSAgICAgICAgICAgICAgICAgICAgYWx0MTE5PTE7CisgICAgICAgICAgICAgICAgaWYgKCAoTEExMzJfMD09MTI1KSApIHsKKyAgICAgICAgICAgICAgICAgICAgYWx0MTMyPTE7CiAgICAgICAgICAgICAgICAgfQogCiAKLSAgICAgICAgICAgICAgICBzd2l0Y2ggKGFsdDExOSkgeworICAgICAgICAgICAgICAgIHN3aXRjaCAoYWx0MTMyKSB7CiAgICAgICAgICAgICAJY2FzZSAxIDoKLSAgICAgICAgICAgIAkgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTQ1NDg6MzogcnVsZV9fWENsb3N1cmVfX0dyb3VwXzFfMF8wXzFfXzAKKyAgICAgICAgICAgIAkgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTU4ODY6MzogcnVsZV9fWENsb3N1cmVfX0dyb3VwXzFfMF8wXzFfXzAKICAgICAgICAgICAgIAkgICAgewotICAgICAgICAgICAgCSAgICBwdXNoRm9sbG93KEZPTExPV183Myk7CisgICAgICAgICAgICAJICAgIHB1c2hGb2xsb3coRk9MTE9XXzgxKTsKICAgICAgICAgICAgIAkgICAgcnVsZV9fWENsb3N1cmVfX0dyb3VwXzFfMF8wXzFfXzAoKTsKIAogICAgICAgICAgICAgCSAgICBzdGF0ZS5fZnNwLS07CkBAIC00ODQ1NCw3ICs1MjkxMSw3IEBACiAgICAgICAgICAgICAJICAgIGJyZWFrOwogCiAgICAgICAgICAgICAJZGVmYXVsdCA6Ci0gICAgICAgICAgICAJICAgIGJyZWFrIGxvb3AxMTk7CisgICAgICAgICAgICAJICAgIGJyZWFrIGxvb3AxMzI7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfSB3aGlsZSAodHJ1ZSk7CiAKQEAgLTQ4NDgzLDE2ICs1Mjk0MCwxNiBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX1hDbG9zdXJlX19Hcm91cF8xXzBfMF8xX18wIgotICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE0NTU3OjE6IHJ1bGVfX1hDbG9zdXJlX19Hcm91cF8xXzBfMF8xX18wIDogcnVsZV9fWENsb3N1cmVfX0dyb3VwXzFfMF8wXzFfXzBfX0ltcGwgcnVsZV9fWENsb3N1cmVfX0dyb3VwXzFfMF8wXzFfXzEgOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE1ODk1OjE6IHJ1bGVfX1hDbG9zdXJlX19Hcm91cF8xXzBfMF8xX18wIDogcnVsZV9fWENsb3N1cmVfX0dyb3VwXzFfMF8wXzFfXzBfX0ltcGwgcnVsZV9fWENsb3N1cmVfX0dyb3VwXzFfMF8wXzFfXzEgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1hDbG9zdXJlX19Hcm91cF8xXzBfMF8xX18wKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE0NTYxOjE6ICggcnVsZV9fWENsb3N1cmVfX0dyb3VwXzFfMF8wXzFfXzBfX0ltcGwgcnVsZV9fWENsb3N1cmVfX0dyb3VwXzFfMF8wXzFfXzEgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTQ1NjI6MjogcnVsZV9fWENsb3N1cmVfX0dyb3VwXzFfMF8wXzFfXzBfX0ltcGwgcnVsZV9fWENsb3N1cmVfX0dyb3VwXzFfMF8wXzFfXzEKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE1ODk5OjE6ICggcnVsZV9fWENsb3N1cmVfX0dyb3VwXzFfMF8wXzFfXzBfX0ltcGwgcnVsZV9fWENsb3N1cmVfX0dyb3VwXzFfMF8wXzFfXzEgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTU5MDA6MjogcnVsZV9fWENsb3N1cmVfX0dyb3VwXzFfMF8wXzFfXzBfX0ltcGwgcnVsZV9fWENsb3N1cmVfX0dyb3VwXzFfMF8wXzFfXzEKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzkxKTsKKyAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzk5KTsKICAgICAgICAgICAgIHJ1bGVfX1hDbG9zdXJlX19Hcm91cF8xXzBfMF8xX18wX19JbXBsKCk7CiAKICAgICAgICAgICAgIHN0YXRlLl9mc3AtLTsKQEAgLTQ4NTIxLDIyICs1Mjk3OCwyMiBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX1hDbG9zdXJlX19Hcm91cF8xXzBfMF8xX18wX19JbXBsIgotICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE0NTY5OjE6IHJ1bGVfX1hDbG9zdXJlX19Hcm91cF8xXzBfMF8xX18wX19JbXBsIDogKCAnLCcgKSA7CisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTU5MDc6MTogcnVsZV9fWENsb3N1cmVfX0dyb3VwXzFfMF8wXzFfXzBfX0ltcGwgOiAoICcsJyApIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YQ2xvc3VyZV9fR3JvdXBfMV8wXzBfMV9fMF9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNDU3MzoxOiAoICggJywnICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTQ1NzQ6MTogKCAnLCcgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTU5MTE6MTogKCAoICcsJyApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE1OTEyOjE6ICggJywnICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE0NTc0OjE6ICggJywnICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE0NTc1OjI6ICcsJworICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTU5MTI6MTogKCAnLCcgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTU5MTM6MjogJywnCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhDbG9zdXJlQWNjZXNzKCkuZ2V0Q29tbWFLZXl3b3JkXzFfMF8wXzFfMCgpKTsgCiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBtYXRjaChpbnB1dCwxMTUsRk9MTE9XXzIpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOworICAgICAgICAgICAgbWF0Y2goaW5wdXQsMTI1LEZPTExPV18yKTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRYQ2xvc3VyZUFjY2VzcygpLmdldENvbW1hS2V5d29yZF8xXzBfMF8xXzAoKSk7IAogICAgICAgICAgICAgfQpAQCAtNDg1NjIsMTQgKzUzMDE5LDE0IEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fWENsb3N1cmVfX0dyb3VwXzFfMF8wXzFfXzEiCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTQ1ODQ6MTogcnVsZV9fWENsb3N1cmVfX0dyb3VwXzFfMF8wXzFfXzEgOiBydWxlX19YQ2xvc3VyZV9fR3JvdXBfMV8wXzBfMV9fMV9fSW1wbCA7CisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTU5MjI6MTogcnVsZV9fWENsb3N1cmVfX0dyb3VwXzFfMF8wXzFfXzEgOiBydWxlX19YQ2xvc3VyZV9fR3JvdXBfMV8wXzBfMV9fMV9fSW1wbCA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fWENsb3N1cmVfX0dyb3VwXzFfMF8wXzFfXzEoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTQ1ODg6MTogKCBydWxlX19YQ2xvc3VyZV9fR3JvdXBfMV8wXzBfMV9fMV9fSW1wbCApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNDU4OToyOiBydWxlX19YQ2xvc3VyZV9fR3JvdXBfMV8wXzBfMV9fMV9fSW1wbAorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTU5MjY6MTogKCBydWxlX19YQ2xvc3VyZV9fR3JvdXBfMV8wXzBfMV9fMV9fSW1wbCApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNTkyNzoyOiBydWxlX19YQ2xvc3VyZV9fR3JvdXBfMV8wXzBfMV9fMV9fSW1wbAogICAgICAgICAgICAgewogICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMik7CiAgICAgICAgICAgICBydWxlX19YQ2xvc3VyZV9fR3JvdXBfMV8wXzBfMV9fMV9fSW1wbCgpOwpAQCAtNDg1OTUsMjMgKzUzMDUyLDIzIEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fWENsb3N1cmVfX0dyb3VwXzFfMF8wXzFfXzFfX0ltcGwiCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTQ1OTU6MTogcnVsZV9fWENsb3N1cmVfX0dyb3VwXzFfMF8wXzFfXzFfX0ltcGwgOiAoICggcnVsZV9fWENsb3N1cmVfX0RlY2xhcmVkRm9ybWFsUGFyYW1ldGVyc0Fzc2lnbm1lbnRfMV8wXzBfMV8xICkgKSA7CisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTU5MzM6MTogcnVsZV9fWENsb3N1cmVfX0dyb3VwXzFfMF8wXzFfXzFfX0ltcGwgOiAoICggcnVsZV9fWENsb3N1cmVfX0RlY2xhcmVkRm9ybWFsUGFyYW1ldGVyc0Fzc2lnbm1lbnRfMV8wXzBfMV8xICkgKSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fWENsb3N1cmVfX0dyb3VwXzFfMF8wXzFfXzFfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTQ1OTk6MTogKCAoICggcnVsZV9fWENsb3N1cmVfX0RlY2xhcmVkRm9ybWFsUGFyYW1ldGVyc0Fzc2lnbm1lbnRfMV8wXzBfMV8xICkgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNDYwMDoxOiAoICggcnVsZV9fWENsb3N1cmVfX0RlY2xhcmVkRm9ybWFsUGFyYW1ldGVyc0Fzc2lnbm1lbnRfMV8wXzBfMV8xICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTU5Mzc6MTogKCAoICggcnVsZV9fWENsb3N1cmVfX0RlY2xhcmVkRm9ybWFsUGFyYW1ldGVyc0Fzc2lnbm1lbnRfMV8wXzBfMV8xICkgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNTkzODoxOiAoICggcnVsZV9fWENsb3N1cmVfX0RlY2xhcmVkRm9ybWFsUGFyYW1ldGVyc0Fzc2lnbm1lbnRfMV8wXzBfMV8xICkgKQogICAgICAgICAgICAgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTQ2MDA6MTogKCAoIHJ1bGVfX1hDbG9zdXJlX19EZWNsYXJlZEZvcm1hbFBhcmFtZXRlcnNBc3NpZ25tZW50XzFfMF8wXzFfMSApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE0NjAxOjI6ICggcnVsZV9fWENsb3N1cmVfX0RlY2xhcmVkRm9ybWFsUGFyYW1ldGVyc0Fzc2lnbm1lbnRfMV8wXzBfMV8xICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE1OTM4OjE6ICggKCBydWxlX19YQ2xvc3VyZV9fRGVjbGFyZWRGb3JtYWxQYXJhbWV0ZXJzQXNzaWdubWVudF8xXzBfMF8xXzEgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNTkzOToyOiAoIHJ1bGVfX1hDbG9zdXJlX19EZWNsYXJlZEZvcm1hbFBhcmFtZXRlcnNBc3NpZ25tZW50XzFfMF8wXzFfMSApCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhDbG9zdXJlQWNjZXNzKCkuZ2V0RGVjbGFyZWRGb3JtYWxQYXJhbWV0ZXJzQXNzaWdubWVudF8xXzBfMF8xXzEoKSk7IAogICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTQ2MDI6MjogKCBydWxlX19YQ2xvc3VyZV9fRGVjbGFyZWRGb3JtYWxQYXJhbWV0ZXJzQXNzaWdubWVudF8xXzBfMF8xXzEgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTQ2MDI6MzogcnVsZV9fWENsb3N1cmVfX0RlY2xhcmVkRm9ybWFsUGFyYW1ldGVyc0Fzc2lnbm1lbnRfMV8wXzBfMV8xCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNTk0MDoyOiAoIHJ1bGVfX1hDbG9zdXJlX19EZWNsYXJlZEZvcm1hbFBhcmFtZXRlcnNBc3NpZ25tZW50XzFfMF8wXzFfMSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNTk0MDozOiBydWxlX19YQ2xvc3VyZV9fRGVjbGFyZWRGb3JtYWxQYXJhbWV0ZXJzQXNzaWdubWVudF8xXzBfMF8xXzEKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzIpOwogICAgICAgICAgICAgcnVsZV9fWENsb3N1cmVfX0RlY2xhcmVkRm9ybWFsUGFyYW1ldGVyc0Fzc2lnbm1lbnRfMV8wXzBfMV8xKCk7CkBAIC00ODY0NiwxNiArNTMxMDMsMTYgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YRXhwcmVzc2lvbkluQ2xvc3VyZV9fR3JvdXBfXzAiCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTQ2MTE6MTogcnVsZV9fWEV4cHJlc3Npb25JbkNsb3N1cmVfX0dyb3VwX18wIDogcnVsZV9fWEV4cHJlc3Npb25JbkNsb3N1cmVfX0dyb3VwX18wX19JbXBsIHJ1bGVfX1hFeHByZXNzaW9uSW5DbG9zdXJlX19Hcm91cF9fMSA7CisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTU5NDk6MTogcnVsZV9fWEV4cHJlc3Npb25JbkNsb3N1cmVfX0dyb3VwX18wIDogcnVsZV9fWEV4cHJlc3Npb25JbkNsb3N1cmVfX0dyb3VwX18wX19JbXBsIHJ1bGVfX1hFeHByZXNzaW9uSW5DbG9zdXJlX19Hcm91cF9fMSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fWEV4cHJlc3Npb25JbkNsb3N1cmVfX0dyb3VwX18wKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE0NjE1OjE6ICggcnVsZV9fWEV4cHJlc3Npb25JbkNsb3N1cmVfX0dyb3VwX18wX19JbXBsIHJ1bGVfX1hFeHByZXNzaW9uSW5DbG9zdXJlX19Hcm91cF9fMSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNDYxNjoyOiBydWxlX19YRXhwcmVzc2lvbkluQ2xvc3VyZV9fR3JvdXBfXzBfX0ltcGwgcnVsZV9fWEV4cHJlc3Npb25JbkNsb3N1cmVfX0dyb3VwX18xCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNTk1MzoxOiAoIHJ1bGVfX1hFeHByZXNzaW9uSW5DbG9zdXJlX19Hcm91cF9fMF9fSW1wbCBydWxlX19YRXhwcmVzc2lvbkluQ2xvc3VyZV9fR3JvdXBfXzEgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTU5NTQ6MjogcnVsZV9fWEV4cHJlc3Npb25JbkNsb3N1cmVfX0dyb3VwX18wX19JbXBsIHJ1bGVfX1hFeHByZXNzaW9uSW5DbG9zdXJlX19Hcm91cF9fMQogICAgICAgICAgICAgewotICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMTE0KTsKKyAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzEyMik7CiAgICAgICAgICAgICBydWxlX19YRXhwcmVzc2lvbkluQ2xvc3VyZV9fR3JvdXBfXzBfX0ltcGwoKTsKIAogICAgICAgICAgICAgc3RhdGUuX2ZzcC0tOwpAQCAtNDg2ODQsMjMgKzUzMTQxLDIzIEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fWEV4cHJlc3Npb25JbkNsb3N1cmVfX0dyb3VwX18wX19JbXBsIgotICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE0NjIzOjE6IHJ1bGVfX1hFeHByZXNzaW9uSW5DbG9zdXJlX19Hcm91cF9fMF9fSW1wbCA6ICggKCkgKSA7CisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTU5NjE6MTogcnVsZV9fWEV4cHJlc3Npb25JbkNsb3N1cmVfX0dyb3VwX18wX19JbXBsIDogKCAoKSApIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YRXhwcmVzc2lvbkluQ2xvc3VyZV9fR3JvdXBfXzBfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTQ2Mjc6MTogKCAoICgpICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTQ2Mjg6MTogKCAoKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNTk2NToxOiAoICggKCkgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNTk2NjoxOiAoICgpICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE0NjI4OjE6ICggKCkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTQ2Mjk6MjogKCkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE1OTY2OjE6ICggKCkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTU5Njc6MjogKCkKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WEV4cHJlc3Npb25JbkNsb3N1cmVBY2Nlc3MoKS5nZXRYQmxvY2tFeHByZXNzaW9uQWN0aW9uXzAoKSk7IAogICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTQ2MzA6MjogKCkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE0NjMwOjM6IAorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTU5Njg6MjogKCkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE1OTY4OjM6IAogICAgICAgICAgICAgewogICAgICAgICAgICAgfQogCkBAIC00ODcyNSwxNCArNTMxODIsMTQgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YRXhwcmVzc2lvbkluQ2xvc3VyZV9fR3JvdXBfXzEiCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTQ2Mzg6MTogcnVsZV9fWEV4cHJlc3Npb25JbkNsb3N1cmVfX0dyb3VwX18xIDogcnVsZV9fWEV4cHJlc3Npb25JbkNsb3N1cmVfX0dyb3VwX18xX19JbXBsIDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNTk3NjoxOiBydWxlX19YRXhwcmVzc2lvbkluQ2xvc3VyZV9fR3JvdXBfXzEgOiBydWxlX19YRXhwcmVzc2lvbkluQ2xvc3VyZV9fR3JvdXBfXzFfX0ltcGwgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1hFeHByZXNzaW9uSW5DbG9zdXJlX19Hcm91cF9fMSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNDY0MjoxOiAoIHJ1bGVfX1hFeHByZXNzaW9uSW5DbG9zdXJlX19Hcm91cF9fMV9fSW1wbCApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNDY0MzoyOiBydWxlX19YRXhwcmVzc2lvbkluQ2xvc3VyZV9fR3JvdXBfXzFfX0ltcGwKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE1OTgwOjE6ICggcnVsZV9fWEV4cHJlc3Npb25JbkNsb3N1cmVfX0dyb3VwX18xX19JbXBsICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE1OTgxOjI6IHJ1bGVfX1hFeHByZXNzaW9uSW5DbG9zdXJlX19Hcm91cF9fMV9fSW1wbAogICAgICAgICAgICAgewogICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMik7CiAgICAgICAgICAgICBydWxlX19YRXhwcmVzc2lvbkluQ2xvc3VyZV9fR3JvdXBfXzFfX0ltcGwoKTsKQEAgLTQ4NzU4LDM3ICs1MzIxNSwzNyBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX1hFeHByZXNzaW9uSW5DbG9zdXJlX19Hcm91cF9fMV9fSW1wbCIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNDY0OToxOiBydWxlX19YRXhwcmVzc2lvbkluQ2xvc3VyZV9fR3JvdXBfXzFfX0ltcGwgOiAoICggcnVsZV9fWEV4cHJlc3Npb25JbkNsb3N1cmVfX0dyb3VwXzFfXzAgKSogKSA7CisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTU5ODc6MTogcnVsZV9fWEV4cHJlc3Npb25JbkNsb3N1cmVfX0dyb3VwX18xX19JbXBsIDogKCAoIHJ1bGVfX1hFeHByZXNzaW9uSW5DbG9zdXJlX19Hcm91cF8xX18wICkqICkgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1hFeHByZXNzaW9uSW5DbG9zdXJlX19Hcm91cF9fMV9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNDY1MzoxOiAoICggKCBydWxlX19YRXhwcmVzc2lvbkluQ2xvc3VyZV9fR3JvdXBfMV9fMCApKiApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE0NjU0OjE6ICggKCBydWxlX19YRXhwcmVzc2lvbkluQ2xvc3VyZV9fR3JvdXBfMV9fMCApKiApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNTk5MToxOiAoICggKCBydWxlX19YRXhwcmVzc2lvbkluQ2xvc3VyZV9fR3JvdXBfMV9fMCApKiApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE1OTkyOjE6ICggKCBydWxlX19YRXhwcmVzc2lvbkluQ2xvc3VyZV9fR3JvdXBfMV9fMCApKiApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNDY1NDoxOiAoICggcnVsZV9fWEV4cHJlc3Npb25JbkNsb3N1cmVfX0dyb3VwXzFfXzAgKSogKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTQ2NTU6MjogKCBydWxlX19YRXhwcmVzc2lvbkluQ2xvc3VyZV9fR3JvdXBfMV9fMCApKgorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTU5OTI6MTogKCAoIHJ1bGVfX1hFeHByZXNzaW9uSW5DbG9zdXJlX19Hcm91cF8xX18wICkqICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE1OTkzOjI6ICggcnVsZV9fWEV4cHJlc3Npb25JbkNsb3N1cmVfX0dyb3VwXzFfXzAgKSoKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WEV4cHJlc3Npb25JbkNsb3N1cmVBY2Nlc3MoKS5nZXRHcm91cF8xKCkpOyAKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE0NjU2OjI6ICggcnVsZV9fWEV4cHJlc3Npb25JbkNsb3N1cmVfX0dyb3VwXzFfXzAgKSoKLSAgICAgICAgICAgIGxvb3AxMjA6CisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNTk5NDoyOiAoIHJ1bGVfX1hFeHByZXNzaW9uSW5DbG9zdXJlX19Hcm91cF8xX18wICkqCisgICAgICAgICAgICBsb29wMTMzOgogICAgICAgICAgICAgZG8gewotICAgICAgICAgICAgICAgIGludCBhbHQxMjA9MjsKLSAgICAgICAgICAgICAgICBpbnQgTEExMjBfMCA9IGlucHV0LkxBKDEpOworICAgICAgICAgICAgICAgIGludCBhbHQxMzM9MjsKKyAgICAgICAgICAgICAgICBpbnQgTEExMzNfMCA9IGlucHV0LkxBKDEpOwogCi0gICAgICAgICAgICAgICAgaWYgKCAoKExBMTIwXzA+PVJVTEVfU1RSSU5HICYmIExBMTIwXzA8PVJVTEVfREVDSU1BTCl8fExBMTIwXzA9PTI3fHwoTEExMjBfMD49MzQgJiYgTEExMjBfMDw9MzUpfHxMQTEyMF8wPT00MHx8KExBMTIwXzA+PTQ0ICYmIExBMTIwXzA8PTUwKXx8TEExMjBfMD09NzB8fExBMTIwXzA9PTk1fHxMQTEyMF8wPT0xMTN8fChMQTEyMF8wPj0xMTcgJiYgTEExMjBfMDw9MTE4KXx8TEExMjBfMD09MTIwfHxMQTEyMF8wPT0xMjJ8fChMQTEyMF8wPj0xMjYgJiYgTEExMjBfMDw9MTMzKXx8TEExMjBfMD09MTM1fHwoTEExMjBfMD49MTUzICYmIExBMTIwXzA8PTE1NCkpICkgewotICAgICAgICAgICAgICAgICAgICBhbHQxMjA9MTsKKyAgICAgICAgICAgICAgICBpZiAoICgoTEExMzNfMD49UlVMRV9TVFJJTkcgJiYgTEExMzNfMDw9UlVMRV9ERUNJTUFMKXx8TEExMzNfMD09Mjd8fChMQTEzM18wPj0zNCAmJiBMQTEzM18wPD0zNSl8fExBMTMzXzA9PTQwfHwoTEExMzNfMD49NDQgJiYgTEExMzNfMDw9NTApfHxMQTEzM18wPT03NXx8TEExMzNfMD09MTAyfHxMQTEzM18wPT0xMjN8fChMQTEzM18wPj0xMjcgJiYgTEExMzNfMDw9MTI4KXx8TEExMzNfMD09MTMwfHxMQTEzM18wPT0xMzJ8fChMQTEzM18wPj0xMzYgJiYgTEExMzNfMDw9MTQzKXx8TEExMzNfMD09MTQ1fHwoTEExMzNfMD49MTY1ICYmIExBMTMzXzA8PTE2NikpICkgeworICAgICAgICAgICAgICAgICAgICBhbHQxMzM9MTsKICAgICAgICAgICAgICAgICB9CiAKIAotICAgICAgICAgICAgICAgIHN3aXRjaCAoYWx0MTIwKSB7CisgICAgICAgICAgICAgICAgc3dpdGNoIChhbHQxMzMpIHsKICAgICAgICAgICAgIAljYXNlIDEgOgotICAgICAgICAgICAgCSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNDY1NjozOiBydWxlX19YRXhwcmVzc2lvbkluQ2xvc3VyZV9fR3JvdXBfMV9fMAorICAgICAgICAgICAgCSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNTk5NDozOiBydWxlX19YRXhwcmVzc2lvbkluQ2xvc3VyZV9fR3JvdXBfMV9fMAogICAgICAgICAgICAgCSAgICB7Ci0gICAgICAgICAgICAJICAgIHB1c2hGb2xsb3coRk9MTE9XXzExNyk7CisgICAgICAgICAgICAJICAgIHB1c2hGb2xsb3coRk9MTE9XXzEyNSk7CiAgICAgICAgICAgICAJICAgIHJ1bGVfX1hFeHByZXNzaW9uSW5DbG9zdXJlX19Hcm91cF8xX18wKCk7CiAKICAgICAgICAgICAgIAkgICAgc3RhdGUuX2ZzcC0tOwpAQCAtNDg3OTgsNyArNTMyNTUsNyBAQAogICAgICAgICAgICAgCSAgICBicmVhazsKIAogICAgICAgICAgICAgCWRlZmF1bHQgOgotICAgICAgICAgICAgCSAgICBicmVhayBsb29wMTIwOworICAgICAgICAgICAgCSAgICBicmVhayBsb29wMTMzOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0gd2hpbGUgKHRydWUpOwogCkBAIC00ODgyNywxNiArNTMyODQsMTYgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YRXhwcmVzc2lvbkluQ2xvc3VyZV9fR3JvdXBfMV9fMCIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNDY2NToxOiBydWxlX19YRXhwcmVzc2lvbkluQ2xvc3VyZV9fR3JvdXBfMV9fMCA6IHJ1bGVfX1hFeHByZXNzaW9uSW5DbG9zdXJlX19Hcm91cF8xX18wX19JbXBsIHJ1bGVfX1hFeHByZXNzaW9uSW5DbG9zdXJlX19Hcm91cF8xX18xIDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNjAwMzoxOiBydWxlX19YRXhwcmVzc2lvbkluQ2xvc3VyZV9fR3JvdXBfMV9fMCA6IHJ1bGVfX1hFeHByZXNzaW9uSW5DbG9zdXJlX19Hcm91cF8xX18wX19JbXBsIHJ1bGVfX1hFeHByZXNzaW9uSW5DbG9zdXJlX19Hcm91cF8xX18xIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YRXhwcmVzc2lvbkluQ2xvc3VyZV9fR3JvdXBfMV9fMCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNDY2OToxOiAoIHJ1bGVfX1hFeHByZXNzaW9uSW5DbG9zdXJlX19Hcm91cF8xX18wX19JbXBsIHJ1bGVfX1hFeHByZXNzaW9uSW5DbG9zdXJlX19Hcm91cF8xX18xICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE0NjcwOjI6IHJ1bGVfX1hFeHByZXNzaW9uSW5DbG9zdXJlX19Hcm91cF8xX18wX19JbXBsIHJ1bGVfX1hFeHByZXNzaW9uSW5DbG9zdXJlX19Hcm91cF8xX18xCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNjAwNzoxOiAoIHJ1bGVfX1hFeHByZXNzaW9uSW5DbG9zdXJlX19Hcm91cF8xX18wX19JbXBsIHJ1bGVfX1hFeHByZXNzaW9uSW5DbG9zdXJlX19Hcm91cF8xX18xICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE2MDA4OjI6IHJ1bGVfX1hFeHByZXNzaW9uSW5DbG9zdXJlX19Hcm91cF8xX18wX19JbXBsIHJ1bGVfX1hFeHByZXNzaW9uSW5DbG9zdXJlX19Hcm91cF8xX18xCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV182Nik7CisgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV183NCk7CiAgICAgICAgICAgICBydWxlX19YRXhwcmVzc2lvbkluQ2xvc3VyZV9fR3JvdXBfMV9fMF9fSW1wbCgpOwogCiAgICAgICAgICAgICBzdGF0ZS5fZnNwLS07CkBAIC00ODg2NSwyMyArNTMzMjIsMjMgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YRXhwcmVzc2lvbkluQ2xvc3VyZV9fR3JvdXBfMV9fMF9fSW1wbCIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNDY3NzoxOiBydWxlX19YRXhwcmVzc2lvbkluQ2xvc3VyZV9fR3JvdXBfMV9fMF9fSW1wbCA6ICggKCBydWxlX19YRXhwcmVzc2lvbkluQ2xvc3VyZV9fRXhwcmVzc2lvbnNBc3NpZ25tZW50XzFfMCApICkgOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE2MDE1OjE6IHJ1bGVfX1hFeHByZXNzaW9uSW5DbG9zdXJlX19Hcm91cF8xX18wX19JbXBsIDogKCAoIHJ1bGVfX1hFeHByZXNzaW9uSW5DbG9zdXJlX19FeHByZXNzaW9uc0Fzc2lnbm1lbnRfMV8wICkgKSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fWEV4cHJlc3Npb25JbkNsb3N1cmVfX0dyb3VwXzFfXzBfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTQ2ODE6MTogKCAoICggcnVsZV9fWEV4cHJlc3Npb25JbkNsb3N1cmVfX0V4cHJlc3Npb25zQXNzaWdubWVudF8xXzAgKSApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE0NjgyOjE6ICggKCBydWxlX19YRXhwcmVzc2lvbkluQ2xvc3VyZV9fRXhwcmVzc2lvbnNBc3NpZ25tZW50XzFfMCApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE2MDE5OjE6ICggKCAoIHJ1bGVfX1hFeHByZXNzaW9uSW5DbG9zdXJlX19FeHByZXNzaW9uc0Fzc2lnbm1lbnRfMV8wICkgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNjAyMDoxOiAoICggcnVsZV9fWEV4cHJlc3Npb25JbkNsb3N1cmVfX0V4cHJlc3Npb25zQXNzaWdubWVudF8xXzAgKSApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNDY4MjoxOiAoICggcnVsZV9fWEV4cHJlc3Npb25JbkNsb3N1cmVfX0V4cHJlc3Npb25zQXNzaWdubWVudF8xXzAgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNDY4MzoyOiAoIHJ1bGVfX1hFeHByZXNzaW9uSW5DbG9zdXJlX19FeHByZXNzaW9uc0Fzc2lnbm1lbnRfMV8wICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE2MDIwOjE6ICggKCBydWxlX19YRXhwcmVzc2lvbkluQ2xvc3VyZV9fRXhwcmVzc2lvbnNBc3NpZ25tZW50XzFfMCApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE2MDIxOjI6ICggcnVsZV9fWEV4cHJlc3Npb25JbkNsb3N1cmVfX0V4cHJlc3Npb25zQXNzaWdubWVudF8xXzAgKQogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYRXhwcmVzc2lvbkluQ2xvc3VyZUFjY2VzcygpLmdldEV4cHJlc3Npb25zQXNzaWdubWVudF8xXzAoKSk7IAogICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTQ2ODQ6MjogKCBydWxlX19YRXhwcmVzc2lvbkluQ2xvc3VyZV9fRXhwcmVzc2lvbnNBc3NpZ25tZW50XzFfMCApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNDY4NDozOiBydWxlX19YRXhwcmVzc2lvbkluQ2xvc3VyZV9fRXhwcmVzc2lvbnNBc3NpZ25tZW50XzFfMAorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTYwMjI6MjogKCBydWxlX19YRXhwcmVzc2lvbkluQ2xvc3VyZV9fRXhwcmVzc2lvbnNBc3NpZ25tZW50XzFfMCApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNjAyMjozOiBydWxlX19YRXhwcmVzc2lvbkluQ2xvc3VyZV9fRXhwcmVzc2lvbnNBc3NpZ25tZW50XzFfMAogICAgICAgICAgICAgewogICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMik7CiAgICAgICAgICAgICBydWxlX19YRXhwcmVzc2lvbkluQ2xvc3VyZV9fRXhwcmVzc2lvbnNBc3NpZ25tZW50XzFfMCgpOwpAQCAtNDg5MTYsMTQgKzUzMzczLDE0IEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fWEV4cHJlc3Npb25JbkNsb3N1cmVfX0dyb3VwXzFfXzEiCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTQ2OTI6MTogcnVsZV9fWEV4cHJlc3Npb25JbkNsb3N1cmVfX0dyb3VwXzFfXzEgOiBydWxlX19YRXhwcmVzc2lvbkluQ2xvc3VyZV9fR3JvdXBfMV9fMV9fSW1wbCA7CisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTYwMzA6MTogcnVsZV9fWEV4cHJlc3Npb25JbkNsb3N1cmVfX0dyb3VwXzFfXzEgOiBydWxlX19YRXhwcmVzc2lvbkluQ2xvc3VyZV9fR3JvdXBfMV9fMV9fSW1wbCA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fWEV4cHJlc3Npb25JbkNsb3N1cmVfX0dyb3VwXzFfXzEoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTQ2OTY6MTogKCBydWxlX19YRXhwcmVzc2lvbkluQ2xvc3VyZV9fR3JvdXBfMV9fMV9fSW1wbCApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNDY5NzoyOiBydWxlX19YRXhwcmVzc2lvbkluQ2xvc3VyZV9fR3JvdXBfMV9fMV9fSW1wbAorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTYwMzQ6MTogKCBydWxlX19YRXhwcmVzc2lvbkluQ2xvc3VyZV9fR3JvdXBfMV9fMV9fSW1wbCApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNjAzNToyOiBydWxlX19YRXhwcmVzc2lvbkluQ2xvc3VyZV9fR3JvdXBfMV9fMV9fSW1wbAogICAgICAgICAgICAgewogICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMik7CiAgICAgICAgICAgICBydWxlX19YRXhwcmVzc2lvbkluQ2xvc3VyZV9fR3JvdXBfMV9fMV9fSW1wbCgpOwpAQCAtNDg5NDksMzMgKzUzNDA2LDMzIEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fWEV4cHJlc3Npb25JbkNsb3N1cmVfX0dyb3VwXzFfXzFfX0ltcGwiCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTQ3MDM6MTogcnVsZV9fWEV4cHJlc3Npb25JbkNsb3N1cmVfX0dyb3VwXzFfXzFfX0ltcGwgOiAoICggJzsnICk/ICkgOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE2MDQxOjE6IHJ1bGVfX1hFeHByZXNzaW9uSW5DbG9zdXJlX19Hcm91cF8xX18xX19JbXBsIDogKCAoICc7JyApPyApIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YRXhwcmVzc2lvbkluQ2xvc3VyZV9fR3JvdXBfMV9fMV9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNDcwNzoxOiAoICggKCAnOycgKT8gKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNDcwODoxOiAoICggJzsnICk/ICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE2MDQ1OjE6ICggKCAoICc7JyApPyApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE2MDQ2OjE6ICggKCAnOycgKT8gKQogICAgICAgICAgICAgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTQ3MDg6MTogKCAoICc7JyApPyApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNDcwOToyOiAoICc7JyApPworICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTYwNDY6MTogKCAoICc7JyApPyApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNjA0NzoyOiAoICc7JyApPwogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYRXhwcmVzc2lvbkluQ2xvc3VyZUFjY2VzcygpLmdldFNlbWljb2xvbktleXdvcmRfMV8xKCkpOyAKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE0NzEwOjI6ICggJzsnICk/Ci0gICAgICAgICAgICBpbnQgYWx0MTIxPTI7Ci0gICAgICAgICAgICBpbnQgTEExMjFfMCA9IGlucHV0LkxBKDEpOworICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTYwNDg6MjogKCAnOycgKT8KKyAgICAgICAgICAgIGludCBhbHQxMzQ9MjsKKyAgICAgICAgICAgIGludCBMQTEzNF8wID0gaW5wdXQuTEEoMSk7CiAKLSAgICAgICAgICAgIGlmICggKExBMTIxXzA9PTExMSkgKSB7Ci0gICAgICAgICAgICAgICAgYWx0MTIxPTE7CisgICAgICAgICAgICBpZiAoIChMQTEzNF8wPT0xMjEpICkgeworICAgICAgICAgICAgICAgIGFsdDEzND0xOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgc3dpdGNoIChhbHQxMjEpIHsKKyAgICAgICAgICAgIHN3aXRjaCAoYWx0MTM0KSB7CiAgICAgICAgICAgICAgICAgY2FzZSAxIDoKLSAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTQ3MTA6MzogJzsnCisgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE2MDQ4OjM6ICc7JwogICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIG1hdGNoKGlucHV0LDExMSxGT0xMT1dfMik7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CisgICAgICAgICAgICAgICAgICAgIG1hdGNoKGlucHV0LDEyMSxGT0xMT1dfMik7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CiAKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICBicmVhazsKQEAgLTQ5MDA3LDE2ICs1MzQ2NCwxNiBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX1hTaG9ydENsb3N1cmVfX0dyb3VwX18wIgotICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE0NzE5OjE6IHJ1bGVfX1hTaG9ydENsb3N1cmVfX0dyb3VwX18wIDogcnVsZV9fWFNob3J0Q2xvc3VyZV9fR3JvdXBfXzBfX0ltcGwgcnVsZV9fWFNob3J0Q2xvc3VyZV9fR3JvdXBfXzEgOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE2MDU3OjE6IHJ1bGVfX1hTaG9ydENsb3N1cmVfX0dyb3VwX18wIDogcnVsZV9fWFNob3J0Q2xvc3VyZV9fR3JvdXBfXzBfX0ltcGwgcnVsZV9fWFNob3J0Q2xvc3VyZV9fR3JvdXBfXzEgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1hTaG9ydENsb3N1cmVfX0dyb3VwX18wKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE0NzIzOjE6ICggcnVsZV9fWFNob3J0Q2xvc3VyZV9fR3JvdXBfXzBfX0ltcGwgcnVsZV9fWFNob3J0Q2xvc3VyZV9fR3JvdXBfXzEgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTQ3MjQ6MjogcnVsZV9fWFNob3J0Q2xvc3VyZV9fR3JvdXBfXzBfX0ltcGwgcnVsZV9fWFNob3J0Q2xvc3VyZV9fR3JvdXBfXzEKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE2MDYxOjE6ICggcnVsZV9fWFNob3J0Q2xvc3VyZV9fR3JvdXBfXzBfX0ltcGwgcnVsZV9fWFNob3J0Q2xvc3VyZV9fR3JvdXBfXzEgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTYwNjI6MjogcnVsZV9fWFNob3J0Q2xvc3VyZV9fR3JvdXBfXzBfX0ltcGwgcnVsZV9fWFNob3J0Q2xvc3VyZV9fR3JvdXBfXzEKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzc0KTsKKyAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzgyKTsKICAgICAgICAgICAgIHJ1bGVfX1hTaG9ydENsb3N1cmVfX0dyb3VwX18wX19JbXBsKCk7CiAKICAgICAgICAgICAgIHN0YXRlLl9mc3AtLTsKQEAgLTQ5MDQ1LDIzICs1MzUwMiwyMyBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX1hTaG9ydENsb3N1cmVfX0dyb3VwX18wX19JbXBsIgotICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE0NzMxOjE6IHJ1bGVfX1hTaG9ydENsb3N1cmVfX0dyb3VwX18wX19JbXBsIDogKCAoIHJ1bGVfX1hTaG9ydENsb3N1cmVfX0dyb3VwXzBfXzAgKSApIDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNjA2OToxOiBydWxlX19YU2hvcnRDbG9zdXJlX19Hcm91cF9fMF9fSW1wbCA6ICggKCBydWxlX19YU2hvcnRDbG9zdXJlX19Hcm91cF8wX18wICkgKSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fWFNob3J0Q2xvc3VyZV9fR3JvdXBfXzBfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTQ3MzU6MTogKCAoICggcnVsZV9fWFNob3J0Q2xvc3VyZV9fR3JvdXBfMF9fMCApICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTQ3MzY6MTogKCAoIHJ1bGVfX1hTaG9ydENsb3N1cmVfX0dyb3VwXzBfXzAgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNjA3MzoxOiAoICggKCBydWxlX19YU2hvcnRDbG9zdXJlX19Hcm91cF8wX18wICkgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNjA3NDoxOiAoICggcnVsZV9fWFNob3J0Q2xvc3VyZV9fR3JvdXBfMF9fMCApICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE0NzM2OjE6ICggKCBydWxlX19YU2hvcnRDbG9zdXJlX19Hcm91cF8wX18wICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTQ3Mzc6MjogKCBydWxlX19YU2hvcnRDbG9zdXJlX19Hcm91cF8wX18wICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE2MDc0OjE6ICggKCBydWxlX19YU2hvcnRDbG9zdXJlX19Hcm91cF8wX18wICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTYwNzU6MjogKCBydWxlX19YU2hvcnRDbG9zdXJlX19Hcm91cF8wX18wICkKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WFNob3J0Q2xvc3VyZUFjY2VzcygpLmdldEdyb3VwXzAoKSk7IAogICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTQ3Mzg6MjogKCBydWxlX19YU2hvcnRDbG9zdXJlX19Hcm91cF8wX18wICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE0NzM4OjM6IHJ1bGVfX1hTaG9ydENsb3N1cmVfX0dyb3VwXzBfXzAKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE2MDc2OjI6ICggcnVsZV9fWFNob3J0Q2xvc3VyZV9fR3JvdXBfMF9fMCApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNjA3NjozOiBydWxlX19YU2hvcnRDbG9zdXJlX19Hcm91cF8wX18wCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV18yKTsKICAgICAgICAgICAgIHJ1bGVfX1hTaG9ydENsb3N1cmVfX0dyb3VwXzBfXzAoKTsKQEAgLTQ5MDk2LDE0ICs1MzU1MywxNCBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX1hTaG9ydENsb3N1cmVfX0dyb3VwX18xIgotICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE0NzQ2OjE6IHJ1bGVfX1hTaG9ydENsb3N1cmVfX0dyb3VwX18xIDogcnVsZV9fWFNob3J0Q2xvc3VyZV9fR3JvdXBfXzFfX0ltcGwgOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE2MDg0OjE6IHJ1bGVfX1hTaG9ydENsb3N1cmVfX0dyb3VwX18xIDogcnVsZV9fWFNob3J0Q2xvc3VyZV9fR3JvdXBfXzFfX0ltcGwgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1hTaG9ydENsb3N1cmVfX0dyb3VwX18xKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE0NzUwOjE6ICggcnVsZV9fWFNob3J0Q2xvc3VyZV9fR3JvdXBfXzFfX0ltcGwgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTQ3NTE6MjogcnVsZV9fWFNob3J0Q2xvc3VyZV9fR3JvdXBfXzFfX0ltcGwKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE2MDg4OjE6ICggcnVsZV9fWFNob3J0Q2xvc3VyZV9fR3JvdXBfXzFfX0ltcGwgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTYwODk6MjogcnVsZV9fWFNob3J0Q2xvc3VyZV9fR3JvdXBfXzFfX0ltcGwKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzIpOwogICAgICAgICAgICAgcnVsZV9fWFNob3J0Q2xvc3VyZV9fR3JvdXBfXzFfX0ltcGwoKTsKQEAgLTQ5MTI5LDIzICs1MzU4NiwyMyBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX1hTaG9ydENsb3N1cmVfX0dyb3VwX18xX19JbXBsIgotICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE0NzU3OjE6IHJ1bGVfX1hTaG9ydENsb3N1cmVfX0dyb3VwX18xX19JbXBsIDogKCAoIHJ1bGVfX1hTaG9ydENsb3N1cmVfX0V4cHJlc3Npb25Bc3NpZ25tZW50XzEgKSApIDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNjA5NToxOiBydWxlX19YU2hvcnRDbG9zdXJlX19Hcm91cF9fMV9fSW1wbCA6ICggKCBydWxlX19YU2hvcnRDbG9zdXJlX19FeHByZXNzaW9uQXNzaWdubWVudF8xICkgKSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fWFNob3J0Q2xvc3VyZV9fR3JvdXBfXzFfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTQ3NjE6MTogKCAoICggcnVsZV9fWFNob3J0Q2xvc3VyZV9fRXhwcmVzc2lvbkFzc2lnbm1lbnRfMSApICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTQ3NjI6MTogKCAoIHJ1bGVfX1hTaG9ydENsb3N1cmVfX0V4cHJlc3Npb25Bc3NpZ25tZW50XzEgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNjA5OToxOiAoICggKCBydWxlX19YU2hvcnRDbG9zdXJlX19FeHByZXNzaW9uQXNzaWdubWVudF8xICkgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNjEwMDoxOiAoICggcnVsZV9fWFNob3J0Q2xvc3VyZV9fRXhwcmVzc2lvbkFzc2lnbm1lbnRfMSApICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE0NzYyOjE6ICggKCBydWxlX19YU2hvcnRDbG9zdXJlX19FeHByZXNzaW9uQXNzaWdubWVudF8xICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTQ3NjM6MjogKCBydWxlX19YU2hvcnRDbG9zdXJlX19FeHByZXNzaW9uQXNzaWdubWVudF8xICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE2MTAwOjE6ICggKCBydWxlX19YU2hvcnRDbG9zdXJlX19FeHByZXNzaW9uQXNzaWdubWVudF8xICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTYxMDE6MjogKCBydWxlX19YU2hvcnRDbG9zdXJlX19FeHByZXNzaW9uQXNzaWdubWVudF8xICkKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WFNob3J0Q2xvc3VyZUFjY2VzcygpLmdldEV4cHJlc3Npb25Bc3NpZ25tZW50XzEoKSk7IAogICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTQ3NjQ6MjogKCBydWxlX19YU2hvcnRDbG9zdXJlX19FeHByZXNzaW9uQXNzaWdubWVudF8xICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE0NzY0OjM6IHJ1bGVfX1hTaG9ydENsb3N1cmVfX0V4cHJlc3Npb25Bc3NpZ25tZW50XzEKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE2MTAyOjI6ICggcnVsZV9fWFNob3J0Q2xvc3VyZV9fRXhwcmVzc2lvbkFzc2lnbm1lbnRfMSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNjEwMjozOiBydWxlX19YU2hvcnRDbG9zdXJlX19FeHByZXNzaW9uQXNzaWdubWVudF8xCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV18yKTsKICAgICAgICAgICAgIHJ1bGVfX1hTaG9ydENsb3N1cmVfX0V4cHJlc3Npb25Bc3NpZ25tZW50XzEoKTsKQEAgLTQ5MTgwLDE0ICs1MzYzNywxNCBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX1hTaG9ydENsb3N1cmVfX0dyb3VwXzBfXzAiCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTQ3NzM6MTogcnVsZV9fWFNob3J0Q2xvc3VyZV9fR3JvdXBfMF9fMCA6IHJ1bGVfX1hTaG9ydENsb3N1cmVfX0dyb3VwXzBfXzBfX0ltcGwgOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE2MTExOjE6IHJ1bGVfX1hTaG9ydENsb3N1cmVfX0dyb3VwXzBfXzAgOiBydWxlX19YU2hvcnRDbG9zdXJlX19Hcm91cF8wX18wX19JbXBsIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YU2hvcnRDbG9zdXJlX19Hcm91cF8wX18wKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE0Nzc3OjE6ICggcnVsZV9fWFNob3J0Q2xvc3VyZV9fR3JvdXBfMF9fMF9fSW1wbCApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNDc3ODoyOiBydWxlX19YU2hvcnRDbG9zdXJlX19Hcm91cF8wX18wX19JbXBsCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNjExNToxOiAoIHJ1bGVfX1hTaG9ydENsb3N1cmVfX0dyb3VwXzBfXzBfX0ltcGwgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTYxMTY6MjogcnVsZV9fWFNob3J0Q2xvc3VyZV9fR3JvdXBfMF9fMF9fSW1wbAogICAgICAgICAgICAgewogICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMik7CiAgICAgICAgICAgICBydWxlX19YU2hvcnRDbG9zdXJlX19Hcm91cF8wX18wX19JbXBsKCk7CkBAIC00OTIxMywyMyArNTM2NzAsMjMgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YU2hvcnRDbG9zdXJlX19Hcm91cF8wX18wX19JbXBsIgotICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE0Nzg0OjE6IHJ1bGVfX1hTaG9ydENsb3N1cmVfX0dyb3VwXzBfXzBfX0ltcGwgOiAoICggcnVsZV9fWFNob3J0Q2xvc3VyZV9fR3JvdXBfMF8wX18wICkgKSA7CisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTYxMjI6MTogcnVsZV9fWFNob3J0Q2xvc3VyZV9fR3JvdXBfMF9fMF9fSW1wbCA6ICggKCBydWxlX19YU2hvcnRDbG9zdXJlX19Hcm91cF8wXzBfXzAgKSApIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YU2hvcnRDbG9zdXJlX19Hcm91cF8wX18wX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE0Nzg4OjE6ICggKCAoIHJ1bGVfX1hTaG9ydENsb3N1cmVfX0dyb3VwXzBfMF9fMCApICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTQ3ODk6MTogKCAoIHJ1bGVfX1hTaG9ydENsb3N1cmVfX0dyb3VwXzBfMF9fMCApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE2MTI2OjE6ICggKCAoIHJ1bGVfX1hTaG9ydENsb3N1cmVfX0dyb3VwXzBfMF9fMCApICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTYxMjc6MTogKCAoIHJ1bGVfX1hTaG9ydENsb3N1cmVfX0dyb3VwXzBfMF9fMCApICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE0Nzg5OjE6ICggKCBydWxlX19YU2hvcnRDbG9zdXJlX19Hcm91cF8wXzBfXzAgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNDc5MDoyOiAoIHJ1bGVfX1hTaG9ydENsb3N1cmVfX0dyb3VwXzBfMF9fMCApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNjEyNzoxOiAoICggcnVsZV9fWFNob3J0Q2xvc3VyZV9fR3JvdXBfMF8wX18wICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTYxMjg6MjogKCBydWxlX19YU2hvcnRDbG9zdXJlX19Hcm91cF8wXzBfXzAgKQogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYU2hvcnRDbG9zdXJlQWNjZXNzKCkuZ2V0R3JvdXBfMF8wKCkpOyAKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE0NzkxOjI6ICggcnVsZV9fWFNob3J0Q2xvc3VyZV9fR3JvdXBfMF8wX18wICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE0NzkxOjM6IHJ1bGVfX1hTaG9ydENsb3N1cmVfX0dyb3VwXzBfMF9fMAorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTYxMjk6MjogKCBydWxlX19YU2hvcnRDbG9zdXJlX19Hcm91cF8wXzBfXzAgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTYxMjk6MzogcnVsZV9fWFNob3J0Q2xvc3VyZV9fR3JvdXBfMF8wX18wCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV18yKTsKICAgICAgICAgICAgIHJ1bGVfX1hTaG9ydENsb3N1cmVfX0dyb3VwXzBfMF9fMCgpOwpAQCAtNDkyNjQsMTYgKzUzNzIxLDE2IEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fWFNob3J0Q2xvc3VyZV9fR3JvdXBfMF8wX18wIgotICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE0ODAwOjE6IHJ1bGVfX1hTaG9ydENsb3N1cmVfX0dyb3VwXzBfMF9fMCA6IHJ1bGVfX1hTaG9ydENsb3N1cmVfX0dyb3VwXzBfMF9fMF9fSW1wbCBydWxlX19YU2hvcnRDbG9zdXJlX19Hcm91cF8wXzBfXzEgOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE2MTM4OjE6IHJ1bGVfX1hTaG9ydENsb3N1cmVfX0dyb3VwXzBfMF9fMCA6IHJ1bGVfX1hTaG9ydENsb3N1cmVfX0dyb3VwXzBfMF9fMF9fSW1wbCBydWxlX19YU2hvcnRDbG9zdXJlX19Hcm91cF8wXzBfXzEgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1hTaG9ydENsb3N1cmVfX0dyb3VwXzBfMF9fMCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNDgwNDoxOiAoIHJ1bGVfX1hTaG9ydENsb3N1cmVfX0dyb3VwXzBfMF9fMF9fSW1wbCBydWxlX19YU2hvcnRDbG9zdXJlX19Hcm91cF8wXzBfXzEgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTQ4MDU6MjogcnVsZV9fWFNob3J0Q2xvc3VyZV9fR3JvdXBfMF8wX18wX19JbXBsIHJ1bGVfX1hTaG9ydENsb3N1cmVfX0dyb3VwXzBfMF9fMQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTYxNDI6MTogKCBydWxlX19YU2hvcnRDbG9zdXJlX19Hcm91cF8wXzBfXzBfX0ltcGwgcnVsZV9fWFNob3J0Q2xvc3VyZV9fR3JvdXBfMF8wX18xICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE2MTQzOjI6IHJ1bGVfX1hTaG9ydENsb3N1cmVfX0dyb3VwXzBfMF9fMF9fSW1wbCBydWxlX19YU2hvcnRDbG9zdXJlX19Hcm91cF8wXzBfXzEKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzExNik7CisgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV18xMjQpOwogICAgICAgICAgICAgcnVsZV9fWFNob3J0Q2xvc3VyZV9fR3JvdXBfMF8wX18wX19JbXBsKCk7CiAKICAgICAgICAgICAgIHN0YXRlLl9mc3AtLTsKQEAgLTQ5MzAyLDIzICs1Mzc1OSwyMyBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX1hTaG9ydENsb3N1cmVfX0dyb3VwXzBfMF9fMF9fSW1wbCIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNDgxMjoxOiBydWxlX19YU2hvcnRDbG9zdXJlX19Hcm91cF8wXzBfXzBfX0ltcGwgOiAoICgpICkgOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE2MTUwOjE6IHJ1bGVfX1hTaG9ydENsb3N1cmVfX0dyb3VwXzBfMF9fMF9fSW1wbCA6ICggKCkgKSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fWFNob3J0Q2xvc3VyZV9fR3JvdXBfMF8wX18wX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE0ODE2OjE6ICggKCAoKSApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE0ODE3OjE6ICggKCkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTYxNTQ6MTogKCAoICgpICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTYxNTU6MTogKCAoKSApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNDgxNzoxOiAoICgpICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE0ODE4OjI6ICgpCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNjE1NToxOiAoICgpICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE2MTU2OjI6ICgpCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhTaG9ydENsb3N1cmVBY2Nlc3MoKS5nZXRYQ2xvc3VyZUFjdGlvbl8wXzBfMCgpKTsgCiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNDgxOToyOiAoKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTQ4MTk6MzogCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNjE1NzoyOiAoKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTYxNTc6MzogCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICB9CiAKQEAgLTQ5MzQzLDE2ICs1MzgwMCwxNiBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX1hTaG9ydENsb3N1cmVfX0dyb3VwXzBfMF9fMSIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNDgyNzoxOiBydWxlX19YU2hvcnRDbG9zdXJlX19Hcm91cF8wXzBfXzEgOiBydWxlX19YU2hvcnRDbG9zdXJlX19Hcm91cF8wXzBfXzFfX0ltcGwgcnVsZV9fWFNob3J0Q2xvc3VyZV9fR3JvdXBfMF8wX18yIDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNjE2NToxOiBydWxlX19YU2hvcnRDbG9zdXJlX19Hcm91cF8wXzBfXzEgOiBydWxlX19YU2hvcnRDbG9zdXJlX19Hcm91cF8wXzBfXzFfX0ltcGwgcnVsZV9fWFNob3J0Q2xvc3VyZV9fR3JvdXBfMF8wX18yIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YU2hvcnRDbG9zdXJlX19Hcm91cF8wXzBfXzEoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTQ4MzE6MTogKCBydWxlX19YU2hvcnRDbG9zdXJlX19Hcm91cF8wXzBfXzFfX0ltcGwgcnVsZV9fWFNob3J0Q2xvc3VyZV9fR3JvdXBfMF8wX18yICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE0ODMyOjI6IHJ1bGVfX1hTaG9ydENsb3N1cmVfX0dyb3VwXzBfMF9fMV9fSW1wbCBydWxlX19YU2hvcnRDbG9zdXJlX19Hcm91cF8wXzBfXzIKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE2MTY5OjE6ICggcnVsZV9fWFNob3J0Q2xvc3VyZV9fR3JvdXBfMF8wX18xX19JbXBsIHJ1bGVfX1hTaG9ydENsb3N1cmVfX0dyb3VwXzBfMF9fMiApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNjE3MDoyOiBydWxlX19YU2hvcnRDbG9zdXJlX19Hcm91cF8wXzBfXzFfX0ltcGwgcnVsZV9fWFNob3J0Q2xvc3VyZV9fR3JvdXBfMF8wX18yCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV18xMTYpOworICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMTI0KTsKICAgICAgICAgICAgIHJ1bGVfX1hTaG9ydENsb3N1cmVfX0dyb3VwXzBfMF9fMV9fSW1wbCgpOwogCiAgICAgICAgICAgICBzdGF0ZS5fZnNwLS07CkBAIC00OTM4MSwzMSArNTM4MzgsMzEgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YU2hvcnRDbG9zdXJlX19Hcm91cF8wXzBfXzFfX0ltcGwiCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTQ4Mzk6MTogcnVsZV9fWFNob3J0Q2xvc3VyZV9fR3JvdXBfMF8wX18xX19JbXBsIDogKCAoIHJ1bGVfX1hTaG9ydENsb3N1cmVfX0dyb3VwXzBfMF8xX18wICk/ICkgOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE2MTc3OjE6IHJ1bGVfX1hTaG9ydENsb3N1cmVfX0dyb3VwXzBfMF9fMV9fSW1wbCA6ICggKCBydWxlX19YU2hvcnRDbG9zdXJlX19Hcm91cF8wXzBfMV9fMCApPyApIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YU2hvcnRDbG9zdXJlX19Hcm91cF8wXzBfXzFfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTQ4NDM6MTogKCAoICggcnVsZV9fWFNob3J0Q2xvc3VyZV9fR3JvdXBfMF8wXzFfXzAgKT8gKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNDg0NDoxOiAoICggcnVsZV9fWFNob3J0Q2xvc3VyZV9fR3JvdXBfMF8wXzFfXzAgKT8gKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTYxODE6MTogKCAoICggcnVsZV9fWFNob3J0Q2xvc3VyZV9fR3JvdXBfMF8wXzFfXzAgKT8gKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNjE4MjoxOiAoICggcnVsZV9fWFNob3J0Q2xvc3VyZV9fR3JvdXBfMF8wXzFfXzAgKT8gKQogICAgICAgICAgICAgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTQ4NDQ6MTogKCAoIHJ1bGVfX1hTaG9ydENsb3N1cmVfX0dyb3VwXzBfMF8xX18wICk/ICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE0ODQ1OjI6ICggcnVsZV9fWFNob3J0Q2xvc3VyZV9fR3JvdXBfMF8wXzFfXzAgKT8KKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE2MTgyOjE6ICggKCBydWxlX19YU2hvcnRDbG9zdXJlX19Hcm91cF8wXzBfMV9fMCApPyApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNjE4MzoyOiAoIHJ1bGVfX1hTaG9ydENsb3N1cmVfX0dyb3VwXzBfMF8xX18wICk/CiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhTaG9ydENsb3N1cmVBY2Nlc3MoKS5nZXRHcm91cF8wXzBfMSgpKTsgCiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNDg0NjoyOiAoIHJ1bGVfX1hTaG9ydENsb3N1cmVfX0dyb3VwXzBfMF8xX18wICk/Ci0gICAgICAgICAgICBpbnQgYWx0MTIyPTI7Ci0gICAgICAgICAgICBpbnQgTEExMjJfMCA9IGlucHV0LkxBKDEpOworICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTYxODQ6MjogKCBydWxlX19YU2hvcnRDbG9zdXJlX19Hcm91cF8wXzBfMV9fMCApPworICAgICAgICAgICAgaW50IGFsdDEzNT0yOworICAgICAgICAgICAgaW50IExBMTM1XzAgPSBpbnB1dC5MQSgxKTsKIAotICAgICAgICAgICAgaWYgKCAoTEExMjJfMD09UlVMRV9JRHx8TEExMjJfMD09MzF8fExBMTIyXzA9PTExMykgKSB7Ci0gICAgICAgICAgICAgICAgYWx0MTIyPTE7CisgICAgICAgICAgICBpZiAoIChMQTEzNV8wPT1SVUxFX0lEfHxMQTEzNV8wPT0zMXx8TEExMzVfMD09MTIzKSApIHsKKyAgICAgICAgICAgICAgICBhbHQxMzU9MTsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHN3aXRjaCAoYWx0MTIyKSB7CisgICAgICAgICAgICBzd2l0Y2ggKGFsdDEzNSkgewogICAgICAgICAgICAgICAgIGNhc2UgMSA6Ci0gICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE0ODQ2OjM6IHJ1bGVfX1hTaG9ydENsb3N1cmVfX0dyb3VwXzBfMF8xX18wCisgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE2MTg0OjM6IHJ1bGVfX1hTaG9ydENsb3N1cmVfX0dyb3VwXzBfMF8xX18wCiAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMik7CiAgICAgICAgICAgICAgICAgICAgIHJ1bGVfX1hTaG9ydENsb3N1cmVfX0dyb3VwXzBfMF8xX18wKCk7CkBAIC00OTQ0MywxNCArNTM5MDAsMTQgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YU2hvcnRDbG9zdXJlX19Hcm91cF8wXzBfXzIiCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTQ4NTQ6MTogcnVsZV9fWFNob3J0Q2xvc3VyZV9fR3JvdXBfMF8wX18yIDogcnVsZV9fWFNob3J0Q2xvc3VyZV9fR3JvdXBfMF8wX18yX19JbXBsIDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNjE5MjoxOiBydWxlX19YU2hvcnRDbG9zdXJlX19Hcm91cF8wXzBfXzIgOiBydWxlX19YU2hvcnRDbG9zdXJlX19Hcm91cF8wXzBfXzJfX0ltcGwgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1hTaG9ydENsb3N1cmVfX0dyb3VwXzBfMF9fMigpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNDg1ODoxOiAoIHJ1bGVfX1hTaG9ydENsb3N1cmVfX0dyb3VwXzBfMF9fMl9fSW1wbCApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNDg1OToyOiBydWxlX19YU2hvcnRDbG9zdXJlX19Hcm91cF8wXzBfXzJfX0ltcGwKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE2MTk2OjE6ICggcnVsZV9fWFNob3J0Q2xvc3VyZV9fR3JvdXBfMF8wX18yX19JbXBsICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE2MTk3OjI6IHJ1bGVfX1hTaG9ydENsb3N1cmVfX0dyb3VwXzBfMF9fMl9fSW1wbAogICAgICAgICAgICAgewogICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMik7CiAgICAgICAgICAgICBydWxlX19YU2hvcnRDbG9zdXJlX19Hcm91cF8wXzBfXzJfX0ltcGwoKTsKQEAgLTQ5NDc2LDIzICs1MzkzMywyMyBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX1hTaG9ydENsb3N1cmVfX0dyb3VwXzBfMF9fMl9fSW1wbCIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNDg2NToxOiBydWxlX19YU2hvcnRDbG9zdXJlX19Hcm91cF8wXzBfXzJfX0ltcGwgOiAoICggcnVsZV9fWFNob3J0Q2xvc3VyZV9fRXhwbGljaXRTeW50YXhBc3NpZ25tZW50XzBfMF8yICkgKSA7CisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTYyMDM6MTogcnVsZV9fWFNob3J0Q2xvc3VyZV9fR3JvdXBfMF8wX18yX19JbXBsIDogKCAoIHJ1bGVfX1hTaG9ydENsb3N1cmVfX0V4cGxpY2l0U3ludGF4QXNzaWdubWVudF8wXzBfMiApICkgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1hTaG9ydENsb3N1cmVfX0dyb3VwXzBfMF9fMl9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNDg2OToxOiAoICggKCBydWxlX19YU2hvcnRDbG9zdXJlX19FeHBsaWNpdFN5bnRheEFzc2lnbm1lbnRfMF8wXzIgKSApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE0ODcwOjE6ICggKCBydWxlX19YU2hvcnRDbG9zdXJlX19FeHBsaWNpdFN5bnRheEFzc2lnbm1lbnRfMF8wXzIgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNjIwNzoxOiAoICggKCBydWxlX19YU2hvcnRDbG9zdXJlX19FeHBsaWNpdFN5bnRheEFzc2lnbm1lbnRfMF8wXzIgKSApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE2MjA4OjE6ICggKCBydWxlX19YU2hvcnRDbG9zdXJlX19FeHBsaWNpdFN5bnRheEFzc2lnbm1lbnRfMF8wXzIgKSApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNDg3MDoxOiAoICggcnVsZV9fWFNob3J0Q2xvc3VyZV9fRXhwbGljaXRTeW50YXhBc3NpZ25tZW50XzBfMF8yICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTQ4NzE6MjogKCBydWxlX19YU2hvcnRDbG9zdXJlX19FeHBsaWNpdFN5bnRheEFzc2lnbm1lbnRfMF8wXzIgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTYyMDg6MTogKCAoIHJ1bGVfX1hTaG9ydENsb3N1cmVfX0V4cGxpY2l0U3ludGF4QXNzaWdubWVudF8wXzBfMiApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE2MjA5OjI6ICggcnVsZV9fWFNob3J0Q2xvc3VyZV9fRXhwbGljaXRTeW50YXhBc3NpZ25tZW50XzBfMF8yICkKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WFNob3J0Q2xvc3VyZUFjY2VzcygpLmdldEV4cGxpY2l0U3ludGF4QXNzaWdubWVudF8wXzBfMigpKTsgCiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNDg3MjoyOiAoIHJ1bGVfX1hTaG9ydENsb3N1cmVfX0V4cGxpY2l0U3ludGF4QXNzaWdubWVudF8wXzBfMiApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNDg3MjozOiBydWxlX19YU2hvcnRDbG9zdXJlX19FeHBsaWNpdFN5bnRheEFzc2lnbm1lbnRfMF8wXzIKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE2MjEwOjI6ICggcnVsZV9fWFNob3J0Q2xvc3VyZV9fRXhwbGljaXRTeW50YXhBc3NpZ25tZW50XzBfMF8yICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE2MjEwOjM6IHJ1bGVfX1hTaG9ydENsb3N1cmVfX0V4cGxpY2l0U3ludGF4QXNzaWdubWVudF8wXzBfMgogICAgICAgICAgICAgewogICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMik7CiAgICAgICAgICAgICBydWxlX19YU2hvcnRDbG9zdXJlX19FeHBsaWNpdFN5bnRheEFzc2lnbm1lbnRfMF8wXzIoKTsKQEAgLTQ5NTI3LDE2ICs1Mzk4NCwxNiBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX1hTaG9ydENsb3N1cmVfX0dyb3VwXzBfMF8xX18wIgotICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE0ODgxOjE6IHJ1bGVfX1hTaG9ydENsb3N1cmVfX0dyb3VwXzBfMF8xX18wIDogcnVsZV9fWFNob3J0Q2xvc3VyZV9fR3JvdXBfMF8wXzFfXzBfX0ltcGwgcnVsZV9fWFNob3J0Q2xvc3VyZV9fR3JvdXBfMF8wXzFfXzEgOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE2MjE5OjE6IHJ1bGVfX1hTaG9ydENsb3N1cmVfX0dyb3VwXzBfMF8xX18wIDogcnVsZV9fWFNob3J0Q2xvc3VyZV9fR3JvdXBfMF8wXzFfXzBfX0ltcGwgcnVsZV9fWFNob3J0Q2xvc3VyZV9fR3JvdXBfMF8wXzFfXzEgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1hTaG9ydENsb3N1cmVfX0dyb3VwXzBfMF8xX18wKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE0ODg1OjE6ICggcnVsZV9fWFNob3J0Q2xvc3VyZV9fR3JvdXBfMF8wXzFfXzBfX0ltcGwgcnVsZV9fWFNob3J0Q2xvc3VyZV9fR3JvdXBfMF8wXzFfXzEgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTQ4ODY6MjogcnVsZV9fWFNob3J0Q2xvc3VyZV9fR3JvdXBfMF8wXzFfXzBfX0ltcGwgcnVsZV9fWFNob3J0Q2xvc3VyZV9fR3JvdXBfMF8wXzFfXzEKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE2MjIzOjE6ICggcnVsZV9fWFNob3J0Q2xvc3VyZV9fR3JvdXBfMF8wXzFfXzBfX0ltcGwgcnVsZV9fWFNob3J0Q2xvc3VyZV9fR3JvdXBfMF8wXzFfXzEgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTYyMjQ6MjogcnVsZV9fWFNob3J0Q2xvc3VyZV9fR3JvdXBfMF8wXzFfXzBfX0ltcGwgcnVsZV9fWFNob3J0Q2xvc3VyZV9fR3JvdXBfMF8wXzFfXzEKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzcyKTsKKyAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzgwKTsKICAgICAgICAgICAgIHJ1bGVfX1hTaG9ydENsb3N1cmVfX0dyb3VwXzBfMF8xX18wX19JbXBsKCk7CiAKICAgICAgICAgICAgIHN0YXRlLl9mc3AtLTsKQEAgLTQ5NTY1LDIzICs1NDAyMiwyMyBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX1hTaG9ydENsb3N1cmVfX0dyb3VwXzBfMF8xX18wX19JbXBsIgotICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE0ODkzOjE6IHJ1bGVfX1hTaG9ydENsb3N1cmVfX0dyb3VwXzBfMF8xX18wX19JbXBsIDogKCAoIHJ1bGVfX1hTaG9ydENsb3N1cmVfX0RlY2xhcmVkRm9ybWFsUGFyYW1ldGVyc0Fzc2lnbm1lbnRfMF8wXzFfMCApICkgOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE2MjMxOjE6IHJ1bGVfX1hTaG9ydENsb3N1cmVfX0dyb3VwXzBfMF8xX18wX19JbXBsIDogKCAoIHJ1bGVfX1hTaG9ydENsb3N1cmVfX0RlY2xhcmVkRm9ybWFsUGFyYW1ldGVyc0Fzc2lnbm1lbnRfMF8wXzFfMCApICkgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1hTaG9ydENsb3N1cmVfX0dyb3VwXzBfMF8xX18wX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE0ODk3OjE6ICggKCAoIHJ1bGVfX1hTaG9ydENsb3N1cmVfX0RlY2xhcmVkRm9ybWFsUGFyYW1ldGVyc0Fzc2lnbm1lbnRfMF8wXzFfMCApICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTQ4OTg6MTogKCAoIHJ1bGVfX1hTaG9ydENsb3N1cmVfX0RlY2xhcmVkRm9ybWFsUGFyYW1ldGVyc0Fzc2lnbm1lbnRfMF8wXzFfMCApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE2MjM1OjE6ICggKCAoIHJ1bGVfX1hTaG9ydENsb3N1cmVfX0RlY2xhcmVkRm9ybWFsUGFyYW1ldGVyc0Fzc2lnbm1lbnRfMF8wXzFfMCApICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTYyMzY6MTogKCAoIHJ1bGVfX1hTaG9ydENsb3N1cmVfX0RlY2xhcmVkRm9ybWFsUGFyYW1ldGVyc0Fzc2lnbm1lbnRfMF8wXzFfMCApICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE0ODk4OjE6ICggKCBydWxlX19YU2hvcnRDbG9zdXJlX19EZWNsYXJlZEZvcm1hbFBhcmFtZXRlcnNBc3NpZ25tZW50XzBfMF8xXzAgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNDg5OToyOiAoIHJ1bGVfX1hTaG9ydENsb3N1cmVfX0RlY2xhcmVkRm9ybWFsUGFyYW1ldGVyc0Fzc2lnbm1lbnRfMF8wXzFfMCApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNjIzNjoxOiAoICggcnVsZV9fWFNob3J0Q2xvc3VyZV9fRGVjbGFyZWRGb3JtYWxQYXJhbWV0ZXJzQXNzaWdubWVudF8wXzBfMV8wICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTYyMzc6MjogKCBydWxlX19YU2hvcnRDbG9zdXJlX19EZWNsYXJlZEZvcm1hbFBhcmFtZXRlcnNBc3NpZ25tZW50XzBfMF8xXzAgKQogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYU2hvcnRDbG9zdXJlQWNjZXNzKCkuZ2V0RGVjbGFyZWRGb3JtYWxQYXJhbWV0ZXJzQXNzaWdubWVudF8wXzBfMV8wKCkpOyAKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE0OTAwOjI6ICggcnVsZV9fWFNob3J0Q2xvc3VyZV9fRGVjbGFyZWRGb3JtYWxQYXJhbWV0ZXJzQXNzaWdubWVudF8wXzBfMV8wICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE0OTAwOjM6IHJ1bGVfX1hTaG9ydENsb3N1cmVfX0RlY2xhcmVkRm9ybWFsUGFyYW1ldGVyc0Fzc2lnbm1lbnRfMF8wXzFfMAorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTYyMzg6MjogKCBydWxlX19YU2hvcnRDbG9zdXJlX19EZWNsYXJlZEZvcm1hbFBhcmFtZXRlcnNBc3NpZ25tZW50XzBfMF8xXzAgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTYyMzg6MzogcnVsZV9fWFNob3J0Q2xvc3VyZV9fRGVjbGFyZWRGb3JtYWxQYXJhbWV0ZXJzQXNzaWdubWVudF8wXzBfMV8wCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV18yKTsKICAgICAgICAgICAgIHJ1bGVfX1hTaG9ydENsb3N1cmVfX0RlY2xhcmVkRm9ybWFsUGFyYW1ldGVyc0Fzc2lnbm1lbnRfMF8wXzFfMCgpOwpAQCAtNDk2MTYsMTQgKzU0MDczLDE0IEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fWFNob3J0Q2xvc3VyZV9fR3JvdXBfMF8wXzFfXzEiCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTQ5MDg6MTogcnVsZV9fWFNob3J0Q2xvc3VyZV9fR3JvdXBfMF8wXzFfXzEgOiBydWxlX19YU2hvcnRDbG9zdXJlX19Hcm91cF8wXzBfMV9fMV9fSW1wbCA7CisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTYyNDY6MTogcnVsZV9fWFNob3J0Q2xvc3VyZV9fR3JvdXBfMF8wXzFfXzEgOiBydWxlX19YU2hvcnRDbG9zdXJlX19Hcm91cF8wXzBfMV9fMV9fSW1wbCA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fWFNob3J0Q2xvc3VyZV9fR3JvdXBfMF8wXzFfXzEoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTQ5MTI6MTogKCBydWxlX19YU2hvcnRDbG9zdXJlX19Hcm91cF8wXzBfMV9fMV9fSW1wbCApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNDkxMzoyOiBydWxlX19YU2hvcnRDbG9zdXJlX19Hcm91cF8wXzBfMV9fMV9fSW1wbAorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTYyNTA6MTogKCBydWxlX19YU2hvcnRDbG9zdXJlX19Hcm91cF8wXzBfMV9fMV9fSW1wbCApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNjI1MToyOiBydWxlX19YU2hvcnRDbG9zdXJlX19Hcm91cF8wXzBfMV9fMV9fSW1wbAogICAgICAgICAgICAgewogICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMik7CiAgICAgICAgICAgICBydWxlX19YU2hvcnRDbG9zdXJlX19Hcm91cF8wXzBfMV9fMV9fSW1wbCgpOwpAQCAtNDk2NDksMzcgKzU0MTA2LDM3IEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fWFNob3J0Q2xvc3VyZV9fR3JvdXBfMF8wXzFfXzFfX0ltcGwiCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTQ5MTk6MTogcnVsZV9fWFNob3J0Q2xvc3VyZV9fR3JvdXBfMF8wXzFfXzFfX0ltcGwgOiAoICggcnVsZV9fWFNob3J0Q2xvc3VyZV9fR3JvdXBfMF8wXzFfMV9fMCApKiApIDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNjI1NzoxOiBydWxlX19YU2hvcnRDbG9zdXJlX19Hcm91cF8wXzBfMV9fMV9fSW1wbCA6ICggKCBydWxlX19YU2hvcnRDbG9zdXJlX19Hcm91cF8wXzBfMV8xX18wICkqICkgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1hTaG9ydENsb3N1cmVfX0dyb3VwXzBfMF8xX18xX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE0OTIzOjE6ICggKCAoIHJ1bGVfX1hTaG9ydENsb3N1cmVfX0dyb3VwXzBfMF8xXzFfXzAgKSogKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNDkyNDoxOiAoICggcnVsZV9fWFNob3J0Q2xvc3VyZV9fR3JvdXBfMF8wXzFfMV9fMCApKiApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNjI2MToxOiAoICggKCBydWxlX19YU2hvcnRDbG9zdXJlX19Hcm91cF8wXzBfMV8xX18wICkqICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTYyNjI6MTogKCAoIHJ1bGVfX1hTaG9ydENsb3N1cmVfX0dyb3VwXzBfMF8xXzFfXzAgKSogKQogICAgICAgICAgICAgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTQ5MjQ6MTogKCAoIHJ1bGVfX1hTaG9ydENsb3N1cmVfX0dyb3VwXzBfMF8xXzFfXzAgKSogKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTQ5MjU6MjogKCBydWxlX19YU2hvcnRDbG9zdXJlX19Hcm91cF8wXzBfMV8xX18wICkqCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNjI2MjoxOiAoICggcnVsZV9fWFNob3J0Q2xvc3VyZV9fR3JvdXBfMF8wXzFfMV9fMCApKiApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNjI2MzoyOiAoIHJ1bGVfX1hTaG9ydENsb3N1cmVfX0dyb3VwXzBfMF8xXzFfXzAgKSoKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WFNob3J0Q2xvc3VyZUFjY2VzcygpLmdldEdyb3VwXzBfMF8xXzEoKSk7IAogICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTQ5MjY6MjogKCBydWxlX19YU2hvcnRDbG9zdXJlX19Hcm91cF8wXzBfMV8xX18wICkqCi0gICAgICAgICAgICBsb29wMTIzOgorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTYyNjQ6MjogKCBydWxlX19YU2hvcnRDbG9zdXJlX19Hcm91cF8wXzBfMV8xX18wICkqCisgICAgICAgICAgICBsb29wMTM2OgogICAgICAgICAgICAgZG8gewotICAgICAgICAgICAgICAgIGludCBhbHQxMjM9MjsKLSAgICAgICAgICAgICAgICBpbnQgTEExMjNfMCA9IGlucHV0LkxBKDEpOworICAgICAgICAgICAgICAgIGludCBhbHQxMzY9MjsKKyAgICAgICAgICAgICAgICBpbnQgTEExMzZfMCA9IGlucHV0LkxBKDEpOwogCi0gICAgICAgICAgICAgICAgaWYgKCAoTEExMjNfMD09MTE1KSApIHsKLSAgICAgICAgICAgICAgICAgICAgYWx0MTIzPTE7CisgICAgICAgICAgICAgICAgaWYgKCAoTEExMzZfMD09MTI1KSApIHsKKyAgICAgICAgICAgICAgICAgICAgYWx0MTM2PTE7CiAgICAgICAgICAgICAgICAgfQogCiAKLSAgICAgICAgICAgICAgICBzd2l0Y2ggKGFsdDEyMykgeworICAgICAgICAgICAgICAgIHN3aXRjaCAoYWx0MTM2KSB7CiAgICAgICAgICAgICAJY2FzZSAxIDoKLSAgICAgICAgICAgIAkgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTQ5MjY6MzogcnVsZV9fWFNob3J0Q2xvc3VyZV9fR3JvdXBfMF8wXzFfMV9fMAorICAgICAgICAgICAgCSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNjI2NDozOiBydWxlX19YU2hvcnRDbG9zdXJlX19Hcm91cF8wXzBfMV8xX18wCiAgICAgICAgICAgICAJICAgIHsKLSAgICAgICAgICAgIAkgICAgcHVzaEZvbGxvdyhGT0xMT1dfNzMpOworICAgICAgICAgICAgCSAgICBwdXNoRm9sbG93KEZPTExPV184MSk7CiAgICAgICAgICAgICAJICAgIHJ1bGVfX1hTaG9ydENsb3N1cmVfX0dyb3VwXzBfMF8xXzFfXzAoKTsKIAogICAgICAgICAgICAgCSAgICBzdGF0ZS5fZnNwLS07CkBAIC00OTY4OSw3ICs1NDE0Niw3IEBACiAgICAgICAgICAgICAJICAgIGJyZWFrOwogCiAgICAgICAgICAgICAJZGVmYXVsdCA6Ci0gICAgICAgICAgICAJICAgIGJyZWFrIGxvb3AxMjM7CisgICAgICAgICAgICAJICAgIGJyZWFrIGxvb3AxMzY7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfSB3aGlsZSAodHJ1ZSk7CiAKQEAgLTQ5NzE4LDE2ICs1NDE3NSwxNiBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX1hTaG9ydENsb3N1cmVfX0dyb3VwXzBfMF8xXzFfXzAiCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTQ5MzU6MTogcnVsZV9fWFNob3J0Q2xvc3VyZV9fR3JvdXBfMF8wXzFfMV9fMCA6IHJ1bGVfX1hTaG9ydENsb3N1cmVfX0dyb3VwXzBfMF8xXzFfXzBfX0ltcGwgcnVsZV9fWFNob3J0Q2xvc3VyZV9fR3JvdXBfMF8wXzFfMV9fMSA7CisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTYyNzM6MTogcnVsZV9fWFNob3J0Q2xvc3VyZV9fR3JvdXBfMF8wXzFfMV9fMCA6IHJ1bGVfX1hTaG9ydENsb3N1cmVfX0dyb3VwXzBfMF8xXzFfXzBfX0ltcGwgcnVsZV9fWFNob3J0Q2xvc3VyZV9fR3JvdXBfMF8wXzFfMV9fMSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fWFNob3J0Q2xvc3VyZV9fR3JvdXBfMF8wXzFfMV9fMCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNDkzOToxOiAoIHJ1bGVfX1hTaG9ydENsb3N1cmVfX0dyb3VwXzBfMF8xXzFfXzBfX0ltcGwgcnVsZV9fWFNob3J0Q2xvc3VyZV9fR3JvdXBfMF8wXzFfMV9fMSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNDk0MDoyOiBydWxlX19YU2hvcnRDbG9zdXJlX19Hcm91cF8wXzBfMV8xX18wX19JbXBsIHJ1bGVfX1hTaG9ydENsb3N1cmVfX0dyb3VwXzBfMF8xXzFfXzEKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE2Mjc3OjE6ICggcnVsZV9fWFNob3J0Q2xvc3VyZV9fR3JvdXBfMF8wXzFfMV9fMF9fSW1wbCBydWxlX19YU2hvcnRDbG9zdXJlX19Hcm91cF8wXzBfMV8xX18xICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE2Mjc4OjI6IHJ1bGVfX1hTaG9ydENsb3N1cmVfX0dyb3VwXzBfMF8xXzFfXzBfX0ltcGwgcnVsZV9fWFNob3J0Q2xvc3VyZV9fR3JvdXBfMF8wXzFfMV9fMQogICAgICAgICAgICAgewotICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfOTEpOworICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfOTkpOwogICAgICAgICAgICAgcnVsZV9fWFNob3J0Q2xvc3VyZV9fR3JvdXBfMF8wXzFfMV9fMF9fSW1wbCgpOwogCiAgICAgICAgICAgICBzdGF0ZS5fZnNwLS07CkBAIC00OTc1NiwyMiArNTQyMTMsMjIgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YU2hvcnRDbG9zdXJlX19Hcm91cF8wXzBfMV8xX18wX19JbXBsIgotICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE0OTQ3OjE6IHJ1bGVfX1hTaG9ydENsb3N1cmVfX0dyb3VwXzBfMF8xXzFfXzBfX0ltcGwgOiAoICcsJyApIDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNjI4NToxOiBydWxlX19YU2hvcnRDbG9zdXJlX19Hcm91cF8wXzBfMV8xX18wX19JbXBsIDogKCAnLCcgKSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fWFNob3J0Q2xvc3VyZV9fR3JvdXBfMF8wXzFfMV9fMF9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNDk1MToxOiAoICggJywnICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTQ5NTI6MTogKCAnLCcgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTYyODk6MTogKCAoICcsJyApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE2MjkwOjE6ICggJywnICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE0OTUyOjE6ICggJywnICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE0OTUzOjI6ICcsJworICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTYyOTA6MTogKCAnLCcgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTYyOTE6MjogJywnCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhTaG9ydENsb3N1cmVBY2Nlc3MoKS5nZXRDb21tYUtleXdvcmRfMF8wXzFfMV8wKCkpOyAKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1hdGNoKGlucHV0LDExNSxGT0xMT1dfMik7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CisgICAgICAgICAgICBtYXRjaChpbnB1dCwxMjUsRk9MTE9XXzIpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOwogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBhZnRlcihncmFtbWFyQWNjZXNzLmdldFhTaG9ydENsb3N1cmVBY2Nlc3MoKS5nZXRDb21tYUtleXdvcmRfMF8wXzFfMV8wKCkpOyAKICAgICAgICAgICAgIH0KQEAgLTQ5Nzk3LDE0ICs1NDI1NCwxNCBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX1hTaG9ydENsb3N1cmVfX0dyb3VwXzBfMF8xXzFfXzEiCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTQ5NjI6MTogcnVsZV9fWFNob3J0Q2xvc3VyZV9fR3JvdXBfMF8wXzFfMV9fMSA6IHJ1bGVfX1hTaG9ydENsb3N1cmVfX0dyb3VwXzBfMF8xXzFfXzFfX0ltcGwgOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE2MzAwOjE6IHJ1bGVfX1hTaG9ydENsb3N1cmVfX0dyb3VwXzBfMF8xXzFfXzEgOiBydWxlX19YU2hvcnRDbG9zdXJlX19Hcm91cF8wXzBfMV8xX18xX19JbXBsIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YU2hvcnRDbG9zdXJlX19Hcm91cF8wXzBfMV8xX18xKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE0OTY2OjE6ICggcnVsZV9fWFNob3J0Q2xvc3VyZV9fR3JvdXBfMF8wXzFfMV9fMV9fSW1wbCApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNDk2NzoyOiBydWxlX19YU2hvcnRDbG9zdXJlX19Hcm91cF8wXzBfMV8xX18xX19JbXBsCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNjMwNDoxOiAoIHJ1bGVfX1hTaG9ydENsb3N1cmVfX0dyb3VwXzBfMF8xXzFfXzFfX0ltcGwgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTYzMDU6MjogcnVsZV9fWFNob3J0Q2xvc3VyZV9fR3JvdXBfMF8wXzFfMV9fMV9fSW1wbAogICAgICAgICAgICAgewogICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMik7CiAgICAgICAgICAgICBydWxlX19YU2hvcnRDbG9zdXJlX19Hcm91cF8wXzBfMV8xX18xX19JbXBsKCk7CkBAIC00OTgzMCwyMyArNTQyODcsMjMgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YU2hvcnRDbG9zdXJlX19Hcm91cF8wXzBfMV8xX18xX19JbXBsIgotICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE0OTczOjE6IHJ1bGVfX1hTaG9ydENsb3N1cmVfX0dyb3VwXzBfMF8xXzFfXzFfX0ltcGwgOiAoICggcnVsZV9fWFNob3J0Q2xvc3VyZV9fRGVjbGFyZWRGb3JtYWxQYXJhbWV0ZXJzQXNzaWdubWVudF8wXzBfMV8xXzEgKSApIDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNjMxMToxOiBydWxlX19YU2hvcnRDbG9zdXJlX19Hcm91cF8wXzBfMV8xX18xX19JbXBsIDogKCAoIHJ1bGVfX1hTaG9ydENsb3N1cmVfX0RlY2xhcmVkRm9ybWFsUGFyYW1ldGVyc0Fzc2lnbm1lbnRfMF8wXzFfMV8xICkgKSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fWFNob3J0Q2xvc3VyZV9fR3JvdXBfMF8wXzFfMV9fMV9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNDk3NzoxOiAoICggKCBydWxlX19YU2hvcnRDbG9zdXJlX19EZWNsYXJlZEZvcm1hbFBhcmFtZXRlcnNBc3NpZ25tZW50XzBfMF8xXzFfMSApICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTQ5Nzg6MTogKCAoIHJ1bGVfX1hTaG9ydENsb3N1cmVfX0RlY2xhcmVkRm9ybWFsUGFyYW1ldGVyc0Fzc2lnbm1lbnRfMF8wXzFfMV8xICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTYzMTU6MTogKCAoICggcnVsZV9fWFNob3J0Q2xvc3VyZV9fRGVjbGFyZWRGb3JtYWxQYXJhbWV0ZXJzQXNzaWdubWVudF8wXzBfMV8xXzEgKSApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE2MzE2OjE6ICggKCBydWxlX19YU2hvcnRDbG9zdXJlX19EZWNsYXJlZEZvcm1hbFBhcmFtZXRlcnNBc3NpZ25tZW50XzBfMF8xXzFfMSApICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE0OTc4OjE6ICggKCBydWxlX19YU2hvcnRDbG9zdXJlX19EZWNsYXJlZEZvcm1hbFBhcmFtZXRlcnNBc3NpZ25tZW50XzBfMF8xXzFfMSApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE0OTc5OjI6ICggcnVsZV9fWFNob3J0Q2xvc3VyZV9fRGVjbGFyZWRGb3JtYWxQYXJhbWV0ZXJzQXNzaWdubWVudF8wXzBfMV8xXzEgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTYzMTY6MTogKCAoIHJ1bGVfX1hTaG9ydENsb3N1cmVfX0RlY2xhcmVkRm9ybWFsUGFyYW1ldGVyc0Fzc2lnbm1lbnRfMF8wXzFfMV8xICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTYzMTc6MjogKCBydWxlX19YU2hvcnRDbG9zdXJlX19EZWNsYXJlZEZvcm1hbFBhcmFtZXRlcnNBc3NpZ25tZW50XzBfMF8xXzFfMSApCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhTaG9ydENsb3N1cmVBY2Nlc3MoKS5nZXREZWNsYXJlZEZvcm1hbFBhcmFtZXRlcnNBc3NpZ25tZW50XzBfMF8xXzFfMSgpKTsgCiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNDk4MDoyOiAoIHJ1bGVfX1hTaG9ydENsb3N1cmVfX0RlY2xhcmVkRm9ybWFsUGFyYW1ldGVyc0Fzc2lnbm1lbnRfMF8wXzFfMV8xICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE0OTgwOjM6IHJ1bGVfX1hTaG9ydENsb3N1cmVfX0RlY2xhcmVkRm9ybWFsUGFyYW1ldGVyc0Fzc2lnbm1lbnRfMF8wXzFfMV8xCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNjMxODoyOiAoIHJ1bGVfX1hTaG9ydENsb3N1cmVfX0RlY2xhcmVkRm9ybWFsUGFyYW1ldGVyc0Fzc2lnbm1lbnRfMF8wXzFfMV8xICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE2MzE4OjM6IHJ1bGVfX1hTaG9ydENsb3N1cmVfX0RlY2xhcmVkRm9ybWFsUGFyYW1ldGVyc0Fzc2lnbm1lbnRfMF8wXzFfMV8xCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV18yKTsKICAgICAgICAgICAgIHJ1bGVfX1hTaG9ydENsb3N1cmVfX0RlY2xhcmVkRm9ybWFsUGFyYW1ldGVyc0Fzc2lnbm1lbnRfMF8wXzFfMV8xKCk7CkBAIC00OTg4MSwxNiArNTQzMzgsMTYgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YUGFyZW50aGVzaXplZEV4cHJlc3Npb25fX0dyb3VwX18wIgotICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE0OTg5OjE6IHJ1bGVfX1hQYXJlbnRoZXNpemVkRXhwcmVzc2lvbl9fR3JvdXBfXzAgOiBydWxlX19YUGFyZW50aGVzaXplZEV4cHJlc3Npb25fX0dyb3VwX18wX19JbXBsIHJ1bGVfX1hQYXJlbnRoZXNpemVkRXhwcmVzc2lvbl9fR3JvdXBfXzEgOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE2MzI3OjE6IHJ1bGVfX1hQYXJlbnRoZXNpemVkRXhwcmVzc2lvbl9fR3JvdXBfXzAgOiBydWxlX19YUGFyZW50aGVzaXplZEV4cHJlc3Npb25fX0dyb3VwX18wX19JbXBsIHJ1bGVfX1hQYXJlbnRoZXNpemVkRXhwcmVzc2lvbl9fR3JvdXBfXzEgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1hQYXJlbnRoZXNpemVkRXhwcmVzc2lvbl9fR3JvdXBfXzAoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTQ5OTM6MTogKCBydWxlX19YUGFyZW50aGVzaXplZEV4cHJlc3Npb25fX0dyb3VwX18wX19JbXBsIHJ1bGVfX1hQYXJlbnRoZXNpemVkRXhwcmVzc2lvbl9fR3JvdXBfXzEgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTQ5OTQ6MjogcnVsZV9fWFBhcmVudGhlc2l6ZWRFeHByZXNzaW9uX19Hcm91cF9fMF9fSW1wbCBydWxlX19YUGFyZW50aGVzaXplZEV4cHJlc3Npb25fX0dyb3VwX18xCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNjMzMToxOiAoIHJ1bGVfX1hQYXJlbnRoZXNpemVkRXhwcmVzc2lvbl9fR3JvdXBfXzBfX0ltcGwgcnVsZV9fWFBhcmVudGhlc2l6ZWRFeHByZXNzaW9uX19Hcm91cF9fMSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNjMzMjoyOiBydWxlX19YUGFyZW50aGVzaXplZEV4cHJlc3Npb25fX0dyb3VwX18wX19JbXBsIHJ1bGVfX1hQYXJlbnRoZXNpemVkRXhwcmVzc2lvbl9fR3JvdXBfXzEKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzc0KTsKKyAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzgyKTsKICAgICAgICAgICAgIHJ1bGVfX1hQYXJlbnRoZXNpemVkRXhwcmVzc2lvbl9fR3JvdXBfXzBfX0ltcGwoKTsKIAogICAgICAgICAgICAgc3RhdGUuX2ZzcC0tOwpAQCAtNDk5MTksMjIgKzU0Mzc2LDIyIEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fWFBhcmVudGhlc2l6ZWRFeHByZXNzaW9uX19Hcm91cF9fMF9fSW1wbCIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNTAwMToxOiBydWxlX19YUGFyZW50aGVzaXplZEV4cHJlc3Npb25fX0dyb3VwX18wX19JbXBsIDogKCAnKCcgKSA7CisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTYzMzk6MTogcnVsZV9fWFBhcmVudGhlc2l6ZWRFeHByZXNzaW9uX19Hcm91cF9fMF9fSW1wbCA6ICggJygnICkgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1hQYXJlbnRoZXNpemVkRXhwcmVzc2lvbl9fR3JvdXBfXzBfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTUwMDU6MTogKCAoICcoJyApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE1MDA2OjE6ICggJygnICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE2MzQzOjE6ICggKCAnKCcgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNjM0NDoxOiAoICcoJyApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNTAwNjoxOiAoICcoJyApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNTAwNzoyOiAnKCcKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE2MzQ0OjE6ICggJygnICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE2MzQ1OjI6ICcoJwogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYUGFyZW50aGVzaXplZEV4cHJlc3Npb25BY2Nlc3MoKS5nZXRMZWZ0UGFyZW50aGVzaXNLZXl3b3JkXzAoKSk7IAogICAgICAgICAgICAgfQotICAgICAgICAgICAgbWF0Y2goaW5wdXQsMTEzLEZPTExPV18yKTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKKyAgICAgICAgICAgIG1hdGNoKGlucHV0LDEyMyxGT0xMT1dfMik7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0WFBhcmVudGhlc2l6ZWRFeHByZXNzaW9uQWNjZXNzKCkuZ2V0TGVmdFBhcmVudGhlc2lzS2V5d29yZF8wKCkpOyAKICAgICAgICAgICAgIH0KQEAgLTQ5OTYwLDE2ICs1NDQxNywxNiBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX1hQYXJlbnRoZXNpemVkRXhwcmVzc2lvbl9fR3JvdXBfXzEiCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTUwMTY6MTogcnVsZV9fWFBhcmVudGhlc2l6ZWRFeHByZXNzaW9uX19Hcm91cF9fMSA6IHJ1bGVfX1hQYXJlbnRoZXNpemVkRXhwcmVzc2lvbl9fR3JvdXBfXzFfX0ltcGwgcnVsZV9fWFBhcmVudGhlc2l6ZWRFeHByZXNzaW9uX19Hcm91cF9fMiA7CisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTYzNTQ6MTogcnVsZV9fWFBhcmVudGhlc2l6ZWRFeHByZXNzaW9uX19Hcm91cF9fMSA6IHJ1bGVfX1hQYXJlbnRoZXNpemVkRXhwcmVzc2lvbl9fR3JvdXBfXzFfX0ltcGwgcnVsZV9fWFBhcmVudGhlc2l6ZWRFeHByZXNzaW9uX19Hcm91cF9fMiA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fWFBhcmVudGhlc2l6ZWRFeHByZXNzaW9uX19Hcm91cF9fMSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNTAyMDoxOiAoIHJ1bGVfX1hQYXJlbnRoZXNpemVkRXhwcmVzc2lvbl9fR3JvdXBfXzFfX0ltcGwgcnVsZV9fWFBhcmVudGhlc2l6ZWRFeHByZXNzaW9uX19Hcm91cF9fMiApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNTAyMToyOiBydWxlX19YUGFyZW50aGVzaXplZEV4cHJlc3Npb25fX0dyb3VwX18xX19JbXBsIHJ1bGVfX1hQYXJlbnRoZXNpemVkRXhwcmVzc2lvbl9fR3JvdXBfXzIKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE2MzU4OjE6ICggcnVsZV9fWFBhcmVudGhlc2l6ZWRFeHByZXNzaW9uX19Hcm91cF9fMV9fSW1wbCBydWxlX19YUGFyZW50aGVzaXplZEV4cHJlc3Npb25fX0dyb3VwX18yICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE2MzU5OjI6IHJ1bGVfX1hQYXJlbnRoZXNpemVkRXhwcmVzc2lvbl9fR3JvdXBfXzFfX0ltcGwgcnVsZV9fWFBhcmVudGhlc2l6ZWRFeHByZXNzaW9uX19Hcm91cF9fMgogICAgICAgICAgICAgewotICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMTE4KTsKKyAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzEyNik7CiAgICAgICAgICAgICBydWxlX19YUGFyZW50aGVzaXplZEV4cHJlc3Npb25fX0dyb3VwX18xX19JbXBsKCk7CiAKICAgICAgICAgICAgIHN0YXRlLl9mc3AtLTsKQEAgLTQ5OTk4LDE3ICs1NDQ1NSwxNyBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX1hQYXJlbnRoZXNpemVkRXhwcmVzc2lvbl9fR3JvdXBfXzFfX0ltcGwiCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTUwMjg6MTogcnVsZV9fWFBhcmVudGhlc2l6ZWRFeHByZXNzaW9uX19Hcm91cF9fMV9fSW1wbCA6ICggcnVsZVhFeHByZXNzaW9uICkgOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE2MzY2OjE6IHJ1bGVfX1hQYXJlbnRoZXNpemVkRXhwcmVzc2lvbl9fR3JvdXBfXzFfX0ltcGwgOiAoIHJ1bGVYRXhwcmVzc2lvbiApIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YUGFyZW50aGVzaXplZEV4cHJlc3Npb25fX0dyb3VwX18xX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE1MDMyOjE6ICggKCBydWxlWEV4cHJlc3Npb24gKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNTAzMzoxOiAoIHJ1bGVYRXhwcmVzc2lvbiApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNjM3MDoxOiAoICggcnVsZVhFeHByZXNzaW9uICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTYzNzE6MTogKCBydWxlWEV4cHJlc3Npb24gKQogICAgICAgICAgICAgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTUwMzM6MTogKCBydWxlWEV4cHJlc3Npb24gKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTUwMzQ6MjogcnVsZVhFeHByZXNzaW9uCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNjM3MToxOiAoIHJ1bGVYRXhwcmVzc2lvbiApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNjM3MjoyOiBydWxlWEV4cHJlc3Npb24KICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WFBhcmVudGhlc2l6ZWRFeHByZXNzaW9uQWNjZXNzKCkuZ2V0WEV4cHJlc3Npb25QYXJzZXJSdWxlQ2FsbF8xKCkpOyAKQEAgLTUwMDQzLDE0ICs1NDUwMCwxNCBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX1hQYXJlbnRoZXNpemVkRXhwcmVzc2lvbl9fR3JvdXBfXzIiCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTUwNDM6MTogcnVsZV9fWFBhcmVudGhlc2l6ZWRFeHByZXNzaW9uX19Hcm91cF9fMiA6IHJ1bGVfX1hQYXJlbnRoZXNpemVkRXhwcmVzc2lvbl9fR3JvdXBfXzJfX0ltcGwgOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE2MzgxOjE6IHJ1bGVfX1hQYXJlbnRoZXNpemVkRXhwcmVzc2lvbl9fR3JvdXBfXzIgOiBydWxlX19YUGFyZW50aGVzaXplZEV4cHJlc3Npb25fX0dyb3VwX18yX19JbXBsIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YUGFyZW50aGVzaXplZEV4cHJlc3Npb25fX0dyb3VwX18yKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE1MDQ3OjE6ICggcnVsZV9fWFBhcmVudGhlc2l6ZWRFeHByZXNzaW9uX19Hcm91cF9fMl9fSW1wbCApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNTA0ODoyOiBydWxlX19YUGFyZW50aGVzaXplZEV4cHJlc3Npb25fX0dyb3VwX18yX19JbXBsCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNjM4NToxOiAoIHJ1bGVfX1hQYXJlbnRoZXNpemVkRXhwcmVzc2lvbl9fR3JvdXBfXzJfX0ltcGwgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTYzODY6MjogcnVsZV9fWFBhcmVudGhlc2l6ZWRFeHByZXNzaW9uX19Hcm91cF9fMl9fSW1wbAogICAgICAgICAgICAgewogICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMik7CiAgICAgICAgICAgICBydWxlX19YUGFyZW50aGVzaXplZEV4cHJlc3Npb25fX0dyb3VwX18yX19JbXBsKCk7CkBAIC01MDA3NiwyMiArNTQ1MzMsMjIgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YUGFyZW50aGVzaXplZEV4cHJlc3Npb25fX0dyb3VwX18yX19JbXBsIgotICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE1MDU0OjE6IHJ1bGVfX1hQYXJlbnRoZXNpemVkRXhwcmVzc2lvbl9fR3JvdXBfXzJfX0ltcGwgOiAoICcpJyApIDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNjM5MjoxOiBydWxlX19YUGFyZW50aGVzaXplZEV4cHJlc3Npb25fX0dyb3VwX18yX19JbXBsIDogKCAnKScgKSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fWFBhcmVudGhlc2l6ZWRFeHByZXNzaW9uX19Hcm91cF9fMl9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNTA1ODoxOiAoICggJyknICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTUwNTk6MTogKCAnKScgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTYzOTY6MTogKCAoICcpJyApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE2Mzk3OjE6ICggJyknICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE1MDU5OjE6ICggJyknICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE1MDYwOjI6ICcpJworICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTYzOTc6MTogKCAnKScgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTYzOTg6MjogJyknCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhQYXJlbnRoZXNpemVkRXhwcmVzc2lvbkFjY2VzcygpLmdldFJpZ2h0UGFyZW50aGVzaXNLZXl3b3JkXzIoKSk7IAogICAgICAgICAgICAgfQotICAgICAgICAgICAgbWF0Y2goaW5wdXQsMTE0LEZPTExPV18yKTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKKyAgICAgICAgICAgIG1hdGNoKGlucHV0LDEyNCxGT0xMT1dfMik7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0WFBhcmVudGhlc2l6ZWRFeHByZXNzaW9uQWNjZXNzKCkuZ2V0UmlnaHRQYXJlbnRoZXNpc0tleXdvcmRfMigpKTsgCiAgICAgICAgICAgICB9CkBAIC01MDExNywxNiArNTQ1NzQsMTYgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YSWZFeHByZXNzaW9uX19Hcm91cF9fMCIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNTA3MDoxOiBydWxlX19YSWZFeHByZXNzaW9uX19Hcm91cF9fMCA6IHJ1bGVfX1hJZkV4cHJlc3Npb25fX0dyb3VwX18wX19JbXBsIHJ1bGVfX1hJZkV4cHJlc3Npb25fX0dyb3VwX18xIDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNjQwODoxOiBydWxlX19YSWZFeHByZXNzaW9uX19Hcm91cF9fMCA6IHJ1bGVfX1hJZkV4cHJlc3Npb25fX0dyb3VwX18wX19JbXBsIHJ1bGVfX1hJZkV4cHJlc3Npb25fX0dyb3VwX18xIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YSWZFeHByZXNzaW9uX19Hcm91cF9fMCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNTA3NDoxOiAoIHJ1bGVfX1hJZkV4cHJlc3Npb25fX0dyb3VwX18wX19JbXBsIHJ1bGVfX1hJZkV4cHJlc3Npb25fX0dyb3VwX18xICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE1MDc1OjI6IHJ1bGVfX1hJZkV4cHJlc3Npb25fX0dyb3VwX18wX19JbXBsIHJ1bGVfX1hJZkV4cHJlc3Npb25fX0dyb3VwX18xCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNjQxMjoxOiAoIHJ1bGVfX1hJZkV4cHJlc3Npb25fX0dyb3VwX18wX19JbXBsIHJ1bGVfX1hJZkV4cHJlc3Npb25fX0dyb3VwX18xICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE2NDEzOjI6IHJ1bGVfX1hJZkV4cHJlc3Npb25fX0dyb3VwX18wX19JbXBsIHJ1bGVfX1hJZkV4cHJlc3Npb25fX0dyb3VwX18xCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV18xMTkpOworICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMTI3KTsKICAgICAgICAgICAgIHJ1bGVfX1hJZkV4cHJlc3Npb25fX0dyb3VwX18wX19JbXBsKCk7CiAKICAgICAgICAgICAgIHN0YXRlLl9mc3AtLTsKQEAgLTUwMTU1LDIzICs1NDYxMiwyMyBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX1hJZkV4cHJlc3Npb25fX0dyb3VwX18wX19JbXBsIgotICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE1MDgyOjE6IHJ1bGVfX1hJZkV4cHJlc3Npb25fX0dyb3VwX18wX19JbXBsIDogKCAoKSApIDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNjQyMDoxOiBydWxlX19YSWZFeHByZXNzaW9uX19Hcm91cF9fMF9fSW1wbCA6ICggKCkgKSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fWElmRXhwcmVzc2lvbl9fR3JvdXBfXzBfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTUwODY6MTogKCAoICgpICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTUwODc6MTogKCAoKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNjQyNDoxOiAoICggKCkgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNjQyNToxOiAoICgpICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE1MDg3OjE6ICggKCkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTUwODg6MjogKCkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE2NDI1OjE6ICggKCkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTY0MjY6MjogKCkKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WElmRXhwcmVzc2lvbkFjY2VzcygpLmdldFhJZkV4cHJlc3Npb25BY3Rpb25fMCgpKTsgCiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNTA4OToyOiAoKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTUwODk6MzogCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNjQyNzoyOiAoKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTY0Mjc6MzogCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICB9CiAKQEAgLTUwMTk2LDE2ICs1NDY1MywxNiBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX1hJZkV4cHJlc3Npb25fX0dyb3VwX18xIgotICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE1MDk3OjE6IHJ1bGVfX1hJZkV4cHJlc3Npb25fX0dyb3VwX18xIDogcnVsZV9fWElmRXhwcmVzc2lvbl9fR3JvdXBfXzFfX0ltcGwgcnVsZV9fWElmRXhwcmVzc2lvbl9fR3JvdXBfXzIgOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE2NDM1OjE6IHJ1bGVfX1hJZkV4cHJlc3Npb25fX0dyb3VwX18xIDogcnVsZV9fWElmRXhwcmVzc2lvbl9fR3JvdXBfXzFfX0ltcGwgcnVsZV9fWElmRXhwcmVzc2lvbl9fR3JvdXBfXzIgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1hJZkV4cHJlc3Npb25fX0dyb3VwX18xKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE1MTAxOjE6ICggcnVsZV9fWElmRXhwcmVzc2lvbl9fR3JvdXBfXzFfX0ltcGwgcnVsZV9fWElmRXhwcmVzc2lvbl9fR3JvdXBfXzIgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTUxMDI6MjogcnVsZV9fWElmRXhwcmVzc2lvbl9fR3JvdXBfXzFfX0ltcGwgcnVsZV9fWElmRXhwcmVzc2lvbl9fR3JvdXBfXzIKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE2NDM5OjE6ICggcnVsZV9fWElmRXhwcmVzc2lvbl9fR3JvdXBfXzFfX0ltcGwgcnVsZV9fWElmRXhwcmVzc2lvbl9fR3JvdXBfXzIgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTY0NDA6MjogcnVsZV9fWElmRXhwcmVzc2lvbl9fR3JvdXBfXzFfX0ltcGwgcnVsZV9fWElmRXhwcmVzc2lvbl9fR3JvdXBfXzIKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzcwKTsKKyAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzc4KTsKICAgICAgICAgICAgIHJ1bGVfX1hJZkV4cHJlc3Npb25fX0dyb3VwX18xX19JbXBsKCk7CiAKICAgICAgICAgICAgIHN0YXRlLl9mc3AtLTsKQEAgLTUwMjM0LDIyICs1NDY5MSwyMiBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX1hJZkV4cHJlc3Npb25fX0dyb3VwX18xX19JbXBsIgotICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE1MTA5OjE6IHJ1bGVfX1hJZkV4cHJlc3Npb25fX0dyb3VwX18xX19JbXBsIDogKCAnaWYnICkgOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE2NDQ3OjE6IHJ1bGVfX1hJZkV4cHJlc3Npb25fX0dyb3VwX18xX19JbXBsIDogKCAnaWYnICkgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1hJZkV4cHJlc3Npb25fX0dyb3VwX18xX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE1MTEzOjE6ICggKCAnaWYnICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTUxMTQ6MTogKCAnaWYnICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE2NDUxOjE6ICggKCAnaWYnICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTY0NTI6MTogKCAnaWYnICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE1MTE0OjE6ICggJ2lmJyApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNTExNToyOiAnaWYnCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNjQ1MjoxOiAoICdpZicgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTY0NTM6MjogJ2lmJwogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYSWZFeHByZXNzaW9uQWNjZXNzKCkuZ2V0SWZLZXl3b3JkXzEoKSk7IAogICAgICAgICAgICAgfQotICAgICAgICAgICAgbWF0Y2goaW5wdXQsMTIwLEZPTExPV18yKTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKKyAgICAgICAgICAgIG1hdGNoKGlucHV0LDEzMCxGT0xMT1dfMik7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0WElmRXhwcmVzc2lvbkFjY2VzcygpLmdldElmS2V5d29yZF8xKCkpOyAKICAgICAgICAgICAgIH0KQEAgLTUwMjc1LDE2ICs1NDczMiwxNiBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX1hJZkV4cHJlc3Npb25fX0dyb3VwX18yIgotICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE1MTI0OjE6IHJ1bGVfX1hJZkV4cHJlc3Npb25fX0dyb3VwX18yIDogcnVsZV9fWElmRXhwcmVzc2lvbl9fR3JvdXBfXzJfX0ltcGwgcnVsZV9fWElmRXhwcmVzc2lvbl9fR3JvdXBfXzMgOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE2NDYyOjE6IHJ1bGVfX1hJZkV4cHJlc3Npb25fX0dyb3VwX18yIDogcnVsZV9fWElmRXhwcmVzc2lvbl9fR3JvdXBfXzJfX0ltcGwgcnVsZV9fWElmRXhwcmVzc2lvbl9fR3JvdXBfXzMgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1hJZkV4cHJlc3Npb25fX0dyb3VwX18yKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE1MTI4OjE6ICggcnVsZV9fWElmRXhwcmVzc2lvbl9fR3JvdXBfXzJfX0ltcGwgcnVsZV9fWElmRXhwcmVzc2lvbl9fR3JvdXBfXzMgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTUxMjk6MjogcnVsZV9fWElmRXhwcmVzc2lvbl9fR3JvdXBfXzJfX0ltcGwgcnVsZV9fWElmRXhwcmVzc2lvbl9fR3JvdXBfXzMKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE2NDY2OjE6ICggcnVsZV9fWElmRXhwcmVzc2lvbl9fR3JvdXBfXzJfX0ltcGwgcnVsZV9fWElmRXhwcmVzc2lvbl9fR3JvdXBfXzMgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTY0Njc6MjogcnVsZV9fWElmRXhwcmVzc2lvbl9fR3JvdXBfXzJfX0ltcGwgcnVsZV9fWElmRXhwcmVzc2lvbl9fR3JvdXBfXzMKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzc0KTsKKyAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzgyKTsKICAgICAgICAgICAgIHJ1bGVfX1hJZkV4cHJlc3Npb25fX0dyb3VwX18yX19JbXBsKCk7CiAKICAgICAgICAgICAgIHN0YXRlLl9mc3AtLTsKQEAgLTUwMzEzLDIyICs1NDc3MCwyMiBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX1hJZkV4cHJlc3Npb25fX0dyb3VwX18yX19JbXBsIgotICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE1MTM2OjE6IHJ1bGVfX1hJZkV4cHJlc3Npb25fX0dyb3VwX18yX19JbXBsIDogKCAnKCcgKSA7CisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTY0NzQ6MTogcnVsZV9fWElmRXhwcmVzc2lvbl9fR3JvdXBfXzJfX0ltcGwgOiAoICcoJyApIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YSWZFeHByZXNzaW9uX19Hcm91cF9fMl9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNTE0MDoxOiAoICggJygnICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTUxNDE6MTogKCAnKCcgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTY0Nzg6MTogKCAoICcoJyApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE2NDc5OjE6ICggJygnICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE1MTQxOjE6ICggJygnICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE1MTQyOjI6ICcoJworICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTY0Nzk6MTogKCAnKCcgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTY0ODA6MjogJygnCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhJZkV4cHJlc3Npb25BY2Nlc3MoKS5nZXRMZWZ0UGFyZW50aGVzaXNLZXl3b3JkXzIoKSk7IAogICAgICAgICAgICAgfQotICAgICAgICAgICAgbWF0Y2goaW5wdXQsMTEzLEZPTExPV18yKTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKKyAgICAgICAgICAgIG1hdGNoKGlucHV0LDEyMyxGT0xMT1dfMik7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0WElmRXhwcmVzc2lvbkFjY2VzcygpLmdldExlZnRQYXJlbnRoZXNpc0tleXdvcmRfMigpKTsgCiAgICAgICAgICAgICB9CkBAIC01MDM1NCwxNiArNTQ4MTEsMTYgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YSWZFeHByZXNzaW9uX19Hcm91cF9fMyIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNTE1MToxOiBydWxlX19YSWZFeHByZXNzaW9uX19Hcm91cF9fMyA6IHJ1bGVfX1hJZkV4cHJlc3Npb25fX0dyb3VwX18zX19JbXBsIHJ1bGVfX1hJZkV4cHJlc3Npb25fX0dyb3VwX180IDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNjQ4OToxOiBydWxlX19YSWZFeHByZXNzaW9uX19Hcm91cF9fMyA6IHJ1bGVfX1hJZkV4cHJlc3Npb25fX0dyb3VwX18zX19JbXBsIHJ1bGVfX1hJZkV4cHJlc3Npb25fX0dyb3VwX180IDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YSWZFeHByZXNzaW9uX19Hcm91cF9fMygpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNTE1NToxOiAoIHJ1bGVfX1hJZkV4cHJlc3Npb25fX0dyb3VwX18zX19JbXBsIHJ1bGVfX1hJZkV4cHJlc3Npb25fX0dyb3VwX180ICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE1MTU2OjI6IHJ1bGVfX1hJZkV4cHJlc3Npb25fX0dyb3VwX18zX19JbXBsIHJ1bGVfX1hJZkV4cHJlc3Npb25fX0dyb3VwX180CisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNjQ5MzoxOiAoIHJ1bGVfX1hJZkV4cHJlc3Npb25fX0dyb3VwX18zX19JbXBsIHJ1bGVfX1hJZkV4cHJlc3Npb25fX0dyb3VwX180ICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE2NDk0OjI6IHJ1bGVfX1hJZkV4cHJlc3Npb25fX0dyb3VwX18zX19JbXBsIHJ1bGVfX1hJZkV4cHJlc3Npb25fX0dyb3VwX180CiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV18xMTgpOworICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMTI2KTsKICAgICAgICAgICAgIHJ1bGVfX1hJZkV4cHJlc3Npb25fX0dyb3VwX18zX19JbXBsKCk7CiAKICAgICAgICAgICAgIHN0YXRlLl9mc3AtLTsKQEAgLTUwMzkyLDIzICs1NDg0OSwyMyBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX1hJZkV4cHJlc3Npb25fX0dyb3VwX18zX19JbXBsIgotICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE1MTYzOjE6IHJ1bGVfX1hJZkV4cHJlc3Npb25fX0dyb3VwX18zX19JbXBsIDogKCAoIHJ1bGVfX1hJZkV4cHJlc3Npb25fX0lmQXNzaWdubWVudF8zICkgKSA7CisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTY1MDE6MTogcnVsZV9fWElmRXhwcmVzc2lvbl9fR3JvdXBfXzNfX0ltcGwgOiAoICggcnVsZV9fWElmRXhwcmVzc2lvbl9fSWZBc3NpZ25tZW50XzMgKSApIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YSWZFeHByZXNzaW9uX19Hcm91cF9fM19fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNTE2NzoxOiAoICggKCBydWxlX19YSWZFeHByZXNzaW9uX19JZkFzc2lnbm1lbnRfMyApICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTUxNjg6MTogKCAoIHJ1bGVfX1hJZkV4cHJlc3Npb25fX0lmQXNzaWdubWVudF8zICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTY1MDU6MTogKCAoICggcnVsZV9fWElmRXhwcmVzc2lvbl9fSWZBc3NpZ25tZW50XzMgKSApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE2NTA2OjE6ICggKCBydWxlX19YSWZFeHByZXNzaW9uX19JZkFzc2lnbm1lbnRfMyApICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE1MTY4OjE6ICggKCBydWxlX19YSWZFeHByZXNzaW9uX19JZkFzc2lnbm1lbnRfMyApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE1MTY5OjI6ICggcnVsZV9fWElmRXhwcmVzc2lvbl9fSWZBc3NpZ25tZW50XzMgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTY1MDY6MTogKCAoIHJ1bGVfX1hJZkV4cHJlc3Npb25fX0lmQXNzaWdubWVudF8zICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTY1MDc6MjogKCBydWxlX19YSWZFeHByZXNzaW9uX19JZkFzc2lnbm1lbnRfMyApCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhJZkV4cHJlc3Npb25BY2Nlc3MoKS5nZXRJZkFzc2lnbm1lbnRfMygpKTsgCiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNTE3MDoyOiAoIHJ1bGVfX1hJZkV4cHJlc3Npb25fX0lmQXNzaWdubWVudF8zICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE1MTcwOjM6IHJ1bGVfX1hJZkV4cHJlc3Npb25fX0lmQXNzaWdubWVudF8zCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNjUwODoyOiAoIHJ1bGVfX1hJZkV4cHJlc3Npb25fX0lmQXNzaWdubWVudF8zICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE2NTA4OjM6IHJ1bGVfX1hJZkV4cHJlc3Npb25fX0lmQXNzaWdubWVudF8zCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV18yKTsKICAgICAgICAgICAgIHJ1bGVfX1hJZkV4cHJlc3Npb25fX0lmQXNzaWdubWVudF8zKCk7CkBAIC01MDQ0MywxNiArNTQ5MDAsMTYgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YSWZFeHByZXNzaW9uX19Hcm91cF9fNCIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNTE3ODoxOiBydWxlX19YSWZFeHByZXNzaW9uX19Hcm91cF9fNCA6IHJ1bGVfX1hJZkV4cHJlc3Npb25fX0dyb3VwX180X19JbXBsIHJ1bGVfX1hJZkV4cHJlc3Npb25fX0dyb3VwX181IDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNjUxNjoxOiBydWxlX19YSWZFeHByZXNzaW9uX19Hcm91cF9fNCA6IHJ1bGVfX1hJZkV4cHJlc3Npb25fX0dyb3VwX180X19JbXBsIHJ1bGVfX1hJZkV4cHJlc3Npb25fX0dyb3VwX181IDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YSWZFeHByZXNzaW9uX19Hcm91cF9fNCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNTE4MjoxOiAoIHJ1bGVfX1hJZkV4cHJlc3Npb25fX0dyb3VwX180X19JbXBsIHJ1bGVfX1hJZkV4cHJlc3Npb25fX0dyb3VwX181ICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE1MTgzOjI6IHJ1bGVfX1hJZkV4cHJlc3Npb25fX0dyb3VwX180X19JbXBsIHJ1bGVfX1hJZkV4cHJlc3Npb25fX0dyb3VwX181CisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNjUyMDoxOiAoIHJ1bGVfX1hJZkV4cHJlc3Npb25fX0dyb3VwX180X19JbXBsIHJ1bGVfX1hJZkV4cHJlc3Npb25fX0dyb3VwX181ICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE2NTIxOjI6IHJ1bGVfX1hJZkV4cHJlc3Npb25fX0dyb3VwX180X19JbXBsIHJ1bGVfX1hJZkV4cHJlc3Npb25fX0dyb3VwX181CiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV183NCk7CisgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV184Mik7CiAgICAgICAgICAgICBydWxlX19YSWZFeHByZXNzaW9uX19Hcm91cF9fNF9fSW1wbCgpOwogCiAgICAgICAgICAgICBzdGF0ZS5fZnNwLS07CkBAIC01MDQ4MSwyMiArNTQ5MzgsMjIgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YSWZFeHByZXNzaW9uX19Hcm91cF9fNF9fSW1wbCIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNTE5MDoxOiBydWxlX19YSWZFeHByZXNzaW9uX19Hcm91cF9fNF9fSW1wbCA6ICggJyknICkgOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE2NTI4OjE6IHJ1bGVfX1hJZkV4cHJlc3Npb25fX0dyb3VwX180X19JbXBsIDogKCAnKScgKSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fWElmRXhwcmVzc2lvbl9fR3JvdXBfXzRfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTUxOTQ6MTogKCAoICcpJyApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE1MTk1OjE6ICggJyknICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE2NTMyOjE6ICggKCAnKScgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNjUzMzoxOiAoICcpJyApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNTE5NToxOiAoICcpJyApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNTE5NjoyOiAnKScKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE2NTMzOjE6ICggJyknICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE2NTM0OjI6ICcpJwogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYSWZFeHByZXNzaW9uQWNjZXNzKCkuZ2V0UmlnaHRQYXJlbnRoZXNpc0tleXdvcmRfNCgpKTsgCiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBtYXRjaChpbnB1dCwxMTQsRk9MTE9XXzIpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOworICAgICAgICAgICAgbWF0Y2goaW5wdXQsMTI0LEZPTExPV18yKTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRYSWZFeHByZXNzaW9uQWNjZXNzKCkuZ2V0UmlnaHRQYXJlbnRoZXNpc0tleXdvcmRfNCgpKTsgCiAgICAgICAgICAgICB9CkBAIC01MDUyMiwxNiArNTQ5NzksMTYgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YSWZFeHByZXNzaW9uX19Hcm91cF9fNSIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNTIwNToxOiBydWxlX19YSWZFeHByZXNzaW9uX19Hcm91cF9fNSA6IHJ1bGVfX1hJZkV4cHJlc3Npb25fX0dyb3VwX181X19JbXBsIHJ1bGVfX1hJZkV4cHJlc3Npb25fX0dyb3VwX182IDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNjU0MzoxOiBydWxlX19YSWZFeHByZXNzaW9uX19Hcm91cF9fNSA6IHJ1bGVfX1hJZkV4cHJlc3Npb25fX0dyb3VwX181X19JbXBsIHJ1bGVfX1hJZkV4cHJlc3Npb25fX0dyb3VwX182IDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YSWZFeHByZXNzaW9uX19Hcm91cF9fNSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNTIwOToxOiAoIHJ1bGVfX1hJZkV4cHJlc3Npb25fX0dyb3VwX181X19JbXBsIHJ1bGVfX1hJZkV4cHJlc3Npb25fX0dyb3VwX182ICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE1MjEwOjI6IHJ1bGVfX1hJZkV4cHJlc3Npb25fX0dyb3VwX181X19JbXBsIHJ1bGVfX1hJZkV4cHJlc3Npb25fX0dyb3VwX182CisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNjU0NzoxOiAoIHJ1bGVfX1hJZkV4cHJlc3Npb25fX0dyb3VwX181X19JbXBsIHJ1bGVfX1hJZkV4cHJlc3Npb25fX0dyb3VwX182ICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE2NTQ4OjI6IHJ1bGVfX1hJZkV4cHJlc3Npb25fX0dyb3VwX181X19JbXBsIHJ1bGVfX1hJZkV4cHJlc3Npb25fX0dyb3VwX182CiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV18xMjApOworICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMTI4KTsKICAgICAgICAgICAgIHJ1bGVfX1hJZkV4cHJlc3Npb25fX0dyb3VwX181X19JbXBsKCk7CiAKICAgICAgICAgICAgIHN0YXRlLl9mc3AtLTsKQEAgLTUwNTYwLDIzICs1NTAxNywyMyBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX1hJZkV4cHJlc3Npb25fX0dyb3VwX181X19JbXBsIgotICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE1MjE3OjE6IHJ1bGVfX1hJZkV4cHJlc3Npb25fX0dyb3VwX181X19JbXBsIDogKCAoIHJ1bGVfX1hJZkV4cHJlc3Npb25fX1RoZW5Bc3NpZ25tZW50XzUgKSApIDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNjU1NToxOiBydWxlX19YSWZFeHByZXNzaW9uX19Hcm91cF9fNV9fSW1wbCA6ICggKCBydWxlX19YSWZFeHByZXNzaW9uX19UaGVuQXNzaWdubWVudF81ICkgKSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fWElmRXhwcmVzc2lvbl9fR3JvdXBfXzVfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTUyMjE6MTogKCAoICggcnVsZV9fWElmRXhwcmVzc2lvbl9fVGhlbkFzc2lnbm1lbnRfNSApICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTUyMjI6MTogKCAoIHJ1bGVfX1hJZkV4cHJlc3Npb25fX1RoZW5Bc3NpZ25tZW50XzUgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNjU1OToxOiAoICggKCBydWxlX19YSWZFeHByZXNzaW9uX19UaGVuQXNzaWdubWVudF81ICkgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNjU2MDoxOiAoICggcnVsZV9fWElmRXhwcmVzc2lvbl9fVGhlbkFzc2lnbm1lbnRfNSApICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE1MjIyOjE6ICggKCBydWxlX19YSWZFeHByZXNzaW9uX19UaGVuQXNzaWdubWVudF81ICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTUyMjM6MjogKCBydWxlX19YSWZFeHByZXNzaW9uX19UaGVuQXNzaWdubWVudF81ICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE2NTYwOjE6ICggKCBydWxlX19YSWZFeHByZXNzaW9uX19UaGVuQXNzaWdubWVudF81ICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTY1NjE6MjogKCBydWxlX19YSWZFeHByZXNzaW9uX19UaGVuQXNzaWdubWVudF81ICkKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WElmRXhwcmVzc2lvbkFjY2VzcygpLmdldFRoZW5Bc3NpZ25tZW50XzUoKSk7IAogICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTUyMjQ6MjogKCBydWxlX19YSWZFeHByZXNzaW9uX19UaGVuQXNzaWdubWVudF81ICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE1MjI0OjM6IHJ1bGVfX1hJZkV4cHJlc3Npb25fX1RoZW5Bc3NpZ25tZW50XzUKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE2NTYyOjI6ICggcnVsZV9fWElmRXhwcmVzc2lvbl9fVGhlbkFzc2lnbm1lbnRfNSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNjU2MjozOiBydWxlX19YSWZFeHByZXNzaW9uX19UaGVuQXNzaWdubWVudF81CiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV18yKTsKICAgICAgICAgICAgIHJ1bGVfX1hJZkV4cHJlc3Npb25fX1RoZW5Bc3NpZ25tZW50XzUoKTsKQEAgLTUwNjExLDE0ICs1NTA2OCwxNCBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX1hJZkV4cHJlc3Npb25fX0dyb3VwX182IgotICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE1MjMyOjE6IHJ1bGVfX1hJZkV4cHJlc3Npb25fX0dyb3VwX182IDogcnVsZV9fWElmRXhwcmVzc2lvbl9fR3JvdXBfXzZfX0ltcGwgOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE2NTcwOjE6IHJ1bGVfX1hJZkV4cHJlc3Npb25fX0dyb3VwX182IDogcnVsZV9fWElmRXhwcmVzc2lvbl9fR3JvdXBfXzZfX0ltcGwgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1hJZkV4cHJlc3Npb25fX0dyb3VwX182KCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE1MjM2OjE6ICggcnVsZV9fWElmRXhwcmVzc2lvbl9fR3JvdXBfXzZfX0ltcGwgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTUyMzc6MjogcnVsZV9fWElmRXhwcmVzc2lvbl9fR3JvdXBfXzZfX0ltcGwKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE2NTc0OjE6ICggcnVsZV9fWElmRXhwcmVzc2lvbl9fR3JvdXBfXzZfX0ltcGwgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTY1NzU6MjogcnVsZV9fWElmRXhwcmVzc2lvbl9fR3JvdXBfXzZfX0ltcGwKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzIpOwogICAgICAgICAgICAgcnVsZV9fWElmRXhwcmVzc2lvbl9fR3JvdXBfXzZfX0ltcGwoKTsKQEAgLTUwNjQ0LDM1ICs1NTEwMSwzNSBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX1hJZkV4cHJlc3Npb25fX0dyb3VwX182X19JbXBsIgotICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE1MjQzOjE6IHJ1bGVfX1hJZkV4cHJlc3Npb25fX0dyb3VwX182X19JbXBsIDogKCAoIHJ1bGVfX1hJZkV4cHJlc3Npb25fX0dyb3VwXzZfXzAgKT8gKSA7CisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTY1ODE6MTogcnVsZV9fWElmRXhwcmVzc2lvbl9fR3JvdXBfXzZfX0ltcGwgOiAoICggcnVsZV9fWElmRXhwcmVzc2lvbl9fR3JvdXBfNl9fMCApPyApIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YSWZFeHByZXNzaW9uX19Hcm91cF9fNl9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNTI0NzoxOiAoICggKCBydWxlX19YSWZFeHByZXNzaW9uX19Hcm91cF82X18wICk/ICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTUyNDg6MTogKCAoIHJ1bGVfX1hJZkV4cHJlc3Npb25fX0dyb3VwXzZfXzAgKT8gKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTY1ODU6MTogKCAoICggcnVsZV9fWElmRXhwcmVzc2lvbl9fR3JvdXBfNl9fMCApPyApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE2NTg2OjE6ICggKCBydWxlX19YSWZFeHByZXNzaW9uX19Hcm91cF82X18wICk/ICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE1MjQ4OjE6ICggKCBydWxlX19YSWZFeHByZXNzaW9uX19Hcm91cF82X18wICk/ICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE1MjQ5OjI6ICggcnVsZV9fWElmRXhwcmVzc2lvbl9fR3JvdXBfNl9fMCApPworICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTY1ODY6MTogKCAoIHJ1bGVfX1hJZkV4cHJlc3Npb25fX0dyb3VwXzZfXzAgKT8gKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTY1ODc6MjogKCBydWxlX19YSWZFeHByZXNzaW9uX19Hcm91cF82X18wICk/CiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhJZkV4cHJlc3Npb25BY2Nlc3MoKS5nZXRHcm91cF82KCkpOyAKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE1MjUwOjI6ICggcnVsZV9fWElmRXhwcmVzc2lvbl9fR3JvdXBfNl9fMCApPwotICAgICAgICAgICAgaW50IGFsdDEyND0yOwotICAgICAgICAgICAgaW50IExBMTI0XzAgPSBpbnB1dC5MQSgxKTsKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE2NTg4OjI6ICggcnVsZV9fWElmRXhwcmVzc2lvbl9fR3JvdXBfNl9fMCApPworICAgICAgICAgICAgaW50IGFsdDEzNz0yOworICAgICAgICAgICAgaW50IExBMTM3XzAgPSBpbnB1dC5MQSgxKTsKIAotICAgICAgICAgICAgaWYgKCAoTEExMjRfMD09MTIxKSApIHsKLSAgICAgICAgICAgICAgICBpbnQgTEExMjRfMSA9IGlucHV0LkxBKDIpOworICAgICAgICAgICAgaWYgKCAoTEExMzdfMD09MTMxKSApIHsKKyAgICAgICAgICAgICAgICBpbnQgTEExMzdfMSA9IGlucHV0LkxBKDIpOwogCi0gICAgICAgICAgICAgICAgaWYgKCAoc3lucHJlZDE3OF9JbnRlcm5hbERhdGFEU0woKSkgKSB7Ci0gICAgICAgICAgICAgICAgICAgIGFsdDEyND0xOworICAgICAgICAgICAgICAgIGlmICggKHN5bnByZWQxOTdfSW50ZXJuYWxEYXRhRFNMKCkpICkgeworICAgICAgICAgICAgICAgICAgICBhbHQxMzc9MTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBzd2l0Y2ggKGFsdDEyNCkgeworICAgICAgICAgICAgc3dpdGNoIChhbHQxMzcpIHsKICAgICAgICAgICAgICAgICBjYXNlIDEgOgotICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNTI1MDozOiBydWxlX19YSWZFeHByZXNzaW9uX19Hcm91cF82X18wCisgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE2NTg4OjM6IHJ1bGVfX1hJZkV4cHJlc3Npb25fX0dyb3VwXzZfXzAKICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV18yKTsKICAgICAgICAgICAgICAgICAgICAgcnVsZV9fWElmRXhwcmVzc2lvbl9fR3JvdXBfNl9fMCgpOwpAQCAtNTA3MTAsMTYgKzU1MTY3LDE2IEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fWElmRXhwcmVzc2lvbl9fR3JvdXBfNl9fMCIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNTI1OToxOiBydWxlX19YSWZFeHByZXNzaW9uX19Hcm91cF82X18wIDogcnVsZV9fWElmRXhwcmVzc2lvbl9fR3JvdXBfNl9fMF9fSW1wbCBydWxlX19YSWZFeHByZXNzaW9uX19Hcm91cF82X18xIDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNjU5NzoxOiBydWxlX19YSWZFeHByZXNzaW9uX19Hcm91cF82X18wIDogcnVsZV9fWElmRXhwcmVzc2lvbl9fR3JvdXBfNl9fMF9fSW1wbCBydWxlX19YSWZFeHByZXNzaW9uX19Hcm91cF82X18xIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YSWZFeHByZXNzaW9uX19Hcm91cF82X18wKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE1MjYzOjE6ICggcnVsZV9fWElmRXhwcmVzc2lvbl9fR3JvdXBfNl9fMF9fSW1wbCBydWxlX19YSWZFeHByZXNzaW9uX19Hcm91cF82X18xICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE1MjY0OjI6IHJ1bGVfX1hJZkV4cHJlc3Npb25fX0dyb3VwXzZfXzBfX0ltcGwgcnVsZV9fWElmRXhwcmVzc2lvbl9fR3JvdXBfNl9fMQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTY2MDE6MTogKCBydWxlX19YSWZFeHByZXNzaW9uX19Hcm91cF82X18wX19JbXBsIHJ1bGVfX1hJZkV4cHJlc3Npb25fX0dyb3VwXzZfXzEgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTY2MDI6MjogcnVsZV9fWElmRXhwcmVzc2lvbl9fR3JvdXBfNl9fMF9fSW1wbCBydWxlX19YSWZFeHByZXNzaW9uX19Hcm91cF82X18xCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV183NCk7CisgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV184Mik7CiAgICAgICAgICAgICBydWxlX19YSWZFeHByZXNzaW9uX19Hcm91cF82X18wX19JbXBsKCk7CiAKICAgICAgICAgICAgIHN0YXRlLl9mc3AtLTsKQEAgLTUwNzQ4LDI1ICs1NTIwNSwyNSBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX1hJZkV4cHJlc3Npb25fX0dyb3VwXzZfXzBfX0ltcGwiCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTUyNzE6MTogcnVsZV9fWElmRXhwcmVzc2lvbl9fR3JvdXBfNl9fMF9fSW1wbCA6ICggKCAnZWxzZScgKSApIDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNjYwOToxOiBydWxlX19YSWZFeHByZXNzaW9uX19Hcm91cF82X18wX19JbXBsIDogKCAoICdlbHNlJyApICkgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1hJZkV4cHJlc3Npb25fX0dyb3VwXzZfXzBfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTUyNzU6MTogKCAoICggJ2Vsc2UnICkgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNTI3NjoxOiAoICggJ2Vsc2UnICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTY2MTM6MTogKCAoICggJ2Vsc2UnICkgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNjYxNDoxOiAoICggJ2Vsc2UnICkgKQogICAgICAgICAgICAgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTUyNzY6MTogKCAoICdlbHNlJyApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE1Mjc3OjI6ICggJ2Vsc2UnICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE2NjE0OjE6ICggKCAnZWxzZScgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNjYxNToyOiAoICdlbHNlJyApCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhJZkV4cHJlc3Npb25BY2Nlc3MoKS5nZXRFbHNlS2V5d29yZF82XzAoKSk7IAogICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTUyNzg6MjogKCAnZWxzZScgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTUyNzg6MzogJ2Vsc2UnCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNjYxNjoyOiAoICdlbHNlJyApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNjYxNjozOiAnZWxzZScKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIG1hdGNoKGlucHV0LDEyMSxGT0xMT1dfMik7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CisgICAgICAgICAgICBtYXRjaChpbnB1dCwxMzEsRk9MTE9XXzIpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOwogCiAgICAgICAgICAgICB9CiAKQEAgLTUwNzk1LDE0ICs1NTI1MiwxNCBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX1hJZkV4cHJlc3Npb25fX0dyb3VwXzZfXzEiCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTUyODY6MTogcnVsZV9fWElmRXhwcmVzc2lvbl9fR3JvdXBfNl9fMSA6IHJ1bGVfX1hJZkV4cHJlc3Npb25fX0dyb3VwXzZfXzFfX0ltcGwgOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE2NjI0OjE6IHJ1bGVfX1hJZkV4cHJlc3Npb25fX0dyb3VwXzZfXzEgOiBydWxlX19YSWZFeHByZXNzaW9uX19Hcm91cF82X18xX19JbXBsIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YSWZFeHByZXNzaW9uX19Hcm91cF82X18xKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE1MjkwOjE6ICggcnVsZV9fWElmRXhwcmVzc2lvbl9fR3JvdXBfNl9fMV9fSW1wbCApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNTI5MToyOiBydWxlX19YSWZFeHByZXNzaW9uX19Hcm91cF82X18xX19JbXBsCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNjYyODoxOiAoIHJ1bGVfX1hJZkV4cHJlc3Npb25fX0dyb3VwXzZfXzFfX0ltcGwgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTY2Mjk6MjogcnVsZV9fWElmRXhwcmVzc2lvbl9fR3JvdXBfNl9fMV9fSW1wbAogICAgICAgICAgICAgewogICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMik7CiAgICAgICAgICAgICBydWxlX19YSWZFeHByZXNzaW9uX19Hcm91cF82X18xX19JbXBsKCk7CkBAIC01MDgyOCwyMyArNTUyODUsMjMgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YSWZFeHByZXNzaW9uX19Hcm91cF82X18xX19JbXBsIgotICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE1Mjk3OjE6IHJ1bGVfX1hJZkV4cHJlc3Npb25fX0dyb3VwXzZfXzFfX0ltcGwgOiAoICggcnVsZV9fWElmRXhwcmVzc2lvbl9fRWxzZUFzc2lnbm1lbnRfNl8xICkgKSA7CisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTY2MzU6MTogcnVsZV9fWElmRXhwcmVzc2lvbl9fR3JvdXBfNl9fMV9fSW1wbCA6ICggKCBydWxlX19YSWZFeHByZXNzaW9uX19FbHNlQXNzaWdubWVudF82XzEgKSApIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YSWZFeHByZXNzaW9uX19Hcm91cF82X18xX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE1MzAxOjE6ICggKCAoIHJ1bGVfX1hJZkV4cHJlc3Npb25fX0Vsc2VBc3NpZ25tZW50XzZfMSApICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTUzMDI6MTogKCAoIHJ1bGVfX1hJZkV4cHJlc3Npb25fX0Vsc2VBc3NpZ25tZW50XzZfMSApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE2NjM5OjE6ICggKCAoIHJ1bGVfX1hJZkV4cHJlc3Npb25fX0Vsc2VBc3NpZ25tZW50XzZfMSApICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTY2NDA6MTogKCAoIHJ1bGVfX1hJZkV4cHJlc3Npb25fX0Vsc2VBc3NpZ25tZW50XzZfMSApICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE1MzAyOjE6ICggKCBydWxlX19YSWZFeHByZXNzaW9uX19FbHNlQXNzaWdubWVudF82XzEgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNTMwMzoyOiAoIHJ1bGVfX1hJZkV4cHJlc3Npb25fX0Vsc2VBc3NpZ25tZW50XzZfMSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNjY0MDoxOiAoICggcnVsZV9fWElmRXhwcmVzc2lvbl9fRWxzZUFzc2lnbm1lbnRfNl8xICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTY2NDE6MjogKCBydWxlX19YSWZFeHByZXNzaW9uX19FbHNlQXNzaWdubWVudF82XzEgKQogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYSWZFeHByZXNzaW9uQWNjZXNzKCkuZ2V0RWxzZUFzc2lnbm1lbnRfNl8xKCkpOyAKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE1MzA0OjI6ICggcnVsZV9fWElmRXhwcmVzc2lvbl9fRWxzZUFzc2lnbm1lbnRfNl8xICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE1MzA0OjM6IHJ1bGVfX1hJZkV4cHJlc3Npb25fX0Vsc2VBc3NpZ25tZW50XzZfMQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTY2NDI6MjogKCBydWxlX19YSWZFeHByZXNzaW9uX19FbHNlQXNzaWdubWVudF82XzEgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTY2NDI6MzogcnVsZV9fWElmRXhwcmVzc2lvbl9fRWxzZUFzc2lnbm1lbnRfNl8xCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV18yKTsKICAgICAgICAgICAgIHJ1bGVfX1hJZkV4cHJlc3Npb25fX0Vsc2VBc3NpZ25tZW50XzZfMSgpOwpAQCAtNTA4NzksMTYgKzU1MzM2LDE2IEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fWFN3aXRjaEV4cHJlc3Npb25fX0dyb3VwX18wIgotICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE1MzEzOjE6IHJ1bGVfX1hTd2l0Y2hFeHByZXNzaW9uX19Hcm91cF9fMCA6IHJ1bGVfX1hTd2l0Y2hFeHByZXNzaW9uX19Hcm91cF9fMF9fSW1wbCBydWxlX19YU3dpdGNoRXhwcmVzc2lvbl9fR3JvdXBfXzEgOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE2NjUxOjE6IHJ1bGVfX1hTd2l0Y2hFeHByZXNzaW9uX19Hcm91cF9fMCA6IHJ1bGVfX1hTd2l0Y2hFeHByZXNzaW9uX19Hcm91cF9fMF9fSW1wbCBydWxlX19YU3dpdGNoRXhwcmVzc2lvbl9fR3JvdXBfXzEgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1hTd2l0Y2hFeHByZXNzaW9uX19Hcm91cF9fMCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNTMxNzoxOiAoIHJ1bGVfX1hTd2l0Y2hFeHByZXNzaW9uX19Hcm91cF9fMF9fSW1wbCBydWxlX19YU3dpdGNoRXhwcmVzc2lvbl9fR3JvdXBfXzEgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTUzMTg6MjogcnVsZV9fWFN3aXRjaEV4cHJlc3Npb25fX0dyb3VwX18wX19JbXBsIHJ1bGVfX1hTd2l0Y2hFeHByZXNzaW9uX19Hcm91cF9fMQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTY2NTU6MTogKCBydWxlX19YU3dpdGNoRXhwcmVzc2lvbl9fR3JvdXBfXzBfX0ltcGwgcnVsZV9fWFN3aXRjaEV4cHJlc3Npb25fX0dyb3VwX18xICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE2NjU2OjI6IHJ1bGVfX1hTd2l0Y2hFeHByZXNzaW9uX19Hcm91cF9fMF9fSW1wbCBydWxlX19YU3dpdGNoRXhwcmVzc2lvbl9fR3JvdXBfXzEKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzEyMSk7CisgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV18xMjkpOwogICAgICAgICAgICAgcnVsZV9fWFN3aXRjaEV4cHJlc3Npb25fX0dyb3VwX18wX19JbXBsKCk7CiAKICAgICAgICAgICAgIHN0YXRlLl9mc3AtLTsKQEAgLTUwOTE3LDIzICs1NTM3NCwyMyBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX1hTd2l0Y2hFeHByZXNzaW9uX19Hcm91cF9fMF9fSW1wbCIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNTMyNToxOiBydWxlX19YU3dpdGNoRXhwcmVzc2lvbl9fR3JvdXBfXzBfX0ltcGwgOiAoICgpICkgOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE2NjYzOjE6IHJ1bGVfX1hTd2l0Y2hFeHByZXNzaW9uX19Hcm91cF9fMF9fSW1wbCA6ICggKCkgKSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fWFN3aXRjaEV4cHJlc3Npb25fX0dyb3VwX18wX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE1MzI5OjE6ICggKCAoKSApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE1MzMwOjE6ICggKCkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTY2Njc6MTogKCAoICgpICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTY2Njg6MTogKCAoKSApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNTMzMDoxOiAoICgpICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE1MzMxOjI6ICgpCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNjY2ODoxOiAoICgpICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE2NjY5OjI6ICgpCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhTd2l0Y2hFeHByZXNzaW9uQWNjZXNzKCkuZ2V0WFN3aXRjaEV4cHJlc3Npb25BY3Rpb25fMCgpKTsgCiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNTMzMjoyOiAoKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTUzMzI6MzogCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNjY3MDoyOiAoKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTY2NzA6MzogCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICB9CiAKQEAgLTUwOTU4LDE2ICs1NTQxNSwxNiBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX1hTd2l0Y2hFeHByZXNzaW9uX19Hcm91cF9fMSIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNTM0MDoxOiBydWxlX19YU3dpdGNoRXhwcmVzc2lvbl9fR3JvdXBfXzEgOiBydWxlX19YU3dpdGNoRXhwcmVzc2lvbl9fR3JvdXBfXzFfX0ltcGwgcnVsZV9fWFN3aXRjaEV4cHJlc3Npb25fX0dyb3VwX18yIDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNjY3ODoxOiBydWxlX19YU3dpdGNoRXhwcmVzc2lvbl9fR3JvdXBfXzEgOiBydWxlX19YU3dpdGNoRXhwcmVzc2lvbl9fR3JvdXBfXzFfX0ltcGwgcnVsZV9fWFN3aXRjaEV4cHJlc3Npb25fX0dyb3VwX18yIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YU3dpdGNoRXhwcmVzc2lvbl9fR3JvdXBfXzEoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTUzNDQ6MTogKCBydWxlX19YU3dpdGNoRXhwcmVzc2lvbl9fR3JvdXBfXzFfX0ltcGwgcnVsZV9fWFN3aXRjaEV4cHJlc3Npb25fX0dyb3VwX18yICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE1MzQ1OjI6IHJ1bGVfX1hTd2l0Y2hFeHByZXNzaW9uX19Hcm91cF9fMV9fSW1wbCBydWxlX19YU3dpdGNoRXhwcmVzc2lvbl9fR3JvdXBfXzIKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE2NjgyOjE6ICggcnVsZV9fWFN3aXRjaEV4cHJlc3Npb25fX0dyb3VwX18xX19JbXBsIHJ1bGVfX1hTd2l0Y2hFeHByZXNzaW9uX19Hcm91cF9fMiApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNjY4MzoyOiBydWxlX19YU3dpdGNoRXhwcmVzc2lvbl9fR3JvdXBfXzFfX0ltcGwgcnVsZV9fWFN3aXRjaEV4cHJlc3Npb25fX0dyb3VwX18yCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV18xMjIpOworICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMTMwKTsKICAgICAgICAgICAgIHJ1bGVfX1hTd2l0Y2hFeHByZXNzaW9uX19Hcm91cF9fMV9fSW1wbCgpOwogCiAgICAgICAgICAgICBzdGF0ZS5fZnNwLS07CkBAIC01MDk5NiwyMiArNTU0NTMsMjIgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YU3dpdGNoRXhwcmVzc2lvbl9fR3JvdXBfXzFfX0ltcGwiCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTUzNTI6MTogcnVsZV9fWFN3aXRjaEV4cHJlc3Npb25fX0dyb3VwX18xX19JbXBsIDogKCAnc3dpdGNoJyApIDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNjY5MDoxOiBydWxlX19YU3dpdGNoRXhwcmVzc2lvbl9fR3JvdXBfXzFfX0ltcGwgOiAoICdzd2l0Y2gnICkgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1hTd2l0Y2hFeHByZXNzaW9uX19Hcm91cF9fMV9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNTM1NjoxOiAoICggJ3N3aXRjaCcgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNTM1NzoxOiAoICdzd2l0Y2gnICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE2Njk0OjE6ICggKCAnc3dpdGNoJyApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE2Njk1OjE6ICggJ3N3aXRjaCcgKQogICAgICAgICAgICAgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTUzNTc6MTogKCAnc3dpdGNoJyApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNTM1ODoyOiAnc3dpdGNoJworICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTY2OTU6MTogKCAnc3dpdGNoJyApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNjY5NjoyOiAnc3dpdGNoJwogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYU3dpdGNoRXhwcmVzc2lvbkFjY2VzcygpLmdldFN3aXRjaEtleXdvcmRfMSgpKTsgCiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBtYXRjaChpbnB1dCwxMjIsRk9MTE9XXzIpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOworICAgICAgICAgICAgbWF0Y2goaW5wdXQsMTMyLEZPTExPV18yKTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRYU3dpdGNoRXhwcmVzc2lvbkFjY2VzcygpLmdldFN3aXRjaEtleXdvcmRfMSgpKTsgCiAgICAgICAgICAgICB9CkBAIC01MTAzNywxNCArNTU0OTQsMTQgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YU3dpdGNoRXhwcmVzc2lvbl9fR3JvdXBfXzIiCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTUzNjc6MTogcnVsZV9fWFN3aXRjaEV4cHJlc3Npb25fX0dyb3VwX18yIDogcnVsZV9fWFN3aXRjaEV4cHJlc3Npb25fX0dyb3VwX18yX19JbXBsIHJ1bGVfX1hTd2l0Y2hFeHByZXNzaW9uX19Hcm91cF9fMyA7CisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTY3MDU6MTogcnVsZV9fWFN3aXRjaEV4cHJlc3Npb25fX0dyb3VwX18yIDogcnVsZV9fWFN3aXRjaEV4cHJlc3Npb25fX0dyb3VwX18yX19JbXBsIHJ1bGVfX1hTd2l0Y2hFeHByZXNzaW9uX19Hcm91cF9fMyA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fWFN3aXRjaEV4cHJlc3Npb25fX0dyb3VwX18yKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE1MzcxOjE6ICggcnVsZV9fWFN3aXRjaEV4cHJlc3Npb25fX0dyb3VwX18yX19JbXBsIHJ1bGVfX1hTd2l0Y2hFeHByZXNzaW9uX19Hcm91cF9fMyApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNTM3MjoyOiBydWxlX19YU3dpdGNoRXhwcmVzc2lvbl9fR3JvdXBfXzJfX0ltcGwgcnVsZV9fWFN3aXRjaEV4cHJlc3Npb25fX0dyb3VwX18zCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNjcwOToxOiAoIHJ1bGVfX1hTd2l0Y2hFeHByZXNzaW9uX19Hcm91cF9fMl9fSW1wbCBydWxlX19YU3dpdGNoRXhwcmVzc2lvbl9fR3JvdXBfXzMgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTY3MTA6MjogcnVsZV9fWFN3aXRjaEV4cHJlc3Npb25fX0dyb3VwX18yX19JbXBsIHJ1bGVfX1hTd2l0Y2hFeHByZXNzaW9uX19Hcm91cF9fMwogICAgICAgICAgICAgewogICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMTApOwogICAgICAgICAgICAgcnVsZV9fWFN3aXRjaEV4cHJlc3Npb25fX0dyb3VwX18yX19JbXBsKCk7CkBAIC01MTA3NSwyMyArNTU1MzIsMjMgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YU3dpdGNoRXhwcmVzc2lvbl9fR3JvdXBfXzJfX0ltcGwiCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTUzNzk6MTogcnVsZV9fWFN3aXRjaEV4cHJlc3Npb25fX0dyb3VwX18yX19JbXBsIDogKCAoIHJ1bGVfX1hTd2l0Y2hFeHByZXNzaW9uX19BbHRlcm5hdGl2ZXNfMiApICkgOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE2NzE3OjE6IHJ1bGVfX1hTd2l0Y2hFeHByZXNzaW9uX19Hcm91cF9fMl9fSW1wbCA6ICggKCBydWxlX19YU3dpdGNoRXhwcmVzc2lvbl9fQWx0ZXJuYXRpdmVzXzIgKSApIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YU3dpdGNoRXhwcmVzc2lvbl9fR3JvdXBfXzJfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTUzODM6MTogKCAoICggcnVsZV9fWFN3aXRjaEV4cHJlc3Npb25fX0FsdGVybmF0aXZlc18yICkgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNTM4NDoxOiAoICggcnVsZV9fWFN3aXRjaEV4cHJlc3Npb25fX0FsdGVybmF0aXZlc18yICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTY3MjE6MTogKCAoICggcnVsZV9fWFN3aXRjaEV4cHJlc3Npb25fX0FsdGVybmF0aXZlc18yICkgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNjcyMjoxOiAoICggcnVsZV9fWFN3aXRjaEV4cHJlc3Npb25fX0FsdGVybmF0aXZlc18yICkgKQogICAgICAgICAgICAgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTUzODQ6MTogKCAoIHJ1bGVfX1hTd2l0Y2hFeHByZXNzaW9uX19BbHRlcm5hdGl2ZXNfMiApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE1Mzg1OjI6ICggcnVsZV9fWFN3aXRjaEV4cHJlc3Npb25fX0FsdGVybmF0aXZlc18yICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE2NzIyOjE6ICggKCBydWxlX19YU3dpdGNoRXhwcmVzc2lvbl9fQWx0ZXJuYXRpdmVzXzIgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNjcyMzoyOiAoIHJ1bGVfX1hTd2l0Y2hFeHByZXNzaW9uX19BbHRlcm5hdGl2ZXNfMiApCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhTd2l0Y2hFeHByZXNzaW9uQWNjZXNzKCkuZ2V0QWx0ZXJuYXRpdmVzXzIoKSk7IAogICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTUzODY6MjogKCBydWxlX19YU3dpdGNoRXhwcmVzc2lvbl9fQWx0ZXJuYXRpdmVzXzIgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTUzODY6MzogcnVsZV9fWFN3aXRjaEV4cHJlc3Npb25fX0FsdGVybmF0aXZlc18yCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNjcyNDoyOiAoIHJ1bGVfX1hTd2l0Y2hFeHByZXNzaW9uX19BbHRlcm5hdGl2ZXNfMiApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNjcyNDozOiBydWxlX19YU3dpdGNoRXhwcmVzc2lvbl9fQWx0ZXJuYXRpdmVzXzIKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzIpOwogICAgICAgICAgICAgcnVsZV9fWFN3aXRjaEV4cHJlc3Npb25fX0FsdGVybmF0aXZlc18yKCk7CkBAIC01MTEyNiwxNiArNTU1ODMsMTYgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YU3dpdGNoRXhwcmVzc2lvbl9fR3JvdXBfXzMiCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTUzOTQ6MTogcnVsZV9fWFN3aXRjaEV4cHJlc3Npb25fX0dyb3VwX18zIDogcnVsZV9fWFN3aXRjaEV4cHJlc3Npb25fX0dyb3VwX18zX19JbXBsIHJ1bGVfX1hTd2l0Y2hFeHByZXNzaW9uX19Hcm91cF9fNCA7CisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTY3MzI6MTogcnVsZV9fWFN3aXRjaEV4cHJlc3Npb25fX0dyb3VwX18zIDogcnVsZV9fWFN3aXRjaEV4cHJlc3Npb25fX0dyb3VwX18zX19JbXBsIHJ1bGVfX1hTd2l0Y2hFeHByZXNzaW9uX19Hcm91cF9fNCA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fWFN3aXRjaEV4cHJlc3Npb25fX0dyb3VwX18zKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE1Mzk4OjE6ICggcnVsZV9fWFN3aXRjaEV4cHJlc3Npb25fX0dyb3VwX18zX19JbXBsIHJ1bGVfX1hTd2l0Y2hFeHByZXNzaW9uX19Hcm91cF9fNCApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNTM5OToyOiBydWxlX19YU3dpdGNoRXhwcmVzc2lvbl9fR3JvdXBfXzNfX0ltcGwgcnVsZV9fWFN3aXRjaEV4cHJlc3Npb25fX0dyb3VwX180CisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNjczNjoxOiAoIHJ1bGVfX1hTd2l0Y2hFeHByZXNzaW9uX19Hcm91cF9fM19fSW1wbCBydWxlX19YU3dpdGNoRXhwcmVzc2lvbl9fR3JvdXBfXzQgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTY3Mzc6MjogcnVsZV9fWFN3aXRjaEV4cHJlc3Npb25fX0dyb3VwX18zX19JbXBsIHJ1bGVfX1hTd2l0Y2hFeHByZXNzaW9uX19Hcm91cF9fNAogICAgICAgICAgICAgewotICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMTIzKTsKKyAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzEzMSk7CiAgICAgICAgICAgICBydWxlX19YU3dpdGNoRXhwcmVzc2lvbl9fR3JvdXBfXzNfX0ltcGwoKTsKIAogICAgICAgICAgICAgc3RhdGUuX2ZzcC0tOwpAQCAtNTExNjQsMjIgKzU1NjIxLDIyIEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fWFN3aXRjaEV4cHJlc3Npb25fX0dyb3VwX18zX19JbXBsIgotICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE1NDA2OjE6IHJ1bGVfX1hTd2l0Y2hFeHByZXNzaW9uX19Hcm91cF9fM19fSW1wbCA6ICggJ3snICkgOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE2NzQ0OjE6IHJ1bGVfX1hTd2l0Y2hFeHByZXNzaW9uX19Hcm91cF9fM19fSW1wbCA6ICggJ3snICkgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1hTd2l0Y2hFeHByZXNzaW9uX19Hcm91cF9fM19fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNTQxMDoxOiAoICggJ3snICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTU0MTE6MTogKCAneycgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTY3NDg6MTogKCAoICd7JyApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE2NzQ5OjE6ICggJ3snICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE1NDExOjE6ICggJ3snICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE1NDEyOjI6ICd7JworICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTY3NDk6MTogKCAneycgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTY3NTA6MjogJ3snCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhTd2l0Y2hFeHByZXNzaW9uQWNjZXNzKCkuZ2V0TGVmdEN1cmx5QnJhY2tldEtleXdvcmRfMygpKTsgCiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBtYXRjaChpbnB1dCw3MCxGT0xMT1dfMik7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CisgICAgICAgICAgICBtYXRjaChpbnB1dCw3NSxGT0xMT1dfMik7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0WFN3aXRjaEV4cHJlc3Npb25BY2Nlc3MoKS5nZXRMZWZ0Q3VybHlCcmFja2V0S2V5d29yZF8zKCkpOyAKICAgICAgICAgICAgIH0KQEAgLTUxMjA1LDE2ICs1NTY2MiwxNiBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX1hTd2l0Y2hFeHByZXNzaW9uX19Hcm91cF9fNCIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNTQyMToxOiBydWxlX19YU3dpdGNoRXhwcmVzc2lvbl9fR3JvdXBfXzQgOiBydWxlX19YU3dpdGNoRXhwcmVzc2lvbl9fR3JvdXBfXzRfX0ltcGwgcnVsZV9fWFN3aXRjaEV4cHJlc3Npb25fX0dyb3VwX181IDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNjc1OToxOiBydWxlX19YU3dpdGNoRXhwcmVzc2lvbl9fR3JvdXBfXzQgOiBydWxlX19YU3dpdGNoRXhwcmVzc2lvbl9fR3JvdXBfXzRfX0ltcGwgcnVsZV9fWFN3aXRjaEV4cHJlc3Npb25fX0dyb3VwX181IDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YU3dpdGNoRXhwcmVzc2lvbl9fR3JvdXBfXzQoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTU0MjU6MTogKCBydWxlX19YU3dpdGNoRXhwcmVzc2lvbl9fR3JvdXBfXzRfX0ltcGwgcnVsZV9fWFN3aXRjaEV4cHJlc3Npb25fX0dyb3VwX181ICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE1NDI2OjI6IHJ1bGVfX1hTd2l0Y2hFeHByZXNzaW9uX19Hcm91cF9fNF9fSW1wbCBydWxlX19YU3dpdGNoRXhwcmVzc2lvbl9fR3JvdXBfXzUKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE2NzYzOjE6ICggcnVsZV9fWFN3aXRjaEV4cHJlc3Npb25fX0dyb3VwX180X19JbXBsIHJ1bGVfX1hTd2l0Y2hFeHByZXNzaW9uX19Hcm91cF9fNSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNjc2NDoyOiBydWxlX19YU3dpdGNoRXhwcmVzc2lvbl9fR3JvdXBfXzRfX0ltcGwgcnVsZV9fWFN3aXRjaEV4cHJlc3Npb25fX0dyb3VwX181CiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV18xMjMpOworICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMTMxKTsKICAgICAgICAgICAgIHJ1bGVfX1hTd2l0Y2hFeHByZXNzaW9uX19Hcm91cF9fNF9fSW1wbCgpOwogCiAgICAgICAgICAgICBzdGF0ZS5fZnNwLS07CkBAIC01MTI0MywzNyArNTU3MDAsMzcgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YU3dpdGNoRXhwcmVzc2lvbl9fR3JvdXBfXzRfX0ltcGwiCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTU0MzM6MTogcnVsZV9fWFN3aXRjaEV4cHJlc3Npb25fX0dyb3VwX180X19JbXBsIDogKCAoIHJ1bGVfX1hTd2l0Y2hFeHByZXNzaW9uX19DYXNlc0Fzc2lnbm1lbnRfNCApKiApIDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNjc3MToxOiBydWxlX19YU3dpdGNoRXhwcmVzc2lvbl9fR3JvdXBfXzRfX0ltcGwgOiAoICggcnVsZV9fWFN3aXRjaEV4cHJlc3Npb25fX0Nhc2VzQXNzaWdubWVudF80ICkqICkgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1hTd2l0Y2hFeHByZXNzaW9uX19Hcm91cF9fNF9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNTQzNzoxOiAoICggKCBydWxlX19YU3dpdGNoRXhwcmVzc2lvbl9fQ2FzZXNBc3NpZ25tZW50XzQgKSogKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNTQzODoxOiAoICggcnVsZV9fWFN3aXRjaEV4cHJlc3Npb25fX0Nhc2VzQXNzaWdubWVudF80ICkqICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE2Nzc1OjE6ICggKCAoIHJ1bGVfX1hTd2l0Y2hFeHByZXNzaW9uX19DYXNlc0Fzc2lnbm1lbnRfNCApKiApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE2Nzc2OjE6ICggKCBydWxlX19YU3dpdGNoRXhwcmVzc2lvbl9fQ2FzZXNBc3NpZ25tZW50XzQgKSogKQogICAgICAgICAgICAgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTU0Mzg6MTogKCAoIHJ1bGVfX1hTd2l0Y2hFeHByZXNzaW9uX19DYXNlc0Fzc2lnbm1lbnRfNCApKiApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNTQzOToyOiAoIHJ1bGVfX1hTd2l0Y2hFeHByZXNzaW9uX19DYXNlc0Fzc2lnbm1lbnRfNCApKgorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTY3NzY6MTogKCAoIHJ1bGVfX1hTd2l0Y2hFeHByZXNzaW9uX19DYXNlc0Fzc2lnbm1lbnRfNCApKiApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNjc3NzoyOiAoIHJ1bGVfX1hTd2l0Y2hFeHByZXNzaW9uX19DYXNlc0Fzc2lnbm1lbnRfNCApKgogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYU3dpdGNoRXhwcmVzc2lvbkFjY2VzcygpLmdldENhc2VzQXNzaWdubWVudF80KCkpOyAKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE1NDQwOjI6ICggcnVsZV9fWFN3aXRjaEV4cHJlc3Npb25fX0Nhc2VzQXNzaWdubWVudF80ICkqCi0gICAgICAgICAgICBsb29wMTI1OgorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTY3Nzg6MjogKCBydWxlX19YU3dpdGNoRXhwcmVzc2lvbl9fQ2FzZXNBc3NpZ25tZW50XzQgKSoKKyAgICAgICAgICAgIGxvb3AxMzg6CiAgICAgICAgICAgICBkbyB7Ci0gICAgICAgICAgICAgICAgaW50IGFsdDEyNT0yOwotICAgICAgICAgICAgICAgIGludCBMQTEyNV8wID0gaW5wdXQuTEEoMSk7CisgICAgICAgICAgICAgICAgaW50IGFsdDEzOD0yOworICAgICAgICAgICAgICAgIGludCBMQTEzOF8wID0gaW5wdXQuTEEoMSk7CiAKLSAgICAgICAgICAgICAgICBpZiAoIChMQTEyNV8wPT1SVUxFX0lEfHxMQTEyNV8wPT0zMXx8TEExMjVfMD09MTEzfHxMQTEyNV8wPT0xMTV8fExBMTI1XzA9PTEyM3x8TEExMjVfMD09MTI1KSApIHsKLSAgICAgICAgICAgICAgICAgICAgYWx0MTI1PTE7CisgICAgICAgICAgICAgICAgaWYgKCAoTEExMzhfMD09UlVMRV9JRHx8TEExMzhfMD09MzF8fExBMTM4XzA9PTEyM3x8TEExMzhfMD09MTI1fHxMQTEzOF8wPT0xMzN8fExBMTM4XzA9PTEzNSkgKSB7CisgICAgICAgICAgICAgICAgICAgIGFsdDEzOD0xOwogICAgICAgICAgICAgICAgIH0KIAogCi0gICAgICAgICAgICAgICAgc3dpdGNoIChhbHQxMjUpIHsKKyAgICAgICAgICAgICAgICBzd2l0Y2ggKGFsdDEzOCkgewogICAgICAgICAgICAgCWNhc2UgMSA6Ci0gICAgICAgICAgICAJICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE1NDQwOjM6IHJ1bGVfX1hTd2l0Y2hFeHByZXNzaW9uX19DYXNlc0Fzc2lnbm1lbnRfNAorICAgICAgICAgICAgCSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNjc3ODozOiBydWxlX19YU3dpdGNoRXhwcmVzc2lvbl9fQ2FzZXNBc3NpZ25tZW50XzQKICAgICAgICAgICAgIAkgICAgewotICAgICAgICAgICAgCSAgICBwdXNoRm9sbG93KEZPTExPV18xMjQpOworICAgICAgICAgICAgCSAgICBwdXNoRm9sbG93KEZPTExPV18xMzIpOwogICAgICAgICAgICAgCSAgICBydWxlX19YU3dpdGNoRXhwcmVzc2lvbl9fQ2FzZXNBc3NpZ25tZW50XzQoKTsKIAogICAgICAgICAgICAgCSAgICBzdGF0ZS5fZnNwLS07CkBAIC01MTI4Myw3ICs1NTc0MCw3IEBACiAgICAgICAgICAgICAJICAgIGJyZWFrOwogCiAgICAgICAgICAgICAJZGVmYXVsdCA6Ci0gICAgICAgICAgICAJICAgIGJyZWFrIGxvb3AxMjU7CisgICAgICAgICAgICAJICAgIGJyZWFrIGxvb3AxMzg7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfSB3aGlsZSAodHJ1ZSk7CiAKQEAgLTUxMzEyLDE2ICs1NTc2OSwxNiBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX1hTd2l0Y2hFeHByZXNzaW9uX19Hcm91cF9fNSIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNTQ0ODoxOiBydWxlX19YU3dpdGNoRXhwcmVzc2lvbl9fR3JvdXBfXzUgOiBydWxlX19YU3dpdGNoRXhwcmVzc2lvbl9fR3JvdXBfXzVfX0ltcGwgcnVsZV9fWFN3aXRjaEV4cHJlc3Npb25fX0dyb3VwX182IDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNjc4NjoxOiBydWxlX19YU3dpdGNoRXhwcmVzc2lvbl9fR3JvdXBfXzUgOiBydWxlX19YU3dpdGNoRXhwcmVzc2lvbl9fR3JvdXBfXzVfX0ltcGwgcnVsZV9fWFN3aXRjaEV4cHJlc3Npb25fX0dyb3VwX182IDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YU3dpdGNoRXhwcmVzc2lvbl9fR3JvdXBfXzUoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTU0NTI6MTogKCBydWxlX19YU3dpdGNoRXhwcmVzc2lvbl9fR3JvdXBfXzVfX0ltcGwgcnVsZV9fWFN3aXRjaEV4cHJlc3Npb25fX0dyb3VwX182ICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE1NDUzOjI6IHJ1bGVfX1hTd2l0Y2hFeHByZXNzaW9uX19Hcm91cF9fNV9fSW1wbCBydWxlX19YU3dpdGNoRXhwcmVzc2lvbl9fR3JvdXBfXzYKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE2NzkwOjE6ICggcnVsZV9fWFN3aXRjaEV4cHJlc3Npb25fX0dyb3VwX181X19JbXBsIHJ1bGVfX1hTd2l0Y2hFeHByZXNzaW9uX19Hcm91cF9fNiApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNjc5MToyOiBydWxlX19YU3dpdGNoRXhwcmVzc2lvbl9fR3JvdXBfXzVfX0ltcGwgcnVsZV9fWFN3aXRjaEV4cHJlc3Npb25fX0dyb3VwX182CiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV18xMjMpOworICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMTMxKTsKICAgICAgICAgICAgIHJ1bGVfX1hTd2l0Y2hFeHByZXNzaW9uX19Hcm91cF9fNV9fSW1wbCgpOwogCiAgICAgICAgICAgICBzdGF0ZS5fZnNwLS07CkBAIC01MTM1MCwzMSArNTU4MDcsMzEgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YU3dpdGNoRXhwcmVzc2lvbl9fR3JvdXBfXzVfX0ltcGwiCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTU0NjA6MTogcnVsZV9fWFN3aXRjaEV4cHJlc3Npb25fX0dyb3VwX181X19JbXBsIDogKCAoIHJ1bGVfX1hTd2l0Y2hFeHByZXNzaW9uX19Hcm91cF81X18wICk/ICkgOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE2Nzk4OjE6IHJ1bGVfX1hTd2l0Y2hFeHByZXNzaW9uX19Hcm91cF9fNV9fSW1wbCA6ICggKCBydWxlX19YU3dpdGNoRXhwcmVzc2lvbl9fR3JvdXBfNV9fMCApPyApIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YU3dpdGNoRXhwcmVzc2lvbl9fR3JvdXBfXzVfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTU0NjQ6MTogKCAoICggcnVsZV9fWFN3aXRjaEV4cHJlc3Npb25fX0dyb3VwXzVfXzAgKT8gKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNTQ2NToxOiAoICggcnVsZV9fWFN3aXRjaEV4cHJlc3Npb25fX0dyb3VwXzVfXzAgKT8gKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTY4MDI6MTogKCAoICggcnVsZV9fWFN3aXRjaEV4cHJlc3Npb25fX0dyb3VwXzVfXzAgKT8gKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNjgwMzoxOiAoICggcnVsZV9fWFN3aXRjaEV4cHJlc3Npb25fX0dyb3VwXzVfXzAgKT8gKQogICAgICAgICAgICAgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTU0NjU6MTogKCAoIHJ1bGVfX1hTd2l0Y2hFeHByZXNzaW9uX19Hcm91cF81X18wICk/ICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE1NDY2OjI6ICggcnVsZV9fWFN3aXRjaEV4cHJlc3Npb25fX0dyb3VwXzVfXzAgKT8KKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE2ODAzOjE6ICggKCBydWxlX19YU3dpdGNoRXhwcmVzc2lvbl9fR3JvdXBfNV9fMCApPyApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNjgwNDoyOiAoIHJ1bGVfX1hTd2l0Y2hFeHByZXNzaW9uX19Hcm91cF81X18wICk/CiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhTd2l0Y2hFeHByZXNzaW9uQWNjZXNzKCkuZ2V0R3JvdXBfNSgpKTsgCiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNTQ2NzoyOiAoIHJ1bGVfX1hTd2l0Y2hFeHByZXNzaW9uX19Hcm91cF81X18wICk/Ci0gICAgICAgICAgICBpbnQgYWx0MTI2PTI7Ci0gICAgICAgICAgICBpbnQgTEExMjZfMCA9IGlucHV0LkxBKDEpOworICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTY4MDU6MjogKCBydWxlX19YU3dpdGNoRXhwcmVzc2lvbl9fR3JvdXBfNV9fMCApPworICAgICAgICAgICAgaW50IGFsdDEzOT0yOworICAgICAgICAgICAgaW50IExBMTM5XzAgPSBpbnB1dC5MQSgxKTsKIAotICAgICAgICAgICAgaWYgKCAoTEExMjZfMD09MTI0KSApIHsKLSAgICAgICAgICAgICAgICBhbHQxMjY9MTsKKyAgICAgICAgICAgIGlmICggKExBMTM5XzA9PTEzNCkgKSB7CisgICAgICAgICAgICAgICAgYWx0MTM5PTE7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBzd2l0Y2ggKGFsdDEyNikgeworICAgICAgICAgICAgc3dpdGNoIChhbHQxMzkpIHsKICAgICAgICAgICAgICAgICBjYXNlIDEgOgotICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNTQ2NzozOiBydWxlX19YU3dpdGNoRXhwcmVzc2lvbl9fR3JvdXBfNV9fMAorICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNjgwNTozOiBydWxlX19YU3dpdGNoRXhwcmVzc2lvbl9fR3JvdXBfNV9fMAogICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzIpOwogICAgICAgICAgICAgICAgICAgICBydWxlX19YU3dpdGNoRXhwcmVzc2lvbl9fR3JvdXBfNV9fMCgpOwpAQCAtNTE0MTIsMTQgKzU1ODY5LDE0IEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fWFN3aXRjaEV4cHJlc3Npb25fX0dyb3VwX182IgotICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE1NDc1OjE6IHJ1bGVfX1hTd2l0Y2hFeHByZXNzaW9uX19Hcm91cF9fNiA6IHJ1bGVfX1hTd2l0Y2hFeHByZXNzaW9uX19Hcm91cF9fNl9fSW1wbCA7CisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTY4MTM6MTogcnVsZV9fWFN3aXRjaEV4cHJlc3Npb25fX0dyb3VwX182IDogcnVsZV9fWFN3aXRjaEV4cHJlc3Npb25fX0dyb3VwX182X19JbXBsIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YU3dpdGNoRXhwcmVzc2lvbl9fR3JvdXBfXzYoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTU0Nzk6MTogKCBydWxlX19YU3dpdGNoRXhwcmVzc2lvbl9fR3JvdXBfXzZfX0ltcGwgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTU0ODA6MjogcnVsZV9fWFN3aXRjaEV4cHJlc3Npb25fX0dyb3VwX182X19JbXBsCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNjgxNzoxOiAoIHJ1bGVfX1hTd2l0Y2hFeHByZXNzaW9uX19Hcm91cF9fNl9fSW1wbCApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNjgxODoyOiBydWxlX19YU3dpdGNoRXhwcmVzc2lvbl9fR3JvdXBfXzZfX0ltcGwKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzIpOwogICAgICAgICAgICAgcnVsZV9fWFN3aXRjaEV4cHJlc3Npb25fX0dyb3VwX182X19JbXBsKCk7CkBAIC01MTQ0NSwyMiArNTU5MDIsMjIgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YU3dpdGNoRXhwcmVzc2lvbl9fR3JvdXBfXzZfX0ltcGwiCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTU0ODY6MTogcnVsZV9fWFN3aXRjaEV4cHJlc3Npb25fX0dyb3VwX182X19JbXBsIDogKCAnfScgKSA7CisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTY4MjQ6MTogcnVsZV9fWFN3aXRjaEV4cHJlc3Npb25fX0dyb3VwX182X19JbXBsIDogKCAnfScgKSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fWFN3aXRjaEV4cHJlc3Npb25fX0dyb3VwX182X19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE1NDkwOjE6ICggKCAnfScgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNTQ5MToxOiAoICd9JyApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNjgyODoxOiAoICggJ30nICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTY4Mjk6MTogKCAnfScgKQogICAgICAgICAgICAgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTU0OTE6MTogKCAnfScgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTU0OTI6MjogJ30nCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNjgyOToxOiAoICd9JyApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNjgzMDoyOiAnfScKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WFN3aXRjaEV4cHJlc3Npb25BY2Nlc3MoKS5nZXRSaWdodEN1cmx5QnJhY2tldEtleXdvcmRfNigpKTsgCiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBtYXRjaChpbnB1dCw3MSxGT0xMT1dfMik7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CisgICAgICAgICAgICBtYXRjaChpbnB1dCw3NixGT0xMT1dfMik7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0WFN3aXRjaEV4cHJlc3Npb25BY2Nlc3MoKS5nZXRSaWdodEN1cmx5QnJhY2tldEtleXdvcmRfNigpKTsgCiAgICAgICAgICAgICB9CkBAIC01MTQ4NiwxNiArNTU5NDMsMTYgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YU3dpdGNoRXhwcmVzc2lvbl9fR3JvdXBfMl8wX18wIgotICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE1NTAyOjE6IHJ1bGVfX1hTd2l0Y2hFeHByZXNzaW9uX19Hcm91cF8yXzBfXzAgOiBydWxlX19YU3dpdGNoRXhwcmVzc2lvbl9fR3JvdXBfMl8wX18wX19JbXBsIHJ1bGVfX1hTd2l0Y2hFeHByZXNzaW9uX19Hcm91cF8yXzBfXzEgOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE2ODQwOjE6IHJ1bGVfX1hTd2l0Y2hFeHByZXNzaW9uX19Hcm91cF8yXzBfXzAgOiBydWxlX19YU3dpdGNoRXhwcmVzc2lvbl9fR3JvdXBfMl8wX18wX19JbXBsIHJ1bGVfX1hTd2l0Y2hFeHByZXNzaW9uX19Hcm91cF8yXzBfXzEgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1hTd2l0Y2hFeHByZXNzaW9uX19Hcm91cF8yXzBfXzAoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTU1MDY6MTogKCBydWxlX19YU3dpdGNoRXhwcmVzc2lvbl9fR3JvdXBfMl8wX18wX19JbXBsIHJ1bGVfX1hTd2l0Y2hFeHByZXNzaW9uX19Hcm91cF8yXzBfXzEgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTU1MDc6MjogcnVsZV9fWFN3aXRjaEV4cHJlc3Npb25fX0dyb3VwXzJfMF9fMF9fSW1wbCBydWxlX19YU3dpdGNoRXhwcmVzc2lvbl9fR3JvdXBfMl8wX18xCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNjg0NDoxOiAoIHJ1bGVfX1hTd2l0Y2hFeHByZXNzaW9uX19Hcm91cF8yXzBfXzBfX0ltcGwgcnVsZV9fWFN3aXRjaEV4cHJlc3Npb25fX0dyb3VwXzJfMF9fMSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNjg0NToyOiBydWxlX19YU3dpdGNoRXhwcmVzc2lvbl9fR3JvdXBfMl8wX18wX19JbXBsIHJ1bGVfX1hTd2l0Y2hFeHByZXNzaW9uX19Hcm91cF8yXzBfXzEKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzc0KTsKKyAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzgyKTsKICAgICAgICAgICAgIHJ1bGVfX1hTd2l0Y2hFeHByZXNzaW9uX19Hcm91cF8yXzBfXzBfX0ltcGwoKTsKIAogICAgICAgICAgICAgc3RhdGUuX2ZzcC0tOwpAQCAtNTE1MjQsMjMgKzU1OTgxLDIzIEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fWFN3aXRjaEV4cHJlc3Npb25fX0dyb3VwXzJfMF9fMF9fSW1wbCIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNTUxNDoxOiBydWxlX19YU3dpdGNoRXhwcmVzc2lvbl9fR3JvdXBfMl8wX18wX19JbXBsIDogKCAoIHJ1bGVfX1hTd2l0Y2hFeHByZXNzaW9uX19Hcm91cF8yXzBfMF9fMCApICkgOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE2ODUyOjE6IHJ1bGVfX1hTd2l0Y2hFeHByZXNzaW9uX19Hcm91cF8yXzBfXzBfX0ltcGwgOiAoICggcnVsZV9fWFN3aXRjaEV4cHJlc3Npb25fX0dyb3VwXzJfMF8wX18wICkgKSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fWFN3aXRjaEV4cHJlc3Npb25fX0dyb3VwXzJfMF9fMF9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNTUxODoxOiAoICggKCBydWxlX19YU3dpdGNoRXhwcmVzc2lvbl9fR3JvdXBfMl8wXzBfXzAgKSApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE1NTE5OjE6ICggKCBydWxlX19YU3dpdGNoRXhwcmVzc2lvbl9fR3JvdXBfMl8wXzBfXzAgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNjg1NjoxOiAoICggKCBydWxlX19YU3dpdGNoRXhwcmVzc2lvbl9fR3JvdXBfMl8wXzBfXzAgKSApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE2ODU3OjE6ICggKCBydWxlX19YU3dpdGNoRXhwcmVzc2lvbl9fR3JvdXBfMl8wXzBfXzAgKSApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNTUxOToxOiAoICggcnVsZV9fWFN3aXRjaEV4cHJlc3Npb25fX0dyb3VwXzJfMF8wX18wICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTU1MjA6MjogKCBydWxlX19YU3dpdGNoRXhwcmVzc2lvbl9fR3JvdXBfMl8wXzBfXzAgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTY4NTc6MTogKCAoIHJ1bGVfX1hTd2l0Y2hFeHByZXNzaW9uX19Hcm91cF8yXzBfMF9fMCApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE2ODU4OjI6ICggcnVsZV9fWFN3aXRjaEV4cHJlc3Npb25fX0dyb3VwXzJfMF8wX18wICkKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WFN3aXRjaEV4cHJlc3Npb25BY2Nlc3MoKS5nZXRHcm91cF8yXzBfMCgpKTsgCiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNTUyMToyOiAoIHJ1bGVfX1hTd2l0Y2hFeHByZXNzaW9uX19Hcm91cF8yXzBfMF9fMCApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNTUyMTozOiBydWxlX19YU3dpdGNoRXhwcmVzc2lvbl9fR3JvdXBfMl8wXzBfXzAKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE2ODU5OjI6ICggcnVsZV9fWFN3aXRjaEV4cHJlc3Npb25fX0dyb3VwXzJfMF8wX18wICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE2ODU5OjM6IHJ1bGVfX1hTd2l0Y2hFeHByZXNzaW9uX19Hcm91cF8yXzBfMF9fMAogICAgICAgICAgICAgewogICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMik7CiAgICAgICAgICAgICBydWxlX19YU3dpdGNoRXhwcmVzc2lvbl9fR3JvdXBfMl8wXzBfXzAoKTsKQEAgLTUxNTc1LDE2ICs1NjAzMiwxNiBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX1hTd2l0Y2hFeHByZXNzaW9uX19Hcm91cF8yXzBfXzEiCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTU1Mjk6MTogcnVsZV9fWFN3aXRjaEV4cHJlc3Npb25fX0dyb3VwXzJfMF9fMSA6IHJ1bGVfX1hTd2l0Y2hFeHByZXNzaW9uX19Hcm91cF8yXzBfXzFfX0ltcGwgcnVsZV9fWFN3aXRjaEV4cHJlc3Npb25fX0dyb3VwXzJfMF9fMiA7CisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTY4Njc6MTogcnVsZV9fWFN3aXRjaEV4cHJlc3Npb25fX0dyb3VwXzJfMF9fMSA6IHJ1bGVfX1hTd2l0Y2hFeHByZXNzaW9uX19Hcm91cF8yXzBfXzFfX0ltcGwgcnVsZV9fWFN3aXRjaEV4cHJlc3Npb25fX0dyb3VwXzJfMF9fMiA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fWFN3aXRjaEV4cHJlc3Npb25fX0dyb3VwXzJfMF9fMSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNTUzMzoxOiAoIHJ1bGVfX1hTd2l0Y2hFeHByZXNzaW9uX19Hcm91cF8yXzBfXzFfX0ltcGwgcnVsZV9fWFN3aXRjaEV4cHJlc3Npb25fX0dyb3VwXzJfMF9fMiApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNTUzNDoyOiBydWxlX19YU3dpdGNoRXhwcmVzc2lvbl9fR3JvdXBfMl8wX18xX19JbXBsIHJ1bGVfX1hTd2l0Y2hFeHByZXNzaW9uX19Hcm91cF8yXzBfXzIKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE2ODcxOjE6ICggcnVsZV9fWFN3aXRjaEV4cHJlc3Npb25fX0dyb3VwXzJfMF9fMV9fSW1wbCBydWxlX19YU3dpdGNoRXhwcmVzc2lvbl9fR3JvdXBfMl8wX18yICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE2ODcyOjI6IHJ1bGVfX1hTd2l0Y2hFeHByZXNzaW9uX19Hcm91cF8yXzBfXzFfX0ltcGwgcnVsZV9fWFN3aXRjaEV4cHJlc3Npb25fX0dyb3VwXzJfMF9fMgogICAgICAgICAgICAgewotICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMTE4KTsKKyAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzEyNik7CiAgICAgICAgICAgICBydWxlX19YU3dpdGNoRXhwcmVzc2lvbl9fR3JvdXBfMl8wX18xX19JbXBsKCk7CiAKICAgICAgICAgICAgIHN0YXRlLl9mc3AtLTsKQEAgLTUxNjEzLDIzICs1NjA3MCwyMyBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX1hTd2l0Y2hFeHByZXNzaW9uX19Hcm91cF8yXzBfXzFfX0ltcGwiCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTU1NDE6MTogcnVsZV9fWFN3aXRjaEV4cHJlc3Npb25fX0dyb3VwXzJfMF9fMV9fSW1wbCA6ICggKCBydWxlX19YU3dpdGNoRXhwcmVzc2lvbl9fU3dpdGNoQXNzaWdubWVudF8yXzBfMSApICkgOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE2ODc5OjE6IHJ1bGVfX1hTd2l0Y2hFeHByZXNzaW9uX19Hcm91cF8yXzBfXzFfX0ltcGwgOiAoICggcnVsZV9fWFN3aXRjaEV4cHJlc3Npb25fX1N3aXRjaEFzc2lnbm1lbnRfMl8wXzEgKSApIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YU3dpdGNoRXhwcmVzc2lvbl9fR3JvdXBfMl8wX18xX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE1NTQ1OjE6ICggKCAoIHJ1bGVfX1hTd2l0Y2hFeHByZXNzaW9uX19Td2l0Y2hBc3NpZ25tZW50XzJfMF8xICkgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNTU0NjoxOiAoICggcnVsZV9fWFN3aXRjaEV4cHJlc3Npb25fX1N3aXRjaEFzc2lnbm1lbnRfMl8wXzEgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNjg4MzoxOiAoICggKCBydWxlX19YU3dpdGNoRXhwcmVzc2lvbl9fU3dpdGNoQXNzaWdubWVudF8yXzBfMSApICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTY4ODQ6MTogKCAoIHJ1bGVfX1hTd2l0Y2hFeHByZXNzaW9uX19Td2l0Y2hBc3NpZ25tZW50XzJfMF8xICkgKQogICAgICAgICAgICAgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTU1NDY6MTogKCAoIHJ1bGVfX1hTd2l0Y2hFeHByZXNzaW9uX19Td2l0Y2hBc3NpZ25tZW50XzJfMF8xICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTU1NDc6MjogKCBydWxlX19YU3dpdGNoRXhwcmVzc2lvbl9fU3dpdGNoQXNzaWdubWVudF8yXzBfMSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNjg4NDoxOiAoICggcnVsZV9fWFN3aXRjaEV4cHJlc3Npb25fX1N3aXRjaEFzc2lnbm1lbnRfMl8wXzEgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNjg4NToyOiAoIHJ1bGVfX1hTd2l0Y2hFeHByZXNzaW9uX19Td2l0Y2hBc3NpZ25tZW50XzJfMF8xICkKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WFN3aXRjaEV4cHJlc3Npb25BY2Nlc3MoKS5nZXRTd2l0Y2hBc3NpZ25tZW50XzJfMF8xKCkpOyAKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE1NTQ4OjI6ICggcnVsZV9fWFN3aXRjaEV4cHJlc3Npb25fX1N3aXRjaEFzc2lnbm1lbnRfMl8wXzEgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTU1NDg6MzogcnVsZV9fWFN3aXRjaEV4cHJlc3Npb25fX1N3aXRjaEFzc2lnbm1lbnRfMl8wXzEKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE2ODg2OjI6ICggcnVsZV9fWFN3aXRjaEV4cHJlc3Npb25fX1N3aXRjaEFzc2lnbm1lbnRfMl8wXzEgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTY4ODY6MzogcnVsZV9fWFN3aXRjaEV4cHJlc3Npb25fX1N3aXRjaEFzc2lnbm1lbnRfMl8wXzEKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzIpOwogICAgICAgICAgICAgcnVsZV9fWFN3aXRjaEV4cHJlc3Npb25fX1N3aXRjaEFzc2lnbm1lbnRfMl8wXzEoKTsKQEAgLTUxNjY0LDE0ICs1NjEyMSwxNCBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX1hTd2l0Y2hFeHByZXNzaW9uX19Hcm91cF8yXzBfXzIiCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTU1NTY6MTogcnVsZV9fWFN3aXRjaEV4cHJlc3Npb25fX0dyb3VwXzJfMF9fMiA6IHJ1bGVfX1hTd2l0Y2hFeHByZXNzaW9uX19Hcm91cF8yXzBfXzJfX0ltcGwgOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE2ODk0OjE6IHJ1bGVfX1hTd2l0Y2hFeHByZXNzaW9uX19Hcm91cF8yXzBfXzIgOiBydWxlX19YU3dpdGNoRXhwcmVzc2lvbl9fR3JvdXBfMl8wX18yX19JbXBsIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YU3dpdGNoRXhwcmVzc2lvbl9fR3JvdXBfMl8wX18yKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE1NTYwOjE6ICggcnVsZV9fWFN3aXRjaEV4cHJlc3Npb25fX0dyb3VwXzJfMF9fMl9fSW1wbCApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNTU2MToyOiBydWxlX19YU3dpdGNoRXhwcmVzc2lvbl9fR3JvdXBfMl8wX18yX19JbXBsCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNjg5ODoxOiAoIHJ1bGVfX1hTd2l0Y2hFeHByZXNzaW9uX19Hcm91cF8yXzBfXzJfX0ltcGwgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTY4OTk6MjogcnVsZV9fWFN3aXRjaEV4cHJlc3Npb25fX0dyb3VwXzJfMF9fMl9fSW1wbAogICAgICAgICAgICAgewogICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMik7CiAgICAgICAgICAgICBydWxlX19YU3dpdGNoRXhwcmVzc2lvbl9fR3JvdXBfMl8wX18yX19JbXBsKCk7CkBAIC01MTY5NywyMiArNTYxNTQsMjIgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YU3dpdGNoRXhwcmVzc2lvbl9fR3JvdXBfMl8wX18yX19JbXBsIgotICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE1NTY3OjE6IHJ1bGVfX1hTd2l0Y2hFeHByZXNzaW9uX19Hcm91cF8yXzBfXzJfX0ltcGwgOiAoICcpJyApIDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNjkwNToxOiBydWxlX19YU3dpdGNoRXhwcmVzc2lvbl9fR3JvdXBfMl8wX18yX19JbXBsIDogKCAnKScgKSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fWFN3aXRjaEV4cHJlc3Npb25fX0dyb3VwXzJfMF9fMl9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNTU3MToxOiAoICggJyknICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTU1NzI6MTogKCAnKScgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTY5MDk6MTogKCAoICcpJyApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE2OTEwOjE6ICggJyknICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE1NTcyOjE6ICggJyknICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE1NTczOjI6ICcpJworICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTY5MTA6MTogKCAnKScgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTY5MTE6MjogJyknCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhTd2l0Y2hFeHByZXNzaW9uQWNjZXNzKCkuZ2V0UmlnaHRQYXJlbnRoZXNpc0tleXdvcmRfMl8wXzIoKSk7IAogICAgICAgICAgICAgfQotICAgICAgICAgICAgbWF0Y2goaW5wdXQsMTE0LEZPTExPV18yKTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKKyAgICAgICAgICAgIG1hdGNoKGlucHV0LDEyNCxGT0xMT1dfMik7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0WFN3aXRjaEV4cHJlc3Npb25BY2Nlc3MoKS5nZXRSaWdodFBhcmVudGhlc2lzS2V5d29yZF8yXzBfMigpKTsgCiAgICAgICAgICAgICB9CkBAIC01MTczOCwxNCArNTYxOTUsMTQgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YU3dpdGNoRXhwcmVzc2lvbl9fR3JvdXBfMl8wXzBfXzAiCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTU1ODM6MTogcnVsZV9fWFN3aXRjaEV4cHJlc3Npb25fX0dyb3VwXzJfMF8wX18wIDogcnVsZV9fWFN3aXRjaEV4cHJlc3Npb25fX0dyb3VwXzJfMF8wX18wX19JbXBsIDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNjkyMToxOiBydWxlX19YU3dpdGNoRXhwcmVzc2lvbl9fR3JvdXBfMl8wXzBfXzAgOiBydWxlX19YU3dpdGNoRXhwcmVzc2lvbl9fR3JvdXBfMl8wXzBfXzBfX0ltcGwgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1hTd2l0Y2hFeHByZXNzaW9uX19Hcm91cF8yXzBfMF9fMCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNTU4NzoxOiAoIHJ1bGVfX1hTd2l0Y2hFeHByZXNzaW9uX19Hcm91cF8yXzBfMF9fMF9fSW1wbCApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNTU4ODoyOiBydWxlX19YU3dpdGNoRXhwcmVzc2lvbl9fR3JvdXBfMl8wXzBfXzBfX0ltcGwKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE2OTI1OjE6ICggcnVsZV9fWFN3aXRjaEV4cHJlc3Npb25fX0dyb3VwXzJfMF8wX18wX19JbXBsICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE2OTI2OjI6IHJ1bGVfX1hTd2l0Y2hFeHByZXNzaW9uX19Hcm91cF8yXzBfMF9fMF9fSW1wbAogICAgICAgICAgICAgewogICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMik7CiAgICAgICAgICAgICBydWxlX19YU3dpdGNoRXhwcmVzc2lvbl9fR3JvdXBfMl8wXzBfXzBfX0ltcGwoKTsKQEAgLTUxNzcxLDIzICs1NjIyOCwyMyBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX1hTd2l0Y2hFeHByZXNzaW9uX19Hcm91cF8yXzBfMF9fMF9fSW1wbCIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNTU5NDoxOiBydWxlX19YU3dpdGNoRXhwcmVzc2lvbl9fR3JvdXBfMl8wXzBfXzBfX0ltcGwgOiAoICggcnVsZV9fWFN3aXRjaEV4cHJlc3Npb25fX0dyb3VwXzJfMF8wXzBfXzAgKSApIDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNjkzMjoxOiBydWxlX19YU3dpdGNoRXhwcmVzc2lvbl9fR3JvdXBfMl8wXzBfXzBfX0ltcGwgOiAoICggcnVsZV9fWFN3aXRjaEV4cHJlc3Npb25fX0dyb3VwXzJfMF8wXzBfXzAgKSApIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YU3dpdGNoRXhwcmVzc2lvbl9fR3JvdXBfMl8wXzBfXzBfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTU1OTg6MTogKCAoICggcnVsZV9fWFN3aXRjaEV4cHJlc3Npb25fX0dyb3VwXzJfMF8wXzBfXzAgKSApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE1NTk5OjE6ICggKCBydWxlX19YU3dpdGNoRXhwcmVzc2lvbl9fR3JvdXBfMl8wXzBfMF9fMCApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE2OTM2OjE6ICggKCAoIHJ1bGVfX1hTd2l0Y2hFeHByZXNzaW9uX19Hcm91cF8yXzBfMF8wX18wICkgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNjkzNzoxOiAoICggcnVsZV9fWFN3aXRjaEV4cHJlc3Npb25fX0dyb3VwXzJfMF8wXzBfXzAgKSApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNTU5OToxOiAoICggcnVsZV9fWFN3aXRjaEV4cHJlc3Npb25fX0dyb3VwXzJfMF8wXzBfXzAgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNTYwMDoyOiAoIHJ1bGVfX1hTd2l0Y2hFeHByZXNzaW9uX19Hcm91cF8yXzBfMF8wX18wICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE2OTM3OjE6ICggKCBydWxlX19YU3dpdGNoRXhwcmVzc2lvbl9fR3JvdXBfMl8wXzBfMF9fMCApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE2OTM4OjI6ICggcnVsZV9fWFN3aXRjaEV4cHJlc3Npb25fX0dyb3VwXzJfMF8wXzBfXzAgKQogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYU3dpdGNoRXhwcmVzc2lvbkFjY2VzcygpLmdldEdyb3VwXzJfMF8wXzAoKSk7IAogICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTU2MDE6MjogKCBydWxlX19YU3dpdGNoRXhwcmVzc2lvbl9fR3JvdXBfMl8wXzBfMF9fMCApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNTYwMTozOiBydWxlX19YU3dpdGNoRXhwcmVzc2lvbl9fR3JvdXBfMl8wXzBfMF9fMAorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTY5Mzk6MjogKCBydWxlX19YU3dpdGNoRXhwcmVzc2lvbl9fR3JvdXBfMl8wXzBfMF9fMCApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNjkzOTozOiBydWxlX19YU3dpdGNoRXhwcmVzc2lvbl9fR3JvdXBfMl8wXzBfMF9fMAogICAgICAgICAgICAgewogICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMik7CiAgICAgICAgICAgICBydWxlX19YU3dpdGNoRXhwcmVzc2lvbl9fR3JvdXBfMl8wXzBfMF9fMCgpOwpAQCAtNTE4MjIsMTYgKzU2Mjc5LDE2IEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fWFN3aXRjaEV4cHJlc3Npb25fX0dyb3VwXzJfMF8wXzBfXzAiCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTU2MTA6MTogcnVsZV9fWFN3aXRjaEV4cHJlc3Npb25fX0dyb3VwXzJfMF8wXzBfXzAgOiBydWxlX19YU3dpdGNoRXhwcmVzc2lvbl9fR3JvdXBfMl8wXzBfMF9fMF9fSW1wbCBydWxlX19YU3dpdGNoRXhwcmVzc2lvbl9fR3JvdXBfMl8wXzBfMF9fMSA7CisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTY5NDg6MTogcnVsZV9fWFN3aXRjaEV4cHJlc3Npb25fX0dyb3VwXzJfMF8wXzBfXzAgOiBydWxlX19YU3dpdGNoRXhwcmVzc2lvbl9fR3JvdXBfMl8wXzBfMF9fMF9fSW1wbCBydWxlX19YU3dpdGNoRXhwcmVzc2lvbl9fR3JvdXBfMl8wXzBfMF9fMSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fWFN3aXRjaEV4cHJlc3Npb25fX0dyb3VwXzJfMF8wXzBfXzAoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTU2MTQ6MTogKCBydWxlX19YU3dpdGNoRXhwcmVzc2lvbl9fR3JvdXBfMl8wXzBfMF9fMF9fSW1wbCBydWxlX19YU3dpdGNoRXhwcmVzc2lvbl9fR3JvdXBfMl8wXzBfMF9fMSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNTYxNToyOiBydWxlX19YU3dpdGNoRXhwcmVzc2lvbl9fR3JvdXBfMl8wXzBfMF9fMF9fSW1wbCBydWxlX19YU3dpdGNoRXhwcmVzc2lvbl9fR3JvdXBfMl8wXzBfMF9fMQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTY5NTI6MTogKCBydWxlX19YU3dpdGNoRXhwcmVzc2lvbl9fR3JvdXBfMl8wXzBfMF9fMF9fSW1wbCBydWxlX19YU3dpdGNoRXhwcmVzc2lvbl9fR3JvdXBfMl8wXzBfMF9fMSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNjk1MzoyOiBydWxlX19YU3dpdGNoRXhwcmVzc2lvbl9fR3JvdXBfMl8wXzBfMF9fMF9fSW1wbCBydWxlX19YU3dpdGNoRXhwcmVzc2lvbl9fR3JvdXBfMl8wXzBfMF9fMQogICAgICAgICAgICAgewotICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfOTEpOworICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfOTkpOwogICAgICAgICAgICAgcnVsZV9fWFN3aXRjaEV4cHJlc3Npb25fX0dyb3VwXzJfMF8wXzBfXzBfX0ltcGwoKTsKIAogICAgICAgICAgICAgc3RhdGUuX2ZzcC0tOwpAQCAtNTE4NjAsMjIgKzU2MzE3LDIyIEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fWFN3aXRjaEV4cHJlc3Npb25fX0dyb3VwXzJfMF8wXzBfXzBfX0ltcGwiCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTU2MjI6MTogcnVsZV9fWFN3aXRjaEV4cHJlc3Npb25fX0dyb3VwXzJfMF8wXzBfXzBfX0ltcGwgOiAoICcoJyApIDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNjk2MDoxOiBydWxlX19YU3dpdGNoRXhwcmVzc2lvbl9fR3JvdXBfMl8wXzBfMF9fMF9fSW1wbCA6ICggJygnICkgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1hTd2l0Y2hFeHByZXNzaW9uX19Hcm91cF8yXzBfMF8wX18wX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE1NjI2OjE6ICggKCAnKCcgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNTYyNzoxOiAoICcoJyApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNjk2NDoxOiAoICggJygnICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTY5NjU6MTogKCAnKCcgKQogICAgICAgICAgICAgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTU2Mjc6MTogKCAnKCcgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTU2Mjg6MjogJygnCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNjk2NToxOiAoICcoJyApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNjk2NjoyOiAnKCcKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WFN3aXRjaEV4cHJlc3Npb25BY2Nlc3MoKS5nZXRMZWZ0UGFyZW50aGVzaXNLZXl3b3JkXzJfMF8wXzBfMCgpKTsgCiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBtYXRjaChpbnB1dCwxMTMsRk9MTE9XXzIpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOworICAgICAgICAgICAgbWF0Y2goaW5wdXQsMTIzLEZPTExPV18yKTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRYU3dpdGNoRXhwcmVzc2lvbkFjY2VzcygpLmdldExlZnRQYXJlbnRoZXNpc0tleXdvcmRfMl8wXzBfMF8wKCkpOyAKICAgICAgICAgICAgIH0KQEAgLTUxOTAxLDE2ICs1NjM1OCwxNiBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX1hTd2l0Y2hFeHByZXNzaW9uX19Hcm91cF8yXzBfMF8wX18xIgotICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE1NjM3OjE6IHJ1bGVfX1hTd2l0Y2hFeHByZXNzaW9uX19Hcm91cF8yXzBfMF8wX18xIDogcnVsZV9fWFN3aXRjaEV4cHJlc3Npb25fX0dyb3VwXzJfMF8wXzBfXzFfX0ltcGwgcnVsZV9fWFN3aXRjaEV4cHJlc3Npb25fX0dyb3VwXzJfMF8wXzBfXzIgOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE2OTc1OjE6IHJ1bGVfX1hTd2l0Y2hFeHByZXNzaW9uX19Hcm91cF8yXzBfMF8wX18xIDogcnVsZV9fWFN3aXRjaEV4cHJlc3Npb25fX0dyb3VwXzJfMF8wXzBfXzFfX0ltcGwgcnVsZV9fWFN3aXRjaEV4cHJlc3Npb25fX0dyb3VwXzJfMF8wXzBfXzIgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1hTd2l0Y2hFeHByZXNzaW9uX19Hcm91cF8yXzBfMF8wX18xKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE1NjQxOjE6ICggcnVsZV9fWFN3aXRjaEV4cHJlc3Npb25fX0dyb3VwXzJfMF8wXzBfXzFfX0ltcGwgcnVsZV9fWFN3aXRjaEV4cHJlc3Npb25fX0dyb3VwXzJfMF8wXzBfXzIgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTU2NDI6MjogcnVsZV9fWFN3aXRjaEV4cHJlc3Npb25fX0dyb3VwXzJfMF8wXzBfXzFfX0ltcGwgcnVsZV9fWFN3aXRjaEV4cHJlc3Npb25fX0dyb3VwXzJfMF8wXzBfXzIKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE2OTc5OjE6ICggcnVsZV9fWFN3aXRjaEV4cHJlc3Npb25fX0dyb3VwXzJfMF8wXzBfXzFfX0ltcGwgcnVsZV9fWFN3aXRjaEV4cHJlc3Npb25fX0dyb3VwXzJfMF8wXzBfXzIgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTY5ODA6MjogcnVsZV9fWFN3aXRjaEV4cHJlc3Npb25fX0dyb3VwXzJfMF8wXzBfXzFfX0ltcGwgcnVsZV9fWFN3aXRjaEV4cHJlc3Npb25fX0dyb3VwXzJfMF8wXzBfXzIKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzEyNSk7CisgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV18xMzMpOwogICAgICAgICAgICAgcnVsZV9fWFN3aXRjaEV4cHJlc3Npb25fX0dyb3VwXzJfMF8wXzBfXzFfX0ltcGwoKTsKIAogICAgICAgICAgICAgc3RhdGUuX2ZzcC0tOwpAQCAtNTE5MzksMjMgKzU2Mzk2LDIzIEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fWFN3aXRjaEV4cHJlc3Npb25fX0dyb3VwXzJfMF8wXzBfXzFfX0ltcGwiCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTU2NDk6MTogcnVsZV9fWFN3aXRjaEV4cHJlc3Npb25fX0dyb3VwXzJfMF8wXzBfXzFfX0ltcGwgOiAoICggcnVsZV9fWFN3aXRjaEV4cHJlc3Npb25fX0RlY2xhcmVkUGFyYW1Bc3NpZ25tZW50XzJfMF8wXzBfMSApICkgOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE2OTg3OjE6IHJ1bGVfX1hTd2l0Y2hFeHByZXNzaW9uX19Hcm91cF8yXzBfMF8wX18xX19JbXBsIDogKCAoIHJ1bGVfX1hTd2l0Y2hFeHByZXNzaW9uX19EZWNsYXJlZFBhcmFtQXNzaWdubWVudF8yXzBfMF8wXzEgKSApIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YU3dpdGNoRXhwcmVzc2lvbl9fR3JvdXBfMl8wXzBfMF9fMV9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNTY1MzoxOiAoICggKCBydWxlX19YU3dpdGNoRXhwcmVzc2lvbl9fRGVjbGFyZWRQYXJhbUFzc2lnbm1lbnRfMl8wXzBfMF8xICkgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNTY1NDoxOiAoICggcnVsZV9fWFN3aXRjaEV4cHJlc3Npb25fX0RlY2xhcmVkUGFyYW1Bc3NpZ25tZW50XzJfMF8wXzBfMSApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE2OTkxOjE6ICggKCAoIHJ1bGVfX1hTd2l0Y2hFeHByZXNzaW9uX19EZWNsYXJlZFBhcmFtQXNzaWdubWVudF8yXzBfMF8wXzEgKSApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE2OTkyOjE6ICggKCBydWxlX19YU3dpdGNoRXhwcmVzc2lvbl9fRGVjbGFyZWRQYXJhbUFzc2lnbm1lbnRfMl8wXzBfMF8xICkgKQogICAgICAgICAgICAgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTU2NTQ6MTogKCAoIHJ1bGVfX1hTd2l0Y2hFeHByZXNzaW9uX19EZWNsYXJlZFBhcmFtQXNzaWdubWVudF8yXzBfMF8wXzEgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNTY1NToyOiAoIHJ1bGVfX1hTd2l0Y2hFeHByZXNzaW9uX19EZWNsYXJlZFBhcmFtQXNzaWdubWVudF8yXzBfMF8wXzEgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTY5OTI6MTogKCAoIHJ1bGVfX1hTd2l0Y2hFeHByZXNzaW9uX19EZWNsYXJlZFBhcmFtQXNzaWdubWVudF8yXzBfMF8wXzEgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNjk5MzoyOiAoIHJ1bGVfX1hTd2l0Y2hFeHByZXNzaW9uX19EZWNsYXJlZFBhcmFtQXNzaWdubWVudF8yXzBfMF8wXzEgKQogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYU3dpdGNoRXhwcmVzc2lvbkFjY2VzcygpLmdldERlY2xhcmVkUGFyYW1Bc3NpZ25tZW50XzJfMF8wXzBfMSgpKTsgCiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNTY1NjoyOiAoIHJ1bGVfX1hTd2l0Y2hFeHByZXNzaW9uX19EZWNsYXJlZFBhcmFtQXNzaWdubWVudF8yXzBfMF8wXzEgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTU2NTY6MzogcnVsZV9fWFN3aXRjaEV4cHJlc3Npb25fX0RlY2xhcmVkUGFyYW1Bc3NpZ25tZW50XzJfMF8wXzBfMQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTY5OTQ6MjogKCBydWxlX19YU3dpdGNoRXhwcmVzc2lvbl9fRGVjbGFyZWRQYXJhbUFzc2lnbm1lbnRfMl8wXzBfMF8xICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE2OTk0OjM6IHJ1bGVfX1hTd2l0Y2hFeHByZXNzaW9uX19EZWNsYXJlZFBhcmFtQXNzaWdubWVudF8yXzBfMF8wXzEKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzIpOwogICAgICAgICAgICAgcnVsZV9fWFN3aXRjaEV4cHJlc3Npb25fX0RlY2xhcmVkUGFyYW1Bc3NpZ25tZW50XzJfMF8wXzBfMSgpOwpAQCAtNTE5OTAsMTQgKzU2NDQ3LDE0IEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fWFN3aXRjaEV4cHJlc3Npb25fX0dyb3VwXzJfMF8wXzBfXzIiCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTU2NjQ6MTogcnVsZV9fWFN3aXRjaEV4cHJlc3Npb25fX0dyb3VwXzJfMF8wXzBfXzIgOiBydWxlX19YU3dpdGNoRXhwcmVzc2lvbl9fR3JvdXBfMl8wXzBfMF9fMl9fSW1wbCA7CisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTcwMDI6MTogcnVsZV9fWFN3aXRjaEV4cHJlc3Npb25fX0dyb3VwXzJfMF8wXzBfXzIgOiBydWxlX19YU3dpdGNoRXhwcmVzc2lvbl9fR3JvdXBfMl8wXzBfMF9fMl9fSW1wbCA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fWFN3aXRjaEV4cHJlc3Npb25fX0dyb3VwXzJfMF8wXzBfXzIoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTU2Njg6MTogKCBydWxlX19YU3dpdGNoRXhwcmVzc2lvbl9fR3JvdXBfMl8wXzBfMF9fMl9fSW1wbCApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNTY2OToyOiBydWxlX19YU3dpdGNoRXhwcmVzc2lvbl9fR3JvdXBfMl8wXzBfMF9fMl9fSW1wbAorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTcwMDY6MTogKCBydWxlX19YU3dpdGNoRXhwcmVzc2lvbl9fR3JvdXBfMl8wXzBfMF9fMl9fSW1wbCApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNzAwNzoyOiBydWxlX19YU3dpdGNoRXhwcmVzc2lvbl9fR3JvdXBfMl8wXzBfMF9fMl9fSW1wbAogICAgICAgICAgICAgewogICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMik7CiAgICAgICAgICAgICBydWxlX19YU3dpdGNoRXhwcmVzc2lvbl9fR3JvdXBfMl8wXzBfMF9fMl9fSW1wbCgpOwpAQCAtNTIwMjMsMjIgKzU2NDgwLDIyIEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fWFN3aXRjaEV4cHJlc3Npb25fX0dyb3VwXzJfMF8wXzBfXzJfX0ltcGwiCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTU2NzU6MTogcnVsZV9fWFN3aXRjaEV4cHJlc3Npb25fX0dyb3VwXzJfMF8wXzBfXzJfX0ltcGwgOiAoICc6JyApIDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNzAxMzoxOiBydWxlX19YU3dpdGNoRXhwcmVzc2lvbl9fR3JvdXBfMl8wXzBfMF9fMl9fSW1wbCA6ICggJzonICkgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1hTd2l0Y2hFeHByZXNzaW9uX19Hcm91cF8yXzBfMF8wX18yX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE1Njc5OjE6ICggKCAnOicgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNTY4MDoxOiAoICc6JyApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNzAxNzoxOiAoICggJzonICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTcwMTg6MTogKCAnOicgKQogICAgICAgICAgICAgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTU2ODA6MTogKCAnOicgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTU2ODE6MjogJzonCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNzAxODoxOiAoICc6JyApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNzAxOToyOiAnOicKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WFN3aXRjaEV4cHJlc3Npb25BY2Nlc3MoKS5nZXRDb2xvbktleXdvcmRfMl8wXzBfMF8yKCkpOyAKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1hdGNoKGlucHV0LDEyMyxGT0xMT1dfMik7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CisgICAgICAgICAgICBtYXRjaChpbnB1dCwxMzMsRk9MTE9XXzIpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOwogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBhZnRlcihncmFtbWFyQWNjZXNzLmdldFhTd2l0Y2hFeHByZXNzaW9uQWNjZXNzKCkuZ2V0Q29sb25LZXl3b3JkXzJfMF8wXzBfMigpKTsgCiAgICAgICAgICAgICB9CkBAIC01MjA2NCwxNiArNTY1MjEsMTYgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YU3dpdGNoRXhwcmVzc2lvbl9fR3JvdXBfMl8xX18wIgotICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE1NjkxOjE6IHJ1bGVfX1hTd2l0Y2hFeHByZXNzaW9uX19Hcm91cF8yXzFfXzAgOiBydWxlX19YU3dpdGNoRXhwcmVzc2lvbl9fR3JvdXBfMl8xX18wX19JbXBsIHJ1bGVfX1hTd2l0Y2hFeHByZXNzaW9uX19Hcm91cF8yXzFfXzEgOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE3MDI5OjE6IHJ1bGVfX1hTd2l0Y2hFeHByZXNzaW9uX19Hcm91cF8yXzFfXzAgOiBydWxlX19YU3dpdGNoRXhwcmVzc2lvbl9fR3JvdXBfMl8xX18wX19JbXBsIHJ1bGVfX1hTd2l0Y2hFeHByZXNzaW9uX19Hcm91cF8yXzFfXzEgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1hTd2l0Y2hFeHByZXNzaW9uX19Hcm91cF8yXzFfXzAoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTU2OTU6MTogKCBydWxlX19YU3dpdGNoRXhwcmVzc2lvbl9fR3JvdXBfMl8xX18wX19JbXBsIHJ1bGVfX1hTd2l0Y2hFeHByZXNzaW9uX19Hcm91cF8yXzFfXzEgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTU2OTY6MjogcnVsZV9fWFN3aXRjaEV4cHJlc3Npb25fX0dyb3VwXzJfMV9fMF9fSW1wbCBydWxlX19YU3dpdGNoRXhwcmVzc2lvbl9fR3JvdXBfMl8xX18xCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNzAzMzoxOiAoIHJ1bGVfX1hTd2l0Y2hFeHByZXNzaW9uX19Hcm91cF8yXzFfXzBfX0ltcGwgcnVsZV9fWFN3aXRjaEV4cHJlc3Npb25fX0dyb3VwXzJfMV9fMSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNzAzNDoyOiBydWxlX19YU3dpdGNoRXhwcmVzc2lvbl9fR3JvdXBfMl8xX18wX19JbXBsIHJ1bGVfX1hTd2l0Y2hFeHByZXNzaW9uX19Hcm91cF8yXzFfXzEKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzEyMik7CisgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV18xMzApOwogICAgICAgICAgICAgcnVsZV9fWFN3aXRjaEV4cHJlc3Npb25fX0dyb3VwXzJfMV9fMF9fSW1wbCgpOwogCiAgICAgICAgICAgICBzdGF0ZS5fZnNwLS07CkBAIC01MjEwMiwyNyArNTY1NTksMjcgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YU3dpdGNoRXhwcmVzc2lvbl9fR3JvdXBfMl8xX18wX19JbXBsIgotICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE1NzAzOjE6IHJ1bGVfX1hTd2l0Y2hFeHByZXNzaW9uX19Hcm91cF8yXzFfXzBfX0ltcGwgOiAoICggcnVsZV9fWFN3aXRjaEV4cHJlc3Npb25fX0dyb3VwXzJfMV8wX18wICk/ICkgOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE3MDQxOjE6IHJ1bGVfX1hTd2l0Y2hFeHByZXNzaW9uX19Hcm91cF8yXzFfXzBfX0ltcGwgOiAoICggcnVsZV9fWFN3aXRjaEV4cHJlc3Npb25fX0dyb3VwXzJfMV8wX18wICk/ICkgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1hTd2l0Y2hFeHByZXNzaW9uX19Hcm91cF8yXzFfXzBfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTU3MDc6MTogKCAoICggcnVsZV9fWFN3aXRjaEV4cHJlc3Npb25fX0dyb3VwXzJfMV8wX18wICk/ICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTU3MDg6MTogKCAoIHJ1bGVfX1hTd2l0Y2hFeHByZXNzaW9uX19Hcm91cF8yXzFfMF9fMCApPyApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNzA0NToxOiAoICggKCBydWxlX19YU3dpdGNoRXhwcmVzc2lvbl9fR3JvdXBfMl8xXzBfXzAgKT8gKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNzA0NjoxOiAoICggcnVsZV9fWFN3aXRjaEV4cHJlc3Npb25fX0dyb3VwXzJfMV8wX18wICk/ICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE1NzA4OjE6ICggKCBydWxlX19YU3dpdGNoRXhwcmVzc2lvbl9fR3JvdXBfMl8xXzBfXzAgKT8gKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTU3MDk6MjogKCBydWxlX19YU3dpdGNoRXhwcmVzc2lvbl9fR3JvdXBfMl8xXzBfXzAgKT8KKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE3MDQ2OjE6ICggKCBydWxlX19YU3dpdGNoRXhwcmVzc2lvbl9fR3JvdXBfMl8xXzBfXzAgKT8gKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTcwNDc6MjogKCBydWxlX19YU3dpdGNoRXhwcmVzc2lvbl9fR3JvdXBfMl8xXzBfXzAgKT8KICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WFN3aXRjaEV4cHJlc3Npb25BY2Nlc3MoKS5nZXRHcm91cF8yXzFfMCgpKTsgCiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNTcxMDoyOiAoIHJ1bGVfX1hTd2l0Y2hFeHByZXNzaW9uX19Hcm91cF8yXzFfMF9fMCApPwotICAgICAgICAgICAgaW50IGFsdDEyNz0yOwotICAgICAgICAgICAgYWx0MTI3ID0gZGZhMTI3LnByZWRpY3QoaW5wdXQpOwotICAgICAgICAgICAgc3dpdGNoIChhbHQxMjcpIHsKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE3MDQ4OjI6ICggcnVsZV9fWFN3aXRjaEV4cHJlc3Npb25fX0dyb3VwXzJfMV8wX18wICk/CisgICAgICAgICAgICBpbnQgYWx0MTQwPTI7CisgICAgICAgICAgICBhbHQxNDAgPSBkZmExNDAucHJlZGljdChpbnB1dCk7CisgICAgICAgICAgICBzd2l0Y2ggKGFsdDE0MCkgewogICAgICAgICAgICAgICAgIGNhc2UgMSA6Ci0gICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE1NzEwOjM6IHJ1bGVfX1hTd2l0Y2hFeHByZXNzaW9uX19Hcm91cF8yXzFfMF9fMAorICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNzA0ODozOiBydWxlX19YU3dpdGNoRXhwcmVzc2lvbl9fR3JvdXBfMl8xXzBfXzAKICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV18yKTsKICAgICAgICAgICAgICAgICAgICAgcnVsZV9fWFN3aXRjaEV4cHJlc3Npb25fX0dyb3VwXzJfMV8wX18wKCk7CkBAIC01MjE2MCwxNCArNTY2MTcsMTQgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YU3dpdGNoRXhwcmVzc2lvbl9fR3JvdXBfMl8xX18xIgotICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE1NzE4OjE6IHJ1bGVfX1hTd2l0Y2hFeHByZXNzaW9uX19Hcm91cF8yXzFfXzEgOiBydWxlX19YU3dpdGNoRXhwcmVzc2lvbl9fR3JvdXBfMl8xX18xX19JbXBsIDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNzA1NjoxOiBydWxlX19YU3dpdGNoRXhwcmVzc2lvbl9fR3JvdXBfMl8xX18xIDogcnVsZV9fWFN3aXRjaEV4cHJlc3Npb25fX0dyb3VwXzJfMV9fMV9fSW1wbCA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fWFN3aXRjaEV4cHJlc3Npb25fX0dyb3VwXzJfMV9fMSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNTcyMjoxOiAoIHJ1bGVfX1hTd2l0Y2hFeHByZXNzaW9uX19Hcm91cF8yXzFfXzFfX0ltcGwgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTU3MjM6MjogcnVsZV9fWFN3aXRjaEV4cHJlc3Npb25fX0dyb3VwXzJfMV9fMV9fSW1wbAorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTcwNjA6MTogKCBydWxlX19YU3dpdGNoRXhwcmVzc2lvbl9fR3JvdXBfMl8xX18xX19JbXBsICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE3MDYxOjI6IHJ1bGVfX1hTd2l0Y2hFeHByZXNzaW9uX19Hcm91cF8yXzFfXzFfX0ltcGwKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzIpOwogICAgICAgICAgICAgcnVsZV9fWFN3aXRjaEV4cHJlc3Npb25fX0dyb3VwXzJfMV9fMV9fSW1wbCgpOwpAQCAtNTIxOTMsMjMgKzU2NjUwLDIzIEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fWFN3aXRjaEV4cHJlc3Npb25fX0dyb3VwXzJfMV9fMV9fSW1wbCIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNTcyOToxOiBydWxlX19YU3dpdGNoRXhwcmVzc2lvbl9fR3JvdXBfMl8xX18xX19JbXBsIDogKCAoIHJ1bGVfX1hTd2l0Y2hFeHByZXNzaW9uX19Td2l0Y2hBc3NpZ25tZW50XzJfMV8xICkgKSA7CisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTcwNjc6MTogcnVsZV9fWFN3aXRjaEV4cHJlc3Npb25fX0dyb3VwXzJfMV9fMV9fSW1wbCA6ICggKCBydWxlX19YU3dpdGNoRXhwcmVzc2lvbl9fU3dpdGNoQXNzaWdubWVudF8yXzFfMSApICkgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1hTd2l0Y2hFeHByZXNzaW9uX19Hcm91cF8yXzFfXzFfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTU3MzM6MTogKCAoICggcnVsZV9fWFN3aXRjaEV4cHJlc3Npb25fX1N3aXRjaEFzc2lnbm1lbnRfMl8xXzEgKSApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE1NzM0OjE6ICggKCBydWxlX19YU3dpdGNoRXhwcmVzc2lvbl9fU3dpdGNoQXNzaWdubWVudF8yXzFfMSApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE3MDcxOjE6ICggKCAoIHJ1bGVfX1hTd2l0Y2hFeHByZXNzaW9uX19Td2l0Y2hBc3NpZ25tZW50XzJfMV8xICkgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNzA3MjoxOiAoICggcnVsZV9fWFN3aXRjaEV4cHJlc3Npb25fX1N3aXRjaEFzc2lnbm1lbnRfMl8xXzEgKSApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNTczNDoxOiAoICggcnVsZV9fWFN3aXRjaEV4cHJlc3Npb25fX1N3aXRjaEFzc2lnbm1lbnRfMl8xXzEgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNTczNToyOiAoIHJ1bGVfX1hTd2l0Y2hFeHByZXNzaW9uX19Td2l0Y2hBc3NpZ25tZW50XzJfMV8xICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE3MDcyOjE6ICggKCBydWxlX19YU3dpdGNoRXhwcmVzc2lvbl9fU3dpdGNoQXNzaWdubWVudF8yXzFfMSApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE3MDczOjI6ICggcnVsZV9fWFN3aXRjaEV4cHJlc3Npb25fX1N3aXRjaEFzc2lnbm1lbnRfMl8xXzEgKQogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYU3dpdGNoRXhwcmVzc2lvbkFjY2VzcygpLmdldFN3aXRjaEFzc2lnbm1lbnRfMl8xXzEoKSk7IAogICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTU3MzY6MjogKCBydWxlX19YU3dpdGNoRXhwcmVzc2lvbl9fU3dpdGNoQXNzaWdubWVudF8yXzFfMSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNTczNjozOiBydWxlX19YU3dpdGNoRXhwcmVzc2lvbl9fU3dpdGNoQXNzaWdubWVudF8yXzFfMQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTcwNzQ6MjogKCBydWxlX19YU3dpdGNoRXhwcmVzc2lvbl9fU3dpdGNoQXNzaWdubWVudF8yXzFfMSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNzA3NDozOiBydWxlX19YU3dpdGNoRXhwcmVzc2lvbl9fU3dpdGNoQXNzaWdubWVudF8yXzFfMQogICAgICAgICAgICAgewogICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMik7CiAgICAgICAgICAgICBydWxlX19YU3dpdGNoRXhwcmVzc2lvbl9fU3dpdGNoQXNzaWdubWVudF8yXzFfMSgpOwpAQCAtNTIyNDQsMTQgKzU2NzAxLDE0IEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fWFN3aXRjaEV4cHJlc3Npb25fX0dyb3VwXzJfMV8wX18wIgotICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE1NzQ1OjE6IHJ1bGVfX1hTd2l0Y2hFeHByZXNzaW9uX19Hcm91cF8yXzFfMF9fMCA6IHJ1bGVfX1hTd2l0Y2hFeHByZXNzaW9uX19Hcm91cF8yXzFfMF9fMF9fSW1wbCA7CisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTcwODM6MTogcnVsZV9fWFN3aXRjaEV4cHJlc3Npb25fX0dyb3VwXzJfMV8wX18wIDogcnVsZV9fWFN3aXRjaEV4cHJlc3Npb25fX0dyb3VwXzJfMV8wX18wX19JbXBsIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YU3dpdGNoRXhwcmVzc2lvbl9fR3JvdXBfMl8xXzBfXzAoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTU3NDk6MTogKCBydWxlX19YU3dpdGNoRXhwcmVzc2lvbl9fR3JvdXBfMl8xXzBfXzBfX0ltcGwgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTU3NTA6MjogcnVsZV9fWFN3aXRjaEV4cHJlc3Npb25fX0dyb3VwXzJfMV8wX18wX19JbXBsCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNzA4NzoxOiAoIHJ1bGVfX1hTd2l0Y2hFeHByZXNzaW9uX19Hcm91cF8yXzFfMF9fMF9fSW1wbCApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNzA4ODoyOiBydWxlX19YU3dpdGNoRXhwcmVzc2lvbl9fR3JvdXBfMl8xXzBfXzBfX0ltcGwKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzIpOwogICAgICAgICAgICAgcnVsZV9fWFN3aXRjaEV4cHJlc3Npb25fX0dyb3VwXzJfMV8wX18wX19JbXBsKCk7CkBAIC01MjI3NywyMyArNTY3MzQsMjMgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YU3dpdGNoRXhwcmVzc2lvbl9fR3JvdXBfMl8xXzBfXzBfX0ltcGwiCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTU3NTY6MTogcnVsZV9fWFN3aXRjaEV4cHJlc3Npb25fX0dyb3VwXzJfMV8wX18wX19JbXBsIDogKCAoIHJ1bGVfX1hTd2l0Y2hFeHByZXNzaW9uX19Hcm91cF8yXzFfMF8wX18wICkgKSA7CisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTcwOTQ6MTogcnVsZV9fWFN3aXRjaEV4cHJlc3Npb25fX0dyb3VwXzJfMV8wX18wX19JbXBsIDogKCAoIHJ1bGVfX1hTd2l0Y2hFeHByZXNzaW9uX19Hcm91cF8yXzFfMF8wX18wICkgKSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fWFN3aXRjaEV4cHJlc3Npb25fX0dyb3VwXzJfMV8wX18wX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE1NzYwOjE6ICggKCAoIHJ1bGVfX1hTd2l0Y2hFeHByZXNzaW9uX19Hcm91cF8yXzFfMF8wX18wICkgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNTc2MToxOiAoICggcnVsZV9fWFN3aXRjaEV4cHJlc3Npb25fX0dyb3VwXzJfMV8wXzBfXzAgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNzA5ODoxOiAoICggKCBydWxlX19YU3dpdGNoRXhwcmVzc2lvbl9fR3JvdXBfMl8xXzBfMF9fMCApICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTcwOTk6MTogKCAoIHJ1bGVfX1hTd2l0Y2hFeHByZXNzaW9uX19Hcm91cF8yXzFfMF8wX18wICkgKQogICAgICAgICAgICAgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTU3NjE6MTogKCAoIHJ1bGVfX1hTd2l0Y2hFeHByZXNzaW9uX19Hcm91cF8yXzFfMF8wX18wICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTU3NjI6MjogKCBydWxlX19YU3dpdGNoRXhwcmVzc2lvbl9fR3JvdXBfMl8xXzBfMF9fMCApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNzA5OToxOiAoICggcnVsZV9fWFN3aXRjaEV4cHJlc3Npb25fX0dyb3VwXzJfMV8wXzBfXzAgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNzEwMDoyOiAoIHJ1bGVfX1hTd2l0Y2hFeHByZXNzaW9uX19Hcm91cF8yXzFfMF8wX18wICkKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WFN3aXRjaEV4cHJlc3Npb25BY2Nlc3MoKS5nZXRHcm91cF8yXzFfMF8wKCkpOyAKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE1NzYzOjI6ICggcnVsZV9fWFN3aXRjaEV4cHJlc3Npb25fX0dyb3VwXzJfMV8wXzBfXzAgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTU3NjM6MzogcnVsZV9fWFN3aXRjaEV4cHJlc3Npb25fX0dyb3VwXzJfMV8wXzBfXzAKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE3MTAxOjI6ICggcnVsZV9fWFN3aXRjaEV4cHJlc3Npb25fX0dyb3VwXzJfMV8wXzBfXzAgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTcxMDE6MzogcnVsZV9fWFN3aXRjaEV4cHJlc3Npb25fX0dyb3VwXzJfMV8wXzBfXzAKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzIpOwogICAgICAgICAgICAgcnVsZV9fWFN3aXRjaEV4cHJlc3Npb25fX0dyb3VwXzJfMV8wXzBfXzAoKTsKQEAgLTUyMzI4LDE2ICs1Njc4NSwxNiBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX1hTd2l0Y2hFeHByZXNzaW9uX19Hcm91cF8yXzFfMF8wX18wIgotICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE1NzcyOjE6IHJ1bGVfX1hTd2l0Y2hFeHByZXNzaW9uX19Hcm91cF8yXzFfMF8wX18wIDogcnVsZV9fWFN3aXRjaEV4cHJlc3Npb25fX0dyb3VwXzJfMV8wXzBfXzBfX0ltcGwgcnVsZV9fWFN3aXRjaEV4cHJlc3Npb25fX0dyb3VwXzJfMV8wXzBfXzEgOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE3MTEwOjE6IHJ1bGVfX1hTd2l0Y2hFeHByZXNzaW9uX19Hcm91cF8yXzFfMF8wX18wIDogcnVsZV9fWFN3aXRjaEV4cHJlc3Npb25fX0dyb3VwXzJfMV8wXzBfXzBfX0ltcGwgcnVsZV9fWFN3aXRjaEV4cHJlc3Npb25fX0dyb3VwXzJfMV8wXzBfXzEgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1hTd2l0Y2hFeHByZXNzaW9uX19Hcm91cF8yXzFfMF8wX18wKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE1Nzc2OjE6ICggcnVsZV9fWFN3aXRjaEV4cHJlc3Npb25fX0dyb3VwXzJfMV8wXzBfXzBfX0ltcGwgcnVsZV9fWFN3aXRjaEV4cHJlc3Npb25fX0dyb3VwXzJfMV8wXzBfXzEgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTU3Nzc6MjogcnVsZV9fWFN3aXRjaEV4cHJlc3Npb25fX0dyb3VwXzJfMV8wXzBfXzBfX0ltcGwgcnVsZV9fWFN3aXRjaEV4cHJlc3Npb25fX0dyb3VwXzJfMV8wXzBfXzEKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE3MTE0OjE6ICggcnVsZV9fWFN3aXRjaEV4cHJlc3Npb25fX0dyb3VwXzJfMV8wXzBfXzBfX0ltcGwgcnVsZV9fWFN3aXRjaEV4cHJlc3Npb25fX0dyb3VwXzJfMV8wXzBfXzEgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTcxMTU6MjogcnVsZV9fWFN3aXRjaEV4cHJlc3Npb25fX0dyb3VwXzJfMV8wXzBfXzBfX0ltcGwgcnVsZV9fWFN3aXRjaEV4cHJlc3Npb25fX0dyb3VwXzJfMV8wXzBfXzEKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzEyNSk7CisgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV18xMzMpOwogICAgICAgICAgICAgcnVsZV9fWFN3aXRjaEV4cHJlc3Npb25fX0dyb3VwXzJfMV8wXzBfXzBfX0ltcGwoKTsKIAogICAgICAgICAgICAgc3RhdGUuX2ZzcC0tOwpAQCAtNTIzNjYsMjMgKzU2ODIzLDIzIEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fWFN3aXRjaEV4cHJlc3Npb25fX0dyb3VwXzJfMV8wXzBfXzBfX0ltcGwiCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTU3ODQ6MTogcnVsZV9fWFN3aXRjaEV4cHJlc3Npb25fX0dyb3VwXzJfMV8wXzBfXzBfX0ltcGwgOiAoICggcnVsZV9fWFN3aXRjaEV4cHJlc3Npb25fX0RlY2xhcmVkUGFyYW1Bc3NpZ25tZW50XzJfMV8wXzBfMCApICkgOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE3MTIyOjE6IHJ1bGVfX1hTd2l0Y2hFeHByZXNzaW9uX19Hcm91cF8yXzFfMF8wX18wX19JbXBsIDogKCAoIHJ1bGVfX1hTd2l0Y2hFeHByZXNzaW9uX19EZWNsYXJlZFBhcmFtQXNzaWdubWVudF8yXzFfMF8wXzAgKSApIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YU3dpdGNoRXhwcmVzc2lvbl9fR3JvdXBfMl8xXzBfMF9fMF9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNTc4ODoxOiAoICggKCBydWxlX19YU3dpdGNoRXhwcmVzc2lvbl9fRGVjbGFyZWRQYXJhbUFzc2lnbm1lbnRfMl8xXzBfMF8wICkgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNTc4OToxOiAoICggcnVsZV9fWFN3aXRjaEV4cHJlc3Npb25fX0RlY2xhcmVkUGFyYW1Bc3NpZ25tZW50XzJfMV8wXzBfMCApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE3MTI2OjE6ICggKCAoIHJ1bGVfX1hTd2l0Y2hFeHByZXNzaW9uX19EZWNsYXJlZFBhcmFtQXNzaWdubWVudF8yXzFfMF8wXzAgKSApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE3MTI3OjE6ICggKCBydWxlX19YU3dpdGNoRXhwcmVzc2lvbl9fRGVjbGFyZWRQYXJhbUFzc2lnbm1lbnRfMl8xXzBfMF8wICkgKQogICAgICAgICAgICAgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTU3ODk6MTogKCAoIHJ1bGVfX1hTd2l0Y2hFeHByZXNzaW9uX19EZWNsYXJlZFBhcmFtQXNzaWdubWVudF8yXzFfMF8wXzAgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNTc5MDoyOiAoIHJ1bGVfX1hTd2l0Y2hFeHByZXNzaW9uX19EZWNsYXJlZFBhcmFtQXNzaWdubWVudF8yXzFfMF8wXzAgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTcxMjc6MTogKCAoIHJ1bGVfX1hTd2l0Y2hFeHByZXNzaW9uX19EZWNsYXJlZFBhcmFtQXNzaWdubWVudF8yXzFfMF8wXzAgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNzEyODoyOiAoIHJ1bGVfX1hTd2l0Y2hFeHByZXNzaW9uX19EZWNsYXJlZFBhcmFtQXNzaWdubWVudF8yXzFfMF8wXzAgKQogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYU3dpdGNoRXhwcmVzc2lvbkFjY2VzcygpLmdldERlY2xhcmVkUGFyYW1Bc3NpZ25tZW50XzJfMV8wXzBfMCgpKTsgCiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNTc5MToyOiAoIHJ1bGVfX1hTd2l0Y2hFeHByZXNzaW9uX19EZWNsYXJlZFBhcmFtQXNzaWdubWVudF8yXzFfMF8wXzAgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTU3OTE6MzogcnVsZV9fWFN3aXRjaEV4cHJlc3Npb25fX0RlY2xhcmVkUGFyYW1Bc3NpZ25tZW50XzJfMV8wXzBfMAorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTcxMjk6MjogKCBydWxlX19YU3dpdGNoRXhwcmVzc2lvbl9fRGVjbGFyZWRQYXJhbUFzc2lnbm1lbnRfMl8xXzBfMF8wICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE3MTI5OjM6IHJ1bGVfX1hTd2l0Y2hFeHByZXNzaW9uX19EZWNsYXJlZFBhcmFtQXNzaWdubWVudF8yXzFfMF8wXzAKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzIpOwogICAgICAgICAgICAgcnVsZV9fWFN3aXRjaEV4cHJlc3Npb25fX0RlY2xhcmVkUGFyYW1Bc3NpZ25tZW50XzJfMV8wXzBfMCgpOwpAQCAtNTI0MTcsMTQgKzU2ODc0LDE0IEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fWFN3aXRjaEV4cHJlc3Npb25fX0dyb3VwXzJfMV8wXzBfXzEiCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTU3OTk6MTogcnVsZV9fWFN3aXRjaEV4cHJlc3Npb25fX0dyb3VwXzJfMV8wXzBfXzEgOiBydWxlX19YU3dpdGNoRXhwcmVzc2lvbl9fR3JvdXBfMl8xXzBfMF9fMV9fSW1wbCA7CisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTcxMzc6MTogcnVsZV9fWFN3aXRjaEV4cHJlc3Npb25fX0dyb3VwXzJfMV8wXzBfXzEgOiBydWxlX19YU3dpdGNoRXhwcmVzc2lvbl9fR3JvdXBfMl8xXzBfMF9fMV9fSW1wbCA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fWFN3aXRjaEV4cHJlc3Npb25fX0dyb3VwXzJfMV8wXzBfXzEoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTU4MDM6MTogKCBydWxlX19YU3dpdGNoRXhwcmVzc2lvbl9fR3JvdXBfMl8xXzBfMF9fMV9fSW1wbCApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNTgwNDoyOiBydWxlX19YU3dpdGNoRXhwcmVzc2lvbl9fR3JvdXBfMl8xXzBfMF9fMV9fSW1wbAorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTcxNDE6MTogKCBydWxlX19YU3dpdGNoRXhwcmVzc2lvbl9fR3JvdXBfMl8xXzBfMF9fMV9fSW1wbCApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNzE0MjoyOiBydWxlX19YU3dpdGNoRXhwcmVzc2lvbl9fR3JvdXBfMl8xXzBfMF9fMV9fSW1wbAogICAgICAgICAgICAgewogICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMik7CiAgICAgICAgICAgICBydWxlX19YU3dpdGNoRXhwcmVzc2lvbl9fR3JvdXBfMl8xXzBfMF9fMV9fSW1wbCgpOwpAQCAtNTI0NTAsMjIgKzU2OTA3LDIyIEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fWFN3aXRjaEV4cHJlc3Npb25fX0dyb3VwXzJfMV8wXzBfXzFfX0ltcGwiCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTU4MTA6MTogcnVsZV9fWFN3aXRjaEV4cHJlc3Npb25fX0dyb3VwXzJfMV8wXzBfXzFfX0ltcGwgOiAoICc6JyApIDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNzE0ODoxOiBydWxlX19YU3dpdGNoRXhwcmVzc2lvbl9fR3JvdXBfMl8xXzBfMF9fMV9fSW1wbCA6ICggJzonICkgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1hTd2l0Y2hFeHByZXNzaW9uX19Hcm91cF8yXzFfMF8wX18xX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE1ODE0OjE6ICggKCAnOicgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNTgxNToxOiAoICc6JyApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNzE1MjoxOiAoICggJzonICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTcxNTM6MTogKCAnOicgKQogICAgICAgICAgICAgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTU4MTU6MTogKCAnOicgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTU4MTY6MjogJzonCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNzE1MzoxOiAoICc6JyApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNzE1NDoyOiAnOicKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WFN3aXRjaEV4cHJlc3Npb25BY2Nlc3MoKS5nZXRDb2xvbktleXdvcmRfMl8xXzBfMF8xKCkpOyAKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1hdGNoKGlucHV0LDEyMyxGT0xMT1dfMik7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CisgICAgICAgICAgICBtYXRjaChpbnB1dCwxMzMsRk9MTE9XXzIpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOwogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBhZnRlcihncmFtbWFyQWNjZXNzLmdldFhTd2l0Y2hFeHByZXNzaW9uQWNjZXNzKCkuZ2V0Q29sb25LZXl3b3JkXzJfMV8wXzBfMSgpKTsgCiAgICAgICAgICAgICB9CkBAIC01MjQ5MSwxNiArNTY5NDgsMTYgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YU3dpdGNoRXhwcmVzc2lvbl9fR3JvdXBfNV9fMCIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNTgyNjoxOiBydWxlX19YU3dpdGNoRXhwcmVzc2lvbl9fR3JvdXBfNV9fMCA6IHJ1bGVfX1hTd2l0Y2hFeHByZXNzaW9uX19Hcm91cF81X18wX19JbXBsIHJ1bGVfX1hTd2l0Y2hFeHByZXNzaW9uX19Hcm91cF81X18xIDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNzE2NDoxOiBydWxlX19YU3dpdGNoRXhwcmVzc2lvbl9fR3JvdXBfNV9fMCA6IHJ1bGVfX1hTd2l0Y2hFeHByZXNzaW9uX19Hcm91cF81X18wX19JbXBsIHJ1bGVfX1hTd2l0Y2hFeHByZXNzaW9uX19Hcm91cF81X18xIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YU3dpdGNoRXhwcmVzc2lvbl9fR3JvdXBfNV9fMCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNTgzMDoxOiAoIHJ1bGVfX1hTd2l0Y2hFeHByZXNzaW9uX19Hcm91cF81X18wX19JbXBsIHJ1bGVfX1hTd2l0Y2hFeHByZXNzaW9uX19Hcm91cF81X18xICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE1ODMxOjI6IHJ1bGVfX1hTd2l0Y2hFeHByZXNzaW9uX19Hcm91cF81X18wX19JbXBsIHJ1bGVfX1hTd2l0Y2hFeHByZXNzaW9uX19Hcm91cF81X18xCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNzE2ODoxOiAoIHJ1bGVfX1hTd2l0Y2hFeHByZXNzaW9uX19Hcm91cF81X18wX19JbXBsIHJ1bGVfX1hTd2l0Y2hFeHByZXNzaW9uX19Hcm91cF81X18xICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE3MTY5OjI6IHJ1bGVfX1hTd2l0Y2hFeHByZXNzaW9uX19Hcm91cF81X18wX19JbXBsIHJ1bGVfX1hTd2l0Y2hFeHByZXNzaW9uX19Hcm91cF81X18xCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV18xMjUpOworICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMTMzKTsKICAgICAgICAgICAgIHJ1bGVfX1hTd2l0Y2hFeHByZXNzaW9uX19Hcm91cF81X18wX19JbXBsKCk7CiAKICAgICAgICAgICAgIHN0YXRlLl9mc3AtLTsKQEAgLTUyNTI5LDIyICs1Njk4NiwyMiBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX1hTd2l0Y2hFeHByZXNzaW9uX19Hcm91cF81X18wX19JbXBsIgotICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE1ODM4OjE6IHJ1bGVfX1hTd2l0Y2hFeHByZXNzaW9uX19Hcm91cF81X18wX19JbXBsIDogKCAnZGVmYXVsdCcgKSA7CisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTcxNzY6MTogcnVsZV9fWFN3aXRjaEV4cHJlc3Npb25fX0dyb3VwXzVfXzBfX0ltcGwgOiAoICdkZWZhdWx0JyApIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YU3dpdGNoRXhwcmVzc2lvbl9fR3JvdXBfNV9fMF9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNTg0MjoxOiAoICggJ2RlZmF1bHQnICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTU4NDM6MTogKCAnZGVmYXVsdCcgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTcxODA6MTogKCAoICdkZWZhdWx0JyApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE3MTgxOjE6ICggJ2RlZmF1bHQnICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE1ODQzOjE6ICggJ2RlZmF1bHQnICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE1ODQ0OjI6ICdkZWZhdWx0JworICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTcxODE6MTogKCAnZGVmYXVsdCcgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTcxODI6MjogJ2RlZmF1bHQnCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhTd2l0Y2hFeHByZXNzaW9uQWNjZXNzKCkuZ2V0RGVmYXVsdEtleXdvcmRfNV8wKCkpOyAKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1hdGNoKGlucHV0LDEyNCxGT0xMT1dfMik7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CisgICAgICAgICAgICBtYXRjaChpbnB1dCwxMzQsRk9MTE9XXzIpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOwogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBhZnRlcihncmFtbWFyQWNjZXNzLmdldFhTd2l0Y2hFeHByZXNzaW9uQWNjZXNzKCkuZ2V0RGVmYXVsdEtleXdvcmRfNV8wKCkpOyAKICAgICAgICAgICAgIH0KQEAgLTUyNTcwLDE2ICs1NzAyNywxNiBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX1hTd2l0Y2hFeHByZXNzaW9uX19Hcm91cF81X18xIgotICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE1ODUzOjE6IHJ1bGVfX1hTd2l0Y2hFeHByZXNzaW9uX19Hcm91cF81X18xIDogcnVsZV9fWFN3aXRjaEV4cHJlc3Npb25fX0dyb3VwXzVfXzFfX0ltcGwgcnVsZV9fWFN3aXRjaEV4cHJlc3Npb25fX0dyb3VwXzVfXzIgOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE3MTkxOjE6IHJ1bGVfX1hTd2l0Y2hFeHByZXNzaW9uX19Hcm91cF81X18xIDogcnVsZV9fWFN3aXRjaEV4cHJlc3Npb25fX0dyb3VwXzVfXzFfX0ltcGwgcnVsZV9fWFN3aXRjaEV4cHJlc3Npb25fX0dyb3VwXzVfXzIgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1hTd2l0Y2hFeHByZXNzaW9uX19Hcm91cF81X18xKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE1ODU3OjE6ICggcnVsZV9fWFN3aXRjaEV4cHJlc3Npb25fX0dyb3VwXzVfXzFfX0ltcGwgcnVsZV9fWFN3aXRjaEV4cHJlc3Npb25fX0dyb3VwXzVfXzIgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTU4NTg6MjogcnVsZV9fWFN3aXRjaEV4cHJlc3Npb25fX0dyb3VwXzVfXzFfX0ltcGwgcnVsZV9fWFN3aXRjaEV4cHJlc3Npb25fX0dyb3VwXzVfXzIKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE3MTk1OjE6ICggcnVsZV9fWFN3aXRjaEV4cHJlc3Npb25fX0dyb3VwXzVfXzFfX0ltcGwgcnVsZV9fWFN3aXRjaEV4cHJlc3Npb25fX0dyb3VwXzVfXzIgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTcxOTY6MjogcnVsZV9fWFN3aXRjaEV4cHJlc3Npb25fX0dyb3VwXzVfXzFfX0ltcGwgcnVsZV9fWFN3aXRjaEV4cHJlc3Npb25fX0dyb3VwXzVfXzIKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzc0KTsKKyAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzgyKTsKICAgICAgICAgICAgIHJ1bGVfX1hTd2l0Y2hFeHByZXNzaW9uX19Hcm91cF81X18xX19JbXBsKCk7CiAKICAgICAgICAgICAgIHN0YXRlLl9mc3AtLTsKQEAgLTUyNjA4LDIyICs1NzA2NSwyMiBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX1hTd2l0Y2hFeHByZXNzaW9uX19Hcm91cF81X18xX19JbXBsIgotICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE1ODY1OjE6IHJ1bGVfX1hTd2l0Y2hFeHByZXNzaW9uX19Hcm91cF81X18xX19JbXBsIDogKCAnOicgKSA7CisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTcyMDM6MTogcnVsZV9fWFN3aXRjaEV4cHJlc3Npb25fX0dyb3VwXzVfXzFfX0ltcGwgOiAoICc6JyApIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YU3dpdGNoRXhwcmVzc2lvbl9fR3JvdXBfNV9fMV9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNTg2OToxOiAoICggJzonICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTU4NzA6MTogKCAnOicgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTcyMDc6MTogKCAoICc6JyApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE3MjA4OjE6ICggJzonICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE1ODcwOjE6ICggJzonICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE1ODcxOjI6ICc6JworICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTcyMDg6MTogKCAnOicgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTcyMDk6MjogJzonCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhTd2l0Y2hFeHByZXNzaW9uQWNjZXNzKCkuZ2V0Q29sb25LZXl3b3JkXzVfMSgpKTsgCiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBtYXRjaChpbnB1dCwxMjMsRk9MTE9XXzIpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOworICAgICAgICAgICAgbWF0Y2goaW5wdXQsMTMzLEZPTExPV18yKTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRYU3dpdGNoRXhwcmVzc2lvbkFjY2VzcygpLmdldENvbG9uS2V5d29yZF81XzEoKSk7IAogICAgICAgICAgICAgfQpAQCAtNTI2NDksMTQgKzU3MTA2LDE0IEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fWFN3aXRjaEV4cHJlc3Npb25fX0dyb3VwXzVfXzIiCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTU4ODA6MTogcnVsZV9fWFN3aXRjaEV4cHJlc3Npb25fX0dyb3VwXzVfXzIgOiBydWxlX19YU3dpdGNoRXhwcmVzc2lvbl9fR3JvdXBfNV9fMl9fSW1wbCA7CisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTcyMTg6MTogcnVsZV9fWFN3aXRjaEV4cHJlc3Npb25fX0dyb3VwXzVfXzIgOiBydWxlX19YU3dpdGNoRXhwcmVzc2lvbl9fR3JvdXBfNV9fMl9fSW1wbCA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fWFN3aXRjaEV4cHJlc3Npb25fX0dyb3VwXzVfXzIoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTU4ODQ6MTogKCBydWxlX19YU3dpdGNoRXhwcmVzc2lvbl9fR3JvdXBfNV9fMl9fSW1wbCApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNTg4NToyOiBydWxlX19YU3dpdGNoRXhwcmVzc2lvbl9fR3JvdXBfNV9fMl9fSW1wbAorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTcyMjI6MTogKCBydWxlX19YU3dpdGNoRXhwcmVzc2lvbl9fR3JvdXBfNV9fMl9fSW1wbCApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNzIyMzoyOiBydWxlX19YU3dpdGNoRXhwcmVzc2lvbl9fR3JvdXBfNV9fMl9fSW1wbAogICAgICAgICAgICAgewogICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMik7CiAgICAgICAgICAgICBydWxlX19YU3dpdGNoRXhwcmVzc2lvbl9fR3JvdXBfNV9fMl9fSW1wbCgpOwpAQCAtNTI2ODIsMjMgKzU3MTM5LDIzIEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fWFN3aXRjaEV4cHJlc3Npb25fX0dyb3VwXzVfXzJfX0ltcGwiCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTU4OTE6MTogcnVsZV9fWFN3aXRjaEV4cHJlc3Npb25fX0dyb3VwXzVfXzJfX0ltcGwgOiAoICggcnVsZV9fWFN3aXRjaEV4cHJlc3Npb25fX0RlZmF1bHRBc3NpZ25tZW50XzVfMiApICkgOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE3MjI5OjE6IHJ1bGVfX1hTd2l0Y2hFeHByZXNzaW9uX19Hcm91cF81X18yX19JbXBsIDogKCAoIHJ1bGVfX1hTd2l0Y2hFeHByZXNzaW9uX19EZWZhdWx0QXNzaWdubWVudF81XzIgKSApIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YU3dpdGNoRXhwcmVzc2lvbl9fR3JvdXBfNV9fMl9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNTg5NToxOiAoICggKCBydWxlX19YU3dpdGNoRXhwcmVzc2lvbl9fRGVmYXVsdEFzc2lnbm1lbnRfNV8yICkgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNTg5NjoxOiAoICggcnVsZV9fWFN3aXRjaEV4cHJlc3Npb25fX0RlZmF1bHRBc3NpZ25tZW50XzVfMiApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE3MjMzOjE6ICggKCAoIHJ1bGVfX1hTd2l0Y2hFeHByZXNzaW9uX19EZWZhdWx0QXNzaWdubWVudF81XzIgKSApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE3MjM0OjE6ICggKCBydWxlX19YU3dpdGNoRXhwcmVzc2lvbl9fRGVmYXVsdEFzc2lnbm1lbnRfNV8yICkgKQogICAgICAgICAgICAgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTU4OTY6MTogKCAoIHJ1bGVfX1hTd2l0Y2hFeHByZXNzaW9uX19EZWZhdWx0QXNzaWdubWVudF81XzIgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNTg5NzoyOiAoIHJ1bGVfX1hTd2l0Y2hFeHByZXNzaW9uX19EZWZhdWx0QXNzaWdubWVudF81XzIgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTcyMzQ6MTogKCAoIHJ1bGVfX1hTd2l0Y2hFeHByZXNzaW9uX19EZWZhdWx0QXNzaWdubWVudF81XzIgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNzIzNToyOiAoIHJ1bGVfX1hTd2l0Y2hFeHByZXNzaW9uX19EZWZhdWx0QXNzaWdubWVudF81XzIgKQogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYU3dpdGNoRXhwcmVzc2lvbkFjY2VzcygpLmdldERlZmF1bHRBc3NpZ25tZW50XzVfMigpKTsgCiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNTg5ODoyOiAoIHJ1bGVfX1hTd2l0Y2hFeHByZXNzaW9uX19EZWZhdWx0QXNzaWdubWVudF81XzIgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTU4OTg6MzogcnVsZV9fWFN3aXRjaEV4cHJlc3Npb25fX0RlZmF1bHRBc3NpZ25tZW50XzVfMgorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTcyMzY6MjogKCBydWxlX19YU3dpdGNoRXhwcmVzc2lvbl9fRGVmYXVsdEFzc2lnbm1lbnRfNV8yICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE3MjM2OjM6IHJ1bGVfX1hTd2l0Y2hFeHByZXNzaW9uX19EZWZhdWx0QXNzaWdubWVudF81XzIKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzIpOwogICAgICAgICAgICAgcnVsZV9fWFN3aXRjaEV4cHJlc3Npb25fX0RlZmF1bHRBc3NpZ25tZW50XzVfMigpOwpAQCAtNTI3MzMsMTYgKzU3MTkwLDE2IEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fWENhc2VQYXJ0X19Hcm91cF9fMCIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNTkwNzoxOiBydWxlX19YQ2FzZVBhcnRfX0dyb3VwX18wIDogcnVsZV9fWENhc2VQYXJ0X19Hcm91cF9fMF9fSW1wbCBydWxlX19YQ2FzZVBhcnRfX0dyb3VwX18xIDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNzI0NToxOiBydWxlX19YQ2FzZVBhcnRfX0dyb3VwX18wIDogcnVsZV9fWENhc2VQYXJ0X19Hcm91cF9fMF9fSW1wbCBydWxlX19YQ2FzZVBhcnRfX0dyb3VwX18xIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YQ2FzZVBhcnRfX0dyb3VwX18wKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE1OTExOjE6ICggcnVsZV9fWENhc2VQYXJ0X19Hcm91cF9fMF9fSW1wbCBydWxlX19YQ2FzZVBhcnRfX0dyb3VwX18xICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE1OTEyOjI6IHJ1bGVfX1hDYXNlUGFydF9fR3JvdXBfXzBfX0ltcGwgcnVsZV9fWENhc2VQYXJ0X19Hcm91cF9fMQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTcyNDk6MTogKCBydWxlX19YQ2FzZVBhcnRfX0dyb3VwX18wX19JbXBsIHJ1bGVfX1hDYXNlUGFydF9fR3JvdXBfXzEgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTcyNTA6MjogcnVsZV9fWENhc2VQYXJ0X19Hcm91cF9fMF9fSW1wbCBydWxlX19YQ2FzZVBhcnRfX0dyb3VwX18xCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV18xMjYpOworICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMTM0KTsKICAgICAgICAgICAgIHJ1bGVfX1hDYXNlUGFydF9fR3JvdXBfXzBfX0ltcGwoKTsKIAogICAgICAgICAgICAgc3RhdGUuX2ZzcC0tOwpAQCAtNTI3NzEsMjMgKzU3MjI4LDIzIEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fWENhc2VQYXJ0X19Hcm91cF9fMF9fSW1wbCIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNTkxOToxOiBydWxlX19YQ2FzZVBhcnRfX0dyb3VwX18wX19JbXBsIDogKCAoKSApIDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNzI1NzoxOiBydWxlX19YQ2FzZVBhcnRfX0dyb3VwX18wX19JbXBsIDogKCAoKSApIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YQ2FzZVBhcnRfX0dyb3VwX18wX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE1OTIzOjE6ICggKCAoKSApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE1OTI0OjE6ICggKCkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTcyNjE6MTogKCAoICgpICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTcyNjI6MTogKCAoKSApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNTkyNDoxOiAoICgpICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE1OTI1OjI6ICgpCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNzI2MjoxOiAoICgpICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE3MjYzOjI6ICgpCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhDYXNlUGFydEFjY2VzcygpLmdldFhDYXNlUGFydEFjdGlvbl8wKCkpOyAKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE1OTI2OjI6ICgpCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNTkyNjozOiAKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE3MjY0OjI6ICgpCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNzI2NDozOiAKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIH0KIApAQCAtNTI4MTIsMTYgKzU3MjY5LDE2IEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fWENhc2VQYXJ0X19Hcm91cF9fMSIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNTkzNDoxOiBydWxlX19YQ2FzZVBhcnRfX0dyb3VwX18xIDogcnVsZV9fWENhc2VQYXJ0X19Hcm91cF9fMV9fSW1wbCBydWxlX19YQ2FzZVBhcnRfX0dyb3VwX18yIDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNzI3MjoxOiBydWxlX19YQ2FzZVBhcnRfX0dyb3VwX18xIDogcnVsZV9fWENhc2VQYXJ0X19Hcm91cF9fMV9fSW1wbCBydWxlX19YQ2FzZVBhcnRfX0dyb3VwX18yIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YQ2FzZVBhcnRfX0dyb3VwX18xKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE1OTM4OjE6ICggcnVsZV9fWENhc2VQYXJ0X19Hcm91cF9fMV9fSW1wbCBydWxlX19YQ2FzZVBhcnRfX0dyb3VwX18yICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE1OTM5OjI6IHJ1bGVfX1hDYXNlUGFydF9fR3JvdXBfXzFfX0ltcGwgcnVsZV9fWENhc2VQYXJ0X19Hcm91cF9fMgorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTcyNzY6MTogKCBydWxlX19YQ2FzZVBhcnRfX0dyb3VwX18xX19JbXBsIHJ1bGVfX1hDYXNlUGFydF9fR3JvdXBfXzIgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTcyNzc6MjogcnVsZV9fWENhc2VQYXJ0X19Hcm91cF9fMV9fSW1wbCBydWxlX19YQ2FzZVBhcnRfX0dyb3VwX18yCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV18xMjYpOworICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMTM0KTsKICAgICAgICAgICAgIHJ1bGVfX1hDYXNlUGFydF9fR3JvdXBfXzFfX0ltcGwoKTsKIAogICAgICAgICAgICAgc3RhdGUuX2ZzcC0tOwpAQCAtNTI4NTAsMzEgKzU3MzA3LDMxIEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fWENhc2VQYXJ0X19Hcm91cF9fMV9fSW1wbCIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNTk0NjoxOiBydWxlX19YQ2FzZVBhcnRfX0dyb3VwX18xX19JbXBsIDogKCAoIHJ1bGVfX1hDYXNlUGFydF9fVHlwZUd1YXJkQXNzaWdubWVudF8xICk/ICkgOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE3Mjg0OjE6IHJ1bGVfX1hDYXNlUGFydF9fR3JvdXBfXzFfX0ltcGwgOiAoICggcnVsZV9fWENhc2VQYXJ0X19UeXBlR3VhcmRBc3NpZ25tZW50XzEgKT8gKSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fWENhc2VQYXJ0X19Hcm91cF9fMV9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNTk1MDoxOiAoICggKCBydWxlX19YQ2FzZVBhcnRfX1R5cGVHdWFyZEFzc2lnbm1lbnRfMSApPyApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE1OTUxOjE6ICggKCBydWxlX19YQ2FzZVBhcnRfX1R5cGVHdWFyZEFzc2lnbm1lbnRfMSApPyApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNzI4ODoxOiAoICggKCBydWxlX19YQ2FzZVBhcnRfX1R5cGVHdWFyZEFzc2lnbm1lbnRfMSApPyApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE3Mjg5OjE6ICggKCBydWxlX19YQ2FzZVBhcnRfX1R5cGVHdWFyZEFzc2lnbm1lbnRfMSApPyApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNTk1MToxOiAoICggcnVsZV9fWENhc2VQYXJ0X19UeXBlR3VhcmRBc3NpZ25tZW50XzEgKT8gKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTU5NTI6MjogKCBydWxlX19YQ2FzZVBhcnRfX1R5cGVHdWFyZEFzc2lnbm1lbnRfMSApPworICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTcyODk6MTogKCAoIHJ1bGVfX1hDYXNlUGFydF9fVHlwZUd1YXJkQXNzaWdubWVudF8xICk/ICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE3MjkwOjI6ICggcnVsZV9fWENhc2VQYXJ0X19UeXBlR3VhcmRBc3NpZ25tZW50XzEgKT8KICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WENhc2VQYXJ0QWNjZXNzKCkuZ2V0VHlwZUd1YXJkQXNzaWdubWVudF8xKCkpOyAKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE1OTUzOjI6ICggcnVsZV9fWENhc2VQYXJ0X19UeXBlR3VhcmRBc3NpZ25tZW50XzEgKT8KLSAgICAgICAgICAgIGludCBhbHQxMjg9MjsKLSAgICAgICAgICAgIGludCBMQTEyOF8wID0gaW5wdXQuTEEoMSk7CisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNzI5MToyOiAoIHJ1bGVfX1hDYXNlUGFydF9fVHlwZUd1YXJkQXNzaWdubWVudF8xICk/CisgICAgICAgICAgICBpbnQgYWx0MTQxPTI7CisgICAgICAgICAgICBpbnQgTEExNDFfMCA9IGlucHV0LkxBKDEpOwogCi0gICAgICAgICAgICBpZiAoIChMQTEyOF8wPT1SVUxFX0lEfHxMQTEyOF8wPT0zMXx8TEExMjhfMD09MTEzKSApIHsKLSAgICAgICAgICAgICAgICBhbHQxMjg9MTsKKyAgICAgICAgICAgIGlmICggKExBMTQxXzA9PVJVTEVfSUR8fExBMTQxXzA9PTMxfHxMQTE0MV8wPT0xMjMpICkgeworICAgICAgICAgICAgICAgIGFsdDE0MT0xOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgc3dpdGNoIChhbHQxMjgpIHsKKyAgICAgICAgICAgIHN3aXRjaCAoYWx0MTQxKSB7CiAgICAgICAgICAgICAgICAgY2FzZSAxIDoKLSAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTU5NTM6MzogcnVsZV9fWENhc2VQYXJ0X19UeXBlR3VhcmRBc3NpZ25tZW50XzEKKyAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTcyOTE6MzogcnVsZV9fWENhc2VQYXJ0X19UeXBlR3VhcmRBc3NpZ25tZW50XzEKICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV18yKTsKICAgICAgICAgICAgICAgICAgICAgcnVsZV9fWENhc2VQYXJ0X19UeXBlR3VhcmRBc3NpZ25tZW50XzEoKTsKQEAgLTUyOTEyLDE2ICs1NzM2OSwxNiBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX1hDYXNlUGFydF9fR3JvdXBfXzIiCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTU5NjE6MTogcnVsZV9fWENhc2VQYXJ0X19Hcm91cF9fMiA6IHJ1bGVfX1hDYXNlUGFydF9fR3JvdXBfXzJfX0ltcGwgcnVsZV9fWENhc2VQYXJ0X19Hcm91cF9fMyA7CisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTcyOTk6MTogcnVsZV9fWENhc2VQYXJ0X19Hcm91cF9fMiA6IHJ1bGVfX1hDYXNlUGFydF9fR3JvdXBfXzJfX0ltcGwgcnVsZV9fWENhc2VQYXJ0X19Hcm91cF9fMyA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fWENhc2VQYXJ0X19Hcm91cF9fMigpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNTk2NToxOiAoIHJ1bGVfX1hDYXNlUGFydF9fR3JvdXBfXzJfX0ltcGwgcnVsZV9fWENhc2VQYXJ0X19Hcm91cF9fMyApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNTk2NjoyOiBydWxlX19YQ2FzZVBhcnRfX0dyb3VwX18yX19JbXBsIHJ1bGVfX1hDYXNlUGFydF9fR3JvdXBfXzMKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE3MzAzOjE6ICggcnVsZV9fWENhc2VQYXJ0X19Hcm91cF9fMl9fSW1wbCBydWxlX19YQ2FzZVBhcnRfX0dyb3VwX18zICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE3MzA0OjI6IHJ1bGVfX1hDYXNlUGFydF9fR3JvdXBfXzJfX0ltcGwgcnVsZV9fWENhc2VQYXJ0X19Hcm91cF9fMwogICAgICAgICAgICAgewotICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMTI2KTsKKyAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzEzNCk7CiAgICAgICAgICAgICBydWxlX19YQ2FzZVBhcnRfX0dyb3VwX18yX19JbXBsKCk7CiAKICAgICAgICAgICAgIHN0YXRlLl9mc3AtLTsKQEAgLTUyOTUwLDMxICs1NzQwNywzMSBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX1hDYXNlUGFydF9fR3JvdXBfXzJfX0ltcGwiCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTU5NzM6MTogcnVsZV9fWENhc2VQYXJ0X19Hcm91cF9fMl9fSW1wbCA6ICggKCBydWxlX19YQ2FzZVBhcnRfX0dyb3VwXzJfXzAgKT8gKSA7CisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTczMTE6MTogcnVsZV9fWENhc2VQYXJ0X19Hcm91cF9fMl9fSW1wbCA6ICggKCBydWxlX19YQ2FzZVBhcnRfX0dyb3VwXzJfXzAgKT8gKSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fWENhc2VQYXJ0X19Hcm91cF9fMl9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNTk3NzoxOiAoICggKCBydWxlX19YQ2FzZVBhcnRfX0dyb3VwXzJfXzAgKT8gKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNTk3ODoxOiAoICggcnVsZV9fWENhc2VQYXJ0X19Hcm91cF8yX18wICk/ICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE3MzE1OjE6ICggKCAoIHJ1bGVfX1hDYXNlUGFydF9fR3JvdXBfMl9fMCApPyApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE3MzE2OjE6ICggKCBydWxlX19YQ2FzZVBhcnRfX0dyb3VwXzJfXzAgKT8gKQogICAgICAgICAgICAgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTU5Nzg6MTogKCAoIHJ1bGVfX1hDYXNlUGFydF9fR3JvdXBfMl9fMCApPyApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNTk3OToyOiAoIHJ1bGVfX1hDYXNlUGFydF9fR3JvdXBfMl9fMCApPworICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTczMTY6MTogKCAoIHJ1bGVfX1hDYXNlUGFydF9fR3JvdXBfMl9fMCApPyApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNzMxNzoyOiAoIHJ1bGVfX1hDYXNlUGFydF9fR3JvdXBfMl9fMCApPwogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYQ2FzZVBhcnRBY2Nlc3MoKS5nZXRHcm91cF8yKCkpOyAKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE1OTgwOjI6ICggcnVsZV9fWENhc2VQYXJ0X19Hcm91cF8yX18wICk/Ci0gICAgICAgICAgICBpbnQgYWx0MTI5PTI7Ci0gICAgICAgICAgICBpbnQgTEExMjlfMCA9IGlucHV0LkxBKDEpOworICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTczMTg6MjogKCBydWxlX19YQ2FzZVBhcnRfX0dyb3VwXzJfXzAgKT8KKyAgICAgICAgICAgIGludCBhbHQxNDI9MjsKKyAgICAgICAgICAgIGludCBMQTE0Ml8wID0gaW5wdXQuTEEoMSk7CiAKLSAgICAgICAgICAgIGlmICggKExBMTI5XzA9PTEyNSkgKSB7Ci0gICAgICAgICAgICAgICAgYWx0MTI5PTE7CisgICAgICAgICAgICBpZiAoIChMQTE0Ml8wPT0xMzUpICkgeworICAgICAgICAgICAgICAgIGFsdDE0Mj0xOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgc3dpdGNoIChhbHQxMjkpIHsKKyAgICAgICAgICAgIHN3aXRjaCAoYWx0MTQyKSB7CiAgICAgICAgICAgICAgICAgY2FzZSAxIDoKLSAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTU5ODA6MzogcnVsZV9fWENhc2VQYXJ0X19Hcm91cF8yX18wCisgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE3MzE4OjM6IHJ1bGVfX1hDYXNlUGFydF9fR3JvdXBfMl9fMAogICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzIpOwogICAgICAgICAgICAgICAgICAgICBydWxlX19YQ2FzZVBhcnRfX0dyb3VwXzJfXzAoKTsKQEAgLTUzMDEyLDE0ICs1NzQ2OSwxNCBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX1hDYXNlUGFydF9fR3JvdXBfXzMiCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTU5ODg6MTogcnVsZV9fWENhc2VQYXJ0X19Hcm91cF9fMyA6IHJ1bGVfX1hDYXNlUGFydF9fR3JvdXBfXzNfX0ltcGwgOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE3MzI2OjE6IHJ1bGVfX1hDYXNlUGFydF9fR3JvdXBfXzMgOiBydWxlX19YQ2FzZVBhcnRfX0dyb3VwX18zX19JbXBsIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YQ2FzZVBhcnRfX0dyb3VwX18zKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE1OTkyOjE6ICggcnVsZV9fWENhc2VQYXJ0X19Hcm91cF9fM19fSW1wbCApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNTk5MzoyOiBydWxlX19YQ2FzZVBhcnRfX0dyb3VwX18zX19JbXBsCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNzMzMDoxOiAoIHJ1bGVfX1hDYXNlUGFydF9fR3JvdXBfXzNfX0ltcGwgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTczMzE6MjogcnVsZV9fWENhc2VQYXJ0X19Hcm91cF9fM19fSW1wbAogICAgICAgICAgICAgewogICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMik7CiAgICAgICAgICAgICBydWxlX19YQ2FzZVBhcnRfX0dyb3VwX18zX19JbXBsKCk7CkBAIC01MzA0NSwyMyArNTc1MDIsMjMgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YQ2FzZVBhcnRfX0dyb3VwX18zX19JbXBsIgotICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE1OTk5OjE6IHJ1bGVfX1hDYXNlUGFydF9fR3JvdXBfXzNfX0ltcGwgOiAoICggcnVsZV9fWENhc2VQYXJ0X19BbHRlcm5hdGl2ZXNfMyApICkgOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE3MzM3OjE6IHJ1bGVfX1hDYXNlUGFydF9fR3JvdXBfXzNfX0ltcGwgOiAoICggcnVsZV9fWENhc2VQYXJ0X19BbHRlcm5hdGl2ZXNfMyApICkgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1hDYXNlUGFydF9fR3JvdXBfXzNfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTYwMDM6MTogKCAoICggcnVsZV9fWENhc2VQYXJ0X19BbHRlcm5hdGl2ZXNfMyApICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTYwMDQ6MTogKCAoIHJ1bGVfX1hDYXNlUGFydF9fQWx0ZXJuYXRpdmVzXzMgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNzM0MToxOiAoICggKCBydWxlX19YQ2FzZVBhcnRfX0FsdGVybmF0aXZlc18zICkgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNzM0MjoxOiAoICggcnVsZV9fWENhc2VQYXJ0X19BbHRlcm5hdGl2ZXNfMyApICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE2MDA0OjE6ICggKCBydWxlX19YQ2FzZVBhcnRfX0FsdGVybmF0aXZlc18zICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTYwMDU6MjogKCBydWxlX19YQ2FzZVBhcnRfX0FsdGVybmF0aXZlc18zICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE3MzQyOjE6ICggKCBydWxlX19YQ2FzZVBhcnRfX0FsdGVybmF0aXZlc18zICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTczNDM6MjogKCBydWxlX19YQ2FzZVBhcnRfX0FsdGVybmF0aXZlc18zICkKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WENhc2VQYXJ0QWNjZXNzKCkuZ2V0QWx0ZXJuYXRpdmVzXzMoKSk7IAogICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTYwMDY6MjogKCBydWxlX19YQ2FzZVBhcnRfX0FsdGVybmF0aXZlc18zICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE2MDA2OjM6IHJ1bGVfX1hDYXNlUGFydF9fQWx0ZXJuYXRpdmVzXzMKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE3MzQ0OjI6ICggcnVsZV9fWENhc2VQYXJ0X19BbHRlcm5hdGl2ZXNfMyApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNzM0NDozOiBydWxlX19YQ2FzZVBhcnRfX0FsdGVybmF0aXZlc18zCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV18yKTsKICAgICAgICAgICAgIHJ1bGVfX1hDYXNlUGFydF9fQWx0ZXJuYXRpdmVzXzMoKTsKQEAgLTUzMDk2LDE2ICs1NzU1MywxNiBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX1hDYXNlUGFydF9fR3JvdXBfMl9fMCIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNjAxNToxOiBydWxlX19YQ2FzZVBhcnRfX0dyb3VwXzJfXzAgOiBydWxlX19YQ2FzZVBhcnRfX0dyb3VwXzJfXzBfX0ltcGwgcnVsZV9fWENhc2VQYXJ0X19Hcm91cF8yX18xIDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNzM1MzoxOiBydWxlX19YQ2FzZVBhcnRfX0dyb3VwXzJfXzAgOiBydWxlX19YQ2FzZVBhcnRfX0dyb3VwXzJfXzBfX0ltcGwgcnVsZV9fWENhc2VQYXJ0X19Hcm91cF8yX18xIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YQ2FzZVBhcnRfX0dyb3VwXzJfXzAoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTYwMTk6MTogKCBydWxlX19YQ2FzZVBhcnRfX0dyb3VwXzJfXzBfX0ltcGwgcnVsZV9fWENhc2VQYXJ0X19Hcm91cF8yX18xICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE2MDIwOjI6IHJ1bGVfX1hDYXNlUGFydF9fR3JvdXBfMl9fMF9fSW1wbCBydWxlX19YQ2FzZVBhcnRfX0dyb3VwXzJfXzEKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE3MzU3OjE6ICggcnVsZV9fWENhc2VQYXJ0X19Hcm91cF8yX18wX19JbXBsIHJ1bGVfX1hDYXNlUGFydF9fR3JvdXBfMl9fMSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNzM1ODoyOiBydWxlX19YQ2FzZVBhcnRfX0dyb3VwXzJfXzBfX0ltcGwgcnVsZV9fWENhc2VQYXJ0X19Hcm91cF8yX18xCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV183NCk7CisgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV184Mik7CiAgICAgICAgICAgICBydWxlX19YQ2FzZVBhcnRfX0dyb3VwXzJfXzBfX0ltcGwoKTsKIAogICAgICAgICAgICAgc3RhdGUuX2ZzcC0tOwpAQCAtNTMxMzQsMjIgKzU3NTkxLDIyIEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fWENhc2VQYXJ0X19Hcm91cF8yX18wX19JbXBsIgotICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE2MDI3OjE6IHJ1bGVfX1hDYXNlUGFydF9fR3JvdXBfMl9fMF9fSW1wbCA6ICggJ2Nhc2UnICkgOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE3MzY1OjE6IHJ1bGVfX1hDYXNlUGFydF9fR3JvdXBfMl9fMF9fSW1wbCA6ICggJ2Nhc2UnICkgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1hDYXNlUGFydF9fR3JvdXBfMl9fMF9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNjAzMToxOiAoICggJ2Nhc2UnICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTYwMzI6MTogKCAnY2FzZScgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTczNjk6MTogKCAoICdjYXNlJyApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE3MzcwOjE6ICggJ2Nhc2UnICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE2MDMyOjE6ICggJ2Nhc2UnICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE2MDMzOjI6ICdjYXNlJworICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTczNzA6MTogKCAnY2FzZScgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTczNzE6MjogJ2Nhc2UnCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhDYXNlUGFydEFjY2VzcygpLmdldENhc2VLZXl3b3JkXzJfMCgpKTsgCiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBtYXRjaChpbnB1dCwxMjUsRk9MTE9XXzIpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOworICAgICAgICAgICAgbWF0Y2goaW5wdXQsMTM1LEZPTExPV18yKTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRYQ2FzZVBhcnRBY2Nlc3MoKS5nZXRDYXNlS2V5d29yZF8yXzAoKSk7IAogICAgICAgICAgICAgfQpAQCAtNTMxNzUsMTQgKzU3NjMyLDE0IEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fWENhc2VQYXJ0X19Hcm91cF8yX18xIgotICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE2MDQyOjE6IHJ1bGVfX1hDYXNlUGFydF9fR3JvdXBfMl9fMSA6IHJ1bGVfX1hDYXNlUGFydF9fR3JvdXBfMl9fMV9fSW1wbCA7CisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTczODA6MTogcnVsZV9fWENhc2VQYXJ0X19Hcm91cF8yX18xIDogcnVsZV9fWENhc2VQYXJ0X19Hcm91cF8yX18xX19JbXBsIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YQ2FzZVBhcnRfX0dyb3VwXzJfXzEoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTYwNDY6MTogKCBydWxlX19YQ2FzZVBhcnRfX0dyb3VwXzJfXzFfX0ltcGwgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTYwNDc6MjogcnVsZV9fWENhc2VQYXJ0X19Hcm91cF8yX18xX19JbXBsCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNzM4NDoxOiAoIHJ1bGVfX1hDYXNlUGFydF9fR3JvdXBfMl9fMV9fSW1wbCApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNzM4NToyOiBydWxlX19YQ2FzZVBhcnRfX0dyb3VwXzJfXzFfX0ltcGwKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzIpOwogICAgICAgICAgICAgcnVsZV9fWENhc2VQYXJ0X19Hcm91cF8yX18xX19JbXBsKCk7CkBAIC01MzIwOCwyMyArNTc2NjUsMjMgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YQ2FzZVBhcnRfX0dyb3VwXzJfXzFfX0ltcGwiCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTYwNTM6MTogcnVsZV9fWENhc2VQYXJ0X19Hcm91cF8yX18xX19JbXBsIDogKCAoIHJ1bGVfX1hDYXNlUGFydF9fQ2FzZUFzc2lnbm1lbnRfMl8xICkgKSA7CisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTczOTE6MTogcnVsZV9fWENhc2VQYXJ0X19Hcm91cF8yX18xX19JbXBsIDogKCAoIHJ1bGVfX1hDYXNlUGFydF9fQ2FzZUFzc2lnbm1lbnRfMl8xICkgKSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fWENhc2VQYXJ0X19Hcm91cF8yX18xX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE2MDU3OjE6ICggKCAoIHJ1bGVfX1hDYXNlUGFydF9fQ2FzZUFzc2lnbm1lbnRfMl8xICkgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNjA1ODoxOiAoICggcnVsZV9fWENhc2VQYXJ0X19DYXNlQXNzaWdubWVudF8yXzEgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNzM5NToxOiAoICggKCBydWxlX19YQ2FzZVBhcnRfX0Nhc2VBc3NpZ25tZW50XzJfMSApICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTczOTY6MTogKCAoIHJ1bGVfX1hDYXNlUGFydF9fQ2FzZUFzc2lnbm1lbnRfMl8xICkgKQogICAgICAgICAgICAgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTYwNTg6MTogKCAoIHJ1bGVfX1hDYXNlUGFydF9fQ2FzZUFzc2lnbm1lbnRfMl8xICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTYwNTk6MjogKCBydWxlX19YQ2FzZVBhcnRfX0Nhc2VBc3NpZ25tZW50XzJfMSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNzM5NjoxOiAoICggcnVsZV9fWENhc2VQYXJ0X19DYXNlQXNzaWdubWVudF8yXzEgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNzM5NzoyOiAoIHJ1bGVfX1hDYXNlUGFydF9fQ2FzZUFzc2lnbm1lbnRfMl8xICkKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WENhc2VQYXJ0QWNjZXNzKCkuZ2V0Q2FzZUFzc2lnbm1lbnRfMl8xKCkpOyAKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE2MDYwOjI6ICggcnVsZV9fWENhc2VQYXJ0X19DYXNlQXNzaWdubWVudF8yXzEgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTYwNjA6MzogcnVsZV9fWENhc2VQYXJ0X19DYXNlQXNzaWdubWVudF8yXzEKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE3Mzk4OjI6ICggcnVsZV9fWENhc2VQYXJ0X19DYXNlQXNzaWdubWVudF8yXzEgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTczOTg6MzogcnVsZV9fWENhc2VQYXJ0X19DYXNlQXNzaWdubWVudF8yXzEKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzIpOwogICAgICAgICAgICAgcnVsZV9fWENhc2VQYXJ0X19DYXNlQXNzaWdubWVudF8yXzEoKTsKQEAgLTUzMjU5LDE2ICs1NzcxNiwxNiBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX1hDYXNlUGFydF9fR3JvdXBfM18wX18wIgotICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE2MDY5OjE6IHJ1bGVfX1hDYXNlUGFydF9fR3JvdXBfM18wX18wIDogcnVsZV9fWENhc2VQYXJ0X19Hcm91cF8zXzBfXzBfX0ltcGwgcnVsZV9fWENhc2VQYXJ0X19Hcm91cF8zXzBfXzEgOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE3NDA3OjE6IHJ1bGVfX1hDYXNlUGFydF9fR3JvdXBfM18wX18wIDogcnVsZV9fWENhc2VQYXJ0X19Hcm91cF8zXzBfXzBfX0ltcGwgcnVsZV9fWENhc2VQYXJ0X19Hcm91cF8zXzBfXzEgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1hDYXNlUGFydF9fR3JvdXBfM18wX18wKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE2MDczOjE6ICggcnVsZV9fWENhc2VQYXJ0X19Hcm91cF8zXzBfXzBfX0ltcGwgcnVsZV9fWENhc2VQYXJ0X19Hcm91cF8zXzBfXzEgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTYwNzQ6MjogcnVsZV9fWENhc2VQYXJ0X19Hcm91cF8zXzBfXzBfX0ltcGwgcnVsZV9fWENhc2VQYXJ0X19Hcm91cF8zXzBfXzEKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE3NDExOjE6ICggcnVsZV9fWENhc2VQYXJ0X19Hcm91cF8zXzBfXzBfX0ltcGwgcnVsZV9fWENhc2VQYXJ0X19Hcm91cF8zXzBfXzEgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTc0MTI6MjogcnVsZV9fWENhc2VQYXJ0X19Hcm91cF8zXzBfXzBfX0ltcGwgcnVsZV9fWENhc2VQYXJ0X19Hcm91cF8zXzBfXzEKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzc0KTsKKyAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzgyKTsKICAgICAgICAgICAgIHJ1bGVfX1hDYXNlUGFydF9fR3JvdXBfM18wX18wX19JbXBsKCk7CiAKICAgICAgICAgICAgIHN0YXRlLl9mc3AtLTsKQEAgLTUzMjk3LDIyICs1Nzc1NCwyMiBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX1hDYXNlUGFydF9fR3JvdXBfM18wX18wX19JbXBsIgotICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE2MDgxOjE6IHJ1bGVfX1hDYXNlUGFydF9fR3JvdXBfM18wX18wX19JbXBsIDogKCAnOicgKSA7CisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTc0MTk6MTogcnVsZV9fWENhc2VQYXJ0X19Hcm91cF8zXzBfXzBfX0ltcGwgOiAoICc6JyApIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YQ2FzZVBhcnRfX0dyb3VwXzNfMF9fMF9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNjA4NToxOiAoICggJzonICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTYwODY6MTogKCAnOicgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTc0MjM6MTogKCAoICc6JyApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE3NDI0OjE6ICggJzonICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE2MDg2OjE6ICggJzonICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE2MDg3OjI6ICc6JworICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTc0MjQ6MTogKCAnOicgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTc0MjU6MjogJzonCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhDYXNlUGFydEFjY2VzcygpLmdldENvbG9uS2V5d29yZF8zXzBfMCgpKTsgCiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBtYXRjaChpbnB1dCwxMjMsRk9MTE9XXzIpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOworICAgICAgICAgICAgbWF0Y2goaW5wdXQsMTMzLEZPTExPV18yKTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRYQ2FzZVBhcnRBY2Nlc3MoKS5nZXRDb2xvbktleXdvcmRfM18wXzAoKSk7IAogICAgICAgICAgICAgfQpAQCAtNTMzMzgsMTQgKzU3Nzk1LDE0IEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fWENhc2VQYXJ0X19Hcm91cF8zXzBfXzEiCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTYwOTY6MTogcnVsZV9fWENhc2VQYXJ0X19Hcm91cF8zXzBfXzEgOiBydWxlX19YQ2FzZVBhcnRfX0dyb3VwXzNfMF9fMV9fSW1wbCA7CisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTc0MzQ6MTogcnVsZV9fWENhc2VQYXJ0X19Hcm91cF8zXzBfXzEgOiBydWxlX19YQ2FzZVBhcnRfX0dyb3VwXzNfMF9fMV9fSW1wbCA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fWENhc2VQYXJ0X19Hcm91cF8zXzBfXzEoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTYxMDA6MTogKCBydWxlX19YQ2FzZVBhcnRfX0dyb3VwXzNfMF9fMV9fSW1wbCApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNjEwMToyOiBydWxlX19YQ2FzZVBhcnRfX0dyb3VwXzNfMF9fMV9fSW1wbAorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTc0Mzg6MTogKCBydWxlX19YQ2FzZVBhcnRfX0dyb3VwXzNfMF9fMV9fSW1wbCApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNzQzOToyOiBydWxlX19YQ2FzZVBhcnRfX0dyb3VwXzNfMF9fMV9fSW1wbAogICAgICAgICAgICAgewogICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMik7CiAgICAgICAgICAgICBydWxlX19YQ2FzZVBhcnRfX0dyb3VwXzNfMF9fMV9fSW1wbCgpOwpAQCAtNTMzNzEsMjMgKzU3ODI4LDIzIEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fWENhc2VQYXJ0X19Hcm91cF8zXzBfXzFfX0ltcGwiCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTYxMDc6MTogcnVsZV9fWENhc2VQYXJ0X19Hcm91cF8zXzBfXzFfX0ltcGwgOiAoICggcnVsZV9fWENhc2VQYXJ0X19UaGVuQXNzaWdubWVudF8zXzBfMSApICkgOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE3NDQ1OjE6IHJ1bGVfX1hDYXNlUGFydF9fR3JvdXBfM18wX18xX19JbXBsIDogKCAoIHJ1bGVfX1hDYXNlUGFydF9fVGhlbkFzc2lnbm1lbnRfM18wXzEgKSApIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YQ2FzZVBhcnRfX0dyb3VwXzNfMF9fMV9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNjExMToxOiAoICggKCBydWxlX19YQ2FzZVBhcnRfX1RoZW5Bc3NpZ25tZW50XzNfMF8xICkgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNjExMjoxOiAoICggcnVsZV9fWENhc2VQYXJ0X19UaGVuQXNzaWdubWVudF8zXzBfMSApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE3NDQ5OjE6ICggKCAoIHJ1bGVfX1hDYXNlUGFydF9fVGhlbkFzc2lnbm1lbnRfM18wXzEgKSApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE3NDUwOjE6ICggKCBydWxlX19YQ2FzZVBhcnRfX1RoZW5Bc3NpZ25tZW50XzNfMF8xICkgKQogICAgICAgICAgICAgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTYxMTI6MTogKCAoIHJ1bGVfX1hDYXNlUGFydF9fVGhlbkFzc2lnbm1lbnRfM18wXzEgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNjExMzoyOiAoIHJ1bGVfX1hDYXNlUGFydF9fVGhlbkFzc2lnbm1lbnRfM18wXzEgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTc0NTA6MTogKCAoIHJ1bGVfX1hDYXNlUGFydF9fVGhlbkFzc2lnbm1lbnRfM18wXzEgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNzQ1MToyOiAoIHJ1bGVfX1hDYXNlUGFydF9fVGhlbkFzc2lnbm1lbnRfM18wXzEgKQogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYQ2FzZVBhcnRBY2Nlc3MoKS5nZXRUaGVuQXNzaWdubWVudF8zXzBfMSgpKTsgCiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNjExNDoyOiAoIHJ1bGVfX1hDYXNlUGFydF9fVGhlbkFzc2lnbm1lbnRfM18wXzEgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTYxMTQ6MzogcnVsZV9fWENhc2VQYXJ0X19UaGVuQXNzaWdubWVudF8zXzBfMQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTc0NTI6MjogKCBydWxlX19YQ2FzZVBhcnRfX1RoZW5Bc3NpZ25tZW50XzNfMF8xICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE3NDUyOjM6IHJ1bGVfX1hDYXNlUGFydF9fVGhlbkFzc2lnbm1lbnRfM18wXzEKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzIpOwogICAgICAgICAgICAgcnVsZV9fWENhc2VQYXJ0X19UaGVuQXNzaWdubWVudF8zXzBfMSgpOwpAQCAtNTM0MjIsMTYgKzU3ODc5LDE2IEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fWEZvckxvb3BFeHByZXNzaW9uX19Hcm91cF9fMCIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNjEyMzoxOiBydWxlX19YRm9yTG9vcEV4cHJlc3Npb25fX0dyb3VwX18wIDogcnVsZV9fWEZvckxvb3BFeHByZXNzaW9uX19Hcm91cF9fMF9fSW1wbCBydWxlX19YRm9yTG9vcEV4cHJlc3Npb25fX0dyb3VwX18xIDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNzQ2MToxOiBydWxlX19YRm9yTG9vcEV4cHJlc3Npb25fX0dyb3VwX18wIDogcnVsZV9fWEZvckxvb3BFeHByZXNzaW9uX19Hcm91cF9fMF9fSW1wbCBydWxlX19YRm9yTG9vcEV4cHJlc3Npb25fX0dyb3VwX18xIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YRm9yTG9vcEV4cHJlc3Npb25fX0dyb3VwX18wKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE2MTI3OjE6ICggcnVsZV9fWEZvckxvb3BFeHByZXNzaW9uX19Hcm91cF9fMF9fSW1wbCBydWxlX19YRm9yTG9vcEV4cHJlc3Npb25fX0dyb3VwX18xICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE2MTI4OjI6IHJ1bGVfX1hGb3JMb29wRXhwcmVzc2lvbl9fR3JvdXBfXzBfX0ltcGwgcnVsZV9fWEZvckxvb3BFeHByZXNzaW9uX19Hcm91cF9fMQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTc0NjU6MTogKCBydWxlX19YRm9yTG9vcEV4cHJlc3Npb25fX0dyb3VwX18wX19JbXBsIHJ1bGVfX1hGb3JMb29wRXhwcmVzc2lvbl9fR3JvdXBfXzEgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTc0NjY6MjogcnVsZV9fWEZvckxvb3BFeHByZXNzaW9uX19Hcm91cF9fMF9fSW1wbCBydWxlX19YRm9yTG9vcEV4cHJlc3Npb25fX0dyb3VwX18xCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV183NCk7CisgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV184Mik7CiAgICAgICAgICAgICBydWxlX19YRm9yTG9vcEV4cHJlc3Npb25fX0dyb3VwX18wX19JbXBsKCk7CiAKICAgICAgICAgICAgIHN0YXRlLl9mc3AtLTsKQEAgLTUzNDYwLDIzICs1NzkxNywyMyBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX1hGb3JMb29wRXhwcmVzc2lvbl9fR3JvdXBfXzBfX0ltcGwiCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTYxMzU6MTogcnVsZV9fWEZvckxvb3BFeHByZXNzaW9uX19Hcm91cF9fMF9fSW1wbCA6ICggKCBydWxlX19YRm9yTG9vcEV4cHJlc3Npb25fX0dyb3VwXzBfXzAgKSApIDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNzQ3MzoxOiBydWxlX19YRm9yTG9vcEV4cHJlc3Npb25fX0dyb3VwX18wX19JbXBsIDogKCAoIHJ1bGVfX1hGb3JMb29wRXhwcmVzc2lvbl9fR3JvdXBfMF9fMCApICkgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1hGb3JMb29wRXhwcmVzc2lvbl9fR3JvdXBfXzBfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTYxMzk6MTogKCAoICggcnVsZV9fWEZvckxvb3BFeHByZXNzaW9uX19Hcm91cF8wX18wICkgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNjE0MDoxOiAoICggcnVsZV9fWEZvckxvb3BFeHByZXNzaW9uX19Hcm91cF8wX18wICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTc0Nzc6MTogKCAoICggcnVsZV9fWEZvckxvb3BFeHByZXNzaW9uX19Hcm91cF8wX18wICkgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNzQ3ODoxOiAoICggcnVsZV9fWEZvckxvb3BFeHByZXNzaW9uX19Hcm91cF8wX18wICkgKQogICAgICAgICAgICAgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTYxNDA6MTogKCAoIHJ1bGVfX1hGb3JMb29wRXhwcmVzc2lvbl9fR3JvdXBfMF9fMCApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE2MTQxOjI6ICggcnVsZV9fWEZvckxvb3BFeHByZXNzaW9uX19Hcm91cF8wX18wICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE3NDc4OjE6ICggKCBydWxlX19YRm9yTG9vcEV4cHJlc3Npb25fX0dyb3VwXzBfXzAgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNzQ3OToyOiAoIHJ1bGVfX1hGb3JMb29wRXhwcmVzc2lvbl9fR3JvdXBfMF9fMCApCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhGb3JMb29wRXhwcmVzc2lvbkFjY2VzcygpLmdldEdyb3VwXzAoKSk7IAogICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTYxNDI6MjogKCBydWxlX19YRm9yTG9vcEV4cHJlc3Npb25fX0dyb3VwXzBfXzAgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTYxNDI6MzogcnVsZV9fWEZvckxvb3BFeHByZXNzaW9uX19Hcm91cF8wX18wCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNzQ4MDoyOiAoIHJ1bGVfX1hGb3JMb29wRXhwcmVzc2lvbl9fR3JvdXBfMF9fMCApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNzQ4MDozOiBydWxlX19YRm9yTG9vcEV4cHJlc3Npb25fX0dyb3VwXzBfXzAKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzIpOwogICAgICAgICAgICAgcnVsZV9fWEZvckxvb3BFeHByZXNzaW9uX19Hcm91cF8wX18wKCk7CkBAIC01MzUxMSwxNiArNTc5NjgsMTYgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YRm9yTG9vcEV4cHJlc3Npb25fX0dyb3VwX18xIgotICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE2MTUwOjE6IHJ1bGVfX1hGb3JMb29wRXhwcmVzc2lvbl9fR3JvdXBfXzEgOiBydWxlX19YRm9yTG9vcEV4cHJlc3Npb25fX0dyb3VwX18xX19JbXBsIHJ1bGVfX1hGb3JMb29wRXhwcmVzc2lvbl9fR3JvdXBfXzIgOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE3NDg4OjE6IHJ1bGVfX1hGb3JMb29wRXhwcmVzc2lvbl9fR3JvdXBfXzEgOiBydWxlX19YRm9yTG9vcEV4cHJlc3Npb25fX0dyb3VwX18xX19JbXBsIHJ1bGVfX1hGb3JMb29wRXhwcmVzc2lvbl9fR3JvdXBfXzIgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1hGb3JMb29wRXhwcmVzc2lvbl9fR3JvdXBfXzEoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTYxNTQ6MTogKCBydWxlX19YRm9yTG9vcEV4cHJlc3Npb25fX0dyb3VwX18xX19JbXBsIHJ1bGVfX1hGb3JMb29wRXhwcmVzc2lvbl9fR3JvdXBfXzIgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTYxNTU6MjogcnVsZV9fWEZvckxvb3BFeHByZXNzaW9uX19Hcm91cF9fMV9fSW1wbCBydWxlX19YRm9yTG9vcEV4cHJlc3Npb25fX0dyb3VwX18yCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNzQ5MjoxOiAoIHJ1bGVfX1hGb3JMb29wRXhwcmVzc2lvbl9fR3JvdXBfXzFfX0ltcGwgcnVsZV9fWEZvckxvb3BFeHByZXNzaW9uX19Hcm91cF9fMiApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNzQ5MzoyOiBydWxlX19YRm9yTG9vcEV4cHJlc3Npb25fX0dyb3VwX18xX19JbXBsIHJ1bGVfX1hGb3JMb29wRXhwcmVzc2lvbl9fR3JvdXBfXzIKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzExOCk7CisgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV18xMjYpOwogICAgICAgICAgICAgcnVsZV9fWEZvckxvb3BFeHByZXNzaW9uX19Hcm91cF9fMV9fSW1wbCgpOwogCiAgICAgICAgICAgICBzdGF0ZS5fZnNwLS07CkBAIC01MzU0OSwyMyArNTgwMDYsMjMgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YRm9yTG9vcEV4cHJlc3Npb25fX0dyb3VwX18xX19JbXBsIgotICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE2MTYyOjE6IHJ1bGVfX1hGb3JMb29wRXhwcmVzc2lvbl9fR3JvdXBfXzFfX0ltcGwgOiAoICggcnVsZV9fWEZvckxvb3BFeHByZXNzaW9uX19Gb3JFeHByZXNzaW9uQXNzaWdubWVudF8xICkgKSA7CisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTc1MDA6MTogcnVsZV9fWEZvckxvb3BFeHByZXNzaW9uX19Hcm91cF9fMV9fSW1wbCA6ICggKCBydWxlX19YRm9yTG9vcEV4cHJlc3Npb25fX0ZvckV4cHJlc3Npb25Bc3NpZ25tZW50XzEgKSApIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YRm9yTG9vcEV4cHJlc3Npb25fX0dyb3VwX18xX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE2MTY2OjE6ICggKCAoIHJ1bGVfX1hGb3JMb29wRXhwcmVzc2lvbl9fRm9yRXhwcmVzc2lvbkFzc2lnbm1lbnRfMSApICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTYxNjc6MTogKCAoIHJ1bGVfX1hGb3JMb29wRXhwcmVzc2lvbl9fRm9yRXhwcmVzc2lvbkFzc2lnbm1lbnRfMSApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE3NTA0OjE6ICggKCAoIHJ1bGVfX1hGb3JMb29wRXhwcmVzc2lvbl9fRm9yRXhwcmVzc2lvbkFzc2lnbm1lbnRfMSApICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTc1MDU6MTogKCAoIHJ1bGVfX1hGb3JMb29wRXhwcmVzc2lvbl9fRm9yRXhwcmVzc2lvbkFzc2lnbm1lbnRfMSApICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE2MTY3OjE6ICggKCBydWxlX19YRm9yTG9vcEV4cHJlc3Npb25fX0ZvckV4cHJlc3Npb25Bc3NpZ25tZW50XzEgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNjE2ODoyOiAoIHJ1bGVfX1hGb3JMb29wRXhwcmVzc2lvbl9fRm9yRXhwcmVzc2lvbkFzc2lnbm1lbnRfMSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNzUwNToxOiAoICggcnVsZV9fWEZvckxvb3BFeHByZXNzaW9uX19Gb3JFeHByZXNzaW9uQXNzaWdubWVudF8xICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTc1MDY6MjogKCBydWxlX19YRm9yTG9vcEV4cHJlc3Npb25fX0ZvckV4cHJlc3Npb25Bc3NpZ25tZW50XzEgKQogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYRm9yTG9vcEV4cHJlc3Npb25BY2Nlc3MoKS5nZXRGb3JFeHByZXNzaW9uQXNzaWdubWVudF8xKCkpOyAKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE2MTY5OjI6ICggcnVsZV9fWEZvckxvb3BFeHByZXNzaW9uX19Gb3JFeHByZXNzaW9uQXNzaWdubWVudF8xICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE2MTY5OjM6IHJ1bGVfX1hGb3JMb29wRXhwcmVzc2lvbl9fRm9yRXhwcmVzc2lvbkFzc2lnbm1lbnRfMQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTc1MDc6MjogKCBydWxlX19YRm9yTG9vcEV4cHJlc3Npb25fX0ZvckV4cHJlc3Npb25Bc3NpZ25tZW50XzEgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTc1MDc6MzogcnVsZV9fWEZvckxvb3BFeHByZXNzaW9uX19Gb3JFeHByZXNzaW9uQXNzaWdubWVudF8xCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV18yKTsKICAgICAgICAgICAgIHJ1bGVfX1hGb3JMb29wRXhwcmVzc2lvbl9fRm9yRXhwcmVzc2lvbkFzc2lnbm1lbnRfMSgpOwpAQCAtNTM2MDAsMTYgKzU4MDU3LDE2IEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fWEZvckxvb3BFeHByZXNzaW9uX19Hcm91cF9fMiIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNjE3NzoxOiBydWxlX19YRm9yTG9vcEV4cHJlc3Npb25fX0dyb3VwX18yIDogcnVsZV9fWEZvckxvb3BFeHByZXNzaW9uX19Hcm91cF9fMl9fSW1wbCBydWxlX19YRm9yTG9vcEV4cHJlc3Npb25fX0dyb3VwX18zIDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNzUxNToxOiBydWxlX19YRm9yTG9vcEV4cHJlc3Npb25fX0dyb3VwX18yIDogcnVsZV9fWEZvckxvb3BFeHByZXNzaW9uX19Hcm91cF9fMl9fSW1wbCBydWxlX19YRm9yTG9vcEV4cHJlc3Npb25fX0dyb3VwX18zIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YRm9yTG9vcEV4cHJlc3Npb25fX0dyb3VwX18yKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE2MTgxOjE6ICggcnVsZV9fWEZvckxvb3BFeHByZXNzaW9uX19Hcm91cF9fMl9fSW1wbCBydWxlX19YRm9yTG9vcEV4cHJlc3Npb25fX0dyb3VwX18zICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE2MTgyOjI6IHJ1bGVfX1hGb3JMb29wRXhwcmVzc2lvbl9fR3JvdXBfXzJfX0ltcGwgcnVsZV9fWEZvckxvb3BFeHByZXNzaW9uX19Hcm91cF9fMworICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTc1MTk6MTogKCBydWxlX19YRm9yTG9vcEV4cHJlc3Npb25fX0dyb3VwX18yX19JbXBsIHJ1bGVfX1hGb3JMb29wRXhwcmVzc2lvbl9fR3JvdXBfXzMgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTc1MjA6MjogcnVsZV9fWEZvckxvb3BFeHByZXNzaW9uX19Hcm91cF9fMl9fSW1wbCBydWxlX19YRm9yTG9vcEV4cHJlc3Npb25fX0dyb3VwX18zCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV183NCk7CisgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV184Mik7CiAgICAgICAgICAgICBydWxlX19YRm9yTG9vcEV4cHJlc3Npb25fX0dyb3VwX18yX19JbXBsKCk7CiAKICAgICAgICAgICAgIHN0YXRlLl9mc3AtLTsKQEAgLTUzNjM4LDIyICs1ODA5NSwyMiBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX1hGb3JMb29wRXhwcmVzc2lvbl9fR3JvdXBfXzJfX0ltcGwiCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTYxODk6MTogcnVsZV9fWEZvckxvb3BFeHByZXNzaW9uX19Hcm91cF9fMl9fSW1wbCA6ICggJyknICkgOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE3NTI3OjE6IHJ1bGVfX1hGb3JMb29wRXhwcmVzc2lvbl9fR3JvdXBfXzJfX0ltcGwgOiAoICcpJyApIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YRm9yTG9vcEV4cHJlc3Npb25fX0dyb3VwX18yX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE2MTkzOjE6ICggKCAnKScgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNjE5NDoxOiAoICcpJyApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNzUzMToxOiAoICggJyknICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTc1MzI6MTogKCAnKScgKQogICAgICAgICAgICAgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTYxOTQ6MTogKCAnKScgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTYxOTU6MjogJyknCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNzUzMjoxOiAoICcpJyApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNzUzMzoyOiAnKScKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WEZvckxvb3BFeHByZXNzaW9uQWNjZXNzKCkuZ2V0UmlnaHRQYXJlbnRoZXNpc0tleXdvcmRfMigpKTsgCiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBtYXRjaChpbnB1dCwxMTQsRk9MTE9XXzIpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOworICAgICAgICAgICAgbWF0Y2goaW5wdXQsMTI0LEZPTExPV18yKTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRYRm9yTG9vcEV4cHJlc3Npb25BY2Nlc3MoKS5nZXRSaWdodFBhcmVudGhlc2lzS2V5d29yZF8yKCkpOyAKICAgICAgICAgICAgIH0KQEAgLTUzNjc5LDE0ICs1ODEzNiwxNCBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX1hGb3JMb29wRXhwcmVzc2lvbl9fR3JvdXBfXzMiCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTYyMDQ6MTogcnVsZV9fWEZvckxvb3BFeHByZXNzaW9uX19Hcm91cF9fMyA6IHJ1bGVfX1hGb3JMb29wRXhwcmVzc2lvbl9fR3JvdXBfXzNfX0ltcGwgOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE3NTQyOjE6IHJ1bGVfX1hGb3JMb29wRXhwcmVzc2lvbl9fR3JvdXBfXzMgOiBydWxlX19YRm9yTG9vcEV4cHJlc3Npb25fX0dyb3VwX18zX19JbXBsIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YRm9yTG9vcEV4cHJlc3Npb25fX0dyb3VwX18zKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE2MjA4OjE6ICggcnVsZV9fWEZvckxvb3BFeHByZXNzaW9uX19Hcm91cF9fM19fSW1wbCApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNjIwOToyOiBydWxlX19YRm9yTG9vcEV4cHJlc3Npb25fX0dyb3VwX18zX19JbXBsCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNzU0NjoxOiAoIHJ1bGVfX1hGb3JMb29wRXhwcmVzc2lvbl9fR3JvdXBfXzNfX0ltcGwgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTc1NDc6MjogcnVsZV9fWEZvckxvb3BFeHByZXNzaW9uX19Hcm91cF9fM19fSW1wbAogICAgICAgICAgICAgewogICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMik7CiAgICAgICAgICAgICBydWxlX19YRm9yTG9vcEV4cHJlc3Npb25fX0dyb3VwX18zX19JbXBsKCk7CkBAIC01MzcxMiwyMyArNTgxNjksMjMgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YRm9yTG9vcEV4cHJlc3Npb25fX0dyb3VwX18zX19JbXBsIgotICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE2MjE1OjE6IHJ1bGVfX1hGb3JMb29wRXhwcmVzc2lvbl9fR3JvdXBfXzNfX0ltcGwgOiAoICggcnVsZV9fWEZvckxvb3BFeHByZXNzaW9uX19FYWNoRXhwcmVzc2lvbkFzc2lnbm1lbnRfMyApICkgOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE3NTUzOjE6IHJ1bGVfX1hGb3JMb29wRXhwcmVzc2lvbl9fR3JvdXBfXzNfX0ltcGwgOiAoICggcnVsZV9fWEZvckxvb3BFeHByZXNzaW9uX19FYWNoRXhwcmVzc2lvbkFzc2lnbm1lbnRfMyApICkgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1hGb3JMb29wRXhwcmVzc2lvbl9fR3JvdXBfXzNfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTYyMTk6MTogKCAoICggcnVsZV9fWEZvckxvb3BFeHByZXNzaW9uX19FYWNoRXhwcmVzc2lvbkFzc2lnbm1lbnRfMyApICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTYyMjA6MTogKCAoIHJ1bGVfX1hGb3JMb29wRXhwcmVzc2lvbl9fRWFjaEV4cHJlc3Npb25Bc3NpZ25tZW50XzMgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNzU1NzoxOiAoICggKCBydWxlX19YRm9yTG9vcEV4cHJlc3Npb25fX0VhY2hFeHByZXNzaW9uQXNzaWdubWVudF8zICkgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNzU1ODoxOiAoICggcnVsZV9fWEZvckxvb3BFeHByZXNzaW9uX19FYWNoRXhwcmVzc2lvbkFzc2lnbm1lbnRfMyApICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE2MjIwOjE6ICggKCBydWxlX19YRm9yTG9vcEV4cHJlc3Npb25fX0VhY2hFeHByZXNzaW9uQXNzaWdubWVudF8zICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTYyMjE6MjogKCBydWxlX19YRm9yTG9vcEV4cHJlc3Npb25fX0VhY2hFeHByZXNzaW9uQXNzaWdubWVudF8zICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE3NTU4OjE6ICggKCBydWxlX19YRm9yTG9vcEV4cHJlc3Npb25fX0VhY2hFeHByZXNzaW9uQXNzaWdubWVudF8zICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTc1NTk6MjogKCBydWxlX19YRm9yTG9vcEV4cHJlc3Npb25fX0VhY2hFeHByZXNzaW9uQXNzaWdubWVudF8zICkKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WEZvckxvb3BFeHByZXNzaW9uQWNjZXNzKCkuZ2V0RWFjaEV4cHJlc3Npb25Bc3NpZ25tZW50XzMoKSk7IAogICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTYyMjI6MjogKCBydWxlX19YRm9yTG9vcEV4cHJlc3Npb25fX0VhY2hFeHByZXNzaW9uQXNzaWdubWVudF8zICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE2MjIyOjM6IHJ1bGVfX1hGb3JMb29wRXhwcmVzc2lvbl9fRWFjaEV4cHJlc3Npb25Bc3NpZ25tZW50XzMKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE3NTYwOjI6ICggcnVsZV9fWEZvckxvb3BFeHByZXNzaW9uX19FYWNoRXhwcmVzc2lvbkFzc2lnbm1lbnRfMyApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNzU2MDozOiBydWxlX19YRm9yTG9vcEV4cHJlc3Npb25fX0VhY2hFeHByZXNzaW9uQXNzaWdubWVudF8zCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV18yKTsKICAgICAgICAgICAgIHJ1bGVfX1hGb3JMb29wRXhwcmVzc2lvbl9fRWFjaEV4cHJlc3Npb25Bc3NpZ25tZW50XzMoKTsKQEAgLTUzNzYzLDE0ICs1ODIyMCwxNCBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX1hGb3JMb29wRXhwcmVzc2lvbl9fR3JvdXBfMF9fMCIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNjIzMToxOiBydWxlX19YRm9yTG9vcEV4cHJlc3Npb25fX0dyb3VwXzBfXzAgOiBydWxlX19YRm9yTG9vcEV4cHJlc3Npb25fX0dyb3VwXzBfXzBfX0ltcGwgOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE3NTY5OjE6IHJ1bGVfX1hGb3JMb29wRXhwcmVzc2lvbl9fR3JvdXBfMF9fMCA6IHJ1bGVfX1hGb3JMb29wRXhwcmVzc2lvbl9fR3JvdXBfMF9fMF9fSW1wbCA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fWEZvckxvb3BFeHByZXNzaW9uX19Hcm91cF8wX18wKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE2MjM1OjE6ICggcnVsZV9fWEZvckxvb3BFeHByZXNzaW9uX19Hcm91cF8wX18wX19JbXBsICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE2MjM2OjI6IHJ1bGVfX1hGb3JMb29wRXhwcmVzc2lvbl9fR3JvdXBfMF9fMF9fSW1wbAorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTc1NzM6MTogKCBydWxlX19YRm9yTG9vcEV4cHJlc3Npb25fX0dyb3VwXzBfXzBfX0ltcGwgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTc1NzQ6MjogcnVsZV9fWEZvckxvb3BFeHByZXNzaW9uX19Hcm91cF8wX18wX19JbXBsCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV18yKTsKICAgICAgICAgICAgIHJ1bGVfX1hGb3JMb29wRXhwcmVzc2lvbl9fR3JvdXBfMF9fMF9fSW1wbCgpOwpAQCAtNTM3OTYsMjMgKzU4MjUzLDIzIEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fWEZvckxvb3BFeHByZXNzaW9uX19Hcm91cF8wX18wX19JbXBsIgotICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE2MjQyOjE6IHJ1bGVfX1hGb3JMb29wRXhwcmVzc2lvbl9fR3JvdXBfMF9fMF9fSW1wbCA6ICggKCBydWxlX19YRm9yTG9vcEV4cHJlc3Npb25fX0dyb3VwXzBfMF9fMCApICkgOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE3NTgwOjE6IHJ1bGVfX1hGb3JMb29wRXhwcmVzc2lvbl9fR3JvdXBfMF9fMF9fSW1wbCA6ICggKCBydWxlX19YRm9yTG9vcEV4cHJlc3Npb25fX0dyb3VwXzBfMF9fMCApICkgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1hGb3JMb29wRXhwcmVzc2lvbl9fR3JvdXBfMF9fMF9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNjI0NjoxOiAoICggKCBydWxlX19YRm9yTG9vcEV4cHJlc3Npb25fX0dyb3VwXzBfMF9fMCApICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTYyNDc6MTogKCAoIHJ1bGVfX1hGb3JMb29wRXhwcmVzc2lvbl9fR3JvdXBfMF8wX18wICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTc1ODQ6MTogKCAoICggcnVsZV9fWEZvckxvb3BFeHByZXNzaW9uX19Hcm91cF8wXzBfXzAgKSApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE3NTg1OjE6ICggKCBydWxlX19YRm9yTG9vcEV4cHJlc3Npb25fX0dyb3VwXzBfMF9fMCApICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE2MjQ3OjE6ICggKCBydWxlX19YRm9yTG9vcEV4cHJlc3Npb25fX0dyb3VwXzBfMF9fMCApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE2MjQ4OjI6ICggcnVsZV9fWEZvckxvb3BFeHByZXNzaW9uX19Hcm91cF8wXzBfXzAgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTc1ODU6MTogKCAoIHJ1bGVfX1hGb3JMb29wRXhwcmVzc2lvbl9fR3JvdXBfMF8wX18wICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTc1ODY6MjogKCBydWxlX19YRm9yTG9vcEV4cHJlc3Npb25fX0dyb3VwXzBfMF9fMCApCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhGb3JMb29wRXhwcmVzc2lvbkFjY2VzcygpLmdldEdyb3VwXzBfMCgpKTsgCiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNjI0OToyOiAoIHJ1bGVfX1hGb3JMb29wRXhwcmVzc2lvbl9fR3JvdXBfMF8wX18wICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE2MjQ5OjM6IHJ1bGVfX1hGb3JMb29wRXhwcmVzc2lvbl9fR3JvdXBfMF8wX18wCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNzU4NzoyOiAoIHJ1bGVfX1hGb3JMb29wRXhwcmVzc2lvbl9fR3JvdXBfMF8wX18wICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE3NTg3OjM6IHJ1bGVfX1hGb3JMb29wRXhwcmVzc2lvbl9fR3JvdXBfMF8wX18wCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV18yKTsKICAgICAgICAgICAgIHJ1bGVfX1hGb3JMb29wRXhwcmVzc2lvbl9fR3JvdXBfMF8wX18wKCk7CkBAIC01Mzg0NywxNiArNTgzMDQsMTYgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YRm9yTG9vcEV4cHJlc3Npb25fX0dyb3VwXzBfMF9fMCIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNjI1ODoxOiBydWxlX19YRm9yTG9vcEV4cHJlc3Npb25fX0dyb3VwXzBfMF9fMCA6IHJ1bGVfX1hGb3JMb29wRXhwcmVzc2lvbl9fR3JvdXBfMF8wX18wX19JbXBsIHJ1bGVfX1hGb3JMb29wRXhwcmVzc2lvbl9fR3JvdXBfMF8wX18xIDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNzU5NjoxOiBydWxlX19YRm9yTG9vcEV4cHJlc3Npb25fX0dyb3VwXzBfMF9fMCA6IHJ1bGVfX1hGb3JMb29wRXhwcmVzc2lvbl9fR3JvdXBfMF8wX18wX19JbXBsIHJ1bGVfX1hGb3JMb29wRXhwcmVzc2lvbl9fR3JvdXBfMF8wX18xIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YRm9yTG9vcEV4cHJlc3Npb25fX0dyb3VwXzBfMF9fMCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNjI2MjoxOiAoIHJ1bGVfX1hGb3JMb29wRXhwcmVzc2lvbl9fR3JvdXBfMF8wX18wX19JbXBsIHJ1bGVfX1hGb3JMb29wRXhwcmVzc2lvbl9fR3JvdXBfMF8wX18xICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE2MjYzOjI6IHJ1bGVfX1hGb3JMb29wRXhwcmVzc2lvbl9fR3JvdXBfMF8wX18wX19JbXBsIHJ1bGVfX1hGb3JMb29wRXhwcmVzc2lvbl9fR3JvdXBfMF8wX18xCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNzYwMDoxOiAoIHJ1bGVfX1hGb3JMb29wRXhwcmVzc2lvbl9fR3JvdXBfMF8wX18wX19JbXBsIHJ1bGVfX1hGb3JMb29wRXhwcmVzc2lvbl9fR3JvdXBfMF8wX18xICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE3NjAxOjI6IHJ1bGVfX1hGb3JMb29wRXhwcmVzc2lvbl9fR3JvdXBfMF8wX18wX19JbXBsIHJ1bGVfX1hGb3JMb29wRXhwcmVzc2lvbl9fR3JvdXBfMF8wX18xCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV18zOSk7CisgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV180Myk7CiAgICAgICAgICAgICBydWxlX19YRm9yTG9vcEV4cHJlc3Npb25fX0dyb3VwXzBfMF9fMF9fSW1wbCgpOwogCiAgICAgICAgICAgICBzdGF0ZS5fZnNwLS07CkBAIC01Mzg4NSwyMyArNTgzNDIsMjMgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YRm9yTG9vcEV4cHJlc3Npb25fX0dyb3VwXzBfMF9fMF9fSW1wbCIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNjI3MDoxOiBydWxlX19YRm9yTG9vcEV4cHJlc3Npb25fX0dyb3VwXzBfMF9fMF9fSW1wbCA6ICggKCkgKSA7CisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTc2MDg6MTogcnVsZV9fWEZvckxvb3BFeHByZXNzaW9uX19Hcm91cF8wXzBfXzBfX0ltcGwgOiAoICgpICkgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1hGb3JMb29wRXhwcmVzc2lvbl9fR3JvdXBfMF8wX18wX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE2Mjc0OjE6ICggKCAoKSApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE2Mjc1OjE6ICggKCkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTc2MTI6MTogKCAoICgpICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTc2MTM6MTogKCAoKSApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNjI3NToxOiAoICgpICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE2Mjc2OjI6ICgpCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNzYxMzoxOiAoICgpICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE3NjE0OjI6ICgpCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhGb3JMb29wRXhwcmVzc2lvbkFjY2VzcygpLmdldFhGb3JMb29wRXhwcmVzc2lvbkFjdGlvbl8wXzBfMCgpKTsgCiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNjI3NzoyOiAoKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTYyNzc6MzogCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNzYxNToyOiAoKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTc2MTU6MzogCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICB9CiAKQEAgLTUzOTI2LDE2ICs1ODM4MywxNiBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX1hGb3JMb29wRXhwcmVzc2lvbl9fR3JvdXBfMF8wX18xIgotICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE2Mjg1OjE6IHJ1bGVfX1hGb3JMb29wRXhwcmVzc2lvbl9fR3JvdXBfMF8wX18xIDogcnVsZV9fWEZvckxvb3BFeHByZXNzaW9uX19Hcm91cF8wXzBfXzFfX0ltcGwgcnVsZV9fWEZvckxvb3BFeHByZXNzaW9uX19Hcm91cF8wXzBfXzIgOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE3NjIzOjE6IHJ1bGVfX1hGb3JMb29wRXhwcmVzc2lvbl9fR3JvdXBfMF8wX18xIDogcnVsZV9fWEZvckxvb3BFeHByZXNzaW9uX19Hcm91cF8wXzBfXzFfX0ltcGwgcnVsZV9fWEZvckxvb3BFeHByZXNzaW9uX19Hcm91cF8wXzBfXzIgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1hGb3JMb29wRXhwcmVzc2lvbl9fR3JvdXBfMF8wX18xKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE2Mjg5OjE6ICggcnVsZV9fWEZvckxvb3BFeHByZXNzaW9uX19Hcm91cF8wXzBfXzFfX0ltcGwgcnVsZV9fWEZvckxvb3BFeHByZXNzaW9uX19Hcm91cF8wXzBfXzIgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTYyOTA6MjogcnVsZV9fWEZvckxvb3BFeHByZXNzaW9uX19Hcm91cF8wXzBfXzFfX0ltcGwgcnVsZV9fWEZvckxvb3BFeHByZXNzaW9uX19Hcm91cF8wXzBfXzIKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE3NjI3OjE6ICggcnVsZV9fWEZvckxvb3BFeHByZXNzaW9uX19Hcm91cF8wXzBfXzFfX0ltcGwgcnVsZV9fWEZvckxvb3BFeHByZXNzaW9uX19Hcm91cF8wXzBfXzIgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTc2Mjg6MjogcnVsZV9fWEZvckxvb3BFeHByZXNzaW9uX19Hcm91cF8wXzBfXzFfX0ltcGwgcnVsZV9fWEZvckxvb3BFeHByZXNzaW9uX19Hcm91cF8wXzBfXzIKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzcwKTsKKyAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzc4KTsKICAgICAgICAgICAgIHJ1bGVfX1hGb3JMb29wRXhwcmVzc2lvbl9fR3JvdXBfMF8wX18xX19JbXBsKCk7CiAKICAgICAgICAgICAgIHN0YXRlLl9mc3AtLTsKQEAgLTUzOTY0LDIyICs1ODQyMSwyMiBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX1hGb3JMb29wRXhwcmVzc2lvbl9fR3JvdXBfMF8wX18xX19JbXBsIgotICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE2Mjk3OjE6IHJ1bGVfX1hGb3JMb29wRXhwcmVzc2lvbl9fR3JvdXBfMF8wX18xX19JbXBsIDogKCAnZm9yJyApIDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNzYzNToxOiBydWxlX19YRm9yTG9vcEV4cHJlc3Npb25fX0dyb3VwXzBfMF9fMV9fSW1wbCA6ICggJ2ZvcicgKSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fWEZvckxvb3BFeHByZXNzaW9uX19Hcm91cF8wXzBfXzFfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTYzMDE6MTogKCAoICdmb3InICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTYzMDI6MTogKCAnZm9yJyApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNzYzOToxOiAoICggJ2ZvcicgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNzY0MDoxOiAoICdmb3InICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE2MzAyOjE6ICggJ2ZvcicgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTYzMDM6MjogJ2ZvcicKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE3NjQwOjE6ICggJ2ZvcicgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTc2NDE6MjogJ2ZvcicKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WEZvckxvb3BFeHByZXNzaW9uQWNjZXNzKCkuZ2V0Rm9yS2V5d29yZF8wXzBfMSgpKTsgCiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBtYXRjaChpbnB1dCw5NSxGT0xMT1dfMik7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CisgICAgICAgICAgICBtYXRjaChpbnB1dCwxMDIsRk9MTE9XXzIpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOwogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBhZnRlcihncmFtbWFyQWNjZXNzLmdldFhGb3JMb29wRXhwcmVzc2lvbkFjY2VzcygpLmdldEZvcktleXdvcmRfMF8wXzEoKSk7IAogICAgICAgICAgICAgfQpAQCAtNTQwMDUsMTYgKzU4NDYyLDE2IEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fWEZvckxvb3BFeHByZXNzaW9uX19Hcm91cF8wXzBfXzIiCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTYzMTI6MTogcnVsZV9fWEZvckxvb3BFeHByZXNzaW9uX19Hcm91cF8wXzBfXzIgOiBydWxlX19YRm9yTG9vcEV4cHJlc3Npb25fX0dyb3VwXzBfMF9fMl9fSW1wbCBydWxlX19YRm9yTG9vcEV4cHJlc3Npb25fX0dyb3VwXzBfMF9fMyA7CisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTc2NTA6MTogcnVsZV9fWEZvckxvb3BFeHByZXNzaW9uX19Hcm91cF8wXzBfXzIgOiBydWxlX19YRm9yTG9vcEV4cHJlc3Npb25fX0dyb3VwXzBfMF9fMl9fSW1wbCBydWxlX19YRm9yTG9vcEV4cHJlc3Npb25fX0dyb3VwXzBfMF9fMyA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fWEZvckxvb3BFeHByZXNzaW9uX19Hcm91cF8wXzBfXzIoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTYzMTY6MTogKCBydWxlX19YRm9yTG9vcEV4cHJlc3Npb25fX0dyb3VwXzBfMF9fMl9fSW1wbCBydWxlX19YRm9yTG9vcEV4cHJlc3Npb25fX0dyb3VwXzBfMF9fMyApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNjMxNzoyOiBydWxlX19YRm9yTG9vcEV4cHJlc3Npb25fX0dyb3VwXzBfMF9fMl9fSW1wbCBydWxlX19YRm9yTG9vcEV4cHJlc3Npb25fX0dyb3VwXzBfMF9fMworICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTc2NTQ6MTogKCBydWxlX19YRm9yTG9vcEV4cHJlc3Npb25fX0dyb3VwXzBfMF9fMl9fSW1wbCBydWxlX19YRm9yTG9vcEV4cHJlc3Npb25fX0dyb3VwXzBfMF9fMyApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNzY1NToyOiBydWxlX19YRm9yTG9vcEV4cHJlc3Npb25fX0dyb3VwXzBfMF9fMl9fSW1wbCBydWxlX19YRm9yTG9vcEV4cHJlc3Npb25fX0dyb3VwXzBfMF9fMwogICAgICAgICAgICAgewotICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfOTEpOworICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfOTkpOwogICAgICAgICAgICAgcnVsZV9fWEZvckxvb3BFeHByZXNzaW9uX19Hcm91cF8wXzBfXzJfX0ltcGwoKTsKIAogICAgICAgICAgICAgc3RhdGUuX2ZzcC0tOwpAQCAtNTQwNDMsMjIgKzU4NTAwLDIyIEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fWEZvckxvb3BFeHByZXNzaW9uX19Hcm91cF8wXzBfXzJfX0ltcGwiCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTYzMjQ6MTogcnVsZV9fWEZvckxvb3BFeHByZXNzaW9uX19Hcm91cF8wXzBfXzJfX0ltcGwgOiAoICcoJyApIDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNzY2MjoxOiBydWxlX19YRm9yTG9vcEV4cHJlc3Npb25fX0dyb3VwXzBfMF9fMl9fSW1wbCA6ICggJygnICkgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1hGb3JMb29wRXhwcmVzc2lvbl9fR3JvdXBfMF8wX18yX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE2MzI4OjE6ICggKCAnKCcgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNjMyOToxOiAoICcoJyApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNzY2NjoxOiAoICggJygnICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTc2Njc6MTogKCAnKCcgKQogICAgICAgICAgICAgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTYzMjk6MTogKCAnKCcgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTYzMzA6MjogJygnCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNzY2NzoxOiAoICcoJyApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNzY2ODoyOiAnKCcKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WEZvckxvb3BFeHByZXNzaW9uQWNjZXNzKCkuZ2V0TGVmdFBhcmVudGhlc2lzS2V5d29yZF8wXzBfMigpKTsgCiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBtYXRjaChpbnB1dCwxMTMsRk9MTE9XXzIpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOworICAgICAgICAgICAgbWF0Y2goaW5wdXQsMTIzLEZPTExPV18yKTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRYRm9yTG9vcEV4cHJlc3Npb25BY2Nlc3MoKS5nZXRMZWZ0UGFyZW50aGVzaXNLZXl3b3JkXzBfMF8yKCkpOyAKICAgICAgICAgICAgIH0KQEAgLTU0MDg0LDE2ICs1ODU0MSwxNiBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX1hGb3JMb29wRXhwcmVzc2lvbl9fR3JvdXBfMF8wX18zIgotICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE2MzM5OjE6IHJ1bGVfX1hGb3JMb29wRXhwcmVzc2lvbl9fR3JvdXBfMF8wX18zIDogcnVsZV9fWEZvckxvb3BFeHByZXNzaW9uX19Hcm91cF8wXzBfXzNfX0ltcGwgcnVsZV9fWEZvckxvb3BFeHByZXNzaW9uX19Hcm91cF8wXzBfXzQgOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE3Njc3OjE6IHJ1bGVfX1hGb3JMb29wRXhwcmVzc2lvbl9fR3JvdXBfMF8wX18zIDogcnVsZV9fWEZvckxvb3BFeHByZXNzaW9uX19Hcm91cF8wXzBfXzNfX0ltcGwgcnVsZV9fWEZvckxvb3BFeHByZXNzaW9uX19Hcm91cF8wXzBfXzQgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1hGb3JMb29wRXhwcmVzc2lvbl9fR3JvdXBfMF8wX18zKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE2MzQzOjE6ICggcnVsZV9fWEZvckxvb3BFeHByZXNzaW9uX19Hcm91cF8wXzBfXzNfX0ltcGwgcnVsZV9fWEZvckxvb3BFeHByZXNzaW9uX19Hcm91cF8wXzBfXzQgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTYzNDQ6MjogcnVsZV9fWEZvckxvb3BFeHByZXNzaW9uX19Hcm91cF8wXzBfXzNfX0ltcGwgcnVsZV9fWEZvckxvb3BFeHByZXNzaW9uX19Hcm91cF8wXzBfXzQKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE3NjgxOjE6ICggcnVsZV9fWEZvckxvb3BFeHByZXNzaW9uX19Hcm91cF8wXzBfXzNfX0ltcGwgcnVsZV9fWEZvckxvb3BFeHByZXNzaW9uX19Hcm91cF8wXzBfXzQgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTc2ODI6MjogcnVsZV9fWEZvckxvb3BFeHByZXNzaW9uX19Hcm91cF8wXzBfXzNfX0ltcGwgcnVsZV9fWEZvckxvb3BFeHByZXNzaW9uX19Hcm91cF8wXzBfXzQKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzEyNSk7CisgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV18xMzMpOwogICAgICAgICAgICAgcnVsZV9fWEZvckxvb3BFeHByZXNzaW9uX19Hcm91cF8wXzBfXzNfX0ltcGwoKTsKIAogICAgICAgICAgICAgc3RhdGUuX2ZzcC0tOwpAQCAtNTQxMjIsMjMgKzU4NTc5LDIzIEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fWEZvckxvb3BFeHByZXNzaW9uX19Hcm91cF8wXzBfXzNfX0ltcGwiCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTYzNTE6MTogcnVsZV9fWEZvckxvb3BFeHByZXNzaW9uX19Hcm91cF8wXzBfXzNfX0ltcGwgOiAoICggcnVsZV9fWEZvckxvb3BFeHByZXNzaW9uX19EZWNsYXJlZFBhcmFtQXNzaWdubWVudF8wXzBfMyApICkgOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE3Njg5OjE6IHJ1bGVfX1hGb3JMb29wRXhwcmVzc2lvbl9fR3JvdXBfMF8wX18zX19JbXBsIDogKCAoIHJ1bGVfX1hGb3JMb29wRXhwcmVzc2lvbl9fRGVjbGFyZWRQYXJhbUFzc2lnbm1lbnRfMF8wXzMgKSApIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YRm9yTG9vcEV4cHJlc3Npb25fX0dyb3VwXzBfMF9fM19fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNjM1NToxOiAoICggKCBydWxlX19YRm9yTG9vcEV4cHJlc3Npb25fX0RlY2xhcmVkUGFyYW1Bc3NpZ25tZW50XzBfMF8zICkgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNjM1NjoxOiAoICggcnVsZV9fWEZvckxvb3BFeHByZXNzaW9uX19EZWNsYXJlZFBhcmFtQXNzaWdubWVudF8wXzBfMyApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE3NjkzOjE6ICggKCAoIHJ1bGVfX1hGb3JMb29wRXhwcmVzc2lvbl9fRGVjbGFyZWRQYXJhbUFzc2lnbm1lbnRfMF8wXzMgKSApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE3Njk0OjE6ICggKCBydWxlX19YRm9yTG9vcEV4cHJlc3Npb25fX0RlY2xhcmVkUGFyYW1Bc3NpZ25tZW50XzBfMF8zICkgKQogICAgICAgICAgICAgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTYzNTY6MTogKCAoIHJ1bGVfX1hGb3JMb29wRXhwcmVzc2lvbl9fRGVjbGFyZWRQYXJhbUFzc2lnbm1lbnRfMF8wXzMgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNjM1NzoyOiAoIHJ1bGVfX1hGb3JMb29wRXhwcmVzc2lvbl9fRGVjbGFyZWRQYXJhbUFzc2lnbm1lbnRfMF8wXzMgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTc2OTQ6MTogKCAoIHJ1bGVfX1hGb3JMb29wRXhwcmVzc2lvbl9fRGVjbGFyZWRQYXJhbUFzc2lnbm1lbnRfMF8wXzMgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNzY5NToyOiAoIHJ1bGVfX1hGb3JMb29wRXhwcmVzc2lvbl9fRGVjbGFyZWRQYXJhbUFzc2lnbm1lbnRfMF8wXzMgKQogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYRm9yTG9vcEV4cHJlc3Npb25BY2Nlc3MoKS5nZXREZWNsYXJlZFBhcmFtQXNzaWdubWVudF8wXzBfMygpKTsgCiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNjM1ODoyOiAoIHJ1bGVfX1hGb3JMb29wRXhwcmVzc2lvbl9fRGVjbGFyZWRQYXJhbUFzc2lnbm1lbnRfMF8wXzMgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTYzNTg6MzogcnVsZV9fWEZvckxvb3BFeHByZXNzaW9uX19EZWNsYXJlZFBhcmFtQXNzaWdubWVudF8wXzBfMworICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTc2OTY6MjogKCBydWxlX19YRm9yTG9vcEV4cHJlc3Npb25fX0RlY2xhcmVkUGFyYW1Bc3NpZ25tZW50XzBfMF8zICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE3Njk2OjM6IHJ1bGVfX1hGb3JMb29wRXhwcmVzc2lvbl9fRGVjbGFyZWRQYXJhbUFzc2lnbm1lbnRfMF8wXzMKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzIpOwogICAgICAgICAgICAgcnVsZV9fWEZvckxvb3BFeHByZXNzaW9uX19EZWNsYXJlZFBhcmFtQXNzaWdubWVudF8wXzBfMygpOwpAQCAtNTQxNzMsMTQgKzU4NjMwLDE0IEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fWEZvckxvb3BFeHByZXNzaW9uX19Hcm91cF8wXzBfXzQiCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTYzNjY6MTogcnVsZV9fWEZvckxvb3BFeHByZXNzaW9uX19Hcm91cF8wXzBfXzQgOiBydWxlX19YRm9yTG9vcEV4cHJlc3Npb25fX0dyb3VwXzBfMF9fNF9fSW1wbCA7CisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTc3MDQ6MTogcnVsZV9fWEZvckxvb3BFeHByZXNzaW9uX19Hcm91cF8wXzBfXzQgOiBydWxlX19YRm9yTG9vcEV4cHJlc3Npb25fX0dyb3VwXzBfMF9fNF9fSW1wbCA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fWEZvckxvb3BFeHByZXNzaW9uX19Hcm91cF8wXzBfXzQoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTYzNzA6MTogKCBydWxlX19YRm9yTG9vcEV4cHJlc3Npb25fX0dyb3VwXzBfMF9fNF9fSW1wbCApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNjM3MToyOiBydWxlX19YRm9yTG9vcEV4cHJlc3Npb25fX0dyb3VwXzBfMF9fNF9fSW1wbAorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTc3MDg6MTogKCBydWxlX19YRm9yTG9vcEV4cHJlc3Npb25fX0dyb3VwXzBfMF9fNF9fSW1wbCApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNzcwOToyOiBydWxlX19YRm9yTG9vcEV4cHJlc3Npb25fX0dyb3VwXzBfMF9fNF9fSW1wbAogICAgICAgICAgICAgewogICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMik7CiAgICAgICAgICAgICBydWxlX19YRm9yTG9vcEV4cHJlc3Npb25fX0dyb3VwXzBfMF9fNF9fSW1wbCgpOwpAQCAtNTQyMDYsMjIgKzU4NjYzLDIyIEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fWEZvckxvb3BFeHByZXNzaW9uX19Hcm91cF8wXzBfXzRfX0ltcGwiCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTYzNzc6MTogcnVsZV9fWEZvckxvb3BFeHByZXNzaW9uX19Hcm91cF8wXzBfXzRfX0ltcGwgOiAoICc6JyApIDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNzcxNToxOiBydWxlX19YRm9yTG9vcEV4cHJlc3Npb25fX0dyb3VwXzBfMF9fNF9fSW1wbCA6ICggJzonICkgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1hGb3JMb29wRXhwcmVzc2lvbl9fR3JvdXBfMF8wX180X19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE2MzgxOjE6ICggKCAnOicgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNjM4MjoxOiAoICc6JyApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNzcxOToxOiAoICggJzonICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTc3MjA6MTogKCAnOicgKQogICAgICAgICAgICAgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTYzODI6MTogKCAnOicgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTYzODM6MjogJzonCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNzcyMDoxOiAoICc6JyApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNzcyMToyOiAnOicKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WEZvckxvb3BFeHByZXNzaW9uQWNjZXNzKCkuZ2V0Q29sb25LZXl3b3JkXzBfMF80KCkpOyAKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1hdGNoKGlucHV0LDEyMyxGT0xMT1dfMik7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CisgICAgICAgICAgICBtYXRjaChpbnB1dCwxMzMsRk9MTE9XXzIpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOwogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBhZnRlcihncmFtbWFyQWNjZXNzLmdldFhGb3JMb29wRXhwcmVzc2lvbkFjY2VzcygpLmdldENvbG9uS2V5d29yZF8wXzBfNCgpKTsgCiAgICAgICAgICAgICB9CkBAIC01NDI0NywxNiArNTg3MDQsMTYgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YQmFzaWNGb3JMb29wRXhwcmVzc2lvbl9fR3JvdXBfXzAiCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTYzOTM6MTogcnVsZV9fWEJhc2ljRm9yTG9vcEV4cHJlc3Npb25fX0dyb3VwX18wIDogcnVsZV9fWEJhc2ljRm9yTG9vcEV4cHJlc3Npb25fX0dyb3VwX18wX19JbXBsIHJ1bGVfX1hCYXNpY0Zvckxvb3BFeHByZXNzaW9uX19Hcm91cF9fMSA7CisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTc3MzE6MTogcnVsZV9fWEJhc2ljRm9yTG9vcEV4cHJlc3Npb25fX0dyb3VwX18wIDogcnVsZV9fWEJhc2ljRm9yTG9vcEV4cHJlc3Npb25fX0dyb3VwX18wX19JbXBsIHJ1bGVfX1hCYXNpY0Zvckxvb3BFeHByZXNzaW9uX19Hcm91cF9fMSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fWEJhc2ljRm9yTG9vcEV4cHJlc3Npb25fX0dyb3VwX18wKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE2Mzk3OjE6ICggcnVsZV9fWEJhc2ljRm9yTG9vcEV4cHJlc3Npb25fX0dyb3VwX18wX19JbXBsIHJ1bGVfX1hCYXNpY0Zvckxvb3BFeHByZXNzaW9uX19Hcm91cF9fMSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNjM5ODoyOiBydWxlX19YQmFzaWNGb3JMb29wRXhwcmVzc2lvbl9fR3JvdXBfXzBfX0ltcGwgcnVsZV9fWEJhc2ljRm9yTG9vcEV4cHJlc3Npb25fX0dyb3VwX18xCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNzczNToxOiAoIHJ1bGVfX1hCYXNpY0Zvckxvb3BFeHByZXNzaW9uX19Hcm91cF9fMF9fSW1wbCBydWxlX19YQmFzaWNGb3JMb29wRXhwcmVzc2lvbl9fR3JvdXBfXzEgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTc3MzY6MjogcnVsZV9fWEJhc2ljRm9yTG9vcEV4cHJlc3Npb25fX0dyb3VwX18wX19JbXBsIHJ1bGVfX1hCYXNpY0Zvckxvb3BFeHByZXNzaW9uX19Hcm91cF9fMQogICAgICAgICAgICAgewotICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMzkpOworICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfNDMpOwogICAgICAgICAgICAgcnVsZV9fWEJhc2ljRm9yTG9vcEV4cHJlc3Npb25fX0dyb3VwX18wX19JbXBsKCk7CiAKICAgICAgICAgICAgIHN0YXRlLl9mc3AtLTsKQEAgLTU0Mjg1LDIzICs1ODc0MiwyMyBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX1hCYXNpY0Zvckxvb3BFeHByZXNzaW9uX19Hcm91cF9fMF9fSW1wbCIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNjQwNToxOiBydWxlX19YQmFzaWNGb3JMb29wRXhwcmVzc2lvbl9fR3JvdXBfXzBfX0ltcGwgOiAoICgpICkgOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE3NzQzOjE6IHJ1bGVfX1hCYXNpY0Zvckxvb3BFeHByZXNzaW9uX19Hcm91cF9fMF9fSW1wbCA6ICggKCkgKSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fWEJhc2ljRm9yTG9vcEV4cHJlc3Npb25fX0dyb3VwX18wX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE2NDA5OjE6ICggKCAoKSApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE2NDEwOjE6ICggKCkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTc3NDc6MTogKCAoICgpICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTc3NDg6MTogKCAoKSApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNjQxMDoxOiAoICgpICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE2NDExOjI6ICgpCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNzc0ODoxOiAoICgpICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE3NzQ5OjI6ICgpCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhCYXNpY0Zvckxvb3BFeHByZXNzaW9uQWNjZXNzKCkuZ2V0WEJhc2ljRm9yTG9vcEV4cHJlc3Npb25BY3Rpb25fMCgpKTsgCiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNjQxMjoyOiAoKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTY0MTI6MzogCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNzc1MDoyOiAoKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTc3NTA6MzogCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICB9CiAKQEAgLTU0MzI2LDE2ICs1ODc4MywxNiBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX1hCYXNpY0Zvckxvb3BFeHByZXNzaW9uX19Hcm91cF9fMSIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNjQyMDoxOiBydWxlX19YQmFzaWNGb3JMb29wRXhwcmVzc2lvbl9fR3JvdXBfXzEgOiBydWxlX19YQmFzaWNGb3JMb29wRXhwcmVzc2lvbl9fR3JvdXBfXzFfX0ltcGwgcnVsZV9fWEJhc2ljRm9yTG9vcEV4cHJlc3Npb25fX0dyb3VwX18yIDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNzc1ODoxOiBydWxlX19YQmFzaWNGb3JMb29wRXhwcmVzc2lvbl9fR3JvdXBfXzEgOiBydWxlX19YQmFzaWNGb3JMb29wRXhwcmVzc2lvbl9fR3JvdXBfXzFfX0ltcGwgcnVsZV9fWEJhc2ljRm9yTG9vcEV4cHJlc3Npb25fX0dyb3VwX18yIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YQmFzaWNGb3JMb29wRXhwcmVzc2lvbl9fR3JvdXBfXzEoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTY0MjQ6MTogKCBydWxlX19YQmFzaWNGb3JMb29wRXhwcmVzc2lvbl9fR3JvdXBfXzFfX0ltcGwgcnVsZV9fWEJhc2ljRm9yTG9vcEV4cHJlc3Npb25fX0dyb3VwX18yICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE2NDI1OjI6IHJ1bGVfX1hCYXNpY0Zvckxvb3BFeHByZXNzaW9uX19Hcm91cF9fMV9fSW1wbCBydWxlX19YQmFzaWNGb3JMb29wRXhwcmVzc2lvbl9fR3JvdXBfXzIKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE3NzYyOjE6ICggcnVsZV9fWEJhc2ljRm9yTG9vcEV4cHJlc3Npb25fX0dyb3VwX18xX19JbXBsIHJ1bGVfX1hCYXNpY0Zvckxvb3BFeHByZXNzaW9uX19Hcm91cF9fMiApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNzc2MzoyOiBydWxlX19YQmFzaWNGb3JMb29wRXhwcmVzc2lvbl9fR3JvdXBfXzFfX0ltcGwgcnVsZV9fWEJhc2ljRm9yTG9vcEV4cHJlc3Npb25fX0dyb3VwX18yCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV183MCk7CisgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV183OCk7CiAgICAgICAgICAgICBydWxlX19YQmFzaWNGb3JMb29wRXhwcmVzc2lvbl9fR3JvdXBfXzFfX0ltcGwoKTsKIAogICAgICAgICAgICAgc3RhdGUuX2ZzcC0tOwpAQCAtNTQzNjQsMjIgKzU4ODIxLDIyIEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fWEJhc2ljRm9yTG9vcEV4cHJlc3Npb25fX0dyb3VwX18xX19JbXBsIgotICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE2NDMyOjE6IHJ1bGVfX1hCYXNpY0Zvckxvb3BFeHByZXNzaW9uX19Hcm91cF9fMV9fSW1wbCA6ICggJ2ZvcicgKSA7CisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTc3NzA6MTogcnVsZV9fWEJhc2ljRm9yTG9vcEV4cHJlc3Npb25fX0dyb3VwX18xX19JbXBsIDogKCAnZm9yJyApIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YQmFzaWNGb3JMb29wRXhwcmVzc2lvbl9fR3JvdXBfXzFfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTY0MzY6MTogKCAoICdmb3InICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTY0Mzc6MTogKCAnZm9yJyApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNzc3NDoxOiAoICggJ2ZvcicgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNzc3NToxOiAoICdmb3InICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE2NDM3OjE6ICggJ2ZvcicgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTY0Mzg6MjogJ2ZvcicKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE3Nzc1OjE6ICggJ2ZvcicgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTc3NzY6MjogJ2ZvcicKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WEJhc2ljRm9yTG9vcEV4cHJlc3Npb25BY2Nlc3MoKS5nZXRGb3JLZXl3b3JkXzEoKSk7IAogICAgICAgICAgICAgfQotICAgICAgICAgICAgbWF0Y2goaW5wdXQsOTUsRk9MTE9XXzIpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOworICAgICAgICAgICAgbWF0Y2goaW5wdXQsMTAyLEZPTExPV18yKTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRYQmFzaWNGb3JMb29wRXhwcmVzc2lvbkFjY2VzcygpLmdldEZvcktleXdvcmRfMSgpKTsgCiAgICAgICAgICAgICB9CkBAIC01NDQwNSwxNiArNTg4NjIsMTYgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YQmFzaWNGb3JMb29wRXhwcmVzc2lvbl9fR3JvdXBfXzIiCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTY0NDc6MTogcnVsZV9fWEJhc2ljRm9yTG9vcEV4cHJlc3Npb25fX0dyb3VwX18yIDogcnVsZV9fWEJhc2ljRm9yTG9vcEV4cHJlc3Npb25fX0dyb3VwX18yX19JbXBsIHJ1bGVfX1hCYXNpY0Zvckxvb3BFeHByZXNzaW9uX19Hcm91cF9fMyA7CisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTc3ODU6MTogcnVsZV9fWEJhc2ljRm9yTG9vcEV4cHJlc3Npb25fX0dyb3VwX18yIDogcnVsZV9fWEJhc2ljRm9yTG9vcEV4cHJlc3Npb25fX0dyb3VwX18yX19JbXBsIHJ1bGVfX1hCYXNpY0Zvckxvb3BFeHByZXNzaW9uX19Hcm91cF9fMyA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fWEJhc2ljRm9yTG9vcEV4cHJlc3Npb25fX0dyb3VwX18yKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE2NDUxOjE6ICggcnVsZV9fWEJhc2ljRm9yTG9vcEV4cHJlc3Npb25fX0dyb3VwX18yX19JbXBsIHJ1bGVfX1hCYXNpY0Zvckxvb3BFeHByZXNzaW9uX19Hcm91cF9fMyApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNjQ1MjoyOiBydWxlX19YQmFzaWNGb3JMb29wRXhwcmVzc2lvbl9fR3JvdXBfXzJfX0ltcGwgcnVsZV9fWEJhc2ljRm9yTG9vcEV4cHJlc3Npb25fX0dyb3VwX18zCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNzc4OToxOiAoIHJ1bGVfX1hCYXNpY0Zvckxvb3BFeHByZXNzaW9uX19Hcm91cF9fMl9fSW1wbCBydWxlX19YQmFzaWNGb3JMb29wRXhwcmVzc2lvbl9fR3JvdXBfXzMgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTc3OTA6MjogcnVsZV9fWEJhc2ljRm9yTG9vcEV4cHJlc3Npb25fX0dyb3VwX18yX19JbXBsIHJ1bGVfX1hCYXNpY0Zvckxvb3BFeHByZXNzaW9uX19Hcm91cF9fMwogICAgICAgICAgICAgewotICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMTI3KTsKKyAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzEzNSk7CiAgICAgICAgICAgICBydWxlX19YQmFzaWNGb3JMb29wRXhwcmVzc2lvbl9fR3JvdXBfXzJfX0ltcGwoKTsKIAogICAgICAgICAgICAgc3RhdGUuX2ZzcC0tOwpAQCAtNTQ0NDMsMjIgKzU4OTAwLDIyIEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fWEJhc2ljRm9yTG9vcEV4cHJlc3Npb25fX0dyb3VwX18yX19JbXBsIgotICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE2NDU5OjE6IHJ1bGVfX1hCYXNpY0Zvckxvb3BFeHByZXNzaW9uX19Hcm91cF9fMl9fSW1wbCA6ICggJygnICkgOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE3Nzk3OjE6IHJ1bGVfX1hCYXNpY0Zvckxvb3BFeHByZXNzaW9uX19Hcm91cF9fMl9fSW1wbCA6ICggJygnICkgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1hCYXNpY0Zvckxvb3BFeHByZXNzaW9uX19Hcm91cF9fMl9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNjQ2MzoxOiAoICggJygnICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTY0NjQ6MTogKCAnKCcgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTc4MDE6MTogKCAoICcoJyApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE3ODAyOjE6ICggJygnICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE2NDY0OjE6ICggJygnICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE2NDY1OjI6ICcoJworICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTc4MDI6MTogKCAnKCcgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTc4MDM6MjogJygnCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhCYXNpY0Zvckxvb3BFeHByZXNzaW9uQWNjZXNzKCkuZ2V0TGVmdFBhcmVudGhlc2lzS2V5d29yZF8yKCkpOyAKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1hdGNoKGlucHV0LDExMyxGT0xMT1dfMik7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CisgICAgICAgICAgICBtYXRjaChpbnB1dCwxMjMsRk9MTE9XXzIpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOwogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBhZnRlcihncmFtbWFyQWNjZXNzLmdldFhCYXNpY0Zvckxvb3BFeHByZXNzaW9uQWNjZXNzKCkuZ2V0TGVmdFBhcmVudGhlc2lzS2V5d29yZF8yKCkpOyAKICAgICAgICAgICAgIH0KQEAgLTU0NDg0LDE2ICs1ODk0MSwxNiBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX1hCYXNpY0Zvckxvb3BFeHByZXNzaW9uX19Hcm91cF9fMyIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNjQ3NDoxOiBydWxlX19YQmFzaWNGb3JMb29wRXhwcmVzc2lvbl9fR3JvdXBfXzMgOiBydWxlX19YQmFzaWNGb3JMb29wRXhwcmVzc2lvbl9fR3JvdXBfXzNfX0ltcGwgcnVsZV9fWEJhc2ljRm9yTG9vcEV4cHJlc3Npb25fX0dyb3VwX180IDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNzgxMjoxOiBydWxlX19YQmFzaWNGb3JMb29wRXhwcmVzc2lvbl9fR3JvdXBfXzMgOiBydWxlX19YQmFzaWNGb3JMb29wRXhwcmVzc2lvbl9fR3JvdXBfXzNfX0ltcGwgcnVsZV9fWEJhc2ljRm9yTG9vcEV4cHJlc3Npb25fX0dyb3VwX180IDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YQmFzaWNGb3JMb29wRXhwcmVzc2lvbl9fR3JvdXBfXzMoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTY0Nzg6MTogKCBydWxlX19YQmFzaWNGb3JMb29wRXhwcmVzc2lvbl9fR3JvdXBfXzNfX0ltcGwgcnVsZV9fWEJhc2ljRm9yTG9vcEV4cHJlc3Npb25fX0dyb3VwX180ICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE2NDc5OjI6IHJ1bGVfX1hCYXNpY0Zvckxvb3BFeHByZXNzaW9uX19Hcm91cF9fM19fSW1wbCBydWxlX19YQmFzaWNGb3JMb29wRXhwcmVzc2lvbl9fR3JvdXBfXzQKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE3ODE2OjE6ICggcnVsZV9fWEJhc2ljRm9yTG9vcEV4cHJlc3Npb25fX0dyb3VwX18zX19JbXBsIHJ1bGVfX1hCYXNpY0Zvckxvb3BFeHByZXNzaW9uX19Hcm91cF9fNCApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNzgxNzoyOiBydWxlX19YQmFzaWNGb3JMb29wRXhwcmVzc2lvbl9fR3JvdXBfXzNfX0ltcGwgcnVsZV9fWEJhc2ljRm9yTG9vcEV4cHJlc3Npb25fX0dyb3VwX180CiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV18xMjcpOworICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMTM1KTsKICAgICAgICAgICAgIHJ1bGVfX1hCYXNpY0Zvckxvb3BFeHByZXNzaW9uX19Hcm91cF9fM19fSW1wbCgpOwogCiAgICAgICAgICAgICBzdGF0ZS5fZnNwLS07CkBAIC01NDUyMiwzMSArNTg5NzksMzEgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YQmFzaWNGb3JMb29wRXhwcmVzc2lvbl9fR3JvdXBfXzNfX0ltcGwiCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTY0ODY6MTogcnVsZV9fWEJhc2ljRm9yTG9vcEV4cHJlc3Npb25fX0dyb3VwX18zX19JbXBsIDogKCAoIHJ1bGVfX1hCYXNpY0Zvckxvb3BFeHByZXNzaW9uX19Hcm91cF8zX18wICk/ICkgOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE3ODI0OjE6IHJ1bGVfX1hCYXNpY0Zvckxvb3BFeHByZXNzaW9uX19Hcm91cF9fM19fSW1wbCA6ICggKCBydWxlX19YQmFzaWNGb3JMb29wRXhwcmVzc2lvbl9fR3JvdXBfM19fMCApPyApIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YQmFzaWNGb3JMb29wRXhwcmVzc2lvbl9fR3JvdXBfXzNfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTY0OTA6MTogKCAoICggcnVsZV9fWEJhc2ljRm9yTG9vcEV4cHJlc3Npb25fX0dyb3VwXzNfXzAgKT8gKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNjQ5MToxOiAoICggcnVsZV9fWEJhc2ljRm9yTG9vcEV4cHJlc3Npb25fX0dyb3VwXzNfXzAgKT8gKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTc4Mjg6MTogKCAoICggcnVsZV9fWEJhc2ljRm9yTG9vcEV4cHJlc3Npb25fX0dyb3VwXzNfXzAgKT8gKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNzgyOToxOiAoICggcnVsZV9fWEJhc2ljRm9yTG9vcEV4cHJlc3Npb25fX0dyb3VwXzNfXzAgKT8gKQogICAgICAgICAgICAgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTY0OTE6MTogKCAoIHJ1bGVfX1hCYXNpY0Zvckxvb3BFeHByZXNzaW9uX19Hcm91cF8zX18wICk/ICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE2NDkyOjI6ICggcnVsZV9fWEJhc2ljRm9yTG9vcEV4cHJlc3Npb25fX0dyb3VwXzNfXzAgKT8KKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE3ODI5OjE6ICggKCBydWxlX19YQmFzaWNGb3JMb29wRXhwcmVzc2lvbl9fR3JvdXBfM19fMCApPyApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNzgzMDoyOiAoIHJ1bGVfX1hCYXNpY0Zvckxvb3BFeHByZXNzaW9uX19Hcm91cF8zX18wICk/CiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhCYXNpY0Zvckxvb3BFeHByZXNzaW9uQWNjZXNzKCkuZ2V0R3JvdXBfMygpKTsgCiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNjQ5MzoyOiAoIHJ1bGVfX1hCYXNpY0Zvckxvb3BFeHByZXNzaW9uX19Hcm91cF8zX18wICk/Ci0gICAgICAgICAgICBpbnQgYWx0MTMwPTI7Ci0gICAgICAgICAgICBpbnQgTEExMzBfMCA9IGlucHV0LkxBKDEpOworICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTc4MzE6MjogKCBydWxlX19YQmFzaWNGb3JMb29wRXhwcmVzc2lvbl9fR3JvdXBfM19fMCApPworICAgICAgICAgICAgaW50IGFsdDE0Mz0yOworICAgICAgICAgICAgaW50IExBMTQzXzAgPSBpbnB1dC5MQSgxKTsKIAotICAgICAgICAgICAgaWYgKCAoKExBMTMwXzA+PVJVTEVfU1RSSU5HICYmIExBMTMwXzA8PVJVTEVfREVDSU1BTCl8fExBMTMwXzA9PTI3fHwoTEExMzBfMD49MzQgJiYgTEExMzBfMDw9MzUpfHxMQTEzMF8wPT00MHx8KExBMTMwXzA+PTQ0ICYmIExBMTMwXzA8PTUwKXx8TEExMzBfMD09NzB8fExBMTMwXzA9PTk1fHxMQTEzMF8wPT0xMTN8fChMQTEzMF8wPj0xMTcgJiYgTEExMzBfMDw9MTE4KXx8TEExMzBfMD09MTIwfHxMQTEzMF8wPT0xMjJ8fChMQTEzMF8wPj0xMjYgJiYgTEExMzBfMDw9MTMzKXx8TEExMzBfMD09MTM1fHwoTEExMzBfMD49MTUzICYmIExBMTMwXzA8PTE1NCkpICkgewotICAgICAgICAgICAgICAgIGFsdDEzMD0xOworICAgICAgICAgICAgaWYgKCAoKExBMTQzXzA+PVJVTEVfU1RSSU5HICYmIExBMTQzXzA8PVJVTEVfREVDSU1BTCl8fExBMTQzXzA9PTI3fHwoTEExNDNfMD49MzQgJiYgTEExNDNfMDw9MzUpfHxMQTE0M18wPT00MHx8KExBMTQzXzA+PTQ0ICYmIExBMTQzXzA8PTUwKXx8TEExNDNfMD09NzV8fExBMTQzXzA9PTEwMnx8TEExNDNfMD09MTIzfHwoTEExNDNfMD49MTI3ICYmIExBMTQzXzA8PTEyOCl8fExBMTQzXzA9PTEzMHx8TEExNDNfMD09MTMyfHwoTEExNDNfMD49MTM2ICYmIExBMTQzXzA8PTE0Myl8fExBMTQzXzA9PTE0NXx8KExBMTQzXzA+PTE2NSAmJiBMQTE0M18wPD0xNjYpKSApIHsKKyAgICAgICAgICAgICAgICBhbHQxNDM9MTsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHN3aXRjaCAoYWx0MTMwKSB7CisgICAgICAgICAgICBzd2l0Y2ggKGFsdDE0MykgewogICAgICAgICAgICAgICAgIGNhc2UgMSA6Ci0gICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE2NDkzOjM6IHJ1bGVfX1hCYXNpY0Zvckxvb3BFeHByZXNzaW9uX19Hcm91cF8zX18wCisgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE3ODMxOjM6IHJ1bGVfX1hCYXNpY0Zvckxvb3BFeHByZXNzaW9uX19Hcm91cF8zX18wCiAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMik7CiAgICAgICAgICAgICAgICAgICAgIHJ1bGVfX1hCYXNpY0Zvckxvb3BFeHByZXNzaW9uX19Hcm91cF8zX18wKCk7CkBAIC01NDU4NCwxNiArNTkwNDEsMTYgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YQmFzaWNGb3JMb29wRXhwcmVzc2lvbl9fR3JvdXBfXzQiCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTY1MDE6MTogcnVsZV9fWEJhc2ljRm9yTG9vcEV4cHJlc3Npb25fX0dyb3VwX180IDogcnVsZV9fWEJhc2ljRm9yTG9vcEV4cHJlc3Npb25fX0dyb3VwX180X19JbXBsIHJ1bGVfX1hCYXNpY0Zvckxvb3BFeHByZXNzaW9uX19Hcm91cF9fNSA7CisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTc4Mzk6MTogcnVsZV9fWEJhc2ljRm9yTG9vcEV4cHJlc3Npb25fX0dyb3VwX180IDogcnVsZV9fWEJhc2ljRm9yTG9vcEV4cHJlc3Npb25fX0dyb3VwX180X19JbXBsIHJ1bGVfX1hCYXNpY0Zvckxvb3BFeHByZXNzaW9uX19Hcm91cF9fNSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fWEJhc2ljRm9yTG9vcEV4cHJlc3Npb25fX0dyb3VwX180KCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE2NTA1OjE6ICggcnVsZV9fWEJhc2ljRm9yTG9vcEV4cHJlc3Npb25fX0dyb3VwX180X19JbXBsIHJ1bGVfX1hCYXNpY0Zvckxvb3BFeHByZXNzaW9uX19Hcm91cF9fNSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNjUwNjoyOiBydWxlX19YQmFzaWNGb3JMb29wRXhwcmVzc2lvbl9fR3JvdXBfXzRfX0ltcGwgcnVsZV9fWEJhc2ljRm9yTG9vcEV4cHJlc3Npb25fX0dyb3VwX181CisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNzg0MzoxOiAoIHJ1bGVfX1hCYXNpY0Zvckxvb3BFeHByZXNzaW9uX19Hcm91cF9fNF9fSW1wbCBydWxlX19YQmFzaWNGb3JMb29wRXhwcmVzc2lvbl9fR3JvdXBfXzUgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTc4NDQ6MjogcnVsZV9fWEJhc2ljRm9yTG9vcEV4cHJlc3Npb25fX0dyb3VwX180X19JbXBsIHJ1bGVfX1hCYXNpY0Zvckxvb3BFeHByZXNzaW9uX19Hcm91cF9fNQogICAgICAgICAgICAgewotICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMTI4KTsKKyAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzEzNik7CiAgICAgICAgICAgICBydWxlX19YQmFzaWNGb3JMb29wRXhwcmVzc2lvbl9fR3JvdXBfXzRfX0ltcGwoKTsKIAogICAgICAgICAgICAgc3RhdGUuX2ZzcC0tOwpAQCAtNTQ2MjIsMjIgKzU5MDc5LDIyIEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fWEJhc2ljRm9yTG9vcEV4cHJlc3Npb25fX0dyb3VwX180X19JbXBsIgotICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE2NTEzOjE6IHJ1bGVfX1hCYXNpY0Zvckxvb3BFeHByZXNzaW9uX19Hcm91cF9fNF9fSW1wbCA6ICggJzsnICkgOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE3ODUxOjE6IHJ1bGVfX1hCYXNpY0Zvckxvb3BFeHByZXNzaW9uX19Hcm91cF9fNF9fSW1wbCA6ICggJzsnICkgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1hCYXNpY0Zvckxvb3BFeHByZXNzaW9uX19Hcm91cF9fNF9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNjUxNzoxOiAoICggJzsnICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTY1MTg6MTogKCAnOycgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTc4NTU6MTogKCAoICc7JyApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE3ODU2OjE6ICggJzsnICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE2NTE4OjE6ICggJzsnICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE2NTE5OjI6ICc7JworICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTc4NTY6MTogKCAnOycgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTc4NTc6MjogJzsnCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhCYXNpY0Zvckxvb3BFeHByZXNzaW9uQWNjZXNzKCkuZ2V0U2VtaWNvbG9uS2V5d29yZF80KCkpOyAKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1hdGNoKGlucHV0LDExMSxGT0xMT1dfMik7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CisgICAgICAgICAgICBtYXRjaChpbnB1dCwxMjEsRk9MTE9XXzIpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOwogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBhZnRlcihncmFtbWFyQWNjZXNzLmdldFhCYXNpY0Zvckxvb3BFeHByZXNzaW9uQWNjZXNzKCkuZ2V0U2VtaWNvbG9uS2V5d29yZF80KCkpOyAKICAgICAgICAgICAgIH0KQEAgLTU0NjYzLDE2ICs1OTEyMCwxNiBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX1hCYXNpY0Zvckxvb3BFeHByZXNzaW9uX19Hcm91cF9fNSIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNjUyODoxOiBydWxlX19YQmFzaWNGb3JMb29wRXhwcmVzc2lvbl9fR3JvdXBfXzUgOiBydWxlX19YQmFzaWNGb3JMb29wRXhwcmVzc2lvbl9fR3JvdXBfXzVfX0ltcGwgcnVsZV9fWEJhc2ljRm9yTG9vcEV4cHJlc3Npb25fX0dyb3VwX182IDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNzg2NjoxOiBydWxlX19YQmFzaWNGb3JMb29wRXhwcmVzc2lvbl9fR3JvdXBfXzUgOiBydWxlX19YQmFzaWNGb3JMb29wRXhwcmVzc2lvbl9fR3JvdXBfXzVfX0ltcGwgcnVsZV9fWEJhc2ljRm9yTG9vcEV4cHJlc3Npb25fX0dyb3VwX182IDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YQmFzaWNGb3JMb29wRXhwcmVzc2lvbl9fR3JvdXBfXzUoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTY1MzI6MTogKCBydWxlX19YQmFzaWNGb3JMb29wRXhwcmVzc2lvbl9fR3JvdXBfXzVfX0ltcGwgcnVsZV9fWEJhc2ljRm9yTG9vcEV4cHJlc3Npb25fX0dyb3VwX182ICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE2NTMzOjI6IHJ1bGVfX1hCYXNpY0Zvckxvb3BFeHByZXNzaW9uX19Hcm91cF9fNV9fSW1wbCBydWxlX19YQmFzaWNGb3JMb29wRXhwcmVzc2lvbl9fR3JvdXBfXzYKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE3ODcwOjE6ICggcnVsZV9fWEJhc2ljRm9yTG9vcEV4cHJlc3Npb25fX0dyb3VwX181X19JbXBsIHJ1bGVfX1hCYXNpY0Zvckxvb3BFeHByZXNzaW9uX19Hcm91cF9fNiApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNzg3MToyOiBydWxlX19YQmFzaWNGb3JMb29wRXhwcmVzc2lvbl9fR3JvdXBfXzVfX0ltcGwgcnVsZV9fWEJhc2ljRm9yTG9vcEV4cHJlc3Npb25fX0dyb3VwX182CiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV18xMjgpOworICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMTM2KTsKICAgICAgICAgICAgIHJ1bGVfX1hCYXNpY0Zvckxvb3BFeHByZXNzaW9uX19Hcm91cF9fNV9fSW1wbCgpOwogCiAgICAgICAgICAgICBzdGF0ZS5fZnNwLS07CkBAIC01NDcwMSwzMSArNTkxNTgsMzEgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YQmFzaWNGb3JMb29wRXhwcmVzc2lvbl9fR3JvdXBfXzVfX0ltcGwiCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTY1NDA6MTogcnVsZV9fWEJhc2ljRm9yTG9vcEV4cHJlc3Npb25fX0dyb3VwX181X19JbXBsIDogKCAoIHJ1bGVfX1hCYXNpY0Zvckxvb3BFeHByZXNzaW9uX19FeHByZXNzaW9uQXNzaWdubWVudF81ICk/ICkgOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE3ODc4OjE6IHJ1bGVfX1hCYXNpY0Zvckxvb3BFeHByZXNzaW9uX19Hcm91cF9fNV9fSW1wbCA6ICggKCBydWxlX19YQmFzaWNGb3JMb29wRXhwcmVzc2lvbl9fRXhwcmVzc2lvbkFzc2lnbm1lbnRfNSApPyApIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YQmFzaWNGb3JMb29wRXhwcmVzc2lvbl9fR3JvdXBfXzVfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTY1NDQ6MTogKCAoICggcnVsZV9fWEJhc2ljRm9yTG9vcEV4cHJlc3Npb25fX0V4cHJlc3Npb25Bc3NpZ25tZW50XzUgKT8gKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNjU0NToxOiAoICggcnVsZV9fWEJhc2ljRm9yTG9vcEV4cHJlc3Npb25fX0V4cHJlc3Npb25Bc3NpZ25tZW50XzUgKT8gKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTc4ODI6MTogKCAoICggcnVsZV9fWEJhc2ljRm9yTG9vcEV4cHJlc3Npb25fX0V4cHJlc3Npb25Bc3NpZ25tZW50XzUgKT8gKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNzg4MzoxOiAoICggcnVsZV9fWEJhc2ljRm9yTG9vcEV4cHJlc3Npb25fX0V4cHJlc3Npb25Bc3NpZ25tZW50XzUgKT8gKQogICAgICAgICAgICAgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTY1NDU6MTogKCAoIHJ1bGVfX1hCYXNpY0Zvckxvb3BFeHByZXNzaW9uX19FeHByZXNzaW9uQXNzaWdubWVudF81ICk/ICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE2NTQ2OjI6ICggcnVsZV9fWEJhc2ljRm9yTG9vcEV4cHJlc3Npb25fX0V4cHJlc3Npb25Bc3NpZ25tZW50XzUgKT8KKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE3ODgzOjE6ICggKCBydWxlX19YQmFzaWNGb3JMb29wRXhwcmVzc2lvbl9fRXhwcmVzc2lvbkFzc2lnbm1lbnRfNSApPyApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNzg4NDoyOiAoIHJ1bGVfX1hCYXNpY0Zvckxvb3BFeHByZXNzaW9uX19FeHByZXNzaW9uQXNzaWdubWVudF81ICk/CiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhCYXNpY0Zvckxvb3BFeHByZXNzaW9uQWNjZXNzKCkuZ2V0RXhwcmVzc2lvbkFzc2lnbm1lbnRfNSgpKTsgCiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNjU0NzoyOiAoIHJ1bGVfX1hCYXNpY0Zvckxvb3BFeHByZXNzaW9uX19FeHByZXNzaW9uQXNzaWdubWVudF81ICk/Ci0gICAgICAgICAgICBpbnQgYWx0MTMxPTI7Ci0gICAgICAgICAgICBpbnQgTEExMzFfMCA9IGlucHV0LkxBKDEpOworICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTc4ODU6MjogKCBydWxlX19YQmFzaWNGb3JMb29wRXhwcmVzc2lvbl9fRXhwcmVzc2lvbkFzc2lnbm1lbnRfNSApPworICAgICAgICAgICAgaW50IGFsdDE0ND0yOworICAgICAgICAgICAgaW50IExBMTQ0XzAgPSBpbnB1dC5MQSgxKTsKIAotICAgICAgICAgICAgaWYgKCAoKExBMTMxXzA+PVJVTEVfU1RSSU5HICYmIExBMTMxXzA8PVJVTEVfREVDSU1BTCl8fExBMTMxXzA9PTI3fHwoTEExMzFfMD49MzQgJiYgTEExMzFfMDw9MzUpfHxMQTEzMV8wPT00MHx8KExBMTMxXzA+PTQ1ICYmIExBMTMxXzA8PTUwKXx8TEExMzFfMD09NzB8fExBMTMxXzA9PTk1fHxMQTEzMV8wPT0xMTN8fChMQTEzMV8wPj0xMTcgJiYgTEExMzFfMDw9MTE4KXx8TEExMzFfMD09MTIwfHxMQTEzMV8wPT0xMjJ8fChMQTEzMV8wPj0xMjYgJiYgTEExMzFfMDw9MTMzKXx8TEExMzFfMD09MTM1fHxMQTEzMV8wPT0xNTQpICkgewotICAgICAgICAgICAgICAgIGFsdDEzMT0xOworICAgICAgICAgICAgaWYgKCAoKExBMTQ0XzA+PVJVTEVfU1RSSU5HICYmIExBMTQ0XzA8PVJVTEVfREVDSU1BTCl8fExBMTQ0XzA9PTI3fHwoTEExNDRfMD49MzQgJiYgTEExNDRfMDw9MzUpfHxMQTE0NF8wPT00MHx8KExBMTQ0XzA+PTQ1ICYmIExBMTQ0XzA8PTUwKXx8TEExNDRfMD09NzV8fExBMTQ0XzA9PTEwMnx8TEExNDRfMD09MTIzfHwoTEExNDRfMD49MTI3ICYmIExBMTQ0XzA8PTEyOCl8fExBMTQ0XzA9PTEzMHx8TEExNDRfMD09MTMyfHwoTEExNDRfMD49MTM2ICYmIExBMTQ0XzA8PTE0Myl8fExBMTQ0XzA9PTE0NXx8TEExNDRfMD09MTY2KSApIHsKKyAgICAgICAgICAgICAgICBhbHQxNDQ9MTsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHN3aXRjaCAoYWx0MTMxKSB7CisgICAgICAgICAgICBzd2l0Y2ggKGFsdDE0NCkgewogICAgICAgICAgICAgICAgIGNhc2UgMSA6Ci0gICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE2NTQ3OjM6IHJ1bGVfX1hCYXNpY0Zvckxvb3BFeHByZXNzaW9uX19FeHByZXNzaW9uQXNzaWdubWVudF81CisgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE3ODg1OjM6IHJ1bGVfX1hCYXNpY0Zvckxvb3BFeHByZXNzaW9uX19FeHByZXNzaW9uQXNzaWdubWVudF81CiAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMik7CiAgICAgICAgICAgICAgICAgICAgIHJ1bGVfX1hCYXNpY0Zvckxvb3BFeHByZXNzaW9uX19FeHByZXNzaW9uQXNzaWdubWVudF81KCk7CkBAIC01NDc2MywxNiArNTkyMjAsMTYgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YQmFzaWNGb3JMb29wRXhwcmVzc2lvbl9fR3JvdXBfXzYiCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTY1NTU6MTogcnVsZV9fWEJhc2ljRm9yTG9vcEV4cHJlc3Npb25fX0dyb3VwX182IDogcnVsZV9fWEJhc2ljRm9yTG9vcEV4cHJlc3Npb25fX0dyb3VwX182X19JbXBsIHJ1bGVfX1hCYXNpY0Zvckxvb3BFeHByZXNzaW9uX19Hcm91cF9fNyA7CisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTc4OTM6MTogcnVsZV9fWEJhc2ljRm9yTG9vcEV4cHJlc3Npb25fX0dyb3VwX182IDogcnVsZV9fWEJhc2ljRm9yTG9vcEV4cHJlc3Npb25fX0dyb3VwX182X19JbXBsIHJ1bGVfX1hCYXNpY0Zvckxvb3BFeHByZXNzaW9uX19Hcm91cF9fNyA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fWEJhc2ljRm9yTG9vcEV4cHJlc3Npb25fX0dyb3VwX182KCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE2NTU5OjE6ICggcnVsZV9fWEJhc2ljRm9yTG9vcEV4cHJlc3Npb25fX0dyb3VwX182X19JbXBsIHJ1bGVfX1hCYXNpY0Zvckxvb3BFeHByZXNzaW9uX19Hcm91cF9fNyApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNjU2MDoyOiBydWxlX19YQmFzaWNGb3JMb29wRXhwcmVzc2lvbl9fR3JvdXBfXzZfX0ltcGwgcnVsZV9fWEJhc2ljRm9yTG9vcEV4cHJlc3Npb25fX0dyb3VwX183CisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNzg5NzoxOiAoIHJ1bGVfX1hCYXNpY0Zvckxvb3BFeHByZXNzaW9uX19Hcm91cF9fNl9fSW1wbCBydWxlX19YQmFzaWNGb3JMb29wRXhwcmVzc2lvbl9fR3JvdXBfXzcgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTc4OTg6MjogcnVsZV9fWEJhc2ljRm9yTG9vcEV4cHJlc3Npb25fX0dyb3VwX182X19JbXBsIHJ1bGVfX1hCYXNpY0Zvckxvb3BFeHByZXNzaW9uX19Hcm91cF9fNwogICAgICAgICAgICAgewotICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfNzEpOworICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfNzkpOwogICAgICAgICAgICAgcnVsZV9fWEJhc2ljRm9yTG9vcEV4cHJlc3Npb25fX0dyb3VwX182X19JbXBsKCk7CiAKICAgICAgICAgICAgIHN0YXRlLl9mc3AtLTsKQEAgLTU0ODAxLDIyICs1OTI1OCwyMiBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX1hCYXNpY0Zvckxvb3BFeHByZXNzaW9uX19Hcm91cF9fNl9fSW1wbCIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNjU2NzoxOiBydWxlX19YQmFzaWNGb3JMb29wRXhwcmVzc2lvbl9fR3JvdXBfXzZfX0ltcGwgOiAoICc7JyApIDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNzkwNToxOiBydWxlX19YQmFzaWNGb3JMb29wRXhwcmVzc2lvbl9fR3JvdXBfXzZfX0ltcGwgOiAoICc7JyApIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YQmFzaWNGb3JMb29wRXhwcmVzc2lvbl9fR3JvdXBfXzZfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTY1NzE6MTogKCAoICc7JyApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE2NTcyOjE6ICggJzsnICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE3OTA5OjE6ICggKCAnOycgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNzkxMDoxOiAoICc7JyApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNjU3MjoxOiAoICc7JyApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNjU3MzoyOiAnOycKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE3OTEwOjE6ICggJzsnICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE3OTExOjI6ICc7JwogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYQmFzaWNGb3JMb29wRXhwcmVzc2lvbkFjY2VzcygpLmdldFNlbWljb2xvbktleXdvcmRfNigpKTsgCiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBtYXRjaChpbnB1dCwxMTEsRk9MTE9XXzIpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOworICAgICAgICAgICAgbWF0Y2goaW5wdXQsMTIxLEZPTExPV18yKTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRYQmFzaWNGb3JMb29wRXhwcmVzc2lvbkFjY2VzcygpLmdldFNlbWljb2xvbktleXdvcmRfNigpKTsgCiAgICAgICAgICAgICB9CkBAIC01NDg0MiwxNiArNTkyOTksMTYgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YQmFzaWNGb3JMb29wRXhwcmVzc2lvbl9fR3JvdXBfXzciCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTY1ODI6MTogcnVsZV9fWEJhc2ljRm9yTG9vcEV4cHJlc3Npb25fX0dyb3VwX183IDogcnVsZV9fWEJhc2ljRm9yTG9vcEV4cHJlc3Npb25fX0dyb3VwX183X19JbXBsIHJ1bGVfX1hCYXNpY0Zvckxvb3BFeHByZXNzaW9uX19Hcm91cF9fOCA7CisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTc5MjA6MTogcnVsZV9fWEJhc2ljRm9yTG9vcEV4cHJlc3Npb25fX0dyb3VwX183IDogcnVsZV9fWEJhc2ljRm9yTG9vcEV4cHJlc3Npb25fX0dyb3VwX183X19JbXBsIHJ1bGVfX1hCYXNpY0Zvckxvb3BFeHByZXNzaW9uX19Hcm91cF9fOCA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fWEJhc2ljRm9yTG9vcEV4cHJlc3Npb25fX0dyb3VwX183KCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE2NTg2OjE6ICggcnVsZV9fWEJhc2ljRm9yTG9vcEV4cHJlc3Npb25fX0dyb3VwX183X19JbXBsIHJ1bGVfX1hCYXNpY0Zvckxvb3BFeHByZXNzaW9uX19Hcm91cF9fOCApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNjU4NzoyOiBydWxlX19YQmFzaWNGb3JMb29wRXhwcmVzc2lvbl9fR3JvdXBfXzdfX0ltcGwgcnVsZV9fWEJhc2ljRm9yTG9vcEV4cHJlc3Npb25fX0dyb3VwX184CisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNzkyNDoxOiAoIHJ1bGVfX1hCYXNpY0Zvckxvb3BFeHByZXNzaW9uX19Hcm91cF9fN19fSW1wbCBydWxlX19YQmFzaWNGb3JMb29wRXhwcmVzc2lvbl9fR3JvdXBfXzggKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTc5MjU6MjogcnVsZV9fWEJhc2ljRm9yTG9vcEV4cHJlc3Npb25fX0dyb3VwX183X19JbXBsIHJ1bGVfX1hCYXNpY0Zvckxvb3BFeHByZXNzaW9uX19Hcm91cF9fOAogICAgICAgICAgICAgewotICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfNzEpOworICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfNzkpOwogICAgICAgICAgICAgcnVsZV9fWEJhc2ljRm9yTG9vcEV4cHJlc3Npb25fX0dyb3VwX183X19JbXBsKCk7CiAKICAgICAgICAgICAgIHN0YXRlLl9mc3AtLTsKQEAgLTU0ODgwLDMxICs1OTMzNywzMSBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX1hCYXNpY0Zvckxvb3BFeHByZXNzaW9uX19Hcm91cF9fN19fSW1wbCIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNjU5NDoxOiBydWxlX19YQmFzaWNGb3JMb29wRXhwcmVzc2lvbl9fR3JvdXBfXzdfX0ltcGwgOiAoICggcnVsZV9fWEJhc2ljRm9yTG9vcEV4cHJlc3Npb25fX0dyb3VwXzdfXzAgKT8gKSA7CisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTc5MzI6MTogcnVsZV9fWEJhc2ljRm9yTG9vcEV4cHJlc3Npb25fX0dyb3VwX183X19JbXBsIDogKCAoIHJ1bGVfX1hCYXNpY0Zvckxvb3BFeHByZXNzaW9uX19Hcm91cF83X18wICk/ICkgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1hCYXNpY0Zvckxvb3BFeHByZXNzaW9uX19Hcm91cF9fN19fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNjU5ODoxOiAoICggKCBydWxlX19YQmFzaWNGb3JMb29wRXhwcmVzc2lvbl9fR3JvdXBfN19fMCApPyApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE2NTk5OjE6ICggKCBydWxlX19YQmFzaWNGb3JMb29wRXhwcmVzc2lvbl9fR3JvdXBfN19fMCApPyApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNzkzNjoxOiAoICggKCBydWxlX19YQmFzaWNGb3JMb29wRXhwcmVzc2lvbl9fR3JvdXBfN19fMCApPyApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE3OTM3OjE6ICggKCBydWxlX19YQmFzaWNGb3JMb29wRXhwcmVzc2lvbl9fR3JvdXBfN19fMCApPyApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNjU5OToxOiAoICggcnVsZV9fWEJhc2ljRm9yTG9vcEV4cHJlc3Npb25fX0dyb3VwXzdfXzAgKT8gKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTY2MDA6MjogKCBydWxlX19YQmFzaWNGb3JMb29wRXhwcmVzc2lvbl9fR3JvdXBfN19fMCApPworICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTc5Mzc6MTogKCAoIHJ1bGVfX1hCYXNpY0Zvckxvb3BFeHByZXNzaW9uX19Hcm91cF83X18wICk/ICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE3OTM4OjI6ICggcnVsZV9fWEJhc2ljRm9yTG9vcEV4cHJlc3Npb25fX0dyb3VwXzdfXzAgKT8KICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WEJhc2ljRm9yTG9vcEV4cHJlc3Npb25BY2Nlc3MoKS5nZXRHcm91cF83KCkpOyAKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE2NjAxOjI6ICggcnVsZV9fWEJhc2ljRm9yTG9vcEV4cHJlc3Npb25fX0dyb3VwXzdfXzAgKT8KLSAgICAgICAgICAgIGludCBhbHQxMzI9MjsKLSAgICAgICAgICAgIGludCBMQTEzMl8wID0gaW5wdXQuTEEoMSk7CisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNzkzOToyOiAoIHJ1bGVfX1hCYXNpY0Zvckxvb3BFeHByZXNzaW9uX19Hcm91cF83X18wICk/CisgICAgICAgICAgICBpbnQgYWx0MTQ1PTI7CisgICAgICAgICAgICBpbnQgTEExNDVfMCA9IGlucHV0LkxBKDEpOwogCi0gICAgICAgICAgICBpZiAoICgoTEExMzJfMD49UlVMRV9TVFJJTkcgJiYgTEExMzJfMDw9UlVMRV9ERUNJTUFMKXx8TEExMzJfMD09Mjd8fChMQTEzMl8wPj0zNCAmJiBMQTEzMl8wPD0zNSl8fExBMTMyXzA9PTQwfHwoTEExMzJfMD49NDUgJiYgTEExMzJfMDw9NTApfHxMQTEzMl8wPT03MHx8TEExMzJfMD09OTV8fExBMTMyXzA9PTExM3x8KExBMTMyXzA+PTExNyAmJiBMQTEzMl8wPD0xMTgpfHxMQTEzMl8wPT0xMjB8fExBMTMyXzA9PTEyMnx8KExBMTMyXzA+PTEyNiAmJiBMQTEzMl8wPD0xMzMpfHxMQTEzMl8wPT0xMzV8fExBMTMyXzA9PTE1NCkgKSB7Ci0gICAgICAgICAgICAgICAgYWx0MTMyPTE7CisgICAgICAgICAgICBpZiAoICgoTEExNDVfMD49UlVMRV9TVFJJTkcgJiYgTEExNDVfMDw9UlVMRV9ERUNJTUFMKXx8TEExNDVfMD09Mjd8fChMQTE0NV8wPj0zNCAmJiBMQTE0NV8wPD0zNSl8fExBMTQ1XzA9PTQwfHwoTEExNDVfMD49NDUgJiYgTEExNDVfMDw9NTApfHxMQTE0NV8wPT03NXx8TEExNDVfMD09MTAyfHxMQTE0NV8wPT0xMjN8fChMQTE0NV8wPj0xMjcgJiYgTEExNDVfMDw9MTI4KXx8TEExNDVfMD09MTMwfHxMQTE0NV8wPT0xMzJ8fChMQTE0NV8wPj0xMzYgJiYgTEExNDVfMDw9MTQzKXx8TEExNDVfMD09MTQ1fHxMQTE0NV8wPT0xNjYpICkgeworICAgICAgICAgICAgICAgIGFsdDE0NT0xOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgc3dpdGNoIChhbHQxMzIpIHsKKyAgICAgICAgICAgIHN3aXRjaCAoYWx0MTQ1KSB7CiAgICAgICAgICAgICAgICAgY2FzZSAxIDoKLSAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTY2MDE6MzogcnVsZV9fWEJhc2ljRm9yTG9vcEV4cHJlc3Npb25fX0dyb3VwXzdfXzAKKyAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTc5Mzk6MzogcnVsZV9fWEJhc2ljRm9yTG9vcEV4cHJlc3Npb25fX0dyb3VwXzdfXzAKICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV18yKTsKICAgICAgICAgICAgICAgICAgICAgcnVsZV9fWEJhc2ljRm9yTG9vcEV4cHJlc3Npb25fX0dyb3VwXzdfXzAoKTsKQEAgLTU0OTQyLDE2ICs1OTM5OSwxNiBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX1hCYXNpY0Zvckxvb3BFeHByZXNzaW9uX19Hcm91cF9fOCIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNjYwOToxOiBydWxlX19YQmFzaWNGb3JMb29wRXhwcmVzc2lvbl9fR3JvdXBfXzggOiBydWxlX19YQmFzaWNGb3JMb29wRXhwcmVzc2lvbl9fR3JvdXBfXzhfX0ltcGwgcnVsZV9fWEJhc2ljRm9yTG9vcEV4cHJlc3Npb25fX0dyb3VwX185IDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNzk0NzoxOiBydWxlX19YQmFzaWNGb3JMb29wRXhwcmVzc2lvbl9fR3JvdXBfXzggOiBydWxlX19YQmFzaWNGb3JMb29wRXhwcmVzc2lvbl9fR3JvdXBfXzhfX0ltcGwgcnVsZV9fWEJhc2ljRm9yTG9vcEV4cHJlc3Npb25fX0dyb3VwX185IDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YQmFzaWNGb3JMb29wRXhwcmVzc2lvbl9fR3JvdXBfXzgoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTY2MTM6MTogKCBydWxlX19YQmFzaWNGb3JMb29wRXhwcmVzc2lvbl9fR3JvdXBfXzhfX0ltcGwgcnVsZV9fWEJhc2ljRm9yTG9vcEV4cHJlc3Npb25fX0dyb3VwX185ICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE2NjE0OjI6IHJ1bGVfX1hCYXNpY0Zvckxvb3BFeHByZXNzaW9uX19Hcm91cF9fOF9fSW1wbCBydWxlX19YQmFzaWNGb3JMb29wRXhwcmVzc2lvbl9fR3JvdXBfXzkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE3OTUxOjE6ICggcnVsZV9fWEJhc2ljRm9yTG9vcEV4cHJlc3Npb25fX0dyb3VwX184X19JbXBsIHJ1bGVfX1hCYXNpY0Zvckxvb3BFeHByZXNzaW9uX19Hcm91cF9fOSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNzk1MjoyOiBydWxlX19YQmFzaWNGb3JMb29wRXhwcmVzc2lvbl9fR3JvdXBfXzhfX0ltcGwgcnVsZV9fWEJhc2ljRm9yTG9vcEV4cHJlc3Npb25fX0dyb3VwX185CiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV183NCk7CisgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV184Mik7CiAgICAgICAgICAgICBydWxlX19YQmFzaWNGb3JMb29wRXhwcmVzc2lvbl9fR3JvdXBfXzhfX0ltcGwoKTsKIAogICAgICAgICAgICAgc3RhdGUuX2ZzcC0tOwpAQCAtNTQ5ODAsMjIgKzU5NDM3LDIyIEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fWEJhc2ljRm9yTG9vcEV4cHJlc3Npb25fX0dyb3VwX184X19JbXBsIgotICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE2NjIxOjE6IHJ1bGVfX1hCYXNpY0Zvckxvb3BFeHByZXNzaW9uX19Hcm91cF9fOF9fSW1wbCA6ICggJyknICkgOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE3OTU5OjE6IHJ1bGVfX1hCYXNpY0Zvckxvb3BFeHByZXNzaW9uX19Hcm91cF9fOF9fSW1wbCA6ICggJyknICkgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1hCYXNpY0Zvckxvb3BFeHByZXNzaW9uX19Hcm91cF9fOF9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNjYyNToxOiAoICggJyknICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTY2MjY6MTogKCAnKScgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTc5NjM6MTogKCAoICcpJyApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE3OTY0OjE6ICggJyknICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE2NjI2OjE6ICggJyknICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE2NjI3OjI6ICcpJworICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTc5NjQ6MTogKCAnKScgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTc5NjU6MjogJyknCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhCYXNpY0Zvckxvb3BFeHByZXNzaW9uQWNjZXNzKCkuZ2V0UmlnaHRQYXJlbnRoZXNpc0tleXdvcmRfOCgpKTsgCiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBtYXRjaChpbnB1dCwxMTQsRk9MTE9XXzIpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOworICAgICAgICAgICAgbWF0Y2goaW5wdXQsMTI0LEZPTExPV18yKTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRYQmFzaWNGb3JMb29wRXhwcmVzc2lvbkFjY2VzcygpLmdldFJpZ2h0UGFyZW50aGVzaXNLZXl3b3JkXzgoKSk7IAogICAgICAgICAgICAgfQpAQCAtNTUwMjEsMTQgKzU5NDc4LDE0IEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fWEJhc2ljRm9yTG9vcEV4cHJlc3Npb25fX0dyb3VwX185IgotICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE2NjM2OjE6IHJ1bGVfX1hCYXNpY0Zvckxvb3BFeHByZXNzaW9uX19Hcm91cF9fOSA6IHJ1bGVfX1hCYXNpY0Zvckxvb3BFeHByZXNzaW9uX19Hcm91cF9fOV9fSW1wbCA7CisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTc5NzQ6MTogcnVsZV9fWEJhc2ljRm9yTG9vcEV4cHJlc3Npb25fX0dyb3VwX185IDogcnVsZV9fWEJhc2ljRm9yTG9vcEV4cHJlc3Npb25fX0dyb3VwX185X19JbXBsIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YQmFzaWNGb3JMb29wRXhwcmVzc2lvbl9fR3JvdXBfXzkoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTY2NDA6MTogKCBydWxlX19YQmFzaWNGb3JMb29wRXhwcmVzc2lvbl9fR3JvdXBfXzlfX0ltcGwgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTY2NDE6MjogcnVsZV9fWEJhc2ljRm9yTG9vcEV4cHJlc3Npb25fX0dyb3VwX185X19JbXBsCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNzk3ODoxOiAoIHJ1bGVfX1hCYXNpY0Zvckxvb3BFeHByZXNzaW9uX19Hcm91cF9fOV9fSW1wbCApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNzk3OToyOiBydWxlX19YQmFzaWNGb3JMb29wRXhwcmVzc2lvbl9fR3JvdXBfXzlfX0ltcGwKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzIpOwogICAgICAgICAgICAgcnVsZV9fWEJhc2ljRm9yTG9vcEV4cHJlc3Npb25fX0dyb3VwX185X19JbXBsKCk7CkBAIC01NTA1NCwyMyArNTk1MTEsMjMgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YQmFzaWNGb3JMb29wRXhwcmVzc2lvbl9fR3JvdXBfXzlfX0ltcGwiCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTY2NDc6MTogcnVsZV9fWEJhc2ljRm9yTG9vcEV4cHJlc3Npb25fX0dyb3VwX185X19JbXBsIDogKCAoIHJ1bGVfX1hCYXNpY0Zvckxvb3BFeHByZXNzaW9uX19FYWNoRXhwcmVzc2lvbkFzc2lnbm1lbnRfOSApICkgOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE3OTg1OjE6IHJ1bGVfX1hCYXNpY0Zvckxvb3BFeHByZXNzaW9uX19Hcm91cF9fOV9fSW1wbCA6ICggKCBydWxlX19YQmFzaWNGb3JMb29wRXhwcmVzc2lvbl9fRWFjaEV4cHJlc3Npb25Bc3NpZ25tZW50XzkgKSApIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YQmFzaWNGb3JMb29wRXhwcmVzc2lvbl9fR3JvdXBfXzlfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTY2NTE6MTogKCAoICggcnVsZV9fWEJhc2ljRm9yTG9vcEV4cHJlc3Npb25fX0VhY2hFeHByZXNzaW9uQXNzaWdubWVudF85ICkgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNjY1MjoxOiAoICggcnVsZV9fWEJhc2ljRm9yTG9vcEV4cHJlc3Npb25fX0VhY2hFeHByZXNzaW9uQXNzaWdubWVudF85ICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTc5ODk6MTogKCAoICggcnVsZV9fWEJhc2ljRm9yTG9vcEV4cHJlc3Npb25fX0VhY2hFeHByZXNzaW9uQXNzaWdubWVudF85ICkgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNzk5MDoxOiAoICggcnVsZV9fWEJhc2ljRm9yTG9vcEV4cHJlc3Npb25fX0VhY2hFeHByZXNzaW9uQXNzaWdubWVudF85ICkgKQogICAgICAgICAgICAgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTY2NTI6MTogKCAoIHJ1bGVfX1hCYXNpY0Zvckxvb3BFeHByZXNzaW9uX19FYWNoRXhwcmVzc2lvbkFzc2lnbm1lbnRfOSApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE2NjUzOjI6ICggcnVsZV9fWEJhc2ljRm9yTG9vcEV4cHJlc3Npb25fX0VhY2hFeHByZXNzaW9uQXNzaWdubWVudF85ICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE3OTkwOjE6ICggKCBydWxlX19YQmFzaWNGb3JMb29wRXhwcmVzc2lvbl9fRWFjaEV4cHJlc3Npb25Bc3NpZ25tZW50XzkgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNzk5MToyOiAoIHJ1bGVfX1hCYXNpY0Zvckxvb3BFeHByZXNzaW9uX19FYWNoRXhwcmVzc2lvbkFzc2lnbm1lbnRfOSApCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhCYXNpY0Zvckxvb3BFeHByZXNzaW9uQWNjZXNzKCkuZ2V0RWFjaEV4cHJlc3Npb25Bc3NpZ25tZW50XzkoKSk7IAogICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTY2NTQ6MjogKCBydWxlX19YQmFzaWNGb3JMb29wRXhwcmVzc2lvbl9fRWFjaEV4cHJlc3Npb25Bc3NpZ25tZW50XzkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTY2NTQ6MzogcnVsZV9fWEJhc2ljRm9yTG9vcEV4cHJlc3Npb25fX0VhY2hFeHByZXNzaW9uQXNzaWdubWVudF85CisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNzk5MjoyOiAoIHJ1bGVfX1hCYXNpY0Zvckxvb3BFeHByZXNzaW9uX19FYWNoRXhwcmVzc2lvbkFzc2lnbm1lbnRfOSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNzk5MjozOiBydWxlX19YQmFzaWNGb3JMb29wRXhwcmVzc2lvbl9fRWFjaEV4cHJlc3Npb25Bc3NpZ25tZW50XzkKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzIpOwogICAgICAgICAgICAgcnVsZV9fWEJhc2ljRm9yTG9vcEV4cHJlc3Npb25fX0VhY2hFeHByZXNzaW9uQXNzaWdubWVudF85KCk7CkBAIC01NTEwNSwxNiArNTk1NjIsMTYgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YQmFzaWNGb3JMb29wRXhwcmVzc2lvbl9fR3JvdXBfM19fMCIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNjY2MzoxOiBydWxlX19YQmFzaWNGb3JMb29wRXhwcmVzc2lvbl9fR3JvdXBfM19fMCA6IHJ1bGVfX1hCYXNpY0Zvckxvb3BFeHByZXNzaW9uX19Hcm91cF8zX18wX19JbXBsIHJ1bGVfX1hCYXNpY0Zvckxvb3BFeHByZXNzaW9uX19Hcm91cF8zX18xIDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxODAwMToxOiBydWxlX19YQmFzaWNGb3JMb29wRXhwcmVzc2lvbl9fR3JvdXBfM19fMCA6IHJ1bGVfX1hCYXNpY0Zvckxvb3BFeHByZXNzaW9uX19Hcm91cF8zX18wX19JbXBsIHJ1bGVfX1hCYXNpY0Zvckxvb3BFeHByZXNzaW9uX19Hcm91cF8zX18xIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YQmFzaWNGb3JMb29wRXhwcmVzc2lvbl9fR3JvdXBfM19fMCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNjY2NzoxOiAoIHJ1bGVfX1hCYXNpY0Zvckxvb3BFeHByZXNzaW9uX19Hcm91cF8zX18wX19JbXBsIHJ1bGVfX1hCYXNpY0Zvckxvb3BFeHByZXNzaW9uX19Hcm91cF8zX18xICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE2NjY4OjI6IHJ1bGVfX1hCYXNpY0Zvckxvb3BFeHByZXNzaW9uX19Hcm91cF8zX18wX19JbXBsIHJ1bGVfX1hCYXNpY0Zvckxvb3BFeHByZXNzaW9uX19Hcm91cF8zX18xCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxODAwNToxOiAoIHJ1bGVfX1hCYXNpY0Zvckxvb3BFeHByZXNzaW9uX19Hcm91cF8zX18wX19JbXBsIHJ1bGVfX1hCYXNpY0Zvckxvb3BFeHByZXNzaW9uX19Hcm91cF8zX18xICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE4MDA2OjI6IHJ1bGVfX1hCYXNpY0Zvckxvb3BFeHByZXNzaW9uX19Hcm91cF8zX18wX19JbXBsIHJ1bGVfX1hCYXNpY0Zvckxvb3BFeHByZXNzaW9uX19Hcm91cF8zX18xCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV183Mik7CisgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV184MCk7CiAgICAgICAgICAgICBydWxlX19YQmFzaWNGb3JMb29wRXhwcmVzc2lvbl9fR3JvdXBfM19fMF9fSW1wbCgpOwogCiAgICAgICAgICAgICBzdGF0ZS5fZnNwLS07CkBAIC01NTE0MywyMyArNTk2MDAsMjMgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YQmFzaWNGb3JMb29wRXhwcmVzc2lvbl9fR3JvdXBfM19fMF9fSW1wbCIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNjY3NToxOiBydWxlX19YQmFzaWNGb3JMb29wRXhwcmVzc2lvbl9fR3JvdXBfM19fMF9fSW1wbCA6ICggKCBydWxlX19YQmFzaWNGb3JMb29wRXhwcmVzc2lvbl9fSW5pdEV4cHJlc3Npb25zQXNzaWdubWVudF8zXzAgKSApIDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxODAxMzoxOiBydWxlX19YQmFzaWNGb3JMb29wRXhwcmVzc2lvbl9fR3JvdXBfM19fMF9fSW1wbCA6ICggKCBydWxlX19YQmFzaWNGb3JMb29wRXhwcmVzc2lvbl9fSW5pdEV4cHJlc3Npb25zQXNzaWdubWVudF8zXzAgKSApIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YQmFzaWNGb3JMb29wRXhwcmVzc2lvbl9fR3JvdXBfM19fMF9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNjY3OToxOiAoICggKCBydWxlX19YQmFzaWNGb3JMb29wRXhwcmVzc2lvbl9fSW5pdEV4cHJlc3Npb25zQXNzaWdubWVudF8zXzAgKSApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE2NjgwOjE6ICggKCBydWxlX19YQmFzaWNGb3JMb29wRXhwcmVzc2lvbl9fSW5pdEV4cHJlc3Npb25zQXNzaWdubWVudF8zXzAgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxODAxNzoxOiAoICggKCBydWxlX19YQmFzaWNGb3JMb29wRXhwcmVzc2lvbl9fSW5pdEV4cHJlc3Npb25zQXNzaWdubWVudF8zXzAgKSApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE4MDE4OjE6ICggKCBydWxlX19YQmFzaWNGb3JMb29wRXhwcmVzc2lvbl9fSW5pdEV4cHJlc3Npb25zQXNzaWdubWVudF8zXzAgKSApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNjY4MDoxOiAoICggcnVsZV9fWEJhc2ljRm9yTG9vcEV4cHJlc3Npb25fX0luaXRFeHByZXNzaW9uc0Fzc2lnbm1lbnRfM18wICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTY2ODE6MjogKCBydWxlX19YQmFzaWNGb3JMb29wRXhwcmVzc2lvbl9fSW5pdEV4cHJlc3Npb25zQXNzaWdubWVudF8zXzAgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTgwMTg6MTogKCAoIHJ1bGVfX1hCYXNpY0Zvckxvb3BFeHByZXNzaW9uX19Jbml0RXhwcmVzc2lvbnNBc3NpZ25tZW50XzNfMCApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE4MDE5OjI6ICggcnVsZV9fWEJhc2ljRm9yTG9vcEV4cHJlc3Npb25fX0luaXRFeHByZXNzaW9uc0Fzc2lnbm1lbnRfM18wICkKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WEJhc2ljRm9yTG9vcEV4cHJlc3Npb25BY2Nlc3MoKS5nZXRJbml0RXhwcmVzc2lvbnNBc3NpZ25tZW50XzNfMCgpKTsgCiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNjY4MjoyOiAoIHJ1bGVfX1hCYXNpY0Zvckxvb3BFeHByZXNzaW9uX19Jbml0RXhwcmVzc2lvbnNBc3NpZ25tZW50XzNfMCApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNjY4MjozOiBydWxlX19YQmFzaWNGb3JMb29wRXhwcmVzc2lvbl9fSW5pdEV4cHJlc3Npb25zQXNzaWdubWVudF8zXzAKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE4MDIwOjI6ICggcnVsZV9fWEJhc2ljRm9yTG9vcEV4cHJlc3Npb25fX0luaXRFeHByZXNzaW9uc0Fzc2lnbm1lbnRfM18wICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE4MDIwOjM6IHJ1bGVfX1hCYXNpY0Zvckxvb3BFeHByZXNzaW9uX19Jbml0RXhwcmVzc2lvbnNBc3NpZ25tZW50XzNfMAogICAgICAgICAgICAgewogICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMik7CiAgICAgICAgICAgICBydWxlX19YQmFzaWNGb3JMb29wRXhwcmVzc2lvbl9fSW5pdEV4cHJlc3Npb25zQXNzaWdubWVudF8zXzAoKTsKQEAgLTU1MTk0LDE0ICs1OTY1MSwxNCBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX1hCYXNpY0Zvckxvb3BFeHByZXNzaW9uX19Hcm91cF8zX18xIgotICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE2NjkwOjE6IHJ1bGVfX1hCYXNpY0Zvckxvb3BFeHByZXNzaW9uX19Hcm91cF8zX18xIDogcnVsZV9fWEJhc2ljRm9yTG9vcEV4cHJlc3Npb25fX0dyb3VwXzNfXzFfX0ltcGwgOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE4MDI4OjE6IHJ1bGVfX1hCYXNpY0Zvckxvb3BFeHByZXNzaW9uX19Hcm91cF8zX18xIDogcnVsZV9fWEJhc2ljRm9yTG9vcEV4cHJlc3Npb25fX0dyb3VwXzNfXzFfX0ltcGwgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1hCYXNpY0Zvckxvb3BFeHByZXNzaW9uX19Hcm91cF8zX18xKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE2Njk0OjE6ICggcnVsZV9fWEJhc2ljRm9yTG9vcEV4cHJlc3Npb25fX0dyb3VwXzNfXzFfX0ltcGwgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTY2OTU6MjogcnVsZV9fWEJhc2ljRm9yTG9vcEV4cHJlc3Npb25fX0dyb3VwXzNfXzFfX0ltcGwKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE4MDMyOjE6ICggcnVsZV9fWEJhc2ljRm9yTG9vcEV4cHJlc3Npb25fX0dyb3VwXzNfXzFfX0ltcGwgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTgwMzM6MjogcnVsZV9fWEJhc2ljRm9yTG9vcEV4cHJlc3Npb25fX0dyb3VwXzNfXzFfX0ltcGwKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzIpOwogICAgICAgICAgICAgcnVsZV9fWEJhc2ljRm9yTG9vcEV4cHJlc3Npb25fX0dyb3VwXzNfXzFfX0ltcGwoKTsKQEAgLTU1MjI3LDM3ICs1OTY4NCwzNyBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX1hCYXNpY0Zvckxvb3BFeHByZXNzaW9uX19Hcm91cF8zX18xX19JbXBsIgotICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE2NzAxOjE6IHJ1bGVfX1hCYXNpY0Zvckxvb3BFeHByZXNzaW9uX19Hcm91cF8zX18xX19JbXBsIDogKCAoIHJ1bGVfX1hCYXNpY0Zvckxvb3BFeHByZXNzaW9uX19Hcm91cF8zXzFfXzAgKSogKSA7CisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTgwMzk6MTogcnVsZV9fWEJhc2ljRm9yTG9vcEV4cHJlc3Npb25fX0dyb3VwXzNfXzFfX0ltcGwgOiAoICggcnVsZV9fWEJhc2ljRm9yTG9vcEV4cHJlc3Npb25fX0dyb3VwXzNfMV9fMCApKiApIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YQmFzaWNGb3JMb29wRXhwcmVzc2lvbl9fR3JvdXBfM19fMV9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNjcwNToxOiAoICggKCBydWxlX19YQmFzaWNGb3JMb29wRXhwcmVzc2lvbl9fR3JvdXBfM18xX18wICkqICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTY3MDY6MTogKCAoIHJ1bGVfX1hCYXNpY0Zvckxvb3BFeHByZXNzaW9uX19Hcm91cF8zXzFfXzAgKSogKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTgwNDM6MTogKCAoICggcnVsZV9fWEJhc2ljRm9yTG9vcEV4cHJlc3Npb25fX0dyb3VwXzNfMV9fMCApKiApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE4MDQ0OjE6ICggKCBydWxlX19YQmFzaWNGb3JMb29wRXhwcmVzc2lvbl9fR3JvdXBfM18xX18wICkqICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE2NzA2OjE6ICggKCBydWxlX19YQmFzaWNGb3JMb29wRXhwcmVzc2lvbl9fR3JvdXBfM18xX18wICkqICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE2NzA3OjI6ICggcnVsZV9fWEJhc2ljRm9yTG9vcEV4cHJlc3Npb25fX0dyb3VwXzNfMV9fMCApKgorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTgwNDQ6MTogKCAoIHJ1bGVfX1hCYXNpY0Zvckxvb3BFeHByZXNzaW9uX19Hcm91cF8zXzFfXzAgKSogKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTgwNDU6MjogKCBydWxlX19YQmFzaWNGb3JMb29wRXhwcmVzc2lvbl9fR3JvdXBfM18xX18wICkqCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhCYXNpY0Zvckxvb3BFeHByZXNzaW9uQWNjZXNzKCkuZ2V0R3JvdXBfM18xKCkpOyAKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE2NzA4OjI6ICggcnVsZV9fWEJhc2ljRm9yTG9vcEV4cHJlc3Npb25fX0dyb3VwXzNfMV9fMCApKgotICAgICAgICAgICAgbG9vcDEzMzoKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE4MDQ2OjI6ICggcnVsZV9fWEJhc2ljRm9yTG9vcEV4cHJlc3Npb25fX0dyb3VwXzNfMV9fMCApKgorICAgICAgICAgICAgbG9vcDE0NjoKICAgICAgICAgICAgIGRvIHsKLSAgICAgICAgICAgICAgICBpbnQgYWx0MTMzPTI7Ci0gICAgICAgICAgICAgICAgaW50IExBMTMzXzAgPSBpbnB1dC5MQSgxKTsKKyAgICAgICAgICAgICAgICBpbnQgYWx0MTQ2PTI7CisgICAgICAgICAgICAgICAgaW50IExBMTQ2XzAgPSBpbnB1dC5MQSgxKTsKIAotICAgICAgICAgICAgICAgIGlmICggKExBMTMzXzA9PTExNSkgKSB7Ci0gICAgICAgICAgICAgICAgICAgIGFsdDEzMz0xOworICAgICAgICAgICAgICAgIGlmICggKExBMTQ2XzA9PTEyNSkgKSB7CisgICAgICAgICAgICAgICAgICAgIGFsdDE0Nj0xOwogICAgICAgICAgICAgICAgIH0KIAogCi0gICAgICAgICAgICAgICAgc3dpdGNoIChhbHQxMzMpIHsKKyAgICAgICAgICAgICAgICBzd2l0Y2ggKGFsdDE0NikgewogICAgICAgICAgICAgCWNhc2UgMSA6Ci0gICAgICAgICAgICAJICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE2NzA4OjM6IHJ1bGVfX1hCYXNpY0Zvckxvb3BFeHByZXNzaW9uX19Hcm91cF8zXzFfXzAKKyAgICAgICAgICAgIAkgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTgwNDY6MzogcnVsZV9fWEJhc2ljRm9yTG9vcEV4cHJlc3Npb25fX0dyb3VwXzNfMV9fMAogICAgICAgICAgICAgCSAgICB7Ci0gICAgICAgICAgICAJICAgIHB1c2hGb2xsb3coRk9MTE9XXzczKTsKKyAgICAgICAgICAgIAkgICAgcHVzaEZvbGxvdyhGT0xMT1dfODEpOwogICAgICAgICAgICAgCSAgICBydWxlX19YQmFzaWNGb3JMb29wRXhwcmVzc2lvbl9fR3JvdXBfM18xX18wKCk7CiAKICAgICAgICAgICAgIAkgICAgc3RhdGUuX2ZzcC0tOwpAQCAtNTUyNjcsNyArNTk3MjQsNyBAQAogICAgICAgICAgICAgCSAgICBicmVhazsKIAogICAgICAgICAgICAgCWRlZmF1bHQgOgotICAgICAgICAgICAgCSAgICBicmVhayBsb29wMTMzOworICAgICAgICAgICAgCSAgICBicmVhayBsb29wMTQ2OwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0gd2hpbGUgKHRydWUpOwogCkBAIC01NTI5NiwxNiArNTk3NTMsMTYgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YQmFzaWNGb3JMb29wRXhwcmVzc2lvbl9fR3JvdXBfM18xX18wIgotICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE2NzE3OjE6IHJ1bGVfX1hCYXNpY0Zvckxvb3BFeHByZXNzaW9uX19Hcm91cF8zXzFfXzAgOiBydWxlX19YQmFzaWNGb3JMb29wRXhwcmVzc2lvbl9fR3JvdXBfM18xX18wX19JbXBsIHJ1bGVfX1hCYXNpY0Zvckxvb3BFeHByZXNzaW9uX19Hcm91cF8zXzFfXzEgOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE4MDU1OjE6IHJ1bGVfX1hCYXNpY0Zvckxvb3BFeHByZXNzaW9uX19Hcm91cF8zXzFfXzAgOiBydWxlX19YQmFzaWNGb3JMb29wRXhwcmVzc2lvbl9fR3JvdXBfM18xX18wX19JbXBsIHJ1bGVfX1hCYXNpY0Zvckxvb3BFeHByZXNzaW9uX19Hcm91cF8zXzFfXzEgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1hCYXNpY0Zvckxvb3BFeHByZXNzaW9uX19Hcm91cF8zXzFfXzAoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTY3MjE6MTogKCBydWxlX19YQmFzaWNGb3JMb29wRXhwcmVzc2lvbl9fR3JvdXBfM18xX18wX19JbXBsIHJ1bGVfX1hCYXNpY0Zvckxvb3BFeHByZXNzaW9uX19Hcm91cF8zXzFfXzEgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTY3MjI6MjogcnVsZV9fWEJhc2ljRm9yTG9vcEV4cHJlc3Npb25fX0dyb3VwXzNfMV9fMF9fSW1wbCBydWxlX19YQmFzaWNGb3JMb29wRXhwcmVzc2lvbl9fR3JvdXBfM18xX18xCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxODA1OToxOiAoIHJ1bGVfX1hCYXNpY0Zvckxvb3BFeHByZXNzaW9uX19Hcm91cF8zXzFfXzBfX0ltcGwgcnVsZV9fWEJhc2ljRm9yTG9vcEV4cHJlc3Npb25fX0dyb3VwXzNfMV9fMSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxODA2MDoyOiBydWxlX19YQmFzaWNGb3JMb29wRXhwcmVzc2lvbl9fR3JvdXBfM18xX18wX19JbXBsIHJ1bGVfX1hCYXNpY0Zvckxvb3BFeHByZXNzaW9uX19Hcm91cF8zXzFfXzEKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzEyOSk7CisgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV18xMzcpOwogICAgICAgICAgICAgcnVsZV9fWEJhc2ljRm9yTG9vcEV4cHJlc3Npb25fX0dyb3VwXzNfMV9fMF9fSW1wbCgpOwogCiAgICAgICAgICAgICBzdGF0ZS5fZnNwLS07CkBAIC01NTMzNCwyMiArNTk3OTEsMjIgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YQmFzaWNGb3JMb29wRXhwcmVzc2lvbl9fR3JvdXBfM18xX18wX19JbXBsIgotICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE2NzI5OjE6IHJ1bGVfX1hCYXNpY0Zvckxvb3BFeHByZXNzaW9uX19Hcm91cF8zXzFfXzBfX0ltcGwgOiAoICcsJyApIDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxODA2NzoxOiBydWxlX19YQmFzaWNGb3JMb29wRXhwcmVzc2lvbl9fR3JvdXBfM18xX18wX19JbXBsIDogKCAnLCcgKSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fWEJhc2ljRm9yTG9vcEV4cHJlc3Npb25fX0dyb3VwXzNfMV9fMF9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNjczMzoxOiAoICggJywnICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTY3MzQ6MTogKCAnLCcgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTgwNzE6MTogKCAoICcsJyApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE4MDcyOjE6ICggJywnICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE2NzM0OjE6ICggJywnICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE2NzM1OjI6ICcsJworICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTgwNzI6MTogKCAnLCcgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTgwNzM6MjogJywnCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhCYXNpY0Zvckxvb3BFeHByZXNzaW9uQWNjZXNzKCkuZ2V0Q29tbWFLZXl3b3JkXzNfMV8wKCkpOyAKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1hdGNoKGlucHV0LDExNSxGT0xMT1dfMik7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CisgICAgICAgICAgICBtYXRjaChpbnB1dCwxMjUsRk9MTE9XXzIpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOwogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBhZnRlcihncmFtbWFyQWNjZXNzLmdldFhCYXNpY0Zvckxvb3BFeHByZXNzaW9uQWNjZXNzKCkuZ2V0Q29tbWFLZXl3b3JkXzNfMV8wKCkpOyAKICAgICAgICAgICAgIH0KQEAgLTU1Mzc1LDE0ICs1OTgzMiwxNCBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX1hCYXNpY0Zvckxvb3BFeHByZXNzaW9uX19Hcm91cF8zXzFfXzEiCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTY3NDQ6MTogcnVsZV9fWEJhc2ljRm9yTG9vcEV4cHJlc3Npb25fX0dyb3VwXzNfMV9fMSA6IHJ1bGVfX1hCYXNpY0Zvckxvb3BFeHByZXNzaW9uX19Hcm91cF8zXzFfXzFfX0ltcGwgOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE4MDgyOjE6IHJ1bGVfX1hCYXNpY0Zvckxvb3BFeHByZXNzaW9uX19Hcm91cF8zXzFfXzEgOiBydWxlX19YQmFzaWNGb3JMb29wRXhwcmVzc2lvbl9fR3JvdXBfM18xX18xX19JbXBsIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YQmFzaWNGb3JMb29wRXhwcmVzc2lvbl9fR3JvdXBfM18xX18xKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE2NzQ4OjE6ICggcnVsZV9fWEJhc2ljRm9yTG9vcEV4cHJlc3Npb25fX0dyb3VwXzNfMV9fMV9fSW1wbCApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNjc0OToyOiBydWxlX19YQmFzaWNGb3JMb29wRXhwcmVzc2lvbl9fR3JvdXBfM18xX18xX19JbXBsCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxODA4NjoxOiAoIHJ1bGVfX1hCYXNpY0Zvckxvb3BFeHByZXNzaW9uX19Hcm91cF8zXzFfXzFfX0ltcGwgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTgwODc6MjogcnVsZV9fWEJhc2ljRm9yTG9vcEV4cHJlc3Npb25fX0dyb3VwXzNfMV9fMV9fSW1wbAogICAgICAgICAgICAgewogICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMik7CiAgICAgICAgICAgICBydWxlX19YQmFzaWNGb3JMb29wRXhwcmVzc2lvbl9fR3JvdXBfM18xX18xX19JbXBsKCk7CkBAIC01NTQwOCwyMyArNTk4NjUsMjMgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YQmFzaWNGb3JMb29wRXhwcmVzc2lvbl9fR3JvdXBfM18xX18xX19JbXBsIgotICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE2NzU1OjE6IHJ1bGVfX1hCYXNpY0Zvckxvb3BFeHByZXNzaW9uX19Hcm91cF8zXzFfXzFfX0ltcGwgOiAoICggcnVsZV9fWEJhc2ljRm9yTG9vcEV4cHJlc3Npb25fX0luaXRFeHByZXNzaW9uc0Fzc2lnbm1lbnRfM18xXzEgKSApIDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxODA5MzoxOiBydWxlX19YQmFzaWNGb3JMb29wRXhwcmVzc2lvbl9fR3JvdXBfM18xX18xX19JbXBsIDogKCAoIHJ1bGVfX1hCYXNpY0Zvckxvb3BFeHByZXNzaW9uX19Jbml0RXhwcmVzc2lvbnNBc3NpZ25tZW50XzNfMV8xICkgKSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fWEJhc2ljRm9yTG9vcEV4cHJlc3Npb25fX0dyb3VwXzNfMV9fMV9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNjc1OToxOiAoICggKCBydWxlX19YQmFzaWNGb3JMb29wRXhwcmVzc2lvbl9fSW5pdEV4cHJlc3Npb25zQXNzaWdubWVudF8zXzFfMSApICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTY3NjA6MTogKCAoIHJ1bGVfX1hCYXNpY0Zvckxvb3BFeHByZXNzaW9uX19Jbml0RXhwcmVzc2lvbnNBc3NpZ25tZW50XzNfMV8xICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTgwOTc6MTogKCAoICggcnVsZV9fWEJhc2ljRm9yTG9vcEV4cHJlc3Npb25fX0luaXRFeHByZXNzaW9uc0Fzc2lnbm1lbnRfM18xXzEgKSApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE4MDk4OjE6ICggKCBydWxlX19YQmFzaWNGb3JMb29wRXhwcmVzc2lvbl9fSW5pdEV4cHJlc3Npb25zQXNzaWdubWVudF8zXzFfMSApICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE2NzYwOjE6ICggKCBydWxlX19YQmFzaWNGb3JMb29wRXhwcmVzc2lvbl9fSW5pdEV4cHJlc3Npb25zQXNzaWdubWVudF8zXzFfMSApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE2NzYxOjI6ICggcnVsZV9fWEJhc2ljRm9yTG9vcEV4cHJlc3Npb25fX0luaXRFeHByZXNzaW9uc0Fzc2lnbm1lbnRfM18xXzEgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTgwOTg6MTogKCAoIHJ1bGVfX1hCYXNpY0Zvckxvb3BFeHByZXNzaW9uX19Jbml0RXhwcmVzc2lvbnNBc3NpZ25tZW50XzNfMV8xICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTgwOTk6MjogKCBydWxlX19YQmFzaWNGb3JMb29wRXhwcmVzc2lvbl9fSW5pdEV4cHJlc3Npb25zQXNzaWdubWVudF8zXzFfMSApCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhCYXNpY0Zvckxvb3BFeHByZXNzaW9uQWNjZXNzKCkuZ2V0SW5pdEV4cHJlc3Npb25zQXNzaWdubWVudF8zXzFfMSgpKTsgCiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNjc2MjoyOiAoIHJ1bGVfX1hCYXNpY0Zvckxvb3BFeHByZXNzaW9uX19Jbml0RXhwcmVzc2lvbnNBc3NpZ25tZW50XzNfMV8xICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE2NzYyOjM6IHJ1bGVfX1hCYXNpY0Zvckxvb3BFeHByZXNzaW9uX19Jbml0RXhwcmVzc2lvbnNBc3NpZ25tZW50XzNfMV8xCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxODEwMDoyOiAoIHJ1bGVfX1hCYXNpY0Zvckxvb3BFeHByZXNzaW9uX19Jbml0RXhwcmVzc2lvbnNBc3NpZ25tZW50XzNfMV8xICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE4MTAwOjM6IHJ1bGVfX1hCYXNpY0Zvckxvb3BFeHByZXNzaW9uX19Jbml0RXhwcmVzc2lvbnNBc3NpZ25tZW50XzNfMV8xCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV18yKTsKICAgICAgICAgICAgIHJ1bGVfX1hCYXNpY0Zvckxvb3BFeHByZXNzaW9uX19Jbml0RXhwcmVzc2lvbnNBc3NpZ25tZW50XzNfMV8xKCk7CkBAIC01NTQ1OSwxNiArNTk5MTYsMTYgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YQmFzaWNGb3JMb29wRXhwcmVzc2lvbl9fR3JvdXBfN19fMCIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNjc3MToxOiBydWxlX19YQmFzaWNGb3JMb29wRXhwcmVzc2lvbl9fR3JvdXBfN19fMCA6IHJ1bGVfX1hCYXNpY0Zvckxvb3BFeHByZXNzaW9uX19Hcm91cF83X18wX19JbXBsIHJ1bGVfX1hCYXNpY0Zvckxvb3BFeHByZXNzaW9uX19Hcm91cF83X18xIDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxODEwOToxOiBydWxlX19YQmFzaWNGb3JMb29wRXhwcmVzc2lvbl9fR3JvdXBfN19fMCA6IHJ1bGVfX1hCYXNpY0Zvckxvb3BFeHByZXNzaW9uX19Hcm91cF83X18wX19JbXBsIHJ1bGVfX1hCYXNpY0Zvckxvb3BFeHByZXNzaW9uX19Hcm91cF83X18xIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YQmFzaWNGb3JMb29wRXhwcmVzc2lvbl9fR3JvdXBfN19fMCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNjc3NToxOiAoIHJ1bGVfX1hCYXNpY0Zvckxvb3BFeHByZXNzaW9uX19Hcm91cF83X18wX19JbXBsIHJ1bGVfX1hCYXNpY0Zvckxvb3BFeHByZXNzaW9uX19Hcm91cF83X18xICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE2Nzc2OjI6IHJ1bGVfX1hCYXNpY0Zvckxvb3BFeHByZXNzaW9uX19Hcm91cF83X18wX19JbXBsIHJ1bGVfX1hCYXNpY0Zvckxvb3BFeHByZXNzaW9uX19Hcm91cF83X18xCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxODExMzoxOiAoIHJ1bGVfX1hCYXNpY0Zvckxvb3BFeHByZXNzaW9uX19Hcm91cF83X18wX19JbXBsIHJ1bGVfX1hCYXNpY0Zvckxvb3BFeHByZXNzaW9uX19Hcm91cF83X18xICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE4MTE0OjI6IHJ1bGVfX1hCYXNpY0Zvckxvb3BFeHByZXNzaW9uX19Hcm91cF83X18wX19JbXBsIHJ1bGVfX1hCYXNpY0Zvckxvb3BFeHByZXNzaW9uX19Hcm91cF83X18xCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV183Mik7CisgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV184MCk7CiAgICAgICAgICAgICBydWxlX19YQmFzaWNGb3JMb29wRXhwcmVzc2lvbl9fR3JvdXBfN19fMF9fSW1wbCgpOwogCiAgICAgICAgICAgICBzdGF0ZS5fZnNwLS07CkBAIC01NTQ5NywyMyArNTk5NTQsMjMgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YQmFzaWNGb3JMb29wRXhwcmVzc2lvbl9fR3JvdXBfN19fMF9fSW1wbCIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNjc4MzoxOiBydWxlX19YQmFzaWNGb3JMb29wRXhwcmVzc2lvbl9fR3JvdXBfN19fMF9fSW1wbCA6ICggKCBydWxlX19YQmFzaWNGb3JMb29wRXhwcmVzc2lvbl9fVXBkYXRlRXhwcmVzc2lvbnNBc3NpZ25tZW50XzdfMCApICkgOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE4MTIxOjE6IHJ1bGVfX1hCYXNpY0Zvckxvb3BFeHByZXNzaW9uX19Hcm91cF83X18wX19JbXBsIDogKCAoIHJ1bGVfX1hCYXNpY0Zvckxvb3BFeHByZXNzaW9uX19VcGRhdGVFeHByZXNzaW9uc0Fzc2lnbm1lbnRfN18wICkgKSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fWEJhc2ljRm9yTG9vcEV4cHJlc3Npb25fX0dyb3VwXzdfXzBfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTY3ODc6MTogKCAoICggcnVsZV9fWEJhc2ljRm9yTG9vcEV4cHJlc3Npb25fX1VwZGF0ZUV4cHJlc3Npb25zQXNzaWdubWVudF83XzAgKSApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE2Nzg4OjE6ICggKCBydWxlX19YQmFzaWNGb3JMb29wRXhwcmVzc2lvbl9fVXBkYXRlRXhwcmVzc2lvbnNBc3NpZ25tZW50XzdfMCApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE4MTI1OjE6ICggKCAoIHJ1bGVfX1hCYXNpY0Zvckxvb3BFeHByZXNzaW9uX19VcGRhdGVFeHByZXNzaW9uc0Fzc2lnbm1lbnRfN18wICkgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxODEyNjoxOiAoICggcnVsZV9fWEJhc2ljRm9yTG9vcEV4cHJlc3Npb25fX1VwZGF0ZUV4cHJlc3Npb25zQXNzaWdubWVudF83XzAgKSApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNjc4ODoxOiAoICggcnVsZV9fWEJhc2ljRm9yTG9vcEV4cHJlc3Npb25fX1VwZGF0ZUV4cHJlc3Npb25zQXNzaWdubWVudF83XzAgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNjc4OToyOiAoIHJ1bGVfX1hCYXNpY0Zvckxvb3BFeHByZXNzaW9uX19VcGRhdGVFeHByZXNzaW9uc0Fzc2lnbm1lbnRfN18wICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE4MTI2OjE6ICggKCBydWxlX19YQmFzaWNGb3JMb29wRXhwcmVzc2lvbl9fVXBkYXRlRXhwcmVzc2lvbnNBc3NpZ25tZW50XzdfMCApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE4MTI3OjI6ICggcnVsZV9fWEJhc2ljRm9yTG9vcEV4cHJlc3Npb25fX1VwZGF0ZUV4cHJlc3Npb25zQXNzaWdubWVudF83XzAgKQogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYQmFzaWNGb3JMb29wRXhwcmVzc2lvbkFjY2VzcygpLmdldFVwZGF0ZUV4cHJlc3Npb25zQXNzaWdubWVudF83XzAoKSk7IAogICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTY3OTA6MjogKCBydWxlX19YQmFzaWNGb3JMb29wRXhwcmVzc2lvbl9fVXBkYXRlRXhwcmVzc2lvbnNBc3NpZ25tZW50XzdfMCApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNjc5MDozOiBydWxlX19YQmFzaWNGb3JMb29wRXhwcmVzc2lvbl9fVXBkYXRlRXhwcmVzc2lvbnNBc3NpZ25tZW50XzdfMAorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTgxMjg6MjogKCBydWxlX19YQmFzaWNGb3JMb29wRXhwcmVzc2lvbl9fVXBkYXRlRXhwcmVzc2lvbnNBc3NpZ25tZW50XzdfMCApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxODEyODozOiBydWxlX19YQmFzaWNGb3JMb29wRXhwcmVzc2lvbl9fVXBkYXRlRXhwcmVzc2lvbnNBc3NpZ25tZW50XzdfMAogICAgICAgICAgICAgewogICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMik7CiAgICAgICAgICAgICBydWxlX19YQmFzaWNGb3JMb29wRXhwcmVzc2lvbl9fVXBkYXRlRXhwcmVzc2lvbnNBc3NpZ25tZW50XzdfMCgpOwpAQCAtNTU1NDgsMTQgKzYwMDA1LDE0IEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fWEJhc2ljRm9yTG9vcEV4cHJlc3Npb25fX0dyb3VwXzdfXzEiCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTY3OTg6MTogcnVsZV9fWEJhc2ljRm9yTG9vcEV4cHJlc3Npb25fX0dyb3VwXzdfXzEgOiBydWxlX19YQmFzaWNGb3JMb29wRXhwcmVzc2lvbl9fR3JvdXBfN19fMV9fSW1wbCA7CisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTgxMzY6MTogcnVsZV9fWEJhc2ljRm9yTG9vcEV4cHJlc3Npb25fX0dyb3VwXzdfXzEgOiBydWxlX19YQmFzaWNGb3JMb29wRXhwcmVzc2lvbl9fR3JvdXBfN19fMV9fSW1wbCA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fWEJhc2ljRm9yTG9vcEV4cHJlc3Npb25fX0dyb3VwXzdfXzEoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTY4MDI6MTogKCBydWxlX19YQmFzaWNGb3JMb29wRXhwcmVzc2lvbl9fR3JvdXBfN19fMV9fSW1wbCApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNjgwMzoyOiBydWxlX19YQmFzaWNGb3JMb29wRXhwcmVzc2lvbl9fR3JvdXBfN19fMV9fSW1wbAorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTgxNDA6MTogKCBydWxlX19YQmFzaWNGb3JMb29wRXhwcmVzc2lvbl9fR3JvdXBfN19fMV9fSW1wbCApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxODE0MToyOiBydWxlX19YQmFzaWNGb3JMb29wRXhwcmVzc2lvbl9fR3JvdXBfN19fMV9fSW1wbAogICAgICAgICAgICAgewogICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMik7CiAgICAgICAgICAgICBydWxlX19YQmFzaWNGb3JMb29wRXhwcmVzc2lvbl9fR3JvdXBfN19fMV9fSW1wbCgpOwpAQCAtNTU1ODEsMzcgKzYwMDM4LDM3IEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fWEJhc2ljRm9yTG9vcEV4cHJlc3Npb25fX0dyb3VwXzdfXzFfX0ltcGwiCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTY4MDk6MTogcnVsZV9fWEJhc2ljRm9yTG9vcEV4cHJlc3Npb25fX0dyb3VwXzdfXzFfX0ltcGwgOiAoICggcnVsZV9fWEJhc2ljRm9yTG9vcEV4cHJlc3Npb25fX0dyb3VwXzdfMV9fMCApKiApIDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxODE0NzoxOiBydWxlX19YQmFzaWNGb3JMb29wRXhwcmVzc2lvbl9fR3JvdXBfN19fMV9fSW1wbCA6ICggKCBydWxlX19YQmFzaWNGb3JMb29wRXhwcmVzc2lvbl9fR3JvdXBfN18xX18wICkqICkgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1hCYXNpY0Zvckxvb3BFeHByZXNzaW9uX19Hcm91cF83X18xX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE2ODEzOjE6ICggKCAoIHJ1bGVfX1hCYXNpY0Zvckxvb3BFeHByZXNzaW9uX19Hcm91cF83XzFfXzAgKSogKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNjgxNDoxOiAoICggcnVsZV9fWEJhc2ljRm9yTG9vcEV4cHJlc3Npb25fX0dyb3VwXzdfMV9fMCApKiApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxODE1MToxOiAoICggKCBydWxlX19YQmFzaWNGb3JMb29wRXhwcmVzc2lvbl9fR3JvdXBfN18xX18wICkqICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTgxNTI6MTogKCAoIHJ1bGVfX1hCYXNpY0Zvckxvb3BFeHByZXNzaW9uX19Hcm91cF83XzFfXzAgKSogKQogICAgICAgICAgICAgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTY4MTQ6MTogKCAoIHJ1bGVfX1hCYXNpY0Zvckxvb3BFeHByZXNzaW9uX19Hcm91cF83XzFfXzAgKSogKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTY4MTU6MjogKCBydWxlX19YQmFzaWNGb3JMb29wRXhwcmVzc2lvbl9fR3JvdXBfN18xX18wICkqCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxODE1MjoxOiAoICggcnVsZV9fWEJhc2ljRm9yTG9vcEV4cHJlc3Npb25fX0dyb3VwXzdfMV9fMCApKiApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxODE1MzoyOiAoIHJ1bGVfX1hCYXNpY0Zvckxvb3BFeHByZXNzaW9uX19Hcm91cF83XzFfXzAgKSoKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WEJhc2ljRm9yTG9vcEV4cHJlc3Npb25BY2Nlc3MoKS5nZXRHcm91cF83XzEoKSk7IAogICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTY4MTY6MjogKCBydWxlX19YQmFzaWNGb3JMb29wRXhwcmVzc2lvbl9fR3JvdXBfN18xX18wICkqCi0gICAgICAgICAgICBsb29wMTM0OgorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTgxNTQ6MjogKCBydWxlX19YQmFzaWNGb3JMb29wRXhwcmVzc2lvbl9fR3JvdXBfN18xX18wICkqCisgICAgICAgICAgICBsb29wMTQ3OgogICAgICAgICAgICAgZG8gewotICAgICAgICAgICAgICAgIGludCBhbHQxMzQ9MjsKLSAgICAgICAgICAgICAgICBpbnQgTEExMzRfMCA9IGlucHV0LkxBKDEpOworICAgICAgICAgICAgICAgIGludCBhbHQxNDc9MjsKKyAgICAgICAgICAgICAgICBpbnQgTEExNDdfMCA9IGlucHV0LkxBKDEpOwogCi0gICAgICAgICAgICAgICAgaWYgKCAoTEExMzRfMD09MTE1KSApIHsKLSAgICAgICAgICAgICAgICAgICAgYWx0MTM0PTE7CisgICAgICAgICAgICAgICAgaWYgKCAoTEExNDdfMD09MTI1KSApIHsKKyAgICAgICAgICAgICAgICAgICAgYWx0MTQ3PTE7CiAgICAgICAgICAgICAgICAgfQogCiAKLSAgICAgICAgICAgICAgICBzd2l0Y2ggKGFsdDEzNCkgeworICAgICAgICAgICAgICAgIHN3aXRjaCAoYWx0MTQ3KSB7CiAgICAgICAgICAgICAJY2FzZSAxIDoKLSAgICAgICAgICAgIAkgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTY4MTY6MzogcnVsZV9fWEJhc2ljRm9yTG9vcEV4cHJlc3Npb25fX0dyb3VwXzdfMV9fMAorICAgICAgICAgICAgCSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxODE1NDozOiBydWxlX19YQmFzaWNGb3JMb29wRXhwcmVzc2lvbl9fR3JvdXBfN18xX18wCiAgICAgICAgICAgICAJICAgIHsKLSAgICAgICAgICAgIAkgICAgcHVzaEZvbGxvdyhGT0xMT1dfNzMpOworICAgICAgICAgICAgCSAgICBwdXNoRm9sbG93KEZPTExPV184MSk7CiAgICAgICAgICAgICAJICAgIHJ1bGVfX1hCYXNpY0Zvckxvb3BFeHByZXNzaW9uX19Hcm91cF83XzFfXzAoKTsKIAogICAgICAgICAgICAgCSAgICBzdGF0ZS5fZnNwLS07CkBAIC01NTYyMSw3ICs2MDA3OCw3IEBACiAgICAgICAgICAgICAJICAgIGJyZWFrOwogCiAgICAgICAgICAgICAJZGVmYXVsdCA6Ci0gICAgICAgICAgICAJICAgIGJyZWFrIGxvb3AxMzQ7CisgICAgICAgICAgICAJICAgIGJyZWFrIGxvb3AxNDc7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfSB3aGlsZSAodHJ1ZSk7CiAKQEAgLTU1NjUwLDE2ICs2MDEwNywxNiBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX1hCYXNpY0Zvckxvb3BFeHByZXNzaW9uX19Hcm91cF83XzFfXzAiCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTY4MjU6MTogcnVsZV9fWEJhc2ljRm9yTG9vcEV4cHJlc3Npb25fX0dyb3VwXzdfMV9fMCA6IHJ1bGVfX1hCYXNpY0Zvckxvb3BFeHByZXNzaW9uX19Hcm91cF83XzFfXzBfX0ltcGwgcnVsZV9fWEJhc2ljRm9yTG9vcEV4cHJlc3Npb25fX0dyb3VwXzdfMV9fMSA7CisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTgxNjM6MTogcnVsZV9fWEJhc2ljRm9yTG9vcEV4cHJlc3Npb25fX0dyb3VwXzdfMV9fMCA6IHJ1bGVfX1hCYXNpY0Zvckxvb3BFeHByZXNzaW9uX19Hcm91cF83XzFfXzBfX0ltcGwgcnVsZV9fWEJhc2ljRm9yTG9vcEV4cHJlc3Npb25fX0dyb3VwXzdfMV9fMSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fWEJhc2ljRm9yTG9vcEV4cHJlc3Npb25fX0dyb3VwXzdfMV9fMCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNjgyOToxOiAoIHJ1bGVfX1hCYXNpY0Zvckxvb3BFeHByZXNzaW9uX19Hcm91cF83XzFfXzBfX0ltcGwgcnVsZV9fWEJhc2ljRm9yTG9vcEV4cHJlc3Npb25fX0dyb3VwXzdfMV9fMSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNjgzMDoyOiBydWxlX19YQmFzaWNGb3JMb29wRXhwcmVzc2lvbl9fR3JvdXBfN18xX18wX19JbXBsIHJ1bGVfX1hCYXNpY0Zvckxvb3BFeHByZXNzaW9uX19Hcm91cF83XzFfXzEKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE4MTY3OjE6ICggcnVsZV9fWEJhc2ljRm9yTG9vcEV4cHJlc3Npb25fX0dyb3VwXzdfMV9fMF9fSW1wbCBydWxlX19YQmFzaWNGb3JMb29wRXhwcmVzc2lvbl9fR3JvdXBfN18xX18xICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE4MTY4OjI6IHJ1bGVfX1hCYXNpY0Zvckxvb3BFeHByZXNzaW9uX19Hcm91cF83XzFfXzBfX0ltcGwgcnVsZV9fWEJhc2ljRm9yTG9vcEV4cHJlc3Npb25fX0dyb3VwXzdfMV9fMQogICAgICAgICAgICAgewotICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfNzQpOworICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfODIpOwogICAgICAgICAgICAgcnVsZV9fWEJhc2ljRm9yTG9vcEV4cHJlc3Npb25fX0dyb3VwXzdfMV9fMF9fSW1wbCgpOwogCiAgICAgICAgICAgICBzdGF0ZS5fZnNwLS07CkBAIC01NTY4OCwyMiArNjAxNDUsMjIgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YQmFzaWNGb3JMb29wRXhwcmVzc2lvbl9fR3JvdXBfN18xX18wX19JbXBsIgotICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE2ODM3OjE6IHJ1bGVfX1hCYXNpY0Zvckxvb3BFeHByZXNzaW9uX19Hcm91cF83XzFfXzBfX0ltcGwgOiAoICcsJyApIDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxODE3NToxOiBydWxlX19YQmFzaWNGb3JMb29wRXhwcmVzc2lvbl9fR3JvdXBfN18xX18wX19JbXBsIDogKCAnLCcgKSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fWEJhc2ljRm9yTG9vcEV4cHJlc3Npb25fX0dyb3VwXzdfMV9fMF9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNjg0MToxOiAoICggJywnICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTY4NDI6MTogKCAnLCcgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTgxNzk6MTogKCAoICcsJyApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE4MTgwOjE6ICggJywnICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE2ODQyOjE6ICggJywnICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE2ODQzOjI6ICcsJworICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTgxODA6MTogKCAnLCcgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTgxODE6MjogJywnCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhCYXNpY0Zvckxvb3BFeHByZXNzaW9uQWNjZXNzKCkuZ2V0Q29tbWFLZXl3b3JkXzdfMV8wKCkpOyAKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1hdGNoKGlucHV0LDExNSxGT0xMT1dfMik7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CisgICAgICAgICAgICBtYXRjaChpbnB1dCwxMjUsRk9MTE9XXzIpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOwogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBhZnRlcihncmFtbWFyQWNjZXNzLmdldFhCYXNpY0Zvckxvb3BFeHByZXNzaW9uQWNjZXNzKCkuZ2V0Q29tbWFLZXl3b3JkXzdfMV8wKCkpOyAKICAgICAgICAgICAgIH0KQEAgLTU1NzI5LDE0ICs2MDE4NiwxNCBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX1hCYXNpY0Zvckxvb3BFeHByZXNzaW9uX19Hcm91cF83XzFfXzEiCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTY4NTI6MTogcnVsZV9fWEJhc2ljRm9yTG9vcEV4cHJlc3Npb25fX0dyb3VwXzdfMV9fMSA6IHJ1bGVfX1hCYXNpY0Zvckxvb3BFeHByZXNzaW9uX19Hcm91cF83XzFfXzFfX0ltcGwgOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE4MTkwOjE6IHJ1bGVfX1hCYXNpY0Zvckxvb3BFeHByZXNzaW9uX19Hcm91cF83XzFfXzEgOiBydWxlX19YQmFzaWNGb3JMb29wRXhwcmVzc2lvbl9fR3JvdXBfN18xX18xX19JbXBsIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YQmFzaWNGb3JMb29wRXhwcmVzc2lvbl9fR3JvdXBfN18xX18xKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE2ODU2OjE6ICggcnVsZV9fWEJhc2ljRm9yTG9vcEV4cHJlc3Npb25fX0dyb3VwXzdfMV9fMV9fSW1wbCApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNjg1NzoyOiBydWxlX19YQmFzaWNGb3JMb29wRXhwcmVzc2lvbl9fR3JvdXBfN18xX18xX19JbXBsCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxODE5NDoxOiAoIHJ1bGVfX1hCYXNpY0Zvckxvb3BFeHByZXNzaW9uX19Hcm91cF83XzFfXzFfX0ltcGwgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTgxOTU6MjogcnVsZV9fWEJhc2ljRm9yTG9vcEV4cHJlc3Npb25fX0dyb3VwXzdfMV9fMV9fSW1wbAogICAgICAgICAgICAgewogICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMik7CiAgICAgICAgICAgICBydWxlX19YQmFzaWNGb3JMb29wRXhwcmVzc2lvbl9fR3JvdXBfN18xX18xX19JbXBsKCk7CkBAIC01NTc2MiwyMyArNjAyMTksMjMgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YQmFzaWNGb3JMb29wRXhwcmVzc2lvbl9fR3JvdXBfN18xX18xX19JbXBsIgotICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE2ODYzOjE6IHJ1bGVfX1hCYXNpY0Zvckxvb3BFeHByZXNzaW9uX19Hcm91cF83XzFfXzFfX0ltcGwgOiAoICggcnVsZV9fWEJhc2ljRm9yTG9vcEV4cHJlc3Npb25fX1VwZGF0ZUV4cHJlc3Npb25zQXNzaWdubWVudF83XzFfMSApICkgOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE4MjAxOjE6IHJ1bGVfX1hCYXNpY0Zvckxvb3BFeHByZXNzaW9uX19Hcm91cF83XzFfXzFfX0ltcGwgOiAoICggcnVsZV9fWEJhc2ljRm9yTG9vcEV4cHJlc3Npb25fX1VwZGF0ZUV4cHJlc3Npb25zQXNzaWdubWVudF83XzFfMSApICkgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1hCYXNpY0Zvckxvb3BFeHByZXNzaW9uX19Hcm91cF83XzFfXzFfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTY4Njc6MTogKCAoICggcnVsZV9fWEJhc2ljRm9yTG9vcEV4cHJlc3Npb25fX1VwZGF0ZUV4cHJlc3Npb25zQXNzaWdubWVudF83XzFfMSApICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTY4Njg6MTogKCAoIHJ1bGVfX1hCYXNpY0Zvckxvb3BFeHByZXNzaW9uX19VcGRhdGVFeHByZXNzaW9uc0Fzc2lnbm1lbnRfN18xXzEgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxODIwNToxOiAoICggKCBydWxlX19YQmFzaWNGb3JMb29wRXhwcmVzc2lvbl9fVXBkYXRlRXhwcmVzc2lvbnNBc3NpZ25tZW50XzdfMV8xICkgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxODIwNjoxOiAoICggcnVsZV9fWEJhc2ljRm9yTG9vcEV4cHJlc3Npb25fX1VwZGF0ZUV4cHJlc3Npb25zQXNzaWdubWVudF83XzFfMSApICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE2ODY4OjE6ICggKCBydWxlX19YQmFzaWNGb3JMb29wRXhwcmVzc2lvbl9fVXBkYXRlRXhwcmVzc2lvbnNBc3NpZ25tZW50XzdfMV8xICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTY4Njk6MjogKCBydWxlX19YQmFzaWNGb3JMb29wRXhwcmVzc2lvbl9fVXBkYXRlRXhwcmVzc2lvbnNBc3NpZ25tZW50XzdfMV8xICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE4MjA2OjE6ICggKCBydWxlX19YQmFzaWNGb3JMb29wRXhwcmVzc2lvbl9fVXBkYXRlRXhwcmVzc2lvbnNBc3NpZ25tZW50XzdfMV8xICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTgyMDc6MjogKCBydWxlX19YQmFzaWNGb3JMb29wRXhwcmVzc2lvbl9fVXBkYXRlRXhwcmVzc2lvbnNBc3NpZ25tZW50XzdfMV8xICkKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WEJhc2ljRm9yTG9vcEV4cHJlc3Npb25BY2Nlc3MoKS5nZXRVcGRhdGVFeHByZXNzaW9uc0Fzc2lnbm1lbnRfN18xXzEoKSk7IAogICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTY4NzA6MjogKCBydWxlX19YQmFzaWNGb3JMb29wRXhwcmVzc2lvbl9fVXBkYXRlRXhwcmVzc2lvbnNBc3NpZ25tZW50XzdfMV8xICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE2ODcwOjM6IHJ1bGVfX1hCYXNpY0Zvckxvb3BFeHByZXNzaW9uX19VcGRhdGVFeHByZXNzaW9uc0Fzc2lnbm1lbnRfN18xXzEKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE4MjA4OjI6ICggcnVsZV9fWEJhc2ljRm9yTG9vcEV4cHJlc3Npb25fX1VwZGF0ZUV4cHJlc3Npb25zQXNzaWdubWVudF83XzFfMSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxODIwODozOiBydWxlX19YQmFzaWNGb3JMb29wRXhwcmVzc2lvbl9fVXBkYXRlRXhwcmVzc2lvbnNBc3NpZ25tZW50XzdfMV8xCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV18yKTsKICAgICAgICAgICAgIHJ1bGVfX1hCYXNpY0Zvckxvb3BFeHByZXNzaW9uX19VcGRhdGVFeHByZXNzaW9uc0Fzc2lnbm1lbnRfN18xXzEoKTsKQEAgLTU1ODEzLDE2ICs2MDI3MCwxNiBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX1hXaGlsZUV4cHJlc3Npb25fX0dyb3VwX18wIgotICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE2ODc5OjE6IHJ1bGVfX1hXaGlsZUV4cHJlc3Npb25fX0dyb3VwX18wIDogcnVsZV9fWFdoaWxlRXhwcmVzc2lvbl9fR3JvdXBfXzBfX0ltcGwgcnVsZV9fWFdoaWxlRXhwcmVzc2lvbl9fR3JvdXBfXzEgOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE4MjE3OjE6IHJ1bGVfX1hXaGlsZUV4cHJlc3Npb25fX0dyb3VwX18wIDogcnVsZV9fWFdoaWxlRXhwcmVzc2lvbl9fR3JvdXBfXzBfX0ltcGwgcnVsZV9fWFdoaWxlRXhwcmVzc2lvbl9fR3JvdXBfXzEgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1hXaGlsZUV4cHJlc3Npb25fX0dyb3VwX18wKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE2ODgzOjE6ICggcnVsZV9fWFdoaWxlRXhwcmVzc2lvbl9fR3JvdXBfXzBfX0ltcGwgcnVsZV9fWFdoaWxlRXhwcmVzc2lvbl9fR3JvdXBfXzEgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTY4ODQ6MjogcnVsZV9fWFdoaWxlRXhwcmVzc2lvbl9fR3JvdXBfXzBfX0ltcGwgcnVsZV9fWFdoaWxlRXhwcmVzc2lvbl9fR3JvdXBfXzEKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE4MjIxOjE6ICggcnVsZV9fWFdoaWxlRXhwcmVzc2lvbl9fR3JvdXBfXzBfX0ltcGwgcnVsZV9fWFdoaWxlRXhwcmVzc2lvbl9fR3JvdXBfXzEgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTgyMjI6MjogcnVsZV9fWFdoaWxlRXhwcmVzc2lvbl9fR3JvdXBfXzBfX0ltcGwgcnVsZV9fWFdoaWxlRXhwcmVzc2lvbl9fR3JvdXBfXzEKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzEzMCk7CisgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV18xMzgpOwogICAgICAgICAgICAgcnVsZV9fWFdoaWxlRXhwcmVzc2lvbl9fR3JvdXBfXzBfX0ltcGwoKTsKIAogICAgICAgICAgICAgc3RhdGUuX2ZzcC0tOwpAQCAtNTU4NTEsMjMgKzYwMzA4LDIzIEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fWFdoaWxlRXhwcmVzc2lvbl9fR3JvdXBfXzBfX0ltcGwiCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTY4OTE6MTogcnVsZV9fWFdoaWxlRXhwcmVzc2lvbl9fR3JvdXBfXzBfX0ltcGwgOiAoICgpICkgOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE4MjI5OjE6IHJ1bGVfX1hXaGlsZUV4cHJlc3Npb25fX0dyb3VwX18wX19JbXBsIDogKCAoKSApIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YV2hpbGVFeHByZXNzaW9uX19Hcm91cF9fMF9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNjg5NToxOiAoICggKCkgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNjg5NjoxOiAoICgpICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE4MjMzOjE6ICggKCAoKSApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE4MjM0OjE6ICggKCkgKQogICAgICAgICAgICAgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTY4OTY6MTogKCAoKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNjg5NzoyOiAoKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTgyMzQ6MTogKCAoKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxODIzNToyOiAoKQogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYV2hpbGVFeHByZXNzaW9uQWNjZXNzKCkuZ2V0WFdoaWxlRXhwcmVzc2lvbkFjdGlvbl8wKCkpOyAKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE2ODk4OjI6ICgpCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNjg5ODozOiAKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE4MjM2OjI6ICgpCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxODIzNjozOiAKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIH0KIApAQCAtNTU4OTIsMTYgKzYwMzQ5LDE2IEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fWFdoaWxlRXhwcmVzc2lvbl9fR3JvdXBfXzEiCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTY5MDY6MTogcnVsZV9fWFdoaWxlRXhwcmVzc2lvbl9fR3JvdXBfXzEgOiBydWxlX19YV2hpbGVFeHByZXNzaW9uX19Hcm91cF9fMV9fSW1wbCBydWxlX19YV2hpbGVFeHByZXNzaW9uX19Hcm91cF9fMiA7CisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTgyNDQ6MTogcnVsZV9fWFdoaWxlRXhwcmVzc2lvbl9fR3JvdXBfXzEgOiBydWxlX19YV2hpbGVFeHByZXNzaW9uX19Hcm91cF9fMV9fSW1wbCBydWxlX19YV2hpbGVFeHByZXNzaW9uX19Hcm91cF9fMiA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fWFdoaWxlRXhwcmVzc2lvbl9fR3JvdXBfXzEoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTY5MTA6MTogKCBydWxlX19YV2hpbGVFeHByZXNzaW9uX19Hcm91cF9fMV9fSW1wbCBydWxlX19YV2hpbGVFeHByZXNzaW9uX19Hcm91cF9fMiApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNjkxMToyOiBydWxlX19YV2hpbGVFeHByZXNzaW9uX19Hcm91cF9fMV9fSW1wbCBydWxlX19YV2hpbGVFeHByZXNzaW9uX19Hcm91cF9fMgorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTgyNDg6MTogKCBydWxlX19YV2hpbGVFeHByZXNzaW9uX19Hcm91cF9fMV9fSW1wbCBydWxlX19YV2hpbGVFeHByZXNzaW9uX19Hcm91cF9fMiApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxODI0OToyOiBydWxlX19YV2hpbGVFeHByZXNzaW9uX19Hcm91cF9fMV9fSW1wbCBydWxlX19YV2hpbGVFeHByZXNzaW9uX19Hcm91cF9fMgogICAgICAgICAgICAgewotICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfNzApOworICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfNzgpOwogICAgICAgICAgICAgcnVsZV9fWFdoaWxlRXhwcmVzc2lvbl9fR3JvdXBfXzFfX0ltcGwoKTsKIAogICAgICAgICAgICAgc3RhdGUuX2ZzcC0tOwpAQCAtNTU5MzAsMjIgKzYwMzg3LDIyIEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fWFdoaWxlRXhwcmVzc2lvbl9fR3JvdXBfXzFfX0ltcGwiCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTY5MTg6MTogcnVsZV9fWFdoaWxlRXhwcmVzc2lvbl9fR3JvdXBfXzFfX0ltcGwgOiAoICd3aGlsZScgKSA7CisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTgyNTY6MTogcnVsZV9fWFdoaWxlRXhwcmVzc2lvbl9fR3JvdXBfXzFfX0ltcGwgOiAoICd3aGlsZScgKSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fWFdoaWxlRXhwcmVzc2lvbl9fR3JvdXBfXzFfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTY5MjI6MTogKCAoICd3aGlsZScgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNjkyMzoxOiAoICd3aGlsZScgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTgyNjA6MTogKCAoICd3aGlsZScgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxODI2MToxOiAoICd3aGlsZScgKQogICAgICAgICAgICAgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTY5MjM6MTogKCAnd2hpbGUnICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE2OTI0OjI6ICd3aGlsZScKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE4MjYxOjE6ICggJ3doaWxlJyApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxODI2MjoyOiAnd2hpbGUnCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhXaGlsZUV4cHJlc3Npb25BY2Nlc3MoKS5nZXRXaGlsZUtleXdvcmRfMSgpKTsgCiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBtYXRjaChpbnB1dCwxMjYsRk9MTE9XXzIpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOworICAgICAgICAgICAgbWF0Y2goaW5wdXQsMTM2LEZPTExPV18yKTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRYV2hpbGVFeHByZXNzaW9uQWNjZXNzKCkuZ2V0V2hpbGVLZXl3b3JkXzEoKSk7IAogICAgICAgICAgICAgfQpAQCAtNTU5NzEsMTYgKzYwNDI4LDE2IEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fWFdoaWxlRXhwcmVzc2lvbl9fR3JvdXBfXzIiCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTY5MzM6MTogcnVsZV9fWFdoaWxlRXhwcmVzc2lvbl9fR3JvdXBfXzIgOiBydWxlX19YV2hpbGVFeHByZXNzaW9uX19Hcm91cF9fMl9fSW1wbCBydWxlX19YV2hpbGVFeHByZXNzaW9uX19Hcm91cF9fMyA7CisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTgyNzE6MTogcnVsZV9fWFdoaWxlRXhwcmVzc2lvbl9fR3JvdXBfXzIgOiBydWxlX19YV2hpbGVFeHByZXNzaW9uX19Hcm91cF9fMl9fSW1wbCBydWxlX19YV2hpbGVFeHByZXNzaW9uX19Hcm91cF9fMyA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fWFdoaWxlRXhwcmVzc2lvbl9fR3JvdXBfXzIoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTY5Mzc6MTogKCBydWxlX19YV2hpbGVFeHByZXNzaW9uX19Hcm91cF9fMl9fSW1wbCBydWxlX19YV2hpbGVFeHByZXNzaW9uX19Hcm91cF9fMyApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNjkzODoyOiBydWxlX19YV2hpbGVFeHByZXNzaW9uX19Hcm91cF9fMl9fSW1wbCBydWxlX19YV2hpbGVFeHByZXNzaW9uX19Hcm91cF9fMworICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTgyNzU6MTogKCBydWxlX19YV2hpbGVFeHByZXNzaW9uX19Hcm91cF9fMl9fSW1wbCBydWxlX19YV2hpbGVFeHByZXNzaW9uX19Hcm91cF9fMyApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxODI3NjoyOiBydWxlX19YV2hpbGVFeHByZXNzaW9uX19Hcm91cF9fMl9fSW1wbCBydWxlX19YV2hpbGVFeHByZXNzaW9uX19Hcm91cF9fMwogICAgICAgICAgICAgewotICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfNzQpOworICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfODIpOwogICAgICAgICAgICAgcnVsZV9fWFdoaWxlRXhwcmVzc2lvbl9fR3JvdXBfXzJfX0ltcGwoKTsKIAogICAgICAgICAgICAgc3RhdGUuX2ZzcC0tOwpAQCAtNTYwMDksMjIgKzYwNDY2LDIyIEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fWFdoaWxlRXhwcmVzc2lvbl9fR3JvdXBfXzJfX0ltcGwiCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTY5NDU6MTogcnVsZV9fWFdoaWxlRXhwcmVzc2lvbl9fR3JvdXBfXzJfX0ltcGwgOiAoICcoJyApIDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxODI4MzoxOiBydWxlX19YV2hpbGVFeHByZXNzaW9uX19Hcm91cF9fMl9fSW1wbCA6ICggJygnICkgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1hXaGlsZUV4cHJlc3Npb25fX0dyb3VwX18yX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE2OTQ5OjE6ICggKCAnKCcgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNjk1MDoxOiAoICcoJyApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxODI4NzoxOiAoICggJygnICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTgyODg6MTogKCAnKCcgKQogICAgICAgICAgICAgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTY5NTA6MTogKCAnKCcgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTY5NTE6MjogJygnCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxODI4ODoxOiAoICcoJyApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxODI4OToyOiAnKCcKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WFdoaWxlRXhwcmVzc2lvbkFjY2VzcygpLmdldExlZnRQYXJlbnRoZXNpc0tleXdvcmRfMigpKTsgCiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBtYXRjaChpbnB1dCwxMTMsRk9MTE9XXzIpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOworICAgICAgICAgICAgbWF0Y2goaW5wdXQsMTIzLEZPTExPV18yKTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRYV2hpbGVFeHByZXNzaW9uQWNjZXNzKCkuZ2V0TGVmdFBhcmVudGhlc2lzS2V5d29yZF8yKCkpOyAKICAgICAgICAgICAgIH0KQEAgLTU2MDUwLDE2ICs2MDUwNywxNiBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX1hXaGlsZUV4cHJlc3Npb25fX0dyb3VwX18zIgotICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE2OTYwOjE6IHJ1bGVfX1hXaGlsZUV4cHJlc3Npb25fX0dyb3VwX18zIDogcnVsZV9fWFdoaWxlRXhwcmVzc2lvbl9fR3JvdXBfXzNfX0ltcGwgcnVsZV9fWFdoaWxlRXhwcmVzc2lvbl9fR3JvdXBfXzQgOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE4Mjk4OjE6IHJ1bGVfX1hXaGlsZUV4cHJlc3Npb25fX0dyb3VwX18zIDogcnVsZV9fWFdoaWxlRXhwcmVzc2lvbl9fR3JvdXBfXzNfX0ltcGwgcnVsZV9fWFdoaWxlRXhwcmVzc2lvbl9fR3JvdXBfXzQgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1hXaGlsZUV4cHJlc3Npb25fX0dyb3VwX18zKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE2OTY0OjE6ICggcnVsZV9fWFdoaWxlRXhwcmVzc2lvbl9fR3JvdXBfXzNfX0ltcGwgcnVsZV9fWFdoaWxlRXhwcmVzc2lvbl9fR3JvdXBfXzQgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTY5NjU6MjogcnVsZV9fWFdoaWxlRXhwcmVzc2lvbl9fR3JvdXBfXzNfX0ltcGwgcnVsZV9fWFdoaWxlRXhwcmVzc2lvbl9fR3JvdXBfXzQKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE4MzAyOjE6ICggcnVsZV9fWFdoaWxlRXhwcmVzc2lvbl9fR3JvdXBfXzNfX0ltcGwgcnVsZV9fWFdoaWxlRXhwcmVzc2lvbl9fR3JvdXBfXzQgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTgzMDM6MjogcnVsZV9fWFdoaWxlRXhwcmVzc2lvbl9fR3JvdXBfXzNfX0ltcGwgcnVsZV9fWFdoaWxlRXhwcmVzc2lvbl9fR3JvdXBfXzQKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzExOCk7CisgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV18xMjYpOwogICAgICAgICAgICAgcnVsZV9fWFdoaWxlRXhwcmVzc2lvbl9fR3JvdXBfXzNfX0ltcGwoKTsKIAogICAgICAgICAgICAgc3RhdGUuX2ZzcC0tOwpAQCAtNTYwODgsMjMgKzYwNTQ1LDIzIEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fWFdoaWxlRXhwcmVzc2lvbl9fR3JvdXBfXzNfX0ltcGwiCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTY5NzI6MTogcnVsZV9fWFdoaWxlRXhwcmVzc2lvbl9fR3JvdXBfXzNfX0ltcGwgOiAoICggcnVsZV9fWFdoaWxlRXhwcmVzc2lvbl9fUHJlZGljYXRlQXNzaWdubWVudF8zICkgKSA7CisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTgzMTA6MTogcnVsZV9fWFdoaWxlRXhwcmVzc2lvbl9fR3JvdXBfXzNfX0ltcGwgOiAoICggcnVsZV9fWFdoaWxlRXhwcmVzc2lvbl9fUHJlZGljYXRlQXNzaWdubWVudF8zICkgKSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fWFdoaWxlRXhwcmVzc2lvbl9fR3JvdXBfXzNfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTY5NzY6MTogKCAoICggcnVsZV9fWFdoaWxlRXhwcmVzc2lvbl9fUHJlZGljYXRlQXNzaWdubWVudF8zICkgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNjk3NzoxOiAoICggcnVsZV9fWFdoaWxlRXhwcmVzc2lvbl9fUHJlZGljYXRlQXNzaWdubWVudF8zICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTgzMTQ6MTogKCAoICggcnVsZV9fWFdoaWxlRXhwcmVzc2lvbl9fUHJlZGljYXRlQXNzaWdubWVudF8zICkgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxODMxNToxOiAoICggcnVsZV9fWFdoaWxlRXhwcmVzc2lvbl9fUHJlZGljYXRlQXNzaWdubWVudF8zICkgKQogICAgICAgICAgICAgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTY5Nzc6MTogKCAoIHJ1bGVfX1hXaGlsZUV4cHJlc3Npb25fX1ByZWRpY2F0ZUFzc2lnbm1lbnRfMyApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE2OTc4OjI6ICggcnVsZV9fWFdoaWxlRXhwcmVzc2lvbl9fUHJlZGljYXRlQXNzaWdubWVudF8zICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE4MzE1OjE6ICggKCBydWxlX19YV2hpbGVFeHByZXNzaW9uX19QcmVkaWNhdGVBc3NpZ25tZW50XzMgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxODMxNjoyOiAoIHJ1bGVfX1hXaGlsZUV4cHJlc3Npb25fX1ByZWRpY2F0ZUFzc2lnbm1lbnRfMyApCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhXaGlsZUV4cHJlc3Npb25BY2Nlc3MoKS5nZXRQcmVkaWNhdGVBc3NpZ25tZW50XzMoKSk7IAogICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTY5Nzk6MjogKCBydWxlX19YV2hpbGVFeHByZXNzaW9uX19QcmVkaWNhdGVBc3NpZ25tZW50XzMgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTY5Nzk6MzogcnVsZV9fWFdoaWxlRXhwcmVzc2lvbl9fUHJlZGljYXRlQXNzaWdubWVudF8zCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxODMxNzoyOiAoIHJ1bGVfX1hXaGlsZUV4cHJlc3Npb25fX1ByZWRpY2F0ZUFzc2lnbm1lbnRfMyApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxODMxNzozOiBydWxlX19YV2hpbGVFeHByZXNzaW9uX19QcmVkaWNhdGVBc3NpZ25tZW50XzMKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzIpOwogICAgICAgICAgICAgcnVsZV9fWFdoaWxlRXhwcmVzc2lvbl9fUHJlZGljYXRlQXNzaWdubWVudF8zKCk7CkBAIC01NjEzOSwxNiArNjA1OTYsMTYgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YV2hpbGVFeHByZXNzaW9uX19Hcm91cF9fNCIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNjk4NzoxOiBydWxlX19YV2hpbGVFeHByZXNzaW9uX19Hcm91cF9fNCA6IHJ1bGVfX1hXaGlsZUV4cHJlc3Npb25fX0dyb3VwX180X19JbXBsIHJ1bGVfX1hXaGlsZUV4cHJlc3Npb25fX0dyb3VwX181IDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxODMyNToxOiBydWxlX19YV2hpbGVFeHByZXNzaW9uX19Hcm91cF9fNCA6IHJ1bGVfX1hXaGlsZUV4cHJlc3Npb25fX0dyb3VwX180X19JbXBsIHJ1bGVfX1hXaGlsZUV4cHJlc3Npb25fX0dyb3VwX181IDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YV2hpbGVFeHByZXNzaW9uX19Hcm91cF9fNCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNjk5MToxOiAoIHJ1bGVfX1hXaGlsZUV4cHJlc3Npb25fX0dyb3VwX180X19JbXBsIHJ1bGVfX1hXaGlsZUV4cHJlc3Npb25fX0dyb3VwX181ICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE2OTkyOjI6IHJ1bGVfX1hXaGlsZUV4cHJlc3Npb25fX0dyb3VwX180X19JbXBsIHJ1bGVfX1hXaGlsZUV4cHJlc3Npb25fX0dyb3VwX181CisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxODMyOToxOiAoIHJ1bGVfX1hXaGlsZUV4cHJlc3Npb25fX0dyb3VwX180X19JbXBsIHJ1bGVfX1hXaGlsZUV4cHJlc3Npb25fX0dyb3VwX181ICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE4MzMwOjI6IHJ1bGVfX1hXaGlsZUV4cHJlc3Npb25fX0dyb3VwX180X19JbXBsIHJ1bGVfX1hXaGlsZUV4cHJlc3Npb25fX0dyb3VwX181CiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV183NCk7CisgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV184Mik7CiAgICAgICAgICAgICBydWxlX19YV2hpbGVFeHByZXNzaW9uX19Hcm91cF9fNF9fSW1wbCgpOwogCiAgICAgICAgICAgICBzdGF0ZS5fZnNwLS07CkBAIC01NjE3NywyMiArNjA2MzQsMjIgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YV2hpbGVFeHByZXNzaW9uX19Hcm91cF9fNF9fSW1wbCIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNjk5OToxOiBydWxlX19YV2hpbGVFeHByZXNzaW9uX19Hcm91cF9fNF9fSW1wbCA6ICggJyknICkgOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE4MzM3OjE6IHJ1bGVfX1hXaGlsZUV4cHJlc3Npb25fX0dyb3VwX180X19JbXBsIDogKCAnKScgKSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fWFdoaWxlRXhwcmVzc2lvbl9fR3JvdXBfXzRfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTcwMDM6MTogKCAoICcpJyApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE3MDA0OjE6ICggJyknICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE4MzQxOjE6ICggKCAnKScgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxODM0MjoxOiAoICcpJyApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNzAwNDoxOiAoICcpJyApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNzAwNToyOiAnKScKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE4MzQyOjE6ICggJyknICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE4MzQzOjI6ICcpJwogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYV2hpbGVFeHByZXNzaW9uQWNjZXNzKCkuZ2V0UmlnaHRQYXJlbnRoZXNpc0tleXdvcmRfNCgpKTsgCiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBtYXRjaChpbnB1dCwxMTQsRk9MTE9XXzIpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOworICAgICAgICAgICAgbWF0Y2goaW5wdXQsMTI0LEZPTExPV18yKTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRYV2hpbGVFeHByZXNzaW9uQWNjZXNzKCkuZ2V0UmlnaHRQYXJlbnRoZXNpc0tleXdvcmRfNCgpKTsgCiAgICAgICAgICAgICB9CkBAIC01NjIxOCwxNCArNjA2NzUsMTQgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YV2hpbGVFeHByZXNzaW9uX19Hcm91cF9fNSIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNzAxNDoxOiBydWxlX19YV2hpbGVFeHByZXNzaW9uX19Hcm91cF9fNSA6IHJ1bGVfX1hXaGlsZUV4cHJlc3Npb25fX0dyb3VwX181X19JbXBsIDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxODM1MjoxOiBydWxlX19YV2hpbGVFeHByZXNzaW9uX19Hcm91cF9fNSA6IHJ1bGVfX1hXaGlsZUV4cHJlc3Npb25fX0dyb3VwX181X19JbXBsIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YV2hpbGVFeHByZXNzaW9uX19Hcm91cF9fNSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNzAxODoxOiAoIHJ1bGVfX1hXaGlsZUV4cHJlc3Npb25fX0dyb3VwX181X19JbXBsICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE3MDE5OjI6IHJ1bGVfX1hXaGlsZUV4cHJlc3Npb25fX0dyb3VwX181X19JbXBsCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxODM1NjoxOiAoIHJ1bGVfX1hXaGlsZUV4cHJlc3Npb25fX0dyb3VwX181X19JbXBsICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE4MzU3OjI6IHJ1bGVfX1hXaGlsZUV4cHJlc3Npb25fX0dyb3VwX181X19JbXBsCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV18yKTsKICAgICAgICAgICAgIHJ1bGVfX1hXaGlsZUV4cHJlc3Npb25fX0dyb3VwX181X19JbXBsKCk7CkBAIC01NjI1MSwyMyArNjA3MDgsMjMgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YV2hpbGVFeHByZXNzaW9uX19Hcm91cF9fNV9fSW1wbCIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNzAyNToxOiBydWxlX19YV2hpbGVFeHByZXNzaW9uX19Hcm91cF9fNV9fSW1wbCA6ICggKCBydWxlX19YV2hpbGVFeHByZXNzaW9uX19Cb2R5QXNzaWdubWVudF81ICkgKSA7CisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTgzNjM6MTogcnVsZV9fWFdoaWxlRXhwcmVzc2lvbl9fR3JvdXBfXzVfX0ltcGwgOiAoICggcnVsZV9fWFdoaWxlRXhwcmVzc2lvbl9fQm9keUFzc2lnbm1lbnRfNSApICkgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1hXaGlsZUV4cHJlc3Npb25fX0dyb3VwX181X19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE3MDI5OjE6ICggKCAoIHJ1bGVfX1hXaGlsZUV4cHJlc3Npb25fX0JvZHlBc3NpZ25tZW50XzUgKSApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE3MDMwOjE6ICggKCBydWxlX19YV2hpbGVFeHByZXNzaW9uX19Cb2R5QXNzaWdubWVudF81ICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTgzNjc6MTogKCAoICggcnVsZV9fWFdoaWxlRXhwcmVzc2lvbl9fQm9keUFzc2lnbm1lbnRfNSApICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTgzNjg6MTogKCAoIHJ1bGVfX1hXaGlsZUV4cHJlc3Npb25fX0JvZHlBc3NpZ25tZW50XzUgKSApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNzAzMDoxOiAoICggcnVsZV9fWFdoaWxlRXhwcmVzc2lvbl9fQm9keUFzc2lnbm1lbnRfNSApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE3MDMxOjI6ICggcnVsZV9fWFdoaWxlRXhwcmVzc2lvbl9fQm9keUFzc2lnbm1lbnRfNSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxODM2ODoxOiAoICggcnVsZV9fWFdoaWxlRXhwcmVzc2lvbl9fQm9keUFzc2lnbm1lbnRfNSApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE4MzY5OjI6ICggcnVsZV9fWFdoaWxlRXhwcmVzc2lvbl9fQm9keUFzc2lnbm1lbnRfNSApCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhXaGlsZUV4cHJlc3Npb25BY2Nlc3MoKS5nZXRCb2R5QXNzaWdubWVudF81KCkpOyAKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE3MDMyOjI6ICggcnVsZV9fWFdoaWxlRXhwcmVzc2lvbl9fQm9keUFzc2lnbm1lbnRfNSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNzAzMjozOiBydWxlX19YV2hpbGVFeHByZXNzaW9uX19Cb2R5QXNzaWdubWVudF81CisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxODM3MDoyOiAoIHJ1bGVfX1hXaGlsZUV4cHJlc3Npb25fX0JvZHlBc3NpZ25tZW50XzUgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTgzNzA6MzogcnVsZV9fWFdoaWxlRXhwcmVzc2lvbl9fQm9keUFzc2lnbm1lbnRfNQogICAgICAgICAgICAgewogICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMik7CiAgICAgICAgICAgICBydWxlX19YV2hpbGVFeHByZXNzaW9uX19Cb2R5QXNzaWdubWVudF81KCk7CkBAIC01NjMwMiwxNiArNjA3NTksMTYgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YRG9XaGlsZUV4cHJlc3Npb25fX0dyb3VwX18wIgotICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE3MDQxOjE6IHJ1bGVfX1hEb1doaWxlRXhwcmVzc2lvbl9fR3JvdXBfXzAgOiBydWxlX19YRG9XaGlsZUV4cHJlc3Npb25fX0dyb3VwX18wX19JbXBsIHJ1bGVfX1hEb1doaWxlRXhwcmVzc2lvbl9fR3JvdXBfXzEgOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE4Mzc5OjE6IHJ1bGVfX1hEb1doaWxlRXhwcmVzc2lvbl9fR3JvdXBfXzAgOiBydWxlX19YRG9XaGlsZUV4cHJlc3Npb25fX0dyb3VwX18wX19JbXBsIHJ1bGVfX1hEb1doaWxlRXhwcmVzc2lvbl9fR3JvdXBfXzEgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1hEb1doaWxlRXhwcmVzc2lvbl9fR3JvdXBfXzAoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTcwNDU6MTogKCBydWxlX19YRG9XaGlsZUV4cHJlc3Npb25fX0dyb3VwX18wX19JbXBsIHJ1bGVfX1hEb1doaWxlRXhwcmVzc2lvbl9fR3JvdXBfXzEgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTcwNDY6MjogcnVsZV9fWERvV2hpbGVFeHByZXNzaW9uX19Hcm91cF9fMF9fSW1wbCBydWxlX19YRG9XaGlsZUV4cHJlc3Npb25fX0dyb3VwX18xCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxODM4MzoxOiAoIHJ1bGVfX1hEb1doaWxlRXhwcmVzc2lvbl9fR3JvdXBfXzBfX0ltcGwgcnVsZV9fWERvV2hpbGVFeHByZXNzaW9uX19Hcm91cF9fMSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxODM4NDoyOiBydWxlX19YRG9XaGlsZUV4cHJlc3Npb25fX0dyb3VwX18wX19JbXBsIHJ1bGVfX1hEb1doaWxlRXhwcmVzc2lvbl9fR3JvdXBfXzEKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzEzMSk7CisgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV18xMzkpOwogICAgICAgICAgICAgcnVsZV9fWERvV2hpbGVFeHByZXNzaW9uX19Hcm91cF9fMF9fSW1wbCgpOwogCiAgICAgICAgICAgICBzdGF0ZS5fZnNwLS07CkBAIC01NjM0MCwyMyArNjA3OTcsMjMgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YRG9XaGlsZUV4cHJlc3Npb25fX0dyb3VwX18wX19JbXBsIgotICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE3MDUzOjE6IHJ1bGVfX1hEb1doaWxlRXhwcmVzc2lvbl9fR3JvdXBfXzBfX0ltcGwgOiAoICgpICkgOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE4MzkxOjE6IHJ1bGVfX1hEb1doaWxlRXhwcmVzc2lvbl9fR3JvdXBfXzBfX0ltcGwgOiAoICgpICkgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1hEb1doaWxlRXhwcmVzc2lvbl9fR3JvdXBfXzBfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTcwNTc6MTogKCAoICgpICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTcwNTg6MTogKCAoKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxODM5NToxOiAoICggKCkgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxODM5NjoxOiAoICgpICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE3MDU4OjE6ICggKCkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTcwNTk6MjogKCkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE4Mzk2OjE6ICggKCkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTgzOTc6MjogKCkKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WERvV2hpbGVFeHByZXNzaW9uQWNjZXNzKCkuZ2V0WERvV2hpbGVFeHByZXNzaW9uQWN0aW9uXzAoKSk7IAogICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTcwNjA6MjogKCkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE3MDYwOjM6IAorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTgzOTg6MjogKCkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE4Mzk4OjM6IAogICAgICAgICAgICAgewogICAgICAgICAgICAgfQogCkBAIC01NjM4MSwxNiArNjA4MzgsMTYgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YRG9XaGlsZUV4cHJlc3Npb25fX0dyb3VwX18xIgotICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE3MDY4OjE6IHJ1bGVfX1hEb1doaWxlRXhwcmVzc2lvbl9fR3JvdXBfXzEgOiBydWxlX19YRG9XaGlsZUV4cHJlc3Npb25fX0dyb3VwX18xX19JbXBsIHJ1bGVfX1hEb1doaWxlRXhwcmVzc2lvbl9fR3JvdXBfXzIgOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE4NDA2OjE6IHJ1bGVfX1hEb1doaWxlRXhwcmVzc2lvbl9fR3JvdXBfXzEgOiBydWxlX19YRG9XaGlsZUV4cHJlc3Npb25fX0dyb3VwX18xX19JbXBsIHJ1bGVfX1hEb1doaWxlRXhwcmVzc2lvbl9fR3JvdXBfXzIgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1hEb1doaWxlRXhwcmVzc2lvbl9fR3JvdXBfXzEoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTcwNzI6MTogKCBydWxlX19YRG9XaGlsZUV4cHJlc3Npb25fX0dyb3VwX18xX19JbXBsIHJ1bGVfX1hEb1doaWxlRXhwcmVzc2lvbl9fR3JvdXBfXzIgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTcwNzM6MjogcnVsZV9fWERvV2hpbGVFeHByZXNzaW9uX19Hcm91cF9fMV9fSW1wbCBydWxlX19YRG9XaGlsZUV4cHJlc3Npb25fX0dyb3VwX18yCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxODQxMDoxOiAoIHJ1bGVfX1hEb1doaWxlRXhwcmVzc2lvbl9fR3JvdXBfXzFfX0ltcGwgcnVsZV9fWERvV2hpbGVFeHByZXNzaW9uX19Hcm91cF9fMiApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxODQxMToyOiBydWxlX19YRG9XaGlsZUV4cHJlc3Npb25fX0dyb3VwX18xX19JbXBsIHJ1bGVfX1hEb1doaWxlRXhwcmVzc2lvbl9fR3JvdXBfXzIKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzc0KTsKKyAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzgyKTsKICAgICAgICAgICAgIHJ1bGVfX1hEb1doaWxlRXhwcmVzc2lvbl9fR3JvdXBfXzFfX0ltcGwoKTsKIAogICAgICAgICAgICAgc3RhdGUuX2ZzcC0tOwpAQCAtNTY0MTksMjIgKzYwODc2LDIyIEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fWERvV2hpbGVFeHByZXNzaW9uX19Hcm91cF9fMV9fSW1wbCIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNzA4MDoxOiBydWxlX19YRG9XaGlsZUV4cHJlc3Npb25fX0dyb3VwX18xX19JbXBsIDogKCAnZG8nICkgOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE4NDE4OjE6IHJ1bGVfX1hEb1doaWxlRXhwcmVzc2lvbl9fR3JvdXBfXzFfX0ltcGwgOiAoICdkbycgKSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fWERvV2hpbGVFeHByZXNzaW9uX19Hcm91cF9fMV9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNzA4NDoxOiAoICggJ2RvJyApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE3MDg1OjE6ICggJ2RvJyApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxODQyMjoxOiAoICggJ2RvJyApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE4NDIzOjE6ICggJ2RvJyApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNzA4NToxOiAoICdkbycgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTcwODY6MjogJ2RvJworICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTg0MjM6MTogKCAnZG8nICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE4NDI0OjI6ICdkbycKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WERvV2hpbGVFeHByZXNzaW9uQWNjZXNzKCkuZ2V0RG9LZXl3b3JkXzEoKSk7IAogICAgICAgICAgICAgfQotICAgICAgICAgICAgbWF0Y2goaW5wdXQsMTI3LEZPTExPV18yKTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKKyAgICAgICAgICAgIG1hdGNoKGlucHV0LDEzNyxGT0xMT1dfMik7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0WERvV2hpbGVFeHByZXNzaW9uQWNjZXNzKCkuZ2V0RG9LZXl3b3JkXzEoKSk7IAogICAgICAgICAgICAgfQpAQCAtNTY0NjAsMTYgKzYwOTE3LDE2IEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fWERvV2hpbGVFeHByZXNzaW9uX19Hcm91cF9fMiIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNzA5NToxOiBydWxlX19YRG9XaGlsZUV4cHJlc3Npb25fX0dyb3VwX18yIDogcnVsZV9fWERvV2hpbGVFeHByZXNzaW9uX19Hcm91cF9fMl9fSW1wbCBydWxlX19YRG9XaGlsZUV4cHJlc3Npb25fX0dyb3VwX18zIDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxODQzMzoxOiBydWxlX19YRG9XaGlsZUV4cHJlc3Npb25fX0dyb3VwX18yIDogcnVsZV9fWERvV2hpbGVFeHByZXNzaW9uX19Hcm91cF9fMl9fSW1wbCBydWxlX19YRG9XaGlsZUV4cHJlc3Npb25fX0dyb3VwX18zIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YRG9XaGlsZUV4cHJlc3Npb25fX0dyb3VwX18yKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE3MDk5OjE6ICggcnVsZV9fWERvV2hpbGVFeHByZXNzaW9uX19Hcm91cF9fMl9fSW1wbCBydWxlX19YRG9XaGlsZUV4cHJlc3Npb25fX0dyb3VwX18zICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE3MTAwOjI6IHJ1bGVfX1hEb1doaWxlRXhwcmVzc2lvbl9fR3JvdXBfXzJfX0ltcGwgcnVsZV9fWERvV2hpbGVFeHByZXNzaW9uX19Hcm91cF9fMworICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTg0Mzc6MTogKCBydWxlX19YRG9XaGlsZUV4cHJlc3Npb25fX0dyb3VwX18yX19JbXBsIHJ1bGVfX1hEb1doaWxlRXhwcmVzc2lvbl9fR3JvdXBfXzMgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTg0Mzg6MjogcnVsZV9fWERvV2hpbGVFeHByZXNzaW9uX19Hcm91cF9fMl9fSW1wbCBydWxlX19YRG9XaGlsZUV4cHJlc3Npb25fX0dyb3VwX18zCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV18xMzApOworICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMTM4KTsKICAgICAgICAgICAgIHJ1bGVfX1hEb1doaWxlRXhwcmVzc2lvbl9fR3JvdXBfXzJfX0ltcGwoKTsKIAogICAgICAgICAgICAgc3RhdGUuX2ZzcC0tOwpAQCAtNTY0OTgsMjMgKzYwOTU1LDIzIEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fWERvV2hpbGVFeHByZXNzaW9uX19Hcm91cF9fMl9fSW1wbCIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNzEwNzoxOiBydWxlX19YRG9XaGlsZUV4cHJlc3Npb25fX0dyb3VwX18yX19JbXBsIDogKCAoIHJ1bGVfX1hEb1doaWxlRXhwcmVzc2lvbl9fQm9keUFzc2lnbm1lbnRfMiApICkgOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE4NDQ1OjE6IHJ1bGVfX1hEb1doaWxlRXhwcmVzc2lvbl9fR3JvdXBfXzJfX0ltcGwgOiAoICggcnVsZV9fWERvV2hpbGVFeHByZXNzaW9uX19Cb2R5QXNzaWdubWVudF8yICkgKSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fWERvV2hpbGVFeHByZXNzaW9uX19Hcm91cF9fMl9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNzExMToxOiAoICggKCBydWxlX19YRG9XaGlsZUV4cHJlc3Npb25fX0JvZHlBc3NpZ25tZW50XzIgKSApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE3MTEyOjE6ICggKCBydWxlX19YRG9XaGlsZUV4cHJlc3Npb25fX0JvZHlBc3NpZ25tZW50XzIgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxODQ0OToxOiAoICggKCBydWxlX19YRG9XaGlsZUV4cHJlc3Npb25fX0JvZHlBc3NpZ25tZW50XzIgKSApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE4NDUwOjE6ICggKCBydWxlX19YRG9XaGlsZUV4cHJlc3Npb25fX0JvZHlBc3NpZ25tZW50XzIgKSApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNzExMjoxOiAoICggcnVsZV9fWERvV2hpbGVFeHByZXNzaW9uX19Cb2R5QXNzaWdubWVudF8yICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTcxMTM6MjogKCBydWxlX19YRG9XaGlsZUV4cHJlc3Npb25fX0JvZHlBc3NpZ25tZW50XzIgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTg0NTA6MTogKCAoIHJ1bGVfX1hEb1doaWxlRXhwcmVzc2lvbl9fQm9keUFzc2lnbm1lbnRfMiApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE4NDUxOjI6ICggcnVsZV9fWERvV2hpbGVFeHByZXNzaW9uX19Cb2R5QXNzaWdubWVudF8yICkKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WERvV2hpbGVFeHByZXNzaW9uQWNjZXNzKCkuZ2V0Qm9keUFzc2lnbm1lbnRfMigpKTsgCiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNzExNDoyOiAoIHJ1bGVfX1hEb1doaWxlRXhwcmVzc2lvbl9fQm9keUFzc2lnbm1lbnRfMiApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNzExNDozOiBydWxlX19YRG9XaGlsZUV4cHJlc3Npb25fX0JvZHlBc3NpZ25tZW50XzIKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE4NDUyOjI6ICggcnVsZV9fWERvV2hpbGVFeHByZXNzaW9uX19Cb2R5QXNzaWdubWVudF8yICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE4NDUyOjM6IHJ1bGVfX1hEb1doaWxlRXhwcmVzc2lvbl9fQm9keUFzc2lnbm1lbnRfMgogICAgICAgICAgICAgewogICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMik7CiAgICAgICAgICAgICBydWxlX19YRG9XaGlsZUV4cHJlc3Npb25fX0JvZHlBc3NpZ25tZW50XzIoKTsKQEAgLTU2NTQ5LDE2ICs2MTAwNiwxNiBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX1hEb1doaWxlRXhwcmVzc2lvbl9fR3JvdXBfXzMiCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTcxMjI6MTogcnVsZV9fWERvV2hpbGVFeHByZXNzaW9uX19Hcm91cF9fMyA6IHJ1bGVfX1hEb1doaWxlRXhwcmVzc2lvbl9fR3JvdXBfXzNfX0ltcGwgcnVsZV9fWERvV2hpbGVFeHByZXNzaW9uX19Hcm91cF9fNCA7CisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTg0NjA6MTogcnVsZV9fWERvV2hpbGVFeHByZXNzaW9uX19Hcm91cF9fMyA6IHJ1bGVfX1hEb1doaWxlRXhwcmVzc2lvbl9fR3JvdXBfXzNfX0ltcGwgcnVsZV9fWERvV2hpbGVFeHByZXNzaW9uX19Hcm91cF9fNCA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fWERvV2hpbGVFeHByZXNzaW9uX19Hcm91cF9fMygpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNzEyNjoxOiAoIHJ1bGVfX1hEb1doaWxlRXhwcmVzc2lvbl9fR3JvdXBfXzNfX0ltcGwgcnVsZV9fWERvV2hpbGVFeHByZXNzaW9uX19Hcm91cF9fNCApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNzEyNzoyOiBydWxlX19YRG9XaGlsZUV4cHJlc3Npb25fX0dyb3VwX18zX19JbXBsIHJ1bGVfX1hEb1doaWxlRXhwcmVzc2lvbl9fR3JvdXBfXzQKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE4NDY0OjE6ICggcnVsZV9fWERvV2hpbGVFeHByZXNzaW9uX19Hcm91cF9fM19fSW1wbCBydWxlX19YRG9XaGlsZUV4cHJlc3Npb25fX0dyb3VwX180ICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE4NDY1OjI6IHJ1bGVfX1hEb1doaWxlRXhwcmVzc2lvbl9fR3JvdXBfXzNfX0ltcGwgcnVsZV9fWERvV2hpbGVFeHByZXNzaW9uX19Hcm91cF9fNAogICAgICAgICAgICAgewotICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfNzApOworICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfNzgpOwogICAgICAgICAgICAgcnVsZV9fWERvV2hpbGVFeHByZXNzaW9uX19Hcm91cF9fM19fSW1wbCgpOwogCiAgICAgICAgICAgICBzdGF0ZS5fZnNwLS07CkBAIC01NjU4NywyMiArNjEwNDQsMjIgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YRG9XaGlsZUV4cHJlc3Npb25fX0dyb3VwX18zX19JbXBsIgotICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE3MTM0OjE6IHJ1bGVfX1hEb1doaWxlRXhwcmVzc2lvbl9fR3JvdXBfXzNfX0ltcGwgOiAoICd3aGlsZScgKSA7CisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTg0NzI6MTogcnVsZV9fWERvV2hpbGVFeHByZXNzaW9uX19Hcm91cF9fM19fSW1wbCA6ICggJ3doaWxlJyApIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YRG9XaGlsZUV4cHJlc3Npb25fX0dyb3VwX18zX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE3MTM4OjE6ICggKCAnd2hpbGUnICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTcxMzk6MTogKCAnd2hpbGUnICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE4NDc2OjE6ICggKCAnd2hpbGUnICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTg0Nzc6MTogKCAnd2hpbGUnICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE3MTM5OjE6ICggJ3doaWxlJyApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNzE0MDoyOiAnd2hpbGUnCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxODQ3NzoxOiAoICd3aGlsZScgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTg0Nzg6MjogJ3doaWxlJwogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYRG9XaGlsZUV4cHJlc3Npb25BY2Nlc3MoKS5nZXRXaGlsZUtleXdvcmRfMygpKTsgCiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBtYXRjaChpbnB1dCwxMjYsRk9MTE9XXzIpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOworICAgICAgICAgICAgbWF0Y2goaW5wdXQsMTM2LEZPTExPV18yKTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRYRG9XaGlsZUV4cHJlc3Npb25BY2Nlc3MoKS5nZXRXaGlsZUtleXdvcmRfMygpKTsgCiAgICAgICAgICAgICB9CkBAIC01NjYyOCwxNiArNjEwODUsMTYgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YRG9XaGlsZUV4cHJlc3Npb25fX0dyb3VwX180IgotICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE3MTQ5OjE6IHJ1bGVfX1hEb1doaWxlRXhwcmVzc2lvbl9fR3JvdXBfXzQgOiBydWxlX19YRG9XaGlsZUV4cHJlc3Npb25fX0dyb3VwX180X19JbXBsIHJ1bGVfX1hEb1doaWxlRXhwcmVzc2lvbl9fR3JvdXBfXzUgOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE4NDg3OjE6IHJ1bGVfX1hEb1doaWxlRXhwcmVzc2lvbl9fR3JvdXBfXzQgOiBydWxlX19YRG9XaGlsZUV4cHJlc3Npb25fX0dyb3VwX180X19JbXBsIHJ1bGVfX1hEb1doaWxlRXhwcmVzc2lvbl9fR3JvdXBfXzUgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1hEb1doaWxlRXhwcmVzc2lvbl9fR3JvdXBfXzQoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTcxNTM6MTogKCBydWxlX19YRG9XaGlsZUV4cHJlc3Npb25fX0dyb3VwX180X19JbXBsIHJ1bGVfX1hEb1doaWxlRXhwcmVzc2lvbl9fR3JvdXBfXzUgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTcxNTQ6MjogcnVsZV9fWERvV2hpbGVFeHByZXNzaW9uX19Hcm91cF9fNF9fSW1wbCBydWxlX19YRG9XaGlsZUV4cHJlc3Npb25fX0dyb3VwX181CisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxODQ5MToxOiAoIHJ1bGVfX1hEb1doaWxlRXhwcmVzc2lvbl9fR3JvdXBfXzRfX0ltcGwgcnVsZV9fWERvV2hpbGVFeHByZXNzaW9uX19Hcm91cF9fNSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxODQ5MjoyOiBydWxlX19YRG9XaGlsZUV4cHJlc3Npb25fX0dyb3VwX180X19JbXBsIHJ1bGVfX1hEb1doaWxlRXhwcmVzc2lvbl9fR3JvdXBfXzUKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzc0KTsKKyAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzgyKTsKICAgICAgICAgICAgIHJ1bGVfX1hEb1doaWxlRXhwcmVzc2lvbl9fR3JvdXBfXzRfX0ltcGwoKTsKIAogICAgICAgICAgICAgc3RhdGUuX2ZzcC0tOwpAQCAtNTY2NjYsMjIgKzYxMTIzLDIyIEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fWERvV2hpbGVFeHByZXNzaW9uX19Hcm91cF9fNF9fSW1wbCIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNzE2MToxOiBydWxlX19YRG9XaGlsZUV4cHJlc3Npb25fX0dyb3VwX180X19JbXBsIDogKCAnKCcgKSA7CisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTg0OTk6MTogcnVsZV9fWERvV2hpbGVFeHByZXNzaW9uX19Hcm91cF9fNF9fSW1wbCA6ICggJygnICkgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1hEb1doaWxlRXhwcmVzc2lvbl9fR3JvdXBfXzRfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTcxNjU6MTogKCAoICcoJyApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE3MTY2OjE6ICggJygnICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE4NTAzOjE6ICggKCAnKCcgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxODUwNDoxOiAoICcoJyApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNzE2NjoxOiAoICcoJyApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNzE2NzoyOiAnKCcKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE4NTA0OjE6ICggJygnICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE4NTA1OjI6ICcoJwogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYRG9XaGlsZUV4cHJlc3Npb25BY2Nlc3MoKS5nZXRMZWZ0UGFyZW50aGVzaXNLZXl3b3JkXzQoKSk7IAogICAgICAgICAgICAgfQotICAgICAgICAgICAgbWF0Y2goaW5wdXQsMTEzLEZPTExPV18yKTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKKyAgICAgICAgICAgIG1hdGNoKGlucHV0LDEyMyxGT0xMT1dfMik7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0WERvV2hpbGVFeHByZXNzaW9uQWNjZXNzKCkuZ2V0TGVmdFBhcmVudGhlc2lzS2V5d29yZF80KCkpOyAKICAgICAgICAgICAgIH0KQEAgLTU2NzA3LDE2ICs2MTE2NCwxNiBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX1hEb1doaWxlRXhwcmVzc2lvbl9fR3JvdXBfXzUiCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTcxNzY6MTogcnVsZV9fWERvV2hpbGVFeHByZXNzaW9uX19Hcm91cF9fNSA6IHJ1bGVfX1hEb1doaWxlRXhwcmVzc2lvbl9fR3JvdXBfXzVfX0ltcGwgcnVsZV9fWERvV2hpbGVFeHByZXNzaW9uX19Hcm91cF9fNiA7CisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTg1MTQ6MTogcnVsZV9fWERvV2hpbGVFeHByZXNzaW9uX19Hcm91cF9fNSA6IHJ1bGVfX1hEb1doaWxlRXhwcmVzc2lvbl9fR3JvdXBfXzVfX0ltcGwgcnVsZV9fWERvV2hpbGVFeHByZXNzaW9uX19Hcm91cF9fNiA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fWERvV2hpbGVFeHByZXNzaW9uX19Hcm91cF9fNSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNzE4MDoxOiAoIHJ1bGVfX1hEb1doaWxlRXhwcmVzc2lvbl9fR3JvdXBfXzVfX0ltcGwgcnVsZV9fWERvV2hpbGVFeHByZXNzaW9uX19Hcm91cF9fNiApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNzE4MToyOiBydWxlX19YRG9XaGlsZUV4cHJlc3Npb25fX0dyb3VwX181X19JbXBsIHJ1bGVfX1hEb1doaWxlRXhwcmVzc2lvbl9fR3JvdXBfXzYKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE4NTE4OjE6ICggcnVsZV9fWERvV2hpbGVFeHByZXNzaW9uX19Hcm91cF9fNV9fSW1wbCBydWxlX19YRG9XaGlsZUV4cHJlc3Npb25fX0dyb3VwX182ICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE4NTE5OjI6IHJ1bGVfX1hEb1doaWxlRXhwcmVzc2lvbl9fR3JvdXBfXzVfX0ltcGwgcnVsZV9fWERvV2hpbGVFeHByZXNzaW9uX19Hcm91cF9fNgogICAgICAgICAgICAgewotICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMTE4KTsKKyAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzEyNik7CiAgICAgICAgICAgICBydWxlX19YRG9XaGlsZUV4cHJlc3Npb25fX0dyb3VwX181X19JbXBsKCk7CiAKICAgICAgICAgICAgIHN0YXRlLl9mc3AtLTsKQEAgLTU2NzQ1LDIzICs2MTIwMiwyMyBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX1hEb1doaWxlRXhwcmVzc2lvbl9fR3JvdXBfXzVfX0ltcGwiCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTcxODg6MTogcnVsZV9fWERvV2hpbGVFeHByZXNzaW9uX19Hcm91cF9fNV9fSW1wbCA6ICggKCBydWxlX19YRG9XaGlsZUV4cHJlc3Npb25fX1ByZWRpY2F0ZUFzc2lnbm1lbnRfNSApICkgOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE4NTI2OjE6IHJ1bGVfX1hEb1doaWxlRXhwcmVzc2lvbl9fR3JvdXBfXzVfX0ltcGwgOiAoICggcnVsZV9fWERvV2hpbGVFeHByZXNzaW9uX19QcmVkaWNhdGVBc3NpZ25tZW50XzUgKSApIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YRG9XaGlsZUV4cHJlc3Npb25fX0dyb3VwX181X19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE3MTkyOjE6ICggKCAoIHJ1bGVfX1hEb1doaWxlRXhwcmVzc2lvbl9fUHJlZGljYXRlQXNzaWdubWVudF81ICkgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNzE5MzoxOiAoICggcnVsZV9fWERvV2hpbGVFeHByZXNzaW9uX19QcmVkaWNhdGVBc3NpZ25tZW50XzUgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxODUzMDoxOiAoICggKCBydWxlX19YRG9XaGlsZUV4cHJlc3Npb25fX1ByZWRpY2F0ZUFzc2lnbm1lbnRfNSApICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTg1MzE6MTogKCAoIHJ1bGVfX1hEb1doaWxlRXhwcmVzc2lvbl9fUHJlZGljYXRlQXNzaWdubWVudF81ICkgKQogICAgICAgICAgICAgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTcxOTM6MTogKCAoIHJ1bGVfX1hEb1doaWxlRXhwcmVzc2lvbl9fUHJlZGljYXRlQXNzaWdubWVudF81ICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTcxOTQ6MjogKCBydWxlX19YRG9XaGlsZUV4cHJlc3Npb25fX1ByZWRpY2F0ZUFzc2lnbm1lbnRfNSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxODUzMToxOiAoICggcnVsZV9fWERvV2hpbGVFeHByZXNzaW9uX19QcmVkaWNhdGVBc3NpZ25tZW50XzUgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxODUzMjoyOiAoIHJ1bGVfX1hEb1doaWxlRXhwcmVzc2lvbl9fUHJlZGljYXRlQXNzaWdubWVudF81ICkKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WERvV2hpbGVFeHByZXNzaW9uQWNjZXNzKCkuZ2V0UHJlZGljYXRlQXNzaWdubWVudF81KCkpOyAKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE3MTk1OjI6ICggcnVsZV9fWERvV2hpbGVFeHByZXNzaW9uX19QcmVkaWNhdGVBc3NpZ25tZW50XzUgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTcxOTU6MzogcnVsZV9fWERvV2hpbGVFeHByZXNzaW9uX19QcmVkaWNhdGVBc3NpZ25tZW50XzUKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE4NTMzOjI6ICggcnVsZV9fWERvV2hpbGVFeHByZXNzaW9uX19QcmVkaWNhdGVBc3NpZ25tZW50XzUgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTg1MzM6MzogcnVsZV9fWERvV2hpbGVFeHByZXNzaW9uX19QcmVkaWNhdGVBc3NpZ25tZW50XzUKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzIpOwogICAgICAgICAgICAgcnVsZV9fWERvV2hpbGVFeHByZXNzaW9uX19QcmVkaWNhdGVBc3NpZ25tZW50XzUoKTsKQEAgLTU2Nzk2LDE0ICs2MTI1MywxNCBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX1hEb1doaWxlRXhwcmVzc2lvbl9fR3JvdXBfXzYiCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTcyMDM6MTogcnVsZV9fWERvV2hpbGVFeHByZXNzaW9uX19Hcm91cF9fNiA6IHJ1bGVfX1hEb1doaWxlRXhwcmVzc2lvbl9fR3JvdXBfXzZfX0ltcGwgOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE4NTQxOjE6IHJ1bGVfX1hEb1doaWxlRXhwcmVzc2lvbl9fR3JvdXBfXzYgOiBydWxlX19YRG9XaGlsZUV4cHJlc3Npb25fX0dyb3VwX182X19JbXBsIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YRG9XaGlsZUV4cHJlc3Npb25fX0dyb3VwX182KCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE3MjA3OjE6ICggcnVsZV9fWERvV2hpbGVFeHByZXNzaW9uX19Hcm91cF9fNl9fSW1wbCApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNzIwODoyOiBydWxlX19YRG9XaGlsZUV4cHJlc3Npb25fX0dyb3VwX182X19JbXBsCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxODU0NToxOiAoIHJ1bGVfX1hEb1doaWxlRXhwcmVzc2lvbl9fR3JvdXBfXzZfX0ltcGwgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTg1NDY6MjogcnVsZV9fWERvV2hpbGVFeHByZXNzaW9uX19Hcm91cF9fNl9fSW1wbAogICAgICAgICAgICAgewogICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMik7CiAgICAgICAgICAgICBydWxlX19YRG9XaGlsZUV4cHJlc3Npb25fX0dyb3VwX182X19JbXBsKCk7CkBAIC01NjgyOSwyMiArNjEyODYsMjIgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YRG9XaGlsZUV4cHJlc3Npb25fX0dyb3VwX182X19JbXBsIgotICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE3MjE0OjE6IHJ1bGVfX1hEb1doaWxlRXhwcmVzc2lvbl9fR3JvdXBfXzZfX0ltcGwgOiAoICcpJyApIDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxODU1MjoxOiBydWxlX19YRG9XaGlsZUV4cHJlc3Npb25fX0dyb3VwX182X19JbXBsIDogKCAnKScgKSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fWERvV2hpbGVFeHByZXNzaW9uX19Hcm91cF9fNl9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNzIxODoxOiAoICggJyknICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTcyMTk6MTogKCAnKScgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTg1NTY6MTogKCAoICcpJyApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE4NTU3OjE6ICggJyknICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE3MjE5OjE6ICggJyknICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE3MjIwOjI6ICcpJworICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTg1NTc6MTogKCAnKScgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTg1NTg6MjogJyknCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhEb1doaWxlRXhwcmVzc2lvbkFjY2VzcygpLmdldFJpZ2h0UGFyZW50aGVzaXNLZXl3b3JkXzYoKSk7IAogICAgICAgICAgICAgfQotICAgICAgICAgICAgbWF0Y2goaW5wdXQsMTE0LEZPTExPV18yKTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKKyAgICAgICAgICAgIG1hdGNoKGlucHV0LDEyNCxGT0xMT1dfMik7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0WERvV2hpbGVFeHByZXNzaW9uQWNjZXNzKCkuZ2V0UmlnaHRQYXJlbnRoZXNpc0tleXdvcmRfNigpKTsgCiAgICAgICAgICAgICB9CkBAIC01Njg3MCwxNCArNjEzMjcsMTQgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YQmxvY2tFeHByZXNzaW9uX19Hcm91cF9fMCIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNzIzMDoxOiBydWxlX19YQmxvY2tFeHByZXNzaW9uX19Hcm91cF9fMCA6IHJ1bGVfX1hCbG9ja0V4cHJlc3Npb25fX0dyb3VwX18wX19JbXBsIHJ1bGVfX1hCbG9ja0V4cHJlc3Npb25fX0dyb3VwX18xIDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxODU2ODoxOiBydWxlX19YQmxvY2tFeHByZXNzaW9uX19Hcm91cF9fMCA6IHJ1bGVfX1hCbG9ja0V4cHJlc3Npb25fX0dyb3VwX18wX19JbXBsIHJ1bGVfX1hCbG9ja0V4cHJlc3Npb25fX0dyb3VwX18xIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YQmxvY2tFeHByZXNzaW9uX19Hcm91cF9fMCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNzIzNDoxOiAoIHJ1bGVfX1hCbG9ja0V4cHJlc3Npb25fX0dyb3VwX18wX19JbXBsIHJ1bGVfX1hCbG9ja0V4cHJlc3Npb25fX0dyb3VwX18xICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE3MjM1OjI6IHJ1bGVfX1hCbG9ja0V4cHJlc3Npb25fX0dyb3VwX18wX19JbXBsIHJ1bGVfX1hCbG9ja0V4cHJlc3Npb25fX0dyb3VwX18xCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxODU3MjoxOiAoIHJ1bGVfX1hCbG9ja0V4cHJlc3Npb25fX0dyb3VwX18wX19JbXBsIHJ1bGVfX1hCbG9ja0V4cHJlc3Npb25fX0dyb3VwX18xICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE4NTczOjI6IHJ1bGVfX1hCbG9ja0V4cHJlc3Npb25fX0dyb3VwX18wX19JbXBsIHJ1bGVfX1hCbG9ja0V4cHJlc3Npb25fX0dyb3VwX18xCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV18xMCk7CiAgICAgICAgICAgICBydWxlX19YQmxvY2tFeHByZXNzaW9uX19Hcm91cF9fMF9fSW1wbCgpOwpAQCAtNTY5MDgsMjMgKzYxMzY1LDIzIEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fWEJsb2NrRXhwcmVzc2lvbl9fR3JvdXBfXzBfX0ltcGwiCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTcyNDI6MTogcnVsZV9fWEJsb2NrRXhwcmVzc2lvbl9fR3JvdXBfXzBfX0ltcGwgOiAoICgpICkgOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE4NTgwOjE6IHJ1bGVfX1hCbG9ja0V4cHJlc3Npb25fX0dyb3VwX18wX19JbXBsIDogKCAoKSApIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YQmxvY2tFeHByZXNzaW9uX19Hcm91cF9fMF9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNzI0NjoxOiAoICggKCkgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNzI0NzoxOiAoICgpICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE4NTg0OjE6ICggKCAoKSApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE4NTg1OjE6ICggKCkgKQogICAgICAgICAgICAgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTcyNDc6MTogKCAoKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNzI0ODoyOiAoKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTg1ODU6MTogKCAoKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxODU4NjoyOiAoKQogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYQmxvY2tFeHByZXNzaW9uQWNjZXNzKCkuZ2V0WEJsb2NrRXhwcmVzc2lvbkFjdGlvbl8wKCkpOyAKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE3MjQ5OjI6ICgpCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNzI0OTozOiAKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE4NTg3OjI6ICgpCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxODU4NzozOiAKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIH0KIApAQCAtNTY5NDksMTYgKzYxNDA2LDE2IEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fWEJsb2NrRXhwcmVzc2lvbl9fR3JvdXBfXzEiCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTcyNTc6MTogcnVsZV9fWEJsb2NrRXhwcmVzc2lvbl9fR3JvdXBfXzEgOiBydWxlX19YQmxvY2tFeHByZXNzaW9uX19Hcm91cF9fMV9fSW1wbCBydWxlX19YQmxvY2tFeHByZXNzaW9uX19Hcm91cF9fMiA7CisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTg1OTU6MTogcnVsZV9fWEJsb2NrRXhwcmVzc2lvbl9fR3JvdXBfXzEgOiBydWxlX19YQmxvY2tFeHByZXNzaW9uX19Hcm91cF9fMV9fSW1wbCBydWxlX19YQmxvY2tFeHByZXNzaW9uX19Hcm91cF9fMiA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fWEJsb2NrRXhwcmVzc2lvbl9fR3JvdXBfXzEoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTcyNjE6MTogKCBydWxlX19YQmxvY2tFeHByZXNzaW9uX19Hcm91cF9fMV9fSW1wbCBydWxlX19YQmxvY2tFeHByZXNzaW9uX19Hcm91cF9fMiApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNzI2MjoyOiBydWxlX19YQmxvY2tFeHByZXNzaW9uX19Hcm91cF9fMV9fSW1wbCBydWxlX19YQmxvY2tFeHByZXNzaW9uX19Hcm91cF9fMgorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTg1OTk6MTogKCBydWxlX19YQmxvY2tFeHByZXNzaW9uX19Hcm91cF9fMV9fSW1wbCBydWxlX19YQmxvY2tFeHByZXNzaW9uX19Hcm91cF9fMiApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxODYwMDoyOiBydWxlX19YQmxvY2tFeHByZXNzaW9uX19Hcm91cF9fMV9fSW1wbCBydWxlX19YQmxvY2tFeHByZXNzaW9uX19Hcm91cF9fMgogICAgICAgICAgICAgewotICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMTMyKTsKKyAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzE0MCk7CiAgICAgICAgICAgICBydWxlX19YQmxvY2tFeHByZXNzaW9uX19Hcm91cF9fMV9fSW1wbCgpOwogCiAgICAgICAgICAgICBzdGF0ZS5fZnNwLS07CkBAIC01Njk4NywyMiArNjE0NDQsMjIgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YQmxvY2tFeHByZXNzaW9uX19Hcm91cF9fMV9fSW1wbCIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNzI2OToxOiBydWxlX19YQmxvY2tFeHByZXNzaW9uX19Hcm91cF9fMV9fSW1wbCA6ICggJ3snICkgOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE4NjA3OjE6IHJ1bGVfX1hCbG9ja0V4cHJlc3Npb25fX0dyb3VwX18xX19JbXBsIDogKCAneycgKSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fWEJsb2NrRXhwcmVzc2lvbl9fR3JvdXBfXzFfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTcyNzM6MTogKCAoICd7JyApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE3Mjc0OjE6ICggJ3snICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE4NjExOjE6ICggKCAneycgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxODYxMjoxOiAoICd7JyApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNzI3NDoxOiAoICd7JyApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNzI3NToyOiAneycKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE4NjEyOjE6ICggJ3snICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE4NjEzOjI6ICd7JwogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYQmxvY2tFeHByZXNzaW9uQWNjZXNzKCkuZ2V0TGVmdEN1cmx5QnJhY2tldEtleXdvcmRfMSgpKTsgCiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBtYXRjaChpbnB1dCw3MCxGT0xMT1dfMik7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CisgICAgICAgICAgICBtYXRjaChpbnB1dCw3NSxGT0xMT1dfMik7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0WEJsb2NrRXhwcmVzc2lvbkFjY2VzcygpLmdldExlZnRDdXJseUJyYWNrZXRLZXl3b3JkXzEoKSk7IAogICAgICAgICAgICAgfQpAQCAtNTcwMjgsMTYgKzYxNDg1LDE2IEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fWEJsb2NrRXhwcmVzc2lvbl9fR3JvdXBfXzIiCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTcyODQ6MTogcnVsZV9fWEJsb2NrRXhwcmVzc2lvbl9fR3JvdXBfXzIgOiBydWxlX19YQmxvY2tFeHByZXNzaW9uX19Hcm91cF9fMl9fSW1wbCBydWxlX19YQmxvY2tFeHByZXNzaW9uX19Hcm91cF9fMyA7CisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTg2MjI6MTogcnVsZV9fWEJsb2NrRXhwcmVzc2lvbl9fR3JvdXBfXzIgOiBydWxlX19YQmxvY2tFeHByZXNzaW9uX19Hcm91cF9fMl9fSW1wbCBydWxlX19YQmxvY2tFeHByZXNzaW9uX19Hcm91cF9fMyA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fWEJsb2NrRXhwcmVzc2lvbl9fR3JvdXBfXzIoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTcyODg6MTogKCBydWxlX19YQmxvY2tFeHByZXNzaW9uX19Hcm91cF9fMl9fSW1wbCBydWxlX19YQmxvY2tFeHByZXNzaW9uX19Hcm91cF9fMyApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNzI4OToyOiBydWxlX19YQmxvY2tFeHByZXNzaW9uX19Hcm91cF9fMl9fSW1wbCBydWxlX19YQmxvY2tFeHByZXNzaW9uX19Hcm91cF9fMworICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTg2MjY6MTogKCBydWxlX19YQmxvY2tFeHByZXNzaW9uX19Hcm91cF9fMl9fSW1wbCBydWxlX19YQmxvY2tFeHByZXNzaW9uX19Hcm91cF9fMyApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxODYyNzoyOiBydWxlX19YQmxvY2tFeHByZXNzaW9uX19Hcm91cF9fMl9fSW1wbCBydWxlX19YQmxvY2tFeHByZXNzaW9uX19Hcm91cF9fMwogICAgICAgICAgICAgewotICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMTMyKTsKKyAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzE0MCk7CiAgICAgICAgICAgICBydWxlX19YQmxvY2tFeHByZXNzaW9uX19Hcm91cF9fMl9fSW1wbCgpOwogCiAgICAgICAgICAgICBzdGF0ZS5fZnNwLS07CkBAIC01NzA2NiwzNyArNjE1MjMsMzcgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YQmxvY2tFeHByZXNzaW9uX19Hcm91cF9fMl9fSW1wbCIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNzI5NjoxOiBydWxlX19YQmxvY2tFeHByZXNzaW9uX19Hcm91cF9fMl9fSW1wbCA6ICggKCBydWxlX19YQmxvY2tFeHByZXNzaW9uX19Hcm91cF8yX18wICkqICkgOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE4NjM0OjE6IHJ1bGVfX1hCbG9ja0V4cHJlc3Npb25fX0dyb3VwX18yX19JbXBsIDogKCAoIHJ1bGVfX1hCbG9ja0V4cHJlc3Npb25fX0dyb3VwXzJfXzAgKSogKSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fWEJsb2NrRXhwcmVzc2lvbl9fR3JvdXBfXzJfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTczMDA6MTogKCAoICggcnVsZV9fWEJsb2NrRXhwcmVzc2lvbl9fR3JvdXBfMl9fMCApKiApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE3MzAxOjE6ICggKCBydWxlX19YQmxvY2tFeHByZXNzaW9uX19Hcm91cF8yX18wICkqICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE4NjM4OjE6ICggKCAoIHJ1bGVfX1hCbG9ja0V4cHJlc3Npb25fX0dyb3VwXzJfXzAgKSogKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxODYzOToxOiAoICggcnVsZV9fWEJsb2NrRXhwcmVzc2lvbl9fR3JvdXBfMl9fMCApKiApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNzMwMToxOiAoICggcnVsZV9fWEJsb2NrRXhwcmVzc2lvbl9fR3JvdXBfMl9fMCApKiApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNzMwMjoyOiAoIHJ1bGVfX1hCbG9ja0V4cHJlc3Npb25fX0dyb3VwXzJfXzAgKSoKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE4NjM5OjE6ICggKCBydWxlX19YQmxvY2tFeHByZXNzaW9uX19Hcm91cF8yX18wICkqICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE4NjQwOjI6ICggcnVsZV9fWEJsb2NrRXhwcmVzc2lvbl9fR3JvdXBfMl9fMCApKgogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYQmxvY2tFeHByZXNzaW9uQWNjZXNzKCkuZ2V0R3JvdXBfMigpKTsgCiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNzMwMzoyOiAoIHJ1bGVfX1hCbG9ja0V4cHJlc3Npb25fX0dyb3VwXzJfXzAgKSoKLSAgICAgICAgICAgIGxvb3AxMzU6CisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxODY0MToyOiAoIHJ1bGVfX1hCbG9ja0V4cHJlc3Npb25fX0dyb3VwXzJfXzAgKSoKKyAgICAgICAgICAgIGxvb3AxNDg6CiAgICAgICAgICAgICBkbyB7Ci0gICAgICAgICAgICAgICAgaW50IGFsdDEzNT0yOwotICAgICAgICAgICAgICAgIGludCBMQTEzNV8wID0gaW5wdXQuTEEoMSk7CisgICAgICAgICAgICAgICAgaW50IGFsdDE0OD0yOworICAgICAgICAgICAgICAgIGludCBMQTE0OF8wID0gaW5wdXQuTEEoMSk7CiAKLSAgICAgICAgICAgICAgICBpZiAoICgoTEExMzVfMD49UlVMRV9TVFJJTkcgJiYgTEExMzVfMDw9UlVMRV9ERUNJTUFMKXx8TEExMzVfMD09Mjd8fChMQTEzNV8wPj0zNCAmJiBMQTEzNV8wPD0zNSl8fExBMTM1XzA9PTQwfHwoTEExMzVfMD49NDQgJiYgTEExMzVfMDw9NTApfHxMQTEzNV8wPT03MHx8TEExMzVfMD09OTV8fExBMTM1XzA9PTExM3x8KExBMTM1XzA+PTExNyAmJiBMQTEzNV8wPD0xMTgpfHxMQTEzNV8wPT0xMjB8fExBMTM1XzA9PTEyMnx8KExBMTM1XzA+PTEyNiAmJiBMQTEzNV8wPD0xMzMpfHxMQTEzNV8wPT0xMzV8fChMQTEzNV8wPj0xNTMgJiYgTEExMzVfMDw9MTU0KSkgKSB7Ci0gICAgICAgICAgICAgICAgICAgIGFsdDEzNT0xOworICAgICAgICAgICAgICAgIGlmICggKChMQTE0OF8wPj1SVUxFX1NUUklORyAmJiBMQTE0OF8wPD1SVUxFX0RFQ0lNQUwpfHxMQTE0OF8wPT0yN3x8KExBMTQ4XzA+PTM0ICYmIExBMTQ4XzA8PTM1KXx8TEExNDhfMD09NDB8fChMQTE0OF8wPj00NCAmJiBMQTE0OF8wPD01MCl8fExBMTQ4XzA9PTc1fHxMQTE0OF8wPT0xMDJ8fExBMTQ4XzA9PTEyM3x8KExBMTQ4XzA+PTEyNyAmJiBMQTE0OF8wPD0xMjgpfHxMQTE0OF8wPT0xMzB8fExBMTQ4XzA9PTEzMnx8KExBMTQ4XzA+PTEzNiAmJiBMQTE0OF8wPD0xNDMpfHxMQTE0OF8wPT0xNDV8fChMQTE0OF8wPj0xNjUgJiYgTEExNDhfMDw9MTY2KSkgKSB7CisgICAgICAgICAgICAgICAgICAgIGFsdDE0OD0xOwogICAgICAgICAgICAgICAgIH0KIAogCi0gICAgICAgICAgICAgICAgc3dpdGNoIChhbHQxMzUpIHsKKyAgICAgICAgICAgICAgICBzd2l0Y2ggKGFsdDE0OCkgewogICAgICAgICAgICAgCWNhc2UgMSA6Ci0gICAgICAgICAgICAJICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE3MzAzOjM6IHJ1bGVfX1hCbG9ja0V4cHJlc3Npb25fX0dyb3VwXzJfXzAKKyAgICAgICAgICAgIAkgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTg2NDE6MzogcnVsZV9fWEJsb2NrRXhwcmVzc2lvbl9fR3JvdXBfMl9fMAogICAgICAgICAgICAgCSAgICB7Ci0gICAgICAgICAgICAJICAgIHB1c2hGb2xsb3coRk9MTE9XXzExNyk7CisgICAgICAgICAgICAJICAgIHB1c2hGb2xsb3coRk9MTE9XXzEyNSk7CiAgICAgICAgICAgICAJICAgIHJ1bGVfX1hCbG9ja0V4cHJlc3Npb25fX0dyb3VwXzJfXzAoKTsKIAogICAgICAgICAgICAgCSAgICBzdGF0ZS5fZnNwLS07CkBAIC01NzEwNiw3ICs2MTU2Myw3IEBACiAgICAgICAgICAgICAJICAgIGJyZWFrOwogCiAgICAgICAgICAgICAJZGVmYXVsdCA6Ci0gICAgICAgICAgICAJICAgIGJyZWFrIGxvb3AxMzU7CisgICAgICAgICAgICAJICAgIGJyZWFrIGxvb3AxNDg7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfSB3aGlsZSAodHJ1ZSk7CiAKQEAgLTU3MTM1LDE0ICs2MTU5MiwxNCBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX1hCbG9ja0V4cHJlc3Npb25fX0dyb3VwX18zIgotICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE3MzExOjE6IHJ1bGVfX1hCbG9ja0V4cHJlc3Npb25fX0dyb3VwX18zIDogcnVsZV9fWEJsb2NrRXhwcmVzc2lvbl9fR3JvdXBfXzNfX0ltcGwgOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE4NjQ5OjE6IHJ1bGVfX1hCbG9ja0V4cHJlc3Npb25fX0dyb3VwX18zIDogcnVsZV9fWEJsb2NrRXhwcmVzc2lvbl9fR3JvdXBfXzNfX0ltcGwgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1hCbG9ja0V4cHJlc3Npb25fX0dyb3VwX18zKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE3MzE1OjE6ICggcnVsZV9fWEJsb2NrRXhwcmVzc2lvbl9fR3JvdXBfXzNfX0ltcGwgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTczMTY6MjogcnVsZV9fWEJsb2NrRXhwcmVzc2lvbl9fR3JvdXBfXzNfX0ltcGwKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE4NjUzOjE6ICggcnVsZV9fWEJsb2NrRXhwcmVzc2lvbl9fR3JvdXBfXzNfX0ltcGwgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTg2NTQ6MjogcnVsZV9fWEJsb2NrRXhwcmVzc2lvbl9fR3JvdXBfXzNfX0ltcGwKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzIpOwogICAgICAgICAgICAgcnVsZV9fWEJsb2NrRXhwcmVzc2lvbl9fR3JvdXBfXzNfX0ltcGwoKTsKQEAgLTU3MTY4LDIyICs2MTYyNSwyMiBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX1hCbG9ja0V4cHJlc3Npb25fX0dyb3VwX18zX19JbXBsIgotICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE3MzIyOjE6IHJ1bGVfX1hCbG9ja0V4cHJlc3Npb25fX0dyb3VwX18zX19JbXBsIDogKCAnfScgKSA7CisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTg2NjA6MTogcnVsZV9fWEJsb2NrRXhwcmVzc2lvbl9fR3JvdXBfXzNfX0ltcGwgOiAoICd9JyApIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YQmxvY2tFeHByZXNzaW9uX19Hcm91cF9fM19fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNzMyNjoxOiAoICggJ30nICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTczMjc6MTogKCAnfScgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTg2NjQ6MTogKCAoICd9JyApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE4NjY1OjE6ICggJ30nICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE3MzI3OjE6ICggJ30nICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE3MzI4OjI6ICd9JworICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTg2NjU6MTogKCAnfScgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTg2NjY6MjogJ30nCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhCbG9ja0V4cHJlc3Npb25BY2Nlc3MoKS5nZXRSaWdodEN1cmx5QnJhY2tldEtleXdvcmRfMygpKTsgCiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBtYXRjaChpbnB1dCw3MSxGT0xMT1dfMik7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CisgICAgICAgICAgICBtYXRjaChpbnB1dCw3NixGT0xMT1dfMik7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0WEJsb2NrRXhwcmVzc2lvbkFjY2VzcygpLmdldFJpZ2h0Q3VybHlCcmFja2V0S2V5d29yZF8zKCkpOyAKICAgICAgICAgICAgIH0KQEAgLTU3MjA5LDE2ICs2MTY2NiwxNiBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX1hCbG9ja0V4cHJlc3Npb25fX0dyb3VwXzJfXzAiCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTczMzg6MTogcnVsZV9fWEJsb2NrRXhwcmVzc2lvbl9fR3JvdXBfMl9fMCA6IHJ1bGVfX1hCbG9ja0V4cHJlc3Npb25fX0dyb3VwXzJfXzBfX0ltcGwgcnVsZV9fWEJsb2NrRXhwcmVzc2lvbl9fR3JvdXBfMl9fMSA7CisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTg2NzY6MTogcnVsZV9fWEJsb2NrRXhwcmVzc2lvbl9fR3JvdXBfMl9fMCA6IHJ1bGVfX1hCbG9ja0V4cHJlc3Npb25fX0dyb3VwXzJfXzBfX0ltcGwgcnVsZV9fWEJsb2NrRXhwcmVzc2lvbl9fR3JvdXBfMl9fMSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fWEJsb2NrRXhwcmVzc2lvbl9fR3JvdXBfMl9fMCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNzM0MjoxOiAoIHJ1bGVfX1hCbG9ja0V4cHJlc3Npb25fX0dyb3VwXzJfXzBfX0ltcGwgcnVsZV9fWEJsb2NrRXhwcmVzc2lvbl9fR3JvdXBfMl9fMSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNzM0MzoyOiBydWxlX19YQmxvY2tFeHByZXNzaW9uX19Hcm91cF8yX18wX19JbXBsIHJ1bGVfX1hCbG9ja0V4cHJlc3Npb25fX0dyb3VwXzJfXzEKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE4NjgwOjE6ICggcnVsZV9fWEJsb2NrRXhwcmVzc2lvbl9fR3JvdXBfMl9fMF9fSW1wbCBydWxlX19YQmxvY2tFeHByZXNzaW9uX19Hcm91cF8yX18xICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE4NjgxOjI6IHJ1bGVfX1hCbG9ja0V4cHJlc3Npb25fX0dyb3VwXzJfXzBfX0ltcGwgcnVsZV9fWEJsb2NrRXhwcmVzc2lvbl9fR3JvdXBfMl9fMQogICAgICAgICAgICAgewotICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfNjYpOworICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfNzQpOwogICAgICAgICAgICAgcnVsZV9fWEJsb2NrRXhwcmVzc2lvbl9fR3JvdXBfMl9fMF9fSW1wbCgpOwogCiAgICAgICAgICAgICBzdGF0ZS5fZnNwLS07CkBAIC01NzI0NywyMyArNjE3MDQsMjMgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YQmxvY2tFeHByZXNzaW9uX19Hcm91cF8yX18wX19JbXBsIgotICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE3MzUwOjE6IHJ1bGVfX1hCbG9ja0V4cHJlc3Npb25fX0dyb3VwXzJfXzBfX0ltcGwgOiAoICggcnVsZV9fWEJsb2NrRXhwcmVzc2lvbl9fRXhwcmVzc2lvbnNBc3NpZ25tZW50XzJfMCApICkgOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE4Njg4OjE6IHJ1bGVfX1hCbG9ja0V4cHJlc3Npb25fX0dyb3VwXzJfXzBfX0ltcGwgOiAoICggcnVsZV9fWEJsb2NrRXhwcmVzc2lvbl9fRXhwcmVzc2lvbnNBc3NpZ25tZW50XzJfMCApICkgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1hCbG9ja0V4cHJlc3Npb25fX0dyb3VwXzJfXzBfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTczNTQ6MTogKCAoICggcnVsZV9fWEJsb2NrRXhwcmVzc2lvbl9fRXhwcmVzc2lvbnNBc3NpZ25tZW50XzJfMCApICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTczNTU6MTogKCAoIHJ1bGVfX1hCbG9ja0V4cHJlc3Npb25fX0V4cHJlc3Npb25zQXNzaWdubWVudF8yXzAgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxODY5MjoxOiAoICggKCBydWxlX19YQmxvY2tFeHByZXNzaW9uX19FeHByZXNzaW9uc0Fzc2lnbm1lbnRfMl8wICkgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxODY5MzoxOiAoICggcnVsZV9fWEJsb2NrRXhwcmVzc2lvbl9fRXhwcmVzc2lvbnNBc3NpZ25tZW50XzJfMCApICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE3MzU1OjE6ICggKCBydWxlX19YQmxvY2tFeHByZXNzaW9uX19FeHByZXNzaW9uc0Fzc2lnbm1lbnRfMl8wICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTczNTY6MjogKCBydWxlX19YQmxvY2tFeHByZXNzaW9uX19FeHByZXNzaW9uc0Fzc2lnbm1lbnRfMl8wICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE4NjkzOjE6ICggKCBydWxlX19YQmxvY2tFeHByZXNzaW9uX19FeHByZXNzaW9uc0Fzc2lnbm1lbnRfMl8wICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTg2OTQ6MjogKCBydWxlX19YQmxvY2tFeHByZXNzaW9uX19FeHByZXNzaW9uc0Fzc2lnbm1lbnRfMl8wICkKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WEJsb2NrRXhwcmVzc2lvbkFjY2VzcygpLmdldEV4cHJlc3Npb25zQXNzaWdubWVudF8yXzAoKSk7IAogICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTczNTc6MjogKCBydWxlX19YQmxvY2tFeHByZXNzaW9uX19FeHByZXNzaW9uc0Fzc2lnbm1lbnRfMl8wICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE3MzU3OjM6IHJ1bGVfX1hCbG9ja0V4cHJlc3Npb25fX0V4cHJlc3Npb25zQXNzaWdubWVudF8yXzAKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE4Njk1OjI6ICggcnVsZV9fWEJsb2NrRXhwcmVzc2lvbl9fRXhwcmVzc2lvbnNBc3NpZ25tZW50XzJfMCApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxODY5NTozOiBydWxlX19YQmxvY2tFeHByZXNzaW9uX19FeHByZXNzaW9uc0Fzc2lnbm1lbnRfMl8wCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV18yKTsKICAgICAgICAgICAgIHJ1bGVfX1hCbG9ja0V4cHJlc3Npb25fX0V4cHJlc3Npb25zQXNzaWdubWVudF8yXzAoKTsKQEAgLTU3Mjk4LDE0ICs2MTc1NSwxNCBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX1hCbG9ja0V4cHJlc3Npb25fX0dyb3VwXzJfXzEiCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTczNjU6MTogcnVsZV9fWEJsb2NrRXhwcmVzc2lvbl9fR3JvdXBfMl9fMSA6IHJ1bGVfX1hCbG9ja0V4cHJlc3Npb25fX0dyb3VwXzJfXzFfX0ltcGwgOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE4NzAzOjE6IHJ1bGVfX1hCbG9ja0V4cHJlc3Npb25fX0dyb3VwXzJfXzEgOiBydWxlX19YQmxvY2tFeHByZXNzaW9uX19Hcm91cF8yX18xX19JbXBsIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YQmxvY2tFeHByZXNzaW9uX19Hcm91cF8yX18xKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE3MzY5OjE6ICggcnVsZV9fWEJsb2NrRXhwcmVzc2lvbl9fR3JvdXBfMl9fMV9fSW1wbCApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNzM3MDoyOiBydWxlX19YQmxvY2tFeHByZXNzaW9uX19Hcm91cF8yX18xX19JbXBsCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxODcwNzoxOiAoIHJ1bGVfX1hCbG9ja0V4cHJlc3Npb25fX0dyb3VwXzJfXzFfX0ltcGwgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTg3MDg6MjogcnVsZV9fWEJsb2NrRXhwcmVzc2lvbl9fR3JvdXBfMl9fMV9fSW1wbAogICAgICAgICAgICAgewogICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMik7CiAgICAgICAgICAgICBydWxlX19YQmxvY2tFeHByZXNzaW9uX19Hcm91cF8yX18xX19JbXBsKCk7CkBAIC01NzMzMSwzMyArNjE3ODgsMzMgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YQmxvY2tFeHByZXNzaW9uX19Hcm91cF8yX18xX19JbXBsIgotICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE3Mzc2OjE6IHJ1bGVfX1hCbG9ja0V4cHJlc3Npb25fX0dyb3VwXzJfXzFfX0ltcGwgOiAoICggJzsnICk/ICkgOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE4NzE0OjE6IHJ1bGVfX1hCbG9ja0V4cHJlc3Npb25fX0dyb3VwXzJfXzFfX0ltcGwgOiAoICggJzsnICk/ICkgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1hCbG9ja0V4cHJlc3Npb25fX0dyb3VwXzJfXzFfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTczODA6MTogKCAoICggJzsnICk/ICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTczODE6MTogKCAoICc7JyApPyApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxODcxODoxOiAoICggKCAnOycgKT8gKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxODcxOToxOiAoICggJzsnICk/ICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE3MzgxOjE6ICggKCAnOycgKT8gKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTczODI6MjogKCAnOycgKT8KKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE4NzE5OjE6ICggKCAnOycgKT8gKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTg3MjA6MjogKCAnOycgKT8KICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WEJsb2NrRXhwcmVzc2lvbkFjY2VzcygpLmdldFNlbWljb2xvbktleXdvcmRfMl8xKCkpOyAKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE3MzgzOjI6ICggJzsnICk/Ci0gICAgICAgICAgICBpbnQgYWx0MTM2PTI7Ci0gICAgICAgICAgICBpbnQgTEExMzZfMCA9IGlucHV0LkxBKDEpOworICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTg3MjE6MjogKCAnOycgKT8KKyAgICAgICAgICAgIGludCBhbHQxNDk9MjsKKyAgICAgICAgICAgIGludCBMQTE0OV8wID0gaW5wdXQuTEEoMSk7CiAKLSAgICAgICAgICAgIGlmICggKExBMTM2XzA9PTExMSkgKSB7Ci0gICAgICAgICAgICAgICAgYWx0MTM2PTE7CisgICAgICAgICAgICBpZiAoIChMQTE0OV8wPT0xMjEpICkgeworICAgICAgICAgICAgICAgIGFsdDE0OT0xOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgc3dpdGNoIChhbHQxMzYpIHsKKyAgICAgICAgICAgIHN3aXRjaCAoYWx0MTQ5KSB7CiAgICAgICAgICAgICAgICAgY2FzZSAxIDoKLSAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTczODM6MzogJzsnCisgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE4NzIxOjM6ICc7JwogICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIG1hdGNoKGlucHV0LDExMSxGT0xMT1dfMik7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CisgICAgICAgICAgICAgICAgICAgIG1hdGNoKGlucHV0LDEyMSxGT0xMT1dfMik7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CiAKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICBicmVhazsKQEAgLTU3Mzg5LDE2ICs2MTg0NiwxNiBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX1hWYXJpYWJsZURlY2xhcmF0aW9uX19Hcm91cF9fMCIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNzM5MjoxOiBydWxlX19YVmFyaWFibGVEZWNsYXJhdGlvbl9fR3JvdXBfXzAgOiBydWxlX19YVmFyaWFibGVEZWNsYXJhdGlvbl9fR3JvdXBfXzBfX0ltcGwgcnVsZV9fWFZhcmlhYmxlRGVjbGFyYXRpb25fX0dyb3VwX18xIDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxODczMDoxOiBydWxlX19YVmFyaWFibGVEZWNsYXJhdGlvbl9fR3JvdXBfXzAgOiBydWxlX19YVmFyaWFibGVEZWNsYXJhdGlvbl9fR3JvdXBfXzBfX0ltcGwgcnVsZV9fWFZhcmlhYmxlRGVjbGFyYXRpb25fX0dyb3VwX18xIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YVmFyaWFibGVEZWNsYXJhdGlvbl9fR3JvdXBfXzAoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTczOTY6MTogKCBydWxlX19YVmFyaWFibGVEZWNsYXJhdGlvbl9fR3JvdXBfXzBfX0ltcGwgcnVsZV9fWFZhcmlhYmxlRGVjbGFyYXRpb25fX0dyb3VwX18xICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE3Mzk3OjI6IHJ1bGVfX1hWYXJpYWJsZURlY2xhcmF0aW9uX19Hcm91cF9fMF9fSW1wbCBydWxlX19YVmFyaWFibGVEZWNsYXJhdGlvbl9fR3JvdXBfXzEKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE4NzM0OjE6ICggcnVsZV9fWFZhcmlhYmxlRGVjbGFyYXRpb25fX0dyb3VwX18wX19JbXBsIHJ1bGVfX1hWYXJpYWJsZURlY2xhcmF0aW9uX19Hcm91cF9fMSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxODczNToyOiBydWxlX19YVmFyaWFibGVEZWNsYXJhdGlvbl9fR3JvdXBfXzBfX0ltcGwgcnVsZV9fWFZhcmlhYmxlRGVjbGFyYXRpb25fX0dyb3VwX18xCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV18xMzMpOworICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMTQxKTsKICAgICAgICAgICAgIHJ1bGVfX1hWYXJpYWJsZURlY2xhcmF0aW9uX19Hcm91cF9fMF9fSW1wbCgpOwogCiAgICAgICAgICAgICBzdGF0ZS5fZnNwLS07CkBAIC01NzQyNywyMyArNjE4ODQsMjMgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YVmFyaWFibGVEZWNsYXJhdGlvbl9fR3JvdXBfXzBfX0ltcGwiCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTc0MDQ6MTogcnVsZV9fWFZhcmlhYmxlRGVjbGFyYXRpb25fX0dyb3VwX18wX19JbXBsIDogKCAoKSApIDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxODc0MjoxOiBydWxlX19YVmFyaWFibGVEZWNsYXJhdGlvbl9fR3JvdXBfXzBfX0ltcGwgOiAoICgpICkgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1hWYXJpYWJsZURlY2xhcmF0aW9uX19Hcm91cF9fMF9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNzQwODoxOiAoICggKCkgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNzQwOToxOiAoICgpICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE4NzQ2OjE6ICggKCAoKSApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE4NzQ3OjE6ICggKCkgKQogICAgICAgICAgICAgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTc0MDk6MTogKCAoKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNzQxMDoyOiAoKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTg3NDc6MTogKCAoKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxODc0ODoyOiAoKQogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYVmFyaWFibGVEZWNsYXJhdGlvbkFjY2VzcygpLmdldFhWYXJpYWJsZURlY2xhcmF0aW9uQWN0aW9uXzAoKSk7IAogICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTc0MTE6MjogKCkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE3NDExOjM6IAorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTg3NDk6MjogKCkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE4NzQ5OjM6IAogICAgICAgICAgICAgewogICAgICAgICAgICAgfQogCkBAIC01NzQ2OCwxNiArNjE5MjUsMTYgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YVmFyaWFibGVEZWNsYXJhdGlvbl9fR3JvdXBfXzEiCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTc0MTk6MTogcnVsZV9fWFZhcmlhYmxlRGVjbGFyYXRpb25fX0dyb3VwX18xIDogcnVsZV9fWFZhcmlhYmxlRGVjbGFyYXRpb25fX0dyb3VwX18xX19JbXBsIHJ1bGVfX1hWYXJpYWJsZURlY2xhcmF0aW9uX19Hcm91cF9fMiA7CisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTg3NTc6MTogcnVsZV9fWFZhcmlhYmxlRGVjbGFyYXRpb25fX0dyb3VwX18xIDogcnVsZV9fWFZhcmlhYmxlRGVjbGFyYXRpb25fX0dyb3VwX18xX19JbXBsIHJ1bGVfX1hWYXJpYWJsZURlY2xhcmF0aW9uX19Hcm91cF9fMiA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fWFZhcmlhYmxlRGVjbGFyYXRpb25fX0dyb3VwX18xKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE3NDIzOjE6ICggcnVsZV9fWFZhcmlhYmxlRGVjbGFyYXRpb25fX0dyb3VwX18xX19JbXBsIHJ1bGVfX1hWYXJpYWJsZURlY2xhcmF0aW9uX19Hcm91cF9fMiApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNzQyNDoyOiBydWxlX19YVmFyaWFibGVEZWNsYXJhdGlvbl9fR3JvdXBfXzFfX0ltcGwgcnVsZV9fWFZhcmlhYmxlRGVjbGFyYXRpb25fX0dyb3VwX18yCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxODc2MToxOiAoIHJ1bGVfX1hWYXJpYWJsZURlY2xhcmF0aW9uX19Hcm91cF9fMV9fSW1wbCBydWxlX19YVmFyaWFibGVEZWNsYXJhdGlvbl9fR3JvdXBfXzIgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTg3NjI6MjogcnVsZV9fWFZhcmlhYmxlRGVjbGFyYXRpb25fX0dyb3VwX18xX19JbXBsIHJ1bGVfX1hWYXJpYWJsZURlY2xhcmF0aW9uX19Hcm91cF9fMgogICAgICAgICAgICAgewotICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfOTEpOworICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfOTkpOwogICAgICAgICAgICAgcnVsZV9fWFZhcmlhYmxlRGVjbGFyYXRpb25fX0dyb3VwX18xX19JbXBsKCk7CiAKICAgICAgICAgICAgIHN0YXRlLl9mc3AtLTsKQEAgLTU3NTA2LDIzICs2MTk2MywyMyBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX1hWYXJpYWJsZURlY2xhcmF0aW9uX19Hcm91cF9fMV9fSW1wbCIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNzQzMToxOiBydWxlX19YVmFyaWFibGVEZWNsYXJhdGlvbl9fR3JvdXBfXzFfX0ltcGwgOiAoICggcnVsZV9fWFZhcmlhYmxlRGVjbGFyYXRpb25fX0FsdGVybmF0aXZlc18xICkgKSA7CisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTg3Njk6MTogcnVsZV9fWFZhcmlhYmxlRGVjbGFyYXRpb25fX0dyb3VwX18xX19JbXBsIDogKCAoIHJ1bGVfX1hWYXJpYWJsZURlY2xhcmF0aW9uX19BbHRlcm5hdGl2ZXNfMSApICkgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1hWYXJpYWJsZURlY2xhcmF0aW9uX19Hcm91cF9fMV9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNzQzNToxOiAoICggKCBydWxlX19YVmFyaWFibGVEZWNsYXJhdGlvbl9fQWx0ZXJuYXRpdmVzXzEgKSApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE3NDM2OjE6ICggKCBydWxlX19YVmFyaWFibGVEZWNsYXJhdGlvbl9fQWx0ZXJuYXRpdmVzXzEgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxODc3MzoxOiAoICggKCBydWxlX19YVmFyaWFibGVEZWNsYXJhdGlvbl9fQWx0ZXJuYXRpdmVzXzEgKSApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE4Nzc0OjE6ICggKCBydWxlX19YVmFyaWFibGVEZWNsYXJhdGlvbl9fQWx0ZXJuYXRpdmVzXzEgKSApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNzQzNjoxOiAoICggcnVsZV9fWFZhcmlhYmxlRGVjbGFyYXRpb25fX0FsdGVybmF0aXZlc18xICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTc0Mzc6MjogKCBydWxlX19YVmFyaWFibGVEZWNsYXJhdGlvbl9fQWx0ZXJuYXRpdmVzXzEgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTg3NzQ6MTogKCAoIHJ1bGVfX1hWYXJpYWJsZURlY2xhcmF0aW9uX19BbHRlcm5hdGl2ZXNfMSApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE4Nzc1OjI6ICggcnVsZV9fWFZhcmlhYmxlRGVjbGFyYXRpb25fX0FsdGVybmF0aXZlc18xICkKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WFZhcmlhYmxlRGVjbGFyYXRpb25BY2Nlc3MoKS5nZXRBbHRlcm5hdGl2ZXNfMSgpKTsgCiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNzQzODoyOiAoIHJ1bGVfX1hWYXJpYWJsZURlY2xhcmF0aW9uX19BbHRlcm5hdGl2ZXNfMSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNzQzODozOiBydWxlX19YVmFyaWFibGVEZWNsYXJhdGlvbl9fQWx0ZXJuYXRpdmVzXzEKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE4Nzc2OjI6ICggcnVsZV9fWFZhcmlhYmxlRGVjbGFyYXRpb25fX0FsdGVybmF0aXZlc18xICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE4Nzc2OjM6IHJ1bGVfX1hWYXJpYWJsZURlY2xhcmF0aW9uX19BbHRlcm5hdGl2ZXNfMQogICAgICAgICAgICAgewogICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMik7CiAgICAgICAgICAgICBydWxlX19YVmFyaWFibGVEZWNsYXJhdGlvbl9fQWx0ZXJuYXRpdmVzXzEoKTsKQEAgLTU3NTU3LDE2ICs2MjAxNCwxNiBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX1hWYXJpYWJsZURlY2xhcmF0aW9uX19Hcm91cF9fMiIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNzQ0NjoxOiBydWxlX19YVmFyaWFibGVEZWNsYXJhdGlvbl9fR3JvdXBfXzIgOiBydWxlX19YVmFyaWFibGVEZWNsYXJhdGlvbl9fR3JvdXBfXzJfX0ltcGwgcnVsZV9fWFZhcmlhYmxlRGVjbGFyYXRpb25fX0dyb3VwX18zIDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxODc4NDoxOiBydWxlX19YVmFyaWFibGVEZWNsYXJhdGlvbl9fR3JvdXBfXzIgOiBydWxlX19YVmFyaWFibGVEZWNsYXJhdGlvbl9fR3JvdXBfXzJfX0ltcGwgcnVsZV9fWFZhcmlhYmxlRGVjbGFyYXRpb25fX0dyb3VwX18zIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YVmFyaWFibGVEZWNsYXJhdGlvbl9fR3JvdXBfXzIoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTc0NTA6MTogKCBydWxlX19YVmFyaWFibGVEZWNsYXJhdGlvbl9fR3JvdXBfXzJfX0ltcGwgcnVsZV9fWFZhcmlhYmxlRGVjbGFyYXRpb25fX0dyb3VwX18zICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE3NDUxOjI6IHJ1bGVfX1hWYXJpYWJsZURlY2xhcmF0aW9uX19Hcm91cF9fMl9fSW1wbCBydWxlX19YVmFyaWFibGVEZWNsYXJhdGlvbl9fR3JvdXBfXzMKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE4Nzg4OjE6ICggcnVsZV9fWFZhcmlhYmxlRGVjbGFyYXRpb25fX0dyb3VwX18yX19JbXBsIHJ1bGVfX1hWYXJpYWJsZURlY2xhcmF0aW9uX19Hcm91cF9fMyApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxODc4OToyOiBydWxlX19YVmFyaWFibGVEZWNsYXJhdGlvbl9fR3JvdXBfXzJfX0ltcGwgcnVsZV9fWFZhcmlhYmxlRGVjbGFyYXRpb25fX0dyb3VwX18zCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV183NSk7CisgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV184Myk7CiAgICAgICAgICAgICBydWxlX19YVmFyaWFibGVEZWNsYXJhdGlvbl9fR3JvdXBfXzJfX0ltcGwoKTsKIAogICAgICAgICAgICAgc3RhdGUuX2ZzcC0tOwpAQCAtNTc1OTUsMjMgKzYyMDUyLDIzIEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fWFZhcmlhYmxlRGVjbGFyYXRpb25fX0dyb3VwX18yX19JbXBsIgotICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE3NDU4OjE6IHJ1bGVfX1hWYXJpYWJsZURlY2xhcmF0aW9uX19Hcm91cF9fMl9fSW1wbCA6ICggKCBydWxlX19YVmFyaWFibGVEZWNsYXJhdGlvbl9fQWx0ZXJuYXRpdmVzXzIgKSApIDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxODc5NjoxOiBydWxlX19YVmFyaWFibGVEZWNsYXJhdGlvbl9fR3JvdXBfXzJfX0ltcGwgOiAoICggcnVsZV9fWFZhcmlhYmxlRGVjbGFyYXRpb25fX0FsdGVybmF0aXZlc18yICkgKSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fWFZhcmlhYmxlRGVjbGFyYXRpb25fX0dyb3VwX18yX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE3NDYyOjE6ICggKCAoIHJ1bGVfX1hWYXJpYWJsZURlY2xhcmF0aW9uX19BbHRlcm5hdGl2ZXNfMiApICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTc0NjM6MTogKCAoIHJ1bGVfX1hWYXJpYWJsZURlY2xhcmF0aW9uX19BbHRlcm5hdGl2ZXNfMiApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE4ODAwOjE6ICggKCAoIHJ1bGVfX1hWYXJpYWJsZURlY2xhcmF0aW9uX19BbHRlcm5hdGl2ZXNfMiApICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTg4MDE6MTogKCAoIHJ1bGVfX1hWYXJpYWJsZURlY2xhcmF0aW9uX19BbHRlcm5hdGl2ZXNfMiApICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE3NDYzOjE6ICggKCBydWxlX19YVmFyaWFibGVEZWNsYXJhdGlvbl9fQWx0ZXJuYXRpdmVzXzIgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNzQ2NDoyOiAoIHJ1bGVfX1hWYXJpYWJsZURlY2xhcmF0aW9uX19BbHRlcm5hdGl2ZXNfMiApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxODgwMToxOiAoICggcnVsZV9fWFZhcmlhYmxlRGVjbGFyYXRpb25fX0FsdGVybmF0aXZlc18yICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTg4MDI6MjogKCBydWxlX19YVmFyaWFibGVEZWNsYXJhdGlvbl9fQWx0ZXJuYXRpdmVzXzIgKQogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYVmFyaWFibGVEZWNsYXJhdGlvbkFjY2VzcygpLmdldEFsdGVybmF0aXZlc18yKCkpOyAKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE3NDY1OjI6ICggcnVsZV9fWFZhcmlhYmxlRGVjbGFyYXRpb25fX0FsdGVybmF0aXZlc18yICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE3NDY1OjM6IHJ1bGVfX1hWYXJpYWJsZURlY2xhcmF0aW9uX19BbHRlcm5hdGl2ZXNfMgorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTg4MDM6MjogKCBydWxlX19YVmFyaWFibGVEZWNsYXJhdGlvbl9fQWx0ZXJuYXRpdmVzXzIgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTg4MDM6MzogcnVsZV9fWFZhcmlhYmxlRGVjbGFyYXRpb25fX0FsdGVybmF0aXZlc18yCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV18yKTsKICAgICAgICAgICAgIHJ1bGVfX1hWYXJpYWJsZURlY2xhcmF0aW9uX19BbHRlcm5hdGl2ZXNfMigpOwpAQCAtNTc2NDYsMTQgKzYyMTAzLDE0IEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fWFZhcmlhYmxlRGVjbGFyYXRpb25fX0dyb3VwX18zIgotICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE3NDczOjE6IHJ1bGVfX1hWYXJpYWJsZURlY2xhcmF0aW9uX19Hcm91cF9fMyA6IHJ1bGVfX1hWYXJpYWJsZURlY2xhcmF0aW9uX19Hcm91cF9fM19fSW1wbCA7CisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTg4MTE6MTogcnVsZV9fWFZhcmlhYmxlRGVjbGFyYXRpb25fX0dyb3VwX18zIDogcnVsZV9fWFZhcmlhYmxlRGVjbGFyYXRpb25fX0dyb3VwX18zX19JbXBsIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YVmFyaWFibGVEZWNsYXJhdGlvbl9fR3JvdXBfXzMoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTc0Nzc6MTogKCBydWxlX19YVmFyaWFibGVEZWNsYXJhdGlvbl9fR3JvdXBfXzNfX0ltcGwgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTc0Nzg6MjogcnVsZV9fWFZhcmlhYmxlRGVjbGFyYXRpb25fX0dyb3VwX18zX19JbXBsCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxODgxNToxOiAoIHJ1bGVfX1hWYXJpYWJsZURlY2xhcmF0aW9uX19Hcm91cF9fM19fSW1wbCApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxODgxNjoyOiBydWxlX19YVmFyaWFibGVEZWNsYXJhdGlvbl9fR3JvdXBfXzNfX0ltcGwKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzIpOwogICAgICAgICAgICAgcnVsZV9fWFZhcmlhYmxlRGVjbGFyYXRpb25fX0dyb3VwX18zX19JbXBsKCk7CkBAIC01NzY3OSwzMSArNjIxMzYsMzEgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YVmFyaWFibGVEZWNsYXJhdGlvbl9fR3JvdXBfXzNfX0ltcGwiCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTc0ODQ6MTogcnVsZV9fWFZhcmlhYmxlRGVjbGFyYXRpb25fX0dyb3VwX18zX19JbXBsIDogKCAoIHJ1bGVfX1hWYXJpYWJsZURlY2xhcmF0aW9uX19Hcm91cF8zX18wICk/ICkgOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE4ODIyOjE6IHJ1bGVfX1hWYXJpYWJsZURlY2xhcmF0aW9uX19Hcm91cF9fM19fSW1wbCA6ICggKCBydWxlX19YVmFyaWFibGVEZWNsYXJhdGlvbl9fR3JvdXBfM19fMCApPyApIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YVmFyaWFibGVEZWNsYXJhdGlvbl9fR3JvdXBfXzNfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTc0ODg6MTogKCAoICggcnVsZV9fWFZhcmlhYmxlRGVjbGFyYXRpb25fX0dyb3VwXzNfXzAgKT8gKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNzQ4OToxOiAoICggcnVsZV9fWFZhcmlhYmxlRGVjbGFyYXRpb25fX0dyb3VwXzNfXzAgKT8gKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTg4MjY6MTogKCAoICggcnVsZV9fWFZhcmlhYmxlRGVjbGFyYXRpb25fX0dyb3VwXzNfXzAgKT8gKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxODgyNzoxOiAoICggcnVsZV9fWFZhcmlhYmxlRGVjbGFyYXRpb25fX0dyb3VwXzNfXzAgKT8gKQogICAgICAgICAgICAgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTc0ODk6MTogKCAoIHJ1bGVfX1hWYXJpYWJsZURlY2xhcmF0aW9uX19Hcm91cF8zX18wICk/ICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE3NDkwOjI6ICggcnVsZV9fWFZhcmlhYmxlRGVjbGFyYXRpb25fX0dyb3VwXzNfXzAgKT8KKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE4ODI3OjE6ICggKCBydWxlX19YVmFyaWFibGVEZWNsYXJhdGlvbl9fR3JvdXBfM19fMCApPyApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxODgyODoyOiAoIHJ1bGVfX1hWYXJpYWJsZURlY2xhcmF0aW9uX19Hcm91cF8zX18wICk/CiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhWYXJpYWJsZURlY2xhcmF0aW9uQWNjZXNzKCkuZ2V0R3JvdXBfMygpKTsgCiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNzQ5MToyOiAoIHJ1bGVfX1hWYXJpYWJsZURlY2xhcmF0aW9uX19Hcm91cF8zX18wICk/Ci0gICAgICAgICAgICBpbnQgYWx0MTM3PTI7Ci0gICAgICAgICAgICBpbnQgTEExMzdfMCA9IGlucHV0LkxBKDEpOworICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTg4Mjk6MjogKCBydWxlX19YVmFyaWFibGVEZWNsYXJhdGlvbl9fR3JvdXBfM19fMCApPworICAgICAgICAgICAgaW50IGFsdDE1MD0yOworICAgICAgICAgICAgaW50IExBMTUwXzAgPSBpbnB1dC5MQSgxKTsKIAotICAgICAgICAgICAgaWYgKCAoTEExMzdfMD09MTMpICkgewotICAgICAgICAgICAgICAgIGFsdDEzNz0xOworICAgICAgICAgICAgaWYgKCAoTEExNTBfMD09MTMpICkgeworICAgICAgICAgICAgICAgIGFsdDE1MD0xOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgc3dpdGNoIChhbHQxMzcpIHsKKyAgICAgICAgICAgIHN3aXRjaCAoYWx0MTUwKSB7CiAgICAgICAgICAgICAgICAgY2FzZSAxIDoKLSAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTc0OTE6MzogcnVsZV9fWFZhcmlhYmxlRGVjbGFyYXRpb25fX0dyb3VwXzNfXzAKKyAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTg4Mjk6MzogcnVsZV9fWFZhcmlhYmxlRGVjbGFyYXRpb25fX0dyb3VwXzNfXzAKICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV18yKTsKICAgICAgICAgICAgICAgICAgICAgcnVsZV9fWFZhcmlhYmxlRGVjbGFyYXRpb25fX0dyb3VwXzNfXzAoKTsKQEAgLTU3NzQxLDE0ICs2MjE5OCwxNCBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX1hWYXJpYWJsZURlY2xhcmF0aW9uX19Hcm91cF8yXzBfXzAiCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTc1MDA6MTogcnVsZV9fWFZhcmlhYmxlRGVjbGFyYXRpb25fX0dyb3VwXzJfMF9fMCA6IHJ1bGVfX1hWYXJpYWJsZURlY2xhcmF0aW9uX19Hcm91cF8yXzBfXzBfX0ltcGwgOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE4ODM4OjE6IHJ1bGVfX1hWYXJpYWJsZURlY2xhcmF0aW9uX19Hcm91cF8yXzBfXzAgOiBydWxlX19YVmFyaWFibGVEZWNsYXJhdGlvbl9fR3JvdXBfMl8wX18wX19JbXBsIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YVmFyaWFibGVEZWNsYXJhdGlvbl9fR3JvdXBfMl8wX18wKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE3NTA0OjE6ICggcnVsZV9fWFZhcmlhYmxlRGVjbGFyYXRpb25fX0dyb3VwXzJfMF9fMF9fSW1wbCApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNzUwNToyOiBydWxlX19YVmFyaWFibGVEZWNsYXJhdGlvbl9fR3JvdXBfMl8wX18wX19JbXBsCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxODg0MjoxOiAoIHJ1bGVfX1hWYXJpYWJsZURlY2xhcmF0aW9uX19Hcm91cF8yXzBfXzBfX0ltcGwgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTg4NDM6MjogcnVsZV9fWFZhcmlhYmxlRGVjbGFyYXRpb25fX0dyb3VwXzJfMF9fMF9fSW1wbAogICAgICAgICAgICAgewogICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMik7CiAgICAgICAgICAgICBydWxlX19YVmFyaWFibGVEZWNsYXJhdGlvbl9fR3JvdXBfMl8wX18wX19JbXBsKCk7CkBAIC01Nzc3NCwyMyArNjIyMzEsMjMgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YVmFyaWFibGVEZWNsYXJhdGlvbl9fR3JvdXBfMl8wX18wX19JbXBsIgotICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE3NTExOjE6IHJ1bGVfX1hWYXJpYWJsZURlY2xhcmF0aW9uX19Hcm91cF8yXzBfXzBfX0ltcGwgOiAoICggcnVsZV9fWFZhcmlhYmxlRGVjbGFyYXRpb25fX0dyb3VwXzJfMF8wX18wICkgKSA7CisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTg4NDk6MTogcnVsZV9fWFZhcmlhYmxlRGVjbGFyYXRpb25fX0dyb3VwXzJfMF9fMF9fSW1wbCA6ICggKCBydWxlX19YVmFyaWFibGVEZWNsYXJhdGlvbl9fR3JvdXBfMl8wXzBfXzAgKSApIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YVmFyaWFibGVEZWNsYXJhdGlvbl9fR3JvdXBfMl8wX18wX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE3NTE1OjE6ICggKCAoIHJ1bGVfX1hWYXJpYWJsZURlY2xhcmF0aW9uX19Hcm91cF8yXzBfMF9fMCApICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTc1MTY6MTogKCAoIHJ1bGVfX1hWYXJpYWJsZURlY2xhcmF0aW9uX19Hcm91cF8yXzBfMF9fMCApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE4ODUzOjE6ICggKCAoIHJ1bGVfX1hWYXJpYWJsZURlY2xhcmF0aW9uX19Hcm91cF8yXzBfMF9fMCApICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTg4NTQ6MTogKCAoIHJ1bGVfX1hWYXJpYWJsZURlY2xhcmF0aW9uX19Hcm91cF8yXzBfMF9fMCApICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE3NTE2OjE6ICggKCBydWxlX19YVmFyaWFibGVEZWNsYXJhdGlvbl9fR3JvdXBfMl8wXzBfXzAgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNzUxNzoyOiAoIHJ1bGVfX1hWYXJpYWJsZURlY2xhcmF0aW9uX19Hcm91cF8yXzBfMF9fMCApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxODg1NDoxOiAoICggcnVsZV9fWFZhcmlhYmxlRGVjbGFyYXRpb25fX0dyb3VwXzJfMF8wX18wICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTg4NTU6MjogKCBydWxlX19YVmFyaWFibGVEZWNsYXJhdGlvbl9fR3JvdXBfMl8wXzBfXzAgKQogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYVmFyaWFibGVEZWNsYXJhdGlvbkFjY2VzcygpLmdldEdyb3VwXzJfMF8wKCkpOyAKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE3NTE4OjI6ICggcnVsZV9fWFZhcmlhYmxlRGVjbGFyYXRpb25fX0dyb3VwXzJfMF8wX18wICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE3NTE4OjM6IHJ1bGVfX1hWYXJpYWJsZURlY2xhcmF0aW9uX19Hcm91cF8yXzBfMF9fMAorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTg4NTY6MjogKCBydWxlX19YVmFyaWFibGVEZWNsYXJhdGlvbl9fR3JvdXBfMl8wXzBfXzAgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTg4NTY6MzogcnVsZV9fWFZhcmlhYmxlRGVjbGFyYXRpb25fX0dyb3VwXzJfMF8wX18wCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV18yKTsKICAgICAgICAgICAgIHJ1bGVfX1hWYXJpYWJsZURlY2xhcmF0aW9uX19Hcm91cF8yXzBfMF9fMCgpOwpAQCAtNTc4MjUsMTQgKzYyMjgyLDE0IEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fWFZhcmlhYmxlRGVjbGFyYXRpb25fX0dyb3VwXzJfMF8wX18wIgotICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE3NTI3OjE6IHJ1bGVfX1hWYXJpYWJsZURlY2xhcmF0aW9uX19Hcm91cF8yXzBfMF9fMCA6IHJ1bGVfX1hWYXJpYWJsZURlY2xhcmF0aW9uX19Hcm91cF8yXzBfMF9fMF9fSW1wbCBydWxlX19YVmFyaWFibGVEZWNsYXJhdGlvbl9fR3JvdXBfMl8wXzBfXzEgOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE4ODY1OjE6IHJ1bGVfX1hWYXJpYWJsZURlY2xhcmF0aW9uX19Hcm91cF8yXzBfMF9fMCA6IHJ1bGVfX1hWYXJpYWJsZURlY2xhcmF0aW9uX19Hcm91cF8yXzBfMF9fMF9fSW1wbCBydWxlX19YVmFyaWFibGVEZWNsYXJhdGlvbl9fR3JvdXBfMl8wXzBfXzEgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1hWYXJpYWJsZURlY2xhcmF0aW9uX19Hcm91cF8yXzBfMF9fMCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNzUzMToxOiAoIHJ1bGVfX1hWYXJpYWJsZURlY2xhcmF0aW9uX19Hcm91cF8yXzBfMF9fMF9fSW1wbCBydWxlX19YVmFyaWFibGVEZWNsYXJhdGlvbl9fR3JvdXBfMl8wXzBfXzEgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTc1MzI6MjogcnVsZV9fWFZhcmlhYmxlRGVjbGFyYXRpb25fX0dyb3VwXzJfMF8wX18wX19JbXBsIHJ1bGVfX1hWYXJpYWJsZURlY2xhcmF0aW9uX19Hcm91cF8yXzBfMF9fMQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTg4Njk6MTogKCBydWxlX19YVmFyaWFibGVEZWNsYXJhdGlvbl9fR3JvdXBfMl8wXzBfXzBfX0ltcGwgcnVsZV9fWFZhcmlhYmxlRGVjbGFyYXRpb25fX0dyb3VwXzJfMF8wX18xICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE4ODcwOjI6IHJ1bGVfX1hWYXJpYWJsZURlY2xhcmF0aW9uX19Hcm91cF8yXzBfMF9fMF9fSW1wbCBydWxlX19YVmFyaWFibGVEZWNsYXJhdGlvbl9fR3JvdXBfMl8wXzBfXzEKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzcpOwogICAgICAgICAgICAgcnVsZV9fWFZhcmlhYmxlRGVjbGFyYXRpb25fX0dyb3VwXzJfMF8wX18wX19JbXBsKCk7CkBAIC01Nzg2MywyMyArNjIzMjAsMjMgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YVmFyaWFibGVEZWNsYXJhdGlvbl9fR3JvdXBfMl8wXzBfXzBfX0ltcGwiCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTc1Mzk6MTogcnVsZV9fWFZhcmlhYmxlRGVjbGFyYXRpb25fX0dyb3VwXzJfMF8wX18wX19JbXBsIDogKCAoIHJ1bGVfX1hWYXJpYWJsZURlY2xhcmF0aW9uX19UeXBlQXNzaWdubWVudF8yXzBfMF8wICkgKSA7CisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTg4Nzc6MTogcnVsZV9fWFZhcmlhYmxlRGVjbGFyYXRpb25fX0dyb3VwXzJfMF8wX18wX19JbXBsIDogKCAoIHJ1bGVfX1hWYXJpYWJsZURlY2xhcmF0aW9uX19UeXBlQXNzaWdubWVudF8yXzBfMF8wICkgKSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fWFZhcmlhYmxlRGVjbGFyYXRpb25fX0dyb3VwXzJfMF8wX18wX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE3NTQzOjE6ICggKCAoIHJ1bGVfX1hWYXJpYWJsZURlY2xhcmF0aW9uX19UeXBlQXNzaWdubWVudF8yXzBfMF8wICkgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNzU0NDoxOiAoICggcnVsZV9fWFZhcmlhYmxlRGVjbGFyYXRpb25fX1R5cGVBc3NpZ25tZW50XzJfMF8wXzAgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxODg4MToxOiAoICggKCBydWxlX19YVmFyaWFibGVEZWNsYXJhdGlvbl9fVHlwZUFzc2lnbm1lbnRfMl8wXzBfMCApICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTg4ODI6MTogKCAoIHJ1bGVfX1hWYXJpYWJsZURlY2xhcmF0aW9uX19UeXBlQXNzaWdubWVudF8yXzBfMF8wICkgKQogICAgICAgICAgICAgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTc1NDQ6MTogKCAoIHJ1bGVfX1hWYXJpYWJsZURlY2xhcmF0aW9uX19UeXBlQXNzaWdubWVudF8yXzBfMF8wICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTc1NDU6MjogKCBydWxlX19YVmFyaWFibGVEZWNsYXJhdGlvbl9fVHlwZUFzc2lnbm1lbnRfMl8wXzBfMCApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxODg4MjoxOiAoICggcnVsZV9fWFZhcmlhYmxlRGVjbGFyYXRpb25fX1R5cGVBc3NpZ25tZW50XzJfMF8wXzAgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxODg4MzoyOiAoIHJ1bGVfX1hWYXJpYWJsZURlY2xhcmF0aW9uX19UeXBlQXNzaWdubWVudF8yXzBfMF8wICkKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WFZhcmlhYmxlRGVjbGFyYXRpb25BY2Nlc3MoKS5nZXRUeXBlQXNzaWdubWVudF8yXzBfMF8wKCkpOyAKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE3NTQ2OjI6ICggcnVsZV9fWFZhcmlhYmxlRGVjbGFyYXRpb25fX1R5cGVBc3NpZ25tZW50XzJfMF8wXzAgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTc1NDY6MzogcnVsZV9fWFZhcmlhYmxlRGVjbGFyYXRpb25fX1R5cGVBc3NpZ25tZW50XzJfMF8wXzAKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE4ODg0OjI6ICggcnVsZV9fWFZhcmlhYmxlRGVjbGFyYXRpb25fX1R5cGVBc3NpZ25tZW50XzJfMF8wXzAgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTg4ODQ6MzogcnVsZV9fWFZhcmlhYmxlRGVjbGFyYXRpb25fX1R5cGVBc3NpZ25tZW50XzJfMF8wXzAKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzIpOwogICAgICAgICAgICAgcnVsZV9fWFZhcmlhYmxlRGVjbGFyYXRpb25fX1R5cGVBc3NpZ25tZW50XzJfMF8wXzAoKTsKQEAgLTU3OTE0LDE0ICs2MjM3MSwxNCBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX1hWYXJpYWJsZURlY2xhcmF0aW9uX19Hcm91cF8yXzBfMF9fMSIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNzU1NDoxOiBydWxlX19YVmFyaWFibGVEZWNsYXJhdGlvbl9fR3JvdXBfMl8wXzBfXzEgOiBydWxlX19YVmFyaWFibGVEZWNsYXJhdGlvbl9fR3JvdXBfMl8wXzBfXzFfX0ltcGwgOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE4ODkyOjE6IHJ1bGVfX1hWYXJpYWJsZURlY2xhcmF0aW9uX19Hcm91cF8yXzBfMF9fMSA6IHJ1bGVfX1hWYXJpYWJsZURlY2xhcmF0aW9uX19Hcm91cF8yXzBfMF9fMV9fSW1wbCA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fWFZhcmlhYmxlRGVjbGFyYXRpb25fX0dyb3VwXzJfMF8wX18xKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE3NTU4OjE6ICggcnVsZV9fWFZhcmlhYmxlRGVjbGFyYXRpb25fX0dyb3VwXzJfMF8wX18xX19JbXBsICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE3NTU5OjI6IHJ1bGVfX1hWYXJpYWJsZURlY2xhcmF0aW9uX19Hcm91cF8yXzBfMF9fMV9fSW1wbAorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTg4OTY6MTogKCBydWxlX19YVmFyaWFibGVEZWNsYXJhdGlvbl9fR3JvdXBfMl8wXzBfXzFfX0ltcGwgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTg4OTc6MjogcnVsZV9fWFZhcmlhYmxlRGVjbGFyYXRpb25fX0dyb3VwXzJfMF8wX18xX19JbXBsCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV18yKTsKICAgICAgICAgICAgIHJ1bGVfX1hWYXJpYWJsZURlY2xhcmF0aW9uX19Hcm91cF8yXzBfMF9fMV9fSW1wbCgpOwpAQCAtNTc5NDcsMjMgKzYyNDA0LDIzIEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fWFZhcmlhYmxlRGVjbGFyYXRpb25fX0dyb3VwXzJfMF8wX18xX19JbXBsIgotICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE3NTY1OjE6IHJ1bGVfX1hWYXJpYWJsZURlY2xhcmF0aW9uX19Hcm91cF8yXzBfMF9fMV9fSW1wbCA6ICggKCBydWxlX19YVmFyaWFibGVEZWNsYXJhdGlvbl9fTmFtZUFzc2lnbm1lbnRfMl8wXzBfMSApICkgOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE4OTAzOjE6IHJ1bGVfX1hWYXJpYWJsZURlY2xhcmF0aW9uX19Hcm91cF8yXzBfMF9fMV9fSW1wbCA6ICggKCBydWxlX19YVmFyaWFibGVEZWNsYXJhdGlvbl9fTmFtZUFzc2lnbm1lbnRfMl8wXzBfMSApICkgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1hWYXJpYWJsZURlY2xhcmF0aW9uX19Hcm91cF8yXzBfMF9fMV9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNzU2OToxOiAoICggKCBydWxlX19YVmFyaWFibGVEZWNsYXJhdGlvbl9fTmFtZUFzc2lnbm1lbnRfMl8wXzBfMSApICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTc1NzA6MTogKCAoIHJ1bGVfX1hWYXJpYWJsZURlY2xhcmF0aW9uX19OYW1lQXNzaWdubWVudF8yXzBfMF8xICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTg5MDc6MTogKCAoICggcnVsZV9fWFZhcmlhYmxlRGVjbGFyYXRpb25fX05hbWVBc3NpZ25tZW50XzJfMF8wXzEgKSApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE4OTA4OjE6ICggKCBydWxlX19YVmFyaWFibGVEZWNsYXJhdGlvbl9fTmFtZUFzc2lnbm1lbnRfMl8wXzBfMSApICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE3NTcwOjE6ICggKCBydWxlX19YVmFyaWFibGVEZWNsYXJhdGlvbl9fTmFtZUFzc2lnbm1lbnRfMl8wXzBfMSApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE3NTcxOjI6ICggcnVsZV9fWFZhcmlhYmxlRGVjbGFyYXRpb25fX05hbWVBc3NpZ25tZW50XzJfMF8wXzEgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTg5MDg6MTogKCAoIHJ1bGVfX1hWYXJpYWJsZURlY2xhcmF0aW9uX19OYW1lQXNzaWdubWVudF8yXzBfMF8xICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTg5MDk6MjogKCBydWxlX19YVmFyaWFibGVEZWNsYXJhdGlvbl9fTmFtZUFzc2lnbm1lbnRfMl8wXzBfMSApCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhWYXJpYWJsZURlY2xhcmF0aW9uQWNjZXNzKCkuZ2V0TmFtZUFzc2lnbm1lbnRfMl8wXzBfMSgpKTsgCiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNzU3MjoyOiAoIHJ1bGVfX1hWYXJpYWJsZURlY2xhcmF0aW9uX19OYW1lQXNzaWdubWVudF8yXzBfMF8xICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE3NTcyOjM6IHJ1bGVfX1hWYXJpYWJsZURlY2xhcmF0aW9uX19OYW1lQXNzaWdubWVudF8yXzBfMF8xCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxODkxMDoyOiAoIHJ1bGVfX1hWYXJpYWJsZURlY2xhcmF0aW9uX19OYW1lQXNzaWdubWVudF8yXzBfMF8xICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE4OTEwOjM6IHJ1bGVfX1hWYXJpYWJsZURlY2xhcmF0aW9uX19OYW1lQXNzaWdubWVudF8yXzBfMF8xCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV18yKTsKICAgICAgICAgICAgIHJ1bGVfX1hWYXJpYWJsZURlY2xhcmF0aW9uX19OYW1lQXNzaWdubWVudF8yXzBfMF8xKCk7CkBAIC01Nzk5OCwxNiArNjI0NTUsMTYgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YVmFyaWFibGVEZWNsYXJhdGlvbl9fR3JvdXBfM19fMCIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNzU4MToxOiBydWxlX19YVmFyaWFibGVEZWNsYXJhdGlvbl9fR3JvdXBfM19fMCA6IHJ1bGVfX1hWYXJpYWJsZURlY2xhcmF0aW9uX19Hcm91cF8zX18wX19JbXBsIHJ1bGVfX1hWYXJpYWJsZURlY2xhcmF0aW9uX19Hcm91cF8zX18xIDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxODkxOToxOiBydWxlX19YVmFyaWFibGVEZWNsYXJhdGlvbl9fR3JvdXBfM19fMCA6IHJ1bGVfX1hWYXJpYWJsZURlY2xhcmF0aW9uX19Hcm91cF8zX18wX19JbXBsIHJ1bGVfX1hWYXJpYWJsZURlY2xhcmF0aW9uX19Hcm91cF8zX18xIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YVmFyaWFibGVEZWNsYXJhdGlvbl9fR3JvdXBfM19fMCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNzU4NToxOiAoIHJ1bGVfX1hWYXJpYWJsZURlY2xhcmF0aW9uX19Hcm91cF8zX18wX19JbXBsIHJ1bGVfX1hWYXJpYWJsZURlY2xhcmF0aW9uX19Hcm91cF8zX18xICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE3NTg2OjI6IHJ1bGVfX1hWYXJpYWJsZURlY2xhcmF0aW9uX19Hcm91cF8zX18wX19JbXBsIHJ1bGVfX1hWYXJpYWJsZURlY2xhcmF0aW9uX19Hcm91cF8zX18xCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxODkyMzoxOiAoIHJ1bGVfX1hWYXJpYWJsZURlY2xhcmF0aW9uX19Hcm91cF8zX18wX19JbXBsIHJ1bGVfX1hWYXJpYWJsZURlY2xhcmF0aW9uX19Hcm91cF8zX18xICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE4OTI0OjI6IHJ1bGVfX1hWYXJpYWJsZURlY2xhcmF0aW9uX19Hcm91cF8zX18wX19JbXBsIHJ1bGVfX1hWYXJpYWJsZURlY2xhcmF0aW9uX19Hcm91cF8zX18xCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV183NCk7CisgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV184Mik7CiAgICAgICAgICAgICBydWxlX19YVmFyaWFibGVEZWNsYXJhdGlvbl9fR3JvdXBfM19fMF9fSW1wbCgpOwogCiAgICAgICAgICAgICBzdGF0ZS5fZnNwLS07CkBAIC01ODAzNiwxNyArNjI0OTMsMTcgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YVmFyaWFibGVEZWNsYXJhdGlvbl9fR3JvdXBfM19fMF9fSW1wbCIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNzU5MzoxOiBydWxlX19YVmFyaWFibGVEZWNsYXJhdGlvbl9fR3JvdXBfM19fMF9fSW1wbCA6ICggJz0nICkgOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE4OTMxOjE6IHJ1bGVfX1hWYXJpYWJsZURlY2xhcmF0aW9uX19Hcm91cF8zX18wX19JbXBsIDogKCAnPScgKSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fWFZhcmlhYmxlRGVjbGFyYXRpb25fX0dyb3VwXzNfXzBfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTc1OTc6MTogKCAoICc9JyApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE3NTk4OjE6ICggJz0nICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE4OTM1OjE6ICggKCAnPScgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxODkzNjoxOiAoICc9JyApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNzU5ODoxOiAoICc9JyApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNzU5OToyOiAnPScKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE4OTM2OjE6ICggJz0nICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE4OTM3OjI6ICc9JwogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYVmFyaWFibGVEZWNsYXJhdGlvbkFjY2VzcygpLmdldEVxdWFsc1NpZ25LZXl3b3JkXzNfMCgpKTsgCkBAIC01ODA3NywxNCArNjI1MzQsMTQgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YVmFyaWFibGVEZWNsYXJhdGlvbl9fR3JvdXBfM19fMSIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNzYwODoxOiBydWxlX19YVmFyaWFibGVEZWNsYXJhdGlvbl9fR3JvdXBfM19fMSA6IHJ1bGVfX1hWYXJpYWJsZURlY2xhcmF0aW9uX19Hcm91cF8zX18xX19JbXBsIDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxODk0NjoxOiBydWxlX19YVmFyaWFibGVEZWNsYXJhdGlvbl9fR3JvdXBfM19fMSA6IHJ1bGVfX1hWYXJpYWJsZURlY2xhcmF0aW9uX19Hcm91cF8zX18xX19JbXBsIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YVmFyaWFibGVEZWNsYXJhdGlvbl9fR3JvdXBfM19fMSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNzYxMjoxOiAoIHJ1bGVfX1hWYXJpYWJsZURlY2xhcmF0aW9uX19Hcm91cF8zX18xX19JbXBsICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE3NjEzOjI6IHJ1bGVfX1hWYXJpYWJsZURlY2xhcmF0aW9uX19Hcm91cF8zX18xX19JbXBsCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxODk1MDoxOiAoIHJ1bGVfX1hWYXJpYWJsZURlY2xhcmF0aW9uX19Hcm91cF8zX18xX19JbXBsICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE4OTUxOjI6IHJ1bGVfX1hWYXJpYWJsZURlY2xhcmF0aW9uX19Hcm91cF8zX18xX19JbXBsCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV18yKTsKICAgICAgICAgICAgIHJ1bGVfX1hWYXJpYWJsZURlY2xhcmF0aW9uX19Hcm91cF8zX18xX19JbXBsKCk7CkBAIC01ODExMCwyMyArNjI1NjcsMjMgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YVmFyaWFibGVEZWNsYXJhdGlvbl9fR3JvdXBfM19fMV9fSW1wbCIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNzYxOToxOiBydWxlX19YVmFyaWFibGVEZWNsYXJhdGlvbl9fR3JvdXBfM19fMV9fSW1wbCA6ICggKCBydWxlX19YVmFyaWFibGVEZWNsYXJhdGlvbl9fUmlnaHRBc3NpZ25tZW50XzNfMSApICkgOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE4OTU3OjE6IHJ1bGVfX1hWYXJpYWJsZURlY2xhcmF0aW9uX19Hcm91cF8zX18xX19JbXBsIDogKCAoIHJ1bGVfX1hWYXJpYWJsZURlY2xhcmF0aW9uX19SaWdodEFzc2lnbm1lbnRfM18xICkgKSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fWFZhcmlhYmxlRGVjbGFyYXRpb25fX0dyb3VwXzNfXzFfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTc2MjM6MTogKCAoICggcnVsZV9fWFZhcmlhYmxlRGVjbGFyYXRpb25fX1JpZ2h0QXNzaWdubWVudF8zXzEgKSApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE3NjI0OjE6ICggKCBydWxlX19YVmFyaWFibGVEZWNsYXJhdGlvbl9fUmlnaHRBc3NpZ25tZW50XzNfMSApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE4OTYxOjE6ICggKCAoIHJ1bGVfX1hWYXJpYWJsZURlY2xhcmF0aW9uX19SaWdodEFzc2lnbm1lbnRfM18xICkgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxODk2MjoxOiAoICggcnVsZV9fWFZhcmlhYmxlRGVjbGFyYXRpb25fX1JpZ2h0QXNzaWdubWVudF8zXzEgKSApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNzYyNDoxOiAoICggcnVsZV9fWFZhcmlhYmxlRGVjbGFyYXRpb25fX1JpZ2h0QXNzaWdubWVudF8zXzEgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNzYyNToyOiAoIHJ1bGVfX1hWYXJpYWJsZURlY2xhcmF0aW9uX19SaWdodEFzc2lnbm1lbnRfM18xICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE4OTYyOjE6ICggKCBydWxlX19YVmFyaWFibGVEZWNsYXJhdGlvbl9fUmlnaHRBc3NpZ25tZW50XzNfMSApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE4OTYzOjI6ICggcnVsZV9fWFZhcmlhYmxlRGVjbGFyYXRpb25fX1JpZ2h0QXNzaWdubWVudF8zXzEgKQogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYVmFyaWFibGVEZWNsYXJhdGlvbkFjY2VzcygpLmdldFJpZ2h0QXNzaWdubWVudF8zXzEoKSk7IAogICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTc2MjY6MjogKCBydWxlX19YVmFyaWFibGVEZWNsYXJhdGlvbl9fUmlnaHRBc3NpZ25tZW50XzNfMSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNzYyNjozOiBydWxlX19YVmFyaWFibGVEZWNsYXJhdGlvbl9fUmlnaHRBc3NpZ25tZW50XzNfMQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTg5NjQ6MjogKCBydWxlX19YVmFyaWFibGVEZWNsYXJhdGlvbl9fUmlnaHRBc3NpZ25tZW50XzNfMSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxODk2NDozOiBydWxlX19YVmFyaWFibGVEZWNsYXJhdGlvbl9fUmlnaHRBc3NpZ25tZW50XzNfMQogICAgICAgICAgICAgewogICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMik7CiAgICAgICAgICAgICBydWxlX19YVmFyaWFibGVEZWNsYXJhdGlvbl9fUmlnaHRBc3NpZ25tZW50XzNfMSgpOwpAQCAtNTgxNjEsMTYgKzYyNjE4LDE2IEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fSnZtRm9ybWFsUGFyYW1ldGVyX19Hcm91cF9fMCIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNzYzNToxOiBydWxlX19Kdm1Gb3JtYWxQYXJhbWV0ZXJfX0dyb3VwX18wIDogcnVsZV9fSnZtRm9ybWFsUGFyYW1ldGVyX19Hcm91cF9fMF9fSW1wbCBydWxlX19Kdm1Gb3JtYWxQYXJhbWV0ZXJfX0dyb3VwX18xIDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxODk3MzoxOiBydWxlX19Kdm1Gb3JtYWxQYXJhbWV0ZXJfX0dyb3VwX18wIDogcnVsZV9fSnZtRm9ybWFsUGFyYW1ldGVyX19Hcm91cF9fMF9fSW1wbCBydWxlX19Kdm1Gb3JtYWxQYXJhbWV0ZXJfX0dyb3VwX18xIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19Kdm1Gb3JtYWxQYXJhbWV0ZXJfX0dyb3VwX18wKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE3NjM5OjE6ICggcnVsZV9fSnZtRm9ybWFsUGFyYW1ldGVyX19Hcm91cF9fMF9fSW1wbCBydWxlX19Kdm1Gb3JtYWxQYXJhbWV0ZXJfX0dyb3VwX18xICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE3NjQwOjI6IHJ1bGVfX0p2bUZvcm1hbFBhcmFtZXRlcl9fR3JvdXBfXzBfX0ltcGwgcnVsZV9fSnZtRm9ybWFsUGFyYW1ldGVyX19Hcm91cF9fMQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTg5Nzc6MTogKCBydWxlX19Kdm1Gb3JtYWxQYXJhbWV0ZXJfX0dyb3VwX18wX19JbXBsIHJ1bGVfX0p2bUZvcm1hbFBhcmFtZXRlcl9fR3JvdXBfXzEgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTg5Nzg6MjogcnVsZV9fSnZtRm9ybWFsUGFyYW1ldGVyX19Hcm91cF9fMF9fSW1wbCBydWxlX19Kdm1Gb3JtYWxQYXJhbWV0ZXJfX0dyb3VwX18xCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV185MSk7CisgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV185OSk7CiAgICAgICAgICAgICBydWxlX19Kdm1Gb3JtYWxQYXJhbWV0ZXJfX0dyb3VwX18wX19JbXBsKCk7CiAKICAgICAgICAgICAgIHN0YXRlLl9mc3AtLTsKQEAgLTU4MTk5LDM4ICs2MjY1NiwzOCBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX0p2bUZvcm1hbFBhcmFtZXRlcl9fR3JvdXBfXzBfX0ltcGwiCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTc2NDc6MTogcnVsZV9fSnZtRm9ybWFsUGFyYW1ldGVyX19Hcm91cF9fMF9fSW1wbCA6ICggKCBydWxlX19Kdm1Gb3JtYWxQYXJhbWV0ZXJfX1BhcmFtZXRlclR5cGVBc3NpZ25tZW50XzAgKT8gKSA7CisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTg5ODU6MTogcnVsZV9fSnZtRm9ybWFsUGFyYW1ldGVyX19Hcm91cF9fMF9fSW1wbCA6ICggKCBydWxlX19Kdm1Gb3JtYWxQYXJhbWV0ZXJfX1BhcmFtZXRlclR5cGVBc3NpZ25tZW50XzAgKT8gKSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fSnZtRm9ybWFsUGFyYW1ldGVyX19Hcm91cF9fMF9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNzY1MToxOiAoICggKCBydWxlX19Kdm1Gb3JtYWxQYXJhbWV0ZXJfX1BhcmFtZXRlclR5cGVBc3NpZ25tZW50XzAgKT8gKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNzY1MjoxOiAoICggcnVsZV9fSnZtRm9ybWFsUGFyYW1ldGVyX19QYXJhbWV0ZXJUeXBlQXNzaWdubWVudF8wICk/ICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE4OTg5OjE6ICggKCAoIHJ1bGVfX0p2bUZvcm1hbFBhcmFtZXRlcl9fUGFyYW1ldGVyVHlwZUFzc2lnbm1lbnRfMCApPyApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE4OTkwOjE6ICggKCBydWxlX19Kdm1Gb3JtYWxQYXJhbWV0ZXJfX1BhcmFtZXRlclR5cGVBc3NpZ25tZW50XzAgKT8gKQogICAgICAgICAgICAgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTc2NTI6MTogKCAoIHJ1bGVfX0p2bUZvcm1hbFBhcmFtZXRlcl9fUGFyYW1ldGVyVHlwZUFzc2lnbm1lbnRfMCApPyApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNzY1MzoyOiAoIHJ1bGVfX0p2bUZvcm1hbFBhcmFtZXRlcl9fUGFyYW1ldGVyVHlwZUFzc2lnbm1lbnRfMCApPworICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTg5OTA6MTogKCAoIHJ1bGVfX0p2bUZvcm1hbFBhcmFtZXRlcl9fUGFyYW1ldGVyVHlwZUFzc2lnbm1lbnRfMCApPyApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxODk5MToyOiAoIHJ1bGVfX0p2bUZvcm1hbFBhcmFtZXRlcl9fUGFyYW1ldGVyVHlwZUFzc2lnbm1lbnRfMCApPwogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRKdm1Gb3JtYWxQYXJhbWV0ZXJBY2Nlc3MoKS5nZXRQYXJhbWV0ZXJUeXBlQXNzaWdubWVudF8wKCkpOyAKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE3NjU0OjI6ICggcnVsZV9fSnZtRm9ybWFsUGFyYW1ldGVyX19QYXJhbWV0ZXJUeXBlQXNzaWdubWVudF8wICk/Ci0gICAgICAgICAgICBpbnQgYWx0MTM4PTI7Ci0gICAgICAgICAgICBpbnQgTEExMzhfMCA9IGlucHV0LkxBKDEpOworICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTg5OTI6MjogKCBydWxlX19Kdm1Gb3JtYWxQYXJhbWV0ZXJfX1BhcmFtZXRlclR5cGVBc3NpZ25tZW50XzAgKT8KKyAgICAgICAgICAgIGludCBhbHQxNTE9MjsKKyAgICAgICAgICAgIGludCBMQTE1MV8wID0gaW5wdXQuTEEoMSk7CiAKLSAgICAgICAgICAgIGlmICggKExBMTM4XzA9PVJVTEVfSUQpICkgewotICAgICAgICAgICAgICAgIGludCBMQTEzOF8xID0gaW5wdXQuTEEoMik7CisgICAgICAgICAgICBpZiAoIChMQTE1MV8wPT1SVUxFX0lEKSApIHsKKyAgICAgICAgICAgICAgICBpbnQgTEExNTFfMSA9IGlucHV0LkxBKDIpOwogCi0gICAgICAgICAgICAgICAgaWYgKCAoTEExMzhfMT09UlVMRV9JRHx8TEExMzhfMT09Mjd8fExBMTM4XzE9PTQzfHxMQTEzOF8xPT0xMTgpICkgewotICAgICAgICAgICAgICAgICAgICBhbHQxMzg9MTsKKyAgICAgICAgICAgICAgICBpZiAoIChMQTE1MV8xPT1SVUxFX0lEfHxMQTE1MV8xPT0yN3x8TEExNTFfMT09NDN8fExBMTUxXzE9PTEyOCkgKSB7CisgICAgICAgICAgICAgICAgICAgIGFsdDE1MT0xOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgaWYgKCAoTEExMzhfMD09MzF8fExBMTM4XzA9PTExMykgKSB7Ci0gICAgICAgICAgICAgICAgYWx0MTM4PTE7CisgICAgICAgICAgICBlbHNlIGlmICggKExBMTUxXzA9PTMxfHxMQTE1MV8wPT0xMjMpICkgeworICAgICAgICAgICAgICAgIGFsdDE1MT0xOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgc3dpdGNoIChhbHQxMzgpIHsKKyAgICAgICAgICAgIHN3aXRjaCAoYWx0MTUxKSB7CiAgICAgICAgICAgICAgICAgY2FzZSAxIDoKLSAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTc2NTQ6MzogcnVsZV9fSnZtRm9ybWFsUGFyYW1ldGVyX19QYXJhbWV0ZXJUeXBlQXNzaWdubWVudF8wCisgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE4OTkyOjM6IHJ1bGVfX0p2bUZvcm1hbFBhcmFtZXRlcl9fUGFyYW1ldGVyVHlwZUFzc2lnbm1lbnRfMAogICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzIpOwogICAgICAgICAgICAgICAgICAgICBydWxlX19Kdm1Gb3JtYWxQYXJhbWV0ZXJfX1BhcmFtZXRlclR5cGVBc3NpZ25tZW50XzAoKTsKQEAgLTU4MjY4LDE0ICs2MjcyNSwxNCBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX0p2bUZvcm1hbFBhcmFtZXRlcl9fR3JvdXBfXzEiCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTc2NjI6MTogcnVsZV9fSnZtRm9ybWFsUGFyYW1ldGVyX19Hcm91cF9fMSA6IHJ1bGVfX0p2bUZvcm1hbFBhcmFtZXRlcl9fR3JvdXBfXzFfX0ltcGwgOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE5MDAwOjE6IHJ1bGVfX0p2bUZvcm1hbFBhcmFtZXRlcl9fR3JvdXBfXzEgOiBydWxlX19Kdm1Gb3JtYWxQYXJhbWV0ZXJfX0dyb3VwX18xX19JbXBsIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19Kdm1Gb3JtYWxQYXJhbWV0ZXJfX0dyb3VwX18xKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE3NjY2OjE6ICggcnVsZV9fSnZtRm9ybWFsUGFyYW1ldGVyX19Hcm91cF9fMV9fSW1wbCApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNzY2NzoyOiBydWxlX19Kdm1Gb3JtYWxQYXJhbWV0ZXJfX0dyb3VwX18xX19JbXBsCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxOTAwNDoxOiAoIHJ1bGVfX0p2bUZvcm1hbFBhcmFtZXRlcl9fR3JvdXBfXzFfX0ltcGwgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTkwMDU6MjogcnVsZV9fSnZtRm9ybWFsUGFyYW1ldGVyX19Hcm91cF9fMV9fSW1wbAogICAgICAgICAgICAgewogICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMik7CiAgICAgICAgICAgICBydWxlX19Kdm1Gb3JtYWxQYXJhbWV0ZXJfX0dyb3VwX18xX19JbXBsKCk7CkBAIC01ODMwMSwyMyArNjI3NTgsMjMgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19Kdm1Gb3JtYWxQYXJhbWV0ZXJfX0dyb3VwX18xX19JbXBsIgotICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE3NjczOjE6IHJ1bGVfX0p2bUZvcm1hbFBhcmFtZXRlcl9fR3JvdXBfXzFfX0ltcGwgOiAoICggcnVsZV9fSnZtRm9ybWFsUGFyYW1ldGVyX19OYW1lQXNzaWdubWVudF8xICkgKSA7CisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTkwMTE6MTogcnVsZV9fSnZtRm9ybWFsUGFyYW1ldGVyX19Hcm91cF9fMV9fSW1wbCA6ICggKCBydWxlX19Kdm1Gb3JtYWxQYXJhbWV0ZXJfX05hbWVBc3NpZ25tZW50XzEgKSApIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19Kdm1Gb3JtYWxQYXJhbWV0ZXJfX0dyb3VwX18xX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE3Njc3OjE6ICggKCAoIHJ1bGVfX0p2bUZvcm1hbFBhcmFtZXRlcl9fTmFtZUFzc2lnbm1lbnRfMSApICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTc2Nzg6MTogKCAoIHJ1bGVfX0p2bUZvcm1hbFBhcmFtZXRlcl9fTmFtZUFzc2lnbm1lbnRfMSApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE5MDE1OjE6ICggKCAoIHJ1bGVfX0p2bUZvcm1hbFBhcmFtZXRlcl9fTmFtZUFzc2lnbm1lbnRfMSApICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTkwMTY6MTogKCAoIHJ1bGVfX0p2bUZvcm1hbFBhcmFtZXRlcl9fTmFtZUFzc2lnbm1lbnRfMSApICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE3Njc4OjE6ICggKCBydWxlX19Kdm1Gb3JtYWxQYXJhbWV0ZXJfX05hbWVBc3NpZ25tZW50XzEgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNzY3OToyOiAoIHJ1bGVfX0p2bUZvcm1hbFBhcmFtZXRlcl9fTmFtZUFzc2lnbm1lbnRfMSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxOTAxNjoxOiAoICggcnVsZV9fSnZtRm9ybWFsUGFyYW1ldGVyX19OYW1lQXNzaWdubWVudF8xICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTkwMTc6MjogKCBydWxlX19Kdm1Gb3JtYWxQYXJhbWV0ZXJfX05hbWVBc3NpZ25tZW50XzEgKQogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRKdm1Gb3JtYWxQYXJhbWV0ZXJBY2Nlc3MoKS5nZXROYW1lQXNzaWdubWVudF8xKCkpOyAKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE3NjgwOjI6ICggcnVsZV9fSnZtRm9ybWFsUGFyYW1ldGVyX19OYW1lQXNzaWdubWVudF8xICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE3NjgwOjM6IHJ1bGVfX0p2bUZvcm1hbFBhcmFtZXRlcl9fTmFtZUFzc2lnbm1lbnRfMQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTkwMTg6MjogKCBydWxlX19Kdm1Gb3JtYWxQYXJhbWV0ZXJfX05hbWVBc3NpZ25tZW50XzEgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTkwMTg6MzogcnVsZV9fSnZtRm9ybWFsUGFyYW1ldGVyX19OYW1lQXNzaWdubWVudF8xCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV18yKTsKICAgICAgICAgICAgIHJ1bGVfX0p2bUZvcm1hbFBhcmFtZXRlcl9fTmFtZUFzc2lnbm1lbnRfMSgpOwpAQCAtNTgzNTIsMTQgKzYyODA5LDE0IEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fRnVsbEp2bUZvcm1hbFBhcmFtZXRlcl9fR3JvdXBfXzAiCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTc2ODk6MTogcnVsZV9fRnVsbEp2bUZvcm1hbFBhcmFtZXRlcl9fR3JvdXBfXzAgOiBydWxlX19GdWxsSnZtRm9ybWFsUGFyYW1ldGVyX19Hcm91cF9fMF9fSW1wbCBydWxlX19GdWxsSnZtRm9ybWFsUGFyYW1ldGVyX19Hcm91cF9fMSA7CisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTkwMjc6MTogcnVsZV9fRnVsbEp2bUZvcm1hbFBhcmFtZXRlcl9fR3JvdXBfXzAgOiBydWxlX19GdWxsSnZtRm9ybWFsUGFyYW1ldGVyX19Hcm91cF9fMF9fSW1wbCBydWxlX19GdWxsSnZtRm9ybWFsUGFyYW1ldGVyX19Hcm91cF9fMSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fRnVsbEp2bUZvcm1hbFBhcmFtZXRlcl9fR3JvdXBfXzAoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTc2OTM6MTogKCBydWxlX19GdWxsSnZtRm9ybWFsUGFyYW1ldGVyX19Hcm91cF9fMF9fSW1wbCBydWxlX19GdWxsSnZtRm9ybWFsUGFyYW1ldGVyX19Hcm91cF9fMSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNzY5NDoyOiBydWxlX19GdWxsSnZtRm9ybWFsUGFyYW1ldGVyX19Hcm91cF9fMF9fSW1wbCBydWxlX19GdWxsSnZtRm9ybWFsUGFyYW1ldGVyX19Hcm91cF9fMQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTkwMzE6MTogKCBydWxlX19GdWxsSnZtRm9ybWFsUGFyYW1ldGVyX19Hcm91cF9fMF9fSW1wbCBydWxlX19GdWxsSnZtRm9ybWFsUGFyYW1ldGVyX19Hcm91cF9fMSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxOTAzMjoyOiBydWxlX19GdWxsSnZtRm9ybWFsUGFyYW1ldGVyX19Hcm91cF9fMF9fSW1wbCBydWxlX19GdWxsSnZtRm9ybWFsUGFyYW1ldGVyX19Hcm91cF9fMQogICAgICAgICAgICAgewogICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfNyk7CiAgICAgICAgICAgICBydWxlX19GdWxsSnZtRm9ybWFsUGFyYW1ldGVyX19Hcm91cF9fMF9fSW1wbCgpOwpAQCAtNTgzOTAsMjMgKzYyODQ3LDIzIEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fRnVsbEp2bUZvcm1hbFBhcmFtZXRlcl9fR3JvdXBfXzBfX0ltcGwiCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTc3MDE6MTogcnVsZV9fRnVsbEp2bUZvcm1hbFBhcmFtZXRlcl9fR3JvdXBfXzBfX0ltcGwgOiAoICggcnVsZV9fRnVsbEp2bUZvcm1hbFBhcmFtZXRlcl9fUGFyYW1ldGVyVHlwZUFzc2lnbm1lbnRfMCApICkgOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE5MDM5OjE6IHJ1bGVfX0Z1bGxKdm1Gb3JtYWxQYXJhbWV0ZXJfX0dyb3VwX18wX19JbXBsIDogKCAoIHJ1bGVfX0Z1bGxKdm1Gb3JtYWxQYXJhbWV0ZXJfX1BhcmFtZXRlclR5cGVBc3NpZ25tZW50XzAgKSApIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19GdWxsSnZtRm9ybWFsUGFyYW1ldGVyX19Hcm91cF9fMF9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNzcwNToxOiAoICggKCBydWxlX19GdWxsSnZtRm9ybWFsUGFyYW1ldGVyX19QYXJhbWV0ZXJUeXBlQXNzaWdubWVudF8wICkgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNzcwNjoxOiAoICggcnVsZV9fRnVsbEp2bUZvcm1hbFBhcmFtZXRlcl9fUGFyYW1ldGVyVHlwZUFzc2lnbm1lbnRfMCApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE5MDQzOjE6ICggKCAoIHJ1bGVfX0Z1bGxKdm1Gb3JtYWxQYXJhbWV0ZXJfX1BhcmFtZXRlclR5cGVBc3NpZ25tZW50XzAgKSApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE5MDQ0OjE6ICggKCBydWxlX19GdWxsSnZtRm9ybWFsUGFyYW1ldGVyX19QYXJhbWV0ZXJUeXBlQXNzaWdubWVudF8wICkgKQogICAgICAgICAgICAgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTc3MDY6MTogKCAoIHJ1bGVfX0Z1bGxKdm1Gb3JtYWxQYXJhbWV0ZXJfX1BhcmFtZXRlclR5cGVBc3NpZ25tZW50XzAgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNzcwNzoyOiAoIHJ1bGVfX0Z1bGxKdm1Gb3JtYWxQYXJhbWV0ZXJfX1BhcmFtZXRlclR5cGVBc3NpZ25tZW50XzAgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTkwNDQ6MTogKCAoIHJ1bGVfX0Z1bGxKdm1Gb3JtYWxQYXJhbWV0ZXJfX1BhcmFtZXRlclR5cGVBc3NpZ25tZW50XzAgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxOTA0NToyOiAoIHJ1bGVfX0Z1bGxKdm1Gb3JtYWxQYXJhbWV0ZXJfX1BhcmFtZXRlclR5cGVBc3NpZ25tZW50XzAgKQogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRGdWxsSnZtRm9ybWFsUGFyYW1ldGVyQWNjZXNzKCkuZ2V0UGFyYW1ldGVyVHlwZUFzc2lnbm1lbnRfMCgpKTsgCiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNzcwODoyOiAoIHJ1bGVfX0Z1bGxKdm1Gb3JtYWxQYXJhbWV0ZXJfX1BhcmFtZXRlclR5cGVBc3NpZ25tZW50XzAgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTc3MDg6MzogcnVsZV9fRnVsbEp2bUZvcm1hbFBhcmFtZXRlcl9fUGFyYW1ldGVyVHlwZUFzc2lnbm1lbnRfMAorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTkwNDY6MjogKCBydWxlX19GdWxsSnZtRm9ybWFsUGFyYW1ldGVyX19QYXJhbWV0ZXJUeXBlQXNzaWdubWVudF8wICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE5MDQ2OjM6IHJ1bGVfX0Z1bGxKdm1Gb3JtYWxQYXJhbWV0ZXJfX1BhcmFtZXRlclR5cGVBc3NpZ25tZW50XzAKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzIpOwogICAgICAgICAgICAgcnVsZV9fRnVsbEp2bUZvcm1hbFBhcmFtZXRlcl9fUGFyYW1ldGVyVHlwZUFzc2lnbm1lbnRfMCgpOwpAQCAtNTg0NDEsMTQgKzYyODk4LDE0IEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fRnVsbEp2bUZvcm1hbFBhcmFtZXRlcl9fR3JvdXBfXzEiCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTc3MTY6MTogcnVsZV9fRnVsbEp2bUZvcm1hbFBhcmFtZXRlcl9fR3JvdXBfXzEgOiBydWxlX19GdWxsSnZtRm9ybWFsUGFyYW1ldGVyX19Hcm91cF9fMV9fSW1wbCA7CisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTkwNTQ6MTogcnVsZV9fRnVsbEp2bUZvcm1hbFBhcmFtZXRlcl9fR3JvdXBfXzEgOiBydWxlX19GdWxsSnZtRm9ybWFsUGFyYW1ldGVyX19Hcm91cF9fMV9fSW1wbCA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fRnVsbEp2bUZvcm1hbFBhcmFtZXRlcl9fR3JvdXBfXzEoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTc3MjA6MTogKCBydWxlX19GdWxsSnZtRm9ybWFsUGFyYW1ldGVyX19Hcm91cF9fMV9fSW1wbCApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNzcyMToyOiBydWxlX19GdWxsSnZtRm9ybWFsUGFyYW1ldGVyX19Hcm91cF9fMV9fSW1wbAorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTkwNTg6MTogKCBydWxlX19GdWxsSnZtRm9ybWFsUGFyYW1ldGVyX19Hcm91cF9fMV9fSW1wbCApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxOTA1OToyOiBydWxlX19GdWxsSnZtRm9ybWFsUGFyYW1ldGVyX19Hcm91cF9fMV9fSW1wbAogICAgICAgICAgICAgewogICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMik7CiAgICAgICAgICAgICBydWxlX19GdWxsSnZtRm9ybWFsUGFyYW1ldGVyX19Hcm91cF9fMV9fSW1wbCgpOwpAQCAtNTg0NzQsMjMgKzYyOTMxLDIzIEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fRnVsbEp2bUZvcm1hbFBhcmFtZXRlcl9fR3JvdXBfXzFfX0ltcGwiCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTc3Mjc6MTogcnVsZV9fRnVsbEp2bUZvcm1hbFBhcmFtZXRlcl9fR3JvdXBfXzFfX0ltcGwgOiAoICggcnVsZV9fRnVsbEp2bUZvcm1hbFBhcmFtZXRlcl9fTmFtZUFzc2lnbm1lbnRfMSApICkgOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE5MDY1OjE6IHJ1bGVfX0Z1bGxKdm1Gb3JtYWxQYXJhbWV0ZXJfX0dyb3VwX18xX19JbXBsIDogKCAoIHJ1bGVfX0Z1bGxKdm1Gb3JtYWxQYXJhbWV0ZXJfX05hbWVBc3NpZ25tZW50XzEgKSApIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19GdWxsSnZtRm9ybWFsUGFyYW1ldGVyX19Hcm91cF9fMV9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNzczMToxOiAoICggKCBydWxlX19GdWxsSnZtRm9ybWFsUGFyYW1ldGVyX19OYW1lQXNzaWdubWVudF8xICkgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNzczMjoxOiAoICggcnVsZV9fRnVsbEp2bUZvcm1hbFBhcmFtZXRlcl9fTmFtZUFzc2lnbm1lbnRfMSApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE5MDY5OjE6ICggKCAoIHJ1bGVfX0Z1bGxKdm1Gb3JtYWxQYXJhbWV0ZXJfX05hbWVBc3NpZ25tZW50XzEgKSApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE5MDcwOjE6ICggKCBydWxlX19GdWxsSnZtRm9ybWFsUGFyYW1ldGVyX19OYW1lQXNzaWdubWVudF8xICkgKQogICAgICAgICAgICAgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTc3MzI6MTogKCAoIHJ1bGVfX0Z1bGxKdm1Gb3JtYWxQYXJhbWV0ZXJfX05hbWVBc3NpZ25tZW50XzEgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNzczMzoyOiAoIHJ1bGVfX0Z1bGxKdm1Gb3JtYWxQYXJhbWV0ZXJfX05hbWVBc3NpZ25tZW50XzEgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTkwNzA6MTogKCAoIHJ1bGVfX0Z1bGxKdm1Gb3JtYWxQYXJhbWV0ZXJfX05hbWVBc3NpZ25tZW50XzEgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxOTA3MToyOiAoIHJ1bGVfX0Z1bGxKdm1Gb3JtYWxQYXJhbWV0ZXJfX05hbWVBc3NpZ25tZW50XzEgKQogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRGdWxsSnZtRm9ybWFsUGFyYW1ldGVyQWNjZXNzKCkuZ2V0TmFtZUFzc2lnbm1lbnRfMSgpKTsgCiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNzczNDoyOiAoIHJ1bGVfX0Z1bGxKdm1Gb3JtYWxQYXJhbWV0ZXJfX05hbWVBc3NpZ25tZW50XzEgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTc3MzQ6MzogcnVsZV9fRnVsbEp2bUZvcm1hbFBhcmFtZXRlcl9fTmFtZUFzc2lnbm1lbnRfMQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTkwNzI6MjogKCBydWxlX19GdWxsSnZtRm9ybWFsUGFyYW1ldGVyX19OYW1lQXNzaWdubWVudF8xICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE5MDcyOjM6IHJ1bGVfX0Z1bGxKdm1Gb3JtYWxQYXJhbWV0ZXJfX05hbWVBc3NpZ25tZW50XzEKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzIpOwogICAgICAgICAgICAgcnVsZV9fRnVsbEp2bUZvcm1hbFBhcmFtZXRlcl9fTmFtZUFzc2lnbm1lbnRfMSgpOwpAQCAtNTg1MjUsMTYgKzYyOTgyLDE2IEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fWEZlYXR1cmVDYWxsX19Hcm91cF9fMCIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNzc0MzoxOiBydWxlX19YRmVhdHVyZUNhbGxfX0dyb3VwX18wIDogcnVsZV9fWEZlYXR1cmVDYWxsX19Hcm91cF9fMF9fSW1wbCBydWxlX19YRmVhdHVyZUNhbGxfX0dyb3VwX18xIDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxOTA4MToxOiBydWxlX19YRmVhdHVyZUNhbGxfX0dyb3VwX18wIDogcnVsZV9fWEZlYXR1cmVDYWxsX19Hcm91cF9fMF9fSW1wbCBydWxlX19YRmVhdHVyZUNhbGxfX0dyb3VwX18xIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YRmVhdHVyZUNhbGxfX0dyb3VwX18wKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE3NzQ3OjE6ICggcnVsZV9fWEZlYXR1cmVDYWxsX19Hcm91cF9fMF9fSW1wbCBydWxlX19YRmVhdHVyZUNhbGxfX0dyb3VwX18xICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE3NzQ4OjI6IHJ1bGVfX1hGZWF0dXJlQ2FsbF9fR3JvdXBfXzBfX0ltcGwgcnVsZV9fWEZlYXR1cmVDYWxsX19Hcm91cF9fMQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTkwODU6MTogKCBydWxlX19YRmVhdHVyZUNhbGxfX0dyb3VwX18wX19JbXBsIHJ1bGVfX1hGZWF0dXJlQ2FsbF9fR3JvdXBfXzEgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTkwODY6MjogcnVsZV9fWEZlYXR1cmVDYWxsX19Hcm91cF9fMF9fSW1wbCBydWxlX19YRmVhdHVyZUNhbGxfX0dyb3VwX18xCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV18xMDgpOworICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMTE2KTsKICAgICAgICAgICAgIHJ1bGVfX1hGZWF0dXJlQ2FsbF9fR3JvdXBfXzBfX0ltcGwoKTsKIAogICAgICAgICAgICAgc3RhdGUuX2ZzcC0tOwpAQCAtNTg1NjMsMjMgKzYzMDIwLDIzIEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fWEZlYXR1cmVDYWxsX19Hcm91cF9fMF9fSW1wbCIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNzc1NToxOiBydWxlX19YRmVhdHVyZUNhbGxfX0dyb3VwX18wX19JbXBsIDogKCAoKSApIDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxOTA5MzoxOiBydWxlX19YRmVhdHVyZUNhbGxfX0dyb3VwX18wX19JbXBsIDogKCAoKSApIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YRmVhdHVyZUNhbGxfX0dyb3VwX18wX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE3NzU5OjE6ICggKCAoKSApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE3NzYwOjE6ICggKCkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTkwOTc6MTogKCAoICgpICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTkwOTg6MTogKCAoKSApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNzc2MDoxOiAoICgpICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE3NzYxOjI6ICgpCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxOTA5ODoxOiAoICgpICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE5MDk5OjI6ICgpCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhGZWF0dXJlQ2FsbEFjY2VzcygpLmdldFhGZWF0dXJlQ2FsbEFjdGlvbl8wKCkpOyAKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE3NzYyOjI6ICgpCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNzc2MjozOiAKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE5MTAwOjI6ICgpCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxOTEwMDozOiAKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIH0KIApAQCAtNTg2MDQsMTYgKzYzMDYxLDE2IEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fWEZlYXR1cmVDYWxsX19Hcm91cF9fMSIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNzc3MDoxOiBydWxlX19YRmVhdHVyZUNhbGxfX0dyb3VwX18xIDogcnVsZV9fWEZlYXR1cmVDYWxsX19Hcm91cF9fMV9fSW1wbCBydWxlX19YRmVhdHVyZUNhbGxfX0dyb3VwX18yIDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxOTEwODoxOiBydWxlX19YRmVhdHVyZUNhbGxfX0dyb3VwX18xIDogcnVsZV9fWEZlYXR1cmVDYWxsX19Hcm91cF9fMV9fSW1wbCBydWxlX19YRmVhdHVyZUNhbGxfX0dyb3VwX18yIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YRmVhdHVyZUNhbGxfX0dyb3VwX18xKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE3Nzc0OjE6ICggcnVsZV9fWEZlYXR1cmVDYWxsX19Hcm91cF9fMV9fSW1wbCBydWxlX19YRmVhdHVyZUNhbGxfX0dyb3VwX18yICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE3Nzc1OjI6IHJ1bGVfX1hGZWF0dXJlQ2FsbF9fR3JvdXBfXzFfX0ltcGwgcnVsZV9fWEZlYXR1cmVDYWxsX19Hcm91cF9fMgorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTkxMTI6MTogKCBydWxlX19YRmVhdHVyZUNhbGxfX0dyb3VwX18xX19JbXBsIHJ1bGVfX1hGZWF0dXJlQ2FsbF9fR3JvdXBfXzIgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTkxMTM6MjogcnVsZV9fWEZlYXR1cmVDYWxsX19Hcm91cF9fMV9fSW1wbCBydWxlX19YRmVhdHVyZUNhbGxfX0dyb3VwX18yCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV18xMDgpOworICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMTE2KTsKICAgICAgICAgICAgIHJ1bGVfX1hGZWF0dXJlQ2FsbF9fR3JvdXBfXzFfX0ltcGwoKTsKIAogICAgICAgICAgICAgc3RhdGUuX2ZzcC0tOwpAQCAtNTg2NDIsMzEgKzYzMDk5LDMxIEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fWEZlYXR1cmVDYWxsX19Hcm91cF9fMV9fSW1wbCIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNzc4MjoxOiBydWxlX19YRmVhdHVyZUNhbGxfX0dyb3VwX18xX19JbXBsIDogKCAoIHJ1bGVfX1hGZWF0dXJlQ2FsbF9fR3JvdXBfMV9fMCApPyApIDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxOTEyMDoxOiBydWxlX19YRmVhdHVyZUNhbGxfX0dyb3VwX18xX19JbXBsIDogKCAoIHJ1bGVfX1hGZWF0dXJlQ2FsbF9fR3JvdXBfMV9fMCApPyApIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YRmVhdHVyZUNhbGxfX0dyb3VwX18xX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE3Nzg2OjE6ICggKCAoIHJ1bGVfX1hGZWF0dXJlQ2FsbF9fR3JvdXBfMV9fMCApPyApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE3Nzg3OjE6ICggKCBydWxlX19YRmVhdHVyZUNhbGxfX0dyb3VwXzFfXzAgKT8gKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTkxMjQ6MTogKCAoICggcnVsZV9fWEZlYXR1cmVDYWxsX19Hcm91cF8xX18wICk/ICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTkxMjU6MTogKCAoIHJ1bGVfX1hGZWF0dXJlQ2FsbF9fR3JvdXBfMV9fMCApPyApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNzc4NzoxOiAoICggcnVsZV9fWEZlYXR1cmVDYWxsX19Hcm91cF8xX18wICk/ICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE3Nzg4OjI6ICggcnVsZV9fWEZlYXR1cmVDYWxsX19Hcm91cF8xX18wICk/CisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxOTEyNToxOiAoICggcnVsZV9fWEZlYXR1cmVDYWxsX19Hcm91cF8xX18wICk/ICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE5MTI2OjI6ICggcnVsZV9fWEZlYXR1cmVDYWxsX19Hcm91cF8xX18wICk/CiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhGZWF0dXJlQ2FsbEFjY2VzcygpLmdldEdyb3VwXzEoKSk7IAogICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTc3ODk6MjogKCBydWxlX19YRmVhdHVyZUNhbGxfX0dyb3VwXzFfXzAgKT8KLSAgICAgICAgICAgIGludCBhbHQxMzk9MjsKLSAgICAgICAgICAgIGludCBMQTEzOV8wID0gaW5wdXQuTEEoMSk7CisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxOTEyNzoyOiAoIHJ1bGVfX1hGZWF0dXJlQ2FsbF9fR3JvdXBfMV9fMCApPworICAgICAgICAgICAgaW50IGFsdDE1Mj0yOworICAgICAgICAgICAgaW50IExBMTUyXzAgPSBpbnB1dC5MQSgxKTsKIAotICAgICAgICAgICAgaWYgKCAoTEExMzlfMD09MjcpICkgewotICAgICAgICAgICAgICAgIGFsdDEzOT0xOworICAgICAgICAgICAgaWYgKCAoTEExNTJfMD09MjcpICkgeworICAgICAgICAgICAgICAgIGFsdDE1Mj0xOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgc3dpdGNoIChhbHQxMzkpIHsKKyAgICAgICAgICAgIHN3aXRjaCAoYWx0MTUyKSB7CiAgICAgICAgICAgICAgICAgY2FzZSAxIDoKLSAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTc3ODk6MzogcnVsZV9fWEZlYXR1cmVDYWxsX19Hcm91cF8xX18wCisgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE5MTI3OjM6IHJ1bGVfX1hGZWF0dXJlQ2FsbF9fR3JvdXBfMV9fMAogICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzIpOwogICAgICAgICAgICAgICAgICAgICBydWxlX19YRmVhdHVyZUNhbGxfX0dyb3VwXzFfXzAoKTsKQEAgLTU4NzA0LDE2ICs2MzE2MSwxNiBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX1hGZWF0dXJlQ2FsbF9fR3JvdXBfXzIiCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTc3OTc6MTogcnVsZV9fWEZlYXR1cmVDYWxsX19Hcm91cF9fMiA6IHJ1bGVfX1hGZWF0dXJlQ2FsbF9fR3JvdXBfXzJfX0ltcGwgcnVsZV9fWEZlYXR1cmVDYWxsX19Hcm91cF9fMyA7CisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTkxMzU6MTogcnVsZV9fWEZlYXR1cmVDYWxsX19Hcm91cF9fMiA6IHJ1bGVfX1hGZWF0dXJlQ2FsbF9fR3JvdXBfXzJfX0ltcGwgcnVsZV9fWEZlYXR1cmVDYWxsX19Hcm91cF9fMyA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fWEZlYXR1cmVDYWxsX19Hcm91cF9fMigpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNzgwMToxOiAoIHJ1bGVfX1hGZWF0dXJlQ2FsbF9fR3JvdXBfXzJfX0ltcGwgcnVsZV9fWEZlYXR1cmVDYWxsX19Hcm91cF9fMyApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNzgwMjoyOiBydWxlX19YRmVhdHVyZUNhbGxfX0dyb3VwX18yX19JbXBsIHJ1bGVfX1hGZWF0dXJlQ2FsbF9fR3JvdXBfXzMKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE5MTM5OjE6ICggcnVsZV9fWEZlYXR1cmVDYWxsX19Hcm91cF9fMl9fSW1wbCBydWxlX19YRmVhdHVyZUNhbGxfX0dyb3VwX18zICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE5MTQwOjI6IHJ1bGVfX1hGZWF0dXJlQ2FsbF9fR3JvdXBfXzJfX0ltcGwgcnVsZV9fWEZlYXR1cmVDYWxsX19Hcm91cF9fMwogICAgICAgICAgICAgewotICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMTA5KTsKKyAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzExNyk7CiAgICAgICAgICAgICBydWxlX19YRmVhdHVyZUNhbGxfX0dyb3VwX18yX19JbXBsKCk7CiAKICAgICAgICAgICAgIHN0YXRlLl9mc3AtLTsKQEAgLTU4NzQyLDIzICs2MzE5OSwyMyBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX1hGZWF0dXJlQ2FsbF9fR3JvdXBfXzJfX0ltcGwiCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTc4MDk6MTogcnVsZV9fWEZlYXR1cmVDYWxsX19Hcm91cF9fMl9fSW1wbCA6ICggKCBydWxlX19YRmVhdHVyZUNhbGxfX0ZlYXR1cmVBc3NpZ25tZW50XzIgKSApIDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxOTE0NzoxOiBydWxlX19YRmVhdHVyZUNhbGxfX0dyb3VwX18yX19JbXBsIDogKCAoIHJ1bGVfX1hGZWF0dXJlQ2FsbF9fRmVhdHVyZUFzc2lnbm1lbnRfMiApICkgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1hGZWF0dXJlQ2FsbF9fR3JvdXBfXzJfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTc4MTM6MTogKCAoICggcnVsZV9fWEZlYXR1cmVDYWxsX19GZWF0dXJlQXNzaWdubWVudF8yICkgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNzgxNDoxOiAoICggcnVsZV9fWEZlYXR1cmVDYWxsX19GZWF0dXJlQXNzaWdubWVudF8yICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTkxNTE6MTogKCAoICggcnVsZV9fWEZlYXR1cmVDYWxsX19GZWF0dXJlQXNzaWdubWVudF8yICkgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxOTE1MjoxOiAoICggcnVsZV9fWEZlYXR1cmVDYWxsX19GZWF0dXJlQXNzaWdubWVudF8yICkgKQogICAgICAgICAgICAgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTc4MTQ6MTogKCAoIHJ1bGVfX1hGZWF0dXJlQ2FsbF9fRmVhdHVyZUFzc2lnbm1lbnRfMiApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE3ODE1OjI6ICggcnVsZV9fWEZlYXR1cmVDYWxsX19GZWF0dXJlQXNzaWdubWVudF8yICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE5MTUyOjE6ICggKCBydWxlX19YRmVhdHVyZUNhbGxfX0ZlYXR1cmVBc3NpZ25tZW50XzIgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxOTE1MzoyOiAoIHJ1bGVfX1hGZWF0dXJlQ2FsbF9fRmVhdHVyZUFzc2lnbm1lbnRfMiApCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhGZWF0dXJlQ2FsbEFjY2VzcygpLmdldEZlYXR1cmVBc3NpZ25tZW50XzIoKSk7IAogICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTc4MTY6MjogKCBydWxlX19YRmVhdHVyZUNhbGxfX0ZlYXR1cmVBc3NpZ25tZW50XzIgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTc4MTY6MzogcnVsZV9fWEZlYXR1cmVDYWxsX19GZWF0dXJlQXNzaWdubWVudF8yCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxOTE1NDoyOiAoIHJ1bGVfX1hGZWF0dXJlQ2FsbF9fRmVhdHVyZUFzc2lnbm1lbnRfMiApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxOTE1NDozOiBydWxlX19YRmVhdHVyZUNhbGxfX0ZlYXR1cmVBc3NpZ25tZW50XzIKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzIpOwogICAgICAgICAgICAgcnVsZV9fWEZlYXR1cmVDYWxsX19GZWF0dXJlQXNzaWdubWVudF8yKCk7CkBAIC01ODc5MywxNiArNjMyNTAsMTYgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YRmVhdHVyZUNhbGxfX0dyb3VwX18zIgotICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE3ODI0OjE6IHJ1bGVfX1hGZWF0dXJlQ2FsbF9fR3JvdXBfXzMgOiBydWxlX19YRmVhdHVyZUNhbGxfX0dyb3VwX18zX19JbXBsIHJ1bGVfX1hGZWF0dXJlQ2FsbF9fR3JvdXBfXzQgOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE5MTYyOjE6IHJ1bGVfX1hGZWF0dXJlQ2FsbF9fR3JvdXBfXzMgOiBydWxlX19YRmVhdHVyZUNhbGxfX0dyb3VwX18zX19JbXBsIHJ1bGVfX1hGZWF0dXJlQ2FsbF9fR3JvdXBfXzQgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1hGZWF0dXJlQ2FsbF9fR3JvdXBfXzMoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTc4Mjg6MTogKCBydWxlX19YRmVhdHVyZUNhbGxfX0dyb3VwX18zX19JbXBsIHJ1bGVfX1hGZWF0dXJlQ2FsbF9fR3JvdXBfXzQgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTc4Mjk6MjogcnVsZV9fWEZlYXR1cmVDYWxsX19Hcm91cF9fM19fSW1wbCBydWxlX19YRmVhdHVyZUNhbGxfX0dyb3VwX180CisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxOTE2NjoxOiAoIHJ1bGVfX1hGZWF0dXJlQ2FsbF9fR3JvdXBfXzNfX0ltcGwgcnVsZV9fWEZlYXR1cmVDYWxsX19Hcm91cF9fNCApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxOTE2NzoyOiBydWxlX19YRmVhdHVyZUNhbGxfX0dyb3VwX18zX19JbXBsIHJ1bGVfX1hGZWF0dXJlQ2FsbF9fR3JvdXBfXzQKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzEwOSk7CisgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV18xMTcpOwogICAgICAgICAgICAgcnVsZV9fWEZlYXR1cmVDYWxsX19Hcm91cF9fM19fSW1wbCgpOwogCiAgICAgICAgICAgICBzdGF0ZS5fZnNwLS07CkBAIC01ODgzMSwyNyArNjMyODgsMjcgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YRmVhdHVyZUNhbGxfX0dyb3VwX18zX19JbXBsIgotICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE3ODM2OjE6IHJ1bGVfX1hGZWF0dXJlQ2FsbF9fR3JvdXBfXzNfX0ltcGwgOiAoICggcnVsZV9fWEZlYXR1cmVDYWxsX19Hcm91cF8zX18wICk/ICkgOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE5MTc0OjE6IHJ1bGVfX1hGZWF0dXJlQ2FsbF9fR3JvdXBfXzNfX0ltcGwgOiAoICggcnVsZV9fWEZlYXR1cmVDYWxsX19Hcm91cF8zX18wICk/ICkgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1hGZWF0dXJlQ2FsbF9fR3JvdXBfXzNfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTc4NDA6MTogKCAoICggcnVsZV9fWEZlYXR1cmVDYWxsX19Hcm91cF8zX18wICk/ICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTc4NDE6MTogKCAoIHJ1bGVfX1hGZWF0dXJlQ2FsbF9fR3JvdXBfM19fMCApPyApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxOTE3ODoxOiAoICggKCBydWxlX19YRmVhdHVyZUNhbGxfX0dyb3VwXzNfXzAgKT8gKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxOTE3OToxOiAoICggcnVsZV9fWEZlYXR1cmVDYWxsX19Hcm91cF8zX18wICk/ICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE3ODQxOjE6ICggKCBydWxlX19YRmVhdHVyZUNhbGxfX0dyb3VwXzNfXzAgKT8gKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTc4NDI6MjogKCBydWxlX19YRmVhdHVyZUNhbGxfX0dyb3VwXzNfXzAgKT8KKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE5MTc5OjE6ICggKCBydWxlX19YRmVhdHVyZUNhbGxfX0dyb3VwXzNfXzAgKT8gKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTkxODA6MjogKCBydWxlX19YRmVhdHVyZUNhbGxfX0dyb3VwXzNfXzAgKT8KICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WEZlYXR1cmVDYWxsQWNjZXNzKCkuZ2V0R3JvdXBfMygpKTsgCiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNzg0MzoyOiAoIHJ1bGVfX1hGZWF0dXJlQ2FsbF9fR3JvdXBfM19fMCApPwotICAgICAgICAgICAgaW50IGFsdDE0MD0yOwotICAgICAgICAgICAgYWx0MTQwID0gZGZhMTQwLnByZWRpY3QoaW5wdXQpOwotICAgICAgICAgICAgc3dpdGNoIChhbHQxNDApIHsKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE5MTgxOjI6ICggcnVsZV9fWEZlYXR1cmVDYWxsX19Hcm91cF8zX18wICk/CisgICAgICAgICAgICBpbnQgYWx0MTUzPTI7CisgICAgICAgICAgICBhbHQxNTMgPSBkZmExNTMucHJlZGljdChpbnB1dCk7CisgICAgICAgICAgICBzd2l0Y2ggKGFsdDE1MykgewogICAgICAgICAgICAgICAgIGNhc2UgMSA6Ci0gICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE3ODQzOjM6IHJ1bGVfX1hGZWF0dXJlQ2FsbF9fR3JvdXBfM19fMAorICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxOTE4MTozOiBydWxlX19YRmVhdHVyZUNhbGxfX0dyb3VwXzNfXzAKICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV18yKTsKICAgICAgICAgICAgICAgICAgICAgcnVsZV9fWEZlYXR1cmVDYWxsX19Hcm91cF8zX18wKCk7CkBAIC01ODg4OSwxNCArNjMzNDYsMTQgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YRmVhdHVyZUNhbGxfX0dyb3VwX180IgotICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE3ODUxOjE6IHJ1bGVfX1hGZWF0dXJlQ2FsbF9fR3JvdXBfXzQgOiBydWxlX19YRmVhdHVyZUNhbGxfX0dyb3VwX180X19JbXBsIDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxOTE4OToxOiBydWxlX19YRmVhdHVyZUNhbGxfX0dyb3VwX180IDogcnVsZV9fWEZlYXR1cmVDYWxsX19Hcm91cF9fNF9fSW1wbCA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fWEZlYXR1cmVDYWxsX19Hcm91cF9fNCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNzg1NToxOiAoIHJ1bGVfX1hGZWF0dXJlQ2FsbF9fR3JvdXBfXzRfX0ltcGwgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTc4NTY6MjogcnVsZV9fWEZlYXR1cmVDYWxsX19Hcm91cF9fNF9fSW1wbAorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTkxOTM6MTogKCBydWxlX19YRmVhdHVyZUNhbGxfX0dyb3VwX180X19JbXBsICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE5MTk0OjI6IHJ1bGVfX1hGZWF0dXJlQ2FsbF9fR3JvdXBfXzRfX0ltcGwKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzIpOwogICAgICAgICAgICAgcnVsZV9fWEZlYXR1cmVDYWxsX19Hcm91cF9fNF9fSW1wbCgpOwpAQCAtNTg5MjIsMjcgKzYzMzc5LDI3IEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fWEZlYXR1cmVDYWxsX19Hcm91cF9fNF9fSW1wbCIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNzg2MjoxOiBydWxlX19YRmVhdHVyZUNhbGxfX0dyb3VwX180X19JbXBsIDogKCAoIHJ1bGVfX1hGZWF0dXJlQ2FsbF9fRmVhdHVyZUNhbGxBcmd1bWVudHNBc3NpZ25tZW50XzQgKT8gKSA7CisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTkyMDA6MTogcnVsZV9fWEZlYXR1cmVDYWxsX19Hcm91cF9fNF9fSW1wbCA6ICggKCBydWxlX19YRmVhdHVyZUNhbGxfX0ZlYXR1cmVDYWxsQXJndW1lbnRzQXNzaWdubWVudF80ICk/ICkgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1hGZWF0dXJlQ2FsbF9fR3JvdXBfXzRfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTc4NjY6MTogKCAoICggcnVsZV9fWEZlYXR1cmVDYWxsX19GZWF0dXJlQ2FsbEFyZ3VtZW50c0Fzc2lnbm1lbnRfNCApPyApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE3ODY3OjE6ICggKCBydWxlX19YRmVhdHVyZUNhbGxfX0ZlYXR1cmVDYWxsQXJndW1lbnRzQXNzaWdubWVudF80ICk/ICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE5MjA0OjE6ICggKCAoIHJ1bGVfX1hGZWF0dXJlQ2FsbF9fRmVhdHVyZUNhbGxBcmd1bWVudHNBc3NpZ25tZW50XzQgKT8gKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxOTIwNToxOiAoICggcnVsZV9fWEZlYXR1cmVDYWxsX19GZWF0dXJlQ2FsbEFyZ3VtZW50c0Fzc2lnbm1lbnRfNCApPyApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNzg2NzoxOiAoICggcnVsZV9fWEZlYXR1cmVDYWxsX19GZWF0dXJlQ2FsbEFyZ3VtZW50c0Fzc2lnbm1lbnRfNCApPyApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNzg2ODoyOiAoIHJ1bGVfX1hGZWF0dXJlQ2FsbF9fRmVhdHVyZUNhbGxBcmd1bWVudHNBc3NpZ25tZW50XzQgKT8KKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE5MjA1OjE6ICggKCBydWxlX19YRmVhdHVyZUNhbGxfX0ZlYXR1cmVDYWxsQXJndW1lbnRzQXNzaWdubWVudF80ICk/ICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE5MjA2OjI6ICggcnVsZV9fWEZlYXR1cmVDYWxsX19GZWF0dXJlQ2FsbEFyZ3VtZW50c0Fzc2lnbm1lbnRfNCApPwogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYRmVhdHVyZUNhbGxBY2Nlc3MoKS5nZXRGZWF0dXJlQ2FsbEFyZ3VtZW50c0Fzc2lnbm1lbnRfNCgpKTsgCiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNzg2OToyOiAoIHJ1bGVfX1hGZWF0dXJlQ2FsbF9fRmVhdHVyZUNhbGxBcmd1bWVudHNBc3NpZ25tZW50XzQgKT8KLSAgICAgICAgICAgIGludCBhbHQxNDE9MjsKLSAgICAgICAgICAgIGFsdDE0MSA9IGRmYTE0MS5wcmVkaWN0KGlucHV0KTsKLSAgICAgICAgICAgIHN3aXRjaCAoYWx0MTQxKSB7CisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxOTIwNzoyOiAoIHJ1bGVfX1hGZWF0dXJlQ2FsbF9fRmVhdHVyZUNhbGxBcmd1bWVudHNBc3NpZ25tZW50XzQgKT8KKyAgICAgICAgICAgIGludCBhbHQxNTQ9MjsKKyAgICAgICAgICAgIGFsdDE1NCA9IGRmYTE1NC5wcmVkaWN0KGlucHV0KTsKKyAgICAgICAgICAgIHN3aXRjaCAoYWx0MTU0KSB7CiAgICAgICAgICAgICAgICAgY2FzZSAxIDoKLSAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTc4Njk6MzogcnVsZV9fWEZlYXR1cmVDYWxsX19GZWF0dXJlQ2FsbEFyZ3VtZW50c0Fzc2lnbm1lbnRfNAorICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxOTIwNzozOiBydWxlX19YRmVhdHVyZUNhbGxfX0ZlYXR1cmVDYWxsQXJndW1lbnRzQXNzaWdubWVudF80CiAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMik7CiAgICAgICAgICAgICAgICAgICAgIHJ1bGVfX1hGZWF0dXJlQ2FsbF9fRmVhdHVyZUNhbGxBcmd1bWVudHNBc3NpZ25tZW50XzQoKTsKQEAgLTU4OTgwLDE2ICs2MzQzNywxNiBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX1hGZWF0dXJlQ2FsbF9fR3JvdXBfMV9fMCIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNzg3ODoxOiBydWxlX19YRmVhdHVyZUNhbGxfX0dyb3VwXzFfXzAgOiBydWxlX19YRmVhdHVyZUNhbGxfX0dyb3VwXzFfXzBfX0ltcGwgcnVsZV9fWEZlYXR1cmVDYWxsX19Hcm91cF8xX18xIDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxOTIxNjoxOiBydWxlX19YRmVhdHVyZUNhbGxfX0dyb3VwXzFfXzAgOiBydWxlX19YRmVhdHVyZUNhbGxfX0dyb3VwXzFfXzBfX0ltcGwgcnVsZV9fWEZlYXR1cmVDYWxsX19Hcm91cF8xX18xIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YRmVhdHVyZUNhbGxfX0dyb3VwXzFfXzAoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTc4ODI6MTogKCBydWxlX19YRmVhdHVyZUNhbGxfX0dyb3VwXzFfXzBfX0ltcGwgcnVsZV9fWEZlYXR1cmVDYWxsX19Hcm91cF8xX18xICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE3ODgzOjI6IHJ1bGVfX1hGZWF0dXJlQ2FsbF9fR3JvdXBfMV9fMF9fSW1wbCBydWxlX19YRmVhdHVyZUNhbGxfX0dyb3VwXzFfXzEKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE5MjIwOjE6ICggcnVsZV9fWEZlYXR1cmVDYWxsX19Hcm91cF8xX18wX19JbXBsIHJ1bGVfX1hGZWF0dXJlQ2FsbF9fR3JvdXBfMV9fMSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxOTIyMToyOiBydWxlX19YRmVhdHVyZUNhbGxfX0dyb3VwXzFfXzBfX0ltcGwgcnVsZV9fWEZlYXR1cmVDYWxsX19Hcm91cF8xX18xCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV18xMTApOworICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMTE4KTsKICAgICAgICAgICAgIHJ1bGVfX1hGZWF0dXJlQ2FsbF9fR3JvdXBfMV9fMF9fSW1wbCgpOwogCiAgICAgICAgICAgICBzdGF0ZS5fZnNwLS07CkBAIC01OTAxOCwxNyArNjM0NzUsMTcgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YRmVhdHVyZUNhbGxfX0dyb3VwXzFfXzBfX0ltcGwiCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTc4OTA6MTogcnVsZV9fWEZlYXR1cmVDYWxsX19Hcm91cF8xX18wX19JbXBsIDogKCAnPCcgKSA7CisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTkyMjg6MTogcnVsZV9fWEZlYXR1cmVDYWxsX19Hcm91cF8xX18wX19JbXBsIDogKCAnPCcgKSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fWEZlYXR1cmVDYWxsX19Hcm91cF8xX18wX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE3ODk0OjE6ICggKCAnPCcgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNzg5NToxOiAoICc8JyApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxOTIzMjoxOiAoICggJzwnICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTkyMzM6MTogKCAnPCcgKQogICAgICAgICAgICAgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTc4OTU6MTogKCAnPCcgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTc4OTY6MjogJzwnCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxOTIzMzoxOiAoICc8JyApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxOTIzNDoyOiAnPCcKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WEZlYXR1cmVDYWxsQWNjZXNzKCkuZ2V0TGVzc1RoYW5TaWduS2V5d29yZF8xXzAoKSk7IApAQCAtNTkwNTksMTYgKzYzNTE2LDE2IEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fWEZlYXR1cmVDYWxsX19Hcm91cF8xX18xIgotICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE3OTA1OjE6IHJ1bGVfX1hGZWF0dXJlQ2FsbF9fR3JvdXBfMV9fMSA6IHJ1bGVfX1hGZWF0dXJlQ2FsbF9fR3JvdXBfMV9fMV9fSW1wbCBydWxlX19YRmVhdHVyZUNhbGxfX0dyb3VwXzFfXzIgOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE5MjQzOjE6IHJ1bGVfX1hGZWF0dXJlQ2FsbF9fR3JvdXBfMV9fMSA6IHJ1bGVfX1hGZWF0dXJlQ2FsbF9fR3JvdXBfMV9fMV9fSW1wbCBydWxlX19YRmVhdHVyZUNhbGxfX0dyb3VwXzFfXzIgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1hGZWF0dXJlQ2FsbF9fR3JvdXBfMV9fMSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNzkwOToxOiAoIHJ1bGVfX1hGZWF0dXJlQ2FsbF9fR3JvdXBfMV9fMV9fSW1wbCBydWxlX19YRmVhdHVyZUNhbGxfX0dyb3VwXzFfXzIgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTc5MTA6MjogcnVsZV9fWEZlYXR1cmVDYWxsX19Hcm91cF8xX18xX19JbXBsIHJ1bGVfX1hGZWF0dXJlQ2FsbF9fR3JvdXBfMV9fMgorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTkyNDc6MTogKCBydWxlX19YRmVhdHVyZUNhbGxfX0dyb3VwXzFfXzFfX0ltcGwgcnVsZV9fWEZlYXR1cmVDYWxsX19Hcm91cF8xX18yICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE5MjQ4OjI6IHJ1bGVfX1hGZWF0dXJlQ2FsbF9fR3JvdXBfMV9fMV9fSW1wbCBydWxlX19YRmVhdHVyZUNhbGxfX0dyb3VwXzFfXzIKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzExMSk7CisgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV18xMTkpOwogICAgICAgICAgICAgcnVsZV9fWEZlYXR1cmVDYWxsX19Hcm91cF8xX18xX19JbXBsKCk7CiAKICAgICAgICAgICAgIHN0YXRlLl9mc3AtLTsKQEAgLTU5MDk3LDIzICs2MzU1NCwyMyBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX1hGZWF0dXJlQ2FsbF9fR3JvdXBfMV9fMV9fSW1wbCIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNzkxNzoxOiBydWxlX19YRmVhdHVyZUNhbGxfX0dyb3VwXzFfXzFfX0ltcGwgOiAoICggcnVsZV9fWEZlYXR1cmVDYWxsX19UeXBlQXJndW1lbnRzQXNzaWdubWVudF8xXzEgKSApIDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxOTI1NToxOiBydWxlX19YRmVhdHVyZUNhbGxfX0dyb3VwXzFfXzFfX0ltcGwgOiAoICggcnVsZV9fWEZlYXR1cmVDYWxsX19UeXBlQXJndW1lbnRzQXNzaWdubWVudF8xXzEgKSApIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YRmVhdHVyZUNhbGxfX0dyb3VwXzFfXzFfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTc5MjE6MTogKCAoICggcnVsZV9fWEZlYXR1cmVDYWxsX19UeXBlQXJndW1lbnRzQXNzaWdubWVudF8xXzEgKSApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE3OTIyOjE6ICggKCBydWxlX19YRmVhdHVyZUNhbGxfX1R5cGVBcmd1bWVudHNBc3NpZ25tZW50XzFfMSApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE5MjU5OjE6ICggKCAoIHJ1bGVfX1hGZWF0dXJlQ2FsbF9fVHlwZUFyZ3VtZW50c0Fzc2lnbm1lbnRfMV8xICkgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxOTI2MDoxOiAoICggcnVsZV9fWEZlYXR1cmVDYWxsX19UeXBlQXJndW1lbnRzQXNzaWdubWVudF8xXzEgKSApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNzkyMjoxOiAoICggcnVsZV9fWEZlYXR1cmVDYWxsX19UeXBlQXJndW1lbnRzQXNzaWdubWVudF8xXzEgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNzkyMzoyOiAoIHJ1bGVfX1hGZWF0dXJlQ2FsbF9fVHlwZUFyZ3VtZW50c0Fzc2lnbm1lbnRfMV8xICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE5MjYwOjE6ICggKCBydWxlX19YRmVhdHVyZUNhbGxfX1R5cGVBcmd1bWVudHNBc3NpZ25tZW50XzFfMSApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE5MjYxOjI6ICggcnVsZV9fWEZlYXR1cmVDYWxsX19UeXBlQXJndW1lbnRzQXNzaWdubWVudF8xXzEgKQogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYRmVhdHVyZUNhbGxBY2Nlc3MoKS5nZXRUeXBlQXJndW1lbnRzQXNzaWdubWVudF8xXzEoKSk7IAogICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTc5MjQ6MjogKCBydWxlX19YRmVhdHVyZUNhbGxfX1R5cGVBcmd1bWVudHNBc3NpZ25tZW50XzFfMSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNzkyNDozOiBydWxlX19YRmVhdHVyZUNhbGxfX1R5cGVBcmd1bWVudHNBc3NpZ25tZW50XzFfMQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTkyNjI6MjogKCBydWxlX19YRmVhdHVyZUNhbGxfX1R5cGVBcmd1bWVudHNBc3NpZ25tZW50XzFfMSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxOTI2MjozOiBydWxlX19YRmVhdHVyZUNhbGxfX1R5cGVBcmd1bWVudHNBc3NpZ25tZW50XzFfMQogICAgICAgICAgICAgewogICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMik7CiAgICAgICAgICAgICBydWxlX19YRmVhdHVyZUNhbGxfX1R5cGVBcmd1bWVudHNBc3NpZ25tZW50XzFfMSgpOwpAQCAtNTkxNDgsMTYgKzYzNjA1LDE2IEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fWEZlYXR1cmVDYWxsX19Hcm91cF8xX18yIgotICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE3OTMyOjE6IHJ1bGVfX1hGZWF0dXJlQ2FsbF9fR3JvdXBfMV9fMiA6IHJ1bGVfX1hGZWF0dXJlQ2FsbF9fR3JvdXBfMV9fMl9fSW1wbCBydWxlX19YRmVhdHVyZUNhbGxfX0dyb3VwXzFfXzMgOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE5MjcwOjE6IHJ1bGVfX1hGZWF0dXJlQ2FsbF9fR3JvdXBfMV9fMiA6IHJ1bGVfX1hGZWF0dXJlQ2FsbF9fR3JvdXBfMV9fMl9fSW1wbCBydWxlX19YRmVhdHVyZUNhbGxfX0dyb3VwXzFfXzMgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1hGZWF0dXJlQ2FsbF9fR3JvdXBfMV9fMigpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNzkzNjoxOiAoIHJ1bGVfX1hGZWF0dXJlQ2FsbF9fR3JvdXBfMV9fMl9fSW1wbCBydWxlX19YRmVhdHVyZUNhbGxfX0dyb3VwXzFfXzMgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTc5Mzc6MjogcnVsZV9fWEZlYXR1cmVDYWxsX19Hcm91cF8xX18yX19JbXBsIHJ1bGVfX1hGZWF0dXJlQ2FsbF9fR3JvdXBfMV9fMworICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTkyNzQ6MTogKCBydWxlX19YRmVhdHVyZUNhbGxfX0dyb3VwXzFfXzJfX0ltcGwgcnVsZV9fWEZlYXR1cmVDYWxsX19Hcm91cF8xX18zICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE5Mjc1OjI6IHJ1bGVfX1hGZWF0dXJlQ2FsbF9fR3JvdXBfMV9fMl9fSW1wbCBydWxlX19YRmVhdHVyZUNhbGxfX0dyb3VwXzFfXzMKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzExMSk7CisgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV18xMTkpOwogICAgICAgICAgICAgcnVsZV9fWEZlYXR1cmVDYWxsX19Hcm91cF8xX18yX19JbXBsKCk7CiAKICAgICAgICAgICAgIHN0YXRlLl9mc3AtLTsKQEAgLTU5MTg2LDM3ICs2MzY0MywzNyBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX1hGZWF0dXJlQ2FsbF9fR3JvdXBfMV9fMl9fSW1wbCIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNzk0NDoxOiBydWxlX19YRmVhdHVyZUNhbGxfX0dyb3VwXzFfXzJfX0ltcGwgOiAoICggcnVsZV9fWEZlYXR1cmVDYWxsX19Hcm91cF8xXzJfXzAgKSogKSA7CisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTkyODI6MTogcnVsZV9fWEZlYXR1cmVDYWxsX19Hcm91cF8xX18yX19JbXBsIDogKCAoIHJ1bGVfX1hGZWF0dXJlQ2FsbF9fR3JvdXBfMV8yX18wICkqICkgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1hGZWF0dXJlQ2FsbF9fR3JvdXBfMV9fMl9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNzk0ODoxOiAoICggKCBydWxlX19YRmVhdHVyZUNhbGxfX0dyb3VwXzFfMl9fMCApKiApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE3OTQ5OjE6ICggKCBydWxlX19YRmVhdHVyZUNhbGxfX0dyb3VwXzFfMl9fMCApKiApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxOTI4NjoxOiAoICggKCBydWxlX19YRmVhdHVyZUNhbGxfX0dyb3VwXzFfMl9fMCApKiApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE5Mjg3OjE6ICggKCBydWxlX19YRmVhdHVyZUNhbGxfX0dyb3VwXzFfMl9fMCApKiApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNzk0OToxOiAoICggcnVsZV9fWEZlYXR1cmVDYWxsX19Hcm91cF8xXzJfXzAgKSogKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTc5NTA6MjogKCBydWxlX19YRmVhdHVyZUNhbGxfX0dyb3VwXzFfMl9fMCApKgorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTkyODc6MTogKCAoIHJ1bGVfX1hGZWF0dXJlQ2FsbF9fR3JvdXBfMV8yX18wICkqICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE5Mjg4OjI6ICggcnVsZV9fWEZlYXR1cmVDYWxsX19Hcm91cF8xXzJfXzAgKSoKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WEZlYXR1cmVDYWxsQWNjZXNzKCkuZ2V0R3JvdXBfMV8yKCkpOyAKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE3OTUxOjI6ICggcnVsZV9fWEZlYXR1cmVDYWxsX19Hcm91cF8xXzJfXzAgKSoKLSAgICAgICAgICAgIGxvb3AxNDI6CisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxOTI4OToyOiAoIHJ1bGVfX1hGZWF0dXJlQ2FsbF9fR3JvdXBfMV8yX18wICkqCisgICAgICAgICAgICBsb29wMTU1OgogICAgICAgICAgICAgZG8gewotICAgICAgICAgICAgICAgIGludCBhbHQxNDI9MjsKLSAgICAgICAgICAgICAgICBpbnQgTEExNDJfMCA9IGlucHV0LkxBKDEpOworICAgICAgICAgICAgICAgIGludCBhbHQxNTU9MjsKKyAgICAgICAgICAgICAgICBpbnQgTEExNTVfMCA9IGlucHV0LkxBKDEpOwogCi0gICAgICAgICAgICAgICAgaWYgKCAoTEExNDJfMD09MTE1KSApIHsKLSAgICAgICAgICAgICAgICAgICAgYWx0MTQyPTE7CisgICAgICAgICAgICAgICAgaWYgKCAoTEExNTVfMD09MTI1KSApIHsKKyAgICAgICAgICAgICAgICAgICAgYWx0MTU1PTE7CiAgICAgICAgICAgICAgICAgfQogCiAKLSAgICAgICAgICAgICAgICBzd2l0Y2ggKGFsdDE0MikgeworICAgICAgICAgICAgICAgIHN3aXRjaCAoYWx0MTU1KSB7CiAgICAgICAgICAgICAJY2FzZSAxIDoKLSAgICAgICAgICAgIAkgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTc5NTE6MzogcnVsZV9fWEZlYXR1cmVDYWxsX19Hcm91cF8xXzJfXzAKKyAgICAgICAgICAgIAkgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTkyODk6MzogcnVsZV9fWEZlYXR1cmVDYWxsX19Hcm91cF8xXzJfXzAKICAgICAgICAgICAgIAkgICAgewotICAgICAgICAgICAgCSAgICBwdXNoRm9sbG93KEZPTExPV183Myk7CisgICAgICAgICAgICAJICAgIHB1c2hGb2xsb3coRk9MTE9XXzgxKTsKICAgICAgICAgICAgIAkgICAgcnVsZV9fWEZlYXR1cmVDYWxsX19Hcm91cF8xXzJfXzAoKTsKIAogICAgICAgICAgICAgCSAgICBzdGF0ZS5fZnNwLS07CkBAIC01OTIyNiw3ICs2MzY4Myw3IEBACiAgICAgICAgICAgICAJICAgIGJyZWFrOwogCiAgICAgICAgICAgICAJZGVmYXVsdCA6Ci0gICAgICAgICAgICAJICAgIGJyZWFrIGxvb3AxNDI7CisgICAgICAgICAgICAJICAgIGJyZWFrIGxvb3AxNTU7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfSB3aGlsZSAodHJ1ZSk7CiAKQEAgLTU5MjU1LDE0ICs2MzcxMiwxNCBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX1hGZWF0dXJlQ2FsbF9fR3JvdXBfMV9fMyIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNzk1OToxOiBydWxlX19YRmVhdHVyZUNhbGxfX0dyb3VwXzFfXzMgOiBydWxlX19YRmVhdHVyZUNhbGxfX0dyb3VwXzFfXzNfX0ltcGwgOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE5Mjk3OjE6IHJ1bGVfX1hGZWF0dXJlQ2FsbF9fR3JvdXBfMV9fMyA6IHJ1bGVfX1hGZWF0dXJlQ2FsbF9fR3JvdXBfMV9fM19fSW1wbCA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fWEZlYXR1cmVDYWxsX19Hcm91cF8xX18zKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE3OTYzOjE6ICggcnVsZV9fWEZlYXR1cmVDYWxsX19Hcm91cF8xX18zX19JbXBsICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE3OTY0OjI6IHJ1bGVfX1hGZWF0dXJlQ2FsbF9fR3JvdXBfMV9fM19fSW1wbAorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTkzMDE6MTogKCBydWxlX19YRmVhdHVyZUNhbGxfX0dyb3VwXzFfXzNfX0ltcGwgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTkzMDI6MjogcnVsZV9fWEZlYXR1cmVDYWxsX19Hcm91cF8xX18zX19JbXBsCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV18yKTsKICAgICAgICAgICAgIHJ1bGVfX1hGZWF0dXJlQ2FsbF9fR3JvdXBfMV9fM19fSW1wbCgpOwpAQCAtNTkyODgsMTcgKzYzNzQ1LDE3IEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fWEZlYXR1cmVDYWxsX19Hcm91cF8xX18zX19JbXBsIgotICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE3OTcwOjE6IHJ1bGVfX1hGZWF0dXJlQ2FsbF9fR3JvdXBfMV9fM19fSW1wbCA6ICggJz4nICkgOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE5MzA4OjE6IHJ1bGVfX1hGZWF0dXJlQ2FsbF9fR3JvdXBfMV9fM19fSW1wbCA6ICggJz4nICkgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1hGZWF0dXJlQ2FsbF9fR3JvdXBfMV9fM19fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNzk3NDoxOiAoICggJz4nICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTc5NzU6MTogKCAnPicgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTkzMTI6MTogKCAoICc+JyApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE5MzEzOjE6ICggJz4nICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE3OTc1OjE6ICggJz4nICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE3OTc2OjI6ICc+JworICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTkzMTM6MTogKCAnPicgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTkzMTQ6MjogJz4nCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhGZWF0dXJlQ2FsbEFjY2VzcygpLmdldEdyZWF0ZXJUaGFuU2lnbktleXdvcmRfMV8zKCkpOyAKQEAgLTU5MzI5LDE2ICs2Mzc4NiwxNiBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX1hGZWF0dXJlQ2FsbF9fR3JvdXBfMV8yX18wIgotICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE3OTg2OjE6IHJ1bGVfX1hGZWF0dXJlQ2FsbF9fR3JvdXBfMV8yX18wIDogcnVsZV9fWEZlYXR1cmVDYWxsX19Hcm91cF8xXzJfXzBfX0ltcGwgcnVsZV9fWEZlYXR1cmVDYWxsX19Hcm91cF8xXzJfXzEgOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE5MzI0OjE6IHJ1bGVfX1hGZWF0dXJlQ2FsbF9fR3JvdXBfMV8yX18wIDogcnVsZV9fWEZlYXR1cmVDYWxsX19Hcm91cF8xXzJfXzBfX0ltcGwgcnVsZV9fWEZlYXR1cmVDYWxsX19Hcm91cF8xXzJfXzEgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1hGZWF0dXJlQ2FsbF9fR3JvdXBfMV8yX18wKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE3OTkwOjE6ICggcnVsZV9fWEZlYXR1cmVDYWxsX19Hcm91cF8xXzJfXzBfX0ltcGwgcnVsZV9fWEZlYXR1cmVDYWxsX19Hcm91cF8xXzJfXzEgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTc5OTE6MjogcnVsZV9fWEZlYXR1cmVDYWxsX19Hcm91cF8xXzJfXzBfX0ltcGwgcnVsZV9fWEZlYXR1cmVDYWxsX19Hcm91cF8xXzJfXzEKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE5MzI4OjE6ICggcnVsZV9fWEZlYXR1cmVDYWxsX19Hcm91cF8xXzJfXzBfX0ltcGwgcnVsZV9fWEZlYXR1cmVDYWxsX19Hcm91cF8xXzJfXzEgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTkzMjk6MjogcnVsZV9fWEZlYXR1cmVDYWxsX19Hcm91cF8xXzJfXzBfX0ltcGwgcnVsZV9fWEZlYXR1cmVDYWxsX19Hcm91cF8xXzJfXzEKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzExMCk7CisgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV18xMTgpOwogICAgICAgICAgICAgcnVsZV9fWEZlYXR1cmVDYWxsX19Hcm91cF8xXzJfXzBfX0ltcGwoKTsKIAogICAgICAgICAgICAgc3RhdGUuX2ZzcC0tOwpAQCAtNTkzNjcsMjIgKzYzODI0LDIyIEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fWEZlYXR1cmVDYWxsX19Hcm91cF8xXzJfXzBfX0ltcGwiCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTc5OTg6MTogcnVsZV9fWEZlYXR1cmVDYWxsX19Hcm91cF8xXzJfXzBfX0ltcGwgOiAoICcsJyApIDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxOTMzNjoxOiBydWxlX19YRmVhdHVyZUNhbGxfX0dyb3VwXzFfMl9fMF9fSW1wbCA6ICggJywnICkgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1hGZWF0dXJlQ2FsbF9fR3JvdXBfMV8yX18wX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE4MDAyOjE6ICggKCAnLCcgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxODAwMzoxOiAoICcsJyApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxOTM0MDoxOiAoICggJywnICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTkzNDE6MTogKCAnLCcgKQogICAgICAgICAgICAgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTgwMDM6MTogKCAnLCcgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTgwMDQ6MjogJywnCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxOTM0MToxOiAoICcsJyApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxOTM0MjoyOiAnLCcKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WEZlYXR1cmVDYWxsQWNjZXNzKCkuZ2V0Q29tbWFLZXl3b3JkXzFfMl8wKCkpOyAKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1hdGNoKGlucHV0LDExNSxGT0xMT1dfMik7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CisgICAgICAgICAgICBtYXRjaChpbnB1dCwxMjUsRk9MTE9XXzIpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOwogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBhZnRlcihncmFtbWFyQWNjZXNzLmdldFhGZWF0dXJlQ2FsbEFjY2VzcygpLmdldENvbW1hS2V5d29yZF8xXzJfMCgpKTsgCiAgICAgICAgICAgICB9CkBAIC01OTQwOCwxNCArNjM4NjUsMTQgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YRmVhdHVyZUNhbGxfX0dyb3VwXzFfMl9fMSIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxODAxMzoxOiBydWxlX19YRmVhdHVyZUNhbGxfX0dyb3VwXzFfMl9fMSA6IHJ1bGVfX1hGZWF0dXJlQ2FsbF9fR3JvdXBfMV8yX18xX19JbXBsIDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxOTM1MToxOiBydWxlX19YRmVhdHVyZUNhbGxfX0dyb3VwXzFfMl9fMSA6IHJ1bGVfX1hGZWF0dXJlQ2FsbF9fR3JvdXBfMV8yX18xX19JbXBsIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YRmVhdHVyZUNhbGxfX0dyb3VwXzFfMl9fMSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxODAxNzoxOiAoIHJ1bGVfX1hGZWF0dXJlQ2FsbF9fR3JvdXBfMV8yX18xX19JbXBsICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE4MDE4OjI6IHJ1bGVfX1hGZWF0dXJlQ2FsbF9fR3JvdXBfMV8yX18xX19JbXBsCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxOTM1NToxOiAoIHJ1bGVfX1hGZWF0dXJlQ2FsbF9fR3JvdXBfMV8yX18xX19JbXBsICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE5MzU2OjI6IHJ1bGVfX1hGZWF0dXJlQ2FsbF9fR3JvdXBfMV8yX18xX19JbXBsCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV18yKTsKICAgICAgICAgICAgIHJ1bGVfX1hGZWF0dXJlQ2FsbF9fR3JvdXBfMV8yX18xX19JbXBsKCk7CkBAIC01OTQ0MSwyMyArNjM4OTgsMjMgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YRmVhdHVyZUNhbGxfX0dyb3VwXzFfMl9fMV9fSW1wbCIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxODAyNDoxOiBydWxlX19YRmVhdHVyZUNhbGxfX0dyb3VwXzFfMl9fMV9fSW1wbCA6ICggKCBydWxlX19YRmVhdHVyZUNhbGxfX1R5cGVBcmd1bWVudHNBc3NpZ25tZW50XzFfMl8xICkgKSA7CisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTkzNjI6MTogcnVsZV9fWEZlYXR1cmVDYWxsX19Hcm91cF8xXzJfXzFfX0ltcGwgOiAoICggcnVsZV9fWEZlYXR1cmVDYWxsX19UeXBlQXJndW1lbnRzQXNzaWdubWVudF8xXzJfMSApICkgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1hGZWF0dXJlQ2FsbF9fR3JvdXBfMV8yX18xX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE4MDI4OjE6ICggKCAoIHJ1bGVfX1hGZWF0dXJlQ2FsbF9fVHlwZUFyZ3VtZW50c0Fzc2lnbm1lbnRfMV8yXzEgKSApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE4MDI5OjE6ICggKCBydWxlX19YRmVhdHVyZUNhbGxfX1R5cGVBcmd1bWVudHNBc3NpZ25tZW50XzFfMl8xICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTkzNjY6MTogKCAoICggcnVsZV9fWEZlYXR1cmVDYWxsX19UeXBlQXJndW1lbnRzQXNzaWdubWVudF8xXzJfMSApICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTkzNjc6MTogKCAoIHJ1bGVfX1hGZWF0dXJlQ2FsbF9fVHlwZUFyZ3VtZW50c0Fzc2lnbm1lbnRfMV8yXzEgKSApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxODAyOToxOiAoICggcnVsZV9fWEZlYXR1cmVDYWxsX19UeXBlQXJndW1lbnRzQXNzaWdubWVudF8xXzJfMSApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE4MDMwOjI6ICggcnVsZV9fWEZlYXR1cmVDYWxsX19UeXBlQXJndW1lbnRzQXNzaWdubWVudF8xXzJfMSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxOTM2NzoxOiAoICggcnVsZV9fWEZlYXR1cmVDYWxsX19UeXBlQXJndW1lbnRzQXNzaWdubWVudF8xXzJfMSApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE5MzY4OjI6ICggcnVsZV9fWEZlYXR1cmVDYWxsX19UeXBlQXJndW1lbnRzQXNzaWdubWVudF8xXzJfMSApCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhGZWF0dXJlQ2FsbEFjY2VzcygpLmdldFR5cGVBcmd1bWVudHNBc3NpZ25tZW50XzFfMl8xKCkpOyAKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE4MDMxOjI6ICggcnVsZV9fWEZlYXR1cmVDYWxsX19UeXBlQXJndW1lbnRzQXNzaWdubWVudF8xXzJfMSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxODAzMTozOiBydWxlX19YRmVhdHVyZUNhbGxfX1R5cGVBcmd1bWVudHNBc3NpZ25tZW50XzFfMl8xCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxOTM2OToyOiAoIHJ1bGVfX1hGZWF0dXJlQ2FsbF9fVHlwZUFyZ3VtZW50c0Fzc2lnbm1lbnRfMV8yXzEgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTkzNjk6MzogcnVsZV9fWEZlYXR1cmVDYWxsX19UeXBlQXJndW1lbnRzQXNzaWdubWVudF8xXzJfMQogICAgICAgICAgICAgewogICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMik7CiAgICAgICAgICAgICBydWxlX19YRmVhdHVyZUNhbGxfX1R5cGVBcmd1bWVudHNBc3NpZ25tZW50XzFfMl8xKCk7CkBAIC01OTQ5MiwxNiArNjM5NDksMTYgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YRmVhdHVyZUNhbGxfX0dyb3VwXzNfXzAiCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTgwNDA6MTogcnVsZV9fWEZlYXR1cmVDYWxsX19Hcm91cF8zX18wIDogcnVsZV9fWEZlYXR1cmVDYWxsX19Hcm91cF8zX18wX19JbXBsIHJ1bGVfX1hGZWF0dXJlQ2FsbF9fR3JvdXBfM19fMSA7CisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTkzNzg6MTogcnVsZV9fWEZlYXR1cmVDYWxsX19Hcm91cF8zX18wIDogcnVsZV9fWEZlYXR1cmVDYWxsX19Hcm91cF8zX18wX19JbXBsIHJ1bGVfX1hGZWF0dXJlQ2FsbF9fR3JvdXBfM19fMSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fWEZlYXR1cmVDYWxsX19Hcm91cF8zX18wKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE4MDQ0OjE6ICggcnVsZV9fWEZlYXR1cmVDYWxsX19Hcm91cF8zX18wX19JbXBsIHJ1bGVfX1hGZWF0dXJlQ2FsbF9fR3JvdXBfM19fMSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxODA0NToyOiBydWxlX19YRmVhdHVyZUNhbGxfX0dyb3VwXzNfXzBfX0ltcGwgcnVsZV9fWEZlYXR1cmVDYWxsX19Hcm91cF8zX18xCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxOTM4MjoxOiAoIHJ1bGVfX1hGZWF0dXJlQ2FsbF9fR3JvdXBfM19fMF9fSW1wbCBydWxlX19YRmVhdHVyZUNhbGxfX0dyb3VwXzNfXzEgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTkzODM6MjogcnVsZV9fWEZlYXR1cmVDYWxsX19Hcm91cF8zX18wX19JbXBsIHJ1bGVfX1hGZWF0dXJlQ2FsbF9fR3JvdXBfM19fMQogICAgICAgICAgICAgewotICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMTEyKTsKKyAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzEyMCk7CiAgICAgICAgICAgICBydWxlX19YRmVhdHVyZUNhbGxfX0dyb3VwXzNfXzBfX0ltcGwoKTsKIAogICAgICAgICAgICAgc3RhdGUuX2ZzcC0tOwpAQCAtNTk1MzAsMjMgKzYzOTg3LDIzIEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fWEZlYXR1cmVDYWxsX19Hcm91cF8zX18wX19JbXBsIgotICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE4MDUyOjE6IHJ1bGVfX1hGZWF0dXJlQ2FsbF9fR3JvdXBfM19fMF9fSW1wbCA6ICggKCBydWxlX19YRmVhdHVyZUNhbGxfX0V4cGxpY2l0T3BlcmF0aW9uQ2FsbEFzc2lnbm1lbnRfM18wICkgKSA7CisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTkzOTA6MTogcnVsZV9fWEZlYXR1cmVDYWxsX19Hcm91cF8zX18wX19JbXBsIDogKCAoIHJ1bGVfX1hGZWF0dXJlQ2FsbF9fRXhwbGljaXRPcGVyYXRpb25DYWxsQXNzaWdubWVudF8zXzAgKSApIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YRmVhdHVyZUNhbGxfX0dyb3VwXzNfXzBfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTgwNTY6MTogKCAoICggcnVsZV9fWEZlYXR1cmVDYWxsX19FeHBsaWNpdE9wZXJhdGlvbkNhbGxBc3NpZ25tZW50XzNfMCApICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTgwNTc6MTogKCAoIHJ1bGVfX1hGZWF0dXJlQ2FsbF9fRXhwbGljaXRPcGVyYXRpb25DYWxsQXNzaWdubWVudF8zXzAgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxOTM5NDoxOiAoICggKCBydWxlX19YRmVhdHVyZUNhbGxfX0V4cGxpY2l0T3BlcmF0aW9uQ2FsbEFzc2lnbm1lbnRfM18wICkgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxOTM5NToxOiAoICggcnVsZV9fWEZlYXR1cmVDYWxsX19FeHBsaWNpdE9wZXJhdGlvbkNhbGxBc3NpZ25tZW50XzNfMCApICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE4MDU3OjE6ICggKCBydWxlX19YRmVhdHVyZUNhbGxfX0V4cGxpY2l0T3BlcmF0aW9uQ2FsbEFzc2lnbm1lbnRfM18wICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTgwNTg6MjogKCBydWxlX19YRmVhdHVyZUNhbGxfX0V4cGxpY2l0T3BlcmF0aW9uQ2FsbEFzc2lnbm1lbnRfM18wICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE5Mzk1OjE6ICggKCBydWxlX19YRmVhdHVyZUNhbGxfX0V4cGxpY2l0T3BlcmF0aW9uQ2FsbEFzc2lnbm1lbnRfM18wICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTkzOTY6MjogKCBydWxlX19YRmVhdHVyZUNhbGxfX0V4cGxpY2l0T3BlcmF0aW9uQ2FsbEFzc2lnbm1lbnRfM18wICkKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WEZlYXR1cmVDYWxsQWNjZXNzKCkuZ2V0RXhwbGljaXRPcGVyYXRpb25DYWxsQXNzaWdubWVudF8zXzAoKSk7IAogICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTgwNTk6MjogKCBydWxlX19YRmVhdHVyZUNhbGxfX0V4cGxpY2l0T3BlcmF0aW9uQ2FsbEFzc2lnbm1lbnRfM18wICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE4MDU5OjM6IHJ1bGVfX1hGZWF0dXJlQ2FsbF9fRXhwbGljaXRPcGVyYXRpb25DYWxsQXNzaWdubWVudF8zXzAKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE5Mzk3OjI6ICggcnVsZV9fWEZlYXR1cmVDYWxsX19FeHBsaWNpdE9wZXJhdGlvbkNhbGxBc3NpZ25tZW50XzNfMCApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxOTM5NzozOiBydWxlX19YRmVhdHVyZUNhbGxfX0V4cGxpY2l0T3BlcmF0aW9uQ2FsbEFzc2lnbm1lbnRfM18wCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV18yKTsKICAgICAgICAgICAgIHJ1bGVfX1hGZWF0dXJlQ2FsbF9fRXhwbGljaXRPcGVyYXRpb25DYWxsQXNzaWdubWVudF8zXzAoKTsKQEAgLTU5NTgxLDE2ICs2NDAzOCwxNiBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX1hGZWF0dXJlQ2FsbF9fR3JvdXBfM19fMSIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxODA2NzoxOiBydWxlX19YRmVhdHVyZUNhbGxfX0dyb3VwXzNfXzEgOiBydWxlX19YRmVhdHVyZUNhbGxfX0dyb3VwXzNfXzFfX0ltcGwgcnVsZV9fWEZlYXR1cmVDYWxsX19Hcm91cF8zX18yIDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxOTQwNToxOiBydWxlX19YRmVhdHVyZUNhbGxfX0dyb3VwXzNfXzEgOiBydWxlX19YRmVhdHVyZUNhbGxfX0dyb3VwXzNfXzFfX0ltcGwgcnVsZV9fWEZlYXR1cmVDYWxsX19Hcm91cF8zX18yIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YRmVhdHVyZUNhbGxfX0dyb3VwXzNfXzEoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTgwNzE6MTogKCBydWxlX19YRmVhdHVyZUNhbGxfX0dyb3VwXzNfXzFfX0ltcGwgcnVsZV9fWEZlYXR1cmVDYWxsX19Hcm91cF8zX18yICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE4MDcyOjI6IHJ1bGVfX1hGZWF0dXJlQ2FsbF9fR3JvdXBfM19fMV9fSW1wbCBydWxlX19YRmVhdHVyZUNhbGxfX0dyb3VwXzNfXzIKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE5NDA5OjE6ICggcnVsZV9fWEZlYXR1cmVDYWxsX19Hcm91cF8zX18xX19JbXBsIHJ1bGVfX1hGZWF0dXJlQ2FsbF9fR3JvdXBfM19fMiApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxOTQxMDoyOiBydWxlX19YRmVhdHVyZUNhbGxfX0dyb3VwXzNfXzFfX0ltcGwgcnVsZV9fWEZlYXR1cmVDYWxsX19Hcm91cF8zX18yCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV18xMTIpOworICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMTIwKTsKICAgICAgICAgICAgIHJ1bGVfX1hGZWF0dXJlQ2FsbF9fR3JvdXBfM19fMV9fSW1wbCgpOwogCiAgICAgICAgICAgICBzdGF0ZS5fZnNwLS07CkBAIC01OTYxOSwzMSArNjQwNzYsMzEgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YRmVhdHVyZUNhbGxfX0dyb3VwXzNfXzFfX0ltcGwiCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTgwNzk6MTogcnVsZV9fWEZlYXR1cmVDYWxsX19Hcm91cF8zX18xX19JbXBsIDogKCAoIHJ1bGVfX1hGZWF0dXJlQ2FsbF9fQWx0ZXJuYXRpdmVzXzNfMSApPyApIDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxOTQxNzoxOiBydWxlX19YRmVhdHVyZUNhbGxfX0dyb3VwXzNfXzFfX0ltcGwgOiAoICggcnVsZV9fWEZlYXR1cmVDYWxsX19BbHRlcm5hdGl2ZXNfM18xICk/ICkgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1hGZWF0dXJlQ2FsbF9fR3JvdXBfM19fMV9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxODA4MzoxOiAoICggKCBydWxlX19YRmVhdHVyZUNhbGxfX0FsdGVybmF0aXZlc18zXzEgKT8gKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxODA4NDoxOiAoICggcnVsZV9fWEZlYXR1cmVDYWxsX19BbHRlcm5hdGl2ZXNfM18xICk/ICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE5NDIxOjE6ICggKCAoIHJ1bGVfX1hGZWF0dXJlQ2FsbF9fQWx0ZXJuYXRpdmVzXzNfMSApPyApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE5NDIyOjE6ICggKCBydWxlX19YRmVhdHVyZUNhbGxfX0FsdGVybmF0aXZlc18zXzEgKT8gKQogICAgICAgICAgICAgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTgwODQ6MTogKCAoIHJ1bGVfX1hGZWF0dXJlQ2FsbF9fQWx0ZXJuYXRpdmVzXzNfMSApPyApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxODA4NToyOiAoIHJ1bGVfX1hGZWF0dXJlQ2FsbF9fQWx0ZXJuYXRpdmVzXzNfMSApPworICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTk0MjI6MTogKCAoIHJ1bGVfX1hGZWF0dXJlQ2FsbF9fQWx0ZXJuYXRpdmVzXzNfMSApPyApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxOTQyMzoyOiAoIHJ1bGVfX1hGZWF0dXJlQ2FsbF9fQWx0ZXJuYXRpdmVzXzNfMSApPwogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYRmVhdHVyZUNhbGxBY2Nlc3MoKS5nZXRBbHRlcm5hdGl2ZXNfM18xKCkpOyAKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE4MDg2OjI6ICggcnVsZV9fWEZlYXR1cmVDYWxsX19BbHRlcm5hdGl2ZXNfM18xICk/Ci0gICAgICAgICAgICBpbnQgYWx0MTQzPTI7Ci0gICAgICAgICAgICBpbnQgTEExNDNfMCA9IGlucHV0LkxBKDEpOworICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTk0MjQ6MjogKCBydWxlX19YRmVhdHVyZUNhbGxfX0FsdGVybmF0aXZlc18zXzEgKT8KKyAgICAgICAgICAgIGludCBhbHQxNTY9MjsKKyAgICAgICAgICAgIGludCBMQTE1Nl8wID0gaW5wdXQuTEEoMSk7CiAKLSAgICAgICAgICAgIGlmICggKChMQTE0M18wPj1SVUxFX1NUUklORyAmJiBMQTE0M18wPD1SVUxFX0RFQ0lNQUwpfHxMQTE0M18wPT0yN3x8TEExNDNfMD09MzF8fChMQTE0M18wPj0zNCAmJiBMQTE0M18wPD0zNSl8fExBMTQzXzA9PTQwfHwoTEExNDNfMD49NDUgJiYgTEExNDNfMDw9NTApfHxMQTE0M18wPT03MHx8TEExNDNfMD09OTV8fExBMTQzXzA9PTExM3x8KExBMTQzXzA+PTExNyAmJiBMQTE0M18wPD0xMTgpfHxMQTE0M18wPT0xMjB8fExBMTQzXzA9PTEyMnx8KExBMTQzXzA+PTEyNiAmJiBMQTE0M18wPD0xMzMpfHxMQTE0M18wPT0xMzV8fExBMTQzXzA9PTE1Mnx8TEExNDNfMD09MTU0KSApIHsKLSAgICAgICAgICAgICAgICBhbHQxNDM9MTsKKyAgICAgICAgICAgIGlmICggKChMQTE1Nl8wPj1SVUxFX1NUUklORyAmJiBMQTE1Nl8wPD1SVUxFX0RFQ0lNQUwpfHxMQTE1Nl8wPT0yN3x8TEExNTZfMD09MzF8fChMQTE1Nl8wPj0zNCAmJiBMQTE1Nl8wPD0zNSl8fExBMTU2XzA9PTQwfHwoTEExNTZfMD49NDUgJiYgTEExNTZfMDw9NTApfHxMQTE1Nl8wPT03NXx8TEExNTZfMD09MTAyfHxMQTE1Nl8wPT0xMjN8fChMQTE1Nl8wPj0xMjcgJiYgTEExNTZfMDw9MTI4KXx8TEExNTZfMD09MTMwfHxMQTE1Nl8wPT0xMzJ8fChMQTE1Nl8wPj0xMzYgJiYgTEExNTZfMDw9MTQzKXx8TEExNTZfMD09MTQ1fHxMQTE1Nl8wPT0xNjR8fExBMTU2XzA9PTE2NikgKSB7CisgICAgICAgICAgICAgICAgYWx0MTU2PTE7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBzd2l0Y2ggKGFsdDE0MykgeworICAgICAgICAgICAgc3dpdGNoIChhbHQxNTYpIHsKICAgICAgICAgICAgICAgICBjYXNlIDEgOgotICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxODA4NjozOiBydWxlX19YRmVhdHVyZUNhbGxfX0FsdGVybmF0aXZlc18zXzEKKyAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTk0MjQ6MzogcnVsZV9fWEZlYXR1cmVDYWxsX19BbHRlcm5hdGl2ZXNfM18xCiAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMik7CiAgICAgICAgICAgICAgICAgICAgIHJ1bGVfX1hGZWF0dXJlQ2FsbF9fQWx0ZXJuYXRpdmVzXzNfMSgpOwpAQCAtNTk2ODEsMTQgKzY0MTM4LDE0IEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fWEZlYXR1cmVDYWxsX19Hcm91cF8zX18yIgotICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE4MDk0OjE6IHJ1bGVfX1hGZWF0dXJlQ2FsbF9fR3JvdXBfM19fMiA6IHJ1bGVfX1hGZWF0dXJlQ2FsbF9fR3JvdXBfM19fMl9fSW1wbCA7CisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTk0MzI6MTogcnVsZV9fWEZlYXR1cmVDYWxsX19Hcm91cF8zX18yIDogcnVsZV9fWEZlYXR1cmVDYWxsX19Hcm91cF8zX18yX19JbXBsIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YRmVhdHVyZUNhbGxfX0dyb3VwXzNfXzIoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTgwOTg6MTogKCBydWxlX19YRmVhdHVyZUNhbGxfX0dyb3VwXzNfXzJfX0ltcGwgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTgwOTk6MjogcnVsZV9fWEZlYXR1cmVDYWxsX19Hcm91cF8zX18yX19JbXBsCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxOTQzNjoxOiAoIHJ1bGVfX1hGZWF0dXJlQ2FsbF9fR3JvdXBfM19fMl9fSW1wbCApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxOTQzNzoyOiBydWxlX19YRmVhdHVyZUNhbGxfX0dyb3VwXzNfXzJfX0ltcGwKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzIpOwogICAgICAgICAgICAgcnVsZV9fWEZlYXR1cmVDYWxsX19Hcm91cF8zX18yX19JbXBsKCk7CkBAIC01OTcxNCwyMiArNjQxNzEsMjIgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YRmVhdHVyZUNhbGxfX0dyb3VwXzNfXzJfX0ltcGwiCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTgxMDU6MTogcnVsZV9fWEZlYXR1cmVDYWxsX19Hcm91cF8zX18yX19JbXBsIDogKCAnKScgKSA7CisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTk0NDM6MTogcnVsZV9fWEZlYXR1cmVDYWxsX19Hcm91cF8zX18yX19JbXBsIDogKCAnKScgKSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fWEZlYXR1cmVDYWxsX19Hcm91cF8zX18yX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE4MTA5OjE6ICggKCAnKScgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxODExMDoxOiAoICcpJyApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxOTQ0NzoxOiAoICggJyknICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTk0NDg6MTogKCAnKScgKQogICAgICAgICAgICAgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTgxMTA6MTogKCAnKScgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTgxMTE6MjogJyknCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxOTQ0ODoxOiAoICcpJyApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxOTQ0OToyOiAnKScKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WEZlYXR1cmVDYWxsQWNjZXNzKCkuZ2V0UmlnaHRQYXJlbnRoZXNpc0tleXdvcmRfM18yKCkpOyAKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1hdGNoKGlucHV0LDExNCxGT0xMT1dfMik7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CisgICAgICAgICAgICBtYXRjaChpbnB1dCwxMjQsRk9MTE9XXzIpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOwogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBhZnRlcihncmFtbWFyQWNjZXNzLmdldFhGZWF0dXJlQ2FsbEFjY2VzcygpLmdldFJpZ2h0UGFyZW50aGVzaXNLZXl3b3JkXzNfMigpKTsgCiAgICAgICAgICAgICB9CkBAIC01OTc1NSwxNiArNjQyMTIsMTYgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YRmVhdHVyZUNhbGxfX0dyb3VwXzNfMV8xX18wIgotICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE4MTIxOjE6IHJ1bGVfX1hGZWF0dXJlQ2FsbF9fR3JvdXBfM18xXzFfXzAgOiBydWxlX19YRmVhdHVyZUNhbGxfX0dyb3VwXzNfMV8xX18wX19JbXBsIHJ1bGVfX1hGZWF0dXJlQ2FsbF9fR3JvdXBfM18xXzFfXzEgOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE5NDU5OjE6IHJ1bGVfX1hGZWF0dXJlQ2FsbF9fR3JvdXBfM18xXzFfXzAgOiBydWxlX19YRmVhdHVyZUNhbGxfX0dyb3VwXzNfMV8xX18wX19JbXBsIHJ1bGVfX1hGZWF0dXJlQ2FsbF9fR3JvdXBfM18xXzFfXzEgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1hGZWF0dXJlQ2FsbF9fR3JvdXBfM18xXzFfXzAoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTgxMjU6MTogKCBydWxlX19YRmVhdHVyZUNhbGxfX0dyb3VwXzNfMV8xX18wX19JbXBsIHJ1bGVfX1hGZWF0dXJlQ2FsbF9fR3JvdXBfM18xXzFfXzEgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTgxMjY6MjogcnVsZV9fWEZlYXR1cmVDYWxsX19Hcm91cF8zXzFfMV9fMF9fSW1wbCBydWxlX19YRmVhdHVyZUNhbGxfX0dyb3VwXzNfMV8xX18xCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxOTQ2MzoxOiAoIHJ1bGVfX1hGZWF0dXJlQ2FsbF9fR3JvdXBfM18xXzFfXzBfX0ltcGwgcnVsZV9fWEZlYXR1cmVDYWxsX19Hcm91cF8zXzFfMV9fMSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxOTQ2NDoyOiBydWxlX19YRmVhdHVyZUNhbGxfX0dyb3VwXzNfMV8xX18wX19JbXBsIHJ1bGVfX1hGZWF0dXJlQ2FsbF9fR3JvdXBfM18xXzFfXzEKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzcyKTsKKyAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzgwKTsKICAgICAgICAgICAgIHJ1bGVfX1hGZWF0dXJlQ2FsbF9fR3JvdXBfM18xXzFfXzBfX0ltcGwoKTsKIAogICAgICAgICAgICAgc3RhdGUuX2ZzcC0tOwpAQCAtNTk3OTMsMjMgKzY0MjUwLDIzIEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fWEZlYXR1cmVDYWxsX19Hcm91cF8zXzFfMV9fMF9fSW1wbCIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxODEzMzoxOiBydWxlX19YRmVhdHVyZUNhbGxfX0dyb3VwXzNfMV8xX18wX19JbXBsIDogKCAoIHJ1bGVfX1hGZWF0dXJlQ2FsbF9fRmVhdHVyZUNhbGxBcmd1bWVudHNBc3NpZ25tZW50XzNfMV8xXzAgKSApIDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxOTQ3MToxOiBydWxlX19YRmVhdHVyZUNhbGxfX0dyb3VwXzNfMV8xX18wX19JbXBsIDogKCAoIHJ1bGVfX1hGZWF0dXJlQ2FsbF9fRmVhdHVyZUNhbGxBcmd1bWVudHNBc3NpZ25tZW50XzNfMV8xXzAgKSApIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YRmVhdHVyZUNhbGxfX0dyb3VwXzNfMV8xX18wX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE4MTM3OjE6ICggKCAoIHJ1bGVfX1hGZWF0dXJlQ2FsbF9fRmVhdHVyZUNhbGxBcmd1bWVudHNBc3NpZ25tZW50XzNfMV8xXzAgKSApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE4MTM4OjE6ICggKCBydWxlX19YRmVhdHVyZUNhbGxfX0ZlYXR1cmVDYWxsQXJndW1lbnRzQXNzaWdubWVudF8zXzFfMV8wICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTk0NzU6MTogKCAoICggcnVsZV9fWEZlYXR1cmVDYWxsX19GZWF0dXJlQ2FsbEFyZ3VtZW50c0Fzc2lnbm1lbnRfM18xXzFfMCApICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTk0NzY6MTogKCAoIHJ1bGVfX1hGZWF0dXJlQ2FsbF9fRmVhdHVyZUNhbGxBcmd1bWVudHNBc3NpZ25tZW50XzNfMV8xXzAgKSApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxODEzODoxOiAoICggcnVsZV9fWEZlYXR1cmVDYWxsX19GZWF0dXJlQ2FsbEFyZ3VtZW50c0Fzc2lnbm1lbnRfM18xXzFfMCApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE4MTM5OjI6ICggcnVsZV9fWEZlYXR1cmVDYWxsX19GZWF0dXJlQ2FsbEFyZ3VtZW50c0Fzc2lnbm1lbnRfM18xXzFfMCApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxOTQ3NjoxOiAoICggcnVsZV9fWEZlYXR1cmVDYWxsX19GZWF0dXJlQ2FsbEFyZ3VtZW50c0Fzc2lnbm1lbnRfM18xXzFfMCApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE5NDc3OjI6ICggcnVsZV9fWEZlYXR1cmVDYWxsX19GZWF0dXJlQ2FsbEFyZ3VtZW50c0Fzc2lnbm1lbnRfM18xXzFfMCApCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhGZWF0dXJlQ2FsbEFjY2VzcygpLmdldEZlYXR1cmVDYWxsQXJndW1lbnRzQXNzaWdubWVudF8zXzFfMV8wKCkpOyAKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE4MTQwOjI6ICggcnVsZV9fWEZlYXR1cmVDYWxsX19GZWF0dXJlQ2FsbEFyZ3VtZW50c0Fzc2lnbm1lbnRfM18xXzFfMCApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxODE0MDozOiBydWxlX19YRmVhdHVyZUNhbGxfX0ZlYXR1cmVDYWxsQXJndW1lbnRzQXNzaWdubWVudF8zXzFfMV8wCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxOTQ3ODoyOiAoIHJ1bGVfX1hGZWF0dXJlQ2FsbF9fRmVhdHVyZUNhbGxBcmd1bWVudHNBc3NpZ25tZW50XzNfMV8xXzAgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTk0Nzg6MzogcnVsZV9fWEZlYXR1cmVDYWxsX19GZWF0dXJlQ2FsbEFyZ3VtZW50c0Fzc2lnbm1lbnRfM18xXzFfMAogICAgICAgICAgICAgewogICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMik7CiAgICAgICAgICAgICBydWxlX19YRmVhdHVyZUNhbGxfX0ZlYXR1cmVDYWxsQXJndW1lbnRzQXNzaWdubWVudF8zXzFfMV8wKCk7CkBAIC01OTg0NCwxNCArNjQzMDEsMTQgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YRmVhdHVyZUNhbGxfX0dyb3VwXzNfMV8xX18xIgotICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE4MTQ4OjE6IHJ1bGVfX1hGZWF0dXJlQ2FsbF9fR3JvdXBfM18xXzFfXzEgOiBydWxlX19YRmVhdHVyZUNhbGxfX0dyb3VwXzNfMV8xX18xX19JbXBsIDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxOTQ4NjoxOiBydWxlX19YRmVhdHVyZUNhbGxfX0dyb3VwXzNfMV8xX18xIDogcnVsZV9fWEZlYXR1cmVDYWxsX19Hcm91cF8zXzFfMV9fMV9fSW1wbCA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fWEZlYXR1cmVDYWxsX19Hcm91cF8zXzFfMV9fMSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxODE1MjoxOiAoIHJ1bGVfX1hGZWF0dXJlQ2FsbF9fR3JvdXBfM18xXzFfXzFfX0ltcGwgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTgxNTM6MjogcnVsZV9fWEZlYXR1cmVDYWxsX19Hcm91cF8zXzFfMV9fMV9fSW1wbAorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTk0OTA6MTogKCBydWxlX19YRmVhdHVyZUNhbGxfX0dyb3VwXzNfMV8xX18xX19JbXBsICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE5NDkxOjI6IHJ1bGVfX1hGZWF0dXJlQ2FsbF9fR3JvdXBfM18xXzFfXzFfX0ltcGwKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzIpOwogICAgICAgICAgICAgcnVsZV9fWEZlYXR1cmVDYWxsX19Hcm91cF8zXzFfMV9fMV9fSW1wbCgpOwpAQCAtNTk4NzcsMzcgKzY0MzM0LDM3IEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fWEZlYXR1cmVDYWxsX19Hcm91cF8zXzFfMV9fMV9fSW1wbCIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxODE1OToxOiBydWxlX19YRmVhdHVyZUNhbGxfX0dyb3VwXzNfMV8xX18xX19JbXBsIDogKCAoIHJ1bGVfX1hGZWF0dXJlQ2FsbF9fR3JvdXBfM18xXzFfMV9fMCApKiApIDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxOTQ5NzoxOiBydWxlX19YRmVhdHVyZUNhbGxfX0dyb3VwXzNfMV8xX18xX19JbXBsIDogKCAoIHJ1bGVfX1hGZWF0dXJlQ2FsbF9fR3JvdXBfM18xXzFfMV9fMCApKiApIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YRmVhdHVyZUNhbGxfX0dyb3VwXzNfMV8xX18xX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE4MTYzOjE6ICggKCAoIHJ1bGVfX1hGZWF0dXJlQ2FsbF9fR3JvdXBfM18xXzFfMV9fMCApKiApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE4MTY0OjE6ICggKCBydWxlX19YRmVhdHVyZUNhbGxfX0dyb3VwXzNfMV8xXzFfXzAgKSogKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTk1MDE6MTogKCAoICggcnVsZV9fWEZlYXR1cmVDYWxsX19Hcm91cF8zXzFfMV8xX18wICkqICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTk1MDI6MTogKCAoIHJ1bGVfX1hGZWF0dXJlQ2FsbF9fR3JvdXBfM18xXzFfMV9fMCApKiApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxODE2NDoxOiAoICggcnVsZV9fWEZlYXR1cmVDYWxsX19Hcm91cF8zXzFfMV8xX18wICkqICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE4MTY1OjI6ICggcnVsZV9fWEZlYXR1cmVDYWxsX19Hcm91cF8zXzFfMV8xX18wICkqCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxOTUwMjoxOiAoICggcnVsZV9fWEZlYXR1cmVDYWxsX19Hcm91cF8zXzFfMV8xX18wICkqICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE5NTAzOjI6ICggcnVsZV9fWEZlYXR1cmVDYWxsX19Hcm91cF8zXzFfMV8xX18wICkqCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhGZWF0dXJlQ2FsbEFjY2VzcygpLmdldEdyb3VwXzNfMV8xXzEoKSk7IAogICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTgxNjY6MjogKCBydWxlX19YRmVhdHVyZUNhbGxfX0dyb3VwXzNfMV8xXzFfXzAgKSoKLSAgICAgICAgICAgIGxvb3AxNDQ6CisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxOTUwNDoyOiAoIHJ1bGVfX1hGZWF0dXJlQ2FsbF9fR3JvdXBfM18xXzFfMV9fMCApKgorICAgICAgICAgICAgbG9vcDE1NzoKICAgICAgICAgICAgIGRvIHsKLSAgICAgICAgICAgICAgICBpbnQgYWx0MTQ0PTI7Ci0gICAgICAgICAgICAgICAgaW50IExBMTQ0XzAgPSBpbnB1dC5MQSgxKTsKKyAgICAgICAgICAgICAgICBpbnQgYWx0MTU3PTI7CisgICAgICAgICAgICAgICAgaW50IExBMTU3XzAgPSBpbnB1dC5MQSgxKTsKIAotICAgICAgICAgICAgICAgIGlmICggKExBMTQ0XzA9PTExNSkgKSB7Ci0gICAgICAgICAgICAgICAgICAgIGFsdDE0ND0xOworICAgICAgICAgICAgICAgIGlmICggKExBMTU3XzA9PTEyNSkgKSB7CisgICAgICAgICAgICAgICAgICAgIGFsdDE1Nz0xOwogICAgICAgICAgICAgICAgIH0KIAogCi0gICAgICAgICAgICAgICAgc3dpdGNoIChhbHQxNDQpIHsKKyAgICAgICAgICAgICAgICBzd2l0Y2ggKGFsdDE1NykgewogICAgICAgICAgICAgCWNhc2UgMSA6Ci0gICAgICAgICAgICAJICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE4MTY2OjM6IHJ1bGVfX1hGZWF0dXJlQ2FsbF9fR3JvdXBfM18xXzFfMV9fMAorICAgICAgICAgICAgCSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxOTUwNDozOiBydWxlX19YRmVhdHVyZUNhbGxfX0dyb3VwXzNfMV8xXzFfXzAKICAgICAgICAgICAgIAkgICAgewotICAgICAgICAgICAgCSAgICBwdXNoRm9sbG93KEZPTExPV183Myk7CisgICAgICAgICAgICAJICAgIHB1c2hGb2xsb3coRk9MTE9XXzgxKTsKICAgICAgICAgICAgIAkgICAgcnVsZV9fWEZlYXR1cmVDYWxsX19Hcm91cF8zXzFfMV8xX18wKCk7CiAKICAgICAgICAgICAgIAkgICAgc3RhdGUuX2ZzcC0tOwpAQCAtNTk5MTcsNyArNjQzNzQsNyBAQAogICAgICAgICAgICAgCSAgICBicmVhazsKIAogICAgICAgICAgICAgCWRlZmF1bHQgOgotICAgICAgICAgICAgCSAgICBicmVhayBsb29wMTQ0OworICAgICAgICAgICAgCSAgICBicmVhayBsb29wMTU3OwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0gd2hpbGUgKHRydWUpOwogCkBAIC01OTk0NiwxNiArNjQ0MDMsMTYgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YRmVhdHVyZUNhbGxfX0dyb3VwXzNfMV8xXzFfXzAiCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTgxNzU6MTogcnVsZV9fWEZlYXR1cmVDYWxsX19Hcm91cF8zXzFfMV8xX18wIDogcnVsZV9fWEZlYXR1cmVDYWxsX19Hcm91cF8zXzFfMV8xX18wX19JbXBsIHJ1bGVfX1hGZWF0dXJlQ2FsbF9fR3JvdXBfM18xXzFfMV9fMSA7CisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTk1MTM6MTogcnVsZV9fWEZlYXR1cmVDYWxsX19Hcm91cF8zXzFfMV8xX18wIDogcnVsZV9fWEZlYXR1cmVDYWxsX19Hcm91cF8zXzFfMV8xX18wX19JbXBsIHJ1bGVfX1hGZWF0dXJlQ2FsbF9fR3JvdXBfM18xXzFfMV9fMSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fWEZlYXR1cmVDYWxsX19Hcm91cF8zXzFfMV8xX18wKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE4MTc5OjE6ICggcnVsZV9fWEZlYXR1cmVDYWxsX19Hcm91cF8zXzFfMV8xX18wX19JbXBsIHJ1bGVfX1hGZWF0dXJlQ2FsbF9fR3JvdXBfM18xXzFfMV9fMSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxODE4MDoyOiBydWxlX19YRmVhdHVyZUNhbGxfX0dyb3VwXzNfMV8xXzFfXzBfX0ltcGwgcnVsZV9fWEZlYXR1cmVDYWxsX19Hcm91cF8zXzFfMV8xX18xCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxOTUxNzoxOiAoIHJ1bGVfX1hGZWF0dXJlQ2FsbF9fR3JvdXBfM18xXzFfMV9fMF9fSW1wbCBydWxlX19YRmVhdHVyZUNhbGxfX0dyb3VwXzNfMV8xXzFfXzEgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTk1MTg6MjogcnVsZV9fWEZlYXR1cmVDYWxsX19Hcm91cF8zXzFfMV8xX18wX19JbXBsIHJ1bGVfX1hGZWF0dXJlQ2FsbF9fR3JvdXBfM18xXzFfMV9fMQogICAgICAgICAgICAgewotICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfNzQpOworICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfODIpOwogICAgICAgICAgICAgcnVsZV9fWEZlYXR1cmVDYWxsX19Hcm91cF8zXzFfMV8xX18wX19JbXBsKCk7CiAKICAgICAgICAgICAgIHN0YXRlLl9mc3AtLTsKQEAgLTU5OTg0LDIyICs2NDQ0MSwyMiBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX1hGZWF0dXJlQ2FsbF9fR3JvdXBfM18xXzFfMV9fMF9fSW1wbCIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxODE4NzoxOiBydWxlX19YRmVhdHVyZUNhbGxfX0dyb3VwXzNfMV8xXzFfXzBfX0ltcGwgOiAoICcsJyApIDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxOTUyNToxOiBydWxlX19YRmVhdHVyZUNhbGxfX0dyb3VwXzNfMV8xXzFfXzBfX0ltcGwgOiAoICcsJyApIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YRmVhdHVyZUNhbGxfX0dyb3VwXzNfMV8xXzFfXzBfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTgxOTE6MTogKCAoICcsJyApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE4MTkyOjE6ICggJywnICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE5NTI5OjE6ICggKCAnLCcgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxOTUzMDoxOiAoICcsJyApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxODE5MjoxOiAoICcsJyApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxODE5MzoyOiAnLCcKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE5NTMwOjE6ICggJywnICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE5NTMxOjI6ICcsJwogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYRmVhdHVyZUNhbGxBY2Nlc3MoKS5nZXRDb21tYUtleXdvcmRfM18xXzFfMV8wKCkpOyAKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1hdGNoKGlucHV0LDExNSxGT0xMT1dfMik7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CisgICAgICAgICAgICBtYXRjaChpbnB1dCwxMjUsRk9MTE9XXzIpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOwogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBhZnRlcihncmFtbWFyQWNjZXNzLmdldFhGZWF0dXJlQ2FsbEFjY2VzcygpLmdldENvbW1hS2V5d29yZF8zXzFfMV8xXzAoKSk7IAogICAgICAgICAgICAgfQpAQCAtNjAwMjUsMTQgKzY0NDgyLDE0IEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fWEZlYXR1cmVDYWxsX19Hcm91cF8zXzFfMV8xX18xIgotICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE4MjAyOjE6IHJ1bGVfX1hGZWF0dXJlQ2FsbF9fR3JvdXBfM18xXzFfMV9fMSA6IHJ1bGVfX1hGZWF0dXJlQ2FsbF9fR3JvdXBfM18xXzFfMV9fMV9fSW1wbCA7CisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTk1NDA6MTogcnVsZV9fWEZlYXR1cmVDYWxsX19Hcm91cF8zXzFfMV8xX18xIDogcnVsZV9fWEZlYXR1cmVDYWxsX19Hcm91cF8zXzFfMV8xX18xX19JbXBsIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YRmVhdHVyZUNhbGxfX0dyb3VwXzNfMV8xXzFfXzEoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTgyMDY6MTogKCBydWxlX19YRmVhdHVyZUNhbGxfX0dyb3VwXzNfMV8xXzFfXzFfX0ltcGwgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTgyMDc6MjogcnVsZV9fWEZlYXR1cmVDYWxsX19Hcm91cF8zXzFfMV8xX18xX19JbXBsCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxOTU0NDoxOiAoIHJ1bGVfX1hGZWF0dXJlQ2FsbF9fR3JvdXBfM18xXzFfMV9fMV9fSW1wbCApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxOTU0NToyOiBydWxlX19YRmVhdHVyZUNhbGxfX0dyb3VwXzNfMV8xXzFfXzFfX0ltcGwKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzIpOwogICAgICAgICAgICAgcnVsZV9fWEZlYXR1cmVDYWxsX19Hcm91cF8zXzFfMV8xX18xX19JbXBsKCk7CkBAIC02MDA1OCwyMyArNjQ1MTUsMjMgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YRmVhdHVyZUNhbGxfX0dyb3VwXzNfMV8xXzFfXzFfX0ltcGwiCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTgyMTM6MTogcnVsZV9fWEZlYXR1cmVDYWxsX19Hcm91cF8zXzFfMV8xX18xX19JbXBsIDogKCAoIHJ1bGVfX1hGZWF0dXJlQ2FsbF9fRmVhdHVyZUNhbGxBcmd1bWVudHNBc3NpZ25tZW50XzNfMV8xXzFfMSApICkgOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE5NTUxOjE6IHJ1bGVfX1hGZWF0dXJlQ2FsbF9fR3JvdXBfM18xXzFfMV9fMV9fSW1wbCA6ICggKCBydWxlX19YRmVhdHVyZUNhbGxfX0ZlYXR1cmVDYWxsQXJndW1lbnRzQXNzaWdubWVudF8zXzFfMV8xXzEgKSApIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YRmVhdHVyZUNhbGxfX0dyb3VwXzNfMV8xXzFfXzFfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTgyMTc6MTogKCAoICggcnVsZV9fWEZlYXR1cmVDYWxsX19GZWF0dXJlQ2FsbEFyZ3VtZW50c0Fzc2lnbm1lbnRfM18xXzFfMV8xICkgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxODIxODoxOiAoICggcnVsZV9fWEZlYXR1cmVDYWxsX19GZWF0dXJlQ2FsbEFyZ3VtZW50c0Fzc2lnbm1lbnRfM18xXzFfMV8xICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTk1NTU6MTogKCAoICggcnVsZV9fWEZlYXR1cmVDYWxsX19GZWF0dXJlQ2FsbEFyZ3VtZW50c0Fzc2lnbm1lbnRfM18xXzFfMV8xICkgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxOTU1NjoxOiAoICggcnVsZV9fWEZlYXR1cmVDYWxsX19GZWF0dXJlQ2FsbEFyZ3VtZW50c0Fzc2lnbm1lbnRfM18xXzFfMV8xICkgKQogICAgICAgICAgICAgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTgyMTg6MTogKCAoIHJ1bGVfX1hGZWF0dXJlQ2FsbF9fRmVhdHVyZUNhbGxBcmd1bWVudHNBc3NpZ25tZW50XzNfMV8xXzFfMSApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE4MjE5OjI6ICggcnVsZV9fWEZlYXR1cmVDYWxsX19GZWF0dXJlQ2FsbEFyZ3VtZW50c0Fzc2lnbm1lbnRfM18xXzFfMV8xICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE5NTU2OjE6ICggKCBydWxlX19YRmVhdHVyZUNhbGxfX0ZlYXR1cmVDYWxsQXJndW1lbnRzQXNzaWdubWVudF8zXzFfMV8xXzEgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxOTU1NzoyOiAoIHJ1bGVfX1hGZWF0dXJlQ2FsbF9fRmVhdHVyZUNhbGxBcmd1bWVudHNBc3NpZ25tZW50XzNfMV8xXzFfMSApCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhGZWF0dXJlQ2FsbEFjY2VzcygpLmdldEZlYXR1cmVDYWxsQXJndW1lbnRzQXNzaWdubWVudF8zXzFfMV8xXzEoKSk7IAogICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTgyMjA6MjogKCBydWxlX19YRmVhdHVyZUNhbGxfX0ZlYXR1cmVDYWxsQXJndW1lbnRzQXNzaWdubWVudF8zXzFfMV8xXzEgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTgyMjA6MzogcnVsZV9fWEZlYXR1cmVDYWxsX19GZWF0dXJlQ2FsbEFyZ3VtZW50c0Fzc2lnbm1lbnRfM18xXzFfMV8xCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxOTU1ODoyOiAoIHJ1bGVfX1hGZWF0dXJlQ2FsbF9fRmVhdHVyZUNhbGxBcmd1bWVudHNBc3NpZ25tZW50XzNfMV8xXzFfMSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxOTU1ODozOiBydWxlX19YRmVhdHVyZUNhbGxfX0ZlYXR1cmVDYWxsQXJndW1lbnRzQXNzaWdubWVudF8zXzFfMV8xXzEKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzIpOwogICAgICAgICAgICAgcnVsZV9fWEZlYXR1cmVDYWxsX19GZWF0dXJlQ2FsbEFyZ3VtZW50c0Fzc2lnbm1lbnRfM18xXzFfMV8xKCk7CkBAIC02MDEwOSwxNiArNjQ1NjYsMTYgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YQ29uc3RydWN0b3JDYWxsX19Hcm91cF9fMCIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxODIyOToxOiBydWxlX19YQ29uc3RydWN0b3JDYWxsX19Hcm91cF9fMCA6IHJ1bGVfX1hDb25zdHJ1Y3RvckNhbGxfX0dyb3VwX18wX19JbXBsIHJ1bGVfX1hDb25zdHJ1Y3RvckNhbGxfX0dyb3VwX18xIDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxOTU2NzoxOiBydWxlX19YQ29uc3RydWN0b3JDYWxsX19Hcm91cF9fMCA6IHJ1bGVfX1hDb25zdHJ1Y3RvckNhbGxfX0dyb3VwX18wX19JbXBsIHJ1bGVfX1hDb25zdHJ1Y3RvckNhbGxfX0dyb3VwX18xIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YQ29uc3RydWN0b3JDYWxsX19Hcm91cF9fMCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxODIzMzoxOiAoIHJ1bGVfX1hDb25zdHJ1Y3RvckNhbGxfX0dyb3VwX18wX19JbXBsIHJ1bGVfX1hDb25zdHJ1Y3RvckNhbGxfX0dyb3VwX18xICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE4MjM0OjI6IHJ1bGVfX1hDb25zdHJ1Y3RvckNhbGxfX0dyb3VwX18wX19JbXBsIHJ1bGVfX1hDb25zdHJ1Y3RvckNhbGxfX0dyb3VwX18xCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxOTU3MToxOiAoIHJ1bGVfX1hDb25zdHJ1Y3RvckNhbGxfX0dyb3VwX18wX19JbXBsIHJ1bGVfX1hDb25zdHJ1Y3RvckNhbGxfX0dyb3VwX18xICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE5NTcyOjI6IHJ1bGVfX1hDb25zdHJ1Y3RvckNhbGxfX0dyb3VwX18wX19JbXBsIHJ1bGVfX1hDb25zdHJ1Y3RvckNhbGxfX0dyb3VwX18xCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV18xMzQpOworICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMTQyKTsKICAgICAgICAgICAgIHJ1bGVfX1hDb25zdHJ1Y3RvckNhbGxfX0dyb3VwX18wX19JbXBsKCk7CiAKICAgICAgICAgICAgIHN0YXRlLl9mc3AtLTsKQEAgLTYwMTQ3LDIzICs2NDYwNCwyMyBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX1hDb25zdHJ1Y3RvckNhbGxfX0dyb3VwX18wX19JbXBsIgotICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE4MjQxOjE6IHJ1bGVfX1hDb25zdHJ1Y3RvckNhbGxfX0dyb3VwX18wX19JbXBsIDogKCAoKSApIDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxOTU3OToxOiBydWxlX19YQ29uc3RydWN0b3JDYWxsX19Hcm91cF9fMF9fSW1wbCA6ICggKCkgKSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fWENvbnN0cnVjdG9yQ2FsbF9fR3JvdXBfXzBfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTgyNDU6MTogKCAoICgpICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTgyNDY6MTogKCAoKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxOTU4MzoxOiAoICggKCkgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxOTU4NDoxOiAoICgpICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE4MjQ2OjE6ICggKCkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTgyNDc6MjogKCkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE5NTg0OjE6ICggKCkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTk1ODU6MjogKCkKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WENvbnN0cnVjdG9yQ2FsbEFjY2VzcygpLmdldFhDb25zdHJ1Y3RvckNhbGxBY3Rpb25fMCgpKTsgCiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxODI0ODoyOiAoKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTgyNDg6MzogCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxOTU4NjoyOiAoKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTk1ODY6MzogCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICB9CiAKQEAgLTYwMTg4LDE0ICs2NDY0NSwxNCBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX1hDb25zdHJ1Y3RvckNhbGxfX0dyb3VwX18xIgotICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE4MjU2OjE6IHJ1bGVfX1hDb25zdHJ1Y3RvckNhbGxfX0dyb3VwX18xIDogcnVsZV9fWENvbnN0cnVjdG9yQ2FsbF9fR3JvdXBfXzFfX0ltcGwgcnVsZV9fWENvbnN0cnVjdG9yQ2FsbF9fR3JvdXBfXzIgOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE5NTk0OjE6IHJ1bGVfX1hDb25zdHJ1Y3RvckNhbGxfX0dyb3VwX18xIDogcnVsZV9fWENvbnN0cnVjdG9yQ2FsbF9fR3JvdXBfXzFfX0ltcGwgcnVsZV9fWENvbnN0cnVjdG9yQ2FsbF9fR3JvdXBfXzIgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1hDb25zdHJ1Y3RvckNhbGxfX0dyb3VwX18xKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE4MjYwOjE6ICggcnVsZV9fWENvbnN0cnVjdG9yQ2FsbF9fR3JvdXBfXzFfX0ltcGwgcnVsZV9fWENvbnN0cnVjdG9yQ2FsbF9fR3JvdXBfXzIgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTgyNjE6MjogcnVsZV9fWENvbnN0cnVjdG9yQ2FsbF9fR3JvdXBfXzFfX0ltcGwgcnVsZV9fWENvbnN0cnVjdG9yQ2FsbF9fR3JvdXBfXzIKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE5NTk4OjE6ICggcnVsZV9fWENvbnN0cnVjdG9yQ2FsbF9fR3JvdXBfXzFfX0ltcGwgcnVsZV9fWENvbnN0cnVjdG9yQ2FsbF9fR3JvdXBfXzIgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTk1OTk6MjogcnVsZV9fWENvbnN0cnVjdG9yQ2FsbF9fR3JvdXBfXzFfX0ltcGwgcnVsZV9fWENvbnN0cnVjdG9yQ2FsbF9fR3JvdXBfXzIKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzcpOwogICAgICAgICAgICAgcnVsZV9fWENvbnN0cnVjdG9yQ2FsbF9fR3JvdXBfXzFfX0ltcGwoKTsKQEAgLTYwMjI2LDIyICs2NDY4MywyMiBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX1hDb25zdHJ1Y3RvckNhbGxfX0dyb3VwX18xX19JbXBsIgotICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE4MjY4OjE6IHJ1bGVfX1hDb25zdHJ1Y3RvckNhbGxfX0dyb3VwX18xX19JbXBsIDogKCAnbmV3JyApIDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxOTYwNjoxOiBydWxlX19YQ29uc3RydWN0b3JDYWxsX19Hcm91cF9fMV9fSW1wbCA6ICggJ25ldycgKSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fWENvbnN0cnVjdG9yQ2FsbF9fR3JvdXBfXzFfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTgyNzI6MTogKCAoICduZXcnICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTgyNzM6MTogKCAnbmV3JyApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxOTYxMDoxOiAoICggJ25ldycgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxOTYxMToxOiAoICduZXcnICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE4MjczOjE6ICggJ25ldycgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTgyNzQ6MjogJ25ldycKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE5NjExOjE6ICggJ25ldycgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTk2MTI6MjogJ25ldycKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WENvbnN0cnVjdG9yQ2FsbEFjY2VzcygpLmdldE5ld0tleXdvcmRfMSgpKTsgCiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBtYXRjaChpbnB1dCwxMjgsRk9MTE9XXzIpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOworICAgICAgICAgICAgbWF0Y2goaW5wdXQsMTM4LEZPTExPV18yKTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRYQ29uc3RydWN0b3JDYWxsQWNjZXNzKCkuZ2V0TmV3S2V5d29yZF8xKCkpOyAKICAgICAgICAgICAgIH0KQEAgLTYwMjY3LDE2ICs2NDcyNCwxNiBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX1hDb25zdHJ1Y3RvckNhbGxfX0dyb3VwX18yIgotICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE4MjgzOjE6IHJ1bGVfX1hDb25zdHJ1Y3RvckNhbGxfX0dyb3VwX18yIDogcnVsZV9fWENvbnN0cnVjdG9yQ2FsbF9fR3JvdXBfXzJfX0ltcGwgcnVsZV9fWENvbnN0cnVjdG9yQ2FsbF9fR3JvdXBfXzMgOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE5NjIxOjE6IHJ1bGVfX1hDb25zdHJ1Y3RvckNhbGxfX0dyb3VwX18yIDogcnVsZV9fWENvbnN0cnVjdG9yQ2FsbF9fR3JvdXBfXzJfX0ltcGwgcnVsZV9fWENvbnN0cnVjdG9yQ2FsbF9fR3JvdXBfXzMgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1hDb25zdHJ1Y3RvckNhbGxfX0dyb3VwX18yKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE4Mjg3OjE6ICggcnVsZV9fWENvbnN0cnVjdG9yQ2FsbF9fR3JvdXBfXzJfX0ltcGwgcnVsZV9fWENvbnN0cnVjdG9yQ2FsbF9fR3JvdXBfXzMgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTgyODg6MjogcnVsZV9fWENvbnN0cnVjdG9yQ2FsbF9fR3JvdXBfXzJfX0ltcGwgcnVsZV9fWENvbnN0cnVjdG9yQ2FsbF9fR3JvdXBfXzMKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE5NjI1OjE6ICggcnVsZV9fWENvbnN0cnVjdG9yQ2FsbF9fR3JvdXBfXzJfX0ltcGwgcnVsZV9fWENvbnN0cnVjdG9yQ2FsbF9fR3JvdXBfXzMgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTk2MjY6MjogcnVsZV9fWENvbnN0cnVjdG9yQ2FsbF9fR3JvdXBfXzJfX0ltcGwgcnVsZV9fWENvbnN0cnVjdG9yQ2FsbF9fR3JvdXBfXzMKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzEzNSk7CisgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV18xNDMpOwogICAgICAgICAgICAgcnVsZV9fWENvbnN0cnVjdG9yQ2FsbF9fR3JvdXBfXzJfX0ltcGwoKTsKIAogICAgICAgICAgICAgc3RhdGUuX2ZzcC0tOwpAQCAtNjAzMDUsMjMgKzY0NzYyLDIzIEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fWENvbnN0cnVjdG9yQ2FsbF9fR3JvdXBfXzJfX0ltcGwiCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTgyOTU6MTogcnVsZV9fWENvbnN0cnVjdG9yQ2FsbF9fR3JvdXBfXzJfX0ltcGwgOiAoICggcnVsZV9fWENvbnN0cnVjdG9yQ2FsbF9fQ29uc3RydWN0b3JBc3NpZ25tZW50XzIgKSApIDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxOTYzMzoxOiBydWxlX19YQ29uc3RydWN0b3JDYWxsX19Hcm91cF9fMl9fSW1wbCA6ICggKCBydWxlX19YQ29uc3RydWN0b3JDYWxsX19Db25zdHJ1Y3RvckFzc2lnbm1lbnRfMiApICkgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1hDb25zdHJ1Y3RvckNhbGxfX0dyb3VwX18yX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE4Mjk5OjE6ICggKCAoIHJ1bGVfX1hDb25zdHJ1Y3RvckNhbGxfX0NvbnN0cnVjdG9yQXNzaWdubWVudF8yICkgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxODMwMDoxOiAoICggcnVsZV9fWENvbnN0cnVjdG9yQ2FsbF9fQ29uc3RydWN0b3JBc3NpZ25tZW50XzIgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxOTYzNzoxOiAoICggKCBydWxlX19YQ29uc3RydWN0b3JDYWxsX19Db25zdHJ1Y3RvckFzc2lnbm1lbnRfMiApICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTk2Mzg6MTogKCAoIHJ1bGVfX1hDb25zdHJ1Y3RvckNhbGxfX0NvbnN0cnVjdG9yQXNzaWdubWVudF8yICkgKQogICAgICAgICAgICAgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTgzMDA6MTogKCAoIHJ1bGVfX1hDb25zdHJ1Y3RvckNhbGxfX0NvbnN0cnVjdG9yQXNzaWdubWVudF8yICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTgzMDE6MjogKCBydWxlX19YQ29uc3RydWN0b3JDYWxsX19Db25zdHJ1Y3RvckFzc2lnbm1lbnRfMiApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxOTYzODoxOiAoICggcnVsZV9fWENvbnN0cnVjdG9yQ2FsbF9fQ29uc3RydWN0b3JBc3NpZ25tZW50XzIgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxOTYzOToyOiAoIHJ1bGVfX1hDb25zdHJ1Y3RvckNhbGxfX0NvbnN0cnVjdG9yQXNzaWdubWVudF8yICkKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WENvbnN0cnVjdG9yQ2FsbEFjY2VzcygpLmdldENvbnN0cnVjdG9yQXNzaWdubWVudF8yKCkpOyAKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE4MzAyOjI6ICggcnVsZV9fWENvbnN0cnVjdG9yQ2FsbF9fQ29uc3RydWN0b3JBc3NpZ25tZW50XzIgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTgzMDI6MzogcnVsZV9fWENvbnN0cnVjdG9yQ2FsbF9fQ29uc3RydWN0b3JBc3NpZ25tZW50XzIKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE5NjQwOjI6ICggcnVsZV9fWENvbnN0cnVjdG9yQ2FsbF9fQ29uc3RydWN0b3JBc3NpZ25tZW50XzIgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTk2NDA6MzogcnVsZV9fWENvbnN0cnVjdG9yQ2FsbF9fQ29uc3RydWN0b3JBc3NpZ25tZW50XzIKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzIpOwogICAgICAgICAgICAgcnVsZV9fWENvbnN0cnVjdG9yQ2FsbF9fQ29uc3RydWN0b3JBc3NpZ25tZW50XzIoKTsKQEAgLTYwMzU2LDE2ICs2NDgxMywxNiBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX1hDb25zdHJ1Y3RvckNhbGxfX0dyb3VwX18zIgotICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE4MzEwOjE6IHJ1bGVfX1hDb25zdHJ1Y3RvckNhbGxfX0dyb3VwX18zIDogcnVsZV9fWENvbnN0cnVjdG9yQ2FsbF9fR3JvdXBfXzNfX0ltcGwgcnVsZV9fWENvbnN0cnVjdG9yQ2FsbF9fR3JvdXBfXzQgOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE5NjQ4OjE6IHJ1bGVfX1hDb25zdHJ1Y3RvckNhbGxfX0dyb3VwX18zIDogcnVsZV9fWENvbnN0cnVjdG9yQ2FsbF9fR3JvdXBfXzNfX0ltcGwgcnVsZV9fWENvbnN0cnVjdG9yQ2FsbF9fR3JvdXBfXzQgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1hDb25zdHJ1Y3RvckNhbGxfX0dyb3VwX18zKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE4MzE0OjE6ICggcnVsZV9fWENvbnN0cnVjdG9yQ2FsbF9fR3JvdXBfXzNfX0ltcGwgcnVsZV9fWENvbnN0cnVjdG9yQ2FsbF9fR3JvdXBfXzQgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTgzMTU6MjogcnVsZV9fWENvbnN0cnVjdG9yQ2FsbF9fR3JvdXBfXzNfX0ltcGwgcnVsZV9fWENvbnN0cnVjdG9yQ2FsbF9fR3JvdXBfXzQKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE5NjUyOjE6ICggcnVsZV9fWENvbnN0cnVjdG9yQ2FsbF9fR3JvdXBfXzNfX0ltcGwgcnVsZV9fWENvbnN0cnVjdG9yQ2FsbF9fR3JvdXBfXzQgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTk2NTM6MjogcnVsZV9fWENvbnN0cnVjdG9yQ2FsbF9fR3JvdXBfXzNfX0ltcGwgcnVsZV9fWENvbnN0cnVjdG9yQ2FsbF9fR3JvdXBfXzQKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzEzNSk7CisgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV18xNDMpOwogICAgICAgICAgICAgcnVsZV9fWENvbnN0cnVjdG9yQ2FsbF9fR3JvdXBfXzNfX0ltcGwoKTsKIAogICAgICAgICAgICAgc3RhdGUuX2ZzcC0tOwpAQCAtNjAzOTQsMjcgKzY0ODUxLDI3IEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fWENvbnN0cnVjdG9yQ2FsbF9fR3JvdXBfXzNfX0ltcGwiCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTgzMjI6MTogcnVsZV9fWENvbnN0cnVjdG9yQ2FsbF9fR3JvdXBfXzNfX0ltcGwgOiAoICggcnVsZV9fWENvbnN0cnVjdG9yQ2FsbF9fR3JvdXBfM19fMCApPyApIDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxOTY2MDoxOiBydWxlX19YQ29uc3RydWN0b3JDYWxsX19Hcm91cF9fM19fSW1wbCA6ICggKCBydWxlX19YQ29uc3RydWN0b3JDYWxsX19Hcm91cF8zX18wICk/ICkgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1hDb25zdHJ1Y3RvckNhbGxfX0dyb3VwX18zX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE4MzI2OjE6ICggKCAoIHJ1bGVfX1hDb25zdHJ1Y3RvckNhbGxfX0dyb3VwXzNfXzAgKT8gKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxODMyNzoxOiAoICggcnVsZV9fWENvbnN0cnVjdG9yQ2FsbF9fR3JvdXBfM19fMCApPyApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxOTY2NDoxOiAoICggKCBydWxlX19YQ29uc3RydWN0b3JDYWxsX19Hcm91cF8zX18wICk/ICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTk2NjU6MTogKCAoIHJ1bGVfX1hDb25zdHJ1Y3RvckNhbGxfX0dyb3VwXzNfXzAgKT8gKQogICAgICAgICAgICAgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTgzMjc6MTogKCAoIHJ1bGVfX1hDb25zdHJ1Y3RvckNhbGxfX0dyb3VwXzNfXzAgKT8gKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTgzMjg6MjogKCBydWxlX19YQ29uc3RydWN0b3JDYWxsX19Hcm91cF8zX18wICk/CisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxOTY2NToxOiAoICggcnVsZV9fWENvbnN0cnVjdG9yQ2FsbF9fR3JvdXBfM19fMCApPyApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxOTY2NjoyOiAoIHJ1bGVfX1hDb25zdHJ1Y3RvckNhbGxfX0dyb3VwXzNfXzAgKT8KICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WENvbnN0cnVjdG9yQ2FsbEFjY2VzcygpLmdldEdyb3VwXzMoKSk7IAogICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTgzMjk6MjogKCBydWxlX19YQ29uc3RydWN0b3JDYWxsX19Hcm91cF8zX18wICk/Ci0gICAgICAgICAgICBpbnQgYWx0MTQ1PTI7Ci0gICAgICAgICAgICBhbHQxNDUgPSBkZmExNDUucHJlZGljdChpbnB1dCk7Ci0gICAgICAgICAgICBzd2l0Y2ggKGFsdDE0NSkgeworICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTk2Njc6MjogKCBydWxlX19YQ29uc3RydWN0b3JDYWxsX19Hcm91cF8zX18wICk/CisgICAgICAgICAgICBpbnQgYWx0MTU4PTI7CisgICAgICAgICAgICBhbHQxNTggPSBkZmExNTgucHJlZGljdChpbnB1dCk7CisgICAgICAgICAgICBzd2l0Y2ggKGFsdDE1OCkgewogICAgICAgICAgICAgICAgIGNhc2UgMSA6Ci0gICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE4MzI5OjM6IHJ1bGVfX1hDb25zdHJ1Y3RvckNhbGxfX0dyb3VwXzNfXzAKKyAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTk2Njc6MzogcnVsZV9fWENvbnN0cnVjdG9yQ2FsbF9fR3JvdXBfM19fMAogICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzIpOwogICAgICAgICAgICAgICAgICAgICBydWxlX19YQ29uc3RydWN0b3JDYWxsX19Hcm91cF8zX18wKCk7CkBAIC02MDQ1MiwxNiArNjQ5MDksMTYgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YQ29uc3RydWN0b3JDYWxsX19Hcm91cF9fNCIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxODMzNzoxOiBydWxlX19YQ29uc3RydWN0b3JDYWxsX19Hcm91cF9fNCA6IHJ1bGVfX1hDb25zdHJ1Y3RvckNhbGxfX0dyb3VwX180X19JbXBsIHJ1bGVfX1hDb25zdHJ1Y3RvckNhbGxfX0dyb3VwX181IDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxOTY3NToxOiBydWxlX19YQ29uc3RydWN0b3JDYWxsX19Hcm91cF9fNCA6IHJ1bGVfX1hDb25zdHJ1Y3RvckNhbGxfX0dyb3VwX180X19JbXBsIHJ1bGVfX1hDb25zdHJ1Y3RvckNhbGxfX0dyb3VwX181IDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YQ29uc3RydWN0b3JDYWxsX19Hcm91cF9fNCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxODM0MToxOiAoIHJ1bGVfX1hDb25zdHJ1Y3RvckNhbGxfX0dyb3VwX180X19JbXBsIHJ1bGVfX1hDb25zdHJ1Y3RvckNhbGxfX0dyb3VwX181ICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE4MzQyOjI6IHJ1bGVfX1hDb25zdHJ1Y3RvckNhbGxfX0dyb3VwX180X19JbXBsIHJ1bGVfX1hDb25zdHJ1Y3RvckNhbGxfX0dyb3VwX181CisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxOTY3OToxOiAoIHJ1bGVfX1hDb25zdHJ1Y3RvckNhbGxfX0dyb3VwX180X19JbXBsIHJ1bGVfX1hDb25zdHJ1Y3RvckNhbGxfX0dyb3VwX181ICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE5NjgwOjI6IHJ1bGVfX1hDb25zdHJ1Y3RvckNhbGxfX0dyb3VwX180X19JbXBsIHJ1bGVfX1hDb25zdHJ1Y3RvckNhbGxfX0dyb3VwX181CiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV18xMzUpOworICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMTQzKTsKICAgICAgICAgICAgIHJ1bGVfX1hDb25zdHJ1Y3RvckNhbGxfX0dyb3VwX180X19JbXBsKCk7CiAKICAgICAgICAgICAgIHN0YXRlLl9mc3AtLTsKQEAgLTYwNDkwLDI3ICs2NDk0NywyNyBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX1hDb25zdHJ1Y3RvckNhbGxfX0dyb3VwX180X19JbXBsIgotICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE4MzQ5OjE6IHJ1bGVfX1hDb25zdHJ1Y3RvckNhbGxfX0dyb3VwX180X19JbXBsIDogKCAoIHJ1bGVfX1hDb25zdHJ1Y3RvckNhbGxfX0dyb3VwXzRfXzAgKT8gKSA7CisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTk2ODc6MTogcnVsZV9fWENvbnN0cnVjdG9yQ2FsbF9fR3JvdXBfXzRfX0ltcGwgOiAoICggcnVsZV9fWENvbnN0cnVjdG9yQ2FsbF9fR3JvdXBfNF9fMCApPyApIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YQ29uc3RydWN0b3JDYWxsX19Hcm91cF9fNF9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxODM1MzoxOiAoICggKCBydWxlX19YQ29uc3RydWN0b3JDYWxsX19Hcm91cF80X18wICk/ICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTgzNTQ6MTogKCAoIHJ1bGVfX1hDb25zdHJ1Y3RvckNhbGxfX0dyb3VwXzRfXzAgKT8gKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTk2OTE6MTogKCAoICggcnVsZV9fWENvbnN0cnVjdG9yQ2FsbF9fR3JvdXBfNF9fMCApPyApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE5NjkyOjE6ICggKCBydWxlX19YQ29uc3RydWN0b3JDYWxsX19Hcm91cF80X18wICk/ICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE4MzU0OjE6ICggKCBydWxlX19YQ29uc3RydWN0b3JDYWxsX19Hcm91cF80X18wICk/ICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE4MzU1OjI6ICggcnVsZV9fWENvbnN0cnVjdG9yQ2FsbF9fR3JvdXBfNF9fMCApPworICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTk2OTI6MTogKCAoIHJ1bGVfX1hDb25zdHJ1Y3RvckNhbGxfX0dyb3VwXzRfXzAgKT8gKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTk2OTM6MjogKCBydWxlX19YQ29uc3RydWN0b3JDYWxsX19Hcm91cF80X18wICk/CiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhDb25zdHJ1Y3RvckNhbGxBY2Nlc3MoKS5nZXRHcm91cF80KCkpOyAKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE4MzU2OjI6ICggcnVsZV9fWENvbnN0cnVjdG9yQ2FsbF9fR3JvdXBfNF9fMCApPwotICAgICAgICAgICAgaW50IGFsdDE0Nj0yOwotICAgICAgICAgICAgYWx0MTQ2ID0gZGZhMTQ2LnByZWRpY3QoaW5wdXQpOwotICAgICAgICAgICAgc3dpdGNoIChhbHQxNDYpIHsKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE5Njk0OjI6ICggcnVsZV9fWENvbnN0cnVjdG9yQ2FsbF9fR3JvdXBfNF9fMCApPworICAgICAgICAgICAgaW50IGFsdDE1OT0yOworICAgICAgICAgICAgYWx0MTU5ID0gZGZhMTU5LnByZWRpY3QoaW5wdXQpOworICAgICAgICAgICAgc3dpdGNoIChhbHQxNTkpIHsKICAgICAgICAgICAgICAgICBjYXNlIDEgOgotICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxODM1NjozOiBydWxlX19YQ29uc3RydWN0b3JDYWxsX19Hcm91cF80X18wCisgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE5Njk0OjM6IHJ1bGVfX1hDb25zdHJ1Y3RvckNhbGxfX0dyb3VwXzRfXzAKICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV18yKTsKICAgICAgICAgICAgICAgICAgICAgcnVsZV9fWENvbnN0cnVjdG9yQ2FsbF9fR3JvdXBfNF9fMCgpOwpAQCAtNjA1NDgsMTQgKzY1MDA1LDE0IEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fWENvbnN0cnVjdG9yQ2FsbF9fR3JvdXBfXzUiCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTgzNjQ6MTogcnVsZV9fWENvbnN0cnVjdG9yQ2FsbF9fR3JvdXBfXzUgOiBydWxlX19YQ29uc3RydWN0b3JDYWxsX19Hcm91cF9fNV9fSW1wbCA7CisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTk3MDI6MTogcnVsZV9fWENvbnN0cnVjdG9yQ2FsbF9fR3JvdXBfXzUgOiBydWxlX19YQ29uc3RydWN0b3JDYWxsX19Hcm91cF9fNV9fSW1wbCA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fWENvbnN0cnVjdG9yQ2FsbF9fR3JvdXBfXzUoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTgzNjg6MTogKCBydWxlX19YQ29uc3RydWN0b3JDYWxsX19Hcm91cF9fNV9fSW1wbCApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxODM2OToyOiBydWxlX19YQ29uc3RydWN0b3JDYWxsX19Hcm91cF9fNV9fSW1wbAorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTk3MDY6MTogKCBydWxlX19YQ29uc3RydWN0b3JDYWxsX19Hcm91cF9fNV9fSW1wbCApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxOTcwNzoyOiBydWxlX19YQ29uc3RydWN0b3JDYWxsX19Hcm91cF9fNV9fSW1wbAogICAgICAgICAgICAgewogICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMik7CiAgICAgICAgICAgICBydWxlX19YQ29uc3RydWN0b3JDYWxsX19Hcm91cF9fNV9fSW1wbCgpOwpAQCAtNjA1ODEsMjcgKzY1MDM4LDI3IEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fWENvbnN0cnVjdG9yQ2FsbF9fR3JvdXBfXzVfX0ltcGwiCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTgzNzU6MTogcnVsZV9fWENvbnN0cnVjdG9yQ2FsbF9fR3JvdXBfXzVfX0ltcGwgOiAoICggcnVsZV9fWENvbnN0cnVjdG9yQ2FsbF9fQXJndW1lbnRzQXNzaWdubWVudF81ICk/ICkgOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE5NzEzOjE6IHJ1bGVfX1hDb25zdHJ1Y3RvckNhbGxfX0dyb3VwX181X19JbXBsIDogKCAoIHJ1bGVfX1hDb25zdHJ1Y3RvckNhbGxfX0FyZ3VtZW50c0Fzc2lnbm1lbnRfNSApPyApIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YQ29uc3RydWN0b3JDYWxsX19Hcm91cF9fNV9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxODM3OToxOiAoICggKCBydWxlX19YQ29uc3RydWN0b3JDYWxsX19Bcmd1bWVudHNBc3NpZ25tZW50XzUgKT8gKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxODM4MDoxOiAoICggcnVsZV9fWENvbnN0cnVjdG9yQ2FsbF9fQXJndW1lbnRzQXNzaWdubWVudF81ICk/ICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE5NzE3OjE6ICggKCAoIHJ1bGVfX1hDb25zdHJ1Y3RvckNhbGxfX0FyZ3VtZW50c0Fzc2lnbm1lbnRfNSApPyApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE5NzE4OjE6ICggKCBydWxlX19YQ29uc3RydWN0b3JDYWxsX19Bcmd1bWVudHNBc3NpZ25tZW50XzUgKT8gKQogICAgICAgICAgICAgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTgzODA6MTogKCAoIHJ1bGVfX1hDb25zdHJ1Y3RvckNhbGxfX0FyZ3VtZW50c0Fzc2lnbm1lbnRfNSApPyApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxODM4MToyOiAoIHJ1bGVfX1hDb25zdHJ1Y3RvckNhbGxfX0FyZ3VtZW50c0Fzc2lnbm1lbnRfNSApPworICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTk3MTg6MTogKCAoIHJ1bGVfX1hDb25zdHJ1Y3RvckNhbGxfX0FyZ3VtZW50c0Fzc2lnbm1lbnRfNSApPyApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxOTcxOToyOiAoIHJ1bGVfX1hDb25zdHJ1Y3RvckNhbGxfX0FyZ3VtZW50c0Fzc2lnbm1lbnRfNSApPwogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYQ29uc3RydWN0b3JDYWxsQWNjZXNzKCkuZ2V0QXJndW1lbnRzQXNzaWdubWVudF81KCkpOyAKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE4MzgyOjI6ICggcnVsZV9fWENvbnN0cnVjdG9yQ2FsbF9fQXJndW1lbnRzQXNzaWdubWVudF81ICk/Ci0gICAgICAgICAgICBpbnQgYWx0MTQ3PTI7Ci0gICAgICAgICAgICBhbHQxNDcgPSBkZmExNDcucHJlZGljdChpbnB1dCk7Ci0gICAgICAgICAgICBzd2l0Y2ggKGFsdDE0NykgeworICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTk3MjA6MjogKCBydWxlX19YQ29uc3RydWN0b3JDYWxsX19Bcmd1bWVudHNBc3NpZ25tZW50XzUgKT8KKyAgICAgICAgICAgIGludCBhbHQxNjA9MjsKKyAgICAgICAgICAgIGFsdDE2MCA9IGRmYTE2MC5wcmVkaWN0KGlucHV0KTsKKyAgICAgICAgICAgIHN3aXRjaCAoYWx0MTYwKSB7CiAgICAgICAgICAgICAgICAgY2FzZSAxIDoKLSAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTgzODI6MzogcnVsZV9fWENvbnN0cnVjdG9yQ2FsbF9fQXJndW1lbnRzQXNzaWdubWVudF81CisgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE5NzIwOjM6IHJ1bGVfX1hDb25zdHJ1Y3RvckNhbGxfX0FyZ3VtZW50c0Fzc2lnbm1lbnRfNQogICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzIpOwogICAgICAgICAgICAgICAgICAgICBydWxlX19YQ29uc3RydWN0b3JDYWxsX19Bcmd1bWVudHNBc3NpZ25tZW50XzUoKTsKQEAgLTYwNjM5LDE2ICs2NTA5NiwxNiBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX1hDb25zdHJ1Y3RvckNhbGxfX0dyb3VwXzNfXzAiCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTgzOTE6MTogcnVsZV9fWENvbnN0cnVjdG9yQ2FsbF9fR3JvdXBfM19fMCA6IHJ1bGVfX1hDb25zdHJ1Y3RvckNhbGxfX0dyb3VwXzNfXzBfX0ltcGwgcnVsZV9fWENvbnN0cnVjdG9yQ2FsbF9fR3JvdXBfM19fMSA7CisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTk3Mjk6MTogcnVsZV9fWENvbnN0cnVjdG9yQ2FsbF9fR3JvdXBfM19fMCA6IHJ1bGVfX1hDb25zdHJ1Y3RvckNhbGxfX0dyb3VwXzNfXzBfX0ltcGwgcnVsZV9fWENvbnN0cnVjdG9yQ2FsbF9fR3JvdXBfM19fMSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fWENvbnN0cnVjdG9yQ2FsbF9fR3JvdXBfM19fMCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxODM5NToxOiAoIHJ1bGVfX1hDb25zdHJ1Y3RvckNhbGxfX0dyb3VwXzNfXzBfX0ltcGwgcnVsZV9fWENvbnN0cnVjdG9yQ2FsbF9fR3JvdXBfM19fMSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxODM5NjoyOiBydWxlX19YQ29uc3RydWN0b3JDYWxsX19Hcm91cF8zX18wX19JbXBsIHJ1bGVfX1hDb25zdHJ1Y3RvckNhbGxfX0dyb3VwXzNfXzEKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE5NzMzOjE6ICggcnVsZV9fWENvbnN0cnVjdG9yQ2FsbF9fR3JvdXBfM19fMF9fSW1wbCBydWxlX19YQ29uc3RydWN0b3JDYWxsX19Hcm91cF8zX18xICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE5NzM0OjI6IHJ1bGVfX1hDb25zdHJ1Y3RvckNhbGxfX0dyb3VwXzNfXzBfX0ltcGwgcnVsZV9fWENvbnN0cnVjdG9yQ2FsbF9fR3JvdXBfM19fMQogICAgICAgICAgICAgewotICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMTEwKTsKKyAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzExOCk7CiAgICAgICAgICAgICBydWxlX19YQ29uc3RydWN0b3JDYWxsX19Hcm91cF8zX18wX19JbXBsKCk7CiAKICAgICAgICAgICAgIHN0YXRlLl9mc3AtLTsKQEAgLTYwNjc3LDIzICs2NTEzNCwyMyBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX1hDb25zdHJ1Y3RvckNhbGxfX0dyb3VwXzNfXzBfX0ltcGwiCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTg0MDM6MTogcnVsZV9fWENvbnN0cnVjdG9yQ2FsbF9fR3JvdXBfM19fMF9fSW1wbCA6ICggKCAnPCcgKSApIDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxOTc0MToxOiBydWxlX19YQ29uc3RydWN0b3JDYWxsX19Hcm91cF8zX18wX19JbXBsIDogKCAoICc8JyApICkgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1hDb25zdHJ1Y3RvckNhbGxfX0dyb3VwXzNfXzBfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTg0MDc6MTogKCAoICggJzwnICkgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxODQwODoxOiAoICggJzwnICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTk3NDU6MTogKCAoICggJzwnICkgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxOTc0NjoxOiAoICggJzwnICkgKQogICAgICAgICAgICAgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTg0MDg6MTogKCAoICc8JyApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE4NDA5OjI6ICggJzwnICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE5NzQ2OjE6ICggKCAnPCcgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxOTc0NzoyOiAoICc8JyApCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhDb25zdHJ1Y3RvckNhbGxBY2Nlc3MoKS5nZXRMZXNzVGhhblNpZ25LZXl3b3JkXzNfMCgpKTsgCiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxODQxMDoyOiAoICc8JyApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxODQxMDozOiAnPCcKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE5NzQ4OjI6ICggJzwnICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE5NzQ4OjM6ICc8JwogICAgICAgICAgICAgewogICAgICAgICAgICAgbWF0Y2goaW5wdXQsMjcsRk9MTE9XXzIpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOwogCkBAIC02MDcyNCwxNiArNjUxODEsMTYgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YQ29uc3RydWN0b3JDYWxsX19Hcm91cF8zX18xIgotICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE4NDE4OjE6IHJ1bGVfX1hDb25zdHJ1Y3RvckNhbGxfX0dyb3VwXzNfXzEgOiBydWxlX19YQ29uc3RydWN0b3JDYWxsX19Hcm91cF8zX18xX19JbXBsIHJ1bGVfX1hDb25zdHJ1Y3RvckNhbGxfX0dyb3VwXzNfXzIgOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE5NzU2OjE6IHJ1bGVfX1hDb25zdHJ1Y3RvckNhbGxfX0dyb3VwXzNfXzEgOiBydWxlX19YQ29uc3RydWN0b3JDYWxsX19Hcm91cF8zX18xX19JbXBsIHJ1bGVfX1hDb25zdHJ1Y3RvckNhbGxfX0dyb3VwXzNfXzIgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1hDb25zdHJ1Y3RvckNhbGxfX0dyb3VwXzNfXzEoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTg0MjI6MTogKCBydWxlX19YQ29uc3RydWN0b3JDYWxsX19Hcm91cF8zX18xX19JbXBsIHJ1bGVfX1hDb25zdHJ1Y3RvckNhbGxfX0dyb3VwXzNfXzIgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTg0MjM6MjogcnVsZV9fWENvbnN0cnVjdG9yQ2FsbF9fR3JvdXBfM19fMV9fSW1wbCBydWxlX19YQ29uc3RydWN0b3JDYWxsX19Hcm91cF8zX18yCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxOTc2MDoxOiAoIHJ1bGVfX1hDb25zdHJ1Y3RvckNhbGxfX0dyb3VwXzNfXzFfX0ltcGwgcnVsZV9fWENvbnN0cnVjdG9yQ2FsbF9fR3JvdXBfM19fMiApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxOTc2MToyOiBydWxlX19YQ29uc3RydWN0b3JDYWxsX19Hcm91cF8zX18xX19JbXBsIHJ1bGVfX1hDb25zdHJ1Y3RvckNhbGxfX0dyb3VwXzNfXzIKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzExMSk7CisgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV18xMTkpOwogICAgICAgICAgICAgcnVsZV9fWENvbnN0cnVjdG9yQ2FsbF9fR3JvdXBfM19fMV9fSW1wbCgpOwogCiAgICAgICAgICAgICBzdGF0ZS5fZnNwLS07CkBAIC02MDc2MiwyMyArNjUyMTksMjMgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YQ29uc3RydWN0b3JDYWxsX19Hcm91cF8zX18xX19JbXBsIgotICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE4NDMwOjE6IHJ1bGVfX1hDb25zdHJ1Y3RvckNhbGxfX0dyb3VwXzNfXzFfX0ltcGwgOiAoICggcnVsZV9fWENvbnN0cnVjdG9yQ2FsbF9fVHlwZUFyZ3VtZW50c0Fzc2lnbm1lbnRfM18xICkgKSA7CisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTk3Njg6MTogcnVsZV9fWENvbnN0cnVjdG9yQ2FsbF9fR3JvdXBfM19fMV9fSW1wbCA6ICggKCBydWxlX19YQ29uc3RydWN0b3JDYWxsX19UeXBlQXJndW1lbnRzQXNzaWdubWVudF8zXzEgKSApIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YQ29uc3RydWN0b3JDYWxsX19Hcm91cF8zX18xX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE4NDM0OjE6ICggKCAoIHJ1bGVfX1hDb25zdHJ1Y3RvckNhbGxfX1R5cGVBcmd1bWVudHNBc3NpZ25tZW50XzNfMSApICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTg0MzU6MTogKCAoIHJ1bGVfX1hDb25zdHJ1Y3RvckNhbGxfX1R5cGVBcmd1bWVudHNBc3NpZ25tZW50XzNfMSApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE5NzcyOjE6ICggKCAoIHJ1bGVfX1hDb25zdHJ1Y3RvckNhbGxfX1R5cGVBcmd1bWVudHNBc3NpZ25tZW50XzNfMSApICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTk3NzM6MTogKCAoIHJ1bGVfX1hDb25zdHJ1Y3RvckNhbGxfX1R5cGVBcmd1bWVudHNBc3NpZ25tZW50XzNfMSApICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE4NDM1OjE6ICggKCBydWxlX19YQ29uc3RydWN0b3JDYWxsX19UeXBlQXJndW1lbnRzQXNzaWdubWVudF8zXzEgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxODQzNjoyOiAoIHJ1bGVfX1hDb25zdHJ1Y3RvckNhbGxfX1R5cGVBcmd1bWVudHNBc3NpZ25tZW50XzNfMSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxOTc3MzoxOiAoICggcnVsZV9fWENvbnN0cnVjdG9yQ2FsbF9fVHlwZUFyZ3VtZW50c0Fzc2lnbm1lbnRfM18xICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTk3NzQ6MjogKCBydWxlX19YQ29uc3RydWN0b3JDYWxsX19UeXBlQXJndW1lbnRzQXNzaWdubWVudF8zXzEgKQogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYQ29uc3RydWN0b3JDYWxsQWNjZXNzKCkuZ2V0VHlwZUFyZ3VtZW50c0Fzc2lnbm1lbnRfM18xKCkpOyAKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE4NDM3OjI6ICggcnVsZV9fWENvbnN0cnVjdG9yQ2FsbF9fVHlwZUFyZ3VtZW50c0Fzc2lnbm1lbnRfM18xICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE4NDM3OjM6IHJ1bGVfX1hDb25zdHJ1Y3RvckNhbGxfX1R5cGVBcmd1bWVudHNBc3NpZ25tZW50XzNfMQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTk3NzU6MjogKCBydWxlX19YQ29uc3RydWN0b3JDYWxsX19UeXBlQXJndW1lbnRzQXNzaWdubWVudF8zXzEgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTk3NzU6MzogcnVsZV9fWENvbnN0cnVjdG9yQ2FsbF9fVHlwZUFyZ3VtZW50c0Fzc2lnbm1lbnRfM18xCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV18yKTsKICAgICAgICAgICAgIHJ1bGVfX1hDb25zdHJ1Y3RvckNhbGxfX1R5cGVBcmd1bWVudHNBc3NpZ25tZW50XzNfMSgpOwpAQCAtNjA4MTMsMTYgKzY1MjcwLDE2IEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fWENvbnN0cnVjdG9yQ2FsbF9fR3JvdXBfM19fMiIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxODQ0NToxOiBydWxlX19YQ29uc3RydWN0b3JDYWxsX19Hcm91cF8zX18yIDogcnVsZV9fWENvbnN0cnVjdG9yQ2FsbF9fR3JvdXBfM19fMl9fSW1wbCBydWxlX19YQ29uc3RydWN0b3JDYWxsX19Hcm91cF8zX18zIDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxOTc4MzoxOiBydWxlX19YQ29uc3RydWN0b3JDYWxsX19Hcm91cF8zX18yIDogcnVsZV9fWENvbnN0cnVjdG9yQ2FsbF9fR3JvdXBfM19fMl9fSW1wbCBydWxlX19YQ29uc3RydWN0b3JDYWxsX19Hcm91cF8zX18zIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YQ29uc3RydWN0b3JDYWxsX19Hcm91cF8zX18yKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE4NDQ5OjE6ICggcnVsZV9fWENvbnN0cnVjdG9yQ2FsbF9fR3JvdXBfM19fMl9fSW1wbCBydWxlX19YQ29uc3RydWN0b3JDYWxsX19Hcm91cF8zX18zICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE4NDUwOjI6IHJ1bGVfX1hDb25zdHJ1Y3RvckNhbGxfX0dyb3VwXzNfXzJfX0ltcGwgcnVsZV9fWENvbnN0cnVjdG9yQ2FsbF9fR3JvdXBfM19fMworICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTk3ODc6MTogKCBydWxlX19YQ29uc3RydWN0b3JDYWxsX19Hcm91cF8zX18yX19JbXBsIHJ1bGVfX1hDb25zdHJ1Y3RvckNhbGxfX0dyb3VwXzNfXzMgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTk3ODg6MjogcnVsZV9fWENvbnN0cnVjdG9yQ2FsbF9fR3JvdXBfM19fMl9fSW1wbCBydWxlX19YQ29uc3RydWN0b3JDYWxsX19Hcm91cF8zX18zCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV18xMTEpOworICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMTE5KTsKICAgICAgICAgICAgIHJ1bGVfX1hDb25zdHJ1Y3RvckNhbGxfX0dyb3VwXzNfXzJfX0ltcGwoKTsKIAogICAgICAgICAgICAgc3RhdGUuX2ZzcC0tOwpAQCAtNjA4NTEsMzcgKzY1MzA4LDM3IEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fWENvbnN0cnVjdG9yQ2FsbF9fR3JvdXBfM19fMl9fSW1wbCIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxODQ1NzoxOiBydWxlX19YQ29uc3RydWN0b3JDYWxsX19Hcm91cF8zX18yX19JbXBsIDogKCAoIHJ1bGVfX1hDb25zdHJ1Y3RvckNhbGxfX0dyb3VwXzNfMl9fMCApKiApIDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxOTc5NToxOiBydWxlX19YQ29uc3RydWN0b3JDYWxsX19Hcm91cF8zX18yX19JbXBsIDogKCAoIHJ1bGVfX1hDb25zdHJ1Y3RvckNhbGxfX0dyb3VwXzNfMl9fMCApKiApIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YQ29uc3RydWN0b3JDYWxsX19Hcm91cF8zX18yX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE4NDYxOjE6ICggKCAoIHJ1bGVfX1hDb25zdHJ1Y3RvckNhbGxfX0dyb3VwXzNfMl9fMCApKiApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE4NDYyOjE6ICggKCBydWxlX19YQ29uc3RydWN0b3JDYWxsX19Hcm91cF8zXzJfXzAgKSogKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTk3OTk6MTogKCAoICggcnVsZV9fWENvbnN0cnVjdG9yQ2FsbF9fR3JvdXBfM18yX18wICkqICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTk4MDA6MTogKCAoIHJ1bGVfX1hDb25zdHJ1Y3RvckNhbGxfX0dyb3VwXzNfMl9fMCApKiApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxODQ2MjoxOiAoICggcnVsZV9fWENvbnN0cnVjdG9yQ2FsbF9fR3JvdXBfM18yX18wICkqICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE4NDYzOjI6ICggcnVsZV9fWENvbnN0cnVjdG9yQ2FsbF9fR3JvdXBfM18yX18wICkqCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxOTgwMDoxOiAoICggcnVsZV9fWENvbnN0cnVjdG9yQ2FsbF9fR3JvdXBfM18yX18wICkqICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE5ODAxOjI6ICggcnVsZV9fWENvbnN0cnVjdG9yQ2FsbF9fR3JvdXBfM18yX18wICkqCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhDb25zdHJ1Y3RvckNhbGxBY2Nlc3MoKS5nZXRHcm91cF8zXzIoKSk7IAogICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTg0NjQ6MjogKCBydWxlX19YQ29uc3RydWN0b3JDYWxsX19Hcm91cF8zXzJfXzAgKSoKLSAgICAgICAgICAgIGxvb3AxNDg6CisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxOTgwMjoyOiAoIHJ1bGVfX1hDb25zdHJ1Y3RvckNhbGxfX0dyb3VwXzNfMl9fMCApKgorICAgICAgICAgICAgbG9vcDE2MToKICAgICAgICAgICAgIGRvIHsKLSAgICAgICAgICAgICAgICBpbnQgYWx0MTQ4PTI7Ci0gICAgICAgICAgICAgICAgaW50IExBMTQ4XzAgPSBpbnB1dC5MQSgxKTsKKyAgICAgICAgICAgICAgICBpbnQgYWx0MTYxPTI7CisgICAgICAgICAgICAgICAgaW50IExBMTYxXzAgPSBpbnB1dC5MQSgxKTsKIAotICAgICAgICAgICAgICAgIGlmICggKExBMTQ4XzA9PTExNSkgKSB7Ci0gICAgICAgICAgICAgICAgICAgIGFsdDE0OD0xOworICAgICAgICAgICAgICAgIGlmICggKExBMTYxXzA9PTEyNSkgKSB7CisgICAgICAgICAgICAgICAgICAgIGFsdDE2MT0xOwogICAgICAgICAgICAgICAgIH0KIAogCi0gICAgICAgICAgICAgICAgc3dpdGNoIChhbHQxNDgpIHsKKyAgICAgICAgICAgICAgICBzd2l0Y2ggKGFsdDE2MSkgewogICAgICAgICAgICAgCWNhc2UgMSA6Ci0gICAgICAgICAgICAJICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE4NDY0OjM6IHJ1bGVfX1hDb25zdHJ1Y3RvckNhbGxfX0dyb3VwXzNfMl9fMAorICAgICAgICAgICAgCSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxOTgwMjozOiBydWxlX19YQ29uc3RydWN0b3JDYWxsX19Hcm91cF8zXzJfXzAKICAgICAgICAgICAgIAkgICAgewotICAgICAgICAgICAgCSAgICBwdXNoRm9sbG93KEZPTExPV183Myk7CisgICAgICAgICAgICAJICAgIHB1c2hGb2xsb3coRk9MTE9XXzgxKTsKICAgICAgICAgICAgIAkgICAgcnVsZV9fWENvbnN0cnVjdG9yQ2FsbF9fR3JvdXBfM18yX18wKCk7CiAKICAgICAgICAgICAgIAkgICAgc3RhdGUuX2ZzcC0tOwpAQCAtNjA4OTEsNyArNjUzNDgsNyBAQAogICAgICAgICAgICAgCSAgICBicmVhazsKIAogICAgICAgICAgICAgCWRlZmF1bHQgOgotICAgICAgICAgICAgCSAgICBicmVhayBsb29wMTQ4OworICAgICAgICAgICAgCSAgICBicmVhayBsb29wMTYxOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0gd2hpbGUgKHRydWUpOwogCkBAIC02MDkyMCwxNCArNjUzNzcsMTQgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YQ29uc3RydWN0b3JDYWxsX19Hcm91cF8zX18zIgotICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE4NDcyOjE6IHJ1bGVfX1hDb25zdHJ1Y3RvckNhbGxfX0dyb3VwXzNfXzMgOiBydWxlX19YQ29uc3RydWN0b3JDYWxsX19Hcm91cF8zX18zX19JbXBsIDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxOTgxMDoxOiBydWxlX19YQ29uc3RydWN0b3JDYWxsX19Hcm91cF8zX18zIDogcnVsZV9fWENvbnN0cnVjdG9yQ2FsbF9fR3JvdXBfM19fM19fSW1wbCA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fWENvbnN0cnVjdG9yQ2FsbF9fR3JvdXBfM19fMygpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxODQ3NjoxOiAoIHJ1bGVfX1hDb25zdHJ1Y3RvckNhbGxfX0dyb3VwXzNfXzNfX0ltcGwgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTg0Nzc6MjogcnVsZV9fWENvbnN0cnVjdG9yQ2FsbF9fR3JvdXBfM19fM19fSW1wbAorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTk4MTQ6MTogKCBydWxlX19YQ29uc3RydWN0b3JDYWxsX19Hcm91cF8zX18zX19JbXBsICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE5ODE1OjI6IHJ1bGVfX1hDb25zdHJ1Y3RvckNhbGxfX0dyb3VwXzNfXzNfX0ltcGwKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzIpOwogICAgICAgICAgICAgcnVsZV9fWENvbnN0cnVjdG9yQ2FsbF9fR3JvdXBfM19fM19fSW1wbCgpOwpAQCAtNjA5NTMsMTcgKzY1NDEwLDE3IEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fWENvbnN0cnVjdG9yQ2FsbF9fR3JvdXBfM19fM19fSW1wbCIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxODQ4MzoxOiBydWxlX19YQ29uc3RydWN0b3JDYWxsX19Hcm91cF8zX18zX19JbXBsIDogKCAnPicgKSA7CisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTk4MjE6MTogcnVsZV9fWENvbnN0cnVjdG9yQ2FsbF9fR3JvdXBfM19fM19fSW1wbCA6ICggJz4nICkgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1hDb25zdHJ1Y3RvckNhbGxfX0dyb3VwXzNfXzNfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTg0ODc6MTogKCAoICc+JyApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE4NDg4OjE6ICggJz4nICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE5ODI1OjE6ICggKCAnPicgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxOTgyNjoxOiAoICc+JyApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxODQ4ODoxOiAoICc+JyApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxODQ4OToyOiAnPicKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE5ODI2OjE6ICggJz4nICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE5ODI3OjI6ICc+JwogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYQ29uc3RydWN0b3JDYWxsQWNjZXNzKCkuZ2V0R3JlYXRlclRoYW5TaWduS2V5d29yZF8zXzMoKSk7IApAQCAtNjA5OTQsMTYgKzY1NDUxLDE2IEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fWENvbnN0cnVjdG9yQ2FsbF9fR3JvdXBfM18yX18wIgotICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE4NDk5OjE6IHJ1bGVfX1hDb25zdHJ1Y3RvckNhbGxfX0dyb3VwXzNfMl9fMCA6IHJ1bGVfX1hDb25zdHJ1Y3RvckNhbGxfX0dyb3VwXzNfMl9fMF9fSW1wbCBydWxlX19YQ29uc3RydWN0b3JDYWxsX19Hcm91cF8zXzJfXzEgOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE5ODM3OjE6IHJ1bGVfX1hDb25zdHJ1Y3RvckNhbGxfX0dyb3VwXzNfMl9fMCA6IHJ1bGVfX1hDb25zdHJ1Y3RvckNhbGxfX0dyb3VwXzNfMl9fMF9fSW1wbCBydWxlX19YQ29uc3RydWN0b3JDYWxsX19Hcm91cF8zXzJfXzEgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1hDb25zdHJ1Y3RvckNhbGxfX0dyb3VwXzNfMl9fMCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxODUwMzoxOiAoIHJ1bGVfX1hDb25zdHJ1Y3RvckNhbGxfX0dyb3VwXzNfMl9fMF9fSW1wbCBydWxlX19YQ29uc3RydWN0b3JDYWxsX19Hcm91cF8zXzJfXzEgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTg1MDQ6MjogcnVsZV9fWENvbnN0cnVjdG9yQ2FsbF9fR3JvdXBfM18yX18wX19JbXBsIHJ1bGVfX1hDb25zdHJ1Y3RvckNhbGxfX0dyb3VwXzNfMl9fMQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTk4NDE6MTogKCBydWxlX19YQ29uc3RydWN0b3JDYWxsX19Hcm91cF8zXzJfXzBfX0ltcGwgcnVsZV9fWENvbnN0cnVjdG9yQ2FsbF9fR3JvdXBfM18yX18xICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE5ODQyOjI6IHJ1bGVfX1hDb25zdHJ1Y3RvckNhbGxfX0dyb3VwXzNfMl9fMF9fSW1wbCBydWxlX19YQ29uc3RydWN0b3JDYWxsX19Hcm91cF8zXzJfXzEKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzExMCk7CisgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV18xMTgpOwogICAgICAgICAgICAgcnVsZV9fWENvbnN0cnVjdG9yQ2FsbF9fR3JvdXBfM18yX18wX19JbXBsKCk7CiAKICAgICAgICAgICAgIHN0YXRlLl9mc3AtLTsKQEAgLTYxMDMyLDIyICs2NTQ4OSwyMiBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX1hDb25zdHJ1Y3RvckNhbGxfX0dyb3VwXzNfMl9fMF9fSW1wbCIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxODUxMToxOiBydWxlX19YQ29uc3RydWN0b3JDYWxsX19Hcm91cF8zXzJfXzBfX0ltcGwgOiAoICcsJyApIDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxOTg0OToxOiBydWxlX19YQ29uc3RydWN0b3JDYWxsX19Hcm91cF8zXzJfXzBfX0ltcGwgOiAoICcsJyApIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YQ29uc3RydWN0b3JDYWxsX19Hcm91cF8zXzJfXzBfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTg1MTU6MTogKCAoICcsJyApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE4NTE2OjE6ICggJywnICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE5ODUzOjE6ICggKCAnLCcgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxOTg1NDoxOiAoICcsJyApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxODUxNjoxOiAoICcsJyApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxODUxNzoyOiAnLCcKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE5ODU0OjE6ICggJywnICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE5ODU1OjI6ICcsJwogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYQ29uc3RydWN0b3JDYWxsQWNjZXNzKCkuZ2V0Q29tbWFLZXl3b3JkXzNfMl8wKCkpOyAKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1hdGNoKGlucHV0LDExNSxGT0xMT1dfMik7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CisgICAgICAgICAgICBtYXRjaChpbnB1dCwxMjUsRk9MTE9XXzIpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOwogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBhZnRlcihncmFtbWFyQWNjZXNzLmdldFhDb25zdHJ1Y3RvckNhbGxBY2Nlc3MoKS5nZXRDb21tYUtleXdvcmRfM18yXzAoKSk7IAogICAgICAgICAgICAgfQpAQCAtNjEwNzMsMTQgKzY1NTMwLDE0IEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fWENvbnN0cnVjdG9yQ2FsbF9fR3JvdXBfM18yX18xIgotICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE4NTI2OjE6IHJ1bGVfX1hDb25zdHJ1Y3RvckNhbGxfX0dyb3VwXzNfMl9fMSA6IHJ1bGVfX1hDb25zdHJ1Y3RvckNhbGxfX0dyb3VwXzNfMl9fMV9fSW1wbCA7CisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTk4NjQ6MTogcnVsZV9fWENvbnN0cnVjdG9yQ2FsbF9fR3JvdXBfM18yX18xIDogcnVsZV9fWENvbnN0cnVjdG9yQ2FsbF9fR3JvdXBfM18yX18xX19JbXBsIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YQ29uc3RydWN0b3JDYWxsX19Hcm91cF8zXzJfXzEoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTg1MzA6MTogKCBydWxlX19YQ29uc3RydWN0b3JDYWxsX19Hcm91cF8zXzJfXzFfX0ltcGwgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTg1MzE6MjogcnVsZV9fWENvbnN0cnVjdG9yQ2FsbF9fR3JvdXBfM18yX18xX19JbXBsCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxOTg2ODoxOiAoIHJ1bGVfX1hDb25zdHJ1Y3RvckNhbGxfX0dyb3VwXzNfMl9fMV9fSW1wbCApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxOTg2OToyOiBydWxlX19YQ29uc3RydWN0b3JDYWxsX19Hcm91cF8zXzJfXzFfX0ltcGwKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzIpOwogICAgICAgICAgICAgcnVsZV9fWENvbnN0cnVjdG9yQ2FsbF9fR3JvdXBfM18yX18xX19JbXBsKCk7CkBAIC02MTEwNiwyMyArNjU1NjMsMjMgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YQ29uc3RydWN0b3JDYWxsX19Hcm91cF8zXzJfXzFfX0ltcGwiCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTg1Mzc6MTogcnVsZV9fWENvbnN0cnVjdG9yQ2FsbF9fR3JvdXBfM18yX18xX19JbXBsIDogKCAoIHJ1bGVfX1hDb25zdHJ1Y3RvckNhbGxfX1R5cGVBcmd1bWVudHNBc3NpZ25tZW50XzNfMl8xICkgKSA7CisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTk4NzU6MTogcnVsZV9fWENvbnN0cnVjdG9yQ2FsbF9fR3JvdXBfM18yX18xX19JbXBsIDogKCAoIHJ1bGVfX1hDb25zdHJ1Y3RvckNhbGxfX1R5cGVBcmd1bWVudHNBc3NpZ25tZW50XzNfMl8xICkgKSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fWENvbnN0cnVjdG9yQ2FsbF9fR3JvdXBfM18yX18xX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE4NTQxOjE6ICggKCAoIHJ1bGVfX1hDb25zdHJ1Y3RvckNhbGxfX1R5cGVBcmd1bWVudHNBc3NpZ25tZW50XzNfMl8xICkgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxODU0MjoxOiAoICggcnVsZV9fWENvbnN0cnVjdG9yQ2FsbF9fVHlwZUFyZ3VtZW50c0Fzc2lnbm1lbnRfM18yXzEgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxOTg3OToxOiAoICggKCBydWxlX19YQ29uc3RydWN0b3JDYWxsX19UeXBlQXJndW1lbnRzQXNzaWdubWVudF8zXzJfMSApICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTk4ODA6MTogKCAoIHJ1bGVfX1hDb25zdHJ1Y3RvckNhbGxfX1R5cGVBcmd1bWVudHNBc3NpZ25tZW50XzNfMl8xICkgKQogICAgICAgICAgICAgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTg1NDI6MTogKCAoIHJ1bGVfX1hDb25zdHJ1Y3RvckNhbGxfX1R5cGVBcmd1bWVudHNBc3NpZ25tZW50XzNfMl8xICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTg1NDM6MjogKCBydWxlX19YQ29uc3RydWN0b3JDYWxsX19UeXBlQXJndW1lbnRzQXNzaWdubWVudF8zXzJfMSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxOTg4MDoxOiAoICggcnVsZV9fWENvbnN0cnVjdG9yQ2FsbF9fVHlwZUFyZ3VtZW50c0Fzc2lnbm1lbnRfM18yXzEgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxOTg4MToyOiAoIHJ1bGVfX1hDb25zdHJ1Y3RvckNhbGxfX1R5cGVBcmd1bWVudHNBc3NpZ25tZW50XzNfMl8xICkKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WENvbnN0cnVjdG9yQ2FsbEFjY2VzcygpLmdldFR5cGVBcmd1bWVudHNBc3NpZ25tZW50XzNfMl8xKCkpOyAKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE4NTQ0OjI6ICggcnVsZV9fWENvbnN0cnVjdG9yQ2FsbF9fVHlwZUFyZ3VtZW50c0Fzc2lnbm1lbnRfM18yXzEgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTg1NDQ6MzogcnVsZV9fWENvbnN0cnVjdG9yQ2FsbF9fVHlwZUFyZ3VtZW50c0Fzc2lnbm1lbnRfM18yXzEKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE5ODgyOjI6ICggcnVsZV9fWENvbnN0cnVjdG9yQ2FsbF9fVHlwZUFyZ3VtZW50c0Fzc2lnbm1lbnRfM18yXzEgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTk4ODI6MzogcnVsZV9fWENvbnN0cnVjdG9yQ2FsbF9fVHlwZUFyZ3VtZW50c0Fzc2lnbm1lbnRfM18yXzEKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzIpOwogICAgICAgICAgICAgcnVsZV9fWENvbnN0cnVjdG9yQ2FsbF9fVHlwZUFyZ3VtZW50c0Fzc2lnbm1lbnRfM18yXzEoKTsKQEAgLTYxMTU3LDE2ICs2NTYxNCwxNiBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX1hDb25zdHJ1Y3RvckNhbGxfX0dyb3VwXzRfXzAiCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTg1NTM6MTogcnVsZV9fWENvbnN0cnVjdG9yQ2FsbF9fR3JvdXBfNF9fMCA6IHJ1bGVfX1hDb25zdHJ1Y3RvckNhbGxfX0dyb3VwXzRfXzBfX0ltcGwgcnVsZV9fWENvbnN0cnVjdG9yQ2FsbF9fR3JvdXBfNF9fMSA7CisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTk4OTE6MTogcnVsZV9fWENvbnN0cnVjdG9yQ2FsbF9fR3JvdXBfNF9fMCA6IHJ1bGVfX1hDb25zdHJ1Y3RvckNhbGxfX0dyb3VwXzRfXzBfX0ltcGwgcnVsZV9fWENvbnN0cnVjdG9yQ2FsbF9fR3JvdXBfNF9fMSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fWENvbnN0cnVjdG9yQ2FsbF9fR3JvdXBfNF9fMCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxODU1NzoxOiAoIHJ1bGVfX1hDb25zdHJ1Y3RvckNhbGxfX0dyb3VwXzRfXzBfX0ltcGwgcnVsZV9fWENvbnN0cnVjdG9yQ2FsbF9fR3JvdXBfNF9fMSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxODU1ODoyOiBydWxlX19YQ29uc3RydWN0b3JDYWxsX19Hcm91cF80X18wX19JbXBsIHJ1bGVfX1hDb25zdHJ1Y3RvckNhbGxfX0dyb3VwXzRfXzEKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE5ODk1OjE6ICggcnVsZV9fWENvbnN0cnVjdG9yQ2FsbF9fR3JvdXBfNF9fMF9fSW1wbCBydWxlX19YQ29uc3RydWN0b3JDYWxsX19Hcm91cF80X18xICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE5ODk2OjI6IHJ1bGVfX1hDb25zdHJ1Y3RvckNhbGxfX0dyb3VwXzRfXzBfX0ltcGwgcnVsZV9fWENvbnN0cnVjdG9yQ2FsbF9fR3JvdXBfNF9fMQogICAgICAgICAgICAgewotICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMTEyKTsKKyAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzEyMCk7CiAgICAgICAgICAgICBydWxlX19YQ29uc3RydWN0b3JDYWxsX19Hcm91cF80X18wX19JbXBsKCk7CiAKICAgICAgICAgICAgIHN0YXRlLl9mc3AtLTsKQEAgLTYxMTk1LDIzICs2NTY1MiwyMyBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX1hDb25zdHJ1Y3RvckNhbGxfX0dyb3VwXzRfXzBfX0ltcGwiCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTg1NjU6MTogcnVsZV9fWENvbnN0cnVjdG9yQ2FsbF9fR3JvdXBfNF9fMF9fSW1wbCA6ICggKCBydWxlX19YQ29uc3RydWN0b3JDYWxsX19FeHBsaWNpdENvbnN0cnVjdG9yQ2FsbEFzc2lnbm1lbnRfNF8wICkgKSA7CisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTk5MDM6MTogcnVsZV9fWENvbnN0cnVjdG9yQ2FsbF9fR3JvdXBfNF9fMF9fSW1wbCA6ICggKCBydWxlX19YQ29uc3RydWN0b3JDYWxsX19FeHBsaWNpdENvbnN0cnVjdG9yQ2FsbEFzc2lnbm1lbnRfNF8wICkgKSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fWENvbnN0cnVjdG9yQ2FsbF9fR3JvdXBfNF9fMF9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxODU2OToxOiAoICggKCBydWxlX19YQ29uc3RydWN0b3JDYWxsX19FeHBsaWNpdENvbnN0cnVjdG9yQ2FsbEFzc2lnbm1lbnRfNF8wICkgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxODU3MDoxOiAoICggcnVsZV9fWENvbnN0cnVjdG9yQ2FsbF9fRXhwbGljaXRDb25zdHJ1Y3RvckNhbGxBc3NpZ25tZW50XzRfMCApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE5OTA3OjE6ICggKCAoIHJ1bGVfX1hDb25zdHJ1Y3RvckNhbGxfX0V4cGxpY2l0Q29uc3RydWN0b3JDYWxsQXNzaWdubWVudF80XzAgKSApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE5OTA4OjE6ICggKCBydWxlX19YQ29uc3RydWN0b3JDYWxsX19FeHBsaWNpdENvbnN0cnVjdG9yQ2FsbEFzc2lnbm1lbnRfNF8wICkgKQogICAgICAgICAgICAgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTg1NzA6MTogKCAoIHJ1bGVfX1hDb25zdHJ1Y3RvckNhbGxfX0V4cGxpY2l0Q29uc3RydWN0b3JDYWxsQXNzaWdubWVudF80XzAgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxODU3MToyOiAoIHJ1bGVfX1hDb25zdHJ1Y3RvckNhbGxfX0V4cGxpY2l0Q29uc3RydWN0b3JDYWxsQXNzaWdubWVudF80XzAgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTk5MDg6MTogKCAoIHJ1bGVfX1hDb25zdHJ1Y3RvckNhbGxfX0V4cGxpY2l0Q29uc3RydWN0b3JDYWxsQXNzaWdubWVudF80XzAgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxOTkwOToyOiAoIHJ1bGVfX1hDb25zdHJ1Y3RvckNhbGxfX0V4cGxpY2l0Q29uc3RydWN0b3JDYWxsQXNzaWdubWVudF80XzAgKQogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYQ29uc3RydWN0b3JDYWxsQWNjZXNzKCkuZ2V0RXhwbGljaXRDb25zdHJ1Y3RvckNhbGxBc3NpZ25tZW50XzRfMCgpKTsgCiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxODU3MjoyOiAoIHJ1bGVfX1hDb25zdHJ1Y3RvckNhbGxfX0V4cGxpY2l0Q29uc3RydWN0b3JDYWxsQXNzaWdubWVudF80XzAgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTg1NzI6MzogcnVsZV9fWENvbnN0cnVjdG9yQ2FsbF9fRXhwbGljaXRDb25zdHJ1Y3RvckNhbGxBc3NpZ25tZW50XzRfMAorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTk5MTA6MjogKCBydWxlX19YQ29uc3RydWN0b3JDYWxsX19FeHBsaWNpdENvbnN0cnVjdG9yQ2FsbEFzc2lnbm1lbnRfNF8wICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE5OTEwOjM6IHJ1bGVfX1hDb25zdHJ1Y3RvckNhbGxfX0V4cGxpY2l0Q29uc3RydWN0b3JDYWxsQXNzaWdubWVudF80XzAKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzIpOwogICAgICAgICAgICAgcnVsZV9fWENvbnN0cnVjdG9yQ2FsbF9fRXhwbGljaXRDb25zdHJ1Y3RvckNhbGxBc3NpZ25tZW50XzRfMCgpOwpAQCAtNjEyNDYsMTYgKzY1NzAzLDE2IEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fWENvbnN0cnVjdG9yQ2FsbF9fR3JvdXBfNF9fMSIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxODU4MDoxOiBydWxlX19YQ29uc3RydWN0b3JDYWxsX19Hcm91cF80X18xIDogcnVsZV9fWENvbnN0cnVjdG9yQ2FsbF9fR3JvdXBfNF9fMV9fSW1wbCBydWxlX19YQ29uc3RydWN0b3JDYWxsX19Hcm91cF80X18yIDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxOTkxODoxOiBydWxlX19YQ29uc3RydWN0b3JDYWxsX19Hcm91cF80X18xIDogcnVsZV9fWENvbnN0cnVjdG9yQ2FsbF9fR3JvdXBfNF9fMV9fSW1wbCBydWxlX19YQ29uc3RydWN0b3JDYWxsX19Hcm91cF80X18yIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YQ29uc3RydWN0b3JDYWxsX19Hcm91cF80X18xKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE4NTg0OjE6ICggcnVsZV9fWENvbnN0cnVjdG9yQ2FsbF9fR3JvdXBfNF9fMV9fSW1wbCBydWxlX19YQ29uc3RydWN0b3JDYWxsX19Hcm91cF80X18yICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE4NTg1OjI6IHJ1bGVfX1hDb25zdHJ1Y3RvckNhbGxfX0dyb3VwXzRfXzFfX0ltcGwgcnVsZV9fWENvbnN0cnVjdG9yQ2FsbF9fR3JvdXBfNF9fMgorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTk5MjI6MTogKCBydWxlX19YQ29uc3RydWN0b3JDYWxsX19Hcm91cF80X18xX19JbXBsIHJ1bGVfX1hDb25zdHJ1Y3RvckNhbGxfX0dyb3VwXzRfXzIgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTk5MjM6MjogcnVsZV9fWENvbnN0cnVjdG9yQ2FsbF9fR3JvdXBfNF9fMV9fSW1wbCBydWxlX19YQ29uc3RydWN0b3JDYWxsX19Hcm91cF80X18yCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV18xMTIpOworICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMTIwKTsKICAgICAgICAgICAgIHJ1bGVfX1hDb25zdHJ1Y3RvckNhbGxfX0dyb3VwXzRfXzFfX0ltcGwoKTsKIAogICAgICAgICAgICAgc3RhdGUuX2ZzcC0tOwpAQCAtNjEyODQsMzEgKzY1NzQxLDMxIEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fWENvbnN0cnVjdG9yQ2FsbF9fR3JvdXBfNF9fMV9fSW1wbCIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxODU5MjoxOiBydWxlX19YQ29uc3RydWN0b3JDYWxsX19Hcm91cF80X18xX19JbXBsIDogKCAoIHJ1bGVfX1hDb25zdHJ1Y3RvckNhbGxfX0FsdGVybmF0aXZlc180XzEgKT8gKSA7CisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTk5MzA6MTogcnVsZV9fWENvbnN0cnVjdG9yQ2FsbF9fR3JvdXBfNF9fMV9fSW1wbCA6ICggKCBydWxlX19YQ29uc3RydWN0b3JDYWxsX19BbHRlcm5hdGl2ZXNfNF8xICk/ICkgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1hDb25zdHJ1Y3RvckNhbGxfX0dyb3VwXzRfXzFfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTg1OTY6MTogKCAoICggcnVsZV9fWENvbnN0cnVjdG9yQ2FsbF9fQWx0ZXJuYXRpdmVzXzRfMSApPyApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE4NTk3OjE6ICggKCBydWxlX19YQ29uc3RydWN0b3JDYWxsX19BbHRlcm5hdGl2ZXNfNF8xICk/ICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE5OTM0OjE6ICggKCAoIHJ1bGVfX1hDb25zdHJ1Y3RvckNhbGxfX0FsdGVybmF0aXZlc180XzEgKT8gKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxOTkzNToxOiAoICggcnVsZV9fWENvbnN0cnVjdG9yQ2FsbF9fQWx0ZXJuYXRpdmVzXzRfMSApPyApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxODU5NzoxOiAoICggcnVsZV9fWENvbnN0cnVjdG9yQ2FsbF9fQWx0ZXJuYXRpdmVzXzRfMSApPyApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxODU5ODoyOiAoIHJ1bGVfX1hDb25zdHJ1Y3RvckNhbGxfX0FsdGVybmF0aXZlc180XzEgKT8KKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE5OTM1OjE6ICggKCBydWxlX19YQ29uc3RydWN0b3JDYWxsX19BbHRlcm5hdGl2ZXNfNF8xICk/ICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE5OTM2OjI6ICggcnVsZV9fWENvbnN0cnVjdG9yQ2FsbF9fQWx0ZXJuYXRpdmVzXzRfMSApPwogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYQ29uc3RydWN0b3JDYWxsQWNjZXNzKCkuZ2V0QWx0ZXJuYXRpdmVzXzRfMSgpKTsgCiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxODU5OToyOiAoIHJ1bGVfX1hDb25zdHJ1Y3RvckNhbGxfX0FsdGVybmF0aXZlc180XzEgKT8KLSAgICAgICAgICAgIGludCBhbHQxNDk9MjsKLSAgICAgICAgICAgIGludCBMQTE0OV8wID0gaW5wdXQuTEEoMSk7CisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxOTkzNzoyOiAoIHJ1bGVfX1hDb25zdHJ1Y3RvckNhbGxfX0FsdGVybmF0aXZlc180XzEgKT8KKyAgICAgICAgICAgIGludCBhbHQxNjI9MjsKKyAgICAgICAgICAgIGludCBMQTE2Ml8wID0gaW5wdXQuTEEoMSk7CiAKLSAgICAgICAgICAgIGlmICggKChMQTE0OV8wPj1SVUxFX1NUUklORyAmJiBMQTE0OV8wPD1SVUxFX0RFQ0lNQUwpfHxMQTE0OV8wPT0yN3x8TEExNDlfMD09MzF8fChMQTE0OV8wPj0zNCAmJiBMQTE0OV8wPD0zNSl8fExBMTQ5XzA9PTQwfHwoTEExNDlfMD49NDUgJiYgTEExNDlfMDw9NTApfHxMQTE0OV8wPT03MHx8TEExNDlfMD09OTV8fExBMTQ5XzA9PTExM3x8KExBMTQ5XzA+PTExNyAmJiBMQTE0OV8wPD0xMTgpfHxMQTE0OV8wPT0xMjB8fExBMTQ5XzA9PTEyMnx8KExBMTQ5XzA+PTEyNiAmJiBMQTE0OV8wPD0xMzMpfHxMQTE0OV8wPT0xMzV8fExBMTQ5XzA9PTE1Mnx8TEExNDlfMD09MTU0KSApIHsKLSAgICAgICAgICAgICAgICBhbHQxNDk9MTsKKyAgICAgICAgICAgIGlmICggKChMQTE2Ml8wPj1SVUxFX1NUUklORyAmJiBMQTE2Ml8wPD1SVUxFX0RFQ0lNQUwpfHxMQTE2Ml8wPT0yN3x8TEExNjJfMD09MzF8fChMQTE2Ml8wPj0zNCAmJiBMQTE2Ml8wPD0zNSl8fExBMTYyXzA9PTQwfHwoTEExNjJfMD49NDUgJiYgTEExNjJfMDw9NTApfHxMQTE2Ml8wPT03NXx8TEExNjJfMD09MTAyfHxMQTE2Ml8wPT0xMjN8fChMQTE2Ml8wPj0xMjcgJiYgTEExNjJfMDw9MTI4KXx8TEExNjJfMD09MTMwfHxMQTE2Ml8wPT0xMzJ8fChMQTE2Ml8wPj0xMzYgJiYgTEExNjJfMDw9MTQzKXx8TEExNjJfMD09MTQ1fHxMQTE2Ml8wPT0xNjR8fExBMTYyXzA9PTE2NikgKSB7CisgICAgICAgICAgICAgICAgYWx0MTYyPTE7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBzd2l0Y2ggKGFsdDE0OSkgeworICAgICAgICAgICAgc3dpdGNoIChhbHQxNjIpIHsKICAgICAgICAgICAgICAgICBjYXNlIDEgOgotICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxODU5OTozOiBydWxlX19YQ29uc3RydWN0b3JDYWxsX19BbHRlcm5hdGl2ZXNfNF8xCisgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE5OTM3OjM6IHJ1bGVfX1hDb25zdHJ1Y3RvckNhbGxfX0FsdGVybmF0aXZlc180XzEKICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV18yKTsKICAgICAgICAgICAgICAgICAgICAgcnVsZV9fWENvbnN0cnVjdG9yQ2FsbF9fQWx0ZXJuYXRpdmVzXzRfMSgpOwpAQCAtNjEzNDYsMTQgKzY1ODAzLDE0IEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fWENvbnN0cnVjdG9yQ2FsbF9fR3JvdXBfNF9fMiIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxODYwNzoxOiBydWxlX19YQ29uc3RydWN0b3JDYWxsX19Hcm91cF80X18yIDogcnVsZV9fWENvbnN0cnVjdG9yQ2FsbF9fR3JvdXBfNF9fMl9fSW1wbCA7CisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTk5NDU6MTogcnVsZV9fWENvbnN0cnVjdG9yQ2FsbF9fR3JvdXBfNF9fMiA6IHJ1bGVfX1hDb25zdHJ1Y3RvckNhbGxfX0dyb3VwXzRfXzJfX0ltcGwgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1hDb25zdHJ1Y3RvckNhbGxfX0dyb3VwXzRfXzIoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTg2MTE6MTogKCBydWxlX19YQ29uc3RydWN0b3JDYWxsX19Hcm91cF80X18yX19JbXBsICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE4NjEyOjI6IHJ1bGVfX1hDb25zdHJ1Y3RvckNhbGxfX0dyb3VwXzRfXzJfX0ltcGwKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE5OTQ5OjE6ICggcnVsZV9fWENvbnN0cnVjdG9yQ2FsbF9fR3JvdXBfNF9fMl9fSW1wbCApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxOTk1MDoyOiBydWxlX19YQ29uc3RydWN0b3JDYWxsX19Hcm91cF80X18yX19JbXBsCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV18yKTsKICAgICAgICAgICAgIHJ1bGVfX1hDb25zdHJ1Y3RvckNhbGxfX0dyb3VwXzRfXzJfX0ltcGwoKTsKQEAgLTYxMzc5LDIyICs2NTgzNiwyMiBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX1hDb25zdHJ1Y3RvckNhbGxfX0dyb3VwXzRfXzJfX0ltcGwiCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTg2MTg6MTogcnVsZV9fWENvbnN0cnVjdG9yQ2FsbF9fR3JvdXBfNF9fMl9fSW1wbCA6ICggJyknICkgOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE5OTU2OjE6IHJ1bGVfX1hDb25zdHJ1Y3RvckNhbGxfX0dyb3VwXzRfXzJfX0ltcGwgOiAoICcpJyApIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YQ29uc3RydWN0b3JDYWxsX19Hcm91cF80X18yX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE4NjIyOjE6ICggKCAnKScgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxODYyMzoxOiAoICcpJyApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxOTk2MDoxOiAoICggJyknICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTk5NjE6MTogKCAnKScgKQogICAgICAgICAgICAgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTg2MjM6MTogKCAnKScgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTg2MjQ6MjogJyknCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxOTk2MToxOiAoICcpJyApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxOTk2MjoyOiAnKScKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WENvbnN0cnVjdG9yQ2FsbEFjY2VzcygpLmdldFJpZ2h0UGFyZW50aGVzaXNLZXl3b3JkXzRfMigpKTsgCiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBtYXRjaChpbnB1dCwxMTQsRk9MTE9XXzIpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOworICAgICAgICAgICAgbWF0Y2goaW5wdXQsMTI0LEZPTExPV18yKTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRYQ29uc3RydWN0b3JDYWxsQWNjZXNzKCkuZ2V0UmlnaHRQYXJlbnRoZXNpc0tleXdvcmRfNF8yKCkpOyAKICAgICAgICAgICAgIH0KQEAgLTYxNDIwLDE2ICs2NTg3NywxNiBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX1hDb25zdHJ1Y3RvckNhbGxfX0dyb3VwXzRfMV8xX18wIgotICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE4NjM0OjE6IHJ1bGVfX1hDb25zdHJ1Y3RvckNhbGxfX0dyb3VwXzRfMV8xX18wIDogcnVsZV9fWENvbnN0cnVjdG9yQ2FsbF9fR3JvdXBfNF8xXzFfXzBfX0ltcGwgcnVsZV9fWENvbnN0cnVjdG9yQ2FsbF9fR3JvdXBfNF8xXzFfXzEgOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE5OTcyOjE6IHJ1bGVfX1hDb25zdHJ1Y3RvckNhbGxfX0dyb3VwXzRfMV8xX18wIDogcnVsZV9fWENvbnN0cnVjdG9yQ2FsbF9fR3JvdXBfNF8xXzFfXzBfX0ltcGwgcnVsZV9fWENvbnN0cnVjdG9yQ2FsbF9fR3JvdXBfNF8xXzFfXzEgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1hDb25zdHJ1Y3RvckNhbGxfX0dyb3VwXzRfMV8xX18wKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE4NjM4OjE6ICggcnVsZV9fWENvbnN0cnVjdG9yQ2FsbF9fR3JvdXBfNF8xXzFfXzBfX0ltcGwgcnVsZV9fWENvbnN0cnVjdG9yQ2FsbF9fR3JvdXBfNF8xXzFfXzEgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTg2Mzk6MjogcnVsZV9fWENvbnN0cnVjdG9yQ2FsbF9fR3JvdXBfNF8xXzFfXzBfX0ltcGwgcnVsZV9fWENvbnN0cnVjdG9yQ2FsbF9fR3JvdXBfNF8xXzFfXzEKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE5OTc2OjE6ICggcnVsZV9fWENvbnN0cnVjdG9yQ2FsbF9fR3JvdXBfNF8xXzFfXzBfX0ltcGwgcnVsZV9fWENvbnN0cnVjdG9yQ2FsbF9fR3JvdXBfNF8xXzFfXzEgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTk5Nzc6MjogcnVsZV9fWENvbnN0cnVjdG9yQ2FsbF9fR3JvdXBfNF8xXzFfXzBfX0ltcGwgcnVsZV9fWENvbnN0cnVjdG9yQ2FsbF9fR3JvdXBfNF8xXzFfXzEKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzcyKTsKKyAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzgwKTsKICAgICAgICAgICAgIHJ1bGVfX1hDb25zdHJ1Y3RvckNhbGxfX0dyb3VwXzRfMV8xX18wX19JbXBsKCk7CiAKICAgICAgICAgICAgIHN0YXRlLl9mc3AtLTsKQEAgLTYxNDU4LDIzICs2NTkxNSwyMyBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX1hDb25zdHJ1Y3RvckNhbGxfX0dyb3VwXzRfMV8xX18wX19JbXBsIgotICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE4NjQ2OjE6IHJ1bGVfX1hDb25zdHJ1Y3RvckNhbGxfX0dyb3VwXzRfMV8xX18wX19JbXBsIDogKCAoIHJ1bGVfX1hDb25zdHJ1Y3RvckNhbGxfX0FyZ3VtZW50c0Fzc2lnbm1lbnRfNF8xXzFfMCApICkgOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE5OTg0OjE6IHJ1bGVfX1hDb25zdHJ1Y3RvckNhbGxfX0dyb3VwXzRfMV8xX18wX19JbXBsIDogKCAoIHJ1bGVfX1hDb25zdHJ1Y3RvckNhbGxfX0FyZ3VtZW50c0Fzc2lnbm1lbnRfNF8xXzFfMCApICkgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1hDb25zdHJ1Y3RvckNhbGxfX0dyb3VwXzRfMV8xX18wX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE4NjUwOjE6ICggKCAoIHJ1bGVfX1hDb25zdHJ1Y3RvckNhbGxfX0FyZ3VtZW50c0Fzc2lnbm1lbnRfNF8xXzFfMCApICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTg2NTE6MTogKCAoIHJ1bGVfX1hDb25zdHJ1Y3RvckNhbGxfX0FyZ3VtZW50c0Fzc2lnbm1lbnRfNF8xXzFfMCApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE5OTg4OjE6ICggKCAoIHJ1bGVfX1hDb25zdHJ1Y3RvckNhbGxfX0FyZ3VtZW50c0Fzc2lnbm1lbnRfNF8xXzFfMCApICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTk5ODk6MTogKCAoIHJ1bGVfX1hDb25zdHJ1Y3RvckNhbGxfX0FyZ3VtZW50c0Fzc2lnbm1lbnRfNF8xXzFfMCApICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE4NjUxOjE6ICggKCBydWxlX19YQ29uc3RydWN0b3JDYWxsX19Bcmd1bWVudHNBc3NpZ25tZW50XzRfMV8xXzAgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxODY1MjoyOiAoIHJ1bGVfX1hDb25zdHJ1Y3RvckNhbGxfX0FyZ3VtZW50c0Fzc2lnbm1lbnRfNF8xXzFfMCApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxOTk4OToxOiAoICggcnVsZV9fWENvbnN0cnVjdG9yQ2FsbF9fQXJndW1lbnRzQXNzaWdubWVudF80XzFfMV8wICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTk5OTA6MjogKCBydWxlX19YQ29uc3RydWN0b3JDYWxsX19Bcmd1bWVudHNBc3NpZ25tZW50XzRfMV8xXzAgKQogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYQ29uc3RydWN0b3JDYWxsQWNjZXNzKCkuZ2V0QXJndW1lbnRzQXNzaWdubWVudF80XzFfMV8wKCkpOyAKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE4NjUzOjI6ICggcnVsZV9fWENvbnN0cnVjdG9yQ2FsbF9fQXJndW1lbnRzQXNzaWdubWVudF80XzFfMV8wICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE4NjUzOjM6IHJ1bGVfX1hDb25zdHJ1Y3RvckNhbGxfX0FyZ3VtZW50c0Fzc2lnbm1lbnRfNF8xXzFfMAorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTk5OTE6MjogKCBydWxlX19YQ29uc3RydWN0b3JDYWxsX19Bcmd1bWVudHNBc3NpZ25tZW50XzRfMV8xXzAgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTk5OTE6MzogcnVsZV9fWENvbnN0cnVjdG9yQ2FsbF9fQXJndW1lbnRzQXNzaWdubWVudF80XzFfMV8wCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV18yKTsKICAgICAgICAgICAgIHJ1bGVfX1hDb25zdHJ1Y3RvckNhbGxfX0FyZ3VtZW50c0Fzc2lnbm1lbnRfNF8xXzFfMCgpOwpAQCAtNjE1MDksMTQgKzY1OTY2LDE0IEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fWENvbnN0cnVjdG9yQ2FsbF9fR3JvdXBfNF8xXzFfXzEiCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTg2NjE6MTogcnVsZV9fWENvbnN0cnVjdG9yQ2FsbF9fR3JvdXBfNF8xXzFfXzEgOiBydWxlX19YQ29uc3RydWN0b3JDYWxsX19Hcm91cF80XzFfMV9fMV9fSW1wbCA7CisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTk5OTk6MTogcnVsZV9fWENvbnN0cnVjdG9yQ2FsbF9fR3JvdXBfNF8xXzFfXzEgOiBydWxlX19YQ29uc3RydWN0b3JDYWxsX19Hcm91cF80XzFfMV9fMV9fSW1wbCA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fWENvbnN0cnVjdG9yQ2FsbF9fR3JvdXBfNF8xXzFfXzEoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTg2NjU6MTogKCBydWxlX19YQ29uc3RydWN0b3JDYWxsX19Hcm91cF80XzFfMV9fMV9fSW1wbCApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxODY2NjoyOiBydWxlX19YQ29uc3RydWN0b3JDYWxsX19Hcm91cF80XzFfMV9fMV9fSW1wbAorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjAwMDM6MTogKCBydWxlX19YQ29uc3RydWN0b3JDYWxsX19Hcm91cF80XzFfMV9fMV9fSW1wbCApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMDAwNDoyOiBydWxlX19YQ29uc3RydWN0b3JDYWxsX19Hcm91cF80XzFfMV9fMV9fSW1wbAogICAgICAgICAgICAgewogICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMik7CiAgICAgICAgICAgICBydWxlX19YQ29uc3RydWN0b3JDYWxsX19Hcm91cF80XzFfMV9fMV9fSW1wbCgpOwpAQCAtNjE1NDIsMzcgKzY1OTk5LDM3IEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fWENvbnN0cnVjdG9yQ2FsbF9fR3JvdXBfNF8xXzFfXzFfX0ltcGwiCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTg2NzI6MTogcnVsZV9fWENvbnN0cnVjdG9yQ2FsbF9fR3JvdXBfNF8xXzFfXzFfX0ltcGwgOiAoICggcnVsZV9fWENvbnN0cnVjdG9yQ2FsbF9fR3JvdXBfNF8xXzFfMV9fMCApKiApIDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMDAxMDoxOiBydWxlX19YQ29uc3RydWN0b3JDYWxsX19Hcm91cF80XzFfMV9fMV9fSW1wbCA6ICggKCBydWxlX19YQ29uc3RydWN0b3JDYWxsX19Hcm91cF80XzFfMV8xX18wICkqICkgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1hDb25zdHJ1Y3RvckNhbGxfX0dyb3VwXzRfMV8xX18xX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE4Njc2OjE6ICggKCAoIHJ1bGVfX1hDb25zdHJ1Y3RvckNhbGxfX0dyb3VwXzRfMV8xXzFfXzAgKSogKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxODY3NzoxOiAoICggcnVsZV9fWENvbnN0cnVjdG9yQ2FsbF9fR3JvdXBfNF8xXzFfMV9fMCApKiApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMDAxNDoxOiAoICggKCBydWxlX19YQ29uc3RydWN0b3JDYWxsX19Hcm91cF80XzFfMV8xX18wICkqICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjAwMTU6MTogKCAoIHJ1bGVfX1hDb25zdHJ1Y3RvckNhbGxfX0dyb3VwXzRfMV8xXzFfXzAgKSogKQogICAgICAgICAgICAgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTg2Nzc6MTogKCAoIHJ1bGVfX1hDb25zdHJ1Y3RvckNhbGxfX0dyb3VwXzRfMV8xXzFfXzAgKSogKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTg2Nzg6MjogKCBydWxlX19YQ29uc3RydWN0b3JDYWxsX19Hcm91cF80XzFfMV8xX18wICkqCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMDAxNToxOiAoICggcnVsZV9fWENvbnN0cnVjdG9yQ2FsbF9fR3JvdXBfNF8xXzFfMV9fMCApKiApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMDAxNjoyOiAoIHJ1bGVfX1hDb25zdHJ1Y3RvckNhbGxfX0dyb3VwXzRfMV8xXzFfXzAgKSoKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WENvbnN0cnVjdG9yQ2FsbEFjY2VzcygpLmdldEdyb3VwXzRfMV8xXzEoKSk7IAogICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTg2Nzk6MjogKCBydWxlX19YQ29uc3RydWN0b3JDYWxsX19Hcm91cF80XzFfMV8xX18wICkqCi0gICAgICAgICAgICBsb29wMTUwOgorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjAwMTc6MjogKCBydWxlX19YQ29uc3RydWN0b3JDYWxsX19Hcm91cF80XzFfMV8xX18wICkqCisgICAgICAgICAgICBsb29wMTYzOgogICAgICAgICAgICAgZG8gewotICAgICAgICAgICAgICAgIGludCBhbHQxNTA9MjsKLSAgICAgICAgICAgICAgICBpbnQgTEExNTBfMCA9IGlucHV0LkxBKDEpOworICAgICAgICAgICAgICAgIGludCBhbHQxNjM9MjsKKyAgICAgICAgICAgICAgICBpbnQgTEExNjNfMCA9IGlucHV0LkxBKDEpOwogCi0gICAgICAgICAgICAgICAgaWYgKCAoTEExNTBfMD09MTE1KSApIHsKLSAgICAgICAgICAgICAgICAgICAgYWx0MTUwPTE7CisgICAgICAgICAgICAgICAgaWYgKCAoTEExNjNfMD09MTI1KSApIHsKKyAgICAgICAgICAgICAgICAgICAgYWx0MTYzPTE7CiAgICAgICAgICAgICAgICAgfQogCiAKLSAgICAgICAgICAgICAgICBzd2l0Y2ggKGFsdDE1MCkgeworICAgICAgICAgICAgICAgIHN3aXRjaCAoYWx0MTYzKSB7CiAgICAgICAgICAgICAJY2FzZSAxIDoKLSAgICAgICAgICAgIAkgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTg2Nzk6MzogcnVsZV9fWENvbnN0cnVjdG9yQ2FsbF9fR3JvdXBfNF8xXzFfMV9fMAorICAgICAgICAgICAgCSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMDAxNzozOiBydWxlX19YQ29uc3RydWN0b3JDYWxsX19Hcm91cF80XzFfMV8xX18wCiAgICAgICAgICAgICAJICAgIHsKLSAgICAgICAgICAgIAkgICAgcHVzaEZvbGxvdyhGT0xMT1dfNzMpOworICAgICAgICAgICAgCSAgICBwdXNoRm9sbG93KEZPTExPV184MSk7CiAgICAgICAgICAgICAJICAgIHJ1bGVfX1hDb25zdHJ1Y3RvckNhbGxfX0dyb3VwXzRfMV8xXzFfXzAoKTsKIAogICAgICAgICAgICAgCSAgICBzdGF0ZS5fZnNwLS07CkBAIC02MTU4Miw3ICs2NjAzOSw3IEBACiAgICAgICAgICAgICAJICAgIGJyZWFrOwogCiAgICAgICAgICAgICAJZGVmYXVsdCA6Ci0gICAgICAgICAgICAJICAgIGJyZWFrIGxvb3AxNTA7CisgICAgICAgICAgICAJICAgIGJyZWFrIGxvb3AxNjM7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfSB3aGlsZSAodHJ1ZSk7CiAKQEAgLTYxNjExLDE2ICs2NjA2OCwxNiBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX1hDb25zdHJ1Y3RvckNhbGxfX0dyb3VwXzRfMV8xXzFfXzAiCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTg2ODg6MTogcnVsZV9fWENvbnN0cnVjdG9yQ2FsbF9fR3JvdXBfNF8xXzFfMV9fMCA6IHJ1bGVfX1hDb25zdHJ1Y3RvckNhbGxfX0dyb3VwXzRfMV8xXzFfXzBfX0ltcGwgcnVsZV9fWENvbnN0cnVjdG9yQ2FsbF9fR3JvdXBfNF8xXzFfMV9fMSA7CisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjAwMjY6MTogcnVsZV9fWENvbnN0cnVjdG9yQ2FsbF9fR3JvdXBfNF8xXzFfMV9fMCA6IHJ1bGVfX1hDb25zdHJ1Y3RvckNhbGxfX0dyb3VwXzRfMV8xXzFfXzBfX0ltcGwgcnVsZV9fWENvbnN0cnVjdG9yQ2FsbF9fR3JvdXBfNF8xXzFfMV9fMSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fWENvbnN0cnVjdG9yQ2FsbF9fR3JvdXBfNF8xXzFfMV9fMCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxODY5MjoxOiAoIHJ1bGVfX1hDb25zdHJ1Y3RvckNhbGxfX0dyb3VwXzRfMV8xXzFfXzBfX0ltcGwgcnVsZV9fWENvbnN0cnVjdG9yQ2FsbF9fR3JvdXBfNF8xXzFfMV9fMSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxODY5MzoyOiBydWxlX19YQ29uc3RydWN0b3JDYWxsX19Hcm91cF80XzFfMV8xX18wX19JbXBsIHJ1bGVfX1hDb25zdHJ1Y3RvckNhbGxfX0dyb3VwXzRfMV8xXzFfXzEKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIwMDMwOjE6ICggcnVsZV9fWENvbnN0cnVjdG9yQ2FsbF9fR3JvdXBfNF8xXzFfMV9fMF9fSW1wbCBydWxlX19YQ29uc3RydWN0b3JDYWxsX19Hcm91cF80XzFfMV8xX18xICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIwMDMxOjI6IHJ1bGVfX1hDb25zdHJ1Y3RvckNhbGxfX0dyb3VwXzRfMV8xXzFfXzBfX0ltcGwgcnVsZV9fWENvbnN0cnVjdG9yQ2FsbF9fR3JvdXBfNF8xXzFfMV9fMQogICAgICAgICAgICAgewotICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfNzQpOworICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfODIpOwogICAgICAgICAgICAgcnVsZV9fWENvbnN0cnVjdG9yQ2FsbF9fR3JvdXBfNF8xXzFfMV9fMF9fSW1wbCgpOwogCiAgICAgICAgICAgICBzdGF0ZS5fZnNwLS07CkBAIC02MTY0OSwyMiArNjYxMDYsMjIgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YQ29uc3RydWN0b3JDYWxsX19Hcm91cF80XzFfMV8xX18wX19JbXBsIgotICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE4NzAwOjE6IHJ1bGVfX1hDb25zdHJ1Y3RvckNhbGxfX0dyb3VwXzRfMV8xXzFfXzBfX0ltcGwgOiAoICcsJyApIDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMDAzODoxOiBydWxlX19YQ29uc3RydWN0b3JDYWxsX19Hcm91cF80XzFfMV8xX18wX19JbXBsIDogKCAnLCcgKSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fWENvbnN0cnVjdG9yQ2FsbF9fR3JvdXBfNF8xXzFfMV9fMF9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxODcwNDoxOiAoICggJywnICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTg3MDU6MTogKCAnLCcgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjAwNDI6MTogKCAoICcsJyApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIwMDQzOjE6ICggJywnICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE4NzA1OjE6ICggJywnICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE4NzA2OjI6ICcsJworICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjAwNDM6MTogKCAnLCcgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjAwNDQ6MjogJywnCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhDb25zdHJ1Y3RvckNhbGxBY2Nlc3MoKS5nZXRDb21tYUtleXdvcmRfNF8xXzFfMV8wKCkpOyAKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1hdGNoKGlucHV0LDExNSxGT0xMT1dfMik7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CisgICAgICAgICAgICBtYXRjaChpbnB1dCwxMjUsRk9MTE9XXzIpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOwogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBhZnRlcihncmFtbWFyQWNjZXNzLmdldFhDb25zdHJ1Y3RvckNhbGxBY2Nlc3MoKS5nZXRDb21tYUtleXdvcmRfNF8xXzFfMV8wKCkpOyAKICAgICAgICAgICAgIH0KQEAgLTYxNjkwLDE0ICs2NjE0NywxNCBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX1hDb25zdHJ1Y3RvckNhbGxfX0dyb3VwXzRfMV8xXzFfXzEiCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTg3MTU6MTogcnVsZV9fWENvbnN0cnVjdG9yQ2FsbF9fR3JvdXBfNF8xXzFfMV9fMSA6IHJ1bGVfX1hDb25zdHJ1Y3RvckNhbGxfX0dyb3VwXzRfMV8xXzFfXzFfX0ltcGwgOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIwMDUzOjE6IHJ1bGVfX1hDb25zdHJ1Y3RvckNhbGxfX0dyb3VwXzRfMV8xXzFfXzEgOiBydWxlX19YQ29uc3RydWN0b3JDYWxsX19Hcm91cF80XzFfMV8xX18xX19JbXBsIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YQ29uc3RydWN0b3JDYWxsX19Hcm91cF80XzFfMV8xX18xKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE4NzE5OjE6ICggcnVsZV9fWENvbnN0cnVjdG9yQ2FsbF9fR3JvdXBfNF8xXzFfMV9fMV9fSW1wbCApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxODcyMDoyOiBydWxlX19YQ29uc3RydWN0b3JDYWxsX19Hcm91cF80XzFfMV8xX18xX19JbXBsCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMDA1NzoxOiAoIHJ1bGVfX1hDb25zdHJ1Y3RvckNhbGxfX0dyb3VwXzRfMV8xXzFfXzFfX0ltcGwgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjAwNTg6MjogcnVsZV9fWENvbnN0cnVjdG9yQ2FsbF9fR3JvdXBfNF8xXzFfMV9fMV9fSW1wbAogICAgICAgICAgICAgewogICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMik7CiAgICAgICAgICAgICBydWxlX19YQ29uc3RydWN0b3JDYWxsX19Hcm91cF80XzFfMV8xX18xX19JbXBsKCk7CkBAIC02MTcyMywyMyArNjYxODAsMjMgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YQ29uc3RydWN0b3JDYWxsX19Hcm91cF80XzFfMV8xX18xX19JbXBsIgotICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE4NzI2OjE6IHJ1bGVfX1hDb25zdHJ1Y3RvckNhbGxfX0dyb3VwXzRfMV8xXzFfXzFfX0ltcGwgOiAoICggcnVsZV9fWENvbnN0cnVjdG9yQ2FsbF9fQXJndW1lbnRzQXNzaWdubWVudF80XzFfMV8xXzEgKSApIDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMDA2NDoxOiBydWxlX19YQ29uc3RydWN0b3JDYWxsX19Hcm91cF80XzFfMV8xX18xX19JbXBsIDogKCAoIHJ1bGVfX1hDb25zdHJ1Y3RvckNhbGxfX0FyZ3VtZW50c0Fzc2lnbm1lbnRfNF8xXzFfMV8xICkgKSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fWENvbnN0cnVjdG9yQ2FsbF9fR3JvdXBfNF8xXzFfMV9fMV9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxODczMDoxOiAoICggKCBydWxlX19YQ29uc3RydWN0b3JDYWxsX19Bcmd1bWVudHNBc3NpZ25tZW50XzRfMV8xXzFfMSApICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTg3MzE6MTogKCAoIHJ1bGVfX1hDb25zdHJ1Y3RvckNhbGxfX0FyZ3VtZW50c0Fzc2lnbm1lbnRfNF8xXzFfMV8xICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjAwNjg6MTogKCAoICggcnVsZV9fWENvbnN0cnVjdG9yQ2FsbF9fQXJndW1lbnRzQXNzaWdubWVudF80XzFfMV8xXzEgKSApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIwMDY5OjE6ICggKCBydWxlX19YQ29uc3RydWN0b3JDYWxsX19Bcmd1bWVudHNBc3NpZ25tZW50XzRfMV8xXzFfMSApICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE4NzMxOjE6ICggKCBydWxlX19YQ29uc3RydWN0b3JDYWxsX19Bcmd1bWVudHNBc3NpZ25tZW50XzRfMV8xXzFfMSApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE4NzMyOjI6ICggcnVsZV9fWENvbnN0cnVjdG9yQ2FsbF9fQXJndW1lbnRzQXNzaWdubWVudF80XzFfMV8xXzEgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjAwNjk6MTogKCAoIHJ1bGVfX1hDb25zdHJ1Y3RvckNhbGxfX0FyZ3VtZW50c0Fzc2lnbm1lbnRfNF8xXzFfMV8xICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjAwNzA6MjogKCBydWxlX19YQ29uc3RydWN0b3JDYWxsX19Bcmd1bWVudHNBc3NpZ25tZW50XzRfMV8xXzFfMSApCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhDb25zdHJ1Y3RvckNhbGxBY2Nlc3MoKS5nZXRBcmd1bWVudHNBc3NpZ25tZW50XzRfMV8xXzFfMSgpKTsgCiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxODczMzoyOiAoIHJ1bGVfX1hDb25zdHJ1Y3RvckNhbGxfX0FyZ3VtZW50c0Fzc2lnbm1lbnRfNF8xXzFfMV8xICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE4NzMzOjM6IHJ1bGVfX1hDb25zdHJ1Y3RvckNhbGxfX0FyZ3VtZW50c0Fzc2lnbm1lbnRfNF8xXzFfMV8xCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMDA3MToyOiAoIHJ1bGVfX1hDb25zdHJ1Y3RvckNhbGxfX0FyZ3VtZW50c0Fzc2lnbm1lbnRfNF8xXzFfMV8xICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIwMDcxOjM6IHJ1bGVfX1hDb25zdHJ1Y3RvckNhbGxfX0FyZ3VtZW50c0Fzc2lnbm1lbnRfNF8xXzFfMV8xCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV18yKTsKICAgICAgICAgICAgIHJ1bGVfX1hDb25zdHJ1Y3RvckNhbGxfX0FyZ3VtZW50c0Fzc2lnbm1lbnRfNF8xXzFfMV8xKCk7CkBAIC02MTc3NCwxNiArNjYyMzEsMTYgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YQm9vbGVhbkxpdGVyYWxfX0dyb3VwX18wIgotICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE4NzQyOjE6IHJ1bGVfX1hCb29sZWFuTGl0ZXJhbF9fR3JvdXBfXzAgOiBydWxlX19YQm9vbGVhbkxpdGVyYWxfX0dyb3VwX18wX19JbXBsIHJ1bGVfX1hCb29sZWFuTGl0ZXJhbF9fR3JvdXBfXzEgOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIwMDgwOjE6IHJ1bGVfX1hCb29sZWFuTGl0ZXJhbF9fR3JvdXBfXzAgOiBydWxlX19YQm9vbGVhbkxpdGVyYWxfX0dyb3VwX18wX19JbXBsIHJ1bGVfX1hCb29sZWFuTGl0ZXJhbF9fR3JvdXBfXzEgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1hCb29sZWFuTGl0ZXJhbF9fR3JvdXBfXzAoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTg3NDY6MTogKCBydWxlX19YQm9vbGVhbkxpdGVyYWxfX0dyb3VwX18wX19JbXBsIHJ1bGVfX1hCb29sZWFuTGl0ZXJhbF9fR3JvdXBfXzEgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTg3NDc6MjogcnVsZV9fWEJvb2xlYW5MaXRlcmFsX19Hcm91cF9fMF9fSW1wbCBydWxlX19YQm9vbGVhbkxpdGVyYWxfX0dyb3VwX18xCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMDA4NDoxOiAoIHJ1bGVfX1hCb29sZWFuTGl0ZXJhbF9fR3JvdXBfXzBfX0ltcGwgcnVsZV9fWEJvb2xlYW5MaXRlcmFsX19Hcm91cF9fMSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMDA4NToyOiBydWxlX19YQm9vbGVhbkxpdGVyYWxfX0dyb3VwX18wX19JbXBsIHJ1bGVfX1hCb29sZWFuTGl0ZXJhbF9fR3JvdXBfXzEKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzEzNik7CisgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV18xNDQpOwogICAgICAgICAgICAgcnVsZV9fWEJvb2xlYW5MaXRlcmFsX19Hcm91cF9fMF9fSW1wbCgpOwogCiAgICAgICAgICAgICBzdGF0ZS5fZnNwLS07CkBAIC02MTgxMiwyMyArNjYyNjksMjMgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YQm9vbGVhbkxpdGVyYWxfX0dyb3VwX18wX19JbXBsIgotICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE4NzU0OjE6IHJ1bGVfX1hCb29sZWFuTGl0ZXJhbF9fR3JvdXBfXzBfX0ltcGwgOiAoICgpICkgOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIwMDkyOjE6IHJ1bGVfX1hCb29sZWFuTGl0ZXJhbF9fR3JvdXBfXzBfX0ltcGwgOiAoICgpICkgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1hCb29sZWFuTGl0ZXJhbF9fR3JvdXBfXzBfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTg3NTg6MTogKCAoICgpICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTg3NTk6MTogKCAoKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMDA5NjoxOiAoICggKCkgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMDA5NzoxOiAoICgpICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE4NzU5OjE6ICggKCkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTg3NjA6MjogKCkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIwMDk3OjE6ICggKCkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjAwOTg6MjogKCkKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WEJvb2xlYW5MaXRlcmFsQWNjZXNzKCkuZ2V0WEJvb2xlYW5MaXRlcmFsQWN0aW9uXzAoKSk7IAogICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTg3NjE6MjogKCkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE4NzYxOjM6IAorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjAwOTk6MjogKCkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIwMDk5OjM6IAogICAgICAgICAgICAgewogICAgICAgICAgICAgfQogCkBAIC02MTg1MywxNCArNjYzMTAsMTQgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YQm9vbGVhbkxpdGVyYWxfX0dyb3VwX18xIgotICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE4NzY5OjE6IHJ1bGVfX1hCb29sZWFuTGl0ZXJhbF9fR3JvdXBfXzEgOiBydWxlX19YQm9vbGVhbkxpdGVyYWxfX0dyb3VwX18xX19JbXBsIDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMDEwNzoxOiBydWxlX19YQm9vbGVhbkxpdGVyYWxfX0dyb3VwX18xIDogcnVsZV9fWEJvb2xlYW5MaXRlcmFsX19Hcm91cF9fMV9fSW1wbCA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fWEJvb2xlYW5MaXRlcmFsX19Hcm91cF9fMSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxODc3MzoxOiAoIHJ1bGVfX1hCb29sZWFuTGl0ZXJhbF9fR3JvdXBfXzFfX0ltcGwgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTg3NzQ6MjogcnVsZV9fWEJvb2xlYW5MaXRlcmFsX19Hcm91cF9fMV9fSW1wbAorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjAxMTE6MTogKCBydWxlX19YQm9vbGVhbkxpdGVyYWxfX0dyb3VwX18xX19JbXBsICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIwMTEyOjI6IHJ1bGVfX1hCb29sZWFuTGl0ZXJhbF9fR3JvdXBfXzFfX0ltcGwKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzIpOwogICAgICAgICAgICAgcnVsZV9fWEJvb2xlYW5MaXRlcmFsX19Hcm91cF9fMV9fSW1wbCgpOwpAQCAtNjE4ODYsMjMgKzY2MzQzLDIzIEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fWEJvb2xlYW5MaXRlcmFsX19Hcm91cF9fMV9fSW1wbCIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxODc4MDoxOiBydWxlX19YQm9vbGVhbkxpdGVyYWxfX0dyb3VwX18xX19JbXBsIDogKCAoIHJ1bGVfX1hCb29sZWFuTGl0ZXJhbF9fQWx0ZXJuYXRpdmVzXzEgKSApIDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMDExODoxOiBydWxlX19YQm9vbGVhbkxpdGVyYWxfX0dyb3VwX18xX19JbXBsIDogKCAoIHJ1bGVfX1hCb29sZWFuTGl0ZXJhbF9fQWx0ZXJuYXRpdmVzXzEgKSApIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YQm9vbGVhbkxpdGVyYWxfX0dyb3VwX18xX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE4Nzg0OjE6ICggKCAoIHJ1bGVfX1hCb29sZWFuTGl0ZXJhbF9fQWx0ZXJuYXRpdmVzXzEgKSApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE4Nzg1OjE6ICggKCBydWxlX19YQm9vbGVhbkxpdGVyYWxfX0FsdGVybmF0aXZlc18xICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjAxMjI6MTogKCAoICggcnVsZV9fWEJvb2xlYW5MaXRlcmFsX19BbHRlcm5hdGl2ZXNfMSApICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjAxMjM6MTogKCAoIHJ1bGVfX1hCb29sZWFuTGl0ZXJhbF9fQWx0ZXJuYXRpdmVzXzEgKSApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxODc4NToxOiAoICggcnVsZV9fWEJvb2xlYW5MaXRlcmFsX19BbHRlcm5hdGl2ZXNfMSApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE4Nzg2OjI6ICggcnVsZV9fWEJvb2xlYW5MaXRlcmFsX19BbHRlcm5hdGl2ZXNfMSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMDEyMzoxOiAoICggcnVsZV9fWEJvb2xlYW5MaXRlcmFsX19BbHRlcm5hdGl2ZXNfMSApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIwMTI0OjI6ICggcnVsZV9fWEJvb2xlYW5MaXRlcmFsX19BbHRlcm5hdGl2ZXNfMSApCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhCb29sZWFuTGl0ZXJhbEFjY2VzcygpLmdldEFsdGVybmF0aXZlc18xKCkpOyAKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE4Nzg3OjI6ICggcnVsZV9fWEJvb2xlYW5MaXRlcmFsX19BbHRlcm5hdGl2ZXNfMSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxODc4NzozOiBydWxlX19YQm9vbGVhbkxpdGVyYWxfX0FsdGVybmF0aXZlc18xCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMDEyNToyOiAoIHJ1bGVfX1hCb29sZWFuTGl0ZXJhbF9fQWx0ZXJuYXRpdmVzXzEgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjAxMjU6MzogcnVsZV9fWEJvb2xlYW5MaXRlcmFsX19BbHRlcm5hdGl2ZXNfMQogICAgICAgICAgICAgewogICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMik7CiAgICAgICAgICAgICBydWxlX19YQm9vbGVhbkxpdGVyYWxfX0FsdGVybmF0aXZlc18xKCk7CkBAIC02MTkzNywxNiArNjYzOTQsMTYgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YTnVsbExpdGVyYWxfX0dyb3VwX18wIgotICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE4Nzk2OjE6IHJ1bGVfX1hOdWxsTGl0ZXJhbF9fR3JvdXBfXzAgOiBydWxlX19YTnVsbExpdGVyYWxfX0dyb3VwX18wX19JbXBsIHJ1bGVfX1hOdWxsTGl0ZXJhbF9fR3JvdXBfXzEgOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIwMTM0OjE6IHJ1bGVfX1hOdWxsTGl0ZXJhbF9fR3JvdXBfXzAgOiBydWxlX19YTnVsbExpdGVyYWxfX0dyb3VwX18wX19JbXBsIHJ1bGVfX1hOdWxsTGl0ZXJhbF9fR3JvdXBfXzEgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1hOdWxsTGl0ZXJhbF9fR3JvdXBfXzAoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTg4MDA6MTogKCBydWxlX19YTnVsbExpdGVyYWxfX0dyb3VwX18wX19JbXBsIHJ1bGVfX1hOdWxsTGl0ZXJhbF9fR3JvdXBfXzEgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTg4MDE6MjogcnVsZV9fWE51bGxMaXRlcmFsX19Hcm91cF9fMF9fSW1wbCBydWxlX19YTnVsbExpdGVyYWxfX0dyb3VwX18xCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMDEzODoxOiAoIHJ1bGVfX1hOdWxsTGl0ZXJhbF9fR3JvdXBfXzBfX0ltcGwgcnVsZV9fWE51bGxMaXRlcmFsX19Hcm91cF9fMSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMDEzOToyOiBydWxlX19YTnVsbExpdGVyYWxfX0dyb3VwX18wX19JbXBsIHJ1bGVfX1hOdWxsTGl0ZXJhbF9fR3JvdXBfXzEKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzEzNyk7CisgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV18xNDUpOwogICAgICAgICAgICAgcnVsZV9fWE51bGxMaXRlcmFsX19Hcm91cF9fMF9fSW1wbCgpOwogCiAgICAgICAgICAgICBzdGF0ZS5fZnNwLS07CkBAIC02MTk3NSwyMyArNjY0MzIsMjMgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YTnVsbExpdGVyYWxfX0dyb3VwX18wX19JbXBsIgotICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE4ODA4OjE6IHJ1bGVfX1hOdWxsTGl0ZXJhbF9fR3JvdXBfXzBfX0ltcGwgOiAoICgpICkgOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIwMTQ2OjE6IHJ1bGVfX1hOdWxsTGl0ZXJhbF9fR3JvdXBfXzBfX0ltcGwgOiAoICgpICkgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1hOdWxsTGl0ZXJhbF9fR3JvdXBfXzBfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTg4MTI6MTogKCAoICgpICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTg4MTM6MTogKCAoKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMDE1MDoxOiAoICggKCkgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMDE1MToxOiAoICgpICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE4ODEzOjE6ICggKCkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTg4MTQ6MjogKCkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIwMTUxOjE6ICggKCkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjAxNTI6MjogKCkKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WE51bGxMaXRlcmFsQWNjZXNzKCkuZ2V0WE51bGxMaXRlcmFsQWN0aW9uXzAoKSk7IAogICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTg4MTU6MjogKCkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE4ODE1OjM6IAorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjAxNTM6MjogKCkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIwMTUzOjM6IAogICAgICAgICAgICAgewogICAgICAgICAgICAgfQogCkBAIC02MjAxNiwxNCArNjY0NzMsMTQgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YTnVsbExpdGVyYWxfX0dyb3VwX18xIgotICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE4ODIzOjE6IHJ1bGVfX1hOdWxsTGl0ZXJhbF9fR3JvdXBfXzEgOiBydWxlX19YTnVsbExpdGVyYWxfX0dyb3VwX18xX19JbXBsIDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMDE2MToxOiBydWxlX19YTnVsbExpdGVyYWxfX0dyb3VwX18xIDogcnVsZV9fWE51bGxMaXRlcmFsX19Hcm91cF9fMV9fSW1wbCA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fWE51bGxMaXRlcmFsX19Hcm91cF9fMSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxODgyNzoxOiAoIHJ1bGVfX1hOdWxsTGl0ZXJhbF9fR3JvdXBfXzFfX0ltcGwgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTg4Mjg6MjogcnVsZV9fWE51bGxMaXRlcmFsX19Hcm91cF9fMV9fSW1wbAorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjAxNjU6MTogKCBydWxlX19YTnVsbExpdGVyYWxfX0dyb3VwX18xX19JbXBsICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIwMTY2OjI6IHJ1bGVfX1hOdWxsTGl0ZXJhbF9fR3JvdXBfXzFfX0ltcGwKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzIpOwogICAgICAgICAgICAgcnVsZV9fWE51bGxMaXRlcmFsX19Hcm91cF9fMV9fSW1wbCgpOwpAQCAtNjIwNDksMjIgKzY2NTA2LDIyIEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fWE51bGxMaXRlcmFsX19Hcm91cF9fMV9fSW1wbCIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxODgzNDoxOiBydWxlX19YTnVsbExpdGVyYWxfX0dyb3VwX18xX19JbXBsIDogKCAnbnVsbCcgKSA7CisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjAxNzI6MTogcnVsZV9fWE51bGxMaXRlcmFsX19Hcm91cF9fMV9fSW1wbCA6ICggJ251bGwnICkgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1hOdWxsTGl0ZXJhbF9fR3JvdXBfXzFfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTg4Mzg6MTogKCAoICdudWxsJyApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE4ODM5OjE6ICggJ251bGwnICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIwMTc2OjE6ICggKCAnbnVsbCcgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMDE3NzoxOiAoICdudWxsJyApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxODgzOToxOiAoICdudWxsJyApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxODg0MDoyOiAnbnVsbCcKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIwMTc3OjE6ICggJ251bGwnICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIwMTc4OjI6ICdudWxsJwogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYTnVsbExpdGVyYWxBY2Nlc3MoKS5nZXROdWxsS2V5d29yZF8xKCkpOyAKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1hdGNoKGlucHV0LDEyOSxGT0xMT1dfMik7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CisgICAgICAgICAgICBtYXRjaChpbnB1dCwxMzksRk9MTE9XXzIpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOwogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBhZnRlcihncmFtbWFyQWNjZXNzLmdldFhOdWxsTGl0ZXJhbEFjY2VzcygpLmdldE51bGxLZXl3b3JkXzEoKSk7IAogICAgICAgICAgICAgfQpAQCAtNjIwOTAsMTYgKzY2NTQ3LDE2IEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fWE51bWJlckxpdGVyYWxfX0dyb3VwX18wIgotICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE4ODUwOjE6IHJ1bGVfX1hOdW1iZXJMaXRlcmFsX19Hcm91cF9fMCA6IHJ1bGVfX1hOdW1iZXJMaXRlcmFsX19Hcm91cF9fMF9fSW1wbCBydWxlX19YTnVtYmVyTGl0ZXJhbF9fR3JvdXBfXzEgOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIwMTg4OjE6IHJ1bGVfX1hOdW1iZXJMaXRlcmFsX19Hcm91cF9fMCA6IHJ1bGVfX1hOdW1iZXJMaXRlcmFsX19Hcm91cF9fMF9fSW1wbCBydWxlX19YTnVtYmVyTGl0ZXJhbF9fR3JvdXBfXzEgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1hOdW1iZXJMaXRlcmFsX19Hcm91cF9fMCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxODg1NDoxOiAoIHJ1bGVfX1hOdW1iZXJMaXRlcmFsX19Hcm91cF9fMF9fSW1wbCBydWxlX19YTnVtYmVyTGl0ZXJhbF9fR3JvdXBfXzEgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTg4NTU6MjogcnVsZV9fWE51bWJlckxpdGVyYWxfX0dyb3VwX18wX19JbXBsIHJ1bGVfX1hOdW1iZXJMaXRlcmFsX19Hcm91cF9fMQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjAxOTI6MTogKCBydWxlX19YTnVtYmVyTGl0ZXJhbF9fR3JvdXBfXzBfX0ltcGwgcnVsZV9fWE51bWJlckxpdGVyYWxfX0dyb3VwX18xICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIwMTkzOjI6IHJ1bGVfX1hOdW1iZXJMaXRlcmFsX19Hcm91cF9fMF9fSW1wbCBydWxlX19YTnVtYmVyTGl0ZXJhbF9fR3JvdXBfXzEKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzEzOCk7CisgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV18xNDYpOwogICAgICAgICAgICAgcnVsZV9fWE51bWJlckxpdGVyYWxfX0dyb3VwX18wX19JbXBsKCk7CiAKICAgICAgICAgICAgIHN0YXRlLl9mc3AtLTsKQEAgLTYyMTI4LDIzICs2NjU4NSwyMyBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX1hOdW1iZXJMaXRlcmFsX19Hcm91cF9fMF9fSW1wbCIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxODg2MjoxOiBydWxlX19YTnVtYmVyTGl0ZXJhbF9fR3JvdXBfXzBfX0ltcGwgOiAoICgpICkgOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIwMjAwOjE6IHJ1bGVfX1hOdW1iZXJMaXRlcmFsX19Hcm91cF9fMF9fSW1wbCA6ICggKCkgKSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fWE51bWJlckxpdGVyYWxfX0dyb3VwX18wX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE4ODY2OjE6ICggKCAoKSApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE4ODY3OjE6ICggKCkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjAyMDQ6MTogKCAoICgpICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjAyMDU6MTogKCAoKSApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxODg2NzoxOiAoICgpICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE4ODY4OjI6ICgpCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMDIwNToxOiAoICgpICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIwMjA2OjI6ICgpCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhOdW1iZXJMaXRlcmFsQWNjZXNzKCkuZ2V0WE51bWJlckxpdGVyYWxBY3Rpb25fMCgpKTsgCiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxODg2OToyOiAoKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTg4Njk6MzogCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMDIwNzoyOiAoKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjAyMDc6MzogCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICB9CiAKQEAgLTYyMTY5LDE0ICs2NjYyNiwxNCBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX1hOdW1iZXJMaXRlcmFsX19Hcm91cF9fMSIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxODg3NzoxOiBydWxlX19YTnVtYmVyTGl0ZXJhbF9fR3JvdXBfXzEgOiBydWxlX19YTnVtYmVyTGl0ZXJhbF9fR3JvdXBfXzFfX0ltcGwgOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIwMjE1OjE6IHJ1bGVfX1hOdW1iZXJMaXRlcmFsX19Hcm91cF9fMSA6IHJ1bGVfX1hOdW1iZXJMaXRlcmFsX19Hcm91cF9fMV9fSW1wbCA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fWE51bWJlckxpdGVyYWxfX0dyb3VwX18xKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE4ODgxOjE6ICggcnVsZV9fWE51bWJlckxpdGVyYWxfX0dyb3VwX18xX19JbXBsICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE4ODgyOjI6IHJ1bGVfX1hOdW1iZXJMaXRlcmFsX19Hcm91cF9fMV9fSW1wbAorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjAyMTk6MTogKCBydWxlX19YTnVtYmVyTGl0ZXJhbF9fR3JvdXBfXzFfX0ltcGwgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjAyMjA6MjogcnVsZV9fWE51bWJlckxpdGVyYWxfX0dyb3VwX18xX19JbXBsCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV18yKTsKICAgICAgICAgICAgIHJ1bGVfX1hOdW1iZXJMaXRlcmFsX19Hcm91cF9fMV9fSW1wbCgpOwpAQCAtNjIyMDIsMjMgKzY2NjU5LDIzIEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fWE51bWJlckxpdGVyYWxfX0dyb3VwX18xX19JbXBsIgotICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE4ODg4OjE6IHJ1bGVfX1hOdW1iZXJMaXRlcmFsX19Hcm91cF9fMV9fSW1wbCA6ICggKCBydWxlX19YTnVtYmVyTGl0ZXJhbF9fVmFsdWVBc3NpZ25tZW50XzEgKSApIDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMDIyNjoxOiBydWxlX19YTnVtYmVyTGl0ZXJhbF9fR3JvdXBfXzFfX0ltcGwgOiAoICggcnVsZV9fWE51bWJlckxpdGVyYWxfX1ZhbHVlQXNzaWdubWVudF8xICkgKSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fWE51bWJlckxpdGVyYWxfX0dyb3VwX18xX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE4ODkyOjE6ICggKCAoIHJ1bGVfX1hOdW1iZXJMaXRlcmFsX19WYWx1ZUFzc2lnbm1lbnRfMSApICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTg4OTM6MTogKCAoIHJ1bGVfX1hOdW1iZXJMaXRlcmFsX19WYWx1ZUFzc2lnbm1lbnRfMSApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIwMjMwOjE6ICggKCAoIHJ1bGVfX1hOdW1iZXJMaXRlcmFsX19WYWx1ZUFzc2lnbm1lbnRfMSApICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjAyMzE6MTogKCAoIHJ1bGVfX1hOdW1iZXJMaXRlcmFsX19WYWx1ZUFzc2lnbm1lbnRfMSApICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE4ODkzOjE6ICggKCBydWxlX19YTnVtYmVyTGl0ZXJhbF9fVmFsdWVBc3NpZ25tZW50XzEgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxODg5NDoyOiAoIHJ1bGVfX1hOdW1iZXJMaXRlcmFsX19WYWx1ZUFzc2lnbm1lbnRfMSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMDIzMToxOiAoICggcnVsZV9fWE51bWJlckxpdGVyYWxfX1ZhbHVlQXNzaWdubWVudF8xICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjAyMzI6MjogKCBydWxlX19YTnVtYmVyTGl0ZXJhbF9fVmFsdWVBc3NpZ25tZW50XzEgKQogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYTnVtYmVyTGl0ZXJhbEFjY2VzcygpLmdldFZhbHVlQXNzaWdubWVudF8xKCkpOyAKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE4ODk1OjI6ICggcnVsZV9fWE51bWJlckxpdGVyYWxfX1ZhbHVlQXNzaWdubWVudF8xICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE4ODk1OjM6IHJ1bGVfX1hOdW1iZXJMaXRlcmFsX19WYWx1ZUFzc2lnbm1lbnRfMQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjAyMzM6MjogKCBydWxlX19YTnVtYmVyTGl0ZXJhbF9fVmFsdWVBc3NpZ25tZW50XzEgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjAyMzM6MzogcnVsZV9fWE51bWJlckxpdGVyYWxfX1ZhbHVlQXNzaWdubWVudF8xCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV18yKTsKICAgICAgICAgICAgIHJ1bGVfX1hOdW1iZXJMaXRlcmFsX19WYWx1ZUFzc2lnbm1lbnRfMSgpOwpAQCAtNjIyNTMsMTQgKzY2NzEwLDE0IEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fWFN0cmluZ0xpdGVyYWxfX0dyb3VwX18wIgotICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE4OTA0OjE6IHJ1bGVfX1hTdHJpbmdMaXRlcmFsX19Hcm91cF9fMCA6IHJ1bGVfX1hTdHJpbmdMaXRlcmFsX19Hcm91cF9fMF9fSW1wbCBydWxlX19YU3RyaW5nTGl0ZXJhbF9fR3JvdXBfXzEgOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIwMjQyOjE6IHJ1bGVfX1hTdHJpbmdMaXRlcmFsX19Hcm91cF9fMCA6IHJ1bGVfX1hTdHJpbmdMaXRlcmFsX19Hcm91cF9fMF9fSW1wbCBydWxlX19YU3RyaW5nTGl0ZXJhbF9fR3JvdXBfXzEgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1hTdHJpbmdMaXRlcmFsX19Hcm91cF9fMCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxODkwODoxOiAoIHJ1bGVfX1hTdHJpbmdMaXRlcmFsX19Hcm91cF9fMF9fSW1wbCBydWxlX19YU3RyaW5nTGl0ZXJhbF9fR3JvdXBfXzEgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTg5MDk6MjogcnVsZV9fWFN0cmluZ0xpdGVyYWxfX0dyb3VwX18wX19JbXBsIHJ1bGVfX1hTdHJpbmdMaXRlcmFsX19Hcm91cF9fMQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjAyNDY6MTogKCBydWxlX19YU3RyaW5nTGl0ZXJhbF9fR3JvdXBfXzBfX0ltcGwgcnVsZV9fWFN0cmluZ0xpdGVyYWxfX0dyb3VwX18xICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIwMjQ3OjI6IHJ1bGVfX1hTdHJpbmdMaXRlcmFsX19Hcm91cF9fMF9fSW1wbCBydWxlX19YU3RyaW5nTGl0ZXJhbF9fR3JvdXBfXzEKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzkpOwogICAgICAgICAgICAgcnVsZV9fWFN0cmluZ0xpdGVyYWxfX0dyb3VwX18wX19JbXBsKCk7CkBAIC02MjI5MSwyMyArNjY3NDgsMjMgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YU3RyaW5nTGl0ZXJhbF9fR3JvdXBfXzBfX0ltcGwiCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTg5MTY6MTogcnVsZV9fWFN0cmluZ0xpdGVyYWxfX0dyb3VwX18wX19JbXBsIDogKCAoKSApIDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMDI1NDoxOiBydWxlX19YU3RyaW5nTGl0ZXJhbF9fR3JvdXBfXzBfX0ltcGwgOiAoICgpICkgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1hTdHJpbmdMaXRlcmFsX19Hcm91cF9fMF9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxODkyMDoxOiAoICggKCkgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxODkyMToxOiAoICgpICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIwMjU4OjE6ICggKCAoKSApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIwMjU5OjE6ICggKCkgKQogICAgICAgICAgICAgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTg5MjE6MTogKCAoKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxODkyMjoyOiAoKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjAyNTk6MTogKCAoKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMDI2MDoyOiAoKQogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYU3RyaW5nTGl0ZXJhbEFjY2VzcygpLmdldFhTdHJpbmdMaXRlcmFsQWN0aW9uXzAoKSk7IAogICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTg5MjM6MjogKCkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE4OTIzOjM6IAorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjAyNjE6MjogKCkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIwMjYxOjM6IAogICAgICAgICAgICAgewogICAgICAgICAgICAgfQogCkBAIC02MjMzMiwxNCArNjY3ODksMTQgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YU3RyaW5nTGl0ZXJhbF9fR3JvdXBfXzEiCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTg5MzE6MTogcnVsZV9fWFN0cmluZ0xpdGVyYWxfX0dyb3VwX18xIDogcnVsZV9fWFN0cmluZ0xpdGVyYWxfX0dyb3VwX18xX19JbXBsIDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMDI2OToxOiBydWxlX19YU3RyaW5nTGl0ZXJhbF9fR3JvdXBfXzEgOiBydWxlX19YU3RyaW5nTGl0ZXJhbF9fR3JvdXBfXzFfX0ltcGwgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1hTdHJpbmdMaXRlcmFsX19Hcm91cF9fMSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxODkzNToxOiAoIHJ1bGVfX1hTdHJpbmdMaXRlcmFsX19Hcm91cF9fMV9fSW1wbCApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxODkzNjoyOiBydWxlX19YU3RyaW5nTGl0ZXJhbF9fR3JvdXBfXzFfX0ltcGwKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIwMjczOjE6ICggcnVsZV9fWFN0cmluZ0xpdGVyYWxfX0dyb3VwX18xX19JbXBsICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIwMjc0OjI6IHJ1bGVfX1hTdHJpbmdMaXRlcmFsX19Hcm91cF9fMV9fSW1wbAogICAgICAgICAgICAgewogICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMik7CiAgICAgICAgICAgICBydWxlX19YU3RyaW5nTGl0ZXJhbF9fR3JvdXBfXzFfX0ltcGwoKTsKQEAgLTYyMzY1LDIzICs2NjgyMiwyMyBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX1hTdHJpbmdMaXRlcmFsX19Hcm91cF9fMV9fSW1wbCIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxODk0MjoxOiBydWxlX19YU3RyaW5nTGl0ZXJhbF9fR3JvdXBfXzFfX0ltcGwgOiAoICggcnVsZV9fWFN0cmluZ0xpdGVyYWxfX1ZhbHVlQXNzaWdubWVudF8xICkgKSA7CisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjAyODA6MTogcnVsZV9fWFN0cmluZ0xpdGVyYWxfX0dyb3VwX18xX19JbXBsIDogKCAoIHJ1bGVfX1hTdHJpbmdMaXRlcmFsX19WYWx1ZUFzc2lnbm1lbnRfMSApICkgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1hTdHJpbmdMaXRlcmFsX19Hcm91cF9fMV9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxODk0NjoxOiAoICggKCBydWxlX19YU3RyaW5nTGl0ZXJhbF9fVmFsdWVBc3NpZ25tZW50XzEgKSApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE4OTQ3OjE6ICggKCBydWxlX19YU3RyaW5nTGl0ZXJhbF9fVmFsdWVBc3NpZ25tZW50XzEgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMDI4NDoxOiAoICggKCBydWxlX19YU3RyaW5nTGl0ZXJhbF9fVmFsdWVBc3NpZ25tZW50XzEgKSApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIwMjg1OjE6ICggKCBydWxlX19YU3RyaW5nTGl0ZXJhbF9fVmFsdWVBc3NpZ25tZW50XzEgKSApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxODk0NzoxOiAoICggcnVsZV9fWFN0cmluZ0xpdGVyYWxfX1ZhbHVlQXNzaWdubWVudF8xICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTg5NDg6MjogKCBydWxlX19YU3RyaW5nTGl0ZXJhbF9fVmFsdWVBc3NpZ25tZW50XzEgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjAyODU6MTogKCAoIHJ1bGVfX1hTdHJpbmdMaXRlcmFsX19WYWx1ZUFzc2lnbm1lbnRfMSApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIwMjg2OjI6ICggcnVsZV9fWFN0cmluZ0xpdGVyYWxfX1ZhbHVlQXNzaWdubWVudF8xICkKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WFN0cmluZ0xpdGVyYWxBY2Nlc3MoKS5nZXRWYWx1ZUFzc2lnbm1lbnRfMSgpKTsgCiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxODk0OToyOiAoIHJ1bGVfX1hTdHJpbmdMaXRlcmFsX19WYWx1ZUFzc2lnbm1lbnRfMSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxODk0OTozOiBydWxlX19YU3RyaW5nTGl0ZXJhbF9fVmFsdWVBc3NpZ25tZW50XzEKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIwMjg3OjI6ICggcnVsZV9fWFN0cmluZ0xpdGVyYWxfX1ZhbHVlQXNzaWdubWVudF8xICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIwMjg3OjM6IHJ1bGVfX1hTdHJpbmdMaXRlcmFsX19WYWx1ZUFzc2lnbm1lbnRfMQogICAgICAgICAgICAgewogICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMik7CiAgICAgICAgICAgICBydWxlX19YU3RyaW5nTGl0ZXJhbF9fVmFsdWVBc3NpZ25tZW50XzEoKTsKQEAgLTYyNDE2LDE2ICs2Njg3MywxNiBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX1hUeXBlTGl0ZXJhbF9fR3JvdXBfXzAiCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTg5NTg6MTogcnVsZV9fWFR5cGVMaXRlcmFsX19Hcm91cF9fMCA6IHJ1bGVfX1hUeXBlTGl0ZXJhbF9fR3JvdXBfXzBfX0ltcGwgcnVsZV9fWFR5cGVMaXRlcmFsX19Hcm91cF9fMSA7CisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjAyOTY6MTogcnVsZV9fWFR5cGVMaXRlcmFsX19Hcm91cF9fMCA6IHJ1bGVfX1hUeXBlTGl0ZXJhbF9fR3JvdXBfXzBfX0ltcGwgcnVsZV9fWFR5cGVMaXRlcmFsX19Hcm91cF9fMSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fWFR5cGVMaXRlcmFsX19Hcm91cF9fMCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxODk2MjoxOiAoIHJ1bGVfX1hUeXBlTGl0ZXJhbF9fR3JvdXBfXzBfX0ltcGwgcnVsZV9fWFR5cGVMaXRlcmFsX19Hcm91cF9fMSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxODk2MzoyOiBydWxlX19YVHlwZUxpdGVyYWxfX0dyb3VwX18wX19JbXBsIHJ1bGVfX1hUeXBlTGl0ZXJhbF9fR3JvdXBfXzEKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIwMzAwOjE6ICggcnVsZV9fWFR5cGVMaXRlcmFsX19Hcm91cF9fMF9fSW1wbCBydWxlX19YVHlwZUxpdGVyYWxfX0dyb3VwX18xICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIwMzAxOjI6IHJ1bGVfX1hUeXBlTGl0ZXJhbF9fR3JvdXBfXzBfX0ltcGwgcnVsZV9fWFR5cGVMaXRlcmFsX19Hcm91cF9fMQogICAgICAgICAgICAgewotICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMTM5KTsKKyAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzE0Nyk7CiAgICAgICAgICAgICBydWxlX19YVHlwZUxpdGVyYWxfX0dyb3VwX18wX19JbXBsKCk7CiAKICAgICAgICAgICAgIHN0YXRlLl9mc3AtLTsKQEAgLTYyNDU0LDIzICs2NjkxMSwyMyBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX1hUeXBlTGl0ZXJhbF9fR3JvdXBfXzBfX0ltcGwiCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTg5NzA6MTogcnVsZV9fWFR5cGVMaXRlcmFsX19Hcm91cF9fMF9fSW1wbCA6ICggKCkgKSA7CisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjAzMDg6MTogcnVsZV9fWFR5cGVMaXRlcmFsX19Hcm91cF9fMF9fSW1wbCA6ICggKCkgKSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fWFR5cGVMaXRlcmFsX19Hcm91cF9fMF9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxODk3NDoxOiAoICggKCkgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxODk3NToxOiAoICgpICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIwMzEyOjE6ICggKCAoKSApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIwMzEzOjE6ICggKCkgKQogICAgICAgICAgICAgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTg5NzU6MTogKCAoKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxODk3NjoyOiAoKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjAzMTM6MTogKCAoKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMDMxNDoyOiAoKQogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYVHlwZUxpdGVyYWxBY2Nlc3MoKS5nZXRYVHlwZUxpdGVyYWxBY3Rpb25fMCgpKTsgCiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxODk3NzoyOiAoKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTg5Nzc6MzogCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMDMxNToyOiAoKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjAzMTU6MzogCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICB9CiAKQEAgLTYyNDk1LDE2ICs2Njk1MiwxNiBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX1hUeXBlTGl0ZXJhbF9fR3JvdXBfXzEiCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTg5ODU6MTogcnVsZV9fWFR5cGVMaXRlcmFsX19Hcm91cF9fMSA6IHJ1bGVfX1hUeXBlTGl0ZXJhbF9fR3JvdXBfXzFfX0ltcGwgcnVsZV9fWFR5cGVMaXRlcmFsX19Hcm91cF9fMiA7CisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjAzMjM6MTogcnVsZV9fWFR5cGVMaXRlcmFsX19Hcm91cF9fMSA6IHJ1bGVfX1hUeXBlTGl0ZXJhbF9fR3JvdXBfXzFfX0ltcGwgcnVsZV9fWFR5cGVMaXRlcmFsX19Hcm91cF9fMiA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fWFR5cGVMaXRlcmFsX19Hcm91cF9fMSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxODk4OToxOiAoIHJ1bGVfX1hUeXBlTGl0ZXJhbF9fR3JvdXBfXzFfX0ltcGwgcnVsZV9fWFR5cGVMaXRlcmFsX19Hcm91cF9fMiApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxODk5MDoyOiBydWxlX19YVHlwZUxpdGVyYWxfX0dyb3VwX18xX19JbXBsIHJ1bGVfX1hUeXBlTGl0ZXJhbF9fR3JvdXBfXzIKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIwMzI3OjE6ICggcnVsZV9fWFR5cGVMaXRlcmFsX19Hcm91cF9fMV9fSW1wbCBydWxlX19YVHlwZUxpdGVyYWxfX0dyb3VwX18yICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIwMzI4OjI6IHJ1bGVfX1hUeXBlTGl0ZXJhbF9fR3JvdXBfXzFfX0ltcGwgcnVsZV9fWFR5cGVMaXRlcmFsX19Hcm91cF9fMgogICAgICAgICAgICAgewotICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfNzApOworICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfNzgpOwogICAgICAgICAgICAgcnVsZV9fWFR5cGVMaXRlcmFsX19Hcm91cF9fMV9fSW1wbCgpOwogCiAgICAgICAgICAgICBzdGF0ZS5fZnNwLS07CkBAIC02MjUzMywyMiArNjY5OTAsMjIgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YVHlwZUxpdGVyYWxfX0dyb3VwX18xX19JbXBsIgotICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE4OTk3OjE6IHJ1bGVfX1hUeXBlTGl0ZXJhbF9fR3JvdXBfXzFfX0ltcGwgOiAoICd0eXBlb2YnICkgOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIwMzM1OjE6IHJ1bGVfX1hUeXBlTGl0ZXJhbF9fR3JvdXBfXzFfX0ltcGwgOiAoICd0eXBlb2YnICkgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1hUeXBlTGl0ZXJhbF9fR3JvdXBfXzFfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTkwMDE6MTogKCAoICd0eXBlb2YnICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTkwMDI6MTogKCAndHlwZW9mJyApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMDMzOToxOiAoICggJ3R5cGVvZicgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMDM0MDoxOiAoICd0eXBlb2YnICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE5MDAyOjE6ICggJ3R5cGVvZicgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTkwMDM6MjogJ3R5cGVvZicKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIwMzQwOjE6ICggJ3R5cGVvZicgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjAzNDE6MjogJ3R5cGVvZicKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WFR5cGVMaXRlcmFsQWNjZXNzKCkuZ2V0VHlwZW9mS2V5d29yZF8xKCkpOyAKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1hdGNoKGlucHV0LDEzMCxGT0xMT1dfMik7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CisgICAgICAgICAgICBtYXRjaChpbnB1dCwxNDAsRk9MTE9XXzIpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOwogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBhZnRlcihncmFtbWFyQWNjZXNzLmdldFhUeXBlTGl0ZXJhbEFjY2VzcygpLmdldFR5cGVvZktleXdvcmRfMSgpKTsgCiAgICAgICAgICAgICB9CkBAIC02MjU3NCwxNCArNjcwMzEsMTQgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YVHlwZUxpdGVyYWxfX0dyb3VwX18yIgotICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE5MDEyOjE6IHJ1bGVfX1hUeXBlTGl0ZXJhbF9fR3JvdXBfXzIgOiBydWxlX19YVHlwZUxpdGVyYWxfX0dyb3VwX18yX19JbXBsIHJ1bGVfX1hUeXBlTGl0ZXJhbF9fR3JvdXBfXzMgOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIwMzUwOjE6IHJ1bGVfX1hUeXBlTGl0ZXJhbF9fR3JvdXBfXzIgOiBydWxlX19YVHlwZUxpdGVyYWxfX0dyb3VwX18yX19JbXBsIHJ1bGVfX1hUeXBlTGl0ZXJhbF9fR3JvdXBfXzMgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1hUeXBlTGl0ZXJhbF9fR3JvdXBfXzIoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTkwMTY6MTogKCBydWxlX19YVHlwZUxpdGVyYWxfX0dyb3VwX18yX19JbXBsIHJ1bGVfX1hUeXBlTGl0ZXJhbF9fR3JvdXBfXzMgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTkwMTc6MjogcnVsZV9fWFR5cGVMaXRlcmFsX19Hcm91cF9fMl9fSW1wbCBydWxlX19YVHlwZUxpdGVyYWxfX0dyb3VwX18zCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMDM1NDoxOiAoIHJ1bGVfX1hUeXBlTGl0ZXJhbF9fR3JvdXBfXzJfX0ltcGwgcnVsZV9fWFR5cGVMaXRlcmFsX19Hcm91cF9fMyApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMDM1NToyOiBydWxlX19YVHlwZUxpdGVyYWxfX0dyb3VwX18yX19JbXBsIHJ1bGVfX1hUeXBlTGl0ZXJhbF9fR3JvdXBfXzMKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzcpOwogICAgICAgICAgICAgcnVsZV9fWFR5cGVMaXRlcmFsX19Hcm91cF9fMl9fSW1wbCgpOwpAQCAtNjI2MTIsMjIgKzY3MDY5LDIyIEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fWFR5cGVMaXRlcmFsX19Hcm91cF9fMl9fSW1wbCIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxOTAyNDoxOiBydWxlX19YVHlwZUxpdGVyYWxfX0dyb3VwX18yX19JbXBsIDogKCAnKCcgKSA7CisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjAzNjI6MTogcnVsZV9fWFR5cGVMaXRlcmFsX19Hcm91cF9fMl9fSW1wbCA6ICggJygnICkgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1hUeXBlTGl0ZXJhbF9fR3JvdXBfXzJfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTkwMjg6MTogKCAoICcoJyApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE5MDI5OjE6ICggJygnICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIwMzY2OjE6ICggKCAnKCcgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMDM2NzoxOiAoICcoJyApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxOTAyOToxOiAoICcoJyApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxOTAzMDoyOiAnKCcKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIwMzY3OjE6ICggJygnICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIwMzY4OjI6ICcoJwogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYVHlwZUxpdGVyYWxBY2Nlc3MoKS5nZXRMZWZ0UGFyZW50aGVzaXNLZXl3b3JkXzIoKSk7IAogICAgICAgICAgICAgfQotICAgICAgICAgICAgbWF0Y2goaW5wdXQsMTEzLEZPTExPV18yKTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKKyAgICAgICAgICAgIG1hdGNoKGlucHV0LDEyMyxGT0xMT1dfMik7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0WFR5cGVMaXRlcmFsQWNjZXNzKCkuZ2V0TGVmdFBhcmVudGhlc2lzS2V5d29yZF8yKCkpOyAKICAgICAgICAgICAgIH0KQEAgLTYyNjUzLDE2ICs2NzExMCwxNiBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX1hUeXBlTGl0ZXJhbF9fR3JvdXBfXzMiCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTkwMzk6MTogcnVsZV9fWFR5cGVMaXRlcmFsX19Hcm91cF9fMyA6IHJ1bGVfX1hUeXBlTGl0ZXJhbF9fR3JvdXBfXzNfX0ltcGwgcnVsZV9fWFR5cGVMaXRlcmFsX19Hcm91cF9fNCA7CisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjAzNzc6MTogcnVsZV9fWFR5cGVMaXRlcmFsX19Hcm91cF9fMyA6IHJ1bGVfX1hUeXBlTGl0ZXJhbF9fR3JvdXBfXzNfX0ltcGwgcnVsZV9fWFR5cGVMaXRlcmFsX19Hcm91cF9fNCA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fWFR5cGVMaXRlcmFsX19Hcm91cF9fMygpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxOTA0MzoxOiAoIHJ1bGVfX1hUeXBlTGl0ZXJhbF9fR3JvdXBfXzNfX0ltcGwgcnVsZV9fWFR5cGVMaXRlcmFsX19Hcm91cF9fNCApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxOTA0NDoyOiBydWxlX19YVHlwZUxpdGVyYWxfX0dyb3VwX18zX19JbXBsIHJ1bGVfX1hUeXBlTGl0ZXJhbF9fR3JvdXBfXzQKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIwMzgxOjE6ICggcnVsZV9fWFR5cGVMaXRlcmFsX19Hcm91cF9fM19fSW1wbCBydWxlX19YVHlwZUxpdGVyYWxfX0dyb3VwX180ICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIwMzgyOjI6IHJ1bGVfX1hUeXBlTGl0ZXJhbF9fR3JvdXBfXzNfX0ltcGwgcnVsZV9fWFR5cGVMaXRlcmFsX19Hcm91cF9fNAogICAgICAgICAgICAgewotICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMTQwKTsKKyAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzE0OCk7CiAgICAgICAgICAgICBydWxlX19YVHlwZUxpdGVyYWxfX0dyb3VwX18zX19JbXBsKCk7CiAKICAgICAgICAgICAgIHN0YXRlLl9mc3AtLTsKQEAgLTYyNjkxLDIzICs2NzE0OCwyMyBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX1hUeXBlTGl0ZXJhbF9fR3JvdXBfXzNfX0ltcGwiCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTkwNTE6MTogcnVsZV9fWFR5cGVMaXRlcmFsX19Hcm91cF9fM19fSW1wbCA6ICggKCBydWxlX19YVHlwZUxpdGVyYWxfX1R5cGVBc3NpZ25tZW50XzMgKSApIDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMDM4OToxOiBydWxlX19YVHlwZUxpdGVyYWxfX0dyb3VwX18zX19JbXBsIDogKCAoIHJ1bGVfX1hUeXBlTGl0ZXJhbF9fVHlwZUFzc2lnbm1lbnRfMyApICkgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1hUeXBlTGl0ZXJhbF9fR3JvdXBfXzNfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTkwNTU6MTogKCAoICggcnVsZV9fWFR5cGVMaXRlcmFsX19UeXBlQXNzaWdubWVudF8zICkgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxOTA1NjoxOiAoICggcnVsZV9fWFR5cGVMaXRlcmFsX19UeXBlQXNzaWdubWVudF8zICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjAzOTM6MTogKCAoICggcnVsZV9fWFR5cGVMaXRlcmFsX19UeXBlQXNzaWdubWVudF8zICkgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMDM5NDoxOiAoICggcnVsZV9fWFR5cGVMaXRlcmFsX19UeXBlQXNzaWdubWVudF8zICkgKQogICAgICAgICAgICAgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTkwNTY6MTogKCAoIHJ1bGVfX1hUeXBlTGl0ZXJhbF9fVHlwZUFzc2lnbm1lbnRfMyApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE5MDU3OjI6ICggcnVsZV9fWFR5cGVMaXRlcmFsX19UeXBlQXNzaWdubWVudF8zICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIwMzk0OjE6ICggKCBydWxlX19YVHlwZUxpdGVyYWxfX1R5cGVBc3NpZ25tZW50XzMgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMDM5NToyOiAoIHJ1bGVfX1hUeXBlTGl0ZXJhbF9fVHlwZUFzc2lnbm1lbnRfMyApCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhUeXBlTGl0ZXJhbEFjY2VzcygpLmdldFR5cGVBc3NpZ25tZW50XzMoKSk7IAogICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTkwNTg6MjogKCBydWxlX19YVHlwZUxpdGVyYWxfX1R5cGVBc3NpZ25tZW50XzMgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTkwNTg6MzogcnVsZV9fWFR5cGVMaXRlcmFsX19UeXBlQXNzaWdubWVudF8zCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMDM5NjoyOiAoIHJ1bGVfX1hUeXBlTGl0ZXJhbF9fVHlwZUFzc2lnbm1lbnRfMyApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMDM5NjozOiBydWxlX19YVHlwZUxpdGVyYWxfX1R5cGVBc3NpZ25tZW50XzMKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzIpOwogICAgICAgICAgICAgcnVsZV9fWFR5cGVMaXRlcmFsX19UeXBlQXNzaWdubWVudF8zKCk7CkBAIC02Mjc0MiwxNiArNjcxOTksMTYgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YVHlwZUxpdGVyYWxfX0dyb3VwX180IgotICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE5MDY2OjE6IHJ1bGVfX1hUeXBlTGl0ZXJhbF9fR3JvdXBfXzQgOiBydWxlX19YVHlwZUxpdGVyYWxfX0dyb3VwX180X19JbXBsIHJ1bGVfX1hUeXBlTGl0ZXJhbF9fR3JvdXBfXzUgOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIwNDA0OjE6IHJ1bGVfX1hUeXBlTGl0ZXJhbF9fR3JvdXBfXzQgOiBydWxlX19YVHlwZUxpdGVyYWxfX0dyb3VwX180X19JbXBsIHJ1bGVfX1hUeXBlTGl0ZXJhbF9fR3JvdXBfXzUgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1hUeXBlTGl0ZXJhbF9fR3JvdXBfXzQoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTkwNzA6MTogKCBydWxlX19YVHlwZUxpdGVyYWxfX0dyb3VwX180X19JbXBsIHJ1bGVfX1hUeXBlTGl0ZXJhbF9fR3JvdXBfXzUgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTkwNzE6MjogcnVsZV9fWFR5cGVMaXRlcmFsX19Hcm91cF9fNF9fSW1wbCBydWxlX19YVHlwZUxpdGVyYWxfX0dyb3VwX181CisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMDQwODoxOiAoIHJ1bGVfX1hUeXBlTGl0ZXJhbF9fR3JvdXBfXzRfX0ltcGwgcnVsZV9fWFR5cGVMaXRlcmFsX19Hcm91cF9fNSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMDQwOToyOiBydWxlX19YVHlwZUxpdGVyYWxfX0dyb3VwX180X19JbXBsIHJ1bGVfX1hUeXBlTGl0ZXJhbF9fR3JvdXBfXzUKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzE0MCk7CisgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV18xNDgpOwogICAgICAgICAgICAgcnVsZV9fWFR5cGVMaXRlcmFsX19Hcm91cF9fNF9fSW1wbCgpOwogCiAgICAgICAgICAgICBzdGF0ZS5fZnNwLS07CkBAIC02Mjc4MCwzNyArNjcyMzcsMzcgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YVHlwZUxpdGVyYWxfX0dyb3VwX180X19JbXBsIgotICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE5MDc4OjE6IHJ1bGVfX1hUeXBlTGl0ZXJhbF9fR3JvdXBfXzRfX0ltcGwgOiAoICggcnVsZV9fWFR5cGVMaXRlcmFsX19BcnJheURpbWVuc2lvbnNBc3NpZ25tZW50XzQgKSogKSA7CisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjA0MTY6MTogcnVsZV9fWFR5cGVMaXRlcmFsX19Hcm91cF9fNF9fSW1wbCA6ICggKCBydWxlX19YVHlwZUxpdGVyYWxfX0FycmF5RGltZW5zaW9uc0Fzc2lnbm1lbnRfNCApKiApIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YVHlwZUxpdGVyYWxfX0dyb3VwX180X19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE5MDgyOjE6ICggKCAoIHJ1bGVfX1hUeXBlTGl0ZXJhbF9fQXJyYXlEaW1lbnNpb25zQXNzaWdubWVudF80ICkqICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTkwODM6MTogKCAoIHJ1bGVfX1hUeXBlTGl0ZXJhbF9fQXJyYXlEaW1lbnNpb25zQXNzaWdubWVudF80ICkqICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIwNDIwOjE6ICggKCAoIHJ1bGVfX1hUeXBlTGl0ZXJhbF9fQXJyYXlEaW1lbnNpb25zQXNzaWdubWVudF80ICkqICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjA0MjE6MTogKCAoIHJ1bGVfX1hUeXBlTGl0ZXJhbF9fQXJyYXlEaW1lbnNpb25zQXNzaWdubWVudF80ICkqICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE5MDgzOjE6ICggKCBydWxlX19YVHlwZUxpdGVyYWxfX0FycmF5RGltZW5zaW9uc0Fzc2lnbm1lbnRfNCApKiApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxOTA4NDoyOiAoIHJ1bGVfX1hUeXBlTGl0ZXJhbF9fQXJyYXlEaW1lbnNpb25zQXNzaWdubWVudF80ICkqCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMDQyMToxOiAoICggcnVsZV9fWFR5cGVMaXRlcmFsX19BcnJheURpbWVuc2lvbnNBc3NpZ25tZW50XzQgKSogKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjA0MjI6MjogKCBydWxlX19YVHlwZUxpdGVyYWxfX0FycmF5RGltZW5zaW9uc0Fzc2lnbm1lbnRfNCApKgogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYVHlwZUxpdGVyYWxBY2Nlc3MoKS5nZXRBcnJheURpbWVuc2lvbnNBc3NpZ25tZW50XzQoKSk7IAogICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTkwODU6MjogKCBydWxlX19YVHlwZUxpdGVyYWxfX0FycmF5RGltZW5zaW9uc0Fzc2lnbm1lbnRfNCApKgotICAgICAgICAgICAgbG9vcDE1MToKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIwNDIzOjI6ICggcnVsZV9fWFR5cGVMaXRlcmFsX19BcnJheURpbWVuc2lvbnNBc3NpZ25tZW50XzQgKSoKKyAgICAgICAgICAgIGxvb3AxNjQ6CiAgICAgICAgICAgICBkbyB7Ci0gICAgICAgICAgICAgICAgaW50IGFsdDE1MT0yOwotICAgICAgICAgICAgICAgIGludCBMQTE1MV8wID0gaW5wdXQuTEEoMSk7CisgICAgICAgICAgICAgICAgaW50IGFsdDE2ND0yOworICAgICAgICAgICAgICAgIGludCBMQTE2NF8wID0gaW5wdXQuTEEoMSk7CiAKLSAgICAgICAgICAgICAgICBpZiAoIChMQTE1MV8wPT0xMTgpICkgewotICAgICAgICAgICAgICAgICAgICBhbHQxNTE9MTsKKyAgICAgICAgICAgICAgICBpZiAoIChMQTE2NF8wPT0xMjgpICkgeworICAgICAgICAgICAgICAgICAgICBhbHQxNjQ9MTsKICAgICAgICAgICAgICAgICB9CiAKIAotICAgICAgICAgICAgICAgIHN3aXRjaCAoYWx0MTUxKSB7CisgICAgICAgICAgICAgICAgc3dpdGNoIChhbHQxNjQpIHsKICAgICAgICAgICAgIAljYXNlIDEgOgotICAgICAgICAgICAgCSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxOTA4NTozOiBydWxlX19YVHlwZUxpdGVyYWxfX0FycmF5RGltZW5zaW9uc0Fzc2lnbm1lbnRfNAorICAgICAgICAgICAgCSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMDQyMzozOiBydWxlX19YVHlwZUxpdGVyYWxfX0FycmF5RGltZW5zaW9uc0Fzc2lnbm1lbnRfNAogICAgICAgICAgICAgCSAgICB7Ci0gICAgICAgICAgICAJICAgIHB1c2hGb2xsb3coRk9MTE9XXzE0MSk7CisgICAgICAgICAgICAJICAgIHB1c2hGb2xsb3coRk9MTE9XXzE0OSk7CiAgICAgICAgICAgICAJICAgIHJ1bGVfX1hUeXBlTGl0ZXJhbF9fQXJyYXlEaW1lbnNpb25zQXNzaWdubWVudF80KCk7CiAKICAgICAgICAgICAgIAkgICAgc3RhdGUuX2ZzcC0tOwpAQCAtNjI4MjAsNyArNjcyNzcsNyBAQAogICAgICAgICAgICAgCSAgICBicmVhazsKIAogICAgICAgICAgICAgCWRlZmF1bHQgOgotICAgICAgICAgICAgCSAgICBicmVhayBsb29wMTUxOworICAgICAgICAgICAgCSAgICBicmVhayBsb29wMTY0OwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0gd2hpbGUgKHRydWUpOwogCkBAIC02Mjg0OSwxNCArNjczMDYsMTQgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YVHlwZUxpdGVyYWxfX0dyb3VwX181IgotICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE5MDkzOjE6IHJ1bGVfX1hUeXBlTGl0ZXJhbF9fR3JvdXBfXzUgOiBydWxlX19YVHlwZUxpdGVyYWxfX0dyb3VwX181X19JbXBsIDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMDQzMToxOiBydWxlX19YVHlwZUxpdGVyYWxfX0dyb3VwX181IDogcnVsZV9fWFR5cGVMaXRlcmFsX19Hcm91cF9fNV9fSW1wbCA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fWFR5cGVMaXRlcmFsX19Hcm91cF9fNSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxOTA5NzoxOiAoIHJ1bGVfX1hUeXBlTGl0ZXJhbF9fR3JvdXBfXzVfX0ltcGwgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTkwOTg6MjogcnVsZV9fWFR5cGVMaXRlcmFsX19Hcm91cF9fNV9fSW1wbAorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjA0MzU6MTogKCBydWxlX19YVHlwZUxpdGVyYWxfX0dyb3VwX181X19JbXBsICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIwNDM2OjI6IHJ1bGVfX1hUeXBlTGl0ZXJhbF9fR3JvdXBfXzVfX0ltcGwKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzIpOwogICAgICAgICAgICAgcnVsZV9fWFR5cGVMaXRlcmFsX19Hcm91cF9fNV9fSW1wbCgpOwpAQCAtNjI4ODIsMjIgKzY3MzM5LDIyIEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fWFR5cGVMaXRlcmFsX19Hcm91cF9fNV9fSW1wbCIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxOTEwNDoxOiBydWxlX19YVHlwZUxpdGVyYWxfX0dyb3VwX181X19JbXBsIDogKCAnKScgKSA7CisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjA0NDI6MTogcnVsZV9fWFR5cGVMaXRlcmFsX19Hcm91cF9fNV9fSW1wbCA6ICggJyknICkgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1hUeXBlTGl0ZXJhbF9fR3JvdXBfXzVfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTkxMDg6MTogKCAoICcpJyApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE5MTA5OjE6ICggJyknICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIwNDQ2OjE6ICggKCAnKScgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMDQ0NzoxOiAoICcpJyApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxOTEwOToxOiAoICcpJyApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxOTExMDoyOiAnKScKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIwNDQ3OjE6ICggJyknICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIwNDQ4OjI6ICcpJwogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYVHlwZUxpdGVyYWxBY2Nlc3MoKS5nZXRSaWdodFBhcmVudGhlc2lzS2V5d29yZF81KCkpOyAKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1hdGNoKGlucHV0LDExNCxGT0xMT1dfMik7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CisgICAgICAgICAgICBtYXRjaChpbnB1dCwxMjQsRk9MTE9XXzIpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOwogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBhZnRlcihncmFtbWFyQWNjZXNzLmdldFhUeXBlTGl0ZXJhbEFjY2VzcygpLmdldFJpZ2h0UGFyZW50aGVzaXNLZXl3b3JkXzUoKSk7IAogICAgICAgICAgICAgfQpAQCAtNjI5MjMsMTYgKzY3MzgwLDE2IEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fWFRocm93RXhwcmVzc2lvbl9fR3JvdXBfXzAiCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTkxMjA6MTogcnVsZV9fWFRocm93RXhwcmVzc2lvbl9fR3JvdXBfXzAgOiBydWxlX19YVGhyb3dFeHByZXNzaW9uX19Hcm91cF9fMF9fSW1wbCBydWxlX19YVGhyb3dFeHByZXNzaW9uX19Hcm91cF9fMSA7CisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjA0NTg6MTogcnVsZV9fWFRocm93RXhwcmVzc2lvbl9fR3JvdXBfXzAgOiBydWxlX19YVGhyb3dFeHByZXNzaW9uX19Hcm91cF9fMF9fSW1wbCBydWxlX19YVGhyb3dFeHByZXNzaW9uX19Hcm91cF9fMSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fWFRocm93RXhwcmVzc2lvbl9fR3JvdXBfXzAoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTkxMjQ6MTogKCBydWxlX19YVGhyb3dFeHByZXNzaW9uX19Hcm91cF9fMF9fSW1wbCBydWxlX19YVGhyb3dFeHByZXNzaW9uX19Hcm91cF9fMSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxOTEyNToyOiBydWxlX19YVGhyb3dFeHByZXNzaW9uX19Hcm91cF9fMF9fSW1wbCBydWxlX19YVGhyb3dFeHByZXNzaW9uX19Hcm91cF9fMQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjA0NjI6MTogKCBydWxlX19YVGhyb3dFeHByZXNzaW9uX19Hcm91cF9fMF9fSW1wbCBydWxlX19YVGhyb3dFeHByZXNzaW9uX19Hcm91cF9fMSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMDQ2MzoyOiBydWxlX19YVGhyb3dFeHByZXNzaW9uX19Hcm91cF9fMF9fSW1wbCBydWxlX19YVGhyb3dFeHByZXNzaW9uX19Hcm91cF9fMQogICAgICAgICAgICAgewotICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMTQyKTsKKyAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzE1MCk7CiAgICAgICAgICAgICBydWxlX19YVGhyb3dFeHByZXNzaW9uX19Hcm91cF9fMF9fSW1wbCgpOwogCiAgICAgICAgICAgICBzdGF0ZS5fZnNwLS07CkBAIC02Mjk2MSwyMyArNjc0MTgsMjMgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YVGhyb3dFeHByZXNzaW9uX19Hcm91cF9fMF9fSW1wbCIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxOTEzMjoxOiBydWxlX19YVGhyb3dFeHByZXNzaW9uX19Hcm91cF9fMF9fSW1wbCA6ICggKCkgKSA7CisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjA0NzA6MTogcnVsZV9fWFRocm93RXhwcmVzc2lvbl9fR3JvdXBfXzBfX0ltcGwgOiAoICgpICkgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1hUaHJvd0V4cHJlc3Npb25fX0dyb3VwX18wX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE5MTM2OjE6ICggKCAoKSApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE5MTM3OjE6ICggKCkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjA0NzQ6MTogKCAoICgpICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjA0NzU6MTogKCAoKSApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxOTEzNzoxOiAoICgpICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE5MTM4OjI6ICgpCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMDQ3NToxOiAoICgpICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIwNDc2OjI6ICgpCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhUaHJvd0V4cHJlc3Npb25BY2Nlc3MoKS5nZXRYVGhyb3dFeHByZXNzaW9uQWN0aW9uXzAoKSk7IAogICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTkxMzk6MjogKCkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE5MTM5OjM6IAorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjA0Nzc6MjogKCkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIwNDc3OjM6IAogICAgICAgICAgICAgewogICAgICAgICAgICAgfQogCkBAIC02MzAwMiwxNiArNjc0NTksMTYgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YVGhyb3dFeHByZXNzaW9uX19Hcm91cF9fMSIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxOTE0NzoxOiBydWxlX19YVGhyb3dFeHByZXNzaW9uX19Hcm91cF9fMSA6IHJ1bGVfX1hUaHJvd0V4cHJlc3Npb25fX0dyb3VwX18xX19JbXBsIHJ1bGVfX1hUaHJvd0V4cHJlc3Npb25fX0dyb3VwX18yIDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMDQ4NToxOiBydWxlX19YVGhyb3dFeHByZXNzaW9uX19Hcm91cF9fMSA6IHJ1bGVfX1hUaHJvd0V4cHJlc3Npb25fX0dyb3VwX18xX19JbXBsIHJ1bGVfX1hUaHJvd0V4cHJlc3Npb25fX0dyb3VwX18yIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YVGhyb3dFeHByZXNzaW9uX19Hcm91cF9fMSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxOTE1MToxOiAoIHJ1bGVfX1hUaHJvd0V4cHJlc3Npb25fX0dyb3VwX18xX19JbXBsIHJ1bGVfX1hUaHJvd0V4cHJlc3Npb25fX0dyb3VwX18yICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE5MTUyOjI6IHJ1bGVfX1hUaHJvd0V4cHJlc3Npb25fX0dyb3VwX18xX19JbXBsIHJ1bGVfX1hUaHJvd0V4cHJlc3Npb25fX0dyb3VwX18yCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMDQ4OToxOiAoIHJ1bGVfX1hUaHJvd0V4cHJlc3Npb25fX0dyb3VwX18xX19JbXBsIHJ1bGVfX1hUaHJvd0V4cHJlc3Npb25fX0dyb3VwX18yICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIwNDkwOjI6IHJ1bGVfX1hUaHJvd0V4cHJlc3Npb25fX0dyb3VwX18xX19JbXBsIHJ1bGVfX1hUaHJvd0V4cHJlc3Npb25fX0dyb3VwX18yCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV183NCk7CisgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV184Mik7CiAgICAgICAgICAgICBydWxlX19YVGhyb3dFeHByZXNzaW9uX19Hcm91cF9fMV9fSW1wbCgpOwogCiAgICAgICAgICAgICBzdGF0ZS5fZnNwLS07CkBAIC02MzA0MCwyMiArNjc0OTcsMjIgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YVGhyb3dFeHByZXNzaW9uX19Hcm91cF9fMV9fSW1wbCIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxOTE1OToxOiBydWxlX19YVGhyb3dFeHByZXNzaW9uX19Hcm91cF9fMV9fSW1wbCA6ICggJ3Rocm93JyApIDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMDQ5NzoxOiBydWxlX19YVGhyb3dFeHByZXNzaW9uX19Hcm91cF9fMV9fSW1wbCA6ICggJ3Rocm93JyApIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YVGhyb3dFeHByZXNzaW9uX19Hcm91cF9fMV9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxOTE2MzoxOiAoICggJ3Rocm93JyApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE5MTY0OjE6ICggJ3Rocm93JyApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMDUwMToxOiAoICggJ3Rocm93JyApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIwNTAyOjE6ICggJ3Rocm93JyApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxOTE2NDoxOiAoICd0aHJvdycgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTkxNjU6MjogJ3Rocm93JworICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjA1MDI6MTogKCAndGhyb3cnICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIwNTAzOjI6ICd0aHJvdycKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WFRocm93RXhwcmVzc2lvbkFjY2VzcygpLmdldFRocm93S2V5d29yZF8xKCkpOyAKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1hdGNoKGlucHV0LDEzMSxGT0xMT1dfMik7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CisgICAgICAgICAgICBtYXRjaChpbnB1dCwxNDEsRk9MTE9XXzIpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOwogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBhZnRlcihncmFtbWFyQWNjZXNzLmdldFhUaHJvd0V4cHJlc3Npb25BY2Nlc3MoKS5nZXRUaHJvd0tleXdvcmRfMSgpKTsgCiAgICAgICAgICAgICB9CkBAIC02MzA4MSwxNCArNjc1MzgsMTQgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YVGhyb3dFeHByZXNzaW9uX19Hcm91cF9fMiIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxOTE3NDoxOiBydWxlX19YVGhyb3dFeHByZXNzaW9uX19Hcm91cF9fMiA6IHJ1bGVfX1hUaHJvd0V4cHJlc3Npb25fX0dyb3VwX18yX19JbXBsIDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMDUxMjoxOiBydWxlX19YVGhyb3dFeHByZXNzaW9uX19Hcm91cF9fMiA6IHJ1bGVfX1hUaHJvd0V4cHJlc3Npb25fX0dyb3VwX18yX19JbXBsIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YVGhyb3dFeHByZXNzaW9uX19Hcm91cF9fMigpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxOTE3ODoxOiAoIHJ1bGVfX1hUaHJvd0V4cHJlc3Npb25fX0dyb3VwX18yX19JbXBsICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE5MTc5OjI6IHJ1bGVfX1hUaHJvd0V4cHJlc3Npb25fX0dyb3VwX18yX19JbXBsCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMDUxNjoxOiAoIHJ1bGVfX1hUaHJvd0V4cHJlc3Npb25fX0dyb3VwX18yX19JbXBsICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIwNTE3OjI6IHJ1bGVfX1hUaHJvd0V4cHJlc3Npb25fX0dyb3VwX18yX19JbXBsCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV18yKTsKICAgICAgICAgICAgIHJ1bGVfX1hUaHJvd0V4cHJlc3Npb25fX0dyb3VwX18yX19JbXBsKCk7CkBAIC02MzExNCwyMyArNjc1NzEsMjMgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YVGhyb3dFeHByZXNzaW9uX19Hcm91cF9fMl9fSW1wbCIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxOTE4NToxOiBydWxlX19YVGhyb3dFeHByZXNzaW9uX19Hcm91cF9fMl9fSW1wbCA6ICggKCBydWxlX19YVGhyb3dFeHByZXNzaW9uX19FeHByZXNzaW9uQXNzaWdubWVudF8yICkgKSA7CisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjA1MjM6MTogcnVsZV9fWFRocm93RXhwcmVzc2lvbl9fR3JvdXBfXzJfX0ltcGwgOiAoICggcnVsZV9fWFRocm93RXhwcmVzc2lvbl9fRXhwcmVzc2lvbkFzc2lnbm1lbnRfMiApICkgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1hUaHJvd0V4cHJlc3Npb25fX0dyb3VwX18yX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE5MTg5OjE6ICggKCAoIHJ1bGVfX1hUaHJvd0V4cHJlc3Npb25fX0V4cHJlc3Npb25Bc3NpZ25tZW50XzIgKSApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE5MTkwOjE6ICggKCBydWxlX19YVGhyb3dFeHByZXNzaW9uX19FeHByZXNzaW9uQXNzaWdubWVudF8yICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjA1Mjc6MTogKCAoICggcnVsZV9fWFRocm93RXhwcmVzc2lvbl9fRXhwcmVzc2lvbkFzc2lnbm1lbnRfMiApICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjA1Mjg6MTogKCAoIHJ1bGVfX1hUaHJvd0V4cHJlc3Npb25fX0V4cHJlc3Npb25Bc3NpZ25tZW50XzIgKSApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxOTE5MDoxOiAoICggcnVsZV9fWFRocm93RXhwcmVzc2lvbl9fRXhwcmVzc2lvbkFzc2lnbm1lbnRfMiApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE5MTkxOjI6ICggcnVsZV9fWFRocm93RXhwcmVzc2lvbl9fRXhwcmVzc2lvbkFzc2lnbm1lbnRfMiApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMDUyODoxOiAoICggcnVsZV9fWFRocm93RXhwcmVzc2lvbl9fRXhwcmVzc2lvbkFzc2lnbm1lbnRfMiApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIwNTI5OjI6ICggcnVsZV9fWFRocm93RXhwcmVzc2lvbl9fRXhwcmVzc2lvbkFzc2lnbm1lbnRfMiApCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhUaHJvd0V4cHJlc3Npb25BY2Nlc3MoKS5nZXRFeHByZXNzaW9uQXNzaWdubWVudF8yKCkpOyAKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE5MTkyOjI6ICggcnVsZV9fWFRocm93RXhwcmVzc2lvbl9fRXhwcmVzc2lvbkFzc2lnbm1lbnRfMiApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxOTE5MjozOiBydWxlX19YVGhyb3dFeHByZXNzaW9uX19FeHByZXNzaW9uQXNzaWdubWVudF8yCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMDUzMDoyOiAoIHJ1bGVfX1hUaHJvd0V4cHJlc3Npb25fX0V4cHJlc3Npb25Bc3NpZ25tZW50XzIgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjA1MzA6MzogcnVsZV9fWFRocm93RXhwcmVzc2lvbl9fRXhwcmVzc2lvbkFzc2lnbm1lbnRfMgogICAgICAgICAgICAgewogICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMik7CiAgICAgICAgICAgICBydWxlX19YVGhyb3dFeHByZXNzaW9uX19FeHByZXNzaW9uQXNzaWdubWVudF8yKCk7CkBAIC02MzE2NSwxNiArNjc2MjIsMTYgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YUmV0dXJuRXhwcmVzc2lvbl9fR3JvdXBfXzAiCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTkyMDE6MTogcnVsZV9fWFJldHVybkV4cHJlc3Npb25fX0dyb3VwX18wIDogcnVsZV9fWFJldHVybkV4cHJlc3Npb25fX0dyb3VwX18wX19JbXBsIHJ1bGVfX1hSZXR1cm5FeHByZXNzaW9uX19Hcm91cF9fMSA7CisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjA1Mzk6MTogcnVsZV9fWFJldHVybkV4cHJlc3Npb25fX0dyb3VwX18wIDogcnVsZV9fWFJldHVybkV4cHJlc3Npb25fX0dyb3VwX18wX19JbXBsIHJ1bGVfX1hSZXR1cm5FeHByZXNzaW9uX19Hcm91cF9fMSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fWFJldHVybkV4cHJlc3Npb25fX0dyb3VwX18wKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE5MjA1OjE6ICggcnVsZV9fWFJldHVybkV4cHJlc3Npb25fX0dyb3VwX18wX19JbXBsIHJ1bGVfX1hSZXR1cm5FeHByZXNzaW9uX19Hcm91cF9fMSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxOTIwNjoyOiBydWxlX19YUmV0dXJuRXhwcmVzc2lvbl9fR3JvdXBfXzBfX0ltcGwgcnVsZV9fWFJldHVybkV4cHJlc3Npb25fX0dyb3VwX18xCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMDU0MzoxOiAoIHJ1bGVfX1hSZXR1cm5FeHByZXNzaW9uX19Hcm91cF9fMF9fSW1wbCBydWxlX19YUmV0dXJuRXhwcmVzc2lvbl9fR3JvdXBfXzEgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjA1NDQ6MjogcnVsZV9fWFJldHVybkV4cHJlc3Npb25fX0dyb3VwX18wX19JbXBsIHJ1bGVfX1hSZXR1cm5FeHByZXNzaW9uX19Hcm91cF9fMQogICAgICAgICAgICAgewotICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMTQzKTsKKyAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzE1MSk7CiAgICAgICAgICAgICBydWxlX19YUmV0dXJuRXhwcmVzc2lvbl9fR3JvdXBfXzBfX0ltcGwoKTsKIAogICAgICAgICAgICAgc3RhdGUuX2ZzcC0tOwpAQCAtNjMyMDMsMjMgKzY3NjYwLDIzIEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fWFJldHVybkV4cHJlc3Npb25fX0dyb3VwX18wX19JbXBsIgotICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE5MjEzOjE6IHJ1bGVfX1hSZXR1cm5FeHByZXNzaW9uX19Hcm91cF9fMF9fSW1wbCA6ICggKCkgKSA7CisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjA1NTE6MTogcnVsZV9fWFJldHVybkV4cHJlc3Npb25fX0dyb3VwX18wX19JbXBsIDogKCAoKSApIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YUmV0dXJuRXhwcmVzc2lvbl9fR3JvdXBfXzBfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTkyMTc6MTogKCAoICgpICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTkyMTg6MTogKCAoKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMDU1NToxOiAoICggKCkgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMDU1NjoxOiAoICgpICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE5MjE4OjE6ICggKCkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTkyMTk6MjogKCkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIwNTU2OjE6ICggKCkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjA1NTc6MjogKCkKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WFJldHVybkV4cHJlc3Npb25BY2Nlc3MoKS5nZXRYUmV0dXJuRXhwcmVzc2lvbkFjdGlvbl8wKCkpOyAKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE5MjIwOjI6ICgpCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxOTIyMDozOiAKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIwNTU4OjI6ICgpCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMDU1ODozOiAKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIH0KIApAQCAtNjMyNDQsMTYgKzY3NzAxLDE2IEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fWFJldHVybkV4cHJlc3Npb25fX0dyb3VwX18xIgotICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE5MjI4OjE6IHJ1bGVfX1hSZXR1cm5FeHByZXNzaW9uX19Hcm91cF9fMSA6IHJ1bGVfX1hSZXR1cm5FeHByZXNzaW9uX19Hcm91cF9fMV9fSW1wbCBydWxlX19YUmV0dXJuRXhwcmVzc2lvbl9fR3JvdXBfXzIgOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIwNTY2OjE6IHJ1bGVfX1hSZXR1cm5FeHByZXNzaW9uX19Hcm91cF9fMSA6IHJ1bGVfX1hSZXR1cm5FeHByZXNzaW9uX19Hcm91cF9fMV9fSW1wbCBydWxlX19YUmV0dXJuRXhwcmVzc2lvbl9fR3JvdXBfXzIgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1hSZXR1cm5FeHByZXNzaW9uX19Hcm91cF9fMSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxOTIzMjoxOiAoIHJ1bGVfX1hSZXR1cm5FeHByZXNzaW9uX19Hcm91cF9fMV9fSW1wbCBydWxlX19YUmV0dXJuRXhwcmVzc2lvbl9fR3JvdXBfXzIgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTkyMzM6MjogcnVsZV9fWFJldHVybkV4cHJlc3Npb25fX0dyb3VwX18xX19JbXBsIHJ1bGVfX1hSZXR1cm5FeHByZXNzaW9uX19Hcm91cF9fMgorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjA1NzA6MTogKCBydWxlX19YUmV0dXJuRXhwcmVzc2lvbl9fR3JvdXBfXzFfX0ltcGwgcnVsZV9fWFJldHVybkV4cHJlc3Npb25fX0dyb3VwX18yICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIwNTcxOjI6IHJ1bGVfX1hSZXR1cm5FeHByZXNzaW9uX19Hcm91cF9fMV9fSW1wbCBydWxlX19YUmV0dXJuRXhwcmVzc2lvbl9fR3JvdXBfXzIKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzc0KTsKKyAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzgyKTsKICAgICAgICAgICAgIHJ1bGVfX1hSZXR1cm5FeHByZXNzaW9uX19Hcm91cF9fMV9fSW1wbCgpOwogCiAgICAgICAgICAgICBzdGF0ZS5fZnNwLS07CkBAIC02MzI4MiwyMiArNjc3MzksMjIgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YUmV0dXJuRXhwcmVzc2lvbl9fR3JvdXBfXzFfX0ltcGwiCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTkyNDA6MTogcnVsZV9fWFJldHVybkV4cHJlc3Npb25fX0dyb3VwX18xX19JbXBsIDogKCAncmV0dXJuJyApIDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMDU3ODoxOiBydWxlX19YUmV0dXJuRXhwcmVzc2lvbl9fR3JvdXBfXzFfX0ltcGwgOiAoICdyZXR1cm4nICkgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1hSZXR1cm5FeHByZXNzaW9uX19Hcm91cF9fMV9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxOTI0NDoxOiAoICggJ3JldHVybicgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxOTI0NToxOiAoICdyZXR1cm4nICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIwNTgyOjE6ICggKCAncmV0dXJuJyApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIwNTgzOjE6ICggJ3JldHVybicgKQogICAgICAgICAgICAgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTkyNDU6MTogKCAncmV0dXJuJyApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxOTI0NjoyOiAncmV0dXJuJworICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjA1ODM6MTogKCAncmV0dXJuJyApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMDU4NDoyOiAncmV0dXJuJwogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYUmV0dXJuRXhwcmVzc2lvbkFjY2VzcygpLmdldFJldHVybktleXdvcmRfMSgpKTsgCiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBtYXRjaChpbnB1dCwxMzIsRk9MTE9XXzIpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOworICAgICAgICAgICAgbWF0Y2goaW5wdXQsMTQyLEZPTExPV18yKTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRYUmV0dXJuRXhwcmVzc2lvbkFjY2VzcygpLmdldFJldHVybktleXdvcmRfMSgpKTsgCiAgICAgICAgICAgICB9CkBAIC02MzMyMywxNCArNjc3ODAsMTQgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YUmV0dXJuRXhwcmVzc2lvbl9fR3JvdXBfXzIiCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTkyNTU6MTogcnVsZV9fWFJldHVybkV4cHJlc3Npb25fX0dyb3VwX18yIDogcnVsZV9fWFJldHVybkV4cHJlc3Npb25fX0dyb3VwX18yX19JbXBsIDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMDU5MzoxOiBydWxlX19YUmV0dXJuRXhwcmVzc2lvbl9fR3JvdXBfXzIgOiBydWxlX19YUmV0dXJuRXhwcmVzc2lvbl9fR3JvdXBfXzJfX0ltcGwgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1hSZXR1cm5FeHByZXNzaW9uX19Hcm91cF9fMigpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxOTI1OToxOiAoIHJ1bGVfX1hSZXR1cm5FeHByZXNzaW9uX19Hcm91cF9fMl9fSW1wbCApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxOTI2MDoyOiBydWxlX19YUmV0dXJuRXhwcmVzc2lvbl9fR3JvdXBfXzJfX0ltcGwKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIwNTk3OjE6ICggcnVsZV9fWFJldHVybkV4cHJlc3Npb25fX0dyb3VwX18yX19JbXBsICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIwNTk4OjI6IHJ1bGVfX1hSZXR1cm5FeHByZXNzaW9uX19Hcm91cF9fMl9fSW1wbAogICAgICAgICAgICAgewogICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMik7CiAgICAgICAgICAgICBydWxlX19YUmV0dXJuRXhwcmVzc2lvbl9fR3JvdXBfXzJfX0ltcGwoKTsKQEAgLTYzMzU2LDI3ICs2NzgxMywyNyBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX1hSZXR1cm5FeHByZXNzaW9uX19Hcm91cF9fMl9fSW1wbCIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxOTI2NjoxOiBydWxlX19YUmV0dXJuRXhwcmVzc2lvbl9fR3JvdXBfXzJfX0ltcGwgOiAoICggcnVsZV9fWFJldHVybkV4cHJlc3Npb25fX0V4cHJlc3Npb25Bc3NpZ25tZW50XzIgKT8gKSA7CisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjA2MDQ6MTogcnVsZV9fWFJldHVybkV4cHJlc3Npb25fX0dyb3VwX18yX19JbXBsIDogKCAoIHJ1bGVfX1hSZXR1cm5FeHByZXNzaW9uX19FeHByZXNzaW9uQXNzaWdubWVudF8yICk/ICkgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1hSZXR1cm5FeHByZXNzaW9uX19Hcm91cF9fMl9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxOTI3MDoxOiAoICggKCBydWxlX19YUmV0dXJuRXhwcmVzc2lvbl9fRXhwcmVzc2lvbkFzc2lnbm1lbnRfMiApPyApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE5MjcxOjE6ICggKCBydWxlX19YUmV0dXJuRXhwcmVzc2lvbl9fRXhwcmVzc2lvbkFzc2lnbm1lbnRfMiApPyApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMDYwODoxOiAoICggKCBydWxlX19YUmV0dXJuRXhwcmVzc2lvbl9fRXhwcmVzc2lvbkFzc2lnbm1lbnRfMiApPyApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIwNjA5OjE6ICggKCBydWxlX19YUmV0dXJuRXhwcmVzc2lvbl9fRXhwcmVzc2lvbkFzc2lnbm1lbnRfMiApPyApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxOTI3MToxOiAoICggcnVsZV9fWFJldHVybkV4cHJlc3Npb25fX0V4cHJlc3Npb25Bc3NpZ25tZW50XzIgKT8gKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTkyNzI6MjogKCBydWxlX19YUmV0dXJuRXhwcmVzc2lvbl9fRXhwcmVzc2lvbkFzc2lnbm1lbnRfMiApPworICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjA2MDk6MTogKCAoIHJ1bGVfX1hSZXR1cm5FeHByZXNzaW9uX19FeHByZXNzaW9uQXNzaWdubWVudF8yICk/ICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIwNjEwOjI6ICggcnVsZV9fWFJldHVybkV4cHJlc3Npb25fX0V4cHJlc3Npb25Bc3NpZ25tZW50XzIgKT8KICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WFJldHVybkV4cHJlc3Npb25BY2Nlc3MoKS5nZXRFeHByZXNzaW9uQXNzaWdubWVudF8yKCkpOyAKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE5MjczOjI6ICggcnVsZV9fWFJldHVybkV4cHJlc3Npb25fX0V4cHJlc3Npb25Bc3NpZ25tZW50XzIgKT8KLSAgICAgICAgICAgIGludCBhbHQxNTI9MjsKLSAgICAgICAgICAgIGFsdDE1MiA9IGRmYTE1Mi5wcmVkaWN0KGlucHV0KTsKLSAgICAgICAgICAgIHN3aXRjaCAoYWx0MTUyKSB7CisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMDYxMToyOiAoIHJ1bGVfX1hSZXR1cm5FeHByZXNzaW9uX19FeHByZXNzaW9uQXNzaWdubWVudF8yICk/CisgICAgICAgICAgICBpbnQgYWx0MTY1PTI7CisgICAgICAgICAgICBhbHQxNjUgPSBkZmExNjUucHJlZGljdChpbnB1dCk7CisgICAgICAgICAgICBzd2l0Y2ggKGFsdDE2NSkgewogICAgICAgICAgICAgICAgIGNhc2UgMSA6Ci0gICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE5MjczOjM6IHJ1bGVfX1hSZXR1cm5FeHByZXNzaW9uX19FeHByZXNzaW9uQXNzaWdubWVudF8yCisgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIwNjExOjM6IHJ1bGVfX1hSZXR1cm5FeHByZXNzaW9uX19FeHByZXNzaW9uQXNzaWdubWVudF8yCiAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMik7CiAgICAgICAgICAgICAgICAgICAgIHJ1bGVfX1hSZXR1cm5FeHByZXNzaW9uX19FeHByZXNzaW9uQXNzaWdubWVudF8yKCk7CkBAIC02MzQxNCwxNiArNjc4NzEsMTYgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YVHJ5Q2F0Y2hGaW5hbGx5RXhwcmVzc2lvbl9fR3JvdXBfXzAiCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTkyODI6MTogcnVsZV9fWFRyeUNhdGNoRmluYWxseUV4cHJlc3Npb25fX0dyb3VwX18wIDogcnVsZV9fWFRyeUNhdGNoRmluYWxseUV4cHJlc3Npb25fX0dyb3VwX18wX19JbXBsIHJ1bGVfX1hUcnlDYXRjaEZpbmFsbHlFeHByZXNzaW9uX19Hcm91cF9fMSA7CisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjA2MjA6MTogcnVsZV9fWFRyeUNhdGNoRmluYWxseUV4cHJlc3Npb25fX0dyb3VwX18wIDogcnVsZV9fWFRyeUNhdGNoRmluYWxseUV4cHJlc3Npb25fX0dyb3VwX18wX19JbXBsIHJ1bGVfX1hUcnlDYXRjaEZpbmFsbHlFeHByZXNzaW9uX19Hcm91cF9fMSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fWFRyeUNhdGNoRmluYWxseUV4cHJlc3Npb25fX0dyb3VwX18wKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE5Mjg2OjE6ICggcnVsZV9fWFRyeUNhdGNoRmluYWxseUV4cHJlc3Npb25fX0dyb3VwX18wX19JbXBsIHJ1bGVfX1hUcnlDYXRjaEZpbmFsbHlFeHByZXNzaW9uX19Hcm91cF9fMSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxOTI4NzoyOiBydWxlX19YVHJ5Q2F0Y2hGaW5hbGx5RXhwcmVzc2lvbl9fR3JvdXBfXzBfX0ltcGwgcnVsZV9fWFRyeUNhdGNoRmluYWxseUV4cHJlc3Npb25fX0dyb3VwX18xCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMDYyNDoxOiAoIHJ1bGVfX1hUcnlDYXRjaEZpbmFsbHlFeHByZXNzaW9uX19Hcm91cF9fMF9fSW1wbCBydWxlX19YVHJ5Q2F0Y2hGaW5hbGx5RXhwcmVzc2lvbl9fR3JvdXBfXzEgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjA2MjU6MjogcnVsZV9fWFRyeUNhdGNoRmluYWxseUV4cHJlc3Npb25fX0dyb3VwX18wX19JbXBsIHJ1bGVfX1hUcnlDYXRjaEZpbmFsbHlFeHByZXNzaW9uX19Hcm91cF9fMQogICAgICAgICAgICAgewotICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMTQ0KTsKKyAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzE1Mik7CiAgICAgICAgICAgICBydWxlX19YVHJ5Q2F0Y2hGaW5hbGx5RXhwcmVzc2lvbl9fR3JvdXBfXzBfX0ltcGwoKTsKIAogICAgICAgICAgICAgc3RhdGUuX2ZzcC0tOwpAQCAtNjM0NTIsMjMgKzY3OTA5LDIzIEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fWFRyeUNhdGNoRmluYWxseUV4cHJlc3Npb25fX0dyb3VwX18wX19JbXBsIgotICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE5Mjk0OjE6IHJ1bGVfX1hUcnlDYXRjaEZpbmFsbHlFeHByZXNzaW9uX19Hcm91cF9fMF9fSW1wbCA6ICggKCkgKSA7CisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjA2MzI6MTogcnVsZV9fWFRyeUNhdGNoRmluYWxseUV4cHJlc3Npb25fX0dyb3VwX18wX19JbXBsIDogKCAoKSApIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YVHJ5Q2F0Y2hGaW5hbGx5RXhwcmVzc2lvbl9fR3JvdXBfXzBfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTkyOTg6MTogKCAoICgpICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTkyOTk6MTogKCAoKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMDYzNjoxOiAoICggKCkgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMDYzNzoxOiAoICgpICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE5Mjk5OjE6ICggKCkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTkzMDA6MjogKCkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIwNjM3OjE6ICggKCkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjA2Mzg6MjogKCkKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WFRyeUNhdGNoRmluYWxseUV4cHJlc3Npb25BY2Nlc3MoKS5nZXRYVHJ5Q2F0Y2hGaW5hbGx5RXhwcmVzc2lvbkFjdGlvbl8wKCkpOyAKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE5MzAxOjI6ICgpCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxOTMwMTozOiAKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIwNjM5OjI6ICgpCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMDYzOTozOiAKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIH0KIApAQCAtNjM0OTMsMTYgKzY3OTUwLDE2IEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fWFRyeUNhdGNoRmluYWxseUV4cHJlc3Npb25fX0dyb3VwX18xIgotICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE5MzA5OjE6IHJ1bGVfX1hUcnlDYXRjaEZpbmFsbHlFeHByZXNzaW9uX19Hcm91cF9fMSA6IHJ1bGVfX1hUcnlDYXRjaEZpbmFsbHlFeHByZXNzaW9uX19Hcm91cF9fMV9fSW1wbCBydWxlX19YVHJ5Q2F0Y2hGaW5hbGx5RXhwcmVzc2lvbl9fR3JvdXBfXzIgOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIwNjQ3OjE6IHJ1bGVfX1hUcnlDYXRjaEZpbmFsbHlFeHByZXNzaW9uX19Hcm91cF9fMSA6IHJ1bGVfX1hUcnlDYXRjaEZpbmFsbHlFeHByZXNzaW9uX19Hcm91cF9fMV9fSW1wbCBydWxlX19YVHJ5Q2F0Y2hGaW5hbGx5RXhwcmVzc2lvbl9fR3JvdXBfXzIgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1hUcnlDYXRjaEZpbmFsbHlFeHByZXNzaW9uX19Hcm91cF9fMSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxOTMxMzoxOiAoIHJ1bGVfX1hUcnlDYXRjaEZpbmFsbHlFeHByZXNzaW9uX19Hcm91cF9fMV9fSW1wbCBydWxlX19YVHJ5Q2F0Y2hGaW5hbGx5RXhwcmVzc2lvbl9fR3JvdXBfXzIgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTkzMTQ6MjogcnVsZV9fWFRyeUNhdGNoRmluYWxseUV4cHJlc3Npb25fX0dyb3VwX18xX19JbXBsIHJ1bGVfX1hUcnlDYXRjaEZpbmFsbHlFeHByZXNzaW9uX19Hcm91cF9fMgorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjA2NTE6MTogKCBydWxlX19YVHJ5Q2F0Y2hGaW5hbGx5RXhwcmVzc2lvbl9fR3JvdXBfXzFfX0ltcGwgcnVsZV9fWFRyeUNhdGNoRmluYWxseUV4cHJlc3Npb25fX0dyb3VwX18yICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIwNjUyOjI6IHJ1bGVfX1hUcnlDYXRjaEZpbmFsbHlFeHByZXNzaW9uX19Hcm91cF9fMV9fSW1wbCBydWxlX19YVHJ5Q2F0Y2hGaW5hbGx5RXhwcmVzc2lvbl9fR3JvdXBfXzIKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzc0KTsKKyAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzgyKTsKICAgICAgICAgICAgIHJ1bGVfX1hUcnlDYXRjaEZpbmFsbHlFeHByZXNzaW9uX19Hcm91cF9fMV9fSW1wbCgpOwogCiAgICAgICAgICAgICBzdGF0ZS5fZnNwLS07CkBAIC02MzUzMSwyMiArNjc5ODgsMjIgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YVHJ5Q2F0Y2hGaW5hbGx5RXhwcmVzc2lvbl9fR3JvdXBfXzFfX0ltcGwiCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTkzMjE6MTogcnVsZV9fWFRyeUNhdGNoRmluYWxseUV4cHJlc3Npb25fX0dyb3VwX18xX19JbXBsIDogKCAndHJ5JyApIDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMDY1OToxOiBydWxlX19YVHJ5Q2F0Y2hGaW5hbGx5RXhwcmVzc2lvbl9fR3JvdXBfXzFfX0ltcGwgOiAoICd0cnknICkgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1hUcnlDYXRjaEZpbmFsbHlFeHByZXNzaW9uX19Hcm91cF9fMV9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxOTMyNToxOiAoICggJ3RyeScgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxOTMyNjoxOiAoICd0cnknICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIwNjYzOjE6ICggKCAndHJ5JyApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIwNjY0OjE6ICggJ3RyeScgKQogICAgICAgICAgICAgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTkzMjY6MTogKCAndHJ5JyApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxOTMyNzoyOiAndHJ5JworICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjA2NjQ6MTogKCAndHJ5JyApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMDY2NToyOiAndHJ5JwogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYVHJ5Q2F0Y2hGaW5hbGx5RXhwcmVzc2lvbkFjY2VzcygpLmdldFRyeUtleXdvcmRfMSgpKTsgCiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBtYXRjaChpbnB1dCwxMzMsRk9MTE9XXzIpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOworICAgICAgICAgICAgbWF0Y2goaW5wdXQsMTQzLEZPTExPV18yKTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRYVHJ5Q2F0Y2hGaW5hbGx5RXhwcmVzc2lvbkFjY2VzcygpLmdldFRyeUtleXdvcmRfMSgpKTsgCiAgICAgICAgICAgICB9CkBAIC02MzU3MiwxNiArNjgwMjksMTYgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YVHJ5Q2F0Y2hGaW5hbGx5RXhwcmVzc2lvbl9fR3JvdXBfXzIiCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTkzMzY6MTogcnVsZV9fWFRyeUNhdGNoRmluYWxseUV4cHJlc3Npb25fX0dyb3VwX18yIDogcnVsZV9fWFRyeUNhdGNoRmluYWxseUV4cHJlc3Npb25fX0dyb3VwX18yX19JbXBsIHJ1bGVfX1hUcnlDYXRjaEZpbmFsbHlFeHByZXNzaW9uX19Hcm91cF9fMyA7CisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjA2NzQ6MTogcnVsZV9fWFRyeUNhdGNoRmluYWxseUV4cHJlc3Npb25fX0dyb3VwX18yIDogcnVsZV9fWFRyeUNhdGNoRmluYWxseUV4cHJlc3Npb25fX0dyb3VwX18yX19JbXBsIHJ1bGVfX1hUcnlDYXRjaEZpbmFsbHlFeHByZXNzaW9uX19Hcm91cF9fMyA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fWFRyeUNhdGNoRmluYWxseUV4cHJlc3Npb25fX0dyb3VwX18yKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE5MzQwOjE6ICggcnVsZV9fWFRyeUNhdGNoRmluYWxseUV4cHJlc3Npb25fX0dyb3VwX18yX19JbXBsIHJ1bGVfX1hUcnlDYXRjaEZpbmFsbHlFeHByZXNzaW9uX19Hcm91cF9fMyApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxOTM0MToyOiBydWxlX19YVHJ5Q2F0Y2hGaW5hbGx5RXhwcmVzc2lvbl9fR3JvdXBfXzJfX0ltcGwgcnVsZV9fWFRyeUNhdGNoRmluYWxseUV4cHJlc3Npb25fX0dyb3VwX18zCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMDY3ODoxOiAoIHJ1bGVfX1hUcnlDYXRjaEZpbmFsbHlFeHByZXNzaW9uX19Hcm91cF9fMl9fSW1wbCBydWxlX19YVHJ5Q2F0Y2hGaW5hbGx5RXhwcmVzc2lvbl9fR3JvdXBfXzMgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjA2Nzk6MjogcnVsZV9fWFRyeUNhdGNoRmluYWxseUV4cHJlc3Npb25fX0dyb3VwX18yX19JbXBsIHJ1bGVfX1hUcnlDYXRjaEZpbmFsbHlFeHByZXNzaW9uX19Hcm91cF9fMwogICAgICAgICAgICAgewotICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMTQ1KTsKKyAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzE1Myk7CiAgICAgICAgICAgICBydWxlX19YVHJ5Q2F0Y2hGaW5hbGx5RXhwcmVzc2lvbl9fR3JvdXBfXzJfX0ltcGwoKTsKIAogICAgICAgICAgICAgc3RhdGUuX2ZzcC0tOwpAQCAtNjM2MTAsMjMgKzY4MDY3LDIzIEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fWFRyeUNhdGNoRmluYWxseUV4cHJlc3Npb25fX0dyb3VwX18yX19JbXBsIgotICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE5MzQ4OjE6IHJ1bGVfX1hUcnlDYXRjaEZpbmFsbHlFeHByZXNzaW9uX19Hcm91cF9fMl9fSW1wbCA6ICggKCBydWxlX19YVHJ5Q2F0Y2hGaW5hbGx5RXhwcmVzc2lvbl9fRXhwcmVzc2lvbkFzc2lnbm1lbnRfMiApICkgOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIwNjg2OjE6IHJ1bGVfX1hUcnlDYXRjaEZpbmFsbHlFeHByZXNzaW9uX19Hcm91cF9fMl9fSW1wbCA6ICggKCBydWxlX19YVHJ5Q2F0Y2hGaW5hbGx5RXhwcmVzc2lvbl9fRXhwcmVzc2lvbkFzc2lnbm1lbnRfMiApICkgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1hUcnlDYXRjaEZpbmFsbHlFeHByZXNzaW9uX19Hcm91cF9fMl9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxOTM1MjoxOiAoICggKCBydWxlX19YVHJ5Q2F0Y2hGaW5hbGx5RXhwcmVzc2lvbl9fRXhwcmVzc2lvbkFzc2lnbm1lbnRfMiApICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTkzNTM6MTogKCAoIHJ1bGVfX1hUcnlDYXRjaEZpbmFsbHlFeHByZXNzaW9uX19FeHByZXNzaW9uQXNzaWdubWVudF8yICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjA2OTA6MTogKCAoICggcnVsZV9fWFRyeUNhdGNoRmluYWxseUV4cHJlc3Npb25fX0V4cHJlc3Npb25Bc3NpZ25tZW50XzIgKSApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIwNjkxOjE6ICggKCBydWxlX19YVHJ5Q2F0Y2hGaW5hbGx5RXhwcmVzc2lvbl9fRXhwcmVzc2lvbkFzc2lnbm1lbnRfMiApICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE5MzUzOjE6ICggKCBydWxlX19YVHJ5Q2F0Y2hGaW5hbGx5RXhwcmVzc2lvbl9fRXhwcmVzc2lvbkFzc2lnbm1lbnRfMiApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE5MzU0OjI6ICggcnVsZV9fWFRyeUNhdGNoRmluYWxseUV4cHJlc3Npb25fX0V4cHJlc3Npb25Bc3NpZ25tZW50XzIgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjA2OTE6MTogKCAoIHJ1bGVfX1hUcnlDYXRjaEZpbmFsbHlFeHByZXNzaW9uX19FeHByZXNzaW9uQXNzaWdubWVudF8yICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjA2OTI6MjogKCBydWxlX19YVHJ5Q2F0Y2hGaW5hbGx5RXhwcmVzc2lvbl9fRXhwcmVzc2lvbkFzc2lnbm1lbnRfMiApCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhUcnlDYXRjaEZpbmFsbHlFeHByZXNzaW9uQWNjZXNzKCkuZ2V0RXhwcmVzc2lvbkFzc2lnbm1lbnRfMigpKTsgCiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxOTM1NToyOiAoIHJ1bGVfX1hUcnlDYXRjaEZpbmFsbHlFeHByZXNzaW9uX19FeHByZXNzaW9uQXNzaWdubWVudF8yICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE5MzU1OjM6IHJ1bGVfX1hUcnlDYXRjaEZpbmFsbHlFeHByZXNzaW9uX19FeHByZXNzaW9uQXNzaWdubWVudF8yCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMDY5MzoyOiAoIHJ1bGVfX1hUcnlDYXRjaEZpbmFsbHlFeHByZXNzaW9uX19FeHByZXNzaW9uQXNzaWdubWVudF8yICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIwNjkzOjM6IHJ1bGVfX1hUcnlDYXRjaEZpbmFsbHlFeHByZXNzaW9uX19FeHByZXNzaW9uQXNzaWdubWVudF8yCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV18yKTsKICAgICAgICAgICAgIHJ1bGVfX1hUcnlDYXRjaEZpbmFsbHlFeHByZXNzaW9uX19FeHByZXNzaW9uQXNzaWdubWVudF8yKCk7CkBAIC02MzY2MSwxNCArNjgxMTgsMTQgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YVHJ5Q2F0Y2hGaW5hbGx5RXhwcmVzc2lvbl9fR3JvdXBfXzMiCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTkzNjM6MTogcnVsZV9fWFRyeUNhdGNoRmluYWxseUV4cHJlc3Npb25fX0dyb3VwX18zIDogcnVsZV9fWFRyeUNhdGNoRmluYWxseUV4cHJlc3Npb25fX0dyb3VwX18zX19JbXBsIDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMDcwMToxOiBydWxlX19YVHJ5Q2F0Y2hGaW5hbGx5RXhwcmVzc2lvbl9fR3JvdXBfXzMgOiBydWxlX19YVHJ5Q2F0Y2hGaW5hbGx5RXhwcmVzc2lvbl9fR3JvdXBfXzNfX0ltcGwgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1hUcnlDYXRjaEZpbmFsbHlFeHByZXNzaW9uX19Hcm91cF9fMygpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxOTM2NzoxOiAoIHJ1bGVfX1hUcnlDYXRjaEZpbmFsbHlFeHByZXNzaW9uX19Hcm91cF9fM19fSW1wbCApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxOTM2ODoyOiBydWxlX19YVHJ5Q2F0Y2hGaW5hbGx5RXhwcmVzc2lvbl9fR3JvdXBfXzNfX0ltcGwKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIwNzA1OjE6ICggcnVsZV9fWFRyeUNhdGNoRmluYWxseUV4cHJlc3Npb25fX0dyb3VwX18zX19JbXBsICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIwNzA2OjI6IHJ1bGVfX1hUcnlDYXRjaEZpbmFsbHlFeHByZXNzaW9uX19Hcm91cF9fM19fSW1wbAogICAgICAgICAgICAgewogICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMik7CiAgICAgICAgICAgICBydWxlX19YVHJ5Q2F0Y2hGaW5hbGx5RXhwcmVzc2lvbl9fR3JvdXBfXzNfX0ltcGwoKTsKQEAgLTYzNjk0LDIzICs2ODE1MSwyMyBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX1hUcnlDYXRjaEZpbmFsbHlFeHByZXNzaW9uX19Hcm91cF9fM19fSW1wbCIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxOTM3NDoxOiBydWxlX19YVHJ5Q2F0Y2hGaW5hbGx5RXhwcmVzc2lvbl9fR3JvdXBfXzNfX0ltcGwgOiAoICggcnVsZV9fWFRyeUNhdGNoRmluYWxseUV4cHJlc3Npb25fX0FsdGVybmF0aXZlc18zICkgKSA7CisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjA3MTI6MTogcnVsZV9fWFRyeUNhdGNoRmluYWxseUV4cHJlc3Npb25fX0dyb3VwX18zX19JbXBsIDogKCAoIHJ1bGVfX1hUcnlDYXRjaEZpbmFsbHlFeHByZXNzaW9uX19BbHRlcm5hdGl2ZXNfMyApICkgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1hUcnlDYXRjaEZpbmFsbHlFeHByZXNzaW9uX19Hcm91cF9fM19fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxOTM3ODoxOiAoICggKCBydWxlX19YVHJ5Q2F0Y2hGaW5hbGx5RXhwcmVzc2lvbl9fQWx0ZXJuYXRpdmVzXzMgKSApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE5Mzc5OjE6ICggKCBydWxlX19YVHJ5Q2F0Y2hGaW5hbGx5RXhwcmVzc2lvbl9fQWx0ZXJuYXRpdmVzXzMgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMDcxNjoxOiAoICggKCBydWxlX19YVHJ5Q2F0Y2hGaW5hbGx5RXhwcmVzc2lvbl9fQWx0ZXJuYXRpdmVzXzMgKSApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIwNzE3OjE6ICggKCBydWxlX19YVHJ5Q2F0Y2hGaW5hbGx5RXhwcmVzc2lvbl9fQWx0ZXJuYXRpdmVzXzMgKSApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxOTM3OToxOiAoICggcnVsZV9fWFRyeUNhdGNoRmluYWxseUV4cHJlc3Npb25fX0FsdGVybmF0aXZlc18zICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTkzODA6MjogKCBydWxlX19YVHJ5Q2F0Y2hGaW5hbGx5RXhwcmVzc2lvbl9fQWx0ZXJuYXRpdmVzXzMgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjA3MTc6MTogKCAoIHJ1bGVfX1hUcnlDYXRjaEZpbmFsbHlFeHByZXNzaW9uX19BbHRlcm5hdGl2ZXNfMyApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIwNzE4OjI6ICggcnVsZV9fWFRyeUNhdGNoRmluYWxseUV4cHJlc3Npb25fX0FsdGVybmF0aXZlc18zICkKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WFRyeUNhdGNoRmluYWxseUV4cHJlc3Npb25BY2Nlc3MoKS5nZXRBbHRlcm5hdGl2ZXNfMygpKTsgCiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxOTM4MToyOiAoIHJ1bGVfX1hUcnlDYXRjaEZpbmFsbHlFeHByZXNzaW9uX19BbHRlcm5hdGl2ZXNfMyApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxOTM4MTozOiBydWxlX19YVHJ5Q2F0Y2hGaW5hbGx5RXhwcmVzc2lvbl9fQWx0ZXJuYXRpdmVzXzMKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIwNzE5OjI6ICggcnVsZV9fWFRyeUNhdGNoRmluYWxseUV4cHJlc3Npb25fX0FsdGVybmF0aXZlc18zICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIwNzE5OjM6IHJ1bGVfX1hUcnlDYXRjaEZpbmFsbHlFeHByZXNzaW9uX19BbHRlcm5hdGl2ZXNfMwogICAgICAgICAgICAgewogICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMik7CiAgICAgICAgICAgICBydWxlX19YVHJ5Q2F0Y2hGaW5hbGx5RXhwcmVzc2lvbl9fQWx0ZXJuYXRpdmVzXzMoKTsKQEAgLTYzNzQ1LDE2ICs2ODIwMiwxNiBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX1hUcnlDYXRjaEZpbmFsbHlFeHByZXNzaW9uX19Hcm91cF8zXzBfXzAiCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTkzOTA6MTogcnVsZV9fWFRyeUNhdGNoRmluYWxseUV4cHJlc3Npb25fX0dyb3VwXzNfMF9fMCA6IHJ1bGVfX1hUcnlDYXRjaEZpbmFsbHlFeHByZXNzaW9uX19Hcm91cF8zXzBfXzBfX0ltcGwgcnVsZV9fWFRyeUNhdGNoRmluYWxseUV4cHJlc3Npb25fX0dyb3VwXzNfMF9fMSA7CisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjA3Mjg6MTogcnVsZV9fWFRyeUNhdGNoRmluYWxseUV4cHJlc3Npb25fX0dyb3VwXzNfMF9fMCA6IHJ1bGVfX1hUcnlDYXRjaEZpbmFsbHlFeHByZXNzaW9uX19Hcm91cF8zXzBfXzBfX0ltcGwgcnVsZV9fWFRyeUNhdGNoRmluYWxseUV4cHJlc3Npb25fX0dyb3VwXzNfMF9fMSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fWFRyeUNhdGNoRmluYWxseUV4cHJlc3Npb25fX0dyb3VwXzNfMF9fMCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxOTM5NDoxOiAoIHJ1bGVfX1hUcnlDYXRjaEZpbmFsbHlFeHByZXNzaW9uX19Hcm91cF8zXzBfXzBfX0ltcGwgcnVsZV9fWFRyeUNhdGNoRmluYWxseUV4cHJlc3Npb25fX0dyb3VwXzNfMF9fMSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxOTM5NToyOiBydWxlX19YVHJ5Q2F0Y2hGaW5hbGx5RXhwcmVzc2lvbl9fR3JvdXBfM18wX18wX19JbXBsIHJ1bGVfX1hUcnlDYXRjaEZpbmFsbHlFeHByZXNzaW9uX19Hcm91cF8zXzBfXzEKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIwNzMyOjE6ICggcnVsZV9fWFRyeUNhdGNoRmluYWxseUV4cHJlc3Npb25fX0dyb3VwXzNfMF9fMF9fSW1wbCBydWxlX19YVHJ5Q2F0Y2hGaW5hbGx5RXhwcmVzc2lvbl9fR3JvdXBfM18wX18xICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIwNzMzOjI6IHJ1bGVfX1hUcnlDYXRjaEZpbmFsbHlFeHByZXNzaW9uX19Hcm91cF8zXzBfXzBfX0ltcGwgcnVsZV9fWFRyeUNhdGNoRmluYWxseUV4cHJlc3Npb25fX0dyb3VwXzNfMF9fMQogICAgICAgICAgICAgewotICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMTQ2KTsKKyAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzE1NCk7CiAgICAgICAgICAgICBydWxlX19YVHJ5Q2F0Y2hGaW5hbGx5RXhwcmVzc2lvbl9fR3JvdXBfM18wX18wX19JbXBsKCk7CiAKICAgICAgICAgICAgIHN0YXRlLl9mc3AtLTsKQEAgLTYzNzgzLDI4ICs2ODI0MCwyOCBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX1hUcnlDYXRjaEZpbmFsbHlFeHByZXNzaW9uX19Hcm91cF8zXzBfXzBfX0ltcGwiCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTk0MDI6MTogcnVsZV9fWFRyeUNhdGNoRmluYWxseUV4cHJlc3Npb25fX0dyb3VwXzNfMF9fMF9fSW1wbCA6ICggKCAoIHJ1bGVfX1hUcnlDYXRjaEZpbmFsbHlFeHByZXNzaW9uX19DYXRjaENsYXVzZXNBc3NpZ25tZW50XzNfMF8wICkgKSAoICggcnVsZV9fWFRyeUNhdGNoRmluYWxseUV4cHJlc3Npb25fX0NhdGNoQ2xhdXNlc0Fzc2lnbm1lbnRfM18wXzAgKSogKSApIDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMDc0MDoxOiBydWxlX19YVHJ5Q2F0Y2hGaW5hbGx5RXhwcmVzc2lvbl9fR3JvdXBfM18wX18wX19JbXBsIDogKCAoICggcnVsZV9fWFRyeUNhdGNoRmluYWxseUV4cHJlc3Npb25fX0NhdGNoQ2xhdXNlc0Fzc2lnbm1lbnRfM18wXzAgKSApICggKCBydWxlX19YVHJ5Q2F0Y2hGaW5hbGx5RXhwcmVzc2lvbl9fQ2F0Y2hDbGF1c2VzQXNzaWdubWVudF8zXzBfMCApKiApICkgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1hUcnlDYXRjaEZpbmFsbHlFeHByZXNzaW9uX19Hcm91cF8zXzBfXzBfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTk0MDY6MTogKCAoICggKCBydWxlX19YVHJ5Q2F0Y2hGaW5hbGx5RXhwcmVzc2lvbl9fQ2F0Y2hDbGF1c2VzQXNzaWdubWVudF8zXzBfMCApICkgKCAoIHJ1bGVfX1hUcnlDYXRjaEZpbmFsbHlFeHByZXNzaW9uX19DYXRjaENsYXVzZXNBc3NpZ25tZW50XzNfMF8wICkqICkgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxOTQwNzoxOiAoICggKCBydWxlX19YVHJ5Q2F0Y2hGaW5hbGx5RXhwcmVzc2lvbl9fQ2F0Y2hDbGF1c2VzQXNzaWdubWVudF8zXzBfMCApICkgKCAoIHJ1bGVfX1hUcnlDYXRjaEZpbmFsbHlFeHByZXNzaW9uX19DYXRjaENsYXVzZXNBc3NpZ25tZW50XzNfMF8wICkqICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjA3NDQ6MTogKCAoICggKCBydWxlX19YVHJ5Q2F0Y2hGaW5hbGx5RXhwcmVzc2lvbl9fQ2F0Y2hDbGF1c2VzQXNzaWdubWVudF8zXzBfMCApICkgKCAoIHJ1bGVfX1hUcnlDYXRjaEZpbmFsbHlFeHByZXNzaW9uX19DYXRjaENsYXVzZXNBc3NpZ25tZW50XzNfMF8wICkqICkgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMDc0NToxOiAoICggKCBydWxlX19YVHJ5Q2F0Y2hGaW5hbGx5RXhwcmVzc2lvbl9fQ2F0Y2hDbGF1c2VzQXNzaWdubWVudF8zXzBfMCApICkgKCAoIHJ1bGVfX1hUcnlDYXRjaEZpbmFsbHlFeHByZXNzaW9uX19DYXRjaENsYXVzZXNBc3NpZ25tZW50XzNfMF8wICkqICkgKQogICAgICAgICAgICAgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTk0MDc6MTogKCAoICggcnVsZV9fWFRyeUNhdGNoRmluYWxseUV4cHJlc3Npb25fX0NhdGNoQ2xhdXNlc0Fzc2lnbm1lbnRfM18wXzAgKSApICggKCBydWxlX19YVHJ5Q2F0Y2hGaW5hbGx5RXhwcmVzc2lvbl9fQ2F0Y2hDbGF1c2VzQXNzaWdubWVudF8zXzBfMCApKiApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE5NDA4OjI6ICggKCBydWxlX19YVHJ5Q2F0Y2hGaW5hbGx5RXhwcmVzc2lvbl9fQ2F0Y2hDbGF1c2VzQXNzaWdubWVudF8zXzBfMCApICkgKCAoIHJ1bGVfX1hUcnlDYXRjaEZpbmFsbHlFeHByZXNzaW9uX19DYXRjaENsYXVzZXNBc3NpZ25tZW50XzNfMF8wICkqICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIwNzQ1OjE6ICggKCAoIHJ1bGVfX1hUcnlDYXRjaEZpbmFsbHlFeHByZXNzaW9uX19DYXRjaENsYXVzZXNBc3NpZ25tZW50XzNfMF8wICkgKSAoICggcnVsZV9fWFRyeUNhdGNoRmluYWxseUV4cHJlc3Npb25fX0NhdGNoQ2xhdXNlc0Fzc2lnbm1lbnRfM18wXzAgKSogKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMDc0NjoyOiAoICggcnVsZV9fWFRyeUNhdGNoRmluYWxseUV4cHJlc3Npb25fX0NhdGNoQ2xhdXNlc0Fzc2lnbm1lbnRfM18wXzAgKSApICggKCBydWxlX19YVHJ5Q2F0Y2hGaW5hbGx5RXhwcmVzc2lvbl9fQ2F0Y2hDbGF1c2VzQXNzaWdubWVudF8zXzBfMCApKiApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxOTQwODoyOiAoICggcnVsZV9fWFRyeUNhdGNoRmluYWxseUV4cHJlc3Npb25fX0NhdGNoQ2xhdXNlc0Fzc2lnbm1lbnRfM18wXzAgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxOTQwOTozOiAoIHJ1bGVfX1hUcnlDYXRjaEZpbmFsbHlFeHByZXNzaW9uX19DYXRjaENsYXVzZXNBc3NpZ25tZW50XzNfMF8wICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIwNzQ2OjI6ICggKCBydWxlX19YVHJ5Q2F0Y2hGaW5hbGx5RXhwcmVzc2lvbl9fQ2F0Y2hDbGF1c2VzQXNzaWdubWVudF8zXzBfMCApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIwNzQ3OjM6ICggcnVsZV9fWFRyeUNhdGNoRmluYWxseUV4cHJlc3Npb25fX0NhdGNoQ2xhdXNlc0Fzc2lnbm1lbnRfM18wXzAgKQogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYVHJ5Q2F0Y2hGaW5hbGx5RXhwcmVzc2lvbkFjY2VzcygpLmdldENhdGNoQ2xhdXNlc0Fzc2lnbm1lbnRfM18wXzAoKSk7IAogICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTk0MTA6MzogKCBydWxlX19YVHJ5Q2F0Y2hGaW5hbGx5RXhwcmVzc2lvbl9fQ2F0Y2hDbGF1c2VzQXNzaWdubWVudF8zXzBfMCApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxOTQxMDo0OiBydWxlX19YVHJ5Q2F0Y2hGaW5hbGx5RXhwcmVzc2lvbl9fQ2F0Y2hDbGF1c2VzQXNzaWdubWVudF8zXzBfMAorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjA3NDg6MzogKCBydWxlX19YVHJ5Q2F0Y2hGaW5hbGx5RXhwcmVzc2lvbl9fQ2F0Y2hDbGF1c2VzQXNzaWdubWVudF8zXzBfMCApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMDc0ODo0OiBydWxlX19YVHJ5Q2F0Y2hGaW5hbGx5RXhwcmVzc2lvbl9fQ2F0Y2hDbGF1c2VzQXNzaWdubWVudF8zXzBfMAogICAgICAgICAgICAgewotICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMTQ3KTsKKyAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzE1NSk7CiAgICAgICAgICAgICBydWxlX19YVHJ5Q2F0Y2hGaW5hbGx5RXhwcmVzc2lvbl9fQ2F0Y2hDbGF1c2VzQXNzaWdubWVudF8zXzBfMCgpOwogCiAgICAgICAgICAgICBzdGF0ZS5fZnNwLS07CkBAIC02MzgxOCwzNCArNjgyNzUsMzQgQEAKIAogICAgICAgICAgICAgfQogCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxOTQxMzoyOiAoICggcnVsZV9fWFRyeUNhdGNoRmluYWxseUV4cHJlc3Npb25fX0NhdGNoQ2xhdXNlc0Fzc2lnbm1lbnRfM18wXzAgKSogKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTk0MTQ6MzogKCBydWxlX19YVHJ5Q2F0Y2hGaW5hbGx5RXhwcmVzc2lvbl9fQ2F0Y2hDbGF1c2VzQXNzaWdubWVudF8zXzBfMCApKgorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjA3NTE6MjogKCAoIHJ1bGVfX1hUcnlDYXRjaEZpbmFsbHlFeHByZXNzaW9uX19DYXRjaENsYXVzZXNBc3NpZ25tZW50XzNfMF8wICkqICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIwNzUyOjM6ICggcnVsZV9fWFRyeUNhdGNoRmluYWxseUV4cHJlc3Npb25fX0NhdGNoQ2xhdXNlc0Fzc2lnbm1lbnRfM18wXzAgKSoKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WFRyeUNhdGNoRmluYWxseUV4cHJlc3Npb25BY2Nlc3MoKS5nZXRDYXRjaENsYXVzZXNBc3NpZ25tZW50XzNfMF8wKCkpOyAKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE5NDE1OjM6ICggcnVsZV9fWFRyeUNhdGNoRmluYWxseUV4cHJlc3Npb25fX0NhdGNoQ2xhdXNlc0Fzc2lnbm1lbnRfM18wXzAgKSoKLSAgICAgICAgICAgIGxvb3AxNTM6CisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMDc1MzozOiAoIHJ1bGVfX1hUcnlDYXRjaEZpbmFsbHlFeHByZXNzaW9uX19DYXRjaENsYXVzZXNBc3NpZ25tZW50XzNfMF8wICkqCisgICAgICAgICAgICBsb29wMTY2OgogICAgICAgICAgICAgZG8gewotICAgICAgICAgICAgICAgIGludCBhbHQxNTM9MjsKLSAgICAgICAgICAgICAgICBpbnQgTEExNTNfMCA9IGlucHV0LkxBKDEpOworICAgICAgICAgICAgICAgIGludCBhbHQxNjY9MjsKKyAgICAgICAgICAgICAgICBpbnQgTEExNjZfMCA9IGlucHV0LkxBKDEpOwogCi0gICAgICAgICAgICAgICAgaWYgKCAoTEExNTNfMD09MTM2KSApIHsKLSAgICAgICAgICAgICAgICAgICAgaW50IExBMTUzXzIgPSBpbnB1dC5MQSgyKTsKKyAgICAgICAgICAgICAgICBpZiAoIChMQTE2Nl8wPT0xNDYpICkgeworICAgICAgICAgICAgICAgICAgICBpbnQgTEExNjZfMiA9IGlucHV0LkxBKDIpOwogCi0gICAgICAgICAgICAgICAgICAgIGlmICggKHN5bnByZWQyMDdfSW50ZXJuYWxEYXRhRFNMKCkpICkgewotICAgICAgICAgICAgICAgICAgICAgICAgYWx0MTUzPTE7CisgICAgICAgICAgICAgICAgICAgIGlmICggKHN5bnByZWQyMjZfSW50ZXJuYWxEYXRhRFNMKCkpICkgeworICAgICAgICAgICAgICAgICAgICAgICAgYWx0MTY2PTE7CiAgICAgICAgICAgICAgICAgICAgIH0KIAogCiAgICAgICAgICAgICAgICAgfQogCiAKLSAgICAgICAgICAgICAgICBzd2l0Y2ggKGFsdDE1MykgeworICAgICAgICAgICAgICAgIHN3aXRjaCAoYWx0MTY2KSB7CiAgICAgICAgICAgICAJY2FzZSAxIDoKLSAgICAgICAgICAgIAkgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTk0MTU6NDogcnVsZV9fWFRyeUNhdGNoRmluYWxseUV4cHJlc3Npb25fX0NhdGNoQ2xhdXNlc0Fzc2lnbm1lbnRfM18wXzAKKyAgICAgICAgICAgIAkgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjA3NTM6NDogcnVsZV9fWFRyeUNhdGNoRmluYWxseUV4cHJlc3Npb25fX0NhdGNoQ2xhdXNlc0Fzc2lnbm1lbnRfM18wXzAKICAgICAgICAgICAgIAkgICAgewotICAgICAgICAgICAgCSAgICBwdXNoRm9sbG93KEZPTExPV18xNDcpOworICAgICAgICAgICAgCSAgICBwdXNoRm9sbG93KEZPTExPV18xNTUpOwogICAgICAgICAgICAgCSAgICBydWxlX19YVHJ5Q2F0Y2hGaW5hbGx5RXhwcmVzc2lvbl9fQ2F0Y2hDbGF1c2VzQXNzaWdubWVudF8zXzBfMCgpOwogCiAgICAgICAgICAgICAJICAgIHN0YXRlLl9mc3AtLTsKQEAgLTYzODU1LDcgKzY4MzEyLDcgQEAKICAgICAgICAgICAgIAkgICAgYnJlYWs7CiAKICAgICAgICAgICAgIAlkZWZhdWx0IDoKLSAgICAgICAgICAgIAkgICAgYnJlYWsgbG9vcDE1MzsKKyAgICAgICAgICAgIAkgICAgYnJlYWsgbG9vcDE2NjsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9IHdoaWxlICh0cnVlKTsKIApAQCAtNjM4ODcsMTQgKzY4MzQ0LDE0IEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fWFRyeUNhdGNoRmluYWxseUV4cHJlc3Npb25fX0dyb3VwXzNfMF9fMSIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxOTQyNDoxOiBydWxlX19YVHJ5Q2F0Y2hGaW5hbGx5RXhwcmVzc2lvbl9fR3JvdXBfM18wX18xIDogcnVsZV9fWFRyeUNhdGNoRmluYWxseUV4cHJlc3Npb25fX0dyb3VwXzNfMF9fMV9fSW1wbCA7CisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjA3NjI6MTogcnVsZV9fWFRyeUNhdGNoRmluYWxseUV4cHJlc3Npb25fX0dyb3VwXzNfMF9fMSA6IHJ1bGVfX1hUcnlDYXRjaEZpbmFsbHlFeHByZXNzaW9uX19Hcm91cF8zXzBfXzFfX0ltcGwgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1hUcnlDYXRjaEZpbmFsbHlFeHByZXNzaW9uX19Hcm91cF8zXzBfXzEoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTk0Mjg6MTogKCBydWxlX19YVHJ5Q2F0Y2hGaW5hbGx5RXhwcmVzc2lvbl9fR3JvdXBfM18wX18xX19JbXBsICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE5NDI5OjI6IHJ1bGVfX1hUcnlDYXRjaEZpbmFsbHlFeHByZXNzaW9uX19Hcm91cF8zXzBfXzFfX0ltcGwKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIwNzY2OjE6ICggcnVsZV9fWFRyeUNhdGNoRmluYWxseUV4cHJlc3Npb25fX0dyb3VwXzNfMF9fMV9fSW1wbCApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMDc2NzoyOiBydWxlX19YVHJ5Q2F0Y2hGaW5hbGx5RXhwcmVzc2lvbl9fR3JvdXBfM18wX18xX19JbXBsCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV18yKTsKICAgICAgICAgICAgIHJ1bGVfX1hUcnlDYXRjaEZpbmFsbHlFeHByZXNzaW9uX19Hcm91cF8zXzBfXzFfX0ltcGwoKTsKQEAgLTYzOTIwLDM1ICs2ODM3NywzNSBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX1hUcnlDYXRjaEZpbmFsbHlFeHByZXNzaW9uX19Hcm91cF8zXzBfXzFfX0ltcGwiCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTk0MzU6MTogcnVsZV9fWFRyeUNhdGNoRmluYWxseUV4cHJlc3Npb25fX0dyb3VwXzNfMF9fMV9fSW1wbCA6ICggKCBydWxlX19YVHJ5Q2F0Y2hGaW5hbGx5RXhwcmVzc2lvbl9fR3JvdXBfM18wXzFfXzAgKT8gKSA7CisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjA3NzM6MTogcnVsZV9fWFRyeUNhdGNoRmluYWxseUV4cHJlc3Npb25fX0dyb3VwXzNfMF9fMV9fSW1wbCA6ICggKCBydWxlX19YVHJ5Q2F0Y2hGaW5hbGx5RXhwcmVzc2lvbl9fR3JvdXBfM18wXzFfXzAgKT8gKSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fWFRyeUNhdGNoRmluYWxseUV4cHJlc3Npb25fX0dyb3VwXzNfMF9fMV9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxOTQzOToxOiAoICggKCBydWxlX19YVHJ5Q2F0Y2hGaW5hbGx5RXhwcmVzc2lvbl9fR3JvdXBfM18wXzFfXzAgKT8gKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxOTQ0MDoxOiAoICggcnVsZV9fWFRyeUNhdGNoRmluYWxseUV4cHJlc3Npb25fX0dyb3VwXzNfMF8xX18wICk/ICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIwNzc3OjE6ICggKCAoIHJ1bGVfX1hUcnlDYXRjaEZpbmFsbHlFeHByZXNzaW9uX19Hcm91cF8zXzBfMV9fMCApPyApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIwNzc4OjE6ICggKCBydWxlX19YVHJ5Q2F0Y2hGaW5hbGx5RXhwcmVzc2lvbl9fR3JvdXBfM18wXzFfXzAgKT8gKQogICAgICAgICAgICAgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTk0NDA6MTogKCAoIHJ1bGVfX1hUcnlDYXRjaEZpbmFsbHlFeHByZXNzaW9uX19Hcm91cF8zXzBfMV9fMCApPyApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxOTQ0MToyOiAoIHJ1bGVfX1hUcnlDYXRjaEZpbmFsbHlFeHByZXNzaW9uX19Hcm91cF8zXzBfMV9fMCApPworICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjA3Nzg6MTogKCAoIHJ1bGVfX1hUcnlDYXRjaEZpbmFsbHlFeHByZXNzaW9uX19Hcm91cF8zXzBfMV9fMCApPyApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMDc3OToyOiAoIHJ1bGVfX1hUcnlDYXRjaEZpbmFsbHlFeHByZXNzaW9uX19Hcm91cF8zXzBfMV9fMCApPwogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYVHJ5Q2F0Y2hGaW5hbGx5RXhwcmVzc2lvbkFjY2VzcygpLmdldEdyb3VwXzNfMF8xKCkpOyAKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE5NDQyOjI6ICggcnVsZV9fWFRyeUNhdGNoRmluYWxseUV4cHJlc3Npb25fX0dyb3VwXzNfMF8xX18wICk/Ci0gICAgICAgICAgICBpbnQgYWx0MTU0PTI7Ci0gICAgICAgICAgICBpbnQgTEExNTRfMCA9IGlucHV0LkxBKDEpOworICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjA3ODA6MjogKCBydWxlX19YVHJ5Q2F0Y2hGaW5hbGx5RXhwcmVzc2lvbl9fR3JvdXBfM18wXzFfXzAgKT8KKyAgICAgICAgICAgIGludCBhbHQxNjc9MjsKKyAgICAgICAgICAgIGludCBMQTE2N18wID0gaW5wdXQuTEEoMSk7CiAKLSAgICAgICAgICAgIGlmICggKExBMTU0XzA9PTEzNCkgKSB7Ci0gICAgICAgICAgICAgICAgaW50IExBMTU0XzEgPSBpbnB1dC5MQSgyKTsKKyAgICAgICAgICAgIGlmICggKExBMTY3XzA9PTE0NCkgKSB7CisgICAgICAgICAgICAgICAgaW50IExBMTY3XzEgPSBpbnB1dC5MQSgyKTsKIAotICAgICAgICAgICAgICAgIGlmICggKHN5bnByZWQyMDhfSW50ZXJuYWxEYXRhRFNMKCkpICkgewotICAgICAgICAgICAgICAgICAgICBhbHQxNTQ9MTsKKyAgICAgICAgICAgICAgICBpZiAoIChzeW5wcmVkMjI3X0ludGVybmFsRGF0YURTTCgpKSApIHsKKyAgICAgICAgICAgICAgICAgICAgYWx0MTY3PTE7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQotICAgICAgICAgICAgc3dpdGNoIChhbHQxNTQpIHsKKyAgICAgICAgICAgIHN3aXRjaCAoYWx0MTY3KSB7CiAgICAgICAgICAgICAgICAgY2FzZSAxIDoKLSAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTk0NDI6MzogcnVsZV9fWFRyeUNhdGNoRmluYWxseUV4cHJlc3Npb25fX0dyb3VwXzNfMF8xX18wCisgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIwNzgwOjM6IHJ1bGVfX1hUcnlDYXRjaEZpbmFsbHlFeHByZXNzaW9uX19Hcm91cF8zXzBfMV9fMAogICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzIpOwogICAgICAgICAgICAgICAgICAgICBydWxlX19YVHJ5Q2F0Y2hGaW5hbGx5RXhwcmVzc2lvbl9fR3JvdXBfM18wXzFfXzAoKTsKQEAgLTYzOTg2LDE2ICs2ODQ0MywxNiBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX1hUcnlDYXRjaEZpbmFsbHlFeHByZXNzaW9uX19Hcm91cF8zXzBfMV9fMCIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxOTQ1MToxOiBydWxlX19YVHJ5Q2F0Y2hGaW5hbGx5RXhwcmVzc2lvbl9fR3JvdXBfM18wXzFfXzAgOiBydWxlX19YVHJ5Q2F0Y2hGaW5hbGx5RXhwcmVzc2lvbl9fR3JvdXBfM18wXzFfXzBfX0ltcGwgcnVsZV9fWFRyeUNhdGNoRmluYWxseUV4cHJlc3Npb25fX0dyb3VwXzNfMF8xX18xIDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMDc4OToxOiBydWxlX19YVHJ5Q2F0Y2hGaW5hbGx5RXhwcmVzc2lvbl9fR3JvdXBfM18wXzFfXzAgOiBydWxlX19YVHJ5Q2F0Y2hGaW5hbGx5RXhwcmVzc2lvbl9fR3JvdXBfM18wXzFfXzBfX0ltcGwgcnVsZV9fWFRyeUNhdGNoRmluYWxseUV4cHJlc3Npb25fX0dyb3VwXzNfMF8xX18xIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YVHJ5Q2F0Y2hGaW5hbGx5RXhwcmVzc2lvbl9fR3JvdXBfM18wXzFfXzAoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTk0NTU6MTogKCBydWxlX19YVHJ5Q2F0Y2hGaW5hbGx5RXhwcmVzc2lvbl9fR3JvdXBfM18wXzFfXzBfX0ltcGwgcnVsZV9fWFRyeUNhdGNoRmluYWxseUV4cHJlc3Npb25fX0dyb3VwXzNfMF8xX18xICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE5NDU2OjI6IHJ1bGVfX1hUcnlDYXRjaEZpbmFsbHlFeHByZXNzaW9uX19Hcm91cF8zXzBfMV9fMF9fSW1wbCBydWxlX19YVHJ5Q2F0Y2hGaW5hbGx5RXhwcmVzc2lvbl9fR3JvdXBfM18wXzFfXzEKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIwNzkzOjE6ICggcnVsZV9fWFRyeUNhdGNoRmluYWxseUV4cHJlc3Npb25fX0dyb3VwXzNfMF8xX18wX19JbXBsIHJ1bGVfX1hUcnlDYXRjaEZpbmFsbHlFeHByZXNzaW9uX19Hcm91cF8zXzBfMV9fMSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMDc5NDoyOiBydWxlX19YVHJ5Q2F0Y2hGaW5hbGx5RXhwcmVzc2lvbl9fR3JvdXBfM18wXzFfXzBfX0ltcGwgcnVsZV9fWFRyeUNhdGNoRmluYWxseUV4cHJlc3Npb25fX0dyb3VwXzNfMF8xX18xCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV183NCk7CisgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV184Mik7CiAgICAgICAgICAgICBydWxlX19YVHJ5Q2F0Y2hGaW5hbGx5RXhwcmVzc2lvbl9fR3JvdXBfM18wXzFfXzBfX0ltcGwoKTsKIAogICAgICAgICAgICAgc3RhdGUuX2ZzcC0tOwpAQCAtNjQwMjQsMjUgKzY4NDgxLDI1IEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fWFRyeUNhdGNoRmluYWxseUV4cHJlc3Npb25fX0dyb3VwXzNfMF8xX18wX19JbXBsIgotICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE5NDYzOjE6IHJ1bGVfX1hUcnlDYXRjaEZpbmFsbHlFeHByZXNzaW9uX19Hcm91cF8zXzBfMV9fMF9fSW1wbCA6ICggKCAnZmluYWxseScgKSApIDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMDgwMToxOiBydWxlX19YVHJ5Q2F0Y2hGaW5hbGx5RXhwcmVzc2lvbl9fR3JvdXBfM18wXzFfXzBfX0ltcGwgOiAoICggJ2ZpbmFsbHknICkgKSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fWFRyeUNhdGNoRmluYWxseUV4cHJlc3Npb25fX0dyb3VwXzNfMF8xX18wX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE5NDY3OjE6ICggKCAoICdmaW5hbGx5JyApICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTk0Njg6MTogKCAoICdmaW5hbGx5JyApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIwODA1OjE6ICggKCAoICdmaW5hbGx5JyApICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjA4MDY6MTogKCAoICdmaW5hbGx5JyApICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE5NDY4OjE6ICggKCAnZmluYWxseScgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxOTQ2OToyOiAoICdmaW5hbGx5JyApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMDgwNjoxOiAoICggJ2ZpbmFsbHknICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjA4MDc6MjogKCAnZmluYWxseScgKQogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYVHJ5Q2F0Y2hGaW5hbGx5RXhwcmVzc2lvbkFjY2VzcygpLmdldEZpbmFsbHlLZXl3b3JkXzNfMF8xXzAoKSk7IAogICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTk0NzA6MjogKCAnZmluYWxseScgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTk0NzA6MzogJ2ZpbmFsbHknCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMDgwODoyOiAoICdmaW5hbGx5JyApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMDgwODozOiAnZmluYWxseScKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIG1hdGNoKGlucHV0LDEzNCxGT0xMT1dfMik7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CisgICAgICAgICAgICBtYXRjaChpbnB1dCwxNDQsRk9MTE9XXzIpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOwogCiAgICAgICAgICAgICB9CiAKQEAgLTY0MDcxLDE0ICs2ODUyOCwxNCBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX1hUcnlDYXRjaEZpbmFsbHlFeHByZXNzaW9uX19Hcm91cF8zXzBfMV9fMSIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxOTQ3ODoxOiBydWxlX19YVHJ5Q2F0Y2hGaW5hbGx5RXhwcmVzc2lvbl9fR3JvdXBfM18wXzFfXzEgOiBydWxlX19YVHJ5Q2F0Y2hGaW5hbGx5RXhwcmVzc2lvbl9fR3JvdXBfM18wXzFfXzFfX0ltcGwgOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIwODE2OjE6IHJ1bGVfX1hUcnlDYXRjaEZpbmFsbHlFeHByZXNzaW9uX19Hcm91cF8zXzBfMV9fMSA6IHJ1bGVfX1hUcnlDYXRjaEZpbmFsbHlFeHByZXNzaW9uX19Hcm91cF8zXzBfMV9fMV9fSW1wbCA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fWFRyeUNhdGNoRmluYWxseUV4cHJlc3Npb25fX0dyb3VwXzNfMF8xX18xKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE5NDgyOjE6ICggcnVsZV9fWFRyeUNhdGNoRmluYWxseUV4cHJlc3Npb25fX0dyb3VwXzNfMF8xX18xX19JbXBsICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE5NDgzOjI6IHJ1bGVfX1hUcnlDYXRjaEZpbmFsbHlFeHByZXNzaW9uX19Hcm91cF8zXzBfMV9fMV9fSW1wbAorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjA4MjA6MTogKCBydWxlX19YVHJ5Q2F0Y2hGaW5hbGx5RXhwcmVzc2lvbl9fR3JvdXBfM18wXzFfXzFfX0ltcGwgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjA4MjE6MjogcnVsZV9fWFRyeUNhdGNoRmluYWxseUV4cHJlc3Npb25fX0dyb3VwXzNfMF8xX18xX19JbXBsCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV18yKTsKICAgICAgICAgICAgIHJ1bGVfX1hUcnlDYXRjaEZpbmFsbHlFeHByZXNzaW9uX19Hcm91cF8zXzBfMV9fMV9fSW1wbCgpOwpAQCAtNjQxMDQsMjMgKzY4NTYxLDIzIEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fWFRyeUNhdGNoRmluYWxseUV4cHJlc3Npb25fX0dyb3VwXzNfMF8xX18xX19JbXBsIgotICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE5NDg5OjE6IHJ1bGVfX1hUcnlDYXRjaEZpbmFsbHlFeHByZXNzaW9uX19Hcm91cF8zXzBfMV9fMV9fSW1wbCA6ICggKCBydWxlX19YVHJ5Q2F0Y2hGaW5hbGx5RXhwcmVzc2lvbl9fRmluYWxseUV4cHJlc3Npb25Bc3NpZ25tZW50XzNfMF8xXzEgKSApIDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMDgyNzoxOiBydWxlX19YVHJ5Q2F0Y2hGaW5hbGx5RXhwcmVzc2lvbl9fR3JvdXBfM18wXzFfXzFfX0ltcGwgOiAoICggcnVsZV9fWFRyeUNhdGNoRmluYWxseUV4cHJlc3Npb25fX0ZpbmFsbHlFeHByZXNzaW9uQXNzaWdubWVudF8zXzBfMV8xICkgKSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fWFRyeUNhdGNoRmluYWxseUV4cHJlc3Npb25fX0dyb3VwXzNfMF8xX18xX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE5NDkzOjE6ICggKCAoIHJ1bGVfX1hUcnlDYXRjaEZpbmFsbHlFeHByZXNzaW9uX19GaW5hbGx5RXhwcmVzc2lvbkFzc2lnbm1lbnRfM18wXzFfMSApICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTk0OTQ6MTogKCAoIHJ1bGVfX1hUcnlDYXRjaEZpbmFsbHlFeHByZXNzaW9uX19GaW5hbGx5RXhwcmVzc2lvbkFzc2lnbm1lbnRfM18wXzFfMSApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIwODMxOjE6ICggKCAoIHJ1bGVfX1hUcnlDYXRjaEZpbmFsbHlFeHByZXNzaW9uX19GaW5hbGx5RXhwcmVzc2lvbkFzc2lnbm1lbnRfM18wXzFfMSApICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjA4MzI6MTogKCAoIHJ1bGVfX1hUcnlDYXRjaEZpbmFsbHlFeHByZXNzaW9uX19GaW5hbGx5RXhwcmVzc2lvbkFzc2lnbm1lbnRfM18wXzFfMSApICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE5NDk0OjE6ICggKCBydWxlX19YVHJ5Q2F0Y2hGaW5hbGx5RXhwcmVzc2lvbl9fRmluYWxseUV4cHJlc3Npb25Bc3NpZ25tZW50XzNfMF8xXzEgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxOTQ5NToyOiAoIHJ1bGVfX1hUcnlDYXRjaEZpbmFsbHlFeHByZXNzaW9uX19GaW5hbGx5RXhwcmVzc2lvbkFzc2lnbm1lbnRfM18wXzFfMSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMDgzMjoxOiAoICggcnVsZV9fWFRyeUNhdGNoRmluYWxseUV4cHJlc3Npb25fX0ZpbmFsbHlFeHByZXNzaW9uQXNzaWdubWVudF8zXzBfMV8xICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjA4MzM6MjogKCBydWxlX19YVHJ5Q2F0Y2hGaW5hbGx5RXhwcmVzc2lvbl9fRmluYWxseUV4cHJlc3Npb25Bc3NpZ25tZW50XzNfMF8xXzEgKQogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYVHJ5Q2F0Y2hGaW5hbGx5RXhwcmVzc2lvbkFjY2VzcygpLmdldEZpbmFsbHlFeHByZXNzaW9uQXNzaWdubWVudF8zXzBfMV8xKCkpOyAKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE5NDk2OjI6ICggcnVsZV9fWFRyeUNhdGNoRmluYWxseUV4cHJlc3Npb25fX0ZpbmFsbHlFeHByZXNzaW9uQXNzaWdubWVudF8zXzBfMV8xICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE5NDk2OjM6IHJ1bGVfX1hUcnlDYXRjaEZpbmFsbHlFeHByZXNzaW9uX19GaW5hbGx5RXhwcmVzc2lvbkFzc2lnbm1lbnRfM18wXzFfMQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjA4MzQ6MjogKCBydWxlX19YVHJ5Q2F0Y2hGaW5hbGx5RXhwcmVzc2lvbl9fRmluYWxseUV4cHJlc3Npb25Bc3NpZ25tZW50XzNfMF8xXzEgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjA4MzQ6MzogcnVsZV9fWFRyeUNhdGNoRmluYWxseUV4cHJlc3Npb25fX0ZpbmFsbHlFeHByZXNzaW9uQXNzaWdubWVudF8zXzBfMV8xCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV18yKTsKICAgICAgICAgICAgIHJ1bGVfX1hUcnlDYXRjaEZpbmFsbHlFeHByZXNzaW9uX19GaW5hbGx5RXhwcmVzc2lvbkFzc2lnbm1lbnRfM18wXzFfMSgpOwpAQCAtNjQxNTUsMTYgKzY4NjEyLDE2IEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fWFRyeUNhdGNoRmluYWxseUV4cHJlc3Npb25fX0dyb3VwXzNfMV9fMCIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxOTUwNToxOiBydWxlX19YVHJ5Q2F0Y2hGaW5hbGx5RXhwcmVzc2lvbl9fR3JvdXBfM18xX18wIDogcnVsZV9fWFRyeUNhdGNoRmluYWxseUV4cHJlc3Npb25fX0dyb3VwXzNfMV9fMF9fSW1wbCBydWxlX19YVHJ5Q2F0Y2hGaW5hbGx5RXhwcmVzc2lvbl9fR3JvdXBfM18xX18xIDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMDg0MzoxOiBydWxlX19YVHJ5Q2F0Y2hGaW5hbGx5RXhwcmVzc2lvbl9fR3JvdXBfM18xX18wIDogcnVsZV9fWFRyeUNhdGNoRmluYWxseUV4cHJlc3Npb25fX0dyb3VwXzNfMV9fMF9fSW1wbCBydWxlX19YVHJ5Q2F0Y2hGaW5hbGx5RXhwcmVzc2lvbl9fR3JvdXBfM18xX18xIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YVHJ5Q2F0Y2hGaW5hbGx5RXhwcmVzc2lvbl9fR3JvdXBfM18xX18wKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE5NTA5OjE6ICggcnVsZV9fWFRyeUNhdGNoRmluYWxseUV4cHJlc3Npb25fX0dyb3VwXzNfMV9fMF9fSW1wbCBydWxlX19YVHJ5Q2F0Y2hGaW5hbGx5RXhwcmVzc2lvbl9fR3JvdXBfM18xX18xICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE5NTEwOjI6IHJ1bGVfX1hUcnlDYXRjaEZpbmFsbHlFeHByZXNzaW9uX19Hcm91cF8zXzFfXzBfX0ltcGwgcnVsZV9fWFRyeUNhdGNoRmluYWxseUV4cHJlc3Npb25fX0dyb3VwXzNfMV9fMQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjA4NDc6MTogKCBydWxlX19YVHJ5Q2F0Y2hGaW5hbGx5RXhwcmVzc2lvbl9fR3JvdXBfM18xX18wX19JbXBsIHJ1bGVfX1hUcnlDYXRjaEZpbmFsbHlFeHByZXNzaW9uX19Hcm91cF8zXzFfXzEgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjA4NDg6MjogcnVsZV9fWFRyeUNhdGNoRmluYWxseUV4cHJlc3Npb25fX0dyb3VwXzNfMV9fMF9fSW1wbCBydWxlX19YVHJ5Q2F0Y2hGaW5hbGx5RXhwcmVzc2lvbl9fR3JvdXBfM18xX18xCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV183NCk7CisgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV184Mik7CiAgICAgICAgICAgICBydWxlX19YVHJ5Q2F0Y2hGaW5hbGx5RXhwcmVzc2lvbl9fR3JvdXBfM18xX18wX19JbXBsKCk7CiAKICAgICAgICAgICAgIHN0YXRlLl9mc3AtLTsKQEAgLTY0MTkzLDIyICs2ODY1MCwyMiBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX1hUcnlDYXRjaEZpbmFsbHlFeHByZXNzaW9uX19Hcm91cF8zXzFfXzBfX0ltcGwiCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTk1MTc6MTogcnVsZV9fWFRyeUNhdGNoRmluYWxseUV4cHJlc3Npb25fX0dyb3VwXzNfMV9fMF9fSW1wbCA6ICggJ2ZpbmFsbHknICkgOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIwODU1OjE6IHJ1bGVfX1hUcnlDYXRjaEZpbmFsbHlFeHByZXNzaW9uX19Hcm91cF8zXzFfXzBfX0ltcGwgOiAoICdmaW5hbGx5JyApIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YVHJ5Q2F0Y2hGaW5hbGx5RXhwcmVzc2lvbl9fR3JvdXBfM18xX18wX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE5NTIxOjE6ICggKCAnZmluYWxseScgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxOTUyMjoxOiAoICdmaW5hbGx5JyApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMDg1OToxOiAoICggJ2ZpbmFsbHknICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjA4NjA6MTogKCAnZmluYWxseScgKQogICAgICAgICAgICAgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTk1MjI6MTogKCAnZmluYWxseScgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTk1MjM6MjogJ2ZpbmFsbHknCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMDg2MDoxOiAoICdmaW5hbGx5JyApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMDg2MToyOiAnZmluYWxseScKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WFRyeUNhdGNoRmluYWxseUV4cHJlc3Npb25BY2Nlc3MoKS5nZXRGaW5hbGx5S2V5d29yZF8zXzFfMCgpKTsgCiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBtYXRjaChpbnB1dCwxMzQsRk9MTE9XXzIpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOworICAgICAgICAgICAgbWF0Y2goaW5wdXQsMTQ0LEZPTExPV18yKTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRYVHJ5Q2F0Y2hGaW5hbGx5RXhwcmVzc2lvbkFjY2VzcygpLmdldEZpbmFsbHlLZXl3b3JkXzNfMV8wKCkpOyAKICAgICAgICAgICAgIH0KQEAgLTY0MjM0LDE0ICs2ODY5MSwxNCBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX1hUcnlDYXRjaEZpbmFsbHlFeHByZXNzaW9uX19Hcm91cF8zXzFfXzEiCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTk1MzI6MTogcnVsZV9fWFRyeUNhdGNoRmluYWxseUV4cHJlc3Npb25fX0dyb3VwXzNfMV9fMSA6IHJ1bGVfX1hUcnlDYXRjaEZpbmFsbHlFeHByZXNzaW9uX19Hcm91cF8zXzFfXzFfX0ltcGwgOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIwODcwOjE6IHJ1bGVfX1hUcnlDYXRjaEZpbmFsbHlFeHByZXNzaW9uX19Hcm91cF8zXzFfXzEgOiBydWxlX19YVHJ5Q2F0Y2hGaW5hbGx5RXhwcmVzc2lvbl9fR3JvdXBfM18xX18xX19JbXBsIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YVHJ5Q2F0Y2hGaW5hbGx5RXhwcmVzc2lvbl9fR3JvdXBfM18xX18xKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE5NTM2OjE6ICggcnVsZV9fWFRyeUNhdGNoRmluYWxseUV4cHJlc3Npb25fX0dyb3VwXzNfMV9fMV9fSW1wbCApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxOTUzNzoyOiBydWxlX19YVHJ5Q2F0Y2hGaW5hbGx5RXhwcmVzc2lvbl9fR3JvdXBfM18xX18xX19JbXBsCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMDg3NDoxOiAoIHJ1bGVfX1hUcnlDYXRjaEZpbmFsbHlFeHByZXNzaW9uX19Hcm91cF8zXzFfXzFfX0ltcGwgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjA4NzU6MjogcnVsZV9fWFRyeUNhdGNoRmluYWxseUV4cHJlc3Npb25fX0dyb3VwXzNfMV9fMV9fSW1wbAogICAgICAgICAgICAgewogICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMik7CiAgICAgICAgICAgICBydWxlX19YVHJ5Q2F0Y2hGaW5hbGx5RXhwcmVzc2lvbl9fR3JvdXBfM18xX18xX19JbXBsKCk7CkBAIC02NDI2NywyMyArNjg3MjQsMjMgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YVHJ5Q2F0Y2hGaW5hbGx5RXhwcmVzc2lvbl9fR3JvdXBfM18xX18xX19JbXBsIgotICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE5NTQzOjE6IHJ1bGVfX1hUcnlDYXRjaEZpbmFsbHlFeHByZXNzaW9uX19Hcm91cF8zXzFfXzFfX0ltcGwgOiAoICggcnVsZV9fWFRyeUNhdGNoRmluYWxseUV4cHJlc3Npb25fX0ZpbmFsbHlFeHByZXNzaW9uQXNzaWdubWVudF8zXzFfMSApICkgOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIwODgxOjE6IHJ1bGVfX1hUcnlDYXRjaEZpbmFsbHlFeHByZXNzaW9uX19Hcm91cF8zXzFfXzFfX0ltcGwgOiAoICggcnVsZV9fWFRyeUNhdGNoRmluYWxseUV4cHJlc3Npb25fX0ZpbmFsbHlFeHByZXNzaW9uQXNzaWdubWVudF8zXzFfMSApICkgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1hUcnlDYXRjaEZpbmFsbHlFeHByZXNzaW9uX19Hcm91cF8zXzFfXzFfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTk1NDc6MTogKCAoICggcnVsZV9fWFRyeUNhdGNoRmluYWxseUV4cHJlc3Npb25fX0ZpbmFsbHlFeHByZXNzaW9uQXNzaWdubWVudF8zXzFfMSApICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTk1NDg6MTogKCAoIHJ1bGVfX1hUcnlDYXRjaEZpbmFsbHlFeHByZXNzaW9uX19GaW5hbGx5RXhwcmVzc2lvbkFzc2lnbm1lbnRfM18xXzEgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMDg4NToxOiAoICggKCBydWxlX19YVHJ5Q2F0Y2hGaW5hbGx5RXhwcmVzc2lvbl9fRmluYWxseUV4cHJlc3Npb25Bc3NpZ25tZW50XzNfMV8xICkgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMDg4NjoxOiAoICggcnVsZV9fWFRyeUNhdGNoRmluYWxseUV4cHJlc3Npb25fX0ZpbmFsbHlFeHByZXNzaW9uQXNzaWdubWVudF8zXzFfMSApICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE5NTQ4OjE6ICggKCBydWxlX19YVHJ5Q2F0Y2hGaW5hbGx5RXhwcmVzc2lvbl9fRmluYWxseUV4cHJlc3Npb25Bc3NpZ25tZW50XzNfMV8xICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTk1NDk6MjogKCBydWxlX19YVHJ5Q2F0Y2hGaW5hbGx5RXhwcmVzc2lvbl9fRmluYWxseUV4cHJlc3Npb25Bc3NpZ25tZW50XzNfMV8xICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIwODg2OjE6ICggKCBydWxlX19YVHJ5Q2F0Y2hGaW5hbGx5RXhwcmVzc2lvbl9fRmluYWxseUV4cHJlc3Npb25Bc3NpZ25tZW50XzNfMV8xICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjA4ODc6MjogKCBydWxlX19YVHJ5Q2F0Y2hGaW5hbGx5RXhwcmVzc2lvbl9fRmluYWxseUV4cHJlc3Npb25Bc3NpZ25tZW50XzNfMV8xICkKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WFRyeUNhdGNoRmluYWxseUV4cHJlc3Npb25BY2Nlc3MoKS5nZXRGaW5hbGx5RXhwcmVzc2lvbkFzc2lnbm1lbnRfM18xXzEoKSk7IAogICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTk1NTA6MjogKCBydWxlX19YVHJ5Q2F0Y2hGaW5hbGx5RXhwcmVzc2lvbl9fRmluYWxseUV4cHJlc3Npb25Bc3NpZ25tZW50XzNfMV8xICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE5NTUwOjM6IHJ1bGVfX1hUcnlDYXRjaEZpbmFsbHlFeHByZXNzaW9uX19GaW5hbGx5RXhwcmVzc2lvbkFzc2lnbm1lbnRfM18xXzEKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIwODg4OjI6ICggcnVsZV9fWFRyeUNhdGNoRmluYWxseUV4cHJlc3Npb25fX0ZpbmFsbHlFeHByZXNzaW9uQXNzaWdubWVudF8zXzFfMSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMDg4ODozOiBydWxlX19YVHJ5Q2F0Y2hGaW5hbGx5RXhwcmVzc2lvbl9fRmluYWxseUV4cHJlc3Npb25Bc3NpZ25tZW50XzNfMV8xCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV18yKTsKICAgICAgICAgICAgIHJ1bGVfX1hUcnlDYXRjaEZpbmFsbHlFeHByZXNzaW9uX19GaW5hbGx5RXhwcmVzc2lvbkFzc2lnbm1lbnRfM18xXzEoKTsKQEAgLTY0MzE4LDE2ICs2ODc3NSwxNiBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX1hTeW5jaHJvbml6ZWRFeHByZXNzaW9uX19Hcm91cF9fMCIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxOTU1OToxOiBydWxlX19YU3luY2hyb25pemVkRXhwcmVzc2lvbl9fR3JvdXBfXzAgOiBydWxlX19YU3luY2hyb25pemVkRXhwcmVzc2lvbl9fR3JvdXBfXzBfX0ltcGwgcnVsZV9fWFN5bmNocm9uaXplZEV4cHJlc3Npb25fX0dyb3VwX18xIDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMDg5NzoxOiBydWxlX19YU3luY2hyb25pemVkRXhwcmVzc2lvbl9fR3JvdXBfXzAgOiBydWxlX19YU3luY2hyb25pemVkRXhwcmVzc2lvbl9fR3JvdXBfXzBfX0ltcGwgcnVsZV9fWFN5bmNocm9uaXplZEV4cHJlc3Npb25fX0dyb3VwX18xIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YU3luY2hyb25pemVkRXhwcmVzc2lvbl9fR3JvdXBfXzAoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTk1NjM6MTogKCBydWxlX19YU3luY2hyb25pemVkRXhwcmVzc2lvbl9fR3JvdXBfXzBfX0ltcGwgcnVsZV9fWFN5bmNocm9uaXplZEV4cHJlc3Npb25fX0dyb3VwX18xICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE5NTY0OjI6IHJ1bGVfX1hTeW5jaHJvbml6ZWRFeHByZXNzaW9uX19Hcm91cF9fMF9fSW1wbCBydWxlX19YU3luY2hyb25pemVkRXhwcmVzc2lvbl9fR3JvdXBfXzEKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIwOTAxOjE6ICggcnVsZV9fWFN5bmNocm9uaXplZEV4cHJlc3Npb25fX0dyb3VwX18wX19JbXBsIHJ1bGVfX1hTeW5jaHJvbml6ZWRFeHByZXNzaW9uX19Hcm91cF9fMSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMDkwMjoyOiBydWxlX19YU3luY2hyb25pemVkRXhwcmVzc2lvbl9fR3JvdXBfXzBfX0ltcGwgcnVsZV9fWFN5bmNocm9uaXplZEV4cHJlc3Npb25fX0dyb3VwX18xCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV183NCk7CisgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV184Mik7CiAgICAgICAgICAgICBydWxlX19YU3luY2hyb25pemVkRXhwcmVzc2lvbl9fR3JvdXBfXzBfX0ltcGwoKTsKIAogICAgICAgICAgICAgc3RhdGUuX2ZzcC0tOwpAQCAtNjQzNTYsMjMgKzY4ODEzLDIzIEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fWFN5bmNocm9uaXplZEV4cHJlc3Npb25fX0dyb3VwX18wX19JbXBsIgotICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE5NTcxOjE6IHJ1bGVfX1hTeW5jaHJvbml6ZWRFeHByZXNzaW9uX19Hcm91cF9fMF9fSW1wbCA6ICggKCBydWxlX19YU3luY2hyb25pemVkRXhwcmVzc2lvbl9fR3JvdXBfMF9fMCApICkgOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIwOTA5OjE6IHJ1bGVfX1hTeW5jaHJvbml6ZWRFeHByZXNzaW9uX19Hcm91cF9fMF9fSW1wbCA6ICggKCBydWxlX19YU3luY2hyb25pemVkRXhwcmVzc2lvbl9fR3JvdXBfMF9fMCApICkgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1hTeW5jaHJvbml6ZWRFeHByZXNzaW9uX19Hcm91cF9fMF9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxOTU3NToxOiAoICggKCBydWxlX19YU3luY2hyb25pemVkRXhwcmVzc2lvbl9fR3JvdXBfMF9fMCApICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTk1NzY6MTogKCAoIHJ1bGVfX1hTeW5jaHJvbml6ZWRFeHByZXNzaW9uX19Hcm91cF8wX18wICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjA5MTM6MTogKCAoICggcnVsZV9fWFN5bmNocm9uaXplZEV4cHJlc3Npb25fX0dyb3VwXzBfXzAgKSApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIwOTE0OjE6ICggKCBydWxlX19YU3luY2hyb25pemVkRXhwcmVzc2lvbl9fR3JvdXBfMF9fMCApICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE5NTc2OjE6ICggKCBydWxlX19YU3luY2hyb25pemVkRXhwcmVzc2lvbl9fR3JvdXBfMF9fMCApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE5NTc3OjI6ICggcnVsZV9fWFN5bmNocm9uaXplZEV4cHJlc3Npb25fX0dyb3VwXzBfXzAgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjA5MTQ6MTogKCAoIHJ1bGVfX1hTeW5jaHJvbml6ZWRFeHByZXNzaW9uX19Hcm91cF8wX18wICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjA5MTU6MjogKCBydWxlX19YU3luY2hyb25pemVkRXhwcmVzc2lvbl9fR3JvdXBfMF9fMCApCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhTeW5jaHJvbml6ZWRFeHByZXNzaW9uQWNjZXNzKCkuZ2V0R3JvdXBfMCgpKTsgCiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxOTU3ODoyOiAoIHJ1bGVfX1hTeW5jaHJvbml6ZWRFeHByZXNzaW9uX19Hcm91cF8wX18wICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE5NTc4OjM6IHJ1bGVfX1hTeW5jaHJvbml6ZWRFeHByZXNzaW9uX19Hcm91cF8wX18wCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMDkxNjoyOiAoIHJ1bGVfX1hTeW5jaHJvbml6ZWRFeHByZXNzaW9uX19Hcm91cF8wX18wICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIwOTE2OjM6IHJ1bGVfX1hTeW5jaHJvbml6ZWRFeHByZXNzaW9uX19Hcm91cF8wX18wCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV18yKTsKICAgICAgICAgICAgIHJ1bGVfX1hTeW5jaHJvbml6ZWRFeHByZXNzaW9uX19Hcm91cF8wX18wKCk7CkBAIC02NDQwNywxNiArNjg4NjQsMTYgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YU3luY2hyb25pemVkRXhwcmVzc2lvbl9fR3JvdXBfXzEiCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTk1ODY6MTogcnVsZV9fWFN5bmNocm9uaXplZEV4cHJlc3Npb25fX0dyb3VwX18xIDogcnVsZV9fWFN5bmNocm9uaXplZEV4cHJlc3Npb25fX0dyb3VwX18xX19JbXBsIHJ1bGVfX1hTeW5jaHJvbml6ZWRFeHByZXNzaW9uX19Hcm91cF9fMiA7CisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjA5MjQ6MTogcnVsZV9fWFN5bmNocm9uaXplZEV4cHJlc3Npb25fX0dyb3VwX18xIDogcnVsZV9fWFN5bmNocm9uaXplZEV4cHJlc3Npb25fX0dyb3VwX18xX19JbXBsIHJ1bGVfX1hTeW5jaHJvbml6ZWRFeHByZXNzaW9uX19Hcm91cF9fMiA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fWFN5bmNocm9uaXplZEV4cHJlc3Npb25fX0dyb3VwX18xKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE5NTkwOjE6ICggcnVsZV9fWFN5bmNocm9uaXplZEV4cHJlc3Npb25fX0dyb3VwX18xX19JbXBsIHJ1bGVfX1hTeW5jaHJvbml6ZWRFeHByZXNzaW9uX19Hcm91cF9fMiApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxOTU5MToyOiBydWxlX19YU3luY2hyb25pemVkRXhwcmVzc2lvbl9fR3JvdXBfXzFfX0ltcGwgcnVsZV9fWFN5bmNocm9uaXplZEV4cHJlc3Npb25fX0dyb3VwX18yCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMDkyODoxOiAoIHJ1bGVfX1hTeW5jaHJvbml6ZWRFeHByZXNzaW9uX19Hcm91cF9fMV9fSW1wbCBydWxlX19YU3luY2hyb25pemVkRXhwcmVzc2lvbl9fR3JvdXBfXzIgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjA5Mjk6MjogcnVsZV9fWFN5bmNocm9uaXplZEV4cHJlc3Npb25fX0dyb3VwX18xX19JbXBsIHJ1bGVfX1hTeW5jaHJvbml6ZWRFeHByZXNzaW9uX19Hcm91cF9fMgogICAgICAgICAgICAgewotICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMTE4KTsKKyAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzEyNik7CiAgICAgICAgICAgICBydWxlX19YU3luY2hyb25pemVkRXhwcmVzc2lvbl9fR3JvdXBfXzFfX0ltcGwoKTsKIAogICAgICAgICAgICAgc3RhdGUuX2ZzcC0tOwpAQCAtNjQ0NDUsMjMgKzY4OTAyLDIzIEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fWFN5bmNocm9uaXplZEV4cHJlc3Npb25fX0dyb3VwX18xX19JbXBsIgotICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE5NTk4OjE6IHJ1bGVfX1hTeW5jaHJvbml6ZWRFeHByZXNzaW9uX19Hcm91cF9fMV9fSW1wbCA6ICggKCBydWxlX19YU3luY2hyb25pemVkRXhwcmVzc2lvbl9fUGFyYW1Bc3NpZ25tZW50XzEgKSApIDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMDkzNjoxOiBydWxlX19YU3luY2hyb25pemVkRXhwcmVzc2lvbl9fR3JvdXBfXzFfX0ltcGwgOiAoICggcnVsZV9fWFN5bmNocm9uaXplZEV4cHJlc3Npb25fX1BhcmFtQXNzaWdubWVudF8xICkgKSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fWFN5bmNocm9uaXplZEV4cHJlc3Npb25fX0dyb3VwX18xX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE5NjAyOjE6ICggKCAoIHJ1bGVfX1hTeW5jaHJvbml6ZWRFeHByZXNzaW9uX19QYXJhbUFzc2lnbm1lbnRfMSApICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTk2MDM6MTogKCAoIHJ1bGVfX1hTeW5jaHJvbml6ZWRFeHByZXNzaW9uX19QYXJhbUFzc2lnbm1lbnRfMSApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIwOTQwOjE6ICggKCAoIHJ1bGVfX1hTeW5jaHJvbml6ZWRFeHByZXNzaW9uX19QYXJhbUFzc2lnbm1lbnRfMSApICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjA5NDE6MTogKCAoIHJ1bGVfX1hTeW5jaHJvbml6ZWRFeHByZXNzaW9uX19QYXJhbUFzc2lnbm1lbnRfMSApICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE5NjAzOjE6ICggKCBydWxlX19YU3luY2hyb25pemVkRXhwcmVzc2lvbl9fUGFyYW1Bc3NpZ25tZW50XzEgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxOTYwNDoyOiAoIHJ1bGVfX1hTeW5jaHJvbml6ZWRFeHByZXNzaW9uX19QYXJhbUFzc2lnbm1lbnRfMSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMDk0MToxOiAoICggcnVsZV9fWFN5bmNocm9uaXplZEV4cHJlc3Npb25fX1BhcmFtQXNzaWdubWVudF8xICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjA5NDI6MjogKCBydWxlX19YU3luY2hyb25pemVkRXhwcmVzc2lvbl9fUGFyYW1Bc3NpZ25tZW50XzEgKQogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYU3luY2hyb25pemVkRXhwcmVzc2lvbkFjY2VzcygpLmdldFBhcmFtQXNzaWdubWVudF8xKCkpOyAKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE5NjA1OjI6ICggcnVsZV9fWFN5bmNocm9uaXplZEV4cHJlc3Npb25fX1BhcmFtQXNzaWdubWVudF8xICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE5NjA1OjM6IHJ1bGVfX1hTeW5jaHJvbml6ZWRFeHByZXNzaW9uX19QYXJhbUFzc2lnbm1lbnRfMQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjA5NDM6MjogKCBydWxlX19YU3luY2hyb25pemVkRXhwcmVzc2lvbl9fUGFyYW1Bc3NpZ25tZW50XzEgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjA5NDM6MzogcnVsZV9fWFN5bmNocm9uaXplZEV4cHJlc3Npb25fX1BhcmFtQXNzaWdubWVudF8xCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV18yKTsKICAgICAgICAgICAgIHJ1bGVfX1hTeW5jaHJvbml6ZWRFeHByZXNzaW9uX19QYXJhbUFzc2lnbm1lbnRfMSgpOwpAQCAtNjQ0OTYsMTYgKzY4OTUzLDE2IEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fWFN5bmNocm9uaXplZEV4cHJlc3Npb25fX0dyb3VwX18yIgotICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE5NjEzOjE6IHJ1bGVfX1hTeW5jaHJvbml6ZWRFeHByZXNzaW9uX19Hcm91cF9fMiA6IHJ1bGVfX1hTeW5jaHJvbml6ZWRFeHByZXNzaW9uX19Hcm91cF9fMl9fSW1wbCBydWxlX19YU3luY2hyb25pemVkRXhwcmVzc2lvbl9fR3JvdXBfXzMgOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIwOTUxOjE6IHJ1bGVfX1hTeW5jaHJvbml6ZWRFeHByZXNzaW9uX19Hcm91cF9fMiA6IHJ1bGVfX1hTeW5jaHJvbml6ZWRFeHByZXNzaW9uX19Hcm91cF9fMl9fSW1wbCBydWxlX19YU3luY2hyb25pemVkRXhwcmVzc2lvbl9fR3JvdXBfXzMgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1hTeW5jaHJvbml6ZWRFeHByZXNzaW9uX19Hcm91cF9fMigpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxOTYxNzoxOiAoIHJ1bGVfX1hTeW5jaHJvbml6ZWRFeHByZXNzaW9uX19Hcm91cF9fMl9fSW1wbCBydWxlX19YU3luY2hyb25pemVkRXhwcmVzc2lvbl9fR3JvdXBfXzMgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTk2MTg6MjogcnVsZV9fWFN5bmNocm9uaXplZEV4cHJlc3Npb25fX0dyb3VwX18yX19JbXBsIHJ1bGVfX1hTeW5jaHJvbml6ZWRFeHByZXNzaW9uX19Hcm91cF9fMworICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjA5NTU6MTogKCBydWxlX19YU3luY2hyb25pemVkRXhwcmVzc2lvbl9fR3JvdXBfXzJfX0ltcGwgcnVsZV9fWFN5bmNocm9uaXplZEV4cHJlc3Npb25fX0dyb3VwX18zICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIwOTU2OjI6IHJ1bGVfX1hTeW5jaHJvbml6ZWRFeHByZXNzaW9uX19Hcm91cF9fMl9fSW1wbCBydWxlX19YU3luY2hyb25pemVkRXhwcmVzc2lvbl9fR3JvdXBfXzMKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzc0KTsKKyAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzgyKTsKICAgICAgICAgICAgIHJ1bGVfX1hTeW5jaHJvbml6ZWRFeHByZXNzaW9uX19Hcm91cF9fMl9fSW1wbCgpOwogCiAgICAgICAgICAgICBzdGF0ZS5fZnNwLS07CkBAIC02NDUzNCwyMiArNjg5OTEsMjIgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YU3luY2hyb25pemVkRXhwcmVzc2lvbl9fR3JvdXBfXzJfX0ltcGwiCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTk2MjU6MTogcnVsZV9fWFN5bmNocm9uaXplZEV4cHJlc3Npb25fX0dyb3VwX18yX19JbXBsIDogKCAnKScgKSA7CisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjA5NjM6MTogcnVsZV9fWFN5bmNocm9uaXplZEV4cHJlc3Npb25fX0dyb3VwX18yX19JbXBsIDogKCAnKScgKSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fWFN5bmNocm9uaXplZEV4cHJlc3Npb25fX0dyb3VwX18yX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE5NjI5OjE6ICggKCAnKScgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxOTYzMDoxOiAoICcpJyApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMDk2NzoxOiAoICggJyknICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjA5Njg6MTogKCAnKScgKQogICAgICAgICAgICAgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTk2MzA6MTogKCAnKScgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTk2MzE6MjogJyknCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMDk2ODoxOiAoICcpJyApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMDk2OToyOiAnKScKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WFN5bmNocm9uaXplZEV4cHJlc3Npb25BY2Nlc3MoKS5nZXRSaWdodFBhcmVudGhlc2lzS2V5d29yZF8yKCkpOyAKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1hdGNoKGlucHV0LDExNCxGT0xMT1dfMik7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CisgICAgICAgICAgICBtYXRjaChpbnB1dCwxMjQsRk9MTE9XXzIpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOwogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBhZnRlcihncmFtbWFyQWNjZXNzLmdldFhTeW5jaHJvbml6ZWRFeHByZXNzaW9uQWNjZXNzKCkuZ2V0UmlnaHRQYXJlbnRoZXNpc0tleXdvcmRfMigpKTsgCiAgICAgICAgICAgICB9CkBAIC02NDU3NSwxNCArNjkwMzIsMTQgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YU3luY2hyb25pemVkRXhwcmVzc2lvbl9fR3JvdXBfXzMiCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTk2NDA6MTogcnVsZV9fWFN5bmNocm9uaXplZEV4cHJlc3Npb25fX0dyb3VwX18zIDogcnVsZV9fWFN5bmNocm9uaXplZEV4cHJlc3Npb25fX0dyb3VwX18zX19JbXBsIDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMDk3ODoxOiBydWxlX19YU3luY2hyb25pemVkRXhwcmVzc2lvbl9fR3JvdXBfXzMgOiBydWxlX19YU3luY2hyb25pemVkRXhwcmVzc2lvbl9fR3JvdXBfXzNfX0ltcGwgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1hTeW5jaHJvbml6ZWRFeHByZXNzaW9uX19Hcm91cF9fMygpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxOTY0NDoxOiAoIHJ1bGVfX1hTeW5jaHJvbml6ZWRFeHByZXNzaW9uX19Hcm91cF9fM19fSW1wbCApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxOTY0NToyOiBydWxlX19YU3luY2hyb25pemVkRXhwcmVzc2lvbl9fR3JvdXBfXzNfX0ltcGwKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIwOTgyOjE6ICggcnVsZV9fWFN5bmNocm9uaXplZEV4cHJlc3Npb25fX0dyb3VwX18zX19JbXBsICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIwOTgzOjI6IHJ1bGVfX1hTeW5jaHJvbml6ZWRFeHByZXNzaW9uX19Hcm91cF9fM19fSW1wbAogICAgICAgICAgICAgewogICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMik7CiAgICAgICAgICAgICBydWxlX19YU3luY2hyb25pemVkRXhwcmVzc2lvbl9fR3JvdXBfXzNfX0ltcGwoKTsKQEAgLTY0NjA4LDIzICs2OTA2NSwyMyBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX1hTeW5jaHJvbml6ZWRFeHByZXNzaW9uX19Hcm91cF9fM19fSW1wbCIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxOTY1MToxOiBydWxlX19YU3luY2hyb25pemVkRXhwcmVzc2lvbl9fR3JvdXBfXzNfX0ltcGwgOiAoICggcnVsZV9fWFN5bmNocm9uaXplZEV4cHJlc3Npb25fX0V4cHJlc3Npb25Bc3NpZ25tZW50XzMgKSApIDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMDk4OToxOiBydWxlX19YU3luY2hyb25pemVkRXhwcmVzc2lvbl9fR3JvdXBfXzNfX0ltcGwgOiAoICggcnVsZV9fWFN5bmNocm9uaXplZEV4cHJlc3Npb25fX0V4cHJlc3Npb25Bc3NpZ25tZW50XzMgKSApIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YU3luY2hyb25pemVkRXhwcmVzc2lvbl9fR3JvdXBfXzNfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTk2NTU6MTogKCAoICggcnVsZV9fWFN5bmNocm9uaXplZEV4cHJlc3Npb25fX0V4cHJlc3Npb25Bc3NpZ25tZW50XzMgKSApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE5NjU2OjE6ICggKCBydWxlX19YU3luY2hyb25pemVkRXhwcmVzc2lvbl9fRXhwcmVzc2lvbkFzc2lnbm1lbnRfMyApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIwOTkzOjE6ICggKCAoIHJ1bGVfX1hTeW5jaHJvbml6ZWRFeHByZXNzaW9uX19FeHByZXNzaW9uQXNzaWdubWVudF8zICkgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMDk5NDoxOiAoICggcnVsZV9fWFN5bmNocm9uaXplZEV4cHJlc3Npb25fX0V4cHJlc3Npb25Bc3NpZ25tZW50XzMgKSApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxOTY1NjoxOiAoICggcnVsZV9fWFN5bmNocm9uaXplZEV4cHJlc3Npb25fX0V4cHJlc3Npb25Bc3NpZ25tZW50XzMgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxOTY1NzoyOiAoIHJ1bGVfX1hTeW5jaHJvbml6ZWRFeHByZXNzaW9uX19FeHByZXNzaW9uQXNzaWdubWVudF8zICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIwOTk0OjE6ICggKCBydWxlX19YU3luY2hyb25pemVkRXhwcmVzc2lvbl9fRXhwcmVzc2lvbkFzc2lnbm1lbnRfMyApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIwOTk1OjI6ICggcnVsZV9fWFN5bmNocm9uaXplZEV4cHJlc3Npb25fX0V4cHJlc3Npb25Bc3NpZ25tZW50XzMgKQogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYU3luY2hyb25pemVkRXhwcmVzc2lvbkFjY2VzcygpLmdldEV4cHJlc3Npb25Bc3NpZ25tZW50XzMoKSk7IAogICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTk2NTg6MjogKCBydWxlX19YU3luY2hyb25pemVkRXhwcmVzc2lvbl9fRXhwcmVzc2lvbkFzc2lnbm1lbnRfMyApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxOTY1ODozOiBydWxlX19YU3luY2hyb25pemVkRXhwcmVzc2lvbl9fRXhwcmVzc2lvbkFzc2lnbm1lbnRfMworICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjA5OTY6MjogKCBydWxlX19YU3luY2hyb25pemVkRXhwcmVzc2lvbl9fRXhwcmVzc2lvbkFzc2lnbm1lbnRfMyApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMDk5NjozOiBydWxlX19YU3luY2hyb25pemVkRXhwcmVzc2lvbl9fRXhwcmVzc2lvbkFzc2lnbm1lbnRfMwogICAgICAgICAgICAgewogICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMik7CiAgICAgICAgICAgICBydWxlX19YU3luY2hyb25pemVkRXhwcmVzc2lvbl9fRXhwcmVzc2lvbkFzc2lnbm1lbnRfMygpOwpAQCAtNjQ2NTksMTQgKzY5MTE2LDE0IEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fWFN5bmNocm9uaXplZEV4cHJlc3Npb25fX0dyb3VwXzBfXzAiCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTk2Njc6MTogcnVsZV9fWFN5bmNocm9uaXplZEV4cHJlc3Npb25fX0dyb3VwXzBfXzAgOiBydWxlX19YU3luY2hyb25pemVkRXhwcmVzc2lvbl9fR3JvdXBfMF9fMF9fSW1wbCA7CisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjEwMDU6MTogcnVsZV9fWFN5bmNocm9uaXplZEV4cHJlc3Npb25fX0dyb3VwXzBfXzAgOiBydWxlX19YU3luY2hyb25pemVkRXhwcmVzc2lvbl9fR3JvdXBfMF9fMF9fSW1wbCA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fWFN5bmNocm9uaXplZEV4cHJlc3Npb25fX0dyb3VwXzBfXzAoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTk2NzE6MTogKCBydWxlX19YU3luY2hyb25pemVkRXhwcmVzc2lvbl9fR3JvdXBfMF9fMF9fSW1wbCApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxOTY3MjoyOiBydWxlX19YU3luY2hyb25pemVkRXhwcmVzc2lvbl9fR3JvdXBfMF9fMF9fSW1wbAorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjEwMDk6MTogKCBydWxlX19YU3luY2hyb25pemVkRXhwcmVzc2lvbl9fR3JvdXBfMF9fMF9fSW1wbCApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMTAxMDoyOiBydWxlX19YU3luY2hyb25pemVkRXhwcmVzc2lvbl9fR3JvdXBfMF9fMF9fSW1wbAogICAgICAgICAgICAgewogICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMik7CiAgICAgICAgICAgICBydWxlX19YU3luY2hyb25pemVkRXhwcmVzc2lvbl9fR3JvdXBfMF9fMF9fSW1wbCgpOwpAQCAtNjQ2OTIsMjMgKzY5MTQ5LDIzIEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fWFN5bmNocm9uaXplZEV4cHJlc3Npb25fX0dyb3VwXzBfXzBfX0ltcGwiCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTk2Nzg6MTogcnVsZV9fWFN5bmNocm9uaXplZEV4cHJlc3Npb25fX0dyb3VwXzBfXzBfX0ltcGwgOiAoICggcnVsZV9fWFN5bmNocm9uaXplZEV4cHJlc3Npb25fX0dyb3VwXzBfMF9fMCApICkgOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIxMDE2OjE6IHJ1bGVfX1hTeW5jaHJvbml6ZWRFeHByZXNzaW9uX19Hcm91cF8wX18wX19JbXBsIDogKCAoIHJ1bGVfX1hTeW5jaHJvbml6ZWRFeHByZXNzaW9uX19Hcm91cF8wXzBfXzAgKSApIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YU3luY2hyb25pemVkRXhwcmVzc2lvbl9fR3JvdXBfMF9fMF9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxOTY4MjoxOiAoICggKCBydWxlX19YU3luY2hyb25pemVkRXhwcmVzc2lvbl9fR3JvdXBfMF8wX18wICkgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxOTY4MzoxOiAoICggcnVsZV9fWFN5bmNocm9uaXplZEV4cHJlc3Npb25fX0dyb3VwXzBfMF9fMCApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIxMDIwOjE6ICggKCAoIHJ1bGVfX1hTeW5jaHJvbml6ZWRFeHByZXNzaW9uX19Hcm91cF8wXzBfXzAgKSApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIxMDIxOjE6ICggKCBydWxlX19YU3luY2hyb25pemVkRXhwcmVzc2lvbl9fR3JvdXBfMF8wX18wICkgKQogICAgICAgICAgICAgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTk2ODM6MTogKCAoIHJ1bGVfX1hTeW5jaHJvbml6ZWRFeHByZXNzaW9uX19Hcm91cF8wXzBfXzAgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxOTY4NDoyOiAoIHJ1bGVfX1hTeW5jaHJvbml6ZWRFeHByZXNzaW9uX19Hcm91cF8wXzBfXzAgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjEwMjE6MTogKCAoIHJ1bGVfX1hTeW5jaHJvbml6ZWRFeHByZXNzaW9uX19Hcm91cF8wXzBfXzAgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMTAyMjoyOiAoIHJ1bGVfX1hTeW5jaHJvbml6ZWRFeHByZXNzaW9uX19Hcm91cF8wXzBfXzAgKQogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYU3luY2hyb25pemVkRXhwcmVzc2lvbkFjY2VzcygpLmdldEdyb3VwXzBfMCgpKTsgCiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxOTY4NToyOiAoIHJ1bGVfX1hTeW5jaHJvbml6ZWRFeHByZXNzaW9uX19Hcm91cF8wXzBfXzAgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTk2ODU6MzogcnVsZV9fWFN5bmNocm9uaXplZEV4cHJlc3Npb25fX0dyb3VwXzBfMF9fMAorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjEwMjM6MjogKCBydWxlX19YU3luY2hyb25pemVkRXhwcmVzc2lvbl9fR3JvdXBfMF8wX18wICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIxMDIzOjM6IHJ1bGVfX1hTeW5jaHJvbml6ZWRFeHByZXNzaW9uX19Hcm91cF8wXzBfXzAKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzIpOwogICAgICAgICAgICAgcnVsZV9fWFN5bmNocm9uaXplZEV4cHJlc3Npb25fX0dyb3VwXzBfMF9fMCgpOwpAQCAtNjQ3NDMsMTYgKzY5MjAwLDE2IEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fWFN5bmNocm9uaXplZEV4cHJlc3Npb25fX0dyb3VwXzBfMF9fMCIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxOTY5NDoxOiBydWxlX19YU3luY2hyb25pemVkRXhwcmVzc2lvbl9fR3JvdXBfMF8wX18wIDogcnVsZV9fWFN5bmNocm9uaXplZEV4cHJlc3Npb25fX0dyb3VwXzBfMF9fMF9fSW1wbCBydWxlX19YU3luY2hyb25pemVkRXhwcmVzc2lvbl9fR3JvdXBfMF8wX18xIDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMTAzMjoxOiBydWxlX19YU3luY2hyb25pemVkRXhwcmVzc2lvbl9fR3JvdXBfMF8wX18wIDogcnVsZV9fWFN5bmNocm9uaXplZEV4cHJlc3Npb25fX0dyb3VwXzBfMF9fMF9fSW1wbCBydWxlX19YU3luY2hyb25pemVkRXhwcmVzc2lvbl9fR3JvdXBfMF8wX18xIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YU3luY2hyb25pemVkRXhwcmVzc2lvbl9fR3JvdXBfMF8wX18wKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE5Njk4OjE6ICggcnVsZV9fWFN5bmNocm9uaXplZEV4cHJlc3Npb25fX0dyb3VwXzBfMF9fMF9fSW1wbCBydWxlX19YU3luY2hyb25pemVkRXhwcmVzc2lvbl9fR3JvdXBfMF8wX18xICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE5Njk5OjI6IHJ1bGVfX1hTeW5jaHJvbml6ZWRFeHByZXNzaW9uX19Hcm91cF8wXzBfXzBfX0ltcGwgcnVsZV9fWFN5bmNocm9uaXplZEV4cHJlc3Npb25fX0dyb3VwXzBfMF9fMQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjEwMzY6MTogKCBydWxlX19YU3luY2hyb25pemVkRXhwcmVzc2lvbl9fR3JvdXBfMF8wX18wX19JbXBsIHJ1bGVfX1hTeW5jaHJvbml6ZWRFeHByZXNzaW9uX19Hcm91cF8wXzBfXzEgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjEwMzc6MjogcnVsZV9fWFN5bmNocm9uaXplZEV4cHJlc3Npb25fX0dyb3VwXzBfMF9fMF9fSW1wbCBydWxlX19YU3luY2hyb25pemVkRXhwcmVzc2lvbl9fR3JvdXBfMF8wX18xCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV18xNDgpOworICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMTU2KTsKICAgICAgICAgICAgIHJ1bGVfX1hTeW5jaHJvbml6ZWRFeHByZXNzaW9uX19Hcm91cF8wXzBfXzBfX0ltcGwoKTsKIAogICAgICAgICAgICAgc3RhdGUuX2ZzcC0tOwpAQCAtNjQ3ODEsMjMgKzY5MjM4LDIzIEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fWFN5bmNocm9uaXplZEV4cHJlc3Npb25fX0dyb3VwXzBfMF9fMF9fSW1wbCIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxOTcwNjoxOiBydWxlX19YU3luY2hyb25pemVkRXhwcmVzc2lvbl9fR3JvdXBfMF8wX18wX19JbXBsIDogKCAoKSApIDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMTA0NDoxOiBydWxlX19YU3luY2hyb25pemVkRXhwcmVzc2lvbl9fR3JvdXBfMF8wX18wX19JbXBsIDogKCAoKSApIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YU3luY2hyb25pemVkRXhwcmVzc2lvbl9fR3JvdXBfMF8wX18wX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE5NzEwOjE6ICggKCAoKSApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE5NzExOjE6ICggKCkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjEwNDg6MTogKCAoICgpICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjEwNDk6MTogKCAoKSApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxOTcxMToxOiAoICgpICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE5NzEyOjI6ICgpCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMTA0OToxOiAoICgpICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIxMDUwOjI6ICgpCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhTeW5jaHJvbml6ZWRFeHByZXNzaW9uQWNjZXNzKCkuZ2V0WFN5bmNocm9uaXplZEV4cHJlc3Npb25BY3Rpb25fMF8wXzAoKSk7IAogICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTk3MTM6MjogKCkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE5NzEzOjM6IAorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjEwNTE6MjogKCkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIxMDUxOjM6IAogICAgICAgICAgICAgewogICAgICAgICAgICAgfQogCkBAIC02NDgyMiwxNiArNjkyNzksMTYgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YU3luY2hyb25pemVkRXhwcmVzc2lvbl9fR3JvdXBfMF8wX18xIgotICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE5NzIxOjE6IHJ1bGVfX1hTeW5jaHJvbml6ZWRFeHByZXNzaW9uX19Hcm91cF8wXzBfXzEgOiBydWxlX19YU3luY2hyb25pemVkRXhwcmVzc2lvbl9fR3JvdXBfMF8wX18xX19JbXBsIHJ1bGVfX1hTeW5jaHJvbml6ZWRFeHByZXNzaW9uX19Hcm91cF8wXzBfXzIgOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIxMDU5OjE6IHJ1bGVfX1hTeW5jaHJvbml6ZWRFeHByZXNzaW9uX19Hcm91cF8wXzBfXzEgOiBydWxlX19YU3luY2hyb25pemVkRXhwcmVzc2lvbl9fR3JvdXBfMF8wX18xX19JbXBsIHJ1bGVfX1hTeW5jaHJvbml6ZWRFeHByZXNzaW9uX19Hcm91cF8wXzBfXzIgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1hTeW5jaHJvbml6ZWRFeHByZXNzaW9uX19Hcm91cF8wXzBfXzEoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTk3MjU6MTogKCBydWxlX19YU3luY2hyb25pemVkRXhwcmVzc2lvbl9fR3JvdXBfMF8wX18xX19JbXBsIHJ1bGVfX1hTeW5jaHJvbml6ZWRFeHByZXNzaW9uX19Hcm91cF8wXzBfXzIgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTk3MjY6MjogcnVsZV9fWFN5bmNocm9uaXplZEV4cHJlc3Npb25fX0dyb3VwXzBfMF9fMV9fSW1wbCBydWxlX19YU3luY2hyb25pemVkRXhwcmVzc2lvbl9fR3JvdXBfMF8wX18yCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMTA2MzoxOiAoIHJ1bGVfX1hTeW5jaHJvbml6ZWRFeHByZXNzaW9uX19Hcm91cF8wXzBfXzFfX0ltcGwgcnVsZV9fWFN5bmNocm9uaXplZEV4cHJlc3Npb25fX0dyb3VwXzBfMF9fMiApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMTA2NDoyOiBydWxlX19YU3luY2hyb25pemVkRXhwcmVzc2lvbl9fR3JvdXBfMF8wX18xX19JbXBsIHJ1bGVfX1hTeW5jaHJvbml6ZWRFeHByZXNzaW9uX19Hcm91cF8wXzBfXzIKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzcwKTsKKyAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzc4KTsKICAgICAgICAgICAgIHJ1bGVfX1hTeW5jaHJvbml6ZWRFeHByZXNzaW9uX19Hcm91cF8wXzBfXzFfX0ltcGwoKTsKIAogICAgICAgICAgICAgc3RhdGUuX2ZzcC0tOwpAQCAtNjQ4NjAsMjIgKzY5MzE3LDIyIEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fWFN5bmNocm9uaXplZEV4cHJlc3Npb25fX0dyb3VwXzBfMF9fMV9fSW1wbCIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxOTczMzoxOiBydWxlX19YU3luY2hyb25pemVkRXhwcmVzc2lvbl9fR3JvdXBfMF8wX18xX19JbXBsIDogKCAnc3luY2hyb25pemVkJyApIDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMTA3MToxOiBydWxlX19YU3luY2hyb25pemVkRXhwcmVzc2lvbl9fR3JvdXBfMF8wX18xX19JbXBsIDogKCAnc3luY2hyb25pemVkJyApIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YU3luY2hyb25pemVkRXhwcmVzc2lvbl9fR3JvdXBfMF8wX18xX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE5NzM3OjE6ICggKCAnc3luY2hyb25pemVkJyApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE5NzM4OjE6ICggJ3N5bmNocm9uaXplZCcgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjEwNzU6MTogKCAoICdzeW5jaHJvbml6ZWQnICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjEwNzY6MTogKCAnc3luY2hyb25pemVkJyApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxOTczODoxOiAoICdzeW5jaHJvbml6ZWQnICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE5NzM5OjI6ICdzeW5jaHJvbml6ZWQnCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMTA3NjoxOiAoICdzeW5jaHJvbml6ZWQnICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIxMDc3OjI6ICdzeW5jaHJvbml6ZWQnCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhTeW5jaHJvbml6ZWRFeHByZXNzaW9uQWNjZXNzKCkuZ2V0U3luY2hyb25pemVkS2V5d29yZF8wXzBfMSgpKTsgCiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBtYXRjaChpbnB1dCwxMzUsRk9MTE9XXzIpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOworICAgICAgICAgICAgbWF0Y2goaW5wdXQsMTQ1LEZPTExPV18yKTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRYU3luY2hyb25pemVkRXhwcmVzc2lvbkFjY2VzcygpLmdldFN5bmNocm9uaXplZEtleXdvcmRfMF8wXzEoKSk7IAogICAgICAgICAgICAgfQpAQCAtNjQ5MDEsMTQgKzY5MzU4LDE0IEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fWFN5bmNocm9uaXplZEV4cHJlc3Npb25fX0dyb3VwXzBfMF9fMiIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxOTc0ODoxOiBydWxlX19YU3luY2hyb25pemVkRXhwcmVzc2lvbl9fR3JvdXBfMF8wX18yIDogcnVsZV9fWFN5bmNocm9uaXplZEV4cHJlc3Npb25fX0dyb3VwXzBfMF9fMl9fSW1wbCA7CisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjEwODY6MTogcnVsZV9fWFN5bmNocm9uaXplZEV4cHJlc3Npb25fX0dyb3VwXzBfMF9fMiA6IHJ1bGVfX1hTeW5jaHJvbml6ZWRFeHByZXNzaW9uX19Hcm91cF8wXzBfXzJfX0ltcGwgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1hTeW5jaHJvbml6ZWRFeHByZXNzaW9uX19Hcm91cF8wXzBfXzIoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTk3NTI6MTogKCBydWxlX19YU3luY2hyb25pemVkRXhwcmVzc2lvbl9fR3JvdXBfMF8wX18yX19JbXBsICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE5NzUzOjI6IHJ1bGVfX1hTeW5jaHJvbml6ZWRFeHByZXNzaW9uX19Hcm91cF8wXzBfXzJfX0ltcGwKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIxMDkwOjE6ICggcnVsZV9fWFN5bmNocm9uaXplZEV4cHJlc3Npb25fX0dyb3VwXzBfMF9fMl9fSW1wbCApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMTA5MToyOiBydWxlX19YU3luY2hyb25pemVkRXhwcmVzc2lvbl9fR3JvdXBfMF8wX18yX19JbXBsCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV18yKTsKICAgICAgICAgICAgIHJ1bGVfX1hTeW5jaHJvbml6ZWRFeHByZXNzaW9uX19Hcm91cF8wXzBfXzJfX0ltcGwoKTsKQEAgLTY0OTM0LDIyICs2OTM5MSwyMiBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX1hTeW5jaHJvbml6ZWRFeHByZXNzaW9uX19Hcm91cF8wXzBfXzJfX0ltcGwiCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTk3NTk6MTogcnVsZV9fWFN5bmNocm9uaXplZEV4cHJlc3Npb25fX0dyb3VwXzBfMF9fMl9fSW1wbCA6ICggJygnICkgOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIxMDk3OjE6IHJ1bGVfX1hTeW5jaHJvbml6ZWRFeHByZXNzaW9uX19Hcm91cF8wXzBfXzJfX0ltcGwgOiAoICcoJyApIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YU3luY2hyb25pemVkRXhwcmVzc2lvbl9fR3JvdXBfMF8wX18yX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE5NzYzOjE6ICggKCAnKCcgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxOTc2NDoxOiAoICcoJyApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMTEwMToxOiAoICggJygnICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjExMDI6MTogKCAnKCcgKQogICAgICAgICAgICAgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTk3NjQ6MTogKCAnKCcgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTk3NjU6MjogJygnCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMTEwMjoxOiAoICcoJyApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMTEwMzoyOiAnKCcKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WFN5bmNocm9uaXplZEV4cHJlc3Npb25BY2Nlc3MoKS5nZXRMZWZ0UGFyZW50aGVzaXNLZXl3b3JkXzBfMF8yKCkpOyAKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1hdGNoKGlucHV0LDExMyxGT0xMT1dfMik7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CisgICAgICAgICAgICBtYXRjaChpbnB1dCwxMjMsRk9MTE9XXzIpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOwogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBhZnRlcihncmFtbWFyQWNjZXNzLmdldFhTeW5jaHJvbml6ZWRFeHByZXNzaW9uQWNjZXNzKCkuZ2V0TGVmdFBhcmVudGhlc2lzS2V5d29yZF8wXzBfMigpKTsgCiAgICAgICAgICAgICB9CkBAIC02NDk3NSwxNiArNjk0MzIsMTYgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YQ2F0Y2hDbGF1c2VfX0dyb3VwX18wIgotICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE5Nzc1OjE6IHJ1bGVfX1hDYXRjaENsYXVzZV9fR3JvdXBfXzAgOiBydWxlX19YQ2F0Y2hDbGF1c2VfX0dyb3VwX18wX19JbXBsIHJ1bGVfX1hDYXRjaENsYXVzZV9fR3JvdXBfXzEgOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIxMTEzOjE6IHJ1bGVfX1hDYXRjaENsYXVzZV9fR3JvdXBfXzAgOiBydWxlX19YQ2F0Y2hDbGF1c2VfX0dyb3VwX18wX19JbXBsIHJ1bGVfX1hDYXRjaENsYXVzZV9fR3JvdXBfXzEgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1hDYXRjaENsYXVzZV9fR3JvdXBfXzAoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTk3Nzk6MTogKCBydWxlX19YQ2F0Y2hDbGF1c2VfX0dyb3VwX18wX19JbXBsIHJ1bGVfX1hDYXRjaENsYXVzZV9fR3JvdXBfXzEgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTk3ODA6MjogcnVsZV9fWENhdGNoQ2xhdXNlX19Hcm91cF9fMF9fSW1wbCBydWxlX19YQ2F0Y2hDbGF1c2VfX0dyb3VwX18xCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMTExNzoxOiAoIHJ1bGVfX1hDYXRjaENsYXVzZV9fR3JvdXBfXzBfX0ltcGwgcnVsZV9fWENhdGNoQ2xhdXNlX19Hcm91cF9fMSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMTExODoyOiBydWxlX19YQ2F0Y2hDbGF1c2VfX0dyb3VwX18wX19JbXBsIHJ1bGVfX1hDYXRjaENsYXVzZV9fR3JvdXBfXzEKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzcwKTsKKyAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzc4KTsKICAgICAgICAgICAgIHJ1bGVfX1hDYXRjaENsYXVzZV9fR3JvdXBfXzBfX0ltcGwoKTsKIAogICAgICAgICAgICAgc3RhdGUuX2ZzcC0tOwpAQCAtNjUwMTMsMjUgKzY5NDcwLDI1IEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fWENhdGNoQ2xhdXNlX19Hcm91cF9fMF9fSW1wbCIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxOTc4NzoxOiBydWxlX19YQ2F0Y2hDbGF1c2VfX0dyb3VwX18wX19JbXBsIDogKCAoICdjYXRjaCcgKSApIDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMTEyNToxOiBydWxlX19YQ2F0Y2hDbGF1c2VfX0dyb3VwX18wX19JbXBsIDogKCAoICdjYXRjaCcgKSApIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YQ2F0Y2hDbGF1c2VfX0dyb3VwX18wX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE5NzkxOjE6ICggKCAoICdjYXRjaCcgKSApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE5NzkyOjE6ICggKCAnY2F0Y2gnICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjExMjk6MTogKCAoICggJ2NhdGNoJyApICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjExMzA6MTogKCAoICdjYXRjaCcgKSApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxOTc5MjoxOiAoICggJ2NhdGNoJyApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE5NzkzOjI6ICggJ2NhdGNoJyApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMTEzMDoxOiAoICggJ2NhdGNoJyApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIxMTMxOjI6ICggJ2NhdGNoJyApCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhDYXRjaENsYXVzZUFjY2VzcygpLmdldENhdGNoS2V5d29yZF8wKCkpOyAKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE5Nzk0OjI6ICggJ2NhdGNoJyApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxOTc5NDozOiAnY2F0Y2gnCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMTEzMjoyOiAoICdjYXRjaCcgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjExMzI6MzogJ2NhdGNoJwogICAgICAgICAgICAgewotICAgICAgICAgICAgbWF0Y2goaW5wdXQsMTM2LEZPTExPV18yKTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKKyAgICAgICAgICAgIG1hdGNoKGlucHV0LDE0NixGT0xMT1dfMik7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CiAKICAgICAgICAgICAgIH0KIApAQCAtNjUwNjAsMTYgKzY5NTE3LDE2IEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fWENhdGNoQ2xhdXNlX19Hcm91cF9fMSIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxOTgwMjoxOiBydWxlX19YQ2F0Y2hDbGF1c2VfX0dyb3VwX18xIDogcnVsZV9fWENhdGNoQ2xhdXNlX19Hcm91cF9fMV9fSW1wbCBydWxlX19YQ2F0Y2hDbGF1c2VfX0dyb3VwX18yIDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMTE0MDoxOiBydWxlX19YQ2F0Y2hDbGF1c2VfX0dyb3VwX18xIDogcnVsZV9fWENhdGNoQ2xhdXNlX19Hcm91cF9fMV9fSW1wbCBydWxlX19YQ2F0Y2hDbGF1c2VfX0dyb3VwX18yIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YQ2F0Y2hDbGF1c2VfX0dyb3VwX18xKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE5ODA2OjE6ICggcnVsZV9fWENhdGNoQ2xhdXNlX19Hcm91cF9fMV9fSW1wbCBydWxlX19YQ2F0Y2hDbGF1c2VfX0dyb3VwX18yICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE5ODA3OjI6IHJ1bGVfX1hDYXRjaENsYXVzZV9fR3JvdXBfXzFfX0ltcGwgcnVsZV9fWENhdGNoQ2xhdXNlX19Hcm91cF9fMgorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjExNDQ6MTogKCBydWxlX19YQ2F0Y2hDbGF1c2VfX0dyb3VwX18xX19JbXBsIHJ1bGVfX1hDYXRjaENsYXVzZV9fR3JvdXBfXzIgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjExNDU6MjogcnVsZV9fWENhdGNoQ2xhdXNlX19Hcm91cF9fMV9fSW1wbCBydWxlX19YQ2F0Y2hDbGF1c2VfX0dyb3VwX18yCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV185MSk7CisgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV185OSk7CiAgICAgICAgICAgICBydWxlX19YQ2F0Y2hDbGF1c2VfX0dyb3VwX18xX19JbXBsKCk7CiAKICAgICAgICAgICAgIHN0YXRlLl9mc3AtLTsKQEAgLTY1MDk4LDIyICs2OTU1NSwyMiBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX1hDYXRjaENsYXVzZV9fR3JvdXBfXzFfX0ltcGwiCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTk4MTQ6MTogcnVsZV9fWENhdGNoQ2xhdXNlX19Hcm91cF9fMV9fSW1wbCA6ICggJygnICkgOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIxMTUyOjE6IHJ1bGVfX1hDYXRjaENsYXVzZV9fR3JvdXBfXzFfX0ltcGwgOiAoICcoJyApIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YQ2F0Y2hDbGF1c2VfX0dyb3VwX18xX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE5ODE4OjE6ICggKCAnKCcgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxOTgxOToxOiAoICcoJyApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMTE1NjoxOiAoICggJygnICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjExNTc6MTogKCAnKCcgKQogICAgICAgICAgICAgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTk4MTk6MTogKCAnKCcgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTk4MjA6MjogJygnCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMTE1NzoxOiAoICcoJyApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMTE1ODoyOiAnKCcKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WENhdGNoQ2xhdXNlQWNjZXNzKCkuZ2V0TGVmdFBhcmVudGhlc2lzS2V5d29yZF8xKCkpOyAKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1hdGNoKGlucHV0LDExMyxGT0xMT1dfMik7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CisgICAgICAgICAgICBtYXRjaChpbnB1dCwxMjMsRk9MTE9XXzIpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOwogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBhZnRlcihncmFtbWFyQWNjZXNzLmdldFhDYXRjaENsYXVzZUFjY2VzcygpLmdldExlZnRQYXJlbnRoZXNpc0tleXdvcmRfMSgpKTsgCiAgICAgICAgICAgICB9CkBAIC02NTEzOSwxNiArNjk1OTYsMTYgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YQ2F0Y2hDbGF1c2VfX0dyb3VwX18yIgotICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE5ODI5OjE6IHJ1bGVfX1hDYXRjaENsYXVzZV9fR3JvdXBfXzIgOiBydWxlX19YQ2F0Y2hDbGF1c2VfX0dyb3VwX18yX19JbXBsIHJ1bGVfX1hDYXRjaENsYXVzZV9fR3JvdXBfXzMgOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIxMTY3OjE6IHJ1bGVfX1hDYXRjaENsYXVzZV9fR3JvdXBfXzIgOiBydWxlX19YQ2F0Y2hDbGF1c2VfX0dyb3VwX18yX19JbXBsIHJ1bGVfX1hDYXRjaENsYXVzZV9fR3JvdXBfXzMgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1hDYXRjaENsYXVzZV9fR3JvdXBfXzIoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTk4MzM6MTogKCBydWxlX19YQ2F0Y2hDbGF1c2VfX0dyb3VwX18yX19JbXBsIHJ1bGVfX1hDYXRjaENsYXVzZV9fR3JvdXBfXzMgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTk4MzQ6MjogcnVsZV9fWENhdGNoQ2xhdXNlX19Hcm91cF9fMl9fSW1wbCBydWxlX19YQ2F0Y2hDbGF1c2VfX0dyb3VwX18zCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMTE3MToxOiAoIHJ1bGVfX1hDYXRjaENsYXVzZV9fR3JvdXBfXzJfX0ltcGwgcnVsZV9fWENhdGNoQ2xhdXNlX19Hcm91cF9fMyApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMTE3MjoyOiBydWxlX19YQ2F0Y2hDbGF1c2VfX0dyb3VwX18yX19JbXBsIHJ1bGVfX1hDYXRjaENsYXVzZV9fR3JvdXBfXzMKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzExOCk7CisgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV18xMjYpOwogICAgICAgICAgICAgcnVsZV9fWENhdGNoQ2xhdXNlX19Hcm91cF9fMl9fSW1wbCgpOwogCiAgICAgICAgICAgICBzdGF0ZS5fZnNwLS07CkBAIC02NTE3NywyMyArNjk2MzQsMjMgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YQ2F0Y2hDbGF1c2VfX0dyb3VwX18yX19JbXBsIgotICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE5ODQxOjE6IHJ1bGVfX1hDYXRjaENsYXVzZV9fR3JvdXBfXzJfX0ltcGwgOiAoICggcnVsZV9fWENhdGNoQ2xhdXNlX19EZWNsYXJlZFBhcmFtQXNzaWdubWVudF8yICkgKSA7CisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjExNzk6MTogcnVsZV9fWENhdGNoQ2xhdXNlX19Hcm91cF9fMl9fSW1wbCA6ICggKCBydWxlX19YQ2F0Y2hDbGF1c2VfX0RlY2xhcmVkUGFyYW1Bc3NpZ25tZW50XzIgKSApIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YQ2F0Y2hDbGF1c2VfX0dyb3VwX18yX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE5ODQ1OjE6ICggKCAoIHJ1bGVfX1hDYXRjaENsYXVzZV9fRGVjbGFyZWRQYXJhbUFzc2lnbm1lbnRfMiApICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTk4NDY6MTogKCAoIHJ1bGVfX1hDYXRjaENsYXVzZV9fRGVjbGFyZWRQYXJhbUFzc2lnbm1lbnRfMiApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIxMTgzOjE6ICggKCAoIHJ1bGVfX1hDYXRjaENsYXVzZV9fRGVjbGFyZWRQYXJhbUFzc2lnbm1lbnRfMiApICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjExODQ6MTogKCAoIHJ1bGVfX1hDYXRjaENsYXVzZV9fRGVjbGFyZWRQYXJhbUFzc2lnbm1lbnRfMiApICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE5ODQ2OjE6ICggKCBydWxlX19YQ2F0Y2hDbGF1c2VfX0RlY2xhcmVkUGFyYW1Bc3NpZ25tZW50XzIgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxOTg0NzoyOiAoIHJ1bGVfX1hDYXRjaENsYXVzZV9fRGVjbGFyZWRQYXJhbUFzc2lnbm1lbnRfMiApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMTE4NDoxOiAoICggcnVsZV9fWENhdGNoQ2xhdXNlX19EZWNsYXJlZFBhcmFtQXNzaWdubWVudF8yICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjExODU6MjogKCBydWxlX19YQ2F0Y2hDbGF1c2VfX0RlY2xhcmVkUGFyYW1Bc3NpZ25tZW50XzIgKQogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYQ2F0Y2hDbGF1c2VBY2Nlc3MoKS5nZXREZWNsYXJlZFBhcmFtQXNzaWdubWVudF8yKCkpOyAKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE5ODQ4OjI6ICggcnVsZV9fWENhdGNoQ2xhdXNlX19EZWNsYXJlZFBhcmFtQXNzaWdubWVudF8yICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE5ODQ4OjM6IHJ1bGVfX1hDYXRjaENsYXVzZV9fRGVjbGFyZWRQYXJhbUFzc2lnbm1lbnRfMgorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjExODY6MjogKCBydWxlX19YQ2F0Y2hDbGF1c2VfX0RlY2xhcmVkUGFyYW1Bc3NpZ25tZW50XzIgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjExODY6MzogcnVsZV9fWENhdGNoQ2xhdXNlX19EZWNsYXJlZFBhcmFtQXNzaWdubWVudF8yCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV18yKTsKICAgICAgICAgICAgIHJ1bGVfX1hDYXRjaENsYXVzZV9fRGVjbGFyZWRQYXJhbUFzc2lnbm1lbnRfMigpOwpAQCAtNjUyMjgsMTYgKzY5Njg1LDE2IEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fWENhdGNoQ2xhdXNlX19Hcm91cF9fMyIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxOTg1NjoxOiBydWxlX19YQ2F0Y2hDbGF1c2VfX0dyb3VwX18zIDogcnVsZV9fWENhdGNoQ2xhdXNlX19Hcm91cF9fM19fSW1wbCBydWxlX19YQ2F0Y2hDbGF1c2VfX0dyb3VwX180IDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMTE5NDoxOiBydWxlX19YQ2F0Y2hDbGF1c2VfX0dyb3VwX18zIDogcnVsZV9fWENhdGNoQ2xhdXNlX19Hcm91cF9fM19fSW1wbCBydWxlX19YQ2F0Y2hDbGF1c2VfX0dyb3VwX180IDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YQ2F0Y2hDbGF1c2VfX0dyb3VwX18zKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE5ODYwOjE6ICggcnVsZV9fWENhdGNoQ2xhdXNlX19Hcm91cF9fM19fSW1wbCBydWxlX19YQ2F0Y2hDbGF1c2VfX0dyb3VwX180ICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE5ODYxOjI6IHJ1bGVfX1hDYXRjaENsYXVzZV9fR3JvdXBfXzNfX0ltcGwgcnVsZV9fWENhdGNoQ2xhdXNlX19Hcm91cF9fNAorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjExOTg6MTogKCBydWxlX19YQ2F0Y2hDbGF1c2VfX0dyb3VwX18zX19JbXBsIHJ1bGVfX1hDYXRjaENsYXVzZV9fR3JvdXBfXzQgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjExOTk6MjogcnVsZV9fWENhdGNoQ2xhdXNlX19Hcm91cF9fM19fSW1wbCBydWxlX19YQ2F0Y2hDbGF1c2VfX0dyb3VwX180CiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV183NCk7CisgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV184Mik7CiAgICAgICAgICAgICBydWxlX19YQ2F0Y2hDbGF1c2VfX0dyb3VwX18zX19JbXBsKCk7CiAKICAgICAgICAgICAgIHN0YXRlLl9mc3AtLTsKQEAgLTY1MjY2LDIyICs2OTcyMywyMiBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX1hDYXRjaENsYXVzZV9fR3JvdXBfXzNfX0ltcGwiCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTk4Njg6MTogcnVsZV9fWENhdGNoQ2xhdXNlX19Hcm91cF9fM19fSW1wbCA6ICggJyknICkgOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIxMjA2OjE6IHJ1bGVfX1hDYXRjaENsYXVzZV9fR3JvdXBfXzNfX0ltcGwgOiAoICcpJyApIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YQ2F0Y2hDbGF1c2VfX0dyb3VwX18zX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE5ODcyOjE6ICggKCAnKScgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxOTg3MzoxOiAoICcpJyApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMTIxMDoxOiAoICggJyknICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjEyMTE6MTogKCAnKScgKQogICAgICAgICAgICAgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTk4NzM6MTogKCAnKScgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTk4NzQ6MjogJyknCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMTIxMToxOiAoICcpJyApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMTIxMjoyOiAnKScKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WENhdGNoQ2xhdXNlQWNjZXNzKCkuZ2V0UmlnaHRQYXJlbnRoZXNpc0tleXdvcmRfMygpKTsgCiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBtYXRjaChpbnB1dCwxMTQsRk9MTE9XXzIpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOworICAgICAgICAgICAgbWF0Y2goaW5wdXQsMTI0LEZPTExPV18yKTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRYQ2F0Y2hDbGF1c2VBY2Nlc3MoKS5nZXRSaWdodFBhcmVudGhlc2lzS2V5d29yZF8zKCkpOyAKICAgICAgICAgICAgIH0KQEAgLTY1MzA3LDE0ICs2OTc2NCwxNCBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX1hDYXRjaENsYXVzZV9fR3JvdXBfXzQiCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTk4ODM6MTogcnVsZV9fWENhdGNoQ2xhdXNlX19Hcm91cF9fNCA6IHJ1bGVfX1hDYXRjaENsYXVzZV9fR3JvdXBfXzRfX0ltcGwgOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIxMjIxOjE6IHJ1bGVfX1hDYXRjaENsYXVzZV9fR3JvdXBfXzQgOiBydWxlX19YQ2F0Y2hDbGF1c2VfX0dyb3VwX180X19JbXBsIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YQ2F0Y2hDbGF1c2VfX0dyb3VwX180KCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE5ODg3OjE6ICggcnVsZV9fWENhdGNoQ2xhdXNlX19Hcm91cF9fNF9fSW1wbCApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxOTg4ODoyOiBydWxlX19YQ2F0Y2hDbGF1c2VfX0dyb3VwX180X19JbXBsCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMTIyNToxOiAoIHJ1bGVfX1hDYXRjaENsYXVzZV9fR3JvdXBfXzRfX0ltcGwgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjEyMjY6MjogcnVsZV9fWENhdGNoQ2xhdXNlX19Hcm91cF9fNF9fSW1wbAogICAgICAgICAgICAgewogICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMik7CiAgICAgICAgICAgICBydWxlX19YQ2F0Y2hDbGF1c2VfX0dyb3VwX180X19JbXBsKCk7CkBAIC02NTM0MCwyMyArNjk3OTcsMjMgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YQ2F0Y2hDbGF1c2VfX0dyb3VwX180X19JbXBsIgotICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE5ODk0OjE6IHJ1bGVfX1hDYXRjaENsYXVzZV9fR3JvdXBfXzRfX0ltcGwgOiAoICggcnVsZV9fWENhdGNoQ2xhdXNlX19FeHByZXNzaW9uQXNzaWdubWVudF80ICkgKSA7CisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjEyMzI6MTogcnVsZV9fWENhdGNoQ2xhdXNlX19Hcm91cF9fNF9fSW1wbCA6ICggKCBydWxlX19YQ2F0Y2hDbGF1c2VfX0V4cHJlc3Npb25Bc3NpZ25tZW50XzQgKSApIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YQ2F0Y2hDbGF1c2VfX0dyb3VwX180X19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE5ODk4OjE6ICggKCAoIHJ1bGVfX1hDYXRjaENsYXVzZV9fRXhwcmVzc2lvbkFzc2lnbm1lbnRfNCApICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTk4OTk6MTogKCAoIHJ1bGVfX1hDYXRjaENsYXVzZV9fRXhwcmVzc2lvbkFzc2lnbm1lbnRfNCApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIxMjM2OjE6ICggKCAoIHJ1bGVfX1hDYXRjaENsYXVzZV9fRXhwcmVzc2lvbkFzc2lnbm1lbnRfNCApICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjEyMzc6MTogKCAoIHJ1bGVfX1hDYXRjaENsYXVzZV9fRXhwcmVzc2lvbkFzc2lnbm1lbnRfNCApICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE5ODk5OjE6ICggKCBydWxlX19YQ2F0Y2hDbGF1c2VfX0V4cHJlc3Npb25Bc3NpZ25tZW50XzQgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxOTkwMDoyOiAoIHJ1bGVfX1hDYXRjaENsYXVzZV9fRXhwcmVzc2lvbkFzc2lnbm1lbnRfNCApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMTIzNzoxOiAoICggcnVsZV9fWENhdGNoQ2xhdXNlX19FeHByZXNzaW9uQXNzaWdubWVudF80ICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjEyMzg6MjogKCBydWxlX19YQ2F0Y2hDbGF1c2VfX0V4cHJlc3Npb25Bc3NpZ25tZW50XzQgKQogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYQ2F0Y2hDbGF1c2VBY2Nlc3MoKS5nZXRFeHByZXNzaW9uQXNzaWdubWVudF80KCkpOyAKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE5OTAxOjI6ICggcnVsZV9fWENhdGNoQ2xhdXNlX19FeHByZXNzaW9uQXNzaWdubWVudF80ICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE5OTAxOjM6IHJ1bGVfX1hDYXRjaENsYXVzZV9fRXhwcmVzc2lvbkFzc2lnbm1lbnRfNAorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjEyMzk6MjogKCBydWxlX19YQ2F0Y2hDbGF1c2VfX0V4cHJlc3Npb25Bc3NpZ25tZW50XzQgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjEyMzk6MzogcnVsZV9fWENhdGNoQ2xhdXNlX19FeHByZXNzaW9uQXNzaWdubWVudF80CiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV18yKTsKICAgICAgICAgICAgIHJ1bGVfX1hDYXRjaENsYXVzZV9fRXhwcmVzc2lvbkFzc2lnbm1lbnRfNCgpOwpAQCAtNjUzOTEsMTYgKzY5ODQ4LDE2IEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fUXVhbGlmaWVkTmFtZV9fR3JvdXBfXzAiCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTk5MTA6MTogcnVsZV9fUXVhbGlmaWVkTmFtZV9fR3JvdXBfXzAgOiBydWxlX19RdWFsaWZpZWROYW1lX19Hcm91cF9fMF9fSW1wbCBydWxlX19RdWFsaWZpZWROYW1lX19Hcm91cF9fMSA7CisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjEyNDg6MTogcnVsZV9fUXVhbGlmaWVkTmFtZV9fR3JvdXBfXzAgOiBydWxlX19RdWFsaWZpZWROYW1lX19Hcm91cF9fMF9fSW1wbCBydWxlX19RdWFsaWZpZWROYW1lX19Hcm91cF9fMSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fUXVhbGlmaWVkTmFtZV9fR3JvdXBfXzAoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTk5MTQ6MTogKCBydWxlX19RdWFsaWZpZWROYW1lX19Hcm91cF9fMF9fSW1wbCBydWxlX19RdWFsaWZpZWROYW1lX19Hcm91cF9fMSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxOTkxNToyOiBydWxlX19RdWFsaWZpZWROYW1lX19Hcm91cF9fMF9fSW1wbCBydWxlX19RdWFsaWZpZWROYW1lX19Hcm91cF9fMQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjEyNTI6MTogKCBydWxlX19RdWFsaWZpZWROYW1lX19Hcm91cF9fMF9fSW1wbCBydWxlX19RdWFsaWZpZWROYW1lX19Hcm91cF9fMSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMTI1MzoyOiBydWxlX19RdWFsaWZpZWROYW1lX19Hcm91cF9fMF9fSW1wbCBydWxlX19RdWFsaWZpZWROYW1lX19Hcm91cF9fMQogICAgICAgICAgICAgewotICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfNjIpOworICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfNzApOwogICAgICAgICAgICAgcnVsZV9fUXVhbGlmaWVkTmFtZV9fR3JvdXBfXzBfX0ltcGwoKTsKIAogICAgICAgICAgICAgc3RhdGUuX2ZzcC0tOwpAQCAtNjU0MjksMTcgKzY5ODg2LDE3IEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fUXVhbGlmaWVkTmFtZV9fR3JvdXBfXzBfX0ltcGwiCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTk5MjI6MTogcnVsZV9fUXVhbGlmaWVkTmFtZV9fR3JvdXBfXzBfX0ltcGwgOiAoIHJ1bGVWYWxpZElEICkgOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIxMjYwOjE6IHJ1bGVfX1F1YWxpZmllZE5hbWVfX0dyb3VwX18wX19JbXBsIDogKCBydWxlVmFsaWRJRCApIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19RdWFsaWZpZWROYW1lX19Hcm91cF9fMF9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxOTkyNjoxOiAoICggcnVsZVZhbGlkSUQgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxOTkyNzoxOiAoIHJ1bGVWYWxpZElEICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIxMjY0OjE6ICggKCBydWxlVmFsaWRJRCApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIxMjY1OjE6ICggcnVsZVZhbGlkSUQgKQogICAgICAgICAgICAgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTk5Mjc6MTogKCBydWxlVmFsaWRJRCApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxOTkyODoyOiBydWxlVmFsaWRJRAorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjEyNjU6MTogKCBydWxlVmFsaWRJRCApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMTI2NjoyOiBydWxlVmFsaWRJRAogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRRdWFsaWZpZWROYW1lQWNjZXNzKCkuZ2V0VmFsaWRJRFBhcnNlclJ1bGVDYWxsXzAoKSk7IApAQCAtNjU0NzQsMTQgKzY5OTMxLDE0IEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fUXVhbGlmaWVkTmFtZV9fR3JvdXBfXzEiCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTk5Mzc6MTogcnVsZV9fUXVhbGlmaWVkTmFtZV9fR3JvdXBfXzEgOiBydWxlX19RdWFsaWZpZWROYW1lX19Hcm91cF9fMV9fSW1wbCA7CisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjEyNzU6MTogcnVsZV9fUXVhbGlmaWVkTmFtZV9fR3JvdXBfXzEgOiBydWxlX19RdWFsaWZpZWROYW1lX19Hcm91cF9fMV9fSW1wbCA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fUXVhbGlmaWVkTmFtZV9fR3JvdXBfXzEoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTk5NDE6MTogKCBydWxlX19RdWFsaWZpZWROYW1lX19Hcm91cF9fMV9fSW1wbCApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxOTk0MjoyOiBydWxlX19RdWFsaWZpZWROYW1lX19Hcm91cF9fMV9fSW1wbAorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjEyNzk6MTogKCBydWxlX19RdWFsaWZpZWROYW1lX19Hcm91cF9fMV9fSW1wbCApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMTI4MDoyOiBydWxlX19RdWFsaWZpZWROYW1lX19Hcm91cF9fMV9fSW1wbAogICAgICAgICAgICAgewogICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMik7CiAgICAgICAgICAgICBydWxlX19RdWFsaWZpZWROYW1lX19Hcm91cF9fMV9fSW1wbCgpOwpAQCAtNjU1MDcsMzUgKzY5OTY0LDM1IEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fUXVhbGlmaWVkTmFtZV9fR3JvdXBfXzFfX0ltcGwiCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTk5NDg6MTogcnVsZV9fUXVhbGlmaWVkTmFtZV9fR3JvdXBfXzFfX0ltcGwgOiAoICggcnVsZV9fUXVhbGlmaWVkTmFtZV9fR3JvdXBfMV9fMCApKiApIDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMTI4NjoxOiBydWxlX19RdWFsaWZpZWROYW1lX19Hcm91cF9fMV9fSW1wbCA6ICggKCBydWxlX19RdWFsaWZpZWROYW1lX19Hcm91cF8xX18wICkqICkgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1F1YWxpZmllZE5hbWVfX0dyb3VwX18xX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE5OTUyOjE6ICggKCAoIHJ1bGVfX1F1YWxpZmllZE5hbWVfX0dyb3VwXzFfXzAgKSogKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxOTk1MzoxOiAoICggcnVsZV9fUXVhbGlmaWVkTmFtZV9fR3JvdXBfMV9fMCApKiApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMTI5MDoxOiAoICggKCBydWxlX19RdWFsaWZpZWROYW1lX19Hcm91cF8xX18wICkqICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjEyOTE6MTogKCAoIHJ1bGVfX1F1YWxpZmllZE5hbWVfX0dyb3VwXzFfXzAgKSogKQogICAgICAgICAgICAgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTk5NTM6MTogKCAoIHJ1bGVfX1F1YWxpZmllZE5hbWVfX0dyb3VwXzFfXzAgKSogKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTk5NTQ6MjogKCBydWxlX19RdWFsaWZpZWROYW1lX19Hcm91cF8xX18wICkqCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMTI5MToxOiAoICggcnVsZV9fUXVhbGlmaWVkTmFtZV9fR3JvdXBfMV9fMCApKiApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMTI5MjoyOiAoIHJ1bGVfX1F1YWxpZmllZE5hbWVfX0dyb3VwXzFfXzAgKSoKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0UXVhbGlmaWVkTmFtZUFjY2VzcygpLmdldEdyb3VwXzEoKSk7IAogICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTk5NTU6MjogKCBydWxlX19RdWFsaWZpZWROYW1lX19Hcm91cF8xX18wICkqCi0gICAgICAgICAgICBsb29wMTU1OgorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjEyOTM6MjogKCBydWxlX19RdWFsaWZpZWROYW1lX19Hcm91cF8xX18wICkqCisgICAgICAgICAgICBsb29wMTY4OgogICAgICAgICAgICAgZG8gewotICAgICAgICAgICAgICAgIGludCBhbHQxNTU9MjsKLSAgICAgICAgICAgICAgICBpbnQgTEExNTVfMCA9IGlucHV0LkxBKDEpOworICAgICAgICAgICAgICAgIGludCBhbHQxNjg9MjsKKyAgICAgICAgICAgICAgICBpbnQgTEExNjhfMCA9IGlucHV0LkxBKDEpOwogCi0gICAgICAgICAgICAgICAgaWYgKCAoTEExNTVfMD09NDMpICkgewotICAgICAgICAgICAgICAgICAgICBpbnQgTEExNTVfMiA9IGlucHV0LkxBKDIpOworICAgICAgICAgICAgICAgIGlmICggKExBMTY4XzA9PTQzKSApIHsKKyAgICAgICAgICAgICAgICAgICAgaW50IExBMTY4XzIgPSBpbnB1dC5MQSgyKTsKIAotICAgICAgICAgICAgICAgICAgICBpZiAoIChMQTE1NV8yPT1SVUxFX0lEKSApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGludCBMQTE1NV8zID0gaW5wdXQuTEEoMyk7CisgICAgICAgICAgICAgICAgICAgIGlmICggKExBMTY4XzI9PVJVTEVfSUQpICkgeworICAgICAgICAgICAgICAgICAgICAgICAgaW50IExBMTY4XzMgPSBpbnB1dC5MQSgzKTsKIAotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCAoc3lucHJlZDIwOV9JbnRlcm5hbERhdGFEU0woKSkgKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYWx0MTU1PTE7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIChzeW5wcmVkMjI4X0ludGVybmFsRGF0YURTTCgpKSApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbHQxNjg9MTsKICAgICAgICAgICAgICAgICAgICAgICAgIH0KIAogCkBAIC02NTU0NSwxMSArNzAwMDIsMTEgQEAKICAgICAgICAgICAgICAgICB9CiAKIAotICAgICAgICAgICAgICAgIHN3aXRjaCAoYWx0MTU1KSB7CisgICAgICAgICAgICAgICAgc3dpdGNoIChhbHQxNjgpIHsKICAgICAgICAgICAgIAljYXNlIDEgOgotICAgICAgICAgICAgCSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxOTk1NTozOiBydWxlX19RdWFsaWZpZWROYW1lX19Hcm91cF8xX18wCisgICAgICAgICAgICAJICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIxMjkzOjM6IHJ1bGVfX1F1YWxpZmllZE5hbWVfX0dyb3VwXzFfXzAKICAgICAgICAgICAgIAkgICAgewotICAgICAgICAgICAgCSAgICBwdXNoRm9sbG93KEZPTExPV182Myk7CisgICAgICAgICAgICAJICAgIHB1c2hGb2xsb3coRk9MTE9XXzcxKTsKICAgICAgICAgICAgIAkgICAgcnVsZV9fUXVhbGlmaWVkTmFtZV9fR3JvdXBfMV9fMCgpOwogCiAgICAgICAgICAgICAJICAgIHN0YXRlLl9mc3AtLTsKQEAgLTY1NTU5LDcgKzcwMDE2LDcgQEAKICAgICAgICAgICAgIAkgICAgYnJlYWs7CiAKICAgICAgICAgICAgIAlkZWZhdWx0IDoKLSAgICAgICAgICAgIAkgICAgYnJlYWsgbG9vcDE1NTsKKyAgICAgICAgICAgIAkgICAgYnJlYWsgbG9vcDE2ODsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9IHdoaWxlICh0cnVlKTsKIApAQCAtNjU1ODgsMTQgKzcwMDQ1LDE0IEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fUXVhbGlmaWVkTmFtZV9fR3JvdXBfMV9fMCIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxOTk2NDoxOiBydWxlX19RdWFsaWZpZWROYW1lX19Hcm91cF8xX18wIDogcnVsZV9fUXVhbGlmaWVkTmFtZV9fR3JvdXBfMV9fMF9fSW1wbCBydWxlX19RdWFsaWZpZWROYW1lX19Hcm91cF8xX18xIDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMTMwMjoxOiBydWxlX19RdWFsaWZpZWROYW1lX19Hcm91cF8xX18wIDogcnVsZV9fUXVhbGlmaWVkTmFtZV9fR3JvdXBfMV9fMF9fSW1wbCBydWxlX19RdWFsaWZpZWROYW1lX19Hcm91cF8xX18xIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19RdWFsaWZpZWROYW1lX19Hcm91cF8xX18wKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE5OTY4OjE6ICggcnVsZV9fUXVhbGlmaWVkTmFtZV9fR3JvdXBfMV9fMF9fSW1wbCBydWxlX19RdWFsaWZpZWROYW1lX19Hcm91cF8xX18xICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE5OTY5OjI6IHJ1bGVfX1F1YWxpZmllZE5hbWVfX0dyb3VwXzFfXzBfX0ltcGwgcnVsZV9fUXVhbGlmaWVkTmFtZV9fR3JvdXBfMV9fMQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjEzMDY6MTogKCBydWxlX19RdWFsaWZpZWROYW1lX19Hcm91cF8xX18wX19JbXBsIHJ1bGVfX1F1YWxpZmllZE5hbWVfX0dyb3VwXzFfXzEgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjEzMDc6MjogcnVsZV9fUXVhbGlmaWVkTmFtZV9fR3JvdXBfMV9fMF9fSW1wbCBydWxlX19RdWFsaWZpZWROYW1lX19Hcm91cF8xX18xCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV183KTsKICAgICAgICAgICAgIHJ1bGVfX1F1YWxpZmllZE5hbWVfX0dyb3VwXzFfXzBfX0ltcGwoKTsKQEAgLTY1NjI2LDIzICs3MDA4MywyMyBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX1F1YWxpZmllZE5hbWVfX0dyb3VwXzFfXzBfX0ltcGwiCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTk5NzY6MTogcnVsZV9fUXVhbGlmaWVkTmFtZV9fR3JvdXBfMV9fMF9fSW1wbCA6ICggKCAnLicgKSApIDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMTMxNDoxOiBydWxlX19RdWFsaWZpZWROYW1lX19Hcm91cF8xX18wX19JbXBsIDogKCAoICcuJyApICkgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1F1YWxpZmllZE5hbWVfX0dyb3VwXzFfXzBfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTk5ODA6MTogKCAoICggJy4nICkgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxOTk4MToxOiAoICggJy4nICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjEzMTg6MTogKCAoICggJy4nICkgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMTMxOToxOiAoICggJy4nICkgKQogICAgICAgICAgICAgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTk5ODE6MTogKCAoICcuJyApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE5OTgyOjI6ICggJy4nICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIxMzE5OjE6ICggKCAnLicgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMTMyMDoyOiAoICcuJyApCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFF1YWxpZmllZE5hbWVBY2Nlc3MoKS5nZXRGdWxsU3RvcEtleXdvcmRfMV8wKCkpOyAKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE5OTgzOjI6ICggJy4nICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE5OTgzOjM6ICcuJworICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjEzMjE6MjogKCAnLicgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjEzMjE6MzogJy4nCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBtYXRjaChpbnB1dCw0MyxGT0xMT1dfMik7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CiAKQEAgLTY1NjczLDE0ICs3MDEzMCwxNCBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX1F1YWxpZmllZE5hbWVfX0dyb3VwXzFfXzEiCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTk5OTE6MTogcnVsZV9fUXVhbGlmaWVkTmFtZV9fR3JvdXBfMV9fMSA6IHJ1bGVfX1F1YWxpZmllZE5hbWVfX0dyb3VwXzFfXzFfX0ltcGwgOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIxMzI5OjE6IHJ1bGVfX1F1YWxpZmllZE5hbWVfX0dyb3VwXzFfXzEgOiBydWxlX19RdWFsaWZpZWROYW1lX19Hcm91cF8xX18xX19JbXBsIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19RdWFsaWZpZWROYW1lX19Hcm91cF8xX18xKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE5OTk1OjE6ICggcnVsZV9fUXVhbGlmaWVkTmFtZV9fR3JvdXBfMV9fMV9fSW1wbCApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxOTk5NjoyOiBydWxlX19RdWFsaWZpZWROYW1lX19Hcm91cF8xX18xX19JbXBsCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMTMzMzoxOiAoIHJ1bGVfX1F1YWxpZmllZE5hbWVfX0dyb3VwXzFfXzFfX0ltcGwgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjEzMzQ6MjogcnVsZV9fUXVhbGlmaWVkTmFtZV9fR3JvdXBfMV9fMV9fSW1wbAogICAgICAgICAgICAgewogICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMik7CiAgICAgICAgICAgICBydWxlX19RdWFsaWZpZWROYW1lX19Hcm91cF8xX18xX19JbXBsKCk7CkBAIC02NTcwNiwxNyArNzAxNjMsMTcgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19RdWFsaWZpZWROYW1lX19Hcm91cF8xX18xX19JbXBsIgotICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIwMDAyOjE6IHJ1bGVfX1F1YWxpZmllZE5hbWVfX0dyb3VwXzFfXzFfX0ltcGwgOiAoIHJ1bGVWYWxpZElEICkgOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIxMzQwOjE6IHJ1bGVfX1F1YWxpZmllZE5hbWVfX0dyb3VwXzFfXzFfX0ltcGwgOiAoIHJ1bGVWYWxpZElEICkgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1F1YWxpZmllZE5hbWVfX0dyb3VwXzFfXzFfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjAwMDY6MTogKCAoIHJ1bGVWYWxpZElEICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjAwMDc6MTogKCBydWxlVmFsaWRJRCApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMTM0NDoxOiAoICggcnVsZVZhbGlkSUQgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMTM0NToxOiAoIHJ1bGVWYWxpZElEICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIwMDA3OjE6ICggcnVsZVZhbGlkSUQgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjAwMDg6MjogcnVsZVZhbGlkSUQKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIxMzQ1OjE6ICggcnVsZVZhbGlkSUQgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjEzNDY6MjogcnVsZVZhbGlkSUQKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0UXVhbGlmaWVkTmFtZUFjY2VzcygpLmdldFZhbGlkSURQYXJzZXJSdWxlQ2FsbF8xXzEoKSk7IApAQCAtNjU3NTEsMTYgKzcwMjA4LDE2IEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fTnVtYmVyX19Hcm91cF8xX18wIgotICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIwMDE4OjE6IHJ1bGVfX051bWJlcl9fR3JvdXBfMV9fMCA6IHJ1bGVfX051bWJlcl9fR3JvdXBfMV9fMF9fSW1wbCBydWxlX19OdW1iZXJfX0dyb3VwXzFfXzEgOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIxMzU2OjE6IHJ1bGVfX051bWJlcl9fR3JvdXBfMV9fMCA6IHJ1bGVfX051bWJlcl9fR3JvdXBfMV9fMF9fSW1wbCBydWxlX19OdW1iZXJfX0dyb3VwXzFfXzEgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX051bWJlcl9fR3JvdXBfMV9fMCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMDAyMjoxOiAoIHJ1bGVfX051bWJlcl9fR3JvdXBfMV9fMF9fSW1wbCBydWxlX19OdW1iZXJfX0dyb3VwXzFfXzEgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjAwMjM6MjogcnVsZV9fTnVtYmVyX19Hcm91cF8xX18wX19JbXBsIHJ1bGVfX051bWJlcl9fR3JvdXBfMV9fMQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjEzNjA6MTogKCBydWxlX19OdW1iZXJfX0dyb3VwXzFfXzBfX0ltcGwgcnVsZV9fTnVtYmVyX19Hcm91cF8xX18xICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIxMzYxOjI6IHJ1bGVfX051bWJlcl9fR3JvdXBfMV9fMF9fSW1wbCBydWxlX19OdW1iZXJfX0dyb3VwXzFfXzEKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzYyKTsKKyAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzcwKTsKICAgICAgICAgICAgIHJ1bGVfX051bWJlcl9fR3JvdXBfMV9fMF9fSW1wbCgpOwogCiAgICAgICAgICAgICBzdGF0ZS5fZnNwLS07CkBAIC02NTc4OSwyMyArNzAyNDYsMjMgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19OdW1iZXJfX0dyb3VwXzFfXzBfX0ltcGwiCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjAwMzA6MTogcnVsZV9fTnVtYmVyX19Hcm91cF8xX18wX19JbXBsIDogKCAoIHJ1bGVfX051bWJlcl9fQWx0ZXJuYXRpdmVzXzFfMCApICkgOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIxMzY4OjE6IHJ1bGVfX051bWJlcl9fR3JvdXBfMV9fMF9fSW1wbCA6ICggKCBydWxlX19OdW1iZXJfX0FsdGVybmF0aXZlc18xXzAgKSApIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19OdW1iZXJfX0dyb3VwXzFfXzBfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjAwMzQ6MTogKCAoICggcnVsZV9fTnVtYmVyX19BbHRlcm5hdGl2ZXNfMV8wICkgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMDAzNToxOiAoICggcnVsZV9fTnVtYmVyX19BbHRlcm5hdGl2ZXNfMV8wICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjEzNzI6MTogKCAoICggcnVsZV9fTnVtYmVyX19BbHRlcm5hdGl2ZXNfMV8wICkgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMTM3MzoxOiAoICggcnVsZV9fTnVtYmVyX19BbHRlcm5hdGl2ZXNfMV8wICkgKQogICAgICAgICAgICAgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjAwMzU6MTogKCAoIHJ1bGVfX051bWJlcl9fQWx0ZXJuYXRpdmVzXzFfMCApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIwMDM2OjI6ICggcnVsZV9fTnVtYmVyX19BbHRlcm5hdGl2ZXNfMV8wICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIxMzczOjE6ICggKCBydWxlX19OdW1iZXJfX0FsdGVybmF0aXZlc18xXzAgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMTM3NDoyOiAoIHJ1bGVfX051bWJlcl9fQWx0ZXJuYXRpdmVzXzFfMCApCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldE51bWJlckFjY2VzcygpLmdldEFsdGVybmF0aXZlc18xXzAoKSk7IAogICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjAwMzc6MjogKCBydWxlX19OdW1iZXJfX0FsdGVybmF0aXZlc18xXzAgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjAwMzc6MzogcnVsZV9fTnVtYmVyX19BbHRlcm5hdGl2ZXNfMV8wCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMTM3NToyOiAoIHJ1bGVfX051bWJlcl9fQWx0ZXJuYXRpdmVzXzFfMCApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMTM3NTozOiBydWxlX19OdW1iZXJfX0FsdGVybmF0aXZlc18xXzAKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzIpOwogICAgICAgICAgICAgcnVsZV9fTnVtYmVyX19BbHRlcm5hdGl2ZXNfMV8wKCk7CkBAIC02NTg0MCwxNCArNzAyOTcsMTQgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19OdW1iZXJfX0dyb3VwXzFfXzEiCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjAwNDU6MTogcnVsZV9fTnVtYmVyX19Hcm91cF8xX18xIDogcnVsZV9fTnVtYmVyX19Hcm91cF8xX18xX19JbXBsIDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMTM4MzoxOiBydWxlX19OdW1iZXJfX0dyb3VwXzFfXzEgOiBydWxlX19OdW1iZXJfX0dyb3VwXzFfXzFfX0ltcGwgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX051bWJlcl9fR3JvdXBfMV9fMSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMDA0OToxOiAoIHJ1bGVfX051bWJlcl9fR3JvdXBfMV9fMV9fSW1wbCApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMDA1MDoyOiBydWxlX19OdW1iZXJfX0dyb3VwXzFfXzFfX0ltcGwKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIxMzg3OjE6ICggcnVsZV9fTnVtYmVyX19Hcm91cF8xX18xX19JbXBsICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIxMzg4OjI6IHJ1bGVfX051bWJlcl9fR3JvdXBfMV9fMV9fSW1wbAogICAgICAgICAgICAgewogICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMik7CiAgICAgICAgICAgICBydWxlX19OdW1iZXJfX0dyb3VwXzFfXzFfX0ltcGwoKTsKQEAgLTY1ODczLDM1ICs3MDMzMCwzNSBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX051bWJlcl9fR3JvdXBfMV9fMV9fSW1wbCIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMDA1NjoxOiBydWxlX19OdW1iZXJfX0dyb3VwXzFfXzFfX0ltcGwgOiAoICggcnVsZV9fTnVtYmVyX19Hcm91cF8xXzFfXzAgKT8gKSA7CisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjEzOTQ6MTogcnVsZV9fTnVtYmVyX19Hcm91cF8xX18xX19JbXBsIDogKCAoIHJ1bGVfX051bWJlcl9fR3JvdXBfMV8xX18wICk/ICkgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX051bWJlcl9fR3JvdXBfMV9fMV9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMDA2MDoxOiAoICggKCBydWxlX19OdW1iZXJfX0dyb3VwXzFfMV9fMCApPyApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIwMDYxOjE6ICggKCBydWxlX19OdW1iZXJfX0dyb3VwXzFfMV9fMCApPyApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMTM5ODoxOiAoICggKCBydWxlX19OdW1iZXJfX0dyb3VwXzFfMV9fMCApPyApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIxMzk5OjE6ICggKCBydWxlX19OdW1iZXJfX0dyb3VwXzFfMV9fMCApPyApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMDA2MToxOiAoICggcnVsZV9fTnVtYmVyX19Hcm91cF8xXzFfXzAgKT8gKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjAwNjI6MjogKCBydWxlX19OdW1iZXJfX0dyb3VwXzFfMV9fMCApPworICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjEzOTk6MTogKCAoIHJ1bGVfX051bWJlcl9fR3JvdXBfMV8xX18wICk/ICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIxNDAwOjI6ICggcnVsZV9fTnVtYmVyX19Hcm91cF8xXzFfXzAgKT8KICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0TnVtYmVyQWNjZXNzKCkuZ2V0R3JvdXBfMV8xKCkpOyAKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIwMDYzOjI6ICggcnVsZV9fTnVtYmVyX19Hcm91cF8xXzFfXzAgKT8KLSAgICAgICAgICAgIGludCBhbHQxNTY9MjsKLSAgICAgICAgICAgIGludCBMQTE1Nl8wID0gaW5wdXQuTEEoMSk7CisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMTQwMToyOiAoIHJ1bGVfX051bWJlcl9fR3JvdXBfMV8xX18wICk/CisgICAgICAgICAgICBpbnQgYWx0MTY5PTI7CisgICAgICAgICAgICBpbnQgTEExNjlfMCA9IGlucHV0LkxBKDEpOwogCi0gICAgICAgICAgICBpZiAoIChMQTE1Nl8wPT00MykgKSB7Ci0gICAgICAgICAgICAgICAgaW50IExBMTU2XzEgPSBpbnB1dC5MQSgyKTsKKyAgICAgICAgICAgIGlmICggKExBMTY5XzA9PTQzKSApIHsKKyAgICAgICAgICAgICAgICBpbnQgTEExNjlfMSA9IGlucHV0LkxBKDIpOwogCi0gICAgICAgICAgICAgICAgaWYgKCAoKExBMTU2XzE+PVJVTEVfSU5UICYmIExBMTU2XzE8PVJVTEVfREVDSU1BTCkpICkgewotICAgICAgICAgICAgICAgICAgICBhbHQxNTY9MTsKKyAgICAgICAgICAgICAgICBpZiAoICgoTEExNjlfMT49UlVMRV9JTlQgJiYgTEExNjlfMTw9UlVMRV9ERUNJTUFMKSkgKSB7CisgICAgICAgICAgICAgICAgICAgIGFsdDE2OT0xOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHN3aXRjaCAoYWx0MTU2KSB7CisgICAgICAgICAgICBzd2l0Y2ggKGFsdDE2OSkgewogICAgICAgICAgICAgICAgIGNhc2UgMSA6Ci0gICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIwMDYzOjM6IHJ1bGVfX051bWJlcl9fR3JvdXBfMV8xX18wCisgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIxNDAxOjM6IHJ1bGVfX051bWJlcl9fR3JvdXBfMV8xX18wCiAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMik7CiAgICAgICAgICAgICAgICAgICAgIHJ1bGVfX051bWJlcl9fR3JvdXBfMV8xX18wKCk7CkBAIC02NTkzOSwxNiArNzAzOTYsMTYgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19OdW1iZXJfX0dyb3VwXzFfMV9fMCIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMDA3MjoxOiBydWxlX19OdW1iZXJfX0dyb3VwXzFfMV9fMCA6IHJ1bGVfX051bWJlcl9fR3JvdXBfMV8xX18wX19JbXBsIHJ1bGVfX051bWJlcl9fR3JvdXBfMV8xX18xIDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMTQxMDoxOiBydWxlX19OdW1iZXJfX0dyb3VwXzFfMV9fMCA6IHJ1bGVfX051bWJlcl9fR3JvdXBfMV8xX18wX19JbXBsIHJ1bGVfX051bWJlcl9fR3JvdXBfMV8xX18xIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19OdW1iZXJfX0dyb3VwXzFfMV9fMCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMDA3NjoxOiAoIHJ1bGVfX051bWJlcl9fR3JvdXBfMV8xX18wX19JbXBsIHJ1bGVfX051bWJlcl9fR3JvdXBfMV8xX18xICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIwMDc3OjI6IHJ1bGVfX051bWJlcl9fR3JvdXBfMV8xX18wX19JbXBsIHJ1bGVfX051bWJlcl9fR3JvdXBfMV8xX18xCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMTQxNDoxOiAoIHJ1bGVfX051bWJlcl9fR3JvdXBfMV8xX18wX19JbXBsIHJ1bGVfX051bWJlcl9fR3JvdXBfMV8xX18xICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIxNDE1OjI6IHJ1bGVfX051bWJlcl9fR3JvdXBfMV8xX18wX19JbXBsIHJ1bGVfX051bWJlcl9fR3JvdXBfMV8xX18xCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV18xNDkpOworICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMTU3KTsKICAgICAgICAgICAgIHJ1bGVfX051bWJlcl9fR3JvdXBfMV8xX18wX19JbXBsKCk7CiAKICAgICAgICAgICAgIHN0YXRlLl9mc3AtLTsKQEAgLTY1OTc3LDE3ICs3MDQzNCwxNyBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX051bWJlcl9fR3JvdXBfMV8xX18wX19JbXBsIgotICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIwMDg0OjE6IHJ1bGVfX051bWJlcl9fR3JvdXBfMV8xX18wX19JbXBsIDogKCAnLicgKSA7CisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjE0MjI6MTogcnVsZV9fTnVtYmVyX19Hcm91cF8xXzFfXzBfX0ltcGwgOiAoICcuJyApIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19OdW1iZXJfX0dyb3VwXzFfMV9fMF9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMDA4ODoxOiAoICggJy4nICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjAwODk6MTogKCAnLicgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjE0MjY6MTogKCAoICcuJyApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIxNDI3OjE6ICggJy4nICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIwMDg5OjE6ICggJy4nICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIwMDkwOjI6ICcuJworICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjE0Mjc6MTogKCAnLicgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjE0Mjg6MjogJy4nCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldE51bWJlckFjY2VzcygpLmdldEZ1bGxTdG9wS2V5d29yZF8xXzFfMCgpKTsgCkBAIC02NjAxOCwxNCArNzA0NzUsMTQgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19OdW1iZXJfX0dyb3VwXzFfMV9fMSIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMDA5OToxOiBydWxlX19OdW1iZXJfX0dyb3VwXzFfMV9fMSA6IHJ1bGVfX051bWJlcl9fR3JvdXBfMV8xX18xX19JbXBsIDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMTQzNzoxOiBydWxlX19OdW1iZXJfX0dyb3VwXzFfMV9fMSA6IHJ1bGVfX051bWJlcl9fR3JvdXBfMV8xX18xX19JbXBsIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19OdW1iZXJfX0dyb3VwXzFfMV9fMSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMDEwMzoxOiAoIHJ1bGVfX051bWJlcl9fR3JvdXBfMV8xX18xX19JbXBsICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIwMTA0OjI6IHJ1bGVfX051bWJlcl9fR3JvdXBfMV8xX18xX19JbXBsCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMTQ0MToxOiAoIHJ1bGVfX051bWJlcl9fR3JvdXBfMV8xX18xX19JbXBsICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIxNDQyOjI6IHJ1bGVfX051bWJlcl9fR3JvdXBfMV8xX18xX19JbXBsCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV18yKTsKICAgICAgICAgICAgIHJ1bGVfX051bWJlcl9fR3JvdXBfMV8xX18xX19JbXBsKCk7CkBAIC02NjA1MSwyMyArNzA1MDgsMjMgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19OdW1iZXJfX0dyb3VwXzFfMV9fMV9fSW1wbCIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMDExMDoxOiBydWxlX19OdW1iZXJfX0dyb3VwXzFfMV9fMV9fSW1wbCA6ICggKCBydWxlX19OdW1iZXJfX0FsdGVybmF0aXZlc18xXzFfMSApICkgOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIxNDQ4OjE6IHJ1bGVfX051bWJlcl9fR3JvdXBfMV8xX18xX19JbXBsIDogKCAoIHJ1bGVfX051bWJlcl9fQWx0ZXJuYXRpdmVzXzFfMV8xICkgKSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fTnVtYmVyX19Hcm91cF8xXzFfXzFfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjAxMTQ6MTogKCAoICggcnVsZV9fTnVtYmVyX19BbHRlcm5hdGl2ZXNfMV8xXzEgKSApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIwMTE1OjE6ICggKCBydWxlX19OdW1iZXJfX0FsdGVybmF0aXZlc18xXzFfMSApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIxNDUyOjE6ICggKCAoIHJ1bGVfX051bWJlcl9fQWx0ZXJuYXRpdmVzXzFfMV8xICkgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMTQ1MzoxOiAoICggcnVsZV9fTnVtYmVyX19BbHRlcm5hdGl2ZXNfMV8xXzEgKSApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMDExNToxOiAoICggcnVsZV9fTnVtYmVyX19BbHRlcm5hdGl2ZXNfMV8xXzEgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMDExNjoyOiAoIHJ1bGVfX051bWJlcl9fQWx0ZXJuYXRpdmVzXzFfMV8xICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIxNDUzOjE6ICggKCBydWxlX19OdW1iZXJfX0FsdGVybmF0aXZlc18xXzFfMSApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIxNDU0OjI6ICggcnVsZV9fTnVtYmVyX19BbHRlcm5hdGl2ZXNfMV8xXzEgKQogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXROdW1iZXJBY2Nlc3MoKS5nZXRBbHRlcm5hdGl2ZXNfMV8xXzEoKSk7IAogICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjAxMTc6MjogKCBydWxlX19OdW1iZXJfX0FsdGVybmF0aXZlc18xXzFfMSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMDExNzozOiBydWxlX19OdW1iZXJfX0FsdGVybmF0aXZlc18xXzFfMQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjE0NTU6MjogKCBydWxlX19OdW1iZXJfX0FsdGVybmF0aXZlc18xXzFfMSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMTQ1NTozOiBydWxlX19OdW1iZXJfX0FsdGVybmF0aXZlc18xXzFfMQogICAgICAgICAgICAgewogICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMik7CiAgICAgICAgICAgICBydWxlX19OdW1iZXJfX0FsdGVybmF0aXZlc18xXzFfMSgpOwpAQCAtNjYxMDIsMTYgKzcwNTU5LDE2IEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fSnZtVHlwZVJlZmVyZW5jZV9fR3JvdXBfMF9fMCIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMDEyNjoxOiBydWxlX19Kdm1UeXBlUmVmZXJlbmNlX19Hcm91cF8wX18wIDogcnVsZV9fSnZtVHlwZVJlZmVyZW5jZV9fR3JvdXBfMF9fMF9fSW1wbCBydWxlX19Kdm1UeXBlUmVmZXJlbmNlX19Hcm91cF8wX18xIDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMTQ2NDoxOiBydWxlX19Kdm1UeXBlUmVmZXJlbmNlX19Hcm91cF8wX18wIDogcnVsZV9fSnZtVHlwZVJlZmVyZW5jZV9fR3JvdXBfMF9fMF9fSW1wbCBydWxlX19Kdm1UeXBlUmVmZXJlbmNlX19Hcm91cF8wX18xIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19Kdm1UeXBlUmVmZXJlbmNlX19Hcm91cF8wX18wKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIwMTMwOjE6ICggcnVsZV9fSnZtVHlwZVJlZmVyZW5jZV9fR3JvdXBfMF9fMF9fSW1wbCBydWxlX19Kdm1UeXBlUmVmZXJlbmNlX19Hcm91cF8wX18xICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIwMTMxOjI6IHJ1bGVfX0p2bVR5cGVSZWZlcmVuY2VfX0dyb3VwXzBfXzBfX0ltcGwgcnVsZV9fSnZtVHlwZVJlZmVyZW5jZV9fR3JvdXBfMF9fMQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjE0Njg6MTogKCBydWxlX19Kdm1UeXBlUmVmZXJlbmNlX19Hcm91cF8wX18wX19JbXBsIHJ1bGVfX0p2bVR5cGVSZWZlcmVuY2VfX0dyb3VwXzBfXzEgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjE0Njk6MjogcnVsZV9fSnZtVHlwZVJlZmVyZW5jZV9fR3JvdXBfMF9fMF9fSW1wbCBydWxlX19Kdm1UeXBlUmVmZXJlbmNlX19Hcm91cF8wX18xCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV183OCk7CisgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV184Nik7CiAgICAgICAgICAgICBydWxlX19Kdm1UeXBlUmVmZXJlbmNlX19Hcm91cF8wX18wX19JbXBsKCk7CiAKICAgICAgICAgICAgIHN0YXRlLl9mc3AtLTsKQEAgLTY2MTQwLDE3ICs3MDU5NywxNyBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX0p2bVR5cGVSZWZlcmVuY2VfX0dyb3VwXzBfXzBfX0ltcGwiCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjAxMzg6MTogcnVsZV9fSnZtVHlwZVJlZmVyZW5jZV9fR3JvdXBfMF9fMF9fSW1wbCA6ICggcnVsZUp2bVBhcmFtZXRlcml6ZWRUeXBlUmVmZXJlbmNlICkgOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIxNDc2OjE6IHJ1bGVfX0p2bVR5cGVSZWZlcmVuY2VfX0dyb3VwXzBfXzBfX0ltcGwgOiAoIHJ1bGVKdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZSApIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19Kdm1UeXBlUmVmZXJlbmNlX19Hcm91cF8wX18wX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIwMTQyOjE6ICggKCBydWxlSnZtUGFyYW1ldGVyaXplZFR5cGVSZWZlcmVuY2UgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMDE0MzoxOiAoIHJ1bGVKdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMTQ4MDoxOiAoICggcnVsZUp2bVBhcmFtZXRlcml6ZWRUeXBlUmVmZXJlbmNlICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjE0ODE6MTogKCBydWxlSnZtUGFyYW1ldGVyaXplZFR5cGVSZWZlcmVuY2UgKQogICAgICAgICAgICAgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjAxNDM6MTogKCBydWxlSnZtUGFyYW1ldGVyaXplZFR5cGVSZWZlcmVuY2UgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjAxNDQ6MjogcnVsZUp2bVBhcmFtZXRlcml6ZWRUeXBlUmVmZXJlbmNlCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMTQ4MToxOiAoIHJ1bGVKdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMTQ4MjoyOiBydWxlSnZtUGFyYW1ldGVyaXplZFR5cGVSZWZlcmVuY2UKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0SnZtVHlwZVJlZmVyZW5jZUFjY2VzcygpLmdldEp2bVBhcmFtZXRlcml6ZWRUeXBlUmVmZXJlbmNlUGFyc2VyUnVsZUNhbGxfMF8wKCkpOyAKQEAgLTY2MTg1LDE0ICs3MDY0MiwxNCBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX0p2bVR5cGVSZWZlcmVuY2VfX0dyb3VwXzBfXzEiCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjAxNTM6MTogcnVsZV9fSnZtVHlwZVJlZmVyZW5jZV9fR3JvdXBfMF9fMSA6IHJ1bGVfX0p2bVR5cGVSZWZlcmVuY2VfX0dyb3VwXzBfXzFfX0ltcGwgOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIxNDkxOjE6IHJ1bGVfX0p2bVR5cGVSZWZlcmVuY2VfX0dyb3VwXzBfXzEgOiBydWxlX19Kdm1UeXBlUmVmZXJlbmNlX19Hcm91cF8wX18xX19JbXBsIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19Kdm1UeXBlUmVmZXJlbmNlX19Hcm91cF8wX18xKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIwMTU3OjE6ICggcnVsZV9fSnZtVHlwZVJlZmVyZW5jZV9fR3JvdXBfMF9fMV9fSW1wbCApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMDE1ODoyOiBydWxlX19Kdm1UeXBlUmVmZXJlbmNlX19Hcm91cF8wX18xX19JbXBsCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMTQ5NToxOiAoIHJ1bGVfX0p2bVR5cGVSZWZlcmVuY2VfX0dyb3VwXzBfXzFfX0ltcGwgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjE0OTY6MjogcnVsZV9fSnZtVHlwZVJlZmVyZW5jZV9fR3JvdXBfMF9fMV9fSW1wbAogICAgICAgICAgICAgewogICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMik7CiAgICAgICAgICAgICBydWxlX19Kdm1UeXBlUmVmZXJlbmNlX19Hcm91cF8wX18xX19JbXBsKCk7CkBAIC02NjIxOCwzNSArNzA2NzUsMzUgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19Kdm1UeXBlUmVmZXJlbmNlX19Hcm91cF8wX18xX19JbXBsIgotICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIwMTY0OjE6IHJ1bGVfX0p2bVR5cGVSZWZlcmVuY2VfX0dyb3VwXzBfXzFfX0ltcGwgOiAoICggcnVsZV9fSnZtVHlwZVJlZmVyZW5jZV9fR3JvdXBfMF8xX18wICkqICkgOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIxNTAyOjE6IHJ1bGVfX0p2bVR5cGVSZWZlcmVuY2VfX0dyb3VwXzBfXzFfX0ltcGwgOiAoICggcnVsZV9fSnZtVHlwZVJlZmVyZW5jZV9fR3JvdXBfMF8xX18wICkqICkgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX0p2bVR5cGVSZWZlcmVuY2VfX0dyb3VwXzBfXzFfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjAxNjg6MTogKCAoICggcnVsZV9fSnZtVHlwZVJlZmVyZW5jZV9fR3JvdXBfMF8xX18wICkqICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjAxNjk6MTogKCAoIHJ1bGVfX0p2bVR5cGVSZWZlcmVuY2VfX0dyb3VwXzBfMV9fMCApKiApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMTUwNjoxOiAoICggKCBydWxlX19Kdm1UeXBlUmVmZXJlbmNlX19Hcm91cF8wXzFfXzAgKSogKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMTUwNzoxOiAoICggcnVsZV9fSnZtVHlwZVJlZmVyZW5jZV9fR3JvdXBfMF8xX18wICkqICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIwMTY5OjE6ICggKCBydWxlX19Kdm1UeXBlUmVmZXJlbmNlX19Hcm91cF8wXzFfXzAgKSogKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjAxNzA6MjogKCBydWxlX19Kdm1UeXBlUmVmZXJlbmNlX19Hcm91cF8wXzFfXzAgKSoKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIxNTA3OjE6ICggKCBydWxlX19Kdm1UeXBlUmVmZXJlbmNlX19Hcm91cF8wXzFfXzAgKSogKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjE1MDg6MjogKCBydWxlX19Kdm1UeXBlUmVmZXJlbmNlX19Hcm91cF8wXzFfXzAgKSoKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0SnZtVHlwZVJlZmVyZW5jZUFjY2VzcygpLmdldEdyb3VwXzBfMSgpKTsgCiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMDE3MToyOiAoIHJ1bGVfX0p2bVR5cGVSZWZlcmVuY2VfX0dyb3VwXzBfMV9fMCApKgotICAgICAgICAgICAgbG9vcDE1NzoKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIxNTA5OjI6ICggcnVsZV9fSnZtVHlwZVJlZmVyZW5jZV9fR3JvdXBfMF8xX18wICkqCisgICAgICAgICAgICBsb29wMTcwOgogICAgICAgICAgICAgZG8gewotICAgICAgICAgICAgICAgIGludCBhbHQxNTc9MjsKLSAgICAgICAgICAgICAgICBpbnQgTEExNTdfMCA9IGlucHV0LkxBKDEpOworICAgICAgICAgICAgICAgIGludCBhbHQxNzA9MjsKKyAgICAgICAgICAgICAgICBpbnQgTEExNzBfMCA9IGlucHV0LkxBKDEpOwogCi0gICAgICAgICAgICAgICAgaWYgKCAoTEExNTdfMD09MTE4KSApIHsKLSAgICAgICAgICAgICAgICAgICAgaW50IExBMTU3XzIgPSBpbnB1dC5MQSgyKTsKKyAgICAgICAgICAgICAgICBpZiAoIChMQTE3MF8wPT0xMjgpICkgeworICAgICAgICAgICAgICAgICAgICBpbnQgTEExNzBfMiA9IGlucHV0LkxBKDIpOwogCi0gICAgICAgICAgICAgICAgICAgIGlmICggKExBMTU3XzI9PTExNikgKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpbnQgTEExNTdfMyA9IGlucHV0LkxBKDMpOworICAgICAgICAgICAgICAgICAgICBpZiAoIChMQTE3MF8yPT0xMjYpICkgeworICAgICAgICAgICAgICAgICAgICAgICAgaW50IExBMTcwXzMgPSBpbnB1dC5MQSgzKTsKIAotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCAoc3lucHJlZDIxMV9JbnRlcm5hbERhdGFEU0woKSkgKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYWx0MTU3PTE7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIChzeW5wcmVkMjMwX0ludGVybmFsRGF0YURTTCgpKSApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbHQxNzA9MTsKICAgICAgICAgICAgICAgICAgICAgICAgIH0KIAogCkBAIC02NjI1NiwxMSArNzA3MTMsMTEgQEAKICAgICAgICAgICAgICAgICB9CiAKIAotICAgICAgICAgICAgICAgIHN3aXRjaCAoYWx0MTU3KSB7CisgICAgICAgICAgICAgICAgc3dpdGNoIChhbHQxNzApIHsKICAgICAgICAgICAgIAljYXNlIDEgOgotICAgICAgICAgICAgCSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMDE3MTozOiBydWxlX19Kdm1UeXBlUmVmZXJlbmNlX19Hcm91cF8wXzFfXzAKKyAgICAgICAgICAgIAkgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjE1MDk6MzogcnVsZV9fSnZtVHlwZVJlZmVyZW5jZV9fR3JvdXBfMF8xX18wCiAgICAgICAgICAgICAJICAgIHsKLSAgICAgICAgICAgIAkgICAgcHVzaEZvbGxvdyhGT0xMT1dfMTQxKTsKKyAgICAgICAgICAgIAkgICAgcHVzaEZvbGxvdyhGT0xMT1dfMTQ5KTsKICAgICAgICAgICAgIAkgICAgcnVsZV9fSnZtVHlwZVJlZmVyZW5jZV9fR3JvdXBfMF8xX18wKCk7CiAKICAgICAgICAgICAgIAkgICAgc3RhdGUuX2ZzcC0tOwpAQCAtNjYyNzAsNyArNzA3MjcsNyBAQAogICAgICAgICAgICAgCSAgICBicmVhazsKIAogICAgICAgICAgICAgCWRlZmF1bHQgOgotICAgICAgICAgICAgCSAgICBicmVhayBsb29wMTU3OworICAgICAgICAgICAgCSAgICBicmVhayBsb29wMTcwOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0gd2hpbGUgKHRydWUpOwogCkBAIC02NjI5OSwxNCArNzA3NTYsMTQgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19Kdm1UeXBlUmVmZXJlbmNlX19Hcm91cF8wXzFfXzAiCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjAxODA6MTogcnVsZV9fSnZtVHlwZVJlZmVyZW5jZV9fR3JvdXBfMF8xX18wIDogcnVsZV9fSnZtVHlwZVJlZmVyZW5jZV9fR3JvdXBfMF8xX18wX19JbXBsIDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMTUxODoxOiBydWxlX19Kdm1UeXBlUmVmZXJlbmNlX19Hcm91cF8wXzFfXzAgOiBydWxlX19Kdm1UeXBlUmVmZXJlbmNlX19Hcm91cF8wXzFfXzBfX0ltcGwgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX0p2bVR5cGVSZWZlcmVuY2VfX0dyb3VwXzBfMV9fMCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMDE4NDoxOiAoIHJ1bGVfX0p2bVR5cGVSZWZlcmVuY2VfX0dyb3VwXzBfMV9fMF9fSW1wbCApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMDE4NToyOiBydWxlX19Kdm1UeXBlUmVmZXJlbmNlX19Hcm91cF8wXzFfXzBfX0ltcGwKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIxNTIyOjE6ICggcnVsZV9fSnZtVHlwZVJlZmVyZW5jZV9fR3JvdXBfMF8xX18wX19JbXBsICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIxNTIzOjI6IHJ1bGVfX0p2bVR5cGVSZWZlcmVuY2VfX0dyb3VwXzBfMV9fMF9fSW1wbAogICAgICAgICAgICAgewogICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMik7CiAgICAgICAgICAgICBydWxlX19Kdm1UeXBlUmVmZXJlbmNlX19Hcm91cF8wXzFfXzBfX0ltcGwoKTsKQEAgLTY2MzMyLDIzICs3MDc4OSwyMyBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX0p2bVR5cGVSZWZlcmVuY2VfX0dyb3VwXzBfMV9fMF9fSW1wbCIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMDE5MToxOiBydWxlX19Kdm1UeXBlUmVmZXJlbmNlX19Hcm91cF8wXzFfXzBfX0ltcGwgOiAoICggcnVsZV9fSnZtVHlwZVJlZmVyZW5jZV9fR3JvdXBfMF8xXzBfXzAgKSApIDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMTUyOToxOiBydWxlX19Kdm1UeXBlUmVmZXJlbmNlX19Hcm91cF8wXzFfXzBfX0ltcGwgOiAoICggcnVsZV9fSnZtVHlwZVJlZmVyZW5jZV9fR3JvdXBfMF8xXzBfXzAgKSApIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19Kdm1UeXBlUmVmZXJlbmNlX19Hcm91cF8wXzFfXzBfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjAxOTU6MTogKCAoICggcnVsZV9fSnZtVHlwZVJlZmVyZW5jZV9fR3JvdXBfMF8xXzBfXzAgKSApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIwMTk2OjE6ICggKCBydWxlX19Kdm1UeXBlUmVmZXJlbmNlX19Hcm91cF8wXzFfMF9fMCApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIxNTMzOjE6ICggKCAoIHJ1bGVfX0p2bVR5cGVSZWZlcmVuY2VfX0dyb3VwXzBfMV8wX18wICkgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMTUzNDoxOiAoICggcnVsZV9fSnZtVHlwZVJlZmVyZW5jZV9fR3JvdXBfMF8xXzBfXzAgKSApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMDE5NjoxOiAoICggcnVsZV9fSnZtVHlwZVJlZmVyZW5jZV9fR3JvdXBfMF8xXzBfXzAgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMDE5NzoyOiAoIHJ1bGVfX0p2bVR5cGVSZWZlcmVuY2VfX0dyb3VwXzBfMV8wX18wICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIxNTM0OjE6ICggKCBydWxlX19Kdm1UeXBlUmVmZXJlbmNlX19Hcm91cF8wXzFfMF9fMCApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIxNTM1OjI6ICggcnVsZV9fSnZtVHlwZVJlZmVyZW5jZV9fR3JvdXBfMF8xXzBfXzAgKQogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRKdm1UeXBlUmVmZXJlbmNlQWNjZXNzKCkuZ2V0R3JvdXBfMF8xXzAoKSk7IAogICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjAxOTg6MjogKCBydWxlX19Kdm1UeXBlUmVmZXJlbmNlX19Hcm91cF8wXzFfMF9fMCApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMDE5ODozOiBydWxlX19Kdm1UeXBlUmVmZXJlbmNlX19Hcm91cF8wXzFfMF9fMAorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjE1MzY6MjogKCBydWxlX19Kdm1UeXBlUmVmZXJlbmNlX19Hcm91cF8wXzFfMF9fMCApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMTUzNjozOiBydWxlX19Kdm1UeXBlUmVmZXJlbmNlX19Hcm91cF8wXzFfMF9fMAogICAgICAgICAgICAgewogICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMik7CiAgICAgICAgICAgICBydWxlX19Kdm1UeXBlUmVmZXJlbmNlX19Hcm91cF8wXzFfMF9fMCgpOwpAQCAtNjYzODMsMTYgKzcwODQwLDE2IEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fSnZtVHlwZVJlZmVyZW5jZV9fR3JvdXBfMF8xXzBfXzAiCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjAyMDc6MTogcnVsZV9fSnZtVHlwZVJlZmVyZW5jZV9fR3JvdXBfMF8xXzBfXzAgOiBydWxlX19Kdm1UeXBlUmVmZXJlbmNlX19Hcm91cF8wXzFfMF9fMF9fSW1wbCBydWxlX19Kdm1UeXBlUmVmZXJlbmNlX19Hcm91cF8wXzFfMF9fMSA7CisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjE1NDU6MTogcnVsZV9fSnZtVHlwZVJlZmVyZW5jZV9fR3JvdXBfMF8xXzBfXzAgOiBydWxlX19Kdm1UeXBlUmVmZXJlbmNlX19Hcm91cF8wXzFfMF9fMF9fSW1wbCBydWxlX19Kdm1UeXBlUmVmZXJlbmNlX19Hcm91cF8wXzFfMF9fMSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fSnZtVHlwZVJlZmVyZW5jZV9fR3JvdXBfMF8xXzBfXzAoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjAyMTE6MTogKCBydWxlX19Kdm1UeXBlUmVmZXJlbmNlX19Hcm91cF8wXzFfMF9fMF9fSW1wbCBydWxlX19Kdm1UeXBlUmVmZXJlbmNlX19Hcm91cF8wXzFfMF9fMSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMDIxMjoyOiBydWxlX19Kdm1UeXBlUmVmZXJlbmNlX19Hcm91cF8wXzFfMF9fMF9fSW1wbCBydWxlX19Kdm1UeXBlUmVmZXJlbmNlX19Hcm91cF8wXzFfMF9fMQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjE1NDk6MTogKCBydWxlX19Kdm1UeXBlUmVmZXJlbmNlX19Hcm91cF8wXzFfMF9fMF9fSW1wbCBydWxlX19Kdm1UeXBlUmVmZXJlbmNlX19Hcm91cF8wXzFfMF9fMSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMTU1MDoyOiBydWxlX19Kdm1UeXBlUmVmZXJlbmNlX19Hcm91cF8wXzFfMF9fMF9fSW1wbCBydWxlX19Kdm1UeXBlUmVmZXJlbmNlX19Hcm91cF8wXzFfMF9fMQogICAgICAgICAgICAgewotICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfNzgpOworICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfODYpOwogICAgICAgICAgICAgcnVsZV9fSnZtVHlwZVJlZmVyZW5jZV9fR3JvdXBfMF8xXzBfXzBfX0ltcGwoKTsKIAogICAgICAgICAgICAgc3RhdGUuX2ZzcC0tOwpAQCAtNjY0MjEsMjMgKzcwODc4LDIzIEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fSnZtVHlwZVJlZmVyZW5jZV9fR3JvdXBfMF8xXzBfXzBfX0ltcGwiCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjAyMTk6MTogcnVsZV9fSnZtVHlwZVJlZmVyZW5jZV9fR3JvdXBfMF8xXzBfXzBfX0ltcGwgOiAoICgpICkgOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIxNTU3OjE6IHJ1bGVfX0p2bVR5cGVSZWZlcmVuY2VfX0dyb3VwXzBfMV8wX18wX19JbXBsIDogKCAoKSApIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19Kdm1UeXBlUmVmZXJlbmNlX19Hcm91cF8wXzFfMF9fMF9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMDIyMzoxOiAoICggKCkgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMDIyNDoxOiAoICgpICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIxNTYxOjE6ICggKCAoKSApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIxNTYyOjE6ICggKCkgKQogICAgICAgICAgICAgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjAyMjQ6MTogKCAoKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMDIyNToyOiAoKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjE1NjI6MTogKCAoKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMTU2MzoyOiAoKQogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRKdm1UeXBlUmVmZXJlbmNlQWNjZXNzKCkuZ2V0SnZtR2VuZXJpY0FycmF5VHlwZVJlZmVyZW5jZUNvbXBvbmVudFR5cGVBY3Rpb25fMF8xXzBfMCgpKTsgCiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMDIyNjoyOiAoKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjAyMjY6MzogCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMTU2NDoyOiAoKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjE1NjQ6MzogCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICB9CiAKQEAgLTY2NDYyLDE0ICs3MDkxOSwxNCBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX0p2bVR5cGVSZWZlcmVuY2VfX0dyb3VwXzBfMV8wX18xIgotICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIwMjM0OjE6IHJ1bGVfX0p2bVR5cGVSZWZlcmVuY2VfX0dyb3VwXzBfMV8wX18xIDogcnVsZV9fSnZtVHlwZVJlZmVyZW5jZV9fR3JvdXBfMF8xXzBfXzFfX0ltcGwgOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIxNTcyOjE6IHJ1bGVfX0p2bVR5cGVSZWZlcmVuY2VfX0dyb3VwXzBfMV8wX18xIDogcnVsZV9fSnZtVHlwZVJlZmVyZW5jZV9fR3JvdXBfMF8xXzBfXzFfX0ltcGwgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX0p2bVR5cGVSZWZlcmVuY2VfX0dyb3VwXzBfMV8wX18xKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIwMjM4OjE6ICggcnVsZV9fSnZtVHlwZVJlZmVyZW5jZV9fR3JvdXBfMF8xXzBfXzFfX0ltcGwgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjAyMzk6MjogcnVsZV9fSnZtVHlwZVJlZmVyZW5jZV9fR3JvdXBfMF8xXzBfXzFfX0ltcGwKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIxNTc2OjE6ICggcnVsZV9fSnZtVHlwZVJlZmVyZW5jZV9fR3JvdXBfMF8xXzBfXzFfX0ltcGwgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjE1Nzc6MjogcnVsZV9fSnZtVHlwZVJlZmVyZW5jZV9fR3JvdXBfMF8xXzBfXzFfX0ltcGwKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzIpOwogICAgICAgICAgICAgcnVsZV9fSnZtVHlwZVJlZmVyZW5jZV9fR3JvdXBfMF8xXzBfXzFfX0ltcGwoKTsKQEAgLTY2NDk1LDE3ICs3MDk1MiwxNyBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX0p2bVR5cGVSZWZlcmVuY2VfX0dyb3VwXzBfMV8wX18xX19JbXBsIgotICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIwMjQ1OjE6IHJ1bGVfX0p2bVR5cGVSZWZlcmVuY2VfX0dyb3VwXzBfMV8wX18xX19JbXBsIDogKCBydWxlQXJyYXlCcmFja2V0cyApIDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMTU4MzoxOiBydWxlX19Kdm1UeXBlUmVmZXJlbmNlX19Hcm91cF8wXzFfMF9fMV9fSW1wbCA6ICggcnVsZUFycmF5QnJhY2tldHMgKSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fSnZtVHlwZVJlZmVyZW5jZV9fR3JvdXBfMF8xXzBfXzFfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjAyNDk6MTogKCAoIHJ1bGVBcnJheUJyYWNrZXRzICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjAyNTA6MTogKCBydWxlQXJyYXlCcmFja2V0cyApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMTU4NzoxOiAoICggcnVsZUFycmF5QnJhY2tldHMgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMTU4ODoxOiAoIHJ1bGVBcnJheUJyYWNrZXRzICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIwMjUwOjE6ICggcnVsZUFycmF5QnJhY2tldHMgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjAyNTE6MjogcnVsZUFycmF5QnJhY2tldHMKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIxNTg4OjE6ICggcnVsZUFycmF5QnJhY2tldHMgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjE1ODk6MjogcnVsZUFycmF5QnJhY2tldHMKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0SnZtVHlwZVJlZmVyZW5jZUFjY2VzcygpLmdldEFycmF5QnJhY2tldHNQYXJzZXJSdWxlQ2FsbF8wXzFfMF8xKCkpOyAKQEAgLTY2NTQwLDE2ICs3MDk5NywxNiBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX0FycmF5QnJhY2tldHNfX0dyb3VwX18wIgotICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIwMjYxOjE6IHJ1bGVfX0FycmF5QnJhY2tldHNfX0dyb3VwX18wIDogcnVsZV9fQXJyYXlCcmFja2V0c19fR3JvdXBfXzBfX0ltcGwgcnVsZV9fQXJyYXlCcmFja2V0c19fR3JvdXBfXzEgOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIxNTk5OjE6IHJ1bGVfX0FycmF5QnJhY2tldHNfX0dyb3VwX18wIDogcnVsZV9fQXJyYXlCcmFja2V0c19fR3JvdXBfXzBfX0ltcGwgcnVsZV9fQXJyYXlCcmFja2V0c19fR3JvdXBfXzEgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX0FycmF5QnJhY2tldHNfX0dyb3VwX18wKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIwMjY1OjE6ICggcnVsZV9fQXJyYXlCcmFja2V0c19fR3JvdXBfXzBfX0ltcGwgcnVsZV9fQXJyYXlCcmFja2V0c19fR3JvdXBfXzEgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjAyNjY6MjogcnVsZV9fQXJyYXlCcmFja2V0c19fR3JvdXBfXzBfX0ltcGwgcnVsZV9fQXJyYXlCcmFja2V0c19fR3JvdXBfXzEKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIxNjAzOjE6ICggcnVsZV9fQXJyYXlCcmFja2V0c19fR3JvdXBfXzBfX0ltcGwgcnVsZV9fQXJyYXlCcmFja2V0c19fR3JvdXBfXzEgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjE2MDQ6MjogcnVsZV9fQXJyYXlCcmFja2V0c19fR3JvdXBfXzBfX0ltcGwgcnVsZV9fQXJyYXlCcmFja2V0c19fR3JvdXBfXzEKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzExNSk7CisgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV18xMjMpOwogICAgICAgICAgICAgcnVsZV9fQXJyYXlCcmFja2V0c19fR3JvdXBfXzBfX0ltcGwoKTsKIAogICAgICAgICAgICAgc3RhdGUuX2ZzcC0tOwpAQCAtNjY1NzgsMjIgKzcxMDM1LDIyIEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fQXJyYXlCcmFja2V0c19fR3JvdXBfXzBfX0ltcGwiCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjAyNzM6MTogcnVsZV9fQXJyYXlCcmFja2V0c19fR3JvdXBfXzBfX0ltcGwgOiAoICdbJyApIDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMTYxMToxOiBydWxlX19BcnJheUJyYWNrZXRzX19Hcm91cF9fMF9fSW1wbCA6ICggJ1snICkgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX0FycmF5QnJhY2tldHNfX0dyb3VwX18wX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIwMjc3OjE6ICggKCAnWycgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMDI3ODoxOiAoICdbJyApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMTYxNToxOiAoICggJ1snICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjE2MTY6MTogKCAnWycgKQogICAgICAgICAgICAgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjAyNzg6MTogKCAnWycgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjAyNzk6MjogJ1snCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMTYxNjoxOiAoICdbJyApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMTYxNzoyOiAnWycKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0QXJyYXlCcmFja2V0c0FjY2VzcygpLmdldExlZnRTcXVhcmVCcmFja2V0S2V5d29yZF8wKCkpOyAKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1hdGNoKGlucHV0LDExOCxGT0xMT1dfMik7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CisgICAgICAgICAgICBtYXRjaChpbnB1dCwxMjgsRk9MTE9XXzIpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOwogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBhZnRlcihncmFtbWFyQWNjZXNzLmdldEFycmF5QnJhY2tldHNBY2Nlc3MoKS5nZXRMZWZ0U3F1YXJlQnJhY2tldEtleXdvcmRfMCgpKTsgCiAgICAgICAgICAgICB9CkBAIC02NjYxOSwxNCArNzEwNzYsMTQgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19BcnJheUJyYWNrZXRzX19Hcm91cF9fMSIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMDI4ODoxOiBydWxlX19BcnJheUJyYWNrZXRzX19Hcm91cF9fMSA6IHJ1bGVfX0FycmF5QnJhY2tldHNfX0dyb3VwX18xX19JbXBsIDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMTYyNjoxOiBydWxlX19BcnJheUJyYWNrZXRzX19Hcm91cF9fMSA6IHJ1bGVfX0FycmF5QnJhY2tldHNfX0dyb3VwX18xX19JbXBsIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19BcnJheUJyYWNrZXRzX19Hcm91cF9fMSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMDI5MjoxOiAoIHJ1bGVfX0FycmF5QnJhY2tldHNfX0dyb3VwX18xX19JbXBsICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIwMjkzOjI6IHJ1bGVfX0FycmF5QnJhY2tldHNfX0dyb3VwX18xX19JbXBsCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMTYzMDoxOiAoIHJ1bGVfX0FycmF5QnJhY2tldHNfX0dyb3VwX18xX19JbXBsICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIxNjMxOjI6IHJ1bGVfX0FycmF5QnJhY2tldHNfX0dyb3VwX18xX19JbXBsCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV18yKTsKICAgICAgICAgICAgIHJ1bGVfX0FycmF5QnJhY2tldHNfX0dyb3VwX18xX19JbXBsKCk7CkBAIC02NjY1MiwyMiArNzExMDksMjIgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19BcnJheUJyYWNrZXRzX19Hcm91cF9fMV9fSW1wbCIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMDI5OToxOiBydWxlX19BcnJheUJyYWNrZXRzX19Hcm91cF9fMV9fSW1wbCA6ICggJ10nICkgOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIxNjM3OjE6IHJ1bGVfX0FycmF5QnJhY2tldHNfX0dyb3VwX18xX19JbXBsIDogKCAnXScgKSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fQXJyYXlCcmFja2V0c19fR3JvdXBfXzFfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjAzMDM6MTogKCAoICddJyApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIwMzA0OjE6ICggJ10nICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIxNjQxOjE6ICggKCAnXScgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMTY0MjoxOiAoICddJyApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMDMwNDoxOiAoICddJyApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMDMwNToyOiAnXScKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIxNjQyOjE6ICggJ10nICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIxNjQzOjI6ICddJwogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRBcnJheUJyYWNrZXRzQWNjZXNzKCkuZ2V0UmlnaHRTcXVhcmVCcmFja2V0S2V5d29yZF8xKCkpOyAKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1hdGNoKGlucHV0LDExNixGT0xMT1dfMik7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CisgICAgICAgICAgICBtYXRjaChpbnB1dCwxMjYsRk9MTE9XXzIpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOwogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBhZnRlcihncmFtbWFyQWNjZXNzLmdldEFycmF5QnJhY2tldHNBY2Nlc3MoKS5nZXRSaWdodFNxdWFyZUJyYWNrZXRLZXl3b3JkXzEoKSk7IAogICAgICAgICAgICAgfQpAQCAtNjY2OTMsMTYgKzcxMTUwLDE2IEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fWEZ1bmN0aW9uVHlwZVJlZl9fR3JvdXBfXzAiCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjAzMTU6MTogcnVsZV9fWEZ1bmN0aW9uVHlwZVJlZl9fR3JvdXBfXzAgOiBydWxlX19YRnVuY3Rpb25UeXBlUmVmX19Hcm91cF9fMF9fSW1wbCBydWxlX19YRnVuY3Rpb25UeXBlUmVmX19Hcm91cF9fMSA7CisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjE2NTM6MTogcnVsZV9fWEZ1bmN0aW9uVHlwZVJlZl9fR3JvdXBfXzAgOiBydWxlX19YRnVuY3Rpb25UeXBlUmVmX19Hcm91cF9fMF9fSW1wbCBydWxlX19YRnVuY3Rpb25UeXBlUmVmX19Hcm91cF9fMSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fWEZ1bmN0aW9uVHlwZVJlZl9fR3JvdXBfXzAoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjAzMTk6MTogKCBydWxlX19YRnVuY3Rpb25UeXBlUmVmX19Hcm91cF9fMF9fSW1wbCBydWxlX19YRnVuY3Rpb25UeXBlUmVmX19Hcm91cF9fMSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMDMyMDoyOiBydWxlX19YRnVuY3Rpb25UeXBlUmVmX19Hcm91cF9fMF9fSW1wbCBydWxlX19YRnVuY3Rpb25UeXBlUmVmX19Hcm91cF9fMQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjE2NTc6MTogKCBydWxlX19YRnVuY3Rpb25UeXBlUmVmX19Hcm91cF9fMF9fSW1wbCBydWxlX19YRnVuY3Rpb25UeXBlUmVmX19Hcm91cF9fMSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMTY1ODoyOiBydWxlX19YRnVuY3Rpb25UeXBlUmVmX19Hcm91cF9fMF9fSW1wbCBydWxlX19YRnVuY3Rpb25UeXBlUmVmX19Hcm91cF9fMQogICAgICAgICAgICAgewotICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfOTEpOworICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfOTkpOwogICAgICAgICAgICAgcnVsZV9fWEZ1bmN0aW9uVHlwZVJlZl9fR3JvdXBfXzBfX0ltcGwoKTsKIAogICAgICAgICAgICAgc3RhdGUuX2ZzcC0tOwpAQCAtNjY3MzEsMzEgKzcxMTg4LDMxIEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fWEZ1bmN0aW9uVHlwZVJlZl9fR3JvdXBfXzBfX0ltcGwiCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjAzMjc6MTogcnVsZV9fWEZ1bmN0aW9uVHlwZVJlZl9fR3JvdXBfXzBfX0ltcGwgOiAoICggcnVsZV9fWEZ1bmN0aW9uVHlwZVJlZl9fR3JvdXBfMF9fMCApPyApIDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMTY2NToxOiBydWxlX19YRnVuY3Rpb25UeXBlUmVmX19Hcm91cF9fMF9fSW1wbCA6ICggKCBydWxlX19YRnVuY3Rpb25UeXBlUmVmX19Hcm91cF8wX18wICk/ICkgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1hGdW5jdGlvblR5cGVSZWZfX0dyb3VwX18wX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIwMzMxOjE6ICggKCAoIHJ1bGVfX1hGdW5jdGlvblR5cGVSZWZfX0dyb3VwXzBfXzAgKT8gKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMDMzMjoxOiAoICggcnVsZV9fWEZ1bmN0aW9uVHlwZVJlZl9fR3JvdXBfMF9fMCApPyApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMTY2OToxOiAoICggKCBydWxlX19YRnVuY3Rpb25UeXBlUmVmX19Hcm91cF8wX18wICk/ICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjE2NzA6MTogKCAoIHJ1bGVfX1hGdW5jdGlvblR5cGVSZWZfX0dyb3VwXzBfXzAgKT8gKQogICAgICAgICAgICAgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjAzMzI6MTogKCAoIHJ1bGVfX1hGdW5jdGlvblR5cGVSZWZfX0dyb3VwXzBfXzAgKT8gKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjAzMzM6MjogKCBydWxlX19YRnVuY3Rpb25UeXBlUmVmX19Hcm91cF8wX18wICk/CisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMTY3MDoxOiAoICggcnVsZV9fWEZ1bmN0aW9uVHlwZVJlZl9fR3JvdXBfMF9fMCApPyApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMTY3MToyOiAoIHJ1bGVfX1hGdW5jdGlvblR5cGVSZWZfX0dyb3VwXzBfXzAgKT8KICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WEZ1bmN0aW9uVHlwZVJlZkFjY2VzcygpLmdldEdyb3VwXzAoKSk7IAogICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjAzMzQ6MjogKCBydWxlX19YRnVuY3Rpb25UeXBlUmVmX19Hcm91cF8wX18wICk/Ci0gICAgICAgICAgICBpbnQgYWx0MTU4PTI7Ci0gICAgICAgICAgICBpbnQgTEExNThfMCA9IGlucHV0LkxBKDEpOworICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjE2NzI6MjogKCBydWxlX19YRnVuY3Rpb25UeXBlUmVmX19Hcm91cF8wX18wICk/CisgICAgICAgICAgICBpbnQgYWx0MTcxPTI7CisgICAgICAgICAgICBpbnQgTEExNzFfMCA9IGlucHV0LkxBKDEpOwogCi0gICAgICAgICAgICBpZiAoIChMQTE1OF8wPT0xMTMpICkgewotICAgICAgICAgICAgICAgIGFsdDE1OD0xOworICAgICAgICAgICAgaWYgKCAoTEExNzFfMD09MTIzKSApIHsKKyAgICAgICAgICAgICAgICBhbHQxNzE9MTsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHN3aXRjaCAoYWx0MTU4KSB7CisgICAgICAgICAgICBzd2l0Y2ggKGFsdDE3MSkgewogICAgICAgICAgICAgICAgIGNhc2UgMSA6Ci0gICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIwMzM0OjM6IHJ1bGVfX1hGdW5jdGlvblR5cGVSZWZfX0dyb3VwXzBfXzAKKyAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjE2NzI6MzogcnVsZV9fWEZ1bmN0aW9uVHlwZVJlZl9fR3JvdXBfMF9fMAogICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzIpOwogICAgICAgICAgICAgICAgICAgICBydWxlX19YRnVuY3Rpb25UeXBlUmVmX19Hcm91cF8wX18wKCk7CkBAIC02Njc5MywxNiArNzEyNTAsMTYgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YRnVuY3Rpb25UeXBlUmVmX19Hcm91cF9fMSIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMDM0MjoxOiBydWxlX19YRnVuY3Rpb25UeXBlUmVmX19Hcm91cF9fMSA6IHJ1bGVfX1hGdW5jdGlvblR5cGVSZWZfX0dyb3VwX18xX19JbXBsIHJ1bGVfX1hGdW5jdGlvblR5cGVSZWZfX0dyb3VwX18yIDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMTY4MDoxOiBydWxlX19YRnVuY3Rpb25UeXBlUmVmX19Hcm91cF9fMSA6IHJ1bGVfX1hGdW5jdGlvblR5cGVSZWZfX0dyb3VwX18xX19JbXBsIHJ1bGVfX1hGdW5jdGlvblR5cGVSZWZfX0dyb3VwX18yIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YRnVuY3Rpb25UeXBlUmVmX19Hcm91cF9fMSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMDM0NjoxOiAoIHJ1bGVfX1hGdW5jdGlvblR5cGVSZWZfX0dyb3VwX18xX19JbXBsIHJ1bGVfX1hGdW5jdGlvblR5cGVSZWZfX0dyb3VwX18yICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIwMzQ3OjI6IHJ1bGVfX1hGdW5jdGlvblR5cGVSZWZfX0dyb3VwX18xX19JbXBsIHJ1bGVfX1hGdW5jdGlvblR5cGVSZWZfX0dyb3VwX18yCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMTY4NDoxOiAoIHJ1bGVfX1hGdW5jdGlvblR5cGVSZWZfX0dyb3VwX18xX19JbXBsIHJ1bGVfX1hGdW5jdGlvblR5cGVSZWZfX0dyb3VwX18yICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIxNjg1OjI6IHJ1bGVfX1hGdW5jdGlvblR5cGVSZWZfX0dyb3VwX18xX19JbXBsIHJ1bGVfX1hGdW5jdGlvblR5cGVSZWZfX0dyb3VwX18yCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV185MSk7CisgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV185OSk7CiAgICAgICAgICAgICBydWxlX19YRnVuY3Rpb25UeXBlUmVmX19Hcm91cF9fMV9fSW1wbCgpOwogCiAgICAgICAgICAgICBzdGF0ZS5fZnNwLS07CkBAIC02NjgzMSwxNyArNzEyODgsMTcgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YRnVuY3Rpb25UeXBlUmVmX19Hcm91cF9fMV9fSW1wbCIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMDM1NDoxOiBydWxlX19YRnVuY3Rpb25UeXBlUmVmX19Hcm91cF9fMV9fSW1wbCA6ICggJz0+JyApIDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMTY5MjoxOiBydWxlX19YRnVuY3Rpb25UeXBlUmVmX19Hcm91cF9fMV9fSW1wbCA6ICggJz0+JyApIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YRnVuY3Rpb25UeXBlUmVmX19Hcm91cF9fMV9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMDM1ODoxOiAoICggJz0+JyApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIwMzU5OjE6ICggJz0+JyApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMTY5NjoxOiAoICggJz0+JyApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIxNjk3OjE6ICggJz0+JyApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMDM1OToxOiAoICc9PicgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjAzNjA6MjogJz0+JworICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjE2OTc6MTogKCAnPT4nICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIxNjk4OjI6ICc9PicKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WEZ1bmN0aW9uVHlwZVJlZkFjY2VzcygpLmdldEVxdWFsc1NpZ25HcmVhdGVyVGhhblNpZ25LZXl3b3JkXzEoKSk7IApAQCAtNjY4NzIsMTQgKzcxMzI5LDE0IEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fWEZ1bmN0aW9uVHlwZVJlZl9fR3JvdXBfXzIiCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjAzNjk6MTogcnVsZV9fWEZ1bmN0aW9uVHlwZVJlZl9fR3JvdXBfXzIgOiBydWxlX19YRnVuY3Rpb25UeXBlUmVmX19Hcm91cF9fMl9fSW1wbCA7CisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjE3MDc6MTogcnVsZV9fWEZ1bmN0aW9uVHlwZVJlZl9fR3JvdXBfXzIgOiBydWxlX19YRnVuY3Rpb25UeXBlUmVmX19Hcm91cF9fMl9fSW1wbCA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fWEZ1bmN0aW9uVHlwZVJlZl9fR3JvdXBfXzIoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjAzNzM6MTogKCBydWxlX19YRnVuY3Rpb25UeXBlUmVmX19Hcm91cF9fMl9fSW1wbCApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMDM3NDoyOiBydWxlX19YRnVuY3Rpb25UeXBlUmVmX19Hcm91cF9fMl9fSW1wbAorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjE3MTE6MTogKCBydWxlX19YRnVuY3Rpb25UeXBlUmVmX19Hcm91cF9fMl9fSW1wbCApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMTcxMjoyOiBydWxlX19YRnVuY3Rpb25UeXBlUmVmX19Hcm91cF9fMl9fSW1wbAogICAgICAgICAgICAgewogICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMik7CiAgICAgICAgICAgICBydWxlX19YRnVuY3Rpb25UeXBlUmVmX19Hcm91cF9fMl9fSW1wbCgpOwpAQCAtNjY5MDUsMjMgKzcxMzYyLDIzIEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fWEZ1bmN0aW9uVHlwZVJlZl9fR3JvdXBfXzJfX0ltcGwiCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjAzODA6MTogcnVsZV9fWEZ1bmN0aW9uVHlwZVJlZl9fR3JvdXBfXzJfX0ltcGwgOiAoICggcnVsZV9fWEZ1bmN0aW9uVHlwZVJlZl9fUmV0dXJuVHlwZUFzc2lnbm1lbnRfMiApICkgOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIxNzE4OjE6IHJ1bGVfX1hGdW5jdGlvblR5cGVSZWZfX0dyb3VwX18yX19JbXBsIDogKCAoIHJ1bGVfX1hGdW5jdGlvblR5cGVSZWZfX1JldHVyblR5cGVBc3NpZ25tZW50XzIgKSApIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YRnVuY3Rpb25UeXBlUmVmX19Hcm91cF9fMl9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMDM4NDoxOiAoICggKCBydWxlX19YRnVuY3Rpb25UeXBlUmVmX19SZXR1cm5UeXBlQXNzaWdubWVudF8yICkgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMDM4NToxOiAoICggcnVsZV9fWEZ1bmN0aW9uVHlwZVJlZl9fUmV0dXJuVHlwZUFzc2lnbm1lbnRfMiApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIxNzIyOjE6ICggKCAoIHJ1bGVfX1hGdW5jdGlvblR5cGVSZWZfX1JldHVyblR5cGVBc3NpZ25tZW50XzIgKSApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIxNzIzOjE6ICggKCBydWxlX19YRnVuY3Rpb25UeXBlUmVmX19SZXR1cm5UeXBlQXNzaWdubWVudF8yICkgKQogICAgICAgICAgICAgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjAzODU6MTogKCAoIHJ1bGVfX1hGdW5jdGlvblR5cGVSZWZfX1JldHVyblR5cGVBc3NpZ25tZW50XzIgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMDM4NjoyOiAoIHJ1bGVfX1hGdW5jdGlvblR5cGVSZWZfX1JldHVyblR5cGVBc3NpZ25tZW50XzIgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjE3MjM6MTogKCAoIHJ1bGVfX1hGdW5jdGlvblR5cGVSZWZfX1JldHVyblR5cGVBc3NpZ25tZW50XzIgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMTcyNDoyOiAoIHJ1bGVfX1hGdW5jdGlvblR5cGVSZWZfX1JldHVyblR5cGVBc3NpZ25tZW50XzIgKQogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYRnVuY3Rpb25UeXBlUmVmQWNjZXNzKCkuZ2V0UmV0dXJuVHlwZUFzc2lnbm1lbnRfMigpKTsgCiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMDM4NzoyOiAoIHJ1bGVfX1hGdW5jdGlvblR5cGVSZWZfX1JldHVyblR5cGVBc3NpZ25tZW50XzIgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjAzODc6MzogcnVsZV9fWEZ1bmN0aW9uVHlwZVJlZl9fUmV0dXJuVHlwZUFzc2lnbm1lbnRfMgorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjE3MjU6MjogKCBydWxlX19YRnVuY3Rpb25UeXBlUmVmX19SZXR1cm5UeXBlQXNzaWdubWVudF8yICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIxNzI1OjM6IHJ1bGVfX1hGdW5jdGlvblR5cGVSZWZfX1JldHVyblR5cGVBc3NpZ25tZW50XzIKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzIpOwogICAgICAgICAgICAgcnVsZV9fWEZ1bmN0aW9uVHlwZVJlZl9fUmV0dXJuVHlwZUFzc2lnbm1lbnRfMigpOwpAQCAtNjY5NTYsMTYgKzcxNDEzLDE2IEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fWEZ1bmN0aW9uVHlwZVJlZl9fR3JvdXBfMF9fMCIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMDM5NjoxOiBydWxlX19YRnVuY3Rpb25UeXBlUmVmX19Hcm91cF8wX18wIDogcnVsZV9fWEZ1bmN0aW9uVHlwZVJlZl9fR3JvdXBfMF9fMF9fSW1wbCBydWxlX19YRnVuY3Rpb25UeXBlUmVmX19Hcm91cF8wX18xIDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMTczNDoxOiBydWxlX19YRnVuY3Rpb25UeXBlUmVmX19Hcm91cF8wX18wIDogcnVsZV9fWEZ1bmN0aW9uVHlwZVJlZl9fR3JvdXBfMF9fMF9fSW1wbCBydWxlX19YRnVuY3Rpb25UeXBlUmVmX19Hcm91cF8wX18xIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YRnVuY3Rpb25UeXBlUmVmX19Hcm91cF8wX18wKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIwNDAwOjE6ICggcnVsZV9fWEZ1bmN0aW9uVHlwZVJlZl9fR3JvdXBfMF9fMF9fSW1wbCBydWxlX19YRnVuY3Rpb25UeXBlUmVmX19Hcm91cF8wX18xICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIwNDAxOjI6IHJ1bGVfX1hGdW5jdGlvblR5cGVSZWZfX0dyb3VwXzBfXzBfX0ltcGwgcnVsZV9fWEZ1bmN0aW9uVHlwZVJlZl9fR3JvdXBfMF9fMQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjE3Mzg6MTogKCBydWxlX19YRnVuY3Rpb25UeXBlUmVmX19Hcm91cF8wX18wX19JbXBsIHJ1bGVfX1hGdW5jdGlvblR5cGVSZWZfX0dyb3VwXzBfXzEgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjE3Mzk6MjogcnVsZV9fWEZ1bmN0aW9uVHlwZVJlZl9fR3JvdXBfMF9fMF9fSW1wbCBydWxlX19YRnVuY3Rpb25UeXBlUmVmX19Hcm91cF8wX18xCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV18xNTApOworICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMTU4KTsKICAgICAgICAgICAgIHJ1bGVfX1hGdW5jdGlvblR5cGVSZWZfX0dyb3VwXzBfXzBfX0ltcGwoKTsKIAogICAgICAgICAgICAgc3RhdGUuX2ZzcC0tOwpAQCAtNjY5OTQsMjIgKzcxNDUxLDIyIEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fWEZ1bmN0aW9uVHlwZVJlZl9fR3JvdXBfMF9fMF9fSW1wbCIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMDQwODoxOiBydWxlX19YRnVuY3Rpb25UeXBlUmVmX19Hcm91cF8wX18wX19JbXBsIDogKCAnKCcgKSA7CisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjE3NDY6MTogcnVsZV9fWEZ1bmN0aW9uVHlwZVJlZl9fR3JvdXBfMF9fMF9fSW1wbCA6ICggJygnICkgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1hGdW5jdGlvblR5cGVSZWZfX0dyb3VwXzBfXzBfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjA0MTI6MTogKCAoICcoJyApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIwNDEzOjE6ICggJygnICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIxNzUwOjE6ICggKCAnKCcgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMTc1MToxOiAoICcoJyApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMDQxMzoxOiAoICcoJyApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMDQxNDoyOiAnKCcKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIxNzUxOjE6ICggJygnICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIxNzUyOjI6ICcoJwogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYRnVuY3Rpb25UeXBlUmVmQWNjZXNzKCkuZ2V0TGVmdFBhcmVudGhlc2lzS2V5d29yZF8wXzAoKSk7IAogICAgICAgICAgICAgfQotICAgICAgICAgICAgbWF0Y2goaW5wdXQsMTEzLEZPTExPV18yKTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKKyAgICAgICAgICAgIG1hdGNoKGlucHV0LDEyMyxGT0xMT1dfMik7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0WEZ1bmN0aW9uVHlwZVJlZkFjY2VzcygpLmdldExlZnRQYXJlbnRoZXNpc0tleXdvcmRfMF8wKCkpOyAKICAgICAgICAgICAgIH0KQEAgLTY3MDM1LDE2ICs3MTQ5MiwxNiBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX1hGdW5jdGlvblR5cGVSZWZfX0dyb3VwXzBfXzEiCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjA0MjM6MTogcnVsZV9fWEZ1bmN0aW9uVHlwZVJlZl9fR3JvdXBfMF9fMSA6IHJ1bGVfX1hGdW5jdGlvblR5cGVSZWZfX0dyb3VwXzBfXzFfX0ltcGwgcnVsZV9fWEZ1bmN0aW9uVHlwZVJlZl9fR3JvdXBfMF9fMiA7CisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjE3NjE6MTogcnVsZV9fWEZ1bmN0aW9uVHlwZVJlZl9fR3JvdXBfMF9fMSA6IHJ1bGVfX1hGdW5jdGlvblR5cGVSZWZfX0dyb3VwXzBfXzFfX0ltcGwgcnVsZV9fWEZ1bmN0aW9uVHlwZVJlZl9fR3JvdXBfMF9fMiA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fWEZ1bmN0aW9uVHlwZVJlZl9fR3JvdXBfMF9fMSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMDQyNzoxOiAoIHJ1bGVfX1hGdW5jdGlvblR5cGVSZWZfX0dyb3VwXzBfXzFfX0ltcGwgcnVsZV9fWEZ1bmN0aW9uVHlwZVJlZl9fR3JvdXBfMF9fMiApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMDQyODoyOiBydWxlX19YRnVuY3Rpb25UeXBlUmVmX19Hcm91cF8wX18xX19JbXBsIHJ1bGVfX1hGdW5jdGlvblR5cGVSZWZfX0dyb3VwXzBfXzIKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIxNzY1OjE6ICggcnVsZV9fWEZ1bmN0aW9uVHlwZVJlZl9fR3JvdXBfMF9fMV9fSW1wbCBydWxlX19YRnVuY3Rpb25UeXBlUmVmX19Hcm91cF8wX18yICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIxNzY2OjI6IHJ1bGVfX1hGdW5jdGlvblR5cGVSZWZfX0dyb3VwXzBfXzFfX0ltcGwgcnVsZV9fWEZ1bmN0aW9uVHlwZVJlZl9fR3JvdXBfMF9fMgogICAgICAgICAgICAgewotICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMTUwKTsKKyAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzE1OCk7CiAgICAgICAgICAgICBydWxlX19YRnVuY3Rpb25UeXBlUmVmX19Hcm91cF8wX18xX19JbXBsKCk7CiAKICAgICAgICAgICAgIHN0YXRlLl9mc3AtLTsKQEAgLTY3MDczLDMxICs3MTUzMCwzMSBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX1hGdW5jdGlvblR5cGVSZWZfX0dyb3VwXzBfXzFfX0ltcGwiCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjA0MzU6MTogcnVsZV9fWEZ1bmN0aW9uVHlwZVJlZl9fR3JvdXBfMF9fMV9fSW1wbCA6ICggKCBydWxlX19YRnVuY3Rpb25UeXBlUmVmX19Hcm91cF8wXzFfXzAgKT8gKSA7CisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjE3NzM6MTogcnVsZV9fWEZ1bmN0aW9uVHlwZVJlZl9fR3JvdXBfMF9fMV9fSW1wbCA6ICggKCBydWxlX19YRnVuY3Rpb25UeXBlUmVmX19Hcm91cF8wXzFfXzAgKT8gKSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fWEZ1bmN0aW9uVHlwZVJlZl9fR3JvdXBfMF9fMV9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMDQzOToxOiAoICggKCBydWxlX19YRnVuY3Rpb25UeXBlUmVmX19Hcm91cF8wXzFfXzAgKT8gKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMDQ0MDoxOiAoICggcnVsZV9fWEZ1bmN0aW9uVHlwZVJlZl9fR3JvdXBfMF8xX18wICk/ICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIxNzc3OjE6ICggKCAoIHJ1bGVfX1hGdW5jdGlvblR5cGVSZWZfX0dyb3VwXzBfMV9fMCApPyApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIxNzc4OjE6ICggKCBydWxlX19YRnVuY3Rpb25UeXBlUmVmX19Hcm91cF8wXzFfXzAgKT8gKQogICAgICAgICAgICAgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjA0NDA6MTogKCAoIHJ1bGVfX1hGdW5jdGlvblR5cGVSZWZfX0dyb3VwXzBfMV9fMCApPyApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMDQ0MToyOiAoIHJ1bGVfX1hGdW5jdGlvblR5cGVSZWZfX0dyb3VwXzBfMV9fMCApPworICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjE3Nzg6MTogKCAoIHJ1bGVfX1hGdW5jdGlvblR5cGVSZWZfX0dyb3VwXzBfMV9fMCApPyApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMTc3OToyOiAoIHJ1bGVfX1hGdW5jdGlvblR5cGVSZWZfX0dyb3VwXzBfMV9fMCApPwogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYRnVuY3Rpb25UeXBlUmVmQWNjZXNzKCkuZ2V0R3JvdXBfMF8xKCkpOyAKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIwNDQyOjI6ICggcnVsZV9fWEZ1bmN0aW9uVHlwZVJlZl9fR3JvdXBfMF8xX18wICk/Ci0gICAgICAgICAgICBpbnQgYWx0MTU5PTI7Ci0gICAgICAgICAgICBpbnQgTEExNTlfMCA9IGlucHV0LkxBKDEpOworICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjE3ODA6MjogKCBydWxlX19YRnVuY3Rpb25UeXBlUmVmX19Hcm91cF8wXzFfXzAgKT8KKyAgICAgICAgICAgIGludCBhbHQxNzI9MjsKKyAgICAgICAgICAgIGludCBMQTE3Ml8wID0gaW5wdXQuTEEoMSk7CiAKLSAgICAgICAgICAgIGlmICggKExBMTU5XzA9PVJVTEVfSUR8fExBMTU5XzA9PTMxfHxMQTE1OV8wPT0xMTMpICkgewotICAgICAgICAgICAgICAgIGFsdDE1OT0xOworICAgICAgICAgICAgaWYgKCAoTEExNzJfMD09UlVMRV9JRHx8TEExNzJfMD09MzF8fExBMTcyXzA9PTEyMykgKSB7CisgICAgICAgICAgICAgICAgYWx0MTcyPTE7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBzd2l0Y2ggKGFsdDE1OSkgeworICAgICAgICAgICAgc3dpdGNoIChhbHQxNzIpIHsKICAgICAgICAgICAgICAgICBjYXNlIDEgOgotICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMDQ0MjozOiBydWxlX19YRnVuY3Rpb25UeXBlUmVmX19Hcm91cF8wXzFfXzAKKyAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjE3ODA6MzogcnVsZV9fWEZ1bmN0aW9uVHlwZVJlZl9fR3JvdXBfMF8xX18wCiAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMik7CiAgICAgICAgICAgICAgICAgICAgIHJ1bGVfX1hGdW5jdGlvblR5cGVSZWZfX0dyb3VwXzBfMV9fMCgpOwpAQCAtNjcxMzUsMTQgKzcxNTkyLDE0IEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fWEZ1bmN0aW9uVHlwZVJlZl9fR3JvdXBfMF9fMiIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMDQ1MDoxOiBydWxlX19YRnVuY3Rpb25UeXBlUmVmX19Hcm91cF8wX18yIDogcnVsZV9fWEZ1bmN0aW9uVHlwZVJlZl9fR3JvdXBfMF9fMl9fSW1wbCA7CisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjE3ODg6MTogcnVsZV9fWEZ1bmN0aW9uVHlwZVJlZl9fR3JvdXBfMF9fMiA6IHJ1bGVfX1hGdW5jdGlvblR5cGVSZWZfX0dyb3VwXzBfXzJfX0ltcGwgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1hGdW5jdGlvblR5cGVSZWZfX0dyb3VwXzBfXzIoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjA0NTQ6MTogKCBydWxlX19YRnVuY3Rpb25UeXBlUmVmX19Hcm91cF8wX18yX19JbXBsICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIwNDU1OjI6IHJ1bGVfX1hGdW5jdGlvblR5cGVSZWZfX0dyb3VwXzBfXzJfX0ltcGwKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIxNzkyOjE6ICggcnVsZV9fWEZ1bmN0aW9uVHlwZVJlZl9fR3JvdXBfMF9fMl9fSW1wbCApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMTc5MzoyOiBydWxlX19YRnVuY3Rpb25UeXBlUmVmX19Hcm91cF8wX18yX19JbXBsCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV18yKTsKICAgICAgICAgICAgIHJ1bGVfX1hGdW5jdGlvblR5cGVSZWZfX0dyb3VwXzBfXzJfX0ltcGwoKTsKQEAgLTY3MTY4LDIyICs3MTYyNSwyMiBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX1hGdW5jdGlvblR5cGVSZWZfX0dyb3VwXzBfXzJfX0ltcGwiCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjA0NjE6MTogcnVsZV9fWEZ1bmN0aW9uVHlwZVJlZl9fR3JvdXBfMF9fMl9fSW1wbCA6ICggJyknICkgOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIxNzk5OjE6IHJ1bGVfX1hGdW5jdGlvblR5cGVSZWZfX0dyb3VwXzBfXzJfX0ltcGwgOiAoICcpJyApIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YRnVuY3Rpb25UeXBlUmVmX19Hcm91cF8wX18yX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIwNDY1OjE6ICggKCAnKScgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMDQ2NjoxOiAoICcpJyApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMTgwMzoxOiAoICggJyknICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjE4MDQ6MTogKCAnKScgKQogICAgICAgICAgICAgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjA0NjY6MTogKCAnKScgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjA0Njc6MjogJyknCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMTgwNDoxOiAoICcpJyApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMTgwNToyOiAnKScKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WEZ1bmN0aW9uVHlwZVJlZkFjY2VzcygpLmdldFJpZ2h0UGFyZW50aGVzaXNLZXl3b3JkXzBfMigpKTsgCiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBtYXRjaChpbnB1dCwxMTQsRk9MTE9XXzIpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOworICAgICAgICAgICAgbWF0Y2goaW5wdXQsMTI0LEZPTExPV18yKTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRYRnVuY3Rpb25UeXBlUmVmQWNjZXNzKCkuZ2V0UmlnaHRQYXJlbnRoZXNpc0tleXdvcmRfMF8yKCkpOyAKICAgICAgICAgICAgIH0KQEAgLTY3MjA5LDE2ICs3MTY2NiwxNiBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX1hGdW5jdGlvblR5cGVSZWZfX0dyb3VwXzBfMV9fMCIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMDQ3NzoxOiBydWxlX19YRnVuY3Rpb25UeXBlUmVmX19Hcm91cF8wXzFfXzAgOiBydWxlX19YRnVuY3Rpb25UeXBlUmVmX19Hcm91cF8wXzFfXzBfX0ltcGwgcnVsZV9fWEZ1bmN0aW9uVHlwZVJlZl9fR3JvdXBfMF8xX18xIDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMTgxNToxOiBydWxlX19YRnVuY3Rpb25UeXBlUmVmX19Hcm91cF8wXzFfXzAgOiBydWxlX19YRnVuY3Rpb25UeXBlUmVmX19Hcm91cF8wXzFfXzBfX0ltcGwgcnVsZV9fWEZ1bmN0aW9uVHlwZVJlZl9fR3JvdXBfMF8xX18xIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YRnVuY3Rpb25UeXBlUmVmX19Hcm91cF8wXzFfXzAoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjA0ODE6MTogKCBydWxlX19YRnVuY3Rpb25UeXBlUmVmX19Hcm91cF8wXzFfXzBfX0ltcGwgcnVsZV9fWEZ1bmN0aW9uVHlwZVJlZl9fR3JvdXBfMF8xX18xICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIwNDgyOjI6IHJ1bGVfX1hGdW5jdGlvblR5cGVSZWZfX0dyb3VwXzBfMV9fMF9fSW1wbCBydWxlX19YRnVuY3Rpb25UeXBlUmVmX19Hcm91cF8wXzFfXzEKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIxODE5OjE6ICggcnVsZV9fWEZ1bmN0aW9uVHlwZVJlZl9fR3JvdXBfMF8xX18wX19JbXBsIHJ1bGVfX1hGdW5jdGlvblR5cGVSZWZfX0dyb3VwXzBfMV9fMSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMTgyMDoyOiBydWxlX19YRnVuY3Rpb25UeXBlUmVmX19Hcm91cF8wXzFfXzBfX0ltcGwgcnVsZV9fWEZ1bmN0aW9uVHlwZVJlZl9fR3JvdXBfMF8xX18xCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV183Mik7CisgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV184MCk7CiAgICAgICAgICAgICBydWxlX19YRnVuY3Rpb25UeXBlUmVmX19Hcm91cF8wXzFfXzBfX0ltcGwoKTsKIAogICAgICAgICAgICAgc3RhdGUuX2ZzcC0tOwpAQCAtNjcyNDcsMjMgKzcxNzA0LDIzIEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fWEZ1bmN0aW9uVHlwZVJlZl9fR3JvdXBfMF8xX18wX19JbXBsIgotICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIwNDg5OjE6IHJ1bGVfX1hGdW5jdGlvblR5cGVSZWZfX0dyb3VwXzBfMV9fMF9fSW1wbCA6ICggKCBydWxlX19YRnVuY3Rpb25UeXBlUmVmX19QYXJhbVR5cGVzQXNzaWdubWVudF8wXzFfMCApICkgOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIxODI3OjE6IHJ1bGVfX1hGdW5jdGlvblR5cGVSZWZfX0dyb3VwXzBfMV9fMF9fSW1wbCA6ICggKCBydWxlX19YRnVuY3Rpb25UeXBlUmVmX19QYXJhbVR5cGVzQXNzaWdubWVudF8wXzFfMCApICkgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1hGdW5jdGlvblR5cGVSZWZfX0dyb3VwXzBfMV9fMF9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMDQ5MzoxOiAoICggKCBydWxlX19YRnVuY3Rpb25UeXBlUmVmX19QYXJhbVR5cGVzQXNzaWdubWVudF8wXzFfMCApICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjA0OTQ6MTogKCAoIHJ1bGVfX1hGdW5jdGlvblR5cGVSZWZfX1BhcmFtVHlwZXNBc3NpZ25tZW50XzBfMV8wICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjE4MzE6MTogKCAoICggcnVsZV9fWEZ1bmN0aW9uVHlwZVJlZl9fUGFyYW1UeXBlc0Fzc2lnbm1lbnRfMF8xXzAgKSApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIxODMyOjE6ICggKCBydWxlX19YRnVuY3Rpb25UeXBlUmVmX19QYXJhbVR5cGVzQXNzaWdubWVudF8wXzFfMCApICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIwNDk0OjE6ICggKCBydWxlX19YRnVuY3Rpb25UeXBlUmVmX19QYXJhbVR5cGVzQXNzaWdubWVudF8wXzFfMCApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIwNDk1OjI6ICggcnVsZV9fWEZ1bmN0aW9uVHlwZVJlZl9fUGFyYW1UeXBlc0Fzc2lnbm1lbnRfMF8xXzAgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjE4MzI6MTogKCAoIHJ1bGVfX1hGdW5jdGlvblR5cGVSZWZfX1BhcmFtVHlwZXNBc3NpZ25tZW50XzBfMV8wICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjE4MzM6MjogKCBydWxlX19YRnVuY3Rpb25UeXBlUmVmX19QYXJhbVR5cGVzQXNzaWdubWVudF8wXzFfMCApCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhGdW5jdGlvblR5cGVSZWZBY2Nlc3MoKS5nZXRQYXJhbVR5cGVzQXNzaWdubWVudF8wXzFfMCgpKTsgCiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMDQ5NjoyOiAoIHJ1bGVfX1hGdW5jdGlvblR5cGVSZWZfX1BhcmFtVHlwZXNBc3NpZ25tZW50XzBfMV8wICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIwNDk2OjM6IHJ1bGVfX1hGdW5jdGlvblR5cGVSZWZfX1BhcmFtVHlwZXNBc3NpZ25tZW50XzBfMV8wCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMTgzNDoyOiAoIHJ1bGVfX1hGdW5jdGlvblR5cGVSZWZfX1BhcmFtVHlwZXNBc3NpZ25tZW50XzBfMV8wICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIxODM0OjM6IHJ1bGVfX1hGdW5jdGlvblR5cGVSZWZfX1BhcmFtVHlwZXNBc3NpZ25tZW50XzBfMV8wCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV18yKTsKICAgICAgICAgICAgIHJ1bGVfX1hGdW5jdGlvblR5cGVSZWZfX1BhcmFtVHlwZXNBc3NpZ25tZW50XzBfMV8wKCk7CkBAIC02NzI5OCwxNCArNzE3NTUsMTQgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YRnVuY3Rpb25UeXBlUmVmX19Hcm91cF8wXzFfXzEiCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjA1MDQ6MTogcnVsZV9fWEZ1bmN0aW9uVHlwZVJlZl9fR3JvdXBfMF8xX18xIDogcnVsZV9fWEZ1bmN0aW9uVHlwZVJlZl9fR3JvdXBfMF8xX18xX19JbXBsIDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMTg0MjoxOiBydWxlX19YRnVuY3Rpb25UeXBlUmVmX19Hcm91cF8wXzFfXzEgOiBydWxlX19YRnVuY3Rpb25UeXBlUmVmX19Hcm91cF8wXzFfXzFfX0ltcGwgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1hGdW5jdGlvblR5cGVSZWZfX0dyb3VwXzBfMV9fMSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMDUwODoxOiAoIHJ1bGVfX1hGdW5jdGlvblR5cGVSZWZfX0dyb3VwXzBfMV9fMV9fSW1wbCApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMDUwOToyOiBydWxlX19YRnVuY3Rpb25UeXBlUmVmX19Hcm91cF8wXzFfXzFfX0ltcGwKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIxODQ2OjE6ICggcnVsZV9fWEZ1bmN0aW9uVHlwZVJlZl9fR3JvdXBfMF8xX18xX19JbXBsICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIxODQ3OjI6IHJ1bGVfX1hGdW5jdGlvblR5cGVSZWZfX0dyb3VwXzBfMV9fMV9fSW1wbAogICAgICAgICAgICAgewogICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMik7CiAgICAgICAgICAgICBydWxlX19YRnVuY3Rpb25UeXBlUmVmX19Hcm91cF8wXzFfXzFfX0ltcGwoKTsKQEAgLTY3MzMxLDM3ICs3MTc4OCwzNyBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX1hGdW5jdGlvblR5cGVSZWZfX0dyb3VwXzBfMV9fMV9fSW1wbCIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMDUxNToxOiBydWxlX19YRnVuY3Rpb25UeXBlUmVmX19Hcm91cF8wXzFfXzFfX0ltcGwgOiAoICggcnVsZV9fWEZ1bmN0aW9uVHlwZVJlZl9fR3JvdXBfMF8xXzFfXzAgKSogKSA7CisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjE4NTM6MTogcnVsZV9fWEZ1bmN0aW9uVHlwZVJlZl9fR3JvdXBfMF8xX18xX19JbXBsIDogKCAoIHJ1bGVfX1hGdW5jdGlvblR5cGVSZWZfX0dyb3VwXzBfMV8xX18wICkqICkgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1hGdW5jdGlvblR5cGVSZWZfX0dyb3VwXzBfMV9fMV9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMDUxOToxOiAoICggKCBydWxlX19YRnVuY3Rpb25UeXBlUmVmX19Hcm91cF8wXzFfMV9fMCApKiApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIwNTIwOjE6ICggKCBydWxlX19YRnVuY3Rpb25UeXBlUmVmX19Hcm91cF8wXzFfMV9fMCApKiApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMTg1NzoxOiAoICggKCBydWxlX19YRnVuY3Rpb25UeXBlUmVmX19Hcm91cF8wXzFfMV9fMCApKiApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIxODU4OjE6ICggKCBydWxlX19YRnVuY3Rpb25UeXBlUmVmX19Hcm91cF8wXzFfMV9fMCApKiApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMDUyMDoxOiAoICggcnVsZV9fWEZ1bmN0aW9uVHlwZVJlZl9fR3JvdXBfMF8xXzFfXzAgKSogKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjA1MjE6MjogKCBydWxlX19YRnVuY3Rpb25UeXBlUmVmX19Hcm91cF8wXzFfMV9fMCApKgorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjE4NTg6MTogKCAoIHJ1bGVfX1hGdW5jdGlvblR5cGVSZWZfX0dyb3VwXzBfMV8xX18wICkqICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIxODU5OjI6ICggcnVsZV9fWEZ1bmN0aW9uVHlwZVJlZl9fR3JvdXBfMF8xXzFfXzAgKSoKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WEZ1bmN0aW9uVHlwZVJlZkFjY2VzcygpLmdldEdyb3VwXzBfMV8xKCkpOyAKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIwNTIyOjI6ICggcnVsZV9fWEZ1bmN0aW9uVHlwZVJlZl9fR3JvdXBfMF8xXzFfXzAgKSoKLSAgICAgICAgICAgIGxvb3AxNjA6CisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMTg2MDoyOiAoIHJ1bGVfX1hGdW5jdGlvblR5cGVSZWZfX0dyb3VwXzBfMV8xX18wICkqCisgICAgICAgICAgICBsb29wMTczOgogICAgICAgICAgICAgZG8gewotICAgICAgICAgICAgICAgIGludCBhbHQxNjA9MjsKLSAgICAgICAgICAgICAgICBpbnQgTEExNjBfMCA9IGlucHV0LkxBKDEpOworICAgICAgICAgICAgICAgIGludCBhbHQxNzM9MjsKKyAgICAgICAgICAgICAgICBpbnQgTEExNzNfMCA9IGlucHV0LkxBKDEpOwogCi0gICAgICAgICAgICAgICAgaWYgKCAoTEExNjBfMD09MTE1KSApIHsKLSAgICAgICAgICAgICAgICAgICAgYWx0MTYwPTE7CisgICAgICAgICAgICAgICAgaWYgKCAoTEExNzNfMD09MTI1KSApIHsKKyAgICAgICAgICAgICAgICAgICAgYWx0MTczPTE7CiAgICAgICAgICAgICAgICAgfQogCiAKLSAgICAgICAgICAgICAgICBzd2l0Y2ggKGFsdDE2MCkgeworICAgICAgICAgICAgICAgIHN3aXRjaCAoYWx0MTczKSB7CiAgICAgICAgICAgICAJY2FzZSAxIDoKLSAgICAgICAgICAgIAkgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjA1MjI6MzogcnVsZV9fWEZ1bmN0aW9uVHlwZVJlZl9fR3JvdXBfMF8xXzFfXzAKKyAgICAgICAgICAgIAkgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjE4NjA6MzogcnVsZV9fWEZ1bmN0aW9uVHlwZVJlZl9fR3JvdXBfMF8xXzFfXzAKICAgICAgICAgICAgIAkgICAgewotICAgICAgICAgICAgCSAgICBwdXNoRm9sbG93KEZPTExPV183Myk7CisgICAgICAgICAgICAJICAgIHB1c2hGb2xsb3coRk9MTE9XXzgxKTsKICAgICAgICAgICAgIAkgICAgcnVsZV9fWEZ1bmN0aW9uVHlwZVJlZl9fR3JvdXBfMF8xXzFfXzAoKTsKIAogICAgICAgICAgICAgCSAgICBzdGF0ZS5fZnNwLS07CkBAIC02NzM3MSw3ICs3MTgyOCw3IEBACiAgICAgICAgICAgICAJICAgIGJyZWFrOwogCiAgICAgICAgICAgICAJZGVmYXVsdCA6Ci0gICAgICAgICAgICAJICAgIGJyZWFrIGxvb3AxNjA7CisgICAgICAgICAgICAJICAgIGJyZWFrIGxvb3AxNzM7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfSB3aGlsZSAodHJ1ZSk7CiAKQEAgLTY3NDAwLDE2ICs3MTg1NywxNiBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX1hGdW5jdGlvblR5cGVSZWZfX0dyb3VwXzBfMV8xX18wIgotICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIwNTMxOjE6IHJ1bGVfX1hGdW5jdGlvblR5cGVSZWZfX0dyb3VwXzBfMV8xX18wIDogcnVsZV9fWEZ1bmN0aW9uVHlwZVJlZl9fR3JvdXBfMF8xXzFfXzBfX0ltcGwgcnVsZV9fWEZ1bmN0aW9uVHlwZVJlZl9fR3JvdXBfMF8xXzFfXzEgOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIxODY5OjE6IHJ1bGVfX1hGdW5jdGlvblR5cGVSZWZfX0dyb3VwXzBfMV8xX18wIDogcnVsZV9fWEZ1bmN0aW9uVHlwZVJlZl9fR3JvdXBfMF8xXzFfXzBfX0ltcGwgcnVsZV9fWEZ1bmN0aW9uVHlwZVJlZl9fR3JvdXBfMF8xXzFfXzEgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1hGdW5jdGlvblR5cGVSZWZfX0dyb3VwXzBfMV8xX18wKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIwNTM1OjE6ICggcnVsZV9fWEZ1bmN0aW9uVHlwZVJlZl9fR3JvdXBfMF8xXzFfXzBfX0ltcGwgcnVsZV9fWEZ1bmN0aW9uVHlwZVJlZl9fR3JvdXBfMF8xXzFfXzEgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjA1MzY6MjogcnVsZV9fWEZ1bmN0aW9uVHlwZVJlZl9fR3JvdXBfMF8xXzFfXzBfX0ltcGwgcnVsZV9fWEZ1bmN0aW9uVHlwZVJlZl9fR3JvdXBfMF8xXzFfXzEKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIxODczOjE6ICggcnVsZV9fWEZ1bmN0aW9uVHlwZVJlZl9fR3JvdXBfMF8xXzFfXzBfX0ltcGwgcnVsZV9fWEZ1bmN0aW9uVHlwZVJlZl9fR3JvdXBfMF8xXzFfXzEgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjE4NzQ6MjogcnVsZV9fWEZ1bmN0aW9uVHlwZVJlZl9fR3JvdXBfMF8xXzFfXzBfX0ltcGwgcnVsZV9fWEZ1bmN0aW9uVHlwZVJlZl9fR3JvdXBfMF8xXzFfXzEKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzkxKTsKKyAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzk5KTsKICAgICAgICAgICAgIHJ1bGVfX1hGdW5jdGlvblR5cGVSZWZfX0dyb3VwXzBfMV8xX18wX19JbXBsKCk7CiAKICAgICAgICAgICAgIHN0YXRlLl9mc3AtLTsKQEAgLTY3NDM4LDIyICs3MTg5NSwyMiBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX1hGdW5jdGlvblR5cGVSZWZfX0dyb3VwXzBfMV8xX18wX19JbXBsIgotICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIwNTQzOjE6IHJ1bGVfX1hGdW5jdGlvblR5cGVSZWZfX0dyb3VwXzBfMV8xX18wX19JbXBsIDogKCAnLCcgKSA7CisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjE4ODE6MTogcnVsZV9fWEZ1bmN0aW9uVHlwZVJlZl9fR3JvdXBfMF8xXzFfXzBfX0ltcGwgOiAoICcsJyApIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YRnVuY3Rpb25UeXBlUmVmX19Hcm91cF8wXzFfMV9fMF9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMDU0NzoxOiAoICggJywnICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjA1NDg6MTogKCAnLCcgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjE4ODU6MTogKCAoICcsJyApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIxODg2OjE6ICggJywnICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIwNTQ4OjE6ICggJywnICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIwNTQ5OjI6ICcsJworICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjE4ODY6MTogKCAnLCcgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjE4ODc6MjogJywnCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhGdW5jdGlvblR5cGVSZWZBY2Nlc3MoKS5nZXRDb21tYUtleXdvcmRfMF8xXzFfMCgpKTsgCiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBtYXRjaChpbnB1dCwxMTUsRk9MTE9XXzIpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOworICAgICAgICAgICAgbWF0Y2goaW5wdXQsMTI1LEZPTExPV18yKTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRYRnVuY3Rpb25UeXBlUmVmQWNjZXNzKCkuZ2V0Q29tbWFLZXl3b3JkXzBfMV8xXzAoKSk7IAogICAgICAgICAgICAgfQpAQCAtNjc0NzksMTQgKzcxOTM2LDE0IEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fWEZ1bmN0aW9uVHlwZVJlZl9fR3JvdXBfMF8xXzFfXzEiCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjA1NTg6MTogcnVsZV9fWEZ1bmN0aW9uVHlwZVJlZl9fR3JvdXBfMF8xXzFfXzEgOiBydWxlX19YRnVuY3Rpb25UeXBlUmVmX19Hcm91cF8wXzFfMV9fMV9fSW1wbCA7CisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjE4OTY6MTogcnVsZV9fWEZ1bmN0aW9uVHlwZVJlZl9fR3JvdXBfMF8xXzFfXzEgOiBydWxlX19YRnVuY3Rpb25UeXBlUmVmX19Hcm91cF8wXzFfMV9fMV9fSW1wbCA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fWEZ1bmN0aW9uVHlwZVJlZl9fR3JvdXBfMF8xXzFfXzEoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjA1NjI6MTogKCBydWxlX19YRnVuY3Rpb25UeXBlUmVmX19Hcm91cF8wXzFfMV9fMV9fSW1wbCApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMDU2MzoyOiBydWxlX19YRnVuY3Rpb25UeXBlUmVmX19Hcm91cF8wXzFfMV9fMV9fSW1wbAorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjE5MDA6MTogKCBydWxlX19YRnVuY3Rpb25UeXBlUmVmX19Hcm91cF8wXzFfMV9fMV9fSW1wbCApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMTkwMToyOiBydWxlX19YRnVuY3Rpb25UeXBlUmVmX19Hcm91cF8wXzFfMV9fMV9fSW1wbAogICAgICAgICAgICAgewogICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMik7CiAgICAgICAgICAgICBydWxlX19YRnVuY3Rpb25UeXBlUmVmX19Hcm91cF8wXzFfMV9fMV9fSW1wbCgpOwpAQCAtNjc1MTIsMjMgKzcxOTY5LDIzIEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fWEZ1bmN0aW9uVHlwZVJlZl9fR3JvdXBfMF8xXzFfXzFfX0ltcGwiCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjA1Njk6MTogcnVsZV9fWEZ1bmN0aW9uVHlwZVJlZl9fR3JvdXBfMF8xXzFfXzFfX0ltcGwgOiAoICggcnVsZV9fWEZ1bmN0aW9uVHlwZVJlZl9fUGFyYW1UeXBlc0Fzc2lnbm1lbnRfMF8xXzFfMSApICkgOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIxOTA3OjE6IHJ1bGVfX1hGdW5jdGlvblR5cGVSZWZfX0dyb3VwXzBfMV8xX18xX19JbXBsIDogKCAoIHJ1bGVfX1hGdW5jdGlvblR5cGVSZWZfX1BhcmFtVHlwZXNBc3NpZ25tZW50XzBfMV8xXzEgKSApIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YRnVuY3Rpb25UeXBlUmVmX19Hcm91cF8wXzFfMV9fMV9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMDU3MzoxOiAoICggKCBydWxlX19YRnVuY3Rpb25UeXBlUmVmX19QYXJhbVR5cGVzQXNzaWdubWVudF8wXzFfMV8xICkgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMDU3NDoxOiAoICggcnVsZV9fWEZ1bmN0aW9uVHlwZVJlZl9fUGFyYW1UeXBlc0Fzc2lnbm1lbnRfMF8xXzFfMSApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIxOTExOjE6ICggKCAoIHJ1bGVfX1hGdW5jdGlvblR5cGVSZWZfX1BhcmFtVHlwZXNBc3NpZ25tZW50XzBfMV8xXzEgKSApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIxOTEyOjE6ICggKCBydWxlX19YRnVuY3Rpb25UeXBlUmVmX19QYXJhbVR5cGVzQXNzaWdubWVudF8wXzFfMV8xICkgKQogICAgICAgICAgICAgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjA1NzQ6MTogKCAoIHJ1bGVfX1hGdW5jdGlvblR5cGVSZWZfX1BhcmFtVHlwZXNBc3NpZ25tZW50XzBfMV8xXzEgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMDU3NToyOiAoIHJ1bGVfX1hGdW5jdGlvblR5cGVSZWZfX1BhcmFtVHlwZXNBc3NpZ25tZW50XzBfMV8xXzEgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjE5MTI6MTogKCAoIHJ1bGVfX1hGdW5jdGlvblR5cGVSZWZfX1BhcmFtVHlwZXNBc3NpZ25tZW50XzBfMV8xXzEgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMTkxMzoyOiAoIHJ1bGVfX1hGdW5jdGlvblR5cGVSZWZfX1BhcmFtVHlwZXNBc3NpZ25tZW50XzBfMV8xXzEgKQogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYRnVuY3Rpb25UeXBlUmVmQWNjZXNzKCkuZ2V0UGFyYW1UeXBlc0Fzc2lnbm1lbnRfMF8xXzFfMSgpKTsgCiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMDU3NjoyOiAoIHJ1bGVfX1hGdW5jdGlvblR5cGVSZWZfX1BhcmFtVHlwZXNBc3NpZ25tZW50XzBfMV8xXzEgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjA1NzY6MzogcnVsZV9fWEZ1bmN0aW9uVHlwZVJlZl9fUGFyYW1UeXBlc0Fzc2lnbm1lbnRfMF8xXzFfMQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjE5MTQ6MjogKCBydWxlX19YRnVuY3Rpb25UeXBlUmVmX19QYXJhbVR5cGVzQXNzaWdubWVudF8wXzFfMV8xICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIxOTE0OjM6IHJ1bGVfX1hGdW5jdGlvblR5cGVSZWZfX1BhcmFtVHlwZXNBc3NpZ25tZW50XzBfMV8xXzEKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzIpOwogICAgICAgICAgICAgcnVsZV9fWEZ1bmN0aW9uVHlwZVJlZl9fUGFyYW1UeXBlc0Fzc2lnbm1lbnRfMF8xXzFfMSgpOwpAQCAtNjc1NjMsMTYgKzcyMDIwLDE2IEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fSnZtUGFyYW1ldGVyaXplZFR5cGVSZWZlcmVuY2VfX0dyb3VwX18wIgotICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIwNTg1OjE6IHJ1bGVfX0p2bVBhcmFtZXRlcml6ZWRUeXBlUmVmZXJlbmNlX19Hcm91cF9fMCA6IHJ1bGVfX0p2bVBhcmFtZXRlcml6ZWRUeXBlUmVmZXJlbmNlX19Hcm91cF9fMF9fSW1wbCBydWxlX19Kdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZV9fR3JvdXBfXzEgOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIxOTIzOjE6IHJ1bGVfX0p2bVBhcmFtZXRlcml6ZWRUeXBlUmVmZXJlbmNlX19Hcm91cF9fMCA6IHJ1bGVfX0p2bVBhcmFtZXRlcml6ZWRUeXBlUmVmZXJlbmNlX19Hcm91cF9fMF9fSW1wbCBydWxlX19Kdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZV9fR3JvdXBfXzEgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX0p2bVBhcmFtZXRlcml6ZWRUeXBlUmVmZXJlbmNlX19Hcm91cF9fMCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMDU4OToxOiAoIHJ1bGVfX0p2bVBhcmFtZXRlcml6ZWRUeXBlUmVmZXJlbmNlX19Hcm91cF9fMF9fSW1wbCBydWxlX19Kdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZV9fR3JvdXBfXzEgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjA1OTA6MjogcnVsZV9fSnZtUGFyYW1ldGVyaXplZFR5cGVSZWZlcmVuY2VfX0dyb3VwX18wX19JbXBsIHJ1bGVfX0p2bVBhcmFtZXRlcml6ZWRUeXBlUmVmZXJlbmNlX19Hcm91cF9fMQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjE5Mjc6MTogKCBydWxlX19Kdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZV9fR3JvdXBfXzBfX0ltcGwgcnVsZV9fSnZtUGFyYW1ldGVyaXplZFR5cGVSZWZlcmVuY2VfX0dyb3VwX18xICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIxOTI4OjI6IHJ1bGVfX0p2bVBhcmFtZXRlcml6ZWRUeXBlUmVmZXJlbmNlX19Hcm91cF9fMF9fSW1wbCBydWxlX19Kdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZV9fR3JvdXBfXzEKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzgxKTsKKyAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzg5KTsKICAgICAgICAgICAgIHJ1bGVfX0p2bVBhcmFtZXRlcml6ZWRUeXBlUmVmZXJlbmNlX19Hcm91cF9fMF9fSW1wbCgpOwogCiAgICAgICAgICAgICBzdGF0ZS5fZnNwLS07CkBAIC02NzYwMSwyMyArNzIwNTgsMjMgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19Kdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZV9fR3JvdXBfXzBfX0ltcGwiCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjA1OTc6MTogcnVsZV9fSnZtUGFyYW1ldGVyaXplZFR5cGVSZWZlcmVuY2VfX0dyb3VwX18wX19JbXBsIDogKCAoIHJ1bGVfX0p2bVBhcmFtZXRlcml6ZWRUeXBlUmVmZXJlbmNlX19UeXBlQXNzaWdubWVudF8wICkgKSA7CisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjE5MzU6MTogcnVsZV9fSnZtUGFyYW1ldGVyaXplZFR5cGVSZWZlcmVuY2VfX0dyb3VwX18wX19JbXBsIDogKCAoIHJ1bGVfX0p2bVBhcmFtZXRlcml6ZWRUeXBlUmVmZXJlbmNlX19UeXBlQXNzaWdubWVudF8wICkgKSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fSnZtUGFyYW1ldGVyaXplZFR5cGVSZWZlcmVuY2VfX0dyb3VwX18wX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIwNjAxOjE6ICggKCAoIHJ1bGVfX0p2bVBhcmFtZXRlcml6ZWRUeXBlUmVmZXJlbmNlX19UeXBlQXNzaWdubWVudF8wICkgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMDYwMjoxOiAoICggcnVsZV9fSnZtUGFyYW1ldGVyaXplZFR5cGVSZWZlcmVuY2VfX1R5cGVBc3NpZ25tZW50XzAgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMTkzOToxOiAoICggKCBydWxlX19Kdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZV9fVHlwZUFzc2lnbm1lbnRfMCApICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjE5NDA6MTogKCAoIHJ1bGVfX0p2bVBhcmFtZXRlcml6ZWRUeXBlUmVmZXJlbmNlX19UeXBlQXNzaWdubWVudF8wICkgKQogICAgICAgICAgICAgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjA2MDI6MTogKCAoIHJ1bGVfX0p2bVBhcmFtZXRlcml6ZWRUeXBlUmVmZXJlbmNlX19UeXBlQXNzaWdubWVudF8wICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjA2MDM6MjogKCBydWxlX19Kdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZV9fVHlwZUFzc2lnbm1lbnRfMCApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMTk0MDoxOiAoICggcnVsZV9fSnZtUGFyYW1ldGVyaXplZFR5cGVSZWZlcmVuY2VfX1R5cGVBc3NpZ25tZW50XzAgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMTk0MToyOiAoIHJ1bGVfX0p2bVBhcmFtZXRlcml6ZWRUeXBlUmVmZXJlbmNlX19UeXBlQXNzaWdubWVudF8wICkKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0SnZtUGFyYW1ldGVyaXplZFR5cGVSZWZlcmVuY2VBY2Nlc3MoKS5nZXRUeXBlQXNzaWdubWVudF8wKCkpOyAKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIwNjA0OjI6ICggcnVsZV9fSnZtUGFyYW1ldGVyaXplZFR5cGVSZWZlcmVuY2VfX1R5cGVBc3NpZ25tZW50XzAgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjA2MDQ6MzogcnVsZV9fSnZtUGFyYW1ldGVyaXplZFR5cGVSZWZlcmVuY2VfX1R5cGVBc3NpZ25tZW50XzAKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIxOTQyOjI6ICggcnVsZV9fSnZtUGFyYW1ldGVyaXplZFR5cGVSZWZlcmVuY2VfX1R5cGVBc3NpZ25tZW50XzAgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjE5NDI6MzogcnVsZV9fSnZtUGFyYW1ldGVyaXplZFR5cGVSZWZlcmVuY2VfX1R5cGVBc3NpZ25tZW50XzAKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzIpOwogICAgICAgICAgICAgcnVsZV9fSnZtUGFyYW1ldGVyaXplZFR5cGVSZWZlcmVuY2VfX1R5cGVBc3NpZ25tZW50XzAoKTsKQEAgLTY3NjUyLDE0ICs3MjEwOSwxNCBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX0p2bVBhcmFtZXRlcml6ZWRUeXBlUmVmZXJlbmNlX19Hcm91cF9fMSIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMDYxMjoxOiBydWxlX19Kdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZV9fR3JvdXBfXzEgOiBydWxlX19Kdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZV9fR3JvdXBfXzFfX0ltcGwgOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIxOTUwOjE6IHJ1bGVfX0p2bVBhcmFtZXRlcml6ZWRUeXBlUmVmZXJlbmNlX19Hcm91cF9fMSA6IHJ1bGVfX0p2bVBhcmFtZXRlcml6ZWRUeXBlUmVmZXJlbmNlX19Hcm91cF9fMV9fSW1wbCA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fSnZtUGFyYW1ldGVyaXplZFR5cGVSZWZlcmVuY2VfX0dyb3VwX18xKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIwNjE2OjE6ICggcnVsZV9fSnZtUGFyYW1ldGVyaXplZFR5cGVSZWZlcmVuY2VfX0dyb3VwX18xX19JbXBsICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIwNjE3OjI6IHJ1bGVfX0p2bVBhcmFtZXRlcml6ZWRUeXBlUmVmZXJlbmNlX19Hcm91cF9fMV9fSW1wbAorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjE5NTQ6MTogKCBydWxlX19Kdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZV9fR3JvdXBfXzFfX0ltcGwgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjE5NTU6MjogcnVsZV9fSnZtUGFyYW1ldGVyaXplZFR5cGVSZWZlcmVuY2VfX0dyb3VwX18xX19JbXBsCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV18yKTsKICAgICAgICAgICAgIHJ1bGVfX0p2bVBhcmFtZXRlcml6ZWRUeXBlUmVmZXJlbmNlX19Hcm91cF9fMV9fSW1wbCgpOwpAQCAtNjc2ODUsMjcgKzcyMTQyLDI3IEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fSnZtUGFyYW1ldGVyaXplZFR5cGVSZWZlcmVuY2VfX0dyb3VwX18xX19JbXBsIgotICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIwNjIzOjE6IHJ1bGVfX0p2bVBhcmFtZXRlcml6ZWRUeXBlUmVmZXJlbmNlX19Hcm91cF9fMV9fSW1wbCA6ICggKCBydWxlX19Kdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZV9fR3JvdXBfMV9fMCApPyApIDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMTk2MToxOiBydWxlX19Kdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZV9fR3JvdXBfXzFfX0ltcGwgOiAoICggcnVsZV9fSnZtUGFyYW1ldGVyaXplZFR5cGVSZWZlcmVuY2VfX0dyb3VwXzFfXzAgKT8gKSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fSnZtUGFyYW1ldGVyaXplZFR5cGVSZWZlcmVuY2VfX0dyb3VwX18xX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIwNjI3OjE6ICggKCAoIHJ1bGVfX0p2bVBhcmFtZXRlcml6ZWRUeXBlUmVmZXJlbmNlX19Hcm91cF8xX18wICk/ICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjA2Mjg6MTogKCAoIHJ1bGVfX0p2bVBhcmFtZXRlcml6ZWRUeXBlUmVmZXJlbmNlX19Hcm91cF8xX18wICk/ICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIxOTY1OjE6ICggKCAoIHJ1bGVfX0p2bVBhcmFtZXRlcml6ZWRUeXBlUmVmZXJlbmNlX19Hcm91cF8xX18wICk/ICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjE5NjY6MTogKCAoIHJ1bGVfX0p2bVBhcmFtZXRlcml6ZWRUeXBlUmVmZXJlbmNlX19Hcm91cF8xX18wICk/ICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIwNjI4OjE6ICggKCBydWxlX19Kdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZV9fR3JvdXBfMV9fMCApPyApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMDYyOToyOiAoIHJ1bGVfX0p2bVBhcmFtZXRlcml6ZWRUeXBlUmVmZXJlbmNlX19Hcm91cF8xX18wICk/CisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMTk2NjoxOiAoICggcnVsZV9fSnZtUGFyYW1ldGVyaXplZFR5cGVSZWZlcmVuY2VfX0dyb3VwXzFfXzAgKT8gKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjE5Njc6MjogKCBydWxlX19Kdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZV9fR3JvdXBfMV9fMCApPwogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRKdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZUFjY2VzcygpLmdldEdyb3VwXzEoKSk7IAogICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjA2MzA6MjogKCBydWxlX19Kdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZV9fR3JvdXBfMV9fMCApPwotICAgICAgICAgICAgaW50IGFsdDE2MT0yOwotICAgICAgICAgICAgYWx0MTYxID0gZGZhMTYxLnByZWRpY3QoaW5wdXQpOwotICAgICAgICAgICAgc3dpdGNoIChhbHQxNjEpIHsKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIxOTY4OjI6ICggcnVsZV9fSnZtUGFyYW1ldGVyaXplZFR5cGVSZWZlcmVuY2VfX0dyb3VwXzFfXzAgKT8KKyAgICAgICAgICAgIGludCBhbHQxNzQ9MjsKKyAgICAgICAgICAgIGFsdDE3NCA9IGRmYTE3NC5wcmVkaWN0KGlucHV0KTsKKyAgICAgICAgICAgIHN3aXRjaCAoYWx0MTc0KSB7CiAgICAgICAgICAgICAgICAgY2FzZSAxIDoKLSAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjA2MzA6MzogcnVsZV9fSnZtUGFyYW1ldGVyaXplZFR5cGVSZWZlcmVuY2VfX0dyb3VwXzFfXzAKKyAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjE5Njg6MzogcnVsZV9fSnZtUGFyYW1ldGVyaXplZFR5cGVSZWZlcmVuY2VfX0dyb3VwXzFfXzAKICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV18yKTsKICAgICAgICAgICAgICAgICAgICAgcnVsZV9fSnZtUGFyYW1ldGVyaXplZFR5cGVSZWZlcmVuY2VfX0dyb3VwXzFfXzAoKTsKQEAgLTY3NzQzLDE2ICs3MjIwMCwxNiBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX0p2bVBhcmFtZXRlcml6ZWRUeXBlUmVmZXJlbmNlX19Hcm91cF8xX18wIgotICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIwNjM5OjE6IHJ1bGVfX0p2bVBhcmFtZXRlcml6ZWRUeXBlUmVmZXJlbmNlX19Hcm91cF8xX18wIDogcnVsZV9fSnZtUGFyYW1ldGVyaXplZFR5cGVSZWZlcmVuY2VfX0dyb3VwXzFfXzBfX0ltcGwgcnVsZV9fSnZtUGFyYW1ldGVyaXplZFR5cGVSZWZlcmVuY2VfX0dyb3VwXzFfXzEgOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIxOTc3OjE6IHJ1bGVfX0p2bVBhcmFtZXRlcml6ZWRUeXBlUmVmZXJlbmNlX19Hcm91cF8xX18wIDogcnVsZV9fSnZtUGFyYW1ldGVyaXplZFR5cGVSZWZlcmVuY2VfX0dyb3VwXzFfXzBfX0ltcGwgcnVsZV9fSnZtUGFyYW1ldGVyaXplZFR5cGVSZWZlcmVuY2VfX0dyb3VwXzFfXzEgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX0p2bVBhcmFtZXRlcml6ZWRUeXBlUmVmZXJlbmNlX19Hcm91cF8xX18wKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIwNjQzOjE6ICggcnVsZV9fSnZtUGFyYW1ldGVyaXplZFR5cGVSZWZlcmVuY2VfX0dyb3VwXzFfXzBfX0ltcGwgcnVsZV9fSnZtUGFyYW1ldGVyaXplZFR5cGVSZWZlcmVuY2VfX0dyb3VwXzFfXzEgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjA2NDQ6MjogcnVsZV9fSnZtUGFyYW1ldGVyaXplZFR5cGVSZWZlcmVuY2VfX0dyb3VwXzFfXzBfX0ltcGwgcnVsZV9fSnZtUGFyYW1ldGVyaXplZFR5cGVSZWZlcmVuY2VfX0dyb3VwXzFfXzEKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIxOTgxOjE6ICggcnVsZV9fSnZtUGFyYW1ldGVyaXplZFR5cGVSZWZlcmVuY2VfX0dyb3VwXzFfXzBfX0ltcGwgcnVsZV9fSnZtUGFyYW1ldGVyaXplZFR5cGVSZWZlcmVuY2VfX0dyb3VwXzFfXzEgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjE5ODI6MjogcnVsZV9fSnZtUGFyYW1ldGVyaXplZFR5cGVSZWZlcmVuY2VfX0dyb3VwXzFfXzBfX0ltcGwgcnVsZV9fSnZtUGFyYW1ldGVyaXplZFR5cGVSZWZlcmVuY2VfX0dyb3VwXzFfXzEKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzExMCk7CisgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV18xMTgpOwogICAgICAgICAgICAgcnVsZV9fSnZtUGFyYW1ldGVyaXplZFR5cGVSZWZlcmVuY2VfX0dyb3VwXzFfXzBfX0ltcGwoKTsKIAogICAgICAgICAgICAgc3RhdGUuX2ZzcC0tOwpAQCAtNjc3ODEsMjMgKzcyMjM4LDIzIEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fSnZtUGFyYW1ldGVyaXplZFR5cGVSZWZlcmVuY2VfX0dyb3VwXzFfXzBfX0ltcGwiCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjA2NTE6MTogcnVsZV9fSnZtUGFyYW1ldGVyaXplZFR5cGVSZWZlcmVuY2VfX0dyb3VwXzFfXzBfX0ltcGwgOiAoICggJzwnICkgKSA7CisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjE5ODk6MTogcnVsZV9fSnZtUGFyYW1ldGVyaXplZFR5cGVSZWZlcmVuY2VfX0dyb3VwXzFfXzBfX0ltcGwgOiAoICggJzwnICkgKSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fSnZtUGFyYW1ldGVyaXplZFR5cGVSZWZlcmVuY2VfX0dyb3VwXzFfXzBfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjA2NTU6MTogKCAoICggJzwnICkgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMDY1NjoxOiAoICggJzwnICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjE5OTM6MTogKCAoICggJzwnICkgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMTk5NDoxOiAoICggJzwnICkgKQogICAgICAgICAgICAgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjA2NTY6MTogKCAoICc8JyApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIwNjU3OjI6ICggJzwnICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIxOTk0OjE6ICggKCAnPCcgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMTk5NToyOiAoICc8JyApCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldEp2bVBhcmFtZXRlcml6ZWRUeXBlUmVmZXJlbmNlQWNjZXNzKCkuZ2V0TGVzc1RoYW5TaWduS2V5d29yZF8xXzAoKSk7IAogICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjA2NTg6MjogKCAnPCcgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjA2NTg6MzogJzwnCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMTk5NjoyOiAoICc8JyApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMTk5NjozOiAnPCcKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIG1hdGNoKGlucHV0LDI3LEZPTExPV18yKTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKIApAQCAtNjc4MjgsMTYgKzcyMjg1LDE2IEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fSnZtUGFyYW1ldGVyaXplZFR5cGVSZWZlcmVuY2VfX0dyb3VwXzFfXzEiCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjA2NjY6MTogcnVsZV9fSnZtUGFyYW1ldGVyaXplZFR5cGVSZWZlcmVuY2VfX0dyb3VwXzFfXzEgOiBydWxlX19Kdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZV9fR3JvdXBfMV9fMV9fSW1wbCBydWxlX19Kdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZV9fR3JvdXBfMV9fMiA7CisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjIwMDQ6MTogcnVsZV9fSnZtUGFyYW1ldGVyaXplZFR5cGVSZWZlcmVuY2VfX0dyb3VwXzFfXzEgOiBydWxlX19Kdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZV9fR3JvdXBfMV9fMV9fSW1wbCBydWxlX19Kdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZV9fR3JvdXBfMV9fMiA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fSnZtUGFyYW1ldGVyaXplZFR5cGVSZWZlcmVuY2VfX0dyb3VwXzFfXzEoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjA2NzA6MTogKCBydWxlX19Kdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZV9fR3JvdXBfMV9fMV9fSW1wbCBydWxlX19Kdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZV9fR3JvdXBfMV9fMiApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMDY3MToyOiBydWxlX19Kdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZV9fR3JvdXBfMV9fMV9fSW1wbCBydWxlX19Kdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZV9fR3JvdXBfMV9fMgorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjIwMDg6MTogKCBydWxlX19Kdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZV9fR3JvdXBfMV9fMV9fSW1wbCBydWxlX19Kdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZV9fR3JvdXBfMV9fMiApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMjAwOToyOiBydWxlX19Kdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZV9fR3JvdXBfMV9fMV9fSW1wbCBydWxlX19Kdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZV9fR3JvdXBfMV9fMgogICAgICAgICAgICAgewotICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMTExKTsKKyAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzExOSk7CiAgICAgICAgICAgICBydWxlX19Kdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZV9fR3JvdXBfMV9fMV9fSW1wbCgpOwogCiAgICAgICAgICAgICBzdGF0ZS5fZnNwLS07CkBAIC02Nzg2NiwyMyArNzIzMjMsMjMgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19Kdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZV9fR3JvdXBfMV9fMV9fSW1wbCIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMDY3ODoxOiBydWxlX19Kdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZV9fR3JvdXBfMV9fMV9fSW1wbCA6ICggKCBydWxlX19Kdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZV9fQXJndW1lbnRzQXNzaWdubWVudF8xXzEgKSApIDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMjAxNjoxOiBydWxlX19Kdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZV9fR3JvdXBfMV9fMV9fSW1wbCA6ICggKCBydWxlX19Kdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZV9fQXJndW1lbnRzQXNzaWdubWVudF8xXzEgKSApIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19Kdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZV9fR3JvdXBfMV9fMV9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMDY4MjoxOiAoICggKCBydWxlX19Kdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZV9fQXJndW1lbnRzQXNzaWdubWVudF8xXzEgKSApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIwNjgzOjE6ICggKCBydWxlX19Kdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZV9fQXJndW1lbnRzQXNzaWdubWVudF8xXzEgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMjAyMDoxOiAoICggKCBydWxlX19Kdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZV9fQXJndW1lbnRzQXNzaWdubWVudF8xXzEgKSApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIyMDIxOjE6ICggKCBydWxlX19Kdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZV9fQXJndW1lbnRzQXNzaWdubWVudF8xXzEgKSApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMDY4MzoxOiAoICggcnVsZV9fSnZtUGFyYW1ldGVyaXplZFR5cGVSZWZlcmVuY2VfX0FyZ3VtZW50c0Fzc2lnbm1lbnRfMV8xICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjA2ODQ6MjogKCBydWxlX19Kdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZV9fQXJndW1lbnRzQXNzaWdubWVudF8xXzEgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjIwMjE6MTogKCAoIHJ1bGVfX0p2bVBhcmFtZXRlcml6ZWRUeXBlUmVmZXJlbmNlX19Bcmd1bWVudHNBc3NpZ25tZW50XzFfMSApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIyMDIyOjI6ICggcnVsZV9fSnZtUGFyYW1ldGVyaXplZFR5cGVSZWZlcmVuY2VfX0FyZ3VtZW50c0Fzc2lnbm1lbnRfMV8xICkKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0SnZtUGFyYW1ldGVyaXplZFR5cGVSZWZlcmVuY2VBY2Nlc3MoKS5nZXRBcmd1bWVudHNBc3NpZ25tZW50XzFfMSgpKTsgCiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMDY4NToyOiAoIHJ1bGVfX0p2bVBhcmFtZXRlcml6ZWRUeXBlUmVmZXJlbmNlX19Bcmd1bWVudHNBc3NpZ25tZW50XzFfMSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMDY4NTozOiBydWxlX19Kdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZV9fQXJndW1lbnRzQXNzaWdubWVudF8xXzEKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIyMDIzOjI6ICggcnVsZV9fSnZtUGFyYW1ldGVyaXplZFR5cGVSZWZlcmVuY2VfX0FyZ3VtZW50c0Fzc2lnbm1lbnRfMV8xICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIyMDIzOjM6IHJ1bGVfX0p2bVBhcmFtZXRlcml6ZWRUeXBlUmVmZXJlbmNlX19Bcmd1bWVudHNBc3NpZ25tZW50XzFfMQogICAgICAgICAgICAgewogICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMik7CiAgICAgICAgICAgICBydWxlX19Kdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZV9fQXJndW1lbnRzQXNzaWdubWVudF8xXzEoKTsKQEAgLTY3OTE3LDE2ICs3MjM3NCwxNiBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX0p2bVBhcmFtZXRlcml6ZWRUeXBlUmVmZXJlbmNlX19Hcm91cF8xX18yIgotICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIwNjkzOjE6IHJ1bGVfX0p2bVBhcmFtZXRlcml6ZWRUeXBlUmVmZXJlbmNlX19Hcm91cF8xX18yIDogcnVsZV9fSnZtUGFyYW1ldGVyaXplZFR5cGVSZWZlcmVuY2VfX0dyb3VwXzFfXzJfX0ltcGwgcnVsZV9fSnZtUGFyYW1ldGVyaXplZFR5cGVSZWZlcmVuY2VfX0dyb3VwXzFfXzMgOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIyMDMxOjE6IHJ1bGVfX0p2bVBhcmFtZXRlcml6ZWRUeXBlUmVmZXJlbmNlX19Hcm91cF8xX18yIDogcnVsZV9fSnZtUGFyYW1ldGVyaXplZFR5cGVSZWZlcmVuY2VfX0dyb3VwXzFfXzJfX0ltcGwgcnVsZV9fSnZtUGFyYW1ldGVyaXplZFR5cGVSZWZlcmVuY2VfX0dyb3VwXzFfXzMgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX0p2bVBhcmFtZXRlcml6ZWRUeXBlUmVmZXJlbmNlX19Hcm91cF8xX18yKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIwNjk3OjE6ICggcnVsZV9fSnZtUGFyYW1ldGVyaXplZFR5cGVSZWZlcmVuY2VfX0dyb3VwXzFfXzJfX0ltcGwgcnVsZV9fSnZtUGFyYW1ldGVyaXplZFR5cGVSZWZlcmVuY2VfX0dyb3VwXzFfXzMgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjA2OTg6MjogcnVsZV9fSnZtUGFyYW1ldGVyaXplZFR5cGVSZWZlcmVuY2VfX0dyb3VwXzFfXzJfX0ltcGwgcnVsZV9fSnZtUGFyYW1ldGVyaXplZFR5cGVSZWZlcmVuY2VfX0dyb3VwXzFfXzMKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIyMDM1OjE6ICggcnVsZV9fSnZtUGFyYW1ldGVyaXplZFR5cGVSZWZlcmVuY2VfX0dyb3VwXzFfXzJfX0ltcGwgcnVsZV9fSnZtUGFyYW1ldGVyaXplZFR5cGVSZWZlcmVuY2VfX0dyb3VwXzFfXzMgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjIwMzY6MjogcnVsZV9fSnZtUGFyYW1ldGVyaXplZFR5cGVSZWZlcmVuY2VfX0dyb3VwXzFfXzJfX0ltcGwgcnVsZV9fSnZtUGFyYW1ldGVyaXplZFR5cGVSZWZlcmVuY2VfX0dyb3VwXzFfXzMKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzExMSk7CisgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV18xMTkpOwogICAgICAgICAgICAgcnVsZV9fSnZtUGFyYW1ldGVyaXplZFR5cGVSZWZlcmVuY2VfX0dyb3VwXzFfXzJfX0ltcGwoKTsKIAogICAgICAgICAgICAgc3RhdGUuX2ZzcC0tOwpAQCAtNjc5NTUsMzcgKzcyNDEyLDM3IEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fSnZtUGFyYW1ldGVyaXplZFR5cGVSZWZlcmVuY2VfX0dyb3VwXzFfXzJfX0ltcGwiCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjA3MDU6MTogcnVsZV9fSnZtUGFyYW1ldGVyaXplZFR5cGVSZWZlcmVuY2VfX0dyb3VwXzFfXzJfX0ltcGwgOiAoICggcnVsZV9fSnZtUGFyYW1ldGVyaXplZFR5cGVSZWZlcmVuY2VfX0dyb3VwXzFfMl9fMCApKiApIDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMjA0MzoxOiBydWxlX19Kdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZV9fR3JvdXBfMV9fMl9fSW1wbCA6ICggKCBydWxlX19Kdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZV9fR3JvdXBfMV8yX18wICkqICkgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX0p2bVBhcmFtZXRlcml6ZWRUeXBlUmVmZXJlbmNlX19Hcm91cF8xX18yX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIwNzA5OjE6ICggKCAoIHJ1bGVfX0p2bVBhcmFtZXRlcml6ZWRUeXBlUmVmZXJlbmNlX19Hcm91cF8xXzJfXzAgKSogKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMDcxMDoxOiAoICggcnVsZV9fSnZtUGFyYW1ldGVyaXplZFR5cGVSZWZlcmVuY2VfX0dyb3VwXzFfMl9fMCApKiApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMjA0NzoxOiAoICggKCBydWxlX19Kdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZV9fR3JvdXBfMV8yX18wICkqICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjIwNDg6MTogKCAoIHJ1bGVfX0p2bVBhcmFtZXRlcml6ZWRUeXBlUmVmZXJlbmNlX19Hcm91cF8xXzJfXzAgKSogKQogICAgICAgICAgICAgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjA3MTA6MTogKCAoIHJ1bGVfX0p2bVBhcmFtZXRlcml6ZWRUeXBlUmVmZXJlbmNlX19Hcm91cF8xXzJfXzAgKSogKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjA3MTE6MjogKCBydWxlX19Kdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZV9fR3JvdXBfMV8yX18wICkqCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMjA0ODoxOiAoICggcnVsZV9fSnZtUGFyYW1ldGVyaXplZFR5cGVSZWZlcmVuY2VfX0dyb3VwXzFfMl9fMCApKiApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMjA0OToyOiAoIHJ1bGVfX0p2bVBhcmFtZXRlcml6ZWRUeXBlUmVmZXJlbmNlX19Hcm91cF8xXzJfXzAgKSoKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0SnZtUGFyYW1ldGVyaXplZFR5cGVSZWZlcmVuY2VBY2Nlc3MoKS5nZXRHcm91cF8xXzIoKSk7IAogICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjA3MTI6MjogKCBydWxlX19Kdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZV9fR3JvdXBfMV8yX18wICkqCi0gICAgICAgICAgICBsb29wMTYyOgorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjIwNTA6MjogKCBydWxlX19Kdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZV9fR3JvdXBfMV8yX18wICkqCisgICAgICAgICAgICBsb29wMTc1OgogICAgICAgICAgICAgZG8gewotICAgICAgICAgICAgICAgIGludCBhbHQxNjI9MjsKLSAgICAgICAgICAgICAgICBpbnQgTEExNjJfMCA9IGlucHV0LkxBKDEpOworICAgICAgICAgICAgICAgIGludCBhbHQxNzU9MjsKKyAgICAgICAgICAgICAgICBpbnQgTEExNzVfMCA9IGlucHV0LkxBKDEpOwogCi0gICAgICAgICAgICAgICAgaWYgKCAoTEExNjJfMD09MTE1KSApIHsKLSAgICAgICAgICAgICAgICAgICAgYWx0MTYyPTE7CisgICAgICAgICAgICAgICAgaWYgKCAoTEExNzVfMD09MTI1KSApIHsKKyAgICAgICAgICAgICAgICAgICAgYWx0MTc1PTE7CiAgICAgICAgICAgICAgICAgfQogCiAKLSAgICAgICAgICAgICAgICBzd2l0Y2ggKGFsdDE2MikgeworICAgICAgICAgICAgICAgIHN3aXRjaCAoYWx0MTc1KSB7CiAgICAgICAgICAgICAJY2FzZSAxIDoKLSAgICAgICAgICAgIAkgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjA3MTI6MzogcnVsZV9fSnZtUGFyYW1ldGVyaXplZFR5cGVSZWZlcmVuY2VfX0dyb3VwXzFfMl9fMAorICAgICAgICAgICAgCSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMjA1MDozOiBydWxlX19Kdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZV9fR3JvdXBfMV8yX18wCiAgICAgICAgICAgICAJICAgIHsKLSAgICAgICAgICAgIAkgICAgcHVzaEZvbGxvdyhGT0xMT1dfNzMpOworICAgICAgICAgICAgCSAgICBwdXNoRm9sbG93KEZPTExPV184MSk7CiAgICAgICAgICAgICAJICAgIHJ1bGVfX0p2bVBhcmFtZXRlcml6ZWRUeXBlUmVmZXJlbmNlX19Hcm91cF8xXzJfXzAoKTsKIAogICAgICAgICAgICAgCSAgICBzdGF0ZS5fZnNwLS07CkBAIC02Nzk5NSw3ICs3MjQ1Miw3IEBACiAgICAgICAgICAgICAJICAgIGJyZWFrOwogCiAgICAgICAgICAgICAJZGVmYXVsdCA6Ci0gICAgICAgICAgICAJICAgIGJyZWFrIGxvb3AxNjI7CisgICAgICAgICAgICAJICAgIGJyZWFrIGxvb3AxNzU7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfSB3aGlsZSAodHJ1ZSk7CiAKQEAgLTY4MDI0LDE2ICs3MjQ4MSwxNiBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX0p2bVBhcmFtZXRlcml6ZWRUeXBlUmVmZXJlbmNlX19Hcm91cF8xX18zIgotICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIwNzIwOjE6IHJ1bGVfX0p2bVBhcmFtZXRlcml6ZWRUeXBlUmVmZXJlbmNlX19Hcm91cF8xX18zIDogcnVsZV9fSnZtUGFyYW1ldGVyaXplZFR5cGVSZWZlcmVuY2VfX0dyb3VwXzFfXzNfX0ltcGwgcnVsZV9fSnZtUGFyYW1ldGVyaXplZFR5cGVSZWZlcmVuY2VfX0dyb3VwXzFfXzQgOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIyMDU4OjE6IHJ1bGVfX0p2bVBhcmFtZXRlcml6ZWRUeXBlUmVmZXJlbmNlX19Hcm91cF8xX18zIDogcnVsZV9fSnZtUGFyYW1ldGVyaXplZFR5cGVSZWZlcmVuY2VfX0dyb3VwXzFfXzNfX0ltcGwgcnVsZV9fSnZtUGFyYW1ldGVyaXplZFR5cGVSZWZlcmVuY2VfX0dyb3VwXzFfXzQgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX0p2bVBhcmFtZXRlcml6ZWRUeXBlUmVmZXJlbmNlX19Hcm91cF8xX18zKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIwNzI0OjE6ICggcnVsZV9fSnZtUGFyYW1ldGVyaXplZFR5cGVSZWZlcmVuY2VfX0dyb3VwXzFfXzNfX0ltcGwgcnVsZV9fSnZtUGFyYW1ldGVyaXplZFR5cGVSZWZlcmVuY2VfX0dyb3VwXzFfXzQgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjA3MjU6MjogcnVsZV9fSnZtUGFyYW1ldGVyaXplZFR5cGVSZWZlcmVuY2VfX0dyb3VwXzFfXzNfX0ltcGwgcnVsZV9fSnZtUGFyYW1ldGVyaXplZFR5cGVSZWZlcmVuY2VfX0dyb3VwXzFfXzQKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIyMDYyOjE6ICggcnVsZV9fSnZtUGFyYW1ldGVyaXplZFR5cGVSZWZlcmVuY2VfX0dyb3VwXzFfXzNfX0ltcGwgcnVsZV9fSnZtUGFyYW1ldGVyaXplZFR5cGVSZWZlcmVuY2VfX0dyb3VwXzFfXzQgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjIwNjM6MjogcnVsZV9fSnZtUGFyYW1ldGVyaXplZFR5cGVSZWZlcmVuY2VfX0dyb3VwXzFfXzNfX0ltcGwgcnVsZV9fSnZtUGFyYW1ldGVyaXplZFR5cGVSZWZlcmVuY2VfX0dyb3VwXzFfXzQKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzYyKTsKKyAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzcwKTsKICAgICAgICAgICAgIHJ1bGVfX0p2bVBhcmFtZXRlcml6ZWRUeXBlUmVmZXJlbmNlX19Hcm91cF8xX18zX19JbXBsKCk7CiAKICAgICAgICAgICAgIHN0YXRlLl9mc3AtLTsKQEAgLTY4MDYyLDE3ICs3MjUxOSwxNyBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX0p2bVBhcmFtZXRlcml6ZWRUeXBlUmVmZXJlbmNlX19Hcm91cF8xX18zX19JbXBsIgotICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIwNzMyOjE6IHJ1bGVfX0p2bVBhcmFtZXRlcml6ZWRUeXBlUmVmZXJlbmNlX19Hcm91cF8xX18zX19JbXBsIDogKCAnPicgKSA7CisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjIwNzA6MTogcnVsZV9fSnZtUGFyYW1ldGVyaXplZFR5cGVSZWZlcmVuY2VfX0dyb3VwXzFfXzNfX0ltcGwgOiAoICc+JyApIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19Kdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZV9fR3JvdXBfMV9fM19fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMDczNjoxOiAoICggJz4nICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjA3Mzc6MTogKCAnPicgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjIwNzQ6MTogKCAoICc+JyApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIyMDc1OjE6ICggJz4nICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIwNzM3OjE6ICggJz4nICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIwNzM4OjI6ICc+JworICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjIwNzU6MTogKCAnPicgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjIwNzY6MjogJz4nCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldEp2bVBhcmFtZXRlcml6ZWRUeXBlUmVmZXJlbmNlQWNjZXNzKCkuZ2V0R3JlYXRlclRoYW5TaWduS2V5d29yZF8xXzMoKSk7IApAQCAtNjgxMDMsMTQgKzcyNTYwLDE0IEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fSnZtUGFyYW1ldGVyaXplZFR5cGVSZWZlcmVuY2VfX0dyb3VwXzFfXzQiCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjA3NDc6MTogcnVsZV9fSnZtUGFyYW1ldGVyaXplZFR5cGVSZWZlcmVuY2VfX0dyb3VwXzFfXzQgOiBydWxlX19Kdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZV9fR3JvdXBfMV9fNF9fSW1wbCA7CisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjIwODU6MTogcnVsZV9fSnZtUGFyYW1ldGVyaXplZFR5cGVSZWZlcmVuY2VfX0dyb3VwXzFfXzQgOiBydWxlX19Kdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZV9fR3JvdXBfMV9fNF9fSW1wbCA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fSnZtUGFyYW1ldGVyaXplZFR5cGVSZWZlcmVuY2VfX0dyb3VwXzFfXzQoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjA3NTE6MTogKCBydWxlX19Kdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZV9fR3JvdXBfMV9fNF9fSW1wbCApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMDc1MjoyOiBydWxlX19Kdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZV9fR3JvdXBfMV9fNF9fSW1wbAorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjIwODk6MTogKCBydWxlX19Kdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZV9fR3JvdXBfMV9fNF9fSW1wbCApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMjA5MDoyOiBydWxlX19Kdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZV9fR3JvdXBfMV9fNF9fSW1wbAogICAgICAgICAgICAgewogICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMik7CiAgICAgICAgICAgICBydWxlX19Kdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZV9fR3JvdXBfMV9fNF9fSW1wbCgpOwpAQCAtNjgxMzYsMzUgKzcyNTkzLDM1IEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fSnZtUGFyYW1ldGVyaXplZFR5cGVSZWZlcmVuY2VfX0dyb3VwXzFfXzRfX0ltcGwiCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjA3NTg6MTogcnVsZV9fSnZtUGFyYW1ldGVyaXplZFR5cGVSZWZlcmVuY2VfX0dyb3VwXzFfXzRfX0ltcGwgOiAoICggcnVsZV9fSnZtUGFyYW1ldGVyaXplZFR5cGVSZWZlcmVuY2VfX0dyb3VwXzFfNF9fMCApKiApIDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMjA5NjoxOiBydWxlX19Kdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZV9fR3JvdXBfMV9fNF9fSW1wbCA6ICggKCBydWxlX19Kdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZV9fR3JvdXBfMV80X18wICkqICkgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX0p2bVBhcmFtZXRlcml6ZWRUeXBlUmVmZXJlbmNlX19Hcm91cF8xX180X19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIwNzYyOjE6ICggKCAoIHJ1bGVfX0p2bVBhcmFtZXRlcml6ZWRUeXBlUmVmZXJlbmNlX19Hcm91cF8xXzRfXzAgKSogKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMDc2MzoxOiAoICggcnVsZV9fSnZtUGFyYW1ldGVyaXplZFR5cGVSZWZlcmVuY2VfX0dyb3VwXzFfNF9fMCApKiApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMjEwMDoxOiAoICggKCBydWxlX19Kdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZV9fR3JvdXBfMV80X18wICkqICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjIxMDE6MTogKCAoIHJ1bGVfX0p2bVBhcmFtZXRlcml6ZWRUeXBlUmVmZXJlbmNlX19Hcm91cF8xXzRfXzAgKSogKQogICAgICAgICAgICAgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjA3NjM6MTogKCAoIHJ1bGVfX0p2bVBhcmFtZXRlcml6ZWRUeXBlUmVmZXJlbmNlX19Hcm91cF8xXzRfXzAgKSogKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjA3NjQ6MjogKCBydWxlX19Kdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZV9fR3JvdXBfMV80X18wICkqCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMjEwMToxOiAoICggcnVsZV9fSnZtUGFyYW1ldGVyaXplZFR5cGVSZWZlcmVuY2VfX0dyb3VwXzFfNF9fMCApKiApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMjEwMjoyOiAoIHJ1bGVfX0p2bVBhcmFtZXRlcml6ZWRUeXBlUmVmZXJlbmNlX19Hcm91cF8xXzRfXzAgKSoKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0SnZtUGFyYW1ldGVyaXplZFR5cGVSZWZlcmVuY2VBY2Nlc3MoKS5nZXRHcm91cF8xXzQoKSk7IAogICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjA3NjU6MjogKCBydWxlX19Kdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZV9fR3JvdXBfMV80X18wICkqCi0gICAgICAgICAgICBsb29wMTYzOgorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjIxMDM6MjogKCBydWxlX19Kdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZV9fR3JvdXBfMV80X18wICkqCisgICAgICAgICAgICBsb29wMTc2OgogICAgICAgICAgICAgZG8gewotICAgICAgICAgICAgICAgIGludCBhbHQxNjM9MjsKLSAgICAgICAgICAgICAgICBpbnQgTEExNjNfMCA9IGlucHV0LkxBKDEpOworICAgICAgICAgICAgICAgIGludCBhbHQxNzY9MjsKKyAgICAgICAgICAgICAgICBpbnQgTEExNzZfMCA9IGlucHV0LkxBKDEpOwogCi0gICAgICAgICAgICAgICAgaWYgKCAoTEExNjNfMD09NDMpICkgewotICAgICAgICAgICAgICAgICAgICBpbnQgTEExNjNfMiA9IGlucHV0LkxBKDIpOworICAgICAgICAgICAgICAgIGlmICggKExBMTc2XzA9PTQzKSApIHsKKyAgICAgICAgICAgICAgICAgICAgaW50IExBMTc2XzIgPSBpbnB1dC5MQSgyKTsKIAotICAgICAgICAgICAgICAgICAgICBpZiAoIChMQTE2M18yPT1SVUxFX0lEKSApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGludCBMQTE2M18zID0gaW5wdXQuTEEoMyk7CisgICAgICAgICAgICAgICAgICAgIGlmICggKExBMTc2XzI9PVJVTEVfSUQpICkgeworICAgICAgICAgICAgICAgICAgICAgICAgaW50IExBMTc2XzMgPSBpbnB1dC5MQSgzKTsKIAotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCAoc3lucHJlZDIxN19JbnRlcm5hbERhdGFEU0woKSkgKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYWx0MTYzPTE7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIChzeW5wcmVkMjM2X0ludGVybmFsRGF0YURTTCgpKSApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbHQxNzY9MTsKICAgICAgICAgICAgICAgICAgICAgICAgIH0KIAogCkBAIC02ODE3NCwxMSArNzI2MzEsMTEgQEAKICAgICAgICAgICAgICAgICB9CiAKIAotICAgICAgICAgICAgICAgIHN3aXRjaCAoYWx0MTYzKSB7CisgICAgICAgICAgICAgICAgc3dpdGNoIChhbHQxNzYpIHsKICAgICAgICAgICAgIAljYXNlIDEgOgotICAgICAgICAgICAgCSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMDc2NTozOiBydWxlX19Kdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZV9fR3JvdXBfMV80X18wCisgICAgICAgICAgICAJICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIyMTAzOjM6IHJ1bGVfX0p2bVBhcmFtZXRlcml6ZWRUeXBlUmVmZXJlbmNlX19Hcm91cF8xXzRfXzAKICAgICAgICAgICAgIAkgICAgewotICAgICAgICAgICAgCSAgICBwdXNoRm9sbG93KEZPTExPV182Myk7CisgICAgICAgICAgICAJICAgIHB1c2hGb2xsb3coRk9MTE9XXzcxKTsKICAgICAgICAgICAgIAkgICAgcnVsZV9fSnZtUGFyYW1ldGVyaXplZFR5cGVSZWZlcmVuY2VfX0dyb3VwXzFfNF9fMCgpOwogCiAgICAgICAgICAgICAJICAgIHN0YXRlLl9mc3AtLTsKQEAgLTY4MTg4LDcgKzcyNjQ1LDcgQEAKICAgICAgICAgICAgIAkgICAgYnJlYWs7CiAKICAgICAgICAgICAgIAlkZWZhdWx0IDoKLSAgICAgICAgICAgIAkgICAgYnJlYWsgbG9vcDE2MzsKKyAgICAgICAgICAgIAkgICAgYnJlYWsgbG9vcDE3NjsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9IHdoaWxlICh0cnVlKTsKIApAQCAtNjgyMTcsMTYgKzcyNjc0LDE2IEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fSnZtUGFyYW1ldGVyaXplZFR5cGVSZWZlcmVuY2VfX0dyb3VwXzFfMl9fMCIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMDc3NDoxOiBydWxlX19Kdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZV9fR3JvdXBfMV8yX18wIDogcnVsZV9fSnZtUGFyYW1ldGVyaXplZFR5cGVSZWZlcmVuY2VfX0dyb3VwXzFfMl9fMF9fSW1wbCBydWxlX19Kdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZV9fR3JvdXBfMV8yX18xIDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMjExMjoxOiBydWxlX19Kdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZV9fR3JvdXBfMV8yX18wIDogcnVsZV9fSnZtUGFyYW1ldGVyaXplZFR5cGVSZWZlcmVuY2VfX0dyb3VwXzFfMl9fMF9fSW1wbCBydWxlX19Kdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZV9fR3JvdXBfMV8yX18xIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19Kdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZV9fR3JvdXBfMV8yX18wKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIwNzc4OjE6ICggcnVsZV9fSnZtUGFyYW1ldGVyaXplZFR5cGVSZWZlcmVuY2VfX0dyb3VwXzFfMl9fMF9fSW1wbCBydWxlX19Kdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZV9fR3JvdXBfMV8yX18xICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIwNzc5OjI6IHJ1bGVfX0p2bVBhcmFtZXRlcml6ZWRUeXBlUmVmZXJlbmNlX19Hcm91cF8xXzJfXzBfX0ltcGwgcnVsZV9fSnZtUGFyYW1ldGVyaXplZFR5cGVSZWZlcmVuY2VfX0dyb3VwXzFfMl9fMQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjIxMTY6MTogKCBydWxlX19Kdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZV9fR3JvdXBfMV8yX18wX19JbXBsIHJ1bGVfX0p2bVBhcmFtZXRlcml6ZWRUeXBlUmVmZXJlbmNlX19Hcm91cF8xXzJfXzEgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjIxMTc6MjogcnVsZV9fSnZtUGFyYW1ldGVyaXplZFR5cGVSZWZlcmVuY2VfX0dyb3VwXzFfMl9fMF9fSW1wbCBydWxlX19Kdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZV9fR3JvdXBfMV8yX18xCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV18xMTApOworICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMTE4KTsKICAgICAgICAgICAgIHJ1bGVfX0p2bVBhcmFtZXRlcml6ZWRUeXBlUmVmZXJlbmNlX19Hcm91cF8xXzJfXzBfX0ltcGwoKTsKIAogICAgICAgICAgICAgc3RhdGUuX2ZzcC0tOwpAQCAtNjgyNTUsMjIgKzcyNzEyLDIyIEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fSnZtUGFyYW1ldGVyaXplZFR5cGVSZWZlcmVuY2VfX0dyb3VwXzFfMl9fMF9fSW1wbCIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMDc4NjoxOiBydWxlX19Kdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZV9fR3JvdXBfMV8yX18wX19JbXBsIDogKCAnLCcgKSA7CisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjIxMjQ6MTogcnVsZV9fSnZtUGFyYW1ldGVyaXplZFR5cGVSZWZlcmVuY2VfX0dyb3VwXzFfMl9fMF9fSW1wbCA6ICggJywnICkgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX0p2bVBhcmFtZXRlcml6ZWRUeXBlUmVmZXJlbmNlX19Hcm91cF8xXzJfXzBfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjA3OTA6MTogKCAoICcsJyApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIwNzkxOjE6ICggJywnICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIyMTI4OjE6ICggKCAnLCcgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMjEyOToxOiAoICcsJyApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMDc5MToxOiAoICcsJyApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMDc5MjoyOiAnLCcKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIyMTI5OjE6ICggJywnICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIyMTMwOjI6ICcsJwogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRKdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZUFjY2VzcygpLmdldENvbW1hS2V5d29yZF8xXzJfMCgpKTsgCiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBtYXRjaChpbnB1dCwxMTUsRk9MTE9XXzIpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOworICAgICAgICAgICAgbWF0Y2goaW5wdXQsMTI1LEZPTExPV18yKTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRKdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZUFjY2VzcygpLmdldENvbW1hS2V5d29yZF8xXzJfMCgpKTsgCiAgICAgICAgICAgICB9CkBAIC02ODI5NiwxNCArNzI3NTMsMTQgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19Kdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZV9fR3JvdXBfMV8yX18xIgotICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIwODAxOjE6IHJ1bGVfX0p2bVBhcmFtZXRlcml6ZWRUeXBlUmVmZXJlbmNlX19Hcm91cF8xXzJfXzEgOiBydWxlX19Kdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZV9fR3JvdXBfMV8yX18xX19JbXBsIDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMjEzOToxOiBydWxlX19Kdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZV9fR3JvdXBfMV8yX18xIDogcnVsZV9fSnZtUGFyYW1ldGVyaXplZFR5cGVSZWZlcmVuY2VfX0dyb3VwXzFfMl9fMV9fSW1wbCA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fSnZtUGFyYW1ldGVyaXplZFR5cGVSZWZlcmVuY2VfX0dyb3VwXzFfMl9fMSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMDgwNToxOiAoIHJ1bGVfX0p2bVBhcmFtZXRlcml6ZWRUeXBlUmVmZXJlbmNlX19Hcm91cF8xXzJfXzFfX0ltcGwgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjA4MDY6MjogcnVsZV9fSnZtUGFyYW1ldGVyaXplZFR5cGVSZWZlcmVuY2VfX0dyb3VwXzFfMl9fMV9fSW1wbAorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjIxNDM6MTogKCBydWxlX19Kdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZV9fR3JvdXBfMV8yX18xX19JbXBsICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIyMTQ0OjI6IHJ1bGVfX0p2bVBhcmFtZXRlcml6ZWRUeXBlUmVmZXJlbmNlX19Hcm91cF8xXzJfXzFfX0ltcGwKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzIpOwogICAgICAgICAgICAgcnVsZV9fSnZtUGFyYW1ldGVyaXplZFR5cGVSZWZlcmVuY2VfX0dyb3VwXzFfMl9fMV9fSW1wbCgpOwpAQCAtNjgzMjksMjMgKzcyNzg2LDIzIEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fSnZtUGFyYW1ldGVyaXplZFR5cGVSZWZlcmVuY2VfX0dyb3VwXzFfMl9fMV9fSW1wbCIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMDgxMjoxOiBydWxlX19Kdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZV9fR3JvdXBfMV8yX18xX19JbXBsIDogKCAoIHJ1bGVfX0p2bVBhcmFtZXRlcml6ZWRUeXBlUmVmZXJlbmNlX19Bcmd1bWVudHNBc3NpZ25tZW50XzFfMl8xICkgKSA7CisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjIxNTA6MTogcnVsZV9fSnZtUGFyYW1ldGVyaXplZFR5cGVSZWZlcmVuY2VfX0dyb3VwXzFfMl9fMV9fSW1wbCA6ICggKCBydWxlX19Kdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZV9fQXJndW1lbnRzQXNzaWdubWVudF8xXzJfMSApICkgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX0p2bVBhcmFtZXRlcml6ZWRUeXBlUmVmZXJlbmNlX19Hcm91cF8xXzJfXzFfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjA4MTY6MTogKCAoICggcnVsZV9fSnZtUGFyYW1ldGVyaXplZFR5cGVSZWZlcmVuY2VfX0FyZ3VtZW50c0Fzc2lnbm1lbnRfMV8yXzEgKSApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIwODE3OjE6ICggKCBydWxlX19Kdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZV9fQXJndW1lbnRzQXNzaWdubWVudF8xXzJfMSApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIyMTU0OjE6ICggKCAoIHJ1bGVfX0p2bVBhcmFtZXRlcml6ZWRUeXBlUmVmZXJlbmNlX19Bcmd1bWVudHNBc3NpZ25tZW50XzFfMl8xICkgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMjE1NToxOiAoICggcnVsZV9fSnZtUGFyYW1ldGVyaXplZFR5cGVSZWZlcmVuY2VfX0FyZ3VtZW50c0Fzc2lnbm1lbnRfMV8yXzEgKSApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMDgxNzoxOiAoICggcnVsZV9fSnZtUGFyYW1ldGVyaXplZFR5cGVSZWZlcmVuY2VfX0FyZ3VtZW50c0Fzc2lnbm1lbnRfMV8yXzEgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMDgxODoyOiAoIHJ1bGVfX0p2bVBhcmFtZXRlcml6ZWRUeXBlUmVmZXJlbmNlX19Bcmd1bWVudHNBc3NpZ25tZW50XzFfMl8xICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIyMTU1OjE6ICggKCBydWxlX19Kdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZV9fQXJndW1lbnRzQXNzaWdubWVudF8xXzJfMSApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIyMTU2OjI6ICggcnVsZV9fSnZtUGFyYW1ldGVyaXplZFR5cGVSZWZlcmVuY2VfX0FyZ3VtZW50c0Fzc2lnbm1lbnRfMV8yXzEgKQogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRKdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZUFjY2VzcygpLmdldEFyZ3VtZW50c0Fzc2lnbm1lbnRfMV8yXzEoKSk7IAogICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjA4MTk6MjogKCBydWxlX19Kdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZV9fQXJndW1lbnRzQXNzaWdubWVudF8xXzJfMSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMDgxOTozOiBydWxlX19Kdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZV9fQXJndW1lbnRzQXNzaWdubWVudF8xXzJfMQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjIxNTc6MjogKCBydWxlX19Kdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZV9fQXJndW1lbnRzQXNzaWdubWVudF8xXzJfMSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMjE1NzozOiBydWxlX19Kdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZV9fQXJndW1lbnRzQXNzaWdubWVudF8xXzJfMQogICAgICAgICAgICAgewogICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMik7CiAgICAgICAgICAgICBydWxlX19Kdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZV9fQXJndW1lbnRzQXNzaWdubWVudF8xXzJfMSgpOwpAQCAtNjgzODAsMTQgKzcyODM3LDE0IEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fSnZtUGFyYW1ldGVyaXplZFR5cGVSZWZlcmVuY2VfX0dyb3VwXzFfNF9fMCIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMDgyODoxOiBydWxlX19Kdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZV9fR3JvdXBfMV80X18wIDogcnVsZV9fSnZtUGFyYW1ldGVyaXplZFR5cGVSZWZlcmVuY2VfX0dyb3VwXzFfNF9fMF9fSW1wbCBydWxlX19Kdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZV9fR3JvdXBfMV80X18xIDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMjE2NjoxOiBydWxlX19Kdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZV9fR3JvdXBfMV80X18wIDogcnVsZV9fSnZtUGFyYW1ldGVyaXplZFR5cGVSZWZlcmVuY2VfX0dyb3VwXzFfNF9fMF9fSW1wbCBydWxlX19Kdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZV9fR3JvdXBfMV80X18xIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19Kdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZV9fR3JvdXBfMV80X18wKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIwODMyOjE6ICggcnVsZV9fSnZtUGFyYW1ldGVyaXplZFR5cGVSZWZlcmVuY2VfX0dyb3VwXzFfNF9fMF9fSW1wbCBydWxlX19Kdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZV9fR3JvdXBfMV80X18xICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIwODMzOjI6IHJ1bGVfX0p2bVBhcmFtZXRlcml6ZWRUeXBlUmVmZXJlbmNlX19Hcm91cF8xXzRfXzBfX0ltcGwgcnVsZV9fSnZtUGFyYW1ldGVyaXplZFR5cGVSZWZlcmVuY2VfX0dyb3VwXzFfNF9fMQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjIxNzA6MTogKCBydWxlX19Kdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZV9fR3JvdXBfMV80X18wX19JbXBsIHJ1bGVfX0p2bVBhcmFtZXRlcml6ZWRUeXBlUmVmZXJlbmNlX19Hcm91cF8xXzRfXzEgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjIxNzE6MjogcnVsZV9fSnZtUGFyYW1ldGVyaXplZFR5cGVSZWZlcmVuY2VfX0dyb3VwXzFfNF9fMF9fSW1wbCBydWxlX19Kdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZV9fR3JvdXBfMV80X18xCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV183KTsKICAgICAgICAgICAgIHJ1bGVfX0p2bVBhcmFtZXRlcml6ZWRUeXBlUmVmZXJlbmNlX19Hcm91cF8xXzRfXzBfX0ltcGwoKTsKQEAgLTY4NDE4LDIzICs3Mjg3NSwyMyBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX0p2bVBhcmFtZXRlcml6ZWRUeXBlUmVmZXJlbmNlX19Hcm91cF8xXzRfXzBfX0ltcGwiCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjA4NDA6MTogcnVsZV9fSnZtUGFyYW1ldGVyaXplZFR5cGVSZWZlcmVuY2VfX0dyb3VwXzFfNF9fMF9fSW1wbCA6ICggKCBydWxlX19Kdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZV9fR3JvdXBfMV80XzBfXzAgKSApIDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMjE3ODoxOiBydWxlX19Kdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZV9fR3JvdXBfMV80X18wX19JbXBsIDogKCAoIHJ1bGVfX0p2bVBhcmFtZXRlcml6ZWRUeXBlUmVmZXJlbmNlX19Hcm91cF8xXzRfMF9fMCApICkgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX0p2bVBhcmFtZXRlcml6ZWRUeXBlUmVmZXJlbmNlX19Hcm91cF8xXzRfXzBfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjA4NDQ6MTogKCAoICggcnVsZV9fSnZtUGFyYW1ldGVyaXplZFR5cGVSZWZlcmVuY2VfX0dyb3VwXzFfNF8wX18wICkgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMDg0NToxOiAoICggcnVsZV9fSnZtUGFyYW1ldGVyaXplZFR5cGVSZWZlcmVuY2VfX0dyb3VwXzFfNF8wX18wICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjIxODI6MTogKCAoICggcnVsZV9fSnZtUGFyYW1ldGVyaXplZFR5cGVSZWZlcmVuY2VfX0dyb3VwXzFfNF8wX18wICkgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMjE4MzoxOiAoICggcnVsZV9fSnZtUGFyYW1ldGVyaXplZFR5cGVSZWZlcmVuY2VfX0dyb3VwXzFfNF8wX18wICkgKQogICAgICAgICAgICAgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjA4NDU6MTogKCAoIHJ1bGVfX0p2bVBhcmFtZXRlcml6ZWRUeXBlUmVmZXJlbmNlX19Hcm91cF8xXzRfMF9fMCApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIwODQ2OjI6ICggcnVsZV9fSnZtUGFyYW1ldGVyaXplZFR5cGVSZWZlcmVuY2VfX0dyb3VwXzFfNF8wX18wICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIyMTgzOjE6ICggKCBydWxlX19Kdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZV9fR3JvdXBfMV80XzBfXzAgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMjE4NDoyOiAoIHJ1bGVfX0p2bVBhcmFtZXRlcml6ZWRUeXBlUmVmZXJlbmNlX19Hcm91cF8xXzRfMF9fMCApCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldEp2bVBhcmFtZXRlcml6ZWRUeXBlUmVmZXJlbmNlQWNjZXNzKCkuZ2V0R3JvdXBfMV80XzAoKSk7IAogICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjA4NDc6MjogKCBydWxlX19Kdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZV9fR3JvdXBfMV80XzBfXzAgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjA4NDc6MzogcnVsZV9fSnZtUGFyYW1ldGVyaXplZFR5cGVSZWZlcmVuY2VfX0dyb3VwXzFfNF8wX18wCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMjE4NToyOiAoIHJ1bGVfX0p2bVBhcmFtZXRlcml6ZWRUeXBlUmVmZXJlbmNlX19Hcm91cF8xXzRfMF9fMCApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMjE4NTozOiBydWxlX19Kdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZV9fR3JvdXBfMV80XzBfXzAKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzIpOwogICAgICAgICAgICAgcnVsZV9fSnZtUGFyYW1ldGVyaXplZFR5cGVSZWZlcmVuY2VfX0dyb3VwXzFfNF8wX18wKCk7CkBAIC02ODQ2OSwxNiArNzI5MjYsMTYgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19Kdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZV9fR3JvdXBfMV80X18xIgotICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIwODU1OjE6IHJ1bGVfX0p2bVBhcmFtZXRlcml6ZWRUeXBlUmVmZXJlbmNlX19Hcm91cF8xXzRfXzEgOiBydWxlX19Kdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZV9fR3JvdXBfMV80X18xX19JbXBsIHJ1bGVfX0p2bVBhcmFtZXRlcml6ZWRUeXBlUmVmZXJlbmNlX19Hcm91cF8xXzRfXzIgOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIyMTkzOjE6IHJ1bGVfX0p2bVBhcmFtZXRlcml6ZWRUeXBlUmVmZXJlbmNlX19Hcm91cF8xXzRfXzEgOiBydWxlX19Kdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZV9fR3JvdXBfMV80X18xX19JbXBsIHJ1bGVfX0p2bVBhcmFtZXRlcml6ZWRUeXBlUmVmZXJlbmNlX19Hcm91cF8xXzRfXzIgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX0p2bVBhcmFtZXRlcml6ZWRUeXBlUmVmZXJlbmNlX19Hcm91cF8xXzRfXzEoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjA4NTk6MTogKCBydWxlX19Kdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZV9fR3JvdXBfMV80X18xX19JbXBsIHJ1bGVfX0p2bVBhcmFtZXRlcml6ZWRUeXBlUmVmZXJlbmNlX19Hcm91cF8xXzRfXzIgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjA4NjA6MjogcnVsZV9fSnZtUGFyYW1ldGVyaXplZFR5cGVSZWZlcmVuY2VfX0dyb3VwXzFfNF9fMV9fSW1wbCBydWxlX19Kdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZV9fR3JvdXBfMV80X18yCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMjE5NzoxOiAoIHJ1bGVfX0p2bVBhcmFtZXRlcml6ZWRUeXBlUmVmZXJlbmNlX19Hcm91cF8xXzRfXzFfX0ltcGwgcnVsZV9fSnZtUGFyYW1ldGVyaXplZFR5cGVSZWZlcmVuY2VfX0dyb3VwXzFfNF9fMiApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMjE5ODoyOiBydWxlX19Kdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZV9fR3JvdXBfMV80X18xX19JbXBsIHJ1bGVfX0p2bVBhcmFtZXRlcml6ZWRUeXBlUmVmZXJlbmNlX19Hcm91cF8xXzRfXzIKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzgxKTsKKyAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzg5KTsKICAgICAgICAgICAgIHJ1bGVfX0p2bVBhcmFtZXRlcml6ZWRUeXBlUmVmZXJlbmNlX19Hcm91cF8xXzRfXzFfX0ltcGwoKTsKIAogICAgICAgICAgICAgc3RhdGUuX2ZzcC0tOwpAQCAtNjg1MDcsMjMgKzcyOTY0LDIzIEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fSnZtUGFyYW1ldGVyaXplZFR5cGVSZWZlcmVuY2VfX0dyb3VwXzFfNF9fMV9fSW1wbCIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMDg2NzoxOiBydWxlX19Kdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZV9fR3JvdXBfMV80X18xX19JbXBsIDogKCAoIHJ1bGVfX0p2bVBhcmFtZXRlcml6ZWRUeXBlUmVmZXJlbmNlX19UeXBlQXNzaWdubWVudF8xXzRfMSApICkgOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIyMjA1OjE6IHJ1bGVfX0p2bVBhcmFtZXRlcml6ZWRUeXBlUmVmZXJlbmNlX19Hcm91cF8xXzRfXzFfX0ltcGwgOiAoICggcnVsZV9fSnZtUGFyYW1ldGVyaXplZFR5cGVSZWZlcmVuY2VfX1R5cGVBc3NpZ25tZW50XzFfNF8xICkgKSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fSnZtUGFyYW1ldGVyaXplZFR5cGVSZWZlcmVuY2VfX0dyb3VwXzFfNF9fMV9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMDg3MToxOiAoICggKCBydWxlX19Kdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZV9fVHlwZUFzc2lnbm1lbnRfMV80XzEgKSApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIwODcyOjE6ICggKCBydWxlX19Kdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZV9fVHlwZUFzc2lnbm1lbnRfMV80XzEgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMjIwOToxOiAoICggKCBydWxlX19Kdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZV9fVHlwZUFzc2lnbm1lbnRfMV80XzEgKSApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIyMjEwOjE6ICggKCBydWxlX19Kdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZV9fVHlwZUFzc2lnbm1lbnRfMV80XzEgKSApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMDg3MjoxOiAoICggcnVsZV9fSnZtUGFyYW1ldGVyaXplZFR5cGVSZWZlcmVuY2VfX1R5cGVBc3NpZ25tZW50XzFfNF8xICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjA4NzM6MjogKCBydWxlX19Kdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZV9fVHlwZUFzc2lnbm1lbnRfMV80XzEgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjIyMTA6MTogKCAoIHJ1bGVfX0p2bVBhcmFtZXRlcml6ZWRUeXBlUmVmZXJlbmNlX19UeXBlQXNzaWdubWVudF8xXzRfMSApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIyMjExOjI6ICggcnVsZV9fSnZtUGFyYW1ldGVyaXplZFR5cGVSZWZlcmVuY2VfX1R5cGVBc3NpZ25tZW50XzFfNF8xICkKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0SnZtUGFyYW1ldGVyaXplZFR5cGVSZWZlcmVuY2VBY2Nlc3MoKS5nZXRUeXBlQXNzaWdubWVudF8xXzRfMSgpKTsgCiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMDg3NDoyOiAoIHJ1bGVfX0p2bVBhcmFtZXRlcml6ZWRUeXBlUmVmZXJlbmNlX19UeXBlQXNzaWdubWVudF8xXzRfMSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMDg3NDozOiBydWxlX19Kdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZV9fVHlwZUFzc2lnbm1lbnRfMV80XzEKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIyMjEyOjI6ICggcnVsZV9fSnZtUGFyYW1ldGVyaXplZFR5cGVSZWZlcmVuY2VfX1R5cGVBc3NpZ25tZW50XzFfNF8xICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIyMjEyOjM6IHJ1bGVfX0p2bVBhcmFtZXRlcml6ZWRUeXBlUmVmZXJlbmNlX19UeXBlQXNzaWdubWVudF8xXzRfMQogICAgICAgICAgICAgewogICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMik7CiAgICAgICAgICAgICBydWxlX19Kdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZV9fVHlwZUFzc2lnbm1lbnRfMV80XzEoKTsKQEAgLTY4NTU4LDE0ICs3MzAxNSwxNCBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX0p2bVBhcmFtZXRlcml6ZWRUeXBlUmVmZXJlbmNlX19Hcm91cF8xXzRfXzIiCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjA4ODI6MTogcnVsZV9fSnZtUGFyYW1ldGVyaXplZFR5cGVSZWZlcmVuY2VfX0dyb3VwXzFfNF9fMiA6IHJ1bGVfX0p2bVBhcmFtZXRlcml6ZWRUeXBlUmVmZXJlbmNlX19Hcm91cF8xXzRfXzJfX0ltcGwgOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIyMjIwOjE6IHJ1bGVfX0p2bVBhcmFtZXRlcml6ZWRUeXBlUmVmZXJlbmNlX19Hcm91cF8xXzRfXzIgOiBydWxlX19Kdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZV9fR3JvdXBfMV80X18yX19JbXBsIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19Kdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZV9fR3JvdXBfMV80X18yKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIwODg2OjE6ICggcnVsZV9fSnZtUGFyYW1ldGVyaXplZFR5cGVSZWZlcmVuY2VfX0dyb3VwXzFfNF9fMl9fSW1wbCApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMDg4NzoyOiBydWxlX19Kdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZV9fR3JvdXBfMV80X18yX19JbXBsCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMjIyNDoxOiAoIHJ1bGVfX0p2bVBhcmFtZXRlcml6ZWRUeXBlUmVmZXJlbmNlX19Hcm91cF8xXzRfXzJfX0ltcGwgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjIyMjU6MjogcnVsZV9fSnZtUGFyYW1ldGVyaXplZFR5cGVSZWZlcmVuY2VfX0dyb3VwXzFfNF9fMl9fSW1wbAogICAgICAgICAgICAgewogICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMik7CiAgICAgICAgICAgICBydWxlX19Kdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZV9fR3JvdXBfMV80X18yX19JbXBsKCk7CkBAIC02ODU5MSwyNyArNzMwNDgsMjcgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19Kdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZV9fR3JvdXBfMV80X18yX19JbXBsIgotICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIwODkzOjE6IHJ1bGVfX0p2bVBhcmFtZXRlcml6ZWRUeXBlUmVmZXJlbmNlX19Hcm91cF8xXzRfXzJfX0ltcGwgOiAoICggcnVsZV9fSnZtUGFyYW1ldGVyaXplZFR5cGVSZWZlcmVuY2VfX0dyb3VwXzFfNF8yX18wICk/ICkgOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIyMjMxOjE6IHJ1bGVfX0p2bVBhcmFtZXRlcml6ZWRUeXBlUmVmZXJlbmNlX19Hcm91cF8xXzRfXzJfX0ltcGwgOiAoICggcnVsZV9fSnZtUGFyYW1ldGVyaXplZFR5cGVSZWZlcmVuY2VfX0dyb3VwXzFfNF8yX18wICk/ICkgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX0p2bVBhcmFtZXRlcml6ZWRUeXBlUmVmZXJlbmNlX19Hcm91cF8xXzRfXzJfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjA4OTc6MTogKCAoICggcnVsZV9fSnZtUGFyYW1ldGVyaXplZFR5cGVSZWZlcmVuY2VfX0dyb3VwXzFfNF8yX18wICk/ICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjA4OTg6MTogKCAoIHJ1bGVfX0p2bVBhcmFtZXRlcml6ZWRUeXBlUmVmZXJlbmNlX19Hcm91cF8xXzRfMl9fMCApPyApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMjIzNToxOiAoICggKCBydWxlX19Kdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZV9fR3JvdXBfMV80XzJfXzAgKT8gKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMjIzNjoxOiAoICggcnVsZV9fSnZtUGFyYW1ldGVyaXplZFR5cGVSZWZlcmVuY2VfX0dyb3VwXzFfNF8yX18wICk/ICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIwODk4OjE6ICggKCBydWxlX19Kdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZV9fR3JvdXBfMV80XzJfXzAgKT8gKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjA4OTk6MjogKCBydWxlX19Kdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZV9fR3JvdXBfMV80XzJfXzAgKT8KKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIyMjM2OjE6ICggKCBydWxlX19Kdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZV9fR3JvdXBfMV80XzJfXzAgKT8gKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjIyMzc6MjogKCBydWxlX19Kdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZV9fR3JvdXBfMV80XzJfXzAgKT8KICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0SnZtUGFyYW1ldGVyaXplZFR5cGVSZWZlcmVuY2VBY2Nlc3MoKS5nZXRHcm91cF8xXzRfMigpKTsgCiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMDkwMDoyOiAoIHJ1bGVfX0p2bVBhcmFtZXRlcml6ZWRUeXBlUmVmZXJlbmNlX19Hcm91cF8xXzRfMl9fMCApPwotICAgICAgICAgICAgaW50IGFsdDE2ND0yOwotICAgICAgICAgICAgYWx0MTY0ID0gZGZhMTY0LnByZWRpY3QoaW5wdXQpOwotICAgICAgICAgICAgc3dpdGNoIChhbHQxNjQpIHsKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIyMjM4OjI6ICggcnVsZV9fSnZtUGFyYW1ldGVyaXplZFR5cGVSZWZlcmVuY2VfX0dyb3VwXzFfNF8yX18wICk/CisgICAgICAgICAgICBpbnQgYWx0MTc3PTI7CisgICAgICAgICAgICBhbHQxNzcgPSBkZmExNzcucHJlZGljdChpbnB1dCk7CisgICAgICAgICAgICBzd2l0Y2ggKGFsdDE3NykgewogICAgICAgICAgICAgICAgIGNhc2UgMSA6Ci0gICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIwOTAwOjM6IHJ1bGVfX0p2bVBhcmFtZXRlcml6ZWRUeXBlUmVmZXJlbmNlX19Hcm91cF8xXzRfMl9fMAorICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMjIzODozOiBydWxlX19Kdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZV9fR3JvdXBfMV80XzJfXzAKICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV18yKTsKICAgICAgICAgICAgICAgICAgICAgcnVsZV9fSnZtUGFyYW1ldGVyaXplZFR5cGVSZWZlcmVuY2VfX0dyb3VwXzFfNF8yX18wKCk7CkBAIC02ODY0OSwxNCArNzMxMDYsMTQgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19Kdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZV9fR3JvdXBfMV80XzBfXzAiCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjA5MDk6MTogcnVsZV9fSnZtUGFyYW1ldGVyaXplZFR5cGVSZWZlcmVuY2VfX0dyb3VwXzFfNF8wX18wIDogcnVsZV9fSnZtUGFyYW1ldGVyaXplZFR5cGVSZWZlcmVuY2VfX0dyb3VwXzFfNF8wX18wX19JbXBsIDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMjI0NzoxOiBydWxlX19Kdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZV9fR3JvdXBfMV80XzBfXzAgOiBydWxlX19Kdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZV9fR3JvdXBfMV80XzBfXzBfX0ltcGwgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX0p2bVBhcmFtZXRlcml6ZWRUeXBlUmVmZXJlbmNlX19Hcm91cF8xXzRfMF9fMCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMDkxMzoxOiAoIHJ1bGVfX0p2bVBhcmFtZXRlcml6ZWRUeXBlUmVmZXJlbmNlX19Hcm91cF8xXzRfMF9fMF9fSW1wbCApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMDkxNDoyOiBydWxlX19Kdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZV9fR3JvdXBfMV80XzBfXzBfX0ltcGwKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIyMjUxOjE6ICggcnVsZV9fSnZtUGFyYW1ldGVyaXplZFR5cGVSZWZlcmVuY2VfX0dyb3VwXzFfNF8wX18wX19JbXBsICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIyMjUyOjI6IHJ1bGVfX0p2bVBhcmFtZXRlcml6ZWRUeXBlUmVmZXJlbmNlX19Hcm91cF8xXzRfMF9fMF9fSW1wbAogICAgICAgICAgICAgewogICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMik7CiAgICAgICAgICAgICBydWxlX19Kdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZV9fR3JvdXBfMV80XzBfXzBfX0ltcGwoKTsKQEAgLTY4NjgyLDIzICs3MzEzOSwyMyBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX0p2bVBhcmFtZXRlcml6ZWRUeXBlUmVmZXJlbmNlX19Hcm91cF8xXzRfMF9fMF9fSW1wbCIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMDkyMDoxOiBydWxlX19Kdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZV9fR3JvdXBfMV80XzBfXzBfX0ltcGwgOiAoICggcnVsZV9fSnZtUGFyYW1ldGVyaXplZFR5cGVSZWZlcmVuY2VfX0dyb3VwXzFfNF8wXzBfXzAgKSApIDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMjI1ODoxOiBydWxlX19Kdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZV9fR3JvdXBfMV80XzBfXzBfX0ltcGwgOiAoICggcnVsZV9fSnZtUGFyYW1ldGVyaXplZFR5cGVSZWZlcmVuY2VfX0dyb3VwXzFfNF8wXzBfXzAgKSApIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19Kdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZV9fR3JvdXBfMV80XzBfXzBfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjA5MjQ6MTogKCAoICggcnVsZV9fSnZtUGFyYW1ldGVyaXplZFR5cGVSZWZlcmVuY2VfX0dyb3VwXzFfNF8wXzBfXzAgKSApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIwOTI1OjE6ICggKCBydWxlX19Kdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZV9fR3JvdXBfMV80XzBfMF9fMCApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIyMjYyOjE6ICggKCAoIHJ1bGVfX0p2bVBhcmFtZXRlcml6ZWRUeXBlUmVmZXJlbmNlX19Hcm91cF8xXzRfMF8wX18wICkgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMjI2MzoxOiAoICggcnVsZV9fSnZtUGFyYW1ldGVyaXplZFR5cGVSZWZlcmVuY2VfX0dyb3VwXzFfNF8wXzBfXzAgKSApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMDkyNToxOiAoICggcnVsZV9fSnZtUGFyYW1ldGVyaXplZFR5cGVSZWZlcmVuY2VfX0dyb3VwXzFfNF8wXzBfXzAgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMDkyNjoyOiAoIHJ1bGVfX0p2bVBhcmFtZXRlcml6ZWRUeXBlUmVmZXJlbmNlX19Hcm91cF8xXzRfMF8wX18wICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIyMjYzOjE6ICggKCBydWxlX19Kdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZV9fR3JvdXBfMV80XzBfMF9fMCApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIyMjY0OjI6ICggcnVsZV9fSnZtUGFyYW1ldGVyaXplZFR5cGVSZWZlcmVuY2VfX0dyb3VwXzFfNF8wXzBfXzAgKQogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRKdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZUFjY2VzcygpLmdldEdyb3VwXzFfNF8wXzAoKSk7IAogICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjA5Mjc6MjogKCBydWxlX19Kdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZV9fR3JvdXBfMV80XzBfMF9fMCApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMDkyNzozOiBydWxlX19Kdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZV9fR3JvdXBfMV80XzBfMF9fMAorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjIyNjU6MjogKCBydWxlX19Kdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZV9fR3JvdXBfMV80XzBfMF9fMCApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMjI2NTozOiBydWxlX19Kdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZV9fR3JvdXBfMV80XzBfMF9fMAogICAgICAgICAgICAgewogICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMik7CiAgICAgICAgICAgICBydWxlX19Kdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZV9fR3JvdXBfMV80XzBfMF9fMCgpOwpAQCAtNjg3MzMsMTYgKzczMTkwLDE2IEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fSnZtUGFyYW1ldGVyaXplZFR5cGVSZWZlcmVuY2VfX0dyb3VwXzFfNF8wXzBfXzAiCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjA5MzY6MTogcnVsZV9fSnZtUGFyYW1ldGVyaXplZFR5cGVSZWZlcmVuY2VfX0dyb3VwXzFfNF8wXzBfXzAgOiBydWxlX19Kdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZV9fR3JvdXBfMV80XzBfMF9fMF9fSW1wbCBydWxlX19Kdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZV9fR3JvdXBfMV80XzBfMF9fMSA7CisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjIyNzQ6MTogcnVsZV9fSnZtUGFyYW1ldGVyaXplZFR5cGVSZWZlcmVuY2VfX0dyb3VwXzFfNF8wXzBfXzAgOiBydWxlX19Kdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZV9fR3JvdXBfMV80XzBfMF9fMF9fSW1wbCBydWxlX19Kdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZV9fR3JvdXBfMV80XzBfMF9fMSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fSnZtUGFyYW1ldGVyaXplZFR5cGVSZWZlcmVuY2VfX0dyb3VwXzFfNF8wXzBfXzAoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjA5NDA6MTogKCBydWxlX19Kdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZV9fR3JvdXBfMV80XzBfMF9fMF9fSW1wbCBydWxlX19Kdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZV9fR3JvdXBfMV80XzBfMF9fMSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMDk0MToyOiBydWxlX19Kdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZV9fR3JvdXBfMV80XzBfMF9fMF9fSW1wbCBydWxlX19Kdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZV9fR3JvdXBfMV80XzBfMF9fMQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjIyNzg6MTogKCBydWxlX19Kdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZV9fR3JvdXBfMV80XzBfMF9fMF9fSW1wbCBydWxlX19Kdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZV9fR3JvdXBfMV80XzBfMF9fMSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMjI3OToyOiBydWxlX19Kdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZV9fR3JvdXBfMV80XzBfMF9fMF9fSW1wbCBydWxlX19Kdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZV9fR3JvdXBfMV80XzBfMF9fMQogICAgICAgICAgICAgewotICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfNjIpOworICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfNzApOwogICAgICAgICAgICAgcnVsZV9fSnZtUGFyYW1ldGVyaXplZFR5cGVSZWZlcmVuY2VfX0dyb3VwXzFfNF8wXzBfXzBfX0ltcGwoKTsKIAogICAgICAgICAgICAgc3RhdGUuX2ZzcC0tOwpAQCAtNjg3NzEsMjMgKzczMjI4LDIzIEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fSnZtUGFyYW1ldGVyaXplZFR5cGVSZWZlcmVuY2VfX0dyb3VwXzFfNF8wXzBfXzBfX0ltcGwiCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjA5NDg6MTogcnVsZV9fSnZtUGFyYW1ldGVyaXplZFR5cGVSZWZlcmVuY2VfX0dyb3VwXzFfNF8wXzBfXzBfX0ltcGwgOiAoICgpICkgOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIyMjg2OjE6IHJ1bGVfX0p2bVBhcmFtZXRlcml6ZWRUeXBlUmVmZXJlbmNlX19Hcm91cF8xXzRfMF8wX18wX19JbXBsIDogKCAoKSApIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19Kdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZV9fR3JvdXBfMV80XzBfMF9fMF9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMDk1MjoxOiAoICggKCkgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMDk1MzoxOiAoICgpICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIyMjkwOjE6ICggKCAoKSApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIyMjkxOjE6ICggKCkgKQogICAgICAgICAgICAgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjA5NTM6MTogKCAoKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMDk1NDoyOiAoKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjIyOTE6MTogKCAoKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMjI5MjoyOiAoKQogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRKdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZUFjY2VzcygpLmdldEp2bUlubmVyVHlwZVJlZmVyZW5jZU91dGVyQWN0aW9uXzFfNF8wXzBfMCgpKTsgCiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMDk1NToyOiAoKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjA5NTU6MzogCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMjI5MzoyOiAoKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjIyOTM6MzogCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICB9CiAKQEAgLTY4ODEyLDE0ICs3MzI2OSwxNCBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX0p2bVBhcmFtZXRlcml6ZWRUeXBlUmVmZXJlbmNlX19Hcm91cF8xXzRfMF8wX18xIgotICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIwOTYzOjE6IHJ1bGVfX0p2bVBhcmFtZXRlcml6ZWRUeXBlUmVmZXJlbmNlX19Hcm91cF8xXzRfMF8wX18xIDogcnVsZV9fSnZtUGFyYW1ldGVyaXplZFR5cGVSZWZlcmVuY2VfX0dyb3VwXzFfNF8wXzBfXzFfX0ltcGwgOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIyMzAxOjE6IHJ1bGVfX0p2bVBhcmFtZXRlcml6ZWRUeXBlUmVmZXJlbmNlX19Hcm91cF8xXzRfMF8wX18xIDogcnVsZV9fSnZtUGFyYW1ldGVyaXplZFR5cGVSZWZlcmVuY2VfX0dyb3VwXzFfNF8wXzBfXzFfX0ltcGwgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX0p2bVBhcmFtZXRlcml6ZWRUeXBlUmVmZXJlbmNlX19Hcm91cF8xXzRfMF8wX18xKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIwOTY3OjE6ICggcnVsZV9fSnZtUGFyYW1ldGVyaXplZFR5cGVSZWZlcmVuY2VfX0dyb3VwXzFfNF8wXzBfXzFfX0ltcGwgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjA5Njg6MjogcnVsZV9fSnZtUGFyYW1ldGVyaXplZFR5cGVSZWZlcmVuY2VfX0dyb3VwXzFfNF8wXzBfXzFfX0ltcGwKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIyMzA1OjE6ICggcnVsZV9fSnZtUGFyYW1ldGVyaXplZFR5cGVSZWZlcmVuY2VfX0dyb3VwXzFfNF8wXzBfXzFfX0ltcGwgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjIzMDY6MjogcnVsZV9fSnZtUGFyYW1ldGVyaXplZFR5cGVSZWZlcmVuY2VfX0dyb3VwXzFfNF8wXzBfXzFfX0ltcGwKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzIpOwogICAgICAgICAgICAgcnVsZV9fSnZtUGFyYW1ldGVyaXplZFR5cGVSZWZlcmVuY2VfX0dyb3VwXzFfNF8wXzBfXzFfX0ltcGwoKTsKQEAgLTY4ODQ1LDE3ICs3MzMwMiwxNyBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX0p2bVBhcmFtZXRlcml6ZWRUeXBlUmVmZXJlbmNlX19Hcm91cF8xXzRfMF8wX18xX19JbXBsIgotICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIwOTc0OjE6IHJ1bGVfX0p2bVBhcmFtZXRlcml6ZWRUeXBlUmVmZXJlbmNlX19Hcm91cF8xXzRfMF8wX18xX19JbXBsIDogKCAnLicgKSA7CisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjIzMTI6MTogcnVsZV9fSnZtUGFyYW1ldGVyaXplZFR5cGVSZWZlcmVuY2VfX0dyb3VwXzFfNF8wXzBfXzFfX0ltcGwgOiAoICcuJyApIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19Kdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZV9fR3JvdXBfMV80XzBfMF9fMV9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMDk3ODoxOiAoICggJy4nICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjA5Nzk6MTogKCAnLicgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjIzMTY6MTogKCAoICcuJyApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIyMzE3OjE6ICggJy4nICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIwOTc5OjE6ICggJy4nICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIwOTgwOjI6ICcuJworICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjIzMTc6MTogKCAnLicgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjIzMTg6MjogJy4nCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldEp2bVBhcmFtZXRlcml6ZWRUeXBlUmVmZXJlbmNlQWNjZXNzKCkuZ2V0RnVsbFN0b3BLZXl3b3JkXzFfNF8wXzBfMSgpKTsgCkBAIC02ODg4NiwxNiArNzMzNDMsMTYgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19Kdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZV9fR3JvdXBfMV80XzJfXzAiCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjA5OTA6MTogcnVsZV9fSnZtUGFyYW1ldGVyaXplZFR5cGVSZWZlcmVuY2VfX0dyb3VwXzFfNF8yX18wIDogcnVsZV9fSnZtUGFyYW1ldGVyaXplZFR5cGVSZWZlcmVuY2VfX0dyb3VwXzFfNF8yX18wX19JbXBsIHJ1bGVfX0p2bVBhcmFtZXRlcml6ZWRUeXBlUmVmZXJlbmNlX19Hcm91cF8xXzRfMl9fMSA7CisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjIzMjg6MTogcnVsZV9fSnZtUGFyYW1ldGVyaXplZFR5cGVSZWZlcmVuY2VfX0dyb3VwXzFfNF8yX18wIDogcnVsZV9fSnZtUGFyYW1ldGVyaXplZFR5cGVSZWZlcmVuY2VfX0dyb3VwXzFfNF8yX18wX19JbXBsIHJ1bGVfX0p2bVBhcmFtZXRlcml6ZWRUeXBlUmVmZXJlbmNlX19Hcm91cF8xXzRfMl9fMSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fSnZtUGFyYW1ldGVyaXplZFR5cGVSZWZlcmVuY2VfX0dyb3VwXzFfNF8yX18wKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIwOTk0OjE6ICggcnVsZV9fSnZtUGFyYW1ldGVyaXplZFR5cGVSZWZlcmVuY2VfX0dyb3VwXzFfNF8yX18wX19JbXBsIHJ1bGVfX0p2bVBhcmFtZXRlcml6ZWRUeXBlUmVmZXJlbmNlX19Hcm91cF8xXzRfMl9fMSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMDk5NToyOiBydWxlX19Kdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZV9fR3JvdXBfMV80XzJfXzBfX0ltcGwgcnVsZV9fSnZtUGFyYW1ldGVyaXplZFR5cGVSZWZlcmVuY2VfX0dyb3VwXzFfNF8yX18xCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMjMzMjoxOiAoIHJ1bGVfX0p2bVBhcmFtZXRlcml6ZWRUeXBlUmVmZXJlbmNlX19Hcm91cF8xXzRfMl9fMF9fSW1wbCBydWxlX19Kdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZV9fR3JvdXBfMV80XzJfXzEgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjIzMzM6MjogcnVsZV9fSnZtUGFyYW1ldGVyaXplZFR5cGVSZWZlcmVuY2VfX0dyb3VwXzFfNF8yX18wX19JbXBsIHJ1bGVfX0p2bVBhcmFtZXRlcml6ZWRUeXBlUmVmZXJlbmNlX19Hcm91cF8xXzRfMl9fMQogICAgICAgICAgICAgewotICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMTEwKTsKKyAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzExOCk7CiAgICAgICAgICAgICBydWxlX19Kdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZV9fR3JvdXBfMV80XzJfXzBfX0ltcGwoKTsKIAogICAgICAgICAgICAgc3RhdGUuX2ZzcC0tOwpAQCAtNjg5MjQsMjMgKzczMzgxLDIzIEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fSnZtUGFyYW1ldGVyaXplZFR5cGVSZWZlcmVuY2VfX0dyb3VwXzFfNF8yX18wX19JbXBsIgotICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIxMDAyOjE6IHJ1bGVfX0p2bVBhcmFtZXRlcml6ZWRUeXBlUmVmZXJlbmNlX19Hcm91cF8xXzRfMl9fMF9fSW1wbCA6ICggKCAnPCcgKSApIDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMjM0MDoxOiBydWxlX19Kdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZV9fR3JvdXBfMV80XzJfXzBfX0ltcGwgOiAoICggJzwnICkgKSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fSnZtUGFyYW1ldGVyaXplZFR5cGVSZWZlcmVuY2VfX0dyb3VwXzFfNF8yX18wX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIxMDA2OjE6ICggKCAoICc8JyApICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjEwMDc6MTogKCAoICc8JyApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIyMzQ0OjE6ICggKCAoICc8JyApICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjIzNDU6MTogKCAoICc8JyApICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIxMDA3OjE6ICggKCAnPCcgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMTAwODoyOiAoICc8JyApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMjM0NToxOiAoICggJzwnICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjIzNDY6MjogKCAnPCcgKQogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRKdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZUFjY2VzcygpLmdldExlc3NUaGFuU2lnbktleXdvcmRfMV80XzJfMCgpKTsgCiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMTAwOToyOiAoICc8JyApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMTAwOTozOiAnPCcKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIyMzQ3OjI6ICggJzwnICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIyMzQ3OjM6ICc8JwogICAgICAgICAgICAgewogICAgICAgICAgICAgbWF0Y2goaW5wdXQsMjcsRk9MTE9XXzIpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOwogCkBAIC02ODk3MSwxNiArNzM0MjgsMTYgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19Kdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZV9fR3JvdXBfMV80XzJfXzEiCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjEwMTc6MTogcnVsZV9fSnZtUGFyYW1ldGVyaXplZFR5cGVSZWZlcmVuY2VfX0dyb3VwXzFfNF8yX18xIDogcnVsZV9fSnZtUGFyYW1ldGVyaXplZFR5cGVSZWZlcmVuY2VfX0dyb3VwXzFfNF8yX18xX19JbXBsIHJ1bGVfX0p2bVBhcmFtZXRlcml6ZWRUeXBlUmVmZXJlbmNlX19Hcm91cF8xXzRfMl9fMiA7CisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjIzNTU6MTogcnVsZV9fSnZtUGFyYW1ldGVyaXplZFR5cGVSZWZlcmVuY2VfX0dyb3VwXzFfNF8yX18xIDogcnVsZV9fSnZtUGFyYW1ldGVyaXplZFR5cGVSZWZlcmVuY2VfX0dyb3VwXzFfNF8yX18xX19JbXBsIHJ1bGVfX0p2bVBhcmFtZXRlcml6ZWRUeXBlUmVmZXJlbmNlX19Hcm91cF8xXzRfMl9fMiA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fSnZtUGFyYW1ldGVyaXplZFR5cGVSZWZlcmVuY2VfX0dyb3VwXzFfNF8yX18xKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIxMDIxOjE6ICggcnVsZV9fSnZtUGFyYW1ldGVyaXplZFR5cGVSZWZlcmVuY2VfX0dyb3VwXzFfNF8yX18xX19JbXBsIHJ1bGVfX0p2bVBhcmFtZXRlcml6ZWRUeXBlUmVmZXJlbmNlX19Hcm91cF8xXzRfMl9fMiApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMTAyMjoyOiBydWxlX19Kdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZV9fR3JvdXBfMV80XzJfXzFfX0ltcGwgcnVsZV9fSnZtUGFyYW1ldGVyaXplZFR5cGVSZWZlcmVuY2VfX0dyb3VwXzFfNF8yX18yCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMjM1OToxOiAoIHJ1bGVfX0p2bVBhcmFtZXRlcml6ZWRUeXBlUmVmZXJlbmNlX19Hcm91cF8xXzRfMl9fMV9fSW1wbCBydWxlX19Kdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZV9fR3JvdXBfMV80XzJfXzIgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjIzNjA6MjogcnVsZV9fSnZtUGFyYW1ldGVyaXplZFR5cGVSZWZlcmVuY2VfX0dyb3VwXzFfNF8yX18xX19JbXBsIHJ1bGVfX0p2bVBhcmFtZXRlcml6ZWRUeXBlUmVmZXJlbmNlX19Hcm91cF8xXzRfMl9fMgogICAgICAgICAgICAgewotICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMTExKTsKKyAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzExOSk7CiAgICAgICAgICAgICBydWxlX19Kdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZV9fR3JvdXBfMV80XzJfXzFfX0ltcGwoKTsKIAogICAgICAgICAgICAgc3RhdGUuX2ZzcC0tOwpAQCAtNjkwMDksMjMgKzczNDY2LDIzIEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fSnZtUGFyYW1ldGVyaXplZFR5cGVSZWZlcmVuY2VfX0dyb3VwXzFfNF8yX18xX19JbXBsIgotICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIxMDI5OjE6IHJ1bGVfX0p2bVBhcmFtZXRlcml6ZWRUeXBlUmVmZXJlbmNlX19Hcm91cF8xXzRfMl9fMV9fSW1wbCA6ICggKCBydWxlX19Kdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZV9fQXJndW1lbnRzQXNzaWdubWVudF8xXzRfMl8xICkgKSA7CisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjIzNjc6MTogcnVsZV9fSnZtUGFyYW1ldGVyaXplZFR5cGVSZWZlcmVuY2VfX0dyb3VwXzFfNF8yX18xX19JbXBsIDogKCAoIHJ1bGVfX0p2bVBhcmFtZXRlcml6ZWRUeXBlUmVmZXJlbmNlX19Bcmd1bWVudHNBc3NpZ25tZW50XzFfNF8yXzEgKSApIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19Kdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZV9fR3JvdXBfMV80XzJfXzFfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjEwMzM6MTogKCAoICggcnVsZV9fSnZtUGFyYW1ldGVyaXplZFR5cGVSZWZlcmVuY2VfX0FyZ3VtZW50c0Fzc2lnbm1lbnRfMV80XzJfMSApICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjEwMzQ6MTogKCAoIHJ1bGVfX0p2bVBhcmFtZXRlcml6ZWRUeXBlUmVmZXJlbmNlX19Bcmd1bWVudHNBc3NpZ25tZW50XzFfNF8yXzEgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMjM3MToxOiAoICggKCBydWxlX19Kdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZV9fQXJndW1lbnRzQXNzaWdubWVudF8xXzRfMl8xICkgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMjM3MjoxOiAoICggcnVsZV9fSnZtUGFyYW1ldGVyaXplZFR5cGVSZWZlcmVuY2VfX0FyZ3VtZW50c0Fzc2lnbm1lbnRfMV80XzJfMSApICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIxMDM0OjE6ICggKCBydWxlX19Kdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZV9fQXJndW1lbnRzQXNzaWdubWVudF8xXzRfMl8xICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjEwMzU6MjogKCBydWxlX19Kdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZV9fQXJndW1lbnRzQXNzaWdubWVudF8xXzRfMl8xICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIyMzcyOjE6ICggKCBydWxlX19Kdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZV9fQXJndW1lbnRzQXNzaWdubWVudF8xXzRfMl8xICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjIzNzM6MjogKCBydWxlX19Kdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZV9fQXJndW1lbnRzQXNzaWdubWVudF8xXzRfMl8xICkKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0SnZtUGFyYW1ldGVyaXplZFR5cGVSZWZlcmVuY2VBY2Nlc3MoKS5nZXRBcmd1bWVudHNBc3NpZ25tZW50XzFfNF8yXzEoKSk7IAogICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjEwMzY6MjogKCBydWxlX19Kdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZV9fQXJndW1lbnRzQXNzaWdubWVudF8xXzRfMl8xICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIxMDM2OjM6IHJ1bGVfX0p2bVBhcmFtZXRlcml6ZWRUeXBlUmVmZXJlbmNlX19Bcmd1bWVudHNBc3NpZ25tZW50XzFfNF8yXzEKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIyMzc0OjI6ICggcnVsZV9fSnZtUGFyYW1ldGVyaXplZFR5cGVSZWZlcmVuY2VfX0FyZ3VtZW50c0Fzc2lnbm1lbnRfMV80XzJfMSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMjM3NDozOiBydWxlX19Kdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZV9fQXJndW1lbnRzQXNzaWdubWVudF8xXzRfMl8xCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV18yKTsKICAgICAgICAgICAgIHJ1bGVfX0p2bVBhcmFtZXRlcml6ZWRUeXBlUmVmZXJlbmNlX19Bcmd1bWVudHNBc3NpZ25tZW50XzFfNF8yXzEoKTsKQEAgLTY5MDYwLDE2ICs3MzUxNywxNiBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX0p2bVBhcmFtZXRlcml6ZWRUeXBlUmVmZXJlbmNlX19Hcm91cF8xXzRfMl9fMiIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMTA0NDoxOiBydWxlX19Kdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZV9fR3JvdXBfMV80XzJfXzIgOiBydWxlX19Kdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZV9fR3JvdXBfMV80XzJfXzJfX0ltcGwgcnVsZV9fSnZtUGFyYW1ldGVyaXplZFR5cGVSZWZlcmVuY2VfX0dyb3VwXzFfNF8yX18zIDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMjM4MjoxOiBydWxlX19Kdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZV9fR3JvdXBfMV80XzJfXzIgOiBydWxlX19Kdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZV9fR3JvdXBfMV80XzJfXzJfX0ltcGwgcnVsZV9fSnZtUGFyYW1ldGVyaXplZFR5cGVSZWZlcmVuY2VfX0dyb3VwXzFfNF8yX18zIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19Kdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZV9fR3JvdXBfMV80XzJfXzIoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjEwNDg6MTogKCBydWxlX19Kdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZV9fR3JvdXBfMV80XzJfXzJfX0ltcGwgcnVsZV9fSnZtUGFyYW1ldGVyaXplZFR5cGVSZWZlcmVuY2VfX0dyb3VwXzFfNF8yX18zICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIxMDQ5OjI6IHJ1bGVfX0p2bVBhcmFtZXRlcml6ZWRUeXBlUmVmZXJlbmNlX19Hcm91cF8xXzRfMl9fMl9fSW1wbCBydWxlX19Kdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZV9fR3JvdXBfMV80XzJfXzMKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIyMzg2OjE6ICggcnVsZV9fSnZtUGFyYW1ldGVyaXplZFR5cGVSZWZlcmVuY2VfX0dyb3VwXzFfNF8yX18yX19JbXBsIHJ1bGVfX0p2bVBhcmFtZXRlcml6ZWRUeXBlUmVmZXJlbmNlX19Hcm91cF8xXzRfMl9fMyApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMjM4NzoyOiBydWxlX19Kdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZV9fR3JvdXBfMV80XzJfXzJfX0ltcGwgcnVsZV9fSnZtUGFyYW1ldGVyaXplZFR5cGVSZWZlcmVuY2VfX0dyb3VwXzFfNF8yX18zCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV18xMTEpOworICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMTE5KTsKICAgICAgICAgICAgIHJ1bGVfX0p2bVBhcmFtZXRlcml6ZWRUeXBlUmVmZXJlbmNlX19Hcm91cF8xXzRfMl9fMl9fSW1wbCgpOwogCiAgICAgICAgICAgICBzdGF0ZS5fZnNwLS07CkBAIC02OTA5OCwzNyArNzM1NTUsMzcgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19Kdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZV9fR3JvdXBfMV80XzJfXzJfX0ltcGwiCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjEwNTY6MTogcnVsZV9fSnZtUGFyYW1ldGVyaXplZFR5cGVSZWZlcmVuY2VfX0dyb3VwXzFfNF8yX18yX19JbXBsIDogKCAoIHJ1bGVfX0p2bVBhcmFtZXRlcml6ZWRUeXBlUmVmZXJlbmNlX19Hcm91cF8xXzRfMl8yX18wICkqICkgOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIyMzk0OjE6IHJ1bGVfX0p2bVBhcmFtZXRlcml6ZWRUeXBlUmVmZXJlbmNlX19Hcm91cF8xXzRfMl9fMl9fSW1wbCA6ICggKCBydWxlX19Kdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZV9fR3JvdXBfMV80XzJfMl9fMCApKiApIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19Kdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZV9fR3JvdXBfMV80XzJfXzJfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjEwNjA6MTogKCAoICggcnVsZV9fSnZtUGFyYW1ldGVyaXplZFR5cGVSZWZlcmVuY2VfX0dyb3VwXzFfNF8yXzJfXzAgKSogKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMTA2MToxOiAoICggcnVsZV9fSnZtUGFyYW1ldGVyaXplZFR5cGVSZWZlcmVuY2VfX0dyb3VwXzFfNF8yXzJfXzAgKSogKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjIzOTg6MTogKCAoICggcnVsZV9fSnZtUGFyYW1ldGVyaXplZFR5cGVSZWZlcmVuY2VfX0dyb3VwXzFfNF8yXzJfXzAgKSogKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMjM5OToxOiAoICggcnVsZV9fSnZtUGFyYW1ldGVyaXplZFR5cGVSZWZlcmVuY2VfX0dyb3VwXzFfNF8yXzJfXzAgKSogKQogICAgICAgICAgICAgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjEwNjE6MTogKCAoIHJ1bGVfX0p2bVBhcmFtZXRlcml6ZWRUeXBlUmVmZXJlbmNlX19Hcm91cF8xXzRfMl8yX18wICkqICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIxMDYyOjI6ICggcnVsZV9fSnZtUGFyYW1ldGVyaXplZFR5cGVSZWZlcmVuY2VfX0dyb3VwXzFfNF8yXzJfXzAgKSoKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIyMzk5OjE6ICggKCBydWxlX19Kdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZV9fR3JvdXBfMV80XzJfMl9fMCApKiApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMjQwMDoyOiAoIHJ1bGVfX0p2bVBhcmFtZXRlcml6ZWRUeXBlUmVmZXJlbmNlX19Hcm91cF8xXzRfMl8yX18wICkqCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldEp2bVBhcmFtZXRlcml6ZWRUeXBlUmVmZXJlbmNlQWNjZXNzKCkuZ2V0R3JvdXBfMV80XzJfMigpKTsgCiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMTA2MzoyOiAoIHJ1bGVfX0p2bVBhcmFtZXRlcml6ZWRUeXBlUmVmZXJlbmNlX19Hcm91cF8xXzRfMl8yX18wICkqCi0gICAgICAgICAgICBsb29wMTY1OgorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjI0MDE6MjogKCBydWxlX19Kdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZV9fR3JvdXBfMV80XzJfMl9fMCApKgorICAgICAgICAgICAgbG9vcDE3ODoKICAgICAgICAgICAgIGRvIHsKLSAgICAgICAgICAgICAgICBpbnQgYWx0MTY1PTI7Ci0gICAgICAgICAgICAgICAgaW50IExBMTY1XzAgPSBpbnB1dC5MQSgxKTsKKyAgICAgICAgICAgICAgICBpbnQgYWx0MTc4PTI7CisgICAgICAgICAgICAgICAgaW50IExBMTc4XzAgPSBpbnB1dC5MQSgxKTsKIAotICAgICAgICAgICAgICAgIGlmICggKExBMTY1XzA9PTExNSkgKSB7Ci0gICAgICAgICAgICAgICAgICAgIGFsdDE2NT0xOworICAgICAgICAgICAgICAgIGlmICggKExBMTc4XzA9PTEyNSkgKSB7CisgICAgICAgICAgICAgICAgICAgIGFsdDE3OD0xOwogICAgICAgICAgICAgICAgIH0KIAogCi0gICAgICAgICAgICAgICAgc3dpdGNoIChhbHQxNjUpIHsKKyAgICAgICAgICAgICAgICBzd2l0Y2ggKGFsdDE3OCkgewogICAgICAgICAgICAgCWNhc2UgMSA6Ci0gICAgICAgICAgICAJICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIxMDYzOjM6IHJ1bGVfX0p2bVBhcmFtZXRlcml6ZWRUeXBlUmVmZXJlbmNlX19Hcm91cF8xXzRfMl8yX18wCisgICAgICAgICAgICAJICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIyNDAxOjM6IHJ1bGVfX0p2bVBhcmFtZXRlcml6ZWRUeXBlUmVmZXJlbmNlX19Hcm91cF8xXzRfMl8yX18wCiAgICAgICAgICAgICAJICAgIHsKLSAgICAgICAgICAgIAkgICAgcHVzaEZvbGxvdyhGT0xMT1dfNzMpOworICAgICAgICAgICAgCSAgICBwdXNoRm9sbG93KEZPTExPV184MSk7CiAgICAgICAgICAgICAJICAgIHJ1bGVfX0p2bVBhcmFtZXRlcml6ZWRUeXBlUmVmZXJlbmNlX19Hcm91cF8xXzRfMl8yX18wKCk7CiAKICAgICAgICAgICAgIAkgICAgc3RhdGUuX2ZzcC0tOwpAQCAtNjkxMzgsNyArNzM1OTUsNyBAQAogICAgICAgICAgICAgCSAgICBicmVhazsKIAogICAgICAgICAgICAgCWRlZmF1bHQgOgotICAgICAgICAgICAgCSAgICBicmVhayBsb29wMTY1OworICAgICAgICAgICAgCSAgICBicmVhayBsb29wMTc4OwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0gd2hpbGUgKHRydWUpOwogCkBAIC02OTE2NywxNCArNzM2MjQsMTQgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19Kdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZV9fR3JvdXBfMV80XzJfXzMiCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjEwNzE6MTogcnVsZV9fSnZtUGFyYW1ldGVyaXplZFR5cGVSZWZlcmVuY2VfX0dyb3VwXzFfNF8yX18zIDogcnVsZV9fSnZtUGFyYW1ldGVyaXplZFR5cGVSZWZlcmVuY2VfX0dyb3VwXzFfNF8yX18zX19JbXBsIDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMjQwOToxOiBydWxlX19Kdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZV9fR3JvdXBfMV80XzJfXzMgOiBydWxlX19Kdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZV9fR3JvdXBfMV80XzJfXzNfX0ltcGwgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX0p2bVBhcmFtZXRlcml6ZWRUeXBlUmVmZXJlbmNlX19Hcm91cF8xXzRfMl9fMygpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMTA3NToxOiAoIHJ1bGVfX0p2bVBhcmFtZXRlcml6ZWRUeXBlUmVmZXJlbmNlX19Hcm91cF8xXzRfMl9fM19fSW1wbCApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMTA3NjoyOiBydWxlX19Kdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZV9fR3JvdXBfMV80XzJfXzNfX0ltcGwKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIyNDEzOjE6ICggcnVsZV9fSnZtUGFyYW1ldGVyaXplZFR5cGVSZWZlcmVuY2VfX0dyb3VwXzFfNF8yX18zX19JbXBsICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIyNDE0OjI6IHJ1bGVfX0p2bVBhcmFtZXRlcml6ZWRUeXBlUmVmZXJlbmNlX19Hcm91cF8xXzRfMl9fM19fSW1wbAogICAgICAgICAgICAgewogICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMik7CiAgICAgICAgICAgICBydWxlX19Kdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZV9fR3JvdXBfMV80XzJfXzNfX0ltcGwoKTsKQEAgLTY5MjAwLDE3ICs3MzY1NywxNyBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX0p2bVBhcmFtZXRlcml6ZWRUeXBlUmVmZXJlbmNlX19Hcm91cF8xXzRfMl9fM19fSW1wbCIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMTA4MjoxOiBydWxlX19Kdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZV9fR3JvdXBfMV80XzJfXzNfX0ltcGwgOiAoICc+JyApIDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMjQyMDoxOiBydWxlX19Kdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZV9fR3JvdXBfMV80XzJfXzNfX0ltcGwgOiAoICc+JyApIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19Kdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZV9fR3JvdXBfMV80XzJfXzNfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjEwODY6MTogKCAoICc+JyApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIxMDg3OjE6ICggJz4nICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIyNDI0OjE6ICggKCAnPicgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMjQyNToxOiAoICc+JyApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMTA4NzoxOiAoICc+JyApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMTA4ODoyOiAnPicKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIyNDI1OjE6ICggJz4nICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIyNDI2OjI6ICc+JwogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRKdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZUFjY2VzcygpLmdldEdyZWF0ZXJUaGFuU2lnbktleXdvcmRfMV80XzJfMygpKTsgCkBAIC02OTI0MSwxNiArNzM2OTgsMTYgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19Kdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZV9fR3JvdXBfMV80XzJfMl9fMCIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMTA5ODoxOiBydWxlX19Kdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZV9fR3JvdXBfMV80XzJfMl9fMCA6IHJ1bGVfX0p2bVBhcmFtZXRlcml6ZWRUeXBlUmVmZXJlbmNlX19Hcm91cF8xXzRfMl8yX18wX19JbXBsIHJ1bGVfX0p2bVBhcmFtZXRlcml6ZWRUeXBlUmVmZXJlbmNlX19Hcm91cF8xXzRfMl8yX18xIDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMjQzNjoxOiBydWxlX19Kdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZV9fR3JvdXBfMV80XzJfMl9fMCA6IHJ1bGVfX0p2bVBhcmFtZXRlcml6ZWRUeXBlUmVmZXJlbmNlX19Hcm91cF8xXzRfMl8yX18wX19JbXBsIHJ1bGVfX0p2bVBhcmFtZXRlcml6ZWRUeXBlUmVmZXJlbmNlX19Hcm91cF8xXzRfMl8yX18xIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19Kdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZV9fR3JvdXBfMV80XzJfMl9fMCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMTEwMjoxOiAoIHJ1bGVfX0p2bVBhcmFtZXRlcml6ZWRUeXBlUmVmZXJlbmNlX19Hcm91cF8xXzRfMl8yX18wX19JbXBsIHJ1bGVfX0p2bVBhcmFtZXRlcml6ZWRUeXBlUmVmZXJlbmNlX19Hcm91cF8xXzRfMl8yX18xICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIxMTAzOjI6IHJ1bGVfX0p2bVBhcmFtZXRlcml6ZWRUeXBlUmVmZXJlbmNlX19Hcm91cF8xXzRfMl8yX18wX19JbXBsIHJ1bGVfX0p2bVBhcmFtZXRlcml6ZWRUeXBlUmVmZXJlbmNlX19Hcm91cF8xXzRfMl8yX18xCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMjQ0MDoxOiAoIHJ1bGVfX0p2bVBhcmFtZXRlcml6ZWRUeXBlUmVmZXJlbmNlX19Hcm91cF8xXzRfMl8yX18wX19JbXBsIHJ1bGVfX0p2bVBhcmFtZXRlcml6ZWRUeXBlUmVmZXJlbmNlX19Hcm91cF8xXzRfMl8yX18xICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIyNDQxOjI6IHJ1bGVfX0p2bVBhcmFtZXRlcml6ZWRUeXBlUmVmZXJlbmNlX19Hcm91cF8xXzRfMl8yX18wX19JbXBsIHJ1bGVfX0p2bVBhcmFtZXRlcml6ZWRUeXBlUmVmZXJlbmNlX19Hcm91cF8xXzRfMl8yX18xCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV18xMTApOworICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMTE4KTsKICAgICAgICAgICAgIHJ1bGVfX0p2bVBhcmFtZXRlcml6ZWRUeXBlUmVmZXJlbmNlX19Hcm91cF8xXzRfMl8yX18wX19JbXBsKCk7CiAKICAgICAgICAgICAgIHN0YXRlLl9mc3AtLTsKQEAgLTY5Mjc5LDIyICs3MzczNiwyMiBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX0p2bVBhcmFtZXRlcml6ZWRUeXBlUmVmZXJlbmNlX19Hcm91cF8xXzRfMl8yX18wX19JbXBsIgotICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIxMTEwOjE6IHJ1bGVfX0p2bVBhcmFtZXRlcml6ZWRUeXBlUmVmZXJlbmNlX19Hcm91cF8xXzRfMl8yX18wX19JbXBsIDogKCAnLCcgKSA7CisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjI0NDg6MTogcnVsZV9fSnZtUGFyYW1ldGVyaXplZFR5cGVSZWZlcmVuY2VfX0dyb3VwXzFfNF8yXzJfXzBfX0ltcGwgOiAoICcsJyApIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19Kdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZV9fR3JvdXBfMV80XzJfMl9fMF9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMTExNDoxOiAoICggJywnICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjExMTU6MTogKCAnLCcgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjI0NTI6MTogKCAoICcsJyApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIyNDUzOjE6ICggJywnICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIxMTE1OjE6ICggJywnICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIxMTE2OjI6ICcsJworICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjI0NTM6MTogKCAnLCcgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjI0NTQ6MjogJywnCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldEp2bVBhcmFtZXRlcml6ZWRUeXBlUmVmZXJlbmNlQWNjZXNzKCkuZ2V0Q29tbWFLZXl3b3JkXzFfNF8yXzJfMCgpKTsgCiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBtYXRjaChpbnB1dCwxMTUsRk9MTE9XXzIpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOworICAgICAgICAgICAgbWF0Y2goaW5wdXQsMTI1LEZPTExPV18yKTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRKdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZUFjY2VzcygpLmdldENvbW1hS2V5d29yZF8xXzRfMl8yXzAoKSk7IAogICAgICAgICAgICAgfQpAQCAtNjkzMjAsMTQgKzczNzc3LDE0IEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fSnZtUGFyYW1ldGVyaXplZFR5cGVSZWZlcmVuY2VfX0dyb3VwXzFfNF8yXzJfXzEiCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjExMjU6MTogcnVsZV9fSnZtUGFyYW1ldGVyaXplZFR5cGVSZWZlcmVuY2VfX0dyb3VwXzFfNF8yXzJfXzEgOiBydWxlX19Kdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZV9fR3JvdXBfMV80XzJfMl9fMV9fSW1wbCA7CisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjI0NjM6MTogcnVsZV9fSnZtUGFyYW1ldGVyaXplZFR5cGVSZWZlcmVuY2VfX0dyb3VwXzFfNF8yXzJfXzEgOiBydWxlX19Kdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZV9fR3JvdXBfMV80XzJfMl9fMV9fSW1wbCA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fSnZtUGFyYW1ldGVyaXplZFR5cGVSZWZlcmVuY2VfX0dyb3VwXzFfNF8yXzJfXzEoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjExMjk6MTogKCBydWxlX19Kdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZV9fR3JvdXBfMV80XzJfMl9fMV9fSW1wbCApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMTEzMDoyOiBydWxlX19Kdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZV9fR3JvdXBfMV80XzJfMl9fMV9fSW1wbAorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjI0Njc6MTogKCBydWxlX19Kdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZV9fR3JvdXBfMV80XzJfMl9fMV9fSW1wbCApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMjQ2ODoyOiBydWxlX19Kdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZV9fR3JvdXBfMV80XzJfMl9fMV9fSW1wbAogICAgICAgICAgICAgewogICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMik7CiAgICAgICAgICAgICBydWxlX19Kdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZV9fR3JvdXBfMV80XzJfMl9fMV9fSW1wbCgpOwpAQCAtNjkzNTMsMjMgKzczODEwLDIzIEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fSnZtUGFyYW1ldGVyaXplZFR5cGVSZWZlcmVuY2VfX0dyb3VwXzFfNF8yXzJfXzFfX0ltcGwiCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjExMzY6MTogcnVsZV9fSnZtUGFyYW1ldGVyaXplZFR5cGVSZWZlcmVuY2VfX0dyb3VwXzFfNF8yXzJfXzFfX0ltcGwgOiAoICggcnVsZV9fSnZtUGFyYW1ldGVyaXplZFR5cGVSZWZlcmVuY2VfX0FyZ3VtZW50c0Fzc2lnbm1lbnRfMV80XzJfMl8xICkgKSA7CisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjI0NzQ6MTogcnVsZV9fSnZtUGFyYW1ldGVyaXplZFR5cGVSZWZlcmVuY2VfX0dyb3VwXzFfNF8yXzJfXzFfX0ltcGwgOiAoICggcnVsZV9fSnZtUGFyYW1ldGVyaXplZFR5cGVSZWZlcmVuY2VfX0FyZ3VtZW50c0Fzc2lnbm1lbnRfMV80XzJfMl8xICkgKSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fSnZtUGFyYW1ldGVyaXplZFR5cGVSZWZlcmVuY2VfX0dyb3VwXzFfNF8yXzJfXzFfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjExNDA6MTogKCAoICggcnVsZV9fSnZtUGFyYW1ldGVyaXplZFR5cGVSZWZlcmVuY2VfX0FyZ3VtZW50c0Fzc2lnbm1lbnRfMV80XzJfMl8xICkgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMTE0MToxOiAoICggcnVsZV9fSnZtUGFyYW1ldGVyaXplZFR5cGVSZWZlcmVuY2VfX0FyZ3VtZW50c0Fzc2lnbm1lbnRfMV80XzJfMl8xICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjI0Nzg6MTogKCAoICggcnVsZV9fSnZtUGFyYW1ldGVyaXplZFR5cGVSZWZlcmVuY2VfX0FyZ3VtZW50c0Fzc2lnbm1lbnRfMV80XzJfMl8xICkgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMjQ3OToxOiAoICggcnVsZV9fSnZtUGFyYW1ldGVyaXplZFR5cGVSZWZlcmVuY2VfX0FyZ3VtZW50c0Fzc2lnbm1lbnRfMV80XzJfMl8xICkgKQogICAgICAgICAgICAgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjExNDE6MTogKCAoIHJ1bGVfX0p2bVBhcmFtZXRlcml6ZWRUeXBlUmVmZXJlbmNlX19Bcmd1bWVudHNBc3NpZ25tZW50XzFfNF8yXzJfMSApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIxMTQyOjI6ICggcnVsZV9fSnZtUGFyYW1ldGVyaXplZFR5cGVSZWZlcmVuY2VfX0FyZ3VtZW50c0Fzc2lnbm1lbnRfMV80XzJfMl8xICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIyNDc5OjE6ICggKCBydWxlX19Kdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZV9fQXJndW1lbnRzQXNzaWdubWVudF8xXzRfMl8yXzEgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMjQ4MDoyOiAoIHJ1bGVfX0p2bVBhcmFtZXRlcml6ZWRUeXBlUmVmZXJlbmNlX19Bcmd1bWVudHNBc3NpZ25tZW50XzFfNF8yXzJfMSApCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldEp2bVBhcmFtZXRlcml6ZWRUeXBlUmVmZXJlbmNlQWNjZXNzKCkuZ2V0QXJndW1lbnRzQXNzaWdubWVudF8xXzRfMl8yXzEoKSk7IAogICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjExNDM6MjogKCBydWxlX19Kdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZV9fQXJndW1lbnRzQXNzaWdubWVudF8xXzRfMl8yXzEgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjExNDM6MzogcnVsZV9fSnZtUGFyYW1ldGVyaXplZFR5cGVSZWZlcmVuY2VfX0FyZ3VtZW50c0Fzc2lnbm1lbnRfMV80XzJfMl8xCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMjQ4MToyOiAoIHJ1bGVfX0p2bVBhcmFtZXRlcml6ZWRUeXBlUmVmZXJlbmNlX19Bcmd1bWVudHNBc3NpZ25tZW50XzFfNF8yXzJfMSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMjQ4MTozOiBydWxlX19Kdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZV9fQXJndW1lbnRzQXNzaWdubWVudF8xXzRfMl8yXzEKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzIpOwogICAgICAgICAgICAgcnVsZV9fSnZtUGFyYW1ldGVyaXplZFR5cGVSZWZlcmVuY2VfX0FyZ3VtZW50c0Fzc2lnbm1lbnRfMV80XzJfMl8xKCk7CkBAIC02OTQwNCwxNiArNzM4NjEsMTYgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19Kdm1XaWxkY2FyZFR5cGVSZWZlcmVuY2VfX0dyb3VwX18wIgotICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIxMTUyOjE6IHJ1bGVfX0p2bVdpbGRjYXJkVHlwZVJlZmVyZW5jZV9fR3JvdXBfXzAgOiBydWxlX19Kdm1XaWxkY2FyZFR5cGVSZWZlcmVuY2VfX0dyb3VwX18wX19JbXBsIHJ1bGVfX0p2bVdpbGRjYXJkVHlwZVJlZmVyZW5jZV9fR3JvdXBfXzEgOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIyNDkwOjE6IHJ1bGVfX0p2bVdpbGRjYXJkVHlwZVJlZmVyZW5jZV9fR3JvdXBfXzAgOiBydWxlX19Kdm1XaWxkY2FyZFR5cGVSZWZlcmVuY2VfX0dyb3VwX18wX19JbXBsIHJ1bGVfX0p2bVdpbGRjYXJkVHlwZVJlZmVyZW5jZV9fR3JvdXBfXzEgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX0p2bVdpbGRjYXJkVHlwZVJlZmVyZW5jZV9fR3JvdXBfXzAoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjExNTY6MTogKCBydWxlX19Kdm1XaWxkY2FyZFR5cGVSZWZlcmVuY2VfX0dyb3VwX18wX19JbXBsIHJ1bGVfX0p2bVdpbGRjYXJkVHlwZVJlZmVyZW5jZV9fR3JvdXBfXzEgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjExNTc6MjogcnVsZV9fSnZtV2lsZGNhcmRUeXBlUmVmZXJlbmNlX19Hcm91cF9fMF9fSW1wbCBydWxlX19Kdm1XaWxkY2FyZFR5cGVSZWZlcmVuY2VfX0dyb3VwX18xCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMjQ5NDoxOiAoIHJ1bGVfX0p2bVdpbGRjYXJkVHlwZVJlZmVyZW5jZV9fR3JvdXBfXzBfX0ltcGwgcnVsZV9fSnZtV2lsZGNhcmRUeXBlUmVmZXJlbmNlX19Hcm91cF9fMSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMjQ5NToyOiBydWxlX19Kdm1XaWxkY2FyZFR5cGVSZWZlcmVuY2VfX0dyb3VwX18wX19JbXBsIHJ1bGVfX0p2bVdpbGRjYXJkVHlwZVJlZmVyZW5jZV9fR3JvdXBfXzEKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzExMCk7CisgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV18xMTgpOwogICAgICAgICAgICAgcnVsZV9fSnZtV2lsZGNhcmRUeXBlUmVmZXJlbmNlX19Hcm91cF9fMF9fSW1wbCgpOwogCiAgICAgICAgICAgICBzdGF0ZS5fZnNwLS07CkBAIC02OTQ0MiwyMyArNzM4OTksMjMgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19Kdm1XaWxkY2FyZFR5cGVSZWZlcmVuY2VfX0dyb3VwX18wX19JbXBsIgotICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIxMTY0OjE6IHJ1bGVfX0p2bVdpbGRjYXJkVHlwZVJlZmVyZW5jZV9fR3JvdXBfXzBfX0ltcGwgOiAoICgpICkgOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIyNTAyOjE6IHJ1bGVfX0p2bVdpbGRjYXJkVHlwZVJlZmVyZW5jZV9fR3JvdXBfXzBfX0ltcGwgOiAoICgpICkgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX0p2bVdpbGRjYXJkVHlwZVJlZmVyZW5jZV9fR3JvdXBfXzBfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjExNjg6MTogKCAoICgpICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjExNjk6MTogKCAoKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMjUwNjoxOiAoICggKCkgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMjUwNzoxOiAoICgpICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIxMTY5OjE6ICggKCkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjExNzA6MjogKCkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIyNTA3OjE6ICggKCkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjI1MDg6MjogKCkKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0SnZtV2lsZGNhcmRUeXBlUmVmZXJlbmNlQWNjZXNzKCkuZ2V0SnZtV2lsZGNhcmRUeXBlUmVmZXJlbmNlQWN0aW9uXzAoKSk7IAogICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjExNzE6MjogKCkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIxMTcxOjM6IAorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjI1MDk6MjogKCkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIyNTA5OjM6IAogICAgICAgICAgICAgewogICAgICAgICAgICAgfQogCkBAIC02OTQ4MywxNiArNzM5NDAsMTYgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19Kdm1XaWxkY2FyZFR5cGVSZWZlcmVuY2VfX0dyb3VwX18xIgotICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIxMTc5OjE6IHJ1bGVfX0p2bVdpbGRjYXJkVHlwZVJlZmVyZW5jZV9fR3JvdXBfXzEgOiBydWxlX19Kdm1XaWxkY2FyZFR5cGVSZWZlcmVuY2VfX0dyb3VwX18xX19JbXBsIHJ1bGVfX0p2bVdpbGRjYXJkVHlwZVJlZmVyZW5jZV9fR3JvdXBfXzIgOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIyNTE3OjE6IHJ1bGVfX0p2bVdpbGRjYXJkVHlwZVJlZmVyZW5jZV9fR3JvdXBfXzEgOiBydWxlX19Kdm1XaWxkY2FyZFR5cGVSZWZlcmVuY2VfX0dyb3VwX18xX19JbXBsIHJ1bGVfX0p2bVdpbGRjYXJkVHlwZVJlZmVyZW5jZV9fR3JvdXBfXzIgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX0p2bVdpbGRjYXJkVHlwZVJlZmVyZW5jZV9fR3JvdXBfXzEoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjExODM6MTogKCBydWxlX19Kdm1XaWxkY2FyZFR5cGVSZWZlcmVuY2VfX0dyb3VwX18xX19JbXBsIHJ1bGVfX0p2bVdpbGRjYXJkVHlwZVJlZmVyZW5jZV9fR3JvdXBfXzIgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjExODQ6MjogcnVsZV9fSnZtV2lsZGNhcmRUeXBlUmVmZXJlbmNlX19Hcm91cF9fMV9fSW1wbCBydWxlX19Kdm1XaWxkY2FyZFR5cGVSZWZlcmVuY2VfX0dyb3VwX18yCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMjUyMToxOiAoIHJ1bGVfX0p2bVdpbGRjYXJkVHlwZVJlZmVyZW5jZV9fR3JvdXBfXzFfX0ltcGwgcnVsZV9fSnZtV2lsZGNhcmRUeXBlUmVmZXJlbmNlX19Hcm91cF9fMiApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMjUyMjoyOiBydWxlX19Kdm1XaWxkY2FyZFR5cGVSZWZlcmVuY2VfX0dyb3VwX18xX19JbXBsIHJ1bGVfX0p2bVdpbGRjYXJkVHlwZVJlZmVyZW5jZV9fR3JvdXBfXzIKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzE1MSk7CisgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV18xNTkpOwogICAgICAgICAgICAgcnVsZV9fSnZtV2lsZGNhcmRUeXBlUmVmZXJlbmNlX19Hcm91cF9fMV9fSW1wbCgpOwogCiAgICAgICAgICAgICBzdGF0ZS5fZnNwLS07CkBAIC02OTUyMSwyMiArNzM5NzgsMjIgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19Kdm1XaWxkY2FyZFR5cGVSZWZlcmVuY2VfX0dyb3VwX18xX19JbXBsIgotICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIxMTkxOjE6IHJ1bGVfX0p2bVdpbGRjYXJkVHlwZVJlZmVyZW5jZV9fR3JvdXBfXzFfX0ltcGwgOiAoICc/JyApIDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMjUyOToxOiBydWxlX19Kdm1XaWxkY2FyZFR5cGVSZWZlcmVuY2VfX0dyb3VwX18xX19JbXBsIDogKCAnPycgKSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fSnZtV2lsZGNhcmRUeXBlUmVmZXJlbmNlX19Hcm91cF9fMV9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMTE5NToxOiAoICggJz8nICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjExOTY6MTogKCAnPycgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjI1MzM6MTogKCAoICc/JyApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIyNTM0OjE6ICggJz8nICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIxMTk2OjE6ICggJz8nICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIxMTk3OjI6ICc/JworICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjI1MzQ6MTogKCAnPycgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjI1MzU6MjogJz8nCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldEp2bVdpbGRjYXJkVHlwZVJlZmVyZW5jZUFjY2VzcygpLmdldFF1ZXN0aW9uTWFya0tleXdvcmRfMSgpKTsgCiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBtYXRjaChpbnB1dCwxMzcsRk9MTE9XXzIpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOworICAgICAgICAgICAgbWF0Y2goaW5wdXQsMTQ3LEZPTExPV18yKTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRKdm1XaWxkY2FyZFR5cGVSZWZlcmVuY2VBY2Nlc3MoKS5nZXRRdWVzdGlvbk1hcmtLZXl3b3JkXzEoKSk7IAogICAgICAgICAgICAgfQpAQCAtNjk1NjIsMTQgKzc0MDE5LDE0IEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fSnZtV2lsZGNhcmRUeXBlUmVmZXJlbmNlX19Hcm91cF9fMiIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMTIwNjoxOiBydWxlX19Kdm1XaWxkY2FyZFR5cGVSZWZlcmVuY2VfX0dyb3VwX18yIDogcnVsZV9fSnZtV2lsZGNhcmRUeXBlUmVmZXJlbmNlX19Hcm91cF9fMl9fSW1wbCA7CisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjI1NDQ6MTogcnVsZV9fSnZtV2lsZGNhcmRUeXBlUmVmZXJlbmNlX19Hcm91cF9fMiA6IHJ1bGVfX0p2bVdpbGRjYXJkVHlwZVJlZmVyZW5jZV9fR3JvdXBfXzJfX0ltcGwgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX0p2bVdpbGRjYXJkVHlwZVJlZmVyZW5jZV9fR3JvdXBfXzIoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjEyMTA6MTogKCBydWxlX19Kdm1XaWxkY2FyZFR5cGVSZWZlcmVuY2VfX0dyb3VwX18yX19JbXBsICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIxMjExOjI6IHJ1bGVfX0p2bVdpbGRjYXJkVHlwZVJlZmVyZW5jZV9fR3JvdXBfXzJfX0ltcGwKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIyNTQ4OjE6ICggcnVsZV9fSnZtV2lsZGNhcmRUeXBlUmVmZXJlbmNlX19Hcm91cF9fMl9fSW1wbCApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMjU0OToyOiBydWxlX19Kdm1XaWxkY2FyZFR5cGVSZWZlcmVuY2VfX0dyb3VwX18yX19JbXBsCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV18yKTsKICAgICAgICAgICAgIHJ1bGVfX0p2bVdpbGRjYXJkVHlwZVJlZmVyZW5jZV9fR3JvdXBfXzJfX0ltcGwoKTsKQEAgLTY5NTk1LDMxICs3NDA1MiwzMSBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX0p2bVdpbGRjYXJkVHlwZVJlZmVyZW5jZV9fR3JvdXBfXzJfX0ltcGwiCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjEyMTc6MTogcnVsZV9fSnZtV2lsZGNhcmRUeXBlUmVmZXJlbmNlX19Hcm91cF9fMl9fSW1wbCA6ICggKCBydWxlX19Kdm1XaWxkY2FyZFR5cGVSZWZlcmVuY2VfX0FsdGVybmF0aXZlc18yICk/ICkgOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIyNTU1OjE6IHJ1bGVfX0p2bVdpbGRjYXJkVHlwZVJlZmVyZW5jZV9fR3JvdXBfXzJfX0ltcGwgOiAoICggcnVsZV9fSnZtV2lsZGNhcmRUeXBlUmVmZXJlbmNlX19BbHRlcm5hdGl2ZXNfMiApPyApIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19Kdm1XaWxkY2FyZFR5cGVSZWZlcmVuY2VfX0dyb3VwX18yX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIxMjIxOjE6ICggKCAoIHJ1bGVfX0p2bVdpbGRjYXJkVHlwZVJlZmVyZW5jZV9fQWx0ZXJuYXRpdmVzXzIgKT8gKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMTIyMjoxOiAoICggcnVsZV9fSnZtV2lsZGNhcmRUeXBlUmVmZXJlbmNlX19BbHRlcm5hdGl2ZXNfMiApPyApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMjU1OToxOiAoICggKCBydWxlX19Kdm1XaWxkY2FyZFR5cGVSZWZlcmVuY2VfX0FsdGVybmF0aXZlc18yICk/ICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjI1NjA6MTogKCAoIHJ1bGVfX0p2bVdpbGRjYXJkVHlwZVJlZmVyZW5jZV9fQWx0ZXJuYXRpdmVzXzIgKT8gKQogICAgICAgICAgICAgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjEyMjI6MTogKCAoIHJ1bGVfX0p2bVdpbGRjYXJkVHlwZVJlZmVyZW5jZV9fQWx0ZXJuYXRpdmVzXzIgKT8gKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjEyMjM6MjogKCBydWxlX19Kdm1XaWxkY2FyZFR5cGVSZWZlcmVuY2VfX0FsdGVybmF0aXZlc18yICk/CisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMjU2MDoxOiAoICggcnVsZV9fSnZtV2lsZGNhcmRUeXBlUmVmZXJlbmNlX19BbHRlcm5hdGl2ZXNfMiApPyApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMjU2MToyOiAoIHJ1bGVfX0p2bVdpbGRjYXJkVHlwZVJlZmVyZW5jZV9fQWx0ZXJuYXRpdmVzXzIgKT8KICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0SnZtV2lsZGNhcmRUeXBlUmVmZXJlbmNlQWNjZXNzKCkuZ2V0QWx0ZXJuYXRpdmVzXzIoKSk7IAogICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjEyMjQ6MjogKCBydWxlX19Kdm1XaWxkY2FyZFR5cGVSZWZlcmVuY2VfX0FsdGVybmF0aXZlc18yICk/Ci0gICAgICAgICAgICBpbnQgYWx0MTY2PTI7Ci0gICAgICAgICAgICBpbnQgTEExNjZfMCA9IGlucHV0LkxBKDEpOworICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjI1NjI6MjogKCBydWxlX19Kdm1XaWxkY2FyZFR5cGVSZWZlcmVuY2VfX0FsdGVybmF0aXZlc18yICk/CisgICAgICAgICAgICBpbnQgYWx0MTc5PTI7CisgICAgICAgICAgICBpbnQgTEExNzlfMCA9IGlucHV0LkxBKDEpOwogCi0gICAgICAgICAgICBpZiAoIChMQTE2Nl8wPT00NXx8TEExNjZfMD09NDkpICkgewotICAgICAgICAgICAgICAgIGFsdDE2Nj0xOworICAgICAgICAgICAgaWYgKCAoTEExNzlfMD09NDV8fExBMTc5XzA9PTQ5KSApIHsKKyAgICAgICAgICAgICAgICBhbHQxNzk9MTsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHN3aXRjaCAoYWx0MTY2KSB7CisgICAgICAgICAgICBzd2l0Y2ggKGFsdDE3OSkgewogICAgICAgICAgICAgICAgIGNhc2UgMSA6Ci0gICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIxMjI0OjM6IHJ1bGVfX0p2bVdpbGRjYXJkVHlwZVJlZmVyZW5jZV9fQWx0ZXJuYXRpdmVzXzIKKyAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjI1NjI6MzogcnVsZV9fSnZtV2lsZGNhcmRUeXBlUmVmZXJlbmNlX19BbHRlcm5hdGl2ZXNfMgogICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzIpOwogICAgICAgICAgICAgICAgICAgICBydWxlX19Kdm1XaWxkY2FyZFR5cGVSZWZlcmVuY2VfX0FsdGVybmF0aXZlc18yKCk7CkBAIC02OTY1NywxNiArNzQxMTQsMTYgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19Kdm1XaWxkY2FyZFR5cGVSZWZlcmVuY2VfX0dyb3VwXzJfMF9fMCIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMTIzMzoxOiBydWxlX19Kdm1XaWxkY2FyZFR5cGVSZWZlcmVuY2VfX0dyb3VwXzJfMF9fMCA6IHJ1bGVfX0p2bVdpbGRjYXJkVHlwZVJlZmVyZW5jZV9fR3JvdXBfMl8wX18wX19JbXBsIHJ1bGVfX0p2bVdpbGRjYXJkVHlwZVJlZmVyZW5jZV9fR3JvdXBfMl8wX18xIDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMjU3MToxOiBydWxlX19Kdm1XaWxkY2FyZFR5cGVSZWZlcmVuY2VfX0dyb3VwXzJfMF9fMCA6IHJ1bGVfX0p2bVdpbGRjYXJkVHlwZVJlZmVyZW5jZV9fR3JvdXBfMl8wX18wX19JbXBsIHJ1bGVfX0p2bVdpbGRjYXJkVHlwZVJlZmVyZW5jZV9fR3JvdXBfMl8wX18xIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19Kdm1XaWxkY2FyZFR5cGVSZWZlcmVuY2VfX0dyb3VwXzJfMF9fMCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMTIzNzoxOiAoIHJ1bGVfX0p2bVdpbGRjYXJkVHlwZVJlZmVyZW5jZV9fR3JvdXBfMl8wX18wX19JbXBsIHJ1bGVfX0p2bVdpbGRjYXJkVHlwZVJlZmVyZW5jZV9fR3JvdXBfMl8wX18xICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIxMjM4OjI6IHJ1bGVfX0p2bVdpbGRjYXJkVHlwZVJlZmVyZW5jZV9fR3JvdXBfMl8wX18wX19JbXBsIHJ1bGVfX0p2bVdpbGRjYXJkVHlwZVJlZmVyZW5jZV9fR3JvdXBfMl8wX18xCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMjU3NToxOiAoIHJ1bGVfX0p2bVdpbGRjYXJkVHlwZVJlZmVyZW5jZV9fR3JvdXBfMl8wX18wX19JbXBsIHJ1bGVfX0p2bVdpbGRjYXJkVHlwZVJlZmVyZW5jZV9fR3JvdXBfMl8wX18xICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIyNTc2OjI6IHJ1bGVfX0p2bVdpbGRjYXJkVHlwZVJlZmVyZW5jZV9fR3JvdXBfMl8wX18wX19JbXBsIHJ1bGVfX0p2bVdpbGRjYXJkVHlwZVJlZmVyZW5jZV9fR3JvdXBfMl8wX18xCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV18xNTIpOworICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMTYwKTsKICAgICAgICAgICAgIHJ1bGVfX0p2bVdpbGRjYXJkVHlwZVJlZmVyZW5jZV9fR3JvdXBfMl8wX18wX19JbXBsKCk7CiAKICAgICAgICAgICAgIHN0YXRlLl9mc3AtLTsKQEAgLTY5Njk1LDIzICs3NDE1MiwyMyBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX0p2bVdpbGRjYXJkVHlwZVJlZmVyZW5jZV9fR3JvdXBfMl8wX18wX19JbXBsIgotICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIxMjQ1OjE6IHJ1bGVfX0p2bVdpbGRjYXJkVHlwZVJlZmVyZW5jZV9fR3JvdXBfMl8wX18wX19JbXBsIDogKCAoIHJ1bGVfX0p2bVdpbGRjYXJkVHlwZVJlZmVyZW5jZV9fQ29uc3RyYWludHNBc3NpZ25tZW50XzJfMF8wICkgKSA7CisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjI1ODM6MTogcnVsZV9fSnZtV2lsZGNhcmRUeXBlUmVmZXJlbmNlX19Hcm91cF8yXzBfXzBfX0ltcGwgOiAoICggcnVsZV9fSnZtV2lsZGNhcmRUeXBlUmVmZXJlbmNlX19Db25zdHJhaW50c0Fzc2lnbm1lbnRfMl8wXzAgKSApIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19Kdm1XaWxkY2FyZFR5cGVSZWZlcmVuY2VfX0dyb3VwXzJfMF9fMF9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMTI0OToxOiAoICggKCBydWxlX19Kdm1XaWxkY2FyZFR5cGVSZWZlcmVuY2VfX0NvbnN0cmFpbnRzQXNzaWdubWVudF8yXzBfMCApICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjEyNTA6MTogKCAoIHJ1bGVfX0p2bVdpbGRjYXJkVHlwZVJlZmVyZW5jZV9fQ29uc3RyYWludHNBc3NpZ25tZW50XzJfMF8wICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjI1ODc6MTogKCAoICggcnVsZV9fSnZtV2lsZGNhcmRUeXBlUmVmZXJlbmNlX19Db25zdHJhaW50c0Fzc2lnbm1lbnRfMl8wXzAgKSApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIyNTg4OjE6ICggKCBydWxlX19Kdm1XaWxkY2FyZFR5cGVSZWZlcmVuY2VfX0NvbnN0cmFpbnRzQXNzaWdubWVudF8yXzBfMCApICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIxMjUwOjE6ICggKCBydWxlX19Kdm1XaWxkY2FyZFR5cGVSZWZlcmVuY2VfX0NvbnN0cmFpbnRzQXNzaWdubWVudF8yXzBfMCApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIxMjUxOjI6ICggcnVsZV9fSnZtV2lsZGNhcmRUeXBlUmVmZXJlbmNlX19Db25zdHJhaW50c0Fzc2lnbm1lbnRfMl8wXzAgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjI1ODg6MTogKCAoIHJ1bGVfX0p2bVdpbGRjYXJkVHlwZVJlZmVyZW5jZV9fQ29uc3RyYWludHNBc3NpZ25tZW50XzJfMF8wICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjI1ODk6MjogKCBydWxlX19Kdm1XaWxkY2FyZFR5cGVSZWZlcmVuY2VfX0NvbnN0cmFpbnRzQXNzaWdubWVudF8yXzBfMCApCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldEp2bVdpbGRjYXJkVHlwZVJlZmVyZW5jZUFjY2VzcygpLmdldENvbnN0cmFpbnRzQXNzaWdubWVudF8yXzBfMCgpKTsgCiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMTI1MjoyOiAoIHJ1bGVfX0p2bVdpbGRjYXJkVHlwZVJlZmVyZW5jZV9fQ29uc3RyYWludHNBc3NpZ25tZW50XzJfMF8wICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIxMjUyOjM6IHJ1bGVfX0p2bVdpbGRjYXJkVHlwZVJlZmVyZW5jZV9fQ29uc3RyYWludHNBc3NpZ25tZW50XzJfMF8wCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMjU5MDoyOiAoIHJ1bGVfX0p2bVdpbGRjYXJkVHlwZVJlZmVyZW5jZV9fQ29uc3RyYWludHNBc3NpZ25tZW50XzJfMF8wICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIyNTkwOjM6IHJ1bGVfX0p2bVdpbGRjYXJkVHlwZVJlZmVyZW5jZV9fQ29uc3RyYWludHNBc3NpZ25tZW50XzJfMF8wCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV18yKTsKICAgICAgICAgICAgIHJ1bGVfX0p2bVdpbGRjYXJkVHlwZVJlZmVyZW5jZV9fQ29uc3RyYWludHNBc3NpZ25tZW50XzJfMF8wKCk7CkBAIC02OTc0NiwxNCArNzQyMDMsMTQgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19Kdm1XaWxkY2FyZFR5cGVSZWZlcmVuY2VfX0dyb3VwXzJfMF9fMSIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMTI2MDoxOiBydWxlX19Kdm1XaWxkY2FyZFR5cGVSZWZlcmVuY2VfX0dyb3VwXzJfMF9fMSA6IHJ1bGVfX0p2bVdpbGRjYXJkVHlwZVJlZmVyZW5jZV9fR3JvdXBfMl8wX18xX19JbXBsIDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMjU5ODoxOiBydWxlX19Kdm1XaWxkY2FyZFR5cGVSZWZlcmVuY2VfX0dyb3VwXzJfMF9fMSA6IHJ1bGVfX0p2bVdpbGRjYXJkVHlwZVJlZmVyZW5jZV9fR3JvdXBfMl8wX18xX19JbXBsIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19Kdm1XaWxkY2FyZFR5cGVSZWZlcmVuY2VfX0dyb3VwXzJfMF9fMSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMTI2NDoxOiAoIHJ1bGVfX0p2bVdpbGRjYXJkVHlwZVJlZmVyZW5jZV9fR3JvdXBfMl8wX18xX19JbXBsICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIxMjY1OjI6IHJ1bGVfX0p2bVdpbGRjYXJkVHlwZVJlZmVyZW5jZV9fR3JvdXBfMl8wX18xX19JbXBsCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMjYwMjoxOiAoIHJ1bGVfX0p2bVdpbGRjYXJkVHlwZVJlZmVyZW5jZV9fR3JvdXBfMl8wX18xX19JbXBsICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIyNjAzOjI6IHJ1bGVfX0p2bVdpbGRjYXJkVHlwZVJlZmVyZW5jZV9fR3JvdXBfMl8wX18xX19JbXBsCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV18yKTsKICAgICAgICAgICAgIHJ1bGVfX0p2bVdpbGRjYXJkVHlwZVJlZmVyZW5jZV9fR3JvdXBfMl8wX18xX19JbXBsKCk7CkBAIC02OTc3OSwzNyArNzQyMzYsMzcgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19Kdm1XaWxkY2FyZFR5cGVSZWZlcmVuY2VfX0dyb3VwXzJfMF9fMV9fSW1wbCIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMTI3MToxOiBydWxlX19Kdm1XaWxkY2FyZFR5cGVSZWZlcmVuY2VfX0dyb3VwXzJfMF9fMV9fSW1wbCA6ICggKCBydWxlX19Kdm1XaWxkY2FyZFR5cGVSZWZlcmVuY2VfX0NvbnN0cmFpbnRzQXNzaWdubWVudF8yXzBfMSApKiApIDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMjYwOToxOiBydWxlX19Kdm1XaWxkY2FyZFR5cGVSZWZlcmVuY2VfX0dyb3VwXzJfMF9fMV9fSW1wbCA6ICggKCBydWxlX19Kdm1XaWxkY2FyZFR5cGVSZWZlcmVuY2VfX0NvbnN0cmFpbnRzQXNzaWdubWVudF8yXzBfMSApKiApIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19Kdm1XaWxkY2FyZFR5cGVSZWZlcmVuY2VfX0dyb3VwXzJfMF9fMV9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMTI3NToxOiAoICggKCBydWxlX19Kdm1XaWxkY2FyZFR5cGVSZWZlcmVuY2VfX0NvbnN0cmFpbnRzQXNzaWdubWVudF8yXzBfMSApKiApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIxMjc2OjE6ICggKCBydWxlX19Kdm1XaWxkY2FyZFR5cGVSZWZlcmVuY2VfX0NvbnN0cmFpbnRzQXNzaWdubWVudF8yXzBfMSApKiApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMjYxMzoxOiAoICggKCBydWxlX19Kdm1XaWxkY2FyZFR5cGVSZWZlcmVuY2VfX0NvbnN0cmFpbnRzQXNzaWdubWVudF8yXzBfMSApKiApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIyNjE0OjE6ICggKCBydWxlX19Kdm1XaWxkY2FyZFR5cGVSZWZlcmVuY2VfX0NvbnN0cmFpbnRzQXNzaWdubWVudF8yXzBfMSApKiApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMTI3NjoxOiAoICggcnVsZV9fSnZtV2lsZGNhcmRUeXBlUmVmZXJlbmNlX19Db25zdHJhaW50c0Fzc2lnbm1lbnRfMl8wXzEgKSogKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjEyNzc6MjogKCBydWxlX19Kdm1XaWxkY2FyZFR5cGVSZWZlcmVuY2VfX0NvbnN0cmFpbnRzQXNzaWdubWVudF8yXzBfMSApKgorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjI2MTQ6MTogKCAoIHJ1bGVfX0p2bVdpbGRjYXJkVHlwZVJlZmVyZW5jZV9fQ29uc3RyYWludHNBc3NpZ25tZW50XzJfMF8xICkqICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIyNjE1OjI6ICggcnVsZV9fSnZtV2lsZGNhcmRUeXBlUmVmZXJlbmNlX19Db25zdHJhaW50c0Fzc2lnbm1lbnRfMl8wXzEgKSoKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0SnZtV2lsZGNhcmRUeXBlUmVmZXJlbmNlQWNjZXNzKCkuZ2V0Q29uc3RyYWludHNBc3NpZ25tZW50XzJfMF8xKCkpOyAKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIxMjc4OjI6ICggcnVsZV9fSnZtV2lsZGNhcmRUeXBlUmVmZXJlbmNlX19Db25zdHJhaW50c0Fzc2lnbm1lbnRfMl8wXzEgKSoKLSAgICAgICAgICAgIGxvb3AxNjc6CisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMjYxNjoyOiAoIHJ1bGVfX0p2bVdpbGRjYXJkVHlwZVJlZmVyZW5jZV9fQ29uc3RyYWludHNBc3NpZ25tZW50XzJfMF8xICkqCisgICAgICAgICAgICBsb29wMTgwOgogICAgICAgICAgICAgZG8gewotICAgICAgICAgICAgICAgIGludCBhbHQxNjc9MjsKLSAgICAgICAgICAgICAgICBpbnQgTEExNjdfMCA9IGlucHV0LkxBKDEpOworICAgICAgICAgICAgICAgIGludCBhbHQxODA9MjsKKyAgICAgICAgICAgICAgICBpbnQgTEExODBfMCA9IGlucHV0LkxBKDEpOwogCi0gICAgICAgICAgICAgICAgaWYgKCAoTEExNjdfMD09MTM4KSApIHsKLSAgICAgICAgICAgICAgICAgICAgYWx0MTY3PTE7CisgICAgICAgICAgICAgICAgaWYgKCAoTEExODBfMD09MTQ4KSApIHsKKyAgICAgICAgICAgICAgICAgICAgYWx0MTgwPTE7CiAgICAgICAgICAgICAgICAgfQogCiAKLSAgICAgICAgICAgICAgICBzd2l0Y2ggKGFsdDE2NykgeworICAgICAgICAgICAgICAgIHN3aXRjaCAoYWx0MTgwKSB7CiAgICAgICAgICAgICAJY2FzZSAxIDoKLSAgICAgICAgICAgIAkgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjEyNzg6MzogcnVsZV9fSnZtV2lsZGNhcmRUeXBlUmVmZXJlbmNlX19Db25zdHJhaW50c0Fzc2lnbm1lbnRfMl8wXzEKKyAgICAgICAgICAgIAkgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjI2MTY6MzogcnVsZV9fSnZtV2lsZGNhcmRUeXBlUmVmZXJlbmNlX19Db25zdHJhaW50c0Fzc2lnbm1lbnRfMl8wXzEKICAgICAgICAgICAgIAkgICAgewotICAgICAgICAgICAgCSAgICBwdXNoRm9sbG93KEZPTExPV18xNTMpOworICAgICAgICAgICAgCSAgICBwdXNoRm9sbG93KEZPTExPV18xNjEpOwogICAgICAgICAgICAgCSAgICBydWxlX19Kdm1XaWxkY2FyZFR5cGVSZWZlcmVuY2VfX0NvbnN0cmFpbnRzQXNzaWdubWVudF8yXzBfMSgpOwogCiAgICAgICAgICAgICAJICAgIHN0YXRlLl9mc3AtLTsKQEAgLTY5ODE5LDcgKzc0Mjc2LDcgQEAKICAgICAgICAgICAgIAkgICAgYnJlYWs7CiAKICAgICAgICAgICAgIAlkZWZhdWx0IDoKLSAgICAgICAgICAgIAkgICAgYnJlYWsgbG9vcDE2NzsKKyAgICAgICAgICAgIAkgICAgYnJlYWsgbG9vcDE4MDsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9IHdoaWxlICh0cnVlKTsKIApAQCAtNjk4NDgsMTYgKzc0MzA1LDE2IEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fSnZtV2lsZGNhcmRUeXBlUmVmZXJlbmNlX19Hcm91cF8yXzFfXzAiCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjEyODc6MTogcnVsZV9fSnZtV2lsZGNhcmRUeXBlUmVmZXJlbmNlX19Hcm91cF8yXzFfXzAgOiBydWxlX19Kdm1XaWxkY2FyZFR5cGVSZWZlcmVuY2VfX0dyb3VwXzJfMV9fMF9fSW1wbCBydWxlX19Kdm1XaWxkY2FyZFR5cGVSZWZlcmVuY2VfX0dyb3VwXzJfMV9fMSA7CisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjI2MjU6MTogcnVsZV9fSnZtV2lsZGNhcmRUeXBlUmVmZXJlbmNlX19Hcm91cF8yXzFfXzAgOiBydWxlX19Kdm1XaWxkY2FyZFR5cGVSZWZlcmVuY2VfX0dyb3VwXzJfMV9fMF9fSW1wbCBydWxlX19Kdm1XaWxkY2FyZFR5cGVSZWZlcmVuY2VfX0dyb3VwXzJfMV9fMSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fSnZtV2lsZGNhcmRUeXBlUmVmZXJlbmNlX19Hcm91cF8yXzFfXzAoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjEyOTE6MTogKCBydWxlX19Kdm1XaWxkY2FyZFR5cGVSZWZlcmVuY2VfX0dyb3VwXzJfMV9fMF9fSW1wbCBydWxlX19Kdm1XaWxkY2FyZFR5cGVSZWZlcmVuY2VfX0dyb3VwXzJfMV9fMSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMTI5MjoyOiBydWxlX19Kdm1XaWxkY2FyZFR5cGVSZWZlcmVuY2VfX0dyb3VwXzJfMV9fMF9fSW1wbCBydWxlX19Kdm1XaWxkY2FyZFR5cGVSZWZlcmVuY2VfX0dyb3VwXzJfMV9fMQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjI2Mjk6MTogKCBydWxlX19Kdm1XaWxkY2FyZFR5cGVSZWZlcmVuY2VfX0dyb3VwXzJfMV9fMF9fSW1wbCBydWxlX19Kdm1XaWxkY2FyZFR5cGVSZWZlcmVuY2VfX0dyb3VwXzJfMV9fMSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMjYzMDoyOiBydWxlX19Kdm1XaWxkY2FyZFR5cGVSZWZlcmVuY2VfX0dyb3VwXzJfMV9fMF9fSW1wbCBydWxlX19Kdm1XaWxkY2FyZFR5cGVSZWZlcmVuY2VfX0dyb3VwXzJfMV9fMQogICAgICAgICAgICAgewotICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMTUyKTsKKyAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzE2MCk7CiAgICAgICAgICAgICBydWxlX19Kdm1XaWxkY2FyZFR5cGVSZWZlcmVuY2VfX0dyb3VwXzJfMV9fMF9fSW1wbCgpOwogCiAgICAgICAgICAgICBzdGF0ZS5fZnNwLS07CkBAIC02OTg4NiwyMyArNzQzNDMsMjMgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19Kdm1XaWxkY2FyZFR5cGVSZWZlcmVuY2VfX0dyb3VwXzJfMV9fMF9fSW1wbCIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMTI5OToxOiBydWxlX19Kdm1XaWxkY2FyZFR5cGVSZWZlcmVuY2VfX0dyb3VwXzJfMV9fMF9fSW1wbCA6ICggKCBydWxlX19Kdm1XaWxkY2FyZFR5cGVSZWZlcmVuY2VfX0NvbnN0cmFpbnRzQXNzaWdubWVudF8yXzFfMCApICkgOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIyNjM3OjE6IHJ1bGVfX0p2bVdpbGRjYXJkVHlwZVJlZmVyZW5jZV9fR3JvdXBfMl8xX18wX19JbXBsIDogKCAoIHJ1bGVfX0p2bVdpbGRjYXJkVHlwZVJlZmVyZW5jZV9fQ29uc3RyYWludHNBc3NpZ25tZW50XzJfMV8wICkgKSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fSnZtV2lsZGNhcmRUeXBlUmVmZXJlbmNlX19Hcm91cF8yXzFfXzBfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjEzMDM6MTogKCAoICggcnVsZV9fSnZtV2lsZGNhcmRUeXBlUmVmZXJlbmNlX19Db25zdHJhaW50c0Fzc2lnbm1lbnRfMl8xXzAgKSApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIxMzA0OjE6ICggKCBydWxlX19Kdm1XaWxkY2FyZFR5cGVSZWZlcmVuY2VfX0NvbnN0cmFpbnRzQXNzaWdubWVudF8yXzFfMCApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIyNjQxOjE6ICggKCAoIHJ1bGVfX0p2bVdpbGRjYXJkVHlwZVJlZmVyZW5jZV9fQ29uc3RyYWludHNBc3NpZ25tZW50XzJfMV8wICkgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMjY0MjoxOiAoICggcnVsZV9fSnZtV2lsZGNhcmRUeXBlUmVmZXJlbmNlX19Db25zdHJhaW50c0Fzc2lnbm1lbnRfMl8xXzAgKSApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMTMwNDoxOiAoICggcnVsZV9fSnZtV2lsZGNhcmRUeXBlUmVmZXJlbmNlX19Db25zdHJhaW50c0Fzc2lnbm1lbnRfMl8xXzAgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMTMwNToyOiAoIHJ1bGVfX0p2bVdpbGRjYXJkVHlwZVJlZmVyZW5jZV9fQ29uc3RyYWludHNBc3NpZ25tZW50XzJfMV8wICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIyNjQyOjE6ICggKCBydWxlX19Kdm1XaWxkY2FyZFR5cGVSZWZlcmVuY2VfX0NvbnN0cmFpbnRzQXNzaWdubWVudF8yXzFfMCApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIyNjQzOjI6ICggcnVsZV9fSnZtV2lsZGNhcmRUeXBlUmVmZXJlbmNlX19Db25zdHJhaW50c0Fzc2lnbm1lbnRfMl8xXzAgKQogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRKdm1XaWxkY2FyZFR5cGVSZWZlcmVuY2VBY2Nlc3MoKS5nZXRDb25zdHJhaW50c0Fzc2lnbm1lbnRfMl8xXzAoKSk7IAogICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjEzMDY6MjogKCBydWxlX19Kdm1XaWxkY2FyZFR5cGVSZWZlcmVuY2VfX0NvbnN0cmFpbnRzQXNzaWdubWVudF8yXzFfMCApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMTMwNjozOiBydWxlX19Kdm1XaWxkY2FyZFR5cGVSZWZlcmVuY2VfX0NvbnN0cmFpbnRzQXNzaWdubWVudF8yXzFfMAorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjI2NDQ6MjogKCBydWxlX19Kdm1XaWxkY2FyZFR5cGVSZWZlcmVuY2VfX0NvbnN0cmFpbnRzQXNzaWdubWVudF8yXzFfMCApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMjY0NDozOiBydWxlX19Kdm1XaWxkY2FyZFR5cGVSZWZlcmVuY2VfX0NvbnN0cmFpbnRzQXNzaWdubWVudF8yXzFfMAogICAgICAgICAgICAgewogICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMik7CiAgICAgICAgICAgICBydWxlX19Kdm1XaWxkY2FyZFR5cGVSZWZlcmVuY2VfX0NvbnN0cmFpbnRzQXNzaWdubWVudF8yXzFfMCgpOwpAQCAtNjk5MzcsMTQgKzc0Mzk0LDE0IEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fSnZtV2lsZGNhcmRUeXBlUmVmZXJlbmNlX19Hcm91cF8yXzFfXzEiCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjEzMTQ6MTogcnVsZV9fSnZtV2lsZGNhcmRUeXBlUmVmZXJlbmNlX19Hcm91cF8yXzFfXzEgOiBydWxlX19Kdm1XaWxkY2FyZFR5cGVSZWZlcmVuY2VfX0dyb3VwXzJfMV9fMV9fSW1wbCA7CisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjI2NTI6MTogcnVsZV9fSnZtV2lsZGNhcmRUeXBlUmVmZXJlbmNlX19Hcm91cF8yXzFfXzEgOiBydWxlX19Kdm1XaWxkY2FyZFR5cGVSZWZlcmVuY2VfX0dyb3VwXzJfMV9fMV9fSW1wbCA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fSnZtV2lsZGNhcmRUeXBlUmVmZXJlbmNlX19Hcm91cF8yXzFfXzEoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjEzMTg6MTogKCBydWxlX19Kdm1XaWxkY2FyZFR5cGVSZWZlcmVuY2VfX0dyb3VwXzJfMV9fMV9fSW1wbCApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMTMxOToyOiBydWxlX19Kdm1XaWxkY2FyZFR5cGVSZWZlcmVuY2VfX0dyb3VwXzJfMV9fMV9fSW1wbAorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjI2NTY6MTogKCBydWxlX19Kdm1XaWxkY2FyZFR5cGVSZWZlcmVuY2VfX0dyb3VwXzJfMV9fMV9fSW1wbCApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMjY1NzoyOiBydWxlX19Kdm1XaWxkY2FyZFR5cGVSZWZlcmVuY2VfX0dyb3VwXzJfMV9fMV9fSW1wbAogICAgICAgICAgICAgewogICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMik7CiAgICAgICAgICAgICBydWxlX19Kdm1XaWxkY2FyZFR5cGVSZWZlcmVuY2VfX0dyb3VwXzJfMV9fMV9fSW1wbCgpOwpAQCAtNjk5NzAsMzcgKzc0NDI3LDM3IEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fSnZtV2lsZGNhcmRUeXBlUmVmZXJlbmNlX19Hcm91cF8yXzFfXzFfX0ltcGwiCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjEzMjU6MTogcnVsZV9fSnZtV2lsZGNhcmRUeXBlUmVmZXJlbmNlX19Hcm91cF8yXzFfXzFfX0ltcGwgOiAoICggcnVsZV9fSnZtV2lsZGNhcmRUeXBlUmVmZXJlbmNlX19Db25zdHJhaW50c0Fzc2lnbm1lbnRfMl8xXzEgKSogKSA7CisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjI2NjM6MTogcnVsZV9fSnZtV2lsZGNhcmRUeXBlUmVmZXJlbmNlX19Hcm91cF8yXzFfXzFfX0ltcGwgOiAoICggcnVsZV9fSnZtV2lsZGNhcmRUeXBlUmVmZXJlbmNlX19Db25zdHJhaW50c0Fzc2lnbm1lbnRfMl8xXzEgKSogKSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fSnZtV2lsZGNhcmRUeXBlUmVmZXJlbmNlX19Hcm91cF8yXzFfXzFfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjEzMjk6MTogKCAoICggcnVsZV9fSnZtV2lsZGNhcmRUeXBlUmVmZXJlbmNlX19Db25zdHJhaW50c0Fzc2lnbm1lbnRfMl8xXzEgKSogKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMTMzMDoxOiAoICggcnVsZV9fSnZtV2lsZGNhcmRUeXBlUmVmZXJlbmNlX19Db25zdHJhaW50c0Fzc2lnbm1lbnRfMl8xXzEgKSogKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjI2Njc6MTogKCAoICggcnVsZV9fSnZtV2lsZGNhcmRUeXBlUmVmZXJlbmNlX19Db25zdHJhaW50c0Fzc2lnbm1lbnRfMl8xXzEgKSogKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMjY2ODoxOiAoICggcnVsZV9fSnZtV2lsZGNhcmRUeXBlUmVmZXJlbmNlX19Db25zdHJhaW50c0Fzc2lnbm1lbnRfMl8xXzEgKSogKQogICAgICAgICAgICAgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjEzMzA6MTogKCAoIHJ1bGVfX0p2bVdpbGRjYXJkVHlwZVJlZmVyZW5jZV9fQ29uc3RyYWludHNBc3NpZ25tZW50XzJfMV8xICkqICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIxMzMxOjI6ICggcnVsZV9fSnZtV2lsZGNhcmRUeXBlUmVmZXJlbmNlX19Db25zdHJhaW50c0Fzc2lnbm1lbnRfMl8xXzEgKSoKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIyNjY4OjE6ICggKCBydWxlX19Kdm1XaWxkY2FyZFR5cGVSZWZlcmVuY2VfX0NvbnN0cmFpbnRzQXNzaWdubWVudF8yXzFfMSApKiApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMjY2OToyOiAoIHJ1bGVfX0p2bVdpbGRjYXJkVHlwZVJlZmVyZW5jZV9fQ29uc3RyYWludHNBc3NpZ25tZW50XzJfMV8xICkqCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldEp2bVdpbGRjYXJkVHlwZVJlZmVyZW5jZUFjY2VzcygpLmdldENvbnN0cmFpbnRzQXNzaWdubWVudF8yXzFfMSgpKTsgCiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMTMzMjoyOiAoIHJ1bGVfX0p2bVdpbGRjYXJkVHlwZVJlZmVyZW5jZV9fQ29uc3RyYWludHNBc3NpZ25tZW50XzJfMV8xICkqCi0gICAgICAgICAgICBsb29wMTY4OgorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjI2NzA6MjogKCBydWxlX19Kdm1XaWxkY2FyZFR5cGVSZWZlcmVuY2VfX0NvbnN0cmFpbnRzQXNzaWdubWVudF8yXzFfMSApKgorICAgICAgICAgICAgbG9vcDE4MToKICAgICAgICAgICAgIGRvIHsKLSAgICAgICAgICAgICAgICBpbnQgYWx0MTY4PTI7Ci0gICAgICAgICAgICAgICAgaW50IExBMTY4XzAgPSBpbnB1dC5MQSgxKTsKKyAgICAgICAgICAgICAgICBpbnQgYWx0MTgxPTI7CisgICAgICAgICAgICAgICAgaW50IExBMTgxXzAgPSBpbnB1dC5MQSgxKTsKIAotICAgICAgICAgICAgICAgIGlmICggKExBMTY4XzA9PTEzOCkgKSB7Ci0gICAgICAgICAgICAgICAgICAgIGFsdDE2OD0xOworICAgICAgICAgICAgICAgIGlmICggKExBMTgxXzA9PTE0OCkgKSB7CisgICAgICAgICAgICAgICAgICAgIGFsdDE4MT0xOwogICAgICAgICAgICAgICAgIH0KIAogCi0gICAgICAgICAgICAgICAgc3dpdGNoIChhbHQxNjgpIHsKKyAgICAgICAgICAgICAgICBzd2l0Y2ggKGFsdDE4MSkgewogICAgICAgICAgICAgCWNhc2UgMSA6Ci0gICAgICAgICAgICAJICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIxMzMyOjM6IHJ1bGVfX0p2bVdpbGRjYXJkVHlwZVJlZmVyZW5jZV9fQ29uc3RyYWludHNBc3NpZ25tZW50XzJfMV8xCisgICAgICAgICAgICAJICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIyNjcwOjM6IHJ1bGVfX0p2bVdpbGRjYXJkVHlwZVJlZmVyZW5jZV9fQ29uc3RyYWludHNBc3NpZ25tZW50XzJfMV8xCiAgICAgICAgICAgICAJICAgIHsKLSAgICAgICAgICAgIAkgICAgcHVzaEZvbGxvdyhGT0xMT1dfMTUzKTsKKyAgICAgICAgICAgIAkgICAgcHVzaEZvbGxvdyhGT0xMT1dfMTYxKTsKICAgICAgICAgICAgIAkgICAgcnVsZV9fSnZtV2lsZGNhcmRUeXBlUmVmZXJlbmNlX19Db25zdHJhaW50c0Fzc2lnbm1lbnRfMl8xXzEoKTsKIAogICAgICAgICAgICAgCSAgICBzdGF0ZS5fZnNwLS07CkBAIC03MDAxMCw3ICs3NDQ2Nyw3IEBACiAgICAgICAgICAgICAJICAgIGJyZWFrOwogCiAgICAgICAgICAgICAJZGVmYXVsdCA6Ci0gICAgICAgICAgICAJICAgIGJyZWFrIGxvb3AxNjg7CisgICAgICAgICAgICAJICAgIGJyZWFrIGxvb3AxODE7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfSB3aGlsZSAodHJ1ZSk7CiAKQEAgLTcwMDM5LDE2ICs3NDQ5NiwxNiBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX0p2bVVwcGVyQm91bmRfX0dyb3VwX18wIgotICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIxMzQxOjE6IHJ1bGVfX0p2bVVwcGVyQm91bmRfX0dyb3VwX18wIDogcnVsZV9fSnZtVXBwZXJCb3VuZF9fR3JvdXBfXzBfX0ltcGwgcnVsZV9fSnZtVXBwZXJCb3VuZF9fR3JvdXBfXzEgOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIyNjc5OjE6IHJ1bGVfX0p2bVVwcGVyQm91bmRfX0dyb3VwX18wIDogcnVsZV9fSnZtVXBwZXJCb3VuZF9fR3JvdXBfXzBfX0ltcGwgcnVsZV9fSnZtVXBwZXJCb3VuZF9fR3JvdXBfXzEgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX0p2bVVwcGVyQm91bmRfX0dyb3VwX18wKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIxMzQ1OjE6ICggcnVsZV9fSnZtVXBwZXJCb3VuZF9fR3JvdXBfXzBfX0ltcGwgcnVsZV9fSnZtVXBwZXJCb3VuZF9fR3JvdXBfXzEgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjEzNDY6MjogcnVsZV9fSnZtVXBwZXJCb3VuZF9fR3JvdXBfXzBfX0ltcGwgcnVsZV9fSnZtVXBwZXJCb3VuZF9fR3JvdXBfXzEKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIyNjgzOjE6ICggcnVsZV9fSnZtVXBwZXJCb3VuZF9fR3JvdXBfXzBfX0ltcGwgcnVsZV9fSnZtVXBwZXJCb3VuZF9fR3JvdXBfXzEgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjI2ODQ6MjogcnVsZV9fSnZtVXBwZXJCb3VuZF9fR3JvdXBfXzBfX0ltcGwgcnVsZV9fSnZtVXBwZXJCb3VuZF9fR3JvdXBfXzEKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzkxKTsKKyAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzk5KTsKICAgICAgICAgICAgIHJ1bGVfX0p2bVVwcGVyQm91bmRfX0dyb3VwX18wX19JbXBsKCk7CiAKICAgICAgICAgICAgIHN0YXRlLl9mc3AtLTsKQEAgLTcwMDc3LDE3ICs3NDUzNCwxNyBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX0p2bVVwcGVyQm91bmRfX0dyb3VwX18wX19JbXBsIgotICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIxMzUzOjE6IHJ1bGVfX0p2bVVwcGVyQm91bmRfX0dyb3VwX18wX19JbXBsIDogKCAnZXh0ZW5kcycgKSA7CisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjI2OTE6MTogcnVsZV9fSnZtVXBwZXJCb3VuZF9fR3JvdXBfXzBfX0ltcGwgOiAoICdleHRlbmRzJyApIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19Kdm1VcHBlckJvdW5kX19Hcm91cF9fMF9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMTM1NzoxOiAoICggJ2V4dGVuZHMnICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjEzNTg6MTogKCAnZXh0ZW5kcycgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjI2OTU6MTogKCAoICdleHRlbmRzJyApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIyNjk2OjE6ICggJ2V4dGVuZHMnICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIxMzU4OjE6ICggJ2V4dGVuZHMnICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIxMzU5OjI6ICdleHRlbmRzJworICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjI2OTY6MTogKCAnZXh0ZW5kcycgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjI2OTc6MjogJ2V4dGVuZHMnCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldEp2bVVwcGVyQm91bmRBY2Nlc3MoKS5nZXRFeHRlbmRzS2V5d29yZF8wKCkpOyAKQEAgLTcwMTE4LDE0ICs3NDU3NSwxNCBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX0p2bVVwcGVyQm91bmRfX0dyb3VwX18xIgotICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIxMzY4OjE6IHJ1bGVfX0p2bVVwcGVyQm91bmRfX0dyb3VwX18xIDogcnVsZV9fSnZtVXBwZXJCb3VuZF9fR3JvdXBfXzFfX0ltcGwgOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIyNzA2OjE6IHJ1bGVfX0p2bVVwcGVyQm91bmRfX0dyb3VwX18xIDogcnVsZV9fSnZtVXBwZXJCb3VuZF9fR3JvdXBfXzFfX0ltcGwgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX0p2bVVwcGVyQm91bmRfX0dyb3VwX18xKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIxMzcyOjE6ICggcnVsZV9fSnZtVXBwZXJCb3VuZF9fR3JvdXBfXzFfX0ltcGwgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjEzNzM6MjogcnVsZV9fSnZtVXBwZXJCb3VuZF9fR3JvdXBfXzFfX0ltcGwKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIyNzEwOjE6ICggcnVsZV9fSnZtVXBwZXJCb3VuZF9fR3JvdXBfXzFfX0ltcGwgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjI3MTE6MjogcnVsZV9fSnZtVXBwZXJCb3VuZF9fR3JvdXBfXzFfX0ltcGwKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzIpOwogICAgICAgICAgICAgcnVsZV9fSnZtVXBwZXJCb3VuZF9fR3JvdXBfXzFfX0ltcGwoKTsKQEAgLTcwMTUxLDIzICs3NDYwOCwyMyBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX0p2bVVwcGVyQm91bmRfX0dyb3VwX18xX19JbXBsIgotICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIxMzc5OjE6IHJ1bGVfX0p2bVVwcGVyQm91bmRfX0dyb3VwX18xX19JbXBsIDogKCAoIHJ1bGVfX0p2bVVwcGVyQm91bmRfX1R5cGVSZWZlcmVuY2VBc3NpZ25tZW50XzEgKSApIDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMjcxNzoxOiBydWxlX19Kdm1VcHBlckJvdW5kX19Hcm91cF9fMV9fSW1wbCA6ICggKCBydWxlX19Kdm1VcHBlckJvdW5kX19UeXBlUmVmZXJlbmNlQXNzaWdubWVudF8xICkgKSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fSnZtVXBwZXJCb3VuZF9fR3JvdXBfXzFfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjEzODM6MTogKCAoICggcnVsZV9fSnZtVXBwZXJCb3VuZF9fVHlwZVJlZmVyZW5jZUFzc2lnbm1lbnRfMSApICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjEzODQ6MTogKCAoIHJ1bGVfX0p2bVVwcGVyQm91bmRfX1R5cGVSZWZlcmVuY2VBc3NpZ25tZW50XzEgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMjcyMToxOiAoICggKCBydWxlX19Kdm1VcHBlckJvdW5kX19UeXBlUmVmZXJlbmNlQXNzaWdubWVudF8xICkgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMjcyMjoxOiAoICggcnVsZV9fSnZtVXBwZXJCb3VuZF9fVHlwZVJlZmVyZW5jZUFzc2lnbm1lbnRfMSApICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIxMzg0OjE6ICggKCBydWxlX19Kdm1VcHBlckJvdW5kX19UeXBlUmVmZXJlbmNlQXNzaWdubWVudF8xICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjEzODU6MjogKCBydWxlX19Kdm1VcHBlckJvdW5kX19UeXBlUmVmZXJlbmNlQXNzaWdubWVudF8xICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIyNzIyOjE6ICggKCBydWxlX19Kdm1VcHBlckJvdW5kX19UeXBlUmVmZXJlbmNlQXNzaWdubWVudF8xICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjI3MjM6MjogKCBydWxlX19Kdm1VcHBlckJvdW5kX19UeXBlUmVmZXJlbmNlQXNzaWdubWVudF8xICkKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0SnZtVXBwZXJCb3VuZEFjY2VzcygpLmdldFR5cGVSZWZlcmVuY2VBc3NpZ25tZW50XzEoKSk7IAogICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjEzODY6MjogKCBydWxlX19Kdm1VcHBlckJvdW5kX19UeXBlUmVmZXJlbmNlQXNzaWdubWVudF8xICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIxMzg2OjM6IHJ1bGVfX0p2bVVwcGVyQm91bmRfX1R5cGVSZWZlcmVuY2VBc3NpZ25tZW50XzEKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIyNzI0OjI6ICggcnVsZV9fSnZtVXBwZXJCb3VuZF9fVHlwZVJlZmVyZW5jZUFzc2lnbm1lbnRfMSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMjcyNDozOiBydWxlX19Kdm1VcHBlckJvdW5kX19UeXBlUmVmZXJlbmNlQXNzaWdubWVudF8xCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV18yKTsKICAgICAgICAgICAgIHJ1bGVfX0p2bVVwcGVyQm91bmRfX1R5cGVSZWZlcmVuY2VBc3NpZ25tZW50XzEoKTsKQEAgLTcwMjAyLDE2ICs3NDY1OSwxNiBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX0p2bVVwcGVyQm91bmRBbmRlZF9fR3JvdXBfXzAiCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjEzOTU6MTogcnVsZV9fSnZtVXBwZXJCb3VuZEFuZGVkX19Hcm91cF9fMCA6IHJ1bGVfX0p2bVVwcGVyQm91bmRBbmRlZF9fR3JvdXBfXzBfX0ltcGwgcnVsZV9fSnZtVXBwZXJCb3VuZEFuZGVkX19Hcm91cF9fMSA7CisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjI3MzM6MTogcnVsZV9fSnZtVXBwZXJCb3VuZEFuZGVkX19Hcm91cF9fMCA6IHJ1bGVfX0p2bVVwcGVyQm91bmRBbmRlZF9fR3JvdXBfXzBfX0ltcGwgcnVsZV9fSnZtVXBwZXJCb3VuZEFuZGVkX19Hcm91cF9fMSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fSnZtVXBwZXJCb3VuZEFuZGVkX19Hcm91cF9fMCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMTM5OToxOiAoIHJ1bGVfX0p2bVVwcGVyQm91bmRBbmRlZF9fR3JvdXBfXzBfX0ltcGwgcnVsZV9fSnZtVXBwZXJCb3VuZEFuZGVkX19Hcm91cF9fMSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMTQwMDoyOiBydWxlX19Kdm1VcHBlckJvdW5kQW5kZWRfX0dyb3VwX18wX19JbXBsIHJ1bGVfX0p2bVVwcGVyQm91bmRBbmRlZF9fR3JvdXBfXzEKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIyNzM3OjE6ICggcnVsZV9fSnZtVXBwZXJCb3VuZEFuZGVkX19Hcm91cF9fMF9fSW1wbCBydWxlX19Kdm1VcHBlckJvdW5kQW5kZWRfX0dyb3VwX18xICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIyNzM4OjI6IHJ1bGVfX0p2bVVwcGVyQm91bmRBbmRlZF9fR3JvdXBfXzBfX0ltcGwgcnVsZV9fSnZtVXBwZXJCb3VuZEFuZGVkX19Hcm91cF9fMQogICAgICAgICAgICAgewotICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfOTEpOworICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfOTkpOwogICAgICAgICAgICAgcnVsZV9fSnZtVXBwZXJCb3VuZEFuZGVkX19Hcm91cF9fMF9fSW1wbCgpOwogCiAgICAgICAgICAgICBzdGF0ZS5fZnNwLS07CkBAIC03MDI0MCwyMiArNzQ2OTcsMjIgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19Kdm1VcHBlckJvdW5kQW5kZWRfX0dyb3VwX18wX19JbXBsIgotICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIxNDA3OjE6IHJ1bGVfX0p2bVVwcGVyQm91bmRBbmRlZF9fR3JvdXBfXzBfX0ltcGwgOiAoICcmJyApIDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMjc0NToxOiBydWxlX19Kdm1VcHBlckJvdW5kQW5kZWRfX0dyb3VwX18wX19JbXBsIDogKCAnJicgKSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fSnZtVXBwZXJCb3VuZEFuZGVkX19Hcm91cF9fMF9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMTQxMToxOiAoICggJyYnICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjE0MTI6MTogKCAnJicgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjI3NDk6MTogKCAoICcmJyApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIyNzUwOjE6ICggJyYnICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIxNDEyOjE6ICggJyYnICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIxNDEzOjI6ICcmJworICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjI3NTA6MTogKCAnJicgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjI3NTE6MjogJyYnCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldEp2bVVwcGVyQm91bmRBbmRlZEFjY2VzcygpLmdldEFtcGVyc2FuZEtleXdvcmRfMCgpKTsgCiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBtYXRjaChpbnB1dCwxMzgsRk9MTE9XXzIpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOworICAgICAgICAgICAgbWF0Y2goaW5wdXQsMTQ4LEZPTExPV18yKTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRKdm1VcHBlckJvdW5kQW5kZWRBY2Nlc3MoKS5nZXRBbXBlcnNhbmRLZXl3b3JkXzAoKSk7IAogICAgICAgICAgICAgfQpAQCAtNzAyODEsMTQgKzc0NzM4LDE0IEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fSnZtVXBwZXJCb3VuZEFuZGVkX19Hcm91cF9fMSIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMTQyMjoxOiBydWxlX19Kdm1VcHBlckJvdW5kQW5kZWRfX0dyb3VwX18xIDogcnVsZV9fSnZtVXBwZXJCb3VuZEFuZGVkX19Hcm91cF9fMV9fSW1wbCA7CisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjI3NjA6MTogcnVsZV9fSnZtVXBwZXJCb3VuZEFuZGVkX19Hcm91cF9fMSA6IHJ1bGVfX0p2bVVwcGVyQm91bmRBbmRlZF9fR3JvdXBfXzFfX0ltcGwgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX0p2bVVwcGVyQm91bmRBbmRlZF9fR3JvdXBfXzEoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjE0MjY6MTogKCBydWxlX19Kdm1VcHBlckJvdW5kQW5kZWRfX0dyb3VwX18xX19JbXBsICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIxNDI3OjI6IHJ1bGVfX0p2bVVwcGVyQm91bmRBbmRlZF9fR3JvdXBfXzFfX0ltcGwKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIyNzY0OjE6ICggcnVsZV9fSnZtVXBwZXJCb3VuZEFuZGVkX19Hcm91cF9fMV9fSW1wbCApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMjc2NToyOiBydWxlX19Kdm1VcHBlckJvdW5kQW5kZWRfX0dyb3VwX18xX19JbXBsCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV18yKTsKICAgICAgICAgICAgIHJ1bGVfX0p2bVVwcGVyQm91bmRBbmRlZF9fR3JvdXBfXzFfX0ltcGwoKTsKQEAgLTcwMzE0LDIzICs3NDc3MSwyMyBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX0p2bVVwcGVyQm91bmRBbmRlZF9fR3JvdXBfXzFfX0ltcGwiCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjE0MzM6MTogcnVsZV9fSnZtVXBwZXJCb3VuZEFuZGVkX19Hcm91cF9fMV9fSW1wbCA6ICggKCBydWxlX19Kdm1VcHBlckJvdW5kQW5kZWRfX1R5cGVSZWZlcmVuY2VBc3NpZ25tZW50XzEgKSApIDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMjc3MToxOiBydWxlX19Kdm1VcHBlckJvdW5kQW5kZWRfX0dyb3VwX18xX19JbXBsIDogKCAoIHJ1bGVfX0p2bVVwcGVyQm91bmRBbmRlZF9fVHlwZVJlZmVyZW5jZUFzc2lnbm1lbnRfMSApICkgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX0p2bVVwcGVyQm91bmRBbmRlZF9fR3JvdXBfXzFfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjE0Mzc6MTogKCAoICggcnVsZV9fSnZtVXBwZXJCb3VuZEFuZGVkX19UeXBlUmVmZXJlbmNlQXNzaWdubWVudF8xICkgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMTQzODoxOiAoICggcnVsZV9fSnZtVXBwZXJCb3VuZEFuZGVkX19UeXBlUmVmZXJlbmNlQXNzaWdubWVudF8xICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjI3NzU6MTogKCAoICggcnVsZV9fSnZtVXBwZXJCb3VuZEFuZGVkX19UeXBlUmVmZXJlbmNlQXNzaWdubWVudF8xICkgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMjc3NjoxOiAoICggcnVsZV9fSnZtVXBwZXJCb3VuZEFuZGVkX19UeXBlUmVmZXJlbmNlQXNzaWdubWVudF8xICkgKQogICAgICAgICAgICAgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjE0Mzg6MTogKCAoIHJ1bGVfX0p2bVVwcGVyQm91bmRBbmRlZF9fVHlwZVJlZmVyZW5jZUFzc2lnbm1lbnRfMSApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIxNDM5OjI6ICggcnVsZV9fSnZtVXBwZXJCb3VuZEFuZGVkX19UeXBlUmVmZXJlbmNlQXNzaWdubWVudF8xICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIyNzc2OjE6ICggKCBydWxlX19Kdm1VcHBlckJvdW5kQW5kZWRfX1R5cGVSZWZlcmVuY2VBc3NpZ25tZW50XzEgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMjc3NzoyOiAoIHJ1bGVfX0p2bVVwcGVyQm91bmRBbmRlZF9fVHlwZVJlZmVyZW5jZUFzc2lnbm1lbnRfMSApCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldEp2bVVwcGVyQm91bmRBbmRlZEFjY2VzcygpLmdldFR5cGVSZWZlcmVuY2VBc3NpZ25tZW50XzEoKSk7IAogICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjE0NDA6MjogKCBydWxlX19Kdm1VcHBlckJvdW5kQW5kZWRfX1R5cGVSZWZlcmVuY2VBc3NpZ25tZW50XzEgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjE0NDA6MzogcnVsZV9fSnZtVXBwZXJCb3VuZEFuZGVkX19UeXBlUmVmZXJlbmNlQXNzaWdubWVudF8xCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMjc3ODoyOiAoIHJ1bGVfX0p2bVVwcGVyQm91bmRBbmRlZF9fVHlwZVJlZmVyZW5jZUFzc2lnbm1lbnRfMSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMjc3ODozOiBydWxlX19Kdm1VcHBlckJvdW5kQW5kZWRfX1R5cGVSZWZlcmVuY2VBc3NpZ25tZW50XzEKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzIpOwogICAgICAgICAgICAgcnVsZV9fSnZtVXBwZXJCb3VuZEFuZGVkX19UeXBlUmVmZXJlbmNlQXNzaWdubWVudF8xKCk7CkBAIC03MDM2NSwxNiArNzQ4MjIsMTYgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19Kdm1Mb3dlckJvdW5kX19Hcm91cF9fMCIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMTQ0OToxOiBydWxlX19Kdm1Mb3dlckJvdW5kX19Hcm91cF9fMCA6IHJ1bGVfX0p2bUxvd2VyQm91bmRfX0dyb3VwX18wX19JbXBsIHJ1bGVfX0p2bUxvd2VyQm91bmRfX0dyb3VwX18xIDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMjc4NzoxOiBydWxlX19Kdm1Mb3dlckJvdW5kX19Hcm91cF9fMCA6IHJ1bGVfX0p2bUxvd2VyQm91bmRfX0dyb3VwX18wX19JbXBsIHJ1bGVfX0p2bUxvd2VyQm91bmRfX0dyb3VwX18xIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19Kdm1Mb3dlckJvdW5kX19Hcm91cF9fMCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMTQ1MzoxOiAoIHJ1bGVfX0p2bUxvd2VyQm91bmRfX0dyb3VwX18wX19JbXBsIHJ1bGVfX0p2bUxvd2VyQm91bmRfX0dyb3VwX18xICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIxNDU0OjI6IHJ1bGVfX0p2bUxvd2VyQm91bmRfX0dyb3VwX18wX19JbXBsIHJ1bGVfX0p2bUxvd2VyQm91bmRfX0dyb3VwX18xCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMjc5MToxOiAoIHJ1bGVfX0p2bUxvd2VyQm91bmRfX0dyb3VwX18wX19JbXBsIHJ1bGVfX0p2bUxvd2VyQm91bmRfX0dyb3VwX18xICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIyNzkyOjI6IHJ1bGVfX0p2bUxvd2VyQm91bmRfX0dyb3VwX18wX19JbXBsIHJ1bGVfX0p2bUxvd2VyQm91bmRfX0dyb3VwX18xCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV185MSk7CisgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV185OSk7CiAgICAgICAgICAgICBydWxlX19Kdm1Mb3dlckJvdW5kX19Hcm91cF9fMF9fSW1wbCgpOwogCiAgICAgICAgICAgICBzdGF0ZS5fZnNwLS07CkBAIC03MDQwMywxNyArNzQ4NjAsMTcgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19Kdm1Mb3dlckJvdW5kX19Hcm91cF9fMF9fSW1wbCIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMTQ2MToxOiBydWxlX19Kdm1Mb3dlckJvdW5kX19Hcm91cF9fMF9fSW1wbCA6ICggJ3N1cGVyJyApIDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMjc5OToxOiBydWxlX19Kdm1Mb3dlckJvdW5kX19Hcm91cF9fMF9fSW1wbCA6ICggJ3N1cGVyJyApIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19Kdm1Mb3dlckJvdW5kX19Hcm91cF9fMF9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMTQ2NToxOiAoICggJ3N1cGVyJyApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIxNDY2OjE6ICggJ3N1cGVyJyApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMjgwMzoxOiAoICggJ3N1cGVyJyApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIyODA0OjE6ICggJ3N1cGVyJyApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMTQ2NjoxOiAoICdzdXBlcicgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjE0Njc6MjogJ3N1cGVyJworICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjI4MDQ6MTogKCAnc3VwZXInICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIyODA1OjI6ICdzdXBlcicKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0SnZtTG93ZXJCb3VuZEFjY2VzcygpLmdldFN1cGVyS2V5d29yZF8wKCkpOyAKQEAgLTcwNDQ0LDE0ICs3NDkwMSwxNCBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX0p2bUxvd2VyQm91bmRfX0dyb3VwX18xIgotICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIxNDc2OjE6IHJ1bGVfX0p2bUxvd2VyQm91bmRfX0dyb3VwX18xIDogcnVsZV9fSnZtTG93ZXJCb3VuZF9fR3JvdXBfXzFfX0ltcGwgOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIyODE0OjE6IHJ1bGVfX0p2bUxvd2VyQm91bmRfX0dyb3VwX18xIDogcnVsZV9fSnZtTG93ZXJCb3VuZF9fR3JvdXBfXzFfX0ltcGwgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX0p2bUxvd2VyQm91bmRfX0dyb3VwX18xKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIxNDgwOjE6ICggcnVsZV9fSnZtTG93ZXJCb3VuZF9fR3JvdXBfXzFfX0ltcGwgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjE0ODE6MjogcnVsZV9fSnZtTG93ZXJCb3VuZF9fR3JvdXBfXzFfX0ltcGwKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIyODE4OjE6ICggcnVsZV9fSnZtTG93ZXJCb3VuZF9fR3JvdXBfXzFfX0ltcGwgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjI4MTk6MjogcnVsZV9fSnZtTG93ZXJCb3VuZF9fR3JvdXBfXzFfX0ltcGwKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzIpOwogICAgICAgICAgICAgcnVsZV9fSnZtTG93ZXJCb3VuZF9fR3JvdXBfXzFfX0ltcGwoKTsKQEAgLTcwNDc3LDIzICs3NDkzNCwyMyBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX0p2bUxvd2VyQm91bmRfX0dyb3VwX18xX19JbXBsIgotICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIxNDg3OjE6IHJ1bGVfX0p2bUxvd2VyQm91bmRfX0dyb3VwX18xX19JbXBsIDogKCAoIHJ1bGVfX0p2bUxvd2VyQm91bmRfX1R5cGVSZWZlcmVuY2VBc3NpZ25tZW50XzEgKSApIDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMjgyNToxOiBydWxlX19Kdm1Mb3dlckJvdW5kX19Hcm91cF9fMV9fSW1wbCA6ICggKCBydWxlX19Kdm1Mb3dlckJvdW5kX19UeXBlUmVmZXJlbmNlQXNzaWdubWVudF8xICkgKSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fSnZtTG93ZXJCb3VuZF9fR3JvdXBfXzFfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjE0OTE6MTogKCAoICggcnVsZV9fSnZtTG93ZXJCb3VuZF9fVHlwZVJlZmVyZW5jZUFzc2lnbm1lbnRfMSApICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjE0OTI6MTogKCAoIHJ1bGVfX0p2bUxvd2VyQm91bmRfX1R5cGVSZWZlcmVuY2VBc3NpZ25tZW50XzEgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMjgyOToxOiAoICggKCBydWxlX19Kdm1Mb3dlckJvdW5kX19UeXBlUmVmZXJlbmNlQXNzaWdubWVudF8xICkgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMjgzMDoxOiAoICggcnVsZV9fSnZtTG93ZXJCb3VuZF9fVHlwZVJlZmVyZW5jZUFzc2lnbm1lbnRfMSApICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIxNDkyOjE6ICggKCBydWxlX19Kdm1Mb3dlckJvdW5kX19UeXBlUmVmZXJlbmNlQXNzaWdubWVudF8xICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjE0OTM6MjogKCBydWxlX19Kdm1Mb3dlckJvdW5kX19UeXBlUmVmZXJlbmNlQXNzaWdubWVudF8xICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIyODMwOjE6ICggKCBydWxlX19Kdm1Mb3dlckJvdW5kX19UeXBlUmVmZXJlbmNlQXNzaWdubWVudF8xICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjI4MzE6MjogKCBydWxlX19Kdm1Mb3dlckJvdW5kX19UeXBlUmVmZXJlbmNlQXNzaWdubWVudF8xICkKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0SnZtTG93ZXJCb3VuZEFjY2VzcygpLmdldFR5cGVSZWZlcmVuY2VBc3NpZ25tZW50XzEoKSk7IAogICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjE0OTQ6MjogKCBydWxlX19Kdm1Mb3dlckJvdW5kX19UeXBlUmVmZXJlbmNlQXNzaWdubWVudF8xICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIxNDk0OjM6IHJ1bGVfX0p2bUxvd2VyQm91bmRfX1R5cGVSZWZlcmVuY2VBc3NpZ25tZW50XzEKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIyODMyOjI6ICggcnVsZV9fSnZtTG93ZXJCb3VuZF9fVHlwZVJlZmVyZW5jZUFzc2lnbm1lbnRfMSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMjgzMjozOiBydWxlX19Kdm1Mb3dlckJvdW5kX19UeXBlUmVmZXJlbmNlQXNzaWdubWVudF8xCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV18yKTsKICAgICAgICAgICAgIHJ1bGVfX0p2bUxvd2VyQm91bmRfX1R5cGVSZWZlcmVuY2VBc3NpZ25tZW50XzEoKTsKQEAgLTcwNTI4LDE2ICs3NDk4NSwxNiBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX0p2bUxvd2VyQm91bmRBbmRlZF9fR3JvdXBfXzAiCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjE1MDM6MTogcnVsZV9fSnZtTG93ZXJCb3VuZEFuZGVkX19Hcm91cF9fMCA6IHJ1bGVfX0p2bUxvd2VyQm91bmRBbmRlZF9fR3JvdXBfXzBfX0ltcGwgcnVsZV9fSnZtTG93ZXJCb3VuZEFuZGVkX19Hcm91cF9fMSA7CisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjI4NDE6MTogcnVsZV9fSnZtTG93ZXJCb3VuZEFuZGVkX19Hcm91cF9fMCA6IHJ1bGVfX0p2bUxvd2VyQm91bmRBbmRlZF9fR3JvdXBfXzBfX0ltcGwgcnVsZV9fSnZtTG93ZXJCb3VuZEFuZGVkX19Hcm91cF9fMSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fSnZtTG93ZXJCb3VuZEFuZGVkX19Hcm91cF9fMCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMTUwNzoxOiAoIHJ1bGVfX0p2bUxvd2VyQm91bmRBbmRlZF9fR3JvdXBfXzBfX0ltcGwgcnVsZV9fSnZtTG93ZXJCb3VuZEFuZGVkX19Hcm91cF9fMSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMTUwODoyOiBydWxlX19Kdm1Mb3dlckJvdW5kQW5kZWRfX0dyb3VwX18wX19JbXBsIHJ1bGVfX0p2bUxvd2VyQm91bmRBbmRlZF9fR3JvdXBfXzEKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIyODQ1OjE6ICggcnVsZV9fSnZtTG93ZXJCb3VuZEFuZGVkX19Hcm91cF9fMF9fSW1wbCBydWxlX19Kdm1Mb3dlckJvdW5kQW5kZWRfX0dyb3VwX18xICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIyODQ2OjI6IHJ1bGVfX0p2bUxvd2VyQm91bmRBbmRlZF9fR3JvdXBfXzBfX0ltcGwgcnVsZV9fSnZtTG93ZXJCb3VuZEFuZGVkX19Hcm91cF9fMQogICAgICAgICAgICAgewotICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfOTEpOworICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfOTkpOwogICAgICAgICAgICAgcnVsZV9fSnZtTG93ZXJCb3VuZEFuZGVkX19Hcm91cF9fMF9fSW1wbCgpOwogCiAgICAgICAgICAgICBzdGF0ZS5fZnNwLS07CkBAIC03MDU2NiwyMiArNzUwMjMsMjIgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19Kdm1Mb3dlckJvdW5kQW5kZWRfX0dyb3VwX18wX19JbXBsIgotICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIxNTE1OjE6IHJ1bGVfX0p2bUxvd2VyQm91bmRBbmRlZF9fR3JvdXBfXzBfX0ltcGwgOiAoICcmJyApIDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMjg1MzoxOiBydWxlX19Kdm1Mb3dlckJvdW5kQW5kZWRfX0dyb3VwX18wX19JbXBsIDogKCAnJicgKSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fSnZtTG93ZXJCb3VuZEFuZGVkX19Hcm91cF9fMF9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMTUxOToxOiAoICggJyYnICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjE1MjA6MTogKCAnJicgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjI4NTc6MTogKCAoICcmJyApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIyODU4OjE6ICggJyYnICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIxNTIwOjE6ICggJyYnICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIxNTIxOjI6ICcmJworICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjI4NTg6MTogKCAnJicgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjI4NTk6MjogJyYnCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldEp2bUxvd2VyQm91bmRBbmRlZEFjY2VzcygpLmdldEFtcGVyc2FuZEtleXdvcmRfMCgpKTsgCiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBtYXRjaChpbnB1dCwxMzgsRk9MTE9XXzIpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOworICAgICAgICAgICAgbWF0Y2goaW5wdXQsMTQ4LEZPTExPV18yKTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRKdm1Mb3dlckJvdW5kQW5kZWRBY2Nlc3MoKS5nZXRBbXBlcnNhbmRLZXl3b3JkXzAoKSk7IAogICAgICAgICAgICAgfQpAQCAtNzA2MDcsMTQgKzc1MDY0LDE0IEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fSnZtTG93ZXJCb3VuZEFuZGVkX19Hcm91cF9fMSIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMTUzMDoxOiBydWxlX19Kdm1Mb3dlckJvdW5kQW5kZWRfX0dyb3VwX18xIDogcnVsZV9fSnZtTG93ZXJCb3VuZEFuZGVkX19Hcm91cF9fMV9fSW1wbCA7CisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjI4Njg6MTogcnVsZV9fSnZtTG93ZXJCb3VuZEFuZGVkX19Hcm91cF9fMSA6IHJ1bGVfX0p2bUxvd2VyQm91bmRBbmRlZF9fR3JvdXBfXzFfX0ltcGwgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX0p2bUxvd2VyQm91bmRBbmRlZF9fR3JvdXBfXzEoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjE1MzQ6MTogKCBydWxlX19Kdm1Mb3dlckJvdW5kQW5kZWRfX0dyb3VwX18xX19JbXBsICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIxNTM1OjI6IHJ1bGVfX0p2bUxvd2VyQm91bmRBbmRlZF9fR3JvdXBfXzFfX0ltcGwKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIyODcyOjE6ICggcnVsZV9fSnZtTG93ZXJCb3VuZEFuZGVkX19Hcm91cF9fMV9fSW1wbCApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMjg3MzoyOiBydWxlX19Kdm1Mb3dlckJvdW5kQW5kZWRfX0dyb3VwX18xX19JbXBsCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV18yKTsKICAgICAgICAgICAgIHJ1bGVfX0p2bUxvd2VyQm91bmRBbmRlZF9fR3JvdXBfXzFfX0ltcGwoKTsKQEAgLTcwNjQwLDIzICs3NTA5NywyMyBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX0p2bUxvd2VyQm91bmRBbmRlZF9fR3JvdXBfXzFfX0ltcGwiCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjE1NDE6MTogcnVsZV9fSnZtTG93ZXJCb3VuZEFuZGVkX19Hcm91cF9fMV9fSW1wbCA6ICggKCBydWxlX19Kdm1Mb3dlckJvdW5kQW5kZWRfX1R5cGVSZWZlcmVuY2VBc3NpZ25tZW50XzEgKSApIDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMjg3OToxOiBydWxlX19Kdm1Mb3dlckJvdW5kQW5kZWRfX0dyb3VwX18xX19JbXBsIDogKCAoIHJ1bGVfX0p2bUxvd2VyQm91bmRBbmRlZF9fVHlwZVJlZmVyZW5jZUFzc2lnbm1lbnRfMSApICkgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX0p2bUxvd2VyQm91bmRBbmRlZF9fR3JvdXBfXzFfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjE1NDU6MTogKCAoICggcnVsZV9fSnZtTG93ZXJCb3VuZEFuZGVkX19UeXBlUmVmZXJlbmNlQXNzaWdubWVudF8xICkgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMTU0NjoxOiAoICggcnVsZV9fSnZtTG93ZXJCb3VuZEFuZGVkX19UeXBlUmVmZXJlbmNlQXNzaWdubWVudF8xICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjI4ODM6MTogKCAoICggcnVsZV9fSnZtTG93ZXJCb3VuZEFuZGVkX19UeXBlUmVmZXJlbmNlQXNzaWdubWVudF8xICkgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMjg4NDoxOiAoICggcnVsZV9fSnZtTG93ZXJCb3VuZEFuZGVkX19UeXBlUmVmZXJlbmNlQXNzaWdubWVudF8xICkgKQogICAgICAgICAgICAgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjE1NDY6MTogKCAoIHJ1bGVfX0p2bUxvd2VyQm91bmRBbmRlZF9fVHlwZVJlZmVyZW5jZUFzc2lnbm1lbnRfMSApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIxNTQ3OjI6ICggcnVsZV9fSnZtTG93ZXJCb3VuZEFuZGVkX19UeXBlUmVmZXJlbmNlQXNzaWdubWVudF8xICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIyODg0OjE6ICggKCBydWxlX19Kdm1Mb3dlckJvdW5kQW5kZWRfX1R5cGVSZWZlcmVuY2VBc3NpZ25tZW50XzEgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMjg4NToyOiAoIHJ1bGVfX0p2bUxvd2VyQm91bmRBbmRlZF9fVHlwZVJlZmVyZW5jZUFzc2lnbm1lbnRfMSApCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldEp2bUxvd2VyQm91bmRBbmRlZEFjY2VzcygpLmdldFR5cGVSZWZlcmVuY2VBc3NpZ25tZW50XzEoKSk7IAogICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjE1NDg6MjogKCBydWxlX19Kdm1Mb3dlckJvdW5kQW5kZWRfX1R5cGVSZWZlcmVuY2VBc3NpZ25tZW50XzEgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjE1NDg6MzogcnVsZV9fSnZtTG93ZXJCb3VuZEFuZGVkX19UeXBlUmVmZXJlbmNlQXNzaWdubWVudF8xCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMjg4NjoyOiAoIHJ1bGVfX0p2bUxvd2VyQm91bmRBbmRlZF9fVHlwZVJlZmVyZW5jZUFzc2lnbm1lbnRfMSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMjg4NjozOiBydWxlX19Kdm1Mb3dlckJvdW5kQW5kZWRfX1R5cGVSZWZlcmVuY2VBc3NpZ25tZW50XzEKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzIpOwogICAgICAgICAgICAgcnVsZV9fSnZtTG93ZXJCb3VuZEFuZGVkX19UeXBlUmVmZXJlbmNlQXNzaWdubWVudF8xKCk7CkBAIC03MDY5MSwxNiArNzUxNDgsMTYgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19RdWFsaWZpZWROYW1lV2l0aFdpbGRjYXJkX19Hcm91cF9fMCIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMTU1NzoxOiBydWxlX19RdWFsaWZpZWROYW1lV2l0aFdpbGRjYXJkX19Hcm91cF9fMCA6IHJ1bGVfX1F1YWxpZmllZE5hbWVXaXRoV2lsZGNhcmRfX0dyb3VwX18wX19JbXBsIHJ1bGVfX1F1YWxpZmllZE5hbWVXaXRoV2lsZGNhcmRfX0dyb3VwX18xIDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMjg5NToxOiBydWxlX19RdWFsaWZpZWROYW1lV2l0aFdpbGRjYXJkX19Hcm91cF9fMCA6IHJ1bGVfX1F1YWxpZmllZE5hbWVXaXRoV2lsZGNhcmRfX0dyb3VwX18wX19JbXBsIHJ1bGVfX1F1YWxpZmllZE5hbWVXaXRoV2lsZGNhcmRfX0dyb3VwX18xIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19RdWFsaWZpZWROYW1lV2l0aFdpbGRjYXJkX19Hcm91cF9fMCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMTU2MToxOiAoIHJ1bGVfX1F1YWxpZmllZE5hbWVXaXRoV2lsZGNhcmRfX0dyb3VwX18wX19JbXBsIHJ1bGVfX1F1YWxpZmllZE5hbWVXaXRoV2lsZGNhcmRfX0dyb3VwX18xICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIxNTYyOjI6IHJ1bGVfX1F1YWxpZmllZE5hbWVXaXRoV2lsZGNhcmRfX0dyb3VwX18wX19JbXBsIHJ1bGVfX1F1YWxpZmllZE5hbWVXaXRoV2lsZGNhcmRfX0dyb3VwX18xCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMjg5OToxOiAoIHJ1bGVfX1F1YWxpZmllZE5hbWVXaXRoV2lsZGNhcmRfX0dyb3VwX18wX19JbXBsIHJ1bGVfX1F1YWxpZmllZE5hbWVXaXRoV2lsZGNhcmRfX0dyb3VwX18xICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIyOTAwOjI6IHJ1bGVfX1F1YWxpZmllZE5hbWVXaXRoV2lsZGNhcmRfX0dyb3VwX18wX19JbXBsIHJ1bGVfX1F1YWxpZmllZE5hbWVXaXRoV2lsZGNhcmRfX0dyb3VwX18xCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV182Mik7CisgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV183MCk7CiAgICAgICAgICAgICBydWxlX19RdWFsaWZpZWROYW1lV2l0aFdpbGRjYXJkX19Hcm91cF9fMF9fSW1wbCgpOwogCiAgICAgICAgICAgICBzdGF0ZS5fZnNwLS07CkBAIC03MDcyOSwxNyArNzUxODYsMTcgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19RdWFsaWZpZWROYW1lV2l0aFdpbGRjYXJkX19Hcm91cF9fMF9fSW1wbCIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMTU2OToxOiBydWxlX19RdWFsaWZpZWROYW1lV2l0aFdpbGRjYXJkX19Hcm91cF9fMF9fSW1wbCA6ICggcnVsZVF1YWxpZmllZE5hbWUgKSA7CisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjI5MDc6MTogcnVsZV9fUXVhbGlmaWVkTmFtZVdpdGhXaWxkY2FyZF9fR3JvdXBfXzBfX0ltcGwgOiAoIHJ1bGVRdWFsaWZpZWROYW1lICkgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1F1YWxpZmllZE5hbWVXaXRoV2lsZGNhcmRfX0dyb3VwX18wX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIxNTczOjE6ICggKCBydWxlUXVhbGlmaWVkTmFtZSApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIxNTc0OjE6ICggcnVsZVF1YWxpZmllZE5hbWUgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjI5MTE6MTogKCAoIHJ1bGVRdWFsaWZpZWROYW1lICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjI5MTI6MTogKCBydWxlUXVhbGlmaWVkTmFtZSApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMTU3NDoxOiAoIHJ1bGVRdWFsaWZpZWROYW1lICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIxNTc1OjI6IHJ1bGVRdWFsaWZpZWROYW1lCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMjkxMjoxOiAoIHJ1bGVRdWFsaWZpZWROYW1lICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIyOTEzOjI6IHJ1bGVRdWFsaWZpZWROYW1lCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFF1YWxpZmllZE5hbWVXaXRoV2lsZGNhcmRBY2Nlc3MoKS5nZXRRdWFsaWZpZWROYW1lUGFyc2VyUnVsZUNhbGxfMCgpKTsgCkBAIC03MDc3NCwxNiArNzUyMzEsMTYgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19RdWFsaWZpZWROYW1lV2l0aFdpbGRjYXJkX19Hcm91cF9fMSIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMTU4NDoxOiBydWxlX19RdWFsaWZpZWROYW1lV2l0aFdpbGRjYXJkX19Hcm91cF9fMSA6IHJ1bGVfX1F1YWxpZmllZE5hbWVXaXRoV2lsZGNhcmRfX0dyb3VwX18xX19JbXBsIHJ1bGVfX1F1YWxpZmllZE5hbWVXaXRoV2lsZGNhcmRfX0dyb3VwX18yIDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMjkyMjoxOiBydWxlX19RdWFsaWZpZWROYW1lV2l0aFdpbGRjYXJkX19Hcm91cF9fMSA6IHJ1bGVfX1F1YWxpZmllZE5hbWVXaXRoV2lsZGNhcmRfX0dyb3VwX18xX19JbXBsIHJ1bGVfX1F1YWxpZmllZE5hbWVXaXRoV2lsZGNhcmRfX0dyb3VwX18yIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19RdWFsaWZpZWROYW1lV2l0aFdpbGRjYXJkX19Hcm91cF9fMSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMTU4ODoxOiAoIHJ1bGVfX1F1YWxpZmllZE5hbWVXaXRoV2lsZGNhcmRfX0dyb3VwX18xX19JbXBsIHJ1bGVfX1F1YWxpZmllZE5hbWVXaXRoV2lsZGNhcmRfX0dyb3VwX18yICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIxNTg5OjI6IHJ1bGVfX1F1YWxpZmllZE5hbWVXaXRoV2lsZGNhcmRfX0dyb3VwX18xX19JbXBsIHJ1bGVfX1F1YWxpZmllZE5hbWVXaXRoV2lsZGNhcmRfX0dyb3VwX18yCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMjkyNjoxOiAoIHJ1bGVfX1F1YWxpZmllZE5hbWVXaXRoV2lsZGNhcmRfX0dyb3VwX18xX19JbXBsIHJ1bGVfX1F1YWxpZmllZE5hbWVXaXRoV2lsZGNhcmRfX0dyb3VwX18yICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIyOTI3OjI6IHJ1bGVfX1F1YWxpZmllZE5hbWVXaXRoV2lsZGNhcmRfX0dyb3VwX18xX19JbXBsIHJ1bGVfX1F1YWxpZmllZE5hbWVXaXRoV2lsZGNhcmRfX0dyb3VwX18yCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV18xNTQpOworICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMTYyKTsKICAgICAgICAgICAgIHJ1bGVfX1F1YWxpZmllZE5hbWVXaXRoV2lsZGNhcmRfX0dyb3VwX18xX19JbXBsKCk7CiAKICAgICAgICAgICAgIHN0YXRlLl9mc3AtLTsKQEAgLTcwODEyLDE3ICs3NTI2OSwxNyBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX1F1YWxpZmllZE5hbWVXaXRoV2lsZGNhcmRfX0dyb3VwX18xX19JbXBsIgotICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIxNTk2OjE6IHJ1bGVfX1F1YWxpZmllZE5hbWVXaXRoV2lsZGNhcmRfX0dyb3VwX18xX19JbXBsIDogKCAnLicgKSA7CisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjI5MzQ6MTogcnVsZV9fUXVhbGlmaWVkTmFtZVdpdGhXaWxkY2FyZF9fR3JvdXBfXzFfX0ltcGwgOiAoICcuJyApIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19RdWFsaWZpZWROYW1lV2l0aFdpbGRjYXJkX19Hcm91cF9fMV9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMTYwMDoxOiAoICggJy4nICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjE2MDE6MTogKCAnLicgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjI5Mzg6MTogKCAoICcuJyApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIyOTM5OjE6ICggJy4nICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIxNjAxOjE6ICggJy4nICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIxNjAyOjI6ICcuJworICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjI5Mzk6MTogKCAnLicgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjI5NDA6MjogJy4nCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFF1YWxpZmllZE5hbWVXaXRoV2lsZGNhcmRBY2Nlc3MoKS5nZXRGdWxsU3RvcEtleXdvcmRfMSgpKTsgCkBAIC03MDg1MywxNCArNzUzMTAsMTQgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19RdWFsaWZpZWROYW1lV2l0aFdpbGRjYXJkX19Hcm91cF9fMiIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMTYxMToxOiBydWxlX19RdWFsaWZpZWROYW1lV2l0aFdpbGRjYXJkX19Hcm91cF9fMiA6IHJ1bGVfX1F1YWxpZmllZE5hbWVXaXRoV2lsZGNhcmRfX0dyb3VwX18yX19JbXBsIDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMjk0OToxOiBydWxlX19RdWFsaWZpZWROYW1lV2l0aFdpbGRjYXJkX19Hcm91cF9fMiA6IHJ1bGVfX1F1YWxpZmllZE5hbWVXaXRoV2lsZGNhcmRfX0dyb3VwX18yX19JbXBsIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19RdWFsaWZpZWROYW1lV2l0aFdpbGRjYXJkX19Hcm91cF9fMigpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMTYxNToxOiAoIHJ1bGVfX1F1YWxpZmllZE5hbWVXaXRoV2lsZGNhcmRfX0dyb3VwX18yX19JbXBsICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIxNjE2OjI6IHJ1bGVfX1F1YWxpZmllZE5hbWVXaXRoV2lsZGNhcmRfX0dyb3VwX18yX19JbXBsCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMjk1MzoxOiAoIHJ1bGVfX1F1YWxpZmllZE5hbWVXaXRoV2lsZGNhcmRfX0dyb3VwX18yX19JbXBsICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIyOTU0OjI6IHJ1bGVfX1F1YWxpZmllZE5hbWVXaXRoV2lsZGNhcmRfX0dyb3VwX18yX19JbXBsCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV18yKTsKICAgICAgICAgICAgIHJ1bGVfX1F1YWxpZmllZE5hbWVXaXRoV2lsZGNhcmRfX0dyb3VwX18yX19JbXBsKCk7CkBAIC03MDg4NiwxNyArNzUzNDMsMTcgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19RdWFsaWZpZWROYW1lV2l0aFdpbGRjYXJkX19Hcm91cF9fMl9fSW1wbCIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMTYyMjoxOiBydWxlX19RdWFsaWZpZWROYW1lV2l0aFdpbGRjYXJkX19Hcm91cF9fMl9fSW1wbCA6ICggJyonICkgOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIyOTYwOjE6IHJ1bGVfX1F1YWxpZmllZE5hbWVXaXRoV2lsZGNhcmRfX0dyb3VwX18yX19JbXBsIDogKCAnKicgKSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fUXVhbGlmaWVkTmFtZVdpdGhXaWxkY2FyZF9fR3JvdXBfXzJfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjE2MjY6MTogKCAoICcqJyApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIxNjI3OjE6ICggJyonICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIyOTY0OjE6ICggKCAnKicgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMjk2NToxOiAoICcqJyApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMTYyNzoxOiAoICcqJyApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMTYyODoyOiAnKicKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIyOTY1OjE6ICggJyonICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIyOTY2OjI6ICcqJwogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRRdWFsaWZpZWROYW1lV2l0aFdpbGRjYXJkQWNjZXNzKCkuZ2V0QXN0ZXJpc2tLZXl3b3JkXzIoKSk7IApAQCAtNzA5MjcsMTYgKzc1Mzg0LDE2IEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fUXVhbGlmaWVkTmFtZUluU3RhdGljSW1wb3J0X19Hcm91cF9fMCIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMTYzODoxOiBydWxlX19RdWFsaWZpZWROYW1lSW5TdGF0aWNJbXBvcnRfX0dyb3VwX18wIDogcnVsZV9fUXVhbGlmaWVkTmFtZUluU3RhdGljSW1wb3J0X19Hcm91cF9fMF9fSW1wbCBydWxlX19RdWFsaWZpZWROYW1lSW5TdGF0aWNJbXBvcnRfX0dyb3VwX18xIDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMjk3NjoxOiBydWxlX19RdWFsaWZpZWROYW1lSW5TdGF0aWNJbXBvcnRfX0dyb3VwX18wIDogcnVsZV9fUXVhbGlmaWVkTmFtZUluU3RhdGljSW1wb3J0X19Hcm91cF9fMF9fSW1wbCBydWxlX19RdWFsaWZpZWROYW1lSW5TdGF0aWNJbXBvcnRfX0dyb3VwX18xIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19RdWFsaWZpZWROYW1lSW5TdGF0aWNJbXBvcnRfX0dyb3VwX18wKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIxNjQyOjE6ICggcnVsZV9fUXVhbGlmaWVkTmFtZUluU3RhdGljSW1wb3J0X19Hcm91cF9fMF9fSW1wbCBydWxlX19RdWFsaWZpZWROYW1lSW5TdGF0aWNJbXBvcnRfX0dyb3VwX18xICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIxNjQzOjI6IHJ1bGVfX1F1YWxpZmllZE5hbWVJblN0YXRpY0ltcG9ydF9fR3JvdXBfXzBfX0ltcGwgcnVsZV9fUXVhbGlmaWVkTmFtZUluU3RhdGljSW1wb3J0X19Hcm91cF9fMQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjI5ODA6MTogKCBydWxlX19RdWFsaWZpZWROYW1lSW5TdGF0aWNJbXBvcnRfX0dyb3VwX18wX19JbXBsIHJ1bGVfX1F1YWxpZmllZE5hbWVJblN0YXRpY0ltcG9ydF9fR3JvdXBfXzEgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjI5ODE6MjogcnVsZV9fUXVhbGlmaWVkTmFtZUluU3RhdGljSW1wb3J0X19Hcm91cF9fMF9fSW1wbCBydWxlX19RdWFsaWZpZWROYW1lSW5TdGF0aWNJbXBvcnRfX0dyb3VwX18xCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV182Mik7CisgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV183MCk7CiAgICAgICAgICAgICBydWxlX19RdWFsaWZpZWROYW1lSW5TdGF0aWNJbXBvcnRfX0dyb3VwX18wX19JbXBsKCk7CiAKICAgICAgICAgICAgIHN0YXRlLl9mc3AtLTsKQEAgLTcwOTY1LDE3ICs3NTQyMiwxNyBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX1F1YWxpZmllZE5hbWVJblN0YXRpY0ltcG9ydF9fR3JvdXBfXzBfX0ltcGwiCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjE2NTA6MTogcnVsZV9fUXVhbGlmaWVkTmFtZUluU3RhdGljSW1wb3J0X19Hcm91cF9fMF9fSW1wbCA6ICggcnVsZVZhbGlkSUQgKSA7CisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjI5ODg6MTogcnVsZV9fUXVhbGlmaWVkTmFtZUluU3RhdGljSW1wb3J0X19Hcm91cF9fMF9fSW1wbCA6ICggcnVsZVZhbGlkSUQgKSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fUXVhbGlmaWVkTmFtZUluU3RhdGljSW1wb3J0X19Hcm91cF9fMF9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMTY1NDoxOiAoICggcnVsZVZhbGlkSUQgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMTY1NToxOiAoIHJ1bGVWYWxpZElEICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIyOTkyOjE6ICggKCBydWxlVmFsaWRJRCApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIyOTkzOjE6ICggcnVsZVZhbGlkSUQgKQogICAgICAgICAgICAgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjE2NTU6MTogKCBydWxlVmFsaWRJRCApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMTY1NjoyOiBydWxlVmFsaWRJRAorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjI5OTM6MTogKCBydWxlVmFsaWRJRCApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMjk5NDoyOiBydWxlVmFsaWRJRAogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRRdWFsaWZpZWROYW1lSW5TdGF0aWNJbXBvcnRBY2Nlc3MoKS5nZXRWYWxpZElEUGFyc2VyUnVsZUNhbGxfMCgpKTsgCkBAIC03MTAxMCwxNCArNzU0NjcsMTQgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19RdWFsaWZpZWROYW1lSW5TdGF0aWNJbXBvcnRfX0dyb3VwX18xIgotICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIxNjY1OjE6IHJ1bGVfX1F1YWxpZmllZE5hbWVJblN0YXRpY0ltcG9ydF9fR3JvdXBfXzEgOiBydWxlX19RdWFsaWZpZWROYW1lSW5TdGF0aWNJbXBvcnRfX0dyb3VwX18xX19JbXBsIDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMzAwMzoxOiBydWxlX19RdWFsaWZpZWROYW1lSW5TdGF0aWNJbXBvcnRfX0dyb3VwX18xIDogcnVsZV9fUXVhbGlmaWVkTmFtZUluU3RhdGljSW1wb3J0X19Hcm91cF9fMV9fSW1wbCA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fUXVhbGlmaWVkTmFtZUluU3RhdGljSW1wb3J0X19Hcm91cF9fMSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMTY2OToxOiAoIHJ1bGVfX1F1YWxpZmllZE5hbWVJblN0YXRpY0ltcG9ydF9fR3JvdXBfXzFfX0ltcGwgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjE2NzA6MjogcnVsZV9fUXVhbGlmaWVkTmFtZUluU3RhdGljSW1wb3J0X19Hcm91cF9fMV9fSW1wbAorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjMwMDc6MTogKCBydWxlX19RdWFsaWZpZWROYW1lSW5TdGF0aWNJbXBvcnRfX0dyb3VwX18xX19JbXBsICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIzMDA4OjI6IHJ1bGVfX1F1YWxpZmllZE5hbWVJblN0YXRpY0ltcG9ydF9fR3JvdXBfXzFfX0ltcGwKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzIpOwogICAgICAgICAgICAgcnVsZV9fUXVhbGlmaWVkTmFtZUluU3RhdGljSW1wb3J0X19Hcm91cF9fMV9fSW1wbCgpOwpAQCAtNzEwNDMsMTcgKzc1NTAwLDE3IEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fUXVhbGlmaWVkTmFtZUluU3RhdGljSW1wb3J0X19Hcm91cF9fMV9fSW1wbCIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMTY3NjoxOiBydWxlX19RdWFsaWZpZWROYW1lSW5TdGF0aWNJbXBvcnRfX0dyb3VwX18xX19JbXBsIDogKCAnLicgKSA7CisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjMwMTQ6MTogcnVsZV9fUXVhbGlmaWVkTmFtZUluU3RhdGljSW1wb3J0X19Hcm91cF9fMV9fSW1wbCA6ICggJy4nICkgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1F1YWxpZmllZE5hbWVJblN0YXRpY0ltcG9ydF9fR3JvdXBfXzFfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjE2ODA6MTogKCAoICcuJyApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIxNjgxOjE6ICggJy4nICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIzMDE4OjE6ICggKCAnLicgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMzAxOToxOiAoICcuJyApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMTY4MToxOiAoICcuJyApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMTY4MjoyOiAnLicKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIzMDE5OjE6ICggJy4nICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIzMDIwOjI6ICcuJwogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRRdWFsaWZpZWROYW1lSW5TdGF0aWNJbXBvcnRBY2Nlc3MoKS5nZXRGdWxsU3RvcEtleXdvcmRfMSgpKTsgCkBAIC03MTA4NCwzMCArNzU1NDEsMzAgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19EYXRhSW50ZXJjaGFuZ2VGaWxlWE1MX19Vbm9yZGVyZWRHcm91cF8zIgotICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIxNjkyOjE6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbGVYTUxfX1Vub3JkZXJlZEdyb3VwXzMgOiAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbGVYTUxfX1Vub3JkZXJlZEdyb3VwXzNfXzAgKT8gOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIzMDMwOjE6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbGVYTUxfX1Vub3JkZXJlZEdyb3VwXzMgOiAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbGVYTUxfX1Vub3JkZXJlZEdyb3VwXzNfXzAgKT8gOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbGVYTUxfX1Vub3JkZXJlZEdyb3VwXzMoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQlnZXRVbm9yZGVyZWRHcm91cEhlbHBlcigpLmVudGVyKGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YUludGVyY2hhbmdlRmlsZVhNTEFjY2VzcygpLmdldFVub3JkZXJlZEdyb3VwXzMoKSk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIxNjk3OjE6ICggKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VGaWxlWE1MX19Vbm9yZGVyZWRHcm91cF8zX18wICk/ICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIxNjk4OjI6ICggcnVsZV9fRGF0YUludGVyY2hhbmdlRmlsZVhNTF9fVW5vcmRlcmVkR3JvdXBfM19fMCApPworICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjMwMzU6MTogKCAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbGVYTUxfX1Vub3JkZXJlZEdyb3VwXzNfXzAgKT8gKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjMwMzY6MjogKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VGaWxlWE1MX19Vbm9yZGVyZWRHcm91cF8zX18wICk/CiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMTY5ODoyOiAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbGVYTUxfX1Vub3JkZXJlZEdyb3VwXzNfXzAgKT8KLSAgICAgICAgICAgIGludCBhbHQxNjk9MjsKLSAgICAgICAgICAgIGludCBMQTE2OV8wID0gaW5wdXQuTEEoMSk7CisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMzAzNjoyOiAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbGVYTUxfX1Vub3JkZXJlZEdyb3VwXzNfXzAgKT8KKyAgICAgICAgICAgIGludCBhbHQxODI9MjsKKyAgICAgICAgICAgIGludCBMQTE4Ml8wID0gaW5wdXQuTEEoMSk7CiAKLSAgICAgICAgICAgIGlmICggTEExNjlfMCA9PSAxNDEgJiYgZ2V0VW5vcmRlcmVkR3JvdXBIZWxwZXIoKS5jYW5TZWxlY3QoZ3JhbW1hckFjY2Vzcy5nZXREYXRhSW50ZXJjaGFuZ2VGaWxlWE1MQWNjZXNzKCkuZ2V0VW5vcmRlcmVkR3JvdXBfMygpLCAwKSApIHsKLSAgICAgICAgICAgICAgICBhbHQxNjk9MTsKKyAgICAgICAgICAgIGlmICggTEExODJfMCA9PSAxNTIgJiYgZ2V0VW5vcmRlcmVkR3JvdXBIZWxwZXIoKS5jYW5TZWxlY3QoZ3JhbW1hckFjY2Vzcy5nZXREYXRhSW50ZXJjaGFuZ2VGaWxlWE1MQWNjZXNzKCkuZ2V0VW5vcmRlcmVkR3JvdXBfMygpLCAwKSApIHsKKyAgICAgICAgICAgICAgICBhbHQxODI9MTsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgaWYgKCBMQTE2OV8wID09IDc4ICYmIGdldFVub3JkZXJlZEdyb3VwSGVscGVyKCkuY2FuU2VsZWN0KGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YUludGVyY2hhbmdlRmlsZVhNTEFjY2VzcygpLmdldFVub3JkZXJlZEdyb3VwXzMoKSwgMSkgKSB7Ci0gICAgICAgICAgICAgICAgYWx0MTY5PTE7CisgICAgICAgICAgICBlbHNlIGlmICggTEExODJfMCA9PSA4MyAmJiBnZXRVbm9yZGVyZWRHcm91cEhlbHBlcigpLmNhblNlbGVjdChncmFtbWFyQWNjZXNzLmdldERhdGFJbnRlcmNoYW5nZUZpbGVYTUxBY2Nlc3MoKS5nZXRVbm9yZGVyZWRHcm91cF8zKCksIDEpICkgeworICAgICAgICAgICAgICAgIGFsdDE4Mj0xOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSBpZiAoIExBMTY5XzAgPT0gNzkgJiYgZ2V0VW5vcmRlcmVkR3JvdXBIZWxwZXIoKS5jYW5TZWxlY3QoZ3JhbW1hckFjY2Vzcy5nZXREYXRhSW50ZXJjaGFuZ2VGaWxlWE1MQWNjZXNzKCkuZ2V0VW5vcmRlcmVkR3JvdXBfMygpLCAyKSApIHsKLSAgICAgICAgICAgICAgICBhbHQxNjk9MTsKKyAgICAgICAgICAgIGVsc2UgaWYgKCBMQTE4Ml8wID09IDg0ICYmIGdldFVub3JkZXJlZEdyb3VwSGVscGVyKCkuY2FuU2VsZWN0KGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YUludGVyY2hhbmdlRmlsZVhNTEFjY2VzcygpLmdldFVub3JkZXJlZEdyb3VwXzMoKSwgMikgKSB7CisgICAgICAgICAgICAgICAgYWx0MTgyPTE7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBzd2l0Y2ggKGFsdDE2OSkgeworICAgICAgICAgICAgc3dpdGNoIChhbHQxODIpIHsKICAgICAgICAgICAgICAgICBjYXNlIDEgOgogICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzowOjA6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbGVYTUxfX1Vub3JkZXJlZEdyb3VwXzNfXzAKICAgICAgICAgICAgICAgICAgICAgewpAQCAtNzExNDIsNjAgKzc1NTk5LDYwIEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fRGF0YUludGVyY2hhbmdlRmlsZVhNTF9fVW5vcmRlcmVkR3JvdXBfM19fSW1wbCIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMTcwNjoxOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VGaWxlWE1MX19Vbm9yZGVyZWRHcm91cF8zX19JbXBsIDogKCAoey4uLn0/ID0+ICggKCAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbGVYTUxfX0J5QXR0cmlidXRlQXNzaWdubWVudF8zXzAgKSApICkgKSB8ICh7Li4ufT8gPT4gKCAoICggcnVsZV9fRGF0YUludGVyY2hhbmdlRmlsZVhNTF9fR3JvdXBfM18xX18wICkgKSApICkgfCAoey4uLn0/ID0+ICggKCAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbGVYTUxfX0dyb3VwXzNfMl9fMCApICkgKSApICkgOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIzMDQ0OjE6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbGVYTUxfX1Vub3JkZXJlZEdyb3VwXzNfX0ltcGwgOiAoICh7Li4ufT8gPT4gKCAoICggcnVsZV9fRGF0YUludGVyY2hhbmdlRmlsZVhNTF9fQnlBdHRyaWJ1dGVBc3NpZ25tZW50XzNfMCApICkgKSApIHwgKHsuLi59PyA9PiAoICggKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VGaWxlWE1MX19Hcm91cF8zXzFfXzAgKSApICkgKSB8ICh7Li4ufT8gPT4gKCAoICggcnVsZV9fRGF0YUludGVyY2hhbmdlRmlsZVhNTF9fR3JvdXBfM18yX18wICkgKSApICkgKSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fRGF0YUludGVyY2hhbmdlRmlsZVhNTF9fVW5vcmRlcmVkR3JvdXBfM19fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCWJvb2xlYW4gc2VsZWN0ZWQgPSBmYWxzZTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjE3MTE6MTogKCAoICh7Li4ufT8gPT4gKCAoICggcnVsZV9fRGF0YUludGVyY2hhbmdlRmlsZVhNTF9fQnlBdHRyaWJ1dGVBc3NpZ25tZW50XzNfMCApICkgKSApIHwgKHsuLi59PyA9PiAoICggKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VGaWxlWE1MX19Hcm91cF8zXzFfXzAgKSApICkgKSB8ICh7Li4ufT8gPT4gKCAoICggcnVsZV9fRGF0YUludGVyY2hhbmdlRmlsZVhNTF9fR3JvdXBfM18yX18wICkgKSApICkgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMTcxMjozOiAoICh7Li4ufT8gPT4gKCAoICggcnVsZV9fRGF0YUludGVyY2hhbmdlRmlsZVhNTF9fQnlBdHRyaWJ1dGVBc3NpZ25tZW50XzNfMCApICkgKSApIHwgKHsuLi59PyA9PiAoICggKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VGaWxlWE1MX19Hcm91cF8zXzFfXzAgKSApICkgKSB8ICh7Li4ufT8gPT4gKCAoICggcnVsZV9fRGF0YUludGVyY2hhbmdlRmlsZVhNTF9fR3JvdXBfM18yX18wICkgKSApICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjMwNDk6MTogKCAoICh7Li4ufT8gPT4gKCAoICggcnVsZV9fRGF0YUludGVyY2hhbmdlRmlsZVhNTF9fQnlBdHRyaWJ1dGVBc3NpZ25tZW50XzNfMCApICkgKSApIHwgKHsuLi59PyA9PiAoICggKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VGaWxlWE1MX19Hcm91cF8zXzFfXzAgKSApICkgKSB8ICh7Li4ufT8gPT4gKCAoICggcnVsZV9fRGF0YUludGVyY2hhbmdlRmlsZVhNTF9fR3JvdXBfM18yX18wICkgKSApICkgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMzA1MDozOiAoICh7Li4ufT8gPT4gKCAoICggcnVsZV9fRGF0YUludGVyY2hhbmdlRmlsZVhNTF9fQnlBdHRyaWJ1dGVBc3NpZ25tZW50XzNfMCApICkgKSApIHwgKHsuLi59PyA9PiAoICggKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VGaWxlWE1MX19Hcm91cF8zXzFfXzAgKSApICkgKSB8ICh7Li4ufT8gPT4gKCAoICggcnVsZV9fRGF0YUludGVyY2hhbmdlRmlsZVhNTF9fR3JvdXBfM18yX18wICkgKSApICkgKQogICAgICAgICAgICAgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjE3MTI6MzogKCAoey4uLn0/ID0+ICggKCAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbGVYTUxfX0J5QXR0cmlidXRlQXNzaWdubWVudF8zXzAgKSApICkgKSB8ICh7Li4ufT8gPT4gKCAoICggcnVsZV9fRGF0YUludGVyY2hhbmdlRmlsZVhNTF9fR3JvdXBfM18xX18wICkgKSApICkgfCAoey4uLn0/ID0+ICggKCAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbGVYTUxfX0dyb3VwXzNfMl9fMCApICkgKSApICkKLSAgICAgICAgICAgIGludCBhbHQxNzA9MzsKLSAgICAgICAgICAgIGludCBMQTE3MF8wID0gaW5wdXQuTEEoMSk7CisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMzA1MDozOiAoICh7Li4ufT8gPT4gKCAoICggcnVsZV9fRGF0YUludGVyY2hhbmdlRmlsZVhNTF9fQnlBdHRyaWJ1dGVBc3NpZ25tZW50XzNfMCApICkgKSApIHwgKHsuLi59PyA9PiAoICggKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VGaWxlWE1MX19Hcm91cF8zXzFfXzAgKSApICkgKSB8ICh7Li4ufT8gPT4gKCAoICggcnVsZV9fRGF0YUludGVyY2hhbmdlRmlsZVhNTF9fR3JvdXBfM18yX18wICkgKSApICkgKQorICAgICAgICAgICAgaW50IGFsdDE4Mz0zOworICAgICAgICAgICAgaW50IExBMTgzXzAgPSBpbnB1dC5MQSgxKTsKIAotICAgICAgICAgICAgaWYgKCBMQTE3MF8wID09IDE0MSAmJiBnZXRVbm9yZGVyZWRHcm91cEhlbHBlcigpLmNhblNlbGVjdChncmFtbWFyQWNjZXNzLmdldERhdGFJbnRlcmNoYW5nZUZpbGVYTUxBY2Nlc3MoKS5nZXRVbm9yZGVyZWRHcm91cF8zKCksIDApICkgewotICAgICAgICAgICAgICAgIGFsdDE3MD0xOworICAgICAgICAgICAgaWYgKCBMQTE4M18wID09IDE1MiAmJiBnZXRVbm9yZGVyZWRHcm91cEhlbHBlcigpLmNhblNlbGVjdChncmFtbWFyQWNjZXNzLmdldERhdGFJbnRlcmNoYW5nZUZpbGVYTUxBY2Nlc3MoKS5nZXRVbm9yZGVyZWRHcm91cF8zKCksIDApICkgeworICAgICAgICAgICAgICAgIGFsdDE4Mz0xOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSBpZiAoIExBMTcwXzAgPT0gNzggJiYgZ2V0VW5vcmRlcmVkR3JvdXBIZWxwZXIoKS5jYW5TZWxlY3QoZ3JhbW1hckFjY2Vzcy5nZXREYXRhSW50ZXJjaGFuZ2VGaWxlWE1MQWNjZXNzKCkuZ2V0VW5vcmRlcmVkR3JvdXBfMygpLCAxKSApIHsKLSAgICAgICAgICAgICAgICBhbHQxNzA9MjsKKyAgICAgICAgICAgIGVsc2UgaWYgKCBMQTE4M18wID09IDgzICYmIGdldFVub3JkZXJlZEdyb3VwSGVscGVyKCkuY2FuU2VsZWN0KGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YUludGVyY2hhbmdlRmlsZVhNTEFjY2VzcygpLmdldFVub3JkZXJlZEdyb3VwXzMoKSwgMSkgKSB7CisgICAgICAgICAgICAgICAgYWx0MTgzPTI7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIGlmICggTEExNzBfMCA9PSA3OSAmJiBnZXRVbm9yZGVyZWRHcm91cEhlbHBlcigpLmNhblNlbGVjdChncmFtbWFyQWNjZXNzLmdldERhdGFJbnRlcmNoYW5nZUZpbGVYTUxBY2Nlc3MoKS5nZXRVbm9yZGVyZWRHcm91cF8zKCksIDIpICkgewotICAgICAgICAgICAgICAgIGFsdDE3MD0zOworICAgICAgICAgICAgZWxzZSBpZiAoIExBMTgzXzAgPT0gODQgJiYgZ2V0VW5vcmRlcmVkR3JvdXBIZWxwZXIoKS5jYW5TZWxlY3QoZ3JhbW1hckFjY2Vzcy5nZXREYXRhSW50ZXJjaGFuZ2VGaWxlWE1MQWNjZXNzKCkuZ2V0VW5vcmRlcmVkR3JvdXBfMygpLCAyKSApIHsKKyAgICAgICAgICAgICAgICBhbHQxODM9MzsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgIGlmIChzdGF0ZS5iYWNrdHJhY2tpbmc+MCkge3N0YXRlLmZhaWxlZD10cnVlOyByZXR1cm4gO30KICAgICAgICAgICAgICAgICBOb1ZpYWJsZUFsdEV4Y2VwdGlvbiBudmFlID0KLSAgICAgICAgICAgICAgICAgICAgbmV3IE5vVmlhYmxlQWx0RXhjZXB0aW9uKCIiLCAxNzAsIDAsIGlucHV0KTsKKyAgICAgICAgICAgICAgICAgICAgbmV3IE5vVmlhYmxlQWx0RXhjZXB0aW9uKCIiLCAxODMsIDAsIGlucHV0KTsKIAogICAgICAgICAgICAgICAgIHRocm93IG52YWU7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBzd2l0Y2ggKGFsdDE3MCkgeworICAgICAgICAgICAgc3dpdGNoIChhbHQxODMpIHsKICAgICAgICAgICAgICAgICBjYXNlIDEgOgotICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMTcxMzozOiAoey4uLn0/ID0+ICggKCAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbGVYTUxfX0J5QXR0cmlidXRlQXNzaWdubWVudF8zXzAgKSApICkgKQorICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMzA1MTozOiAoey4uLn0/ID0+ICggKCAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbGVYTUxfX0J5QXR0cmlidXRlQXNzaWdubWVudF8zXzAgKSApICkgKQogICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIxNzEzOjM6ICh7Li4ufT8gPT4gKCAoICggcnVsZV9fRGF0YUludGVyY2hhbmdlRmlsZVhNTF9fQnlBdHRyaWJ1dGVBc3NpZ25tZW50XzNfMCApICkgKSApCi0gICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIxNzE0OjQ6IHsuLi59PyA9PiAoICggKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VGaWxlWE1MX19CeUF0dHJpYnV0ZUFzc2lnbm1lbnRfM18wICkgKSApCisgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIzMDUxOjM6ICh7Li4ufT8gPT4gKCAoICggcnVsZV9fRGF0YUludGVyY2hhbmdlRmlsZVhNTF9fQnlBdHRyaWJ1dGVBc3NpZ25tZW50XzNfMCApICkgKSApCisgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIzMDUyOjQ6IHsuLi59PyA9PiAoICggKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VGaWxlWE1MX19CeUF0dHJpYnV0ZUFzc2lnbm1lbnRfM18wICkgKSApCiAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgaWYgKCAhIGdldFVub3JkZXJlZEdyb3VwSGVscGVyKCkuY2FuU2VsZWN0KGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YUludGVyY2hhbmdlRmlsZVhNTEFjY2VzcygpLmdldFVub3JkZXJlZEdyb3VwXzMoKSwgMCkgKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3RhdGUuYmFja3RyYWNraW5nPjApIHtzdGF0ZS5mYWlsZWQ9dHJ1ZTsgcmV0dXJuIDt9CiAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRmFpbGVkUHJlZGljYXRlRXhjZXB0aW9uKGlucHV0LCAicnVsZV9fRGF0YUludGVyY2hhbmdlRmlsZVhNTF9fVW5vcmRlcmVkR3JvdXBfM19fSW1wbCIsICJnZXRVbm9yZGVyZWRHcm91cEhlbHBlcigpLmNhblNlbGVjdChncmFtbWFyQWNjZXNzLmdldERhdGFJbnRlcmNoYW5nZUZpbGVYTUxBY2Nlc3MoKS5nZXRVbm9yZGVyZWRHcm91cF8zKCksIDApIik7CiAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjE3MTQ6MTE4OiAoICggKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VGaWxlWE1MX19CeUF0dHJpYnV0ZUFzc2lnbm1lbnRfM18wICkgKSApCi0gICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIxNzE1OjU6ICggKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VGaWxlWE1MX19CeUF0dHJpYnV0ZUFzc2lnbm1lbnRfM18wICkgKQorICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMzA1MjoxMTg6ICggKCAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbGVYTUxfX0J5QXR0cmlidXRlQXNzaWdubWVudF8zXzAgKSApICkKKyAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjMwNTM6NTogKCAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbGVYTUxfX0J5QXR0cmlidXRlQXNzaWdubWVudF8zXzAgKSApCiAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgZ2V0VW5vcmRlcmVkR3JvdXBIZWxwZXIoKS5zZWxlY3QoZ3JhbW1hckFjY2Vzcy5nZXREYXRhSW50ZXJjaGFuZ2VGaWxlWE1MQWNjZXNzKCkuZ2V0VW5vcmRlcmVkR3JvdXBfMygpLCAwKTsKICAgICAgICAgICAgICAgICAgICAgc2VsZWN0ZWQgPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMTcyMTo1OiAoICggcnVsZV9fRGF0YUludGVyY2hhbmdlRmlsZVhNTF9fQnlBdHRyaWJ1dGVBc3NpZ25tZW50XzNfMCApICkKLSAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjE3MjI6NjogKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VGaWxlWE1MX19CeUF0dHJpYnV0ZUFzc2lnbm1lbnRfM18wICkKKyAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjMwNTk6NTogKCAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbGVYTUxfX0J5QXR0cmlidXRlQXNzaWdubWVudF8zXzAgKSApCisgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIzMDYwOjY6ICggcnVsZV9fRGF0YUludGVyY2hhbmdlRmlsZVhNTF9fQnlBdHRyaWJ1dGVBc3NpZ25tZW50XzNfMCApCiAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldERhdGFJbnRlcmNoYW5nZUZpbGVYTUxBY2Nlc3MoKS5nZXRCeUF0dHJpYnV0ZUFzc2lnbm1lbnRfM18wKCkpOyAKICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMTcyMzo2OiAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbGVYTUxfX0J5QXR0cmlidXRlQXNzaWdubWVudF8zXzAgKQotICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMTcyMzo3OiBydWxlX19EYXRhSW50ZXJjaGFuZ2VGaWxlWE1MX19CeUF0dHJpYnV0ZUFzc2lnbm1lbnRfM18wCisgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIzMDYxOjY6ICggcnVsZV9fRGF0YUludGVyY2hhbmdlRmlsZVhNTF9fQnlBdHRyaWJ1dGVBc3NpZ25tZW50XzNfMCApCisgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIzMDYxOjc6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbGVYTUxfX0J5QXR0cmlidXRlQXNzaWdubWVudF8zXzAKICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV18yKTsKICAgICAgICAgICAgICAgICAgICAgcnVsZV9fRGF0YUludGVyY2hhbmdlRmlsZVhNTF9fQnlBdHRyaWJ1dGVBc3NpZ25tZW50XzNfMCgpOwpAQCAtNzEyMjEsMjggKzc1Njc4LDI4IEBACiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgY2FzZSAyIDoKLSAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjE3Mjg6MzogKHsuLi59PyA9PiAoICggKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VGaWxlWE1MX19Hcm91cF8zXzFfXzAgKSApICkgKQorICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMzA2NjozOiAoey4uLn0/ID0+ICggKCAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbGVYTUxfX0dyb3VwXzNfMV9fMCApICkgKSApCiAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjE3Mjg6MzogKHsuLi59PyA9PiAoICggKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VGaWxlWE1MX19Hcm91cF8zXzFfXzAgKSApICkgKQotICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMTcyOTo0OiB7Li4ufT8gPT4gKCAoICggcnVsZV9fRGF0YUludGVyY2hhbmdlRmlsZVhNTF9fR3JvdXBfM18xX18wICkgKSApCisgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIzMDY2OjM6ICh7Li4ufT8gPT4gKCAoICggcnVsZV9fRGF0YUludGVyY2hhbmdlRmlsZVhNTF9fR3JvdXBfM18xX18wICkgKSApICkKKyAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjMwNjc6NDogey4uLn0/ID0+ICggKCAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbGVYTUxfX0dyb3VwXzNfMV9fMCApICkgKQogICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgIGlmICggISBnZXRVbm9yZGVyZWRHcm91cEhlbHBlcigpLmNhblNlbGVjdChncmFtbWFyQWNjZXNzLmdldERhdGFJbnRlcmNoYW5nZUZpbGVYTUxBY2Nlc3MoKS5nZXRVbm9yZGVyZWRHcm91cF8zKCksIDEpICkgewogICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN0YXRlLmJhY2t0cmFja2luZz4wKSB7c3RhdGUuZmFpbGVkPXRydWU7IHJldHVybiA7fQogICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEZhaWxlZFByZWRpY2F0ZUV4Y2VwdGlvbihpbnB1dCwgInJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbGVYTUxfX1Vub3JkZXJlZEdyb3VwXzNfX0ltcGwiLCAiZ2V0VW5vcmRlcmVkR3JvdXBIZWxwZXIoKS5jYW5TZWxlY3QoZ3JhbW1hckFjY2Vzcy5nZXREYXRhSW50ZXJjaGFuZ2VGaWxlWE1MQWNjZXNzKCkuZ2V0VW5vcmRlcmVkR3JvdXBfMygpLCAxKSIpOwogICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIxNzI5OjExODogKCAoICggcnVsZV9fRGF0YUludGVyY2hhbmdlRmlsZVhNTF9fR3JvdXBfM18xX18wICkgKSApCi0gICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIxNzMwOjU6ICggKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VGaWxlWE1MX19Hcm91cF8zXzFfXzAgKSApCisgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIzMDY3OjExODogKCAoICggcnVsZV9fRGF0YUludGVyY2hhbmdlRmlsZVhNTF9fR3JvdXBfM18xX18wICkgKSApCisgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIzMDY4OjU6ICggKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VGaWxlWE1MX19Hcm91cF8zXzFfXzAgKSApCiAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgZ2V0VW5vcmRlcmVkR3JvdXBIZWxwZXIoKS5zZWxlY3QoZ3JhbW1hckFjY2Vzcy5nZXREYXRhSW50ZXJjaGFuZ2VGaWxlWE1MQWNjZXNzKCkuZ2V0VW5vcmRlcmVkR3JvdXBfMygpLCAxKTsKICAgICAgICAgICAgICAgICAgICAgc2VsZWN0ZWQgPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMTczNjo1OiAoICggcnVsZV9fRGF0YUludGVyY2hhbmdlRmlsZVhNTF9fR3JvdXBfM18xX18wICkgKQotICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMTczNzo2OiAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbGVYTUxfX0dyb3VwXzNfMV9fMCApCisgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIzMDc0OjU6ICggKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VGaWxlWE1MX19Hcm91cF8zXzFfXzAgKSApCisgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIzMDc1OjY6ICggcnVsZV9fRGF0YUludGVyY2hhbmdlRmlsZVhNTF9fR3JvdXBfM18xX18wICkKICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YUludGVyY2hhbmdlRmlsZVhNTEFjY2VzcygpLmdldEdyb3VwXzNfMSgpKTsgCiAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjE3Mzg6NjogKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VGaWxlWE1MX19Hcm91cF8zXzFfXzAgKQotICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMTczODo3OiBydWxlX19EYXRhSW50ZXJjaGFuZ2VGaWxlWE1MX19Hcm91cF8zXzFfXzAKKyAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjMwNzY6NjogKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VGaWxlWE1MX19Hcm91cF8zXzFfXzAgKQorICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMzA3Njo3OiBydWxlX19EYXRhSW50ZXJjaGFuZ2VGaWxlWE1MX19Hcm91cF8zXzFfXzAKICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV18yKTsKICAgICAgICAgICAgICAgICAgICAgcnVsZV9fRGF0YUludGVyY2hhbmdlRmlsZVhNTF9fR3JvdXBfM18xX18wKCk7CkBAIC03MTI2OCwyOCArNzU3MjUsMjggQEAKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICBjYXNlIDMgOgotICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMTc0MzozOiAoey4uLn0/ID0+ICggKCAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbGVYTUxfX0dyb3VwXzNfMl9fMCApICkgKSApCisgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIzMDgxOjM6ICh7Li4ufT8gPT4gKCAoICggcnVsZV9fRGF0YUludGVyY2hhbmdlRmlsZVhNTF9fR3JvdXBfM18yX18wICkgKSApICkKICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMTc0MzozOiAoey4uLn0/ID0+ICggKCAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbGVYTUxfX0dyb3VwXzNfMl9fMCApICkgKSApCi0gICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIxNzQ0OjQ6IHsuLi59PyA9PiAoICggKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VGaWxlWE1MX19Hcm91cF8zXzJfXzAgKSApICkKKyAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjMwODE6MzogKHsuLi59PyA9PiAoICggKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VGaWxlWE1MX19Hcm91cF8zXzJfXzAgKSApICkgKQorICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMzA4Mjo0OiB7Li4ufT8gPT4gKCAoICggcnVsZV9fRGF0YUludGVyY2hhbmdlRmlsZVhNTF9fR3JvdXBfM18yX18wICkgKSApCiAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgaWYgKCAhIGdldFVub3JkZXJlZEdyb3VwSGVscGVyKCkuY2FuU2VsZWN0KGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YUludGVyY2hhbmdlRmlsZVhNTEFjY2VzcygpLmdldFVub3JkZXJlZEdyb3VwXzMoKSwgMikgKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3RhdGUuYmFja3RyYWNraW5nPjApIHtzdGF0ZS5mYWlsZWQ9dHJ1ZTsgcmV0dXJuIDt9CiAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRmFpbGVkUHJlZGljYXRlRXhjZXB0aW9uKGlucHV0LCAicnVsZV9fRGF0YUludGVyY2hhbmdlRmlsZVhNTF9fVW5vcmRlcmVkR3JvdXBfM19fSW1wbCIsICJnZXRVbm9yZGVyZWRHcm91cEhlbHBlcigpLmNhblNlbGVjdChncmFtbWFyQWNjZXNzLmdldERhdGFJbnRlcmNoYW5nZUZpbGVYTUxBY2Nlc3MoKS5nZXRVbm9yZGVyZWRHcm91cF8zKCksIDIpIik7CiAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjE3NDQ6MTE4OiAoICggKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VGaWxlWE1MX19Hcm91cF8zXzJfXzAgKSApICkKLSAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjE3NDU6NTogKCAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbGVYTUxfX0dyb3VwXzNfMl9fMCApICkKKyAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjMwODI6MTE4OiAoICggKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VGaWxlWE1MX19Hcm91cF8zXzJfXzAgKSApICkKKyAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjMwODM6NTogKCAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbGVYTUxfX0dyb3VwXzNfMl9fMCApICkKICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICBnZXRVbm9yZGVyZWRHcm91cEhlbHBlcigpLnNlbGVjdChncmFtbWFyQWNjZXNzLmdldERhdGFJbnRlcmNoYW5nZUZpbGVYTUxBY2Nlc3MoKS5nZXRVbm9yZGVyZWRHcm91cF8zKCksIDIpOwogICAgICAgICAgICAgICAgICAgICBzZWxlY3RlZCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIxNzUxOjU6ICggKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VGaWxlWE1MX19Hcm91cF8zXzJfXzAgKSApCi0gICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIxNzUyOjY6ICggcnVsZV9fRGF0YUludGVyY2hhbmdlRmlsZVhNTF9fR3JvdXBfM18yX18wICkKKyAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjMwODk6NTogKCAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbGVYTUxfX0dyb3VwXzNfMl9fMCApICkKKyAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjMwOTA6NjogKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VGaWxlWE1MX19Hcm91cF8zXzJfXzAgKQogICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXREYXRhSW50ZXJjaGFuZ2VGaWxlWE1MQWNjZXNzKCkuZ2V0R3JvdXBfM18yKCkpOyAKICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMTc1Mzo2OiAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbGVYTUxfX0dyb3VwXzNfMl9fMCApCi0gICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIxNzUzOjc6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbGVYTUxfX0dyb3VwXzNfMl9fMAorICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMzA5MTo2OiAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbGVYTUxfX0dyb3VwXzNfMl9fMCApCisgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIzMDkxOjc6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbGVYTUxfX0dyb3VwXzNfMl9fMAogICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzIpOwogICAgICAgICAgICAgICAgICAgICBydWxlX19EYXRhSW50ZXJjaGFuZ2VGaWxlWE1MX19Hcm91cF8zXzJfXzAoKTsKQEAgLTcxMzM4LDM0ICs3NTc5NSwzNCBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbGVYTUxfX1Vub3JkZXJlZEdyb3VwXzNfXzAiCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjE3NjY6MTogcnVsZV9fRGF0YUludGVyY2hhbmdlRmlsZVhNTF9fVW5vcmRlcmVkR3JvdXBfM19fMCA6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbGVYTUxfX1Vub3JkZXJlZEdyb3VwXzNfX0ltcGwgKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VGaWxlWE1MX19Vbm9yZGVyZWRHcm91cF8zX18xICk/IDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMzEwNDoxOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VGaWxlWE1MX19Vbm9yZGVyZWRHcm91cF8zX18wIDogcnVsZV9fRGF0YUludGVyY2hhbmdlRmlsZVhNTF9fVW5vcmRlcmVkR3JvdXBfM19fSW1wbCAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbGVYTUxfX1Vub3JkZXJlZEdyb3VwXzNfXzEgKT8gOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbGVYTUxfX1Vub3JkZXJlZEdyb3VwXzNfXzAoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjE3NzA6MTogKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VGaWxlWE1MX19Vbm9yZGVyZWRHcm91cF8zX19JbXBsICggcnVsZV9fRGF0YUludGVyY2hhbmdlRmlsZVhNTF9fVW5vcmRlcmVkR3JvdXBfM19fMSApPyApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMTc3MToyOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VGaWxlWE1MX19Vbm9yZGVyZWRHcm91cF8zX19JbXBsICggcnVsZV9fRGF0YUludGVyY2hhbmdlRmlsZVhNTF9fVW5vcmRlcmVkR3JvdXBfM19fMSApPworICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjMxMDg6MTogKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VGaWxlWE1MX19Vbm9yZGVyZWRHcm91cF8zX19JbXBsICggcnVsZV9fRGF0YUludGVyY2hhbmdlRmlsZVhNTF9fVW5vcmRlcmVkR3JvdXBfM19fMSApPyApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMzEwOToyOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VGaWxlWE1MX19Vbm9yZGVyZWRHcm91cF8zX19JbXBsICggcnVsZV9fRGF0YUludGVyY2hhbmdlRmlsZVhNTF9fVW5vcmRlcmVkR3JvdXBfM19fMSApPwogICAgICAgICAgICAgewotICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMTU1KTsKKyAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzE2Myk7CiAgICAgICAgICAgICBydWxlX19EYXRhSW50ZXJjaGFuZ2VGaWxlWE1MX19Vbm9yZGVyZWRHcm91cF8zX19JbXBsKCk7CiAKICAgICAgICAgICAgIHN0YXRlLl9mc3AtLTsKICAgICAgICAgICAgIGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMTc3MjoyOiAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbGVYTUxfX1Vub3JkZXJlZEdyb3VwXzNfXzEgKT8KLSAgICAgICAgICAgIGludCBhbHQxNzE9MjsKLSAgICAgICAgICAgIGludCBMQTE3MV8wID0gaW5wdXQuTEEoMSk7CisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMzExMDoyOiAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbGVYTUxfX1Vub3JkZXJlZEdyb3VwXzNfXzEgKT8KKyAgICAgICAgICAgIGludCBhbHQxODQ9MjsKKyAgICAgICAgICAgIGludCBMQTE4NF8wID0gaW5wdXQuTEEoMSk7CiAKLSAgICAgICAgICAgIGlmICggTEExNzFfMCA9PSAxNDEgJiYgZ2V0VW5vcmRlcmVkR3JvdXBIZWxwZXIoKS5jYW5TZWxlY3QoZ3JhbW1hckFjY2Vzcy5nZXREYXRhSW50ZXJjaGFuZ2VGaWxlWE1MQWNjZXNzKCkuZ2V0VW5vcmRlcmVkR3JvdXBfMygpLCAwKSApIHsKLSAgICAgICAgICAgICAgICBhbHQxNzE9MTsKKyAgICAgICAgICAgIGlmICggTEExODRfMCA9PSAxNTIgJiYgZ2V0VW5vcmRlcmVkR3JvdXBIZWxwZXIoKS5jYW5TZWxlY3QoZ3JhbW1hckFjY2Vzcy5nZXREYXRhSW50ZXJjaGFuZ2VGaWxlWE1MQWNjZXNzKCkuZ2V0VW5vcmRlcmVkR3JvdXBfMygpLCAwKSApIHsKKyAgICAgICAgICAgICAgICBhbHQxODQ9MTsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgaWYgKCBMQTE3MV8wID09IDc4ICYmIGdldFVub3JkZXJlZEdyb3VwSGVscGVyKCkuY2FuU2VsZWN0KGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YUludGVyY2hhbmdlRmlsZVhNTEFjY2VzcygpLmdldFVub3JkZXJlZEdyb3VwXzMoKSwgMSkgKSB7Ci0gICAgICAgICAgICAgICAgYWx0MTcxPTE7CisgICAgICAgICAgICBlbHNlIGlmICggTEExODRfMCA9PSA4MyAmJiBnZXRVbm9yZGVyZWRHcm91cEhlbHBlcigpLmNhblNlbGVjdChncmFtbWFyQWNjZXNzLmdldERhdGFJbnRlcmNoYW5nZUZpbGVYTUxBY2Nlc3MoKS5nZXRVbm9yZGVyZWRHcm91cF8zKCksIDEpICkgeworICAgICAgICAgICAgICAgIGFsdDE4ND0xOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSBpZiAoIExBMTcxXzAgPT0gNzkgJiYgZ2V0VW5vcmRlcmVkR3JvdXBIZWxwZXIoKS5jYW5TZWxlY3QoZ3JhbW1hckFjY2Vzcy5nZXREYXRhSW50ZXJjaGFuZ2VGaWxlWE1MQWNjZXNzKCkuZ2V0VW5vcmRlcmVkR3JvdXBfMygpLCAyKSApIHsKLSAgICAgICAgICAgICAgICBhbHQxNzE9MTsKKyAgICAgICAgICAgIGVsc2UgaWYgKCBMQTE4NF8wID09IDg0ICYmIGdldFVub3JkZXJlZEdyb3VwSGVscGVyKCkuY2FuU2VsZWN0KGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YUludGVyY2hhbmdlRmlsZVhNTEFjY2VzcygpLmdldFVub3JkZXJlZEdyb3VwXzMoKSwgMikgKSB7CisgICAgICAgICAgICAgICAgYWx0MTg0PTE7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBzd2l0Y2ggKGFsdDE3MSkgeworICAgICAgICAgICAgc3dpdGNoIChhbHQxODQpIHsKICAgICAgICAgICAgICAgICBjYXNlIDEgOgogICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzowOjA6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbGVYTUxfX1Vub3JkZXJlZEdyb3VwXzNfXzEKICAgICAgICAgICAgICAgICAgICAgewpAQCAtNzEzOTksMzQgKzc1ODU2LDM0IEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fRGF0YUludGVyY2hhbmdlRmlsZVhNTF9fVW5vcmRlcmVkR3JvdXBfM19fMSIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMTc3ODoxOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VGaWxlWE1MX19Vbm9yZGVyZWRHcm91cF8zX18xIDogcnVsZV9fRGF0YUludGVyY2hhbmdlRmlsZVhNTF9fVW5vcmRlcmVkR3JvdXBfM19fSW1wbCAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbGVYTUxfX1Vub3JkZXJlZEdyb3VwXzNfXzIgKT8gOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIzMTE2OjE6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbGVYTUxfX1Vub3JkZXJlZEdyb3VwXzNfXzEgOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VGaWxlWE1MX19Vbm9yZGVyZWRHcm91cF8zX19JbXBsICggcnVsZV9fRGF0YUludGVyY2hhbmdlRmlsZVhNTF9fVW5vcmRlcmVkR3JvdXBfM19fMiApPyA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fRGF0YUludGVyY2hhbmdlRmlsZVhNTF9fVW5vcmRlcmVkR3JvdXBfM19fMSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMTc4MjoxOiAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbGVYTUxfX1Vub3JkZXJlZEdyb3VwXzNfX0ltcGwgKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VGaWxlWE1MX19Vbm9yZGVyZWRHcm91cF8zX18yICk/ICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIxNzgzOjI6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbGVYTUxfX1Vub3JkZXJlZEdyb3VwXzNfX0ltcGwgKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VGaWxlWE1MX19Vbm9yZGVyZWRHcm91cF8zX18yICk/CisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMzEyMDoxOiAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbGVYTUxfX1Vub3JkZXJlZEdyb3VwXzNfX0ltcGwgKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VGaWxlWE1MX19Vbm9yZGVyZWRHcm91cF8zX18yICk/ICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIzMTIxOjI6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbGVYTUxfX1Vub3JkZXJlZEdyb3VwXzNfX0ltcGwgKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VGaWxlWE1MX19Vbm9yZGVyZWRHcm91cF8zX18yICk/CiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV18xNTUpOworICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMTYzKTsKICAgICAgICAgICAgIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbGVYTUxfX1Vub3JkZXJlZEdyb3VwXzNfX0ltcGwoKTsKIAogICAgICAgICAgICAgc3RhdGUuX2ZzcC0tOwogICAgICAgICAgICAgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIxNzg0OjI6ICggcnVsZV9fRGF0YUludGVyY2hhbmdlRmlsZVhNTF9fVW5vcmRlcmVkR3JvdXBfM19fMiApPwotICAgICAgICAgICAgaW50IGFsdDE3Mj0yOwotICAgICAgICAgICAgaW50IExBMTcyXzAgPSBpbnB1dC5MQSgxKTsKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIzMTIyOjI6ICggcnVsZV9fRGF0YUludGVyY2hhbmdlRmlsZVhNTF9fVW5vcmRlcmVkR3JvdXBfM19fMiApPworICAgICAgICAgICAgaW50IGFsdDE4NT0yOworICAgICAgICAgICAgaW50IExBMTg1XzAgPSBpbnB1dC5MQSgxKTsKIAotICAgICAgICAgICAgaWYgKCBMQTE3Ml8wID09IDE0MSAmJiBnZXRVbm9yZGVyZWRHcm91cEhlbHBlcigpLmNhblNlbGVjdChncmFtbWFyQWNjZXNzLmdldERhdGFJbnRlcmNoYW5nZUZpbGVYTUxBY2Nlc3MoKS5nZXRVbm9yZGVyZWRHcm91cF8zKCksIDApICkgewotICAgICAgICAgICAgICAgIGFsdDE3Mj0xOworICAgICAgICAgICAgaWYgKCBMQTE4NV8wID09IDE1MiAmJiBnZXRVbm9yZGVyZWRHcm91cEhlbHBlcigpLmNhblNlbGVjdChncmFtbWFyQWNjZXNzLmdldERhdGFJbnRlcmNoYW5nZUZpbGVYTUxBY2Nlc3MoKS5nZXRVbm9yZGVyZWRHcm91cF8zKCksIDApICkgeworICAgICAgICAgICAgICAgIGFsdDE4NT0xOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSBpZiAoIExBMTcyXzAgPT0gNzggJiYgZ2V0VW5vcmRlcmVkR3JvdXBIZWxwZXIoKS5jYW5TZWxlY3QoZ3JhbW1hckFjY2Vzcy5nZXREYXRhSW50ZXJjaGFuZ2VGaWxlWE1MQWNjZXNzKCkuZ2V0VW5vcmRlcmVkR3JvdXBfMygpLCAxKSApIHsKLSAgICAgICAgICAgICAgICBhbHQxNzI9MTsKKyAgICAgICAgICAgIGVsc2UgaWYgKCBMQTE4NV8wID09IDgzICYmIGdldFVub3JkZXJlZEdyb3VwSGVscGVyKCkuY2FuU2VsZWN0KGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YUludGVyY2hhbmdlRmlsZVhNTEFjY2VzcygpLmdldFVub3JkZXJlZEdyb3VwXzMoKSwgMSkgKSB7CisgICAgICAgICAgICAgICAgYWx0MTg1PTE7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIGlmICggTEExNzJfMCA9PSA3OSAmJiBnZXRVbm9yZGVyZWRHcm91cEhlbHBlcigpLmNhblNlbGVjdChncmFtbWFyQWNjZXNzLmdldERhdGFJbnRlcmNoYW5nZUZpbGVYTUxBY2Nlc3MoKS5nZXRVbm9yZGVyZWRHcm91cF8zKCksIDIpICkgewotICAgICAgICAgICAgICAgIGFsdDE3Mj0xOworICAgICAgICAgICAgZWxzZSBpZiAoIExBMTg1XzAgPT0gODQgJiYgZ2V0VW5vcmRlcmVkR3JvdXBIZWxwZXIoKS5jYW5TZWxlY3QoZ3JhbW1hckFjY2Vzcy5nZXREYXRhSW50ZXJjaGFuZ2VGaWxlWE1MQWNjZXNzKCkuZ2V0VW5vcmRlcmVkR3JvdXBfMygpLCAyKSApIHsKKyAgICAgICAgICAgICAgICBhbHQxODU9MTsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHN3aXRjaCAoYWx0MTcyKSB7CisgICAgICAgICAgICBzd2l0Y2ggKGFsdDE4NSkgewogICAgICAgICAgICAgICAgIGNhc2UgMSA6CiAgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjA6MDogcnVsZV9fRGF0YUludGVyY2hhbmdlRmlsZVhNTF9fVW5vcmRlcmVkR3JvdXBfM19fMgogICAgICAgICAgICAgICAgICAgICB7CkBAIC03MTQ2MCwxNCArNzU5MTcsMTQgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19EYXRhSW50ZXJjaGFuZ2VGaWxlWE1MX19Vbm9yZGVyZWRHcm91cF8zX18yIgotICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIxNzkwOjE6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbGVYTUxfX1Vub3JkZXJlZEdyb3VwXzNfXzIgOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VGaWxlWE1MX19Vbm9yZGVyZWRHcm91cF8zX19JbXBsIDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMzEyODoxOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VGaWxlWE1MX19Vbm9yZGVyZWRHcm91cF8zX18yIDogcnVsZV9fRGF0YUludGVyY2hhbmdlRmlsZVhNTF9fVW5vcmRlcmVkR3JvdXBfM19fSW1wbCA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fRGF0YUludGVyY2hhbmdlRmlsZVhNTF9fVW5vcmRlcmVkR3JvdXBfM19fMigpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMTc5NDoxOiAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbGVYTUxfX1Vub3JkZXJlZEdyb3VwXzNfX0ltcGwgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjE3OTU6MjogcnVsZV9fRGF0YUludGVyY2hhbmdlRmlsZVhNTF9fVW5vcmRlcmVkR3JvdXBfM19fSW1wbAorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjMxMzI6MTogKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VGaWxlWE1MX19Vbm9yZGVyZWRHcm91cF8zX19JbXBsICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIzMTMzOjI6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbGVYTUxfX1Vub3JkZXJlZEdyb3VwXzNfX0ltcGwKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzIpOwogICAgICAgICAgICAgcnVsZV9fRGF0YUludGVyY2hhbmdlRmlsZVhNTF9fVW5vcmRlcmVkR3JvdXBfM19fSW1wbCgpOwpAQCAtNzE0OTMsMzkgKzc1OTUwLDM5IEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fRGF0YUludGVyY2hhbmdlRmlsZUNTVl9fVW5vcmRlcmVkR3JvdXBfMyIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMTgwMjoxOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VGaWxlQ1NWX19Vbm9yZGVyZWRHcm91cF8zIDogKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VGaWxlQ1NWX19Vbm9yZGVyZWRHcm91cF8zX18wICk/IDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMzE0MDoxOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VGaWxlQ1NWX19Vbm9yZGVyZWRHcm91cF8zIDogKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VGaWxlQ1NWX19Vbm9yZGVyZWRHcm91cF8zX18wICk/IDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19EYXRhSW50ZXJjaGFuZ2VGaWxlQ1NWX19Vbm9yZGVyZWRHcm91cF8zKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkJZ2V0VW5vcmRlcmVkR3JvdXBIZWxwZXIoKS5lbnRlcihncmFtbWFyQWNjZXNzLmdldERhdGFJbnRlcmNoYW5nZUZpbGVDU1ZBY2Nlc3MoKS5nZXRVbm9yZGVyZWRHcm91cF8zKCkpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMTgwNzoxOiAoICggcnVsZV9fRGF0YUludGVyY2hhbmdlRmlsZUNTVl9fVW5vcmRlcmVkR3JvdXBfM19fMCApPyApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMTgwODoyOiAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbGVDU1ZfX1Vub3JkZXJlZEdyb3VwXzNfXzAgKT8KKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIzMTQ1OjE6ICggKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VGaWxlQ1NWX19Vbm9yZGVyZWRHcm91cF8zX18wICk/ICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIzMTQ2OjI6ICggcnVsZV9fRGF0YUludGVyY2hhbmdlRmlsZUNTVl9fVW5vcmRlcmVkR3JvdXBfM19fMCApPwogICAgICAgICAgICAgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjE4MDg6MjogKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VGaWxlQ1NWX19Vbm9yZGVyZWRHcm91cF8zX18wICk/Ci0gICAgICAgICAgICBpbnQgYWx0MTczPTI7Ci0gICAgICAgICAgICBpbnQgTEExNzNfMCA9IGlucHV0LkxBKDEpOworICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjMxNDY6MjogKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VGaWxlQ1NWX19Vbm9yZGVyZWRHcm91cF8zX18wICk/CisgICAgICAgICAgICBpbnQgYWx0MTg2PTI7CisgICAgICAgICAgICBpbnQgTEExODZfMCA9IGlucHV0LkxBKDEpOwogCi0gICAgICAgICAgICBpZiAoIExBMTczXzAgPT0gODEgJiYgZ2V0VW5vcmRlcmVkR3JvdXBIZWxwZXIoKS5jYW5TZWxlY3QoZ3JhbW1hckFjY2Vzcy5nZXREYXRhSW50ZXJjaGFuZ2VGaWxlQ1NWQWNjZXNzKCkuZ2V0VW5vcmRlcmVkR3JvdXBfMygpLCAwKSApIHsKLSAgICAgICAgICAgICAgICBhbHQxNzM9MTsKKyAgICAgICAgICAgIGlmICggTEExODZfMCA9PSA4NiAmJiBnZXRVbm9yZGVyZWRHcm91cEhlbHBlcigpLmNhblNlbGVjdChncmFtbWFyQWNjZXNzLmdldERhdGFJbnRlcmNoYW5nZUZpbGVDU1ZBY2Nlc3MoKS5nZXRVbm9yZGVyZWRHcm91cF8zKCksIDApICkgeworICAgICAgICAgICAgICAgIGFsdDE4Nj0xOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSBpZiAoIExBMTczXzAgPT0gODIgJiYgZ2V0VW5vcmRlcmVkR3JvdXBIZWxwZXIoKS5jYW5TZWxlY3QoZ3JhbW1hckFjY2Vzcy5nZXREYXRhSW50ZXJjaGFuZ2VGaWxlQ1NWQWNjZXNzKCkuZ2V0VW5vcmRlcmVkR3JvdXBfMygpLCAxKSApIHsKLSAgICAgICAgICAgICAgICBhbHQxNzM9MTsKKyAgICAgICAgICAgIGVsc2UgaWYgKCBMQTE4Nl8wID09IDg3ICYmIGdldFVub3JkZXJlZEdyb3VwSGVscGVyKCkuY2FuU2VsZWN0KGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YUludGVyY2hhbmdlRmlsZUNTVkFjY2VzcygpLmdldFVub3JkZXJlZEdyb3VwXzMoKSwgMSkgKSB7CisgICAgICAgICAgICAgICAgYWx0MTg2PTE7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIGlmICggTEExNzNfMCA9PSA4MyAmJiBnZXRVbm9yZGVyZWRHcm91cEhlbHBlcigpLmNhblNlbGVjdChncmFtbWFyQWNjZXNzLmdldERhdGFJbnRlcmNoYW5nZUZpbGVDU1ZBY2Nlc3MoKS5nZXRVbm9yZGVyZWRHcm91cF8zKCksIDIpICkgewotICAgICAgICAgICAgICAgIGFsdDE3Mz0xOworICAgICAgICAgICAgZWxzZSBpZiAoIExBMTg2XzAgPT0gODggJiYgZ2V0VW5vcmRlcmVkR3JvdXBIZWxwZXIoKS5jYW5TZWxlY3QoZ3JhbW1hckFjY2Vzcy5nZXREYXRhSW50ZXJjaGFuZ2VGaWxlQ1NWQWNjZXNzKCkuZ2V0VW5vcmRlcmVkR3JvdXBfMygpLCAyKSApIHsKKyAgICAgICAgICAgICAgICBhbHQxODY9MTsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgaWYgKCBMQTE3M18wID09IDE0MiAmJiBnZXRVbm9yZGVyZWRHcm91cEhlbHBlcigpLmNhblNlbGVjdChncmFtbWFyQWNjZXNzLmdldERhdGFJbnRlcmNoYW5nZUZpbGVDU1ZBY2Nlc3MoKS5nZXRVbm9yZGVyZWRHcm91cF8zKCksIDMpICkgewotICAgICAgICAgICAgICAgIGFsdDE3Mz0xOworICAgICAgICAgICAgZWxzZSBpZiAoIExBMTg2XzAgPT0gMTUzICYmIGdldFVub3JkZXJlZEdyb3VwSGVscGVyKCkuY2FuU2VsZWN0KGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YUludGVyY2hhbmdlRmlsZUNTVkFjY2VzcygpLmdldFVub3JkZXJlZEdyb3VwXzMoKSwgMykgKSB7CisgICAgICAgICAgICAgICAgYWx0MTg2PTE7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIGlmICggTEExNzNfMCA9PSA3OCAmJiBnZXRVbm9yZGVyZWRHcm91cEhlbHBlcigpLmNhblNlbGVjdChncmFtbWFyQWNjZXNzLmdldERhdGFJbnRlcmNoYW5nZUZpbGVDU1ZBY2Nlc3MoKS5nZXRVbm9yZGVyZWRHcm91cF8zKCksIDQpICkgewotICAgICAgICAgICAgICAgIGFsdDE3Mz0xOworICAgICAgICAgICAgZWxzZSBpZiAoIExBMTg2XzAgPT0gODMgJiYgZ2V0VW5vcmRlcmVkR3JvdXBIZWxwZXIoKS5jYW5TZWxlY3QoZ3JhbW1hckFjY2Vzcy5nZXREYXRhSW50ZXJjaGFuZ2VGaWxlQ1NWQWNjZXNzKCkuZ2V0VW5vcmRlcmVkR3JvdXBfMygpLCA0KSApIHsKKyAgICAgICAgICAgICAgICBhbHQxODY9MTsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgaWYgKCBMQTE3M18wID09IDc5ICYmIGdldFVub3JkZXJlZEdyb3VwSGVscGVyKCkuY2FuU2VsZWN0KGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YUludGVyY2hhbmdlRmlsZUNTVkFjY2VzcygpLmdldFVub3JkZXJlZEdyb3VwXzMoKSwgNSkgKSB7Ci0gICAgICAgICAgICAgICAgYWx0MTczPTE7CisgICAgICAgICAgICBlbHNlIGlmICggTEExODZfMCA9PSA4NCAmJiBnZXRVbm9yZGVyZWRHcm91cEhlbHBlcigpLmNhblNlbGVjdChncmFtbWFyQWNjZXNzLmdldERhdGFJbnRlcmNoYW5nZUZpbGVDU1ZBY2Nlc3MoKS5nZXRVbm9yZGVyZWRHcm91cF8zKCksIDUpICkgeworICAgICAgICAgICAgICAgIGFsdDE4Nj0xOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgc3dpdGNoIChhbHQxNzMpIHsKKyAgICAgICAgICAgIHN3aXRjaCAoYWx0MTg2KSB7CiAgICAgICAgICAgICAgICAgY2FzZSAxIDoKICAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MDowOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VGaWxlQ1NWX19Vbm9yZGVyZWRHcm91cF8zX18wCiAgICAgICAgICAgICAgICAgICAgIHsKQEAgLTcxNTYwLDY5ICs3NjAxNyw2OSBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbGVDU1ZfX1Vub3JkZXJlZEdyb3VwXzNfX0ltcGwiCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjE4MTY6MTogcnVsZV9fRGF0YUludGVyY2hhbmdlRmlsZUNTVl9fVW5vcmRlcmVkR3JvdXBfM19fSW1wbCA6ICggKHsuLi59PyA9PiAoICggKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VGaWxlQ1NWX19Hcm91cF8zXzBfXzAgKSApICkgKSB8ICh7Li4ufT8gPT4gKCAoICggcnVsZV9fRGF0YUludGVyY2hhbmdlRmlsZUNTVl9fR3JvdXBfM18xX18wICkgKSApICkgfCAoey4uLn0/ID0+ICggKCAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbGVDU1ZfX0dyb3VwXzNfMl9fMCApICkgKSApIHwgKHsuLi59PyA9PiAoICggKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VGaWxlQ1NWX19JbmRlbnRBc3NpZ25tZW50XzNfMyApICkgKSApIHwgKHsuLi59PyA9PiAoICggKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VGaWxlQ1NWX19Hcm91cF8zXzRfXzAgKSApICkgKSB8ICh7Li4ufT8gPT4gKCAoICggcnVsZV9fRGF0YUludGVyY2hhbmdlRmlsZUNTVl9fR3JvdXBfM181X18wICkgKSApICkgKSA7CisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjMxNTQ6MTogcnVsZV9fRGF0YUludGVyY2hhbmdlRmlsZUNTVl9fVW5vcmRlcmVkR3JvdXBfM19fSW1wbCA6ICggKHsuLi59PyA9PiAoICggKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VGaWxlQ1NWX19Hcm91cF8zXzBfXzAgKSApICkgKSB8ICh7Li4ufT8gPT4gKCAoICggcnVsZV9fRGF0YUludGVyY2hhbmdlRmlsZUNTVl9fR3JvdXBfM18xX18wICkgKSApICkgfCAoey4uLn0/ID0+ICggKCAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbGVDU1ZfX0dyb3VwXzNfMl9fMCApICkgKSApIHwgKHsuLi59PyA9PiAoICggKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VGaWxlQ1NWX19JbmRlbnRBc3NpZ25tZW50XzNfMyApICkgKSApIHwgKHsuLi59PyA9PiAoICggKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VGaWxlQ1NWX19Hcm91cF8zXzRfXzAgKSApICkgKSB8ICh7Li4ufT8gPT4gKCAoICggcnVsZV9fRGF0YUludGVyY2hhbmdlRmlsZUNTVl9fR3JvdXBfM181X18wICkgKSApICkgKSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fRGF0YUludGVyY2hhbmdlRmlsZUNTVl9fVW5vcmRlcmVkR3JvdXBfM19fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCWJvb2xlYW4gc2VsZWN0ZWQgPSBmYWxzZTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjE4MjE6MTogKCAoICh7Li4ufT8gPT4gKCAoICggcnVsZV9fRGF0YUludGVyY2hhbmdlRmlsZUNTVl9fR3JvdXBfM18wX18wICkgKSApICkgfCAoey4uLn0/ID0+ICggKCAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbGVDU1ZfX0dyb3VwXzNfMV9fMCApICkgKSApIHwgKHsuLi59PyA9PiAoICggKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VGaWxlQ1NWX19Hcm91cF8zXzJfXzAgKSApICkgKSB8ICh7Li4ufT8gPT4gKCAoICggcnVsZV9fRGF0YUludGVyY2hhbmdlRmlsZUNTVl9fSW5kZW50QXNzaWdubWVudF8zXzMgKSApICkgKSB8ICh7Li4ufT8gPT4gKCAoICggcnVsZV9fRGF0YUludGVyY2hhbmdlRmlsZUNTVl9fR3JvdXBfM180X18wICkgKSApICkgfCAoey4uLn0/ID0+ICggKCAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbGVDU1ZfX0dyb3VwXzNfNV9fMCApICkgKSApICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjE4MjI6MzogKCAoey4uLn0/ID0+ICggKCAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbGVDU1ZfX0dyb3VwXzNfMF9fMCApICkgKSApIHwgKHsuLi59PyA9PiAoICggKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VGaWxlQ1NWX19Hcm91cF8zXzFfXzAgKSApICkgKSB8ICh7Li4ufT8gPT4gKCAoICggcnVsZV9fRGF0YUludGVyY2hhbmdlRmlsZUNTVl9fR3JvdXBfM18yX18wICkgKSApICkgfCAoey4uLn0/ID0+ICggKCAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbGVDU1ZfX0luZGVudEFzc2lnbm1lbnRfM18zICkgKSApICkgfCAoey4uLn0/ID0+ICggKCAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbGVDU1ZfX0dyb3VwXzNfNF9fMCApICkgKSApIHwgKHsuLi59PyA9PiAoICggKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VGaWxlQ1NWX19Hcm91cF8zXzVfXzAgKSApICkgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMzE1OToxOiAoICggKHsuLi59PyA9PiAoICggKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VGaWxlQ1NWX19Hcm91cF8zXzBfXzAgKSApICkgKSB8ICh7Li4ufT8gPT4gKCAoICggcnVsZV9fRGF0YUludGVyY2hhbmdlRmlsZUNTVl9fR3JvdXBfM18xX18wICkgKSApICkgfCAoey4uLn0/ID0+ICggKCAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbGVDU1ZfX0dyb3VwXzNfMl9fMCApICkgKSApIHwgKHsuLi59PyA9PiAoICggKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VGaWxlQ1NWX19JbmRlbnRBc3NpZ25tZW50XzNfMyApICkgKSApIHwgKHsuLi59PyA9PiAoICggKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VGaWxlQ1NWX19Hcm91cF8zXzRfXzAgKSApICkgKSB8ICh7Li4ufT8gPT4gKCAoICggcnVsZV9fRGF0YUludGVyY2hhbmdlRmlsZUNTVl9fR3JvdXBfM181X18wICkgKSApICkgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMzE2MDozOiAoICh7Li4ufT8gPT4gKCAoICggcnVsZV9fRGF0YUludGVyY2hhbmdlRmlsZUNTVl9fR3JvdXBfM18wX18wICkgKSApICkgfCAoey4uLn0/ID0+ICggKCAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbGVDU1ZfX0dyb3VwXzNfMV9fMCApICkgKSApIHwgKHsuLi59PyA9PiAoICggKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VGaWxlQ1NWX19Hcm91cF8zXzJfXzAgKSApICkgKSB8ICh7Li4ufT8gPT4gKCAoICggcnVsZV9fRGF0YUludGVyY2hhbmdlRmlsZUNTVl9fSW5kZW50QXNzaWdubWVudF8zXzMgKSApICkgKSB8ICh7Li4ufT8gPT4gKCAoICggcnVsZV9fRGF0YUludGVyY2hhbmdlRmlsZUNTVl9fR3JvdXBfM180X18wICkgKSApICkgfCAoey4uLn0/ID0+ICggKCAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbGVDU1ZfX0dyb3VwXzNfNV9fMCApICkgKSApICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIxODIyOjM6ICggKHsuLi59PyA9PiAoICggKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VGaWxlQ1NWX19Hcm91cF8zXzBfXzAgKSApICkgKSB8ICh7Li4ufT8gPT4gKCAoICggcnVsZV9fRGF0YUludGVyY2hhbmdlRmlsZUNTVl9fR3JvdXBfM18xX18wICkgKSApICkgfCAoey4uLn0/ID0+ICggKCAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbGVDU1ZfX0dyb3VwXzNfMl9fMCApICkgKSApIHwgKHsuLi59PyA9PiAoICggKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VGaWxlQ1NWX19JbmRlbnRBc3NpZ25tZW50XzNfMyApICkgKSApIHwgKHsuLi59PyA9PiAoICggKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VGaWxlQ1NWX19Hcm91cF8zXzRfXzAgKSApICkgKSB8ICh7Li4ufT8gPT4gKCAoICggcnVsZV9fRGF0YUludGVyY2hhbmdlRmlsZUNTVl9fR3JvdXBfM181X18wICkgKSApICkgKQotICAgICAgICAgICAgaW50IGFsdDE3ND02OwotICAgICAgICAgICAgaW50IExBMTc0XzAgPSBpbnB1dC5MQSgxKTsKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIzMTYwOjM6ICggKHsuLi59PyA9PiAoICggKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VGaWxlQ1NWX19Hcm91cF8zXzBfXzAgKSApICkgKSB8ICh7Li4ufT8gPT4gKCAoICggcnVsZV9fRGF0YUludGVyY2hhbmdlRmlsZUNTVl9fR3JvdXBfM18xX18wICkgKSApICkgfCAoey4uLn0/ID0+ICggKCAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbGVDU1ZfX0dyb3VwXzNfMl9fMCApICkgKSApIHwgKHsuLi59PyA9PiAoICggKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VGaWxlQ1NWX19JbmRlbnRBc3NpZ25tZW50XzNfMyApICkgKSApIHwgKHsuLi59PyA9PiAoICggKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VGaWxlQ1NWX19Hcm91cF8zXzRfXzAgKSApICkgKSB8ICh7Li4ufT8gPT4gKCAoICggcnVsZV9fRGF0YUludGVyY2hhbmdlRmlsZUNTVl9fR3JvdXBfM181X18wICkgKSApICkgKQorICAgICAgICAgICAgaW50IGFsdDE4Nz02OworICAgICAgICAgICAgaW50IExBMTg3XzAgPSBpbnB1dC5MQSgxKTsKIAotICAgICAgICAgICAgaWYgKCBMQTE3NF8wID09IDgxICYmIGdldFVub3JkZXJlZEdyb3VwSGVscGVyKCkuY2FuU2VsZWN0KGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YUludGVyY2hhbmdlRmlsZUNTVkFjY2VzcygpLmdldFVub3JkZXJlZEdyb3VwXzMoKSwgMCkgKSB7Ci0gICAgICAgICAgICAgICAgYWx0MTc0PTE7CisgICAgICAgICAgICBpZiAoIExBMTg3XzAgPT0gODYgJiYgZ2V0VW5vcmRlcmVkR3JvdXBIZWxwZXIoKS5jYW5TZWxlY3QoZ3JhbW1hckFjY2Vzcy5nZXREYXRhSW50ZXJjaGFuZ2VGaWxlQ1NWQWNjZXNzKCkuZ2V0VW5vcmRlcmVkR3JvdXBfMygpLCAwKSApIHsKKyAgICAgICAgICAgICAgICBhbHQxODc9MTsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgaWYgKCBMQTE3NF8wID09IDgyICYmIGdldFVub3JkZXJlZEdyb3VwSGVscGVyKCkuY2FuU2VsZWN0KGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YUludGVyY2hhbmdlRmlsZUNTVkFjY2VzcygpLmdldFVub3JkZXJlZEdyb3VwXzMoKSwgMSkgKSB7Ci0gICAgICAgICAgICAgICAgYWx0MTc0PTI7CisgICAgICAgICAgICBlbHNlIGlmICggTEExODdfMCA9PSA4NyAmJiBnZXRVbm9yZGVyZWRHcm91cEhlbHBlcigpLmNhblNlbGVjdChncmFtbWFyQWNjZXNzLmdldERhdGFJbnRlcmNoYW5nZUZpbGVDU1ZBY2Nlc3MoKS5nZXRVbm9yZGVyZWRHcm91cF8zKCksIDEpICkgeworICAgICAgICAgICAgICAgIGFsdDE4Nz0yOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSBpZiAoIExBMTc0XzAgPT0gODMgJiYgZ2V0VW5vcmRlcmVkR3JvdXBIZWxwZXIoKS5jYW5TZWxlY3QoZ3JhbW1hckFjY2Vzcy5nZXREYXRhSW50ZXJjaGFuZ2VGaWxlQ1NWQWNjZXNzKCkuZ2V0VW5vcmRlcmVkR3JvdXBfMygpLCAyKSApIHsKLSAgICAgICAgICAgICAgICBhbHQxNzQ9MzsKKyAgICAgICAgICAgIGVsc2UgaWYgKCBMQTE4N18wID09IDg4ICYmIGdldFVub3JkZXJlZEdyb3VwSGVscGVyKCkuY2FuU2VsZWN0KGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YUludGVyY2hhbmdlRmlsZUNTVkFjY2VzcygpLmdldFVub3JkZXJlZEdyb3VwXzMoKSwgMikgKSB7CisgICAgICAgICAgICAgICAgYWx0MTg3PTM7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIGlmICggTEExNzRfMCA9PSAxNDIgJiYgZ2V0VW5vcmRlcmVkR3JvdXBIZWxwZXIoKS5jYW5TZWxlY3QoZ3JhbW1hckFjY2Vzcy5nZXREYXRhSW50ZXJjaGFuZ2VGaWxlQ1NWQWNjZXNzKCkuZ2V0VW5vcmRlcmVkR3JvdXBfMygpLCAzKSApIHsKLSAgICAgICAgICAgICAgICBhbHQxNzQ9NDsKKyAgICAgICAgICAgIGVsc2UgaWYgKCBMQTE4N18wID09IDE1MyAmJiBnZXRVbm9yZGVyZWRHcm91cEhlbHBlcigpLmNhblNlbGVjdChncmFtbWFyQWNjZXNzLmdldERhdGFJbnRlcmNoYW5nZUZpbGVDU1ZBY2Nlc3MoKS5nZXRVbm9yZGVyZWRHcm91cF8zKCksIDMpICkgeworICAgICAgICAgICAgICAgIGFsdDE4Nz00OwogICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSBpZiAoIExBMTc0XzAgPT0gNzggJiYgZ2V0VW5vcmRlcmVkR3JvdXBIZWxwZXIoKS5jYW5TZWxlY3QoZ3JhbW1hckFjY2Vzcy5nZXREYXRhSW50ZXJjaGFuZ2VGaWxlQ1NWQWNjZXNzKCkuZ2V0VW5vcmRlcmVkR3JvdXBfMygpLCA0KSApIHsKLSAgICAgICAgICAgICAgICBhbHQxNzQ9NTsKKyAgICAgICAgICAgIGVsc2UgaWYgKCBMQTE4N18wID09IDgzICYmIGdldFVub3JkZXJlZEdyb3VwSGVscGVyKCkuY2FuU2VsZWN0KGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YUludGVyY2hhbmdlRmlsZUNTVkFjY2VzcygpLmdldFVub3JkZXJlZEdyb3VwXzMoKSwgNCkgKSB7CisgICAgICAgICAgICAgICAgYWx0MTg3PTU7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIGlmICggTEExNzRfMCA9PSA3OSAmJiBnZXRVbm9yZGVyZWRHcm91cEhlbHBlcigpLmNhblNlbGVjdChncmFtbWFyQWNjZXNzLmdldERhdGFJbnRlcmNoYW5nZUZpbGVDU1ZBY2Nlc3MoKS5nZXRVbm9yZGVyZWRHcm91cF8zKCksIDUpICkgewotICAgICAgICAgICAgICAgIGFsdDE3ND02OworICAgICAgICAgICAgZWxzZSBpZiAoIExBMTg3XzAgPT0gODQgJiYgZ2V0VW5vcmRlcmVkR3JvdXBIZWxwZXIoKS5jYW5TZWxlY3QoZ3JhbW1hckFjY2Vzcy5nZXREYXRhSW50ZXJjaGFuZ2VGaWxlQ1NWQWNjZXNzKCkuZ2V0VW5vcmRlcmVkR3JvdXBfMygpLCA1KSApIHsKKyAgICAgICAgICAgICAgICBhbHQxODc9NjsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgIGlmIChzdGF0ZS5iYWNrdHJhY2tpbmc+MCkge3N0YXRlLmZhaWxlZD10cnVlOyByZXR1cm4gO30KICAgICAgICAgICAgICAgICBOb1ZpYWJsZUFsdEV4Y2VwdGlvbiBudmFlID0KLSAgICAgICAgICAgICAgICAgICAgbmV3IE5vVmlhYmxlQWx0RXhjZXB0aW9uKCIiLCAxNzQsIDAsIGlucHV0KTsKKyAgICAgICAgICAgICAgICAgICAgbmV3IE5vVmlhYmxlQWx0RXhjZXB0aW9uKCIiLCAxODcsIDAsIGlucHV0KTsKIAogICAgICAgICAgICAgICAgIHRocm93IG52YWU7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBzd2l0Y2ggKGFsdDE3NCkgeworICAgICAgICAgICAgc3dpdGNoIChhbHQxODcpIHsKICAgICAgICAgICAgICAgICBjYXNlIDEgOgotICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMTgyMzozOiAoey4uLn0/ID0+ICggKCAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbGVDU1ZfX0dyb3VwXzNfMF9fMCApICkgKSApCisgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIzMTYxOjM6ICh7Li4ufT8gPT4gKCAoICggcnVsZV9fRGF0YUludGVyY2hhbmdlRmlsZUNTVl9fR3JvdXBfM18wX18wICkgKSApICkKICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMTgyMzozOiAoey4uLn0/ID0+ICggKCAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbGVDU1ZfX0dyb3VwXzNfMF9fMCApICkgKSApCi0gICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIxODI0OjQ6IHsuLi59PyA9PiAoICggKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VGaWxlQ1NWX19Hcm91cF8zXzBfXzAgKSApICkKKyAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjMxNjE6MzogKHsuLi59PyA9PiAoICggKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VGaWxlQ1NWX19Hcm91cF8zXzBfXzAgKSApICkgKQorICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMzE2Mjo0OiB7Li4ufT8gPT4gKCAoICggcnVsZV9fRGF0YUludGVyY2hhbmdlRmlsZUNTVl9fR3JvdXBfM18wX18wICkgKSApCiAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgaWYgKCAhIGdldFVub3JkZXJlZEdyb3VwSGVscGVyKCkuY2FuU2VsZWN0KGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YUludGVyY2hhbmdlRmlsZUNTVkFjY2VzcygpLmdldFVub3JkZXJlZEdyb3VwXzMoKSwgMCkgKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3RhdGUuYmFja3RyYWNraW5nPjApIHtzdGF0ZS5mYWlsZWQ9dHJ1ZTsgcmV0dXJuIDt9CiAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRmFpbGVkUHJlZGljYXRlRXhjZXB0aW9uKGlucHV0LCAicnVsZV9fRGF0YUludGVyY2hhbmdlRmlsZUNTVl9fVW5vcmRlcmVkR3JvdXBfM19fSW1wbCIsICJnZXRVbm9yZGVyZWRHcm91cEhlbHBlcigpLmNhblNlbGVjdChncmFtbWFyQWNjZXNzLmdldERhdGFJbnRlcmNoYW5nZUZpbGVDU1ZBY2Nlc3MoKS5nZXRVbm9yZGVyZWRHcm91cF8zKCksIDApIik7CiAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjE4MjQ6MTE4OiAoICggKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VGaWxlQ1NWX19Hcm91cF8zXzBfXzAgKSApICkKLSAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjE4MjU6NTogKCAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbGVDU1ZfX0dyb3VwXzNfMF9fMCApICkKKyAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjMxNjI6MTE4OiAoICggKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VGaWxlQ1NWX19Hcm91cF8zXzBfXzAgKSApICkKKyAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjMxNjM6NTogKCAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbGVDU1ZfX0dyb3VwXzNfMF9fMCApICkKICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICBnZXRVbm9yZGVyZWRHcm91cEhlbHBlcigpLnNlbGVjdChncmFtbWFyQWNjZXNzLmdldERhdGFJbnRlcmNoYW5nZUZpbGVDU1ZBY2Nlc3MoKS5nZXRVbm9yZGVyZWRHcm91cF8zKCksIDApOwogICAgICAgICAgICAgICAgICAgICBzZWxlY3RlZCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIxODMxOjU6ICggKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VGaWxlQ1NWX19Hcm91cF8zXzBfXzAgKSApCi0gICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIxODMyOjY6ICggcnVsZV9fRGF0YUludGVyY2hhbmdlRmlsZUNTVl9fR3JvdXBfM18wX18wICkKKyAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjMxNjk6NTogKCAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbGVDU1ZfX0dyb3VwXzNfMF9fMCApICkKKyAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjMxNzA6NjogKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VGaWxlQ1NWX19Hcm91cF8zXzBfXzAgKQogICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXREYXRhSW50ZXJjaGFuZ2VGaWxlQ1NWQWNjZXNzKCkuZ2V0R3JvdXBfM18wKCkpOyAKICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMTgzMzo2OiAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbGVDU1ZfX0dyb3VwXzNfMF9fMCApCi0gICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIxODMzOjc6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbGVDU1ZfX0dyb3VwXzNfMF9fMAorICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMzE3MTo2OiAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbGVDU1ZfX0dyb3VwXzNfMF9fMCApCisgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIzMTcxOjc6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbGVDU1ZfX0dyb3VwXzNfMF9fMAogICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzIpOwogICAgICAgICAgICAgICAgICAgICBydWxlX19EYXRhSW50ZXJjaGFuZ2VGaWxlQ1NWX19Hcm91cF8zXzBfXzAoKTsKQEAgLTcxNjQ4LDI4ICs3NjEwNSwyOCBAQAogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgIGNhc2UgMiA6Ci0gICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIxODM4OjM6ICh7Li4ufT8gPT4gKCAoICggcnVsZV9fRGF0YUludGVyY2hhbmdlRmlsZUNTVl9fR3JvdXBfM18xX18wICkgKSApICkKKyAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjMxNzY6MzogKHsuLi59PyA9PiAoICggKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VGaWxlQ1NWX19Hcm91cF8zXzFfXzAgKSApICkgKQogICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIxODM4OjM6ICh7Li4ufT8gPT4gKCAoICggcnVsZV9fRGF0YUludGVyY2hhbmdlRmlsZUNTVl9fR3JvdXBfM18xX18wICkgKSApICkKLSAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjE4Mzk6NDogey4uLn0/ID0+ICggKCAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbGVDU1ZfX0dyb3VwXzNfMV9fMCApICkgKQorICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMzE3NjozOiAoey4uLn0/ID0+ICggKCAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbGVDU1ZfX0dyb3VwXzNfMV9fMCApICkgKSApCisgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIzMTc3OjQ6IHsuLi59PyA9PiAoICggKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VGaWxlQ1NWX19Hcm91cF8zXzFfXzAgKSApICkKICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICBpZiAoICEgZ2V0VW5vcmRlcmVkR3JvdXBIZWxwZXIoKS5jYW5TZWxlY3QoZ3JhbW1hckFjY2Vzcy5nZXREYXRhSW50ZXJjaGFuZ2VGaWxlQ1NWQWNjZXNzKCkuZ2V0VW5vcmRlcmVkR3JvdXBfMygpLCAxKSApIHsKICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdGF0ZS5iYWNrdHJhY2tpbmc+MCkge3N0YXRlLmZhaWxlZD10cnVlOyByZXR1cm4gO30KICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBGYWlsZWRQcmVkaWNhdGVFeGNlcHRpb24oaW5wdXQsICJydWxlX19EYXRhSW50ZXJjaGFuZ2VGaWxlQ1NWX19Vbm9yZGVyZWRHcm91cF8zX19JbXBsIiwgImdldFVub3JkZXJlZEdyb3VwSGVscGVyKCkuY2FuU2VsZWN0KGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YUludGVyY2hhbmdlRmlsZUNTVkFjY2VzcygpLmdldFVub3JkZXJlZEdyb3VwXzMoKSwgMSkiKTsKICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMTgzOToxMTg6ICggKCAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbGVDU1ZfX0dyb3VwXzNfMV9fMCApICkgKQotICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMTg0MDo1OiAoICggcnVsZV9fRGF0YUludGVyY2hhbmdlRmlsZUNTVl9fR3JvdXBfM18xX18wICkgKQorICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMzE3NzoxMTg6ICggKCAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbGVDU1ZfX0dyb3VwXzNfMV9fMCApICkgKQorICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMzE3ODo1OiAoICggcnVsZV9fRGF0YUludGVyY2hhbmdlRmlsZUNTVl9fR3JvdXBfM18xX18wICkgKQogICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgIGdldFVub3JkZXJlZEdyb3VwSGVscGVyKCkuc2VsZWN0KGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YUludGVyY2hhbmdlRmlsZUNTVkFjY2VzcygpLmdldFVub3JkZXJlZEdyb3VwXzMoKSwgMSk7CiAgICAgICAgICAgICAgICAgICAgIHNlbGVjdGVkID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjE4NDY6NTogKCAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbGVDU1ZfX0dyb3VwXzNfMV9fMCApICkKLSAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjE4NDc6NjogKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VGaWxlQ1NWX19Hcm91cF8zXzFfXzAgKQorICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMzE4NDo1OiAoICggcnVsZV9fRGF0YUludGVyY2hhbmdlRmlsZUNTVl9fR3JvdXBfM18xX18wICkgKQorICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMzE4NTo2OiAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbGVDU1ZfX0dyb3VwXzNfMV9fMCApCiAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldERhdGFJbnRlcmNoYW5nZUZpbGVDU1ZBY2Nlc3MoKS5nZXRHcm91cF8zXzEoKSk7IAogICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIxODQ4OjY6ICggcnVsZV9fRGF0YUludGVyY2hhbmdlRmlsZUNTVl9fR3JvdXBfM18xX18wICkKLSAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjE4NDg6NzogcnVsZV9fRGF0YUludGVyY2hhbmdlRmlsZUNTVl9fR3JvdXBfM18xX18wCisgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIzMTg2OjY6ICggcnVsZV9fRGF0YUludGVyY2hhbmdlRmlsZUNTVl9fR3JvdXBfM18xX18wICkKKyAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjMxODY6NzogcnVsZV9fRGF0YUludGVyY2hhbmdlRmlsZUNTVl9fR3JvdXBfM18xX18wCiAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMik7CiAgICAgICAgICAgICAgICAgICAgIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbGVDU1ZfX0dyb3VwXzNfMV9fMCgpOwpAQCAtNzE2OTUsMjggKzc2MTUyLDI4IEBACiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgY2FzZSAzIDoKLSAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjE4NTM6MzogKHsuLi59PyA9PiAoICggKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VGaWxlQ1NWX19Hcm91cF8zXzJfXzAgKSApICkgKQorICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMzE5MTozOiAoey4uLn0/ID0+ICggKCAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbGVDU1ZfX0dyb3VwXzNfMl9fMCApICkgKSApCiAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjE4NTM6MzogKHsuLi59PyA9PiAoICggKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VGaWxlQ1NWX19Hcm91cF8zXzJfXzAgKSApICkgKQotICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMTg1NDo0OiB7Li4ufT8gPT4gKCAoICggcnVsZV9fRGF0YUludGVyY2hhbmdlRmlsZUNTVl9fR3JvdXBfM18yX18wICkgKSApCisgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIzMTkxOjM6ICh7Li4ufT8gPT4gKCAoICggcnVsZV9fRGF0YUludGVyY2hhbmdlRmlsZUNTVl9fR3JvdXBfM18yX18wICkgKSApICkKKyAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjMxOTI6NDogey4uLn0/ID0+ICggKCAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbGVDU1ZfX0dyb3VwXzNfMl9fMCApICkgKQogICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgIGlmICggISBnZXRVbm9yZGVyZWRHcm91cEhlbHBlcigpLmNhblNlbGVjdChncmFtbWFyQWNjZXNzLmdldERhdGFJbnRlcmNoYW5nZUZpbGVDU1ZBY2Nlc3MoKS5nZXRVbm9yZGVyZWRHcm91cF8zKCksIDIpICkgewogICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN0YXRlLmJhY2t0cmFja2luZz4wKSB7c3RhdGUuZmFpbGVkPXRydWU7IHJldHVybiA7fQogICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEZhaWxlZFByZWRpY2F0ZUV4Y2VwdGlvbihpbnB1dCwgInJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbGVDU1ZfX1Vub3JkZXJlZEdyb3VwXzNfX0ltcGwiLCAiZ2V0VW5vcmRlcmVkR3JvdXBIZWxwZXIoKS5jYW5TZWxlY3QoZ3JhbW1hckFjY2Vzcy5nZXREYXRhSW50ZXJjaGFuZ2VGaWxlQ1NWQWNjZXNzKCkuZ2V0VW5vcmRlcmVkR3JvdXBfMygpLCAyKSIpOwogICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIxODU0OjExODogKCAoICggcnVsZV9fRGF0YUludGVyY2hhbmdlRmlsZUNTVl9fR3JvdXBfM18yX18wICkgKSApCi0gICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIxODU1OjU6ICggKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VGaWxlQ1NWX19Hcm91cF8zXzJfXzAgKSApCisgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIzMTkyOjExODogKCAoICggcnVsZV9fRGF0YUludGVyY2hhbmdlRmlsZUNTVl9fR3JvdXBfM18yX18wICkgKSApCisgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIzMTkzOjU6ICggKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VGaWxlQ1NWX19Hcm91cF8zXzJfXzAgKSApCiAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgZ2V0VW5vcmRlcmVkR3JvdXBIZWxwZXIoKS5zZWxlY3QoZ3JhbW1hckFjY2Vzcy5nZXREYXRhSW50ZXJjaGFuZ2VGaWxlQ1NWQWNjZXNzKCkuZ2V0VW5vcmRlcmVkR3JvdXBfMygpLCAyKTsKICAgICAgICAgICAgICAgICAgICAgc2VsZWN0ZWQgPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMTg2MTo1OiAoICggcnVsZV9fRGF0YUludGVyY2hhbmdlRmlsZUNTVl9fR3JvdXBfM18yX18wICkgKQotICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMTg2Mjo2OiAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbGVDU1ZfX0dyb3VwXzNfMl9fMCApCisgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIzMTk5OjU6ICggKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VGaWxlQ1NWX19Hcm91cF8zXzJfXzAgKSApCisgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIzMjAwOjY6ICggcnVsZV9fRGF0YUludGVyY2hhbmdlRmlsZUNTVl9fR3JvdXBfM18yX18wICkKICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YUludGVyY2hhbmdlRmlsZUNTVkFjY2VzcygpLmdldEdyb3VwXzNfMigpKTsgCiAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjE4NjM6NjogKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VGaWxlQ1NWX19Hcm91cF8zXzJfXzAgKQotICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMTg2Mzo3OiBydWxlX19EYXRhSW50ZXJjaGFuZ2VGaWxlQ1NWX19Hcm91cF8zXzJfXzAKKyAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjMyMDE6NjogKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VGaWxlQ1NWX19Hcm91cF8zXzJfXzAgKQorICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMzIwMTo3OiBydWxlX19EYXRhSW50ZXJjaGFuZ2VGaWxlQ1NWX19Hcm91cF8zXzJfXzAKICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV18yKTsKICAgICAgICAgICAgICAgICAgICAgcnVsZV9fRGF0YUludGVyY2hhbmdlRmlsZUNTVl9fR3JvdXBfM18yX18wKCk7CkBAIC03MTc0MiwyOCArNzYxOTksMjggQEAKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICBjYXNlIDQgOgotICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMTg2ODozOiAoey4uLn0/ID0+ICggKCAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbGVDU1ZfX0luZGVudEFzc2lnbm1lbnRfM18zICkgKSApICkKKyAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjMyMDY6MzogKHsuLi59PyA9PiAoICggKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VGaWxlQ1NWX19JbmRlbnRBc3NpZ25tZW50XzNfMyApICkgKSApCiAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjE4Njg6MzogKHsuLi59PyA9PiAoICggKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VGaWxlQ1NWX19JbmRlbnRBc3NpZ25tZW50XzNfMyApICkgKSApCi0gICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIxODY5OjQ6IHsuLi59PyA9PiAoICggKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VGaWxlQ1NWX19JbmRlbnRBc3NpZ25tZW50XzNfMyApICkgKQorICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMzIwNjozOiAoey4uLn0/ID0+ICggKCAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbGVDU1ZfX0luZGVudEFzc2lnbm1lbnRfM18zICkgKSApICkKKyAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjMyMDc6NDogey4uLn0/ID0+ICggKCAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbGVDU1ZfX0luZGVudEFzc2lnbm1lbnRfM18zICkgKSApCiAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgaWYgKCAhIGdldFVub3JkZXJlZEdyb3VwSGVscGVyKCkuY2FuU2VsZWN0KGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YUludGVyY2hhbmdlRmlsZUNTVkFjY2VzcygpLmdldFVub3JkZXJlZEdyb3VwXzMoKSwgMykgKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3RhdGUuYmFja3RyYWNraW5nPjApIHtzdGF0ZS5mYWlsZWQ9dHJ1ZTsgcmV0dXJuIDt9CiAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRmFpbGVkUHJlZGljYXRlRXhjZXB0aW9uKGlucHV0LCAicnVsZV9fRGF0YUludGVyY2hhbmdlRmlsZUNTVl9fVW5vcmRlcmVkR3JvdXBfM19fSW1wbCIsICJnZXRVbm9yZGVyZWRHcm91cEhlbHBlcigpLmNhblNlbGVjdChncmFtbWFyQWNjZXNzLmdldERhdGFJbnRlcmNoYW5nZUZpbGVDU1ZBY2Nlc3MoKS5nZXRVbm9yZGVyZWRHcm91cF8zKCksIDMpIik7CiAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjE4Njk6MTE4OiAoICggKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VGaWxlQ1NWX19JbmRlbnRBc3NpZ25tZW50XzNfMyApICkgKQotICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMTg3MDo1OiAoICggcnVsZV9fRGF0YUludGVyY2hhbmdlRmlsZUNTVl9fSW5kZW50QXNzaWdubWVudF8zXzMgKSApCisgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIzMjA3OjExODogKCAoICggcnVsZV9fRGF0YUludGVyY2hhbmdlRmlsZUNTVl9fSW5kZW50QXNzaWdubWVudF8zXzMgKSApICkKKyAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjMyMDg6NTogKCAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbGVDU1ZfX0luZGVudEFzc2lnbm1lbnRfM18zICkgKQogICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgIGdldFVub3JkZXJlZEdyb3VwSGVscGVyKCkuc2VsZWN0KGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YUludGVyY2hhbmdlRmlsZUNTVkFjY2VzcygpLmdldFVub3JkZXJlZEdyb3VwXzMoKSwgMyk7CiAgICAgICAgICAgICAgICAgICAgIHNlbGVjdGVkID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjE4NzY6NTogKCAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbGVDU1ZfX0luZGVudEFzc2lnbm1lbnRfM18zICkgKQotICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMTg3Nzo2OiAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbGVDU1ZfX0luZGVudEFzc2lnbm1lbnRfM18zICkKKyAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjMyMTQ6NTogKCAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbGVDU1ZfX0luZGVudEFzc2lnbm1lbnRfM18zICkgKQorICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMzIxNTo2OiAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbGVDU1ZfX0luZGVudEFzc2lnbm1lbnRfM18zICkKICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YUludGVyY2hhbmdlRmlsZUNTVkFjY2VzcygpLmdldEluZGVudEFzc2lnbm1lbnRfM18zKCkpOyAKICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMTg3ODo2OiAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbGVDU1ZfX0luZGVudEFzc2lnbm1lbnRfM18zICkKLSAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjE4Nzg6NzogcnVsZV9fRGF0YUludGVyY2hhbmdlRmlsZUNTVl9fSW5kZW50QXNzaWdubWVudF8zXzMKKyAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjMyMTY6NjogKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VGaWxlQ1NWX19JbmRlbnRBc3NpZ25tZW50XzNfMyApCisgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIzMjE2Ojc6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbGVDU1ZfX0luZGVudEFzc2lnbm1lbnRfM18zCiAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMik7CiAgICAgICAgICAgICAgICAgICAgIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbGVDU1ZfX0luZGVudEFzc2lnbm1lbnRfM18zKCk7CkBAIC03MTc4OSwyOCArNzYyNDYsMjggQEAKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICBjYXNlIDUgOgotICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMTg4MzozOiAoey4uLn0/ID0+ICggKCAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbGVDU1ZfX0dyb3VwXzNfNF9fMCApICkgKSApCisgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIzMjIxOjM6ICh7Li4ufT8gPT4gKCAoICggcnVsZV9fRGF0YUludGVyY2hhbmdlRmlsZUNTVl9fR3JvdXBfM180X18wICkgKSApICkKICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMTg4MzozOiAoey4uLn0/ID0+ICggKCAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbGVDU1ZfX0dyb3VwXzNfNF9fMCApICkgKSApCi0gICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIxODg0OjQ6IHsuLi59PyA9PiAoICggKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VGaWxlQ1NWX19Hcm91cF8zXzRfXzAgKSApICkKKyAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjMyMjE6MzogKHsuLi59PyA9PiAoICggKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VGaWxlQ1NWX19Hcm91cF8zXzRfXzAgKSApICkgKQorICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMzIyMjo0OiB7Li4ufT8gPT4gKCAoICggcnVsZV9fRGF0YUludGVyY2hhbmdlRmlsZUNTVl9fR3JvdXBfM180X18wICkgKSApCiAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgaWYgKCAhIGdldFVub3JkZXJlZEdyb3VwSGVscGVyKCkuY2FuU2VsZWN0KGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YUludGVyY2hhbmdlRmlsZUNTVkFjY2VzcygpLmdldFVub3JkZXJlZEdyb3VwXzMoKSwgNCkgKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3RhdGUuYmFja3RyYWNraW5nPjApIHtzdGF0ZS5mYWlsZWQ9dHJ1ZTsgcmV0dXJuIDt9CiAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRmFpbGVkUHJlZGljYXRlRXhjZXB0aW9uKGlucHV0LCAicnVsZV9fRGF0YUludGVyY2hhbmdlRmlsZUNTVl9fVW5vcmRlcmVkR3JvdXBfM19fSW1wbCIsICJnZXRVbm9yZGVyZWRHcm91cEhlbHBlcigpLmNhblNlbGVjdChncmFtbWFyQWNjZXNzLmdldERhdGFJbnRlcmNoYW5nZUZpbGVDU1ZBY2Nlc3MoKS5nZXRVbm9yZGVyZWRHcm91cF8zKCksIDQpIik7CiAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjE4ODQ6MTE4OiAoICggKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VGaWxlQ1NWX19Hcm91cF8zXzRfXzAgKSApICkKLSAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjE4ODU6NTogKCAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbGVDU1ZfX0dyb3VwXzNfNF9fMCApICkKKyAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjMyMjI6MTE4OiAoICggKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VGaWxlQ1NWX19Hcm91cF8zXzRfXzAgKSApICkKKyAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjMyMjM6NTogKCAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbGVDU1ZfX0dyb3VwXzNfNF9fMCApICkKICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICBnZXRVbm9yZGVyZWRHcm91cEhlbHBlcigpLnNlbGVjdChncmFtbWFyQWNjZXNzLmdldERhdGFJbnRlcmNoYW5nZUZpbGVDU1ZBY2Nlc3MoKS5nZXRVbm9yZGVyZWRHcm91cF8zKCksIDQpOwogICAgICAgICAgICAgICAgICAgICBzZWxlY3RlZCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIxODkxOjU6ICggKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VGaWxlQ1NWX19Hcm91cF8zXzRfXzAgKSApCi0gICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIxODkyOjY6ICggcnVsZV9fRGF0YUludGVyY2hhbmdlRmlsZUNTVl9fR3JvdXBfM180X18wICkKKyAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjMyMjk6NTogKCAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbGVDU1ZfX0dyb3VwXzNfNF9fMCApICkKKyAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjMyMzA6NjogKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VGaWxlQ1NWX19Hcm91cF8zXzRfXzAgKQogICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXREYXRhSW50ZXJjaGFuZ2VGaWxlQ1NWQWNjZXNzKCkuZ2V0R3JvdXBfM180KCkpOyAKICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMTg5Mzo2OiAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbGVDU1ZfX0dyb3VwXzNfNF9fMCApCi0gICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIxODkzOjc6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbGVDU1ZfX0dyb3VwXzNfNF9fMAorICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMzIzMTo2OiAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbGVDU1ZfX0dyb3VwXzNfNF9fMCApCisgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIzMjMxOjc6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbGVDU1ZfX0dyb3VwXzNfNF9fMAogICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzIpOwogICAgICAgICAgICAgICAgICAgICBydWxlX19EYXRhSW50ZXJjaGFuZ2VGaWxlQ1NWX19Hcm91cF8zXzRfXzAoKTsKQEAgLTcxODM2LDI4ICs3NjI5MywyOCBAQAogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgIGNhc2UgNiA6Ci0gICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIxODk4OjM6ICh7Li4ufT8gPT4gKCAoICggcnVsZV9fRGF0YUludGVyY2hhbmdlRmlsZUNTVl9fR3JvdXBfM181X18wICkgKSApICkKKyAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjMyMzY6MzogKHsuLi59PyA9PiAoICggKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VGaWxlQ1NWX19Hcm91cF8zXzVfXzAgKSApICkgKQogICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIxODk4OjM6ICh7Li4ufT8gPT4gKCAoICggcnVsZV9fRGF0YUludGVyY2hhbmdlRmlsZUNTVl9fR3JvdXBfM181X18wICkgKSApICkKLSAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjE4OTk6NDogey4uLn0/ID0+ICggKCAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbGVDU1ZfX0dyb3VwXzNfNV9fMCApICkgKQorICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMzIzNjozOiAoey4uLn0/ID0+ICggKCAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbGVDU1ZfX0dyb3VwXzNfNV9fMCApICkgKSApCisgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIzMjM3OjQ6IHsuLi59PyA9PiAoICggKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VGaWxlQ1NWX19Hcm91cF8zXzVfXzAgKSApICkKICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICBpZiAoICEgZ2V0VW5vcmRlcmVkR3JvdXBIZWxwZXIoKS5jYW5TZWxlY3QoZ3JhbW1hckFjY2Vzcy5nZXREYXRhSW50ZXJjaGFuZ2VGaWxlQ1NWQWNjZXNzKCkuZ2V0VW5vcmRlcmVkR3JvdXBfMygpLCA1KSApIHsKICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdGF0ZS5iYWNrdHJhY2tpbmc+MCkge3N0YXRlLmZhaWxlZD10cnVlOyByZXR1cm4gO30KICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBGYWlsZWRQcmVkaWNhdGVFeGNlcHRpb24oaW5wdXQsICJydWxlX19EYXRhSW50ZXJjaGFuZ2VGaWxlQ1NWX19Vbm9yZGVyZWRHcm91cF8zX19JbXBsIiwgImdldFVub3JkZXJlZEdyb3VwSGVscGVyKCkuY2FuU2VsZWN0KGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YUludGVyY2hhbmdlRmlsZUNTVkFjY2VzcygpLmdldFVub3JkZXJlZEdyb3VwXzMoKSwgNSkiKTsKICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMTg5OToxMTg6ICggKCAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbGVDU1ZfX0dyb3VwXzNfNV9fMCApICkgKQotICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMTkwMDo1OiAoICggcnVsZV9fRGF0YUludGVyY2hhbmdlRmlsZUNTVl9fR3JvdXBfM181X18wICkgKQorICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMzIzNzoxMTg6ICggKCAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbGVDU1ZfX0dyb3VwXzNfNV9fMCApICkgKQorICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMzIzODo1OiAoICggcnVsZV9fRGF0YUludGVyY2hhbmdlRmlsZUNTVl9fR3JvdXBfM181X18wICkgKQogICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgIGdldFVub3JkZXJlZEdyb3VwSGVscGVyKCkuc2VsZWN0KGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YUludGVyY2hhbmdlRmlsZUNTVkFjY2VzcygpLmdldFVub3JkZXJlZEdyb3VwXzMoKSwgNSk7CiAgICAgICAgICAgICAgICAgICAgIHNlbGVjdGVkID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjE5MDY6NTogKCAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbGVDU1ZfX0dyb3VwXzNfNV9fMCApICkKLSAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjE5MDc6NjogKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VGaWxlQ1NWX19Hcm91cF8zXzVfXzAgKQorICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMzI0NDo1OiAoICggcnVsZV9fRGF0YUludGVyY2hhbmdlRmlsZUNTVl9fR3JvdXBfM181X18wICkgKQorICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMzI0NTo2OiAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbGVDU1ZfX0dyb3VwXzNfNV9fMCApCiAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldERhdGFJbnRlcmNoYW5nZUZpbGVDU1ZBY2Nlc3MoKS5nZXRHcm91cF8zXzUoKSk7IAogICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIxOTA4OjY6ICggcnVsZV9fRGF0YUludGVyY2hhbmdlRmlsZUNTVl9fR3JvdXBfM181X18wICkKLSAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjE5MDg6NzogcnVsZV9fRGF0YUludGVyY2hhbmdlRmlsZUNTVl9fR3JvdXBfM181X18wCisgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIzMjQ2OjY6ICggcnVsZV9fRGF0YUludGVyY2hhbmdlRmlsZUNTVl9fR3JvdXBfM181X18wICkKKyAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjMyNDY6NzogcnVsZV9fRGF0YUludGVyY2hhbmdlRmlsZUNTVl9fR3JvdXBfM181X18wCiAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMik7CiAgICAgICAgICAgICAgICAgICAgIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbGVDU1ZfX0dyb3VwXzNfNV9fMCgpOwpAQCAtNzE5MDYsNDMgKzc2MzYzLDQzIEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fRGF0YUludGVyY2hhbmdlRmlsZUNTVl9fVW5vcmRlcmVkR3JvdXBfM19fMCIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMTkyMToxOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VGaWxlQ1NWX19Vbm9yZGVyZWRHcm91cF8zX18wIDogcnVsZV9fRGF0YUludGVyY2hhbmdlRmlsZUNTVl9fVW5vcmRlcmVkR3JvdXBfM19fSW1wbCAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbGVDU1ZfX1Vub3JkZXJlZEdyb3VwXzNfXzEgKT8gOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIzMjU5OjE6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbGVDU1ZfX1Vub3JkZXJlZEdyb3VwXzNfXzAgOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VGaWxlQ1NWX19Vbm9yZGVyZWRHcm91cF8zX19JbXBsICggcnVsZV9fRGF0YUludGVyY2hhbmdlRmlsZUNTVl9fVW5vcmRlcmVkR3JvdXBfM19fMSApPyA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fRGF0YUludGVyY2hhbmdlRmlsZUNTVl9fVW5vcmRlcmVkR3JvdXBfM19fMCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMTkyNToxOiAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbGVDU1ZfX1Vub3JkZXJlZEdyb3VwXzNfX0ltcGwgKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VGaWxlQ1NWX19Vbm9yZGVyZWRHcm91cF8zX18xICk/ICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIxOTI2OjI6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbGVDU1ZfX1Vub3JkZXJlZEdyb3VwXzNfX0ltcGwgKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VGaWxlQ1NWX19Vbm9yZGVyZWRHcm91cF8zX18xICk/CisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMzI2MzoxOiAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbGVDU1ZfX1Vub3JkZXJlZEdyb3VwXzNfX0ltcGwgKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VGaWxlQ1NWX19Vbm9yZGVyZWRHcm91cF8zX18xICk/ICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIzMjY0OjI6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbGVDU1ZfX1Vub3JkZXJlZEdyb3VwXzNfX0ltcGwgKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VGaWxlQ1NWX19Vbm9yZGVyZWRHcm91cF8zX18xICk/CiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV18xNTYpOworICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMTY0KTsKICAgICAgICAgICAgIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbGVDU1ZfX1Vub3JkZXJlZEdyb3VwXzNfX0ltcGwoKTsKIAogICAgICAgICAgICAgc3RhdGUuX2ZzcC0tOwogICAgICAgICAgICAgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIxOTI3OjI6ICggcnVsZV9fRGF0YUludGVyY2hhbmdlRmlsZUNTVl9fVW5vcmRlcmVkR3JvdXBfM19fMSApPwotICAgICAgICAgICAgaW50IGFsdDE3NT0yOwotICAgICAgICAgICAgaW50IExBMTc1XzAgPSBpbnB1dC5MQSgxKTsKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIzMjY1OjI6ICggcnVsZV9fRGF0YUludGVyY2hhbmdlRmlsZUNTVl9fVW5vcmRlcmVkR3JvdXBfM19fMSApPworICAgICAgICAgICAgaW50IGFsdDE4OD0yOworICAgICAgICAgICAgaW50IExBMTg4XzAgPSBpbnB1dC5MQSgxKTsKIAotICAgICAgICAgICAgaWYgKCBMQTE3NV8wID09IDgxICYmIGdldFVub3JkZXJlZEdyb3VwSGVscGVyKCkuY2FuU2VsZWN0KGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YUludGVyY2hhbmdlRmlsZUNTVkFjY2VzcygpLmdldFVub3JkZXJlZEdyb3VwXzMoKSwgMCkgKSB7Ci0gICAgICAgICAgICAgICAgYWx0MTc1PTE7CisgICAgICAgICAgICBpZiAoIExBMTg4XzAgPT0gODYgJiYgZ2V0VW5vcmRlcmVkR3JvdXBIZWxwZXIoKS5jYW5TZWxlY3QoZ3JhbW1hckFjY2Vzcy5nZXREYXRhSW50ZXJjaGFuZ2VGaWxlQ1NWQWNjZXNzKCkuZ2V0VW5vcmRlcmVkR3JvdXBfMygpLCAwKSApIHsKKyAgICAgICAgICAgICAgICBhbHQxODg9MTsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgaWYgKCBMQTE3NV8wID09IDgyICYmIGdldFVub3JkZXJlZEdyb3VwSGVscGVyKCkuY2FuU2VsZWN0KGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YUludGVyY2hhbmdlRmlsZUNTVkFjY2VzcygpLmdldFVub3JkZXJlZEdyb3VwXzMoKSwgMSkgKSB7Ci0gICAgICAgICAgICAgICAgYWx0MTc1PTE7CisgICAgICAgICAgICBlbHNlIGlmICggTEExODhfMCA9PSA4NyAmJiBnZXRVbm9yZGVyZWRHcm91cEhlbHBlcigpLmNhblNlbGVjdChncmFtbWFyQWNjZXNzLmdldERhdGFJbnRlcmNoYW5nZUZpbGVDU1ZBY2Nlc3MoKS5nZXRVbm9yZGVyZWRHcm91cF8zKCksIDEpICkgeworICAgICAgICAgICAgICAgIGFsdDE4OD0xOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSBpZiAoIExBMTc1XzAgPT0gODMgJiYgZ2V0VW5vcmRlcmVkR3JvdXBIZWxwZXIoKS5jYW5TZWxlY3QoZ3JhbW1hckFjY2Vzcy5nZXREYXRhSW50ZXJjaGFuZ2VGaWxlQ1NWQWNjZXNzKCkuZ2V0VW5vcmRlcmVkR3JvdXBfMygpLCAyKSApIHsKLSAgICAgICAgICAgICAgICBhbHQxNzU9MTsKKyAgICAgICAgICAgIGVsc2UgaWYgKCBMQTE4OF8wID09IDg4ICYmIGdldFVub3JkZXJlZEdyb3VwSGVscGVyKCkuY2FuU2VsZWN0KGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YUludGVyY2hhbmdlRmlsZUNTVkFjY2VzcygpLmdldFVub3JkZXJlZEdyb3VwXzMoKSwgMikgKSB7CisgICAgICAgICAgICAgICAgYWx0MTg4PTE7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIGlmICggTEExNzVfMCA9PSAxNDIgJiYgZ2V0VW5vcmRlcmVkR3JvdXBIZWxwZXIoKS5jYW5TZWxlY3QoZ3JhbW1hckFjY2Vzcy5nZXREYXRhSW50ZXJjaGFuZ2VGaWxlQ1NWQWNjZXNzKCkuZ2V0VW5vcmRlcmVkR3JvdXBfMygpLCAzKSApIHsKLSAgICAgICAgICAgICAgICBhbHQxNzU9MTsKKyAgICAgICAgICAgIGVsc2UgaWYgKCBMQTE4OF8wID09IDE1MyAmJiBnZXRVbm9yZGVyZWRHcm91cEhlbHBlcigpLmNhblNlbGVjdChncmFtbWFyQWNjZXNzLmdldERhdGFJbnRlcmNoYW5nZUZpbGVDU1ZBY2Nlc3MoKS5nZXRVbm9yZGVyZWRHcm91cF8zKCksIDMpICkgeworICAgICAgICAgICAgICAgIGFsdDE4OD0xOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSBpZiAoIExBMTc1XzAgPT0gNzggJiYgZ2V0VW5vcmRlcmVkR3JvdXBIZWxwZXIoKS5jYW5TZWxlY3QoZ3JhbW1hckFjY2Vzcy5nZXREYXRhSW50ZXJjaGFuZ2VGaWxlQ1NWQWNjZXNzKCkuZ2V0VW5vcmRlcmVkR3JvdXBfMygpLCA0KSApIHsKLSAgICAgICAgICAgICAgICBhbHQxNzU9MTsKKyAgICAgICAgICAgIGVsc2UgaWYgKCBMQTE4OF8wID09IDgzICYmIGdldFVub3JkZXJlZEdyb3VwSGVscGVyKCkuY2FuU2VsZWN0KGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YUludGVyY2hhbmdlRmlsZUNTVkFjY2VzcygpLmdldFVub3JkZXJlZEdyb3VwXzMoKSwgNCkgKSB7CisgICAgICAgICAgICAgICAgYWx0MTg4PTE7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIGlmICggTEExNzVfMCA9PSA3OSAmJiBnZXRVbm9yZGVyZWRHcm91cEhlbHBlcigpLmNhblNlbGVjdChncmFtbWFyQWNjZXNzLmdldERhdGFJbnRlcmNoYW5nZUZpbGVDU1ZBY2Nlc3MoKS5nZXRVbm9yZGVyZWRHcm91cF8zKCksIDUpICkgewotICAgICAgICAgICAgICAgIGFsdDE3NT0xOworICAgICAgICAgICAgZWxzZSBpZiAoIExBMTg4XzAgPT0gODQgJiYgZ2V0VW5vcmRlcmVkR3JvdXBIZWxwZXIoKS5jYW5TZWxlY3QoZ3JhbW1hckFjY2Vzcy5nZXREYXRhSW50ZXJjaGFuZ2VGaWxlQ1NWQWNjZXNzKCkuZ2V0VW5vcmRlcmVkR3JvdXBfMygpLCA1KSApIHsKKyAgICAgICAgICAgICAgICBhbHQxODg9MTsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHN3aXRjaCAoYWx0MTc1KSB7CisgICAgICAgICAgICBzd2l0Y2ggKGFsdDE4OCkgewogICAgICAgICAgICAgICAgIGNhc2UgMSA6CiAgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjA6MDogcnVsZV9fRGF0YUludGVyY2hhbmdlRmlsZUNTVl9fVW5vcmRlcmVkR3JvdXBfM19fMQogICAgICAgICAgICAgICAgICAgICB7CkBAIC03MTk3Niw0MyArNzY0MzMsNDMgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19EYXRhSW50ZXJjaGFuZ2VGaWxlQ1NWX19Vbm9yZGVyZWRHcm91cF8zX18xIgotICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIxOTMzOjE6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbGVDU1ZfX1Vub3JkZXJlZEdyb3VwXzNfXzEgOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VGaWxlQ1NWX19Vbm9yZGVyZWRHcm91cF8zX19JbXBsICggcnVsZV9fRGF0YUludGVyY2hhbmdlRmlsZUNTVl9fVW5vcmRlcmVkR3JvdXBfM19fMiApPyA7CisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjMyNzE6MTogcnVsZV9fRGF0YUludGVyY2hhbmdlRmlsZUNTVl9fVW5vcmRlcmVkR3JvdXBfM19fMSA6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbGVDU1ZfX1Vub3JkZXJlZEdyb3VwXzNfX0ltcGwgKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VGaWxlQ1NWX19Vbm9yZGVyZWRHcm91cF8zX18yICk/IDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19EYXRhSW50ZXJjaGFuZ2VGaWxlQ1NWX19Vbm9yZGVyZWRHcm91cF8zX18xKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIxOTM3OjE6ICggcnVsZV9fRGF0YUludGVyY2hhbmdlRmlsZUNTVl9fVW5vcmRlcmVkR3JvdXBfM19fSW1wbCAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbGVDU1ZfX1Vub3JkZXJlZEdyb3VwXzNfXzIgKT8gKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjE5Mzg6MjogcnVsZV9fRGF0YUludGVyY2hhbmdlRmlsZUNTVl9fVW5vcmRlcmVkR3JvdXBfM19fSW1wbCAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbGVDU1ZfX1Vub3JkZXJlZEdyb3VwXzNfXzIgKT8KKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIzMjc1OjE6ICggcnVsZV9fRGF0YUludGVyY2hhbmdlRmlsZUNTVl9fVW5vcmRlcmVkR3JvdXBfM19fSW1wbCAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbGVDU1ZfX1Vub3JkZXJlZEdyb3VwXzNfXzIgKT8gKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjMyNzY6MjogcnVsZV9fRGF0YUludGVyY2hhbmdlRmlsZUNTVl9fVW5vcmRlcmVkR3JvdXBfM19fSW1wbCAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbGVDU1ZfX1Vub3JkZXJlZEdyb3VwXzNfXzIgKT8KICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzE1Nik7CisgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV18xNjQpOwogICAgICAgICAgICAgcnVsZV9fRGF0YUludGVyY2hhbmdlRmlsZUNTVl9fVW5vcmRlcmVkR3JvdXBfM19fSW1wbCgpOwogCiAgICAgICAgICAgICBzdGF0ZS5fZnNwLS07CiAgICAgICAgICAgICBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOwotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjE5Mzk6MjogKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VGaWxlQ1NWX19Vbm9yZGVyZWRHcm91cF8zX18yICk/Ci0gICAgICAgICAgICBpbnQgYWx0MTc2PTI7Ci0gICAgICAgICAgICBpbnQgTEExNzZfMCA9IGlucHV0LkxBKDEpOworICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjMyNzc6MjogKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VGaWxlQ1NWX19Vbm9yZGVyZWRHcm91cF8zX18yICk/CisgICAgICAgICAgICBpbnQgYWx0MTg5PTI7CisgICAgICAgICAgICBpbnQgTEExODlfMCA9IGlucHV0LkxBKDEpOwogCi0gICAgICAgICAgICBpZiAoIExBMTc2XzAgPT0gODEgJiYgZ2V0VW5vcmRlcmVkR3JvdXBIZWxwZXIoKS5jYW5TZWxlY3QoZ3JhbW1hckFjY2Vzcy5nZXREYXRhSW50ZXJjaGFuZ2VGaWxlQ1NWQWNjZXNzKCkuZ2V0VW5vcmRlcmVkR3JvdXBfMygpLCAwKSApIHsKLSAgICAgICAgICAgICAgICBhbHQxNzY9MTsKKyAgICAgICAgICAgIGlmICggTEExODlfMCA9PSA4NiAmJiBnZXRVbm9yZGVyZWRHcm91cEhlbHBlcigpLmNhblNlbGVjdChncmFtbWFyQWNjZXNzLmdldERhdGFJbnRlcmNoYW5nZUZpbGVDU1ZBY2Nlc3MoKS5nZXRVbm9yZGVyZWRHcm91cF8zKCksIDApICkgeworICAgICAgICAgICAgICAgIGFsdDE4OT0xOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSBpZiAoIExBMTc2XzAgPT0gODIgJiYgZ2V0VW5vcmRlcmVkR3JvdXBIZWxwZXIoKS5jYW5TZWxlY3QoZ3JhbW1hckFjY2Vzcy5nZXREYXRhSW50ZXJjaGFuZ2VGaWxlQ1NWQWNjZXNzKCkuZ2V0VW5vcmRlcmVkR3JvdXBfMygpLCAxKSApIHsKLSAgICAgICAgICAgICAgICBhbHQxNzY9MTsKKyAgICAgICAgICAgIGVsc2UgaWYgKCBMQTE4OV8wID09IDg3ICYmIGdldFVub3JkZXJlZEdyb3VwSGVscGVyKCkuY2FuU2VsZWN0KGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YUludGVyY2hhbmdlRmlsZUNTVkFjY2VzcygpLmdldFVub3JkZXJlZEdyb3VwXzMoKSwgMSkgKSB7CisgICAgICAgICAgICAgICAgYWx0MTg5PTE7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIGlmICggTEExNzZfMCA9PSA4MyAmJiBnZXRVbm9yZGVyZWRHcm91cEhlbHBlcigpLmNhblNlbGVjdChncmFtbWFyQWNjZXNzLmdldERhdGFJbnRlcmNoYW5nZUZpbGVDU1ZBY2Nlc3MoKS5nZXRVbm9yZGVyZWRHcm91cF8zKCksIDIpICkgewotICAgICAgICAgICAgICAgIGFsdDE3Nj0xOworICAgICAgICAgICAgZWxzZSBpZiAoIExBMTg5XzAgPT0gODggJiYgZ2V0VW5vcmRlcmVkR3JvdXBIZWxwZXIoKS5jYW5TZWxlY3QoZ3JhbW1hckFjY2Vzcy5nZXREYXRhSW50ZXJjaGFuZ2VGaWxlQ1NWQWNjZXNzKCkuZ2V0VW5vcmRlcmVkR3JvdXBfMygpLCAyKSApIHsKKyAgICAgICAgICAgICAgICBhbHQxODk9MTsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgaWYgKCBMQTE3Nl8wID09IDE0MiAmJiBnZXRVbm9yZGVyZWRHcm91cEhlbHBlcigpLmNhblNlbGVjdChncmFtbWFyQWNjZXNzLmdldERhdGFJbnRlcmNoYW5nZUZpbGVDU1ZBY2Nlc3MoKS5nZXRVbm9yZGVyZWRHcm91cF8zKCksIDMpICkgewotICAgICAgICAgICAgICAgIGFsdDE3Nj0xOworICAgICAgICAgICAgZWxzZSBpZiAoIExBMTg5XzAgPT0gMTUzICYmIGdldFVub3JkZXJlZEdyb3VwSGVscGVyKCkuY2FuU2VsZWN0KGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YUludGVyY2hhbmdlRmlsZUNTVkFjY2VzcygpLmdldFVub3JkZXJlZEdyb3VwXzMoKSwgMykgKSB7CisgICAgICAgICAgICAgICAgYWx0MTg5PTE7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIGlmICggTEExNzZfMCA9PSA3OCAmJiBnZXRVbm9yZGVyZWRHcm91cEhlbHBlcigpLmNhblNlbGVjdChncmFtbWFyQWNjZXNzLmdldERhdGFJbnRlcmNoYW5nZUZpbGVDU1ZBY2Nlc3MoKS5nZXRVbm9yZGVyZWRHcm91cF8zKCksIDQpICkgewotICAgICAgICAgICAgICAgIGFsdDE3Nj0xOworICAgICAgICAgICAgZWxzZSBpZiAoIExBMTg5XzAgPT0gODMgJiYgZ2V0VW5vcmRlcmVkR3JvdXBIZWxwZXIoKS5jYW5TZWxlY3QoZ3JhbW1hckFjY2Vzcy5nZXREYXRhSW50ZXJjaGFuZ2VGaWxlQ1NWQWNjZXNzKCkuZ2V0VW5vcmRlcmVkR3JvdXBfMygpLCA0KSApIHsKKyAgICAgICAgICAgICAgICBhbHQxODk9MTsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgaWYgKCBMQTE3Nl8wID09IDc5ICYmIGdldFVub3JkZXJlZEdyb3VwSGVscGVyKCkuY2FuU2VsZWN0KGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YUludGVyY2hhbmdlRmlsZUNTVkFjY2VzcygpLmdldFVub3JkZXJlZEdyb3VwXzMoKSwgNSkgKSB7Ci0gICAgICAgICAgICAgICAgYWx0MTc2PTE7CisgICAgICAgICAgICBlbHNlIGlmICggTEExODlfMCA9PSA4NCAmJiBnZXRVbm9yZGVyZWRHcm91cEhlbHBlcigpLmNhblNlbGVjdChncmFtbWFyQWNjZXNzLmdldERhdGFJbnRlcmNoYW5nZUZpbGVDU1ZBY2Nlc3MoKS5nZXRVbm9yZGVyZWRHcm91cF8zKCksIDUpICkgeworICAgICAgICAgICAgICAgIGFsdDE4OT0xOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgc3dpdGNoIChhbHQxNzYpIHsKKyAgICAgICAgICAgIHN3aXRjaCAoYWx0MTg5KSB7CiAgICAgICAgICAgICAgICAgY2FzZSAxIDoKICAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MDowOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VGaWxlQ1NWX19Vbm9yZGVyZWRHcm91cF8zX18yCiAgICAgICAgICAgICAgICAgICAgIHsKQEAgLTcyMDQ2LDQzICs3NjUwMyw0MyBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbGVDU1ZfX1Vub3JkZXJlZEdyb3VwXzNfXzIiCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjE5NDU6MTogcnVsZV9fRGF0YUludGVyY2hhbmdlRmlsZUNTVl9fVW5vcmRlcmVkR3JvdXBfM19fMiA6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbGVDU1ZfX1Vub3JkZXJlZEdyb3VwXzNfX0ltcGwgKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VGaWxlQ1NWX19Vbm9yZGVyZWRHcm91cF8zX18zICk/IDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMzI4MzoxOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VGaWxlQ1NWX19Vbm9yZGVyZWRHcm91cF8zX18yIDogcnVsZV9fRGF0YUludGVyY2hhbmdlRmlsZUNTVl9fVW5vcmRlcmVkR3JvdXBfM19fSW1wbCAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbGVDU1ZfX1Vub3JkZXJlZEdyb3VwXzNfXzMgKT8gOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbGVDU1ZfX1Vub3JkZXJlZEdyb3VwXzNfXzIoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjE5NDk6MTogKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VGaWxlQ1NWX19Vbm9yZGVyZWRHcm91cF8zX19JbXBsICggcnVsZV9fRGF0YUludGVyY2hhbmdlRmlsZUNTVl9fVW5vcmRlcmVkR3JvdXBfM19fMyApPyApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMTk1MDoyOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VGaWxlQ1NWX19Vbm9yZGVyZWRHcm91cF8zX19JbXBsICggcnVsZV9fRGF0YUludGVyY2hhbmdlRmlsZUNTVl9fVW5vcmRlcmVkR3JvdXBfM19fMyApPworICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjMyODc6MTogKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VGaWxlQ1NWX19Vbm9yZGVyZWRHcm91cF8zX19JbXBsICggcnVsZV9fRGF0YUludGVyY2hhbmdlRmlsZUNTVl9fVW5vcmRlcmVkR3JvdXBfM19fMyApPyApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMzI4ODoyOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VGaWxlQ1NWX19Vbm9yZGVyZWRHcm91cF8zX19JbXBsICggcnVsZV9fRGF0YUludGVyY2hhbmdlRmlsZUNTVl9fVW5vcmRlcmVkR3JvdXBfM19fMyApPwogICAgICAgICAgICAgewotICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMTU2KTsKKyAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzE2NCk7CiAgICAgICAgICAgICBydWxlX19EYXRhSW50ZXJjaGFuZ2VGaWxlQ1NWX19Vbm9yZGVyZWRHcm91cF8zX19JbXBsKCk7CiAKICAgICAgICAgICAgIHN0YXRlLl9mc3AtLTsKICAgICAgICAgICAgIGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMTk1MToyOiAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbGVDU1ZfX1Vub3JkZXJlZEdyb3VwXzNfXzMgKT8KLSAgICAgICAgICAgIGludCBhbHQxNzc9MjsKLSAgICAgICAgICAgIGludCBMQTE3N18wID0gaW5wdXQuTEEoMSk7CisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMzI4OToyOiAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbGVDU1ZfX1Vub3JkZXJlZEdyb3VwXzNfXzMgKT8KKyAgICAgICAgICAgIGludCBhbHQxOTA9MjsKKyAgICAgICAgICAgIGludCBMQTE5MF8wID0gaW5wdXQuTEEoMSk7CiAKLSAgICAgICAgICAgIGlmICggTEExNzdfMCA9PSA4MSAmJiBnZXRVbm9yZGVyZWRHcm91cEhlbHBlcigpLmNhblNlbGVjdChncmFtbWFyQWNjZXNzLmdldERhdGFJbnRlcmNoYW5nZUZpbGVDU1ZBY2Nlc3MoKS5nZXRVbm9yZGVyZWRHcm91cF8zKCksIDApICkgewotICAgICAgICAgICAgICAgIGFsdDE3Nz0xOworICAgICAgICAgICAgaWYgKCBMQTE5MF8wID09IDg2ICYmIGdldFVub3JkZXJlZEdyb3VwSGVscGVyKCkuY2FuU2VsZWN0KGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YUludGVyY2hhbmdlRmlsZUNTVkFjY2VzcygpLmdldFVub3JkZXJlZEdyb3VwXzMoKSwgMCkgKSB7CisgICAgICAgICAgICAgICAgYWx0MTkwPTE7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIGlmICggTEExNzdfMCA9PSA4MiAmJiBnZXRVbm9yZGVyZWRHcm91cEhlbHBlcigpLmNhblNlbGVjdChncmFtbWFyQWNjZXNzLmdldERhdGFJbnRlcmNoYW5nZUZpbGVDU1ZBY2Nlc3MoKS5nZXRVbm9yZGVyZWRHcm91cF8zKCksIDEpICkgewotICAgICAgICAgICAgICAgIGFsdDE3Nz0xOworICAgICAgICAgICAgZWxzZSBpZiAoIExBMTkwXzAgPT0gODcgJiYgZ2V0VW5vcmRlcmVkR3JvdXBIZWxwZXIoKS5jYW5TZWxlY3QoZ3JhbW1hckFjY2Vzcy5nZXREYXRhSW50ZXJjaGFuZ2VGaWxlQ1NWQWNjZXNzKCkuZ2V0VW5vcmRlcmVkR3JvdXBfMygpLCAxKSApIHsKKyAgICAgICAgICAgICAgICBhbHQxOTA9MTsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgaWYgKCBMQTE3N18wID09IDgzICYmIGdldFVub3JkZXJlZEdyb3VwSGVscGVyKCkuY2FuU2VsZWN0KGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YUludGVyY2hhbmdlRmlsZUNTVkFjY2VzcygpLmdldFVub3JkZXJlZEdyb3VwXzMoKSwgMikgKSB7Ci0gICAgICAgICAgICAgICAgYWx0MTc3PTE7CisgICAgICAgICAgICBlbHNlIGlmICggTEExOTBfMCA9PSA4OCAmJiBnZXRVbm9yZGVyZWRHcm91cEhlbHBlcigpLmNhblNlbGVjdChncmFtbWFyQWNjZXNzLmdldERhdGFJbnRlcmNoYW5nZUZpbGVDU1ZBY2Nlc3MoKS5nZXRVbm9yZGVyZWRHcm91cF8zKCksIDIpICkgeworICAgICAgICAgICAgICAgIGFsdDE5MD0xOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSBpZiAoIExBMTc3XzAgPT0gMTQyICYmIGdldFVub3JkZXJlZEdyb3VwSGVscGVyKCkuY2FuU2VsZWN0KGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YUludGVyY2hhbmdlRmlsZUNTVkFjY2VzcygpLmdldFVub3JkZXJlZEdyb3VwXzMoKSwgMykgKSB7Ci0gICAgICAgICAgICAgICAgYWx0MTc3PTE7CisgICAgICAgICAgICBlbHNlIGlmICggTEExOTBfMCA9PSAxNTMgJiYgZ2V0VW5vcmRlcmVkR3JvdXBIZWxwZXIoKS5jYW5TZWxlY3QoZ3JhbW1hckFjY2Vzcy5nZXREYXRhSW50ZXJjaGFuZ2VGaWxlQ1NWQWNjZXNzKCkuZ2V0VW5vcmRlcmVkR3JvdXBfMygpLCAzKSApIHsKKyAgICAgICAgICAgICAgICBhbHQxOTA9MTsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgaWYgKCBMQTE3N18wID09IDc4ICYmIGdldFVub3JkZXJlZEdyb3VwSGVscGVyKCkuY2FuU2VsZWN0KGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YUludGVyY2hhbmdlRmlsZUNTVkFjY2VzcygpLmdldFVub3JkZXJlZEdyb3VwXzMoKSwgNCkgKSB7Ci0gICAgICAgICAgICAgICAgYWx0MTc3PTE7CisgICAgICAgICAgICBlbHNlIGlmICggTEExOTBfMCA9PSA4MyAmJiBnZXRVbm9yZGVyZWRHcm91cEhlbHBlcigpLmNhblNlbGVjdChncmFtbWFyQWNjZXNzLmdldERhdGFJbnRlcmNoYW5nZUZpbGVDU1ZBY2Nlc3MoKS5nZXRVbm9yZGVyZWRHcm91cF8zKCksIDQpICkgeworICAgICAgICAgICAgICAgIGFsdDE5MD0xOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSBpZiAoIExBMTc3XzAgPT0gNzkgJiYgZ2V0VW5vcmRlcmVkR3JvdXBIZWxwZXIoKS5jYW5TZWxlY3QoZ3JhbW1hckFjY2Vzcy5nZXREYXRhSW50ZXJjaGFuZ2VGaWxlQ1NWQWNjZXNzKCkuZ2V0VW5vcmRlcmVkR3JvdXBfMygpLCA1KSApIHsKLSAgICAgICAgICAgICAgICBhbHQxNzc9MTsKKyAgICAgICAgICAgIGVsc2UgaWYgKCBMQTE5MF8wID09IDg0ICYmIGdldFVub3JkZXJlZEdyb3VwSGVscGVyKCkuY2FuU2VsZWN0KGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YUludGVyY2hhbmdlRmlsZUNTVkFjY2VzcygpLmdldFVub3JkZXJlZEdyb3VwXzMoKSwgNSkgKSB7CisgICAgICAgICAgICAgICAgYWx0MTkwPTE7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBzd2l0Y2ggKGFsdDE3NykgeworICAgICAgICAgICAgc3dpdGNoIChhbHQxOTApIHsKICAgICAgICAgICAgICAgICBjYXNlIDEgOgogICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzowOjA6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbGVDU1ZfX1Vub3JkZXJlZEdyb3VwXzNfXzMKICAgICAgICAgICAgICAgICAgICAgewpAQCAtNzIxMTYsNDMgKzc2NTczLDQzIEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fRGF0YUludGVyY2hhbmdlRmlsZUNTVl9fVW5vcmRlcmVkR3JvdXBfM19fMyIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMTk1NzoxOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VGaWxlQ1NWX19Vbm9yZGVyZWRHcm91cF8zX18zIDogcnVsZV9fRGF0YUludGVyY2hhbmdlRmlsZUNTVl9fVW5vcmRlcmVkR3JvdXBfM19fSW1wbCAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbGVDU1ZfX1Vub3JkZXJlZEdyb3VwXzNfXzQgKT8gOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIzMjk1OjE6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbGVDU1ZfX1Vub3JkZXJlZEdyb3VwXzNfXzMgOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VGaWxlQ1NWX19Vbm9yZGVyZWRHcm91cF8zX19JbXBsICggcnVsZV9fRGF0YUludGVyY2hhbmdlRmlsZUNTVl9fVW5vcmRlcmVkR3JvdXBfM19fNCApPyA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fRGF0YUludGVyY2hhbmdlRmlsZUNTVl9fVW5vcmRlcmVkR3JvdXBfM19fMygpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMTk2MToxOiAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbGVDU1ZfX1Vub3JkZXJlZEdyb3VwXzNfX0ltcGwgKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VGaWxlQ1NWX19Vbm9yZGVyZWRHcm91cF8zX180ICk/ICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIxOTYyOjI6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbGVDU1ZfX1Vub3JkZXJlZEdyb3VwXzNfX0ltcGwgKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VGaWxlQ1NWX19Vbm9yZGVyZWRHcm91cF8zX180ICk/CisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMzI5OToxOiAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbGVDU1ZfX1Vub3JkZXJlZEdyb3VwXzNfX0ltcGwgKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VGaWxlQ1NWX19Vbm9yZGVyZWRHcm91cF8zX180ICk/ICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIzMzAwOjI6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbGVDU1ZfX1Vub3JkZXJlZEdyb3VwXzNfX0ltcGwgKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VGaWxlQ1NWX19Vbm9yZGVyZWRHcm91cF8zX180ICk/CiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV18xNTYpOworICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMTY0KTsKICAgICAgICAgICAgIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbGVDU1ZfX1Vub3JkZXJlZEdyb3VwXzNfX0ltcGwoKTsKIAogICAgICAgICAgICAgc3RhdGUuX2ZzcC0tOwogICAgICAgICAgICAgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIxOTYzOjI6ICggcnVsZV9fRGF0YUludGVyY2hhbmdlRmlsZUNTVl9fVW5vcmRlcmVkR3JvdXBfM19fNCApPwotICAgICAgICAgICAgaW50IGFsdDE3OD0yOwotICAgICAgICAgICAgaW50IExBMTc4XzAgPSBpbnB1dC5MQSgxKTsKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIzMzAxOjI6ICggcnVsZV9fRGF0YUludGVyY2hhbmdlRmlsZUNTVl9fVW5vcmRlcmVkR3JvdXBfM19fNCApPworICAgICAgICAgICAgaW50IGFsdDE5MT0yOworICAgICAgICAgICAgaW50IExBMTkxXzAgPSBpbnB1dC5MQSgxKTsKIAotICAgICAgICAgICAgaWYgKCBMQTE3OF8wID09IDgxICYmIGdldFVub3JkZXJlZEdyb3VwSGVscGVyKCkuY2FuU2VsZWN0KGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YUludGVyY2hhbmdlRmlsZUNTVkFjY2VzcygpLmdldFVub3JkZXJlZEdyb3VwXzMoKSwgMCkgKSB7Ci0gICAgICAgICAgICAgICAgYWx0MTc4PTE7CisgICAgICAgICAgICBpZiAoIExBMTkxXzAgPT0gODYgJiYgZ2V0VW5vcmRlcmVkR3JvdXBIZWxwZXIoKS5jYW5TZWxlY3QoZ3JhbW1hckFjY2Vzcy5nZXREYXRhSW50ZXJjaGFuZ2VGaWxlQ1NWQWNjZXNzKCkuZ2V0VW5vcmRlcmVkR3JvdXBfMygpLCAwKSApIHsKKyAgICAgICAgICAgICAgICBhbHQxOTE9MTsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgaWYgKCBMQTE3OF8wID09IDgyICYmIGdldFVub3JkZXJlZEdyb3VwSGVscGVyKCkuY2FuU2VsZWN0KGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YUludGVyY2hhbmdlRmlsZUNTVkFjY2VzcygpLmdldFVub3JkZXJlZEdyb3VwXzMoKSwgMSkgKSB7Ci0gICAgICAgICAgICAgICAgYWx0MTc4PTE7CisgICAgICAgICAgICBlbHNlIGlmICggTEExOTFfMCA9PSA4NyAmJiBnZXRVbm9yZGVyZWRHcm91cEhlbHBlcigpLmNhblNlbGVjdChncmFtbWFyQWNjZXNzLmdldERhdGFJbnRlcmNoYW5nZUZpbGVDU1ZBY2Nlc3MoKS5nZXRVbm9yZGVyZWRHcm91cF8zKCksIDEpICkgeworICAgICAgICAgICAgICAgIGFsdDE5MT0xOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSBpZiAoIExBMTc4XzAgPT0gODMgJiYgZ2V0VW5vcmRlcmVkR3JvdXBIZWxwZXIoKS5jYW5TZWxlY3QoZ3JhbW1hckFjY2Vzcy5nZXREYXRhSW50ZXJjaGFuZ2VGaWxlQ1NWQWNjZXNzKCkuZ2V0VW5vcmRlcmVkR3JvdXBfMygpLCAyKSApIHsKLSAgICAgICAgICAgICAgICBhbHQxNzg9MTsKKyAgICAgICAgICAgIGVsc2UgaWYgKCBMQTE5MV8wID09IDg4ICYmIGdldFVub3JkZXJlZEdyb3VwSGVscGVyKCkuY2FuU2VsZWN0KGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YUludGVyY2hhbmdlRmlsZUNTVkFjY2VzcygpLmdldFVub3JkZXJlZEdyb3VwXzMoKSwgMikgKSB7CisgICAgICAgICAgICAgICAgYWx0MTkxPTE7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIGlmICggTEExNzhfMCA9PSAxNDIgJiYgZ2V0VW5vcmRlcmVkR3JvdXBIZWxwZXIoKS5jYW5TZWxlY3QoZ3JhbW1hckFjY2Vzcy5nZXREYXRhSW50ZXJjaGFuZ2VGaWxlQ1NWQWNjZXNzKCkuZ2V0VW5vcmRlcmVkR3JvdXBfMygpLCAzKSApIHsKLSAgICAgICAgICAgICAgICBhbHQxNzg9MTsKKyAgICAgICAgICAgIGVsc2UgaWYgKCBMQTE5MV8wID09IDE1MyAmJiBnZXRVbm9yZGVyZWRHcm91cEhlbHBlcigpLmNhblNlbGVjdChncmFtbWFyQWNjZXNzLmdldERhdGFJbnRlcmNoYW5nZUZpbGVDU1ZBY2Nlc3MoKS5nZXRVbm9yZGVyZWRHcm91cF8zKCksIDMpICkgeworICAgICAgICAgICAgICAgIGFsdDE5MT0xOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSBpZiAoIExBMTc4XzAgPT0gNzggJiYgZ2V0VW5vcmRlcmVkR3JvdXBIZWxwZXIoKS5jYW5TZWxlY3QoZ3JhbW1hckFjY2Vzcy5nZXREYXRhSW50ZXJjaGFuZ2VGaWxlQ1NWQWNjZXNzKCkuZ2V0VW5vcmRlcmVkR3JvdXBfMygpLCA0KSApIHsKLSAgICAgICAgICAgICAgICBhbHQxNzg9MTsKKyAgICAgICAgICAgIGVsc2UgaWYgKCBMQTE5MV8wID09IDgzICYmIGdldFVub3JkZXJlZEdyb3VwSGVscGVyKCkuY2FuU2VsZWN0KGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YUludGVyY2hhbmdlRmlsZUNTVkFjY2VzcygpLmdldFVub3JkZXJlZEdyb3VwXzMoKSwgNCkgKSB7CisgICAgICAgICAgICAgICAgYWx0MTkxPTE7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIGlmICggTEExNzhfMCA9PSA3OSAmJiBnZXRVbm9yZGVyZWRHcm91cEhlbHBlcigpLmNhblNlbGVjdChncmFtbWFyQWNjZXNzLmdldERhdGFJbnRlcmNoYW5nZUZpbGVDU1ZBY2Nlc3MoKS5nZXRVbm9yZGVyZWRHcm91cF8zKCksIDUpICkgewotICAgICAgICAgICAgICAgIGFsdDE3OD0xOworICAgICAgICAgICAgZWxzZSBpZiAoIExBMTkxXzAgPT0gODQgJiYgZ2V0VW5vcmRlcmVkR3JvdXBIZWxwZXIoKS5jYW5TZWxlY3QoZ3JhbW1hckFjY2Vzcy5nZXREYXRhSW50ZXJjaGFuZ2VGaWxlQ1NWQWNjZXNzKCkuZ2V0VW5vcmRlcmVkR3JvdXBfMygpLCA1KSApIHsKKyAgICAgICAgICAgICAgICBhbHQxOTE9MTsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHN3aXRjaCAoYWx0MTc4KSB7CisgICAgICAgICAgICBzd2l0Y2ggKGFsdDE5MSkgewogICAgICAgICAgICAgICAgIGNhc2UgMSA6CiAgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjA6MDogcnVsZV9fRGF0YUludGVyY2hhbmdlRmlsZUNTVl9fVW5vcmRlcmVkR3JvdXBfM19fNAogICAgICAgICAgICAgICAgICAgICB7CkBAIC03MjE4Niw0MyArNzY2NDMsNDMgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19EYXRhSW50ZXJjaGFuZ2VGaWxlQ1NWX19Vbm9yZGVyZWRHcm91cF8zX180IgotICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIxOTY5OjE6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbGVDU1ZfX1Vub3JkZXJlZEdyb3VwXzNfXzQgOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VGaWxlQ1NWX19Vbm9yZGVyZWRHcm91cF8zX19JbXBsICggcnVsZV9fRGF0YUludGVyY2hhbmdlRmlsZUNTVl9fVW5vcmRlcmVkR3JvdXBfM19fNSApPyA7CisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjMzMDc6MTogcnVsZV9fRGF0YUludGVyY2hhbmdlRmlsZUNTVl9fVW5vcmRlcmVkR3JvdXBfM19fNCA6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbGVDU1ZfX1Vub3JkZXJlZEdyb3VwXzNfX0ltcGwgKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VGaWxlQ1NWX19Vbm9yZGVyZWRHcm91cF8zX181ICk/IDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19EYXRhSW50ZXJjaGFuZ2VGaWxlQ1NWX19Vbm9yZGVyZWRHcm91cF8zX180KCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIxOTczOjE6ICggcnVsZV9fRGF0YUludGVyY2hhbmdlRmlsZUNTVl9fVW5vcmRlcmVkR3JvdXBfM19fSW1wbCAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbGVDU1ZfX1Vub3JkZXJlZEdyb3VwXzNfXzUgKT8gKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjE5NzQ6MjogcnVsZV9fRGF0YUludGVyY2hhbmdlRmlsZUNTVl9fVW5vcmRlcmVkR3JvdXBfM19fSW1wbCAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbGVDU1ZfX1Vub3JkZXJlZEdyb3VwXzNfXzUgKT8KKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIzMzExOjE6ICggcnVsZV9fRGF0YUludGVyY2hhbmdlRmlsZUNTVl9fVW5vcmRlcmVkR3JvdXBfM19fSW1wbCAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbGVDU1ZfX1Vub3JkZXJlZEdyb3VwXzNfXzUgKT8gKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjMzMTI6MjogcnVsZV9fRGF0YUludGVyY2hhbmdlRmlsZUNTVl9fVW5vcmRlcmVkR3JvdXBfM19fSW1wbCAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbGVDU1ZfX1Vub3JkZXJlZEdyb3VwXzNfXzUgKT8KICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzE1Nik7CisgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV18xNjQpOwogICAgICAgICAgICAgcnVsZV9fRGF0YUludGVyY2hhbmdlRmlsZUNTVl9fVW5vcmRlcmVkR3JvdXBfM19fSW1wbCgpOwogCiAgICAgICAgICAgICBzdGF0ZS5fZnNwLS07CiAgICAgICAgICAgICBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOwotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjE5NzU6MjogKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VGaWxlQ1NWX19Vbm9yZGVyZWRHcm91cF8zX181ICk/Ci0gICAgICAgICAgICBpbnQgYWx0MTc5PTI7Ci0gICAgICAgICAgICBpbnQgTEExNzlfMCA9IGlucHV0LkxBKDEpOworICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjMzMTM6MjogKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VGaWxlQ1NWX19Vbm9yZGVyZWRHcm91cF8zX181ICk/CisgICAgICAgICAgICBpbnQgYWx0MTkyPTI7CisgICAgICAgICAgICBpbnQgTEExOTJfMCA9IGlucHV0LkxBKDEpOwogCi0gICAgICAgICAgICBpZiAoIExBMTc5XzAgPT0gODEgJiYgZ2V0VW5vcmRlcmVkR3JvdXBIZWxwZXIoKS5jYW5TZWxlY3QoZ3JhbW1hckFjY2Vzcy5nZXREYXRhSW50ZXJjaGFuZ2VGaWxlQ1NWQWNjZXNzKCkuZ2V0VW5vcmRlcmVkR3JvdXBfMygpLCAwKSApIHsKLSAgICAgICAgICAgICAgICBhbHQxNzk9MTsKKyAgICAgICAgICAgIGlmICggTEExOTJfMCA9PSA4NiAmJiBnZXRVbm9yZGVyZWRHcm91cEhlbHBlcigpLmNhblNlbGVjdChncmFtbWFyQWNjZXNzLmdldERhdGFJbnRlcmNoYW5nZUZpbGVDU1ZBY2Nlc3MoKS5nZXRVbm9yZGVyZWRHcm91cF8zKCksIDApICkgeworICAgICAgICAgICAgICAgIGFsdDE5Mj0xOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSBpZiAoIExBMTc5XzAgPT0gODIgJiYgZ2V0VW5vcmRlcmVkR3JvdXBIZWxwZXIoKS5jYW5TZWxlY3QoZ3JhbW1hckFjY2Vzcy5nZXREYXRhSW50ZXJjaGFuZ2VGaWxlQ1NWQWNjZXNzKCkuZ2V0VW5vcmRlcmVkR3JvdXBfMygpLCAxKSApIHsKLSAgICAgICAgICAgICAgICBhbHQxNzk9MTsKKyAgICAgICAgICAgIGVsc2UgaWYgKCBMQTE5Ml8wID09IDg3ICYmIGdldFVub3JkZXJlZEdyb3VwSGVscGVyKCkuY2FuU2VsZWN0KGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YUludGVyY2hhbmdlRmlsZUNTVkFjY2VzcygpLmdldFVub3JkZXJlZEdyb3VwXzMoKSwgMSkgKSB7CisgICAgICAgICAgICAgICAgYWx0MTkyPTE7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIGlmICggTEExNzlfMCA9PSA4MyAmJiBnZXRVbm9yZGVyZWRHcm91cEhlbHBlcigpLmNhblNlbGVjdChncmFtbWFyQWNjZXNzLmdldERhdGFJbnRlcmNoYW5nZUZpbGVDU1ZBY2Nlc3MoKS5nZXRVbm9yZGVyZWRHcm91cF8zKCksIDIpICkgewotICAgICAgICAgICAgICAgIGFsdDE3OT0xOworICAgICAgICAgICAgZWxzZSBpZiAoIExBMTkyXzAgPT0gODggJiYgZ2V0VW5vcmRlcmVkR3JvdXBIZWxwZXIoKS5jYW5TZWxlY3QoZ3JhbW1hckFjY2Vzcy5nZXREYXRhSW50ZXJjaGFuZ2VGaWxlQ1NWQWNjZXNzKCkuZ2V0VW5vcmRlcmVkR3JvdXBfMygpLCAyKSApIHsKKyAgICAgICAgICAgICAgICBhbHQxOTI9MTsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgaWYgKCBMQTE3OV8wID09IDE0MiAmJiBnZXRVbm9yZGVyZWRHcm91cEhlbHBlcigpLmNhblNlbGVjdChncmFtbWFyQWNjZXNzLmdldERhdGFJbnRlcmNoYW5nZUZpbGVDU1ZBY2Nlc3MoKS5nZXRVbm9yZGVyZWRHcm91cF8zKCksIDMpICkgewotICAgICAgICAgICAgICAgIGFsdDE3OT0xOworICAgICAgICAgICAgZWxzZSBpZiAoIExBMTkyXzAgPT0gMTUzICYmIGdldFVub3JkZXJlZEdyb3VwSGVscGVyKCkuY2FuU2VsZWN0KGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YUludGVyY2hhbmdlRmlsZUNTVkFjY2VzcygpLmdldFVub3JkZXJlZEdyb3VwXzMoKSwgMykgKSB7CisgICAgICAgICAgICAgICAgYWx0MTkyPTE7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIGlmICggTEExNzlfMCA9PSA3OCAmJiBnZXRVbm9yZGVyZWRHcm91cEhlbHBlcigpLmNhblNlbGVjdChncmFtbWFyQWNjZXNzLmdldERhdGFJbnRlcmNoYW5nZUZpbGVDU1ZBY2Nlc3MoKS5nZXRVbm9yZGVyZWRHcm91cF8zKCksIDQpICkgewotICAgICAgICAgICAgICAgIGFsdDE3OT0xOworICAgICAgICAgICAgZWxzZSBpZiAoIExBMTkyXzAgPT0gODMgJiYgZ2V0VW5vcmRlcmVkR3JvdXBIZWxwZXIoKS5jYW5TZWxlY3QoZ3JhbW1hckFjY2Vzcy5nZXREYXRhSW50ZXJjaGFuZ2VGaWxlQ1NWQWNjZXNzKCkuZ2V0VW5vcmRlcmVkR3JvdXBfMygpLCA0KSApIHsKKyAgICAgICAgICAgICAgICBhbHQxOTI9MTsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgaWYgKCBMQTE3OV8wID09IDc5ICYmIGdldFVub3JkZXJlZEdyb3VwSGVscGVyKCkuY2FuU2VsZWN0KGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YUludGVyY2hhbmdlRmlsZUNTVkFjY2VzcygpLmdldFVub3JkZXJlZEdyb3VwXzMoKSwgNSkgKSB7Ci0gICAgICAgICAgICAgICAgYWx0MTc5PTE7CisgICAgICAgICAgICBlbHNlIGlmICggTEExOTJfMCA9PSA4NCAmJiBnZXRVbm9yZGVyZWRHcm91cEhlbHBlcigpLmNhblNlbGVjdChncmFtbWFyQWNjZXNzLmdldERhdGFJbnRlcmNoYW5nZUZpbGVDU1ZBY2Nlc3MoKS5nZXRVbm9yZGVyZWRHcm91cF8zKCksIDUpICkgeworICAgICAgICAgICAgICAgIGFsdDE5Mj0xOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgc3dpdGNoIChhbHQxNzkpIHsKKyAgICAgICAgICAgIHN3aXRjaCAoYWx0MTkyKSB7CiAgICAgICAgICAgICAgICAgY2FzZSAxIDoKICAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MDowOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VGaWxlQ1NWX19Vbm9yZGVyZWRHcm91cF8zX181CiAgICAgICAgICAgICAgICAgICAgIHsKQEAgLTcyMjU2LDE0ICs3NjcxMywxNCBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbGVDU1ZfX1Vub3JkZXJlZEdyb3VwXzNfXzUiCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjE5ODE6MTogcnVsZV9fRGF0YUludGVyY2hhbmdlRmlsZUNTVl9fVW5vcmRlcmVkR3JvdXBfM19fNSA6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbGVDU1ZfX1Vub3JkZXJlZEdyb3VwXzNfX0ltcGwgOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIzMzE5OjE6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbGVDU1ZfX1Vub3JkZXJlZEdyb3VwXzNfXzUgOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VGaWxlQ1NWX19Vbm9yZGVyZWRHcm91cF8zX19JbXBsIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19EYXRhSW50ZXJjaGFuZ2VGaWxlQ1NWX19Vbm9yZGVyZWRHcm91cF8zX181KCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIxOTg1OjE6ICggcnVsZV9fRGF0YUludGVyY2hhbmdlRmlsZUNTVl9fVW5vcmRlcmVkR3JvdXBfM19fSW1wbCApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMTk4NjoyOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VGaWxlQ1NWX19Vbm9yZGVyZWRHcm91cF8zX19JbXBsCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMzMyMzoxOiAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbGVDU1ZfX1Vub3JkZXJlZEdyb3VwXzNfX0ltcGwgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjMzMjQ6MjogcnVsZV9fRGF0YUludGVyY2hhbmdlRmlsZUNTVl9fVW5vcmRlcmVkR3JvdXBfM19fSW1wbAogICAgICAgICAgICAgewogICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMik7CiAgICAgICAgICAgICBydWxlX19EYXRhSW50ZXJjaGFuZ2VGaWxlQ1NWX19Vbm9yZGVyZWRHcm91cF8zX19JbXBsKCk7CkBAIC03MjI4OSwyNyArNzY3NDYsMjcgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19EYXRhSW50ZXJjaGFuZ2VGaWxlRURJX19Vbm9yZGVyZWRHcm91cF8zIgotICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIxOTkzOjE6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbGVFRElfX1Vub3JkZXJlZEdyb3VwXzMgOiAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbGVFRElfX1Vub3JkZXJlZEdyb3VwXzNfXzAgKT8gOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIzMzMxOjE6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbGVFRElfX1Vub3JkZXJlZEdyb3VwXzMgOiAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbGVFRElfX1Vub3JkZXJlZEdyb3VwXzNfXzAgKT8gOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbGVFRElfX1Vub3JkZXJlZEdyb3VwXzMoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQlnZXRVbm9yZGVyZWRHcm91cEhlbHBlcigpLmVudGVyKGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YUludGVyY2hhbmdlRmlsZUVESUFjY2VzcygpLmdldFVub3JkZXJlZEdyb3VwXzMoKSk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIxOTk4OjE6ICggKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VGaWxlRURJX19Vbm9yZGVyZWRHcm91cF8zX18wICk/ICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIxOTk5OjI6ICggcnVsZV9fRGF0YUludGVyY2hhbmdlRmlsZUVESV9fVW5vcmRlcmVkR3JvdXBfM19fMCApPworICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjMzMzY6MTogKCAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbGVFRElfX1Vub3JkZXJlZEdyb3VwXzNfXzAgKT8gKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjMzMzc6MjogKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VGaWxlRURJX19Vbm9yZGVyZWRHcm91cF8zX18wICk/CiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMTk5OToyOiAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbGVFRElfX1Vub3JkZXJlZEdyb3VwXzNfXzAgKT8KLSAgICAgICAgICAgIGludCBhbHQxODA9MjsKLSAgICAgICAgICAgIGludCBMQTE4MF8wID0gaW5wdXQuTEEoMSk7CisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMzMzNzoyOiAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbGVFRElfX1Vub3JkZXJlZEdyb3VwXzNfXzAgKT8KKyAgICAgICAgICAgIGludCBhbHQxOTM9MjsKKyAgICAgICAgICAgIGludCBMQTE5M18wID0gaW5wdXQuTEEoMSk7CiAKLSAgICAgICAgICAgIGlmICggTEExODBfMCA9PSA3OCAmJiBnZXRVbm9yZGVyZWRHcm91cEhlbHBlcigpLmNhblNlbGVjdChncmFtbWFyQWNjZXNzLmdldERhdGFJbnRlcmNoYW5nZUZpbGVFRElBY2Nlc3MoKS5nZXRVbm9yZGVyZWRHcm91cF8zKCksIDApICkgewotICAgICAgICAgICAgICAgIGFsdDE4MD0xOworICAgICAgICAgICAgaWYgKCBMQTE5M18wID09IDgzICYmIGdldFVub3JkZXJlZEdyb3VwSGVscGVyKCkuY2FuU2VsZWN0KGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YUludGVyY2hhbmdlRmlsZUVESUFjY2VzcygpLmdldFVub3JkZXJlZEdyb3VwXzMoKSwgMCkgKSB7CisgICAgICAgICAgICAgICAgYWx0MTkzPTE7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIGlmICggTEExODBfMCA9PSA3OSAmJiBnZXRVbm9yZGVyZWRHcm91cEhlbHBlcigpLmNhblNlbGVjdChncmFtbWFyQWNjZXNzLmdldERhdGFJbnRlcmNoYW5nZUZpbGVFRElBY2Nlc3MoKS5nZXRVbm9yZGVyZWRHcm91cF8zKCksIDEpICkgewotICAgICAgICAgICAgICAgIGFsdDE4MD0xOworICAgICAgICAgICAgZWxzZSBpZiAoIExBMTkzXzAgPT0gODQgJiYgZ2V0VW5vcmRlcmVkR3JvdXBIZWxwZXIoKS5jYW5TZWxlY3QoZ3JhbW1hckFjY2Vzcy5nZXREYXRhSW50ZXJjaGFuZ2VGaWxlRURJQWNjZXNzKCkuZ2V0VW5vcmRlcmVkR3JvdXBfMygpLCAxKSApIHsKKyAgICAgICAgICAgICAgICBhbHQxOTM9MTsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHN3aXRjaCAoYWx0MTgwKSB7CisgICAgICAgICAgICBzd2l0Y2ggKGFsdDE5MykgewogICAgICAgICAgICAgICAgIGNhc2UgMSA6CiAgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjA6MDogcnVsZV9fRGF0YUludGVyY2hhbmdlRmlsZUVESV9fVW5vcmRlcmVkR3JvdXBfM19fMAogICAgICAgICAgICAgICAgICAgICB7CkBAIC03MjM0NCw1NyArNzY4MDEsNTcgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19EYXRhSW50ZXJjaGFuZ2VGaWxlRURJX19Vbm9yZGVyZWRHcm91cF8zX19JbXBsIgotICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIyMDA3OjE6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbGVFRElfX1Vub3JkZXJlZEdyb3VwXzNfX0ltcGwgOiAoICh7Li4ufT8gPT4gKCAoICggcnVsZV9fRGF0YUludGVyY2hhbmdlRmlsZUVESV9fR3JvdXBfM18wX18wICkgKSApICkgfCAoey4uLn0/ID0+ICggKCAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbGVFRElfX0dyb3VwXzNfMV9fMCApICkgKSApICkgOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIzMzQ1OjE6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbGVFRElfX1Vub3JkZXJlZEdyb3VwXzNfX0ltcGwgOiAoICh7Li4ufT8gPT4gKCAoICggcnVsZV9fRGF0YUludGVyY2hhbmdlRmlsZUVESV9fR3JvdXBfM18wX18wICkgKSApICkgfCAoey4uLn0/ID0+ICggKCAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbGVFRElfX0dyb3VwXzNfMV9fMCApICkgKSApICkgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbGVFRElfX1Vub3JkZXJlZEdyb3VwXzNfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQlib29sZWFuIHNlbGVjdGVkID0gZmFsc2U7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIyMDEyOjE6ICggKCAoey4uLn0/ID0+ICggKCAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbGVFRElfX0dyb3VwXzNfMF9fMCApICkgKSApIHwgKHsuLi59PyA9PiAoICggKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VGaWxlRURJX19Hcm91cF8zXzFfXzAgKSApICkgKSApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIyMDEzOjM6ICggKHsuLi59PyA9PiAoICggKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VGaWxlRURJX19Hcm91cF8zXzBfXzAgKSApICkgKSB8ICh7Li4ufT8gPT4gKCAoICggcnVsZV9fRGF0YUludGVyY2hhbmdlRmlsZUVESV9fR3JvdXBfM18xX18wICkgKSApICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjMzNTA6MTogKCAoICh7Li4ufT8gPT4gKCAoICggcnVsZV9fRGF0YUludGVyY2hhbmdlRmlsZUVESV9fR3JvdXBfM18wX18wICkgKSApICkgfCAoey4uLn0/ID0+ICggKCAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbGVFRElfX0dyb3VwXzNfMV9fMCApICkgKSApICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjMzNTE6MzogKCAoey4uLn0/ID0+ICggKCAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbGVFRElfX0dyb3VwXzNfMF9fMCApICkgKSApIHwgKHsuLi59PyA9PiAoICggKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VGaWxlRURJX19Hcm91cF8zXzFfXzAgKSApICkgKSApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMjAxMzozOiAoICh7Li4ufT8gPT4gKCAoICggcnVsZV9fRGF0YUludGVyY2hhbmdlRmlsZUVESV9fR3JvdXBfM18wX18wICkgKSApICkgfCAoey4uLn0/ID0+ICggKCAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbGVFRElfX0dyb3VwXzNfMV9fMCApICkgKSApICkKLSAgICAgICAgICAgIGludCBhbHQxODE9MjsKLSAgICAgICAgICAgIGludCBMQTE4MV8wID0gaW5wdXQuTEEoMSk7CisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMzM1MTozOiAoICh7Li4ufT8gPT4gKCAoICggcnVsZV9fRGF0YUludGVyY2hhbmdlRmlsZUVESV9fR3JvdXBfM18wX18wICkgKSApICkgfCAoey4uLn0/ID0+ICggKCAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbGVFRElfX0dyb3VwXzNfMV9fMCApICkgKSApICkKKyAgICAgICAgICAgIGludCBhbHQxOTQ9MjsKKyAgICAgICAgICAgIGludCBMQTE5NF8wID0gaW5wdXQuTEEoMSk7CiAKLSAgICAgICAgICAgIGlmICggTEExODFfMCA9PSA3OCAmJiBnZXRVbm9yZGVyZWRHcm91cEhlbHBlcigpLmNhblNlbGVjdChncmFtbWFyQWNjZXNzLmdldERhdGFJbnRlcmNoYW5nZUZpbGVFRElBY2Nlc3MoKS5nZXRVbm9yZGVyZWRHcm91cF8zKCksIDApICkgewotICAgICAgICAgICAgICAgIGFsdDE4MT0xOworICAgICAgICAgICAgaWYgKCBMQTE5NF8wID09IDgzICYmIGdldFVub3JkZXJlZEdyb3VwSGVscGVyKCkuY2FuU2VsZWN0KGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YUludGVyY2hhbmdlRmlsZUVESUFjY2VzcygpLmdldFVub3JkZXJlZEdyb3VwXzMoKSwgMCkgKSB7CisgICAgICAgICAgICAgICAgYWx0MTk0PTE7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIGlmICggTEExODFfMCA9PSA3OSAmJiBnZXRVbm9yZGVyZWRHcm91cEhlbHBlcigpLmNhblNlbGVjdChncmFtbWFyQWNjZXNzLmdldERhdGFJbnRlcmNoYW5nZUZpbGVFRElBY2Nlc3MoKS5nZXRVbm9yZGVyZWRHcm91cF8zKCksIDEpICkgewotICAgICAgICAgICAgICAgIGFsdDE4MT0yOworICAgICAgICAgICAgZWxzZSBpZiAoIExBMTk0XzAgPT0gODQgJiYgZ2V0VW5vcmRlcmVkR3JvdXBIZWxwZXIoKS5jYW5TZWxlY3QoZ3JhbW1hckFjY2Vzcy5nZXREYXRhSW50ZXJjaGFuZ2VGaWxlRURJQWNjZXNzKCkuZ2V0VW5vcmRlcmVkR3JvdXBfMygpLCAxKSApIHsKKyAgICAgICAgICAgICAgICBhbHQxOTQ9MjsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgIGlmIChzdGF0ZS5iYWNrdHJhY2tpbmc+MCkge3N0YXRlLmZhaWxlZD10cnVlOyByZXR1cm4gO30KICAgICAgICAgICAgICAgICBOb1ZpYWJsZUFsdEV4Y2VwdGlvbiBudmFlID0KLSAgICAgICAgICAgICAgICAgICAgbmV3IE5vVmlhYmxlQWx0RXhjZXB0aW9uKCIiLCAxODEsIDAsIGlucHV0KTsKKyAgICAgICAgICAgICAgICAgICAgbmV3IE5vVmlhYmxlQWx0RXhjZXB0aW9uKCIiLCAxOTQsIDAsIGlucHV0KTsKIAogICAgICAgICAgICAgICAgIHRocm93IG52YWU7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBzd2l0Y2ggKGFsdDE4MSkgeworICAgICAgICAgICAgc3dpdGNoIChhbHQxOTQpIHsKICAgICAgICAgICAgICAgICBjYXNlIDEgOgotICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMjAxNDozOiAoey4uLn0/ID0+ICggKCAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbGVFRElfX0dyb3VwXzNfMF9fMCApICkgKSApCisgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIzMzUyOjM6ICh7Li4ufT8gPT4gKCAoICggcnVsZV9fRGF0YUludGVyY2hhbmdlRmlsZUVESV9fR3JvdXBfM18wX18wICkgKSApICkKICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMjAxNDozOiAoey4uLn0/ID0+ICggKCAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbGVFRElfX0dyb3VwXzNfMF9fMCApICkgKSApCi0gICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIyMDE1OjQ6IHsuLi59PyA9PiAoICggKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VGaWxlRURJX19Hcm91cF8zXzBfXzAgKSApICkKKyAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjMzNTI6MzogKHsuLi59PyA9PiAoICggKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VGaWxlRURJX19Hcm91cF8zXzBfXzAgKSApICkgKQorICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMzM1Mzo0OiB7Li4ufT8gPT4gKCAoICggcnVsZV9fRGF0YUludGVyY2hhbmdlRmlsZUVESV9fR3JvdXBfM18wX18wICkgKSApCiAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgaWYgKCAhIGdldFVub3JkZXJlZEdyb3VwSGVscGVyKCkuY2FuU2VsZWN0KGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YUludGVyY2hhbmdlRmlsZUVESUFjY2VzcygpLmdldFVub3JkZXJlZEdyb3VwXzMoKSwgMCkgKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3RhdGUuYmFja3RyYWNraW5nPjApIHtzdGF0ZS5mYWlsZWQ9dHJ1ZTsgcmV0dXJuIDt9CiAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRmFpbGVkUHJlZGljYXRlRXhjZXB0aW9uKGlucHV0LCAicnVsZV9fRGF0YUludGVyY2hhbmdlRmlsZUVESV9fVW5vcmRlcmVkR3JvdXBfM19fSW1wbCIsICJnZXRVbm9yZGVyZWRHcm91cEhlbHBlcigpLmNhblNlbGVjdChncmFtbWFyQWNjZXNzLmdldERhdGFJbnRlcmNoYW5nZUZpbGVFRElBY2Nlc3MoKS5nZXRVbm9yZGVyZWRHcm91cF8zKCksIDApIik7CiAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjIwMTU6MTE4OiAoICggKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VGaWxlRURJX19Hcm91cF8zXzBfXzAgKSApICkKLSAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjIwMTY6NTogKCAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbGVFRElfX0dyb3VwXzNfMF9fMCApICkKKyAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjMzNTM6MTE4OiAoICggKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VGaWxlRURJX19Hcm91cF8zXzBfXzAgKSApICkKKyAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjMzNTQ6NTogKCAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbGVFRElfX0dyb3VwXzNfMF9fMCApICkKICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICBnZXRVbm9yZGVyZWRHcm91cEhlbHBlcigpLnNlbGVjdChncmFtbWFyQWNjZXNzLmdldERhdGFJbnRlcmNoYW5nZUZpbGVFRElBY2Nlc3MoKS5nZXRVbm9yZGVyZWRHcm91cF8zKCksIDApOwogICAgICAgICAgICAgICAgICAgICBzZWxlY3RlZCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIyMDIyOjU6ICggKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VGaWxlRURJX19Hcm91cF8zXzBfXzAgKSApCi0gICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIyMDIzOjY6ICggcnVsZV9fRGF0YUludGVyY2hhbmdlRmlsZUVESV9fR3JvdXBfM18wX18wICkKKyAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjMzNjA6NTogKCAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbGVFRElfX0dyb3VwXzNfMF9fMCApICkKKyAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjMzNjE6NjogKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VGaWxlRURJX19Hcm91cF8zXzBfXzAgKQogICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXREYXRhSW50ZXJjaGFuZ2VGaWxlRURJQWNjZXNzKCkuZ2V0R3JvdXBfM18wKCkpOyAKICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMjAyNDo2OiAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbGVFRElfX0dyb3VwXzNfMF9fMCApCi0gICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIyMDI0Ojc6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbGVFRElfX0dyb3VwXzNfMF9fMAorICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMzM2Mjo2OiAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbGVFRElfX0dyb3VwXzNfMF9fMCApCisgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIzMzYyOjc6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbGVFRElfX0dyb3VwXzNfMF9fMAogICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzIpOwogICAgICAgICAgICAgICAgICAgICBydWxlX19EYXRhSW50ZXJjaGFuZ2VGaWxlRURJX19Hcm91cF8zXzBfXzAoKTsKQEAgLTcyNDIwLDI4ICs3Njg3NywyOCBAQAogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgIGNhc2UgMiA6Ci0gICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIyMDI5OjM6ICh7Li4ufT8gPT4gKCAoICggcnVsZV9fRGF0YUludGVyY2hhbmdlRmlsZUVESV9fR3JvdXBfM18xX18wICkgKSApICkKKyAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjMzNjc6MzogKHsuLi59PyA9PiAoICggKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VGaWxlRURJX19Hcm91cF8zXzFfXzAgKSApICkgKQogICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIyMDI5OjM6ICh7Li4ufT8gPT4gKCAoICggcnVsZV9fRGF0YUludGVyY2hhbmdlRmlsZUVESV9fR3JvdXBfM18xX18wICkgKSApICkKLSAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjIwMzA6NDogey4uLn0/ID0+ICggKCAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbGVFRElfX0dyb3VwXzNfMV9fMCApICkgKQorICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMzM2NzozOiAoey4uLn0/ID0+ICggKCAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbGVFRElfX0dyb3VwXzNfMV9fMCApICkgKSApCisgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIzMzY4OjQ6IHsuLi59PyA9PiAoICggKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VGaWxlRURJX19Hcm91cF8zXzFfXzAgKSApICkKICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICBpZiAoICEgZ2V0VW5vcmRlcmVkR3JvdXBIZWxwZXIoKS5jYW5TZWxlY3QoZ3JhbW1hckFjY2Vzcy5nZXREYXRhSW50ZXJjaGFuZ2VGaWxlRURJQWNjZXNzKCkuZ2V0VW5vcmRlcmVkR3JvdXBfMygpLCAxKSApIHsKICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdGF0ZS5iYWNrdHJhY2tpbmc+MCkge3N0YXRlLmZhaWxlZD10cnVlOyByZXR1cm4gO30KICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBGYWlsZWRQcmVkaWNhdGVFeGNlcHRpb24oaW5wdXQsICJydWxlX19EYXRhSW50ZXJjaGFuZ2VGaWxlRURJX19Vbm9yZGVyZWRHcm91cF8zX19JbXBsIiwgImdldFVub3JkZXJlZEdyb3VwSGVscGVyKCkuY2FuU2VsZWN0KGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YUludGVyY2hhbmdlRmlsZUVESUFjY2VzcygpLmdldFVub3JkZXJlZEdyb3VwXzMoKSwgMSkiKTsKICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMjAzMDoxMTg6ICggKCAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbGVFRElfX0dyb3VwXzNfMV9fMCApICkgKQotICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMjAzMTo1OiAoICggcnVsZV9fRGF0YUludGVyY2hhbmdlRmlsZUVESV9fR3JvdXBfM18xX18wICkgKQorICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMzM2ODoxMTg6ICggKCAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbGVFRElfX0dyb3VwXzNfMV9fMCApICkgKQorICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMzM2OTo1OiAoICggcnVsZV9fRGF0YUludGVyY2hhbmdlRmlsZUVESV9fR3JvdXBfM18xX18wICkgKQogICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgIGdldFVub3JkZXJlZEdyb3VwSGVscGVyKCkuc2VsZWN0KGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YUludGVyY2hhbmdlRmlsZUVESUFjY2VzcygpLmdldFVub3JkZXJlZEdyb3VwXzMoKSwgMSk7CiAgICAgICAgICAgICAgICAgICAgIHNlbGVjdGVkID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjIwMzc6NTogKCAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbGVFRElfX0dyb3VwXzNfMV9fMCApICkKLSAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjIwMzg6NjogKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VGaWxlRURJX19Hcm91cF8zXzFfXzAgKQorICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMzM3NTo1OiAoICggcnVsZV9fRGF0YUludGVyY2hhbmdlRmlsZUVESV9fR3JvdXBfM18xX18wICkgKQorICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMzM3Njo2OiAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbGVFRElfX0dyb3VwXzNfMV9fMCApCiAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldERhdGFJbnRlcmNoYW5nZUZpbGVFRElBY2Nlc3MoKS5nZXRHcm91cF8zXzEoKSk7IAogICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIyMDM5OjY6ICggcnVsZV9fRGF0YUludGVyY2hhbmdlRmlsZUVESV9fR3JvdXBfM18xX18wICkKLSAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjIwMzk6NzogcnVsZV9fRGF0YUludGVyY2hhbmdlRmlsZUVESV9fR3JvdXBfM18xX18wCisgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIzMzc3OjY6ICggcnVsZV9fRGF0YUludGVyY2hhbmdlRmlsZUVESV9fR3JvdXBfM18xX18wICkKKyAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjMzNzc6NzogcnVsZV9fRGF0YUludGVyY2hhbmdlRmlsZUVESV9fR3JvdXBfM18xX18wCiAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMik7CiAgICAgICAgICAgICAgICAgICAgIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbGVFRElfX0dyb3VwXzNfMV9fMCgpOwpAQCAtNzI0OTAsMzEgKzc2OTQ3LDMxIEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fRGF0YUludGVyY2hhbmdlRmlsZUVESV9fVW5vcmRlcmVkR3JvdXBfM19fMCIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMjA1MjoxOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VGaWxlRURJX19Vbm9yZGVyZWRHcm91cF8zX18wIDogcnVsZV9fRGF0YUludGVyY2hhbmdlRmlsZUVESV9fVW5vcmRlcmVkR3JvdXBfM19fSW1wbCAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbGVFRElfX1Vub3JkZXJlZEdyb3VwXzNfXzEgKT8gOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIzMzkwOjE6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbGVFRElfX1Vub3JkZXJlZEdyb3VwXzNfXzAgOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VGaWxlRURJX19Vbm9yZGVyZWRHcm91cF8zX19JbXBsICggcnVsZV9fRGF0YUludGVyY2hhbmdlRmlsZUVESV9fVW5vcmRlcmVkR3JvdXBfM19fMSApPyA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fRGF0YUludGVyY2hhbmdlRmlsZUVESV9fVW5vcmRlcmVkR3JvdXBfM19fMCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMjA1NjoxOiAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbGVFRElfX1Vub3JkZXJlZEdyb3VwXzNfX0ltcGwgKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VGaWxlRURJX19Vbm9yZGVyZWRHcm91cF8zX18xICk/ICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIyMDU3OjI6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbGVFRElfX1Vub3JkZXJlZEdyb3VwXzNfX0ltcGwgKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VGaWxlRURJX19Vbm9yZGVyZWRHcm91cF8zX18xICk/CisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMzM5NDoxOiAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbGVFRElfX1Vub3JkZXJlZEdyb3VwXzNfX0ltcGwgKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VGaWxlRURJX19Vbm9yZGVyZWRHcm91cF8zX18xICk/ICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIzMzk1OjI6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbGVFRElfX1Vub3JkZXJlZEdyb3VwXzNfX0ltcGwgKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VGaWxlRURJX19Vbm9yZGVyZWRHcm91cF8zX18xICk/CiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV18xNTcpOworICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMTY1KTsKICAgICAgICAgICAgIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbGVFRElfX1Vub3JkZXJlZEdyb3VwXzNfX0ltcGwoKTsKIAogICAgICAgICAgICAgc3RhdGUuX2ZzcC0tOwogICAgICAgICAgICAgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIyMDU4OjI6ICggcnVsZV9fRGF0YUludGVyY2hhbmdlRmlsZUVESV9fVW5vcmRlcmVkR3JvdXBfM19fMSApPwotICAgICAgICAgICAgaW50IGFsdDE4Mj0yOwotICAgICAgICAgICAgaW50IExBMTgyXzAgPSBpbnB1dC5MQSgxKTsKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIzMzk2OjI6ICggcnVsZV9fRGF0YUludGVyY2hhbmdlRmlsZUVESV9fVW5vcmRlcmVkR3JvdXBfM19fMSApPworICAgICAgICAgICAgaW50IGFsdDE5NT0yOworICAgICAgICAgICAgaW50IExBMTk1XzAgPSBpbnB1dC5MQSgxKTsKIAotICAgICAgICAgICAgaWYgKCBMQTE4Ml8wID09IDc4ICYmIGdldFVub3JkZXJlZEdyb3VwSGVscGVyKCkuY2FuU2VsZWN0KGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YUludGVyY2hhbmdlRmlsZUVESUFjY2VzcygpLmdldFVub3JkZXJlZEdyb3VwXzMoKSwgMCkgKSB7Ci0gICAgICAgICAgICAgICAgYWx0MTgyPTE7CisgICAgICAgICAgICBpZiAoIExBMTk1XzAgPT0gODMgJiYgZ2V0VW5vcmRlcmVkR3JvdXBIZWxwZXIoKS5jYW5TZWxlY3QoZ3JhbW1hckFjY2Vzcy5nZXREYXRhSW50ZXJjaGFuZ2VGaWxlRURJQWNjZXNzKCkuZ2V0VW5vcmRlcmVkR3JvdXBfMygpLCAwKSApIHsKKyAgICAgICAgICAgICAgICBhbHQxOTU9MTsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgaWYgKCBMQTE4Ml8wID09IDc5ICYmIGdldFVub3JkZXJlZEdyb3VwSGVscGVyKCkuY2FuU2VsZWN0KGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YUludGVyY2hhbmdlRmlsZUVESUFjY2VzcygpLmdldFVub3JkZXJlZEdyb3VwXzMoKSwgMSkgKSB7Ci0gICAgICAgICAgICAgICAgYWx0MTgyPTE7CisgICAgICAgICAgICBlbHNlIGlmICggTEExOTVfMCA9PSA4NCAmJiBnZXRVbm9yZGVyZWRHcm91cEhlbHBlcigpLmNhblNlbGVjdChncmFtbWFyQWNjZXNzLmdldERhdGFJbnRlcmNoYW5nZUZpbGVFRElBY2Nlc3MoKS5nZXRVbm9yZGVyZWRHcm91cF8zKCksIDEpICkgeworICAgICAgICAgICAgICAgIGFsdDE5NT0xOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgc3dpdGNoIChhbHQxODIpIHsKKyAgICAgICAgICAgIHN3aXRjaCAoYWx0MTk1KSB7CiAgICAgICAgICAgICAgICAgY2FzZSAxIDoKICAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MDowOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VGaWxlRURJX19Vbm9yZGVyZWRHcm91cF8zX18xCiAgICAgICAgICAgICAgICAgICAgIHsKQEAgLTcyNTQ4LDE0ICs3NzAwNSwxNCBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbGVFRElfX1Vub3JkZXJlZEdyb3VwXzNfXzEiCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjIwNjQ6MTogcnVsZV9fRGF0YUludGVyY2hhbmdlRmlsZUVESV9fVW5vcmRlcmVkR3JvdXBfM19fMSA6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbGVFRElfX1Vub3JkZXJlZEdyb3VwXzNfX0ltcGwgOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIzNDAyOjE6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbGVFRElfX1Vub3JkZXJlZEdyb3VwXzNfXzEgOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VGaWxlRURJX19Vbm9yZGVyZWRHcm91cF8zX19JbXBsIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19EYXRhSW50ZXJjaGFuZ2VGaWxlRURJX19Vbm9yZGVyZWRHcm91cF8zX18xKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIyMDY4OjE6ICggcnVsZV9fRGF0YUludGVyY2hhbmdlRmlsZUVESV9fVW5vcmRlcmVkR3JvdXBfM19fSW1wbCApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMjA2OToyOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VGaWxlRURJX19Vbm9yZGVyZWRHcm91cF8zX19JbXBsCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMzQwNjoxOiAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbGVFRElfX1Vub3JkZXJlZEdyb3VwXzNfX0ltcGwgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjM0MDc6MjogcnVsZV9fRGF0YUludGVyY2hhbmdlRmlsZUVESV9fVW5vcmRlcmVkR3JvdXBfM19fSW1wbAogICAgICAgICAgICAgewogICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMik7CiAgICAgICAgICAgICBydWxlX19EYXRhSW50ZXJjaGFuZ2VGaWxlRURJX19Vbm9yZGVyZWRHcm91cF8zX19JbXBsKCk7CkBAIC03MjU4MSwzMCArNzcwMzgsMzAgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19EYXRhSW50ZXJjaGFuZ2VMb29rdXBfX1Vub3JkZXJlZEdyb3VwXzEwIgotICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIyMDc2OjE6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUxvb2t1cF9fVW5vcmRlcmVkR3JvdXBfMTAgOiAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUxvb2t1cF9fVW5vcmRlcmVkR3JvdXBfMTBfXzAgKT8gOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIzNDE0OjE6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUxvb2t1cF9fVW5vcmRlcmVkR3JvdXBfMTAgOiAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUxvb2t1cF9fVW5vcmRlcmVkR3JvdXBfMTBfXzAgKT8gOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUxvb2t1cF9fVW5vcmRlcmVkR3JvdXBfMTAoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQlnZXRVbm9yZGVyZWRHcm91cEhlbHBlcigpLmVudGVyKGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YUludGVyY2hhbmdlTG9va3VwQWNjZXNzKCkuZ2V0VW5vcmRlcmVkR3JvdXBfMTAoKSk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIyMDgxOjE6ICggKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VMb29rdXBfX1Vub3JkZXJlZEdyb3VwXzEwX18wICk/ICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIyMDgyOjI6ICggcnVsZV9fRGF0YUludGVyY2hhbmdlTG9va3VwX19Vbm9yZGVyZWRHcm91cF8xMF9fMCApPworICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjM0MTk6MTogKCAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUxvb2t1cF9fVW5vcmRlcmVkR3JvdXBfMTBfXzAgKT8gKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjM0MjA6MjogKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VMb29rdXBfX1Vub3JkZXJlZEdyb3VwXzEwX18wICk/CiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMjA4MjoyOiAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUxvb2t1cF9fVW5vcmRlcmVkR3JvdXBfMTBfXzAgKT8KLSAgICAgICAgICAgIGludCBhbHQxODM9MjsKLSAgICAgICAgICAgIGludCBMQTE4M18wID0gaW5wdXQuTEEoMSk7CisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMzQyMDoyOiAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUxvb2t1cF9fVW5vcmRlcmVkR3JvdXBfMTBfXzAgKT8KKyAgICAgICAgICAgIGludCBhbHQxOTY9MjsKKyAgICAgICAgICAgIGludCBMQTE5Nl8wID0gaW5wdXQuTEEoMSk7CiAKLSAgICAgICAgICAgIGlmICggTEExODNfMCA9PSAxNDYgJiYgZ2V0VW5vcmRlcmVkR3JvdXBIZWxwZXIoKS5jYW5TZWxlY3QoZ3JhbW1hckFjY2Vzcy5nZXREYXRhSW50ZXJjaGFuZ2VMb29rdXBBY2Nlc3MoKS5nZXRVbm9yZGVyZWRHcm91cF8xMCgpLCAwKSApIHsKLSAgICAgICAgICAgICAgICBhbHQxODM9MTsKKyAgICAgICAgICAgIGlmICggTEExOTZfMCA9PSAxNTggJiYgZ2V0VW5vcmRlcmVkR3JvdXBIZWxwZXIoKS5jYW5TZWxlY3QoZ3JhbW1hckFjY2Vzcy5nZXREYXRhSW50ZXJjaGFuZ2VMb29rdXBBY2Nlc3MoKS5nZXRVbm9yZGVyZWRHcm91cF8xMCgpLCAwKSApIHsKKyAgICAgICAgICAgICAgICBhbHQxOTY9MTsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgaWYgKCBMQTE4M18wID09IDE0NyAmJiBnZXRVbm9yZGVyZWRHcm91cEhlbHBlcigpLmNhblNlbGVjdChncmFtbWFyQWNjZXNzLmdldERhdGFJbnRlcmNoYW5nZUxvb2t1cEFjY2VzcygpLmdldFVub3JkZXJlZEdyb3VwXzEwKCksIDEpICkgewotICAgICAgICAgICAgICAgIGFsdDE4Mz0xOworICAgICAgICAgICAgZWxzZSBpZiAoIExBMTk2XzAgPT0gMTU5ICYmIGdldFVub3JkZXJlZEdyb3VwSGVscGVyKCkuY2FuU2VsZWN0KGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YUludGVyY2hhbmdlTG9va3VwQWNjZXNzKCkuZ2V0VW5vcmRlcmVkR3JvdXBfMTAoKSwgMSkgKSB7CisgICAgICAgICAgICAgICAgYWx0MTk2PTE7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIGlmICggTEExODNfMCA9PSA5OSAmJiBnZXRVbm9yZGVyZWRHcm91cEhlbHBlcigpLmNhblNlbGVjdChncmFtbWFyQWNjZXNzLmdldERhdGFJbnRlcmNoYW5nZUxvb2t1cEFjY2VzcygpLmdldFVub3JkZXJlZEdyb3VwXzEwKCksIDIpICkgewotICAgICAgICAgICAgICAgIGFsdDE4Mz0xOworICAgICAgICAgICAgZWxzZSBpZiAoIExBMTk2XzAgPT0gMTA2ICYmIGdldFVub3JkZXJlZEdyb3VwSGVscGVyKCkuY2FuU2VsZWN0KGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YUludGVyY2hhbmdlTG9va3VwQWNjZXNzKCkuZ2V0VW5vcmRlcmVkR3JvdXBfMTAoKSwgMikgKSB7CisgICAgICAgICAgICAgICAgYWx0MTk2PTE7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBzd2l0Y2ggKGFsdDE4MykgeworICAgICAgICAgICAgc3dpdGNoIChhbHQxOTYpIHsKICAgICAgICAgICAgICAgICBjYXNlIDEgOgogICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzowOjA6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUxvb2t1cF9fVW5vcmRlcmVkR3JvdXBfMTBfXzAKICAgICAgICAgICAgICAgICAgICAgewpAQCAtNzI2MzksNjAgKzc3MDk2LDYwIEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fRGF0YUludGVyY2hhbmdlTG9va3VwX19Vbm9yZGVyZWRHcm91cF8xMF9fSW1wbCIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMjA5MDoxOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VMb29rdXBfX1Vub3JkZXJlZEdyb3VwXzEwX19JbXBsIDogKCAoey4uLn0/ID0+ICggKCAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUxvb2t1cF9fQWxsb3dOb1Jlc3VsdEFzc2lnbm1lbnRfMTBfMCApICkgKSApIHwgKHsuLi59PyA9PiAoICggKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VMb29rdXBfX0FsbG93Tm9udW5pcXVlUmVzdWx0QXNzaWdubWVudF8xMF8xICkgKSApICkgfCAoey4uLn0/ID0+ICggKCAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUxvb2t1cF9fTWFya2VyUGF0aEFzc2lnbm1lbnRfMTBfMiApICkgKSApICkgOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIzNDI4OjE6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUxvb2t1cF9fVW5vcmRlcmVkR3JvdXBfMTBfX0ltcGwgOiAoICh7Li4ufT8gPT4gKCAoICggcnVsZV9fRGF0YUludGVyY2hhbmdlTG9va3VwX19BbGxvd05vUmVzdWx0QXNzaWdubWVudF8xMF8wICkgKSApICkgfCAoey4uLn0/ID0+ICggKCAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUxvb2t1cF9fQWxsb3dOb251bmlxdWVSZXN1bHRBc3NpZ25tZW50XzEwXzEgKSApICkgKSB8ICh7Li4ufT8gPT4gKCAoICggcnVsZV9fRGF0YUludGVyY2hhbmdlTG9va3VwX19NYXJrZXJQYXRoQXNzaWdubWVudF8xMF8yICkgKSApICkgKSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fRGF0YUludGVyY2hhbmdlTG9va3VwX19Vbm9yZGVyZWRHcm91cF8xMF9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCWJvb2xlYW4gc2VsZWN0ZWQgPSBmYWxzZTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjIwOTU6MTogKCAoICh7Li4ufT8gPT4gKCAoICggcnVsZV9fRGF0YUludGVyY2hhbmdlTG9va3VwX19BbGxvd05vUmVzdWx0QXNzaWdubWVudF8xMF8wICkgKSApICkgfCAoey4uLn0/ID0+ICggKCAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUxvb2t1cF9fQWxsb3dOb251bmlxdWVSZXN1bHRBc3NpZ25tZW50XzEwXzEgKSApICkgKSB8ICh7Li4ufT8gPT4gKCAoICggcnVsZV9fRGF0YUludGVyY2hhbmdlTG9va3VwX19NYXJrZXJQYXRoQXNzaWdubWVudF8xMF8yICkgKSApICkgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMjA5NjozOiAoICh7Li4ufT8gPT4gKCAoICggcnVsZV9fRGF0YUludGVyY2hhbmdlTG9va3VwX19BbGxvd05vUmVzdWx0QXNzaWdubWVudF8xMF8wICkgKSApICkgfCAoey4uLn0/ID0+ICggKCAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUxvb2t1cF9fQWxsb3dOb251bmlxdWVSZXN1bHRBc3NpZ25tZW50XzEwXzEgKSApICkgKSB8ICh7Li4ufT8gPT4gKCAoICggcnVsZV9fRGF0YUludGVyY2hhbmdlTG9va3VwX19NYXJrZXJQYXRoQXNzaWdubWVudF8xMF8yICkgKSApICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjM0MzM6MTogKCAoICh7Li4ufT8gPT4gKCAoICggcnVsZV9fRGF0YUludGVyY2hhbmdlTG9va3VwX19BbGxvd05vUmVzdWx0QXNzaWdubWVudF8xMF8wICkgKSApICkgfCAoey4uLn0/ID0+ICggKCAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUxvb2t1cF9fQWxsb3dOb251bmlxdWVSZXN1bHRBc3NpZ25tZW50XzEwXzEgKSApICkgKSB8ICh7Li4ufT8gPT4gKCAoICggcnVsZV9fRGF0YUludGVyY2hhbmdlTG9va3VwX19NYXJrZXJQYXRoQXNzaWdubWVudF8xMF8yICkgKSApICkgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMzQzNDozOiAoICh7Li4ufT8gPT4gKCAoICggcnVsZV9fRGF0YUludGVyY2hhbmdlTG9va3VwX19BbGxvd05vUmVzdWx0QXNzaWdubWVudF8xMF8wICkgKSApICkgfCAoey4uLn0/ID0+ICggKCAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUxvb2t1cF9fQWxsb3dOb251bmlxdWVSZXN1bHRBc3NpZ25tZW50XzEwXzEgKSApICkgKSB8ICh7Li4ufT8gPT4gKCAoICggcnVsZV9fRGF0YUludGVyY2hhbmdlTG9va3VwX19NYXJrZXJQYXRoQXNzaWdubWVudF8xMF8yICkgKSApICkgKQogICAgICAgICAgICAgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjIwOTY6MzogKCAoey4uLn0/ID0+ICggKCAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUxvb2t1cF9fQWxsb3dOb1Jlc3VsdEFzc2lnbm1lbnRfMTBfMCApICkgKSApIHwgKHsuLi59PyA9PiAoICggKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VMb29rdXBfX0FsbG93Tm9udW5pcXVlUmVzdWx0QXNzaWdubWVudF8xMF8xICkgKSApICkgfCAoey4uLn0/ID0+ICggKCAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUxvb2t1cF9fTWFya2VyUGF0aEFzc2lnbm1lbnRfMTBfMiApICkgKSApICkKLSAgICAgICAgICAgIGludCBhbHQxODQ9MzsKLSAgICAgICAgICAgIGludCBMQTE4NF8wID0gaW5wdXQuTEEoMSk7CisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMzQzNDozOiAoICh7Li4ufT8gPT4gKCAoICggcnVsZV9fRGF0YUludGVyY2hhbmdlTG9va3VwX19BbGxvd05vUmVzdWx0QXNzaWdubWVudF8xMF8wICkgKSApICkgfCAoey4uLn0/ID0+ICggKCAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUxvb2t1cF9fQWxsb3dOb251bmlxdWVSZXN1bHRBc3NpZ25tZW50XzEwXzEgKSApICkgKSB8ICh7Li4ufT8gPT4gKCAoICggcnVsZV9fRGF0YUludGVyY2hhbmdlTG9va3VwX19NYXJrZXJQYXRoQXNzaWdubWVudF8xMF8yICkgKSApICkgKQorICAgICAgICAgICAgaW50IGFsdDE5Nz0zOworICAgICAgICAgICAgaW50IExBMTk3XzAgPSBpbnB1dC5MQSgxKTsKIAotICAgICAgICAgICAgaWYgKCBMQTE4NF8wID09IDE0NiAmJiBnZXRVbm9yZGVyZWRHcm91cEhlbHBlcigpLmNhblNlbGVjdChncmFtbWFyQWNjZXNzLmdldERhdGFJbnRlcmNoYW5nZUxvb2t1cEFjY2VzcygpLmdldFVub3JkZXJlZEdyb3VwXzEwKCksIDApICkgewotICAgICAgICAgICAgICAgIGFsdDE4ND0xOworICAgICAgICAgICAgaWYgKCBMQTE5N18wID09IDE1OCAmJiBnZXRVbm9yZGVyZWRHcm91cEhlbHBlcigpLmNhblNlbGVjdChncmFtbWFyQWNjZXNzLmdldERhdGFJbnRlcmNoYW5nZUxvb2t1cEFjY2VzcygpLmdldFVub3JkZXJlZEdyb3VwXzEwKCksIDApICkgeworICAgICAgICAgICAgICAgIGFsdDE5Nz0xOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSBpZiAoIExBMTg0XzAgPT0gMTQ3ICYmIGdldFVub3JkZXJlZEdyb3VwSGVscGVyKCkuY2FuU2VsZWN0KGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YUludGVyY2hhbmdlTG9va3VwQWNjZXNzKCkuZ2V0VW5vcmRlcmVkR3JvdXBfMTAoKSwgMSkgKSB7Ci0gICAgICAgICAgICAgICAgYWx0MTg0PTI7CisgICAgICAgICAgICBlbHNlIGlmICggTEExOTdfMCA9PSAxNTkgJiYgZ2V0VW5vcmRlcmVkR3JvdXBIZWxwZXIoKS5jYW5TZWxlY3QoZ3JhbW1hckFjY2Vzcy5nZXREYXRhSW50ZXJjaGFuZ2VMb29rdXBBY2Nlc3MoKS5nZXRVbm9yZGVyZWRHcm91cF8xMCgpLCAxKSApIHsKKyAgICAgICAgICAgICAgICBhbHQxOTc9MjsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgaWYgKCBMQTE4NF8wID09IDk5ICYmIGdldFVub3JkZXJlZEdyb3VwSGVscGVyKCkuY2FuU2VsZWN0KGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YUludGVyY2hhbmdlTG9va3VwQWNjZXNzKCkuZ2V0VW5vcmRlcmVkR3JvdXBfMTAoKSwgMikgKSB7Ci0gICAgICAgICAgICAgICAgYWx0MTg0PTM7CisgICAgICAgICAgICBlbHNlIGlmICggTEExOTdfMCA9PSAxMDYgJiYgZ2V0VW5vcmRlcmVkR3JvdXBIZWxwZXIoKS5jYW5TZWxlY3QoZ3JhbW1hckFjY2Vzcy5nZXREYXRhSW50ZXJjaGFuZ2VMb29rdXBBY2Nlc3MoKS5nZXRVbm9yZGVyZWRHcm91cF8xMCgpLCAyKSApIHsKKyAgICAgICAgICAgICAgICBhbHQxOTc9MzsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgIGlmIChzdGF0ZS5iYWNrdHJhY2tpbmc+MCkge3N0YXRlLmZhaWxlZD10cnVlOyByZXR1cm4gO30KICAgICAgICAgICAgICAgICBOb1ZpYWJsZUFsdEV4Y2VwdGlvbiBudmFlID0KLSAgICAgICAgICAgICAgICAgICAgbmV3IE5vVmlhYmxlQWx0RXhjZXB0aW9uKCIiLCAxODQsIDAsIGlucHV0KTsKKyAgICAgICAgICAgICAgICAgICAgbmV3IE5vVmlhYmxlQWx0RXhjZXB0aW9uKCIiLCAxOTcsIDAsIGlucHV0KTsKIAogICAgICAgICAgICAgICAgIHRocm93IG52YWU7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBzd2l0Y2ggKGFsdDE4NCkgeworICAgICAgICAgICAgc3dpdGNoIChhbHQxOTcpIHsKICAgICAgICAgICAgICAgICBjYXNlIDEgOgotICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMjA5NzozOiAoey4uLn0/ID0+ICggKCAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUxvb2t1cF9fQWxsb3dOb1Jlc3VsdEFzc2lnbm1lbnRfMTBfMCApICkgKSApCisgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIzNDM1OjM6ICh7Li4ufT8gPT4gKCAoICggcnVsZV9fRGF0YUludGVyY2hhbmdlTG9va3VwX19BbGxvd05vUmVzdWx0QXNzaWdubWVudF8xMF8wICkgKSApICkKICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMjA5NzozOiAoey4uLn0/ID0+ICggKCAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUxvb2t1cF9fQWxsb3dOb1Jlc3VsdEFzc2lnbm1lbnRfMTBfMCApICkgKSApCi0gICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIyMDk4OjQ6IHsuLi59PyA9PiAoICggKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VMb29rdXBfX0FsbG93Tm9SZXN1bHRBc3NpZ25tZW50XzEwXzAgKSApICkKKyAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjM0MzU6MzogKHsuLi59PyA9PiAoICggKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VMb29rdXBfX0FsbG93Tm9SZXN1bHRBc3NpZ25tZW50XzEwXzAgKSApICkgKQorICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMzQzNjo0OiB7Li4ufT8gPT4gKCAoICggcnVsZV9fRGF0YUludGVyY2hhbmdlTG9va3VwX19BbGxvd05vUmVzdWx0QXNzaWdubWVudF8xMF8wICkgKSApCiAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgaWYgKCAhIGdldFVub3JkZXJlZEdyb3VwSGVscGVyKCkuY2FuU2VsZWN0KGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YUludGVyY2hhbmdlTG9va3VwQWNjZXNzKCkuZ2V0VW5vcmRlcmVkR3JvdXBfMTAoKSwgMCkgKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3RhdGUuYmFja3RyYWNraW5nPjApIHtzdGF0ZS5mYWlsZWQ9dHJ1ZTsgcmV0dXJuIDt9CiAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRmFpbGVkUHJlZGljYXRlRXhjZXB0aW9uKGlucHV0LCAicnVsZV9fRGF0YUludGVyY2hhbmdlTG9va3VwX19Vbm9yZGVyZWRHcm91cF8xMF9fSW1wbCIsICJnZXRVbm9yZGVyZWRHcm91cEhlbHBlcigpLmNhblNlbGVjdChncmFtbWFyQWNjZXNzLmdldERhdGFJbnRlcmNoYW5nZUxvb2t1cEFjY2VzcygpLmdldFVub3JkZXJlZEdyb3VwXzEwKCksIDApIik7CiAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjIwOTg6MTE4OiAoICggKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VMb29rdXBfX0FsbG93Tm9SZXN1bHRBc3NpZ25tZW50XzEwXzAgKSApICkKLSAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjIwOTk6NTogKCAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUxvb2t1cF9fQWxsb3dOb1Jlc3VsdEFzc2lnbm1lbnRfMTBfMCApICkKKyAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjM0MzY6MTE4OiAoICggKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VMb29rdXBfX0FsbG93Tm9SZXN1bHRBc3NpZ25tZW50XzEwXzAgKSApICkKKyAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjM0Mzc6NTogKCAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUxvb2t1cF9fQWxsb3dOb1Jlc3VsdEFzc2lnbm1lbnRfMTBfMCApICkKICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICBnZXRVbm9yZGVyZWRHcm91cEhlbHBlcigpLnNlbGVjdChncmFtbWFyQWNjZXNzLmdldERhdGFJbnRlcmNoYW5nZUxvb2t1cEFjY2VzcygpLmdldFVub3JkZXJlZEdyb3VwXzEwKCksIDApOwogICAgICAgICAgICAgICAgICAgICBzZWxlY3RlZCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIyMTA1OjU6ICggKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VMb29rdXBfX0FsbG93Tm9SZXN1bHRBc3NpZ25tZW50XzEwXzAgKSApCi0gICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIyMTA2OjY6ICggcnVsZV9fRGF0YUludGVyY2hhbmdlTG9va3VwX19BbGxvd05vUmVzdWx0QXNzaWdubWVudF8xMF8wICkKKyAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjM0NDM6NTogKCAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUxvb2t1cF9fQWxsb3dOb1Jlc3VsdEFzc2lnbm1lbnRfMTBfMCApICkKKyAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjM0NDQ6NjogKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VMb29rdXBfX0FsbG93Tm9SZXN1bHRBc3NpZ25tZW50XzEwXzAgKQogICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXREYXRhSW50ZXJjaGFuZ2VMb29rdXBBY2Nlc3MoKS5nZXRBbGxvd05vUmVzdWx0QXNzaWdubWVudF8xMF8wKCkpOyAKICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMjEwNzo2OiAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUxvb2t1cF9fQWxsb3dOb1Jlc3VsdEFzc2lnbm1lbnRfMTBfMCApCi0gICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIyMTA3Ojc6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUxvb2t1cF9fQWxsb3dOb1Jlc3VsdEFzc2lnbm1lbnRfMTBfMAorICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMzQ0NTo2OiAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUxvb2t1cF9fQWxsb3dOb1Jlc3VsdEFzc2lnbm1lbnRfMTBfMCApCisgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIzNDQ1Ojc6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUxvb2t1cF9fQWxsb3dOb1Jlc3VsdEFzc2lnbm1lbnRfMTBfMAogICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzIpOwogICAgICAgICAgICAgICAgICAgICBydWxlX19EYXRhSW50ZXJjaGFuZ2VMb29rdXBfX0FsbG93Tm9SZXN1bHRBc3NpZ25tZW50XzEwXzAoKTsKQEAgLTcyNzE4LDI4ICs3NzE3NSwyOCBAQAogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgIGNhc2UgMiA6Ci0gICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIyMTEyOjM6ICh7Li4ufT8gPT4gKCAoICggcnVsZV9fRGF0YUludGVyY2hhbmdlTG9va3VwX19BbGxvd05vbnVuaXF1ZVJlc3VsdEFzc2lnbm1lbnRfMTBfMSApICkgKSApCisgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIzNDUwOjM6ICh7Li4ufT8gPT4gKCAoICggcnVsZV9fRGF0YUludGVyY2hhbmdlTG9va3VwX19BbGxvd05vbnVuaXF1ZVJlc3VsdEFzc2lnbm1lbnRfMTBfMSApICkgKSApCiAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjIxMTI6MzogKHsuLi59PyA9PiAoICggKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VMb29rdXBfX0FsbG93Tm9udW5pcXVlUmVzdWx0QXNzaWdubWVudF8xMF8xICkgKSApICkKLSAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjIxMTM6NDogey4uLn0/ID0+ICggKCAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUxvb2t1cF9fQWxsb3dOb251bmlxdWVSZXN1bHRBc3NpZ25tZW50XzEwXzEgKSApICkKKyAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjM0NTA6MzogKHsuLi59PyA9PiAoICggKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VMb29rdXBfX0FsbG93Tm9udW5pcXVlUmVzdWx0QXNzaWdubWVudF8xMF8xICkgKSApICkKKyAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjM0NTE6NDogey4uLn0/ID0+ICggKCAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUxvb2t1cF9fQWxsb3dOb251bmlxdWVSZXN1bHRBc3NpZ25tZW50XzEwXzEgKSApICkKICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICBpZiAoICEgZ2V0VW5vcmRlcmVkR3JvdXBIZWxwZXIoKS5jYW5TZWxlY3QoZ3JhbW1hckFjY2Vzcy5nZXREYXRhSW50ZXJjaGFuZ2VMb29rdXBBY2Nlc3MoKS5nZXRVbm9yZGVyZWRHcm91cF8xMCgpLCAxKSApIHsKICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdGF0ZS5iYWNrdHJhY2tpbmc+MCkge3N0YXRlLmZhaWxlZD10cnVlOyByZXR1cm4gO30KICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBGYWlsZWRQcmVkaWNhdGVFeGNlcHRpb24oaW5wdXQsICJydWxlX19EYXRhSW50ZXJjaGFuZ2VMb29rdXBfX1Vub3JkZXJlZEdyb3VwXzEwX19JbXBsIiwgImdldFVub3JkZXJlZEdyb3VwSGVscGVyKCkuY2FuU2VsZWN0KGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YUludGVyY2hhbmdlTG9va3VwQWNjZXNzKCkuZ2V0VW5vcmRlcmVkR3JvdXBfMTAoKSwgMSkiKTsKICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMjExMzoxMTg6ICggKCAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUxvb2t1cF9fQWxsb3dOb251bmlxdWVSZXN1bHRBc3NpZ25tZW50XzEwXzEgKSApICkKLSAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjIxMTQ6NTogKCAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUxvb2t1cF9fQWxsb3dOb251bmlxdWVSZXN1bHRBc3NpZ25tZW50XzEwXzEgKSApCisgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIzNDUxOjExODogKCAoICggcnVsZV9fRGF0YUludGVyY2hhbmdlTG9va3VwX19BbGxvd05vbnVuaXF1ZVJlc3VsdEFzc2lnbm1lbnRfMTBfMSApICkgKQorICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMzQ1Mjo1OiAoICggcnVsZV9fRGF0YUludGVyY2hhbmdlTG9va3VwX19BbGxvd05vbnVuaXF1ZVJlc3VsdEFzc2lnbm1lbnRfMTBfMSApICkKICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICBnZXRVbm9yZGVyZWRHcm91cEhlbHBlcigpLnNlbGVjdChncmFtbWFyQWNjZXNzLmdldERhdGFJbnRlcmNoYW5nZUxvb2t1cEFjY2VzcygpLmdldFVub3JkZXJlZEdyb3VwXzEwKCksIDEpOwogICAgICAgICAgICAgICAgICAgICBzZWxlY3RlZCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIyMTIwOjU6ICggKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VMb29rdXBfX0FsbG93Tm9udW5pcXVlUmVzdWx0QXNzaWdubWVudF8xMF8xICkgKQotICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMjEyMTo2OiAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUxvb2t1cF9fQWxsb3dOb251bmlxdWVSZXN1bHRBc3NpZ25tZW50XzEwXzEgKQorICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMzQ1ODo1OiAoICggcnVsZV9fRGF0YUludGVyY2hhbmdlTG9va3VwX19BbGxvd05vbnVuaXF1ZVJlc3VsdEFzc2lnbm1lbnRfMTBfMSApICkKKyAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjM0NTk6NjogKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VMb29rdXBfX0FsbG93Tm9udW5pcXVlUmVzdWx0QXNzaWdubWVudF8xMF8xICkKICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YUludGVyY2hhbmdlTG9va3VwQWNjZXNzKCkuZ2V0QWxsb3dOb251bmlxdWVSZXN1bHRBc3NpZ25tZW50XzEwXzEoKSk7IAogICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIyMTIyOjY6ICggcnVsZV9fRGF0YUludGVyY2hhbmdlTG9va3VwX19BbGxvd05vbnVuaXF1ZVJlc3VsdEFzc2lnbm1lbnRfMTBfMSApCi0gICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIyMTIyOjc6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUxvb2t1cF9fQWxsb3dOb251bmlxdWVSZXN1bHRBc3NpZ25tZW50XzEwXzEKKyAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjM0NjA6NjogKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VMb29rdXBfX0FsbG93Tm9udW5pcXVlUmVzdWx0QXNzaWdubWVudF8xMF8xICkKKyAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjM0NjA6NzogcnVsZV9fRGF0YUludGVyY2hhbmdlTG9va3VwX19BbGxvd05vbnVuaXF1ZVJlc3VsdEFzc2lnbm1lbnRfMTBfMQogICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzIpOwogICAgICAgICAgICAgICAgICAgICBydWxlX19EYXRhSW50ZXJjaGFuZ2VMb29rdXBfX0FsbG93Tm9udW5pcXVlUmVzdWx0QXNzaWdubWVudF8xMF8xKCk7CkBAIC03Mjc2NSwyOCArNzcyMjIsMjggQEAKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICBjYXNlIDMgOgotICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMjEyNzozOiAoey4uLn0/ID0+ICggKCAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUxvb2t1cF9fTWFya2VyUGF0aEFzc2lnbm1lbnRfMTBfMiApICkgKSApCisgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIzNDY1OjM6ICh7Li4ufT8gPT4gKCAoICggcnVsZV9fRGF0YUludGVyY2hhbmdlTG9va3VwX19NYXJrZXJQYXRoQXNzaWdubWVudF8xMF8yICkgKSApICkKICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMjEyNzozOiAoey4uLn0/ID0+ICggKCAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUxvb2t1cF9fTWFya2VyUGF0aEFzc2lnbm1lbnRfMTBfMiApICkgKSApCi0gICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIyMTI4OjQ6IHsuLi59PyA9PiAoICggKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VMb29rdXBfX01hcmtlclBhdGhBc3NpZ25tZW50XzEwXzIgKSApICkKKyAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjM0NjU6MzogKHsuLi59PyA9PiAoICggKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VMb29rdXBfX01hcmtlclBhdGhBc3NpZ25tZW50XzEwXzIgKSApICkgKQorICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMzQ2Njo0OiB7Li4ufT8gPT4gKCAoICggcnVsZV9fRGF0YUludGVyY2hhbmdlTG9va3VwX19NYXJrZXJQYXRoQXNzaWdubWVudF8xMF8yICkgKSApCiAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgaWYgKCAhIGdldFVub3JkZXJlZEdyb3VwSGVscGVyKCkuY2FuU2VsZWN0KGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YUludGVyY2hhbmdlTG9va3VwQWNjZXNzKCkuZ2V0VW5vcmRlcmVkR3JvdXBfMTAoKSwgMikgKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3RhdGUuYmFja3RyYWNraW5nPjApIHtzdGF0ZS5mYWlsZWQ9dHJ1ZTsgcmV0dXJuIDt9CiAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRmFpbGVkUHJlZGljYXRlRXhjZXB0aW9uKGlucHV0LCAicnVsZV9fRGF0YUludGVyY2hhbmdlTG9va3VwX19Vbm9yZGVyZWRHcm91cF8xMF9fSW1wbCIsICJnZXRVbm9yZGVyZWRHcm91cEhlbHBlcigpLmNhblNlbGVjdChncmFtbWFyQWNjZXNzLmdldERhdGFJbnRlcmNoYW5nZUxvb2t1cEFjY2VzcygpLmdldFVub3JkZXJlZEdyb3VwXzEwKCksIDIpIik7CiAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjIxMjg6MTE4OiAoICggKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VMb29rdXBfX01hcmtlclBhdGhBc3NpZ25tZW50XzEwXzIgKSApICkKLSAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjIxMjk6NTogKCAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUxvb2t1cF9fTWFya2VyUGF0aEFzc2lnbm1lbnRfMTBfMiApICkKKyAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjM0NjY6MTE4OiAoICggKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VMb29rdXBfX01hcmtlclBhdGhBc3NpZ25tZW50XzEwXzIgKSApICkKKyAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjM0Njc6NTogKCAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUxvb2t1cF9fTWFya2VyUGF0aEFzc2lnbm1lbnRfMTBfMiApICkKICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICBnZXRVbm9yZGVyZWRHcm91cEhlbHBlcigpLnNlbGVjdChncmFtbWFyQWNjZXNzLmdldERhdGFJbnRlcmNoYW5nZUxvb2t1cEFjY2VzcygpLmdldFVub3JkZXJlZEdyb3VwXzEwKCksIDIpOwogICAgICAgICAgICAgICAgICAgICBzZWxlY3RlZCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIyMTM1OjU6ICggKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VMb29rdXBfX01hcmtlclBhdGhBc3NpZ25tZW50XzEwXzIgKSApCi0gICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIyMTM2OjY6ICggcnVsZV9fRGF0YUludGVyY2hhbmdlTG9va3VwX19NYXJrZXJQYXRoQXNzaWdubWVudF8xMF8yICkKKyAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjM0NzM6NTogKCAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUxvb2t1cF9fTWFya2VyUGF0aEFzc2lnbm1lbnRfMTBfMiApICkKKyAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjM0NzQ6NjogKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VMb29rdXBfX01hcmtlclBhdGhBc3NpZ25tZW50XzEwXzIgKQogICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXREYXRhSW50ZXJjaGFuZ2VMb29rdXBBY2Nlc3MoKS5nZXRNYXJrZXJQYXRoQXNzaWdubWVudF8xMF8yKCkpOyAKICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMjEzNzo2OiAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUxvb2t1cF9fTWFya2VyUGF0aEFzc2lnbm1lbnRfMTBfMiApCi0gICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIyMTM3Ojc6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUxvb2t1cF9fTWFya2VyUGF0aEFzc2lnbm1lbnRfMTBfMgorICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMzQ3NTo2OiAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUxvb2t1cF9fTWFya2VyUGF0aEFzc2lnbm1lbnRfMTBfMiApCisgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIzNDc1Ojc6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUxvb2t1cF9fTWFya2VyUGF0aEFzc2lnbm1lbnRfMTBfMgogICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzIpOwogICAgICAgICAgICAgICAgICAgICBydWxlX19EYXRhSW50ZXJjaGFuZ2VMb29rdXBfX01hcmtlclBhdGhBc3NpZ25tZW50XzEwXzIoKTsKQEAgLTcyODM1LDM0ICs3NzI5MiwzNCBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX0RhdGFJbnRlcmNoYW5nZUxvb2t1cF9fVW5vcmRlcmVkR3JvdXBfMTBfXzAiCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjIxNTA6MTogcnVsZV9fRGF0YUludGVyY2hhbmdlTG9va3VwX19Vbm9yZGVyZWRHcm91cF8xMF9fMCA6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUxvb2t1cF9fVW5vcmRlcmVkR3JvdXBfMTBfX0ltcGwgKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VMb29rdXBfX1Vub3JkZXJlZEdyb3VwXzEwX18xICk/IDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMzQ4ODoxOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VMb29rdXBfX1Vub3JkZXJlZEdyb3VwXzEwX18wIDogcnVsZV9fRGF0YUludGVyY2hhbmdlTG9va3VwX19Vbm9yZGVyZWRHcm91cF8xMF9fSW1wbCAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUxvb2t1cF9fVW5vcmRlcmVkR3JvdXBfMTBfXzEgKT8gOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUxvb2t1cF9fVW5vcmRlcmVkR3JvdXBfMTBfXzAoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjIxNTQ6MTogKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VMb29rdXBfX1Vub3JkZXJlZEdyb3VwXzEwX19JbXBsICggcnVsZV9fRGF0YUludGVyY2hhbmdlTG9va3VwX19Vbm9yZGVyZWRHcm91cF8xMF9fMSApPyApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMjE1NToyOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VMb29rdXBfX1Vub3JkZXJlZEdyb3VwXzEwX19JbXBsICggcnVsZV9fRGF0YUludGVyY2hhbmdlTG9va3VwX19Vbm9yZGVyZWRHcm91cF8xMF9fMSApPworICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjM0OTI6MTogKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VMb29rdXBfX1Vub3JkZXJlZEdyb3VwXzEwX19JbXBsICggcnVsZV9fRGF0YUludGVyY2hhbmdlTG9va3VwX19Vbm9yZGVyZWRHcm91cF8xMF9fMSApPyApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMzQ5MzoyOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VMb29rdXBfX1Vub3JkZXJlZEdyb3VwXzEwX19JbXBsICggcnVsZV9fRGF0YUludGVyY2hhbmdlTG9va3VwX19Vbm9yZGVyZWRHcm91cF8xMF9fMSApPwogICAgICAgICAgICAgewotICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMTU4KTsKKyAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzE2Nik7CiAgICAgICAgICAgICBydWxlX19EYXRhSW50ZXJjaGFuZ2VMb29rdXBfX1Vub3JkZXJlZEdyb3VwXzEwX19JbXBsKCk7CiAKICAgICAgICAgICAgIHN0YXRlLl9mc3AtLTsKICAgICAgICAgICAgIGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMjE1NjoyOiAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUxvb2t1cF9fVW5vcmRlcmVkR3JvdXBfMTBfXzEgKT8KLSAgICAgICAgICAgIGludCBhbHQxODU9MjsKLSAgICAgICAgICAgIGludCBMQTE4NV8wID0gaW5wdXQuTEEoMSk7CisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMzQ5NDoyOiAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUxvb2t1cF9fVW5vcmRlcmVkR3JvdXBfMTBfXzEgKT8KKyAgICAgICAgICAgIGludCBhbHQxOTg9MjsKKyAgICAgICAgICAgIGludCBMQTE5OF8wID0gaW5wdXQuTEEoMSk7CiAKLSAgICAgICAgICAgIGlmICggTEExODVfMCA9PSAxNDYgJiYgZ2V0VW5vcmRlcmVkR3JvdXBIZWxwZXIoKS5jYW5TZWxlY3QoZ3JhbW1hckFjY2Vzcy5nZXREYXRhSW50ZXJjaGFuZ2VMb29rdXBBY2Nlc3MoKS5nZXRVbm9yZGVyZWRHcm91cF8xMCgpLCAwKSApIHsKLSAgICAgICAgICAgICAgICBhbHQxODU9MTsKKyAgICAgICAgICAgIGlmICggTEExOThfMCA9PSAxNTggJiYgZ2V0VW5vcmRlcmVkR3JvdXBIZWxwZXIoKS5jYW5TZWxlY3QoZ3JhbW1hckFjY2Vzcy5nZXREYXRhSW50ZXJjaGFuZ2VMb29rdXBBY2Nlc3MoKS5nZXRVbm9yZGVyZWRHcm91cF8xMCgpLCAwKSApIHsKKyAgICAgICAgICAgICAgICBhbHQxOTg9MTsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgaWYgKCBMQTE4NV8wID09IDE0NyAmJiBnZXRVbm9yZGVyZWRHcm91cEhlbHBlcigpLmNhblNlbGVjdChncmFtbWFyQWNjZXNzLmdldERhdGFJbnRlcmNoYW5nZUxvb2t1cEFjY2VzcygpLmdldFVub3JkZXJlZEdyb3VwXzEwKCksIDEpICkgewotICAgICAgICAgICAgICAgIGFsdDE4NT0xOworICAgICAgICAgICAgZWxzZSBpZiAoIExBMTk4XzAgPT0gMTU5ICYmIGdldFVub3JkZXJlZEdyb3VwSGVscGVyKCkuY2FuU2VsZWN0KGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YUludGVyY2hhbmdlTG9va3VwQWNjZXNzKCkuZ2V0VW5vcmRlcmVkR3JvdXBfMTAoKSwgMSkgKSB7CisgICAgICAgICAgICAgICAgYWx0MTk4PTE7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIGlmICggTEExODVfMCA9PSA5OSAmJiBnZXRVbm9yZGVyZWRHcm91cEhlbHBlcigpLmNhblNlbGVjdChncmFtbWFyQWNjZXNzLmdldERhdGFJbnRlcmNoYW5nZUxvb2t1cEFjY2VzcygpLmdldFVub3JkZXJlZEdyb3VwXzEwKCksIDIpICkgewotICAgICAgICAgICAgICAgIGFsdDE4NT0xOworICAgICAgICAgICAgZWxzZSBpZiAoIExBMTk4XzAgPT0gMTA2ICYmIGdldFVub3JkZXJlZEdyb3VwSGVscGVyKCkuY2FuU2VsZWN0KGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YUludGVyY2hhbmdlTG9va3VwQWNjZXNzKCkuZ2V0VW5vcmRlcmVkR3JvdXBfMTAoKSwgMikgKSB7CisgICAgICAgICAgICAgICAgYWx0MTk4PTE7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBzd2l0Y2ggKGFsdDE4NSkgeworICAgICAgICAgICAgc3dpdGNoIChhbHQxOTgpIHsKICAgICAgICAgICAgICAgICBjYXNlIDEgOgogICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzowOjA6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUxvb2t1cF9fVW5vcmRlcmVkR3JvdXBfMTBfXzEKICAgICAgICAgICAgICAgICAgICAgewpAQCAtNzI4OTYsMzQgKzc3MzUzLDM0IEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fRGF0YUludGVyY2hhbmdlTG9va3VwX19Vbm9yZGVyZWRHcm91cF8xMF9fMSIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMjE2MjoxOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VMb29rdXBfX1Vub3JkZXJlZEdyb3VwXzEwX18xIDogcnVsZV9fRGF0YUludGVyY2hhbmdlTG9va3VwX19Vbm9yZGVyZWRHcm91cF8xMF9fSW1wbCAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUxvb2t1cF9fVW5vcmRlcmVkR3JvdXBfMTBfXzIgKT8gOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIzNTAwOjE6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUxvb2t1cF9fVW5vcmRlcmVkR3JvdXBfMTBfXzEgOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VMb29rdXBfX1Vub3JkZXJlZEdyb3VwXzEwX19JbXBsICggcnVsZV9fRGF0YUludGVyY2hhbmdlTG9va3VwX19Vbm9yZGVyZWRHcm91cF8xMF9fMiApPyA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fRGF0YUludGVyY2hhbmdlTG9va3VwX19Vbm9yZGVyZWRHcm91cF8xMF9fMSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMjE2NjoxOiAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUxvb2t1cF9fVW5vcmRlcmVkR3JvdXBfMTBfX0ltcGwgKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VMb29rdXBfX1Vub3JkZXJlZEdyb3VwXzEwX18yICk/ICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIyMTY3OjI6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUxvb2t1cF9fVW5vcmRlcmVkR3JvdXBfMTBfX0ltcGwgKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VMb29rdXBfX1Vub3JkZXJlZEdyb3VwXzEwX18yICk/CisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMzUwNDoxOiAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUxvb2t1cF9fVW5vcmRlcmVkR3JvdXBfMTBfX0ltcGwgKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VMb29rdXBfX1Vub3JkZXJlZEdyb3VwXzEwX18yICk/ICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIzNTA1OjI6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUxvb2t1cF9fVW5vcmRlcmVkR3JvdXBfMTBfX0ltcGwgKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VMb29rdXBfX1Vub3JkZXJlZEdyb3VwXzEwX18yICk/CiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV18xNTgpOworICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMTY2KTsKICAgICAgICAgICAgIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUxvb2t1cF9fVW5vcmRlcmVkR3JvdXBfMTBfX0ltcGwoKTsKIAogICAgICAgICAgICAgc3RhdGUuX2ZzcC0tOwogICAgICAgICAgICAgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIyMTY4OjI6ICggcnVsZV9fRGF0YUludGVyY2hhbmdlTG9va3VwX19Vbm9yZGVyZWRHcm91cF8xMF9fMiApPwotICAgICAgICAgICAgaW50IGFsdDE4Nj0yOwotICAgICAgICAgICAgaW50IExBMTg2XzAgPSBpbnB1dC5MQSgxKTsKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIzNTA2OjI6ICggcnVsZV9fRGF0YUludGVyY2hhbmdlTG9va3VwX19Vbm9yZGVyZWRHcm91cF8xMF9fMiApPworICAgICAgICAgICAgaW50IGFsdDE5OT0yOworICAgICAgICAgICAgaW50IExBMTk5XzAgPSBpbnB1dC5MQSgxKTsKIAotICAgICAgICAgICAgaWYgKCBMQTE4Nl8wID09IDE0NiAmJiBnZXRVbm9yZGVyZWRHcm91cEhlbHBlcigpLmNhblNlbGVjdChncmFtbWFyQWNjZXNzLmdldERhdGFJbnRlcmNoYW5nZUxvb2t1cEFjY2VzcygpLmdldFVub3JkZXJlZEdyb3VwXzEwKCksIDApICkgewotICAgICAgICAgICAgICAgIGFsdDE4Nj0xOworICAgICAgICAgICAgaWYgKCBMQTE5OV8wID09IDE1OCAmJiBnZXRVbm9yZGVyZWRHcm91cEhlbHBlcigpLmNhblNlbGVjdChncmFtbWFyQWNjZXNzLmdldERhdGFJbnRlcmNoYW5nZUxvb2t1cEFjY2VzcygpLmdldFVub3JkZXJlZEdyb3VwXzEwKCksIDApICkgeworICAgICAgICAgICAgICAgIGFsdDE5OT0xOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSBpZiAoIExBMTg2XzAgPT0gMTQ3ICYmIGdldFVub3JkZXJlZEdyb3VwSGVscGVyKCkuY2FuU2VsZWN0KGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YUludGVyY2hhbmdlTG9va3VwQWNjZXNzKCkuZ2V0VW5vcmRlcmVkR3JvdXBfMTAoKSwgMSkgKSB7Ci0gICAgICAgICAgICAgICAgYWx0MTg2PTE7CisgICAgICAgICAgICBlbHNlIGlmICggTEExOTlfMCA9PSAxNTkgJiYgZ2V0VW5vcmRlcmVkR3JvdXBIZWxwZXIoKS5jYW5TZWxlY3QoZ3JhbW1hckFjY2Vzcy5nZXREYXRhSW50ZXJjaGFuZ2VMb29rdXBBY2Nlc3MoKS5nZXRVbm9yZGVyZWRHcm91cF8xMCgpLCAxKSApIHsKKyAgICAgICAgICAgICAgICBhbHQxOTk9MTsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgaWYgKCBMQTE4Nl8wID09IDk5ICYmIGdldFVub3JkZXJlZEdyb3VwSGVscGVyKCkuY2FuU2VsZWN0KGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YUludGVyY2hhbmdlTG9va3VwQWNjZXNzKCkuZ2V0VW5vcmRlcmVkR3JvdXBfMTAoKSwgMikgKSB7Ci0gICAgICAgICAgICAgICAgYWx0MTg2PTE7CisgICAgICAgICAgICBlbHNlIGlmICggTEExOTlfMCA9PSAxMDYgJiYgZ2V0VW5vcmRlcmVkR3JvdXBIZWxwZXIoKS5jYW5TZWxlY3QoZ3JhbW1hckFjY2Vzcy5nZXREYXRhSW50ZXJjaGFuZ2VMb29rdXBBY2Nlc3MoKS5nZXRVbm9yZGVyZWRHcm91cF8xMCgpLCAyKSApIHsKKyAgICAgICAgICAgICAgICBhbHQxOTk9MTsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHN3aXRjaCAoYWx0MTg2KSB7CisgICAgICAgICAgICBzd2l0Y2ggKGFsdDE5OSkgewogICAgICAgICAgICAgICAgIGNhc2UgMSA6CiAgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjA6MDogcnVsZV9fRGF0YUludGVyY2hhbmdlTG9va3VwX19Vbm9yZGVyZWRHcm91cF8xMF9fMgogICAgICAgICAgICAgICAgICAgICB7CkBAIC03Mjk1NywxNCArNzc0MTQsMTQgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19EYXRhSW50ZXJjaGFuZ2VMb29rdXBfX1Vub3JkZXJlZEdyb3VwXzEwX18yIgotICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIyMTc0OjE6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUxvb2t1cF9fVW5vcmRlcmVkR3JvdXBfMTBfXzIgOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VMb29rdXBfX1Vub3JkZXJlZEdyb3VwXzEwX19JbXBsIDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMzUxMjoxOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VMb29rdXBfX1Vub3JkZXJlZEdyb3VwXzEwX18yIDogcnVsZV9fRGF0YUludGVyY2hhbmdlTG9va3VwX19Vbm9yZGVyZWRHcm91cF8xMF9fSW1wbCA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fRGF0YUludGVyY2hhbmdlTG9va3VwX19Vbm9yZGVyZWRHcm91cF8xMF9fMigpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMjE3ODoxOiAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUxvb2t1cF9fVW5vcmRlcmVkR3JvdXBfMTBfX0ltcGwgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjIxNzk6MjogcnVsZV9fRGF0YUludGVyY2hhbmdlTG9va3VwX19Vbm9yZGVyZWRHcm91cF8xMF9fSW1wbAorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjM1MTY6MTogKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VMb29rdXBfX1Vub3JkZXJlZEdyb3VwXzEwX19JbXBsICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIzNTE3OjI6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUxvb2t1cF9fVW5vcmRlcmVkR3JvdXBfMTBfX0ltcGwKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzIpOwogICAgICAgICAgICAgcnVsZV9fRGF0YUludGVyY2hhbmdlTG9va3VwX19Vbm9yZGVyZWRHcm91cF8xMF9fSW1wbCgpOwpAQCAtNzI5OTAsMTcgKzc3NDQ3LDE3IEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fRGF0YUludGVyY2hhbmdlTW9kZWxfX0ltcG9ydFNlY3Rpb25Bc3NpZ25tZW50XzAiCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjIxODY6MTogcnVsZV9fRGF0YUludGVyY2hhbmdlTW9kZWxfX0ltcG9ydFNlY3Rpb25Bc3NpZ25tZW50XzAgOiAoIHJ1bGVYSW1wb3J0U2VjdGlvbiApIDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMzUyNDoxOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VNb2RlbF9fSW1wb3J0U2VjdGlvbkFzc2lnbm1lbnRfMCA6ICggcnVsZVhJbXBvcnRTZWN0aW9uICkgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZU1vZGVsX19JbXBvcnRTZWN0aW9uQXNzaWdubWVudF8wKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIyMTkwOjE6ICggKCBydWxlWEltcG9ydFNlY3Rpb24gKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMjE5MToyOiAoIHJ1bGVYSW1wb3J0U2VjdGlvbiApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMzUyODoxOiAoICggcnVsZVhJbXBvcnRTZWN0aW9uICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjM1Mjk6MjogKCBydWxlWEltcG9ydFNlY3Rpb24gKQogICAgICAgICAgICAgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjIxOTE6MjogKCBydWxlWEltcG9ydFNlY3Rpb24gKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjIxOTI6MzogcnVsZVhJbXBvcnRTZWN0aW9uCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMzUyOToyOiAoIHJ1bGVYSW1wb3J0U2VjdGlvbiApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMzUzMDozOiBydWxlWEltcG9ydFNlY3Rpb24KICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YUludGVyY2hhbmdlTW9kZWxBY2Nlc3MoKS5nZXRJbXBvcnRTZWN0aW9uWEltcG9ydFNlY3Rpb25QYXJzZXJSdWxlQ2FsbF8wXzAoKSk7IApAQCAtNzMwMzUsMTcgKzc3NDkyLDE3IEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fRGF0YUludGVyY2hhbmdlTW9kZWxfX1BhY2thZ2VzQXNzaWdubWVudF8xIgotICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIyMjAxOjE6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZU1vZGVsX19QYWNrYWdlc0Fzc2lnbm1lbnRfMSA6ICggcnVsZURhdGFJbnRlcmNoYW5nZVBhY2thZ2UgKSA7CisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjM1Mzk6MTogcnVsZV9fRGF0YUludGVyY2hhbmdlTW9kZWxfX1BhY2thZ2VzQXNzaWdubWVudF8xIDogKCBydWxlRGF0YUludGVyY2hhbmdlUGFja2FnZSApIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19EYXRhSW50ZXJjaGFuZ2VNb2RlbF9fUGFja2FnZXNBc3NpZ25tZW50XzEoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjIyMDU6MTogKCAoIHJ1bGVEYXRhSW50ZXJjaGFuZ2VQYWNrYWdlICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjIyMDY6MjogKCBydWxlRGF0YUludGVyY2hhbmdlUGFja2FnZSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMzU0MzoxOiAoICggcnVsZURhdGFJbnRlcmNoYW5nZVBhY2thZ2UgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMzU0NDoyOiAoIHJ1bGVEYXRhSW50ZXJjaGFuZ2VQYWNrYWdlICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIyMjA2OjI6ICggcnVsZURhdGFJbnRlcmNoYW5nZVBhY2thZ2UgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjIyMDc6MzogcnVsZURhdGFJbnRlcmNoYW5nZVBhY2thZ2UKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIzNTQ0OjI6ICggcnVsZURhdGFJbnRlcmNoYW5nZVBhY2thZ2UgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjM1NDU6MzogcnVsZURhdGFJbnRlcmNoYW5nZVBhY2thZ2UKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YUludGVyY2hhbmdlTW9kZWxBY2Nlc3MoKS5nZXRQYWNrYWdlc0RhdGFJbnRlcmNoYW5nZVBhY2thZ2VQYXJzZXJSdWxlQ2FsbF8xXzAoKSk7IApAQCAtNzMwODAsMTcgKzc3NTM3LDE3IEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fRGF0YUludGVyY2hhbmdlUGFja2FnZV9fTmFtZUFzc2lnbm1lbnRfMiIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMjIxNjoxOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VQYWNrYWdlX19OYW1lQXNzaWdubWVudF8yIDogKCBydWxlUXVhbGlmaWVkTmFtZSApIDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMzU1NDoxOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VQYWNrYWdlX19OYW1lQXNzaWdubWVudF8yIDogKCBydWxlUXVhbGlmaWVkTmFtZSApIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19EYXRhSW50ZXJjaGFuZ2VQYWNrYWdlX19OYW1lQXNzaWdubWVudF8yKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIyMjIwOjE6ICggKCBydWxlUXVhbGlmaWVkTmFtZSApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIyMjIxOjI6ICggcnVsZVF1YWxpZmllZE5hbWUgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjM1NTg6MTogKCAoIHJ1bGVRdWFsaWZpZWROYW1lICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjM1NTk6MjogKCBydWxlUXVhbGlmaWVkTmFtZSApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMjIyMToyOiAoIHJ1bGVRdWFsaWZpZWROYW1lICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIyMjIyOjM6IHJ1bGVRdWFsaWZpZWROYW1lCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMzU1OToyOiAoIHJ1bGVRdWFsaWZpZWROYW1lICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIzNTYwOjM6IHJ1bGVRdWFsaWZpZWROYW1lCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldERhdGFJbnRlcmNoYW5nZVBhY2thZ2VBY2Nlc3MoKS5nZXROYW1lUXVhbGlmaWVkTmFtZVBhcnNlclJ1bGVDYWxsXzJfMCgpKTsgCkBAIC03MzEyNSwxNyArNzc1ODIsMTcgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19EYXRhSW50ZXJjaGFuZ2VQYWNrYWdlX19UaXRsZUFzc2lnbm1lbnRfNCIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMjIzMToxOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VQYWNrYWdlX19UaXRsZUFzc2lnbm1lbnRfNCA6ICggcnVsZVRSQU5TTEFUQUJMRVNUUklORyApIDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMzU2OToxOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VQYWNrYWdlX19UaXRsZUFzc2lnbm1lbnRfNCA6ICggcnVsZVRSQU5TTEFUQUJMRVNUUklORyApIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19EYXRhSW50ZXJjaGFuZ2VQYWNrYWdlX19UaXRsZUFzc2lnbm1lbnRfNCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMjIzNToxOiAoICggcnVsZVRSQU5TTEFUQUJMRVNUUklORyApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIyMjM2OjI6ICggcnVsZVRSQU5TTEFUQUJMRVNUUklORyApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMzU3MzoxOiAoICggcnVsZVRSQU5TTEFUQUJMRVNUUklORyApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIzNTc0OjI6ICggcnVsZVRSQU5TTEFUQUJMRVNUUklORyApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMjIzNjoyOiAoIHJ1bGVUUkFOU0xBVEFCTEVTVFJJTkcgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjIyMzc6MzogcnVsZVRSQU5TTEFUQUJMRVNUUklORworICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjM1NzQ6MjogKCBydWxlVFJBTlNMQVRBQkxFU1RSSU5HICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIzNTc1OjM6IHJ1bGVUUkFOU0xBVEFCTEVTVFJJTkcKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YUludGVyY2hhbmdlUGFja2FnZUFjY2VzcygpLmdldFRpdGxlVFJBTlNMQVRBQkxFU1RSSU5HUGFyc2VyUnVsZUNhbGxfNF8wKCkpOyAKQEAgLTczMTcwLDE3ICs3NzYyNywxNyBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX0RhdGFJbnRlcmNoYW5nZVBhY2thZ2VfX0RhdEludHNBc3NpZ25tZW50XzVfMSIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMjI0NjoxOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VQYWNrYWdlX19EYXRJbnRzQXNzaWdubWVudF81XzEgOiAoIHJ1bGVEYXRhSW50ZXJjaGFuZ2UgKSA7CisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjM1ODQ6MTogcnVsZV9fRGF0YUludGVyY2hhbmdlUGFja2FnZV9fRGF0SW50c0Fzc2lnbm1lbnRfNV8xIDogKCBydWxlRGF0YUludGVyY2hhbmdlICkgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZVBhY2thZ2VfX0RhdEludHNBc3NpZ25tZW50XzVfMSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMjI1MDoxOiAoICggcnVsZURhdGFJbnRlcmNoYW5nZSApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIyMjUxOjI6ICggcnVsZURhdGFJbnRlcmNoYW5nZSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMzU4ODoxOiAoICggcnVsZURhdGFJbnRlcmNoYW5nZSApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIzNTg5OjI6ICggcnVsZURhdGFJbnRlcmNoYW5nZSApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMjI1MToyOiAoIHJ1bGVEYXRhSW50ZXJjaGFuZ2UgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjIyNTI6MzogcnVsZURhdGFJbnRlcmNoYW5nZQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjM1ODk6MjogKCBydWxlRGF0YUludGVyY2hhbmdlICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIzNTkwOjM6IHJ1bGVEYXRhSW50ZXJjaGFuZ2UKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YUludGVyY2hhbmdlUGFja2FnZUFjY2VzcygpLmdldERhdEludHNEYXRhSW50ZXJjaGFuZ2VQYXJzZXJSdWxlQ2FsbF81XzFfMCgpKTsgCkBAIC03MzIxNSwxNyArNzc2NzIsMTcgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19EYXRhSW50ZXJjaGFuZ2VfX05hbWVBc3NpZ25tZW50XzIiCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjIyNjE6MTogcnVsZV9fRGF0YUludGVyY2hhbmdlX19OYW1lQXNzaWdubWVudF8yIDogKCBydWxlVFJBTlNMQVRBQkxFSUQgKSA7CisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjM1OTk6MTogcnVsZV9fRGF0YUludGVyY2hhbmdlX19OYW1lQXNzaWdubWVudF8yIDogKCBydWxlVFJBTlNMQVRBQkxFSUQgKSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fRGF0YUludGVyY2hhbmdlX19OYW1lQXNzaWdubWVudF8yKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIyMjY1OjE6ICggKCBydWxlVFJBTlNMQVRBQkxFSUQgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMjI2NjoyOiAoIHJ1bGVUUkFOU0xBVEFCTEVJRCApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMzYwMzoxOiAoICggcnVsZVRSQU5TTEFUQUJMRUlEICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjM2MDQ6MjogKCBydWxlVFJBTlNMQVRBQkxFSUQgKQogICAgICAgICAgICAgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjIyNjY6MjogKCBydWxlVFJBTlNMQVRBQkxFSUQgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjIyNjc6MzogcnVsZVRSQU5TTEFUQUJMRUlECisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMzYwNDoyOiAoIHJ1bGVUUkFOU0xBVEFCTEVJRCApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMzYwNTozOiBydWxlVFJBTlNMQVRBQkxFSUQKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YUludGVyY2hhbmdlQWNjZXNzKCkuZ2V0TmFtZVRSQU5TTEFUQUJMRUlEUGFyc2VyUnVsZUNhbGxfMl8wKCkpOyAKQEAgLTczMjYwLDI4ICs3NzcxNywyOCBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX0RhdGFJbnRlcmNoYW5nZV9fRGVzY3JpcHRpb25Bc3NpZ25tZW50XzNfMCIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMjI3NjoxOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VfX0Rlc2NyaXB0aW9uQXNzaWdubWVudF8zXzAgOiAoICggJ2Rlc2NyaWJlZEJ5JyApICkgOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIzNjE0OjE6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZV9fRGVzY3JpcHRpb25Bc3NpZ25tZW50XzNfMCA6ICggKCAnZGVzY3JpYmVkQnknICkgKSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fRGF0YUludGVyY2hhbmdlX19EZXNjcmlwdGlvbkFzc2lnbm1lbnRfM18wKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIyMjgwOjE6ICggKCAoICdkZXNjcmliZWRCeScgKSApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIyMjgxOjI6ICggKCAnZGVzY3JpYmVkQnknICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjM2MTg6MTogKCAoICggJ2Rlc2NyaWJlZEJ5JyApICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjM2MTk6MjogKCAoICdkZXNjcmliZWRCeScgKSApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMjI4MToyOiAoICggJ2Rlc2NyaWJlZEJ5JyApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIyMjgyOjM6ICggJ2Rlc2NyaWJlZEJ5JyApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMzYxOToyOiAoICggJ2Rlc2NyaWJlZEJ5JyApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIzNjIwOjM6ICggJ2Rlc2NyaWJlZEJ5JyApCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldERhdGFJbnRlcmNoYW5nZUFjY2VzcygpLmdldERlc2NyaXB0aW9uRGVzY3JpYmVkQnlLZXl3b3JkXzNfMF8wKCkpOyAKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIyMjgzOjM6ICggJ2Rlc2NyaWJlZEJ5JyApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMjI4NDo0OiAnZGVzY3JpYmVkQnknCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMzYyMTozOiAoICdkZXNjcmliZWRCeScgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjM2MjI6NDogJ2Rlc2NyaWJlZEJ5JwogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXREYXRhSW50ZXJjaGFuZ2VBY2Nlc3MoKS5nZXREZXNjcmlwdGlvbkRlc2NyaWJlZEJ5S2V5d29yZF8zXzBfMCgpKTsgCiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBtYXRjaChpbnB1dCwxMzksRk9MTE9XXzIpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOworICAgICAgICAgICAgbWF0Y2goaW5wdXQsMTQ5LEZPTExPV18yKTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXREYXRhSW50ZXJjaGFuZ2VBY2Nlc3MoKS5nZXREZXNjcmlwdGlvbkRlc2NyaWJlZEJ5S2V5d29yZF8zXzBfMCgpKTsgCiAgICAgICAgICAgICB9CkBAIC03MzMxMywxNyArNzc3NzAsMTcgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19EYXRhSW50ZXJjaGFuZ2VfX0Rlc2NyaXB0aW9uVmFsdWVBc3NpZ25tZW50XzNfMSIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMjI5NToxOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VfX0Rlc2NyaXB0aW9uVmFsdWVBc3NpZ25tZW50XzNfMSA6ICggcnVsZVRSQU5TTEFUQUJMRVNUUklORyApIDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMzYzMzoxOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VfX0Rlc2NyaXB0aW9uVmFsdWVBc3NpZ25tZW50XzNfMSA6ICggcnVsZVRSQU5TTEFUQUJMRVNUUklORyApIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19EYXRhSW50ZXJjaGFuZ2VfX0Rlc2NyaXB0aW9uVmFsdWVBc3NpZ25tZW50XzNfMSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMjI5OToxOiAoICggcnVsZVRSQU5TTEFUQUJMRVNUUklORyApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIyMzAwOjI6ICggcnVsZVRSQU5TTEFUQUJMRVNUUklORyApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMzYzNzoxOiAoICggcnVsZVRSQU5TTEFUQUJMRVNUUklORyApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIzNjM4OjI6ICggcnVsZVRSQU5TTEFUQUJMRVNUUklORyApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMjMwMDoyOiAoIHJ1bGVUUkFOU0xBVEFCTEVTVFJJTkcgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjIzMDE6MzogcnVsZVRSQU5TTEFUQUJMRVNUUklORworICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjM2Mzg6MjogKCBydWxlVFJBTlNMQVRBQkxFU1RSSU5HICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIzNjM5OjM6IHJ1bGVUUkFOU0xBVEFCTEVTVFJJTkcKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YUludGVyY2hhbmdlQWNjZXNzKCkuZ2V0RGVzY3JpcHRpb25WYWx1ZVRSQU5TTEFUQUJMRVNUUklOR1BhcnNlclJ1bGVDYWxsXzNfMV8wKCkpOyAKQEAgLTczMzU4LDE3ICs3NzgxNSwxNyBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX0RhdGFJbnRlcmNoYW5nZV9fTW9kZUFzc2lnbm1lbnRfNCIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMjMxMDoxOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VfX01vZGVBc3NpZ25tZW50XzQgOiAoIHJ1bGVFbnRpdHlNYW5hZ2VyTW9kZSApIDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMzY0ODoxOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VfX01vZGVBc3NpZ25tZW50XzQgOiAoIHJ1bGVFbnRpdHlNYW5hZ2VyTW9kZSApIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19EYXRhSW50ZXJjaGFuZ2VfX01vZGVBc3NpZ25tZW50XzQoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjIzMTQ6MTogKCAoIHJ1bGVFbnRpdHlNYW5hZ2VyTW9kZSApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIyMzE1OjI6ICggcnVsZUVudGl0eU1hbmFnZXJNb2RlICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIzNjUyOjE6ICggKCBydWxlRW50aXR5TWFuYWdlck1vZGUgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMzY1MzoyOiAoIHJ1bGVFbnRpdHlNYW5hZ2VyTW9kZSApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMjMxNToyOiAoIHJ1bGVFbnRpdHlNYW5hZ2VyTW9kZSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMjMxNjozOiBydWxlRW50aXR5TWFuYWdlck1vZGUKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIzNjUzOjI6ICggcnVsZUVudGl0eU1hbmFnZXJNb2RlICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIzNjU0OjM6IHJ1bGVFbnRpdHlNYW5hZ2VyTW9kZQogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXREYXRhSW50ZXJjaGFuZ2VBY2Nlc3MoKS5nZXRNb2RlRW50aXR5TWFuYWdlck1vZGVFbnVtUnVsZUNhbGxfNF8wKCkpOyAKQEAgLTczNDAzLDE3ICs3Nzg2MCwxNyBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX0RhdGFJbnRlcmNoYW5nZV9fVmVjdG9yTmFtZUFzc2lnbm1lbnRfNV8xIgotICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIyMzI1OjE6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZV9fVmVjdG9yTmFtZUFzc2lnbm1lbnRfNV8xIDogKCBSVUxFX1NUUklORyApIDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMzY2MzoxOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VfX1ZlY3Rvck5hbWVBc3NpZ25tZW50XzVfMSA6ICggUlVMRV9TVFJJTkcgKSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fRGF0YUludGVyY2hhbmdlX19WZWN0b3JOYW1lQXNzaWdubWVudF81XzEoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjIzMjk6MTogKCAoIFJVTEVfU1RSSU5HICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjIzMzA6MjogKCBSVUxFX1NUUklORyApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMzY2NzoxOiAoICggUlVMRV9TVFJJTkcgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMzY2ODoyOiAoIFJVTEVfU1RSSU5HICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIyMzMwOjI6ICggUlVMRV9TVFJJTkcgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjIzMzE6MzogUlVMRV9TVFJJTkcKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIzNjY4OjI6ICggUlVMRV9TVFJJTkcgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjM2Njk6MzogUlVMRV9TVFJJTkcKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YUludGVyY2hhbmdlQWNjZXNzKCkuZ2V0VmVjdG9yTmFtZVNUUklOR1Rlcm1pbmFsUnVsZUNhbGxfNV8xXzAoKSk7IApAQCAtNzM0NDQsMjggKzc3OTAxLDI4IEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fRGF0YUludGVyY2hhbmdlX19DcmVhdGVSZXBvcnRBc3NpZ25tZW50XzYiCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjIzNDA6MTogcnVsZV9fRGF0YUludGVyY2hhbmdlX19DcmVhdGVSZXBvcnRBc3NpZ25tZW50XzYgOiAoICggJ3JlcG9ydCcgKSApIDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMzY3ODoxOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VfX0NyZWF0ZVJlcG9ydEFzc2lnbm1lbnRfNiA6ICggKCAncmVwb3J0JyApICkgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZV9fQ3JlYXRlUmVwb3J0QXNzaWdubWVudF82KCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIyMzQ0OjE6ICggKCAoICdyZXBvcnQnICkgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMjM0NToyOiAoICggJ3JlcG9ydCcgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMzY4MjoxOiAoICggKCAncmVwb3J0JyApICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjM2ODM6MjogKCAoICdyZXBvcnQnICkgKQogICAgICAgICAgICAgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjIzNDU6MjogKCAoICdyZXBvcnQnICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjIzNDY6MzogKCAncmVwb3J0JyApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMzY4MzoyOiAoICggJ3JlcG9ydCcgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMzY4NDozOiAoICdyZXBvcnQnICkKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YUludGVyY2hhbmdlQWNjZXNzKCkuZ2V0Q3JlYXRlUmVwb3J0UmVwb3J0S2V5d29yZF82XzAoKSk7IAogICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjIzNDc6MzogKCAncmVwb3J0JyApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMjM0ODo0OiAncmVwb3J0JworICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjM2ODU6MzogKCAncmVwb3J0JyApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMzY4Njo0OiAncmVwb3J0JwogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXREYXRhSW50ZXJjaGFuZ2VBY2Nlc3MoKS5nZXRDcmVhdGVSZXBvcnRSZXBvcnRLZXl3b3JkXzZfMCgpKTsgCiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBtYXRjaChpbnB1dCwxNDAsRk9MTE9XXzIpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOworICAgICAgICAgICAgbWF0Y2goaW5wdXQsMTUwLEZPTExPV18yKTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXREYXRhSW50ZXJjaGFuZ2VBY2Nlc3MoKS5nZXRDcmVhdGVSZXBvcnRSZXBvcnRLZXl3b3JkXzZfMCgpKTsgCiAgICAgICAgICAgICB9CkBAIC03MzQ5NywxNyArNzc5NTQsMTcgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19EYXRhSW50ZXJjaGFuZ2VfX0VsZW1lbnRTaXplQXNzaWdubWVudF83XzEiCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjIzNTk6MTogcnVsZV9fRGF0YUludGVyY2hhbmdlX19FbGVtZW50U2l6ZUFzc2lnbm1lbnRfN18xIDogKCBSVUxFX0lOVCApIDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMzY5NzoxOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VfX0VsZW1lbnRTaXplQXNzaWdubWVudF83XzEgOiAoIFJVTEVfSU5UICkgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZV9fRWxlbWVudFNpemVBc3NpZ25tZW50XzdfMSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMjM2MzoxOiAoICggUlVMRV9JTlQgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMjM2NDoyOiAoIFJVTEVfSU5UICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIzNzAxOjE6ICggKCBSVUxFX0lOVCApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIzNzAyOjI6ICggUlVMRV9JTlQgKQogICAgICAgICAgICAgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjIzNjQ6MjogKCBSVUxFX0lOVCApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMjM2NTozOiBSVUxFX0lOVAorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjM3MDI6MjogKCBSVUxFX0lOVCApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMzcwMzozOiBSVUxFX0lOVAogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXREYXRhSW50ZXJjaGFuZ2VBY2Nlc3MoKS5nZXRFbGVtZW50U2l6ZUlOVFRlcm1pbmFsUnVsZUNhbGxfN18xXzAoKSk7IApAQCAtNzM1MzcsMjEgKzc3OTk0LDc0IEBACiAgICAgLy8gJEFOVExSIGVuZCAicnVsZV9fRGF0YUludGVyY2hhbmdlX19FbGVtZW50U2l6ZUFzc2lnbm1lbnRfN18xIgogCiAKLSAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX0RhdGFJbnRlcmNoYW5nZV9fRmlsZUVuZHBvaW50QXNzaWdubWVudF85IgotICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIyMzc0OjE6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZV9fRmlsZUVuZHBvaW50QXNzaWdubWVudF85IDogKCBydWxlRGF0YUludGVyY2hhbmdlRmlsZSApIDsKLSAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19EYXRhSW50ZXJjaGFuZ2VfX0ZpbGVFbmRwb2ludEFzc2lnbm1lbnRfOSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19EYXRhSW50ZXJjaGFuZ2VfX0RlbGV0ZUZpbGVBZnRlckltcG9ydEFzc2lnbm1lbnRfOCIKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMzcxMjoxOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VfX0RlbGV0ZUZpbGVBZnRlckltcG9ydEFzc2lnbm1lbnRfOCA6ICggKCAnZGVsZXRlRmlsZUFmdGVySW1wb3J0JyApICkgOworICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZV9fRGVsZXRlRmlsZUFmdGVySW1wb3J0QXNzaWdubWVudF84KCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIyMzc4OjE6ICggKCBydWxlRGF0YUludGVyY2hhbmdlRmlsZSApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIyMzc5OjI6ICggcnVsZURhdGFJbnRlcmNoYW5nZUZpbGUgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjM3MTY6MTogKCAoICggJ2RlbGV0ZUZpbGVBZnRlckltcG9ydCcgKSApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIzNzE3OjI6ICggKCAnZGVsZXRlRmlsZUFmdGVySW1wb3J0JyApICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIyMzc5OjI6ICggcnVsZURhdGFJbnRlcmNoYW5nZUZpbGUgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjIzODA6MzogcnVsZURhdGFJbnRlcmNoYW5nZUZpbGUKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIzNzE3OjI6ICggKCAnZGVsZXRlRmlsZUFmdGVySW1wb3J0JyApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIzNzE4OjM6ICggJ2RlbGV0ZUZpbGVBZnRlckltcG9ydCcgKQogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7Ci0gICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXREYXRhSW50ZXJjaGFuZ2VBY2Nlc3MoKS5nZXRGaWxlRW5kcG9pbnREYXRhSW50ZXJjaGFuZ2VGaWxlUGFyc2VyUnVsZUNhbGxfOV8wKCkpOyAKKyAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldERhdGFJbnRlcmNoYW5nZUFjY2VzcygpLmdldERlbGV0ZUZpbGVBZnRlckltcG9ydERlbGV0ZUZpbGVBZnRlckltcG9ydEtleXdvcmRfOF8wKCkpOyAKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIzNzE5OjM6ICggJ2RlbGV0ZUZpbGVBZnRlckltcG9ydCcgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjM3MjA6NDogJ2RlbGV0ZUZpbGVBZnRlckltcG9ydCcKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YUludGVyY2hhbmdlQWNjZXNzKCkuZ2V0RGVsZXRlRmlsZUFmdGVySW1wb3J0RGVsZXRlRmlsZUFmdGVySW1wb3J0S2V5d29yZF84XzAoKSk7IAorICAgICAgICAgICAgfQorICAgICAgICAgICAgbWF0Y2goaW5wdXQsMTUxLEZPTExPV18yKTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXREYXRhSW50ZXJjaGFuZ2VBY2Nlc3MoKS5nZXREZWxldGVGaWxlQWZ0ZXJJbXBvcnREZWxldGVGaWxlQWZ0ZXJJbXBvcnRLZXl3b3JkXzhfMCgpKTsgCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBhZnRlcihncmFtbWFyQWNjZXNzLmdldERhdGFJbnRlcmNoYW5nZUFjY2VzcygpLmdldERlbGV0ZUZpbGVBZnRlckltcG9ydERlbGV0ZUZpbGVBZnRlckltcG9ydEtleXdvcmRfOF8wKCkpOyAKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgIH0KKworICAgICAgICB9CisgICAgICAgIGNhdGNoIChSZWNvZ25pdGlvbkV4Y2VwdGlvbiByZSkgeworICAgICAgICAgICAgcmVwb3J0RXJyb3IocmUpOworICAgICAgICAgICAgcmVjb3ZlcihpbnB1dCxyZSk7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisKKyAgICAgICAgICAgIAlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7CisKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gOworICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJydWxlX19EYXRhSW50ZXJjaGFuZ2VfX0RlbGV0ZUZpbGVBZnRlckltcG9ydEFzc2lnbm1lbnRfOCIKKworCisgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19EYXRhSW50ZXJjaGFuZ2VfX0ZpbGVFbmRwb2ludEFzc2lnbm1lbnRfMTAiCisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjM3MzE6MTogcnVsZV9fRGF0YUludGVyY2hhbmdlX19GaWxlRW5kcG9pbnRBc3NpZ25tZW50XzEwIDogKCBydWxlRGF0YUludGVyY2hhbmdlRmlsZSApIDsKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19EYXRhSW50ZXJjaGFuZ2VfX0ZpbGVFbmRwb2ludEFzc2lnbm1lbnRfMTAoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworCisgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICAgICAgCQorICAgICAgICB0cnkgeworICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjM3MzU6MTogKCAoIHJ1bGVEYXRhSW50ZXJjaGFuZ2VGaWxlICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjM3MzY6MjogKCBydWxlRGF0YUludGVyY2hhbmdlRmlsZSApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMzczNjoyOiAoIHJ1bGVEYXRhSW50ZXJjaGFuZ2VGaWxlICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIzNzM3OjM6IHJ1bGVEYXRhSW50ZXJjaGFuZ2VGaWxlCisgICAgICAgICAgICB7CisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldERhdGFJbnRlcmNoYW5nZUFjY2VzcygpLmdldEZpbGVFbmRwb2ludERhdGFJbnRlcmNoYW5nZUZpbGVQYXJzZXJSdWxlQ2FsbF8xMF8wKCkpOyAKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzIpOwogICAgICAgICAgICAgcnVsZURhdGFJbnRlcmNoYW5nZUZpbGUoKTsKQEAgLTczNTU5LDcgKzc4MDY5LDcgQEAKICAgICAgICAgICAgIHN0YXRlLl9mc3AtLTsKICAgICAgICAgICAgIGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKLSAgICAgICAgICAgICAgIGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YUludGVyY2hhbmdlQWNjZXNzKCkuZ2V0RmlsZUVuZHBvaW50RGF0YUludGVyY2hhbmdlRmlsZVBhcnNlclJ1bGVDYWxsXzlfMCgpKTsgCisgICAgICAgICAgICAgICBhZnRlcihncmFtbWFyQWNjZXNzLmdldERhdGFJbnRlcmNoYW5nZUFjY2VzcygpLmdldEZpbGVFbmRwb2ludERhdGFJbnRlcmNoYW5nZUZpbGVQYXJzZXJSdWxlQ2FsbF8xMF8wKCkpOyAKICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgfQpAQCAtNzM1NzksMjQgKzc4MDg5LDI0IEBACiAgICAgICAgIH0KICAgICAgICAgcmV0dXJuIDsKICAgICB9Ci0gICAgLy8gJEFOVExSIGVuZCAicnVsZV9fRGF0YUludGVyY2hhbmdlX19GaWxlRW5kcG9pbnRBc3NpZ25tZW50XzkiCisgICAgLy8gJEFOVExSIGVuZCAicnVsZV9fRGF0YUludGVyY2hhbmdlX19GaWxlRW5kcG9pbnRBc3NpZ25tZW50XzEwIgogCiAKLSAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX0RhdGFJbnRlcmNoYW5nZV9fUGF0aEFzc2lnbm1lbnRfMTIiCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjIzODk6MTogcnVsZV9fRGF0YUludGVyY2hhbmdlX19QYXRoQXNzaWdubWVudF8xMiA6ICggcnVsZURhdGFJbnRlcmNoYW5nZUJlYW4gKSA7Ci0gICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fRGF0YUludGVyY2hhbmdlX19QYXRoQXNzaWdubWVudF8xMigpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19EYXRhSW50ZXJjaGFuZ2VfX1BhdGhBc3NpZ25tZW50XzEzIgorICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIzNzQ2OjE6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZV9fUGF0aEFzc2lnbm1lbnRfMTMgOiAoIHJ1bGVEYXRhSW50ZXJjaGFuZ2VCZWFuICkgOworICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZV9fUGF0aEFzc2lnbm1lbnRfMTMoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjIzOTM6MTogKCAoIHJ1bGVEYXRhSW50ZXJjaGFuZ2VCZWFuICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjIzOTQ6MjogKCBydWxlRGF0YUludGVyY2hhbmdlQmVhbiApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMzc1MDoxOiAoICggcnVsZURhdGFJbnRlcmNoYW5nZUJlYW4gKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMzc1MToyOiAoIHJ1bGVEYXRhSW50ZXJjaGFuZ2VCZWFuICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIyMzk0OjI6ICggcnVsZURhdGFJbnRlcmNoYW5nZUJlYW4gKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjIzOTU6MzogcnVsZURhdGFJbnRlcmNoYW5nZUJlYW4KKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIzNzUxOjI6ICggcnVsZURhdGFJbnRlcmNoYW5nZUJlYW4gKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjM3NTI6MzogcnVsZURhdGFJbnRlcmNoYW5nZUJlYW4KICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewotICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YUludGVyY2hhbmdlQWNjZXNzKCkuZ2V0UGF0aERhdGFJbnRlcmNoYW5nZUJlYW5QYXJzZXJSdWxlQ2FsbF8xMl8wKCkpOyAKKyAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldERhdGFJbnRlcmNoYW5nZUFjY2VzcygpLmdldFBhdGhEYXRhSW50ZXJjaGFuZ2VCZWFuUGFyc2VyUnVsZUNhbGxfMTNfMCgpKTsgCiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV18yKTsKICAgICAgICAgICAgIHJ1bGVEYXRhSW50ZXJjaGFuZ2VCZWFuKCk7CkBAIC03MzYwNCw3ICs3ODExNCw3IEBACiAgICAgICAgICAgICBzdGF0ZS5fZnNwLS07CiAgICAgICAgICAgICBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOwogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7Ci0gICAgICAgICAgICAgICBhZnRlcihncmFtbWFyQWNjZXNzLmdldERhdGFJbnRlcmNoYW5nZUFjY2VzcygpLmdldFBhdGhEYXRhSW50ZXJjaGFuZ2VCZWFuUGFyc2VyUnVsZUNhbGxfMTJfMCgpKTsgCisgICAgICAgICAgICAgICBhZnRlcihncmFtbWFyQWNjZXNzLmdldERhdGFJbnRlcmNoYW5nZUFjY2VzcygpLmdldFBhdGhEYXRhSW50ZXJjaGFuZ2VCZWFuUGFyc2VyUnVsZUNhbGxfMTNfMCgpKTsgCiAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIH0KQEAgLTczNjI0LDIxICs3ODEzNCwyMSBAQAogICAgICAgICB9CiAgICAgICAgIHJldHVybiA7CiAgICAgfQotICAgIC8vICRBTlRMUiBlbmQgInJ1bGVfX0RhdGFJbnRlcmNoYW5nZV9fUGF0aEFzc2lnbm1lbnRfMTIiCisgICAgLy8gJEFOVExSIGVuZCAicnVsZV9fRGF0YUludGVyY2hhbmdlX19QYXRoQXNzaWdubWVudF8xMyIKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19EYXRhSW50ZXJjaGFuZ2VGaWxlWE1MX19GaWxlVVJMQXNzaWdubWVudF8yIgotICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIyNDA0OjE6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbGVYTUxfX0ZpbGVVUkxBc3NpZ25tZW50XzIgOiAoIFJVTEVfU1RSSU5HICkgOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIzNzYxOjE6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbGVYTUxfX0ZpbGVVUkxBc3NpZ25tZW50XzIgOiAoIFJVTEVfU1RSSU5HICkgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbGVYTUxfX0ZpbGVVUkxBc3NpZ25tZW50XzIoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjI0MDg6MTogKCAoIFJVTEVfU1RSSU5HICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjI0MDk6MjogKCBSVUxFX1NUUklORyApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMzc2NToxOiAoICggUlVMRV9TVFJJTkcgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMzc2NjoyOiAoIFJVTEVfU1RSSU5HICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIyNDA5OjI6ICggUlVMRV9TVFJJTkcgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjI0MTA6MzogUlVMRV9TVFJJTkcKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIzNzY2OjI6ICggUlVMRV9TVFJJTkcgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjM3Njc6MzogUlVMRV9TVFJJTkcKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YUludGVyY2hhbmdlRmlsZVhNTEFjY2VzcygpLmdldEZpbGVVUkxTVFJJTkdUZXJtaW5hbFJ1bGVDYWxsXzJfMCgpKTsgCkBAIC03MzY2OSwyOCArNzgxNzksMjggQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19EYXRhSW50ZXJjaGFuZ2VGaWxlWE1MX19CeUF0dHJpYnV0ZUFzc2lnbm1lbnRfM18wIgotICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIyNDE5OjE6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbGVYTUxfX0J5QXR0cmlidXRlQXNzaWdubWVudF8zXzAgOiAoICggJ21hcEJ5QXR0cmlidXRlJyApICkgOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIzNzc2OjE6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbGVYTUxfX0J5QXR0cmlidXRlQXNzaWdubWVudF8zXzAgOiAoICggJ21hcEJ5QXR0cmlidXRlJyApICkgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbGVYTUxfX0J5QXR0cmlidXRlQXNzaWdubWVudF8zXzAoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjI0MjM6MTogKCAoICggJ21hcEJ5QXR0cmlidXRlJyApICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjI0MjQ6MjogKCAoICdtYXBCeUF0dHJpYnV0ZScgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMzc4MDoxOiAoICggKCAnbWFwQnlBdHRyaWJ1dGUnICkgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMzc4MToyOiAoICggJ21hcEJ5QXR0cmlidXRlJyApICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIyNDI0OjI6ICggKCAnbWFwQnlBdHRyaWJ1dGUnICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjI0MjU6MzogKCAnbWFwQnlBdHRyaWJ1dGUnICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIzNzgxOjI6ICggKCAnbWFwQnlBdHRyaWJ1dGUnICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjM3ODI6MzogKCAnbWFwQnlBdHRyaWJ1dGUnICkKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YUludGVyY2hhbmdlRmlsZVhNTEFjY2VzcygpLmdldEJ5QXR0cmlidXRlTWFwQnlBdHRyaWJ1dGVLZXl3b3JkXzNfMF8wKCkpOyAKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIyNDI2OjM6ICggJ21hcEJ5QXR0cmlidXRlJyApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMjQyNzo0OiAnbWFwQnlBdHRyaWJ1dGUnCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMzc4MzozOiAoICdtYXBCeUF0dHJpYnV0ZScgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjM3ODQ6NDogJ21hcEJ5QXR0cmlidXRlJwogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXREYXRhSW50ZXJjaGFuZ2VGaWxlWE1MQWNjZXNzKCkuZ2V0QnlBdHRyaWJ1dGVNYXBCeUF0dHJpYnV0ZUtleXdvcmRfM18wXzAoKSk7IAogICAgICAgICAgICAgfQotICAgICAgICAgICAgbWF0Y2goaW5wdXQsMTQxLEZPTExPV18yKTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKKyAgICAgICAgICAgIG1hdGNoKGlucHV0LDE1MixGT0xMT1dfMik7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YUludGVyY2hhbmdlRmlsZVhNTEFjY2VzcygpLmdldEJ5QXR0cmlidXRlTWFwQnlBdHRyaWJ1dGVLZXl3b3JkXzNfMF8wKCkpOyAKICAgICAgICAgICAgIH0KQEAgLTczNzIyLDE3ICs3ODIzMiwxNyBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbGVYTUxfX0VuY29kaW5nQXNzaWdubWVudF8zXzFfMSIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMjQzODoxOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VGaWxlWE1MX19FbmNvZGluZ0Fzc2lnbm1lbnRfM18xXzEgOiAoIFJVTEVfU1RSSU5HICkgOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIzNzk1OjE6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbGVYTUxfX0VuY29kaW5nQXNzaWdubWVudF8zXzFfMSA6ICggUlVMRV9TVFJJTkcgKSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fRGF0YUludGVyY2hhbmdlRmlsZVhNTF9fRW5jb2RpbmdBc3NpZ25tZW50XzNfMV8xKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIyNDQyOjE6ICggKCBSVUxFX1NUUklORyApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIyNDQzOjI6ICggUlVMRV9TVFJJTkcgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjM3OTk6MTogKCAoIFJVTEVfU1RSSU5HICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjM4MDA6MjogKCBSVUxFX1NUUklORyApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMjQ0MzoyOiAoIFJVTEVfU1RSSU5HICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIyNDQ0OjM6IFJVTEVfU1RSSU5HCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMzgwMDoyOiAoIFJVTEVfU1RSSU5HICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIzODAxOjM6IFJVTEVfU1RSSU5HCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldERhdGFJbnRlcmNoYW5nZUZpbGVYTUxBY2Nlc3MoKS5nZXRFbmNvZGluZ1NUUklOR1Rlcm1pbmFsUnVsZUNhbGxfM18xXzFfMCgpKTsgCkBAIC03Mzc2MywxNyArNzgyNzMsMTcgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19EYXRhSW50ZXJjaGFuZ2VGaWxlWE1MX19Mb2NhbGVBc3NpZ25tZW50XzNfMl8xIgotICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIyNDUzOjE6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbGVYTUxfX0xvY2FsZUFzc2lnbm1lbnRfM18yXzEgOiAoIFJVTEVfU1RSSU5HICkgOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIzODEwOjE6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbGVYTUxfX0xvY2FsZUFzc2lnbm1lbnRfM18yXzEgOiAoIFJVTEVfU1RSSU5HICkgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbGVYTUxfX0xvY2FsZUFzc2lnbm1lbnRfM18yXzEoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjI0NTc6MTogKCAoIFJVTEVfU1RSSU5HICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjI0NTg6MjogKCBSVUxFX1NUUklORyApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMzgxNDoxOiAoICggUlVMRV9TVFJJTkcgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMzgxNToyOiAoIFJVTEVfU1RSSU5HICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIyNDU4OjI6ICggUlVMRV9TVFJJTkcgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjI0NTk6MzogUlVMRV9TVFJJTkcKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIzODE1OjI6ICggUlVMRV9TVFJJTkcgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjM4MTY6MzogUlVMRV9TVFJJTkcKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YUludGVyY2hhbmdlRmlsZVhNTEFjY2VzcygpLmdldExvY2FsZVNUUklOR1Rlcm1pbmFsUnVsZUNhbGxfM18yXzFfMCgpKTsgCkBAIC03MzgwNCwxNyArNzgzMTQsMTcgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19EYXRhSW50ZXJjaGFuZ2VGaWxlQ1NWX19GaWxlVVJMQXNzaWdubWVudF8yIgotICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIyNDY4OjE6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbGVDU1ZfX0ZpbGVVUkxBc3NpZ25tZW50XzIgOiAoIFJVTEVfU1RSSU5HICkgOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIzODI1OjE6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbGVDU1ZfX0ZpbGVVUkxBc3NpZ25tZW50XzIgOiAoIFJVTEVfU1RSSU5HICkgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbGVDU1ZfX0ZpbGVVUkxBc3NpZ25tZW50XzIoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjI0NzI6MTogKCAoIFJVTEVfU1RSSU5HICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjI0NzM6MjogKCBSVUxFX1NUUklORyApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMzgyOToxOiAoICggUlVMRV9TVFJJTkcgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMzgzMDoyOiAoIFJVTEVfU1RSSU5HICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIyNDczOjI6ICggUlVMRV9TVFJJTkcgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjI0NzQ6MzogUlVMRV9TVFJJTkcKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIzODMwOjI6ICggUlVMRV9TVFJJTkcgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjM4MzE6MzogUlVMRV9TVFJJTkcKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YUludGVyY2hhbmdlRmlsZUNTVkFjY2VzcygpLmdldEZpbGVVUkxTVFJJTkdUZXJtaW5hbFJ1bGVDYWxsXzJfMCgpKTsgCkBAIC03Mzg0NSwxNyArNzgzNTUsMTcgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19EYXRhSW50ZXJjaGFuZ2VGaWxlQ1NWX19EZWxpbWl0ZXJBc3NpZ25tZW50XzNfMF8xIgotICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIyNDgzOjE6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbGVDU1ZfX0RlbGltaXRlckFzc2lnbm1lbnRfM18wXzEgOiAoIFJVTEVfU1RSSU5HICkgOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIzODQwOjE6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbGVDU1ZfX0RlbGltaXRlckFzc2lnbm1lbnRfM18wXzEgOiAoIFJVTEVfU1RSSU5HICkgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbGVDU1ZfX0RlbGltaXRlckFzc2lnbm1lbnRfM18wXzEoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjI0ODc6MTogKCAoIFJVTEVfU1RSSU5HICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjI0ODg6MjogKCBSVUxFX1NUUklORyApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMzg0NDoxOiAoICggUlVMRV9TVFJJTkcgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMzg0NToyOiAoIFJVTEVfU1RSSU5HICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIyNDg4OjI6ICggUlVMRV9TVFJJTkcgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjI0ODk6MzogUlVMRV9TVFJJTkcKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIzODQ1OjI6ICggUlVMRV9TVFJJTkcgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjM4NDY6MzogUlVMRV9TVFJJTkcKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YUludGVyY2hhbmdlRmlsZUNTVkFjY2VzcygpLmdldERlbGltaXRlclNUUklOR1Rlcm1pbmFsUnVsZUNhbGxfM18wXzFfMCgpKTsgCkBAIC03Mzg4NiwxNyArNzgzOTYsMTcgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19EYXRhSW50ZXJjaGFuZ2VGaWxlQ1NWX19RdW90ZUNoYXJhY3RlckFzc2lnbm1lbnRfM18xXzEiCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjI0OTg6MTogcnVsZV9fRGF0YUludGVyY2hhbmdlRmlsZUNTVl9fUXVvdGVDaGFyYWN0ZXJBc3NpZ25tZW50XzNfMV8xIDogKCBSVUxFX1NUUklORyApIDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMzg1NToxOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VGaWxlQ1NWX19RdW90ZUNoYXJhY3RlckFzc2lnbm1lbnRfM18xXzEgOiAoIFJVTEVfU1RSSU5HICkgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbGVDU1ZfX1F1b3RlQ2hhcmFjdGVyQXNzaWdubWVudF8zXzFfMSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMjUwMjoxOiAoICggUlVMRV9TVFJJTkcgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMjUwMzoyOiAoIFJVTEVfU1RSSU5HICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIzODU5OjE6ICggKCBSVUxFX1NUUklORyApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIzODYwOjI6ICggUlVMRV9TVFJJTkcgKQogICAgICAgICAgICAgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjI1MDM6MjogKCBSVUxFX1NUUklORyApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMjUwNDozOiBSVUxFX1NUUklORworICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjM4NjA6MjogKCBSVUxFX1NUUklORyApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMzg2MTozOiBSVUxFX1NUUklORwogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXREYXRhSW50ZXJjaGFuZ2VGaWxlQ1NWQWNjZXNzKCkuZ2V0UXVvdGVDaGFyYWN0ZXJTVFJJTkdUZXJtaW5hbFJ1bGVDYWxsXzNfMV8xXzAoKSk7IApAQCAtNzM5MjcsMTcgKzc4NDM3LDE3IEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fRGF0YUludGVyY2hhbmdlRmlsZUNTVl9fU2tpcExpbmVzQXNzaWdubWVudF8zXzJfMSIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMjUxMzoxOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VGaWxlQ1NWX19Ta2lwTGluZXNBc3NpZ25tZW50XzNfMl8xIDogKCBSVUxFX0lOVCApIDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMzg3MDoxOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VGaWxlQ1NWX19Ta2lwTGluZXNBc3NpZ25tZW50XzNfMl8xIDogKCBSVUxFX0lOVCApIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19EYXRhSW50ZXJjaGFuZ2VGaWxlQ1NWX19Ta2lwTGluZXNBc3NpZ25tZW50XzNfMl8xKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIyNTE3OjE6ICggKCBSVUxFX0lOVCApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIyNTE4OjI6ICggUlVMRV9JTlQgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjM4NzQ6MTogKCAoIFJVTEVfSU5UICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjM4NzU6MjogKCBSVUxFX0lOVCApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMjUxODoyOiAoIFJVTEVfSU5UICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIyNTE5OjM6IFJVTEVfSU5UCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMzg3NToyOiAoIFJVTEVfSU5UICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIzODc2OjM6IFJVTEVfSU5UCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldERhdGFJbnRlcmNoYW5nZUZpbGVDU1ZBY2Nlc3MoKS5nZXRTa2lwTGluZXNJTlRUZXJtaW5hbFJ1bGVDYWxsXzNfMl8xXzAoKSk7IApAQCAtNzM5NjgsMjggKzc4NDc4LDI4IEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fRGF0YUludGVyY2hhbmdlRmlsZUNTVl9fSW5kZW50QXNzaWdubWVudF8zXzMiCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjI1Mjg6MTogcnVsZV9fRGF0YUludGVyY2hhbmdlRmlsZUNTVl9fSW5kZW50QXNzaWdubWVudF8zXzMgOiAoICggJ2luZGVudCcgKSApIDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMzg4NToxOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VGaWxlQ1NWX19JbmRlbnRBc3NpZ25tZW50XzNfMyA6ICggKCAnaW5kZW50JyApICkgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbGVDU1ZfX0luZGVudEFzc2lnbm1lbnRfM18zKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIyNTMyOjE6ICggKCAoICdpbmRlbnQnICkgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMjUzMzoyOiAoICggJ2luZGVudCcgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMzg4OToxOiAoICggKCAnaW5kZW50JyApICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjM4OTA6MjogKCAoICdpbmRlbnQnICkgKQogICAgICAgICAgICAgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjI1MzM6MjogKCAoICdpbmRlbnQnICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjI1MzQ6MzogKCAnaW5kZW50JyApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMzg5MDoyOiAoICggJ2luZGVudCcgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMzg5MTozOiAoICdpbmRlbnQnICkKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YUludGVyY2hhbmdlRmlsZUNTVkFjY2VzcygpLmdldEluZGVudEluZGVudEtleXdvcmRfM18zXzAoKSk7IAogICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjI1MzU6MzogKCAnaW5kZW50JyApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMjUzNjo0OiAnaW5kZW50JworICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjM4OTI6MzogKCAnaW5kZW50JyApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMzg5Mzo0OiAnaW5kZW50JwogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXREYXRhSW50ZXJjaGFuZ2VGaWxlQ1NWQWNjZXNzKCkuZ2V0SW5kZW50SW5kZW50S2V5d29yZF8zXzNfMCgpKTsgCiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBtYXRjaChpbnB1dCwxNDIsRk9MTE9XXzIpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOworICAgICAgICAgICAgbWF0Y2goaW5wdXQsMTUzLEZPTExPV18yKTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXREYXRhSW50ZXJjaGFuZ2VGaWxlQ1NWQWNjZXNzKCkuZ2V0SW5kZW50SW5kZW50S2V5d29yZF8zXzNfMCgpKTsgCiAgICAgICAgICAgICB9CkBAIC03NDAyMSwxNyArNzg1MzEsMTcgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19EYXRhSW50ZXJjaGFuZ2VGaWxlQ1NWX19FbmNvZGluZ0Fzc2lnbm1lbnRfM180XzEiCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjI1NDc6MTogcnVsZV9fRGF0YUludGVyY2hhbmdlRmlsZUNTVl9fRW5jb2RpbmdBc3NpZ25tZW50XzNfNF8xIDogKCBSVUxFX1NUUklORyApIDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMzkwNDoxOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VGaWxlQ1NWX19FbmNvZGluZ0Fzc2lnbm1lbnRfM180XzEgOiAoIFJVTEVfU1RSSU5HICkgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbGVDU1ZfX0VuY29kaW5nQXNzaWdubWVudF8zXzRfMSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMjU1MToxOiAoICggUlVMRV9TVFJJTkcgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMjU1MjoyOiAoIFJVTEVfU1RSSU5HICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIzOTA4OjE6ICggKCBSVUxFX1NUUklORyApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIzOTA5OjI6ICggUlVMRV9TVFJJTkcgKQogICAgICAgICAgICAgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjI1NTI6MjogKCBSVUxFX1NUUklORyApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMjU1MzozOiBSVUxFX1NUUklORworICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjM5MDk6MjogKCBSVUxFX1NUUklORyApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMzkxMDozOiBSVUxFX1NUUklORwogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXREYXRhSW50ZXJjaGFuZ2VGaWxlQ1NWQWNjZXNzKCkuZ2V0RW5jb2RpbmdTVFJJTkdUZXJtaW5hbFJ1bGVDYWxsXzNfNF8xXzAoKSk7IApAQCAtNzQwNjIsMTcgKzc4NTcyLDE3IEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fRGF0YUludGVyY2hhbmdlRmlsZUNTVl9fTG9jYWxlQXNzaWdubWVudF8zXzVfMSIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMjU2MjoxOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VGaWxlQ1NWX19Mb2NhbGVBc3NpZ25tZW50XzNfNV8xIDogKCBSVUxFX1NUUklORyApIDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMzkxOToxOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VGaWxlQ1NWX19Mb2NhbGVBc3NpZ25tZW50XzNfNV8xIDogKCBSVUxFX1NUUklORyApIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19EYXRhSW50ZXJjaGFuZ2VGaWxlQ1NWX19Mb2NhbGVBc3NpZ25tZW50XzNfNV8xKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIyNTY2OjE6ICggKCBSVUxFX1NUUklORyApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIyNTY3OjI6ICggUlVMRV9TVFJJTkcgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjM5MjM6MTogKCAoIFJVTEVfU1RSSU5HICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjM5MjQ6MjogKCBSVUxFX1NUUklORyApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMjU2NzoyOiAoIFJVTEVfU1RSSU5HICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIyNTY4OjM6IFJVTEVfU1RSSU5HCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMzkyNDoyOiAoIFJVTEVfU1RSSU5HICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIzOTI1OjM6IFJVTEVfU1RSSU5HCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldERhdGFJbnRlcmNoYW5nZUZpbGVDU1ZBY2Nlc3MoKS5nZXRMb2NhbGVTVFJJTkdUZXJtaW5hbFJ1bGVDYWxsXzNfNV8xXzAoKSk7IApAQCAtNzQxMDMsMTcgKzc4NjEzLDE3IEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fRGF0YUludGVyY2hhbmdlRmlsZUVESV9fRmlsZVVSTEFzc2lnbm1lbnRfMiIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMjU3NzoxOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VGaWxlRURJX19GaWxlVVJMQXNzaWdubWVudF8yIDogKCBSVUxFX1NUUklORyApIDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMzkzNDoxOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VGaWxlRURJX19GaWxlVVJMQXNzaWdubWVudF8yIDogKCBSVUxFX1NUUklORyApIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19EYXRhSW50ZXJjaGFuZ2VGaWxlRURJX19GaWxlVVJMQXNzaWdubWVudF8yKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIyNTgxOjE6ICggKCBSVUxFX1NUUklORyApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIyNTgyOjI6ICggUlVMRV9TVFJJTkcgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjM5Mzg6MTogKCAoIFJVTEVfU1RSSU5HICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjM5Mzk6MjogKCBSVUxFX1NUUklORyApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMjU4MjoyOiAoIFJVTEVfU1RSSU5HICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIyNTgzOjM6IFJVTEVfU1RSSU5HCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMzkzOToyOiAoIFJVTEVfU1RSSU5HICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIzOTQwOjM6IFJVTEVfU1RSSU5HCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldERhdGFJbnRlcmNoYW5nZUZpbGVFRElBY2Nlc3MoKS5nZXRGaWxlVVJMU1RSSU5HVGVybWluYWxSdWxlQ2FsbF8yXzAoKSk7IApAQCAtNzQxNDQsMTcgKzc4NjU0LDE3IEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fRGF0YUludGVyY2hhbmdlRmlsZUVESV9fRW5jb2RpbmdBc3NpZ25tZW50XzNfMF8xIgotICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIyNTkyOjE6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbGVFRElfX0VuY29kaW5nQXNzaWdubWVudF8zXzBfMSA6ICggUlVMRV9TVFJJTkcgKSA7CisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjM5NDk6MTogcnVsZV9fRGF0YUludGVyY2hhbmdlRmlsZUVESV9fRW5jb2RpbmdBc3NpZ25tZW50XzNfMF8xIDogKCBSVUxFX1NUUklORyApIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19EYXRhSW50ZXJjaGFuZ2VGaWxlRURJX19FbmNvZGluZ0Fzc2lnbm1lbnRfM18wXzEoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjI1OTY6MTogKCAoIFJVTEVfU1RSSU5HICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjI1OTc6MjogKCBSVUxFX1NUUklORyApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMzk1MzoxOiAoICggUlVMRV9TVFJJTkcgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMzk1NDoyOiAoIFJVTEVfU1RSSU5HICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIyNTk3OjI6ICggUlVMRV9TVFJJTkcgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjI1OTg6MzogUlVMRV9TVFJJTkcKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIzOTU0OjI6ICggUlVMRV9TVFJJTkcgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjM5NTU6MzogUlVMRV9TVFJJTkcKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YUludGVyY2hhbmdlRmlsZUVESUFjY2VzcygpLmdldEVuY29kaW5nU1RSSU5HVGVybWluYWxSdWxlQ2FsbF8zXzBfMV8wKCkpOyAKQEAgLTc0MTg1LDE3ICs3ODY5NSwxNyBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbGVFRElfX0xvY2FsZUFzc2lnbm1lbnRfM18xXzEiCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjI2MDc6MTogcnVsZV9fRGF0YUludGVyY2hhbmdlRmlsZUVESV9fTG9jYWxlQXNzaWdubWVudF8zXzFfMSA6ICggUlVMRV9TVFJJTkcgKSA7CisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjM5NjQ6MTogcnVsZV9fRGF0YUludGVyY2hhbmdlRmlsZUVESV9fTG9jYWxlQXNzaWdubWVudF8zXzFfMSA6ICggUlVMRV9TVFJJTkcgKSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fRGF0YUludGVyY2hhbmdlRmlsZUVESV9fTG9jYWxlQXNzaWdubWVudF8zXzFfMSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMjYxMToxOiAoICggUlVMRV9TVFJJTkcgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMjYxMjoyOiAoIFJVTEVfU1RSSU5HICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIzOTY4OjE6ICggKCBSVUxFX1NUUklORyApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIzOTY5OjI6ICggUlVMRV9TVFJJTkcgKQogICAgICAgICAgICAgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjI2MTI6MjogKCBSVUxFX1NUUklORyApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMjYxMzozOiBSVUxFX1NUUklORworICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjM5Njk6MjogKCBSVUxFX1NUUklORyApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMzk3MDozOiBSVUxFX1NUUklORwogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXREYXRhSW50ZXJjaGFuZ2VGaWxlRURJQWNjZXNzKCkuZ2V0TG9jYWxlU1RSSU5HVGVybWluYWxSdWxlQ2FsbF8zXzFfMV8wKCkpOyAKQEAgLTc0MjI2LDE3ICs3ODczNiwxNyBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbGVFRElfX01hcHBpbmdNb2RlbEFzc2lnbm1lbnRfNSIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMjYyMjoxOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VGaWxlRURJX19NYXBwaW5nTW9kZWxBc3NpZ25tZW50XzUgOiAoIFJVTEVfU1RSSU5HICkgOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIzOTc5OjE6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbGVFRElfX01hcHBpbmdNb2RlbEFzc2lnbm1lbnRfNSA6ICggUlVMRV9TVFJJTkcgKSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fRGF0YUludGVyY2hhbmdlRmlsZUVESV9fTWFwcGluZ01vZGVsQXNzaWdubWVudF81KCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIyNjI2OjE6ICggKCBSVUxFX1NUUklORyApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIyNjI3OjI6ICggUlVMRV9TVFJJTkcgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjM5ODM6MTogKCAoIFJVTEVfU1RSSU5HICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjM5ODQ6MjogKCBSVUxFX1NUUklORyApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMjYyNzoyOiAoIFJVTEVfU1RSSU5HICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIyNjI4OjM6IFJVTEVfU1RSSU5HCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMzk4NDoyOiAoIFJVTEVfU1RSSU5HICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIzOTg1OjM6IFJVTEVfU1RSSU5HCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldERhdGFJbnRlcmNoYW5nZUZpbGVFRElBY2Nlc3MoKS5nZXRNYXBwaW5nTW9kZWxTVFJJTkdUZXJtaW5hbFJ1bGVDYWxsXzVfMCgpKTsgCkBAIC03NDI2NywyOCArNzg3NzcsMjggQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19EYXRhSW50ZXJjaGFuZ2VGaWxlRURJX19WYWxpZGF0ZUFzc2lnbm1lbnRfNiIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMjYzNzoxOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VGaWxlRURJX19WYWxpZGF0ZUFzc2lnbm1lbnRfNiA6ICggKCAndmFsaWRhdGUnICkgKSA7CisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjM5OTQ6MTogcnVsZV9fRGF0YUludGVyY2hhbmdlRmlsZUVESV9fVmFsaWRhdGVBc3NpZ25tZW50XzYgOiAoICggJ3ZhbGlkYXRlJyApICkgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbGVFRElfX1ZhbGlkYXRlQXNzaWdubWVudF82KCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIyNjQxOjE6ICggKCAoICd2YWxpZGF0ZScgKSApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIyNjQyOjI6ICggKCAndmFsaWRhdGUnICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjM5OTg6MTogKCAoICggJ3ZhbGlkYXRlJyApICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjM5OTk6MjogKCAoICd2YWxpZGF0ZScgKSApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMjY0MjoyOiAoICggJ3ZhbGlkYXRlJyApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIyNjQzOjM6ICggJ3ZhbGlkYXRlJyApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMzk5OToyOiAoICggJ3ZhbGlkYXRlJyApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI0MDAwOjM6ICggJ3ZhbGlkYXRlJyApCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldERhdGFJbnRlcmNoYW5nZUZpbGVFRElBY2Nlc3MoKS5nZXRWYWxpZGF0ZVZhbGlkYXRlS2V5d29yZF82XzAoKSk7IAogICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjI2NDQ6MzogKCAndmFsaWRhdGUnICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIyNjQ1OjQ6ICd2YWxpZGF0ZScKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI0MDAxOjM6ICggJ3ZhbGlkYXRlJyApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNDAwMjo0OiAndmFsaWRhdGUnCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldERhdGFJbnRlcmNoYW5nZUZpbGVFRElBY2Nlc3MoKS5nZXRWYWxpZGF0ZVZhbGlkYXRlS2V5d29yZF82XzAoKSk7IAogICAgICAgICAgICAgfQotICAgICAgICAgICAgbWF0Y2goaW5wdXQsMTQzLEZPTExPV18yKTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKKyAgICAgICAgICAgIG1hdGNoKGlucHV0LDE1NCxGT0xMT1dfMik7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YUludGVyY2hhbmdlRmlsZUVESUFjY2VzcygpLmdldFZhbGlkYXRlVmFsaWRhdGVLZXl3b3JkXzZfMCgpKTsgCiAgICAgICAgICAgICB9CkBAIC03NDMyMCwyMyArNzg4MzAsMjMgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19EYXRhSW50ZXJjaGFuZ2VCZWFuX19FbnRpdHlBc3NpZ25tZW50XzIiCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjI2NTY6MTogcnVsZV9fRGF0YUludGVyY2hhbmdlQmVhbl9fRW50aXR5QXNzaWdubWVudF8yIDogKCAoIHJ1bGVMRlFOICkgKSA7CisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjQwMTM6MTogcnVsZV9fRGF0YUludGVyY2hhbmdlQmVhbl9fRW50aXR5QXNzaWdubWVudF8yIDogKCAoIHJ1bGVMRlFOICkgKSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fRGF0YUludGVyY2hhbmdlQmVhbl9fRW50aXR5QXNzaWdubWVudF8yKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIyNjYwOjE6ICggKCAoIHJ1bGVMRlFOICkgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMjY2MToyOiAoICggcnVsZUxGUU4gKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNDAxNzoxOiAoICggKCBydWxlTEZRTiApICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjQwMTg6MjogKCAoIHJ1bGVMRlFOICkgKQogICAgICAgICAgICAgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjI2NjE6MjogKCAoIHJ1bGVMRlFOICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjI2NjI6MzogKCBydWxlTEZRTiApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNDAxODoyOiAoICggcnVsZUxGUU4gKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNDAxOTozOiAoIHJ1bGVMRlFOICkKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YUludGVyY2hhbmdlQmVhbkFjY2VzcygpLmdldEVudGl0eUxFbnRpdHlDcm9zc1JlZmVyZW5jZV8yXzAoKSk7IAogICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjI2NjM6MzogKCBydWxlTEZRTiApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMjY2NDo0OiBydWxlTEZRTgorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjQwMjA6MzogKCBydWxlTEZRTiApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNDAyMTo0OiBydWxlTEZRTgogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXREYXRhSW50ZXJjaGFuZ2VCZWFuQWNjZXNzKCkuZ2V0RW50aXR5TEVudGl0eUxGUU5QYXJzZXJSdWxlQ2FsbF8yXzBfMSgpKTsgCkBAIC03NDM3NywxNyArNzg4ODcsMTcgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19EYXRhSW50ZXJjaGFuZ2VCZWFuX19Ob2RlTmFtZUFzc2lnbm1lbnRfM18xIgotICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIyNjc1OjE6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUJlYW5fX05vZGVOYW1lQXNzaWdubWVudF8zXzEgOiAoIFJVTEVfU1RSSU5HICkgOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI0MDMyOjE6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUJlYW5fX05vZGVOYW1lQXNzaWdubWVudF8zXzEgOiAoIFJVTEVfU1RSSU5HICkgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUJlYW5fX05vZGVOYW1lQXNzaWdubWVudF8zXzEoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjI2Nzk6MTogKCAoIFJVTEVfU1RSSU5HICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjI2ODA6MjogKCBSVUxFX1NUUklORyApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNDAzNjoxOiAoICggUlVMRV9TVFJJTkcgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNDAzNzoyOiAoIFJVTEVfU1RSSU5HICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIyNjgwOjI6ICggUlVMRV9TVFJJTkcgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjI2ODE6MzogUlVMRV9TVFJJTkcKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI0MDM3OjI6ICggUlVMRV9TVFJJTkcgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjQwMzg6MzogUlVMRV9TVFJJTkcKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YUludGVyY2hhbmdlQmVhbkFjY2VzcygpLmdldE5vZGVOYW1lU1RSSU5HVGVybWluYWxSdWxlQ2FsbF8zXzFfMCgpKTsgCkBAIC03NDQxOCwxNyArNzg5MjgsMTcgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19EYXRhSW50ZXJjaGFuZ2VCZWFuX19FbGVtZW50TWFwQXNzaWdubWVudF80XzEiCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjI2OTA6MTogcnVsZV9fRGF0YUludGVyY2hhbmdlQmVhbl9fRWxlbWVudE1hcEFzc2lnbm1lbnRfNF8xIDogKCBSVUxFX1NUUklORyApIDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNDA0NzoxOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VCZWFuX19FbGVtZW50TWFwQXNzaWdubWVudF80XzEgOiAoIFJVTEVfU1RSSU5HICkgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUJlYW5fX0VsZW1lbnRNYXBBc3NpZ25tZW50XzRfMSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMjY5NDoxOiAoICggUlVMRV9TVFJJTkcgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMjY5NToyOiAoIFJVTEVfU1RSSU5HICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI0MDUxOjE6ICggKCBSVUxFX1NUUklORyApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI0MDUyOjI6ICggUlVMRV9TVFJJTkcgKQogICAgICAgICAgICAgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjI2OTU6MjogKCBSVUxFX1NUUklORyApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMjY5NjozOiBSVUxFX1NUUklORworICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjQwNTI6MjogKCBSVUxFX1NUUklORyApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNDA1MzozOiBSVUxFX1NUUklORwogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXREYXRhSW50ZXJjaGFuZ2VCZWFuQWNjZXNzKCkuZ2V0RWxlbWVudE1hcFNUUklOR1Rlcm1pbmFsUnVsZUNhbGxfNF8xXzAoKSk7IApAQCAtNzQ0NTgsMzcgKzc4OTY4LDM3IEBACiAgICAgLy8gJEFOVExSIGVuZCAicnVsZV9fRGF0YUludGVyY2hhbmdlQmVhbl9fRWxlbWVudE1hcEFzc2lnbm1lbnRfNF8xIgogCiAKLSAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX0RhdGFJbnRlcmNoYW5nZUJlYW5fX01hcmtMYXRlc3RBc3NpZ25tZW50XzVfMCIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMjcwNToxOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VCZWFuX19NYXJrTGF0ZXN0QXNzaWdubWVudF81XzAgOiAoICggJ21hcmtlcicgKSApIDsKLSAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19EYXRhSW50ZXJjaGFuZ2VCZWFuX19NYXJrTGF0ZXN0QXNzaWdubWVudF81XzAoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fRGF0YUludGVyY2hhbmdlQmVhbl9fTWFya0xhdGVzdEltcG9ydEFzc2lnbm1lbnRfNV8wIgorICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI0MDYyOjE6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUJlYW5fX01hcmtMYXRlc3RJbXBvcnRBc3NpZ25tZW50XzVfMCA6ICggKCAnbGF0ZXN0SW1wb3J0JyApICkgOworICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUJlYW5fX01hcmtMYXRlc3RJbXBvcnRBc3NpZ25tZW50XzVfMCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMjcwOToxOiAoICggKCAnbWFya2VyJyApICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjI3MTA6MjogKCAoICdtYXJrZXInICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjQwNjY6MTogKCAoICggJ2xhdGVzdEltcG9ydCcgKSApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI0MDY3OjI6ICggKCAnbGF0ZXN0SW1wb3J0JyApICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIyNzEwOjI6ICggKCAnbWFya2VyJyApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIyNzExOjM6ICggJ21hcmtlcicgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjQwNjc6MjogKCAoICdsYXRlc3RJbXBvcnQnICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjQwNjg6MzogKCAnbGF0ZXN0SW1wb3J0JyApCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKLSAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldERhdGFJbnRlcmNoYW5nZUJlYW5BY2Nlc3MoKS5nZXRNYXJrTGF0ZXN0TWFya2VyS2V5d29yZF81XzBfMCgpKTsgCisgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXREYXRhSW50ZXJjaGFuZ2VCZWFuQWNjZXNzKCkuZ2V0TWFya0xhdGVzdEltcG9ydExhdGVzdEltcG9ydEtleXdvcmRfNV8wXzAoKSk7IAogICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjI3MTI6MzogKCAnbWFya2VyJyApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMjcxMzo0OiAnbWFya2VyJworICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjQwNjk6MzogKCAnbGF0ZXN0SW1wb3J0JyApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNDA3MDo0OiAnbGF0ZXN0SW1wb3J0JwogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7Ci0gICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXREYXRhSW50ZXJjaGFuZ2VCZWFuQWNjZXNzKCkuZ2V0TWFya0xhdGVzdE1hcmtlcktleXdvcmRfNV8wXzAoKSk7IAorICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YUludGVyY2hhbmdlQmVhbkFjY2VzcygpLmdldE1hcmtMYXRlc3RJbXBvcnRMYXRlc3RJbXBvcnRLZXl3b3JkXzVfMF8wKCkpOyAKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1hdGNoKGlucHV0LDE0NCxGT0xMT1dfMik7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CisgICAgICAgICAgICBtYXRjaChpbnB1dCwxNTUsRk9MTE9XXzIpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOwogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7Ci0gICAgICAgICAgICAgICBhZnRlcihncmFtbWFyQWNjZXNzLmdldERhdGFJbnRlcmNoYW5nZUJlYW5BY2Nlc3MoKS5nZXRNYXJrTGF0ZXN0TWFya2VyS2V5d29yZF81XzBfMCgpKTsgCisgICAgICAgICAgICAgICBhZnRlcihncmFtbWFyQWNjZXNzLmdldERhdGFJbnRlcmNoYW5nZUJlYW5BY2Nlc3MoKS5nZXRNYXJrTGF0ZXN0SW1wb3J0TGF0ZXN0SW1wb3J0S2V5d29yZF81XzBfMCgpKTsgCiAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7Ci0gICAgICAgICAgICAgICBhZnRlcihncmFtbWFyQWNjZXNzLmdldERhdGFJbnRlcmNoYW5nZUJlYW5BY2Nlc3MoKS5nZXRNYXJrTGF0ZXN0TWFya2VyS2V5d29yZF81XzBfMCgpKTsgCisgICAgICAgICAgICAgICBhZnRlcihncmFtbWFyQWNjZXNzLmdldERhdGFJbnRlcmNoYW5nZUJlYW5BY2Nlc3MoKS5nZXRNYXJrTGF0ZXN0SW1wb3J0TGF0ZXN0SW1wb3J0S2V5d29yZF81XzBfMCgpKTsgCiAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIH0KQEAgLTc0NTA4LDI3ICs3OTAxOCwyNyBAQAogICAgICAgICB9CiAgICAgICAgIHJldHVybiA7CiAgICAgfQotICAgIC8vICRBTlRMUiBlbmQgInJ1bGVfX0RhdGFJbnRlcmNoYW5nZUJlYW5fX01hcmtMYXRlc3RBc3NpZ25tZW50XzVfMCIKKyAgICAvLyAkQU5UTFIgZW5kICJydWxlX19EYXRhSW50ZXJjaGFuZ2VCZWFuX19NYXJrTGF0ZXN0SW1wb3J0QXNzaWdubWVudF81XzAiCiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fRGF0YUludGVyY2hhbmdlQmVhbl9fTGF0ZXN0UHJvcGVydHlBc3NpZ25tZW50XzVfMSIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMjcyNDoxOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VCZWFuX19MYXRlc3RQcm9wZXJ0eUFzc2lnbm1lbnRfNV8xIDogKCAoIFJVTEVfSUQgKSApIDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNDA4MToxOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VCZWFuX19MYXRlc3RQcm9wZXJ0eUFzc2lnbm1lbnRfNV8xIDogKCAoIFJVTEVfSUQgKSApIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19EYXRhSW50ZXJjaGFuZ2VCZWFuX19MYXRlc3RQcm9wZXJ0eUFzc2lnbm1lbnRfNV8xKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIyNzI4OjE6ICggKCAoIFJVTEVfSUQgKSApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIyNzI5OjI6ICggKCBSVUxFX0lEICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjQwODU6MTogKCAoICggUlVMRV9JRCApICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjQwODY6MjogKCAoIFJVTEVfSUQgKSApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMjcyOToyOiAoICggUlVMRV9JRCApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIyNzMwOjM6ICggUlVMRV9JRCApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNDA4NjoyOiAoICggUlVMRV9JRCApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI0MDg3OjM6ICggUlVMRV9JRCApCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldERhdGFJbnRlcmNoYW5nZUJlYW5BY2Nlc3MoKS5nZXRMYXRlc3RQcm9wZXJ0eUxFbnRpdHlBdHRyaWJ1dGVDcm9zc1JlZmVyZW5jZV81XzFfMCgpKTsgCiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMjczMTozOiAoIFJVTEVfSUQgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjI3MzI6NDogUlVMRV9JRAorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjQwODg6MzogKCBSVUxFX0lEICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI0MDg5OjQ6IFJVTEVfSUQKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YUludGVyY2hhbmdlQmVhbkFjY2VzcygpLmdldExhdGVzdFByb3BlcnR5TEVudGl0eUF0dHJpYnV0ZUlEVGVybWluYWxSdWxlQ2FsbF81XzFfMF8xKCkpOyAKQEAgLTc0NTY0LDIxICs3OTA3NCwxMjcgQEAKICAgICAvLyAkQU5UTFIgZW5kICJydWxlX19EYXRhSW50ZXJjaGFuZ2VCZWFuX19MYXRlc3RQcm9wZXJ0eUFzc2lnbm1lbnRfNV8xIgogCiAKLSAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX0RhdGFJbnRlcmNoYW5nZUJlYW5fX0V4cHJlc3Npb25Bc3NpZ25tZW50XzZfMiIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMjc0MzoxOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VCZWFuX19FeHByZXNzaW9uQXNzaWdubWVudF82XzIgOiAoIHJ1bGVEYXRhSW50ZXJjaGFuZ2VFeHByZXNzaW9uICkgOwotICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUJlYW5fX0V4cHJlc3Npb25Bc3NpZ25tZW50XzZfMigpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19EYXRhSW50ZXJjaGFuZ2VCZWFuX19NYXJrTGF0ZXN0RXhwb3J0QXNzaWdubWVudF82XzAiCisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjQxMDA6MTogcnVsZV9fRGF0YUludGVyY2hhbmdlQmVhbl9fTWFya0xhdGVzdEV4cG9ydEFzc2lnbm1lbnRfNl8wIDogKCAoICdsYXRlc3RFeHBvcnQnICkgKSA7CisgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fRGF0YUludGVyY2hhbmdlQmVhbl9fTWFya0xhdGVzdEV4cG9ydEFzc2lnbm1lbnRfNl8wKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIyNzQ3OjE6ICggKCBydWxlRGF0YUludGVyY2hhbmdlRXhwcmVzc2lvbiApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIyNzQ4OjI6ICggcnVsZURhdGFJbnRlcmNoYW5nZUV4cHJlc3Npb24gKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjQxMDQ6MTogKCAoICggJ2xhdGVzdEV4cG9ydCcgKSApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI0MTA1OjI6ICggKCAnbGF0ZXN0RXhwb3J0JyApICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIyNzQ4OjI6ICggcnVsZURhdGFJbnRlcmNoYW5nZUV4cHJlc3Npb24gKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjI3NDk6MzogcnVsZURhdGFJbnRlcmNoYW5nZUV4cHJlc3Npb24KKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI0MTA1OjI6ICggKCAnbGF0ZXN0RXhwb3J0JyApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI0MTA2OjM6ICggJ2xhdGVzdEV4cG9ydCcgKQogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7Ci0gICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXREYXRhSW50ZXJjaGFuZ2VCZWFuQWNjZXNzKCkuZ2V0RXhwcmVzc2lvbkRhdGFJbnRlcmNoYW5nZUV4cHJlc3Npb25QYXJzZXJSdWxlQ2FsbF82XzJfMCgpKTsgCisgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXREYXRhSW50ZXJjaGFuZ2VCZWFuQWNjZXNzKCkuZ2V0TWFya0xhdGVzdEV4cG9ydExhdGVzdEV4cG9ydEtleXdvcmRfNl8wXzAoKSk7IAorICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjQxMDc6MzogKCAnbGF0ZXN0RXhwb3J0JyApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNDEwODo0OiAnbGF0ZXN0RXhwb3J0JworICAgICAgICAgICAgeworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXREYXRhSW50ZXJjaGFuZ2VCZWFuQWNjZXNzKCkuZ2V0TWFya0xhdGVzdEV4cG9ydExhdGVzdEV4cG9ydEtleXdvcmRfNl8wXzAoKSk7IAorICAgICAgICAgICAgfQorICAgICAgICAgICAgbWF0Y2goaW5wdXQsMTU2LEZPTExPV18yKTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXREYXRhSW50ZXJjaGFuZ2VCZWFuQWNjZXNzKCkuZ2V0TWFya0xhdGVzdEV4cG9ydExhdGVzdEV4cG9ydEtleXdvcmRfNl8wXzAoKSk7IAorICAgICAgICAgICAgfQorCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXREYXRhSW50ZXJjaGFuZ2VCZWFuQWNjZXNzKCkuZ2V0TWFya0xhdGVzdEV4cG9ydExhdGVzdEV4cG9ydEtleXdvcmRfNl8wXzAoKSk7IAorICAgICAgICAgICAgfQorCisgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgfQorCisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKFJlY29nbml0aW9uRXhjZXB0aW9uIHJlKSB7CisgICAgICAgICAgICByZXBvcnRFcnJvcihyZSk7CisgICAgICAgICAgICByZWNvdmVyKGlucHV0LHJlKTsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKworICAgICAgICAgICAgCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKKworICAgICAgICB9CisgICAgICAgIHJldHVybiA7CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgInJ1bGVfX0RhdGFJbnRlcmNoYW5nZUJlYW5fX01hcmtMYXRlc3RFeHBvcnRBc3NpZ25tZW50XzZfMCIKKworCisgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19EYXRhSW50ZXJjaGFuZ2VCZWFuX19MYXRlc3RFeHBQcm9wZXJ0eUFzc2lnbm1lbnRfNl8xIgorICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI0MTE5OjE6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUJlYW5fX0xhdGVzdEV4cFByb3BlcnR5QXNzaWdubWVudF82XzEgOiAoICggUlVMRV9JRCApICkgOworICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUJlYW5fX0xhdGVzdEV4cFByb3BlcnR5QXNzaWdubWVudF82XzEoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworCisgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICAgICAgCQorICAgICAgICB0cnkgeworICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjQxMjM6MTogKCAoICggUlVMRV9JRCApICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjQxMjQ6MjogKCAoIFJVTEVfSUQgKSApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNDEyNDoyOiAoICggUlVMRV9JRCApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI0MTI1OjM6ICggUlVMRV9JRCApCisgICAgICAgICAgICB7CisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldERhdGFJbnRlcmNoYW5nZUJlYW5BY2Nlc3MoKS5nZXRMYXRlc3RFeHBQcm9wZXJ0eUxFbnRpdHlBdHRyaWJ1dGVDcm9zc1JlZmVyZW5jZV82XzFfMCgpKTsgCisgICAgICAgICAgICB9CisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNDEyNjozOiAoIFJVTEVfSUQgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjQxMjc6NDogUlVMRV9JRAorICAgICAgICAgICAgeworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXREYXRhSW50ZXJjaGFuZ2VCZWFuQWNjZXNzKCkuZ2V0TGF0ZXN0RXhwUHJvcGVydHlMRW50aXR5QXR0cmlidXRlSURUZXJtaW5hbFJ1bGVDYWxsXzZfMV8wXzEoKSk7IAorICAgICAgICAgICAgfQorICAgICAgICAgICAgbWF0Y2goaW5wdXQsUlVMRV9JRCxGT0xMT1dfMik7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YUludGVyY2hhbmdlQmVhbkFjY2VzcygpLmdldExhdGVzdEV4cFByb3BlcnR5TEVudGl0eUF0dHJpYnV0ZUlEVGVybWluYWxSdWxlQ2FsbF82XzFfMF8xKCkpOyAKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YUludGVyY2hhbmdlQmVhbkFjY2VzcygpLmdldExhdGVzdEV4cFByb3BlcnR5TEVudGl0eUF0dHJpYnV0ZUNyb3NzUmVmZXJlbmNlXzZfMV8wKCkpOyAKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgIH0KKworICAgICAgICB9CisgICAgICAgIGNhdGNoIChSZWNvZ25pdGlvbkV4Y2VwdGlvbiByZSkgeworICAgICAgICAgICAgcmVwb3J0RXJyb3IocmUpOworICAgICAgICAgICAgcmVjb3ZlcihpbnB1dCxyZSk7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisKKyAgICAgICAgICAgIAlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7CisKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gOworICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJydWxlX19EYXRhSW50ZXJjaGFuZ2VCZWFuX19MYXRlc3RFeHBQcm9wZXJ0eUFzc2lnbm1lbnRfNl8xIgorCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX0RhdGFJbnRlcmNoYW5nZUJlYW5fX0V4cHJlc3Npb25Bc3NpZ25tZW50XzdfMiIKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNDEzODoxOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VCZWFuX19FeHByZXNzaW9uQXNzaWdubWVudF83XzIgOiAoIHJ1bGVEYXRhSW50ZXJjaGFuZ2VFeHByZXNzaW9uICkgOworICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUJlYW5fX0V4cHJlc3Npb25Bc3NpZ25tZW50XzdfMigpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisKKyAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgICAgICAJCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNDE0MjoxOiAoICggcnVsZURhdGFJbnRlcmNoYW5nZUV4cHJlc3Npb24gKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNDE0MzoyOiAoIHJ1bGVEYXRhSW50ZXJjaGFuZ2VFeHByZXNzaW9uICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI0MTQzOjI6ICggcnVsZURhdGFJbnRlcmNoYW5nZUV4cHJlc3Npb24gKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjQxNDQ6MzogcnVsZURhdGFJbnRlcmNoYW5nZUV4cHJlc3Npb24KKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YUludGVyY2hhbmdlQmVhbkFjY2VzcygpLmdldEV4cHJlc3Npb25EYXRhSW50ZXJjaGFuZ2VFeHByZXNzaW9uUGFyc2VyUnVsZUNhbGxfN18yXzAoKSk7IAogICAgICAgICAgICAgfQogICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMik7CiAgICAgICAgICAgICBydWxlRGF0YUludGVyY2hhbmdlRXhwcmVzc2lvbigpOwpAQCAtNzQ1ODYsNyArNzkyMDIsNyBAQAogICAgICAgICAgICAgc3RhdGUuX2ZzcC0tOwogICAgICAgICAgICAgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewotICAgICAgICAgICAgICAgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXREYXRhSW50ZXJjaGFuZ2VCZWFuQWNjZXNzKCkuZ2V0RXhwcmVzc2lvbkRhdGFJbnRlcmNoYW5nZUV4cHJlc3Npb25QYXJzZXJSdWxlQ2FsbF82XzJfMCgpKTsgCisgICAgICAgICAgICAgICBhZnRlcihncmFtbWFyQWNjZXNzLmdldERhdGFJbnRlcmNoYW5nZUJlYW5BY2Nlc3MoKS5nZXRFeHByZXNzaW9uRGF0YUludGVyY2hhbmdlRXhwcmVzc2lvblBhcnNlclJ1bGVDYWxsXzdfMl8wKCkpOyAKICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgfQpAQCAtNzQ2MDYsMjQgKzc5MjIyLDI0IEBACiAgICAgICAgIH0KICAgICAgICAgcmV0dXJuIDsKICAgICB9Ci0gICAgLy8gJEFOVExSIGVuZCAicnVsZV9fRGF0YUludGVyY2hhbmdlQmVhbl9fRXhwcmVzc2lvbkFzc2lnbm1lbnRfNl8yIgorICAgIC8vICRBTlRMUiBlbmQgInJ1bGVfX0RhdGFJbnRlcmNoYW5nZUJlYW5fX0V4cHJlc3Npb25Bc3NpZ25tZW50XzdfMiIKIAogCi0gICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19EYXRhSW50ZXJjaGFuZ2VCZWFuX19Mb29rdXBBc3NpZ25tZW50XzdfMiIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMjc1ODoxOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VCZWFuX19Mb29rdXBBc3NpZ25tZW50XzdfMiA6ICggcnVsZURhdGFJbnRlcmNoYW5nZUxvb2t1cCApIDsKLSAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19EYXRhSW50ZXJjaGFuZ2VCZWFuX19Mb29rdXBBc3NpZ25tZW50XzdfMigpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19EYXRhSW50ZXJjaGFuZ2VCZWFuX19Mb29rdXBBc3NpZ25tZW50XzhfMiIKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNDE1MzoxOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VCZWFuX19Mb29rdXBBc3NpZ25tZW50XzhfMiA6ICggcnVsZURhdGFJbnRlcmNoYW5nZUxvb2t1cCApIDsKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19EYXRhSW50ZXJjaGFuZ2VCZWFuX19Mb29rdXBBc3NpZ25tZW50XzhfMigpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMjc2MjoxOiAoICggcnVsZURhdGFJbnRlcmNoYW5nZUxvb2t1cCApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIyNzYzOjI6ICggcnVsZURhdGFJbnRlcmNoYW5nZUxvb2t1cCApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNDE1NzoxOiAoICggcnVsZURhdGFJbnRlcmNoYW5nZUxvb2t1cCApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI0MTU4OjI6ICggcnVsZURhdGFJbnRlcmNoYW5nZUxvb2t1cCApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMjc2MzoyOiAoIHJ1bGVEYXRhSW50ZXJjaGFuZ2VMb29rdXAgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjI3NjQ6MzogcnVsZURhdGFJbnRlcmNoYW5nZUxvb2t1cAorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjQxNTg6MjogKCBydWxlRGF0YUludGVyY2hhbmdlTG9va3VwICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI0MTU5OjM6IHJ1bGVEYXRhSW50ZXJjaGFuZ2VMb29rdXAKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewotICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YUludGVyY2hhbmdlQmVhbkFjY2VzcygpLmdldExvb2t1cERhdGFJbnRlcmNoYW5nZUxvb2t1cFBhcnNlclJ1bGVDYWxsXzdfMl8wKCkpOyAKKyAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldERhdGFJbnRlcmNoYW5nZUJlYW5BY2Nlc3MoKS5nZXRMb29rdXBEYXRhSW50ZXJjaGFuZ2VMb29rdXBQYXJzZXJSdWxlQ2FsbF84XzJfMCgpKTsgCiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV18yKTsKICAgICAgICAgICAgIHJ1bGVEYXRhSW50ZXJjaGFuZ2VMb29rdXAoKTsKQEAgLTc0NjMxLDcgKzc5MjQ3LDcgQEAKICAgICAgICAgICAgIHN0YXRlLl9mc3AtLTsKICAgICAgICAgICAgIGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKLSAgICAgICAgICAgICAgIGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YUludGVyY2hhbmdlQmVhbkFjY2VzcygpLmdldExvb2t1cERhdGFJbnRlcmNoYW5nZUxvb2t1cFBhcnNlclJ1bGVDYWxsXzdfMl8wKCkpOyAKKyAgICAgICAgICAgICAgIGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YUludGVyY2hhbmdlQmVhbkFjY2VzcygpLmdldExvb2t1cERhdGFJbnRlcmNoYW5nZUxvb2t1cFBhcnNlclJ1bGVDYWxsXzhfMl8wKCkpOyAKICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgfQpAQCAtNzQ2NTEsMjQgKzc5MjY3LDI0IEBACiAgICAgICAgIH0KICAgICAgICAgcmV0dXJuIDsKICAgICB9Ci0gICAgLy8gJEFOVExSIGVuZCAicnVsZV9fRGF0YUludGVyY2hhbmdlQmVhbl9fTG9va3VwQXNzaWdubWVudF83XzIiCisgICAgLy8gJEFOVExSIGVuZCAicnVsZV9fRGF0YUludGVyY2hhbmdlQmVhbl9fTG9va3VwQXNzaWdubWVudF84XzIiCiAKIAotICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fRGF0YUludGVyY2hhbmdlQmVhbl9fRm9ybWF0QXNzaWdubWVudF84XzIiCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjI3NzM6MTogcnVsZV9fRGF0YUludGVyY2hhbmdlQmVhbl9fRm9ybWF0QXNzaWdubWVudF84XzIgOiAoIHJ1bGVEYXRhSW50ZXJjaGFuZ2VGb3JtYXQgKSA7Ci0gICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fRGF0YUludGVyY2hhbmdlQmVhbl9fRm9ybWF0QXNzaWdubWVudF84XzIoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fRGF0YUludGVyY2hhbmdlQmVhbl9fRm9ybWF0QXNzaWdubWVudF85XzIiCisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjQxNjg6MTogcnVsZV9fRGF0YUludGVyY2hhbmdlQmVhbl9fRm9ybWF0QXNzaWdubWVudF85XzIgOiAoIHJ1bGVEYXRhSW50ZXJjaGFuZ2VGb3JtYXQgKSA7CisgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fRGF0YUludGVyY2hhbmdlQmVhbl9fRm9ybWF0QXNzaWdubWVudF85XzIoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjI3Nzc6MTogKCAoIHJ1bGVEYXRhSW50ZXJjaGFuZ2VGb3JtYXQgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMjc3ODoyOiAoIHJ1bGVEYXRhSW50ZXJjaGFuZ2VGb3JtYXQgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjQxNzI6MTogKCAoIHJ1bGVEYXRhSW50ZXJjaGFuZ2VGb3JtYXQgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNDE3MzoyOiAoIHJ1bGVEYXRhSW50ZXJjaGFuZ2VGb3JtYXQgKQogICAgICAgICAgICAgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjI3Nzg6MjogKCBydWxlRGF0YUludGVyY2hhbmdlRm9ybWF0ICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIyNzc5OjM6IHJ1bGVEYXRhSW50ZXJjaGFuZ2VGb3JtYXQKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI0MTczOjI6ICggcnVsZURhdGFJbnRlcmNoYW5nZUZvcm1hdCApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNDE3NDozOiBydWxlRGF0YUludGVyY2hhbmdlRm9ybWF0CiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKLSAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldERhdGFJbnRlcmNoYW5nZUJlYW5BY2Nlc3MoKS5nZXRGb3JtYXREYXRhSW50ZXJjaGFuZ2VGb3JtYXRQYXJzZXJSdWxlQ2FsbF84XzJfMCgpKTsgCisgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXREYXRhSW50ZXJjaGFuZ2VCZWFuQWNjZXNzKCkuZ2V0Rm9ybWF0RGF0YUludGVyY2hhbmdlRm9ybWF0UGFyc2VyUnVsZUNhbGxfOV8yXzAoKSk7IAogICAgICAgICAgICAgfQogICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMik7CiAgICAgICAgICAgICBydWxlRGF0YUludGVyY2hhbmdlRm9ybWF0KCk7CkBAIC03NDY3Niw3ICs3OTI5Miw3IEBACiAgICAgICAgICAgICBzdGF0ZS5fZnNwLS07CiAgICAgICAgICAgICBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOwogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7Ci0gICAgICAgICAgICAgICBhZnRlcihncmFtbWFyQWNjZXNzLmdldERhdGFJbnRlcmNoYW5nZUJlYW5BY2Nlc3MoKS5nZXRGb3JtYXREYXRhSW50ZXJjaGFuZ2VGb3JtYXRQYXJzZXJSdWxlQ2FsbF84XzJfMCgpKTsgCisgICAgICAgICAgICAgICBhZnRlcihncmFtbWFyQWNjZXNzLmdldERhdGFJbnRlcmNoYW5nZUJlYW5BY2Nlc3MoKS5nZXRGb3JtYXREYXRhSW50ZXJjaGFuZ2VGb3JtYXRQYXJzZXJSdWxlQ2FsbF85XzJfMCgpKTsgCiAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIH0KQEAgLTc0Njk2LDI0ICs3OTMxMiw2OSBAQAogICAgICAgICB9CiAgICAgICAgIHJldHVybiA7CiAgICAgfQotICAgIC8vICRBTlRMUiBlbmQgInJ1bGVfX0RhdGFJbnRlcmNoYW5nZUJlYW5fX0Zvcm1hdEFzc2lnbm1lbnRfOF8yIgorICAgIC8vICRBTlRMUiBlbmQgInJ1bGVfX0RhdGFJbnRlcmNoYW5nZUJlYW5fX0Zvcm1hdEFzc2lnbm1lbnRfOV8yIgogCiAKLSAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX0RhdGFJbnRlcmNoYW5nZUJlYW5fX01hcHBpbmdzQXNzaWdubWVudF85XzIiCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjI3ODg6MTogcnVsZV9fRGF0YUludGVyY2hhbmdlQmVhbl9fTWFwcGluZ3NBc3NpZ25tZW50XzlfMiA6ICggcnVsZURhdGFJbnRlcmNoYW5nZU1hcHBpbmcgKSA7Ci0gICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fRGF0YUludGVyY2hhbmdlQmVhbl9fTWFwcGluZ3NBc3NpZ25tZW50XzlfMigpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19EYXRhSW50ZXJjaGFuZ2VCZWFuX19FeHBvcnRFeHBvc2VzQXNzaWdubWVudF8xMF8yIgorICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI0MTgzOjE6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUJlYW5fX0V4cG9ydEV4cG9zZXNBc3NpZ25tZW50XzEwXzIgOiAoIHJ1bGVEYXRhSW50ZXJjaGFuZ2VFeHBvc2UgKSA7CisgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fRGF0YUludGVyY2hhbmdlQmVhbl9fRXhwb3J0RXhwb3Nlc0Fzc2lnbm1lbnRfMTBfMigpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMjc5MjoxOiAoICggcnVsZURhdGFJbnRlcmNoYW5nZU1hcHBpbmcgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMjc5MzoyOiAoIHJ1bGVEYXRhSW50ZXJjaGFuZ2VNYXBwaW5nICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI0MTg3OjE6ICggKCBydWxlRGF0YUludGVyY2hhbmdlRXhwb3NlICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjQxODg6MjogKCBydWxlRGF0YUludGVyY2hhbmdlRXhwb3NlICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIyNzkzOjI6ICggcnVsZURhdGFJbnRlcmNoYW5nZU1hcHBpbmcgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjI3OTQ6MzogcnVsZURhdGFJbnRlcmNoYW5nZU1hcHBpbmcKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI0MTg4OjI6ICggcnVsZURhdGFJbnRlcmNoYW5nZUV4cG9zZSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNDE4OTozOiBydWxlRGF0YUludGVyY2hhbmdlRXhwb3NlCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKLSAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldERhdGFJbnRlcmNoYW5nZUJlYW5BY2Nlc3MoKS5nZXRNYXBwaW5nc0RhdGFJbnRlcmNoYW5nZU1hcHBpbmdQYXJzZXJSdWxlQ2FsbF85XzJfMCgpKTsgCisgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXREYXRhSW50ZXJjaGFuZ2VCZWFuQWNjZXNzKCkuZ2V0RXhwb3J0RXhwb3Nlc0RhdGFJbnRlcmNoYW5nZUV4cG9zZVBhcnNlclJ1bGVDYWxsXzEwXzJfMCgpKTsgCisgICAgICAgICAgICB9CisgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV18yKTsKKyAgICAgICAgICAgIHJ1bGVEYXRhSW50ZXJjaGFuZ2VFeHBvc2UoKTsKKworICAgICAgICAgICAgc3RhdGUuX2ZzcC0tOworICAgICAgICAgICAgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXREYXRhSW50ZXJjaGFuZ2VCZWFuQWNjZXNzKCkuZ2V0RXhwb3J0RXhwb3Nlc0RhdGFJbnRlcmNoYW5nZUV4cG9zZVBhcnNlclJ1bGVDYWxsXzEwXzJfMCgpKTsgCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICB9CisKKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoUmVjb2duaXRpb25FeGNlcHRpb24gcmUpIHsKKyAgICAgICAgICAgIHJlcG9ydEVycm9yKHJlKTsKKyAgICAgICAgICAgIHJlY292ZXIoaW5wdXQscmUpOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworCisgICAgICAgICAgICAJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworCisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIDsKKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAicnVsZV9fRGF0YUludGVyY2hhbmdlQmVhbl9fRXhwb3J0RXhwb3Nlc0Fzc2lnbm1lbnRfMTBfMiIKKworCisgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19EYXRhSW50ZXJjaGFuZ2VCZWFuX19NYXBwaW5nc0Fzc2lnbm1lbnRfMTFfMiIKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNDE5ODoxOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VCZWFuX19NYXBwaW5nc0Fzc2lnbm1lbnRfMTFfMiA6ICggcnVsZURhdGFJbnRlcmNoYW5nZU1hcHBpbmcgKSA7CisgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fRGF0YUludGVyY2hhbmdlQmVhbl9fTWFwcGluZ3NBc3NpZ25tZW50XzExXzIoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworCisgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICAgICAgCQorICAgICAgICB0cnkgeworICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjQyMDI6MTogKCAoIHJ1bGVEYXRhSW50ZXJjaGFuZ2VNYXBwaW5nICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjQyMDM6MjogKCBydWxlRGF0YUludGVyY2hhbmdlTWFwcGluZyApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNDIwMzoyOiAoIHJ1bGVEYXRhSW50ZXJjaGFuZ2VNYXBwaW5nICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI0MjA0OjM6IHJ1bGVEYXRhSW50ZXJjaGFuZ2VNYXBwaW5nCisgICAgICAgICAgICB7CisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldERhdGFJbnRlcmNoYW5nZUJlYW5BY2Nlc3MoKS5nZXRNYXBwaW5nc0RhdGFJbnRlcmNoYW5nZU1hcHBpbmdQYXJzZXJSdWxlQ2FsbF8xMV8yXzAoKSk7IAogICAgICAgICAgICAgfQogICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMik7CiAgICAgICAgICAgICBydWxlRGF0YUludGVyY2hhbmdlTWFwcGluZygpOwpAQCAtNzQ3MjEsNyArNzkzODIsNyBAQAogICAgICAgICAgICAgc3RhdGUuX2ZzcC0tOwogICAgICAgICAgICAgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewotICAgICAgICAgICAgICAgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXREYXRhSW50ZXJjaGFuZ2VCZWFuQWNjZXNzKCkuZ2V0TWFwcGluZ3NEYXRhSW50ZXJjaGFuZ2VNYXBwaW5nUGFyc2VyUnVsZUNhbGxfOV8yXzAoKSk7IAorICAgICAgICAgICAgICAgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXREYXRhSW50ZXJjaGFuZ2VCZWFuQWNjZXNzKCkuZ2V0TWFwcGluZ3NEYXRhSW50ZXJjaGFuZ2VNYXBwaW5nUGFyc2VyUnVsZUNhbGxfMTFfMl8wKCkpOyAKICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgfQpAQCAtNzQ3NDEsMjQgKzc5NDAyLDI0IEBACiAgICAgICAgIH0KICAgICAgICAgcmV0dXJuIDsKICAgICB9Ci0gICAgLy8gJEFOVExSIGVuZCAicnVsZV9fRGF0YUludGVyY2hhbmdlQmVhbl9fTWFwcGluZ3NBc3NpZ25tZW50XzlfMiIKKyAgICAvLyAkQU5UTFIgZW5kICJydWxlX19EYXRhSW50ZXJjaGFuZ2VCZWFuX19NYXBwaW5nc0Fzc2lnbm1lbnRfMTFfMiIKIAogCi0gICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19EYXRhSW50ZXJjaGFuZ2VCZWFuX19Mb29rdXBLZXlzQXNzaWdubWVudF8xMF8yIgotICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIyODAzOjE6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUJlYW5fX0xvb2t1cEtleXNBc3NpZ25tZW50XzEwXzIgOiAoIHJ1bGVEYXRhSW50ZXJjaGFuZ2VLZXkgKSA7Ci0gICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fRGF0YUludGVyY2hhbmdlQmVhbl9fTG9va3VwS2V5c0Fzc2lnbm1lbnRfMTBfMigpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19EYXRhSW50ZXJjaGFuZ2VCZWFuX19Mb29rdXBLZXlzQXNzaWdubWVudF8xMl8yIgorICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI0MjEzOjE6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUJlYW5fX0xvb2t1cEtleXNBc3NpZ25tZW50XzEyXzIgOiAoIHJ1bGVEYXRhSW50ZXJjaGFuZ2VLZXkgKSA7CisgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fRGF0YUludGVyY2hhbmdlQmVhbl9fTG9va3VwS2V5c0Fzc2lnbm1lbnRfMTJfMigpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMjgwNzoxOiAoICggcnVsZURhdGFJbnRlcmNoYW5nZUtleSApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIyODA4OjI6ICggcnVsZURhdGFJbnRlcmNoYW5nZUtleSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNDIxNzoxOiAoICggcnVsZURhdGFJbnRlcmNoYW5nZUtleSApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI0MjE4OjI6ICggcnVsZURhdGFJbnRlcmNoYW5nZUtleSApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMjgwODoyOiAoIHJ1bGVEYXRhSW50ZXJjaGFuZ2VLZXkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjI4MDk6MzogcnVsZURhdGFJbnRlcmNoYW5nZUtleQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjQyMTg6MjogKCBydWxlRGF0YUludGVyY2hhbmdlS2V5ICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI0MjE5OjM6IHJ1bGVEYXRhSW50ZXJjaGFuZ2VLZXkKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewotICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YUludGVyY2hhbmdlQmVhbkFjY2VzcygpLmdldExvb2t1cEtleXNEYXRhSW50ZXJjaGFuZ2VLZXlQYXJzZXJSdWxlQ2FsbF8xMF8yXzAoKSk7IAorICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YUludGVyY2hhbmdlQmVhbkFjY2VzcygpLmdldExvb2t1cEtleXNEYXRhSW50ZXJjaGFuZ2VLZXlQYXJzZXJSdWxlQ2FsbF8xMl8yXzAoKSk7IAogICAgICAgICAgICAgfQogICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMik7CiAgICAgICAgICAgICBydWxlRGF0YUludGVyY2hhbmdlS2V5KCk7CkBAIC03NDc2Niw3ICs3OTQyNyw3IEBACiAgICAgICAgICAgICBzdGF0ZS5fZnNwLS07CiAgICAgICAgICAgICBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOwogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7Ci0gICAgICAgICAgICAgICBhZnRlcihncmFtbWFyQWNjZXNzLmdldERhdGFJbnRlcmNoYW5nZUJlYW5BY2Nlc3MoKS5nZXRMb29rdXBLZXlzRGF0YUludGVyY2hhbmdlS2V5UGFyc2VyUnVsZUNhbGxfMTBfMl8wKCkpOyAKKyAgICAgICAgICAgICAgIGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YUludGVyY2hhbmdlQmVhbkFjY2VzcygpLmdldExvb2t1cEtleXNEYXRhSW50ZXJjaGFuZ2VLZXlQYXJzZXJSdWxlQ2FsbF8xMl8yXzAoKSk7IAogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICB9CkBAIC03NDc4NiwyNyArNzk0NDcsNzIgQEAKICAgICAgICAgfQogICAgICAgICByZXR1cm4gOwogICAgIH0KLSAgICAvLyAkQU5UTFIgZW5kICJydWxlX19EYXRhSW50ZXJjaGFuZ2VCZWFuX19Mb29rdXBLZXlzQXNzaWdubWVudF8xMF8yIgorICAgIC8vICRBTlRMUiBlbmQgInJ1bGVfX0RhdGFJbnRlcmNoYW5nZUJlYW5fX0xvb2t1cEtleXNBc3NpZ25tZW50XzEyXzIiCisKKworICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fRGF0YUludGVyY2hhbmdlQmVhbl9fRXhwb3J0RmlsdGVyQXNzaWdubWVudF8xM18yIgorICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI0MjI4OjE6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUJlYW5fX0V4cG9ydEZpbHRlckFzc2lnbm1lbnRfMTNfMiA6ICggcnVsZURhdGFJbnRlcmNoYW5nZUV4cG9ydEZpbHRlciApIDsKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19EYXRhSW50ZXJjaGFuZ2VCZWFuX19FeHBvcnRGaWx0ZXJBc3NpZ25tZW50XzEzXzIoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworCisgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICAgICAgCQorICAgICAgICB0cnkgeworICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjQyMzI6MTogKCAoIHJ1bGVEYXRhSW50ZXJjaGFuZ2VFeHBvcnRGaWx0ZXIgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNDIzMzoyOiAoIHJ1bGVEYXRhSW50ZXJjaGFuZ2VFeHBvcnRGaWx0ZXIgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjQyMzM6MjogKCBydWxlRGF0YUludGVyY2hhbmdlRXhwb3J0RmlsdGVyICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI0MjM0OjM6IHJ1bGVEYXRhSW50ZXJjaGFuZ2VFeHBvcnRGaWx0ZXIKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YUludGVyY2hhbmdlQmVhbkFjY2VzcygpLmdldEV4cG9ydEZpbHRlckRhdGFJbnRlcmNoYW5nZUV4cG9ydEZpbHRlclBhcnNlclJ1bGVDYWxsXzEzXzJfMCgpKTsgCisgICAgICAgICAgICB9CisgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV18yKTsKKyAgICAgICAgICAgIHJ1bGVEYXRhSW50ZXJjaGFuZ2VFeHBvcnRGaWx0ZXIoKTsKKworICAgICAgICAgICAgc3RhdGUuX2ZzcC0tOworICAgICAgICAgICAgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXREYXRhSW50ZXJjaGFuZ2VCZWFuQWNjZXNzKCkuZ2V0RXhwb3J0RmlsdGVyRGF0YUludGVyY2hhbmdlRXhwb3J0RmlsdGVyUGFyc2VyUnVsZUNhbGxfMTNfMl8wKCkpOyAKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgIH0KKworICAgICAgICB9CisgICAgICAgIGNhdGNoIChSZWNvZ25pdGlvbkV4Y2VwdGlvbiByZSkgeworICAgICAgICAgICAgcmVwb3J0RXJyb3IocmUpOworICAgICAgICAgICAgcmVjb3ZlcihpbnB1dCxyZSk7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisKKyAgICAgICAgICAgIAlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7CisKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gOworICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJydWxlX19EYXRhSW50ZXJjaGFuZ2VCZWFuX19FeHBvcnRGaWx0ZXJBc3NpZ25tZW50XzEzXzIiCiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fRGF0YUludGVyY2hhbmdlS2V5X19Qcm9wZXJ0eUFzc2lnbm1lbnRfMiIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMjgxODoxOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VLZXlfX1Byb3BlcnR5QXNzaWdubWVudF8yIDogKCAoIFJVTEVfSUQgKSApIDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNDI0MzoxOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VLZXlfX1Byb3BlcnR5QXNzaWdubWVudF8yIDogKCAoIFJVTEVfSUQgKSApIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19EYXRhSW50ZXJjaGFuZ2VLZXlfX1Byb3BlcnR5QXNzaWdubWVudF8yKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIyODIyOjE6ICggKCAoIFJVTEVfSUQgKSApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIyODIzOjI6ICggKCBSVUxFX0lEICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjQyNDc6MTogKCAoICggUlVMRV9JRCApICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjQyNDg6MjogKCAoIFJVTEVfSUQgKSApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMjgyMzoyOiAoICggUlVMRV9JRCApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIyODI0OjM6ICggUlVMRV9JRCApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNDI0ODoyOiAoICggUlVMRV9JRCApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI0MjQ5OjM6ICggUlVMRV9JRCApCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldERhdGFJbnRlcmNoYW5nZUtleUFjY2VzcygpLmdldFByb3BlcnR5TEVudGl0eUF0dHJpYnV0ZUNyb3NzUmVmZXJlbmNlXzJfMCgpKTsgCiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMjgyNTozOiAoIFJVTEVfSUQgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjI4MjY6NDogUlVMRV9JRAorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjQyNTA6MzogKCBSVUxFX0lEICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI0MjUxOjQ6IFJVTEVfSUQKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YUludGVyY2hhbmdlS2V5QWNjZXNzKCkuZ2V0UHJvcGVydHlMRW50aXR5QXR0cmlidXRlSURUZXJtaW5hbFJ1bGVDYWxsXzJfMF8xKCkpOyAKQEAgLTc0ODQzLDIzICs3OTU0OSwyMyBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX0RhdGFJbnRlcmNoYW5nZUxvb2t1cF9fVGFyZ2V0UHJvcGVydHlBc3NpZ25tZW50XzIiCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjI4Mzc6MTogcnVsZV9fRGF0YUludGVyY2hhbmdlTG9va3VwX19UYXJnZXRQcm9wZXJ0eUFzc2lnbm1lbnRfMiA6ICggKCBSVUxFX0lEICkgKSA7CisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjQyNjI6MTogcnVsZV9fRGF0YUludGVyY2hhbmdlTG9va3VwX19UYXJnZXRQcm9wZXJ0eUFzc2lnbm1lbnRfMiA6ICggKCBSVUxFX0lEICkgKSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fRGF0YUludGVyY2hhbmdlTG9va3VwX19UYXJnZXRQcm9wZXJ0eUFzc2lnbm1lbnRfMigpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMjg0MToxOiAoICggKCBSVUxFX0lEICkgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMjg0MjoyOiAoICggUlVMRV9JRCApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI0MjY2OjE6ICggKCAoIFJVTEVfSUQgKSApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI0MjY3OjI6ICggKCBSVUxFX0lEICkgKQogICAgICAgICAgICAgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjI4NDI6MjogKCAoIFJVTEVfSUQgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMjg0MzozOiAoIFJVTEVfSUQgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjQyNjc6MjogKCAoIFJVTEVfSUQgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNDI2ODozOiAoIFJVTEVfSUQgKQogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXREYXRhSW50ZXJjaGFuZ2VMb29rdXBBY2Nlc3MoKS5nZXRUYXJnZXRQcm9wZXJ0eUxFbnRpdHlSZWZlcmVuY2VDcm9zc1JlZmVyZW5jZV8yXzAoKSk7IAogICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjI4NDQ6MzogKCBSVUxFX0lEICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIyODQ1OjQ6IFJVTEVfSUQKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI0MjY5OjM6ICggUlVMRV9JRCApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNDI3MDo0OiBSVUxFX0lECiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldERhdGFJbnRlcmNoYW5nZUxvb2t1cEFjY2VzcygpLmdldFRhcmdldFByb3BlcnR5TEVudGl0eVJlZmVyZW5jZUlEVGVybWluYWxSdWxlQ2FsbF8yXzBfMSgpKTsgCkBAIC03NDg5NiwyMyArNzk2MDIsMjMgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19EYXRhSW50ZXJjaGFuZ2VMb29rdXBfX0VudGl0eUFzc2lnbm1lbnRfNCIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMjg1NjoxOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VMb29rdXBfX0VudGl0eUFzc2lnbm1lbnRfNCA6ICggKCBSVUxFX0lEICkgKSA7CisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjQyODE6MTogcnVsZV9fRGF0YUludGVyY2hhbmdlTG9va3VwX19FbnRpdHlBc3NpZ25tZW50XzQgOiAoICggUlVMRV9JRCApICkgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUxvb2t1cF9fRW50aXR5QXNzaWdubWVudF80KCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIyODYwOjE6ICggKCAoIFJVTEVfSUQgKSApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIyODYxOjI6ICggKCBSVUxFX0lEICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjQyODU6MTogKCAoICggUlVMRV9JRCApICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjQyODY6MjogKCAoIFJVTEVfSUQgKSApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMjg2MToyOiAoICggUlVMRV9JRCApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIyODYyOjM6ICggUlVMRV9JRCApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNDI4NjoyOiAoICggUlVMRV9JRCApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI0Mjg3OjM6ICggUlVMRV9JRCApCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldERhdGFJbnRlcmNoYW5nZUxvb2t1cEFjY2VzcygpLmdldEVudGl0eUxFbnRpdHlDcm9zc1JlZmVyZW5jZV80XzAoKSk7IAogICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjI4NjM6MzogKCBSVUxFX0lEICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIyODY0OjQ6IFJVTEVfSUQKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI0Mjg4OjM6ICggUlVMRV9JRCApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNDI4OTo0OiBSVUxFX0lECiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldERhdGFJbnRlcmNoYW5nZUxvb2t1cEFjY2VzcygpLmdldEVudGl0eUxFbnRpdHlJRFRlcm1pbmFsUnVsZUNhbGxfNF8wXzEoKSk7IApAQCAtNzQ5NDksMTcgKzc5NjU1LDE3IEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fRGF0YUludGVyY2hhbmdlTG9va3VwX19FbGVtZW50TWFwQXNzaWdubWVudF81XzEiCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjI4NzU6MTogcnVsZV9fRGF0YUludGVyY2hhbmdlTG9va3VwX19FbGVtZW50TWFwQXNzaWdubWVudF81XzEgOiAoIFJVTEVfU1RSSU5HICkgOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI0MzAwOjE6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUxvb2t1cF9fRWxlbWVudE1hcEFzc2lnbm1lbnRfNV8xIDogKCBSVUxFX1NUUklORyApIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19EYXRhSW50ZXJjaGFuZ2VMb29rdXBfX0VsZW1lbnRNYXBBc3NpZ25tZW50XzVfMSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMjg3OToxOiAoICggUlVMRV9TVFJJTkcgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMjg4MDoyOiAoIFJVTEVfU1RSSU5HICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI0MzA0OjE6ICggKCBSVUxFX1NUUklORyApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI0MzA1OjI6ICggUlVMRV9TVFJJTkcgKQogICAgICAgICAgICAgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjI4ODA6MjogKCBSVUxFX1NUUklORyApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMjg4MTozOiBSVUxFX1NUUklORworICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjQzMDU6MjogKCBSVUxFX1NUUklORyApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNDMwNjozOiBSVUxFX1NUUklORwogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXREYXRhSW50ZXJjaGFuZ2VMb29rdXBBY2Nlc3MoKS5nZXRFbGVtZW50TWFwU1RSSU5HVGVybWluYWxSdWxlQ2FsbF81XzFfMCgpKTsgCkBAIC03NDk5MCwyMyArNzk2OTYsMjMgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19EYXRhSW50ZXJjaGFuZ2VMb29rdXBfX1F1ZXJ5UHJvcGVydHlBc3NpZ25tZW50XzciCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjI4OTA6MTogcnVsZV9fRGF0YUludGVyY2hhbmdlTG9va3VwX19RdWVyeVByb3BlcnR5QXNzaWdubWVudF83IDogKCAoIFJVTEVfSUQgKSApIDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNDMxNToxOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VMb29rdXBfX1F1ZXJ5UHJvcGVydHlBc3NpZ25tZW50XzcgOiAoICggUlVMRV9JRCApICkgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUxvb2t1cF9fUXVlcnlQcm9wZXJ0eUFzc2lnbm1lbnRfNygpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMjg5NDoxOiAoICggKCBSVUxFX0lEICkgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMjg5NToyOiAoICggUlVMRV9JRCApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI0MzE5OjE6ICggKCAoIFJVTEVfSUQgKSApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI0MzIwOjI6ICggKCBSVUxFX0lEICkgKQogICAgICAgICAgICAgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjI4OTU6MjogKCAoIFJVTEVfSUQgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMjg5NjozOiAoIFJVTEVfSUQgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjQzMjA6MjogKCAoIFJVTEVfSUQgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNDMyMTozOiAoIFJVTEVfSUQgKQogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXREYXRhSW50ZXJjaGFuZ2VMb29rdXBBY2Nlc3MoKS5nZXRRdWVyeVByb3BlcnR5TEVudGl0eUF0dHJpYnV0ZUNyb3NzUmVmZXJlbmNlXzdfMCgpKTsgCiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMjg5NzozOiAoIFJVTEVfSUQgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjI4OTg6NDogUlVMRV9JRAorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjQzMjI6MzogKCBSVUxFX0lEICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI0MzIzOjQ6IFJVTEVfSUQKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YUludGVyY2hhbmdlTG9va3VwQWNjZXNzKCkuZ2V0UXVlcnlQcm9wZXJ0eUxFbnRpdHlBdHRyaWJ1dGVJRFRlcm1pbmFsUnVsZUNhbGxfN18wXzEoKSk7IApAQCAtNzUwNDMsMjggKzc5NzQ5LDI4IEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fRGF0YUludGVyY2hhbmdlTG9va3VwX19DYWNoZWRBc3NpZ25tZW50XzhfMCIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMjkwOToxOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VMb29rdXBfX0NhY2hlZEFzc2lnbm1lbnRfOF8wIDogKCAoICdjYWNoZVNpemUnICkgKSA7CisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjQzMzQ6MTogcnVsZV9fRGF0YUludGVyY2hhbmdlTG9va3VwX19DYWNoZWRBc3NpZ25tZW50XzhfMCA6ICggKCAnY2FjaGVTaXplJyApICkgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUxvb2t1cF9fQ2FjaGVkQXNzaWdubWVudF84XzAoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjI5MTM6MTogKCAoICggJ2NhY2hlU2l6ZScgKSApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIyOTE0OjI6ICggKCAnY2FjaGVTaXplJyApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI0MzM4OjE6ICggKCAoICdjYWNoZVNpemUnICkgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNDMzOToyOiAoICggJ2NhY2hlU2l6ZScgKSApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMjkxNDoyOiAoICggJ2NhY2hlU2l6ZScgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMjkxNTozOiAoICdjYWNoZVNpemUnICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI0MzM5OjI6ICggKCAnY2FjaGVTaXplJyApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI0MzQwOjM6ICggJ2NhY2hlU2l6ZScgKQogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXREYXRhSW50ZXJjaGFuZ2VMb29rdXBBY2Nlc3MoKS5nZXRDYWNoZWRDYWNoZVNpemVLZXl3b3JkXzhfMF8wKCkpOyAKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIyOTE2OjM6ICggJ2NhY2hlU2l6ZScgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjI5MTc6NDogJ2NhY2hlU2l6ZScKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI0MzQxOjM6ICggJ2NhY2hlU2l6ZScgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjQzNDI6NDogJ2NhY2hlU2l6ZScKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YUludGVyY2hhbmdlTG9va3VwQWNjZXNzKCkuZ2V0Q2FjaGVkQ2FjaGVTaXplS2V5d29yZF84XzBfMCgpKTsgCiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBtYXRjaChpbnB1dCwxNDUsRk9MTE9XXzIpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOworICAgICAgICAgICAgbWF0Y2goaW5wdXQsMTU3LEZPTExPV18yKTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXREYXRhSW50ZXJjaGFuZ2VMb29rdXBBY2Nlc3MoKS5nZXRDYWNoZWRDYWNoZVNpemVLZXl3b3JkXzhfMF8wKCkpOyAKICAgICAgICAgICAgIH0KQEAgLTc1MDk2LDE3ICs3OTgwMiwxNyBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX0RhdGFJbnRlcmNoYW5nZUxvb2t1cF9fQ2FjaGVTaXplQXNzaWdubWVudF84XzEiCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjI5Mjg6MTogcnVsZV9fRGF0YUludGVyY2hhbmdlTG9va3VwX19DYWNoZVNpemVBc3NpZ25tZW50XzhfMSA6ICggUlVMRV9JTlQgKSA7CisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjQzNTM6MTogcnVsZV9fRGF0YUludGVyY2hhbmdlTG9va3VwX19DYWNoZVNpemVBc3NpZ25tZW50XzhfMSA6ICggUlVMRV9JTlQgKSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fRGF0YUludGVyY2hhbmdlTG9va3VwX19DYWNoZVNpemVBc3NpZ25tZW50XzhfMSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMjkzMjoxOiAoICggUlVMRV9JTlQgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMjkzMzoyOiAoIFJVTEVfSU5UICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI0MzU3OjE6ICggKCBSVUxFX0lOVCApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI0MzU4OjI6ICggUlVMRV9JTlQgKQogICAgICAgICAgICAgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjI5MzM6MjogKCBSVUxFX0lOVCApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMjkzNDozOiBSVUxFX0lOVAorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjQzNTg6MjogKCBSVUxFX0lOVCApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNDM1OTozOiBSVUxFX0lOVAogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXREYXRhSW50ZXJjaGFuZ2VMb29rdXBBY2Nlc3MoKS5nZXRDYWNoZVNpemVJTlRUZXJtaW5hbFJ1bGVDYWxsXzhfMV8wKCkpOyAKQEAgLTc1MTM3LDE3ICs3OTg0MywxNyBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX0RhdGFJbnRlcmNoYW5nZUxvb2t1cF9fRGF0YU1hcEFzc2lnbm1lbnRfOV8xIgotICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIyOTQzOjE6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUxvb2t1cF9fRGF0YU1hcEFzc2lnbm1lbnRfOV8xIDogKCBSVUxFX1NUUklORyApIDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNDM2ODoxOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VMb29rdXBfX0RhdGFNYXBBc3NpZ25tZW50XzlfMSA6ICggUlVMRV9TVFJJTkcgKSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fRGF0YUludGVyY2hhbmdlTG9va3VwX19EYXRhTWFwQXNzaWdubWVudF85XzEoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjI5NDc6MTogKCAoIFJVTEVfU1RSSU5HICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjI5NDg6MjogKCBSVUxFX1NUUklORyApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNDM3MjoxOiAoICggUlVMRV9TVFJJTkcgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNDM3MzoyOiAoIFJVTEVfU1RSSU5HICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIyOTQ4OjI6ICggUlVMRV9TVFJJTkcgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjI5NDk6MzogUlVMRV9TVFJJTkcKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI0MzczOjI6ICggUlVMRV9TVFJJTkcgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjQzNzQ6MzogUlVMRV9TVFJJTkcKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YUludGVyY2hhbmdlTG9va3VwQWNjZXNzKCkuZ2V0RGF0YU1hcFNUUklOR1Rlcm1pbmFsUnVsZUNhbGxfOV8xXzAoKSk7IApAQCAtNzUxNzgsMjggKzc5ODg0LDI4IEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fRGF0YUludGVyY2hhbmdlTG9va3VwX19BbGxvd05vUmVzdWx0QXNzaWdubWVudF8xMF8wIgotICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIyOTU4OjE6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUxvb2t1cF9fQWxsb3dOb1Jlc3VsdEFzc2lnbm1lbnRfMTBfMCA6ICggKCAnYWxsb3dOb1Jlc3VsdCcgKSApIDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNDM4MzoxOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VMb29rdXBfX0FsbG93Tm9SZXN1bHRBc3NpZ25tZW50XzEwXzAgOiAoICggJ2FsbG93Tm9SZXN1bHQnICkgKSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fRGF0YUludGVyY2hhbmdlTG9va3VwX19BbGxvd05vUmVzdWx0QXNzaWdubWVudF8xMF8wKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIyOTYyOjE6ICggKCAoICdhbGxvd05vUmVzdWx0JyApICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjI5NjM6MjogKCAoICdhbGxvd05vUmVzdWx0JyApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI0Mzg3OjE6ICggKCAoICdhbGxvd05vUmVzdWx0JyApICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjQzODg6MjogKCAoICdhbGxvd05vUmVzdWx0JyApICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIyOTYzOjI6ICggKCAnYWxsb3dOb1Jlc3VsdCcgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMjk2NDozOiAoICdhbGxvd05vUmVzdWx0JyApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNDM4ODoyOiAoICggJ2FsbG93Tm9SZXN1bHQnICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjQzODk6MzogKCAnYWxsb3dOb1Jlc3VsdCcgKQogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXREYXRhSW50ZXJjaGFuZ2VMb29rdXBBY2Nlc3MoKS5nZXRBbGxvd05vUmVzdWx0QWxsb3dOb1Jlc3VsdEtleXdvcmRfMTBfMF8wKCkpOyAKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIyOTY1OjM6ICggJ2FsbG93Tm9SZXN1bHQnICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIyOTY2OjQ6ICdhbGxvd05vUmVzdWx0JworICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjQzOTA6MzogKCAnYWxsb3dOb1Jlc3VsdCcgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjQzOTE6NDogJ2FsbG93Tm9SZXN1bHQnCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldERhdGFJbnRlcmNoYW5nZUxvb2t1cEFjY2VzcygpLmdldEFsbG93Tm9SZXN1bHRBbGxvd05vUmVzdWx0S2V5d29yZF8xMF8wXzAoKSk7IAogICAgICAgICAgICAgfQotICAgICAgICAgICAgbWF0Y2goaW5wdXQsMTQ2LEZPTExPV18yKTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKKyAgICAgICAgICAgIG1hdGNoKGlucHV0LDE1OCxGT0xMT1dfMik7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YUludGVyY2hhbmdlTG9va3VwQWNjZXNzKCkuZ2V0QWxsb3dOb1Jlc3VsdEFsbG93Tm9SZXN1bHRLZXl3b3JkXzEwXzBfMCgpKTsgCiAgICAgICAgICAgICB9CkBAIC03NTIzMSwyOCArNzk5MzcsMjggQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19EYXRhSW50ZXJjaGFuZ2VMb29rdXBfX0FsbG93Tm9udW5pcXVlUmVzdWx0QXNzaWdubWVudF8xMF8xIgotICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIyOTc3OjE6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUxvb2t1cF9fQWxsb3dOb251bmlxdWVSZXN1bHRBc3NpZ25tZW50XzEwXzEgOiAoICggJ2FsbG93Tm9udW5pcXVlUmVzdWx0JyApICkgOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI0NDAyOjE6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUxvb2t1cF9fQWxsb3dOb251bmlxdWVSZXN1bHRBc3NpZ25tZW50XzEwXzEgOiAoICggJ2FsbG93Tm9udW5pcXVlUmVzdWx0JyApICkgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUxvb2t1cF9fQWxsb3dOb251bmlxdWVSZXN1bHRBc3NpZ25tZW50XzEwXzEoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjI5ODE6MTogKCAoICggJ2FsbG93Tm9udW5pcXVlUmVzdWx0JyApICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjI5ODI6MjogKCAoICdhbGxvd05vbnVuaXF1ZVJlc3VsdCcgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNDQwNjoxOiAoICggKCAnYWxsb3dOb251bmlxdWVSZXN1bHQnICkgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNDQwNzoyOiAoICggJ2FsbG93Tm9udW5pcXVlUmVzdWx0JyApICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIyOTgyOjI6ICggKCAnYWxsb3dOb251bmlxdWVSZXN1bHQnICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjI5ODM6MzogKCAnYWxsb3dOb251bmlxdWVSZXN1bHQnICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI0NDA3OjI6ICggKCAnYWxsb3dOb251bmlxdWVSZXN1bHQnICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjQ0MDg6MzogKCAnYWxsb3dOb251bmlxdWVSZXN1bHQnICkKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YUludGVyY2hhbmdlTG9va3VwQWNjZXNzKCkuZ2V0QWxsb3dOb251bmlxdWVSZXN1bHRBbGxvd05vbnVuaXF1ZVJlc3VsdEtleXdvcmRfMTBfMV8wKCkpOyAKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIyOTg0OjM6ICggJ2FsbG93Tm9udW5pcXVlUmVzdWx0JyApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMjk4NTo0OiAnYWxsb3dOb251bmlxdWVSZXN1bHQnCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNDQwOTozOiAoICdhbGxvd05vbnVuaXF1ZVJlc3VsdCcgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjQ0MTA6NDogJ2FsbG93Tm9udW5pcXVlUmVzdWx0JwogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXREYXRhSW50ZXJjaGFuZ2VMb29rdXBBY2Nlc3MoKS5nZXRBbGxvd05vbnVuaXF1ZVJlc3VsdEFsbG93Tm9udW5pcXVlUmVzdWx0S2V5d29yZF8xMF8xXzAoKSk7IAogICAgICAgICAgICAgfQotICAgICAgICAgICAgbWF0Y2goaW5wdXQsMTQ3LEZPTExPV18yKTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKKyAgICAgICAgICAgIG1hdGNoKGlucHV0LDE1OSxGT0xMT1dfMik7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YUludGVyY2hhbmdlTG9va3VwQWNjZXNzKCkuZ2V0QWxsb3dOb251bmlxdWVSZXN1bHRBbGxvd05vbnVuaXF1ZVJlc3VsdEtleXdvcmRfMTBfMV8wKCkpOyAKICAgICAgICAgICAgIH0KQEAgLTc1Mjg0LDE3ICs3OTk5MCwxNyBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX0RhdGFJbnRlcmNoYW5nZUxvb2t1cF9fTWFya2VyUGF0aEFzc2lnbm1lbnRfMTBfMiIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMjk5NjoxOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VMb29rdXBfX01hcmtlclBhdGhBc3NpZ25tZW50XzEwXzIgOiAoIHJ1bGVEYXRhSW50ZXJjaGFuZ2VNYXJrZXJQYXRoICkgOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI0NDIxOjE6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUxvb2t1cF9fTWFya2VyUGF0aEFzc2lnbm1lbnRfMTBfMiA6ICggcnVsZURhdGFJbnRlcmNoYW5nZU1hcmtlclBhdGggKSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fRGF0YUludGVyY2hhbmdlTG9va3VwX19NYXJrZXJQYXRoQXNzaWdubWVudF8xMF8yKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIzMDAwOjE6ICggKCBydWxlRGF0YUludGVyY2hhbmdlTWFya2VyUGF0aCApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIzMDAxOjI6ICggcnVsZURhdGFJbnRlcmNoYW5nZU1hcmtlclBhdGggKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjQ0MjU6MTogKCAoIHJ1bGVEYXRhSW50ZXJjaGFuZ2VNYXJrZXJQYXRoICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjQ0MjY6MjogKCBydWxlRGF0YUludGVyY2hhbmdlTWFya2VyUGF0aCApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMzAwMToyOiAoIHJ1bGVEYXRhSW50ZXJjaGFuZ2VNYXJrZXJQYXRoICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIzMDAyOjM6IHJ1bGVEYXRhSW50ZXJjaGFuZ2VNYXJrZXJQYXRoCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNDQyNjoyOiAoIHJ1bGVEYXRhSW50ZXJjaGFuZ2VNYXJrZXJQYXRoICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI0NDI3OjM6IHJ1bGVEYXRhSW50ZXJjaGFuZ2VNYXJrZXJQYXRoCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldERhdGFJbnRlcmNoYW5nZUxvb2t1cEFjY2VzcygpLmdldE1hcmtlclBhdGhEYXRhSW50ZXJjaGFuZ2VNYXJrZXJQYXRoUGFyc2VyUnVsZUNhbGxfMTBfMl8wKCkpOyAKQEAgLTc1MzI5LDE3ICs4MDAzNSwxNyBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX0RhdGFJbnRlcmNoYW5nZU1hcmtlclBhdGhfX1BhdGhBc3NpZ25tZW50XzMiCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjMwMTE6MTogcnVsZV9fRGF0YUludGVyY2hhbmdlTWFya2VyUGF0aF9fUGF0aEFzc2lnbm1lbnRfMyA6ICggcnVsZURhdGFJbnRlcmNoYW5nZU1hcmtlckVudGl0eSApIDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNDQzNjoxOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VNYXJrZXJQYXRoX19QYXRoQXNzaWdubWVudF8zIDogKCBydWxlRGF0YUludGVyY2hhbmdlTWFya2VyRW50aXR5ICkgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZU1hcmtlclBhdGhfX1BhdGhBc3NpZ25tZW50XzMoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjMwMTU6MTogKCAoIHJ1bGVEYXRhSW50ZXJjaGFuZ2VNYXJrZXJFbnRpdHkgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMzAxNjoyOiAoIHJ1bGVEYXRhSW50ZXJjaGFuZ2VNYXJrZXJFbnRpdHkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjQ0NDA6MTogKCAoIHJ1bGVEYXRhSW50ZXJjaGFuZ2VNYXJrZXJFbnRpdHkgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNDQ0MToyOiAoIHJ1bGVEYXRhSW50ZXJjaGFuZ2VNYXJrZXJFbnRpdHkgKQogICAgICAgICAgICAgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjMwMTY6MjogKCBydWxlRGF0YUludGVyY2hhbmdlTWFya2VyRW50aXR5ICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIzMDE3OjM6IHJ1bGVEYXRhSW50ZXJjaGFuZ2VNYXJrZXJFbnRpdHkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI0NDQxOjI6ICggcnVsZURhdGFJbnRlcmNoYW5nZU1hcmtlckVudGl0eSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNDQ0MjozOiBydWxlRGF0YUludGVyY2hhbmdlTWFya2VyRW50aXR5CiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldERhdGFJbnRlcmNoYW5nZU1hcmtlclBhdGhBY2Nlc3MoKS5nZXRQYXRoRGF0YUludGVyY2hhbmdlTWFya2VyRW50aXR5UGFyc2VyUnVsZUNhbGxfM18wKCkpOyAKQEAgLTc1Mzc0LDIzICs4MDA4MCwyMyBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX0RhdGFJbnRlcmNoYW5nZU1hcmtlckVudGl0eV9fTWFya2VyRW50aXR5QXNzaWdubWVudF8yIgotICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIzMDI2OjE6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZU1hcmtlckVudGl0eV9fTWFya2VyRW50aXR5QXNzaWdubWVudF8yIDogKCAoIHJ1bGVMRlFOICkgKSA7CisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjQ0NTE6MTogcnVsZV9fRGF0YUludGVyY2hhbmdlTWFya2VyRW50aXR5X19NYXJrZXJFbnRpdHlBc3NpZ25tZW50XzIgOiAoICggcnVsZUxGUU4gKSApIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19EYXRhSW50ZXJjaGFuZ2VNYXJrZXJFbnRpdHlfX01hcmtlckVudGl0eUFzc2lnbm1lbnRfMigpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMzAzMDoxOiAoICggKCBydWxlTEZRTiApICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjMwMzE6MjogKCAoIHJ1bGVMRlFOICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjQ0NTU6MTogKCAoICggcnVsZUxGUU4gKSApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI0NDU2OjI6ICggKCBydWxlTEZRTiApICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIzMDMxOjI6ICggKCBydWxlTEZRTiApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIzMDMyOjM6ICggcnVsZUxGUU4gKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjQ0NTY6MjogKCAoIHJ1bGVMRlFOICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjQ0NTc6MzogKCBydWxlTEZRTiApCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldERhdGFJbnRlcmNoYW5nZU1hcmtlckVudGl0eUFjY2VzcygpLmdldE1hcmtlckVudGl0eUxFbnRpdHlDcm9zc1JlZmVyZW5jZV8yXzAoKSk7IAogICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjMwMzM6MzogKCBydWxlTEZRTiApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMzAzNDo0OiBydWxlTEZRTgorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjQ0NTg6MzogKCBydWxlTEZRTiApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNDQ1OTo0OiBydWxlTEZRTgogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXREYXRhSW50ZXJjaGFuZ2VNYXJrZXJFbnRpdHlBY2Nlc3MoKS5nZXRNYXJrZXJFbnRpdHlMRW50aXR5TEZRTlBhcnNlclJ1bGVDYWxsXzJfMF8xKCkpOyAKQEAgLTc1NDMxLDI4ICs4MDEzNywyOCBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX0RhdGFJbnRlcmNoYW5nZU1hcmtlckVudGl0eV9fTWFya0xhdGVzdEFzc2lnbm1lbnRfM18wIgotICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIzMDQ1OjE6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZU1hcmtlckVudGl0eV9fTWFya0xhdGVzdEFzc2lnbm1lbnRfM18wIDogKCAoICdtYXJrZWRCeScgKSApIDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNDQ3MDoxOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VNYXJrZXJFbnRpdHlfX01hcmtMYXRlc3RBc3NpZ25tZW50XzNfMCA6ICggKCAnbWFya2VkQnknICkgKSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fRGF0YUludGVyY2hhbmdlTWFya2VyRW50aXR5X19NYXJrTGF0ZXN0QXNzaWdubWVudF8zXzAoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjMwNDk6MTogKCAoICggJ21hcmtlZEJ5JyApICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjMwNTA6MjogKCAoICdtYXJrZWRCeScgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNDQ3NDoxOiAoICggKCAnbWFya2VkQnknICkgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNDQ3NToyOiAoICggJ21hcmtlZEJ5JyApICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIzMDUwOjI6ICggKCAnbWFya2VkQnknICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjMwNTE6MzogKCAnbWFya2VkQnknICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI0NDc1OjI6ICggKCAnbWFya2VkQnknICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjQ0NzY6MzogKCAnbWFya2VkQnknICkKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YUludGVyY2hhbmdlTWFya2VyRW50aXR5QWNjZXNzKCkuZ2V0TWFya0xhdGVzdE1hcmtlZEJ5S2V5d29yZF8zXzBfMCgpKTsgCiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMzA1MjozOiAoICdtYXJrZWRCeScgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjMwNTM6NDogJ21hcmtlZEJ5JworICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjQ0Nzc6MzogKCAnbWFya2VkQnknICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI0NDc4OjQ6ICdtYXJrZWRCeScKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YUludGVyY2hhbmdlTWFya2VyRW50aXR5QWNjZXNzKCkuZ2V0TWFya0xhdGVzdE1hcmtlZEJ5S2V5d29yZF8zXzBfMCgpKTsgCiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBtYXRjaChpbnB1dCwxNDgsRk9MTE9XXzIpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOworICAgICAgICAgICAgbWF0Y2goaW5wdXQsMTYwLEZPTExPV18yKTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXREYXRhSW50ZXJjaGFuZ2VNYXJrZXJFbnRpdHlBY2Nlc3MoKS5nZXRNYXJrTGF0ZXN0TWFya2VkQnlLZXl3b3JkXzNfMF8wKCkpOyAKICAgICAgICAgICAgIH0KQEAgLTc1NDg0LDIzICs4MDE5MCwyMyBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX0RhdGFJbnRlcmNoYW5nZU1hcmtlckVudGl0eV9fTWFya2VyUHJvcGVydHlBc3NpZ25tZW50XzNfMSIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMzA2NDoxOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VNYXJrZXJFbnRpdHlfX01hcmtlclByb3BlcnR5QXNzaWdubWVudF8zXzEgOiAoICggUlVMRV9JRCApICkgOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI0NDg5OjE6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZU1hcmtlckVudGl0eV9fTWFya2VyUHJvcGVydHlBc3NpZ25tZW50XzNfMSA6ICggKCBSVUxFX0lEICkgKSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fRGF0YUludGVyY2hhbmdlTWFya2VyRW50aXR5X19NYXJrZXJQcm9wZXJ0eUFzc2lnbm1lbnRfM18xKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIzMDY4OjE6ICggKCAoIFJVTEVfSUQgKSApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIzMDY5OjI6ICggKCBSVUxFX0lEICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjQ0OTM6MTogKCAoICggUlVMRV9JRCApICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjQ0OTQ6MjogKCAoIFJVTEVfSUQgKSApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMzA2OToyOiAoICggUlVMRV9JRCApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIzMDcwOjM6ICggUlVMRV9JRCApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNDQ5NDoyOiAoICggUlVMRV9JRCApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI0NDk1OjM6ICggUlVMRV9JRCApCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldERhdGFJbnRlcmNoYW5nZU1hcmtlckVudGl0eUFjY2VzcygpLmdldE1hcmtlclByb3BlcnR5TEVudGl0eUF0dHJpYnV0ZUNyb3NzUmVmZXJlbmNlXzNfMV8wKCkpOyAKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIzMDcxOjM6ICggUlVMRV9JRCApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMzA3Mjo0OiBSVUxFX0lECisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNDQ5NjozOiAoIFJVTEVfSUQgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjQ0OTc6NDogUlVMRV9JRAogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXREYXRhSW50ZXJjaGFuZ2VNYXJrZXJFbnRpdHlBY2Nlc3MoKS5nZXRNYXJrZXJQcm9wZXJ0eUxFbnRpdHlBdHRyaWJ1dGVJRFRlcm1pbmFsUnVsZUNhbGxfM18xXzBfMSgpKTsgCkBAIC03NTUzNywyMyArODAyNDMsMjMgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19EYXRhSW50ZXJjaGFuZ2VGb3JtYXRfX1RhcmdldFByb3BlcnR5QXNzaWdubWVudF8yIgotICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIzMDgzOjE6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZvcm1hdF9fVGFyZ2V0UHJvcGVydHlBc3NpZ25tZW50XzIgOiAoICggUlVMRV9JRCApICkgOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI0NTA4OjE6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZvcm1hdF9fVGFyZ2V0UHJvcGVydHlBc3NpZ25tZW50XzIgOiAoICggUlVMRV9JRCApICkgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZvcm1hdF9fVGFyZ2V0UHJvcGVydHlBc3NpZ25tZW50XzIoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjMwODc6MTogKCAoICggUlVMRV9JRCApICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjMwODg6MjogKCAoIFJVTEVfSUQgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNDUxMjoxOiAoICggKCBSVUxFX0lEICkgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNDUxMzoyOiAoICggUlVMRV9JRCApICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIzMDg4OjI6ICggKCBSVUxFX0lEICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjMwODk6MzogKCBSVUxFX0lEICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI0NTEzOjI6ICggKCBSVUxFX0lEICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjQ1MTQ6MzogKCBSVUxFX0lEICkKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YUludGVyY2hhbmdlRm9ybWF0QWNjZXNzKCkuZ2V0VGFyZ2V0UHJvcGVydHlMRW50aXR5QXR0cmlidXRlQ3Jvc3NSZWZlcmVuY2VfMl8wKCkpOyAKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIzMDkwOjM6ICggUlVMRV9JRCApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMzA5MTo0OiBSVUxFX0lECisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNDUxNTozOiAoIFJVTEVfSUQgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjQ1MTY6NDogUlVMRV9JRAogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXREYXRhSW50ZXJjaGFuZ2VGb3JtYXRBY2Nlc3MoKS5nZXRUYXJnZXRQcm9wZXJ0eUxFbnRpdHlBdHRyaWJ1dGVJRFRlcm1pbmFsUnVsZUNhbGxfMl8wXzEoKSk7IApAQCAtNzU1OTAsMTcgKzgwMjk2LDE3IEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fRGF0YUludGVyY2hhbmdlRm9ybWF0X19Gb3JtYXRBc3NpZ25tZW50XzQiCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjMxMDI6MTogcnVsZV9fRGF0YUludGVyY2hhbmdlRm9ybWF0X19Gb3JtYXRBc3NpZ25tZW50XzQgOiAoIFJVTEVfU1RSSU5HICkgOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI0NTI3OjE6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZvcm1hdF9fRm9ybWF0QXNzaWdubWVudF80IDogKCBSVUxFX1NUUklORyApIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19EYXRhSW50ZXJjaGFuZ2VGb3JtYXRfX0Zvcm1hdEFzc2lnbm1lbnRfNCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMzEwNjoxOiAoICggUlVMRV9TVFJJTkcgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMzEwNzoyOiAoIFJVTEVfU1RSSU5HICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI0NTMxOjE6ICggKCBSVUxFX1NUUklORyApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI0NTMyOjI6ICggUlVMRV9TVFJJTkcgKQogICAgICAgICAgICAgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjMxMDc6MjogKCBSVUxFX1NUUklORyApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMzEwODozOiBSVUxFX1NUUklORworICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjQ1MzI6MjogKCBSVUxFX1NUUklORyApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNDUzMzozOiBSVUxFX1NUUklORwogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXREYXRhSW50ZXJjaGFuZ2VGb3JtYXRBY2Nlc3MoKS5nZXRGb3JtYXRTVFJJTkdUZXJtaW5hbFJ1bGVDYWxsXzRfMCgpKTsgCkBAIC03NTYzMSwyMyArODAzMzcsMjMgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19EYXRhSW50ZXJjaGFuZ2VFbnRpdHlFeHByZXNzaW9uX19UYXJnZXRQcm9wZXJ0eUFzc2lnbm1lbnRfMiIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMzExNzoxOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VFbnRpdHlFeHByZXNzaW9uX19UYXJnZXRQcm9wZXJ0eUFzc2lnbm1lbnRfMiA6ICggKCBSVUxFX0lEICkgKSA7CisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjQ1NDI6MTogcnVsZV9fRGF0YUludGVyY2hhbmdlRW50aXR5RXhwcmVzc2lvbl9fVGFyZ2V0UHJvcGVydHlBc3NpZ25tZW50XzIgOiAoICggUlVMRV9JRCApICkgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUVudGl0eUV4cHJlc3Npb25fX1RhcmdldFByb3BlcnR5QXNzaWdubWVudF8yKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIzMTIxOjE6ICggKCAoIFJVTEVfSUQgKSApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIzMTIyOjI6ICggKCBSVUxFX0lEICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjQ1NDY6MTogKCAoICggUlVMRV9JRCApICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjQ1NDc6MjogKCAoIFJVTEVfSUQgKSApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMzEyMjoyOiAoICggUlVMRV9JRCApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIzMTIzOjM6ICggUlVMRV9JRCApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNDU0NzoyOiAoICggUlVMRV9JRCApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI0NTQ4OjM6ICggUlVMRV9JRCApCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldERhdGFJbnRlcmNoYW5nZUVudGl0eUV4cHJlc3Npb25BY2Nlc3MoKS5nZXRUYXJnZXRQcm9wZXJ0eUxFbnRpdHlBdHRyaWJ1dGVDcm9zc1JlZmVyZW5jZV8yXzAoKSk7IAogICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjMxMjQ6MzogKCBSVUxFX0lEICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIzMTI1OjQ6IFJVTEVfSUQKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI0NTQ5OjM6ICggUlVMRV9JRCApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNDU1MDo0OiBSVUxFX0lECiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldERhdGFJbnRlcmNoYW5nZUVudGl0eUV4cHJlc3Npb25BY2Nlc3MoKS5nZXRUYXJnZXRQcm9wZXJ0eUxFbnRpdHlBdHRyaWJ1dGVJRFRlcm1pbmFsUnVsZUNhbGxfMl8wXzEoKSk7IApAQCAtNzU2ODQsMjMgKzgwMzkwLDIzIEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fRGF0YUludGVyY2hhbmdlRW50aXR5RXhwcmVzc2lvbl9fRW50aXR5QXNzaWdubWVudF80IgotICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIzMTM2OjE6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUVudGl0eUV4cHJlc3Npb25fX0VudGl0eUFzc2lnbm1lbnRfNCA6ICggKCBydWxlTEZRTiApICkgOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI0NTYxOjE6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUVudGl0eUV4cHJlc3Npb25fX0VudGl0eUFzc2lnbm1lbnRfNCA6ICggKCBydWxlTEZRTiApICkgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUVudGl0eUV4cHJlc3Npb25fX0VudGl0eUFzc2lnbm1lbnRfNCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMzE0MDoxOiAoICggKCBydWxlTEZRTiApICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjMxNDE6MjogKCAoIHJ1bGVMRlFOICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjQ1NjU6MTogKCAoICggcnVsZUxGUU4gKSApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI0NTY2OjI6ICggKCBydWxlTEZRTiApICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIzMTQxOjI6ICggKCBydWxlTEZRTiApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIzMTQyOjM6ICggcnVsZUxGUU4gKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjQ1NjY6MjogKCAoIHJ1bGVMRlFOICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjQ1Njc6MzogKCBydWxlTEZRTiApCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldERhdGFJbnRlcmNoYW5nZUVudGl0eUV4cHJlc3Npb25BY2Nlc3MoKS5nZXRFbnRpdHlMRW50aXR5Q3Jvc3NSZWZlcmVuY2VfNF8wKCkpOyAKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIzMTQzOjM6ICggcnVsZUxGUU4gKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjMxNDQ6NDogcnVsZUxGUU4KKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI0NTY4OjM6ICggcnVsZUxGUU4gKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjQ1Njk6NDogcnVsZUxGUU4KICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YUludGVyY2hhbmdlRW50aXR5RXhwcmVzc2lvbkFjY2VzcygpLmdldEVudGl0eUxFbnRpdHlMRlFOUGFyc2VyUnVsZUNhbGxfNF8wXzEoKSk7IApAQCAtNzU3NDEsMjMgKzgwNDQ3LDIzIEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fRGF0YUludGVyY2hhbmdlRW50aXR5RXhwcmVzc2lvbl9fUHJvcGVydHlBc3NpZ25tZW50XzYiCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjMxNTU6MTogcnVsZV9fRGF0YUludGVyY2hhbmdlRW50aXR5RXhwcmVzc2lvbl9fUHJvcGVydHlBc3NpZ25tZW50XzYgOiAoICggUlVMRV9JRCApICkgOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI0NTgwOjE6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUVudGl0eUV4cHJlc3Npb25fX1Byb3BlcnR5QXNzaWdubWVudF82IDogKCAoIFJVTEVfSUQgKSApIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19EYXRhSW50ZXJjaGFuZ2VFbnRpdHlFeHByZXNzaW9uX19Qcm9wZXJ0eUFzc2lnbm1lbnRfNigpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMzE1OToxOiAoICggKCBSVUxFX0lEICkgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMzE2MDoyOiAoICggUlVMRV9JRCApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI0NTg0OjE6ICggKCAoIFJVTEVfSUQgKSApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI0NTg1OjI6ICggKCBSVUxFX0lEICkgKQogICAgICAgICAgICAgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjMxNjA6MjogKCAoIFJVTEVfSUQgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMzE2MTozOiAoIFJVTEVfSUQgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjQ1ODU6MjogKCAoIFJVTEVfSUQgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNDU4NjozOiAoIFJVTEVfSUQgKQogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXREYXRhSW50ZXJjaGFuZ2VFbnRpdHlFeHByZXNzaW9uQWNjZXNzKCkuZ2V0UHJvcGVydHlMRW50aXR5QXR0cmlidXRlQ3Jvc3NSZWZlcmVuY2VfNl8wKCkpOyAKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIzMTYyOjM6ICggUlVMRV9JRCApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMzE2Mzo0OiBSVUxFX0lECisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNDU4NzozOiAoIFJVTEVfSUQgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjQ1ODg6NDogUlVMRV9JRAogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXREYXRhSW50ZXJjaGFuZ2VFbnRpdHlFeHByZXNzaW9uQWNjZXNzKCkuZ2V0UHJvcGVydHlMRW50aXR5QXR0cmlidXRlSURUZXJtaW5hbFJ1bGVDYWxsXzZfMF8xKCkpOyAKQEAgLTc1NzkzLDI0ICs4MDQ5OSw1NDcgQEAKICAgICAvLyAkQU5UTFIgZW5kICJydWxlX19EYXRhSW50ZXJjaGFuZ2VFbnRpdHlFeHByZXNzaW9uX19Qcm9wZXJ0eUFzc2lnbm1lbnRfNiIKIAogCisgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19EYXRhSW50ZXJjaGFuZ2VFeHBvc2VfX1JlZkVudGl0eUFzc2lnbm1lbnRfMiIKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNDU5OToxOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VFeHBvc2VfX1JlZkVudGl0eUFzc2lnbm1lbnRfMiA6ICggKCBSVUxFX0lEICkgKSA7CisgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fRGF0YUludGVyY2hhbmdlRXhwb3NlX19SZWZFbnRpdHlBc3NpZ25tZW50XzIoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworCisgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICAgICAgCQorICAgICAgICB0cnkgeworICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjQ2MDM6MTogKCAoICggUlVMRV9JRCApICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjQ2MDQ6MjogKCAoIFJVTEVfSUQgKSApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNDYwNDoyOiAoICggUlVMRV9JRCApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI0NjA1OjM6ICggUlVMRV9JRCApCisgICAgICAgICAgICB7CisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldERhdGFJbnRlcmNoYW5nZUV4cG9zZUFjY2VzcygpLmdldFJlZkVudGl0eUxFbnRpdHlSZWZlcmVuY2VDcm9zc1JlZmVyZW5jZV8yXzAoKSk7IAorICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjQ2MDY6MzogKCBSVUxFX0lEICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI0NjA3OjQ6IFJVTEVfSUQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YUludGVyY2hhbmdlRXhwb3NlQWNjZXNzKCkuZ2V0UmVmRW50aXR5TEVudGl0eVJlZmVyZW5jZUlEVGVybWluYWxSdWxlQ2FsbF8yXzBfMSgpKTsgCisgICAgICAgICAgICB9CisgICAgICAgICAgICBtYXRjaChpbnB1dCxSVUxFX0lELEZPTExPV18yKTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXREYXRhSW50ZXJjaGFuZ2VFeHBvc2VBY2Nlc3MoKS5nZXRSZWZFbnRpdHlMRW50aXR5UmVmZXJlbmNlSURUZXJtaW5hbFJ1bGVDYWxsXzJfMF8xKCkpOyAKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YUludGVyY2hhbmdlRXhwb3NlQWNjZXNzKCkuZ2V0UmVmRW50aXR5TEVudGl0eVJlZmVyZW5jZUNyb3NzUmVmZXJlbmNlXzJfMCgpKTsgCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICB9CisKKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoUmVjb2duaXRpb25FeGNlcHRpb24gcmUpIHsKKyAgICAgICAgICAgIHJlcG9ydEVycm9yKHJlKTsKKyAgICAgICAgICAgIHJlY292ZXIoaW5wdXQscmUpOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworCisgICAgICAgICAgICAJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworCisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIDsKKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAicnVsZV9fRGF0YUludGVyY2hhbmdlRXhwb3NlX19SZWZFbnRpdHlBc3NpZ25tZW50XzIiCisKKworICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fRGF0YUludGVyY2hhbmdlRXhwb3NlX19SZWZQcm9wZXJ0eUFzc2lnbm1lbnRfM18wXzEiCisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjQ2MTg6MTogcnVsZV9fRGF0YUludGVyY2hhbmdlRXhwb3NlX19SZWZQcm9wZXJ0eUFzc2lnbm1lbnRfM18wXzEgOiAoICggUlVMRV9JRCApICkgOworICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUV4cG9zZV9fUmVmUHJvcGVydHlBc3NpZ25tZW50XzNfMF8xKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKworICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgICAgIAkKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI0NjIyOjE6ICggKCAoIFJVTEVfSUQgKSApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI0NjIzOjI6ICggKCBSVUxFX0lEICkgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjQ2MjM6MjogKCAoIFJVTEVfSUQgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNDYyNDozOiAoIFJVTEVfSUQgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXREYXRhSW50ZXJjaGFuZ2VFeHBvc2VBY2Nlc3MoKS5nZXRSZWZQcm9wZXJ0eUxFbnRpdHlBdHRyaWJ1dGVDcm9zc1JlZmVyZW5jZV8zXzBfMV8wKCkpOyAKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI0NjI1OjM6ICggUlVMRV9JRCApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNDYyNjo0OiBSVUxFX0lECisgICAgICAgICAgICB7CisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldERhdGFJbnRlcmNoYW5nZUV4cG9zZUFjY2VzcygpLmdldFJlZlByb3BlcnR5TEVudGl0eUF0dHJpYnV0ZUlEVGVybWluYWxSdWxlQ2FsbF8zXzBfMV8wXzEoKSk7IAorICAgICAgICAgICAgfQorICAgICAgICAgICAgbWF0Y2goaW5wdXQsUlVMRV9JRCxGT0xMT1dfMik7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YUludGVyY2hhbmdlRXhwb3NlQWNjZXNzKCkuZ2V0UmVmUHJvcGVydHlMRW50aXR5QXR0cmlidXRlSURUZXJtaW5hbFJ1bGVDYWxsXzNfMF8xXzBfMSgpKTsgCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBhZnRlcihncmFtbWFyQWNjZXNzLmdldERhdGFJbnRlcmNoYW5nZUV4cG9zZUFjY2VzcygpLmdldFJlZlByb3BlcnR5TEVudGl0eUF0dHJpYnV0ZUNyb3NzUmVmZXJlbmNlXzNfMF8xXzAoKSk7IAorICAgICAgICAgICAgfQorCisgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgfQorCisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKFJlY29nbml0aW9uRXhjZXB0aW9uIHJlKSB7CisgICAgICAgICAgICByZXBvcnRFcnJvcihyZSk7CisgICAgICAgICAgICByZWNvdmVyKGlucHV0LHJlKTsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKworICAgICAgICAgICAgCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKKworICAgICAgICB9CisgICAgICAgIHJldHVybiA7CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgInJ1bGVfX0RhdGFJbnRlcmNoYW5nZUV4cG9zZV9fUmVmUHJvcGVydHlBc3NpZ25tZW50XzNfMF8xIgorCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX0RhdGFJbnRlcmNoYW5nZUV4cG9zZV9fU3ViRXhwb3NlQXNzaWdubWVudF8zXzFfMiIKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNDYzNzoxOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VFeHBvc2VfX1N1YkV4cG9zZUFzc2lnbm1lbnRfM18xXzIgOiAoIHJ1bGVEYXRhSW50ZXJjaGFuZ2VFeHBvc2UgKSA7CisgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fRGF0YUludGVyY2hhbmdlRXhwb3NlX19TdWJFeHBvc2VBc3NpZ25tZW50XzNfMV8yKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKworICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgICAgIAkKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI0NjQxOjE6ICggKCBydWxlRGF0YUludGVyY2hhbmdlRXhwb3NlICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjQ2NDI6MjogKCBydWxlRGF0YUludGVyY2hhbmdlRXhwb3NlICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI0NjQyOjI6ICggcnVsZURhdGFJbnRlcmNoYW5nZUV4cG9zZSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNDY0MzozOiBydWxlRGF0YUludGVyY2hhbmdlRXhwb3NlCisgICAgICAgICAgICB7CisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldERhdGFJbnRlcmNoYW5nZUV4cG9zZUFjY2VzcygpLmdldFN1YkV4cG9zZURhdGFJbnRlcmNoYW5nZUV4cG9zZVBhcnNlclJ1bGVDYWxsXzNfMV8yXzAoKSk7IAorICAgICAgICAgICAgfQorICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMik7CisgICAgICAgICAgICBydWxlRGF0YUludGVyY2hhbmdlRXhwb3NlKCk7CisKKyAgICAgICAgICAgIHN0YXRlLl9mc3AtLTsKKyAgICAgICAgICAgIGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YUludGVyY2hhbmdlRXhwb3NlQWNjZXNzKCkuZ2V0U3ViRXhwb3NlRGF0YUludGVyY2hhbmdlRXhwb3NlUGFyc2VyUnVsZUNhbGxfM18xXzJfMCgpKTsgCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICB9CisKKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoUmVjb2duaXRpb25FeGNlcHRpb24gcmUpIHsKKyAgICAgICAgICAgIHJlcG9ydEVycm9yKHJlKTsKKyAgICAgICAgICAgIHJlY292ZXIoaW5wdXQscmUpOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworCisgICAgICAgICAgICAJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworCisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIDsKKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAicnVsZV9fRGF0YUludGVyY2hhbmdlRXhwb3NlX19TdWJFeHBvc2VBc3NpZ25tZW50XzNfMV8yIgorCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX0RhdGFJbnRlcmNoYW5nZUV4cG9ydEZpbHRlcl9fQ29uZGl0aW9uQXNzaWdubWVudF8xXzIiCisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjQ2NTI6MTogcnVsZV9fRGF0YUludGVyY2hhbmdlRXhwb3J0RmlsdGVyX19Db25kaXRpb25Bc3NpZ25tZW50XzFfMiA6ICggcnVsZURhdGFJbnRlcmNoYW5nZUZpbHRlckNvbmRpdGlvbiApIDsKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19EYXRhSW50ZXJjaGFuZ2VFeHBvcnRGaWx0ZXJfX0NvbmRpdGlvbkFzc2lnbm1lbnRfMV8yKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKworICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgICAgIAkKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI0NjU2OjE6ICggKCBydWxlRGF0YUludGVyY2hhbmdlRmlsdGVyQ29uZGl0aW9uICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjQ2NTc6MjogKCBydWxlRGF0YUludGVyY2hhbmdlRmlsdGVyQ29uZGl0aW9uICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI0NjU3OjI6ICggcnVsZURhdGFJbnRlcmNoYW5nZUZpbHRlckNvbmRpdGlvbiApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNDY1ODozOiBydWxlRGF0YUludGVyY2hhbmdlRmlsdGVyQ29uZGl0aW9uCisgICAgICAgICAgICB7CisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldERhdGFJbnRlcmNoYW5nZUV4cG9ydEZpbHRlckFjY2VzcygpLmdldENvbmRpdGlvbkRhdGFJbnRlcmNoYW5nZUZpbHRlckNvbmRpdGlvblBhcnNlclJ1bGVDYWxsXzFfMl8wKCkpOyAKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzIpOworICAgICAgICAgICAgcnVsZURhdGFJbnRlcmNoYW5nZUZpbHRlckNvbmRpdGlvbigpOworCisgICAgICAgICAgICBzdGF0ZS5fZnNwLS07CisgICAgICAgICAgICBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBhZnRlcihncmFtbWFyQWNjZXNzLmdldERhdGFJbnRlcmNoYW5nZUV4cG9ydEZpbHRlckFjY2VzcygpLmdldENvbmRpdGlvbkRhdGFJbnRlcmNoYW5nZUZpbHRlckNvbmRpdGlvblBhcnNlclJ1bGVDYWxsXzFfMl8wKCkpOyAKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgIH0KKworICAgICAgICB9CisgICAgICAgIGNhdGNoIChSZWNvZ25pdGlvbkV4Y2VwdGlvbiByZSkgeworICAgICAgICAgICAgcmVwb3J0RXJyb3IocmUpOworICAgICAgICAgICAgcmVjb3ZlcihpbnB1dCxyZSk7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisKKyAgICAgICAgICAgIAlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7CisKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gOworICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJydWxlX19EYXRhSW50ZXJjaGFuZ2VFeHBvcnRGaWx0ZXJfX0NvbmRpdGlvbkFzc2lnbm1lbnRfMV8yIgorCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX0RhdGFJbnRlcmNoYW5nZUV4cG9ydEZpbHRlcl9fSGlkZGVucHJvcGVydGllc0Fzc2lnbm1lbnRfMl8xIgorICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI0NjY3OjE6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUV4cG9ydEZpbHRlcl9fSGlkZGVucHJvcGVydGllc0Fzc2lnbm1lbnRfMl8xIDogKCBydWxlRGF0YUludGVyY2hhbmdlRXhwb3J0SGlkZSApIDsKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19EYXRhSW50ZXJjaGFuZ2VFeHBvcnRGaWx0ZXJfX0hpZGRlbnByb3BlcnRpZXNBc3NpZ25tZW50XzJfMSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisKKyAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgICAgICAJCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNDY3MToxOiAoICggcnVsZURhdGFJbnRlcmNoYW5nZUV4cG9ydEhpZGUgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNDY3MjoyOiAoIHJ1bGVEYXRhSW50ZXJjaGFuZ2VFeHBvcnRIaWRlICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI0NjcyOjI6ICggcnVsZURhdGFJbnRlcmNoYW5nZUV4cG9ydEhpZGUgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjQ2NzM6MzogcnVsZURhdGFJbnRlcmNoYW5nZUV4cG9ydEhpZGUKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YUludGVyY2hhbmdlRXhwb3J0RmlsdGVyQWNjZXNzKCkuZ2V0SGlkZGVucHJvcGVydGllc0RhdGFJbnRlcmNoYW5nZUV4cG9ydEhpZGVQYXJzZXJSdWxlQ2FsbF8yXzFfMCgpKTsgCisgICAgICAgICAgICB9CisgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV18yKTsKKyAgICAgICAgICAgIHJ1bGVEYXRhSW50ZXJjaGFuZ2VFeHBvcnRIaWRlKCk7CisKKyAgICAgICAgICAgIHN0YXRlLl9mc3AtLTsKKyAgICAgICAgICAgIGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YUludGVyY2hhbmdlRXhwb3J0RmlsdGVyQWNjZXNzKCkuZ2V0SGlkZGVucHJvcGVydGllc0RhdGFJbnRlcmNoYW5nZUV4cG9ydEhpZGVQYXJzZXJSdWxlQ2FsbF8yXzFfMCgpKTsgCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICB9CisKKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoUmVjb2duaXRpb25FeGNlcHRpb24gcmUpIHsKKyAgICAgICAgICAgIHJlcG9ydEVycm9yKHJlKTsKKyAgICAgICAgICAgIHJlY292ZXIoaW5wdXQscmUpOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworCisgICAgICAgICAgICAJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworCisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIDsKKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAicnVsZV9fRGF0YUludGVyY2hhbmdlRXhwb3J0RmlsdGVyX19IaWRkZW5wcm9wZXJ0aWVzQXNzaWdubWVudF8yXzEiCisKKworICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fRGF0YUludGVyY2hhbmdlRmlsdGVyQ29uZGl0aW9uX19SZWZQcm9wZXJ0eUFzc2lnbm1lbnRfMCIKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNDY4MjoxOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VGaWx0ZXJDb25kaXRpb25fX1JlZlByb3BlcnR5QXNzaWdubWVudF8wIDogKCAoIFJVTEVfSUQgKSApIDsKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19EYXRhSW50ZXJjaGFuZ2VGaWx0ZXJDb25kaXRpb25fX1JlZlByb3BlcnR5QXNzaWdubWVudF8wKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKworICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgICAgIAkKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI0Njg2OjE6ICggKCAoIFJVTEVfSUQgKSApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI0Njg3OjI6ICggKCBSVUxFX0lEICkgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjQ2ODc6MjogKCAoIFJVTEVfSUQgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNDY4ODozOiAoIFJVTEVfSUQgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXREYXRhSW50ZXJjaGFuZ2VGaWx0ZXJDb25kaXRpb25BY2Nlc3MoKS5nZXRSZWZQcm9wZXJ0eUxFbnRpdHlGZWF0dXJlQ3Jvc3NSZWZlcmVuY2VfMF8wKCkpOyAKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI0Njg5OjM6ICggUlVMRV9JRCApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNDY5MDo0OiBSVUxFX0lECisgICAgICAgICAgICB7CisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldERhdGFJbnRlcmNoYW5nZUZpbHRlckNvbmRpdGlvbkFjY2VzcygpLmdldFJlZlByb3BlcnR5TEVudGl0eUZlYXR1cmVJRFRlcm1pbmFsUnVsZUNhbGxfMF8wXzEoKSk7IAorICAgICAgICAgICAgfQorICAgICAgICAgICAgbWF0Y2goaW5wdXQsUlVMRV9JRCxGT0xMT1dfMik7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YUludGVyY2hhbmdlRmlsdGVyQ29uZGl0aW9uQWNjZXNzKCkuZ2V0UmVmUHJvcGVydHlMRW50aXR5RmVhdHVyZUlEVGVybWluYWxSdWxlQ2FsbF8wXzBfMSgpKTsgCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBhZnRlcihncmFtbWFyQWNjZXNzLmdldERhdGFJbnRlcmNoYW5nZUZpbHRlckNvbmRpdGlvbkFjY2VzcygpLmdldFJlZlByb3BlcnR5TEVudGl0eUZlYXR1cmVDcm9zc1JlZmVyZW5jZV8wXzAoKSk7IAorICAgICAgICAgICAgfQorCisgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgfQorCisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKFJlY29nbml0aW9uRXhjZXB0aW9uIHJlKSB7CisgICAgICAgICAgICByZXBvcnRFcnJvcihyZSk7CisgICAgICAgICAgICByZWNvdmVyKGlucHV0LHJlKTsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKworICAgICAgICAgICAgCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKKworICAgICAgICB9CisgICAgICAgIHJldHVybiA7CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgInJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbHRlckNvbmRpdGlvbl9fUmVmUHJvcGVydHlBc3NpZ25tZW50XzAiCisKKworICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fRGF0YUludGVyY2hhbmdlRmlsdGVyQ29uZGl0aW9uX19PcGVyYXRvckFzc2lnbm1lbnRfMSIKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNDcwMToxOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VGaWx0ZXJDb25kaXRpb25fX09wZXJhdG9yQXNzaWdubWVudF8xIDogKCBydWxlQ29uZGl0aW9uQW5kT3BlcmF0b3IxICkgOworICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbHRlckNvbmRpdGlvbl9fT3BlcmF0b3JBc3NpZ25tZW50XzEoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworCisgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICAgICAgCQorICAgICAgICB0cnkgeworICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjQ3MDU6MTogKCAoIHJ1bGVDb25kaXRpb25BbmRPcGVyYXRvcjEgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNDcwNjoyOiAoIHJ1bGVDb25kaXRpb25BbmRPcGVyYXRvcjEgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjQ3MDY6MjogKCBydWxlQ29uZGl0aW9uQW5kT3BlcmF0b3IxICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI0NzA3OjM6IHJ1bGVDb25kaXRpb25BbmRPcGVyYXRvcjEKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YUludGVyY2hhbmdlRmlsdGVyQ29uZGl0aW9uQWNjZXNzKCkuZ2V0T3BlcmF0b3JDb25kaXRpb25BbmRPcGVyYXRvcjFFbnVtUnVsZUNhbGxfMV8wKCkpOyAKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzIpOworICAgICAgICAgICAgcnVsZUNvbmRpdGlvbkFuZE9wZXJhdG9yMSgpOworCisgICAgICAgICAgICBzdGF0ZS5fZnNwLS07CisgICAgICAgICAgICBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBhZnRlcihncmFtbWFyQWNjZXNzLmdldERhdGFJbnRlcmNoYW5nZUZpbHRlckNvbmRpdGlvbkFjY2VzcygpLmdldE9wZXJhdG9yQ29uZGl0aW9uQW5kT3BlcmF0b3IxRW51bVJ1bGVDYWxsXzFfMCgpKTsgCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICB9CisKKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoUmVjb2duaXRpb25FeGNlcHRpb24gcmUpIHsKKyAgICAgICAgICAgIHJlcG9ydEVycm9yKHJlKTsKKyAgICAgICAgICAgIHJlY292ZXIoaW5wdXQscmUpOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworCisgICAgICAgICAgICAJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworCisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIDsKKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAicnVsZV9fRGF0YUludGVyY2hhbmdlRmlsdGVyQ29uZGl0aW9uX19PcGVyYXRvckFzc2lnbm1lbnRfMSIKKworCisgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19EYXRhSW50ZXJjaGFuZ2VGaWx0ZXJDb25kaXRpb25fX1ZhbHVlQXNzaWdubWVudF8yIgorICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI0NzE2OjE6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbHRlckNvbmRpdGlvbl9fVmFsdWVBc3NpZ25tZW50XzIgOiAoIFJVTEVfU1RSSU5HICkgOworICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbHRlckNvbmRpdGlvbl9fVmFsdWVBc3NpZ25tZW50XzIoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworCisgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICAgICAgCQorICAgICAgICB0cnkgeworICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjQ3MjA6MTogKCAoIFJVTEVfU1RSSU5HICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjQ3MjE6MjogKCBSVUxFX1NUUklORyApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNDcyMToyOiAoIFJVTEVfU1RSSU5HICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI0NzIyOjM6IFJVTEVfU1RSSU5HCisgICAgICAgICAgICB7CisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldERhdGFJbnRlcmNoYW5nZUZpbHRlckNvbmRpdGlvbkFjY2VzcygpLmdldFZhbHVlU1RSSU5HVGVybWluYWxSdWxlQ2FsbF8yXzAoKSk7IAorICAgICAgICAgICAgfQorICAgICAgICAgICAgbWF0Y2goaW5wdXQsUlVMRV9TVFJJTkcsRk9MTE9XXzIpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBhZnRlcihncmFtbWFyQWNjZXNzLmdldERhdGFJbnRlcmNoYW5nZUZpbHRlckNvbmRpdGlvbkFjY2VzcygpLmdldFZhbHVlU1RSSU5HVGVybWluYWxSdWxlQ2FsbF8yXzAoKSk7IAorICAgICAgICAgICAgfQorCisgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgfQorCisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKFJlY29nbml0aW9uRXhjZXB0aW9uIHJlKSB7CisgICAgICAgICAgICByZXBvcnRFcnJvcihyZSk7CisgICAgICAgICAgICByZWNvdmVyKGlucHV0LHJlKTsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKworICAgICAgICAgICAgCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKKworICAgICAgICB9CisgICAgICAgIHJldHVybiA7CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgInJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbHRlckNvbmRpdGlvbl9fVmFsdWVBc3NpZ25tZW50XzIiCisKKworICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fRGF0YUludGVyY2hhbmdlRmlsdGVyQ29uZGl0aW9uX19PcGVyYXRvcjJBc3NpZ25tZW50XzNfMCIKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNDczMToxOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VGaWx0ZXJDb25kaXRpb25fX09wZXJhdG9yMkFzc2lnbm1lbnRfM18wIDogKCBydWxlQ29uZGl0aW9uQW5kT3BlcmF0b3IyICkgOworICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbHRlckNvbmRpdGlvbl9fT3BlcmF0b3IyQXNzaWdubWVudF8zXzAoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworCisgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICAgICAgCQorICAgICAgICB0cnkgeworICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjQ3MzU6MTogKCAoIHJ1bGVDb25kaXRpb25BbmRPcGVyYXRvcjIgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNDczNjoyOiAoIHJ1bGVDb25kaXRpb25BbmRPcGVyYXRvcjIgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjQ3MzY6MjogKCBydWxlQ29uZGl0aW9uQW5kT3BlcmF0b3IyICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI0NzM3OjM6IHJ1bGVDb25kaXRpb25BbmRPcGVyYXRvcjIKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YUludGVyY2hhbmdlRmlsdGVyQ29uZGl0aW9uQWNjZXNzKCkuZ2V0T3BlcmF0b3IyQ29uZGl0aW9uQW5kT3BlcmF0b3IyRW51bVJ1bGVDYWxsXzNfMF8wKCkpOyAKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzIpOworICAgICAgICAgICAgcnVsZUNvbmRpdGlvbkFuZE9wZXJhdG9yMigpOworCisgICAgICAgICAgICBzdGF0ZS5fZnNwLS07CisgICAgICAgICAgICBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBhZnRlcihncmFtbWFyQWNjZXNzLmdldERhdGFJbnRlcmNoYW5nZUZpbHRlckNvbmRpdGlvbkFjY2VzcygpLmdldE9wZXJhdG9yMkNvbmRpdGlvbkFuZE9wZXJhdG9yMkVudW1SdWxlQ2FsbF8zXzBfMCgpKTsgCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICB9CisKKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoUmVjb2duaXRpb25FeGNlcHRpb24gcmUpIHsKKyAgICAgICAgICAgIHJlcG9ydEVycm9yKHJlKTsKKyAgICAgICAgICAgIHJlY292ZXIoaW5wdXQscmUpOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworCisgICAgICAgICAgICAJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworCisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIDsKKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAicnVsZV9fRGF0YUludGVyY2hhbmdlRmlsdGVyQ29uZGl0aW9uX19PcGVyYXRvcjJBc3NpZ25tZW50XzNfMCIKKworCisgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19EYXRhSW50ZXJjaGFuZ2VGaWx0ZXJDb25kaXRpb25fX1N1YmNvbmRpdGlvbkFzc2lnbm1lbnRfM18xIgorICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI0NzQ2OjE6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbHRlckNvbmRpdGlvbl9fU3ViY29uZGl0aW9uQXNzaWdubWVudF8zXzEgOiAoIHJ1bGVEYXRhSW50ZXJjaGFuZ2VGaWx0ZXJDb25kaXRpb24gKSA7CisgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fRGF0YUludGVyY2hhbmdlRmlsdGVyQ29uZGl0aW9uX19TdWJjb25kaXRpb25Bc3NpZ25tZW50XzNfMSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisKKyAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgICAgICAJCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNDc1MDoxOiAoICggcnVsZURhdGFJbnRlcmNoYW5nZUZpbHRlckNvbmRpdGlvbiApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI0NzUxOjI6ICggcnVsZURhdGFJbnRlcmNoYW5nZUZpbHRlckNvbmRpdGlvbiApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNDc1MToyOiAoIHJ1bGVEYXRhSW50ZXJjaGFuZ2VGaWx0ZXJDb25kaXRpb24gKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjQ3NTI6MzogcnVsZURhdGFJbnRlcmNoYW5nZUZpbHRlckNvbmRpdGlvbgorICAgICAgICAgICAgeworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXREYXRhSW50ZXJjaGFuZ2VGaWx0ZXJDb25kaXRpb25BY2Nlc3MoKS5nZXRTdWJjb25kaXRpb25EYXRhSW50ZXJjaGFuZ2VGaWx0ZXJDb25kaXRpb25QYXJzZXJSdWxlQ2FsbF8zXzFfMCgpKTsgCisgICAgICAgICAgICB9CisgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV18yKTsKKyAgICAgICAgICAgIHJ1bGVEYXRhSW50ZXJjaGFuZ2VGaWx0ZXJDb25kaXRpb24oKTsKKworICAgICAgICAgICAgc3RhdGUuX2ZzcC0tOworICAgICAgICAgICAgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXREYXRhSW50ZXJjaGFuZ2VGaWx0ZXJDb25kaXRpb25BY2Nlc3MoKS5nZXRTdWJjb25kaXRpb25EYXRhSW50ZXJjaGFuZ2VGaWx0ZXJDb25kaXRpb25QYXJzZXJSdWxlQ2FsbF8zXzFfMCgpKTsgCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICB9CisKKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoUmVjb2duaXRpb25FeGNlcHRpb24gcmUpIHsKKyAgICAgICAgICAgIHJlcG9ydEVycm9yKHJlKTsKKyAgICAgICAgICAgIHJlY292ZXIoaW5wdXQscmUpOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworCisgICAgICAgICAgICAJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworCisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIDsKKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAicnVsZV9fRGF0YUludGVyY2hhbmdlRmlsdGVyQ29uZGl0aW9uX19TdWJjb25kaXRpb25Bc3NpZ25tZW50XzNfMSIKKworCisgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19EYXRhSW50ZXJjaGFuZ2VFeHBvcnRIaWRlX19Qcm9wZXJ0eUFzc2lnbm1lbnRfMSIKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNDc2MToxOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VFeHBvcnRIaWRlX19Qcm9wZXJ0eUFzc2lnbm1lbnRfMSA6ICggKCBSVUxFX0lEICkgKSA7CisgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fRGF0YUludGVyY2hhbmdlRXhwb3J0SGlkZV9fUHJvcGVydHlBc3NpZ25tZW50XzEoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworCisgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICAgICAgCQorICAgICAgICB0cnkgeworICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjQ3NjU6MTogKCAoICggUlVMRV9JRCApICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjQ3NjY6MjogKCAoIFJVTEVfSUQgKSApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNDc2NjoyOiAoICggUlVMRV9JRCApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI0NzY3OjM6ICggUlVMRV9JRCApCisgICAgICAgICAgICB7CisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldERhdGFJbnRlcmNoYW5nZUV4cG9ydEhpZGVBY2Nlc3MoKS5nZXRQcm9wZXJ0eUxFbnRpdHlGZWF0dXJlQ3Jvc3NSZWZlcmVuY2VfMV8wKCkpOyAKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI0NzY4OjM6ICggUlVMRV9JRCApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNDc2OTo0OiBSVUxFX0lECisgICAgICAgICAgICB7CisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldERhdGFJbnRlcmNoYW5nZUV4cG9ydEhpZGVBY2Nlc3MoKS5nZXRQcm9wZXJ0eUxFbnRpdHlGZWF0dXJlSURUZXJtaW5hbFJ1bGVDYWxsXzFfMF8xKCkpOyAKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1hdGNoKGlucHV0LFJVTEVfSUQsRk9MTE9XXzIpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBhZnRlcihncmFtbWFyQWNjZXNzLmdldERhdGFJbnRlcmNoYW5nZUV4cG9ydEhpZGVBY2Nlc3MoKS5nZXRQcm9wZXJ0eUxFbnRpdHlGZWF0dXJlSURUZXJtaW5hbFJ1bGVDYWxsXzFfMF8xKCkpOyAKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YUludGVyY2hhbmdlRXhwb3J0SGlkZUFjY2VzcygpLmdldFByb3BlcnR5TEVudGl0eUZlYXR1cmVDcm9zc1JlZmVyZW5jZV8xXzAoKSk7IAorICAgICAgICAgICAgfQorCisgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgfQorCisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKFJlY29nbml0aW9uRXhjZXB0aW9uIHJlKSB7CisgICAgICAgICAgICByZXBvcnRFcnJvcihyZSk7CisgICAgICAgICAgICByZWNvdmVyKGlucHV0LHJlKTsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKworICAgICAgICAgICAgCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKKworICAgICAgICB9CisgICAgICAgIHJldHVybiA7CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgInJ1bGVfX0RhdGFJbnRlcmNoYW5nZUV4cG9ydEhpZGVfX1Byb3BlcnR5QXNzaWdubWVudF8xIgorCisKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX0RhdGFJbnRlcmNoYW5nZVByZWRlZmluZWRFeHByZXNzaW9uX19UYXJnZXRQcm9wZXJ0eUFzc2lnbm1lbnRfMiIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMzE3NDoxOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VQcmVkZWZpbmVkRXhwcmVzc2lvbl9fVGFyZ2V0UHJvcGVydHlBc3NpZ25tZW50XzIgOiAoICggUlVMRV9JRCApICkgOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI0NzgwOjE6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZVByZWRlZmluZWRFeHByZXNzaW9uX19UYXJnZXRQcm9wZXJ0eUFzc2lnbm1lbnRfMiA6ICggKCBSVUxFX0lEICkgKSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fRGF0YUludGVyY2hhbmdlUHJlZGVmaW5lZEV4cHJlc3Npb25fX1RhcmdldFByb3BlcnR5QXNzaWdubWVudF8yKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIzMTc4OjE6ICggKCAoIFJVTEVfSUQgKSApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIzMTc5OjI6ICggKCBSVUxFX0lEICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjQ3ODQ6MTogKCAoICggUlVMRV9JRCApICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjQ3ODU6MjogKCAoIFJVTEVfSUQgKSApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMzE3OToyOiAoICggUlVMRV9JRCApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIzMTgwOjM6ICggUlVMRV9JRCApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNDc4NToyOiAoICggUlVMRV9JRCApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI0Nzg2OjM6ICggUlVMRV9JRCApCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldERhdGFJbnRlcmNoYW5nZVByZWRlZmluZWRFeHByZXNzaW9uQWNjZXNzKCkuZ2V0VGFyZ2V0UHJvcGVydHlMRW50aXR5QXR0cmlidXRlQ3Jvc3NSZWZlcmVuY2VfMl8wKCkpOyAKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIzMTgxOjM6ICggUlVMRV9JRCApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMzE4Mjo0OiBSVUxFX0lECisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNDc4NzozOiAoIFJVTEVfSUQgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjQ3ODg6NDogUlVMRV9JRAogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXREYXRhSW50ZXJjaGFuZ2VQcmVkZWZpbmVkRXhwcmVzc2lvbkFjY2VzcygpLmdldFRhcmdldFByb3BlcnR5TEVudGl0eUF0dHJpYnV0ZUlEVGVybWluYWxSdWxlQ2FsbF8yXzBfMSgpKTsgCkBAIC03NTg0NywxNyArODEwNzYsMTcgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19EYXRhSW50ZXJjaGFuZ2VQcmVkZWZpbmVkRXhwcmVzc2lvbl9fQmVhbkFzc2lnbm1lbnRfNCIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMzE5MzoxOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VQcmVkZWZpbmVkRXhwcmVzc2lvbl9fQmVhbkFzc2lnbm1lbnRfNCA6ICggcnVsZVByZWRlZmluZWRCZWFuRW51bSApIDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNDc5OToxOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VQcmVkZWZpbmVkRXhwcmVzc2lvbl9fQmVhbkFzc2lnbm1lbnRfNCA6ICggcnVsZVByZWRlZmluZWRCZWFuRW51bSApIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19EYXRhSW50ZXJjaGFuZ2VQcmVkZWZpbmVkRXhwcmVzc2lvbl9fQmVhbkFzc2lnbm1lbnRfNCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMzE5NzoxOiAoICggcnVsZVByZWRlZmluZWRCZWFuRW51bSApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIzMTk4OjI6ICggcnVsZVByZWRlZmluZWRCZWFuRW51bSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNDgwMzoxOiAoICggcnVsZVByZWRlZmluZWRCZWFuRW51bSApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI0ODA0OjI6ICggcnVsZVByZWRlZmluZWRCZWFuRW51bSApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMzE5ODoyOiAoIHJ1bGVQcmVkZWZpbmVkQmVhbkVudW0gKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjMxOTk6MzogcnVsZVByZWRlZmluZWRCZWFuRW51bQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjQ4MDQ6MjogKCBydWxlUHJlZGVmaW5lZEJlYW5FbnVtICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI0ODA1OjM6IHJ1bGVQcmVkZWZpbmVkQmVhbkVudW0KICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YUludGVyY2hhbmdlUHJlZGVmaW5lZEV4cHJlc3Npb25BY2Nlc3MoKS5nZXRCZWFuUHJlZGVmaW5lZEJlYW5FbnVtRW51bVJ1bGVDYWxsXzRfMCgpKTsgCkBAIC03NTg5MiwxNyArODExMjEsMTcgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19EYXRhSW50ZXJjaGFuZ2VQcmVkZWZpbmVkRXhwcmVzc2lvbl9fQmVhblR5cGVBc3NpZ25tZW50XzYiCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjMyMDg6MTogcnVsZV9fRGF0YUludGVyY2hhbmdlUHJlZGVmaW5lZEV4cHJlc3Npb25fX0JlYW5UeXBlQXNzaWdubWVudF82IDogKCBydWxlUHJlZGVmaW5lZEJlYW5UeXBlRW51bSApIDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNDgxNDoxOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VQcmVkZWZpbmVkRXhwcmVzc2lvbl9fQmVhblR5cGVBc3NpZ25tZW50XzYgOiAoIHJ1bGVQcmVkZWZpbmVkQmVhblR5cGVFbnVtICkgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZVByZWRlZmluZWRFeHByZXNzaW9uX19CZWFuVHlwZUFzc2lnbm1lbnRfNigpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMzIxMjoxOiAoICggcnVsZVByZWRlZmluZWRCZWFuVHlwZUVudW0gKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMzIxMzoyOiAoIHJ1bGVQcmVkZWZpbmVkQmVhblR5cGVFbnVtICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI0ODE4OjE6ICggKCBydWxlUHJlZGVmaW5lZEJlYW5UeXBlRW51bSApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI0ODE5OjI6ICggcnVsZVByZWRlZmluZWRCZWFuVHlwZUVudW0gKQogICAgICAgICAgICAgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjMyMTM6MjogKCBydWxlUHJlZGVmaW5lZEJlYW5UeXBlRW51bSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMzIxNDozOiBydWxlUHJlZGVmaW5lZEJlYW5UeXBlRW51bQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjQ4MTk6MjogKCBydWxlUHJlZGVmaW5lZEJlYW5UeXBlRW51bSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNDgyMDozOiBydWxlUHJlZGVmaW5lZEJlYW5UeXBlRW51bQogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXREYXRhSW50ZXJjaGFuZ2VQcmVkZWZpbmVkRXhwcmVzc2lvbkFjY2VzcygpLmdldEJlYW5UeXBlUHJlZGVmaW5lZEJlYW5UeXBlRW51bUVudW1SdWxlQ2FsbF82XzAoKSk7IApAQCAtNzU5MzcsMjMgKzgxMTY2LDIzIEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fRGF0YUludGVyY2hhbmdlVmFsdWVNYXBwaW5nX19Qcm9wZXJ0eUFzc2lnbm1lbnRfMiIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMzIyMzoxOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VWYWx1ZU1hcHBpbmdfX1Byb3BlcnR5QXNzaWdubWVudF8yIDogKCAoIFJVTEVfSUQgKSApIDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNDgyOToxOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VWYWx1ZU1hcHBpbmdfX1Byb3BlcnR5QXNzaWdubWVudF8yIDogKCAoIFJVTEVfSUQgKSApIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19EYXRhSW50ZXJjaGFuZ2VWYWx1ZU1hcHBpbmdfX1Byb3BlcnR5QXNzaWdubWVudF8yKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIzMjI3OjE6ICggKCAoIFJVTEVfSUQgKSApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIzMjI4OjI6ICggKCBSVUxFX0lEICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjQ4MzM6MTogKCAoICggUlVMRV9JRCApICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjQ4MzQ6MjogKCAoIFJVTEVfSUQgKSApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMzIyODoyOiAoICggUlVMRV9JRCApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIzMjI5OjM6ICggUlVMRV9JRCApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNDgzNDoyOiAoICggUlVMRV9JRCApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI0ODM1OjM6ICggUlVMRV9JRCApCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldERhdGFJbnRlcmNoYW5nZVZhbHVlTWFwcGluZ0FjY2VzcygpLmdldFByb3BlcnR5TEVudGl0eUF0dHJpYnV0ZUNyb3NzUmVmZXJlbmNlXzJfMCgpKTsgCiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMzIzMDozOiAoIFJVTEVfSUQgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjMyMzE6NDogUlVMRV9JRAorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjQ4MzY6MzogKCBSVUxFX0lEICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI0ODM3OjQ6IFJVTEVfSUQKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YUludGVyY2hhbmdlVmFsdWVNYXBwaW5nQWNjZXNzKCkuZ2V0UHJvcGVydHlMRW50aXR5QXR0cmlidXRlSURUZXJtaW5hbFJ1bGVDYWxsXzJfMF8xKCkpOyAKQEAgLTc1OTkwLDE3ICs4MTIxOSwxNyBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX0RhdGFJbnRlcmNoYW5nZVZhbHVlTWFwcGluZ19fRGF0YUFzc2lnbm1lbnRfNCIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMzI0MjoxOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VWYWx1ZU1hcHBpbmdfX0RhdGFBc3NpZ25tZW50XzQgOiAoIFJVTEVfU1RSSU5HICkgOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI0ODQ4OjE6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZVZhbHVlTWFwcGluZ19fRGF0YUFzc2lnbm1lbnRfNCA6ICggUlVMRV9TVFJJTkcgKSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fRGF0YUludGVyY2hhbmdlVmFsdWVNYXBwaW5nX19EYXRhQXNzaWdubWVudF80KCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIzMjQ2OjE6ICggKCBSVUxFX1NUUklORyApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIzMjQ3OjI6ICggUlVMRV9TVFJJTkcgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjQ4NTI6MTogKCAoIFJVTEVfU1RSSU5HICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjQ4NTM6MjogKCBSVUxFX1NUUklORyApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMzI0NzoyOiAoIFJVTEVfU1RSSU5HICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIzMjQ4OjM6IFJVTEVfU1RSSU5HCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNDg1MzoyOiAoIFJVTEVfU1RSSU5HICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI0ODU0OjM6IFJVTEVfU1RSSU5HCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldERhdGFJbnRlcmNoYW5nZVZhbHVlTWFwcGluZ0FjY2VzcygpLmdldERhdGFTVFJJTkdUZXJtaW5hbFJ1bGVDYWxsXzRfMCgpKTsgCkBAIC03NjAzMSwyMyArODEyNjAsMjMgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19EYXRhSW50ZXJjaGFuZ2VCbG9iTWFwcGluZ19fUHJvcGVydHlBc3NpZ25tZW50XzIiCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjMyNTc6MTogcnVsZV9fRGF0YUludGVyY2hhbmdlQmxvYk1hcHBpbmdfX1Byb3BlcnR5QXNzaWdubWVudF8yIDogKCAoIFJVTEVfSUQgKSApIDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNDg2MzoxOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VCbG9iTWFwcGluZ19fUHJvcGVydHlBc3NpZ25tZW50XzIgOiAoICggUlVMRV9JRCApICkgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUJsb2JNYXBwaW5nX19Qcm9wZXJ0eUFzc2lnbm1lbnRfMigpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMzI2MToxOiAoICggKCBSVUxFX0lEICkgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMzI2MjoyOiAoICggUlVMRV9JRCApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI0ODY3OjE6ICggKCAoIFJVTEVfSUQgKSApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI0ODY4OjI6ICggKCBSVUxFX0lEICkgKQogICAgICAgICAgICAgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjMyNjI6MjogKCAoIFJVTEVfSUQgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMzI2MzozOiAoIFJVTEVfSUQgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjQ4Njg6MjogKCAoIFJVTEVfSUQgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNDg2OTozOiAoIFJVTEVfSUQgKQogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXREYXRhSW50ZXJjaGFuZ2VCbG9iTWFwcGluZ0FjY2VzcygpLmdldFByb3BlcnR5TEVudGl0eUF0dHJpYnV0ZUNyb3NzUmVmZXJlbmNlXzJfMCgpKTsgCiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMzI2NDozOiAoIFJVTEVfSUQgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjMyNjU6NDogUlVMRV9JRAorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjQ4NzA6MzogKCBSVUxFX0lEICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI0ODcxOjQ6IFJVTEVfSUQKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YUludGVyY2hhbmdlQmxvYk1hcHBpbmdBY2Nlc3MoKS5nZXRQcm9wZXJ0eUxFbnRpdHlBdHRyaWJ1dGVJRFRlcm1pbmFsUnVsZUNhbGxfMl8wXzEoKSk7IApAQCAtNzYwODQsMTcgKzgxMzEzLDE3IEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fRGF0YUludGVyY2hhbmdlQmxvYk1hcHBpbmdfX0RhdGFBc3NpZ25tZW50XzQiCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjMyNzY6MTogcnVsZV9fRGF0YUludGVyY2hhbmdlQmxvYk1hcHBpbmdfX0RhdGFBc3NpZ25tZW50XzQgOiAoIFJVTEVfU1RSSU5HICkgOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI0ODgyOjE6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUJsb2JNYXBwaW5nX19EYXRhQXNzaWdubWVudF80IDogKCBSVUxFX1NUUklORyApIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19EYXRhSW50ZXJjaGFuZ2VCbG9iTWFwcGluZ19fRGF0YUFzc2lnbm1lbnRfNCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMzI4MDoxOiAoICggUlVMRV9TVFJJTkcgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMzI4MToyOiAoIFJVTEVfU1RSSU5HICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI0ODg2OjE6ICggKCBSVUxFX1NUUklORyApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI0ODg3OjI6ICggUlVMRV9TVFJJTkcgKQogICAgICAgICAgICAgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjMyODE6MjogKCBSVUxFX1NUUklORyApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMzI4MjozOiBSVUxFX1NUUklORworICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjQ4ODc6MjogKCBSVUxFX1NUUklORyApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNDg4ODozOiBSVUxFX1NUUklORwogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXREYXRhSW50ZXJjaGFuZ2VCbG9iTWFwcGluZ0FjY2VzcygpLmdldERhdGFTVFJJTkdUZXJtaW5hbFJ1bGVDYWxsXzRfMCgpKTsgCkBAIC03NjEyNSwxNyArODEzNTQsMTcgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19EYXRhSW50ZXJjaGFuZ2VCbG9iTWFwcGluZ19fQmxvYkZpbGVFeHRlbnNpb25Bc3NpZ25tZW50XzVfMSIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMzI5MToxOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VCbG9iTWFwcGluZ19fQmxvYkZpbGVFeHRlbnNpb25Bc3NpZ25tZW50XzVfMSA6ICggUlVMRV9TVFJJTkcgKSA7CisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjQ4OTc6MTogcnVsZV9fRGF0YUludGVyY2hhbmdlQmxvYk1hcHBpbmdfX0Jsb2JGaWxlRXh0ZW5zaW9uQXNzaWdubWVudF81XzEgOiAoIFJVTEVfU1RSSU5HICkgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUJsb2JNYXBwaW5nX19CbG9iRmlsZUV4dGVuc2lvbkFzc2lnbm1lbnRfNV8xKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIzMjk1OjE6ICggKCBSVUxFX1NUUklORyApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIzMjk2OjI6ICggUlVMRV9TVFJJTkcgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjQ5MDE6MTogKCAoIFJVTEVfU1RSSU5HICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjQ5MDI6MjogKCBSVUxFX1NUUklORyApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMzI5NjoyOiAoIFJVTEVfU1RSSU5HICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIzMjk3OjM6IFJVTEVfU1RSSU5HCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNDkwMjoyOiAoIFJVTEVfU1RSSU5HICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI0OTAzOjM6IFJVTEVfU1RSSU5HCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldERhdGFJbnRlcmNoYW5nZUJsb2JNYXBwaW5nQWNjZXNzKCkuZ2V0QmxvYkZpbGVFeHRlbnNpb25TVFJJTkdUZXJtaW5hbFJ1bGVDYWxsXzVfMV8wKCkpOyAKQEAgLTc2MTY2LDE3ICs4MTM5NSwxNyBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX0RhdGFJbnRlcmNoYW5nZUJsb2JNYXBwaW5nX19CbG9iUGF0aEFzc2lnbm1lbnRfNl8xIgotICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIzMzA2OjE6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUJsb2JNYXBwaW5nX19CbG9iUGF0aEFzc2lnbm1lbnRfNl8xIDogKCBSVUxFX1NUUklORyApIDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNDkxMjoxOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VCbG9iTWFwcGluZ19fQmxvYlBhdGhBc3NpZ25tZW50XzZfMSA6ICggUlVMRV9TVFJJTkcgKSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fRGF0YUludGVyY2hhbmdlQmxvYk1hcHBpbmdfX0Jsb2JQYXRoQXNzaWdubWVudF82XzEoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjMzMTA6MTogKCAoIFJVTEVfU1RSSU5HICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjMzMTE6MjogKCBSVUxFX1NUUklORyApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNDkxNjoxOiAoICggUlVMRV9TVFJJTkcgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNDkxNzoyOiAoIFJVTEVfU1RSSU5HICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIzMzExOjI6ICggUlVMRV9TVFJJTkcgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjMzMTI6MzogUlVMRV9TVFJJTkcKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI0OTE3OjI6ICggUlVMRV9TVFJJTkcgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjQ5MTg6MzogUlVMRV9TVFJJTkcKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YUludGVyY2hhbmdlQmxvYk1hcHBpbmdBY2Nlc3MoKS5nZXRCbG9iUGF0aFNUUklOR1Rlcm1pbmFsUnVsZUNhbGxfNl8xXzAoKSk7IApAQCAtNzYyMDcsMTcgKzgxNDM2LDE3IEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fRGF0YUludGVyY2hhbmdlQmxvYk1hcHBpbmdfX01pbWVUeXBlQXNzaWdubWVudF84IgotICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIzMzIxOjE6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUJsb2JNYXBwaW5nX19NaW1lVHlwZUFzc2lnbm1lbnRfOCA6ICggcnVsZVByZWRlZmluZWRCbG9iTWltZVR5cGVFbnVtICkgOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI0OTI3OjE6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUJsb2JNYXBwaW5nX19NaW1lVHlwZUFzc2lnbm1lbnRfOCA6ICggcnVsZVByZWRlZmluZWRCbG9iTWltZVR5cGVFbnVtICkgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUJsb2JNYXBwaW5nX19NaW1lVHlwZUFzc2lnbm1lbnRfOCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMzMyNToxOiAoICggcnVsZVByZWRlZmluZWRCbG9iTWltZVR5cGVFbnVtICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjMzMjY6MjogKCBydWxlUHJlZGVmaW5lZEJsb2JNaW1lVHlwZUVudW0gKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjQ5MzE6MTogKCAoIHJ1bGVQcmVkZWZpbmVkQmxvYk1pbWVUeXBlRW51bSApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI0OTMyOjI6ICggcnVsZVByZWRlZmluZWRCbG9iTWltZVR5cGVFbnVtICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIzMzI2OjI6ICggcnVsZVByZWRlZmluZWRCbG9iTWltZVR5cGVFbnVtICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIzMzI3OjM6IHJ1bGVQcmVkZWZpbmVkQmxvYk1pbWVUeXBlRW51bQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjQ5MzI6MjogKCBydWxlUHJlZGVmaW5lZEJsb2JNaW1lVHlwZUVudW0gKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjQ5MzM6MzogcnVsZVByZWRlZmluZWRCbG9iTWltZVR5cGVFbnVtCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldERhdGFJbnRlcmNoYW5nZUJsb2JNYXBwaW5nQWNjZXNzKCkuZ2V0TWltZVR5cGVQcmVkZWZpbmVkQmxvYk1pbWVUeXBlRW51bUVudW1SdWxlQ2FsbF84XzAoKSk7IApAQCAtNzYyNTIsMjMgKzgxNDgxLDIzIEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fWEltcG9ydERlY2xhcmF0aW9uX19TdGF0aWNBc3NpZ25tZW50XzJfMF8wIgotICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIzMzM2OjE6IHJ1bGVfX1hJbXBvcnREZWNsYXJhdGlvbl9fU3RhdGljQXNzaWdubWVudF8yXzBfMCA6ICggKCAnc3RhdGljJyApICkgOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI0OTQyOjE6IHJ1bGVfX1hJbXBvcnREZWNsYXJhdGlvbl9fU3RhdGljQXNzaWdubWVudF8yXzBfMCA6ICggKCAnc3RhdGljJyApICkgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1hJbXBvcnREZWNsYXJhdGlvbl9fU3RhdGljQXNzaWdubWVudF8yXzBfMCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMzM0MDoxOiAoICggKCAnc3RhdGljJyApICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjMzNDE6MjogKCAoICdzdGF0aWMnICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjQ5NDY6MTogKCAoICggJ3N0YXRpYycgKSApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI0OTQ3OjI6ICggKCAnc3RhdGljJyApICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIzMzQxOjI6ICggKCAnc3RhdGljJyApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIzMzQyOjM6ICggJ3N0YXRpYycgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjQ5NDc6MjogKCAoICdzdGF0aWMnICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjQ5NDg6MzogKCAnc3RhdGljJyApCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhJbXBvcnREZWNsYXJhdGlvbkFjY2VzcygpLmdldFN0YXRpY1N0YXRpY0tleXdvcmRfMl8wXzBfMCgpKTsgCiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMzM0MzozOiAoICdzdGF0aWMnICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIzMzQ0OjQ6ICdzdGF0aWMnCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNDk0OTozOiAoICdzdGF0aWMnICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI0OTUwOjQ6ICdzdGF0aWMnCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhJbXBvcnREZWNsYXJhdGlvbkFjY2VzcygpLmdldFN0YXRpY1N0YXRpY0tleXdvcmRfMl8wXzBfMCgpKTsgCkBAIC03NjMwNSwyMyArODE1MzQsMjMgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YSW1wb3J0RGVjbGFyYXRpb25fX0V4dGVuc2lvbkFzc2lnbm1lbnRfMl8wXzEiCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjMzNTU6MTogcnVsZV9fWEltcG9ydERlY2xhcmF0aW9uX19FeHRlbnNpb25Bc3NpZ25tZW50XzJfMF8xIDogKCAoICdleHRlbnNpb24nICkgKSA7CisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjQ5NjE6MTogcnVsZV9fWEltcG9ydERlY2xhcmF0aW9uX19FeHRlbnNpb25Bc3NpZ25tZW50XzJfMF8xIDogKCAoICdleHRlbnNpb24nICkgKSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fWEltcG9ydERlY2xhcmF0aW9uX19FeHRlbnNpb25Bc3NpZ25tZW50XzJfMF8xKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIzMzU5OjE6ICggKCAoICdleHRlbnNpb24nICkgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMzM2MDoyOiAoICggJ2V4dGVuc2lvbicgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNDk2NToxOiAoICggKCAnZXh0ZW5zaW9uJyApICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjQ5NjY6MjogKCAoICdleHRlbnNpb24nICkgKQogICAgICAgICAgICAgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjMzNjA6MjogKCAoICdleHRlbnNpb24nICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjMzNjE6MzogKCAnZXh0ZW5zaW9uJyApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNDk2NjoyOiAoICggJ2V4dGVuc2lvbicgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNDk2NzozOiAoICdleHRlbnNpb24nICkKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WEltcG9ydERlY2xhcmF0aW9uQWNjZXNzKCkuZ2V0RXh0ZW5zaW9uRXh0ZW5zaW9uS2V5d29yZF8yXzBfMV8wKCkpOyAKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIzMzYyOjM6ICggJ2V4dGVuc2lvbicgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjMzNjM6NDogJ2V4dGVuc2lvbicKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI0OTY4OjM6ICggJ2V4dGVuc2lvbicgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjQ5Njk6NDogJ2V4dGVuc2lvbicKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WEltcG9ydERlY2xhcmF0aW9uQWNjZXNzKCkuZ2V0RXh0ZW5zaW9uRXh0ZW5zaW9uS2V5d29yZF8yXzBfMV8wKCkpOyAKQEAgLTc2MzU4LDIzICs4MTU4NywyMyBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX1hJbXBvcnREZWNsYXJhdGlvbl9fSW1wb3J0ZWRUeXBlQXNzaWdubWVudF8yXzBfMiIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMzM3NDoxOiBydWxlX19YSW1wb3J0RGVjbGFyYXRpb25fX0ltcG9ydGVkVHlwZUFzc2lnbm1lbnRfMl8wXzIgOiAoICggcnVsZVF1YWxpZmllZE5hbWVJblN0YXRpY0ltcG9ydCApICkgOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI0OTgwOjE6IHJ1bGVfX1hJbXBvcnREZWNsYXJhdGlvbl9fSW1wb3J0ZWRUeXBlQXNzaWdubWVudF8yXzBfMiA6ICggKCBydWxlUXVhbGlmaWVkTmFtZUluU3RhdGljSW1wb3J0ICkgKSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fWEltcG9ydERlY2xhcmF0aW9uX19JbXBvcnRlZFR5cGVBc3NpZ25tZW50XzJfMF8yKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIzMzc4OjE6ICggKCAoIHJ1bGVRdWFsaWZpZWROYW1lSW5TdGF0aWNJbXBvcnQgKSApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIzMzc5OjI6ICggKCBydWxlUXVhbGlmaWVkTmFtZUluU3RhdGljSW1wb3J0ICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjQ5ODQ6MTogKCAoICggcnVsZVF1YWxpZmllZE5hbWVJblN0YXRpY0ltcG9ydCApICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjQ5ODU6MjogKCAoIHJ1bGVRdWFsaWZpZWROYW1lSW5TdGF0aWNJbXBvcnQgKSApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMzM3OToyOiAoICggcnVsZVF1YWxpZmllZE5hbWVJblN0YXRpY0ltcG9ydCApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIzMzgwOjM6ICggcnVsZVF1YWxpZmllZE5hbWVJblN0YXRpY0ltcG9ydCApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNDk4NToyOiAoICggcnVsZVF1YWxpZmllZE5hbWVJblN0YXRpY0ltcG9ydCApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI0OTg2OjM6ICggcnVsZVF1YWxpZmllZE5hbWVJblN0YXRpY0ltcG9ydCApCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhJbXBvcnREZWNsYXJhdGlvbkFjY2VzcygpLmdldEltcG9ydGVkVHlwZUp2bURlY2xhcmVkVHlwZUNyb3NzUmVmZXJlbmNlXzJfMF8yXzAoKSk7IAogICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjMzODE6MzogKCBydWxlUXVhbGlmaWVkTmFtZUluU3RhdGljSW1wb3J0ICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIzMzgyOjQ6IHJ1bGVRdWFsaWZpZWROYW1lSW5TdGF0aWNJbXBvcnQKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI0OTg3OjM6ICggcnVsZVF1YWxpZmllZE5hbWVJblN0YXRpY0ltcG9ydCApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNDk4ODo0OiBydWxlUXVhbGlmaWVkTmFtZUluU3RhdGljSW1wb3J0CiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhJbXBvcnREZWNsYXJhdGlvbkFjY2VzcygpLmdldEltcG9ydGVkVHlwZUp2bURlY2xhcmVkVHlwZVF1YWxpZmllZE5hbWVJblN0YXRpY0ltcG9ydFBhcnNlclJ1bGVDYWxsXzJfMF8yXzBfMSgpKTsgCkBAIC03NjQxNSwyMyArODE2NDQsMjMgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YSW1wb3J0RGVjbGFyYXRpb25fX1dpbGRjYXJkQXNzaWdubWVudF8yXzBfM18wIgotICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIzMzkzOjE6IHJ1bGVfX1hJbXBvcnREZWNsYXJhdGlvbl9fV2lsZGNhcmRBc3NpZ25tZW50XzJfMF8zXzAgOiAoICggJyonICkgKSA7CisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjQ5OTk6MTogcnVsZV9fWEltcG9ydERlY2xhcmF0aW9uX19XaWxkY2FyZEFzc2lnbm1lbnRfMl8wXzNfMCA6ICggKCAnKicgKSApIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YSW1wb3J0RGVjbGFyYXRpb25fX1dpbGRjYXJkQXNzaWdubWVudF8yXzBfM18wKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIzMzk3OjE6ICggKCAoICcqJyApICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjMzOTg6MjogKCAoICcqJyApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI1MDAzOjE6ICggKCAoICcqJyApICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjUwMDQ6MjogKCAoICcqJyApICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIzMzk4OjI6ICggKCAnKicgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMzM5OTozOiAoICcqJyApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNTAwNDoyOiAoICggJyonICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjUwMDU6MzogKCAnKicgKQogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYSW1wb3J0RGVjbGFyYXRpb25BY2Nlc3MoKS5nZXRXaWxkY2FyZEFzdGVyaXNrS2V5d29yZF8yXzBfM18wXzAoKSk7IAogICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjM0MDA6MzogKCAnKicgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjM0MDE6NDogJyonCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNTAwNjozOiAoICcqJyApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNTAwNzo0OiAnKicKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WEltcG9ydERlY2xhcmF0aW9uQWNjZXNzKCkuZ2V0V2lsZGNhcmRBc3Rlcmlza0tleXdvcmRfMl8wXzNfMF8wKCkpOyAKQEAgLTc2NDY4LDE3ICs4MTY5NywxNyBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX1hJbXBvcnREZWNsYXJhdGlvbl9fTWVtYmVyTmFtZUFzc2lnbm1lbnRfMl8wXzNfMSIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMzQxMjoxOiBydWxlX19YSW1wb3J0RGVjbGFyYXRpb25fX01lbWJlck5hbWVBc3NpZ25tZW50XzJfMF8zXzEgOiAoIHJ1bGVWYWxpZElEICkgOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI1MDE4OjE6IHJ1bGVfX1hJbXBvcnREZWNsYXJhdGlvbl9fTWVtYmVyTmFtZUFzc2lnbm1lbnRfMl8wXzNfMSA6ICggcnVsZVZhbGlkSUQgKSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fWEltcG9ydERlY2xhcmF0aW9uX19NZW1iZXJOYW1lQXNzaWdubWVudF8yXzBfM18xKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIzNDE2OjE6ICggKCBydWxlVmFsaWRJRCApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIzNDE3OjI6ICggcnVsZVZhbGlkSUQgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjUwMjI6MTogKCAoIHJ1bGVWYWxpZElEICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjUwMjM6MjogKCBydWxlVmFsaWRJRCApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMzQxNzoyOiAoIHJ1bGVWYWxpZElEICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIzNDE4OjM6IHJ1bGVWYWxpZElECisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNTAyMzoyOiAoIHJ1bGVWYWxpZElEICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI1MDI0OjM6IHJ1bGVWYWxpZElECiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhJbXBvcnREZWNsYXJhdGlvbkFjY2VzcygpLmdldE1lbWJlck5hbWVWYWxpZElEUGFyc2VyUnVsZUNhbGxfMl8wXzNfMV8wKCkpOyAKQEAgLTc2NTEzLDIzICs4MTc0MiwyMyBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX1hJbXBvcnREZWNsYXJhdGlvbl9fSW1wb3J0ZWRUeXBlQXNzaWdubWVudF8yXzEiCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjM0Mjc6MTogcnVsZV9fWEltcG9ydERlY2xhcmF0aW9uX19JbXBvcnRlZFR5cGVBc3NpZ25tZW50XzJfMSA6ICggKCBydWxlUXVhbGlmaWVkTmFtZSApICkgOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI1MDMzOjE6IHJ1bGVfX1hJbXBvcnREZWNsYXJhdGlvbl9fSW1wb3J0ZWRUeXBlQXNzaWdubWVudF8yXzEgOiAoICggcnVsZVF1YWxpZmllZE5hbWUgKSApIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YSW1wb3J0RGVjbGFyYXRpb25fX0ltcG9ydGVkVHlwZUFzc2lnbm1lbnRfMl8xKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIzNDMxOjE6ICggKCAoIHJ1bGVRdWFsaWZpZWROYW1lICkgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMzQzMjoyOiAoICggcnVsZVF1YWxpZmllZE5hbWUgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNTAzNzoxOiAoICggKCBydWxlUXVhbGlmaWVkTmFtZSApICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjUwMzg6MjogKCAoIHJ1bGVRdWFsaWZpZWROYW1lICkgKQogICAgICAgICAgICAgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjM0MzI6MjogKCAoIHJ1bGVRdWFsaWZpZWROYW1lICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjM0MzM6MzogKCBydWxlUXVhbGlmaWVkTmFtZSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNTAzODoyOiAoICggcnVsZVF1YWxpZmllZE5hbWUgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNTAzOTozOiAoIHJ1bGVRdWFsaWZpZWROYW1lICkKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WEltcG9ydERlY2xhcmF0aW9uQWNjZXNzKCkuZ2V0SW1wb3J0ZWRUeXBlSnZtRGVjbGFyZWRUeXBlQ3Jvc3NSZWZlcmVuY2VfMl8xXzAoKSk7IAogICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjM0MzQ6MzogKCBydWxlUXVhbGlmaWVkTmFtZSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMzQzNTo0OiBydWxlUXVhbGlmaWVkTmFtZQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjUwNDA6MzogKCBydWxlUXVhbGlmaWVkTmFtZSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNTA0MTo0OiBydWxlUXVhbGlmaWVkTmFtZQogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYSW1wb3J0RGVjbGFyYXRpb25BY2Nlc3MoKS5nZXRJbXBvcnRlZFR5cGVKdm1EZWNsYXJlZFR5cGVRdWFsaWZpZWROYW1lUGFyc2VyUnVsZUNhbGxfMl8xXzBfMSgpKTsgCkBAIC03NjU3MCwxNyArODE3OTksMTcgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YSW1wb3J0RGVjbGFyYXRpb25fX0ltcG9ydGVkTmFtZXNwYWNlQXNzaWdubWVudF8yXzIiCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjM0NDY6MTogcnVsZV9fWEltcG9ydERlY2xhcmF0aW9uX19JbXBvcnRlZE5hbWVzcGFjZUFzc2lnbm1lbnRfMl8yIDogKCBydWxlUXVhbGlmaWVkTmFtZVdpdGhXaWxkY2FyZCApIDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNTA1MjoxOiBydWxlX19YSW1wb3J0RGVjbGFyYXRpb25fX0ltcG9ydGVkTmFtZXNwYWNlQXNzaWdubWVudF8yXzIgOiAoIHJ1bGVRdWFsaWZpZWROYW1lV2l0aFdpbGRjYXJkICkgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1hJbXBvcnREZWNsYXJhdGlvbl9fSW1wb3J0ZWROYW1lc3BhY2VBc3NpZ25tZW50XzJfMigpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMzQ1MDoxOiAoICggcnVsZVF1YWxpZmllZE5hbWVXaXRoV2lsZGNhcmQgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMzQ1MToyOiAoIHJ1bGVRdWFsaWZpZWROYW1lV2l0aFdpbGRjYXJkICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI1MDU2OjE6ICggKCBydWxlUXVhbGlmaWVkTmFtZVdpdGhXaWxkY2FyZCApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI1MDU3OjI6ICggcnVsZVF1YWxpZmllZE5hbWVXaXRoV2lsZGNhcmQgKQogICAgICAgICAgICAgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjM0NTE6MjogKCBydWxlUXVhbGlmaWVkTmFtZVdpdGhXaWxkY2FyZCApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMzQ1MjozOiBydWxlUXVhbGlmaWVkTmFtZVdpdGhXaWxkY2FyZAorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjUwNTc6MjogKCBydWxlUXVhbGlmaWVkTmFtZVdpdGhXaWxkY2FyZCApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNTA1ODozOiBydWxlUXVhbGlmaWVkTmFtZVdpdGhXaWxkY2FyZAogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYSW1wb3J0RGVjbGFyYXRpb25BY2Nlc3MoKS5nZXRJbXBvcnRlZE5hbWVzcGFjZVF1YWxpZmllZE5hbWVXaXRoV2lsZGNhcmRQYXJzZXJSdWxlQ2FsbF8yXzJfMCgpKTsgCkBAIC03NjYxNSwyOCArODE4NDQsMjggQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YSW1wb3J0RGVjbGFyYXRpb25fX0ZxbkltcG9ydEFzc2lnbm1lbnRfMl8zXzAiCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjM0NjE6MTogcnVsZV9fWEltcG9ydERlY2xhcmF0aW9uX19GcW5JbXBvcnRBc3NpZ25tZW50XzJfM18wIDogKCAoICducycgKSApIDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNTA2NzoxOiBydWxlX19YSW1wb3J0RGVjbGFyYXRpb25fX0ZxbkltcG9ydEFzc2lnbm1lbnRfMl8zXzAgOiAoICggJ25zJyApICkgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1hJbXBvcnREZWNsYXJhdGlvbl9fRnFuSW1wb3J0QXNzaWdubWVudF8yXzNfMCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMzQ2NToxOiAoICggKCAnbnMnICkgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMzQ2NjoyOiAoICggJ25zJyApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI1MDcxOjE6ICggKCAoICducycgKSApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI1MDcyOjI6ICggKCAnbnMnICkgKQogICAgICAgICAgICAgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjM0NjY6MjogKCAoICducycgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMzQ2NzozOiAoICducycgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjUwNzI6MjogKCAoICducycgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNTA3MzozOiAoICducycgKQogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYSW1wb3J0RGVjbGFyYXRpb25BY2Nlc3MoKS5nZXRGcW5JbXBvcnROc0tleXdvcmRfMl8zXzBfMCgpKTsgCiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMzQ2ODozOiAoICducycgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjM0Njk6NDogJ25zJworICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjUwNzQ6MzogKCAnbnMnICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI1MDc1OjQ6ICducycKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WEltcG9ydERlY2xhcmF0aW9uQWNjZXNzKCkuZ2V0RnFuSW1wb3J0TnNLZXl3b3JkXzJfM18wXzAoKSk7IAogICAgICAgICAgICAgfQotICAgICAgICAgICAgbWF0Y2goaW5wdXQsMTQ5LEZPTExPV18yKTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKKyAgICAgICAgICAgIG1hdGNoKGlucHV0LDE2MSxGT0xMT1dfMik7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0WEltcG9ydERlY2xhcmF0aW9uQWNjZXNzKCkuZ2V0RnFuSW1wb3J0TnNLZXl3b3JkXzJfM18wXzAoKSk7IAogICAgICAgICAgICAgfQpAQCAtNzY2NjgsMTcgKzgxODk3LDE3IEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fWEltcG9ydERlY2xhcmF0aW9uX19JbXBvcnRlZEZ1bGx5UXVhbGlmaWVkTmFtZUFzc2lnbm1lbnRfMl8zXzEiCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjM0ODA6MTogcnVsZV9fWEltcG9ydERlY2xhcmF0aW9uX19JbXBvcnRlZEZ1bGx5UXVhbGlmaWVkTmFtZUFzc2lnbm1lbnRfMl8zXzEgOiAoIHJ1bGVRdWFsaWZpZWROYW1lICkgOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI1MDg2OjE6IHJ1bGVfX1hJbXBvcnREZWNsYXJhdGlvbl9fSW1wb3J0ZWRGdWxseVF1YWxpZmllZE5hbWVBc3NpZ25tZW50XzJfM18xIDogKCBydWxlUXVhbGlmaWVkTmFtZSApIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YSW1wb3J0RGVjbGFyYXRpb25fX0ltcG9ydGVkRnVsbHlRdWFsaWZpZWROYW1lQXNzaWdubWVudF8yXzNfMSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMzQ4NDoxOiAoICggcnVsZVF1YWxpZmllZE5hbWUgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMzQ4NToyOiAoIHJ1bGVRdWFsaWZpZWROYW1lICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI1MDkwOjE6ICggKCBydWxlUXVhbGlmaWVkTmFtZSApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI1MDkxOjI6ICggcnVsZVF1YWxpZmllZE5hbWUgKQogICAgICAgICAgICAgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjM0ODU6MjogKCBydWxlUXVhbGlmaWVkTmFtZSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMzQ4NjozOiBydWxlUXVhbGlmaWVkTmFtZQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjUwOTE6MjogKCBydWxlUXVhbGlmaWVkTmFtZSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNTA5MjozOiBydWxlUXVhbGlmaWVkTmFtZQogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYSW1wb3J0RGVjbGFyYXRpb25BY2Nlc3MoKS5nZXRJbXBvcnRlZEZ1bGx5UXVhbGlmaWVkTmFtZVF1YWxpZmllZE5hbWVQYXJzZXJSdWxlQ2FsbF8yXzNfMV8wKCkpOyAKQEAgLTc2NzEzLDIzICs4MTk0MiwyMyBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX1hBbm5vdGF0aW9uX19Bbm5vdGF0aW9uVHlwZUFzc2lnbm1lbnRfMiIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMzQ5NToxOiBydWxlX19YQW5ub3RhdGlvbl9fQW5ub3RhdGlvblR5cGVBc3NpZ25tZW50XzIgOiAoICggcnVsZVF1YWxpZmllZE5hbWUgKSApIDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNTEwMToxOiBydWxlX19YQW5ub3RhdGlvbl9fQW5ub3RhdGlvblR5cGVBc3NpZ25tZW50XzIgOiAoICggcnVsZVF1YWxpZmllZE5hbWUgKSApIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YQW5ub3RhdGlvbl9fQW5ub3RhdGlvblR5cGVBc3NpZ25tZW50XzIoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjM0OTk6MTogKCAoICggcnVsZVF1YWxpZmllZE5hbWUgKSApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIzNTAwOjI6ICggKCBydWxlUXVhbGlmaWVkTmFtZSApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI1MTA1OjE6ICggKCAoIHJ1bGVRdWFsaWZpZWROYW1lICkgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNTEwNjoyOiAoICggcnVsZVF1YWxpZmllZE5hbWUgKSApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMzUwMDoyOiAoICggcnVsZVF1YWxpZmllZE5hbWUgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMzUwMTozOiAoIHJ1bGVRdWFsaWZpZWROYW1lICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI1MTA2OjI6ICggKCBydWxlUXVhbGlmaWVkTmFtZSApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI1MTA3OjM6ICggcnVsZVF1YWxpZmllZE5hbWUgKQogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYQW5ub3RhdGlvbkFjY2VzcygpLmdldEFubm90YXRpb25UeXBlSnZtQW5ub3RhdGlvblR5cGVDcm9zc1JlZmVyZW5jZV8yXzAoKSk7IAogICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjM1MDI6MzogKCBydWxlUXVhbGlmaWVkTmFtZSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMzUwMzo0OiBydWxlUXVhbGlmaWVkTmFtZQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjUxMDg6MzogKCBydWxlUXVhbGlmaWVkTmFtZSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNTEwOTo0OiBydWxlUXVhbGlmaWVkTmFtZQogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYQW5ub3RhdGlvbkFjY2VzcygpLmdldEFubm90YXRpb25UeXBlSnZtQW5ub3RhdGlvblR5cGVRdWFsaWZpZWROYW1lUGFyc2VyUnVsZUNhbGxfMl8wXzEoKSk7IApAQCAtNzY3NzAsMTcgKzgxOTk5LDE3IEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fWEFubm90YXRpb25fX0VsZW1lbnRWYWx1ZVBhaXJzQXNzaWdubWVudF8zXzFfMF8wIgotICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIzNTE0OjE6IHJ1bGVfX1hBbm5vdGF0aW9uX19FbGVtZW50VmFsdWVQYWlyc0Fzc2lnbm1lbnRfM18xXzBfMCA6ICggcnVsZVhBbm5vdGF0aW9uRWxlbWVudFZhbHVlUGFpciApIDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNTEyMDoxOiBydWxlX19YQW5ub3RhdGlvbl9fRWxlbWVudFZhbHVlUGFpcnNBc3NpZ25tZW50XzNfMV8wXzAgOiAoIHJ1bGVYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZVBhaXIgKSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fWEFubm90YXRpb25fX0VsZW1lbnRWYWx1ZVBhaXJzQXNzaWdubWVudF8zXzFfMF8wKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIzNTE4OjE6ICggKCBydWxlWEFubm90YXRpb25FbGVtZW50VmFsdWVQYWlyICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjM1MTk6MjogKCBydWxlWEFubm90YXRpb25FbGVtZW50VmFsdWVQYWlyICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI1MTI0OjE6ICggKCBydWxlWEFubm90YXRpb25FbGVtZW50VmFsdWVQYWlyICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjUxMjU6MjogKCBydWxlWEFubm90YXRpb25FbGVtZW50VmFsdWVQYWlyICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIzNTE5OjI6ICggcnVsZVhBbm5vdGF0aW9uRWxlbWVudFZhbHVlUGFpciApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMzUyMDozOiBydWxlWEFubm90YXRpb25FbGVtZW50VmFsdWVQYWlyCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNTEyNToyOiAoIHJ1bGVYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZVBhaXIgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjUxMjY6MzogcnVsZVhBbm5vdGF0aW9uRWxlbWVudFZhbHVlUGFpcgogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYQW5ub3RhdGlvbkFjY2VzcygpLmdldEVsZW1lbnRWYWx1ZVBhaXJzWEFubm90YXRpb25FbGVtZW50VmFsdWVQYWlyUGFyc2VyUnVsZUNhbGxfM18xXzBfMF8wKCkpOyAKQEAgLTc2ODE1LDE3ICs4MjA0NCwxNyBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX1hBbm5vdGF0aW9uX19FbGVtZW50VmFsdWVQYWlyc0Fzc2lnbm1lbnRfM18xXzBfMV8xIgotICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIzNTI5OjE6IHJ1bGVfX1hBbm5vdGF0aW9uX19FbGVtZW50VmFsdWVQYWlyc0Fzc2lnbm1lbnRfM18xXzBfMV8xIDogKCBydWxlWEFubm90YXRpb25FbGVtZW50VmFsdWVQYWlyICkgOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI1MTM1OjE6IHJ1bGVfX1hBbm5vdGF0aW9uX19FbGVtZW50VmFsdWVQYWlyc0Fzc2lnbm1lbnRfM18xXzBfMV8xIDogKCBydWxlWEFubm90YXRpb25FbGVtZW50VmFsdWVQYWlyICkgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1hBbm5vdGF0aW9uX19FbGVtZW50VmFsdWVQYWlyc0Fzc2lnbm1lbnRfM18xXzBfMV8xKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIzNTMzOjE6ICggKCBydWxlWEFubm90YXRpb25FbGVtZW50VmFsdWVQYWlyICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjM1MzQ6MjogKCBydWxlWEFubm90YXRpb25FbGVtZW50VmFsdWVQYWlyICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI1MTM5OjE6ICggKCBydWxlWEFubm90YXRpb25FbGVtZW50VmFsdWVQYWlyICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjUxNDA6MjogKCBydWxlWEFubm90YXRpb25FbGVtZW50VmFsdWVQYWlyICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIzNTM0OjI6ICggcnVsZVhBbm5vdGF0aW9uRWxlbWVudFZhbHVlUGFpciApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMzUzNTozOiBydWxlWEFubm90YXRpb25FbGVtZW50VmFsdWVQYWlyCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNTE0MDoyOiAoIHJ1bGVYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZVBhaXIgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjUxNDE6MzogcnVsZVhBbm5vdGF0aW9uRWxlbWVudFZhbHVlUGFpcgogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYQW5ub3RhdGlvbkFjY2VzcygpLmdldEVsZW1lbnRWYWx1ZVBhaXJzWEFubm90YXRpb25FbGVtZW50VmFsdWVQYWlyUGFyc2VyUnVsZUNhbGxfM18xXzBfMV8xXzAoKSk7IApAQCAtNzY4NjAsMTcgKzgyMDg5LDE3IEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fWEFubm90YXRpb25fX1ZhbHVlQXNzaWdubWVudF8zXzFfMSIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMzU0NDoxOiBydWxlX19YQW5ub3RhdGlvbl9fVmFsdWVBc3NpZ25tZW50XzNfMV8xIDogKCBydWxlWEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdCApIDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNTE1MDoxOiBydWxlX19YQW5ub3RhdGlvbl9fVmFsdWVBc3NpZ25tZW50XzNfMV8xIDogKCBydWxlWEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdCApIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YQW5ub3RhdGlvbl9fVmFsdWVBc3NpZ25tZW50XzNfMV8xKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIzNTQ4OjE6ICggKCBydWxlWEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdCApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIzNTQ5OjI6ICggcnVsZVhBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3QgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjUxNTQ6MTogKCAoIHJ1bGVYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0ICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjUxNTU6MjogKCBydWxlWEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdCApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMzU0OToyOiAoIHJ1bGVYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0ICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIzNTUwOjM6IHJ1bGVYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0CisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNTE1NToyOiAoIHJ1bGVYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0ICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI1MTU2OjM6IHJ1bGVYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0CiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhBbm5vdGF0aW9uQWNjZXNzKCkuZ2V0VmFsdWVYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0UGFyc2VyUnVsZUNhbGxfM18xXzFfMCgpKTsgCkBAIC03NjkwNSwyMyArODIxMzQsMjMgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZVBhaXJfX0VsZW1lbnRBc3NpZ25tZW50XzBfMF8wIgotICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIzNTU5OjE6IHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlUGFpcl9fRWxlbWVudEFzc2lnbm1lbnRfMF8wXzAgOiAoICggcnVsZVZhbGlkSUQgKSApIDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNTE2NToxOiBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZVBhaXJfX0VsZW1lbnRBc3NpZ25tZW50XzBfMF8wIDogKCAoIHJ1bGVWYWxpZElEICkgKSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVQYWlyX19FbGVtZW50QXNzaWdubWVudF8wXzBfMCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMzU2MzoxOiAoICggKCBydWxlVmFsaWRJRCApICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjM1NjQ6MjogKCAoIHJ1bGVWYWxpZElEICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjUxNjk6MTogKCAoICggcnVsZVZhbGlkSUQgKSApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI1MTcwOjI6ICggKCBydWxlVmFsaWRJRCApICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIzNTY0OjI6ICggKCBydWxlVmFsaWRJRCApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIzNTY1OjM6ICggcnVsZVZhbGlkSUQgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjUxNzA6MjogKCAoIHJ1bGVWYWxpZElEICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjUxNzE6MzogKCBydWxlVmFsaWRJRCApCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhBbm5vdGF0aW9uRWxlbWVudFZhbHVlUGFpckFjY2VzcygpLmdldEVsZW1lbnRKdm1PcGVyYXRpb25Dcm9zc1JlZmVyZW5jZV8wXzBfMF8wKCkpOyAKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIzNTY2OjM6ICggcnVsZVZhbGlkSUQgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjM1Njc6NDogcnVsZVZhbGlkSUQKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI1MTcyOjM6ICggcnVsZVZhbGlkSUQgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjUxNzM6NDogcnVsZVZhbGlkSUQKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WEFubm90YXRpb25FbGVtZW50VmFsdWVQYWlyQWNjZXNzKCkuZ2V0RWxlbWVudEp2bU9wZXJhdGlvblZhbGlkSURQYXJzZXJSdWxlQ2FsbF8wXzBfMF8wXzEoKSk7IApAQCAtNzY5NjIsMTcgKzgyMTkxLDE3IEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVQYWlyX19WYWx1ZUFzc2lnbm1lbnRfMSIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMzU3ODoxOiBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZVBhaXJfX1ZhbHVlQXNzaWdubWVudF8xIDogKCBydWxlWEFubm90YXRpb25FbGVtZW50VmFsdWUgKSA7CisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjUxODQ6MTogcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVQYWlyX19WYWx1ZUFzc2lnbm1lbnRfMSA6ICggcnVsZVhBbm5vdGF0aW9uRWxlbWVudFZhbHVlICkgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlUGFpcl9fVmFsdWVBc3NpZ25tZW50XzEoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjM1ODI6MTogKCAoIHJ1bGVYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZSApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIzNTgzOjI6ICggcnVsZVhBbm5vdGF0aW9uRWxlbWVudFZhbHVlICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI1MTg4OjE6ICggKCBydWxlWEFubm90YXRpb25FbGVtZW50VmFsdWUgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNTE4OToyOiAoIHJ1bGVYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZSApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMzU4MzoyOiAoIHJ1bGVYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMzU4NDozOiBydWxlWEFubm90YXRpb25FbGVtZW50VmFsdWUKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI1MTg5OjI6ICggcnVsZVhBbm5vdGF0aW9uRWxlbWVudFZhbHVlICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI1MTkwOjM6IHJ1bGVYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZQogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZVBhaXJBY2Nlc3MoKS5nZXRWYWx1ZVhBbm5vdGF0aW9uRWxlbWVudFZhbHVlUGFyc2VyUnVsZUNhbGxfMV8wKCkpOyAKQEAgLTc3MDA3LDE3ICs4MjIzNiwxNyBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RfX0VsZW1lbnRzQXNzaWdubWVudF8wXzFfMCIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMzU5MzoxOiBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0X19FbGVtZW50c0Fzc2lnbm1lbnRfMF8xXzAgOiAoIHJ1bGVYQW5ub3RhdGlvbk9yRXhwcmVzc2lvbiApIDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNTE5OToxOiBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0X19FbGVtZW50c0Fzc2lnbm1lbnRfMF8xXzAgOiAoIHJ1bGVYQW5ub3RhdGlvbk9yRXhwcmVzc2lvbiApIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0X19FbGVtZW50c0Fzc2lnbm1lbnRfMF8xXzAoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjM1OTc6MTogKCAoIHJ1bGVYQW5ub3RhdGlvbk9yRXhwcmVzc2lvbiApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIzNTk4OjI6ICggcnVsZVhBbm5vdGF0aW9uT3JFeHByZXNzaW9uICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI1MjAzOjE6ICggKCBydWxlWEFubm90YXRpb25PckV4cHJlc3Npb24gKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNTIwNDoyOiAoIHJ1bGVYQW5ub3RhdGlvbk9yRXhwcmVzc2lvbiApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMzU5ODoyOiAoIHJ1bGVYQW5ub3RhdGlvbk9yRXhwcmVzc2lvbiApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMzU5OTozOiBydWxlWEFubm90YXRpb25PckV4cHJlc3Npb24KKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI1MjA0OjI6ICggcnVsZVhBbm5vdGF0aW9uT3JFeHByZXNzaW9uICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI1MjA1OjM6IHJ1bGVYQW5ub3RhdGlvbk9yRXhwcmVzc2lvbgogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0QWNjZXNzKCkuZ2V0RWxlbWVudHNYQW5ub3RhdGlvbk9yRXhwcmVzc2lvblBhcnNlclJ1bGVDYWxsXzBfMV8wXzAoKSk7IApAQCAtNzcwNTIsMTcgKzgyMjgxLDE3IEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdF9fRWxlbWVudHNBc3NpZ25tZW50XzBfMV8xXzEiCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjM2MDg6MTogcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdF9fRWxlbWVudHNBc3NpZ25tZW50XzBfMV8xXzEgOiAoIHJ1bGVYQW5ub3RhdGlvbk9yRXhwcmVzc2lvbiApIDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNTIxNDoxOiBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0X19FbGVtZW50c0Fzc2lnbm1lbnRfMF8xXzFfMSA6ICggcnVsZVhBbm5vdGF0aW9uT3JFeHByZXNzaW9uICkgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RfX0VsZW1lbnRzQXNzaWdubWVudF8wXzFfMV8xKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIzNjEyOjE6ICggKCBydWxlWEFubm90YXRpb25PckV4cHJlc3Npb24gKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMzYxMzoyOiAoIHJ1bGVYQW5ub3RhdGlvbk9yRXhwcmVzc2lvbiApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNTIxODoxOiAoICggcnVsZVhBbm5vdGF0aW9uT3JFeHByZXNzaW9uICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjUyMTk6MjogKCBydWxlWEFubm90YXRpb25PckV4cHJlc3Npb24gKQogICAgICAgICAgICAgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjM2MTM6MjogKCBydWxlWEFubm90YXRpb25PckV4cHJlc3Npb24gKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjM2MTQ6MzogcnVsZVhBbm5vdGF0aW9uT3JFeHByZXNzaW9uCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNTIxOToyOiAoIHJ1bGVYQW5ub3RhdGlvbk9yRXhwcmVzc2lvbiApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNTIyMDozOiBydWxlWEFubm90YXRpb25PckV4cHJlc3Npb24KICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdEFjY2VzcygpLmdldEVsZW1lbnRzWEFubm90YXRpb25PckV4cHJlc3Npb25QYXJzZXJSdWxlQ2FsbF8wXzFfMV8xXzAoKSk7IApAQCAtNzcwOTcsMTcgKzgyMzI2LDE3IEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdF9fRWxlbWVudHNBc3NpZ25tZW50XzFfMV8xXzEiCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjM2MjM6MTogcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdF9fRWxlbWVudHNBc3NpZ25tZW50XzFfMV8xXzEgOiAoIHJ1bGVYQW5ub3RhdGlvbk9yRXhwcmVzc2lvbiApIDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNTIyOToxOiBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0X19FbGVtZW50c0Fzc2lnbm1lbnRfMV8xXzFfMSA6ICggcnVsZVhBbm5vdGF0aW9uT3JFeHByZXNzaW9uICkgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RfX0VsZW1lbnRzQXNzaWdubWVudF8xXzFfMV8xKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIzNjI3OjE6ICggKCBydWxlWEFubm90YXRpb25PckV4cHJlc3Npb24gKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMzYyODoyOiAoIHJ1bGVYQW5ub3RhdGlvbk9yRXhwcmVzc2lvbiApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNTIzMzoxOiAoICggcnVsZVhBbm5vdGF0aW9uT3JFeHByZXNzaW9uICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjUyMzQ6MjogKCBydWxlWEFubm90YXRpb25PckV4cHJlc3Npb24gKQogICAgICAgICAgICAgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjM2Mjg6MjogKCBydWxlWEFubm90YXRpb25PckV4cHJlc3Npb24gKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjM2Mjk6MzogcnVsZVhBbm5vdGF0aW9uT3JFeHByZXNzaW9uCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNTIzNDoyOiAoIHJ1bGVYQW5ub3RhdGlvbk9yRXhwcmVzc2lvbiApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNTIzNTozOiBydWxlWEFubm90YXRpb25PckV4cHJlc3Npb24KICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdEFjY2VzcygpLmdldEVsZW1lbnRzWEFubm90YXRpb25PckV4cHJlc3Npb25QYXJzZXJSdWxlQ2FsbF8xXzFfMV8xXzAoKSk7IApAQCAtNzcxNDIsMTcgKzgyMzcxLDE3IEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVfX0VsZW1lbnRzQXNzaWdubWVudF8wXzFfMCIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMzYzODoxOiBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZV9fRWxlbWVudHNBc3NpZ25tZW50XzBfMV8wIDogKCBydWxlWEFubm90YXRpb25PckV4cHJlc3Npb24gKSA7CisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjUyNDQ6MTogcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVfX0VsZW1lbnRzQXNzaWdubWVudF8wXzFfMCA6ICggcnVsZVhBbm5vdGF0aW9uT3JFeHByZXNzaW9uICkgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlX19FbGVtZW50c0Fzc2lnbm1lbnRfMF8xXzAoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjM2NDI6MTogKCAoIHJ1bGVYQW5ub3RhdGlvbk9yRXhwcmVzc2lvbiApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIzNjQzOjI6ICggcnVsZVhBbm5vdGF0aW9uT3JFeHByZXNzaW9uICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI1MjQ4OjE6ICggKCBydWxlWEFubm90YXRpb25PckV4cHJlc3Npb24gKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNTI0OToyOiAoIHJ1bGVYQW5ub3RhdGlvbk9yRXhwcmVzc2lvbiApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMzY0MzoyOiAoIHJ1bGVYQW5ub3RhdGlvbk9yRXhwcmVzc2lvbiApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMzY0NDozOiBydWxlWEFubm90YXRpb25PckV4cHJlc3Npb24KKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI1MjQ5OjI6ICggcnVsZVhBbm5vdGF0aW9uT3JFeHByZXNzaW9uICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI1MjUwOjM6IHJ1bGVYQW5ub3RhdGlvbk9yRXhwcmVzc2lvbgogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZUFjY2VzcygpLmdldEVsZW1lbnRzWEFubm90YXRpb25PckV4cHJlc3Npb25QYXJzZXJSdWxlQ2FsbF8wXzFfMF8wKCkpOyAKQEAgLTc3MTg3LDE3ICs4MjQxNiwxNyBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlX19FbGVtZW50c0Fzc2lnbm1lbnRfMF8xXzFfMSIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMzY1MzoxOiBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZV9fRWxlbWVudHNBc3NpZ25tZW50XzBfMV8xXzEgOiAoIHJ1bGVYQW5ub3RhdGlvbk9yRXhwcmVzc2lvbiApIDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNTI1OToxOiBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZV9fRWxlbWVudHNBc3NpZ25tZW50XzBfMV8xXzEgOiAoIHJ1bGVYQW5ub3RhdGlvbk9yRXhwcmVzc2lvbiApIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZV9fRWxlbWVudHNBc3NpZ25tZW50XzBfMV8xXzEoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjM2NTc6MTogKCAoIHJ1bGVYQW5ub3RhdGlvbk9yRXhwcmVzc2lvbiApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIzNjU4OjI6ICggcnVsZVhBbm5vdGF0aW9uT3JFeHByZXNzaW9uICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI1MjYzOjE6ICggKCBydWxlWEFubm90YXRpb25PckV4cHJlc3Npb24gKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNTI2NDoyOiAoIHJ1bGVYQW5ub3RhdGlvbk9yRXhwcmVzc2lvbiApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMzY1ODoyOiAoIHJ1bGVYQW5ub3RhdGlvbk9yRXhwcmVzc2lvbiApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMzY1OTozOiBydWxlWEFubm90YXRpb25PckV4cHJlc3Npb24KKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI1MjY0OjI6ICggcnVsZVhBbm5vdGF0aW9uT3JFeHByZXNzaW9uICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI1MjY1OjM6IHJ1bGVYQW5ub3RhdGlvbk9yRXhwcmVzc2lvbgogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZUFjY2VzcygpLmdldEVsZW1lbnRzWEFubm90YXRpb25PckV4cHJlc3Npb25QYXJzZXJSdWxlQ2FsbF8wXzFfMV8xXzAoKSk7IApAQCAtNzcyMzIsMjMgKzgyNDYxLDIzIEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fWEFzc2lnbm1lbnRfX0ZlYXR1cmVBc3NpZ25tZW50XzBfMSIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMzY2ODoxOiBydWxlX19YQXNzaWdubWVudF9fRmVhdHVyZUFzc2lnbm1lbnRfMF8xIDogKCAoIHJ1bGVGZWF0dXJlQ2FsbElEICkgKSA7CisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjUyNzQ6MTogcnVsZV9fWEFzc2lnbm1lbnRfX0ZlYXR1cmVBc3NpZ25tZW50XzBfMSA6ICggKCBydWxlRmVhdHVyZUNhbGxJRCApICkgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1hBc3NpZ25tZW50X19GZWF0dXJlQXNzaWdubWVudF8wXzEoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjM2NzI6MTogKCAoICggcnVsZUZlYXR1cmVDYWxsSUQgKSApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIzNjczOjI6ICggKCBydWxlRmVhdHVyZUNhbGxJRCApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI1Mjc4OjE6ICggKCAoIHJ1bGVGZWF0dXJlQ2FsbElEICkgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNTI3OToyOiAoICggcnVsZUZlYXR1cmVDYWxsSUQgKSApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMzY3MzoyOiAoICggcnVsZUZlYXR1cmVDYWxsSUQgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMzY3NDozOiAoIHJ1bGVGZWF0dXJlQ2FsbElEICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI1Mjc5OjI6ICggKCBydWxlRmVhdHVyZUNhbGxJRCApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI1MjgwOjM6ICggcnVsZUZlYXR1cmVDYWxsSUQgKQogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYQXNzaWdubWVudEFjY2VzcygpLmdldEZlYXR1cmVKdm1JZGVudGlmaWFibGVFbGVtZW50Q3Jvc3NSZWZlcmVuY2VfMF8xXzAoKSk7IAogICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjM2NzU6MzogKCBydWxlRmVhdHVyZUNhbGxJRCApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMzY3Njo0OiBydWxlRmVhdHVyZUNhbGxJRAorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjUyODE6MzogKCBydWxlRmVhdHVyZUNhbGxJRCApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNTI4Mjo0OiBydWxlRmVhdHVyZUNhbGxJRAogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYQXNzaWdubWVudEFjY2VzcygpLmdldEZlYXR1cmVKdm1JZGVudGlmaWFibGVFbGVtZW50RmVhdHVyZUNhbGxJRFBhcnNlclJ1bGVDYWxsXzBfMV8wXzEoKSk7IApAQCAtNzcyODksMTcgKzgyNTE4LDE3IEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fWEFzc2lnbm1lbnRfX1ZhbHVlQXNzaWdubWVudF8wXzMiCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjM2ODc6MTogcnVsZV9fWEFzc2lnbm1lbnRfX1ZhbHVlQXNzaWdubWVudF8wXzMgOiAoIHJ1bGVYQXNzaWdubWVudCApIDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNTI5MzoxOiBydWxlX19YQXNzaWdubWVudF9fVmFsdWVBc3NpZ25tZW50XzBfMyA6ICggcnVsZVhBc3NpZ25tZW50ICkgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1hBc3NpZ25tZW50X19WYWx1ZUFzc2lnbm1lbnRfMF8zKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIzNjkxOjE6ICggKCBydWxlWEFzc2lnbm1lbnQgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMzY5MjoyOiAoIHJ1bGVYQXNzaWdubWVudCApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNTI5NzoxOiAoICggcnVsZVhBc3NpZ25tZW50ICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjUyOTg6MjogKCBydWxlWEFzc2lnbm1lbnQgKQogICAgICAgICAgICAgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjM2OTI6MjogKCBydWxlWEFzc2lnbm1lbnQgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjM2OTM6MzogcnVsZVhBc3NpZ25tZW50CisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNTI5ODoyOiAoIHJ1bGVYQXNzaWdubWVudCApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNTI5OTozOiBydWxlWEFzc2lnbm1lbnQKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WEFzc2lnbm1lbnRBY2Nlc3MoKS5nZXRWYWx1ZVhBc3NpZ25tZW50UGFyc2VyUnVsZUNhbGxfMF8zXzAoKSk7IApAQCAtNzczMzQsMjMgKzgyNTYzLDIzIEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fWEFzc2lnbm1lbnRfX0ZlYXR1cmVBc3NpZ25tZW50XzFfMV8wXzBfMSIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMzcwMjoxOiBydWxlX19YQXNzaWdubWVudF9fRmVhdHVyZUFzc2lnbm1lbnRfMV8xXzBfMF8xIDogKCAoIHJ1bGVPcE11bHRpQXNzaWduICkgKSA7CisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjUzMDg6MTogcnVsZV9fWEFzc2lnbm1lbnRfX0ZlYXR1cmVBc3NpZ25tZW50XzFfMV8wXzBfMSA6ICggKCBydWxlT3BNdWx0aUFzc2lnbiApICkgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1hBc3NpZ25tZW50X19GZWF0dXJlQXNzaWdubWVudF8xXzFfMF8wXzEoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjM3MDY6MTogKCAoICggcnVsZU9wTXVsdGlBc3NpZ24gKSApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIzNzA3OjI6ICggKCBydWxlT3BNdWx0aUFzc2lnbiApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI1MzEyOjE6ICggKCAoIHJ1bGVPcE11bHRpQXNzaWduICkgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNTMxMzoyOiAoICggcnVsZU9wTXVsdGlBc3NpZ24gKSApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMzcwNzoyOiAoICggcnVsZU9wTXVsdGlBc3NpZ24gKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMzcwODozOiAoIHJ1bGVPcE11bHRpQXNzaWduICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI1MzEzOjI6ICggKCBydWxlT3BNdWx0aUFzc2lnbiApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI1MzE0OjM6ICggcnVsZU9wTXVsdGlBc3NpZ24gKQogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYQXNzaWdubWVudEFjY2VzcygpLmdldEZlYXR1cmVKdm1JZGVudGlmaWFibGVFbGVtZW50Q3Jvc3NSZWZlcmVuY2VfMV8xXzBfMF8xXzAoKSk7IAogICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjM3MDk6MzogKCBydWxlT3BNdWx0aUFzc2lnbiApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMzcxMDo0OiBydWxlT3BNdWx0aUFzc2lnbgorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjUzMTU6MzogKCBydWxlT3BNdWx0aUFzc2lnbiApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNTMxNjo0OiBydWxlT3BNdWx0aUFzc2lnbgogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYQXNzaWdubWVudEFjY2VzcygpLmdldEZlYXR1cmVKdm1JZGVudGlmaWFibGVFbGVtZW50T3BNdWx0aUFzc2lnblBhcnNlclJ1bGVDYWxsXzFfMV8wXzBfMV8wXzEoKSk7IApAQCAtNzczOTEsMTcgKzgyNjIwLDE3IEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fWEFzc2lnbm1lbnRfX1JpZ2h0T3BlcmFuZEFzc2lnbm1lbnRfMV8xXzEiCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjM3MjE6MTogcnVsZV9fWEFzc2lnbm1lbnRfX1JpZ2h0T3BlcmFuZEFzc2lnbm1lbnRfMV8xXzEgOiAoIHJ1bGVYQXNzaWdubWVudCApIDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNTMyNzoxOiBydWxlX19YQXNzaWdubWVudF9fUmlnaHRPcGVyYW5kQXNzaWdubWVudF8xXzFfMSA6ICggcnVsZVhBc3NpZ25tZW50ICkgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1hBc3NpZ25tZW50X19SaWdodE9wZXJhbmRBc3NpZ25tZW50XzFfMV8xKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIzNzI1OjE6ICggKCBydWxlWEFzc2lnbm1lbnQgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMzcyNjoyOiAoIHJ1bGVYQXNzaWdubWVudCApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNTMzMToxOiAoICggcnVsZVhBc3NpZ25tZW50ICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjUzMzI6MjogKCBydWxlWEFzc2lnbm1lbnQgKQogICAgICAgICAgICAgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjM3MjY6MjogKCBydWxlWEFzc2lnbm1lbnQgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjM3Mjc6MzogcnVsZVhBc3NpZ25tZW50CisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNTMzMjoyOiAoIHJ1bGVYQXNzaWdubWVudCApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNTMzMzozOiBydWxlWEFzc2lnbm1lbnQKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WEFzc2lnbm1lbnRBY2Nlc3MoKS5nZXRSaWdodE9wZXJhbmRYQXNzaWdubWVudFBhcnNlclJ1bGVDYWxsXzFfMV8xXzAoKSk7IApAQCAtNzc0MzYsMjMgKzgyNjY1LDIzIEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fWE9yRXhwcmVzc2lvbl9fRmVhdHVyZUFzc2lnbm1lbnRfMV8wXzBfMSIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMzczNjoxOiBydWxlX19YT3JFeHByZXNzaW9uX19GZWF0dXJlQXNzaWdubWVudF8xXzBfMF8xIDogKCAoIHJ1bGVPcE9yICkgKSA7CisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjUzNDI6MTogcnVsZV9fWE9yRXhwcmVzc2lvbl9fRmVhdHVyZUFzc2lnbm1lbnRfMV8wXzBfMSA6ICggKCBydWxlT3BPciApICkgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1hPckV4cHJlc3Npb25fX0ZlYXR1cmVBc3NpZ25tZW50XzFfMF8wXzEoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjM3NDA6MTogKCAoICggcnVsZU9wT3IgKSApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIzNzQxOjI6ICggKCBydWxlT3BPciApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI1MzQ2OjE6ICggKCAoIHJ1bGVPcE9yICkgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNTM0NzoyOiAoICggcnVsZU9wT3IgKSApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMzc0MToyOiAoICggcnVsZU9wT3IgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMzc0MjozOiAoIHJ1bGVPcE9yICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI1MzQ3OjI6ICggKCBydWxlT3BPciApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI1MzQ4OjM6ICggcnVsZU9wT3IgKQogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYT3JFeHByZXNzaW9uQWNjZXNzKCkuZ2V0RmVhdHVyZUp2bUlkZW50aWZpYWJsZUVsZW1lbnRDcm9zc1JlZmVyZW5jZV8xXzBfMF8xXzAoKSk7IAogICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjM3NDM6MzogKCBydWxlT3BPciApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMzc0NDo0OiBydWxlT3BPcgorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjUzNDk6MzogKCBydWxlT3BPciApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNTM1MDo0OiBydWxlT3BPcgogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYT3JFeHByZXNzaW9uQWNjZXNzKCkuZ2V0RmVhdHVyZUp2bUlkZW50aWZpYWJsZUVsZW1lbnRPcE9yUGFyc2VyUnVsZUNhbGxfMV8wXzBfMV8wXzEoKSk7IApAQCAtNzc0OTMsMTcgKzgyNzIyLDE3IEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fWE9yRXhwcmVzc2lvbl9fUmlnaHRPcGVyYW5kQXNzaWdubWVudF8xXzEiCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjM3NTU6MTogcnVsZV9fWE9yRXhwcmVzc2lvbl9fUmlnaHRPcGVyYW5kQXNzaWdubWVudF8xXzEgOiAoIHJ1bGVYQW5kRXhwcmVzc2lvbiApIDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNTM2MToxOiBydWxlX19YT3JFeHByZXNzaW9uX19SaWdodE9wZXJhbmRBc3NpZ25tZW50XzFfMSA6ICggcnVsZVhBbmRFeHByZXNzaW9uICkgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1hPckV4cHJlc3Npb25fX1JpZ2h0T3BlcmFuZEFzc2lnbm1lbnRfMV8xKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIzNzU5OjE6ICggKCBydWxlWEFuZEV4cHJlc3Npb24gKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMzc2MDoyOiAoIHJ1bGVYQW5kRXhwcmVzc2lvbiApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNTM2NToxOiAoICggcnVsZVhBbmRFeHByZXNzaW9uICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjUzNjY6MjogKCBydWxlWEFuZEV4cHJlc3Npb24gKQogICAgICAgICAgICAgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjM3NjA6MjogKCBydWxlWEFuZEV4cHJlc3Npb24gKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjM3NjE6MzogcnVsZVhBbmRFeHByZXNzaW9uCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNTM2NjoyOiAoIHJ1bGVYQW5kRXhwcmVzc2lvbiApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNTM2NzozOiBydWxlWEFuZEV4cHJlc3Npb24KICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WE9yRXhwcmVzc2lvbkFjY2VzcygpLmdldFJpZ2h0T3BlcmFuZFhBbmRFeHByZXNzaW9uUGFyc2VyUnVsZUNhbGxfMV8xXzAoKSk7IApAQCAtNzc1MzgsMjMgKzgyNzY3LDIzIEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fWEFuZEV4cHJlc3Npb25fX0ZlYXR1cmVBc3NpZ25tZW50XzFfMF8wXzEiCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjM3NzA6MTogcnVsZV9fWEFuZEV4cHJlc3Npb25fX0ZlYXR1cmVBc3NpZ25tZW50XzFfMF8wXzEgOiAoICggcnVsZU9wQW5kICkgKSA7CisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjUzNzY6MTogcnVsZV9fWEFuZEV4cHJlc3Npb25fX0ZlYXR1cmVBc3NpZ25tZW50XzFfMF8wXzEgOiAoICggcnVsZU9wQW5kICkgKSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fWEFuZEV4cHJlc3Npb25fX0ZlYXR1cmVBc3NpZ25tZW50XzFfMF8wXzEoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjM3NzQ6MTogKCAoICggcnVsZU9wQW5kICkgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMzc3NToyOiAoICggcnVsZU9wQW5kICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjUzODA6MTogKCAoICggcnVsZU9wQW5kICkgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNTM4MToyOiAoICggcnVsZU9wQW5kICkgKQogICAgICAgICAgICAgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjM3NzU6MjogKCAoIHJ1bGVPcEFuZCApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIzNzc2OjM6ICggcnVsZU9wQW5kICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI1MzgxOjI6ICggKCBydWxlT3BBbmQgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNTM4MjozOiAoIHJ1bGVPcEFuZCApCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhBbmRFeHByZXNzaW9uQWNjZXNzKCkuZ2V0RmVhdHVyZUp2bUlkZW50aWZpYWJsZUVsZW1lbnRDcm9zc1JlZmVyZW5jZV8xXzBfMF8xXzAoKSk7IAogICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjM3Nzc6MzogKCBydWxlT3BBbmQgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjM3Nzg6NDogcnVsZU9wQW5kCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNTM4MzozOiAoIHJ1bGVPcEFuZCApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNTM4NDo0OiBydWxlT3BBbmQKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WEFuZEV4cHJlc3Npb25BY2Nlc3MoKS5nZXRGZWF0dXJlSnZtSWRlbnRpZmlhYmxlRWxlbWVudE9wQW5kUGFyc2VyUnVsZUNhbGxfMV8wXzBfMV8wXzEoKSk7IApAQCAtNzc1OTUsMTcgKzgyODI0LDE3IEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fWEFuZEV4cHJlc3Npb25fX1JpZ2h0T3BlcmFuZEFzc2lnbm1lbnRfMV8xIgotICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIzNzg5OjE6IHJ1bGVfX1hBbmRFeHByZXNzaW9uX19SaWdodE9wZXJhbmRBc3NpZ25tZW50XzFfMSA6ICggcnVsZVhFcXVhbGl0eUV4cHJlc3Npb24gKSA7CisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjUzOTU6MTogcnVsZV9fWEFuZEV4cHJlc3Npb25fX1JpZ2h0T3BlcmFuZEFzc2lnbm1lbnRfMV8xIDogKCBydWxlWEVxdWFsaXR5RXhwcmVzc2lvbiApIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YQW5kRXhwcmVzc2lvbl9fUmlnaHRPcGVyYW5kQXNzaWdubWVudF8xXzEoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjM3OTM6MTogKCAoIHJ1bGVYRXF1YWxpdHlFeHByZXNzaW9uICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjM3OTQ6MjogKCBydWxlWEVxdWFsaXR5RXhwcmVzc2lvbiApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNTM5OToxOiAoICggcnVsZVhFcXVhbGl0eUV4cHJlc3Npb24gKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNTQwMDoyOiAoIHJ1bGVYRXF1YWxpdHlFeHByZXNzaW9uICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIzNzk0OjI6ICggcnVsZVhFcXVhbGl0eUV4cHJlc3Npb24gKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjM3OTU6MzogcnVsZVhFcXVhbGl0eUV4cHJlc3Npb24KKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI1NDAwOjI6ICggcnVsZVhFcXVhbGl0eUV4cHJlc3Npb24gKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjU0MDE6MzogcnVsZVhFcXVhbGl0eUV4cHJlc3Npb24KICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WEFuZEV4cHJlc3Npb25BY2Nlc3MoKS5nZXRSaWdodE9wZXJhbmRYRXF1YWxpdHlFeHByZXNzaW9uUGFyc2VyUnVsZUNhbGxfMV8xXzAoKSk7IApAQCAtNzc2NDAsMjMgKzgyODY5LDIzIEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fWEVxdWFsaXR5RXhwcmVzc2lvbl9fRmVhdHVyZUFzc2lnbm1lbnRfMV8wXzBfMSIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMzgwNDoxOiBydWxlX19YRXF1YWxpdHlFeHByZXNzaW9uX19GZWF0dXJlQXNzaWdubWVudF8xXzBfMF8xIDogKCAoIHJ1bGVPcEVxdWFsaXR5ICkgKSA7CisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjU0MTA6MTogcnVsZV9fWEVxdWFsaXR5RXhwcmVzc2lvbl9fRmVhdHVyZUFzc2lnbm1lbnRfMV8wXzBfMSA6ICggKCBydWxlT3BFcXVhbGl0eSApICkgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1hFcXVhbGl0eUV4cHJlc3Npb25fX0ZlYXR1cmVBc3NpZ25tZW50XzFfMF8wXzEoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjM4MDg6MTogKCAoICggcnVsZU9wRXF1YWxpdHkgKSApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIzODA5OjI6ICggKCBydWxlT3BFcXVhbGl0eSApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI1NDE0OjE6ICggKCAoIHJ1bGVPcEVxdWFsaXR5ICkgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNTQxNToyOiAoICggcnVsZU9wRXF1YWxpdHkgKSApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMzgwOToyOiAoICggcnVsZU9wRXF1YWxpdHkgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMzgxMDozOiAoIHJ1bGVPcEVxdWFsaXR5ICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI1NDE1OjI6ICggKCBydWxlT3BFcXVhbGl0eSApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI1NDE2OjM6ICggcnVsZU9wRXF1YWxpdHkgKQogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYRXF1YWxpdHlFeHByZXNzaW9uQWNjZXNzKCkuZ2V0RmVhdHVyZUp2bUlkZW50aWZpYWJsZUVsZW1lbnRDcm9zc1JlZmVyZW5jZV8xXzBfMF8xXzAoKSk7IAogICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjM4MTE6MzogKCBydWxlT3BFcXVhbGl0eSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMzgxMjo0OiBydWxlT3BFcXVhbGl0eQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjU0MTc6MzogKCBydWxlT3BFcXVhbGl0eSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNTQxODo0OiBydWxlT3BFcXVhbGl0eQogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYRXF1YWxpdHlFeHByZXNzaW9uQWNjZXNzKCkuZ2V0RmVhdHVyZUp2bUlkZW50aWZpYWJsZUVsZW1lbnRPcEVxdWFsaXR5UGFyc2VyUnVsZUNhbGxfMV8wXzBfMV8wXzEoKSk7IApAQCAtNzc2OTcsMTcgKzgyOTI2LDE3IEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fWEVxdWFsaXR5RXhwcmVzc2lvbl9fUmlnaHRPcGVyYW5kQXNzaWdubWVudF8xXzEiCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjM4MjM6MTogcnVsZV9fWEVxdWFsaXR5RXhwcmVzc2lvbl9fUmlnaHRPcGVyYW5kQXNzaWdubWVudF8xXzEgOiAoIHJ1bGVYUmVsYXRpb25hbEV4cHJlc3Npb24gKSA7CisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjU0Mjk6MTogcnVsZV9fWEVxdWFsaXR5RXhwcmVzc2lvbl9fUmlnaHRPcGVyYW5kQXNzaWdubWVudF8xXzEgOiAoIHJ1bGVYUmVsYXRpb25hbEV4cHJlc3Npb24gKSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fWEVxdWFsaXR5RXhwcmVzc2lvbl9fUmlnaHRPcGVyYW5kQXNzaWdubWVudF8xXzEoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjM4Mjc6MTogKCAoIHJ1bGVYUmVsYXRpb25hbEV4cHJlc3Npb24gKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMzgyODoyOiAoIHJ1bGVYUmVsYXRpb25hbEV4cHJlc3Npb24gKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjU0MzM6MTogKCAoIHJ1bGVYUmVsYXRpb25hbEV4cHJlc3Npb24gKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNTQzNDoyOiAoIHJ1bGVYUmVsYXRpb25hbEV4cHJlc3Npb24gKQogICAgICAgICAgICAgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjM4Mjg6MjogKCBydWxlWFJlbGF0aW9uYWxFeHByZXNzaW9uICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIzODI5OjM6IHJ1bGVYUmVsYXRpb25hbEV4cHJlc3Npb24KKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI1NDM0OjI6ICggcnVsZVhSZWxhdGlvbmFsRXhwcmVzc2lvbiApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNTQzNTozOiBydWxlWFJlbGF0aW9uYWxFeHByZXNzaW9uCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhFcXVhbGl0eUV4cHJlc3Npb25BY2Nlc3MoKS5nZXRSaWdodE9wZXJhbmRYUmVsYXRpb25hbEV4cHJlc3Npb25QYXJzZXJSdWxlQ2FsbF8xXzFfMCgpKTsgCkBAIC03Nzc0MiwxNyArODI5NzEsMTcgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YUmVsYXRpb25hbEV4cHJlc3Npb25fX1R5cGVBc3NpZ25tZW50XzFfMF8xIgotICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIzODM4OjE6IHJ1bGVfX1hSZWxhdGlvbmFsRXhwcmVzc2lvbl9fVHlwZUFzc2lnbm1lbnRfMV8wXzEgOiAoIHJ1bGVKdm1UeXBlUmVmZXJlbmNlICkgOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI1NDQ0OjE6IHJ1bGVfX1hSZWxhdGlvbmFsRXhwcmVzc2lvbl9fVHlwZUFzc2lnbm1lbnRfMV8wXzEgOiAoIHJ1bGVKdm1UeXBlUmVmZXJlbmNlICkgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1hSZWxhdGlvbmFsRXhwcmVzc2lvbl9fVHlwZUFzc2lnbm1lbnRfMV8wXzEoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjM4NDI6MTogKCAoIHJ1bGVKdm1UeXBlUmVmZXJlbmNlICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjM4NDM6MjogKCBydWxlSnZtVHlwZVJlZmVyZW5jZSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNTQ0ODoxOiAoICggcnVsZUp2bVR5cGVSZWZlcmVuY2UgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNTQ0OToyOiAoIHJ1bGVKdm1UeXBlUmVmZXJlbmNlICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIzODQzOjI6ICggcnVsZUp2bVR5cGVSZWZlcmVuY2UgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjM4NDQ6MzogcnVsZUp2bVR5cGVSZWZlcmVuY2UKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI1NDQ5OjI6ICggcnVsZUp2bVR5cGVSZWZlcmVuY2UgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjU0NTA6MzogcnVsZUp2bVR5cGVSZWZlcmVuY2UKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WFJlbGF0aW9uYWxFeHByZXNzaW9uQWNjZXNzKCkuZ2V0VHlwZUp2bVR5cGVSZWZlcmVuY2VQYXJzZXJSdWxlQ2FsbF8xXzBfMV8wKCkpOyAKQEAgLTc3Nzg3LDIzICs4MzAxNiwyMyBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX1hSZWxhdGlvbmFsRXhwcmVzc2lvbl9fRmVhdHVyZUFzc2lnbm1lbnRfMV8xXzBfMF8xIgotICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIzODUzOjE6IHJ1bGVfX1hSZWxhdGlvbmFsRXhwcmVzc2lvbl9fRmVhdHVyZUFzc2lnbm1lbnRfMV8xXzBfMF8xIDogKCAoIHJ1bGVPcENvbXBhcmUgKSApIDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNTQ1OToxOiBydWxlX19YUmVsYXRpb25hbEV4cHJlc3Npb25fX0ZlYXR1cmVBc3NpZ25tZW50XzFfMV8wXzBfMSA6ICggKCBydWxlT3BDb21wYXJlICkgKSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fWFJlbGF0aW9uYWxFeHByZXNzaW9uX19GZWF0dXJlQXNzaWdubWVudF8xXzFfMF8wXzEoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjM4NTc6MTogKCAoICggcnVsZU9wQ29tcGFyZSApICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjM4NTg6MjogKCAoIHJ1bGVPcENvbXBhcmUgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNTQ2MzoxOiAoICggKCBydWxlT3BDb21wYXJlICkgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNTQ2NDoyOiAoICggcnVsZU9wQ29tcGFyZSApICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIzODU4OjI6ICggKCBydWxlT3BDb21wYXJlICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjM4NTk6MzogKCBydWxlT3BDb21wYXJlICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI1NDY0OjI6ICggKCBydWxlT3BDb21wYXJlICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjU0NjU6MzogKCBydWxlT3BDb21wYXJlICkKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WFJlbGF0aW9uYWxFeHByZXNzaW9uQWNjZXNzKCkuZ2V0RmVhdHVyZUp2bUlkZW50aWZpYWJsZUVsZW1lbnRDcm9zc1JlZmVyZW5jZV8xXzFfMF8wXzFfMCgpKTsgCiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMzg2MDozOiAoIHJ1bGVPcENvbXBhcmUgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjM4NjE6NDogcnVsZU9wQ29tcGFyZQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjU0NjY6MzogKCBydWxlT3BDb21wYXJlICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI1NDY3OjQ6IHJ1bGVPcENvbXBhcmUKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WFJlbGF0aW9uYWxFeHByZXNzaW9uQWNjZXNzKCkuZ2V0RmVhdHVyZUp2bUlkZW50aWZpYWJsZUVsZW1lbnRPcENvbXBhcmVQYXJzZXJSdWxlQ2FsbF8xXzFfMF8wXzFfMF8xKCkpOyAKQEAgLTc3ODQ0LDE3ICs4MzA3MywxNyBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX1hSZWxhdGlvbmFsRXhwcmVzc2lvbl9fUmlnaHRPcGVyYW5kQXNzaWdubWVudF8xXzFfMSIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMzg3MjoxOiBydWxlX19YUmVsYXRpb25hbEV4cHJlc3Npb25fX1JpZ2h0T3BlcmFuZEFzc2lnbm1lbnRfMV8xXzEgOiAoIHJ1bGVYT3RoZXJPcGVyYXRvckV4cHJlc3Npb24gKSA7CisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjU0Nzg6MTogcnVsZV9fWFJlbGF0aW9uYWxFeHByZXNzaW9uX19SaWdodE9wZXJhbmRBc3NpZ25tZW50XzFfMV8xIDogKCBydWxlWE90aGVyT3BlcmF0b3JFeHByZXNzaW9uICkgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1hSZWxhdGlvbmFsRXhwcmVzc2lvbl9fUmlnaHRPcGVyYW5kQXNzaWdubWVudF8xXzFfMSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMzg3NjoxOiAoICggcnVsZVhPdGhlck9wZXJhdG9yRXhwcmVzc2lvbiApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIzODc3OjI6ICggcnVsZVhPdGhlck9wZXJhdG9yRXhwcmVzc2lvbiApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNTQ4MjoxOiAoICggcnVsZVhPdGhlck9wZXJhdG9yRXhwcmVzc2lvbiApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI1NDgzOjI6ICggcnVsZVhPdGhlck9wZXJhdG9yRXhwcmVzc2lvbiApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMzg3NzoyOiAoIHJ1bGVYT3RoZXJPcGVyYXRvckV4cHJlc3Npb24gKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjM4Nzg6MzogcnVsZVhPdGhlck9wZXJhdG9yRXhwcmVzc2lvbgorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjU0ODM6MjogKCBydWxlWE90aGVyT3BlcmF0b3JFeHByZXNzaW9uICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI1NDg0OjM6IHJ1bGVYT3RoZXJPcGVyYXRvckV4cHJlc3Npb24KICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WFJlbGF0aW9uYWxFeHByZXNzaW9uQWNjZXNzKCkuZ2V0UmlnaHRPcGVyYW5kWE90aGVyT3BlcmF0b3JFeHByZXNzaW9uUGFyc2VyUnVsZUNhbGxfMV8xXzFfMCgpKTsgCkBAIC03Nzg4OSwyMyArODMxMTgsMjMgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YT3RoZXJPcGVyYXRvckV4cHJlc3Npb25fX0ZlYXR1cmVBc3NpZ25tZW50XzFfMF8wXzEiCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjM4ODc6MTogcnVsZV9fWE90aGVyT3BlcmF0b3JFeHByZXNzaW9uX19GZWF0dXJlQXNzaWdubWVudF8xXzBfMF8xIDogKCAoIHJ1bGVPcE90aGVyICkgKSA7CisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjU0OTM6MTogcnVsZV9fWE90aGVyT3BlcmF0b3JFeHByZXNzaW9uX19GZWF0dXJlQXNzaWdubWVudF8xXzBfMF8xIDogKCAoIHJ1bGVPcE90aGVyICkgKSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fWE90aGVyT3BlcmF0b3JFeHByZXNzaW9uX19GZWF0dXJlQXNzaWdubWVudF8xXzBfMF8xKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIzODkxOjE6ICggKCAoIHJ1bGVPcE90aGVyICkgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMzg5MjoyOiAoICggcnVsZU9wT3RoZXIgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNTQ5NzoxOiAoICggKCBydWxlT3BPdGhlciApICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjU0OTg6MjogKCAoIHJ1bGVPcE90aGVyICkgKQogICAgICAgICAgICAgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjM4OTI6MjogKCAoIHJ1bGVPcE90aGVyICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjM4OTM6MzogKCBydWxlT3BPdGhlciApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNTQ5ODoyOiAoICggcnVsZU9wT3RoZXIgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNTQ5OTozOiAoIHJ1bGVPcE90aGVyICkKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WE90aGVyT3BlcmF0b3JFeHByZXNzaW9uQWNjZXNzKCkuZ2V0RmVhdHVyZUp2bUlkZW50aWZpYWJsZUVsZW1lbnRDcm9zc1JlZmVyZW5jZV8xXzBfMF8xXzAoKSk7IAogICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjM4OTQ6MzogKCBydWxlT3BPdGhlciApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMzg5NTo0OiBydWxlT3BPdGhlcgorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjU1MDA6MzogKCBydWxlT3BPdGhlciApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNTUwMTo0OiBydWxlT3BPdGhlcgogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYT3RoZXJPcGVyYXRvckV4cHJlc3Npb25BY2Nlc3MoKS5nZXRGZWF0dXJlSnZtSWRlbnRpZmlhYmxlRWxlbWVudE9wT3RoZXJQYXJzZXJSdWxlQ2FsbF8xXzBfMF8xXzBfMSgpKTsgCkBAIC03Nzk0NiwxNyArODMxNzUsMTcgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YT3RoZXJPcGVyYXRvckV4cHJlc3Npb25fX1JpZ2h0T3BlcmFuZEFzc2lnbm1lbnRfMV8xIgotICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIzOTA2OjE6IHJ1bGVfX1hPdGhlck9wZXJhdG9yRXhwcmVzc2lvbl9fUmlnaHRPcGVyYW5kQXNzaWdubWVudF8xXzEgOiAoIHJ1bGVYQWRkaXRpdmVFeHByZXNzaW9uICkgOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI1NTEyOjE6IHJ1bGVfX1hPdGhlck9wZXJhdG9yRXhwcmVzc2lvbl9fUmlnaHRPcGVyYW5kQXNzaWdubWVudF8xXzEgOiAoIHJ1bGVYQWRkaXRpdmVFeHByZXNzaW9uICkgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1hPdGhlck9wZXJhdG9yRXhwcmVzc2lvbl9fUmlnaHRPcGVyYW5kQXNzaWdubWVudF8xXzEoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjM5MTA6MTogKCAoIHJ1bGVYQWRkaXRpdmVFeHByZXNzaW9uICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjM5MTE6MjogKCBydWxlWEFkZGl0aXZlRXhwcmVzc2lvbiApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNTUxNjoxOiAoICggcnVsZVhBZGRpdGl2ZUV4cHJlc3Npb24gKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNTUxNzoyOiAoIHJ1bGVYQWRkaXRpdmVFeHByZXNzaW9uICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIzOTExOjI6ICggcnVsZVhBZGRpdGl2ZUV4cHJlc3Npb24gKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjM5MTI6MzogcnVsZVhBZGRpdGl2ZUV4cHJlc3Npb24KKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI1NTE3OjI6ICggcnVsZVhBZGRpdGl2ZUV4cHJlc3Npb24gKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjU1MTg6MzogcnVsZVhBZGRpdGl2ZUV4cHJlc3Npb24KICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WE90aGVyT3BlcmF0b3JFeHByZXNzaW9uQWNjZXNzKCkuZ2V0UmlnaHRPcGVyYW5kWEFkZGl0aXZlRXhwcmVzc2lvblBhcnNlclJ1bGVDYWxsXzFfMV8wKCkpOyAKQEAgLTc3OTkxLDIzICs4MzIyMCwyMyBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX1hBZGRpdGl2ZUV4cHJlc3Npb25fX0ZlYXR1cmVBc3NpZ25tZW50XzFfMF8wXzEiCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjM5MjE6MTogcnVsZV9fWEFkZGl0aXZlRXhwcmVzc2lvbl9fRmVhdHVyZUFzc2lnbm1lbnRfMV8wXzBfMSA6ICggKCBydWxlT3BBZGQgKSApIDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNTUyNzoxOiBydWxlX19YQWRkaXRpdmVFeHByZXNzaW9uX19GZWF0dXJlQXNzaWdubWVudF8xXzBfMF8xIDogKCAoIHJ1bGVPcEFkZCApICkgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1hBZGRpdGl2ZUV4cHJlc3Npb25fX0ZlYXR1cmVBc3NpZ25tZW50XzFfMF8wXzEoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjM5MjU6MTogKCAoICggcnVsZU9wQWRkICkgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMzkyNjoyOiAoICggcnVsZU9wQWRkICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjU1MzE6MTogKCAoICggcnVsZU9wQWRkICkgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNTUzMjoyOiAoICggcnVsZU9wQWRkICkgKQogICAgICAgICAgICAgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjM5MjY6MjogKCAoIHJ1bGVPcEFkZCApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIzOTI3OjM6ICggcnVsZU9wQWRkICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI1NTMyOjI6ICggKCBydWxlT3BBZGQgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNTUzMzozOiAoIHJ1bGVPcEFkZCApCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhBZGRpdGl2ZUV4cHJlc3Npb25BY2Nlc3MoKS5nZXRGZWF0dXJlSnZtSWRlbnRpZmlhYmxlRWxlbWVudENyb3NzUmVmZXJlbmNlXzFfMF8wXzFfMCgpKTsgCiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMzkyODozOiAoIHJ1bGVPcEFkZCApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMzkyOTo0OiBydWxlT3BBZGQKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI1NTM0OjM6ICggcnVsZU9wQWRkICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI1NTM1OjQ6IHJ1bGVPcEFkZAogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYQWRkaXRpdmVFeHByZXNzaW9uQWNjZXNzKCkuZ2V0RmVhdHVyZUp2bUlkZW50aWZpYWJsZUVsZW1lbnRPcEFkZFBhcnNlclJ1bGVDYWxsXzFfMF8wXzFfMF8xKCkpOyAKQEAgLTc4MDQ4LDE3ICs4MzI3NywxNyBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX1hBZGRpdGl2ZUV4cHJlc3Npb25fX1JpZ2h0T3BlcmFuZEFzc2lnbm1lbnRfMV8xIgotICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIzOTQwOjE6IHJ1bGVfX1hBZGRpdGl2ZUV4cHJlc3Npb25fX1JpZ2h0T3BlcmFuZEFzc2lnbm1lbnRfMV8xIDogKCBydWxlWE11bHRpcGxpY2F0aXZlRXhwcmVzc2lvbiApIDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNTU0NjoxOiBydWxlX19YQWRkaXRpdmVFeHByZXNzaW9uX19SaWdodE9wZXJhbmRBc3NpZ25tZW50XzFfMSA6ICggcnVsZVhNdWx0aXBsaWNhdGl2ZUV4cHJlc3Npb24gKSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fWEFkZGl0aXZlRXhwcmVzc2lvbl9fUmlnaHRPcGVyYW5kQXNzaWdubWVudF8xXzEoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjM5NDQ6MTogKCAoIHJ1bGVYTXVsdGlwbGljYXRpdmVFeHByZXNzaW9uICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjM5NDU6MjogKCBydWxlWE11bHRpcGxpY2F0aXZlRXhwcmVzc2lvbiApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNTU1MDoxOiAoICggcnVsZVhNdWx0aXBsaWNhdGl2ZUV4cHJlc3Npb24gKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNTU1MToyOiAoIHJ1bGVYTXVsdGlwbGljYXRpdmVFeHByZXNzaW9uICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIzOTQ1OjI6ICggcnVsZVhNdWx0aXBsaWNhdGl2ZUV4cHJlc3Npb24gKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjM5NDY6MzogcnVsZVhNdWx0aXBsaWNhdGl2ZUV4cHJlc3Npb24KKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI1NTUxOjI6ICggcnVsZVhNdWx0aXBsaWNhdGl2ZUV4cHJlc3Npb24gKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjU1NTI6MzogcnVsZVhNdWx0aXBsaWNhdGl2ZUV4cHJlc3Npb24KICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WEFkZGl0aXZlRXhwcmVzc2lvbkFjY2VzcygpLmdldFJpZ2h0T3BlcmFuZFhNdWx0aXBsaWNhdGl2ZUV4cHJlc3Npb25QYXJzZXJSdWxlQ2FsbF8xXzFfMCgpKTsgCkBAIC03ODA5MywyMyArODMzMjIsMjMgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YTXVsdGlwbGljYXRpdmVFeHByZXNzaW9uX19GZWF0dXJlQXNzaWdubWVudF8xXzBfMF8xIgotICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIzOTU1OjE6IHJ1bGVfX1hNdWx0aXBsaWNhdGl2ZUV4cHJlc3Npb25fX0ZlYXR1cmVBc3NpZ25tZW50XzFfMF8wXzEgOiAoICggcnVsZU9wTXVsdGkgKSApIDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNTU2MToxOiBydWxlX19YTXVsdGlwbGljYXRpdmVFeHByZXNzaW9uX19GZWF0dXJlQXNzaWdubWVudF8xXzBfMF8xIDogKCAoIHJ1bGVPcE11bHRpICkgKSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fWE11bHRpcGxpY2F0aXZlRXhwcmVzc2lvbl9fRmVhdHVyZUFzc2lnbm1lbnRfMV8wXzBfMSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMzk1OToxOiAoICggKCBydWxlT3BNdWx0aSApICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjM5NjA6MjogKCAoIHJ1bGVPcE11bHRpICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjU1NjU6MTogKCAoICggcnVsZU9wTXVsdGkgKSApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI1NTY2OjI6ICggKCBydWxlT3BNdWx0aSApICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIzOTYwOjI6ICggKCBydWxlT3BNdWx0aSApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIzOTYxOjM6ICggcnVsZU9wTXVsdGkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjU1NjY6MjogKCAoIHJ1bGVPcE11bHRpICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjU1Njc6MzogKCBydWxlT3BNdWx0aSApCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhNdWx0aXBsaWNhdGl2ZUV4cHJlc3Npb25BY2Nlc3MoKS5nZXRGZWF0dXJlSnZtSWRlbnRpZmlhYmxlRWxlbWVudENyb3NzUmVmZXJlbmNlXzFfMF8wXzFfMCgpKTsgCiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMzk2MjozOiAoIHJ1bGVPcE11bHRpICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIzOTYzOjQ6IHJ1bGVPcE11bHRpCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNTU2ODozOiAoIHJ1bGVPcE11bHRpICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI1NTY5OjQ6IHJ1bGVPcE11bHRpCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhNdWx0aXBsaWNhdGl2ZUV4cHJlc3Npb25BY2Nlc3MoKS5nZXRGZWF0dXJlSnZtSWRlbnRpZmlhYmxlRWxlbWVudE9wTXVsdGlQYXJzZXJSdWxlQ2FsbF8xXzBfMF8xXzBfMSgpKTsgCkBAIC03ODE1MCwxNyArODMzNzksMTcgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YTXVsdGlwbGljYXRpdmVFeHByZXNzaW9uX19SaWdodE9wZXJhbmRBc3NpZ25tZW50XzFfMSIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMzk3NDoxOiBydWxlX19YTXVsdGlwbGljYXRpdmVFeHByZXNzaW9uX19SaWdodE9wZXJhbmRBc3NpZ25tZW50XzFfMSA6ICggcnVsZVhVbmFyeU9wZXJhdGlvbiApIDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNTU4MDoxOiBydWxlX19YTXVsdGlwbGljYXRpdmVFeHByZXNzaW9uX19SaWdodE9wZXJhbmRBc3NpZ25tZW50XzFfMSA6ICggcnVsZVhVbmFyeU9wZXJhdGlvbiApIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YTXVsdGlwbGljYXRpdmVFeHByZXNzaW9uX19SaWdodE9wZXJhbmRBc3NpZ25tZW50XzFfMSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMzk3ODoxOiAoICggcnVsZVhVbmFyeU9wZXJhdGlvbiApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIzOTc5OjI6ICggcnVsZVhVbmFyeU9wZXJhdGlvbiApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNTU4NDoxOiAoICggcnVsZVhVbmFyeU9wZXJhdGlvbiApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI1NTg1OjI6ICggcnVsZVhVbmFyeU9wZXJhdGlvbiApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMzk3OToyOiAoIHJ1bGVYVW5hcnlPcGVyYXRpb24gKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjM5ODA6MzogcnVsZVhVbmFyeU9wZXJhdGlvbgorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjU1ODU6MjogKCBydWxlWFVuYXJ5T3BlcmF0aW9uICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI1NTg2OjM6IHJ1bGVYVW5hcnlPcGVyYXRpb24KICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WE11bHRpcGxpY2F0aXZlRXhwcmVzc2lvbkFjY2VzcygpLmdldFJpZ2h0T3BlcmFuZFhVbmFyeU9wZXJhdGlvblBhcnNlclJ1bGVDYWxsXzFfMV8wKCkpOyAKQEAgLTc4MTk1LDIzICs4MzQyNCwyMyBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX1hVbmFyeU9wZXJhdGlvbl9fRmVhdHVyZUFzc2lnbm1lbnRfMF8xIgotICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIzOTg5OjE6IHJ1bGVfX1hVbmFyeU9wZXJhdGlvbl9fRmVhdHVyZUFzc2lnbm1lbnRfMF8xIDogKCAoIHJ1bGVPcFVuYXJ5ICkgKSA7CisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjU1OTU6MTogcnVsZV9fWFVuYXJ5T3BlcmF0aW9uX19GZWF0dXJlQXNzaWdubWVudF8wXzEgOiAoICggcnVsZU9wVW5hcnkgKSApIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YVW5hcnlPcGVyYXRpb25fX0ZlYXR1cmVBc3NpZ25tZW50XzBfMSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMzk5MzoxOiAoICggKCBydWxlT3BVbmFyeSApICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjM5OTQ6MjogKCAoIHJ1bGVPcFVuYXJ5ICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjU1OTk6MTogKCAoICggcnVsZU9wVW5hcnkgKSApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI1NjAwOjI6ICggKCBydWxlT3BVbmFyeSApICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIzOTk0OjI6ICggKCBydWxlT3BVbmFyeSApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIzOTk1OjM6ICggcnVsZU9wVW5hcnkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjU2MDA6MjogKCAoIHJ1bGVPcFVuYXJ5ICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjU2MDE6MzogKCBydWxlT3BVbmFyeSApCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhVbmFyeU9wZXJhdGlvbkFjY2VzcygpLmdldEZlYXR1cmVKdm1JZGVudGlmaWFibGVFbGVtZW50Q3Jvc3NSZWZlcmVuY2VfMF8xXzAoKSk7IAogICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjM5OTY6MzogKCBydWxlT3BVbmFyeSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMzk5Nzo0OiBydWxlT3BVbmFyeQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjU2MDI6MzogKCBydWxlT3BVbmFyeSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNTYwMzo0OiBydWxlT3BVbmFyeQogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYVW5hcnlPcGVyYXRpb25BY2Nlc3MoKS5nZXRGZWF0dXJlSnZtSWRlbnRpZmlhYmxlRWxlbWVudE9wVW5hcnlQYXJzZXJSdWxlQ2FsbF8wXzFfMF8xKCkpOyAKQEAgLTc4MjUyLDE3ICs4MzQ4MSwxNyBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX1hVbmFyeU9wZXJhdGlvbl9fT3BlcmFuZEFzc2lnbm1lbnRfMF8yIgotICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI0MDA4OjE6IHJ1bGVfX1hVbmFyeU9wZXJhdGlvbl9fT3BlcmFuZEFzc2lnbm1lbnRfMF8yIDogKCBydWxlWFVuYXJ5T3BlcmF0aW9uICkgOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI1NjE0OjE6IHJ1bGVfX1hVbmFyeU9wZXJhdGlvbl9fT3BlcmFuZEFzc2lnbm1lbnRfMF8yIDogKCBydWxlWFVuYXJ5T3BlcmF0aW9uICkgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1hVbmFyeU9wZXJhdGlvbl9fT3BlcmFuZEFzc2lnbm1lbnRfMF8yKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI0MDEyOjE6ICggKCBydWxlWFVuYXJ5T3BlcmF0aW9uICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjQwMTM6MjogKCBydWxlWFVuYXJ5T3BlcmF0aW9uICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI1NjE4OjE6ICggKCBydWxlWFVuYXJ5T3BlcmF0aW9uICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjU2MTk6MjogKCBydWxlWFVuYXJ5T3BlcmF0aW9uICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI0MDEzOjI6ICggcnVsZVhVbmFyeU9wZXJhdGlvbiApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNDAxNDozOiBydWxlWFVuYXJ5T3BlcmF0aW9uCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNTYxOToyOiAoIHJ1bGVYVW5hcnlPcGVyYXRpb24gKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjU2MjA6MzogcnVsZVhVbmFyeU9wZXJhdGlvbgogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYVW5hcnlPcGVyYXRpb25BY2Nlc3MoKS5nZXRPcGVyYW5kWFVuYXJ5T3BlcmF0aW9uUGFyc2VyUnVsZUNhbGxfMF8yXzAoKSk7IApAQCAtNzgyOTcsMTcgKzgzNTI2LDE3IEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fWENhc3RlZEV4cHJlc3Npb25fX1R5cGVBc3NpZ25tZW50XzFfMSIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNDAyMzoxOiBydWxlX19YQ2FzdGVkRXhwcmVzc2lvbl9fVHlwZUFzc2lnbm1lbnRfMV8xIDogKCBydWxlSnZtVHlwZVJlZmVyZW5jZSApIDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNTYyOToxOiBydWxlX19YQ2FzdGVkRXhwcmVzc2lvbl9fVHlwZUFzc2lnbm1lbnRfMV8xIDogKCBydWxlSnZtVHlwZVJlZmVyZW5jZSApIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YQ2FzdGVkRXhwcmVzc2lvbl9fVHlwZUFzc2lnbm1lbnRfMV8xKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI0MDI3OjE6ICggKCBydWxlSnZtVHlwZVJlZmVyZW5jZSApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI0MDI4OjI6ICggcnVsZUp2bVR5cGVSZWZlcmVuY2UgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjU2MzM6MTogKCAoIHJ1bGVKdm1UeXBlUmVmZXJlbmNlICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjU2MzQ6MjogKCBydWxlSnZtVHlwZVJlZmVyZW5jZSApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNDAyODoyOiAoIHJ1bGVKdm1UeXBlUmVmZXJlbmNlICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI0MDI5OjM6IHJ1bGVKdm1UeXBlUmVmZXJlbmNlCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNTYzNDoyOiAoIHJ1bGVKdm1UeXBlUmVmZXJlbmNlICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI1NjM1OjM6IHJ1bGVKdm1UeXBlUmVmZXJlbmNlCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhDYXN0ZWRFeHByZXNzaW9uQWNjZXNzKCkuZ2V0VHlwZUp2bVR5cGVSZWZlcmVuY2VQYXJzZXJSdWxlQ2FsbF8xXzFfMCgpKTsgCkBAIC03ODM0MiwyMyArODM1NzEsMjMgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YUG9zdGZpeE9wZXJhdGlvbl9fRmVhdHVyZUFzc2lnbm1lbnRfMV8wXzEiCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjQwMzg6MTogcnVsZV9fWFBvc3RmaXhPcGVyYXRpb25fX0ZlYXR1cmVBc3NpZ25tZW50XzFfMF8xIDogKCAoIHJ1bGVPcFBvc3RmaXggKSApIDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNTY0NDoxOiBydWxlX19YUG9zdGZpeE9wZXJhdGlvbl9fRmVhdHVyZUFzc2lnbm1lbnRfMV8wXzEgOiAoICggcnVsZU9wUG9zdGZpeCApICkgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1hQb3N0Zml4T3BlcmF0aW9uX19GZWF0dXJlQXNzaWdubWVudF8xXzBfMSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNDA0MjoxOiAoICggKCBydWxlT3BQb3N0Zml4ICkgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNDA0MzoyOiAoICggcnVsZU9wUG9zdGZpeCApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI1NjQ4OjE6ICggKCAoIHJ1bGVPcFBvc3RmaXggKSApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI1NjQ5OjI6ICggKCBydWxlT3BQb3N0Zml4ICkgKQogICAgICAgICAgICAgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjQwNDM6MjogKCAoIHJ1bGVPcFBvc3RmaXggKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNDA0NDozOiAoIHJ1bGVPcFBvc3RmaXggKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjU2NDk6MjogKCAoIHJ1bGVPcFBvc3RmaXggKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNTY1MDozOiAoIHJ1bGVPcFBvc3RmaXggKQogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYUG9zdGZpeE9wZXJhdGlvbkFjY2VzcygpLmdldEZlYXR1cmVKdm1JZGVudGlmaWFibGVFbGVtZW50Q3Jvc3NSZWZlcmVuY2VfMV8wXzFfMCgpKTsgCiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNDA0NTozOiAoIHJ1bGVPcFBvc3RmaXggKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjQwNDY6NDogcnVsZU9wUG9zdGZpeAorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjU2NTE6MzogKCBydWxlT3BQb3N0Zml4ICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI1NjUyOjQ6IHJ1bGVPcFBvc3RmaXgKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WFBvc3RmaXhPcGVyYXRpb25BY2Nlc3MoKS5nZXRGZWF0dXJlSnZtSWRlbnRpZmlhYmxlRWxlbWVudE9wUG9zdGZpeFBhcnNlclJ1bGVDYWxsXzFfMF8xXzBfMSgpKTsgCkBAIC03ODM5OSwyOCArODM2MjgsMjggQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX0V4cGxpY2l0U3RhdGljQXNzaWdubWVudF8xXzBfMF8wXzFfMSIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNDA1NzoxOiBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX0V4cGxpY2l0U3RhdGljQXNzaWdubWVudF8xXzBfMF8wXzFfMSA6ICggKCAnOjonICkgKSA7CisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjU2NjM6MTogcnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19FeHBsaWNpdFN0YXRpY0Fzc2lnbm1lbnRfMV8wXzBfMF8xXzEgOiAoICggJzo6JyApICkgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fRXhwbGljaXRTdGF0aWNBc3NpZ25tZW50XzFfMF8wXzBfMV8xKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI0MDYxOjE6ICggKCAoICc6OicgKSApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI0MDYyOjI6ICggKCAnOjonICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjU2Njc6MTogKCAoICggJzo6JyApICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjU2Njg6MjogKCAoICc6OicgKSApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNDA2MjoyOiAoICggJzo6JyApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI0MDYzOjM6ICggJzo6JyApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNTY2ODoyOiAoICggJzo6JyApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI1NjY5OjM6ICggJzo6JyApCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhNZW1iZXJGZWF0dXJlQ2FsbEFjY2VzcygpLmdldEV4cGxpY2l0U3RhdGljQ29sb25Db2xvbktleXdvcmRfMV8wXzBfMF8xXzFfMCgpKTsgCiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNDA2NDozOiAoICc6OicgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjQwNjU6NDogJzo6JworICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjU2NzA6MzogKCAnOjonICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI1NjcxOjQ6ICc6OicKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WE1lbWJlckZlYXR1cmVDYWxsQWNjZXNzKCkuZ2V0RXhwbGljaXRTdGF0aWNDb2xvbkNvbG9uS2V5d29yZF8xXzBfMF8wXzFfMV8wKCkpOyAKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1hdGNoKGlucHV0LDE1MCxGT0xMT1dfMik7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CisgICAgICAgICAgICBtYXRjaChpbnB1dCwxNjIsRk9MTE9XXzIpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOwogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBhZnRlcihncmFtbWFyQWNjZXNzLmdldFhNZW1iZXJGZWF0dXJlQ2FsbEFjY2VzcygpLmdldEV4cGxpY2l0U3RhdGljQ29sb25Db2xvbktleXdvcmRfMV8wXzBfMF8xXzFfMCgpKTsgCiAgICAgICAgICAgICB9CkBAIC03ODQ1MiwyMyArODM2ODEsMjMgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX0ZlYXR1cmVBc3NpZ25tZW50XzFfMF8wXzBfMiIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNDA3NjoxOiBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX0ZlYXR1cmVBc3NpZ25tZW50XzFfMF8wXzBfMiA6ICggKCBydWxlRmVhdHVyZUNhbGxJRCApICkgOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI1NjgyOjE6IHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fRmVhdHVyZUFzc2lnbm1lbnRfMV8wXzBfMF8yIDogKCAoIHJ1bGVGZWF0dXJlQ2FsbElEICkgKSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19GZWF0dXJlQXNzaWdubWVudF8xXzBfMF8wXzIoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjQwODA6MTogKCAoICggcnVsZUZlYXR1cmVDYWxsSUQgKSApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI0MDgxOjI6ICggKCBydWxlRmVhdHVyZUNhbGxJRCApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI1Njg2OjE6ICggKCAoIHJ1bGVGZWF0dXJlQ2FsbElEICkgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNTY4NzoyOiAoICggcnVsZUZlYXR1cmVDYWxsSUQgKSApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNDA4MToyOiAoICggcnVsZUZlYXR1cmVDYWxsSUQgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNDA4MjozOiAoIHJ1bGVGZWF0dXJlQ2FsbElEICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI1Njg3OjI6ICggKCBydWxlRmVhdHVyZUNhbGxJRCApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI1Njg4OjM6ICggcnVsZUZlYXR1cmVDYWxsSUQgKQogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYTWVtYmVyRmVhdHVyZUNhbGxBY2Nlc3MoKS5nZXRGZWF0dXJlSnZtSWRlbnRpZmlhYmxlRWxlbWVudENyb3NzUmVmZXJlbmNlXzFfMF8wXzBfMl8wKCkpOyAKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI0MDgzOjM6ICggcnVsZUZlYXR1cmVDYWxsSUQgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjQwODQ6NDogcnVsZUZlYXR1cmVDYWxsSUQKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI1Njg5OjM6ICggcnVsZUZlYXR1cmVDYWxsSUQgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjU2OTA6NDogcnVsZUZlYXR1cmVDYWxsSUQKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WE1lbWJlckZlYXR1cmVDYWxsQWNjZXNzKCkuZ2V0RmVhdHVyZUp2bUlkZW50aWZpYWJsZUVsZW1lbnRGZWF0dXJlQ2FsbElEUGFyc2VyUnVsZUNhbGxfMV8wXzBfMF8yXzBfMSgpKTsgCkBAIC03ODUwOSwxNyArODM3MzgsMTcgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX1ZhbHVlQXNzaWdubWVudF8xXzBfMSIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNDA5NToxOiBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX1ZhbHVlQXNzaWdubWVudF8xXzBfMSA6ICggcnVsZVhBc3NpZ25tZW50ICkgOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI1NzAxOjE6IHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fVmFsdWVBc3NpZ25tZW50XzFfMF8xIDogKCBydWxlWEFzc2lnbm1lbnQgKSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19WYWx1ZUFzc2lnbm1lbnRfMV8wXzEoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjQwOTk6MTogKCAoIHJ1bGVYQXNzaWdubWVudCApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI0MTAwOjI6ICggcnVsZVhBc3NpZ25tZW50ICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI1NzA1OjE6ICggKCBydWxlWEFzc2lnbm1lbnQgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNTcwNjoyOiAoIHJ1bGVYQXNzaWdubWVudCApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNDEwMDoyOiAoIHJ1bGVYQXNzaWdubWVudCApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNDEwMTozOiBydWxlWEFzc2lnbm1lbnQKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI1NzA2OjI6ICggcnVsZVhBc3NpZ25tZW50ICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI1NzA3OjM6IHJ1bGVYQXNzaWdubWVudAogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYTWVtYmVyRmVhdHVyZUNhbGxBY2Nlc3MoKS5nZXRWYWx1ZVhBc3NpZ25tZW50UGFyc2VyUnVsZUNhbGxfMV8wXzFfMCgpKTsgCkBAIC03ODU1NCwyOCArODM3ODMsMjggQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX051bGxTYWZlQXNzaWdubWVudF8xXzFfMF8wXzFfMSIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNDExMDoxOiBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX051bGxTYWZlQXNzaWdubWVudF8xXzFfMF8wXzFfMSA6ICggKCAnPy4nICkgKSA7CisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjU3MTY6MTogcnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19OdWxsU2FmZUFzc2lnbm1lbnRfMV8xXzBfMF8xXzEgOiAoICggJz8uJyApICkgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fTnVsbFNhZmVBc3NpZ25tZW50XzFfMV8wXzBfMV8xKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI0MTE0OjE6ICggKCAoICc/LicgKSApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI0MTE1OjI6ICggKCAnPy4nICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjU3MjA6MTogKCAoICggJz8uJyApICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjU3MjE6MjogKCAoICc/LicgKSApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNDExNToyOiAoICggJz8uJyApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI0MTE2OjM6ICggJz8uJyApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNTcyMToyOiAoICggJz8uJyApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI1NzIyOjM6ICggJz8uJyApCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhNZW1iZXJGZWF0dXJlQ2FsbEFjY2VzcygpLmdldE51bGxTYWZlUXVlc3Rpb25NYXJrRnVsbFN0b3BLZXl3b3JkXzFfMV8wXzBfMV8xXzAoKSk7IAogICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjQxMTc6MzogKCAnPy4nICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI0MTE4OjQ6ICc/LicKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI1NzIzOjM6ICggJz8uJyApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNTcyNDo0OiAnPy4nCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhNZW1iZXJGZWF0dXJlQ2FsbEFjY2VzcygpLmdldE51bGxTYWZlUXVlc3Rpb25NYXJrRnVsbFN0b3BLZXl3b3JkXzFfMV8wXzBfMV8xXzAoKSk7IAogICAgICAgICAgICAgfQotICAgICAgICAgICAgbWF0Y2goaW5wdXQsMTUxLEZPTExPV18yKTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKKyAgICAgICAgICAgIG1hdGNoKGlucHV0LDE2MyxGT0xMT1dfMik7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0WE1lbWJlckZlYXR1cmVDYWxsQWNjZXNzKCkuZ2V0TnVsbFNhZmVRdWVzdGlvbk1hcmtGdWxsU3RvcEtleXdvcmRfMV8xXzBfMF8xXzFfMCgpKTsgCiAgICAgICAgICAgICB9CkBAIC03ODYwNywyOCArODM4MzYsMjggQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX0V4cGxpY2l0U3RhdGljQXNzaWdubWVudF8xXzFfMF8wXzFfMiIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNDEyOToxOiBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX0V4cGxpY2l0U3RhdGljQXNzaWdubWVudF8xXzFfMF8wXzFfMiA6ICggKCAnOjonICkgKSA7CisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjU3MzU6MTogcnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19FeHBsaWNpdFN0YXRpY0Fzc2lnbm1lbnRfMV8xXzBfMF8xXzIgOiAoICggJzo6JyApICkgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fRXhwbGljaXRTdGF0aWNBc3NpZ25tZW50XzFfMV8wXzBfMV8yKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI0MTMzOjE6ICggKCAoICc6OicgKSApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI0MTM0OjI6ICggKCAnOjonICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjU3Mzk6MTogKCAoICggJzo6JyApICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjU3NDA6MjogKCAoICc6OicgKSApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNDEzNDoyOiAoICggJzo6JyApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI0MTM1OjM6ICggJzo6JyApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNTc0MDoyOiAoICggJzo6JyApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI1NzQxOjM6ICggJzo6JyApCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhNZW1iZXJGZWF0dXJlQ2FsbEFjY2VzcygpLmdldEV4cGxpY2l0U3RhdGljQ29sb25Db2xvbktleXdvcmRfMV8xXzBfMF8xXzJfMCgpKTsgCiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNDEzNjozOiAoICc6OicgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjQxMzc6NDogJzo6JworICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjU3NDI6MzogKCAnOjonICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI1NzQzOjQ6ICc6OicKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WE1lbWJlckZlYXR1cmVDYWxsQWNjZXNzKCkuZ2V0RXhwbGljaXRTdGF0aWNDb2xvbkNvbG9uS2V5d29yZF8xXzFfMF8wXzFfMl8wKCkpOyAKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1hdGNoKGlucHV0LDE1MCxGT0xMT1dfMik7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CisgICAgICAgICAgICBtYXRjaChpbnB1dCwxNjIsRk9MTE9XXzIpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOwogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBhZnRlcihncmFtbWFyQWNjZXNzLmdldFhNZW1iZXJGZWF0dXJlQ2FsbEFjY2VzcygpLmdldEV4cGxpY2l0U3RhdGljQ29sb25Db2xvbktleXdvcmRfMV8xXzBfMF8xXzJfMCgpKTsgCiAgICAgICAgICAgICB9CkBAIC03ODY2MCwxNyArODM4ODksMTcgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX1R5cGVBcmd1bWVudHNBc3NpZ25tZW50XzFfMV8xXzEiCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjQxNDg6MTogcnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19UeXBlQXJndW1lbnRzQXNzaWdubWVudF8xXzFfMV8xIDogKCBydWxlSnZtQXJndW1lbnRUeXBlUmVmZXJlbmNlICkgOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI1NzU0OjE6IHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fVHlwZUFyZ3VtZW50c0Fzc2lnbm1lbnRfMV8xXzFfMSA6ICggcnVsZUp2bUFyZ3VtZW50VHlwZVJlZmVyZW5jZSApIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX1R5cGVBcmd1bWVudHNBc3NpZ25tZW50XzFfMV8xXzEoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjQxNTI6MTogKCAoIHJ1bGVKdm1Bcmd1bWVudFR5cGVSZWZlcmVuY2UgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNDE1MzoyOiAoIHJ1bGVKdm1Bcmd1bWVudFR5cGVSZWZlcmVuY2UgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjU3NTg6MTogKCAoIHJ1bGVKdm1Bcmd1bWVudFR5cGVSZWZlcmVuY2UgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNTc1OToyOiAoIHJ1bGVKdm1Bcmd1bWVudFR5cGVSZWZlcmVuY2UgKQogICAgICAgICAgICAgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjQxNTM6MjogKCBydWxlSnZtQXJndW1lbnRUeXBlUmVmZXJlbmNlICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI0MTU0OjM6IHJ1bGVKdm1Bcmd1bWVudFR5cGVSZWZlcmVuY2UKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI1NzU5OjI6ICggcnVsZUp2bUFyZ3VtZW50VHlwZVJlZmVyZW5jZSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNTc2MDozOiBydWxlSnZtQXJndW1lbnRUeXBlUmVmZXJlbmNlCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhNZW1iZXJGZWF0dXJlQ2FsbEFjY2VzcygpLmdldFR5cGVBcmd1bWVudHNKdm1Bcmd1bWVudFR5cGVSZWZlcmVuY2VQYXJzZXJSdWxlQ2FsbF8xXzFfMV8xXzAoKSk7IApAQCAtNzg3MDUsMTcgKzgzOTM0LDE3IEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19UeXBlQXJndW1lbnRzQXNzaWdubWVudF8xXzFfMV8yXzEiCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjQxNjM6MTogcnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19UeXBlQXJndW1lbnRzQXNzaWdubWVudF8xXzFfMV8yXzEgOiAoIHJ1bGVKdm1Bcmd1bWVudFR5cGVSZWZlcmVuY2UgKSA7CisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjU3Njk6MTogcnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19UeXBlQXJndW1lbnRzQXNzaWdubWVudF8xXzFfMV8yXzEgOiAoIHJ1bGVKdm1Bcmd1bWVudFR5cGVSZWZlcmVuY2UgKSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19UeXBlQXJndW1lbnRzQXNzaWdubWVudF8xXzFfMV8yXzEoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjQxNjc6MTogKCAoIHJ1bGVKdm1Bcmd1bWVudFR5cGVSZWZlcmVuY2UgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNDE2ODoyOiAoIHJ1bGVKdm1Bcmd1bWVudFR5cGVSZWZlcmVuY2UgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjU3NzM6MTogKCAoIHJ1bGVKdm1Bcmd1bWVudFR5cGVSZWZlcmVuY2UgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNTc3NDoyOiAoIHJ1bGVKdm1Bcmd1bWVudFR5cGVSZWZlcmVuY2UgKQogICAgICAgICAgICAgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjQxNjg6MjogKCBydWxlSnZtQXJndW1lbnRUeXBlUmVmZXJlbmNlICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI0MTY5OjM6IHJ1bGVKdm1Bcmd1bWVudFR5cGVSZWZlcmVuY2UKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI1Nzc0OjI6ICggcnVsZUp2bUFyZ3VtZW50VHlwZVJlZmVyZW5jZSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNTc3NTozOiBydWxlSnZtQXJndW1lbnRUeXBlUmVmZXJlbmNlCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhNZW1iZXJGZWF0dXJlQ2FsbEFjY2VzcygpLmdldFR5cGVBcmd1bWVudHNKdm1Bcmd1bWVudFR5cGVSZWZlcmVuY2VQYXJzZXJSdWxlQ2FsbF8xXzFfMV8yXzFfMCgpKTsgCkBAIC03ODc1MCwyMyArODM5NzksMjMgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX0ZlYXR1cmVBc3NpZ25tZW50XzFfMV8yIgotICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI0MTc4OjE6IHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fRmVhdHVyZUFzc2lnbm1lbnRfMV8xXzIgOiAoICggcnVsZUlkT3JTdXBlciApICkgOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI1Nzg0OjE6IHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fRmVhdHVyZUFzc2lnbm1lbnRfMV8xXzIgOiAoICggcnVsZUlkT3JTdXBlciApICkgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fRmVhdHVyZUFzc2lnbm1lbnRfMV8xXzIoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjQxODI6MTogKCAoICggcnVsZUlkT3JTdXBlciApICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjQxODM6MjogKCAoIHJ1bGVJZE9yU3VwZXIgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNTc4ODoxOiAoICggKCBydWxlSWRPclN1cGVyICkgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNTc4OToyOiAoICggcnVsZUlkT3JTdXBlciApICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI0MTgzOjI6ICggKCBydWxlSWRPclN1cGVyICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjQxODQ6MzogKCBydWxlSWRPclN1cGVyICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI1Nzg5OjI6ICggKCBydWxlSWRPclN1cGVyICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjU3OTA6MzogKCBydWxlSWRPclN1cGVyICkKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WE1lbWJlckZlYXR1cmVDYWxsQWNjZXNzKCkuZ2V0RmVhdHVyZUp2bUlkZW50aWZpYWJsZUVsZW1lbnRDcm9zc1JlZmVyZW5jZV8xXzFfMl8wKCkpOyAKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI0MTg1OjM6ICggcnVsZUlkT3JTdXBlciApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNDE4Njo0OiBydWxlSWRPclN1cGVyCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNTc5MTozOiAoIHJ1bGVJZE9yU3VwZXIgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjU3OTI6NDogcnVsZUlkT3JTdXBlcgogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYTWVtYmVyRmVhdHVyZUNhbGxBY2Nlc3MoKS5nZXRGZWF0dXJlSnZtSWRlbnRpZmlhYmxlRWxlbWVudElkT3JTdXBlclBhcnNlclJ1bGVDYWxsXzFfMV8yXzBfMSgpKTsgCkBAIC03ODgwNywyOCArODQwMzYsMjggQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX0V4cGxpY2l0T3BlcmF0aW9uQ2FsbEFzc2lnbm1lbnRfMV8xXzNfMCIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNDE5NzoxOiBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX0V4cGxpY2l0T3BlcmF0aW9uQ2FsbEFzc2lnbm1lbnRfMV8xXzNfMCA6ICggKCAnKCcgKSApIDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNTgwMzoxOiBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX0V4cGxpY2l0T3BlcmF0aW9uQ2FsbEFzc2lnbm1lbnRfMV8xXzNfMCA6ICggKCAnKCcgKSApIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX0V4cGxpY2l0T3BlcmF0aW9uQ2FsbEFzc2lnbm1lbnRfMV8xXzNfMCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNDIwMToxOiAoICggKCAnKCcgKSApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI0MjAyOjI6ICggKCAnKCcgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNTgwNzoxOiAoICggKCAnKCcgKSApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI1ODA4OjI6ICggKCAnKCcgKSApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNDIwMjoyOiAoICggJygnICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjQyMDM6MzogKCAnKCcgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjU4MDg6MjogKCAoICcoJyApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI1ODA5OjM6ICggJygnICkKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WE1lbWJlckZlYXR1cmVDYWxsQWNjZXNzKCkuZ2V0RXhwbGljaXRPcGVyYXRpb25DYWxsTGVmdFBhcmVudGhlc2lzS2V5d29yZF8xXzFfM18wXzAoKSk7IAogICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjQyMDQ6MzogKCAnKCcgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjQyMDU6NDogJygnCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNTgxMDozOiAoICcoJyApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNTgxMTo0OiAnKCcKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WE1lbWJlckZlYXR1cmVDYWxsQWNjZXNzKCkuZ2V0RXhwbGljaXRPcGVyYXRpb25DYWxsTGVmdFBhcmVudGhlc2lzS2V5d29yZF8xXzFfM18wXzAoKSk7IAogICAgICAgICAgICAgfQotICAgICAgICAgICAgbWF0Y2goaW5wdXQsMTEzLEZPTExPV18yKTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKKyAgICAgICAgICAgIG1hdGNoKGlucHV0LDEyMyxGT0xMT1dfMik7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0WE1lbWJlckZlYXR1cmVDYWxsQWNjZXNzKCkuZ2V0RXhwbGljaXRPcGVyYXRpb25DYWxsTGVmdFBhcmVudGhlc2lzS2V5d29yZF8xXzFfM18wXzAoKSk7IAogICAgICAgICAgICAgfQpAQCAtNzg4NjAsMTcgKzg0MDg5LDE3IEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19NZW1iZXJDYWxsQXJndW1lbnRzQXNzaWdubWVudF8xXzFfM18xXzAiCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjQyMTY6MTogcnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19NZW1iZXJDYWxsQXJndW1lbnRzQXNzaWdubWVudF8xXzFfM18xXzAgOiAoIHJ1bGVYU2hvcnRDbG9zdXJlICkgOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI1ODIyOjE6IHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fTWVtYmVyQ2FsbEFyZ3VtZW50c0Fzc2lnbm1lbnRfMV8xXzNfMV8wIDogKCBydWxlWFNob3J0Q2xvc3VyZSApIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX01lbWJlckNhbGxBcmd1bWVudHNBc3NpZ25tZW50XzFfMV8zXzFfMCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNDIyMDoxOiAoICggcnVsZVhTaG9ydENsb3N1cmUgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNDIyMToyOiAoIHJ1bGVYU2hvcnRDbG9zdXJlICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI1ODI2OjE6ICggKCBydWxlWFNob3J0Q2xvc3VyZSApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI1ODI3OjI6ICggcnVsZVhTaG9ydENsb3N1cmUgKQogICAgICAgICAgICAgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjQyMjE6MjogKCBydWxlWFNob3J0Q2xvc3VyZSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNDIyMjozOiBydWxlWFNob3J0Q2xvc3VyZQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjU4Mjc6MjogKCBydWxlWFNob3J0Q2xvc3VyZSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNTgyODozOiBydWxlWFNob3J0Q2xvc3VyZQogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYTWVtYmVyRmVhdHVyZUNhbGxBY2Nlc3MoKS5nZXRNZW1iZXJDYWxsQXJndW1lbnRzWFNob3J0Q2xvc3VyZVBhcnNlclJ1bGVDYWxsXzFfMV8zXzFfMF8wKCkpOyAKQEAgLTc4OTA1LDE3ICs4NDEzNCwxNyBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fTWVtYmVyQ2FsbEFyZ3VtZW50c0Fzc2lnbm1lbnRfMV8xXzNfMV8xXzAiCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjQyMzE6MTogcnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19NZW1iZXJDYWxsQXJndW1lbnRzQXNzaWdubWVudF8xXzFfM18xXzFfMCA6ICggcnVsZVhFeHByZXNzaW9uICkgOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI1ODM3OjE6IHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fTWVtYmVyQ2FsbEFyZ3VtZW50c0Fzc2lnbm1lbnRfMV8xXzNfMV8xXzAgOiAoIHJ1bGVYRXhwcmVzc2lvbiApIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX01lbWJlckNhbGxBcmd1bWVudHNBc3NpZ25tZW50XzFfMV8zXzFfMV8wKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI0MjM1OjE6ICggKCBydWxlWEV4cHJlc3Npb24gKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNDIzNjoyOiAoIHJ1bGVYRXhwcmVzc2lvbiApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNTg0MToxOiAoICggcnVsZVhFeHByZXNzaW9uICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjU4NDI6MjogKCBydWxlWEV4cHJlc3Npb24gKQogICAgICAgICAgICAgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjQyMzY6MjogKCBydWxlWEV4cHJlc3Npb24gKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjQyMzc6MzogcnVsZVhFeHByZXNzaW9uCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNTg0MjoyOiAoIHJ1bGVYRXhwcmVzc2lvbiApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNTg0MzozOiBydWxlWEV4cHJlc3Npb24KICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WE1lbWJlckZlYXR1cmVDYWxsQWNjZXNzKCkuZ2V0TWVtYmVyQ2FsbEFyZ3VtZW50c1hFeHByZXNzaW9uUGFyc2VyUnVsZUNhbGxfMV8xXzNfMV8xXzBfMCgpKTsgCkBAIC03ODk1MCwxNyArODQxNzksMTcgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX01lbWJlckNhbGxBcmd1bWVudHNBc3NpZ25tZW50XzFfMV8zXzFfMV8xXzEiCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjQyNDY6MTogcnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19NZW1iZXJDYWxsQXJndW1lbnRzQXNzaWdubWVudF8xXzFfM18xXzFfMV8xIDogKCBydWxlWEV4cHJlc3Npb24gKSA7CisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjU4NTI6MTogcnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19NZW1iZXJDYWxsQXJndW1lbnRzQXNzaWdubWVudF8xXzFfM18xXzFfMV8xIDogKCBydWxlWEV4cHJlc3Npb24gKSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19NZW1iZXJDYWxsQXJndW1lbnRzQXNzaWdubWVudF8xXzFfM18xXzFfMV8xKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI0MjUwOjE6ICggKCBydWxlWEV4cHJlc3Npb24gKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNDI1MToyOiAoIHJ1bGVYRXhwcmVzc2lvbiApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNTg1NjoxOiAoICggcnVsZVhFeHByZXNzaW9uICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjU4NTc6MjogKCBydWxlWEV4cHJlc3Npb24gKQogICAgICAgICAgICAgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjQyNTE6MjogKCBydWxlWEV4cHJlc3Npb24gKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjQyNTI6MzogcnVsZVhFeHByZXNzaW9uCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNTg1NzoyOiAoIHJ1bGVYRXhwcmVzc2lvbiApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNTg1ODozOiBydWxlWEV4cHJlc3Npb24KICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WE1lbWJlckZlYXR1cmVDYWxsQWNjZXNzKCkuZ2V0TWVtYmVyQ2FsbEFyZ3VtZW50c1hFeHByZXNzaW9uUGFyc2VyUnVsZUNhbGxfMV8xXzNfMV8xXzFfMV8wKCkpOyAKQEAgLTc4OTk1LDE3ICs4NDIyNCwxNyBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fTWVtYmVyQ2FsbEFyZ3VtZW50c0Fzc2lnbm1lbnRfMV8xXzQiCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjQyNjE6MTogcnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19NZW1iZXJDYWxsQXJndW1lbnRzQXNzaWdubWVudF8xXzFfNCA6ICggcnVsZVhDbG9zdXJlICkgOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI1ODY3OjE6IHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fTWVtYmVyQ2FsbEFyZ3VtZW50c0Fzc2lnbm1lbnRfMV8xXzQgOiAoIHJ1bGVYQ2xvc3VyZSApIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX01lbWJlckNhbGxBcmd1bWVudHNBc3NpZ25tZW50XzFfMV80KCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI0MjY1OjE6ICggKCBydWxlWENsb3N1cmUgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNDI2NjoyOiAoIHJ1bGVYQ2xvc3VyZSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNTg3MToxOiAoICggcnVsZVhDbG9zdXJlICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjU4NzI6MjogKCBydWxlWENsb3N1cmUgKQogICAgICAgICAgICAgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjQyNjY6MjogKCBydWxlWENsb3N1cmUgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjQyNjc6MzogcnVsZVhDbG9zdXJlCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNTg3MjoyOiAoIHJ1bGVYQ2xvc3VyZSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNTg3MzozOiBydWxlWENsb3N1cmUKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WE1lbWJlckZlYXR1cmVDYWxsQWNjZXNzKCkuZ2V0TWVtYmVyQ2FsbEFyZ3VtZW50c1hDbG9zdXJlUGFyc2VyUnVsZUNhbGxfMV8xXzRfMCgpKTsgCkBAIC03OTA0MCwxNyArODQyNjksMTcgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YU2V0TGl0ZXJhbF9fRWxlbWVudHNBc3NpZ25tZW50XzNfMCIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNDI3NjoxOiBydWxlX19YU2V0TGl0ZXJhbF9fRWxlbWVudHNBc3NpZ25tZW50XzNfMCA6ICggcnVsZVhFeHByZXNzaW9uICkgOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI1ODgyOjE6IHJ1bGVfX1hTZXRMaXRlcmFsX19FbGVtZW50c0Fzc2lnbm1lbnRfM18wIDogKCBydWxlWEV4cHJlc3Npb24gKSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fWFNldExpdGVyYWxfX0VsZW1lbnRzQXNzaWdubWVudF8zXzAoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjQyODA6MTogKCAoIHJ1bGVYRXhwcmVzc2lvbiApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI0MjgxOjI6ICggcnVsZVhFeHByZXNzaW9uICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI1ODg2OjE6ICggKCBydWxlWEV4cHJlc3Npb24gKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNTg4NzoyOiAoIHJ1bGVYRXhwcmVzc2lvbiApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNDI4MToyOiAoIHJ1bGVYRXhwcmVzc2lvbiApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNDI4MjozOiBydWxlWEV4cHJlc3Npb24KKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI1ODg3OjI6ICggcnVsZVhFeHByZXNzaW9uICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI1ODg4OjM6IHJ1bGVYRXhwcmVzc2lvbgogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYU2V0TGl0ZXJhbEFjY2VzcygpLmdldEVsZW1lbnRzWEV4cHJlc3Npb25QYXJzZXJSdWxlQ2FsbF8zXzBfMCgpKTsgCkBAIC03OTA4NSwxNyArODQzMTQsMTcgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YU2V0TGl0ZXJhbF9fRWxlbWVudHNBc3NpZ25tZW50XzNfMV8xIgotICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI0MjkxOjE6IHJ1bGVfX1hTZXRMaXRlcmFsX19FbGVtZW50c0Fzc2lnbm1lbnRfM18xXzEgOiAoIHJ1bGVYRXhwcmVzc2lvbiApIDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNTg5NzoxOiBydWxlX19YU2V0TGl0ZXJhbF9fRWxlbWVudHNBc3NpZ25tZW50XzNfMV8xIDogKCBydWxlWEV4cHJlc3Npb24gKSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fWFNldExpdGVyYWxfX0VsZW1lbnRzQXNzaWdubWVudF8zXzFfMSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNDI5NToxOiAoICggcnVsZVhFeHByZXNzaW9uICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjQyOTY6MjogKCBydWxlWEV4cHJlc3Npb24gKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjU5MDE6MTogKCAoIHJ1bGVYRXhwcmVzc2lvbiApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI1OTAyOjI6ICggcnVsZVhFeHByZXNzaW9uICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI0Mjk2OjI6ICggcnVsZVhFeHByZXNzaW9uICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI0Mjk3OjM6IHJ1bGVYRXhwcmVzc2lvbgorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjU5MDI6MjogKCBydWxlWEV4cHJlc3Npb24gKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjU5MDM6MzogcnVsZVhFeHByZXNzaW9uCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhTZXRMaXRlcmFsQWNjZXNzKCkuZ2V0RWxlbWVudHNYRXhwcmVzc2lvblBhcnNlclJ1bGVDYWxsXzNfMV8xXzAoKSk7IApAQCAtNzkxMzAsMTcgKzg0MzU5LDE3IEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fWExpc3RMaXRlcmFsX19FbGVtZW50c0Fzc2lnbm1lbnRfM18wIgotICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI0MzA2OjE6IHJ1bGVfX1hMaXN0TGl0ZXJhbF9fRWxlbWVudHNBc3NpZ25tZW50XzNfMCA6ICggcnVsZVhFeHByZXNzaW9uICkgOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI1OTEyOjE6IHJ1bGVfX1hMaXN0TGl0ZXJhbF9fRWxlbWVudHNBc3NpZ25tZW50XzNfMCA6ICggcnVsZVhFeHByZXNzaW9uICkgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1hMaXN0TGl0ZXJhbF9fRWxlbWVudHNBc3NpZ25tZW50XzNfMCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNDMxMDoxOiAoICggcnVsZVhFeHByZXNzaW9uICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjQzMTE6MjogKCBydWxlWEV4cHJlc3Npb24gKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjU5MTY6MTogKCAoIHJ1bGVYRXhwcmVzc2lvbiApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI1OTE3OjI6ICggcnVsZVhFeHByZXNzaW9uICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI0MzExOjI6ICggcnVsZVhFeHByZXNzaW9uICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI0MzEyOjM6IHJ1bGVYRXhwcmVzc2lvbgorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjU5MTc6MjogKCBydWxlWEV4cHJlc3Npb24gKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjU5MTg6MzogcnVsZVhFeHByZXNzaW9uCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhMaXN0TGl0ZXJhbEFjY2VzcygpLmdldEVsZW1lbnRzWEV4cHJlc3Npb25QYXJzZXJSdWxlQ2FsbF8zXzBfMCgpKTsgCkBAIC03OTE3NSwxNyArODQ0MDQsMTcgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YTGlzdExpdGVyYWxfX0VsZW1lbnRzQXNzaWdubWVudF8zXzFfMSIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNDMyMToxOiBydWxlX19YTGlzdExpdGVyYWxfX0VsZW1lbnRzQXNzaWdubWVudF8zXzFfMSA6ICggcnVsZVhFeHByZXNzaW9uICkgOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI1OTI3OjE6IHJ1bGVfX1hMaXN0TGl0ZXJhbF9fRWxlbWVudHNBc3NpZ25tZW50XzNfMV8xIDogKCBydWxlWEV4cHJlc3Npb24gKSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fWExpc3RMaXRlcmFsX19FbGVtZW50c0Fzc2lnbm1lbnRfM18xXzEoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjQzMjU6MTogKCAoIHJ1bGVYRXhwcmVzc2lvbiApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI0MzI2OjI6ICggcnVsZVhFeHByZXNzaW9uICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI1OTMxOjE6ICggKCBydWxlWEV4cHJlc3Npb24gKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNTkzMjoyOiAoIHJ1bGVYRXhwcmVzc2lvbiApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNDMyNjoyOiAoIHJ1bGVYRXhwcmVzc2lvbiApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNDMyNzozOiBydWxlWEV4cHJlc3Npb24KKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI1OTMyOjI6ICggcnVsZVhFeHByZXNzaW9uICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI1OTMzOjM6IHJ1bGVYRXhwcmVzc2lvbgogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYTGlzdExpdGVyYWxBY2Nlc3MoKS5nZXRFbGVtZW50c1hFeHByZXNzaW9uUGFyc2VyUnVsZUNhbGxfM18xXzFfMCgpKTsgCkBAIC03OTIyMCwxNyArODQ0NDksMTcgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YQ2xvc3VyZV9fRGVjbGFyZWRGb3JtYWxQYXJhbWV0ZXJzQXNzaWdubWVudF8xXzBfMF8wIgotICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI0MzM2OjE6IHJ1bGVfX1hDbG9zdXJlX19EZWNsYXJlZEZvcm1hbFBhcmFtZXRlcnNBc3NpZ25tZW50XzFfMF8wXzAgOiAoIHJ1bGVKdm1Gb3JtYWxQYXJhbWV0ZXIgKSA7CisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjU5NDI6MTogcnVsZV9fWENsb3N1cmVfX0RlY2xhcmVkRm9ybWFsUGFyYW1ldGVyc0Fzc2lnbm1lbnRfMV8wXzBfMCA6ICggcnVsZUp2bUZvcm1hbFBhcmFtZXRlciApIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YQ2xvc3VyZV9fRGVjbGFyZWRGb3JtYWxQYXJhbWV0ZXJzQXNzaWdubWVudF8xXzBfMF8wKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI0MzQwOjE6ICggKCBydWxlSnZtRm9ybWFsUGFyYW1ldGVyICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjQzNDE6MjogKCBydWxlSnZtRm9ybWFsUGFyYW1ldGVyICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI1OTQ2OjE6ICggKCBydWxlSnZtRm9ybWFsUGFyYW1ldGVyICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjU5NDc6MjogKCBydWxlSnZtRm9ybWFsUGFyYW1ldGVyICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI0MzQxOjI6ICggcnVsZUp2bUZvcm1hbFBhcmFtZXRlciApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNDM0MjozOiBydWxlSnZtRm9ybWFsUGFyYW1ldGVyCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNTk0NzoyOiAoIHJ1bGVKdm1Gb3JtYWxQYXJhbWV0ZXIgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjU5NDg6MzogcnVsZUp2bUZvcm1hbFBhcmFtZXRlcgogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYQ2xvc3VyZUFjY2VzcygpLmdldERlY2xhcmVkRm9ybWFsUGFyYW1ldGVyc0p2bUZvcm1hbFBhcmFtZXRlclBhcnNlclJ1bGVDYWxsXzFfMF8wXzBfMCgpKTsgCkBAIC03OTI2NSwxNyArODQ0OTQsMTcgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YQ2xvc3VyZV9fRGVjbGFyZWRGb3JtYWxQYXJhbWV0ZXJzQXNzaWdubWVudF8xXzBfMF8xXzEiCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjQzNTE6MTogcnVsZV9fWENsb3N1cmVfX0RlY2xhcmVkRm9ybWFsUGFyYW1ldGVyc0Fzc2lnbm1lbnRfMV8wXzBfMV8xIDogKCBydWxlSnZtRm9ybWFsUGFyYW1ldGVyICkgOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI1OTU3OjE6IHJ1bGVfX1hDbG9zdXJlX19EZWNsYXJlZEZvcm1hbFBhcmFtZXRlcnNBc3NpZ25tZW50XzFfMF8wXzFfMSA6ICggcnVsZUp2bUZvcm1hbFBhcmFtZXRlciApIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YQ2xvc3VyZV9fRGVjbGFyZWRGb3JtYWxQYXJhbWV0ZXJzQXNzaWdubWVudF8xXzBfMF8xXzEoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjQzNTU6MTogKCAoIHJ1bGVKdm1Gb3JtYWxQYXJhbWV0ZXIgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNDM1NjoyOiAoIHJ1bGVKdm1Gb3JtYWxQYXJhbWV0ZXIgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjU5NjE6MTogKCAoIHJ1bGVKdm1Gb3JtYWxQYXJhbWV0ZXIgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNTk2MjoyOiAoIHJ1bGVKdm1Gb3JtYWxQYXJhbWV0ZXIgKQogICAgICAgICAgICAgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjQzNTY6MjogKCBydWxlSnZtRm9ybWFsUGFyYW1ldGVyICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI0MzU3OjM6IHJ1bGVKdm1Gb3JtYWxQYXJhbWV0ZXIKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI1OTYyOjI6ICggcnVsZUp2bUZvcm1hbFBhcmFtZXRlciApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNTk2MzozOiBydWxlSnZtRm9ybWFsUGFyYW1ldGVyCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhDbG9zdXJlQWNjZXNzKCkuZ2V0RGVjbGFyZWRGb3JtYWxQYXJhbWV0ZXJzSnZtRm9ybWFsUGFyYW1ldGVyUGFyc2VyUnVsZUNhbGxfMV8wXzBfMV8xXzAoKSk7IApAQCAtNzkzMTAsMjggKzg0NTM5LDI4IEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fWENsb3N1cmVfX0V4cGxpY2l0U3ludGF4QXNzaWdubWVudF8xXzBfMSIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNDM2NjoxOiBydWxlX19YQ2xvc3VyZV9fRXhwbGljaXRTeW50YXhBc3NpZ25tZW50XzFfMF8xIDogKCAoICd8JyApICkgOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI1OTcyOjE6IHJ1bGVfX1hDbG9zdXJlX19FeHBsaWNpdFN5bnRheEFzc2lnbm1lbnRfMV8wXzEgOiAoICggJ3wnICkgKSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fWENsb3N1cmVfX0V4cGxpY2l0U3ludGF4QXNzaWdubWVudF8xXzBfMSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNDM3MDoxOiAoICggKCAnfCcgKSApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI0MzcxOjI6ICggKCAnfCcgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNTk3NjoxOiAoICggKCAnfCcgKSApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI1OTc3OjI6ICggKCAnfCcgKSApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNDM3MToyOiAoICggJ3wnICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjQzNzI6MzogKCAnfCcgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjU5Nzc6MjogKCAoICd8JyApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI1OTc4OjM6ICggJ3wnICkKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WENsb3N1cmVBY2Nlc3MoKS5nZXRFeHBsaWNpdFN5bnRheFZlcnRpY2FsTGluZUtleXdvcmRfMV8wXzFfMCgpKTsgCiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNDM3MzozOiAoICd8JyApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNDM3NDo0OiAnfCcKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI1OTc5OjM6ICggJ3wnICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI1OTgwOjQ6ICd8JwogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYQ2xvc3VyZUFjY2VzcygpLmdldEV4cGxpY2l0U3ludGF4VmVydGljYWxMaW5lS2V5d29yZF8xXzBfMV8wKCkpOyAKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1hdGNoKGlucHV0LDE1MixGT0xMT1dfMik7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CisgICAgICAgICAgICBtYXRjaChpbnB1dCwxNjQsRk9MTE9XXzIpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOwogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBhZnRlcihncmFtbWFyQWNjZXNzLmdldFhDbG9zdXJlQWNjZXNzKCkuZ2V0RXhwbGljaXRTeW50YXhWZXJ0aWNhbExpbmVLZXl3b3JkXzFfMF8xXzAoKSk7IAogICAgICAgICAgICAgfQpAQCAtNzkzNjMsMTcgKzg0NTkyLDE3IEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fWENsb3N1cmVfX0V4cHJlc3Npb25Bc3NpZ25tZW50XzIiCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjQzODU6MTogcnVsZV9fWENsb3N1cmVfX0V4cHJlc3Npb25Bc3NpZ25tZW50XzIgOiAoIHJ1bGVYRXhwcmVzc2lvbkluQ2xvc3VyZSApIDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNTk5MToxOiBydWxlX19YQ2xvc3VyZV9fRXhwcmVzc2lvbkFzc2lnbm1lbnRfMiA6ICggcnVsZVhFeHByZXNzaW9uSW5DbG9zdXJlICkgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1hDbG9zdXJlX19FeHByZXNzaW9uQXNzaWdubWVudF8yKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI0Mzg5OjE6ICggKCBydWxlWEV4cHJlc3Npb25JbkNsb3N1cmUgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNDM5MDoyOiAoIHJ1bGVYRXhwcmVzc2lvbkluQ2xvc3VyZSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNTk5NToxOiAoICggcnVsZVhFeHByZXNzaW9uSW5DbG9zdXJlICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjU5OTY6MjogKCBydWxlWEV4cHJlc3Npb25JbkNsb3N1cmUgKQogICAgICAgICAgICAgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjQzOTA6MjogKCBydWxlWEV4cHJlc3Npb25JbkNsb3N1cmUgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjQzOTE6MzogcnVsZVhFeHByZXNzaW9uSW5DbG9zdXJlCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNTk5NjoyOiAoIHJ1bGVYRXhwcmVzc2lvbkluQ2xvc3VyZSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNTk5NzozOiBydWxlWEV4cHJlc3Npb25JbkNsb3N1cmUKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WENsb3N1cmVBY2Nlc3MoKS5nZXRFeHByZXNzaW9uWEV4cHJlc3Npb25JbkNsb3N1cmVQYXJzZXJSdWxlQ2FsbF8yXzAoKSk7IApAQCAtNzk0MDgsMTcgKzg0NjM3LDE3IEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fWEV4cHJlc3Npb25JbkNsb3N1cmVfX0V4cHJlc3Npb25zQXNzaWdubWVudF8xXzAiCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjQ0MDA6MTogcnVsZV9fWEV4cHJlc3Npb25JbkNsb3N1cmVfX0V4cHJlc3Npb25zQXNzaWdubWVudF8xXzAgOiAoIHJ1bGVYRXhwcmVzc2lvbk9yVmFyRGVjbGFyYXRpb24gKSA7CisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjYwMDY6MTogcnVsZV9fWEV4cHJlc3Npb25JbkNsb3N1cmVfX0V4cHJlc3Npb25zQXNzaWdubWVudF8xXzAgOiAoIHJ1bGVYRXhwcmVzc2lvbk9yVmFyRGVjbGFyYXRpb24gKSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fWEV4cHJlc3Npb25JbkNsb3N1cmVfX0V4cHJlc3Npb25zQXNzaWdubWVudF8xXzAoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjQ0MDQ6MTogKCAoIHJ1bGVYRXhwcmVzc2lvbk9yVmFyRGVjbGFyYXRpb24gKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNDQwNToyOiAoIHJ1bGVYRXhwcmVzc2lvbk9yVmFyRGVjbGFyYXRpb24gKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjYwMTA6MTogKCAoIHJ1bGVYRXhwcmVzc2lvbk9yVmFyRGVjbGFyYXRpb24gKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNjAxMToyOiAoIHJ1bGVYRXhwcmVzc2lvbk9yVmFyRGVjbGFyYXRpb24gKQogICAgICAgICAgICAgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjQ0MDU6MjogKCBydWxlWEV4cHJlc3Npb25PclZhckRlY2xhcmF0aW9uICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI0NDA2OjM6IHJ1bGVYRXhwcmVzc2lvbk9yVmFyRGVjbGFyYXRpb24KKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI2MDExOjI6ICggcnVsZVhFeHByZXNzaW9uT3JWYXJEZWNsYXJhdGlvbiApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNjAxMjozOiBydWxlWEV4cHJlc3Npb25PclZhckRlY2xhcmF0aW9uCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhFeHByZXNzaW9uSW5DbG9zdXJlQWNjZXNzKCkuZ2V0RXhwcmVzc2lvbnNYRXhwcmVzc2lvbk9yVmFyRGVjbGFyYXRpb25QYXJzZXJSdWxlQ2FsbF8xXzBfMCgpKTsgCkBAIC03OTQ1MywxNyArODQ2ODIsMTcgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YU2hvcnRDbG9zdXJlX19EZWNsYXJlZEZvcm1hbFBhcmFtZXRlcnNBc3NpZ25tZW50XzBfMF8xXzAiCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjQ0MTU6MTogcnVsZV9fWFNob3J0Q2xvc3VyZV9fRGVjbGFyZWRGb3JtYWxQYXJhbWV0ZXJzQXNzaWdubWVudF8wXzBfMV8wIDogKCBydWxlSnZtRm9ybWFsUGFyYW1ldGVyICkgOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI2MDIxOjE6IHJ1bGVfX1hTaG9ydENsb3N1cmVfX0RlY2xhcmVkRm9ybWFsUGFyYW1ldGVyc0Fzc2lnbm1lbnRfMF8wXzFfMCA6ICggcnVsZUp2bUZvcm1hbFBhcmFtZXRlciApIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YU2hvcnRDbG9zdXJlX19EZWNsYXJlZEZvcm1hbFBhcmFtZXRlcnNBc3NpZ25tZW50XzBfMF8xXzAoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjQ0MTk6MTogKCAoIHJ1bGVKdm1Gb3JtYWxQYXJhbWV0ZXIgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNDQyMDoyOiAoIHJ1bGVKdm1Gb3JtYWxQYXJhbWV0ZXIgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjYwMjU6MTogKCAoIHJ1bGVKdm1Gb3JtYWxQYXJhbWV0ZXIgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNjAyNjoyOiAoIHJ1bGVKdm1Gb3JtYWxQYXJhbWV0ZXIgKQogICAgICAgICAgICAgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjQ0MjA6MjogKCBydWxlSnZtRm9ybWFsUGFyYW1ldGVyICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI0NDIxOjM6IHJ1bGVKdm1Gb3JtYWxQYXJhbWV0ZXIKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI2MDI2OjI6ICggcnVsZUp2bUZvcm1hbFBhcmFtZXRlciApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNjAyNzozOiBydWxlSnZtRm9ybWFsUGFyYW1ldGVyCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhTaG9ydENsb3N1cmVBY2Nlc3MoKS5nZXREZWNsYXJlZEZvcm1hbFBhcmFtZXRlcnNKdm1Gb3JtYWxQYXJhbWV0ZXJQYXJzZXJSdWxlQ2FsbF8wXzBfMV8wXzAoKSk7IApAQCAtNzk0OTgsMTcgKzg0NzI3LDE3IEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fWFNob3J0Q2xvc3VyZV9fRGVjbGFyZWRGb3JtYWxQYXJhbWV0ZXJzQXNzaWdubWVudF8wXzBfMV8xXzEiCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjQ0MzA6MTogcnVsZV9fWFNob3J0Q2xvc3VyZV9fRGVjbGFyZWRGb3JtYWxQYXJhbWV0ZXJzQXNzaWdubWVudF8wXzBfMV8xXzEgOiAoIHJ1bGVKdm1Gb3JtYWxQYXJhbWV0ZXIgKSA7CisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjYwMzY6MTogcnVsZV9fWFNob3J0Q2xvc3VyZV9fRGVjbGFyZWRGb3JtYWxQYXJhbWV0ZXJzQXNzaWdubWVudF8wXzBfMV8xXzEgOiAoIHJ1bGVKdm1Gb3JtYWxQYXJhbWV0ZXIgKSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fWFNob3J0Q2xvc3VyZV9fRGVjbGFyZWRGb3JtYWxQYXJhbWV0ZXJzQXNzaWdubWVudF8wXzBfMV8xXzEoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjQ0MzQ6MTogKCAoIHJ1bGVKdm1Gb3JtYWxQYXJhbWV0ZXIgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNDQzNToyOiAoIHJ1bGVKdm1Gb3JtYWxQYXJhbWV0ZXIgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjYwNDA6MTogKCAoIHJ1bGVKdm1Gb3JtYWxQYXJhbWV0ZXIgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNjA0MToyOiAoIHJ1bGVKdm1Gb3JtYWxQYXJhbWV0ZXIgKQogICAgICAgICAgICAgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjQ0MzU6MjogKCBydWxlSnZtRm9ybWFsUGFyYW1ldGVyICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI0NDM2OjM6IHJ1bGVKdm1Gb3JtYWxQYXJhbWV0ZXIKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI2MDQxOjI6ICggcnVsZUp2bUZvcm1hbFBhcmFtZXRlciApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNjA0MjozOiBydWxlSnZtRm9ybWFsUGFyYW1ldGVyCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhTaG9ydENsb3N1cmVBY2Nlc3MoKS5nZXREZWNsYXJlZEZvcm1hbFBhcmFtZXRlcnNKdm1Gb3JtYWxQYXJhbWV0ZXJQYXJzZXJSdWxlQ2FsbF8wXzBfMV8xXzFfMCgpKTsgCkBAIC03OTU0MywyOCArODQ3NzIsMjggQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YU2hvcnRDbG9zdXJlX19FeHBsaWNpdFN5bnRheEFzc2lnbm1lbnRfMF8wXzIiCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjQ0NDU6MTogcnVsZV9fWFNob3J0Q2xvc3VyZV9fRXhwbGljaXRTeW50YXhBc3NpZ25tZW50XzBfMF8yIDogKCAoICd8JyApICkgOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI2MDUxOjE6IHJ1bGVfX1hTaG9ydENsb3N1cmVfX0V4cGxpY2l0U3ludGF4QXNzaWdubWVudF8wXzBfMiA6ICggKCAnfCcgKSApIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YU2hvcnRDbG9zdXJlX19FeHBsaWNpdFN5bnRheEFzc2lnbm1lbnRfMF8wXzIoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjQ0NDk6MTogKCAoICggJ3wnICkgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNDQ1MDoyOiAoICggJ3wnICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjYwNTU6MTogKCAoICggJ3wnICkgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNjA1NjoyOiAoICggJ3wnICkgKQogICAgICAgICAgICAgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjQ0NTA6MjogKCAoICd8JyApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI0NDUxOjM6ICggJ3wnICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI2MDU2OjI6ICggKCAnfCcgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNjA1NzozOiAoICd8JyApCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhTaG9ydENsb3N1cmVBY2Nlc3MoKS5nZXRFeHBsaWNpdFN5bnRheFZlcnRpY2FsTGluZUtleXdvcmRfMF8wXzJfMCgpKTsgCiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNDQ1MjozOiAoICd8JyApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNDQ1Mzo0OiAnfCcKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI2MDU4OjM6ICggJ3wnICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI2MDU5OjQ6ICd8JwogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYU2hvcnRDbG9zdXJlQWNjZXNzKCkuZ2V0RXhwbGljaXRTeW50YXhWZXJ0aWNhbExpbmVLZXl3b3JkXzBfMF8yXzAoKSk7IAogICAgICAgICAgICAgfQotICAgICAgICAgICAgbWF0Y2goaW5wdXQsMTUyLEZPTExPV18yKTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKKyAgICAgICAgICAgIG1hdGNoKGlucHV0LDE2NCxGT0xMT1dfMik7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0WFNob3J0Q2xvc3VyZUFjY2VzcygpLmdldEV4cGxpY2l0U3ludGF4VmVydGljYWxMaW5lS2V5d29yZF8wXzBfMl8wKCkpOyAKICAgICAgICAgICAgIH0KQEAgLTc5NTk2LDE3ICs4NDgyNSwxNyBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX1hTaG9ydENsb3N1cmVfX0V4cHJlc3Npb25Bc3NpZ25tZW50XzEiCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjQ0NjQ6MTogcnVsZV9fWFNob3J0Q2xvc3VyZV9fRXhwcmVzc2lvbkFzc2lnbm1lbnRfMSA6ICggcnVsZVhFeHByZXNzaW9uICkgOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI2MDcwOjE6IHJ1bGVfX1hTaG9ydENsb3N1cmVfX0V4cHJlc3Npb25Bc3NpZ25tZW50XzEgOiAoIHJ1bGVYRXhwcmVzc2lvbiApIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YU2hvcnRDbG9zdXJlX19FeHByZXNzaW9uQXNzaWdubWVudF8xKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI0NDY4OjE6ICggKCBydWxlWEV4cHJlc3Npb24gKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNDQ2OToyOiAoIHJ1bGVYRXhwcmVzc2lvbiApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNjA3NDoxOiAoICggcnVsZVhFeHByZXNzaW9uICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjYwNzU6MjogKCBydWxlWEV4cHJlc3Npb24gKQogICAgICAgICAgICAgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjQ0Njk6MjogKCBydWxlWEV4cHJlc3Npb24gKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjQ0NzA6MzogcnVsZVhFeHByZXNzaW9uCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNjA3NToyOiAoIHJ1bGVYRXhwcmVzc2lvbiApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNjA3NjozOiBydWxlWEV4cHJlc3Npb24KICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WFNob3J0Q2xvc3VyZUFjY2VzcygpLmdldEV4cHJlc3Npb25YRXhwcmVzc2lvblBhcnNlclJ1bGVDYWxsXzFfMCgpKTsgCkBAIC03OTY0MSwxNyArODQ4NzAsMTcgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YSWZFeHByZXNzaW9uX19JZkFzc2lnbm1lbnRfMyIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNDQ3OToxOiBydWxlX19YSWZFeHByZXNzaW9uX19JZkFzc2lnbm1lbnRfMyA6ICggcnVsZVhFeHByZXNzaW9uICkgOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI2MDg1OjE6IHJ1bGVfX1hJZkV4cHJlc3Npb25fX0lmQXNzaWdubWVudF8zIDogKCBydWxlWEV4cHJlc3Npb24gKSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fWElmRXhwcmVzc2lvbl9fSWZBc3NpZ25tZW50XzMoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjQ0ODM6MTogKCAoIHJ1bGVYRXhwcmVzc2lvbiApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI0NDg0OjI6ICggcnVsZVhFeHByZXNzaW9uICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI2MDg5OjE6ICggKCBydWxlWEV4cHJlc3Npb24gKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNjA5MDoyOiAoIHJ1bGVYRXhwcmVzc2lvbiApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNDQ4NDoyOiAoIHJ1bGVYRXhwcmVzc2lvbiApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNDQ4NTozOiBydWxlWEV4cHJlc3Npb24KKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI2MDkwOjI6ICggcnVsZVhFeHByZXNzaW9uICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI2MDkxOjM6IHJ1bGVYRXhwcmVzc2lvbgogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYSWZFeHByZXNzaW9uQWNjZXNzKCkuZ2V0SWZYRXhwcmVzc2lvblBhcnNlclJ1bGVDYWxsXzNfMCgpKTsgCkBAIC03OTY4NiwxNyArODQ5MTUsMTcgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YSWZFeHByZXNzaW9uX19UaGVuQXNzaWdubWVudF81IgotICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI0NDk0OjE6IHJ1bGVfX1hJZkV4cHJlc3Npb25fX1RoZW5Bc3NpZ25tZW50XzUgOiAoIHJ1bGVYRXhwcmVzc2lvbiApIDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNjEwMDoxOiBydWxlX19YSWZFeHByZXNzaW9uX19UaGVuQXNzaWdubWVudF81IDogKCBydWxlWEV4cHJlc3Npb24gKSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fWElmRXhwcmVzc2lvbl9fVGhlbkFzc2lnbm1lbnRfNSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNDQ5ODoxOiAoICggcnVsZVhFeHByZXNzaW9uICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjQ0OTk6MjogKCBydWxlWEV4cHJlc3Npb24gKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjYxMDQ6MTogKCAoIHJ1bGVYRXhwcmVzc2lvbiApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI2MTA1OjI6ICggcnVsZVhFeHByZXNzaW9uICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI0NDk5OjI6ICggcnVsZVhFeHByZXNzaW9uICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI0NTAwOjM6IHJ1bGVYRXhwcmVzc2lvbgorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjYxMDU6MjogKCBydWxlWEV4cHJlc3Npb24gKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjYxMDY6MzogcnVsZVhFeHByZXNzaW9uCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhJZkV4cHJlc3Npb25BY2Nlc3MoKS5nZXRUaGVuWEV4cHJlc3Npb25QYXJzZXJSdWxlQ2FsbF81XzAoKSk7IApAQCAtNzk3MzEsMTcgKzg0OTYwLDE3IEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fWElmRXhwcmVzc2lvbl9fRWxzZUFzc2lnbm1lbnRfNl8xIgotICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI0NTA5OjE6IHJ1bGVfX1hJZkV4cHJlc3Npb25fX0Vsc2VBc3NpZ25tZW50XzZfMSA6ICggcnVsZVhFeHByZXNzaW9uICkgOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI2MTE1OjE6IHJ1bGVfX1hJZkV4cHJlc3Npb25fX0Vsc2VBc3NpZ25tZW50XzZfMSA6ICggcnVsZVhFeHByZXNzaW9uICkgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1hJZkV4cHJlc3Npb25fX0Vsc2VBc3NpZ25tZW50XzZfMSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNDUxMzoxOiAoICggcnVsZVhFeHByZXNzaW9uICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjQ1MTQ6MjogKCBydWxlWEV4cHJlc3Npb24gKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjYxMTk6MTogKCAoIHJ1bGVYRXhwcmVzc2lvbiApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI2MTIwOjI6ICggcnVsZVhFeHByZXNzaW9uICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI0NTE0OjI6ICggcnVsZVhFeHByZXNzaW9uICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI0NTE1OjM6IHJ1bGVYRXhwcmVzc2lvbgorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjYxMjA6MjogKCBydWxlWEV4cHJlc3Npb24gKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjYxMjE6MzogcnVsZVhFeHByZXNzaW9uCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhJZkV4cHJlc3Npb25BY2Nlc3MoKS5nZXRFbHNlWEV4cHJlc3Npb25QYXJzZXJSdWxlQ2FsbF82XzFfMCgpKTsgCkBAIC03OTc3NiwxNyArODUwMDUsMTcgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YU3dpdGNoRXhwcmVzc2lvbl9fRGVjbGFyZWRQYXJhbUFzc2lnbm1lbnRfMl8wXzBfMF8xIgotICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI0NTI0OjE6IHJ1bGVfX1hTd2l0Y2hFeHByZXNzaW9uX19EZWNsYXJlZFBhcmFtQXNzaWdubWVudF8yXzBfMF8wXzEgOiAoIHJ1bGVKdm1Gb3JtYWxQYXJhbWV0ZXIgKSA7CisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjYxMzA6MTogcnVsZV9fWFN3aXRjaEV4cHJlc3Npb25fX0RlY2xhcmVkUGFyYW1Bc3NpZ25tZW50XzJfMF8wXzBfMSA6ICggcnVsZUp2bUZvcm1hbFBhcmFtZXRlciApIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YU3dpdGNoRXhwcmVzc2lvbl9fRGVjbGFyZWRQYXJhbUFzc2lnbm1lbnRfMl8wXzBfMF8xKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI0NTI4OjE6ICggKCBydWxlSnZtRm9ybWFsUGFyYW1ldGVyICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjQ1Mjk6MjogKCBydWxlSnZtRm9ybWFsUGFyYW1ldGVyICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI2MTM0OjE6ICggKCBydWxlSnZtRm9ybWFsUGFyYW1ldGVyICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjYxMzU6MjogKCBydWxlSnZtRm9ybWFsUGFyYW1ldGVyICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI0NTI5OjI6ICggcnVsZUp2bUZvcm1hbFBhcmFtZXRlciApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNDUzMDozOiBydWxlSnZtRm9ybWFsUGFyYW1ldGVyCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNjEzNToyOiAoIHJ1bGVKdm1Gb3JtYWxQYXJhbWV0ZXIgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjYxMzY6MzogcnVsZUp2bUZvcm1hbFBhcmFtZXRlcgogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYU3dpdGNoRXhwcmVzc2lvbkFjY2VzcygpLmdldERlY2xhcmVkUGFyYW1Kdm1Gb3JtYWxQYXJhbWV0ZXJQYXJzZXJSdWxlQ2FsbF8yXzBfMF8wXzFfMCgpKTsgCkBAIC03OTgyMSwxNyArODUwNTAsMTcgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YU3dpdGNoRXhwcmVzc2lvbl9fU3dpdGNoQXNzaWdubWVudF8yXzBfMSIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNDUzOToxOiBydWxlX19YU3dpdGNoRXhwcmVzc2lvbl9fU3dpdGNoQXNzaWdubWVudF8yXzBfMSA6ICggcnVsZVhFeHByZXNzaW9uICkgOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI2MTQ1OjE6IHJ1bGVfX1hTd2l0Y2hFeHByZXNzaW9uX19Td2l0Y2hBc3NpZ25tZW50XzJfMF8xIDogKCBydWxlWEV4cHJlc3Npb24gKSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fWFN3aXRjaEV4cHJlc3Npb25fX1N3aXRjaEFzc2lnbm1lbnRfMl8wXzEoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjQ1NDM6MTogKCAoIHJ1bGVYRXhwcmVzc2lvbiApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI0NTQ0OjI6ICggcnVsZVhFeHByZXNzaW9uICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI2MTQ5OjE6ICggKCBydWxlWEV4cHJlc3Npb24gKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNjE1MDoyOiAoIHJ1bGVYRXhwcmVzc2lvbiApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNDU0NDoyOiAoIHJ1bGVYRXhwcmVzc2lvbiApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNDU0NTozOiBydWxlWEV4cHJlc3Npb24KKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI2MTUwOjI6ICggcnVsZVhFeHByZXNzaW9uICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI2MTUxOjM6IHJ1bGVYRXhwcmVzc2lvbgogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYU3dpdGNoRXhwcmVzc2lvbkFjY2VzcygpLmdldFN3aXRjaFhFeHByZXNzaW9uUGFyc2VyUnVsZUNhbGxfMl8wXzFfMCgpKTsgCkBAIC03OTg2NiwxNyArODUwOTUsMTcgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YU3dpdGNoRXhwcmVzc2lvbl9fRGVjbGFyZWRQYXJhbUFzc2lnbm1lbnRfMl8xXzBfMF8wIgotICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI0NTU0OjE6IHJ1bGVfX1hTd2l0Y2hFeHByZXNzaW9uX19EZWNsYXJlZFBhcmFtQXNzaWdubWVudF8yXzFfMF8wXzAgOiAoIHJ1bGVKdm1Gb3JtYWxQYXJhbWV0ZXIgKSA7CisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjYxNjA6MTogcnVsZV9fWFN3aXRjaEV4cHJlc3Npb25fX0RlY2xhcmVkUGFyYW1Bc3NpZ25tZW50XzJfMV8wXzBfMCA6ICggcnVsZUp2bUZvcm1hbFBhcmFtZXRlciApIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YU3dpdGNoRXhwcmVzc2lvbl9fRGVjbGFyZWRQYXJhbUFzc2lnbm1lbnRfMl8xXzBfMF8wKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI0NTU4OjE6ICggKCBydWxlSnZtRm9ybWFsUGFyYW1ldGVyICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjQ1NTk6MjogKCBydWxlSnZtRm9ybWFsUGFyYW1ldGVyICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI2MTY0OjE6ICggKCBydWxlSnZtRm9ybWFsUGFyYW1ldGVyICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjYxNjU6MjogKCBydWxlSnZtRm9ybWFsUGFyYW1ldGVyICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI0NTU5OjI6ICggcnVsZUp2bUZvcm1hbFBhcmFtZXRlciApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNDU2MDozOiBydWxlSnZtRm9ybWFsUGFyYW1ldGVyCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNjE2NToyOiAoIHJ1bGVKdm1Gb3JtYWxQYXJhbWV0ZXIgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjYxNjY6MzogcnVsZUp2bUZvcm1hbFBhcmFtZXRlcgogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYU3dpdGNoRXhwcmVzc2lvbkFjY2VzcygpLmdldERlY2xhcmVkUGFyYW1Kdm1Gb3JtYWxQYXJhbWV0ZXJQYXJzZXJSdWxlQ2FsbF8yXzFfMF8wXzBfMCgpKTsgCkBAIC03OTkxMSwxNyArODUxNDAsMTcgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YU3dpdGNoRXhwcmVzc2lvbl9fU3dpdGNoQXNzaWdubWVudF8yXzFfMSIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNDU2OToxOiBydWxlX19YU3dpdGNoRXhwcmVzc2lvbl9fU3dpdGNoQXNzaWdubWVudF8yXzFfMSA6ICggcnVsZVhFeHByZXNzaW9uICkgOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI2MTc1OjE6IHJ1bGVfX1hTd2l0Y2hFeHByZXNzaW9uX19Td2l0Y2hBc3NpZ25tZW50XzJfMV8xIDogKCBydWxlWEV4cHJlc3Npb24gKSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fWFN3aXRjaEV4cHJlc3Npb25fX1N3aXRjaEFzc2lnbm1lbnRfMl8xXzEoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjQ1NzM6MTogKCAoIHJ1bGVYRXhwcmVzc2lvbiApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI0NTc0OjI6ICggcnVsZVhFeHByZXNzaW9uICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI2MTc5OjE6ICggKCBydWxlWEV4cHJlc3Npb24gKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNjE4MDoyOiAoIHJ1bGVYRXhwcmVzc2lvbiApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNDU3NDoyOiAoIHJ1bGVYRXhwcmVzc2lvbiApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNDU3NTozOiBydWxlWEV4cHJlc3Npb24KKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI2MTgwOjI6ICggcnVsZVhFeHByZXNzaW9uICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI2MTgxOjM6IHJ1bGVYRXhwcmVzc2lvbgogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYU3dpdGNoRXhwcmVzc2lvbkFjY2VzcygpLmdldFN3aXRjaFhFeHByZXNzaW9uUGFyc2VyUnVsZUNhbGxfMl8xXzFfMCgpKTsgCkBAIC03OTk1NiwxNyArODUxODUsMTcgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YU3dpdGNoRXhwcmVzc2lvbl9fQ2FzZXNBc3NpZ25tZW50XzQiCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjQ1ODQ6MTogcnVsZV9fWFN3aXRjaEV4cHJlc3Npb25fX0Nhc2VzQXNzaWdubWVudF80IDogKCBydWxlWENhc2VQYXJ0ICkgOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI2MTkwOjE6IHJ1bGVfX1hTd2l0Y2hFeHByZXNzaW9uX19DYXNlc0Fzc2lnbm1lbnRfNCA6ICggcnVsZVhDYXNlUGFydCApIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YU3dpdGNoRXhwcmVzc2lvbl9fQ2FzZXNBc3NpZ25tZW50XzQoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjQ1ODg6MTogKCAoIHJ1bGVYQ2FzZVBhcnQgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNDU4OToyOiAoIHJ1bGVYQ2FzZVBhcnQgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjYxOTQ6MTogKCAoIHJ1bGVYQ2FzZVBhcnQgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNjE5NToyOiAoIHJ1bGVYQ2FzZVBhcnQgKQogICAgICAgICAgICAgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjQ1ODk6MjogKCBydWxlWENhc2VQYXJ0ICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI0NTkwOjM6IHJ1bGVYQ2FzZVBhcnQKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI2MTk1OjI6ICggcnVsZVhDYXNlUGFydCApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNjE5NjozOiBydWxlWENhc2VQYXJ0CiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhTd2l0Y2hFeHByZXNzaW9uQWNjZXNzKCkuZ2V0Q2FzZXNYQ2FzZVBhcnRQYXJzZXJSdWxlQ2FsbF80XzAoKSk7IApAQCAtODAwMDEsMTcgKzg1MjMwLDE3IEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fWFN3aXRjaEV4cHJlc3Npb25fX0RlZmF1bHRBc3NpZ25tZW50XzVfMiIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNDU5OToxOiBydWxlX19YU3dpdGNoRXhwcmVzc2lvbl9fRGVmYXVsdEFzc2lnbm1lbnRfNV8yIDogKCBydWxlWEV4cHJlc3Npb24gKSA7CisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjYyMDU6MTogcnVsZV9fWFN3aXRjaEV4cHJlc3Npb25fX0RlZmF1bHRBc3NpZ25tZW50XzVfMiA6ICggcnVsZVhFeHByZXNzaW9uICkgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1hTd2l0Y2hFeHByZXNzaW9uX19EZWZhdWx0QXNzaWdubWVudF81XzIoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjQ2MDM6MTogKCAoIHJ1bGVYRXhwcmVzc2lvbiApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI0NjA0OjI6ICggcnVsZVhFeHByZXNzaW9uICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI2MjA5OjE6ICggKCBydWxlWEV4cHJlc3Npb24gKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNjIxMDoyOiAoIHJ1bGVYRXhwcmVzc2lvbiApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNDYwNDoyOiAoIHJ1bGVYRXhwcmVzc2lvbiApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNDYwNTozOiBydWxlWEV4cHJlc3Npb24KKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI2MjEwOjI6ICggcnVsZVhFeHByZXNzaW9uICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI2MjExOjM6IHJ1bGVYRXhwcmVzc2lvbgogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYU3dpdGNoRXhwcmVzc2lvbkFjY2VzcygpLmdldERlZmF1bHRYRXhwcmVzc2lvblBhcnNlclJ1bGVDYWxsXzVfMl8wKCkpOyAKQEAgLTgwMDQ2LDE3ICs4NTI3NSwxNyBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX1hDYXNlUGFydF9fVHlwZUd1YXJkQXNzaWdubWVudF8xIgotICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI0NjE0OjE6IHJ1bGVfX1hDYXNlUGFydF9fVHlwZUd1YXJkQXNzaWdubWVudF8xIDogKCBydWxlSnZtVHlwZVJlZmVyZW5jZSApIDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNjIyMDoxOiBydWxlX19YQ2FzZVBhcnRfX1R5cGVHdWFyZEFzc2lnbm1lbnRfMSA6ICggcnVsZUp2bVR5cGVSZWZlcmVuY2UgKSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fWENhc2VQYXJ0X19UeXBlR3VhcmRBc3NpZ25tZW50XzEoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjQ2MTg6MTogKCAoIHJ1bGVKdm1UeXBlUmVmZXJlbmNlICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjQ2MTk6MjogKCBydWxlSnZtVHlwZVJlZmVyZW5jZSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNjIyNDoxOiAoICggcnVsZUp2bVR5cGVSZWZlcmVuY2UgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNjIyNToyOiAoIHJ1bGVKdm1UeXBlUmVmZXJlbmNlICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI0NjE5OjI6ICggcnVsZUp2bVR5cGVSZWZlcmVuY2UgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjQ2MjA6MzogcnVsZUp2bVR5cGVSZWZlcmVuY2UKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI2MjI1OjI6ICggcnVsZUp2bVR5cGVSZWZlcmVuY2UgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjYyMjY6MzogcnVsZUp2bVR5cGVSZWZlcmVuY2UKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WENhc2VQYXJ0QWNjZXNzKCkuZ2V0VHlwZUd1YXJkSnZtVHlwZVJlZmVyZW5jZVBhcnNlclJ1bGVDYWxsXzFfMCgpKTsgCkBAIC04MDA5MSwxNyArODUzMjAsMTcgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YQ2FzZVBhcnRfX0Nhc2VBc3NpZ25tZW50XzJfMSIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNDYyOToxOiBydWxlX19YQ2FzZVBhcnRfX0Nhc2VBc3NpZ25tZW50XzJfMSA6ICggcnVsZVhFeHByZXNzaW9uICkgOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI2MjM1OjE6IHJ1bGVfX1hDYXNlUGFydF9fQ2FzZUFzc2lnbm1lbnRfMl8xIDogKCBydWxlWEV4cHJlc3Npb24gKSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fWENhc2VQYXJ0X19DYXNlQXNzaWdubWVudF8yXzEoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjQ2MzM6MTogKCAoIHJ1bGVYRXhwcmVzc2lvbiApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI0NjM0OjI6ICggcnVsZVhFeHByZXNzaW9uICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI2MjM5OjE6ICggKCBydWxlWEV4cHJlc3Npb24gKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNjI0MDoyOiAoIHJ1bGVYRXhwcmVzc2lvbiApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNDYzNDoyOiAoIHJ1bGVYRXhwcmVzc2lvbiApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNDYzNTozOiBydWxlWEV4cHJlc3Npb24KKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI2MjQwOjI6ICggcnVsZVhFeHByZXNzaW9uICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI2MjQxOjM6IHJ1bGVYRXhwcmVzc2lvbgogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYQ2FzZVBhcnRBY2Nlc3MoKS5nZXRDYXNlWEV4cHJlc3Npb25QYXJzZXJSdWxlQ2FsbF8yXzFfMCgpKTsgCkBAIC04MDEzNiwxNyArODUzNjUsMTcgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YQ2FzZVBhcnRfX1RoZW5Bc3NpZ25tZW50XzNfMF8xIgotICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI0NjQ0OjE6IHJ1bGVfX1hDYXNlUGFydF9fVGhlbkFzc2lnbm1lbnRfM18wXzEgOiAoIHJ1bGVYRXhwcmVzc2lvbiApIDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNjI1MDoxOiBydWxlX19YQ2FzZVBhcnRfX1RoZW5Bc3NpZ25tZW50XzNfMF8xIDogKCBydWxlWEV4cHJlc3Npb24gKSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fWENhc2VQYXJ0X19UaGVuQXNzaWdubWVudF8zXzBfMSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNDY0ODoxOiAoICggcnVsZVhFeHByZXNzaW9uICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjQ2NDk6MjogKCBydWxlWEV4cHJlc3Npb24gKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjYyNTQ6MTogKCAoIHJ1bGVYRXhwcmVzc2lvbiApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI2MjU1OjI6ICggcnVsZVhFeHByZXNzaW9uICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI0NjQ5OjI6ICggcnVsZVhFeHByZXNzaW9uICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI0NjUwOjM6IHJ1bGVYRXhwcmVzc2lvbgorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjYyNTU6MjogKCBydWxlWEV4cHJlc3Npb24gKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjYyNTY6MzogcnVsZVhFeHByZXNzaW9uCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhDYXNlUGFydEFjY2VzcygpLmdldFRoZW5YRXhwcmVzc2lvblBhcnNlclJ1bGVDYWxsXzNfMF8xXzAoKSk7IApAQCAtODAxODEsMjggKzg1NDEwLDI4IEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fWENhc2VQYXJ0X19GYWxsVGhyb3VnaEFzc2lnbm1lbnRfM18xIgotICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI0NjU5OjE6IHJ1bGVfX1hDYXNlUGFydF9fRmFsbFRocm91Z2hBc3NpZ25tZW50XzNfMSA6ICggKCAnLCcgKSApIDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNjI2NToxOiBydWxlX19YQ2FzZVBhcnRfX0ZhbGxUaHJvdWdoQXNzaWdubWVudF8zXzEgOiAoICggJywnICkgKSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fWENhc2VQYXJ0X19GYWxsVGhyb3VnaEFzc2lnbm1lbnRfM18xKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI0NjYzOjE6ICggKCAoICcsJyApICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjQ2NjQ6MjogKCAoICcsJyApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI2MjY5OjE6ICggKCAoICcsJyApICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjYyNzA6MjogKCAoICcsJyApICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI0NjY0OjI6ICggKCAnLCcgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNDY2NTozOiAoICcsJyApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNjI3MDoyOiAoICggJywnICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjYyNzE6MzogKCAnLCcgKQogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYQ2FzZVBhcnRBY2Nlc3MoKS5nZXRGYWxsVGhyb3VnaENvbW1hS2V5d29yZF8zXzFfMCgpKTsgCiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNDY2NjozOiAoICcsJyApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNDY2Nzo0OiAnLCcKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI2MjcyOjM6ICggJywnICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI2MjczOjQ6ICcsJwogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYQ2FzZVBhcnRBY2Nlc3MoKS5nZXRGYWxsVGhyb3VnaENvbW1hS2V5d29yZF8zXzFfMCgpKTsgCiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBtYXRjaChpbnB1dCwxMTUsRk9MTE9XXzIpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOworICAgICAgICAgICAgbWF0Y2goaW5wdXQsMTI1LEZPTExPV18yKTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRYQ2FzZVBhcnRBY2Nlc3MoKS5nZXRGYWxsVGhyb3VnaENvbW1hS2V5d29yZF8zXzFfMCgpKTsgCiAgICAgICAgICAgICB9CkBAIC04MDIzNCwxNyArODU0NjMsMTcgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YRm9yTG9vcEV4cHJlc3Npb25fX0RlY2xhcmVkUGFyYW1Bc3NpZ25tZW50XzBfMF8zIgotICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI0Njc4OjE6IHJ1bGVfX1hGb3JMb29wRXhwcmVzc2lvbl9fRGVjbGFyZWRQYXJhbUFzc2lnbm1lbnRfMF8wXzMgOiAoIHJ1bGVKdm1Gb3JtYWxQYXJhbWV0ZXIgKSA7CisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjYyODQ6MTogcnVsZV9fWEZvckxvb3BFeHByZXNzaW9uX19EZWNsYXJlZFBhcmFtQXNzaWdubWVudF8wXzBfMyA6ICggcnVsZUp2bUZvcm1hbFBhcmFtZXRlciApIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YRm9yTG9vcEV4cHJlc3Npb25fX0RlY2xhcmVkUGFyYW1Bc3NpZ25tZW50XzBfMF8zKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI0NjgyOjE6ICggKCBydWxlSnZtRm9ybWFsUGFyYW1ldGVyICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjQ2ODM6MjogKCBydWxlSnZtRm9ybWFsUGFyYW1ldGVyICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI2Mjg4OjE6ICggKCBydWxlSnZtRm9ybWFsUGFyYW1ldGVyICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjYyODk6MjogKCBydWxlSnZtRm9ybWFsUGFyYW1ldGVyICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI0NjgzOjI6ICggcnVsZUp2bUZvcm1hbFBhcmFtZXRlciApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNDY4NDozOiBydWxlSnZtRm9ybWFsUGFyYW1ldGVyCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNjI4OToyOiAoIHJ1bGVKdm1Gb3JtYWxQYXJhbWV0ZXIgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjYyOTA6MzogcnVsZUp2bUZvcm1hbFBhcmFtZXRlcgogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYRm9yTG9vcEV4cHJlc3Npb25BY2Nlc3MoKS5nZXREZWNsYXJlZFBhcmFtSnZtRm9ybWFsUGFyYW1ldGVyUGFyc2VyUnVsZUNhbGxfMF8wXzNfMCgpKTsgCkBAIC04MDI3OSwxNyArODU1MDgsMTcgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YRm9yTG9vcEV4cHJlc3Npb25fX0ZvckV4cHJlc3Npb25Bc3NpZ25tZW50XzEiCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjQ2OTM6MTogcnVsZV9fWEZvckxvb3BFeHByZXNzaW9uX19Gb3JFeHByZXNzaW9uQXNzaWdubWVudF8xIDogKCBydWxlWEV4cHJlc3Npb24gKSA7CisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjYyOTk6MTogcnVsZV9fWEZvckxvb3BFeHByZXNzaW9uX19Gb3JFeHByZXNzaW9uQXNzaWdubWVudF8xIDogKCBydWxlWEV4cHJlc3Npb24gKSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fWEZvckxvb3BFeHByZXNzaW9uX19Gb3JFeHByZXNzaW9uQXNzaWdubWVudF8xKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI0Njk3OjE6ICggKCBydWxlWEV4cHJlc3Npb24gKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNDY5ODoyOiAoIHJ1bGVYRXhwcmVzc2lvbiApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNjMwMzoxOiAoICggcnVsZVhFeHByZXNzaW9uICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjYzMDQ6MjogKCBydWxlWEV4cHJlc3Npb24gKQogICAgICAgICAgICAgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjQ2OTg6MjogKCBydWxlWEV4cHJlc3Npb24gKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjQ2OTk6MzogcnVsZVhFeHByZXNzaW9uCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNjMwNDoyOiAoIHJ1bGVYRXhwcmVzc2lvbiApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNjMwNTozOiBydWxlWEV4cHJlc3Npb24KICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WEZvckxvb3BFeHByZXNzaW9uQWNjZXNzKCkuZ2V0Rm9yRXhwcmVzc2lvblhFeHByZXNzaW9uUGFyc2VyUnVsZUNhbGxfMV8wKCkpOyAKQEAgLTgwMzI0LDE3ICs4NTU1MywxNyBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX1hGb3JMb29wRXhwcmVzc2lvbl9fRWFjaEV4cHJlc3Npb25Bc3NpZ25tZW50XzMiCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjQ3MDg6MTogcnVsZV9fWEZvckxvb3BFeHByZXNzaW9uX19FYWNoRXhwcmVzc2lvbkFzc2lnbm1lbnRfMyA6ICggcnVsZVhFeHByZXNzaW9uICkgOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI2MzE0OjE6IHJ1bGVfX1hGb3JMb29wRXhwcmVzc2lvbl9fRWFjaEV4cHJlc3Npb25Bc3NpZ25tZW50XzMgOiAoIHJ1bGVYRXhwcmVzc2lvbiApIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YRm9yTG9vcEV4cHJlc3Npb25fX0VhY2hFeHByZXNzaW9uQXNzaWdubWVudF8zKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI0NzEyOjE6ICggKCBydWxlWEV4cHJlc3Npb24gKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNDcxMzoyOiAoIHJ1bGVYRXhwcmVzc2lvbiApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNjMxODoxOiAoICggcnVsZVhFeHByZXNzaW9uICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjYzMTk6MjogKCBydWxlWEV4cHJlc3Npb24gKQogICAgICAgICAgICAgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjQ3MTM6MjogKCBydWxlWEV4cHJlc3Npb24gKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjQ3MTQ6MzogcnVsZVhFeHByZXNzaW9uCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNjMxOToyOiAoIHJ1bGVYRXhwcmVzc2lvbiApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNjMyMDozOiBydWxlWEV4cHJlc3Npb24KICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WEZvckxvb3BFeHByZXNzaW9uQWNjZXNzKCkuZ2V0RWFjaEV4cHJlc3Npb25YRXhwcmVzc2lvblBhcnNlclJ1bGVDYWxsXzNfMCgpKTsgCkBAIC04MDM2OSwxNyArODU1OTgsMTcgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YQmFzaWNGb3JMb29wRXhwcmVzc2lvbl9fSW5pdEV4cHJlc3Npb25zQXNzaWdubWVudF8zXzAiCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjQ3MjM6MTogcnVsZV9fWEJhc2ljRm9yTG9vcEV4cHJlc3Npb25fX0luaXRFeHByZXNzaW9uc0Fzc2lnbm1lbnRfM18wIDogKCBydWxlWEV4cHJlc3Npb25PclZhckRlY2xhcmF0aW9uICkgOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI2MzI5OjE6IHJ1bGVfX1hCYXNpY0Zvckxvb3BFeHByZXNzaW9uX19Jbml0RXhwcmVzc2lvbnNBc3NpZ25tZW50XzNfMCA6ICggcnVsZVhFeHByZXNzaW9uT3JWYXJEZWNsYXJhdGlvbiApIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YQmFzaWNGb3JMb29wRXhwcmVzc2lvbl9fSW5pdEV4cHJlc3Npb25zQXNzaWdubWVudF8zXzAoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjQ3Mjc6MTogKCAoIHJ1bGVYRXhwcmVzc2lvbk9yVmFyRGVjbGFyYXRpb24gKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNDcyODoyOiAoIHJ1bGVYRXhwcmVzc2lvbk9yVmFyRGVjbGFyYXRpb24gKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjYzMzM6MTogKCAoIHJ1bGVYRXhwcmVzc2lvbk9yVmFyRGVjbGFyYXRpb24gKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNjMzNDoyOiAoIHJ1bGVYRXhwcmVzc2lvbk9yVmFyRGVjbGFyYXRpb24gKQogICAgICAgICAgICAgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjQ3Mjg6MjogKCBydWxlWEV4cHJlc3Npb25PclZhckRlY2xhcmF0aW9uICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI0NzI5OjM6IHJ1bGVYRXhwcmVzc2lvbk9yVmFyRGVjbGFyYXRpb24KKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI2MzM0OjI6ICggcnVsZVhFeHByZXNzaW9uT3JWYXJEZWNsYXJhdGlvbiApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNjMzNTozOiBydWxlWEV4cHJlc3Npb25PclZhckRlY2xhcmF0aW9uCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhCYXNpY0Zvckxvb3BFeHByZXNzaW9uQWNjZXNzKCkuZ2V0SW5pdEV4cHJlc3Npb25zWEV4cHJlc3Npb25PclZhckRlY2xhcmF0aW9uUGFyc2VyUnVsZUNhbGxfM18wXzAoKSk7IApAQCAtODA0MTQsMTcgKzg1NjQzLDE3IEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fWEJhc2ljRm9yTG9vcEV4cHJlc3Npb25fX0luaXRFeHByZXNzaW9uc0Fzc2lnbm1lbnRfM18xXzEiCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjQ3Mzg6MTogcnVsZV9fWEJhc2ljRm9yTG9vcEV4cHJlc3Npb25fX0luaXRFeHByZXNzaW9uc0Fzc2lnbm1lbnRfM18xXzEgOiAoIHJ1bGVYRXhwcmVzc2lvbk9yVmFyRGVjbGFyYXRpb24gKSA7CisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjYzNDQ6MTogcnVsZV9fWEJhc2ljRm9yTG9vcEV4cHJlc3Npb25fX0luaXRFeHByZXNzaW9uc0Fzc2lnbm1lbnRfM18xXzEgOiAoIHJ1bGVYRXhwcmVzc2lvbk9yVmFyRGVjbGFyYXRpb24gKSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fWEJhc2ljRm9yTG9vcEV4cHJlc3Npb25fX0luaXRFeHByZXNzaW9uc0Fzc2lnbm1lbnRfM18xXzEoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjQ3NDI6MTogKCAoIHJ1bGVYRXhwcmVzc2lvbk9yVmFyRGVjbGFyYXRpb24gKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNDc0MzoyOiAoIHJ1bGVYRXhwcmVzc2lvbk9yVmFyRGVjbGFyYXRpb24gKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjYzNDg6MTogKCAoIHJ1bGVYRXhwcmVzc2lvbk9yVmFyRGVjbGFyYXRpb24gKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNjM0OToyOiAoIHJ1bGVYRXhwcmVzc2lvbk9yVmFyRGVjbGFyYXRpb24gKQogICAgICAgICAgICAgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjQ3NDM6MjogKCBydWxlWEV4cHJlc3Npb25PclZhckRlY2xhcmF0aW9uICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI0NzQ0OjM6IHJ1bGVYRXhwcmVzc2lvbk9yVmFyRGVjbGFyYXRpb24KKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI2MzQ5OjI6ICggcnVsZVhFeHByZXNzaW9uT3JWYXJEZWNsYXJhdGlvbiApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNjM1MDozOiBydWxlWEV4cHJlc3Npb25PclZhckRlY2xhcmF0aW9uCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhCYXNpY0Zvckxvb3BFeHByZXNzaW9uQWNjZXNzKCkuZ2V0SW5pdEV4cHJlc3Npb25zWEV4cHJlc3Npb25PclZhckRlY2xhcmF0aW9uUGFyc2VyUnVsZUNhbGxfM18xXzFfMCgpKTsgCkBAIC04MDQ1OSwxNyArODU2ODgsMTcgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YQmFzaWNGb3JMb29wRXhwcmVzc2lvbl9fRXhwcmVzc2lvbkFzc2lnbm1lbnRfNSIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNDc1MzoxOiBydWxlX19YQmFzaWNGb3JMb29wRXhwcmVzc2lvbl9fRXhwcmVzc2lvbkFzc2lnbm1lbnRfNSA6ICggcnVsZVhFeHByZXNzaW9uICkgOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI2MzU5OjE6IHJ1bGVfX1hCYXNpY0Zvckxvb3BFeHByZXNzaW9uX19FeHByZXNzaW9uQXNzaWdubWVudF81IDogKCBydWxlWEV4cHJlc3Npb24gKSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fWEJhc2ljRm9yTG9vcEV4cHJlc3Npb25fX0V4cHJlc3Npb25Bc3NpZ25tZW50XzUoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjQ3NTc6MTogKCAoIHJ1bGVYRXhwcmVzc2lvbiApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI0NzU4OjI6ICggcnVsZVhFeHByZXNzaW9uICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI2MzYzOjE6ICggKCBydWxlWEV4cHJlc3Npb24gKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNjM2NDoyOiAoIHJ1bGVYRXhwcmVzc2lvbiApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNDc1ODoyOiAoIHJ1bGVYRXhwcmVzc2lvbiApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNDc1OTozOiBydWxlWEV4cHJlc3Npb24KKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI2MzY0OjI6ICggcnVsZVhFeHByZXNzaW9uICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI2MzY1OjM6IHJ1bGVYRXhwcmVzc2lvbgogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYQmFzaWNGb3JMb29wRXhwcmVzc2lvbkFjY2VzcygpLmdldEV4cHJlc3Npb25YRXhwcmVzc2lvblBhcnNlclJ1bGVDYWxsXzVfMCgpKTsgCkBAIC04MDUwNCwxNyArODU3MzMsMTcgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YQmFzaWNGb3JMb29wRXhwcmVzc2lvbl9fVXBkYXRlRXhwcmVzc2lvbnNBc3NpZ25tZW50XzdfMCIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNDc2ODoxOiBydWxlX19YQmFzaWNGb3JMb29wRXhwcmVzc2lvbl9fVXBkYXRlRXhwcmVzc2lvbnNBc3NpZ25tZW50XzdfMCA6ICggcnVsZVhFeHByZXNzaW9uICkgOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI2Mzc0OjE6IHJ1bGVfX1hCYXNpY0Zvckxvb3BFeHByZXNzaW9uX19VcGRhdGVFeHByZXNzaW9uc0Fzc2lnbm1lbnRfN18wIDogKCBydWxlWEV4cHJlc3Npb24gKSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fWEJhc2ljRm9yTG9vcEV4cHJlc3Npb25fX1VwZGF0ZUV4cHJlc3Npb25zQXNzaWdubWVudF83XzAoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjQ3NzI6MTogKCAoIHJ1bGVYRXhwcmVzc2lvbiApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI0NzczOjI6ICggcnVsZVhFeHByZXNzaW9uICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI2Mzc4OjE6ICggKCBydWxlWEV4cHJlc3Npb24gKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNjM3OToyOiAoIHJ1bGVYRXhwcmVzc2lvbiApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNDc3MzoyOiAoIHJ1bGVYRXhwcmVzc2lvbiApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNDc3NDozOiBydWxlWEV4cHJlc3Npb24KKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI2Mzc5OjI6ICggcnVsZVhFeHByZXNzaW9uICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI2MzgwOjM6IHJ1bGVYRXhwcmVzc2lvbgogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYQmFzaWNGb3JMb29wRXhwcmVzc2lvbkFjY2VzcygpLmdldFVwZGF0ZUV4cHJlc3Npb25zWEV4cHJlc3Npb25QYXJzZXJSdWxlQ2FsbF83XzBfMCgpKTsgCkBAIC04MDU0OSwxNyArODU3NzgsMTcgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YQmFzaWNGb3JMb29wRXhwcmVzc2lvbl9fVXBkYXRlRXhwcmVzc2lvbnNBc3NpZ25tZW50XzdfMV8xIgotICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI0NzgzOjE6IHJ1bGVfX1hCYXNpY0Zvckxvb3BFeHByZXNzaW9uX19VcGRhdGVFeHByZXNzaW9uc0Fzc2lnbm1lbnRfN18xXzEgOiAoIHJ1bGVYRXhwcmVzc2lvbiApIDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNjM4OToxOiBydWxlX19YQmFzaWNGb3JMb29wRXhwcmVzc2lvbl9fVXBkYXRlRXhwcmVzc2lvbnNBc3NpZ25tZW50XzdfMV8xIDogKCBydWxlWEV4cHJlc3Npb24gKSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fWEJhc2ljRm9yTG9vcEV4cHJlc3Npb25fX1VwZGF0ZUV4cHJlc3Npb25zQXNzaWdubWVudF83XzFfMSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNDc4NzoxOiAoICggcnVsZVhFeHByZXNzaW9uICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjQ3ODg6MjogKCBydWxlWEV4cHJlc3Npb24gKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjYzOTM6MTogKCAoIHJ1bGVYRXhwcmVzc2lvbiApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI2Mzk0OjI6ICggcnVsZVhFeHByZXNzaW9uICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI0Nzg4OjI6ICggcnVsZVhFeHByZXNzaW9uICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI0Nzg5OjM6IHJ1bGVYRXhwcmVzc2lvbgorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjYzOTQ6MjogKCBydWxlWEV4cHJlc3Npb24gKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjYzOTU6MzogcnVsZVhFeHByZXNzaW9uCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhCYXNpY0Zvckxvb3BFeHByZXNzaW9uQWNjZXNzKCkuZ2V0VXBkYXRlRXhwcmVzc2lvbnNYRXhwcmVzc2lvblBhcnNlclJ1bGVDYWxsXzdfMV8xXzAoKSk7IApAQCAtODA1OTQsMTcgKzg1ODIzLDE3IEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fWEJhc2ljRm9yTG9vcEV4cHJlc3Npb25fX0VhY2hFeHByZXNzaW9uQXNzaWdubWVudF85IgotICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI0Nzk4OjE6IHJ1bGVfX1hCYXNpY0Zvckxvb3BFeHByZXNzaW9uX19FYWNoRXhwcmVzc2lvbkFzc2lnbm1lbnRfOSA6ICggcnVsZVhFeHByZXNzaW9uICkgOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI2NDA0OjE6IHJ1bGVfX1hCYXNpY0Zvckxvb3BFeHByZXNzaW9uX19FYWNoRXhwcmVzc2lvbkFzc2lnbm1lbnRfOSA6ICggcnVsZVhFeHByZXNzaW9uICkgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1hCYXNpY0Zvckxvb3BFeHByZXNzaW9uX19FYWNoRXhwcmVzc2lvbkFzc2lnbm1lbnRfOSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNDgwMjoxOiAoICggcnVsZVhFeHByZXNzaW9uICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjQ4MDM6MjogKCBydWxlWEV4cHJlc3Npb24gKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjY0MDg6MTogKCAoIHJ1bGVYRXhwcmVzc2lvbiApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI2NDA5OjI6ICggcnVsZVhFeHByZXNzaW9uICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI0ODAzOjI6ICggcnVsZVhFeHByZXNzaW9uICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI0ODA0OjM6IHJ1bGVYRXhwcmVzc2lvbgorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjY0MDk6MjogKCBydWxlWEV4cHJlc3Npb24gKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjY0MTA6MzogcnVsZVhFeHByZXNzaW9uCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhCYXNpY0Zvckxvb3BFeHByZXNzaW9uQWNjZXNzKCkuZ2V0RWFjaEV4cHJlc3Npb25YRXhwcmVzc2lvblBhcnNlclJ1bGVDYWxsXzlfMCgpKTsgCkBAIC04MDYzOSwxNyArODU4NjgsMTcgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YV2hpbGVFeHByZXNzaW9uX19QcmVkaWNhdGVBc3NpZ25tZW50XzMiCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjQ4MTM6MTogcnVsZV9fWFdoaWxlRXhwcmVzc2lvbl9fUHJlZGljYXRlQXNzaWdubWVudF8zIDogKCBydWxlWEV4cHJlc3Npb24gKSA7CisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjY0MTk6MTogcnVsZV9fWFdoaWxlRXhwcmVzc2lvbl9fUHJlZGljYXRlQXNzaWdubWVudF8zIDogKCBydWxlWEV4cHJlc3Npb24gKSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fWFdoaWxlRXhwcmVzc2lvbl9fUHJlZGljYXRlQXNzaWdubWVudF8zKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI0ODE3OjE6ICggKCBydWxlWEV4cHJlc3Npb24gKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNDgxODoyOiAoIHJ1bGVYRXhwcmVzc2lvbiApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNjQyMzoxOiAoICggcnVsZVhFeHByZXNzaW9uICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjY0MjQ6MjogKCBydWxlWEV4cHJlc3Npb24gKQogICAgICAgICAgICAgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjQ4MTg6MjogKCBydWxlWEV4cHJlc3Npb24gKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjQ4MTk6MzogcnVsZVhFeHByZXNzaW9uCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNjQyNDoyOiAoIHJ1bGVYRXhwcmVzc2lvbiApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNjQyNTozOiBydWxlWEV4cHJlc3Npb24KICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WFdoaWxlRXhwcmVzc2lvbkFjY2VzcygpLmdldFByZWRpY2F0ZVhFeHByZXNzaW9uUGFyc2VyUnVsZUNhbGxfM18wKCkpOyAKQEAgLTgwNjg0LDE3ICs4NTkxMywxNyBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX1hXaGlsZUV4cHJlc3Npb25fX0JvZHlBc3NpZ25tZW50XzUiCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjQ4Mjg6MTogcnVsZV9fWFdoaWxlRXhwcmVzc2lvbl9fQm9keUFzc2lnbm1lbnRfNSA6ICggcnVsZVhFeHByZXNzaW9uICkgOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI2NDM0OjE6IHJ1bGVfX1hXaGlsZUV4cHJlc3Npb25fX0JvZHlBc3NpZ25tZW50XzUgOiAoIHJ1bGVYRXhwcmVzc2lvbiApIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YV2hpbGVFeHByZXNzaW9uX19Cb2R5QXNzaWdubWVudF81KCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI0ODMyOjE6ICggKCBydWxlWEV4cHJlc3Npb24gKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNDgzMzoyOiAoIHJ1bGVYRXhwcmVzc2lvbiApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNjQzODoxOiAoICggcnVsZVhFeHByZXNzaW9uICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjY0Mzk6MjogKCBydWxlWEV4cHJlc3Npb24gKQogICAgICAgICAgICAgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjQ4MzM6MjogKCBydWxlWEV4cHJlc3Npb24gKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjQ4MzQ6MzogcnVsZVhFeHByZXNzaW9uCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNjQzOToyOiAoIHJ1bGVYRXhwcmVzc2lvbiApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNjQ0MDozOiBydWxlWEV4cHJlc3Npb24KICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WFdoaWxlRXhwcmVzc2lvbkFjY2VzcygpLmdldEJvZHlYRXhwcmVzc2lvblBhcnNlclJ1bGVDYWxsXzVfMCgpKTsgCkBAIC04MDcyOSwxNyArODU5NTgsMTcgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YRG9XaGlsZUV4cHJlc3Npb25fX0JvZHlBc3NpZ25tZW50XzIiCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjQ4NDM6MTogcnVsZV9fWERvV2hpbGVFeHByZXNzaW9uX19Cb2R5QXNzaWdubWVudF8yIDogKCBydWxlWEV4cHJlc3Npb24gKSA7CisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjY0NDk6MTogcnVsZV9fWERvV2hpbGVFeHByZXNzaW9uX19Cb2R5QXNzaWdubWVudF8yIDogKCBydWxlWEV4cHJlc3Npb24gKSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fWERvV2hpbGVFeHByZXNzaW9uX19Cb2R5QXNzaWdubWVudF8yKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI0ODQ3OjE6ICggKCBydWxlWEV4cHJlc3Npb24gKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNDg0ODoyOiAoIHJ1bGVYRXhwcmVzc2lvbiApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNjQ1MzoxOiAoICggcnVsZVhFeHByZXNzaW9uICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjY0NTQ6MjogKCBydWxlWEV4cHJlc3Npb24gKQogICAgICAgICAgICAgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjQ4NDg6MjogKCBydWxlWEV4cHJlc3Npb24gKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjQ4NDk6MzogcnVsZVhFeHByZXNzaW9uCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNjQ1NDoyOiAoIHJ1bGVYRXhwcmVzc2lvbiApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNjQ1NTozOiBydWxlWEV4cHJlc3Npb24KICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WERvV2hpbGVFeHByZXNzaW9uQWNjZXNzKCkuZ2V0Qm9keVhFeHByZXNzaW9uUGFyc2VyUnVsZUNhbGxfMl8wKCkpOyAKQEAgLTgwNzc0LDE3ICs4NjAwMywxNyBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX1hEb1doaWxlRXhwcmVzc2lvbl9fUHJlZGljYXRlQXNzaWdubWVudF81IgotICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI0ODU4OjE6IHJ1bGVfX1hEb1doaWxlRXhwcmVzc2lvbl9fUHJlZGljYXRlQXNzaWdubWVudF81IDogKCBydWxlWEV4cHJlc3Npb24gKSA7CisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjY0NjQ6MTogcnVsZV9fWERvV2hpbGVFeHByZXNzaW9uX19QcmVkaWNhdGVBc3NpZ25tZW50XzUgOiAoIHJ1bGVYRXhwcmVzc2lvbiApIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YRG9XaGlsZUV4cHJlc3Npb25fX1ByZWRpY2F0ZUFzc2lnbm1lbnRfNSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNDg2MjoxOiAoICggcnVsZVhFeHByZXNzaW9uICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjQ4NjM6MjogKCBydWxlWEV4cHJlc3Npb24gKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjY0Njg6MTogKCAoIHJ1bGVYRXhwcmVzc2lvbiApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI2NDY5OjI6ICggcnVsZVhFeHByZXNzaW9uICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI0ODYzOjI6ICggcnVsZVhFeHByZXNzaW9uICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI0ODY0OjM6IHJ1bGVYRXhwcmVzc2lvbgorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjY0Njk6MjogKCBydWxlWEV4cHJlc3Npb24gKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjY0NzA6MzogcnVsZVhFeHByZXNzaW9uCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhEb1doaWxlRXhwcmVzc2lvbkFjY2VzcygpLmdldFByZWRpY2F0ZVhFeHByZXNzaW9uUGFyc2VyUnVsZUNhbGxfNV8wKCkpOyAKQEAgLTgwODE5LDE3ICs4NjA0OCwxNyBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX1hCbG9ja0V4cHJlc3Npb25fX0V4cHJlc3Npb25zQXNzaWdubWVudF8yXzAiCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjQ4NzM6MTogcnVsZV9fWEJsb2NrRXhwcmVzc2lvbl9fRXhwcmVzc2lvbnNBc3NpZ25tZW50XzJfMCA6ICggcnVsZVhFeHByZXNzaW9uT3JWYXJEZWNsYXJhdGlvbiApIDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNjQ3OToxOiBydWxlX19YQmxvY2tFeHByZXNzaW9uX19FeHByZXNzaW9uc0Fzc2lnbm1lbnRfMl8wIDogKCBydWxlWEV4cHJlc3Npb25PclZhckRlY2xhcmF0aW9uICkgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1hCbG9ja0V4cHJlc3Npb25fX0V4cHJlc3Npb25zQXNzaWdubWVudF8yXzAoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjQ4Nzc6MTogKCAoIHJ1bGVYRXhwcmVzc2lvbk9yVmFyRGVjbGFyYXRpb24gKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNDg3ODoyOiAoIHJ1bGVYRXhwcmVzc2lvbk9yVmFyRGVjbGFyYXRpb24gKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjY0ODM6MTogKCAoIHJ1bGVYRXhwcmVzc2lvbk9yVmFyRGVjbGFyYXRpb24gKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNjQ4NDoyOiAoIHJ1bGVYRXhwcmVzc2lvbk9yVmFyRGVjbGFyYXRpb24gKQogICAgICAgICAgICAgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjQ4Nzg6MjogKCBydWxlWEV4cHJlc3Npb25PclZhckRlY2xhcmF0aW9uICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI0ODc5OjM6IHJ1bGVYRXhwcmVzc2lvbk9yVmFyRGVjbGFyYXRpb24KKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI2NDg0OjI6ICggcnVsZVhFeHByZXNzaW9uT3JWYXJEZWNsYXJhdGlvbiApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNjQ4NTozOiBydWxlWEV4cHJlc3Npb25PclZhckRlY2xhcmF0aW9uCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhCbG9ja0V4cHJlc3Npb25BY2Nlc3MoKS5nZXRFeHByZXNzaW9uc1hFeHByZXNzaW9uT3JWYXJEZWNsYXJhdGlvblBhcnNlclJ1bGVDYWxsXzJfMF8wKCkpOyAKQEAgLTgwODY0LDI4ICs4NjA5MywyOCBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX1hWYXJpYWJsZURlY2xhcmF0aW9uX19Xcml0ZWFibGVBc3NpZ25tZW50XzFfMCIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNDg4ODoxOiBydWxlX19YVmFyaWFibGVEZWNsYXJhdGlvbl9fV3JpdGVhYmxlQXNzaWdubWVudF8xXzAgOiAoICggJ3ZhcicgKSApIDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNjQ5NDoxOiBydWxlX19YVmFyaWFibGVEZWNsYXJhdGlvbl9fV3JpdGVhYmxlQXNzaWdubWVudF8xXzAgOiAoICggJ3ZhcicgKSApIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YVmFyaWFibGVEZWNsYXJhdGlvbl9fV3JpdGVhYmxlQXNzaWdubWVudF8xXzAoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjQ4OTI6MTogKCAoICggJ3ZhcicgKSApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI0ODkzOjI6ICggKCAndmFyJyApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI2NDk4OjE6ICggKCAoICd2YXInICkgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNjQ5OToyOiAoICggJ3ZhcicgKSApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNDg5MzoyOiAoICggJ3ZhcicgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNDg5NDozOiAoICd2YXInICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI2NDk5OjI6ICggKCAndmFyJyApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI2NTAwOjM6ICggJ3ZhcicgKQogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYVmFyaWFibGVEZWNsYXJhdGlvbkFjY2VzcygpLmdldFdyaXRlYWJsZVZhcktleXdvcmRfMV8wXzAoKSk7IAogICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjQ4OTU6MzogKCAndmFyJyApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNDg5Njo0OiAndmFyJworICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjY1MDE6MzogKCAndmFyJyApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNjUwMjo0OiAndmFyJwogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYVmFyaWFibGVEZWNsYXJhdGlvbkFjY2VzcygpLmdldFdyaXRlYWJsZVZhcktleXdvcmRfMV8wXzAoKSk7IAogICAgICAgICAgICAgfQotICAgICAgICAgICAgbWF0Y2goaW5wdXQsMTUzLEZPTExPV18yKTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKKyAgICAgICAgICAgIG1hdGNoKGlucHV0LDE2NSxGT0xMT1dfMik7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0WFZhcmlhYmxlRGVjbGFyYXRpb25BY2Nlc3MoKS5nZXRXcml0ZWFibGVWYXJLZXl3b3JkXzFfMF8wKCkpOyAKICAgICAgICAgICAgIH0KQEAgLTgwOTE3LDE3ICs4NjE0NiwxNyBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX1hWYXJpYWJsZURlY2xhcmF0aW9uX19UeXBlQXNzaWdubWVudF8yXzBfMF8wIgotICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI0OTA3OjE6IHJ1bGVfX1hWYXJpYWJsZURlY2xhcmF0aW9uX19UeXBlQXNzaWdubWVudF8yXzBfMF8wIDogKCBydWxlSnZtVHlwZVJlZmVyZW5jZSApIDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNjUxMzoxOiBydWxlX19YVmFyaWFibGVEZWNsYXJhdGlvbl9fVHlwZUFzc2lnbm1lbnRfMl8wXzBfMCA6ICggcnVsZUp2bVR5cGVSZWZlcmVuY2UgKSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fWFZhcmlhYmxlRGVjbGFyYXRpb25fX1R5cGVBc3NpZ25tZW50XzJfMF8wXzAoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjQ5MTE6MTogKCAoIHJ1bGVKdm1UeXBlUmVmZXJlbmNlICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjQ5MTI6MjogKCBydWxlSnZtVHlwZVJlZmVyZW5jZSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNjUxNzoxOiAoICggcnVsZUp2bVR5cGVSZWZlcmVuY2UgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNjUxODoyOiAoIHJ1bGVKdm1UeXBlUmVmZXJlbmNlICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI0OTEyOjI6ICggcnVsZUp2bVR5cGVSZWZlcmVuY2UgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjQ5MTM6MzogcnVsZUp2bVR5cGVSZWZlcmVuY2UKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI2NTE4OjI6ICggcnVsZUp2bVR5cGVSZWZlcmVuY2UgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjY1MTk6MzogcnVsZUp2bVR5cGVSZWZlcmVuY2UKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WFZhcmlhYmxlRGVjbGFyYXRpb25BY2Nlc3MoKS5nZXRUeXBlSnZtVHlwZVJlZmVyZW5jZVBhcnNlclJ1bGVDYWxsXzJfMF8wXzBfMCgpKTsgCkBAIC04MDk2MiwxNyArODYxOTEsMTcgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YVmFyaWFibGVEZWNsYXJhdGlvbl9fTmFtZUFzc2lnbm1lbnRfMl8wXzBfMSIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNDkyMjoxOiBydWxlX19YVmFyaWFibGVEZWNsYXJhdGlvbl9fTmFtZUFzc2lnbm1lbnRfMl8wXzBfMSA6ICggcnVsZVZhbGlkSUQgKSA7CisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjY1Mjg6MTogcnVsZV9fWFZhcmlhYmxlRGVjbGFyYXRpb25fX05hbWVBc3NpZ25tZW50XzJfMF8wXzEgOiAoIHJ1bGVWYWxpZElEICkgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1hWYXJpYWJsZURlY2xhcmF0aW9uX19OYW1lQXNzaWdubWVudF8yXzBfMF8xKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI0OTI2OjE6ICggKCBydWxlVmFsaWRJRCApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI0OTI3OjI6ICggcnVsZVZhbGlkSUQgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjY1MzI6MTogKCAoIHJ1bGVWYWxpZElEICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjY1MzM6MjogKCBydWxlVmFsaWRJRCApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNDkyNzoyOiAoIHJ1bGVWYWxpZElEICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI0OTI4OjM6IHJ1bGVWYWxpZElECisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNjUzMzoyOiAoIHJ1bGVWYWxpZElEICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI2NTM0OjM6IHJ1bGVWYWxpZElECiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhWYXJpYWJsZURlY2xhcmF0aW9uQWNjZXNzKCkuZ2V0TmFtZVZhbGlkSURQYXJzZXJSdWxlQ2FsbF8yXzBfMF8xXzAoKSk7IApAQCAtODEwMDcsMTcgKzg2MjM2LDE3IEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fWFZhcmlhYmxlRGVjbGFyYXRpb25fX05hbWVBc3NpZ25tZW50XzJfMSIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNDkzNzoxOiBydWxlX19YVmFyaWFibGVEZWNsYXJhdGlvbl9fTmFtZUFzc2lnbm1lbnRfMl8xIDogKCBydWxlVmFsaWRJRCApIDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNjU0MzoxOiBydWxlX19YVmFyaWFibGVEZWNsYXJhdGlvbl9fTmFtZUFzc2lnbm1lbnRfMl8xIDogKCBydWxlVmFsaWRJRCApIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YVmFyaWFibGVEZWNsYXJhdGlvbl9fTmFtZUFzc2lnbm1lbnRfMl8xKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI0OTQxOjE6ICggKCBydWxlVmFsaWRJRCApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI0OTQyOjI6ICggcnVsZVZhbGlkSUQgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjY1NDc6MTogKCAoIHJ1bGVWYWxpZElEICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjY1NDg6MjogKCBydWxlVmFsaWRJRCApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNDk0MjoyOiAoIHJ1bGVWYWxpZElEICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI0OTQzOjM6IHJ1bGVWYWxpZElECisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNjU0ODoyOiAoIHJ1bGVWYWxpZElEICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI2NTQ5OjM6IHJ1bGVWYWxpZElECiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhWYXJpYWJsZURlY2xhcmF0aW9uQWNjZXNzKCkuZ2V0TmFtZVZhbGlkSURQYXJzZXJSdWxlQ2FsbF8yXzFfMCgpKTsgCkBAIC04MTA1MiwxNyArODYyODEsMTcgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YVmFyaWFibGVEZWNsYXJhdGlvbl9fUmlnaHRBc3NpZ25tZW50XzNfMSIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNDk1MjoxOiBydWxlX19YVmFyaWFibGVEZWNsYXJhdGlvbl9fUmlnaHRBc3NpZ25tZW50XzNfMSA6ICggcnVsZVhFeHByZXNzaW9uICkgOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI2NTU4OjE6IHJ1bGVfX1hWYXJpYWJsZURlY2xhcmF0aW9uX19SaWdodEFzc2lnbm1lbnRfM18xIDogKCBydWxlWEV4cHJlc3Npb24gKSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fWFZhcmlhYmxlRGVjbGFyYXRpb25fX1JpZ2h0QXNzaWdubWVudF8zXzEoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjQ5NTY6MTogKCAoIHJ1bGVYRXhwcmVzc2lvbiApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI0OTU3OjI6ICggcnVsZVhFeHByZXNzaW9uICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI2NTYyOjE6ICggKCBydWxlWEV4cHJlc3Npb24gKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNjU2MzoyOiAoIHJ1bGVYRXhwcmVzc2lvbiApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNDk1NzoyOiAoIHJ1bGVYRXhwcmVzc2lvbiApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNDk1ODozOiBydWxlWEV4cHJlc3Npb24KKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI2NTYzOjI6ICggcnVsZVhFeHByZXNzaW9uICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI2NTY0OjM6IHJ1bGVYRXhwcmVzc2lvbgogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYVmFyaWFibGVEZWNsYXJhdGlvbkFjY2VzcygpLmdldFJpZ2h0WEV4cHJlc3Npb25QYXJzZXJSdWxlQ2FsbF8zXzFfMCgpKTsgCkBAIC04MTA5NywxNyArODYzMjYsMTcgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19Kdm1Gb3JtYWxQYXJhbWV0ZXJfX1BhcmFtZXRlclR5cGVBc3NpZ25tZW50XzAiCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjQ5Njc6MTogcnVsZV9fSnZtRm9ybWFsUGFyYW1ldGVyX19QYXJhbWV0ZXJUeXBlQXNzaWdubWVudF8wIDogKCBydWxlSnZtVHlwZVJlZmVyZW5jZSApIDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNjU3MzoxOiBydWxlX19Kdm1Gb3JtYWxQYXJhbWV0ZXJfX1BhcmFtZXRlclR5cGVBc3NpZ25tZW50XzAgOiAoIHJ1bGVKdm1UeXBlUmVmZXJlbmNlICkgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX0p2bUZvcm1hbFBhcmFtZXRlcl9fUGFyYW1ldGVyVHlwZUFzc2lnbm1lbnRfMCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNDk3MToxOiAoICggcnVsZUp2bVR5cGVSZWZlcmVuY2UgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNDk3MjoyOiAoIHJ1bGVKdm1UeXBlUmVmZXJlbmNlICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI2NTc3OjE6ICggKCBydWxlSnZtVHlwZVJlZmVyZW5jZSApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI2NTc4OjI6ICggcnVsZUp2bVR5cGVSZWZlcmVuY2UgKQogICAgICAgICAgICAgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjQ5NzI6MjogKCBydWxlSnZtVHlwZVJlZmVyZW5jZSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNDk3MzozOiBydWxlSnZtVHlwZVJlZmVyZW5jZQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjY1Nzg6MjogKCBydWxlSnZtVHlwZVJlZmVyZW5jZSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNjU3OTozOiBydWxlSnZtVHlwZVJlZmVyZW5jZQogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRKdm1Gb3JtYWxQYXJhbWV0ZXJBY2Nlc3MoKS5nZXRQYXJhbWV0ZXJUeXBlSnZtVHlwZVJlZmVyZW5jZVBhcnNlclJ1bGVDYWxsXzBfMCgpKTsgCkBAIC04MTE0MiwxNyArODYzNzEsMTcgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19Kdm1Gb3JtYWxQYXJhbWV0ZXJfX05hbWVBc3NpZ25tZW50XzEiCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjQ5ODI6MTogcnVsZV9fSnZtRm9ybWFsUGFyYW1ldGVyX19OYW1lQXNzaWdubWVudF8xIDogKCBydWxlVmFsaWRJRCApIDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNjU4ODoxOiBydWxlX19Kdm1Gb3JtYWxQYXJhbWV0ZXJfX05hbWVBc3NpZ25tZW50XzEgOiAoIHJ1bGVWYWxpZElEICkgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX0p2bUZvcm1hbFBhcmFtZXRlcl9fTmFtZUFzc2lnbm1lbnRfMSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNDk4NjoxOiAoICggcnVsZVZhbGlkSUQgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNDk4NzoyOiAoIHJ1bGVWYWxpZElEICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI2NTkyOjE6ICggKCBydWxlVmFsaWRJRCApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI2NTkzOjI6ICggcnVsZVZhbGlkSUQgKQogICAgICAgICAgICAgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjQ5ODc6MjogKCBydWxlVmFsaWRJRCApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNDk4ODozOiBydWxlVmFsaWRJRAorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjY1OTM6MjogKCBydWxlVmFsaWRJRCApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNjU5NDozOiBydWxlVmFsaWRJRAogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRKdm1Gb3JtYWxQYXJhbWV0ZXJBY2Nlc3MoKS5nZXROYW1lVmFsaWRJRFBhcnNlclJ1bGVDYWxsXzFfMCgpKTsgCkBAIC04MTE4NywxNyArODY0MTYsMTcgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19GdWxsSnZtRm9ybWFsUGFyYW1ldGVyX19QYXJhbWV0ZXJUeXBlQXNzaWdubWVudF8wIgotICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI0OTk3OjE6IHJ1bGVfX0Z1bGxKdm1Gb3JtYWxQYXJhbWV0ZXJfX1BhcmFtZXRlclR5cGVBc3NpZ25tZW50XzAgOiAoIHJ1bGVKdm1UeXBlUmVmZXJlbmNlICkgOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI2NjAzOjE6IHJ1bGVfX0Z1bGxKdm1Gb3JtYWxQYXJhbWV0ZXJfX1BhcmFtZXRlclR5cGVBc3NpZ25tZW50XzAgOiAoIHJ1bGVKdm1UeXBlUmVmZXJlbmNlICkgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX0Z1bGxKdm1Gb3JtYWxQYXJhbWV0ZXJfX1BhcmFtZXRlclR5cGVBc3NpZ25tZW50XzAoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjUwMDE6MTogKCAoIHJ1bGVKdm1UeXBlUmVmZXJlbmNlICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjUwMDI6MjogKCBydWxlSnZtVHlwZVJlZmVyZW5jZSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNjYwNzoxOiAoICggcnVsZUp2bVR5cGVSZWZlcmVuY2UgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNjYwODoyOiAoIHJ1bGVKdm1UeXBlUmVmZXJlbmNlICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI1MDAyOjI6ICggcnVsZUp2bVR5cGVSZWZlcmVuY2UgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjUwMDM6MzogcnVsZUp2bVR5cGVSZWZlcmVuY2UKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI2NjA4OjI6ICggcnVsZUp2bVR5cGVSZWZlcmVuY2UgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjY2MDk6MzogcnVsZUp2bVR5cGVSZWZlcmVuY2UKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0RnVsbEp2bUZvcm1hbFBhcmFtZXRlckFjY2VzcygpLmdldFBhcmFtZXRlclR5cGVKdm1UeXBlUmVmZXJlbmNlUGFyc2VyUnVsZUNhbGxfMF8wKCkpOyAKQEAgLTgxMjMyLDE3ICs4NjQ2MSwxNyBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX0Z1bGxKdm1Gb3JtYWxQYXJhbWV0ZXJfX05hbWVBc3NpZ25tZW50XzEiCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjUwMTI6MTogcnVsZV9fRnVsbEp2bUZvcm1hbFBhcmFtZXRlcl9fTmFtZUFzc2lnbm1lbnRfMSA6ICggcnVsZVZhbGlkSUQgKSA7CisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjY2MTg6MTogcnVsZV9fRnVsbEp2bUZvcm1hbFBhcmFtZXRlcl9fTmFtZUFzc2lnbm1lbnRfMSA6ICggcnVsZVZhbGlkSUQgKSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fRnVsbEp2bUZvcm1hbFBhcmFtZXRlcl9fTmFtZUFzc2lnbm1lbnRfMSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNTAxNjoxOiAoICggcnVsZVZhbGlkSUQgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNTAxNzoyOiAoIHJ1bGVWYWxpZElEICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI2NjIyOjE6ICggKCBydWxlVmFsaWRJRCApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI2NjIzOjI6ICggcnVsZVZhbGlkSUQgKQogICAgICAgICAgICAgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjUwMTc6MjogKCBydWxlVmFsaWRJRCApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNTAxODozOiBydWxlVmFsaWRJRAorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjY2MjM6MjogKCBydWxlVmFsaWRJRCApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNjYyNDozOiBydWxlVmFsaWRJRAogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRGdWxsSnZtRm9ybWFsUGFyYW1ldGVyQWNjZXNzKCkuZ2V0TmFtZVZhbGlkSURQYXJzZXJSdWxlQ2FsbF8xXzAoKSk7IApAQCAtODEyNzcsMTcgKzg2NTA2LDE3IEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fWEZlYXR1cmVDYWxsX19UeXBlQXJndW1lbnRzQXNzaWdubWVudF8xXzEiCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjUwMjc6MTogcnVsZV9fWEZlYXR1cmVDYWxsX19UeXBlQXJndW1lbnRzQXNzaWdubWVudF8xXzEgOiAoIHJ1bGVKdm1Bcmd1bWVudFR5cGVSZWZlcmVuY2UgKSA7CisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjY2MzM6MTogcnVsZV9fWEZlYXR1cmVDYWxsX19UeXBlQXJndW1lbnRzQXNzaWdubWVudF8xXzEgOiAoIHJ1bGVKdm1Bcmd1bWVudFR5cGVSZWZlcmVuY2UgKSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fWEZlYXR1cmVDYWxsX19UeXBlQXJndW1lbnRzQXNzaWdubWVudF8xXzEoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjUwMzE6MTogKCAoIHJ1bGVKdm1Bcmd1bWVudFR5cGVSZWZlcmVuY2UgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNTAzMjoyOiAoIHJ1bGVKdm1Bcmd1bWVudFR5cGVSZWZlcmVuY2UgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjY2Mzc6MTogKCAoIHJ1bGVKdm1Bcmd1bWVudFR5cGVSZWZlcmVuY2UgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNjYzODoyOiAoIHJ1bGVKdm1Bcmd1bWVudFR5cGVSZWZlcmVuY2UgKQogICAgICAgICAgICAgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjUwMzI6MjogKCBydWxlSnZtQXJndW1lbnRUeXBlUmVmZXJlbmNlICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI1MDMzOjM6IHJ1bGVKdm1Bcmd1bWVudFR5cGVSZWZlcmVuY2UKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI2NjM4OjI6ICggcnVsZUp2bUFyZ3VtZW50VHlwZVJlZmVyZW5jZSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNjYzOTozOiBydWxlSnZtQXJndW1lbnRUeXBlUmVmZXJlbmNlCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhGZWF0dXJlQ2FsbEFjY2VzcygpLmdldFR5cGVBcmd1bWVudHNKdm1Bcmd1bWVudFR5cGVSZWZlcmVuY2VQYXJzZXJSdWxlQ2FsbF8xXzFfMCgpKTsgCkBAIC04MTMyMiwxNyArODY1NTEsMTcgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YRmVhdHVyZUNhbGxfX1R5cGVBcmd1bWVudHNBc3NpZ25tZW50XzFfMl8xIgotICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI1MDQyOjE6IHJ1bGVfX1hGZWF0dXJlQ2FsbF9fVHlwZUFyZ3VtZW50c0Fzc2lnbm1lbnRfMV8yXzEgOiAoIHJ1bGVKdm1Bcmd1bWVudFR5cGVSZWZlcmVuY2UgKSA7CisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjY2NDg6MTogcnVsZV9fWEZlYXR1cmVDYWxsX19UeXBlQXJndW1lbnRzQXNzaWdubWVudF8xXzJfMSA6ICggcnVsZUp2bUFyZ3VtZW50VHlwZVJlZmVyZW5jZSApIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YRmVhdHVyZUNhbGxfX1R5cGVBcmd1bWVudHNBc3NpZ25tZW50XzFfMl8xKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI1MDQ2OjE6ICggKCBydWxlSnZtQXJndW1lbnRUeXBlUmVmZXJlbmNlICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjUwNDc6MjogKCBydWxlSnZtQXJndW1lbnRUeXBlUmVmZXJlbmNlICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI2NjUyOjE6ICggKCBydWxlSnZtQXJndW1lbnRUeXBlUmVmZXJlbmNlICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjY2NTM6MjogKCBydWxlSnZtQXJndW1lbnRUeXBlUmVmZXJlbmNlICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI1MDQ3OjI6ICggcnVsZUp2bUFyZ3VtZW50VHlwZVJlZmVyZW5jZSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNTA0ODozOiBydWxlSnZtQXJndW1lbnRUeXBlUmVmZXJlbmNlCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNjY1MzoyOiAoIHJ1bGVKdm1Bcmd1bWVudFR5cGVSZWZlcmVuY2UgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjY2NTQ6MzogcnVsZUp2bUFyZ3VtZW50VHlwZVJlZmVyZW5jZQogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYRmVhdHVyZUNhbGxBY2Nlc3MoKS5nZXRUeXBlQXJndW1lbnRzSnZtQXJndW1lbnRUeXBlUmVmZXJlbmNlUGFyc2VyUnVsZUNhbGxfMV8yXzFfMCgpKTsgCkBAIC04MTM2NywyMyArODY1OTYsMjMgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YRmVhdHVyZUNhbGxfX0ZlYXR1cmVBc3NpZ25tZW50XzIiCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjUwNTc6MTogcnVsZV9fWEZlYXR1cmVDYWxsX19GZWF0dXJlQXNzaWdubWVudF8yIDogKCAoIHJ1bGVJZE9yU3VwZXIgKSApIDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNjY2MzoxOiBydWxlX19YRmVhdHVyZUNhbGxfX0ZlYXR1cmVBc3NpZ25tZW50XzIgOiAoICggcnVsZUlkT3JTdXBlciApICkgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1hGZWF0dXJlQ2FsbF9fRmVhdHVyZUFzc2lnbm1lbnRfMigpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNTA2MToxOiAoICggKCBydWxlSWRPclN1cGVyICkgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNTA2MjoyOiAoICggcnVsZUlkT3JTdXBlciApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI2NjY3OjE6ICggKCAoIHJ1bGVJZE9yU3VwZXIgKSApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI2NjY4OjI6ICggKCBydWxlSWRPclN1cGVyICkgKQogICAgICAgICAgICAgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjUwNjI6MjogKCAoIHJ1bGVJZE9yU3VwZXIgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNTA2MzozOiAoIHJ1bGVJZE9yU3VwZXIgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjY2Njg6MjogKCAoIHJ1bGVJZE9yU3VwZXIgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNjY2OTozOiAoIHJ1bGVJZE9yU3VwZXIgKQogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYRmVhdHVyZUNhbGxBY2Nlc3MoKS5nZXRGZWF0dXJlSnZtSWRlbnRpZmlhYmxlRWxlbWVudENyb3NzUmVmZXJlbmNlXzJfMCgpKTsgCiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNTA2NDozOiAoIHJ1bGVJZE9yU3VwZXIgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjUwNjU6NDogcnVsZUlkT3JTdXBlcgorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjY2NzA6MzogKCBydWxlSWRPclN1cGVyICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI2NjcxOjQ6IHJ1bGVJZE9yU3VwZXIKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WEZlYXR1cmVDYWxsQWNjZXNzKCkuZ2V0RmVhdHVyZUp2bUlkZW50aWZpYWJsZUVsZW1lbnRJZE9yU3VwZXJQYXJzZXJSdWxlQ2FsbF8yXzBfMSgpKTsgCkBAIC04MTQyNCwyOCArODY2NTMsMjggQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YRmVhdHVyZUNhbGxfX0V4cGxpY2l0T3BlcmF0aW9uQ2FsbEFzc2lnbm1lbnRfM18wIgotICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI1MDc2OjE6IHJ1bGVfX1hGZWF0dXJlQ2FsbF9fRXhwbGljaXRPcGVyYXRpb25DYWxsQXNzaWdubWVudF8zXzAgOiAoICggJygnICkgKSA7CisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjY2ODI6MTogcnVsZV9fWEZlYXR1cmVDYWxsX19FeHBsaWNpdE9wZXJhdGlvbkNhbGxBc3NpZ25tZW50XzNfMCA6ICggKCAnKCcgKSApIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YRmVhdHVyZUNhbGxfX0V4cGxpY2l0T3BlcmF0aW9uQ2FsbEFzc2lnbm1lbnRfM18wKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI1MDgwOjE6ICggKCAoICcoJyApICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjUwODE6MjogKCAoICcoJyApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI2Njg2OjE6ICggKCAoICcoJyApICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjY2ODc6MjogKCAoICcoJyApICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI1MDgxOjI6ICggKCAnKCcgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNTA4MjozOiAoICcoJyApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNjY4NzoyOiAoICggJygnICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjY2ODg6MzogKCAnKCcgKQogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYRmVhdHVyZUNhbGxBY2Nlc3MoKS5nZXRFeHBsaWNpdE9wZXJhdGlvbkNhbGxMZWZ0UGFyZW50aGVzaXNLZXl3b3JkXzNfMF8wKCkpOyAKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI1MDgzOjM6ICggJygnICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI1MDg0OjQ6ICcoJworICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjY2ODk6MzogKCAnKCcgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjY2OTA6NDogJygnCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhGZWF0dXJlQ2FsbEFjY2VzcygpLmdldEV4cGxpY2l0T3BlcmF0aW9uQ2FsbExlZnRQYXJlbnRoZXNpc0tleXdvcmRfM18wXzAoKSk7IAogICAgICAgICAgICAgfQotICAgICAgICAgICAgbWF0Y2goaW5wdXQsMTEzLEZPTExPV18yKTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKKyAgICAgICAgICAgIG1hdGNoKGlucHV0LDEyMyxGT0xMT1dfMik7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0WEZlYXR1cmVDYWxsQWNjZXNzKCkuZ2V0RXhwbGljaXRPcGVyYXRpb25DYWxsTGVmdFBhcmVudGhlc2lzS2V5d29yZF8zXzBfMCgpKTsgCiAgICAgICAgICAgICB9CkBAIC04MTQ3NywxNyArODY3MDYsMTcgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YRmVhdHVyZUNhbGxfX0ZlYXR1cmVDYWxsQXJndW1lbnRzQXNzaWdubWVudF8zXzFfMCIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNTA5NToxOiBydWxlX19YRmVhdHVyZUNhbGxfX0ZlYXR1cmVDYWxsQXJndW1lbnRzQXNzaWdubWVudF8zXzFfMCA6ICggcnVsZVhTaG9ydENsb3N1cmUgKSA7CisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjY3MDE6MTogcnVsZV9fWEZlYXR1cmVDYWxsX19GZWF0dXJlQ2FsbEFyZ3VtZW50c0Fzc2lnbm1lbnRfM18xXzAgOiAoIHJ1bGVYU2hvcnRDbG9zdXJlICkgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1hGZWF0dXJlQ2FsbF9fRmVhdHVyZUNhbGxBcmd1bWVudHNBc3NpZ25tZW50XzNfMV8wKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI1MDk5OjE6ICggKCBydWxlWFNob3J0Q2xvc3VyZSApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI1MTAwOjI6ICggcnVsZVhTaG9ydENsb3N1cmUgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjY3MDU6MTogKCAoIHJ1bGVYU2hvcnRDbG9zdXJlICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjY3MDY6MjogKCBydWxlWFNob3J0Q2xvc3VyZSApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNTEwMDoyOiAoIHJ1bGVYU2hvcnRDbG9zdXJlICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI1MTAxOjM6IHJ1bGVYU2hvcnRDbG9zdXJlCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNjcwNjoyOiAoIHJ1bGVYU2hvcnRDbG9zdXJlICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI2NzA3OjM6IHJ1bGVYU2hvcnRDbG9zdXJlCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhGZWF0dXJlQ2FsbEFjY2VzcygpLmdldEZlYXR1cmVDYWxsQXJndW1lbnRzWFNob3J0Q2xvc3VyZVBhcnNlclJ1bGVDYWxsXzNfMV8wXzAoKSk7IApAQCAtODE1MjIsMTcgKzg2NzUxLDE3IEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fWEZlYXR1cmVDYWxsX19GZWF0dXJlQ2FsbEFyZ3VtZW50c0Fzc2lnbm1lbnRfM18xXzFfMCIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNTExMDoxOiBydWxlX19YRmVhdHVyZUNhbGxfX0ZlYXR1cmVDYWxsQXJndW1lbnRzQXNzaWdubWVudF8zXzFfMV8wIDogKCBydWxlWEV4cHJlc3Npb24gKSA7CisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjY3MTY6MTogcnVsZV9fWEZlYXR1cmVDYWxsX19GZWF0dXJlQ2FsbEFyZ3VtZW50c0Fzc2lnbm1lbnRfM18xXzFfMCA6ICggcnVsZVhFeHByZXNzaW9uICkgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1hGZWF0dXJlQ2FsbF9fRmVhdHVyZUNhbGxBcmd1bWVudHNBc3NpZ25tZW50XzNfMV8xXzAoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjUxMTQ6MTogKCAoIHJ1bGVYRXhwcmVzc2lvbiApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI1MTE1OjI6ICggcnVsZVhFeHByZXNzaW9uICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI2NzIwOjE6ICggKCBydWxlWEV4cHJlc3Npb24gKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNjcyMToyOiAoIHJ1bGVYRXhwcmVzc2lvbiApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNTExNToyOiAoIHJ1bGVYRXhwcmVzc2lvbiApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNTExNjozOiBydWxlWEV4cHJlc3Npb24KKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI2NzIxOjI6ICggcnVsZVhFeHByZXNzaW9uICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI2NzIyOjM6IHJ1bGVYRXhwcmVzc2lvbgogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYRmVhdHVyZUNhbGxBY2Nlc3MoKS5nZXRGZWF0dXJlQ2FsbEFyZ3VtZW50c1hFeHByZXNzaW9uUGFyc2VyUnVsZUNhbGxfM18xXzFfMF8wKCkpOyAKQEAgLTgxNTY3LDE3ICs4Njc5NiwxNyBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX1hGZWF0dXJlQ2FsbF9fRmVhdHVyZUNhbGxBcmd1bWVudHNBc3NpZ25tZW50XzNfMV8xXzFfMSIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNTEyNToxOiBydWxlX19YRmVhdHVyZUNhbGxfX0ZlYXR1cmVDYWxsQXJndW1lbnRzQXNzaWdubWVudF8zXzFfMV8xXzEgOiAoIHJ1bGVYRXhwcmVzc2lvbiApIDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNjczMToxOiBydWxlX19YRmVhdHVyZUNhbGxfX0ZlYXR1cmVDYWxsQXJndW1lbnRzQXNzaWdubWVudF8zXzFfMV8xXzEgOiAoIHJ1bGVYRXhwcmVzc2lvbiApIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YRmVhdHVyZUNhbGxfX0ZlYXR1cmVDYWxsQXJndW1lbnRzQXNzaWdubWVudF8zXzFfMV8xXzEoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjUxMjk6MTogKCAoIHJ1bGVYRXhwcmVzc2lvbiApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI1MTMwOjI6ICggcnVsZVhFeHByZXNzaW9uICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI2NzM1OjE6ICggKCBydWxlWEV4cHJlc3Npb24gKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNjczNjoyOiAoIHJ1bGVYRXhwcmVzc2lvbiApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNTEzMDoyOiAoIHJ1bGVYRXhwcmVzc2lvbiApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNTEzMTozOiBydWxlWEV4cHJlc3Npb24KKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI2NzM2OjI6ICggcnVsZVhFeHByZXNzaW9uICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI2NzM3OjM6IHJ1bGVYRXhwcmVzc2lvbgogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYRmVhdHVyZUNhbGxBY2Nlc3MoKS5nZXRGZWF0dXJlQ2FsbEFyZ3VtZW50c1hFeHByZXNzaW9uUGFyc2VyUnVsZUNhbGxfM18xXzFfMV8xXzAoKSk7IApAQCAtODE2MTIsMTcgKzg2ODQxLDE3IEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fWEZlYXR1cmVDYWxsX19GZWF0dXJlQ2FsbEFyZ3VtZW50c0Fzc2lnbm1lbnRfNCIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNTE0MDoxOiBydWxlX19YRmVhdHVyZUNhbGxfX0ZlYXR1cmVDYWxsQXJndW1lbnRzQXNzaWdubWVudF80IDogKCBydWxlWENsb3N1cmUgKSA7CisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjY3NDY6MTogcnVsZV9fWEZlYXR1cmVDYWxsX19GZWF0dXJlQ2FsbEFyZ3VtZW50c0Fzc2lnbm1lbnRfNCA6ICggcnVsZVhDbG9zdXJlICkgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1hGZWF0dXJlQ2FsbF9fRmVhdHVyZUNhbGxBcmd1bWVudHNBc3NpZ25tZW50XzQoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjUxNDQ6MTogKCAoIHJ1bGVYQ2xvc3VyZSApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI1MTQ1OjI6ICggcnVsZVhDbG9zdXJlICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI2NzUwOjE6ICggKCBydWxlWENsb3N1cmUgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNjc1MToyOiAoIHJ1bGVYQ2xvc3VyZSApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNTE0NToyOiAoIHJ1bGVYQ2xvc3VyZSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNTE0NjozOiBydWxlWENsb3N1cmUKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI2NzUxOjI6ICggcnVsZVhDbG9zdXJlICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI2NzUyOjM6IHJ1bGVYQ2xvc3VyZQogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYRmVhdHVyZUNhbGxBY2Nlc3MoKS5nZXRGZWF0dXJlQ2FsbEFyZ3VtZW50c1hDbG9zdXJlUGFyc2VyUnVsZUNhbGxfNF8wKCkpOyAKQEAgLTgxNjU3LDIzICs4Njg4NiwyMyBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX1hDb25zdHJ1Y3RvckNhbGxfX0NvbnN0cnVjdG9yQXNzaWdubWVudF8yIgotICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI1MTU1OjE6IHJ1bGVfX1hDb25zdHJ1Y3RvckNhbGxfX0NvbnN0cnVjdG9yQXNzaWdubWVudF8yIDogKCAoIHJ1bGVRdWFsaWZpZWROYW1lICkgKSA7CisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjY3NjE6MTogcnVsZV9fWENvbnN0cnVjdG9yQ2FsbF9fQ29uc3RydWN0b3JBc3NpZ25tZW50XzIgOiAoICggcnVsZVF1YWxpZmllZE5hbWUgKSApIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YQ29uc3RydWN0b3JDYWxsX19Db25zdHJ1Y3RvckFzc2lnbm1lbnRfMigpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNTE1OToxOiAoICggKCBydWxlUXVhbGlmaWVkTmFtZSApICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjUxNjA6MjogKCAoIHJ1bGVRdWFsaWZpZWROYW1lICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjY3NjU6MTogKCAoICggcnVsZVF1YWxpZmllZE5hbWUgKSApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI2NzY2OjI6ICggKCBydWxlUXVhbGlmaWVkTmFtZSApICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI1MTYwOjI6ICggKCBydWxlUXVhbGlmaWVkTmFtZSApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI1MTYxOjM6ICggcnVsZVF1YWxpZmllZE5hbWUgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjY3NjY6MjogKCAoIHJ1bGVRdWFsaWZpZWROYW1lICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjY3Njc6MzogKCBydWxlUXVhbGlmaWVkTmFtZSApCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhDb25zdHJ1Y3RvckNhbGxBY2Nlc3MoKS5nZXRDb25zdHJ1Y3Rvckp2bUNvbnN0cnVjdG9yQ3Jvc3NSZWZlcmVuY2VfMl8wKCkpOyAKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI1MTYyOjM6ICggcnVsZVF1YWxpZmllZE5hbWUgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjUxNjM6NDogcnVsZVF1YWxpZmllZE5hbWUKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI2NzY4OjM6ICggcnVsZVF1YWxpZmllZE5hbWUgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjY3Njk6NDogcnVsZVF1YWxpZmllZE5hbWUKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WENvbnN0cnVjdG9yQ2FsbEFjY2VzcygpLmdldENvbnN0cnVjdG9ySnZtQ29uc3RydWN0b3JRdWFsaWZpZWROYW1lUGFyc2VyUnVsZUNhbGxfMl8wXzEoKSk7IApAQCAtODE3MTQsMTcgKzg2OTQzLDE3IEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fWENvbnN0cnVjdG9yQ2FsbF9fVHlwZUFyZ3VtZW50c0Fzc2lnbm1lbnRfM18xIgotICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI1MTc0OjE6IHJ1bGVfX1hDb25zdHJ1Y3RvckNhbGxfX1R5cGVBcmd1bWVudHNBc3NpZ25tZW50XzNfMSA6ICggcnVsZUp2bUFyZ3VtZW50VHlwZVJlZmVyZW5jZSApIDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNjc4MDoxOiBydWxlX19YQ29uc3RydWN0b3JDYWxsX19UeXBlQXJndW1lbnRzQXNzaWdubWVudF8zXzEgOiAoIHJ1bGVKdm1Bcmd1bWVudFR5cGVSZWZlcmVuY2UgKSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fWENvbnN0cnVjdG9yQ2FsbF9fVHlwZUFyZ3VtZW50c0Fzc2lnbm1lbnRfM18xKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI1MTc4OjE6ICggKCBydWxlSnZtQXJndW1lbnRUeXBlUmVmZXJlbmNlICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjUxNzk6MjogKCBydWxlSnZtQXJndW1lbnRUeXBlUmVmZXJlbmNlICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI2Nzg0OjE6ICggKCBydWxlSnZtQXJndW1lbnRUeXBlUmVmZXJlbmNlICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjY3ODU6MjogKCBydWxlSnZtQXJndW1lbnRUeXBlUmVmZXJlbmNlICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI1MTc5OjI6ICggcnVsZUp2bUFyZ3VtZW50VHlwZVJlZmVyZW5jZSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNTE4MDozOiBydWxlSnZtQXJndW1lbnRUeXBlUmVmZXJlbmNlCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNjc4NToyOiAoIHJ1bGVKdm1Bcmd1bWVudFR5cGVSZWZlcmVuY2UgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjY3ODY6MzogcnVsZUp2bUFyZ3VtZW50VHlwZVJlZmVyZW5jZQogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYQ29uc3RydWN0b3JDYWxsQWNjZXNzKCkuZ2V0VHlwZUFyZ3VtZW50c0p2bUFyZ3VtZW50VHlwZVJlZmVyZW5jZVBhcnNlclJ1bGVDYWxsXzNfMV8wKCkpOyAKQEAgLTgxNzU5LDE3ICs4Njk4OCwxNyBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX1hDb25zdHJ1Y3RvckNhbGxfX1R5cGVBcmd1bWVudHNBc3NpZ25tZW50XzNfMl8xIgotICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI1MTg5OjE6IHJ1bGVfX1hDb25zdHJ1Y3RvckNhbGxfX1R5cGVBcmd1bWVudHNBc3NpZ25tZW50XzNfMl8xIDogKCBydWxlSnZtQXJndW1lbnRUeXBlUmVmZXJlbmNlICkgOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI2Nzk1OjE6IHJ1bGVfX1hDb25zdHJ1Y3RvckNhbGxfX1R5cGVBcmd1bWVudHNBc3NpZ25tZW50XzNfMl8xIDogKCBydWxlSnZtQXJndW1lbnRUeXBlUmVmZXJlbmNlICkgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1hDb25zdHJ1Y3RvckNhbGxfX1R5cGVBcmd1bWVudHNBc3NpZ25tZW50XzNfMl8xKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI1MTkzOjE6ICggKCBydWxlSnZtQXJndW1lbnRUeXBlUmVmZXJlbmNlICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjUxOTQ6MjogKCBydWxlSnZtQXJndW1lbnRUeXBlUmVmZXJlbmNlICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI2Nzk5OjE6ICggKCBydWxlSnZtQXJndW1lbnRUeXBlUmVmZXJlbmNlICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjY4MDA6MjogKCBydWxlSnZtQXJndW1lbnRUeXBlUmVmZXJlbmNlICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI1MTk0OjI6ICggcnVsZUp2bUFyZ3VtZW50VHlwZVJlZmVyZW5jZSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNTE5NTozOiBydWxlSnZtQXJndW1lbnRUeXBlUmVmZXJlbmNlCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNjgwMDoyOiAoIHJ1bGVKdm1Bcmd1bWVudFR5cGVSZWZlcmVuY2UgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjY4MDE6MzogcnVsZUp2bUFyZ3VtZW50VHlwZVJlZmVyZW5jZQogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYQ29uc3RydWN0b3JDYWxsQWNjZXNzKCkuZ2V0VHlwZUFyZ3VtZW50c0p2bUFyZ3VtZW50VHlwZVJlZmVyZW5jZVBhcnNlclJ1bGVDYWxsXzNfMl8xXzAoKSk7IApAQCAtODE4MDQsMjggKzg3MDMzLDI4IEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fWENvbnN0cnVjdG9yQ2FsbF9fRXhwbGljaXRDb25zdHJ1Y3RvckNhbGxBc3NpZ25tZW50XzRfMCIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNTIwNDoxOiBydWxlX19YQ29uc3RydWN0b3JDYWxsX19FeHBsaWNpdENvbnN0cnVjdG9yQ2FsbEFzc2lnbm1lbnRfNF8wIDogKCAoICcoJyApICkgOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI2ODEwOjE6IHJ1bGVfX1hDb25zdHJ1Y3RvckNhbGxfX0V4cGxpY2l0Q29uc3RydWN0b3JDYWxsQXNzaWdubWVudF80XzAgOiAoICggJygnICkgKSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fWENvbnN0cnVjdG9yQ2FsbF9fRXhwbGljaXRDb25zdHJ1Y3RvckNhbGxBc3NpZ25tZW50XzRfMCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNTIwODoxOiAoICggKCAnKCcgKSApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI1MjA5OjI6ICggKCAnKCcgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNjgxNDoxOiAoICggKCAnKCcgKSApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI2ODE1OjI6ICggKCAnKCcgKSApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNTIwOToyOiAoICggJygnICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjUyMTA6MzogKCAnKCcgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjY4MTU6MjogKCAoICcoJyApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI2ODE2OjM6ICggJygnICkKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WENvbnN0cnVjdG9yQ2FsbEFjY2VzcygpLmdldEV4cGxpY2l0Q29uc3RydWN0b3JDYWxsTGVmdFBhcmVudGhlc2lzS2V5d29yZF80XzBfMCgpKTsgCiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNTIxMTozOiAoICcoJyApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNTIxMjo0OiAnKCcKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI2ODE3OjM6ICggJygnICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI2ODE4OjQ6ICcoJwogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYQ29uc3RydWN0b3JDYWxsQWNjZXNzKCkuZ2V0RXhwbGljaXRDb25zdHJ1Y3RvckNhbGxMZWZ0UGFyZW50aGVzaXNLZXl3b3JkXzRfMF8wKCkpOyAKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1hdGNoKGlucHV0LDExMyxGT0xMT1dfMik7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CisgICAgICAgICAgICBtYXRjaChpbnB1dCwxMjMsRk9MTE9XXzIpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOwogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBhZnRlcihncmFtbWFyQWNjZXNzLmdldFhDb25zdHJ1Y3RvckNhbGxBY2Nlc3MoKS5nZXRFeHBsaWNpdENvbnN0cnVjdG9yQ2FsbExlZnRQYXJlbnRoZXNpc0tleXdvcmRfNF8wXzAoKSk7IAogICAgICAgICAgICAgfQpAQCAtODE4NTcsMTcgKzg3MDg2LDE3IEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fWENvbnN0cnVjdG9yQ2FsbF9fQXJndW1lbnRzQXNzaWdubWVudF80XzFfMCIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNTIyMzoxOiBydWxlX19YQ29uc3RydWN0b3JDYWxsX19Bcmd1bWVudHNBc3NpZ25tZW50XzRfMV8wIDogKCBydWxlWFNob3J0Q2xvc3VyZSApIDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNjgyOToxOiBydWxlX19YQ29uc3RydWN0b3JDYWxsX19Bcmd1bWVudHNBc3NpZ25tZW50XzRfMV8wIDogKCBydWxlWFNob3J0Q2xvc3VyZSApIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YQ29uc3RydWN0b3JDYWxsX19Bcmd1bWVudHNBc3NpZ25tZW50XzRfMV8wKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI1MjI3OjE6ICggKCBydWxlWFNob3J0Q2xvc3VyZSApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI1MjI4OjI6ICggcnVsZVhTaG9ydENsb3N1cmUgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjY4MzM6MTogKCAoIHJ1bGVYU2hvcnRDbG9zdXJlICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjY4MzQ6MjogKCBydWxlWFNob3J0Q2xvc3VyZSApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNTIyODoyOiAoIHJ1bGVYU2hvcnRDbG9zdXJlICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI1MjI5OjM6IHJ1bGVYU2hvcnRDbG9zdXJlCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNjgzNDoyOiAoIHJ1bGVYU2hvcnRDbG9zdXJlICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI2ODM1OjM6IHJ1bGVYU2hvcnRDbG9zdXJlCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhDb25zdHJ1Y3RvckNhbGxBY2Nlc3MoKS5nZXRBcmd1bWVudHNYU2hvcnRDbG9zdXJlUGFyc2VyUnVsZUNhbGxfNF8xXzBfMCgpKTsgCkBAIC04MTkwMiwxNyArODcxMzEsMTcgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YQ29uc3RydWN0b3JDYWxsX19Bcmd1bWVudHNBc3NpZ25tZW50XzRfMV8xXzAiCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjUyMzg6MTogcnVsZV9fWENvbnN0cnVjdG9yQ2FsbF9fQXJndW1lbnRzQXNzaWdubWVudF80XzFfMV8wIDogKCBydWxlWEV4cHJlc3Npb24gKSA7CisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjY4NDQ6MTogcnVsZV9fWENvbnN0cnVjdG9yQ2FsbF9fQXJndW1lbnRzQXNzaWdubWVudF80XzFfMV8wIDogKCBydWxlWEV4cHJlc3Npb24gKSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fWENvbnN0cnVjdG9yQ2FsbF9fQXJndW1lbnRzQXNzaWdubWVudF80XzFfMV8wKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI1MjQyOjE6ICggKCBydWxlWEV4cHJlc3Npb24gKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNTI0MzoyOiAoIHJ1bGVYRXhwcmVzc2lvbiApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNjg0ODoxOiAoICggcnVsZVhFeHByZXNzaW9uICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjY4NDk6MjogKCBydWxlWEV4cHJlc3Npb24gKQogICAgICAgICAgICAgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjUyNDM6MjogKCBydWxlWEV4cHJlc3Npb24gKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjUyNDQ6MzogcnVsZVhFeHByZXNzaW9uCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNjg0OToyOiAoIHJ1bGVYRXhwcmVzc2lvbiApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNjg1MDozOiBydWxlWEV4cHJlc3Npb24KICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WENvbnN0cnVjdG9yQ2FsbEFjY2VzcygpLmdldEFyZ3VtZW50c1hFeHByZXNzaW9uUGFyc2VyUnVsZUNhbGxfNF8xXzFfMF8wKCkpOyAKQEAgLTgxOTQ3LDE3ICs4NzE3NiwxNyBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX1hDb25zdHJ1Y3RvckNhbGxfX0FyZ3VtZW50c0Fzc2lnbm1lbnRfNF8xXzFfMV8xIgotICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI1MjUzOjE6IHJ1bGVfX1hDb25zdHJ1Y3RvckNhbGxfX0FyZ3VtZW50c0Fzc2lnbm1lbnRfNF8xXzFfMV8xIDogKCBydWxlWEV4cHJlc3Npb24gKSA7CisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjY4NTk6MTogcnVsZV9fWENvbnN0cnVjdG9yQ2FsbF9fQXJndW1lbnRzQXNzaWdubWVudF80XzFfMV8xXzEgOiAoIHJ1bGVYRXhwcmVzc2lvbiApIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YQ29uc3RydWN0b3JDYWxsX19Bcmd1bWVudHNBc3NpZ25tZW50XzRfMV8xXzFfMSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNTI1NzoxOiAoICggcnVsZVhFeHByZXNzaW9uICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjUyNTg6MjogKCBydWxlWEV4cHJlc3Npb24gKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjY4NjM6MTogKCAoIHJ1bGVYRXhwcmVzc2lvbiApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI2ODY0OjI6ICggcnVsZVhFeHByZXNzaW9uICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI1MjU4OjI6ICggcnVsZVhFeHByZXNzaW9uICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI1MjU5OjM6IHJ1bGVYRXhwcmVzc2lvbgorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjY4NjQ6MjogKCBydWxlWEV4cHJlc3Npb24gKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjY4NjU6MzogcnVsZVhFeHByZXNzaW9uCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhDb25zdHJ1Y3RvckNhbGxBY2Nlc3MoKS5nZXRBcmd1bWVudHNYRXhwcmVzc2lvblBhcnNlclJ1bGVDYWxsXzRfMV8xXzFfMV8wKCkpOyAKQEAgLTgxOTkyLDE3ICs4NzIyMSwxNyBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX1hDb25zdHJ1Y3RvckNhbGxfX0FyZ3VtZW50c0Fzc2lnbm1lbnRfNSIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNTI2ODoxOiBydWxlX19YQ29uc3RydWN0b3JDYWxsX19Bcmd1bWVudHNBc3NpZ25tZW50XzUgOiAoIHJ1bGVYQ2xvc3VyZSApIDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNjg3NDoxOiBydWxlX19YQ29uc3RydWN0b3JDYWxsX19Bcmd1bWVudHNBc3NpZ25tZW50XzUgOiAoIHJ1bGVYQ2xvc3VyZSApIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YQ29uc3RydWN0b3JDYWxsX19Bcmd1bWVudHNBc3NpZ25tZW50XzUoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjUyNzI6MTogKCAoIHJ1bGVYQ2xvc3VyZSApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI1MjczOjI6ICggcnVsZVhDbG9zdXJlICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI2ODc4OjE6ICggKCBydWxlWENsb3N1cmUgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNjg3OToyOiAoIHJ1bGVYQ2xvc3VyZSApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNTI3MzoyOiAoIHJ1bGVYQ2xvc3VyZSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNTI3NDozOiBydWxlWENsb3N1cmUKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI2ODc5OjI6ICggcnVsZVhDbG9zdXJlICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI2ODgwOjM6IHJ1bGVYQ2xvc3VyZQogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYQ29uc3RydWN0b3JDYWxsQWNjZXNzKCkuZ2V0QXJndW1lbnRzWENsb3N1cmVQYXJzZXJSdWxlQ2FsbF81XzAoKSk7IApAQCAtODIwMzcsMjggKzg3MjY2LDI4IEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fWEJvb2xlYW5MaXRlcmFsX19Jc1RydWVBc3NpZ25tZW50XzFfMSIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNTI4MzoxOiBydWxlX19YQm9vbGVhbkxpdGVyYWxfX0lzVHJ1ZUFzc2lnbm1lbnRfMV8xIDogKCAoICd0cnVlJyApICkgOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI2ODg5OjE6IHJ1bGVfX1hCb29sZWFuTGl0ZXJhbF9fSXNUcnVlQXNzaWdubWVudF8xXzEgOiAoICggJ3RydWUnICkgKSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fWEJvb2xlYW5MaXRlcmFsX19Jc1RydWVBc3NpZ25tZW50XzFfMSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNTI4NzoxOiAoICggKCAndHJ1ZScgKSApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI1Mjg4OjI6ICggKCAndHJ1ZScgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNjg5MzoxOiAoICggKCAndHJ1ZScgKSApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI2ODk0OjI6ICggKCAndHJ1ZScgKSApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNTI4ODoyOiAoICggJ3RydWUnICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjUyODk6MzogKCAndHJ1ZScgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjY4OTQ6MjogKCAoICd0cnVlJyApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI2ODk1OjM6ICggJ3RydWUnICkKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WEJvb2xlYW5MaXRlcmFsQWNjZXNzKCkuZ2V0SXNUcnVlVHJ1ZUtleXdvcmRfMV8xXzAoKSk7IAogICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjUyOTA6MzogKCAndHJ1ZScgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjUyOTE6NDogJ3RydWUnCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNjg5NjozOiAoICd0cnVlJyApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNjg5Nzo0OiAndHJ1ZScKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WEJvb2xlYW5MaXRlcmFsQWNjZXNzKCkuZ2V0SXNUcnVlVHJ1ZUtleXdvcmRfMV8xXzAoKSk7IAogICAgICAgICAgICAgfQotICAgICAgICAgICAgbWF0Y2goaW5wdXQsMTU0LEZPTExPV18yKTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKKyAgICAgICAgICAgIG1hdGNoKGlucHV0LDE2NixGT0xMT1dfMik7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0WEJvb2xlYW5MaXRlcmFsQWNjZXNzKCkuZ2V0SXNUcnVlVHJ1ZUtleXdvcmRfMV8xXzAoKSk7IAogICAgICAgICAgICAgfQpAQCAtODIwOTAsMTcgKzg3MzE5LDE3IEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fWE51bWJlckxpdGVyYWxfX1ZhbHVlQXNzaWdubWVudF8xIgotICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI1MzAyOjE6IHJ1bGVfX1hOdW1iZXJMaXRlcmFsX19WYWx1ZUFzc2lnbm1lbnRfMSA6ICggcnVsZU51bWJlciApIDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNjkwODoxOiBydWxlX19YTnVtYmVyTGl0ZXJhbF9fVmFsdWVBc3NpZ25tZW50XzEgOiAoIHJ1bGVOdW1iZXIgKSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fWE51bWJlckxpdGVyYWxfX1ZhbHVlQXNzaWdubWVudF8xKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI1MzA2OjE6ICggKCBydWxlTnVtYmVyICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjUzMDc6MjogKCBydWxlTnVtYmVyICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI2OTEyOjE6ICggKCBydWxlTnVtYmVyICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjY5MTM6MjogKCBydWxlTnVtYmVyICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI1MzA3OjI6ICggcnVsZU51bWJlciApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNTMwODozOiBydWxlTnVtYmVyCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNjkxMzoyOiAoIHJ1bGVOdW1iZXIgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjY5MTQ6MzogcnVsZU51bWJlcgogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYTnVtYmVyTGl0ZXJhbEFjY2VzcygpLmdldFZhbHVlTnVtYmVyUGFyc2VyUnVsZUNhbGxfMV8wKCkpOyAKQEAgLTgyMTM1LDE3ICs4NzM2NCwxNyBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX1hTdHJpbmdMaXRlcmFsX19WYWx1ZUFzc2lnbm1lbnRfMSIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNTMxNzoxOiBydWxlX19YU3RyaW5nTGl0ZXJhbF9fVmFsdWVBc3NpZ25tZW50XzEgOiAoIFJVTEVfU1RSSU5HICkgOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI2OTIzOjE6IHJ1bGVfX1hTdHJpbmdMaXRlcmFsX19WYWx1ZUFzc2lnbm1lbnRfMSA6ICggUlVMRV9TVFJJTkcgKSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fWFN0cmluZ0xpdGVyYWxfX1ZhbHVlQXNzaWdubWVudF8xKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI1MzIxOjE6ICggKCBSVUxFX1NUUklORyApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI1MzIyOjI6ICggUlVMRV9TVFJJTkcgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjY5Mjc6MTogKCAoIFJVTEVfU1RSSU5HICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjY5Mjg6MjogKCBSVUxFX1NUUklORyApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNTMyMjoyOiAoIFJVTEVfU1RSSU5HICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI1MzIzOjM6IFJVTEVfU1RSSU5HCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNjkyODoyOiAoIFJVTEVfU1RSSU5HICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI2OTI5OjM6IFJVTEVfU1RSSU5HCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhTdHJpbmdMaXRlcmFsQWNjZXNzKCkuZ2V0VmFsdWVTVFJJTkdUZXJtaW5hbFJ1bGVDYWxsXzFfMCgpKTsgCkBAIC04MjE3NiwyMyArODc0MDUsMjMgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YVHlwZUxpdGVyYWxfX1R5cGVBc3NpZ25tZW50XzMiCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjUzMzI6MTogcnVsZV9fWFR5cGVMaXRlcmFsX19UeXBlQXNzaWdubWVudF8zIDogKCAoIHJ1bGVRdWFsaWZpZWROYW1lICkgKSA7CisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjY5Mzg6MTogcnVsZV9fWFR5cGVMaXRlcmFsX19UeXBlQXNzaWdubWVudF8zIDogKCAoIHJ1bGVRdWFsaWZpZWROYW1lICkgKSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fWFR5cGVMaXRlcmFsX19UeXBlQXNzaWdubWVudF8zKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI1MzM2OjE6ICggKCAoIHJ1bGVRdWFsaWZpZWROYW1lICkgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNTMzNzoyOiAoICggcnVsZVF1YWxpZmllZE5hbWUgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNjk0MjoxOiAoICggKCBydWxlUXVhbGlmaWVkTmFtZSApICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjY5NDM6MjogKCAoIHJ1bGVRdWFsaWZpZWROYW1lICkgKQogICAgICAgICAgICAgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjUzMzc6MjogKCAoIHJ1bGVRdWFsaWZpZWROYW1lICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjUzMzg6MzogKCBydWxlUXVhbGlmaWVkTmFtZSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNjk0MzoyOiAoICggcnVsZVF1YWxpZmllZE5hbWUgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNjk0NDozOiAoIHJ1bGVRdWFsaWZpZWROYW1lICkKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WFR5cGVMaXRlcmFsQWNjZXNzKCkuZ2V0VHlwZUp2bVR5cGVDcm9zc1JlZmVyZW5jZV8zXzAoKSk7IAogICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjUzMzk6MzogKCBydWxlUXVhbGlmaWVkTmFtZSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNTM0MDo0OiBydWxlUXVhbGlmaWVkTmFtZQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjY5NDU6MzogKCBydWxlUXVhbGlmaWVkTmFtZSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNjk0Njo0OiBydWxlUXVhbGlmaWVkTmFtZQogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYVHlwZUxpdGVyYWxBY2Nlc3MoKS5nZXRUeXBlSnZtVHlwZVF1YWxpZmllZE5hbWVQYXJzZXJSdWxlQ2FsbF8zXzBfMSgpKTsgCkBAIC04MjIzMywxNyArODc0NjIsMTcgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YVHlwZUxpdGVyYWxfX0FycmF5RGltZW5zaW9uc0Fzc2lnbm1lbnRfNCIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNTM1MToxOiBydWxlX19YVHlwZUxpdGVyYWxfX0FycmF5RGltZW5zaW9uc0Fzc2lnbm1lbnRfNCA6ICggcnVsZUFycmF5QnJhY2tldHMgKSA7CisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjY5NTc6MTogcnVsZV9fWFR5cGVMaXRlcmFsX19BcnJheURpbWVuc2lvbnNBc3NpZ25tZW50XzQgOiAoIHJ1bGVBcnJheUJyYWNrZXRzICkgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1hUeXBlTGl0ZXJhbF9fQXJyYXlEaW1lbnNpb25zQXNzaWdubWVudF80KCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI1MzU1OjE6ICggKCBydWxlQXJyYXlCcmFja2V0cyApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI1MzU2OjI6ICggcnVsZUFycmF5QnJhY2tldHMgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjY5NjE6MTogKCAoIHJ1bGVBcnJheUJyYWNrZXRzICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjY5NjI6MjogKCBydWxlQXJyYXlCcmFja2V0cyApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNTM1NjoyOiAoIHJ1bGVBcnJheUJyYWNrZXRzICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI1MzU3OjM6IHJ1bGVBcnJheUJyYWNrZXRzCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNjk2MjoyOiAoIHJ1bGVBcnJheUJyYWNrZXRzICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI2OTYzOjM6IHJ1bGVBcnJheUJyYWNrZXRzCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhUeXBlTGl0ZXJhbEFjY2VzcygpLmdldEFycmF5RGltZW5zaW9uc0FycmF5QnJhY2tldHNQYXJzZXJSdWxlQ2FsbF80XzAoKSk7IApAQCAtODIyNzgsMTcgKzg3NTA3LDE3IEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fWFRocm93RXhwcmVzc2lvbl9fRXhwcmVzc2lvbkFzc2lnbm1lbnRfMiIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNTM2NjoxOiBydWxlX19YVGhyb3dFeHByZXNzaW9uX19FeHByZXNzaW9uQXNzaWdubWVudF8yIDogKCBydWxlWEV4cHJlc3Npb24gKSA7CisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjY5NzI6MTogcnVsZV9fWFRocm93RXhwcmVzc2lvbl9fRXhwcmVzc2lvbkFzc2lnbm1lbnRfMiA6ICggcnVsZVhFeHByZXNzaW9uICkgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1hUaHJvd0V4cHJlc3Npb25fX0V4cHJlc3Npb25Bc3NpZ25tZW50XzIoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjUzNzA6MTogKCAoIHJ1bGVYRXhwcmVzc2lvbiApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI1MzcxOjI6ICggcnVsZVhFeHByZXNzaW9uICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI2OTc2OjE6ICggKCBydWxlWEV4cHJlc3Npb24gKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNjk3NzoyOiAoIHJ1bGVYRXhwcmVzc2lvbiApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNTM3MToyOiAoIHJ1bGVYRXhwcmVzc2lvbiApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNTM3MjozOiBydWxlWEV4cHJlc3Npb24KKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI2OTc3OjI6ICggcnVsZVhFeHByZXNzaW9uICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI2OTc4OjM6IHJ1bGVYRXhwcmVzc2lvbgogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYVGhyb3dFeHByZXNzaW9uQWNjZXNzKCkuZ2V0RXhwcmVzc2lvblhFeHByZXNzaW9uUGFyc2VyUnVsZUNhbGxfMl8wKCkpOyAKQEAgLTgyMzIzLDE3ICs4NzU1MiwxNyBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX1hSZXR1cm5FeHByZXNzaW9uX19FeHByZXNzaW9uQXNzaWdubWVudF8yIgotICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI1MzgxOjE6IHJ1bGVfX1hSZXR1cm5FeHByZXNzaW9uX19FeHByZXNzaW9uQXNzaWdubWVudF8yIDogKCBydWxlWEV4cHJlc3Npb24gKSA7CisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjY5ODc6MTogcnVsZV9fWFJldHVybkV4cHJlc3Npb25fX0V4cHJlc3Npb25Bc3NpZ25tZW50XzIgOiAoIHJ1bGVYRXhwcmVzc2lvbiApIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YUmV0dXJuRXhwcmVzc2lvbl9fRXhwcmVzc2lvbkFzc2lnbm1lbnRfMigpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNTM4NToxOiAoICggcnVsZVhFeHByZXNzaW9uICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjUzODY6MjogKCBydWxlWEV4cHJlc3Npb24gKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjY5OTE6MTogKCAoIHJ1bGVYRXhwcmVzc2lvbiApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI2OTkyOjI6ICggcnVsZVhFeHByZXNzaW9uICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI1Mzg2OjI6ICggcnVsZVhFeHByZXNzaW9uICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI1Mzg3OjM6IHJ1bGVYRXhwcmVzc2lvbgorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjY5OTI6MjogKCBydWxlWEV4cHJlc3Npb24gKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjY5OTM6MzogcnVsZVhFeHByZXNzaW9uCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhSZXR1cm5FeHByZXNzaW9uQWNjZXNzKCkuZ2V0RXhwcmVzc2lvblhFeHByZXNzaW9uUGFyc2VyUnVsZUNhbGxfMl8wKCkpOyAKQEAgLTgyMzY4LDE3ICs4NzU5NywxNyBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX1hUcnlDYXRjaEZpbmFsbHlFeHByZXNzaW9uX19FeHByZXNzaW9uQXNzaWdubWVudF8yIgotICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI1Mzk2OjE6IHJ1bGVfX1hUcnlDYXRjaEZpbmFsbHlFeHByZXNzaW9uX19FeHByZXNzaW9uQXNzaWdubWVudF8yIDogKCBydWxlWEV4cHJlc3Npb24gKSA7CisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjcwMDI6MTogcnVsZV9fWFRyeUNhdGNoRmluYWxseUV4cHJlc3Npb25fX0V4cHJlc3Npb25Bc3NpZ25tZW50XzIgOiAoIHJ1bGVYRXhwcmVzc2lvbiApIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YVHJ5Q2F0Y2hGaW5hbGx5RXhwcmVzc2lvbl9fRXhwcmVzc2lvbkFzc2lnbm1lbnRfMigpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNTQwMDoxOiAoICggcnVsZVhFeHByZXNzaW9uICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjU0MDE6MjogKCBydWxlWEV4cHJlc3Npb24gKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjcwMDY6MTogKCAoIHJ1bGVYRXhwcmVzc2lvbiApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI3MDA3OjI6ICggcnVsZVhFeHByZXNzaW9uICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI1NDAxOjI6ICggcnVsZVhFeHByZXNzaW9uICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI1NDAyOjM6IHJ1bGVYRXhwcmVzc2lvbgorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjcwMDc6MjogKCBydWxlWEV4cHJlc3Npb24gKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjcwMDg6MzogcnVsZVhFeHByZXNzaW9uCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhUcnlDYXRjaEZpbmFsbHlFeHByZXNzaW9uQWNjZXNzKCkuZ2V0RXhwcmVzc2lvblhFeHByZXNzaW9uUGFyc2VyUnVsZUNhbGxfMl8wKCkpOyAKQEAgLTgyNDEzLDE3ICs4NzY0MiwxNyBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX1hUcnlDYXRjaEZpbmFsbHlFeHByZXNzaW9uX19DYXRjaENsYXVzZXNBc3NpZ25tZW50XzNfMF8wIgotICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI1NDExOjE6IHJ1bGVfX1hUcnlDYXRjaEZpbmFsbHlFeHByZXNzaW9uX19DYXRjaENsYXVzZXNBc3NpZ25tZW50XzNfMF8wIDogKCBydWxlWENhdGNoQ2xhdXNlICkgOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI3MDE3OjE6IHJ1bGVfX1hUcnlDYXRjaEZpbmFsbHlFeHByZXNzaW9uX19DYXRjaENsYXVzZXNBc3NpZ25tZW50XzNfMF8wIDogKCBydWxlWENhdGNoQ2xhdXNlICkgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1hUcnlDYXRjaEZpbmFsbHlFeHByZXNzaW9uX19DYXRjaENsYXVzZXNBc3NpZ25tZW50XzNfMF8wKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI1NDE1OjE6ICggKCBydWxlWENhdGNoQ2xhdXNlICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjU0MTY6MjogKCBydWxlWENhdGNoQ2xhdXNlICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI3MDIxOjE6ICggKCBydWxlWENhdGNoQ2xhdXNlICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjcwMjI6MjogKCBydWxlWENhdGNoQ2xhdXNlICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI1NDE2OjI6ICggcnVsZVhDYXRjaENsYXVzZSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNTQxNzozOiBydWxlWENhdGNoQ2xhdXNlCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNzAyMjoyOiAoIHJ1bGVYQ2F0Y2hDbGF1c2UgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjcwMjM6MzogcnVsZVhDYXRjaENsYXVzZQogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYVHJ5Q2F0Y2hGaW5hbGx5RXhwcmVzc2lvbkFjY2VzcygpLmdldENhdGNoQ2xhdXNlc1hDYXRjaENsYXVzZVBhcnNlclJ1bGVDYWxsXzNfMF8wXzAoKSk7IApAQCAtODI0NTgsMTcgKzg3Njg3LDE3IEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fWFRyeUNhdGNoRmluYWxseUV4cHJlc3Npb25fX0ZpbmFsbHlFeHByZXNzaW9uQXNzaWdubWVudF8zXzBfMV8xIgotICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI1NDI2OjE6IHJ1bGVfX1hUcnlDYXRjaEZpbmFsbHlFeHByZXNzaW9uX19GaW5hbGx5RXhwcmVzc2lvbkFzc2lnbm1lbnRfM18wXzFfMSA6ICggcnVsZVhFeHByZXNzaW9uICkgOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI3MDMyOjE6IHJ1bGVfX1hUcnlDYXRjaEZpbmFsbHlFeHByZXNzaW9uX19GaW5hbGx5RXhwcmVzc2lvbkFzc2lnbm1lbnRfM18wXzFfMSA6ICggcnVsZVhFeHByZXNzaW9uICkgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1hUcnlDYXRjaEZpbmFsbHlFeHByZXNzaW9uX19GaW5hbGx5RXhwcmVzc2lvbkFzc2lnbm1lbnRfM18wXzFfMSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNTQzMDoxOiAoICggcnVsZVhFeHByZXNzaW9uICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjU0MzE6MjogKCBydWxlWEV4cHJlc3Npb24gKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjcwMzY6MTogKCAoIHJ1bGVYRXhwcmVzc2lvbiApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI3MDM3OjI6ICggcnVsZVhFeHByZXNzaW9uICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI1NDMxOjI6ICggcnVsZVhFeHByZXNzaW9uICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI1NDMyOjM6IHJ1bGVYRXhwcmVzc2lvbgorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjcwMzc6MjogKCBydWxlWEV4cHJlc3Npb24gKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjcwMzg6MzogcnVsZVhFeHByZXNzaW9uCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhUcnlDYXRjaEZpbmFsbHlFeHByZXNzaW9uQWNjZXNzKCkuZ2V0RmluYWxseUV4cHJlc3Npb25YRXhwcmVzc2lvblBhcnNlclJ1bGVDYWxsXzNfMF8xXzFfMCgpKTsgCkBAIC04MjUwMywxNyArODc3MzIsMTcgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YVHJ5Q2F0Y2hGaW5hbGx5RXhwcmVzc2lvbl9fRmluYWxseUV4cHJlc3Npb25Bc3NpZ25tZW50XzNfMV8xIgotICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI1NDQxOjE6IHJ1bGVfX1hUcnlDYXRjaEZpbmFsbHlFeHByZXNzaW9uX19GaW5hbGx5RXhwcmVzc2lvbkFzc2lnbm1lbnRfM18xXzEgOiAoIHJ1bGVYRXhwcmVzc2lvbiApIDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNzA0NzoxOiBydWxlX19YVHJ5Q2F0Y2hGaW5hbGx5RXhwcmVzc2lvbl9fRmluYWxseUV4cHJlc3Npb25Bc3NpZ25tZW50XzNfMV8xIDogKCBydWxlWEV4cHJlc3Npb24gKSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fWFRyeUNhdGNoRmluYWxseUV4cHJlc3Npb25fX0ZpbmFsbHlFeHByZXNzaW9uQXNzaWdubWVudF8zXzFfMSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNTQ0NToxOiAoICggcnVsZVhFeHByZXNzaW9uICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjU0NDY6MjogKCBydWxlWEV4cHJlc3Npb24gKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjcwNTE6MTogKCAoIHJ1bGVYRXhwcmVzc2lvbiApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI3MDUyOjI6ICggcnVsZVhFeHByZXNzaW9uICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI1NDQ2OjI6ICggcnVsZVhFeHByZXNzaW9uICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI1NDQ3OjM6IHJ1bGVYRXhwcmVzc2lvbgorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjcwNTI6MjogKCBydWxlWEV4cHJlc3Npb24gKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjcwNTM6MzogcnVsZVhFeHByZXNzaW9uCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhUcnlDYXRjaEZpbmFsbHlFeHByZXNzaW9uQWNjZXNzKCkuZ2V0RmluYWxseUV4cHJlc3Npb25YRXhwcmVzc2lvblBhcnNlclJ1bGVDYWxsXzNfMV8xXzAoKSk7IApAQCAtODI1NDgsMTcgKzg3Nzc3LDE3IEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fWFN5bmNocm9uaXplZEV4cHJlc3Npb25fX1BhcmFtQXNzaWdubWVudF8xIgotICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI1NDU2OjE6IHJ1bGVfX1hTeW5jaHJvbml6ZWRFeHByZXNzaW9uX19QYXJhbUFzc2lnbm1lbnRfMSA6ICggcnVsZVhFeHByZXNzaW9uICkgOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI3MDYyOjE6IHJ1bGVfX1hTeW5jaHJvbml6ZWRFeHByZXNzaW9uX19QYXJhbUFzc2lnbm1lbnRfMSA6ICggcnVsZVhFeHByZXNzaW9uICkgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1hTeW5jaHJvbml6ZWRFeHByZXNzaW9uX19QYXJhbUFzc2lnbm1lbnRfMSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNTQ2MDoxOiAoICggcnVsZVhFeHByZXNzaW9uICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjU0NjE6MjogKCBydWxlWEV4cHJlc3Npb24gKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjcwNjY6MTogKCAoIHJ1bGVYRXhwcmVzc2lvbiApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI3MDY3OjI6ICggcnVsZVhFeHByZXNzaW9uICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI1NDYxOjI6ICggcnVsZVhFeHByZXNzaW9uICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI1NDYyOjM6IHJ1bGVYRXhwcmVzc2lvbgorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjcwNjc6MjogKCBydWxlWEV4cHJlc3Npb24gKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjcwNjg6MzogcnVsZVhFeHByZXNzaW9uCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhTeW5jaHJvbml6ZWRFeHByZXNzaW9uQWNjZXNzKCkuZ2V0UGFyYW1YRXhwcmVzc2lvblBhcnNlclJ1bGVDYWxsXzFfMCgpKTsgCkBAIC04MjU5MywxNyArODc4MjIsMTcgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YU3luY2hyb25pemVkRXhwcmVzc2lvbl9fRXhwcmVzc2lvbkFzc2lnbm1lbnRfMyIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNTQ3MToxOiBydWxlX19YU3luY2hyb25pemVkRXhwcmVzc2lvbl9fRXhwcmVzc2lvbkFzc2lnbm1lbnRfMyA6ICggcnVsZVhFeHByZXNzaW9uICkgOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI3MDc3OjE6IHJ1bGVfX1hTeW5jaHJvbml6ZWRFeHByZXNzaW9uX19FeHByZXNzaW9uQXNzaWdubWVudF8zIDogKCBydWxlWEV4cHJlc3Npb24gKSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fWFN5bmNocm9uaXplZEV4cHJlc3Npb25fX0V4cHJlc3Npb25Bc3NpZ25tZW50XzMoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjU0NzU6MTogKCAoIHJ1bGVYRXhwcmVzc2lvbiApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI1NDc2OjI6ICggcnVsZVhFeHByZXNzaW9uICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI3MDgxOjE6ICggKCBydWxlWEV4cHJlc3Npb24gKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNzA4MjoyOiAoIHJ1bGVYRXhwcmVzc2lvbiApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNTQ3NjoyOiAoIHJ1bGVYRXhwcmVzc2lvbiApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNTQ3NzozOiBydWxlWEV4cHJlc3Npb24KKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI3MDgyOjI6ICggcnVsZVhFeHByZXNzaW9uICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI3MDgzOjM6IHJ1bGVYRXhwcmVzc2lvbgogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYU3luY2hyb25pemVkRXhwcmVzc2lvbkFjY2VzcygpLmdldEV4cHJlc3Npb25YRXhwcmVzc2lvblBhcnNlclJ1bGVDYWxsXzNfMCgpKTsgCkBAIC04MjYzOCwxNyArODc4NjcsMTcgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YQ2F0Y2hDbGF1c2VfX0RlY2xhcmVkUGFyYW1Bc3NpZ25tZW50XzIiCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjU0ODY6MTogcnVsZV9fWENhdGNoQ2xhdXNlX19EZWNsYXJlZFBhcmFtQXNzaWdubWVudF8yIDogKCBydWxlRnVsbEp2bUZvcm1hbFBhcmFtZXRlciApIDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNzA5MjoxOiBydWxlX19YQ2F0Y2hDbGF1c2VfX0RlY2xhcmVkUGFyYW1Bc3NpZ25tZW50XzIgOiAoIHJ1bGVGdWxsSnZtRm9ybWFsUGFyYW1ldGVyICkgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1hDYXRjaENsYXVzZV9fRGVjbGFyZWRQYXJhbUFzc2lnbm1lbnRfMigpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNTQ5MDoxOiAoICggcnVsZUZ1bGxKdm1Gb3JtYWxQYXJhbWV0ZXIgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNTQ5MToyOiAoIHJ1bGVGdWxsSnZtRm9ybWFsUGFyYW1ldGVyICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI3MDk2OjE6ICggKCBydWxlRnVsbEp2bUZvcm1hbFBhcmFtZXRlciApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI3MDk3OjI6ICggcnVsZUZ1bGxKdm1Gb3JtYWxQYXJhbWV0ZXIgKQogICAgICAgICAgICAgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjU0OTE6MjogKCBydWxlRnVsbEp2bUZvcm1hbFBhcmFtZXRlciApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNTQ5MjozOiBydWxlRnVsbEp2bUZvcm1hbFBhcmFtZXRlcgorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjcwOTc6MjogKCBydWxlRnVsbEp2bUZvcm1hbFBhcmFtZXRlciApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNzA5ODozOiBydWxlRnVsbEp2bUZvcm1hbFBhcmFtZXRlcgogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYQ2F0Y2hDbGF1c2VBY2Nlc3MoKS5nZXREZWNsYXJlZFBhcmFtRnVsbEp2bUZvcm1hbFBhcmFtZXRlclBhcnNlclJ1bGVDYWxsXzJfMCgpKTsgCkBAIC04MjY4MywxNyArODc5MTIsMTcgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YQ2F0Y2hDbGF1c2VfX0V4cHJlc3Npb25Bc3NpZ25tZW50XzQiCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjU1MDE6MTogcnVsZV9fWENhdGNoQ2xhdXNlX19FeHByZXNzaW9uQXNzaWdubWVudF80IDogKCBydWxlWEV4cHJlc3Npb24gKSA7CisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjcxMDc6MTogcnVsZV9fWENhdGNoQ2xhdXNlX19FeHByZXNzaW9uQXNzaWdubWVudF80IDogKCBydWxlWEV4cHJlc3Npb24gKSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fWENhdGNoQ2xhdXNlX19FeHByZXNzaW9uQXNzaWdubWVudF80KCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI1NTA1OjE6ICggKCBydWxlWEV4cHJlc3Npb24gKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNTUwNjoyOiAoIHJ1bGVYRXhwcmVzc2lvbiApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNzExMToxOiAoICggcnVsZVhFeHByZXNzaW9uICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjcxMTI6MjogKCBydWxlWEV4cHJlc3Npb24gKQogICAgICAgICAgICAgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjU1MDY6MjogKCBydWxlWEV4cHJlc3Npb24gKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjU1MDc6MzogcnVsZVhFeHByZXNzaW9uCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNzExMjoyOiAoIHJ1bGVYRXhwcmVzc2lvbiApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNzExMzozOiBydWxlWEV4cHJlc3Npb24KICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WENhdGNoQ2xhdXNlQWNjZXNzKCkuZ2V0RXhwcmVzc2lvblhFeHByZXNzaW9uUGFyc2VyUnVsZUNhbGxfNF8wKCkpOyAKQEAgLTgyNzI4LDE3ICs4Nzk1NywxNyBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX1hGdW5jdGlvblR5cGVSZWZfX1BhcmFtVHlwZXNBc3NpZ25tZW50XzBfMV8wIgotICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI1NTE2OjE6IHJ1bGVfX1hGdW5jdGlvblR5cGVSZWZfX1BhcmFtVHlwZXNBc3NpZ25tZW50XzBfMV8wIDogKCBydWxlSnZtVHlwZVJlZmVyZW5jZSApIDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNzEyMjoxOiBydWxlX19YRnVuY3Rpb25UeXBlUmVmX19QYXJhbVR5cGVzQXNzaWdubWVudF8wXzFfMCA6ICggcnVsZUp2bVR5cGVSZWZlcmVuY2UgKSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fWEZ1bmN0aW9uVHlwZVJlZl9fUGFyYW1UeXBlc0Fzc2lnbm1lbnRfMF8xXzAoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjU1MjA6MTogKCAoIHJ1bGVKdm1UeXBlUmVmZXJlbmNlICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjU1MjE6MjogKCBydWxlSnZtVHlwZVJlZmVyZW5jZSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNzEyNjoxOiAoICggcnVsZUp2bVR5cGVSZWZlcmVuY2UgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNzEyNzoyOiAoIHJ1bGVKdm1UeXBlUmVmZXJlbmNlICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI1NTIxOjI6ICggcnVsZUp2bVR5cGVSZWZlcmVuY2UgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjU1MjI6MzogcnVsZUp2bVR5cGVSZWZlcmVuY2UKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI3MTI3OjI6ICggcnVsZUp2bVR5cGVSZWZlcmVuY2UgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjcxMjg6MzogcnVsZUp2bVR5cGVSZWZlcmVuY2UKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WEZ1bmN0aW9uVHlwZVJlZkFjY2VzcygpLmdldFBhcmFtVHlwZXNKdm1UeXBlUmVmZXJlbmNlUGFyc2VyUnVsZUNhbGxfMF8xXzBfMCgpKTsgCkBAIC04Mjc3MywxNyArODgwMDIsMTcgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YRnVuY3Rpb25UeXBlUmVmX19QYXJhbVR5cGVzQXNzaWdubWVudF8wXzFfMV8xIgotICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI1NTMxOjE6IHJ1bGVfX1hGdW5jdGlvblR5cGVSZWZfX1BhcmFtVHlwZXNBc3NpZ25tZW50XzBfMV8xXzEgOiAoIHJ1bGVKdm1UeXBlUmVmZXJlbmNlICkgOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI3MTM3OjE6IHJ1bGVfX1hGdW5jdGlvblR5cGVSZWZfX1BhcmFtVHlwZXNBc3NpZ25tZW50XzBfMV8xXzEgOiAoIHJ1bGVKdm1UeXBlUmVmZXJlbmNlICkgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1hGdW5jdGlvblR5cGVSZWZfX1BhcmFtVHlwZXNBc3NpZ25tZW50XzBfMV8xXzEoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjU1MzU6MTogKCAoIHJ1bGVKdm1UeXBlUmVmZXJlbmNlICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjU1MzY6MjogKCBydWxlSnZtVHlwZVJlZmVyZW5jZSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNzE0MToxOiAoICggcnVsZUp2bVR5cGVSZWZlcmVuY2UgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNzE0MjoyOiAoIHJ1bGVKdm1UeXBlUmVmZXJlbmNlICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI1NTM2OjI6ICggcnVsZUp2bVR5cGVSZWZlcmVuY2UgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjU1Mzc6MzogcnVsZUp2bVR5cGVSZWZlcmVuY2UKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI3MTQyOjI6ICggcnVsZUp2bVR5cGVSZWZlcmVuY2UgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjcxNDM6MzogcnVsZUp2bVR5cGVSZWZlcmVuY2UKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WEZ1bmN0aW9uVHlwZVJlZkFjY2VzcygpLmdldFBhcmFtVHlwZXNKdm1UeXBlUmVmZXJlbmNlUGFyc2VyUnVsZUNhbGxfMF8xXzFfMV8wKCkpOyAKQEAgLTgyODE4LDE3ICs4ODA0NywxNyBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX1hGdW5jdGlvblR5cGVSZWZfX1JldHVyblR5cGVBc3NpZ25tZW50XzIiCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjU1NDY6MTogcnVsZV9fWEZ1bmN0aW9uVHlwZVJlZl9fUmV0dXJuVHlwZUFzc2lnbm1lbnRfMiA6ICggcnVsZUp2bVR5cGVSZWZlcmVuY2UgKSA7CisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjcxNTI6MTogcnVsZV9fWEZ1bmN0aW9uVHlwZVJlZl9fUmV0dXJuVHlwZUFzc2lnbm1lbnRfMiA6ICggcnVsZUp2bVR5cGVSZWZlcmVuY2UgKSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fWEZ1bmN0aW9uVHlwZVJlZl9fUmV0dXJuVHlwZUFzc2lnbm1lbnRfMigpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNTU1MDoxOiAoICggcnVsZUp2bVR5cGVSZWZlcmVuY2UgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNTU1MToyOiAoIHJ1bGVKdm1UeXBlUmVmZXJlbmNlICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI3MTU2OjE6ICggKCBydWxlSnZtVHlwZVJlZmVyZW5jZSApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI3MTU3OjI6ICggcnVsZUp2bVR5cGVSZWZlcmVuY2UgKQogICAgICAgICAgICAgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjU1NTE6MjogKCBydWxlSnZtVHlwZVJlZmVyZW5jZSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNTU1MjozOiBydWxlSnZtVHlwZVJlZmVyZW5jZQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjcxNTc6MjogKCBydWxlSnZtVHlwZVJlZmVyZW5jZSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNzE1ODozOiBydWxlSnZtVHlwZVJlZmVyZW5jZQogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYRnVuY3Rpb25UeXBlUmVmQWNjZXNzKCkuZ2V0UmV0dXJuVHlwZUp2bVR5cGVSZWZlcmVuY2VQYXJzZXJSdWxlQ2FsbF8yXzAoKSk7IApAQCAtODI4NjMsMjMgKzg4MDkyLDIzIEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fSnZtUGFyYW1ldGVyaXplZFR5cGVSZWZlcmVuY2VfX1R5cGVBc3NpZ25tZW50XzAiCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjU1NjE6MTogcnVsZV9fSnZtUGFyYW1ldGVyaXplZFR5cGVSZWZlcmVuY2VfX1R5cGVBc3NpZ25tZW50XzAgOiAoICggcnVsZVF1YWxpZmllZE5hbWUgKSApIDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNzE2NzoxOiBydWxlX19Kdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZV9fVHlwZUFzc2lnbm1lbnRfMCA6ICggKCBydWxlUXVhbGlmaWVkTmFtZSApICkgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX0p2bVBhcmFtZXRlcml6ZWRUeXBlUmVmZXJlbmNlX19UeXBlQXNzaWdubWVudF8wKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI1NTY1OjE6ICggKCAoIHJ1bGVRdWFsaWZpZWROYW1lICkgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNTU2NjoyOiAoICggcnVsZVF1YWxpZmllZE5hbWUgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNzE3MToxOiAoICggKCBydWxlUXVhbGlmaWVkTmFtZSApICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjcxNzI6MjogKCAoIHJ1bGVRdWFsaWZpZWROYW1lICkgKQogICAgICAgICAgICAgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjU1NjY6MjogKCAoIHJ1bGVRdWFsaWZpZWROYW1lICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjU1Njc6MzogKCBydWxlUXVhbGlmaWVkTmFtZSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNzE3MjoyOiAoICggcnVsZVF1YWxpZmllZE5hbWUgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNzE3MzozOiAoIHJ1bGVRdWFsaWZpZWROYW1lICkKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0SnZtUGFyYW1ldGVyaXplZFR5cGVSZWZlcmVuY2VBY2Nlc3MoKS5nZXRUeXBlSnZtVHlwZUNyb3NzUmVmZXJlbmNlXzBfMCgpKTsgCiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNTU2ODozOiAoIHJ1bGVRdWFsaWZpZWROYW1lICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI1NTY5OjQ6IHJ1bGVRdWFsaWZpZWROYW1lCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNzE3NDozOiAoIHJ1bGVRdWFsaWZpZWROYW1lICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI3MTc1OjQ6IHJ1bGVRdWFsaWZpZWROYW1lCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldEp2bVBhcmFtZXRlcml6ZWRUeXBlUmVmZXJlbmNlQWNjZXNzKCkuZ2V0VHlwZUp2bVR5cGVRdWFsaWZpZWROYW1lUGFyc2VyUnVsZUNhbGxfMF8wXzEoKSk7IApAQCAtODI5MjAsMTcgKzg4MTQ5LDE3IEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fSnZtUGFyYW1ldGVyaXplZFR5cGVSZWZlcmVuY2VfX0FyZ3VtZW50c0Fzc2lnbm1lbnRfMV8xIgotICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI1NTgwOjE6IHJ1bGVfX0p2bVBhcmFtZXRlcml6ZWRUeXBlUmVmZXJlbmNlX19Bcmd1bWVudHNBc3NpZ25tZW50XzFfMSA6ICggcnVsZUp2bUFyZ3VtZW50VHlwZVJlZmVyZW5jZSApIDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNzE4NjoxOiBydWxlX19Kdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZV9fQXJndW1lbnRzQXNzaWdubWVudF8xXzEgOiAoIHJ1bGVKdm1Bcmd1bWVudFR5cGVSZWZlcmVuY2UgKSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fSnZtUGFyYW1ldGVyaXplZFR5cGVSZWZlcmVuY2VfX0FyZ3VtZW50c0Fzc2lnbm1lbnRfMV8xKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI1NTg0OjE6ICggKCBydWxlSnZtQXJndW1lbnRUeXBlUmVmZXJlbmNlICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjU1ODU6MjogKCBydWxlSnZtQXJndW1lbnRUeXBlUmVmZXJlbmNlICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI3MTkwOjE6ICggKCBydWxlSnZtQXJndW1lbnRUeXBlUmVmZXJlbmNlICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjcxOTE6MjogKCBydWxlSnZtQXJndW1lbnRUeXBlUmVmZXJlbmNlICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI1NTg1OjI6ICggcnVsZUp2bUFyZ3VtZW50VHlwZVJlZmVyZW5jZSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNTU4NjozOiBydWxlSnZtQXJndW1lbnRUeXBlUmVmZXJlbmNlCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNzE5MToyOiAoIHJ1bGVKdm1Bcmd1bWVudFR5cGVSZWZlcmVuY2UgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjcxOTI6MzogcnVsZUp2bUFyZ3VtZW50VHlwZVJlZmVyZW5jZQogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRKdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZUFjY2VzcygpLmdldEFyZ3VtZW50c0p2bUFyZ3VtZW50VHlwZVJlZmVyZW5jZVBhcnNlclJ1bGVDYWxsXzFfMV8wKCkpOyAKQEAgLTgyOTY1LDE3ICs4ODE5NCwxNyBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX0p2bVBhcmFtZXRlcml6ZWRUeXBlUmVmZXJlbmNlX19Bcmd1bWVudHNBc3NpZ25tZW50XzFfMl8xIgotICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI1NTk1OjE6IHJ1bGVfX0p2bVBhcmFtZXRlcml6ZWRUeXBlUmVmZXJlbmNlX19Bcmd1bWVudHNBc3NpZ25tZW50XzFfMl8xIDogKCBydWxlSnZtQXJndW1lbnRUeXBlUmVmZXJlbmNlICkgOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI3MjAxOjE6IHJ1bGVfX0p2bVBhcmFtZXRlcml6ZWRUeXBlUmVmZXJlbmNlX19Bcmd1bWVudHNBc3NpZ25tZW50XzFfMl8xIDogKCBydWxlSnZtQXJndW1lbnRUeXBlUmVmZXJlbmNlICkgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX0p2bVBhcmFtZXRlcml6ZWRUeXBlUmVmZXJlbmNlX19Bcmd1bWVudHNBc3NpZ25tZW50XzFfMl8xKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI1NTk5OjE6ICggKCBydWxlSnZtQXJndW1lbnRUeXBlUmVmZXJlbmNlICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjU2MDA6MjogKCBydWxlSnZtQXJndW1lbnRUeXBlUmVmZXJlbmNlICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI3MjA1OjE6ICggKCBydWxlSnZtQXJndW1lbnRUeXBlUmVmZXJlbmNlICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjcyMDY6MjogKCBydWxlSnZtQXJndW1lbnRUeXBlUmVmZXJlbmNlICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI1NjAwOjI6ICggcnVsZUp2bUFyZ3VtZW50VHlwZVJlZmVyZW5jZSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNTYwMTozOiBydWxlSnZtQXJndW1lbnRUeXBlUmVmZXJlbmNlCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNzIwNjoyOiAoIHJ1bGVKdm1Bcmd1bWVudFR5cGVSZWZlcmVuY2UgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjcyMDc6MzogcnVsZUp2bUFyZ3VtZW50VHlwZVJlZmVyZW5jZQogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRKdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZUFjY2VzcygpLmdldEFyZ3VtZW50c0p2bUFyZ3VtZW50VHlwZVJlZmVyZW5jZVBhcnNlclJ1bGVDYWxsXzFfMl8xXzAoKSk7IApAQCAtODMwMTAsMjMgKzg4MjM5LDIzIEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fSnZtUGFyYW1ldGVyaXplZFR5cGVSZWZlcmVuY2VfX1R5cGVBc3NpZ25tZW50XzFfNF8xIgotICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI1NjEwOjE6IHJ1bGVfX0p2bVBhcmFtZXRlcml6ZWRUeXBlUmVmZXJlbmNlX19UeXBlQXNzaWdubWVudF8xXzRfMSA6ICggKCBydWxlVmFsaWRJRCApICkgOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI3MjE2OjE6IHJ1bGVfX0p2bVBhcmFtZXRlcml6ZWRUeXBlUmVmZXJlbmNlX19UeXBlQXNzaWdubWVudF8xXzRfMSA6ICggKCBydWxlVmFsaWRJRCApICkgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX0p2bVBhcmFtZXRlcml6ZWRUeXBlUmVmZXJlbmNlX19UeXBlQXNzaWdubWVudF8xXzRfMSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNTYxNDoxOiAoICggKCBydWxlVmFsaWRJRCApICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjU2MTU6MjogKCAoIHJ1bGVWYWxpZElEICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjcyMjA6MTogKCAoICggcnVsZVZhbGlkSUQgKSApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI3MjIxOjI6ICggKCBydWxlVmFsaWRJRCApICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI1NjE1OjI6ICggKCBydWxlVmFsaWRJRCApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI1NjE2OjM6ICggcnVsZVZhbGlkSUQgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjcyMjE6MjogKCAoIHJ1bGVWYWxpZElEICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjcyMjI6MzogKCBydWxlVmFsaWRJRCApCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldEp2bVBhcmFtZXRlcml6ZWRUeXBlUmVmZXJlbmNlQWNjZXNzKCkuZ2V0VHlwZUp2bVR5cGVDcm9zc1JlZmVyZW5jZV8xXzRfMV8wKCkpOyAKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI1NjE3OjM6ICggcnVsZVZhbGlkSUQgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjU2MTg6NDogcnVsZVZhbGlkSUQKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI3MjIzOjM6ICggcnVsZVZhbGlkSUQgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjcyMjQ6NDogcnVsZVZhbGlkSUQKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0SnZtUGFyYW1ldGVyaXplZFR5cGVSZWZlcmVuY2VBY2Nlc3MoKS5nZXRUeXBlSnZtVHlwZVZhbGlkSURQYXJzZXJSdWxlQ2FsbF8xXzRfMV8wXzEoKSk7IApAQCAtODMwNjcsMTcgKzg4Mjk2LDE3IEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fSnZtUGFyYW1ldGVyaXplZFR5cGVSZWZlcmVuY2VfX0FyZ3VtZW50c0Fzc2lnbm1lbnRfMV80XzJfMSIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNTYyOToxOiBydWxlX19Kdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZV9fQXJndW1lbnRzQXNzaWdubWVudF8xXzRfMl8xIDogKCBydWxlSnZtQXJndW1lbnRUeXBlUmVmZXJlbmNlICkgOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI3MjM1OjE6IHJ1bGVfX0p2bVBhcmFtZXRlcml6ZWRUeXBlUmVmZXJlbmNlX19Bcmd1bWVudHNBc3NpZ25tZW50XzFfNF8yXzEgOiAoIHJ1bGVKdm1Bcmd1bWVudFR5cGVSZWZlcmVuY2UgKSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fSnZtUGFyYW1ldGVyaXplZFR5cGVSZWZlcmVuY2VfX0FyZ3VtZW50c0Fzc2lnbm1lbnRfMV80XzJfMSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNTYzMzoxOiAoICggcnVsZUp2bUFyZ3VtZW50VHlwZVJlZmVyZW5jZSApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI1NjM0OjI6ICggcnVsZUp2bUFyZ3VtZW50VHlwZVJlZmVyZW5jZSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNzIzOToxOiAoICggcnVsZUp2bUFyZ3VtZW50VHlwZVJlZmVyZW5jZSApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI3MjQwOjI6ICggcnVsZUp2bUFyZ3VtZW50VHlwZVJlZmVyZW5jZSApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNTYzNDoyOiAoIHJ1bGVKdm1Bcmd1bWVudFR5cGVSZWZlcmVuY2UgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjU2MzU6MzogcnVsZUp2bUFyZ3VtZW50VHlwZVJlZmVyZW5jZQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjcyNDA6MjogKCBydWxlSnZtQXJndW1lbnRUeXBlUmVmZXJlbmNlICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI3MjQxOjM6IHJ1bGVKdm1Bcmd1bWVudFR5cGVSZWZlcmVuY2UKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0SnZtUGFyYW1ldGVyaXplZFR5cGVSZWZlcmVuY2VBY2Nlc3MoKS5nZXRBcmd1bWVudHNKdm1Bcmd1bWVudFR5cGVSZWZlcmVuY2VQYXJzZXJSdWxlQ2FsbF8xXzRfMl8xXzAoKSk7IApAQCAtODMxMTIsMTcgKzg4MzQxLDE3IEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fSnZtUGFyYW1ldGVyaXplZFR5cGVSZWZlcmVuY2VfX0FyZ3VtZW50c0Fzc2lnbm1lbnRfMV80XzJfMl8xIgotICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI1NjQ0OjE6IHJ1bGVfX0p2bVBhcmFtZXRlcml6ZWRUeXBlUmVmZXJlbmNlX19Bcmd1bWVudHNBc3NpZ25tZW50XzFfNF8yXzJfMSA6ICggcnVsZUp2bUFyZ3VtZW50VHlwZVJlZmVyZW5jZSApIDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNzI1MDoxOiBydWxlX19Kdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZV9fQXJndW1lbnRzQXNzaWdubWVudF8xXzRfMl8yXzEgOiAoIHJ1bGVKdm1Bcmd1bWVudFR5cGVSZWZlcmVuY2UgKSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fSnZtUGFyYW1ldGVyaXplZFR5cGVSZWZlcmVuY2VfX0FyZ3VtZW50c0Fzc2lnbm1lbnRfMV80XzJfMl8xKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI1NjQ4OjE6ICggKCBydWxlSnZtQXJndW1lbnRUeXBlUmVmZXJlbmNlICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjU2NDk6MjogKCBydWxlSnZtQXJndW1lbnRUeXBlUmVmZXJlbmNlICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI3MjU0OjE6ICggKCBydWxlSnZtQXJndW1lbnRUeXBlUmVmZXJlbmNlICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjcyNTU6MjogKCBydWxlSnZtQXJndW1lbnRUeXBlUmVmZXJlbmNlICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI1NjQ5OjI6ICggcnVsZUp2bUFyZ3VtZW50VHlwZVJlZmVyZW5jZSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNTY1MDozOiBydWxlSnZtQXJndW1lbnRUeXBlUmVmZXJlbmNlCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNzI1NToyOiAoIHJ1bGVKdm1Bcmd1bWVudFR5cGVSZWZlcmVuY2UgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjcyNTY6MzogcnVsZUp2bUFyZ3VtZW50VHlwZVJlZmVyZW5jZQogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRKdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZUFjY2VzcygpLmdldEFyZ3VtZW50c0p2bUFyZ3VtZW50VHlwZVJlZmVyZW5jZVBhcnNlclJ1bGVDYWxsXzFfNF8yXzJfMV8wKCkpOyAKQEAgLTgzMTU3LDE3ICs4ODM4NiwxNyBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX0p2bVdpbGRjYXJkVHlwZVJlZmVyZW5jZV9fQ29uc3RyYWludHNBc3NpZ25tZW50XzJfMF8wIgotICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI1NjU5OjE6IHJ1bGVfX0p2bVdpbGRjYXJkVHlwZVJlZmVyZW5jZV9fQ29uc3RyYWludHNBc3NpZ25tZW50XzJfMF8wIDogKCBydWxlSnZtVXBwZXJCb3VuZCApIDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNzI2NToxOiBydWxlX19Kdm1XaWxkY2FyZFR5cGVSZWZlcmVuY2VfX0NvbnN0cmFpbnRzQXNzaWdubWVudF8yXzBfMCA6ICggcnVsZUp2bVVwcGVyQm91bmQgKSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fSnZtV2lsZGNhcmRUeXBlUmVmZXJlbmNlX19Db25zdHJhaW50c0Fzc2lnbm1lbnRfMl8wXzAoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjU2NjM6MTogKCAoIHJ1bGVKdm1VcHBlckJvdW5kICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjU2NjQ6MjogKCBydWxlSnZtVXBwZXJCb3VuZCApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNzI2OToxOiAoICggcnVsZUp2bVVwcGVyQm91bmQgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNzI3MDoyOiAoIHJ1bGVKdm1VcHBlckJvdW5kICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI1NjY0OjI6ICggcnVsZUp2bVVwcGVyQm91bmQgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjU2NjU6MzogcnVsZUp2bVVwcGVyQm91bmQKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI3MjcwOjI6ICggcnVsZUp2bVVwcGVyQm91bmQgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjcyNzE6MzogcnVsZUp2bVVwcGVyQm91bmQKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0SnZtV2lsZGNhcmRUeXBlUmVmZXJlbmNlQWNjZXNzKCkuZ2V0Q29uc3RyYWludHNKdm1VcHBlckJvdW5kUGFyc2VyUnVsZUNhbGxfMl8wXzBfMCgpKTsgCkBAIC04MzIwMiwxNyArODg0MzEsMTcgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19Kdm1XaWxkY2FyZFR5cGVSZWZlcmVuY2VfX0NvbnN0cmFpbnRzQXNzaWdubWVudF8yXzBfMSIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNTY3NDoxOiBydWxlX19Kdm1XaWxkY2FyZFR5cGVSZWZlcmVuY2VfX0NvbnN0cmFpbnRzQXNzaWdubWVudF8yXzBfMSA6ICggcnVsZUp2bVVwcGVyQm91bmRBbmRlZCApIDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNzI4MDoxOiBydWxlX19Kdm1XaWxkY2FyZFR5cGVSZWZlcmVuY2VfX0NvbnN0cmFpbnRzQXNzaWdubWVudF8yXzBfMSA6ICggcnVsZUp2bVVwcGVyQm91bmRBbmRlZCApIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19Kdm1XaWxkY2FyZFR5cGVSZWZlcmVuY2VfX0NvbnN0cmFpbnRzQXNzaWdubWVudF8yXzBfMSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNTY3ODoxOiAoICggcnVsZUp2bVVwcGVyQm91bmRBbmRlZCApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI1Njc5OjI6ICggcnVsZUp2bVVwcGVyQm91bmRBbmRlZCApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNzI4NDoxOiAoICggcnVsZUp2bVVwcGVyQm91bmRBbmRlZCApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI3Mjg1OjI6ICggcnVsZUp2bVVwcGVyQm91bmRBbmRlZCApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNTY3OToyOiAoIHJ1bGVKdm1VcHBlckJvdW5kQW5kZWQgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjU2ODA6MzogcnVsZUp2bVVwcGVyQm91bmRBbmRlZAorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjcyODU6MjogKCBydWxlSnZtVXBwZXJCb3VuZEFuZGVkICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI3Mjg2OjM6IHJ1bGVKdm1VcHBlckJvdW5kQW5kZWQKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0SnZtV2lsZGNhcmRUeXBlUmVmZXJlbmNlQWNjZXNzKCkuZ2V0Q29uc3RyYWludHNKdm1VcHBlckJvdW5kQW5kZWRQYXJzZXJSdWxlQ2FsbF8yXzBfMV8wKCkpOyAKQEAgLTgzMjQ3LDE3ICs4ODQ3NiwxNyBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX0p2bVdpbGRjYXJkVHlwZVJlZmVyZW5jZV9fQ29uc3RyYWludHNBc3NpZ25tZW50XzJfMV8wIgotICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI1Njg5OjE6IHJ1bGVfX0p2bVdpbGRjYXJkVHlwZVJlZmVyZW5jZV9fQ29uc3RyYWludHNBc3NpZ25tZW50XzJfMV8wIDogKCBydWxlSnZtTG93ZXJCb3VuZCApIDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNzI5NToxOiBydWxlX19Kdm1XaWxkY2FyZFR5cGVSZWZlcmVuY2VfX0NvbnN0cmFpbnRzQXNzaWdubWVudF8yXzFfMCA6ICggcnVsZUp2bUxvd2VyQm91bmQgKSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fSnZtV2lsZGNhcmRUeXBlUmVmZXJlbmNlX19Db25zdHJhaW50c0Fzc2lnbm1lbnRfMl8xXzAoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjU2OTM6MTogKCAoIHJ1bGVKdm1Mb3dlckJvdW5kICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjU2OTQ6MjogKCBydWxlSnZtTG93ZXJCb3VuZCApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNzI5OToxOiAoICggcnVsZUp2bUxvd2VyQm91bmQgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNzMwMDoyOiAoIHJ1bGVKdm1Mb3dlckJvdW5kICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI1Njk0OjI6ICggcnVsZUp2bUxvd2VyQm91bmQgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjU2OTU6MzogcnVsZUp2bUxvd2VyQm91bmQKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI3MzAwOjI6ICggcnVsZUp2bUxvd2VyQm91bmQgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjczMDE6MzogcnVsZUp2bUxvd2VyQm91bmQKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0SnZtV2lsZGNhcmRUeXBlUmVmZXJlbmNlQWNjZXNzKCkuZ2V0Q29uc3RyYWludHNKdm1Mb3dlckJvdW5kUGFyc2VyUnVsZUNhbGxfMl8xXzBfMCgpKTsgCkBAIC04MzI5MiwxNyArODg1MjEsMTcgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19Kdm1XaWxkY2FyZFR5cGVSZWZlcmVuY2VfX0NvbnN0cmFpbnRzQXNzaWdubWVudF8yXzFfMSIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNTcwNDoxOiBydWxlX19Kdm1XaWxkY2FyZFR5cGVSZWZlcmVuY2VfX0NvbnN0cmFpbnRzQXNzaWdubWVudF8yXzFfMSA6ICggcnVsZUp2bUxvd2VyQm91bmRBbmRlZCApIDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNzMxMDoxOiBydWxlX19Kdm1XaWxkY2FyZFR5cGVSZWZlcmVuY2VfX0NvbnN0cmFpbnRzQXNzaWdubWVudF8yXzFfMSA6ICggcnVsZUp2bUxvd2VyQm91bmRBbmRlZCApIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19Kdm1XaWxkY2FyZFR5cGVSZWZlcmVuY2VfX0NvbnN0cmFpbnRzQXNzaWdubWVudF8yXzFfMSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNTcwODoxOiAoICggcnVsZUp2bUxvd2VyQm91bmRBbmRlZCApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI1NzA5OjI6ICggcnVsZUp2bUxvd2VyQm91bmRBbmRlZCApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNzMxNDoxOiAoICggcnVsZUp2bUxvd2VyQm91bmRBbmRlZCApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI3MzE1OjI6ICggcnVsZUp2bUxvd2VyQm91bmRBbmRlZCApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNTcwOToyOiAoIHJ1bGVKdm1Mb3dlckJvdW5kQW5kZWQgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjU3MTA6MzogcnVsZUp2bUxvd2VyQm91bmRBbmRlZAorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjczMTU6MjogKCBydWxlSnZtTG93ZXJCb3VuZEFuZGVkICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI3MzE2OjM6IHJ1bGVKdm1Mb3dlckJvdW5kQW5kZWQKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0SnZtV2lsZGNhcmRUeXBlUmVmZXJlbmNlQWNjZXNzKCkuZ2V0Q29uc3RyYWludHNKdm1Mb3dlckJvdW5kQW5kZWRQYXJzZXJSdWxlQ2FsbF8yXzFfMV8wKCkpOyAKQEAgLTgzMzM3LDE3ICs4ODU2NiwxNyBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX0p2bVVwcGVyQm91bmRfX1R5cGVSZWZlcmVuY2VBc3NpZ25tZW50XzEiCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjU3MTk6MTogcnVsZV9fSnZtVXBwZXJCb3VuZF9fVHlwZVJlZmVyZW5jZUFzc2lnbm1lbnRfMSA6ICggcnVsZUp2bVR5cGVSZWZlcmVuY2UgKSA7CisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjczMjU6MTogcnVsZV9fSnZtVXBwZXJCb3VuZF9fVHlwZVJlZmVyZW5jZUFzc2lnbm1lbnRfMSA6ICggcnVsZUp2bVR5cGVSZWZlcmVuY2UgKSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fSnZtVXBwZXJCb3VuZF9fVHlwZVJlZmVyZW5jZUFzc2lnbm1lbnRfMSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNTcyMzoxOiAoICggcnVsZUp2bVR5cGVSZWZlcmVuY2UgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNTcyNDoyOiAoIHJ1bGVKdm1UeXBlUmVmZXJlbmNlICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI3MzI5OjE6ICggKCBydWxlSnZtVHlwZVJlZmVyZW5jZSApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI3MzMwOjI6ICggcnVsZUp2bVR5cGVSZWZlcmVuY2UgKQogICAgICAgICAgICAgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjU3MjQ6MjogKCBydWxlSnZtVHlwZVJlZmVyZW5jZSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNTcyNTozOiBydWxlSnZtVHlwZVJlZmVyZW5jZQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjczMzA6MjogKCBydWxlSnZtVHlwZVJlZmVyZW5jZSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNzMzMTozOiBydWxlSnZtVHlwZVJlZmVyZW5jZQogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRKdm1VcHBlckJvdW5kQWNjZXNzKCkuZ2V0VHlwZVJlZmVyZW5jZUp2bVR5cGVSZWZlcmVuY2VQYXJzZXJSdWxlQ2FsbF8xXzAoKSk7IApAQCAtODMzODIsMTcgKzg4NjExLDE3IEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fSnZtVXBwZXJCb3VuZEFuZGVkX19UeXBlUmVmZXJlbmNlQXNzaWdubWVudF8xIgotICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI1NzM0OjE6IHJ1bGVfX0p2bVVwcGVyQm91bmRBbmRlZF9fVHlwZVJlZmVyZW5jZUFzc2lnbm1lbnRfMSA6ICggcnVsZUp2bVR5cGVSZWZlcmVuY2UgKSA7CisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjczNDA6MTogcnVsZV9fSnZtVXBwZXJCb3VuZEFuZGVkX19UeXBlUmVmZXJlbmNlQXNzaWdubWVudF8xIDogKCBydWxlSnZtVHlwZVJlZmVyZW5jZSApIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19Kdm1VcHBlckJvdW5kQW5kZWRfX1R5cGVSZWZlcmVuY2VBc3NpZ25tZW50XzEoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjU3Mzg6MTogKCAoIHJ1bGVKdm1UeXBlUmVmZXJlbmNlICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjU3Mzk6MjogKCBydWxlSnZtVHlwZVJlZmVyZW5jZSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNzM0NDoxOiAoICggcnVsZUp2bVR5cGVSZWZlcmVuY2UgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNzM0NToyOiAoIHJ1bGVKdm1UeXBlUmVmZXJlbmNlICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI1NzM5OjI6ICggcnVsZUp2bVR5cGVSZWZlcmVuY2UgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjU3NDA6MzogcnVsZUp2bVR5cGVSZWZlcmVuY2UKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI3MzQ1OjI6ICggcnVsZUp2bVR5cGVSZWZlcmVuY2UgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjczNDY6MzogcnVsZUp2bVR5cGVSZWZlcmVuY2UKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0SnZtVXBwZXJCb3VuZEFuZGVkQWNjZXNzKCkuZ2V0VHlwZVJlZmVyZW5jZUp2bVR5cGVSZWZlcmVuY2VQYXJzZXJSdWxlQ2FsbF8xXzAoKSk7IApAQCAtODM0MjcsMTcgKzg4NjU2LDE3IEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fSnZtTG93ZXJCb3VuZF9fVHlwZVJlZmVyZW5jZUFzc2lnbm1lbnRfMSIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNTc0OToxOiBydWxlX19Kdm1Mb3dlckJvdW5kX19UeXBlUmVmZXJlbmNlQXNzaWdubWVudF8xIDogKCBydWxlSnZtVHlwZVJlZmVyZW5jZSApIDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNzM1NToxOiBydWxlX19Kdm1Mb3dlckJvdW5kX19UeXBlUmVmZXJlbmNlQXNzaWdubWVudF8xIDogKCBydWxlSnZtVHlwZVJlZmVyZW5jZSApIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19Kdm1Mb3dlckJvdW5kX19UeXBlUmVmZXJlbmNlQXNzaWdubWVudF8xKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI1NzUzOjE6ICggKCBydWxlSnZtVHlwZVJlZmVyZW5jZSApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI1NzU0OjI6ICggcnVsZUp2bVR5cGVSZWZlcmVuY2UgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjczNTk6MTogKCAoIHJ1bGVKdm1UeXBlUmVmZXJlbmNlICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjczNjA6MjogKCBydWxlSnZtVHlwZVJlZmVyZW5jZSApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNTc1NDoyOiAoIHJ1bGVKdm1UeXBlUmVmZXJlbmNlICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI1NzU1OjM6IHJ1bGVKdm1UeXBlUmVmZXJlbmNlCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNzM2MDoyOiAoIHJ1bGVKdm1UeXBlUmVmZXJlbmNlICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI3MzYxOjM6IHJ1bGVKdm1UeXBlUmVmZXJlbmNlCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldEp2bUxvd2VyQm91bmRBY2Nlc3MoKS5nZXRUeXBlUmVmZXJlbmNlSnZtVHlwZVJlZmVyZW5jZVBhcnNlclJ1bGVDYWxsXzFfMCgpKTsgCkBAIC04MzQ3MiwxNyArODg3MDEsMTcgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19Kdm1Mb3dlckJvdW5kQW5kZWRfX1R5cGVSZWZlcmVuY2VBc3NpZ25tZW50XzEiCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjU3NjQ6MTogcnVsZV9fSnZtTG93ZXJCb3VuZEFuZGVkX19UeXBlUmVmZXJlbmNlQXNzaWdubWVudF8xIDogKCBydWxlSnZtVHlwZVJlZmVyZW5jZSApIDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNzM3MDoxOiBydWxlX19Kdm1Mb3dlckJvdW5kQW5kZWRfX1R5cGVSZWZlcmVuY2VBc3NpZ25tZW50XzEgOiAoIHJ1bGVKdm1UeXBlUmVmZXJlbmNlICkgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX0p2bUxvd2VyQm91bmRBbmRlZF9fVHlwZVJlZmVyZW5jZUFzc2lnbm1lbnRfMSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNTc2ODoxOiAoICggcnVsZUp2bVR5cGVSZWZlcmVuY2UgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNTc2OToyOiAoIHJ1bGVKdm1UeXBlUmVmZXJlbmNlICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI3Mzc0OjE6ICggKCBydWxlSnZtVHlwZVJlZmVyZW5jZSApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI3Mzc1OjI6ICggcnVsZUp2bVR5cGVSZWZlcmVuY2UgKQogICAgICAgICAgICAgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjU3Njk6MjogKCBydWxlSnZtVHlwZVJlZmVyZW5jZSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNTc3MDozOiBydWxlSnZtVHlwZVJlZmVyZW5jZQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjczNzU6MjogKCBydWxlSnZtVHlwZVJlZmVyZW5jZSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNzM3NjozOiBydWxlSnZtVHlwZVJlZmVyZW5jZQogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRKdm1Mb3dlckJvdW5kQW5kZWRBY2Nlc3MoKS5nZXRUeXBlUmVmZXJlbmNlSnZtVHlwZVJlZmVyZW5jZVBhcnNlclJ1bGVDYWxsXzFfMCgpKTsgCkBAIC04MzUxNywxNyArODg3NDYsMTcgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YSW1wb3J0U2VjdGlvbl9fSW1wb3J0RGVjbGFyYXRpb25zQXNzaWdubWVudCIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNTc3OToxOiBydWxlX19YSW1wb3J0U2VjdGlvbl9fSW1wb3J0RGVjbGFyYXRpb25zQXNzaWdubWVudCA6ICggcnVsZVhJbXBvcnREZWNsYXJhdGlvbiApIDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNzM4NToxOiBydWxlX19YSW1wb3J0U2VjdGlvbl9fSW1wb3J0RGVjbGFyYXRpb25zQXNzaWdubWVudCA6ICggcnVsZVhJbXBvcnREZWNsYXJhdGlvbiApIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YSW1wb3J0U2VjdGlvbl9fSW1wb3J0RGVjbGFyYXRpb25zQXNzaWdubWVudCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNTc4MzoxOiAoICggcnVsZVhJbXBvcnREZWNsYXJhdGlvbiApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI1Nzg0OjI6ICggcnVsZVhJbXBvcnREZWNsYXJhdGlvbiApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNzM4OToxOiAoICggcnVsZVhJbXBvcnREZWNsYXJhdGlvbiApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI3MzkwOjI6ICggcnVsZVhJbXBvcnREZWNsYXJhdGlvbiApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNTc4NDoyOiAoIHJ1bGVYSW1wb3J0RGVjbGFyYXRpb24gKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjU3ODU6MzogcnVsZVhJbXBvcnREZWNsYXJhdGlvbgorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjczOTA6MjogKCBydWxlWEltcG9ydERlY2xhcmF0aW9uICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI3MzkxOjM6IHJ1bGVYSW1wb3J0RGVjbGFyYXRpb24KICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WEltcG9ydFNlY3Rpb25BY2Nlc3MoKS5nZXRJbXBvcnREZWNsYXJhdGlvbnNYSW1wb3J0RGVjbGFyYXRpb25QYXJzZXJSdWxlQ2FsbF8wKCkpOyAKQEAgLTgzNTYwLDE5ICs4ODc4OSwxOSBAQAogICAgIH0KICAgICAvLyAkQU5UTFIgZW5kICJydWxlX19YSW1wb3J0U2VjdGlvbl9fSW1wb3J0RGVjbGFyYXRpb25zQXNzaWdubWVudCIKIAotICAgIC8vICRBTlRMUiBzdGFydCBzeW5wcmVkMTFfSW50ZXJuYWxEYXRhRFNMCi0gICAgcHVibGljIGZpbmFsIHZvaWQgc3lucHJlZDExX0ludGVybmFsRGF0YURTTF9mcmFnbWVudCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7ICAgCi0gICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI4NTU6MjogKCAoICggcnVsZV9fWEFubm90YXRpb25fX0dyb3VwXzNfMV8wX18wICkgKSApCi0gICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI4NTU6MjogKCAoIHJ1bGVfX1hBbm5vdGF0aW9uX19Hcm91cF8zXzFfMF9fMCApICkKKyAgICAvLyAkQU5UTFIgc3RhcnQgc3lucHJlZDEyX0ludGVybmFsRGF0YURTTAorICAgIHB1YmxpYyBmaW5hbCB2b2lkIHN5bnByZWQxMl9JbnRlcm5hbERhdGFEU0xfZnJhZ21lbnQoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geyAgIAorICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzozMDA4OjI6ICggKCAoIHJ1bGVfX1hBbm5vdGF0aW9uX19Hcm91cF8zXzFfMF9fMCApICkgKQorICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzozMDA4OjI6ICggKCBydWxlX19YQW5ub3RhdGlvbl9fR3JvdXBfM18xXzBfXzAgKSApCiAgICAgICAgIHsKLSAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6Mjg1NToyOiAoICggcnVsZV9fWEFubm90YXRpb25fX0dyb3VwXzNfMV8wX18wICkgKQotICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyODU2OjM6ICggcnVsZV9fWEFubm90YXRpb25fX0dyb3VwXzNfMV8wX18wICkKKyAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MzAwODoyOiAoICggcnVsZV9fWEFubm90YXRpb25fX0dyb3VwXzNfMV8wX18wICkgKQorICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzozMDA5OjM6ICggcnVsZV9fWEFubm90YXRpb25fX0dyb3VwXzNfMV8wX18wICkKICAgICAgICAgewogICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WEFubm90YXRpb25BY2Nlc3MoKS5nZXRHcm91cF8zXzFfMCgpKTsgCiAgICAgICAgIH0KLSAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6Mjg1NzozOiAoIHJ1bGVfX1hBbm5vdGF0aW9uX19Hcm91cF8zXzFfMF9fMCApCi0gICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI4NTc6NDogcnVsZV9fWEFubm90YXRpb25fX0dyb3VwXzNfMV8wX18wCisgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjMwMTA6MzogKCBydWxlX19YQW5ub3RhdGlvbl9fR3JvdXBfM18xXzBfXzAgKQorICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzozMDEwOjQ6IHJ1bGVfX1hBbm5vdGF0aW9uX19Hcm91cF8zXzFfMF9fMAogICAgICAgICB7CiAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzIpOwogICAgICAgICBydWxlX19YQW5ub3RhdGlvbl9fR3JvdXBfM18xXzBfXzAoKTsKQEAgLTgzNTg4LDUxICs4ODgxNyw1MSBAQAogCiAgICAgICAgIH0KICAgICB9Ci0gICAgLy8gJEFOVExSIGVuZCBzeW5wcmVkMTFfSW50ZXJuYWxEYXRhRFNMCi0KLSAgICAvLyAkQU5UTFIgc3RhcnQgc3lucHJlZDEyX0ludGVybmFsRGF0YURTTAotICAgIHB1YmxpYyBmaW5hbCB2b2lkIHN5bnByZWQxMl9JbnRlcm5hbERhdGFEU0xfZnJhZ21lbnQoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geyAgIAotICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyODc2OjI6ICggKCAoIHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RfX0dyb3VwXzBfXzAgKSApICkKLSAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6Mjg3NjoyOiAoICggcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdF9fR3JvdXBfMF9fMCApICkKLSAgICAgICAgewotICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyODc2OjI6ICggKCBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0X19Hcm91cF8wX18wICkgKQotICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyODc3OjM6ICggcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdF9fR3JvdXBfMF9fMCApCi0gICAgICAgIHsKLSAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7Ci0gICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RBY2Nlc3MoKS5nZXRHcm91cF8wKCkpOyAKLSAgICAgICAgfQotICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyODc4OjM6ICggcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdF9fR3JvdXBfMF9fMCApCi0gICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI4Nzg6NDogcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdF9fR3JvdXBfMF9fMAotICAgICAgICB7Ci0gICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzIpOwotICAgICAgICBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0X19Hcm91cF8wX18wKCk7Ci0KLSAgICAgICAgc3RhdGUuX2ZzcC0tOwotICAgICAgICBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOwotCi0gICAgICAgIH0KLQotCi0gICAgICAgIH0KLQotCi0gICAgICAgIH0KLSAgICB9CiAgICAgLy8gJEFOVExSIGVuZCBzeW5wcmVkMTJfSW50ZXJuYWxEYXRhRFNMCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgc3lucHJlZDEzX0ludGVybmFsRGF0YURTTAogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHN5bnByZWQxM19JbnRlcm5hbERhdGFEU0xfZnJhZ21lbnQoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geyAgIAotICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyODk3OjI6ICggKCAoIHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlX19Hcm91cF8wX18wICkgKSApCi0gICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI4OTc6MjogKCAoIHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlX19Hcm91cF8wX18wICkgKQorICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzozMDI5OjI6ICggKCAoIHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RfX0dyb3VwXzBfXzAgKSApICkKKyAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MzAyOToyOiAoICggcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdF9fR3JvdXBfMF9fMCApICkKICAgICAgICAgewotICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyODk3OjI6ICggKCBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZV9fR3JvdXBfMF9fMCApICkKLSAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6Mjg5ODozOiAoIHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlX19Hcm91cF8wX18wICkKKyAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MzAyOToyOiAoICggcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdF9fR3JvdXBfMF9fMCApICkKKyAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MzAzMDozOiAoIHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RfX0dyb3VwXzBfXzAgKQorICAgICAgICB7CisgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0QWNjZXNzKCkuZ2V0R3JvdXBfMCgpKTsgCisgICAgICAgIH0KKyAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MzAzMTozOiAoIHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RfX0dyb3VwXzBfXzAgKQorICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzozMDMxOjQ6IHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RfX0dyb3VwXzBfXzAKKyAgICAgICAgeworICAgICAgICBwdXNoRm9sbG93KEZPTExPV18yKTsKKyAgICAgICAgcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdF9fR3JvdXBfMF9fMCgpOworCisgICAgICAgIHN0YXRlLl9mc3AtLTsKKyAgICAgICAgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKKworICAgICAgICB9CisKKworICAgICAgICB9CisKKworICAgICAgICB9CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgc3lucHJlZDEzX0ludGVybmFsRGF0YURTTAorCisgICAgLy8gJEFOVExSIHN0YXJ0IHN5bnByZWQxNF9JbnRlcm5hbERhdGFEU0wKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBzeW5wcmVkMTRfSW50ZXJuYWxEYXRhRFNMX2ZyYWdtZW50KCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsgICAKKyAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MzA1MDoyOiAoICggKCBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZV9fR3JvdXBfMF9fMCApICkgKQorICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzozMDUwOjI6ICggKCBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZV9fR3JvdXBfMF9fMCApICkKKyAgICAgICAgeworICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzozMDUwOjI6ICggKCBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZV9fR3JvdXBfMF9fMCApICkKKyAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MzA1MTozOiAoIHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlX19Hcm91cF8wX18wICkKICAgICAgICAgewogICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WEFubm90YXRpb25FbGVtZW50VmFsdWVBY2Nlc3MoKS5nZXRHcm91cF8wKCkpOyAKICAgICAgICAgfQotICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyODk5OjM6ICggcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVfX0dyb3VwXzBfXzAgKQotICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyODk5OjQ6IHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlX19Hcm91cF8wX18wCisgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjMwNTI6MzogKCBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZV9fR3JvdXBfMF9fMCApCisgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjMwNTI6NDogcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVfX0dyb3VwXzBfXzAKICAgICAgICAgewogICAgICAgICBwdXNoRm9sbG93KEZPTExPV18yKTsKICAgICAgICAgcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVfX0dyb3VwXzBfXzAoKTsKQEAgLTgzNjQ4LDIxICs4ODg3NywyMSBAQAogCiAgICAgICAgIH0KICAgICB9Ci0gICAgLy8gJEFOVExSIGVuZCBzeW5wcmVkMTNfSW50ZXJuYWxEYXRhRFNMCisgICAgLy8gJEFOVExSIGVuZCBzeW5wcmVkMTRfSW50ZXJuYWxEYXRhRFNMCiAKLSAgICAvLyAkQU5UTFIgc3RhcnQgc3lucHJlZDM4X0ludGVybmFsRGF0YURTTAotICAgIHB1YmxpYyBmaW5hbCB2b2lkIHN5bnByZWQzOF9JbnRlcm5hbERhdGFEU0xfZnJhZ21lbnQoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geyAgIAotICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzozMTgyOjI6ICggKCAoIHJ1bGVfX09wT3RoZXJfX0dyb3VwXzZfMV8wX18wICkgKSApCi0gICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjMxODI6MjogKCAoIHJ1bGVfX09wT3RoZXJfX0dyb3VwXzZfMV8wX18wICkgKQorICAgIC8vICRBTlRMUiBzdGFydCBzeW5wcmVkMzlfSW50ZXJuYWxEYXRhRFNMCisgICAgcHVibGljIGZpbmFsIHZvaWQgc3lucHJlZDM5X0ludGVybmFsRGF0YURTTF9mcmFnbWVudCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7ICAgCisgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjMzMzU6MjogKCAoICggcnVsZV9fT3BPdGhlcl9fR3JvdXBfNl8xXzBfXzAgKSApICkKKyAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MzMzNToyOiAoICggcnVsZV9fT3BPdGhlcl9fR3JvdXBfNl8xXzBfXzAgKSApCiAgICAgICAgIHsKLSAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MzE4MjoyOiAoICggcnVsZV9fT3BPdGhlcl9fR3JvdXBfNl8xXzBfXzAgKSApCi0gICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjMxODM6MzogKCBydWxlX19PcE90aGVyX19Hcm91cF82XzFfMF9fMCApCisgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjMzMzU6MjogKCAoIHJ1bGVfX09wT3RoZXJfX0dyb3VwXzZfMV8wX18wICkgKQorICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzozMzM2OjM6ICggcnVsZV9fT3BPdGhlcl9fR3JvdXBfNl8xXzBfXzAgKQogICAgICAgICB7CiAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRPcE90aGVyQWNjZXNzKCkuZ2V0R3JvdXBfNl8xXzAoKSk7IAogICAgICAgICB9Ci0gICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjMxODQ6MzogKCBydWxlX19PcE90aGVyX19Hcm91cF82XzFfMF9fMCApCi0gICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjMxODQ6NDogcnVsZV9fT3BPdGhlcl9fR3JvdXBfNl8xXzBfXzAKKyAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MzMzNzozOiAoIHJ1bGVfX09wT3RoZXJfX0dyb3VwXzZfMV8wX18wICkKKyAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MzMzNzo0OiBydWxlX19PcE90aGVyX19Hcm91cF82XzFfMF9fMAogICAgICAgICB7CiAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzIpOwogICAgICAgICBydWxlX19PcE90aGVyX19Hcm91cF82XzFfMF9fMCgpOwpAQCAtODM2NzgsMTUgKzg4OTA3LDE1IEBACiAKICAgICAgICAgfQogICAgIH0KLSAgICAvLyAkQU5UTFIgZW5kIHN5bnByZWQzOF9JbnRlcm5hbERhdGFEU0wKKyAgICAvLyAkQU5UTFIgZW5kIHN5bnByZWQzOV9JbnRlcm5hbERhdGFEU0wKIAotICAgIC8vICRBTlRMUiBzdGFydCBzeW5wcmVkMzlfSW50ZXJuYWxEYXRhRFNMCi0gICAgcHVibGljIGZpbmFsIHZvaWQgc3lucHJlZDM5X0ludGVybmFsRGF0YURTTF9mcmFnbWVudCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7ICAgCi0gICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjMxODg6MjogKCAoICc8JyApICkKLSAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MzE4ODoyOiAoICc8JyApCisgICAgLy8gJEFOVExSIHN0YXJ0IHN5bnByZWQ0MF9JbnRlcm5hbERhdGFEU0wKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBzeW5wcmVkNDBfSW50ZXJuYWxEYXRhRFNMX2ZyYWdtZW50KCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsgICAKKyAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MzM0MToyOiAoICggJzwnICkgKQorICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzozMzQxOjI6ICggJzwnICkKICAgICAgICAgewotICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzozMTg4OjI6ICggJzwnICkKLSAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MzE4OTozOiAnPCcKKyAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MzM0MToyOiAoICc8JyApCisgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjMzNDI6MzogJzwnCiAgICAgICAgIHsKICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldE9wT3RoZXJBY2Nlc3MoKS5nZXRMZXNzVGhhblNpZ25LZXl3b3JkXzZfMV8xKCkpOyAKQEAgLTgzNjk4LDIxICs4ODkyNywyMSBAQAogCiAgICAgICAgIH0KICAgICB9Ci0gICAgLy8gJEFOVExSIGVuZCBzeW5wcmVkMzlfSW50ZXJuYWxEYXRhRFNMCisgICAgLy8gJEFOVExSIGVuZCBzeW5wcmVkNDBfSW50ZXJuYWxEYXRhRFNMCiAKLSAgICAvLyAkQU5UTFIgc3RhcnQgc3lucHJlZDUyX0ludGVybmFsRGF0YURTTAotICAgIHB1YmxpYyBmaW5hbCB2b2lkIHN5bnByZWQ1Ml9JbnRlcm5hbERhdGFEU0xfZnJhZ21lbnQoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geyAgIAotICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzozNDAxOjI6ICggKCAoIHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fTWVtYmVyQ2FsbEFyZ3VtZW50c0Fzc2lnbm1lbnRfMV8xXzNfMV8wICkgKSApCi0gICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjM0MDE6MjogKCAoIHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fTWVtYmVyQ2FsbEFyZ3VtZW50c0Fzc2lnbm1lbnRfMV8xXzNfMV8wICkgKQorICAgIC8vICRBTlRMUiBzdGFydCBzeW5wcmVkNTNfSW50ZXJuYWxEYXRhRFNMCisgICAgcHVibGljIGZpbmFsIHZvaWQgc3lucHJlZDUzX0ludGVybmFsRGF0YURTTF9mcmFnbWVudCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7ICAgCisgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjM1NTQ6MjogKCAoICggcnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19NZW1iZXJDYWxsQXJndW1lbnRzQXNzaWdubWVudF8xXzFfM18xXzAgKSApICkKKyAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MzU1NDoyOiAoICggcnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19NZW1iZXJDYWxsQXJndW1lbnRzQXNzaWdubWVudF8xXzFfM18xXzAgKSApCiAgICAgICAgIHsKLSAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MzQwMToyOiAoICggcnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19NZW1iZXJDYWxsQXJndW1lbnRzQXNzaWdubWVudF8xXzFfM18xXzAgKSApCi0gICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjM0MDI6MzogKCBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX01lbWJlckNhbGxBcmd1bWVudHNBc3NpZ25tZW50XzFfMV8zXzFfMCApCisgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjM1NTQ6MjogKCAoIHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fTWVtYmVyQ2FsbEFyZ3VtZW50c0Fzc2lnbm1lbnRfMV8xXzNfMV8wICkgKQorICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzozNTU1OjM6ICggcnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19NZW1iZXJDYWxsQXJndW1lbnRzQXNzaWdubWVudF8xXzFfM18xXzAgKQogICAgICAgICB7CiAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYTWVtYmVyRmVhdHVyZUNhbGxBY2Nlc3MoKS5nZXRNZW1iZXJDYWxsQXJndW1lbnRzQXNzaWdubWVudF8xXzFfM18xXzAoKSk7IAogICAgICAgICB9Ci0gICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjM0MDM6MzogKCBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX01lbWJlckNhbGxBcmd1bWVudHNBc3NpZ25tZW50XzFfMV8zXzFfMCApCi0gICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjM0MDM6NDogcnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19NZW1iZXJDYWxsQXJndW1lbnRzQXNzaWdubWVudF8xXzFfM18xXzAKKyAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MzU1NjozOiAoIHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fTWVtYmVyQ2FsbEFyZ3VtZW50c0Fzc2lnbm1lbnRfMV8xXzNfMV8wICkKKyAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MzU1Njo0OiBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX01lbWJlckNhbGxBcmd1bWVudHNBc3NpZ25tZW50XzFfMV8zXzFfMAogICAgICAgICB7CiAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzIpOwogICAgICAgICBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX01lbWJlckNhbGxBcmd1bWVudHNBc3NpZ25tZW50XzFfMV8zXzFfMCgpOwpAQCAtODM3MjgsMjEgKzg4OTU3LDIxIEBACiAKICAgICAgICAgfQogICAgIH0KLSAgICAvLyAkQU5UTFIgZW5kIHN5bnByZWQ1Ml9JbnRlcm5hbERhdGFEU0wKKyAgICAvLyAkQU5UTFIgZW5kIHN5bnByZWQ1M19JbnRlcm5hbERhdGFEU0wKIAotICAgIC8vICRBTlRMUiBzdGFydCBzeW5wcmVkNjBfSW50ZXJuYWxEYXRhRFNMCi0gICAgcHVibGljIGZpbmFsIHZvaWQgc3lucHJlZDYwX0ludGVybmFsRGF0YURTTF9mcmFnbWVudCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7ICAgCi0gICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjM0NjQ6MjogKCAoICggcnVsZVhGb3JMb29wRXhwcmVzc2lvbiApICkgKQotICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzozNDY0OjI6ICggKCBydWxlWEZvckxvb3BFeHByZXNzaW9uICkgKQorICAgIC8vICRBTlRMUiBzdGFydCBzeW5wcmVkNjFfSW50ZXJuYWxEYXRhRFNMCisgICAgcHVibGljIGZpbmFsIHZvaWQgc3lucHJlZDYxX0ludGVybmFsRGF0YURTTF9mcmFnbWVudCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7ICAgCisgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjM2MTc6MjogKCAoICggcnVsZVhGb3JMb29wRXhwcmVzc2lvbiApICkgKQorICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzozNjE3OjI6ICggKCBydWxlWEZvckxvb3BFeHByZXNzaW9uICkgKQogICAgICAgICB7Ci0gICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjM0NjQ6MjogKCAoIHJ1bGVYRm9yTG9vcEV4cHJlc3Npb24gKSApCi0gICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjM0NjU6MzogKCBydWxlWEZvckxvb3BFeHByZXNzaW9uICkKKyAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MzYxNzoyOiAoICggcnVsZVhGb3JMb29wRXhwcmVzc2lvbiApICkKKyAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MzYxODozOiAoIHJ1bGVYRm9yTG9vcEV4cHJlc3Npb24gKQogICAgICAgICB7CiAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYUHJpbWFyeUV4cHJlc3Npb25BY2Nlc3MoKS5nZXRYRm9yTG9vcEV4cHJlc3Npb25QYXJzZXJSdWxlQ2FsbF83KCkpOyAKICAgICAgICAgfQotICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzozNDY2OjM6ICggcnVsZVhGb3JMb29wRXhwcmVzc2lvbiApCi0gICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjM0NjY6NDogcnVsZVhGb3JMb29wRXhwcmVzc2lvbgorICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzozNjE5OjM6ICggcnVsZVhGb3JMb29wRXhwcmVzc2lvbiApCisgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjM2MTk6NDogcnVsZVhGb3JMb29wRXhwcmVzc2lvbgogICAgICAgICB7CiAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzIpOwogICAgICAgICBydWxlWEZvckxvb3BFeHByZXNzaW9uKCk7CkBAIC04Mzc1OCwxNSArODg5ODcsMTUgQEAKIAogICAgICAgICB9CiAgICAgfQotICAgIC8vICRBTlRMUiBlbmQgc3lucHJlZDYwX0ludGVybmFsRGF0YURTTAorICAgIC8vICRBTlRMUiBlbmQgc3lucHJlZDYxX0ludGVybmFsRGF0YURTTAogCi0gICAgLy8gJEFOVExSIHN0YXJ0IHN5bnByZWQ2MV9JbnRlcm5hbERhdGFEU0wKLSAgICBwdWJsaWMgZmluYWwgdm9pZCBzeW5wcmVkNjFfSW50ZXJuYWxEYXRhRFNMX2ZyYWdtZW50KCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsgICAKLSAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MzQ3MDoyOiAoICggcnVsZVhCYXNpY0Zvckxvb3BFeHByZXNzaW9uICkgKQotICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzozNDcwOjI6ICggcnVsZVhCYXNpY0Zvckxvb3BFeHByZXNzaW9uICkKKyAgICAvLyAkQU5UTFIgc3RhcnQgc3lucHJlZDYyX0ludGVybmFsRGF0YURTTAorICAgIHB1YmxpYyBmaW5hbCB2b2lkIHN5bnByZWQ2Ml9JbnRlcm5hbERhdGFEU0xfZnJhZ21lbnQoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geyAgIAorICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzozNjIzOjI6ICggKCBydWxlWEJhc2ljRm9yTG9vcEV4cHJlc3Npb24gKSApCisgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjM2MjM6MjogKCBydWxlWEJhc2ljRm9yTG9vcEV4cHJlc3Npb24gKQogICAgICAgICB7Ci0gICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjM0NzA6MjogKCBydWxlWEJhc2ljRm9yTG9vcEV4cHJlc3Npb24gKQotICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzozNDcxOjM6IHJ1bGVYQmFzaWNGb3JMb29wRXhwcmVzc2lvbgorICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzozNjIzOjI6ICggcnVsZVhCYXNpY0Zvckxvb3BFeHByZXNzaW9uICkKKyAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MzYyNDozOiBydWxlWEJhc2ljRm9yTG9vcEV4cHJlc3Npb24KICAgICAgICAgewogICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WFByaW1hcnlFeHByZXNzaW9uQWNjZXNzKCkuZ2V0WEJhc2ljRm9yTG9vcEV4cHJlc3Npb25QYXJzZXJSdWxlQ2FsbF84KCkpOyAKQEAgLTgzNzgyLDIxICs4OTAxMSwyMSBAQAogCiAgICAgICAgIH0KICAgICB9Ci0gICAgLy8gJEFOVExSIGVuZCBzeW5wcmVkNjFfSW50ZXJuYWxEYXRhRFNMCisgICAgLy8gJEFOVExSIGVuZCBzeW5wcmVkNjJfSW50ZXJuYWxEYXRhRFNMCiAKLSAgICAvLyAkQU5UTFIgc3RhcnQgc3lucHJlZDc0X0ludGVybmFsRGF0YURTTAotICAgIHB1YmxpYyBmaW5hbCB2b2lkIHN5bnByZWQ3NF9JbnRlcm5hbERhdGFEU0xfZnJhZ21lbnQoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geyAgIAotICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzozNTkzOjI6ICggKCAoIHJ1bGVfX1hTd2l0Y2hFeHByZXNzaW9uX19Hcm91cF8yXzBfXzAgKSApICkKLSAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MzU5MzoyOiAoICggcnVsZV9fWFN3aXRjaEV4cHJlc3Npb25fX0dyb3VwXzJfMF9fMCApICkKKyAgICAvLyAkQU5UTFIgc3RhcnQgc3lucHJlZDc1X0ludGVybmFsRGF0YURTTAorICAgIHB1YmxpYyBmaW5hbCB2b2lkIHN5bnByZWQ3NV9JbnRlcm5hbERhdGFEU0xfZnJhZ21lbnQoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geyAgIAorICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzozNzQ2OjI6ICggKCAoIHJ1bGVfX1hTd2l0Y2hFeHByZXNzaW9uX19Hcm91cF8yXzBfXzAgKSApICkKKyAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6Mzc0NjoyOiAoICggcnVsZV9fWFN3aXRjaEV4cHJlc3Npb25fX0dyb3VwXzJfMF9fMCApICkKICAgICAgICAgewotICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzozNTkzOjI6ICggKCBydWxlX19YU3dpdGNoRXhwcmVzc2lvbl9fR3JvdXBfMl8wX18wICkgKQotICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzozNTk0OjM6ICggcnVsZV9fWFN3aXRjaEV4cHJlc3Npb25fX0dyb3VwXzJfMF9fMCApCisgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjM3NDY6MjogKCAoIHJ1bGVfX1hTd2l0Y2hFeHByZXNzaW9uX19Hcm91cF8yXzBfXzAgKSApCisgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjM3NDc6MzogKCBydWxlX19YU3dpdGNoRXhwcmVzc2lvbl9fR3JvdXBfMl8wX18wICkKICAgICAgICAgewogICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WFN3aXRjaEV4cHJlc3Npb25BY2Nlc3MoKS5nZXRHcm91cF8yXzAoKSk7IAogICAgICAgICB9Ci0gICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjM1OTU6MzogKCBydWxlX19YU3dpdGNoRXhwcmVzc2lvbl9fR3JvdXBfMl8wX18wICkKLSAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MzU5NTo0OiBydWxlX19YU3dpdGNoRXhwcmVzc2lvbl9fR3JvdXBfMl8wX18wCisgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjM3NDg6MzogKCBydWxlX19YU3dpdGNoRXhwcmVzc2lvbl9fR3JvdXBfMl8wX18wICkKKyAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6Mzc0ODo0OiBydWxlX19YU3dpdGNoRXhwcmVzc2lvbl9fR3JvdXBfMl8wX18wCiAgICAgICAgIHsKICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMik7CiAgICAgICAgIHJ1bGVfX1hTd2l0Y2hFeHByZXNzaW9uX19Hcm91cF8yXzBfXzAoKTsKQEAgLTgzODEyLDIxICs4OTA0MSwyMSBAQAogCiAgICAgICAgIH0KICAgICB9Ci0gICAgLy8gJEFOVExSIGVuZCBzeW5wcmVkNzRfSW50ZXJuYWxEYXRhRFNMCisgICAgLy8gJEFOVExSIGVuZCBzeW5wcmVkNzVfSW50ZXJuYWxEYXRhRFNMCiAKLSAgICAvLyAkQU5UTFIgc3RhcnQgc3lucHJlZDc4X0ludGVybmFsRGF0YURTTAotICAgIHB1YmxpYyBmaW5hbCB2b2lkIHN5bnByZWQ3OF9JbnRlcm5hbERhdGFEU0xfZnJhZ21lbnQoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geyAgIAotICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzozNjc3OjI6ICggKCAoIHJ1bGVfX1hWYXJpYWJsZURlY2xhcmF0aW9uX19Hcm91cF8yXzBfXzAgKSApICkKLSAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MzY3NzoyOiAoICggcnVsZV9fWFZhcmlhYmxlRGVjbGFyYXRpb25fX0dyb3VwXzJfMF9fMCApICkKKyAgICAvLyAkQU5UTFIgc3RhcnQgc3lucHJlZDc5X0ludGVybmFsRGF0YURTTAorICAgIHB1YmxpYyBmaW5hbCB2b2lkIHN5bnByZWQ3OV9JbnRlcm5hbERhdGFEU0xfZnJhZ21lbnQoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geyAgIAorICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzozODMwOjI6ICggKCAoIHJ1bGVfX1hWYXJpYWJsZURlY2xhcmF0aW9uX19Hcm91cF8yXzBfXzAgKSApICkKKyAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MzgzMDoyOiAoICggcnVsZV9fWFZhcmlhYmxlRGVjbGFyYXRpb25fX0dyb3VwXzJfMF9fMCApICkKICAgICAgICAgewotICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzozNjc3OjI6ICggKCBydWxlX19YVmFyaWFibGVEZWNsYXJhdGlvbl9fR3JvdXBfMl8wX18wICkgKQotICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzozNjc4OjM6ICggcnVsZV9fWFZhcmlhYmxlRGVjbGFyYXRpb25fX0dyb3VwXzJfMF9fMCApCisgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjM4MzA6MjogKCAoIHJ1bGVfX1hWYXJpYWJsZURlY2xhcmF0aW9uX19Hcm91cF8yXzBfXzAgKSApCisgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjM4MzE6MzogKCBydWxlX19YVmFyaWFibGVEZWNsYXJhdGlvbl9fR3JvdXBfMl8wX18wICkKICAgICAgICAgewogICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WFZhcmlhYmxlRGVjbGFyYXRpb25BY2Nlc3MoKS5nZXRHcm91cF8yXzAoKSk7IAogICAgICAgICB9Ci0gICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjM2Nzk6MzogKCBydWxlX19YVmFyaWFibGVEZWNsYXJhdGlvbl9fR3JvdXBfMl8wX18wICkKLSAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MzY3OTo0OiBydWxlX19YVmFyaWFibGVEZWNsYXJhdGlvbl9fR3JvdXBfMl8wX18wCisgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjM4MzI6MzogKCBydWxlX19YVmFyaWFibGVEZWNsYXJhdGlvbl9fR3JvdXBfMl8wX18wICkKKyAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MzgzMjo0OiBydWxlX19YVmFyaWFibGVEZWNsYXJhdGlvbl9fR3JvdXBfMl8wX18wCiAgICAgICAgIHsKICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMik7CiAgICAgICAgIHJ1bGVfX1hWYXJpYWJsZURlY2xhcmF0aW9uX19Hcm91cF8yXzBfXzAoKTsKQEAgLTgzODQyLDIxICs4OTA3MSwyMSBAQAogCiAgICAgICAgIH0KICAgICB9Ci0gICAgLy8gJEFOVExSIGVuZCBzeW5wcmVkNzhfSW50ZXJuYWxEYXRhRFNMCisgICAgLy8gJEFOVExSIGVuZCBzeW5wcmVkNzlfSW50ZXJuYWxEYXRhRFNMCiAKLSAgICAvLyAkQU5UTFIgc3RhcnQgc3lucHJlZDc5X0ludGVybmFsRGF0YURTTAotICAgIHB1YmxpYyBmaW5hbCB2b2lkIHN5bnByZWQ3OV9JbnRlcm5hbERhdGFEU0xfZnJhZ21lbnQoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geyAgIAotICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzozNjk4OjI6ICggKCAoIHJ1bGVfX1hGZWF0dXJlQ2FsbF9fRmVhdHVyZUNhbGxBcmd1bWVudHNBc3NpZ25tZW50XzNfMV8wICkgKSApCi0gICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjM2OTg6MjogKCAoIHJ1bGVfX1hGZWF0dXJlQ2FsbF9fRmVhdHVyZUNhbGxBcmd1bWVudHNBc3NpZ25tZW50XzNfMV8wICkgKQorICAgIC8vICRBTlRMUiBzdGFydCBzeW5wcmVkODBfSW50ZXJuYWxEYXRhRFNMCisgICAgcHVibGljIGZpbmFsIHZvaWQgc3lucHJlZDgwX0ludGVybmFsRGF0YURTTF9mcmFnbWVudCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7ICAgCisgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjM4NTE6MjogKCAoICggcnVsZV9fWEZlYXR1cmVDYWxsX19GZWF0dXJlQ2FsbEFyZ3VtZW50c0Fzc2lnbm1lbnRfM18xXzAgKSApICkKKyAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6Mzg1MToyOiAoICggcnVsZV9fWEZlYXR1cmVDYWxsX19GZWF0dXJlQ2FsbEFyZ3VtZW50c0Fzc2lnbm1lbnRfM18xXzAgKSApCiAgICAgICAgIHsKLSAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MzY5ODoyOiAoICggcnVsZV9fWEZlYXR1cmVDYWxsX19GZWF0dXJlQ2FsbEFyZ3VtZW50c0Fzc2lnbm1lbnRfM18xXzAgKSApCi0gICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjM2OTk6MzogKCBydWxlX19YRmVhdHVyZUNhbGxfX0ZlYXR1cmVDYWxsQXJndW1lbnRzQXNzaWdubWVudF8zXzFfMCApCisgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjM4NTE6MjogKCAoIHJ1bGVfX1hGZWF0dXJlQ2FsbF9fRmVhdHVyZUNhbGxBcmd1bWVudHNBc3NpZ25tZW50XzNfMV8wICkgKQorICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzozODUyOjM6ICggcnVsZV9fWEZlYXR1cmVDYWxsX19GZWF0dXJlQ2FsbEFyZ3VtZW50c0Fzc2lnbm1lbnRfM18xXzAgKQogICAgICAgICB7CiAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYRmVhdHVyZUNhbGxBY2Nlc3MoKS5nZXRGZWF0dXJlQ2FsbEFyZ3VtZW50c0Fzc2lnbm1lbnRfM18xXzAoKSk7IAogICAgICAgICB9Ci0gICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjM3MDA6MzogKCBydWxlX19YRmVhdHVyZUNhbGxfX0ZlYXR1cmVDYWxsQXJndW1lbnRzQXNzaWdubWVudF8zXzFfMCApCi0gICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjM3MDA6NDogcnVsZV9fWEZlYXR1cmVDYWxsX19GZWF0dXJlQ2FsbEFyZ3VtZW50c0Fzc2lnbm1lbnRfM18xXzAKKyAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6Mzg1MzozOiAoIHJ1bGVfX1hGZWF0dXJlQ2FsbF9fRmVhdHVyZUNhbGxBcmd1bWVudHNBc3NpZ25tZW50XzNfMV8wICkKKyAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6Mzg1Mzo0OiBydWxlX19YRmVhdHVyZUNhbGxfX0ZlYXR1cmVDYWxsQXJndW1lbnRzQXNzaWdubWVudF8zXzFfMAogICAgICAgICB7CiAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzIpOwogICAgICAgICBydWxlX19YRmVhdHVyZUNhbGxfX0ZlYXR1cmVDYWxsQXJndW1lbnRzQXNzaWdubWVudF8zXzFfMCgpOwpAQCAtODM4NzIsMjEgKzg5MTAxLDIxIEBACiAKICAgICAgICAgfQogICAgIH0KLSAgICAvLyAkQU5UTFIgZW5kIHN5bnByZWQ3OV9JbnRlcm5hbERhdGFEU0wKKyAgICAvLyAkQU5UTFIgZW5kIHN5bnByZWQ4MF9JbnRlcm5hbERhdGFEU0wKIAotICAgIC8vICRBTlRMUiBzdGFydCBzeW5wcmVkODVfSW50ZXJuYWxEYXRhRFNMCi0gICAgcHVibGljIGZpbmFsIHZvaWQgc3lucHJlZDg1X0ludGVybmFsRGF0YURTTF9mcmFnbWVudCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7ICAgCi0gICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjM3Nzk6MjogKCAoICggcnVsZV9fWENvbnN0cnVjdG9yQ2FsbF9fQXJndW1lbnRzQXNzaWdubWVudF80XzFfMCApICkgKQotICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzozNzc5OjI6ICggKCBydWxlX19YQ29uc3RydWN0b3JDYWxsX19Bcmd1bWVudHNBc3NpZ25tZW50XzRfMV8wICkgKQorICAgIC8vICRBTlRMUiBzdGFydCBzeW5wcmVkODZfSW50ZXJuYWxEYXRhRFNMCisgICAgcHVibGljIGZpbmFsIHZvaWQgc3lucHJlZDg2X0ludGVybmFsRGF0YURTTF9mcmFnbWVudCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7ICAgCisgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjM5MzI6MjogKCAoICggcnVsZV9fWENvbnN0cnVjdG9yQ2FsbF9fQXJndW1lbnRzQXNzaWdubWVudF80XzFfMCApICkgKQorICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzozOTMyOjI6ICggKCBydWxlX19YQ29uc3RydWN0b3JDYWxsX19Bcmd1bWVudHNBc3NpZ25tZW50XzRfMV8wICkgKQogICAgICAgICB7Ci0gICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjM3Nzk6MjogKCAoIHJ1bGVfX1hDb25zdHJ1Y3RvckNhbGxfX0FyZ3VtZW50c0Fzc2lnbm1lbnRfNF8xXzAgKSApCi0gICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjM3ODA6MzogKCBydWxlX19YQ29uc3RydWN0b3JDYWxsX19Bcmd1bWVudHNBc3NpZ25tZW50XzRfMV8wICkKKyAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MzkzMjoyOiAoICggcnVsZV9fWENvbnN0cnVjdG9yQ2FsbF9fQXJndW1lbnRzQXNzaWdubWVudF80XzFfMCApICkKKyAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MzkzMzozOiAoIHJ1bGVfX1hDb25zdHJ1Y3RvckNhbGxfX0FyZ3VtZW50c0Fzc2lnbm1lbnRfNF8xXzAgKQogICAgICAgICB7CiAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYQ29uc3RydWN0b3JDYWxsQWNjZXNzKCkuZ2V0QXJndW1lbnRzQXNzaWdubWVudF80XzFfMCgpKTsgCiAgICAgICAgIH0KLSAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6Mzc4MTozOiAoIHJ1bGVfX1hDb25zdHJ1Y3RvckNhbGxfX0FyZ3VtZW50c0Fzc2lnbm1lbnRfNF8xXzAgKQotICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzozNzgxOjQ6IHJ1bGVfX1hDb25zdHJ1Y3RvckNhbGxfX0FyZ3VtZW50c0Fzc2lnbm1lbnRfNF8xXzAKKyAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MzkzNDozOiAoIHJ1bGVfX1hDb25zdHJ1Y3RvckNhbGxfX0FyZ3VtZW50c0Fzc2lnbm1lbnRfNF8xXzAgKQorICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzozOTM0OjQ6IHJ1bGVfX1hDb25zdHJ1Y3RvckNhbGxfX0FyZ3VtZW50c0Fzc2lnbm1lbnRfNF8xXzAKICAgICAgICAgewogICAgICAgICBwdXNoRm9sbG93KEZPTExPV18yKTsKICAgICAgICAgcnVsZV9fWENvbnN0cnVjdG9yQ2FsbF9fQXJndW1lbnRzQXNzaWdubWVudF80XzFfMCgpOwpAQCAtODM5MDIsMTIgKzg5MTMxLDEyIEBACiAKICAgICAgICAgfQogICAgIH0KLSAgICAvLyAkQU5UTFIgZW5kIHN5bnByZWQ4NV9JbnRlcm5hbERhdGFEU0wKKyAgICAvLyAkQU5UTFIgZW5kIHN5bnByZWQ4Nl9JbnRlcm5hbERhdGFEU0wKIAotICAgIC8vICRBTlRMUiBzdGFydCBzeW5wcmVkMTQ5X0ludGVybmFsRGF0YURTTAotICAgIHB1YmxpYyBmaW5hbCB2b2lkIHN5bnByZWQxNDlfSW50ZXJuYWxEYXRhRFNMX2ZyYWdtZW50KCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsgICAKLSAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTAzOTA6MzogKCBydWxlX19YQXNzaWdubWVudF9fR3JvdXBfMV8xX18wICkKLSAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTAzOTA6MzogcnVsZV9fWEFzc2lnbm1lbnRfX0dyb3VwXzFfMV9fMAorICAgIC8vICRBTlRMUiBzdGFydCBzeW5wcmVkMTY4X0ludGVybmFsRGF0YURTTAorICAgIHB1YmxpYyBmaW5hbCB2b2lkIHN5bnByZWQxNjhfSW50ZXJuYWxEYXRhRFNMX2ZyYWdtZW50KCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsgICAKKyAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTE3Mjg6MzogKCBydWxlX19YQXNzaWdubWVudF9fR3JvdXBfMV8xX18wICkKKyAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTE3Mjg6MzogcnVsZV9fWEFzc2lnbm1lbnRfX0dyb3VwXzFfMV9fMAogICAgICAgICB7CiAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzIpOwogICAgICAgICBydWxlX19YQXNzaWdubWVudF9fR3JvdXBfMV8xX18wKCk7CkBAIC04MzkxNywxMiArODkxNDYsMTIgQEAKIAogICAgICAgICB9CiAgICAgfQotICAgIC8vICRBTlRMUiBlbmQgc3lucHJlZDE0OV9JbnRlcm5hbERhdGFEU0wKKyAgICAvLyAkQU5UTFIgZW5kIHN5bnByZWQxNjhfSW50ZXJuYWxEYXRhRFNMCiAKLSAgICAvLyAkQU5UTFIgc3RhcnQgc3lucHJlZDE1MV9JbnRlcm5hbERhdGFEU0wKLSAgICBwdWJsaWMgZmluYWwgdm9pZCBzeW5wcmVkMTUxX0ludGVybmFsRGF0YURTTF9mcmFnbWVudCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7ICAgCi0gICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEwNzQxOjM6ICggcnVsZV9fWE9yRXhwcmVzc2lvbl9fR3JvdXBfMV9fMCApCi0gICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEwNzQxOjM6IHJ1bGVfX1hPckV4cHJlc3Npb25fX0dyb3VwXzFfXzAKKyAgICAvLyAkQU5UTFIgc3RhcnQgc3lucHJlZDE3MF9JbnRlcm5hbERhdGFEU0wKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBzeW5wcmVkMTcwX0ludGVybmFsRGF0YURTTF9mcmFnbWVudCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7ICAgCisgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEyMDc5OjM6ICggcnVsZV9fWE9yRXhwcmVzc2lvbl9fR3JvdXBfMV9fMCApCisgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEyMDc5OjM6IHJ1bGVfX1hPckV4cHJlc3Npb25fX0dyb3VwXzFfXzAKICAgICAgICAgewogICAgICAgICBwdXNoRm9sbG93KEZPTExPV18yKTsKICAgICAgICAgcnVsZV9fWE9yRXhwcmVzc2lvbl9fR3JvdXBfMV9fMCgpOwpAQCAtODM5MzIsMTIgKzg5MTYxLDEyIEBACiAKICAgICAgICAgfQogICAgIH0KLSAgICAvLyAkQU5UTFIgZW5kIHN5bnByZWQxNTFfSW50ZXJuYWxEYXRhRFNMCisgICAgLy8gJEFOVExSIGVuZCBzeW5wcmVkMTcwX0ludGVybmFsRGF0YURTTAogCi0gICAgLy8gJEFOVExSIHN0YXJ0IHN5bnByZWQxNTJfSW50ZXJuYWxEYXRhRFNMCi0gICAgcHVibGljIGZpbmFsIHZvaWQgc3lucHJlZDE1Ml9JbnRlcm5hbERhdGFEU0xfZnJhZ21lbnQoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geyAgIAotICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMDkzMDozOiAoIHJ1bGVfX1hBbmRFeHByZXNzaW9uX19Hcm91cF8xX18wICkKLSAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTA5MzA6MzogcnVsZV9fWEFuZEV4cHJlc3Npb25fX0dyb3VwXzFfXzAKKyAgICAvLyAkQU5UTFIgc3RhcnQgc3lucHJlZDE3MV9JbnRlcm5hbERhdGFEU0wKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBzeW5wcmVkMTcxX0ludGVybmFsRGF0YURTTF9mcmFnbWVudCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7ICAgCisgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEyMjY4OjM6ICggcnVsZV9fWEFuZEV4cHJlc3Npb25fX0dyb3VwXzFfXzAgKQorICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMjI2ODozOiBydWxlX19YQW5kRXhwcmVzc2lvbl9fR3JvdXBfMV9fMAogICAgICAgICB7CiAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzIpOwogICAgICAgICBydWxlX19YQW5kRXhwcmVzc2lvbl9fR3JvdXBfMV9fMCgpOwpAQCAtODM5NDcsMTIgKzg5MTc2LDEyIEBACiAKICAgICAgICAgfQogICAgIH0KLSAgICAvLyAkQU5UTFIgZW5kIHN5bnByZWQxNTJfSW50ZXJuYWxEYXRhRFNMCisgICAgLy8gJEFOVExSIGVuZCBzeW5wcmVkMTcxX0ludGVybmFsRGF0YURTTAogCi0gICAgLy8gJEFOVExSIHN0YXJ0IHN5bnByZWQxNTNfSW50ZXJuYWxEYXRhRFNMCi0gICAgcHVibGljIGZpbmFsIHZvaWQgc3lucHJlZDE1M19JbnRlcm5hbERhdGFEU0xfZnJhZ21lbnQoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geyAgIAotICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMTExOTozOiAoIHJ1bGVfX1hFcXVhbGl0eUV4cHJlc3Npb25fX0dyb3VwXzFfXzAgKQotICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMTExOTozOiBydWxlX19YRXF1YWxpdHlFeHByZXNzaW9uX19Hcm91cF8xX18wCisgICAgLy8gJEFOVExSIHN0YXJ0IHN5bnByZWQxNzJfSW50ZXJuYWxEYXRhRFNMCisgICAgcHVibGljIGZpbmFsIHZvaWQgc3lucHJlZDE3Ml9JbnRlcm5hbERhdGFEU0xfZnJhZ21lbnQoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geyAgIAorICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMjQ1NzozOiAoIHJ1bGVfX1hFcXVhbGl0eUV4cHJlc3Npb25fX0dyb3VwXzFfXzAgKQorICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMjQ1NzozOiBydWxlX19YRXF1YWxpdHlFeHByZXNzaW9uX19Hcm91cF8xX18wCiAgICAgICAgIHsKICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMik7CiAgICAgICAgIHJ1bGVfX1hFcXVhbGl0eUV4cHJlc3Npb25fX0dyb3VwXzFfXzAoKTsKQEAgLTgzOTYyLDEyICs4OTE5MSwxMiBAQAogCiAgICAgICAgIH0KICAgICB9Ci0gICAgLy8gJEFOVExSIGVuZCBzeW5wcmVkMTUzX0ludGVybmFsRGF0YURTTAorICAgIC8vICRBTlRMUiBlbmQgc3lucHJlZDE3Ml9JbnRlcm5hbERhdGFEU0wKIAotICAgIC8vICRBTlRMUiBzdGFydCBzeW5wcmVkMTU0X0ludGVybmFsRGF0YURTTAotICAgIHB1YmxpYyBmaW5hbCB2b2lkIHN5bnByZWQxNTRfSW50ZXJuYWxEYXRhRFNMX2ZyYWdtZW50KCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsgICAKLSAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTEzMDg6MzogKCBydWxlX19YUmVsYXRpb25hbEV4cHJlc3Npb25fX0FsdGVybmF0aXZlc18xICkKLSAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTEzMDg6MzogcnVsZV9fWFJlbGF0aW9uYWxFeHByZXNzaW9uX19BbHRlcm5hdGl2ZXNfMQorICAgIC8vICRBTlRMUiBzdGFydCBzeW5wcmVkMTczX0ludGVybmFsRGF0YURTTAorICAgIHB1YmxpYyBmaW5hbCB2b2lkIHN5bnByZWQxNzNfSW50ZXJuYWxEYXRhRFNMX2ZyYWdtZW50KCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsgICAKKyAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTI2NDY6MzogKCBydWxlX19YUmVsYXRpb25hbEV4cHJlc3Npb25fX0FsdGVybmF0aXZlc18xICkKKyAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTI2NDY6MzogcnVsZV9fWFJlbGF0aW9uYWxFeHByZXNzaW9uX19BbHRlcm5hdGl2ZXNfMQogICAgICAgICB7CiAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzIpOwogICAgICAgICBydWxlX19YUmVsYXRpb25hbEV4cHJlc3Npb25fX0FsdGVybmF0aXZlc18xKCk7CkBAIC04Mzk3NywxMiArODkyMDYsMTIgQEAKIAogICAgICAgICB9CiAgICAgfQotICAgIC8vICRBTlRMUiBlbmQgc3lucHJlZDE1NF9JbnRlcm5hbERhdGFEU0wKKyAgICAvLyAkQU5UTFIgZW5kIHN5bnByZWQxNzNfSW50ZXJuYWxEYXRhRFNMCiAKLSAgICAvLyAkQU5UTFIgc3RhcnQgc3lucHJlZDE1NV9JbnRlcm5hbERhdGFEU0wKLSAgICBwdWJsaWMgZmluYWwgdm9pZCBzeW5wcmVkMTU1X0ludGVybmFsRGF0YURTTF9mcmFnbWVudCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7ICAgCi0gICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjExNjg2OjM6ICggcnVsZV9fWE90aGVyT3BlcmF0b3JFeHByZXNzaW9uX19Hcm91cF8xX18wICkKLSAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTE2ODY6MzogcnVsZV9fWE90aGVyT3BlcmF0b3JFeHByZXNzaW9uX19Hcm91cF8xX18wCisgICAgLy8gJEFOVExSIHN0YXJ0IHN5bnByZWQxNzRfSW50ZXJuYWxEYXRhRFNMCisgICAgcHVibGljIGZpbmFsIHZvaWQgc3lucHJlZDE3NF9JbnRlcm5hbERhdGFEU0xfZnJhZ21lbnQoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geyAgIAorICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMzAyNDozOiAoIHJ1bGVfX1hPdGhlck9wZXJhdG9yRXhwcmVzc2lvbl9fR3JvdXBfMV9fMCApCisgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEzMDI0OjM6IHJ1bGVfX1hPdGhlck9wZXJhdG9yRXhwcmVzc2lvbl9fR3JvdXBfMV9fMAogICAgICAgICB7CiAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzIpOwogICAgICAgICBydWxlX19YT3RoZXJPcGVyYXRvckV4cHJlc3Npb25fX0dyb3VwXzFfXzAoKTsKQEAgLTgzOTkyLDEyICs4OTIyMSwxMiBAQAogCiAgICAgICAgIH0KICAgICB9Ci0gICAgLy8gJEFOVExSIGVuZCBzeW5wcmVkMTU1X0ludGVybmFsRGF0YURTTAorICAgIC8vICRBTlRMUiBlbmQgc3lucHJlZDE3NF9JbnRlcm5hbERhdGFEU0wKIAotICAgIC8vICRBTlRMUiBzdGFydCBzeW5wcmVkMTU2X0ludGVybmFsRGF0YURTTAotICAgIHB1YmxpYyBmaW5hbCB2b2lkIHN5bnByZWQxNTZfSW50ZXJuYWxEYXRhRFNMX2ZyYWdtZW50KCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsgICAKLSAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTIxOTk6MzogKCBydWxlX19YQWRkaXRpdmVFeHByZXNzaW9uX19Hcm91cF8xX18wICkKLSAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTIxOTk6MzogcnVsZV9fWEFkZGl0aXZlRXhwcmVzc2lvbl9fR3JvdXBfMV9fMAorICAgIC8vICRBTlRMUiBzdGFydCBzeW5wcmVkMTc1X0ludGVybmFsRGF0YURTTAorICAgIHB1YmxpYyBmaW5hbCB2b2lkIHN5bnByZWQxNzVfSW50ZXJuYWxEYXRhRFNMX2ZyYWdtZW50KCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsgICAKKyAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTM1Mzc6MzogKCBydWxlX19YQWRkaXRpdmVFeHByZXNzaW9uX19Hcm91cF8xX18wICkKKyAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTM1Mzc6MzogcnVsZV9fWEFkZGl0aXZlRXhwcmVzc2lvbl9fR3JvdXBfMV9fMAogICAgICAgICB7CiAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzIpOwogICAgICAgICBydWxlX19YQWRkaXRpdmVFeHByZXNzaW9uX19Hcm91cF8xX18wKCk7CkBAIC04NDAwNywxMiArODkyMzYsMTIgQEAKIAogICAgICAgICB9CiAgICAgfQotICAgIC8vICRBTlRMUiBlbmQgc3lucHJlZDE1Nl9JbnRlcm5hbERhdGFEU0wKKyAgICAvLyAkQU5UTFIgZW5kIHN5bnByZWQxNzVfSW50ZXJuYWxEYXRhRFNMCiAKLSAgICAvLyAkQU5UTFIgc3RhcnQgc3lucHJlZDE1N19JbnRlcm5hbERhdGFEU0wKLSAgICBwdWJsaWMgZmluYWwgdm9pZCBzeW5wcmVkMTU3X0ludGVybmFsRGF0YURTTF9mcmFnbWVudCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7ICAgCi0gICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEyMzg4OjM6ICggcnVsZV9fWE11bHRpcGxpY2F0aXZlRXhwcmVzc2lvbl9fR3JvdXBfMV9fMCApCi0gICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEyMzg4OjM6IHJ1bGVfX1hNdWx0aXBsaWNhdGl2ZUV4cHJlc3Npb25fX0dyb3VwXzFfXzAKKyAgICAvLyAkQU5UTFIgc3RhcnQgc3lucHJlZDE3Nl9JbnRlcm5hbERhdGFEU0wKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBzeW5wcmVkMTc2X0ludGVybmFsRGF0YURTTF9mcmFnbWVudCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7ICAgCisgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEzNzI2OjM6ICggcnVsZV9fWE11bHRpcGxpY2F0aXZlRXhwcmVzc2lvbl9fR3JvdXBfMV9fMCApCisgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEzNzI2OjM6IHJ1bGVfX1hNdWx0aXBsaWNhdGl2ZUV4cHJlc3Npb25fX0dyb3VwXzFfXzAKICAgICAgICAgewogICAgICAgICBwdXNoRm9sbG93KEZPTExPV18yKTsKICAgICAgICAgcnVsZV9fWE11bHRpcGxpY2F0aXZlRXhwcmVzc2lvbl9fR3JvdXBfMV9fMCgpOwpAQCAtODQwMjIsMTIgKzg5MjUxLDEyIEBACiAKICAgICAgICAgfQogICAgIH0KLSAgICAvLyAkQU5UTFIgZW5kIHN5bnByZWQxNTdfSW50ZXJuYWxEYXRhRFNMCisgICAgLy8gJEFOVExSIGVuZCBzeW5wcmVkMTc2X0ludGVybmFsRGF0YURTTAogCi0gICAgLy8gJEFOVExSIHN0YXJ0IHN5bnByZWQxNThfSW50ZXJuYWxEYXRhRFNMCi0gICAgcHVibGljIGZpbmFsIHZvaWQgc3lucHJlZDE1OF9JbnRlcm5hbERhdGFEU0xfZnJhZ21lbnQoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geyAgIAotICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMjY1ODozOiAoIHJ1bGVfX1hDYXN0ZWRFeHByZXNzaW9uX19Hcm91cF8xX18wICkKLSAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTI2NTg6MzogcnVsZV9fWENhc3RlZEV4cHJlc3Npb25fX0dyb3VwXzFfXzAKKyAgICAvLyAkQU5UTFIgc3RhcnQgc3lucHJlZDE3N19JbnRlcm5hbERhdGFEU0wKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBzeW5wcmVkMTc3X0ludGVybmFsRGF0YURTTF9mcmFnbWVudCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7ICAgCisgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEzOTk2OjM6ICggcnVsZV9fWENhc3RlZEV4cHJlc3Npb25fX0dyb3VwXzFfXzAgKQorICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMzk5NjozOiBydWxlX19YQ2FzdGVkRXhwcmVzc2lvbl9fR3JvdXBfMV9fMAogICAgICAgICB7CiAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzIpOwogICAgICAgICBydWxlX19YQ2FzdGVkRXhwcmVzc2lvbl9fR3JvdXBfMV9fMCgpOwpAQCAtODQwMzcsMTIgKzg5MjY2LDEyIEBACiAKICAgICAgICAgfQogICAgIH0KLSAgICAvLyAkQU5UTFIgZW5kIHN5bnByZWQxNThfSW50ZXJuYWxEYXRhRFNMCisgICAgLy8gJEFOVExSIGVuZCBzeW5wcmVkMTc3X0ludGVybmFsRGF0YURTTAogCi0gICAgLy8gJEFOVExSIHN0YXJ0IHN5bnByZWQxNTlfSW50ZXJuYWxEYXRhRFNMCi0gICAgcHVibGljIGZpbmFsIHZvaWQgc3lucHJlZDE1OV9JbnRlcm5hbERhdGFEU0xfZnJhZ21lbnQoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geyAgIAotICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMjg0NzozOiAoIHJ1bGVfX1hQb3N0Zml4T3BlcmF0aW9uX19Hcm91cF8xX18wICkKLSAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTI4NDc6MzogcnVsZV9fWFBvc3RmaXhPcGVyYXRpb25fX0dyb3VwXzFfXzAKKyAgICAvLyAkQU5UTFIgc3RhcnQgc3lucHJlZDE3OF9JbnRlcm5hbERhdGFEU0wKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBzeW5wcmVkMTc4X0ludGVybmFsRGF0YURTTF9mcmFnbWVudCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7ICAgCisgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE0MTg1OjM6ICggcnVsZV9fWFBvc3RmaXhPcGVyYXRpb25fX0dyb3VwXzFfXzAgKQorICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNDE4NTozOiBydWxlX19YUG9zdGZpeE9wZXJhdGlvbl9fR3JvdXBfMV9fMAogICAgICAgICB7CiAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzIpOwogICAgICAgICBydWxlX19YUG9zdGZpeE9wZXJhdGlvbl9fR3JvdXBfMV9fMCgpOwpAQCAtODQwNTIsMTIgKzg5MjgxLDEyIEBACiAKICAgICAgICAgfQogICAgIH0KLSAgICAvLyAkQU5UTFIgZW5kIHN5bnByZWQxNTlfSW50ZXJuYWxEYXRhRFNMCisgICAgLy8gJEFOVExSIGVuZCBzeW5wcmVkMTc4X0ludGVybmFsRGF0YURTTAogCi0gICAgLy8gJEFOVExSIHN0YXJ0IHN5bnByZWQxNjBfSW50ZXJuYWxEYXRhRFNMCi0gICAgcHVibGljIGZpbmFsIHZvaWQgc3lucHJlZDE2MF9JbnRlcm5hbERhdGFEU0xfZnJhZ21lbnQoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geyAgIAotICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMjk4MjozOiAoIHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fQWx0ZXJuYXRpdmVzXzEgKQotICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMjk4MjozOiBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX0FsdGVybmF0aXZlc18xCisgICAgLy8gJEFOVExSIHN0YXJ0IHN5bnByZWQxNzlfSW50ZXJuYWxEYXRhRFNMCisgICAgcHVibGljIGZpbmFsIHZvaWQgc3lucHJlZDE3OV9JbnRlcm5hbERhdGFEU0xfZnJhZ21lbnQoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geyAgIAorICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNDMyMDozOiAoIHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fQWx0ZXJuYXRpdmVzXzEgKQorICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNDMyMDozOiBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX0FsdGVybmF0aXZlc18xCiAgICAgICAgIHsKICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMik7CiAgICAgICAgIHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fQWx0ZXJuYXRpdmVzXzEoKTsKQEAgLTg0MDY3LDEyICs4OTI5NiwxMiBAQAogCiAgICAgICAgIH0KICAgICB9Ci0gICAgLy8gJEFOVExSIGVuZCBzeW5wcmVkMTYwX0ludGVybmFsRGF0YURTTAorICAgIC8vICRBTlRMUiBlbmQgc3lucHJlZDE3OV9JbnRlcm5hbERhdGFEU0wKIAotICAgIC8vICRBTlRMUiBzdGFydCBzeW5wcmVkMTYyX0ludGVybmFsRGF0YURTTAotICAgIHB1YmxpYyBmaW5hbCB2b2lkIHN5bnByZWQxNjJfSW50ZXJuYWxEYXRhRFNMX2ZyYWdtZW50KCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsgICAKLSAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTMyODA6MzogKCBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX0dyb3VwXzFfMV8zX18wICkKLSAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTMyODA6MzogcnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19Hcm91cF8xXzFfM19fMAorICAgIC8vICRBTlRMUiBzdGFydCBzeW5wcmVkMTgxX0ludGVybmFsRGF0YURTTAorICAgIHB1YmxpYyBmaW5hbCB2b2lkIHN5bnByZWQxODFfSW50ZXJuYWxEYXRhRFNMX2ZyYWdtZW50KCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsgICAKKyAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTQ2MTg6MzogKCBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX0dyb3VwXzFfMV8zX18wICkKKyAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTQ2MTg6MzogcnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19Hcm91cF8xXzFfM19fMAogICAgICAgICB7CiAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzIpOwogICAgICAgICBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX0dyb3VwXzFfMV8zX18wKCk7CkBAIC04NDA4MiwxMiArODkzMTEsMTIgQEAKIAogICAgICAgICB9CiAgICAgfQotICAgIC8vICRBTlRMUiBlbmQgc3lucHJlZDE2Ml9JbnRlcm5hbERhdGFEU0wKKyAgICAvLyAkQU5UTFIgZW5kIHN5bnByZWQxODFfSW50ZXJuYWxEYXRhRFNMCiAKLSAgICAvLyAkQU5UTFIgc3RhcnQgc3lucHJlZDE2M19JbnRlcm5hbERhdGFEU0wKLSAgICBwdWJsaWMgZmluYWwgdm9pZCBzeW5wcmVkMTYzX0ludGVybmFsRGF0YURTTF9mcmFnbWVudCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7ICAgCi0gICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEzMzA2OjM6ICggcnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19NZW1iZXJDYWxsQXJndW1lbnRzQXNzaWdubWVudF8xXzFfNCApCi0gICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEzMzA2OjM6IHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fTWVtYmVyQ2FsbEFyZ3VtZW50c0Fzc2lnbm1lbnRfMV8xXzQKKyAgICAvLyAkQU5UTFIgc3RhcnQgc3lucHJlZDE4Ml9JbnRlcm5hbERhdGFEU0wKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBzeW5wcmVkMTgyX0ludGVybmFsRGF0YURTTF9mcmFnbWVudCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7ICAgCisgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE0NjQ0OjM6ICggcnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19NZW1iZXJDYWxsQXJndW1lbnRzQXNzaWdubWVudF8xXzFfNCApCisgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE0NjQ0OjM6IHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fTWVtYmVyQ2FsbEFyZ3VtZW50c0Fzc2lnbm1lbnRfMV8xXzQKICAgICAgICAgewogICAgICAgICBwdXNoRm9sbG93KEZPTExPV18yKTsKICAgICAgICAgcnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19NZW1iZXJDYWxsQXJndW1lbnRzQXNzaWdubWVudF8xXzFfNCgpOwpAQCAtODQwOTcsMTIgKzg5MzI2LDEyIEBACiAKICAgICAgICAgfQogICAgIH0KLSAgICAvLyAkQU5UTFIgZW5kIHN5bnByZWQxNjNfSW50ZXJuYWxEYXRhRFNMCisgICAgLy8gJEFOVExSIGVuZCBzeW5wcmVkMTgyX0ludGVybmFsRGF0YURTTAogCi0gICAgLy8gJEFOVExSIHN0YXJ0IHN5bnByZWQxNzFfSW50ZXJuYWxEYXRhRFNMCi0gICAgcHVibGljIGZpbmFsIHZvaWQgc3lucHJlZDE3MV9JbnRlcm5hbERhdGFEU0xfZnJhZ21lbnQoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geyAgIAotICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNDI3OTozOiAoIHJ1bGVfX1hDbG9zdXJlX19Hcm91cF8xX18wICkKLSAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTQyNzk6MzogcnVsZV9fWENsb3N1cmVfX0dyb3VwXzFfXzAKKyAgICAvLyAkQU5UTFIgc3RhcnQgc3lucHJlZDE5MF9JbnRlcm5hbERhdGFEU0wKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBzeW5wcmVkMTkwX0ludGVybmFsRGF0YURTTF9mcmFnbWVudCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7ICAgCisgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE1NjE3OjM6ICggcnVsZV9fWENsb3N1cmVfX0dyb3VwXzFfXzAgKQorICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNTYxNzozOiBydWxlX19YQ2xvc3VyZV9fR3JvdXBfMV9fMAogICAgICAgICB7CiAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzIpOwogICAgICAgICBydWxlX19YQ2xvc3VyZV9fR3JvdXBfMV9fMCgpOwpAQCAtODQxMTIsMTIgKzg5MzQxLDEyIEBACiAKICAgICAgICAgfQogICAgIH0KLSAgICAvLyAkQU5UTFIgZW5kIHN5bnByZWQxNzFfSW50ZXJuYWxEYXRhRFNMCisgICAgLy8gJEFOVExSIGVuZCBzeW5wcmVkMTkwX0ludGVybmFsRGF0YURTTAogCi0gICAgLy8gJEFOVExSIHN0YXJ0IHN5bnByZWQxNzhfSW50ZXJuYWxEYXRhRFNMCi0gICAgcHVibGljIGZpbmFsIHZvaWQgc3lucHJlZDE3OF9JbnRlcm5hbERhdGFEU0xfZnJhZ21lbnQoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geyAgIAotICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNTI1MDozOiAoIHJ1bGVfX1hJZkV4cHJlc3Npb25fX0dyb3VwXzZfXzAgKQotICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNTI1MDozOiBydWxlX19YSWZFeHByZXNzaW9uX19Hcm91cF82X18wCisgICAgLy8gJEFOVExSIHN0YXJ0IHN5bnByZWQxOTdfSW50ZXJuYWxEYXRhRFNMCisgICAgcHVibGljIGZpbmFsIHZvaWQgc3lucHJlZDE5N19JbnRlcm5hbERhdGFEU0xfZnJhZ21lbnQoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geyAgIAorICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNjU4ODozOiAoIHJ1bGVfX1hJZkV4cHJlc3Npb25fX0dyb3VwXzZfXzAgKQorICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNjU4ODozOiBydWxlX19YSWZFeHByZXNzaW9uX19Hcm91cF82X18wCiAgICAgICAgIHsKICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMik7CiAgICAgICAgIHJ1bGVfX1hJZkV4cHJlc3Npb25fX0dyb3VwXzZfXzAoKTsKQEAgLTg0MTI3LDEyICs4OTM1NiwxMiBAQAogCiAgICAgICAgIH0KICAgICB9Ci0gICAgLy8gJEFOVExSIGVuZCBzeW5wcmVkMTc4X0ludGVybmFsRGF0YURTTAorICAgIC8vICRBTlRMUiBlbmQgc3lucHJlZDE5N19JbnRlcm5hbERhdGFEU0wKIAotICAgIC8vICRBTlRMUiBzdGFydCBzeW5wcmVkMTgxX0ludGVybmFsRGF0YURTTAotICAgIHB1YmxpYyBmaW5hbCB2b2lkIHN5bnByZWQxODFfSW50ZXJuYWxEYXRhRFNMX2ZyYWdtZW50KCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsgICAKLSAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTU3MTA6MzogKCBydWxlX19YU3dpdGNoRXhwcmVzc2lvbl9fR3JvdXBfMl8xXzBfXzAgKQotICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNTcxMDozOiBydWxlX19YU3dpdGNoRXhwcmVzc2lvbl9fR3JvdXBfMl8xXzBfXzAKKyAgICAvLyAkQU5UTFIgc3RhcnQgc3lucHJlZDIwMF9JbnRlcm5hbERhdGFEU0wKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBzeW5wcmVkMjAwX0ludGVybmFsRGF0YURTTF9mcmFnbWVudCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7ICAgCisgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE3MDQ4OjM6ICggcnVsZV9fWFN3aXRjaEV4cHJlc3Npb25fX0dyb3VwXzJfMV8wX18wICkKKyAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTcwNDg6MzogcnVsZV9fWFN3aXRjaEV4cHJlc3Npb25fX0dyb3VwXzJfMV8wX18wCiAgICAgICAgIHsKICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMik7CiAgICAgICAgIHJ1bGVfX1hTd2l0Y2hFeHByZXNzaW9uX19Hcm91cF8yXzFfMF9fMCgpOwpAQCAtODQxNDIsMTIgKzg5MzcxLDEyIEBACiAKICAgICAgICAgfQogICAgIH0KLSAgICAvLyAkQU5UTFIgZW5kIHN5bnByZWQxODFfSW50ZXJuYWxEYXRhRFNMCisgICAgLy8gJEFOVExSIGVuZCBzeW5wcmVkMjAwX0ludGVybmFsRGF0YURTTAogCi0gICAgLy8gJEFOVExSIHN0YXJ0IHN5bnByZWQxOTRfSW50ZXJuYWxEYXRhRFNMCi0gICAgcHVibGljIGZpbmFsIHZvaWQgc3lucHJlZDE5NF9JbnRlcm5hbERhdGFEU0xfZnJhZ21lbnQoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geyAgIAotICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNzg0MzozOiAoIHJ1bGVfX1hGZWF0dXJlQ2FsbF9fR3JvdXBfM19fMCApCi0gICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE3ODQzOjM6IHJ1bGVfX1hGZWF0dXJlQ2FsbF9fR3JvdXBfM19fMAorICAgIC8vICRBTlRMUiBzdGFydCBzeW5wcmVkMjEzX0ludGVybmFsRGF0YURTTAorICAgIHB1YmxpYyBmaW5hbCB2b2lkIHN5bnByZWQyMTNfSW50ZXJuYWxEYXRhRFNMX2ZyYWdtZW50KCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsgICAKKyAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTkxODE6MzogKCBydWxlX19YRmVhdHVyZUNhbGxfX0dyb3VwXzNfXzAgKQorICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxOTE4MTozOiBydWxlX19YRmVhdHVyZUNhbGxfX0dyb3VwXzNfXzAKICAgICAgICAgewogICAgICAgICBwdXNoRm9sbG93KEZPTExPV18yKTsKICAgICAgICAgcnVsZV9fWEZlYXR1cmVDYWxsX19Hcm91cF8zX18wKCk7CkBAIC04NDE1NywxMiArODkzODYsMTIgQEAKIAogICAgICAgICB9CiAgICAgfQotICAgIC8vICRBTlRMUiBlbmQgc3lucHJlZDE5NF9JbnRlcm5hbERhdGFEU0wKKyAgICAvLyAkQU5UTFIgZW5kIHN5bnByZWQyMTNfSW50ZXJuYWxEYXRhRFNMCiAKLSAgICAvLyAkQU5UTFIgc3RhcnQgc3lucHJlZDE5NV9JbnRlcm5hbERhdGFEU0wKLSAgICBwdWJsaWMgZmluYWwgdm9pZCBzeW5wcmVkMTk1X0ludGVybmFsRGF0YURTTF9mcmFnbWVudCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7ICAgCi0gICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE3ODY5OjM6ICggcnVsZV9fWEZlYXR1cmVDYWxsX19GZWF0dXJlQ2FsbEFyZ3VtZW50c0Fzc2lnbm1lbnRfNCApCi0gICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE3ODY5OjM6IHJ1bGVfX1hGZWF0dXJlQ2FsbF9fRmVhdHVyZUNhbGxBcmd1bWVudHNBc3NpZ25tZW50XzQKKyAgICAvLyAkQU5UTFIgc3RhcnQgc3lucHJlZDIxNF9JbnRlcm5hbERhdGFEU0wKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBzeW5wcmVkMjE0X0ludGVybmFsRGF0YURTTF9mcmFnbWVudCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7ICAgCisgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE5MjA3OjM6ICggcnVsZV9fWEZlYXR1cmVDYWxsX19GZWF0dXJlQ2FsbEFyZ3VtZW50c0Fzc2lnbm1lbnRfNCApCisgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE5MjA3OjM6IHJ1bGVfX1hGZWF0dXJlQ2FsbF9fRmVhdHVyZUNhbGxBcmd1bWVudHNBc3NpZ25tZW50XzQKICAgICAgICAgewogICAgICAgICBwdXNoRm9sbG93KEZPTExPV18yKTsKICAgICAgICAgcnVsZV9fWEZlYXR1cmVDYWxsX19GZWF0dXJlQ2FsbEFyZ3VtZW50c0Fzc2lnbm1lbnRfNCgpOwpAQCAtODQxNzIsMTIgKzg5NDAxLDEyIEBACiAKICAgICAgICAgfQogICAgIH0KLSAgICAvLyAkQU5UTFIgZW5kIHN5bnByZWQxOTVfSW50ZXJuYWxEYXRhRFNMCisgICAgLy8gJEFOVExSIGVuZCBzeW5wcmVkMjE0X0ludGVybmFsRGF0YURTTAogCi0gICAgLy8gJEFOVExSIHN0YXJ0IHN5bnByZWQxOTlfSW50ZXJuYWxEYXRhRFNMCi0gICAgcHVibGljIGZpbmFsIHZvaWQgc3lucHJlZDE5OV9JbnRlcm5hbERhdGFEU0xfZnJhZ21lbnQoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geyAgIAotICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxODMyOTozOiAoIHJ1bGVfX1hDb25zdHJ1Y3RvckNhbGxfX0dyb3VwXzNfXzAgKQotICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxODMyOTozOiBydWxlX19YQ29uc3RydWN0b3JDYWxsX19Hcm91cF8zX18wCisgICAgLy8gJEFOVExSIHN0YXJ0IHN5bnByZWQyMThfSW50ZXJuYWxEYXRhRFNMCisgICAgcHVibGljIGZpbmFsIHZvaWQgc3lucHJlZDIxOF9JbnRlcm5hbERhdGFEU0xfZnJhZ21lbnQoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geyAgIAorICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxOTY2NzozOiAoIHJ1bGVfX1hDb25zdHJ1Y3RvckNhbGxfX0dyb3VwXzNfXzAgKQorICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxOTY2NzozOiBydWxlX19YQ29uc3RydWN0b3JDYWxsX19Hcm91cF8zX18wCiAgICAgICAgIHsKICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMik7CiAgICAgICAgIHJ1bGVfX1hDb25zdHJ1Y3RvckNhbGxfX0dyb3VwXzNfXzAoKTsKQEAgLTg0MTg3LDEyICs4OTQxNiwxMiBAQAogCiAgICAgICAgIH0KICAgICB9Ci0gICAgLy8gJEFOVExSIGVuZCBzeW5wcmVkMTk5X0ludGVybmFsRGF0YURTTAorICAgIC8vICRBTlRMUiBlbmQgc3lucHJlZDIxOF9JbnRlcm5hbERhdGFEU0wKIAotICAgIC8vICRBTlRMUiBzdGFydCBzeW5wcmVkMjAwX0ludGVybmFsRGF0YURTTAotICAgIHB1YmxpYyBmaW5hbCB2b2lkIHN5bnByZWQyMDBfSW50ZXJuYWxEYXRhRFNMX2ZyYWdtZW50KCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsgICAKLSAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTgzNTY6MzogKCBydWxlX19YQ29uc3RydWN0b3JDYWxsX19Hcm91cF80X18wICkKLSAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTgzNTY6MzogcnVsZV9fWENvbnN0cnVjdG9yQ2FsbF9fR3JvdXBfNF9fMAorICAgIC8vICRBTlRMUiBzdGFydCBzeW5wcmVkMjE5X0ludGVybmFsRGF0YURTTAorICAgIHB1YmxpYyBmaW5hbCB2b2lkIHN5bnByZWQyMTlfSW50ZXJuYWxEYXRhRFNMX2ZyYWdtZW50KCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsgICAKKyAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTk2OTQ6MzogKCBydWxlX19YQ29uc3RydWN0b3JDYWxsX19Hcm91cF80X18wICkKKyAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTk2OTQ6MzogcnVsZV9fWENvbnN0cnVjdG9yQ2FsbF9fR3JvdXBfNF9fMAogICAgICAgICB7CiAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzIpOwogICAgICAgICBydWxlX19YQ29uc3RydWN0b3JDYWxsX19Hcm91cF80X18wKCk7CkBAIC04NDIwMiwxMiArODk0MzEsMTIgQEAKIAogICAgICAgICB9CiAgICAgfQotICAgIC8vICRBTlRMUiBlbmQgc3lucHJlZDIwMF9JbnRlcm5hbERhdGFEU0wKKyAgICAvLyAkQU5UTFIgZW5kIHN5bnByZWQyMTlfSW50ZXJuYWxEYXRhRFNMCiAKLSAgICAvLyAkQU5UTFIgc3RhcnQgc3lucHJlZDIwMV9JbnRlcm5hbERhdGFEU0wKLSAgICBwdWJsaWMgZmluYWwgdm9pZCBzeW5wcmVkMjAxX0ludGVybmFsRGF0YURTTF9mcmFnbWVudCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7ICAgCi0gICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE4MzgyOjM6ICggcnVsZV9fWENvbnN0cnVjdG9yQ2FsbF9fQXJndW1lbnRzQXNzaWdubWVudF81ICkKLSAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTgzODI6MzogcnVsZV9fWENvbnN0cnVjdG9yQ2FsbF9fQXJndW1lbnRzQXNzaWdubWVudF81CisgICAgLy8gJEFOVExSIHN0YXJ0IHN5bnByZWQyMjBfSW50ZXJuYWxEYXRhRFNMCisgICAgcHVibGljIGZpbmFsIHZvaWQgc3lucHJlZDIyMF9JbnRlcm5hbERhdGFEU0xfZnJhZ21lbnQoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geyAgIAorICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxOTcyMDozOiAoIHJ1bGVfX1hDb25zdHJ1Y3RvckNhbGxfX0FyZ3VtZW50c0Fzc2lnbm1lbnRfNSApCisgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE5NzIwOjM6IHJ1bGVfX1hDb25zdHJ1Y3RvckNhbGxfX0FyZ3VtZW50c0Fzc2lnbm1lbnRfNQogICAgICAgICB7CiAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzIpOwogICAgICAgICBydWxlX19YQ29uc3RydWN0b3JDYWxsX19Bcmd1bWVudHNBc3NpZ25tZW50XzUoKTsKQEAgLTg0MjE3LDEyICs4OTQ0NiwxMiBAQAogCiAgICAgICAgIH0KICAgICB9Ci0gICAgLy8gJEFOVExSIGVuZCBzeW5wcmVkMjAxX0ludGVybmFsRGF0YURTTAorICAgIC8vICRBTlRMUiBlbmQgc3lucHJlZDIyMF9JbnRlcm5hbERhdGFEU0wKIAotICAgIC8vICRBTlRMUiBzdGFydCBzeW5wcmVkMjA2X0ludGVybmFsRGF0YURTTAotICAgIHB1YmxpYyBmaW5hbCB2b2lkIHN5bnByZWQyMDZfSW50ZXJuYWxEYXRhRFNMX2ZyYWdtZW50KCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsgICAKLSAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTkyNzM6MzogKCBydWxlX19YUmV0dXJuRXhwcmVzc2lvbl9fRXhwcmVzc2lvbkFzc2lnbm1lbnRfMiApCi0gICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE5MjczOjM6IHJ1bGVfX1hSZXR1cm5FeHByZXNzaW9uX19FeHByZXNzaW9uQXNzaWdubWVudF8yCisgICAgLy8gJEFOVExSIHN0YXJ0IHN5bnByZWQyMjVfSW50ZXJuYWxEYXRhRFNMCisgICAgcHVibGljIGZpbmFsIHZvaWQgc3lucHJlZDIyNV9JbnRlcm5hbERhdGFEU0xfZnJhZ21lbnQoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geyAgIAorICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMDYxMTozOiAoIHJ1bGVfX1hSZXR1cm5FeHByZXNzaW9uX19FeHByZXNzaW9uQXNzaWdubWVudF8yICkKKyAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjA2MTE6MzogcnVsZV9fWFJldHVybkV4cHJlc3Npb25fX0V4cHJlc3Npb25Bc3NpZ25tZW50XzIKICAgICAgICAgewogICAgICAgICBwdXNoRm9sbG93KEZPTExPV18yKTsKICAgICAgICAgcnVsZV9fWFJldHVybkV4cHJlc3Npb25fX0V4cHJlc3Npb25Bc3NpZ25tZW50XzIoKTsKQEAgLTg0MjMyLDIyOSArODk0NjEsMTUgQEAKIAogICAgICAgICB9CiAgICAgfQotICAgIC8vICRBTlRMUiBlbmQgc3lucHJlZDIwNl9JbnRlcm5hbERhdGFEU0wKLQotICAgIC8vICRBTlRMUiBzdGFydCBzeW5wcmVkMjA3X0ludGVybmFsRGF0YURTTAotICAgIHB1YmxpYyBmaW5hbCB2b2lkIHN5bnByZWQyMDdfSW50ZXJuYWxEYXRhRFNMX2ZyYWdtZW50KCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsgICAKLSAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTk0MTU6NDogKCBydWxlX19YVHJ5Q2F0Y2hGaW5hbGx5RXhwcmVzc2lvbl9fQ2F0Y2hDbGF1c2VzQXNzaWdubWVudF8zXzBfMCApCi0gICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE5NDE1OjQ6IHJ1bGVfX1hUcnlDYXRjaEZpbmFsbHlFeHByZXNzaW9uX19DYXRjaENsYXVzZXNBc3NpZ25tZW50XzNfMF8wCi0gICAgICAgIHsKLSAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMik7Ci0gICAgICAgIHJ1bGVfX1hUcnlDYXRjaEZpbmFsbHlFeHByZXNzaW9uX19DYXRjaENsYXVzZXNBc3NpZ25tZW50XzNfMF8wKCk7Ci0KLSAgICAgICAgc3RhdGUuX2ZzcC0tOwotICAgICAgICBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOwotCi0gICAgICAgIH0KLSAgICB9Ci0gICAgLy8gJEFOVExSIGVuZCBzeW5wcmVkMjA3X0ludGVybmFsRGF0YURTTAotCi0gICAgLy8gJEFOVExSIHN0YXJ0IHN5bnByZWQyMDhfSW50ZXJuYWxEYXRhRFNMCi0gICAgcHVibGljIGZpbmFsIHZvaWQgc3lucHJlZDIwOF9JbnRlcm5hbERhdGFEU0xfZnJhZ21lbnQoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geyAgIAotICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxOTQ0MjozOiAoIHJ1bGVfX1hUcnlDYXRjaEZpbmFsbHlFeHByZXNzaW9uX19Hcm91cF8zXzBfMV9fMCApCi0gICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE5NDQyOjM6IHJ1bGVfX1hUcnlDYXRjaEZpbmFsbHlFeHByZXNzaW9uX19Hcm91cF8zXzBfMV9fMAotICAgICAgICB7Ci0gICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzIpOwotICAgICAgICBydWxlX19YVHJ5Q2F0Y2hGaW5hbGx5RXhwcmVzc2lvbl9fR3JvdXBfM18wXzFfXzAoKTsKLQotICAgICAgICBzdGF0ZS5fZnNwLS07Ci0gICAgICAgIGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7Ci0KLSAgICAgICAgfQotICAgIH0KLSAgICAvLyAkQU5UTFIgZW5kIHN5bnByZWQyMDhfSW50ZXJuYWxEYXRhRFNMCi0KLSAgICAvLyAkQU5UTFIgc3RhcnQgc3lucHJlZDIwOV9JbnRlcm5hbERhdGFEU0wKLSAgICBwdWJsaWMgZmluYWwgdm9pZCBzeW5wcmVkMjA5X0ludGVybmFsRGF0YURTTF9mcmFnbWVudCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7ICAgCi0gICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE5OTU1OjM6ICggcnVsZV9fUXVhbGlmaWVkTmFtZV9fR3JvdXBfMV9fMCApCi0gICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE5OTU1OjM6IHJ1bGVfX1F1YWxpZmllZE5hbWVfX0dyb3VwXzFfXzAKLSAgICAgICAgewotICAgICAgICBwdXNoRm9sbG93KEZPTExPV18yKTsKLSAgICAgICAgcnVsZV9fUXVhbGlmaWVkTmFtZV9fR3JvdXBfMV9fMCgpOwotCi0gICAgICAgIHN0YXRlLl9mc3AtLTsKLSAgICAgICAgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKLQotICAgICAgICB9Ci0gICAgfQotICAgIC8vICRBTlRMUiBlbmQgc3lucHJlZDIwOV9JbnRlcm5hbERhdGFEU0wKLQotICAgIC8vICRBTlRMUiBzdGFydCBzeW5wcmVkMjExX0ludGVybmFsRGF0YURTTAotICAgIHB1YmxpYyBmaW5hbCB2b2lkIHN5bnByZWQyMTFfSW50ZXJuYWxEYXRhRFNMX2ZyYWdtZW50KCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsgICAKLSAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjAxNzE6MzogKCBydWxlX19Kdm1UeXBlUmVmZXJlbmNlX19Hcm91cF8wXzFfXzAgKQotICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMDE3MTozOiBydWxlX19Kdm1UeXBlUmVmZXJlbmNlX19Hcm91cF8wXzFfXzAKLSAgICAgICAgewotICAgICAgICBwdXNoRm9sbG93KEZPTExPV18yKTsKLSAgICAgICAgcnVsZV9fSnZtVHlwZVJlZmVyZW5jZV9fR3JvdXBfMF8xX18wKCk7Ci0KLSAgICAgICAgc3RhdGUuX2ZzcC0tOwotICAgICAgICBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOwotCi0gICAgICAgIH0KLSAgICB9Ci0gICAgLy8gJEFOVExSIGVuZCBzeW5wcmVkMjExX0ludGVybmFsRGF0YURTTAotCi0gICAgLy8gJEFOVExSIHN0YXJ0IHN5bnByZWQyMTVfSW50ZXJuYWxEYXRhRFNMCi0gICAgcHVibGljIGZpbmFsIHZvaWQgc3lucHJlZDIxNV9JbnRlcm5hbERhdGFEU0xfZnJhZ21lbnQoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geyAgIAotICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMDYzMDozOiAoIHJ1bGVfX0p2bVBhcmFtZXRlcml6ZWRUeXBlUmVmZXJlbmNlX19Hcm91cF8xX18wICkKLSAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjA2MzA6MzogcnVsZV9fSnZtUGFyYW1ldGVyaXplZFR5cGVSZWZlcmVuY2VfX0dyb3VwXzFfXzAKLSAgICAgICAgewotICAgICAgICBwdXNoRm9sbG93KEZPTExPV18yKTsKLSAgICAgICAgcnVsZV9fSnZtUGFyYW1ldGVyaXplZFR5cGVSZWZlcmVuY2VfX0dyb3VwXzFfXzAoKTsKLQotICAgICAgICBzdGF0ZS5fZnNwLS07Ci0gICAgICAgIGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7Ci0KLSAgICAgICAgfQotICAgIH0KLSAgICAvLyAkQU5UTFIgZW5kIHN5bnByZWQyMTVfSW50ZXJuYWxEYXRhRFNMCi0KLSAgICAvLyAkQU5UTFIgc3RhcnQgc3lucHJlZDIxN19JbnRlcm5hbERhdGFEU0wKLSAgICBwdWJsaWMgZmluYWwgdm9pZCBzeW5wcmVkMjE3X0ludGVybmFsRGF0YURTTF9mcmFnbWVudCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7ICAgCi0gICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIwNzY1OjM6ICggcnVsZV9fSnZtUGFyYW1ldGVyaXplZFR5cGVSZWZlcmVuY2VfX0dyb3VwXzFfNF9fMCApCi0gICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIwNzY1OjM6IHJ1bGVfX0p2bVBhcmFtZXRlcml6ZWRUeXBlUmVmZXJlbmNlX19Hcm91cF8xXzRfXzAKLSAgICAgICAgewotICAgICAgICBwdXNoRm9sbG93KEZPTExPV18yKTsKLSAgICAgICAgcnVsZV9fSnZtUGFyYW1ldGVyaXplZFR5cGVSZWZlcmVuY2VfX0dyb3VwXzFfNF9fMCgpOwotCi0gICAgICAgIHN0YXRlLl9mc3AtLTsKLSAgICAgICAgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKLQotICAgICAgICB9Ci0gICAgfQotICAgIC8vICRBTlRMUiBlbmQgc3lucHJlZDIxN19JbnRlcm5hbERhdGFEU0wKLQotICAgIC8vICRBTlRMUiBzdGFydCBzeW5wcmVkMjE4X0ludGVybmFsRGF0YURTTAotICAgIHB1YmxpYyBmaW5hbCB2b2lkIHN5bnByZWQyMThfSW50ZXJuYWxEYXRhRFNMX2ZyYWdtZW50KCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsgICAKLSAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjA5MDA6MzogKCBydWxlX19Kdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZV9fR3JvdXBfMV80XzJfXzAgKQotICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMDkwMDozOiBydWxlX19Kdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZV9fR3JvdXBfMV80XzJfXzAKLSAgICAgICAgewotICAgICAgICBwdXNoRm9sbG93KEZPTExPV18yKTsKLSAgICAgICAgcnVsZV9fSnZtUGFyYW1ldGVyaXplZFR5cGVSZWZlcmVuY2VfX0dyb3VwXzFfNF8yX18wKCk7Ci0KLSAgICAgICAgc3RhdGUuX2ZzcC0tOwotICAgICAgICBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOwotCi0gICAgICAgIH0KLSAgICB9Ci0gICAgLy8gJEFOVExSIGVuZCBzeW5wcmVkMjE4X0ludGVybmFsRGF0YURTTAotCi0gICAgLy8gJEFOVExSIHN0YXJ0IHN5bnByZWQyMjNfSW50ZXJuYWxEYXRhRFNMCi0gICAgcHVibGljIGZpbmFsIHZvaWQgc3lucHJlZDIyM19JbnRlcm5hbERhdGFEU0xfZnJhZ21lbnQoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geyAgIAotICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMTY5ODoyOiAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbGVYTUxfX1Vub3JkZXJlZEdyb3VwXzNfXzAgKQotICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMTY5ODoyOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VGaWxlWE1MX19Vbm9yZGVyZWRHcm91cF8zX18wCi0gICAgICAgIHsKLSAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMik7Ci0gICAgICAgIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbGVYTUxfX1Vub3JkZXJlZEdyb3VwXzNfXzAoKTsKLQotICAgICAgICBzdGF0ZS5fZnNwLS07Ci0gICAgICAgIGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7Ci0KLSAgICAgICAgfQotICAgIH0KLSAgICAvLyAkQU5UTFIgZW5kIHN5bnByZWQyMjNfSW50ZXJuYWxEYXRhRFNMCi0KLSAgICAvLyAkQU5UTFIgc3RhcnQgc3lucHJlZDIyNF9JbnRlcm5hbERhdGFEU0wKLSAgICBwdWJsaWMgZmluYWwgdm9pZCBzeW5wcmVkMjI0X0ludGVybmFsRGF0YURTTF9mcmFnbWVudCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7ICAgCi0gICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIxNzEzOjM6ICggKHsuLi59PyA9PiAoICggKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VGaWxlWE1MX19CeUF0dHJpYnV0ZUFzc2lnbm1lbnRfM18wICkgKSApICkgKQotICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMTcxMzozOiAoey4uLn0/ID0+ICggKCAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbGVYTUxfX0J5QXR0cmlidXRlQXNzaWdubWVudF8zXzAgKSApICkgKQotICAgICAgICB7Ci0gICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIxNzEzOjM6ICh7Li4ufT8gPT4gKCAoICggcnVsZV9fRGF0YUludGVyY2hhbmdlRmlsZVhNTF9fQnlBdHRyaWJ1dGVBc3NpZ25tZW50XzNfMCApICkgKSApCi0gICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIxNzE0OjQ6IHsuLi59PyA9PiAoICggKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VGaWxlWE1MX19CeUF0dHJpYnV0ZUFzc2lnbm1lbnRfM18wICkgKSApCi0gICAgICAgIHsKLSAgICAgICAgaWYgKCAhIGdldFVub3JkZXJlZEdyb3VwSGVscGVyKCkuY2FuU2VsZWN0KGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YUludGVyY2hhbmdlRmlsZVhNTEFjY2VzcygpLmdldFVub3JkZXJlZEdyb3VwXzMoKSwgMCkgKSB7Ci0gICAgICAgICAgICBpZiAoc3RhdGUuYmFja3RyYWNraW5nPjApIHtzdGF0ZS5mYWlsZWQ9dHJ1ZTsgcmV0dXJuIDt9Ci0gICAgICAgICAgICB0aHJvdyBuZXcgRmFpbGVkUHJlZGljYXRlRXhjZXB0aW9uKGlucHV0LCAic3lucHJlZDIyNF9JbnRlcm5hbERhdGFEU0wiLCAiZ2V0VW5vcmRlcmVkR3JvdXBIZWxwZXIoKS5jYW5TZWxlY3QoZ3JhbW1hckFjY2Vzcy5nZXREYXRhSW50ZXJjaGFuZ2VGaWxlWE1MQWNjZXNzKCkuZ2V0VW5vcmRlcmVkR3JvdXBfMygpLCAwKSIpOwotICAgICAgICB9Ci0gICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIxNzE0OjExODogKCAoICggcnVsZV9fRGF0YUludGVyY2hhbmdlRmlsZVhNTF9fQnlBdHRyaWJ1dGVBc3NpZ25tZW50XzNfMCApICkgKQotICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMTcxNTo1OiAoICggcnVsZV9fRGF0YUludGVyY2hhbmdlRmlsZVhNTF9fQnlBdHRyaWJ1dGVBc3NpZ25tZW50XzNfMCApICkKLSAgICAgICAgewotICAgICAgICBnZXRVbm9yZGVyZWRHcm91cEhlbHBlcigpLnNlbGVjdChncmFtbWFyQWNjZXNzLmdldERhdGFJbnRlcmNoYW5nZUZpbGVYTUxBY2Nlc3MoKS5nZXRVbm9yZGVyZWRHcm91cF8zKCksIDApOwotICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMTcyMTo1OiAoICggcnVsZV9fRGF0YUludGVyY2hhbmdlRmlsZVhNTF9fQnlBdHRyaWJ1dGVBc3NpZ25tZW50XzNfMCApICkKLSAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjE3MjI6NjogKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VGaWxlWE1MX19CeUF0dHJpYnV0ZUFzc2lnbm1lbnRfM18wICkKLSAgICAgICAgewotICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKLSAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YUludGVyY2hhbmdlRmlsZVhNTEFjY2VzcygpLmdldEJ5QXR0cmlidXRlQXNzaWdubWVudF8zXzAoKSk7IAotICAgICAgICB9Ci0gICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIxNzIzOjY6ICggcnVsZV9fRGF0YUludGVyY2hhbmdlRmlsZVhNTF9fQnlBdHRyaWJ1dGVBc3NpZ25tZW50XzNfMCApCi0gICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIxNzIzOjc6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbGVYTUxfX0J5QXR0cmlidXRlQXNzaWdubWVudF8zXzAKLSAgICAgICAgewotICAgICAgICBwdXNoRm9sbG93KEZPTExPV18yKTsKLSAgICAgICAgcnVsZV9fRGF0YUludGVyY2hhbmdlRmlsZVhNTF9fQnlBdHRyaWJ1dGVBc3NpZ25tZW50XzNfMCgpOwotCi0gICAgICAgIHN0YXRlLl9mc3AtLTsKLSAgICAgICAgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKLQotICAgICAgICB9Ci0KLQotICAgICAgICB9Ci0KLQotICAgICAgICB9Ci0KLQotICAgICAgICB9Ci0KLQotICAgICAgICB9Ci0gICAgfQotICAgIC8vICRBTlRMUiBlbmQgc3lucHJlZDIyNF9JbnRlcm5hbERhdGFEU0wKLQotICAgIC8vICRBTlRMUiBzdGFydCBzeW5wcmVkMjI1X0ludGVybmFsRGF0YURTTAotICAgIHB1YmxpYyBmaW5hbCB2b2lkIHN5bnByZWQyMjVfSW50ZXJuYWxEYXRhRFNMX2ZyYWdtZW50KCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsgICAKLSAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjE3Mjg6MzogKCAoey4uLn0/ID0+ICggKCAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbGVYTUxfX0dyb3VwXzNfMV9fMCApICkgKSApICkKLSAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjE3Mjg6MzogKHsuLi59PyA9PiAoICggKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VGaWxlWE1MX19Hcm91cF8zXzFfXzAgKSApICkgKQotICAgICAgICB7Ci0gICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIxNzI4OjM6ICh7Li4ufT8gPT4gKCAoICggcnVsZV9fRGF0YUludGVyY2hhbmdlRmlsZVhNTF9fR3JvdXBfM18xX18wICkgKSApICkKLSAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjE3Mjk6NDogey4uLn0/ID0+ICggKCAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbGVYTUxfX0dyb3VwXzNfMV9fMCApICkgKQotICAgICAgICB7Ci0gICAgICAgIGlmICggISBnZXRVbm9yZGVyZWRHcm91cEhlbHBlcigpLmNhblNlbGVjdChncmFtbWFyQWNjZXNzLmdldERhdGFJbnRlcmNoYW5nZUZpbGVYTUxBY2Nlc3MoKS5nZXRVbm9yZGVyZWRHcm91cF8zKCksIDEpICkgewotICAgICAgICAgICAgaWYgKHN0YXRlLmJhY2t0cmFja2luZz4wKSB7c3RhdGUuZmFpbGVkPXRydWU7IHJldHVybiA7fQotICAgICAgICAgICAgdGhyb3cgbmV3IEZhaWxlZFByZWRpY2F0ZUV4Y2VwdGlvbihpbnB1dCwgInN5bnByZWQyMjVfSW50ZXJuYWxEYXRhRFNMIiwgImdldFVub3JkZXJlZEdyb3VwSGVscGVyKCkuY2FuU2VsZWN0KGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YUludGVyY2hhbmdlRmlsZVhNTEFjY2VzcygpLmdldFVub3JkZXJlZEdyb3VwXzMoKSwgMSkiKTsKLSAgICAgICAgfQotICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMTcyOToxMTg6ICggKCAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbGVYTUxfX0dyb3VwXzNfMV9fMCApICkgKQotICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMTczMDo1OiAoICggcnVsZV9fRGF0YUludGVyY2hhbmdlRmlsZVhNTF9fR3JvdXBfM18xX18wICkgKQotICAgICAgICB7Ci0gICAgICAgIGdldFVub3JkZXJlZEdyb3VwSGVscGVyKCkuc2VsZWN0KGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YUludGVyY2hhbmdlRmlsZVhNTEFjY2VzcygpLmdldFVub3JkZXJlZEdyb3VwXzMoKSwgMSk7Ci0gICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIxNzM2OjU6ICggKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VGaWxlWE1MX19Hcm91cF8zXzFfXzAgKSApCi0gICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIxNzM3OjY6ICggcnVsZV9fRGF0YUludGVyY2hhbmdlRmlsZVhNTF9fR3JvdXBfM18xX18wICkKLSAgICAgICAgewotICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKLSAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YUludGVyY2hhbmdlRmlsZVhNTEFjY2VzcygpLmdldEdyb3VwXzNfMSgpKTsgCi0gICAgICAgIH0KLSAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjE3Mzg6NjogKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VGaWxlWE1MX19Hcm91cF8zXzFfXzAgKQotICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMTczODo3OiBydWxlX19EYXRhSW50ZXJjaGFuZ2VGaWxlWE1MX19Hcm91cF8zXzFfXzAKLSAgICAgICAgewotICAgICAgICBwdXNoRm9sbG93KEZPTExPV18yKTsKLSAgICAgICAgcnVsZV9fRGF0YUludGVyY2hhbmdlRmlsZVhNTF9fR3JvdXBfM18xX18wKCk7Ci0KLSAgICAgICAgc3RhdGUuX2ZzcC0tOwotICAgICAgICBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOwotCi0gICAgICAgIH0KLQotCi0gICAgICAgIH0KLQotCi0gICAgICAgIH0KLQotCi0gICAgICAgIH0KLQotCi0gICAgICAgIH0KLSAgICB9CiAgICAgLy8gJEFOVExSIGVuZCBzeW5wcmVkMjI1X0ludGVybmFsRGF0YURTTAogCiAgICAgLy8gJEFOVExSIHN0YXJ0IHN5bnByZWQyMjZfSW50ZXJuYWxEYXRhRFNMCiAgICAgcHVibGljIGZpbmFsIHZvaWQgc3lucHJlZDIyNl9JbnRlcm5hbERhdGFEU0xfZnJhZ21lbnQoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geyAgIAotICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMTc3MjoyOiAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbGVYTUxfX1Vub3JkZXJlZEdyb3VwXzNfXzEgKQotICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMTc3MjoyOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VGaWxlWE1MX19Vbm9yZGVyZWRHcm91cF8zX18xCisgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIwNzUzOjQ6ICggcnVsZV9fWFRyeUNhdGNoRmluYWxseUV4cHJlc3Npb25fX0NhdGNoQ2xhdXNlc0Fzc2lnbm1lbnRfM18wXzAgKQorICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMDc1Mzo0OiBydWxlX19YVHJ5Q2F0Y2hGaW5hbGx5RXhwcmVzc2lvbl9fQ2F0Y2hDbGF1c2VzQXNzaWdubWVudF8zXzBfMAogICAgICAgICB7CiAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzIpOwotICAgICAgICBydWxlX19EYXRhSW50ZXJjaGFuZ2VGaWxlWE1MX19Vbm9yZGVyZWRHcm91cF8zX18xKCk7CisgICAgICAgIHJ1bGVfX1hUcnlDYXRjaEZpbmFsbHlFeHByZXNzaW9uX19DYXRjaENsYXVzZXNBc3NpZ25tZW50XzNfMF8wKCk7CiAKICAgICAgICAgc3RhdGUuX2ZzcC0tOwogICAgICAgICBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOwpAQCAtODQ0NjUsMTEgKzg5NDgwLDExIEBACiAKICAgICAvLyAkQU5UTFIgc3RhcnQgc3lucHJlZDIyN19JbnRlcm5hbERhdGFEU0wKICAgICBwdWJsaWMgZmluYWwgdm9pZCBzeW5wcmVkMjI3X0ludGVybmFsRGF0YURTTF9mcmFnbWVudCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7ICAgCi0gICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIxNzg0OjI6ICggcnVsZV9fRGF0YUludGVyY2hhbmdlRmlsZVhNTF9fVW5vcmRlcmVkR3JvdXBfM19fMiApCi0gICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIxNzg0OjI6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbGVYTUxfX1Vub3JkZXJlZEdyb3VwXzNfXzIKKyAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjA3ODA6MzogKCBydWxlX19YVHJ5Q2F0Y2hGaW5hbGx5RXhwcmVzc2lvbl9fR3JvdXBfM18wXzFfXzAgKQorICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMDc4MDozOiBydWxlX19YVHJ5Q2F0Y2hGaW5hbGx5RXhwcmVzc2lvbl9fR3JvdXBfM18wXzFfXzAKICAgICAgICAgewogICAgICAgICBwdXNoRm9sbG93KEZPTExPV18yKTsKLSAgICAgICAgcnVsZV9fRGF0YUludGVyY2hhbmdlRmlsZVhNTF9fVW5vcmRlcmVkR3JvdXBfM19fMigpOworICAgICAgICBydWxlX19YVHJ5Q2F0Y2hGaW5hbGx5RXhwcmVzc2lvbl9fR3JvdXBfM18wXzFfXzAoKTsKIAogICAgICAgICBzdGF0ZS5fZnNwLS07CiAgICAgICAgIGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CkBAIC04NDQ4MCwxMSArODk0OTUsMTEgQEAKIAogICAgIC8vICRBTlRMUiBzdGFydCBzeW5wcmVkMjI4X0ludGVybmFsRGF0YURTTAogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHN5bnByZWQyMjhfSW50ZXJuYWxEYXRhRFNMX2ZyYWdtZW50KCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsgICAKLSAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjE4MDg6MjogKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VGaWxlQ1NWX19Vbm9yZGVyZWRHcm91cF8zX18wICkKLSAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjE4MDg6MjogcnVsZV9fRGF0YUludGVyY2hhbmdlRmlsZUNTVl9fVW5vcmRlcmVkR3JvdXBfM19fMAorICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMTI5MzozOiAoIHJ1bGVfX1F1YWxpZmllZE5hbWVfX0dyb3VwXzFfXzAgKQorICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMTI5MzozOiBydWxlX19RdWFsaWZpZWROYW1lX19Hcm91cF8xX18wCiAgICAgICAgIHsKICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMik7Ci0gICAgICAgIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbGVDU1ZfX1Vub3JkZXJlZEdyb3VwXzNfXzAoKTsKKyAgICAgICAgcnVsZV9fUXVhbGlmaWVkTmFtZV9fR3JvdXBfMV9fMCgpOwogCiAgICAgICAgIHN0YXRlLl9mc3AtLTsKICAgICAgICAgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKQEAgLTg0NDkzLDI0OCArODk1MDgsMjggQEAKICAgICB9CiAgICAgLy8gJEFOVExSIGVuZCBzeW5wcmVkMjI4X0ludGVybmFsRGF0YURTTAogCi0gICAgLy8gJEFOVExSIHN0YXJ0IHN5bnByZWQyMjlfSW50ZXJuYWxEYXRhRFNMCi0gICAgcHVibGljIGZpbmFsIHZvaWQgc3lucHJlZDIyOV9JbnRlcm5hbERhdGFEU0xfZnJhZ21lbnQoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geyAgIAotICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMTgyMzozOiAoICh7Li4ufT8gPT4gKCAoICggcnVsZV9fRGF0YUludGVyY2hhbmdlRmlsZUNTVl9fR3JvdXBfM18wX18wICkgKSApICkgKQotICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMTgyMzozOiAoey4uLn0/ID0+ICggKCAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbGVDU1ZfX0dyb3VwXzNfMF9fMCApICkgKSApCi0gICAgICAgIHsKLSAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjE4MjM6MzogKHsuLi59PyA9PiAoICggKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VGaWxlQ1NWX19Hcm91cF8zXzBfXzAgKSApICkgKQotICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMTgyNDo0OiB7Li4ufT8gPT4gKCAoICggcnVsZV9fRGF0YUludGVyY2hhbmdlRmlsZUNTVl9fR3JvdXBfM18wX18wICkgKSApCi0gICAgICAgIHsKLSAgICAgICAgaWYgKCAhIGdldFVub3JkZXJlZEdyb3VwSGVscGVyKCkuY2FuU2VsZWN0KGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YUludGVyY2hhbmdlRmlsZUNTVkFjY2VzcygpLmdldFVub3JkZXJlZEdyb3VwXzMoKSwgMCkgKSB7Ci0gICAgICAgICAgICBpZiAoc3RhdGUuYmFja3RyYWNraW5nPjApIHtzdGF0ZS5mYWlsZWQ9dHJ1ZTsgcmV0dXJuIDt9Ci0gICAgICAgICAgICB0aHJvdyBuZXcgRmFpbGVkUHJlZGljYXRlRXhjZXB0aW9uKGlucHV0LCAic3lucHJlZDIyOV9JbnRlcm5hbERhdGFEU0wiLCAiZ2V0VW5vcmRlcmVkR3JvdXBIZWxwZXIoKS5jYW5TZWxlY3QoZ3JhbW1hckFjY2Vzcy5nZXREYXRhSW50ZXJjaGFuZ2VGaWxlQ1NWQWNjZXNzKCkuZ2V0VW5vcmRlcmVkR3JvdXBfMygpLCAwKSIpOwotICAgICAgICB9Ci0gICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIxODI0OjExODogKCAoICggcnVsZV9fRGF0YUludGVyY2hhbmdlRmlsZUNTVl9fR3JvdXBfM18wX18wICkgKSApCi0gICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIxODI1OjU6ICggKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VGaWxlQ1NWX19Hcm91cF8zXzBfXzAgKSApCi0gICAgICAgIHsKLSAgICAgICAgZ2V0VW5vcmRlcmVkR3JvdXBIZWxwZXIoKS5zZWxlY3QoZ3JhbW1hckFjY2Vzcy5nZXREYXRhSW50ZXJjaGFuZ2VGaWxlQ1NWQWNjZXNzKCkuZ2V0VW5vcmRlcmVkR3JvdXBfMygpLCAwKTsKLSAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjE4MzE6NTogKCAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbGVDU1ZfX0dyb3VwXzNfMF9fMCApICkKLSAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjE4MzI6NjogKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VGaWxlQ1NWX19Hcm91cF8zXzBfXzAgKQotICAgICAgICB7Ci0gICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewotICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXREYXRhSW50ZXJjaGFuZ2VGaWxlQ1NWQWNjZXNzKCkuZ2V0R3JvdXBfM18wKCkpOyAKLSAgICAgICAgfQotICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMTgzMzo2OiAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbGVDU1ZfX0dyb3VwXzNfMF9fMCApCi0gICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIxODMzOjc6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbGVDU1ZfX0dyb3VwXzNfMF9fMAotICAgICAgICB7Ci0gICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzIpOwotICAgICAgICBydWxlX19EYXRhSW50ZXJjaGFuZ2VGaWxlQ1NWX19Hcm91cF8zXzBfXzAoKTsKLQotICAgICAgICBzdGF0ZS5fZnNwLS07Ci0gICAgICAgIGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7Ci0KLSAgICAgICAgfQotCi0KLSAgICAgICAgfQotCi0KLSAgICAgICAgfQotCi0KLSAgICAgICAgfQotCi0KLSAgICAgICAgfQotICAgIH0KLSAgICAvLyAkQU5UTFIgZW5kIHN5bnByZWQyMjlfSW50ZXJuYWxEYXRhRFNMCi0KICAgICAvLyAkQU5UTFIgc3RhcnQgc3lucHJlZDIzMF9JbnRlcm5hbERhdGFEU0wKICAgICBwdWJsaWMgZmluYWwgdm9pZCBzeW5wcmVkMjMwX0ludGVybmFsRGF0YURTTF9mcmFnbWVudCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7ICAgCi0gICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIxODM4OjM6ICggKHsuLi59PyA9PiAoICggKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VGaWxlQ1NWX19Hcm91cF8zXzFfXzAgKSApICkgKSApCi0gICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIxODM4OjM6ICh7Li4ufT8gPT4gKCAoICggcnVsZV9fRGF0YUludGVyY2hhbmdlRmlsZUNTVl9fR3JvdXBfM18xX18wICkgKSApICkKLSAgICAgICAgewotICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMTgzODozOiAoey4uLn0/ID0+ICggKCAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbGVDU1ZfX0dyb3VwXzNfMV9fMCApICkgKSApCi0gICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIxODM5OjQ6IHsuLi59PyA9PiAoICggKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VGaWxlQ1NWX19Hcm91cF8zXzFfXzAgKSApICkKLSAgICAgICAgewotICAgICAgICBpZiAoICEgZ2V0VW5vcmRlcmVkR3JvdXBIZWxwZXIoKS5jYW5TZWxlY3QoZ3JhbW1hckFjY2Vzcy5nZXREYXRhSW50ZXJjaGFuZ2VGaWxlQ1NWQWNjZXNzKCkuZ2V0VW5vcmRlcmVkR3JvdXBfMygpLCAxKSApIHsKLSAgICAgICAgICAgIGlmIChzdGF0ZS5iYWNrdHJhY2tpbmc+MCkge3N0YXRlLmZhaWxlZD10cnVlOyByZXR1cm4gO30KLSAgICAgICAgICAgIHRocm93IG5ldyBGYWlsZWRQcmVkaWNhdGVFeGNlcHRpb24oaW5wdXQsICJzeW5wcmVkMjMwX0ludGVybmFsRGF0YURTTCIsICJnZXRVbm9yZGVyZWRHcm91cEhlbHBlcigpLmNhblNlbGVjdChncmFtbWFyQWNjZXNzLmdldERhdGFJbnRlcmNoYW5nZUZpbGVDU1ZBY2Nlc3MoKS5nZXRVbm9yZGVyZWRHcm91cF8zKCksIDEpIik7Ci0gICAgICAgIH0KLSAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjE4Mzk6MTE4OiAoICggKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VGaWxlQ1NWX19Hcm91cF8zXzFfXzAgKSApICkKLSAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjE4NDA6NTogKCAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbGVDU1ZfX0dyb3VwXzNfMV9fMCApICkKLSAgICAgICAgewotICAgICAgICBnZXRVbm9yZGVyZWRHcm91cEhlbHBlcigpLnNlbGVjdChncmFtbWFyQWNjZXNzLmdldERhdGFJbnRlcmNoYW5nZUZpbGVDU1ZBY2Nlc3MoKS5nZXRVbm9yZGVyZWRHcm91cF8zKCksIDEpOwotICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMTg0Njo1OiAoICggcnVsZV9fRGF0YUludGVyY2hhbmdlRmlsZUNTVl9fR3JvdXBfM18xX18wICkgKQotICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMTg0Nzo2OiAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbGVDU1ZfX0dyb3VwXzNfMV9fMCApCi0gICAgICAgIHsKLSAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7Ci0gICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldERhdGFJbnRlcmNoYW5nZUZpbGVDU1ZBY2Nlc3MoKS5nZXRHcm91cF8zXzEoKSk7IAotICAgICAgICB9Ci0gICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIxODQ4OjY6ICggcnVsZV9fRGF0YUludGVyY2hhbmdlRmlsZUNTVl9fR3JvdXBfM18xX18wICkKLSAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjE4NDg6NzogcnVsZV9fRGF0YUludGVyY2hhbmdlRmlsZUNTVl9fR3JvdXBfM18xX18wCisgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIxNTA5OjM6ICggcnVsZV9fSnZtVHlwZVJlZmVyZW5jZV9fR3JvdXBfMF8xX18wICkKKyAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjE1MDk6MzogcnVsZV9fSnZtVHlwZVJlZmVyZW5jZV9fR3JvdXBfMF8xX18wCiAgICAgICAgIHsKICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMik7Ci0gICAgICAgIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbGVDU1ZfX0dyb3VwXzNfMV9fMCgpOworICAgICAgICBydWxlX19Kdm1UeXBlUmVmZXJlbmNlX19Hcm91cF8wXzFfXzAoKTsKIAogICAgICAgICBzdGF0ZS5fZnNwLS07CiAgICAgICAgIGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CiAKICAgICAgICAgfQotCi0KLSAgICAgICAgfQotCi0KLSAgICAgICAgfQotCi0KLSAgICAgICAgfQotCi0KLSAgICAgICAgfQogICAgIH0KICAgICAvLyAkQU5UTFIgZW5kIHN5bnByZWQyMzBfSW50ZXJuYWxEYXRhRFNMCiAKLSAgICAvLyAkQU5UTFIgc3RhcnQgc3lucHJlZDIzMV9JbnRlcm5hbERhdGFEU0wKLSAgICBwdWJsaWMgZmluYWwgdm9pZCBzeW5wcmVkMjMxX0ludGVybmFsRGF0YURTTF9mcmFnbWVudCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7ICAgCi0gICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIxODUzOjM6ICggKHsuLi59PyA9PiAoICggKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VGaWxlQ1NWX19Hcm91cF8zXzJfXzAgKSApICkgKSApCi0gICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIxODUzOjM6ICh7Li4ufT8gPT4gKCAoICggcnVsZV9fRGF0YUludGVyY2hhbmdlRmlsZUNTVl9fR3JvdXBfM18yX18wICkgKSApICkKLSAgICAgICAgewotICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMTg1MzozOiAoey4uLn0/ID0+ICggKCAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbGVDU1ZfX0dyb3VwXzNfMl9fMCApICkgKSApCi0gICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIxODU0OjQ6IHsuLi59PyA9PiAoICggKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VGaWxlQ1NWX19Hcm91cF8zXzJfXzAgKSApICkKLSAgICAgICAgewotICAgICAgICBpZiAoICEgZ2V0VW5vcmRlcmVkR3JvdXBIZWxwZXIoKS5jYW5TZWxlY3QoZ3JhbW1hckFjY2Vzcy5nZXREYXRhSW50ZXJjaGFuZ2VGaWxlQ1NWQWNjZXNzKCkuZ2V0VW5vcmRlcmVkR3JvdXBfMygpLCAyKSApIHsKLSAgICAgICAgICAgIGlmIChzdGF0ZS5iYWNrdHJhY2tpbmc+MCkge3N0YXRlLmZhaWxlZD10cnVlOyByZXR1cm4gO30KLSAgICAgICAgICAgIHRocm93IG5ldyBGYWlsZWRQcmVkaWNhdGVFeGNlcHRpb24oaW5wdXQsICJzeW5wcmVkMjMxX0ludGVybmFsRGF0YURTTCIsICJnZXRVbm9yZGVyZWRHcm91cEhlbHBlcigpLmNhblNlbGVjdChncmFtbWFyQWNjZXNzLmdldERhdGFJbnRlcmNoYW5nZUZpbGVDU1ZBY2Nlc3MoKS5nZXRVbm9yZGVyZWRHcm91cF8zKCksIDIpIik7Ci0gICAgICAgIH0KLSAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjE4NTQ6MTE4OiAoICggKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VGaWxlQ1NWX19Hcm91cF8zXzJfXzAgKSApICkKLSAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjE4NTU6NTogKCAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbGVDU1ZfX0dyb3VwXzNfMl9fMCApICkKLSAgICAgICAgewotICAgICAgICBnZXRVbm9yZGVyZWRHcm91cEhlbHBlcigpLnNlbGVjdChncmFtbWFyQWNjZXNzLmdldERhdGFJbnRlcmNoYW5nZUZpbGVDU1ZBY2Nlc3MoKS5nZXRVbm9yZGVyZWRHcm91cF8zKCksIDIpOwotICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMTg2MTo1OiAoICggcnVsZV9fRGF0YUludGVyY2hhbmdlRmlsZUNTVl9fR3JvdXBfM18yX18wICkgKQotICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMTg2Mjo2OiAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbGVDU1ZfX0dyb3VwXzNfMl9fMCApCi0gICAgICAgIHsKLSAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7Ci0gICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldERhdGFJbnRlcmNoYW5nZUZpbGVDU1ZBY2Nlc3MoKS5nZXRHcm91cF8zXzIoKSk7IAotICAgICAgICB9Ci0gICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIxODYzOjY6ICggcnVsZV9fRGF0YUludGVyY2hhbmdlRmlsZUNTVl9fR3JvdXBfM18yX18wICkKLSAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjE4NjM6NzogcnVsZV9fRGF0YUludGVyY2hhbmdlRmlsZUNTVl9fR3JvdXBfM18yX18wCi0gICAgICAgIHsKLSAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMik7Ci0gICAgICAgIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbGVDU1ZfX0dyb3VwXzNfMl9fMCgpOwotCi0gICAgICAgIHN0YXRlLl9mc3AtLTsKLSAgICAgICAgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKLQotICAgICAgICB9Ci0KLQotICAgICAgICB9Ci0KLQotICAgICAgICB9Ci0KLQotICAgICAgICB9Ci0KLQotICAgICAgICB9Ci0gICAgfQotICAgIC8vICRBTlRMUiBlbmQgc3lucHJlZDIzMV9JbnRlcm5hbERhdGFEU0wKLQotICAgIC8vICRBTlRMUiBzdGFydCBzeW5wcmVkMjMyX0ludGVybmFsRGF0YURTTAotICAgIHB1YmxpYyBmaW5hbCB2b2lkIHN5bnByZWQyMzJfSW50ZXJuYWxEYXRhRFNMX2ZyYWdtZW50KCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsgICAKLSAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjE4Njg6MzogKCAoey4uLn0/ID0+ICggKCAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbGVDU1ZfX0luZGVudEFzc2lnbm1lbnRfM18zICkgKSApICkgKQotICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMTg2ODozOiAoey4uLn0/ID0+ICggKCAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbGVDU1ZfX0luZGVudEFzc2lnbm1lbnRfM18zICkgKSApICkKLSAgICAgICAgewotICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMTg2ODozOiAoey4uLn0/ID0+ICggKCAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbGVDU1ZfX0luZGVudEFzc2lnbm1lbnRfM18zICkgKSApICkKLSAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjE4Njk6NDogey4uLn0/ID0+ICggKCAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbGVDU1ZfX0luZGVudEFzc2lnbm1lbnRfM18zICkgKSApCi0gICAgICAgIHsKLSAgICAgICAgaWYgKCAhIGdldFVub3JkZXJlZEdyb3VwSGVscGVyKCkuY2FuU2VsZWN0KGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YUludGVyY2hhbmdlRmlsZUNTVkFjY2VzcygpLmdldFVub3JkZXJlZEdyb3VwXzMoKSwgMykgKSB7Ci0gICAgICAgICAgICBpZiAoc3RhdGUuYmFja3RyYWNraW5nPjApIHtzdGF0ZS5mYWlsZWQ9dHJ1ZTsgcmV0dXJuIDt9Ci0gICAgICAgICAgICB0aHJvdyBuZXcgRmFpbGVkUHJlZGljYXRlRXhjZXB0aW9uKGlucHV0LCAic3lucHJlZDIzMl9JbnRlcm5hbERhdGFEU0wiLCAiZ2V0VW5vcmRlcmVkR3JvdXBIZWxwZXIoKS5jYW5TZWxlY3QoZ3JhbW1hckFjY2Vzcy5nZXREYXRhSW50ZXJjaGFuZ2VGaWxlQ1NWQWNjZXNzKCkuZ2V0VW5vcmRlcmVkR3JvdXBfMygpLCAzKSIpOwotICAgICAgICB9Ci0gICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIxODY5OjExODogKCAoICggcnVsZV9fRGF0YUludGVyY2hhbmdlRmlsZUNTVl9fSW5kZW50QXNzaWdubWVudF8zXzMgKSApICkKLSAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjE4NzA6NTogKCAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbGVDU1ZfX0luZGVudEFzc2lnbm1lbnRfM18zICkgKQotICAgICAgICB7Ci0gICAgICAgIGdldFVub3JkZXJlZEdyb3VwSGVscGVyKCkuc2VsZWN0KGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YUludGVyY2hhbmdlRmlsZUNTVkFjY2VzcygpLmdldFVub3JkZXJlZEdyb3VwXzMoKSwgMyk7Ci0gICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIxODc2OjU6ICggKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VGaWxlQ1NWX19JbmRlbnRBc3NpZ25tZW50XzNfMyApICkKLSAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjE4Nzc6NjogKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VGaWxlQ1NWX19JbmRlbnRBc3NpZ25tZW50XzNfMyApCi0gICAgICAgIHsKLSAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7Ci0gICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldERhdGFJbnRlcmNoYW5nZUZpbGVDU1ZBY2Nlc3MoKS5nZXRJbmRlbnRBc3NpZ25tZW50XzNfMygpKTsgCi0gICAgICAgIH0KLSAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjE4Nzg6NjogKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VGaWxlQ1NWX19JbmRlbnRBc3NpZ25tZW50XzNfMyApCi0gICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIxODc4Ojc6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbGVDU1ZfX0luZGVudEFzc2lnbm1lbnRfM18zCi0gICAgICAgIHsKLSAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMik7Ci0gICAgICAgIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbGVDU1ZfX0luZGVudEFzc2lnbm1lbnRfM18zKCk7Ci0KLSAgICAgICAgc3RhdGUuX2ZzcC0tOwotICAgICAgICBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOwotCi0gICAgICAgIH0KLQotCi0gICAgICAgIH0KLQotCi0gICAgICAgIH0KLQotCi0gICAgICAgIH0KLQotCi0gICAgICAgIH0KLSAgICB9Ci0gICAgLy8gJEFOVExSIGVuZCBzeW5wcmVkMjMyX0ludGVybmFsRGF0YURTTAotCi0gICAgLy8gJEFOVExSIHN0YXJ0IHN5bnByZWQyMzNfSW50ZXJuYWxEYXRhRFNMCi0gICAgcHVibGljIGZpbmFsIHZvaWQgc3lucHJlZDIzM19JbnRlcm5hbERhdGFEU0xfZnJhZ21lbnQoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geyAgIAotICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMTg4MzozOiAoICh7Li4ufT8gPT4gKCAoICggcnVsZV9fRGF0YUludGVyY2hhbmdlRmlsZUNTVl9fR3JvdXBfM180X18wICkgKSApICkgKQotICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMTg4MzozOiAoey4uLn0/ID0+ICggKCAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbGVDU1ZfX0dyb3VwXzNfNF9fMCApICkgKSApCi0gICAgICAgIHsKLSAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjE4ODM6MzogKHsuLi59PyA9PiAoICggKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VGaWxlQ1NWX19Hcm91cF8zXzRfXzAgKSApICkgKQotICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMTg4NDo0OiB7Li4ufT8gPT4gKCAoICggcnVsZV9fRGF0YUludGVyY2hhbmdlRmlsZUNTVl9fR3JvdXBfM180X18wICkgKSApCi0gICAgICAgIHsKLSAgICAgICAgaWYgKCAhIGdldFVub3JkZXJlZEdyb3VwSGVscGVyKCkuY2FuU2VsZWN0KGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YUludGVyY2hhbmdlRmlsZUNTVkFjY2VzcygpLmdldFVub3JkZXJlZEdyb3VwXzMoKSwgNCkgKSB7Ci0gICAgICAgICAgICBpZiAoc3RhdGUuYmFja3RyYWNraW5nPjApIHtzdGF0ZS5mYWlsZWQ9dHJ1ZTsgcmV0dXJuIDt9Ci0gICAgICAgICAgICB0aHJvdyBuZXcgRmFpbGVkUHJlZGljYXRlRXhjZXB0aW9uKGlucHV0LCAic3lucHJlZDIzM19JbnRlcm5hbERhdGFEU0wiLCAiZ2V0VW5vcmRlcmVkR3JvdXBIZWxwZXIoKS5jYW5TZWxlY3QoZ3JhbW1hckFjY2Vzcy5nZXREYXRhSW50ZXJjaGFuZ2VGaWxlQ1NWQWNjZXNzKCkuZ2V0VW5vcmRlcmVkR3JvdXBfMygpLCA0KSIpOwotICAgICAgICB9Ci0gICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIxODg0OjExODogKCAoICggcnVsZV9fRGF0YUludGVyY2hhbmdlRmlsZUNTVl9fR3JvdXBfM180X18wICkgKSApCi0gICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIxODg1OjU6ICggKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VGaWxlQ1NWX19Hcm91cF8zXzRfXzAgKSApCi0gICAgICAgIHsKLSAgICAgICAgZ2V0VW5vcmRlcmVkR3JvdXBIZWxwZXIoKS5zZWxlY3QoZ3JhbW1hckFjY2Vzcy5nZXREYXRhSW50ZXJjaGFuZ2VGaWxlQ1NWQWNjZXNzKCkuZ2V0VW5vcmRlcmVkR3JvdXBfMygpLCA0KTsKLSAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjE4OTE6NTogKCAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbGVDU1ZfX0dyb3VwXzNfNF9fMCApICkKLSAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjE4OTI6NjogKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VGaWxlQ1NWX19Hcm91cF8zXzRfXzAgKQotICAgICAgICB7Ci0gICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewotICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXREYXRhSW50ZXJjaGFuZ2VGaWxlQ1NWQWNjZXNzKCkuZ2V0R3JvdXBfM180KCkpOyAKLSAgICAgICAgfQotICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMTg5Mzo2OiAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbGVDU1ZfX0dyb3VwXzNfNF9fMCApCi0gICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIxODkzOjc6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbGVDU1ZfX0dyb3VwXzNfNF9fMAotICAgICAgICB7Ci0gICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzIpOwotICAgICAgICBydWxlX19EYXRhSW50ZXJjaGFuZ2VGaWxlQ1NWX19Hcm91cF8zXzRfXzAoKTsKLQotICAgICAgICBzdGF0ZS5fZnNwLS07Ci0gICAgICAgIGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7Ci0KLSAgICAgICAgfQotCi0KLSAgICAgICAgfQotCi0KLSAgICAgICAgfQotCi0KLSAgICAgICAgfQotCi0KLSAgICAgICAgfQotICAgIH0KLSAgICAvLyAkQU5UTFIgZW5kIHN5bnByZWQyMzNfSW50ZXJuYWxEYXRhRFNMCi0KICAgICAvLyAkQU5UTFIgc3RhcnQgc3lucHJlZDIzNF9JbnRlcm5hbERhdGFEU0wKICAgICBwdWJsaWMgZmluYWwgdm9pZCBzeW5wcmVkMjM0X0ludGVybmFsRGF0YURTTF9mcmFnbWVudCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7ICAgCi0gICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIxOTI3OjI6ICggcnVsZV9fRGF0YUludGVyY2hhbmdlRmlsZUNTVl9fVW5vcmRlcmVkR3JvdXBfM19fMSApCi0gICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIxOTI3OjI6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbGVDU1ZfX1Vub3JkZXJlZEdyb3VwXzNfXzEKKyAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjE5Njg6MzogKCBydWxlX19Kdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZV9fR3JvdXBfMV9fMCApCisgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIxOTY4OjM6IHJ1bGVfX0p2bVBhcmFtZXRlcml6ZWRUeXBlUmVmZXJlbmNlX19Hcm91cF8xX18wCiAgICAgICAgIHsKICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMik7Ci0gICAgICAgIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbGVDU1ZfX1Vub3JkZXJlZEdyb3VwXzNfXzEoKTsKKyAgICAgICAgcnVsZV9fSnZtUGFyYW1ldGVyaXplZFR5cGVSZWZlcmVuY2VfX0dyb3VwXzFfXzAoKTsKIAogICAgICAgICBzdGF0ZS5fZnNwLS07CiAgICAgICAgIGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CkBAIC04NDc0MywyOCArODk1MzgsMTMgQEAKICAgICB9CiAgICAgLy8gJEFOVExSIGVuZCBzeW5wcmVkMjM0X0ludGVybmFsRGF0YURTTAogCi0gICAgLy8gJEFOVExSIHN0YXJ0IHN5bnByZWQyMzVfSW50ZXJuYWxEYXRhRFNMCi0gICAgcHVibGljIGZpbmFsIHZvaWQgc3lucHJlZDIzNV9JbnRlcm5hbERhdGFEU0xfZnJhZ21lbnQoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geyAgIAotICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMTkzOToyOiAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbGVDU1ZfX1Vub3JkZXJlZEdyb3VwXzNfXzIgKQotICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMTkzOToyOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VGaWxlQ1NWX19Vbm9yZGVyZWRHcm91cF8zX18yCi0gICAgICAgIHsKLSAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMik7Ci0gICAgICAgIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbGVDU1ZfX1Vub3JkZXJlZEdyb3VwXzNfXzIoKTsKLQotICAgICAgICBzdGF0ZS5fZnNwLS07Ci0gICAgICAgIGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7Ci0KLSAgICAgICAgfQotICAgIH0KLSAgICAvLyAkQU5UTFIgZW5kIHN5bnByZWQyMzVfSW50ZXJuYWxEYXRhRFNMCi0KICAgICAvLyAkQU5UTFIgc3RhcnQgc3lucHJlZDIzNl9JbnRlcm5hbERhdGFEU0wKICAgICBwdWJsaWMgZmluYWwgdm9pZCBzeW5wcmVkMjM2X0ludGVybmFsRGF0YURTTF9mcmFnbWVudCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7ICAgCi0gICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIxOTUxOjI6ICggcnVsZV9fRGF0YUludGVyY2hhbmdlRmlsZUNTVl9fVW5vcmRlcmVkR3JvdXBfM19fMyApCi0gICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIxOTUxOjI6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbGVDU1ZfX1Vub3JkZXJlZEdyb3VwXzNfXzMKKyAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjIxMDM6MzogKCBydWxlX19Kdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZV9fR3JvdXBfMV80X18wICkKKyAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjIxMDM6MzogcnVsZV9fSnZtUGFyYW1ldGVyaXplZFR5cGVSZWZlcmVuY2VfX0dyb3VwXzFfNF9fMAogICAgICAgICB7CiAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzIpOwotICAgICAgICBydWxlX19EYXRhSW50ZXJjaGFuZ2VGaWxlQ1NWX19Vbm9yZGVyZWRHcm91cF8zX18zKCk7CisgICAgICAgIHJ1bGVfX0p2bVBhcmFtZXRlcml6ZWRUeXBlUmVmZXJlbmNlX19Hcm91cF8xXzRfXzAoKTsKIAogICAgICAgICBzdGF0ZS5fZnNwLS07CiAgICAgICAgIGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CkBAIC04NDc3NSwxMSArODk1NTUsMTEgQEAKIAogICAgIC8vICRBTlRMUiBzdGFydCBzeW5wcmVkMjM3X0ludGVybmFsRGF0YURTTAogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHN5bnByZWQyMzdfSW50ZXJuYWxEYXRhRFNMX2ZyYWdtZW50KCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsgICAKLSAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjE5NjM6MjogKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VGaWxlQ1NWX19Vbm9yZGVyZWRHcm91cF8zX180ICkKLSAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjE5NjM6MjogcnVsZV9fRGF0YUludGVyY2hhbmdlRmlsZUNTVl9fVW5vcmRlcmVkR3JvdXBfM19fNAorICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMjIzODozOiAoIHJ1bGVfX0p2bVBhcmFtZXRlcml6ZWRUeXBlUmVmZXJlbmNlX19Hcm91cF8xXzRfMl9fMCApCisgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIyMjM4OjM6IHJ1bGVfX0p2bVBhcmFtZXRlcml6ZWRUeXBlUmVmZXJlbmNlX19Hcm91cF8xXzRfMl9fMAogICAgICAgICB7CiAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzIpOwotICAgICAgICBydWxlX19EYXRhSW50ZXJjaGFuZ2VGaWxlQ1NWX19Vbm9yZGVyZWRHcm91cF8zX180KCk7CisgICAgICAgIHJ1bGVfX0p2bVBhcmFtZXRlcml6ZWRUeXBlUmVmZXJlbmNlX19Hcm91cF8xXzRfMl9fMCgpOwogCiAgICAgICAgIHN0YXRlLl9mc3AtLTsKICAgICAgICAgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKQEAgLTg0Nzg4LDEwNSArODk1NjgsMTMgQEAKICAgICB9CiAgICAgLy8gJEFOVExSIGVuZCBzeW5wcmVkMjM3X0ludGVybmFsRGF0YURTTAogCi0gICAgLy8gJEFOVExSIHN0YXJ0IHN5bnByZWQyMzhfSW50ZXJuYWxEYXRhRFNMCi0gICAgcHVibGljIGZpbmFsIHZvaWQgc3lucHJlZDIzOF9JbnRlcm5hbERhdGFEU0xfZnJhZ21lbnQoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geyAgIAotICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMTk3NToyOiAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbGVDU1ZfX1Vub3JkZXJlZEdyb3VwXzNfXzUgKQotICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMTk3NToyOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VGaWxlQ1NWX19Vbm9yZGVyZWRHcm91cF8zX181Ci0gICAgICAgIHsKLSAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMik7Ci0gICAgICAgIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbGVDU1ZfX1Vub3JkZXJlZEdyb3VwXzNfXzUoKTsKLQotICAgICAgICBzdGF0ZS5fZnNwLS07Ci0gICAgICAgIGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7Ci0KLSAgICAgICAgfQotICAgIH0KLSAgICAvLyAkQU5UTFIgZW5kIHN5bnByZWQyMzhfSW50ZXJuYWxEYXRhRFNMCi0KLSAgICAvLyAkQU5UTFIgc3RhcnQgc3lucHJlZDIzOV9JbnRlcm5hbERhdGFEU0wKLSAgICBwdWJsaWMgZmluYWwgdm9pZCBzeW5wcmVkMjM5X0ludGVybmFsRGF0YURTTF9mcmFnbWVudCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7ICAgCi0gICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIxOTk5OjI6ICggcnVsZV9fRGF0YUludGVyY2hhbmdlRmlsZUVESV9fVW5vcmRlcmVkR3JvdXBfM19fMCApCi0gICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIxOTk5OjI6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbGVFRElfX1Vub3JkZXJlZEdyb3VwXzNfXzAKLSAgICAgICAgewotICAgICAgICBwdXNoRm9sbG93KEZPTExPV18yKTsKLSAgICAgICAgcnVsZV9fRGF0YUludGVyY2hhbmdlRmlsZUVESV9fVW5vcmRlcmVkR3JvdXBfM19fMCgpOwotCi0gICAgICAgIHN0YXRlLl9mc3AtLTsKLSAgICAgICAgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKLQotICAgICAgICB9Ci0gICAgfQotICAgIC8vICRBTlRMUiBlbmQgc3lucHJlZDIzOV9JbnRlcm5hbERhdGFEU0wKLQotICAgIC8vICRBTlRMUiBzdGFydCBzeW5wcmVkMjQwX0ludGVybmFsRGF0YURTTAotICAgIHB1YmxpYyBmaW5hbCB2b2lkIHN5bnByZWQyNDBfSW50ZXJuYWxEYXRhRFNMX2ZyYWdtZW50KCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsgICAKLSAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjIwMTQ6MzogKCAoey4uLn0/ID0+ICggKCAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbGVFRElfX0dyb3VwXzNfMF9fMCApICkgKSApICkKLSAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjIwMTQ6MzogKHsuLi59PyA9PiAoICggKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VGaWxlRURJX19Hcm91cF8zXzBfXzAgKSApICkgKQotICAgICAgICB7Ci0gICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIyMDE0OjM6ICh7Li4ufT8gPT4gKCAoICggcnVsZV9fRGF0YUludGVyY2hhbmdlRmlsZUVESV9fR3JvdXBfM18wX18wICkgKSApICkKLSAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjIwMTU6NDogey4uLn0/ID0+ICggKCAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbGVFRElfX0dyb3VwXzNfMF9fMCApICkgKQotICAgICAgICB7Ci0gICAgICAgIGlmICggISBnZXRVbm9yZGVyZWRHcm91cEhlbHBlcigpLmNhblNlbGVjdChncmFtbWFyQWNjZXNzLmdldERhdGFJbnRlcmNoYW5nZUZpbGVFRElBY2Nlc3MoKS5nZXRVbm9yZGVyZWRHcm91cF8zKCksIDApICkgewotICAgICAgICAgICAgaWYgKHN0YXRlLmJhY2t0cmFja2luZz4wKSB7c3RhdGUuZmFpbGVkPXRydWU7IHJldHVybiA7fQotICAgICAgICAgICAgdGhyb3cgbmV3IEZhaWxlZFByZWRpY2F0ZUV4Y2VwdGlvbihpbnB1dCwgInN5bnByZWQyNDBfSW50ZXJuYWxEYXRhRFNMIiwgImdldFVub3JkZXJlZEdyb3VwSGVscGVyKCkuY2FuU2VsZWN0KGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YUludGVyY2hhbmdlRmlsZUVESUFjY2VzcygpLmdldFVub3JkZXJlZEdyb3VwXzMoKSwgMCkiKTsKLSAgICAgICAgfQotICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMjAxNToxMTg6ICggKCAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbGVFRElfX0dyb3VwXzNfMF9fMCApICkgKQotICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMjAxNjo1OiAoICggcnVsZV9fRGF0YUludGVyY2hhbmdlRmlsZUVESV9fR3JvdXBfM18wX18wICkgKQotICAgICAgICB7Ci0gICAgICAgIGdldFVub3JkZXJlZEdyb3VwSGVscGVyKCkuc2VsZWN0KGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YUludGVyY2hhbmdlRmlsZUVESUFjY2VzcygpLmdldFVub3JkZXJlZEdyb3VwXzMoKSwgMCk7Ci0gICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIyMDIyOjU6ICggKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VGaWxlRURJX19Hcm91cF8zXzBfXzAgKSApCi0gICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIyMDIzOjY6ICggcnVsZV9fRGF0YUludGVyY2hhbmdlRmlsZUVESV9fR3JvdXBfM18wX18wICkKLSAgICAgICAgewotICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKLSAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YUludGVyY2hhbmdlRmlsZUVESUFjY2VzcygpLmdldEdyb3VwXzNfMCgpKTsgCi0gICAgICAgIH0KLSAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjIwMjQ6NjogKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VGaWxlRURJX19Hcm91cF8zXzBfXzAgKQotICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMjAyNDo3OiBydWxlX19EYXRhSW50ZXJjaGFuZ2VGaWxlRURJX19Hcm91cF8zXzBfXzAKLSAgICAgICAgewotICAgICAgICBwdXNoRm9sbG93KEZPTExPV18yKTsKLSAgICAgICAgcnVsZV9fRGF0YUludGVyY2hhbmdlRmlsZUVESV9fR3JvdXBfM18wX18wKCk7Ci0KLSAgICAgICAgc3RhdGUuX2ZzcC0tOwotICAgICAgICBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOwotCi0gICAgICAgIH0KLQotCi0gICAgICAgIH0KLQotCi0gICAgICAgIH0KLQotCi0gICAgICAgIH0KLQotCi0gICAgICAgIH0KLSAgICB9Ci0gICAgLy8gJEFOVExSIGVuZCBzeW5wcmVkMjQwX0ludGVybmFsRGF0YURTTAotCi0gICAgLy8gJEFOVExSIHN0YXJ0IHN5bnByZWQyNDFfSW50ZXJuYWxEYXRhRFNMCi0gICAgcHVibGljIGZpbmFsIHZvaWQgc3lucHJlZDI0MV9JbnRlcm5hbERhdGFEU0xfZnJhZ21lbnQoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geyAgIAotICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMjA1ODoyOiAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbGVFRElfX1Vub3JkZXJlZEdyb3VwXzNfXzEgKQotICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMjA1ODoyOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VGaWxlRURJX19Vbm9yZGVyZWRHcm91cF8zX18xCi0gICAgICAgIHsKLSAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMik7Ci0gICAgICAgIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbGVFRElfX1Vub3JkZXJlZEdyb3VwXzNfXzEoKTsKLQotICAgICAgICBzdGF0ZS5fZnNwLS07Ci0gICAgICAgIGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7Ci0KLSAgICAgICAgfQotICAgIH0KLSAgICAvLyAkQU5UTFIgZW5kIHN5bnByZWQyNDFfSW50ZXJuYWxEYXRhRFNMCi0KICAgICAvLyAkQU5UTFIgc3RhcnQgc3lucHJlZDI0Ml9JbnRlcm5hbERhdGFEU0wKICAgICBwdWJsaWMgZmluYWwgdm9pZCBzeW5wcmVkMjQyX0ludGVybmFsRGF0YURTTF9mcmFnbWVudCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7ICAgCi0gICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIyMDgyOjI6ICggcnVsZV9fRGF0YUludGVyY2hhbmdlTG9va3VwX19Vbm9yZGVyZWRHcm91cF8xMF9fMCApCi0gICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIyMDgyOjI6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUxvb2t1cF9fVW5vcmRlcmVkR3JvdXBfMTBfXzAKKyAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjMwMzY6MjogKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VGaWxlWE1MX19Vbm9yZGVyZWRHcm91cF8zX18wICkKKyAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjMwMzY6MjogcnVsZV9fRGF0YUludGVyY2hhbmdlRmlsZVhNTF9fVW5vcmRlcmVkR3JvdXBfM19fMAogICAgICAgICB7CiAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzIpOwotICAgICAgICBydWxlX19EYXRhSW50ZXJjaGFuZ2VMb29rdXBfX1Vub3JkZXJlZEdyb3VwXzEwX18wKCk7CisgICAgICAgIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbGVYTUxfX1Vub3JkZXJlZEdyb3VwXzNfXzAoKTsKIAogICAgICAgICBzdGF0ZS5fZnNwLS07CiAgICAgICAgIGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CkBAIC04NDg5NywzMSArODk1ODUsMzEgQEAKIAogICAgIC8vICRBTlRMUiBzdGFydCBzeW5wcmVkMjQzX0ludGVybmFsRGF0YURTTAogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHN5bnByZWQyNDNfSW50ZXJuYWxEYXRhRFNMX2ZyYWdtZW50KCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsgICAKLSAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjIwOTc6MzogKCAoey4uLn0/ID0+ICggKCAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUxvb2t1cF9fQWxsb3dOb1Jlc3VsdEFzc2lnbm1lbnRfMTBfMCApICkgKSApICkKLSAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjIwOTc6MzogKHsuLi59PyA9PiAoICggKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VMb29rdXBfX0FsbG93Tm9SZXN1bHRBc3NpZ25tZW50XzEwXzAgKSApICkgKQorICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMzA1MTozOiAoICh7Li4ufT8gPT4gKCAoICggcnVsZV9fRGF0YUludGVyY2hhbmdlRmlsZVhNTF9fQnlBdHRyaWJ1dGVBc3NpZ25tZW50XzNfMCApICkgKSApICkKKyAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjMwNTE6MzogKHsuLi59PyA9PiAoICggKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VGaWxlWE1MX19CeUF0dHJpYnV0ZUFzc2lnbm1lbnRfM18wICkgKSApICkKICAgICAgICAgewotICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMjA5NzozOiAoey4uLn0/ID0+ICggKCAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUxvb2t1cF9fQWxsb3dOb1Jlc3VsdEFzc2lnbm1lbnRfMTBfMCApICkgKSApCi0gICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIyMDk4OjQ6IHsuLi59PyA9PiAoICggKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VMb29rdXBfX0FsbG93Tm9SZXN1bHRBc3NpZ25tZW50XzEwXzAgKSApICkKKyAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjMwNTE6MzogKHsuLi59PyA9PiAoICggKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VGaWxlWE1MX19CeUF0dHJpYnV0ZUFzc2lnbm1lbnRfM18wICkgKSApICkKKyAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjMwNTI6NDogey4uLn0/ID0+ICggKCAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbGVYTUxfX0J5QXR0cmlidXRlQXNzaWdubWVudF8zXzAgKSApICkKICAgICAgICAgewotICAgICAgICBpZiAoICEgZ2V0VW5vcmRlcmVkR3JvdXBIZWxwZXIoKS5jYW5TZWxlY3QoZ3JhbW1hckFjY2Vzcy5nZXREYXRhSW50ZXJjaGFuZ2VMb29rdXBBY2Nlc3MoKS5nZXRVbm9yZGVyZWRHcm91cF8xMCgpLCAwKSApIHsKKyAgICAgICAgaWYgKCAhIGdldFVub3JkZXJlZEdyb3VwSGVscGVyKCkuY2FuU2VsZWN0KGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YUludGVyY2hhbmdlRmlsZVhNTEFjY2VzcygpLmdldFVub3JkZXJlZEdyb3VwXzMoKSwgMCkgKSB7CiAgICAgICAgICAgICBpZiAoc3RhdGUuYmFja3RyYWNraW5nPjApIHtzdGF0ZS5mYWlsZWQ9dHJ1ZTsgcmV0dXJuIDt9Ci0gICAgICAgICAgICB0aHJvdyBuZXcgRmFpbGVkUHJlZGljYXRlRXhjZXB0aW9uKGlucHV0LCAic3lucHJlZDI0M19JbnRlcm5hbERhdGFEU0wiLCAiZ2V0VW5vcmRlcmVkR3JvdXBIZWxwZXIoKS5jYW5TZWxlY3QoZ3JhbW1hckFjY2Vzcy5nZXREYXRhSW50ZXJjaGFuZ2VMb29rdXBBY2Nlc3MoKS5nZXRVbm9yZGVyZWRHcm91cF8xMCgpLCAwKSIpOworICAgICAgICAgICAgdGhyb3cgbmV3IEZhaWxlZFByZWRpY2F0ZUV4Y2VwdGlvbihpbnB1dCwgInN5bnByZWQyNDNfSW50ZXJuYWxEYXRhRFNMIiwgImdldFVub3JkZXJlZEdyb3VwSGVscGVyKCkuY2FuU2VsZWN0KGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YUludGVyY2hhbmdlRmlsZVhNTEFjY2VzcygpLmdldFVub3JkZXJlZEdyb3VwXzMoKSwgMCkiKTsKICAgICAgICAgfQotICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMjA5ODoxMTg6ICggKCAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUxvb2t1cF9fQWxsb3dOb1Jlc3VsdEFzc2lnbm1lbnRfMTBfMCApICkgKQotICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMjA5OTo1OiAoICggcnVsZV9fRGF0YUludGVyY2hhbmdlTG9va3VwX19BbGxvd05vUmVzdWx0QXNzaWdubWVudF8xMF8wICkgKQorICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMzA1MjoxMTg6ICggKCAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbGVYTUxfX0J5QXR0cmlidXRlQXNzaWdubWVudF8zXzAgKSApICkKKyAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjMwNTM6NTogKCAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbGVYTUxfX0J5QXR0cmlidXRlQXNzaWdubWVudF8zXzAgKSApCiAgICAgICAgIHsKLSAgICAgICAgZ2V0VW5vcmRlcmVkR3JvdXBIZWxwZXIoKS5zZWxlY3QoZ3JhbW1hckFjY2Vzcy5nZXREYXRhSW50ZXJjaGFuZ2VMb29rdXBBY2Nlc3MoKS5nZXRVbm9yZGVyZWRHcm91cF8xMCgpLCAwKTsKLSAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjIxMDU6NTogKCAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUxvb2t1cF9fQWxsb3dOb1Jlc3VsdEFzc2lnbm1lbnRfMTBfMCApICkKLSAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjIxMDY6NjogKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VMb29rdXBfX0FsbG93Tm9SZXN1bHRBc3NpZ25tZW50XzEwXzAgKQorICAgICAgICBnZXRVbm9yZGVyZWRHcm91cEhlbHBlcigpLnNlbGVjdChncmFtbWFyQWNjZXNzLmdldERhdGFJbnRlcmNoYW5nZUZpbGVYTUxBY2Nlc3MoKS5nZXRVbm9yZGVyZWRHcm91cF8zKCksIDApOworICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMzA1OTo1OiAoICggcnVsZV9fRGF0YUludGVyY2hhbmdlRmlsZVhNTF9fQnlBdHRyaWJ1dGVBc3NpZ25tZW50XzNfMCApICkKKyAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjMwNjA6NjogKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VGaWxlWE1MX19CeUF0dHJpYnV0ZUFzc2lnbm1lbnRfM18wICkKICAgICAgICAgewogICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKLSAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YUludGVyY2hhbmdlTG9va3VwQWNjZXNzKCkuZ2V0QWxsb3dOb1Jlc3VsdEFzc2lnbm1lbnRfMTBfMCgpKTsgCisgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldERhdGFJbnRlcmNoYW5nZUZpbGVYTUxBY2Nlc3MoKS5nZXRCeUF0dHJpYnV0ZUFzc2lnbm1lbnRfM18wKCkpOyAKICAgICAgICAgfQotICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMjEwNzo2OiAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUxvb2t1cF9fQWxsb3dOb1Jlc3VsdEFzc2lnbm1lbnRfMTBfMCApCi0gICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIyMTA3Ojc6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUxvb2t1cF9fQWxsb3dOb1Jlc3VsdEFzc2lnbm1lbnRfMTBfMAorICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMzA2MTo2OiAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbGVYTUxfX0J5QXR0cmlidXRlQXNzaWdubWVudF8zXzAgKQorICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMzA2MTo3OiBydWxlX19EYXRhSW50ZXJjaGFuZ2VGaWxlWE1MX19CeUF0dHJpYnV0ZUFzc2lnbm1lbnRfM18wCiAgICAgICAgIHsKICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMik7Ci0gICAgICAgIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUxvb2t1cF9fQWxsb3dOb1Jlc3VsdEFzc2lnbm1lbnRfMTBfMCgpOworICAgICAgICBydWxlX19EYXRhSW50ZXJjaGFuZ2VGaWxlWE1MX19CeUF0dHJpYnV0ZUFzc2lnbm1lbnRfM18wKCk7CiAKICAgICAgICAgc3RhdGUuX2ZzcC0tOwogICAgICAgICBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOwpAQCAtODQ5NDQsMzEgKzg5NjMyLDMxIEBACiAKICAgICAvLyAkQU5UTFIgc3RhcnQgc3lucHJlZDI0NF9JbnRlcm5hbERhdGFEU0wKICAgICBwdWJsaWMgZmluYWwgdm9pZCBzeW5wcmVkMjQ0X0ludGVybmFsRGF0YURTTF9mcmFnbWVudCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7ICAgCi0gICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIyMTEyOjM6ICggKHsuLi59PyA9PiAoICggKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VMb29rdXBfX0FsbG93Tm9udW5pcXVlUmVzdWx0QXNzaWdubWVudF8xMF8xICkgKSApICkgKQotICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMjExMjozOiAoey4uLn0/ID0+ICggKCAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUxvb2t1cF9fQWxsb3dOb251bmlxdWVSZXN1bHRBc3NpZ25tZW50XzEwXzEgKSApICkgKQorICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMzA2NjozOiAoICh7Li4ufT8gPT4gKCAoICggcnVsZV9fRGF0YUludGVyY2hhbmdlRmlsZVhNTF9fR3JvdXBfM18xX18wICkgKSApICkgKQorICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMzA2NjozOiAoey4uLn0/ID0+ICggKCAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbGVYTUxfX0dyb3VwXzNfMV9fMCApICkgKSApCiAgICAgICAgIHsKLSAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjIxMTI6MzogKHsuLi59PyA9PiAoICggKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VMb29rdXBfX0FsbG93Tm9udW5pcXVlUmVzdWx0QXNzaWdubWVudF8xMF8xICkgKSApICkKLSAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjIxMTM6NDogey4uLn0/ID0+ICggKCAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUxvb2t1cF9fQWxsb3dOb251bmlxdWVSZXN1bHRBc3NpZ25tZW50XzEwXzEgKSApICkKKyAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjMwNjY6MzogKHsuLi59PyA9PiAoICggKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VGaWxlWE1MX19Hcm91cF8zXzFfXzAgKSApICkgKQorICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMzA2Nzo0OiB7Li4ufT8gPT4gKCAoICggcnVsZV9fRGF0YUludGVyY2hhbmdlRmlsZVhNTF9fR3JvdXBfM18xX18wICkgKSApCiAgICAgICAgIHsKLSAgICAgICAgaWYgKCAhIGdldFVub3JkZXJlZEdyb3VwSGVscGVyKCkuY2FuU2VsZWN0KGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YUludGVyY2hhbmdlTG9va3VwQWNjZXNzKCkuZ2V0VW5vcmRlcmVkR3JvdXBfMTAoKSwgMSkgKSB7CisgICAgICAgIGlmICggISBnZXRVbm9yZGVyZWRHcm91cEhlbHBlcigpLmNhblNlbGVjdChncmFtbWFyQWNjZXNzLmdldERhdGFJbnRlcmNoYW5nZUZpbGVYTUxBY2Nlc3MoKS5nZXRVbm9yZGVyZWRHcm91cF8zKCksIDEpICkgewogICAgICAgICAgICAgaWYgKHN0YXRlLmJhY2t0cmFja2luZz4wKSB7c3RhdGUuZmFpbGVkPXRydWU7IHJldHVybiA7fQotICAgICAgICAgICAgdGhyb3cgbmV3IEZhaWxlZFByZWRpY2F0ZUV4Y2VwdGlvbihpbnB1dCwgInN5bnByZWQyNDRfSW50ZXJuYWxEYXRhRFNMIiwgImdldFVub3JkZXJlZEdyb3VwSGVscGVyKCkuY2FuU2VsZWN0KGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YUludGVyY2hhbmdlTG9va3VwQWNjZXNzKCkuZ2V0VW5vcmRlcmVkR3JvdXBfMTAoKSwgMSkiKTsKKyAgICAgICAgICAgIHRocm93IG5ldyBGYWlsZWRQcmVkaWNhdGVFeGNlcHRpb24oaW5wdXQsICJzeW5wcmVkMjQ0X0ludGVybmFsRGF0YURTTCIsICJnZXRVbm9yZGVyZWRHcm91cEhlbHBlcigpLmNhblNlbGVjdChncmFtbWFyQWNjZXNzLmdldERhdGFJbnRlcmNoYW5nZUZpbGVYTUxBY2Nlc3MoKS5nZXRVbm9yZGVyZWRHcm91cF8zKCksIDEpIik7CiAgICAgICAgIH0KLSAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjIxMTM6MTE4OiAoICggKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VMb29rdXBfX0FsbG93Tm9udW5pcXVlUmVzdWx0QXNzaWdubWVudF8xMF8xICkgKSApCi0gICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIyMTE0OjU6ICggKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VMb29rdXBfX0FsbG93Tm9udW5pcXVlUmVzdWx0QXNzaWdubWVudF8xMF8xICkgKQorICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMzA2NzoxMTg6ICggKCAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbGVYTUxfX0dyb3VwXzNfMV9fMCApICkgKQorICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMzA2ODo1OiAoICggcnVsZV9fRGF0YUludGVyY2hhbmdlRmlsZVhNTF9fR3JvdXBfM18xX18wICkgKQogICAgICAgICB7Ci0gICAgICAgIGdldFVub3JkZXJlZEdyb3VwSGVscGVyKCkuc2VsZWN0KGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YUludGVyY2hhbmdlTG9va3VwQWNjZXNzKCkuZ2V0VW5vcmRlcmVkR3JvdXBfMTAoKSwgMSk7Ci0gICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIyMTIwOjU6ICggKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VMb29rdXBfX0FsbG93Tm9udW5pcXVlUmVzdWx0QXNzaWdubWVudF8xMF8xICkgKQotICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMjEyMTo2OiAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUxvb2t1cF9fQWxsb3dOb251bmlxdWVSZXN1bHRBc3NpZ25tZW50XzEwXzEgKQorICAgICAgICBnZXRVbm9yZGVyZWRHcm91cEhlbHBlcigpLnNlbGVjdChncmFtbWFyQWNjZXNzLmdldERhdGFJbnRlcmNoYW5nZUZpbGVYTUxBY2Nlc3MoKS5nZXRVbm9yZGVyZWRHcm91cF8zKCksIDEpOworICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMzA3NDo1OiAoICggcnVsZV9fRGF0YUludGVyY2hhbmdlRmlsZVhNTF9fR3JvdXBfM18xX18wICkgKQorICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMzA3NTo2OiAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbGVYTUxfX0dyb3VwXzNfMV9fMCApCiAgICAgICAgIHsKICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7Ci0gICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldERhdGFJbnRlcmNoYW5nZUxvb2t1cEFjY2VzcygpLmdldEFsbG93Tm9udW5pcXVlUmVzdWx0QXNzaWdubWVudF8xMF8xKCkpOyAKKyAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YUludGVyY2hhbmdlRmlsZVhNTEFjY2VzcygpLmdldEdyb3VwXzNfMSgpKTsgCiAgICAgICAgIH0KLSAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjIxMjI6NjogKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VMb29rdXBfX0FsbG93Tm9udW5pcXVlUmVzdWx0QXNzaWdubWVudF8xMF8xICkKLSAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjIxMjI6NzogcnVsZV9fRGF0YUludGVyY2hhbmdlTG9va3VwX19BbGxvd05vbnVuaXF1ZVJlc3VsdEFzc2lnbm1lbnRfMTBfMQorICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMzA3Njo2OiAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbGVYTUxfX0dyb3VwXzNfMV9fMCApCisgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIzMDc2Ojc6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbGVYTUxfX0dyb3VwXzNfMV9fMAogICAgICAgICB7CiAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzIpOwotICAgICAgICBydWxlX19EYXRhSW50ZXJjaGFuZ2VMb29rdXBfX0FsbG93Tm9udW5pcXVlUmVzdWx0QXNzaWdubWVudF8xMF8xKCk7CisgICAgICAgIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbGVYTUxfX0dyb3VwXzNfMV9fMCgpOwogCiAgICAgICAgIHN0YXRlLl9mc3AtLTsKICAgICAgICAgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKQEAgLTg0OTkxLDExICs4OTY3OSwxMSBAQAogCiAgICAgLy8gJEFOVExSIHN0YXJ0IHN5bnByZWQyNDVfSW50ZXJuYWxEYXRhRFNMCiAgICAgcHVibGljIGZpbmFsIHZvaWQgc3lucHJlZDI0NV9JbnRlcm5hbERhdGFEU0xfZnJhZ21lbnQoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geyAgIAotICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMjE1NjoyOiAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUxvb2t1cF9fVW5vcmRlcmVkR3JvdXBfMTBfXzEgKQotICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMjE1NjoyOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VMb29rdXBfX1Vub3JkZXJlZEdyb3VwXzEwX18xCisgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIzMTEwOjI6ICggcnVsZV9fRGF0YUludGVyY2hhbmdlRmlsZVhNTF9fVW5vcmRlcmVkR3JvdXBfM19fMSApCisgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIzMTEwOjI6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbGVYTUxfX1Vub3JkZXJlZEdyb3VwXzNfXzEKICAgICAgICAgewogICAgICAgICBwdXNoRm9sbG93KEZPTExPV18yKTsKLSAgICAgICAgcnVsZV9fRGF0YUludGVyY2hhbmdlTG9va3VwX19Vbm9yZGVyZWRHcm91cF8xMF9fMSgpOworICAgICAgICBydWxlX19EYXRhSW50ZXJjaGFuZ2VGaWxlWE1MX19Vbm9yZGVyZWRHcm91cF8zX18xKCk7CiAKICAgICAgICAgc3RhdGUuX2ZzcC0tOwogICAgICAgICBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOwpAQCAtODUwMDYsOCArODk2OTQsNTQ5IEBACiAKICAgICAvLyAkQU5UTFIgc3RhcnQgc3lucHJlZDI0Nl9JbnRlcm5hbERhdGFEU0wKICAgICBwdWJsaWMgZmluYWwgdm9pZCBzeW5wcmVkMjQ2X0ludGVybmFsRGF0YURTTF9mcmFnbWVudCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7ICAgCi0gICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIyMTY4OjI6ICggcnVsZV9fRGF0YUludGVyY2hhbmdlTG9va3VwX19Vbm9yZGVyZWRHcm91cF8xMF9fMiApCi0gICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIyMTY4OjI6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUxvb2t1cF9fVW5vcmRlcmVkR3JvdXBfMTBfXzIKKyAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjMxMjI6MjogKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VGaWxlWE1MX19Vbm9yZGVyZWRHcm91cF8zX18yICkKKyAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjMxMjI6MjogcnVsZV9fRGF0YUludGVyY2hhbmdlRmlsZVhNTF9fVW5vcmRlcmVkR3JvdXBfM19fMgorICAgICAgICB7CisgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzIpOworICAgICAgICBydWxlX19EYXRhSW50ZXJjaGFuZ2VGaWxlWE1MX19Vbm9yZGVyZWRHcm91cF8zX18yKCk7CisKKyAgICAgICAgc3RhdGUuX2ZzcC0tOworICAgICAgICBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOworCisgICAgICAgIH0KKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCBzeW5wcmVkMjQ2X0ludGVybmFsRGF0YURTTAorCisgICAgLy8gJEFOVExSIHN0YXJ0IHN5bnByZWQyNDdfSW50ZXJuYWxEYXRhRFNMCisgICAgcHVibGljIGZpbmFsIHZvaWQgc3lucHJlZDI0N19JbnRlcm5hbERhdGFEU0xfZnJhZ21lbnQoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geyAgIAorICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMzE0NjoyOiAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbGVDU1ZfX1Vub3JkZXJlZEdyb3VwXzNfXzAgKQorICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMzE0NjoyOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VGaWxlQ1NWX19Vbm9yZGVyZWRHcm91cF8zX18wCisgICAgICAgIHsKKyAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMik7CisgICAgICAgIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbGVDU1ZfX1Vub3JkZXJlZEdyb3VwXzNfXzAoKTsKKworICAgICAgICBzdGF0ZS5fZnNwLS07CisgICAgICAgIGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CisKKyAgICAgICAgfQorICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kIHN5bnByZWQyNDdfSW50ZXJuYWxEYXRhRFNMCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgc3lucHJlZDI0OF9JbnRlcm5hbERhdGFEU0wKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBzeW5wcmVkMjQ4X0ludGVybmFsRGF0YURTTF9mcmFnbWVudCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7ICAgCisgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIzMTYxOjM6ICggKHsuLi59PyA9PiAoICggKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VGaWxlQ1NWX19Hcm91cF8zXzBfXzAgKSApICkgKSApCisgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIzMTYxOjM6ICh7Li4ufT8gPT4gKCAoICggcnVsZV9fRGF0YUludGVyY2hhbmdlRmlsZUNTVl9fR3JvdXBfM18wX18wICkgKSApICkKKyAgICAgICAgeworICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMzE2MTozOiAoey4uLn0/ID0+ICggKCAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbGVDU1ZfX0dyb3VwXzNfMF9fMCApICkgKSApCisgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIzMTYyOjQ6IHsuLi59PyA9PiAoICggKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VGaWxlQ1NWX19Hcm91cF8zXzBfXzAgKSApICkKKyAgICAgICAgeworICAgICAgICBpZiAoICEgZ2V0VW5vcmRlcmVkR3JvdXBIZWxwZXIoKS5jYW5TZWxlY3QoZ3JhbW1hckFjY2Vzcy5nZXREYXRhSW50ZXJjaGFuZ2VGaWxlQ1NWQWNjZXNzKCkuZ2V0VW5vcmRlcmVkR3JvdXBfMygpLCAwKSApIHsKKyAgICAgICAgICAgIGlmIChzdGF0ZS5iYWNrdHJhY2tpbmc+MCkge3N0YXRlLmZhaWxlZD10cnVlOyByZXR1cm4gO30KKyAgICAgICAgICAgIHRocm93IG5ldyBGYWlsZWRQcmVkaWNhdGVFeGNlcHRpb24oaW5wdXQsICJzeW5wcmVkMjQ4X0ludGVybmFsRGF0YURTTCIsICJnZXRVbm9yZGVyZWRHcm91cEhlbHBlcigpLmNhblNlbGVjdChncmFtbWFyQWNjZXNzLmdldERhdGFJbnRlcmNoYW5nZUZpbGVDU1ZBY2Nlc3MoKS5nZXRVbm9yZGVyZWRHcm91cF8zKCksIDApIik7CisgICAgICAgIH0KKyAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjMxNjI6MTE4OiAoICggKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VGaWxlQ1NWX19Hcm91cF8zXzBfXzAgKSApICkKKyAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjMxNjM6NTogKCAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbGVDU1ZfX0dyb3VwXzNfMF9fMCApICkKKyAgICAgICAgeworICAgICAgICBnZXRVbm9yZGVyZWRHcm91cEhlbHBlcigpLnNlbGVjdChncmFtbWFyQWNjZXNzLmdldERhdGFJbnRlcmNoYW5nZUZpbGVDU1ZBY2Nlc3MoKS5nZXRVbm9yZGVyZWRHcm91cF8zKCksIDApOworICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMzE2OTo1OiAoICggcnVsZV9fRGF0YUludGVyY2hhbmdlRmlsZUNTVl9fR3JvdXBfM18wX18wICkgKQorICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMzE3MDo2OiAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbGVDU1ZfX0dyb3VwXzNfMF9fMCApCisgICAgICAgIHsKKyAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldERhdGFJbnRlcmNoYW5nZUZpbGVDU1ZBY2Nlc3MoKS5nZXRHcm91cF8zXzAoKSk7IAorICAgICAgICB9CisgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIzMTcxOjY6ICggcnVsZV9fRGF0YUludGVyY2hhbmdlRmlsZUNTVl9fR3JvdXBfM18wX18wICkKKyAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjMxNzE6NzogcnVsZV9fRGF0YUludGVyY2hhbmdlRmlsZUNTVl9fR3JvdXBfM18wX18wCisgICAgICAgIHsKKyAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMik7CisgICAgICAgIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbGVDU1ZfX0dyb3VwXzNfMF9fMCgpOworCisgICAgICAgIHN0YXRlLl9mc3AtLTsKKyAgICAgICAgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKKworICAgICAgICB9CisKKworICAgICAgICB9CisKKworICAgICAgICB9CisKKworICAgICAgICB9CisKKworICAgICAgICB9CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgc3lucHJlZDI0OF9JbnRlcm5hbERhdGFEU0wKKworICAgIC8vICRBTlRMUiBzdGFydCBzeW5wcmVkMjQ5X0ludGVybmFsRGF0YURTTAorICAgIHB1YmxpYyBmaW5hbCB2b2lkIHN5bnByZWQyNDlfSW50ZXJuYWxEYXRhRFNMX2ZyYWdtZW50KCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsgICAKKyAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjMxNzY6MzogKCAoey4uLn0/ID0+ICggKCAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbGVDU1ZfX0dyb3VwXzNfMV9fMCApICkgKSApICkKKyAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjMxNzY6MzogKHsuLi59PyA9PiAoICggKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VGaWxlQ1NWX19Hcm91cF8zXzFfXzAgKSApICkgKQorICAgICAgICB7CisgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIzMTc2OjM6ICh7Li4ufT8gPT4gKCAoICggcnVsZV9fRGF0YUludGVyY2hhbmdlRmlsZUNTVl9fR3JvdXBfM18xX18wICkgKSApICkKKyAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjMxNzc6NDogey4uLn0/ID0+ICggKCAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbGVDU1ZfX0dyb3VwXzNfMV9fMCApICkgKQorICAgICAgICB7CisgICAgICAgIGlmICggISBnZXRVbm9yZGVyZWRHcm91cEhlbHBlcigpLmNhblNlbGVjdChncmFtbWFyQWNjZXNzLmdldERhdGFJbnRlcmNoYW5nZUZpbGVDU1ZBY2Nlc3MoKS5nZXRVbm9yZGVyZWRHcm91cF8zKCksIDEpICkgeworICAgICAgICAgICAgaWYgKHN0YXRlLmJhY2t0cmFja2luZz4wKSB7c3RhdGUuZmFpbGVkPXRydWU7IHJldHVybiA7fQorICAgICAgICAgICAgdGhyb3cgbmV3IEZhaWxlZFByZWRpY2F0ZUV4Y2VwdGlvbihpbnB1dCwgInN5bnByZWQyNDlfSW50ZXJuYWxEYXRhRFNMIiwgImdldFVub3JkZXJlZEdyb3VwSGVscGVyKCkuY2FuU2VsZWN0KGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YUludGVyY2hhbmdlRmlsZUNTVkFjY2VzcygpLmdldFVub3JkZXJlZEdyb3VwXzMoKSwgMSkiKTsKKyAgICAgICAgfQorICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMzE3NzoxMTg6ICggKCAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbGVDU1ZfX0dyb3VwXzNfMV9fMCApICkgKQorICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMzE3ODo1OiAoICggcnVsZV9fRGF0YUludGVyY2hhbmdlRmlsZUNTVl9fR3JvdXBfM18xX18wICkgKQorICAgICAgICB7CisgICAgICAgIGdldFVub3JkZXJlZEdyb3VwSGVscGVyKCkuc2VsZWN0KGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YUludGVyY2hhbmdlRmlsZUNTVkFjY2VzcygpLmdldFVub3JkZXJlZEdyb3VwXzMoKSwgMSk7CisgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIzMTg0OjU6ICggKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VGaWxlQ1NWX19Hcm91cF8zXzFfXzAgKSApCisgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIzMTg1OjY6ICggcnVsZV9fRGF0YUludGVyY2hhbmdlRmlsZUNTVl9fR3JvdXBfM18xX18wICkKKyAgICAgICAgeworICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YUludGVyY2hhbmdlRmlsZUNTVkFjY2VzcygpLmdldEdyb3VwXzNfMSgpKTsgCisgICAgICAgIH0KKyAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjMxODY6NjogKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VGaWxlQ1NWX19Hcm91cF8zXzFfXzAgKQorICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMzE4Njo3OiBydWxlX19EYXRhSW50ZXJjaGFuZ2VGaWxlQ1NWX19Hcm91cF8zXzFfXzAKKyAgICAgICAgeworICAgICAgICBwdXNoRm9sbG93KEZPTExPV18yKTsKKyAgICAgICAgcnVsZV9fRGF0YUludGVyY2hhbmdlRmlsZUNTVl9fR3JvdXBfM18xX18wKCk7CisKKyAgICAgICAgc3RhdGUuX2ZzcC0tOworICAgICAgICBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOworCisgICAgICAgIH0KKworCisgICAgICAgIH0KKworCisgICAgICAgIH0KKworCisgICAgICAgIH0KKworCisgICAgICAgIH0KKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCBzeW5wcmVkMjQ5X0ludGVybmFsRGF0YURTTAorCisgICAgLy8gJEFOVExSIHN0YXJ0IHN5bnByZWQyNTBfSW50ZXJuYWxEYXRhRFNMCisgICAgcHVibGljIGZpbmFsIHZvaWQgc3lucHJlZDI1MF9JbnRlcm5hbERhdGFEU0xfZnJhZ21lbnQoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geyAgIAorICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMzE5MTozOiAoICh7Li4ufT8gPT4gKCAoICggcnVsZV9fRGF0YUludGVyY2hhbmdlRmlsZUNTVl9fR3JvdXBfM18yX18wICkgKSApICkgKQorICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMzE5MTozOiAoey4uLn0/ID0+ICggKCAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbGVDU1ZfX0dyb3VwXzNfMl9fMCApICkgKSApCisgICAgICAgIHsKKyAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjMxOTE6MzogKHsuLi59PyA9PiAoICggKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VGaWxlQ1NWX19Hcm91cF8zXzJfXzAgKSApICkgKQorICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMzE5Mjo0OiB7Li4ufT8gPT4gKCAoICggcnVsZV9fRGF0YUludGVyY2hhbmdlRmlsZUNTVl9fR3JvdXBfM18yX18wICkgKSApCisgICAgICAgIHsKKyAgICAgICAgaWYgKCAhIGdldFVub3JkZXJlZEdyb3VwSGVscGVyKCkuY2FuU2VsZWN0KGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YUludGVyY2hhbmdlRmlsZUNTVkFjY2VzcygpLmdldFVub3JkZXJlZEdyb3VwXzMoKSwgMikgKSB7CisgICAgICAgICAgICBpZiAoc3RhdGUuYmFja3RyYWNraW5nPjApIHtzdGF0ZS5mYWlsZWQ9dHJ1ZTsgcmV0dXJuIDt9CisgICAgICAgICAgICB0aHJvdyBuZXcgRmFpbGVkUHJlZGljYXRlRXhjZXB0aW9uKGlucHV0LCAic3lucHJlZDI1MF9JbnRlcm5hbERhdGFEU0wiLCAiZ2V0VW5vcmRlcmVkR3JvdXBIZWxwZXIoKS5jYW5TZWxlY3QoZ3JhbW1hckFjY2Vzcy5nZXREYXRhSW50ZXJjaGFuZ2VGaWxlQ1NWQWNjZXNzKCkuZ2V0VW5vcmRlcmVkR3JvdXBfMygpLCAyKSIpOworICAgICAgICB9CisgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIzMTkyOjExODogKCAoICggcnVsZV9fRGF0YUludGVyY2hhbmdlRmlsZUNTVl9fR3JvdXBfM18yX18wICkgKSApCisgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIzMTkzOjU6ICggKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VGaWxlQ1NWX19Hcm91cF8zXzJfXzAgKSApCisgICAgICAgIHsKKyAgICAgICAgZ2V0VW5vcmRlcmVkR3JvdXBIZWxwZXIoKS5zZWxlY3QoZ3JhbW1hckFjY2Vzcy5nZXREYXRhSW50ZXJjaGFuZ2VGaWxlQ1NWQWNjZXNzKCkuZ2V0VW5vcmRlcmVkR3JvdXBfMygpLCAyKTsKKyAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjMxOTk6NTogKCAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbGVDU1ZfX0dyb3VwXzNfMl9fMCApICkKKyAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjMyMDA6NjogKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VGaWxlQ1NWX19Hcm91cF8zXzJfXzAgKQorICAgICAgICB7CisgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXREYXRhSW50ZXJjaGFuZ2VGaWxlQ1NWQWNjZXNzKCkuZ2V0R3JvdXBfM18yKCkpOyAKKyAgICAgICAgfQorICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMzIwMTo2OiAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbGVDU1ZfX0dyb3VwXzNfMl9fMCApCisgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIzMjAxOjc6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbGVDU1ZfX0dyb3VwXzNfMl9fMAorICAgICAgICB7CisgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzIpOworICAgICAgICBydWxlX19EYXRhSW50ZXJjaGFuZ2VGaWxlQ1NWX19Hcm91cF8zXzJfXzAoKTsKKworICAgICAgICBzdGF0ZS5fZnNwLS07CisgICAgICAgIGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CisKKyAgICAgICAgfQorCisKKyAgICAgICAgfQorCisKKyAgICAgICAgfQorCisKKyAgICAgICAgfQorCisKKyAgICAgICAgfQorICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kIHN5bnByZWQyNTBfSW50ZXJuYWxEYXRhRFNMCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgc3lucHJlZDI1MV9JbnRlcm5hbERhdGFEU0wKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBzeW5wcmVkMjUxX0ludGVybmFsRGF0YURTTF9mcmFnbWVudCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7ICAgCisgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIzMjA2OjM6ICggKHsuLi59PyA9PiAoICggKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VGaWxlQ1NWX19JbmRlbnRBc3NpZ25tZW50XzNfMyApICkgKSApICkKKyAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjMyMDY6MzogKHsuLi59PyA9PiAoICggKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VGaWxlQ1NWX19JbmRlbnRBc3NpZ25tZW50XzNfMyApICkgKSApCisgICAgICAgIHsKKyAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjMyMDY6MzogKHsuLi59PyA9PiAoICggKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VGaWxlQ1NWX19JbmRlbnRBc3NpZ25tZW50XzNfMyApICkgKSApCisgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIzMjA3OjQ6IHsuLi59PyA9PiAoICggKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VGaWxlQ1NWX19JbmRlbnRBc3NpZ25tZW50XzNfMyApICkgKQorICAgICAgICB7CisgICAgICAgIGlmICggISBnZXRVbm9yZGVyZWRHcm91cEhlbHBlcigpLmNhblNlbGVjdChncmFtbWFyQWNjZXNzLmdldERhdGFJbnRlcmNoYW5nZUZpbGVDU1ZBY2Nlc3MoKS5nZXRVbm9yZGVyZWRHcm91cF8zKCksIDMpICkgeworICAgICAgICAgICAgaWYgKHN0YXRlLmJhY2t0cmFja2luZz4wKSB7c3RhdGUuZmFpbGVkPXRydWU7IHJldHVybiA7fQorICAgICAgICAgICAgdGhyb3cgbmV3IEZhaWxlZFByZWRpY2F0ZUV4Y2VwdGlvbihpbnB1dCwgInN5bnByZWQyNTFfSW50ZXJuYWxEYXRhRFNMIiwgImdldFVub3JkZXJlZEdyb3VwSGVscGVyKCkuY2FuU2VsZWN0KGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YUludGVyY2hhbmdlRmlsZUNTVkFjY2VzcygpLmdldFVub3JkZXJlZEdyb3VwXzMoKSwgMykiKTsKKyAgICAgICAgfQorICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMzIwNzoxMTg6ICggKCAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbGVDU1ZfX0luZGVudEFzc2lnbm1lbnRfM18zICkgKSApCisgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIzMjA4OjU6ICggKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VGaWxlQ1NWX19JbmRlbnRBc3NpZ25tZW50XzNfMyApICkKKyAgICAgICAgeworICAgICAgICBnZXRVbm9yZGVyZWRHcm91cEhlbHBlcigpLnNlbGVjdChncmFtbWFyQWNjZXNzLmdldERhdGFJbnRlcmNoYW5nZUZpbGVDU1ZBY2Nlc3MoKS5nZXRVbm9yZGVyZWRHcm91cF8zKCksIDMpOworICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMzIxNDo1OiAoICggcnVsZV9fRGF0YUludGVyY2hhbmdlRmlsZUNTVl9fSW5kZW50QXNzaWdubWVudF8zXzMgKSApCisgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIzMjE1OjY6ICggcnVsZV9fRGF0YUludGVyY2hhbmdlRmlsZUNTVl9fSW5kZW50QXNzaWdubWVudF8zXzMgKQorICAgICAgICB7CisgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXREYXRhSW50ZXJjaGFuZ2VGaWxlQ1NWQWNjZXNzKCkuZ2V0SW5kZW50QXNzaWdubWVudF8zXzMoKSk7IAorICAgICAgICB9CisgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIzMjE2OjY6ICggcnVsZV9fRGF0YUludGVyY2hhbmdlRmlsZUNTVl9fSW5kZW50QXNzaWdubWVudF8zXzMgKQorICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMzIxNjo3OiBydWxlX19EYXRhSW50ZXJjaGFuZ2VGaWxlQ1NWX19JbmRlbnRBc3NpZ25tZW50XzNfMworICAgICAgICB7CisgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzIpOworICAgICAgICBydWxlX19EYXRhSW50ZXJjaGFuZ2VGaWxlQ1NWX19JbmRlbnRBc3NpZ25tZW50XzNfMygpOworCisgICAgICAgIHN0YXRlLl9mc3AtLTsKKyAgICAgICAgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKKworICAgICAgICB9CisKKworICAgICAgICB9CisKKworICAgICAgICB9CisKKworICAgICAgICB9CisKKworICAgICAgICB9CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgc3lucHJlZDI1MV9JbnRlcm5hbERhdGFEU0wKKworICAgIC8vICRBTlRMUiBzdGFydCBzeW5wcmVkMjUyX0ludGVybmFsRGF0YURTTAorICAgIHB1YmxpYyBmaW5hbCB2b2lkIHN5bnByZWQyNTJfSW50ZXJuYWxEYXRhRFNMX2ZyYWdtZW50KCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsgICAKKyAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjMyMjE6MzogKCAoey4uLn0/ID0+ICggKCAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbGVDU1ZfX0dyb3VwXzNfNF9fMCApICkgKSApICkKKyAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjMyMjE6MzogKHsuLi59PyA9PiAoICggKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VGaWxlQ1NWX19Hcm91cF8zXzRfXzAgKSApICkgKQorICAgICAgICB7CisgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIzMjIxOjM6ICh7Li4ufT8gPT4gKCAoICggcnVsZV9fRGF0YUludGVyY2hhbmdlRmlsZUNTVl9fR3JvdXBfM180X18wICkgKSApICkKKyAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjMyMjI6NDogey4uLn0/ID0+ICggKCAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbGVDU1ZfX0dyb3VwXzNfNF9fMCApICkgKQorICAgICAgICB7CisgICAgICAgIGlmICggISBnZXRVbm9yZGVyZWRHcm91cEhlbHBlcigpLmNhblNlbGVjdChncmFtbWFyQWNjZXNzLmdldERhdGFJbnRlcmNoYW5nZUZpbGVDU1ZBY2Nlc3MoKS5nZXRVbm9yZGVyZWRHcm91cF8zKCksIDQpICkgeworICAgICAgICAgICAgaWYgKHN0YXRlLmJhY2t0cmFja2luZz4wKSB7c3RhdGUuZmFpbGVkPXRydWU7IHJldHVybiA7fQorICAgICAgICAgICAgdGhyb3cgbmV3IEZhaWxlZFByZWRpY2F0ZUV4Y2VwdGlvbihpbnB1dCwgInN5bnByZWQyNTJfSW50ZXJuYWxEYXRhRFNMIiwgImdldFVub3JkZXJlZEdyb3VwSGVscGVyKCkuY2FuU2VsZWN0KGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YUludGVyY2hhbmdlRmlsZUNTVkFjY2VzcygpLmdldFVub3JkZXJlZEdyb3VwXzMoKSwgNCkiKTsKKyAgICAgICAgfQorICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMzIyMjoxMTg6ICggKCAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbGVDU1ZfX0dyb3VwXzNfNF9fMCApICkgKQorICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMzIyMzo1OiAoICggcnVsZV9fRGF0YUludGVyY2hhbmdlRmlsZUNTVl9fR3JvdXBfM180X18wICkgKQorICAgICAgICB7CisgICAgICAgIGdldFVub3JkZXJlZEdyb3VwSGVscGVyKCkuc2VsZWN0KGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YUludGVyY2hhbmdlRmlsZUNTVkFjY2VzcygpLmdldFVub3JkZXJlZEdyb3VwXzMoKSwgNCk7CisgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIzMjI5OjU6ICggKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VGaWxlQ1NWX19Hcm91cF8zXzRfXzAgKSApCisgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIzMjMwOjY6ICggcnVsZV9fRGF0YUludGVyY2hhbmdlRmlsZUNTVl9fR3JvdXBfM180X18wICkKKyAgICAgICAgeworICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YUludGVyY2hhbmdlRmlsZUNTVkFjY2VzcygpLmdldEdyb3VwXzNfNCgpKTsgCisgICAgICAgIH0KKyAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjMyMzE6NjogKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VGaWxlQ1NWX19Hcm91cF8zXzRfXzAgKQorICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMzIzMTo3OiBydWxlX19EYXRhSW50ZXJjaGFuZ2VGaWxlQ1NWX19Hcm91cF8zXzRfXzAKKyAgICAgICAgeworICAgICAgICBwdXNoRm9sbG93KEZPTExPV18yKTsKKyAgICAgICAgcnVsZV9fRGF0YUludGVyY2hhbmdlRmlsZUNTVl9fR3JvdXBfM180X18wKCk7CisKKyAgICAgICAgc3RhdGUuX2ZzcC0tOworICAgICAgICBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOworCisgICAgICAgIH0KKworCisgICAgICAgIH0KKworCisgICAgICAgIH0KKworCisgICAgICAgIH0KKworCisgICAgICAgIH0KKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCBzeW5wcmVkMjUyX0ludGVybmFsRGF0YURTTAorCisgICAgLy8gJEFOVExSIHN0YXJ0IHN5bnByZWQyNTNfSW50ZXJuYWxEYXRhRFNMCisgICAgcHVibGljIGZpbmFsIHZvaWQgc3lucHJlZDI1M19JbnRlcm5hbERhdGFEU0xfZnJhZ21lbnQoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geyAgIAorICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMzI2NToyOiAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbGVDU1ZfX1Vub3JkZXJlZEdyb3VwXzNfXzEgKQorICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMzI2NToyOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VGaWxlQ1NWX19Vbm9yZGVyZWRHcm91cF8zX18xCisgICAgICAgIHsKKyAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMik7CisgICAgICAgIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbGVDU1ZfX1Vub3JkZXJlZEdyb3VwXzNfXzEoKTsKKworICAgICAgICBzdGF0ZS5fZnNwLS07CisgICAgICAgIGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CisKKyAgICAgICAgfQorICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kIHN5bnByZWQyNTNfSW50ZXJuYWxEYXRhRFNMCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgc3lucHJlZDI1NF9JbnRlcm5hbERhdGFEU0wKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBzeW5wcmVkMjU0X0ludGVybmFsRGF0YURTTF9mcmFnbWVudCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7ICAgCisgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIzMjc3OjI6ICggcnVsZV9fRGF0YUludGVyY2hhbmdlRmlsZUNTVl9fVW5vcmRlcmVkR3JvdXBfM19fMiApCisgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIzMjc3OjI6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbGVDU1ZfX1Vub3JkZXJlZEdyb3VwXzNfXzIKKyAgICAgICAgeworICAgICAgICBwdXNoRm9sbG93KEZPTExPV18yKTsKKyAgICAgICAgcnVsZV9fRGF0YUludGVyY2hhbmdlRmlsZUNTVl9fVW5vcmRlcmVkR3JvdXBfM19fMigpOworCisgICAgICAgIHN0YXRlLl9mc3AtLTsKKyAgICAgICAgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKKworICAgICAgICB9CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgc3lucHJlZDI1NF9JbnRlcm5hbERhdGFEU0wKKworICAgIC8vICRBTlRMUiBzdGFydCBzeW5wcmVkMjU1X0ludGVybmFsRGF0YURTTAorICAgIHB1YmxpYyBmaW5hbCB2b2lkIHN5bnByZWQyNTVfSW50ZXJuYWxEYXRhRFNMX2ZyYWdtZW50KCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsgICAKKyAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjMyODk6MjogKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VGaWxlQ1NWX19Vbm9yZGVyZWRHcm91cF8zX18zICkKKyAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjMyODk6MjogcnVsZV9fRGF0YUludGVyY2hhbmdlRmlsZUNTVl9fVW5vcmRlcmVkR3JvdXBfM19fMworICAgICAgICB7CisgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzIpOworICAgICAgICBydWxlX19EYXRhSW50ZXJjaGFuZ2VGaWxlQ1NWX19Vbm9yZGVyZWRHcm91cF8zX18zKCk7CisKKyAgICAgICAgc3RhdGUuX2ZzcC0tOworICAgICAgICBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOworCisgICAgICAgIH0KKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCBzeW5wcmVkMjU1X0ludGVybmFsRGF0YURTTAorCisgICAgLy8gJEFOVExSIHN0YXJ0IHN5bnByZWQyNTZfSW50ZXJuYWxEYXRhRFNMCisgICAgcHVibGljIGZpbmFsIHZvaWQgc3lucHJlZDI1Nl9JbnRlcm5hbERhdGFEU0xfZnJhZ21lbnQoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geyAgIAorICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMzMwMToyOiAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbGVDU1ZfX1Vub3JkZXJlZEdyb3VwXzNfXzQgKQorICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMzMwMToyOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VGaWxlQ1NWX19Vbm9yZGVyZWRHcm91cF8zX180CisgICAgICAgIHsKKyAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMik7CisgICAgICAgIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbGVDU1ZfX1Vub3JkZXJlZEdyb3VwXzNfXzQoKTsKKworICAgICAgICBzdGF0ZS5fZnNwLS07CisgICAgICAgIGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CisKKyAgICAgICAgfQorICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kIHN5bnByZWQyNTZfSW50ZXJuYWxEYXRhRFNMCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgc3lucHJlZDI1N19JbnRlcm5hbERhdGFEU0wKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBzeW5wcmVkMjU3X0ludGVybmFsRGF0YURTTF9mcmFnbWVudCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7ICAgCisgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIzMzEzOjI6ICggcnVsZV9fRGF0YUludGVyY2hhbmdlRmlsZUNTVl9fVW5vcmRlcmVkR3JvdXBfM19fNSApCisgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIzMzEzOjI6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbGVDU1ZfX1Vub3JkZXJlZEdyb3VwXzNfXzUKKyAgICAgICAgeworICAgICAgICBwdXNoRm9sbG93KEZPTExPV18yKTsKKyAgICAgICAgcnVsZV9fRGF0YUludGVyY2hhbmdlRmlsZUNTVl9fVW5vcmRlcmVkR3JvdXBfM19fNSgpOworCisgICAgICAgIHN0YXRlLl9mc3AtLTsKKyAgICAgICAgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKKworICAgICAgICB9CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgc3lucHJlZDI1N19JbnRlcm5hbERhdGFEU0wKKworICAgIC8vICRBTlRMUiBzdGFydCBzeW5wcmVkMjU4X0ludGVybmFsRGF0YURTTAorICAgIHB1YmxpYyBmaW5hbCB2b2lkIHN5bnByZWQyNThfSW50ZXJuYWxEYXRhRFNMX2ZyYWdtZW50KCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsgICAKKyAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjMzMzc6MjogKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VGaWxlRURJX19Vbm9yZGVyZWRHcm91cF8zX18wICkKKyAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjMzMzc6MjogcnVsZV9fRGF0YUludGVyY2hhbmdlRmlsZUVESV9fVW5vcmRlcmVkR3JvdXBfM19fMAorICAgICAgICB7CisgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzIpOworICAgICAgICBydWxlX19EYXRhSW50ZXJjaGFuZ2VGaWxlRURJX19Vbm9yZGVyZWRHcm91cF8zX18wKCk7CisKKyAgICAgICAgc3RhdGUuX2ZzcC0tOworICAgICAgICBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOworCisgICAgICAgIH0KKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCBzeW5wcmVkMjU4X0ludGVybmFsRGF0YURTTAorCisgICAgLy8gJEFOVExSIHN0YXJ0IHN5bnByZWQyNTlfSW50ZXJuYWxEYXRhRFNMCisgICAgcHVibGljIGZpbmFsIHZvaWQgc3lucHJlZDI1OV9JbnRlcm5hbERhdGFEU0xfZnJhZ21lbnQoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geyAgIAorICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMzM1MjozOiAoICh7Li4ufT8gPT4gKCAoICggcnVsZV9fRGF0YUludGVyY2hhbmdlRmlsZUVESV9fR3JvdXBfM18wX18wICkgKSApICkgKQorICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMzM1MjozOiAoey4uLn0/ID0+ICggKCAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbGVFRElfX0dyb3VwXzNfMF9fMCApICkgKSApCisgICAgICAgIHsKKyAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjMzNTI6MzogKHsuLi59PyA9PiAoICggKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VGaWxlRURJX19Hcm91cF8zXzBfXzAgKSApICkgKQorICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMzM1Mzo0OiB7Li4ufT8gPT4gKCAoICggcnVsZV9fRGF0YUludGVyY2hhbmdlRmlsZUVESV9fR3JvdXBfM18wX18wICkgKSApCisgICAgICAgIHsKKyAgICAgICAgaWYgKCAhIGdldFVub3JkZXJlZEdyb3VwSGVscGVyKCkuY2FuU2VsZWN0KGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YUludGVyY2hhbmdlRmlsZUVESUFjY2VzcygpLmdldFVub3JkZXJlZEdyb3VwXzMoKSwgMCkgKSB7CisgICAgICAgICAgICBpZiAoc3RhdGUuYmFja3RyYWNraW5nPjApIHtzdGF0ZS5mYWlsZWQ9dHJ1ZTsgcmV0dXJuIDt9CisgICAgICAgICAgICB0aHJvdyBuZXcgRmFpbGVkUHJlZGljYXRlRXhjZXB0aW9uKGlucHV0LCAic3lucHJlZDI1OV9JbnRlcm5hbERhdGFEU0wiLCAiZ2V0VW5vcmRlcmVkR3JvdXBIZWxwZXIoKS5jYW5TZWxlY3QoZ3JhbW1hckFjY2Vzcy5nZXREYXRhSW50ZXJjaGFuZ2VGaWxlRURJQWNjZXNzKCkuZ2V0VW5vcmRlcmVkR3JvdXBfMygpLCAwKSIpOworICAgICAgICB9CisgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIzMzUzOjExODogKCAoICggcnVsZV9fRGF0YUludGVyY2hhbmdlRmlsZUVESV9fR3JvdXBfM18wX18wICkgKSApCisgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIzMzU0OjU6ICggKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VGaWxlRURJX19Hcm91cF8zXzBfXzAgKSApCisgICAgICAgIHsKKyAgICAgICAgZ2V0VW5vcmRlcmVkR3JvdXBIZWxwZXIoKS5zZWxlY3QoZ3JhbW1hckFjY2Vzcy5nZXREYXRhSW50ZXJjaGFuZ2VGaWxlRURJQWNjZXNzKCkuZ2V0VW5vcmRlcmVkR3JvdXBfMygpLCAwKTsKKyAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjMzNjA6NTogKCAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbGVFRElfX0dyb3VwXzNfMF9fMCApICkKKyAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjMzNjE6NjogKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VGaWxlRURJX19Hcm91cF8zXzBfXzAgKQorICAgICAgICB7CisgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXREYXRhSW50ZXJjaGFuZ2VGaWxlRURJQWNjZXNzKCkuZ2V0R3JvdXBfM18wKCkpOyAKKyAgICAgICAgfQorICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMzM2Mjo2OiAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbGVFRElfX0dyb3VwXzNfMF9fMCApCisgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIzMzYyOjc6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbGVFRElfX0dyb3VwXzNfMF9fMAorICAgICAgICB7CisgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzIpOworICAgICAgICBydWxlX19EYXRhSW50ZXJjaGFuZ2VGaWxlRURJX19Hcm91cF8zXzBfXzAoKTsKKworICAgICAgICBzdGF0ZS5fZnNwLS07CisgICAgICAgIGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CisKKyAgICAgICAgfQorCisKKyAgICAgICAgfQorCisKKyAgICAgICAgfQorCisKKyAgICAgICAgfQorCisKKyAgICAgICAgfQorICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kIHN5bnByZWQyNTlfSW50ZXJuYWxEYXRhRFNMCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgc3lucHJlZDI2MF9JbnRlcm5hbERhdGFEU0wKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBzeW5wcmVkMjYwX0ludGVybmFsRGF0YURTTF9mcmFnbWVudCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7ICAgCisgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIzMzk2OjI6ICggcnVsZV9fRGF0YUludGVyY2hhbmdlRmlsZUVESV9fVW5vcmRlcmVkR3JvdXBfM19fMSApCisgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIzMzk2OjI6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUZpbGVFRElfX1Vub3JkZXJlZEdyb3VwXzNfXzEKKyAgICAgICAgeworICAgICAgICBwdXNoRm9sbG93KEZPTExPV18yKTsKKyAgICAgICAgcnVsZV9fRGF0YUludGVyY2hhbmdlRmlsZUVESV9fVW5vcmRlcmVkR3JvdXBfM19fMSgpOworCisgICAgICAgIHN0YXRlLl9mc3AtLTsKKyAgICAgICAgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKKworICAgICAgICB9CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgc3lucHJlZDI2MF9JbnRlcm5hbERhdGFEU0wKKworICAgIC8vICRBTlRMUiBzdGFydCBzeW5wcmVkMjYxX0ludGVybmFsRGF0YURTTAorICAgIHB1YmxpYyBmaW5hbCB2b2lkIHN5bnByZWQyNjFfSW50ZXJuYWxEYXRhRFNMX2ZyYWdtZW50KCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsgICAKKyAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjM0MjA6MjogKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VMb29rdXBfX1Vub3JkZXJlZEdyb3VwXzEwX18wICkKKyAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjM0MjA6MjogcnVsZV9fRGF0YUludGVyY2hhbmdlTG9va3VwX19Vbm9yZGVyZWRHcm91cF8xMF9fMAorICAgICAgICB7CisgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzIpOworICAgICAgICBydWxlX19EYXRhSW50ZXJjaGFuZ2VMb29rdXBfX1Vub3JkZXJlZEdyb3VwXzEwX18wKCk7CisKKyAgICAgICAgc3RhdGUuX2ZzcC0tOworICAgICAgICBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOworCisgICAgICAgIH0KKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCBzeW5wcmVkMjYxX0ludGVybmFsRGF0YURTTAorCisgICAgLy8gJEFOVExSIHN0YXJ0IHN5bnByZWQyNjJfSW50ZXJuYWxEYXRhRFNMCisgICAgcHVibGljIGZpbmFsIHZvaWQgc3lucHJlZDI2Ml9JbnRlcm5hbERhdGFEU0xfZnJhZ21lbnQoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geyAgIAorICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMzQzNTozOiAoICh7Li4ufT8gPT4gKCAoICggcnVsZV9fRGF0YUludGVyY2hhbmdlTG9va3VwX19BbGxvd05vUmVzdWx0QXNzaWdubWVudF8xMF8wICkgKSApICkgKQorICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMzQzNTozOiAoey4uLn0/ID0+ICggKCAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUxvb2t1cF9fQWxsb3dOb1Jlc3VsdEFzc2lnbm1lbnRfMTBfMCApICkgKSApCisgICAgICAgIHsKKyAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjM0MzU6MzogKHsuLi59PyA9PiAoICggKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VMb29rdXBfX0FsbG93Tm9SZXN1bHRBc3NpZ25tZW50XzEwXzAgKSApICkgKQorICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMzQzNjo0OiB7Li4ufT8gPT4gKCAoICggcnVsZV9fRGF0YUludGVyY2hhbmdlTG9va3VwX19BbGxvd05vUmVzdWx0QXNzaWdubWVudF8xMF8wICkgKSApCisgICAgICAgIHsKKyAgICAgICAgaWYgKCAhIGdldFVub3JkZXJlZEdyb3VwSGVscGVyKCkuY2FuU2VsZWN0KGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YUludGVyY2hhbmdlTG9va3VwQWNjZXNzKCkuZ2V0VW5vcmRlcmVkR3JvdXBfMTAoKSwgMCkgKSB7CisgICAgICAgICAgICBpZiAoc3RhdGUuYmFja3RyYWNraW5nPjApIHtzdGF0ZS5mYWlsZWQ9dHJ1ZTsgcmV0dXJuIDt9CisgICAgICAgICAgICB0aHJvdyBuZXcgRmFpbGVkUHJlZGljYXRlRXhjZXB0aW9uKGlucHV0LCAic3lucHJlZDI2Ml9JbnRlcm5hbERhdGFEU0wiLCAiZ2V0VW5vcmRlcmVkR3JvdXBIZWxwZXIoKS5jYW5TZWxlY3QoZ3JhbW1hckFjY2Vzcy5nZXREYXRhSW50ZXJjaGFuZ2VMb29rdXBBY2Nlc3MoKS5nZXRVbm9yZGVyZWRHcm91cF8xMCgpLCAwKSIpOworICAgICAgICB9CisgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIzNDM2OjExODogKCAoICggcnVsZV9fRGF0YUludGVyY2hhbmdlTG9va3VwX19BbGxvd05vUmVzdWx0QXNzaWdubWVudF8xMF8wICkgKSApCisgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIzNDM3OjU6ICggKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VMb29rdXBfX0FsbG93Tm9SZXN1bHRBc3NpZ25tZW50XzEwXzAgKSApCisgICAgICAgIHsKKyAgICAgICAgZ2V0VW5vcmRlcmVkR3JvdXBIZWxwZXIoKS5zZWxlY3QoZ3JhbW1hckFjY2Vzcy5nZXREYXRhSW50ZXJjaGFuZ2VMb29rdXBBY2Nlc3MoKS5nZXRVbm9yZGVyZWRHcm91cF8xMCgpLCAwKTsKKyAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjM0NDM6NTogKCAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUxvb2t1cF9fQWxsb3dOb1Jlc3VsdEFzc2lnbm1lbnRfMTBfMCApICkKKyAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjM0NDQ6NjogKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VMb29rdXBfX0FsbG93Tm9SZXN1bHRBc3NpZ25tZW50XzEwXzAgKQorICAgICAgICB7CisgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXREYXRhSW50ZXJjaGFuZ2VMb29rdXBBY2Nlc3MoKS5nZXRBbGxvd05vUmVzdWx0QXNzaWdubWVudF8xMF8wKCkpOyAKKyAgICAgICAgfQorICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMzQ0NTo2OiAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUxvb2t1cF9fQWxsb3dOb1Jlc3VsdEFzc2lnbm1lbnRfMTBfMCApCisgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIzNDQ1Ojc6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUxvb2t1cF9fQWxsb3dOb1Jlc3VsdEFzc2lnbm1lbnRfMTBfMAorICAgICAgICB7CisgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzIpOworICAgICAgICBydWxlX19EYXRhSW50ZXJjaGFuZ2VMb29rdXBfX0FsbG93Tm9SZXN1bHRBc3NpZ25tZW50XzEwXzAoKTsKKworICAgICAgICBzdGF0ZS5fZnNwLS07CisgICAgICAgIGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CisKKyAgICAgICAgfQorCisKKyAgICAgICAgfQorCisKKyAgICAgICAgfQorCisKKyAgICAgICAgfQorCisKKyAgICAgICAgfQorICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kIHN5bnByZWQyNjJfSW50ZXJuYWxEYXRhRFNMCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgc3lucHJlZDI2M19JbnRlcm5hbERhdGFEU0wKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBzeW5wcmVkMjYzX0ludGVybmFsRGF0YURTTF9mcmFnbWVudCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7ICAgCisgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIzNDUwOjM6ICggKHsuLi59PyA9PiAoICggKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VMb29rdXBfX0FsbG93Tm9udW5pcXVlUmVzdWx0QXNzaWdubWVudF8xMF8xICkgKSApICkgKQorICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMzQ1MDozOiAoey4uLn0/ID0+ICggKCAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUxvb2t1cF9fQWxsb3dOb251bmlxdWVSZXN1bHRBc3NpZ25tZW50XzEwXzEgKSApICkgKQorICAgICAgICB7CisgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIzNDUwOjM6ICh7Li4ufT8gPT4gKCAoICggcnVsZV9fRGF0YUludGVyY2hhbmdlTG9va3VwX19BbGxvd05vbnVuaXF1ZVJlc3VsdEFzc2lnbm1lbnRfMTBfMSApICkgKSApCisgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIzNDUxOjQ6IHsuLi59PyA9PiAoICggKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VMb29rdXBfX0FsbG93Tm9udW5pcXVlUmVzdWx0QXNzaWdubWVudF8xMF8xICkgKSApCisgICAgICAgIHsKKyAgICAgICAgaWYgKCAhIGdldFVub3JkZXJlZEdyb3VwSGVscGVyKCkuY2FuU2VsZWN0KGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YUludGVyY2hhbmdlTG9va3VwQWNjZXNzKCkuZ2V0VW5vcmRlcmVkR3JvdXBfMTAoKSwgMSkgKSB7CisgICAgICAgICAgICBpZiAoc3RhdGUuYmFja3RyYWNraW5nPjApIHtzdGF0ZS5mYWlsZWQ9dHJ1ZTsgcmV0dXJuIDt9CisgICAgICAgICAgICB0aHJvdyBuZXcgRmFpbGVkUHJlZGljYXRlRXhjZXB0aW9uKGlucHV0LCAic3lucHJlZDI2M19JbnRlcm5hbERhdGFEU0wiLCAiZ2V0VW5vcmRlcmVkR3JvdXBIZWxwZXIoKS5jYW5TZWxlY3QoZ3JhbW1hckFjY2Vzcy5nZXREYXRhSW50ZXJjaGFuZ2VMb29rdXBBY2Nlc3MoKS5nZXRVbm9yZGVyZWRHcm91cF8xMCgpLCAxKSIpOworICAgICAgICB9CisgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIzNDUxOjExODogKCAoICggcnVsZV9fRGF0YUludGVyY2hhbmdlTG9va3VwX19BbGxvd05vbnVuaXF1ZVJlc3VsdEFzc2lnbm1lbnRfMTBfMSApICkgKQorICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMzQ1Mjo1OiAoICggcnVsZV9fRGF0YUludGVyY2hhbmdlTG9va3VwX19BbGxvd05vbnVuaXF1ZVJlc3VsdEFzc2lnbm1lbnRfMTBfMSApICkKKyAgICAgICAgeworICAgICAgICBnZXRVbm9yZGVyZWRHcm91cEhlbHBlcigpLnNlbGVjdChncmFtbWFyQWNjZXNzLmdldERhdGFJbnRlcmNoYW5nZUxvb2t1cEFjY2VzcygpLmdldFVub3JkZXJlZEdyb3VwXzEwKCksIDEpOworICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMzQ1ODo1OiAoICggcnVsZV9fRGF0YUludGVyY2hhbmdlTG9va3VwX19BbGxvd05vbnVuaXF1ZVJlc3VsdEFzc2lnbm1lbnRfMTBfMSApICkKKyAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjM0NTk6NjogKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VMb29rdXBfX0FsbG93Tm9udW5pcXVlUmVzdWx0QXNzaWdubWVudF8xMF8xICkKKyAgICAgICAgeworICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YUludGVyY2hhbmdlTG9va3VwQWNjZXNzKCkuZ2V0QWxsb3dOb251bmlxdWVSZXN1bHRBc3NpZ25tZW50XzEwXzEoKSk7IAorICAgICAgICB9CisgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIzNDYwOjY6ICggcnVsZV9fRGF0YUludGVyY2hhbmdlTG9va3VwX19BbGxvd05vbnVuaXF1ZVJlc3VsdEFzc2lnbm1lbnRfMTBfMSApCisgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIzNDYwOjc6IHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUxvb2t1cF9fQWxsb3dOb251bmlxdWVSZXN1bHRBc3NpZ25tZW50XzEwXzEKKyAgICAgICAgeworICAgICAgICBwdXNoRm9sbG93KEZPTExPV18yKTsKKyAgICAgICAgcnVsZV9fRGF0YUludGVyY2hhbmdlTG9va3VwX19BbGxvd05vbnVuaXF1ZVJlc3VsdEFzc2lnbm1lbnRfMTBfMSgpOworCisgICAgICAgIHN0YXRlLl9mc3AtLTsKKyAgICAgICAgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKKworICAgICAgICB9CisKKworICAgICAgICB9CisKKworICAgICAgICB9CisKKworICAgICAgICB9CisKKworICAgICAgICB9CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgc3lucHJlZDI2M19JbnRlcm5hbERhdGFEU0wKKworICAgIC8vICRBTlRMUiBzdGFydCBzeW5wcmVkMjY0X0ludGVybmFsRGF0YURTTAorICAgIHB1YmxpYyBmaW5hbCB2b2lkIHN5bnByZWQyNjRfSW50ZXJuYWxEYXRhRFNMX2ZyYWdtZW50KCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsgICAKKyAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjM0OTQ6MjogKCBydWxlX19EYXRhSW50ZXJjaGFuZ2VMb29rdXBfX1Vub3JkZXJlZEdyb3VwXzEwX18xICkKKyAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjM0OTQ6MjogcnVsZV9fRGF0YUludGVyY2hhbmdlTG9va3VwX19Vbm9yZGVyZWRHcm91cF8xMF9fMQorICAgICAgICB7CisgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzIpOworICAgICAgICBydWxlX19EYXRhSW50ZXJjaGFuZ2VMb29rdXBfX1Vub3JkZXJlZEdyb3VwXzEwX18xKCk7CisKKyAgICAgICAgc3RhdGUuX2ZzcC0tOworICAgICAgICBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOworCisgICAgICAgIH0KKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCBzeW5wcmVkMjY0X0ludGVybmFsRGF0YURTTAorCisgICAgLy8gJEFOVExSIHN0YXJ0IHN5bnByZWQyNjVfSW50ZXJuYWxEYXRhRFNMCisgICAgcHVibGljIGZpbmFsIHZvaWQgc3lucHJlZDI2NV9JbnRlcm5hbERhdGFEU0xfZnJhZ21lbnQoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geyAgIAorICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMzUwNjoyOiAoIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUxvb2t1cF9fVW5vcmRlcmVkR3JvdXBfMTBfXzIgKQorICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMzUwNjoyOiBydWxlX19EYXRhSW50ZXJjaGFuZ2VMb29rdXBfX1Vub3JkZXJlZEdyb3VwXzEwX18yCiAgICAgICAgIHsKICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMik7CiAgICAgICAgIHJ1bGVfX0RhdGFJbnRlcmNoYW5nZUxvb2t1cF9fVW5vcmRlcmVkR3JvdXBfMTBfXzIoKTsKQEAgLTg1MDE3LDEwICs5MDI0Niw5NCBAQAogCiAgICAgICAgIH0KICAgICB9Ci0gICAgLy8gJEFOVExSIGVuZCBzeW5wcmVkMjQ2X0ludGVybmFsRGF0YURTTAorICAgIC8vICRBTlRMUiBlbmQgc3lucHJlZDI2NV9JbnRlcm5hbERhdGFEU0wKIAogICAgIC8vIERlbGVnYXRlZCBydWxlcwogCisgICAgcHVibGljIGZpbmFsIGJvb2xlYW4gc3lucHJlZDE2OF9JbnRlcm5hbERhdGFEU0woKSB7CisgICAgICAgIHN0YXRlLmJhY2t0cmFja2luZysrOworICAgICAgICBpbnQgc3RhcnQgPSBpbnB1dC5tYXJrKCk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBzeW5wcmVkMTY4X0ludGVybmFsRGF0YURTTF9mcmFnbWVudCgpOyAvLyBjYW4gbmV2ZXIgdGhyb3cgZXhjZXB0aW9uCisgICAgICAgIH0gY2F0Y2ggKFJlY29nbml0aW9uRXhjZXB0aW9uIHJlKSB7CisgICAgICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oImltcG9zc2libGU6ICIrcmUpOworICAgICAgICB9CisgICAgICAgIGJvb2xlYW4gc3VjY2VzcyA9ICFzdGF0ZS5mYWlsZWQ7CisgICAgICAgIGlucHV0LnJld2luZChzdGFydCk7CisgICAgICAgIHN0YXRlLmJhY2t0cmFja2luZy0tOworICAgICAgICBzdGF0ZS5mYWlsZWQ9ZmFsc2U7CisgICAgICAgIHJldHVybiBzdWNjZXNzOworICAgIH0KKyAgICBwdWJsaWMgZmluYWwgYm9vbGVhbiBzeW5wcmVkNjJfSW50ZXJuYWxEYXRhRFNMKCkgeworICAgICAgICBzdGF0ZS5iYWNrdHJhY2tpbmcrKzsKKyAgICAgICAgaW50IHN0YXJ0ID0gaW5wdXQubWFyaygpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgc3lucHJlZDYyX0ludGVybmFsRGF0YURTTF9mcmFnbWVudCgpOyAvLyBjYW4gbmV2ZXIgdGhyb3cgZXhjZXB0aW9uCisgICAgICAgIH0gY2F0Y2ggKFJlY29nbml0aW9uRXhjZXB0aW9uIHJlKSB7CisgICAgICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oImltcG9zc2libGU6ICIrcmUpOworICAgICAgICB9CisgICAgICAgIGJvb2xlYW4gc3VjY2VzcyA9ICFzdGF0ZS5mYWlsZWQ7CisgICAgICAgIGlucHV0LnJld2luZChzdGFydCk7CisgICAgICAgIHN0YXRlLmJhY2t0cmFja2luZy0tOworICAgICAgICBzdGF0ZS5mYWlsZWQ9ZmFsc2U7CisgICAgICAgIHJldHVybiBzdWNjZXNzOworICAgIH0KKyAgICBwdWJsaWMgZmluYWwgYm9vbGVhbiBzeW5wcmVkMjQ4X0ludGVybmFsRGF0YURTTCgpIHsKKyAgICAgICAgc3RhdGUuYmFja3RyYWNraW5nKys7CisgICAgICAgIGludCBzdGFydCA9IGlucHV0Lm1hcmsoKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHN5bnByZWQyNDhfSW50ZXJuYWxEYXRhRFNMX2ZyYWdtZW50KCk7IC8vIGNhbiBuZXZlciB0aHJvdyBleGNlcHRpb24KKyAgICAgICAgfSBjYXRjaCAoUmVjb2duaXRpb25FeGNlcHRpb24gcmUpIHsKKyAgICAgICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbigiaW1wb3NzaWJsZTogIityZSk7CisgICAgICAgIH0KKyAgICAgICAgYm9vbGVhbiBzdWNjZXNzID0gIXN0YXRlLmZhaWxlZDsKKyAgICAgICAgaW5wdXQucmV3aW5kKHN0YXJ0KTsKKyAgICAgICAgc3RhdGUuYmFja3RyYWNraW5nLS07CisgICAgICAgIHN0YXRlLmZhaWxlZD1mYWxzZTsKKyAgICAgICAgcmV0dXJuIHN1Y2Nlc3M7CisgICAgfQorICAgIHB1YmxpYyBmaW5hbCBib29sZWFuIHN5bnByZWQyNTJfSW50ZXJuYWxEYXRhRFNMKCkgeworICAgICAgICBzdGF0ZS5iYWNrdHJhY2tpbmcrKzsKKyAgICAgICAgaW50IHN0YXJ0ID0gaW5wdXQubWFyaygpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgc3lucHJlZDI1Ml9JbnRlcm5hbERhdGFEU0xfZnJhZ21lbnQoKTsgLy8gY2FuIG5ldmVyIHRocm93IGV4Y2VwdGlvbgorICAgICAgICB9IGNhdGNoIChSZWNvZ25pdGlvbkV4Y2VwdGlvbiByZSkgeworICAgICAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKCJpbXBvc3NpYmxlOiAiK3JlKTsKKyAgICAgICAgfQorICAgICAgICBib29sZWFuIHN1Y2Nlc3MgPSAhc3RhdGUuZmFpbGVkOworICAgICAgICBpbnB1dC5yZXdpbmQoc3RhcnQpOworICAgICAgICBzdGF0ZS5iYWNrdHJhY2tpbmctLTsKKyAgICAgICAgc3RhdGUuZmFpbGVkPWZhbHNlOworICAgICAgICByZXR1cm4gc3VjY2VzczsKKyAgICB9CisgICAgcHVibGljIGZpbmFsIGJvb2xlYW4gc3lucHJlZDE3NV9JbnRlcm5hbERhdGFEU0woKSB7CisgICAgICAgIHN0YXRlLmJhY2t0cmFja2luZysrOworICAgICAgICBpbnQgc3RhcnQgPSBpbnB1dC5tYXJrKCk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBzeW5wcmVkMTc1X0ludGVybmFsRGF0YURTTF9mcmFnbWVudCgpOyAvLyBjYW4gbmV2ZXIgdGhyb3cgZXhjZXB0aW9uCisgICAgICAgIH0gY2F0Y2ggKFJlY29nbml0aW9uRXhjZXB0aW9uIHJlKSB7CisgICAgICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oImltcG9zc2libGU6ICIrcmUpOworICAgICAgICB9CisgICAgICAgIGJvb2xlYW4gc3VjY2VzcyA9ICFzdGF0ZS5mYWlsZWQ7CisgICAgICAgIGlucHV0LnJld2luZChzdGFydCk7CisgICAgICAgIHN0YXRlLmJhY2t0cmFja2luZy0tOworICAgICAgICBzdGF0ZS5mYWlsZWQ9ZmFsc2U7CisgICAgICAgIHJldHVybiBzdWNjZXNzOworICAgIH0KKyAgICBwdWJsaWMgZmluYWwgYm9vbGVhbiBzeW5wcmVkMjE0X0ludGVybmFsRGF0YURTTCgpIHsKKyAgICAgICAgc3RhdGUuYmFja3RyYWNraW5nKys7CisgICAgICAgIGludCBzdGFydCA9IGlucHV0Lm1hcmsoKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHN5bnByZWQyMTRfSW50ZXJuYWxEYXRhRFNMX2ZyYWdtZW50KCk7IC8vIGNhbiBuZXZlciB0aHJvdyBleGNlcHRpb24KKyAgICAgICAgfSBjYXRjaCAoUmVjb2duaXRpb25FeGNlcHRpb24gcmUpIHsKKyAgICAgICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbigiaW1wb3NzaWJsZTogIityZSk7CisgICAgICAgIH0KKyAgICAgICAgYm9vbGVhbiBzdWNjZXNzID0gIXN0YXRlLmZhaWxlZDsKKyAgICAgICAgaW5wdXQucmV3aW5kKHN0YXJ0KTsKKyAgICAgICAgc3RhdGUuYmFja3RyYWNraW5nLS07CisgICAgICAgIHN0YXRlLmZhaWxlZD1mYWxzZTsKKyAgICAgICAgcmV0dXJuIHN1Y2Nlc3M7CisgICAgfQogICAgIHB1YmxpYyBmaW5hbCBib29sZWFuIHN5bnByZWQyNDVfSW50ZXJuYWxEYXRhRFNMKCkgewogICAgICAgICBzdGF0ZS5iYWNrdHJhY2tpbmcrKzsKICAgICAgICAgaW50IHN0YXJ0ID0gaW5wdXQubWFyaygpOwpAQCAtODUwMzUsMTEgKzkwMzQ4LDExIEBACiAgICAgICAgIHN0YXRlLmZhaWxlZD1mYWxzZTsKICAgICAgICAgcmV0dXJuIHN1Y2Nlc3M7CiAgICAgfQotICAgIHB1YmxpYyBmaW5hbCBib29sZWFuIHN5bnByZWQxNThfSW50ZXJuYWxEYXRhRFNMKCkgeworICAgIHB1YmxpYyBmaW5hbCBib29sZWFuIHN5bnByZWQyNjJfSW50ZXJuYWxEYXRhRFNMKCkgewogICAgICAgICBzdGF0ZS5iYWNrdHJhY2tpbmcrKzsKICAgICAgICAgaW50IHN0YXJ0ID0gaW5wdXQubWFyaygpOwogICAgICAgICB0cnkgewotICAgICAgICAgICAgc3lucHJlZDE1OF9JbnRlcm5hbERhdGFEU0xfZnJhZ21lbnQoKTsgLy8gY2FuIG5ldmVyIHRocm93IGV4Y2VwdGlvbgorICAgICAgICAgICAgc3lucHJlZDI2Ml9JbnRlcm5hbERhdGFEU0xfZnJhZ21lbnQoKTsgLy8gY2FuIG5ldmVyIHRocm93IGV4Y2VwdGlvbgogICAgICAgICB9IGNhdGNoIChSZWNvZ25pdGlvbkV4Y2VwdGlvbiByZSkgewogICAgICAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKCJpbXBvc3NpYmxlOiAiK3JlKTsKICAgICAgICAgfQpAQCAtODUwNDksMTEgKzkwMzYyLDExIEBACiAgICAgICAgIHN0YXRlLmZhaWxlZD1mYWxzZTsKICAgICAgICAgcmV0dXJuIHN1Y2Nlc3M7CiAgICAgfQotICAgIHB1YmxpYyBmaW5hbCBib29sZWFuIHN5bnByZWQyMTFfSW50ZXJuYWxEYXRhRFNMKCkgeworICAgIHB1YmxpYyBmaW5hbCBib29sZWFuIHN5bnByZWQxNzJfSW50ZXJuYWxEYXRhRFNMKCkgewogICAgICAgICBzdGF0ZS5iYWNrdHJhY2tpbmcrKzsKICAgICAgICAgaW50IHN0YXJ0ID0gaW5wdXQubWFyaygpOwogICAgICAgICB0cnkgewotICAgICAgICAgICAgc3lucHJlZDIxMV9JbnRlcm5hbERhdGFEU0xfZnJhZ21lbnQoKTsgLy8gY2FuIG5ldmVyIHRocm93IGV4Y2VwdGlvbgorICAgICAgICAgICAgc3lucHJlZDE3Ml9JbnRlcm5hbERhdGFEU0xfZnJhZ21lbnQoKTsgLy8gY2FuIG5ldmVyIHRocm93IGV4Y2VwdGlvbgogICAgICAgICB9IGNhdGNoIChSZWNvZ25pdGlvbkV4Y2VwdGlvbiByZSkgewogICAgICAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKCJpbXBvc3NpYmxlOiAiK3JlKTsKICAgICAgICAgfQpAQCAtODUwNjMsMTEgKzkwMzc2LDExIEBACiAgICAgICAgIHN0YXRlLmZhaWxlZD1mYWxzZTsKICAgICAgICAgcmV0dXJuIHN1Y2Nlc3M7CiAgICAgfQotICAgIHB1YmxpYyBmaW5hbCBib29sZWFuIHN5bnByZWQyMTdfSW50ZXJuYWxEYXRhRFNMKCkgeworICAgIHB1YmxpYyBmaW5hbCBib29sZWFuIHN5bnByZWQxODJfSW50ZXJuYWxEYXRhRFNMKCkgewogICAgICAgICBzdGF0ZS5iYWNrdHJhY2tpbmcrKzsKICAgICAgICAgaW50IHN0YXJ0ID0gaW5wdXQubWFyaygpOwogICAgICAgICB0cnkgewotICAgICAgICAgICAgc3lucHJlZDIxN19JbnRlcm5hbERhdGFEU0xfZnJhZ21lbnQoKTsgLy8gY2FuIG5ldmVyIHRocm93IGV4Y2VwdGlvbgorICAgICAgICAgICAgc3lucHJlZDE4Ml9JbnRlcm5hbERhdGFEU0xfZnJhZ21lbnQoKTsgLy8gY2FuIG5ldmVyIHRocm93IGV4Y2VwdGlvbgogICAgICAgICB9IGNhdGNoIChSZWNvZ25pdGlvbkV4Y2VwdGlvbiByZSkgewogICAgICAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKCJpbXBvc3NpYmxlOiAiK3JlKTsKICAgICAgICAgfQpAQCAtODUwNzcsMTEgKzkwMzkwLDExIEBACiAgICAgICAgIHN0YXRlLmZhaWxlZD1mYWxzZTsKICAgICAgICAgcmV0dXJuIHN1Y2Nlc3M7CiAgICAgfQotICAgIHB1YmxpYyBmaW5hbCBib29sZWFuIHN5bnByZWQyMzFfSW50ZXJuYWxEYXRhRFNMKCkgeworICAgIHB1YmxpYyBmaW5hbCBib29sZWFuIHN5bnByZWQyNjVfSW50ZXJuYWxEYXRhRFNMKCkgewogICAgICAgICBzdGF0ZS5iYWNrdHJhY2tpbmcrKzsKICAgICAgICAgaW50IHN0YXJ0ID0gaW5wdXQubWFyaygpOwogICAgICAgICB0cnkgewotICAgICAgICAgICAgc3lucHJlZDIzMV9JbnRlcm5hbERhdGFEU0xfZnJhZ21lbnQoKTsgLy8gY2FuIG5ldmVyIHRocm93IGV4Y2VwdGlvbgorICAgICAgICAgICAgc3lucHJlZDI2NV9JbnRlcm5hbERhdGFEU0xfZnJhZ21lbnQoKTsgLy8gY2FuIG5ldmVyIHRocm93IGV4Y2VwdGlvbgogICAgICAgICB9IGNhdGNoIChSZWNvZ25pdGlvbkV4Y2VwdGlvbiByZSkgewogICAgICAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKCJpbXBvc3NpYmxlOiAiK3JlKTsKICAgICAgICAgfQpAQCAtODUwOTEsMzkgKzkwNDA0LDExIEBACiAgICAgICAgIHN0YXRlLmZhaWxlZD1mYWxzZTsKICAgICAgICAgcmV0dXJuIHN1Y2Nlc3M7CiAgICAgfQotICAgIHB1YmxpYyBmaW5hbCBib29sZWFuIHN5bnByZWQyMzhfSW50ZXJuYWxEYXRhRFNMKCkgeworICAgIHB1YmxpYyBmaW5hbCBib29sZWFuIHN5bnByZWQ3NV9JbnRlcm5hbERhdGFEU0woKSB7CiAgICAgICAgIHN0YXRlLmJhY2t0cmFja2luZysrOwogICAgICAgICBpbnQgc3RhcnQgPSBpbnB1dC5tYXJrKCk7CiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBzeW5wcmVkMjM4X0ludGVybmFsRGF0YURTTF9mcmFnbWVudCgpOyAvLyBjYW4gbmV2ZXIgdGhyb3cgZXhjZXB0aW9uCi0gICAgICAgIH0gY2F0Y2ggKFJlY29nbml0aW9uRXhjZXB0aW9uIHJlKSB7Ci0gICAgICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oImltcG9zc2libGU6ICIrcmUpOwotICAgICAgICB9Ci0gICAgICAgIGJvb2xlYW4gc3VjY2VzcyA9ICFzdGF0ZS5mYWlsZWQ7Ci0gICAgICAgIGlucHV0LnJld2luZChzdGFydCk7Ci0gICAgICAgIHN0YXRlLmJhY2t0cmFja2luZy0tOwotICAgICAgICBzdGF0ZS5mYWlsZWQ9ZmFsc2U7Ci0gICAgICAgIHJldHVybiBzdWNjZXNzOwotICAgIH0KLSAgICBwdWJsaWMgZmluYWwgYm9vbGVhbiBzeW5wcmVkMTUxX0ludGVybmFsRGF0YURTTCgpIHsKLSAgICAgICAgc3RhdGUuYmFja3RyYWNraW5nKys7Ci0gICAgICAgIGludCBzdGFydCA9IGlucHV0Lm1hcmsoKTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHN5bnByZWQxNTFfSW50ZXJuYWxEYXRhRFNMX2ZyYWdtZW50KCk7IC8vIGNhbiBuZXZlciB0aHJvdyBleGNlcHRpb24KLSAgICAgICAgfSBjYXRjaCAoUmVjb2duaXRpb25FeGNlcHRpb24gcmUpIHsKLSAgICAgICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbigiaW1wb3NzaWJsZTogIityZSk7Ci0gICAgICAgIH0KLSAgICAgICAgYm9vbGVhbiBzdWNjZXNzID0gIXN0YXRlLmZhaWxlZDsKLSAgICAgICAgaW5wdXQucmV3aW5kKHN0YXJ0KTsKLSAgICAgICAgc3RhdGUuYmFja3RyYWNraW5nLS07Ci0gICAgICAgIHN0YXRlLmZhaWxlZD1mYWxzZTsKLSAgICAgICAgcmV0dXJuIHN1Y2Nlc3M7Ci0gICAgfQotICAgIHB1YmxpYyBmaW5hbCBib29sZWFuIHN5bnByZWQyMDdfSW50ZXJuYWxEYXRhRFNMKCkgewotICAgICAgICBzdGF0ZS5iYWNrdHJhY2tpbmcrKzsKLSAgICAgICAgaW50IHN0YXJ0ID0gaW5wdXQubWFyaygpOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgc3lucHJlZDIwN19JbnRlcm5hbERhdGFEU0xfZnJhZ21lbnQoKTsgLy8gY2FuIG5ldmVyIHRocm93IGV4Y2VwdGlvbgorICAgICAgICAgICAgc3lucHJlZDc1X0ludGVybmFsRGF0YURTTF9mcmFnbWVudCgpOyAvLyBjYW4gbmV2ZXIgdGhyb3cgZXhjZXB0aW9uCiAgICAgICAgIH0gY2F0Y2ggKFJlY29nbml0aW9uRXhjZXB0aW9uIHJlKSB7CiAgICAgICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oImltcG9zc2libGU6ICIrcmUpOwogICAgICAgICB9CkBAIC04NTE0NywxMSArOTA0MzIsMTEgQEAKICAgICAgICAgc3RhdGUuZmFpbGVkPWZhbHNlOwogICAgICAgICByZXR1cm4gc3VjY2VzczsKICAgICB9Ci0gICAgcHVibGljIGZpbmFsIGJvb2xlYW4gc3lucHJlZDE1NF9JbnRlcm5hbERhdGFEU0woKSB7CisgICAgcHVibGljIGZpbmFsIGJvb2xlYW4gc3lucHJlZDE0X0ludGVybmFsRGF0YURTTCgpIHsKICAgICAgICAgc3RhdGUuYmFja3RyYWNraW5nKys7CiAgICAgICAgIGludCBzdGFydCA9IGlucHV0Lm1hcmsoKTsKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHN5bnByZWQxNTRfSW50ZXJuYWxEYXRhRFNMX2ZyYWdtZW50KCk7IC8vIGNhbiBuZXZlciB0aHJvdyBleGNlcHRpb24KKyAgICAgICAgICAgIHN5bnByZWQxNF9JbnRlcm5hbERhdGFEU0xfZnJhZ21lbnQoKTsgLy8gY2FuIG5ldmVyIHRocm93IGV4Y2VwdGlvbgogICAgICAgICB9IGNhdGNoIChSZWNvZ25pdGlvbkV4Y2VwdGlvbiByZSkgewogICAgICAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKCJpbXBvc3NpYmxlOiAiK3JlKTsKICAgICAgICAgfQpAQCAtODUxNjEsMTEgKzkwNDQ2LDExIEBACiAgICAgICAgIHN0YXRlLmZhaWxlZD1mYWxzZTsKICAgICAgICAgcmV0dXJuIHN1Y2Nlc3M7CiAgICAgfQotICAgIHB1YmxpYyBmaW5hbCBib29sZWFuIHN5bnByZWQxMV9JbnRlcm5hbERhdGFEU0woKSB7CisgICAgcHVibGljIGZpbmFsIGJvb2xlYW4gc3lucHJlZDE3OV9JbnRlcm5hbERhdGFEU0woKSB7CiAgICAgICAgIHN0YXRlLmJhY2t0cmFja2luZysrOwogICAgICAgICBpbnQgc3RhcnQgPSBpbnB1dC5tYXJrKCk7CiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBzeW5wcmVkMTFfSW50ZXJuYWxEYXRhRFNMX2ZyYWdtZW50KCk7IC8vIGNhbiBuZXZlciB0aHJvdyBleGNlcHRpb24KKyAgICAgICAgICAgIHN5bnByZWQxNzlfSW50ZXJuYWxEYXRhRFNMX2ZyYWdtZW50KCk7IC8vIGNhbiBuZXZlciB0aHJvdyBleGNlcHRpb24KICAgICAgICAgfSBjYXRjaCAoUmVjb2duaXRpb25FeGNlcHRpb24gcmUpIHsKICAgICAgICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbigiaW1wb3NzaWJsZTogIityZSk7CiAgICAgICAgIH0KQEAgLTg1MTc1LDExICs5MDQ2MCwxMSBAQAogICAgICAgICBzdGF0ZS5mYWlsZWQ9ZmFsc2U7CiAgICAgICAgIHJldHVybiBzdWNjZXNzOwogICAgIH0KLSAgICBwdWJsaWMgZmluYWwgYm9vbGVhbiBzeW5wcmVkMjAxX0ludGVybmFsRGF0YURTTCgpIHsKKyAgICBwdWJsaWMgZmluYWwgYm9vbGVhbiBzeW5wcmVkMTc2X0ludGVybmFsRGF0YURTTCgpIHsKICAgICAgICAgc3RhdGUuYmFja3RyYWNraW5nKys7CiAgICAgICAgIGludCBzdGFydCA9IGlucHV0Lm1hcmsoKTsKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHN5bnByZWQyMDFfSW50ZXJuYWxEYXRhRFNMX2ZyYWdtZW50KCk7IC8vIGNhbiBuZXZlciB0aHJvdyBleGNlcHRpb24KKyAgICAgICAgICAgIHN5bnByZWQxNzZfSW50ZXJuYWxEYXRhRFNMX2ZyYWdtZW50KCk7IC8vIGNhbiBuZXZlciB0aHJvdyBleGNlcHRpb24KICAgICAgICAgfSBjYXRjaCAoUmVjb2duaXRpb25FeGNlcHRpb24gcmUpIHsKICAgICAgICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbigiaW1wb3NzaWJsZTogIityZSk7CiAgICAgICAgIH0KQEAgLTg1MTg5LDUzICs5MDQ3NCwxMSBAQAogICAgICAgICBzdGF0ZS5mYWlsZWQ9ZmFsc2U7CiAgICAgICAgIHJldHVybiBzdWNjZXNzOwogICAgIH0KLSAgICBwdWJsaWMgZmluYWwgYm9vbGVhbiBzeW5wcmVkMjM1X0ludGVybmFsRGF0YURTTCgpIHsKKyAgICBwdWJsaWMgZmluYWwgYm9vbGVhbiBzeW5wcmVkMjEzX0ludGVybmFsRGF0YURTTCgpIHsKICAgICAgICAgc3RhdGUuYmFja3RyYWNraW5nKys7CiAgICAgICAgIGludCBzdGFydCA9IGlucHV0Lm1hcmsoKTsKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHN5bnByZWQyMzVfSW50ZXJuYWxEYXRhRFNMX2ZyYWdtZW50KCk7IC8vIGNhbiBuZXZlciB0aHJvdyBleGNlcHRpb24KLSAgICAgICAgfSBjYXRjaCAoUmVjb2duaXRpb25FeGNlcHRpb24gcmUpIHsKLSAgICAgICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbigiaW1wb3NzaWJsZTogIityZSk7Ci0gICAgICAgIH0KLSAgICAgICAgYm9vbGVhbiBzdWNjZXNzID0gIXN0YXRlLmZhaWxlZDsKLSAgICAgICAgaW5wdXQucmV3aW5kKHN0YXJ0KTsKLSAgICAgICAgc3RhdGUuYmFja3RyYWNraW5nLS07Ci0gICAgICAgIHN0YXRlLmZhaWxlZD1mYWxzZTsKLSAgICAgICAgcmV0dXJuIHN1Y2Nlc3M7Ci0gICAgfQotICAgIHB1YmxpYyBmaW5hbCBib29sZWFuIHN5bnByZWQyNDFfSW50ZXJuYWxEYXRhRFNMKCkgewotICAgICAgICBzdGF0ZS5iYWNrdHJhY2tpbmcrKzsKLSAgICAgICAgaW50IHN0YXJ0ID0gaW5wdXQubWFyaygpOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgc3lucHJlZDI0MV9JbnRlcm5hbERhdGFEU0xfZnJhZ21lbnQoKTsgLy8gY2FuIG5ldmVyIHRocm93IGV4Y2VwdGlvbgotICAgICAgICB9IGNhdGNoIChSZWNvZ25pdGlvbkV4Y2VwdGlvbiByZSkgewotICAgICAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKCJpbXBvc3NpYmxlOiAiK3JlKTsKLSAgICAgICAgfQotICAgICAgICBib29sZWFuIHN1Y2Nlc3MgPSAhc3RhdGUuZmFpbGVkOwotICAgICAgICBpbnB1dC5yZXdpbmQoc3RhcnQpOwotICAgICAgICBzdGF0ZS5iYWNrdHJhY2tpbmctLTsKLSAgICAgICAgc3RhdGUuZmFpbGVkPWZhbHNlOwotICAgICAgICByZXR1cm4gc3VjY2VzczsKLSAgICB9Ci0gICAgcHVibGljIGZpbmFsIGJvb2xlYW4gc3lucHJlZDg1X0ludGVybmFsRGF0YURTTCgpIHsKLSAgICAgICAgc3RhdGUuYmFja3RyYWNraW5nKys7Ci0gICAgICAgIGludCBzdGFydCA9IGlucHV0Lm1hcmsoKTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHN5bnByZWQ4NV9JbnRlcm5hbERhdGFEU0xfZnJhZ21lbnQoKTsgLy8gY2FuIG5ldmVyIHRocm93IGV4Y2VwdGlvbgotICAgICAgICB9IGNhdGNoIChSZWNvZ25pdGlvbkV4Y2VwdGlvbiByZSkgewotICAgICAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKCJpbXBvc3NpYmxlOiAiK3JlKTsKLSAgICAgICAgfQotICAgICAgICBib29sZWFuIHN1Y2Nlc3MgPSAhc3RhdGUuZmFpbGVkOwotICAgICAgICBpbnB1dC5yZXdpbmQoc3RhcnQpOwotICAgICAgICBzdGF0ZS5iYWNrdHJhY2tpbmctLTsKLSAgICAgICAgc3RhdGUuZmFpbGVkPWZhbHNlOwotICAgICAgICByZXR1cm4gc3VjY2VzczsKLSAgICB9Ci0gICAgcHVibGljIGZpbmFsIGJvb2xlYW4gc3lucHJlZDE1N19JbnRlcm5hbERhdGFEU0woKSB7Ci0gICAgICAgIHN0YXRlLmJhY2t0cmFja2luZysrOwotICAgICAgICBpbnQgc3RhcnQgPSBpbnB1dC5tYXJrKCk7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBzeW5wcmVkMTU3X0ludGVybmFsRGF0YURTTF9mcmFnbWVudCgpOyAvLyBjYW4gbmV2ZXIgdGhyb3cgZXhjZXB0aW9uCisgICAgICAgICAgICBzeW5wcmVkMjEzX0ludGVybmFsRGF0YURTTF9mcmFnbWVudCgpOyAvLyBjYW4gbmV2ZXIgdGhyb3cgZXhjZXB0aW9uCiAgICAgICAgIH0gY2F0Y2ggKFJlY29nbml0aW9uRXhjZXB0aW9uIHJlKSB7CiAgICAgICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oImltcG9zc2libGU6ICIrcmUpOwogICAgICAgICB9CkBAIC04NTI3MywzOSArOTA1MTYsMTEgQEAKICAgICAgICAgc3RhdGUuZmFpbGVkPWZhbHNlOwogICAgICAgICByZXR1cm4gc3VjY2VzczsKICAgICB9Ci0gICAgcHVibGljIGZpbmFsIGJvb2xlYW4gc3lucHJlZDIzMl9JbnRlcm5hbERhdGFEU0woKSB7CisgICAgcHVibGljIGZpbmFsIGJvb2xlYW4gc3lucHJlZDIyMF9JbnRlcm5hbERhdGFEU0woKSB7CiAgICAgICAgIHN0YXRlLmJhY2t0cmFja2luZysrOwogICAgICAgICBpbnQgc3RhcnQgPSBpbnB1dC5tYXJrKCk7CiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBzeW5wcmVkMjMyX0ludGVybmFsRGF0YURTTF9mcmFnbWVudCgpOyAvLyBjYW4gbmV2ZXIgdGhyb3cgZXhjZXB0aW9uCi0gICAgICAgIH0gY2F0Y2ggKFJlY29nbml0aW9uRXhjZXB0aW9uIHJlKSB7Ci0gICAgICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oImltcG9zc2libGU6ICIrcmUpOwotICAgICAgICB9Ci0gICAgICAgIGJvb2xlYW4gc3VjY2VzcyA9ICFzdGF0ZS5mYWlsZWQ7Ci0gICAgICAgIGlucHV0LnJld2luZChzdGFydCk7Ci0gICAgICAgIHN0YXRlLmJhY2t0cmFja2luZy0tOwotICAgICAgICBzdGF0ZS5mYWlsZWQ9ZmFsc2U7Ci0gICAgICAgIHJldHVybiBzdWNjZXNzOwotICAgIH0KLSAgICBwdWJsaWMgZmluYWwgYm9vbGVhbiBzeW5wcmVkMTUyX0ludGVybmFsRGF0YURTTCgpIHsKLSAgICAgICAgc3RhdGUuYmFja3RyYWNraW5nKys7Ci0gICAgICAgIGludCBzdGFydCA9IGlucHV0Lm1hcmsoKTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHN5bnByZWQxNTJfSW50ZXJuYWxEYXRhRFNMX2ZyYWdtZW50KCk7IC8vIGNhbiBuZXZlciB0aHJvdyBleGNlcHRpb24KLSAgICAgICAgfSBjYXRjaCAoUmVjb2duaXRpb25FeGNlcHRpb24gcmUpIHsKLSAgICAgICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbigiaW1wb3NzaWJsZTogIityZSk7Ci0gICAgICAgIH0KLSAgICAgICAgYm9vbGVhbiBzdWNjZXNzID0gIXN0YXRlLmZhaWxlZDsKLSAgICAgICAgaW5wdXQucmV3aW5kKHN0YXJ0KTsKLSAgICAgICAgc3RhdGUuYmFja3RyYWNraW5nLS07Ci0gICAgICAgIHN0YXRlLmZhaWxlZD1mYWxzZTsKLSAgICAgICAgcmV0dXJuIHN1Y2Nlc3M7Ci0gICAgfQotICAgIHB1YmxpYyBmaW5hbCBib29sZWFuIHN5bnByZWQ3OF9JbnRlcm5hbERhdGFEU0woKSB7Ci0gICAgICAgIHN0YXRlLmJhY2t0cmFja2luZysrOwotICAgICAgICBpbnQgc3RhcnQgPSBpbnB1dC5tYXJrKCk7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBzeW5wcmVkNzhfSW50ZXJuYWxEYXRhRFNMX2ZyYWdtZW50KCk7IC8vIGNhbiBuZXZlciB0aHJvdyBleGNlcHRpb24KKyAgICAgICAgICAgIHN5bnByZWQyMjBfSW50ZXJuYWxEYXRhRFNMX2ZyYWdtZW50KCk7IC8vIGNhbiBuZXZlciB0aHJvdyBleGNlcHRpb24KICAgICAgICAgfSBjYXRjaCAoUmVjb2duaXRpb25FeGNlcHRpb24gcmUpIHsKICAgICAgICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbigiaW1wb3NzaWJsZTogIityZSk7CiAgICAgICAgIH0KQEAgLTg1MzI5LDIwICs5MDU0NCw2IEBACiAgICAgICAgIHN0YXRlLmZhaWxlZD1mYWxzZTsKICAgICAgICAgcmV0dXJuIHN1Y2Nlc3M7CiAgICAgfQotICAgIHB1YmxpYyBmaW5hbCBib29sZWFuIHN5bnByZWQxNTVfSW50ZXJuYWxEYXRhRFNMKCkgewotICAgICAgICBzdGF0ZS5iYWNrdHJhY2tpbmcrKzsKLSAgICAgICAgaW50IHN0YXJ0ID0gaW5wdXQubWFyaygpOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgc3lucHJlZDE1NV9JbnRlcm5hbERhdGFEU0xfZnJhZ21lbnQoKTsgLy8gY2FuIG5ldmVyIHRocm93IGV4Y2VwdGlvbgotICAgICAgICB9IGNhdGNoIChSZWNvZ25pdGlvbkV4Y2VwdGlvbiByZSkgewotICAgICAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKCJpbXBvc3NpYmxlOiAiK3JlKTsKLSAgICAgICAgfQotICAgICAgICBib29sZWFuIHN1Y2Nlc3MgPSAhc3RhdGUuZmFpbGVkOwotICAgICAgICBpbnB1dC5yZXdpbmQoc3RhcnQpOwotICAgICAgICBzdGF0ZS5iYWNrdHJhY2tpbmctLTsKLSAgICAgICAgc3RhdGUuZmFpbGVkPWZhbHNlOwotICAgICAgICByZXR1cm4gc3VjY2VzczsKLSAgICB9CiAgICAgcHVibGljIGZpbmFsIGJvb2xlYW4gc3lucHJlZDYxX0ludGVybmFsRGF0YURTTCgpIHsKICAgICAgICAgc3RhdGUuYmFja3RyYWNraW5nKys7CiAgICAgICAgIGludCBzdGFydCA9IGlucHV0Lm1hcmsoKTsKQEAgLTg1Mzg1LDExICs5MDU4NiwxMSBAQAogICAgICAgICBzdGF0ZS5mYWlsZWQ9ZmFsc2U7CiAgICAgICAgIHJldHVybiBzdWNjZXNzOwogICAgIH0KLSAgICBwdWJsaWMgZmluYWwgYm9vbGVhbiBzeW5wcmVkNTJfSW50ZXJuYWxEYXRhRFNMKCkgeworICAgIHB1YmxpYyBmaW5hbCBib29sZWFuIHN5bnByZWQxOTBfSW50ZXJuYWxEYXRhRFNMKCkgewogICAgICAgICBzdGF0ZS5iYWNrdHJhY2tpbmcrKzsKICAgICAgICAgaW50IHN0YXJ0ID0gaW5wdXQubWFyaygpOwogICAgICAgICB0cnkgewotICAgICAgICAgICAgc3lucHJlZDUyX0ludGVybmFsRGF0YURTTF9mcmFnbWVudCgpOyAvLyBjYW4gbmV2ZXIgdGhyb3cgZXhjZXB0aW9uCisgICAgICAgICAgICBzeW5wcmVkMTkwX0ludGVybmFsRGF0YURTTF9mcmFnbWVudCgpOyAvLyBjYW4gbmV2ZXIgdGhyb3cgZXhjZXB0aW9uCiAgICAgICAgIH0gY2F0Y2ggKFJlY29nbml0aW9uRXhjZXB0aW9uIHJlKSB7CiAgICAgICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oImltcG9zc2libGU6ICIrcmUpOwogICAgICAgICB9CkBAIC04NTQyNywxMSArOTA2MjgsMTEgQEAKICAgICAgICAgc3RhdGUuZmFpbGVkPWZhbHNlOwogICAgICAgICByZXR1cm4gc3VjY2VzczsKICAgICB9Ci0gICAgcHVibGljIGZpbmFsIGJvb2xlYW4gc3lucHJlZDE5OV9JbnRlcm5hbERhdGFEU0woKSB7CisgICAgcHVibGljIGZpbmFsIGJvb2xlYW4gc3lucHJlZDI0OV9JbnRlcm5hbERhdGFEU0woKSB7CiAgICAgICAgIHN0YXRlLmJhY2t0cmFja2luZysrOwogICAgICAgICBpbnQgc3RhcnQgPSBpbnB1dC5tYXJrKCk7CiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBzeW5wcmVkMTk5X0ludGVybmFsRGF0YURTTF9mcmFnbWVudCgpOyAvLyBjYW4gbmV2ZXIgdGhyb3cgZXhjZXB0aW9uCisgICAgICAgICAgICBzeW5wcmVkMjQ5X0ludGVybmFsRGF0YURTTF9mcmFnbWVudCgpOyAvLyBjYW4gbmV2ZXIgdGhyb3cgZXhjZXB0aW9uCiAgICAgICAgIH0gY2F0Y2ggKFJlY29nbml0aW9uRXhjZXB0aW9uIHJlKSB7CiAgICAgICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oImltcG9zc2libGU6ICIrcmUpOwogICAgICAgICB9CkBAIC04NTQ0MSwxMSArOTA2NDIsNjcgQEAKICAgICAgICAgc3RhdGUuZmFpbGVkPWZhbHNlOwogICAgICAgICByZXR1cm4gc3VjY2VzczsKICAgICB9Ci0gICAgcHVibGljIGZpbmFsIGJvb2xlYW4gc3lucHJlZDE1M19JbnRlcm5hbERhdGFEU0woKSB7CisgICAgcHVibGljIGZpbmFsIGJvb2xlYW4gc3lucHJlZDQwX0ludGVybmFsRGF0YURTTCgpIHsKICAgICAgICAgc3RhdGUuYmFja3RyYWNraW5nKys7CiAgICAgICAgIGludCBzdGFydCA9IGlucHV0Lm1hcmsoKTsKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHN5bnByZWQxNTNfSW50ZXJuYWxEYXRhRFNMX2ZyYWdtZW50KCk7IC8vIGNhbiBuZXZlciB0aHJvdyBleGNlcHRpb24KKyAgICAgICAgICAgIHN5bnByZWQ0MF9JbnRlcm5hbERhdGFEU0xfZnJhZ21lbnQoKTsgLy8gY2FuIG5ldmVyIHRocm93IGV4Y2VwdGlvbgorICAgICAgICB9IGNhdGNoIChSZWNvZ25pdGlvbkV4Y2VwdGlvbiByZSkgeworICAgICAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKCJpbXBvc3NpYmxlOiAiK3JlKTsKKyAgICAgICAgfQorICAgICAgICBib29sZWFuIHN1Y2Nlc3MgPSAhc3RhdGUuZmFpbGVkOworICAgICAgICBpbnB1dC5yZXdpbmQoc3RhcnQpOworICAgICAgICBzdGF0ZS5iYWNrdHJhY2tpbmctLTsKKyAgICAgICAgc3RhdGUuZmFpbGVkPWZhbHNlOworICAgICAgICByZXR1cm4gc3VjY2VzczsKKyAgICB9CisgICAgcHVibGljIGZpbmFsIGJvb2xlYW4gc3lucHJlZDI1OF9JbnRlcm5hbERhdGFEU0woKSB7CisgICAgICAgIHN0YXRlLmJhY2t0cmFja2luZysrOworICAgICAgICBpbnQgc3RhcnQgPSBpbnB1dC5tYXJrKCk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBzeW5wcmVkMjU4X0ludGVybmFsRGF0YURTTF9mcmFnbWVudCgpOyAvLyBjYW4gbmV2ZXIgdGhyb3cgZXhjZXB0aW9uCisgICAgICAgIH0gY2F0Y2ggKFJlY29nbml0aW9uRXhjZXB0aW9uIHJlKSB7CisgICAgICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oImltcG9zc2libGU6ICIrcmUpOworICAgICAgICB9CisgICAgICAgIGJvb2xlYW4gc3VjY2VzcyA9ICFzdGF0ZS5mYWlsZWQ7CisgICAgICAgIGlucHV0LnJld2luZChzdGFydCk7CisgICAgICAgIHN0YXRlLmJhY2t0cmFja2luZy0tOworICAgICAgICBzdGF0ZS5mYWlsZWQ9ZmFsc2U7CisgICAgICAgIHJldHVybiBzdWNjZXNzOworICAgIH0KKyAgICBwdWJsaWMgZmluYWwgYm9vbGVhbiBzeW5wcmVkMjY0X0ludGVybmFsRGF0YURTTCgpIHsKKyAgICAgICAgc3RhdGUuYmFja3RyYWNraW5nKys7CisgICAgICAgIGludCBzdGFydCA9IGlucHV0Lm1hcmsoKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHN5bnByZWQyNjRfSW50ZXJuYWxEYXRhRFNMX2ZyYWdtZW50KCk7IC8vIGNhbiBuZXZlciB0aHJvdyBleGNlcHRpb24KKyAgICAgICAgfSBjYXRjaCAoUmVjb2duaXRpb25FeGNlcHRpb24gcmUpIHsKKyAgICAgICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbigiaW1wb3NzaWJsZTogIityZSk7CisgICAgICAgIH0KKyAgICAgICAgYm9vbGVhbiBzdWNjZXNzID0gIXN0YXRlLmZhaWxlZDsKKyAgICAgICAgaW5wdXQucmV3aW5kKHN0YXJ0KTsKKyAgICAgICAgc3RhdGUuYmFja3RyYWNraW5nLS07CisgICAgICAgIHN0YXRlLmZhaWxlZD1mYWxzZTsKKyAgICAgICAgcmV0dXJuIHN1Y2Nlc3M7CisgICAgfQorICAgIHB1YmxpYyBmaW5hbCBib29sZWFuIHN5bnByZWQyNTVfSW50ZXJuYWxEYXRhRFNMKCkgeworICAgICAgICBzdGF0ZS5iYWNrdHJhY2tpbmcrKzsKKyAgICAgICAgaW50IHN0YXJ0ID0gaW5wdXQubWFyaygpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgc3lucHJlZDI1NV9JbnRlcm5hbERhdGFEU0xfZnJhZ21lbnQoKTsgLy8gY2FuIG5ldmVyIHRocm93IGV4Y2VwdGlvbgorICAgICAgICB9IGNhdGNoIChSZWNvZ25pdGlvbkV4Y2VwdGlvbiByZSkgeworICAgICAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKCJpbXBvc3NpYmxlOiAiK3JlKTsKKyAgICAgICAgfQorICAgICAgICBib29sZWFuIHN1Y2Nlc3MgPSAhc3RhdGUuZmFpbGVkOworICAgICAgICBpbnB1dC5yZXdpbmQoc3RhcnQpOworICAgICAgICBzdGF0ZS5iYWNrdHJhY2tpbmctLTsKKyAgICAgICAgc3RhdGUuZmFpbGVkPWZhbHNlOworICAgICAgICByZXR1cm4gc3VjY2VzczsKKyAgICB9CisgICAgcHVibGljIGZpbmFsIGJvb2xlYW4gc3lucHJlZDI2MV9JbnRlcm5hbERhdGFEU0woKSB7CisgICAgICAgIHN0YXRlLmJhY2t0cmFja2luZysrOworICAgICAgICBpbnQgc3RhcnQgPSBpbnB1dC5tYXJrKCk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBzeW5wcmVkMjYxX0ludGVybmFsRGF0YURTTF9mcmFnbWVudCgpOyAvLyBjYW4gbmV2ZXIgdGhyb3cgZXhjZXB0aW9uCiAgICAgICAgIH0gY2F0Y2ggKFJlY29nbml0aW9uRXhjZXB0aW9uIHJlKSB7CiAgICAgICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oImltcG9zc2libGU6ICIrcmUpOwogICAgICAgICB9CkBAIC04NTQ2OSw0OCArOTA3MjYsNiBAQAogICAgICAgICBzdGF0ZS5mYWlsZWQ9ZmFsc2U7CiAgICAgICAgIHJldHVybiBzdWNjZXNzOwogICAgIH0KLSAgICBwdWJsaWMgZmluYWwgYm9vbGVhbiBzeW5wcmVkMTQ5X0ludGVybmFsRGF0YURTTCgpIHsKLSAgICAgICAgc3RhdGUuYmFja3RyYWNraW5nKys7Ci0gICAgICAgIGludCBzdGFydCA9IGlucHV0Lm1hcmsoKTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHN5bnByZWQxNDlfSW50ZXJuYWxEYXRhRFNMX2ZyYWdtZW50KCk7IC8vIGNhbiBuZXZlciB0aHJvdyBleGNlcHRpb24KLSAgICAgICAgfSBjYXRjaCAoUmVjb2duaXRpb25FeGNlcHRpb24gcmUpIHsKLSAgICAgICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbigiaW1wb3NzaWJsZTogIityZSk7Ci0gICAgICAgIH0KLSAgICAgICAgYm9vbGVhbiBzdWNjZXNzID0gIXN0YXRlLmZhaWxlZDsKLSAgICAgICAgaW5wdXQucmV3aW5kKHN0YXJ0KTsKLSAgICAgICAgc3RhdGUuYmFja3RyYWNraW5nLS07Ci0gICAgICAgIHN0YXRlLmZhaWxlZD1mYWxzZTsKLSAgICAgICAgcmV0dXJuIHN1Y2Nlc3M7Ci0gICAgfQotICAgIHB1YmxpYyBmaW5hbCBib29sZWFuIHN5bnByZWQyMzNfSW50ZXJuYWxEYXRhRFNMKCkgewotICAgICAgICBzdGF0ZS5iYWNrdHJhY2tpbmcrKzsKLSAgICAgICAgaW50IHN0YXJ0ID0gaW5wdXQubWFyaygpOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgc3lucHJlZDIzM19JbnRlcm5hbERhdGFEU0xfZnJhZ21lbnQoKTsgLy8gY2FuIG5ldmVyIHRocm93IGV4Y2VwdGlvbgotICAgICAgICB9IGNhdGNoIChSZWNvZ25pdGlvbkV4Y2VwdGlvbiByZSkgewotICAgICAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKCJpbXBvc3NpYmxlOiAiK3JlKTsKLSAgICAgICAgfQotICAgICAgICBib29sZWFuIHN1Y2Nlc3MgPSAhc3RhdGUuZmFpbGVkOwotICAgICAgICBpbnB1dC5yZXdpbmQoc3RhcnQpOwotICAgICAgICBzdGF0ZS5iYWNrdHJhY2tpbmctLTsKLSAgICAgICAgc3RhdGUuZmFpbGVkPWZhbHNlOwotICAgICAgICByZXR1cm4gc3VjY2VzczsKLSAgICB9Ci0gICAgcHVibGljIGZpbmFsIGJvb2xlYW4gc3lucHJlZDI0MF9JbnRlcm5hbERhdGFEU0woKSB7Ci0gICAgICAgIHN0YXRlLmJhY2t0cmFja2luZysrOwotICAgICAgICBpbnQgc3RhcnQgPSBpbnB1dC5tYXJrKCk7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBzeW5wcmVkMjQwX0ludGVybmFsRGF0YURTTF9mcmFnbWVudCgpOyAvLyBjYW4gbmV2ZXIgdGhyb3cgZXhjZXB0aW9uCi0gICAgICAgIH0gY2F0Y2ggKFJlY29nbml0aW9uRXhjZXB0aW9uIHJlKSB7Ci0gICAgICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oImltcG9zc2libGU6ICIrcmUpOwotICAgICAgICB9Ci0gICAgICAgIGJvb2xlYW4gc3VjY2VzcyA9ICFzdGF0ZS5mYWlsZWQ7Ci0gICAgICAgIGlucHV0LnJld2luZChzdGFydCk7Ci0gICAgICAgIHN0YXRlLmJhY2t0cmFja2luZy0tOwotICAgICAgICBzdGF0ZS5mYWlsZWQ9ZmFsc2U7Ci0gICAgICAgIHJldHVybiBzdWNjZXNzOwotICAgIH0KICAgICBwdWJsaWMgZmluYWwgYm9vbGVhbiBzeW5wcmVkMTJfSW50ZXJuYWxEYXRhRFNMKCkgewogICAgICAgICBzdGF0ZS5iYWNrdHJhY2tpbmcrKzsKICAgICAgICAgaW50IHN0YXJ0ID0gaW5wdXQubWFyaygpOwpAQCAtODU1MzksMTEgKzkwNzU0LDExIEBACiAgICAgICAgIHN0YXRlLmZhaWxlZD1mYWxzZTsKICAgICAgICAgcmV0dXJuIHN1Y2Nlc3M7CiAgICAgfQotICAgIHB1YmxpYyBmaW5hbCBib29sZWFuIHN5bnByZWQyMDhfSW50ZXJuYWxEYXRhRFNMKCkgeworICAgIHB1YmxpYyBmaW5hbCBib29sZWFuIHN5bnByZWQ1M19JbnRlcm5hbERhdGFEU0woKSB7CiAgICAgICAgIHN0YXRlLmJhY2t0cmFja2luZysrOwogICAgICAgICBpbnQgc3RhcnQgPSBpbnB1dC5tYXJrKCk7CiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBzeW5wcmVkMjA4X0ludGVybmFsRGF0YURTTF9mcmFnbWVudCgpOyAvLyBjYW4gbmV2ZXIgdGhyb3cgZXhjZXB0aW9uCisgICAgICAgICAgICBzeW5wcmVkNTNfSW50ZXJuYWxEYXRhRFNMX2ZyYWdtZW50KCk7IC8vIGNhbiBuZXZlciB0aHJvdyBleGNlcHRpb24KICAgICAgICAgfSBjYXRjaCAoUmVjb2duaXRpb25FeGNlcHRpb24gcmUpIHsKICAgICAgICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbigiaW1wb3NzaWJsZTogIityZSk7CiAgICAgICAgIH0KQEAgLTg1NTY3LDIwICs5MDc4Miw2IEBACiAgICAgICAgIHN0YXRlLmZhaWxlZD1mYWxzZTsKICAgICAgICAgcmV0dXJuIHN1Y2Nlc3M7CiAgICAgfQotICAgIHB1YmxpYyBmaW5hbCBib29sZWFuIHN5bnByZWQyMjlfSW50ZXJuYWxEYXRhRFNMKCkgewotICAgICAgICBzdGF0ZS5iYWNrdHJhY2tpbmcrKzsKLSAgICAgICAgaW50IHN0YXJ0ID0gaW5wdXQubWFyaygpOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgc3lucHJlZDIyOV9JbnRlcm5hbERhdGFEU0xfZnJhZ21lbnQoKTsgLy8gY2FuIG5ldmVyIHRocm93IGV4Y2VwdGlvbgotICAgICAgICB9IGNhdGNoIChSZWNvZ25pdGlvbkV4Y2VwdGlvbiByZSkgewotICAgICAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKCJpbXBvc3NpYmxlOiAiK3JlKTsKLSAgICAgICAgfQotICAgICAgICBib29sZWFuIHN1Y2Nlc3MgPSAhc3RhdGUuZmFpbGVkOwotICAgICAgICBpbnB1dC5yZXdpbmQoc3RhcnQpOwotICAgICAgICBzdGF0ZS5iYWNrdHJhY2tpbmctLTsKLSAgICAgICAgc3RhdGUuZmFpbGVkPWZhbHNlOwotICAgICAgICByZXR1cm4gc3VjY2VzczsKLSAgICB9CiAgICAgcHVibGljIGZpbmFsIGJvb2xlYW4gc3lucHJlZDM5X0ludGVybmFsRGF0YURTTCgpIHsKICAgICAgICAgc3RhdGUuYmFja3RyYWNraW5nKys7CiAgICAgICAgIGludCBzdGFydCA9IGlucHV0Lm1hcmsoKTsKQEAgLTg1NTk1LDExICs5MDc5NiwxMSBAQAogICAgICAgICBzdGF0ZS5mYWlsZWQ9ZmFsc2U7CiAgICAgICAgIHJldHVybiBzdWNjZXNzOwogICAgIH0KLSAgICBwdWJsaWMgZmluYWwgYm9vbGVhbiBzeW5wcmVkMTYwX0ludGVybmFsRGF0YURTTCgpIHsKKyAgICBwdWJsaWMgZmluYWwgYm9vbGVhbiBzeW5wcmVkMjU3X0ludGVybmFsRGF0YURTTCgpIHsKICAgICAgICAgc3RhdGUuYmFja3RyYWNraW5nKys7CiAgICAgICAgIGludCBzdGFydCA9IGlucHV0Lm1hcmsoKTsKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHN5bnByZWQxNjBfSW50ZXJuYWxEYXRhRFNMX2ZyYWdtZW50KCk7IC8vIGNhbiBuZXZlciB0aHJvdyBleGNlcHRpb24KKyAgICAgICAgICAgIHN5bnByZWQyNTdfSW50ZXJuYWxEYXRhRFNMX2ZyYWdtZW50KCk7IC8vIGNhbiBuZXZlciB0aHJvdyBleGNlcHRpb24KICAgICAgICAgfSBjYXRjaCAoUmVjb2duaXRpb25FeGNlcHRpb24gcmUpIHsKICAgICAgICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbigiaW1wb3NzaWJsZTogIityZSk7CiAgICAgICAgIH0KQEAgLTg1NjA5LDExICs5MDgxMCwxMSBAQAogICAgICAgICBzdGF0ZS5mYWlsZWQ9ZmFsc2U7CiAgICAgICAgIHJldHVybiBzdWNjZXNzOwogICAgIH0KLSAgICBwdWJsaWMgZmluYWwgYm9vbGVhbiBzeW5wcmVkNjBfSW50ZXJuYWxEYXRhRFNMKCkgeworICAgIHB1YmxpYyBmaW5hbCBib29sZWFuIHN5bnByZWQxOTdfSW50ZXJuYWxEYXRhRFNMKCkgewogICAgICAgICBzdGF0ZS5iYWNrdHJhY2tpbmcrKzsKICAgICAgICAgaW50IHN0YXJ0ID0gaW5wdXQubWFyaygpOwogICAgICAgICB0cnkgewotICAgICAgICAgICAgc3lucHJlZDYwX0ludGVybmFsRGF0YURTTF9mcmFnbWVudCgpOyAvLyBjYW4gbmV2ZXIgdGhyb3cgZXhjZXB0aW9uCisgICAgICAgICAgICBzeW5wcmVkMTk3X0ludGVybmFsRGF0YURTTF9mcmFnbWVudCgpOyAvLyBjYW4gbmV2ZXIgdGhyb3cgZXhjZXB0aW9uCiAgICAgICAgIH0gY2F0Y2ggKFJlY29nbml0aW9uRXhjZXB0aW9uIHJlKSB7CiAgICAgICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oImltcG9zc2libGU6ICIrcmUpOwogICAgICAgICB9CkBAIC04NTYyMywxMSArOTA4MjQsMTEgQEAKICAgICAgICAgc3RhdGUuZmFpbGVkPWZhbHNlOwogICAgICAgICByZXR1cm4gc3VjY2VzczsKICAgICB9Ci0gICAgcHVibGljIGZpbmFsIGJvb2xlYW4gc3lucHJlZDE2M19JbnRlcm5hbERhdGFEU0woKSB7CisgICAgcHVibGljIGZpbmFsIGJvb2xlYW4gc3lucHJlZDI1MF9JbnRlcm5hbERhdGFEU0woKSB7CiAgICAgICAgIHN0YXRlLmJhY2t0cmFja2luZysrOwogICAgICAgICBpbnQgc3RhcnQgPSBpbnB1dC5tYXJrKCk7CiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBzeW5wcmVkMTYzX0ludGVybmFsRGF0YURTTF9mcmFnbWVudCgpOyAvLyBjYW4gbmV2ZXIgdGhyb3cgZXhjZXB0aW9uCisgICAgICAgICAgICBzeW5wcmVkMjUwX0ludGVybmFsRGF0YURTTF9mcmFnbWVudCgpOyAvLyBjYW4gbmV2ZXIgdGhyb3cgZXhjZXB0aW9uCiAgICAgICAgIH0gY2F0Y2ggKFJlY29nbml0aW9uRXhjZXB0aW9uIHJlKSB7CiAgICAgICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oImltcG9zc2libGU6ICIrcmUpOwogICAgICAgICB9CkBAIC04NTYzNywxMSArOTA4MzgsMTEgQEAKICAgICAgICAgc3RhdGUuZmFpbGVkPWZhbHNlOwogICAgICAgICByZXR1cm4gc3VjY2VzczsKICAgICB9Ci0gICAgcHVibGljIGZpbmFsIGJvb2xlYW4gc3lucHJlZDIyM19JbnRlcm5hbERhdGFEU0woKSB7CisgICAgcHVibGljIGZpbmFsIGJvb2xlYW4gc3lucHJlZDIxOV9JbnRlcm5hbERhdGFEU0woKSB7CiAgICAgICAgIHN0YXRlLmJhY2t0cmFja2luZysrOwogICAgICAgICBpbnQgc3RhcnQgPSBpbnB1dC5tYXJrKCk7CiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBzeW5wcmVkMjIzX0ludGVybmFsRGF0YURTTF9mcmFnbWVudCgpOyAvLyBjYW4gbmV2ZXIgdGhyb3cgZXhjZXB0aW9uCisgICAgICAgICAgICBzeW5wcmVkMjE5X0ludGVybmFsRGF0YURTTF9mcmFnbWVudCgpOyAvLyBjYW4gbmV2ZXIgdGhyb3cgZXhjZXB0aW9uCiAgICAgICAgIH0gY2F0Y2ggKFJlY29nbml0aW9uRXhjZXB0aW9uIHJlKSB7CiAgICAgICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oImltcG9zc2libGU6ICIrcmUpOwogICAgICAgICB9CkBAIC04NTY2NSwxMSArOTA4NjYsNTMgQEAKICAgICAgICAgc3RhdGUuZmFpbGVkPWZhbHNlOwogICAgICAgICByZXR1cm4gc3VjY2VzczsKICAgICB9Ci0gICAgcHVibGljIGZpbmFsIGJvb2xlYW4gc3lucHJlZDE5NF9JbnRlcm5hbERhdGFEU0woKSB7CisgICAgcHVibGljIGZpbmFsIGJvb2xlYW4gc3lucHJlZDI1M19JbnRlcm5hbERhdGFEU0woKSB7CiAgICAgICAgIHN0YXRlLmJhY2t0cmFja2luZysrOwogICAgICAgICBpbnQgc3RhcnQgPSBpbnB1dC5tYXJrKCk7CiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBzeW5wcmVkMTk0X0ludGVybmFsRGF0YURTTF9mcmFnbWVudCgpOyAvLyBjYW4gbmV2ZXIgdGhyb3cgZXhjZXB0aW9uCisgICAgICAgICAgICBzeW5wcmVkMjUzX0ludGVybmFsRGF0YURTTF9mcmFnbWVudCgpOyAvLyBjYW4gbmV2ZXIgdGhyb3cgZXhjZXB0aW9uCisgICAgICAgIH0gY2F0Y2ggKFJlY29nbml0aW9uRXhjZXB0aW9uIHJlKSB7CisgICAgICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oImltcG9zc2libGU6ICIrcmUpOworICAgICAgICB9CisgICAgICAgIGJvb2xlYW4gc3VjY2VzcyA9ICFzdGF0ZS5mYWlsZWQ7CisgICAgICAgIGlucHV0LnJld2luZChzdGFydCk7CisgICAgICAgIHN0YXRlLmJhY2t0cmFja2luZy0tOworICAgICAgICBzdGF0ZS5mYWlsZWQ9ZmFsc2U7CisgICAgICAgIHJldHVybiBzdWNjZXNzOworICAgIH0KKyAgICBwdWJsaWMgZmluYWwgYm9vbGVhbiBzeW5wcmVkMTczX0ludGVybmFsRGF0YURTTCgpIHsKKyAgICAgICAgc3RhdGUuYmFja3RyYWNraW5nKys7CisgICAgICAgIGludCBzdGFydCA9IGlucHV0Lm1hcmsoKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHN5bnByZWQxNzNfSW50ZXJuYWxEYXRhRFNMX2ZyYWdtZW50KCk7IC8vIGNhbiBuZXZlciB0aHJvdyBleGNlcHRpb24KKyAgICAgICAgfSBjYXRjaCAoUmVjb2duaXRpb25FeGNlcHRpb24gcmUpIHsKKyAgICAgICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbigiaW1wb3NzaWJsZTogIityZSk7CisgICAgICAgIH0KKyAgICAgICAgYm9vbGVhbiBzdWNjZXNzID0gIXN0YXRlLmZhaWxlZDsKKyAgICAgICAgaW5wdXQucmV3aW5kKHN0YXJ0KTsKKyAgICAgICAgc3RhdGUuYmFja3RyYWNraW5nLS07CisgICAgICAgIHN0YXRlLmZhaWxlZD1mYWxzZTsKKyAgICAgICAgcmV0dXJuIHN1Y2Nlc3M7CisgICAgfQorICAgIHB1YmxpYyBmaW5hbCBib29sZWFuIHN5bnByZWQxNzBfSW50ZXJuYWxEYXRhRFNMKCkgeworICAgICAgICBzdGF0ZS5iYWNrdHJhY2tpbmcrKzsKKyAgICAgICAgaW50IHN0YXJ0ID0gaW5wdXQubWFyaygpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgc3lucHJlZDE3MF9JbnRlcm5hbERhdGFEU0xfZnJhZ21lbnQoKTsgLy8gY2FuIG5ldmVyIHRocm93IGV4Y2VwdGlvbgorICAgICAgICB9IGNhdGNoIChSZWNvZ25pdGlvbkV4Y2VwdGlvbiByZSkgeworICAgICAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKCJpbXBvc3NpYmxlOiAiK3JlKTsKKyAgICAgICAgfQorICAgICAgICBib29sZWFuIHN1Y2Nlc3MgPSAhc3RhdGUuZmFpbGVkOworICAgICAgICBpbnB1dC5yZXdpbmQoc3RhcnQpOworICAgICAgICBzdGF0ZS5iYWNrdHJhY2tpbmctLTsKKyAgICAgICAgc3RhdGUuZmFpbGVkPWZhbHNlOworICAgICAgICByZXR1cm4gc3VjY2VzczsKKyAgICB9CisgICAgcHVibGljIGZpbmFsIGJvb2xlYW4gc3lucHJlZDI0N19JbnRlcm5hbERhdGFEU0woKSB7CisgICAgICAgIHN0YXRlLmJhY2t0cmFja2luZysrOworICAgICAgICBpbnQgc3RhcnQgPSBpbnB1dC5tYXJrKCk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBzeW5wcmVkMjQ3X0ludGVybmFsRGF0YURTTF9mcmFnbWVudCgpOyAvLyBjYW4gbmV2ZXIgdGhyb3cgZXhjZXB0aW9uCiAgICAgICAgIH0gY2F0Y2ggKFJlY29nbml0aW9uRXhjZXB0aW9uIHJlKSB7CiAgICAgICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oImltcG9zc2libGU6ICIrcmUpOwogICAgICAgICB9CkBAIC04NTY5MywxMSArOTA5MzYsMTEgQEAKICAgICAgICAgc3RhdGUuZmFpbGVkPWZhbHNlOwogICAgICAgICByZXR1cm4gc3VjY2VzczsKICAgICB9Ci0gICAgcHVibGljIGZpbmFsIGJvb2xlYW4gc3lucHJlZDE5NV9JbnRlcm5hbERhdGFEU0woKSB7CisgICAgcHVibGljIGZpbmFsIGJvb2xlYW4gc3lucHJlZDI1Nl9JbnRlcm5hbERhdGFEU0woKSB7CiAgICAgICAgIHN0YXRlLmJhY2t0cmFja2luZysrOwogICAgICAgICBpbnQgc3RhcnQgPSBpbnB1dC5tYXJrKCk7CiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBzeW5wcmVkMTk1X0ludGVybmFsRGF0YURTTF9mcmFnbWVudCgpOyAvLyBjYW4gbmV2ZXIgdGhyb3cgZXhjZXB0aW9uCisgICAgICAgICAgICBzeW5wcmVkMjU2X0ludGVybmFsRGF0YURTTF9mcmFnbWVudCgpOyAvLyBjYW4gbmV2ZXIgdGhyb3cgZXhjZXB0aW9uCiAgICAgICAgIH0gY2F0Y2ggKFJlY29nbml0aW9uRXhjZXB0aW9uIHJlKSB7CiAgICAgICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oImltcG9zc2libGU6ICIrcmUpOwogICAgICAgICB9CkBAIC04NTcwNywxMSArOTA5NTAsMTEgQEAKICAgICAgICAgc3RhdGUuZmFpbGVkPWZhbHNlOwogICAgICAgICByZXR1cm4gc3VjY2VzczsKICAgICB9Ci0gICAgcHVibGljIGZpbmFsIGJvb2xlYW4gc3lucHJlZDIwOV9JbnRlcm5hbERhdGFEU0woKSB7CisgICAgcHVibGljIGZpbmFsIGJvb2xlYW4gc3lucHJlZDI2MF9JbnRlcm5hbERhdGFEU0woKSB7CiAgICAgICAgIHN0YXRlLmJhY2t0cmFja2luZysrOwogICAgICAgICBpbnQgc3RhcnQgPSBpbnB1dC5tYXJrKCk7CiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBzeW5wcmVkMjA5X0ludGVybmFsRGF0YURTTF9mcmFnbWVudCgpOyAvLyBjYW4gbmV2ZXIgdGhyb3cgZXhjZXB0aW9uCisgICAgICAgICAgICBzeW5wcmVkMjYwX0ludGVybmFsRGF0YURTTF9mcmFnbWVudCgpOyAvLyBjYW4gbmV2ZXIgdGhyb3cgZXhjZXB0aW9uCiAgICAgICAgIH0gY2F0Y2ggKFJlY29nbml0aW9uRXhjZXB0aW9uIHJlKSB7CiAgICAgICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oImltcG9zc2libGU6ICIrcmUpOwogICAgICAgICB9CkBAIC04NTcyMSwxMSArOTA5NjQsMTEgQEAKICAgICAgICAgc3RhdGUuZmFpbGVkPWZhbHNlOwogICAgICAgICByZXR1cm4gc3VjY2VzczsKICAgICB9Ci0gICAgcHVibGljIGZpbmFsIGJvb2xlYW4gc3lucHJlZDM4X0ludGVybmFsRGF0YURTTCgpIHsKKyAgICBwdWJsaWMgZmluYWwgYm9vbGVhbiBzeW5wcmVkMjU5X0ludGVybmFsRGF0YURTTCgpIHsKICAgICAgICAgc3RhdGUuYmFja3RyYWNraW5nKys7CiAgICAgICAgIGludCBzdGFydCA9IGlucHV0Lm1hcmsoKTsKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHN5bnByZWQzOF9JbnRlcm5hbERhdGFEU0xfZnJhZ21lbnQoKTsgLy8gY2FuIG5ldmVyIHRocm93IGV4Y2VwdGlvbgorICAgICAgICAgICAgc3lucHJlZDI1OV9JbnRlcm5hbERhdGFEU0xfZnJhZ21lbnQoKTsgLy8gY2FuIG5ldmVyIHRocm93IGV4Y2VwdGlvbgogICAgICAgICB9IGNhdGNoIChSZWNvZ25pdGlvbkV4Y2VwdGlvbiByZSkgewogICAgICAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKCJpbXBvc3NpYmxlOiAiK3JlKTsKICAgICAgICAgfQpAQCAtODU3MzUsMTEgKzkwOTc4LDExIEBACiAgICAgICAgIHN0YXRlLmZhaWxlZD1mYWxzZTsKICAgICAgICAgcmV0dXJuIHN1Y2Nlc3M7CiAgICAgfQotICAgIHB1YmxpYyBmaW5hbCBib29sZWFuIHN5bnByZWQyMDZfSW50ZXJuYWxEYXRhRFNMKCkgeworICAgIHB1YmxpYyBmaW5hbCBib29sZWFuIHN5bnByZWQyNjNfSW50ZXJuYWxEYXRhRFNMKCkgewogICAgICAgICBzdGF0ZS5iYWNrdHJhY2tpbmcrKzsKICAgICAgICAgaW50IHN0YXJ0ID0gaW5wdXQubWFyaygpOwogICAgICAgICB0cnkgewotICAgICAgICAgICAgc3lucHJlZDIwNl9JbnRlcm5hbERhdGFEU0xfZnJhZ21lbnQoKTsgLy8gY2FuIG5ldmVyIHRocm93IGV4Y2VwdGlvbgorICAgICAgICAgICAgc3lucHJlZDI2M19JbnRlcm5hbERhdGFEU0xfZnJhZ21lbnQoKTsgLy8gY2FuIG5ldmVyIHRocm93IGV4Y2VwdGlvbgogICAgICAgICB9IGNhdGNoIChSZWNvZ25pdGlvbkV4Y2VwdGlvbiByZSkgewogICAgICAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKCJpbXBvc3NpYmxlOiAiK3JlKTsKICAgICAgICAgfQpAQCAtODU3NDksMTEgKzkwOTkyLDI1IEBACiAgICAgICAgIHN0YXRlLmZhaWxlZD1mYWxzZTsKICAgICAgICAgcmV0dXJuIHN1Y2Nlc3M7CiAgICAgfQotICAgIHB1YmxpYyBmaW5hbCBib29sZWFuIHN5bnByZWQyMTVfSW50ZXJuYWxEYXRhRFNMKCkgeworICAgIHB1YmxpYyBmaW5hbCBib29sZWFuIHN5bnByZWQyNTFfSW50ZXJuYWxEYXRhRFNMKCkgewogICAgICAgICBzdGF0ZS5iYWNrdHJhY2tpbmcrKzsKICAgICAgICAgaW50IHN0YXJ0ID0gaW5wdXQubWFyaygpOwogICAgICAgICB0cnkgewotICAgICAgICAgICAgc3lucHJlZDIxNV9JbnRlcm5hbERhdGFEU0xfZnJhZ21lbnQoKTsgLy8gY2FuIG5ldmVyIHRocm93IGV4Y2VwdGlvbgorICAgICAgICAgICAgc3lucHJlZDI1MV9JbnRlcm5hbERhdGFEU0xfZnJhZ21lbnQoKTsgLy8gY2FuIG5ldmVyIHRocm93IGV4Y2VwdGlvbgorICAgICAgICB9IGNhdGNoIChSZWNvZ25pdGlvbkV4Y2VwdGlvbiByZSkgeworICAgICAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKCJpbXBvc3NpYmxlOiAiK3JlKTsKKyAgICAgICAgfQorICAgICAgICBib29sZWFuIHN1Y2Nlc3MgPSAhc3RhdGUuZmFpbGVkOworICAgICAgICBpbnB1dC5yZXdpbmQoc3RhcnQpOworICAgICAgICBzdGF0ZS5iYWNrdHJhY2tpbmctLTsKKyAgICAgICAgc3RhdGUuZmFpbGVkPWZhbHNlOworICAgICAgICByZXR1cm4gc3VjY2VzczsKKyAgICB9CisgICAgcHVibGljIGZpbmFsIGJvb2xlYW4gc3lucHJlZDI1NF9JbnRlcm5hbERhdGFEU0woKSB7CisgICAgICAgIHN0YXRlLmJhY2t0cmFja2luZysrOworICAgICAgICBpbnQgc3RhcnQgPSBpbnB1dC5tYXJrKCk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBzeW5wcmVkMjU0X0ludGVybmFsRGF0YURTTF9mcmFnbWVudCgpOyAvLyBjYW4gbmV2ZXIgdGhyb3cgZXhjZXB0aW9uCiAgICAgICAgIH0gY2F0Y2ggKFJlY29nbml0aW9uRXhjZXB0aW9uIHJlKSB7CiAgICAgICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oImltcG9zc2libGU6ICIrcmUpOwogICAgICAgICB9CkBAIC04NTgxOSwxMSArOTEwNzYsMTEgQEAKICAgICAgICAgc3RhdGUuZmFpbGVkPWZhbHNlOwogICAgICAgICByZXR1cm4gc3VjY2VzczsKICAgICB9Ci0gICAgcHVibGljIGZpbmFsIGJvb2xlYW4gc3lucHJlZDIzOV9JbnRlcm5hbERhdGFEU0woKSB7CisgICAgcHVibGljIGZpbmFsIGJvb2xlYW4gc3lucHJlZDgwX0ludGVybmFsRGF0YURTTCgpIHsKICAgICAgICAgc3RhdGUuYmFja3RyYWNraW5nKys7CiAgICAgICAgIGludCBzdGFydCA9IGlucHV0Lm1hcmsoKTsKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHN5bnByZWQyMzlfSW50ZXJuYWxEYXRhRFNMX2ZyYWdtZW50KCk7IC8vIGNhbiBuZXZlciB0aHJvdyBleGNlcHRpb24KKyAgICAgICAgICAgIHN5bnByZWQ4MF9JbnRlcm5hbERhdGFEU0xfZnJhZ21lbnQoKTsgLy8gY2FuIG5ldmVyIHRocm93IGV4Y2VwdGlvbgogICAgICAgICB9IGNhdGNoIChSZWNvZ25pdGlvbkV4Y2VwdGlvbiByZSkgewogICAgICAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKCJpbXBvc3NpYmxlOiAiK3JlKTsKICAgICAgICAgfQpAQCAtODU4MzMsMTEgKzkxMDkwLDExIEBACiAgICAgICAgIHN0YXRlLmZhaWxlZD1mYWxzZTsKICAgICAgICAgcmV0dXJuIHN1Y2Nlc3M7CiAgICAgfQotICAgIHB1YmxpYyBmaW5hbCBib29sZWFuIHN5bnByZWQxNTlfSW50ZXJuYWxEYXRhRFNMKCkgeworICAgIHB1YmxpYyBmaW5hbCBib29sZWFuIHN5bnByZWQxNzdfSW50ZXJuYWxEYXRhRFNMKCkgewogICAgICAgICBzdGF0ZS5iYWNrdHJhY2tpbmcrKzsKICAgICAgICAgaW50IHN0YXJ0ID0gaW5wdXQubWFyaygpOwogICAgICAgICB0cnkgewotICAgICAgICAgICAgc3lucHJlZDE1OV9JbnRlcm5hbERhdGFEU0xfZnJhZ21lbnQoKTsgLy8gY2FuIG5ldmVyIHRocm93IGV4Y2VwdGlvbgorICAgICAgICAgICAgc3lucHJlZDE3N19JbnRlcm5hbERhdGFEU0xfZnJhZ21lbnQoKTsgLy8gY2FuIG5ldmVyIHRocm93IGV4Y2VwdGlvbgogICAgICAgICB9IGNhdGNoIChSZWNvZ25pdGlvbkV4Y2VwdGlvbiByZSkgewogICAgICAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKCJpbXBvc3NpYmxlOiAiK3JlKTsKICAgICAgICAgfQpAQCAtODU4NDcsMTEgKzkxMTA0LDI1IEBACiAgICAgICAgIHN0YXRlLmZhaWxlZD1mYWxzZTsKICAgICAgICAgcmV0dXJuIHN1Y2Nlc3M7CiAgICAgfQotICAgIHB1YmxpYyBmaW5hbCBib29sZWFuIHN5bnByZWQxNTZfSW50ZXJuYWxEYXRhRFNMKCkgeworICAgIHB1YmxpYyBmaW5hbCBib29sZWFuIHN5bnByZWQ4Nl9JbnRlcm5hbERhdGFEU0woKSB7CiAgICAgICAgIHN0YXRlLmJhY2t0cmFja2luZysrOwogICAgICAgICBpbnQgc3RhcnQgPSBpbnB1dC5tYXJrKCk7CiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBzeW5wcmVkMTU2X0ludGVybmFsRGF0YURTTF9mcmFnbWVudCgpOyAvLyBjYW4gbmV2ZXIgdGhyb3cgZXhjZXB0aW9uCisgICAgICAgICAgICBzeW5wcmVkODZfSW50ZXJuYWxEYXRhRFNMX2ZyYWdtZW50KCk7IC8vIGNhbiBuZXZlciB0aHJvdyBleGNlcHRpb24KKyAgICAgICAgfSBjYXRjaCAoUmVjb2duaXRpb25FeGNlcHRpb24gcmUpIHsKKyAgICAgICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbigiaW1wb3NzaWJsZTogIityZSk7CisgICAgICAgIH0KKyAgICAgICAgYm9vbGVhbiBzdWNjZXNzID0gIXN0YXRlLmZhaWxlZDsKKyAgICAgICAgaW5wdXQucmV3aW5kKHN0YXJ0KTsKKyAgICAgICAgc3RhdGUuYmFja3RyYWNraW5nLS07CisgICAgICAgIHN0YXRlLmZhaWxlZD1mYWxzZTsKKyAgICAgICAgcmV0dXJuIHN1Y2Nlc3M7CisgICAgfQorICAgIHB1YmxpYyBmaW5hbCBib29sZWFuIHN5bnByZWQxNzRfSW50ZXJuYWxEYXRhRFNMKCkgeworICAgICAgICBzdGF0ZS5iYWNrdHJhY2tpbmcrKzsKKyAgICAgICAgaW50IHN0YXJ0ID0gaW5wdXQubWFyaygpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgc3lucHJlZDE3NF9JbnRlcm5hbERhdGFEU0xfZnJhZ21lbnQoKTsgLy8gY2FuIG5ldmVyIHRocm93IGV4Y2VwdGlvbgogICAgICAgICB9IGNhdGNoIChSZWNvZ25pdGlvbkV4Y2VwdGlvbiByZSkgewogICAgICAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKCJpbXBvc3NpYmxlOiAiK3JlKTsKICAgICAgICAgfQpAQCAtODU4NzUsNDggKzkxMTQ2LDYgQEAKICAgICAgICAgc3RhdGUuZmFpbGVkPWZhbHNlOwogICAgICAgICByZXR1cm4gc3VjY2VzczsKICAgICB9Ci0gICAgcHVibGljIGZpbmFsIGJvb2xlYW4gc3lucHJlZDc0X0ludGVybmFsRGF0YURTTCgpIHsKLSAgICAgICAgc3RhdGUuYmFja3RyYWNraW5nKys7Ci0gICAgICAgIGludCBzdGFydCA9IGlucHV0Lm1hcmsoKTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHN5bnByZWQ3NF9JbnRlcm5hbERhdGFEU0xfZnJhZ21lbnQoKTsgLy8gY2FuIG5ldmVyIHRocm93IGV4Y2VwdGlvbgotICAgICAgICB9IGNhdGNoIChSZWNvZ25pdGlvbkV4Y2VwdGlvbiByZSkgewotICAgICAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKCJpbXBvc3NpYmxlOiAiK3JlKTsKLSAgICAgICAgfQotICAgICAgICBib29sZWFuIHN1Y2Nlc3MgPSAhc3RhdGUuZmFpbGVkOwotICAgICAgICBpbnB1dC5yZXdpbmQoc3RhcnQpOwotICAgICAgICBzdGF0ZS5iYWNrdHJhY2tpbmctLTsKLSAgICAgICAgc3RhdGUuZmFpbGVkPWZhbHNlOwotICAgICAgICByZXR1cm4gc3VjY2VzczsKLSAgICB9Ci0gICAgcHVibGljIGZpbmFsIGJvb2xlYW4gc3lucHJlZDE2Ml9JbnRlcm5hbERhdGFEU0woKSB7Ci0gICAgICAgIHN0YXRlLmJhY2t0cmFja2luZysrOwotICAgICAgICBpbnQgc3RhcnQgPSBpbnB1dC5tYXJrKCk7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBzeW5wcmVkMTYyX0ludGVybmFsRGF0YURTTF9mcmFnbWVudCgpOyAvLyBjYW4gbmV2ZXIgdGhyb3cgZXhjZXB0aW9uCi0gICAgICAgIH0gY2F0Y2ggKFJlY29nbml0aW9uRXhjZXB0aW9uIHJlKSB7Ci0gICAgICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oImltcG9zc2libGU6ICIrcmUpOwotICAgICAgICB9Ci0gICAgICAgIGJvb2xlYW4gc3VjY2VzcyA9ICFzdGF0ZS5mYWlsZWQ7Ci0gICAgICAgIGlucHV0LnJld2luZChzdGFydCk7Ci0gICAgICAgIHN0YXRlLmJhY2t0cmFja2luZy0tOwotICAgICAgICBzdGF0ZS5mYWlsZWQ9ZmFsc2U7Ci0gICAgICAgIHJldHVybiBzdWNjZXNzOwotICAgIH0KLSAgICBwdWJsaWMgZmluYWwgYm9vbGVhbiBzeW5wcmVkMjI0X0ludGVybmFsRGF0YURTTCgpIHsKLSAgICAgICAgc3RhdGUuYmFja3RyYWNraW5nKys7Ci0gICAgICAgIGludCBzdGFydCA9IGlucHV0Lm1hcmsoKTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHN5bnByZWQyMjRfSW50ZXJuYWxEYXRhRFNMX2ZyYWdtZW50KCk7IC8vIGNhbiBuZXZlciB0aHJvdyBleGNlcHRpb24KLSAgICAgICAgfSBjYXRjaCAoUmVjb2duaXRpb25FeGNlcHRpb24gcmUpIHsKLSAgICAgICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbigiaW1wb3NzaWJsZTogIityZSk7Ci0gICAgICAgIH0KLSAgICAgICAgYm9vbGVhbiBzdWNjZXNzID0gIXN0YXRlLmZhaWxlZDsKLSAgICAgICAgaW5wdXQucmV3aW5kKHN0YXJ0KTsKLSAgICAgICAgc3RhdGUuYmFja3RyYWNraW5nLS07Ci0gICAgICAgIHN0YXRlLmZhaWxlZD1mYWxzZTsKLSAgICAgICAgcmV0dXJuIHN1Y2Nlc3M7Ci0gICAgfQogICAgIHB1YmxpYyBmaW5hbCBib29sZWFuIHN5bnByZWQyMjdfSW50ZXJuYWxEYXRhRFNMKCkgewogICAgICAgICBzdGF0ZS5iYWNrdHJhY2tpbmcrKzsKICAgICAgICAgaW50IHN0YXJ0ID0gaW5wdXQubWFyaygpOwpAQCAtODU5MzMsNDUgKzkxMTYyLDQ1IEBACiAgICAgfQogCiAKLSAgICBwcm90ZWN0ZWQgREZBNiBkZmE2ID0gbmV3IERGQTYodGhpcyk7Ci0gICAgcHJvdGVjdGVkIERGQTggZGZhOCA9IG5ldyBERkE4KHRoaXMpOworICAgIHByb3RlY3RlZCBERkE3IGRmYTcgPSBuZXcgREZBNyh0aGlzKTsKICAgICBwcm90ZWN0ZWQgREZBOSBkZmE5ID0gbmV3IERGQTkodGhpcyk7CiAgICAgcHJvdGVjdGVkIERGQTEwIGRmYTEwID0gbmV3IERGQTEwKHRoaXMpOwotICAgIHByb3RlY3RlZCBERkExNyBkZmExNyA9IG5ldyBERkExNyh0aGlzKTsKLSAgICBwcm90ZWN0ZWQgREZBMjUgZGZhMjUgPSBuZXcgREZBMjUodGhpcyk7Ci0gICAgcHJvdGVjdGVkIERGQTI4IGRmYTI4ID0gbmV3IERGQTI4KHRoaXMpOworICAgIHByb3RlY3RlZCBERkExMSBkZmExMSA9IG5ldyBERkExMSh0aGlzKTsKKyAgICBwcm90ZWN0ZWQgREZBMTggZGZhMTggPSBuZXcgREZBMTgodGhpcyk7CisgICAgcHJvdGVjdGVkIERGQTI2IGRmYTI2ID0gbmV3IERGQTI2KHRoaXMpOwogICAgIHByb3RlY3RlZCBERkEyOSBkZmEyOSA9IG5ldyBERkEyOSh0aGlzKTsKLSAgICBwcm90ZWN0ZWQgREZBMzIgZGZhMzIgPSBuZXcgREZBMzIodGhpcyk7Ci0gICAgcHJvdGVjdGVkIERGQTM3IGRmYTM3ID0gbmV3IERGQTM3KHRoaXMpOwotICAgIHByb3RlY3RlZCBERkE0MCBkZmE0MCA9IG5ldyBERkE0MCh0aGlzKTsKLSAgICBwcm90ZWN0ZWQgREZBOTUgZGZhOTUgPSBuZXcgREZBOTUodGhpcyk7Ci0gICAgcHJvdGVjdGVkIERGQTEwMSBkZmExMDEgPSBuZXcgREZBMTAxKHRoaXMpOworICAgIHByb3RlY3RlZCBERkEzMCBkZmEzMCA9IG5ldyBERkEzMCh0aGlzKTsKKyAgICBwcm90ZWN0ZWQgREZBMzMgZGZhMzMgPSBuZXcgREZBMzModGhpcyk7CisgICAgcHJvdGVjdGVkIERGQTM4IGRmYTM4ID0gbmV3IERGQTM4KHRoaXMpOworICAgIHByb3RlY3RlZCBERkE0MSBkZmE0MSA9IG5ldyBERkE0MSh0aGlzKTsKICAgICBwcm90ZWN0ZWQgREZBMTA4IGRmYTEwOCA9IG5ldyBERkExMDgodGhpcyk7Ci0gICAgcHJvdGVjdGVkIERGQTEwOSBkZmExMDkgPSBuZXcgREZBMTA5KHRoaXMpOwotICAgIHByb3RlY3RlZCBERkExMTcgZGZhMTE3ID0gbmV3IERGQTExNyh0aGlzKTsKLSAgICBwcm90ZWN0ZWQgREZBMTI3IGRmYTEyNyA9IG5ldyBERkExMjcodGhpcyk7CisgICAgcHJvdGVjdGVkIERGQTExNCBkZmExMTQgPSBuZXcgREZBMTE0KHRoaXMpOworICAgIHByb3RlY3RlZCBERkExMjEgZGZhMTIxID0gbmV3IERGQTEyMSh0aGlzKTsKKyAgICBwcm90ZWN0ZWQgREZBMTIyIGRmYTEyMiA9IG5ldyBERkExMjIodGhpcyk7CisgICAgcHJvdGVjdGVkIERGQTEzMCBkZmExMzAgPSBuZXcgREZBMTMwKHRoaXMpOwogICAgIHByb3RlY3RlZCBERkExNDAgZGZhMTQwID0gbmV3IERGQTE0MCh0aGlzKTsKLSAgICBwcm90ZWN0ZWQgREZBMTQxIGRmYTE0MSA9IG5ldyBERkExNDEodGhpcyk7Ci0gICAgcHJvdGVjdGVkIERGQTE0NSBkZmExNDUgPSBuZXcgREZBMTQ1KHRoaXMpOwotICAgIHByb3RlY3RlZCBERkExNDYgZGZhMTQ2ID0gbmV3IERGQTE0Nih0aGlzKTsKLSAgICBwcm90ZWN0ZWQgREZBMTQ3IGRmYTE0NyA9IG5ldyBERkExNDcodGhpcyk7Ci0gICAgcHJvdGVjdGVkIERGQTE1MiBkZmExNTIgPSBuZXcgREZBMTUyKHRoaXMpOwotICAgIHByb3RlY3RlZCBERkExNjEgZGZhMTYxID0gbmV3IERGQTE2MSh0aGlzKTsKLSAgICBwcm90ZWN0ZWQgREZBMTY0IGRmYTE2NCA9IG5ldyBERkExNjQodGhpcyk7CisgICAgcHJvdGVjdGVkIERGQTE1MyBkZmExNTMgPSBuZXcgREZBMTUzKHRoaXMpOworICAgIHByb3RlY3RlZCBERkExNTQgZGZhMTU0ID0gbmV3IERGQTE1NCh0aGlzKTsKKyAgICBwcm90ZWN0ZWQgREZBMTU4IGRmYTE1OCA9IG5ldyBERkExNTgodGhpcyk7CisgICAgcHJvdGVjdGVkIERGQTE1OSBkZmExNTkgPSBuZXcgREZBMTU5KHRoaXMpOworICAgIHByb3RlY3RlZCBERkExNjAgZGZhMTYwID0gbmV3IERGQTE2MCh0aGlzKTsKKyAgICBwcm90ZWN0ZWQgREZBMTY1IGRmYTE2NSA9IG5ldyBERkExNjUodGhpcyk7CisgICAgcHJvdGVjdGVkIERGQTE3NCBkZmExNzQgPSBuZXcgREZBMTc0KHRoaXMpOworICAgIHByb3RlY3RlZCBERkExNzcgZGZhMTc3ID0gbmV3IERGQTE3Nyh0aGlzKTsKICAgICBzdGF0aWMgZmluYWwgU3RyaW5nIGRmYV8xcyA9ICJcMTBcdWZmZmYiOwogICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgZGZhXzJzID0gIlwyXHVmZmZmXDFcNVwzXHVmZmZmXDFcNVwxXHVmZmZmIjsKICAgICBzdGF0aWMgZmluYWwgU3RyaW5nIGRmYV8zcyA9ICJcMVw1XDFcdWZmZmZcMVw1M1wxXHVmZmZmXDFcNVwxXHVmZmZmXDFcNTNcMVx1ZmZmZiI7Ci0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBkZmFfNHMgPSAiXDFcdTAwOTVcMVx1ZmZmZlwxXDE1N1wxXHVmZmZmXDFcNDRcMVx1ZmZmZlwxXDE1N1wxXHVmZmZmIjsKKyAgICBzdGF0aWMgZmluYWwgU3RyaW5nIGRmYV80cyA9ICJcMVx1MDBhMVwxXHVmZmZmXDFcMTcxXDFcdWZmZmZcMVw0NFwxXHVmZmZmXDFcMTcxXDFcdWZmZmYiOwogICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgZGZhXzVzID0gIlwxXHVmZmZmXDFcMVwxXHVmZmZmXDFcNFwxXHVmZmZmXDFcMlwxXHVmZmZmXDFcMyI7CiAgICAgc3RhdGljIGZpbmFsIFN0cmluZyBkZmFfNnMgPSAiXDEwXHVmZmZmfT4iOwogICAgIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBkZmFfN3MgPSB7Ci0gICAgICAgICAgICAiXDFcMlw1MFx1ZmZmZlwxXDFcMTQ2XHVmZmZmXDFcMyIsCisgICAgICAgICAgICAiXDFcMlw1MFx1ZmZmZlwxXDFcMTYyXHVmZmZmXDFcMyIsCiAgICAgICAgICAgICAiIiwKLSAgICAgICAgICAgICJcMVw0XDNcdWZmZmZcMVw1XDI0XHVmZmZmXDFcNVw1Mlx1ZmZmZlwxXDUiLAorICAgICAgICAgICAgIlwxXDRcM1x1ZmZmZlwxXDVcMzFcdWZmZmZcMVw1XDU3XHVmZmZmXDFcNSIsCiAgICAgICAgICAgICAiIiwKICAgICAgICAgICAgICJcMVw2XDM2XHVmZmZmXDFcNyIsCiAgICAgICAgICAgICAiIiwKLSAgICAgICAgICAgICJcMVw0XDNcdWZmZmZcMVw1XDI0XHVmZmZmXDFcNVw1Mlx1ZmZmZlwxXDUiLAorICAgICAgICAgICAgIlwxXDRcM1x1ZmZmZlwxXDVcMzFcdWZmZmZcMVw1XDU3XHVmZmZmXDFcNSIsCiAgICAgICAgICAgICAiIgogICAgIH07CiAKQEAgLTg1OTgzLDExICs5MTIxMiwxMSBAQAogICAgIHN0YXRpYyBmaW5hbCBzaG9ydFtdIGRmYV82ID0gREZBLnVucGFja0VuY29kZWRTdHJpbmcoZGZhXzZzKTsKICAgICBzdGF0aWMgZmluYWwgc2hvcnRbXVtdIGRmYV83ID0gdW5wYWNrRW5jb2RlZFN0cmluZ0FycmF5KGRmYV83cyk7CiAKLSAgICBjbGFzcyBERkE2IGV4dGVuZHMgREZBIHsKKyAgICBjbGFzcyBERkE3IGV4dGVuZHMgREZBIHsKIAotICAgICAgICBwdWJsaWMgREZBNihCYXNlUmVjb2duaXplciByZWNvZ25pemVyKSB7CisgICAgICAgIHB1YmxpYyBERkE3KEJhc2VSZWNvZ25pemVyIHJlY29nbml6ZXIpIHsKICAgICAgICAgICAgIHRoaXMucmVjb2duaXplciA9IHJlY29nbml6ZXI7Ci0gICAgICAgICAgICB0aGlzLmRlY2lzaW9uTnVtYmVyID0gNjsKKyAgICAgICAgICAgIHRoaXMuZGVjaXNpb25OdW1iZXIgPSA3OwogICAgICAgICAgICAgdGhpcy5lb3QgPSBkZmFfMTsKICAgICAgICAgICAgIHRoaXMuZW9mID0gZGZhXzI7CiAgICAgICAgICAgICB0aGlzLm1pbiA9IGRmYV8zOwpAQCAtODU5OTcsMTYgKzkxMjI2LDE2IEBACiAgICAgICAgICAgICB0aGlzLnRyYW5zaXRpb24gPSBkZmFfNzsKICAgICAgICAgfQogICAgICAgICBwdWJsaWMgU3RyaW5nIGdldERlc2NyaXB0aW9uKCkgewotICAgICAgICAgICAgcmV0dXJuICIyNzk2OjE6IHJ1bGVfX1hJbXBvcnREZWNsYXJhdGlvbl9fQWx0ZXJuYXRpdmVzXzIgOiAoICggKCBydWxlX19YSW1wb3J0RGVjbGFyYXRpb25fX0dyb3VwXzJfMF9fMCApICkgfCAoICggcnVsZV9fWEltcG9ydERlY2xhcmF0aW9uX19JbXBvcnRlZFR5cGVBc3NpZ25tZW50XzJfMSApICkgfCAoICggcnVsZV9fWEltcG9ydERlY2xhcmF0aW9uX19JbXBvcnRlZE5hbWVzcGFjZUFzc2lnbm1lbnRfMl8yICkgKSB8ICggKCBydWxlX19YSW1wb3J0RGVjbGFyYXRpb25fX0dyb3VwXzJfM19fMCApICkgKTsiOworICAgICAgICAgICAgcmV0dXJuICIyOTQ5OjE6IHJ1bGVfX1hJbXBvcnREZWNsYXJhdGlvbl9fQWx0ZXJuYXRpdmVzXzIgOiAoICggKCBydWxlX19YSW1wb3J0RGVjbGFyYXRpb25fX0dyb3VwXzJfMF9fMCApICkgfCAoICggcnVsZV9fWEltcG9ydERlY2xhcmF0aW9uX19JbXBvcnRlZFR5cGVBc3NpZ25tZW50XzJfMSApICkgfCAoICggcnVsZV9fWEltcG9ydERlY2xhcmF0aW9uX19JbXBvcnRlZE5hbWVzcGFjZUFzc2lnbm1lbnRfMl8yICkgKSB8ICggKCBydWxlX19YSW1wb3J0RGVjbGFyYXRpb25fX0dyb3VwXzJfM19fMCApICkgKTsiOwogICAgICAgICB9CiAgICAgfQogICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgZGZhXzhzID0gIlw0M1x1ZmZmZiI7CiAgICAgc3RhdGljIGZpbmFsIFN0cmluZyBkZmFfOXMgPSAiXDFcNFwxXDBcNDFcdWZmZmYiOwotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgZGZhXzEwcyA9ICJcMVx1MDA5YVwxXDBcNDFcdWZmZmYiOworICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgZGZhXzEwcyA9ICJcMVx1MDBhNlwxXDBcNDFcdWZmZmYiOwogICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgZGZhXzExcyA9ICJcMlx1ZmZmZlwxXDJcMzdcdWZmZmZcMVwxIjsKICAgICBzdGF0aWMgZmluYWwgU3RyaW5nIGRmYV8xMnMgPSAiXDFcdWZmZmZcMVwwXDQxXHVmZmZmfT4iOwogICAgIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBkZmFfMTNzID0gewotICAgICAgICAgICAgIlwxXDJcMVwxXDNcMlwyMlx1ZmZmZlwxXDJcNlx1ZmZmZlwyXDJcNFx1ZmZmZlwxXDJcNFx1ZmZmZlw2XDJcMjNcdWZmZmZcMVwyXDMwXHVmZmZmXDFcMlwyMFx1ZmZmZlwyXDJcM1x1ZmZmZlwyXDJcMVx1ZmZmZlwxXDJcMVx1ZmZmZlwxXDJcM1x1ZmZmZlwxMFwyXDFcdWZmZmZcMVwyXDIyXHVmZmZmXDFcMiIsCisgICAgICAgICAgICAiXDFcMlwxXDFcM1wyXDIyXHVmZmZmXDFcMlw2XHVmZmZmXDJcMlw0XHVmZmZmXDFcMlw0XHVmZmZmXDZcMlwzMFx1ZmZmZlwxXDJcMzJcdWZmZmZcMVwyXDIzXHVmZmZmXDJcMlwzXHVmZmZmXDJcMlwxXHVmZmZmXDFcMlwxXHVmZmZmXDFcMlwzXHVmZmZmXDEwXDJcMVx1ZmZmZlwxXDJcMjRcdWZmZmZcMVwyIiwKICAgICAgICAgICAgICJcMVx1ZmZmZiIsCiAgICAgICAgICAgICAiIiwKICAgICAgICAgICAgICIiLApAQCAtODYwNTAsMTEgKzkxMjc5LDExIEBACiAgICAgc3RhdGljIGZpbmFsIHNob3J0W10gZGZhXzEyID0gREZBLnVucGFja0VuY29kZWRTdHJpbmcoZGZhXzEycyk7CiAgICAgc3RhdGljIGZpbmFsIHNob3J0W11bXSBkZmFfMTMgPSB1bnBhY2tFbmNvZGVkU3RyaW5nQXJyYXkoZGZhXzEzcyk7CiAKLSAgICBjbGFzcyBERkE4IGV4dGVuZHMgREZBIHsKKyAgICBjbGFzcyBERkE5IGV4dGVuZHMgREZBIHsKIAotICAgICAgICBwdWJsaWMgREZBOChCYXNlUmVjb2duaXplciByZWNvZ25pemVyKSB7CisgICAgICAgIHB1YmxpYyBERkE5KEJhc2VSZWNvZ25pemVyIHJlY29nbml6ZXIpIHsKICAgICAgICAgICAgIHRoaXMucmVjb2duaXplciA9IHJlY29nbml6ZXI7Ci0gICAgICAgICAgICB0aGlzLmRlY2lzaW9uTnVtYmVyID0gODsKKyAgICAgICAgICAgIHRoaXMuZGVjaXNpb25OdW1iZXIgPSA5OwogICAgICAgICAgICAgdGhpcy5lb3QgPSBkZmFfODsKICAgICAgICAgICAgIHRoaXMuZW9mID0gZGZhXzg7CiAgICAgICAgICAgICB0aGlzLm1pbiA9IGRmYV85OwpAQCAtODYwNjQsMzcgKzkxMjkzLDM3IEBACiAgICAgICAgICAgICB0aGlzLnRyYW5zaXRpb24gPSBkZmFfMTM7CiAgICAgICAgIH0KICAgICAgICAgcHVibGljIFN0cmluZyBnZXREZXNjcmlwdGlvbigpIHsKLSAgICAgICAgICAgIHJldHVybiAiMjg1MDoxOiBydWxlX19YQW5ub3RhdGlvbl9fQWx0ZXJuYXRpdmVzXzNfMSA6ICggKCAoIHJ1bGVfX1hBbm5vdGF0aW9uX19Hcm91cF8zXzFfMF9fMCApICkgfCAoICggcnVsZV9fWEFubm90YXRpb25fX1ZhbHVlQXNzaWdubWVudF8zXzFfMSApICkgKTsiOworICAgICAgICAgICAgcmV0dXJuICIzMDAzOjE6IHJ1bGVfX1hBbm5vdGF0aW9uX19BbHRlcm5hdGl2ZXNfM18xIDogKCAoICggcnVsZV9fWEFubm90YXRpb25fX0dyb3VwXzNfMV8wX18wICkgKSB8ICggKCBydWxlX19YQW5ub3RhdGlvbl9fVmFsdWVBc3NpZ25tZW50XzNfMV8xICkgKSApOyI7CiAgICAgICAgIH0KICAgICAgICAgcHVibGljIGludCBzcGVjaWFsU3RhdGVUcmFuc2l0aW9uKGludCBzLCBJbnRTdHJlYW0gX2lucHV0KSB0aHJvd3MgTm9WaWFibGVBbHRFeGNlcHRpb24gewogICAgICAgICAgICAgVG9rZW5TdHJlYW0gaW5wdXQgPSAoVG9rZW5TdHJlYW0pX2lucHV0OwogICAgICAgICAJaW50IF9zID0gczsKICAgICAgICAgICAgIHN3aXRjaCAoIHMgKSB7CiAgICAgICAgICAgICAgICAgICAgIGNhc2UgMCA6IAotICAgICAgICAgICAgICAgICAgICAgICAgaW50IExBOF8xID0gaW5wdXQuTEEoMSk7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgTEE5XzEgPSBpbnB1dC5MQSgxKTsKIAogICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgaW50IGluZGV4OF8xID0gaW5wdXQuaW5kZXgoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbmRleDlfMSA9IGlucHV0LmluZGV4KCk7CiAgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dC5yZXdpbmQoKTsKICAgICAgICAgICAgICAgICAgICAgICAgIHMgPSAtMTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICggKHN5bnByZWQxMV9JbnRlcm5hbERhdGFEU0woKSkgKSB7cyA9IDM0O30KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICggKHN5bnByZWQxMl9JbnRlcm5hbERhdGFEU0woKSkgKSB7cyA9IDM0O30KIAogICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoICh0cnVlKSApIHtzID0gMjt9CiAKICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0LnNlZWsoaW5kZXg4XzEpOworICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXQuc2VlayhpbmRleDlfMSk7CiAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIHM+PTAgKSByZXR1cm4gczsKICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgaWYgKHN0YXRlLmJhY2t0cmFja2luZz4wKSB7c3RhdGUuZmFpbGVkPXRydWU7IHJldHVybiAtMTt9CiAgICAgICAgICAgICBOb1ZpYWJsZUFsdEV4Y2VwdGlvbiBudmFlID0KLSAgICAgICAgICAgICAgICBuZXcgTm9WaWFibGVBbHRFeGNlcHRpb24oZ2V0RGVzY3JpcHRpb24oKSwgOCwgX3MsIGlucHV0KTsKKyAgICAgICAgICAgICAgICBuZXcgTm9WaWFibGVBbHRFeGNlcHRpb24oZ2V0RGVzY3JpcHRpb24oKSwgOSwgX3MsIGlucHV0KTsKICAgICAgICAgICAgIGVycm9yKG52YWUpOwogICAgICAgICAgICAgdGhyb3cgbnZhZTsKICAgICAgICAgfQogICAgIH0KICAgICBzdGF0aWMgZmluYWwgU3RyaW5nW10gZGZhXzE0cyA9IHsKLSAgICAgICAgICAgICJcNVwyXDIyXHVmZmZmXDFcMlw2XHVmZmZmXDJcMlw0XHVmZmZmXDFcMlw0XHVmZmZmXDZcMlwyM1x1ZmZmZlwxXDJcMzBcdWZmZmZcMVwyXDIwXHVmZmZmXDJcMlwzXHVmZmZmXDFcMVwxXDJcMVx1ZmZmZlwxXDJcMVx1ZmZmZlwxXDJcM1x1ZmZmZlwxMFwyXDFcdWZmZmZcMVwyXDIyXHVmZmZmXDFcMiIsCisgICAgICAgICAgICAiXDVcMlwyMlx1ZmZmZlwxXDJcNlx1ZmZmZlwyXDJcNFx1ZmZmZlwxXDJcNFx1ZmZmZlw2XDJcMzBcdWZmZmZcMVwyXDMyXHVmZmZmXDFcMlwyM1x1ZmZmZlwyXDJcM1x1ZmZmZlwxXDFcMVwyXDFcdWZmZmZcMVwyXDFcdWZmZmZcMVwyXDNcdWZmZmZcMTBcMlwxXHVmZmZmXDFcMlwyNFx1ZmZmZlwxXDIiLAogICAgICAgICAgICAgIlwxXHVmZmZmIiwKICAgICAgICAgICAgICIiLAogICAgICAgICAgICAgIiIsCkBAIC04NjEzMiw1MCArOTEzNjEsNiBAQAogICAgIH07CiAgICAgc3RhdGljIGZpbmFsIHNob3J0W11bXSBkZmFfMTQgPSB1bnBhY2tFbmNvZGVkU3RyaW5nQXJyYXkoZGZhXzE0cyk7CiAKLSAgICBjbGFzcyBERkE5IGV4dGVuZHMgREZBIHsKLQotICAgICAgICBwdWJsaWMgREZBOShCYXNlUmVjb2duaXplciByZWNvZ25pemVyKSB7Ci0gICAgICAgICAgICB0aGlzLnJlY29nbml6ZXIgPSByZWNvZ25pemVyOwotICAgICAgICAgICAgdGhpcy5kZWNpc2lvbk51bWJlciA9IDk7Ci0gICAgICAgICAgICB0aGlzLmVvdCA9IGRmYV84OwotICAgICAgICAgICAgdGhpcy5lb2YgPSBkZmFfODsKLSAgICAgICAgICAgIHRoaXMubWluID0gZGZhXzk7Ci0gICAgICAgICAgICB0aGlzLm1heCA9IGRmYV8xMDsKLSAgICAgICAgICAgIHRoaXMuYWNjZXB0ID0gZGZhXzExOwotICAgICAgICAgICAgdGhpcy5zcGVjaWFsID0gZGZhXzEyOwotICAgICAgICAgICAgdGhpcy50cmFuc2l0aW9uID0gZGZhXzE0OwotICAgICAgICB9Ci0gICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0RGVzY3JpcHRpb24oKSB7Ci0gICAgICAgICAgICByZXR1cm4gIjI4NzE6MTogcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdF9fQWx0ZXJuYXRpdmVzIDogKCAoICggcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdF9fR3JvdXBfMF9fMCApICkgfCAoICggcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdF9fR3JvdXBfMV9fMCApICkgKTsiOwotICAgICAgICB9Ci0gICAgICAgIHB1YmxpYyBpbnQgc3BlY2lhbFN0YXRlVHJhbnNpdGlvbihpbnQgcywgSW50U3RyZWFtIF9pbnB1dCkgdGhyb3dzIE5vVmlhYmxlQWx0RXhjZXB0aW9uIHsKLSAgICAgICAgICAgIFRva2VuU3RyZWFtIGlucHV0ID0gKFRva2VuU3RyZWFtKV9pbnB1dDsKLSAgICAgICAgCWludCBfcyA9IHM7Ci0gICAgICAgICAgICBzd2l0Y2ggKCBzICkgewotICAgICAgICAgICAgICAgICAgICBjYXNlIDAgOiAKLSAgICAgICAgICAgICAgICAgICAgICAgIGludCBMQTlfMSA9IGlucHV0LkxBKDEpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW5kZXg5XzEgPSBpbnB1dC5pbmRleCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXQucmV3aW5kKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzID0gLTE7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIChzeW5wcmVkMTJfSW50ZXJuYWxEYXRhRFNMKCkpICkge3MgPSAzNDt9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKCAodHJ1ZSkgKSB7cyA9IDI7fQotCi0gICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICBpbnB1dC5zZWVrKGluZGV4OV8xKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICggcz49MCApIHJldHVybiBzOwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoc3RhdGUuYmFja3RyYWNraW5nPjApIHtzdGF0ZS5mYWlsZWQ9dHJ1ZTsgcmV0dXJuIC0xO30KLSAgICAgICAgICAgIE5vVmlhYmxlQWx0RXhjZXB0aW9uIG52YWUgPQotICAgICAgICAgICAgICAgIG5ldyBOb1ZpYWJsZUFsdEV4Y2VwdGlvbihnZXREZXNjcmlwdGlvbigpLCA5LCBfcywgaW5wdXQpOwotICAgICAgICAgICAgZXJyb3IobnZhZSk7Ci0gICAgICAgICAgICB0aHJvdyBudmFlOwotICAgICAgICB9Ci0gICAgfQotCiAgICAgY2xhc3MgREZBMTAgZXh0ZW5kcyBERkEgewogCiAgICAgICAgIHB1YmxpYyBERkExMChCYXNlUmVjb2duaXplciByZWNvZ25pemVyKSB7CkBAIC04NjE5MCw3ICs5MTM3NSw3IEBACiAgICAgICAgICAgICB0aGlzLnRyYW5zaXRpb24gPSBkZmFfMTQ7CiAgICAgICAgIH0KICAgICAgICAgcHVibGljIFN0cmluZyBnZXREZXNjcmlwdGlvbigpIHsKLSAgICAgICAgICAgIHJldHVybiAiMjg5MjoxOiBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZV9fQWx0ZXJuYXRpdmVzIDogKCAoICggcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVfX0dyb3VwXzBfXzAgKSApIHwgKCBydWxlWEFubm90YXRpb25PckV4cHJlc3Npb24gKSApOyI7CisgICAgICAgICAgICByZXR1cm4gIjMwMjQ6MTogcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdF9fQWx0ZXJuYXRpdmVzIDogKCAoICggcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdF9fR3JvdXBfMF9fMCApICkgfCAoICggcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdF9fR3JvdXBfMV9fMCApICkgKTsiOwogICAgICAgICB9CiAgICAgICAgIHB1YmxpYyBpbnQgc3BlY2lhbFN0YXRlVHJhbnNpdGlvbihpbnQgcywgSW50U3RyZWFtIF9pbnB1dCkgdGhyb3dzIE5vVmlhYmxlQWx0RXhjZXB0aW9uIHsKICAgICAgICAgICAgIFRva2VuU3RyZWFtIGlucHV0ID0gKFRva2VuU3RyZWFtKV9pbnB1dDsKQEAgLTg2MjE5LDYgKzkxNDA0LDUwIEBACiAgICAgICAgICAgICB0aHJvdyBudmFlOwogICAgICAgICB9CiAgICAgfQorCisgICAgY2xhc3MgREZBMTEgZXh0ZW5kcyBERkEgeworCisgICAgICAgIHB1YmxpYyBERkExMShCYXNlUmVjb2duaXplciByZWNvZ25pemVyKSB7CisgICAgICAgICAgICB0aGlzLnJlY29nbml6ZXIgPSByZWNvZ25pemVyOworICAgICAgICAgICAgdGhpcy5kZWNpc2lvbk51bWJlciA9IDExOworICAgICAgICAgICAgdGhpcy5lb3QgPSBkZmFfODsKKyAgICAgICAgICAgIHRoaXMuZW9mID0gZGZhXzg7CisgICAgICAgICAgICB0aGlzLm1pbiA9IGRmYV85OworICAgICAgICAgICAgdGhpcy5tYXggPSBkZmFfMTA7CisgICAgICAgICAgICB0aGlzLmFjY2VwdCA9IGRmYV8xMTsKKyAgICAgICAgICAgIHRoaXMuc3BlY2lhbCA9IGRmYV8xMjsKKyAgICAgICAgICAgIHRoaXMudHJhbnNpdGlvbiA9IGRmYV8xNDsKKyAgICAgICAgfQorICAgICAgICBwdWJsaWMgU3RyaW5nIGdldERlc2NyaXB0aW9uKCkgeworICAgICAgICAgICAgcmV0dXJuICIzMDQ1OjE6IHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlX19BbHRlcm5hdGl2ZXMgOiAoICggKCBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZV9fR3JvdXBfMF9fMCApICkgfCAoIHJ1bGVYQW5ub3RhdGlvbk9yRXhwcmVzc2lvbiApICk7IjsKKyAgICAgICAgfQorICAgICAgICBwdWJsaWMgaW50IHNwZWNpYWxTdGF0ZVRyYW5zaXRpb24oaW50IHMsIEludFN0cmVhbSBfaW5wdXQpIHRocm93cyBOb1ZpYWJsZUFsdEV4Y2VwdGlvbiB7CisgICAgICAgICAgICBUb2tlblN0cmVhbSBpbnB1dCA9IChUb2tlblN0cmVhbSlfaW5wdXQ7CisgICAgICAgIAlpbnQgX3MgPSBzOworICAgICAgICAgICAgc3dpdGNoICggcyApIHsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAwIDogCisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgTEExMV8xID0gaW5wdXQuTEEoMSk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbmRleDExXzEgPSBpbnB1dC5pbmRleCgpOworICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXQucmV3aW5kKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBzID0gLTE7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIChzeW5wcmVkMTRfSW50ZXJuYWxEYXRhRFNMKCkpICkge3MgPSAzNDt9CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKCAodHJ1ZSkgKSB7cyA9IDI7fQorCisgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dC5zZWVrKGluZGV4MTFfMSk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIHM+PTAgKSByZXR1cm4gczsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHN0YXRlLmJhY2t0cmFja2luZz4wKSB7c3RhdGUuZmFpbGVkPXRydWU7IHJldHVybiAtMTt9CisgICAgICAgICAgICBOb1ZpYWJsZUFsdEV4Y2VwdGlvbiBudmFlID0KKyAgICAgICAgICAgICAgICBuZXcgTm9WaWFibGVBbHRFeGNlcHRpb24oZ2V0RGVzY3JpcHRpb24oKSwgMTEsIF9zLCBpbnB1dCk7CisgICAgICAgICAgICBlcnJvcihudmFlKTsKKyAgICAgICAgICAgIHRocm93IG52YWU7CisgICAgICAgIH0KKyAgICB9CiAgICAgc3RhdGljIGZpbmFsIFN0cmluZyBkZmFfMTVzID0gIlwxM1x1ZmZmZiI7CiAgICAgc3RhdGljIGZpbmFsIFN0cmluZyBkZmFfMTZzID0gIlwxXDMyXDJcdWZmZmZcMVwzMlw3XHVmZmZmIjsKICAgICBzdGF0aWMgZmluYWwgU3RyaW5nIGRmYV8xN3MgPSAiXDFcNDFcMlx1ZmZmZlwxXDM2XDdcdWZmZmYiOwpAQCAtODYyNDUsMTEgKzkxNDc0LDExIEBACiAgICAgc3RhdGljIGZpbmFsIHNob3J0W10gZGZhXzE5ID0gREZBLnVucGFja0VuY29kZWRTdHJpbmcoZGZhXzE5cyk7CiAgICAgc3RhdGljIGZpbmFsIHNob3J0W11bXSBkZmFfMjAgPSB1bnBhY2tFbmNvZGVkU3RyaW5nQXJyYXkoZGZhXzIwcyk7CiAKLSAgICBjbGFzcyBERkExNyBleHRlbmRzIERGQSB7CisgICAgY2xhc3MgREZBMTggZXh0ZW5kcyBERkEgewogCi0gICAgICAgIHB1YmxpYyBERkExNyhCYXNlUmVjb2duaXplciByZWNvZ25pemVyKSB7CisgICAgICAgIHB1YmxpYyBERkExOChCYXNlUmVjb2duaXplciByZWNvZ25pemVyKSB7CiAgICAgICAgICAgICB0aGlzLnJlY29nbml6ZXIgPSByZWNvZ25pemVyOwotICAgICAgICAgICAgdGhpcy5kZWNpc2lvbk51bWJlciA9IDE3OworICAgICAgICAgICAgdGhpcy5kZWNpc2lvbk51bWJlciA9IDE4OwogICAgICAgICAgICAgdGhpcy5lb3QgPSBkZmFfMTU7CiAgICAgICAgICAgICB0aGlzLmVvZiA9IGRmYV8xNTsKICAgICAgICAgICAgIHRoaXMubWluID0gZGZhXzE2OwpAQCAtODYyNTksMjUgKzkxNDg4LDI1IEBACiAgICAgICAgICAgICB0aGlzLnRyYW5zaXRpb24gPSBkZmFfMjA7CiAgICAgICAgIH0KICAgICAgICAgcHVibGljIFN0cmluZyBnZXREZXNjcmlwdGlvbigpIHsKLSAgICAgICAgICAgIHJldHVybiAiMzA5MzoxOiBydWxlX19PcE90aGVyX19BbHRlcm5hdGl2ZXMgOiAoICggJy0+JyApIHwgKCAnLi48JyApIHwgKCAoIHJ1bGVfX09wT3RoZXJfX0dyb3VwXzJfXzAgKSApIHwgKCAnLi4nICkgfCAoICc9PicgKSB8ICggKCBydWxlX19PcE90aGVyX19Hcm91cF81X18wICkgKSB8ICggKCBydWxlX19PcE90aGVyX19Hcm91cF82X18wICkgKSB8ICggJzw+JyApIHwgKCAnPzonICkgKTsiOworICAgICAgICAgICAgcmV0dXJuICIzMjQ2OjE6IHJ1bGVfX09wT3RoZXJfX0FsdGVybmF0aXZlcyA6ICggKCAnLT4nICkgfCAoICcuLjwnICkgfCAoICggcnVsZV9fT3BPdGhlcl9fR3JvdXBfMl9fMCApICkgfCAoICcuLicgKSB8ICggJz0+JyApIHwgKCAoIHJ1bGVfX09wT3RoZXJfX0dyb3VwXzVfXzAgKSApIHwgKCAoIHJ1bGVfX09wT3RoZXJfX0dyb3VwXzZfXzAgKSApIHwgKCAnPD4nICkgfCAoICc/OicgKSApOyI7CiAgICAgICAgIH0KICAgICB9CiAgICAgc3RhdGljIGZpbmFsIFN0cmluZyBkZmFfMjFzID0gIlwxMlx1ZmZmZiI7CiAgICAgc3RhdGljIGZpbmFsIFN0cmluZyBkZmFfMjJzID0gIlw0XHVmZmZmXDVcM1wxXHVmZmZmIjsKICAgICBzdGF0aWMgZmluYWwgU3RyaW5nIGRmYV8yM3MgPSAiXDFcNTNcMlw1XDFcdWZmZmZcNVw0XDFcdWZmZmYiOwotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgZGZhXzI0cyA9ICJcMVx1MDA5N1wyXDYxXDFcdWZmZmZcNVx1MDA5YVwxXHVmZmZmIjsKKyAgICBzdGF0aWMgZmluYWwgU3RyaW5nIGRmYV8yNHMgPSAiXDFcdTAwYTNcMlw2MVwxXHVmZmZmXDVcdTAwYTZcMVx1ZmZmZiI7CiAgICAgc3RhdGljIGZpbmFsIFN0cmluZyBkZmFfMjVzID0gIlwzXHVmZmZmXDFcMlw1XHVmZmZmXDFcMSI7CiAgICAgc3RhdGljIGZpbmFsIFN0cmluZyBkZmFfMjZzID0gIlwxMlx1ZmZmZn0+IjsKICAgICBzdGF0aWMgZmluYWwgU3RyaW5nW10gZGZhXzI3cyA9IHsKLSAgICAgICAgICAgICJcMVwxXDE1Mlx1ZmZmZlwxXDJcMVwzIiwKKyAgICAgICAgICAgICJcMVwxXDE2Nlx1ZmZmZlwxXDJcMVwzIiwKICAgICAgICAgICAgICJcMVw0XDI1XHVmZmZmXDFcM1wyMVx1ZmZmZlwxXDVcMVw2XDFcN1wxXDEwXDFcMyIsCiAgICAgICAgICAgICAiXDFcNFwyNVx1ZmZmZlwxXDNcMjFcdWZmZmZcMVw1XDFcNlwxXDdcMVwxMFwxXDMiLAogICAgICAgICAgICAgIiIsCi0gICAgICAgICAgICAiXDVcM1w0XHVmZmZmXDFcMTFcNDVcM1wyM1x1ZmZmZlwyXDNcMjdcdWZmZmZcMVwzXDEyXHVmZmZmXDFcM1w0XHVmZmZmXDFcM1wxXHVmZmZmXDMwXDNcMTVcdWZmZmZcMlwzXDFcdWZmZmZcMlwzIiwKLSAgICAgICAgICAgICJcNVwzXDRcdWZmZmZcMVwxMVw0NVwzXDIzXHVmZmZmXDJcM1wyN1x1ZmZmZlwxXDNcMTJcdWZmZmZcMVwzXDRcdWZmZmZcMVwzXDFcdWZmZmZcMzBcM1wxNVx1ZmZmZlwyXDNcMVx1ZmZmZlwyXDMiLAotICAgICAgICAgICAgIlw1XDNcNFx1ZmZmZlwxXDExXDQ1XDNcMjNcdWZmZmZcMlwzXDI3XHVmZmZmXDFcM1wxMlx1ZmZmZlwxXDNcNFx1ZmZmZlwxXDNcMVx1ZmZmZlwzMFwzXDE1XHVmZmZmXDJcM1wxXHVmZmZmXDJcMyIsCi0gICAgICAgICAgICAiXDVcM1w0XHVmZmZmXDFcMTFcNDVcM1wyM1x1ZmZmZlwyXDNcMjdcdWZmZmZcMVwzXDEyXHVmZmZmXDFcM1w0XHVmZmZmXDFcM1wxXHVmZmZmXDMwXDNcMTVcdWZmZmZcMlwzXDFcdWZmZmZcMlwzIiwKLSAgICAgICAgICAgICJcNVwzXDRcdWZmZmZcMVwxMVw0NVwzXDIzXHVmZmZmXDJcM1wyN1x1ZmZmZlwxXDNcMTJcdWZmZmZcMVwzXDRcdWZmZmZcMVwzXDFcdWZmZmZcMzBcM1wxNVx1ZmZmZlwyXDNcMVx1ZmZmZlwyXDMiLAorICAgICAgICAgICAgIlw1XDNcNFx1ZmZmZlwxXDExXDQ1XDNcMzBcdWZmZmZcMlwzXDMxXHVmZmZmXDFcM1wxNVx1ZmZmZlwxXDNcNFx1ZmZmZlwxXDNcMVx1ZmZmZlwzMFwzXDE3XHVmZmZmXDJcM1wxXHVmZmZmXDJcMyIsCisgICAgICAgICAgICAiXDVcM1w0XHVmZmZmXDFcMTFcNDVcM1wzMFx1ZmZmZlwyXDNcMzFcdWZmZmZcMVwzXDE1XHVmZmZmXDFcM1w0XHVmZmZmXDFcM1wxXHVmZmZmXDMwXDNcMTdcdWZmZmZcMlwzXDFcdWZmZmZcMlwzIiwKKyAgICAgICAgICAgICJcNVwzXDRcdWZmZmZcMVwxMVw0NVwzXDMwXHVmZmZmXDJcM1wzMVx1ZmZmZlwxXDNcMTVcdWZmZmZcMVwzXDRcdWZmZmZcMVwzXDFcdWZmZmZcMzBcM1wxN1x1ZmZmZlwyXDNcMVx1ZmZmZlwyXDMiLAorICAgICAgICAgICAgIlw1XDNcNFx1ZmZmZlwxXDExXDQ1XDNcMzBcdWZmZmZcMlwzXDMxXHVmZmZmXDFcM1wxNVx1ZmZmZlwxXDNcNFx1ZmZmZlwxXDNcMVx1ZmZmZlwzMFwzXDE3XHVmZmZmXDJcM1wxXHVmZmZmXDJcMyIsCisgICAgICAgICAgICAiXDVcM1w0XHVmZmZmXDFcMTFcNDVcM1wzMFx1ZmZmZlwyXDNcMzFcdWZmZmZcMVwzXDE1XHVmZmZmXDFcM1w0XHVmZmZmXDFcM1wxXHVmZmZmXDMwXDNcMTdcdWZmZmZcMlwzXDFcdWZmZmZcMlwzIiwKICAgICAgICAgICAgICIiCiAgICAgfTsKIApAQCAtODYyODksMTEgKzkxNTE4LDExIEBACiAgICAgc3RhdGljIGZpbmFsIHNob3J0W10gZGZhXzI2ID0gREZBLnVucGFja0VuY29kZWRTdHJpbmcoZGZhXzI2cyk7CiAgICAgc3RhdGljIGZpbmFsIHNob3J0W11bXSBkZmFfMjcgPSB1bnBhY2tFbmNvZGVkU3RyaW5nQXJyYXkoZGZhXzI3cyk7CiAKLSAgICBjbGFzcyBERkEyNSBleHRlbmRzIERGQSB7CisgICAgY2xhc3MgREZBMjYgZXh0ZW5kcyBERkEgewogCi0gICAgICAgIHB1YmxpYyBERkEyNShCYXNlUmVjb2duaXplciByZWNvZ25pemVyKSB7CisgICAgICAgIHB1YmxpYyBERkEyNihCYXNlUmVjb2duaXplciByZWNvZ25pemVyKSB7CiAgICAgICAgICAgICB0aGlzLnJlY29nbml6ZXIgPSByZWNvZ25pemVyOwotICAgICAgICAgICAgdGhpcy5kZWNpc2lvbk51bWJlciA9IDI1OworICAgICAgICAgICAgdGhpcy5kZWNpc2lvbk51bWJlciA9IDI2OwogICAgICAgICAgICAgdGhpcy5lb3QgPSBkZmFfMjE7CiAgICAgICAgICAgICB0aGlzLmVvZiA9IGRmYV8yMjsKICAgICAgICAgICAgIHRoaXMubWluID0gZGZhXzIzOwpAQCAtODYzMDMsMTUgKzkxNTMyLDE1IEBACiAgICAgICAgICAgICB0aGlzLnRyYW5zaXRpb24gPSBkZmFfMjc7CiAgICAgICAgIH0KICAgICAgICAgcHVibGljIFN0cmluZyBnZXREZXNjcmlwdGlvbigpIHsKLSAgICAgICAgICAgIHJldHVybiAiMzMyNzoxOiBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX0FsdGVybmF0aXZlc18xIDogKCAoICggcnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19Hcm91cF8xXzBfXzAgKSApIHwgKCAoIHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fR3JvdXBfMV8xX18wICkgKSApOyI7CisgICAgICAgICAgICByZXR1cm4gIjM0ODA6MTogcnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19BbHRlcm5hdGl2ZXNfMSA6ICggKCAoIHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fR3JvdXBfMV8wX18wICkgKSB8ICggKCBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX0dyb3VwXzFfMV9fMCApICkgKTsiOwogICAgICAgICB9CiAgICAgfQogICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgZGZhXzI4cyA9ICJcMVw0XDJcMFw0MFx1ZmZmZiI7Ci0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBkZmFfMjlzID0gIlwxXHUwMDlhXDJcMFw0MFx1ZmZmZiI7CisgICAgc3RhdGljIGZpbmFsIFN0cmluZyBkZmFfMjlzID0gIlwxXHUwMGE2XDJcMFw0MFx1ZmZmZiI7CiAgICAgc3RhdGljIGZpbmFsIFN0cmluZyBkZmFfMzBzID0gIlwzXHVmZmZmXDFcMVwxXHVmZmZmXDFcMlwzNVx1ZmZmZiI7CiAgICAgc3RhdGljIGZpbmFsIFN0cmluZyBkZmFfMzFzID0gIlwxXHVmZmZmXDFcMFwxXDFcNDBcdWZmZmZ9PiI7CiAgICAgc3RhdGljIGZpbmFsIFN0cmluZ1tdIGRmYV8zMnMgPSB7Ci0gICAgICAgICAgICAiXDFcNVwxXDFcM1w1XDIyXHVmZmZmXDFcNVwzXHVmZmZmXDFcM1wyXHVmZmZmXDJcNVw0XHVmZmZmXDFcNVw0XHVmZmZmXDZcNVwyM1x1ZmZmZlwxXDVcMzBcdWZmZmZcMVw1XDIxXHVmZmZmXDFcMlwzXHVmZmZmXDJcNVwxXHVmZmZmXDFcNVwxXHVmZmZmXDFcNVwzXHVmZmZmXDEwXDVcMVx1ZmZmZlwxXDVcMjBcdWZmZmZcMVwzXDFcdWZmZmZcMVw1IiwKKyAgICAgICAgICAgICJcMVw1XDFcMVwzXDVcMjJcdWZmZmZcMVw1XDNcdWZmZmZcMVwzXDJcdWZmZmZcMlw1XDRcdWZmZmZcMVw1XDRcdWZmZmZcNlw1XDMwXHVmZmZmXDFcNVwzMlx1ZmZmZlwxXDVcMjRcdWZmZmZcMVwyXDNcdWZmZmZcMlw1XDFcdWZmZmZcMVw1XDFcdWZmZmZcMVw1XDNcdWZmZmZcMTBcNVwxXHVmZmZmXDFcNVwyMlx1ZmZmZlwxXDNcMVx1ZmZmZlwxXDUiLAogICAgICAgICAgICAgIlwxXHVmZmZmIiwKICAgICAgICAgICAgICJcMVx1ZmZmZiIsCiAgICAgICAgICAgICAiIiwKQEAgLTg2MzUzLDExICs5MTU4MiwxMSBAQAogICAgIHN0YXRpYyBmaW5hbCBzaG9ydFtdIGRmYV8zMSA9IERGQS51bnBhY2tFbmNvZGVkU3RyaW5nKGRmYV8zMXMpOwogICAgIHN0YXRpYyBmaW5hbCBzaG9ydFtdW10gZGZhXzMyID0gdW5wYWNrRW5jb2RlZFN0cmluZ0FycmF5KGRmYV8zMnMpOwogCi0gICAgY2xhc3MgREZBMjggZXh0ZW5kcyBERkEgeworICAgIGNsYXNzIERGQTI5IGV4dGVuZHMgREZBIHsKIAotICAgICAgICBwdWJsaWMgREZBMjgoQmFzZVJlY29nbml6ZXIgcmVjb2duaXplcikgeworICAgICAgICBwdWJsaWMgREZBMjkoQmFzZVJlY29nbml6ZXIgcmVjb2duaXplcikgewogICAgICAgICAgICAgdGhpcy5yZWNvZ25pemVyID0gcmVjb2duaXplcjsKLSAgICAgICAgICAgIHRoaXMuZGVjaXNpb25OdW1iZXIgPSAyODsKKyAgICAgICAgICAgIHRoaXMuZGVjaXNpb25OdW1iZXIgPSAyOTsKICAgICAgICAgICAgIHRoaXMuZW90ID0gZGZhXzg7CiAgICAgICAgICAgICB0aGlzLmVvZiA9IGRmYV84OwogICAgICAgICAgICAgdGhpcy5taW4gPSBkZmFfMjg7CkBAIC04NjM2Nyw1NyArOTE1OTYsNTcgQEAKICAgICAgICAgICAgIHRoaXMudHJhbnNpdGlvbiA9IGRmYV8zMjsKICAgICAgICAgfQogICAgICAgICBwdWJsaWMgU3RyaW5nIGdldERlc2NyaXB0aW9uKCkgewotICAgICAgICAgICAgcmV0dXJuICIzMzk2OjE6IHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fQWx0ZXJuYXRpdmVzXzFfMV8zXzEgOiAoICggKCBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX01lbWJlckNhbGxBcmd1bWVudHNBc3NpZ25tZW50XzFfMV8zXzFfMCApICkgfCAoICggcnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19Hcm91cF8xXzFfM18xXzFfXzAgKSApICk7IjsKKyAgICAgICAgICAgIHJldHVybiAiMzU0OToxOiBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX0FsdGVybmF0aXZlc18xXzFfM18xIDogKCAoICggcnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19NZW1iZXJDYWxsQXJndW1lbnRzQXNzaWdubWVudF8xXzFfM18xXzAgKSApIHwgKCAoIHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fR3JvdXBfMV8xXzNfMV8xX18wICkgKSApOyI7CiAgICAgICAgIH0KICAgICAgICAgcHVibGljIGludCBzcGVjaWFsU3RhdGVUcmFuc2l0aW9uKGludCBzLCBJbnRTdHJlYW0gX2lucHV0KSB0aHJvd3MgTm9WaWFibGVBbHRFeGNlcHRpb24gewogICAgICAgICAgICAgVG9rZW5TdHJlYW0gaW5wdXQgPSAoVG9rZW5TdHJlYW0pX2lucHV0OwogICAgICAgICAJaW50IF9zID0gczsKICAgICAgICAgICAgIHN3aXRjaCAoIHMgKSB7CiAgICAgICAgICAgICAgICAgICAgIGNhc2UgMCA6IAotICAgICAgICAgICAgICAgICAgICAgICAgaW50IExBMjhfMSA9IGlucHV0LkxBKDEpOworICAgICAgICAgICAgICAgICAgICAgICAgaW50IExBMjlfMSA9IGlucHV0LkxBKDEpOwogCiAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW5kZXgyOF8xID0gaW5wdXQuaW5kZXgoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbmRleDI5XzEgPSBpbnB1dC5pbmRleCgpOwogICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXQucmV3aW5kKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICBzID0gLTE7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIChzeW5wcmVkNTJfSW50ZXJuYWxEYXRhRFNMKCkpICkge3MgPSAzO30KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICggKHN5bnByZWQ1M19JbnRlcm5hbERhdGFEU0woKSkgKSB7cyA9IDM7fQogCiAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICggKHRydWUpICkge3MgPSA1O30KIAogICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXQuc2VlayhpbmRleDI4XzEpOworICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXQuc2VlayhpbmRleDI5XzEpOwogICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCBzPj0wICkgcmV0dXJuIHM7CiAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgY2FzZSAxIDogCi0gICAgICAgICAgICAgICAgICAgICAgICBpbnQgTEEyOF8yID0gaW5wdXQuTEEoMSk7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgTEEyOV8yID0gaW5wdXQuTEEoMSk7CiAKICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbmRleDI4XzIgPSBpbnB1dC5pbmRleCgpOworICAgICAgICAgICAgICAgICAgICAgICAgaW50IGluZGV4MjlfMiA9IGlucHV0LmluZGV4KCk7CiAgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dC5yZXdpbmQoKTsKICAgICAgICAgICAgICAgICAgICAgICAgIHMgPSAtMTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICggKHN5bnByZWQ1Ml9JbnRlcm5hbERhdGFEU0woKSkgKSB7cyA9IDM7fQorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCAoc3lucHJlZDUzX0ludGVybmFsRGF0YURTTCgpKSApIHtzID0gMzt9CiAKICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKCAodHJ1ZSkgKSB7cyA9IDU7fQogCiAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICBpbnB1dC5zZWVrKGluZGV4MjhfMik7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dC5zZWVrKGluZGV4MjlfMik7CiAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIHM+PTAgKSByZXR1cm4gczsKICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgaWYgKHN0YXRlLmJhY2t0cmFja2luZz4wKSB7c3RhdGUuZmFpbGVkPXRydWU7IHJldHVybiAtMTt9CiAgICAgICAgICAgICBOb1ZpYWJsZUFsdEV4Y2VwdGlvbiBudmFlID0KLSAgICAgICAgICAgICAgICBuZXcgTm9WaWFibGVBbHRFeGNlcHRpb24oZ2V0RGVzY3JpcHRpb24oKSwgMjgsIF9zLCBpbnB1dCk7CisgICAgICAgICAgICAgICAgbmV3IE5vVmlhYmxlQWx0RXhjZXB0aW9uKGdldERlc2NyaXB0aW9uKCksIDI5LCBfcywgaW5wdXQpOwogICAgICAgICAgICAgZXJyb3IobnZhZSk7CiAgICAgICAgICAgICB0aHJvdyBudmFlOwogICAgICAgICB9CiAgICAgfQogICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgZGZhXzMzcyA9ICJcNDBcdWZmZmYiOwogICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgZGZhXzM0cyA9ICJcMVw0XDI2XHVmZmZmXDFcMFwxMFx1ZmZmZiI7Ci0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBkZmFfMzVzID0gIlwxXHUwMDlhXDI2XHVmZmZmXDFcMFwxMFx1ZmZmZiI7CisgICAgc3RhdGljIGZpbmFsIFN0cmluZyBkZmFfMzVzID0gIlwxXHUwMGE2XDI2XHVmZmZmXDFcMFwxMFx1ZmZmZiI7CiAgICAgc3RhdGljIGZpbmFsIFN0cmluZyBkZmFfMzZzID0gIlwxXHVmZmZmXDFcMVwxXDJcMVwzXDFcNFwxXDVcNlx1ZmZmZlwxXDZcMTFcdWZmZmZcMVw3XDFcdWZmZmZcMVwxMlwxXDEzXDFcMTRcMVwxNVwxXDE2XDFcMTdcMVwxMFwxXDExIjsKICAgICBzdGF0aWMgZmluYWwgU3RyaW5nIGRmYV8zN3MgPSAiXDI3XHVmZmZmXDFcMFwxMFx1ZmZmZn0+IjsKICAgICBzdGF0aWMgZmluYWwgU3RyaW5nW10gZGZhXzM4cyA9IHsKLSAgICAgICAgICAgICJcMVwxNFwxXDVcM1wxNFwyMlx1ZmZmZlwxXDVcMjFcdWZmZmZcNVw1XDFcMTRcMjNcdWZmZmZcMVwyXDMwXHVmZmZmXDFcMjdcMjFcdWZmZmZcMVwzNVwzXHVmZmZmXDJcMTRcMVx1ZmZmZlwxXDI2XDFcdWZmZmZcMVwzXDNcdWZmZmZcMVwzMFwxXDMxXDFcMVwyXDE0XDFcMzJcMVwzM1wxXDM0XDFcdWZmZmZcMVw0XDIyXHVmZmZmXDFcMTQiLAorICAgICAgICAgICAgIlwxXDE0XDFcNVwzXDE0XDIyXHVmZmZmXDFcNVwyMVx1ZmZmZlw1XDVcMVwxNFwzMFx1ZmZmZlwxXDJcMzJcdWZmZmZcMVwyN1wyNFx1ZmZmZlwxXDM1XDNcdWZmZmZcMlwxNFwxXHVmZmZmXDFcMjZcMVx1ZmZmZlwxXDNcM1x1ZmZmZlwxXDMwXDFcMzFcMVwxXDJcMTRcMVwzMlwxXDMzXDFcMzRcMVx1ZmZmZlwxXDRcMjRcdWZmZmZcMVwxNCIsCiAgICAgICAgICAgICAiIiwKICAgICAgICAgICAgICIiLAogICAgICAgICAgICAgIiIsCkBAIC04NjQ1OCwxMSArOTE2ODcsMTEgQEAKICAgICBzdGF0aWMgZmluYWwgc2hvcnRbXSBkZmFfMzcgPSBERkEudW5wYWNrRW5jb2RlZFN0cmluZyhkZmFfMzdzKTsKICAgICBzdGF0aWMgZmluYWwgc2hvcnRbXVtdIGRmYV8zOCA9IHVucGFja0VuY29kZWRTdHJpbmdBcnJheShkZmFfMzhzKTsKIAotICAgIGNsYXNzIERGQTI5IGV4dGVuZHMgREZBIHsKKyAgICBjbGFzcyBERkEzMCBleHRlbmRzIERGQSB7CiAKLSAgICAgICAgcHVibGljIERGQTI5KEJhc2VSZWNvZ25pemVyIHJlY29nbml6ZXIpIHsKKyAgICAgICAgcHVibGljIERGQTMwKEJhc2VSZWNvZ25pemVyIHJlY29nbml6ZXIpIHsKICAgICAgICAgICAgIHRoaXMucmVjb2duaXplciA9IHJlY29nbml6ZXI7Ci0gICAgICAgICAgICB0aGlzLmRlY2lzaW9uTnVtYmVyID0gMjk7CisgICAgICAgICAgICB0aGlzLmRlY2lzaW9uTnVtYmVyID0gMzA7CiAgICAgICAgICAgICB0aGlzLmVvdCA9IGRmYV8zMzsKICAgICAgICAgICAgIHRoaXMuZW9mID0gZGZhXzMzOwogICAgICAgICAgICAgdGhpcy5taW4gPSBkZmFfMzQ7CkBAIC04NjQ3MiwzNyArOTE3MDEsMzcgQEAKICAgICAgICAgICAgIHRoaXMudHJhbnNpdGlvbiA9IGRmYV8zODsKICAgICAgICAgfQogICAgICAgICBwdWJsaWMgU3RyaW5nIGdldERlc2NyaXB0aW9uKCkgewotICAgICAgICAgICAgcmV0dXJuICIzNDE3OjE6IHJ1bGVfX1hQcmltYXJ5RXhwcmVzc2lvbl9fQWx0ZXJuYXRpdmVzIDogKCAoIHJ1bGVYQ29uc3RydWN0b3JDYWxsICkgfCAoIHJ1bGVYQmxvY2tFeHByZXNzaW9uICkgfCAoIHJ1bGVYU3dpdGNoRXhwcmVzc2lvbiApIHwgKCAoIHJ1bGVYU3luY2hyb25pemVkRXhwcmVzc2lvbiApICkgfCAoIHJ1bGVYRmVhdHVyZUNhbGwgKSB8ICggcnVsZVhMaXRlcmFsICkgfCAoIHJ1bGVYSWZFeHByZXNzaW9uICkgfCAoICggcnVsZVhGb3JMb29wRXhwcmVzc2lvbiApICkgfCAoIHJ1bGVYQmFzaWNGb3JMb29wRXhwcmVzc2lvbiApIHwgKCBydWxlWFdoaWxlRXhwcmVzc2lvbiApIHwgKCBydWxlWERvV2hpbGVFeHByZXNzaW9uICkgfCAoIHJ1bGVYVGhyb3dFeHByZXNzaW9uICkgfCAoIHJ1bGVYUmV0dXJuRXhwcmVzc2lvbiApIHwgKCBydWxlWFRyeUNhdGNoRmluYWxseUV4cHJlc3Npb24gKSB8ICggcnVsZVhQYXJlbnRoZXNpemVkRXhwcmVzc2lvbiApICk7IjsKKyAgICAgICAgICAgIHJldHVybiAiMzU3MDoxOiBydWxlX19YUHJpbWFyeUV4cHJlc3Npb25fX0FsdGVybmF0aXZlcyA6ICggKCBydWxlWENvbnN0cnVjdG9yQ2FsbCApIHwgKCBydWxlWEJsb2NrRXhwcmVzc2lvbiApIHwgKCBydWxlWFN3aXRjaEV4cHJlc3Npb24gKSB8ICggKCBydWxlWFN5bmNocm9uaXplZEV4cHJlc3Npb24gKSApIHwgKCBydWxlWEZlYXR1cmVDYWxsICkgfCAoIHJ1bGVYTGl0ZXJhbCApIHwgKCBydWxlWElmRXhwcmVzc2lvbiApIHwgKCAoIHJ1bGVYRm9yTG9vcEV4cHJlc3Npb24gKSApIHwgKCBydWxlWEJhc2ljRm9yTG9vcEV4cHJlc3Npb24gKSB8ICggcnVsZVhXaGlsZUV4cHJlc3Npb24gKSB8ICggcnVsZVhEb1doaWxlRXhwcmVzc2lvbiApIHwgKCBydWxlWFRocm93RXhwcmVzc2lvbiApIHwgKCBydWxlWFJldHVybkV4cHJlc3Npb24gKSB8ICggcnVsZVhUcnlDYXRjaEZpbmFsbHlFeHByZXNzaW9uICkgfCAoIHJ1bGVYUGFyZW50aGVzaXplZEV4cHJlc3Npb24gKSApOyI7CiAgICAgICAgIH0KICAgICAgICAgcHVibGljIGludCBzcGVjaWFsU3RhdGVUcmFuc2l0aW9uKGludCBzLCBJbnRTdHJlYW0gX2lucHV0KSB0aHJvd3MgTm9WaWFibGVBbHRFeGNlcHRpb24gewogICAgICAgICAgICAgVG9rZW5TdHJlYW0gaW5wdXQgPSAoVG9rZW5TdHJlYW0pX2lucHV0OwogICAgICAgICAJaW50IF9zID0gczsKICAgICAgICAgICAgIHN3aXRjaCAoIHMgKSB7CiAgICAgICAgICAgICAgICAgICAgIGNhc2UgMCA6IAotICAgICAgICAgICAgICAgICAgICAgICAgaW50IExBMjlfMjMgPSBpbnB1dC5MQSgxKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBMQTMwXzIzID0gaW5wdXQuTEEoMSk7CiAKICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbmRleDI5XzIzID0gaW5wdXQuaW5kZXgoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbmRleDMwXzIzID0gaW5wdXQuaW5kZXgoKTsKICAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0LnJld2luZCgpOwogICAgICAgICAgICAgICAgICAgICAgICAgcyA9IC0xOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCAoc3lucHJlZDYwX0ludGVybmFsRGF0YURTTCgpKSApIHtzID0gMzA7fQorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCAoc3lucHJlZDYxX0ludGVybmFsRGF0YURTTCgpKSApIHtzID0gMzA7fQogCi0gICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICggKHN5bnByZWQ2MV9JbnRlcm5hbERhdGFEU0woKSkgKSB7cyA9IDMxO30KKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKCAoc3lucHJlZDYyX0ludGVybmFsRGF0YURTTCgpKSApIHtzID0gMzE7fQogCiAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICBpbnB1dC5zZWVrKGluZGV4MjlfMjMpOworICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXQuc2VlayhpbmRleDMwXzIzKTsKICAgICAgICAgICAgICAgICAgICAgICAgIGlmICggcz49MCApIHJldHVybiBzOwogICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBpZiAoc3RhdGUuYmFja3RyYWNraW5nPjApIHtzdGF0ZS5mYWlsZWQ9dHJ1ZTsgcmV0dXJuIC0xO30KICAgICAgICAgICAgIE5vVmlhYmxlQWx0RXhjZXB0aW9uIG52YWUgPQotICAgICAgICAgICAgICAgIG5ldyBOb1ZpYWJsZUFsdEV4Y2VwdGlvbihnZXREZXNjcmlwdGlvbigpLCAyOSwgX3MsIGlucHV0KTsKKyAgICAgICAgICAgICAgICBuZXcgTm9WaWFibGVBbHRFeGNlcHRpb24oZ2V0RGVzY3JpcHRpb24oKSwgMzAsIF9zLCBpbnB1dCk7CiAgICAgICAgICAgICBlcnJvcihudmFlKTsKICAgICAgICAgICAgIHRocm93IG52YWU7CiAgICAgICAgIH0KICAgICB9CiAgICAgc3RhdGljIGZpbmFsIFN0cmluZ1tdIGRmYV8zOXMgPSB7Ci0gICAgICAgICAgICAiXDVcMlwyMlx1ZmZmZlwxXDJcM1x1ZmZmZlwxXDJcMlx1ZmZmZlwyXDJcNFx1ZmZmZlwxXDJcNFx1ZmZmZlw2XDJcMjNcdWZmZmZcMVwyXDMwXHVmZmZmXDFcMlwyMVx1ZmZmZlwxXDFcM1x1ZmZmZlwyXDJcMVx1ZmZmZlwxXDJcMVx1ZmZmZlwxXDJcM1x1ZmZmZlwxMFwyXDFcdWZmZmZcMVwyXDIyXHVmZmZmXDFcMiIsCisgICAgICAgICAgICAiXDVcMlwyMlx1ZmZmZlwxXDJcM1x1ZmZmZlwxXDJcMlx1ZmZmZlwyXDJcNFx1ZmZmZlwxXDJcNFx1ZmZmZlw2XDJcMzBcdWZmZmZcMVwyXDMyXHVmZmZmXDFcMlwyNFx1ZmZmZlwxXDFcM1x1ZmZmZlwyXDJcMVx1ZmZmZlwxXDJcMVx1ZmZmZlwxXDJcM1x1ZmZmZlwxMFwyXDFcdWZmZmZcMVwyXDI0XHVmZmZmXDFcMiIsCiAgICAgICAgICAgICAiXDFcdWZmZmYiLAogICAgICAgICAgICAgIiIsCiAgICAgICAgICAgICAiIiwKQEAgLTg2NTQwLDExICs5MTc2OSwxMSBAQAogICAgIH07CiAgICAgc3RhdGljIGZpbmFsIHNob3J0W11bXSBkZmFfMzkgPSB1bnBhY2tFbmNvZGVkU3RyaW5nQXJyYXkoZGZhXzM5cyk7CiAKLSAgICBjbGFzcyBERkEzMiBleHRlbmRzIERGQSB7CisgICAgY2xhc3MgREZBMzMgZXh0ZW5kcyBERkEgewogCi0gICAgICAgIHB1YmxpYyBERkEzMihCYXNlUmVjb2duaXplciByZWNvZ25pemVyKSB7CisgICAgICAgIHB1YmxpYyBERkEzMyhCYXNlUmVjb2duaXplciByZWNvZ25pemVyKSB7CiAgICAgICAgICAgICB0aGlzLnJlY29nbml6ZXIgPSByZWNvZ25pemVyOwotICAgICAgICAgICAgdGhpcy5kZWNpc2lvbk51bWJlciA9IDMyOworICAgICAgICAgICAgdGhpcy5kZWNpc2lvbk51bWJlciA9IDMzOwogICAgICAgICAgICAgdGhpcy5lb3QgPSBkZmFfODsKICAgICAgICAgICAgIHRoaXMuZW9mID0gZGZhXzg7CiAgICAgICAgICAgICB0aGlzLm1pbiA9IGRmYV85OwpAQCAtODY1NTQsNDEgKzkxNzgzLDQxIEBACiAgICAgICAgICAgICB0aGlzLnRyYW5zaXRpb24gPSBkZmFfMzk7CiAgICAgICAgIH0KICAgICAgICAgcHVibGljIFN0cmluZyBnZXREZXNjcmlwdGlvbigpIHsKLSAgICAgICAgICAgIHJldHVybiAiMzU4ODoxOiBydWxlX19YU3dpdGNoRXhwcmVzc2lvbl9fQWx0ZXJuYXRpdmVzXzIgOiAoICggKCBydWxlX19YU3dpdGNoRXhwcmVzc2lvbl9fR3JvdXBfMl8wX18wICkgKSB8ICggKCBydWxlX19YU3dpdGNoRXhwcmVzc2lvbl9fR3JvdXBfMl8xX18wICkgKSApOyI7CisgICAgICAgICAgICByZXR1cm4gIjM3NDE6MTogcnVsZV9fWFN3aXRjaEV4cHJlc3Npb25fX0FsdGVybmF0aXZlc18yIDogKCAoICggcnVsZV9fWFN3aXRjaEV4cHJlc3Npb25fX0dyb3VwXzJfMF9fMCApICkgfCAoICggcnVsZV9fWFN3aXRjaEV4cHJlc3Npb25fX0dyb3VwXzJfMV9fMCApICkgKTsiOwogICAgICAgICB9CiAgICAgICAgIHB1YmxpYyBpbnQgc3BlY2lhbFN0YXRlVHJhbnNpdGlvbihpbnQgcywgSW50U3RyZWFtIF9pbnB1dCkgdGhyb3dzIE5vVmlhYmxlQWx0RXhjZXB0aW9uIHsKICAgICAgICAgICAgIFRva2VuU3RyZWFtIGlucHV0ID0gKFRva2VuU3RyZWFtKV9pbnB1dDsKICAgICAgICAgCWludCBfcyA9IHM7CiAgICAgICAgICAgICBzd2l0Y2ggKCBzICkgewogICAgICAgICAgICAgICAgICAgICBjYXNlIDAgOiAKLSAgICAgICAgICAgICAgICAgICAgICAgIGludCBMQTMyXzEgPSBpbnB1dC5MQSgxKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBMQTMzXzEgPSBpbnB1dC5MQSgxKTsKIAogICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgaW50IGluZGV4MzJfMSA9IGlucHV0LmluZGV4KCk7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW5kZXgzM18xID0gaW5wdXQuaW5kZXgoKTsKICAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0LnJld2luZCgpOwogICAgICAgICAgICAgICAgICAgICAgICAgcyA9IC0xOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCAoc3lucHJlZDc0X0ludGVybmFsRGF0YURTTCgpKSApIHtzID0gMzQ7fQorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCAoc3lucHJlZDc1X0ludGVybmFsRGF0YURTTCgpKSApIHtzID0gMzQ7fQogCiAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICggKHRydWUpICkge3MgPSAyO30KIAogICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXQuc2VlayhpbmRleDMyXzEpOworICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXQuc2VlayhpbmRleDMzXzEpOwogICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCBzPj0wICkgcmV0dXJuIHM7CiAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGlmIChzdGF0ZS5iYWNrdHJhY2tpbmc+MCkge3N0YXRlLmZhaWxlZD10cnVlOyByZXR1cm4gLTE7fQogICAgICAgICAgICAgTm9WaWFibGVBbHRFeGNlcHRpb24gbnZhZSA9Ci0gICAgICAgICAgICAgICAgbmV3IE5vVmlhYmxlQWx0RXhjZXB0aW9uKGdldERlc2NyaXB0aW9uKCksIDMyLCBfcywgaW5wdXQpOworICAgICAgICAgICAgICAgIG5ldyBOb1ZpYWJsZUFsdEV4Y2VwdGlvbihnZXREZXNjcmlwdGlvbigpLCAzMywgX3MsIGlucHV0KTsKICAgICAgICAgICAgIGVycm9yKG52YWUpOwogICAgICAgICAgICAgdGhyb3cgbnZhZTsKICAgICAgICAgfQogICAgIH0KIAotICAgIGNsYXNzIERGQTM3IGV4dGVuZHMgREZBIHsKKyAgICBjbGFzcyBERkEzOCBleHRlbmRzIERGQSB7CiAKLSAgICAgICAgcHVibGljIERGQTM3KEJhc2VSZWNvZ25pemVyIHJlY29nbml6ZXIpIHsKKyAgICAgICAgcHVibGljIERGQTM4KEJhc2VSZWNvZ25pemVyIHJlY29nbml6ZXIpIHsKICAgICAgICAgICAgIHRoaXMucmVjb2duaXplciA9IHJlY29nbml6ZXI7Ci0gICAgICAgICAgICB0aGlzLmRlY2lzaW9uTnVtYmVyID0gMzc7CisgICAgICAgICAgICB0aGlzLmRlY2lzaW9uTnVtYmVyID0gMzg7CiAgICAgICAgICAgICB0aGlzLmVvdCA9IGRmYV84OwogICAgICAgICAgICAgdGhpcy5lb2YgPSBkZmFfODsKICAgICAgICAgICAgIHRoaXMubWluID0gZGZhXzI4OwpAQCAtODY1OTgsNTYgKzkxODI3LDU2IEBACiAgICAgICAgICAgICB0aGlzLnRyYW5zaXRpb24gPSBkZmFfMzI7CiAgICAgICAgIH0KICAgICAgICAgcHVibGljIFN0cmluZyBnZXREZXNjcmlwdGlvbigpIHsKLSAgICAgICAgICAgIHJldHVybiAiMzY5MzoxOiBydWxlX19YRmVhdHVyZUNhbGxfX0FsdGVybmF0aXZlc18zXzEgOiAoICggKCBydWxlX19YRmVhdHVyZUNhbGxfX0ZlYXR1cmVDYWxsQXJndW1lbnRzQXNzaWdubWVudF8zXzFfMCApICkgfCAoICggcnVsZV9fWEZlYXR1cmVDYWxsX19Hcm91cF8zXzFfMV9fMCApICkgKTsiOworICAgICAgICAgICAgcmV0dXJuICIzODQ2OjE6IHJ1bGVfX1hGZWF0dXJlQ2FsbF9fQWx0ZXJuYXRpdmVzXzNfMSA6ICggKCAoIHJ1bGVfX1hGZWF0dXJlQ2FsbF9fRmVhdHVyZUNhbGxBcmd1bWVudHNBc3NpZ25tZW50XzNfMV8wICkgKSB8ICggKCBydWxlX19YRmVhdHVyZUNhbGxfX0dyb3VwXzNfMV8xX18wICkgKSApOyI7CiAgICAgICAgIH0KICAgICAgICAgcHVibGljIGludCBzcGVjaWFsU3RhdGVUcmFuc2l0aW9uKGludCBzLCBJbnRTdHJlYW0gX2lucHV0KSB0aHJvd3MgTm9WaWFibGVBbHRFeGNlcHRpb24gewogICAgICAgICAgICAgVG9rZW5TdHJlYW0gaW5wdXQgPSAoVG9rZW5TdHJlYW0pX2lucHV0OwogICAgICAgICAJaW50IF9zID0gczsKICAgICAgICAgICAgIHN3aXRjaCAoIHMgKSB7CiAgICAgICAgICAgICAgICAgICAgIGNhc2UgMCA6IAotICAgICAgICAgICAgICAgICAgICAgICAgaW50IExBMzdfMSA9IGlucHV0LkxBKDEpOworICAgICAgICAgICAgICAgICAgICAgICAgaW50IExBMzhfMSA9IGlucHV0LkxBKDEpOwogCiAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW5kZXgzN18xID0gaW5wdXQuaW5kZXgoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbmRleDM4XzEgPSBpbnB1dC5pbmRleCgpOwogICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXQucmV3aW5kKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICBzID0gLTE7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIChzeW5wcmVkNzlfSW50ZXJuYWxEYXRhRFNMKCkpICkge3MgPSAzO30KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICggKHN5bnByZWQ4MF9JbnRlcm5hbERhdGFEU0woKSkgKSB7cyA9IDM7fQogCiAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICggKHRydWUpICkge3MgPSA1O30KIAogICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXQuc2VlayhpbmRleDM3XzEpOworICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXQuc2VlayhpbmRleDM4XzEpOwogICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCBzPj0wICkgcmV0dXJuIHM7CiAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgY2FzZSAxIDogCi0gICAgICAgICAgICAgICAgICAgICAgICBpbnQgTEEzN18yID0gaW5wdXQuTEEoMSk7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgTEEzOF8yID0gaW5wdXQuTEEoMSk7CiAKICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbmRleDM3XzIgPSBpbnB1dC5pbmRleCgpOworICAgICAgICAgICAgICAgICAgICAgICAgaW50IGluZGV4MzhfMiA9IGlucHV0LmluZGV4KCk7CiAgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dC5yZXdpbmQoKTsKICAgICAgICAgICAgICAgICAgICAgICAgIHMgPSAtMTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICggKHN5bnByZWQ3OV9JbnRlcm5hbERhdGFEU0woKSkgKSB7cyA9IDM7fQorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCAoc3lucHJlZDgwX0ludGVybmFsRGF0YURTTCgpKSApIHtzID0gMzt9CiAKICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKCAodHJ1ZSkgKSB7cyA9IDU7fQogCiAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICBpbnB1dC5zZWVrKGluZGV4MzdfMik7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dC5zZWVrKGluZGV4MzhfMik7CiAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIHM+PTAgKSByZXR1cm4gczsKICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgaWYgKHN0YXRlLmJhY2t0cmFja2luZz4wKSB7c3RhdGUuZmFpbGVkPXRydWU7IHJldHVybiAtMTt9CiAgICAgICAgICAgICBOb1ZpYWJsZUFsdEV4Y2VwdGlvbiBudmFlID0KLSAgICAgICAgICAgICAgICBuZXcgTm9WaWFibGVBbHRFeGNlcHRpb24oZ2V0RGVzY3JpcHRpb24oKSwgMzcsIF9zLCBpbnB1dCk7CisgICAgICAgICAgICAgICAgbmV3IE5vVmlhYmxlQWx0RXhjZXB0aW9uKGdldERlc2NyaXB0aW9uKCksIDM4LCBfcywgaW5wdXQpOwogICAgICAgICAgICAgZXJyb3IobnZhZSk7CiAgICAgICAgICAgICB0aHJvdyBudmFlOwogICAgICAgICB9CiAgICAgfQogCi0gICAgY2xhc3MgREZBNDAgZXh0ZW5kcyBERkEgeworICAgIGNsYXNzIERGQTQxIGV4dGVuZHMgREZBIHsKIAotICAgICAgICBwdWJsaWMgREZBNDAoQmFzZVJlY29nbml6ZXIgcmVjb2duaXplcikgeworICAgICAgICBwdWJsaWMgREZBNDEoQmFzZVJlY29nbml6ZXIgcmVjb2duaXplcikgewogICAgICAgICAgICAgdGhpcy5yZWNvZ25pemVyID0gcmVjb2duaXplcjsKLSAgICAgICAgICAgIHRoaXMuZGVjaXNpb25OdW1iZXIgPSA0MDsKKyAgICAgICAgICAgIHRoaXMuZGVjaXNpb25OdW1iZXIgPSA0MTsKICAgICAgICAgICAgIHRoaXMuZW90ID0gZGZhXzg7CiAgICAgICAgICAgICB0aGlzLmVvZiA9IGRmYV84OwogICAgICAgICAgICAgdGhpcy5taW4gPSBkZmFfMjg7CkBAIC04NjY1Nyw1NyArOTE4ODYsNTcgQEAKICAgICAgICAgICAgIHRoaXMudHJhbnNpdGlvbiA9IGRmYV8zMjsKICAgICAgICAgfQogICAgICAgICBwdWJsaWMgU3RyaW5nIGdldERlc2NyaXB0aW9uKCkgewotICAgICAgICAgICAgcmV0dXJuICIzNzc0OjE6IHJ1bGVfX1hDb25zdHJ1Y3RvckNhbGxfX0FsdGVybmF0aXZlc180XzEgOiAoICggKCBydWxlX19YQ29uc3RydWN0b3JDYWxsX19Bcmd1bWVudHNBc3NpZ25tZW50XzRfMV8wICkgKSB8ICggKCBydWxlX19YQ29uc3RydWN0b3JDYWxsX19Hcm91cF80XzFfMV9fMCApICkgKTsiOworICAgICAgICAgICAgcmV0dXJuICIzOTI3OjE6IHJ1bGVfX1hDb25zdHJ1Y3RvckNhbGxfX0FsdGVybmF0aXZlc180XzEgOiAoICggKCBydWxlX19YQ29uc3RydWN0b3JDYWxsX19Bcmd1bWVudHNBc3NpZ25tZW50XzRfMV8wICkgKSB8ICggKCBydWxlX19YQ29uc3RydWN0b3JDYWxsX19Hcm91cF80XzFfMV9fMCApICkgKTsiOwogICAgICAgICB9CiAgICAgICAgIHB1YmxpYyBpbnQgc3BlY2lhbFN0YXRlVHJhbnNpdGlvbihpbnQgcywgSW50U3RyZWFtIF9pbnB1dCkgdGhyb3dzIE5vVmlhYmxlQWx0RXhjZXB0aW9uIHsKICAgICAgICAgICAgIFRva2VuU3RyZWFtIGlucHV0ID0gKFRva2VuU3RyZWFtKV9pbnB1dDsKICAgICAgICAgCWludCBfcyA9IHM7CiAgICAgICAgICAgICBzd2l0Y2ggKCBzICkgewogICAgICAgICAgICAgICAgICAgICBjYXNlIDAgOiAKLSAgICAgICAgICAgICAgICAgICAgICAgIGludCBMQTQwXzEgPSBpbnB1dC5MQSgxKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBMQTQxXzEgPSBpbnB1dC5MQSgxKTsKIAogICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgaW50IGluZGV4NDBfMSA9IGlucHV0LmluZGV4KCk7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW5kZXg0MV8xID0gaW5wdXQuaW5kZXgoKTsKICAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0LnJld2luZCgpOwogICAgICAgICAgICAgICAgICAgICAgICAgcyA9IC0xOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCAoc3lucHJlZDg1X0ludGVybmFsRGF0YURTTCgpKSApIHtzID0gMzt9CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIChzeW5wcmVkODZfSW50ZXJuYWxEYXRhRFNMKCkpICkge3MgPSAzO30KIAogICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoICh0cnVlKSApIHtzID0gNTt9CiAKICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0LnNlZWsoaW5kZXg0MF8xKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0LnNlZWsoaW5kZXg0MV8xKTsKICAgICAgICAgICAgICAgICAgICAgICAgIGlmICggcz49MCApIHJldHVybiBzOwogICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgIGNhc2UgMSA6IAotICAgICAgICAgICAgICAgICAgICAgICAgaW50IExBNDBfMiA9IGlucHV0LkxBKDEpOworICAgICAgICAgICAgICAgICAgICAgICAgaW50IExBNDFfMiA9IGlucHV0LkxBKDEpOwogCiAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW5kZXg0MF8yID0gaW5wdXQuaW5kZXgoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbmRleDQxXzIgPSBpbnB1dC5pbmRleCgpOwogICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXQucmV3aW5kKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICBzID0gLTE7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIChzeW5wcmVkODVfSW50ZXJuYWxEYXRhRFNMKCkpICkge3MgPSAzO30KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICggKHN5bnByZWQ4Nl9JbnRlcm5hbERhdGFEU0woKSkgKSB7cyA9IDM7fQogCiAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICggKHRydWUpICkge3MgPSA1O30KIAogICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXQuc2VlayhpbmRleDQwXzIpOworICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXQuc2VlayhpbmRleDQxXzIpOwogICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCBzPj0wICkgcmV0dXJuIHM7CiAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGlmIChzdGF0ZS5iYWNrdHJhY2tpbmc+MCkge3N0YXRlLmZhaWxlZD10cnVlOyByZXR1cm4gLTE7fQogICAgICAgICAgICAgTm9WaWFibGVBbHRFeGNlcHRpb24gbnZhZSA9Ci0gICAgICAgICAgICAgICAgbmV3IE5vVmlhYmxlQWx0RXhjZXB0aW9uKGdldERlc2NyaXB0aW9uKCksIDQwLCBfcywgaW5wdXQpOworICAgICAgICAgICAgICAgIG5ldyBOb1ZpYWJsZUFsdEV4Y2VwdGlvbihnZXREZXNjcmlwdGlvbigpLCA0MSwgX3MsIGlucHV0KTsKICAgICAgICAgICAgIGVycm9yKG52YWUpOwogICAgICAgICAgICAgdGhyb3cgbnZhZTsKICAgICAgICAgfQogICAgIH0KICAgICBzdGF0aWMgZmluYWwgU3RyaW5nIGRmYV80MHMgPSAiXDFcMTBcMTFcdWZmZmYiOwogICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgZGZhXzQxcyA9ICJcMVw0XDdcMFwyXHVmZmZmIjsKLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIGRmYV80MnMgPSAiXDFcdTAwOWFcN1wwXDJcdWZmZmYiOworICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgZGZhXzQycyA9ICJcMVx1MDBhNlw3XDBcMlx1ZmZmZiI7CiAgICAgc3RhdGljIGZpbmFsIFN0cmluZyBkZmFfNDNzID0gIlwxMFx1ZmZmZlwxXDJcMVwxIjsKLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIGRmYV80NHMgPSAiXDFcdWZmZmZcMVw0XDFcNlwxXDBcMVwyXDFcNVwxXDNcMVwxXDJcdWZmZmZ9PiI7CisgICAgc3RhdGljIGZpbmFsIFN0cmluZyBkZmFfNDRzID0gIlwxXHVmZmZmXDFcMFwxXDVcMVw0XDFcM1wxXDFcMVw2XDFcMlwyXHVmZmZmfT4iOwogICAgIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBkZmFfNDVzID0gewotICAgICAgICAgICAgIlw1XDEwXDVcdWZmZmZcMlwxMFwxXDFcMVwyXDFcM1wxXDRcMVw1XDVcMTBcMVw3XDFcNlwyN1wxMFwyM1x1ZmZmZlwyXDEwXDI3XHVmZmZmXDFcMTBcMTJcdWZmZmZcMVwxMFw0XHVmZmZmXDFcMTBcMVx1ZmZmZlwzMFwxMFwxNVx1ZmZmZlwyXDEwXDFcdWZmZmZcMlwxMCIsCisgICAgICAgICAgICAiXDVcMTBcNVx1ZmZmZlwyXDEwXDFcMVwxXDJcMVwzXDFcNFwxXDVcNVwxMFwxXDdcMVw2XDI3XDEwXDMwXHVmZmZmXDJcMTBcMzFcdWZmZmZcMVwxMFwxNVx1ZmZmZlwxXDEwXDRcdWZmZmZcMVwxMFwxXHVmZmZmXDMwXDEwXDE3XHVmZmZmXDJcMTBcMVx1ZmZmZlwyXDEwIiwKICAgICAgICAgICAgICJcMVx1ZmZmZiIsCiAgICAgICAgICAgICAiXDFcdWZmZmYiLAogICAgICAgICAgICAgIlwxXHVmZmZmIiwKQEAgLTg2NzI1LDExICs5MTk1NCwxMSBAQAogICAgIHN0YXRpYyBmaW5hbCBzaG9ydFtdIGRmYV80NCA9IERGQS51bnBhY2tFbmNvZGVkU3RyaW5nKGRmYV80NHMpOwogICAgIHN0YXRpYyBmaW5hbCBzaG9ydFtdW10gZGZhXzQ1ID0gdW5wYWNrRW5jb2RlZFN0cmluZ0FycmF5KGRmYV80NXMpOwogCi0gICAgY2xhc3MgREZBOTUgZXh0ZW5kcyBERkEgeworICAgIGNsYXNzIERGQTEwOCBleHRlbmRzIERGQSB7CiAKLSAgICAgICAgcHVibGljIERGQTk1KEJhc2VSZWNvZ25pemVyIHJlY29nbml6ZXIpIHsKKyAgICAgICAgcHVibGljIERGQTEwOChCYXNlUmVjb2duaXplciByZWNvZ25pemVyKSB7CiAgICAgICAgICAgICB0aGlzLnJlY29nbml6ZXIgPSByZWNvZ25pemVyOwotICAgICAgICAgICAgdGhpcy5kZWNpc2lvbk51bWJlciA9IDk1OworICAgICAgICAgICAgdGhpcy5kZWNpc2lvbk51bWJlciA9IDEwODsKICAgICAgICAgICAgIHRoaXMuZW90ID0gZGZhXzIxOwogICAgICAgICAgICAgdGhpcy5lb2YgPSBkZmFfNDA7CiAgICAgICAgICAgICB0aGlzLm1pbiA9IGRmYV80MTsKQEAgLTg2NzM5LDEzMiArOTE5NjgsMTMyIEBACiAgICAgICAgICAgICB0aGlzLnRyYW5zaXRpb24gPSBkZmFfNDU7CiAgICAgICAgIH0KICAgICAgICAgcHVibGljIFN0cmluZyBnZXREZXNjcmlwdGlvbigpIHsKLSAgICAgICAgICAgIHJldHVybiAiMTAzOTA6MjogKCBydWxlX19YQXNzaWdubWVudF9fR3JvdXBfMV8xX18wICk/IjsKKyAgICAgICAgICAgIHJldHVybiAiMTE3Mjg6MjogKCBydWxlX19YQXNzaWdubWVudF9fR3JvdXBfMV8xX18wICk/IjsKICAgICAgICAgfQogICAgICAgICBwdWJsaWMgaW50IHNwZWNpYWxTdGF0ZVRyYW5zaXRpb24oaW50IHMsIEludFN0cmVhbSBfaW5wdXQpIHRocm93cyBOb1ZpYWJsZUFsdEV4Y2VwdGlvbiB7CiAgICAgICAgICAgICBUb2tlblN0cmVhbSBpbnB1dCA9IChUb2tlblN0cmVhbSlfaW5wdXQ7CiAgICAgICAgIAlpbnQgX3MgPSBzOwogICAgICAgICAgICAgc3dpdGNoICggcyApIHsKICAgICAgICAgICAgICAgICAgICAgY2FzZSAwIDogCi0gICAgICAgICAgICAgICAgICAgICAgICBpbnQgTEE5NV8zID0gaW5wdXQuTEEoMSk7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgTEExMDhfMSA9IGlucHV0LkxBKDEpOwogCiAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW5kZXg5NV8zID0gaW5wdXQuaW5kZXgoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbmRleDEwOF8xID0gaW5wdXQuaW5kZXgoKTsKICAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0LnJld2luZCgpOwogICAgICAgICAgICAgICAgICAgICAgICAgcyA9IC0xOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCAoc3lucHJlZDE0OV9JbnRlcm5hbERhdGFEU0woKSkgKSB7cyA9IDk7fQorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCAoc3lucHJlZDE2OF9JbnRlcm5hbERhdGFEU0woKSkgKSB7cyA9IDk7fQogCiAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICggKHRydWUpICkge3MgPSA4O30KIAogICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXQuc2VlayhpbmRleDk1XzMpOworICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXQuc2VlayhpbmRleDEwOF8xKTsKICAgICAgICAgICAgICAgICAgICAgICAgIGlmICggcz49MCApIHJldHVybiBzOwogICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgIGNhc2UgMSA6IAotICAgICAgICAgICAgICAgICAgICAgICAgaW50IExBOTVfNyA9IGlucHV0LkxBKDEpOworICAgICAgICAgICAgICAgICAgICAgICAgaW50IExBMTA4XzUgPSBpbnB1dC5MQSgxKTsKIAogICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgaW50IGluZGV4OTVfNyA9IGlucHV0LmluZGV4KCk7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW5kZXgxMDhfNSA9IGlucHV0LmluZGV4KCk7CiAgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dC5yZXdpbmQoKTsKICAgICAgICAgICAgICAgICAgICAgICAgIHMgPSAtMTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICggKHN5bnByZWQxNDlfSW50ZXJuYWxEYXRhRFNMKCkpICkge3MgPSA5O30KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICggKHN5bnByZWQxNjhfSW50ZXJuYWxEYXRhRFNMKCkpICkge3MgPSA5O30KIAogICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoICh0cnVlKSApIHtzID0gODt9CiAKICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0LnNlZWsoaW5kZXg5NV83KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0LnNlZWsoaW5kZXgxMDhfNSk7CiAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIHM+PTAgKSByZXR1cm4gczsKICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICBjYXNlIDIgOiAKLSAgICAgICAgICAgICAgICAgICAgICAgIGludCBMQTk1XzQgPSBpbnB1dC5MQSgxKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBMQTEwOF83ID0gaW5wdXQuTEEoMSk7CiAKICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbmRleDk1XzQgPSBpbnB1dC5pbmRleCgpOworICAgICAgICAgICAgICAgICAgICAgICAgaW50IGluZGV4MTA4XzcgPSBpbnB1dC5pbmRleCgpOwogICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXQucmV3aW5kKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICBzID0gLTE7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIChzeW5wcmVkMTQ5X0ludGVybmFsRGF0YURTTCgpKSApIHtzID0gOTt9CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIChzeW5wcmVkMTY4X0ludGVybmFsRGF0YURTTCgpKSApIHtzID0gOTt9CiAKICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKCAodHJ1ZSkgKSB7cyA9IDg7fQogCiAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICBpbnB1dC5zZWVrKGluZGV4OTVfNCk7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dC5zZWVrKGluZGV4MTA4XzcpOwogICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCBzPj0wICkgcmV0dXJuIHM7CiAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgY2FzZSAzIDogCi0gICAgICAgICAgICAgICAgICAgICAgICBpbnQgTEE5NV82ID0gaW5wdXQuTEEoMSk7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgTEExMDhfNCA9IGlucHV0LkxBKDEpOwogCiAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW5kZXg5NV82ID0gaW5wdXQuaW5kZXgoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbmRleDEwOF80ID0gaW5wdXQuaW5kZXgoKTsKICAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0LnJld2luZCgpOwogICAgICAgICAgICAgICAgICAgICAgICAgcyA9IC0xOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCAoc3lucHJlZDE0OV9JbnRlcm5hbERhdGFEU0woKSkgKSB7cyA9IDk7fQorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCAoc3lucHJlZDE2OF9JbnRlcm5hbERhdGFEU0woKSkgKSB7cyA9IDk7fQogCiAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICggKHRydWUpICkge3MgPSA4O30KIAogICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXQuc2VlayhpbmRleDk1XzYpOworICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXQuc2VlayhpbmRleDEwOF80KTsKICAgICAgICAgICAgICAgICAgICAgICAgIGlmICggcz49MCApIHJldHVybiBzOwogICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgIGNhc2UgNCA6IAotICAgICAgICAgICAgICAgICAgICAgICAgaW50IExBOTVfMSA9IGlucHV0LkxBKDEpOworICAgICAgICAgICAgICAgICAgICAgICAgaW50IExBMTA4XzMgPSBpbnB1dC5MQSgxKTsKIAogICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgaW50IGluZGV4OTVfMSA9IGlucHV0LmluZGV4KCk7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW5kZXgxMDhfMyA9IGlucHV0LmluZGV4KCk7CiAgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dC5yZXdpbmQoKTsKICAgICAgICAgICAgICAgICAgICAgICAgIHMgPSAtMTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICggKHN5bnByZWQxNDlfSW50ZXJuYWxEYXRhRFNMKCkpICkge3MgPSA5O30KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICggKHN5bnByZWQxNjhfSW50ZXJuYWxEYXRhRFNMKCkpICkge3MgPSA5O30KIAogICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoICh0cnVlKSApIHtzID0gODt9CiAKICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0LnNlZWsoaW5kZXg5NV8xKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0LnNlZWsoaW5kZXgxMDhfMyk7CiAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIHM+PTAgKSByZXR1cm4gczsKICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICBjYXNlIDUgOiAKLSAgICAgICAgICAgICAgICAgICAgICAgIGludCBMQTk1XzUgPSBpbnB1dC5MQSgxKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBMQTEwOF8yID0gaW5wdXQuTEEoMSk7CiAKICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbmRleDk1XzUgPSBpbnB1dC5pbmRleCgpOworICAgICAgICAgICAgICAgICAgICAgICAgaW50IGluZGV4MTA4XzIgPSBpbnB1dC5pbmRleCgpOwogICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXQucmV3aW5kKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICBzID0gLTE7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIChzeW5wcmVkMTQ5X0ludGVybmFsRGF0YURTTCgpKSApIHtzID0gOTt9CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIChzeW5wcmVkMTY4X0ludGVybmFsRGF0YURTTCgpKSApIHtzID0gOTt9CiAKICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKCAodHJ1ZSkgKSB7cyA9IDg7fQogCiAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICBpbnB1dC5zZWVrKGluZGV4OTVfNSk7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dC5zZWVrKGluZGV4MTA4XzIpOwogICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCBzPj0wICkgcmV0dXJuIHM7CiAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgY2FzZSA2IDogCi0gICAgICAgICAgICAgICAgICAgICAgICBpbnQgTEE5NV8yID0gaW5wdXQuTEEoMSk7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgTEExMDhfNiA9IGlucHV0LkxBKDEpOwogCiAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW5kZXg5NV8yID0gaW5wdXQuaW5kZXgoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbmRleDEwOF82ID0gaW5wdXQuaW5kZXgoKTsKICAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0LnJld2luZCgpOwogICAgICAgICAgICAgICAgICAgICAgICAgcyA9IC0xOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCAoc3lucHJlZDE0OV9JbnRlcm5hbERhdGFEU0woKSkgKSB7cyA9IDk7fQorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCAoc3lucHJlZDE2OF9JbnRlcm5hbERhdGFEU0woKSkgKSB7cyA9IDk7fQogCiAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICggKHRydWUpICkge3MgPSA4O30KIAogICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXQuc2VlayhpbmRleDk1XzIpOworICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXQuc2VlayhpbmRleDEwOF82KTsKICAgICAgICAgICAgICAgICAgICAgICAgIGlmICggcz49MCApIHJldHVybiBzOwogICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBpZiAoc3RhdGUuYmFja3RyYWNraW5nPjApIHtzdGF0ZS5mYWlsZWQ9dHJ1ZTsgcmV0dXJuIC0xO30KICAgICAgICAgICAgIE5vVmlhYmxlQWx0RXhjZXB0aW9uIG52YWUgPQotICAgICAgICAgICAgICAgIG5ldyBOb1ZpYWJsZUFsdEV4Y2VwdGlvbihnZXREZXNjcmlwdGlvbigpLCA5NSwgX3MsIGlucHV0KTsKKyAgICAgICAgICAgICAgICBuZXcgTm9WaWFibGVBbHRFeGNlcHRpb24oZ2V0RGVzY3JpcHRpb24oKSwgMTA4LCBfcywgaW5wdXQpOwogICAgICAgICAgICAgZXJyb3IobnZhZSk7CiAgICAgICAgICAgICB0aHJvdyBudmFlOwogICAgICAgICB9CiAgICAgfQogICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgZGZhXzQ2cyA9ICJcMVwxXDEyXHVmZmZmIjsKICAgICBzdGF0aWMgZmluYWwgU3RyaW5nIGRmYV80N3MgPSAiXDFcNFwxXHVmZmZmXDEwXDBcMVx1ZmZmZiI7Ci0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBkZmFfNDhzID0gIlwxXHUwMDlhXDFcdWZmZmZcMTBcMFwxXHVmZmZmIjsKKyAgICBzdGF0aWMgZmluYWwgU3RyaW5nIGRmYV80OHMgPSAiXDFcdTAwYTZcMVx1ZmZmZlwxMFwwXDFcdWZmZmYiOwogICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgZGZhXzQ5cyA9ICJcMVx1ZmZmZlwxXDJcMTBcdWZmZmZcMVwxIjsKLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIGRmYV81MHMgPSAiXDJcdWZmZmZcMVwyXDFcNVwxXDZcMVwzXDFcMVwxXDdcMVwwXDFcNFwxXHVmZmZmfT4iOworICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgZGZhXzUwcyA9ICJcMlx1ZmZmZlwxXDVcMVw2XDFcN1wxXDNcMVwyXDFcMFwxXDFcMVw0XDFcdWZmZmZ9PiI7CiAgICAgc3RhdGljIGZpbmFsIFN0cmluZ1tdIGRmYV81MXMgPSB7Ci0gICAgICAgICAgICAiXDVcMVw1XHVmZmZmXDE0XDFcMVwzXDFcMlwxXDRcMVw1XDFcNlwxXDdcMVwxMFwxXDExXDIxXDFcMjNcdWZmZmZcMlwxXDI3XHVmZmZmXDFcMVwxMlx1ZmZmZlwxXDFcNFx1ZmZmZlwxXDFcMVx1ZmZmZlwzMFwxXDE1XHVmZmZmXDJcMVwxXHVmZmZmXDJcMSIsCisgICAgICAgICAgICAiXDVcMVw1XHVmZmZmXDE0XDFcMVwzXDFcMlwxXDRcMVw1XDFcNlwxXDdcMVwxMFwxXDExXDIxXDFcMzBcdWZmZmZcMlwxXDMxXHVmZmZmXDFcMVwxNVx1ZmZmZlwxXDFcNFx1ZmZmZlwxXDFcMVx1ZmZmZlwzMFwxXDE3XHVmZmZmXDJcMVwxXHVmZmZmXDJcMSIsCiAgICAgICAgICAgICAiIiwKICAgICAgICAgICAgICJcMVx1ZmZmZiIsCiAgICAgICAgICAgICAiXDFcdWZmZmYiLApAQCAtODY4ODMsMTEgKzkyMTEyLDExIEBACiAgICAgc3RhdGljIGZpbmFsIHNob3J0W10gZGZhXzUwID0gREZBLnVucGFja0VuY29kZWRTdHJpbmcoZGZhXzUwcyk7CiAgICAgc3RhdGljIGZpbmFsIHNob3J0W11bXSBkZmFfNTEgPSB1bnBhY2tFbmNvZGVkU3RyaW5nQXJyYXkoZGZhXzUxcyk7CiAKLSAgICBjbGFzcyBERkExMDEgZXh0ZW5kcyBERkEgeworICAgIGNsYXNzIERGQTExNCBleHRlbmRzIERGQSB7CiAKLSAgICAgICAgcHVibGljIERGQTEwMShCYXNlUmVjb2duaXplciByZWNvZ25pemVyKSB7CisgICAgICAgIHB1YmxpYyBERkExMTQoQmFzZVJlY29nbml6ZXIgcmVjb2duaXplcikgewogICAgICAgICAgICAgdGhpcy5yZWNvZ25pemVyID0gcmVjb2duaXplcjsKLSAgICAgICAgICAgIHRoaXMuZGVjaXNpb25OdW1iZXIgPSAxMDE7CisgICAgICAgICAgICB0aGlzLmRlY2lzaW9uTnVtYmVyID0gMTE0OwogICAgICAgICAgICAgdGhpcy5lb3QgPSBkZmFfMTU7CiAgICAgICAgICAgICB0aGlzLmVvZiA9IGRmYV80NjsKICAgICAgICAgICAgIHRoaXMubWluID0gZGZhXzQ3OwpAQCAtODY4OTcsMTM2ICs5MjEyNiwxMzYgQEAKICAgICAgICAgICAgIHRoaXMudHJhbnNpdGlvbiA9IGRmYV81MTsKICAgICAgICAgfQogICAgICAgICBwdWJsaWMgU3RyaW5nIGdldERlc2NyaXB0aW9uKCkgewotICAgICAgICAgICAgcmV0dXJuICIoKSogbG9vcGJhY2sgb2YgMTE2ODY6MjogKCBydWxlX19YT3RoZXJPcGVyYXRvckV4cHJlc3Npb25fX0dyb3VwXzFfXzAgKSoiOworICAgICAgICAgICAgcmV0dXJuICIoKSogbG9vcGJhY2sgb2YgMTMwMjQ6MjogKCBydWxlX19YT3RoZXJPcGVyYXRvckV4cHJlc3Npb25fX0dyb3VwXzFfXzAgKSoiOwogICAgICAgICB9CiAgICAgICAgIHB1YmxpYyBpbnQgc3BlY2lhbFN0YXRlVHJhbnNpdGlvbihpbnQgcywgSW50U3RyZWFtIF9pbnB1dCkgdGhyb3dzIE5vVmlhYmxlQWx0RXhjZXB0aW9uIHsKICAgICAgICAgICAgIFRva2VuU3RyZWFtIGlucHV0ID0gKFRva2VuU3RyZWFtKV9pbnB1dDsKICAgICAgICAgCWludCBfcyA9IHM7CiAgICAgICAgICAgICBzd2l0Y2ggKCBzICkgewogICAgICAgICAgICAgICAgICAgICBjYXNlIDAgOiAKLSAgICAgICAgICAgICAgICAgICAgICAgIGludCBMQTEwMV84ID0gaW5wdXQuTEEoMSk7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgTEExMTRfNyA9IGlucHV0LkxBKDEpOwogCiAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW5kZXgxMDFfOCA9IGlucHV0LmluZGV4KCk7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW5kZXgxMTRfNyA9IGlucHV0LmluZGV4KCk7CiAgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dC5yZXdpbmQoKTsKICAgICAgICAgICAgICAgICAgICAgICAgIHMgPSAtMTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICggKHN5bnByZWQxNTVfSW50ZXJuYWxEYXRhRFNMKCkpICkge3MgPSAxMDt9CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIChzeW5wcmVkMTc0X0ludGVybmFsRGF0YURTTCgpKSApIHtzID0gMTA7fQogCiAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICggKHRydWUpICkge3MgPSAxO30KIAogICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXQuc2VlayhpbmRleDEwMV84KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0LnNlZWsoaW5kZXgxMTRfNyk7CiAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIHM+PTAgKSByZXR1cm4gczsKICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICBjYXNlIDEgOiAKLSAgICAgICAgICAgICAgICAgICAgICAgIGludCBMQTEwMV82ID0gaW5wdXQuTEEoMSk7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgTEExMTRfOCA9IGlucHV0LkxBKDEpOwogCiAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW5kZXgxMDFfNiA9IGlucHV0LmluZGV4KCk7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW5kZXgxMTRfOCA9IGlucHV0LmluZGV4KCk7CiAgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dC5yZXdpbmQoKTsKICAgICAgICAgICAgICAgICAgICAgICAgIHMgPSAtMTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICggKHN5bnByZWQxNTVfSW50ZXJuYWxEYXRhRFNMKCkpICkge3MgPSAxMDt9CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIChzeW5wcmVkMTc0X0ludGVybmFsRGF0YURTTCgpKSApIHtzID0gMTA7fQogCiAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICggKHRydWUpICkge3MgPSAxO30KIAogICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXQuc2VlayhpbmRleDEwMV82KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0LnNlZWsoaW5kZXgxMTRfOCk7CiAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIHM+PTAgKSByZXR1cm4gczsKICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICBjYXNlIDIgOiAKLSAgICAgICAgICAgICAgICAgICAgICAgIGludCBMQTEwMV8yID0gaW5wdXQuTEEoMSk7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgTEExMTRfNiA9IGlucHV0LkxBKDEpOwogCiAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW5kZXgxMDFfMiA9IGlucHV0LmluZGV4KCk7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW5kZXgxMTRfNiA9IGlucHV0LmluZGV4KCk7CiAgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dC5yZXdpbmQoKTsKICAgICAgICAgICAgICAgICAgICAgICAgIHMgPSAtMTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICggKHN5bnByZWQxNTVfSW50ZXJuYWxEYXRhRFNMKCkpICkge3MgPSAxMDt9CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIChzeW5wcmVkMTc0X0ludGVybmFsRGF0YURTTCgpKSApIHtzID0gMTA7fQogCiAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICggKHRydWUpICkge3MgPSAxO30KIAogICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXQuc2VlayhpbmRleDEwMV8yKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0LnNlZWsoaW5kZXgxMTRfNik7CiAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIHM+PTAgKSByZXR1cm4gczsKICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICBjYXNlIDMgOiAKLSAgICAgICAgICAgICAgICAgICAgICAgIGludCBMQTEwMV81ID0gaW5wdXQuTEEoMSk7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgTEExMTRfNSA9IGlucHV0LkxBKDEpOwogCiAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW5kZXgxMDFfNSA9IGlucHV0LmluZGV4KCk7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW5kZXgxMTRfNSA9IGlucHV0LmluZGV4KCk7CiAgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dC5yZXdpbmQoKTsKICAgICAgICAgICAgICAgICAgICAgICAgIHMgPSAtMTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICggKHN5bnByZWQxNTVfSW50ZXJuYWxEYXRhRFNMKCkpICkge3MgPSAxMDt9CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIChzeW5wcmVkMTc0X0ludGVybmFsRGF0YURTTCgpKSApIHtzID0gMTA7fQogCiAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICggKHRydWUpICkge3MgPSAxO30KIAogICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXQuc2VlayhpbmRleDEwMV81KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0LnNlZWsoaW5kZXgxMTRfNSk7CiAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIHM+PTAgKSByZXR1cm4gczsKICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICBjYXNlIDQgOiAKLSAgICAgICAgICAgICAgICAgICAgICAgIGludCBMQTEwMV85ID0gaW5wdXQuTEEoMSk7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgTEExMTRfOSA9IGlucHV0LkxBKDEpOwogCiAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW5kZXgxMDFfOSA9IGlucHV0LmluZGV4KCk7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW5kZXgxMTRfOSA9IGlucHV0LmluZGV4KCk7CiAgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dC5yZXdpbmQoKTsKICAgICAgICAgICAgICAgICAgICAgICAgIHMgPSAtMTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICggKHN5bnByZWQxNTVfSW50ZXJuYWxEYXRhRFNMKCkpICkge3MgPSAxMDt9CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIChzeW5wcmVkMTc0X0ludGVybmFsRGF0YURTTCgpKSApIHtzID0gMTA7fQogCiAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICggKHRydWUpICkge3MgPSAxO30KIAogICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXQuc2VlayhpbmRleDEwMV85KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0LnNlZWsoaW5kZXgxMTRfOSk7CiAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIHM+PTAgKSByZXR1cm4gczsKICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICBjYXNlIDUgOiAKLSAgICAgICAgICAgICAgICAgICAgICAgIGludCBMQTEwMV8zID0gaW5wdXQuTEEoMSk7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgTEExMTRfMiA9IGlucHV0LkxBKDEpOwogCiAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW5kZXgxMDFfMyA9IGlucHV0LmluZGV4KCk7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW5kZXgxMTRfMiA9IGlucHV0LmluZGV4KCk7CiAgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dC5yZXdpbmQoKTsKICAgICAgICAgICAgICAgICAgICAgICAgIHMgPSAtMTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICggKHN5bnByZWQxNTVfSW50ZXJuYWxEYXRhRFNMKCkpICkge3MgPSAxMDt9CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIChzeW5wcmVkMTc0X0ludGVybmFsRGF0YURTTCgpKSApIHtzID0gMTA7fQogCiAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICggKHRydWUpICkge3MgPSAxO30KIAogICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXQuc2VlayhpbmRleDEwMV8zKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0LnNlZWsoaW5kZXgxMTRfMik7CiAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIHM+PTAgKSByZXR1cm4gczsKICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICBjYXNlIDYgOiAKLSAgICAgICAgICAgICAgICAgICAgICAgIGludCBMQTEwMV80ID0gaW5wdXQuTEEoMSk7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgTEExMTRfMyA9IGlucHV0LkxBKDEpOwogCiAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW5kZXgxMDFfNCA9IGlucHV0LmluZGV4KCk7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW5kZXgxMTRfMyA9IGlucHV0LmluZGV4KCk7CiAgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dC5yZXdpbmQoKTsKICAgICAgICAgICAgICAgICAgICAgICAgIHMgPSAtMTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICggKHN5bnByZWQxNTVfSW50ZXJuYWxEYXRhRFNMKCkpICkge3MgPSAxMDt9CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIChzeW5wcmVkMTc0X0ludGVybmFsRGF0YURTTCgpKSApIHtzID0gMTA7fQogCiAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICggKHRydWUpICkge3MgPSAxO30KIAogICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXQuc2VlayhpbmRleDEwMV80KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0LnNlZWsoaW5kZXgxMTRfMyk7CiAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIHM+PTAgKSByZXR1cm4gczsKICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICBjYXNlIDcgOiAKLSAgICAgICAgICAgICAgICAgICAgICAgIGludCBMQTEwMV83ID0gaW5wdXQuTEEoMSk7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgTEExMTRfNCA9IGlucHV0LkxBKDEpOwogCiAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW5kZXgxMDFfNyA9IGlucHV0LmluZGV4KCk7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW5kZXgxMTRfNCA9IGlucHV0LmluZGV4KCk7CiAgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dC5yZXdpbmQoKTsKICAgICAgICAgICAgICAgICAgICAgICAgIHMgPSAtMTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICggKHN5bnByZWQxNTVfSW50ZXJuYWxEYXRhRFNMKCkpICkge3MgPSAxMDt9CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIChzeW5wcmVkMTc0X0ludGVybmFsRGF0YURTTCgpKSApIHtzID0gMTA7fQogCiAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICggKHRydWUpICkge3MgPSAxO30KIAogICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXQuc2VlayhpbmRleDEwMV83KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0LnNlZWsoaW5kZXgxMTRfNCk7CiAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIHM+PTAgKSByZXR1cm4gczsKICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgaWYgKHN0YXRlLmJhY2t0cmFja2luZz4wKSB7c3RhdGUuZmFpbGVkPXRydWU7IHJldHVybiAtMTt9CiAgICAgICAgICAgICBOb1ZpYWJsZUFsdEV4Y2VwdGlvbiBudmFlID0KLSAgICAgICAgICAgICAgICBuZXcgTm9WaWFibGVBbHRFeGNlcHRpb24oZ2V0RGVzY3JpcHRpb24oKSwgMTAxLCBfcywgaW5wdXQpOworICAgICAgICAgICAgICAgIG5ldyBOb1ZpYWJsZUFsdEV4Y2VwdGlvbihnZXREZXNjcmlwdGlvbigpLCAxMTQsIF9zLCBpbnB1dCk7CiAgICAgICAgICAgICBlcnJvcihudmFlKTsKICAgICAgICAgICAgIHRocm93IG52YWU7CiAgICAgICAgIH0KQEAgLTg3MDM0LDExICs5MjI2MywxMSBAQAogICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgZGZhXzUycyA9ICJcMTE2XHVmZmZmIjsKICAgICBzdGF0aWMgZmluYWwgU3RyaW5nIGRmYV81M3MgPSAiXDFcMlwxMTVcdWZmZmYiOwogICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgZGZhXzU0cyA9ICJcMVw0XDFcMFwxMTRcdWZmZmYiOwotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgZGZhXzU1cyA9ICJcMVx1MDA5YVwxXDBcMTE0XHVmZmZmIjsKKyAgICBzdGF0aWMgZmluYWwgU3RyaW5nIGRmYV81NXMgPSAiXDFcdTAwYTZcMVwwXDExNFx1ZmZmZiI7CiAgICAgc3RhdGljIGZpbmFsIFN0cmluZyBkZmFfNTZzID0gIlwyXHVmZmZmXDFcMlwxMTJcdWZmZmZcMVwxIjsKICAgICBzdGF0aWMgZmluYWwgU3RyaW5nIGRmYV81N3MgPSAiXDFcdWZmZmZcMVwwXDExNFx1ZmZmZn0+IjsKICAgICBzdGF0aWMgZmluYWwgU3RyaW5nW10gZGZhXzU4cyA9IHsKLSAgICAgICAgICAgICJcNVwyXDVcdWZmZmZcNDVcMlwyM1x1ZmZmZlwyXDJcMjdcdWZmZmZcMVwyXDEyXHVmZmZmXDFcMlw0XHVmZmZmXDFcMlwxXHVmZmZmXDFcMVwyN1wyXDE1XHVmZmZmXDJcMlwxXHVmZmZmXDJcMiIsCisgICAgICAgICAgICAiXDVcMlw1XHVmZmZmXDQ1XDJcMzBcdWZmZmZcMlwyXDMxXHVmZmZmXDFcMlwxNVx1ZmZmZlwxXDJcNFx1ZmZmZlwxXDJcMVx1ZmZmZlwxXDFcMjdcMlwxN1x1ZmZmZlwyXDJcMVx1ZmZmZlwyXDIiLAogICAgICAgICAgICAgIlwxXHVmZmZmIiwKICAgICAgICAgICAgICIiLAogICAgICAgICAgICAgIiIsCkBAIC04NzEyNiwxMSArOTIzNTUsMTEgQEAKICAgICBzdGF0aWMgZmluYWwgc2hvcnRbXSBkZmFfNTcgPSBERkEudW5wYWNrRW5jb2RlZFN0cmluZyhkZmFfNTdzKTsKICAgICBzdGF0aWMgZmluYWwgc2hvcnRbXVtdIGRmYV81OCA9IHVucGFja0VuY29kZWRTdHJpbmdBcnJheShkZmFfNThzKTsKIAotICAgIGNsYXNzIERGQTEwOCBleHRlbmRzIERGQSB7CisgICAgY2xhc3MgREZBMTIxIGV4dGVuZHMgREZBIHsKIAotICAgICAgICBwdWJsaWMgREZBMTA4KEJhc2VSZWNvZ25pemVyIHJlY29nbml6ZXIpIHsKKyAgICAgICAgcHVibGljIERGQTEyMShCYXNlUmVjb2duaXplciByZWNvZ25pemVyKSB7CiAgICAgICAgICAgICB0aGlzLnJlY29nbml6ZXIgPSByZWNvZ25pemVyOwotICAgICAgICAgICAgdGhpcy5kZWNpc2lvbk51bWJlciA9IDEwODsKKyAgICAgICAgICAgIHRoaXMuZGVjaXNpb25OdW1iZXIgPSAxMjE7CiAgICAgICAgICAgICB0aGlzLmVvdCA9IGRmYV81MjsKICAgICAgICAgICAgIHRoaXMuZW9mID0gZGZhXzUzOwogICAgICAgICAgICAgdGhpcy5taW4gPSBkZmFfNTQ7CkBAIC04NzE0MCwzNyArOTIzNjksMzcgQEAKICAgICAgICAgICAgIHRoaXMudHJhbnNpdGlvbiA9IGRmYV81ODsKICAgICAgICAgfQogICAgICAgICBwdWJsaWMgU3RyaW5nIGdldERlc2NyaXB0aW9uKCkgewotICAgICAgICAgICAgcmV0dXJuICIxMzI4MDoyOiAoIHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fR3JvdXBfMV8xXzNfXzAgKT8iOworICAgICAgICAgICAgcmV0dXJuICIxNDYxODoyOiAoIHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fR3JvdXBfMV8xXzNfXzAgKT8iOwogICAgICAgICB9CiAgICAgICAgIHB1YmxpYyBpbnQgc3BlY2lhbFN0YXRlVHJhbnNpdGlvbihpbnQgcywgSW50U3RyZWFtIF9pbnB1dCkgdGhyb3dzIE5vVmlhYmxlQWx0RXhjZXB0aW9uIHsKICAgICAgICAgICAgIFRva2VuU3RyZWFtIGlucHV0ID0gKFRva2VuU3RyZWFtKV9pbnB1dDsKICAgICAgICAgCWludCBfcyA9IHM7CiAgICAgICAgICAgICBzd2l0Y2ggKCBzICkgewogICAgICAgICAgICAgICAgICAgICBjYXNlIDAgOiAKLSAgICAgICAgICAgICAgICAgICAgICAgIGludCBMQTEwOF8xID0gaW5wdXQuTEEoMSk7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgTEExMjFfMSA9IGlucHV0LkxBKDEpOwogCiAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW5kZXgxMDhfMSA9IGlucHV0LmluZGV4KCk7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW5kZXgxMjFfMSA9IGlucHV0LmluZGV4KCk7CiAgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dC5yZXdpbmQoKTsKICAgICAgICAgICAgICAgICAgICAgICAgIHMgPSAtMTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICggKHN5bnByZWQxNjJfSW50ZXJuYWxEYXRhRFNMKCkpICkge3MgPSA3Nzt9CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIChzeW5wcmVkMTgxX0ludGVybmFsRGF0YURTTCgpKSApIHtzID0gNzc7fQogCiAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICggKHRydWUpICkge3MgPSAyO30KIAogICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXQuc2VlayhpbmRleDEwOF8xKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0LnNlZWsoaW5kZXgxMjFfMSk7CiAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIHM+PTAgKSByZXR1cm4gczsKICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgaWYgKHN0YXRlLmJhY2t0cmFja2luZz4wKSB7c3RhdGUuZmFpbGVkPXRydWU7IHJldHVybiAtMTt9CiAgICAgICAgICAgICBOb1ZpYWJsZUFsdEV4Y2VwdGlvbiBudmFlID0KLSAgICAgICAgICAgICAgICBuZXcgTm9WaWFibGVBbHRFeGNlcHRpb24oZ2V0RGVzY3JpcHRpb24oKSwgMTA4LCBfcywgaW5wdXQpOworICAgICAgICAgICAgICAgIG5ldyBOb1ZpYWJsZUFsdEV4Y2VwdGlvbihnZXREZXNjcmlwdGlvbigpLCAxMjEsIF9zLCBpbnB1dCk7CiAgICAgICAgICAgICBlcnJvcihudmFlKTsKICAgICAgICAgICAgIHRocm93IG52YWU7CiAgICAgICAgIH0KICAgICB9CiAgICAgc3RhdGljIGZpbmFsIFN0cmluZ1tdIGRmYV81OXMgPSB7Ci0gICAgICAgICAgICAiXDVcMlw1XHVmZmZmXDQ1XDJcMjNcdWZmZmZcMlwyXDI3XHVmZmZmXDFcMlwxMlx1ZmZmZlwxXDJcNFx1ZmZmZlwxXDJcMVx1ZmZmZlw1XDJcMVwxXDIyXDJcMTVcdWZmZmZcMlwyXDFcdWZmZmZcMlwyIiwKKyAgICAgICAgICAgICJcNVwyXDVcdWZmZmZcNDVcMlwzMFx1ZmZmZlwyXDJcMzFcdWZmZmZcMVwyXDE1XHVmZmZmXDFcMlw0XHVmZmZmXDFcMlwxXHVmZmZmXDVcMlwxXDFcMjJcMlwxN1x1ZmZmZlwyXDJcMVx1ZmZmZlwyXDIiLAogICAgICAgICAgICAgIlwxXHVmZmZmIiwKICAgICAgICAgICAgICIiLAogICAgICAgICAgICAgIiIsCkBAIC04NzI1MSwxMSArOTI0ODAsMTEgQEAKICAgICB9OwogICAgIHN0YXRpYyBmaW5hbCBzaG9ydFtdW10gZGZhXzU5ID0gdW5wYWNrRW5jb2RlZFN0cmluZ0FycmF5KGRmYV81OXMpOwogCi0gICAgY2xhc3MgREZBMTA5IGV4dGVuZHMgREZBIHsKKyAgICBjbGFzcyBERkExMjIgZXh0ZW5kcyBERkEgewogCi0gICAgICAgIHB1YmxpYyBERkExMDkoQmFzZVJlY29nbml6ZXIgcmVjb2duaXplcikgeworICAgICAgICBwdWJsaWMgREZBMTIyKEJhc2VSZWNvZ25pemVyIHJlY29nbml6ZXIpIHsKICAgICAgICAgICAgIHRoaXMucmVjb2duaXplciA9IHJlY29nbml6ZXI7Ci0gICAgICAgICAgICB0aGlzLmRlY2lzaW9uTnVtYmVyID0gMTA5OworICAgICAgICAgICAgdGhpcy5kZWNpc2lvbk51bWJlciA9IDEyMjsKICAgICAgICAgICAgIHRoaXMuZW90ID0gZGZhXzUyOwogICAgICAgICAgICAgdGhpcy5lb2YgPSBkZmFfNTM7CiAgICAgICAgICAgICB0aGlzLm1pbiA9IGRmYV81NDsKQEAgLTg3MjY1LDQyICs5MjQ5NCw0MiBAQAogICAgICAgICAgICAgdGhpcy50cmFuc2l0aW9uID0gZGZhXzU5OwogICAgICAgICB9CiAgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0RGVzY3JpcHRpb24oKSB7Ci0gICAgICAgICAgICByZXR1cm4gIjEzMzA2OjI6ICggcnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19NZW1iZXJDYWxsQXJndW1lbnRzQXNzaWdubWVudF8xXzFfNCApPyI7CisgICAgICAgICAgICByZXR1cm4gIjE0NjQ0OjI6ICggcnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19NZW1iZXJDYWxsQXJndW1lbnRzQXNzaWdubWVudF8xXzFfNCApPyI7CiAgICAgICAgIH0KICAgICAgICAgcHVibGljIGludCBzcGVjaWFsU3RhdGVUcmFuc2l0aW9uKGludCBzLCBJbnRTdHJlYW0gX2lucHV0KSB0aHJvd3MgTm9WaWFibGVBbHRFeGNlcHRpb24gewogICAgICAgICAgICAgVG9rZW5TdHJlYW0gaW5wdXQgPSAoVG9rZW5TdHJlYW0pX2lucHV0OwogICAgICAgICAJaW50IF9zID0gczsKICAgICAgICAgICAgIHN3aXRjaCAoIHMgKSB7CiAgICAgICAgICAgICAgICAgICAgIGNhc2UgMCA6IAotICAgICAgICAgICAgICAgICAgICAgICAgaW50IExBMTA5XzEgPSBpbnB1dC5MQSgxKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBMQTEyMl8xID0gaW5wdXQuTEEoMSk7CiAKICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbmRleDEwOV8xID0gaW5wdXQuaW5kZXgoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbmRleDEyMl8xID0gaW5wdXQuaW5kZXgoKTsKICAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0LnJld2luZCgpOwogICAgICAgICAgICAgICAgICAgICAgICAgcyA9IC0xOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCAoc3lucHJlZDE2M19JbnRlcm5hbERhdGFEU0woKSkgKSB7cyA9IDc3O30KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICggKHN5bnByZWQxODJfSW50ZXJuYWxEYXRhRFNMKCkpICkge3MgPSA3Nzt9CiAKICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKCAodHJ1ZSkgKSB7cyA9IDI7fQogCiAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICBpbnB1dC5zZWVrKGluZGV4MTA5XzEpOworICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXQuc2VlayhpbmRleDEyMl8xKTsKICAgICAgICAgICAgICAgICAgICAgICAgIGlmICggcz49MCApIHJldHVybiBzOwogICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBpZiAoc3RhdGUuYmFja3RyYWNraW5nPjApIHtzdGF0ZS5mYWlsZWQ9dHJ1ZTsgcmV0dXJuIC0xO30KICAgICAgICAgICAgIE5vVmlhYmxlQWx0RXhjZXB0aW9uIG52YWUgPQotICAgICAgICAgICAgICAgIG5ldyBOb1ZpYWJsZUFsdEV4Y2VwdGlvbihnZXREZXNjcmlwdGlvbigpLCAxMDksIF9zLCBpbnB1dCk7CisgICAgICAgICAgICAgICAgbmV3IE5vVmlhYmxlQWx0RXhjZXB0aW9uKGdldERlc2NyaXB0aW9uKCksIDEyMiwgX3MsIGlucHV0KTsKICAgICAgICAgICAgIGVycm9yKG52YWUpOwogICAgICAgICAgICAgdGhyb3cgbnZhZTsKICAgICAgICAgfQogICAgIH0KICAgICBzdGF0aWMgZmluYWwgU3RyaW5nIGRmYV82MHMgPSAiXDQ2XHVmZmZmIjsKICAgICBzdGF0aWMgZmluYWwgU3RyaW5nIGRmYV82MXMgPSAiXDFcNFwyXDBcNDNcdWZmZmYiOwotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgZGZhXzYycyA9ICJcMVx1MDA5YVwyXDBcNDNcdWZmZmYiOworICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgZGZhXzYycyA9ICJcMVx1MDBhNlwyXDBcNDNcdWZmZmYiOwogICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgZGZhXzYzcyA9ICJcM1x1ZmZmZlwxXDFcMVx1ZmZmZlwxXDJcNDBcdWZmZmYiOwogICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgZGZhXzY0cyA9ICJcMVx1ZmZmZlwxXDBcMVwxXDQzXHVmZmZmfT4iOwogICAgIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBkZmFfNjVzID0gewotICAgICAgICAgICAgIlwxXDVcMVwxXDNcNVwyMlx1ZmZmZlwxXDVcM1x1ZmZmZlwxXDNcMlx1ZmZmZlwyXDVcNFx1ZmZmZlwxXDVcM1x1ZmZmZlw3XDVcMjNcdWZmZmZcMVw1XDMwXHVmZmZmXDFcNVwyMVx1ZmZmZlwxXDJcMlx1ZmZmZlwzXDVcMVx1ZmZmZlwxXDVcMVx1ZmZmZlwxXDVcM1x1ZmZmZlwxMFw1XDFcdWZmZmZcMVw1XDIwXHVmZmZmXDFcM1wyXDUiLAorICAgICAgICAgICAgIlwxXDVcMVwxXDNcNVwyMlx1ZmZmZlwxXDVcM1x1ZmZmZlwxXDNcMlx1ZmZmZlwyXDVcNFx1ZmZmZlwxXDVcM1x1ZmZmZlw3XDVcMzBcdWZmZmZcMVw1XDMyXHVmZmZmXDFcNVwyNFx1ZmZmZlwxXDJcMlx1ZmZmZlwzXDVcMVx1ZmZmZlwxXDVcMVx1ZmZmZlwxXDVcM1x1ZmZmZlwxMFw1XDFcdWZmZmZcMVw1XDIyXHVmZmZmXDFcM1wyXDUiLAogICAgICAgICAgICAgIlwxXHVmZmZmIiwKICAgICAgICAgICAgICJcMVx1ZmZmZiIsCiAgICAgICAgICAgICAiIiwKQEAgLTg3MzQ3LDExICs5MjU3NiwxMSBAQAogICAgIHN0YXRpYyBmaW5hbCBzaG9ydFtdIGRmYV82NCA9IERGQS51bnBhY2tFbmNvZGVkU3RyaW5nKGRmYV82NHMpOwogICAgIHN0YXRpYyBmaW5hbCBzaG9ydFtdW10gZGZhXzY1ID0gdW5wYWNrRW5jb2RlZFN0cmluZ0FycmF5KGRmYV82NXMpOwogCi0gICAgY2xhc3MgREZBMTE3IGV4dGVuZHMgREZBIHsKKyAgICBjbGFzcyBERkExMzAgZXh0ZW5kcyBERkEgewogCi0gICAgICAgIHB1YmxpYyBERkExMTcoQmFzZVJlY29nbml6ZXIgcmVjb2duaXplcikgeworICAgICAgICBwdWJsaWMgREZBMTMwKEJhc2VSZWNvZ25pemVyIHJlY29nbml6ZXIpIHsKICAgICAgICAgICAgIHRoaXMucmVjb2duaXplciA9IHJlY29nbml6ZXI7Ci0gICAgICAgICAgICB0aGlzLmRlY2lzaW9uTnVtYmVyID0gMTE3OworICAgICAgICAgICAgdGhpcy5kZWNpc2lvbk51bWJlciA9IDEzMDsKICAgICAgICAgICAgIHRoaXMuZW90ID0gZGZhXzYwOwogICAgICAgICAgICAgdGhpcy5lb2YgPSBkZmFfNjA7CiAgICAgICAgICAgICB0aGlzLm1pbiA9IGRmYV82MTsKQEAgLTg3MzYxLDU3ICs5MjU5MCw1NyBAQAogICAgICAgICAgICAgdGhpcy50cmFuc2l0aW9uID0gZGZhXzY1OwogICAgICAgICB9CiAgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0RGVzY3JpcHRpb24oKSB7Ci0gICAgICAgICAgICByZXR1cm4gIjE0Mjc5OjI6ICggcnVsZV9fWENsb3N1cmVfX0dyb3VwXzFfXzAgKT8iOworICAgICAgICAgICAgcmV0dXJuICIxNTYxNzoyOiAoIHJ1bGVfX1hDbG9zdXJlX19Hcm91cF8xX18wICk/IjsKICAgICAgICAgfQogICAgICAgICBwdWJsaWMgaW50IHNwZWNpYWxTdGF0ZVRyYW5zaXRpb24oaW50IHMsIEludFN0cmVhbSBfaW5wdXQpIHRocm93cyBOb1ZpYWJsZUFsdEV4Y2VwdGlvbiB7CiAgICAgICAgICAgICBUb2tlblN0cmVhbSBpbnB1dCA9IChUb2tlblN0cmVhbSlfaW5wdXQ7CiAgICAgICAgIAlpbnQgX3MgPSBzOwogICAgICAgICAgICAgc3dpdGNoICggcyApIHsKICAgICAgICAgICAgICAgICAgICAgY2FzZSAwIDogCi0gICAgICAgICAgICAgICAgICAgICAgICBpbnQgTEExMTdfMSA9IGlucHV0LkxBKDEpOworICAgICAgICAgICAgICAgICAgICAgICAgaW50IExBMTMwXzEgPSBpbnB1dC5MQSgxKTsKIAogICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgaW50IGluZGV4MTE3XzEgPSBpbnB1dC5pbmRleCgpOworICAgICAgICAgICAgICAgICAgICAgICAgaW50IGluZGV4MTMwXzEgPSBpbnB1dC5pbmRleCgpOwogICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXQucmV3aW5kKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICBzID0gLTE7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIChzeW5wcmVkMTcxX0ludGVybmFsRGF0YURTTCgpKSApIHtzID0gMzt9CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIChzeW5wcmVkMTkwX0ludGVybmFsRGF0YURTTCgpKSApIHtzID0gMzt9CiAKICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKCAodHJ1ZSkgKSB7cyA9IDU7fQogCiAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICBpbnB1dC5zZWVrKGluZGV4MTE3XzEpOworICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXQuc2VlayhpbmRleDEzMF8xKTsKICAgICAgICAgICAgICAgICAgICAgICAgIGlmICggcz49MCApIHJldHVybiBzOwogICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgIGNhc2UgMSA6IAotICAgICAgICAgICAgICAgICAgICAgICAgaW50IExBMTE3XzIgPSBpbnB1dC5MQSgxKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBMQTEzMF8yID0gaW5wdXQuTEEoMSk7CiAKICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbmRleDExN18yID0gaW5wdXQuaW5kZXgoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbmRleDEzMF8yID0gaW5wdXQuaW5kZXgoKTsKICAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0LnJld2luZCgpOwogICAgICAgICAgICAgICAgICAgICAgICAgcyA9IC0xOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCAoc3lucHJlZDE3MV9JbnRlcm5hbERhdGFEU0woKSkgKSB7cyA9IDM7fQorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCAoc3lucHJlZDE5MF9JbnRlcm5hbERhdGFEU0woKSkgKSB7cyA9IDM7fQogCiAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICggKHRydWUpICkge3MgPSA1O30KIAogICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXQuc2VlayhpbmRleDExN18yKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0LnNlZWsoaW5kZXgxMzBfMik7CiAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIHM+PTAgKSByZXR1cm4gczsKICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgaWYgKHN0YXRlLmJhY2t0cmFja2luZz4wKSB7c3RhdGUuZmFpbGVkPXRydWU7IHJldHVybiAtMTt9CiAgICAgICAgICAgICBOb1ZpYWJsZUFsdEV4Y2VwdGlvbiBudmFlID0KLSAgICAgICAgICAgICAgICBuZXcgTm9WaWFibGVBbHRFeGNlcHRpb24oZ2V0RGVzY3JpcHRpb24oKSwgMTE3LCBfcywgaW5wdXQpOworICAgICAgICAgICAgICAgIG5ldyBOb1ZpYWJsZUFsdEV4Y2VwdGlvbihnZXREZXNjcmlwdGlvbigpLCAxMzAsIF9zLCBpbnB1dCk7CiAgICAgICAgICAgICBlcnJvcihudmFlKTsKICAgICAgICAgICAgIHRocm93IG52YWU7CiAgICAgICAgIH0KICAgICB9CiAgICAgc3RhdGljIGZpbmFsIFN0cmluZyBkZmFfNjZzID0gIlw0Mlx1ZmZmZiI7CiAgICAgc3RhdGljIGZpbmFsIFN0cmluZyBkZmFfNjdzID0gIlwxXDRcMlwwXDM3XHVmZmZmIjsKLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIGRmYV82OHMgPSAiXDFcdTAwOWFcMlwwXDM3XHVmZmZmIjsKKyAgICBzdGF0aWMgZmluYWwgU3RyaW5nIGRmYV82OHMgPSAiXDFcdTAwYTZcMlwwXDM3XHVmZmZmIjsKICAgICBzdGF0aWMgZmluYWwgU3RyaW5nIGRmYV82OXMgPSAiXDNcdWZmZmZcMVwxXDFcMlwzNVx1ZmZmZiI7CiAgICAgc3RhdGljIGZpbmFsIFN0cmluZyBkZmFfNzBzID0gIlwxXHVmZmZmXDFcMFwxXDFcMzdcdWZmZmZ9PiI7CiAgICAgc3RhdGljIGZpbmFsIFN0cmluZ1tdIGRmYV83MXMgPSB7Ci0gICAgICAgICAgICAiXDFcNFwxXDFcM1w0XDIyXHVmZmZmXDFcNFwzXHVmZmZmXDFcM1wyXHVmZmZmXDJcNFw0XHVmZmZmXDFcNFw0XHVmZmZmXDZcNFwyM1x1ZmZmZlwxXDRcMzBcdWZmZmZcMVw0XDIxXHVmZmZmXDFcMlwzXHVmZmZmXDJcNFwxXHVmZmZmXDFcNFwxXHVmZmZmXDFcNFwzXHVmZmZmXDEwXDRcMVx1ZmZmZlwxXDRcMjJcdWZmZmZcMVw0IiwKKyAgICAgICAgICAgICJcMVw0XDFcMVwzXDRcMjJcdWZmZmZcMVw0XDNcdWZmZmZcMVwzXDJcdWZmZmZcMlw0XDRcdWZmZmZcMVw0XDRcdWZmZmZcNlw0XDMwXHVmZmZmXDFcNFwzMlx1ZmZmZlwxXDRcMjRcdWZmZmZcMVwyXDNcdWZmZmZcMlw0XDFcdWZmZmZcMVw0XDFcdWZmZmZcMVw0XDNcdWZmZmZcMTBcNFwxXHVmZmZmXDFcNFwyNFx1ZmZmZlwxXDQiLAogICAgICAgICAgICAgIlwxXHVmZmZmIiwKICAgICAgICAgICAgICJcMVx1ZmZmZiIsCiAgICAgICAgICAgICAiIiwKQEAgLTg3NDU0LDExICs5MjY4MywxMSBAQAogICAgIHN0YXRpYyBmaW5hbCBzaG9ydFtdIGRmYV83MCA9IERGQS51bnBhY2tFbmNvZGVkU3RyaW5nKGRmYV83MHMpOwogICAgIHN0YXRpYyBmaW5hbCBzaG9ydFtdW10gZGZhXzcxID0gdW5wYWNrRW5jb2RlZFN0cmluZ0FycmF5KGRmYV83MXMpOwogCi0gICAgY2xhc3MgREZBMTI3IGV4dGVuZHMgREZBIHsKKyAgICBjbGFzcyBERkExNDAgZXh0ZW5kcyBERkEgewogCi0gICAgICAgIHB1YmxpYyBERkExMjcoQmFzZVJlY29nbml6ZXIgcmVjb2duaXplcikgeworICAgICAgICBwdWJsaWMgREZBMTQwKEJhc2VSZWNvZ25pemVyIHJlY29nbml6ZXIpIHsKICAgICAgICAgICAgIHRoaXMucmVjb2duaXplciA9IHJlY29nbml6ZXI7Ci0gICAgICAgICAgICB0aGlzLmRlY2lzaW9uTnVtYmVyID0gMTI3OworICAgICAgICAgICAgdGhpcy5kZWNpc2lvbk51bWJlciA9IDE0MDsKICAgICAgICAgICAgIHRoaXMuZW90ID0gZGZhXzY2OwogICAgICAgICAgICAgdGhpcy5lb2YgPSBkZmFfNjY7CiAgICAgICAgICAgICB0aGlzLm1pbiA9IGRmYV82NzsKQEAgLTg3NDY4LDY2ICs5MjY5Nyw3IEBACiAgICAgICAgICAgICB0aGlzLnRyYW5zaXRpb24gPSBkZmFfNzE7CiAgICAgICAgIH0KICAgICAgICAgcHVibGljIFN0cmluZyBnZXREZXNjcmlwdGlvbigpIHsKLSAgICAgICAgICAgIHJldHVybiAiMTU3MTA6MjogKCBydWxlX19YU3dpdGNoRXhwcmVzc2lvbl9fR3JvdXBfMl8xXzBfXzAgKT8iOwotICAgICAgICB9Ci0gICAgICAgIHB1YmxpYyBpbnQgc3BlY2lhbFN0YXRlVHJhbnNpdGlvbihpbnQgcywgSW50U3RyZWFtIF9pbnB1dCkgdGhyb3dzIE5vVmlhYmxlQWx0RXhjZXB0aW9uIHsKLSAgICAgICAgICAgIFRva2VuU3RyZWFtIGlucHV0ID0gKFRva2VuU3RyZWFtKV9pbnB1dDsKLSAgICAgICAgCWludCBfcyA9IHM7Ci0gICAgICAgICAgICBzd2l0Y2ggKCBzICkgewotICAgICAgICAgICAgICAgICAgICBjYXNlIDAgOiAKLSAgICAgICAgICAgICAgICAgICAgICAgIGludCBMQTEyN18xID0gaW5wdXQuTEEoMSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbmRleDEyN18xID0gaW5wdXQuaW5kZXgoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0LnJld2luZCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgcyA9IC0xOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCAoc3lucHJlZDE4MV9JbnRlcm5hbERhdGFEU0woKSkgKSB7cyA9IDM7fQotCi0gICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICggKHRydWUpICkge3MgPSA0O30KLQotICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXQuc2VlayhpbmRleDEyN18xKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICggcz49MCApIHJldHVybiBzOwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgMSA6IAotICAgICAgICAgICAgICAgICAgICAgICAgaW50IExBMTI3XzIgPSBpbnB1dC5MQSgxKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgaW50IGluZGV4MTI3XzIgPSBpbnB1dC5pbmRleCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXQucmV3aW5kKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzID0gLTE7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIChzeW5wcmVkMTgxX0ludGVybmFsRGF0YURTTCgpKSApIHtzID0gMzt9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKCAodHJ1ZSkgKSB7cyA9IDQ7fQotCi0gICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICBpbnB1dC5zZWVrKGluZGV4MTI3XzIpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCBzPj0wICkgcmV0dXJuIHM7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChzdGF0ZS5iYWNrdHJhY2tpbmc+MCkge3N0YXRlLmZhaWxlZD10cnVlOyByZXR1cm4gLTE7fQotICAgICAgICAgICAgTm9WaWFibGVBbHRFeGNlcHRpb24gbnZhZSA9Ci0gICAgICAgICAgICAgICAgbmV3IE5vVmlhYmxlQWx0RXhjZXB0aW9uKGdldERlc2NyaXB0aW9uKCksIDEyNywgX3MsIGlucHV0KTsKLSAgICAgICAgICAgIGVycm9yKG52YWUpOwotICAgICAgICAgICAgdGhyb3cgbnZhZTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIGNsYXNzIERGQTE0MCBleHRlbmRzIERGQSB7Ci0KLSAgICAgICAgcHVibGljIERGQTE0MChCYXNlUmVjb2duaXplciByZWNvZ25pemVyKSB7Ci0gICAgICAgICAgICB0aGlzLnJlY29nbml6ZXIgPSByZWNvZ25pemVyOwotICAgICAgICAgICAgdGhpcy5kZWNpc2lvbk51bWJlciA9IDE0MDsKLSAgICAgICAgICAgIHRoaXMuZW90ID0gZGZhXzUyOwotICAgICAgICAgICAgdGhpcy5lb2YgPSBkZmFfNTM7Ci0gICAgICAgICAgICB0aGlzLm1pbiA9IGRmYV81NDsKLSAgICAgICAgICAgIHRoaXMubWF4ID0gZGZhXzU1OwotICAgICAgICAgICAgdGhpcy5hY2NlcHQgPSBkZmFfNTY7Ci0gICAgICAgICAgICB0aGlzLnNwZWNpYWwgPSBkZmFfNTc7Ci0gICAgICAgICAgICB0aGlzLnRyYW5zaXRpb24gPSBkZmFfNTg7Ci0gICAgICAgIH0KLSAgICAgICAgcHVibGljIFN0cmluZyBnZXREZXNjcmlwdGlvbigpIHsKLSAgICAgICAgICAgIHJldHVybiAiMTc4NDM6MjogKCBydWxlX19YRmVhdHVyZUNhbGxfX0dyb3VwXzNfXzAgKT8iOworICAgICAgICAgICAgcmV0dXJuICIxNzA0ODoyOiAoIHJ1bGVfX1hTd2l0Y2hFeHByZXNzaW9uX19Hcm91cF8yXzFfMF9fMCApPyI7CiAgICAgICAgIH0KICAgICAgICAgcHVibGljIGludCBzcGVjaWFsU3RhdGVUcmFuc2l0aW9uKGludCBzLCBJbnRTdHJlYW0gX2lucHV0KSB0aHJvd3MgTm9WaWFibGVBbHRFeGNlcHRpb24gewogICAgICAgICAgICAgVG9rZW5TdHJlYW0gaW5wdXQgPSAoVG9rZW5TdHJlYW0pX2lucHV0OwpAQCAtODc1NDAsMTQgKzkyNzEwLDI5IEBACiAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW5kZXgxNDBfMSA9IGlucHV0LmluZGV4KCk7CiAgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dC5yZXdpbmQoKTsKICAgICAgICAgICAgICAgICAgICAgICAgIHMgPSAtMTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICggKHN5bnByZWQxOTRfSW50ZXJuYWxEYXRhRFNMKCkpICkge3MgPSA3Nzt9CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIChzeW5wcmVkMjAwX0ludGVybmFsRGF0YURTTCgpKSApIHtzID0gMzt9CiAKLSAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKCAodHJ1ZSkgKSB7cyA9IDI7fQorICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoICh0cnVlKSApIHtzID0gNDt9CiAKICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0LnNlZWsoaW5kZXgxNDBfMSk7CiAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIHM+PTAgKSByZXR1cm4gczsKICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIDEgOiAKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBMQTE0MF8yID0gaW5wdXQuTEEoMSk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbmRleDE0MF8yID0gaW5wdXQuaW5kZXgoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0LnJld2luZCgpOworICAgICAgICAgICAgICAgICAgICAgICAgcyA9IC0xOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCAoc3lucHJlZDIwMF9JbnRlcm5hbERhdGFEU0woKSkgKSB7cyA9IDM7fQorCisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICggKHRydWUpICkge3MgPSA0O30KKworICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXQuc2VlayhpbmRleDE0MF8yKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICggcz49MCApIHJldHVybiBzOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBpZiAoc3RhdGUuYmFja3RyYWNraW5nPjApIHtzdGF0ZS5mYWlsZWQ9dHJ1ZTsgcmV0dXJuIC0xO30KICAgICAgICAgICAgIE5vVmlhYmxlQWx0RXhjZXB0aW9uIG52YWUgPQpAQCAtODc1NTcsMTEgKzkyNzQyLDU1IEBACiAgICAgICAgIH0KICAgICB9CiAKLSAgICBjbGFzcyBERkExNDEgZXh0ZW5kcyBERkEgeworICAgIGNsYXNzIERGQTE1MyBleHRlbmRzIERGQSB7CiAKLSAgICAgICAgcHVibGljIERGQTE0MShCYXNlUmVjb2duaXplciByZWNvZ25pemVyKSB7CisgICAgICAgIHB1YmxpYyBERkExNTMoQmFzZVJlY29nbml6ZXIgcmVjb2duaXplcikgewogICAgICAgICAgICAgdGhpcy5yZWNvZ25pemVyID0gcmVjb2duaXplcjsKLSAgICAgICAgICAgIHRoaXMuZGVjaXNpb25OdW1iZXIgPSAxNDE7CisgICAgICAgICAgICB0aGlzLmRlY2lzaW9uTnVtYmVyID0gMTUzOworICAgICAgICAgICAgdGhpcy5lb3QgPSBkZmFfNTI7CisgICAgICAgICAgICB0aGlzLmVvZiA9IGRmYV81MzsKKyAgICAgICAgICAgIHRoaXMubWluID0gZGZhXzU0OworICAgICAgICAgICAgdGhpcy5tYXggPSBkZmFfNTU7CisgICAgICAgICAgICB0aGlzLmFjY2VwdCA9IGRmYV81NjsKKyAgICAgICAgICAgIHRoaXMuc3BlY2lhbCA9IGRmYV81NzsKKyAgICAgICAgICAgIHRoaXMudHJhbnNpdGlvbiA9IGRmYV81ODsKKyAgICAgICAgfQorICAgICAgICBwdWJsaWMgU3RyaW5nIGdldERlc2NyaXB0aW9uKCkgeworICAgICAgICAgICAgcmV0dXJuICIxOTE4MToyOiAoIHJ1bGVfX1hGZWF0dXJlQ2FsbF9fR3JvdXBfM19fMCApPyI7CisgICAgICAgIH0KKyAgICAgICAgcHVibGljIGludCBzcGVjaWFsU3RhdGVUcmFuc2l0aW9uKGludCBzLCBJbnRTdHJlYW0gX2lucHV0KSB0aHJvd3MgTm9WaWFibGVBbHRFeGNlcHRpb24geworICAgICAgICAgICAgVG9rZW5TdHJlYW0gaW5wdXQgPSAoVG9rZW5TdHJlYW0pX2lucHV0OworICAgICAgICAJaW50IF9zID0gczsKKyAgICAgICAgICAgIHN3aXRjaCAoIHMgKSB7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgMCA6IAorICAgICAgICAgICAgICAgICAgICAgICAgaW50IExBMTUzXzEgPSBpbnB1dC5MQSgxKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICAgICAgaW50IGluZGV4MTUzXzEgPSBpbnB1dC5pbmRleCgpOworICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXQucmV3aW5kKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBzID0gLTE7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIChzeW5wcmVkMjEzX0ludGVybmFsRGF0YURTTCgpKSApIHtzID0gNzc7fQorCisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICggKHRydWUpICkge3MgPSAyO30KKworICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXQuc2VlayhpbmRleDE1M18xKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICggcz49MCApIHJldHVybiBzOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoc3RhdGUuYmFja3RyYWNraW5nPjApIHtzdGF0ZS5mYWlsZWQ9dHJ1ZTsgcmV0dXJuIC0xO30KKyAgICAgICAgICAgIE5vVmlhYmxlQWx0RXhjZXB0aW9uIG52YWUgPQorICAgICAgICAgICAgICAgIG5ldyBOb1ZpYWJsZUFsdEV4Y2VwdGlvbihnZXREZXNjcmlwdGlvbigpLCAxNTMsIF9zLCBpbnB1dCk7CisgICAgICAgICAgICBlcnJvcihudmFlKTsKKyAgICAgICAgICAgIHRocm93IG52YWU7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGFzcyBERkExNTQgZXh0ZW5kcyBERkEgeworCisgICAgICAgIHB1YmxpYyBERkExNTQoQmFzZVJlY29nbml6ZXIgcmVjb2duaXplcikgeworICAgICAgICAgICAgdGhpcy5yZWNvZ25pemVyID0gcmVjb2duaXplcjsKKyAgICAgICAgICAgIHRoaXMuZGVjaXNpb25OdW1iZXIgPSAxNTQ7CiAgICAgICAgICAgICB0aGlzLmVvdCA9IGRmYV81MjsKICAgICAgICAgICAgIHRoaXMuZW9mID0gZGZhXzUzOwogICAgICAgICAgICAgdGhpcy5taW4gPSBkZmFfNTQ7CkBAIC04NzU3MSwzNyArOTI4MDAsMzcgQEAKICAgICAgICAgICAgIHRoaXMudHJhbnNpdGlvbiA9IGRmYV81OTsKICAgICAgICAgfQogICAgICAgICBwdWJsaWMgU3RyaW5nIGdldERlc2NyaXB0aW9uKCkgewotICAgICAgICAgICAgcmV0dXJuICIxNzg2OToyOiAoIHJ1bGVfX1hGZWF0dXJlQ2FsbF9fRmVhdHVyZUNhbGxBcmd1bWVudHNBc3NpZ25tZW50XzQgKT8iOworICAgICAgICAgICAgcmV0dXJuICIxOTIwNzoyOiAoIHJ1bGVfX1hGZWF0dXJlQ2FsbF9fRmVhdHVyZUNhbGxBcmd1bWVudHNBc3NpZ25tZW50XzQgKT8iOwogICAgICAgICB9CiAgICAgICAgIHB1YmxpYyBpbnQgc3BlY2lhbFN0YXRlVHJhbnNpdGlvbihpbnQgcywgSW50U3RyZWFtIF9pbnB1dCkgdGhyb3dzIE5vVmlhYmxlQWx0RXhjZXB0aW9uIHsKICAgICAgICAgICAgIFRva2VuU3RyZWFtIGlucHV0ID0gKFRva2VuU3RyZWFtKV9pbnB1dDsKICAgICAgICAgCWludCBfcyA9IHM7CiAgICAgICAgICAgICBzd2l0Y2ggKCBzICkgewogICAgICAgICAgICAgICAgICAgICBjYXNlIDAgOiAKLSAgICAgICAgICAgICAgICAgICAgICAgIGludCBMQTE0MV8xID0gaW5wdXQuTEEoMSk7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgTEExNTRfMSA9IGlucHV0LkxBKDEpOwogCiAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW5kZXgxNDFfMSA9IGlucHV0LmluZGV4KCk7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW5kZXgxNTRfMSA9IGlucHV0LmluZGV4KCk7CiAgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dC5yZXdpbmQoKTsKICAgICAgICAgICAgICAgICAgICAgICAgIHMgPSAtMTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICggKHN5bnByZWQxOTVfSW50ZXJuYWxEYXRhRFNMKCkpICkge3MgPSA3Nzt9CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIChzeW5wcmVkMjE0X0ludGVybmFsRGF0YURTTCgpKSApIHtzID0gNzc7fQogCiAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICggKHRydWUpICkge3MgPSAyO30KIAogICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXQuc2VlayhpbmRleDE0MV8xKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0LnNlZWsoaW5kZXgxNTRfMSk7CiAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIHM+PTAgKSByZXR1cm4gczsKICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgaWYgKHN0YXRlLmJhY2t0cmFja2luZz4wKSB7c3RhdGUuZmFpbGVkPXRydWU7IHJldHVybiAtMTt9CiAgICAgICAgICAgICBOb1ZpYWJsZUFsdEV4Y2VwdGlvbiBudmFlID0KLSAgICAgICAgICAgICAgICBuZXcgTm9WaWFibGVBbHRFeGNlcHRpb24oZ2V0RGVzY3JpcHRpb24oKSwgMTQxLCBfcywgaW5wdXQpOworICAgICAgICAgICAgICAgIG5ldyBOb1ZpYWJsZUFsdEV4Y2VwdGlvbihnZXREZXNjcmlwdGlvbigpLCAxNTQsIF9zLCBpbnB1dCk7CiAgICAgICAgICAgICBlcnJvcihudmFlKTsKICAgICAgICAgICAgIHRocm93IG52YWU7CiAgICAgICAgIH0KICAgICB9CiAgICAgc3RhdGljIGZpbmFsIFN0cmluZ1tdIGRmYV83MnMgPSB7Ci0gICAgICAgICAgICAiXDVcMlw1XHVmZmZmXDE1XDJcMVwxXDI3XDJcMjNcdWZmZmZcMlwyXDI3XHVmZmZmXDFcMlwxMlx1ZmZmZlwxXDJcNFx1ZmZmZlwxXDJcMVx1ZmZmZlwzMFwyXDE1XHVmZmZmXDJcMlwxXHVmZmZmXDJcMiIsCisgICAgICAgICAgICAiXDVcMlw1XHVmZmZmXDE1XDJcMVwxXDI3XDJcMzBcdWZmZmZcMlwyXDMxXHVmZmZmXDFcMlwxNVx1ZmZmZlwxXDJcNFx1ZmZmZlwxXDJcMVx1ZmZmZlwzMFwyXDE3XHVmZmZmXDJcMlwxXHVmZmZmXDJcMiIsCiAgICAgICAgICAgICAiXDFcdWZmZmYiLAogICAgICAgICAgICAgIiIsCiAgICAgICAgICAgICAiIiwKQEAgLTg3NjgyLDExICs5MjkxMSwxMSBAQAogICAgIH07CiAgICAgc3RhdGljIGZpbmFsIHNob3J0W11bXSBkZmFfNzIgPSB1bnBhY2tFbmNvZGVkU3RyaW5nQXJyYXkoZGZhXzcycyk7CiAKLSAgICBjbGFzcyBERkExNDUgZXh0ZW5kcyBERkEgeworICAgIGNsYXNzIERGQTE1OCBleHRlbmRzIERGQSB7CiAKLSAgICAgICAgcHVibGljIERGQTE0NShCYXNlUmVjb2duaXplciByZWNvZ25pemVyKSB7CisgICAgICAgIHB1YmxpYyBERkExNTgoQmFzZVJlY29nbml6ZXIgcmVjb2duaXplcikgewogICAgICAgICAgICAgdGhpcy5yZWNvZ25pemVyID0gcmVjb2duaXplcjsKLSAgICAgICAgICAgIHRoaXMuZGVjaXNpb25OdW1iZXIgPSAxNDU7CisgICAgICAgICAgICB0aGlzLmRlY2lzaW9uTnVtYmVyID0gMTU4OwogICAgICAgICAgICAgdGhpcy5lb3QgPSBkZmFfNTI7CiAgICAgICAgICAgICB0aGlzLmVvZiA9IGRmYV81MzsKICAgICAgICAgICAgIHRoaXMubWluID0gZGZhXzU0OwpAQCAtODc2OTYsNDEgKzkyOTI1LDQxIEBACiAgICAgICAgICAgICB0aGlzLnRyYW5zaXRpb24gPSBkZmFfNzI7CiAgICAgICAgIH0KICAgICAgICAgcHVibGljIFN0cmluZyBnZXREZXNjcmlwdGlvbigpIHsKLSAgICAgICAgICAgIHJldHVybiAiMTgzMjk6MjogKCBydWxlX19YQ29uc3RydWN0b3JDYWxsX19Hcm91cF8zX18wICk/IjsKKyAgICAgICAgICAgIHJldHVybiAiMTk2Njc6MjogKCBydWxlX19YQ29uc3RydWN0b3JDYWxsX19Hcm91cF8zX18wICk/IjsKICAgICAgICAgfQogICAgICAgICBwdWJsaWMgaW50IHNwZWNpYWxTdGF0ZVRyYW5zaXRpb24oaW50IHMsIEludFN0cmVhbSBfaW5wdXQpIHRocm93cyBOb1ZpYWJsZUFsdEV4Y2VwdGlvbiB7CiAgICAgICAgICAgICBUb2tlblN0cmVhbSBpbnB1dCA9IChUb2tlblN0cmVhbSlfaW5wdXQ7CiAgICAgICAgIAlpbnQgX3MgPSBzOwogICAgICAgICAgICAgc3dpdGNoICggcyApIHsKICAgICAgICAgICAgICAgICAgICAgY2FzZSAwIDogCi0gICAgICAgICAgICAgICAgICAgICAgICBpbnQgTEExNDVfMSA9IGlucHV0LkxBKDEpOworICAgICAgICAgICAgICAgICAgICAgICAgaW50IExBMTU4XzEgPSBpbnB1dC5MQSgxKTsKIAogICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgaW50IGluZGV4MTQ1XzEgPSBpbnB1dC5pbmRleCgpOworICAgICAgICAgICAgICAgICAgICAgICAgaW50IGluZGV4MTU4XzEgPSBpbnB1dC5pbmRleCgpOwogICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXQucmV3aW5kKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICBzID0gLTE7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIChzeW5wcmVkMTk5X0ludGVybmFsRGF0YURTTCgpKSApIHtzID0gNzc7fQorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCAoc3lucHJlZDIxOF9JbnRlcm5hbERhdGFEU0woKSkgKSB7cyA9IDc3O30KIAogICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoICh0cnVlKSApIHtzID0gMjt9CiAKICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0LnNlZWsoaW5kZXgxNDVfMSk7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dC5zZWVrKGluZGV4MTU4XzEpOwogICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCBzPj0wICkgcmV0dXJuIHM7CiAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGlmIChzdGF0ZS5iYWNrdHJhY2tpbmc+MCkge3N0YXRlLmZhaWxlZD10cnVlOyByZXR1cm4gLTE7fQogICAgICAgICAgICAgTm9WaWFibGVBbHRFeGNlcHRpb24gbnZhZSA9Ci0gICAgICAgICAgICAgICAgbmV3IE5vVmlhYmxlQWx0RXhjZXB0aW9uKGdldERlc2NyaXB0aW9uKCksIDE0NSwgX3MsIGlucHV0KTsKKyAgICAgICAgICAgICAgICBuZXcgTm9WaWFibGVBbHRFeGNlcHRpb24oZ2V0RGVzY3JpcHRpb24oKSwgMTU4LCBfcywgaW5wdXQpOwogICAgICAgICAgICAgZXJyb3IobnZhZSk7CiAgICAgICAgICAgICB0aHJvdyBudmFlOwogICAgICAgICB9CiAgICAgfQogCi0gICAgY2xhc3MgREZBMTQ2IGV4dGVuZHMgREZBIHsKKyAgICBjbGFzcyBERkExNTkgZXh0ZW5kcyBERkEgewogCi0gICAgICAgIHB1YmxpYyBERkExNDYoQmFzZVJlY29nbml6ZXIgcmVjb2duaXplcikgeworICAgICAgICBwdWJsaWMgREZBMTU5KEJhc2VSZWNvZ25pemVyIHJlY29nbml6ZXIpIHsKICAgICAgICAgICAgIHRoaXMucmVjb2duaXplciA9IHJlY29nbml6ZXI7Ci0gICAgICAgICAgICB0aGlzLmRlY2lzaW9uTnVtYmVyID0gMTQ2OworICAgICAgICAgICAgdGhpcy5kZWNpc2lvbk51bWJlciA9IDE1OTsKICAgICAgICAgICAgIHRoaXMuZW90ID0gZGZhXzUyOwogICAgICAgICAgICAgdGhpcy5lb2YgPSBkZmFfNTM7CiAgICAgICAgICAgICB0aGlzLm1pbiA9IGRmYV81NDsKQEAgLTg3NzQwLDQxICs5Mjk2OSw0MSBAQAogICAgICAgICAgICAgdGhpcy50cmFuc2l0aW9uID0gZGZhXzU4OwogICAgICAgICB9CiAgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0RGVzY3JpcHRpb24oKSB7Ci0gICAgICAgICAgICByZXR1cm4gIjE4MzU2OjI6ICggcnVsZV9fWENvbnN0cnVjdG9yQ2FsbF9fR3JvdXBfNF9fMCApPyI7CisgICAgICAgICAgICByZXR1cm4gIjE5Njk0OjI6ICggcnVsZV9fWENvbnN0cnVjdG9yQ2FsbF9fR3JvdXBfNF9fMCApPyI7CiAgICAgICAgIH0KICAgICAgICAgcHVibGljIGludCBzcGVjaWFsU3RhdGVUcmFuc2l0aW9uKGludCBzLCBJbnRTdHJlYW0gX2lucHV0KSB0aHJvd3MgTm9WaWFibGVBbHRFeGNlcHRpb24gewogICAgICAgICAgICAgVG9rZW5TdHJlYW0gaW5wdXQgPSAoVG9rZW5TdHJlYW0pX2lucHV0OwogICAgICAgICAJaW50IF9zID0gczsKICAgICAgICAgICAgIHN3aXRjaCAoIHMgKSB7CiAgICAgICAgICAgICAgICAgICAgIGNhc2UgMCA6IAotICAgICAgICAgICAgICAgICAgICAgICAgaW50IExBMTQ2XzEgPSBpbnB1dC5MQSgxKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBMQTE1OV8xID0gaW5wdXQuTEEoMSk7CiAKICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbmRleDE0Nl8xID0gaW5wdXQuaW5kZXgoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbmRleDE1OV8xID0gaW5wdXQuaW5kZXgoKTsKICAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0LnJld2luZCgpOwogICAgICAgICAgICAgICAgICAgICAgICAgcyA9IC0xOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCAoc3lucHJlZDIwMF9JbnRlcm5hbERhdGFEU0woKSkgKSB7cyA9IDc3O30KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICggKHN5bnByZWQyMTlfSW50ZXJuYWxEYXRhRFNMKCkpICkge3MgPSA3Nzt9CiAKICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKCAodHJ1ZSkgKSB7cyA9IDI7fQogCiAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICBpbnB1dC5zZWVrKGluZGV4MTQ2XzEpOworICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXQuc2VlayhpbmRleDE1OV8xKTsKICAgICAgICAgICAgICAgICAgICAgICAgIGlmICggcz49MCApIHJldHVybiBzOwogICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBpZiAoc3RhdGUuYmFja3RyYWNraW5nPjApIHtzdGF0ZS5mYWlsZWQ9dHJ1ZTsgcmV0dXJuIC0xO30KICAgICAgICAgICAgIE5vVmlhYmxlQWx0RXhjZXB0aW9uIG52YWUgPQotICAgICAgICAgICAgICAgIG5ldyBOb1ZpYWJsZUFsdEV4Y2VwdGlvbihnZXREZXNjcmlwdGlvbigpLCAxNDYsIF9zLCBpbnB1dCk7CisgICAgICAgICAgICAgICAgbmV3IE5vVmlhYmxlQWx0RXhjZXB0aW9uKGdldERlc2NyaXB0aW9uKCksIDE1OSwgX3MsIGlucHV0KTsKICAgICAgICAgICAgIGVycm9yKG52YWUpOwogICAgICAgICAgICAgdGhyb3cgbnZhZTsKICAgICAgICAgfQogICAgIH0KIAotICAgIGNsYXNzIERGQTE0NyBleHRlbmRzIERGQSB7CisgICAgY2xhc3MgREZBMTYwIGV4dGVuZHMgREZBIHsKIAotICAgICAgICBwdWJsaWMgREZBMTQ3KEJhc2VSZWNvZ25pemVyIHJlY29nbml6ZXIpIHsKKyAgICAgICAgcHVibGljIERGQTE2MChCYXNlUmVjb2duaXplciByZWNvZ25pemVyKSB7CiAgICAgICAgICAgICB0aGlzLnJlY29nbml6ZXIgPSByZWNvZ25pemVyOwotICAgICAgICAgICAgdGhpcy5kZWNpc2lvbk51bWJlciA9IDE0NzsKKyAgICAgICAgICAgIHRoaXMuZGVjaXNpb25OdW1iZXIgPSAxNjA7CiAgICAgICAgICAgICB0aGlzLmVvdCA9IGRmYV81MjsKICAgICAgICAgICAgIHRoaXMuZW9mID0gZGZhXzUzOwogICAgICAgICAgICAgdGhpcy5taW4gPSBkZmFfNTQ7CkBAIC04Nzc4NCw0MiArOTMwMTMsNDIgQEAKICAgICAgICAgICAgIHRoaXMudHJhbnNpdGlvbiA9IGRmYV81OTsKICAgICAgICAgfQogICAgICAgICBwdWJsaWMgU3RyaW5nIGdldERlc2NyaXB0aW9uKCkgewotICAgICAgICAgICAgcmV0dXJuICIxODM4MjoyOiAoIHJ1bGVfX1hDb25zdHJ1Y3RvckNhbGxfX0FyZ3VtZW50c0Fzc2lnbm1lbnRfNSApPyI7CisgICAgICAgICAgICByZXR1cm4gIjE5NzIwOjI6ICggcnVsZV9fWENvbnN0cnVjdG9yQ2FsbF9fQXJndW1lbnRzQXNzaWdubWVudF81ICk/IjsKICAgICAgICAgfQogICAgICAgICBwdWJsaWMgaW50IHNwZWNpYWxTdGF0ZVRyYW5zaXRpb24oaW50IHMsIEludFN0cmVhbSBfaW5wdXQpIHRocm93cyBOb1ZpYWJsZUFsdEV4Y2VwdGlvbiB7CiAgICAgICAgICAgICBUb2tlblN0cmVhbSBpbnB1dCA9IChUb2tlblN0cmVhbSlfaW5wdXQ7CiAgICAgICAgIAlpbnQgX3MgPSBzOwogICAgICAgICAgICAgc3dpdGNoICggcyApIHsKICAgICAgICAgICAgICAgICAgICAgY2FzZSAwIDogCi0gICAgICAgICAgICAgICAgICAgICAgICBpbnQgTEExNDdfMSA9IGlucHV0LkxBKDEpOworICAgICAgICAgICAgICAgICAgICAgICAgaW50IExBMTYwXzEgPSBpbnB1dC5MQSgxKTsKIAogICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgaW50IGluZGV4MTQ3XzEgPSBpbnB1dC5pbmRleCgpOworICAgICAgICAgICAgICAgICAgICAgICAgaW50IGluZGV4MTYwXzEgPSBpbnB1dC5pbmRleCgpOwogICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXQucmV3aW5kKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICBzID0gLTE7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIChzeW5wcmVkMjAxX0ludGVybmFsRGF0YURTTCgpKSApIHtzID0gNzc7fQorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCAoc3lucHJlZDIyMF9JbnRlcm5hbERhdGFEU0woKSkgKSB7cyA9IDc3O30KIAogICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoICh0cnVlKSApIHtzID0gMjt9CiAKICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0LnNlZWsoaW5kZXgxNDdfMSk7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dC5zZWVrKGluZGV4MTYwXzEpOwogICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCBzPj0wICkgcmV0dXJuIHM7CiAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGlmIChzdGF0ZS5iYWNrdHJhY2tpbmc+MCkge3N0YXRlLmZhaWxlZD10cnVlOyByZXR1cm4gLTE7fQogICAgICAgICAgICAgTm9WaWFibGVBbHRFeGNlcHRpb24gbnZhZSA9Ci0gICAgICAgICAgICAgICAgbmV3IE5vVmlhYmxlQWx0RXhjZXB0aW9uKGdldERlc2NyaXB0aW9uKCksIDE0NywgX3MsIGlucHV0KTsKKyAgICAgICAgICAgICAgICBuZXcgTm9WaWFibGVBbHRFeGNlcHRpb24oZ2V0RGVzY3JpcHRpb24oKSwgMTYwLCBfcywgaW5wdXQpOwogICAgICAgICAgICAgZXJyb3IobnZhZSk7CiAgICAgICAgICAgICB0aHJvdyBudmFlOwogICAgICAgICB9CiAgICAgfQogICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgZGZhXzczcyA9ICJcMVw0MVwxMTVcdWZmZmYiOwogICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgZGZhXzc0cyA9ICJcMVw0XDQwXDBcNTVcdWZmZmYiOwotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgZGZhXzc1cyA9ICJcMVx1MDA5YVw0MFwwXDU1XHVmZmZmIjsKKyAgICBzdGF0aWMgZmluYWwgU3RyaW5nIGRmYV83NXMgPSAiXDFcdTAwYTZcNDBcMFw1NVx1ZmZmZiI7CiAgICAgc3RhdGljIGZpbmFsIFN0cmluZyBkZmFfNzZzID0gIlw0MVx1ZmZmZlwxXDJcNTNcdWZmZmZcMVwxIjsKICAgICBzdGF0aWMgZmluYWwgU3RyaW5nIGRmYV83N3MgPSAiXDFcdWZmZmZcMVwwXDFcMVwxXDJcMVwzXDFcNFwxXDVcMVw2XDFcN1wxXDEwXDFcMTFcMVwxMlwxXDEzXDFcMTRcMVwxNVwxXDE2XDFcMTdcMVwyMFwxXDIxXDFcMjJcMVwyM1wxXDI0XDFcMjVcMVwyNlwxXDI3XDFcMzBcMVwzMVwxXDMyXDFcMzNcMVwzNFwxXDM1XDFcMzZcMVwzN1w1NVx1ZmZmZn0+IjsKICAgICBzdGF0aWMgZmluYWwgU3RyaW5nW10gZGZhXzc4cyA9IHsKLSAgICAgICAgICAgICJcMVwyN1wxXDFcMVwyM1wxXDI0XDFcMjVcNVx1ZmZmZlwxNVw0MVwxXDE1XDZcNDFcMVwxMFwxXDdcNFw0MVwxXDZcNFw0MVwxXDJcMVwzXDFcNFwxXDVcMVwxNlwxXDIxXDIzXHVmZmZmXDFcMTJcMVw0MVwyN1x1ZmZmZlwxXDMyXDEyXHVmZmZmXDFcNDFcNFx1ZmZmZlwxXDQxXDFcdWZmZmZcMVw0MFwzXDQxXDFcMTdcMVwyMFwxXDQxXDFcMzFcMVw0MVwxXDEzXDNcNDFcMVwzM1wxXDM0XDFcMTFcMVwyNlwxXDMwXDFcMzVcMVwzNlwxXDM3XDFcNDFcMVwxNFwxXDQxXDE1XHVmZmZmXDJcNDFcMVx1ZmZmZlwxXDQxXDFcMjIiLAorICAgICAgICAgICAgIlwxXDI3XDFcMVwxXDIzXDFcMjRcMVwyNVw1XHVmZmZmXDE1XDQxXDFcMTVcNlw0MVwxXDEwXDFcN1w0XDQxXDFcNlw0XDQxXDFcMlwxXDNcMVw0XDFcNVwxXDE2XDFcMjFcMzBcdWZmZmZcMVwxMlwxXDQxXDMxXHVmZmZmXDFcMzJcMTVcdWZmZmZcMVw0MVw0XHVmZmZmXDFcNDFcMVx1ZmZmZlwxXDQwXDNcNDFcMVwxN1wxXDIwXDFcNDFcMVwzMVwxXDQxXDFcMTNcM1w0MVwxXDMzXDFcMzRcMVwxMVwxXDI2XDFcMzBcMVwzNVwxXDM2XDFcMzdcMVw0MVwxXDE0XDFcNDFcMTdcdWZmZmZcMlw0MVwxXHVmZmZmXDFcNDFcMVwyMiIsCiAgICAgICAgICAgICAiXDFcdWZmZmYiLAogICAgICAgICAgICAgIlwxXHVmZmZmIiwKICAgICAgICAgICAgICJcMVx1ZmZmZiIsCkBAIC04NzkwNSwxMSArOTMxMzQsMTEgQEAKICAgICBzdGF0aWMgZmluYWwgc2hvcnRbXSBkZmFfNzcgPSBERkEudW5wYWNrRW5jb2RlZFN0cmluZyhkZmFfNzdzKTsKICAgICBzdGF0aWMgZmluYWwgc2hvcnRbXVtdIGRmYV83OCA9IHVucGFja0VuY29kZWRTdHJpbmdBcnJheShkZmFfNzhzKTsKIAotICAgIGNsYXNzIERGQTE1MiBleHRlbmRzIERGQSB7CisgICAgY2xhc3MgREZBMTY1IGV4dGVuZHMgREZBIHsKIAotICAgICAgICBwdWJsaWMgREZBMTUyKEJhc2VSZWNvZ25pemVyIHJlY29nbml6ZXIpIHsKKyAgICAgICAgcHVibGljIERGQTE2NShCYXNlUmVjb2duaXplciByZWNvZ25pemVyKSB7CiAgICAgICAgICAgICB0aGlzLnJlY29nbml6ZXIgPSByZWNvZ25pemVyOwotICAgICAgICAgICAgdGhpcy5kZWNpc2lvbk51bWJlciA9IDE1MjsKKyAgICAgICAgICAgIHRoaXMuZGVjaXNpb25OdW1iZXIgPSAxNjU7CiAgICAgICAgICAgICB0aGlzLmVvdCA9IGRmYV81MjsKICAgICAgICAgICAgIHRoaXMuZW9mID0gZGZhXzczOwogICAgICAgICAgICAgdGhpcy5taW4gPSBkZmFfNzQ7CkBAIC04NzkxOSw0OTYgKzkzMTQ4LDQ5NiBAQAogICAgICAgICAgICAgdGhpcy50cmFuc2l0aW9uID0gZGZhXzc4OwogICAgICAgICB9CiAgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0RGVzY3JpcHRpb24oKSB7Ci0gICAgICAgICAgICByZXR1cm4gIjE5MjczOjI6ICggcnVsZV9fWFJldHVybkV4cHJlc3Npb25fX0V4cHJlc3Npb25Bc3NpZ25tZW50XzIgKT8iOworICAgICAgICAgICAgcmV0dXJuICIyMDYxMToyOiAoIHJ1bGVfX1hSZXR1cm5FeHByZXNzaW9uX19FeHByZXNzaW9uQXNzaWdubWVudF8yICk/IjsKICAgICAgICAgfQogICAgICAgICBwdWJsaWMgaW50IHNwZWNpYWxTdGF0ZVRyYW5zaXRpb24oaW50IHMsIEludFN0cmVhbSBfaW5wdXQpIHRocm93cyBOb1ZpYWJsZUFsdEV4Y2VwdGlvbiB7CiAgICAgICAgICAgICBUb2tlblN0cmVhbSBpbnB1dCA9IChUb2tlblN0cmVhbSlfaW5wdXQ7CiAgICAgICAgIAlpbnQgX3MgPSBzOwogICAgICAgICAgICAgc3dpdGNoICggcyApIHsKICAgICAgICAgICAgICAgICAgICAgY2FzZSAwIDogCi0gICAgICAgICAgICAgICAgICAgICAgICBpbnQgTEExNTJfMSA9IGlucHV0LkxBKDEpOworICAgICAgICAgICAgICAgICAgICAgICAgaW50IExBMTY1XzEgPSBpbnB1dC5MQSgxKTsKIAogICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgaW50IGluZGV4MTUyXzEgPSBpbnB1dC5pbmRleCgpOworICAgICAgICAgICAgICAgICAgICAgICAgaW50IGluZGV4MTY1XzEgPSBpbnB1dC5pbmRleCgpOwogICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXQucmV3aW5kKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICBzID0gLTE7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIChzeW5wcmVkMjA2X0ludGVybmFsRGF0YURTTCgpKSApIHtzID0gNzc7fQorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCAoc3lucHJlZDIyNV9JbnRlcm5hbERhdGFEU0woKSkgKSB7cyA9IDc3O30KIAogICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoICh0cnVlKSApIHtzID0gMzM7fQogCiAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICBpbnB1dC5zZWVrKGluZGV4MTUyXzEpOworICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXQuc2VlayhpbmRleDE2NV8xKTsKICAgICAgICAgICAgICAgICAgICAgICAgIGlmICggcz49MCApIHJldHVybiBzOwogICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgIGNhc2UgMSA6IAotICAgICAgICAgICAgICAgICAgICAgICAgaW50IExBMTUyXzIgPSBpbnB1dC5MQSgxKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBMQTE2NV8yID0gaW5wdXQuTEEoMSk7CiAKICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbmRleDE1Ml8yID0gaW5wdXQuaW5kZXgoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbmRleDE2NV8yID0gaW5wdXQuaW5kZXgoKTsKICAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0LnJld2luZCgpOwogICAgICAgICAgICAgICAgICAgICAgICAgcyA9IC0xOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCAoc3lucHJlZDIwNl9JbnRlcm5hbERhdGFEU0woKSkgKSB7cyA9IDc3O30KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICggKHN5bnByZWQyMjVfSW50ZXJuYWxEYXRhRFNMKCkpICkge3MgPSA3Nzt9CiAKICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKCAodHJ1ZSkgKSB7cyA9IDMzO30KIAogICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXQuc2VlayhpbmRleDE1Ml8yKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0LnNlZWsoaW5kZXgxNjVfMik7CiAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIHM+PTAgKSByZXR1cm4gczsKICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICBjYXNlIDIgOiAKLSAgICAgICAgICAgICAgICAgICAgICAgIGludCBMQTE1Ml8zID0gaW5wdXQuTEEoMSk7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgTEExNjVfMyA9IGlucHV0LkxBKDEpOwogCiAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW5kZXgxNTJfMyA9IGlucHV0LmluZGV4KCk7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW5kZXgxNjVfMyA9IGlucHV0LmluZGV4KCk7CiAgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dC5yZXdpbmQoKTsKICAgICAgICAgICAgICAgICAgICAgICAgIHMgPSAtMTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICggKHN5bnByZWQyMDZfSW50ZXJuYWxEYXRhRFNMKCkpICkge3MgPSA3Nzt9CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIChzeW5wcmVkMjI1X0ludGVybmFsRGF0YURTTCgpKSApIHtzID0gNzc7fQogCiAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICggKHRydWUpICkge3MgPSAzMzt9CiAKICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0LnNlZWsoaW5kZXgxNTJfMyk7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dC5zZWVrKGluZGV4MTY1XzMpOwogICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCBzPj0wICkgcmV0dXJuIHM7CiAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgY2FzZSAzIDogCi0gICAgICAgICAgICAgICAgICAgICAgICBpbnQgTEExNTJfNCA9IGlucHV0LkxBKDEpOworICAgICAgICAgICAgICAgICAgICAgICAgaW50IExBMTY1XzQgPSBpbnB1dC5MQSgxKTsKIAogICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgaW50IGluZGV4MTUyXzQgPSBpbnB1dC5pbmRleCgpOworICAgICAgICAgICAgICAgICAgICAgICAgaW50IGluZGV4MTY1XzQgPSBpbnB1dC5pbmRleCgpOwogICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXQucmV3aW5kKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICBzID0gLTE7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIChzeW5wcmVkMjA2X0ludGVybmFsRGF0YURTTCgpKSApIHtzID0gNzc7fQorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCAoc3lucHJlZDIyNV9JbnRlcm5hbERhdGFEU0woKSkgKSB7cyA9IDc3O30KIAogICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoICh0cnVlKSApIHtzID0gMzM7fQogCiAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICBpbnB1dC5zZWVrKGluZGV4MTUyXzQpOworICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXQuc2VlayhpbmRleDE2NV80KTsKICAgICAgICAgICAgICAgICAgICAgICAgIGlmICggcz49MCApIHJldHVybiBzOwogICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgIGNhc2UgNCA6IAotICAgICAgICAgICAgICAgICAgICAgICAgaW50IExBMTUyXzUgPSBpbnB1dC5MQSgxKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBMQTE2NV81ID0gaW5wdXQuTEEoMSk7CiAKICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbmRleDE1Ml81ID0gaW5wdXQuaW5kZXgoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbmRleDE2NV81ID0gaW5wdXQuaW5kZXgoKTsKICAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0LnJld2luZCgpOwogICAgICAgICAgICAgICAgICAgICAgICAgcyA9IC0xOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCAoc3lucHJlZDIwNl9JbnRlcm5hbERhdGFEU0woKSkgKSB7cyA9IDc3O30KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICggKHN5bnByZWQyMjVfSW50ZXJuYWxEYXRhRFNMKCkpICkge3MgPSA3Nzt9CiAKICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKCAodHJ1ZSkgKSB7cyA9IDMzO30KIAogICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXQuc2VlayhpbmRleDE1Ml81KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0LnNlZWsoaW5kZXgxNjVfNSk7CiAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIHM+PTAgKSByZXR1cm4gczsKICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICBjYXNlIDUgOiAKLSAgICAgICAgICAgICAgICAgICAgICAgIGludCBMQTE1Ml82ID0gaW5wdXQuTEEoMSk7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgTEExNjVfNiA9IGlucHV0LkxBKDEpOwogCiAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW5kZXgxNTJfNiA9IGlucHV0LmluZGV4KCk7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW5kZXgxNjVfNiA9IGlucHV0LmluZGV4KCk7CiAgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dC5yZXdpbmQoKTsKICAgICAgICAgICAgICAgICAgICAgICAgIHMgPSAtMTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICggKHN5bnByZWQyMDZfSW50ZXJuYWxEYXRhRFNMKCkpICkge3MgPSA3Nzt9CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIChzeW5wcmVkMjI1X0ludGVybmFsRGF0YURTTCgpKSApIHtzID0gNzc7fQogCiAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICggKHRydWUpICkge3MgPSAzMzt9CiAKICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0LnNlZWsoaW5kZXgxNTJfNik7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dC5zZWVrKGluZGV4MTY1XzYpOwogICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCBzPj0wICkgcmV0dXJuIHM7CiAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgY2FzZSA2IDogCi0gICAgICAgICAgICAgICAgICAgICAgICBpbnQgTEExNTJfNyA9IGlucHV0LkxBKDEpOworICAgICAgICAgICAgICAgICAgICAgICAgaW50IExBMTY1XzcgPSBpbnB1dC5MQSgxKTsKIAogICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgaW50IGluZGV4MTUyXzcgPSBpbnB1dC5pbmRleCgpOworICAgICAgICAgICAgICAgICAgICAgICAgaW50IGluZGV4MTY1XzcgPSBpbnB1dC5pbmRleCgpOwogICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXQucmV3aW5kKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICBzID0gLTE7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIChzeW5wcmVkMjA2X0ludGVybmFsRGF0YURTTCgpKSApIHtzID0gNzc7fQorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCAoc3lucHJlZDIyNV9JbnRlcm5hbERhdGFEU0woKSkgKSB7cyA9IDc3O30KIAogICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoICh0cnVlKSApIHtzID0gMzM7fQogCiAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICBpbnB1dC5zZWVrKGluZGV4MTUyXzcpOworICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXQuc2VlayhpbmRleDE2NV83KTsKICAgICAgICAgICAgICAgICAgICAgICAgIGlmICggcz49MCApIHJldHVybiBzOwogICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgIGNhc2UgNyA6IAotICAgICAgICAgICAgICAgICAgICAgICAgaW50IExBMTUyXzggPSBpbnB1dC5MQSgxKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBMQTE2NV84ID0gaW5wdXQuTEEoMSk7CiAKICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbmRleDE1Ml84ID0gaW5wdXQuaW5kZXgoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbmRleDE2NV84ID0gaW5wdXQuaW5kZXgoKTsKICAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0LnJld2luZCgpOwogICAgICAgICAgICAgICAgICAgICAgICAgcyA9IC0xOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCAoc3lucHJlZDIwNl9JbnRlcm5hbERhdGFEU0woKSkgKSB7cyA9IDc3O30KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICggKHN5bnByZWQyMjVfSW50ZXJuYWxEYXRhRFNMKCkpICkge3MgPSA3Nzt9CiAKICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKCAodHJ1ZSkgKSB7cyA9IDMzO30KIAogICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXQuc2VlayhpbmRleDE1Ml84KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0LnNlZWsoaW5kZXgxNjVfOCk7CiAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIHM+PTAgKSByZXR1cm4gczsKICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICBjYXNlIDggOiAKLSAgICAgICAgICAgICAgICAgICAgICAgIGludCBMQTE1Ml85ID0gaW5wdXQuTEEoMSk7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgTEExNjVfOSA9IGlucHV0LkxBKDEpOwogCiAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW5kZXgxNTJfOSA9IGlucHV0LmluZGV4KCk7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW5kZXgxNjVfOSA9IGlucHV0LmluZGV4KCk7CiAgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dC5yZXdpbmQoKTsKICAgICAgICAgICAgICAgICAgICAgICAgIHMgPSAtMTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICggKHN5bnByZWQyMDZfSW50ZXJuYWxEYXRhRFNMKCkpICkge3MgPSA3Nzt9CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIChzeW5wcmVkMjI1X0ludGVybmFsRGF0YURTTCgpKSApIHtzID0gNzc7fQogCiAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICggKHRydWUpICkge3MgPSAzMzt9CiAKICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0LnNlZWsoaW5kZXgxNTJfOSk7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dC5zZWVrKGluZGV4MTY1XzkpOwogICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCBzPj0wICkgcmV0dXJuIHM7CiAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgY2FzZSA5IDogCi0gICAgICAgICAgICAgICAgICAgICAgICBpbnQgTEExNTJfMTAgPSBpbnB1dC5MQSgxKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBMQTE2NV8xMCA9IGlucHV0LkxBKDEpOwogCiAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW5kZXgxNTJfMTAgPSBpbnB1dC5pbmRleCgpOworICAgICAgICAgICAgICAgICAgICAgICAgaW50IGluZGV4MTY1XzEwID0gaW5wdXQuaW5kZXgoKTsKICAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0LnJld2luZCgpOwogICAgICAgICAgICAgICAgICAgICAgICAgcyA9IC0xOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCAoc3lucHJlZDIwNl9JbnRlcm5hbERhdGFEU0woKSkgKSB7cyA9IDc3O30KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICggKHN5bnByZWQyMjVfSW50ZXJuYWxEYXRhRFNMKCkpICkge3MgPSA3Nzt9CiAKICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKCAodHJ1ZSkgKSB7cyA9IDMzO30KIAogICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXQuc2VlayhpbmRleDE1Ml8xMCk7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dC5zZWVrKGluZGV4MTY1XzEwKTsKICAgICAgICAgICAgICAgICAgICAgICAgIGlmICggcz49MCApIHJldHVybiBzOwogICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTAgOiAKLSAgICAgICAgICAgICAgICAgICAgICAgIGludCBMQTE1Ml8xMSA9IGlucHV0LkxBKDEpOworICAgICAgICAgICAgICAgICAgICAgICAgaW50IExBMTY1XzExID0gaW5wdXQuTEEoMSk7CiAKICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbmRleDE1Ml8xMSA9IGlucHV0LmluZGV4KCk7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW5kZXgxNjVfMTEgPSBpbnB1dC5pbmRleCgpOwogICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXQucmV3aW5kKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICBzID0gLTE7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIChzeW5wcmVkMjA2X0ludGVybmFsRGF0YURTTCgpKSApIHtzID0gNzc7fQorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCAoc3lucHJlZDIyNV9JbnRlcm5hbERhdGFEU0woKSkgKSB7cyA9IDc3O30KIAogICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoICh0cnVlKSApIHtzID0gMzM7fQogCiAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICBpbnB1dC5zZWVrKGluZGV4MTUyXzExKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0LnNlZWsoaW5kZXgxNjVfMTEpOwogICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCBzPj0wICkgcmV0dXJuIHM7CiAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgY2FzZSAxMSA6IAotICAgICAgICAgICAgICAgICAgICAgICAgaW50IExBMTUyXzEyID0gaW5wdXQuTEEoMSk7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgTEExNjVfMTIgPSBpbnB1dC5MQSgxKTsKIAogICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgaW50IGluZGV4MTUyXzEyID0gaW5wdXQuaW5kZXgoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbmRleDE2NV8xMiA9IGlucHV0LmluZGV4KCk7CiAgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dC5yZXdpbmQoKTsKICAgICAgICAgICAgICAgICAgICAgICAgIHMgPSAtMTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICggKHN5bnByZWQyMDZfSW50ZXJuYWxEYXRhRFNMKCkpICkge3MgPSA3Nzt9CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIChzeW5wcmVkMjI1X0ludGVybmFsRGF0YURTTCgpKSApIHtzID0gNzc7fQogCiAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICggKHRydWUpICkge3MgPSAzMzt9CiAKICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0LnNlZWsoaW5kZXgxNTJfMTIpOworICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXQuc2VlayhpbmRleDE2NV8xMik7CiAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIHM+PTAgKSByZXR1cm4gczsKICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICBjYXNlIDEyIDogCi0gICAgICAgICAgICAgICAgICAgICAgICBpbnQgTEExNTJfMTMgPSBpbnB1dC5MQSgxKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBMQTE2NV8xMyA9IGlucHV0LkxBKDEpOwogCiAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW5kZXgxNTJfMTMgPSBpbnB1dC5pbmRleCgpOworICAgICAgICAgICAgICAgICAgICAgICAgaW50IGluZGV4MTY1XzEzID0gaW5wdXQuaW5kZXgoKTsKICAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0LnJld2luZCgpOwogICAgICAgICAgICAgICAgICAgICAgICAgcyA9IC0xOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCAoc3lucHJlZDIwNl9JbnRlcm5hbERhdGFEU0woKSkgKSB7cyA9IDc3O30KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICggKHN5bnByZWQyMjVfSW50ZXJuYWxEYXRhRFNMKCkpICkge3MgPSA3Nzt9CiAKICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKCAodHJ1ZSkgKSB7cyA9IDMzO30KIAogICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXQuc2VlayhpbmRleDE1Ml8xMyk7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dC5zZWVrKGluZGV4MTY1XzEzKTsKICAgICAgICAgICAgICAgICAgICAgICAgIGlmICggcz49MCApIHJldHVybiBzOwogICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTMgOiAKLSAgICAgICAgICAgICAgICAgICAgICAgIGludCBMQTE1Ml8xNCA9IGlucHV0LkxBKDEpOworICAgICAgICAgICAgICAgICAgICAgICAgaW50IExBMTY1XzE0ID0gaW5wdXQuTEEoMSk7CiAKICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbmRleDE1Ml8xNCA9IGlucHV0LmluZGV4KCk7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW5kZXgxNjVfMTQgPSBpbnB1dC5pbmRleCgpOwogICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXQucmV3aW5kKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICBzID0gLTE7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIChzeW5wcmVkMjA2X0ludGVybmFsRGF0YURTTCgpKSApIHtzID0gNzc7fQorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCAoc3lucHJlZDIyNV9JbnRlcm5hbERhdGFEU0woKSkgKSB7cyA9IDc3O30KIAogICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoICh0cnVlKSApIHtzID0gMzM7fQogCiAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICBpbnB1dC5zZWVrKGluZGV4MTUyXzE0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0LnNlZWsoaW5kZXgxNjVfMTQpOwogICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCBzPj0wICkgcmV0dXJuIHM7CiAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgY2FzZSAxNCA6IAotICAgICAgICAgICAgICAgICAgICAgICAgaW50IExBMTUyXzE1ID0gaW5wdXQuTEEoMSk7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgTEExNjVfMTUgPSBpbnB1dC5MQSgxKTsKIAogICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgaW50IGluZGV4MTUyXzE1ID0gaW5wdXQuaW5kZXgoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbmRleDE2NV8xNSA9IGlucHV0LmluZGV4KCk7CiAgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dC5yZXdpbmQoKTsKICAgICAgICAgICAgICAgICAgICAgICAgIHMgPSAtMTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICggKHN5bnByZWQyMDZfSW50ZXJuYWxEYXRhRFNMKCkpICkge3MgPSA3Nzt9CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIChzeW5wcmVkMjI1X0ludGVybmFsRGF0YURTTCgpKSApIHtzID0gNzc7fQogCiAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICggKHRydWUpICkge3MgPSAzMzt9CiAKICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0LnNlZWsoaW5kZXgxNTJfMTUpOworICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXQuc2VlayhpbmRleDE2NV8xNSk7CiAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIHM+PTAgKSByZXR1cm4gczsKICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICBjYXNlIDE1IDogCi0gICAgICAgICAgICAgICAgICAgICAgICBpbnQgTEExNTJfMTYgPSBpbnB1dC5MQSgxKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBMQTE2NV8xNiA9IGlucHV0LkxBKDEpOwogCiAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW5kZXgxNTJfMTYgPSBpbnB1dC5pbmRleCgpOworICAgICAgICAgICAgICAgICAgICAgICAgaW50IGluZGV4MTY1XzE2ID0gaW5wdXQuaW5kZXgoKTsKICAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0LnJld2luZCgpOwogICAgICAgICAgICAgICAgICAgICAgICAgcyA9IC0xOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCAoc3lucHJlZDIwNl9JbnRlcm5hbERhdGFEU0woKSkgKSB7cyA9IDc3O30KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICggKHN5bnByZWQyMjVfSW50ZXJuYWxEYXRhRFNMKCkpICkge3MgPSA3Nzt9CiAKICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKCAodHJ1ZSkgKSB7cyA9IDMzO30KIAogICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXQuc2VlayhpbmRleDE1Ml8xNik7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dC5zZWVrKGluZGV4MTY1XzE2KTsKICAgICAgICAgICAgICAgICAgICAgICAgIGlmICggcz49MCApIHJldHVybiBzOwogICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTYgOiAKLSAgICAgICAgICAgICAgICAgICAgICAgIGludCBMQTE1Ml8xNyA9IGlucHV0LkxBKDEpOworICAgICAgICAgICAgICAgICAgICAgICAgaW50IExBMTY1XzE3ID0gaW5wdXQuTEEoMSk7CiAKICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbmRleDE1Ml8xNyA9IGlucHV0LmluZGV4KCk7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW5kZXgxNjVfMTcgPSBpbnB1dC5pbmRleCgpOwogICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXQucmV3aW5kKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICBzID0gLTE7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIChzeW5wcmVkMjA2X0ludGVybmFsRGF0YURTTCgpKSApIHtzID0gNzc7fQorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCAoc3lucHJlZDIyNV9JbnRlcm5hbERhdGFEU0woKSkgKSB7cyA9IDc3O30KIAogICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoICh0cnVlKSApIHtzID0gMzM7fQogCiAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICBpbnB1dC5zZWVrKGluZGV4MTUyXzE3KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0LnNlZWsoaW5kZXgxNjVfMTcpOwogICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCBzPj0wICkgcmV0dXJuIHM7CiAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgY2FzZSAxNyA6IAotICAgICAgICAgICAgICAgICAgICAgICAgaW50IExBMTUyXzE4ID0gaW5wdXQuTEEoMSk7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgTEExNjVfMTggPSBpbnB1dC5MQSgxKTsKIAogICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgaW50IGluZGV4MTUyXzE4ID0gaW5wdXQuaW5kZXgoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbmRleDE2NV8xOCA9IGlucHV0LmluZGV4KCk7CiAgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dC5yZXdpbmQoKTsKICAgICAgICAgICAgICAgICAgICAgICAgIHMgPSAtMTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICggKHN5bnByZWQyMDZfSW50ZXJuYWxEYXRhRFNMKCkpICkge3MgPSA3Nzt9CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIChzeW5wcmVkMjI1X0ludGVybmFsRGF0YURTTCgpKSApIHtzID0gNzc7fQogCiAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICggKHRydWUpICkge3MgPSAzMzt9CiAKICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0LnNlZWsoaW5kZXgxNTJfMTgpOworICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXQuc2VlayhpbmRleDE2NV8xOCk7CiAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIHM+PTAgKSByZXR1cm4gczsKICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICBjYXNlIDE4IDogCi0gICAgICAgICAgICAgICAgICAgICAgICBpbnQgTEExNTJfMTkgPSBpbnB1dC5MQSgxKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBMQTE2NV8xOSA9IGlucHV0LkxBKDEpOwogCiAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW5kZXgxNTJfMTkgPSBpbnB1dC5pbmRleCgpOworICAgICAgICAgICAgICAgICAgICAgICAgaW50IGluZGV4MTY1XzE5ID0gaW5wdXQuaW5kZXgoKTsKICAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0LnJld2luZCgpOwogICAgICAgICAgICAgICAgICAgICAgICAgcyA9IC0xOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCAoc3lucHJlZDIwNl9JbnRlcm5hbERhdGFEU0woKSkgKSB7cyA9IDc3O30KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICggKHN5bnByZWQyMjVfSW50ZXJuYWxEYXRhRFNMKCkpICkge3MgPSA3Nzt9CiAKICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKCAodHJ1ZSkgKSB7cyA9IDMzO30KIAogICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXQuc2VlayhpbmRleDE1Ml8xOSk7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dC5zZWVrKGluZGV4MTY1XzE5KTsKICAgICAgICAgICAgICAgICAgICAgICAgIGlmICggcz49MCApIHJldHVybiBzOwogICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTkgOiAKLSAgICAgICAgICAgICAgICAgICAgICAgIGludCBMQTE1Ml8yMCA9IGlucHV0LkxBKDEpOworICAgICAgICAgICAgICAgICAgICAgICAgaW50IExBMTY1XzIwID0gaW5wdXQuTEEoMSk7CiAKICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbmRleDE1Ml8yMCA9IGlucHV0LmluZGV4KCk7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW5kZXgxNjVfMjAgPSBpbnB1dC5pbmRleCgpOwogICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXQucmV3aW5kKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICBzID0gLTE7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIChzeW5wcmVkMjA2X0ludGVybmFsRGF0YURTTCgpKSApIHtzID0gNzc7fQorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCAoc3lucHJlZDIyNV9JbnRlcm5hbERhdGFEU0woKSkgKSB7cyA9IDc3O30KIAogICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoICh0cnVlKSApIHtzID0gMzM7fQogCiAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICBpbnB1dC5zZWVrKGluZGV4MTUyXzIwKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0LnNlZWsoaW5kZXgxNjVfMjApOwogICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCBzPj0wICkgcmV0dXJuIHM7CiAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgY2FzZSAyMCA6IAotICAgICAgICAgICAgICAgICAgICAgICAgaW50IExBMTUyXzIxID0gaW5wdXQuTEEoMSk7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgTEExNjVfMjEgPSBpbnB1dC5MQSgxKTsKIAogICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgaW50IGluZGV4MTUyXzIxID0gaW5wdXQuaW5kZXgoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbmRleDE2NV8yMSA9IGlucHV0LmluZGV4KCk7CiAgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dC5yZXdpbmQoKTsKICAgICAgICAgICAgICAgICAgICAgICAgIHMgPSAtMTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICggKHN5bnByZWQyMDZfSW50ZXJuYWxEYXRhRFNMKCkpICkge3MgPSA3Nzt9CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIChzeW5wcmVkMjI1X0ludGVybmFsRGF0YURTTCgpKSApIHtzID0gNzc7fQogCiAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICggKHRydWUpICkge3MgPSAzMzt9CiAKICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0LnNlZWsoaW5kZXgxNTJfMjEpOworICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXQuc2VlayhpbmRleDE2NV8yMSk7CiAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIHM+PTAgKSByZXR1cm4gczsKICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICBjYXNlIDIxIDogCi0gICAgICAgICAgICAgICAgICAgICAgICBpbnQgTEExNTJfMjIgPSBpbnB1dC5MQSgxKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBMQTE2NV8yMiA9IGlucHV0LkxBKDEpOwogCiAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW5kZXgxNTJfMjIgPSBpbnB1dC5pbmRleCgpOworICAgICAgICAgICAgICAgICAgICAgICAgaW50IGluZGV4MTY1XzIyID0gaW5wdXQuaW5kZXgoKTsKICAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0LnJld2luZCgpOwogICAgICAgICAgICAgICAgICAgICAgICAgcyA9IC0xOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCAoc3lucHJlZDIwNl9JbnRlcm5hbERhdGFEU0woKSkgKSB7cyA9IDc3O30KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICggKHN5bnByZWQyMjVfSW50ZXJuYWxEYXRhRFNMKCkpICkge3MgPSA3Nzt9CiAKICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKCAodHJ1ZSkgKSB7cyA9IDMzO30KIAogICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXQuc2VlayhpbmRleDE1Ml8yMik7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dC5zZWVrKGluZGV4MTY1XzIyKTsKICAgICAgICAgICAgICAgICAgICAgICAgIGlmICggcz49MCApIHJldHVybiBzOwogICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgIGNhc2UgMjIgOiAKLSAgICAgICAgICAgICAgICAgICAgICAgIGludCBMQTE1Ml8yMyA9IGlucHV0LkxBKDEpOworICAgICAgICAgICAgICAgICAgICAgICAgaW50IExBMTY1XzIzID0gaW5wdXQuTEEoMSk7CiAKICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbmRleDE1Ml8yMyA9IGlucHV0LmluZGV4KCk7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW5kZXgxNjVfMjMgPSBpbnB1dC5pbmRleCgpOwogICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXQucmV3aW5kKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICBzID0gLTE7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIChzeW5wcmVkMjA2X0ludGVybmFsRGF0YURTTCgpKSApIHtzID0gNzc7fQorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCAoc3lucHJlZDIyNV9JbnRlcm5hbERhdGFEU0woKSkgKSB7cyA9IDc3O30KIAogICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoICh0cnVlKSApIHtzID0gMzM7fQogCiAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICBpbnB1dC5zZWVrKGluZGV4MTUyXzIzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0LnNlZWsoaW5kZXgxNjVfMjMpOwogICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCBzPj0wICkgcmV0dXJuIHM7CiAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgY2FzZSAyMyA6IAotICAgICAgICAgICAgICAgICAgICAgICAgaW50IExBMTUyXzI0ID0gaW5wdXQuTEEoMSk7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgTEExNjVfMjQgPSBpbnB1dC5MQSgxKTsKIAogICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgaW50IGluZGV4MTUyXzI0ID0gaW5wdXQuaW5kZXgoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbmRleDE2NV8yNCA9IGlucHV0LmluZGV4KCk7CiAgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dC5yZXdpbmQoKTsKICAgICAgICAgICAgICAgICAgICAgICAgIHMgPSAtMTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICggKHN5bnByZWQyMDZfSW50ZXJuYWxEYXRhRFNMKCkpICkge3MgPSA3Nzt9CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIChzeW5wcmVkMjI1X0ludGVybmFsRGF0YURTTCgpKSApIHtzID0gNzc7fQogCiAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICggKHRydWUpICkge3MgPSAzMzt9CiAKICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0LnNlZWsoaW5kZXgxNTJfMjQpOworICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXQuc2VlayhpbmRleDE2NV8yNCk7CiAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIHM+PTAgKSByZXR1cm4gczsKICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICBjYXNlIDI0IDogCi0gICAgICAgICAgICAgICAgICAgICAgICBpbnQgTEExNTJfMjUgPSBpbnB1dC5MQSgxKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBMQTE2NV8yNSA9IGlucHV0LkxBKDEpOwogCiAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW5kZXgxNTJfMjUgPSBpbnB1dC5pbmRleCgpOworICAgICAgICAgICAgICAgICAgICAgICAgaW50IGluZGV4MTY1XzI1ID0gaW5wdXQuaW5kZXgoKTsKICAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0LnJld2luZCgpOwogICAgICAgICAgICAgICAgICAgICAgICAgcyA9IC0xOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCAoc3lucHJlZDIwNl9JbnRlcm5hbERhdGFEU0woKSkgKSB7cyA9IDc3O30KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICggKHN5bnByZWQyMjVfSW50ZXJuYWxEYXRhRFNMKCkpICkge3MgPSA3Nzt9CiAKICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKCAodHJ1ZSkgKSB7cyA9IDMzO30KIAogICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXQuc2VlayhpbmRleDE1Ml8yNSk7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dC5zZWVrKGluZGV4MTY1XzI1KTsKICAgICAgICAgICAgICAgICAgICAgICAgIGlmICggcz49MCApIHJldHVybiBzOwogICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgIGNhc2UgMjUgOiAKLSAgICAgICAgICAgICAgICAgICAgICAgIGludCBMQTE1Ml8yNiA9IGlucHV0LkxBKDEpOworICAgICAgICAgICAgICAgICAgICAgICAgaW50IExBMTY1XzI2ID0gaW5wdXQuTEEoMSk7CiAKICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbmRleDE1Ml8yNiA9IGlucHV0LmluZGV4KCk7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW5kZXgxNjVfMjYgPSBpbnB1dC5pbmRleCgpOwogICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXQucmV3aW5kKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICBzID0gLTE7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIChzeW5wcmVkMjA2X0ludGVybmFsRGF0YURTTCgpKSApIHtzID0gNzc7fQorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCAoc3lucHJlZDIyNV9JbnRlcm5hbERhdGFEU0woKSkgKSB7cyA9IDc3O30KIAogICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoICh0cnVlKSApIHtzID0gMzM7fQogCiAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICBpbnB1dC5zZWVrKGluZGV4MTUyXzI2KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0LnNlZWsoaW5kZXgxNjVfMjYpOwogICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCBzPj0wICkgcmV0dXJuIHM7CiAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgY2FzZSAyNiA6IAotICAgICAgICAgICAgICAgICAgICAgICAgaW50IExBMTUyXzI3ID0gaW5wdXQuTEEoMSk7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgTEExNjVfMjcgPSBpbnB1dC5MQSgxKTsKIAogICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgaW50IGluZGV4MTUyXzI3ID0gaW5wdXQuaW5kZXgoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbmRleDE2NV8yNyA9IGlucHV0LmluZGV4KCk7CiAgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dC5yZXdpbmQoKTsKICAgICAgICAgICAgICAgICAgICAgICAgIHMgPSAtMTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICggKHN5bnByZWQyMDZfSW50ZXJuYWxEYXRhRFNMKCkpICkge3MgPSA3Nzt9CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIChzeW5wcmVkMjI1X0ludGVybmFsRGF0YURTTCgpKSApIHtzID0gNzc7fQogCiAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICggKHRydWUpICkge3MgPSAzMzt9CiAKICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0LnNlZWsoaW5kZXgxNTJfMjcpOworICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXQuc2VlayhpbmRleDE2NV8yNyk7CiAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIHM+PTAgKSByZXR1cm4gczsKICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICBjYXNlIDI3IDogCi0gICAgICAgICAgICAgICAgICAgICAgICBpbnQgTEExNTJfMjggPSBpbnB1dC5MQSgxKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBMQTE2NV8yOCA9IGlucHV0LkxBKDEpOwogCiAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW5kZXgxNTJfMjggPSBpbnB1dC5pbmRleCgpOworICAgICAgICAgICAgICAgICAgICAgICAgaW50IGluZGV4MTY1XzI4ID0gaW5wdXQuaW5kZXgoKTsKICAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0LnJld2luZCgpOwogICAgICAgICAgICAgICAgICAgICAgICAgcyA9IC0xOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCAoc3lucHJlZDIwNl9JbnRlcm5hbERhdGFEU0woKSkgKSB7cyA9IDc3O30KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICggKHN5bnByZWQyMjVfSW50ZXJuYWxEYXRhRFNMKCkpICkge3MgPSA3Nzt9CiAKICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKCAodHJ1ZSkgKSB7cyA9IDMzO30KIAogICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXQuc2VlayhpbmRleDE1Ml8yOCk7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dC5zZWVrKGluZGV4MTY1XzI4KTsKICAgICAgICAgICAgICAgICAgICAgICAgIGlmICggcz49MCApIHJldHVybiBzOwogICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgIGNhc2UgMjggOiAKLSAgICAgICAgICAgICAgICAgICAgICAgIGludCBMQTE1Ml8yOSA9IGlucHV0LkxBKDEpOworICAgICAgICAgICAgICAgICAgICAgICAgaW50IExBMTY1XzI5ID0gaW5wdXQuTEEoMSk7CiAKICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbmRleDE1Ml8yOSA9IGlucHV0LmluZGV4KCk7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW5kZXgxNjVfMjkgPSBpbnB1dC5pbmRleCgpOwogICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXQucmV3aW5kKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICBzID0gLTE7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIChzeW5wcmVkMjA2X0ludGVybmFsRGF0YURTTCgpKSApIHtzID0gNzc7fQorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCAoc3lucHJlZDIyNV9JbnRlcm5hbERhdGFEU0woKSkgKSB7cyA9IDc3O30KIAogICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoICh0cnVlKSApIHtzID0gMzM7fQogCiAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICBpbnB1dC5zZWVrKGluZGV4MTUyXzI5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0LnNlZWsoaW5kZXgxNjVfMjkpOwogICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCBzPj0wICkgcmV0dXJuIHM7CiAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgY2FzZSAyOSA6IAotICAgICAgICAgICAgICAgICAgICAgICAgaW50IExBMTUyXzMwID0gaW5wdXQuTEEoMSk7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgTEExNjVfMzAgPSBpbnB1dC5MQSgxKTsKIAogICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgaW50IGluZGV4MTUyXzMwID0gaW5wdXQuaW5kZXgoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbmRleDE2NV8zMCA9IGlucHV0LmluZGV4KCk7CiAgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dC5yZXdpbmQoKTsKICAgICAgICAgICAgICAgICAgICAgICAgIHMgPSAtMTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICggKHN5bnByZWQyMDZfSW50ZXJuYWxEYXRhRFNMKCkpICkge3MgPSA3Nzt9CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIChzeW5wcmVkMjI1X0ludGVybmFsRGF0YURTTCgpKSApIHtzID0gNzc7fQogCiAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICggKHRydWUpICkge3MgPSAzMzt9CiAKICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0LnNlZWsoaW5kZXgxNTJfMzApOworICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXQuc2VlayhpbmRleDE2NV8zMCk7CiAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIHM+PTAgKSByZXR1cm4gczsKICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICBjYXNlIDMwIDogCi0gICAgICAgICAgICAgICAgICAgICAgICBpbnQgTEExNTJfMzEgPSBpbnB1dC5MQSgxKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBMQTE2NV8zMSA9IGlucHV0LkxBKDEpOwogCiAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW5kZXgxNTJfMzEgPSBpbnB1dC5pbmRleCgpOworICAgICAgICAgICAgICAgICAgICAgICAgaW50IGluZGV4MTY1XzMxID0gaW5wdXQuaW5kZXgoKTsKICAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0LnJld2luZCgpOwogICAgICAgICAgICAgICAgICAgICAgICAgcyA9IC0xOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCAoc3lucHJlZDIwNl9JbnRlcm5hbERhdGFEU0woKSkgKSB7cyA9IDc3O30KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICggKHN5bnByZWQyMjVfSW50ZXJuYWxEYXRhRFNMKCkpICkge3MgPSA3Nzt9CiAKICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKCAodHJ1ZSkgKSB7cyA9IDMzO30KIAogICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXQuc2VlayhpbmRleDE1Ml8zMSk7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dC5zZWVrKGluZGV4MTY1XzMxKTsKICAgICAgICAgICAgICAgICAgICAgICAgIGlmICggcz49MCApIHJldHVybiBzOwogICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgIGNhc2UgMzEgOiAKLSAgICAgICAgICAgICAgICAgICAgICAgIGludCBMQTE1Ml8zMiA9IGlucHV0LkxBKDEpOworICAgICAgICAgICAgICAgICAgICAgICAgaW50IExBMTY1XzMyID0gaW5wdXQuTEEoMSk7CiAKICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbmRleDE1Ml8zMiA9IGlucHV0LmluZGV4KCk7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW5kZXgxNjVfMzIgPSBpbnB1dC5pbmRleCgpOwogICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXQucmV3aW5kKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICBzID0gLTE7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIChzeW5wcmVkMjA2X0ludGVybmFsRGF0YURTTCgpKSApIHtzID0gNzc7fQorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCAoc3lucHJlZDIyNV9JbnRlcm5hbERhdGFEU0woKSkgKSB7cyA9IDc3O30KIAogICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoICh0cnVlKSApIHtzID0gMzM7fQogCiAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICBpbnB1dC5zZWVrKGluZGV4MTUyXzMyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0LnNlZWsoaW5kZXgxNjVfMzIpOwogICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCBzPj0wICkgcmV0dXJuIHM7CiAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGlmIChzdGF0ZS5iYWNrdHJhY2tpbmc+MCkge3N0YXRlLmZhaWxlZD10cnVlOyByZXR1cm4gLTE7fQogICAgICAgICAgICAgTm9WaWFibGVBbHRFeGNlcHRpb24gbnZhZSA9Ci0gICAgICAgICAgICAgICAgbmV3IE5vVmlhYmxlQWx0RXhjZXB0aW9uKGdldERlc2NyaXB0aW9uKCksIDE1MiwgX3MsIGlucHV0KTsKKyAgICAgICAgICAgICAgICBuZXcgTm9WaWFibGVBbHRFeGNlcHRpb24oZ2V0RGVzY3JpcHRpb24oKSwgMTY1LCBfcywgaW5wdXQpOwogICAgICAgICAgICAgZXJyb3IobnZhZSk7CiAgICAgICAgICAgICB0aHJvdyBudmFlOwogICAgICAgICB9CkBAIC04ODQxNiwxMSArOTM2NDUsMTEgQEAKICAgICBzdGF0aWMgZmluYWwgU3RyaW5nIGRmYV83OXMgPSAiXDExN1x1ZmZmZiI7CiAgICAgc3RhdGljIGZpbmFsIFN0cmluZyBkZmFfODBzID0gIlwxXDJcMTE2XHVmZmZmIjsKICAgICBzdGF0aWMgZmluYWwgU3RyaW5nIGRmYV84MXMgPSAiXDFcNFwxXDBcMTE1XHVmZmZmIjsKLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIGRmYV84MnMgPSAiXDFcdTAwOWFcMVwwXDExNVx1ZmZmZiI7CisgICAgc3RhdGljIGZpbmFsIFN0cmluZyBkZmFfODJzID0gIlwxXHUwMGE2XDFcMFwxMTVcdWZmZmYiOwogICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgZGZhXzgzcyA9ICJcMlx1ZmZmZlwxXDJcMTEzXHVmZmZmXDFcMSI7CiAgICAgc3RhdGljIGZpbmFsIFN0cmluZyBkZmFfODRzID0gIlwxXHVmZmZmXDFcMFwxMTVcdWZmZmZ9PiI7CiAgICAgc3RhdGljIGZpbmFsIFN0cmluZ1tdIGRmYV84NXMgPSB7Ci0gICAgICAgICAgICAiXDVcMlw1XHVmZmZmXDE1XDJcMVwxXDI3XDJcMjNcdWZmZmZcMlwyXDI3XHVmZmZmXDFcMlwxMlx1ZmZmZlwxXDJcNFx1ZmZmZlwxXDJcMVx1ZmZmZlwzMFwyXDFcdWZmZmZcMVwyXDEzXHVmZmZmXDJcMlwxXHVmZmZmXDJcMiIsCisgICAgICAgICAgICAiXDVcMlw1XHVmZmZmXDE1XDJcMVwxXDI3XDJcMzBcdWZmZmZcMlwyXDMxXHVmZmZmXDFcMlwxNVx1ZmZmZlwxXDJcNFx1ZmZmZlwxXDJcMVx1ZmZmZlwzMFwyXDFcdWZmZmZcMVwyXDE1XHVmZmZmXDJcMlwxXHVmZmZmXDJcMiIsCiAgICAgICAgICAgICAiXDFcdWZmZmYiLAogICAgICAgICAgICAgIiIsCiAgICAgICAgICAgICAiIiwKQEAgLTg4NTA5LDExICs5MzczOCwxMSBAQAogICAgIHN0YXRpYyBmaW5hbCBzaG9ydFtdIGRmYV84NCA9IERGQS51bnBhY2tFbmNvZGVkU3RyaW5nKGRmYV84NHMpOwogICAgIHN0YXRpYyBmaW5hbCBzaG9ydFtdW10gZGZhXzg1ID0gdW5wYWNrRW5jb2RlZFN0cmluZ0FycmF5KGRmYV84NXMpOwogCi0gICAgY2xhc3MgREZBMTYxIGV4dGVuZHMgREZBIHsKKyAgICBjbGFzcyBERkExNzQgZXh0ZW5kcyBERkEgewogCi0gICAgICAgIHB1YmxpYyBERkExNjEoQmFzZVJlY29nbml6ZXIgcmVjb2duaXplcikgeworICAgICAgICBwdWJsaWMgREZBMTc0KEJhc2VSZWNvZ25pemVyIHJlY29nbml6ZXIpIHsKICAgICAgICAgICAgIHRoaXMucmVjb2duaXplciA9IHJlY29nbml6ZXI7Ci0gICAgICAgICAgICB0aGlzLmRlY2lzaW9uTnVtYmVyID0gMTYxOworICAgICAgICAgICAgdGhpcy5kZWNpc2lvbk51bWJlciA9IDE3NDsKICAgICAgICAgICAgIHRoaXMuZW90ID0gZGZhXzc5OwogICAgICAgICAgICAgdGhpcy5lb2YgPSBkZmFfODA7CiAgICAgICAgICAgICB0aGlzLm1pbiA9IGRmYV84MTsKQEAgLTg4NTIzLDQxICs5Mzc1Miw0MSBAQAogICAgICAgICAgICAgdGhpcy50cmFuc2l0aW9uID0gZGZhXzg1OwogICAgICAgICB9CiAgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0RGVzY3JpcHRpb24oKSB7Ci0gICAgICAgICAgICByZXR1cm4gIjIwNjMwOjI6ICggcnVsZV9fSnZtUGFyYW1ldGVyaXplZFR5cGVSZWZlcmVuY2VfX0dyb3VwXzFfXzAgKT8iOworICAgICAgICAgICAgcmV0dXJuICIyMTk2ODoyOiAoIHJ1bGVfX0p2bVBhcmFtZXRlcml6ZWRUeXBlUmVmZXJlbmNlX19Hcm91cF8xX18wICk/IjsKICAgICAgICAgfQogICAgICAgICBwdWJsaWMgaW50IHNwZWNpYWxTdGF0ZVRyYW5zaXRpb24oaW50IHMsIEludFN0cmVhbSBfaW5wdXQpIHRocm93cyBOb1ZpYWJsZUFsdEV4Y2VwdGlvbiB7CiAgICAgICAgICAgICBUb2tlblN0cmVhbSBpbnB1dCA9IChUb2tlblN0cmVhbSlfaW5wdXQ7CiAgICAgICAgIAlpbnQgX3MgPSBzOwogICAgICAgICAgICAgc3dpdGNoICggcyApIHsKICAgICAgICAgICAgICAgICAgICAgY2FzZSAwIDogCi0gICAgICAgICAgICAgICAgICAgICAgICBpbnQgTEExNjFfMSA9IGlucHV0LkxBKDEpOworICAgICAgICAgICAgICAgICAgICAgICAgaW50IExBMTc0XzEgPSBpbnB1dC5MQSgxKTsKIAogICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgaW50IGluZGV4MTYxXzEgPSBpbnB1dC5pbmRleCgpOworICAgICAgICAgICAgICAgICAgICAgICAgaW50IGluZGV4MTc0XzEgPSBpbnB1dC5pbmRleCgpOwogICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXQucmV3aW5kKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICBzID0gLTE7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIChzeW5wcmVkMjE1X0ludGVybmFsRGF0YURTTCgpKSApIHtzID0gNzg7fQorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCAoc3lucHJlZDIzNF9JbnRlcm5hbERhdGFEU0woKSkgKSB7cyA9IDc4O30KIAogICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoICh0cnVlKSApIHtzID0gMjt9CiAKICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0LnNlZWsoaW5kZXgxNjFfMSk7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dC5zZWVrKGluZGV4MTc0XzEpOwogICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCBzPj0wICkgcmV0dXJuIHM7CiAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGlmIChzdGF0ZS5iYWNrdHJhY2tpbmc+MCkge3N0YXRlLmZhaWxlZD10cnVlOyByZXR1cm4gLTE7fQogICAgICAgICAgICAgTm9WaWFibGVBbHRFeGNlcHRpb24gbnZhZSA9Ci0gICAgICAgICAgICAgICAgbmV3IE5vVmlhYmxlQWx0RXhjZXB0aW9uKGdldERlc2NyaXB0aW9uKCksIDE2MSwgX3MsIGlucHV0KTsKKyAgICAgICAgICAgICAgICBuZXcgTm9WaWFibGVBbHRFeGNlcHRpb24oZ2V0RGVzY3JpcHRpb24oKSwgMTc0LCBfcywgaW5wdXQpOwogICAgICAgICAgICAgZXJyb3IobnZhZSk7CiAgICAgICAgICAgICB0aHJvdyBudmFlOwogICAgICAgICB9CiAgICAgfQogCi0gICAgY2xhc3MgREZBMTY0IGV4dGVuZHMgREZBIHsKKyAgICBjbGFzcyBERkExNzcgZXh0ZW5kcyBERkEgewogCi0gICAgICAgIHB1YmxpYyBERkExNjQoQmFzZVJlY29nbml6ZXIgcmVjb2duaXplcikgeworICAgICAgICBwdWJsaWMgREZBMTc3KEJhc2VSZWNvZ25pemVyIHJlY29nbml6ZXIpIHsKICAgICAgICAgICAgIHRoaXMucmVjb2duaXplciA9IHJlY29nbml6ZXI7Ci0gICAgICAgICAgICB0aGlzLmRlY2lzaW9uTnVtYmVyID0gMTY0OworICAgICAgICAgICAgdGhpcy5kZWNpc2lvbk51bWJlciA9IDE3NzsKICAgICAgICAgICAgIHRoaXMuZW90ID0gZGZhXzc5OwogICAgICAgICAgICAgdGhpcy5lb2YgPSBkZmFfODA7CiAgICAgICAgICAgICB0aGlzLm1pbiA9IGRmYV84MTsKQEAgLTg4NTY3LDMxICs5Mzc5NiwzMSBAQAogICAgICAgICAgICAgdGhpcy50cmFuc2l0aW9uID0gZGZhXzg1OwogICAgICAgICB9CiAgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0RGVzY3JpcHRpb24oKSB7Ci0gICAgICAgICAgICByZXR1cm4gIjIwOTAwOjI6ICggcnVsZV9fSnZtUGFyYW1ldGVyaXplZFR5cGVSZWZlcmVuY2VfX0dyb3VwXzFfNF8yX18wICk/IjsKKyAgICAgICAgICAgIHJldHVybiAiMjIyMzg6MjogKCBydWxlX19Kdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZV9fR3JvdXBfMV80XzJfXzAgKT8iOwogICAgICAgICB9CiAgICAgICAgIHB1YmxpYyBpbnQgc3BlY2lhbFN0YXRlVHJhbnNpdGlvbihpbnQgcywgSW50U3RyZWFtIF9pbnB1dCkgdGhyb3dzIE5vVmlhYmxlQWx0RXhjZXB0aW9uIHsKICAgICAgICAgICAgIFRva2VuU3RyZWFtIGlucHV0ID0gKFRva2VuU3RyZWFtKV9pbnB1dDsKICAgICAgICAgCWludCBfcyA9IHM7CiAgICAgICAgICAgICBzd2l0Y2ggKCBzICkgewogICAgICAgICAgICAgICAgICAgICBjYXNlIDAgOiAKLSAgICAgICAgICAgICAgICAgICAgICAgIGludCBMQTE2NF8xID0gaW5wdXQuTEEoMSk7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgTEExNzdfMSA9IGlucHV0LkxBKDEpOwogCiAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW5kZXgxNjRfMSA9IGlucHV0LmluZGV4KCk7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW5kZXgxNzdfMSA9IGlucHV0LmluZGV4KCk7CiAgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dC5yZXdpbmQoKTsKICAgICAgICAgICAgICAgICAgICAgICAgIHMgPSAtMTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICggKHN5bnByZWQyMThfSW50ZXJuYWxEYXRhRFNMKCkpICkge3MgPSA3ODt9CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIChzeW5wcmVkMjM3X0ludGVybmFsRGF0YURTTCgpKSApIHtzID0gNzg7fQogCiAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICggKHRydWUpICkge3MgPSAyO30KIAogICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXQuc2VlayhpbmRleDE2NF8xKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0LnNlZWsoaW5kZXgxNzdfMSk7CiAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIHM+PTAgKSByZXR1cm4gczsKICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgaWYgKHN0YXRlLmJhY2t0cmFja2luZz4wKSB7c3RhdGUuZmFpbGVkPXRydWU7IHJldHVybiAtMTt9CiAgICAgICAgICAgICBOb1ZpYWJsZUFsdEV4Y2VwdGlvbiBudmFlID0KLSAgICAgICAgICAgICAgICBuZXcgTm9WaWFibGVBbHRFeGNlcHRpb24oZ2V0RGVzY3JpcHRpb24oKSwgMTY0LCBfcywgaW5wdXQpOworICAgICAgICAgICAgICAgIG5ldyBOb1ZpYWJsZUFsdEV4Y2VwdGlvbihnZXREZXNjcmlwdGlvbigpLCAxNzcsIF9zLCBpbnB1dCk7CiAgICAgICAgICAgICBlcnJvcihudmFlKTsKICAgICAgICAgICAgIHRocm93IG52YWU7CiAgICAgICAgIH0KQEAgLTg4NjAyLDE1OSArOTM4MzEsMTY3IEBACiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBCaXRTZXQgRk9MTE9XXzIgPSBuZXcgQml0U2V0KG5ldyBsb25nW117MHgwMDAwMDAwMDAwMDAwMDAyTH0pOwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgQml0U2V0IEZPTExPV18zID0gbmV3IEJpdFNldChuZXcgbG9uZ1tdezB4MDAwMDgwMDAwMDAwMDAwMkx9KTsKICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEJpdFNldCBGT0xMT1dfNCA9IG5ldyBCaXRTZXQobmV3IGxvbmdbXXsweDAwMDAwMDAwMDAwMDAwMjJMfSk7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBCaXRTZXQgRk9MTE9XXzUgPSBuZXcgQml0U2V0KG5ldyBsb25nW117MHgwMDAwMDAwMDAwMDAwMDAwTCwweDAwMDAwMDAwMDAwMDAwMTBMfSk7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBCaXRTZXQgRk9MTE9XXzYgPSBuZXcgQml0U2V0KG5ldyBsb25nW117MHgwMDAwMDAwMDAwMDAwMDAyTCwweDAwMDAwMDAwMDAwMDAwMTBMfSk7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBCaXRTZXQgRk9MTE9XXzUgPSBuZXcgQml0U2V0KG5ldyBsb25nW117MHgwMDAwMDAwMDAwMDAwMDAwTCwweDAwMDAwMDAwMDAwMDAyMDBMfSk7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBCaXRTZXQgRk9MTE9XXzYgPSBuZXcgQml0U2V0KG5ldyBsb25nW117MHgwMDAwMDAwMDAwMDAwMDAyTCwweDAwMDAwMDAwMDAwMDAyMDBMfSk7CiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBCaXRTZXQgRk9MTE9XXzcgPSBuZXcgQml0U2V0KG5ldyBsb25nW117MHgwMDAwMDAwMDAwMDAwMDIwTH0pOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgQml0U2V0IEZPTExPV184ID0gbmV3IEJpdFNldChuZXcgbG9uZ1tdezB4MDAwMDAwMDAwMDAwMDAwMEwsMHgwMDAwMDAwMDAwMDAwMDIwTH0pOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgQml0U2V0IEZPTExPV184ID0gbmV3IEJpdFNldChuZXcgbG9uZ1tdezB4MDAwMDAwMDAwMDAwMDAwMEwsMHgwMDAwMDAwMDAwMDAwNDAwTH0pOwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgQml0U2V0IEZPTExPV185ID0gbmV3IEJpdFNldChuZXcgbG9uZ1tdezB4MDAwMDAwMDAwMDAwMDAxMEx9KTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEJpdFNldCBGT0xMT1dfMTAgPSBuZXcgQml0U2V0KG5ldyBsb25nW117MHgwMDAwMDAwMDAwMDAwMDAwTCwweDAwMDAwMDAwMDAwMDAwNDBMfSk7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBCaXRTZXQgRk9MTE9XXzExID0gbmV3IEJpdFNldChuZXcgbG9uZ1tdezB4MDAwMDAwMDAwMDAwMDAwMEwsMHgwMDAwMDAwMDAwMDAwMTgwTH0pOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgQml0U2V0IEZPTExPV18xMiA9IG5ldyBCaXRTZXQobmV3IGxvbmdbXXsweDAwMDAwMDAwMDAwMDAwMDJMLDB4MDAwMDAwMDAwMDAwMDEwMEx9KTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEJpdFNldCBGT0xMT1dfMTMgPSBuZXcgQml0U2V0KG5ldyBsb25nW117MHgwMDAwMDAwMDAwMDAwMDAwTCwweDAwMDAwMDAwMDAwMDAxMDBMfSk7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBCaXRTZXQgRk9MTE9XXzE0ID0gbmV3IEJpdFNldChuZXcgbG9uZ1tdezB4MDAwMDAwMDAwMDAwMDAwMEwsMHgwMDAwMDAwMDAwMDAwMDBFTCwweDAwMDAwMDAwMDAwMDA4MDBMfSk7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBCaXRTZXQgRk9MTE9XXzE1ID0gbmV3IEJpdFNldChuZXcgbG9uZ1tdezB4MDAwMDAwMDAwMDAwMDAwMEwsMHgwMDAwMDAwMDAwMDAxQTAwTCwweDAwMDAwMDAwMDAwMDEwMDBMfSk7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBCaXRTZXQgRk9MTE9XXzE2ID0gbmV3IEJpdFNldChuZXcgbG9uZ1tdezB4MDAwMDAwMDAwMDAwMDAwMEwsMHgwMDAwMDAwMDAwMTEyMDAwTH0pOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgQml0U2V0IEZPTExPV18xNyA9IG5ldyBCaXRTZXQobmV3IGxvbmdbXXsweDAwMDAwMDAwMDAwMDAwMDBMLDB4MDAwMDAwMDAwMDAwMDQwMEx9KTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEJpdFNldCBGT0xMT1dfMTggPSBuZXcgQml0U2V0KG5ldyBsb25nW117MHgwMDAwMDAwMDAwMDAwMDAwTCwweDAwMDAwMDAwMDA0MDAwODBMfSk7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBCaXRTZXQgRk9MTE9XXzE5ID0gbmV3IEJpdFNldChuZXcgbG9uZ1tdezB4MDAwMDAwMDAwMDAwMDAwMkwsMHgwMDAwMDAwMDAwNDAwMDAwTH0pOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgQml0U2V0IEZPTExPV18xMCA9IG5ldyBCaXRTZXQobmV3IGxvbmdbXXsweDAwMDAwMDAwMDAwMDAwMDBMLDB4MDAwMDAwMDAwMDAwMDgwMEx9KTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEJpdFNldCBGT0xMT1dfMTEgPSBuZXcgQml0U2V0KG5ldyBsb25nW117MHgwMDAwMDAwMDAwMDAwMDAwTCwweDAwMDAwMDAwMDAwMDMwMDBMfSk7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBCaXRTZXQgRk9MTE9XXzEyID0gbmV3IEJpdFNldChuZXcgbG9uZ1tdezB4MDAwMDAwMDAwMDAwMDAwMkwsMHgwMDAwMDAwMDAwMDAyMDAwTH0pOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgQml0U2V0IEZPTExPV18xMyA9IG5ldyBCaXRTZXQobmV3IGxvbmdbXXsweDAwMDAwMDAwMDAwMDAwMDBMLDB4MDAwMDAwMDAwMDAwMjAwMEx9KTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEJpdFNldCBGT0xMT1dfMTQgPSBuZXcgQml0U2V0KG5ldyBsb25nW117MHgwMDAwMDAwMDAwMDAwMDAwTCwweDAwMDAwMDAwMDAwMDAwMEVMLDB4MDAwMDAwMDAwMDIwMDAwMEx9KTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEJpdFNldCBGT0xMT1dfMTUgPSBuZXcgQml0U2V0KG5ldyBsb25nW117MHgwMDAwMDAwMDAwMDAwMDAwTCwweDAwMDAwMDAwMDAwMzQwMDBMLDB4MDAwMDAwMDAwMEMwMDAwMEx9KTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEJpdFNldCBGT0xMT1dfMTYgPSBuZXcgQml0U2V0KG5ldyBsb25nW117MHgwMDAwMDAwMDAwMDAwMDAwTCwweDAwMDAwMDAwMDIyNDAwMDBMfSk7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBCaXRTZXQgRk9MTE9XXzE3ID0gbmV3IEJpdFNldChuZXcgbG9uZ1tdezB4MDAwMDAwMDAwMDAwMDAwMEwsMHgwMDAwMDAwMDAwMDA4MDAwTH0pOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgQml0U2V0IEZPTExPV18xOCA9IG5ldyBCaXRTZXQobmV3IGxvbmdbXXsweDAwMDAwMDAwMDAwMDAwMDBMLDB4MDAwMDAwMDAwODAwMTAwMEx9KTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEJpdFNldCBGT0xMT1dfMTkgPSBuZXcgQml0U2V0KG5ldyBsb25nW117MHgwMDAwMDAwMDAwMDAwMDAyTCwweDAwMDAwMDAwMDgwMDAwMDBMfSk7CiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBCaXRTZXQgRk9MTE9XXzIwID0gbmV3IEJpdFNldChuZXcgbG9uZ1tdezB4MDAwMDAwMDAwMDAwMDA4MEx9KTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEJpdFNldCBGT0xMT1dfMjEgPSBuZXcgQml0U2V0KG5ldyBsb25nW117MHgwMDAwMDAwMDAwMDAwMDAwTCwweDAwMDAwMDAwMDAwMDIwMDBMfSk7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBCaXRTZXQgRk9MTE9XXzIyID0gbmV3IEJpdFNldChuZXcgbG9uZ1tdezB4MDAwMDAwMDAwMDAwMDAwMEwsMHgwMDAwMDAwMDAwMDBDMDAwTCwweDAwMDAwMDAwMDAwMDIwMDBMfSk7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBCaXRTZXQgRk9MTE9XXzIzID0gbmV3IEJpdFNldChuZXcgbG9uZ1tdezB4MDAwMDAwMDAwMDAwMDAwMEwsMHgwMDAwMDAwMDAwMDEwMDAwTH0pOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgQml0U2V0IEZPTExPV18yNCA9IG5ldyBCaXRTZXQobmV3IGxvbmdbXXsweDAwMDAwMDAwMDAwMDAwMDBMLDB4MDAwMDAwMDAwMDBFQzAwMEwsMHgwMDAwMDAwMDAwMDA0MDAwTH0pOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgQml0U2V0IEZPTExPV18yNSA9IG5ldyBCaXRTZXQobmV3IGxvbmdbXXsweDAwMDAwMDAwMDAwMDAwMDBMLDB4MDAwMDAwMDAwMDAwQzAwMEx9KTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEJpdFNldCBGT0xMT1dfMjYgPSBuZXcgQml0U2V0KG5ldyBsb25nW117MHgwMDAwMDAwMDAwMDAwMDAwTCwweDAwMDAwMDAwMDAyMDAwMDBMfSk7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBCaXRTZXQgRk9MTE9XXzI3ID0gbmV3IEJpdFNldChuZXcgbG9uZ1tdezB4MDAwMDAwMDAwMDAwMDAwMEwsMHgwMDAwMDAwMDAwMDAwMDAwTCwweDAwMDAwMDAwMDAwMDgwMDBMfSk7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBCaXRTZXQgRk9MTE9XXzI4ID0gbmV3IEJpdFNldChuZXcgbG9uZ1tdezB4MDAwMDAwMDAwMDAwMDAwMEwsMHgwMDAwMDAwMDAwNDAwMDAwTH0pOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgQml0U2V0IEZPTExPV18yOSA9IG5ldyBCaXRTZXQobmV3IGxvbmdbXXsweDAwMDAwMDAwMDAwMDAwMDBMLDB4MDAwMDAwMDAzRjgwMDAwMEwsMHgwMDAwMDAwMDAwMDEwMDAwTH0pOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgQml0U2V0IEZPTExPV18zMCA9IG5ldyBCaXRTZXQobmV3IGxvbmdbXXsweDAwMDAwMDAwMDAwMDAwMDBMLDB4MDAwMDAyNDAwMDAwMDA4MEx9KTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEJpdFNldCBGT0xMT1dfMzEgPSBuZXcgQml0U2V0KG5ldyBsb25nW117MHgwMDAwMDAwMDAwMDAwMDAyTCwweDAwMDAwMjQwMDAwMDAwMDBMfSk7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBCaXRTZXQgRk9MTE9XXzMyID0gbmV3IEJpdFNldChuZXcgbG9uZ1tdezB4MDAwMDAwMDAwMDAwMDAwMEwsMHgwMDAwMDAwMDgwMDAwMDgwTH0pOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgQml0U2V0IEZPTExPV18zMyA9IG5ldyBCaXRTZXQobmV3IGxvbmdbXXsweDAwMDAwMDAwMDAwMDAwMDJMLDB4MDAwMDAwMDA4MDAwMDAwMEx9KTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEJpdFNldCBGT0xMT1dfMzQgPSBuZXcgQml0U2V0KG5ldyBsb25nW117MHgwMDAwMDAwMDAwMDAwMDAwTCwweDAwMDAyODAwMDAwMDAwODBMfSk7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBCaXRTZXQgRk9MTE9XXzM1ID0gbmV3IEJpdFNldChuZXcgbG9uZ1tdezB4MDAwMDAwMDAwMDAwMDAwMkwsMHgwMDAwMjgwMDAwMDAwMDAwTH0pOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgQml0U2V0IEZPTExPV18zNiA9IG5ldyBCaXRTZXQobmV3IGxvbmdbXXsweDAwMDAwMDAwMDAwMDAwMDBMLDB4MDAwMDAwMDA0MDAwMDA4MEx9KTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEJpdFNldCBGT0xMT1dfMzcgPSBuZXcgQml0U2V0KG5ldyBsb25nW117MHgwMDAwMDAwMDAwMDAwMDAyTCwweDAwMDAwMDAwNDAwMDAwMDBMfSk7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBCaXRTZXQgRk9MTE9XXzM4ID0gbmV3IEJpdFNldChuZXcgbG9uZ1tdezB4MDAwMDAwMDAwMDAwMDAwMEwsMHgwMDAwMDAwMDQwMDAwMDAwTH0pOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgQml0U2V0IEZPTExPV18zOSA9IG5ldyBCaXRTZXQobmV3IGxvbmdbXXsweDAwMDAwMDAwMDAwMDAwMDBMLDB4MDAwMDAwMDA4MDAwMDAwMEx9KTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEJpdFNldCBGT0xMT1dfNDAgPSBuZXcgQml0U2V0KG5ldyBsb25nW117MHgwMDAwMDAwMDAwMDAwMDAwTCwweDAwMDAwMDAxMDAwMDAwMDBMfSk7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBCaXRTZXQgRk9MTE9XXzQxID0gbmV3IEJpdFNldChuZXcgbG9uZ1tdezB4MDAwMDAwMDAwMDAwMDAwMEwsMHgwMDAwMDAwMjAxMDAwMDAwTH0pOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgQml0U2V0IEZPTExPV180MiA9IG5ldyBCaXRTZXQobmV3IGxvbmdbXXsweDAwMDAwMDAwMDAwMDAwMDBMLDB4MDAwMDAwMEMwMDAwMDAwMEwsMHgwMDAwMDAwMDAwMEUwMDAwTH0pOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgQml0U2V0IEZPTExPV180MyA9IG5ldyBCaXRTZXQobmV3IGxvbmdbXXsweDAwMDAwMDAwMDAwMDAwMDBMLDB4MDAwMDAwMDgwMDAwMDAwMEwsMHgwMDAwMDAwMDAwMEMwMDAwTH0pOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgQml0U2V0IEZPTExPV180NCA9IG5ldyBCaXRTZXQobmV3IGxvbmdbXXsweDAwMDAwMDAwMDAwMDAwMDBMLDB4MDAwMDAwMTAwMDAwMDA4MEx9KTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEJpdFNldCBGT0xMT1dfNDUgPSBuZXcgQml0U2V0KG5ldyBsb25nW117MHgwMDAwMDAwMDAwMDAwMDAyTCwweDAwMDAwMDEwMDAwMDAwMDBMfSk7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBCaXRTZXQgRk9MTE9XXzQ2ID0gbmV3IEJpdFNldChuZXcgbG9uZ1tdezB4MDAwMDAwMDAwMDAwMDAwMEwsMHgwMDAwMDAxMDAwMDAwMDAwTH0pOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgQml0U2V0IEZPTExPV180NyA9IG5ldyBCaXRTZXQobmV3IGxvbmdbXXsweDAwMDAwMDAwMDAwMDAwMDBMLDB4MDAwMDAwMDAwMDAwMDAwMEwsMHgwMDAwMDAwMDAwMTAwMDAwTH0pOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgQml0U2V0IEZPTExPV180OCA9IG5ldyBCaXRTZXQobmV3IGxvbmdbXXsweDAwMDAwMDAwMDAwMDAwMDBMLDB4MDAwMDAwMjAwMDAwMDAwMEx9KTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEJpdFNldCBGT0xMT1dfNDkgPSBuZXcgQml0U2V0KG5ldyBsb25nW117MHgwMDAwMDAwMDAwMDAwMDAwTCwweDAwMDAwMDQwMDAwMDAwMDBMfSk7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBCaXRTZXQgRk9MTE9XXzUwID0gbmV3IEJpdFNldChuZXcgbG9uZ1tdezB4MDAwMDAwMDAwMDAwMDAwMEwsMHgwMDAwMDA4MDAwMDAwMDAwTH0pOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgQml0U2V0IEZPTExPV181MSA9IG5ldyBCaXRTZXQobmV3IGxvbmdbXXsweDAwMDAwMDAwMDAwMDAwMDBMLDB4MDAwMDAxMDAwMDAwMDAwMEx9KTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEJpdFNldCBGT0xMT1dfNTIgPSBuZXcgQml0U2V0KG5ldyBsb25nW117MHgwMDAwMDAwMDAwMDAwMDAwTCwweDAwMDAwMjQwMDAwMDAwMDBMfSk7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBCaXRTZXQgRk9MTE9XXzUzID0gbmV3IEJpdFNldChuZXcgbG9uZ1tdezB4MDAwMDAwMDAwMDAwMDAwMEwsMHgwMDAwMDAwMjAwMDAwMDAwTH0pOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgQml0U2V0IEZPTExPV181NCA9IG5ldyBCaXRTZXQobmV3IGxvbmdbXXsweDBFMDAwMDAwMDAwMDAwMDBMfSk7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBCaXRTZXQgRk9MTE9XXzU1ID0gbmV3IEJpdFNldChuZXcgbG9uZ1tdezB4MDAwMDAwMDAwMDAwMDAwMEwsMHgwMDAwMDQwMDAwMDAwMDAwTH0pOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgQml0U2V0IEZPTExPV181NiA9IG5ldyBCaXRTZXQobmV3IGxvbmdbXXsweEYwMDAwMDAwMDAwMDAwMDBMLDB4MDAwMDAwMDAwMDAwMDAwMUx9KTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEJpdFNldCBGT0xMT1dfNTcgPSBuZXcgQml0U2V0KG5ldyBsb25nW117MHgwMDAwMDAwMDAwMDAwMDAwTCwweDAwMDAwODAwMDAwMDAwMDBMfSk7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBCaXRTZXQgRk9MTE9XXzU4ID0gbmV3IEJpdFNldChuZXcgbG9uZ1tdezB4MDAwMDAwMDAwMDAwMDAwMEwsMHgwMDAwMTAwMDAwMDAwMDAwTH0pOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgQml0U2V0IEZPTExPV181OSA9IG5ldyBCaXRTZXQobmV3IGxvbmdbXXsweDAwMDAwMDAwMDAwMDAwMDBMLDB4MDAwMDI4MDAwMDAwMDAwMEx9KTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEJpdFNldCBGT0xMT1dfNjAgPSBuZXcgQml0U2V0KG5ldyBsb25nW117MHgwMDAxMDAwMDAwMDAwMDAwTCwweDAwMDA0MDAwMDAwMDA0MDBMfSk7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBCaXRTZXQgRk9MTE9XXzYxID0gbmV3IEJpdFNldChuZXcgbG9uZ1tdezB4MDFGODAwMDAwMDAwMDAwMEx9KTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEJpdFNldCBGT0xMT1dfNjIgPSBuZXcgQml0U2V0KG5ldyBsb25nW117MHgwMDAwMDgwMDAwMDAwMDAwTH0pOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgQml0U2V0IEZPTExPV182MyA9IG5ldyBCaXRTZXQobmV3IGxvbmdbXXsweDAwMDAwODAwMDAwMDAwMDJMfSk7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBCaXRTZXQgRk9MTE9XXzY0ID0gbmV3IEJpdFNldChuZXcgbG9uZ1tdezB4MDAwMDgwMDAwMDAwMDAwMEx9KTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEJpdFNldCBGT0xMT1dfNjUgPSBuZXcgQml0U2V0KG5ldyBsb25nW117MHgwMDAwNDAwMDAwMDAwMDIwTCwweDAwMDAwMDAwMDAwMDAwMDBMLDB4MDAwMDAwMDAwMDIwMDAwMEx9KTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEJpdFNldCBGT0xMT1dfNjYgPSBuZXcgQml0U2V0KG5ldyBsb25nW117MHgwMDAwMDAwMDAwMDAwMDAwTCwweDAwMDA4MDAwMDAwMDAwMDBMfSk7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBCaXRTZXQgRk9MTE9XXzY3ID0gbmV3IEJpdFNldChuZXcgbG9uZ1tdezB4MDAwMTAwMDAwMDAwMDAyMEx9KTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEJpdFNldCBGT0xMT1dfNjggPSBuZXcgQml0U2V0KG5ldyBsb25nW117MHgwMDAwMDAxMDAwMDAwMDIwTH0pOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgQml0U2V0IEZPTExPV182OSA9IG5ldyBCaXRTZXQobmV3IGxvbmdbXXsweDAwMDAwMDAwMDAwMDAwMDBMLDB4MDAwMTAwMDAwMDAwMDAwMEx9KTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEJpdFNldCBGT0xMT1dfNzAgPSBuZXcgQml0U2V0KG5ldyBsb25nW117MHgwMDAwMDAwMDAwMDAwMDAwTCwweDAwMDIwMDAwMDAwMDAwMDBMfSk7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBCaXRTZXQgRk9MTE9XXzcxID0gbmV3IEJpdFNldChuZXcgbG9uZ1tdezB4MDAwN0UxMEMwODAwMDFGMEwsMHhDNTY3MDAwMDgwMDAwMDQwTCwweDAwMDAwMDAwMDQwMDAwQkZMfSk7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBCaXRTZXQgRk9MTE9XXzcyID0gbmV3IEJpdFNldChuZXcgbG9uZ1tdezB4MDAwMDAwMDAwMDAwMDAwMEwsMHgwMDA4MDAwMDAwMDAwMDAwTH0pOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgQml0U2V0IEZPTExPV183MyA9IG5ldyBCaXRTZXQobmV3IGxvbmdbXXsweDAwMDAwMDAwMDAwMDAwMDJMLDB4MDAwODAwMDAwMDAwMDAwMEx9KTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEJpdFNldCBGT0xMT1dfNzQgPSBuZXcgQml0U2V0KG5ldyBsb25nW117MHgwMDA3RTEwQzA4MDAwMUYwTCwweEM1NjMwMDAwODAwMDAwNDBMLDB4MDAwMDAwMDAwNDAwMDBCRkx9KTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEJpdFNldCBGT0xMT1dfNzUgPSBuZXcgQml0U2V0KG5ldyBsb25nW117MHgwMDAwMDAwMDAwMDAyMDAwTH0pOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgQml0U2V0IEZPTExPV183NiA9IG5ldyBCaXRTZXQobmV3IGxvbmdbXXsweDAwMDdFMTBDMDgwMDAxRjBMLDB4QzU3MzAwMDA4MDAwMDA0MEwsMHgwMDAwMDAwMDA0MDAwMEJGTH0pOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgQml0U2V0IEZPTExPV183NyA9IG5ldyBCaXRTZXQobmV3IGxvbmdbXXsweDAwMDAwMDAwMDAwMDAwMDBMLDB4MDAyMDAwMDAwMDAwMDAwMEx9KTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEJpdFNldCBGT0xMT1dfNzggPSBuZXcgQml0U2V0KG5ldyBsb25nW117MHgwMDAwMDAwMDAwMDAwMDAwTCwweDAwNDAwMDAwMDAwMDAwMDBMfSk7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBCaXRTZXQgRk9MTE9XXzc5ID0gbmV3IEJpdFNldChuZXcgbG9uZ1tdezB4MDAwMUUwMDAwMDAwMDAyMEx9KTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEJpdFNldCBGT0xMT1dfODAgPSBuZXcgQml0U2V0KG5ldyBsb25nW117MHgwMDAwMDAwMDBDMUYwMDAwTH0pOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgQml0U2V0IEZPTExPV184MSA9IG5ldyBCaXRTZXQobmV3IGxvbmdbXXsweDAwMDAwMDAwMDgwMDAwMDBMfSk7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBCaXRTZXQgRk9MTE9XXzgyID0gbmV3IEJpdFNldChuZXcgbG9uZ1tdezB4MDAwMDAwMDAwNjAwMDAwMEx9KTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEJpdFNldCBGT0xMT1dfODMgPSBuZXcgQml0U2V0KG5ldyBsb25nW117MHgwMDAwMDAwMDAwMDA0MDAwTH0pOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgQml0U2V0IEZPTExPV184NCA9IG5ldyBCaXRTZXQobmV3IGxvbmdbXXsweDAwMDAwMDAwMDAwMDQwMDJMfSk7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBCaXRTZXQgRk9MTE9XXzg1ID0gbmV3IEJpdFNldChuZXcgbG9uZ1tdezB4MDAwMDAwMDAwMDAwODAwMEx9KTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEJpdFNldCBGT0xMT1dfODYgPSBuZXcgQml0U2V0KG5ldyBsb25nW117MHgwMDAwMDAwMDAwMDA4MDAyTH0pOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgQml0U2V0IEZPTExPV184NyA9IG5ldyBCaXRTZXQobmV3IGxvbmdbXXsweDAwMDAwMDAwMDFFMDAwMDBMfSk7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBCaXRTZXQgRk9MTE9XXzg4ID0gbmV3IEJpdFNldChuZXcgbG9uZ1tdezB4MDAwMDAwMDAwMUUwMDAwMkx9KTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEJpdFNldCBGT0xMT1dfODkgPSBuZXcgQml0U2V0KG5ldyBsb25nW117MHgwMDAwMDAwMDBFMDAwMDAwTCwweDAwODAwMDAwMDAwMDAwMDBMfSk7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBCaXRTZXQgRk9MTE9XXzkwID0gbmV3IEJpdFNldChuZXcgbG9uZ1tdezB4MDAwMDAwMDAwRTAwMDAwMkwsMHgwMDgwMDAwMDAwMDAwMDAwTH0pOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgQml0U2V0IEZPTExPV185MSA9IG5ldyBCaXRTZXQobmV3IGxvbmdbXXsweDAwMDAwMDAwODAwMDAwMjBMLDB4MDAwMjAwMDAwMDAwMDAwMEx9KTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEJpdFNldCBGT0xMT1dfOTIgPSBuZXcgQml0U2V0KG5ldyBsb25nW117MHgwMDAwMDAwMDAwMDAwMDAwTCwweDAwODAwMDAwMDAwMDAwMDBMfSk7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBCaXRTZXQgRk9MTE9XXzkzID0gbmV3IEJpdFNldChuZXcgbG9uZ1tdezB4MDAwMDAwMDNGQzAwMDAwMEx9KTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEJpdFNldCBGT0xMT1dfOTQgPSBuZXcgQml0U2V0KG5ldyBsb25nW117MHgwMDAwMDAwM0ZDMDAwMDAyTH0pOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgQml0U2V0IEZPTExPV185NSA9IG5ldyBCaXRTZXQobmV3IGxvbmdbXXsweDAwMDAwMDAwNDAwMDAwMDBMfSk7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBCaXRTZXQgRk9MTE9XXzk2ID0gbmV3IEJpdFNldChuZXcgbG9uZ1tdezB4MDAwMDAwMDAwNDAwMDAwMEx9KTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEJpdFNldCBGT0xMT1dfOTcgPSBuZXcgQml0U2V0KG5ldyBsb25nW117MHgwMDAwMDAwMDg4MDAwMDAwTH0pOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgQml0U2V0IEZPTExPV185OCA9IG5ldyBCaXRTZXQobmV3IGxvbmdbXXsweDAwMDAwMDBDMDAwMDAwMDBMfSk7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBCaXRTZXQgRk9MTE9XXzk5ID0gbmV3IEJpdFNldChuZXcgbG9uZ1tdezB4MDAwMDAwMEMwMDAwMDAwMkx9KTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEJpdFNldCBGT0xMT1dfMTAwID0gbmV3IEJpdFNldChuZXcgbG9uZ1tdezB4MDAwMDAwRjAwMDAwMDAwMEx9KTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEJpdFNldCBGT0xMT1dfMTAxID0gbmV3IEJpdFNldChuZXcgbG9uZ1tdezB4MDAwMDAwRjAwMDAwMDAwMkx9KTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEJpdFNldCBGT0xMT1dfMTAyID0gbmV3IEJpdFNldChuZXcgbG9uZ1tdezB4MDAwMDAxMEMwMDAwMDAwMEx9KTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEJpdFNldCBGT0xMT1dfMTAzID0gbmV3IEJpdFNldChuZXcgbG9uZ1tdezB4MDAwMDAwMDAwMDAwMDAwMkwsMHgwMDAwMDQwMDAwMDAwMDAwTH0pOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgQml0U2V0IEZPTExPV18xMDQgPSBuZXcgQml0U2V0KG5ldyBsb25nW117MHgwMDAwMDYwMDAwMDAwMDAwTH0pOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgQml0U2V0IEZPTExPV18xMDUgPSBuZXcgQml0U2V0KG5ldyBsb25nW117MHgwMDAwMDgwMDAwMDAwMDAwTCwweDAwMDAwMDAwMDAwMDAwMDBMLDB4MDAwMDAwMDAwMEMwMDAwMEx9KTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEJpdFNldCBGT0xMT1dfMTA2ID0gbmV3IEJpdFNldChuZXcgbG9uZ1tdezB4MDAwMDA4MDAwMDAwMDAwMkwsMHgwMDAwMDAwMDAwMDAwMDAwTCwweDAwMDAwMDAwMDBDMDAwMDBMfSk7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBCaXRTZXQgRk9MTE9XXzEwNyA9IG5ldyBCaXRTZXQobmV3IGxvbmdbXXsweDAwMDAwODAwMDAwMDAwMDBMLDB4MDAwMDAwMDAwMDAwMDAwMEwsMHgwMDAwMDAwMDAwNDAwMDAwTH0pOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgQml0U2V0IEZPTExPV18xMDggPSBuZXcgQml0U2V0KG5ldyBsb25nW117MHgwMDAzRTAwMDA4MDAwMDIwTH0pOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgQml0U2V0IEZPTExPV18xMDkgPSBuZXcgQml0U2V0KG5ldyBsb25nW117MHgwMDAwMDAwMDAwMDAwMDAwTCwweDAwNDIwMDAwMDAwMDAwMDBMfSk7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBCaXRTZXQgRk9MTE9XXzExMCA9IG5ldyBCaXRTZXQobmV3IGxvbmdbXXsweDAwMDAwMDAwODAwMDAwMjBMLDB4MDAwMjAwMDAwMDAwMDAwMEwsMHgwMDAwMDAwMDAwMDAwMjAwTH0pOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgQml0U2V0IEZPTExPV18xMTEgPSBuZXcgQml0U2V0KG5ldyBsb25nW117MHgwMDAwMDAwMDA0MDAwMDAwTCwweDAwMDgwMDAwMDAwMDAwMDBMfSk7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBCaXRTZXQgRk9MTE9XXzExMiA9IG5ldyBCaXRTZXQobmV3IGxvbmdbXXsweDAwMDdFMTBDODgwMDAxRjBMLDB4QzU2NzAwMDA4MDAwMDA0MEwsMHgwMDAwMDAwMDA1MDAwMEJGTH0pOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgQml0U2V0IEZPTExPV18xMTMgPSBuZXcgQml0U2V0KG5ldyBsb25nW117MHgwMDA3RTEwQzA4MDAwMUYwTCwweEM1NjMwMDAwODAwMDAwQzBMLDB4MDAwMDAwMDAwNDAwMDBCRkx9KTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEJpdFNldCBGT0xMT1dfMTE0ID0gbmV3IEJpdFNldChuZXcgbG9uZ1tdezB4MDAwN0YxMEM4ODAwMDFGMEwsMHhDNTYzMDAwMDgwMDAwMDQwTCwweDAwMDAwMDAwMDcwMDAwQkZMfSk7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBCaXRTZXQgRk9MTE9XXzExNSA9IG5ldyBCaXRTZXQobmV3IGxvbmdbXXsweDAwMDAwMDAwMDAwMDAwMDBMLDB4MDAxMDAwMDAwMDAwMDAwMEx9KTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEJpdFNldCBGT0xMT1dfMTE2ID0gbmV3IEJpdFNldChuZXcgbG9uZ1tdezB4MDAwMDAwMDA4MDAwMDAyMEwsMHgwMDAyMDAwMDAwMDAwMDAwTCwweDAwMDAwMDAwMDEwMDAwMDBMfSk7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBCaXRTZXQgRk9MTE9XXzExNyA9IG5ldyBCaXRTZXQobmV3IGxvbmdbXXsweDAwMDdGMTBDMDgwMDAxRjJMLDB4QzU2MzAwMDA4MDAwMDA0MEwsMHgwMDAwMDAwMDA2MDAwMEJGTH0pOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgQml0U2V0IEZPTExPV18xMTggPSBuZXcgQml0U2V0KG5ldyBsb25nW117MHgwMDAwMDAwMDAwMDAwMDAwTCwweDAwMDQwMDAwMDAwMDAwMDBMfSk7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBCaXRTZXQgRk9MTE9XXzExOSA9IG5ldyBCaXRTZXQobmV3IGxvbmdbXXsweDAwMDAwMDAwMDAwMDAwMDBMLDB4MDEwMDAwMDAwMDAwMDAwMEx9KTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEJpdFNldCBGT0xMT1dfMTIwID0gbmV3IEJpdFNldChuZXcgbG9uZ1tdezB4MDAwMDAwMDAwMDAwMDAwMEwsMHgwMjAwMDAwMDAwMDAwMDAwTH0pOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgQml0U2V0IEZPTExPV18xMjEgPSBuZXcgQml0U2V0KG5ldyBsb25nW117MHgwMDAwMDAwMDAwMDAwMDAwTCwweDA0MDAwMDAwMDAwMDAwMDBMfSk7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBCaXRTZXQgRk9MTE9XXzEyMiA9IG5ldyBCaXRTZXQobmV3IGxvbmdbXXsweDAwMDdFMTBDODgwMDAxRjBMLDB4QzU2MzAwMDA4MDAwMDA0MEwsMHgwMDAwMDAwMDA0MDAwMEJGTH0pOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgQml0U2V0IEZPTExPV18xMjMgPSBuZXcgQml0U2V0KG5ldyBsb25nW117MHgwMDAwMDAwMDgwMDAwMDIwTCwweDM4MEEwMDAwMDAwMDAwODBMfSk7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBCaXRTZXQgRk9MTE9XXzEyNCA9IG5ldyBCaXRTZXQobmV3IGxvbmdbXXsweDAwMDAwMDAwODAwMDAwMjJMLDB4MjgwQTAwMDAwMDAwMDAwMEx9KTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEJpdFNldCBGT0xMT1dfMTI1ID0gbmV3IEJpdFNldChuZXcgbG9uZ1tdezB4MDAwMDAwMDAwMDAwMDAwMEwsMHgwODAwMDAwMDAwMDAwMDAwTH0pOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgQml0U2V0IEZPTExPV18xMjYgPSBuZXcgQml0U2V0KG5ldyBsb25nW117MHgwMDAwMDAwMDgwMDAwMDIwTCwweDI4MEEwMDAwMDAwMDAwMDBMfSk7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBCaXRTZXQgRk9MTE9XXzEyNyA9IG5ldyBCaXRTZXQobmV3IGxvbmdbXXsweDAwMDdGMTBDMDgwMDAxRjBMLDB4QzU2MzgwMDA4MDAwMDA0MEwsMHgwMDAwMDAwMDA2MDAwMEJGTH0pOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgQml0U2V0IEZPTExPV18xMjggPSBuZXcgQml0U2V0KG5ldyBsb25nW117MHgwMDA3RTEwQzA4MDAwMUYwTCwweEM1NjM4MDAwODAwMDAwNDBMLDB4MDAwMDAwMDAwNDAwMDBCRkx9KTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEJpdFNldCBGT0xMT1dfMTI5ID0gbmV3IEJpdFNldChuZXcgbG9uZ1tdezB4MDAwN0YxMEMwODAwMDFGMEwsMHhDNTYzMDAwMDgwMDAwMDQwTCwweDAwMDAwMDAwMDYwMDAwQkZMfSk7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBCaXRTZXQgRk9MTE9XXzEzMCA9IG5ldyBCaXRTZXQobmV3IGxvbmdbXXsweDAwMDAwMDAwMDAwMDAwMDBMLDB4NDAwMDAwMDAwMDAwMDAwMEx9KTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEJpdFNldCBGT0xMT1dfMTMxID0gbmV3IEJpdFNldChuZXcgbG9uZ1tdezB4MDAwMDAwMDAwMDAwMDAwMEwsMHg4MDAwMDAwMDAwMDAwMDAwTH0pOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgQml0U2V0IEZPTExPV18xMzIgPSBuZXcgQml0U2V0KG5ldyBsb25nW117MHgwMDA3RjEwQzA4MDAwMUYwTCwweEM1NjMwMDAwODAwMDAwQzBMLDB4MDAwMDAwMDAwNjAwMDBCRkx9KTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEJpdFNldCBGT0xMT1dfMTMzID0gbmV3IEJpdFNldChuZXcgbG9uZ1tdezB4MDAwMDEwMDAwMDAwMDAwMEwsMHgwMDAwMDAwMDAwMDAwMDAwTCwweDAwMDAwMDAwMDIwMDAwMDBMfSk7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBCaXRTZXQgRk9MTE9XXzEzNCA9IG5ldyBCaXRTZXQobmV3IGxvbmdbXXsweDAwMDAwMDAwMDAwMDAwMDBMLDB4MDAwMDAwMDAwMDAwMDAwMEwsMHgwMDAwMDAwMDAwMDAwMDAxTH0pOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgQml0U2V0IEZPTExPV18xMzUgPSBuZXcgQml0U2V0KG5ldyBsb25nW117MHgwMDAwMDAwMDA4MDAwMDAwTCwweDAwNDIwMDAwMDAwMDAwMDBMfSk7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBCaXRTZXQgRk9MTE9XXzEzNiA9IG5ldyBCaXRTZXQobmV3IGxvbmdbXXsweDAwMDQwMDAwMDAwMDAwMDBMLDB4MDAwMDAwMDAwMDAwMDAwMEwsMHgwMDAwMDAwMDA0MDAwMDAwTH0pOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgQml0U2V0IEZPTExPV18xMzcgPSBuZXcgQml0U2V0KG5ldyBsb25nW117MHgwMDAwMDAwMDAwMDAwMDAwTCwweDAwMDAwMDAwMDAwMDAwMDBMLDB4MDAwMDAwMDAwMDAwMDAwMkx9KTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEJpdFNldCBGT0xMT1dfMTM4ID0gbmV3IEJpdFNldChuZXcgbG9uZ1tdezB4MDAwMDAwMDAwMDAwMDFDMEx9KTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEJpdFNldCBGT0xMT1dfMTM5ID0gbmV3IEJpdFNldChuZXcgbG9uZ1tdezB4MDAwNDAwMDAwMDAwMDFEMEwsMHgwMDYwMDAwMDAwMDAwMDAwTCwweDAwMDAwMDAwMDQwMDAwMDZMfSk7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBCaXRTZXQgRk9MTE9XXzE0MCA9IG5ldyBCaXRTZXQobmV3IGxvbmdbXXsweDAwMDAwMDAwMDAwMDAwMDBMLDB4MDA0NDAwMDAwMDAwMDAwMEx9KTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEJpdFNldCBGT0xMT1dfMTQxID0gbmV3IEJpdFNldChuZXcgbG9uZ1tdezB4MDAwMDAwMDAwMDAwMDAwMkwsMHgwMDQwMDAwMDAwMDAwMDAwTH0pOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgQml0U2V0IEZPTExPV18xNDIgPSBuZXcgQml0U2V0KG5ldyBsb25nW117MHgwMDAwMDAwMDAwMDAwMDAwTCwweDAwMDAwMDAwMDAwMDAwMDBMLDB4MDAwMDAwMDAwMDAwMDAwOEx9KTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEJpdFNldCBGT0xMT1dfMTQzID0gbmV3IEJpdFNldChuZXcgbG9uZ1tdezB4MDAwMDAwMDAwMDAwMDAwMEwsMHgwMDAwMDAwMDAwMDAwMDAwTCwweDAwMDAwMDAwMDAwMDAwMTBMfSk7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBCaXRTZXQgRk9MTE9XXzE0NCA9IG5ldyBCaXRTZXQobmV3IGxvbmdbXXsweDAwMDAwMDAwMDAwMDAwMDBMLDB4MDAwMDAwMDAwMDAwMDAwMEwsMHgwMDAwMDAwMDAwMDAwMDIwTH0pOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgQml0U2V0IEZPTExPV18xNDUgPSBuZXcgQml0U2V0KG5ldyBsb25nW117MHgwMDAwMDAwMDAwMDAwMDAwTCwweDAwMDAwMDAwMDAwMDAwMDBMLDB4MDAwMDAwMDAwMDAwMDE0MEx9KTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEJpdFNldCBGT0xMT1dfMTQ2ID0gbmV3IEJpdFNldChuZXcgbG9uZ1tdezB4MDAwMDAwMDAwMDAwMDAwMEwsMHgwMDAwMDAwMDAwMDAwMDAwTCwweDAwMDAwMDAwMDAwMDAwNDBMfSk7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBCaXRTZXQgRk9MTE9XXzE0NyA9IG5ldyBCaXRTZXQobmV3IGxvbmdbXXsweDAwMDAwMDAwMDAwMDAwMDJMLDB4MDAwMDAwMDAwMDAwMDAwMEwsMHgwMDAwMDAwMDAwMDAwMTAwTH0pOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgQml0U2V0IEZPTExPV18xNDggPSBuZXcgQml0U2V0KG5ldyBsb25nW117MHgwMDAwMDAwMDAwMDAwMDAwTCwweDAwMDAwMDAwMDAwMDAwMDBMLDB4MDAwMDAwMDAwMDAwMDA4MEx9KTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEJpdFNldCBGT0xMT1dfMTQ5ID0gbmV3IEJpdFNldChuZXcgbG9uZ1tdezB4MDAwMDAwMDAwMDAwMDE4MEx9KTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEJpdFNldCBGT0xMT1dfMTUwID0gbmV3IEJpdFNldChuZXcgbG9uZ1tdezB4MDAwMDAwMDA4MDAwMDAyMEwsMHgwMDA2MDAwMDAwMDAwMDAwTH0pOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgQml0U2V0IEZPTExPV18xNTEgPSBuZXcgQml0U2V0KG5ldyBsb25nW117MHgwMDAyMjAwMDAwMDAwMDAwTH0pOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgQml0U2V0IEZPTExPV18xNTIgPSBuZXcgQml0U2V0KG5ldyBsb25nW117MHgwMDAwMDAwMDAwMDAwMDAwTCwweDAwMDAwMDAwMDAwMDAwMDBMLDB4MDAwMDAwMDAwMDAwMDQwMEx9KTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEJpdFNldCBGT0xMT1dfMTUzID0gbmV3IEJpdFNldChuZXcgbG9uZ1tdezB4MDAwMDAwMDAwMDAwMDAwMkwsMHgwMDAwMDAwMDAwMDAwMDAwTCwweDAwMDAwMDAwMDAwMDA0MDBMfSk7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBCaXRTZXQgRk9MTE9XXzE1NCA9IG5ldyBCaXRTZXQobmV3IGxvbmdbXXsweDAwMDAwMDEwMDAwMDAwMDBMfSk7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBCaXRTZXQgRk9MTE9XXzE1NSA9IG5ldyBCaXRTZXQobmV3IGxvbmdbXXsweDAwMDAwMDAwMDAwMDAwMDJMLDB4MDAwMDAwMDAwMDAwQzAwMEwsMHgwMDAwMDAwMDAwMDAyMDAwTH0pOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgQml0U2V0IEZPTExPV18xNTYgPSBuZXcgQml0U2V0KG5ldyBsb25nW117MHgwMDAwMDAwMDAwMDAwMDAyTCwweDAwMDAwMDAwMDAwRUMwMDBMLDB4MDAwMDAwMDAwMDAwNDAwMEx9KTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEJpdFNldCBGT0xMT1dfMTU3ID0gbmV3IEJpdFNldChuZXcgbG9uZ1tdezB4MDAwMDAwMDAwMDAwMDAwMkwsMHgwMDAwMDAwMDAwMDBDMDAwTH0pOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgQml0U2V0IEZPTExPV18xNTggPSBuZXcgQml0U2V0KG5ldyBsb25nW117MHgwMDAwMDAwMDAwMDAwMDAyTCwweDAwMDAwMDA4MDAwMDAwMDBMLDB4MDAwMDAwMDAwMDBDMDAwMEx9KTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEJpdFNldCBGT0xMT1dfMjEgPSBuZXcgQml0U2V0KG5ldyBsb25nW117MHgwMDAwMDAwMDAwMDAwMDAwTCwweDAwMDAwMDAwMDAwNDAwMDBMfSk7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBCaXRTZXQgRk9MTE9XXzIyID0gbmV3IEJpdFNldChuZXcgbG9uZ1tdezB4MDAwMDAwMDAwMDAwMDAwMEwsMHgwMDAwMDAwMDAwMTgwMDAwTCwweDAwMDAwMDAwMDEwMDAwMDBMfSk7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBCaXRTZXQgRk9MTE9XXzIzID0gbmV3IEJpdFNldChuZXcgbG9uZ1tdezB4MDAwMDAwMDAwMDAwMDAwMEwsMHgwMDAwMDAwMDAwMjAwMDAwTH0pOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgQml0U2V0IEZPTExPV18yNCA9IG5ldyBCaXRTZXQobmV3IGxvbmdbXXsweDAwMDAwMDAwMDAwMDAwMDBMLDB4MDAwMDAwMDAwMUQ4MDAwMEwsMHgwMDAwMDAwMDAyMDAwMDAwTH0pOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgQml0U2V0IEZPTExPV18yNSA9IG5ldyBCaXRTZXQobmV3IGxvbmdbXXsweDAwMDAwMDAwMDAwMDAwMDBMLDB4MDAwMDAwMDAwMDE4MDAwMEx9KTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEJpdFNldCBGT0xMT1dfMjYgPSBuZXcgQml0U2V0KG5ldyBsb25nW117MHgwMDAwMDAwMDAwMDAwMDAwTCwweDAwMDAwMDAwMDQwMDAwMDBMfSk7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBCaXRTZXQgRk9MTE9XXzI3ID0gbmV3IEJpdFNldChuZXcgbG9uZ1tdezB4MDAwMDAwMDAwMDAwMDAwMEwsMHgwMDAwMDAwMDAwMDAwMDAwTCwweDAwMDAwMDAwMDQwMDAwMDBMfSk7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBCaXRTZXQgRk9MTE9XXzI4ID0gbmV3IEJpdFNldChuZXcgbG9uZ1tdezB4MDAwMDAwMDAwMDAwMDAwMEwsMHgwMDAwMDAwMDA4MDAwMDAwTH0pOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgQml0U2V0IEZPTExPV18yOSA9IG5ldyBCaXRTZXQobmV3IGxvbmdbXXsweDAwMDAwMDAwMDAwMDAwMDBMLDB4MDAwMDAwMUZGMDAwMDAwMEwsMHgwMDAwMDAwMDE4MDAwMDAwTH0pOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgQml0U2V0IEZPTExPV18zMCA9IG5ldyBCaXRTZXQobmV3IGxvbmdbXXsweDAwMDAwMDAwMDAwMDAwMDBMLDB4MDAwODIwMDAwMDAwMTAwMEx9KTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEJpdFNldCBGT0xMT1dfMzEgPSBuZXcgQml0U2V0KG5ldyBsb25nW117MHgwMDAwMDAwMDAwMDAwMDAyTCwweDAwMDgyMDAwMDAwMDAwMDBMfSk7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBCaXRTZXQgRk9MTE9XXzMyID0gbmV3IEJpdFNldChuZXcgbG9uZ1tdezB4MDAwMDAwMDAwMDAwMDAwMEwsMHgwMDAwMDA0MDAwMDAxMDAwTH0pOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgQml0U2V0IEZPTExPV18zMyA9IG5ldyBCaXRTZXQobmV3IGxvbmdbXXsweDAwMDAwMDAwMDAwMDAwMDJMLDB4MDAwMDAwNDAwMDAwMDAwMEx9KTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEJpdFNldCBGT0xMT1dfMzQgPSBuZXcgQml0U2V0KG5ldyBsb25nW117MHgwMDAwMDAwMDAwMDAwMDAwTCwweDAwMDEwMDAwMDAwMDEwMDBMfSk7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBCaXRTZXQgRk9MTE9XXzM1ID0gbmV3IEJpdFNldChuZXcgbG9uZ1tdezB4MDAwMDAwMDAwMDAwMDAwMkwsMHgwMDAxMDAwMDAwMDAwMDAwTH0pOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgQml0U2V0IEZPTExPV18zNiA9IG5ldyBCaXRTZXQobmV3IGxvbmdbXXsweDAwMDAwMDAwMDAwMDAwMDBMLDB4MDBBMDAwMDAwMDAwMTAwMEx9KTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEJpdFNldCBGT0xMT1dfMzcgPSBuZXcgQml0U2V0KG5ldyBsb25nW117MHgwMDAwMDAwMDAwMDAwMDAyTCwweDAwQTAwMDAwMDAwMDAwMDBMfSk7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBCaXRTZXQgRk9MTE9XXzM4ID0gbmV3IEJpdFNldChuZXcgbG9uZ1tdezB4MDAwMDAwMDAwMDAwMDAwMEwsMHgwMDAwMDAyMDAwMDAxMDAwTH0pOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgQml0U2V0IEZPTExPV18zOSA9IG5ldyBCaXRTZXQobmV3IGxvbmdbXXsweDAwMDAwMDAwMDAwMDAwMDJMLDB4MDAwMDAwMjAwMDAwMDAwMEx9KTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEJpdFNldCBGT0xMT1dfNDAgPSBuZXcgQml0U2V0KG5ldyBsb25nW117MHgwMDAwMDAwMDAwMDAwMDAwTCwweDAwMDYwMDAwMDAwMDAwMDBMfSk7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBCaXRTZXQgRk9MTE9XXzQxID0gbmV3IEJpdFNldChuZXcgbG9uZ1tdezB4MDAwMDAwMDAwMDAwMDAwMEwsMHgwMDAwMDAwMDAwMDAxMDAwTH0pOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgQml0U2V0IEZPTExPV180MiA9IG5ldyBCaXRTZXQobmV3IGxvbmdbXXsweDAwMDAwMDAwMDAwMDAwMDBMLDB4MDAwMDAwMjAwMDAwMDAwMEx9KTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEJpdFNldCBGT0xMT1dfNDMgPSBuZXcgQml0U2V0KG5ldyBsb25nW117MHgwMDAwMDAwMDAwMDAwMDAwTCwweDAwMDAwMDQwMDAwMDAwMDBMfSk7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBCaXRTZXQgRk9MTE9XXzQ0ID0gbmV3IEJpdFNldChuZXcgbG9uZ1tdezB4MDAwMDAwMDAwMDAwMDAwMEwsMHgwMDAwMDA4MDAwMDAwMDAwTH0pOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgQml0U2V0IEZPTExPV180NSA9IG5ldyBCaXRTZXQobmV3IGxvbmdbXXsweDAwMDAwMDAwMDAwMDAwMDBMLDB4MDAwMDAxMDAyMDAwMDAwMEx9KTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEJpdFNldCBGT0xMT1dfNDYgPSBuZXcgQml0U2V0KG5ldyBsb25nW117MHgwMDAwMDAwMDAwMDAwMDAwTCwweDAwMDAwNjAwMDAwMDAwMDBMLDB4MDAwMDAwMDBFMDAwMDAwMEx9KTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEJpdFNldCBGT0xMT1dfNDcgPSBuZXcgQml0U2V0KG5ldyBsb25nW117MHgwMDAwMDAwMDAwMDAwMDAwTCwweDAwMDAwNDAwMDAwMDAwMDBMLDB4MDAwMDAwMDBDMDAwMDAwMEx9KTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEJpdFNldCBGT0xMT1dfNDggPSBuZXcgQml0U2V0KG5ldyBsb25nW117MHgwMDAwMDAwMDAwMDAwMDAwTCwweDAwMDAwODAwMDAwMDEwMDBMfSk7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBCaXRTZXQgRk9MTE9XXzQ5ID0gbmV3IEJpdFNldChuZXcgbG9uZ1tdezB4MDAwMDAwMDAwMDAwMDAwMkwsMHgwMDAwMDgwMDAwMDAwMDAwTH0pOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgQml0U2V0IEZPTExPV181MCA9IG5ldyBCaXRTZXQobmV3IGxvbmdbXXsweDAwMDAwMDAwMDAwMDAwMDBMLDB4MDAwMDA4MDAwMDAwMDAwMEx9KTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEJpdFNldCBGT0xMT1dfNTEgPSBuZXcgQml0U2V0KG5ldyBsb25nW117MHgwMDAwMDAwMDAwMDAwMDAwTCwweDAwMDAwMDAwMDAwMDAwMDBMLDB4MDAwMDAwMDEwMDAwMDAwMEx9KTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEJpdFNldCBGT0xMT1dfNTIgPSBuZXcgQml0U2V0KG5ldyBsb25nW117MHgwMDAwMDAwMDAwMDAwMDAwTCwweDAwMDAxMDAwMDAwMDAwMDBMfSk7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBCaXRTZXQgRk9MTE9XXzUzID0gbmV3IEJpdFNldChuZXcgbG9uZ1tdezB4MDAwMDAwMDAwMDAwMDAwMEwsMHgwMDAwMjAwMDAwMDAwMDAwTH0pOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgQml0U2V0IEZPTExPV181NCA9IG5ldyBCaXRTZXQobmV3IGxvbmdbXXsweDAwMDAwMDAwMDAwMDAwMDBMLDB4MDAwMDQwMDAwMDAwMDAwMEx9KTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEJpdFNldCBGT0xMT1dfNTUgPSBuZXcgQml0U2V0KG5ldyBsb25nW117MHgwMDAwMDAwMDAwMDAwMDAwTCwweDAwMDA4MDAwMDAwMDAwMDBMfSk7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBCaXRTZXQgRk9MTE9XXzU2ID0gbmV3IEJpdFNldChuZXcgbG9uZ1tdezB4MDAwMDAwMDAwMDAwMDAwMEwsMHgwMDAxMDAwMDAwMDAwMDAwTH0pOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgQml0U2V0IEZPTExPV181NyA9IG5ldyBCaXRTZXQobmV3IGxvbmdbXXsweDAwMDAwMDAwMDAwMDAwMDBMLDB4MDAwMDAwODIwMDAwMDAwMEx9KTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEJpdFNldCBGT0xMT1dfNTggPSBuZXcgQml0U2V0KG5ldyBsb25nW117MHgwMDAwMDAwMDBFNDAyMDAwTCwweDAwMDAwMDAwMDAwMDAwNzBMfSk7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBCaXRTZXQgRk9MTE9XXzU5ID0gbmV3IEJpdFNldChuZXcgbG9uZ1tdezB4MDAwMDAwMDAwMDAwMDAxMEwsMHgwMDAwMDAwMDAwMDAwMTgwTH0pOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgQml0U2V0IEZPTExPV182MCA9IG5ldyBCaXRTZXQobmV3IGxvbmdbXXsweDAwMDAwMDAwMDAwMDAwMDBMLDB4MDAwODIwMDAwMDAwMDAwMEx9KTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEJpdFNldCBGT0xMT1dfNjEgPSBuZXcgQml0U2V0KG5ldyBsb25nW117MHgwMDAwMDAwMDAwMDAwMDAwTCwweDAwMDAwMTAwMDAwMDAwMDBMfSk7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBCaXRTZXQgRk9MTE9XXzYyID0gbmV3IEJpdFNldChuZXcgbG9uZ1tdezB4MEUwMDAwMDAwMDAwMDAwMEx9KTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEJpdFNldCBGT0xMT1dfNjMgPSBuZXcgQml0U2V0KG5ldyBsb25nW117MHgwMDAwMDAwMDAwMDAwMDAwTCwweDAwMTAwMDAwMDAwMDAwMDBMfSk7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBCaXRTZXQgRk9MTE9XXzY0ID0gbmV3IEJpdFNldChuZXcgbG9uZ1tdezB4RjAwMDAwMDAwMDAwMDAwMEwsMHgwMDAwMDAwMDAwMDAwMDAxTH0pOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgQml0U2V0IEZPTExPV182NSA9IG5ldyBCaXRTZXQobmV3IGxvbmdbXXsweDAwMDAwMDAwMDAwMDAwMDBMLDB4MDAyMDAwMDAwMDAwMDAwMEx9KTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEJpdFNldCBGT0xMT1dfNjYgPSBuZXcgQml0U2V0KG5ldyBsb25nW117MHgwMDAwMDAwMDAwMDAwMDAwTCwweDAwNDAwMDAwMDAwMDAwMDBMfSk7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBCaXRTZXQgRk9MTE9XXzY3ID0gbmV3IEJpdFNldChuZXcgbG9uZ1tdezB4MDAwMDAwMDAwMDAwMDAwMEwsMHgwMEEwMDAwMDAwMDAwMDAwTH0pOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgQml0U2V0IEZPTExPV182OCA9IG5ldyBCaXRTZXQobmV3IGxvbmdbXXsweDAwMDEwMDAwMDAwMDAwMDBMLDB4MDEwMDAwMDAwMDAwODAwMEx9KTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEJpdFNldCBGT0xMT1dfNjkgPSBuZXcgQml0U2V0KG5ldyBsb25nW117MHgwMUY4MDAwMDAwMDAwMDAwTH0pOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgQml0U2V0IEZPTExPV183MCA9IG5ldyBCaXRTZXQobmV3IGxvbmdbXXsweDAwMDAwODAwMDAwMDAwMDBMfSk7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBCaXRTZXQgRk9MTE9XXzcxID0gbmV3IEJpdFNldChuZXcgbG9uZ1tdezB4MDAwMDA4MDAwMDAwMDAwMkx9KTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEJpdFNldCBGT0xMT1dfNzIgPSBuZXcgQml0U2V0KG5ldyBsb25nW117MHgwMDAwODAwMDAwMDAwMDAwTH0pOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgQml0U2V0IEZPTExPV183MyA9IG5ldyBCaXRTZXQobmV3IGxvbmdbXXsweDAwMDA0MDAwMDAwMDAwMjBMLDB4MDAwMDAwMDAwMDAwMDAwMEwsMHgwMDAwMDAwMjAwMDAwMDAwTH0pOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgQml0U2V0IEZPTExPV183NCA9IG5ldyBCaXRTZXQobmV3IGxvbmdbXXsweDAwMDAwMDAwMDAwMDAwMDBMLDB4MDIwMDAwMDAwMDAwMDAwMEx9KTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEJpdFNldCBGT0xMT1dfNzUgPSBuZXcgQml0U2V0KG5ldyBsb25nW117MHgwMDAxMDAwMDAwMDAwMDIwTH0pOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgQml0U2V0IEZPTExPV183NiA9IG5ldyBCaXRTZXQobmV3IGxvbmdbXXsweDAwMDAwMDEwMDAwMDAwMjBMfSk7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBCaXRTZXQgRk9MTE9XXzc3ID0gbmV3IEJpdFNldChuZXcgbG9uZ1tdezB4MDAwMDAwMDAwMDAwMDAwMEwsMHgwNDAwMDAwMDAwMDAwMDAwTH0pOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgQml0U2V0IEZPTExPV183OCA9IG5ldyBCaXRTZXQobmV3IGxvbmdbXXsweDAwMDAwMDAwMDAwMDAwMDBMLDB4MDgwMDAwMDAwMDAwMDAwMEx9KTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEJpdFNldCBGT0xMT1dfNzkgPSBuZXcgQml0U2V0KG5ldyBsb25nW117MHgwMDA3RTEwQzA4MDAwMUYwTCwweDlDMDAwMDQwMDAwMDA4MDBMLDB4MDAwMDAwNDAwMDAyRkYxNUx9KTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEJpdFNldCBGT0xMT1dfODAgPSBuZXcgQml0U2V0KG5ldyBsb25nW117MHgwMDAwMDAwMDAwMDAwMDAwTCwweDIwMDAwMDAwMDAwMDAwMDBMfSk7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBCaXRTZXQgRk9MTE9XXzgxID0gbmV3IEJpdFNldChuZXcgbG9uZ1tdezB4MDAwMDAwMDAwMDAwMDAwMkwsMHgyMDAwMDAwMDAwMDAwMDAwTH0pOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgQml0U2V0IEZPTExPV184MiA9IG5ldyBCaXRTZXQobmV3IGxvbmdbXXsweDAwMDdFMTBDMDgwMDAxRjBMLDB4OEMwMDAwNDAwMDAwMDgwMEwsMHgwMDAwMDA0MDAwMDJGRjE1TH0pOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgQml0U2V0IEZPTExPV184MyA9IG5ldyBCaXRTZXQobmV3IGxvbmdbXXsweDAwMDAwMDAwMDAwMDIwMDBMfSk7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBCaXRTZXQgRk9MTE9XXzg0ID0gbmV3IEJpdFNldChuZXcgbG9uZ1tdezB4MDAwN0UxMEMwODAwMDFGMEwsMHhDQzAwMDA0MDAwMDAwODAwTCwweDAwMDAwMDQwMDAwMkZGMTVMfSk7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBCaXRTZXQgRk9MTE9XXzg1ID0gbmV3IEJpdFNldChuZXcgbG9uZ1tdezB4MDAwMDAwMDAwMDAwMDAwMEwsMHg4MDAwMDAwMDAwMDAwMDAwTH0pOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgQml0U2V0IEZPTExPV184NiA9IG5ldyBCaXRTZXQobmV3IGxvbmdbXXsweDAwMDAwMDAwMDAwMDAwMDBMLDB4MDAwMDAwMDAwMDAwMDAwMEwsMHgwMDAwMDAwMDAwMDAwMDAxTH0pOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgQml0U2V0IEZPTExPV184NyA9IG5ldyBCaXRTZXQobmV3IGxvbmdbXXsweDAwMDFFMDAwMDAwMDAwMjBMfSk7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBCaXRTZXQgRk9MTE9XXzg4ID0gbmV3IEJpdFNldChuZXcgbG9uZ1tdezB4MDAwMDAwMDAwQzFGMDAwMEx9KTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEJpdFNldCBGT0xMT1dfODkgPSBuZXcgQml0U2V0KG5ldyBsb25nW117MHgwMDAwMDAwMDA4MDAwMDAwTH0pOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgQml0U2V0IEZPTExPV185MCA9IG5ldyBCaXRTZXQobmV3IGxvbmdbXXsweDAwMDAwMDAwMDYwMDAwMDBMfSk7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBCaXRTZXQgRk9MTE9XXzkxID0gbmV3IEJpdFNldChuZXcgbG9uZ1tdezB4MDAwMDAwMDAwMDAwNDAwMEx9KTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEJpdFNldCBGT0xMT1dfOTIgPSBuZXcgQml0U2V0KG5ldyBsb25nW117MHgwMDAwMDAwMDAwMDA0MDAyTH0pOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgQml0U2V0IEZPTExPV185MyA9IG5ldyBCaXRTZXQobmV3IGxvbmdbXXsweDAwMDAwMDAwMDAwMDgwMDBMfSk7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBCaXRTZXQgRk9MTE9XXzk0ID0gbmV3IEJpdFNldChuZXcgbG9uZ1tdezB4MDAwMDAwMDAwMDAwODAwMkx9KTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEJpdFNldCBGT0xMT1dfOTUgPSBuZXcgQml0U2V0KG5ldyBsb25nW117MHgwMDAwMDAwMDAxRTAwMDAwTH0pOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgQml0U2V0IEZPTExPV185NiA9IG5ldyBCaXRTZXQobmV3IGxvbmdbXXsweDAwMDAwMDAwMDFFMDAwMDJMfSk7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBCaXRTZXQgRk9MTE9XXzk3ID0gbmV3IEJpdFNldChuZXcgbG9uZ1tdezB4MDAwMDAwMDAwRTAwMDAwMEwsMHgwMDAwMDAwMDAwMDAwMDAwTCwweDAwMDAwMDAwMDAwMDAwMDJMfSk7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBCaXRTZXQgRk9MTE9XXzk4ID0gbmV3IEJpdFNldChuZXcgbG9uZ1tdezB4MDAwMDAwMDAwRTAwMDAwMkwsMHgwMDAwMDAwMDAwMDAwMDAwTCwweDAwMDAwMDAwMDAwMDAwMDJMfSk7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBCaXRTZXQgRk9MTE9XXzk5ID0gbmV3IEJpdFNldChuZXcgbG9uZ1tdezB4MDAwMDAwMDA4MDAwMDAyMEwsMHgwODAwMDAwMDAwMDAwMDAwTH0pOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgQml0U2V0IEZPTExPV18xMDAgPSBuZXcgQml0U2V0KG5ldyBsb25nW117MHgwMDAwMDAwMDAwMDAwMDAwTCwweDAwMDAwMDAwMDAwMDAwMDBMLDB4MDAwMDAwMDAwMDAwMDAwMkx9KTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEJpdFNldCBGT0xMT1dfMTAxID0gbmV3IEJpdFNldChuZXcgbG9uZ1tdezB4MDAwMDAwMDNGQzAwMDAwMEx9KTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEJpdFNldCBGT0xMT1dfMTAyID0gbmV3IEJpdFNldChuZXcgbG9uZ1tdezB4MDAwMDAwMDNGQzAwMDAwMkx9KTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEJpdFNldCBGT0xMT1dfMTAzID0gbmV3IEJpdFNldChuZXcgbG9uZ1tdezB4MDAwMDAwMDA0MDAwMDAwMEx9KTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEJpdFNldCBGT0xMT1dfMTA0ID0gbmV3IEJpdFNldChuZXcgbG9uZ1tdezB4MDAwMDAwMDAwNDAwMDAwMEx9KTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEJpdFNldCBGT0xMT1dfMTA1ID0gbmV3IEJpdFNldChuZXcgbG9uZ1tdezB4MDAwMDAwMDA4ODAwMDAwMEx9KTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEJpdFNldCBGT0xMT1dfMTA2ID0gbmV3IEJpdFNldChuZXcgbG9uZ1tdezB4MDAwMDAwMEMwMDAwMDAwMEx9KTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEJpdFNldCBGT0xMT1dfMTA3ID0gbmV3IEJpdFNldChuZXcgbG9uZ1tdezB4MDAwMDAwMEMwMDAwMDAwMkx9KTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEJpdFNldCBGT0xMT1dfMTA4ID0gbmV3IEJpdFNldChuZXcgbG9uZ1tdezB4MDAwMDAwRjAwMDAwMDAwMEx9KTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEJpdFNldCBGT0xMT1dfMTA5ID0gbmV3IEJpdFNldChuZXcgbG9uZ1tdezB4MDAwMDAwRjAwMDAwMDAwMkx9KTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEJpdFNldCBGT0xMT1dfMTEwID0gbmV3IEJpdFNldChuZXcgbG9uZ1tdezB4MDAwMDAxMEMwMDAwMDAwMEx9KTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEJpdFNldCBGT0xMT1dfMTExID0gbmV3IEJpdFNldChuZXcgbG9uZ1tdezB4MDAwMDAwMDAwMDAwMDAwMkwsMHgwMDEwMDAwMDAwMDAwMDAwTH0pOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgQml0U2V0IEZPTExPV18xMTIgPSBuZXcgQml0U2V0KG5ldyBsb25nW117MHgwMDAwMDYwMDAwMDAwMDAwTH0pOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgQml0U2V0IEZPTExPV18xMTMgPSBuZXcgQml0U2V0KG5ldyBsb25nW117MHgwMDAwMDgwMDAwMDAwMDAwTCwweDAwMDAwMDAwMDAwMDAwMDBMLDB4MDAwMDAwMEMwMDAwMDAwMEx9KTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEJpdFNldCBGT0xMT1dfMTE0ID0gbmV3IEJpdFNldChuZXcgbG9uZ1tdezB4MDAwMDA4MDAwMDAwMDAwMkwsMHgwMDAwMDAwMDAwMDAwMDAwTCwweDAwMDAwMDBDMDAwMDAwMDBMfSk7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBCaXRTZXQgRk9MTE9XXzExNSA9IG5ldyBCaXRTZXQobmV3IGxvbmdbXXsweDAwMDAwODAwMDAwMDAwMDBMLDB4MDAwMDAwMDAwMDAwMDAwMEwsMHgwMDAwMDAwNDAwMDAwMDAwTH0pOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgQml0U2V0IEZPTExPV18xMTYgPSBuZXcgQml0U2V0KG5ldyBsb25nW117MHgwMDAzRTAwMDA4MDAwMDIwTH0pOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgQml0U2V0IEZPTExPV18xMTcgPSBuZXcgQml0U2V0KG5ldyBsb25nW117MHgwMDAwMDAwMDAwMDAwMDAwTCwweDA4MDAwMDAwMDAwMDAwMDBMLDB4MDAwMDAwMDAwMDAwMDAwMUx9KTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEJpdFNldCBGT0xMT1dfMTE4ID0gbmV3IEJpdFNldChuZXcgbG9uZ1tdezB4MDAwMDAwMDA4MDAwMDAyMEwsMHgwODAwMDAwMDAwMDAwMDAwTCwweDAwMDAwMDAwMDAwODAwMDBMfSk7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBCaXRTZXQgRk9MTE9XXzExOSA9IG5ldyBCaXRTZXQobmV3IGxvbmdbXXsweDAwMDAwMDAwMDQwMDAwMDBMLDB4MjAwMDAwMDAwMDAwMDAwMEx9KTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEJpdFNldCBGT0xMT1dfMTIwID0gbmV3IEJpdFNldChuZXcgbG9uZ1tdezB4MDAwN0UxMEM4ODAwMDFGMEwsMHg5QzAwMDA0MDAwMDAwODAwTCwweDAwMDAwMDUwMDAwMkZGMTVMfSk7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBCaXRTZXQgRk9MTE9XXzEyMSA9IG5ldyBCaXRTZXQobmV3IGxvbmdbXXsweDAwMDdFMTBDMDgwMDAxRjBMLDB4OEMwMDAwNDAwMDAwMTgwMEwsMHgwMDAwMDA0MDAwMDJGRjE1TH0pOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgQml0U2V0IEZPTExPV18xMjIgPSBuZXcgQml0U2V0KG5ldyBsb25nW117MHgwMDA3RjEwQzg4MDAwMUYwTCwweDhDMDAwMDQwMDAwMDA4MDBMLDB4MDAwMDAwNzAwMDAyRkYxNUx9KTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEJpdFNldCBGT0xMT1dfMTIzID0gbmV3IEJpdFNldChuZXcgbG9uZ1tdezB4MDAwMDAwMDAwMDAwMDAwMEwsMHg0MDAwMDAwMDAwMDAwMDAwTH0pOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgQml0U2V0IEZPTExPV18xMjQgPSBuZXcgQml0U2V0KG5ldyBsb25nW117MHgwMDAwMDAwMDgwMDAwMDIwTCwweDA4MDAwMDAwMDAwMDAwMDBMLDB4MDAwMDAwMTAwMDAwMDAwMEx9KTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEJpdFNldCBGT0xMT1dfMTI1ID0gbmV3IEJpdFNldChuZXcgbG9uZ1tdezB4MDAwN0YxMEMwODAwMDFGMkwsMHg4QzAwMDA0MDAwMDAwODAwTCwweDAwMDAwMDYwMDAwMkZGMTVMfSk7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBCaXRTZXQgRk9MTE9XXzEyNiA9IG5ldyBCaXRTZXQobmV3IGxvbmdbXXsweDAwMDAwMDAwMDAwMDAwMDBMLDB4MTAwMDAwMDAwMDAwMDAwMEx9KTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEJpdFNldCBGT0xMT1dfMTI3ID0gbmV3IEJpdFNldChuZXcgbG9uZ1tdezB4MDAwMDAwMDAwMDAwMDAwMEwsMHgwMDAwMDAwMDAwMDAwMDAwTCwweDAwMDAwMDAwMDAwMDAwMDRMfSk7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBCaXRTZXQgRk9MTE9XXzEyOCA9IG5ldyBCaXRTZXQobmV3IGxvbmdbXXsweDAwMDAwMDAwMDAwMDAwMDBMLDB4MDAwMDAwMDAwMDAwMDAwMEwsMHgwMDAwMDAwMDAwMDAwMDA4TH0pOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgQml0U2V0IEZPTExPV18xMjkgPSBuZXcgQml0U2V0KG5ldyBsb25nW117MHgwMDAwMDAwMDAwMDAwMDAwTCwweDAwMDAwMDAwMDAwMDAwMDBMLDB4MDAwMDAwMDAwMDAwMDAxMEx9KTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEJpdFNldCBGT0xMT1dfMTMwID0gbmV3IEJpdFNldChuZXcgbG9uZ1tdezB4MDAwN0UxMEM4ODAwMDFGMEwsMHg4QzAwMDA0MDAwMDAwODAwTCwweDAwMDAwMDQwMDAwMkZGMTVMfSk7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBCaXRTZXQgRk9MTE9XXzEzMSA9IG5ldyBCaXRTZXQobmV3IGxvbmdbXXsweDAwMDAwMDAwODAwMDAwMjBMLDB4MjgwMDAwMDAwMDAwMTAwMEwsMHgwMDAwMDAwMDAwMDAwMEUwTH0pOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgQml0U2V0IEZPTExPV18xMzIgPSBuZXcgQml0U2V0KG5ldyBsb25nW117MHgwMDAwMDAwMDgwMDAwMDIyTCwweDI4MDAwMDAwMDAwMDAwMDBMLDB4MDAwMDAwMDAwMDAwMDBBMEx9KTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEJpdFNldCBGT0xMT1dfMTMzID0gbmV3IEJpdFNldChuZXcgbG9uZ1tdezB4MDAwMDAwMDAwMDAwMDAwMEwsMHgwMDAwMDAwMDAwMDAwMDAwTCwweDAwMDAwMDAwMDAwMDAwMjBMfSk7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBCaXRTZXQgRk9MTE9XXzEzNCA9IG5ldyBCaXRTZXQobmV3IGxvbmdbXXsweDAwMDAwMDAwODAwMDAwMjBMLDB4MjgwMDAwMDAwMDAwMDAwMEwsMHgwMDAwMDAwMDAwMDAwMEEwTH0pOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgQml0U2V0IEZPTExPV18xMzUgPSBuZXcgQml0U2V0KG5ldyBsb25nW117MHgwMDA3RjEwQzA4MDAwMUYwTCwweDhFMDAwMDQwMDAwMDA4MDBMLDB4MDAwMDAwNjAwMDAyRkYxNUx9KTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEJpdFNldCBGT0xMT1dfMTM2ID0gbmV3IEJpdFNldChuZXcgbG9uZ1tdezB4MDAwN0UxMEMwODAwMDFGMEwsMHg4RTAwMDA0MDAwMDAwODAwTCwweDAwMDAwMDQwMDAwMkZGMTVMfSk7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBCaXRTZXQgRk9MTE9XXzEzNyA9IG5ldyBCaXRTZXQobmV3IGxvbmdbXXsweDAwMDdGMTBDMDgwMDAxRjBMLDB4OEMwMDAwNDAwMDAwMDgwMEwsMHgwMDAwMDA2MDAwMDJGRjE1TH0pOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgQml0U2V0IEZPTExPV18xMzggPSBuZXcgQml0U2V0KG5ldyBsb25nW117MHgwMDAwMDAwMDAwMDAwMDAwTCwweDAwMDAwMDAwMDAwMDAwMDBMLDB4MDAwMDAwMDAwMDAwMDEwMEx9KTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEJpdFNldCBGT0xMT1dfMTM5ID0gbmV3IEJpdFNldChuZXcgbG9uZ1tdezB4MDAwMDAwMDAwMDAwMDAwMEwsMHgwMDAwMDAwMDAwMDAwMDAwTCwweDAwMDAwMDAwMDAwMDAyMDBMfSk7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBCaXRTZXQgRk9MTE9XXzE0MCA9IG5ldyBCaXRTZXQobmV3IGxvbmdbXXsweDAwMDdGMTBDMDgwMDAxRjBMLDB4OEMwMDAwNDAwMDAwMTgwMEwsMHgwMDAwMDA2MDAwMDJGRjE1TH0pOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgQml0U2V0IEZPTExPV18xNDEgPSBuZXcgQml0U2V0KG5ldyBsb25nW117MHgwMDAwMTAwMDAwMDAwMDAwTCwweDAwMDAwMDAwMDAwMDAwMDBMLDB4MDAwMDAwMjAwMDAwMDAwMEx9KTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEJpdFNldCBGT0xMT1dfMTQyID0gbmV3IEJpdFNldChuZXcgbG9uZ1tdezB4MDAwMDAwMDAwMDAwMDAwMEwsMHgwMDAwMDAwMDAwMDAwMDAwTCwweDAwMDAwMDAwMDAwMDA0MDBMfSk7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBCaXRTZXQgRk9MTE9XXzE0MyA9IG5ldyBCaXRTZXQobmV3IGxvbmdbXXsweDAwMDAwMDAwMDgwMDAwMDBMLDB4MDgwMDAwMDAwMDAwMDAwMEwsMHgwMDAwMDAwMDAwMDAwMDAxTH0pOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgQml0U2V0IEZPTExPV18xNDQgPSBuZXcgQml0U2V0KG5ldyBsb25nW117MHgwMDA0MDAwMDAwMDAwMDAwTCwweDAwMDAwMDAwMDAwMDAwMDBMLDB4MDAwMDAwNDAwMDAwMDAwMEx9KTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEJpdFNldCBGT0xMT1dfMTQ1ID0gbmV3IEJpdFNldChuZXcgbG9uZ1tdezB4MDAwMDAwMDAwMDAwMDAwMEwsMHgwMDAwMDAwMDAwMDAwMDAwTCwweDAwMDAwMDAwMDAwMDA4MDBMfSk7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBCaXRTZXQgRk9MTE9XXzE0NiA9IG5ldyBCaXRTZXQobmV3IGxvbmdbXXsweDAwMDAwMDAwMDAwMDAxQzBMfSk7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBCaXRTZXQgRk9MTE9XXzE0NyA9IG5ldyBCaXRTZXQobmV3IGxvbmdbXXsweDAwMDQwMDAwMDAwMDAxRDBMLDB4ODAwMDAwMDAwMDAwMDAwMEwsMHgwMDAwMDA0MDAwMDAxODAxTH0pOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgQml0U2V0IEZPTExPV18xNDggPSBuZXcgQml0U2V0KG5ldyBsb25nW117MHgwMDAwMDAwMDAwMDAwMDAwTCwweDEwMDAwMDAwMDAwMDAwMDBMLDB4MDAwMDAwMDAwMDAwMDAwMUx9KTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEJpdFNldCBGT0xMT1dfMTQ5ID0gbmV3IEJpdFNldChuZXcgbG9uZ1tdezB4MDAwMDAwMDAwMDAwMDAwMkwsMHgwMDAwMDAwMDAwMDAwMDAwTCwweDAwMDAwMDAwMDAwMDAwMDFMfSk7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBCaXRTZXQgRk9MTE9XXzE1MCA9IG5ldyBCaXRTZXQobmV3IGxvbmdbXXsweDAwMDAwMDAwMDAwMDAwMDBMLDB4MDAwMDAwMDAwMDAwMDAwMEwsMHgwMDAwMDAwMDAwMDAyMDAwTH0pOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgQml0U2V0IEZPTExPV18xNTEgPSBuZXcgQml0U2V0KG5ldyBsb25nW117MHgwMDAwMDAwMDAwMDAwMDAwTCwweDAwMDAwMDAwMDAwMDAwMDBMLDB4MDAwMDAwMDAwMDAwNDAwMEx9KTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEJpdFNldCBGT0xMT1dfMTUyID0gbmV3IEJpdFNldChuZXcgbG9uZ1tdezB4MDAwMDAwMDAwMDAwMDAwMEwsMHgwMDAwMDAwMDAwMDAwMDAwTCwweDAwMDAwMDAwMDAwMDgwMDBMfSk7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBCaXRTZXQgRk9MTE9XXzE1MyA9IG5ldyBCaXRTZXQobmV3IGxvbmdbXXsweDAwMDAwMDAwMDAwMDAwMDBMLDB4MDAwMDAwMDAwMDAwMDAwMEwsMHgwMDAwMDAwMDAwMDUwMDAwTH0pOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgQml0U2V0IEZPTExPV18xNTQgPSBuZXcgQml0U2V0KG5ldyBsb25nW117MHgwMDAwMDAwMDAwMDAwMDAwTCwweDAwMDAwMDAwMDAwMDAwMDBMLDB4MDAwMDAwMDAwMDAxMDAwMEx9KTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEJpdFNldCBGT0xMT1dfMTU1ID0gbmV3IEJpdFNldChuZXcgbG9uZ1tdezB4MDAwMDAwMDAwMDAwMDAwMkwsMHgwMDAwMDAwMDAwMDAwMDAwTCwweDAwMDAwMDAwMDAwNDAwMDBMfSk7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBCaXRTZXQgRk9MTE9XXzE1NiA9IG5ldyBCaXRTZXQobmV3IGxvbmdbXXsweDAwMDAwMDAwMDAwMDAwMDBMLDB4MDAwMDAwMDAwMDAwMDAwMEwsMHgwMDAwMDAwMDAwMDIwMDAwTH0pOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgQml0U2V0IEZPTExPV18xNTcgPSBuZXcgQml0U2V0KG5ldyBsb25nW117MHgwMDAwMDAwMDAwMDAwMTgwTH0pOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgQml0U2V0IEZPTExPV18xNTggPSBuZXcgQml0U2V0KG5ldyBsb25nW117MHgwMDAwMDAwMDgwMDAwMDIwTCwweDE4MDAwMDAwMDAwMDAwMDBMfSk7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBCaXRTZXQgRk9MTE9XXzE1OSA9IG5ldyBCaXRTZXQobmV3IGxvbmdbXXsweDAwMDIyMDAwMDAwMDAwMDBMfSk7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBCaXRTZXQgRk9MTE9XXzE2MCA9IG5ldyBCaXRTZXQobmV3IGxvbmdbXXsweDAwMDAwMDAwMDAwMDAwMDBMLDB4MDAwMDAwMDAwMDAwMDAwMEwsMHgwMDAwMDAwMDAwMTAwMDAwTH0pOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgQml0U2V0IEZPTExPV18xNjEgPSBuZXcgQml0U2V0KG5ldyBsb25nW117MHgwMDAwMDAwMDAwMDAwMDAyTCwweDAwMDAwMDAwMDAwMDAwMDBMLDB4MDAwMDAwMDAwMDEwMDAwMEx9KTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEJpdFNldCBGT0xMT1dfMTYyID0gbmV3IEJpdFNldChuZXcgbG9uZ1tdezB4MDAwMDAwMTAwMDAwMDAwMEx9KTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEJpdFNldCBGT0xMT1dfMTYzID0gbmV3IEJpdFNldChuZXcgbG9uZ1tdezB4MDAwMDAwMDAwMDAwMDAwMkwsMHgwMDAwMDAwMDAwMTgwMDAwTCwweDAwMDAwMDAwMDEwMDAwMDBMfSk7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBCaXRTZXQgRk9MTE9XXzE2NCA9IG5ldyBCaXRTZXQobmV3IGxvbmdbXXsweDAwMDAwMDAwMDAwMDAwMDJMLDB4MDAwMDAwMDAwMUQ4MDAwMEwsMHgwMDAwMDAwMDAyMDAwMDAwTH0pOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgQml0U2V0IEZPTExPV18xNjUgPSBuZXcgQml0U2V0KG5ldyBsb25nW117MHgwMDAwMDAwMDAwMDAwMDAyTCwweDAwMDAwMDAwMDAxODAwMDBMfSk7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBCaXRTZXQgRk9MTE9XXzE2NiA9IG5ldyBCaXRTZXQobmV3IGxvbmdbXXsweDAwMDAwMDAwMDAwMDAwMDJMLDB4MDAwMDA0MDAwMDAwMDAwMEwsMHgwMDAwMDAwMEMwMDAwMDAwTH0pOwogCiB9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmRhdGFpbnRlcmNoYW5nZS50ZXN0cy9MSUNFTlNFLnR4dCBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQuZGF0YWludGVyY2hhbmdlLnRlc3RzL0xJQ0VOU0UudHh0CmluZGV4IGZmNDJhZDQuLmZjNTkzOGQgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLm9zYnAueHRleHQuZGF0YWludGVyY2hhbmdlLnRlc3RzL0xJQ0VOU0UudHh0CisrKyBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQuZGF0YWludGVyY2hhbmdlLnRlc3RzL0xJQ0VOU0UudHh0CkBAIC0xLDE2MSArMSwxNDAgQEAKLUVjbGlwc2UgUHVibGljIExpY2Vuc2UgLXYgMS4wCitFY2xpcHNlIEZvdW5kYXRpb24gU29mdHdhcmUgVXNlciBBZ3JlZW1lbnQKIAotVEhFIEFDQ09NUEFOWUlORyBQUk9HUkFNIElTIFBST1ZJREVEIFVOREVSIFRIRSBURVJNUyBPRiBUSElTIEVDTElQU0UgUFVCTElDIExJQ0VOU0UgKCJBR1JFRU1FTlQiKS4gQU5ZIFVTRSwgUkVQUk9EVUNUSU9OCi1PUiBESVNUUklCVVRJT04gT0YgVEhFIFBST0dSQU0gQ09OU1RJVFVURVMgUkVDSVBJRU5UJ1MgQUNDRVBUQU5DRSBPRiBUSElTIEFHUkVFTUVOVC4KK05vdmVtYmVyIDIyLCAyMDE3CiAKLTEuIERFRklOSVRJT05TCitVc2FnZSBPZiBDb250ZW50CiAKLSJDb250cmlidXRpb24iIG1lYW5zOgorVEhFIEVDTElQU0UgRk9VTkRBVElPTiBNQUtFUyBBVkFJTEFCTEUgU09GVFdBUkUsIERPQ1VNRU5UQVRJT04sIElORk9STUFUSU9OCitBTkQvT1IgT1RIRVIgTUFURVJJQUxTIEZPUiBPUEVOIFNPVVJDRSBQUk9KRUNUUyAoQ09MTEVDVElWRUxZICJDT05URU5UIikuIFVTRSBPRgorVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVMgQUdSRUVNRU5UIEFORC9PUiBUSEUKK1RFUk1TIEFORCBDT05ESVRJT05TIE9GIExJQ0VOU0UgQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VECitCRUxPVy4gQlkgVVNJTkcgVEhFIENPTlRFTlQsIFlPVSBBR1JFRSBUSEFUIFlPVVIgVVNFIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVECitCWSBUSElTIEFHUkVFTUVOVCBBTkQvT1IgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UKK0FHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gSUYgWU9VIERPIE5PVCBBR1JFRSBUTyBUSEUKK1RFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVMgQUdSRUVNRU5UIEFORCBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgQU5ZCitBUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLCBUSEVOIFlPVQorTUFZIE5PVCBVU0UgVEhFIENPTlRFTlQuCiAKLWEpIGluIHRoZSBjYXNlIG9mIHRoZSBpbml0aWFsIENvbnRyaWJ1dG9yLCB0aGUgaW5pdGlhbCBjb2RlIGFuZCBkb2N1bWVudGF0aW9uIGRpc3RyaWJ1dGVkIHVuZGVyIHRoaXMgQWdyZWVtZW50LCBhbmQKK0FwcGxpY2FibGUgTGljZW5zZXMKIAotYikgaW4gdGhlIGNhc2Ugb2YgZWFjaCBzdWJzZXF1ZW50IENvbnRyaWJ1dG9yOgorVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQsIGFsbCBDb250ZW50IG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24KK2lzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UKK1ZlcnNpb24gMi4wICgiRVBMIikuIEEgY29weSBvZiB0aGUgRVBMIGlzIHByb3ZpZGVkIHdpdGggdGhpcyBDb250ZW50IGFuZCBpcyBhbHNvCithdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLiBGb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwKKyJQcm9ncmFtIiB3aWxsIG1lYW4gdGhlIENvbnRlbnQuCiAKLWkpIGNoYW5nZXMgdG8gdGhlIFByb2dyYW0sIGFuZAorQ29udGVudCBpbmNsdWRlcywgYnV0IGlzIG5vdCBsaW1pdGVkIHRvLCBzb3VyY2UgY29kZSwgb2JqZWN0IGNvZGUsIGRvY3VtZW50YXRpb24KK2FuZCBvdGhlciBmaWxlcyBtYWludGFpbmVkIGluIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gc291cmNlIGNvZGUgcmVwb3NpdG9yeQorKCJSZXBvc2l0b3J5IikgaW4gc29mdHdhcmUgbW9kdWxlcyAoIk1vZHVsZXMiKSBhbmQgbWFkZSBhdmFpbGFibGUgYXMKK2Rvd25sb2FkYWJsZSBhcmNoaXZlcyAoIkRvd25sb2FkcyIpLgogCi1paSkgYWRkaXRpb25zIHRvIHRoZSBQcm9ncmFtOworLSAgIENvbnRlbnQgbWF5IGJlIHN0cnVjdHVyZWQgYW5kIHBhY2thZ2VkIGludG8gbW9kdWxlcyB0byBmYWNpbGl0YXRlCisgICAgZGVsaXZlcmluZywgZXh0ZW5kaW5nLCBhbmQgdXBncmFkaW5nIHRoZSBDb250ZW50LiBUeXBpY2FsIG1vZHVsZXMgbWF5CisgICAgaW5jbHVkZSBwbHVnLWlucyAoIlBsdWctaW5zIiksIHBsdWctaW4gZnJhZ21lbnRzICgiRnJhZ21lbnRzIiksIGFuZAorICAgIGZlYXR1cmVzICgiRmVhdHVyZXMiKS4KKy0gICBFYWNoIFBsdWctaW4gb3IgRnJhZ21lbnQgbWF5IGJlIHBhY2thZ2VkIGFzIGEgc3ViLWRpcmVjdG9yeSBvciBKQVIKKyAgICAoSmF2YeKEoiBBUmNoaXZlKSBpbiBhIGRpcmVjdG9yeSBuYW1lZCAicGx1Z2lucyIuCistICAgQSBGZWF0dXJlIGlzIGEgYnVuZGxlIG9mIG9uZSBvciBtb3JlIFBsdWctaW5zIGFuZC9vciBGcmFnbWVudHMgYW5kCisgICAgYXNzb2NpYXRlZCBtYXRlcmlhbC4gRWFjaCBGZWF0dXJlIG1heSBiZSBwYWNrYWdlZCBhcyBhIHN1Yi1kaXJlY3RvcnkgaW4gYQorICAgIGRpcmVjdG9yeSBuYW1lZCAiZmVhdHVyZXMiLiBXaXRoaW4gYSBGZWF0dXJlLCBmaWxlcyBuYW1lZCAiZmVhdHVyZS54bWwiIG1heQorICAgIGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mIHRoZSBQbHVnLWlucyBhbmQvb3IKKyAgICBGcmFnbWVudHMgYXNzb2NpYXRlZCB3aXRoIHRoYXQgRmVhdHVyZS4KKy0gICBGZWF0dXJlcyBtYXkgYWxzbyBpbmNsdWRlIG90aGVyIEZlYXR1cmVzICgiSW5jbHVkZWQgRmVhdHVyZXMiKS4gV2l0aGluIGEKKyAgICBGZWF0dXJlLCBmaWxlcyBuYW1lZCAiZmVhdHVyZS54bWwiIG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kCisgICAgdmVyc2lvbiBudW1iZXJzIG9mIEluY2x1ZGVkIEZlYXR1cmVzLgogCi13aGVyZSBzdWNoIGNoYW5nZXMgYW5kL29yIGFkZGl0aW9ucyB0byB0aGUgUHJvZ3JhbSBvcmlnaW5hdGUgZnJvbSBhbmQgYXJlIGRpc3RyaWJ1dGVkIGJ5IHRoYXQgcGFydGljdWxhciBDb250cmlidXRvci4KLUEgQ29udHJpYnV0aW9uICdvcmlnaW5hdGVzJyBmcm9tIGEgQ29udHJpYnV0b3IgaWYgaXQgd2FzIGFkZGVkIHRvIHRoZSBQcm9ncmFtIGJ5IHN1Y2ggQ29udHJpYnV0b3IgaXRzZWxmIG9yIGFueW9uZQotYWN0aW5nIG9uIHN1Y2ggQ29udHJpYnV0b3IncyBiZWhhbGYuIENvbnRyaWJ1dGlvbnMgZG8gbm90IGluY2x1ZGUgYWRkaXRpb25zIHRvIHRoZSBQcm9ncmFtIHdoaWNoOiAoaSkgYXJlIHNlcGFyYXRlCi1tb2R1bGVzIG9mIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIGluIGNvbmp1bmN0aW9uIHdpdGggdGhlIFByb2dyYW0gdW5kZXIgdGhlaXIgb3duIGxpY2Vuc2UgYWdyZWVtZW50LCBhbmQgKGlpKSBhcmUgbm90Ci1kZXJpdmF0aXZlIHdvcmtzIG9mIHRoZSBQcm9ncmFtLgorVGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHNob3VsZCBiZSBjb250YWluZWQgaW4KK2ZpbGVzIG5hbWVkICJhYm91dC5odG1sIiAoIkFib3V0cyIpLiBUaGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIEZlYXR1cmVzCithbmQgSW5jbHVkZWQgRmVhdHVyZXMgc2hvdWxkIGJlIGNvbnRhaW5lZCBpbiBmaWxlcyBuYW1lZCAibGljZW5zZS5odG1sIgorKCJGZWF0dXJlIExpY2Vuc2VzIikuIEFib3V0cyBhbmQgRmVhdHVyZSBMaWNlbnNlcyBtYXkgYmUgbG9jYXRlZCBpbiBhbnkKK2RpcmVjdG9yeSBvZiBhIERvd25sb2FkIG9yIE1vZHVsZSBpbmNsdWRpbmcsIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgZm9sbG93aW5nCitsb2NhdGlvbnM6CiAKLSJDb250cmlidXRvciIgbWVhbnMgYW55IHBlcnNvbiBvciBlbnRpdHkgdGhhdCBkaXN0cmlidXRlcyB0aGUgUHJvZ3JhbS4KKy0gICBUaGUgdG9wLWxldmVsIChyb290KSBkaXJlY3RvcnkKKy0gICBQbHVnLWluIGFuZCBGcmFnbWVudCBkaXJlY3RvcmllcworLSAgIEluc2lkZSBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHBhY2thZ2VkIGFzIEpBUnMKKy0gICBTdWItZGlyZWN0b3JpZXMgb2YgdGhlIGRpcmVjdG9yeSBuYW1lZCAic3JjIiBvZiBjZXJ0YWluIFBsdWctaW5zCistICAgRmVhdHVyZSBkaXJlY3RvcmllcwogCi0iTGljZW5zZWQgUGF0ZW50cyAiIG1lYW4gcGF0ZW50IGNsYWltcyBsaWNlbnNhYmxlIGJ5IGEgQ29udHJpYnV0b3Igd2hpY2ggYXJlIG5lY2Vzc2FyaWx5IGluZnJpbmdlZCBieSB0aGUgdXNlIG9yIHNhbGUgb2YKLWl0cyBDb250cmlidXRpb24gYWxvbmUgb3Igd2hlbiBjb21iaW5lZCB3aXRoIHRoZSBQcm9ncmFtLgorTm90ZTogaWYgYSBGZWF0dXJlIG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gaXMgaW5zdGFsbGVkIHVzaW5nCit0aGUgUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kgKGFzIGRlZmluZWQgYmVsb3cpLCB5b3UgbXVzdCBhZ3JlZSB0byBhIGxpY2Vuc2UKKygiRmVhdHVyZSBVcGRhdGUgTGljZW5zZSIpIGR1cmluZyB0aGUgaW5zdGFsbGF0aW9uIHByb2Nlc3MuIElmIHRoZSBGZWF0dXJlCitjb250YWlucyBJbmNsdWRlZCBGZWF0dXJlcywgdGhlIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2Ugc2hvdWxkIGVpdGhlciBwcm92aWRlIHlvdQord2l0aCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIHRoZSBJbmNsdWRlZCBGZWF0dXJlcyBvciBpbmZvcm0geW91Cit3aGVyZSB5b3UgY2FuIGxvY2F0ZSB0aGVtLiBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBtYXkgYmUgZm91bmQgaW4gdGhlICJsaWNlbnNlIgorcHJvcGVydHkgb2YgZmlsZXMgbmFtZWQgImZlYXR1cmUucHJvcGVydGllcyIgZm91bmQgd2l0aGluIGEgRmVhdHVyZS4gU3VjaAorQWJvdXRzLCBGZWF0dXJlIExpY2Vuc2VzLCBhbmQgRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgY29udGFpbiB0aGUgdGVybXMgYW5kCitjb25kaXRpb25zIChvciByZWZlcmVuY2VzIHRvIHN1Y2ggdGVybXMgYW5kIGNvbmRpdGlvbnMpIHRoYXQgZ292ZXJuIHlvdXIgdXNlIG9mCit0aGUgYXNzb2NpYXRlZCBDb250ZW50IGluIHRoYXQgZGlyZWN0b3J5LgogCi0iUHJvZ3JhbSIgbWVhbnMgdGhlIENvbnRyaWJ1dGlvbnMgZGlzdHJpYnV0ZWQgaW4gYWNjb3JkYW5jZSB3aXRoIHRoaXMgQWdyZWVtZW50LgorVEhFIEFCT1VUUywgRkVBVFVSRSBMSUNFTlNFUywgQU5EIEZFQVRVUkUgVVBEQVRFIExJQ0VOU0VTIE1BWSBSRUZFUiBUTyBUSEUgRVBMCitPUiBPVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMsIE5PVElDRVMgT1IgVEVSTVMgQU5EIENPTkRJVElPTlMuIFNPTUUgT0YgVEhFU0UKK09USEVSIExJQ0VOU0UgQUdSRUVNRU5UUyBNQVkgSU5DTFVERSAoQlVUIEFSRSBOT1QgTElNSVRFRCBUTyk6CiAKLSJSZWNpcGllbnQiIG1lYW5zIGFueW9uZSB3aG8gcmVjZWl2ZXMgdGhlIFByb2dyYW0gdW5kZXIgdGhpcyBBZ3JlZW1lbnQsIGluY2x1ZGluZyBhbGwgQ29udHJpYnV0b3JzLgorLSAgIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKGF2YWlsYWJsZSBhdAorICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sKQorLSAgIEVjbGlwc2UgRGlzdHJpYnV0aW9uIExpY2Vuc2UgVmVyc2lvbiAxLjAgKGF2YWlsYWJsZSBhdAorICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGljZW5zZXMvZWRsLXYxLjAuaHRtbCkKKy0gICBDb21tb24gUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKGF2YWlsYWJsZSBhdAorICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sKQorLSAgIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDEuMSAoYXZhaWxhYmxlIGF0CisgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UpCistICAgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMi4wIChhdmFpbGFibGUgYXQKKyAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjApCistICAgTW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMSAoYXZhaWxhYmxlIGF0CisgICAgaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvTVBMLTEuMS5odG1sKQogCi0yLiBHUkFOVCBPRiBSSUdIVFMKK0lUIElTIFlPVVIgT0JMSUdBVElPTiBUTyBSRUFEIEFORCBBQ0NFUFQgQUxMIFNVQ0ggVEVSTVMgQU5EIENPTkRJVElPTlMgUFJJT1IgVE8KK1VTRSBPRiBUSEUgQ09OVEVOVC4gSWYgbm8gQWJvdXQsIEZlYXR1cmUgTGljZW5zZSwgb3IgRmVhdHVyZSBVcGRhdGUgTGljZW5zZSBpcworcHJvdmlkZWQsIHBsZWFzZSBjb250YWN0IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gdG8gZGV0ZXJtaW5lIHdoYXQgdGVybXMgYW5kCitjb25kaXRpb25zIGdvdmVybiB0aGF0IHBhcnRpY3VsYXIgQ29udGVudC4KIAotYSkgU3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhpcyBBZ3JlZW1lbnQsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyBSZWNpcGllbnQgYSBub24tZXhjbHVzaXZlLCB3b3JsZHdpZGUsCi1yb3lhbHR5LWZyZWUgY29weXJpZ2h0IGxpY2Vuc2UgdG8gcmVwcm9kdWNlLCBwcmVwYXJlIGRlcml2YXRpdmUgd29ya3Mgb2YsIHB1YmxpY2x5IGRpc3BsYXksIHB1YmxpY2x5IHBlcmZvcm0sIGRpc3RyaWJ1dGUKLWFuZCBzdWJsaWNlbnNlIHRoZSBDb250cmlidXRpb24gb2Ygc3VjaCBDb250cmlidXRvciwgaWYgYW55LCBhbmQgc3VjaCBkZXJpdmF0aXZlIHdvcmtzLCBpbiBzb3VyY2UgY29kZSBhbmQgb2JqZWN0IGNvZGUKLWZvcm0uCitVc2Ugb2YgUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kKIAotYikgU3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhpcyBBZ3JlZW1lbnQsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyBSZWNpcGllbnQgYSBub24tZXhjbHVzaXZlLCB3b3JsZHdpZGUsCi1yb3lhbHR5LWZyZWUgcGF0ZW50IGxpY2Vuc2UgdW5kZXIgTGljZW5zZWQgUGF0ZW50cyB0byBtYWtlLCB1c2UsIHNlbGwsIG9mZmVyIHRvIHNlbGwsIGltcG9ydCBhbmQgb3RoZXJ3aXNlIHRyYW5zZmVyIHRoZQotQ29udHJpYnV0aW9uIG9mIHN1Y2ggQ29udHJpYnV0b3IsIGlmIGFueSwgaW4gc291cmNlIGNvZGUgYW5kIG9iamVjdCBjb2RlIGZvcm0uIFRoaXMgcGF0ZW50IGxpY2Vuc2Ugc2hhbGwgYXBwbHkgdG8gdGhlCi1jb21iaW5hdGlvbiBvZiB0aGUgQ29udHJpYnV0aW9uIGFuZCB0aGUgUHJvZ3JhbSBpZiwgYXQgdGhlIHRpbWUgdGhlIENvbnRyaWJ1dGlvbiBpcyBhZGRlZCBieSB0aGUgQ29udHJpYnV0b3IsIHN1Y2gKLWFkZGl0aW9uIG9mIHRoZSBDb250cmlidXRpb24gY2F1c2VzIHN1Y2ggY29tYmluYXRpb24gdG8gYmUgY292ZXJlZCBieSB0aGUgTGljZW5zZWQgUGF0ZW50cy4gVGhlIHBhdGVudCBsaWNlbnNlIHNoYWxsIG5vdAotYXBwbHkgdG8gYW55IG90aGVyIGNvbWJpbmF0aW9ucyB3aGljaCBpbmNsdWRlIHRoZSBDb250cmlidXRpb24uIE5vIGhhcmR3YXJlIHBlciBzZSBpcyBsaWNlbnNlZCBoZXJldW5kZXIuCitUaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1ha2VzIGF2YWlsYWJsZSBwcm92aXNpb25pbmcgc29mdHdhcmUsIGV4YW1wbGVzIG9mIHdoaWNoCitpbmNsdWRlLCBidXQgYXJlIG5vdCBsaW1pdGVkIHRvLCBwMiBhbmQgdGhlIEVjbGlwc2UgVXBkYXRlIE1hbmFnZXIKKygiUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kiKSBmb3IgdGhlIHB1cnBvc2Ugb2YgYWxsb3dpbmcgdXNlcnMgdG8gaW5zdGFsbAorc29mdHdhcmUsIGRvY3VtZW50YXRpb24sIGluZm9ybWF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgKGNvbGxlY3RpdmVseQorIkluc3RhbGxhYmxlIFNvZnR3YXJlIikuIFRoaXMgY2FwYWJpbGl0eSBpcyBwcm92aWRlZCB3aXRoIHRoZSBpbnRlbnQgb2YgYWxsb3dpbmcKK3N1Y2ggdXNlcnMgdG8gaW5zdGFsbCwgZXh0ZW5kIGFuZCB1cGRhdGUgRWNsaXBzZS1iYXNlZCBwcm9kdWN0cy4gSW5mb3JtYXRpb24KK2Fib3V0IHBhY2thZ2luZyBJbnN0YWxsYWJsZSBTb2Z0d2FyZSBpcyBhdmFpbGFibGUgYXQKK2h0dHA6Ly9lY2xpcHNlLm9yZy9lcXVpbm94L3AyL3JlcG9zaXRvcnlfcGFja2FnaW5nLmh0bWwgKCJTcGVjaWZpY2F0aW9uIikuCiAKLWMpIFJlY2lwaWVudCB1bmRlcnN0YW5kcyB0aGF0IGFsdGhvdWdoIGVhY2ggQ29udHJpYnV0b3IgZ3JhbnRzIHRoZSBsaWNlbnNlcyB0byBpdHMgQ29udHJpYnV0aW9ucyBzZXQgZm9ydGggaGVyZWluLCBubwotYXNzdXJhbmNlcyBhcmUgcHJvdmlkZWQgYnkgYW55IENvbnRyaWJ1dG9yIHRoYXQgdGhlIFByb2dyYW0gZG9lcyBub3QgaW5mcmluZ2UgdGhlIHBhdGVudCBvciBvdGhlciBpbnRlbGxlY3R1YWwgcHJvcGVydHkKLXJpZ2h0cyBvZiBhbnkgb3RoZXIgZW50aXR5LiBFYWNoIENvbnRyaWJ1dG9yIGRpc2NsYWltcyBhbnkgbGlhYmlsaXR5IHRvIFJlY2lwaWVudCBmb3IgY2xhaW1zIGJyb3VnaHQgYnkgYW55IG90aGVyIGVudGl0eQotYmFzZWQgb24gaW5mcmluZ2VtZW50IG9mIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgb3Igb3RoZXJ3aXNlLiBBcyBhIGNvbmRpdGlvbiB0byBleGVyY2lzaW5nIHRoZSByaWdodHMgYW5kCi1saWNlbnNlcyBncmFudGVkIGhlcmV1bmRlciwgZWFjaCBSZWNpcGllbnQgaGVyZWJ5IGFzc3VtZXMgc29sZSByZXNwb25zaWJpbGl0eSB0byBzZWN1cmUgYW55IG90aGVyIGludGVsbGVjdHVhbCBwcm9wZXJ0eQotcmlnaHRzIG5lZWRlZCwgaWYgYW55LiBGb3IgZXhhbXBsZSwgaWYgYSB0aGlyZCBwYXJ0eSBwYXRlbnQgbGljZW5zZSBpcyByZXF1aXJlZCB0byBhbGxvdyBSZWNpcGllbnQgdG8gZGlzdHJpYnV0ZSB0aGUKLVByb2dyYW0sIGl0IGlzIFJlY2lwaWVudCdzIHJlc3BvbnNpYmlsaXR5IHRvIGFjcXVpcmUgdGhhdCBsaWNlbnNlIGJlZm9yZSBkaXN0cmlidXRpbmcgdGhlIFByb2dyYW0uCitZb3UgbWF5IHVzZSBQcm92aXNpb25pbmcgVGVjaG5vbG9neSB0byBhbGxvdyBvdGhlciBwYXJ0aWVzIHRvIGluc3RhbGwKK0luc3RhbGxhYmxlIFNvZnR3YXJlLiBZb3Ugc2hhbGwgYmUgcmVzcG9uc2libGUgZm9yIGVuYWJsaW5nIHRoZSBhcHBsaWNhYmxlCitsaWNlbnNlIGFncmVlbWVudHMgcmVsYXRpbmcgdG8gdGhlIEluc3RhbGxhYmxlIFNvZnR3YXJlIHRvIGJlIHByZXNlbnRlZCB0bywgYW5kCithY2NlcHRlZCBieSwgdGhlIHVzZXJzIG9mIHRoZSBQcm92aXNpb25pbmcgVGVjaG5vbG9neSBpbiBhY2NvcmRhbmNlIHdpdGggdGhlCitTcGVjaWZpY2F0aW9uLiBCeSB1c2luZyBQcm92aXNpb25pbmcgVGVjaG5vbG9neSBpbiBzdWNoIGEgbWFubmVyIGFuZCBtYWtpbmcgaXQKK2F2YWlsYWJsZSBpbiBhY2NvcmRhbmNlIHdpdGggdGhlIFNwZWNpZmljYXRpb24sIHlvdSBmdXJ0aGVyIGFja25vd2xlZGdlIHlvdXIKK2FncmVlbWVudCB0bywgYW5kIHRoZSBhY3F1aXNpdGlvbiBvZiBhbGwgbmVjZXNzYXJ5IHJpZ2h0cyB0byBwZXJtaXQgdGhlCitmb2xsb3dpbmc6CiAKLWQpIEVhY2ggQ29udHJpYnV0b3IgcmVwcmVzZW50cyB0aGF0IHRvIGl0cyBrbm93bGVkZ2UgaXQgaGFzIHN1ZmZpY2llbnQgY29weXJpZ2h0IHJpZ2h0cyBpbiBpdHMgQ29udHJpYnV0aW9uLCBpZiBhbnksIHRvCi1ncmFudCB0aGUgY29weXJpZ2h0IGxpY2Vuc2Ugc2V0IGZvcnRoIGluIHRoaXMgQWdyZWVtZW50LgorMS4gIEEgc2VyaWVzIG9mIGFjdGlvbnMgbWF5IG9jY3VyICgiUHJvdmlzaW9uaW5nIFByb2Nlc3MiKSBpbiB3aGljaCBhIHVzZXIgbWF5CisgICAgZXhlY3V0ZSB0aGUgUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kgb24gYSBtYWNoaW5lICgiVGFyZ2V0IE1hY2hpbmUiKSB3aXRoIHRoZQorICAgIGludGVudCBvZiBpbnN0YWxsaW5nLCBleHRlbmRpbmcgb3IgdXBkYXRpbmcgdGhlIGZ1bmN0aW9uYWxpdHkgb2YgYW4KKyAgICBFY2xpcHNlLWJhc2VkIHByb2R1Y3QuCisyLiAgRHVyaW5nIHRoZSBQcm92aXNpb25pbmcgUHJvY2VzcywgdGhlIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5IG1heSBjYXVzZSB0aGlyZAorICAgIHBhcnR5IEluc3RhbGxhYmxlIFNvZnR3YXJlIG9yIGEgcG9ydGlvbiB0aGVyZW9mIHRvIGJlIGFjY2Vzc2VkIGFuZCBjb3BpZWQgdG8KKyAgICB0aGUgVGFyZ2V0IE1hY2hpbmUuCiszLiAgUHVyc3VhbnQgdG8gdGhlIFNwZWNpZmljYXRpb24sIHlvdSB3aWxsIHByb3ZpZGUgdG8gdGhlIHVzZXIgdGhlIHRlcm1zIGFuZAorICAgIGNvbmRpdGlvbnMgdGhhdCBnb3Zlcm4gdGhlIHVzZSBvZiB0aGUgSW5zdGFsbGFibGUgU29mdHdhcmUgKCJJbnN0YWxsYWJsZQorICAgIFNvZnR3YXJlIEFncmVlbWVudCIpIGFuZCBzdWNoIEluc3RhbGxhYmxlIFNvZnR3YXJlIEFncmVlbWVudCBzaGFsbCBiZQorICAgIGFjY2Vzc2VkIGZyb20gdGhlIFRhcmdldCBNYWNoaW5lIGluIGFjY29yZGFuY2Ugd2l0aCB0aGUgU3BlY2lmaWNhdGlvbi4gU3VjaAorICAgIEluc3RhbGxhYmxlIFNvZnR3YXJlIEFncmVlbWVudCBtdXN0IGluZm9ybSB0aGUgdXNlciBvZiB0aGUgdGVybXMgYW5kCisgICAgY29uZGl0aW9ucyB0aGF0IGdvdmVybiB0aGUgSW5zdGFsbGFibGUgU29mdHdhcmUgYW5kIG11c3Qgc29saWNpdCBhY2NlcHRhbmNlCisgICAgYnkgdGhlIGVuZCB1c2VyIGluIHRoZSBtYW5uZXIgcHJlc2NyaWJlZCBpbiBzdWNoIEluc3RhbGxhYmxlCisgICAgU29mdHdhcmUgQWdyZWVtZW50LiBVcG9uIHN1Y2ggaW5kaWNhdGlvbiBvZiBhZ3JlZW1lbnQgYnkgdGhlIHVzZXIsIHRoZQorICAgIHByb3Zpc2lvbmluZyBUZWNobm9sb2d5IHdpbGwgY29tcGxldGUgaW5zdGFsbGF0aW9uIG9mIHRoZQorICAgIEluc3RhbGxhYmxlIFNvZnR3YXJlLgogCi0zLiBSRVFVSVJFTUVOVFMKK0NyeXB0b2dyYXBoeQogCi1BIENvbnRyaWJ1dG9yIG1heSBjaG9vc2UgdG8gZGlzdHJpYnV0ZSB0aGUgUHJvZ3JhbSBpbiBvYmplY3QgY29kZSBmb3JtIHVuZGVyIGl0cyBvd24gbGljZW5zZSBhZ3JlZW1lbnQsIHByb3ZpZGVkIHRoYXQ6CitDb250ZW50IG1heSBjb250YWluIGVuY3J5cHRpb24gc29mdHdhcmUuIFRoZSBjb3VudHJ5IGluIHdoaWNoIHlvdSBhcmUgY3VycmVudGx5CittYXkgaGF2ZSByZXN0cmljdGlvbnMgb24gdGhlIGltcG9ydCwgcG9zc2Vzc2lvbiwgYW5kIHVzZSwgYW5kL29yIHJlLWV4cG9ydCB0bworYW5vdGhlciBjb3VudHJ5LCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBCRUZPUkUgdXNpbmcgYW55IGVuY3J5cHRpb24gc29mdHdhcmUsCitwbGVhc2UgY2hlY2sgdGhlIGNvdW50cnkncyBsYXdzLCByZWd1bGF0aW9ucyBhbmQgcG9saWNpZXMgY29uY2VybmluZyB0aGUgaW1wb3J0LAorcG9zc2Vzc2lvbiwgb3IgdXNlLCBhbmQgcmUtZXhwb3J0IG9mIGVuY3J5cHRpb24gc29mdHdhcmUsIHRvIHNlZSBpZiB0aGlzIGlzCitwZXJtaXR0ZWQuCiAKLWEpIGl0IGNvbXBsaWVzIHdpdGggdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoaXMgQWdyZWVtZW50OyBhbmQKLQotYikgaXRzIGxpY2Vuc2UgYWdyZWVtZW50OgotCi1pKSBlZmZlY3RpdmVseSBkaXNjbGFpbXMgb24gYmVoYWxmIG9mIGFsbCBDb250cmlidXRvcnMgYWxsIHdhcnJhbnRpZXMgYW5kIGNvbmRpdGlvbnMsIGV4cHJlc3MgYW5kIGltcGxpZWQsIGluY2x1ZGluZwotd2FycmFudGllcyBvciBjb25kaXRpb25zIG9mIHRpdGxlIGFuZCBub24taW5mcmluZ2VtZW50LCBhbmQgaW1wbGllZCB3YXJyYW50aWVzIG9yIGNvbmRpdGlvbnMgb2YgbWVyY2hhbnRhYmlsaXR5IGFuZAotZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2U7Ci0KLWlpKSBlZmZlY3RpdmVseSBleGNsdWRlcyBvbiBiZWhhbGYgb2YgYWxsIENvbnRyaWJ1dG9ycyBhbGwgbGlhYmlsaXR5IGZvciBkYW1hZ2VzLCBpbmNsdWRpbmcgZGlyZWN0LCBpbmRpcmVjdCwgc3BlY2lhbCwKLWluY2lkZW50YWwgYW5kIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywgc3VjaCBhcyBsb3N0IHByb2ZpdHM7Ci0KLWlpaSkgc3RhdGVzIHRoYXQgYW55IHByb3Zpc2lvbnMgd2hpY2ggZGlmZmVyIGZyb20gdGhpcyBBZ3JlZW1lbnQgYXJlIG9mZmVyZWQgYnkgdGhhdCBDb250cmlidXRvciBhbG9uZSBhbmQgbm90IGJ5IGFueQotb3RoZXIgcGFydHk7IGFuZAotCi1pdikgc3RhdGVzIHRoYXQgc291cmNlIGNvZGUgZm9yIHRoZSBQcm9ncmFtIGlzIGF2YWlsYWJsZSBmcm9tIHN1Y2ggQ29udHJpYnV0b3IsIGFuZCBpbmZvcm1zIGxpY2Vuc2VlcyBob3cgdG8gb2J0YWluIGl0Ci1pbiBhIHJlYXNvbmFibGUgbWFubmVyIG9uIG9yIHRocm91Z2ggYSBtZWRpdW0gY3VzdG9tYXJpbHkgdXNlZCBmb3Igc29mdHdhcmUgZXhjaGFuZ2UuCi0KLVdoZW4gdGhlIFByb2dyYW0gaXMgbWFkZSBhdmFpbGFibGUgaW4gc291cmNlIGNvZGUgZm9ybToKLQotYSkgaXQgbXVzdCBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGlzIEFncmVlbWVudDsgYW5kCi0KLWIpIGEgY29weSBvZiB0aGlzIEFncmVlbWVudCBtdXN0IGJlIGluY2x1ZGVkIHdpdGggZWFjaCBjb3B5IG9mIHRoZSBQcm9ncmFtLgotCi1Db250cmlidXRvcnMgbWF5IG5vdCByZW1vdmUgb3IgYWx0ZXIgYW55IGNvcHlyaWdodCBub3RpY2VzIGNvbnRhaW5lZCB3aXRoaW4gdGhlIFByb2dyYW0uCi0KLUVhY2ggQ29udHJpYnV0b3IgbXVzdCBpZGVudGlmeSBpdHNlbGYgYXMgdGhlIG9yaWdpbmF0b3Igb2YgaXRzIENvbnRyaWJ1dGlvbiwgaWYgYW55LCBpbiBhIG1hbm5lciB0aGF0IHJlYXNvbmFibHkgYWxsb3dzCi1zdWJzZXF1ZW50IFJlY2lwaWVudHMgdG8gaWRlbnRpZnkgdGhlIG9yaWdpbmF0b3Igb2YgdGhlIENvbnRyaWJ1dGlvbi4KLQotNC4gQ09NTUVSQ0lBTCBESVNUUklCVVRJT04KLQotQ29tbWVyY2lhbCBkaXN0cmlidXRvcnMgb2Ygc29mdHdhcmUgbWF5IGFjY2VwdCBjZXJ0YWluIHJlc3BvbnNpYmlsaXRpZXMgd2l0aCByZXNwZWN0IHRvIGVuZCB1c2VycywgYnVzaW5lc3MgcGFydG5lcnMgYW5kCi10aGUgbGlrZS4gV2hpbGUgdGhpcyBsaWNlbnNlIGlzIGludGVuZGVkIHRvIGZhY2lsaXRhdGUgdGhlIGNvbW1lcmNpYWwgdXNlIG9mIHRoZSBQcm9ncmFtLCB0aGUgQ29udHJpYnV0b3Igd2hvIGluY2x1ZGVzCi10aGUgUHJvZ3JhbSBpbiBhIGNvbW1lcmNpYWwgcHJvZHVjdCBvZmZlcmluZyBzaG91bGQgZG8gc28gaW4gYSBtYW5uZXIgd2hpY2ggZG9lcyBub3QgY3JlYXRlIHBvdGVudGlhbCBsaWFiaWxpdHkgZm9yCi1vdGhlciBDb250cmlidXRvcnMuIFRoZXJlZm9yZSwgaWYgYSBDb250cmlidXRvciBpbmNsdWRlcyB0aGUgUHJvZ3JhbSBpbiBhIGNvbW1lcmNpYWwgcHJvZHVjdCBvZmZlcmluZywgc3VjaCBDb250cmlidXRvcgotKCJDb21tZXJjaWFsIENvbnRyaWJ1dG9yIikgaGVyZWJ5IGFncmVlcyB0byBkZWZlbmQgYW5kIGluZGVtbmlmeSBldmVyeSBvdGhlciBDb250cmlidXRvciAoIkluZGVtbmlmaWVkIENvbnRyaWJ1dG9yIikKLWFnYWluc3QgYW55IGxvc3NlcywgZGFtYWdlcyBhbmQgY29zdHMgKGNvbGxlY3RpdmVseSAiTG9zc2VzIikgYXJpc2luZyBmcm9tIGNsYWltcywgbGF3c3VpdHMgYW5kIG90aGVyIGxlZ2FsIGFjdGlvbnMKLWJyb3VnaHQgYnkgYSB0aGlyZCBwYXJ0eSBhZ2FpbnN0IHRoZSBJbmRlbW5pZmllZCBDb250cmlidXRvciB0byB0aGUgZXh0ZW50IGNhdXNlZCBieSB0aGUgYWN0cyBvciBvbWlzc2lvbnMgb2Ygc3VjaAotQ29tbWVyY2lhbCBDb250cmlidXRvciBpbiBjb25uZWN0aW9uIHdpdGggaXRzIGRpc3RyaWJ1dGlvbiBvZiB0aGUgUHJvZ3JhbSBpbiBhIGNvbW1lcmNpYWwgcHJvZHVjdCBvZmZlcmluZy4gVGhlCi1vYmxpZ2F0aW9ucyBpbiB0aGlzIHNlY3Rpb24gZG8gbm90IGFwcGx5IHRvIGFueSBjbGFpbXMgb3IgTG9zc2VzIHJlbGF0aW5nIHRvIGFueSBhY3R1YWwgb3IgYWxsZWdlZCBpbnRlbGxlY3R1YWwKLXByb3BlcnR5IGluZnJpbmdlbWVudC4gSW4gb3JkZXIgdG8gcXVhbGlmeSwgYW4gSW5kZW1uaWZpZWQgQ29udHJpYnV0b3IgbXVzdDogYSkgcHJvbXB0bHkgbm90aWZ5IHRoZSBDb21tZXJjaWFsCi1Db250cmlidXRvciBpbiB3cml0aW5nIG9mIHN1Y2ggY2xhaW0sIGFuZCBiKSBhbGxvdyB0aGUgQ29tbWVyY2lhbCBDb250cmlidXRvciB0byBjb250cm9sLCBhbmQgY29vcGVyYXRlIHdpdGggdGhlCi1Db21tZXJjaWFsIENvbnRyaWJ1dG9yIGluLCB0aGUgZGVmZW5zZSBhbmQgYW55IHJlbGF0ZWQgc2V0dGxlbWVudCBuZWdvdGlhdGlvbnMuIFRoZSBJbmRlbW5pZmllZCBDb250cmlidXRvciBtYXkKLSBwYXJ0aWNpcGF0ZSBpbiBhbnkgc3VjaCBjbGFpbSBhdCBpdHMgb3duIGV4cGVuc2UuCi0KLUZvciBleGFtcGxlLCBhIENvbnRyaWJ1dG9yIG1pZ2h0IGluY2x1ZGUgdGhlIFByb2dyYW0gaW4gYSBjb21tZXJjaWFsIHByb2R1Y3Qgb2ZmZXJpbmcsIFByb2R1Y3QgWC4gVGhhdCBDb250cmlidXRvciBpcwotdGhlbiBhIENvbW1lcmNpYWwgQ29udHJpYnV0b3IuIElmIHRoYXQgQ29tbWVyY2lhbCBDb250cmlidXRvciB0aGVuIG1ha2VzIHBlcmZvcm1hbmNlIGNsYWltcywgb3Igb2ZmZXJzIHdhcnJhbnRpZXMKLXJlbGF0ZWQgdG8gUHJvZHVjdCBYLCB0aG9zZSBwZXJmb3JtYW5jZSBjbGFpbXMgYW5kIHdhcnJhbnRpZXMgYXJlIHN1Y2ggQ29tbWVyY2lhbCBDb250cmlidXRvcidzIHJlc3BvbnNpYmlsaXR5IGFsb25lLgotVW5kZXIgdGhpcyBzZWN0aW9uLCB0aGUgQ29tbWVyY2lhbCBDb250cmlidXRvciB3b3VsZCBoYXZlIHRvIGRlZmVuZCBjbGFpbXMgYWdhaW5zdCB0aGUgb3RoZXIgQ29udHJpYnV0b3JzIHJlbGF0ZWQgdG8KLXRob3NlIHBlcmZvcm1hbmNlIGNsYWltcyBhbmQgd2FycmFudGllcywgYW5kIGlmIGEgY291cnQgcmVxdWlyZXMgYW55IG90aGVyIENvbnRyaWJ1dG9yIHRvIHBheSBhbnkgZGFtYWdlcyBhcyBhIHJlc3VsdCwKLXRoZSBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIG11c3QgcGF5IHRob3NlIGRhbWFnZXMuCi0KLTUuIE5PIFdBUlJBTlRZCi0KLUVYQ0VQVCBBUyBFWFBSRVNTTFkgU0VUIEZPUlRIIElOIFRISVMgQUdSRUVNRU5ULCBUSEUgUFJPR1JBTSBJUyBQUk9WSURFRCBPTiBBTiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IKLUNPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIEVJVEhFUiBFWFBSRVNTIE9SIElNUExJRUQgSU5DTFVESU5HLCBXSVRIT1VUIExJTUlUQVRJT04sIEFOWSBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgVElUTEUsCi1OT04tSU5GUklOR0VNRU5ULCBNRVJDSEFOVEFCSUxJVFkgT1IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIEVhY2ggUmVjaXBpZW50IGlzIHNvbGVseSByZXNwb25zaWJsZSBmb3IKLWRldGVybWluaW5nIHRoZSBhcHByb3ByaWF0ZW5lc3Mgb2YgdXNpbmcgYW5kIGRpc3RyaWJ1dGluZyB0aGUgUHJvZ3JhbSBhbmQgYXNzdW1lcyBhbGwgcmlza3MgYXNzb2NpYXRlZCB3aXRoIGl0cwotZXhlcmNpc2Ugb2YgcmlnaHRzIHVuZGVyIHRoaXMgQWdyZWVtZW50ICwgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgcmlza3MgYW5kIGNvc3RzIG9mIHByb2dyYW0gZXJyb3JzLCBjb21wbGlhbmNlCi13aXRoIGFwcGxpY2FibGUgbGF3cywgZGFtYWdlIHRvIG9yIGxvc3Mgb2YgZGF0YSwgcHJvZ3JhbXMgb3IgZXF1aXBtZW50LCBhbmQgdW5hdmFpbGFiaWxpdHkgb3IgaW50ZXJydXB0aW9uIG9mIG9wZXJhdGlvbnMuCi0KLTYuIERJU0NMQUlNRVIgT0YgTElBQklMSVRZCi0KLUVYQ0VQVCBBUyBFWFBSRVNTTFkgU0VUIEZPUlRIIElOIFRISVMgQUdSRUVNRU5ULCBORUlUSEVSIFJFQ0lQSUVOVCBOT1IgQU5ZIENPTlRSSUJVVE9SUyBTSEFMTCBIQVZFIEFOWSBMSUFCSUxJVFkgRk9SIEFOWQotRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORyBXSVRIT1VUIExJTUlUQVRJT04gTE9TVCBQUk9GSVRTKSwKLUhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IKLU9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9SIERJU1RSSUJVVElPTiBPRiBUSEUgUFJPR1JBTSBPUiBUSEUgRVhFUkNJU0UgT0YgQU5ZIFJJR0hUUyBHUkFOVEVECi1IRVJFVU5ERVIsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0VTLgotCi03LiBHRU5FUkFMCi0KLUlmIGFueSBwcm92aXNpb24gb2YgdGhpcyBBZ3JlZW1lbnQgaXMgaW52YWxpZCBvciB1bmVuZm9yY2VhYmxlIHVuZGVyIGFwcGxpY2FibGUgbGF3LCBpdCBzaGFsbCBub3QgYWZmZWN0IHRoZSB2YWxpZGl0eSBvcgotZW5mb3JjZWFiaWxpdHkgb2YgdGhlIHJlbWFpbmRlciBvZiB0aGUgdGVybXMgb2YgdGhpcyBBZ3JlZW1lbnQsIGFuZCB3aXRob3V0IGZ1cnRoZXIgYWN0aW9uIGJ5IHRoZSBwYXJ0aWVzIGhlcmV0bywgc3VjaAotcHJvdmlzaW9uIHNoYWxsIGJlIHJlZm9ybWVkIHRvIHRoZSBtaW5pbXVtIGV4dGVudCBuZWNlc3NhcnkgdG8gbWFrZSBzdWNoIHByb3Zpc2lvbiB2YWxpZCBhbmQgZW5mb3JjZWFibGUuCi0KLUlmIFJlY2lwaWVudCBpbnN0aXR1dGVzIHBhdGVudCBsaXRpZ2F0aW9uIGFnYWluc3QgYW55IGVudGl0eSAoaW5jbHVkaW5nIGEgY3Jvc3MtY2xhaW0gb3IgY291bnRlcmNsYWltIGluIGEgbGF3c3VpdCkKLWFsbGVnaW5nIHRoYXQgdGhlIFByb2dyYW0gaXRzZWxmIChleGNsdWRpbmcgY29tYmluYXRpb25zIG9mIHRoZSBQcm9ncmFtIHdpdGggb3RoZXIgc29mdHdhcmUgb3IgaGFyZHdhcmUpIGluZnJpbmdlcyBzdWNoCi1SZWNpcGllbnQncyBwYXRlbnQocyksIHRoZW4gc3VjaCBSZWNpcGllbnQncyByaWdodHMgZ3JhbnRlZCB1bmRlciBTZWN0aW9uIDIoYikgc2hhbGwgdGVybWluYXRlIGFzIG9mIHRoZSBkYXRlIHN1Y2gKLWxpdGlnYXRpb24gaXMgZmlsZWQuCi0KLUFsbCBSZWNpcGllbnQncyByaWdodHMgdW5kZXIgdGhpcyBBZ3JlZW1lbnQgc2hhbGwgdGVybWluYXRlIGlmIGl0IGZhaWxzIHRvIGNvbXBseSB3aXRoIGFueSBvZiB0aGUgbWF0ZXJpYWwgdGVybXMgb3IKLWNvbmRpdGlvbnMgb2YgdGhpcyBBZ3JlZW1lbnQgYW5kIGRvZXMgbm90IGN1cmUgc3VjaCBmYWlsdXJlIGluIGEgcmVhc29uYWJsZSBwZXJpb2Qgb2YgdGltZSBhZnRlciBiZWNvbWluZyBhd2FyZSBvZiBzdWNoCi1ub25jb21wbGlhbmNlLiBJZiBhbGwgUmVjaXBpZW50J3MgcmlnaHRzIHVuZGVyIHRoaXMgQWdyZWVtZW50IHRlcm1pbmF0ZSwgUmVjaXBpZW50IGFncmVlcyB0byBjZWFzZSB1c2UgYW5kIGRpc3RyaWJ1dGlvbgotb2YgdGhlIFByb2dyYW0gYXMgc29vbiBhcyByZWFzb25hYmx5IHByYWN0aWNhYmxlLiBIb3dldmVyLCBSZWNpcGllbnQncyBvYmxpZ2F0aW9ucyB1bmRlciB0aGlzIEFncmVlbWVudCBhbmQgYW55IGxpY2Vuc2VzCi0gZ3JhbnRlZCBieSBSZWNpcGllbnQgcmVsYXRpbmcgdG8gdGhlIFByb2dyYW0gc2hhbGwgY29udGludWUgYW5kIHN1cnZpdmUuCi0KLUV2ZXJ5b25lIGlzIHBlcm1pdHRlZCB0byBjb3B5IGFuZCBkaXN0cmlidXRlIGNvcGllcyBvZiB0aGlzIEFncmVlbWVudCwgYnV0IGluIG9yZGVyIHRvIGF2b2lkIGluY29uc2lzdGVuY3kgdGhlIEFncmVlbWVudAotaXMgY29weXJpZ2h0ZWQgYW5kIG1heSBvbmx5IGJlIG1vZGlmaWVkIGluIHRoZSBmb2xsb3dpbmcgbWFubmVyLiBUaGUgQWdyZWVtZW50IFN0ZXdhcmQgcmVzZXJ2ZXMgdGhlIHJpZ2h0IHRvIHB1Ymxpc2gKLW5ldyB2ZXJzaW9ucyAoaW5jbHVkaW5nIHJldmlzaW9ucykgb2YgdGhpcyBBZ3JlZW1lbnQgZnJvbSB0aW1lIHRvIHRpbWUuIE5vIG9uZSBvdGhlciB0aGFuIHRoZSBBZ3JlZW1lbnQgU3Rld2FyZCBoYXMgdGhlCi1yaWdodCB0byBtb2RpZnkgdGhpcyBBZ3JlZW1lbnQuIFRoZSBFY2xpcHNlIEZvdW5kYXRpb24gaXMgdGhlIGluaXRpYWwgQWdyZWVtZW50IFN0ZXdhcmQuIFRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWF5Ci1hc3NpZ24gdGhlIHJlc3BvbnNpYmlsaXR5IHRvIHNlcnZlIGFzIHRoZSBBZ3JlZW1lbnQgU3Rld2FyZCB0byBhIHN1aXRhYmxlIHNlcGFyYXRlIGVudGl0eS4gRWFjaCBuZXcgdmVyc2lvbiBvZiB0aGUKLUFncmVlbWVudCB3aWxsIGJlIGdpdmVuIGEgZGlzdGluZ3Vpc2hpbmcgdmVyc2lvbiBudW1iZXIuIFRoZSBQcm9ncmFtIChpbmNsdWRpbmcgQ29udHJpYnV0aW9ucykgbWF5IGFsd2F5cyBiZQotZGlzdHJpYnV0ZWQgc3ViamVjdCB0byB0aGUgdmVyc2lvbiBvZiB0aGUgQWdyZWVtZW50IHVuZGVyIHdoaWNoIGl0IHdhcyByZWNlaXZlZC4gSW4gYWRkaXRpb24sIGFmdGVyIGEgbmV3IHZlcnNpb24gb2YKLXRoZSBBZ3JlZW1lbnQgaXMgcHVibGlzaGVkLCBDb250cmlidXRvciBtYXkgZWxlY3QgdG8gZGlzdHJpYnV0ZSB0aGUgUHJvZ3JhbSAoaW5jbHVkaW5nIGl0cyBDb250cmlidXRpb25zKSB1bmRlciB0aGUKLW5ldyB2ZXJzaW9uLiBFeGNlcHQgYXMgZXhwcmVzc2x5IHN0YXRlZCBpbiBTZWN0aW9ucyAyKGEpIGFuZCAyKGIpIGFib3ZlLCBSZWNpcGllbnQgcmVjZWl2ZXMgbm8gcmlnaHRzIG9yIGxpY2Vuc2VzIHRvCi10aGUgaW50ZWxsZWN0dWFsIHByb3BlcnR5IG9mIGFueSBDb250cmlidXRvciB1bmRlciB0aGlzIEFncmVlbWVudCwgd2hldGhlciBleHByZXNzbHksIGJ5IGltcGxpY2F0aW9uLCBlc3RvcHBlbCBvcgotb3RoZXJ3aXNlLiBBbGwgcmlnaHRzIGluIHRoZSBQcm9ncmFtIG5vdCBleHByZXNzbHkgZ3JhbnRlZCB1bmRlciB0aGlzIEFncmVlbWVudCBhcmUgcmVzZXJ2ZWQuCi0KLVRoaXMgQWdyZWVtZW50IGlzIGdvdmVybmVkIGJ5IHRoZSBsYXdzIG9mIHRoZSBTdGF0ZSBvZiBOZXcgWW9yayBhbmQgdGhlIGludGVsbGVjdHVhbCBwcm9wZXJ0eSBsYXdzIG9mIHRoZSBVbml0ZWQgU3RhdGVzCi1vZiBBbWVyaWNhLiBObyBwYXJ0eSB0byB0aGlzIEFncmVlbWVudCB3aWxsIGJyaW5nIGEgbGVnYWwgYWN0aW9uIHVuZGVyIHRoaXMgQWdyZWVtZW50IG1vcmUgdGhhbiBvbmUgeWVhciBhZnRlciB0aGUgY2F1c2UKLW9mIGFjdGlvbiBhcm9zZS4gRWFjaCBwYXJ0eSB3YWl2ZXMgaXRzIHJpZ2h0cyB0byBhIGp1cnkgdHJpYWwgaW4gYW55IHJlc3VsdGluZyBsaXRpZ2F0aW9uLgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKK0phdmEgYW5kIGFsbCBKYXZhLWJhc2VkIHRyYWRlbWFya3MgYXJlIHRyYWRlbWFya3Mgb2YgT3JhY2xlIENvcnBvcmF0aW9uIGluIHRoZQorVW5pdGVkIFN0YXRlcywgb3RoZXIgY291bnRyaWVzLCBvciBib3RoLgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5kYXRhaW50ZXJjaGFuZ2UudGVzdHMvYWJvdXQuaHRtbCBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQuZGF0YWludGVyY2hhbmdlLnRlc3RzL2Fib3V0Lmh0bWwKaW5kZXggNjRjMDU5OC4uZThiODM0ZCAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5kYXRhaW50ZXJjaGFuZ2UudGVzdHMvYWJvdXQuaHRtbAorKysgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmRhdGFpbnRlcmNoYW5nZS50ZXN0cy9hYm91dC5odG1sCkBAIC04LDEzICs4LDEzIEBACiA8Ym9keSBsYW5nPSJFTi1VUyI+CiA8aDI+QWJvdXQgVGhpcyBDb250ZW50PC9oMj4KICAKLTxwPkp1bmUgMSwgMjAxNjwvcD4JCis8cD5Ob3ZlbWJlciAzMCwgMjAxNzwvcD4JCiA8aDM+TGljZW5zZTwvaDM+CiAKIDxwPlRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWFrZXMgYXZhaWxhYmxlIGFsbCBjb250ZW50IGluIHRoaXMgcGx1Zy1pbiAoJnF1b3Q7Q29udGVudCZxdW90OykuICBVbmxlc3Mgb3RoZXJ3aXNlIAogaW5kaWNhdGVkIGJlbG93LCB0aGUgQ29udGVudCBpcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZQotRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoJnF1b3Q7RVBMJnF1b3Q7KS4gIEEgY29weSBvZiB0aGUgRVBMIGlzIGF2YWlsYWJsZSAKLWF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbDwvYT4uCitFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMi4wICgmcXVvdDtFUEwmcXVvdDspLiAgQSBjb3B5IG9mIHRoZSBFUEwgaXMgYXZhaWxhYmxlIAorYXQgPGEgaHJlZj0iaHR0cHM6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMCI+aHR0cHM6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMDwvYT4uCiBGb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgJnF1b3Q7UHJvZ3JhbSZxdW90OyB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9wPgogCiA8cD5JZiB5b3UgZGlkIG5vdCByZWNlaXZlIHRoaXMgQ29udGVudCBkaXJlY3RseSBmcm9tIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24sIHRoZSBDb250ZW50IGlzIApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5kYXRhaW50ZXJjaGFuZ2UudGVzdHMvYWJvdXQucHJvcGVydGllcyBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQuZGF0YWludGVyY2hhbmdlLnRlc3RzL2Fib3V0LnByb3BlcnRpZXMKaW5kZXggYTYxZGFkZi4uOTA5Yjc2YSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5kYXRhaW50ZXJjaGFuZ2UudGVzdHMvYWJvdXQucHJvcGVydGllcworKysgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmRhdGFpbnRlcmNoYW5nZS50ZXN0cy9hYm91dC5wcm9wZXJ0aWVzCkBAIC0xLDkgKzEsMTEgQEAKICMKICMgQ29weXJpZ2h0IChjKSAyMDEyLCAyMDE2IC0gTG9ldHogR21iSCZDby5LRyAoSGVpZGVsYmVyZykKICMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSAyLjAgCiAjIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisjIGh0dHBzOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAvCisjCisjIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wCiAjCiAjIENvbnRyaWJ1dG9yczoKICMgICAgQ2hyaXN0b3BoZSBMb2V0eiAoTG9ldHogR21iSCZDby5LRykgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KQEAgLTE3LDkgKzE5LDExIEBACiBmZWF0dXJlVGV4dD1cCiBDb3B5cmlnaHQgKGMpIDIwMTItMjAxNiAtIExvZXR6IEdtYkgmQ28uS0cgXG5cCiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzXG5cCi1hcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjBcblwKK2FyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgMi4wIFxuXAogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXRcblwKLWh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sXG5cCitodHRwczovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wL1xuXAorXG5cCitTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMFxuXAogXG5cCiBDb250cmlidXRvcnM6XG5cCiAgICAgQ2hyaXN0b3BoZSBMb2V0eiAoTG9ldHogR21iSCZDby5LRykgLSBpbml0aWFsIGltcGxlbWVudGF0aW9uXG4KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLm9zYnAueHRleHQuZGF0YWludGVyY2hhbmdlLnRlc3RzL2J1aWxkLnByb3BlcnRpZXMgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmRhdGFpbnRlcmNoYW5nZS50ZXN0cy9idWlsZC5wcm9wZXJ0aWVzCmluZGV4IDQzMWVhMjIuLmQ5Y2QzMDAgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLm9zYnAueHRleHQuZGF0YWludGVyY2hhbmdlLnRlc3RzL2J1aWxkLnByb3BlcnRpZXMKKysrIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5kYXRhaW50ZXJjaGFuZ2UudGVzdHMvYnVpbGQucHJvcGVydGllcwpAQCAtOCw3ICs4LDcgQEAKICAgICAgICAgICAgICAgIC5zZXR0aW5ncy8sXAogICAgICAgICAgICAgICAgbGljZW5zZS5odG1sLFwKICAgICAgICAgICAgICAgIExJQ0VOU0UudHh0LFwKLSAgICAgICAgICAgICAgIGVwbC12MTAuaHRtbAorICAgICAgICAgICAgICAgZXBsLTIuMC5odG1sCiBzcmMuaW5jbHVkZXMgPSBhYm91dC5wcm9wZXJ0aWVzLCAgYWJvdXQubWFwcGluZ3MsICBhYm91dC5pbmksICBhYm91dC5odG1sLCAgbGljZW5zZS5odG1sLFwKICAgICAgICAgICAgICAgIExJQ0VOU0UudHh0LFwKLSAgICAgICAgICAgICAgIGVwbC12MTAuaHRtbAkJCSAgIAorICAgICAgICAgICAgICAgZXBsLTIuMC5odG1sCQkJICAgCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmRhdGFpbnRlcmNoYW5nZS50ZXN0cy9lcGwtMi4wLmh0bWwgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmRhdGFpbnRlcmNoYW5nZS50ZXN0cy9lcGwtMi4wLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjM3YTE4MQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQuZGF0YWludGVyY2hhbmdlLnRlc3RzL2VwbC0yLjAuaHRtbApAQCAtMCwwICsxLDMwMCBAQAorPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgU3RyaWN0Ly9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXN0cmljdC5kdGQiPgorPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiIHhtbDpsYW5nPSJlbiIgbGFuZz0iZW4iPgorICA8aGVhZD4KKyAgICA8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11dGYtOCIgLz4KKyAgICA8dGl0bGU+RWNsaXBzZSBQdWJsaWMgTGljZW5zZSAtIFZlcnNpb24gMi4wPC90aXRsZT4KKyAgICA8c3R5bGUgdHlwZT0idGV4dC9jc3MiPgorICAgICAgYm9keSB7CisgICAgICAgIG1hcmdpbjogMS41ZW0gM2VtOworICAgICAgfQorICAgICAgaDF7CisgICAgICAgIGZvbnQtc2l6ZToxLjVlbTsKKyAgICAgIH0KKyAgICAgIGgyeworICAgICAgICBmb250LXNpemU6MWVtOworICAgICAgICBtYXJnaW4tYm90dG9tOjAuNWVtOworICAgICAgICBtYXJnaW4tdG9wOjFlbTsKKyAgICAgIH0KKyAgICAgIHAgeworICAgICAgICBtYXJnaW4tdG9wOiAgMC41ZW07CisgICAgICAgIG1hcmdpbi1ib3R0b206IDAuNWVtOworICAgICAgfQorICAgICAgdWwsIG9seworICAgICAgICBsaXN0LXN0eWxlLXR5cGU6bm9uZTsKKyAgICAgIH0KKyAgICA8L3N0eWxlPgorICA8L2hlYWQ+CisgIDxib2R5PgorICAgIDxoMT5FY2xpcHNlIFB1YmxpYyBMaWNlbnNlIC0gdiAyLjA8L2gxPgorICAgIDxwPlRIRSBBQ0NPTVBBTllJTkcgUFJPR1JBTSBJUyBQUk9WSURFRCBVTkRFUiBUSEUgVEVSTVMgT0YgVEhJUyBFQ0xJUFNFCisgICAgICBQVUJMSUMgTElDRU5TRSAoJmxkcXVvO0FHUkVFTUVOVCZyZHF1bzspLiBBTlkgVVNFLCBSRVBST0RVQ1RJT04gT1IgRElTVFJJQlVUSU9OCisgICAgICBPRiBUSEUgUFJPR1JBTSBDT05TVElUVVRFUyBSRUNJUElFTlQmIzAzOTtTIEFDQ0VQVEFOQ0UgT0YgVEhJUyBBR1JFRU1FTlQuCisgICAgPC9wPgorICAgIDxoMiBpZD0iZGVmaW5pdGlvbnMiPjEuIERFRklOSVRJT05TPC9oMj4KKyAgICA8cD4mbGRxdW87Q29udHJpYnV0aW9uJnJkcXVvOyBtZWFuczo8L3A+CisgICAgPHVsPgorICAgICAgPGxpPmEpIGluIHRoZSBjYXNlIG9mIHRoZSBpbml0aWFsIENvbnRyaWJ1dG9yLCB0aGUgaW5pdGlhbCBjb250ZW50CisgICAgICAgIERpc3RyaWJ1dGVkIHVuZGVyIHRoaXMgQWdyZWVtZW50LCBhbmQKKyAgICAgIDwvbGk+CisgICAgICA8bGk+CisgICAgICAgIGIpIGluIHRoZSBjYXNlIG9mIGVhY2ggc3Vic2VxdWVudCBDb250cmlidXRvcjoKKyAgICAgICAgPHVsPgorICAgICAgICAgIDxsaT5pKSBjaGFuZ2VzIHRvIHRoZSBQcm9ncmFtLCBhbmQ8L2xpPgorICAgICAgICAgIDxsaT5paSkgYWRkaXRpb25zIHRvIHRoZSBQcm9ncmFtOzwvbGk+CisgICAgICAgIDwvdWw+CisgICAgICAgIHdoZXJlIHN1Y2ggY2hhbmdlcyBhbmQvb3IgYWRkaXRpb25zIHRvIHRoZSBQcm9ncmFtIG9yaWdpbmF0ZSBmcm9tCisgICAgICAgIGFuZCBhcmUgRGlzdHJpYnV0ZWQgYnkgdGhhdCBwYXJ0aWN1bGFyIENvbnRyaWJ1dG9yLiBBIENvbnRyaWJ1dGlvbgorICAgICAgICAmbGRxdW87b3JpZ2luYXRlcyZyZHF1bzsgZnJvbSBhIENvbnRyaWJ1dG9yIGlmIGl0IHdhcyBhZGRlZCB0byB0aGUgUHJvZ3JhbSBieSBzdWNoCisgICAgICAgIENvbnRyaWJ1dG9yIGl0c2VsZiBvciBhbnlvbmUgYWN0aW5nIG9uIHN1Y2ggQ29udHJpYnV0b3ImIzAzOTtzIGJlaGFsZi4KKyAgICAgICAgQ29udHJpYnV0aW9ucyBkbyBub3QgaW5jbHVkZSBjaGFuZ2VzIG9yIGFkZGl0aW9ucyB0byB0aGUgUHJvZ3JhbSB0aGF0CisgICAgICAgIGFyZSBub3QgTW9kaWZpZWQgV29ya3MuCisgICAgICA8L2xpPgorICAgIDwvdWw+CisgICAgPHA+JmxkcXVvO0NvbnRyaWJ1dG9yJnJkcXVvOyBtZWFucyBhbnkgcGVyc29uIG9yIGVudGl0eSB0aGF0IERpc3RyaWJ1dGVzIHRoZSBQcm9ncmFtLjwvcD4KKyAgICA8cD4mbGRxdW87TGljZW5zZWQgUGF0ZW50cyZyZHF1bzsgbWVhbiBwYXRlbnQgY2xhaW1zIGxpY2Vuc2FibGUgYnkgYSBDb250cmlidXRvciB3aGljaAorICAgICAgYXJlIG5lY2Vzc2FyaWx5IGluZnJpbmdlZCBieSB0aGUgdXNlIG9yIHNhbGUgb2YgaXRzIENvbnRyaWJ1dGlvbiBhbG9uZQorICAgICAgb3Igd2hlbiBjb21iaW5lZCB3aXRoIHRoZSBQcm9ncmFtLgorICAgIDwvcD4KKyAgICA8cD4mbGRxdW87UHJvZ3JhbSZyZHF1bzsgbWVhbnMgdGhlIENvbnRyaWJ1dGlvbnMgRGlzdHJpYnV0ZWQgaW4gYWNjb3JkYW5jZSB3aXRoIHRoaXMKKyAgICAgIEFncmVlbWVudC4KKyAgICA8L3A+CisgICAgPHA+JmxkcXVvO1JlY2lwaWVudCZyZHF1bzsgbWVhbnMgYW55b25lIHdobyByZWNlaXZlcyB0aGUgUHJvZ3JhbSB1bmRlciB0aGlzIEFncmVlbWVudAorICAgICAgb3IgYW55IFNlY29uZGFyeSBMaWNlbnNlIChhcyBhcHBsaWNhYmxlKSwgaW5jbHVkaW5nIENvbnRyaWJ1dG9ycy4KKyAgICA8L3A+CisgICAgPHA+JmxkcXVvO0Rlcml2YXRpdmUgV29ya3MmcmRxdW87IHNoYWxsIG1lYW4gYW55IHdvcmssIHdoZXRoZXIgaW4gU291cmNlIENvZGUgb3Igb3RoZXIKKyAgICAgIGZvcm0sIHRoYXQgaXMgYmFzZWQgb24gKG9yIGRlcml2ZWQgZnJvbSkgdGhlIFByb2dyYW0gYW5kIGZvciB3aGljaCB0aGUKKyAgICAgIGVkaXRvcmlhbCByZXZpc2lvbnMsIGFubm90YXRpb25zLCBlbGFib3JhdGlvbnMsIG9yIG90aGVyIG1vZGlmaWNhdGlvbnMKKyAgICAgIHJlcHJlc2VudCwgYXMgYSB3aG9sZSwgYW4gb3JpZ2luYWwgd29yayBvZiBhdXRob3JzaGlwLgorICAgIDwvcD4KKyAgICA8cD4mbGRxdW87TW9kaWZpZWQgV29ya3MmcmRxdW87IHNoYWxsIG1lYW4gYW55IHdvcmsgaW4gU291cmNlIENvZGUgb3Igb3RoZXIgZm9ybSB0aGF0CisgICAgICByZXN1bHRzIGZyb20gYW4gYWRkaXRpb24gdG8sIGRlbGV0aW9uIGZyb20sIG9yIG1vZGlmaWNhdGlvbiBvZiB0aGUKKyAgICAgIGNvbnRlbnRzIG9mIHRoZSBQcm9ncmFtLCBpbmNsdWRpbmcsIGZvciBwdXJwb3NlcyBvZiBjbGFyaXR5IGFueSBuZXcgZmlsZQorICAgICAgaW4gU291cmNlIENvZGUgZm9ybSB0aGF0IGNvbnRhaW5zIGFueSBjb250ZW50cyBvZiB0aGUgUHJvZ3JhbS4gTW9kaWZpZWQKKyAgICAgIFdvcmtzIHNoYWxsIG5vdCBpbmNsdWRlIHdvcmtzIHRoYXQgY29udGFpbiBvbmx5IGRlY2xhcmF0aW9ucywgaW50ZXJmYWNlcywKKyAgICAgIHR5cGVzLCBjbGFzc2VzLCBzdHJ1Y3R1cmVzLCBvciBmaWxlcyBvZiB0aGUgUHJvZ3JhbSBzb2xlbHkgaW4gZWFjaCBjYXNlCisgICAgICBpbiBvcmRlciB0byBsaW5rIHRvLCBiaW5kIGJ5IG5hbWUsIG9yIHN1YmNsYXNzIHRoZSBQcm9ncmFtIG9yIE1vZGlmaWVkCisgICAgICBXb3JrcyB0aGVyZW9mLgorICAgIDwvcD4KKyAgICA8cD4mbGRxdW87RGlzdHJpYnV0ZSZyZHF1bzsgbWVhbnMgdGhlIGFjdHMgb2YgYSkgZGlzdHJpYnV0aW5nIG9yIGIpIG1ha2luZyBhdmFpbGFibGUKKyAgICAgIGluIGFueSBtYW5uZXIgdGhhdCBlbmFibGVzIHRoZSB0cmFuc2ZlciBvZiBhIGNvcHkuCisgICAgPC9wPgorICAgIDxwPiZsZHF1bztTb3VyY2UgQ29kZSZyZHF1bzsgbWVhbnMgdGhlIGZvcm0gb2YgYSBQcm9ncmFtIHByZWZlcnJlZCBmb3IgbWFraW5nCisgICAgICBtb2RpZmljYXRpb25zLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHNvZnR3YXJlIHNvdXJjZSBjb2RlLAorICAgICAgZG9jdW1lbnRhdGlvbiBzb3VyY2UsIGFuZCBjb25maWd1cmF0aW9uIGZpbGVzLgorICAgIDwvcD4KKyAgICA8cD4mbGRxdW87U2Vjb25kYXJ5IExpY2Vuc2UmcmRxdW87IG1lYW5zIGVpdGhlciB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgICAgICBWZXJzaW9uIDIuMCwgb3IgYW55IGxhdGVyIHZlcnNpb25zIG9mIHRoYXQgbGljZW5zZSwgaW5jbHVkaW5nIGFueQorICAgICAgZXhjZXB0aW9ucyBvciBhZGRpdGlvbmFsIHBlcm1pc3Npb25zIGFzIGlkZW50aWZpZWQgYnkgdGhlIGluaXRpYWwKKyAgICAgIENvbnRyaWJ1dG9yLgorICAgIDwvcD4KKyAgICA8aDIgaWQ9ImdyYW50LW9mLXJpZ2h0cyI+Mi4gR1JBTlQgT0YgUklHSFRTPC9oMj4KKyAgICA8dWw+CisgICAgICA8bGk+YSkgU3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhpcyBBZ3JlZW1lbnQsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5CisgICAgICAgIGdyYW50cyBSZWNpcGllbnQgYSBub24tZXhjbHVzaXZlLCB3b3JsZHdpZGUsIHJveWFsdHktZnJlZSBjb3B5cmlnaHQKKyAgICAgICAgbGljZW5zZSB0byByZXByb2R1Y2UsIHByZXBhcmUgRGVyaXZhdGl2ZSBXb3JrcyBvZiwgcHVibGljbHkgZGlzcGxheSwKKyAgICAgICAgcHVibGljbHkgcGVyZm9ybSwgRGlzdHJpYnV0ZSBhbmQgc3VibGljZW5zZSB0aGUgQ29udHJpYnV0aW9uIG9mIHN1Y2gKKyAgICAgICAgQ29udHJpYnV0b3IsIGlmIGFueSwgYW5kIHN1Y2ggRGVyaXZhdGl2ZSBXb3Jrcy4KKyAgICAgIDwvbGk+CisgICAgICA8bGk+YikgU3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhpcyBBZ3JlZW1lbnQsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5CisgICAgICAgIGdyYW50cyBSZWNpcGllbnQgYSBub24tZXhjbHVzaXZlLCB3b3JsZHdpZGUsIHJveWFsdHktZnJlZSBwYXRlbnQKKyAgICAgICAgbGljZW5zZSB1bmRlciBMaWNlbnNlZCBQYXRlbnRzIHRvIG1ha2UsIHVzZSwgc2VsbCwgb2ZmZXIgdG8gc2VsbCwKKyAgICAgICAgaW1wb3J0IGFuZCBvdGhlcndpc2UgdHJhbnNmZXIgdGhlIENvbnRyaWJ1dGlvbiBvZiBzdWNoIENvbnRyaWJ1dG9yLAorICAgICAgICBpZiBhbnksIGluIFNvdXJjZSBDb2RlIG9yIG90aGVyIGZvcm0uIFRoaXMgcGF0ZW50IGxpY2Vuc2Ugc2hhbGwKKyAgICAgICAgYXBwbHkgdG8gdGhlIGNvbWJpbmF0aW9uIG9mIHRoZSBDb250cmlidXRpb24gYW5kIHRoZSBQcm9ncmFtIGlmLAorICAgICAgICBhdCB0aGUgdGltZSB0aGUgQ29udHJpYnV0aW9uIGlzIGFkZGVkIGJ5IHRoZSBDb250cmlidXRvciwgc3VjaAorICAgICAgICBhZGRpdGlvbiBvZiB0aGUgQ29udHJpYnV0aW9uIGNhdXNlcyBzdWNoIGNvbWJpbmF0aW9uIHRvIGJlIGNvdmVyZWQKKyAgICAgICAgYnkgdGhlIExpY2Vuc2VkIFBhdGVudHMuIFRoZSBwYXRlbnQgbGljZW5zZSBzaGFsbCBub3QgYXBwbHkgdG8gYW55CisgICAgICAgIG90aGVyIGNvbWJpbmF0aW9ucyB3aGljaCBpbmNsdWRlIHRoZSBDb250cmlidXRpb24uIE5vIGhhcmR3YXJlIHBlcgorICAgICAgICBzZSBpcyBsaWNlbnNlZCBoZXJldW5kZXIuCisgICAgICA8L2xpPgorICAgICAgPGxpPmMpIFJlY2lwaWVudCB1bmRlcnN0YW5kcyB0aGF0IGFsdGhvdWdoIGVhY2ggQ29udHJpYnV0b3IgZ3JhbnRzIHRoZQorICAgICAgICBsaWNlbnNlcyB0byBpdHMgQ29udHJpYnV0aW9ucyBzZXQgZm9ydGggaGVyZWluLCBubyBhc3N1cmFuY2VzIGFyZQorICAgICAgICBwcm92aWRlZCBieSBhbnkgQ29udHJpYnV0b3IgdGhhdCB0aGUgUHJvZ3JhbSBkb2VzIG5vdCBpbmZyaW5nZSB0aGUKKyAgICAgICAgcGF0ZW50IG9yIG90aGVyIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgb2YgYW55IG90aGVyIGVudGl0eS4KKyAgICAgICAgRWFjaCBDb250cmlidXRvciBkaXNjbGFpbXMgYW55IGxpYWJpbGl0eSB0byBSZWNpcGllbnQgZm9yIGNsYWltcworICAgICAgICBicm91Z2h0IGJ5IGFueSBvdGhlciBlbnRpdHkgYmFzZWQgb24gaW5mcmluZ2VtZW50IG9mIGludGVsbGVjdHVhbAorICAgICAgICBwcm9wZXJ0eSByaWdodHMgb3Igb3RoZXJ3aXNlLiBBcyBhIGNvbmRpdGlvbiB0byBleGVyY2lzaW5nIHRoZSByaWdodHMKKyAgICAgICAgYW5kIGxpY2Vuc2VzIGdyYW50ZWQgaGVyZXVuZGVyLCBlYWNoIFJlY2lwaWVudCBoZXJlYnkgYXNzdW1lcyBzb2xlCisgICAgICAgIHJlc3BvbnNpYmlsaXR5IHRvIHNlY3VyZSBhbnkgb3RoZXIgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBuZWVkZWQsCisgICAgICAgIGlmIGFueS4gRm9yIGV4YW1wbGUsIGlmIGEgdGhpcmQgcGFydHkgcGF0ZW50IGxpY2Vuc2UgaXMgcmVxdWlyZWQgdG8KKyAgICAgICAgYWxsb3cgUmVjaXBpZW50IHRvIERpc3RyaWJ1dGUgdGhlIFByb2dyYW0sIGl0IGlzIFJlY2lwaWVudCYjMDM5O3MKKyAgICAgICAgcmVzcG9uc2liaWxpdHkgdG8gYWNxdWlyZSB0aGF0IGxpY2Vuc2UgYmVmb3JlIGRpc3RyaWJ1dGluZyB0aGUgUHJvZ3JhbS4KKyAgICAgIDwvbGk+CisgICAgICA8bGk+ZCkgRWFjaCBDb250cmlidXRvciByZXByZXNlbnRzIHRoYXQgdG8gaXRzIGtub3dsZWRnZSBpdCBoYXMgc3VmZmljaWVudAorICAgICAgICBjb3B5cmlnaHQgcmlnaHRzIGluIGl0cyBDb250cmlidXRpb24sIGlmIGFueSwgdG8gZ3JhbnQgdGhlIGNvcHlyaWdodAorICAgICAgICBsaWNlbnNlIHNldCBmb3J0aCBpbiB0aGlzIEFncmVlbWVudC4KKyAgICAgIDwvbGk+CisgICAgICA8bGk+ZSkgTm90d2l0aHN0YW5kaW5nIHRoZSB0ZXJtcyBvZiBhbnkgU2Vjb25kYXJ5IExpY2Vuc2UsIG5vIENvbnRyaWJ1dG9yCisgICAgICAgIG1ha2VzIGFkZGl0aW9uYWwgZ3JhbnRzIHRvIGFueSBSZWNpcGllbnQgKG90aGVyIHRoYW4gdGhvc2Ugc2V0IGZvcnRoCisgICAgICAgIGluIHRoaXMgQWdyZWVtZW50KSBhcyBhIHJlc3VsdCBvZiBzdWNoIFJlY2lwaWVudCYjMDM5O3MgcmVjZWlwdCBvZiB0aGUKKyAgICAgICAgUHJvZ3JhbSB1bmRlciB0aGUgdGVybXMgb2YgYSBTZWNvbmRhcnkgTGljZW5zZSAoaWYgcGVybWl0dGVkIHVuZGVyCisgICAgICAgIHRoZSB0ZXJtcyBvZiBTZWN0aW9uIDMpLgorICAgICAgPC9saT4KKyAgICA8L3VsPgorICAgIDxoMiBpZD0icmVxdWlyZW1lbnRzIj4zLiBSRVFVSVJFTUVOVFM8L2gyPgorICAgIDxwPjMuMSBJZiBhIENvbnRyaWJ1dG9yIERpc3RyaWJ1dGVzIHRoZSBQcm9ncmFtIGluIGFueSBmb3JtLCB0aGVuOjwvcD4KKyAgICA8dWw+CisgICAgICA8bGk+YSkgdGhlIFByb2dyYW0gbXVzdCBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIGFzIFNvdXJjZSBDb2RlLCBpbgorICAgICAgICBhY2NvcmRhbmNlIHdpdGggc2VjdGlvbiAzLjIsIGFuZCB0aGUgQ29udHJpYnV0b3IgbXVzdCBhY2NvbXBhbnkKKyAgICAgICAgdGhlIFByb2dyYW0gd2l0aCBhIHN0YXRlbWVudCB0aGF0IHRoZSBTb3VyY2UgQ29kZSBmb3IgdGhlIFByb2dyYW0KKyAgICAgICAgaXMgYXZhaWxhYmxlIHVuZGVyIHRoaXMgQWdyZWVtZW50LCBhbmQgaW5mb3JtcyBSZWNpcGllbnRzIGhvdyB0bworICAgICAgICBvYnRhaW4gaXQgaW4gYSByZWFzb25hYmxlIG1hbm5lciBvbiBvciB0aHJvdWdoIGEgbWVkaXVtIGN1c3RvbWFyaWx5CisgICAgICAgIHVzZWQgZm9yIHNvZnR3YXJlIGV4Y2hhbmdlOyBhbmQKKyAgICAgIDwvbGk+CisgICAgICA8bGk+CisgICAgICAgIGIpIHRoZSBDb250cmlidXRvciBtYXkgRGlzdHJpYnV0ZSB0aGUgUHJvZ3JhbSB1bmRlciBhIGxpY2Vuc2UKKyAgICAgICAgZGlmZmVyZW50IHRoYW4gdGhpcyBBZ3JlZW1lbnQsIHByb3ZpZGVkIHRoYXQgc3VjaCBsaWNlbnNlOgorICAgICAgICA8dWw+CisgICAgICAgICAgPGxpPmkpIGVmZmVjdGl2ZWx5IGRpc2NsYWltcyBvbiBiZWhhbGYgb2YgYWxsIG90aGVyIENvbnRyaWJ1dG9ycyBhbGwKKyAgICAgICAgICAgIHdhcnJhbnRpZXMgYW5kIGNvbmRpdGlvbnMsIGV4cHJlc3MgYW5kIGltcGxpZWQsIGluY2x1ZGluZyB3YXJyYW50aWVzCisgICAgICAgICAgICBvciBjb25kaXRpb25zIG9mIHRpdGxlIGFuZCBub24taW5mcmluZ2VtZW50LCBhbmQgaW1wbGllZCB3YXJyYW50aWVzCisgICAgICAgICAgICBvciBjb25kaXRpb25zIG9mIG1lcmNoYW50YWJpbGl0eSBhbmQgZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2U7CisgICAgICAgICAgPC9saT4KKyAgICAgICAgICA8bGk+aWkpIGVmZmVjdGl2ZWx5IGV4Y2x1ZGVzIG9uIGJlaGFsZiBvZiBhbGwgb3RoZXIgQ29udHJpYnV0b3JzIGFsbAorICAgICAgICAgICAgbGlhYmlsaXR5IGZvciBkYW1hZ2VzLCBpbmNsdWRpbmcgZGlyZWN0LCBpbmRpcmVjdCwgc3BlY2lhbCwgaW5jaWRlbnRhbAorICAgICAgICAgICAgYW5kIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywgc3VjaCBhcyBsb3N0IHByb2ZpdHM7CisgICAgICAgICAgPC9saT4KKyAgICAgICAgICA8bGk+aWlpKSBkb2VzIG5vdCBhdHRlbXB0IHRvIGxpbWl0IG9yIGFsdGVyIHRoZSByZWNpcGllbnRzJiMwMzk7IHJpZ2h0cyBpbiB0aGUKKyAgICAgICAgICAgIFNvdXJjZSBDb2RlIHVuZGVyIHNlY3Rpb24gMy4yOyBhbmQKKyAgICAgICAgICA8L2xpPgorICAgICAgICAgIDxsaT5pdikgcmVxdWlyZXMgYW55IHN1YnNlcXVlbnQgZGlzdHJpYnV0aW9uIG9mIHRoZSBQcm9ncmFtIGJ5IGFueSBwYXJ0eQorICAgICAgICAgICAgdG8gYmUgdW5kZXIgYSBsaWNlbnNlIHRoYXQgc2F0aXNmaWVzIHRoZSByZXF1aXJlbWVudHMgb2YgdGhpcyBzZWN0aW9uIDMuCisgICAgICAgICAgPC9saT4KKyAgICAgICAgPC91bD4KKyAgICAgIDwvbGk+CisgICAgPC91bD4KKyAgICA8cD4zLjIgV2hlbiB0aGUgUHJvZ3JhbSBpcyBEaXN0cmlidXRlZCBhcyBTb3VyY2UgQ29kZTo8L3A+CisgICAgPHVsPgorICAgICAgPGxpPmEpIGl0IG11c3QgYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhpcyBBZ3JlZW1lbnQsIG9yIGlmIHRoZSBQcm9ncmFtIChpKQorICAgICAgICBpcyBjb21iaW5lZCB3aXRoIG90aGVyIG1hdGVyaWFsIGluIGEgc2VwYXJhdGUgZmlsZSBvciBmaWxlcyBtYWRlIGF2YWlsYWJsZQorICAgICAgICB1bmRlciBhIFNlY29uZGFyeSBMaWNlbnNlLCBhbmQgKGlpKSB0aGUgaW5pdGlhbCBDb250cmlidXRvciBhdHRhY2hlZCB0bworICAgICAgICB0aGUgU291cmNlIENvZGUgdGhlIG5vdGljZSBkZXNjcmliZWQgaW4gRXhoaWJpdCBBIG9mIHRoaXMgQWdyZWVtZW50LAorICAgICAgICB0aGVuIHRoZSBQcm9ncmFtIG1heSBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2Ygc3VjaAorICAgICAgICBTZWNvbmRhcnkgTGljZW5zZXMsIGFuZAorICAgICAgPC9saT4KKyAgICAgIDxsaT5iKSBhIGNvcHkgb2YgdGhpcyBBZ3JlZW1lbnQgbXVzdCBiZSBpbmNsdWRlZCB3aXRoIGVhY2ggY29weSBvZiB0aGUgUHJvZ3JhbS48L2xpPgorICAgIDwvdWw+CisgICAgPHA+My4zIENvbnRyaWJ1dG9ycyBtYXkgbm90IHJlbW92ZSBvciBhbHRlciBhbnkgY29weXJpZ2h0LCBwYXRlbnQsIHRyYWRlbWFyaywKKyAgICAgIGF0dHJpYnV0aW9uIG5vdGljZXMsIGRpc2NsYWltZXJzIG9mIHdhcnJhbnR5LCBvciBsaW1pdGF0aW9ucyBvZiBsaWFiaWxpdHkKKyAgICAgICgmbHNxdW87bm90aWNlcyZyc3F1bzspIGNvbnRhaW5lZCB3aXRoaW4gdGhlIFByb2dyYW0gZnJvbSBhbnkgY29weSBvZiB0aGUgUHJvZ3JhbSB3aGljaAorICAgICAgdGhleSBEaXN0cmlidXRlLCBwcm92aWRlZCB0aGF0IENvbnRyaWJ1dG9ycyBtYXkgYWRkIHRoZWlyIG93biBhcHByb3ByaWF0ZQorICAgICAgbm90aWNlcy4KKyAgICA8L3A+CisgICAgPGgyIGlkPSJjb21tZXJjaWFsLWRpc3RyaWJ1dGlvbiI+NC4gQ09NTUVSQ0lBTCBESVNUUklCVVRJT048L2gyPgorICAgIDxwPkNvbW1lcmNpYWwgZGlzdHJpYnV0b3JzIG9mIHNvZnR3YXJlIG1heSBhY2NlcHQgY2VydGFpbiByZXNwb25zaWJpbGl0aWVzCisgICAgICB3aXRoIHJlc3BlY3QgdG8gZW5kIHVzZXJzLCBidXNpbmVzcyBwYXJ0bmVycyBhbmQgdGhlIGxpa2UuIFdoaWxlIHRoaXMKKyAgICAgIGxpY2Vuc2UgaXMgaW50ZW5kZWQgdG8gZmFjaWxpdGF0ZSB0aGUgY29tbWVyY2lhbCB1c2Ugb2YgdGhlIFByb2dyYW0sIHRoZQorICAgICAgQ29udHJpYnV0b3Igd2hvIGluY2x1ZGVzIHRoZSBQcm9ncmFtIGluIGEgY29tbWVyY2lhbCBwcm9kdWN0IG9mZmVyaW5nIHNob3VsZAorICAgICAgZG8gc28gaW4gYSBtYW5uZXIgd2hpY2ggZG9lcyBub3QgY3JlYXRlIHBvdGVudGlhbCBsaWFiaWxpdHkgZm9yIG90aGVyCisgICAgICBDb250cmlidXRvcnMuIFRoZXJlZm9yZSwgaWYgYSBDb250cmlidXRvciBpbmNsdWRlcyB0aGUgUHJvZ3JhbSBpbiBhCisgICAgICBjb21tZXJjaWFsIHByb2R1Y3Qgb2ZmZXJpbmcsIHN1Y2ggQ29udHJpYnV0b3IgKCZsZHF1bztDb21tZXJjaWFsIENvbnRyaWJ1dG9yJnJkcXVvOykKKyAgICAgIGhlcmVieSBhZ3JlZXMgdG8gZGVmZW5kIGFuZCBpbmRlbW5pZnkgZXZlcnkgb3RoZXIgQ29udHJpYnV0b3IKKyAgICAgICgmbGRxdW87SW5kZW1uaWZpZWQgQ29udHJpYnV0b3ImcmRxdW87KSBhZ2FpbnN0IGFueSBsb3NzZXMsIGRhbWFnZXMgYW5kIGNvc3RzCisgICAgICAoY29sbGVjdGl2ZWx5ICZsZHF1bztMb3NzZXMmcmRxdW87KSBhcmlzaW5nIGZyb20gY2xhaW1zLCBsYXdzdWl0cyBhbmQgb3RoZXIgbGVnYWwgYWN0aW9ucworICAgICAgYnJvdWdodCBieSBhIHRoaXJkIHBhcnR5IGFnYWluc3QgdGhlIEluZGVtbmlmaWVkIENvbnRyaWJ1dG9yIHRvIHRoZSBleHRlbnQKKyAgICAgIGNhdXNlZCBieSB0aGUgYWN0cyBvciBvbWlzc2lvbnMgb2Ygc3VjaCBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIGluIGNvbm5lY3Rpb24KKyAgICAgIHdpdGggaXRzIGRpc3RyaWJ1dGlvbiBvZiB0aGUgUHJvZ3JhbSBpbiBhIGNvbW1lcmNpYWwgcHJvZHVjdCBvZmZlcmluZy4KKyAgICAgIFRoZSBvYmxpZ2F0aW9ucyBpbiB0aGlzIHNlY3Rpb24gZG8gbm90IGFwcGx5IHRvIGFueSBjbGFpbXMgb3IgTG9zc2VzIHJlbGF0aW5nCisgICAgICB0byBhbnkgYWN0dWFsIG9yIGFsbGVnZWQgaW50ZWxsZWN0dWFsIHByb3BlcnR5IGluZnJpbmdlbWVudC4gSW4gb3JkZXIgdG8KKyAgICAgIHF1YWxpZnksIGFuIEluZGVtbmlmaWVkIENvbnRyaWJ1dG9yIG11c3Q6IGEpIHByb21wdGx5IG5vdGlmeSB0aGUKKyAgICAgIENvbW1lcmNpYWwgQ29udHJpYnV0b3IgaW4gd3JpdGluZyBvZiBzdWNoIGNsYWltLCBhbmQgYikgYWxsb3cgdGhlIENvbW1lcmNpYWwKKyAgICAgIENvbnRyaWJ1dG9yIHRvIGNvbnRyb2wsIGFuZCBjb29wZXJhdGUgd2l0aCB0aGUgQ29tbWVyY2lhbCBDb250cmlidXRvciBpbiwKKyAgICAgIHRoZSBkZWZlbnNlIGFuZCBhbnkgcmVsYXRlZCBzZXR0bGVtZW50IG5lZ290aWF0aW9ucy4gVGhlIEluZGVtbmlmaWVkCisgICAgICBDb250cmlidXRvciBtYXkgcGFydGljaXBhdGUgaW4gYW55IHN1Y2ggY2xhaW0gYXQgaXRzIG93biBleHBlbnNlLgorICAgIDwvcD4KKyAgICA8cD5Gb3IgZXhhbXBsZSwgYSBDb250cmlidXRvciBtaWdodCBpbmNsdWRlIHRoZSBQcm9ncmFtCisgICAgICBpbiBhIGNvbW1lcmNpYWwgcHJvZHVjdCBvZmZlcmluZywgUHJvZHVjdCBYLiBUaGF0IENvbnRyaWJ1dG9yIGlzIHRoZW4gYQorICAgICAgQ29tbWVyY2lhbCBDb250cmlidXRvci4gSWYgdGhhdCBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIHRoZW4gbWFrZXMgcGVyZm9ybWFuY2UKKyAgICAgIGNsYWltcywgb3Igb2ZmZXJzIHdhcnJhbnRpZXMgcmVsYXRlZCB0byBQcm9kdWN0IFgsIHRob3NlIHBlcmZvcm1hbmNlIGNsYWltcworICAgICAgYW5kIHdhcnJhbnRpZXMgYXJlIHN1Y2ggQ29tbWVyY2lhbCBDb250cmlidXRvciYjMDM5O3MgcmVzcG9uc2liaWxpdHkgYWxvbmUuCisgICAgICBVbmRlciB0aGlzIHNlY3Rpb24sIHRoZSBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIHdvdWxkIGhhdmUgdG8gZGVmZW5kIGNsYWltcworICAgICAgYWdhaW5zdCB0aGUgb3RoZXIgQ29udHJpYnV0b3JzIHJlbGF0ZWQgdG8gdGhvc2UgcGVyZm9ybWFuY2UgY2xhaW1zIGFuZAorICAgICAgd2FycmFudGllcywgYW5kIGlmIGEgY291cnQgcmVxdWlyZXMgYW55IG90aGVyIENvbnRyaWJ1dG9yIHRvIHBheSBhbnkgZGFtYWdlcworICAgICAgYXMgYSByZXN1bHQsIHRoZSBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIG11c3QgcGF5IHRob3NlIGRhbWFnZXMuCisgICAgPC9wPgorICAgIDxoMiBpZD0id2FycmFudHkiPjUuIE5PIFdBUlJBTlRZPC9oMj4KKyAgICA8cD5FWENFUFQgQVMgRVhQUkVTU0xZIFNFVCBGT1JUSCBJTiBUSElTIEFHUkVFTUVOVCwgQU5EIFRPIFRIRSBFWFRFTlQgUEVSTUlUVEVECisgICAgICBCWSBBUFBMSUNBQkxFIExBVywgVEhFIFBST0dSQU0gSVMgUFJPVklERUQgT04gQU4gJmxkcXVvO0FTIElTJnJkcXVvOyBCQVNJUywgV0lUSE9VVAorICAgICAgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBFSVRIRVIgRVhQUkVTUyBPUiBJTVBMSUVEIElOQ0xVRElORywKKyAgICAgIFdJVEhPVVQgTElNSVRBVElPTiwgQU5ZIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBUSVRMRSwgTk9OLUlORlJJTkdFTUVOVCwKKyAgICAgIE1FUkNIQU5UQUJJTElUWSBPUiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gRWFjaCBSZWNpcGllbnQgaXMKKyAgICAgIHNvbGVseSByZXNwb25zaWJsZSBmb3IgZGV0ZXJtaW5pbmcgdGhlIGFwcHJvcHJpYXRlbmVzcyBvZiB1c2luZyBhbmQKKyAgICAgIGRpc3RyaWJ1dGluZyB0aGUgUHJvZ3JhbSBhbmQgYXNzdW1lcyBhbGwgcmlza3MgYXNzb2NpYXRlZCB3aXRoIGl0cworICAgICAgZXhlcmNpc2Ugb2YgcmlnaHRzIHVuZGVyIHRoaXMgQWdyZWVtZW50LCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZQorICAgICAgcmlza3MgYW5kIGNvc3RzIG9mIHByb2dyYW0gZXJyb3JzLCBjb21wbGlhbmNlIHdpdGggYXBwbGljYWJsZSBsYXdzLCBkYW1hZ2UKKyAgICAgIHRvIG9yIGxvc3Mgb2YgZGF0YSwgcHJvZ3JhbXMgb3IgZXF1aXBtZW50LCBhbmQgdW5hdmFpbGFiaWxpdHkgb3IKKyAgICAgIGludGVycnVwdGlvbiBvZiBvcGVyYXRpb25zLgorICAgIDwvcD4KKyAgICA8aDIgaWQ9ImRpc2NsYWltZXIiPjYuIERJU0NMQUlNRVIgT0YgTElBQklMSVRZPC9oMj4KKyAgICA8cD5FWENFUFQgQVMgRVhQUkVTU0xZIFNFVCBGT1JUSCBJTiBUSElTIEFHUkVFTUVOVCwgQU5EIFRPIFRIRSBFWFRFTlQgUEVSTUlUVEVECisgICAgICBCWSBBUFBMSUNBQkxFIExBVywgTkVJVEhFUiBSRUNJUElFTlQgTk9SIEFOWSBDT05UUklCVVRPUlMgU0hBTEwgSEFWRSBBTlkKKyAgICAgIExJQUJJTElUWSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwKKyAgICAgIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HIFdJVEhPVVQgTElNSVRBVElPTiBMT1NUIFBST0ZJVFMpLAorICAgICAgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAgICAgIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKKyAgICAgIE9VVCBPRiBUSEUgVVNFIE9SIERJU1RSSUJVVElPTiBPRiBUSEUgUFJPR1JBTSBPUiBUSEUgRVhFUkNJU0UgT0YgQU5ZIFJJR0hUUworICAgICAgR1JBTlRFRCBIRVJFVU5ERVIsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0VTLgorICAgIDwvcD4KKyAgICA8aDIgaWQ9ImdlbmVyYWwiPjcuIEdFTkVSQUw8L2gyPgorICAgIDxwPklmIGFueSBwcm92aXNpb24gb2YgdGhpcyBBZ3JlZW1lbnQgaXMgaW52YWxpZCBvciB1bmVuZm9yY2VhYmxlIHVuZGVyCisgICAgICBhcHBsaWNhYmxlIGxhdywgaXQgc2hhbGwgbm90IGFmZmVjdCB0aGUgdmFsaWRpdHkgb3IgZW5mb3JjZWFiaWxpdHkgb2YgdGhlCisgICAgICByZW1haW5kZXIgb2YgdGhlIHRlcm1zIG9mIHRoaXMgQWdyZWVtZW50LCBhbmQgd2l0aG91dCBmdXJ0aGVyIGFjdGlvbiBieSB0aGUKKyAgICAgIHBhcnRpZXMgaGVyZXRvLCBzdWNoIHByb3Zpc2lvbiBzaGFsbCBiZSByZWZvcm1lZCB0byB0aGUgbWluaW11bSBleHRlbnQKKyAgICAgIG5lY2Vzc2FyeSB0byBtYWtlIHN1Y2ggcHJvdmlzaW9uIHZhbGlkIGFuZCBlbmZvcmNlYWJsZS4KKyAgICA8L3A+CisgICAgPHA+SWYgUmVjaXBpZW50IGluc3RpdHV0ZXMgcGF0ZW50IGxpdGlnYXRpb24gYWdhaW5zdCBhbnkgZW50aXR5IChpbmNsdWRpbmcgYQorICAgICAgY3Jvc3MtY2xhaW0gb3IgY291bnRlcmNsYWltIGluIGEgbGF3c3VpdCkgYWxsZWdpbmcgdGhhdCB0aGUgUHJvZ3JhbSBpdHNlbGYKKyAgICAgIChleGNsdWRpbmcgY29tYmluYXRpb25zIG9mIHRoZSBQcm9ncmFtIHdpdGggb3RoZXIgc29mdHdhcmUgb3IgaGFyZHdhcmUpCisgICAgICBpbmZyaW5nZXMgc3VjaCBSZWNpcGllbnQmIzAzOTtzIHBhdGVudChzKSwgdGhlbiBzdWNoIFJlY2lwaWVudCYjMDM5O3MgcmlnaHRzIGdyYW50ZWQKKyAgICAgIHVuZGVyIFNlY3Rpb24gMihiKSBzaGFsbCB0ZXJtaW5hdGUgYXMgb2YgdGhlIGRhdGUgc3VjaCBsaXRpZ2F0aW9uIGlzIGZpbGVkLgorICAgIDwvcD4KKyAgICA8cD5BbGwgUmVjaXBpZW50JiMwMzk7cyByaWdodHMgdW5kZXIgdGhpcyBBZ3JlZW1lbnQgc2hhbGwgdGVybWluYXRlIGlmIGl0IGZhaWxzIHRvCisgICAgICBjb21wbHkgd2l0aCBhbnkgb2YgdGhlIG1hdGVyaWFsIHRlcm1zIG9yIGNvbmRpdGlvbnMgb2YgdGhpcyBBZ3JlZW1lbnQgYW5kCisgICAgICBkb2VzIG5vdCBjdXJlIHN1Y2ggZmFpbHVyZSBpbiBhIHJlYXNvbmFibGUgcGVyaW9kIG9mIHRpbWUgYWZ0ZXIgYmVjb21pbmcKKyAgICAgIGF3YXJlIG9mIHN1Y2ggbm9uY29tcGxpYW5jZS4gSWYgYWxsIFJlY2lwaWVudCYjMDM5O3MgcmlnaHRzIHVuZGVyIHRoaXMgQWdyZWVtZW50CisgICAgICB0ZXJtaW5hdGUsIFJlY2lwaWVudCBhZ3JlZXMgdG8gY2Vhc2UgdXNlIGFuZCBkaXN0cmlidXRpb24gb2YgdGhlIFByb2dyYW0KKyAgICAgIGFzIHNvb24gYXMgcmVhc29uYWJseSBwcmFjdGljYWJsZS4gSG93ZXZlciwgUmVjaXBpZW50JiMwMzk7cyBvYmxpZ2F0aW9ucyB1bmRlcgorICAgICAgdGhpcyBBZ3JlZW1lbnQgYW5kIGFueSBsaWNlbnNlcyBncmFudGVkIGJ5IFJlY2lwaWVudCByZWxhdGluZyB0byB0aGUKKyAgICAgIFByb2dyYW0gc2hhbGwgY29udGludWUgYW5kIHN1cnZpdmUuCisgICAgPC9wPgorICAgIDxwPkV2ZXJ5b25lIGlzIHBlcm1pdHRlZCB0byBjb3B5IGFuZCBkaXN0cmlidXRlIGNvcGllcyBvZiB0aGlzIEFncmVlbWVudCwKKyAgICAgIGJ1dCBpbiBvcmRlciB0byBhdm9pZCBpbmNvbnNpc3RlbmN5IHRoZSBBZ3JlZW1lbnQgaXMgY29weXJpZ2h0ZWQgYW5kIG1heQorICAgICAgb25seSBiZSBtb2RpZmllZCBpbiB0aGUgZm9sbG93aW5nIG1hbm5lci4gVGhlIEFncmVlbWVudCBTdGV3YXJkIHJlc2VydmVzCisgICAgICB0aGUgcmlnaHQgdG8gcHVibGlzaCBuZXcgdmVyc2lvbnMgKGluY2x1ZGluZyByZXZpc2lvbnMpIG9mIHRoaXMgQWdyZWVtZW50CisgICAgICBmcm9tIHRpbWUgdG8gdGltZS4gTm8gb25lIG90aGVyIHRoYW4gdGhlIEFncmVlbWVudCBTdGV3YXJkIGhhcyB0aGUgcmlnaHQKKyAgICAgIHRvIG1vZGlmeSB0aGlzIEFncmVlbWVudC4gVGhlIEVjbGlwc2UgRm91bmRhdGlvbiBpcyB0aGUgaW5pdGlhbCBBZ3JlZW1lbnQKKyAgICAgIFN0ZXdhcmQuIFRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWF5IGFzc2lnbiB0aGUgcmVzcG9uc2liaWxpdHkgdG8gc2VydmUgYXMKKyAgICAgIHRoZSBBZ3JlZW1lbnQgU3Rld2FyZCB0byBhIHN1aXRhYmxlIHNlcGFyYXRlIGVudGl0eS4gRWFjaCBuZXcgdmVyc2lvbiBvZgorICAgICAgdGhlIEFncmVlbWVudCB3aWxsIGJlIGdpdmVuIGEgZGlzdGluZ3Vpc2hpbmcgdmVyc2lvbiBudW1iZXIuIFRoZSBQcm9ncmFtCisgICAgICAoaW5jbHVkaW5nIENvbnRyaWJ1dGlvbnMpIG1heSBhbHdheXMgYmUgRGlzdHJpYnV0ZWQgc3ViamVjdCB0byB0aGUgdmVyc2lvbgorICAgICAgb2YgdGhlIEFncmVlbWVudCB1bmRlciB3aGljaCBpdCB3YXMgcmVjZWl2ZWQuIEluIGFkZGl0aW9uLCBhZnRlciBhIG5ldworICAgICAgdmVyc2lvbiBvZiB0aGUgQWdyZWVtZW50IGlzIHB1Ymxpc2hlZCwgQ29udHJpYnV0b3IgbWF5IGVsZWN0IHRvIERpc3RyaWJ1dGUKKyAgICAgIHRoZSBQcm9ncmFtIChpbmNsdWRpbmcgaXRzIENvbnRyaWJ1dGlvbnMpIHVuZGVyIHRoZSBuZXcgdmVyc2lvbi4KKyAgICA8L3A+CisgICAgPHA+RXhjZXB0IGFzIGV4cHJlc3NseSBzdGF0ZWQgaW4gU2VjdGlvbnMgMihhKSBhbmQgMihiKSBhYm92ZSwgUmVjaXBpZW50CisgICAgICByZWNlaXZlcyBubyByaWdodHMgb3IgbGljZW5zZXMgdG8gdGhlIGludGVsbGVjdHVhbCBwcm9wZXJ0eSBvZiBhbnkKKyAgICAgIENvbnRyaWJ1dG9yIHVuZGVyIHRoaXMgQWdyZWVtZW50LCB3aGV0aGVyIGV4cHJlc3NseSwgYnkgaW1wbGljYXRpb24sCisgICAgICBlc3RvcHBlbCBvciBvdGhlcndpc2UuIEFsbCByaWdodHMgaW4gdGhlIFByb2dyYW0gbm90IGV4cHJlc3NseSBncmFudGVkCisgICAgICB1bmRlciB0aGlzIEFncmVlbWVudCBhcmUgcmVzZXJ2ZWQuIE5vdGhpbmcgaW4gdGhpcyBBZ3JlZW1lbnQgaXMgaW50ZW5kZWQKKyAgICAgIHRvIGJlIGVuZm9yY2VhYmxlIGJ5IGFueSBlbnRpdHkgdGhhdCBpcyBub3QgYSBDb250cmlidXRvciBvciBSZWNpcGllbnQuCisgICAgICBObyB0aGlyZC1wYXJ0eSBiZW5lZmljaWFyeSByaWdodHMgYXJlIGNyZWF0ZWQgdW5kZXIgdGhpcyBBZ3JlZW1lbnQuCisgICAgPC9wPgorICAgIDxoMiBpZD0iZXhoaWJpdC1hIj5FeGhpYml0IEEgJm5kYXNoOyBGb3JtIG9mIFNlY29uZGFyeSBMaWNlbnNlcyBOb3RpY2U8L2gyPgorICAgIDxwPiZsZHF1bztUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgCisgICAgCVNlY29uZGFyeSBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggCisgICAgCWluIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlLCB2LiAyLjAgYXJlIHNhdGlzZmllZDoge25hbWUgbGljZW5zZShzKSwKKyAgICAJdmVyc2lvbihzKSwgYW5kIGV4Y2VwdGlvbnMgb3IgYWRkaXRpb25hbCBwZXJtaXNzaW9ucyBoZXJlfS4mcmRxdW87CisgICAgPC9wPgorICAgIDxibG9ja3F1b3RlPgorICAgICAgPHA+U2ltcGx5IGluY2x1ZGluZyBhIGNvcHkgb2YgdGhpcyBBZ3JlZW1lbnQsIGluY2x1ZGluZyB0aGlzIEV4aGliaXQgQQorICAgICAgICBpcyBub3Qgc3VmZmljaWVudCB0byBsaWNlbnNlIHRoZSBTb3VyY2UgQ29kZSB1bmRlciBTZWNvbmRhcnkgTGljZW5zZXMuCisgICAgICA8L3A+CisgICAgICA8cD5JZiBpdCBpcyBub3QgcG9zc2libGUgb3IgZGVzaXJhYmxlIHRvIHB1dCB0aGUgbm90aWNlIGluIGEgcGFydGljdWxhciBmaWxlLAorICAgICAgICB0aGVuIFlvdSBtYXkgaW5jbHVkZSB0aGUgbm90aWNlIGluIGEgbG9jYXRpb24gKHN1Y2ggYXMgYSBMSUNFTlNFIGZpbGUgaW4gYQorICAgICAgICByZWxldmFudCBkaXJlY3RvcnkpIHdoZXJlIGEgcmVjaXBpZW50IHdvdWxkIGJlIGxpa2VseSB0byBsb29rIGZvcgorICAgICAgICBzdWNoIGEgbm90aWNlLgorICAgICAgPC9wPgorICAgICAgPHA+WW91IG1heSBhZGQgYWRkaXRpb25hbCBhY2N1cmF0ZSBub3RpY2VzIG9mIGNvcHlyaWdodCBvd25lcnNoaXAuPC9wPgorICAgIDwvYmxvY2txdW90ZT4KKyAgPC9ib2R5PgorPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLm9zYnAueHRleHQuZGF0YWludGVyY2hhbmdlLnRlc3RzL2VwbC12MTAuaHRtbCBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQuZGF0YWludGVyY2hhbmdlLnRlc3RzL2VwbC12MTAuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjM5OGFjYy4uMDAwMDAwMAotLS0gYS9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmRhdGFpbnRlcmNoYW5nZS50ZXN0cy9lcGwtdjEwLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyNTkgKzAsMCBAQAotPCEtLT94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iSVNPLTg4NTktMSIgPy0tPgotPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiPjxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9SVNPLTg4NTktMSI+Ci08dGl0bGU+RWNsaXBzZSBQdWJsaWMgTGljZW5zZSAtIFZlcnNpb24gMS4wPC90aXRsZT4KLTxzdHlsZSB0eXBlPSJ0ZXh0L2NzcyI+Ci0gIGJvZHkgewotICAgIHNpemU6IDguNWluIDExLjBpbjsKLSAgICBtYXJnaW46IDAuMjVpbiAwLjVpbiAwLjI1aW4gMC41aW47Ci0gICAgdGFiLWludGVydmFsOiAwLjVpbjsKLSAgICB9Ci0gIHAgeyAgCQotICAgIG1hcmdpbi1sZWZ0OiBhdXRvOwotICAgIG1hcmdpbi10b3A6ICAwLjVlbTsKLSAgICBtYXJnaW4tYm90dG9tOiAwLjVlbTsKLSAgICB9Ci0gIHAubGlzdCB7Ci0gIAltYXJnaW4tbGVmdDogMC41aW47Ci0gICAgbWFyZ2luLXRvcDogIDAuMDVlbTsKLSAgICBtYXJnaW4tYm90dG9tOiAwLjA1ZW07Ci0gICAgfQotICA8L3N0eWxlPgotCi08L2hlYWQ+Ci0KLTxib2R5IGxhbmc9IkVOLVVTIj4KLQotPGgyPkVjbGlwc2UgUHVibGljIExpY2Vuc2UgLSB2IDEuMDwvaDI+Ci0KLTxwPlRIRSBBQ0NPTVBBTllJTkcgUFJPR1JBTSBJUyBQUk9WSURFRCBVTkRFUiBUSEUgVEVSTVMgT0YgVEhJUyBFQ0xJUFNFCi1QVUJMSUMgTElDRU5TRSAoIkFHUkVFTUVOVCIpLiBBTlkgVVNFLCBSRVBST0RVQ1RJT04gT1IKLURJU1RSSUJVVElPTiBPRiBUSEUgUFJPR1JBTSBDT05TVElUVVRFUyBSRUNJUElFTlQnUyBBQ0NFUFRBTkNFIE9GIFRISVMKLUFHUkVFTUVOVC48L3A+Ci0KLTxwPjxiPjEuIERFRklOSVRJT05TPC9iPjwvcD4KLQotPHA+IkNvbnRyaWJ1dGlvbiIgbWVhbnM6PC9wPgotCi08cCBjbGFzcz0ibGlzdCI+YSkgaW4gdGhlIGNhc2Ugb2YgdGhlIGluaXRpYWwgQ29udHJpYnV0b3IsIHRoZSBpbml0aWFsCi1jb2RlIGFuZCBkb2N1bWVudGF0aW9uIGRpc3RyaWJ1dGVkIHVuZGVyIHRoaXMgQWdyZWVtZW50LCBhbmQ8L3A+Ci08cCBjbGFzcz0ibGlzdCI+YikgaW4gdGhlIGNhc2Ugb2YgZWFjaCBzdWJzZXF1ZW50IENvbnRyaWJ1dG9yOjwvcD4KLTxwIGNsYXNzPSJsaXN0Ij5pKSBjaGFuZ2VzIHRvIHRoZSBQcm9ncmFtLCBhbmQ8L3A+Ci08cCBjbGFzcz0ibGlzdCI+aWkpIGFkZGl0aW9ucyB0byB0aGUgUHJvZ3JhbTs8L3A+Ci08cCBjbGFzcz0ibGlzdCI+d2hlcmUgc3VjaCBjaGFuZ2VzIGFuZC9vciBhZGRpdGlvbnMgdG8gdGhlIFByb2dyYW0KLW9yaWdpbmF0ZSBmcm9tIGFuZCBhcmUgZGlzdHJpYnV0ZWQgYnkgdGhhdCBwYXJ0aWN1bGFyIENvbnRyaWJ1dG9yLiBBCi1Db250cmlidXRpb24gJ29yaWdpbmF0ZXMnIGZyb20gYSBDb250cmlidXRvciBpZiBpdCB3YXMgYWRkZWQgdG8gdGhlCi1Qcm9ncmFtIGJ5IHN1Y2ggQ29udHJpYnV0b3IgaXRzZWxmIG9yIGFueW9uZSBhY3Rpbmcgb24gc3VjaAotQ29udHJpYnV0b3IncyBiZWhhbGYuIENvbnRyaWJ1dGlvbnMgZG8gbm90IGluY2x1ZGUgYWRkaXRpb25zIHRvIHRoZQotUHJvZ3JhbSB3aGljaDogKGkpIGFyZSBzZXBhcmF0ZSBtb2R1bGVzIG9mIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIGluCi1jb25qdW5jdGlvbiB3aXRoIHRoZSBQcm9ncmFtIHVuZGVyIHRoZWlyIG93biBsaWNlbnNlIGFncmVlbWVudCwgYW5kIChpaSkKLWFyZSBub3QgZGVyaXZhdGl2ZSB3b3JrcyBvZiB0aGUgUHJvZ3JhbS48L3A+Ci0KLTxwPiJDb250cmlidXRvciIgbWVhbnMgYW55IHBlcnNvbiBvciBlbnRpdHkgdGhhdCBkaXN0cmlidXRlcwotdGhlIFByb2dyYW0uPC9wPgotCi08cD4iTGljZW5zZWQgUGF0ZW50cyIgbWVhbiBwYXRlbnQgY2xhaW1zIGxpY2Vuc2FibGUgYnkgYQotQ29udHJpYnV0b3Igd2hpY2ggYXJlIG5lY2Vzc2FyaWx5IGluZnJpbmdlZCBieSB0aGUgdXNlIG9yIHNhbGUgb2YgaXRzCi1Db250cmlidXRpb24gYWxvbmUgb3Igd2hlbiBjb21iaW5lZCB3aXRoIHRoZSBQcm9ncmFtLjwvcD4KLQotPHA+IlByb2dyYW0iIG1lYW5zIHRoZSBDb250cmlidXRpb25zIGRpc3RyaWJ1dGVkIGluIGFjY29yZGFuY2UKLXdpdGggdGhpcyBBZ3JlZW1lbnQuPC9wPgotCi08cD4iUmVjaXBpZW50IiBtZWFucyBhbnlvbmUgd2hvIHJlY2VpdmVzIHRoZSBQcm9ncmFtIHVuZGVyCi10aGlzIEFncmVlbWVudCwgaW5jbHVkaW5nIGFsbCBDb250cmlidXRvcnMuPC9wPgotCi08cD48Yj4yLiBHUkFOVCBPRiBSSUdIVFM8L2I+PC9wPgotCi08cCBjbGFzcz0ibGlzdCI+YSkgU3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhpcyBBZ3JlZW1lbnQsIGVhY2gKLUNvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgUmVjaXBpZW50IGEgbm9uLWV4Y2x1c2l2ZSwgd29ybGR3aWRlLAotcm95YWx0eS1mcmVlIGNvcHlyaWdodCBsaWNlbnNlIHRvIHJlcHJvZHVjZSwgcHJlcGFyZSBkZXJpdmF0aXZlIHdvcmtzCi1vZiwgcHVibGljbHkgZGlzcGxheSwgcHVibGljbHkgcGVyZm9ybSwgZGlzdHJpYnV0ZSBhbmQgc3VibGljZW5zZSB0aGUKLUNvbnRyaWJ1dGlvbiBvZiBzdWNoIENvbnRyaWJ1dG9yLCBpZiBhbnksIGFuZCBzdWNoIGRlcml2YXRpdmUgd29ya3MsIGluCi1zb3VyY2UgY29kZSBhbmQgb2JqZWN0IGNvZGUgZm9ybS48L3A+Ci0KLTxwIGNsYXNzPSJsaXN0Ij5iKSBTdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGlzIEFncmVlbWVudCwgZWFjaAotQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyBSZWNpcGllbnQgYSBub24tZXhjbHVzaXZlLCB3b3JsZHdpZGUsCi1yb3lhbHR5LWZyZWUgcGF0ZW50IGxpY2Vuc2UgdW5kZXIgTGljZW5zZWQgUGF0ZW50cyB0byBtYWtlLCB1c2UsIHNlbGwsCi1vZmZlciB0byBzZWxsLCBpbXBvcnQgYW5kIG90aGVyd2lzZSB0cmFuc2ZlciB0aGUgQ29udHJpYnV0aW9uIG9mIHN1Y2gKLUNvbnRyaWJ1dG9yLCBpZiBhbnksIGluIHNvdXJjZSBjb2RlIGFuZCBvYmplY3QgY29kZSBmb3JtLiBUaGlzIHBhdGVudAotbGljZW5zZSBzaGFsbCBhcHBseSB0byB0aGUgY29tYmluYXRpb24gb2YgdGhlIENvbnRyaWJ1dGlvbiBhbmQgdGhlCi1Qcm9ncmFtIGlmLCBhdCB0aGUgdGltZSB0aGUgQ29udHJpYnV0aW9uIGlzIGFkZGVkIGJ5IHRoZSBDb250cmlidXRvciwKLXN1Y2ggYWRkaXRpb24gb2YgdGhlIENvbnRyaWJ1dGlvbiBjYXVzZXMgc3VjaCBjb21iaW5hdGlvbiB0byBiZSBjb3ZlcmVkCi1ieSB0aGUgTGljZW5zZWQgUGF0ZW50cy4gVGhlIHBhdGVudCBsaWNlbnNlIHNoYWxsIG5vdCBhcHBseSB0byBhbnkgb3RoZXIKLWNvbWJpbmF0aW9ucyB3aGljaCBpbmNsdWRlIHRoZSBDb250cmlidXRpb24uIE5vIGhhcmR3YXJlIHBlciBzZSBpcwotbGljZW5zZWQgaGVyZXVuZGVyLjwvcD4KLQotPHAgY2xhc3M9Imxpc3QiPmMpIFJlY2lwaWVudCB1bmRlcnN0YW5kcyB0aGF0IGFsdGhvdWdoIGVhY2ggQ29udHJpYnV0b3IKLWdyYW50cyB0aGUgbGljZW5zZXMgdG8gaXRzIENvbnRyaWJ1dGlvbnMgc2V0IGZvcnRoIGhlcmVpbiwgbm8gYXNzdXJhbmNlcwotYXJlIHByb3ZpZGVkIGJ5IGFueSBDb250cmlidXRvciB0aGF0IHRoZSBQcm9ncmFtIGRvZXMgbm90IGluZnJpbmdlIHRoZQotcGF0ZW50IG9yIG90aGVyIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgb2YgYW55IG90aGVyIGVudGl0eS4gRWFjaAotQ29udHJpYnV0b3IgZGlzY2xhaW1zIGFueSBsaWFiaWxpdHkgdG8gUmVjaXBpZW50IGZvciBjbGFpbXMgYnJvdWdodCBieQotYW55IG90aGVyIGVudGl0eSBiYXNlZCBvbiBpbmZyaW5nZW1lbnQgb2YgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cwotb3Igb3RoZXJ3aXNlLiBBcyBhIGNvbmRpdGlvbiB0byBleGVyY2lzaW5nIHRoZSByaWdodHMgYW5kIGxpY2Vuc2VzCi1ncmFudGVkIGhlcmV1bmRlciwgZWFjaCBSZWNpcGllbnQgaGVyZWJ5IGFzc3VtZXMgc29sZSByZXNwb25zaWJpbGl0eSB0bwotc2VjdXJlIGFueSBvdGhlciBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIG5lZWRlZCwgaWYgYW55LiBGb3IKLWV4YW1wbGUsIGlmIGEgdGhpcmQgcGFydHkgcGF0ZW50IGxpY2Vuc2UgaXMgcmVxdWlyZWQgdG8gYWxsb3cgUmVjaXBpZW50Ci10byBkaXN0cmlidXRlIHRoZSBQcm9ncmFtLCBpdCBpcyBSZWNpcGllbnQncyByZXNwb25zaWJpbGl0eSB0byBhY3F1aXJlCi10aGF0IGxpY2Vuc2UgYmVmb3JlIGRpc3RyaWJ1dGluZyB0aGUgUHJvZ3JhbS48L3A+Ci0KLTxwIGNsYXNzPSJsaXN0Ij5kKSBFYWNoIENvbnRyaWJ1dG9yIHJlcHJlc2VudHMgdGhhdCB0byBpdHMga25vd2xlZGdlIGl0Ci1oYXMgc3VmZmljaWVudCBjb3B5cmlnaHQgcmlnaHRzIGluIGl0cyBDb250cmlidXRpb24sIGlmIGFueSwgdG8gZ3JhbnQKLXRoZSBjb3B5cmlnaHQgbGljZW5zZSBzZXQgZm9ydGggaW4gdGhpcyBBZ3JlZW1lbnQuPC9wPgotCi08cD48Yj4zLiBSRVFVSVJFTUVOVFM8L2I+PC9wPgotCi08cD5BIENvbnRyaWJ1dG9yIG1heSBjaG9vc2UgdG8gZGlzdHJpYnV0ZSB0aGUgUHJvZ3JhbSBpbiBvYmplY3QgY29kZQotZm9ybSB1bmRlciBpdHMgb3duIGxpY2Vuc2UgYWdyZWVtZW50LCBwcm92aWRlZCB0aGF0OjwvcD4KLQotPHAgY2xhc3M9Imxpc3QiPmEpIGl0IGNvbXBsaWVzIHdpdGggdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoaXMKLUFncmVlbWVudDsgYW5kPC9wPgotCi08cCBjbGFzcz0ibGlzdCI+YikgaXRzIGxpY2Vuc2UgYWdyZWVtZW50OjwvcD4KLQotPHAgY2xhc3M9Imxpc3QiPmkpIGVmZmVjdGl2ZWx5IGRpc2NsYWltcyBvbiBiZWhhbGYgb2YgYWxsIENvbnRyaWJ1dG9ycwotYWxsIHdhcnJhbnRpZXMgYW5kIGNvbmRpdGlvbnMsIGV4cHJlc3MgYW5kIGltcGxpZWQsIGluY2x1ZGluZyB3YXJyYW50aWVzCi1vciBjb25kaXRpb25zIG9mIHRpdGxlIGFuZCBub24taW5mcmluZ2VtZW50LCBhbmQgaW1wbGllZCB3YXJyYW50aWVzIG9yCi1jb25kaXRpb25zIG9mIG1lcmNoYW50YWJpbGl0eSBhbmQgZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2U7PC9wPgotCi08cCBjbGFzcz0ibGlzdCI+aWkpIGVmZmVjdGl2ZWx5IGV4Y2x1ZGVzIG9uIGJlaGFsZiBvZiBhbGwgQ29udHJpYnV0b3JzCi1hbGwgbGlhYmlsaXR5IGZvciBkYW1hZ2VzLCBpbmNsdWRpbmcgZGlyZWN0LCBpbmRpcmVjdCwgc3BlY2lhbCwKLWluY2lkZW50YWwgYW5kIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywgc3VjaCBhcyBsb3N0IHByb2ZpdHM7PC9wPgotCi08cCBjbGFzcz0ibGlzdCI+aWlpKSBzdGF0ZXMgdGhhdCBhbnkgcHJvdmlzaW9ucyB3aGljaCBkaWZmZXIgZnJvbSB0aGlzCi1BZ3JlZW1lbnQgYXJlIG9mZmVyZWQgYnkgdGhhdCBDb250cmlidXRvciBhbG9uZSBhbmQgbm90IGJ5IGFueSBvdGhlcgotcGFydHk7IGFuZDwvcD4KLQotPHAgY2xhc3M9Imxpc3QiPml2KSBzdGF0ZXMgdGhhdCBzb3VyY2UgY29kZSBmb3IgdGhlIFByb2dyYW0gaXMgYXZhaWxhYmxlCi1mcm9tIHN1Y2ggQ29udHJpYnV0b3IsIGFuZCBpbmZvcm1zIGxpY2Vuc2VlcyBob3cgdG8gb2J0YWluIGl0IGluIGEKLXJlYXNvbmFibGUgbWFubmVyIG9uIG9yIHRocm91Z2ggYSBtZWRpdW0gY3VzdG9tYXJpbHkgdXNlZCBmb3Igc29mdHdhcmUKLWV4Y2hhbmdlLjwvcD4KLQotPHA+V2hlbiB0aGUgUHJvZ3JhbSBpcyBtYWRlIGF2YWlsYWJsZSBpbiBzb3VyY2UgY29kZSBmb3JtOjwvcD4KLQotPHAgY2xhc3M9Imxpc3QiPmEpIGl0IG11c3QgYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhpcyBBZ3JlZW1lbnQ7IGFuZDwvcD4KLQotPHAgY2xhc3M9Imxpc3QiPmIpIGEgY29weSBvZiB0aGlzIEFncmVlbWVudCBtdXN0IGJlIGluY2x1ZGVkIHdpdGggZWFjaAotY29weSBvZiB0aGUgUHJvZ3JhbS48L3A+Ci0KLTxwPkNvbnRyaWJ1dG9ycyBtYXkgbm90IHJlbW92ZSBvciBhbHRlciBhbnkgY29weXJpZ2h0IG5vdGljZXMgY29udGFpbmVkCi13aXRoaW4gdGhlIFByb2dyYW0uPC9wPgotCi08cD5FYWNoIENvbnRyaWJ1dG9yIG11c3QgaWRlbnRpZnkgaXRzZWxmIGFzIHRoZSBvcmlnaW5hdG9yIG9mIGl0cwotQ29udHJpYnV0aW9uLCBpZiBhbnksIGluIGEgbWFubmVyIHRoYXQgcmVhc29uYWJseSBhbGxvd3Mgc3Vic2VxdWVudAotUmVjaXBpZW50cyB0byBpZGVudGlmeSB0aGUgb3JpZ2luYXRvciBvZiB0aGUgQ29udHJpYnV0aW9uLjwvcD4KLQotPHA+PGI+NC4gQ09NTUVSQ0lBTCBESVNUUklCVVRJT048L2I+PC9wPgotCi08cD5Db21tZXJjaWFsIGRpc3RyaWJ1dG9ycyBvZiBzb2Z0d2FyZSBtYXkgYWNjZXB0IGNlcnRhaW4KLXJlc3BvbnNpYmlsaXRpZXMgd2l0aCByZXNwZWN0IHRvIGVuZCB1c2VycywgYnVzaW5lc3MgcGFydG5lcnMgYW5kIHRoZQotbGlrZS4gV2hpbGUgdGhpcyBsaWNlbnNlIGlzIGludGVuZGVkIHRvIGZhY2lsaXRhdGUgdGhlIGNvbW1lcmNpYWwgdXNlIG9mCi10aGUgUHJvZ3JhbSwgdGhlIENvbnRyaWJ1dG9yIHdobyBpbmNsdWRlcyB0aGUgUHJvZ3JhbSBpbiBhIGNvbW1lcmNpYWwKLXByb2R1Y3Qgb2ZmZXJpbmcgc2hvdWxkIGRvIHNvIGluIGEgbWFubmVyIHdoaWNoIGRvZXMgbm90IGNyZWF0ZQotcG90ZW50aWFsIGxpYWJpbGl0eSBmb3Igb3RoZXIgQ29udHJpYnV0b3JzLiBUaGVyZWZvcmUsIGlmIGEgQ29udHJpYnV0b3IKLWluY2x1ZGVzIHRoZSBQcm9ncmFtIGluIGEgY29tbWVyY2lhbCBwcm9kdWN0IG9mZmVyaW5nLCBzdWNoIENvbnRyaWJ1dG9yCi0oIkNvbW1lcmNpYWwgQ29udHJpYnV0b3IiKSBoZXJlYnkgYWdyZWVzIHRvIGRlZmVuZCBhbmQKLWluZGVtbmlmeSBldmVyeSBvdGhlciBDb250cmlidXRvciAoIkluZGVtbmlmaWVkIENvbnRyaWJ1dG9yIikKLWFnYWluc3QgYW55IGxvc3NlcywgZGFtYWdlcyBhbmQgY29zdHMgKGNvbGxlY3RpdmVseSAiTG9zc2VzIikKLWFyaXNpbmcgZnJvbSBjbGFpbXMsIGxhd3N1aXRzIGFuZCBvdGhlciBsZWdhbCBhY3Rpb25zIGJyb3VnaHQgYnkgYSB0aGlyZAotcGFydHkgYWdhaW5zdCB0aGUgSW5kZW1uaWZpZWQgQ29udHJpYnV0b3IgdG8gdGhlIGV4dGVudCBjYXVzZWQgYnkgdGhlCi1hY3RzIG9yIG9taXNzaW9ucyBvZiBzdWNoIENvbW1lcmNpYWwgQ29udHJpYnV0b3IgaW4gY29ubmVjdGlvbiB3aXRoIGl0cwotZGlzdHJpYnV0aW9uIG9mIHRoZSBQcm9ncmFtIGluIGEgY29tbWVyY2lhbCBwcm9kdWN0IG9mZmVyaW5nLiBUaGUKLW9ibGlnYXRpb25zIGluIHRoaXMgc2VjdGlvbiBkbyBub3QgYXBwbHkgdG8gYW55IGNsYWltcyBvciBMb3NzZXMKLXJlbGF0aW5nIHRvIGFueSBhY3R1YWwgb3IgYWxsZWdlZCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgaW5mcmluZ2VtZW50LiBJbgotb3JkZXIgdG8gcXVhbGlmeSwgYW4gSW5kZW1uaWZpZWQgQ29udHJpYnV0b3IgbXVzdDogYSkgcHJvbXB0bHkgbm90aWZ5Ci10aGUgQ29tbWVyY2lhbCBDb250cmlidXRvciBpbiB3cml0aW5nIG9mIHN1Y2ggY2xhaW0sIGFuZCBiKSBhbGxvdyB0aGUKLUNvbW1lcmNpYWwgQ29udHJpYnV0b3IgdG8gY29udHJvbCwgYW5kIGNvb3BlcmF0ZSB3aXRoIHRoZSBDb21tZXJjaWFsCi1Db250cmlidXRvciBpbiwgdGhlIGRlZmVuc2UgYW5kIGFueSByZWxhdGVkIHNldHRsZW1lbnQgbmVnb3RpYXRpb25zLiBUaGUKLUluZGVtbmlmaWVkIENvbnRyaWJ1dG9yIG1heSBwYXJ0aWNpcGF0ZSBpbiBhbnkgc3VjaCBjbGFpbSBhdCBpdHMgb3duCi1leHBlbnNlLjwvcD4KLQotPHA+Rm9yIGV4YW1wbGUsIGEgQ29udHJpYnV0b3IgbWlnaHQgaW5jbHVkZSB0aGUgUHJvZ3JhbSBpbiBhIGNvbW1lcmNpYWwKLXByb2R1Y3Qgb2ZmZXJpbmcsIFByb2R1Y3QgWC4gVGhhdCBDb250cmlidXRvciBpcyB0aGVuIGEgQ29tbWVyY2lhbAotQ29udHJpYnV0b3IuIElmIHRoYXQgQ29tbWVyY2lhbCBDb250cmlidXRvciB0aGVuIG1ha2VzIHBlcmZvcm1hbmNlCi1jbGFpbXMsIG9yIG9mZmVycyB3YXJyYW50aWVzIHJlbGF0ZWQgdG8gUHJvZHVjdCBYLCB0aG9zZSBwZXJmb3JtYW5jZQotY2xhaW1zIGFuZCB3YXJyYW50aWVzIGFyZSBzdWNoIENvbW1lcmNpYWwgQ29udHJpYnV0b3IncyByZXNwb25zaWJpbGl0eQotYWxvbmUuIFVuZGVyIHRoaXMgc2VjdGlvbiwgdGhlIENvbW1lcmNpYWwgQ29udHJpYnV0b3Igd291bGQgaGF2ZSB0bwotZGVmZW5kIGNsYWltcyBhZ2FpbnN0IHRoZSBvdGhlciBDb250cmlidXRvcnMgcmVsYXRlZCB0byB0aG9zZQotcGVyZm9ybWFuY2UgY2xhaW1zIGFuZCB3YXJyYW50aWVzLCBhbmQgaWYgYSBjb3VydCByZXF1aXJlcyBhbnkgb3RoZXIKLUNvbnRyaWJ1dG9yIHRvIHBheSBhbnkgZGFtYWdlcyBhcyBhIHJlc3VsdCwgdGhlIENvbW1lcmNpYWwgQ29udHJpYnV0b3IKLW11c3QgcGF5IHRob3NlIGRhbWFnZXMuPC9wPgotCi08cD48Yj41LiBOTyBXQVJSQU5UWTwvYj48L3A+Ci0KLTxwPkVYQ0VQVCBBUyBFWFBSRVNTTFkgU0VUIEZPUlRIIElOIFRISVMgQUdSRUVNRU5ULCBUSEUgUFJPR1JBTSBJUwotUFJPVklERUQgT04gQU4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMKLU9GIEFOWSBLSU5ELCBFSVRIRVIgRVhQUkVTUyBPUiBJTVBMSUVEIElOQ0xVRElORywgV0lUSE9VVCBMSU1JVEFUSU9OLAotQU5ZIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBUSVRMRSwgTk9OLUlORlJJTkdFTUVOVCwgTUVSQ0hBTlRBQklMSVRZCi1PUiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gRWFjaCBSZWNpcGllbnQgaXMgc29sZWx5Ci1yZXNwb25zaWJsZSBmb3IgZGV0ZXJtaW5pbmcgdGhlIGFwcHJvcHJpYXRlbmVzcyBvZiB1c2luZyBhbmQKLWRpc3RyaWJ1dGluZyB0aGUgUHJvZ3JhbSBhbmQgYXNzdW1lcyBhbGwgcmlza3MgYXNzb2NpYXRlZCB3aXRoIGl0cwotZXhlcmNpc2Ugb2YgcmlnaHRzIHVuZGVyIHRoaXMgQWdyZWVtZW50ICwgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0bwotdGhlIHJpc2tzIGFuZCBjb3N0cyBvZiBwcm9ncmFtIGVycm9ycywgY29tcGxpYW5jZSB3aXRoIGFwcGxpY2FibGUgbGF3cywKLWRhbWFnZSB0byBvciBsb3NzIG9mIGRhdGEsIHByb2dyYW1zIG9yIGVxdWlwbWVudCwgYW5kIHVuYXZhaWxhYmlsaXR5IG9yCi1pbnRlcnJ1cHRpb24gb2Ygb3BlcmF0aW9ucy48L3A+Ci0KLTxwPjxiPjYuIERJU0NMQUlNRVIgT0YgTElBQklMSVRZPC9iPjwvcD4KLQotPHA+RVhDRVBUIEFTIEVYUFJFU1NMWSBTRVQgRk9SVEggSU4gVEhJUyBBR1JFRU1FTlQsIE5FSVRIRVIgUkVDSVBJRU5UCi1OT1IgQU5ZIENPTlRSSUJVVE9SUyBTSEFMTCBIQVZFIEFOWSBMSUFCSUxJVFkgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAotSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORwotV0lUSE9VVCBMSU1JVEFUSU9OIExPU1QgUFJPRklUUyksIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GCi1MSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORwotTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPUgotRElTVFJJQlVUSU9OIE9GIFRIRSBQUk9HUkFNIE9SIFRIRSBFWEVSQ0lTRSBPRiBBTlkgUklHSFRTIEdSQU5URUQKLUhFUkVVTkRFUiwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRVMuPC9wPgotCi08cD48Yj43LiBHRU5FUkFMPC9iPjwvcD4KLQotPHA+SWYgYW55IHByb3Zpc2lvbiBvZiB0aGlzIEFncmVlbWVudCBpcyBpbnZhbGlkIG9yIHVuZW5mb3JjZWFibGUgdW5kZXIKLWFwcGxpY2FibGUgbGF3LCBpdCBzaGFsbCBub3QgYWZmZWN0IHRoZSB2YWxpZGl0eSBvciBlbmZvcmNlYWJpbGl0eSBvZgotdGhlIHJlbWFpbmRlciBvZiB0aGUgdGVybXMgb2YgdGhpcyBBZ3JlZW1lbnQsIGFuZCB3aXRob3V0IGZ1cnRoZXIgYWN0aW9uCi1ieSB0aGUgcGFydGllcyBoZXJldG8sIHN1Y2ggcHJvdmlzaW9uIHNoYWxsIGJlIHJlZm9ybWVkIHRvIHRoZSBtaW5pbXVtCi1leHRlbnQgbmVjZXNzYXJ5IHRvIG1ha2Ugc3VjaCBwcm92aXNpb24gdmFsaWQgYW5kIGVuZm9yY2VhYmxlLjwvcD4KLQotPHA+SWYgUmVjaXBpZW50IGluc3RpdHV0ZXMgcGF0ZW50IGxpdGlnYXRpb24gYWdhaW5zdCBhbnkgZW50aXR5Ci0oaW5jbHVkaW5nIGEgY3Jvc3MtY2xhaW0gb3IgY291bnRlcmNsYWltIGluIGEgbGF3c3VpdCkgYWxsZWdpbmcgdGhhdCB0aGUKLVByb2dyYW0gaXRzZWxmIChleGNsdWRpbmcgY29tYmluYXRpb25zIG9mIHRoZSBQcm9ncmFtIHdpdGggb3RoZXIKLXNvZnR3YXJlIG9yIGhhcmR3YXJlKSBpbmZyaW5nZXMgc3VjaCBSZWNpcGllbnQncyBwYXRlbnQocyksIHRoZW4gc3VjaAotUmVjaXBpZW50J3MgcmlnaHRzIGdyYW50ZWQgdW5kZXIgU2VjdGlvbiAyKGIpIHNoYWxsIHRlcm1pbmF0ZSBhcyBvZiB0aGUKLWRhdGUgc3VjaCBsaXRpZ2F0aW9uIGlzIGZpbGVkLjwvcD4KLQotPHA+QWxsIFJlY2lwaWVudCdzIHJpZ2h0cyB1bmRlciB0aGlzIEFncmVlbWVudCBzaGFsbCB0ZXJtaW5hdGUgaWYgaXQKLWZhaWxzIHRvIGNvbXBseSB3aXRoIGFueSBvZiB0aGUgbWF0ZXJpYWwgdGVybXMgb3IgY29uZGl0aW9ucyBvZiB0aGlzCi1BZ3JlZW1lbnQgYW5kIGRvZXMgbm90IGN1cmUgc3VjaCBmYWlsdXJlIGluIGEgcmVhc29uYWJsZSBwZXJpb2Qgb2YgdGltZQotYWZ0ZXIgYmVjb21pbmcgYXdhcmUgb2Ygc3VjaCBub25jb21wbGlhbmNlLiBJZiBhbGwgUmVjaXBpZW50J3MgcmlnaHRzCi11bmRlciB0aGlzIEFncmVlbWVudCB0ZXJtaW5hdGUsIFJlY2lwaWVudCBhZ3JlZXMgdG8gY2Vhc2UgdXNlIGFuZAotZGlzdHJpYnV0aW9uIG9mIHRoZSBQcm9ncmFtIGFzIHNvb24gYXMgcmVhc29uYWJseSBwcmFjdGljYWJsZS4gSG93ZXZlciwKLVJlY2lwaWVudCdzIG9ibGlnYXRpb25zIHVuZGVyIHRoaXMgQWdyZWVtZW50IGFuZCBhbnkgbGljZW5zZXMgZ3JhbnRlZCBieQotUmVjaXBpZW50IHJlbGF0aW5nIHRvIHRoZSBQcm9ncmFtIHNoYWxsIGNvbnRpbnVlIGFuZCBzdXJ2aXZlLjwvcD4KLQotPHA+RXZlcnlvbmUgaXMgcGVybWl0dGVkIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUgY29waWVzIG9mIHRoaXMKLUFncmVlbWVudCwgYnV0IGluIG9yZGVyIHRvIGF2b2lkIGluY29uc2lzdGVuY3kgdGhlIEFncmVlbWVudCBpcwotY29weXJpZ2h0ZWQgYW5kIG1heSBvbmx5IGJlIG1vZGlmaWVkIGluIHRoZSBmb2xsb3dpbmcgbWFubmVyLiBUaGUKLUFncmVlbWVudCBTdGV3YXJkIHJlc2VydmVzIHRoZSByaWdodCB0byBwdWJsaXNoIG5ldyB2ZXJzaW9ucyAoaW5jbHVkaW5nCi1yZXZpc2lvbnMpIG9mIHRoaXMgQWdyZWVtZW50IGZyb20gdGltZSB0byB0aW1lLiBObyBvbmUgb3RoZXIgdGhhbiB0aGUKLUFncmVlbWVudCBTdGV3YXJkIGhhcyB0aGUgcmlnaHQgdG8gbW9kaWZ5IHRoaXMgQWdyZWVtZW50LiBUaGUgRWNsaXBzZQotRm91bmRhdGlvbiBpcyB0aGUgaW5pdGlhbCBBZ3JlZW1lbnQgU3Rld2FyZC4gVGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYXkKLWFzc2lnbiB0aGUgcmVzcG9uc2liaWxpdHkgdG8gc2VydmUgYXMgdGhlIEFncmVlbWVudCBTdGV3YXJkIHRvIGEKLXN1aXRhYmxlIHNlcGFyYXRlIGVudGl0eS4gRWFjaCBuZXcgdmVyc2lvbiBvZiB0aGUgQWdyZWVtZW50IHdpbGwgYmUKLWdpdmVuIGEgZGlzdGluZ3Vpc2hpbmcgdmVyc2lvbiBudW1iZXIuIFRoZSBQcm9ncmFtIChpbmNsdWRpbmcKLUNvbnRyaWJ1dGlvbnMpIG1heSBhbHdheXMgYmUgZGlzdHJpYnV0ZWQgc3ViamVjdCB0byB0aGUgdmVyc2lvbiBvZiB0aGUKLUFncmVlbWVudCB1bmRlciB3aGljaCBpdCB3YXMgcmVjZWl2ZWQuIEluIGFkZGl0aW9uLCBhZnRlciBhIG5ldyB2ZXJzaW9uCi1vZiB0aGUgQWdyZWVtZW50IGlzIHB1Ymxpc2hlZCwgQ29udHJpYnV0b3IgbWF5IGVsZWN0IHRvIGRpc3RyaWJ1dGUgdGhlCi1Qcm9ncmFtIChpbmNsdWRpbmcgaXRzIENvbnRyaWJ1dGlvbnMpIHVuZGVyIHRoZSBuZXcgdmVyc2lvbi4gRXhjZXB0IGFzCi1leHByZXNzbHkgc3RhdGVkIGluIFNlY3Rpb25zIDIoYSkgYW5kIDIoYikgYWJvdmUsIFJlY2lwaWVudCByZWNlaXZlcyBubwotcmlnaHRzIG9yIGxpY2Vuc2VzIHRvIHRoZSBpbnRlbGxlY3R1YWwgcHJvcGVydHkgb2YgYW55IENvbnRyaWJ1dG9yIHVuZGVyCi10aGlzIEFncmVlbWVudCwgd2hldGhlciBleHByZXNzbHksIGJ5IGltcGxpY2F0aW9uLCBlc3RvcHBlbCBvcgotb3RoZXJ3aXNlLiBBbGwgcmlnaHRzIGluIHRoZSBQcm9ncmFtIG5vdCBleHByZXNzbHkgZ3JhbnRlZCB1bmRlciB0aGlzCi1BZ3JlZW1lbnQgYXJlIHJlc2VydmVkLjwvcD4KLQotPHA+VGhpcyBBZ3JlZW1lbnQgaXMgZ292ZXJuZWQgYnkgdGhlIGxhd3Mgb2YgdGhlIFN0YXRlIG9mIE5ldyBZb3JrIGFuZAotdGhlIGludGVsbGVjdHVhbCBwcm9wZXJ0eSBsYXdzIG9mIHRoZSBVbml0ZWQgU3RhdGVzIG9mIEFtZXJpY2EuIE5vIHBhcnR5Ci10byB0aGlzIEFncmVlbWVudCB3aWxsIGJyaW5nIGEgbGVnYWwgYWN0aW9uIHVuZGVyIHRoaXMgQWdyZWVtZW50IG1vcmUKLXRoYW4gb25lIHllYXIgYWZ0ZXIgdGhlIGNhdXNlIG9mIGFjdGlvbiBhcm9zZS4gRWFjaCBwYXJ0eSB3YWl2ZXMgaXRzCi1yaWdodHMgdG8gYSBqdXJ5IHRyaWFsIGluIGFueSByZXN1bHRpbmcgbGl0aWdhdGlvbi48L3A+Ci0KLQotCi08L2JvZHk+PC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLm9zYnAueHRleHQuZGF0YWludGVyY2hhbmdlLnRlc3RzL2xpY2Vuc2UuaHRtbCBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQuZGF0YWludGVyY2hhbmdlLnRlc3RzL2xpY2Vuc2UuaHRtbAppbmRleCA2ZTU3OWE1Li4wMDhiODAxIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmRhdGFpbnRlcmNoYW5nZS50ZXN0cy9saWNlbnNlLmh0bWwKKysrIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5kYXRhaW50ZXJjaGFuZ2UudGVzdHMvbGljZW5zZS5odG1sCkBAIC0xLDE2NCArMSwxODkgQEAKLTwhLS0/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IklTTy04ODU5LTEiID8tLT4KKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IklTTy04ODU5LTEiID8+CiA8IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBTdHJpY3QvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtc3RyaWN0LmR0ZCI+Ci08aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCI+PGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1JU08tODg1OS0xIj4KKzxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIj4KKzxoZWFkPgorPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9SVNPLTg4NTktMSIgLz4KIDx0aXRsZT5FY2xpcHNlIEZvdW5kYXRpb24gU29mdHdhcmUgVXNlciBBZ3JlZW1lbnQ8L3RpdGxlPgogPC9oZWFkPgogCiA8Ym9keSBsYW5nPSJFTi1VUyI+Ci08aDI+RWNsaXBzZSBGb3VuZGF0aW9uIFNvZnR3YXJlIFVzZXIgQWdyZWVtZW50PC9oMj4KLTxwPkZlYnJ1YXJ5IDEsIDIwMTE8L3A+CisJPGgyPkVjbGlwc2UgRm91bmRhdGlvbiBTb2Z0d2FyZSBVc2VyIEFncmVlbWVudDwvaDI+CisJPHA+Tm92ZW1iZXIgMjIsIDIwMTc8L3A+CiAKLTxoMz5Vc2FnZSBPZiBDb250ZW50PC9oMz4KKwk8aDM+VXNhZ2UgT2YgQ29udGVudDwvaDM+CiAKLTxwPlRIRSBFQ0xJUFNFIEZPVU5EQVRJT04gTUFLRVMgQVZBSUxBQkxFIFNPRlRXQVJFLCBET0NVTUVOVEFUSU9OLCBJTkZPUk1BVElPTiBBTkQvT1IgT1RIRVIgTUFURVJJQUxTIEZPUiBPUEVOIFNPVVJDRSBQUk9KRUNUUwotICAgKENPTExFQ1RJVkVMWSAiQ09OVEVOVCIpLiAgVVNFIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTIEFHUkVFTUVOVCBBTkQvT1IgVEhFIFRFUk1TIEFORAotICAgQ09ORElUSU9OUyBPRiBMSUNFTlNFIEFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gIEJZIFVTSU5HIFRIRSBDT05URU5ULCBZT1UgQUdSRUUgVEhBVCBZT1VSIFVTRQotICAgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhJUyBBR1JFRU1FTlQgQU5EL09SIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFMgT1IKLSAgIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuICBJRiBZT1UgRE8gTk9UIEFHUkVFIFRPIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTIEFHUkVFTUVOVCBBTkQgVEhFIFRFUk1TIEFORAotICAgQ09ORElUSU9OUyBPRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVywgVEhFTiBZT1UgTUFZIE5PVCBVU0UgVEhFIENPTlRFTlQuPC9wPgorCTxwPlRIRSBFQ0xJUFNFIEZPVU5EQVRJT04gTUFLRVMgQVZBSUxBQkxFIFNPRlRXQVJFLCBET0NVTUVOVEFUSU9OLAorCQlJTkZPUk1BVElPTiBBTkQvT1IgT1RIRVIgTUFURVJJQUxTIEZPUiBPUEVOIFNPVVJDRSBQUk9KRUNUUworCQkoQ09MTEVDVElWRUxZICZxdW90O0NPTlRFTlQmcXVvdDspLiBVU0UgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkKKwkJVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVMgQUdSRUVNRU5UIEFORC9PUiBUSEUgVEVSTVMgQU5ECisJCUNPTkRJVElPTlMgT0YgTElDRU5TRSBBR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQKKwkJQkVMT1cuIEJZIFVTSU5HIFRIRSBDT05URU5ULCBZT1UgQUdSRUUgVEhBVCBZT1VSIFVTRSBPRiBUSEUgQ09OVEVOVCBJUworCQlHT1ZFUk5FRCBCWSBUSElTIEFHUkVFTUVOVCBBTkQvT1IgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIEFOWQorCQlBUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VECisJCUJFTE9XLiBJRiBZT1UgRE8gTk9UIEFHUkVFIFRPIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTCisJCUFHUkVFTUVOVCBBTkQgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UKKwkJQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLCBUSEVOIFlPVSBNQVkgTk9UCisJCVVTRSBUSEUgQ09OVEVOVC48L3A+CiAKLTxoMz5BcHBsaWNhYmxlIExpY2Vuc2VzPC9oMz4KKwk8aDM+QXBwbGljYWJsZSBMaWNlbnNlczwvaDM+CiAKLTxwPlVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkLCBhbGwgQ29udGVudCBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZQotIEZvdW5kYXRpb24gaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgCi1FY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wCi0gICAoIkVQTCIpLiAgQSBjb3B5IG9mIHRoZSBFUEwgaXMgcHJvdmlkZWQgd2l0aCB0aGlzIENvbnRlbnQgYW5kIGlzIGFsc28KLSBhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sPC9hPi4KLSAgIEZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAiUHJvZ3JhbSIgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvcD4KKwk8cD4KKwkJVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQsIGFsbCBDb250ZW50IG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlCisJCUZvdW5kYXRpb24gaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUKKwkJRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIuMCAoJnF1b3Q7RVBMJnF1b3Q7KS4gQSBjb3B5IG9mIHRoZQorCQlFUEwgaXMgcHJvdmlkZWQgd2l0aCB0aGlzIENvbnRlbnQgYW5kIGlzIGFsc28gYXZhaWxhYmxlIGF0IDxhCisJCQlocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMDwvYT4uCisJCUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAmcXVvdDtQcm9ncmFtJnF1b3Q7IHdpbGwgbWVhbiB0aGUgQ29udGVudC4KKwk8L3A+CiAKLTxwPkNvbnRlbnQgaW5jbHVkZXMsIGJ1dCBpcyBub3QgbGltaXRlZCB0bywgc291cmNlIGNvZGUsIG9iamVjdCBjb2RlLCAKLWRvY3VtZW50YXRpb24gYW5kIG90aGVyIGZpbGVzIG1haW50YWluZWQgaW4gdGhlIEVjbGlwc2UgRm91bmRhdGlvbiAKLXNvdXJjZSBjb2RlCi0gICByZXBvc2l0b3J5ICgiUmVwb3NpdG9yeSIpIGluIHNvZnR3YXJlIG1vZHVsZXMgKCJNb2R1bGVzIikgYW5kIG1hZGUgCi1hdmFpbGFibGUgYXMgZG93bmxvYWRhYmxlIGFyY2hpdmVzICgiRG93bmxvYWRzIikuPC9wPgorCTxwPkNvbnRlbnQgaW5jbHVkZXMsIGJ1dCBpcyBub3QgbGltaXRlZCB0bywgc291cmNlIGNvZGUsIG9iamVjdAorCQljb2RlLCBkb2N1bWVudGF0aW9uIGFuZCBvdGhlciBmaWxlcyBtYWludGFpbmVkIGluIHRoZSBFY2xpcHNlCisJCUZvdW5kYXRpb24gc291cmNlIGNvZGUgcmVwb3NpdG9yeSAoJnF1b3Q7UmVwb3NpdG9yeSZxdW90OykgaW4gc29mdHdhcmUKKwkJbW9kdWxlcyAoJnF1b3Q7TW9kdWxlcyZxdW90OykgYW5kIG1hZGUgYXZhaWxhYmxlIGFzIGRvd25sb2FkYWJsZQorCQlhcmNoaXZlcyAoJnF1b3Q7RG93bmxvYWRzJnF1b3Q7KS48L3A+CiAKLTx1bD4KLSAgICAgICA8bGk+Q29udGVudCBtYXkgYmUgc3RydWN0dXJlZCBhbmQgcGFja2FnZWQgaW50byBtb2R1bGVzIHRvIAotZmFjaWxpdGF0ZSBkZWxpdmVyaW5nLCBleHRlbmRpbmcsIGFuZCB1cGdyYWRpbmcgdGhlIENvbnRlbnQuICBUeXBpY2FsIAotbW9kdWxlcyBtYXkgaW5jbHVkZSBwbHVnLWlucyAoIlBsdWctaW5zIiksIHBsdWctaW4gZnJhZ21lbnRzIAotKCJGcmFnbWVudHMiKSwgYW5kIGZlYXR1cmVzICgiRmVhdHVyZXMiKS48L2xpPgotICAgICAgIDxsaT5FYWNoIFBsdWctaW4gb3IgRnJhZ21lbnQgbWF5IGJlIHBhY2thZ2VkIGFzIGEgc3ViLWRpcmVjdG9yeSBvciBKQVIgKEphdmEmIzg0ODI7IEFSY2hpdmUpIGluIGEgZGlyZWN0b3J5IG5hbWVkICJwbHVnaW5zIi48L2xpPgotICAgICAgIDxsaT5BIEZlYXR1cmUgaXMgYSBidW5kbGUgb2Ygb25lIG9yIG1vcmUgUGx1Zy1pbnMgYW5kL29yIAotRnJhZ21lbnRzIGFuZCBhc3NvY2lhdGVkIG1hdGVyaWFsLiAgRWFjaCBGZWF0dXJlIG1heSBiZSBwYWNrYWdlZCBhcyBhIAotc3ViLWRpcmVjdG9yeSBpbiBhIGRpcmVjdG9yeSBuYW1lZCAiZmVhdHVyZXMiLiAgV2l0aGluIGEgRmVhdHVyZSwgZmlsZXMgCi1uYW1lZCAiZmVhdHVyZS54bWwiIG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyAKLW9mIHRoZSBQbHVnLWlucwotICAgICAgYW5kL29yIEZyYWdtZW50cyBhc3NvY2lhdGVkIHdpdGggdGhhdCBGZWF0dXJlLjwvbGk+Ci0gICAgICAgPGxpPkZlYXR1cmVzIG1heSBhbHNvIGluY2x1ZGUgb3RoZXIgRmVhdHVyZXMgKCJJbmNsdWRlZCAKLUZlYXR1cmVzIikuIFdpdGhpbiBhIEZlYXR1cmUsIGZpbGVzIG5hbWVkICJmZWF0dXJlLnhtbCIgbWF5IGNvbnRhaW4gYSAKLWxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2YgSW5jbHVkZWQgRmVhdHVyZXMuPC9saT4KLTwvdWw+CisJPHVsPgorCQk8bGk+Q29udGVudCBtYXkgYmUgc3RydWN0dXJlZCBhbmQgcGFja2FnZWQgaW50byBtb2R1bGVzIHRvCisJCQlmYWNpbGl0YXRlIGRlbGl2ZXJpbmcsIGV4dGVuZGluZywgYW5kIHVwZ3JhZGluZyB0aGUgQ29udGVudC4gVHlwaWNhbAorCQkJbW9kdWxlcyBtYXkgaW5jbHVkZSBwbHVnLWlucyAoJnF1b3Q7UGx1Zy1pbnMmcXVvdDspLCBwbHVnLWluCisJCQlmcmFnbWVudHMgKCZxdW90O0ZyYWdtZW50cyZxdW90OyksIGFuZCBmZWF0dXJlcworCQkJKCZxdW90O0ZlYXR1cmVzJnF1b3Q7KS48L2xpPgorCQk8bGk+RWFjaCBQbHVnLWluIG9yIEZyYWdtZW50IG1heSBiZSBwYWNrYWdlZCBhcyBhIHN1Yi1kaXJlY3RvcnkKKwkJCW9yIEpBUiAoSmF2YSZ0cmFkZTsgQVJjaGl2ZSkgaW4gYSBkaXJlY3RvcnkgbmFtZWQKKwkJCSZxdW90O3BsdWdpbnMmcXVvdDsuPC9saT4KKwkJPGxpPkEgRmVhdHVyZSBpcyBhIGJ1bmRsZSBvZiBvbmUgb3IgbW9yZSBQbHVnLWlucyBhbmQvb3IKKwkJCUZyYWdtZW50cyBhbmQgYXNzb2NpYXRlZCBtYXRlcmlhbC4gRWFjaCBGZWF0dXJlIG1heSBiZSBwYWNrYWdlZCBhcyBhCisJCQlzdWItZGlyZWN0b3J5IGluIGEgZGlyZWN0b3J5IG5hbWVkICZxdW90O2ZlYXR1cmVzJnF1b3Q7LiBXaXRoaW4gYQorCQkJRmVhdHVyZSwgZmlsZXMgbmFtZWQgJnF1b3Q7ZmVhdHVyZS54bWwmcXVvdDsgbWF5IGNvbnRhaW4gYSBsaXN0IG9mCisJCQl0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZiB0aGUgUGx1Zy1pbnMgYW5kL29yIEZyYWdtZW50cworCQkJYXNzb2NpYXRlZCB3aXRoIHRoYXQgRmVhdHVyZS48L2xpPgorCQk8bGk+RmVhdHVyZXMgbWF5IGFsc28gaW5jbHVkZSBvdGhlciBGZWF0dXJlcyAoJnF1b3Q7SW5jbHVkZWQKKwkJCUZlYXR1cmVzJnF1b3Q7KS4gV2l0aGluIGEgRmVhdHVyZSwgZmlsZXMgbmFtZWQKKwkJCSZxdW90O2ZlYXR1cmUueG1sJnF1b3Q7IG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24KKwkJCW51bWJlcnMgb2YgSW5jbHVkZWQgRmVhdHVyZXMuPC9saT4KKwk8L3VsPgogCi08cD5UaGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgc2hvdWxkIGJlIAotY29udGFpbmVkIGluIGZpbGVzIG5hbWVkICJhYm91dC5odG1sIiAoIkFib3V0cyIpLiBUaGUgdGVybXMgYW5kIAotY29uZGl0aW9ucyBnb3Zlcm5pbmcgRmVhdHVyZXMgYW5kCi1JbmNsdWRlZCBGZWF0dXJlcyBzaG91bGQgYmUgY29udGFpbmVkIGluIGZpbGVzIG5hbWVkICJsaWNlbnNlLmh0bWwiIAotKCJGZWF0dXJlIExpY2Vuc2VzIikuICBBYm91dHMgYW5kIEZlYXR1cmUgTGljZW5zZXMgbWF5IGJlIGxvY2F0ZWQgaW4gYW55Ci0gZGlyZWN0b3J5IG9mIGEgRG93bmxvYWQgb3IgTW9kdWxlCi1pbmNsdWRpbmcsIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgZm9sbG93aW5nIGxvY2F0aW9uczo8L3A+CisJPHA+VGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHNob3VsZAorCQliZSBjb250YWluZWQgaW4gZmlsZXMgbmFtZWQgJnF1b3Q7YWJvdXQuaHRtbCZxdW90OworCQkoJnF1b3Q7QWJvdXRzJnF1b3Q7KS4gVGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyBGZWF0dXJlcyBhbmQKKwkJSW5jbHVkZWQgRmVhdHVyZXMgc2hvdWxkIGJlIGNvbnRhaW5lZCBpbiBmaWxlcyBuYW1lZAorCQkmcXVvdDtsaWNlbnNlLmh0bWwmcXVvdDsgKCZxdW90O0ZlYXR1cmUgTGljZW5zZXMmcXVvdDspLiBBYm91dHMgYW5kCisJCUZlYXR1cmUgTGljZW5zZXMgbWF5IGJlIGxvY2F0ZWQgaW4gYW55IGRpcmVjdG9yeSBvZiBhIERvd25sb2FkIG9yCisJCU1vZHVsZSBpbmNsdWRpbmcsIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgZm9sbG93aW5nIGxvY2F0aW9uczo8L3A+CiAKLTx1bD4KLSAgICAgICA8bGk+VGhlIHRvcC1sZXZlbCAocm9vdCkgZGlyZWN0b3J5PC9saT4KLSAgICAgICA8bGk+UGx1Zy1pbiBhbmQgRnJhZ21lbnQgZGlyZWN0b3JpZXM8L2xpPgotICAgICAgIDxsaT5JbnNpZGUgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBwYWNrYWdlZCBhcyBKQVJzPC9saT4KLSAgICAgICA8bGk+U3ViLWRpcmVjdG9yaWVzIG9mIHRoZSBkaXJlY3RvcnkgbmFtZWQgInNyYyIgb2YgY2VydGFpbiBQbHVnLWluczwvbGk+Ci0gICAgICAgPGxpPkZlYXR1cmUgZGlyZWN0b3JpZXM8L2xpPgotPC91bD4KKwk8dWw+CisJCTxsaT5UaGUgdG9wLWxldmVsIChyb290KSBkaXJlY3Rvcnk8L2xpPgorCQk8bGk+UGx1Zy1pbiBhbmQgRnJhZ21lbnQgZGlyZWN0b3JpZXM8L2xpPgorCQk8bGk+SW5zaWRlIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgcGFja2FnZWQgYXMgSkFSczwvbGk+CisJCTxsaT5TdWItZGlyZWN0b3JpZXMgb2YgdGhlIGRpcmVjdG9yeSBuYW1lZCAmcXVvdDtzcmMmcXVvdDsgb2YKKwkJCWNlcnRhaW4gUGx1Zy1pbnM8L2xpPgorCQk8bGk+RmVhdHVyZSBkaXJlY3RvcmllczwvbGk+CisJPC91bD4KIAotPHA+Tm90ZTogaWYgYSBGZWF0dXJlIG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gaXMgCi1pbnN0YWxsZWQgdXNpbmcgdGhlIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5IChhcyBkZWZpbmVkIGJlbG93KSwgeW91IG11c3QKLSBhZ3JlZSB0byBhIGxpY2Vuc2UgKCJGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIikgZHVyaW5nIHRoZQotaW5zdGFsbGF0aW9uIHByb2Nlc3MuICBJZiB0aGUgRmVhdHVyZSBjb250YWlucyBJbmNsdWRlZCBGZWF0dXJlcywgdGhlIAotRmVhdHVyZSBVcGRhdGUgTGljZW5zZSBzaG91bGQgZWl0aGVyIHByb3ZpZGUgeW91IHdpdGggdGhlIHRlcm1zIGFuZCAKLWNvbmRpdGlvbnMgZ292ZXJuaW5nIHRoZSBJbmNsdWRlZCBGZWF0dXJlcyBvcgotaW5mb3JtIHlvdSB3aGVyZSB5b3UgY2FuIGxvY2F0ZSB0aGVtLiAgRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgbWF5IGJlIAotZm91bmQgaW4gdGhlICJsaWNlbnNlIiBwcm9wZXJ0eSBvZiBmaWxlcyBuYW1lZCAiZmVhdHVyZS5wcm9wZXJ0aWVzIiAKLWZvdW5kIHdpdGhpbiBhIEZlYXR1cmUuCi1TdWNoIEFib3V0cywgRmVhdHVyZSBMaWNlbnNlcywgYW5kIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIGNvbnRhaW4gdGhlIAotdGVybXMgYW5kIGNvbmRpdGlvbnMgKG9yIHJlZmVyZW5jZXMgdG8gc3VjaCB0ZXJtcyBhbmQgY29uZGl0aW9ucykgdGhhdCAKLWdvdmVybiB5b3VyIHVzZSBvZiB0aGUgYXNzb2NpYXRlZCBDb250ZW50IGluCi10aGF0IGRpcmVjdG9yeS48L3A+CisJPHA+Tm90ZTogaWYgYSBGZWF0dXJlIG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gaXMKKwkJaW5zdGFsbGVkIHVzaW5nIHRoZSBQcm92aXNpb25pbmcgVGVjaG5vbG9neSAoYXMgZGVmaW5lZCBiZWxvdyksIHlvdQorCQltdXN0IGFncmVlIHRvIGEgbGljZW5zZSAoJnF1b3Q7RmVhdHVyZSBVcGRhdGUgTGljZW5zZSZxdW90OykgZHVyaW5nCisJCXRoZSBpbnN0YWxsYXRpb24gcHJvY2Vzcy4gSWYgdGhlIEZlYXR1cmUgY29udGFpbnMgSW5jbHVkZWQgRmVhdHVyZXMsCisJCXRoZSBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIHNob3VsZCBlaXRoZXIgcHJvdmlkZSB5b3Ugd2l0aCB0aGUgdGVybXMKKwkJYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIHRoZSBJbmNsdWRlZCBGZWF0dXJlcyBvciBpbmZvcm0geW91IHdoZXJlIHlvdQorCQljYW4gbG9jYXRlIHRoZW0uIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIG1heSBiZSBmb3VuZCBpbiB0aGUKKwkJJnF1b3Q7bGljZW5zZSZxdW90OyBwcm9wZXJ0eSBvZiBmaWxlcyBuYW1lZAorCQkmcXVvdDtmZWF0dXJlLnByb3BlcnRpZXMmcXVvdDsgZm91bmQgd2l0aGluIGEgRmVhdHVyZS4gU3VjaCBBYm91dHMsCisJCUZlYXR1cmUgTGljZW5zZXMsIGFuZCBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBjb250YWluIHRoZSB0ZXJtcyBhbmQKKwkJY29uZGl0aW9ucyAob3IgcmVmZXJlbmNlcyB0byBzdWNoIHRlcm1zIGFuZCBjb25kaXRpb25zKSB0aGF0IGdvdmVybgorCQl5b3VyIHVzZSBvZiB0aGUgYXNzb2NpYXRlZCBDb250ZW50IGluIHRoYXQgZGlyZWN0b3J5LjwvcD4KIAotPHA+VEhFIEFCT1VUUywgRkVBVFVSRSBMSUNFTlNFUywgQU5EIEZFQVRVUkUgVVBEQVRFIExJQ0VOU0VTIE1BWSBSRUZFUiAKLVRPIFRIRSBFUEwgT1IgT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTLCBOT1RJQ0VTIE9SIFRFUk1TIEFORCBDT05ESVRJT05TLgotICBTT01FIE9GIFRIRVNFCi1PVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMgTUFZIElOQ0xVREUgKEJVVCBBUkUgTk9UIExJTUlURUQgVE8pOjwvcD4KKwk8cD5USEUgQUJPVVRTLCBGRUFUVVJFIExJQ0VOU0VTLCBBTkQgRkVBVFVSRSBVUERBVEUgTElDRU5TRVMgTUFZCisJCVJFRkVSIFRPIFRIRSBFUEwgT1IgT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTLCBOT1RJQ0VTIE9SIFRFUk1TIEFORAorCQlDT05ESVRJT05TLiBTT01FIE9GIFRIRVNFIE9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUyBNQVkgSU5DTFVERSAoQlVUCisJCUFSRSBOT1QgTElNSVRFRCBUTyk6PC9wPgogCi08dWw+Ci0gICAgICAgPGxpPkVjbGlwc2UgRGlzdHJpYnV0aW9uIExpY2Vuc2UgVmVyc2lvbiAxLjAgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xpY2Vuc2VzL2VkbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9saWNlbnNlcy9lZGwtdjEuMC5odG1sPC9hPik8L2xpPgotICAgICAgIDxsaT5Db21tb24gUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWw8L2E+KTwvbGk+Ci0gICAgICAgPGxpPkFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDEuMSAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFIj5odHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRTwvYT4pPC9saT4KLSAgICAgICA8bGk+QXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMi4wIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wIj5odHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjA8L2E+KTwvbGk+Ci0gICAgICAgPGxpPk1ldHJvIExpbmsgUHVibGljIExpY2Vuc2UgMS4wMCAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbmdyb3VwLm9yZy9vcGVubW90aWYvc3VwcG9ydGVycy9tZXRyb2xpbmsvbGljZW5zZS5odG1sIj5odHRwOi8vd3d3Lm9wZW5ncm91cC5vcmcvb3Blbm1vdGlmL3N1cHBvcnRlcnMvbWV0cm9saW5rL2xpY2Vuc2UuaHRtbDwvYT4pPC9saT4KLSAgICAgICA8bGk+TW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMSAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBML01QTC0xLjEuaHRtbCI+aHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvTVBMLTEuMS5odG1sPC9hPik8L2xpPgotPC91bD4KKwk8dWw+CisJCTxsaT5FY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wIChhdmFpbGFibGUgYXQgPGEKKwkJCWhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbDwvYT4pCisJCTwvbGk+CisJCTxsaT5FY2xpcHNlIERpc3RyaWJ1dGlvbiBMaWNlbnNlIFZlcnNpb24gMS4wIChhdmFpbGFibGUgYXQgPGEKKwkJCWhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGljZW5zZXMvZWRsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xpY2Vuc2VzL2VkbC12MS4wLmh0bWw8L2E+KQorCQk8L2xpPgorCQk8bGk+Q29tbW9uIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wIChhdmFpbGFibGUgYXQgPGEKKwkJCWhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbDwvYT4pCisJCTwvbGk+CisJCTxsaT5BcGFjaGUgU29mdHdhcmUgTGljZW5zZSAxLjEgKGF2YWlsYWJsZSBhdCA8YQorCQkJaHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UiPmh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFPC9hPikKKwkJPC9saT4KKwkJPGxpPkFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDIuMCAoYXZhaWxhYmxlIGF0IDxhCisJCQlocmVmPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAiPmh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMDwvYT4pCisJCTwvbGk+CisJCTxsaT5Nb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4xIChhdmFpbGFibGUgYXQgPGEKKwkJCWhyZWY9Imh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBML01QTC0xLjEuaHRtbCI+aHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvTVBMLTEuMS5odG1sPC9hPikKKwkJPC9saT4KKwk8L3VsPgogCi08cD5JVCBJUyBZT1VSIE9CTElHQVRJT04gVE8gUkVBRCBBTkQgQUNDRVBUIEFMTCBTVUNIIFRFUk1TIEFORCAKLUNPTkRJVElPTlMgUFJJT1IgVE8gVVNFIE9GIFRIRSBDT05URU5ULiAgSWYgbm8gQWJvdXQsIEZlYXR1cmUgTGljZW5zZSwgCi1vciBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIGlzIHByb3ZpZGVkLCBwbGVhc2UKLWNvbnRhY3QgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiB0byBkZXRlcm1pbmUgd2hhdCB0ZXJtcyBhbmQgY29uZGl0aW9ucyAKLWdvdmVybiB0aGF0IHBhcnRpY3VsYXIgQ29udGVudC48L3A+CisJPHA+SVQgSVMgWU9VUiBPQkxJR0FUSU9OIFRPIFJFQUQgQU5EIEFDQ0VQVCBBTEwgU1VDSCBURVJNUyBBTkQKKwkJQ09ORElUSU9OUyBQUklPUiBUTyBVU0UgT0YgVEhFIENPTlRFTlQuIElmIG5vIEFib3V0LCBGZWF0dXJlIExpY2Vuc2UsCisJCW9yIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2UgaXMgcHJvdmlkZWQsIHBsZWFzZSBjb250YWN0IHRoZSBFY2xpcHNlCisJCUZvdW5kYXRpb24gdG8gZGV0ZXJtaW5lIHdoYXQgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuIHRoYXQKKwkJcGFydGljdWxhciBDb250ZW50LjwvcD4KIAogCi08aDM+VXNlIG9mIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5PC9oMz4KKwk8aDM+VXNlIG9mIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5PC9oMz4KIAotPHA+VGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYWtlcyBhdmFpbGFibGUgcHJvdmlzaW9uaW5nIHNvZnR3YXJlLCAKLWV4YW1wbGVzIG9mIHdoaWNoIGluY2x1ZGUsIGJ1dCBhcmUgbm90IGxpbWl0ZWQgdG8sIHAyIGFuZCB0aGUgRWNsaXBzZQotICAgVXBkYXRlIE1hbmFnZXIgKCJQcm92aXNpb25pbmcgVGVjaG5vbG9neSIpIGZvciB0aGUgcHVycG9zZSBvZiAKLWFsbG93aW5nIHVzZXJzIHRvIGluc3RhbGwgc29mdHdhcmUsIGRvY3VtZW50YXRpb24sIGluZm9ybWF0aW9uIGFuZC9vcgotICAgb3RoZXIgbWF0ZXJpYWxzIChjb2xsZWN0aXZlbHkgIkluc3RhbGxhYmxlIFNvZnR3YXJlIikuIFRoaXMgCi1jYXBhYmlsaXR5IGlzIHByb3ZpZGVkIHdpdGggdGhlIGludGVudCBvZiBhbGxvd2luZyBzdWNoIHVzZXJzIHRvCi0gICBpbnN0YWxsLCBleHRlbmQgYW5kIHVwZGF0ZSBFY2xpcHNlLWJhc2VkIHByb2R1Y3RzLiBJbmZvcm1hdGlvbiBhYm91dCAKLXBhY2thZ2luZyBJbnN0YWxsYWJsZSBTb2Z0d2FyZSBpcyBhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL2VjbGlwc2Uub3JnL2VxdWlub3gvcDIvcmVwb3NpdG9yeV9wYWNrYWdpbmcuaHRtbCI+aHR0cDovL2VjbGlwc2Uub3JnL2VxdWlub3gvcDIvcmVwb3NpdG9yeV9wYWNrYWdpbmcuaHRtbDwvYT4KLSAgICgiU3BlY2lmaWNhdGlvbiIpLjwvcD4KKwk8cD4KKwkJVGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYWtlcyBhdmFpbGFibGUgcHJvdmlzaW9uaW5nIHNvZnR3YXJlLCBleGFtcGxlcworCQlvZiB3aGljaCBpbmNsdWRlLCBidXQgYXJlIG5vdCBsaW1pdGVkIHRvLCBwMiBhbmQgdGhlIEVjbGlwc2UgVXBkYXRlCisJCU1hbmFnZXIgKCZxdW90O1Byb3Zpc2lvbmluZyBUZWNobm9sb2d5JnF1b3Q7KSBmb3IgdGhlIHB1cnBvc2Ugb2YKKwkJYWxsb3dpbmcgdXNlcnMgdG8gaW5zdGFsbCBzb2Z0d2FyZSwgZG9jdW1lbnRhdGlvbiwgaW5mb3JtYXRpb24gYW5kL29yCisJCW90aGVyIG1hdGVyaWFscyAoY29sbGVjdGl2ZWx5ICZxdW90O0luc3RhbGxhYmxlIFNvZnR3YXJlJnF1b3Q7KS4gVGhpcworCQljYXBhYmlsaXR5IGlzIHByb3ZpZGVkIHdpdGggdGhlIGludGVudCBvZiBhbGxvd2luZyBzdWNoIHVzZXJzIHRvCisJCWluc3RhbGwsIGV4dGVuZCBhbmQgdXBkYXRlIEVjbGlwc2UtYmFzZWQgcHJvZHVjdHMuIEluZm9ybWF0aW9uIGFib3V0CisJCXBhY2thZ2luZyBJbnN0YWxsYWJsZSBTb2Z0d2FyZSBpcyBhdmFpbGFibGUgYXQgPGEKKwkJCWhyZWY9Imh0dHA6Ly9lY2xpcHNlLm9yZy9lcXVpbm94L3AyL3JlcG9zaXRvcnlfcGFja2FnaW5nLmh0bWwiPmh0dHA6Ly9lY2xpcHNlLm9yZy9lcXVpbm94L3AyL3JlcG9zaXRvcnlfcGFja2FnaW5nLmh0bWw8L2E+CisJCSgmcXVvdDtTcGVjaWZpY2F0aW9uJnF1b3Q7KS4KKwk8L3A+CiAKLTxwPllvdSBtYXkgdXNlIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5IHRvIGFsbG93IG90aGVyIHBhcnRpZXMgdG8gaW5zdGFsbAotIEluc3RhbGxhYmxlIFNvZnR3YXJlLiBZb3Ugc2hhbGwgYmUgcmVzcG9uc2libGUgZm9yIGVuYWJsaW5nIHRoZQotICAgYXBwbGljYWJsZSBsaWNlbnNlIGFncmVlbWVudHMgcmVsYXRpbmcgdG8gdGhlIEluc3RhbGxhYmxlIFNvZnR3YXJlIHRvCi0gYmUgcHJlc2VudGVkIHRvLCBhbmQgYWNjZXB0ZWQgYnksIHRoZSB1c2VycyBvZiB0aGUgUHJvdmlzaW9uaW5nIAotVGVjaG5vbG9neQotICAgaW4gYWNjb3JkYW5jZSB3aXRoIHRoZSBTcGVjaWZpY2F0aW9uLiBCeSB1c2luZyBQcm92aXNpb25pbmcgCi1UZWNobm9sb2d5IGluIHN1Y2ggYSBtYW5uZXIgYW5kIG1ha2luZyBpdCBhdmFpbGFibGUgaW4gYWNjb3JkYW5jZSB3aXRoIAotdGhlCi0gICBTcGVjaWZpY2F0aW9uLCB5b3UgZnVydGhlciBhY2tub3dsZWRnZSB5b3VyIGFncmVlbWVudCB0bywgYW5kIHRoZSAKLWFjcXVpc2l0aW9uIG9mIGFsbCBuZWNlc3NhcnkgcmlnaHRzIHRvIHBlcm1pdCB0aGUgZm9sbG93aW5nOjwvcD4KKwk8cD5Zb3UgbWF5IHVzZSBQcm92aXNpb25pbmcgVGVjaG5vbG9neSB0byBhbGxvdyBvdGhlciBwYXJ0aWVzIHRvCisJCWluc3RhbGwgSW5zdGFsbGFibGUgU29mdHdhcmUuIFlvdSBzaGFsbCBiZSByZXNwb25zaWJsZSBmb3IgZW5hYmxpbmcKKwkJdGhlIGFwcGxpY2FibGUgbGljZW5zZSBhZ3JlZW1lbnRzIHJlbGF0aW5nIHRvIHRoZSBJbnN0YWxsYWJsZSBTb2Z0d2FyZQorCQl0byBiZSBwcmVzZW50ZWQgdG8sIGFuZCBhY2NlcHRlZCBieSwgdGhlIHVzZXJzIG9mIHRoZSBQcm92aXNpb25pbmcKKwkJVGVjaG5vbG9neSBpbiBhY2NvcmRhbmNlIHdpdGggdGhlIFNwZWNpZmljYXRpb24uIEJ5IHVzaW5nIFByb3Zpc2lvbmluZworCQlUZWNobm9sb2d5IGluIHN1Y2ggYSBtYW5uZXIgYW5kIG1ha2luZyBpdCBhdmFpbGFibGUgaW4gYWNjb3JkYW5jZSB3aXRoCisJCXRoZSBTcGVjaWZpY2F0aW9uLCB5b3UgZnVydGhlciBhY2tub3dsZWRnZSB5b3VyIGFncmVlbWVudCB0bywgYW5kIHRoZQorCQlhY3F1aXNpdGlvbiBvZiBhbGwgbmVjZXNzYXJ5IHJpZ2h0cyB0byBwZXJtaXQgdGhlIGZvbGxvd2luZzo8L3A+CiAKLTxvbD4KLSAgICAgICA8bGk+QSBzZXJpZXMgb2YgYWN0aW9ucyBtYXkgb2NjdXIgKCJQcm92aXNpb25pbmcgUHJvY2VzcyIpIGluIAotd2hpY2ggYSB1c2VyIG1heSBleGVjdXRlIHRoZSBQcm92aXNpb25pbmcgVGVjaG5vbG9neQotICAgICAgIG9uIGEgbWFjaGluZSAoIlRhcmdldCBNYWNoaW5lIikgd2l0aCB0aGUgaW50ZW50IG9mIGluc3RhbGxpbmcsIAotZXh0ZW5kaW5nIG9yIHVwZGF0aW5nIHRoZSBmdW5jdGlvbmFsaXR5IG9mIGFuIEVjbGlwc2UtYmFzZWQKLSAgICAgICBwcm9kdWN0LjwvbGk+Ci0gICAgICAgPGxpPkR1cmluZyB0aGUgUHJvdmlzaW9uaW5nIFByb2Nlc3MsIHRoZSBQcm92aXNpb25pbmcgVGVjaG5vbG9neSAKLW1heSBjYXVzZSB0aGlyZCBwYXJ0eSBJbnN0YWxsYWJsZSBTb2Z0d2FyZSBvciBhIHBvcnRpb24gdGhlcmVvZiB0byBiZQotICAgICAgIGFjY2Vzc2VkIGFuZCBjb3BpZWQgdG8gdGhlIFRhcmdldCBNYWNoaW5lLjwvbGk+Ci0gICAgICAgPGxpPlB1cnN1YW50IHRvIHRoZSBTcGVjaWZpY2F0aW9uLCB5b3Ugd2lsbCBwcm92aWRlIHRvIHRoZSB1c2VyIAotdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIHRoYXQgZ292ZXJuIHRoZSB1c2Ugb2YgdGhlIEluc3RhbGxhYmxlCi0gICAgICAgU29mdHdhcmUgKCJJbnN0YWxsYWJsZSBTb2Z0d2FyZSBBZ3JlZW1lbnQiKSBhbmQgc3VjaCBJbnN0YWxsYWJsZSAKLVNvZnR3YXJlIEFncmVlbWVudCBzaGFsbCBiZSBhY2Nlc3NlZCBmcm9tIHRoZSBUYXJnZXQKLSAgICAgICBNYWNoaW5lIGluIGFjY29yZGFuY2Ugd2l0aCB0aGUgU3BlY2lmaWNhdGlvbi4gU3VjaCBJbnN0YWxsYWJsZSAKLVNvZnR3YXJlIEFncmVlbWVudCBtdXN0IGluZm9ybSB0aGUgdXNlciBvZiB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgdGhhdAotIGdvdmVybgotICAgICAgIHRoZSBJbnN0YWxsYWJsZSBTb2Z0d2FyZSBhbmQgbXVzdCBzb2xpY2l0IGFjY2VwdGFuY2UgYnkgdGhlIGVuZCAKLXVzZXIgaW4gdGhlIG1hbm5lciBwcmVzY3JpYmVkIGluIHN1Y2ggSW5zdGFsbGFibGUgU29mdHdhcmUgQWdyZWVtZW50LiAKLVVwb24gc3VjaAotICAgICAgIGluZGljYXRpb24gb2YgYWdyZWVtZW50IGJ5IHRoZSB1c2VyLCB0aGUgcHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kgCi13aWxsIGNvbXBsZXRlIGluc3RhbGxhdGlvbiBvZiB0aGUgSW5zdGFsbGFibGUgU29mdHdhcmUuPC9saT4KLTwvb2w+CisJPG9sPgorCQk8bGk+QSBzZXJpZXMgb2YgYWN0aW9ucyBtYXkgb2NjdXIgKCZxdW90O1Byb3Zpc2lvbmluZworCQkJUHJvY2VzcyZxdW90OykgaW4gd2hpY2ggYSB1c2VyIG1heSBleGVjdXRlIHRoZSBQcm92aXNpb25pbmcKKwkJCVRlY2hub2xvZ3kgb24gYSBtYWNoaW5lICgmcXVvdDtUYXJnZXQgTWFjaGluZSZxdW90Oykgd2l0aCB0aGUgaW50ZW50CisJCQlvZiBpbnN0YWxsaW5nLCBleHRlbmRpbmcgb3IgdXBkYXRpbmcgdGhlIGZ1bmN0aW9uYWxpdHkgb2YgYW4KKwkJCUVjbGlwc2UtYmFzZWQgcHJvZHVjdC48L2xpPgorCQk8bGk+RHVyaW5nIHRoZSBQcm92aXNpb25pbmcgUHJvY2VzcywgdGhlIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5CisJCQltYXkgY2F1c2UgdGhpcmQgcGFydHkgSW5zdGFsbGFibGUgU29mdHdhcmUgb3IgYSBwb3J0aW9uIHRoZXJlb2YgdG8gYmUKKwkJCWFjY2Vzc2VkIGFuZCBjb3BpZWQgdG8gdGhlIFRhcmdldCBNYWNoaW5lLjwvbGk+CisJCTxsaT5QdXJzdWFudCB0byB0aGUgU3BlY2lmaWNhdGlvbiwgeW91IHdpbGwgcHJvdmlkZSB0byB0aGUgdXNlcgorCQkJdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIHRoYXQgZ292ZXJuIHRoZSB1c2Ugb2YgdGhlIEluc3RhbGxhYmxlCisJCQlTb2Z0d2FyZSAoJnF1b3Q7SW5zdGFsbGFibGUgU29mdHdhcmUgQWdyZWVtZW50JnF1b3Q7KSBhbmQgc3VjaAorCQkJSW5zdGFsbGFibGUgU29mdHdhcmUgQWdyZWVtZW50IHNoYWxsIGJlIGFjY2Vzc2VkIGZyb20gdGhlIFRhcmdldAorCQkJTWFjaGluZSBpbiBhY2NvcmRhbmNlIHdpdGggdGhlIFNwZWNpZmljYXRpb24uIFN1Y2ggSW5zdGFsbGFibGUKKwkJCVNvZnR3YXJlIEFncmVlbWVudCBtdXN0IGluZm9ybSB0aGUgdXNlciBvZiB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMKKwkJCXRoYXQgZ292ZXJuIHRoZSBJbnN0YWxsYWJsZSBTb2Z0d2FyZSBhbmQgbXVzdCBzb2xpY2l0IGFjY2VwdGFuY2UgYnkKKwkJCXRoZSBlbmQgdXNlciBpbiB0aGUgbWFubmVyIHByZXNjcmliZWQgaW4gc3VjaCBJbnN0YWxsYWJsZSBTb2Z0d2FyZQorCQkJQWdyZWVtZW50LiBVcG9uIHN1Y2ggaW5kaWNhdGlvbiBvZiBhZ3JlZW1lbnQgYnkgdGhlIHVzZXIsIHRoZQorCQkJcHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kgd2lsbCBjb21wbGV0ZSBpbnN0YWxsYXRpb24gb2YgdGhlIEluc3RhbGxhYmxlCisJCQlTb2Z0d2FyZS48L2xpPgorCTwvb2w+CiAKLTxoMz5DcnlwdG9ncmFwaHk8L2gzPgorCTxoMz5DcnlwdG9ncmFwaHk8L2gzPgogCi08cD5Db250ZW50IG1heSBjb250YWluIGVuY3J5cHRpb24gc29mdHdhcmUuIFRoZSBjb3VudHJ5IGluIHdoaWNoIHlvdSBhcmUKLSBjdXJyZW50bHkgbWF5IGhhdmUgcmVzdHJpY3Rpb25zIG9uIHRoZSBpbXBvcnQsIHBvc3Nlc3Npb24sIGFuZCB1c2UsIAotYW5kL29yIHJlLWV4cG9ydCB0bwotICAgYW5vdGhlciBjb3VudHJ5LCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBCRUZPUkUgdXNpbmcgYW55IGVuY3J5cHRpb24gCi1zb2Z0d2FyZSwgcGxlYXNlIGNoZWNrIHRoZSBjb3VudHJ5J3MgbGF3cywgcmVndWxhdGlvbnMgYW5kIHBvbGljaWVzIAotY29uY2VybmluZyB0aGUgaW1wb3J0LAotICAgcG9zc2Vzc2lvbiwgb3IgdXNlLCBhbmQgcmUtZXhwb3J0IG9mIGVuY3J5cHRpb24gc29mdHdhcmUsIHRvIHNlZSBpZiAKLXRoaXMgaXMgcGVybWl0dGVkLjwvcD4KKwk8cD5Db250ZW50IG1heSBjb250YWluIGVuY3J5cHRpb24gc29mdHdhcmUuIFRoZSBjb3VudHJ5IGluIHdoaWNoCisJCXlvdSBhcmUgY3VycmVudGx5IG1heSBoYXZlIHJlc3RyaWN0aW9ucyBvbiB0aGUgaW1wb3J0LCBwb3NzZXNzaW9uLCBhbmQKKwkJdXNlLCBhbmQvb3IgcmUtZXhwb3J0IHRvIGFub3RoZXIgY291bnRyeSwgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZS4KKwkJQkVGT1JFIHVzaW5nIGFueSBlbmNyeXB0aW9uIHNvZnR3YXJlLCBwbGVhc2UgY2hlY2sgdGhlIGNvdW50cnkncyBsYXdzLAorCQlyZWd1bGF0aW9ucyBhbmQgcG9saWNpZXMgY29uY2VybmluZyB0aGUgaW1wb3J0LCBwb3NzZXNzaW9uLCBvciB1c2UsCisJCWFuZCByZS1leHBvcnQgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgdG8gc2VlIGlmIHRoaXMgaXMgcGVybWl0dGVkLjwvcD4KIAotPHA+PHNtYWxsPkphdmEgYW5kIGFsbCBKYXZhLWJhc2VkIHRyYWRlbWFya3MgYXJlIHRyYWRlbWFya3Mgb2YgT3JhY2xlIENvcnBvcmF0aW9uIGluIHRoZSBVbml0ZWQgU3RhdGVzLCBvdGhlciBjb3VudHJpZXMsIG9yIGJvdGguPC9zbWFsbD48L3A+Ci0KLQotPC9ib2R5PjwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCisJPHA+CisJCTxzbWFsbD5KYXZhIGFuZCBhbGwgSmF2YS1iYXNlZCB0cmFkZW1hcmtzIGFyZSB0cmFkZW1hcmtzIG9mCisJCQlPcmFjbGUgQ29ycG9yYXRpb24gaW4gdGhlIFVuaXRlZCBTdGF0ZXMsIG90aGVyIGNvdW50cmllcywgb3IgYm90aC48L3NtYWxsPgorCTwvcD4KKzwvYm9keT4KKzwvaHRtbD4KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLm9zYnAueHRleHQuZGF0YWludGVyY2hhbmdlLnRlc3RzL3BvbS54bWwgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmRhdGFpbnRlcmNoYW5nZS50ZXN0cy9wb20ueG1sCmluZGV4IDRmMGVkODguLmZlNjBkNzggMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLm9zYnAueHRleHQuZGF0YWludGVyY2hhbmdlLnRlc3RzL3BvbS54bWwKKysrIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5kYXRhaW50ZXJjaGFuZ2UudGVzdHMvcG9tLnhtbApAQCAtMiw5ICsyLDExIEBACiA8IS0tIz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgogPCEtLSMgQ29weXJpZ2h0IChjKSAyMDExLCAyMDE2IC0gTG9ldHogR21iSCZDby5LRyAoNjkxMTUgSGVpZGVsYmVyZywgR2VybWFueSkgLS0+CiA8IS0tIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIC0tPgotPCEtLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIC0tPgorPCEtLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSAyLjAgIC0tPgogPCEtLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgLS0+Ci08IS0tIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCAtLT4KKzwhLS0jIGh0dHBzOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAvICAgIC0tPgorPCEtLSMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+Cis8IS0tIyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCAgICAgICAgICAtLT4KIDwhLS0jIC0tPgogPCEtLSMgQ29udHJpYnV0b3JzOiAtLT4KIDwhLS0jICAgICBDaHJpc3RvcGhlIExvZXR6IChMb2V0eiBHbWJIJkNvLktHKSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbiAtLT4KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLm9zYnAueHRleHQuZGF0YWludGVyY2hhbmdlLnRlc3RzL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9kYXRhaW50ZXJjaGFuZ2UvdGVzdHMvRGF0YURTTEluamVjdG9yUHJvdmlkZXIuamF2YSBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQuZGF0YWludGVyY2hhbmdlLnRlc3RzL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9kYXRhaW50ZXJjaGFuZ2UvdGVzdHMvRGF0YURTTEluamVjdG9yUHJvdmlkZXIuamF2YQppbmRleCA0YThjOGM2Li4zNzcxMzYzIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmRhdGFpbnRlcmNoYW5nZS50ZXN0cy9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvZGF0YWludGVyY2hhbmdlL3Rlc3RzL0RhdGFEU0xJbmplY3RvclByb3ZpZGVyLmphdmEKKysrIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5kYXRhaW50ZXJjaGFuZ2UudGVzdHMvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2RhdGFpbnRlcmNoYW5nZS90ZXN0cy9EYXRhRFNMSW5qZWN0b3JQcm92aWRlci5qYXZhCkBAIC0zLDkgKzMsMTEgQEAKICAqICBDb3B5cmlnaHQgKGMpIDIwMTEsIDIwMTYgLSBMb2V0eiBHbWJIJkNvLktHICg2OTExNSBIZWlkZWxiZXJnLCBHZXJtYW55KSAKICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICogIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgICAgICAgICAgIAotICogIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCAgICAgICAKKyAqICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIDIuMCAgICAgICAgCiAgKiAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgICAgICAgICAgICAgICAgICAKLSAqICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICogIGh0dHBzOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAvICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICogIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAqICBDb250cmlidXRvcnM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgKiAJICAgQ2hyaXN0b3BoZSBMb2V0eiAoTG9ldHogR21iSCZDby5LRykgLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmRhdGFpbnRlcmNoYW5nZS51aS9MSUNFTlNFLnR4dCBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQuZGF0YWludGVyY2hhbmdlLnVpL0xJQ0VOU0UudHh0CmluZGV4IGZmNDJhZDQuLmZjNTkzOGQgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLm9zYnAueHRleHQuZGF0YWludGVyY2hhbmdlLnVpL0xJQ0VOU0UudHh0CisrKyBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQuZGF0YWludGVyY2hhbmdlLnVpL0xJQ0VOU0UudHh0CkBAIC0xLDE2MSArMSwxNDAgQEAKLUVjbGlwc2UgUHVibGljIExpY2Vuc2UgLXYgMS4wCitFY2xpcHNlIEZvdW5kYXRpb24gU29mdHdhcmUgVXNlciBBZ3JlZW1lbnQKIAotVEhFIEFDQ09NUEFOWUlORyBQUk9HUkFNIElTIFBST1ZJREVEIFVOREVSIFRIRSBURVJNUyBPRiBUSElTIEVDTElQU0UgUFVCTElDIExJQ0VOU0UgKCJBR1JFRU1FTlQiKS4gQU5ZIFVTRSwgUkVQUk9EVUNUSU9OCi1PUiBESVNUUklCVVRJT04gT0YgVEhFIFBST0dSQU0gQ09OU1RJVFVURVMgUkVDSVBJRU5UJ1MgQUNDRVBUQU5DRSBPRiBUSElTIEFHUkVFTUVOVC4KK05vdmVtYmVyIDIyLCAyMDE3CiAKLTEuIERFRklOSVRJT05TCitVc2FnZSBPZiBDb250ZW50CiAKLSJDb250cmlidXRpb24iIG1lYW5zOgorVEhFIEVDTElQU0UgRk9VTkRBVElPTiBNQUtFUyBBVkFJTEFCTEUgU09GVFdBUkUsIERPQ1VNRU5UQVRJT04sIElORk9STUFUSU9OCitBTkQvT1IgT1RIRVIgTUFURVJJQUxTIEZPUiBPUEVOIFNPVVJDRSBQUk9KRUNUUyAoQ09MTEVDVElWRUxZICJDT05URU5UIikuIFVTRSBPRgorVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVMgQUdSRUVNRU5UIEFORC9PUiBUSEUKK1RFUk1TIEFORCBDT05ESVRJT05TIE9GIExJQ0VOU0UgQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VECitCRUxPVy4gQlkgVVNJTkcgVEhFIENPTlRFTlQsIFlPVSBBR1JFRSBUSEFUIFlPVVIgVVNFIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVECitCWSBUSElTIEFHUkVFTUVOVCBBTkQvT1IgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UKK0FHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gSUYgWU9VIERPIE5PVCBBR1JFRSBUTyBUSEUKK1RFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVMgQUdSRUVNRU5UIEFORCBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgQU5ZCitBUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLCBUSEVOIFlPVQorTUFZIE5PVCBVU0UgVEhFIENPTlRFTlQuCiAKLWEpIGluIHRoZSBjYXNlIG9mIHRoZSBpbml0aWFsIENvbnRyaWJ1dG9yLCB0aGUgaW5pdGlhbCBjb2RlIGFuZCBkb2N1bWVudGF0aW9uIGRpc3RyaWJ1dGVkIHVuZGVyIHRoaXMgQWdyZWVtZW50LCBhbmQKK0FwcGxpY2FibGUgTGljZW5zZXMKIAotYikgaW4gdGhlIGNhc2Ugb2YgZWFjaCBzdWJzZXF1ZW50IENvbnRyaWJ1dG9yOgorVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQsIGFsbCBDb250ZW50IG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24KK2lzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UKK1ZlcnNpb24gMi4wICgiRVBMIikuIEEgY29weSBvZiB0aGUgRVBMIGlzIHByb3ZpZGVkIHdpdGggdGhpcyBDb250ZW50IGFuZCBpcyBhbHNvCithdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLiBGb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwKKyJQcm9ncmFtIiB3aWxsIG1lYW4gdGhlIENvbnRlbnQuCiAKLWkpIGNoYW5nZXMgdG8gdGhlIFByb2dyYW0sIGFuZAorQ29udGVudCBpbmNsdWRlcywgYnV0IGlzIG5vdCBsaW1pdGVkIHRvLCBzb3VyY2UgY29kZSwgb2JqZWN0IGNvZGUsIGRvY3VtZW50YXRpb24KK2FuZCBvdGhlciBmaWxlcyBtYWludGFpbmVkIGluIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gc291cmNlIGNvZGUgcmVwb3NpdG9yeQorKCJSZXBvc2l0b3J5IikgaW4gc29mdHdhcmUgbW9kdWxlcyAoIk1vZHVsZXMiKSBhbmQgbWFkZSBhdmFpbGFibGUgYXMKK2Rvd25sb2FkYWJsZSBhcmNoaXZlcyAoIkRvd25sb2FkcyIpLgogCi1paSkgYWRkaXRpb25zIHRvIHRoZSBQcm9ncmFtOworLSAgIENvbnRlbnQgbWF5IGJlIHN0cnVjdHVyZWQgYW5kIHBhY2thZ2VkIGludG8gbW9kdWxlcyB0byBmYWNpbGl0YXRlCisgICAgZGVsaXZlcmluZywgZXh0ZW5kaW5nLCBhbmQgdXBncmFkaW5nIHRoZSBDb250ZW50LiBUeXBpY2FsIG1vZHVsZXMgbWF5CisgICAgaW5jbHVkZSBwbHVnLWlucyAoIlBsdWctaW5zIiksIHBsdWctaW4gZnJhZ21lbnRzICgiRnJhZ21lbnRzIiksIGFuZAorICAgIGZlYXR1cmVzICgiRmVhdHVyZXMiKS4KKy0gICBFYWNoIFBsdWctaW4gb3IgRnJhZ21lbnQgbWF5IGJlIHBhY2thZ2VkIGFzIGEgc3ViLWRpcmVjdG9yeSBvciBKQVIKKyAgICAoSmF2YeKEoiBBUmNoaXZlKSBpbiBhIGRpcmVjdG9yeSBuYW1lZCAicGx1Z2lucyIuCistICAgQSBGZWF0dXJlIGlzIGEgYnVuZGxlIG9mIG9uZSBvciBtb3JlIFBsdWctaW5zIGFuZC9vciBGcmFnbWVudHMgYW5kCisgICAgYXNzb2NpYXRlZCBtYXRlcmlhbC4gRWFjaCBGZWF0dXJlIG1heSBiZSBwYWNrYWdlZCBhcyBhIHN1Yi1kaXJlY3RvcnkgaW4gYQorICAgIGRpcmVjdG9yeSBuYW1lZCAiZmVhdHVyZXMiLiBXaXRoaW4gYSBGZWF0dXJlLCBmaWxlcyBuYW1lZCAiZmVhdHVyZS54bWwiIG1heQorICAgIGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mIHRoZSBQbHVnLWlucyBhbmQvb3IKKyAgICBGcmFnbWVudHMgYXNzb2NpYXRlZCB3aXRoIHRoYXQgRmVhdHVyZS4KKy0gICBGZWF0dXJlcyBtYXkgYWxzbyBpbmNsdWRlIG90aGVyIEZlYXR1cmVzICgiSW5jbHVkZWQgRmVhdHVyZXMiKS4gV2l0aGluIGEKKyAgICBGZWF0dXJlLCBmaWxlcyBuYW1lZCAiZmVhdHVyZS54bWwiIG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kCisgICAgdmVyc2lvbiBudW1iZXJzIG9mIEluY2x1ZGVkIEZlYXR1cmVzLgogCi13aGVyZSBzdWNoIGNoYW5nZXMgYW5kL29yIGFkZGl0aW9ucyB0byB0aGUgUHJvZ3JhbSBvcmlnaW5hdGUgZnJvbSBhbmQgYXJlIGRpc3RyaWJ1dGVkIGJ5IHRoYXQgcGFydGljdWxhciBDb250cmlidXRvci4KLUEgQ29udHJpYnV0aW9uICdvcmlnaW5hdGVzJyBmcm9tIGEgQ29udHJpYnV0b3IgaWYgaXQgd2FzIGFkZGVkIHRvIHRoZSBQcm9ncmFtIGJ5IHN1Y2ggQ29udHJpYnV0b3IgaXRzZWxmIG9yIGFueW9uZQotYWN0aW5nIG9uIHN1Y2ggQ29udHJpYnV0b3IncyBiZWhhbGYuIENvbnRyaWJ1dGlvbnMgZG8gbm90IGluY2x1ZGUgYWRkaXRpb25zIHRvIHRoZSBQcm9ncmFtIHdoaWNoOiAoaSkgYXJlIHNlcGFyYXRlCi1tb2R1bGVzIG9mIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIGluIGNvbmp1bmN0aW9uIHdpdGggdGhlIFByb2dyYW0gdW5kZXIgdGhlaXIgb3duIGxpY2Vuc2UgYWdyZWVtZW50LCBhbmQgKGlpKSBhcmUgbm90Ci1kZXJpdmF0aXZlIHdvcmtzIG9mIHRoZSBQcm9ncmFtLgorVGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHNob3VsZCBiZSBjb250YWluZWQgaW4KK2ZpbGVzIG5hbWVkICJhYm91dC5odG1sIiAoIkFib3V0cyIpLiBUaGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIEZlYXR1cmVzCithbmQgSW5jbHVkZWQgRmVhdHVyZXMgc2hvdWxkIGJlIGNvbnRhaW5lZCBpbiBmaWxlcyBuYW1lZCAibGljZW5zZS5odG1sIgorKCJGZWF0dXJlIExpY2Vuc2VzIikuIEFib3V0cyBhbmQgRmVhdHVyZSBMaWNlbnNlcyBtYXkgYmUgbG9jYXRlZCBpbiBhbnkKK2RpcmVjdG9yeSBvZiBhIERvd25sb2FkIG9yIE1vZHVsZSBpbmNsdWRpbmcsIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgZm9sbG93aW5nCitsb2NhdGlvbnM6CiAKLSJDb250cmlidXRvciIgbWVhbnMgYW55IHBlcnNvbiBvciBlbnRpdHkgdGhhdCBkaXN0cmlidXRlcyB0aGUgUHJvZ3JhbS4KKy0gICBUaGUgdG9wLWxldmVsIChyb290KSBkaXJlY3RvcnkKKy0gICBQbHVnLWluIGFuZCBGcmFnbWVudCBkaXJlY3RvcmllcworLSAgIEluc2lkZSBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHBhY2thZ2VkIGFzIEpBUnMKKy0gICBTdWItZGlyZWN0b3JpZXMgb2YgdGhlIGRpcmVjdG9yeSBuYW1lZCAic3JjIiBvZiBjZXJ0YWluIFBsdWctaW5zCistICAgRmVhdHVyZSBkaXJlY3RvcmllcwogCi0iTGljZW5zZWQgUGF0ZW50cyAiIG1lYW4gcGF0ZW50IGNsYWltcyBsaWNlbnNhYmxlIGJ5IGEgQ29udHJpYnV0b3Igd2hpY2ggYXJlIG5lY2Vzc2FyaWx5IGluZnJpbmdlZCBieSB0aGUgdXNlIG9yIHNhbGUgb2YKLWl0cyBDb250cmlidXRpb24gYWxvbmUgb3Igd2hlbiBjb21iaW5lZCB3aXRoIHRoZSBQcm9ncmFtLgorTm90ZTogaWYgYSBGZWF0dXJlIG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gaXMgaW5zdGFsbGVkIHVzaW5nCit0aGUgUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kgKGFzIGRlZmluZWQgYmVsb3cpLCB5b3UgbXVzdCBhZ3JlZSB0byBhIGxpY2Vuc2UKKygiRmVhdHVyZSBVcGRhdGUgTGljZW5zZSIpIGR1cmluZyB0aGUgaW5zdGFsbGF0aW9uIHByb2Nlc3MuIElmIHRoZSBGZWF0dXJlCitjb250YWlucyBJbmNsdWRlZCBGZWF0dXJlcywgdGhlIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2Ugc2hvdWxkIGVpdGhlciBwcm92aWRlIHlvdQord2l0aCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIHRoZSBJbmNsdWRlZCBGZWF0dXJlcyBvciBpbmZvcm0geW91Cit3aGVyZSB5b3UgY2FuIGxvY2F0ZSB0aGVtLiBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBtYXkgYmUgZm91bmQgaW4gdGhlICJsaWNlbnNlIgorcHJvcGVydHkgb2YgZmlsZXMgbmFtZWQgImZlYXR1cmUucHJvcGVydGllcyIgZm91bmQgd2l0aGluIGEgRmVhdHVyZS4gU3VjaAorQWJvdXRzLCBGZWF0dXJlIExpY2Vuc2VzLCBhbmQgRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgY29udGFpbiB0aGUgdGVybXMgYW5kCitjb25kaXRpb25zIChvciByZWZlcmVuY2VzIHRvIHN1Y2ggdGVybXMgYW5kIGNvbmRpdGlvbnMpIHRoYXQgZ292ZXJuIHlvdXIgdXNlIG9mCit0aGUgYXNzb2NpYXRlZCBDb250ZW50IGluIHRoYXQgZGlyZWN0b3J5LgogCi0iUHJvZ3JhbSIgbWVhbnMgdGhlIENvbnRyaWJ1dGlvbnMgZGlzdHJpYnV0ZWQgaW4gYWNjb3JkYW5jZSB3aXRoIHRoaXMgQWdyZWVtZW50LgorVEhFIEFCT1VUUywgRkVBVFVSRSBMSUNFTlNFUywgQU5EIEZFQVRVUkUgVVBEQVRFIExJQ0VOU0VTIE1BWSBSRUZFUiBUTyBUSEUgRVBMCitPUiBPVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMsIE5PVElDRVMgT1IgVEVSTVMgQU5EIENPTkRJVElPTlMuIFNPTUUgT0YgVEhFU0UKK09USEVSIExJQ0VOU0UgQUdSRUVNRU5UUyBNQVkgSU5DTFVERSAoQlVUIEFSRSBOT1QgTElNSVRFRCBUTyk6CiAKLSJSZWNpcGllbnQiIG1lYW5zIGFueW9uZSB3aG8gcmVjZWl2ZXMgdGhlIFByb2dyYW0gdW5kZXIgdGhpcyBBZ3JlZW1lbnQsIGluY2x1ZGluZyBhbGwgQ29udHJpYnV0b3JzLgorLSAgIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKGF2YWlsYWJsZSBhdAorICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sKQorLSAgIEVjbGlwc2UgRGlzdHJpYnV0aW9uIExpY2Vuc2UgVmVyc2lvbiAxLjAgKGF2YWlsYWJsZSBhdAorICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGljZW5zZXMvZWRsLXYxLjAuaHRtbCkKKy0gICBDb21tb24gUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKGF2YWlsYWJsZSBhdAorICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sKQorLSAgIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDEuMSAoYXZhaWxhYmxlIGF0CisgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UpCistICAgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMi4wIChhdmFpbGFibGUgYXQKKyAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjApCistICAgTW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMSAoYXZhaWxhYmxlIGF0CisgICAgaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvTVBMLTEuMS5odG1sKQogCi0yLiBHUkFOVCBPRiBSSUdIVFMKK0lUIElTIFlPVVIgT0JMSUdBVElPTiBUTyBSRUFEIEFORCBBQ0NFUFQgQUxMIFNVQ0ggVEVSTVMgQU5EIENPTkRJVElPTlMgUFJJT1IgVE8KK1VTRSBPRiBUSEUgQ09OVEVOVC4gSWYgbm8gQWJvdXQsIEZlYXR1cmUgTGljZW5zZSwgb3IgRmVhdHVyZSBVcGRhdGUgTGljZW5zZSBpcworcHJvdmlkZWQsIHBsZWFzZSBjb250YWN0IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gdG8gZGV0ZXJtaW5lIHdoYXQgdGVybXMgYW5kCitjb25kaXRpb25zIGdvdmVybiB0aGF0IHBhcnRpY3VsYXIgQ29udGVudC4KIAotYSkgU3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhpcyBBZ3JlZW1lbnQsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyBSZWNpcGllbnQgYSBub24tZXhjbHVzaXZlLCB3b3JsZHdpZGUsCi1yb3lhbHR5LWZyZWUgY29weXJpZ2h0IGxpY2Vuc2UgdG8gcmVwcm9kdWNlLCBwcmVwYXJlIGRlcml2YXRpdmUgd29ya3Mgb2YsIHB1YmxpY2x5IGRpc3BsYXksIHB1YmxpY2x5IHBlcmZvcm0sIGRpc3RyaWJ1dGUKLWFuZCBzdWJsaWNlbnNlIHRoZSBDb250cmlidXRpb24gb2Ygc3VjaCBDb250cmlidXRvciwgaWYgYW55LCBhbmQgc3VjaCBkZXJpdmF0aXZlIHdvcmtzLCBpbiBzb3VyY2UgY29kZSBhbmQgb2JqZWN0IGNvZGUKLWZvcm0uCitVc2Ugb2YgUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kKIAotYikgU3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhpcyBBZ3JlZW1lbnQsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyBSZWNpcGllbnQgYSBub24tZXhjbHVzaXZlLCB3b3JsZHdpZGUsCi1yb3lhbHR5LWZyZWUgcGF0ZW50IGxpY2Vuc2UgdW5kZXIgTGljZW5zZWQgUGF0ZW50cyB0byBtYWtlLCB1c2UsIHNlbGwsIG9mZmVyIHRvIHNlbGwsIGltcG9ydCBhbmQgb3RoZXJ3aXNlIHRyYW5zZmVyIHRoZQotQ29udHJpYnV0aW9uIG9mIHN1Y2ggQ29udHJpYnV0b3IsIGlmIGFueSwgaW4gc291cmNlIGNvZGUgYW5kIG9iamVjdCBjb2RlIGZvcm0uIFRoaXMgcGF0ZW50IGxpY2Vuc2Ugc2hhbGwgYXBwbHkgdG8gdGhlCi1jb21iaW5hdGlvbiBvZiB0aGUgQ29udHJpYnV0aW9uIGFuZCB0aGUgUHJvZ3JhbSBpZiwgYXQgdGhlIHRpbWUgdGhlIENvbnRyaWJ1dGlvbiBpcyBhZGRlZCBieSB0aGUgQ29udHJpYnV0b3IsIHN1Y2gKLWFkZGl0aW9uIG9mIHRoZSBDb250cmlidXRpb24gY2F1c2VzIHN1Y2ggY29tYmluYXRpb24gdG8gYmUgY292ZXJlZCBieSB0aGUgTGljZW5zZWQgUGF0ZW50cy4gVGhlIHBhdGVudCBsaWNlbnNlIHNoYWxsIG5vdAotYXBwbHkgdG8gYW55IG90aGVyIGNvbWJpbmF0aW9ucyB3aGljaCBpbmNsdWRlIHRoZSBDb250cmlidXRpb24uIE5vIGhhcmR3YXJlIHBlciBzZSBpcyBsaWNlbnNlZCBoZXJldW5kZXIuCitUaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1ha2VzIGF2YWlsYWJsZSBwcm92aXNpb25pbmcgc29mdHdhcmUsIGV4YW1wbGVzIG9mIHdoaWNoCitpbmNsdWRlLCBidXQgYXJlIG5vdCBsaW1pdGVkIHRvLCBwMiBhbmQgdGhlIEVjbGlwc2UgVXBkYXRlIE1hbmFnZXIKKygiUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kiKSBmb3IgdGhlIHB1cnBvc2Ugb2YgYWxsb3dpbmcgdXNlcnMgdG8gaW5zdGFsbAorc29mdHdhcmUsIGRvY3VtZW50YXRpb24sIGluZm9ybWF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgKGNvbGxlY3RpdmVseQorIkluc3RhbGxhYmxlIFNvZnR3YXJlIikuIFRoaXMgY2FwYWJpbGl0eSBpcyBwcm92aWRlZCB3aXRoIHRoZSBpbnRlbnQgb2YgYWxsb3dpbmcKK3N1Y2ggdXNlcnMgdG8gaW5zdGFsbCwgZXh0ZW5kIGFuZCB1cGRhdGUgRWNsaXBzZS1iYXNlZCBwcm9kdWN0cy4gSW5mb3JtYXRpb24KK2Fib3V0IHBhY2thZ2luZyBJbnN0YWxsYWJsZSBTb2Z0d2FyZSBpcyBhdmFpbGFibGUgYXQKK2h0dHA6Ly9lY2xpcHNlLm9yZy9lcXVpbm94L3AyL3JlcG9zaXRvcnlfcGFja2FnaW5nLmh0bWwgKCJTcGVjaWZpY2F0aW9uIikuCiAKLWMpIFJlY2lwaWVudCB1bmRlcnN0YW5kcyB0aGF0IGFsdGhvdWdoIGVhY2ggQ29udHJpYnV0b3IgZ3JhbnRzIHRoZSBsaWNlbnNlcyB0byBpdHMgQ29udHJpYnV0aW9ucyBzZXQgZm9ydGggaGVyZWluLCBubwotYXNzdXJhbmNlcyBhcmUgcHJvdmlkZWQgYnkgYW55IENvbnRyaWJ1dG9yIHRoYXQgdGhlIFByb2dyYW0gZG9lcyBub3QgaW5mcmluZ2UgdGhlIHBhdGVudCBvciBvdGhlciBpbnRlbGxlY3R1YWwgcHJvcGVydHkKLXJpZ2h0cyBvZiBhbnkgb3RoZXIgZW50aXR5LiBFYWNoIENvbnRyaWJ1dG9yIGRpc2NsYWltcyBhbnkgbGlhYmlsaXR5IHRvIFJlY2lwaWVudCBmb3IgY2xhaW1zIGJyb3VnaHQgYnkgYW55IG90aGVyIGVudGl0eQotYmFzZWQgb24gaW5mcmluZ2VtZW50IG9mIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgb3Igb3RoZXJ3aXNlLiBBcyBhIGNvbmRpdGlvbiB0byBleGVyY2lzaW5nIHRoZSByaWdodHMgYW5kCi1saWNlbnNlcyBncmFudGVkIGhlcmV1bmRlciwgZWFjaCBSZWNpcGllbnQgaGVyZWJ5IGFzc3VtZXMgc29sZSByZXNwb25zaWJpbGl0eSB0byBzZWN1cmUgYW55IG90aGVyIGludGVsbGVjdHVhbCBwcm9wZXJ0eQotcmlnaHRzIG5lZWRlZCwgaWYgYW55LiBGb3IgZXhhbXBsZSwgaWYgYSB0aGlyZCBwYXJ0eSBwYXRlbnQgbGljZW5zZSBpcyByZXF1aXJlZCB0byBhbGxvdyBSZWNpcGllbnQgdG8gZGlzdHJpYnV0ZSB0aGUKLVByb2dyYW0sIGl0IGlzIFJlY2lwaWVudCdzIHJlc3BvbnNpYmlsaXR5IHRvIGFjcXVpcmUgdGhhdCBsaWNlbnNlIGJlZm9yZSBkaXN0cmlidXRpbmcgdGhlIFByb2dyYW0uCitZb3UgbWF5IHVzZSBQcm92aXNpb25pbmcgVGVjaG5vbG9neSB0byBhbGxvdyBvdGhlciBwYXJ0aWVzIHRvIGluc3RhbGwKK0luc3RhbGxhYmxlIFNvZnR3YXJlLiBZb3Ugc2hhbGwgYmUgcmVzcG9uc2libGUgZm9yIGVuYWJsaW5nIHRoZSBhcHBsaWNhYmxlCitsaWNlbnNlIGFncmVlbWVudHMgcmVsYXRpbmcgdG8gdGhlIEluc3RhbGxhYmxlIFNvZnR3YXJlIHRvIGJlIHByZXNlbnRlZCB0bywgYW5kCithY2NlcHRlZCBieSwgdGhlIHVzZXJzIG9mIHRoZSBQcm92aXNpb25pbmcgVGVjaG5vbG9neSBpbiBhY2NvcmRhbmNlIHdpdGggdGhlCitTcGVjaWZpY2F0aW9uLiBCeSB1c2luZyBQcm92aXNpb25pbmcgVGVjaG5vbG9neSBpbiBzdWNoIGEgbWFubmVyIGFuZCBtYWtpbmcgaXQKK2F2YWlsYWJsZSBpbiBhY2NvcmRhbmNlIHdpdGggdGhlIFNwZWNpZmljYXRpb24sIHlvdSBmdXJ0aGVyIGFja25vd2xlZGdlIHlvdXIKK2FncmVlbWVudCB0bywgYW5kIHRoZSBhY3F1aXNpdGlvbiBvZiBhbGwgbmVjZXNzYXJ5IHJpZ2h0cyB0byBwZXJtaXQgdGhlCitmb2xsb3dpbmc6CiAKLWQpIEVhY2ggQ29udHJpYnV0b3IgcmVwcmVzZW50cyB0aGF0IHRvIGl0cyBrbm93bGVkZ2UgaXQgaGFzIHN1ZmZpY2llbnQgY29weXJpZ2h0IHJpZ2h0cyBpbiBpdHMgQ29udHJpYnV0aW9uLCBpZiBhbnksIHRvCi1ncmFudCB0aGUgY29weXJpZ2h0IGxpY2Vuc2Ugc2V0IGZvcnRoIGluIHRoaXMgQWdyZWVtZW50LgorMS4gIEEgc2VyaWVzIG9mIGFjdGlvbnMgbWF5IG9jY3VyICgiUHJvdmlzaW9uaW5nIFByb2Nlc3MiKSBpbiB3aGljaCBhIHVzZXIgbWF5CisgICAgZXhlY3V0ZSB0aGUgUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kgb24gYSBtYWNoaW5lICgiVGFyZ2V0IE1hY2hpbmUiKSB3aXRoIHRoZQorICAgIGludGVudCBvZiBpbnN0YWxsaW5nLCBleHRlbmRpbmcgb3IgdXBkYXRpbmcgdGhlIGZ1bmN0aW9uYWxpdHkgb2YgYW4KKyAgICBFY2xpcHNlLWJhc2VkIHByb2R1Y3QuCisyLiAgRHVyaW5nIHRoZSBQcm92aXNpb25pbmcgUHJvY2VzcywgdGhlIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5IG1heSBjYXVzZSB0aGlyZAorICAgIHBhcnR5IEluc3RhbGxhYmxlIFNvZnR3YXJlIG9yIGEgcG9ydGlvbiB0aGVyZW9mIHRvIGJlIGFjY2Vzc2VkIGFuZCBjb3BpZWQgdG8KKyAgICB0aGUgVGFyZ2V0IE1hY2hpbmUuCiszLiAgUHVyc3VhbnQgdG8gdGhlIFNwZWNpZmljYXRpb24sIHlvdSB3aWxsIHByb3ZpZGUgdG8gdGhlIHVzZXIgdGhlIHRlcm1zIGFuZAorICAgIGNvbmRpdGlvbnMgdGhhdCBnb3Zlcm4gdGhlIHVzZSBvZiB0aGUgSW5zdGFsbGFibGUgU29mdHdhcmUgKCJJbnN0YWxsYWJsZQorICAgIFNvZnR3YXJlIEFncmVlbWVudCIpIGFuZCBzdWNoIEluc3RhbGxhYmxlIFNvZnR3YXJlIEFncmVlbWVudCBzaGFsbCBiZQorICAgIGFjY2Vzc2VkIGZyb20gdGhlIFRhcmdldCBNYWNoaW5lIGluIGFjY29yZGFuY2Ugd2l0aCB0aGUgU3BlY2lmaWNhdGlvbi4gU3VjaAorICAgIEluc3RhbGxhYmxlIFNvZnR3YXJlIEFncmVlbWVudCBtdXN0IGluZm9ybSB0aGUgdXNlciBvZiB0aGUgdGVybXMgYW5kCisgICAgY29uZGl0aW9ucyB0aGF0IGdvdmVybiB0aGUgSW5zdGFsbGFibGUgU29mdHdhcmUgYW5kIG11c3Qgc29saWNpdCBhY2NlcHRhbmNlCisgICAgYnkgdGhlIGVuZCB1c2VyIGluIHRoZSBtYW5uZXIgcHJlc2NyaWJlZCBpbiBzdWNoIEluc3RhbGxhYmxlCisgICAgU29mdHdhcmUgQWdyZWVtZW50LiBVcG9uIHN1Y2ggaW5kaWNhdGlvbiBvZiBhZ3JlZW1lbnQgYnkgdGhlIHVzZXIsIHRoZQorICAgIHByb3Zpc2lvbmluZyBUZWNobm9sb2d5IHdpbGwgY29tcGxldGUgaW5zdGFsbGF0aW9uIG9mIHRoZQorICAgIEluc3RhbGxhYmxlIFNvZnR3YXJlLgogCi0zLiBSRVFVSVJFTUVOVFMKK0NyeXB0b2dyYXBoeQogCi1BIENvbnRyaWJ1dG9yIG1heSBjaG9vc2UgdG8gZGlzdHJpYnV0ZSB0aGUgUHJvZ3JhbSBpbiBvYmplY3QgY29kZSBmb3JtIHVuZGVyIGl0cyBvd24gbGljZW5zZSBhZ3JlZW1lbnQsIHByb3ZpZGVkIHRoYXQ6CitDb250ZW50IG1heSBjb250YWluIGVuY3J5cHRpb24gc29mdHdhcmUuIFRoZSBjb3VudHJ5IGluIHdoaWNoIHlvdSBhcmUgY3VycmVudGx5CittYXkgaGF2ZSByZXN0cmljdGlvbnMgb24gdGhlIGltcG9ydCwgcG9zc2Vzc2lvbiwgYW5kIHVzZSwgYW5kL29yIHJlLWV4cG9ydCB0bworYW5vdGhlciBjb3VudHJ5LCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBCRUZPUkUgdXNpbmcgYW55IGVuY3J5cHRpb24gc29mdHdhcmUsCitwbGVhc2UgY2hlY2sgdGhlIGNvdW50cnkncyBsYXdzLCByZWd1bGF0aW9ucyBhbmQgcG9saWNpZXMgY29uY2VybmluZyB0aGUgaW1wb3J0LAorcG9zc2Vzc2lvbiwgb3IgdXNlLCBhbmQgcmUtZXhwb3J0IG9mIGVuY3J5cHRpb24gc29mdHdhcmUsIHRvIHNlZSBpZiB0aGlzIGlzCitwZXJtaXR0ZWQuCiAKLWEpIGl0IGNvbXBsaWVzIHdpdGggdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoaXMgQWdyZWVtZW50OyBhbmQKLQotYikgaXRzIGxpY2Vuc2UgYWdyZWVtZW50OgotCi1pKSBlZmZlY3RpdmVseSBkaXNjbGFpbXMgb24gYmVoYWxmIG9mIGFsbCBDb250cmlidXRvcnMgYWxsIHdhcnJhbnRpZXMgYW5kIGNvbmRpdGlvbnMsIGV4cHJlc3MgYW5kIGltcGxpZWQsIGluY2x1ZGluZwotd2FycmFudGllcyBvciBjb25kaXRpb25zIG9mIHRpdGxlIGFuZCBub24taW5mcmluZ2VtZW50LCBhbmQgaW1wbGllZCB3YXJyYW50aWVzIG9yIGNvbmRpdGlvbnMgb2YgbWVyY2hhbnRhYmlsaXR5IGFuZAotZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2U7Ci0KLWlpKSBlZmZlY3RpdmVseSBleGNsdWRlcyBvbiBiZWhhbGYgb2YgYWxsIENvbnRyaWJ1dG9ycyBhbGwgbGlhYmlsaXR5IGZvciBkYW1hZ2VzLCBpbmNsdWRpbmcgZGlyZWN0LCBpbmRpcmVjdCwgc3BlY2lhbCwKLWluY2lkZW50YWwgYW5kIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywgc3VjaCBhcyBsb3N0IHByb2ZpdHM7Ci0KLWlpaSkgc3RhdGVzIHRoYXQgYW55IHByb3Zpc2lvbnMgd2hpY2ggZGlmZmVyIGZyb20gdGhpcyBBZ3JlZW1lbnQgYXJlIG9mZmVyZWQgYnkgdGhhdCBDb250cmlidXRvciBhbG9uZSBhbmQgbm90IGJ5IGFueQotb3RoZXIgcGFydHk7IGFuZAotCi1pdikgc3RhdGVzIHRoYXQgc291cmNlIGNvZGUgZm9yIHRoZSBQcm9ncmFtIGlzIGF2YWlsYWJsZSBmcm9tIHN1Y2ggQ29udHJpYnV0b3IsIGFuZCBpbmZvcm1zIGxpY2Vuc2VlcyBob3cgdG8gb2J0YWluIGl0Ci1pbiBhIHJlYXNvbmFibGUgbWFubmVyIG9uIG9yIHRocm91Z2ggYSBtZWRpdW0gY3VzdG9tYXJpbHkgdXNlZCBmb3Igc29mdHdhcmUgZXhjaGFuZ2UuCi0KLVdoZW4gdGhlIFByb2dyYW0gaXMgbWFkZSBhdmFpbGFibGUgaW4gc291cmNlIGNvZGUgZm9ybToKLQotYSkgaXQgbXVzdCBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGlzIEFncmVlbWVudDsgYW5kCi0KLWIpIGEgY29weSBvZiB0aGlzIEFncmVlbWVudCBtdXN0IGJlIGluY2x1ZGVkIHdpdGggZWFjaCBjb3B5IG9mIHRoZSBQcm9ncmFtLgotCi1Db250cmlidXRvcnMgbWF5IG5vdCByZW1vdmUgb3IgYWx0ZXIgYW55IGNvcHlyaWdodCBub3RpY2VzIGNvbnRhaW5lZCB3aXRoaW4gdGhlIFByb2dyYW0uCi0KLUVhY2ggQ29udHJpYnV0b3IgbXVzdCBpZGVudGlmeSBpdHNlbGYgYXMgdGhlIG9yaWdpbmF0b3Igb2YgaXRzIENvbnRyaWJ1dGlvbiwgaWYgYW55LCBpbiBhIG1hbm5lciB0aGF0IHJlYXNvbmFibHkgYWxsb3dzCi1zdWJzZXF1ZW50IFJlY2lwaWVudHMgdG8gaWRlbnRpZnkgdGhlIG9yaWdpbmF0b3Igb2YgdGhlIENvbnRyaWJ1dGlvbi4KLQotNC4gQ09NTUVSQ0lBTCBESVNUUklCVVRJT04KLQotQ29tbWVyY2lhbCBkaXN0cmlidXRvcnMgb2Ygc29mdHdhcmUgbWF5IGFjY2VwdCBjZXJ0YWluIHJlc3BvbnNpYmlsaXRpZXMgd2l0aCByZXNwZWN0IHRvIGVuZCB1c2VycywgYnVzaW5lc3MgcGFydG5lcnMgYW5kCi10aGUgbGlrZS4gV2hpbGUgdGhpcyBsaWNlbnNlIGlzIGludGVuZGVkIHRvIGZhY2lsaXRhdGUgdGhlIGNvbW1lcmNpYWwgdXNlIG9mIHRoZSBQcm9ncmFtLCB0aGUgQ29udHJpYnV0b3Igd2hvIGluY2x1ZGVzCi10aGUgUHJvZ3JhbSBpbiBhIGNvbW1lcmNpYWwgcHJvZHVjdCBvZmZlcmluZyBzaG91bGQgZG8gc28gaW4gYSBtYW5uZXIgd2hpY2ggZG9lcyBub3QgY3JlYXRlIHBvdGVudGlhbCBsaWFiaWxpdHkgZm9yCi1vdGhlciBDb250cmlidXRvcnMuIFRoZXJlZm9yZSwgaWYgYSBDb250cmlidXRvciBpbmNsdWRlcyB0aGUgUHJvZ3JhbSBpbiBhIGNvbW1lcmNpYWwgcHJvZHVjdCBvZmZlcmluZywgc3VjaCBDb250cmlidXRvcgotKCJDb21tZXJjaWFsIENvbnRyaWJ1dG9yIikgaGVyZWJ5IGFncmVlcyB0byBkZWZlbmQgYW5kIGluZGVtbmlmeSBldmVyeSBvdGhlciBDb250cmlidXRvciAoIkluZGVtbmlmaWVkIENvbnRyaWJ1dG9yIikKLWFnYWluc3QgYW55IGxvc3NlcywgZGFtYWdlcyBhbmQgY29zdHMgKGNvbGxlY3RpdmVseSAiTG9zc2VzIikgYXJpc2luZyBmcm9tIGNsYWltcywgbGF3c3VpdHMgYW5kIG90aGVyIGxlZ2FsIGFjdGlvbnMKLWJyb3VnaHQgYnkgYSB0aGlyZCBwYXJ0eSBhZ2FpbnN0IHRoZSBJbmRlbW5pZmllZCBDb250cmlidXRvciB0byB0aGUgZXh0ZW50IGNhdXNlZCBieSB0aGUgYWN0cyBvciBvbWlzc2lvbnMgb2Ygc3VjaAotQ29tbWVyY2lhbCBDb250cmlidXRvciBpbiBjb25uZWN0aW9uIHdpdGggaXRzIGRpc3RyaWJ1dGlvbiBvZiB0aGUgUHJvZ3JhbSBpbiBhIGNvbW1lcmNpYWwgcHJvZHVjdCBvZmZlcmluZy4gVGhlCi1vYmxpZ2F0aW9ucyBpbiB0aGlzIHNlY3Rpb24gZG8gbm90IGFwcGx5IHRvIGFueSBjbGFpbXMgb3IgTG9zc2VzIHJlbGF0aW5nIHRvIGFueSBhY3R1YWwgb3IgYWxsZWdlZCBpbnRlbGxlY3R1YWwKLXByb3BlcnR5IGluZnJpbmdlbWVudC4gSW4gb3JkZXIgdG8gcXVhbGlmeSwgYW4gSW5kZW1uaWZpZWQgQ29udHJpYnV0b3IgbXVzdDogYSkgcHJvbXB0bHkgbm90aWZ5IHRoZSBDb21tZXJjaWFsCi1Db250cmlidXRvciBpbiB3cml0aW5nIG9mIHN1Y2ggY2xhaW0sIGFuZCBiKSBhbGxvdyB0aGUgQ29tbWVyY2lhbCBDb250cmlidXRvciB0byBjb250cm9sLCBhbmQgY29vcGVyYXRlIHdpdGggdGhlCi1Db21tZXJjaWFsIENvbnRyaWJ1dG9yIGluLCB0aGUgZGVmZW5zZSBhbmQgYW55IHJlbGF0ZWQgc2V0dGxlbWVudCBuZWdvdGlhdGlvbnMuIFRoZSBJbmRlbW5pZmllZCBDb250cmlidXRvciBtYXkKLSBwYXJ0aWNpcGF0ZSBpbiBhbnkgc3VjaCBjbGFpbSBhdCBpdHMgb3duIGV4cGVuc2UuCi0KLUZvciBleGFtcGxlLCBhIENvbnRyaWJ1dG9yIG1pZ2h0IGluY2x1ZGUgdGhlIFByb2dyYW0gaW4gYSBjb21tZXJjaWFsIHByb2R1Y3Qgb2ZmZXJpbmcsIFByb2R1Y3QgWC4gVGhhdCBDb250cmlidXRvciBpcwotdGhlbiBhIENvbW1lcmNpYWwgQ29udHJpYnV0b3IuIElmIHRoYXQgQ29tbWVyY2lhbCBDb250cmlidXRvciB0aGVuIG1ha2VzIHBlcmZvcm1hbmNlIGNsYWltcywgb3Igb2ZmZXJzIHdhcnJhbnRpZXMKLXJlbGF0ZWQgdG8gUHJvZHVjdCBYLCB0aG9zZSBwZXJmb3JtYW5jZSBjbGFpbXMgYW5kIHdhcnJhbnRpZXMgYXJlIHN1Y2ggQ29tbWVyY2lhbCBDb250cmlidXRvcidzIHJlc3BvbnNpYmlsaXR5IGFsb25lLgotVW5kZXIgdGhpcyBzZWN0aW9uLCB0aGUgQ29tbWVyY2lhbCBDb250cmlidXRvciB3b3VsZCBoYXZlIHRvIGRlZmVuZCBjbGFpbXMgYWdhaW5zdCB0aGUgb3RoZXIgQ29udHJpYnV0b3JzIHJlbGF0ZWQgdG8KLXRob3NlIHBlcmZvcm1hbmNlIGNsYWltcyBhbmQgd2FycmFudGllcywgYW5kIGlmIGEgY291cnQgcmVxdWlyZXMgYW55IG90aGVyIENvbnRyaWJ1dG9yIHRvIHBheSBhbnkgZGFtYWdlcyBhcyBhIHJlc3VsdCwKLXRoZSBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIG11c3QgcGF5IHRob3NlIGRhbWFnZXMuCi0KLTUuIE5PIFdBUlJBTlRZCi0KLUVYQ0VQVCBBUyBFWFBSRVNTTFkgU0VUIEZPUlRIIElOIFRISVMgQUdSRUVNRU5ULCBUSEUgUFJPR1JBTSBJUyBQUk9WSURFRCBPTiBBTiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IKLUNPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIEVJVEhFUiBFWFBSRVNTIE9SIElNUExJRUQgSU5DTFVESU5HLCBXSVRIT1VUIExJTUlUQVRJT04sIEFOWSBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgVElUTEUsCi1OT04tSU5GUklOR0VNRU5ULCBNRVJDSEFOVEFCSUxJVFkgT1IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIEVhY2ggUmVjaXBpZW50IGlzIHNvbGVseSByZXNwb25zaWJsZSBmb3IKLWRldGVybWluaW5nIHRoZSBhcHByb3ByaWF0ZW5lc3Mgb2YgdXNpbmcgYW5kIGRpc3RyaWJ1dGluZyB0aGUgUHJvZ3JhbSBhbmQgYXNzdW1lcyBhbGwgcmlza3MgYXNzb2NpYXRlZCB3aXRoIGl0cwotZXhlcmNpc2Ugb2YgcmlnaHRzIHVuZGVyIHRoaXMgQWdyZWVtZW50ICwgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgcmlza3MgYW5kIGNvc3RzIG9mIHByb2dyYW0gZXJyb3JzLCBjb21wbGlhbmNlCi13aXRoIGFwcGxpY2FibGUgbGF3cywgZGFtYWdlIHRvIG9yIGxvc3Mgb2YgZGF0YSwgcHJvZ3JhbXMgb3IgZXF1aXBtZW50LCBhbmQgdW5hdmFpbGFiaWxpdHkgb3IgaW50ZXJydXB0aW9uIG9mIG9wZXJhdGlvbnMuCi0KLTYuIERJU0NMQUlNRVIgT0YgTElBQklMSVRZCi0KLUVYQ0VQVCBBUyBFWFBSRVNTTFkgU0VUIEZPUlRIIElOIFRISVMgQUdSRUVNRU5ULCBORUlUSEVSIFJFQ0lQSUVOVCBOT1IgQU5ZIENPTlRSSUJVVE9SUyBTSEFMTCBIQVZFIEFOWSBMSUFCSUxJVFkgRk9SIEFOWQotRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORyBXSVRIT1VUIExJTUlUQVRJT04gTE9TVCBQUk9GSVRTKSwKLUhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IKLU9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9SIERJU1RSSUJVVElPTiBPRiBUSEUgUFJPR1JBTSBPUiBUSEUgRVhFUkNJU0UgT0YgQU5ZIFJJR0hUUyBHUkFOVEVECi1IRVJFVU5ERVIsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0VTLgotCi03LiBHRU5FUkFMCi0KLUlmIGFueSBwcm92aXNpb24gb2YgdGhpcyBBZ3JlZW1lbnQgaXMgaW52YWxpZCBvciB1bmVuZm9yY2VhYmxlIHVuZGVyIGFwcGxpY2FibGUgbGF3LCBpdCBzaGFsbCBub3QgYWZmZWN0IHRoZSB2YWxpZGl0eSBvcgotZW5mb3JjZWFiaWxpdHkgb2YgdGhlIHJlbWFpbmRlciBvZiB0aGUgdGVybXMgb2YgdGhpcyBBZ3JlZW1lbnQsIGFuZCB3aXRob3V0IGZ1cnRoZXIgYWN0aW9uIGJ5IHRoZSBwYXJ0aWVzIGhlcmV0bywgc3VjaAotcHJvdmlzaW9uIHNoYWxsIGJlIHJlZm9ybWVkIHRvIHRoZSBtaW5pbXVtIGV4dGVudCBuZWNlc3NhcnkgdG8gbWFrZSBzdWNoIHByb3Zpc2lvbiB2YWxpZCBhbmQgZW5mb3JjZWFibGUuCi0KLUlmIFJlY2lwaWVudCBpbnN0aXR1dGVzIHBhdGVudCBsaXRpZ2F0aW9uIGFnYWluc3QgYW55IGVudGl0eSAoaW5jbHVkaW5nIGEgY3Jvc3MtY2xhaW0gb3IgY291bnRlcmNsYWltIGluIGEgbGF3c3VpdCkKLWFsbGVnaW5nIHRoYXQgdGhlIFByb2dyYW0gaXRzZWxmIChleGNsdWRpbmcgY29tYmluYXRpb25zIG9mIHRoZSBQcm9ncmFtIHdpdGggb3RoZXIgc29mdHdhcmUgb3IgaGFyZHdhcmUpIGluZnJpbmdlcyBzdWNoCi1SZWNpcGllbnQncyBwYXRlbnQocyksIHRoZW4gc3VjaCBSZWNpcGllbnQncyByaWdodHMgZ3JhbnRlZCB1bmRlciBTZWN0aW9uIDIoYikgc2hhbGwgdGVybWluYXRlIGFzIG9mIHRoZSBkYXRlIHN1Y2gKLWxpdGlnYXRpb24gaXMgZmlsZWQuCi0KLUFsbCBSZWNpcGllbnQncyByaWdodHMgdW5kZXIgdGhpcyBBZ3JlZW1lbnQgc2hhbGwgdGVybWluYXRlIGlmIGl0IGZhaWxzIHRvIGNvbXBseSB3aXRoIGFueSBvZiB0aGUgbWF0ZXJpYWwgdGVybXMgb3IKLWNvbmRpdGlvbnMgb2YgdGhpcyBBZ3JlZW1lbnQgYW5kIGRvZXMgbm90IGN1cmUgc3VjaCBmYWlsdXJlIGluIGEgcmVhc29uYWJsZSBwZXJpb2Qgb2YgdGltZSBhZnRlciBiZWNvbWluZyBhd2FyZSBvZiBzdWNoCi1ub25jb21wbGlhbmNlLiBJZiBhbGwgUmVjaXBpZW50J3MgcmlnaHRzIHVuZGVyIHRoaXMgQWdyZWVtZW50IHRlcm1pbmF0ZSwgUmVjaXBpZW50IGFncmVlcyB0byBjZWFzZSB1c2UgYW5kIGRpc3RyaWJ1dGlvbgotb2YgdGhlIFByb2dyYW0gYXMgc29vbiBhcyByZWFzb25hYmx5IHByYWN0aWNhYmxlLiBIb3dldmVyLCBSZWNpcGllbnQncyBvYmxpZ2F0aW9ucyB1bmRlciB0aGlzIEFncmVlbWVudCBhbmQgYW55IGxpY2Vuc2VzCi0gZ3JhbnRlZCBieSBSZWNpcGllbnQgcmVsYXRpbmcgdG8gdGhlIFByb2dyYW0gc2hhbGwgY29udGludWUgYW5kIHN1cnZpdmUuCi0KLUV2ZXJ5b25lIGlzIHBlcm1pdHRlZCB0byBjb3B5IGFuZCBkaXN0cmlidXRlIGNvcGllcyBvZiB0aGlzIEFncmVlbWVudCwgYnV0IGluIG9yZGVyIHRvIGF2b2lkIGluY29uc2lzdGVuY3kgdGhlIEFncmVlbWVudAotaXMgY29weXJpZ2h0ZWQgYW5kIG1heSBvbmx5IGJlIG1vZGlmaWVkIGluIHRoZSBmb2xsb3dpbmcgbWFubmVyLiBUaGUgQWdyZWVtZW50IFN0ZXdhcmQgcmVzZXJ2ZXMgdGhlIHJpZ2h0IHRvIHB1Ymxpc2gKLW5ldyB2ZXJzaW9ucyAoaW5jbHVkaW5nIHJldmlzaW9ucykgb2YgdGhpcyBBZ3JlZW1lbnQgZnJvbSB0aW1lIHRvIHRpbWUuIE5vIG9uZSBvdGhlciB0aGFuIHRoZSBBZ3JlZW1lbnQgU3Rld2FyZCBoYXMgdGhlCi1yaWdodCB0byBtb2RpZnkgdGhpcyBBZ3JlZW1lbnQuIFRoZSBFY2xpcHNlIEZvdW5kYXRpb24gaXMgdGhlIGluaXRpYWwgQWdyZWVtZW50IFN0ZXdhcmQuIFRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWF5Ci1hc3NpZ24gdGhlIHJlc3BvbnNpYmlsaXR5IHRvIHNlcnZlIGFzIHRoZSBBZ3JlZW1lbnQgU3Rld2FyZCB0byBhIHN1aXRhYmxlIHNlcGFyYXRlIGVudGl0eS4gRWFjaCBuZXcgdmVyc2lvbiBvZiB0aGUKLUFncmVlbWVudCB3aWxsIGJlIGdpdmVuIGEgZGlzdGluZ3Vpc2hpbmcgdmVyc2lvbiBudW1iZXIuIFRoZSBQcm9ncmFtIChpbmNsdWRpbmcgQ29udHJpYnV0aW9ucykgbWF5IGFsd2F5cyBiZQotZGlzdHJpYnV0ZWQgc3ViamVjdCB0byB0aGUgdmVyc2lvbiBvZiB0aGUgQWdyZWVtZW50IHVuZGVyIHdoaWNoIGl0IHdhcyByZWNlaXZlZC4gSW4gYWRkaXRpb24sIGFmdGVyIGEgbmV3IHZlcnNpb24gb2YKLXRoZSBBZ3JlZW1lbnQgaXMgcHVibGlzaGVkLCBDb250cmlidXRvciBtYXkgZWxlY3QgdG8gZGlzdHJpYnV0ZSB0aGUgUHJvZ3JhbSAoaW5jbHVkaW5nIGl0cyBDb250cmlidXRpb25zKSB1bmRlciB0aGUKLW5ldyB2ZXJzaW9uLiBFeGNlcHQgYXMgZXhwcmVzc2x5IHN0YXRlZCBpbiBTZWN0aW9ucyAyKGEpIGFuZCAyKGIpIGFib3ZlLCBSZWNpcGllbnQgcmVjZWl2ZXMgbm8gcmlnaHRzIG9yIGxpY2Vuc2VzIHRvCi10aGUgaW50ZWxsZWN0dWFsIHByb3BlcnR5IG9mIGFueSBDb250cmlidXRvciB1bmRlciB0aGlzIEFncmVlbWVudCwgd2hldGhlciBleHByZXNzbHksIGJ5IGltcGxpY2F0aW9uLCBlc3RvcHBlbCBvcgotb3RoZXJ3aXNlLiBBbGwgcmlnaHRzIGluIHRoZSBQcm9ncmFtIG5vdCBleHByZXNzbHkgZ3JhbnRlZCB1bmRlciB0aGlzIEFncmVlbWVudCBhcmUgcmVzZXJ2ZWQuCi0KLVRoaXMgQWdyZWVtZW50IGlzIGdvdmVybmVkIGJ5IHRoZSBsYXdzIG9mIHRoZSBTdGF0ZSBvZiBOZXcgWW9yayBhbmQgdGhlIGludGVsbGVjdHVhbCBwcm9wZXJ0eSBsYXdzIG9mIHRoZSBVbml0ZWQgU3RhdGVzCi1vZiBBbWVyaWNhLiBObyBwYXJ0eSB0byB0aGlzIEFncmVlbWVudCB3aWxsIGJyaW5nIGEgbGVnYWwgYWN0aW9uIHVuZGVyIHRoaXMgQWdyZWVtZW50IG1vcmUgdGhhbiBvbmUgeWVhciBhZnRlciB0aGUgY2F1c2UKLW9mIGFjdGlvbiBhcm9zZS4gRWFjaCBwYXJ0eSB3YWl2ZXMgaXRzIHJpZ2h0cyB0byBhIGp1cnkgdHJpYWwgaW4gYW55IHJlc3VsdGluZyBsaXRpZ2F0aW9uLgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKK0phdmEgYW5kIGFsbCBKYXZhLWJhc2VkIHRyYWRlbWFya3MgYXJlIHRyYWRlbWFya3Mgb2YgT3JhY2xlIENvcnBvcmF0aW9uIGluIHRoZQorVW5pdGVkIFN0YXRlcywgb3RoZXIgY291bnRyaWVzLCBvciBib3RoLgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5kYXRhaW50ZXJjaGFuZ2UudWkvYWJvdXQuaHRtbCBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQuZGF0YWludGVyY2hhbmdlLnVpL2Fib3V0Lmh0bWwKaW5kZXggNjRjMDU5OC4uZThiODM0ZCAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5kYXRhaW50ZXJjaGFuZ2UudWkvYWJvdXQuaHRtbAorKysgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmRhdGFpbnRlcmNoYW5nZS51aS9hYm91dC5odG1sCkBAIC04LDEzICs4LDEzIEBACiA8Ym9keSBsYW5nPSJFTi1VUyI+CiA8aDI+QWJvdXQgVGhpcyBDb250ZW50PC9oMj4KICAKLTxwPkp1bmUgMSwgMjAxNjwvcD4JCis8cD5Ob3ZlbWJlciAzMCwgMjAxNzwvcD4JCiA8aDM+TGljZW5zZTwvaDM+CiAKIDxwPlRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWFrZXMgYXZhaWxhYmxlIGFsbCBjb250ZW50IGluIHRoaXMgcGx1Zy1pbiAoJnF1b3Q7Q29udGVudCZxdW90OykuICBVbmxlc3Mgb3RoZXJ3aXNlIAogaW5kaWNhdGVkIGJlbG93LCB0aGUgQ29udGVudCBpcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZQotRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoJnF1b3Q7RVBMJnF1b3Q7KS4gIEEgY29weSBvZiB0aGUgRVBMIGlzIGF2YWlsYWJsZSAKLWF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbDwvYT4uCitFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMi4wICgmcXVvdDtFUEwmcXVvdDspLiAgQSBjb3B5IG9mIHRoZSBFUEwgaXMgYXZhaWxhYmxlIAorYXQgPGEgaHJlZj0iaHR0cHM6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMCI+aHR0cHM6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMDwvYT4uCiBGb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgJnF1b3Q7UHJvZ3JhbSZxdW90OyB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9wPgogCiA8cD5JZiB5b3UgZGlkIG5vdCByZWNlaXZlIHRoaXMgQ29udGVudCBkaXJlY3RseSBmcm9tIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24sIHRoZSBDb250ZW50IGlzIApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5kYXRhaW50ZXJjaGFuZ2UudWkvYWJvdXQucHJvcGVydGllcyBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQuZGF0YWludGVyY2hhbmdlLnVpL2Fib3V0LnByb3BlcnRpZXMKaW5kZXggOTFiYTU3OS4uYmNlODgxZSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5kYXRhaW50ZXJjaGFuZ2UudWkvYWJvdXQucHJvcGVydGllcworKysgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmRhdGFpbnRlcmNoYW5nZS51aS9hYm91dC5wcm9wZXJ0aWVzCkBAIC0xLDkgKzEsMTEgQEAKICMKICMgQ29weXJpZ2h0IChjKSAyMDEyLCAyMDE2IC0gTG9ldHogR21iSCZDby5LRyAoSGVpZGVsYmVyZykKICMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSAyLjAgCiAjIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisjIGh0dHBzOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAvCisjCisjIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wCiAjCiAjIENvbnRyaWJ1dG9yczoKICMgICAgQ2hyaXN0b3BoZSBMb2V0eiAoTG9ldHogR21iSCZDby5LRykgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KQEAgLTE3LDkgKzE5LDExIEBACiBmZWF0dXJlVGV4dD1cCiBDb3B5cmlnaHQgKGMpIDIwMTItMjAxNiAtIExvZXR6IEdtYkgmQ28uS0cgXG5cCiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzXG5cCi1hcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjBcblwKK2FyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgMi4wIFxuXAogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXRcblwKLWh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sXG5cCitodHRwczovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wL1xuXAorXG5cCitTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMFxuXAogXG5cCiBDb250cmlidXRvcnM6XG5cCiAgICAgQ2hyaXN0b3BoZSBMb2V0eiAoTG9ldHogR21iSCZDby5LRykgLSBpbml0aWFsIGltcGxlbWVudGF0aW9uXG4KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLm9zYnAueHRleHQuZGF0YWludGVyY2hhbmdlLnVpL2J1aWxkLnByb3BlcnRpZXMgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmRhdGFpbnRlcmNoYW5nZS51aS9idWlsZC5wcm9wZXJ0aWVzCmluZGV4IDk0MTY5ODIuLmY4NjVkZDUgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLm9zYnAueHRleHQuZGF0YWludGVyY2hhbmdlLnVpL2J1aWxkLnByb3BlcnRpZXMKKysrIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5kYXRhaW50ZXJjaGFuZ2UudWkvYnVpbGQucHJvcGVydGllcwpAQCAtMTUsMTIgKzE1LDEyIEBACiAgICAgICAgICAgICAgICB0ZW1wbGF0ZXMvLFwKICAgICAgICAgICAgICAgIGxpY2Vuc2UuaHRtbCxcCiAgICAgICAgICAgICAgICBMSUNFTlNFLnR4dCxcCi0gICAgICAgICAgICAgICBlcGwtdjEwLmh0bWwsXAorICAgICAgICAgICAgICAgZXBsLTIuMC5odG1sLFwKICAgICAgICAgICAgICAgIGljb25zLyxcCiAgICAgICAgICAgICAgICBzcmMvLFwKICAgICAgICAgICAgICAgIHNyYy1nZW4vLFwKICAgICAgICAgICAgICAgIHh0ZW5kLWdlbi8KIHNyYy5pbmNsdWRlcyA9IGFib3V0LnByb3BlcnRpZXMsICBhYm91dC5tYXBwaW5ncywgIGFib3V0LmluaSwgIGFib3V0Lmh0bWwsICBsaWNlbnNlLmh0bWwsXAogICAgICAgICAgICAgICAgTElDRU5TRS50eHQsXAotICAgICAgICAgICAgICAgZXBsLXYxMC5odG1sLFwKKyAgICAgICAgICAgICAgIGVwbC0yLjAuaHRtbCxcCiAgICAgICAgICAgICAgICBpY29ucy8KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLm9zYnAueHRleHQuZGF0YWludGVyY2hhbmdlLnVpL2VwbC0yLjAuaHRtbCBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQuZGF0YWludGVyY2hhbmdlLnVpL2VwbC0yLjAuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MzdhMTgxCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5kYXRhaW50ZXJjaGFuZ2UudWkvZXBsLTIuMC5odG1sCkBAIC0wLDAgKzEsMzAwIEBACis8IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBTdHJpY3QvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtc3RyaWN0LmR0ZCI+Cis8aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIgeG1sOmxhbmc9ImVuIiBsYW5nPSJlbiI+CisgIDxoZWFkPgorICAgIDxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXV0Zi04IiAvPgorICAgIDx0aXRsZT5FY2xpcHNlIFB1YmxpYyBMaWNlbnNlIC0gVmVyc2lvbiAyLjA8L3RpdGxlPgorICAgIDxzdHlsZSB0eXBlPSJ0ZXh0L2NzcyI+CisgICAgICBib2R5IHsKKyAgICAgICAgbWFyZ2luOiAxLjVlbSAzZW07CisgICAgICB9CisgICAgICBoMXsKKyAgICAgICAgZm9udC1zaXplOjEuNWVtOworICAgICAgfQorICAgICAgaDJ7CisgICAgICAgIGZvbnQtc2l6ZToxZW07CisgICAgICAgIG1hcmdpbi1ib3R0b206MC41ZW07CisgICAgICAgIG1hcmdpbi10b3A6MWVtOworICAgICAgfQorICAgICAgcCB7CisgICAgICAgIG1hcmdpbi10b3A6ICAwLjVlbTsKKyAgICAgICAgbWFyZ2luLWJvdHRvbTogMC41ZW07CisgICAgICB9CisgICAgICB1bCwgb2x7CisgICAgICAgIGxpc3Qtc3R5bGUtdHlwZTpub25lOworICAgICAgfQorICAgIDwvc3R5bGU+CisgIDwvaGVhZD4KKyAgPGJvZHk+CisgICAgPGgxPkVjbGlwc2UgUHVibGljIExpY2Vuc2UgLSB2IDIuMDwvaDE+CisgICAgPHA+VEhFIEFDQ09NUEFOWUlORyBQUk9HUkFNIElTIFBST1ZJREVEIFVOREVSIFRIRSBURVJNUyBPRiBUSElTIEVDTElQU0UKKyAgICAgIFBVQkxJQyBMSUNFTlNFICgmbGRxdW87QUdSRUVNRU5UJnJkcXVvOykuIEFOWSBVU0UsIFJFUFJPRFVDVElPTiBPUiBESVNUUklCVVRJT04KKyAgICAgIE9GIFRIRSBQUk9HUkFNIENPTlNUSVRVVEVTIFJFQ0lQSUVOVCYjMDM5O1MgQUNDRVBUQU5DRSBPRiBUSElTIEFHUkVFTUVOVC4KKyAgICA8L3A+CisgICAgPGgyIGlkPSJkZWZpbml0aW9ucyI+MS4gREVGSU5JVElPTlM8L2gyPgorICAgIDxwPiZsZHF1bztDb250cmlidXRpb24mcmRxdW87IG1lYW5zOjwvcD4KKyAgICA8dWw+CisgICAgICA8bGk+YSkgaW4gdGhlIGNhc2Ugb2YgdGhlIGluaXRpYWwgQ29udHJpYnV0b3IsIHRoZSBpbml0aWFsIGNvbnRlbnQKKyAgICAgICAgRGlzdHJpYnV0ZWQgdW5kZXIgdGhpcyBBZ3JlZW1lbnQsIGFuZAorICAgICAgPC9saT4KKyAgICAgIDxsaT4KKyAgICAgICAgYikgaW4gdGhlIGNhc2Ugb2YgZWFjaCBzdWJzZXF1ZW50IENvbnRyaWJ1dG9yOgorICAgICAgICA8dWw+CisgICAgICAgICAgPGxpPmkpIGNoYW5nZXMgdG8gdGhlIFByb2dyYW0sIGFuZDwvbGk+CisgICAgICAgICAgPGxpPmlpKSBhZGRpdGlvbnMgdG8gdGhlIFByb2dyYW07PC9saT4KKyAgICAgICAgPC91bD4KKyAgICAgICAgd2hlcmUgc3VjaCBjaGFuZ2VzIGFuZC9vciBhZGRpdGlvbnMgdG8gdGhlIFByb2dyYW0gb3JpZ2luYXRlIGZyb20KKyAgICAgICAgYW5kIGFyZSBEaXN0cmlidXRlZCBieSB0aGF0IHBhcnRpY3VsYXIgQ29udHJpYnV0b3IuIEEgQ29udHJpYnV0aW9uCisgICAgICAgICZsZHF1bztvcmlnaW5hdGVzJnJkcXVvOyBmcm9tIGEgQ29udHJpYnV0b3IgaWYgaXQgd2FzIGFkZGVkIHRvIHRoZSBQcm9ncmFtIGJ5IHN1Y2gKKyAgICAgICAgQ29udHJpYnV0b3IgaXRzZWxmIG9yIGFueW9uZSBhY3Rpbmcgb24gc3VjaCBDb250cmlidXRvciYjMDM5O3MgYmVoYWxmLgorICAgICAgICBDb250cmlidXRpb25zIGRvIG5vdCBpbmNsdWRlIGNoYW5nZXMgb3IgYWRkaXRpb25zIHRvIHRoZSBQcm9ncmFtIHRoYXQKKyAgICAgICAgYXJlIG5vdCBNb2RpZmllZCBXb3Jrcy4KKyAgICAgIDwvbGk+CisgICAgPC91bD4KKyAgICA8cD4mbGRxdW87Q29udHJpYnV0b3ImcmRxdW87IG1lYW5zIGFueSBwZXJzb24gb3IgZW50aXR5IHRoYXQgRGlzdHJpYnV0ZXMgdGhlIFByb2dyYW0uPC9wPgorICAgIDxwPiZsZHF1bztMaWNlbnNlZCBQYXRlbnRzJnJkcXVvOyBtZWFuIHBhdGVudCBjbGFpbXMgbGljZW5zYWJsZSBieSBhIENvbnRyaWJ1dG9yIHdoaWNoCisgICAgICBhcmUgbmVjZXNzYXJpbHkgaW5mcmluZ2VkIGJ5IHRoZSB1c2Ugb3Igc2FsZSBvZiBpdHMgQ29udHJpYnV0aW9uIGFsb25lCisgICAgICBvciB3aGVuIGNvbWJpbmVkIHdpdGggdGhlIFByb2dyYW0uCisgICAgPC9wPgorICAgIDxwPiZsZHF1bztQcm9ncmFtJnJkcXVvOyBtZWFucyB0aGUgQ29udHJpYnV0aW9ucyBEaXN0cmlidXRlZCBpbiBhY2NvcmRhbmNlIHdpdGggdGhpcworICAgICAgQWdyZWVtZW50LgorICAgIDwvcD4KKyAgICA8cD4mbGRxdW87UmVjaXBpZW50JnJkcXVvOyBtZWFucyBhbnlvbmUgd2hvIHJlY2VpdmVzIHRoZSBQcm9ncmFtIHVuZGVyIHRoaXMgQWdyZWVtZW50CisgICAgICBvciBhbnkgU2Vjb25kYXJ5IExpY2Vuc2UgKGFzIGFwcGxpY2FibGUpLCBpbmNsdWRpbmcgQ29udHJpYnV0b3JzLgorICAgIDwvcD4KKyAgICA8cD4mbGRxdW87RGVyaXZhdGl2ZSBXb3JrcyZyZHF1bzsgc2hhbGwgbWVhbiBhbnkgd29yaywgd2hldGhlciBpbiBTb3VyY2UgQ29kZSBvciBvdGhlcgorICAgICAgZm9ybSwgdGhhdCBpcyBiYXNlZCBvbiAob3IgZGVyaXZlZCBmcm9tKSB0aGUgUHJvZ3JhbSBhbmQgZm9yIHdoaWNoIHRoZQorICAgICAgZWRpdG9yaWFsIHJldmlzaW9ucywgYW5ub3RhdGlvbnMsIGVsYWJvcmF0aW9ucywgb3Igb3RoZXIgbW9kaWZpY2F0aW9ucworICAgICAgcmVwcmVzZW50LCBhcyBhIHdob2xlLCBhbiBvcmlnaW5hbCB3b3JrIG9mIGF1dGhvcnNoaXAuCisgICAgPC9wPgorICAgIDxwPiZsZHF1bztNb2RpZmllZCBXb3JrcyZyZHF1bzsgc2hhbGwgbWVhbiBhbnkgd29yayBpbiBTb3VyY2UgQ29kZSBvciBvdGhlciBmb3JtIHRoYXQKKyAgICAgIHJlc3VsdHMgZnJvbSBhbiBhZGRpdGlvbiB0bywgZGVsZXRpb24gZnJvbSwgb3IgbW9kaWZpY2F0aW9uIG9mIHRoZQorICAgICAgY29udGVudHMgb2YgdGhlIFByb2dyYW0sIGluY2x1ZGluZywgZm9yIHB1cnBvc2VzIG9mIGNsYXJpdHkgYW55IG5ldyBmaWxlCisgICAgICBpbiBTb3VyY2UgQ29kZSBmb3JtIHRoYXQgY29udGFpbnMgYW55IGNvbnRlbnRzIG9mIHRoZSBQcm9ncmFtLiBNb2RpZmllZAorICAgICAgV29ya3Mgc2hhbGwgbm90IGluY2x1ZGUgd29ya3MgdGhhdCBjb250YWluIG9ubHkgZGVjbGFyYXRpb25zLCBpbnRlcmZhY2VzLAorICAgICAgdHlwZXMsIGNsYXNzZXMsIHN0cnVjdHVyZXMsIG9yIGZpbGVzIG9mIHRoZSBQcm9ncmFtIHNvbGVseSBpbiBlYWNoIGNhc2UKKyAgICAgIGluIG9yZGVyIHRvIGxpbmsgdG8sIGJpbmQgYnkgbmFtZSwgb3Igc3ViY2xhc3MgdGhlIFByb2dyYW0gb3IgTW9kaWZpZWQKKyAgICAgIFdvcmtzIHRoZXJlb2YuCisgICAgPC9wPgorICAgIDxwPiZsZHF1bztEaXN0cmlidXRlJnJkcXVvOyBtZWFucyB0aGUgYWN0cyBvZiBhKSBkaXN0cmlidXRpbmcgb3IgYikgbWFraW5nIGF2YWlsYWJsZQorICAgICAgaW4gYW55IG1hbm5lciB0aGF0IGVuYWJsZXMgdGhlIHRyYW5zZmVyIG9mIGEgY29weS4KKyAgICA8L3A+CisgICAgPHA+JmxkcXVvO1NvdXJjZSBDb2RlJnJkcXVvOyBtZWFucyB0aGUgZm9ybSBvZiBhIFByb2dyYW0gcHJlZmVycmVkIGZvciBtYWtpbmcKKyAgICAgIG1vZGlmaWNhdGlvbnMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gc29mdHdhcmUgc291cmNlIGNvZGUsCisgICAgICBkb2N1bWVudGF0aW9uIHNvdXJjZSwgYW5kIGNvbmZpZ3VyYXRpb24gZmlsZXMuCisgICAgPC9wPgorICAgIDxwPiZsZHF1bztTZWNvbmRhcnkgTGljZW5zZSZyZHF1bzsgbWVhbnMgZWl0aGVyIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAgICAgIFZlcnNpb24gMi4wLCBvciBhbnkgbGF0ZXIgdmVyc2lvbnMgb2YgdGhhdCBsaWNlbnNlLCBpbmNsdWRpbmcgYW55CisgICAgICBleGNlcHRpb25zIG9yIGFkZGl0aW9uYWwgcGVybWlzc2lvbnMgYXMgaWRlbnRpZmllZCBieSB0aGUgaW5pdGlhbAorICAgICAgQ29udHJpYnV0b3IuCisgICAgPC9wPgorICAgIDxoMiBpZD0iZ3JhbnQtb2YtcmlnaHRzIj4yLiBHUkFOVCBPRiBSSUdIVFM8L2gyPgorICAgIDx1bD4KKyAgICAgIDxsaT5hKSBTdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGlzIEFncmVlbWVudCwgZWFjaCBDb250cmlidXRvciBoZXJlYnkKKyAgICAgICAgZ3JhbnRzIFJlY2lwaWVudCBhIG5vbi1leGNsdXNpdmUsIHdvcmxkd2lkZSwgcm95YWx0eS1mcmVlIGNvcHlyaWdodAorICAgICAgICBsaWNlbnNlIHRvIHJlcHJvZHVjZSwgcHJlcGFyZSBEZXJpdmF0aXZlIFdvcmtzIG9mLCBwdWJsaWNseSBkaXNwbGF5LAorICAgICAgICBwdWJsaWNseSBwZXJmb3JtLCBEaXN0cmlidXRlIGFuZCBzdWJsaWNlbnNlIHRoZSBDb250cmlidXRpb24gb2Ygc3VjaAorICAgICAgICBDb250cmlidXRvciwgaWYgYW55LCBhbmQgc3VjaCBEZXJpdmF0aXZlIFdvcmtzLgorICAgICAgPC9saT4KKyAgICAgIDxsaT5iKSBTdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGlzIEFncmVlbWVudCwgZWFjaCBDb250cmlidXRvciBoZXJlYnkKKyAgICAgICAgZ3JhbnRzIFJlY2lwaWVudCBhIG5vbi1leGNsdXNpdmUsIHdvcmxkd2lkZSwgcm95YWx0eS1mcmVlIHBhdGVudAorICAgICAgICBsaWNlbnNlIHVuZGVyIExpY2Vuc2VkIFBhdGVudHMgdG8gbWFrZSwgdXNlLCBzZWxsLCBvZmZlciB0byBzZWxsLAorICAgICAgICBpbXBvcnQgYW5kIG90aGVyd2lzZSB0cmFuc2ZlciB0aGUgQ29udHJpYnV0aW9uIG9mIHN1Y2ggQ29udHJpYnV0b3IsCisgICAgICAgIGlmIGFueSwgaW4gU291cmNlIENvZGUgb3Igb3RoZXIgZm9ybS4gVGhpcyBwYXRlbnQgbGljZW5zZSBzaGFsbAorICAgICAgICBhcHBseSB0byB0aGUgY29tYmluYXRpb24gb2YgdGhlIENvbnRyaWJ1dGlvbiBhbmQgdGhlIFByb2dyYW0gaWYsCisgICAgICAgIGF0IHRoZSB0aW1lIHRoZSBDb250cmlidXRpb24gaXMgYWRkZWQgYnkgdGhlIENvbnRyaWJ1dG9yLCBzdWNoCisgICAgICAgIGFkZGl0aW9uIG9mIHRoZSBDb250cmlidXRpb24gY2F1c2VzIHN1Y2ggY29tYmluYXRpb24gdG8gYmUgY292ZXJlZAorICAgICAgICBieSB0aGUgTGljZW5zZWQgUGF0ZW50cy4gVGhlIHBhdGVudCBsaWNlbnNlIHNoYWxsIG5vdCBhcHBseSB0byBhbnkKKyAgICAgICAgb3RoZXIgY29tYmluYXRpb25zIHdoaWNoIGluY2x1ZGUgdGhlIENvbnRyaWJ1dGlvbi4gTm8gaGFyZHdhcmUgcGVyCisgICAgICAgIHNlIGlzIGxpY2Vuc2VkIGhlcmV1bmRlci4KKyAgICAgIDwvbGk+CisgICAgICA8bGk+YykgUmVjaXBpZW50IHVuZGVyc3RhbmRzIHRoYXQgYWx0aG91Z2ggZWFjaCBDb250cmlidXRvciBncmFudHMgdGhlCisgICAgICAgIGxpY2Vuc2VzIHRvIGl0cyBDb250cmlidXRpb25zIHNldCBmb3J0aCBoZXJlaW4sIG5vIGFzc3VyYW5jZXMgYXJlCisgICAgICAgIHByb3ZpZGVkIGJ5IGFueSBDb250cmlidXRvciB0aGF0IHRoZSBQcm9ncmFtIGRvZXMgbm90IGluZnJpbmdlIHRoZQorICAgICAgICBwYXRlbnQgb3Igb3RoZXIgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBvZiBhbnkgb3RoZXIgZW50aXR5LgorICAgICAgICBFYWNoIENvbnRyaWJ1dG9yIGRpc2NsYWltcyBhbnkgbGlhYmlsaXR5IHRvIFJlY2lwaWVudCBmb3IgY2xhaW1zCisgICAgICAgIGJyb3VnaHQgYnkgYW55IG90aGVyIGVudGl0eSBiYXNlZCBvbiBpbmZyaW5nZW1lbnQgb2YgaW50ZWxsZWN0dWFsCisgICAgICAgIHByb3BlcnR5IHJpZ2h0cyBvciBvdGhlcndpc2UuIEFzIGEgY29uZGl0aW9uIHRvIGV4ZXJjaXNpbmcgdGhlIHJpZ2h0cworICAgICAgICBhbmQgbGljZW5zZXMgZ3JhbnRlZCBoZXJldW5kZXIsIGVhY2ggUmVjaXBpZW50IGhlcmVieSBhc3N1bWVzIHNvbGUKKyAgICAgICAgcmVzcG9uc2liaWxpdHkgdG8gc2VjdXJlIGFueSBvdGhlciBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIG5lZWRlZCwKKyAgICAgICAgaWYgYW55LiBGb3IgZXhhbXBsZSwgaWYgYSB0aGlyZCBwYXJ0eSBwYXRlbnQgbGljZW5zZSBpcyByZXF1aXJlZCB0bworICAgICAgICBhbGxvdyBSZWNpcGllbnQgdG8gRGlzdHJpYnV0ZSB0aGUgUHJvZ3JhbSwgaXQgaXMgUmVjaXBpZW50JiMwMzk7cworICAgICAgICByZXNwb25zaWJpbGl0eSB0byBhY3F1aXJlIHRoYXQgbGljZW5zZSBiZWZvcmUgZGlzdHJpYnV0aW5nIHRoZSBQcm9ncmFtLgorICAgICAgPC9saT4KKyAgICAgIDxsaT5kKSBFYWNoIENvbnRyaWJ1dG9yIHJlcHJlc2VudHMgdGhhdCB0byBpdHMga25vd2xlZGdlIGl0IGhhcyBzdWZmaWNpZW50CisgICAgICAgIGNvcHlyaWdodCByaWdodHMgaW4gaXRzIENvbnRyaWJ1dGlvbiwgaWYgYW55LCB0byBncmFudCB0aGUgY29weXJpZ2h0CisgICAgICAgIGxpY2Vuc2Ugc2V0IGZvcnRoIGluIHRoaXMgQWdyZWVtZW50LgorICAgICAgPC9saT4KKyAgICAgIDxsaT5lKSBOb3R3aXRoc3RhbmRpbmcgdGhlIHRlcm1zIG9mIGFueSBTZWNvbmRhcnkgTGljZW5zZSwgbm8gQ29udHJpYnV0b3IKKyAgICAgICAgbWFrZXMgYWRkaXRpb25hbCBncmFudHMgdG8gYW55IFJlY2lwaWVudCAob3RoZXIgdGhhbiB0aG9zZSBzZXQgZm9ydGgKKyAgICAgICAgaW4gdGhpcyBBZ3JlZW1lbnQpIGFzIGEgcmVzdWx0IG9mIHN1Y2ggUmVjaXBpZW50JiMwMzk7cyByZWNlaXB0IG9mIHRoZQorICAgICAgICBQcm9ncmFtIHVuZGVyIHRoZSB0ZXJtcyBvZiBhIFNlY29uZGFyeSBMaWNlbnNlIChpZiBwZXJtaXR0ZWQgdW5kZXIKKyAgICAgICAgdGhlIHRlcm1zIG9mIFNlY3Rpb24gMykuCisgICAgICA8L2xpPgorICAgIDwvdWw+CisgICAgPGgyIGlkPSJyZXF1aXJlbWVudHMiPjMuIFJFUVVJUkVNRU5UUzwvaDI+CisgICAgPHA+My4xIElmIGEgQ29udHJpYnV0b3IgRGlzdHJpYnV0ZXMgdGhlIFByb2dyYW0gaW4gYW55IGZvcm0sIHRoZW46PC9wPgorICAgIDx1bD4KKyAgICAgIDxsaT5hKSB0aGUgUHJvZ3JhbSBtdXN0IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgYXMgU291cmNlIENvZGUsIGluCisgICAgICAgIGFjY29yZGFuY2Ugd2l0aCBzZWN0aW9uIDMuMiwgYW5kIHRoZSBDb250cmlidXRvciBtdXN0IGFjY29tcGFueQorICAgICAgICB0aGUgUHJvZ3JhbSB3aXRoIGEgc3RhdGVtZW50IHRoYXQgdGhlIFNvdXJjZSBDb2RlIGZvciB0aGUgUHJvZ3JhbQorICAgICAgICBpcyBhdmFpbGFibGUgdW5kZXIgdGhpcyBBZ3JlZW1lbnQsIGFuZCBpbmZvcm1zIFJlY2lwaWVudHMgaG93IHRvCisgICAgICAgIG9idGFpbiBpdCBpbiBhIHJlYXNvbmFibGUgbWFubmVyIG9uIG9yIHRocm91Z2ggYSBtZWRpdW0gY3VzdG9tYXJpbHkKKyAgICAgICAgdXNlZCBmb3Igc29mdHdhcmUgZXhjaGFuZ2U7IGFuZAorICAgICAgPC9saT4KKyAgICAgIDxsaT4KKyAgICAgICAgYikgdGhlIENvbnRyaWJ1dG9yIG1heSBEaXN0cmlidXRlIHRoZSBQcm9ncmFtIHVuZGVyIGEgbGljZW5zZQorICAgICAgICBkaWZmZXJlbnQgdGhhbiB0aGlzIEFncmVlbWVudCwgcHJvdmlkZWQgdGhhdCBzdWNoIGxpY2Vuc2U6CisgICAgICAgIDx1bD4KKyAgICAgICAgICA8bGk+aSkgZWZmZWN0aXZlbHkgZGlzY2xhaW1zIG9uIGJlaGFsZiBvZiBhbGwgb3RoZXIgQ29udHJpYnV0b3JzIGFsbAorICAgICAgICAgICAgd2FycmFudGllcyBhbmQgY29uZGl0aW9ucywgZXhwcmVzcyBhbmQgaW1wbGllZCwgaW5jbHVkaW5nIHdhcnJhbnRpZXMKKyAgICAgICAgICAgIG9yIGNvbmRpdGlvbnMgb2YgdGl0bGUgYW5kIG5vbi1pbmZyaW5nZW1lbnQsIGFuZCBpbXBsaWVkIHdhcnJhbnRpZXMKKyAgICAgICAgICAgIG9yIGNvbmRpdGlvbnMgb2YgbWVyY2hhbnRhYmlsaXR5IGFuZCBmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZTsKKyAgICAgICAgICA8L2xpPgorICAgICAgICAgIDxsaT5paSkgZWZmZWN0aXZlbHkgZXhjbHVkZXMgb24gYmVoYWxmIG9mIGFsbCBvdGhlciBDb250cmlidXRvcnMgYWxsCisgICAgICAgICAgICBsaWFiaWxpdHkgZm9yIGRhbWFnZXMsIGluY2x1ZGluZyBkaXJlY3QsIGluZGlyZWN0LCBzcGVjaWFsLCBpbmNpZGVudGFsCisgICAgICAgICAgICBhbmQgY29uc2VxdWVudGlhbCBkYW1hZ2VzLCBzdWNoIGFzIGxvc3QgcHJvZml0czsKKyAgICAgICAgICA8L2xpPgorICAgICAgICAgIDxsaT5paWkpIGRvZXMgbm90IGF0dGVtcHQgdG8gbGltaXQgb3IgYWx0ZXIgdGhlIHJlY2lwaWVudHMmIzAzOTsgcmlnaHRzIGluIHRoZQorICAgICAgICAgICAgU291cmNlIENvZGUgdW5kZXIgc2VjdGlvbiAzLjI7IGFuZAorICAgICAgICAgIDwvbGk+CisgICAgICAgICAgPGxpPml2KSByZXF1aXJlcyBhbnkgc3Vic2VxdWVudCBkaXN0cmlidXRpb24gb2YgdGhlIFByb2dyYW0gYnkgYW55IHBhcnR5CisgICAgICAgICAgICB0byBiZSB1bmRlciBhIGxpY2Vuc2UgdGhhdCBzYXRpc2ZpZXMgdGhlIHJlcXVpcmVtZW50cyBvZiB0aGlzIHNlY3Rpb24gMy4KKyAgICAgICAgICA8L2xpPgorICAgICAgICA8L3VsPgorICAgICAgPC9saT4KKyAgICA8L3VsPgorICAgIDxwPjMuMiBXaGVuIHRoZSBQcm9ncmFtIGlzIERpc3RyaWJ1dGVkIGFzIFNvdXJjZSBDb2RlOjwvcD4KKyAgICA8dWw+CisgICAgICA8bGk+YSkgaXQgbXVzdCBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGlzIEFncmVlbWVudCwgb3IgaWYgdGhlIFByb2dyYW0gKGkpCisgICAgICAgIGlzIGNvbWJpbmVkIHdpdGggb3RoZXIgbWF0ZXJpYWwgaW4gYSBzZXBhcmF0ZSBmaWxlIG9yIGZpbGVzIG1hZGUgYXZhaWxhYmxlCisgICAgICAgIHVuZGVyIGEgU2Vjb25kYXJ5IExpY2Vuc2UsIGFuZCAoaWkpIHRoZSBpbml0aWFsIENvbnRyaWJ1dG9yIGF0dGFjaGVkIHRvCisgICAgICAgIHRoZSBTb3VyY2UgQ29kZSB0aGUgbm90aWNlIGRlc2NyaWJlZCBpbiBFeGhpYml0IEEgb2YgdGhpcyBBZ3JlZW1lbnQsCisgICAgICAgIHRoZW4gdGhlIFByb2dyYW0gbWF5IGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiBzdWNoCisgICAgICAgIFNlY29uZGFyeSBMaWNlbnNlcywgYW5kCisgICAgICA8L2xpPgorICAgICAgPGxpPmIpIGEgY29weSBvZiB0aGlzIEFncmVlbWVudCBtdXN0IGJlIGluY2x1ZGVkIHdpdGggZWFjaCBjb3B5IG9mIHRoZSBQcm9ncmFtLjwvbGk+CisgICAgPC91bD4KKyAgICA8cD4zLjMgQ29udHJpYnV0b3JzIG1heSBub3QgcmVtb3ZlIG9yIGFsdGVyIGFueSBjb3B5cmlnaHQsIHBhdGVudCwgdHJhZGVtYXJrLAorICAgICAgYXR0cmlidXRpb24gbm90aWNlcywgZGlzY2xhaW1lcnMgb2Ygd2FycmFudHksIG9yIGxpbWl0YXRpb25zIG9mIGxpYWJpbGl0eQorICAgICAgKCZsc3F1bztub3RpY2VzJnJzcXVvOykgY29udGFpbmVkIHdpdGhpbiB0aGUgUHJvZ3JhbSBmcm9tIGFueSBjb3B5IG9mIHRoZSBQcm9ncmFtIHdoaWNoCisgICAgICB0aGV5IERpc3RyaWJ1dGUsIHByb3ZpZGVkIHRoYXQgQ29udHJpYnV0b3JzIG1heSBhZGQgdGhlaXIgb3duIGFwcHJvcHJpYXRlCisgICAgICBub3RpY2VzLgorICAgIDwvcD4KKyAgICA8aDIgaWQ9ImNvbW1lcmNpYWwtZGlzdHJpYnV0aW9uIj40LiBDT01NRVJDSUFMIERJU1RSSUJVVElPTjwvaDI+CisgICAgPHA+Q29tbWVyY2lhbCBkaXN0cmlidXRvcnMgb2Ygc29mdHdhcmUgbWF5IGFjY2VwdCBjZXJ0YWluIHJlc3BvbnNpYmlsaXRpZXMKKyAgICAgIHdpdGggcmVzcGVjdCB0byBlbmQgdXNlcnMsIGJ1c2luZXNzIHBhcnRuZXJzIGFuZCB0aGUgbGlrZS4gV2hpbGUgdGhpcworICAgICAgbGljZW5zZSBpcyBpbnRlbmRlZCB0byBmYWNpbGl0YXRlIHRoZSBjb21tZXJjaWFsIHVzZSBvZiB0aGUgUHJvZ3JhbSwgdGhlCisgICAgICBDb250cmlidXRvciB3aG8gaW5jbHVkZXMgdGhlIFByb2dyYW0gaW4gYSBjb21tZXJjaWFsIHByb2R1Y3Qgb2ZmZXJpbmcgc2hvdWxkCisgICAgICBkbyBzbyBpbiBhIG1hbm5lciB3aGljaCBkb2VzIG5vdCBjcmVhdGUgcG90ZW50aWFsIGxpYWJpbGl0eSBmb3Igb3RoZXIKKyAgICAgIENvbnRyaWJ1dG9ycy4gVGhlcmVmb3JlLCBpZiBhIENvbnRyaWJ1dG9yIGluY2x1ZGVzIHRoZSBQcm9ncmFtIGluIGEKKyAgICAgIGNvbW1lcmNpYWwgcHJvZHVjdCBvZmZlcmluZywgc3VjaCBDb250cmlidXRvciAoJmxkcXVvO0NvbW1lcmNpYWwgQ29udHJpYnV0b3ImcmRxdW87KQorICAgICAgaGVyZWJ5IGFncmVlcyB0byBkZWZlbmQgYW5kIGluZGVtbmlmeSBldmVyeSBvdGhlciBDb250cmlidXRvcgorICAgICAgKCZsZHF1bztJbmRlbW5pZmllZCBDb250cmlidXRvciZyZHF1bzspIGFnYWluc3QgYW55IGxvc3NlcywgZGFtYWdlcyBhbmQgY29zdHMKKyAgICAgIChjb2xsZWN0aXZlbHkgJmxkcXVvO0xvc3NlcyZyZHF1bzspIGFyaXNpbmcgZnJvbSBjbGFpbXMsIGxhd3N1aXRzIGFuZCBvdGhlciBsZWdhbCBhY3Rpb25zCisgICAgICBicm91Z2h0IGJ5IGEgdGhpcmQgcGFydHkgYWdhaW5zdCB0aGUgSW5kZW1uaWZpZWQgQ29udHJpYnV0b3IgdG8gdGhlIGV4dGVudAorICAgICAgY2F1c2VkIGJ5IHRoZSBhY3RzIG9yIG9taXNzaW9ucyBvZiBzdWNoIENvbW1lcmNpYWwgQ29udHJpYnV0b3IgaW4gY29ubmVjdGlvbgorICAgICAgd2l0aCBpdHMgZGlzdHJpYnV0aW9uIG9mIHRoZSBQcm9ncmFtIGluIGEgY29tbWVyY2lhbCBwcm9kdWN0IG9mZmVyaW5nLgorICAgICAgVGhlIG9ibGlnYXRpb25zIGluIHRoaXMgc2VjdGlvbiBkbyBub3QgYXBwbHkgdG8gYW55IGNsYWltcyBvciBMb3NzZXMgcmVsYXRpbmcKKyAgICAgIHRvIGFueSBhY3R1YWwgb3IgYWxsZWdlZCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgaW5mcmluZ2VtZW50LiBJbiBvcmRlciB0bworICAgICAgcXVhbGlmeSwgYW4gSW5kZW1uaWZpZWQgQ29udHJpYnV0b3IgbXVzdDogYSkgcHJvbXB0bHkgbm90aWZ5IHRoZQorICAgICAgQ29tbWVyY2lhbCBDb250cmlidXRvciBpbiB3cml0aW5nIG9mIHN1Y2ggY2xhaW0sIGFuZCBiKSBhbGxvdyB0aGUgQ29tbWVyY2lhbAorICAgICAgQ29udHJpYnV0b3IgdG8gY29udHJvbCwgYW5kIGNvb3BlcmF0ZSB3aXRoIHRoZSBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIGluLAorICAgICAgdGhlIGRlZmVuc2UgYW5kIGFueSByZWxhdGVkIHNldHRsZW1lbnQgbmVnb3RpYXRpb25zLiBUaGUgSW5kZW1uaWZpZWQKKyAgICAgIENvbnRyaWJ1dG9yIG1heSBwYXJ0aWNpcGF0ZSBpbiBhbnkgc3VjaCBjbGFpbSBhdCBpdHMgb3duIGV4cGVuc2UuCisgICAgPC9wPgorICAgIDxwPkZvciBleGFtcGxlLCBhIENvbnRyaWJ1dG9yIG1pZ2h0IGluY2x1ZGUgdGhlIFByb2dyYW0KKyAgICAgIGluIGEgY29tbWVyY2lhbCBwcm9kdWN0IG9mZmVyaW5nLCBQcm9kdWN0IFguIFRoYXQgQ29udHJpYnV0b3IgaXMgdGhlbiBhCisgICAgICBDb21tZXJjaWFsIENvbnRyaWJ1dG9yLiBJZiB0aGF0IENvbW1lcmNpYWwgQ29udHJpYnV0b3IgdGhlbiBtYWtlcyBwZXJmb3JtYW5jZQorICAgICAgY2xhaW1zLCBvciBvZmZlcnMgd2FycmFudGllcyByZWxhdGVkIHRvIFByb2R1Y3QgWCwgdGhvc2UgcGVyZm9ybWFuY2UgY2xhaW1zCisgICAgICBhbmQgd2FycmFudGllcyBhcmUgc3VjaCBDb21tZXJjaWFsIENvbnRyaWJ1dG9yJiMwMzk7cyByZXNwb25zaWJpbGl0eSBhbG9uZS4KKyAgICAgIFVuZGVyIHRoaXMgc2VjdGlvbiwgdGhlIENvbW1lcmNpYWwgQ29udHJpYnV0b3Igd291bGQgaGF2ZSB0byBkZWZlbmQgY2xhaW1zCisgICAgICBhZ2FpbnN0IHRoZSBvdGhlciBDb250cmlidXRvcnMgcmVsYXRlZCB0byB0aG9zZSBwZXJmb3JtYW5jZSBjbGFpbXMgYW5kCisgICAgICB3YXJyYW50aWVzLCBhbmQgaWYgYSBjb3VydCByZXF1aXJlcyBhbnkgb3RoZXIgQ29udHJpYnV0b3IgdG8gcGF5IGFueSBkYW1hZ2VzCisgICAgICBhcyBhIHJlc3VsdCwgdGhlIENvbW1lcmNpYWwgQ29udHJpYnV0b3IgbXVzdCBwYXkgdGhvc2UgZGFtYWdlcy4KKyAgICA8L3A+CisgICAgPGgyIGlkPSJ3YXJyYW50eSI+NS4gTk8gV0FSUkFOVFk8L2gyPgorICAgIDxwPkVYQ0VQVCBBUyBFWFBSRVNTTFkgU0VUIEZPUlRIIElOIFRISVMgQUdSRUVNRU5ULCBBTkQgVE8gVEhFIEVYVEVOVCBQRVJNSVRURUQKKyAgICAgIEJZIEFQUExJQ0FCTEUgTEFXLCBUSEUgUFJPR1JBTSBJUyBQUk9WSURFRCBPTiBBTiAmbGRxdW87QVMgSVMmcmRxdW87IEJBU0lTLCBXSVRIT1VUCisgICAgICBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIEVJVEhFUiBFWFBSRVNTIE9SIElNUExJRUQgSU5DTFVESU5HLAorICAgICAgV0lUSE9VVCBMSU1JVEFUSU9OLCBBTlkgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIFRJVExFLCBOT04tSU5GUklOR0VNRU5ULAorICAgICAgTUVSQ0hBTlRBQklMSVRZIE9SIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBFYWNoIFJlY2lwaWVudCBpcworICAgICAgc29sZWx5IHJlc3BvbnNpYmxlIGZvciBkZXRlcm1pbmluZyB0aGUgYXBwcm9wcmlhdGVuZXNzIG9mIHVzaW5nIGFuZAorICAgICAgZGlzdHJpYnV0aW5nIHRoZSBQcm9ncmFtIGFuZCBhc3N1bWVzIGFsbCByaXNrcyBhc3NvY2lhdGVkIHdpdGggaXRzCisgICAgICBleGVyY2lzZSBvZiByaWdodHMgdW5kZXIgdGhpcyBBZ3JlZW1lbnQsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlCisgICAgICByaXNrcyBhbmQgY29zdHMgb2YgcHJvZ3JhbSBlcnJvcnMsIGNvbXBsaWFuY2Ugd2l0aCBhcHBsaWNhYmxlIGxhd3MsIGRhbWFnZQorICAgICAgdG8gb3IgbG9zcyBvZiBkYXRhLCBwcm9ncmFtcyBvciBlcXVpcG1lbnQsIGFuZCB1bmF2YWlsYWJpbGl0eSBvcgorICAgICAgaW50ZXJydXB0aW9uIG9mIG9wZXJhdGlvbnMuCisgICAgPC9wPgorICAgIDxoMiBpZD0iZGlzY2xhaW1lciI+Ni4gRElTQ0xBSU1FUiBPRiBMSUFCSUxJVFk8L2gyPgorICAgIDxwPkVYQ0VQVCBBUyBFWFBSRVNTTFkgU0VUIEZPUlRIIElOIFRISVMgQUdSRUVNRU5ULCBBTkQgVE8gVEhFIEVYVEVOVCBQRVJNSVRURUQKKyAgICAgIEJZIEFQUExJQ0FCTEUgTEFXLCBORUlUSEVSIFJFQ0lQSUVOVCBOT1IgQU5ZIENPTlRSSUJVVE9SUyBTSEFMTCBIQVZFIEFOWQorICAgICAgTElBQklMSVRZIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLAorICAgICAgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcgV0lUSE9VVCBMSU1JVEFUSU9OIExPU1QgUFJPRklUUyksCisgICAgICBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICAgICAgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQorICAgICAgT1VUIE9GIFRIRSBVU0UgT1IgRElTVFJJQlVUSU9OIE9GIFRIRSBQUk9HUkFNIE9SIFRIRSBFWEVSQ0lTRSBPRiBBTlkgUklHSFRTCisgICAgICBHUkFOVEVEIEhFUkVVTkRFUiwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRVMuCisgICAgPC9wPgorICAgIDxoMiBpZD0iZ2VuZXJhbCI+Ny4gR0VORVJBTDwvaDI+CisgICAgPHA+SWYgYW55IHByb3Zpc2lvbiBvZiB0aGlzIEFncmVlbWVudCBpcyBpbnZhbGlkIG9yIHVuZW5mb3JjZWFibGUgdW5kZXIKKyAgICAgIGFwcGxpY2FibGUgbGF3LCBpdCBzaGFsbCBub3QgYWZmZWN0IHRoZSB2YWxpZGl0eSBvciBlbmZvcmNlYWJpbGl0eSBvZiB0aGUKKyAgICAgIHJlbWFpbmRlciBvZiB0aGUgdGVybXMgb2YgdGhpcyBBZ3JlZW1lbnQsIGFuZCB3aXRob3V0IGZ1cnRoZXIgYWN0aW9uIGJ5IHRoZQorICAgICAgcGFydGllcyBoZXJldG8sIHN1Y2ggcHJvdmlzaW9uIHNoYWxsIGJlIHJlZm9ybWVkIHRvIHRoZSBtaW5pbXVtIGV4dGVudAorICAgICAgbmVjZXNzYXJ5IHRvIG1ha2Ugc3VjaCBwcm92aXNpb24gdmFsaWQgYW5kIGVuZm9yY2VhYmxlLgorICAgIDwvcD4KKyAgICA8cD5JZiBSZWNpcGllbnQgaW5zdGl0dXRlcyBwYXRlbnQgbGl0aWdhdGlvbiBhZ2FpbnN0IGFueSBlbnRpdHkgKGluY2x1ZGluZyBhCisgICAgICBjcm9zcy1jbGFpbSBvciBjb3VudGVyY2xhaW0gaW4gYSBsYXdzdWl0KSBhbGxlZ2luZyB0aGF0IHRoZSBQcm9ncmFtIGl0c2VsZgorICAgICAgKGV4Y2x1ZGluZyBjb21iaW5hdGlvbnMgb2YgdGhlIFByb2dyYW0gd2l0aCBvdGhlciBzb2Z0d2FyZSBvciBoYXJkd2FyZSkKKyAgICAgIGluZnJpbmdlcyBzdWNoIFJlY2lwaWVudCYjMDM5O3MgcGF0ZW50KHMpLCB0aGVuIHN1Y2ggUmVjaXBpZW50JiMwMzk7cyByaWdodHMgZ3JhbnRlZAorICAgICAgdW5kZXIgU2VjdGlvbiAyKGIpIHNoYWxsIHRlcm1pbmF0ZSBhcyBvZiB0aGUgZGF0ZSBzdWNoIGxpdGlnYXRpb24gaXMgZmlsZWQuCisgICAgPC9wPgorICAgIDxwPkFsbCBSZWNpcGllbnQmIzAzOTtzIHJpZ2h0cyB1bmRlciB0aGlzIEFncmVlbWVudCBzaGFsbCB0ZXJtaW5hdGUgaWYgaXQgZmFpbHMgdG8KKyAgICAgIGNvbXBseSB3aXRoIGFueSBvZiB0aGUgbWF0ZXJpYWwgdGVybXMgb3IgY29uZGl0aW9ucyBvZiB0aGlzIEFncmVlbWVudCBhbmQKKyAgICAgIGRvZXMgbm90IGN1cmUgc3VjaCBmYWlsdXJlIGluIGEgcmVhc29uYWJsZSBwZXJpb2Qgb2YgdGltZSBhZnRlciBiZWNvbWluZworICAgICAgYXdhcmUgb2Ygc3VjaCBub25jb21wbGlhbmNlLiBJZiBhbGwgUmVjaXBpZW50JiMwMzk7cyByaWdodHMgdW5kZXIgdGhpcyBBZ3JlZW1lbnQKKyAgICAgIHRlcm1pbmF0ZSwgUmVjaXBpZW50IGFncmVlcyB0byBjZWFzZSB1c2UgYW5kIGRpc3RyaWJ1dGlvbiBvZiB0aGUgUHJvZ3JhbQorICAgICAgYXMgc29vbiBhcyByZWFzb25hYmx5IHByYWN0aWNhYmxlLiBIb3dldmVyLCBSZWNpcGllbnQmIzAzOTtzIG9ibGlnYXRpb25zIHVuZGVyCisgICAgICB0aGlzIEFncmVlbWVudCBhbmQgYW55IGxpY2Vuc2VzIGdyYW50ZWQgYnkgUmVjaXBpZW50IHJlbGF0aW5nIHRvIHRoZQorICAgICAgUHJvZ3JhbSBzaGFsbCBjb250aW51ZSBhbmQgc3Vydml2ZS4KKyAgICA8L3A+CisgICAgPHA+RXZlcnlvbmUgaXMgcGVybWl0dGVkIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUgY29waWVzIG9mIHRoaXMgQWdyZWVtZW50LAorICAgICAgYnV0IGluIG9yZGVyIHRvIGF2b2lkIGluY29uc2lzdGVuY3kgdGhlIEFncmVlbWVudCBpcyBjb3B5cmlnaHRlZCBhbmQgbWF5CisgICAgICBvbmx5IGJlIG1vZGlmaWVkIGluIHRoZSBmb2xsb3dpbmcgbWFubmVyLiBUaGUgQWdyZWVtZW50IFN0ZXdhcmQgcmVzZXJ2ZXMKKyAgICAgIHRoZSByaWdodCB0byBwdWJsaXNoIG5ldyB2ZXJzaW9ucyAoaW5jbHVkaW5nIHJldmlzaW9ucykgb2YgdGhpcyBBZ3JlZW1lbnQKKyAgICAgIGZyb20gdGltZSB0byB0aW1lLiBObyBvbmUgb3RoZXIgdGhhbiB0aGUgQWdyZWVtZW50IFN0ZXdhcmQgaGFzIHRoZSByaWdodAorICAgICAgdG8gbW9kaWZ5IHRoaXMgQWdyZWVtZW50LiBUaGUgRWNsaXBzZSBGb3VuZGF0aW9uIGlzIHRoZSBpbml0aWFsIEFncmVlbWVudAorICAgICAgU3Rld2FyZC4gVGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYXkgYXNzaWduIHRoZSByZXNwb25zaWJpbGl0eSB0byBzZXJ2ZSBhcworICAgICAgdGhlIEFncmVlbWVudCBTdGV3YXJkIHRvIGEgc3VpdGFibGUgc2VwYXJhdGUgZW50aXR5LiBFYWNoIG5ldyB2ZXJzaW9uIG9mCisgICAgICB0aGUgQWdyZWVtZW50IHdpbGwgYmUgZ2l2ZW4gYSBkaXN0aW5ndWlzaGluZyB2ZXJzaW9uIG51bWJlci4gVGhlIFByb2dyYW0KKyAgICAgIChpbmNsdWRpbmcgQ29udHJpYnV0aW9ucykgbWF5IGFsd2F5cyBiZSBEaXN0cmlidXRlZCBzdWJqZWN0IHRvIHRoZSB2ZXJzaW9uCisgICAgICBvZiB0aGUgQWdyZWVtZW50IHVuZGVyIHdoaWNoIGl0IHdhcyByZWNlaXZlZC4gSW4gYWRkaXRpb24sIGFmdGVyIGEgbmV3CisgICAgICB2ZXJzaW9uIG9mIHRoZSBBZ3JlZW1lbnQgaXMgcHVibGlzaGVkLCBDb250cmlidXRvciBtYXkgZWxlY3QgdG8gRGlzdHJpYnV0ZQorICAgICAgdGhlIFByb2dyYW0gKGluY2x1ZGluZyBpdHMgQ29udHJpYnV0aW9ucykgdW5kZXIgdGhlIG5ldyB2ZXJzaW9uLgorICAgIDwvcD4KKyAgICA8cD5FeGNlcHQgYXMgZXhwcmVzc2x5IHN0YXRlZCBpbiBTZWN0aW9ucyAyKGEpIGFuZCAyKGIpIGFib3ZlLCBSZWNpcGllbnQKKyAgICAgIHJlY2VpdmVzIG5vIHJpZ2h0cyBvciBsaWNlbnNlcyB0byB0aGUgaW50ZWxsZWN0dWFsIHByb3BlcnR5IG9mIGFueQorICAgICAgQ29udHJpYnV0b3IgdW5kZXIgdGhpcyBBZ3JlZW1lbnQsIHdoZXRoZXIgZXhwcmVzc2x5LCBieSBpbXBsaWNhdGlvbiwKKyAgICAgIGVzdG9wcGVsIG9yIG90aGVyd2lzZS4gQWxsIHJpZ2h0cyBpbiB0aGUgUHJvZ3JhbSBub3QgZXhwcmVzc2x5IGdyYW50ZWQKKyAgICAgIHVuZGVyIHRoaXMgQWdyZWVtZW50IGFyZSByZXNlcnZlZC4gTm90aGluZyBpbiB0aGlzIEFncmVlbWVudCBpcyBpbnRlbmRlZAorICAgICAgdG8gYmUgZW5mb3JjZWFibGUgYnkgYW55IGVudGl0eSB0aGF0IGlzIG5vdCBhIENvbnRyaWJ1dG9yIG9yIFJlY2lwaWVudC4KKyAgICAgIE5vIHRoaXJkLXBhcnR5IGJlbmVmaWNpYXJ5IHJpZ2h0cyBhcmUgY3JlYXRlZCB1bmRlciB0aGlzIEFncmVlbWVudC4KKyAgICA8L3A+CisgICAgPGgyIGlkPSJleGhpYml0LWEiPkV4aGliaXQgQSAmbmRhc2g7IEZvcm0gb2YgU2Vjb25kYXJ5IExpY2Vuc2VzIE5vdGljZTwvaDI+CisgICAgPHA+JmxkcXVvO1RoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyAKKyAgICAJU2Vjb25kYXJ5IExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCAKKyAgICAJaW4gdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UsIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiB7bmFtZSBsaWNlbnNlKHMpLAorICAgIAl2ZXJzaW9uKHMpLCBhbmQgZXhjZXB0aW9ucyBvciBhZGRpdGlvbmFsIHBlcm1pc3Npb25zIGhlcmV9LiZyZHF1bzsKKyAgICA8L3A+CisgICAgPGJsb2NrcXVvdGU+CisgICAgICA8cD5TaW1wbHkgaW5jbHVkaW5nIGEgY29weSBvZiB0aGlzIEFncmVlbWVudCwgaW5jbHVkaW5nIHRoaXMgRXhoaWJpdCBBCisgICAgICAgIGlzIG5vdCBzdWZmaWNpZW50IHRvIGxpY2Vuc2UgdGhlIFNvdXJjZSBDb2RlIHVuZGVyIFNlY29uZGFyeSBMaWNlbnNlcy4KKyAgICAgIDwvcD4KKyAgICAgIDxwPklmIGl0IGlzIG5vdCBwb3NzaWJsZSBvciBkZXNpcmFibGUgdG8gcHV0IHRoZSBub3RpY2UgaW4gYSBwYXJ0aWN1bGFyIGZpbGUsCisgICAgICAgIHRoZW4gWW91IG1heSBpbmNsdWRlIHRoZSBub3RpY2UgaW4gYSBsb2NhdGlvbiAoc3VjaCBhcyBhIExJQ0VOU0UgZmlsZSBpbiBhCisgICAgICAgIHJlbGV2YW50IGRpcmVjdG9yeSkgd2hlcmUgYSByZWNpcGllbnQgd291bGQgYmUgbGlrZWx5IHRvIGxvb2sgZm9yCisgICAgICAgIHN1Y2ggYSBub3RpY2UuCisgICAgICA8L3A+CisgICAgICA8cD5Zb3UgbWF5IGFkZCBhZGRpdGlvbmFsIGFjY3VyYXRlIG5vdGljZXMgb2YgY29weXJpZ2h0IG93bmVyc2hpcC48L3A+CisgICAgPC9ibG9ja3F1b3RlPgorICA8L2JvZHk+Cis8L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5kYXRhaW50ZXJjaGFuZ2UudWkvZXBsLXYxMC5odG1sIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5kYXRhaW50ZXJjaGFuZ2UudWkvZXBsLXYxMC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMzk4YWNjLi4wMDAwMDAwCi0tLSBhL29yZy5lY2xpcHNlLm9zYnAueHRleHQuZGF0YWludGVyY2hhbmdlLnVpL2VwbC12MTAuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDI1OSArMCwwIEBACi08IS0tP3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJJU08tODg1OS0xIiA/LS0+Ci08IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCI+PGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1JU08tODg1OS0xIj4KLTx0aXRsZT5FY2xpcHNlIFB1YmxpYyBMaWNlbnNlIC0gVmVyc2lvbiAxLjA8L3RpdGxlPgotPHN0eWxlIHR5cGU9InRleHQvY3NzIj4KLSAgYm9keSB7Ci0gICAgc2l6ZTogOC41aW4gMTEuMGluOwotICAgIG1hcmdpbjogMC4yNWluIDAuNWluIDAuMjVpbiAwLjVpbjsKLSAgICB0YWItaW50ZXJ2YWw6IDAuNWluOwotICAgIH0KLSAgcCB7ICAJCi0gICAgbWFyZ2luLWxlZnQ6IGF1dG87Ci0gICAgbWFyZ2luLXRvcDogIDAuNWVtOwotICAgIG1hcmdpbi1ib3R0b206IDAuNWVtOwotICAgIH0KLSAgcC5saXN0IHsKLSAgCW1hcmdpbi1sZWZ0OiAwLjVpbjsKLSAgICBtYXJnaW4tdG9wOiAgMC4wNWVtOwotICAgIG1hcmdpbi1ib3R0b206IDAuMDVlbTsKLSAgICB9Ci0gIDwvc3R5bGU+Ci0KLTwvaGVhZD4KLQotPGJvZHkgbGFuZz0iRU4tVVMiPgotCi08aDI+RWNsaXBzZSBQdWJsaWMgTGljZW5zZSAtIHYgMS4wPC9oMj4KLQotPHA+VEhFIEFDQ09NUEFOWUlORyBQUk9HUkFNIElTIFBST1ZJREVEIFVOREVSIFRIRSBURVJNUyBPRiBUSElTIEVDTElQU0UKLVBVQkxJQyBMSUNFTlNFICgiQUdSRUVNRU5UIikuIEFOWSBVU0UsIFJFUFJPRFVDVElPTiBPUgotRElTVFJJQlVUSU9OIE9GIFRIRSBQUk9HUkFNIENPTlNUSVRVVEVTIFJFQ0lQSUVOVCdTIEFDQ0VQVEFOQ0UgT0YgVEhJUwotQUdSRUVNRU5ULjwvcD4KLQotPHA+PGI+MS4gREVGSU5JVElPTlM8L2I+PC9wPgotCi08cD4iQ29udHJpYnV0aW9uIiBtZWFuczo8L3A+Ci0KLTxwIGNsYXNzPSJsaXN0Ij5hKSBpbiB0aGUgY2FzZSBvZiB0aGUgaW5pdGlhbCBDb250cmlidXRvciwgdGhlIGluaXRpYWwKLWNvZGUgYW5kIGRvY3VtZW50YXRpb24gZGlzdHJpYnV0ZWQgdW5kZXIgdGhpcyBBZ3JlZW1lbnQsIGFuZDwvcD4KLTxwIGNsYXNzPSJsaXN0Ij5iKSBpbiB0aGUgY2FzZSBvZiBlYWNoIHN1YnNlcXVlbnQgQ29udHJpYnV0b3I6PC9wPgotPHAgY2xhc3M9Imxpc3QiPmkpIGNoYW5nZXMgdG8gdGhlIFByb2dyYW0sIGFuZDwvcD4KLTxwIGNsYXNzPSJsaXN0Ij5paSkgYWRkaXRpb25zIHRvIHRoZSBQcm9ncmFtOzwvcD4KLTxwIGNsYXNzPSJsaXN0Ij53aGVyZSBzdWNoIGNoYW5nZXMgYW5kL29yIGFkZGl0aW9ucyB0byB0aGUgUHJvZ3JhbQotb3JpZ2luYXRlIGZyb20gYW5kIGFyZSBkaXN0cmlidXRlZCBieSB0aGF0IHBhcnRpY3VsYXIgQ29udHJpYnV0b3IuIEEKLUNvbnRyaWJ1dGlvbiAnb3JpZ2luYXRlcycgZnJvbSBhIENvbnRyaWJ1dG9yIGlmIGl0IHdhcyBhZGRlZCB0byB0aGUKLVByb2dyYW0gYnkgc3VjaCBDb250cmlidXRvciBpdHNlbGYgb3IgYW55b25lIGFjdGluZyBvbiBzdWNoCi1Db250cmlidXRvcidzIGJlaGFsZi4gQ29udHJpYnV0aW9ucyBkbyBub3QgaW5jbHVkZSBhZGRpdGlvbnMgdG8gdGhlCi1Qcm9ncmFtIHdoaWNoOiAoaSkgYXJlIHNlcGFyYXRlIG1vZHVsZXMgb2Ygc29mdHdhcmUgZGlzdHJpYnV0ZWQgaW4KLWNvbmp1bmN0aW9uIHdpdGggdGhlIFByb2dyYW0gdW5kZXIgdGhlaXIgb3duIGxpY2Vuc2UgYWdyZWVtZW50LCBhbmQgKGlpKQotYXJlIG5vdCBkZXJpdmF0aXZlIHdvcmtzIG9mIHRoZSBQcm9ncmFtLjwvcD4KLQotPHA+IkNvbnRyaWJ1dG9yIiBtZWFucyBhbnkgcGVyc29uIG9yIGVudGl0eSB0aGF0IGRpc3RyaWJ1dGVzCi10aGUgUHJvZ3JhbS48L3A+Ci0KLTxwPiJMaWNlbnNlZCBQYXRlbnRzIiBtZWFuIHBhdGVudCBjbGFpbXMgbGljZW5zYWJsZSBieSBhCi1Db250cmlidXRvciB3aGljaCBhcmUgbmVjZXNzYXJpbHkgaW5mcmluZ2VkIGJ5IHRoZSB1c2Ugb3Igc2FsZSBvZiBpdHMKLUNvbnRyaWJ1dGlvbiBhbG9uZSBvciB3aGVuIGNvbWJpbmVkIHdpdGggdGhlIFByb2dyYW0uPC9wPgotCi08cD4iUHJvZ3JhbSIgbWVhbnMgdGhlIENvbnRyaWJ1dGlvbnMgZGlzdHJpYnV0ZWQgaW4gYWNjb3JkYW5jZQotd2l0aCB0aGlzIEFncmVlbWVudC48L3A+Ci0KLTxwPiJSZWNpcGllbnQiIG1lYW5zIGFueW9uZSB3aG8gcmVjZWl2ZXMgdGhlIFByb2dyYW0gdW5kZXIKLXRoaXMgQWdyZWVtZW50LCBpbmNsdWRpbmcgYWxsIENvbnRyaWJ1dG9ycy48L3A+Ci0KLTxwPjxiPjIuIEdSQU5UIE9GIFJJR0hUUzwvYj48L3A+Ci0KLTxwIGNsYXNzPSJsaXN0Ij5hKSBTdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGlzIEFncmVlbWVudCwgZWFjaAotQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyBSZWNpcGllbnQgYSBub24tZXhjbHVzaXZlLCB3b3JsZHdpZGUsCi1yb3lhbHR5LWZyZWUgY29weXJpZ2h0IGxpY2Vuc2UgdG8gcmVwcm9kdWNlLCBwcmVwYXJlIGRlcml2YXRpdmUgd29ya3MKLW9mLCBwdWJsaWNseSBkaXNwbGF5LCBwdWJsaWNseSBwZXJmb3JtLCBkaXN0cmlidXRlIGFuZCBzdWJsaWNlbnNlIHRoZQotQ29udHJpYnV0aW9uIG9mIHN1Y2ggQ29udHJpYnV0b3IsIGlmIGFueSwgYW5kIHN1Y2ggZGVyaXZhdGl2ZSB3b3JrcywgaW4KLXNvdXJjZSBjb2RlIGFuZCBvYmplY3QgY29kZSBmb3JtLjwvcD4KLQotPHAgY2xhc3M9Imxpc3QiPmIpIFN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoaXMgQWdyZWVtZW50LCBlYWNoCi1Db250cmlidXRvciBoZXJlYnkgZ3JhbnRzIFJlY2lwaWVudCBhIG5vbi1leGNsdXNpdmUsIHdvcmxkd2lkZSwKLXJveWFsdHktZnJlZSBwYXRlbnQgbGljZW5zZSB1bmRlciBMaWNlbnNlZCBQYXRlbnRzIHRvIG1ha2UsIHVzZSwgc2VsbCwKLW9mZmVyIHRvIHNlbGwsIGltcG9ydCBhbmQgb3RoZXJ3aXNlIHRyYW5zZmVyIHRoZSBDb250cmlidXRpb24gb2Ygc3VjaAotQ29udHJpYnV0b3IsIGlmIGFueSwgaW4gc291cmNlIGNvZGUgYW5kIG9iamVjdCBjb2RlIGZvcm0uIFRoaXMgcGF0ZW50Ci1saWNlbnNlIHNoYWxsIGFwcGx5IHRvIHRoZSBjb21iaW5hdGlvbiBvZiB0aGUgQ29udHJpYnV0aW9uIGFuZCB0aGUKLVByb2dyYW0gaWYsIGF0IHRoZSB0aW1lIHRoZSBDb250cmlidXRpb24gaXMgYWRkZWQgYnkgdGhlIENvbnRyaWJ1dG9yLAotc3VjaCBhZGRpdGlvbiBvZiB0aGUgQ29udHJpYnV0aW9uIGNhdXNlcyBzdWNoIGNvbWJpbmF0aW9uIHRvIGJlIGNvdmVyZWQKLWJ5IHRoZSBMaWNlbnNlZCBQYXRlbnRzLiBUaGUgcGF0ZW50IGxpY2Vuc2Ugc2hhbGwgbm90IGFwcGx5IHRvIGFueSBvdGhlcgotY29tYmluYXRpb25zIHdoaWNoIGluY2x1ZGUgdGhlIENvbnRyaWJ1dGlvbi4gTm8gaGFyZHdhcmUgcGVyIHNlIGlzCi1saWNlbnNlZCBoZXJldW5kZXIuPC9wPgotCi08cCBjbGFzcz0ibGlzdCI+YykgUmVjaXBpZW50IHVuZGVyc3RhbmRzIHRoYXQgYWx0aG91Z2ggZWFjaCBDb250cmlidXRvcgotZ3JhbnRzIHRoZSBsaWNlbnNlcyB0byBpdHMgQ29udHJpYnV0aW9ucyBzZXQgZm9ydGggaGVyZWluLCBubyBhc3N1cmFuY2VzCi1hcmUgcHJvdmlkZWQgYnkgYW55IENvbnRyaWJ1dG9yIHRoYXQgdGhlIFByb2dyYW0gZG9lcyBub3QgaW5mcmluZ2UgdGhlCi1wYXRlbnQgb3Igb3RoZXIgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBvZiBhbnkgb3RoZXIgZW50aXR5LiBFYWNoCi1Db250cmlidXRvciBkaXNjbGFpbXMgYW55IGxpYWJpbGl0eSB0byBSZWNpcGllbnQgZm9yIGNsYWltcyBicm91Z2h0IGJ5Ci1hbnkgb3RoZXIgZW50aXR5IGJhc2VkIG9uIGluZnJpbmdlbWVudCBvZiBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzCi1vciBvdGhlcndpc2UuIEFzIGEgY29uZGl0aW9uIHRvIGV4ZXJjaXNpbmcgdGhlIHJpZ2h0cyBhbmQgbGljZW5zZXMKLWdyYW50ZWQgaGVyZXVuZGVyLCBlYWNoIFJlY2lwaWVudCBoZXJlYnkgYXNzdW1lcyBzb2xlIHJlc3BvbnNpYmlsaXR5IHRvCi1zZWN1cmUgYW55IG90aGVyIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgbmVlZGVkLCBpZiBhbnkuIEZvcgotZXhhbXBsZSwgaWYgYSB0aGlyZCBwYXJ0eSBwYXRlbnQgbGljZW5zZSBpcyByZXF1aXJlZCB0byBhbGxvdyBSZWNpcGllbnQKLXRvIGRpc3RyaWJ1dGUgdGhlIFByb2dyYW0sIGl0IGlzIFJlY2lwaWVudCdzIHJlc3BvbnNpYmlsaXR5IHRvIGFjcXVpcmUKLXRoYXQgbGljZW5zZSBiZWZvcmUgZGlzdHJpYnV0aW5nIHRoZSBQcm9ncmFtLjwvcD4KLQotPHAgY2xhc3M9Imxpc3QiPmQpIEVhY2ggQ29udHJpYnV0b3IgcmVwcmVzZW50cyB0aGF0IHRvIGl0cyBrbm93bGVkZ2UgaXQKLWhhcyBzdWZmaWNpZW50IGNvcHlyaWdodCByaWdodHMgaW4gaXRzIENvbnRyaWJ1dGlvbiwgaWYgYW55LCB0byBncmFudAotdGhlIGNvcHlyaWdodCBsaWNlbnNlIHNldCBmb3J0aCBpbiB0aGlzIEFncmVlbWVudC48L3A+Ci0KLTxwPjxiPjMuIFJFUVVJUkVNRU5UUzwvYj48L3A+Ci0KLTxwPkEgQ29udHJpYnV0b3IgbWF5IGNob29zZSB0byBkaXN0cmlidXRlIHRoZSBQcm9ncmFtIGluIG9iamVjdCBjb2RlCi1mb3JtIHVuZGVyIGl0cyBvd24gbGljZW5zZSBhZ3JlZW1lbnQsIHByb3ZpZGVkIHRoYXQ6PC9wPgotCi08cCBjbGFzcz0ibGlzdCI+YSkgaXQgY29tcGxpZXMgd2l0aCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhpcwotQWdyZWVtZW50OyBhbmQ8L3A+Ci0KLTxwIGNsYXNzPSJsaXN0Ij5iKSBpdHMgbGljZW5zZSBhZ3JlZW1lbnQ6PC9wPgotCi08cCBjbGFzcz0ibGlzdCI+aSkgZWZmZWN0aXZlbHkgZGlzY2xhaW1zIG9uIGJlaGFsZiBvZiBhbGwgQ29udHJpYnV0b3JzCi1hbGwgd2FycmFudGllcyBhbmQgY29uZGl0aW9ucywgZXhwcmVzcyBhbmQgaW1wbGllZCwgaW5jbHVkaW5nIHdhcnJhbnRpZXMKLW9yIGNvbmRpdGlvbnMgb2YgdGl0bGUgYW5kIG5vbi1pbmZyaW5nZW1lbnQsIGFuZCBpbXBsaWVkIHdhcnJhbnRpZXMgb3IKLWNvbmRpdGlvbnMgb2YgbWVyY2hhbnRhYmlsaXR5IGFuZCBmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZTs8L3A+Ci0KLTxwIGNsYXNzPSJsaXN0Ij5paSkgZWZmZWN0aXZlbHkgZXhjbHVkZXMgb24gYmVoYWxmIG9mIGFsbCBDb250cmlidXRvcnMKLWFsbCBsaWFiaWxpdHkgZm9yIGRhbWFnZXMsIGluY2x1ZGluZyBkaXJlY3QsIGluZGlyZWN0LCBzcGVjaWFsLAotaW5jaWRlbnRhbCBhbmQgY29uc2VxdWVudGlhbCBkYW1hZ2VzLCBzdWNoIGFzIGxvc3QgcHJvZml0czs8L3A+Ci0KLTxwIGNsYXNzPSJsaXN0Ij5paWkpIHN0YXRlcyB0aGF0IGFueSBwcm92aXNpb25zIHdoaWNoIGRpZmZlciBmcm9tIHRoaXMKLUFncmVlbWVudCBhcmUgb2ZmZXJlZCBieSB0aGF0IENvbnRyaWJ1dG9yIGFsb25lIGFuZCBub3QgYnkgYW55IG90aGVyCi1wYXJ0eTsgYW5kPC9wPgotCi08cCBjbGFzcz0ibGlzdCI+aXYpIHN0YXRlcyB0aGF0IHNvdXJjZSBjb2RlIGZvciB0aGUgUHJvZ3JhbSBpcyBhdmFpbGFibGUKLWZyb20gc3VjaCBDb250cmlidXRvciwgYW5kIGluZm9ybXMgbGljZW5zZWVzIGhvdyB0byBvYnRhaW4gaXQgaW4gYQotcmVhc29uYWJsZSBtYW5uZXIgb24gb3IgdGhyb3VnaCBhIG1lZGl1bSBjdXN0b21hcmlseSB1c2VkIGZvciBzb2Z0d2FyZQotZXhjaGFuZ2UuPC9wPgotCi08cD5XaGVuIHRoZSBQcm9ncmFtIGlzIG1hZGUgYXZhaWxhYmxlIGluIHNvdXJjZSBjb2RlIGZvcm06PC9wPgotCi08cCBjbGFzcz0ibGlzdCI+YSkgaXQgbXVzdCBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGlzIEFncmVlbWVudDsgYW5kPC9wPgotCi08cCBjbGFzcz0ibGlzdCI+YikgYSBjb3B5IG9mIHRoaXMgQWdyZWVtZW50IG11c3QgYmUgaW5jbHVkZWQgd2l0aCBlYWNoCi1jb3B5IG9mIHRoZSBQcm9ncmFtLjwvcD4KLQotPHA+Q29udHJpYnV0b3JzIG1heSBub3QgcmVtb3ZlIG9yIGFsdGVyIGFueSBjb3B5cmlnaHQgbm90aWNlcyBjb250YWluZWQKLXdpdGhpbiB0aGUgUHJvZ3JhbS48L3A+Ci0KLTxwPkVhY2ggQ29udHJpYnV0b3IgbXVzdCBpZGVudGlmeSBpdHNlbGYgYXMgdGhlIG9yaWdpbmF0b3Igb2YgaXRzCi1Db250cmlidXRpb24sIGlmIGFueSwgaW4gYSBtYW5uZXIgdGhhdCByZWFzb25hYmx5IGFsbG93cyBzdWJzZXF1ZW50Ci1SZWNpcGllbnRzIHRvIGlkZW50aWZ5IHRoZSBvcmlnaW5hdG9yIG9mIHRoZSBDb250cmlidXRpb24uPC9wPgotCi08cD48Yj40LiBDT01NRVJDSUFMIERJU1RSSUJVVElPTjwvYj48L3A+Ci0KLTxwPkNvbW1lcmNpYWwgZGlzdHJpYnV0b3JzIG9mIHNvZnR3YXJlIG1heSBhY2NlcHQgY2VydGFpbgotcmVzcG9uc2liaWxpdGllcyB3aXRoIHJlc3BlY3QgdG8gZW5kIHVzZXJzLCBidXNpbmVzcyBwYXJ0bmVycyBhbmQgdGhlCi1saWtlLiBXaGlsZSB0aGlzIGxpY2Vuc2UgaXMgaW50ZW5kZWQgdG8gZmFjaWxpdGF0ZSB0aGUgY29tbWVyY2lhbCB1c2Ugb2YKLXRoZSBQcm9ncmFtLCB0aGUgQ29udHJpYnV0b3Igd2hvIGluY2x1ZGVzIHRoZSBQcm9ncmFtIGluIGEgY29tbWVyY2lhbAotcHJvZHVjdCBvZmZlcmluZyBzaG91bGQgZG8gc28gaW4gYSBtYW5uZXIgd2hpY2ggZG9lcyBub3QgY3JlYXRlCi1wb3RlbnRpYWwgbGlhYmlsaXR5IGZvciBvdGhlciBDb250cmlidXRvcnMuIFRoZXJlZm9yZSwgaWYgYSBDb250cmlidXRvcgotaW5jbHVkZXMgdGhlIFByb2dyYW0gaW4gYSBjb21tZXJjaWFsIHByb2R1Y3Qgb2ZmZXJpbmcsIHN1Y2ggQ29udHJpYnV0b3IKLSgiQ29tbWVyY2lhbCBDb250cmlidXRvciIpIGhlcmVieSBhZ3JlZXMgdG8gZGVmZW5kIGFuZAotaW5kZW1uaWZ5IGV2ZXJ5IG90aGVyIENvbnRyaWJ1dG9yICgiSW5kZW1uaWZpZWQgQ29udHJpYnV0b3IiKQotYWdhaW5zdCBhbnkgbG9zc2VzLCBkYW1hZ2VzIGFuZCBjb3N0cyAoY29sbGVjdGl2ZWx5ICJMb3NzZXMiKQotYXJpc2luZyBmcm9tIGNsYWltcywgbGF3c3VpdHMgYW5kIG90aGVyIGxlZ2FsIGFjdGlvbnMgYnJvdWdodCBieSBhIHRoaXJkCi1wYXJ0eSBhZ2FpbnN0IHRoZSBJbmRlbW5pZmllZCBDb250cmlidXRvciB0byB0aGUgZXh0ZW50IGNhdXNlZCBieSB0aGUKLWFjdHMgb3Igb21pc3Npb25zIG9mIHN1Y2ggQ29tbWVyY2lhbCBDb250cmlidXRvciBpbiBjb25uZWN0aW9uIHdpdGggaXRzCi1kaXN0cmlidXRpb24gb2YgdGhlIFByb2dyYW0gaW4gYSBjb21tZXJjaWFsIHByb2R1Y3Qgb2ZmZXJpbmcuIFRoZQotb2JsaWdhdGlvbnMgaW4gdGhpcyBzZWN0aW9uIGRvIG5vdCBhcHBseSB0byBhbnkgY2xhaW1zIG9yIExvc3NlcwotcmVsYXRpbmcgdG8gYW55IGFjdHVhbCBvciBhbGxlZ2VkIGludGVsbGVjdHVhbCBwcm9wZXJ0eSBpbmZyaW5nZW1lbnQuIEluCi1vcmRlciB0byBxdWFsaWZ5LCBhbiBJbmRlbW5pZmllZCBDb250cmlidXRvciBtdXN0OiBhKSBwcm9tcHRseSBub3RpZnkKLXRoZSBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIGluIHdyaXRpbmcgb2Ygc3VjaCBjbGFpbSwgYW5kIGIpIGFsbG93IHRoZQotQ29tbWVyY2lhbCBDb250cmlidXRvciB0byBjb250cm9sLCBhbmQgY29vcGVyYXRlIHdpdGggdGhlIENvbW1lcmNpYWwKLUNvbnRyaWJ1dG9yIGluLCB0aGUgZGVmZW5zZSBhbmQgYW55IHJlbGF0ZWQgc2V0dGxlbWVudCBuZWdvdGlhdGlvbnMuIFRoZQotSW5kZW1uaWZpZWQgQ29udHJpYnV0b3IgbWF5IHBhcnRpY2lwYXRlIGluIGFueSBzdWNoIGNsYWltIGF0IGl0cyBvd24KLWV4cGVuc2UuPC9wPgotCi08cD5Gb3IgZXhhbXBsZSwgYSBDb250cmlidXRvciBtaWdodCBpbmNsdWRlIHRoZSBQcm9ncmFtIGluIGEgY29tbWVyY2lhbAotcHJvZHVjdCBvZmZlcmluZywgUHJvZHVjdCBYLiBUaGF0IENvbnRyaWJ1dG9yIGlzIHRoZW4gYSBDb21tZXJjaWFsCi1Db250cmlidXRvci4gSWYgdGhhdCBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIHRoZW4gbWFrZXMgcGVyZm9ybWFuY2UKLWNsYWltcywgb3Igb2ZmZXJzIHdhcnJhbnRpZXMgcmVsYXRlZCB0byBQcm9kdWN0IFgsIHRob3NlIHBlcmZvcm1hbmNlCi1jbGFpbXMgYW5kIHdhcnJhbnRpZXMgYXJlIHN1Y2ggQ29tbWVyY2lhbCBDb250cmlidXRvcidzIHJlc3BvbnNpYmlsaXR5Ci1hbG9uZS4gVW5kZXIgdGhpcyBzZWN0aW9uLCB0aGUgQ29tbWVyY2lhbCBDb250cmlidXRvciB3b3VsZCBoYXZlIHRvCi1kZWZlbmQgY2xhaW1zIGFnYWluc3QgdGhlIG90aGVyIENvbnRyaWJ1dG9ycyByZWxhdGVkIHRvIHRob3NlCi1wZXJmb3JtYW5jZSBjbGFpbXMgYW5kIHdhcnJhbnRpZXMsIGFuZCBpZiBhIGNvdXJ0IHJlcXVpcmVzIGFueSBvdGhlcgotQ29udHJpYnV0b3IgdG8gcGF5IGFueSBkYW1hZ2VzIGFzIGEgcmVzdWx0LCB0aGUgQ29tbWVyY2lhbCBDb250cmlidXRvcgotbXVzdCBwYXkgdGhvc2UgZGFtYWdlcy48L3A+Ci0KLTxwPjxiPjUuIE5PIFdBUlJBTlRZPC9iPjwvcD4KLQotPHA+RVhDRVBUIEFTIEVYUFJFU1NMWSBTRVQgRk9SVEggSU4gVEhJUyBBR1JFRU1FTlQsIFRIRSBQUk9HUkFNIElTCi1QUk9WSURFRCBPTiBBTiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUwotT0YgQU5ZIEtJTkQsIEVJVEhFUiBFWFBSRVNTIE9SIElNUExJRUQgSU5DTFVESU5HLCBXSVRIT1VUIExJTUlUQVRJT04sCi1BTlkgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIFRJVExFLCBOT04tSU5GUklOR0VNRU5ULCBNRVJDSEFOVEFCSUxJVFkKLU9SIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBFYWNoIFJlY2lwaWVudCBpcyBzb2xlbHkKLXJlc3BvbnNpYmxlIGZvciBkZXRlcm1pbmluZyB0aGUgYXBwcm9wcmlhdGVuZXNzIG9mIHVzaW5nIGFuZAotZGlzdHJpYnV0aW5nIHRoZSBQcm9ncmFtIGFuZCBhc3N1bWVzIGFsbCByaXNrcyBhc3NvY2lhdGVkIHdpdGggaXRzCi1leGVyY2lzZSBvZiByaWdodHMgdW5kZXIgdGhpcyBBZ3JlZW1lbnQgLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvCi10aGUgcmlza3MgYW5kIGNvc3RzIG9mIHByb2dyYW0gZXJyb3JzLCBjb21wbGlhbmNlIHdpdGggYXBwbGljYWJsZSBsYXdzLAotZGFtYWdlIHRvIG9yIGxvc3Mgb2YgZGF0YSwgcHJvZ3JhbXMgb3IgZXF1aXBtZW50LCBhbmQgdW5hdmFpbGFiaWxpdHkgb3IKLWludGVycnVwdGlvbiBvZiBvcGVyYXRpb25zLjwvcD4KLQotPHA+PGI+Ni4gRElTQ0xBSU1FUiBPRiBMSUFCSUxJVFk8L2I+PC9wPgotCi08cD5FWENFUFQgQVMgRVhQUkVTU0xZIFNFVCBGT1JUSCBJTiBUSElTIEFHUkVFTUVOVCwgTkVJVEhFUiBSRUNJUElFTlQKLU5PUiBBTlkgQ09OVFJJQlVUT1JTIFNIQUxMIEhBVkUgQU5ZIExJQUJJTElUWSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCi1JTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HCi1XSVRIT1VUIExJTUlUQVRJT04gTE9TVCBQUk9GSVRTKSwgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YKLUxJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HCi1ORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9SCi1ESVNUUklCVVRJT04gT0YgVEhFIFBST0dSQU0gT1IgVEhFIEVYRVJDSVNFIE9GIEFOWSBSSUdIVFMgR1JBTlRFRAotSEVSRVVOREVSLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFUy48L3A+Ci0KLTxwPjxiPjcuIEdFTkVSQUw8L2I+PC9wPgotCi08cD5JZiBhbnkgcHJvdmlzaW9uIG9mIHRoaXMgQWdyZWVtZW50IGlzIGludmFsaWQgb3IgdW5lbmZvcmNlYWJsZSB1bmRlcgotYXBwbGljYWJsZSBsYXcsIGl0IHNoYWxsIG5vdCBhZmZlY3QgdGhlIHZhbGlkaXR5IG9yIGVuZm9yY2VhYmlsaXR5IG9mCi10aGUgcmVtYWluZGVyIG9mIHRoZSB0ZXJtcyBvZiB0aGlzIEFncmVlbWVudCwgYW5kIHdpdGhvdXQgZnVydGhlciBhY3Rpb24KLWJ5IHRoZSBwYXJ0aWVzIGhlcmV0bywgc3VjaCBwcm92aXNpb24gc2hhbGwgYmUgcmVmb3JtZWQgdG8gdGhlIG1pbmltdW0KLWV4dGVudCBuZWNlc3NhcnkgdG8gbWFrZSBzdWNoIHByb3Zpc2lvbiB2YWxpZCBhbmQgZW5mb3JjZWFibGUuPC9wPgotCi08cD5JZiBSZWNpcGllbnQgaW5zdGl0dXRlcyBwYXRlbnQgbGl0aWdhdGlvbiBhZ2FpbnN0IGFueSBlbnRpdHkKLShpbmNsdWRpbmcgYSBjcm9zcy1jbGFpbSBvciBjb3VudGVyY2xhaW0gaW4gYSBsYXdzdWl0KSBhbGxlZ2luZyB0aGF0IHRoZQotUHJvZ3JhbSBpdHNlbGYgKGV4Y2x1ZGluZyBjb21iaW5hdGlvbnMgb2YgdGhlIFByb2dyYW0gd2l0aCBvdGhlcgotc29mdHdhcmUgb3IgaGFyZHdhcmUpIGluZnJpbmdlcyBzdWNoIFJlY2lwaWVudCdzIHBhdGVudChzKSwgdGhlbiBzdWNoCi1SZWNpcGllbnQncyByaWdodHMgZ3JhbnRlZCB1bmRlciBTZWN0aW9uIDIoYikgc2hhbGwgdGVybWluYXRlIGFzIG9mIHRoZQotZGF0ZSBzdWNoIGxpdGlnYXRpb24gaXMgZmlsZWQuPC9wPgotCi08cD5BbGwgUmVjaXBpZW50J3MgcmlnaHRzIHVuZGVyIHRoaXMgQWdyZWVtZW50IHNoYWxsIHRlcm1pbmF0ZSBpZiBpdAotZmFpbHMgdG8gY29tcGx5IHdpdGggYW55IG9mIHRoZSBtYXRlcmlhbCB0ZXJtcyBvciBjb25kaXRpb25zIG9mIHRoaXMKLUFncmVlbWVudCBhbmQgZG9lcyBub3QgY3VyZSBzdWNoIGZhaWx1cmUgaW4gYSByZWFzb25hYmxlIHBlcmlvZCBvZiB0aW1lCi1hZnRlciBiZWNvbWluZyBhd2FyZSBvZiBzdWNoIG5vbmNvbXBsaWFuY2UuIElmIGFsbCBSZWNpcGllbnQncyByaWdodHMKLXVuZGVyIHRoaXMgQWdyZWVtZW50IHRlcm1pbmF0ZSwgUmVjaXBpZW50IGFncmVlcyB0byBjZWFzZSB1c2UgYW5kCi1kaXN0cmlidXRpb24gb2YgdGhlIFByb2dyYW0gYXMgc29vbiBhcyByZWFzb25hYmx5IHByYWN0aWNhYmxlLiBIb3dldmVyLAotUmVjaXBpZW50J3Mgb2JsaWdhdGlvbnMgdW5kZXIgdGhpcyBBZ3JlZW1lbnQgYW5kIGFueSBsaWNlbnNlcyBncmFudGVkIGJ5Ci1SZWNpcGllbnQgcmVsYXRpbmcgdG8gdGhlIFByb2dyYW0gc2hhbGwgY29udGludWUgYW5kIHN1cnZpdmUuPC9wPgotCi08cD5FdmVyeW9uZSBpcyBwZXJtaXR0ZWQgdG8gY29weSBhbmQgZGlzdHJpYnV0ZSBjb3BpZXMgb2YgdGhpcwotQWdyZWVtZW50LCBidXQgaW4gb3JkZXIgdG8gYXZvaWQgaW5jb25zaXN0ZW5jeSB0aGUgQWdyZWVtZW50IGlzCi1jb3B5cmlnaHRlZCBhbmQgbWF5IG9ubHkgYmUgbW9kaWZpZWQgaW4gdGhlIGZvbGxvd2luZyBtYW5uZXIuIFRoZQotQWdyZWVtZW50IFN0ZXdhcmQgcmVzZXJ2ZXMgdGhlIHJpZ2h0IHRvIHB1Ymxpc2ggbmV3IHZlcnNpb25zIChpbmNsdWRpbmcKLXJldmlzaW9ucykgb2YgdGhpcyBBZ3JlZW1lbnQgZnJvbSB0aW1lIHRvIHRpbWUuIE5vIG9uZSBvdGhlciB0aGFuIHRoZQotQWdyZWVtZW50IFN0ZXdhcmQgaGFzIHRoZSByaWdodCB0byBtb2RpZnkgdGhpcyBBZ3JlZW1lbnQuIFRoZSBFY2xpcHNlCi1Gb3VuZGF0aW9uIGlzIHRoZSBpbml0aWFsIEFncmVlbWVudCBTdGV3YXJkLiBUaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1heQotYXNzaWduIHRoZSByZXNwb25zaWJpbGl0eSB0byBzZXJ2ZSBhcyB0aGUgQWdyZWVtZW50IFN0ZXdhcmQgdG8gYQotc3VpdGFibGUgc2VwYXJhdGUgZW50aXR5LiBFYWNoIG5ldyB2ZXJzaW9uIG9mIHRoZSBBZ3JlZW1lbnQgd2lsbCBiZQotZ2l2ZW4gYSBkaXN0aW5ndWlzaGluZyB2ZXJzaW9uIG51bWJlci4gVGhlIFByb2dyYW0gKGluY2x1ZGluZwotQ29udHJpYnV0aW9ucykgbWF5IGFsd2F5cyBiZSBkaXN0cmlidXRlZCBzdWJqZWN0IHRvIHRoZSB2ZXJzaW9uIG9mIHRoZQotQWdyZWVtZW50IHVuZGVyIHdoaWNoIGl0IHdhcyByZWNlaXZlZC4gSW4gYWRkaXRpb24sIGFmdGVyIGEgbmV3IHZlcnNpb24KLW9mIHRoZSBBZ3JlZW1lbnQgaXMgcHVibGlzaGVkLCBDb250cmlidXRvciBtYXkgZWxlY3QgdG8gZGlzdHJpYnV0ZSB0aGUKLVByb2dyYW0gKGluY2x1ZGluZyBpdHMgQ29udHJpYnV0aW9ucykgdW5kZXIgdGhlIG5ldyB2ZXJzaW9uLiBFeGNlcHQgYXMKLWV4cHJlc3NseSBzdGF0ZWQgaW4gU2VjdGlvbnMgMihhKSBhbmQgMihiKSBhYm92ZSwgUmVjaXBpZW50IHJlY2VpdmVzIG5vCi1yaWdodHMgb3IgbGljZW5zZXMgdG8gdGhlIGludGVsbGVjdHVhbCBwcm9wZXJ0eSBvZiBhbnkgQ29udHJpYnV0b3IgdW5kZXIKLXRoaXMgQWdyZWVtZW50LCB3aGV0aGVyIGV4cHJlc3NseSwgYnkgaW1wbGljYXRpb24sIGVzdG9wcGVsIG9yCi1vdGhlcndpc2UuIEFsbCByaWdodHMgaW4gdGhlIFByb2dyYW0gbm90IGV4cHJlc3NseSBncmFudGVkIHVuZGVyIHRoaXMKLUFncmVlbWVudCBhcmUgcmVzZXJ2ZWQuPC9wPgotCi08cD5UaGlzIEFncmVlbWVudCBpcyBnb3Zlcm5lZCBieSB0aGUgbGF3cyBvZiB0aGUgU3RhdGUgb2YgTmV3IFlvcmsgYW5kCi10aGUgaW50ZWxsZWN0dWFsIHByb3BlcnR5IGxhd3Mgb2YgdGhlIFVuaXRlZCBTdGF0ZXMgb2YgQW1lcmljYS4gTm8gcGFydHkKLXRvIHRoaXMgQWdyZWVtZW50IHdpbGwgYnJpbmcgYSBsZWdhbCBhY3Rpb24gdW5kZXIgdGhpcyBBZ3JlZW1lbnQgbW9yZQotdGhhbiBvbmUgeWVhciBhZnRlciB0aGUgY2F1c2Ugb2YgYWN0aW9uIGFyb3NlLiBFYWNoIHBhcnR5IHdhaXZlcyBpdHMKLXJpZ2h0cyB0byBhIGp1cnkgdHJpYWwgaW4gYW55IHJlc3VsdGluZyBsaXRpZ2F0aW9uLjwvcD4KLQotCi0KLTwvYm9keT48L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5kYXRhaW50ZXJjaGFuZ2UudWkvbGljZW5zZS5odG1sIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5kYXRhaW50ZXJjaGFuZ2UudWkvbGljZW5zZS5odG1sCmluZGV4IDZlNTc5YTUuLjAwOGI4MDEgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLm9zYnAueHRleHQuZGF0YWludGVyY2hhbmdlLnVpL2xpY2Vuc2UuaHRtbAorKysgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmRhdGFpbnRlcmNoYW5nZS51aS9saWNlbnNlLmh0bWwKQEAgLTEsMTY0ICsxLDE4OSBAQAotPCEtLT94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iSVNPLTg4NTktMSIgPy0tPgorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iSVNPLTg4NTktMSIgPz4KIDwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFN0cmljdC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS1zdHJpY3QuZHRkIj4KLTxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIj48aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTEiPgorPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiPgorPGhlYWQ+Cis8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1JU08tODg1OS0xIiAvPgogPHRpdGxlPkVjbGlwc2UgRm91bmRhdGlvbiBTb2Z0d2FyZSBVc2VyIEFncmVlbWVudDwvdGl0bGU+CiA8L2hlYWQ+CiAKIDxib2R5IGxhbmc9IkVOLVVTIj4KLTxoMj5FY2xpcHNlIEZvdW5kYXRpb24gU29mdHdhcmUgVXNlciBBZ3JlZW1lbnQ8L2gyPgotPHA+RmVicnVhcnkgMSwgMjAxMTwvcD4KKwk8aDI+RWNsaXBzZSBGb3VuZGF0aW9uIFNvZnR3YXJlIFVzZXIgQWdyZWVtZW50PC9oMj4KKwk8cD5Ob3ZlbWJlciAyMiwgMjAxNzwvcD4KIAotPGgzPlVzYWdlIE9mIENvbnRlbnQ8L2gzPgorCTxoMz5Vc2FnZSBPZiBDb250ZW50PC9oMz4KIAotPHA+VEhFIEVDTElQU0UgRk9VTkRBVElPTiBNQUtFUyBBVkFJTEFCTEUgU09GVFdBUkUsIERPQ1VNRU5UQVRJT04sIElORk9STUFUSU9OIEFORC9PUiBPVEhFUiBNQVRFUklBTFMgRk9SIE9QRU4gU09VUkNFIFBST0pFQ1RTCi0gICAoQ09MTEVDVElWRUxZICJDT05URU5UIikuICBVU0UgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVMgQUdSRUVNRU5UIEFORC9PUiBUSEUgVEVSTVMgQU5ECi0gICBDT05ESVRJT05TIE9GIExJQ0VOU0UgQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiAgQlkgVVNJTkcgVEhFIENPTlRFTlQsIFlPVSBBR1JFRSBUSEFUIFlPVVIgVVNFCi0gICBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSElTIEFHUkVFTUVOVCBBTkQvT1IgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UUyBPUgotICAgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gIElGIFlPVSBETyBOT1QgQUdSRUUgVE8gVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVMgQUdSRUVNRU5UIEFORCBUSEUgVEVSTVMgQU5ECi0gICBDT05ESVRJT05TIE9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLCBUSEVOIFlPVSBNQVkgTk9UIFVTRSBUSEUgQ09OVEVOVC48L3A+CisJPHA+VEhFIEVDTElQU0UgRk9VTkRBVElPTiBNQUtFUyBBVkFJTEFCTEUgU09GVFdBUkUsIERPQ1VNRU5UQVRJT04sCisJCUlORk9STUFUSU9OIEFORC9PUiBPVEhFUiBNQVRFUklBTFMgRk9SIE9QRU4gU09VUkNFIFBST0pFQ1RTCisJCShDT0xMRUNUSVZFTFkgJnF1b3Q7Q09OVEVOVCZxdW90OykuIFVTRSBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWQorCQlUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJUyBBR1JFRU1FTlQgQU5EL09SIFRIRSBURVJNUyBBTkQKKwkJQ09ORElUSU9OUyBPRiBMSUNFTlNFIEFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRAorCQlCRUxPVy4gQlkgVVNJTkcgVEhFIENPTlRFTlQsIFlPVSBBR1JFRSBUSEFUIFlPVVIgVVNFIE9GIFRIRSBDT05URU5UIElTCisJCUdPVkVSTkVEIEJZIFRISVMgQUdSRUVNRU5UIEFORC9PUiBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgQU5ZCisJCUFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQKKwkJQkVMT1cuIElGIFlPVSBETyBOT1QgQUdSRUUgVE8gVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVMKKwkJQUdSRUVNRU5UIEFORCBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRQorCQlBR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1csIFRIRU4gWU9VIE1BWSBOT1QKKwkJVVNFIFRIRSBDT05URU5ULjwvcD4KIAotPGgzPkFwcGxpY2FibGUgTGljZW5zZXM8L2gzPgorCTxoMz5BcHBsaWNhYmxlIExpY2Vuc2VzPC9oMz4KIAotPHA+VW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQsIGFsbCBDb250ZW50IG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlCi0gRm91bmRhdGlvbiBpcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSAKLUVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAKLSAgICgiRVBMIikuICBBIGNvcHkgb2YgdGhlIEVQTCBpcyBwcm92aWRlZCB3aXRoIHRoaXMgQ29udGVudCBhbmQgaXMgYWxzbwotIGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWw8L2E+LgotICAgRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICJQcm9ncmFtIiB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9wPgorCTxwPgorCQlVbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCwgYWxsIENvbnRlbnQgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UKKwkJRm91bmRhdGlvbiBpcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZQorCQlFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMi4wICgmcXVvdDtFUEwmcXVvdDspLiBBIGNvcHkgb2YgdGhlCisJCUVQTCBpcyBwcm92aWRlZCB3aXRoIHRoaXMgQ29udGVudCBhbmQgaXMgYWxzbyBhdmFpbGFibGUgYXQgPGEKKwkJCWhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wPC9hPi4KKwkJRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICZxdW90O1Byb2dyYW0mcXVvdDsgd2lsbCBtZWFuIHRoZSBDb250ZW50LgorCTwvcD4KIAotPHA+Q29udGVudCBpbmNsdWRlcywgYnV0IGlzIG5vdCBsaW1pdGVkIHRvLCBzb3VyY2UgY29kZSwgb2JqZWN0IGNvZGUsIAotZG9jdW1lbnRhdGlvbiBhbmQgb3RoZXIgZmlsZXMgbWFpbnRhaW5lZCBpbiB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIAotc291cmNlIGNvZGUKLSAgIHJlcG9zaXRvcnkgKCJSZXBvc2l0b3J5IikgaW4gc29mdHdhcmUgbW9kdWxlcyAoIk1vZHVsZXMiKSBhbmQgbWFkZSAKLWF2YWlsYWJsZSBhcyBkb3dubG9hZGFibGUgYXJjaGl2ZXMgKCJEb3dubG9hZHMiKS48L3A+CisJPHA+Q29udGVudCBpbmNsdWRlcywgYnV0IGlzIG5vdCBsaW1pdGVkIHRvLCBzb3VyY2UgY29kZSwgb2JqZWN0CisJCWNvZGUsIGRvY3VtZW50YXRpb24gYW5kIG90aGVyIGZpbGVzIG1haW50YWluZWQgaW4gdGhlIEVjbGlwc2UKKwkJRm91bmRhdGlvbiBzb3VyY2UgY29kZSByZXBvc2l0b3J5ICgmcXVvdDtSZXBvc2l0b3J5JnF1b3Q7KSBpbiBzb2Z0d2FyZQorCQltb2R1bGVzICgmcXVvdDtNb2R1bGVzJnF1b3Q7KSBhbmQgbWFkZSBhdmFpbGFibGUgYXMgZG93bmxvYWRhYmxlCisJCWFyY2hpdmVzICgmcXVvdDtEb3dubG9hZHMmcXVvdDspLjwvcD4KIAotPHVsPgotICAgICAgIDxsaT5Db250ZW50IG1heSBiZSBzdHJ1Y3R1cmVkIGFuZCBwYWNrYWdlZCBpbnRvIG1vZHVsZXMgdG8gCi1mYWNpbGl0YXRlIGRlbGl2ZXJpbmcsIGV4dGVuZGluZywgYW5kIHVwZ3JhZGluZyB0aGUgQ29udGVudC4gIFR5cGljYWwgCi1tb2R1bGVzIG1heSBpbmNsdWRlIHBsdWctaW5zICgiUGx1Zy1pbnMiKSwgcGx1Zy1pbiBmcmFnbWVudHMgCi0oIkZyYWdtZW50cyIpLCBhbmQgZmVhdHVyZXMgKCJGZWF0dXJlcyIpLjwvbGk+Ci0gICAgICAgPGxpPkVhY2ggUGx1Zy1pbiBvciBGcmFnbWVudCBtYXkgYmUgcGFja2FnZWQgYXMgYSBzdWItZGlyZWN0b3J5IG9yIEpBUiAoSmF2YSYjODQ4MjsgQVJjaGl2ZSkgaW4gYSBkaXJlY3RvcnkgbmFtZWQgInBsdWdpbnMiLjwvbGk+Ci0gICAgICAgPGxpPkEgRmVhdHVyZSBpcyBhIGJ1bmRsZSBvZiBvbmUgb3IgbW9yZSBQbHVnLWlucyBhbmQvb3IgCi1GcmFnbWVudHMgYW5kIGFzc29jaWF0ZWQgbWF0ZXJpYWwuICBFYWNoIEZlYXR1cmUgbWF5IGJlIHBhY2thZ2VkIGFzIGEgCi1zdWItZGlyZWN0b3J5IGluIGEgZGlyZWN0b3J5IG5hbWVkICJmZWF0dXJlcyIuICBXaXRoaW4gYSBGZWF0dXJlLCBmaWxlcyAKLW5hbWVkICJmZWF0dXJlLnhtbCIgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIAotb2YgdGhlIFBsdWctaW5zCi0gICAgICBhbmQvb3IgRnJhZ21lbnRzIGFzc29jaWF0ZWQgd2l0aCB0aGF0IEZlYXR1cmUuPC9saT4KLSAgICAgICA8bGk+RmVhdHVyZXMgbWF5IGFsc28gaW5jbHVkZSBvdGhlciBGZWF0dXJlcyAoIkluY2x1ZGVkIAotRmVhdHVyZXMiKS4gV2l0aGluIGEgRmVhdHVyZSwgZmlsZXMgbmFtZWQgImZlYXR1cmUueG1sIiBtYXkgY29udGFpbiBhIAotbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZiBJbmNsdWRlZCBGZWF0dXJlcy48L2xpPgotPC91bD4KKwk8dWw+CisJCTxsaT5Db250ZW50IG1heSBiZSBzdHJ1Y3R1cmVkIGFuZCBwYWNrYWdlZCBpbnRvIG1vZHVsZXMgdG8KKwkJCWZhY2lsaXRhdGUgZGVsaXZlcmluZywgZXh0ZW5kaW5nLCBhbmQgdXBncmFkaW5nIHRoZSBDb250ZW50LiBUeXBpY2FsCisJCQltb2R1bGVzIG1heSBpbmNsdWRlIHBsdWctaW5zICgmcXVvdDtQbHVnLWlucyZxdW90OyksIHBsdWctaW4KKwkJCWZyYWdtZW50cyAoJnF1b3Q7RnJhZ21lbnRzJnF1b3Q7KSwgYW5kIGZlYXR1cmVzCisJCQkoJnF1b3Q7RmVhdHVyZXMmcXVvdDspLjwvbGk+CisJCTxsaT5FYWNoIFBsdWctaW4gb3IgRnJhZ21lbnQgbWF5IGJlIHBhY2thZ2VkIGFzIGEgc3ViLWRpcmVjdG9yeQorCQkJb3IgSkFSIChKYXZhJnRyYWRlOyBBUmNoaXZlKSBpbiBhIGRpcmVjdG9yeSBuYW1lZAorCQkJJnF1b3Q7cGx1Z2lucyZxdW90Oy48L2xpPgorCQk8bGk+QSBGZWF0dXJlIGlzIGEgYnVuZGxlIG9mIG9uZSBvciBtb3JlIFBsdWctaW5zIGFuZC9vcgorCQkJRnJhZ21lbnRzIGFuZCBhc3NvY2lhdGVkIG1hdGVyaWFsLiBFYWNoIEZlYXR1cmUgbWF5IGJlIHBhY2thZ2VkIGFzIGEKKwkJCXN1Yi1kaXJlY3RvcnkgaW4gYSBkaXJlY3RvcnkgbmFtZWQgJnF1b3Q7ZmVhdHVyZXMmcXVvdDsuIFdpdGhpbiBhCisJCQlGZWF0dXJlLCBmaWxlcyBuYW1lZCAmcXVvdDtmZWF0dXJlLnhtbCZxdW90OyBtYXkgY29udGFpbiBhIGxpc3Qgb2YKKwkJCXRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mIHRoZSBQbHVnLWlucyBhbmQvb3IgRnJhZ21lbnRzCisJCQlhc3NvY2lhdGVkIHdpdGggdGhhdCBGZWF0dXJlLjwvbGk+CisJCTxsaT5GZWF0dXJlcyBtYXkgYWxzbyBpbmNsdWRlIG90aGVyIEZlYXR1cmVzICgmcXVvdDtJbmNsdWRlZAorCQkJRmVhdHVyZXMmcXVvdDspLiBXaXRoaW4gYSBGZWF0dXJlLCBmaWxlcyBuYW1lZAorCQkJJnF1b3Q7ZmVhdHVyZS54bWwmcXVvdDsgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbgorCQkJbnVtYmVycyBvZiBJbmNsdWRlZCBGZWF0dXJlcy48L2xpPgorCTwvdWw+CiAKLTxwPlRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBzaG91bGQgYmUgCi1jb250YWluZWQgaW4gZmlsZXMgbmFtZWQgImFib3V0Lmh0bWwiICgiQWJvdXRzIikuIFRoZSB0ZXJtcyBhbmQgCi1jb25kaXRpb25zIGdvdmVybmluZyBGZWF0dXJlcyBhbmQKLUluY2x1ZGVkIEZlYXR1cmVzIHNob3VsZCBiZSBjb250YWluZWQgaW4gZmlsZXMgbmFtZWQgImxpY2Vuc2UuaHRtbCIgCi0oIkZlYXR1cmUgTGljZW5zZXMiKS4gIEFib3V0cyBhbmQgRmVhdHVyZSBMaWNlbnNlcyBtYXkgYmUgbG9jYXRlZCBpbiBhbnkKLSBkaXJlY3Rvcnkgb2YgYSBEb3dubG9hZCBvciBNb2R1bGUKLWluY2x1ZGluZywgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBmb2xsb3dpbmcgbG9jYXRpb25zOjwvcD4KKwk8cD5UaGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgc2hvdWxkCisJCWJlIGNvbnRhaW5lZCBpbiBmaWxlcyBuYW1lZCAmcXVvdDthYm91dC5odG1sJnF1b3Q7CisJCSgmcXVvdDtBYm91dHMmcXVvdDspLiBUaGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIEZlYXR1cmVzIGFuZAorCQlJbmNsdWRlZCBGZWF0dXJlcyBzaG91bGQgYmUgY29udGFpbmVkIGluIGZpbGVzIG5hbWVkCisJCSZxdW90O2xpY2Vuc2UuaHRtbCZxdW90OyAoJnF1b3Q7RmVhdHVyZSBMaWNlbnNlcyZxdW90OykuIEFib3V0cyBhbmQKKwkJRmVhdHVyZSBMaWNlbnNlcyBtYXkgYmUgbG9jYXRlZCBpbiBhbnkgZGlyZWN0b3J5IG9mIGEgRG93bmxvYWQgb3IKKwkJTW9kdWxlIGluY2x1ZGluZywgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBmb2xsb3dpbmcgbG9jYXRpb25zOjwvcD4KIAotPHVsPgotICAgICAgIDxsaT5UaGUgdG9wLWxldmVsIChyb290KSBkaXJlY3Rvcnk8L2xpPgotICAgICAgIDxsaT5QbHVnLWluIGFuZCBGcmFnbWVudCBkaXJlY3RvcmllczwvbGk+Ci0gICAgICAgPGxpPkluc2lkZSBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHBhY2thZ2VkIGFzIEpBUnM8L2xpPgotICAgICAgIDxsaT5TdWItZGlyZWN0b3JpZXMgb2YgdGhlIGRpcmVjdG9yeSBuYW1lZCAic3JjIiBvZiBjZXJ0YWluIFBsdWctaW5zPC9saT4KLSAgICAgICA8bGk+RmVhdHVyZSBkaXJlY3RvcmllczwvbGk+Ci08L3VsPgorCTx1bD4KKwkJPGxpPlRoZSB0b3AtbGV2ZWwgKHJvb3QpIGRpcmVjdG9yeTwvbGk+CisJCTxsaT5QbHVnLWluIGFuZCBGcmFnbWVudCBkaXJlY3RvcmllczwvbGk+CisJCTxsaT5JbnNpZGUgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBwYWNrYWdlZCBhcyBKQVJzPC9saT4KKwkJPGxpPlN1Yi1kaXJlY3RvcmllcyBvZiB0aGUgZGlyZWN0b3J5IG5hbWVkICZxdW90O3NyYyZxdW90OyBvZgorCQkJY2VydGFpbiBQbHVnLWluczwvbGk+CisJCTxsaT5GZWF0dXJlIGRpcmVjdG9yaWVzPC9saT4KKwk8L3VsPgogCi08cD5Ob3RlOiBpZiBhIEZlYXR1cmUgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiBpcyAKLWluc3RhbGxlZCB1c2luZyB0aGUgUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kgKGFzIGRlZmluZWQgYmVsb3cpLCB5b3UgbXVzdAotIGFncmVlIHRvIGEgbGljZW5zZSAoIkZlYXR1cmUgVXBkYXRlIExpY2Vuc2UiKSBkdXJpbmcgdGhlCi1pbnN0YWxsYXRpb24gcHJvY2Vzcy4gIElmIHRoZSBGZWF0dXJlIGNvbnRhaW5zIEluY2x1ZGVkIEZlYXR1cmVzLCB0aGUgCi1GZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIHNob3VsZCBlaXRoZXIgcHJvdmlkZSB5b3Ugd2l0aCB0aGUgdGVybXMgYW5kIAotY29uZGl0aW9ucyBnb3Zlcm5pbmcgdGhlIEluY2x1ZGVkIEZlYXR1cmVzIG9yCi1pbmZvcm0geW91IHdoZXJlIHlvdSBjYW4gbG9jYXRlIHRoZW0uICBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBtYXkgYmUgCi1mb3VuZCBpbiB0aGUgImxpY2Vuc2UiIHByb3BlcnR5IG9mIGZpbGVzIG5hbWVkICJmZWF0dXJlLnByb3BlcnRpZXMiIAotZm91bmQgd2l0aGluIGEgRmVhdHVyZS4KLVN1Y2ggQWJvdXRzLCBGZWF0dXJlIExpY2Vuc2VzLCBhbmQgRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgY29udGFpbiB0aGUgCi10ZXJtcyBhbmQgY29uZGl0aW9ucyAob3IgcmVmZXJlbmNlcyB0byBzdWNoIHRlcm1zIGFuZCBjb25kaXRpb25zKSB0aGF0IAotZ292ZXJuIHlvdXIgdXNlIG9mIHRoZSBhc3NvY2lhdGVkIENvbnRlbnQgaW4KLXRoYXQgZGlyZWN0b3J5LjwvcD4KKwk8cD5Ob3RlOiBpZiBhIEZlYXR1cmUgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiBpcworCQlpbnN0YWxsZWQgdXNpbmcgdGhlIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5IChhcyBkZWZpbmVkIGJlbG93KSwgeW91CisJCW11c3QgYWdyZWUgdG8gYSBsaWNlbnNlICgmcXVvdDtGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlJnF1b3Q7KSBkdXJpbmcKKwkJdGhlIGluc3RhbGxhdGlvbiBwcm9jZXNzLiBJZiB0aGUgRmVhdHVyZSBjb250YWlucyBJbmNsdWRlZCBGZWF0dXJlcywKKwkJdGhlIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2Ugc2hvdWxkIGVpdGhlciBwcm92aWRlIHlvdSB3aXRoIHRoZSB0ZXJtcworCQlhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgdGhlIEluY2x1ZGVkIEZlYXR1cmVzIG9yIGluZm9ybSB5b3Ugd2hlcmUgeW91CisJCWNhbiBsb2NhdGUgdGhlbS4gRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgbWF5IGJlIGZvdW5kIGluIHRoZQorCQkmcXVvdDtsaWNlbnNlJnF1b3Q7IHByb3BlcnR5IG9mIGZpbGVzIG5hbWVkCisJCSZxdW90O2ZlYXR1cmUucHJvcGVydGllcyZxdW90OyBmb3VuZCB3aXRoaW4gYSBGZWF0dXJlLiBTdWNoIEFib3V0cywKKwkJRmVhdHVyZSBMaWNlbnNlcywgYW5kIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIGNvbnRhaW4gdGhlIHRlcm1zIGFuZAorCQljb25kaXRpb25zIChvciByZWZlcmVuY2VzIHRvIHN1Y2ggdGVybXMgYW5kIGNvbmRpdGlvbnMpIHRoYXQgZ292ZXJuCisJCXlvdXIgdXNlIG9mIHRoZSBhc3NvY2lhdGVkIENvbnRlbnQgaW4gdGhhdCBkaXJlY3RvcnkuPC9wPgogCi08cD5USEUgQUJPVVRTLCBGRUFUVVJFIExJQ0VOU0VTLCBBTkQgRkVBVFVSRSBVUERBVEUgTElDRU5TRVMgTUFZIFJFRkVSIAotVE8gVEhFIEVQTCBPUiBPVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMsIE5PVElDRVMgT1IgVEVSTVMgQU5EIENPTkRJVElPTlMuCi0gIFNPTUUgT0YgVEhFU0UKLU9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUyBNQVkgSU5DTFVERSAoQlVUIEFSRSBOT1QgTElNSVRFRCBUTyk6PC9wPgorCTxwPlRIRSBBQk9VVFMsIEZFQVRVUkUgTElDRU5TRVMsIEFORCBGRUFUVVJFIFVQREFURSBMSUNFTlNFUyBNQVkKKwkJUkVGRVIgVE8gVEhFIEVQTCBPUiBPVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMsIE5PVElDRVMgT1IgVEVSTVMgQU5ECisJCUNPTkRJVElPTlMuIFNPTUUgT0YgVEhFU0UgT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTIE1BWSBJTkNMVURFIChCVVQKKwkJQVJFIE5PVCBMSU1JVEVEIFRPKTo8L3A+CiAKLTx1bD4KLSAgICAgICA8bGk+RWNsaXBzZSBEaXN0cmlidXRpb24gTGljZW5zZSBWZXJzaW9uIDEuMCAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGljZW5zZXMvZWRsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xpY2Vuc2VzL2VkbC12MS4wLmh0bWw8L2E+KTwvbGk+Ci0gICAgICAgPGxpPkNvbW1vbiBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbDwvYT4pPC9saT4KLSAgICAgICA8bGk+QXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMS4xIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UiPmh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFPC9hPik8L2xpPgotICAgICAgIDxsaT5BcGFjaGUgU29mdHdhcmUgTGljZW5zZSAyLjAgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAiPmh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMDwvYT4pPC9saT4KLSAgICAgICA8bGk+TWV0cm8gTGluayBQdWJsaWMgTGljZW5zZSAxLjAwIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuZ3JvdXAub3JnL29wZW5tb3RpZi9zdXBwb3J0ZXJzL21ldHJvbGluay9saWNlbnNlLmh0bWwiPmh0dHA6Ly93d3cub3Blbmdyb3VwLm9yZy9vcGVubW90aWYvc3VwcG9ydGVycy9tZXRyb2xpbmsvbGljZW5zZS5odG1sPC9hPik8L2xpPgotICAgICAgIDxsaT5Nb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4xIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvTVBMLTEuMS5odG1sIj5odHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC9NUEwtMS4xLmh0bWw8L2E+KTwvbGk+Ci08L3VsPgorCTx1bD4KKwkJPGxpPkVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKGF2YWlsYWJsZSBhdCA8YQorCQkJaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sPC9hPikKKwkJPC9saT4KKwkJPGxpPkVjbGlwc2UgRGlzdHJpYnV0aW9uIExpY2Vuc2UgVmVyc2lvbiAxLjAgKGF2YWlsYWJsZSBhdCA8YQorCQkJaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9saWNlbnNlcy9lZGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGljZW5zZXMvZWRsLXYxLjAuaHRtbDwvYT4pCisJCTwvbGk+CisJCTxsaT5Db21tb24gUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKGF2YWlsYWJsZSBhdCA8YQorCQkJaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sPC9hPikKKwkJPC9saT4KKwkJPGxpPkFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDEuMSAoYXZhaWxhYmxlIGF0IDxhCisJCQlocmVmPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRSI+aHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0U8L2E+KQorCQk8L2xpPgorCQk8bGk+QXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMi4wIChhdmFpbGFibGUgYXQgPGEKKwkJCWhyZWY9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCI+aHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wPC9hPikKKwkJPC9saT4KKwkJPGxpPk1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjEgKGF2YWlsYWJsZSBhdCA8YQorCQkJaHJlZj0iaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvTVBMLTEuMS5odG1sIj5odHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC9NUEwtMS4xLmh0bWw8L2E+KQorCQk8L2xpPgorCTwvdWw+CiAKLTxwPklUIElTIFlPVVIgT0JMSUdBVElPTiBUTyBSRUFEIEFORCBBQ0NFUFQgQUxMIFNVQ0ggVEVSTVMgQU5EIAotQ09ORElUSU9OUyBQUklPUiBUTyBVU0UgT0YgVEhFIENPTlRFTlQuICBJZiBubyBBYm91dCwgRmVhdHVyZSBMaWNlbnNlLCAKLW9yIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2UgaXMgcHJvdmlkZWQsIHBsZWFzZQotY29udGFjdCB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIHRvIGRldGVybWluZSB3aGF0IHRlcm1zIGFuZCBjb25kaXRpb25zIAotZ292ZXJuIHRoYXQgcGFydGljdWxhciBDb250ZW50LjwvcD4KKwk8cD5JVCBJUyBZT1VSIE9CTElHQVRJT04gVE8gUkVBRCBBTkQgQUNDRVBUIEFMTCBTVUNIIFRFUk1TIEFORAorCQlDT05ESVRJT05TIFBSSU9SIFRPIFVTRSBPRiBUSEUgQ09OVEVOVC4gSWYgbm8gQWJvdXQsIEZlYXR1cmUgTGljZW5zZSwKKwkJb3IgRmVhdHVyZSBVcGRhdGUgTGljZW5zZSBpcyBwcm92aWRlZCwgcGxlYXNlIGNvbnRhY3QgdGhlIEVjbGlwc2UKKwkJRm91bmRhdGlvbiB0byBkZXRlcm1pbmUgd2hhdCB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm4gdGhhdAorCQlwYXJ0aWN1bGFyIENvbnRlbnQuPC9wPgogCiAKLTxoMz5Vc2Ugb2YgUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3k8L2gzPgorCTxoMz5Vc2Ugb2YgUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3k8L2gzPgogCi08cD5UaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1ha2VzIGF2YWlsYWJsZSBwcm92aXNpb25pbmcgc29mdHdhcmUsIAotZXhhbXBsZXMgb2Ygd2hpY2ggaW5jbHVkZSwgYnV0IGFyZSBub3QgbGltaXRlZCB0bywgcDIgYW5kIHRoZSBFY2xpcHNlCi0gICBVcGRhdGUgTWFuYWdlciAoIlByb3Zpc2lvbmluZyBUZWNobm9sb2d5IikgZm9yIHRoZSBwdXJwb3NlIG9mIAotYWxsb3dpbmcgdXNlcnMgdG8gaW5zdGFsbCBzb2Z0d2FyZSwgZG9jdW1lbnRhdGlvbiwgaW5mb3JtYXRpb24gYW5kL29yCi0gICBvdGhlciBtYXRlcmlhbHMgKGNvbGxlY3RpdmVseSAiSW5zdGFsbGFibGUgU29mdHdhcmUiKS4gVGhpcyAKLWNhcGFiaWxpdHkgaXMgcHJvdmlkZWQgd2l0aCB0aGUgaW50ZW50IG9mIGFsbG93aW5nIHN1Y2ggdXNlcnMgdG8KLSAgIGluc3RhbGwsIGV4dGVuZCBhbmQgdXBkYXRlIEVjbGlwc2UtYmFzZWQgcHJvZHVjdHMuIEluZm9ybWF0aW9uIGFib3V0IAotcGFja2FnaW5nIEluc3RhbGxhYmxlIFNvZnR3YXJlIGlzIGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vZWNsaXBzZS5vcmcvZXF1aW5veC9wMi9yZXBvc2l0b3J5X3BhY2thZ2luZy5odG1sIj5odHRwOi8vZWNsaXBzZS5vcmcvZXF1aW5veC9wMi9yZXBvc2l0b3J5X3BhY2thZ2luZy5odG1sPC9hPgotICAgKCJTcGVjaWZpY2F0aW9uIikuPC9wPgorCTxwPgorCQlUaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1ha2VzIGF2YWlsYWJsZSBwcm92aXNpb25pbmcgc29mdHdhcmUsIGV4YW1wbGVzCisJCW9mIHdoaWNoIGluY2x1ZGUsIGJ1dCBhcmUgbm90IGxpbWl0ZWQgdG8sIHAyIGFuZCB0aGUgRWNsaXBzZSBVcGRhdGUKKwkJTWFuYWdlciAoJnF1b3Q7UHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kmcXVvdDspIGZvciB0aGUgcHVycG9zZSBvZgorCQlhbGxvd2luZyB1c2VycyB0byBpbnN0YWxsIHNvZnR3YXJlLCBkb2N1bWVudGF0aW9uLCBpbmZvcm1hdGlvbiBhbmQvb3IKKwkJb3RoZXIgbWF0ZXJpYWxzIChjb2xsZWN0aXZlbHkgJnF1b3Q7SW5zdGFsbGFibGUgU29mdHdhcmUmcXVvdDspLiBUaGlzCisJCWNhcGFiaWxpdHkgaXMgcHJvdmlkZWQgd2l0aCB0aGUgaW50ZW50IG9mIGFsbG93aW5nIHN1Y2ggdXNlcnMgdG8KKwkJaW5zdGFsbCwgZXh0ZW5kIGFuZCB1cGRhdGUgRWNsaXBzZS1iYXNlZCBwcm9kdWN0cy4gSW5mb3JtYXRpb24gYWJvdXQKKwkJcGFja2FnaW5nIEluc3RhbGxhYmxlIFNvZnR3YXJlIGlzIGF2YWlsYWJsZSBhdCA8YQorCQkJaHJlZj0iaHR0cDovL2VjbGlwc2Uub3JnL2VxdWlub3gvcDIvcmVwb3NpdG9yeV9wYWNrYWdpbmcuaHRtbCI+aHR0cDovL2VjbGlwc2Uub3JnL2VxdWlub3gvcDIvcmVwb3NpdG9yeV9wYWNrYWdpbmcuaHRtbDwvYT4KKwkJKCZxdW90O1NwZWNpZmljYXRpb24mcXVvdDspLgorCTwvcD4KIAotPHA+WW91IG1heSB1c2UgUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kgdG8gYWxsb3cgb3RoZXIgcGFydGllcyB0byBpbnN0YWxsCi0gSW5zdGFsbGFibGUgU29mdHdhcmUuIFlvdSBzaGFsbCBiZSByZXNwb25zaWJsZSBmb3IgZW5hYmxpbmcgdGhlCi0gICBhcHBsaWNhYmxlIGxpY2Vuc2UgYWdyZWVtZW50cyByZWxhdGluZyB0byB0aGUgSW5zdGFsbGFibGUgU29mdHdhcmUgdG8KLSBiZSBwcmVzZW50ZWQgdG8sIGFuZCBhY2NlcHRlZCBieSwgdGhlIHVzZXJzIG9mIHRoZSBQcm92aXNpb25pbmcgCi1UZWNobm9sb2d5Ci0gICBpbiBhY2NvcmRhbmNlIHdpdGggdGhlIFNwZWNpZmljYXRpb24uIEJ5IHVzaW5nIFByb3Zpc2lvbmluZyAKLVRlY2hub2xvZ3kgaW4gc3VjaCBhIG1hbm5lciBhbmQgbWFraW5nIGl0IGF2YWlsYWJsZSBpbiBhY2NvcmRhbmNlIHdpdGggCi10aGUKLSAgIFNwZWNpZmljYXRpb24sIHlvdSBmdXJ0aGVyIGFja25vd2xlZGdlIHlvdXIgYWdyZWVtZW50IHRvLCBhbmQgdGhlIAotYWNxdWlzaXRpb24gb2YgYWxsIG5lY2Vzc2FyeSByaWdodHMgdG8gcGVybWl0IHRoZSBmb2xsb3dpbmc6PC9wPgorCTxwPllvdSBtYXkgdXNlIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5IHRvIGFsbG93IG90aGVyIHBhcnRpZXMgdG8KKwkJaW5zdGFsbCBJbnN0YWxsYWJsZSBTb2Z0d2FyZS4gWW91IHNoYWxsIGJlIHJlc3BvbnNpYmxlIGZvciBlbmFibGluZworCQl0aGUgYXBwbGljYWJsZSBsaWNlbnNlIGFncmVlbWVudHMgcmVsYXRpbmcgdG8gdGhlIEluc3RhbGxhYmxlIFNvZnR3YXJlCisJCXRvIGJlIHByZXNlbnRlZCB0bywgYW5kIGFjY2VwdGVkIGJ5LCB0aGUgdXNlcnMgb2YgdGhlIFByb3Zpc2lvbmluZworCQlUZWNobm9sb2d5IGluIGFjY29yZGFuY2Ugd2l0aCB0aGUgU3BlY2lmaWNhdGlvbi4gQnkgdXNpbmcgUHJvdmlzaW9uaW5nCisJCVRlY2hub2xvZ3kgaW4gc3VjaCBhIG1hbm5lciBhbmQgbWFraW5nIGl0IGF2YWlsYWJsZSBpbiBhY2NvcmRhbmNlIHdpdGgKKwkJdGhlIFNwZWNpZmljYXRpb24sIHlvdSBmdXJ0aGVyIGFja25vd2xlZGdlIHlvdXIgYWdyZWVtZW50IHRvLCBhbmQgdGhlCisJCWFjcXVpc2l0aW9uIG9mIGFsbCBuZWNlc3NhcnkgcmlnaHRzIHRvIHBlcm1pdCB0aGUgZm9sbG93aW5nOjwvcD4KIAotPG9sPgotICAgICAgIDxsaT5BIHNlcmllcyBvZiBhY3Rpb25zIG1heSBvY2N1ciAoIlByb3Zpc2lvbmluZyBQcm9jZXNzIikgaW4gCi13aGljaCBhIHVzZXIgbWF5IGV4ZWN1dGUgdGhlIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5Ci0gICAgICAgb24gYSBtYWNoaW5lICgiVGFyZ2V0IE1hY2hpbmUiKSB3aXRoIHRoZSBpbnRlbnQgb2YgaW5zdGFsbGluZywgCi1leHRlbmRpbmcgb3IgdXBkYXRpbmcgdGhlIGZ1bmN0aW9uYWxpdHkgb2YgYW4gRWNsaXBzZS1iYXNlZAotICAgICAgIHByb2R1Y3QuPC9saT4KLSAgICAgICA8bGk+RHVyaW5nIHRoZSBQcm92aXNpb25pbmcgUHJvY2VzcywgdGhlIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5IAotbWF5IGNhdXNlIHRoaXJkIHBhcnR5IEluc3RhbGxhYmxlIFNvZnR3YXJlIG9yIGEgcG9ydGlvbiB0aGVyZW9mIHRvIGJlCi0gICAgICAgYWNjZXNzZWQgYW5kIGNvcGllZCB0byB0aGUgVGFyZ2V0IE1hY2hpbmUuPC9saT4KLSAgICAgICA8bGk+UHVyc3VhbnQgdG8gdGhlIFNwZWNpZmljYXRpb24sIHlvdSB3aWxsIHByb3ZpZGUgdG8gdGhlIHVzZXIgCi10aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgdGhhdCBnb3Zlcm4gdGhlIHVzZSBvZiB0aGUgSW5zdGFsbGFibGUKLSAgICAgICBTb2Z0d2FyZSAoIkluc3RhbGxhYmxlIFNvZnR3YXJlIEFncmVlbWVudCIpIGFuZCBzdWNoIEluc3RhbGxhYmxlIAotU29mdHdhcmUgQWdyZWVtZW50IHNoYWxsIGJlIGFjY2Vzc2VkIGZyb20gdGhlIFRhcmdldAotICAgICAgIE1hY2hpbmUgaW4gYWNjb3JkYW5jZSB3aXRoIHRoZSBTcGVjaWZpY2F0aW9uLiBTdWNoIEluc3RhbGxhYmxlIAotU29mdHdhcmUgQWdyZWVtZW50IG11c3QgaW5mb3JtIHRoZSB1c2VyIG9mIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyB0aGF0Ci0gZ292ZXJuCi0gICAgICAgdGhlIEluc3RhbGxhYmxlIFNvZnR3YXJlIGFuZCBtdXN0IHNvbGljaXQgYWNjZXB0YW5jZSBieSB0aGUgZW5kIAotdXNlciBpbiB0aGUgbWFubmVyIHByZXNjcmliZWQgaW4gc3VjaCBJbnN0YWxsYWJsZSBTb2Z0d2FyZSBBZ3JlZW1lbnQuIAotVXBvbiBzdWNoCi0gICAgICAgaW5kaWNhdGlvbiBvZiBhZ3JlZW1lbnQgYnkgdGhlIHVzZXIsIHRoZSBwcm92aXNpb25pbmcgVGVjaG5vbG9neSAKLXdpbGwgY29tcGxldGUgaW5zdGFsbGF0aW9uIG9mIHRoZSBJbnN0YWxsYWJsZSBTb2Z0d2FyZS48L2xpPgotPC9vbD4KKwk8b2w+CisJCTxsaT5BIHNlcmllcyBvZiBhY3Rpb25zIG1heSBvY2N1ciAoJnF1b3Q7UHJvdmlzaW9uaW5nCisJCQlQcm9jZXNzJnF1b3Q7KSBpbiB3aGljaCBhIHVzZXIgbWF5IGV4ZWN1dGUgdGhlIFByb3Zpc2lvbmluZworCQkJVGVjaG5vbG9neSBvbiBhIG1hY2hpbmUgKCZxdW90O1RhcmdldCBNYWNoaW5lJnF1b3Q7KSB3aXRoIHRoZSBpbnRlbnQKKwkJCW9mIGluc3RhbGxpbmcsIGV4dGVuZGluZyBvciB1cGRhdGluZyB0aGUgZnVuY3Rpb25hbGl0eSBvZiBhbgorCQkJRWNsaXBzZS1iYXNlZCBwcm9kdWN0LjwvbGk+CisJCTxsaT5EdXJpbmcgdGhlIFByb3Zpc2lvbmluZyBQcm9jZXNzLCB0aGUgUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kKKwkJCW1heSBjYXVzZSB0aGlyZCBwYXJ0eSBJbnN0YWxsYWJsZSBTb2Z0d2FyZSBvciBhIHBvcnRpb24gdGhlcmVvZiB0byBiZQorCQkJYWNjZXNzZWQgYW5kIGNvcGllZCB0byB0aGUgVGFyZ2V0IE1hY2hpbmUuPC9saT4KKwkJPGxpPlB1cnN1YW50IHRvIHRoZSBTcGVjaWZpY2F0aW9uLCB5b3Ugd2lsbCBwcm92aWRlIHRvIHRoZSB1c2VyCisJCQl0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgdGhhdCBnb3Zlcm4gdGhlIHVzZSBvZiB0aGUgSW5zdGFsbGFibGUKKwkJCVNvZnR3YXJlICgmcXVvdDtJbnN0YWxsYWJsZSBTb2Z0d2FyZSBBZ3JlZW1lbnQmcXVvdDspIGFuZCBzdWNoCisJCQlJbnN0YWxsYWJsZSBTb2Z0d2FyZSBBZ3JlZW1lbnQgc2hhbGwgYmUgYWNjZXNzZWQgZnJvbSB0aGUgVGFyZ2V0CisJCQlNYWNoaW5lIGluIGFjY29yZGFuY2Ugd2l0aCB0aGUgU3BlY2lmaWNhdGlvbi4gU3VjaCBJbnN0YWxsYWJsZQorCQkJU29mdHdhcmUgQWdyZWVtZW50IG11c3QgaW5mb3JtIHRoZSB1c2VyIG9mIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucworCQkJdGhhdCBnb3Zlcm4gdGhlIEluc3RhbGxhYmxlIFNvZnR3YXJlIGFuZCBtdXN0IHNvbGljaXQgYWNjZXB0YW5jZSBieQorCQkJdGhlIGVuZCB1c2VyIGluIHRoZSBtYW5uZXIgcHJlc2NyaWJlZCBpbiBzdWNoIEluc3RhbGxhYmxlIFNvZnR3YXJlCisJCQlBZ3JlZW1lbnQuIFVwb24gc3VjaCBpbmRpY2F0aW9uIG9mIGFncmVlbWVudCBieSB0aGUgdXNlciwgdGhlCisJCQlwcm92aXNpb25pbmcgVGVjaG5vbG9neSB3aWxsIGNvbXBsZXRlIGluc3RhbGxhdGlvbiBvZiB0aGUgSW5zdGFsbGFibGUKKwkJCVNvZnR3YXJlLjwvbGk+CisJPC9vbD4KIAotPGgzPkNyeXB0b2dyYXBoeTwvaDM+CisJPGgzPkNyeXB0b2dyYXBoeTwvaDM+CiAKLTxwPkNvbnRlbnQgbWF5IGNvbnRhaW4gZW5jcnlwdGlvbiBzb2Z0d2FyZS4gVGhlIGNvdW50cnkgaW4gd2hpY2ggeW91IGFyZQotIGN1cnJlbnRseSBtYXkgaGF2ZSByZXN0cmljdGlvbnMgb24gdGhlIGltcG9ydCwgcG9zc2Vzc2lvbiwgYW5kIHVzZSwgCi1hbmQvb3IgcmUtZXhwb3J0IHRvCi0gICBhbm90aGVyIGNvdW50cnksIG9mIGVuY3J5cHRpb24gc29mdHdhcmUuIEJFRk9SRSB1c2luZyBhbnkgZW5jcnlwdGlvbiAKLXNvZnR3YXJlLCBwbGVhc2UgY2hlY2sgdGhlIGNvdW50cnkncyBsYXdzLCByZWd1bGF0aW9ucyBhbmQgcG9saWNpZXMgCi1jb25jZXJuaW5nIHRoZSBpbXBvcnQsCi0gICBwb3NzZXNzaW9uLCBvciB1c2UsIGFuZCByZS1leHBvcnQgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgdG8gc2VlIGlmIAotdGhpcyBpcyBwZXJtaXR0ZWQuPC9wPgorCTxwPkNvbnRlbnQgbWF5IGNvbnRhaW4gZW5jcnlwdGlvbiBzb2Z0d2FyZS4gVGhlIGNvdW50cnkgaW4gd2hpY2gKKwkJeW91IGFyZSBjdXJyZW50bHkgbWF5IGhhdmUgcmVzdHJpY3Rpb25zIG9uIHRoZSBpbXBvcnQsIHBvc3Nlc3Npb24sIGFuZAorCQl1c2UsIGFuZC9vciByZS1leHBvcnQgdG8gYW5vdGhlciBjb3VudHJ5LCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLgorCQlCRUZPUkUgdXNpbmcgYW55IGVuY3J5cHRpb24gc29mdHdhcmUsIHBsZWFzZSBjaGVjayB0aGUgY291bnRyeSdzIGxhd3MsCisJCXJlZ3VsYXRpb25zIGFuZCBwb2xpY2llcyBjb25jZXJuaW5nIHRoZSBpbXBvcnQsIHBvc3Nlc3Npb24sIG9yIHVzZSwKKwkJYW5kIHJlLWV4cG9ydCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLCB0byBzZWUgaWYgdGhpcyBpcyBwZXJtaXR0ZWQuPC9wPgogCi08cD48c21hbGw+SmF2YSBhbmQgYWxsIEphdmEtYmFzZWQgdHJhZGVtYXJrcyBhcmUgdHJhZGVtYXJrcyBvZiBPcmFjbGUgQ29ycG9yYXRpb24gaW4gdGhlIFVuaXRlZCBTdGF0ZXMsIG90aGVyIGNvdW50cmllcywgb3IgYm90aC48L3NtYWxsPjwvcD4KLQotCi08L2JvZHk+PC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKKwk8cD4KKwkJPHNtYWxsPkphdmEgYW5kIGFsbCBKYXZhLWJhc2VkIHRyYWRlbWFya3MgYXJlIHRyYWRlbWFya3Mgb2YKKwkJCU9yYWNsZSBDb3Jwb3JhdGlvbiBpbiB0aGUgVW5pdGVkIFN0YXRlcywgb3RoZXIgY291bnRyaWVzLCBvciBib3RoLjwvc21hbGw+CisJPC9wPgorPC9ib2R5PgorPC9odG1sPgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5kYXRhaW50ZXJjaGFuZ2UudWkvcG9tLnhtbCBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQuZGF0YWludGVyY2hhbmdlLnVpL3BvbS54bWwKaW5kZXggZTZkNmJjMi4uY2ZjMDc1MiAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5kYXRhaW50ZXJjaGFuZ2UudWkvcG9tLnhtbAorKysgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmRhdGFpbnRlcmNoYW5nZS51aS9wb20ueG1sCkBAIC0yLDkgKzIsMTEgQEAKIDwhLS0jPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+CiA8IS0tIyBDb3B5cmlnaHQgKGMpIDIwMTEsIDIwMTYgLSBMb2V0eiBHbWJIJkNvLktHICg2OTExNSBIZWlkZWxiZXJnLCBHZXJtYW55KSAtLT4KIDwhLS0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgLS0+Ci08IS0tIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgLS0+Cis8IS0tIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIDIuMCAgLS0+CiA8IS0tIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAtLT4KLTwhLS0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIC0tPgorPCEtLSMgaHR0cHM6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC8gICAgLS0+Cis8IS0tIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLT4KKzwhLS0jIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wICAgICAgICAgIC0tPgogPCEtLSMgLS0+CiA8IS0tIyBDb250cmlidXRvcnM6IC0tPgogPCEtLSMgICAgIENocmlzdG9waGUgTG9ldHogKExvZXR6IEdtYkgmQ28uS0cpIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uIC0tPgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5kYXRhaW50ZXJjaGFuZ2UudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2RhdGFpbnRlcmNoYW5nZS91aS9BYnN0cmFjdERhdGFEU0xVaU1vZHVsZS5qYXZhIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5kYXRhaW50ZXJjaGFuZ2UudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2RhdGFpbnRlcmNoYW5nZS91aS9BYnN0cmFjdERhdGFEU0xVaU1vZHVsZS5qYXZhCmluZGV4IGZlMjE0NDYuLjI2OWVhM2YgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLm9zYnAueHRleHQuZGF0YWludGVyY2hhbmdlLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9kYXRhaW50ZXJjaGFuZ2UvdWkvQWJzdHJhY3REYXRhRFNMVWlNb2R1bGUuamF2YQorKysgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmRhdGFpbnRlcmNoYW5nZS51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvZGF0YWludGVyY2hhbmdlL3VpL0Fic3RyYWN0RGF0YURTTFVpTW9kdWxlLmphdmEKQEAgLTMsOSArMywxMSBAQAogICogIENvcHlyaWdodCAoYykgMjAxMSwgMjAxNiAtIExvZXR6IEdtYkgmQ28uS0cgKDY5MTE1IEhlaWRlbGJlcmcsIEdlcm1hbnkpIAogICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgKiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAgICAgICAgICAgCi0gKiAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wICAgICAgIAorICogIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgMi4wICAgICAgICAKICAqICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAgICAgICAgICAgICAgICAgIAotICogIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKiAgaHR0cHM6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKiAgU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICogIENvbnRyaWJ1dG9yczogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAqIAkgICBDaHJpc3RvcGhlIExvZXR6IChMb2V0eiBHbWJIJkNvLktHKSAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLm9zYnAueHRleHQuZGF0YWludGVyY2hhbmdlLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9kYXRhaW50ZXJjaGFuZ2UvdWkvRGF0YURTTEV4ZWN1dGFibGVFeHRlbnNpb25GYWN0b3J5LmphdmEgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmRhdGFpbnRlcmNoYW5nZS51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvZGF0YWludGVyY2hhbmdlL3VpL0RhdGFEU0xFeGVjdXRhYmxlRXh0ZW5zaW9uRmFjdG9yeS5qYXZhCmluZGV4IDlmZmU3NzUuLjQwMjQwZjIgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLm9zYnAueHRleHQuZGF0YWludGVyY2hhbmdlLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9kYXRhaW50ZXJjaGFuZ2UvdWkvRGF0YURTTEV4ZWN1dGFibGVFeHRlbnNpb25GYWN0b3J5LmphdmEKKysrIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5kYXRhaW50ZXJjaGFuZ2UudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2RhdGFpbnRlcmNoYW5nZS91aS9EYXRhRFNMRXhlY3V0YWJsZUV4dGVuc2lvbkZhY3RvcnkuamF2YQpAQCAtMyw5ICszLDExIEBACiAgKiAgQ29weXJpZ2h0IChjKSAyMDExLCAyMDE2IC0gTG9ldHogR21iSCZDby5LRyAoNjkxMTUgSGVpZGVsYmVyZywgR2VybWFueSkgCiAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAqICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzICAgICAgICAgICAKLSAqICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgICAgICAgCisgKiAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSAyLjAgICAgICAgIAogICogIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0ICAgICAgICAgICAgICAgICAgCi0gKiAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAqICBodHRwczovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAqICBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgKiAgQ29udHJpYnV0b3JzOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICogCSAgIENocmlzdG9waGUgTG9ldHogKExvZXR6IEdtYkgmQ28uS0cpIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5kYXRhaW50ZXJjaGFuZ2UudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2RhdGFpbnRlcmNoYW5nZS91aS9jb250ZW50YXNzaXN0L0Fic3RyYWN0RGF0YURTTFByb3Bvc2FsUHJvdmlkZXIuamF2YSBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQuZGF0YWludGVyY2hhbmdlLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9kYXRhaW50ZXJjaGFuZ2UvdWkvY29udGVudGFzc2lzdC9BYnN0cmFjdERhdGFEU0xQcm9wb3NhbFByb3ZpZGVyLmphdmEKaW5kZXggMjhlNDRlMS4uMzcyMDk3NiAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5kYXRhaW50ZXJjaGFuZ2UudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2RhdGFpbnRlcmNoYW5nZS91aS9jb250ZW50YXNzaXN0L0Fic3RyYWN0RGF0YURTTFByb3Bvc2FsUHJvdmlkZXIuamF2YQorKysgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmRhdGFpbnRlcmNoYW5nZS51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvZGF0YWludGVyY2hhbmdlL3VpL2NvbnRlbnRhc3Npc3QvQWJzdHJhY3REYXRhRFNMUHJvcG9zYWxQcm92aWRlci5qYXZhCkBAIC0zLDkgKzMsMTEgQEAKICAqICBDb3B5cmlnaHQgKGMpIDIwMTEsIDIwMTYgLSBMb2V0eiBHbWJIJkNvLktHICg2OTExNSBIZWlkZWxiZXJnLCBHZXJtYW55KSAKICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICogIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgICAgICAgICAgIAotICogIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCAgICAgICAKKyAqICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIDIuMCAgICAgICAgCiAgKiAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgICAgICAgICAgICAgICAgICAKLSAqICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICogIGh0dHBzOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAvICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICogIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAqICBDb250cmlidXRvcnM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgKiAJICAgQ2hyaXN0b3BoZSBMb2V0eiAoTG9ldHogR21iSCZDby5LRykgLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCkBAIC02Nyw2ICs2OSw5IEBACiAJcHVibGljIHZvaWQgY29tcGxldGVEYXRhSW50ZXJjaGFuZ2VfRWxlbWVudFNpemUoRU9iamVjdCBtb2RlbCwgQXNzaWdubWVudCBhc3NpZ25tZW50LCBDb250ZW50QXNzaXN0Q29udGV4dCBjb250ZXh0LCBJQ29tcGxldGlvblByb3Bvc2FsQWNjZXB0b3IgYWNjZXB0b3IpIHsKIAkJY29tcGxldGVSdWxlQ2FsbCgoKFJ1bGVDYWxsKWFzc2lnbm1lbnQuZ2V0VGVybWluYWwoKSksIGNvbnRleHQsIGFjY2VwdG9yKTsKIAl9CisJcHVibGljIHZvaWQgY29tcGxldGVEYXRhSW50ZXJjaGFuZ2VfRGVsZXRlRmlsZUFmdGVySW1wb3J0KEVPYmplY3QgbW9kZWwsIEFzc2lnbm1lbnQgYXNzaWdubWVudCwgQ29udGVudEFzc2lzdENvbnRleHQgY29udGV4dCwgSUNvbXBsZXRpb25Qcm9wb3NhbEFjY2VwdG9yIGFjY2VwdG9yKSB7CisJCS8vIHN1YmNsYXNzZXMgbWF5IG92ZXJyaWRlCisJfQogCXB1YmxpYyB2b2lkIGNvbXBsZXRlRGF0YUludGVyY2hhbmdlX0ZpbGVFbmRwb2ludChFT2JqZWN0IG1vZGVsLCBBc3NpZ25tZW50IGFzc2lnbm1lbnQsIENvbnRlbnRBc3Npc3RDb250ZXh0IGNvbnRleHQsIElDb21wbGV0aW9uUHJvcG9zYWxBY2NlcHRvciBhY2NlcHRvcikgewogCQljb21wbGV0ZVJ1bGVDYWxsKCgoUnVsZUNhbGwpYXNzaWdubWVudC5nZXRUZXJtaW5hbCgpKSwgY29udGV4dCwgYWNjZXB0b3IpOwogCX0KQEAgLTEzMCwxMiArMTM1LDE4IEBACiAJcHVibGljIHZvaWQgY29tcGxldGVEYXRhSW50ZXJjaGFuZ2VCZWFuX0VsZW1lbnRNYXAoRU9iamVjdCBtb2RlbCwgQXNzaWdubWVudCBhc3NpZ25tZW50LCBDb250ZW50QXNzaXN0Q29udGV4dCBjb250ZXh0LCBJQ29tcGxldGlvblByb3Bvc2FsQWNjZXB0b3IgYWNjZXB0b3IpIHsKIAkJY29tcGxldGVSdWxlQ2FsbCgoKFJ1bGVDYWxsKWFzc2lnbm1lbnQuZ2V0VGVybWluYWwoKSksIGNvbnRleHQsIGFjY2VwdG9yKTsKIAl9Ci0JcHVibGljIHZvaWQgY29tcGxldGVEYXRhSW50ZXJjaGFuZ2VCZWFuX01hcmtMYXRlc3QoRU9iamVjdCBtb2RlbCwgQXNzaWdubWVudCBhc3NpZ25tZW50LCBDb250ZW50QXNzaXN0Q29udGV4dCBjb250ZXh0LCBJQ29tcGxldGlvblByb3Bvc2FsQWNjZXB0b3IgYWNjZXB0b3IpIHsKKwlwdWJsaWMgdm9pZCBjb21wbGV0ZURhdGFJbnRlcmNoYW5nZUJlYW5fTWFya0xhdGVzdEltcG9ydChFT2JqZWN0IG1vZGVsLCBBc3NpZ25tZW50IGFzc2lnbm1lbnQsIENvbnRlbnRBc3Npc3RDb250ZXh0IGNvbnRleHQsIElDb21wbGV0aW9uUHJvcG9zYWxBY2NlcHRvciBhY2NlcHRvcikgewogCQkvLyBzdWJjbGFzc2VzIG1heSBvdmVycmlkZQogCX0KIAlwdWJsaWMgdm9pZCBjb21wbGV0ZURhdGFJbnRlcmNoYW5nZUJlYW5fTGF0ZXN0UHJvcGVydHkoRU9iamVjdCBtb2RlbCwgQXNzaWdubWVudCBhc3NpZ25tZW50LCBDb250ZW50QXNzaXN0Q29udGV4dCBjb250ZXh0LCBJQ29tcGxldGlvblByb3Bvc2FsQWNjZXB0b3IgYWNjZXB0b3IpIHsKIAkJbG9va3VwQ3Jvc3NSZWZlcmVuY2UoKChDcm9zc1JlZmVyZW5jZSlhc3NpZ25tZW50LmdldFRlcm1pbmFsKCkpLCBjb250ZXh0LCBhY2NlcHRvcik7CiAJfQorCXB1YmxpYyB2b2lkIGNvbXBsZXRlRGF0YUludGVyY2hhbmdlQmVhbl9NYXJrTGF0ZXN0RXhwb3J0KEVPYmplY3QgbW9kZWwsIEFzc2lnbm1lbnQgYXNzaWdubWVudCwgQ29udGVudEFzc2lzdENvbnRleHQgY29udGV4dCwgSUNvbXBsZXRpb25Qcm9wb3NhbEFjY2VwdG9yIGFjY2VwdG9yKSB7CisJCS8vIHN1YmNsYXNzZXMgbWF5IG92ZXJyaWRlCisJfQorCXB1YmxpYyB2b2lkIGNvbXBsZXRlRGF0YUludGVyY2hhbmdlQmVhbl9MYXRlc3RFeHBQcm9wZXJ0eShFT2JqZWN0IG1vZGVsLCBBc3NpZ25tZW50IGFzc2lnbm1lbnQsIENvbnRlbnRBc3Npc3RDb250ZXh0IGNvbnRleHQsIElDb21wbGV0aW9uUHJvcG9zYWxBY2NlcHRvciBhY2NlcHRvcikgeworCQlsb29rdXBDcm9zc1JlZmVyZW5jZSgoKENyb3NzUmVmZXJlbmNlKWFzc2lnbm1lbnQuZ2V0VGVybWluYWwoKSksIGNvbnRleHQsIGFjY2VwdG9yKTsKKwl9CiAJcHVibGljIHZvaWQgY29tcGxldGVEYXRhSW50ZXJjaGFuZ2VCZWFuX0V4cHJlc3Npb24oRU9iamVjdCBtb2RlbCwgQXNzaWdubWVudCBhc3NpZ25tZW50LCBDb250ZW50QXNzaXN0Q29udGV4dCBjb250ZXh0LCBJQ29tcGxldGlvblByb3Bvc2FsQWNjZXB0b3IgYWNjZXB0b3IpIHsKIAkJY29tcGxldGVSdWxlQ2FsbCgoKFJ1bGVDYWxsKWFzc2lnbm1lbnQuZ2V0VGVybWluYWwoKSksIGNvbnRleHQsIGFjY2VwdG9yKTsKIAl9CkBAIC0xNDUsMTIgKzE1NiwxOCBAQAogCXB1YmxpYyB2b2lkIGNvbXBsZXRlRGF0YUludGVyY2hhbmdlQmVhbl9Gb3JtYXQoRU9iamVjdCBtb2RlbCwgQXNzaWdubWVudCBhc3NpZ25tZW50LCBDb250ZW50QXNzaXN0Q29udGV4dCBjb250ZXh0LCBJQ29tcGxldGlvblByb3Bvc2FsQWNjZXB0b3IgYWNjZXB0b3IpIHsKIAkJY29tcGxldGVSdWxlQ2FsbCgoKFJ1bGVDYWxsKWFzc2lnbm1lbnQuZ2V0VGVybWluYWwoKSksIGNvbnRleHQsIGFjY2VwdG9yKTsKIAl9CisJcHVibGljIHZvaWQgY29tcGxldGVEYXRhSW50ZXJjaGFuZ2VCZWFuX0V4cG9ydEV4cG9zZXMoRU9iamVjdCBtb2RlbCwgQXNzaWdubWVudCBhc3NpZ25tZW50LCBDb250ZW50QXNzaXN0Q29udGV4dCBjb250ZXh0LCBJQ29tcGxldGlvblByb3Bvc2FsQWNjZXB0b3IgYWNjZXB0b3IpIHsKKwkJY29tcGxldGVSdWxlQ2FsbCgoKFJ1bGVDYWxsKWFzc2lnbm1lbnQuZ2V0VGVybWluYWwoKSksIGNvbnRleHQsIGFjY2VwdG9yKTsKKwl9CiAJcHVibGljIHZvaWQgY29tcGxldGVEYXRhSW50ZXJjaGFuZ2VCZWFuX01hcHBpbmdzKEVPYmplY3QgbW9kZWwsIEFzc2lnbm1lbnQgYXNzaWdubWVudCwgQ29udGVudEFzc2lzdENvbnRleHQgY29udGV4dCwgSUNvbXBsZXRpb25Qcm9wb3NhbEFjY2VwdG9yIGFjY2VwdG9yKSB7CiAJCWNvbXBsZXRlUnVsZUNhbGwoKChSdWxlQ2FsbClhc3NpZ25tZW50LmdldFRlcm1pbmFsKCkpLCBjb250ZXh0LCBhY2NlcHRvcik7CiAJfQogCXB1YmxpYyB2b2lkIGNvbXBsZXRlRGF0YUludGVyY2hhbmdlQmVhbl9Mb29rdXBLZXlzKEVPYmplY3QgbW9kZWwsIEFzc2lnbm1lbnQgYXNzaWdubWVudCwgQ29udGVudEFzc2lzdENvbnRleHQgY29udGV4dCwgSUNvbXBsZXRpb25Qcm9wb3NhbEFjY2VwdG9yIGFjY2VwdG9yKSB7CiAJCWNvbXBsZXRlUnVsZUNhbGwoKChSdWxlQ2FsbClhc3NpZ25tZW50LmdldFRlcm1pbmFsKCkpLCBjb250ZXh0LCBhY2NlcHRvcik7CiAJfQorCXB1YmxpYyB2b2lkIGNvbXBsZXRlRGF0YUludGVyY2hhbmdlQmVhbl9FeHBvcnRGaWx0ZXIoRU9iamVjdCBtb2RlbCwgQXNzaWdubWVudCBhc3NpZ25tZW50LCBDb250ZW50QXNzaXN0Q29udGV4dCBjb250ZXh0LCBJQ29tcGxldGlvblByb3Bvc2FsQWNjZXB0b3IgYWNjZXB0b3IpIHsKKwkJY29tcGxldGVSdWxlQ2FsbCgoKFJ1bGVDYWxsKWFzc2lnbm1lbnQuZ2V0VGVybWluYWwoKSksIGNvbnRleHQsIGFjY2VwdG9yKTsKKwl9CiAJcHVibGljIHZvaWQgY29tcGxldGVEYXRhSW50ZXJjaGFuZ2VLZXlfUHJvcGVydHkoRU9iamVjdCBtb2RlbCwgQXNzaWdubWVudCBhc3NpZ25tZW50LCBDb250ZW50QXNzaXN0Q29udGV4dCBjb250ZXh0LCBJQ29tcGxldGlvblByb3Bvc2FsQWNjZXB0b3IgYWNjZXB0b3IpIHsKIAkJbG9va3VwQ3Jvc3NSZWZlcmVuY2UoKChDcm9zc1JlZmVyZW5jZSlhc3NpZ25tZW50LmdldFRlcm1pbmFsKCkpLCBjb250ZXh0LCBhY2NlcHRvcik7CiAJfQpAQCAtMjExLDYgKzIyOCwzOSBAQAogCXB1YmxpYyB2b2lkIGNvbXBsZXRlRGF0YUludGVyY2hhbmdlRW50aXR5RXhwcmVzc2lvbl9Qcm9wZXJ0eShFT2JqZWN0IG1vZGVsLCBBc3NpZ25tZW50IGFzc2lnbm1lbnQsIENvbnRlbnRBc3Npc3RDb250ZXh0IGNvbnRleHQsIElDb21wbGV0aW9uUHJvcG9zYWxBY2NlcHRvciBhY2NlcHRvcikgewogCQlsb29rdXBDcm9zc1JlZmVyZW5jZSgoKENyb3NzUmVmZXJlbmNlKWFzc2lnbm1lbnQuZ2V0VGVybWluYWwoKSksIGNvbnRleHQsIGFjY2VwdG9yKTsKIAl9CisJcHVibGljIHZvaWQgY29tcGxldGVEYXRhSW50ZXJjaGFuZ2VFeHBvc2VfUmVmRW50aXR5KEVPYmplY3QgbW9kZWwsIEFzc2lnbm1lbnQgYXNzaWdubWVudCwgQ29udGVudEFzc2lzdENvbnRleHQgY29udGV4dCwgSUNvbXBsZXRpb25Qcm9wb3NhbEFjY2VwdG9yIGFjY2VwdG9yKSB7CisJCWxvb2t1cENyb3NzUmVmZXJlbmNlKCgoQ3Jvc3NSZWZlcmVuY2UpYXNzaWdubWVudC5nZXRUZXJtaW5hbCgpKSwgY29udGV4dCwgYWNjZXB0b3IpOworCX0KKwlwdWJsaWMgdm9pZCBjb21wbGV0ZURhdGFJbnRlcmNoYW5nZUV4cG9zZV9SZWZQcm9wZXJ0eShFT2JqZWN0IG1vZGVsLCBBc3NpZ25tZW50IGFzc2lnbm1lbnQsIENvbnRlbnRBc3Npc3RDb250ZXh0IGNvbnRleHQsIElDb21wbGV0aW9uUHJvcG9zYWxBY2NlcHRvciBhY2NlcHRvcikgeworCQlsb29rdXBDcm9zc1JlZmVyZW5jZSgoKENyb3NzUmVmZXJlbmNlKWFzc2lnbm1lbnQuZ2V0VGVybWluYWwoKSksIGNvbnRleHQsIGFjY2VwdG9yKTsKKwl9CisJcHVibGljIHZvaWQgY29tcGxldGVEYXRhSW50ZXJjaGFuZ2VFeHBvc2VfU3ViRXhwb3NlKEVPYmplY3QgbW9kZWwsIEFzc2lnbm1lbnQgYXNzaWdubWVudCwgQ29udGVudEFzc2lzdENvbnRleHQgY29udGV4dCwgSUNvbXBsZXRpb25Qcm9wb3NhbEFjY2VwdG9yIGFjY2VwdG9yKSB7CisJCWNvbXBsZXRlUnVsZUNhbGwoKChSdWxlQ2FsbClhc3NpZ25tZW50LmdldFRlcm1pbmFsKCkpLCBjb250ZXh0LCBhY2NlcHRvcik7CisJfQorCXB1YmxpYyB2b2lkIGNvbXBsZXRlRGF0YUludGVyY2hhbmdlRXhwb3J0RmlsdGVyX0NvbmRpdGlvbihFT2JqZWN0IG1vZGVsLCBBc3NpZ25tZW50IGFzc2lnbm1lbnQsIENvbnRlbnRBc3Npc3RDb250ZXh0IGNvbnRleHQsIElDb21wbGV0aW9uUHJvcG9zYWxBY2NlcHRvciBhY2NlcHRvcikgeworCQljb21wbGV0ZVJ1bGVDYWxsKCgoUnVsZUNhbGwpYXNzaWdubWVudC5nZXRUZXJtaW5hbCgpKSwgY29udGV4dCwgYWNjZXB0b3IpOworCX0KKwlwdWJsaWMgdm9pZCBjb21wbGV0ZURhdGFJbnRlcmNoYW5nZUV4cG9ydEZpbHRlcl9IaWRkZW5wcm9wZXJ0aWVzKEVPYmplY3QgbW9kZWwsIEFzc2lnbm1lbnQgYXNzaWdubWVudCwgQ29udGVudEFzc2lzdENvbnRleHQgY29udGV4dCwgSUNvbXBsZXRpb25Qcm9wb3NhbEFjY2VwdG9yIGFjY2VwdG9yKSB7CisJCWNvbXBsZXRlUnVsZUNhbGwoKChSdWxlQ2FsbClhc3NpZ25tZW50LmdldFRlcm1pbmFsKCkpLCBjb250ZXh0LCBhY2NlcHRvcik7CisJfQorCXB1YmxpYyB2b2lkIGNvbXBsZXRlRGF0YUludGVyY2hhbmdlRmlsdGVyQ29uZGl0aW9uX1JlZlByb3BlcnR5KEVPYmplY3QgbW9kZWwsIEFzc2lnbm1lbnQgYXNzaWdubWVudCwgQ29udGVudEFzc2lzdENvbnRleHQgY29udGV4dCwgSUNvbXBsZXRpb25Qcm9wb3NhbEFjY2VwdG9yIGFjY2VwdG9yKSB7CisJCWxvb2t1cENyb3NzUmVmZXJlbmNlKCgoQ3Jvc3NSZWZlcmVuY2UpYXNzaWdubWVudC5nZXRUZXJtaW5hbCgpKSwgY29udGV4dCwgYWNjZXB0b3IpOworCX0KKwlwdWJsaWMgdm9pZCBjb21wbGV0ZURhdGFJbnRlcmNoYW5nZUZpbHRlckNvbmRpdGlvbl9PcGVyYXRvcihFT2JqZWN0IG1vZGVsLCBBc3NpZ25tZW50IGFzc2lnbm1lbnQsIENvbnRlbnRBc3Npc3RDb250ZXh0IGNvbnRleHQsIElDb21wbGV0aW9uUHJvcG9zYWxBY2NlcHRvciBhY2NlcHRvcikgeworCQljb21wbGV0ZVJ1bGVDYWxsKCgoUnVsZUNhbGwpYXNzaWdubWVudC5nZXRUZXJtaW5hbCgpKSwgY29udGV4dCwgYWNjZXB0b3IpOworCX0KKwlwdWJsaWMgdm9pZCBjb21wbGV0ZURhdGFJbnRlcmNoYW5nZUZpbHRlckNvbmRpdGlvbl9WYWx1ZShFT2JqZWN0IG1vZGVsLCBBc3NpZ25tZW50IGFzc2lnbm1lbnQsIENvbnRlbnRBc3Npc3RDb250ZXh0IGNvbnRleHQsIElDb21wbGV0aW9uUHJvcG9zYWxBY2NlcHRvciBhY2NlcHRvcikgeworCQljb21wbGV0ZVJ1bGVDYWxsKCgoUnVsZUNhbGwpYXNzaWdubWVudC5nZXRUZXJtaW5hbCgpKSwgY29udGV4dCwgYWNjZXB0b3IpOworCX0KKwlwdWJsaWMgdm9pZCBjb21wbGV0ZURhdGFJbnRlcmNoYW5nZUZpbHRlckNvbmRpdGlvbl9PcGVyYXRvcjIoRU9iamVjdCBtb2RlbCwgQXNzaWdubWVudCBhc3NpZ25tZW50LCBDb250ZW50QXNzaXN0Q29udGV4dCBjb250ZXh0LCBJQ29tcGxldGlvblByb3Bvc2FsQWNjZXB0b3IgYWNjZXB0b3IpIHsKKwkJY29tcGxldGVSdWxlQ2FsbCgoKFJ1bGVDYWxsKWFzc2lnbm1lbnQuZ2V0VGVybWluYWwoKSksIGNvbnRleHQsIGFjY2VwdG9yKTsKKwl9CisJcHVibGljIHZvaWQgY29tcGxldGVEYXRhSW50ZXJjaGFuZ2VGaWx0ZXJDb25kaXRpb25fU3ViY29uZGl0aW9uKEVPYmplY3QgbW9kZWwsIEFzc2lnbm1lbnQgYXNzaWdubWVudCwgQ29udGVudEFzc2lzdENvbnRleHQgY29udGV4dCwgSUNvbXBsZXRpb25Qcm9wb3NhbEFjY2VwdG9yIGFjY2VwdG9yKSB7CisJCWNvbXBsZXRlUnVsZUNhbGwoKChSdWxlQ2FsbClhc3NpZ25tZW50LmdldFRlcm1pbmFsKCkpLCBjb250ZXh0LCBhY2NlcHRvcik7CisJfQorCXB1YmxpYyB2b2lkIGNvbXBsZXRlRGF0YUludGVyY2hhbmdlRXhwb3J0SGlkZV9Qcm9wZXJ0eShFT2JqZWN0IG1vZGVsLCBBc3NpZ25tZW50IGFzc2lnbm1lbnQsIENvbnRlbnRBc3Npc3RDb250ZXh0IGNvbnRleHQsIElDb21wbGV0aW9uUHJvcG9zYWxBY2NlcHRvciBhY2NlcHRvcikgeworCQlsb29rdXBDcm9zc1JlZmVyZW5jZSgoKENyb3NzUmVmZXJlbmNlKWFzc2lnbm1lbnQuZ2V0VGVybWluYWwoKSksIGNvbnRleHQsIGFjY2VwdG9yKTsKKwl9CiAJcHVibGljIHZvaWQgY29tcGxldGVEYXRhSW50ZXJjaGFuZ2VQcmVkZWZpbmVkRXhwcmVzc2lvbl9UYXJnZXRQcm9wZXJ0eShFT2JqZWN0IG1vZGVsLCBBc3NpZ25tZW50IGFzc2lnbm1lbnQsIENvbnRlbnRBc3Npc3RDb250ZXh0IGNvbnRleHQsIElDb21wbGV0aW9uUHJvcG9zYWxBY2NlcHRvciBhY2NlcHRvcikgewogCQlsb29rdXBDcm9zc1JlZmVyZW5jZSgoKENyb3NzUmVmZXJlbmNlKWFzc2lnbm1lbnQuZ2V0VGVybWluYWwoKSksIGNvbnRleHQsIGFjY2VwdG9yKTsKIAl9CkBAIC0yODcsNiArMzM3LDE4IEBACiAJcHVibGljIHZvaWQgY29tcGxldGVfRGF0YUludGVyY2hhbmdlRW50aXR5RXhwcmVzc2lvbihFT2JqZWN0IG1vZGVsLCBSdWxlQ2FsbCBydWxlQ2FsbCwgQ29udGVudEFzc2lzdENvbnRleHQgY29udGV4dCwgSUNvbXBsZXRpb25Qcm9wb3NhbEFjY2VwdG9yIGFjY2VwdG9yKSB7CiAJCS8vIHN1YmNsYXNzZXMgbWF5IG92ZXJyaWRlCiAJfQorCXB1YmxpYyB2b2lkIGNvbXBsZXRlX0RhdGFJbnRlcmNoYW5nZUV4cG9zZShFT2JqZWN0IG1vZGVsLCBSdWxlQ2FsbCBydWxlQ2FsbCwgQ29udGVudEFzc2lzdENvbnRleHQgY29udGV4dCwgSUNvbXBsZXRpb25Qcm9wb3NhbEFjY2VwdG9yIGFjY2VwdG9yKSB7CisJCS8vIHN1YmNsYXNzZXMgbWF5IG92ZXJyaWRlCisJfQorCXB1YmxpYyB2b2lkIGNvbXBsZXRlX0RhdGFJbnRlcmNoYW5nZUV4cG9ydEZpbHRlcihFT2JqZWN0IG1vZGVsLCBSdWxlQ2FsbCBydWxlQ2FsbCwgQ29udGVudEFzc2lzdENvbnRleHQgY29udGV4dCwgSUNvbXBsZXRpb25Qcm9wb3NhbEFjY2VwdG9yIGFjY2VwdG9yKSB7CisJCS8vIHN1YmNsYXNzZXMgbWF5IG92ZXJyaWRlCisJfQorCXB1YmxpYyB2b2lkIGNvbXBsZXRlX0RhdGFJbnRlcmNoYW5nZUZpbHRlckNvbmRpdGlvbihFT2JqZWN0IG1vZGVsLCBSdWxlQ2FsbCBydWxlQ2FsbCwgQ29udGVudEFzc2lzdENvbnRleHQgY29udGV4dCwgSUNvbXBsZXRpb25Qcm9wb3NhbEFjY2VwdG9yIGFjY2VwdG9yKSB7CisJCS8vIHN1YmNsYXNzZXMgbWF5IG92ZXJyaWRlCisJfQorCXB1YmxpYyB2b2lkIGNvbXBsZXRlX0RhdGFJbnRlcmNoYW5nZUV4cG9ydEhpZGUoRU9iamVjdCBtb2RlbCwgUnVsZUNhbGwgcnVsZUNhbGwsIENvbnRlbnRBc3Npc3RDb250ZXh0IGNvbnRleHQsIElDb21wbGV0aW9uUHJvcG9zYWxBY2NlcHRvciBhY2NlcHRvcikgeworCQkvLyBzdWJjbGFzc2VzIG1heSBvdmVycmlkZQorCX0KIAlwdWJsaWMgdm9pZCBjb21wbGV0ZV9EYXRhSW50ZXJjaGFuZ2VQcmVkZWZpbmVkRXhwcmVzc2lvbihFT2JqZWN0IG1vZGVsLCBSdWxlQ2FsbCBydWxlQ2FsbCwgQ29udGVudEFzc2lzdENvbnRleHQgY29udGV4dCwgSUNvbXBsZXRpb25Qcm9wb3NhbEFjY2VwdG9yIGFjY2VwdG9yKSB7CiAJCS8vIHN1YmNsYXNzZXMgbWF5IG92ZXJyaWRlCiAJfQpAQCAtMzIwLDQgKzM4MiwxMCBAQAogCXB1YmxpYyB2b2lkIGNvbXBsZXRlX0VudGl0eU1hbmFnZXJNb2RlKEVPYmplY3QgbW9kZWwsIFJ1bGVDYWxsIHJ1bGVDYWxsLCBDb250ZW50QXNzaXN0Q29udGV4dCBjb250ZXh0LCBJQ29tcGxldGlvblByb3Bvc2FsQWNjZXB0b3IgYWNjZXB0b3IpIHsKIAkJLy8gc3ViY2xhc3NlcyBtYXkgb3ZlcnJpZGUKIAl9CisJcHVibGljIHZvaWQgY29tcGxldGVfQ29uZGl0aW9uQW5kT3BlcmF0b3IxKEVPYmplY3QgbW9kZWwsIFJ1bGVDYWxsIHJ1bGVDYWxsLCBDb250ZW50QXNzaXN0Q29udGV4dCBjb250ZXh0LCBJQ29tcGxldGlvblByb3Bvc2FsQWNjZXB0b3IgYWNjZXB0b3IpIHsKKwkJLy8gc3ViY2xhc3NlcyBtYXkgb3ZlcnJpZGUKKwl9CisJcHVibGljIHZvaWQgY29tcGxldGVfQ29uZGl0aW9uQW5kT3BlcmF0b3IyKEVPYmplY3QgbW9kZWwsIFJ1bGVDYWxsIHJ1bGVDYWxsLCBDb250ZW50QXNzaXN0Q29udGV4dCBjb250ZXh0LCBJQ29tcGxldGlvblByb3Bvc2FsQWNjZXB0b3IgYWNjZXB0b3IpIHsKKwkJLy8gc3ViY2xhc3NlcyBtYXkgb3ZlcnJpZGUKKwl9CiB9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmRhdGFpbnRlcmNoYW5nZS51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvZGF0YWludGVyY2hhbmdlL3VpL2ludGVybmFsL0RhdGFpbnRlcmNoYW5nZUFjdGl2YXRvci5qYXZhIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5kYXRhaW50ZXJjaGFuZ2UudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2RhdGFpbnRlcmNoYW5nZS91aS9pbnRlcm5hbC9EYXRhaW50ZXJjaGFuZ2VBY3RpdmF0b3IuamF2YQppbmRleCA0MTBjOWQ2Li4xN2Y1YzczIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmRhdGFpbnRlcmNoYW5nZS51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvZGF0YWludGVyY2hhbmdlL3VpL2ludGVybmFsL0RhdGFpbnRlcmNoYW5nZUFjdGl2YXRvci5qYXZhCisrKyBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQuZGF0YWludGVyY2hhbmdlLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9kYXRhaW50ZXJjaGFuZ2UvdWkvaW50ZXJuYWwvRGF0YWludGVyY2hhbmdlQWN0aXZhdG9yLmphdmEKQEAgLTMsOSArMywxMSBAQAogICogIENvcHlyaWdodCAoYykgMjAxMSwgMjAxNiAtIExvZXR6IEdtYkgmQ28uS0cgKDY5MTE1IEhlaWRlbGJlcmcsIEdlcm1hbnkpIAogICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgKiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAgICAgICAgICAgCi0gKiAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wICAgICAgIAorICogIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgMi4wICAgICAgICAKICAqICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAgICAgICAgICAgICAgICAgIAotICogIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKiAgaHR0cHM6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKiAgU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICogIENvbnRyaWJ1dG9yczogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAqIAkgICBDaHJpc3RvcGhlIExvZXR6IChMb2V0eiBHbWJIJkNvLktHKSAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLm9zYnAueHRleHQuZGF0YWludGVyY2hhbmdlLnVpL3NyYy9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2RhdGFpbnRlcmNoYW5nZS91aS9EYXRhRFNMRG9jdW1lbnRhdGlvblRyYW5zbGF0b3IuamF2YSBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQuZGF0YWludGVyY2hhbmdlLnVpL3NyYy9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2RhdGFpbnRlcmNoYW5nZS91aS9EYXRhRFNMRG9jdW1lbnRhdGlvblRyYW5zbGF0b3IuamF2YQppbmRleCBhZWFmZDkwLi4yMmVhYThjIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmRhdGFpbnRlcmNoYW5nZS51aS9zcmMvb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9kYXRhaW50ZXJjaGFuZ2UvdWkvRGF0YURTTERvY3VtZW50YXRpb25UcmFuc2xhdG9yLmphdmEKKysrIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5kYXRhaW50ZXJjaGFuZ2UudWkvc3JjL29yZy9lY2xpcHNlL29zYnAveHRleHQvZGF0YWludGVyY2hhbmdlL3VpL0RhdGFEU0xEb2N1bWVudGF0aW9uVHJhbnNsYXRvci5qYXZhCkBAIC0zLDkgKzMsMTEgQEAKICAqIENvcHlyaWdodCAoYykgMjAxMSwgMjAxNiAtIExvZXR6IEdtYkgmQ28uS0cgKDY5MTE1IEhlaWRlbGJlcmcsIEdlcm1hbnkpCiAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgICAgICAgICAgIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wICAgICAgIAorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSAyLjAgICAgICAgIAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgICAgICAgICAgICAgICAgICAKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKiBodHRwczovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAqIENvbnRyaWJ1dG9yczogICAKICAqIENocmlzdG9waGUgTG9ldHogKExvZXR6IEdtYkgmQ28uS0cpIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbiAKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLm9zYnAueHRleHQuZGF0YWludGVyY2hhbmdlLnVpL3NyYy9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2RhdGFpbnRlcmNoYW5nZS91aS9EYXRhRFNMRU9iamVjdEhvdmVyLmphdmEgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmRhdGFpbnRlcmNoYW5nZS51aS9zcmMvb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9kYXRhaW50ZXJjaGFuZ2UvdWkvRGF0YURTTEVPYmplY3RIb3Zlci5qYXZhCmluZGV4IDU3OTlhODcuLmRjNWY4ODQgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLm9zYnAueHRleHQuZGF0YWludGVyY2hhbmdlLnVpL3NyYy9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2RhdGFpbnRlcmNoYW5nZS91aS9EYXRhRFNMRU9iamVjdEhvdmVyLmphdmEKKysrIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5kYXRhaW50ZXJjaGFuZ2UudWkvc3JjL29yZy9lY2xpcHNlL29zYnAveHRleHQvZGF0YWludGVyY2hhbmdlL3VpL0RhdGFEU0xFT2JqZWN0SG92ZXIuamF2YQpAQCAtMyw5ICszLDExIEBACiAgKiBDb3B5cmlnaHQgKGMpIDIwMTEsIDIwMTYgLSBMb2V0eiBHbWJIJkNvLktHICg2OTExNSBIZWlkZWxiZXJnLCBHZXJtYW55KQogICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzICAgICAgICAgICAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCAgICAgICAKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgMi4wICAgICAgICAKICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0ICAgICAgICAgICAgICAgICAgCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICogaHR0cHM6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgKiBDb250cmlidXRvcnM6ICAgCiAgKiBDaHJpc3RvcGhlIExvZXR6IChMb2V0eiBHbWJIJkNvLktHKSAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24gCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmRhdGFpbnRlcmNoYW5nZS51aS9zcmMvb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9kYXRhaW50ZXJjaGFuZ2UvdWkvRGF0YURTTEVPYmplY3RIb3ZlckRvY3VtZW50YXRpb25Qcm92aWRlci5qYXZhIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5kYXRhaW50ZXJjaGFuZ2UudWkvc3JjL29yZy9lY2xpcHNlL29zYnAveHRleHQvZGF0YWludGVyY2hhbmdlL3VpL0RhdGFEU0xFT2JqZWN0SG92ZXJEb2N1bWVudGF0aW9uUHJvdmlkZXIuamF2YQppbmRleCAwMGNmZjI5Li4wNmI1ZGMzIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmRhdGFpbnRlcmNoYW5nZS51aS9zcmMvb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9kYXRhaW50ZXJjaGFuZ2UvdWkvRGF0YURTTEVPYmplY3RIb3ZlckRvY3VtZW50YXRpb25Qcm92aWRlci5qYXZhCisrKyBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQuZGF0YWludGVyY2hhbmdlLnVpL3NyYy9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2RhdGFpbnRlcmNoYW5nZS91aS9EYXRhRFNMRU9iamVjdEhvdmVyRG9jdW1lbnRhdGlvblByb3ZpZGVyLmphdmEKQEAgLTMsOSArMywxMSBAQAogICogQ29weXJpZ2h0IChjKSAyMDExLCAyMDE2IC0gTG9ldHogR21iSCZDby5LRyAoNjkxMTUgSGVpZGVsYmVyZywgR2VybWFueSkKICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAgICAgICAgICAgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgICAgICAgCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIDIuMCAgICAgICAgCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAgICAgICAgICAgICAgICAgIAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAqIGh0dHBzOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAvICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICogQ29udHJpYnV0b3JzOiAgIAogICogQ2hyaXN0b3BoZSBMb2V0eiAoTG9ldHogR21iSCZDby5LRykgLSBpbml0aWFsIGltcGxlbWVudGF0aW9uIApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5kYXRhaW50ZXJjaGFuZ2UudWkvc3JjL29yZy9lY2xpcHNlL29zYnAveHRleHQvZGF0YWludGVyY2hhbmdlL3VpL0RhdGFEU0xFT2JqZWN0SG92ZXJQcm92aWRlci5qYXZhIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5kYXRhaW50ZXJjaGFuZ2UudWkvc3JjL29yZy9lY2xpcHNlL29zYnAveHRleHQvZGF0YWludGVyY2hhbmdlL3VpL0RhdGFEU0xFT2JqZWN0SG92ZXJQcm92aWRlci5qYXZhCmluZGV4IGZlZmY1MmMuLjdkN2ZmNjcgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLm9zYnAueHRleHQuZGF0YWludGVyY2hhbmdlLnVpL3NyYy9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2RhdGFpbnRlcmNoYW5nZS91aS9EYXRhRFNMRU9iamVjdEhvdmVyUHJvdmlkZXIuamF2YQorKysgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmRhdGFpbnRlcmNoYW5nZS51aS9zcmMvb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9kYXRhaW50ZXJjaGFuZ2UvdWkvRGF0YURTTEVPYmplY3RIb3ZlclByb3ZpZGVyLmphdmEKQEAgLTMsOSArMywxMSBAQAogICogQ29weXJpZ2h0IChjKSAyMDExLCAyMDE2IC0gTG9ldHogR21iSCZDby5LRyAoNjkxMTUgSGVpZGVsYmVyZywgR2VybWFueSkKICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAgICAgICAgICAgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgICAgICAgCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIDIuMCAgICAgICAgCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAgICAgICAgICAgICAgICAgIAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAqIGh0dHBzOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAvICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICogQ29udHJpYnV0b3JzOiAgIAogICogQ2hyaXN0b3BoZSBMb2V0eiAoTG9ldHogR21iSCZDby5LRykgLSBpbml0aWFsIGltcGxlbWVudGF0aW9uIApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5kYXRhaW50ZXJjaGFuZ2UudWkvc3JjL29yZy9lY2xpcHNlL29zYnAveHRleHQvZGF0YWludGVyY2hhbmdlL3VpL0RhdGFEU0xVaU1vZHVsZS5qYXZhIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5kYXRhaW50ZXJjaGFuZ2UudWkvc3JjL29yZy9lY2xpcHNlL29zYnAveHRleHQvZGF0YWludGVyY2hhbmdlL3VpL0RhdGFEU0xVaU1vZHVsZS5qYXZhCmluZGV4IGQ5NTI3N2QuLjhiYWJkZmUgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLm9zYnAueHRleHQuZGF0YWludGVyY2hhbmdlLnVpL3NyYy9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2RhdGFpbnRlcmNoYW5nZS91aS9EYXRhRFNMVWlNb2R1bGUuamF2YQorKysgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmRhdGFpbnRlcmNoYW5nZS51aS9zcmMvb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9kYXRhaW50ZXJjaGFuZ2UvdWkvRGF0YURTTFVpTW9kdWxlLmphdmEKQEAgLTMsOSArMywxMSBAQAogICogIENvcHlyaWdodCAoYykgMjAxMSwgMjAxNiAtIExvZXR6IEdtYkgmQ28uS0cgKDY5MTE1IEhlaWRlbGJlcmcsIEdlcm1hbnkpIAogICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgKiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAgICAgICAgICAgCi0gKiAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wICAgICAgIAorICogIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgMi4wICAgICAgICAKICAqICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAgICAgICAgICAgICAgICAgIAotICogIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKiAgaHR0cHM6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKiAgU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICogIENvbnRyaWJ1dG9yczogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAqIAkgICBDaHJpc3RvcGhlIExvZXR6IChMb2V0eiBHbWJIJkNvLktHKSAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLm9zYnAueHRleHQuZGF0YWludGVyY2hhbmdlLnVpL3NyYy9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2RhdGFpbnRlcmNoYW5nZS91aS9jb250ZW50YXNzaXN0L0RhdGFEU0xQcm9wb3NhbFByb3ZpZGVyLnh0ZW5kIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5kYXRhaW50ZXJjaGFuZ2UudWkvc3JjL29yZy9lY2xpcHNlL29zYnAveHRleHQvZGF0YWludGVyY2hhbmdlL3VpL2NvbnRlbnRhc3Npc3QvRGF0YURTTFByb3Bvc2FsUHJvdmlkZXIueHRlbmQKaW5kZXggZGNjYTMyNy4uZjU4ZWJiZiAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5kYXRhaW50ZXJjaGFuZ2UudWkvc3JjL29yZy9lY2xpcHNlL29zYnAveHRleHQvZGF0YWludGVyY2hhbmdlL3VpL2NvbnRlbnRhc3Npc3QvRGF0YURTTFByb3Bvc2FsUHJvdmlkZXIueHRlbmQKKysrIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5kYXRhaW50ZXJjaGFuZ2UudWkvc3JjL29yZy9lY2xpcHNlL29zYnAveHRleHQvZGF0YWludGVyY2hhbmdlL3VpL2NvbnRlbnRhc3Npc3QvRGF0YURTTFByb3Bvc2FsUHJvdmlkZXIueHRlbmQKQEAgLTMsOSArMywxMSBAQAogICogIENvcHlyaWdodCAoYykgMjAxMSwgMjAxNiAtIExvZXR6IEdtYkgmQ28uS0cgKDY5MTE1IEhlaWRlbGJlcmcsIEdlcm1hbnkpIAogICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgKiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAgICAgICAgICAgCi0gKiAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wICAgICAgIAorICogIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgMi4wICAgICAgICAKICAqICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAgICAgICAgICAgICAgICAgIAotICogIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKiAgaHR0cHM6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKiAgU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICogIENvbnRyaWJ1dG9yczogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAqIAkgICBDaHJpc3RvcGhlIExvZXR6IChMb2V0eiBHbWJIJkNvLktHKSAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KQEAgLTE4LDkgKzIwLDExIEBACiBwYWNrYWdlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQuZGF0YWludGVyY2hhbmdlLnVpLmNvbnRlbnRhc3Npc3QKIAogaW1wb3J0IGNvbS5nb29nbGUuaW5qZWN0LkluamVjdAoraW1wb3J0IGphdmEubmlvLmNoYXJzZXQuQ2hhcnNldAogaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0CiBpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TdHlsZWRTdHJpbmcKIGltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmJhc2ljLnVpLmNvbnRlbnRhc3Npc3QuQmFzaWNEU0xQcm9wb3NhbFByb3ZpZGVySGVscGVyCitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5kYXRhaW50ZXJjaGFuZ2UuRGF0YUludGVyY2hhbmdlQmVhbgogaW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAueHRleHQuZGF0YWludGVyY2hhbmdlLnVpLkRhdGFEU0xEb2N1bWVudGF0aW9uVHJhbnNsYXRvcgogaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkZpbGVEaWFsb2cKIGltcG9ydCBvcmcuZWNsaXBzZS53Yi5pbnRlcm5hbC5jb3JlLm5scy51aS5DaG9vc2VMb2NhbGVEaWFsb2cKQEAgLTMyLDExICszNiw2IEBACiBpbXBvcnQgb3JnLmVjbGlwc2UueHRleHQudWkuZWRpdG9yLmNvbnRlbnRhc3Npc3QuQ29udGVudEFzc2lzdENvbnRleHQKIGltcG9ydCBvcmcuZWNsaXBzZS54dGV4dC51aS5lZGl0b3IuY29udGVudGFzc2lzdC5JQ29tcGxldGlvblByb3Bvc2FsQWNjZXB0b3IKIGltcG9ydCBvcmcuZWNsaXBzZS54dGV4dC51aS5lZGl0b3IuY29udGVudGFzc2lzdC5SZXBsYWNlbWVudFRleHRBcHBsaWVyCi1pbXBvcnQgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5kYXRhaW50ZXJjaGFuZ2UuRGF0YUludGVyY2hhbmdlQmVhbgotaW1wb3J0IGphdmEudXRpbC5Tb3J0ZWRNYXAKLWltcG9ydCBqYXZhLm5pby5jaGFyc2V0LkNoYXJzZXQKLWltcG9ydCBqYXZhLnV0aWwuU2V0Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yCiAKIGNsYXNzIExvY2FsZVRleHRBcHBsaWVyIGV4dGVuZHMgUmVwbGFjZW1lbnRUZXh0QXBwbGllciB7CiAJdmFyIENvbnRlbnRBc3Npc3RDb250ZXh0IGNvbnRleHQKQEAgLTE3OSw2ICsxNzgsNyBAQAogCQlJQ29tcGxldGlvblByb3Bvc2FsQWNjZXB0b3IgYWNjZXB0b3IpIHsKIAkJcHJvdmlkZXJIZWxwZXIuY29tcGxldGVfUGFja2FnZU5hbWUobW9kZWwsIHJ1bGVDYWxsLCBjb250ZXh0LCBhY2NlcHRvciwgdGhpcykKIAl9CisJCiAKIAkvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gZGVsZWdhdGVzIHRvIFRlcm1pbmFsc1Byb3Bvc2FsUHJvdmlkZXIgLS0tLS0tLS0tLS0tLS0tLS0KIAlvdmVycmlkZSBwdWJsaWMgdm9pZCBjb21wbGV0ZV9JTlQoRU9iamVjdCBtb2RlbCwgUnVsZUNhbGwgcnVsZUNhbGwsIENvbnRlbnRBc3Npc3RDb250ZXh0IGNvbnRleHQsCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmRhdGFpbnRlcmNoYW5nZS51aS9zcmMvb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9kYXRhaW50ZXJjaGFuZ2UvdWkvbGFiZWxpbmcvRGF0YURTTERlc2NyaXB0aW9uTGFiZWxQcm92aWRlci54dGVuZCBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQuZGF0YWludGVyY2hhbmdlLnVpL3NyYy9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2RhdGFpbnRlcmNoYW5nZS91aS9sYWJlbGluZy9EYXRhRFNMRGVzY3JpcHRpb25MYWJlbFByb3ZpZGVyLnh0ZW5kCmluZGV4IDNjNjMzMGYuLjc2MDMzOWYgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLm9zYnAueHRleHQuZGF0YWludGVyY2hhbmdlLnVpL3NyYy9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2RhdGFpbnRlcmNoYW5nZS91aS9sYWJlbGluZy9EYXRhRFNMRGVzY3JpcHRpb25MYWJlbFByb3ZpZGVyLnh0ZW5kCisrKyBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQuZGF0YWludGVyY2hhbmdlLnVpL3NyYy9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2RhdGFpbnRlcmNoYW5nZS91aS9sYWJlbGluZy9EYXRhRFNMRGVzY3JpcHRpb25MYWJlbFByb3ZpZGVyLnh0ZW5kCkBAIC0zLDkgKzMsMTEgQEAKICAqICBDb3B5cmlnaHQgKGMpIDIwMTEsIDIwMTYgLSBMb2V0eiBHbWJIJkNvLktHICg2OTExNSBIZWlkZWxiZXJnLCBHZXJtYW55KSAKICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICogIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgICAgICAgICAgIAotICogIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCAgICAgICAKKyAqICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIDIuMCAgICAgICAgCiAgKiAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgICAgICAgICAgICAgICAgICAKLSAqICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICogIGh0dHBzOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAvICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICogIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAqICBDb250cmlidXRvcnM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgKiAJICAgQ2hyaXN0b3BoZSBMb2V0eiAoTG9ldHogR21iSCZDby5LRykgLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmRhdGFpbnRlcmNoYW5nZS51aS9zcmMvb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9kYXRhaW50ZXJjaGFuZ2UvdWkvbGFiZWxpbmcvRGF0YURTTExhYmVsUHJvdmlkZXIueHRlbmQgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmRhdGFpbnRlcmNoYW5nZS51aS9zcmMvb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9kYXRhaW50ZXJjaGFuZ2UvdWkvbGFiZWxpbmcvRGF0YURTTExhYmVsUHJvdmlkZXIueHRlbmQKaW5kZXggMWIxYmZmYi4uMWU4ZmViNCAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5kYXRhaW50ZXJjaGFuZ2UudWkvc3JjL29yZy9lY2xpcHNlL29zYnAveHRleHQvZGF0YWludGVyY2hhbmdlL3VpL2xhYmVsaW5nL0RhdGFEU0xMYWJlbFByb3ZpZGVyLnh0ZW5kCisrKyBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQuZGF0YWludGVyY2hhbmdlLnVpL3NyYy9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2RhdGFpbnRlcmNoYW5nZS91aS9sYWJlbGluZy9EYXRhRFNMTGFiZWxQcm92aWRlci54dGVuZApAQCAtMyw5ICszLDExIEBACiAgKiAgQ29weXJpZ2h0IChjKSAyMDExLCAyMDE2IC0gTG9ldHogR21iSCZDby5LRyAoNjkxMTUgSGVpZGVsYmVyZywgR2VybWFueSkgCiAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAqICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzICAgICAgICAgICAKLSAqICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgICAgICAgCisgKiAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSAyLjAgICAgICAgIAogICogIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0ICAgICAgICAgICAgICAgICAgCi0gKiAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAqICBodHRwczovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAqICBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgKiAgQ29udHJpYnV0b3JzOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICogCSAgIENocmlzdG9waGUgTG9ldHogKExvZXR6IEdtYkgmQ28uS0cpIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5kYXRhaW50ZXJjaGFuZ2UudWkvc3JjL29yZy9lY2xpcHNlL29zYnAveHRleHQvZGF0YWludGVyY2hhbmdlL3VpL291dGxpbmUvRGF0YURTTE91dGxpbmVUcmVlUHJvdmlkZXIueHRlbmQgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmRhdGFpbnRlcmNoYW5nZS51aS9zcmMvb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9kYXRhaW50ZXJjaGFuZ2UvdWkvb3V0bGluZS9EYXRhRFNMT3V0bGluZVRyZWVQcm92aWRlci54dGVuZAppbmRleCA4ODZiYWFmLi5hODE3MWJhIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmRhdGFpbnRlcmNoYW5nZS51aS9zcmMvb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9kYXRhaW50ZXJjaGFuZ2UvdWkvb3V0bGluZS9EYXRhRFNMT3V0bGluZVRyZWVQcm92aWRlci54dGVuZAorKysgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmRhdGFpbnRlcmNoYW5nZS51aS9zcmMvb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9kYXRhaW50ZXJjaGFuZ2UvdWkvb3V0bGluZS9EYXRhRFNMT3V0bGluZVRyZWVQcm92aWRlci54dGVuZApAQCAtMyw5ICszLDExIEBACiAgKiAgQ29weXJpZ2h0IChjKSAyMDExLCAyMDE2IC0gTG9ldHogR21iSCZDby5LRyAoNjkxMTUgSGVpZGVsYmVyZywgR2VybWFueSkgCiAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAqICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzICAgICAgICAgICAKLSAqICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgICAgICAgCisgKiAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSAyLjAgICAgICAgIAogICogIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0ICAgICAgICAgICAgICAgICAgCi0gKiAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAqICBodHRwczovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAqICBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgKiAgQ29udHJpYnV0b3JzOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICogCSAgIENocmlzdG9waGUgTG9ldHogKExvZXR6IEdtYkgmQ28uS0cpIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5kYXRhaW50ZXJjaGFuZ2UudWkvc3JjL29yZy9lY2xpcHNlL29zYnAveHRleHQvZGF0YWludGVyY2hhbmdlL3VpL3F1aWNrZml4L0RhdGFEU0xRdWlja2ZpeFByb3ZpZGVyLnh0ZW5kIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5kYXRhaW50ZXJjaGFuZ2UudWkvc3JjL29yZy9lY2xpcHNlL29zYnAveHRleHQvZGF0YWludGVyY2hhbmdlL3VpL3F1aWNrZml4L0RhdGFEU0xRdWlja2ZpeFByb3ZpZGVyLnh0ZW5kCmluZGV4IGEwZGU5ZjAuLjM0MGVkMWQgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLm9zYnAueHRleHQuZGF0YWludGVyY2hhbmdlLnVpL3NyYy9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2RhdGFpbnRlcmNoYW5nZS91aS9xdWlja2ZpeC9EYXRhRFNMUXVpY2tmaXhQcm92aWRlci54dGVuZAorKysgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmRhdGFpbnRlcmNoYW5nZS51aS9zcmMvb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9kYXRhaW50ZXJjaGFuZ2UvdWkvcXVpY2tmaXgvRGF0YURTTFF1aWNrZml4UHJvdmlkZXIueHRlbmQKQEAgLTMsOSArMywxMSBAQAogICogIENvcHlyaWdodCAoYykgMjAxMSwgMjAxNiAtIExvZXR6IEdtYkgmQ28uS0cgKDY5MTE1IEhlaWRlbGJlcmcsIEdlcm1hbnkpIAogICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgKiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAgICAgICAgICAgCi0gKiAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wICAgICAgIAorICogIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgMi4wICAgICAgICAKICAqICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAgICAgICAgICAgICAgICAgIAotICogIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKiAgaHR0cHM6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKiAgU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICogIENvbnRyaWJ1dG9yczogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAqIAkgICBDaHJpc3RvcGhlIExvZXR6IChMb2V0eiBHbWJIJkNvLktHKSAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLm9zYnAueHRleHQuZGF0YWludGVyY2hhbmdlLnVpL3h0ZW5kLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2RhdGFpbnRlcmNoYW5nZS91aS9jb250ZW50YXNzaXN0L0RhdGFEU0xQcm9wb3NhbFByb3ZpZGVyLmphdmEgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmRhdGFpbnRlcmNoYW5nZS51aS94dGVuZC1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9kYXRhaW50ZXJjaGFuZ2UvdWkvY29udGVudGFzc2lzdC9EYXRhRFNMUHJvcG9zYWxQcm92aWRlci5qYXZhCmluZGV4IDRkYjRlNWUuLmM0MGQwMzkgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLm9zYnAueHRleHQuZGF0YWludGVyY2hhbmdlLnVpL3h0ZW5kLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2RhdGFpbnRlcmNoYW5nZS91aS9jb250ZW50YXNzaXN0L0RhdGFEU0xQcm9wb3NhbFByb3ZpZGVyLmphdmEKKysrIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5kYXRhaW50ZXJjaGFuZ2UudWkveHRlbmQtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvZGF0YWludGVyY2hhbmdlL3VpL2NvbnRlbnRhc3Npc3QvRGF0YURTTFByb3Bvc2FsUHJvdmlkZXIuamF2YQpAQCAtMiw5ICsyLDExIEBACiAgKiBDb3B5cmlnaHQgKGMpIDIwMTEsIDIwMTYgLSBMb2V0eiBHbWJIJkNvLktHICg2OTExNSBIZWlkZWxiZXJnLCBHZXJtYW55KQogICogCiAgKiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgMi4wIAogICogIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqICBodHRwczovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLworICoKKyAqICBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMAogICogCiAgKiAgQ29udHJpYnV0b3JzOgogICogCSAgIENocmlzdG9waGUgTG9ldHogKExvZXR6IEdtYkgmQ28uS0cpIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5kYXRhaW50ZXJjaGFuZ2UudWkveHRlbmQtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvZGF0YWludGVyY2hhbmdlL3VpL2NvbnRlbnRhc3Npc3QvRmlsZU5hbWVUZXh0QXBwbGllci5qYXZhIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5kYXRhaW50ZXJjaGFuZ2UudWkveHRlbmQtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvZGF0YWludGVyY2hhbmdlL3VpL2NvbnRlbnRhc3Npc3QvRmlsZU5hbWVUZXh0QXBwbGllci5qYXZhCmluZGV4IDUwNDI0ZDQuLjM1MzVmMTcgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLm9zYnAueHRleHQuZGF0YWludGVyY2hhbmdlLnVpL3h0ZW5kLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2RhdGFpbnRlcmNoYW5nZS91aS9jb250ZW50YXNzaXN0L0ZpbGVOYW1lVGV4dEFwcGxpZXIuamF2YQorKysgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmRhdGFpbnRlcmNoYW5nZS51aS94dGVuZC1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9kYXRhaW50ZXJjaGFuZ2UvdWkvY29udGVudGFzc2lzdC9GaWxlTmFtZVRleHRBcHBsaWVyLmphdmEKQEAgLTIsOSArMiwxMSBAQAogICogQ29weXJpZ2h0IChjKSAyMDExLCAyMDE2IC0gTG9ldHogR21iSCZDby5LRyAoNjkxMTUgSGVpZGVsYmVyZywgR2VybWFueSkKICAqIAogICogIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIDIuMCAKICAqICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKiAgaHR0cHM6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC8KKyAqCisgKiAgU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAKICAqIAogICogIENvbnRyaWJ1dG9yczoKICAqIAkgICBDaHJpc3RvcGhlIExvZXR6IChMb2V0eiBHbWJIJkNvLktHKSAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLm9zYnAueHRleHQuZGF0YWludGVyY2hhbmdlLnVpL3h0ZW5kLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2RhdGFpbnRlcmNoYW5nZS91aS9jb250ZW50YXNzaXN0L0xvY2FsZVRleHRBcHBsaWVyLmphdmEgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmRhdGFpbnRlcmNoYW5nZS51aS94dGVuZC1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9kYXRhaW50ZXJjaGFuZ2UvdWkvY29udGVudGFzc2lzdC9Mb2NhbGVUZXh0QXBwbGllci5qYXZhCmluZGV4IGZhYWFhZGEuLjI1OTM1MjcgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLm9zYnAueHRleHQuZGF0YWludGVyY2hhbmdlLnVpL3h0ZW5kLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2RhdGFpbnRlcmNoYW5nZS91aS9jb250ZW50YXNzaXN0L0xvY2FsZVRleHRBcHBsaWVyLmphdmEKKysrIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5kYXRhaW50ZXJjaGFuZ2UudWkveHRlbmQtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvZGF0YWludGVyY2hhbmdlL3VpL2NvbnRlbnRhc3Npc3QvTG9jYWxlVGV4dEFwcGxpZXIuamF2YQpAQCAtMiw5ICsyLDExIEBACiAgKiBDb3B5cmlnaHQgKGMpIDIwMTEsIDIwMTYgLSBMb2V0eiBHbWJIJkNvLktHICg2OTExNSBIZWlkZWxiZXJnLCBHZXJtYW55KQogICogCiAgKiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgMi4wIAogICogIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqICBodHRwczovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLworICoKKyAqICBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMAogICogCiAgKiAgQ29udHJpYnV0b3JzOgogICogCSAgIENocmlzdG9waGUgTG9ldHogKExvZXR6IEdtYkgmQ28uS0cpIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5kYXRhaW50ZXJjaGFuZ2UudWkveHRlbmQtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvZGF0YWludGVyY2hhbmdlL3VpL2xhYmVsaW5nL0RhdGFEU0xEZXNjcmlwdGlvbkxhYmVsUHJvdmlkZXIuamF2YSBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQuZGF0YWludGVyY2hhbmdlLnVpL3h0ZW5kLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2RhdGFpbnRlcmNoYW5nZS91aS9sYWJlbGluZy9EYXRhRFNMRGVzY3JpcHRpb25MYWJlbFByb3ZpZGVyLmphdmEKaW5kZXggYTcxMjNiYy4uNmQ3YzhjNiAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5kYXRhaW50ZXJjaGFuZ2UudWkveHRlbmQtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvZGF0YWludGVyY2hhbmdlL3VpL2xhYmVsaW5nL0RhdGFEU0xEZXNjcmlwdGlvbkxhYmVsUHJvdmlkZXIuamF2YQorKysgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmRhdGFpbnRlcmNoYW5nZS51aS94dGVuZC1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9kYXRhaW50ZXJjaGFuZ2UvdWkvbGFiZWxpbmcvRGF0YURTTERlc2NyaXB0aW9uTGFiZWxQcm92aWRlci5qYXZhCkBAIC0yLDkgKzIsMTEgQEAKICAqIENvcHlyaWdodCAoYykgMjAxMSwgMjAxNiAtIExvZXR6IEdtYkgmQ28uS0cgKDY5MTE1IEhlaWRlbGJlcmcsIEdlcm1hbnkpCiAgKiAKICAqICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSAyLjAgCiAgKiAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICogIGh0dHBzOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAvCisgKgorICogIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wCiAgKiAKICAqICBDb250cmlidXRvcnM6CiAgKiAJICAgQ2hyaXN0b3BoZSBMb2V0eiAoTG9ldHogR21iSCZDby5LRykgLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmRhdGFpbnRlcmNoYW5nZS51aS94dGVuZC1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9kYXRhaW50ZXJjaGFuZ2UvdWkvbGFiZWxpbmcvRGF0YURTTExhYmVsUHJvdmlkZXIuamF2YSBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQuZGF0YWludGVyY2hhbmdlLnVpL3h0ZW5kLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2RhdGFpbnRlcmNoYW5nZS91aS9sYWJlbGluZy9EYXRhRFNMTGFiZWxQcm92aWRlci5qYXZhCmluZGV4IDIyNDg0ZjYuLmI5NzBiOTggMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLm9zYnAueHRleHQuZGF0YWludGVyY2hhbmdlLnVpL3h0ZW5kLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2RhdGFpbnRlcmNoYW5nZS91aS9sYWJlbGluZy9EYXRhRFNMTGFiZWxQcm92aWRlci5qYXZhCisrKyBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQuZGF0YWludGVyY2hhbmdlLnVpL3h0ZW5kLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2RhdGFpbnRlcmNoYW5nZS91aS9sYWJlbGluZy9EYXRhRFNMTGFiZWxQcm92aWRlci5qYXZhCkBAIC0yLDkgKzIsMTEgQEAKICAqIENvcHlyaWdodCAoYykgMjAxMSwgMjAxNiAtIExvZXR6IEdtYkgmQ28uS0cgKDY5MTE1IEhlaWRlbGJlcmcsIEdlcm1hbnkpCiAgKiAKICAqICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSAyLjAgCiAgKiAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICogIGh0dHBzOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAvCisgKgorICogIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wCiAgKiAKICAqICBDb250cmlidXRvcnM6CiAgKiAJICAgQ2hyaXN0b3BoZSBMb2V0eiAoTG9ldHogR21iSCZDby5LRykgLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmRhdGFpbnRlcmNoYW5nZS51aS94dGVuZC1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9kYXRhaW50ZXJjaGFuZ2UvdWkvb3V0bGluZS9EYXRhRFNMT3V0bGluZVRyZWVQcm92aWRlci5qYXZhIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5kYXRhaW50ZXJjaGFuZ2UudWkveHRlbmQtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvZGF0YWludGVyY2hhbmdlL3VpL291dGxpbmUvRGF0YURTTE91dGxpbmVUcmVlUHJvdmlkZXIuamF2YQppbmRleCA5NWJkNzFkLi45OWU1NDAzIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmRhdGFpbnRlcmNoYW5nZS51aS94dGVuZC1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9kYXRhaW50ZXJjaGFuZ2UvdWkvb3V0bGluZS9EYXRhRFNMT3V0bGluZVRyZWVQcm92aWRlci5qYXZhCisrKyBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQuZGF0YWludGVyY2hhbmdlLnVpL3h0ZW5kLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2RhdGFpbnRlcmNoYW5nZS91aS9vdXRsaW5lL0RhdGFEU0xPdXRsaW5lVHJlZVByb3ZpZGVyLmphdmEKQEAgLTIsOSArMiwxMSBAQAogICogQ29weXJpZ2h0IChjKSAyMDExLCAyMDE2IC0gTG9ldHogR21iSCZDby5LRyAoNjkxMTUgSGVpZGVsYmVyZywgR2VybWFueSkKICAqIAogICogIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIDIuMCAKICAqICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKiAgaHR0cHM6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC8KKyAqCisgKiAgU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAKICAqIAogICogIENvbnRyaWJ1dG9yczoKICAqIAkgICBDaHJpc3RvcGhlIExvZXR6IChMb2V0eiBHbWJIJkNvLktHKSAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLm9zYnAueHRleHQuZGF0YWludGVyY2hhbmdlLnVpL3h0ZW5kLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2RhdGFpbnRlcmNoYW5nZS91aS9xdWlja2ZpeC9EYXRhRFNMUXVpY2tmaXhQcm92aWRlci5qYXZhIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5kYXRhaW50ZXJjaGFuZ2UudWkveHRlbmQtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvZGF0YWludGVyY2hhbmdlL3VpL3F1aWNrZml4L0RhdGFEU0xRdWlja2ZpeFByb3ZpZGVyLmphdmEKaW5kZXggMWQ5YmViOS4uYjMxOWMyZiAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5kYXRhaW50ZXJjaGFuZ2UudWkveHRlbmQtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvZGF0YWludGVyY2hhbmdlL3VpL3F1aWNrZml4L0RhdGFEU0xRdWlja2ZpeFByb3ZpZGVyLmphdmEKKysrIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5kYXRhaW50ZXJjaGFuZ2UudWkveHRlbmQtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvZGF0YWludGVyY2hhbmdlL3VpL3F1aWNrZml4L0RhdGFEU0xRdWlja2ZpeFByb3ZpZGVyLmphdmEKQEAgLTIsOSArMiwxMSBAQAogICogQ29weXJpZ2h0IChjKSAyMDExLCAyMDE2IC0gTG9ldHogR21iSCZDby5LRyAoNjkxMTUgSGVpZGVsYmVyZywgR2VybWFueSkKICAqIAogICogIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIDIuMCAKICAqICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKiAgaHR0cHM6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC8KKyAqCisgKiAgU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAKICAqIAogICogIENvbnRyaWJ1dG9yczoKICAqIAkgICBDaHJpc3RvcGhlIExvZXR6IChMb2V0eiBHbWJIJkNvLktHKSAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLm9zYnAueHRleHQuZGF0YWludGVyY2hhbmdlL0xJQ0VOU0UudHh0IGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5kYXRhaW50ZXJjaGFuZ2UvTElDRU5TRS50eHQKaW5kZXggZmY0MmFkNC4uZmM1OTM4ZCAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5kYXRhaW50ZXJjaGFuZ2UvTElDRU5TRS50eHQKKysrIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5kYXRhaW50ZXJjaGFuZ2UvTElDRU5TRS50eHQKQEAgLTEsMTYxICsxLDE0MCBAQAotRWNsaXBzZSBQdWJsaWMgTGljZW5zZSAtdiAxLjAKK0VjbGlwc2UgRm91bmRhdGlvbiBTb2Z0d2FyZSBVc2VyIEFncmVlbWVudAogCi1USEUgQUNDT01QQU5ZSU5HIFBST0dSQU0gSVMgUFJPVklERUQgVU5ERVIgVEhFIFRFUk1TIE9GIFRISVMgRUNMSVBTRSBQVUJMSUMgTElDRU5TRSAoIkFHUkVFTUVOVCIpLiBBTlkgVVNFLCBSRVBST0RVQ1RJT04KLU9SIERJU1RSSUJVVElPTiBPRiBUSEUgUFJPR1JBTSBDT05TVElUVVRFUyBSRUNJUElFTlQnUyBBQ0NFUFRBTkNFIE9GIFRISVMgQUdSRUVNRU5ULgorTm92ZW1iZXIgMjIsIDIwMTcKIAotMS4gREVGSU5JVElPTlMKK1VzYWdlIE9mIENvbnRlbnQKIAotIkNvbnRyaWJ1dGlvbiIgbWVhbnM6CitUSEUgRUNMSVBTRSBGT1VOREFUSU9OIE1BS0VTIEFWQUlMQUJMRSBTT0ZUV0FSRSwgRE9DVU1FTlRBVElPTiwgSU5GT1JNQVRJT04KK0FORC9PUiBPVEhFUiBNQVRFUklBTFMgRk9SIE9QRU4gU09VUkNFIFBST0pFQ1RTIChDT0xMRUNUSVZFTFkgIkNPTlRFTlQiKS4gVVNFIE9GCitUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJUyBBR1JFRU1FTlQgQU5EL09SIFRIRQorVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgTElDRU5TRSBBR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQKK0JFTE9XLiBCWSBVU0lORyBUSEUgQ09OVEVOVCwgWU9VIEFHUkVFIFRIQVQgWU9VUiBVU0UgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQKK0JZIFRISVMgQUdSRUVNRU5UIEFORC9PUiBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRQorQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiBJRiBZT1UgRE8gTk9UIEFHUkVFIFRPIFRIRQorVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJUyBBR1JFRU1FTlQgQU5EIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBBTlkKK0FQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1csIFRIRU4gWU9VCitNQVkgTk9UIFVTRSBUSEUgQ09OVEVOVC4KIAotYSkgaW4gdGhlIGNhc2Ugb2YgdGhlIGluaXRpYWwgQ29udHJpYnV0b3IsIHRoZSBpbml0aWFsIGNvZGUgYW5kIGRvY3VtZW50YXRpb24gZGlzdHJpYnV0ZWQgdW5kZXIgdGhpcyBBZ3JlZW1lbnQsIGFuZAorQXBwbGljYWJsZSBMaWNlbnNlcwogCi1iKSBpbiB0aGUgY2FzZSBvZiBlYWNoIHN1YnNlcXVlbnQgQ29udHJpYnV0b3I6CitVbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCwgYWxsIENvbnRlbnQgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UgRm91bmRhdGlvbgoraXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZQorVmVyc2lvbiAyLjAgKCJFUEwiKS4gQSBjb3B5IG9mIHRoZSBFUEwgaXMgcHJvdmlkZWQgd2l0aCB0aGlzIENvbnRlbnQgYW5kIGlzIGFsc28KK2F2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuIEZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLAorIlByb2dyYW0iIHdpbGwgbWVhbiB0aGUgQ29udGVudC4KIAotaSkgY2hhbmdlcyB0byB0aGUgUHJvZ3JhbSwgYW5kCitDb250ZW50IGluY2x1ZGVzLCBidXQgaXMgbm90IGxpbWl0ZWQgdG8sIHNvdXJjZSBjb2RlLCBvYmplY3QgY29kZSwgZG9jdW1lbnRhdGlvbgorYW5kIG90aGVyIGZpbGVzIG1haW50YWluZWQgaW4gdGhlIEVjbGlwc2UgRm91bmRhdGlvbiBzb3VyY2UgY29kZSByZXBvc2l0b3J5CisoIlJlcG9zaXRvcnkiKSBpbiBzb2Z0d2FyZSBtb2R1bGVzICgiTW9kdWxlcyIpIGFuZCBtYWRlIGF2YWlsYWJsZSBhcworZG93bmxvYWRhYmxlIGFyY2hpdmVzICgiRG93bmxvYWRzIikuCiAKLWlpKSBhZGRpdGlvbnMgdG8gdGhlIFByb2dyYW07CistICAgQ29udGVudCBtYXkgYmUgc3RydWN0dXJlZCBhbmQgcGFja2FnZWQgaW50byBtb2R1bGVzIHRvIGZhY2lsaXRhdGUKKyAgICBkZWxpdmVyaW5nLCBleHRlbmRpbmcsIGFuZCB1cGdyYWRpbmcgdGhlIENvbnRlbnQuIFR5cGljYWwgbW9kdWxlcyBtYXkKKyAgICBpbmNsdWRlIHBsdWctaW5zICgiUGx1Zy1pbnMiKSwgcGx1Zy1pbiBmcmFnbWVudHMgKCJGcmFnbWVudHMiKSwgYW5kCisgICAgZmVhdHVyZXMgKCJGZWF0dXJlcyIpLgorLSAgIEVhY2ggUGx1Zy1pbiBvciBGcmFnbWVudCBtYXkgYmUgcGFja2FnZWQgYXMgYSBzdWItZGlyZWN0b3J5IG9yIEpBUgorICAgIChKYXZh4oSiIEFSY2hpdmUpIGluIGEgZGlyZWN0b3J5IG5hbWVkICJwbHVnaW5zIi4KKy0gICBBIEZlYXR1cmUgaXMgYSBidW5kbGUgb2Ygb25lIG9yIG1vcmUgUGx1Zy1pbnMgYW5kL29yIEZyYWdtZW50cyBhbmQKKyAgICBhc3NvY2lhdGVkIG1hdGVyaWFsLiBFYWNoIEZlYXR1cmUgbWF5IGJlIHBhY2thZ2VkIGFzIGEgc3ViLWRpcmVjdG9yeSBpbiBhCisgICAgZGlyZWN0b3J5IG5hbWVkICJmZWF0dXJlcyIuIFdpdGhpbiBhIEZlYXR1cmUsIGZpbGVzIG5hbWVkICJmZWF0dXJlLnhtbCIgbWF5CisgICAgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2YgdGhlIFBsdWctaW5zIGFuZC9vcgorICAgIEZyYWdtZW50cyBhc3NvY2lhdGVkIHdpdGggdGhhdCBGZWF0dXJlLgorLSAgIEZlYXR1cmVzIG1heSBhbHNvIGluY2x1ZGUgb3RoZXIgRmVhdHVyZXMgKCJJbmNsdWRlZCBGZWF0dXJlcyIpLiBXaXRoaW4gYQorICAgIEZlYXR1cmUsIGZpbGVzIG5hbWVkICJmZWF0dXJlLnhtbCIgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQKKyAgICB2ZXJzaW9uIG51bWJlcnMgb2YgSW5jbHVkZWQgRmVhdHVyZXMuCiAKLXdoZXJlIHN1Y2ggY2hhbmdlcyBhbmQvb3IgYWRkaXRpb25zIHRvIHRoZSBQcm9ncmFtIG9yaWdpbmF0ZSBmcm9tIGFuZCBhcmUgZGlzdHJpYnV0ZWQgYnkgdGhhdCBwYXJ0aWN1bGFyIENvbnRyaWJ1dG9yLgotQSBDb250cmlidXRpb24gJ29yaWdpbmF0ZXMnIGZyb20gYSBDb250cmlidXRvciBpZiBpdCB3YXMgYWRkZWQgdG8gdGhlIFByb2dyYW0gYnkgc3VjaCBDb250cmlidXRvciBpdHNlbGYgb3IgYW55b25lCi1hY3Rpbmcgb24gc3VjaCBDb250cmlidXRvcidzIGJlaGFsZi4gQ29udHJpYnV0aW9ucyBkbyBub3QgaW5jbHVkZSBhZGRpdGlvbnMgdG8gdGhlIFByb2dyYW0gd2hpY2g6IChpKSBhcmUgc2VwYXJhdGUKLW1vZHVsZXMgb2Ygc29mdHdhcmUgZGlzdHJpYnV0ZWQgaW4gY29uanVuY3Rpb24gd2l0aCB0aGUgUHJvZ3JhbSB1bmRlciB0aGVpciBvd24gbGljZW5zZSBhZ3JlZW1lbnQsIGFuZCAoaWkpIGFyZSBub3QKLWRlcml2YXRpdmUgd29ya3Mgb2YgdGhlIFByb2dyYW0uCitUaGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgc2hvdWxkIGJlIGNvbnRhaW5lZCBpbgorZmlsZXMgbmFtZWQgImFib3V0Lmh0bWwiICgiQWJvdXRzIikuIFRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgRmVhdHVyZXMKK2FuZCBJbmNsdWRlZCBGZWF0dXJlcyBzaG91bGQgYmUgY29udGFpbmVkIGluIGZpbGVzIG5hbWVkICJsaWNlbnNlLmh0bWwiCisoIkZlYXR1cmUgTGljZW5zZXMiKS4gQWJvdXRzIGFuZCBGZWF0dXJlIExpY2Vuc2VzIG1heSBiZSBsb2NhdGVkIGluIGFueQorZGlyZWN0b3J5IG9mIGEgRG93bmxvYWQgb3IgTW9kdWxlIGluY2x1ZGluZywgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBmb2xsb3dpbmcKK2xvY2F0aW9uczoKIAotIkNvbnRyaWJ1dG9yIiBtZWFucyBhbnkgcGVyc29uIG9yIGVudGl0eSB0aGF0IGRpc3RyaWJ1dGVzIHRoZSBQcm9ncmFtLgorLSAgIFRoZSB0b3AtbGV2ZWwgKHJvb3QpIGRpcmVjdG9yeQorLSAgIFBsdWctaW4gYW5kIEZyYWdtZW50IGRpcmVjdG9yaWVzCistICAgSW5zaWRlIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgcGFja2FnZWQgYXMgSkFScworLSAgIFN1Yi1kaXJlY3RvcmllcyBvZiB0aGUgZGlyZWN0b3J5IG5hbWVkICJzcmMiIG9mIGNlcnRhaW4gUGx1Zy1pbnMKKy0gICBGZWF0dXJlIGRpcmVjdG9yaWVzCiAKLSJMaWNlbnNlZCBQYXRlbnRzICIgbWVhbiBwYXRlbnQgY2xhaW1zIGxpY2Vuc2FibGUgYnkgYSBDb250cmlidXRvciB3aGljaCBhcmUgbmVjZXNzYXJpbHkgaW5mcmluZ2VkIGJ5IHRoZSB1c2Ugb3Igc2FsZSBvZgotaXRzIENvbnRyaWJ1dGlvbiBhbG9uZSBvciB3aGVuIGNvbWJpbmVkIHdpdGggdGhlIFByb2dyYW0uCitOb3RlOiBpZiBhIEZlYXR1cmUgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiBpcyBpbnN0YWxsZWQgdXNpbmcKK3RoZSBQcm92aXNpb25pbmcgVGVjaG5vbG9neSAoYXMgZGVmaW5lZCBiZWxvdyksIHlvdSBtdXN0IGFncmVlIHRvIGEgbGljZW5zZQorKCJGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIikgZHVyaW5nIHRoZSBpbnN0YWxsYXRpb24gcHJvY2Vzcy4gSWYgdGhlIEZlYXR1cmUKK2NvbnRhaW5zIEluY2x1ZGVkIEZlYXR1cmVzLCB0aGUgRmVhdHVyZSBVcGRhdGUgTGljZW5zZSBzaG91bGQgZWl0aGVyIHByb3ZpZGUgeW91Cit3aXRoIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgdGhlIEluY2x1ZGVkIEZlYXR1cmVzIG9yIGluZm9ybSB5b3UKK3doZXJlIHlvdSBjYW4gbG9jYXRlIHRoZW0uIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIG1heSBiZSBmb3VuZCBpbiB0aGUgImxpY2Vuc2UiCitwcm9wZXJ0eSBvZiBmaWxlcyBuYW1lZCAiZmVhdHVyZS5wcm9wZXJ0aWVzIiBmb3VuZCB3aXRoaW4gYSBGZWF0dXJlLiBTdWNoCitBYm91dHMsIEZlYXR1cmUgTGljZW5zZXMsIGFuZCBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBjb250YWluIHRoZSB0ZXJtcyBhbmQKK2NvbmRpdGlvbnMgKG9yIHJlZmVyZW5jZXMgdG8gc3VjaCB0ZXJtcyBhbmQgY29uZGl0aW9ucykgdGhhdCBnb3Zlcm4geW91ciB1c2Ugb2YKK3RoZSBhc3NvY2lhdGVkIENvbnRlbnQgaW4gdGhhdCBkaXJlY3RvcnkuCiAKLSJQcm9ncmFtIiBtZWFucyB0aGUgQ29udHJpYnV0aW9ucyBkaXN0cmlidXRlZCBpbiBhY2NvcmRhbmNlIHdpdGggdGhpcyBBZ3JlZW1lbnQuCitUSEUgQUJPVVRTLCBGRUFUVVJFIExJQ0VOU0VTLCBBTkQgRkVBVFVSRSBVUERBVEUgTElDRU5TRVMgTUFZIFJFRkVSIFRPIFRIRSBFUEwKK09SIE9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUywgTk9USUNFUyBPUiBURVJNUyBBTkQgQ09ORElUSU9OUy4gU09NRSBPRiBUSEVTRQorT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTIE1BWSBJTkNMVURFIChCVVQgQVJFIE5PVCBMSU1JVEVEIFRPKToKIAotIlJlY2lwaWVudCIgbWVhbnMgYW55b25lIHdobyByZWNlaXZlcyB0aGUgUHJvZ3JhbSB1bmRlciB0aGlzIEFncmVlbWVudCwgaW5jbHVkaW5nIGFsbCBDb250cmlidXRvcnMuCistICAgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoYXZhaWxhYmxlIGF0CisgICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwpCistICAgRWNsaXBzZSBEaXN0cmlidXRpb24gTGljZW5zZSBWZXJzaW9uIDEuMCAoYXZhaWxhYmxlIGF0CisgICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9saWNlbnNlcy9lZGwtdjEuMC5odG1sKQorLSAgIENvbW1vbiBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoYXZhaWxhYmxlIGF0CisgICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwpCistICAgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMS4xIChhdmFpbGFibGUgYXQKKyAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRSkKKy0gICBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSAyLjAgKGF2YWlsYWJsZSBhdAorICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCkKKy0gICBNb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4xIChhdmFpbGFibGUgYXQKKyAgICBodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC9NUEwtMS4xLmh0bWwpCiAKLTIuIEdSQU5UIE9GIFJJR0hUUworSVQgSVMgWU9VUiBPQkxJR0FUSU9OIFRPIFJFQUQgQU5EIEFDQ0VQVCBBTEwgU1VDSCBURVJNUyBBTkQgQ09ORElUSU9OUyBQUklPUiBUTworVVNFIE9GIFRIRSBDT05URU5ULiBJZiBubyBBYm91dCwgRmVhdHVyZSBMaWNlbnNlLCBvciBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIGlzCitwcm92aWRlZCwgcGxlYXNlIGNvbnRhY3QgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiB0byBkZXRlcm1pbmUgd2hhdCB0ZXJtcyBhbmQKK2NvbmRpdGlvbnMgZ292ZXJuIHRoYXQgcGFydGljdWxhciBDb250ZW50LgogCi1hKSBTdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGlzIEFncmVlbWVudCwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIFJlY2lwaWVudCBhIG5vbi1leGNsdXNpdmUsIHdvcmxkd2lkZSwKLXJveWFsdHktZnJlZSBjb3B5cmlnaHQgbGljZW5zZSB0byByZXByb2R1Y2UsIHByZXBhcmUgZGVyaXZhdGl2ZSB3b3JrcyBvZiwgcHVibGljbHkgZGlzcGxheSwgcHVibGljbHkgcGVyZm9ybSwgZGlzdHJpYnV0ZQotYW5kIHN1YmxpY2Vuc2UgdGhlIENvbnRyaWJ1dGlvbiBvZiBzdWNoIENvbnRyaWJ1dG9yLCBpZiBhbnksIGFuZCBzdWNoIGRlcml2YXRpdmUgd29ya3MsIGluIHNvdXJjZSBjb2RlIGFuZCBvYmplY3QgY29kZQotZm9ybS4KK1VzZSBvZiBQcm92aXNpb25pbmcgVGVjaG5vbG9neQogCi1iKSBTdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGlzIEFncmVlbWVudCwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIFJlY2lwaWVudCBhIG5vbi1leGNsdXNpdmUsIHdvcmxkd2lkZSwKLXJveWFsdHktZnJlZSBwYXRlbnQgbGljZW5zZSB1bmRlciBMaWNlbnNlZCBQYXRlbnRzIHRvIG1ha2UsIHVzZSwgc2VsbCwgb2ZmZXIgdG8gc2VsbCwgaW1wb3J0IGFuZCBvdGhlcndpc2UgdHJhbnNmZXIgdGhlCi1Db250cmlidXRpb24gb2Ygc3VjaCBDb250cmlidXRvciwgaWYgYW55LCBpbiBzb3VyY2UgY29kZSBhbmQgb2JqZWN0IGNvZGUgZm9ybS4gVGhpcyBwYXRlbnQgbGljZW5zZSBzaGFsbCBhcHBseSB0byB0aGUKLWNvbWJpbmF0aW9uIG9mIHRoZSBDb250cmlidXRpb24gYW5kIHRoZSBQcm9ncmFtIGlmLCBhdCB0aGUgdGltZSB0aGUgQ29udHJpYnV0aW9uIGlzIGFkZGVkIGJ5IHRoZSBDb250cmlidXRvciwgc3VjaAotYWRkaXRpb24gb2YgdGhlIENvbnRyaWJ1dGlvbiBjYXVzZXMgc3VjaCBjb21iaW5hdGlvbiB0byBiZSBjb3ZlcmVkIGJ5IHRoZSBMaWNlbnNlZCBQYXRlbnRzLiBUaGUgcGF0ZW50IGxpY2Vuc2Ugc2hhbGwgbm90Ci1hcHBseSB0byBhbnkgb3RoZXIgY29tYmluYXRpb25zIHdoaWNoIGluY2x1ZGUgdGhlIENvbnRyaWJ1dGlvbi4gTm8gaGFyZHdhcmUgcGVyIHNlIGlzIGxpY2Vuc2VkIGhlcmV1bmRlci4KK1RoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWFrZXMgYXZhaWxhYmxlIHByb3Zpc2lvbmluZyBzb2Z0d2FyZSwgZXhhbXBsZXMgb2Ygd2hpY2gKK2luY2x1ZGUsIGJ1dCBhcmUgbm90IGxpbWl0ZWQgdG8sIHAyIGFuZCB0aGUgRWNsaXBzZSBVcGRhdGUgTWFuYWdlcgorKCJQcm92aXNpb25pbmcgVGVjaG5vbG9neSIpIGZvciB0aGUgcHVycG9zZSBvZiBhbGxvd2luZyB1c2VycyB0byBpbnN0YWxsCitzb2Z0d2FyZSwgZG9jdW1lbnRhdGlvbiwgaW5mb3JtYXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyAoY29sbGVjdGl2ZWx5CisiSW5zdGFsbGFibGUgU29mdHdhcmUiKS4gVGhpcyBjYXBhYmlsaXR5IGlzIHByb3ZpZGVkIHdpdGggdGhlIGludGVudCBvZiBhbGxvd2luZworc3VjaCB1c2VycyB0byBpbnN0YWxsLCBleHRlbmQgYW5kIHVwZGF0ZSBFY2xpcHNlLWJhc2VkIHByb2R1Y3RzLiBJbmZvcm1hdGlvbgorYWJvdXQgcGFja2FnaW5nIEluc3RhbGxhYmxlIFNvZnR3YXJlIGlzIGF2YWlsYWJsZSBhdAoraHR0cDovL2VjbGlwc2Uub3JnL2VxdWlub3gvcDIvcmVwb3NpdG9yeV9wYWNrYWdpbmcuaHRtbCAoIlNwZWNpZmljYXRpb24iKS4KIAotYykgUmVjaXBpZW50IHVuZGVyc3RhbmRzIHRoYXQgYWx0aG91Z2ggZWFjaCBDb250cmlidXRvciBncmFudHMgdGhlIGxpY2Vuc2VzIHRvIGl0cyBDb250cmlidXRpb25zIHNldCBmb3J0aCBoZXJlaW4sIG5vCi1hc3N1cmFuY2VzIGFyZSBwcm92aWRlZCBieSBhbnkgQ29udHJpYnV0b3IgdGhhdCB0aGUgUHJvZ3JhbSBkb2VzIG5vdCBpbmZyaW5nZSB0aGUgcGF0ZW50IG9yIG90aGVyIGludGVsbGVjdHVhbCBwcm9wZXJ0eQotcmlnaHRzIG9mIGFueSBvdGhlciBlbnRpdHkuIEVhY2ggQ29udHJpYnV0b3IgZGlzY2xhaW1zIGFueSBsaWFiaWxpdHkgdG8gUmVjaXBpZW50IGZvciBjbGFpbXMgYnJvdWdodCBieSBhbnkgb3RoZXIgZW50aXR5Ci1iYXNlZCBvbiBpbmZyaW5nZW1lbnQgb2YgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBvciBvdGhlcndpc2UuIEFzIGEgY29uZGl0aW9uIHRvIGV4ZXJjaXNpbmcgdGhlIHJpZ2h0cyBhbmQKLWxpY2Vuc2VzIGdyYW50ZWQgaGVyZXVuZGVyLCBlYWNoIFJlY2lwaWVudCBoZXJlYnkgYXNzdW1lcyBzb2xlIHJlc3BvbnNpYmlsaXR5IHRvIHNlY3VyZSBhbnkgb3RoZXIgaW50ZWxsZWN0dWFsIHByb3BlcnR5Ci1yaWdodHMgbmVlZGVkLCBpZiBhbnkuIEZvciBleGFtcGxlLCBpZiBhIHRoaXJkIHBhcnR5IHBhdGVudCBsaWNlbnNlIGlzIHJlcXVpcmVkIHRvIGFsbG93IFJlY2lwaWVudCB0byBkaXN0cmlidXRlIHRoZQotUHJvZ3JhbSwgaXQgaXMgUmVjaXBpZW50J3MgcmVzcG9uc2liaWxpdHkgdG8gYWNxdWlyZSB0aGF0IGxpY2Vuc2UgYmVmb3JlIGRpc3RyaWJ1dGluZyB0aGUgUHJvZ3JhbS4KK1lvdSBtYXkgdXNlIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5IHRvIGFsbG93IG90aGVyIHBhcnRpZXMgdG8gaW5zdGFsbAorSW5zdGFsbGFibGUgU29mdHdhcmUuIFlvdSBzaGFsbCBiZSByZXNwb25zaWJsZSBmb3IgZW5hYmxpbmcgdGhlIGFwcGxpY2FibGUKK2xpY2Vuc2UgYWdyZWVtZW50cyByZWxhdGluZyB0byB0aGUgSW5zdGFsbGFibGUgU29mdHdhcmUgdG8gYmUgcHJlc2VudGVkIHRvLCBhbmQKK2FjY2VwdGVkIGJ5LCB0aGUgdXNlcnMgb2YgdGhlIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5IGluIGFjY29yZGFuY2Ugd2l0aCB0aGUKK1NwZWNpZmljYXRpb24uIEJ5IHVzaW5nIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5IGluIHN1Y2ggYSBtYW5uZXIgYW5kIG1ha2luZyBpdAorYXZhaWxhYmxlIGluIGFjY29yZGFuY2Ugd2l0aCB0aGUgU3BlY2lmaWNhdGlvbiwgeW91IGZ1cnRoZXIgYWNrbm93bGVkZ2UgeW91cgorYWdyZWVtZW50IHRvLCBhbmQgdGhlIGFjcXVpc2l0aW9uIG9mIGFsbCBuZWNlc3NhcnkgcmlnaHRzIHRvIHBlcm1pdCB0aGUKK2ZvbGxvd2luZzoKIAotZCkgRWFjaCBDb250cmlidXRvciByZXByZXNlbnRzIHRoYXQgdG8gaXRzIGtub3dsZWRnZSBpdCBoYXMgc3VmZmljaWVudCBjb3B5cmlnaHQgcmlnaHRzIGluIGl0cyBDb250cmlidXRpb24sIGlmIGFueSwgdG8KLWdyYW50IHRoZSBjb3B5cmlnaHQgbGljZW5zZSBzZXQgZm9ydGggaW4gdGhpcyBBZ3JlZW1lbnQuCisxLiAgQSBzZXJpZXMgb2YgYWN0aW9ucyBtYXkgb2NjdXIgKCJQcm92aXNpb25pbmcgUHJvY2VzcyIpIGluIHdoaWNoIGEgdXNlciBtYXkKKyAgICBleGVjdXRlIHRoZSBQcm92aXNpb25pbmcgVGVjaG5vbG9neSBvbiBhIG1hY2hpbmUgKCJUYXJnZXQgTWFjaGluZSIpIHdpdGggdGhlCisgICAgaW50ZW50IG9mIGluc3RhbGxpbmcsIGV4dGVuZGluZyBvciB1cGRhdGluZyB0aGUgZnVuY3Rpb25hbGl0eSBvZiBhbgorICAgIEVjbGlwc2UtYmFzZWQgcHJvZHVjdC4KKzIuICBEdXJpbmcgdGhlIFByb3Zpc2lvbmluZyBQcm9jZXNzLCB0aGUgUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kgbWF5IGNhdXNlIHRoaXJkCisgICAgcGFydHkgSW5zdGFsbGFibGUgU29mdHdhcmUgb3IgYSBwb3J0aW9uIHRoZXJlb2YgdG8gYmUgYWNjZXNzZWQgYW5kIGNvcGllZCB0bworICAgIHRoZSBUYXJnZXQgTWFjaGluZS4KKzMuICBQdXJzdWFudCB0byB0aGUgU3BlY2lmaWNhdGlvbiwgeW91IHdpbGwgcHJvdmlkZSB0byB0aGUgdXNlciB0aGUgdGVybXMgYW5kCisgICAgY29uZGl0aW9ucyB0aGF0IGdvdmVybiB0aGUgdXNlIG9mIHRoZSBJbnN0YWxsYWJsZSBTb2Z0d2FyZSAoIkluc3RhbGxhYmxlCisgICAgU29mdHdhcmUgQWdyZWVtZW50IikgYW5kIHN1Y2ggSW5zdGFsbGFibGUgU29mdHdhcmUgQWdyZWVtZW50IHNoYWxsIGJlCisgICAgYWNjZXNzZWQgZnJvbSB0aGUgVGFyZ2V0IE1hY2hpbmUgaW4gYWNjb3JkYW5jZSB3aXRoIHRoZSBTcGVjaWZpY2F0aW9uLiBTdWNoCisgICAgSW5zdGFsbGFibGUgU29mdHdhcmUgQWdyZWVtZW50IG11c3QgaW5mb3JtIHRoZSB1c2VyIG9mIHRoZSB0ZXJtcyBhbmQKKyAgICBjb25kaXRpb25zIHRoYXQgZ292ZXJuIHRoZSBJbnN0YWxsYWJsZSBTb2Z0d2FyZSBhbmQgbXVzdCBzb2xpY2l0IGFjY2VwdGFuY2UKKyAgICBieSB0aGUgZW5kIHVzZXIgaW4gdGhlIG1hbm5lciBwcmVzY3JpYmVkIGluIHN1Y2ggSW5zdGFsbGFibGUKKyAgICBTb2Z0d2FyZSBBZ3JlZW1lbnQuIFVwb24gc3VjaCBpbmRpY2F0aW9uIG9mIGFncmVlbWVudCBieSB0aGUgdXNlciwgdGhlCisgICAgcHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kgd2lsbCBjb21wbGV0ZSBpbnN0YWxsYXRpb24gb2YgdGhlCisgICAgSW5zdGFsbGFibGUgU29mdHdhcmUuCiAKLTMuIFJFUVVJUkVNRU5UUworQ3J5cHRvZ3JhcGh5CiAKLUEgQ29udHJpYnV0b3IgbWF5IGNob29zZSB0byBkaXN0cmlidXRlIHRoZSBQcm9ncmFtIGluIG9iamVjdCBjb2RlIGZvcm0gdW5kZXIgaXRzIG93biBsaWNlbnNlIGFncmVlbWVudCwgcHJvdmlkZWQgdGhhdDoKK0NvbnRlbnQgbWF5IGNvbnRhaW4gZW5jcnlwdGlvbiBzb2Z0d2FyZS4gVGhlIGNvdW50cnkgaW4gd2hpY2ggeW91IGFyZSBjdXJyZW50bHkKK21heSBoYXZlIHJlc3RyaWN0aW9ucyBvbiB0aGUgaW1wb3J0LCBwb3NzZXNzaW9uLCBhbmQgdXNlLCBhbmQvb3IgcmUtZXhwb3J0IHRvCithbm90aGVyIGNvdW50cnksIG9mIGVuY3J5cHRpb24gc29mdHdhcmUuIEJFRk9SRSB1c2luZyBhbnkgZW5jcnlwdGlvbiBzb2Z0d2FyZSwKK3BsZWFzZSBjaGVjayB0aGUgY291bnRyeSdzIGxhd3MsIHJlZ3VsYXRpb25zIGFuZCBwb2xpY2llcyBjb25jZXJuaW5nIHRoZSBpbXBvcnQsCitwb3NzZXNzaW9uLCBvciB1c2UsIGFuZCByZS1leHBvcnQgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgdG8gc2VlIGlmIHRoaXMgaXMKK3Blcm1pdHRlZC4KIAotYSkgaXQgY29tcGxpZXMgd2l0aCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhpcyBBZ3JlZW1lbnQ7IGFuZAotCi1iKSBpdHMgbGljZW5zZSBhZ3JlZW1lbnQ6Ci0KLWkpIGVmZmVjdGl2ZWx5IGRpc2NsYWltcyBvbiBiZWhhbGYgb2YgYWxsIENvbnRyaWJ1dG9ycyBhbGwgd2FycmFudGllcyBhbmQgY29uZGl0aW9ucywgZXhwcmVzcyBhbmQgaW1wbGllZCwgaW5jbHVkaW5nCi13YXJyYW50aWVzIG9yIGNvbmRpdGlvbnMgb2YgdGl0bGUgYW5kIG5vbi1pbmZyaW5nZW1lbnQsIGFuZCBpbXBsaWVkIHdhcnJhbnRpZXMgb3IgY29uZGl0aW9ucyBvZiBtZXJjaGFudGFiaWxpdHkgYW5kCi1maXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZTsKLQotaWkpIGVmZmVjdGl2ZWx5IGV4Y2x1ZGVzIG9uIGJlaGFsZiBvZiBhbGwgQ29udHJpYnV0b3JzIGFsbCBsaWFiaWxpdHkgZm9yIGRhbWFnZXMsIGluY2x1ZGluZyBkaXJlY3QsIGluZGlyZWN0LCBzcGVjaWFsLAotaW5jaWRlbnRhbCBhbmQgY29uc2VxdWVudGlhbCBkYW1hZ2VzLCBzdWNoIGFzIGxvc3QgcHJvZml0czsKLQotaWlpKSBzdGF0ZXMgdGhhdCBhbnkgcHJvdmlzaW9ucyB3aGljaCBkaWZmZXIgZnJvbSB0aGlzIEFncmVlbWVudCBhcmUgb2ZmZXJlZCBieSB0aGF0IENvbnRyaWJ1dG9yIGFsb25lIGFuZCBub3QgYnkgYW55Ci1vdGhlciBwYXJ0eTsgYW5kCi0KLWl2KSBzdGF0ZXMgdGhhdCBzb3VyY2UgY29kZSBmb3IgdGhlIFByb2dyYW0gaXMgYXZhaWxhYmxlIGZyb20gc3VjaCBDb250cmlidXRvciwgYW5kIGluZm9ybXMgbGljZW5zZWVzIGhvdyB0byBvYnRhaW4gaXQKLWluIGEgcmVhc29uYWJsZSBtYW5uZXIgb24gb3IgdGhyb3VnaCBhIG1lZGl1bSBjdXN0b21hcmlseSB1c2VkIGZvciBzb2Z0d2FyZSBleGNoYW5nZS4KLQotV2hlbiB0aGUgUHJvZ3JhbSBpcyBtYWRlIGF2YWlsYWJsZSBpbiBzb3VyY2UgY29kZSBmb3JtOgotCi1hKSBpdCBtdXN0IGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoaXMgQWdyZWVtZW50OyBhbmQKLQotYikgYSBjb3B5IG9mIHRoaXMgQWdyZWVtZW50IG11c3QgYmUgaW5jbHVkZWQgd2l0aCBlYWNoIGNvcHkgb2YgdGhlIFByb2dyYW0uCi0KLUNvbnRyaWJ1dG9ycyBtYXkgbm90IHJlbW92ZSBvciBhbHRlciBhbnkgY29weXJpZ2h0IG5vdGljZXMgY29udGFpbmVkIHdpdGhpbiB0aGUgUHJvZ3JhbS4KLQotRWFjaCBDb250cmlidXRvciBtdXN0IGlkZW50aWZ5IGl0c2VsZiBhcyB0aGUgb3JpZ2luYXRvciBvZiBpdHMgQ29udHJpYnV0aW9uLCBpZiBhbnksIGluIGEgbWFubmVyIHRoYXQgcmVhc29uYWJseSBhbGxvd3MKLXN1YnNlcXVlbnQgUmVjaXBpZW50cyB0byBpZGVudGlmeSB0aGUgb3JpZ2luYXRvciBvZiB0aGUgQ29udHJpYnV0aW9uLgotCi00LiBDT01NRVJDSUFMIERJU1RSSUJVVElPTgotCi1Db21tZXJjaWFsIGRpc3RyaWJ1dG9ycyBvZiBzb2Z0d2FyZSBtYXkgYWNjZXB0IGNlcnRhaW4gcmVzcG9uc2liaWxpdGllcyB3aXRoIHJlc3BlY3QgdG8gZW5kIHVzZXJzLCBidXNpbmVzcyBwYXJ0bmVycyBhbmQKLXRoZSBsaWtlLiBXaGlsZSB0aGlzIGxpY2Vuc2UgaXMgaW50ZW5kZWQgdG8gZmFjaWxpdGF0ZSB0aGUgY29tbWVyY2lhbCB1c2Ugb2YgdGhlIFByb2dyYW0sIHRoZSBDb250cmlidXRvciB3aG8gaW5jbHVkZXMKLXRoZSBQcm9ncmFtIGluIGEgY29tbWVyY2lhbCBwcm9kdWN0IG9mZmVyaW5nIHNob3VsZCBkbyBzbyBpbiBhIG1hbm5lciB3aGljaCBkb2VzIG5vdCBjcmVhdGUgcG90ZW50aWFsIGxpYWJpbGl0eSBmb3IKLW90aGVyIENvbnRyaWJ1dG9ycy4gVGhlcmVmb3JlLCBpZiBhIENvbnRyaWJ1dG9yIGluY2x1ZGVzIHRoZSBQcm9ncmFtIGluIGEgY29tbWVyY2lhbCBwcm9kdWN0IG9mZmVyaW5nLCBzdWNoIENvbnRyaWJ1dG9yCi0oIkNvbW1lcmNpYWwgQ29udHJpYnV0b3IiKSBoZXJlYnkgYWdyZWVzIHRvIGRlZmVuZCBhbmQgaW5kZW1uaWZ5IGV2ZXJ5IG90aGVyIENvbnRyaWJ1dG9yICgiSW5kZW1uaWZpZWQgQ29udHJpYnV0b3IiKQotYWdhaW5zdCBhbnkgbG9zc2VzLCBkYW1hZ2VzIGFuZCBjb3N0cyAoY29sbGVjdGl2ZWx5ICJMb3NzZXMiKSBhcmlzaW5nIGZyb20gY2xhaW1zLCBsYXdzdWl0cyBhbmQgb3RoZXIgbGVnYWwgYWN0aW9ucwotYnJvdWdodCBieSBhIHRoaXJkIHBhcnR5IGFnYWluc3QgdGhlIEluZGVtbmlmaWVkIENvbnRyaWJ1dG9yIHRvIHRoZSBleHRlbnQgY2F1c2VkIGJ5IHRoZSBhY3RzIG9yIG9taXNzaW9ucyBvZiBzdWNoCi1Db21tZXJjaWFsIENvbnRyaWJ1dG9yIGluIGNvbm5lY3Rpb24gd2l0aCBpdHMgZGlzdHJpYnV0aW9uIG9mIHRoZSBQcm9ncmFtIGluIGEgY29tbWVyY2lhbCBwcm9kdWN0IG9mZmVyaW5nLiBUaGUKLW9ibGlnYXRpb25zIGluIHRoaXMgc2VjdGlvbiBkbyBub3QgYXBwbHkgdG8gYW55IGNsYWltcyBvciBMb3NzZXMgcmVsYXRpbmcgdG8gYW55IGFjdHVhbCBvciBhbGxlZ2VkIGludGVsbGVjdHVhbAotcHJvcGVydHkgaW5mcmluZ2VtZW50LiBJbiBvcmRlciB0byBxdWFsaWZ5LCBhbiBJbmRlbW5pZmllZCBDb250cmlidXRvciBtdXN0OiBhKSBwcm9tcHRseSBub3RpZnkgdGhlIENvbW1lcmNpYWwKLUNvbnRyaWJ1dG9yIGluIHdyaXRpbmcgb2Ygc3VjaCBjbGFpbSwgYW5kIGIpIGFsbG93IHRoZSBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIHRvIGNvbnRyb2wsIGFuZCBjb29wZXJhdGUgd2l0aCB0aGUKLUNvbW1lcmNpYWwgQ29udHJpYnV0b3IgaW4sIHRoZSBkZWZlbnNlIGFuZCBhbnkgcmVsYXRlZCBzZXR0bGVtZW50IG5lZ290aWF0aW9ucy4gVGhlIEluZGVtbmlmaWVkIENvbnRyaWJ1dG9yIG1heQotIHBhcnRpY2lwYXRlIGluIGFueSBzdWNoIGNsYWltIGF0IGl0cyBvd24gZXhwZW5zZS4KLQotRm9yIGV4YW1wbGUsIGEgQ29udHJpYnV0b3IgbWlnaHQgaW5jbHVkZSB0aGUgUHJvZ3JhbSBpbiBhIGNvbW1lcmNpYWwgcHJvZHVjdCBvZmZlcmluZywgUHJvZHVjdCBYLiBUaGF0IENvbnRyaWJ1dG9yIGlzCi10aGVuIGEgQ29tbWVyY2lhbCBDb250cmlidXRvci4gSWYgdGhhdCBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIHRoZW4gbWFrZXMgcGVyZm9ybWFuY2UgY2xhaW1zLCBvciBvZmZlcnMgd2FycmFudGllcwotcmVsYXRlZCB0byBQcm9kdWN0IFgsIHRob3NlIHBlcmZvcm1hbmNlIGNsYWltcyBhbmQgd2FycmFudGllcyBhcmUgc3VjaCBDb21tZXJjaWFsIENvbnRyaWJ1dG9yJ3MgcmVzcG9uc2liaWxpdHkgYWxvbmUuCi1VbmRlciB0aGlzIHNlY3Rpb24sIHRoZSBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIHdvdWxkIGhhdmUgdG8gZGVmZW5kIGNsYWltcyBhZ2FpbnN0IHRoZSBvdGhlciBDb250cmlidXRvcnMgcmVsYXRlZCB0bwotdGhvc2UgcGVyZm9ybWFuY2UgY2xhaW1zIGFuZCB3YXJyYW50aWVzLCBhbmQgaWYgYSBjb3VydCByZXF1aXJlcyBhbnkgb3RoZXIgQ29udHJpYnV0b3IgdG8gcGF5IGFueSBkYW1hZ2VzIGFzIGEgcmVzdWx0LAotdGhlIENvbW1lcmNpYWwgQ29udHJpYnV0b3IgbXVzdCBwYXkgdGhvc2UgZGFtYWdlcy4KLQotNS4gTk8gV0FSUkFOVFkKLQotRVhDRVBUIEFTIEVYUFJFU1NMWSBTRVQgRk9SVEggSU4gVEhJUyBBR1JFRU1FTlQsIFRIRSBQUk9HUkFNIElTIFBST1ZJREVEIE9OIEFOICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUgotQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgRUlUSEVSIEVYUFJFU1MgT1IgSU1QTElFRCBJTkNMVURJTkcsIFdJVEhPVVQgTElNSVRBVElPTiwgQU5ZIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBUSVRMRSwKLU5PTi1JTkZSSU5HRU1FTlQsIE1FUkNIQU5UQUJJTElUWSBPUiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gRWFjaCBSZWNpcGllbnQgaXMgc29sZWx5IHJlc3BvbnNpYmxlIGZvcgotZGV0ZXJtaW5pbmcgdGhlIGFwcHJvcHJpYXRlbmVzcyBvZiB1c2luZyBhbmQgZGlzdHJpYnV0aW5nIHRoZSBQcm9ncmFtIGFuZCBhc3N1bWVzIGFsbCByaXNrcyBhc3NvY2lhdGVkIHdpdGggaXRzCi1leGVyY2lzZSBvZiByaWdodHMgdW5kZXIgdGhpcyBBZ3JlZW1lbnQgLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSByaXNrcyBhbmQgY29zdHMgb2YgcHJvZ3JhbSBlcnJvcnMsIGNvbXBsaWFuY2UKLXdpdGggYXBwbGljYWJsZSBsYXdzLCBkYW1hZ2UgdG8gb3IgbG9zcyBvZiBkYXRhLCBwcm9ncmFtcyBvciBlcXVpcG1lbnQsIGFuZCB1bmF2YWlsYWJpbGl0eSBvciBpbnRlcnJ1cHRpb24gb2Ygb3BlcmF0aW9ucy4KLQotNi4gRElTQ0xBSU1FUiBPRiBMSUFCSUxJVFkKLQotRVhDRVBUIEFTIEVYUFJFU1NMWSBTRVQgRk9SVEggSU4gVEhJUyBBR1JFRU1FTlQsIE5FSVRIRVIgUkVDSVBJRU5UIE5PUiBBTlkgQ09OVFJJQlVUT1JTIFNIQUxMIEhBVkUgQU5ZIExJQUJJTElUWSBGT1IgQU5ZCi1ESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HIFdJVEhPVVQgTElNSVRBVElPTiBMT1NUIFBST0ZJVFMpLAotSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUgotT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT1IgRElTVFJJQlVUSU9OIE9GIFRIRSBQUk9HUkFNIE9SIFRIRSBFWEVSQ0lTRSBPRiBBTlkgUklHSFRTIEdSQU5URUQKLUhFUkVVTkRFUiwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRVMuCi0KLTcuIEdFTkVSQUwKLQotSWYgYW55IHByb3Zpc2lvbiBvZiB0aGlzIEFncmVlbWVudCBpcyBpbnZhbGlkIG9yIHVuZW5mb3JjZWFibGUgdW5kZXIgYXBwbGljYWJsZSBsYXcsIGl0IHNoYWxsIG5vdCBhZmZlY3QgdGhlIHZhbGlkaXR5IG9yCi1lbmZvcmNlYWJpbGl0eSBvZiB0aGUgcmVtYWluZGVyIG9mIHRoZSB0ZXJtcyBvZiB0aGlzIEFncmVlbWVudCwgYW5kIHdpdGhvdXQgZnVydGhlciBhY3Rpb24gYnkgdGhlIHBhcnRpZXMgaGVyZXRvLCBzdWNoCi1wcm92aXNpb24gc2hhbGwgYmUgcmVmb3JtZWQgdG8gdGhlIG1pbmltdW0gZXh0ZW50IG5lY2Vzc2FyeSB0byBtYWtlIHN1Y2ggcHJvdmlzaW9uIHZhbGlkIGFuZCBlbmZvcmNlYWJsZS4KLQotSWYgUmVjaXBpZW50IGluc3RpdHV0ZXMgcGF0ZW50IGxpdGlnYXRpb24gYWdhaW5zdCBhbnkgZW50aXR5IChpbmNsdWRpbmcgYSBjcm9zcy1jbGFpbSBvciBjb3VudGVyY2xhaW0gaW4gYSBsYXdzdWl0KQotYWxsZWdpbmcgdGhhdCB0aGUgUHJvZ3JhbSBpdHNlbGYgKGV4Y2x1ZGluZyBjb21iaW5hdGlvbnMgb2YgdGhlIFByb2dyYW0gd2l0aCBvdGhlciBzb2Z0d2FyZSBvciBoYXJkd2FyZSkgaW5mcmluZ2VzIHN1Y2gKLVJlY2lwaWVudCdzIHBhdGVudChzKSwgdGhlbiBzdWNoIFJlY2lwaWVudCdzIHJpZ2h0cyBncmFudGVkIHVuZGVyIFNlY3Rpb24gMihiKSBzaGFsbCB0ZXJtaW5hdGUgYXMgb2YgdGhlIGRhdGUgc3VjaAotbGl0aWdhdGlvbiBpcyBmaWxlZC4KLQotQWxsIFJlY2lwaWVudCdzIHJpZ2h0cyB1bmRlciB0aGlzIEFncmVlbWVudCBzaGFsbCB0ZXJtaW5hdGUgaWYgaXQgZmFpbHMgdG8gY29tcGx5IHdpdGggYW55IG9mIHRoZSBtYXRlcmlhbCB0ZXJtcyBvcgotY29uZGl0aW9ucyBvZiB0aGlzIEFncmVlbWVudCBhbmQgZG9lcyBub3QgY3VyZSBzdWNoIGZhaWx1cmUgaW4gYSByZWFzb25hYmxlIHBlcmlvZCBvZiB0aW1lIGFmdGVyIGJlY29taW5nIGF3YXJlIG9mIHN1Y2gKLW5vbmNvbXBsaWFuY2UuIElmIGFsbCBSZWNpcGllbnQncyByaWdodHMgdW5kZXIgdGhpcyBBZ3JlZW1lbnQgdGVybWluYXRlLCBSZWNpcGllbnQgYWdyZWVzIHRvIGNlYXNlIHVzZSBhbmQgZGlzdHJpYnV0aW9uCi1vZiB0aGUgUHJvZ3JhbSBhcyBzb29uIGFzIHJlYXNvbmFibHkgcHJhY3RpY2FibGUuIEhvd2V2ZXIsIFJlY2lwaWVudCdzIG9ibGlnYXRpb25zIHVuZGVyIHRoaXMgQWdyZWVtZW50IGFuZCBhbnkgbGljZW5zZXMKLSBncmFudGVkIGJ5IFJlY2lwaWVudCByZWxhdGluZyB0byB0aGUgUHJvZ3JhbSBzaGFsbCBjb250aW51ZSBhbmQgc3Vydml2ZS4KLQotRXZlcnlvbmUgaXMgcGVybWl0dGVkIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUgY29waWVzIG9mIHRoaXMgQWdyZWVtZW50LCBidXQgaW4gb3JkZXIgdG8gYXZvaWQgaW5jb25zaXN0ZW5jeSB0aGUgQWdyZWVtZW50Ci1pcyBjb3B5cmlnaHRlZCBhbmQgbWF5IG9ubHkgYmUgbW9kaWZpZWQgaW4gdGhlIGZvbGxvd2luZyBtYW5uZXIuIFRoZSBBZ3JlZW1lbnQgU3Rld2FyZCByZXNlcnZlcyB0aGUgcmlnaHQgdG8gcHVibGlzaAotbmV3IHZlcnNpb25zIChpbmNsdWRpbmcgcmV2aXNpb25zKSBvZiB0aGlzIEFncmVlbWVudCBmcm9tIHRpbWUgdG8gdGltZS4gTm8gb25lIG90aGVyIHRoYW4gdGhlIEFncmVlbWVudCBTdGV3YXJkIGhhcyB0aGUKLXJpZ2h0IHRvIG1vZGlmeSB0aGlzIEFncmVlbWVudC4gVGhlIEVjbGlwc2UgRm91bmRhdGlvbiBpcyB0aGUgaW5pdGlhbCBBZ3JlZW1lbnQgU3Rld2FyZC4gVGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYXkKLWFzc2lnbiB0aGUgcmVzcG9uc2liaWxpdHkgdG8gc2VydmUgYXMgdGhlIEFncmVlbWVudCBTdGV3YXJkIHRvIGEgc3VpdGFibGUgc2VwYXJhdGUgZW50aXR5LiBFYWNoIG5ldyB2ZXJzaW9uIG9mIHRoZQotQWdyZWVtZW50IHdpbGwgYmUgZ2l2ZW4gYSBkaXN0aW5ndWlzaGluZyB2ZXJzaW9uIG51bWJlci4gVGhlIFByb2dyYW0gKGluY2x1ZGluZyBDb250cmlidXRpb25zKSBtYXkgYWx3YXlzIGJlCi1kaXN0cmlidXRlZCBzdWJqZWN0IHRvIHRoZSB2ZXJzaW9uIG9mIHRoZSBBZ3JlZW1lbnQgdW5kZXIgd2hpY2ggaXQgd2FzIHJlY2VpdmVkLiBJbiBhZGRpdGlvbiwgYWZ0ZXIgYSBuZXcgdmVyc2lvbiBvZgotdGhlIEFncmVlbWVudCBpcyBwdWJsaXNoZWQsIENvbnRyaWJ1dG9yIG1heSBlbGVjdCB0byBkaXN0cmlidXRlIHRoZSBQcm9ncmFtIChpbmNsdWRpbmcgaXRzIENvbnRyaWJ1dGlvbnMpIHVuZGVyIHRoZQotbmV3IHZlcnNpb24uIEV4Y2VwdCBhcyBleHByZXNzbHkgc3RhdGVkIGluIFNlY3Rpb25zIDIoYSkgYW5kIDIoYikgYWJvdmUsIFJlY2lwaWVudCByZWNlaXZlcyBubyByaWdodHMgb3IgbGljZW5zZXMgdG8KLXRoZSBpbnRlbGxlY3R1YWwgcHJvcGVydHkgb2YgYW55IENvbnRyaWJ1dG9yIHVuZGVyIHRoaXMgQWdyZWVtZW50LCB3aGV0aGVyIGV4cHJlc3NseSwgYnkgaW1wbGljYXRpb24sIGVzdG9wcGVsIG9yCi1vdGhlcndpc2UuIEFsbCByaWdodHMgaW4gdGhlIFByb2dyYW0gbm90IGV4cHJlc3NseSBncmFudGVkIHVuZGVyIHRoaXMgQWdyZWVtZW50IGFyZSByZXNlcnZlZC4KLQotVGhpcyBBZ3JlZW1lbnQgaXMgZ292ZXJuZWQgYnkgdGhlIGxhd3Mgb2YgdGhlIFN0YXRlIG9mIE5ldyBZb3JrIGFuZCB0aGUgaW50ZWxsZWN0dWFsIHByb3BlcnR5IGxhd3Mgb2YgdGhlIFVuaXRlZCBTdGF0ZXMKLW9mIEFtZXJpY2EuIE5vIHBhcnR5IHRvIHRoaXMgQWdyZWVtZW50IHdpbGwgYnJpbmcgYSBsZWdhbCBhY3Rpb24gdW5kZXIgdGhpcyBBZ3JlZW1lbnQgbW9yZSB0aGFuIG9uZSB5ZWFyIGFmdGVyIHRoZSBjYXVzZQotb2YgYWN0aW9uIGFyb3NlLiBFYWNoIHBhcnR5IHdhaXZlcyBpdHMgcmlnaHRzIHRvIGEganVyeSB0cmlhbCBpbiBhbnkgcmVzdWx0aW5nIGxpdGlnYXRpb24uClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQorSmF2YSBhbmQgYWxsIEphdmEtYmFzZWQgdHJhZGVtYXJrcyBhcmUgdHJhZGVtYXJrcyBvZiBPcmFjbGUgQ29ycG9yYXRpb24gaW4gdGhlCitVbml0ZWQgU3RhdGVzLCBvdGhlciBjb3VudHJpZXMsIG9yIGJvdGguCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmRhdGFpbnRlcmNoYW5nZS9NRVRBLUlORi9NQU5JRkVTVC5NRiBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQuZGF0YWludGVyY2hhbmdlL01FVEEtSU5GL01BTklGRVNULk1GCmluZGV4IGM4NjY2YTUuLmU1ZmMwYTcgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLm9zYnAueHRleHQuZGF0YWludGVyY2hhbmdlL01FVEEtSU5GL01BTklGRVNULk1GCisrKyBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQuZGF0YWludGVyY2hhbmdlL01FVEEtSU5GL01BTklGRVNULk1GCkBAIC01OCw3ICs1OCw4IEBACiAgb3JnLmVjbGlwc2UueHRlbmQubGliLAogIG9yZy5lY2xpcHNlLm9zYnAuZGF0YWludGVyY2hhbmdlLmFwaTtidW5kbGUtdmVyc2lvbj0iMC45LjAiLAogIG9yZy5lY2xpcHNlLm9zYnAueHRleHQuZGF0YWludGVyY2hhbmdlLmNvbW1vbjtidW5kbGUtdmVyc2lvbj0iMC45LjAiLAotIG9yZy5lY2xpcHNlLm9zYnAuYmxvYjtidW5kbGUtdmVyc2lvbj0iMC45LjAiCisgb3JnLmVjbGlwc2Uub3NicC5ibG9iO2J1bmRsZS12ZXJzaW9uPSIwLjkuMCIsCisgb3JnLmp1bml0CiBJbXBvcnQtUGFja2FnZTogamF2YXgudHJhbnNhY3Rpb24ueGE7dmVyc2lvbj0iWzEuMC4xLDIuMC4wKSIsCiAgb3JnLmFwYWNoZS5sb2c0aiwKICBvcmcuZWNsaXBzZS5lNC5jb3JlLmRpLmV4dGVuc2lvbnMsCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmRhdGFpbnRlcmNoYW5nZS9hYm91dC5odG1sIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5kYXRhaW50ZXJjaGFuZ2UvYWJvdXQuaHRtbAppbmRleCA2NGMwNTk4Li5lOGI4MzRkIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmRhdGFpbnRlcmNoYW5nZS9hYm91dC5odG1sCisrKyBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQuZGF0YWludGVyY2hhbmdlL2Fib3V0Lmh0bWwKQEAgLTgsMTMgKzgsMTMgQEAKIDxib2R5IGxhbmc9IkVOLVVTIj4KIDxoMj5BYm91dCBUaGlzIENvbnRlbnQ8L2gyPgogIAotPHA+SnVuZSAxLCAyMDE2PC9wPgkKKzxwPk5vdmVtYmVyIDMwLCAyMDE3PC9wPgkKIDxoMz5MaWNlbnNlPC9oMz4KIAogPHA+VGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYWtlcyBhdmFpbGFibGUgYWxsIGNvbnRlbnQgaW4gdGhpcyBwbHVnLWluICgmcXVvdDtDb250ZW50JnF1b3Q7KS4gIFVubGVzcyBvdGhlcndpc2UgCiBpbmRpY2F0ZWQgYmVsb3csIHRoZSBDb250ZW50IGlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlCi1FY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wICgmcXVvdDtFUEwmcXVvdDspLiAgQSBjb3B5IG9mIHRoZSBFUEwgaXMgYXZhaWxhYmxlIAotYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sPC9hPi4KK0VjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyLjAgKCZxdW90O0VQTCZxdW90OykuICBBIGNvcHkgb2YgdGhlIEVQTCBpcyBhdmFpbGFibGUgCithdCA8YSBocmVmPSJodHRwczovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wIj5odHRwczovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wPC9hPi4KIEZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAmcXVvdDtQcm9ncmFtJnF1b3Q7IHdpbGwgbWVhbiB0aGUgQ29udGVudC48L3A+CiAKIDxwPklmIHlvdSBkaWQgbm90IHJlY2VpdmUgdGhpcyBDb250ZW50IGRpcmVjdGx5IGZyb20gdGhlIEVjbGlwc2UgRm91bmRhdGlvbiwgdGhlIENvbnRlbnQgaXMgCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmRhdGFpbnRlcmNoYW5nZS9hYm91dC5wcm9wZXJ0aWVzIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5kYXRhaW50ZXJjaGFuZ2UvYWJvdXQucHJvcGVydGllcwppbmRleCBmYWVkMDJjLi5jZTY4ZmQyIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmRhdGFpbnRlcmNoYW5nZS9hYm91dC5wcm9wZXJ0aWVzCisrKyBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQuZGF0YWludGVyY2hhbmdlL2Fib3V0LnByb3BlcnRpZXMKQEAgLTEsOSArMSwxMSBAQAogIwogIyBDb3B5cmlnaHQgKGMpIDIwMTIsIDIwMTYgLSBMb2V0eiBHbWJIJkNvLktHIChIZWlkZWxiZXJnKQogIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIDIuMCAKICMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyMgaHR0cHM6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC8KKyMKKyMgU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAKICMKICMgQ29udHJpYnV0b3JzOgogIyAgICBDaHJpc3RvcGhlIExvZXR6IChMb2V0eiBHbWJIJkNvLktHKSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgpAQCAtMTcsOSArMTksMTEgQEAKIGZlYXR1cmVUZXh0PVwKIENvcHlyaWdodCAoYykgMjAxMi0yMDE2IC0gTG9ldHogR21iSCZDby5LRyBcblwKIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHNcblwKLWFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMFxuXAorYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSAyLjAgXG5cCiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdFxuXAotaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWxcblwKK2h0dHBzOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAvXG5cCitcblwKK1NQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wXG5cCiBcblwKIENvbnRyaWJ1dG9yczpcblwKICAgICBDaHJpc3RvcGhlIExvZXR6IChMb2V0eiBHbWJIJkNvLktHKSAtIGluaXRpYWwgaW1wbGVtZW50YXRpb25cbgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5kYXRhaW50ZXJjaGFuZ2UvYnVpbGQucHJvcGVydGllcyBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQuZGF0YWludGVyY2hhbmdlL2J1aWxkLnByb3BlcnRpZXMKaW5kZXggNzA0NDA1Mi4uMDA3OTBkNSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5kYXRhaW50ZXJjaGFuZ2UvYnVpbGQucHJvcGVydGllcworKysgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmRhdGFpbnRlcmNoYW5nZS9idWlsZC5wcm9wZXJ0aWVzCkBAIC0xLDE0ICsxLDMgQEAKLSMgQ29weXJpZ2h0IChjKSAyMDE0LCBMb2V0eiBHbWJIJkNvLktHIChIZWlkZWxiZXJnKQotIyAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSMgIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCAKLSMgIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IAotIyAgaHR0cHsvL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwgCi0jIAotIyAgQmFzZWQgb24gaWRlYXMgZnJvbSBYdGV4dCwgWHRlbmQsIFhjb3JlCi0jICAgCi0jICBDb250cmlidXRvcnN7ICAKLSMgIAkJSm9lcmcgUmllZ2VsIC0gSW5pdGlhbCBpbXBsZW1lbnRhdGlvbiAKLSMgIAogCiBiaW4uaW5jbHVkZXMgPSBhYm91dC5wcm9wZXJ0aWVzLCAgYWJvdXQubWFwcGluZ3MsICBhYm91dC5pbmksICBhYm91dC5odG1sLCAgLixcCiAgICAgICAgICAgICAgICBtb2RlbC8sXApAQCAtMjAsMTAgKzksMTAgQEAKICAgICAgICAgICAgICAgIC5zZXR0aW5ncy8sXAogICAgICAgICAgICAgICAgbGljZW5zZS5odG1sLFwKICAgICAgICAgICAgICAgIExJQ0VOU0UudHh0LFwKLSAgICAgICAgICAgICAgIGVwbC12MTAuaHRtbAorICAgICAgICAgICAgICAgZXBsLTIuMC5odG1sCiBzcmMuaW5jbHVkZXMgPSBhYm91dC5wcm9wZXJ0aWVzLCAgYWJvdXQubWFwcGluZ3MsICBhYm91dC5pbmksICBhYm91dC5odG1sLCAgbGljZW5zZS5odG1sLFwKICAgICAgICAgICAgICAgIExJQ0VOU0UudHh0LFwKLSAgICAgICAgICAgICAgIGVwbC12MTAuaHRtbAkJCSAgIAorICAgICAgICAgICAgICAgZXBsLTIuMC5odG1sCQkJICAgCiBqYXJzLmNvbXBpbGUub3JkZXIgPSAuCiBzb3VyY2UuLiA9IGVtZi1nZW4vLFwKICAgICAgICAgICAgc3JjLWdlbi8sXApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5kYXRhaW50ZXJjaGFuZ2UvZW1mLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2RhdGFpbnRlcmNoYW5nZS9Db25kaXRpb25BbmRPcGVyYXRvcjEuamF2YSBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQuZGF0YWludGVyY2hhbmdlL2VtZi1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9kYXRhaW50ZXJjaGFuZ2UvQ29uZGl0aW9uQW5kT3BlcmF0b3IxLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYThmNDBkZQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQuZGF0YWludGVyY2hhbmdlL2VtZi1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9kYXRhaW50ZXJjaGFuZ2UvQ29uZGl0aW9uQW5kT3BlcmF0b3IxLmphdmEKQEAgLTAsMCArMSw1MTIgQEAKKy8qKgorICogQ29weXJpZ2h0IChjKSAyMDE0LCBMb2V0eiBHbWJIJkNvLktHIChIZWlkZWxiZXJnKQorICogIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCisgKiAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSAyLjAgIAorICogIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IAorICogIGh0dHBzOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAvIAorICogCisgKiAgU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgCisgKiAKKyAqICBCYXNlZCBvbiBpZGVhcyBmcm9tIFh0ZXh0LCBYdGVuZCwgWGNvcmUKKyAqICAgCisgKiAgQ29udHJpYnV0b3JzOiAgCisgKiAgCQlKb2VyZyBSaWVnZWwgLSBJbml0aWFsIGltcGxlbWVudGF0aW9uIAorICogIAorICovCitwYWNrYWdlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQuZGF0YWludGVyY2hhbmdlOworCitpbXBvcnQgamF2YS51dGlsLkFycmF5czsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRW51bWVyYXRvcjsKKworLyoqCisgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbGl0ZXJhbHMgb2YgdGhlIGVudW1lcmF0aW9uICc8ZW0+PGI+Q29uZGl0aW9uIEFuZCBPcGVyYXRvcjE8L2I+PC9lbT4nLAorICogYW5kIHV0aWxpdHkgbWV0aG9kcyBmb3Igd29ya2luZyB3aXRoIHRoZW0uCisgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5kYXRhaW50ZXJjaGFuZ2UuRGF0YURTTFBhY2thZ2UjZ2V0Q29uZGl0aW9uQW5kT3BlcmF0b3IxKCkKKyAqIEBtb2RlbAorICogQGdlbmVyYXRlZAorICovCitwdWJsaWMgZW51bSBDb25kaXRpb25BbmRPcGVyYXRvcjEgaW1wbGVtZW50cyBFbnVtZXJhdG9yIHsKKwkvKioKKwkgKiBUaGUgJzxlbT48Yj5FcXVhbHM8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjRVFVQUxTX1ZBTFVFCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJRVFVQUxTKDAsICJlcXVhbHMiLCAiPSIpLAorCisJLyoqCisJICogVGhlICc8ZW0+PGI+Tm90ZXF1YWxzPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI05PVEVRVUFMU19WQUxVRQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCU5PVEVRVUFMUygwLCAibm90ZXF1YWxzIiwgIiE9IiksCisKKwkvKioKKwkgKiBUaGUgJzxlbT48Yj5HcmVhdGVydGhlbjwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNHUkVBVEVSVEhFTl9WQUxVRQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCUdSRUFURVJUSEVOKDAsICJncmVhdGVydGhlbiIsICI+IiksCisKKwkvKioKKwkgKiBUaGUgJzxlbT48Yj5HcmVhdGVydGhlbm9yZXF1YWx0bzwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNHUkVBVEVSVEhFTk9SRVFVQUxUT19WQUxVRQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCUdSRUFURVJUSEVOT1JFUVVBTFRPKDAsICJncmVhdGVydGhlbm9yZXF1YWx0byIsICI+PSIpLAorCisJLyoqCisJICogVGhlICc8ZW0+PGI+TGVzc3RoZW48L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjTEVTU1RIRU5fVkFMVUUKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlMRVNTVEhFTigwLCAibGVzc3RoZW4iLCAiPCIpLAorCisJLyoqCisJICogVGhlICc8ZW0+PGI+TGVzc3RoZW5vcmVxdWFsdG88L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjTEVTU1RIRU5PUkVRVUFMVE9fVkFMVUUKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlMRVNTVEhFTk9SRVFVQUxUTygwLCAibGVzc3RoZW5vcmVxdWFsdG8iLCAiPD0iKSwKKworCS8qKgorCSAqIFRoZSAnPGVtPjxiPkluPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI0lOX1ZBTFVFCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJSU4oMCwgImluIiwgImluIiksCisKKwkvKioKKwkgKiBUaGUgJzxlbT48Yj5CZXR3ZWVuPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI0JFVFdFRU5fVkFMVUUKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlCRVRXRUVOKDAsICJiZXR3ZWVuIiwgImJldHdlZW4iKSwKKworCS8qKgorCSAqIFRoZSAnPGVtPjxiPkxpa2U8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjTElLRV9WQUxVRQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCUxJS0UoMCwgImxpa2UiLCAibGlrZSIpLAorCisJLyoqCisJICogVGhlICc8ZW0+PGI+Tm90PC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI05PVF9WQUxVRQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCU5PVCgwLCAibm90IiwgIm5vdCIpLAorCisJLyoqCisJICogVGhlICc8ZW0+PGI+SXNudWxsPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI0lTTlVMTF9WQUxVRQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCUlTTlVMTCgwLCAiaXNudWxsIiwgImlzbnVsbCIpLAorCisJLyoqCisJICogVGhlICc8ZW0+PGI+SXNub3RudWxsPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI0lTTk9UTlVMTF9WQUxVRQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCUlTTk9UTlVMTCgwLCAiaXNub3RudWxsIiwgImlzbm90bnVsbCIpLAorCisJLyoqCisJICogVGhlICc8ZW0+PGI+RXhpc3RzPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI0VYSVNUU19WQUxVRQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCUVYSVNUUygwLCAiZXhpc3RzIiwgImV4aXN0cyIpOworCisJLyoqCisJICogVGhlICc8ZW0+PGI+RXF1YWxzPC9iPjwvZW0+JyBsaXRlcmFsIHZhbHVlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPHA+CisJICogSWYgdGhlIG1lYW5pbmcgb2YgJzxlbT48Yj5FcXVhbHM8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0IGlzbid0IGNsZWFyLAorCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KKwkgKiA8L3A+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjRVFVQUxTCisJICogQG1vZGVsIG5hbWU9ImVxdWFscyIgbGl0ZXJhbD0iPSIKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBFUVVBTFNfVkFMVUUgPSAwOworCisJLyoqCisJICogVGhlICc8ZW0+PGI+Tm90ZXF1YWxzPC9iPjwvZW0+JyBsaXRlcmFsIHZhbHVlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPHA+CisJICogSWYgdGhlIG1lYW5pbmcgb2YgJzxlbT48Yj5Ob3RlcXVhbHM8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0IGlzbid0IGNsZWFyLAorCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KKwkgKiA8L3A+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjTk9URVFVQUxTCisJICogQG1vZGVsIG5hbWU9Im5vdGVxdWFscyIgbGl0ZXJhbD0iIT0iCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTk9URVFVQUxTX1ZBTFVFID0gMDsKKworCS8qKgorCSAqIFRoZSAnPGVtPjxiPkdyZWF0ZXJ0aGVuPC9iPjwvZW0+JyBsaXRlcmFsIHZhbHVlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPHA+CisJICogSWYgdGhlIG1lYW5pbmcgb2YgJzxlbT48Yj5HcmVhdGVydGhlbjwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QgaXNuJ3QgY2xlYXIsCisJICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgorCSAqIDwvcD4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNHUkVBVEVSVEhFTgorCSAqIEBtb2RlbCBuYW1lPSJncmVhdGVydGhlbiIgbGl0ZXJhbD0iPiIKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHUkVBVEVSVEhFTl9WQUxVRSA9IDA7CisKKwkvKioKKwkgKiBUaGUgJzxlbT48Yj5HcmVhdGVydGhlbm9yZXF1YWx0bzwvYj48L2VtPicgbGl0ZXJhbCB2YWx1ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDxwPgorCSAqIElmIHRoZSBtZWFuaW5nIG9mICc8ZW0+PGI+R3JlYXRlcnRoZW5vcmVxdWFsdG88L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0IGlzbid0IGNsZWFyLAorCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KKwkgKiA8L3A+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjR1JFQVRFUlRIRU5PUkVRVUFMVE8KKwkgKiBAbW9kZWwgbmFtZT0iZ3JlYXRlcnRoZW5vcmVxdWFsdG8iIGxpdGVyYWw9Ij49IgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdSRUFURVJUSEVOT1JFUVVBTFRPX1ZBTFVFID0gMDsKKworCS8qKgorCSAqIFRoZSAnPGVtPjxiPkxlc3N0aGVuPC9iPjwvZW0+JyBsaXRlcmFsIHZhbHVlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPHA+CisJICogSWYgdGhlIG1lYW5pbmcgb2YgJzxlbT48Yj5MZXNzdGhlbjwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QgaXNuJ3QgY2xlYXIsCisJICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgorCSAqIDwvcD4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNMRVNTVEhFTgorCSAqIEBtb2RlbCBuYW1lPSJsZXNzdGhlbiIgbGl0ZXJhbD0iPCIKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBMRVNTVEhFTl9WQUxVRSA9IDA7CisKKwkvKioKKwkgKiBUaGUgJzxlbT48Yj5MZXNzdGhlbm9yZXF1YWx0bzwvYj48L2VtPicgbGl0ZXJhbCB2YWx1ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDxwPgorCSAqIElmIHRoZSBtZWFuaW5nIG9mICc8ZW0+PGI+TGVzc3RoZW5vcmVxdWFsdG88L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0IGlzbid0IGNsZWFyLAorCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KKwkgKiA8L3A+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjTEVTU1RIRU5PUkVRVUFMVE8KKwkgKiBAbW9kZWwgbmFtZT0ibGVzc3RoZW5vcmVxdWFsdG8iIGxpdGVyYWw9Ijw9IgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IExFU1NUSEVOT1JFUVVBTFRPX1ZBTFVFID0gMDsKKworCS8qKgorCSAqIFRoZSAnPGVtPjxiPkluPC9iPjwvZW0+JyBsaXRlcmFsIHZhbHVlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPHA+CisJICogSWYgdGhlIG1lYW5pbmcgb2YgJzxlbT48Yj5JbjwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QgaXNuJ3QgY2xlYXIsCisJICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgorCSAqIDwvcD4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNJTgorCSAqIEBtb2RlbCBuYW1lPSJpbiIKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJTl9WQUxVRSA9IDA7CisKKwkvKioKKwkgKiBUaGUgJzxlbT48Yj5CZXR3ZWVuPC9iPjwvZW0+JyBsaXRlcmFsIHZhbHVlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPHA+CisJICogSWYgdGhlIG1lYW5pbmcgb2YgJzxlbT48Yj5CZXR3ZWVuPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdCBpc24ndCBjbGVhciwKKwkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCisJICogPC9wPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI0JFVFdFRU4KKwkgKiBAbW9kZWwgbmFtZT0iYmV0d2VlbiIKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBCRVRXRUVOX1ZBTFVFID0gMDsKKworCS8qKgorCSAqIFRoZSAnPGVtPjxiPkxpa2U8L2I+PC9lbT4nIGxpdGVyYWwgdmFsdWUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8cD4KKwkgKiBJZiB0aGUgbWVhbmluZyBvZiAnPGVtPjxiPkxpa2U8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0IGlzbid0IGNsZWFyLAorCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KKwkgKiA8L3A+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjTElLRQorCSAqIEBtb2RlbCBuYW1lPSJsaWtlIgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IExJS0VfVkFMVUUgPSAwOworCisJLyoqCisJICogVGhlICc8ZW0+PGI+Tm90PC9iPjwvZW0+JyBsaXRlcmFsIHZhbHVlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPHA+CisJICogSWYgdGhlIG1lYW5pbmcgb2YgJzxlbT48Yj5Ob3Q8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0IGlzbid0IGNsZWFyLAorCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KKwkgKiA8L3A+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjTk9UCisJICogQG1vZGVsIG5hbWU9Im5vdCIKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBOT1RfVkFMVUUgPSAwOworCisJLyoqCisJICogVGhlICc8ZW0+PGI+SXNudWxsPC9iPjwvZW0+JyBsaXRlcmFsIHZhbHVlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPHA+CisJICogSWYgdGhlIG1lYW5pbmcgb2YgJzxlbT48Yj5Jc251bGw8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0IGlzbid0IGNsZWFyLAorCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KKwkgKiA8L3A+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjSVNOVUxMCisJICogQG1vZGVsIG5hbWU9ImlzbnVsbCIKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJU05VTExfVkFMVUUgPSAwOworCisJLyoqCisJICogVGhlICc8ZW0+PGI+SXNub3RudWxsPC9iPjwvZW0+JyBsaXRlcmFsIHZhbHVlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPHA+CisJICogSWYgdGhlIG1lYW5pbmcgb2YgJzxlbT48Yj5Jc25vdG51bGw8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0IGlzbid0IGNsZWFyLAorCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KKwkgKiA8L3A+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjSVNOT1ROVUxMCisJICogQG1vZGVsIG5hbWU9Imlzbm90bnVsbCIKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJU05PVE5VTExfVkFMVUUgPSAwOworCisJLyoqCisJICogVGhlICc8ZW0+PGI+RXhpc3RzPC9iPjwvZW0+JyBsaXRlcmFsIHZhbHVlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPHA+CisJICogSWYgdGhlIG1lYW5pbmcgb2YgJzxlbT48Yj5FeGlzdHM8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0IGlzbid0IGNsZWFyLAorCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KKwkgKiA8L3A+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjRVhJU1RTCisJICogQG1vZGVsIG5hbWU9ImV4aXN0cyIKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBFWElTVFNfVkFMVUUgPSAwOworCisJLyoqCisJICogQW4gYXJyYXkgb2YgYWxsIHRoZSAnPGVtPjxiPkNvbmRpdGlvbiBBbmQgT3BlcmF0b3IxPC9iPjwvZW0+JyBlbnVtZXJhdG9ycy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBDb25kaXRpb25BbmRPcGVyYXRvcjFbXSBWQUxVRVNfQVJSQVkgPQorCQluZXcgQ29uZGl0aW9uQW5kT3BlcmF0b3IxW10geworCQkJRVFVQUxTLAorCQkJTk9URVFVQUxTLAorCQkJR1JFQVRFUlRIRU4sCisJCQlHUkVBVEVSVEhFTk9SRVFVQUxUTywKKwkJCUxFU1NUSEVOLAorCQkJTEVTU1RIRU5PUkVRVUFMVE8sCisJCQlJTiwKKwkJCUJFVFdFRU4sCisJCQlMSUtFLAorCQkJTk9ULAorCQkJSVNOVUxMLAorCQkJSVNOT1ROVUxMLAorCQkJRVhJU1RTLAorCQl9OworCisJLyoqCisJICogQSBwdWJsaWMgcmVhZC1vbmx5IGxpc3Qgb2YgYWxsIHRoZSAnPGVtPjxiPkNvbmRpdGlvbiBBbmQgT3BlcmF0b3IxPC9iPjwvZW0+JyBlbnVtZXJhdG9ycy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIExpc3Q8Q29uZGl0aW9uQW5kT3BlcmF0b3IxPiBWQUxVRVMgPSBDb2xsZWN0aW9ucy51bm1vZGlmaWFibGVMaXN0KEFycmF5cy5hc0xpc3QoVkFMVUVTX0FSUkFZKSk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSAnPGVtPjxiPkNvbmRpdGlvbiBBbmQgT3BlcmF0b3IxPC9iPjwvZW0+JyBsaXRlcmFsIHdpdGggdGhlIHNwZWNpZmllZCBsaXRlcmFsIHZhbHVlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHBhcmFtIGxpdGVyYWwgdGhlIGxpdGVyYWwuCisJICogQHJldHVybiB0aGUgbWF0Y2hpbmcgZW51bWVyYXRvciBvciA8Y29kZT5udWxsPC9jb2RlPi4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHN0YXRpYyBDb25kaXRpb25BbmRPcGVyYXRvcjEgZ2V0KFN0cmluZyBsaXRlcmFsKSB7CisJCWZvciAoaW50IGkgPSAwOyBpIDwgVkFMVUVTX0FSUkFZLmxlbmd0aDsgKytpKSB7CisJCQlDb25kaXRpb25BbmRPcGVyYXRvcjEgcmVzdWx0ID0gVkFMVUVTX0FSUkFZW2ldOworCQkJaWYgKHJlc3VsdC50b1N0cmluZygpLmVxdWFscyhsaXRlcmFsKSkgeworCQkJCXJldHVybiByZXN1bHQ7CisJCQl9CisJCX0KKwkJcmV0dXJuIG51bGw7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgJzxlbT48Yj5Db25kaXRpb24gQW5kIE9wZXJhdG9yMTwvYj48L2VtPicgbGl0ZXJhbCB3aXRoIHRoZSBzcGVjaWZpZWQgbmFtZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBwYXJhbSBuYW1lIHRoZSBuYW1lLgorCSAqIEByZXR1cm4gdGhlIG1hdGNoaW5nIGVudW1lcmF0b3Igb3IgPGNvZGU+bnVsbDwvY29kZT4uCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgQ29uZGl0aW9uQW5kT3BlcmF0b3IxIGdldEJ5TmFtZShTdHJpbmcgbmFtZSkgeworCQlmb3IgKGludCBpID0gMDsgaSA8IFZBTFVFU19BUlJBWS5sZW5ndGg7ICsraSkgeworCQkJQ29uZGl0aW9uQW5kT3BlcmF0b3IxIHJlc3VsdCA9IFZBTFVFU19BUlJBWVtpXTsKKwkJCWlmIChyZXN1bHQuZ2V0TmFtZSgpLmVxdWFscyhuYW1lKSkgeworCQkJCXJldHVybiByZXN1bHQ7CisJCQl9CisJCX0KKwkJcmV0dXJuIG51bGw7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgJzxlbT48Yj5Db25kaXRpb24gQW5kIE9wZXJhdG9yMTwvYj48L2VtPicgbGl0ZXJhbCB3aXRoIHRoZSBzcGVjaWZpZWQgaW50ZWdlciB2YWx1ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBwYXJhbSB2YWx1ZSB0aGUgaW50ZWdlciB2YWx1ZS4KKwkgKiBAcmV0dXJuIHRoZSBtYXRjaGluZyBlbnVtZXJhdG9yIG9yIDxjb2RlPm51bGw8L2NvZGU+LgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIENvbmRpdGlvbkFuZE9wZXJhdG9yMSBnZXQoaW50IHZhbHVlKSB7CisJCXN3aXRjaCAodmFsdWUpIHsKKwkJCWNhc2UgRVFVQUxTX1ZBTFVFOiByZXR1cm4gRVFVQUxTOworCQl9CisJCXJldHVybiBudWxsOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByaXZhdGUgZmluYWwgaW50IHZhbHVlOworCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJpdmF0ZSBmaW5hbCBTdHJpbmcgbmFtZTsKKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByaXZhdGUgZmluYWwgU3RyaW5nIGxpdGVyYWw7CisKKwkvKioKKwkgKiBPbmx5IHRoaXMgY2xhc3MgY2FuIGNvbnN0cnVjdCBpbnN0YW5jZXMuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJpdmF0ZSBDb25kaXRpb25BbmRPcGVyYXRvcjEoaW50IHZhbHVlLCBTdHJpbmcgbmFtZSwgU3RyaW5nIGxpdGVyYWwpIHsKKwkJdGhpcy52YWx1ZSA9IHZhbHVlOworCQl0aGlzLm5hbWUgPSBuYW1lOworCQl0aGlzLmxpdGVyYWwgPSBsaXRlcmFsOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBpbnQgZ2V0VmFsdWUoKSB7CisJICByZXR1cm4gdmFsdWU7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFN0cmluZyBnZXROYW1lKCkgeworCSAgcmV0dXJuIG5hbWU7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFN0cmluZyBnZXRMaXRlcmFsKCkgeworCSAgcmV0dXJuIGxpdGVyYWw7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgbGl0ZXJhbCB2YWx1ZSBvZiB0aGUgZW51bWVyYXRvciwgd2hpY2ggaXMgaXRzIHN0cmluZyByZXByZXNlbnRhdGlvbi4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworCQlyZXR1cm4gbGl0ZXJhbDsKKwl9CisJCit9IC8vQ29uZGl0aW9uQW5kT3BlcmF0b3IxCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmRhdGFpbnRlcmNoYW5nZS9lbWYtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvZGF0YWludGVyY2hhbmdlL0NvbmRpdGlvbkFuZE9wZXJhdG9yMi5qYXZhIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5kYXRhaW50ZXJjaGFuZ2UvZW1mLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2RhdGFpbnRlcmNoYW5nZS9Db25kaXRpb25BbmRPcGVyYXRvcjIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MTEyYmRlCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5kYXRhaW50ZXJjaGFuZ2UvZW1mLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2RhdGFpbnRlcmNoYW5nZS9Db25kaXRpb25BbmRPcGVyYXRvcjIuamF2YQpAQCAtMCwwICsxLDIyNiBAQAorLyoqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTQsIExvZXR6IEdtYkgmQ28uS0cgKEhlaWRlbGJlcmcpCisgKiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKKyAqICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIDIuMCAgCisgKiAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgCisgKiAgaHR0cHM6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC8gCisgKiAKKyAqICBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCAKKyAqIAorICogIEJhc2VkIG9uIGlkZWFzIGZyb20gWHRleHQsIFh0ZW5kLCBYY29yZQorICogICAKKyAqICBDb250cmlidXRvcnM6ICAKKyAqICAJCUpvZXJnIFJpZWdlbCAtIEluaXRpYWwgaW1wbGVtZW50YXRpb24gCisgKiAgCisgKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2Uub3NicC54dGV4dC5kYXRhaW50ZXJjaGFuZ2U7CisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FbnVtZXJhdG9yOworCisvKioKKyAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisgKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBsaXRlcmFscyBvZiB0aGUgZW51bWVyYXRpb24gJzxlbT48Yj5Db25kaXRpb24gQW5kIE9wZXJhdG9yMjwvYj48L2VtPicsCisgKiBhbmQgdXRpbGl0eSBtZXRob2RzIGZvciB3b3JraW5nIHdpdGggdGhlbS4KKyAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorICogQHNlZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmRhdGFpbnRlcmNoYW5nZS5EYXRhRFNMUGFja2FnZSNnZXRDb25kaXRpb25BbmRPcGVyYXRvcjIoKQorICogQG1vZGVsCisgKiBAZ2VuZXJhdGVkCisgKi8KK3B1YmxpYyBlbnVtIENvbmRpdGlvbkFuZE9wZXJhdG9yMiBpbXBsZW1lbnRzIEVudW1lcmF0b3IgeworCS8qKgorCSAqIFRoZSAnPGVtPjxiPkFuZDwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNBTkRfVkFMVUUKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlBTkQoMCwgImFuZCIsICJhbmQiKSwKKworCS8qKgorCSAqIFRoZSAnPGVtPjxiPk9yPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI09SX1ZBTFVFCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJT1IoMCwgIm9yIiwgIm9yIik7CisKKwkvKioKKwkgKiBUaGUgJzxlbT48Yj5BbmQ8L2I+PC9lbT4nIGxpdGVyYWwgdmFsdWUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8cD4KKwkgKiBJZiB0aGUgbWVhbmluZyBvZiAnPGVtPjxiPkFuZDwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QgaXNuJ3QgY2xlYXIsCisJICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgorCSAqIDwvcD4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNBTkQKKwkgKiBAbW9kZWwgbmFtZT0iYW5kIgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFORF9WQUxVRSA9IDA7CisKKwkvKioKKwkgKiBUaGUgJzxlbT48Yj5PcjwvYj48L2VtPicgbGl0ZXJhbCB2YWx1ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDxwPgorCSAqIElmIHRoZSBtZWFuaW5nIG9mICc8ZW0+PGI+T3I8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0IGlzbid0IGNsZWFyLAorCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KKwkgKiA8L3A+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjT1IKKwkgKiBAbW9kZWwgbmFtZT0ib3IiCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgT1JfVkFMVUUgPSAwOworCisJLyoqCisJICogQW4gYXJyYXkgb2YgYWxsIHRoZSAnPGVtPjxiPkNvbmRpdGlvbiBBbmQgT3BlcmF0b3IyPC9iPjwvZW0+JyBlbnVtZXJhdG9ycy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBDb25kaXRpb25BbmRPcGVyYXRvcjJbXSBWQUxVRVNfQVJSQVkgPQorCQluZXcgQ29uZGl0aW9uQW5kT3BlcmF0b3IyW10geworCQkJQU5ELAorCQkJT1IsCisJCX07CisKKwkvKioKKwkgKiBBIHB1YmxpYyByZWFkLW9ubHkgbGlzdCBvZiBhbGwgdGhlICc8ZW0+PGI+Q29uZGl0aW9uIEFuZCBPcGVyYXRvcjI8L2I+PC9lbT4nIGVudW1lcmF0b3JzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgTGlzdDxDb25kaXRpb25BbmRPcGVyYXRvcjI+IFZBTFVFUyA9IENvbGxlY3Rpb25zLnVubW9kaWZpYWJsZUxpc3QoQXJyYXlzLmFzTGlzdChWQUxVRVNfQVJSQVkpKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlICc8ZW0+PGI+Q29uZGl0aW9uIEFuZCBPcGVyYXRvcjI8L2I+PC9lbT4nIGxpdGVyYWwgd2l0aCB0aGUgc3BlY2lmaWVkIGxpdGVyYWwgdmFsdWUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcGFyYW0gbGl0ZXJhbCB0aGUgbGl0ZXJhbC4KKwkgKiBAcmV0dXJuIHRoZSBtYXRjaGluZyBlbnVtZXJhdG9yIG9yIDxjb2RlPm51bGw8L2NvZGU+LgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIENvbmRpdGlvbkFuZE9wZXJhdG9yMiBnZXQoU3RyaW5nIGxpdGVyYWwpIHsKKwkJZm9yIChpbnQgaSA9IDA7IGkgPCBWQUxVRVNfQVJSQVkubGVuZ3RoOyArK2kpIHsKKwkJCUNvbmRpdGlvbkFuZE9wZXJhdG9yMiByZXN1bHQgPSBWQUxVRVNfQVJSQVlbaV07CisJCQlpZiAocmVzdWx0LnRvU3RyaW5nKCkuZXF1YWxzKGxpdGVyYWwpKSB7CisJCQkJcmV0dXJuIHJlc3VsdDsKKwkJCX0KKwkJfQorCQlyZXR1cm4gbnVsbDsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSAnPGVtPjxiPkNvbmRpdGlvbiBBbmQgT3BlcmF0b3IyPC9iPjwvZW0+JyBsaXRlcmFsIHdpdGggdGhlIHNwZWNpZmllZCBuYW1lLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHBhcmFtIG5hbWUgdGhlIG5hbWUuCisJICogQHJldHVybiB0aGUgbWF0Y2hpbmcgZW51bWVyYXRvciBvciA8Y29kZT5udWxsPC9jb2RlPi4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHN0YXRpYyBDb25kaXRpb25BbmRPcGVyYXRvcjIgZ2V0QnlOYW1lKFN0cmluZyBuYW1lKSB7CisJCWZvciAoaW50IGkgPSAwOyBpIDwgVkFMVUVTX0FSUkFZLmxlbmd0aDsgKytpKSB7CisJCQlDb25kaXRpb25BbmRPcGVyYXRvcjIgcmVzdWx0ID0gVkFMVUVTX0FSUkFZW2ldOworCQkJaWYgKHJlc3VsdC5nZXROYW1lKCkuZXF1YWxzKG5hbWUpKSB7CisJCQkJcmV0dXJuIHJlc3VsdDsKKwkJCX0KKwkJfQorCQlyZXR1cm4gbnVsbDsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSAnPGVtPjxiPkNvbmRpdGlvbiBBbmQgT3BlcmF0b3IyPC9iPjwvZW0+JyBsaXRlcmFsIHdpdGggdGhlIHNwZWNpZmllZCBpbnRlZ2VyIHZhbHVlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHBhcmFtIHZhbHVlIHRoZSBpbnRlZ2VyIHZhbHVlLgorCSAqIEByZXR1cm4gdGhlIG1hdGNoaW5nIGVudW1lcmF0b3Igb3IgPGNvZGU+bnVsbDwvY29kZT4uCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgQ29uZGl0aW9uQW5kT3BlcmF0b3IyIGdldChpbnQgdmFsdWUpIHsKKwkJc3dpdGNoICh2YWx1ZSkgeworCQkJY2FzZSBBTkRfVkFMVUU6IHJldHVybiBBTkQ7CisJCX0KKwkJcmV0dXJuIG51bGw7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJpdmF0ZSBmaW5hbCBpbnQgdmFsdWU7CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcml2YXRlIGZpbmFsIFN0cmluZyBuYW1lOworCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJpdmF0ZSBmaW5hbCBTdHJpbmcgbGl0ZXJhbDsKKworCS8qKgorCSAqIE9ubHkgdGhpcyBjbGFzcyBjYW4gY29uc3RydWN0IGluc3RhbmNlcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcml2YXRlIENvbmRpdGlvbkFuZE9wZXJhdG9yMihpbnQgdmFsdWUsIFN0cmluZyBuYW1lLCBTdHJpbmcgbGl0ZXJhbCkgeworCQl0aGlzLnZhbHVlID0gdmFsdWU7CisJCXRoaXMubmFtZSA9IG5hbWU7CisJCXRoaXMubGl0ZXJhbCA9IGxpdGVyYWw7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIGludCBnZXRWYWx1ZSgpIHsKKwkgIHJldHVybiB2YWx1ZTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7CisJICByZXR1cm4gbmFtZTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgU3RyaW5nIGdldExpdGVyYWwoKSB7CisJICByZXR1cm4gbGl0ZXJhbDsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBsaXRlcmFsIHZhbHVlIG9mIHRoZSBlbnVtZXJhdG9yLCB3aGljaCBpcyBpdHMgc3RyaW5nIHJlcHJlc2VudGF0aW9uLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisJCXJldHVybiBsaXRlcmFsOworCX0KKwkKK30gLy9Db25kaXRpb25BbmRPcGVyYXRvcjIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLm9zYnAueHRleHQuZGF0YWludGVyY2hhbmdlL2VtZi1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9kYXRhaW50ZXJjaGFuZ2UvRGF0YURTTEZhY3RvcnkuamF2YSBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQuZGF0YWludGVyY2hhbmdlL2VtZi1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9kYXRhaW50ZXJjaGFuZ2UvRGF0YURTTEZhY3RvcnkuamF2YQppbmRleCAxNDBlNTkzLi5kMGRjNzFhIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmRhdGFpbnRlcmNoYW5nZS9lbWYtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvZGF0YWludGVyY2hhbmdlL0RhdGFEU0xGYWN0b3J5LmphdmEKKysrIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5kYXRhaW50ZXJjaGFuZ2UvZW1mLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2RhdGFpbnRlcmNoYW5nZS9EYXRhRFNMRmFjdG9yeS5qYXZhCkBAIC0xLDEzICsxLDE1IEBACiAvKioKICAqIENvcHlyaWdodCAoYykgMjAxNCwgTG9ldHogR21iSCZDby5LRyAoSGVpZGVsYmVyZykKICAqICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCAKKyAqICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIDIuMCAgCiAgKiAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgCi0gKiAgaHR0cHsvL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwgCisgKiAgaHR0cHM6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC8gCisgKiAKKyAqICBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCAKICAqIAogICogIEJhc2VkIG9uIGlkZWFzIGZyb20gWHRleHQsIFh0ZW5kLCBYY29yZQogICogICAKLSAqICBDb250cmlidXRvcnN7ICAKKyAqICBDb250cmlidXRvcnM6ICAKICAqICAJCUpvZXJnIFJpZWdlbCAtIEluaXRpYWwgaW1wbGVtZW50YXRpb24gCiAgKiAgCiAgKi8KQEAgLTE1OSw2ICsxNjEsNDIgQEAKIAlEYXRhSW50ZXJjaGFuZ2VMb29rdXAgY3JlYXRlRGF0YUludGVyY2hhbmdlTG9va3VwKCk7CiAKIAkvKioKKwkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkRhdGEgSW50ZXJjaGFuZ2UgRXhwb3NlPC9lbT4nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5EYXRhIEludGVyY2hhbmdlIEV4cG9zZTwvZW0+Jy4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJRGF0YUludGVyY2hhbmdlRXhwb3NlIGNyZWF0ZURhdGFJbnRlcmNoYW5nZUV4cG9zZSgpOworCisJLyoqCisJICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5EYXRhIEludGVyY2hhbmdlIEV4cG9ydCBGaWx0ZXI8L2VtPicuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkRhdGEgSW50ZXJjaGFuZ2UgRXhwb3J0IEZpbHRlcjwvZW0+Jy4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJRGF0YUludGVyY2hhbmdlRXhwb3J0RmlsdGVyIGNyZWF0ZURhdGFJbnRlcmNoYW5nZUV4cG9ydEZpbHRlcigpOworCisJLyoqCisJICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5EYXRhIEludGVyY2hhbmdlIEZpbHRlciBDb25kaXRpb248L2VtPicuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkRhdGEgSW50ZXJjaGFuZ2UgRmlsdGVyIENvbmRpdGlvbjwvZW0+Jy4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJRGF0YUludGVyY2hhbmdlRmlsdGVyQ29uZGl0aW9uIGNyZWF0ZURhdGFJbnRlcmNoYW5nZUZpbHRlckNvbmRpdGlvbigpOworCisJLyoqCisJICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5EYXRhIEludGVyY2hhbmdlIEV4cG9ydCBIaWRlPC9lbT4nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5EYXRhIEludGVyY2hhbmdlIEV4cG9ydCBIaWRlPC9lbT4nLgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlEYXRhSW50ZXJjaGFuZ2VFeHBvcnRIaWRlIGNyZWF0ZURhdGFJbnRlcmNoYW5nZUV4cG9ydEhpZGUoKTsKKworCS8qKgogCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+RGF0YSBJbnRlcmNoYW5nZSBNYXJrZXIgUGF0aDwvZW0+Jy4KIAkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5kYXRhaW50ZXJjaGFuZ2UvZW1mLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2RhdGFpbnRlcmNoYW5nZS9EYXRhRFNMUGFja2FnZS5qYXZhIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5kYXRhaW50ZXJjaGFuZ2UvZW1mLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2RhdGFpbnRlcmNoYW5nZS9EYXRhRFNMUGFja2FnZS5qYXZhCmluZGV4IDlhZjk5MjMuLjkxYWNmMmEgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLm9zYnAueHRleHQuZGF0YWludGVyY2hhbmdlL2VtZi1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9kYXRhaW50ZXJjaGFuZ2UvRGF0YURTTFBhY2thZ2UuamF2YQorKysgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmRhdGFpbnRlcmNoYW5nZS9lbWYtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvZGF0YWludGVyY2hhbmdlL0RhdGFEU0xQYWNrYWdlLmphdmEKQEAgLTEsMTMgKzEsMTUgQEAKIC8qKgogICogQ29weXJpZ2h0IChjKSAyMDE0LCBMb2V0eiBHbWJIJkNvLktHIChIZWlkZWxiZXJnKQogICogIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIAorICogIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgMi4wICAKICAqICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAKLSAqICBodHRwey8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCAKKyAqICBodHRwczovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLyAKKyAqIAorICogIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIAogICogCiAgKiAgQmFzZWQgb24gaWRlYXMgZnJvbSBYdGV4dCwgWHRlbmQsIFhjb3JlCiAgKiAgIAotICogIENvbnRyaWJ1dG9yc3sgIAorICogIENvbnRyaWJ1dG9yczogIAogICogIAkJSm9lcmcgUmllZ2VsIC0gSW5pdGlhbCBpbXBsZW1lbnRhdGlvbiAKICAqICAKICAqLwpAQCAtMzcsNyArMzksNyBAQAogICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAgKiBAc2VlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQuZGF0YWludGVyY2hhbmdlLkRhdGFEU0xGYWN0b3J5CiAgKiBAbW9kZWwga2luZD0icGFja2FnZSIKLSAqICAgICAgICBhbm5vdGF0aW9uPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIGZpbGVFeHRlbnNpb25zPSdkYXRhJyBtb2RlbE5hbWU9J0RhdGFEU0wnIHByZWZpeD0nRGF0YURTTCcgdXBkYXRlQ2xhc3NwYXRoPSdmYWxzZScgbG9hZEluaXRpYWxpemF0aW9uPSdmYWxzZScgbGl0ZXJhbHNJbnRlcmZhY2U9J3RydWUnIGNvcHlyaWdodFRleHQ9J0NvcHlyaWdodCAoYykgMjAxNCwgTG9ldHogR21iSCZDby5LRyAoSGVpZGVsYmVyZylcclxuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgXHJcbiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgXHJcbiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCBcclxuIGh0dHB7Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIFxyXG5cclxuIEJhc2VkIG9uIGlkZWFzIGZyb20gWHRleHQsIFh0ZW5kLCBYY29yZVxyXG4gIFxyXG4gQ29udHJpYnV0b3JzeyAgXHJcbiBcdFx0Sm9lcmcgUmllZ2VsIC0gSW5pdGlhbCBpbXBsZW1lbnRhdGlvbiBcclxuICcgYmFzZVBhY2thZ2U9J29yZy5lY2xpcHNlLm9zYnAueHRleHQnIgorICogICAgICAgIGFubm90YXRpb249Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwgZmlsZUV4dGVuc2lvbnM9J2RhdGEnIG1vZGVsTmFtZT0nRGF0YURTTCcgcHJlZml4PSdEYXRhRFNMJyB1cGRhdGVDbGFzc3BhdGg9J2ZhbHNlJyBsb2FkSW5pdGlhbGl6YXRpb249J2ZhbHNlJyBsaXRlcmFsc0ludGVyZmFjZT0ndHJ1ZScgY29weXJpZ2h0VGV4dD0nQ29weXJpZ2h0IChjKSAyMDE0LCBMb2V0eiBHbWJIJkNvLktHIChIZWlkZWxiZXJnKVxuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgXG4gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSAyLjAgIFxuIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IFxuIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYyLjAvIFxuXG5TUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMFxuXG4gQmFzZWQgb24gaWRlYXMgZnJvbSBYdGV4dCwgWHRlbmQsIFhjb3JlXG4gIFxuIENvbnRyaWJ1dG9yczogIFxuIFx0XHRKb2VyZyBSaWVnZWwgLSBJbml0aWFsIGltcGxlbWVudGF0aW9uIFxuICcgYmFzZVBhY2thZ2U9J29yZy5lY2xpcHNlLm9zYnAueHRleHQnIgogICogICAgICAgIGFubm90YXRpb249Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUgcm9vdFBhY2thZ2U9J2RhdGFkc2wnIgogICogQGdlbmVyYXRlZAogICovCkBAIC0zNTksMTMgKzM2MSwyMiBAQAogCWludCBEQVRBX0lOVEVSQ0hBTkdFX19QQVRIID0gREFUQV9JTlRFUkNIQU5HRV9CQVNFX0ZFQVRVUkVfQ09VTlQgKyA3OwogCiAJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkRlbGV0ZSBGaWxlIEFmdGVyIEltcG9ydDwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IERBVEFfSU5URVJDSEFOR0VfX0RFTEVURV9GSUxFX0FGVEVSX0lNUE9SVCA9IERBVEFfSU5URVJDSEFOR0VfQkFTRV9GRUFUVVJFX0NPVU5UICsgODsKKworCS8qKgogCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5EYXRhIEludGVyY2hhbmdlPC9lbT4nIGNsYXNzLgogCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqIEBvcmRlcmVkCiAJICovCi0JaW50IERBVEFfSU5URVJDSEFOR0VfRkVBVFVSRV9DT1VOVCA9IERBVEFfSU5URVJDSEFOR0VfQkFTRV9GRUFUVVJFX0NPVU5UICsgODsKKwlpbnQgREFUQV9JTlRFUkNIQU5HRV9GRUFUVVJFX0NPVU5UID0gREFUQV9JTlRFUkNIQU5HRV9CQVNFX0ZFQVRVUkVfQ09VTlQgKyA5OwogCiAJLyoqCiAJICogVGhlIG9wZXJhdGlvbiBpZCBmb3IgdGhlICc8ZW0+RVJlc29sdmUgUHJveHk8L2VtPicgb3BlcmF0aW9uLgpAQCAtNzE1LDEzICs3MjYsMjIgQEAKIAlpbnQgREFUQV9JTlRFUkNIQU5HRV9CRUFOX19FTlRJVFkgPSBEQVRBX0lOVEVSQ0hBTkdFX0xBWllfUkVTT0xWRVJfRkVBVFVSRV9DT1VOVCArIDA7CiAKIAkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TWFyayBMYXRlc3Q8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TWFyayBMYXRlc3QgSW1wb3J0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCiAJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICogQG9yZGVyZWQKIAkgKi8KLQlpbnQgREFUQV9JTlRFUkNIQU5HRV9CRUFOX19NQVJLX0xBVEVTVCA9IERBVEFfSU5URVJDSEFOR0VfTEFaWV9SRVNPTFZFUl9GRUFUVVJFX0NPVU5UICsgMTsKKwlpbnQgREFUQV9JTlRFUkNIQU5HRV9CRUFOX19NQVJLX0xBVEVTVF9JTVBPUlQgPSBEQVRBX0lOVEVSQ0hBTkdFX0xBWllfUkVTT0xWRVJfRkVBVFVSRV9DT1VOVCArIDE7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TWFyayBMYXRlc3QgRXhwb3J0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgREFUQV9JTlRFUkNIQU5HRV9CRUFOX19NQVJLX0xBVEVTVF9FWFBPUlQgPSBEQVRBX0lOVEVSQ0hBTkdFX0xBWllfUkVTT0xWRVJfRkVBVFVSRV9DT1VOVCArIDI7CiAKIAkvKioKIAkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SGFzIEJsb2IgTWFwcGluZzwvYj48L2VtPicgYXR0cmlidXRlLgpAQCAtNzMwLDcgKzc1MCw3IEBACiAJICogQGdlbmVyYXRlZAogCSAqIEBvcmRlcmVkCiAJICovCi0JaW50IERBVEFfSU5URVJDSEFOR0VfQkVBTl9fSEFTX0JMT0JfTUFQUElORyA9IERBVEFfSU5URVJDSEFOR0VfTEFaWV9SRVNPTFZFUl9GRUFUVVJFX0NPVU5UICsgMjsKKwlpbnQgREFUQV9JTlRFUkNIQU5HRV9CRUFOX19IQVNfQkxPQl9NQVBQSU5HID0gREFUQV9JTlRFUkNIQU5HRV9MQVpZX1JFU09MVkVSX0ZFQVRVUkVfQ09VTlQgKyAzOwogCiAJLyoqCiAJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkxhdGVzdCBQcm9wZXJ0eTwvYj48L2VtPicgcmVmZXJlbmNlLgpAQCAtNzM5LDcgKzc1OSwxNiBAQAogCSAqIEBnZW5lcmF0ZWQKIAkgKiBAb3JkZXJlZAogCSAqLwotCWludCBEQVRBX0lOVEVSQ0hBTkdFX0JFQU5fX0xBVEVTVF9QUk9QRVJUWSA9IERBVEFfSU5URVJDSEFOR0VfTEFaWV9SRVNPTFZFUl9GRUFUVVJFX0NPVU5UICsgMzsKKwlpbnQgREFUQV9JTlRFUkNIQU5HRV9CRUFOX19MQVRFU1RfUFJPUEVSVFkgPSBEQVRBX0lOVEVSQ0hBTkdFX0xBWllfUkVTT0xWRVJfRkVBVFVSRV9DT1VOVCArIDQ7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TGF0ZXN0IEV4cCBQcm9wZXJ0eTwvYj48L2VtPicgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IERBVEFfSU5URVJDSEFOR0VfQkVBTl9fTEFURVNUX0VYUF9QUk9QRVJUWSA9IERBVEFfSU5URVJDSEFOR0VfTEFaWV9SRVNPTFZFUl9GRUFUVVJFX0NPVU5UICsgNTsKIAogCS8qKgogCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FbGVtZW50IE1hcDwvYj48L2VtPicgYXR0cmlidXRlLgpAQCAtNzQ4LDcgKzc3Nyw3IEBACiAJICogQGdlbmVyYXRlZAogCSAqIEBvcmRlcmVkCiAJICovCi0JaW50IERBVEFfSU5URVJDSEFOR0VfQkVBTl9fRUxFTUVOVF9NQVAgPSBEQVRBX0lOVEVSQ0hBTkdFX0xBWllfUkVTT0xWRVJfRkVBVFVSRV9DT1VOVCArIDQ7CisJaW50IERBVEFfSU5URVJDSEFOR0VfQkVBTl9fRUxFTUVOVF9NQVAgPSBEQVRBX0lOVEVSQ0hBTkdFX0xBWllfUkVTT0xWRVJfRkVBVFVSRV9DT1VOVCArIDY7CiAKIAkvKioKIAkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Tm9kZSBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCkBAIC03NTcsNyArNzg2LDcgQEAKIAkgKiBAZ2VuZXJhdGVkCiAJICogQG9yZGVyZWQKIAkgKi8KLQlpbnQgREFUQV9JTlRFUkNIQU5HRV9CRUFOX19OT0RFX05BTUUgPSBEQVRBX0lOVEVSQ0hBTkdFX0xBWllfUkVTT0xWRVJfRkVBVFVSRV9DT1VOVCArIDU7CisJaW50IERBVEFfSU5URVJDSEFOR0VfQkVBTl9fTk9ERV9OQU1FID0gREFUQV9JTlRFUkNIQU5HRV9MQVpZX1JFU09MVkVSX0ZFQVRVUkVfQ09VTlQgKyA3OwogCiAJLyoqCiAJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkxvb2t1cDwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCkBAIC03NjYsNyArNzk1LDcgQEAKIAkgKiBAZ2VuZXJhdGVkCiAJICogQG9yZGVyZWQKIAkgKi8KLQlpbnQgREFUQV9JTlRFUkNIQU5HRV9CRUFOX19MT09LVVAgPSBEQVRBX0lOVEVSQ0hBTkdFX0xBWllfUkVTT0xWRVJfRkVBVFVSRV9DT1VOVCArIDY7CisJaW50IERBVEFfSU5URVJDSEFOR0VfQkVBTl9fTE9PS1VQID0gREFUQV9JTlRFUkNIQU5HRV9MQVpZX1JFU09MVkVSX0ZFQVRVUkVfQ09VTlQgKyA4OwogCiAJLyoqCiAJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkZvcm1hdDwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCkBAIC03NzUsNyArODA0LDcgQEAKIAkgKiBAZ2VuZXJhdGVkCiAJICogQG9yZGVyZWQKIAkgKi8KLQlpbnQgREFUQV9JTlRFUkNIQU5HRV9CRUFOX19GT1JNQVQgPSBEQVRBX0lOVEVSQ0hBTkdFX0xBWllfUkVTT0xWRVJfRkVBVFVSRV9DT1VOVCArIDc7CisJaW50IERBVEFfSU5URVJDSEFOR0VfQkVBTl9fRk9STUFUID0gREFUQV9JTlRFUkNIQU5HRV9MQVpZX1JFU09MVkVSX0ZFQVRVUkVfQ09VTlQgKyA5OwogCiAJLyoqCiAJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkV4cHJlc3Npb248L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgpAQCAtNzg0LDcgKzgxMyw3IEBACiAJICogQGdlbmVyYXRlZAogCSAqIEBvcmRlcmVkCiAJICovCi0JaW50IERBVEFfSU5URVJDSEFOR0VfQkVBTl9fRVhQUkVTU0lPTiA9IERBVEFfSU5URVJDSEFOR0VfTEFaWV9SRVNPTFZFUl9GRUFUVVJFX0NPVU5UICsgODsKKwlpbnQgREFUQV9JTlRFUkNIQU5HRV9CRUFOX19FWFBSRVNTSU9OID0gREFUQV9JTlRFUkNIQU5HRV9MQVpZX1JFU09MVkVSX0ZFQVRVUkVfQ09VTlQgKyAxMDsKIAogCS8qKgogCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NYXBwaW5nczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCkBAIC03OTMsNyArODIyLDcgQEAKIAkgKiBAZ2VuZXJhdGVkCiAJICogQG9yZGVyZWQKIAkgKi8KLQlpbnQgREFUQV9JTlRFUkNIQU5HRV9CRUFOX19NQVBQSU5HUyA9IERBVEFfSU5URVJDSEFOR0VfTEFaWV9SRVNPTFZFUl9GRUFUVVJFX0NPVU5UICsgOTsKKwlpbnQgREFUQV9JTlRFUkNIQU5HRV9CRUFOX19NQVBQSU5HUyA9IERBVEFfSU5URVJDSEFOR0VfTEFaWV9SRVNPTFZFUl9GRUFUVVJFX0NPVU5UICsgMTE7CiAKIAkvKioKIAkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TG9va3VwIEtleXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgpAQCAtODAyLDcgKzgzMSwyNSBAQAogCSAqIEBnZW5lcmF0ZWQKIAkgKiBAb3JkZXJlZAogCSAqLwotCWludCBEQVRBX0lOVEVSQ0hBTkdFX0JFQU5fX0xPT0tVUF9LRVlTID0gREFUQV9JTlRFUkNIQU5HRV9MQVpZX1JFU09MVkVSX0ZFQVRVUkVfQ09VTlQgKyAxMDsKKwlpbnQgREFUQV9JTlRFUkNIQU5HRV9CRUFOX19MT09LVVBfS0VZUyA9IERBVEFfSU5URVJDSEFOR0VfTEFaWV9SRVNPTFZFUl9GRUFUVVJFX0NPVU5UICsgMTI7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RXhwb3J0IEV4cG9zZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IERBVEFfSU5URVJDSEFOR0VfQkVBTl9fRVhQT1JUX0VYUE9TRVMgPSBEQVRBX0lOVEVSQ0hBTkdFX0xBWllfUkVTT0xWRVJfRkVBVFVSRV9DT1VOVCArIDEzOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkV4cG9ydCBGaWx0ZXI8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBEQVRBX0lOVEVSQ0hBTkdFX0JFQU5fX0VYUE9SVF9GSUxURVIgPSBEQVRBX0lOVEVSQ0hBTkdFX0xBWllfUkVTT0xWRVJfRkVBVFVSRV9DT1VOVCArIDE0OwogCiAJLyoqCiAJICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPkRhdGEgSW50ZXJjaGFuZ2UgQmVhbjwvZW0+JyBjbGFzcy4KQEAgLTgxMSw3ICs4NTgsNyBAQAogCSAqIEBnZW5lcmF0ZWQKIAkgKiBAb3JkZXJlZAogCSAqLwotCWludCBEQVRBX0lOVEVSQ0hBTkdFX0JFQU5fRkVBVFVSRV9DT1VOVCA9IERBVEFfSU5URVJDSEFOR0VfTEFaWV9SRVNPTFZFUl9GRUFUVVJFX0NPVU5UICsgMTE7CisJaW50IERBVEFfSU5URVJDSEFOR0VfQkVBTl9GRUFUVVJFX0NPVU5UID0gREFUQV9JTlRFUkNIQU5HRV9MQVpZX1JFU09MVkVSX0ZFQVRVUkVfQ09VTlQgKyAxNTsKIAogCS8qKgogCSAqIFRoZSBvcGVyYXRpb24gaWQgZm9yIHRoZSAnPGVtPkVSZXNvbHZlIFByb3h5PC9lbT4nIG9wZXJhdGlvbi4KQEAgLTEyMzQsNiArMTI4MSwyNTMgQEAKIAlpbnQgREFUQV9JTlRFUkNIQU5HRV9MT09LVVBfT1BFUkFUSU9OX0NPVU5UID0gREFUQV9JTlRFUkNIQU5HRV9MQVpZX1JFU09MVkVSX09QRVJBVElPTl9DT1VOVCArIDA7CiAKIAkvKioKKwkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQuZGF0YWludGVyY2hhbmdlLmltcGwuRGF0YUludGVyY2hhbmdlRXhwb3NlSW1wbCA8ZW0+RGF0YSBJbnRlcmNoYW5nZSBFeHBvc2U8L2VtPn0nIGNsYXNzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmRhdGFpbnRlcmNoYW5nZS5pbXBsLkRhdGFJbnRlcmNoYW5nZUV4cG9zZUltcGwKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQuZGF0YWludGVyY2hhbmdlLmltcGwuRGF0YURTTFBhY2thZ2VJbXBsI2dldERhdGFJbnRlcmNoYW5nZUV4cG9zZSgpCisJICogQGdlbmVyYXRlZAorCSAqLworCWludCBEQVRBX0lOVEVSQ0hBTkdFX0VYUE9TRSA9IDE2OworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJlZiBFbnRpdHk8L2I+PC9lbT4nIHJlZmVyZW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBEQVRBX0lOVEVSQ0hBTkdFX0VYUE9TRV9fUkVGX0VOVElUWSA9IERBVEFfSU5URVJDSEFOR0VfTEFaWV9SRVNPTFZFUl9GRUFUVVJFX0NPVU5UICsgMDsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5SZWYgUHJvcGVydHk8L2I+PC9lbT4nIHJlZmVyZW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBEQVRBX0lOVEVSQ0hBTkdFX0VYUE9TRV9fUkVGX1BST1BFUlRZID0gREFUQV9JTlRFUkNIQU5HRV9MQVpZX1JFU09MVkVSX0ZFQVRVUkVfQ09VTlQgKyAxOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN1YiBFeHBvc2U8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBEQVRBX0lOVEVSQ0hBTkdFX0VYUE9TRV9fU1VCX0VYUE9TRSA9IERBVEFfSU5URVJDSEFOR0VfTEFaWV9SRVNPTFZFUl9GRUFUVVJFX0NPVU5UICsgMjsKKworCS8qKgorCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5EYXRhIEludGVyY2hhbmdlIEV4cG9zZTwvZW0+JyBjbGFzcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBEQVRBX0lOVEVSQ0hBTkdFX0VYUE9TRV9GRUFUVVJFX0NPVU5UID0gREFUQV9JTlRFUkNIQU5HRV9MQVpZX1JFU09MVkVSX0ZFQVRVUkVfQ09VTlQgKyAzOworCisJLyoqCisJICogVGhlIG9wZXJhdGlvbiBpZCBmb3IgdGhlICc8ZW0+RVJlc29sdmUgUHJveHk8L2VtPicgb3BlcmF0aW9uLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IERBVEFfSU5URVJDSEFOR0VfRVhQT1NFX19fRVJFU09MVkVfUFJPWFlfX0lOVEVSTkFMRU9CSkVDVCA9IERBVEFfSU5URVJDSEFOR0VfTEFaWV9SRVNPTFZFUl9fX0VSRVNPTFZFX1BST1hZX19JTlRFUk5BTEVPQkpFQ1Q7CisKKwkvKioKKwkgKiBUaGUgbnVtYmVyIG9mIG9wZXJhdGlvbnMgb2YgdGhlICc8ZW0+RGF0YSBJbnRlcmNoYW5nZSBFeHBvc2U8L2VtPicgY2xhc3MuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgREFUQV9JTlRFUkNIQU5HRV9FWFBPU0VfT1BFUkFUSU9OX0NPVU5UID0gREFUQV9JTlRFUkNIQU5HRV9MQVpZX1JFU09MVkVSX09QRVJBVElPTl9DT1VOVCArIDA7CisKKwkvKioKKwkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQuZGF0YWludGVyY2hhbmdlLmltcGwuRGF0YUludGVyY2hhbmdlRXhwb3J0RmlsdGVySW1wbCA8ZW0+RGF0YSBJbnRlcmNoYW5nZSBFeHBvcnQgRmlsdGVyPC9lbT59JyBjbGFzcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5kYXRhaW50ZXJjaGFuZ2UuaW1wbC5EYXRhSW50ZXJjaGFuZ2VFeHBvcnRGaWx0ZXJJbXBsCisJICogQHNlZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmRhdGFpbnRlcmNoYW5nZS5pbXBsLkRhdGFEU0xQYWNrYWdlSW1wbCNnZXREYXRhSW50ZXJjaGFuZ2VFeHBvcnRGaWx0ZXIoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlpbnQgREFUQV9JTlRFUkNIQU5HRV9FWFBPUlRfRklMVEVSID0gMTc7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q29uZGl0aW9uPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgREFUQV9JTlRFUkNIQU5HRV9FWFBPUlRfRklMVEVSX19DT05ESVRJT04gPSBEQVRBX0lOVEVSQ0hBTkdFX0xBWllfUkVTT0xWRVJfRkVBVFVSRV9DT1VOVCArIDA7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SGlkZGVucHJvcGVydGllczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgREFUQV9JTlRFUkNIQU5HRV9FWFBPUlRfRklMVEVSX19ISURERU5QUk9QRVJUSUVTID0gREFUQV9JTlRFUkNIQU5HRV9MQVpZX1JFU09MVkVSX0ZFQVRVUkVfQ09VTlQgKyAxOworCisJLyoqCisJICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPkRhdGEgSW50ZXJjaGFuZ2UgRXhwb3J0IEZpbHRlcjwvZW0+JyBjbGFzcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBEQVRBX0lOVEVSQ0hBTkdFX0VYUE9SVF9GSUxURVJfRkVBVFVSRV9DT1VOVCA9IERBVEFfSU5URVJDSEFOR0VfTEFaWV9SRVNPTFZFUl9GRUFUVVJFX0NPVU5UICsgMjsKKworCS8qKgorCSAqIFRoZSBvcGVyYXRpb24gaWQgZm9yIHRoZSAnPGVtPkVSZXNvbHZlIFByb3h5PC9lbT4nIG9wZXJhdGlvbi4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBEQVRBX0lOVEVSQ0hBTkdFX0VYUE9SVF9GSUxURVJfX19FUkVTT0xWRV9QUk9YWV9fSU5URVJOQUxFT0JKRUNUID0gREFUQV9JTlRFUkNIQU5HRV9MQVpZX1JFU09MVkVSX19fRVJFU09MVkVfUFJPWFlfX0lOVEVSTkFMRU9CSkVDVDsKKworCS8qKgorCSAqIFRoZSBudW1iZXIgb2Ygb3BlcmF0aW9ucyBvZiB0aGUgJzxlbT5EYXRhIEludGVyY2hhbmdlIEV4cG9ydCBGaWx0ZXI8L2VtPicgY2xhc3MuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgREFUQV9JTlRFUkNIQU5HRV9FWFBPUlRfRklMVEVSX09QRVJBVElPTl9DT1VOVCA9IERBVEFfSU5URVJDSEFOR0VfTEFaWV9SRVNPTFZFUl9PUEVSQVRJT05fQ09VTlQgKyAwOworCisJLyoqCisJICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmRhdGFpbnRlcmNoYW5nZS5pbXBsLkRhdGFJbnRlcmNoYW5nZUZpbHRlckNvbmRpdGlvbkltcGwgPGVtPkRhdGEgSW50ZXJjaGFuZ2UgRmlsdGVyIENvbmRpdGlvbjwvZW0+fScgY2xhc3MuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQuZGF0YWludGVyY2hhbmdlLmltcGwuRGF0YUludGVyY2hhbmdlRmlsdGVyQ29uZGl0aW9uSW1wbAorCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5kYXRhaW50ZXJjaGFuZ2UuaW1wbC5EYXRhRFNMUGFja2FnZUltcGwjZ2V0RGF0YUludGVyY2hhbmdlRmlsdGVyQ29uZGl0aW9uKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJaW50IERBVEFfSU5URVJDSEFOR0VfRklMVEVSX0NPTkRJVElPTiA9IDE4OworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJlZiBQcm9wZXJ0eTwvYj48L2VtPicgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IERBVEFfSU5URVJDSEFOR0VfRklMVEVSX0NPTkRJVElPTl9fUkVGX1BST1BFUlRZID0gREFUQV9JTlRFUkNIQU5HRV9MQVpZX1JFU09MVkVSX0ZFQVRVUkVfQ09VTlQgKyAwOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk9wZXJhdG9yPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgREFUQV9JTlRFUkNIQU5HRV9GSUxURVJfQ09ORElUSU9OX19PUEVSQVRPUiA9IERBVEFfSU5URVJDSEFOR0VfTEFaWV9SRVNPTFZFUl9GRUFUVVJFX0NPVU5UICsgMTsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5WYWx1ZTwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IERBVEFfSU5URVJDSEFOR0VfRklMVEVSX0NPTkRJVElPTl9fVkFMVUUgPSBEQVRBX0lOVEVSQ0hBTkdFX0xBWllfUkVTT0xWRVJfRkVBVFVSRV9DT1VOVCArIDI7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3BlcmF0b3IyPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgREFUQV9JTlRFUkNIQU5HRV9GSUxURVJfQ09ORElUSU9OX19PUEVSQVRPUjIgPSBEQVRBX0lOVEVSQ0hBTkdFX0xBWllfUkVTT0xWRVJfRkVBVFVSRV9DT1VOVCArIDM7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3ViY29uZGl0aW9uPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgREFUQV9JTlRFUkNIQU5HRV9GSUxURVJfQ09ORElUSU9OX19TVUJDT05ESVRJT04gPSBEQVRBX0lOVEVSQ0hBTkdFX0xBWllfUkVTT0xWRVJfRkVBVFVSRV9DT1VOVCArIDQ7CisKKwkvKioKKwkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+RGF0YSBJbnRlcmNoYW5nZSBGaWx0ZXIgQ29uZGl0aW9uPC9lbT4nIGNsYXNzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IERBVEFfSU5URVJDSEFOR0VfRklMVEVSX0NPTkRJVElPTl9GRUFUVVJFX0NPVU5UID0gREFUQV9JTlRFUkNIQU5HRV9MQVpZX1JFU09MVkVSX0ZFQVRVUkVfQ09VTlQgKyA1OworCisJLyoqCisJICogVGhlIG9wZXJhdGlvbiBpZCBmb3IgdGhlICc8ZW0+RVJlc29sdmUgUHJveHk8L2VtPicgb3BlcmF0aW9uLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IERBVEFfSU5URVJDSEFOR0VfRklMVEVSX0NPTkRJVElPTl9fX0VSRVNPTFZFX1BST1hZX19JTlRFUk5BTEVPQkpFQ1QgPSBEQVRBX0lOVEVSQ0hBTkdFX0xBWllfUkVTT0xWRVJfX19FUkVTT0xWRV9QUk9YWV9fSU5URVJOQUxFT0JKRUNUOworCisJLyoqCisJICogVGhlIG51bWJlciBvZiBvcGVyYXRpb25zIG9mIHRoZSAnPGVtPkRhdGEgSW50ZXJjaGFuZ2UgRmlsdGVyIENvbmRpdGlvbjwvZW0+JyBjbGFzcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBEQVRBX0lOVEVSQ0hBTkdFX0ZJTFRFUl9DT05ESVRJT05fT1BFUkFUSU9OX0NPVU5UID0gREFUQV9JTlRFUkNIQU5HRV9MQVpZX1JFU09MVkVSX09QRVJBVElPTl9DT1VOVCArIDA7CisKKwkvKioKKwkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQuZGF0YWludGVyY2hhbmdlLmltcGwuRGF0YUludGVyY2hhbmdlRXhwb3J0SGlkZUltcGwgPGVtPkRhdGEgSW50ZXJjaGFuZ2UgRXhwb3J0IEhpZGU8L2VtPn0nIGNsYXNzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmRhdGFpbnRlcmNoYW5nZS5pbXBsLkRhdGFJbnRlcmNoYW5nZUV4cG9ydEhpZGVJbXBsCisJICogQHNlZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmRhdGFpbnRlcmNoYW5nZS5pbXBsLkRhdGFEU0xQYWNrYWdlSW1wbCNnZXREYXRhSW50ZXJjaGFuZ2VFeHBvcnRIaWRlKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJaW50IERBVEFfSU5URVJDSEFOR0VfRVhQT1JUX0hJREUgPSAxOTsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Qcm9wZXJ0eTwvYj48L2VtPicgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IERBVEFfSU5URVJDSEFOR0VfRVhQT1JUX0hJREVfX1BST1BFUlRZID0gREFUQV9JTlRFUkNIQU5HRV9MQVpZX1JFU09MVkVSX0ZFQVRVUkVfQ09VTlQgKyAwOworCisJLyoqCisJICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPkRhdGEgSW50ZXJjaGFuZ2UgRXhwb3J0IEhpZGU8L2VtPicgY2xhc3MuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgREFUQV9JTlRFUkNIQU5HRV9FWFBPUlRfSElERV9GRUFUVVJFX0NPVU5UID0gREFUQV9JTlRFUkNIQU5HRV9MQVpZX1JFU09MVkVSX0ZFQVRVUkVfQ09VTlQgKyAxOworCisJLyoqCisJICogVGhlIG9wZXJhdGlvbiBpZCBmb3IgdGhlICc8ZW0+RVJlc29sdmUgUHJveHk8L2VtPicgb3BlcmF0aW9uLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IERBVEFfSU5URVJDSEFOR0VfRVhQT1JUX0hJREVfX19FUkVTT0xWRV9QUk9YWV9fSU5URVJOQUxFT0JKRUNUID0gREFUQV9JTlRFUkNIQU5HRV9MQVpZX1JFU09MVkVSX19fRVJFU09MVkVfUFJPWFlfX0lOVEVSTkFMRU9CSkVDVDsKKworCS8qKgorCSAqIFRoZSBudW1iZXIgb2Ygb3BlcmF0aW9ucyBvZiB0aGUgJzxlbT5EYXRhIEludGVyY2hhbmdlIEV4cG9ydCBIaWRlPC9lbT4nIGNsYXNzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IERBVEFfSU5URVJDSEFOR0VfRVhQT1JUX0hJREVfT1BFUkFUSU9OX0NPVU5UID0gREFUQV9JTlRFUkNIQU5HRV9MQVpZX1JFU09MVkVSX09QRVJBVElPTl9DT1VOVCArIDA7CisKKwkvKioKIAkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQuZGF0YWludGVyY2hhbmdlLmltcGwuRGF0YUludGVyY2hhbmdlTWFya2VyUGF0aEltcGwgPGVtPkRhdGEgSW50ZXJjaGFuZ2UgTWFya2VyIFBhdGg8L2VtPn0nIGNsYXNzLgogCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CkBAIC0xMjQxLDcgKzE1MzUsNyBAQAogCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5kYXRhaW50ZXJjaGFuZ2UuaW1wbC5EYXRhRFNMUGFja2FnZUltcGwjZ2V0RGF0YUludGVyY2hhbmdlTWFya2VyUGF0aCgpCiAJICogQGdlbmVyYXRlZAogCSAqLwotCWludCBEQVRBX0lOVEVSQ0hBTkdFX01BUktFUl9QQVRIID0gMTY7CisJaW50IERBVEFfSU5URVJDSEFOR0VfTUFSS0VSX1BBVEggPSAyMDsKIAogCS8qKgogCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QYXRoPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KQEAgLTEyODcsNyArMTU4MSw3IEBACiAJICogQHNlZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmRhdGFpbnRlcmNoYW5nZS5pbXBsLkRhdGFEU0xQYWNrYWdlSW1wbCNnZXREYXRhSW50ZXJjaGFuZ2VNYXJrZXJFbnRpdHkoKQogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KLQlpbnQgREFUQV9JTlRFUkNIQU5HRV9NQVJLRVJfRU5USVRZID0gMTc7CisJaW50IERBVEFfSU5URVJDSEFOR0VfTUFSS0VSX0VOVElUWSA9IDIxOwogCiAJLyoqCiAJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1hcmsgTGF0ZXN0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCkBAIC0xMzUxLDcgKzE2NDUsNyBAQAogCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5kYXRhaW50ZXJjaGFuZ2UuaW1wbC5EYXRhRFNMUGFja2FnZUltcGwjZ2V0RGF0YUludGVyY2hhbmdlTWFwcGluZygpCiAJICogQGdlbmVyYXRlZAogCSAqLwotCWludCBEQVRBX0lOVEVSQ0hBTkdFX01BUFBJTkcgPSAxODsKKwlpbnQgREFUQV9JTlRFUkNIQU5HRV9NQVBQSU5HID0gMjI7CiAKIAkvKioKIAkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJvcGVydHk8L2I+PC9lbT4nIHJlZmVyZW5jZS4KQEAgLTE0MDYsNyArMTcwMCw3IEBACiAJICogQHNlZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmRhdGFpbnRlcmNoYW5nZS5pbXBsLkRhdGFEU0xQYWNrYWdlSW1wbCNnZXREYXRhSW50ZXJjaGFuZ2VWYWx1ZU1hcHBpbmcoKQogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KLQlpbnQgREFUQV9JTlRFUkNIQU5HRV9WQUxVRV9NQVBQSU5HID0gMTk7CisJaW50IERBVEFfSU5URVJDSEFOR0VfVkFMVUVfTUFQUElORyA9IDIzOwogCiAJLyoqCiAJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByb3BlcnR5PC9iPjwvZW0+JyByZWZlcmVuY2UuCkBAIC0xNDYxLDcgKzE3NTUsNyBAQAogCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5kYXRhaW50ZXJjaGFuZ2UuaW1wbC5EYXRhRFNMUGFja2FnZUltcGwjZ2V0RGF0YUludGVyY2hhbmdlQmxvYk1hcHBpbmcoKQogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KLQlpbnQgREFUQV9JTlRFUkNIQU5HRV9CTE9CX01BUFBJTkcgPSAyMDsKKwlpbnQgREFUQV9JTlRFUkNIQU5HRV9CTE9CX01BUFBJTkcgPSAyNDsKIAogCS8qKgogCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Qcm9wZXJ0eTwvYj48L2VtPicgcmVmZXJlbmNlLgpAQCAtMTU0Myw3ICsxODM3LDcgQEAKIAkgKiBAc2VlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQuZGF0YWludGVyY2hhbmdlLmltcGwuRGF0YURTTFBhY2thZ2VJbXBsI2dldFByZWRlZmluZWRCbG9iTWltZVR5cGVFbnVtKCkKIAkgKiBAZ2VuZXJhdGVkCiAJICovCi0JaW50IFBSRURFRklORURfQkxPQl9NSU1FX1RZUEVfRU5VTSA9IDIxOworCWludCBQUkVERUZJTkVEX0JMT0JfTUlNRV9UWVBFX0VOVU0gPSAyNTsKIAogCS8qKgogCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5kYXRhaW50ZXJjaGFuZ2UuUHJlZGVmaW5lZEJlYW5FbnVtIDxlbT5QcmVkZWZpbmVkIEJlYW4gRW51bTwvZW0+fScgZW51bS4KQEAgLTE1NTMsNyArMTg0Nyw3IEBACiAJICogQHNlZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmRhdGFpbnRlcmNoYW5nZS5pbXBsLkRhdGFEU0xQYWNrYWdlSW1wbCNnZXRQcmVkZWZpbmVkQmVhbkVudW0oKQogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KLQlpbnQgUFJFREVGSU5FRF9CRUFOX0VOVU0gPSAyMjsKKwlpbnQgUFJFREVGSU5FRF9CRUFOX0VOVU0gPSAyNjsKIAogCS8qKgogCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5kYXRhaW50ZXJjaGFuZ2UuUHJlZGVmaW5lZEJlYW5UeXBlRW51bSA8ZW0+UHJlZGVmaW5lZCBCZWFuIFR5cGUgRW51bTwvZW0+fScgZW51bS4KQEAgLTE1NjMsNyArMTg1Nyw3IEBACiAJICogQHNlZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmRhdGFpbnRlcmNoYW5nZS5pbXBsLkRhdGFEU0xQYWNrYWdlSW1wbCNnZXRQcmVkZWZpbmVkQmVhblR5cGVFbnVtKCkKIAkgKiBAZ2VuZXJhdGVkCiAJICovCi0JaW50IFBSRURFRklORURfQkVBTl9UWVBFX0VOVU0gPSAyMzsKKwlpbnQgUFJFREVGSU5FRF9CRUFOX1RZUEVfRU5VTSA9IDI3OwogCiAJLyoqCiAJICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmRhdGFpbnRlcmNoYW5nZS5FbnRpdHlNYW5hZ2VyTW9kZSA8ZW0+RW50aXR5IE1hbmFnZXIgTW9kZTwvZW0+fScgZW51bS4KQEAgLTE1NzMsNyArMTg2NywyNyBAQAogCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5kYXRhaW50ZXJjaGFuZ2UuaW1wbC5EYXRhRFNMUGFja2FnZUltcGwjZ2V0RW50aXR5TWFuYWdlck1vZGUoKQogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KLQlpbnQgRU5USVRZX01BTkFHRVJfTU9ERSA9IDI0OworCWludCBFTlRJVFlfTUFOQUdFUl9NT0RFID0gMjg7CisKKwkvKioKKwkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQuZGF0YWludGVyY2hhbmdlLkNvbmRpdGlvbkFuZE9wZXJhdG9yMSA8ZW0+Q29uZGl0aW9uIEFuZCBPcGVyYXRvcjE8L2VtPn0nIGVudW0uCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQuZGF0YWludGVyY2hhbmdlLkNvbmRpdGlvbkFuZE9wZXJhdG9yMQorCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5kYXRhaW50ZXJjaGFuZ2UuaW1wbC5EYXRhRFNMUGFja2FnZUltcGwjZ2V0Q29uZGl0aW9uQW5kT3BlcmF0b3IxKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJaW50IENPTkRJVElPTl9BTkRfT1BFUkFUT1IxID0gMjk7CisKKwkvKioKKwkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQuZGF0YWludGVyY2hhbmdlLkNvbmRpdGlvbkFuZE9wZXJhdG9yMiA8ZW0+Q29uZGl0aW9uIEFuZCBPcGVyYXRvcjI8L2VtPn0nIGVudW0uCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQuZGF0YWludGVyY2hhbmdlLkNvbmRpdGlvbkFuZE9wZXJhdG9yMgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5kYXRhaW50ZXJjaGFuZ2UuaW1wbC5EYXRhRFNMUGFja2FnZUltcGwjZ2V0Q29uZGl0aW9uQW5kT3BlcmF0b3IyKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJaW50IENPTkRJVElPTl9BTkRfT1BFUkFUT1IyID0gMzA7CiAKIAkvKioKIAkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAnPGVtPkludGVybmFsIEVPYmplY3Q8L2VtPicgZGF0YSB0eXBlLgpAQCAtMTU4Myw3ICsxODk3LDcgQEAKIAkgKiBAc2VlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQuZGF0YWludGVyY2hhbmdlLmltcGwuRGF0YURTTFBhY2thZ2VJbXBsI2dldEludGVybmFsRU9iamVjdCgpCiAJICogQGdlbmVyYXRlZAogCSAqLwotCWludCBJTlRFUk5BTF9FT0JKRUNUID0gMjU7CisJaW50IElOVEVSTkFMX0VPQkpFQ1QgPSAzMTsKIAogCiAJLyoqCkBAIC0xNzkwLDYgKzIxMDQsMTcgQEAKIAlFUmVmZXJlbmNlIGdldERhdGFJbnRlcmNoYW5nZV9QYXRoKCk7CiAKIAkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQuZGF0YWludGVyY2hhbmdlLkRhdGFJbnRlcmNoYW5nZSNpc0RlbGV0ZUZpbGVBZnRlckltcG9ydCA8ZW0+RGVsZXRlIEZpbGUgQWZ0ZXIgSW1wb3J0PC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+RGVsZXRlIEZpbGUgQWZ0ZXIgSW1wb3J0PC9lbT4nLgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5kYXRhaW50ZXJjaGFuZ2UuRGF0YUludGVyY2hhbmdlI2lzRGVsZXRlRmlsZUFmdGVySW1wb3J0KCkKKwkgKiBAc2VlICNnZXREYXRhSW50ZXJjaGFuZ2UoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlFQXR0cmlidXRlIGdldERhdGFJbnRlcmNoYW5nZV9EZWxldGVGaWxlQWZ0ZXJJbXBvcnQoKTsKKworCS8qKgogCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQuZGF0YWludGVyY2hhbmdlLkRhdGFJbnRlcmNoYW5nZUZpbGUgPGVtPkRhdGEgSW50ZXJjaGFuZ2UgRmlsZTwvZW0+fScuCiAJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KQEAgLTE5ODMsMTUgKzIzMDgsMjYgQEAKIAlFUmVmZXJlbmNlIGdldERhdGFJbnRlcmNoYW5nZUJlYW5fRW50aXR5KCk7CiAKIAkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQuZGF0YWludGVyY2hhbmdlLkRhdGFJbnRlcmNoYW5nZUJlYW4jaXNNYXJrTGF0ZXN0IDxlbT5NYXJrIExhdGVzdDwvZW0+fScuCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmRhdGFpbnRlcmNoYW5nZS5EYXRhSW50ZXJjaGFuZ2VCZWFuI2lzTWFya0xhdGVzdEltcG9ydCA8ZW0+TWFyayBMYXRlc3QgSW1wb3J0PC9lbT59Jy4KIAkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+TWFyayBMYXRlc3Q8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmRhdGFpbnRlcmNoYW5nZS5EYXRhSW50ZXJjaGFuZ2VCZWFuI2lzTWFya0xhdGVzdCgpCisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5NYXJrIExhdGVzdCBJbXBvcnQ8L2VtPicuCisJICogQHNlZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmRhdGFpbnRlcmNoYW5nZS5EYXRhSW50ZXJjaGFuZ2VCZWFuI2lzTWFya0xhdGVzdEltcG9ydCgpCiAJICogQHNlZSAjZ2V0RGF0YUludGVyY2hhbmdlQmVhbigpCiAJICogQGdlbmVyYXRlZAogCSAqLwotCUVBdHRyaWJ1dGUgZ2V0RGF0YUludGVyY2hhbmdlQmVhbl9NYXJrTGF0ZXN0KCk7CisJRUF0dHJpYnV0ZSBnZXREYXRhSW50ZXJjaGFuZ2VCZWFuX01hcmtMYXRlc3RJbXBvcnQoKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5kYXRhaW50ZXJjaGFuZ2UuRGF0YUludGVyY2hhbmdlQmVhbiNpc01hcmtMYXRlc3RFeHBvcnQgPGVtPk1hcmsgTGF0ZXN0IEV4cG9ydDwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPk1hcmsgTGF0ZXN0IEV4cG9ydDwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQuZGF0YWludGVyY2hhbmdlLkRhdGFJbnRlcmNoYW5nZUJlYW4jaXNNYXJrTGF0ZXN0RXhwb3J0KCkKKwkgKiBAc2VlICNnZXREYXRhSW50ZXJjaGFuZ2VCZWFuKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJRUF0dHJpYnV0ZSBnZXREYXRhSW50ZXJjaGFuZ2VCZWFuX01hcmtMYXRlc3RFeHBvcnQoKTsKIAogCS8qKgogCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5kYXRhaW50ZXJjaGFuZ2UuRGF0YUludGVyY2hhbmdlQmVhbiNpc0hhc0Jsb2JNYXBwaW5nIDxlbT5IYXMgQmxvYiBNYXBwaW5nPC9lbT59Jy4KQEAgLTIwMTYsNiArMjM1MiwxNyBAQAogCUVSZWZlcmVuY2UgZ2V0RGF0YUludGVyY2hhbmdlQmVhbl9MYXRlc3RQcm9wZXJ0eSgpOwogCiAJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgJ3tAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmRhdGFpbnRlcmNoYW5nZS5EYXRhSW50ZXJjaGFuZ2VCZWFuI2dldExhdGVzdEV4cFByb3BlcnR5IDxlbT5MYXRlc3QgRXhwIFByb3BlcnR5PC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlICc8ZW0+TGF0ZXN0IEV4cCBQcm9wZXJ0eTwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQuZGF0YWludGVyY2hhbmdlLkRhdGFJbnRlcmNoYW5nZUJlYW4jZ2V0TGF0ZXN0RXhwUHJvcGVydHkoKQorCSAqIEBzZWUgI2dldERhdGFJbnRlcmNoYW5nZUJlYW4oKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlFUmVmZXJlbmNlIGdldERhdGFJbnRlcmNoYW5nZUJlYW5fTGF0ZXN0RXhwUHJvcGVydHkoKTsKKworCS8qKgogCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5kYXRhaW50ZXJjaGFuZ2UuRGF0YUludGVyY2hhbmdlQmVhbiNnZXRFbGVtZW50TWFwIDxlbT5FbGVtZW50IE1hcDwvZW0+fScuCiAJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KQEAgLTIwOTMsNiArMjQ0MCwyOCBAQAogCUVSZWZlcmVuY2UgZ2V0RGF0YUludGVyY2hhbmdlQmVhbl9Mb29rdXBLZXlzKCk7CiAKIAkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5kYXRhaW50ZXJjaGFuZ2UuRGF0YUludGVyY2hhbmdlQmVhbiNnZXRFeHBvcnRFeHBvc2VzIDxlbT5FeHBvcnQgRXhwb3NlczwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICc8ZW0+RXhwb3J0IEV4cG9zZXM8L2VtPicuCisJICogQHNlZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmRhdGFpbnRlcmNoYW5nZS5EYXRhSW50ZXJjaGFuZ2VCZWFuI2dldEV4cG9ydEV4cG9zZXMoKQorCSAqIEBzZWUgI2dldERhdGFJbnRlcmNoYW5nZUJlYW4oKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlFUmVmZXJlbmNlIGdldERhdGFJbnRlcmNoYW5nZUJlYW5fRXhwb3J0RXhwb3NlcygpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgJ3tAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmRhdGFpbnRlcmNoYW5nZS5EYXRhSW50ZXJjaGFuZ2VCZWFuI2dldEV4cG9ydEZpbHRlciA8ZW0+RXhwb3J0IEZpbHRlcjwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSAnPGVtPkV4cG9ydCBGaWx0ZXI8L2VtPicuCisJICogQHNlZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmRhdGFpbnRlcmNoYW5nZS5EYXRhSW50ZXJjaGFuZ2VCZWFuI2dldEV4cG9ydEZpbHRlcigpCisJICogQHNlZSAjZ2V0RGF0YUludGVyY2hhbmdlQmVhbigpCisJICogQGdlbmVyYXRlZAorCSAqLworCUVSZWZlcmVuY2UgZ2V0RGF0YUludGVyY2hhbmdlQmVhbl9FeHBvcnRGaWx0ZXIoKTsKKworCS8qKgogCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQuZGF0YWludGVyY2hhbmdlLkRhdGFJbnRlcmNoYW5nZUtleSA8ZW0+RGF0YSBJbnRlcmNoYW5nZSBLZXk8L2VtPn0nLgogCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CkBAIC0yMzUxLDYgKzI3MjAsMTY3IEBACiAJRVJlZmVyZW5jZSBnZXREYXRhSW50ZXJjaGFuZ2VMb29rdXBfTWFya2VyUGF0aCgpOwogCiAJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5kYXRhaW50ZXJjaGFuZ2UuRGF0YUludGVyY2hhbmdlRXhwb3NlIDxlbT5EYXRhIEludGVyY2hhbmdlIEV4cG9zZTwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5EYXRhIEludGVyY2hhbmdlIEV4cG9zZTwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQuZGF0YWludGVyY2hhbmdlLkRhdGFJbnRlcmNoYW5nZUV4cG9zZQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlFQ2xhc3MgZ2V0RGF0YUludGVyY2hhbmdlRXhwb3NlKCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSAne0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQuZGF0YWludGVyY2hhbmdlLkRhdGFJbnRlcmNoYW5nZUV4cG9zZSNnZXRSZWZFbnRpdHkgPGVtPlJlZiBFbnRpdHk8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgJzxlbT5SZWYgRW50aXR5PC9lbT4nLgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5kYXRhaW50ZXJjaGFuZ2UuRGF0YUludGVyY2hhbmdlRXhwb3NlI2dldFJlZkVudGl0eSgpCisJICogQHNlZSAjZ2V0RGF0YUludGVyY2hhbmdlRXhwb3NlKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJRVJlZmVyZW5jZSBnZXREYXRhSW50ZXJjaGFuZ2VFeHBvc2VfUmVmRW50aXR5KCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSAne0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQuZGF0YWludGVyY2hhbmdlLkRhdGFJbnRlcmNoYW5nZUV4cG9zZSNnZXRSZWZQcm9wZXJ0eSA8ZW0+UmVmIFByb3BlcnR5PC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlICc8ZW0+UmVmIFByb3BlcnR5PC9lbT4nLgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5kYXRhaW50ZXJjaGFuZ2UuRGF0YUludGVyY2hhbmdlRXhwb3NlI2dldFJlZlByb3BlcnR5KCkKKwkgKiBAc2VlICNnZXREYXRhSW50ZXJjaGFuZ2VFeHBvc2UoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlFUmVmZXJlbmNlIGdldERhdGFJbnRlcmNoYW5nZUV4cG9zZV9SZWZQcm9wZXJ0eSgpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgJ3tAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmRhdGFpbnRlcmNoYW5nZS5EYXRhSW50ZXJjaGFuZ2VFeHBvc2UjZ2V0U3ViRXhwb3NlIDxlbT5TdWIgRXhwb3NlPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlICc8ZW0+U3ViIEV4cG9zZTwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQuZGF0YWludGVyY2hhbmdlLkRhdGFJbnRlcmNoYW5nZUV4cG9zZSNnZXRTdWJFeHBvc2UoKQorCSAqIEBzZWUgI2dldERhdGFJbnRlcmNoYW5nZUV4cG9zZSgpCisJICogQGdlbmVyYXRlZAorCSAqLworCUVSZWZlcmVuY2UgZ2V0RGF0YUludGVyY2hhbmdlRXhwb3NlX1N1YkV4cG9zZSgpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5kYXRhaW50ZXJjaGFuZ2UuRGF0YUludGVyY2hhbmdlRXhwb3J0RmlsdGVyIDxlbT5EYXRhIEludGVyY2hhbmdlIEV4cG9ydCBGaWx0ZXI8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+RGF0YSBJbnRlcmNoYW5nZSBFeHBvcnQgRmlsdGVyPC9lbT4nLgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5kYXRhaW50ZXJjaGFuZ2UuRGF0YUludGVyY2hhbmdlRXhwb3J0RmlsdGVyCisJICogQGdlbmVyYXRlZAorCSAqLworCUVDbGFzcyBnZXREYXRhSW50ZXJjaGFuZ2VFeHBvcnRGaWx0ZXIoKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlICd7QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5kYXRhaW50ZXJjaGFuZ2UuRGF0YUludGVyY2hhbmdlRXhwb3J0RmlsdGVyI2dldENvbmRpdGlvbiA8ZW0+Q29uZGl0aW9uPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlICc8ZW0+Q29uZGl0aW9uPC9lbT4nLgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5kYXRhaW50ZXJjaGFuZ2UuRGF0YUludGVyY2hhbmdlRXhwb3J0RmlsdGVyI2dldENvbmRpdGlvbigpCisJICogQHNlZSAjZ2V0RGF0YUludGVyY2hhbmdlRXhwb3J0RmlsdGVyKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJRVJlZmVyZW5jZSBnZXREYXRhSW50ZXJjaGFuZ2VFeHBvcnRGaWx0ZXJfQ29uZGl0aW9uKCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5kYXRhaW50ZXJjaGFuZ2UuRGF0YUludGVyY2hhbmdlRXhwb3J0RmlsdGVyI2dldEhpZGRlbnByb3BlcnRpZXMgPGVtPkhpZGRlbnByb3BlcnRpZXM8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAnPGVtPkhpZGRlbnByb3BlcnRpZXM8L2VtPicuCisJICogQHNlZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmRhdGFpbnRlcmNoYW5nZS5EYXRhSW50ZXJjaGFuZ2VFeHBvcnRGaWx0ZXIjZ2V0SGlkZGVucHJvcGVydGllcygpCisJICogQHNlZSAjZ2V0RGF0YUludGVyY2hhbmdlRXhwb3J0RmlsdGVyKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJRVJlZmVyZW5jZSBnZXREYXRhSW50ZXJjaGFuZ2VFeHBvcnRGaWx0ZXJfSGlkZGVucHJvcGVydGllcygpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5kYXRhaW50ZXJjaGFuZ2UuRGF0YUludGVyY2hhbmdlRmlsdGVyQ29uZGl0aW9uIDxlbT5EYXRhIEludGVyY2hhbmdlIEZpbHRlciBDb25kaXRpb248L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+RGF0YSBJbnRlcmNoYW5nZSBGaWx0ZXIgQ29uZGl0aW9uPC9lbT4nLgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5kYXRhaW50ZXJjaGFuZ2UuRGF0YUludGVyY2hhbmdlRmlsdGVyQ29uZGl0aW9uCisJICogQGdlbmVyYXRlZAorCSAqLworCUVDbGFzcyBnZXREYXRhSW50ZXJjaGFuZ2VGaWx0ZXJDb25kaXRpb24oKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlICd7QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5kYXRhaW50ZXJjaGFuZ2UuRGF0YUludGVyY2hhbmdlRmlsdGVyQ29uZGl0aW9uI2dldFJlZlByb3BlcnR5IDxlbT5SZWYgUHJvcGVydHk8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgJzxlbT5SZWYgUHJvcGVydHk8L2VtPicuCisJICogQHNlZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmRhdGFpbnRlcmNoYW5nZS5EYXRhSW50ZXJjaGFuZ2VGaWx0ZXJDb25kaXRpb24jZ2V0UmVmUHJvcGVydHkoKQorCSAqIEBzZWUgI2dldERhdGFJbnRlcmNoYW5nZUZpbHRlckNvbmRpdGlvbigpCisJICogQGdlbmVyYXRlZAorCSAqLworCUVSZWZlcmVuY2UgZ2V0RGF0YUludGVyY2hhbmdlRmlsdGVyQ29uZGl0aW9uX1JlZlByb3BlcnR5KCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQuZGF0YWludGVyY2hhbmdlLkRhdGFJbnRlcmNoYW5nZUZpbHRlckNvbmRpdGlvbiNnZXRPcGVyYXRvciA8ZW0+T3BlcmF0b3I8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5PcGVyYXRvcjwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQuZGF0YWludGVyY2hhbmdlLkRhdGFJbnRlcmNoYW5nZUZpbHRlckNvbmRpdGlvbiNnZXRPcGVyYXRvcigpCisJICogQHNlZSAjZ2V0RGF0YUludGVyY2hhbmdlRmlsdGVyQ29uZGl0aW9uKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJRUF0dHJpYnV0ZSBnZXREYXRhSW50ZXJjaGFuZ2VGaWx0ZXJDb25kaXRpb25fT3BlcmF0b3IoKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5kYXRhaW50ZXJjaGFuZ2UuRGF0YUludGVyY2hhbmdlRmlsdGVyQ29uZGl0aW9uI2dldFZhbHVlIDxlbT5WYWx1ZTwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlZhbHVlPC9lbT4nLgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5kYXRhaW50ZXJjaGFuZ2UuRGF0YUludGVyY2hhbmdlRmlsdGVyQ29uZGl0aW9uI2dldFZhbHVlKCkKKwkgKiBAc2VlICNnZXREYXRhSW50ZXJjaGFuZ2VGaWx0ZXJDb25kaXRpb24oKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlFQXR0cmlidXRlIGdldERhdGFJbnRlcmNoYW5nZUZpbHRlckNvbmRpdGlvbl9WYWx1ZSgpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmRhdGFpbnRlcmNoYW5nZS5EYXRhSW50ZXJjaGFuZ2VGaWx0ZXJDb25kaXRpb24jZ2V0T3BlcmF0b3IyIDxlbT5PcGVyYXRvcjI8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5PcGVyYXRvcjI8L2VtPicuCisJICogQHNlZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmRhdGFpbnRlcmNoYW5nZS5EYXRhSW50ZXJjaGFuZ2VGaWx0ZXJDb25kaXRpb24jZ2V0T3BlcmF0b3IyKCkKKwkgKiBAc2VlICNnZXREYXRhSW50ZXJjaGFuZ2VGaWx0ZXJDb25kaXRpb24oKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlFQXR0cmlidXRlIGdldERhdGFJbnRlcmNoYW5nZUZpbHRlckNvbmRpdGlvbl9PcGVyYXRvcjIoKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlICd7QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5kYXRhaW50ZXJjaGFuZ2UuRGF0YUludGVyY2hhbmdlRmlsdGVyQ29uZGl0aW9uI2dldFN1YmNvbmRpdGlvbiA8ZW0+U3ViY29uZGl0aW9uPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlICc8ZW0+U3ViY29uZGl0aW9uPC9lbT4nLgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5kYXRhaW50ZXJjaGFuZ2UuRGF0YUludGVyY2hhbmdlRmlsdGVyQ29uZGl0aW9uI2dldFN1YmNvbmRpdGlvbigpCisJICogQHNlZSAjZ2V0RGF0YUludGVyY2hhbmdlRmlsdGVyQ29uZGl0aW9uKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJRVJlZmVyZW5jZSBnZXREYXRhSW50ZXJjaGFuZ2VGaWx0ZXJDb25kaXRpb25fU3ViY29uZGl0aW9uKCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmRhdGFpbnRlcmNoYW5nZS5EYXRhSW50ZXJjaGFuZ2VFeHBvcnRIaWRlIDxlbT5EYXRhIEludGVyY2hhbmdlIEV4cG9ydCBIaWRlPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPkRhdGEgSW50ZXJjaGFuZ2UgRXhwb3J0IEhpZGU8L2VtPicuCisJICogQHNlZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmRhdGFpbnRlcmNoYW5nZS5EYXRhSW50ZXJjaGFuZ2VFeHBvcnRIaWRlCisJICogQGdlbmVyYXRlZAorCSAqLworCUVDbGFzcyBnZXREYXRhSW50ZXJjaGFuZ2VFeHBvcnRIaWRlKCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSAne0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQuZGF0YWludGVyY2hhbmdlLkRhdGFJbnRlcmNoYW5nZUV4cG9ydEhpZGUjZ2V0UHJvcGVydHkgPGVtPlByb3BlcnR5PC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlICc8ZW0+UHJvcGVydHk8L2VtPicuCisJICogQHNlZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmRhdGFpbnRlcmNoYW5nZS5EYXRhSW50ZXJjaGFuZ2VFeHBvcnRIaWRlI2dldFByb3BlcnR5KCkKKwkgKiBAc2VlICNnZXREYXRhSW50ZXJjaGFuZ2VFeHBvcnRIaWRlKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJRVJlZmVyZW5jZSBnZXREYXRhSW50ZXJjaGFuZ2VFeHBvcnRIaWRlX1Byb3BlcnR5KCk7CisKKwkvKioKIAkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmRhdGFpbnRlcmNoYW5nZS5EYXRhSW50ZXJjaGFuZ2VNYXJrZXJQYXRoIDxlbT5EYXRhIEludGVyY2hhbmdlIE1hcmtlciBQYXRoPC9lbT59Jy4KIAkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgpAQCAtMjU0MCw2ICszMDcwLDI2IEBACiAJRUVudW0gZ2V0RW50aXR5TWFuYWdlck1vZGUoKTsKIAogCS8qKgorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBlbnVtICd7QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5kYXRhaW50ZXJjaGFuZ2UuQ29uZGl0aW9uQW5kT3BlcmF0b3IxIDxlbT5Db25kaXRpb24gQW5kIE9wZXJhdG9yMTwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgZW51bSAnPGVtPkNvbmRpdGlvbiBBbmQgT3BlcmF0b3IxPC9lbT4nLgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5kYXRhaW50ZXJjaGFuZ2UuQ29uZGl0aW9uQW5kT3BlcmF0b3IxCisJICogQGdlbmVyYXRlZAorCSAqLworCUVFbnVtIGdldENvbmRpdGlvbkFuZE9wZXJhdG9yMSgpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGVudW0gJ3tAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmRhdGFpbnRlcmNoYW5nZS5Db25kaXRpb25BbmRPcGVyYXRvcjIgPGVtPkNvbmRpdGlvbiBBbmQgT3BlcmF0b3IyPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBlbnVtICc8ZW0+Q29uZGl0aW9uIEFuZCBPcGVyYXRvcjI8L2VtPicuCisJICogQHNlZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmRhdGFpbnRlcmNoYW5nZS5Db25kaXRpb25BbmRPcGVyYXRvcjIKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJRUVudW0gZ2V0Q29uZGl0aW9uQW5kT3BlcmF0b3IyKCk7CisKKwkvKioKIAkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgZGF0YSB0eXBlICd7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdCA8ZW0+SW50ZXJuYWwgRU9iamVjdDwvZW0+fScuCiAJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KQEAgLTI3MzYsNiArMzI4NiwxNCBAQAogCQlFUmVmZXJlbmNlIERBVEFfSU5URVJDSEFOR0VfX1BBVEggPSBlSU5TVEFOQ0UuZ2V0RGF0YUludGVyY2hhbmdlX1BhdGgoKTsKIAogCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkRlbGV0ZSBGaWxlIEFmdGVyIEltcG9ydDwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlFQXR0cmlidXRlIERBVEFfSU5URVJDSEFOR0VfX0RFTEVURV9GSUxFX0FGVEVSX0lNUE9SVCA9IGVJTlNUQU5DRS5nZXREYXRhSW50ZXJjaGFuZ2VfRGVsZXRlRmlsZUFmdGVySW1wb3J0KCk7CisKKwkJLyoqCiAJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmRhdGFpbnRlcmNoYW5nZS5EYXRhSW50ZXJjaGFuZ2VGaWxlIDxlbT5EYXRhIEludGVyY2hhbmdlIEZpbGU8L2VtPn0nIGNsYXNzLgogCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgogCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KQEAgLTI4OTAsMTIgKzM0NDgsMjAgQEAKIAkJRVJlZmVyZW5jZSBEQVRBX0lOVEVSQ0hBTkdFX0JFQU5fX0VOVElUWSA9IGVJTlNUQU5DRS5nZXREYXRhSW50ZXJjaGFuZ2VCZWFuX0VudGl0eSgpOwogCiAJCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+TWFyayBMYXRlc3Q8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+TWFyayBMYXRlc3QgSW1wb3J0PC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KIAkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KIAkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJCSAqIEBnZW5lcmF0ZWQKIAkJICovCi0JCUVBdHRyaWJ1dGUgREFUQV9JTlRFUkNIQU5HRV9CRUFOX19NQVJLX0xBVEVTVCA9IGVJTlNUQU5DRS5nZXREYXRhSW50ZXJjaGFuZ2VCZWFuX01hcmtMYXRlc3QoKTsKKwkJRUF0dHJpYnV0ZSBEQVRBX0lOVEVSQ0hBTkdFX0JFQU5fX01BUktfTEFURVNUX0lNUE9SVCA9IGVJTlNUQU5DRS5nZXREYXRhSW50ZXJjaGFuZ2VCZWFuX01hcmtMYXRlc3RJbXBvcnQoKTsKKworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPk1hcmsgTGF0ZXN0IEV4cG9ydDwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlFQXR0cmlidXRlIERBVEFfSU5URVJDSEFOR0VfQkVBTl9fTUFSS19MQVRFU1RfRVhQT1JUID0gZUlOU1RBTkNFLmdldERhdGFJbnRlcmNoYW5nZUJlYW5fTWFya0xhdGVzdEV4cG9ydCgpOwogCiAJCS8qKgogCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+SGFzIEJsb2IgTWFwcGluZzwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCkBAIC0yOTE0LDYgKzM0ODAsMTQgQEAKIAkJRVJlZmVyZW5jZSBEQVRBX0lOVEVSQ0hBTkdFX0JFQU5fX0xBVEVTVF9QUk9QRVJUWSA9IGVJTlNUQU5DRS5nZXREYXRhSW50ZXJjaGFuZ2VCZWFuX0xhdGVzdFByb3BlcnR5KCk7CiAKIAkJLyoqCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5MYXRlc3QgRXhwIFByb3BlcnR5PC9iPjwvZW0+JyByZWZlcmVuY2UgZmVhdHVyZS4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCUVSZWZlcmVuY2UgREFUQV9JTlRFUkNIQU5HRV9CRUFOX19MQVRFU1RfRVhQX1BST1BFUlRZID0gZUlOU1RBTkNFLmdldERhdGFJbnRlcmNoYW5nZUJlYW5fTGF0ZXN0RXhwUHJvcGVydHkoKTsKKworCQkvKioKIAkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkVsZW1lbnQgTWFwPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KIAkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KIAkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CkBAIC0yOTcwLDYgKzM1NDQsMjIgQEAKIAkJRVJlZmVyZW5jZSBEQVRBX0lOVEVSQ0hBTkdFX0JFQU5fX0xPT0tVUF9LRVlTID0gZUlOU1RBTkNFLmdldERhdGFJbnRlcmNoYW5nZUJlYW5fTG9va3VwS2V5cygpOwogCiAJCS8qKgorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+RXhwb3J0IEV4cG9zZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlFUmVmZXJlbmNlIERBVEFfSU5URVJDSEFOR0VfQkVBTl9fRVhQT1JUX0VYUE9TRVMgPSBlSU5TVEFOQ0UuZ2V0RGF0YUludGVyY2hhbmdlQmVhbl9FeHBvcnRFeHBvc2VzKCk7CisKKwkJLyoqCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5FeHBvcnQgRmlsdGVyPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgZmVhdHVyZS4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCUVSZWZlcmVuY2UgREFUQV9JTlRFUkNIQU5HRV9CRUFOX19FWFBPUlRfRklMVEVSID0gZUlOU1RBTkNFLmdldERhdGFJbnRlcmNoYW5nZUJlYW5fRXhwb3J0RmlsdGVyKCk7CisKKwkJLyoqCiAJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmRhdGFpbnRlcmNoYW5nZS5pbXBsLkRhdGFJbnRlcmNoYW5nZUtleUltcGwgPGVtPkRhdGEgSW50ZXJjaGFuZ2UgS2V5PC9lbT59JyBjbGFzcy4KIAkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KIAkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CkBAIC0zMTc0LDYgKzM3NjQsMTM0IEBACiAJCUVSZWZlcmVuY2UgREFUQV9JTlRFUkNIQU5HRV9MT09LVVBfX01BUktFUl9QQVRIID0gZUlOU1RBTkNFLmdldERhdGFJbnRlcmNoYW5nZUxvb2t1cF9NYXJrZXJQYXRoKCk7CiAKIAkJLyoqCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmRhdGFpbnRlcmNoYW5nZS5pbXBsLkRhdGFJbnRlcmNoYW5nZUV4cG9zZUltcGwgPGVtPkRhdGEgSW50ZXJjaGFuZ2UgRXhwb3NlPC9lbT59JyBjbGFzcy4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5kYXRhaW50ZXJjaGFuZ2UuaW1wbC5EYXRhSW50ZXJjaGFuZ2VFeHBvc2VJbXBsCisJCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5kYXRhaW50ZXJjaGFuZ2UuaW1wbC5EYXRhRFNMUGFja2FnZUltcGwjZ2V0RGF0YUludGVyY2hhbmdlRXhwb3NlKCkKKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJRUNsYXNzIERBVEFfSU5URVJDSEFOR0VfRVhQT1NFID0gZUlOU1RBTkNFLmdldERhdGFJbnRlcmNoYW5nZUV4cG9zZSgpOworCisJCS8qKgorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+UmVmIEVudGl0eTwvYj48L2VtPicgcmVmZXJlbmNlIGZlYXR1cmUuCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlFUmVmZXJlbmNlIERBVEFfSU5URVJDSEFOR0VfRVhQT1NFX19SRUZfRU5USVRZID0gZUlOU1RBTkNFLmdldERhdGFJbnRlcmNoYW5nZUV4cG9zZV9SZWZFbnRpdHkoKTsKKworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlJlZiBQcm9wZXJ0eTwvYj48L2VtPicgcmVmZXJlbmNlIGZlYXR1cmUuCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlFUmVmZXJlbmNlIERBVEFfSU5URVJDSEFOR0VfRVhQT1NFX19SRUZfUFJPUEVSVFkgPSBlSU5TVEFOQ0UuZ2V0RGF0YUludGVyY2hhbmdlRXhwb3NlX1JlZlByb3BlcnR5KCk7CisKKwkJLyoqCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5TdWIgRXhwb3NlPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgZmVhdHVyZS4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCUVSZWZlcmVuY2UgREFUQV9JTlRFUkNIQU5HRV9FWFBPU0VfX1NVQl9FWFBPU0UgPSBlSU5TVEFOQ0UuZ2V0RGF0YUludGVyY2hhbmdlRXhwb3NlX1N1YkV4cG9zZSgpOworCisJCS8qKgorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5kYXRhaW50ZXJjaGFuZ2UuaW1wbC5EYXRhSW50ZXJjaGFuZ2VFeHBvcnRGaWx0ZXJJbXBsIDxlbT5EYXRhIEludGVyY2hhbmdlIEV4cG9ydCBGaWx0ZXI8L2VtPn0nIGNsYXNzLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQHNlZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmRhdGFpbnRlcmNoYW5nZS5pbXBsLkRhdGFJbnRlcmNoYW5nZUV4cG9ydEZpbHRlckltcGwKKwkJICogQHNlZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmRhdGFpbnRlcmNoYW5nZS5pbXBsLkRhdGFEU0xQYWNrYWdlSW1wbCNnZXREYXRhSW50ZXJjaGFuZ2VFeHBvcnRGaWx0ZXIoKQorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlFQ2xhc3MgREFUQV9JTlRFUkNIQU5HRV9FWFBPUlRfRklMVEVSID0gZUlOU1RBTkNFLmdldERhdGFJbnRlcmNoYW5nZUV4cG9ydEZpbHRlcigpOworCisJCS8qKgorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+Q29uZGl0aW9uPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgZmVhdHVyZS4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCUVSZWZlcmVuY2UgREFUQV9JTlRFUkNIQU5HRV9FWFBPUlRfRklMVEVSX19DT05ESVRJT04gPSBlSU5TVEFOQ0UuZ2V0RGF0YUludGVyY2hhbmdlRXhwb3J0RmlsdGVyX0NvbmRpdGlvbigpOworCisJCS8qKgorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+SGlkZGVucHJvcGVydGllczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCUVSZWZlcmVuY2UgREFUQV9JTlRFUkNIQU5HRV9FWFBPUlRfRklMVEVSX19ISURERU5QUk9QRVJUSUVTID0gZUlOU1RBTkNFLmdldERhdGFJbnRlcmNoYW5nZUV4cG9ydEZpbHRlcl9IaWRkZW5wcm9wZXJ0aWVzKCk7CisKKwkJLyoqCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmRhdGFpbnRlcmNoYW5nZS5pbXBsLkRhdGFJbnRlcmNoYW5nZUZpbHRlckNvbmRpdGlvbkltcGwgPGVtPkRhdGEgSW50ZXJjaGFuZ2UgRmlsdGVyIENvbmRpdGlvbjwvZW0+fScgY2xhc3MuCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAc2VlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQuZGF0YWludGVyY2hhbmdlLmltcGwuRGF0YUludGVyY2hhbmdlRmlsdGVyQ29uZGl0aW9uSW1wbAorCQkgKiBAc2VlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQuZGF0YWludGVyY2hhbmdlLmltcGwuRGF0YURTTFBhY2thZ2VJbXBsI2dldERhdGFJbnRlcmNoYW5nZUZpbHRlckNvbmRpdGlvbigpCisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCUVDbGFzcyBEQVRBX0lOVEVSQ0hBTkdFX0ZJTFRFUl9DT05ESVRJT04gPSBlSU5TVEFOQ0UuZ2V0RGF0YUludGVyY2hhbmdlRmlsdGVyQ29uZGl0aW9uKCk7CisKKwkJLyoqCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5SZWYgUHJvcGVydHk8L2I+PC9lbT4nIHJlZmVyZW5jZSBmZWF0dXJlLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJRVJlZmVyZW5jZSBEQVRBX0lOVEVSQ0hBTkdFX0ZJTFRFUl9DT05ESVRJT05fX1JFRl9QUk9QRVJUWSA9IGVJTlNUQU5DRS5nZXREYXRhSW50ZXJjaGFuZ2VGaWx0ZXJDb25kaXRpb25fUmVmUHJvcGVydHkoKTsKKworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPk9wZXJhdG9yPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCUVBdHRyaWJ1dGUgREFUQV9JTlRFUkNIQU5HRV9GSUxURVJfQ09ORElUSU9OX19PUEVSQVRPUiA9IGVJTlNUQU5DRS5nZXREYXRhSW50ZXJjaGFuZ2VGaWx0ZXJDb25kaXRpb25fT3BlcmF0b3IoKTsKKworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlZhbHVlPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCUVBdHRyaWJ1dGUgREFUQV9JTlRFUkNIQU5HRV9GSUxURVJfQ09ORElUSU9OX19WQUxVRSA9IGVJTlNUQU5DRS5nZXREYXRhSW50ZXJjaGFuZ2VGaWx0ZXJDb25kaXRpb25fVmFsdWUoKTsKKworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPk9wZXJhdG9yMjwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlFQXR0cmlidXRlIERBVEFfSU5URVJDSEFOR0VfRklMVEVSX0NPTkRJVElPTl9fT1BFUkFUT1IyID0gZUlOU1RBTkNFLmdldERhdGFJbnRlcmNoYW5nZUZpbHRlckNvbmRpdGlvbl9PcGVyYXRvcjIoKTsKKworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlN1YmNvbmRpdGlvbjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGZlYXR1cmUuCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlFUmVmZXJlbmNlIERBVEFfSU5URVJDSEFOR0VfRklMVEVSX0NPTkRJVElPTl9fU1VCQ09ORElUSU9OID0gZUlOU1RBTkNFLmdldERhdGFJbnRlcmNoYW5nZUZpbHRlckNvbmRpdGlvbl9TdWJjb25kaXRpb24oKTsKKworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQuZGF0YWludGVyY2hhbmdlLmltcGwuRGF0YUludGVyY2hhbmdlRXhwb3J0SGlkZUltcGwgPGVtPkRhdGEgSW50ZXJjaGFuZ2UgRXhwb3J0IEhpZGU8L2VtPn0nIGNsYXNzLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQHNlZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmRhdGFpbnRlcmNoYW5nZS5pbXBsLkRhdGFJbnRlcmNoYW5nZUV4cG9ydEhpZGVJbXBsCisJCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5kYXRhaW50ZXJjaGFuZ2UuaW1wbC5EYXRhRFNMUGFja2FnZUltcGwjZ2V0RGF0YUludGVyY2hhbmdlRXhwb3J0SGlkZSgpCisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCUVDbGFzcyBEQVRBX0lOVEVSQ0hBTkdFX0VYUE9SVF9ISURFID0gZUlOU1RBTkNFLmdldERhdGFJbnRlcmNoYW5nZUV4cG9ydEhpZGUoKTsKKworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlByb3BlcnR5PC9iPjwvZW0+JyByZWZlcmVuY2UgZmVhdHVyZS4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCUVSZWZlcmVuY2UgREFUQV9JTlRFUkNIQU5HRV9FWFBPUlRfSElERV9fUFJPUEVSVFkgPSBlSU5TVEFOQ0UuZ2V0RGF0YUludGVyY2hhbmdlRXhwb3J0SGlkZV9Qcm9wZXJ0eSgpOworCisJCS8qKgogCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5kYXRhaW50ZXJjaGFuZ2UuaW1wbC5EYXRhSW50ZXJjaGFuZ2VNYXJrZXJQYXRoSW1wbCA8ZW0+RGF0YSBJbnRlcmNoYW5nZSBNYXJrZXIgUGF0aDwvZW0+fScgY2xhc3MuCiAJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CiAJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgpAQCAtMzMzNiw2ICs0MDU0LDI2IEBACiAJCUVFbnVtIEVOVElUWV9NQU5BR0VSX01PREUgPSBlSU5TVEFOQ0UuZ2V0RW50aXR5TWFuYWdlck1vZGUoKTsKIAogCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQuZGF0YWludGVyY2hhbmdlLkNvbmRpdGlvbkFuZE9wZXJhdG9yMSA8ZW0+Q29uZGl0aW9uIEFuZCBPcGVyYXRvcjE8L2VtPn0nIGVudW0uCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAc2VlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQuZGF0YWludGVyY2hhbmdlLkNvbmRpdGlvbkFuZE9wZXJhdG9yMQorCQkgKiBAc2VlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQuZGF0YWludGVyY2hhbmdlLmltcGwuRGF0YURTTFBhY2thZ2VJbXBsI2dldENvbmRpdGlvbkFuZE9wZXJhdG9yMSgpCisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCUVFbnVtIENPTkRJVElPTl9BTkRfT1BFUkFUT1IxID0gZUlOU1RBTkNFLmdldENvbmRpdGlvbkFuZE9wZXJhdG9yMSgpOworCisJCS8qKgorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5kYXRhaW50ZXJjaGFuZ2UuQ29uZGl0aW9uQW5kT3BlcmF0b3IyIDxlbT5Db25kaXRpb24gQW5kIE9wZXJhdG9yMjwvZW0+fScgZW51bS4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5kYXRhaW50ZXJjaGFuZ2UuQ29uZGl0aW9uQW5kT3BlcmF0b3IyCisJCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5kYXRhaW50ZXJjaGFuZ2UuaW1wbC5EYXRhRFNMUGFja2FnZUltcGwjZ2V0Q29uZGl0aW9uQW5kT3BlcmF0b3IyKCkKKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJRUVudW0gQ09ORElUSU9OX0FORF9PUEVSQVRPUjIgPSBlSU5TVEFOQ0UuZ2V0Q29uZGl0aW9uQW5kT3BlcmF0b3IyKCk7CisKKwkJLyoqCiAJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT5JbnRlcm5hbCBFT2JqZWN0PC9lbT4nIGRhdGEgdHlwZS4KIAkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KIAkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmRhdGFpbnRlcmNoYW5nZS9lbWYtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvZGF0YWludGVyY2hhbmdlL0RhdGFJbnRlcmNoYW5nZS5qYXZhIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5kYXRhaW50ZXJjaGFuZ2UvZW1mLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2RhdGFpbnRlcmNoYW5nZS9EYXRhSW50ZXJjaGFuZ2UuamF2YQppbmRleCAzZDA2Mjg3Li5iMzZlZjAyIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmRhdGFpbnRlcmNoYW5nZS9lbWYtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvZGF0YWludGVyY2hhbmdlL0RhdGFJbnRlcmNoYW5nZS5qYXZhCisrKyBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQuZGF0YWludGVyY2hhbmdlL2VtZi1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9kYXRhaW50ZXJjaGFuZ2UvRGF0YUludGVyY2hhbmdlLmphdmEKQEAgLTEsMTMgKzEsMTUgQEAKIC8qKgogICogQ29weXJpZ2h0IChjKSAyMDE0LCBMb2V0eiBHbWJIJkNvLktHIChIZWlkZWxiZXJnKQogICogIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIAorICogIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgMi4wICAKICAqICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAKLSAqICBodHRwey8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCAKKyAqICBodHRwczovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLyAKKyAqIAorICogIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIAogICogCiAgKiAgQmFzZWQgb24gaWRlYXMgZnJvbSBYdGV4dCwgWHRlbmQsIFhjb3JlCiAgKiAgIAotICogIENvbnRyaWJ1dG9yc3sgIAorICogIENvbnRyaWJ1dG9yczogIAogICogIAkJSm9lcmcgUmllZ2VsIC0gSW5pdGlhbCBpbXBsZW1lbnRhdGlvbiAKICAqICAKICAqLwpAQCAtMzIsNiArMzQsNyBAQAogICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQuZGF0YWludGVyY2hhbmdlLkRhdGFJbnRlcmNoYW5nZSNnZXRNb2RlIDxlbT5Nb2RlPC9lbT59PC9saT4KICAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmRhdGFpbnRlcmNoYW5nZS5EYXRhSW50ZXJjaGFuZ2UjZ2V0RmlsZUVuZHBvaW50IDxlbT5GaWxlIEVuZHBvaW50PC9lbT59PC9saT4KICAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmRhdGFpbnRlcmNoYW5nZS5EYXRhSW50ZXJjaGFuZ2UjZ2V0UGF0aCA8ZW0+UGF0aDwvZW0+fTwvbGk+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5kYXRhaW50ZXJjaGFuZ2UuRGF0YUludGVyY2hhbmdlI2lzRGVsZXRlRmlsZUFmdGVySW1wb3J0IDxlbT5EZWxldGUgRmlsZSBBZnRlciBJbXBvcnQ8L2VtPn08L2xpPgogICogPC91bD4KICAqCiAgKiBAc2VlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQuZGF0YWludGVyY2hhbmdlLkRhdGFEU0xQYWNrYWdlI2dldERhdGFJbnRlcmNoYW5nZSgpCkBAIC0yNDAsNCArMjQzLDMwIEBACiAJICovCiAJRUxpc3Q8RGF0YUludGVyY2hhbmdlQmVhbj4gZ2V0UGF0aCgpOwogCisJLyoqCisJICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RGVsZXRlIEZpbGUgQWZ0ZXIgSW1wb3J0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8cD4KKwkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5EZWxldGUgRmlsZSBBZnRlciBJbXBvcnQ8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAorCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KKwkgKiA8L3A+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RGVsZXRlIEZpbGUgQWZ0ZXIgSW1wb3J0PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiBAc2VlICNzZXREZWxldGVGaWxlQWZ0ZXJJbXBvcnQoYm9vbGVhbikKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQuZGF0YWludGVyY2hhbmdlLkRhdGFEU0xQYWNrYWdlI2dldERhdGFJbnRlcmNoYW5nZV9EZWxldGVGaWxlQWZ0ZXJJbXBvcnQoKQorCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlib29sZWFuIGlzRGVsZXRlRmlsZUFmdGVySW1wb3J0KCk7CisKKwkvKioKKwkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmRhdGFpbnRlcmNoYW5nZS5EYXRhSW50ZXJjaGFuZ2UjaXNEZWxldGVGaWxlQWZ0ZXJJbXBvcnQgPGVtPkRlbGV0ZSBGaWxlIEFmdGVyIEltcG9ydDwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+RGVsZXRlIEZpbGUgQWZ0ZXIgSW1wb3J0PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiBAc2VlICNpc0RlbGV0ZUZpbGVBZnRlckltcG9ydCgpCisJICogQGdlbmVyYXRlZAorCSAqLworCXZvaWQgc2V0RGVsZXRlRmlsZUFmdGVySW1wb3J0KGJvb2xlYW4gdmFsdWUpOworCiB9IC8vIERhdGFJbnRlcmNoYW5nZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5kYXRhaW50ZXJjaGFuZ2UvZW1mLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2RhdGFpbnRlcmNoYW5nZS9EYXRhSW50ZXJjaGFuZ2VCYXNlLmphdmEgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmRhdGFpbnRlcmNoYW5nZS9lbWYtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvZGF0YWludGVyY2hhbmdlL0RhdGFJbnRlcmNoYW5nZUJhc2UuamF2YQppbmRleCA0MjM5YmI2Li45ZTk4MmRjIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmRhdGFpbnRlcmNoYW5nZS9lbWYtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvZGF0YWludGVyY2hhbmdlL0RhdGFJbnRlcmNoYW5nZUJhc2UuamF2YQorKysgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmRhdGFpbnRlcmNoYW5nZS9lbWYtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvZGF0YWludGVyY2hhbmdlL0RhdGFJbnRlcmNoYW5nZUJhc2UuamF2YQpAQCAtMSwxMyArMSwxNSBAQAogLyoqCiAgKiBDb3B5cmlnaHQgKGMpIDIwMTQsIExvZXR6IEdtYkgmQ28uS0cgKEhlaWRlbGJlcmcpCiAgKiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgCisgKiAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSAyLjAgIAogICogIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IAotICogIGh0dHB7Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIAorICogIGh0dHBzOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAvIAorICogCisgKiAgU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgCiAgKiAKICAqICBCYXNlZCBvbiBpZGVhcyBmcm9tIFh0ZXh0LCBYdGVuZCwgWGNvcmUKICAqICAgCi0gKiAgQ29udHJpYnV0b3JzeyAgCisgKiAgQ29udHJpYnV0b3JzOiAgCiAgKiAgCQlKb2VyZyBSaWVnZWwgLSBJbml0aWFsIGltcGxlbWVudGF0aW9uIAogICogIAogICovCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmRhdGFpbnRlcmNoYW5nZS9lbWYtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvZGF0YWludGVyY2hhbmdlL0RhdGFJbnRlcmNoYW5nZUJlYW4uamF2YSBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQuZGF0YWludGVyY2hhbmdlL2VtZi1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9kYXRhaW50ZXJjaGFuZ2UvRGF0YUludGVyY2hhbmdlQmVhbi5qYXZhCmluZGV4IDc2OTYzNjAuLmJmMDIwYWYgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLm9zYnAueHRleHQuZGF0YWludGVyY2hhbmdlL2VtZi1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9kYXRhaW50ZXJjaGFuZ2UvRGF0YUludGVyY2hhbmdlQmVhbi5qYXZhCisrKyBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQuZGF0YWludGVyY2hhbmdlL2VtZi1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9kYXRhaW50ZXJjaGFuZ2UvRGF0YUludGVyY2hhbmdlQmVhbi5qYXZhCkBAIC0xLDEzICsxLDE1IEBACiAvKioKICAqIENvcHlyaWdodCAoYykgMjAxNCwgTG9ldHogR21iSCZDby5LRyAoSGVpZGVsYmVyZykKICAqICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCAKKyAqICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIDIuMCAgCiAgKiAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgCi0gKiAgaHR0cHsvL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwgCisgKiAgaHR0cHM6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC8gCisgKiAKKyAqICBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCAKICAqIAogICogIEJhc2VkIG9uIGlkZWFzIGZyb20gWHRleHQsIFh0ZW5kLCBYY29yZQogICogICAKLSAqICBDb250cmlidXRvcnN7ICAKKyAqICBDb250cmlidXRvcnM6ICAKICAqICAJCUpvZXJnIFJpZWdlbCAtIEluaXRpYWwgaW1wbGVtZW50YXRpb24gCiAgKiAgCiAgKi8KQEAgLTI4LDkgKzMwLDExIEBACiAgKiA8L3A+CiAgKiA8dWw+CiAgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5kYXRhaW50ZXJjaGFuZ2UuRGF0YUludGVyY2hhbmdlQmVhbiNnZXRFbnRpdHkgPGVtPkVudGl0eTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5kYXRhaW50ZXJjaGFuZ2UuRGF0YUludGVyY2hhbmdlQmVhbiNpc01hcmtMYXRlc3QgPGVtPk1hcmsgTGF0ZXN0PC9lbT59PC9saT4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmRhdGFpbnRlcmNoYW5nZS5EYXRhSW50ZXJjaGFuZ2VCZWFuI2lzTWFya0xhdGVzdEltcG9ydCA8ZW0+TWFyayBMYXRlc3QgSW1wb3J0PC9lbT59PC9saT4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmRhdGFpbnRlcmNoYW5nZS5EYXRhSW50ZXJjaGFuZ2VCZWFuI2lzTWFya0xhdGVzdEV4cG9ydCA8ZW0+TWFyayBMYXRlc3QgRXhwb3J0PC9lbT59PC9saT4KICAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmRhdGFpbnRlcmNoYW5nZS5EYXRhSW50ZXJjaGFuZ2VCZWFuI2lzSGFzQmxvYk1hcHBpbmcgPGVtPkhhcyBCbG9iIE1hcHBpbmc8L2VtPn08L2xpPgogICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQuZGF0YWludGVyY2hhbmdlLkRhdGFJbnRlcmNoYW5nZUJlYW4jZ2V0TGF0ZXN0UHJvcGVydHkgPGVtPkxhdGVzdCBQcm9wZXJ0eTwvZW0+fTwvbGk+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5kYXRhaW50ZXJjaGFuZ2UuRGF0YUludGVyY2hhbmdlQmVhbiNnZXRMYXRlc3RFeHBQcm9wZXJ0eSA8ZW0+TGF0ZXN0IEV4cCBQcm9wZXJ0eTwvZW0+fTwvbGk+CiAgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5kYXRhaW50ZXJjaGFuZ2UuRGF0YUludGVyY2hhbmdlQmVhbiNnZXRFbGVtZW50TWFwIDxlbT5FbGVtZW50IE1hcDwvZW0+fTwvbGk+CiAgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5kYXRhaW50ZXJjaGFuZ2UuRGF0YUludGVyY2hhbmdlQmVhbiNnZXROb2RlTmFtZSA8ZW0+Tm9kZSBOYW1lPC9lbT59PC9saT4KICAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmRhdGFpbnRlcmNoYW5nZS5EYXRhSW50ZXJjaGFuZ2VCZWFuI2dldExvb2t1cCA8ZW0+TG9va3VwPC9lbT59PC9saT4KQEAgLTM4LDYgKzQyLDggQEAKICAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmRhdGFpbnRlcmNoYW5nZS5EYXRhSW50ZXJjaGFuZ2VCZWFuI2dldEV4cHJlc3Npb24gPGVtPkV4cHJlc3Npb248L2VtPn08L2xpPgogICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQuZGF0YWludGVyY2hhbmdlLkRhdGFJbnRlcmNoYW5nZUJlYW4jZ2V0TWFwcGluZ3MgPGVtPk1hcHBpbmdzPC9lbT59PC9saT4KICAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmRhdGFpbnRlcmNoYW5nZS5EYXRhSW50ZXJjaGFuZ2VCZWFuI2dldExvb2t1cEtleXMgPGVtPkxvb2t1cCBLZXlzPC9lbT59PC9saT4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmRhdGFpbnRlcmNoYW5nZS5EYXRhSW50ZXJjaGFuZ2VCZWFuI2dldEV4cG9ydEV4cG9zZXMgPGVtPkV4cG9ydCBFeHBvc2VzPC9lbT59PC9saT4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmRhdGFpbnRlcmNoYW5nZS5EYXRhSW50ZXJjaGFuZ2VCZWFuI2dldEV4cG9ydEZpbHRlciA8ZW0+RXhwb3J0IEZpbHRlcjwvZW0+fTwvbGk+CiAgKiA8L3VsPgogICoKICAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5kYXRhaW50ZXJjaGFuZ2UuRGF0YURTTFBhY2thZ2UjZ2V0RGF0YUludGVyY2hhbmdlQmVhbigpCkBAIC03MiwzMCArNzgsNTYgQEAKIAl2b2lkIHNldEVudGl0eShMRW50aXR5IHZhbHVlKTsKIAogCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPk1hcmsgTGF0ZXN0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+TWFyayBMYXRlc3QgSW1wb3J0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCiAJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KIAkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5NYXJrIExhdGVzdDwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCisJICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+TWFyayBMYXRlc3QgSW1wb3J0PC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKIAkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCiAJICogPC9wPgogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPk1hcmsgTGF0ZXN0PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRNYXJrTGF0ZXN0KGJvb2xlYW4pCi0JICogQHNlZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmRhdGFpbnRlcmNoYW5nZS5EYXRhRFNMUGFja2FnZSNnZXREYXRhSW50ZXJjaGFuZ2VCZWFuX01hcmtMYXRlc3QoKQorCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPk1hcmsgTGF0ZXN0IEltcG9ydDwvZW0+JyBhdHRyaWJ1dGUuCisJICogQHNlZSAjc2V0TWFya0xhdGVzdEltcG9ydChib29sZWFuKQorCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5kYXRhaW50ZXJjaGFuZ2UuRGF0YURTTFBhY2thZ2UjZ2V0RGF0YUludGVyY2hhbmdlQmVhbl9NYXJrTGF0ZXN0SW1wb3J0KCkKIAkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIKIAkgKiBAZ2VuZXJhdGVkCiAJICovCi0JYm9vbGVhbiBpc01hcmtMYXRlc3QoKTsKKwlib29sZWFuIGlzTWFya0xhdGVzdEltcG9ydCgpOwogCiAJLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5kYXRhaW50ZXJjaGFuZ2UuRGF0YUludGVyY2hhbmdlQmVhbiNpc01hcmtMYXRlc3QgPGVtPk1hcmsgTGF0ZXN0PC9lbT59JyBhdHRyaWJ1dGUuCisJICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5kYXRhaW50ZXJjaGFuZ2UuRGF0YUludGVyY2hhbmdlQmVhbiNpc01hcmtMYXRlc3RJbXBvcnQgPGVtPk1hcmsgTGF0ZXN0IEltcG9ydDwvZW0+fScgYXR0cmlidXRlLgogCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+TWFyayBMYXRlc3Q8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2lzTWFya0xhdGVzdCgpCisJICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+TWFyayBMYXRlc3QgSW1wb3J0PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiBAc2VlICNpc01hcmtMYXRlc3RJbXBvcnQoKQogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KLQl2b2lkIHNldE1hcmtMYXRlc3QoYm9vbGVhbiB2YWx1ZSk7CisJdm9pZCBzZXRNYXJrTGF0ZXN0SW1wb3J0KGJvb2xlYW4gdmFsdWUpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+TWFyayBMYXRlc3QgRXhwb3J0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8cD4KKwkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5NYXJrIExhdGVzdCBFeHBvcnQ8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAorCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KKwkgKiA8L3A+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+TWFyayBMYXRlc3QgRXhwb3J0PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiBAc2VlICNzZXRNYXJrTGF0ZXN0RXhwb3J0KGJvb2xlYW4pCisJICogQHNlZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmRhdGFpbnRlcmNoYW5nZS5EYXRhRFNMUGFja2FnZSNnZXREYXRhSW50ZXJjaGFuZ2VCZWFuX01hcmtMYXRlc3RFeHBvcnQoKQorCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlib29sZWFuIGlzTWFya0xhdGVzdEV4cG9ydCgpOworCisJLyoqCisJICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5kYXRhaW50ZXJjaGFuZ2UuRGF0YUludGVyY2hhbmdlQmVhbiNpc01hcmtMYXRlc3RFeHBvcnQgPGVtPk1hcmsgTGF0ZXN0IEV4cG9ydDwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+TWFyayBMYXRlc3QgRXhwb3J0PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiBAc2VlICNpc01hcmtMYXRlc3RFeHBvcnQoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwl2b2lkIHNldE1hcmtMYXRlc3RFeHBvcnQoYm9vbGVhbiB2YWx1ZSk7CiAKIAkvKioKIAkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5IYXMgQmxvYiBNYXBwaW5nPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCkBAIC0xNTAsNiArMTgyLDMyIEBACiAJdm9pZCBzZXRMYXRlc3RQcm9wZXJ0eShMRW50aXR5QXR0cmlidXRlIHZhbHVlKTsKIAogCS8qKgorCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkxhdGVzdCBFeHAgUHJvcGVydHk8L2I+PC9lbT4nIHJlZmVyZW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDxwPgorCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkxhdGVzdCBFeHAgUHJvcGVydHk8L2VtPicgcmVmZXJlbmNlIGlzbid0IGNsZWFyLAorCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KKwkgKiA8L3A+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+TGF0ZXN0IEV4cCBQcm9wZXJ0eTwvZW0+JyByZWZlcmVuY2UuCisJICogQHNlZSAjc2V0TGF0ZXN0RXhwUHJvcGVydHkoTEVudGl0eUF0dHJpYnV0ZSkKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQuZGF0YWludGVyY2hhbmdlLkRhdGFEU0xQYWNrYWdlI2dldERhdGFJbnRlcmNoYW5nZUJlYW5fTGF0ZXN0RXhwUHJvcGVydHkoKQorCSAqIEBtb2RlbAorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlMRW50aXR5QXR0cmlidXRlIGdldExhdGVzdEV4cFByb3BlcnR5KCk7CisKKwkvKioKKwkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmRhdGFpbnRlcmNoYW5nZS5EYXRhSW50ZXJjaGFuZ2VCZWFuI2dldExhdGVzdEV4cFByb3BlcnR5IDxlbT5MYXRlc3QgRXhwIFByb3BlcnR5PC9lbT59JyByZWZlcmVuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5MYXRlc3QgRXhwIFByb3BlcnR5PC9lbT4nIHJlZmVyZW5jZS4KKwkgKiBAc2VlICNnZXRMYXRlc3RFeHBQcm9wZXJ0eSgpCisJICogQGdlbmVyYXRlZAorCSAqLworCXZvaWQgc2V0TGF0ZXN0RXhwUHJvcGVydHkoTEVudGl0eUF0dHJpYnV0ZSB2YWx1ZSk7CisKKwkvKioKIAkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5FbGVtZW50IE1hcDwvYj48L2VtPicgYXR0cmlidXRlLgogCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CiAJICogPHA+CkBAIC0yODEsNCArMzM5LDQ2IEBACiAJICovCiAJRUxpc3Q8RGF0YUludGVyY2hhbmdlS2V5PiBnZXRMb29rdXBLZXlzKCk7CiAKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5FeHBvcnQgRXhwb3NlczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCisJICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQuZGF0YWludGVyY2hhbmdlLkRhdGFJbnRlcmNoYW5nZUV4cG9zZX0uCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8cD4KKwkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5FeHBvcnQgRXhwb3NlczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKKwkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCisJICogPC9wPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkV4cG9ydCBFeHBvc2VzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5kYXRhaW50ZXJjaGFuZ2UuRGF0YURTTFBhY2thZ2UjZ2V0RGF0YUludGVyY2hhbmdlQmVhbl9FeHBvcnRFeHBvc2VzKCkKKwkgKiBAbW9kZWwgY29udGFpbm1lbnQ9InRydWUiCisJICogQGdlbmVyYXRlZAorCSAqLworCUVMaXN0PERhdGFJbnRlcmNoYW5nZUV4cG9zZT4gZ2V0RXhwb3J0RXhwb3NlcygpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RXhwb3J0IEZpbHRlcjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPHA+CisJICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+RXhwb3J0IEZpbHRlcjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgaXNuJ3QgY2xlYXIsCisJICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgorCSAqIDwvcD4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5FeHBvcnQgRmlsdGVyPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KKwkgKiBAc2VlICNzZXRFeHBvcnRGaWx0ZXIoRGF0YUludGVyY2hhbmdlRXhwb3J0RmlsdGVyKQorCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5kYXRhaW50ZXJjaGFuZ2UuRGF0YURTTFBhY2thZ2UjZ2V0RGF0YUludGVyY2hhbmdlQmVhbl9FeHBvcnRGaWx0ZXIoKQorCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJRGF0YUludGVyY2hhbmdlRXhwb3J0RmlsdGVyIGdldEV4cG9ydEZpbHRlcigpOworCisJLyoqCisJICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5kYXRhaW50ZXJjaGFuZ2UuRGF0YUludGVyY2hhbmdlQmVhbiNnZXRFeHBvcnRGaWx0ZXIgPGVtPkV4cG9ydCBGaWx0ZXI8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkV4cG9ydCBGaWx0ZXI8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgorCSAqIEBzZWUgI2dldEV4cG9ydEZpbHRlcigpCisJICogQGdlbmVyYXRlZAorCSAqLworCXZvaWQgc2V0RXhwb3J0RmlsdGVyKERhdGFJbnRlcmNoYW5nZUV4cG9ydEZpbHRlciB2YWx1ZSk7CisKIH0gLy8gRGF0YUludGVyY2hhbmdlQmVhbgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5kYXRhaW50ZXJjaGFuZ2UvZW1mLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2RhdGFpbnRlcmNoYW5nZS9EYXRhSW50ZXJjaGFuZ2VCbG9iTWFwcGluZy5qYXZhIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5kYXRhaW50ZXJjaGFuZ2UvZW1mLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2RhdGFpbnRlcmNoYW5nZS9EYXRhSW50ZXJjaGFuZ2VCbG9iTWFwcGluZy5qYXZhCmluZGV4IDY2ZjY0MzcuLjU3OTM0M2YgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLm9zYnAueHRleHQuZGF0YWludGVyY2hhbmdlL2VtZi1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9kYXRhaW50ZXJjaGFuZ2UvRGF0YUludGVyY2hhbmdlQmxvYk1hcHBpbmcuamF2YQorKysgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmRhdGFpbnRlcmNoYW5nZS9lbWYtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvZGF0YWludGVyY2hhbmdlL0RhdGFJbnRlcmNoYW5nZUJsb2JNYXBwaW5nLmphdmEKQEAgLTEsMTMgKzEsMTUgQEAKIC8qKgogICogQ29weXJpZ2h0IChjKSAyMDE0LCBMb2V0eiBHbWJIJkNvLktHIChIZWlkZWxiZXJnKQogICogIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIAorICogIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgMi4wICAKICAqICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAKLSAqICBodHRwey8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCAKKyAqICBodHRwczovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLyAKKyAqIAorICogIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIAogICogCiAgKiAgQmFzZWQgb24gaWRlYXMgZnJvbSBYdGV4dCwgWHRlbmQsIFhjb3JlCiAgKiAgIAotICogIENvbnRyaWJ1dG9yc3sgIAorICogIENvbnRyaWJ1dG9yczogIAogICogIAkJSm9lcmcgUmllZ2VsIC0gSW5pdGlhbCBpbXBsZW1lbnRhdGlvbiAKICAqICAKICAqLwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5kYXRhaW50ZXJjaGFuZ2UvZW1mLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2RhdGFpbnRlcmNoYW5nZS9EYXRhSW50ZXJjaGFuZ2VFbnRpdHlFeHByZXNzaW9uLmphdmEgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmRhdGFpbnRlcmNoYW5nZS9lbWYtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvZGF0YWludGVyY2hhbmdlL0RhdGFJbnRlcmNoYW5nZUVudGl0eUV4cHJlc3Npb24uamF2YQppbmRleCA4M2ZjZjIzLi5mMzEyZWU0IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmRhdGFpbnRlcmNoYW5nZS9lbWYtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvZGF0YWludGVyY2hhbmdlL0RhdGFJbnRlcmNoYW5nZUVudGl0eUV4cHJlc3Npb24uamF2YQorKysgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmRhdGFpbnRlcmNoYW5nZS9lbWYtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvZGF0YWludGVyY2hhbmdlL0RhdGFJbnRlcmNoYW5nZUVudGl0eUV4cHJlc3Npb24uamF2YQpAQCAtMSwxMyArMSwxNSBAQAogLyoqCiAgKiBDb3B5cmlnaHQgKGMpIDIwMTQsIExvZXR6IEdtYkgmQ28uS0cgKEhlaWRlbGJlcmcpCiAgKiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgCisgKiAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSAyLjAgIAogICogIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IAotICogIGh0dHB7Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIAorICogIGh0dHBzOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAvIAorICogCisgKiAgU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgCiAgKiAKICAqICBCYXNlZCBvbiBpZGVhcyBmcm9tIFh0ZXh0LCBYdGVuZCwgWGNvcmUKICAqICAgCi0gKiAgQ29udHJpYnV0b3JzeyAgCisgKiAgQ29udHJpYnV0b3JzOiAgCiAgKiAgCQlKb2VyZyBSaWVnZWwgLSBJbml0aWFsIGltcGxlbWVudGF0aW9uIAogICogIAogICovCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmRhdGFpbnRlcmNoYW5nZS9lbWYtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvZGF0YWludGVyY2hhbmdlL0RhdGFJbnRlcmNoYW5nZUV4cG9ydEZpbHRlci5qYXZhIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5kYXRhaW50ZXJjaGFuZ2UvZW1mLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2RhdGFpbnRlcmNoYW5nZS9EYXRhSW50ZXJjaGFuZ2VFeHBvcnRGaWx0ZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mOTZiNTc5Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5kYXRhaW50ZXJjaGFuZ2UvZW1mLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2RhdGFpbnRlcmNoYW5nZS9EYXRhSW50ZXJjaGFuZ2VFeHBvcnRGaWx0ZXIuamF2YQpAQCAtMCwwICsxLDgwIEBACisvKioKKyAqIENvcHlyaWdodCAoYykgMjAxNCwgTG9ldHogR21iSCZDby5LRyAoSGVpZGVsYmVyZykKKyAqICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAorICogIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgMi4wICAKKyAqICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAKKyAqICBodHRwczovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLyAKKyAqIAorICogIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIAorICogCisgKiAgQmFzZWQgb24gaWRlYXMgZnJvbSBYdGV4dCwgWHRlbmQsIFhjb3JlCisgKiAgIAorICogIENvbnRyaWJ1dG9yczogIAorICogIAkJSm9lcmcgUmllZ2VsIC0gSW5pdGlhbCBpbXBsZW1lbnRhdGlvbiAKKyAqICAKKyAqLworcGFja2FnZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmRhdGFpbnRlcmNoYW5nZTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKKworLyoqCisgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+RGF0YSBJbnRlcmNoYW5nZSBFeHBvcnQgRmlsdGVyPC9iPjwvZW0+Jy4KKyAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorICoKKyAqIDxwPgorICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgorICogPC9wPgorICogPHVsPgorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQuZGF0YWludGVyY2hhbmdlLkRhdGFJbnRlcmNoYW5nZUV4cG9ydEZpbHRlciNnZXRDb25kaXRpb24gPGVtPkNvbmRpdGlvbjwvZW0+fTwvbGk+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5kYXRhaW50ZXJjaGFuZ2UuRGF0YUludGVyY2hhbmdlRXhwb3J0RmlsdGVyI2dldEhpZGRlbnByb3BlcnRpZXMgPGVtPkhpZGRlbnByb3BlcnRpZXM8L2VtPn08L2xpPgorICogPC91bD4KKyAqCisgKiBAc2VlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQuZGF0YWludGVyY2hhbmdlLkRhdGFEU0xQYWNrYWdlI2dldERhdGFJbnRlcmNoYW5nZUV4cG9ydEZpbHRlcigpCisgKiBAbW9kZWwKKyAqIEBnZW5lcmF0ZWQKKyAqLworcHVibGljIGludGVyZmFjZSBEYXRhSW50ZXJjaGFuZ2VFeHBvcnRGaWx0ZXIgZXh0ZW5kcyBEYXRhSW50ZXJjaGFuZ2VMYXp5UmVzb2x2ZXIgeworCS8qKgorCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkNvbmRpdGlvbjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPHA+CisJICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+Q29uZGl0aW9uPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBpc24ndCBjbGVhciwKKwkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCisJICogPC9wPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkNvbmRpdGlvbjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCisJICogQHNlZSAjc2V0Q29uZGl0aW9uKERhdGFJbnRlcmNoYW5nZUZpbHRlckNvbmRpdGlvbikKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQuZGF0YWludGVyY2hhbmdlLkRhdGFEU0xQYWNrYWdlI2dldERhdGFJbnRlcmNoYW5nZUV4cG9ydEZpbHRlcl9Db25kaXRpb24oKQorCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJRGF0YUludGVyY2hhbmdlRmlsdGVyQ29uZGl0aW9uIGdldENvbmRpdGlvbigpOworCisJLyoqCisJICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5kYXRhaW50ZXJjaGFuZ2UuRGF0YUludGVyY2hhbmdlRXhwb3J0RmlsdGVyI2dldENvbmRpdGlvbiA8ZW0+Q29uZGl0aW9uPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5Db25kaXRpb248L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgorCSAqIEBzZWUgI2dldENvbmRpdGlvbigpCisJICogQGdlbmVyYXRlZAorCSAqLworCXZvaWQgc2V0Q29uZGl0aW9uKERhdGFJbnRlcmNoYW5nZUZpbHRlckNvbmRpdGlvbiB2YWx1ZSk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5IaWRkZW5wcm9wZXJ0aWVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KKwkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5kYXRhaW50ZXJjaGFuZ2UuRGF0YUludGVyY2hhbmdlRXhwb3J0SGlkZX0uCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8cD4KKwkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5IaWRkZW5wcm9wZXJ0aWVzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAorCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KKwkgKiA8L3A+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+SGlkZGVucHJvcGVydGllczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQuZGF0YWludGVyY2hhbmdlLkRhdGFEU0xQYWNrYWdlI2dldERhdGFJbnRlcmNoYW5nZUV4cG9ydEZpbHRlcl9IaWRkZW5wcm9wZXJ0aWVzKCkKKwkgKiBAbW9kZWwgY29udGFpbm1lbnQ9InRydWUiCisJICogQGdlbmVyYXRlZAorCSAqLworCUVMaXN0PERhdGFJbnRlcmNoYW5nZUV4cG9ydEhpZGU+IGdldEhpZGRlbnByb3BlcnRpZXMoKTsKKworfSAvLyBEYXRhSW50ZXJjaGFuZ2VFeHBvcnRGaWx0ZXIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLm9zYnAueHRleHQuZGF0YWludGVyY2hhbmdlL2VtZi1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9kYXRhaW50ZXJjaGFuZ2UvRGF0YUludGVyY2hhbmdlRXhwb3J0SGlkZS5qYXZhIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5kYXRhaW50ZXJjaGFuZ2UvZW1mLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2RhdGFpbnRlcmNoYW5nZS9EYXRhSW50ZXJjaGFuZ2VFeHBvcnRIaWRlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTk0N2E2NQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQuZGF0YWludGVyY2hhbmdlL2VtZi1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9kYXRhaW50ZXJjaGFuZ2UvRGF0YUludGVyY2hhbmdlRXhwb3J0SGlkZS5qYXZhCkBAIC0wLDAgKzEsNjMgQEAKKy8qKgorICogQ29weXJpZ2h0IChjKSAyMDE0LCBMb2V0eiBHbWJIJkNvLktHIChIZWlkZWxiZXJnKQorICogIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCisgKiAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSAyLjAgIAorICogIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IAorICogIGh0dHBzOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAvIAorICogCisgKiAgU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgCisgKiAKKyAqICBCYXNlZCBvbiBpZGVhcyBmcm9tIFh0ZXh0LCBYdGVuZCwgWGNvcmUKKyAqICAgCisgKiAgQ29udHJpYnV0b3JzOiAgCisgKiAgCQlKb2VyZyBSaWVnZWwgLSBJbml0aWFsIGltcGxlbWVudGF0aW9uIAorICogIAorICovCitwYWNrYWdlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQuZGF0YWludGVyY2hhbmdlOworCitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC5kc2wuc2VtYW50aWMuZW50aXR5LkxFbnRpdHlGZWF0dXJlOworCisvKioKKyAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisgKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5EYXRhIEludGVyY2hhbmdlIEV4cG9ydCBIaWRlPC9iPjwvZW0+Jy4KKyAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorICoKKyAqIDxwPgorICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgorICogPC9wPgorICogPHVsPgorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQuZGF0YWludGVyY2hhbmdlLkRhdGFJbnRlcmNoYW5nZUV4cG9ydEhpZGUjZ2V0UHJvcGVydHkgPGVtPlByb3BlcnR5PC9lbT59PC9saT4KKyAqIDwvdWw+CisgKgorICogQHNlZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmRhdGFpbnRlcmNoYW5nZS5EYXRhRFNMUGFja2FnZSNnZXREYXRhSW50ZXJjaGFuZ2VFeHBvcnRIaWRlKCkKKyAqIEBtb2RlbAorICogQGdlbmVyYXRlZAorICovCitwdWJsaWMgaW50ZXJmYWNlIERhdGFJbnRlcmNoYW5nZUV4cG9ydEhpZGUgZXh0ZW5kcyBEYXRhSW50ZXJjaGFuZ2VMYXp5UmVzb2x2ZXIgeworCS8qKgorCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlByb3BlcnR5PC9iPjwvZW0+JyByZWZlcmVuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8cD4KKwkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5Qcm9wZXJ0eTwvZW0+JyByZWZlcmVuY2UgaXNuJ3QgY2xlYXIsCisJICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgorCSAqIDwvcD4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Qcm9wZXJ0eTwvZW0+JyByZWZlcmVuY2UuCisJICogQHNlZSAjc2V0UHJvcGVydHkoTEVudGl0eUZlYXR1cmUpCisJICogQHNlZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmRhdGFpbnRlcmNoYW5nZS5EYXRhRFNMUGFja2FnZSNnZXREYXRhSW50ZXJjaGFuZ2VFeHBvcnRIaWRlX1Byb3BlcnR5KCkKKwkgKiBAbW9kZWwKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJTEVudGl0eUZlYXR1cmUgZ2V0UHJvcGVydHkoKTsKKworCS8qKgorCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQuZGF0YWludGVyY2hhbmdlLkRhdGFJbnRlcmNoYW5nZUV4cG9ydEhpZGUjZ2V0UHJvcGVydHkgPGVtPlByb3BlcnR5PC9lbT59JyByZWZlcmVuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5Qcm9wZXJ0eTwvZW0+JyByZWZlcmVuY2UuCisJICogQHNlZSAjZ2V0UHJvcGVydHkoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwl2b2lkIHNldFByb3BlcnR5KExFbnRpdHlGZWF0dXJlIHZhbHVlKTsKKworfSAvLyBEYXRhSW50ZXJjaGFuZ2VFeHBvcnRIaWRlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmRhdGFpbnRlcmNoYW5nZS9lbWYtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvZGF0YWludGVyY2hhbmdlL0RhdGFJbnRlcmNoYW5nZUV4cG9zZS5qYXZhIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5kYXRhaW50ZXJjaGFuZ2UvZW1mLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2RhdGFpbnRlcmNoYW5nZS9EYXRhSW50ZXJjaGFuZ2VFeHBvc2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNWY0Njc4Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5kYXRhaW50ZXJjaGFuZ2UvZW1mLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2RhdGFpbnRlcmNoYW5nZS9EYXRhSW50ZXJjaGFuZ2VFeHBvc2UuamF2YQpAQCAtMCwwICsxLDExOCBAQAorLyoqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTQsIExvZXR6IEdtYkgmQ28uS0cgKEhlaWRlbGJlcmcpCisgKiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKKyAqICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIDIuMCAgCisgKiAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgCisgKiAgaHR0cHM6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC8gCisgKiAKKyAqICBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCAKKyAqIAorICogIEJhc2VkIG9uIGlkZWFzIGZyb20gWHRleHQsIFh0ZW5kLCBYY29yZQorICogICAKKyAqICBDb250cmlidXRvcnM6ICAKKyAqICAJCUpvZXJnIFJpZWdlbCAtIEluaXRpYWwgaW1wbGVtZW50YXRpb24gCisgKiAgCisgKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2Uub3NicC54dGV4dC5kYXRhaW50ZXJjaGFuZ2U7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLmRzbC5zZW1hbnRpYy5lbnRpdHkuTEVudGl0eUF0dHJpYnV0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLmRzbC5zZW1hbnRpYy5lbnRpdHkuTEVudGl0eVJlZmVyZW5jZTsKKworLyoqCisgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+RGF0YSBJbnRlcmNoYW5nZSBFeHBvc2U8L2I+PC9lbT4nLgorICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisgKgorICogPHA+CisgKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6CisgKiA8L3A+CisgKiA8dWw+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5kYXRhaW50ZXJjaGFuZ2UuRGF0YUludGVyY2hhbmdlRXhwb3NlI2dldFJlZkVudGl0eSA8ZW0+UmVmIEVudGl0eTwvZW0+fTwvbGk+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5kYXRhaW50ZXJjaGFuZ2UuRGF0YUludGVyY2hhbmdlRXhwb3NlI2dldFJlZlByb3BlcnR5IDxlbT5SZWYgUHJvcGVydHk8L2VtPn08L2xpPgorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQuZGF0YWludGVyY2hhbmdlLkRhdGFJbnRlcmNoYW5nZUV4cG9zZSNnZXRTdWJFeHBvc2UgPGVtPlN1YiBFeHBvc2U8L2VtPn08L2xpPgorICogPC91bD4KKyAqCisgKiBAc2VlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQuZGF0YWludGVyY2hhbmdlLkRhdGFEU0xQYWNrYWdlI2dldERhdGFJbnRlcmNoYW5nZUV4cG9zZSgpCisgKiBAbW9kZWwKKyAqIEBnZW5lcmF0ZWQKKyAqLworcHVibGljIGludGVyZmFjZSBEYXRhSW50ZXJjaGFuZ2VFeHBvc2UgZXh0ZW5kcyBEYXRhSW50ZXJjaGFuZ2VMYXp5UmVzb2x2ZXIgeworCS8qKgorCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlJlZiBFbnRpdHk8L2I+PC9lbT4nIHJlZmVyZW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDxwPgorCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlJlZiBFbnRpdHk8L2VtPicgcmVmZXJlbmNlIGlzbid0IGNsZWFyLAorCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KKwkgKiA8L3A+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+UmVmIEVudGl0eTwvZW0+JyByZWZlcmVuY2UuCisJICogQHNlZSAjc2V0UmVmRW50aXR5KExFbnRpdHlSZWZlcmVuY2UpCisJICogQHNlZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmRhdGFpbnRlcmNoYW5nZS5EYXRhRFNMUGFja2FnZSNnZXREYXRhSW50ZXJjaGFuZ2VFeHBvc2VfUmVmRW50aXR5KCkKKwkgKiBAbW9kZWwKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJTEVudGl0eVJlZmVyZW5jZSBnZXRSZWZFbnRpdHkoKTsKKworCS8qKgorCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQuZGF0YWludGVyY2hhbmdlLkRhdGFJbnRlcmNoYW5nZUV4cG9zZSNnZXRSZWZFbnRpdHkgPGVtPlJlZiBFbnRpdHk8L2VtPn0nIHJlZmVyZW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlJlZiBFbnRpdHk8L2VtPicgcmVmZXJlbmNlLgorCSAqIEBzZWUgI2dldFJlZkVudGl0eSgpCisJICogQGdlbmVyYXRlZAorCSAqLworCXZvaWQgc2V0UmVmRW50aXR5KExFbnRpdHlSZWZlcmVuY2UgdmFsdWUpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+UmVmIFByb3BlcnR5PC9iPjwvZW0+JyByZWZlcmVuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8cD4KKwkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5SZWYgUHJvcGVydHk8L2VtPicgcmVmZXJlbmNlIGlzbid0IGNsZWFyLAorCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KKwkgKiA8L3A+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+UmVmIFByb3BlcnR5PC9lbT4nIHJlZmVyZW5jZS4KKwkgKiBAc2VlICNzZXRSZWZQcm9wZXJ0eShMRW50aXR5QXR0cmlidXRlKQorCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5kYXRhaW50ZXJjaGFuZ2UuRGF0YURTTFBhY2thZ2UjZ2V0RGF0YUludGVyY2hhbmdlRXhwb3NlX1JlZlByb3BlcnR5KCkKKwkgKiBAbW9kZWwKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJTEVudGl0eUF0dHJpYnV0ZSBnZXRSZWZQcm9wZXJ0eSgpOworCisJLyoqCisJICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5kYXRhaW50ZXJjaGFuZ2UuRGF0YUludGVyY2hhbmdlRXhwb3NlI2dldFJlZlByb3BlcnR5IDxlbT5SZWYgUHJvcGVydHk8L2VtPn0nIHJlZmVyZW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlJlZiBQcm9wZXJ0eTwvZW0+JyByZWZlcmVuY2UuCisJICogQHNlZSAjZ2V0UmVmUHJvcGVydHkoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwl2b2lkIHNldFJlZlByb3BlcnR5KExFbnRpdHlBdHRyaWJ1dGUgdmFsdWUpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+U3ViIEV4cG9zZTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPHA+CisJICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+U3ViIEV4cG9zZTwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgaXNuJ3QgY2xlYXIsCisJICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgorCSAqIDwvcD4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5TdWIgRXhwb3NlPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KKwkgKiBAc2VlICNzZXRTdWJFeHBvc2UoRGF0YUludGVyY2hhbmdlRXhwb3NlKQorCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5kYXRhaW50ZXJjaGFuZ2UuRGF0YURTTFBhY2thZ2UjZ2V0RGF0YUludGVyY2hhbmdlRXhwb3NlX1N1YkV4cG9zZSgpCisJICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlEYXRhSW50ZXJjaGFuZ2VFeHBvc2UgZ2V0U3ViRXhwb3NlKCk7CisKKwkvKioKKwkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmRhdGFpbnRlcmNoYW5nZS5EYXRhSW50ZXJjaGFuZ2VFeHBvc2UjZ2V0U3ViRXhwb3NlIDxlbT5TdWIgRXhwb3NlPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5TdWIgRXhwb3NlPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KKwkgKiBAc2VlICNnZXRTdWJFeHBvc2UoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwl2b2lkIHNldFN1YkV4cG9zZShEYXRhSW50ZXJjaGFuZ2VFeHBvc2UgdmFsdWUpOworCit9IC8vIERhdGFJbnRlcmNoYW5nZUV4cG9zZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5kYXRhaW50ZXJjaGFuZ2UvZW1mLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2RhdGFpbnRlcmNoYW5nZS9EYXRhSW50ZXJjaGFuZ2VFeHByZXNzaW9uLmphdmEgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmRhdGFpbnRlcmNoYW5nZS9lbWYtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvZGF0YWludGVyY2hhbmdlL0RhdGFJbnRlcmNoYW5nZUV4cHJlc3Npb24uamF2YQppbmRleCAxMzUwMmI3Li5jODMwMWMzIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmRhdGFpbnRlcmNoYW5nZS9lbWYtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvZGF0YWludGVyY2hhbmdlL0RhdGFJbnRlcmNoYW5nZUV4cHJlc3Npb24uamF2YQorKysgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmRhdGFpbnRlcmNoYW5nZS9lbWYtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvZGF0YWludGVyY2hhbmdlL0RhdGFJbnRlcmNoYW5nZUV4cHJlc3Npb24uamF2YQpAQCAtMSwxMyArMSwxNSBAQAogLyoqCiAgKiBDb3B5cmlnaHQgKGMpIDIwMTQsIExvZXR6IEdtYkgmQ28uS0cgKEhlaWRlbGJlcmcpCiAgKiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgCisgKiAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSAyLjAgIAogICogIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IAotICogIGh0dHB7Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIAorICogIGh0dHBzOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAvIAorICogCisgKiAgU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgCiAgKiAKICAqICBCYXNlZCBvbiBpZGVhcyBmcm9tIFh0ZXh0LCBYdGVuZCwgWGNvcmUKICAqICAgCi0gKiAgQ29udHJpYnV0b3JzeyAgCisgKiAgQ29udHJpYnV0b3JzOiAgCiAgKiAgCQlKb2VyZyBSaWVnZWwgLSBJbml0aWFsIGltcGxlbWVudGF0aW9uIAogICogIAogICovCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmRhdGFpbnRlcmNoYW5nZS9lbWYtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvZGF0YWludGVyY2hhbmdlL0RhdGFJbnRlcmNoYW5nZUZpbGUuamF2YSBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQuZGF0YWludGVyY2hhbmdlL2VtZi1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9kYXRhaW50ZXJjaGFuZ2UvRGF0YUludGVyY2hhbmdlRmlsZS5qYXZhCmluZGV4IDAzNGEzZWEuLmU5YTA5ZTUgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLm9zYnAueHRleHQuZGF0YWludGVyY2hhbmdlL2VtZi1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9kYXRhaW50ZXJjaGFuZ2UvRGF0YUludGVyY2hhbmdlRmlsZS5qYXZhCisrKyBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQuZGF0YWludGVyY2hhbmdlL2VtZi1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9kYXRhaW50ZXJjaGFuZ2UvRGF0YUludGVyY2hhbmdlRmlsZS5qYXZhCkBAIC0xLDEzICsxLDE1IEBACiAvKioKICAqIENvcHlyaWdodCAoYykgMjAxNCwgTG9ldHogR21iSCZDby5LRyAoSGVpZGVsYmVyZykKICAqICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCAKKyAqICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIDIuMCAgCiAgKiAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgCi0gKiAgaHR0cHsvL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwgCisgKiAgaHR0cHM6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC8gCisgKiAKKyAqICBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCAKICAqIAogICogIEJhc2VkIG9uIGlkZWFzIGZyb20gWHRleHQsIFh0ZW5kLCBYY29yZQogICogICAKLSAqICBDb250cmlidXRvcnN7ICAKKyAqICBDb250cmlidXRvcnM6ICAKICAqICAJCUpvZXJnIFJpZWdlbCAtIEluaXRpYWwgaW1wbGVtZW50YXRpb24gCiAgKiAgCiAgKi8KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLm9zYnAueHRleHQuZGF0YWludGVyY2hhbmdlL2VtZi1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9kYXRhaW50ZXJjaGFuZ2UvRGF0YUludGVyY2hhbmdlRmlsZUNTVi5qYXZhIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5kYXRhaW50ZXJjaGFuZ2UvZW1mLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2RhdGFpbnRlcmNoYW5nZS9EYXRhSW50ZXJjaGFuZ2VGaWxlQ1NWLmphdmEKaW5kZXggYjM1NmI4Mi4uNjliMmU2OSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5kYXRhaW50ZXJjaGFuZ2UvZW1mLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2RhdGFpbnRlcmNoYW5nZS9EYXRhSW50ZXJjaGFuZ2VGaWxlQ1NWLmphdmEKKysrIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5kYXRhaW50ZXJjaGFuZ2UvZW1mLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2RhdGFpbnRlcmNoYW5nZS9EYXRhSW50ZXJjaGFuZ2VGaWxlQ1NWLmphdmEKQEAgLTEsMTMgKzEsMTUgQEAKIC8qKgogICogQ29weXJpZ2h0IChjKSAyMDE0LCBMb2V0eiBHbWJIJkNvLktHIChIZWlkZWxiZXJnKQogICogIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIAorICogIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgMi4wICAKICAqICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAKLSAqICBodHRwey8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCAKKyAqICBodHRwczovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLyAKKyAqIAorICogIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIAogICogCiAgKiAgQmFzZWQgb24gaWRlYXMgZnJvbSBYdGV4dCwgWHRlbmQsIFhjb3JlCiAgKiAgIAotICogIENvbnRyaWJ1dG9yc3sgIAorICogIENvbnRyaWJ1dG9yczogIAogICogIAkJSm9lcmcgUmllZ2VsIC0gSW5pdGlhbCBpbXBsZW1lbnRhdGlvbiAKICAqICAKICAqLwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5kYXRhaW50ZXJjaGFuZ2UvZW1mLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2RhdGFpbnRlcmNoYW5nZS9EYXRhSW50ZXJjaGFuZ2VGaWxlRURJLmphdmEgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmRhdGFpbnRlcmNoYW5nZS9lbWYtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvZGF0YWludGVyY2hhbmdlL0RhdGFJbnRlcmNoYW5nZUZpbGVFREkuamF2YQppbmRleCBhMGE2ZTU2Li4wYjZiOWI0IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmRhdGFpbnRlcmNoYW5nZS9lbWYtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvZGF0YWludGVyY2hhbmdlL0RhdGFJbnRlcmNoYW5nZUZpbGVFREkuamF2YQorKysgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmRhdGFpbnRlcmNoYW5nZS9lbWYtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvZGF0YWludGVyY2hhbmdlL0RhdGFJbnRlcmNoYW5nZUZpbGVFREkuamF2YQpAQCAtMSwxMyArMSwxNSBAQAogLyoqCiAgKiBDb3B5cmlnaHQgKGMpIDIwMTQsIExvZXR6IEdtYkgmQ28uS0cgKEhlaWRlbGJlcmcpCiAgKiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgCisgKiAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSAyLjAgIAogICogIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IAotICogIGh0dHB7Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIAorICogIGh0dHBzOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAvIAorICogCisgKiAgU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgCiAgKiAKICAqICBCYXNlZCBvbiBpZGVhcyBmcm9tIFh0ZXh0LCBYdGVuZCwgWGNvcmUKICAqICAgCi0gKiAgQ29udHJpYnV0b3JzeyAgCisgKiAgQ29udHJpYnV0b3JzOiAgCiAgKiAgCQlKb2VyZyBSaWVnZWwgLSBJbml0aWFsIGltcGxlbWVudGF0aW9uIAogICogIAogICovCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmRhdGFpbnRlcmNoYW5nZS9lbWYtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvZGF0YWludGVyY2hhbmdlL0RhdGFJbnRlcmNoYW5nZUZpbGVYTUwuamF2YSBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQuZGF0YWludGVyY2hhbmdlL2VtZi1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9kYXRhaW50ZXJjaGFuZ2UvRGF0YUludGVyY2hhbmdlRmlsZVhNTC5qYXZhCmluZGV4IGYzYjQ4YjUuLmUzM2JjODYgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLm9zYnAueHRleHQuZGF0YWludGVyY2hhbmdlL2VtZi1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9kYXRhaW50ZXJjaGFuZ2UvRGF0YUludGVyY2hhbmdlRmlsZVhNTC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQuZGF0YWludGVyY2hhbmdlL2VtZi1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9kYXRhaW50ZXJjaGFuZ2UvRGF0YUludGVyY2hhbmdlRmlsZVhNTC5qYXZhCkBAIC0xLDEzICsxLDE1IEBACiAvKioKICAqIENvcHlyaWdodCAoYykgMjAxNCwgTG9ldHogR21iSCZDby5LRyAoSGVpZGVsYmVyZykKICAqICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCAKKyAqICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIDIuMCAgCiAgKiAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgCi0gKiAgaHR0cHsvL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwgCisgKiAgaHR0cHM6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC8gCisgKiAKKyAqICBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCAKICAqIAogICogIEJhc2VkIG9uIGlkZWFzIGZyb20gWHRleHQsIFh0ZW5kLCBYY29yZQogICogICAKLSAqICBDb250cmlidXRvcnN7ICAKKyAqICBDb250cmlidXRvcnM6ICAKICAqICAJCUpvZXJnIFJpZWdlbCAtIEluaXRpYWwgaW1wbGVtZW50YXRpb24gCiAgKiAgCiAgKi8KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLm9zYnAueHRleHQuZGF0YWludGVyY2hhbmdlL2VtZi1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9kYXRhaW50ZXJjaGFuZ2UvRGF0YUludGVyY2hhbmdlRmlsdGVyQ29uZGl0aW9uLmphdmEgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmRhdGFpbnRlcmNoYW5nZS9lbWYtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvZGF0YWludGVyY2hhbmdlL0RhdGFJbnRlcmNoYW5nZUZpbHRlckNvbmRpdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmViNDIzMDgKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmRhdGFpbnRlcmNoYW5nZS9lbWYtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvZGF0YWludGVyY2hhbmdlL0RhdGFJbnRlcmNoYW5nZUZpbHRlckNvbmRpdGlvbi5qYXZhCkBAIC0wLDAgKzEsMTc3IEBACisvKioKKyAqIENvcHlyaWdodCAoYykgMjAxNCwgTG9ldHogR21iSCZDby5LRyAoSGVpZGVsYmVyZykKKyAqICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAorICogIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgMi4wICAKKyAqICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAKKyAqICBodHRwczovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLyAKKyAqIAorICogIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIAorICogCisgKiAgQmFzZWQgb24gaWRlYXMgZnJvbSBYdGV4dCwgWHRlbmQsIFhjb3JlCisgKiAgIAorICogIENvbnRyaWJ1dG9yczogIAorICogIAkJSm9lcmcgUmllZ2VsIC0gSW5pdGlhbCBpbXBsZW1lbnRhdGlvbiAKKyAqICAKKyAqLworcGFja2FnZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmRhdGFpbnRlcmNoYW5nZTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAuZHNsLnNlbWFudGljLmVudGl0eS5MRW50aXR5RmVhdHVyZTsKKworLyoqCisgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+RGF0YSBJbnRlcmNoYW5nZSBGaWx0ZXIgQ29uZGl0aW9uPC9iPjwvZW0+Jy4KKyAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorICoKKyAqIDxwPgorICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgorICogPC9wPgorICogPHVsPgorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQuZGF0YWludGVyY2hhbmdlLkRhdGFJbnRlcmNoYW5nZUZpbHRlckNvbmRpdGlvbiNnZXRSZWZQcm9wZXJ0eSA8ZW0+UmVmIFByb3BlcnR5PC9lbT59PC9saT4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmRhdGFpbnRlcmNoYW5nZS5EYXRhSW50ZXJjaGFuZ2VGaWx0ZXJDb25kaXRpb24jZ2V0T3BlcmF0b3IgPGVtPk9wZXJhdG9yPC9lbT59PC9saT4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmRhdGFpbnRlcmNoYW5nZS5EYXRhSW50ZXJjaGFuZ2VGaWx0ZXJDb25kaXRpb24jZ2V0VmFsdWUgPGVtPlZhbHVlPC9lbT59PC9saT4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmRhdGFpbnRlcmNoYW5nZS5EYXRhSW50ZXJjaGFuZ2VGaWx0ZXJDb25kaXRpb24jZ2V0T3BlcmF0b3IyIDxlbT5PcGVyYXRvcjI8L2VtPn08L2xpPgorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQuZGF0YWludGVyY2hhbmdlLkRhdGFJbnRlcmNoYW5nZUZpbHRlckNvbmRpdGlvbiNnZXRTdWJjb25kaXRpb24gPGVtPlN1YmNvbmRpdGlvbjwvZW0+fTwvbGk+CisgKiA8L3VsPgorICoKKyAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5kYXRhaW50ZXJjaGFuZ2UuRGF0YURTTFBhY2thZ2UjZ2V0RGF0YUludGVyY2hhbmdlRmlsdGVyQ29uZGl0aW9uKCkKKyAqIEBtb2RlbAorICogQGdlbmVyYXRlZAorICovCitwdWJsaWMgaW50ZXJmYWNlIERhdGFJbnRlcmNoYW5nZUZpbHRlckNvbmRpdGlvbiBleHRlbmRzIERhdGFJbnRlcmNoYW5nZUxhenlSZXNvbHZlciB7CisJLyoqCisJICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+UmVmIFByb3BlcnR5PC9iPjwvZW0+JyByZWZlcmVuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8cD4KKwkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5SZWYgUHJvcGVydHk8L2VtPicgcmVmZXJlbmNlIGlzbid0IGNsZWFyLAorCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KKwkgKiA8L3A+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+UmVmIFByb3BlcnR5PC9lbT4nIHJlZmVyZW5jZS4KKwkgKiBAc2VlICNzZXRSZWZQcm9wZXJ0eShMRW50aXR5RmVhdHVyZSkKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQuZGF0YWludGVyY2hhbmdlLkRhdGFEU0xQYWNrYWdlI2dldERhdGFJbnRlcmNoYW5nZUZpbHRlckNvbmRpdGlvbl9SZWZQcm9wZXJ0eSgpCisJICogQG1vZGVsCisJICogQGdlbmVyYXRlZAorCSAqLworCUxFbnRpdHlGZWF0dXJlIGdldFJlZlByb3BlcnR5KCk7CisKKwkvKioKKwkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmRhdGFpbnRlcmNoYW5nZS5EYXRhSW50ZXJjaGFuZ2VGaWx0ZXJDb25kaXRpb24jZ2V0UmVmUHJvcGVydHkgPGVtPlJlZiBQcm9wZXJ0eTwvZW0+fScgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+UmVmIFByb3BlcnR5PC9lbT4nIHJlZmVyZW5jZS4KKwkgKiBAc2VlICNnZXRSZWZQcm9wZXJ0eSgpCisJICogQGdlbmVyYXRlZAorCSAqLworCXZvaWQgc2V0UmVmUHJvcGVydHkoTEVudGl0eUZlYXR1cmUgdmFsdWUpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+T3BlcmF0b3I8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiBUaGUgbGl0ZXJhbHMgYXJlIGZyb20gdGhlIGVudW1lcmF0aW9uIHtAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmRhdGFpbnRlcmNoYW5nZS5Db25kaXRpb25BbmRPcGVyYXRvcjF9LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPHA+CisJICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+T3BlcmF0b3I8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAorCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KKwkgKiA8L3A+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+T3BlcmF0b3I8L2VtPicgYXR0cmlidXRlLgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5kYXRhaW50ZXJjaGFuZ2UuQ29uZGl0aW9uQW5kT3BlcmF0b3IxCisJICogQHNlZSAjc2V0T3BlcmF0b3IoQ29uZGl0aW9uQW5kT3BlcmF0b3IxKQorCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5kYXRhaW50ZXJjaGFuZ2UuRGF0YURTTFBhY2thZ2UjZ2V0RGF0YUludGVyY2hhbmdlRmlsdGVyQ29uZGl0aW9uX09wZXJhdG9yKCkKKwkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQ29uZGl0aW9uQW5kT3BlcmF0b3IxIGdldE9wZXJhdG9yKCk7CisKKwkvKioKKwkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmRhdGFpbnRlcmNoYW5nZS5EYXRhSW50ZXJjaGFuZ2VGaWx0ZXJDb25kaXRpb24jZ2V0T3BlcmF0b3IgPGVtPk9wZXJhdG9yPC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5PcGVyYXRvcjwvZW0+JyBhdHRyaWJ1dGUuCisJICogQHNlZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmRhdGFpbnRlcmNoYW5nZS5Db25kaXRpb25BbmRPcGVyYXRvcjEKKwkgKiBAc2VlICNnZXRPcGVyYXRvcigpCisJICogQGdlbmVyYXRlZAorCSAqLworCXZvaWQgc2V0T3BlcmF0b3IoQ29uZGl0aW9uQW5kT3BlcmF0b3IxIHZhbHVlKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlZhbHVlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8cD4KKwkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5WYWx1ZTwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCisJICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgorCSAqIDwvcD4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5WYWx1ZTwvZW0+JyBhdHRyaWJ1dGUuCisJICogQHNlZSAjc2V0VmFsdWUoU3RyaW5nKQorCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5kYXRhaW50ZXJjaGFuZ2UuRGF0YURTTFBhY2thZ2UjZ2V0RGF0YUludGVyY2hhbmdlRmlsdGVyQ29uZGl0aW9uX1ZhbHVlKCkKKwkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJU3RyaW5nIGdldFZhbHVlKCk7CisKKwkvKioKKwkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmRhdGFpbnRlcmNoYW5nZS5EYXRhSW50ZXJjaGFuZ2VGaWx0ZXJDb25kaXRpb24jZ2V0VmFsdWUgPGVtPlZhbHVlPC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5WYWx1ZTwvZW0+JyBhdHRyaWJ1dGUuCisJICogQHNlZSAjZ2V0VmFsdWUoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwl2b2lkIHNldFZhbHVlKFN0cmluZyB2YWx1ZSk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5PcGVyYXRvcjI8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiBUaGUgbGl0ZXJhbHMgYXJlIGZyb20gdGhlIGVudW1lcmF0aW9uIHtAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmRhdGFpbnRlcmNoYW5nZS5Db25kaXRpb25BbmRPcGVyYXRvcjJ9LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPHA+CisJICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+T3BlcmF0b3IyPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKKwkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCisJICogPC9wPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPk9wZXJhdG9yMjwvZW0+JyBhdHRyaWJ1dGUuCisJICogQHNlZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmRhdGFpbnRlcmNoYW5nZS5Db25kaXRpb25BbmRPcGVyYXRvcjIKKwkgKiBAc2VlICNzZXRPcGVyYXRvcjIoQ29uZGl0aW9uQW5kT3BlcmF0b3IyKQorCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5kYXRhaW50ZXJjaGFuZ2UuRGF0YURTTFBhY2thZ2UjZ2V0RGF0YUludGVyY2hhbmdlRmlsdGVyQ29uZGl0aW9uX09wZXJhdG9yMigpCisJICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiCisJICogQGdlbmVyYXRlZAorCSAqLworCUNvbmRpdGlvbkFuZE9wZXJhdG9yMiBnZXRPcGVyYXRvcjIoKTsKKworCS8qKgorCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQuZGF0YWludGVyY2hhbmdlLkRhdGFJbnRlcmNoYW5nZUZpbHRlckNvbmRpdGlvbiNnZXRPcGVyYXRvcjIgPGVtPk9wZXJhdG9yMjwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+T3BlcmF0b3IyPC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQuZGF0YWludGVyY2hhbmdlLkNvbmRpdGlvbkFuZE9wZXJhdG9yMgorCSAqIEBzZWUgI2dldE9wZXJhdG9yMigpCisJICogQGdlbmVyYXRlZAorCSAqLworCXZvaWQgc2V0T3BlcmF0b3IyKENvbmRpdGlvbkFuZE9wZXJhdG9yMiB2YWx1ZSk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5TdWJjb25kaXRpb248L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDxwPgorCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlN1YmNvbmRpdGlvbjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgaXNuJ3QgY2xlYXIsCisJICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgorCSAqIDwvcD4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5TdWJjb25kaXRpb248L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgorCSAqIEBzZWUgI3NldFN1YmNvbmRpdGlvbihEYXRhSW50ZXJjaGFuZ2VGaWx0ZXJDb25kaXRpb24pCisJICogQHNlZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmRhdGFpbnRlcmNoYW5nZS5EYXRhRFNMUGFja2FnZSNnZXREYXRhSW50ZXJjaGFuZ2VGaWx0ZXJDb25kaXRpb25fU3ViY29uZGl0aW9uKCkKKwkgKiBAbW9kZWwgY29udGFpbm1lbnQ9InRydWUiCisJICogQGdlbmVyYXRlZAorCSAqLworCURhdGFJbnRlcmNoYW5nZUZpbHRlckNvbmRpdGlvbiBnZXRTdWJjb25kaXRpb24oKTsKKworCS8qKgorCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQuZGF0YWludGVyY2hhbmdlLkRhdGFJbnRlcmNoYW5nZUZpbHRlckNvbmRpdGlvbiNnZXRTdWJjb25kaXRpb24gPGVtPlN1YmNvbmRpdGlvbjwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+U3ViY29uZGl0aW9uPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KKwkgKiBAc2VlICNnZXRTdWJjb25kaXRpb24oKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwl2b2lkIHNldFN1YmNvbmRpdGlvbihEYXRhSW50ZXJjaGFuZ2VGaWx0ZXJDb25kaXRpb24gdmFsdWUpOworCit9IC8vIERhdGFJbnRlcmNoYW5nZUZpbHRlckNvbmRpdGlvbgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5kYXRhaW50ZXJjaGFuZ2UvZW1mLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2RhdGFpbnRlcmNoYW5nZS9EYXRhSW50ZXJjaGFuZ2VGb3JtYXQuamF2YSBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQuZGF0YWludGVyY2hhbmdlL2VtZi1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9kYXRhaW50ZXJjaGFuZ2UvRGF0YUludGVyY2hhbmdlRm9ybWF0LmphdmEKaW5kZXggMmFiMDM0YS4uYjQ0ODc4YiAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5kYXRhaW50ZXJjaGFuZ2UvZW1mLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2RhdGFpbnRlcmNoYW5nZS9EYXRhSW50ZXJjaGFuZ2VGb3JtYXQuamF2YQorKysgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmRhdGFpbnRlcmNoYW5nZS9lbWYtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvZGF0YWludGVyY2hhbmdlL0RhdGFJbnRlcmNoYW5nZUZvcm1hdC5qYXZhCkBAIC0xLDEzICsxLDE1IEBACiAvKioKICAqIENvcHlyaWdodCAoYykgMjAxNCwgTG9ldHogR21iSCZDby5LRyAoSGVpZGVsYmVyZykKICAqICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCAKKyAqICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIDIuMCAgCiAgKiAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgCi0gKiAgaHR0cHsvL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwgCisgKiAgaHR0cHM6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC8gCisgKiAKKyAqICBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCAKICAqIAogICogIEJhc2VkIG9uIGlkZWFzIGZyb20gWHRleHQsIFh0ZW5kLCBYY29yZQogICogICAKLSAqICBDb250cmlidXRvcnN7ICAKKyAqICBDb250cmlidXRvcnM6ICAKICAqICAJCUpvZXJnIFJpZWdlbCAtIEluaXRpYWwgaW1wbGVtZW50YXRpb24gCiAgKiAgCiAgKi8KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLm9zYnAueHRleHQuZGF0YWludGVyY2hhbmdlL2VtZi1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9kYXRhaW50ZXJjaGFuZ2UvRGF0YUludGVyY2hhbmdlS2V5LmphdmEgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmRhdGFpbnRlcmNoYW5nZS9lbWYtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvZGF0YWludGVyY2hhbmdlL0RhdGFJbnRlcmNoYW5nZUtleS5qYXZhCmluZGV4IDNkNDUyMmYuLmE0ODk0OGEgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLm9zYnAueHRleHQuZGF0YWludGVyY2hhbmdlL2VtZi1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9kYXRhaW50ZXJjaGFuZ2UvRGF0YUludGVyY2hhbmdlS2V5LmphdmEKKysrIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5kYXRhaW50ZXJjaGFuZ2UvZW1mLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2RhdGFpbnRlcmNoYW5nZS9EYXRhSW50ZXJjaGFuZ2VLZXkuamF2YQpAQCAtMSwxMyArMSwxNSBAQAogLyoqCiAgKiBDb3B5cmlnaHQgKGMpIDIwMTQsIExvZXR6IEdtYkgmQ28uS0cgKEhlaWRlbGJlcmcpCiAgKiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgCisgKiAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSAyLjAgIAogICogIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IAotICogIGh0dHB7Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIAorICogIGh0dHBzOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAvIAorICogCisgKiAgU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgCiAgKiAKICAqICBCYXNlZCBvbiBpZGVhcyBmcm9tIFh0ZXh0LCBYdGVuZCwgWGNvcmUKICAqICAgCi0gKiAgQ29udHJpYnV0b3JzeyAgCisgKiAgQ29udHJpYnV0b3JzOiAgCiAgKiAgCQlKb2VyZyBSaWVnZWwgLSBJbml0aWFsIGltcGxlbWVudGF0aW9uIAogICogIAogICovCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmRhdGFpbnRlcmNoYW5nZS9lbWYtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvZGF0YWludGVyY2hhbmdlL0RhdGFJbnRlcmNoYW5nZUxhenlSZXNvbHZlci5qYXZhIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5kYXRhaW50ZXJjaGFuZ2UvZW1mLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2RhdGFpbnRlcmNoYW5nZS9EYXRhSW50ZXJjaGFuZ2VMYXp5UmVzb2x2ZXIuamF2YQppbmRleCA5YWY4NzExLi45MmQ2NzU4IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmRhdGFpbnRlcmNoYW5nZS9lbWYtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvZGF0YWludGVyY2hhbmdlL0RhdGFJbnRlcmNoYW5nZUxhenlSZXNvbHZlci5qYXZhCisrKyBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQuZGF0YWludGVyY2hhbmdlL2VtZi1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9kYXRhaW50ZXJjaGFuZ2UvRGF0YUludGVyY2hhbmdlTGF6eVJlc29sdmVyLmphdmEKQEAgLTEsMTMgKzEsMTUgQEAKIC8qKgogICogQ29weXJpZ2h0IChjKSAyMDE0LCBMb2V0eiBHbWJIJkNvLktHIChIZWlkZWxiZXJnKQogICogIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIAorICogIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgMi4wICAKICAqICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAKLSAqICBodHRwey8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCAKKyAqICBodHRwczovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLyAKKyAqIAorICogIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIAogICogCiAgKiAgQmFzZWQgb24gaWRlYXMgZnJvbSBYdGV4dCwgWHRlbmQsIFhjb3JlCiAgKiAgIAotICogIENvbnRyaWJ1dG9yc3sgIAorICogIENvbnRyaWJ1dG9yczogIAogICogIAkJSm9lcmcgUmllZ2VsIC0gSW5pdGlhbCBpbXBsZW1lbnRhdGlvbiAKICAqICAKICAqLwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5kYXRhaW50ZXJjaGFuZ2UvZW1mLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2RhdGFpbnRlcmNoYW5nZS9EYXRhSW50ZXJjaGFuZ2VMb29rdXAuamF2YSBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQuZGF0YWludGVyY2hhbmdlL2VtZi1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9kYXRhaW50ZXJjaGFuZ2UvRGF0YUludGVyY2hhbmdlTG9va3VwLmphdmEKaW5kZXggYzMzYTUyNC4uNGZmNmI1ZSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5kYXRhaW50ZXJjaGFuZ2UvZW1mLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2RhdGFpbnRlcmNoYW5nZS9EYXRhSW50ZXJjaGFuZ2VMb29rdXAuamF2YQorKysgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmRhdGFpbnRlcmNoYW5nZS9lbWYtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvZGF0YWludGVyY2hhbmdlL0RhdGFJbnRlcmNoYW5nZUxvb2t1cC5qYXZhCkBAIC0xLDEzICsxLDE1IEBACiAvKioKICAqIENvcHlyaWdodCAoYykgMjAxNCwgTG9ldHogR21iSCZDby5LRyAoSGVpZGVsYmVyZykKICAqICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCAKKyAqICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIDIuMCAgCiAgKiAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgCi0gKiAgaHR0cHsvL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwgCisgKiAgaHR0cHM6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC8gCisgKiAKKyAqICBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCAKICAqIAogICogIEJhc2VkIG9uIGlkZWFzIGZyb20gWHRleHQsIFh0ZW5kLCBYY29yZQogICogICAKLSAqICBDb250cmlidXRvcnN7ICAKKyAqICBDb250cmlidXRvcnM6ICAKICAqICAJCUpvZXJnIFJpZWdlbCAtIEluaXRpYWwgaW1wbGVtZW50YXRpb24gCiAgKiAgCiAgKi8KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLm9zYnAueHRleHQuZGF0YWludGVyY2hhbmdlL2VtZi1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9kYXRhaW50ZXJjaGFuZ2UvRGF0YUludGVyY2hhbmdlTWFwcGluZy5qYXZhIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5kYXRhaW50ZXJjaGFuZ2UvZW1mLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2RhdGFpbnRlcmNoYW5nZS9EYXRhSW50ZXJjaGFuZ2VNYXBwaW5nLmphdmEKaW5kZXggMDEwODVlNS4uMzJlZDRlNCAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5kYXRhaW50ZXJjaGFuZ2UvZW1mLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2RhdGFpbnRlcmNoYW5nZS9EYXRhSW50ZXJjaGFuZ2VNYXBwaW5nLmphdmEKKysrIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5kYXRhaW50ZXJjaGFuZ2UvZW1mLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2RhdGFpbnRlcmNoYW5nZS9EYXRhSW50ZXJjaGFuZ2VNYXBwaW5nLmphdmEKQEAgLTEsMTMgKzEsMTUgQEAKIC8qKgogICogQ29weXJpZ2h0IChjKSAyMDE0LCBMb2V0eiBHbWJIJkNvLktHIChIZWlkZWxiZXJnKQogICogIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIAorICogIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgMi4wICAKICAqICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAKLSAqICBodHRwey8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCAKKyAqICBodHRwczovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLyAKKyAqIAorICogIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIAogICogCiAgKiAgQmFzZWQgb24gaWRlYXMgZnJvbSBYdGV4dCwgWHRlbmQsIFhjb3JlCiAgKiAgIAotICogIENvbnRyaWJ1dG9yc3sgIAorICogIENvbnRyaWJ1dG9yczogIAogICogIAkJSm9lcmcgUmllZ2VsIC0gSW5pdGlhbCBpbXBsZW1lbnRhdGlvbiAKICAqICAKICAqLwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5kYXRhaW50ZXJjaGFuZ2UvZW1mLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2RhdGFpbnRlcmNoYW5nZS9EYXRhSW50ZXJjaGFuZ2VNYXJrZXJFbnRpdHkuamF2YSBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQuZGF0YWludGVyY2hhbmdlL2VtZi1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9kYXRhaW50ZXJjaGFuZ2UvRGF0YUludGVyY2hhbmdlTWFya2VyRW50aXR5LmphdmEKaW5kZXggMzg0YjUzNC4uMmMxYzhkMSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5kYXRhaW50ZXJjaGFuZ2UvZW1mLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2RhdGFpbnRlcmNoYW5nZS9EYXRhSW50ZXJjaGFuZ2VNYXJrZXJFbnRpdHkuamF2YQorKysgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmRhdGFpbnRlcmNoYW5nZS9lbWYtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvZGF0YWludGVyY2hhbmdlL0RhdGFJbnRlcmNoYW5nZU1hcmtlckVudGl0eS5qYXZhCkBAIC0xLDEzICsxLDE1IEBACiAvKioKICAqIENvcHlyaWdodCAoYykgMjAxNCwgTG9ldHogR21iSCZDby5LRyAoSGVpZGVsYmVyZykKICAqICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCAKKyAqICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIDIuMCAgCiAgKiAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgCi0gKiAgaHR0cHsvL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwgCisgKiAgaHR0cHM6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC8gCisgKiAKKyAqICBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCAKICAqIAogICogIEJhc2VkIG9uIGlkZWFzIGZyb20gWHRleHQsIFh0ZW5kLCBYY29yZQogICogICAKLSAqICBDb250cmlidXRvcnN7ICAKKyAqICBDb250cmlidXRvcnM6ICAKICAqICAJCUpvZXJnIFJpZWdlbCAtIEluaXRpYWwgaW1wbGVtZW50YXRpb24gCiAgKiAgCiAgKi8KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLm9zYnAueHRleHQuZGF0YWludGVyY2hhbmdlL2VtZi1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9kYXRhaW50ZXJjaGFuZ2UvRGF0YUludGVyY2hhbmdlTWFya2VyUGF0aC5qYXZhIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5kYXRhaW50ZXJjaGFuZ2UvZW1mLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2RhdGFpbnRlcmNoYW5nZS9EYXRhSW50ZXJjaGFuZ2VNYXJrZXJQYXRoLmphdmEKaW5kZXggOGNiOTc4OS4uNzFlMGYxZSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5kYXRhaW50ZXJjaGFuZ2UvZW1mLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2RhdGFpbnRlcmNoYW5nZS9EYXRhSW50ZXJjaGFuZ2VNYXJrZXJQYXRoLmphdmEKKysrIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5kYXRhaW50ZXJjaGFuZ2UvZW1mLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2RhdGFpbnRlcmNoYW5nZS9EYXRhSW50ZXJjaGFuZ2VNYXJrZXJQYXRoLmphdmEKQEAgLTEsMTMgKzEsMTUgQEAKIC8qKgogICogQ29weXJpZ2h0IChjKSAyMDE0LCBMb2V0eiBHbWJIJkNvLktHIChIZWlkZWxiZXJnKQogICogIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIAorICogIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgMi4wICAKICAqICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAKLSAqICBodHRwey8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCAKKyAqICBodHRwczovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLyAKKyAqIAorICogIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIAogICogCiAgKiAgQmFzZWQgb24gaWRlYXMgZnJvbSBYdGV4dCwgWHRlbmQsIFhjb3JlCiAgKiAgIAotICogIENvbnRyaWJ1dG9yc3sgIAorICogIENvbnRyaWJ1dG9yczogIAogICogIAkJSm9lcmcgUmllZ2VsIC0gSW5pdGlhbCBpbXBsZW1lbnRhdGlvbiAKICAqICAKICAqLwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5kYXRhaW50ZXJjaGFuZ2UvZW1mLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2RhdGFpbnRlcmNoYW5nZS9EYXRhSW50ZXJjaGFuZ2VNb2RlbC5qYXZhIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5kYXRhaW50ZXJjaGFuZ2UvZW1mLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2RhdGFpbnRlcmNoYW5nZS9EYXRhSW50ZXJjaGFuZ2VNb2RlbC5qYXZhCmluZGV4IDNiODFmMTkuLjEyNWZjNWYgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLm9zYnAueHRleHQuZGF0YWludGVyY2hhbmdlL2VtZi1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9kYXRhaW50ZXJjaGFuZ2UvRGF0YUludGVyY2hhbmdlTW9kZWwuamF2YQorKysgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmRhdGFpbnRlcmNoYW5nZS9lbWYtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvZGF0YWludGVyY2hhbmdlL0RhdGFJbnRlcmNoYW5nZU1vZGVsLmphdmEKQEAgLTEsMTMgKzEsMTUgQEAKIC8qKgogICogQ29weXJpZ2h0IChjKSAyMDE0LCBMb2V0eiBHbWJIJkNvLktHIChIZWlkZWxiZXJnKQogICogIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIAorICogIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgMi4wICAKICAqICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAKLSAqICBodHRwey8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCAKKyAqICBodHRwczovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLyAKKyAqIAorICogIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIAogICogCiAgKiAgQmFzZWQgb24gaWRlYXMgZnJvbSBYdGV4dCwgWHRlbmQsIFhjb3JlCiAgKiAgIAotICogIENvbnRyaWJ1dG9yc3sgIAorICogIENvbnRyaWJ1dG9yczogIAogICogIAkJSm9lcmcgUmllZ2VsIC0gSW5pdGlhbCBpbXBsZW1lbnRhdGlvbiAKICAqICAKICAqLwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5kYXRhaW50ZXJjaGFuZ2UvZW1mLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2RhdGFpbnRlcmNoYW5nZS9EYXRhSW50ZXJjaGFuZ2VQYWNrYWdlLmphdmEgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmRhdGFpbnRlcmNoYW5nZS9lbWYtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvZGF0YWludGVyY2hhbmdlL0RhdGFJbnRlcmNoYW5nZVBhY2thZ2UuamF2YQppbmRleCAzZTA5ZmU5Li5jM2UwZjhhIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmRhdGFpbnRlcmNoYW5nZS9lbWYtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvZGF0YWludGVyY2hhbmdlL0RhdGFJbnRlcmNoYW5nZVBhY2thZ2UuamF2YQorKysgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmRhdGFpbnRlcmNoYW5nZS9lbWYtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvZGF0YWludGVyY2hhbmdlL0RhdGFJbnRlcmNoYW5nZVBhY2thZ2UuamF2YQpAQCAtMSwxMyArMSwxNSBAQAogLyoqCiAgKiBDb3B5cmlnaHQgKGMpIDIwMTQsIExvZXR6IEdtYkgmQ28uS0cgKEhlaWRlbGJlcmcpCiAgKiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgCisgKiAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSAyLjAgIAogICogIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IAotICogIGh0dHB7Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIAorICogIGh0dHBzOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAvIAorICogCisgKiAgU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgCiAgKiAKICAqICBCYXNlZCBvbiBpZGVhcyBmcm9tIFh0ZXh0LCBYdGVuZCwgWGNvcmUKICAqICAgCi0gKiAgQ29udHJpYnV0b3JzeyAgCisgKiAgQ29udHJpYnV0b3JzOiAgCiAgKiAgCQlKb2VyZyBSaWVnZWwgLSBJbml0aWFsIGltcGxlbWVudGF0aW9uIAogICogIAogICovCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmRhdGFpbnRlcmNoYW5nZS9lbWYtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvZGF0YWludGVyY2hhbmdlL0RhdGFJbnRlcmNoYW5nZVByZWRlZmluZWRFeHByZXNzaW9uLmphdmEgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmRhdGFpbnRlcmNoYW5nZS9lbWYtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvZGF0YWludGVyY2hhbmdlL0RhdGFJbnRlcmNoYW5nZVByZWRlZmluZWRFeHByZXNzaW9uLmphdmEKaW5kZXggYmZlMGEzZC4uOTc0NDIxMSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5kYXRhaW50ZXJjaGFuZ2UvZW1mLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2RhdGFpbnRlcmNoYW5nZS9EYXRhSW50ZXJjaGFuZ2VQcmVkZWZpbmVkRXhwcmVzc2lvbi5qYXZhCisrKyBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQuZGF0YWludGVyY2hhbmdlL2VtZi1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9kYXRhaW50ZXJjaGFuZ2UvRGF0YUludGVyY2hhbmdlUHJlZGVmaW5lZEV4cHJlc3Npb24uamF2YQpAQCAtMSwxMyArMSwxNSBAQAogLyoqCiAgKiBDb3B5cmlnaHQgKGMpIDIwMTQsIExvZXR6IEdtYkgmQ28uS0cgKEhlaWRlbGJlcmcpCiAgKiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgCisgKiAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSAyLjAgIAogICogIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IAotICogIGh0dHB7Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIAorICogIGh0dHBzOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAvIAorICogCisgKiAgU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgCiAgKiAKICAqICBCYXNlZCBvbiBpZGVhcyBmcm9tIFh0ZXh0LCBYdGVuZCwgWGNvcmUKICAqICAgCi0gKiAgQ29udHJpYnV0b3JzeyAgCisgKiAgQ29udHJpYnV0b3JzOiAgCiAgKiAgCQlKb2VyZyBSaWVnZWwgLSBJbml0aWFsIGltcGxlbWVudGF0aW9uIAogICogIAogICovCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmRhdGFpbnRlcmNoYW5nZS9lbWYtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvZGF0YWludGVyY2hhbmdlL0RhdGFJbnRlcmNoYW5nZVZhbHVlTWFwcGluZy5qYXZhIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5kYXRhaW50ZXJjaGFuZ2UvZW1mLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2RhdGFpbnRlcmNoYW5nZS9EYXRhSW50ZXJjaGFuZ2VWYWx1ZU1hcHBpbmcuamF2YQppbmRleCBiODVjNDVlLi5kNjI0MWJhIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmRhdGFpbnRlcmNoYW5nZS9lbWYtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvZGF0YWludGVyY2hhbmdlL0RhdGFJbnRlcmNoYW5nZVZhbHVlTWFwcGluZy5qYXZhCisrKyBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQuZGF0YWludGVyY2hhbmdlL2VtZi1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9kYXRhaW50ZXJjaGFuZ2UvRGF0YUludGVyY2hhbmdlVmFsdWVNYXBwaW5nLmphdmEKQEAgLTEsMTMgKzEsMTUgQEAKIC8qKgogICogQ29weXJpZ2h0IChjKSAyMDE0LCBMb2V0eiBHbWJIJkNvLktHIChIZWlkZWxiZXJnKQogICogIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIAorICogIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgMi4wICAKICAqICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAKLSAqICBodHRwey8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCAKKyAqICBodHRwczovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLyAKKyAqIAorICogIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIAogICogCiAgKiAgQmFzZWQgb24gaWRlYXMgZnJvbSBYdGV4dCwgWHRlbmQsIFhjb3JlCiAgKiAgIAotICogIENvbnRyaWJ1dG9yc3sgIAorICogIENvbnRyaWJ1dG9yczogIAogICogIAkJSm9lcmcgUmllZ2VsIC0gSW5pdGlhbCBpbXBsZW1lbnRhdGlvbiAKICAqICAKICAqLwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5kYXRhaW50ZXJjaGFuZ2UvZW1mLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2RhdGFpbnRlcmNoYW5nZS9FbnRpdHlNYW5hZ2VyTW9kZS5qYXZhIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5kYXRhaW50ZXJjaGFuZ2UvZW1mLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2RhdGFpbnRlcmNoYW5nZS9FbnRpdHlNYW5hZ2VyTW9kZS5qYXZhCmluZGV4IGQxODFmZmEuLjU4ZWNiNTQgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLm9zYnAueHRleHQuZGF0YWludGVyY2hhbmdlL2VtZi1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9kYXRhaW50ZXJjaGFuZ2UvRW50aXR5TWFuYWdlck1vZGUuamF2YQorKysgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmRhdGFpbnRlcmNoYW5nZS9lbWYtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvZGF0YWludGVyY2hhbmdlL0VudGl0eU1hbmFnZXJNb2RlLmphdmEKQEAgLTEsMTMgKzEsMTUgQEAKIC8qKgogICogQ29weXJpZ2h0IChjKSAyMDE0LCBMb2V0eiBHbWJIJkNvLktHIChIZWlkZWxiZXJnKQogICogIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIAorICogIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgMi4wICAKICAqICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAKLSAqICBodHRwey8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCAKKyAqICBodHRwczovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLyAKKyAqIAorICogIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIAogICogCiAgKiAgQmFzZWQgb24gaWRlYXMgZnJvbSBYdGV4dCwgWHRlbmQsIFhjb3JlCiAgKiAgIAotICogIENvbnRyaWJ1dG9yc3sgIAorICogIENvbnRyaWJ1dG9yczogIAogICogIAkJSm9lcmcgUmllZ2VsIC0gSW5pdGlhbCBpbXBsZW1lbnRhdGlvbiAKICAqICAKICAqLwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5kYXRhaW50ZXJjaGFuZ2UvZW1mLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2RhdGFpbnRlcmNoYW5nZS9QcmVkZWZpbmVkQmVhbkVudW0uamF2YSBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQuZGF0YWludGVyY2hhbmdlL2VtZi1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9kYXRhaW50ZXJjaGFuZ2UvUHJlZGVmaW5lZEJlYW5FbnVtLmphdmEKaW5kZXggNjk1MWIxOS4uMDQzNjBhYSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5kYXRhaW50ZXJjaGFuZ2UvZW1mLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2RhdGFpbnRlcmNoYW5nZS9QcmVkZWZpbmVkQmVhbkVudW0uamF2YQorKysgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmRhdGFpbnRlcmNoYW5nZS9lbWYtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvZGF0YWludGVyY2hhbmdlL1ByZWRlZmluZWRCZWFuRW51bS5qYXZhCkBAIC0xLDEzICsxLDE1IEBACiAvKioKICAqIENvcHlyaWdodCAoYykgMjAxNCwgTG9ldHogR21iSCZDby5LRyAoSGVpZGVsYmVyZykKICAqICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCAKKyAqICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIDIuMCAgCiAgKiAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgCi0gKiAgaHR0cHsvL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwgCisgKiAgaHR0cHM6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC8gCisgKiAKKyAqICBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCAKICAqIAogICogIEJhc2VkIG9uIGlkZWFzIGZyb20gWHRleHQsIFh0ZW5kLCBYY29yZQogICogICAKLSAqICBDb250cmlidXRvcnN7ICAKKyAqICBDb250cmlidXRvcnM6ICAKICAqICAJCUpvZXJnIFJpZWdlbCAtIEluaXRpYWwgaW1wbGVtZW50YXRpb24gCiAgKiAgCiAgKi8KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLm9zYnAueHRleHQuZGF0YWludGVyY2hhbmdlL2VtZi1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9kYXRhaW50ZXJjaGFuZ2UvUHJlZGVmaW5lZEJlYW5UeXBlRW51bS5qYXZhIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5kYXRhaW50ZXJjaGFuZ2UvZW1mLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2RhdGFpbnRlcmNoYW5nZS9QcmVkZWZpbmVkQmVhblR5cGVFbnVtLmphdmEKaW5kZXggOWJkYWE5My4uZmM3N2E0YSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5kYXRhaW50ZXJjaGFuZ2UvZW1mLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2RhdGFpbnRlcmNoYW5nZS9QcmVkZWZpbmVkQmVhblR5cGVFbnVtLmphdmEKKysrIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5kYXRhaW50ZXJjaGFuZ2UvZW1mLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2RhdGFpbnRlcmNoYW5nZS9QcmVkZWZpbmVkQmVhblR5cGVFbnVtLmphdmEKQEAgLTEsMTMgKzEsMTUgQEAKIC8qKgogICogQ29weXJpZ2h0IChjKSAyMDE0LCBMb2V0eiBHbWJIJkNvLktHIChIZWlkZWxiZXJnKQogICogIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIAorICogIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgMi4wICAKICAqICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAKLSAqICBodHRwey8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCAKKyAqICBodHRwczovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLyAKKyAqIAorICogIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIAogICogCiAgKiAgQmFzZWQgb24gaWRlYXMgZnJvbSBYdGV4dCwgWHRlbmQsIFhjb3JlCiAgKiAgIAotICogIENvbnRyaWJ1dG9yc3sgIAorICogIENvbnRyaWJ1dG9yczogIAogICogIAkJSm9lcmcgUmllZ2VsIC0gSW5pdGlhbCBpbXBsZW1lbnRhdGlvbiAKICAqICAKICAqLwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5kYXRhaW50ZXJjaGFuZ2UvZW1mLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2RhdGFpbnRlcmNoYW5nZS9QcmVkZWZpbmVkQmxvYk1pbWVUeXBlRW51bS5qYXZhIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5kYXRhaW50ZXJjaGFuZ2UvZW1mLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2RhdGFpbnRlcmNoYW5nZS9QcmVkZWZpbmVkQmxvYk1pbWVUeXBlRW51bS5qYXZhCmluZGV4IGVlYzk0YzQuLmI2YTZiMzYgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLm9zYnAueHRleHQuZGF0YWludGVyY2hhbmdlL2VtZi1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9kYXRhaW50ZXJjaGFuZ2UvUHJlZGVmaW5lZEJsb2JNaW1lVHlwZUVudW0uamF2YQorKysgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmRhdGFpbnRlcmNoYW5nZS9lbWYtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvZGF0YWludGVyY2hhbmdlL1ByZWRlZmluZWRCbG9iTWltZVR5cGVFbnVtLmphdmEKQEAgLTEsMTMgKzEsMTUgQEAKIC8qKgogICogQ29weXJpZ2h0IChjKSAyMDE0LCBMb2V0eiBHbWJIJkNvLktHIChIZWlkZWxiZXJnKQogICogIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIAorICogIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgMi4wICAKICAqICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAKLSAqICBodHRwey8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCAKKyAqICBodHRwczovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLyAKKyAqIAorICogIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIAogICogCiAgKiAgQmFzZWQgb24gaWRlYXMgZnJvbSBYdGV4dCwgWHRlbmQsIFhjb3JlCiAgKiAgIAotICogIENvbnRyaWJ1dG9yc3sgIAorICogIENvbnRyaWJ1dG9yczogIAogICogIAkJSm9lcmcgUmllZ2VsIC0gSW5pdGlhbCBpbXBsZW1lbnRhdGlvbiAKICAqICAKICAqLwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5kYXRhaW50ZXJjaGFuZ2UvZW1mLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2RhdGFpbnRlcmNoYW5nZS9pbXBsL0RhdGFEU0xGYWN0b3J5SW1wbC5qYXZhIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5kYXRhaW50ZXJjaGFuZ2UvZW1mLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2RhdGFpbnRlcmNoYW5nZS9pbXBsL0RhdGFEU0xGYWN0b3J5SW1wbC5qYXZhCmluZGV4IDc3NDY3YmMuLjAwNmUxMzYgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLm9zYnAueHRleHQuZGF0YWludGVyY2hhbmdlL2VtZi1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9kYXRhaW50ZXJjaGFuZ2UvaW1wbC9EYXRhRFNMRmFjdG9yeUltcGwuamF2YQorKysgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmRhdGFpbnRlcmNoYW5nZS9lbWYtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvZGF0YWludGVyY2hhbmdlL2ltcGwvRGF0YURTTEZhY3RvcnlJbXBsLmphdmEKQEAgLTEsMTMgKzEsMTUgQEAKIC8qKgogICogQ29weXJpZ2h0IChjKSAyMDE0LCBMb2V0eiBHbWJIJkNvLktHIChIZWlkZWxiZXJnKQogICogIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIAorICogIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgMi4wICAKICAqICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAKLSAqICBodHRwey8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCAKKyAqICBodHRwczovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLyAKKyAqIAorICogIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIAogICogCiAgKiAgQmFzZWQgb24gaWRlYXMgZnJvbSBYdGV4dCwgWHRlbmQsIFhjb3JlCiAgKiAgIAotICogIENvbnRyaWJ1dG9yc3sgIAorICogIENvbnRyaWJ1dG9yczogIAogICogIAkJSm9lcmcgUmllZ2VsIC0gSW5pdGlhbCBpbXBsZW1lbnRhdGlvbiAKICAqICAKICAqLwpAQCAtODMsNiArODUsMTAgQEAKIAkJCWNhc2UgRGF0YURTTFBhY2thZ2UuREFUQV9JTlRFUkNIQU5HRV9FTlRJVFlfRVhQUkVTU0lPTjogcmV0dXJuIGNyZWF0ZURhdGFJbnRlcmNoYW5nZUVudGl0eUV4cHJlc3Npb24oKTsKIAkJCWNhc2UgRGF0YURTTFBhY2thZ2UuREFUQV9JTlRFUkNIQU5HRV9QUkVERUZJTkVEX0VYUFJFU1NJT046IHJldHVybiBjcmVhdGVEYXRhSW50ZXJjaGFuZ2VQcmVkZWZpbmVkRXhwcmVzc2lvbigpOwogCQkJY2FzZSBEYXRhRFNMUGFja2FnZS5EQVRBX0lOVEVSQ0hBTkdFX0xPT0tVUDogcmV0dXJuIGNyZWF0ZURhdGFJbnRlcmNoYW5nZUxvb2t1cCgpOworCQkJY2FzZSBEYXRhRFNMUGFja2FnZS5EQVRBX0lOVEVSQ0hBTkdFX0VYUE9TRTogcmV0dXJuIGNyZWF0ZURhdGFJbnRlcmNoYW5nZUV4cG9zZSgpOworCQkJY2FzZSBEYXRhRFNMUGFja2FnZS5EQVRBX0lOVEVSQ0hBTkdFX0VYUE9SVF9GSUxURVI6IHJldHVybiBjcmVhdGVEYXRhSW50ZXJjaGFuZ2VFeHBvcnRGaWx0ZXIoKTsKKwkJCWNhc2UgRGF0YURTTFBhY2thZ2UuREFUQV9JTlRFUkNIQU5HRV9GSUxURVJfQ09ORElUSU9OOiByZXR1cm4gY3JlYXRlRGF0YUludGVyY2hhbmdlRmlsdGVyQ29uZGl0aW9uKCk7CisJCQljYXNlIERhdGFEU0xQYWNrYWdlLkRBVEFfSU5URVJDSEFOR0VfRVhQT1JUX0hJREU6IHJldHVybiBjcmVhdGVEYXRhSW50ZXJjaGFuZ2VFeHBvcnRIaWRlKCk7CiAJCQljYXNlIERhdGFEU0xQYWNrYWdlLkRBVEFfSU5URVJDSEFOR0VfTUFSS0VSX1BBVEg6IHJldHVybiBjcmVhdGVEYXRhSW50ZXJjaGFuZ2VNYXJrZXJQYXRoKCk7CiAJCQljYXNlIERhdGFEU0xQYWNrYWdlLkRBVEFfSU5URVJDSEFOR0VfTUFSS0VSX0VOVElUWTogcmV0dXJuIGNyZWF0ZURhdGFJbnRlcmNoYW5nZU1hcmtlckVudGl0eSgpOwogCQkJY2FzZSBEYXRhRFNMUGFja2FnZS5EQVRBX0lOVEVSQ0hBTkdFX1ZBTFVFX01BUFBJTkc6IHJldHVybiBjcmVhdGVEYXRhSW50ZXJjaGFuZ2VWYWx1ZU1hcHBpbmcoKTsKQEAgLTEwOCw2ICsxMTQsMTAgQEAKIAkJCQlyZXR1cm4gY3JlYXRlUHJlZGVmaW5lZEJlYW5UeXBlRW51bUZyb21TdHJpbmcoZURhdGFUeXBlLCBpbml0aWFsVmFsdWUpOwogCQkJY2FzZSBEYXRhRFNMUGFja2FnZS5FTlRJVFlfTUFOQUdFUl9NT0RFOgogCQkJCXJldHVybiBjcmVhdGVFbnRpdHlNYW5hZ2VyTW9kZUZyb21TdHJpbmcoZURhdGFUeXBlLCBpbml0aWFsVmFsdWUpOworCQkJY2FzZSBEYXRhRFNMUGFja2FnZS5DT05ESVRJT05fQU5EX09QRVJBVE9SMToKKwkJCQlyZXR1cm4gY3JlYXRlQ29uZGl0aW9uQW5kT3BlcmF0b3IxRnJvbVN0cmluZyhlRGF0YVR5cGUsIGluaXRpYWxWYWx1ZSk7CisJCQljYXNlIERhdGFEU0xQYWNrYWdlLkNPTkRJVElPTl9BTkRfT1BFUkFUT1IyOgorCQkJCXJldHVybiBjcmVhdGVDb25kaXRpb25BbmRPcGVyYXRvcjJGcm9tU3RyaW5nKGVEYXRhVHlwZSwgaW5pdGlhbFZhbHVlKTsKIAkJCWNhc2UgRGF0YURTTFBhY2thZ2UuSU5URVJOQUxfRU9CSkVDVDoKIAkJCQlyZXR1cm4gY3JlYXRlSW50ZXJuYWxFT2JqZWN0RnJvbVN0cmluZyhlRGF0YVR5cGUsIGluaXRpYWxWYWx1ZSk7CiAJCQlkZWZhdWx0OgpAQCAtMTMxLDYgKzE0MSwxMCBAQAogCQkJCXJldHVybiBjb252ZXJ0UHJlZGVmaW5lZEJlYW5UeXBlRW51bVRvU3RyaW5nKGVEYXRhVHlwZSwgaW5zdGFuY2VWYWx1ZSk7CiAJCQljYXNlIERhdGFEU0xQYWNrYWdlLkVOVElUWV9NQU5BR0VSX01PREU6CiAJCQkJcmV0dXJuIGNvbnZlcnRFbnRpdHlNYW5hZ2VyTW9kZVRvU3RyaW5nKGVEYXRhVHlwZSwgaW5zdGFuY2VWYWx1ZSk7CisJCQljYXNlIERhdGFEU0xQYWNrYWdlLkNPTkRJVElPTl9BTkRfT1BFUkFUT1IxOgorCQkJCXJldHVybiBjb252ZXJ0Q29uZGl0aW9uQW5kT3BlcmF0b3IxVG9TdHJpbmcoZURhdGFUeXBlLCBpbnN0YW5jZVZhbHVlKTsKKwkJCWNhc2UgRGF0YURTTFBhY2thZ2UuQ09ORElUSU9OX0FORF9PUEVSQVRPUjI6CisJCQkJcmV0dXJuIGNvbnZlcnRDb25kaXRpb25BbmRPcGVyYXRvcjJUb1N0cmluZyhlRGF0YVR5cGUsIGluc3RhbmNlVmFsdWUpOwogCQkJY2FzZSBEYXRhRFNMUGFja2FnZS5JTlRFUk5BTF9FT0JKRUNUOgogCQkJCXJldHVybiBjb252ZXJ0SW50ZXJuYWxFT2JqZWN0VG9TdHJpbmcoZURhdGFUeXBlLCBpbnN0YW5jZVZhbHVlKTsKIAkJCWRlZmF1bHQ6CkBAIC0yODMsNiArMjk3LDQ2IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLworCXB1YmxpYyBEYXRhSW50ZXJjaGFuZ2VFeHBvc2UgY3JlYXRlRGF0YUludGVyY2hhbmdlRXhwb3NlKCkgeworCQlEYXRhSW50ZXJjaGFuZ2VFeHBvc2VJbXBsIGRhdGFJbnRlcmNoYW5nZUV4cG9zZSA9IG5ldyBEYXRhSW50ZXJjaGFuZ2VFeHBvc2VJbXBsKCk7CisJCXJldHVybiBkYXRhSW50ZXJjaGFuZ2VFeHBvc2U7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIERhdGFJbnRlcmNoYW5nZUV4cG9ydEZpbHRlciBjcmVhdGVEYXRhSW50ZXJjaGFuZ2VFeHBvcnRGaWx0ZXIoKSB7CisJCURhdGFJbnRlcmNoYW5nZUV4cG9ydEZpbHRlckltcGwgZGF0YUludGVyY2hhbmdlRXhwb3J0RmlsdGVyID0gbmV3IERhdGFJbnRlcmNoYW5nZUV4cG9ydEZpbHRlckltcGwoKTsKKwkJcmV0dXJuIGRhdGFJbnRlcmNoYW5nZUV4cG9ydEZpbHRlcjsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRGF0YUludGVyY2hhbmdlRmlsdGVyQ29uZGl0aW9uIGNyZWF0ZURhdGFJbnRlcmNoYW5nZUZpbHRlckNvbmRpdGlvbigpIHsKKwkJRGF0YUludGVyY2hhbmdlRmlsdGVyQ29uZGl0aW9uSW1wbCBkYXRhSW50ZXJjaGFuZ2VGaWx0ZXJDb25kaXRpb24gPSBuZXcgRGF0YUludGVyY2hhbmdlRmlsdGVyQ29uZGl0aW9uSW1wbCgpOworCQlyZXR1cm4gZGF0YUludGVyY2hhbmdlRmlsdGVyQ29uZGl0aW9uOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBEYXRhSW50ZXJjaGFuZ2VFeHBvcnRIaWRlIGNyZWF0ZURhdGFJbnRlcmNoYW5nZUV4cG9ydEhpZGUoKSB7CisJCURhdGFJbnRlcmNoYW5nZUV4cG9ydEhpZGVJbXBsIGRhdGFJbnRlcmNoYW5nZUV4cG9ydEhpZGUgPSBuZXcgRGF0YUludGVyY2hhbmdlRXhwb3J0SGlkZUltcGwoKTsKKwkJcmV0dXJuIGRhdGFJbnRlcmNoYW5nZUV4cG9ydEhpZGU7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCiAJcHVibGljIERhdGFJbnRlcmNoYW5nZU1hcmtlclBhdGggY3JlYXRlRGF0YUludGVyY2hhbmdlTWFya2VyUGF0aCgpIHsKIAkJRGF0YUludGVyY2hhbmdlTWFya2VyUGF0aEltcGwgZGF0YUludGVyY2hhbmdlTWFya2VyUGF0aCA9IG5ldyBEYXRhSW50ZXJjaGFuZ2VNYXJrZXJQYXRoSW1wbCgpOwogCQlyZXR1cm4gZGF0YUludGVyY2hhbmdlTWFya2VyUGF0aDsKQEAgLTQwMyw2ICs0NTcsNDYgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJcHVibGljIENvbmRpdGlvbkFuZE9wZXJhdG9yMSBjcmVhdGVDb25kaXRpb25BbmRPcGVyYXRvcjFGcm9tU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIFN0cmluZyBpbml0aWFsVmFsdWUpIHsKKwkJQ29uZGl0aW9uQW5kT3BlcmF0b3IxIHJlc3VsdCA9IENvbmRpdGlvbkFuZE9wZXJhdG9yMS5nZXQoaW5pdGlhbFZhbHVlKTsKKwkJaWYgKHJlc3VsdCA9PSBudWxsKSB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJUaGUgdmFsdWUgJyIgKyBpbml0aWFsVmFsdWUgKyAiJyBpcyBub3QgYSB2YWxpZCBlbnVtZXJhdG9yIG9mICciICsgZURhdGFUeXBlLmdldE5hbWUoKSArICInIik7CisJCXJldHVybiByZXN1bHQ7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFN0cmluZyBjb252ZXJ0Q29uZGl0aW9uQW5kT3BlcmF0b3IxVG9TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgT2JqZWN0IGluc3RhbmNlVmFsdWUpIHsKKwkJcmV0dXJuIGluc3RhbmNlVmFsdWUgPT0gbnVsbCA/IG51bGwgOiBpbnN0YW5jZVZhbHVlLnRvU3RyaW5nKCk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIENvbmRpdGlvbkFuZE9wZXJhdG9yMiBjcmVhdGVDb25kaXRpb25BbmRPcGVyYXRvcjJGcm9tU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIFN0cmluZyBpbml0aWFsVmFsdWUpIHsKKwkJQ29uZGl0aW9uQW5kT3BlcmF0b3IyIHJlc3VsdCA9IENvbmRpdGlvbkFuZE9wZXJhdG9yMi5nZXQoaW5pdGlhbFZhbHVlKTsKKwkJaWYgKHJlc3VsdCA9PSBudWxsKSB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJUaGUgdmFsdWUgJyIgKyBpbml0aWFsVmFsdWUgKyAiJyBpcyBub3QgYSB2YWxpZCBlbnVtZXJhdG9yIG9mICciICsgZURhdGFUeXBlLmdldE5hbWUoKSArICInIik7CisJCXJldHVybiByZXN1bHQ7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFN0cmluZyBjb252ZXJ0Q29uZGl0aW9uQW5kT3BlcmF0b3IyVG9TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgT2JqZWN0IGluc3RhbmNlVmFsdWUpIHsKKwkJcmV0dXJuIGluc3RhbmNlVmFsdWUgPT0gbnVsbCA/IG51bGwgOiBpbnN0YW5jZVZhbHVlLnRvU3RyaW5nKCk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCiAJcHVibGljIEludGVybmFsRU9iamVjdCBjcmVhdGVJbnRlcm5hbEVPYmplY3RGcm9tU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIFN0cmluZyBpbml0aWFsVmFsdWUpIHsKIAkJcmV0dXJuIChJbnRlcm5hbEVPYmplY3Qpc3VwZXIuY3JlYXRlRnJvbVN0cmluZyhlRGF0YVR5cGUsIGluaXRpYWxWYWx1ZSk7CiAJfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5kYXRhaW50ZXJjaGFuZ2UvZW1mLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2RhdGFpbnRlcmNoYW5nZS9pbXBsL0RhdGFEU0xQYWNrYWdlSW1wbC5qYXZhIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5kYXRhaW50ZXJjaGFuZ2UvZW1mLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2RhdGFpbnRlcmNoYW5nZS9pbXBsL0RhdGFEU0xQYWNrYWdlSW1wbC5qYXZhCmluZGV4IDVhY2M4MjUuLjcyYmUwMDkgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLm9zYnAueHRleHQuZGF0YWludGVyY2hhbmdlL2VtZi1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9kYXRhaW50ZXJjaGFuZ2UvaW1wbC9EYXRhRFNMUGFja2FnZUltcGwuamF2YQorKysgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmRhdGFpbnRlcmNoYW5nZS9lbWYtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvZGF0YWludGVyY2hhbmdlL2ltcGwvRGF0YURTTFBhY2thZ2VJbXBsLmphdmEKQEAgLTEsMTMgKzEsMTUgQEAKIC8qKgogICogQ29weXJpZ2h0IChjKSAyMDE0LCBMb2V0eiBHbWJIJkNvLktHIChIZWlkZWxiZXJnKQogICogIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIAorICogIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgMi4wICAKICAqICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAKLSAqICBodHRwey8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCAKKyAqICBodHRwczovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLyAKKyAqIAorICogIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIAogICogCiAgKiAgQmFzZWQgb24gaWRlYXMgZnJvbSBYdGV4dCwgWHRlbmQsIFhjb3JlCiAgKiAgIAotICogIENvbnRyaWJ1dG9yc3sgIAorICogIENvbnRyaWJ1dG9yczogIAogICogIAkJSm9lcmcgUmllZ2VsIC0gSW5pdGlhbCBpbXBsZW1lbnRhdGlvbiAKICAqICAKICAqLwpAQCAtMjksNiArMzEsOCBAQAogCiBpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC5kc2wuc2VtYW50aWMuZW50aXR5Lk9TQlBFbnRpdHlQYWNrYWdlOwogCitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5kYXRhaW50ZXJjaGFuZ2UuQ29uZGl0aW9uQW5kT3BlcmF0b3IxOworaW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAueHRleHQuZGF0YWludGVyY2hhbmdlLkNvbmRpdGlvbkFuZE9wZXJhdG9yMjsKIGltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmRhdGFpbnRlcmNoYW5nZS5EYXRhRFNMRmFjdG9yeTsKIGltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmRhdGFpbnRlcmNoYW5nZS5EYXRhRFNMUGFja2FnZTsKIGltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmRhdGFpbnRlcmNoYW5nZS5EYXRhSW50ZXJjaGFuZ2U7CkBAIC0zNiwxMSArNDAsMTUgQEAKIGltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmRhdGFpbnRlcmNoYW5nZS5EYXRhSW50ZXJjaGFuZ2VCZWFuOwogaW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAueHRleHQuZGF0YWludGVyY2hhbmdlLkRhdGFJbnRlcmNoYW5nZUJsb2JNYXBwaW5nOwogaW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAueHRleHQuZGF0YWludGVyY2hhbmdlLkRhdGFJbnRlcmNoYW5nZUVudGl0eUV4cHJlc3Npb247CitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5kYXRhaW50ZXJjaGFuZ2UuRGF0YUludGVyY2hhbmdlRXhwb3J0RmlsdGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAueHRleHQuZGF0YWludGVyY2hhbmdlLkRhdGFJbnRlcmNoYW5nZUV4cG9ydEhpZGU7CitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5kYXRhaW50ZXJjaGFuZ2UuRGF0YUludGVyY2hhbmdlRXhwb3NlOwogaW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAueHRleHQuZGF0YWludGVyY2hhbmdlLkRhdGFJbnRlcmNoYW5nZUV4cHJlc3Npb247CiBpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5kYXRhaW50ZXJjaGFuZ2UuRGF0YUludGVyY2hhbmdlRmlsZTsKIGltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmRhdGFpbnRlcmNoYW5nZS5EYXRhSW50ZXJjaGFuZ2VGaWxlQ1NWOwogaW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAueHRleHQuZGF0YWludGVyY2hhbmdlLkRhdGFJbnRlcmNoYW5nZUZpbGVFREk7CiBpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5kYXRhaW50ZXJjaGFuZ2UuRGF0YUludGVyY2hhbmdlRmlsZVhNTDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmRhdGFpbnRlcmNoYW5nZS5EYXRhSW50ZXJjaGFuZ2VGaWx0ZXJDb25kaXRpb247CiBpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5kYXRhaW50ZXJjaGFuZ2UuRGF0YUludGVyY2hhbmdlRm9ybWF0OwogaW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAueHRleHQuZGF0YWludGVyY2hhbmdlLkRhdGFJbnRlcmNoYW5nZUtleTsKIGltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmRhdGFpbnRlcmNoYW5nZS5EYXRhSW50ZXJjaGFuZ2VMYXp5UmVzb2x2ZXI7CkBAIC0xODMsNiArMTkxLDM0IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLworCXByaXZhdGUgRUNsYXNzIGRhdGFJbnRlcmNoYW5nZUV4cG9zZUVDbGFzcyA9IG51bGw7CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcml2YXRlIEVDbGFzcyBkYXRhSW50ZXJjaGFuZ2VFeHBvcnRGaWx0ZXJFQ2xhc3MgPSBudWxsOworCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJpdmF0ZSBFQ2xhc3MgZGF0YUludGVyY2hhbmdlRmlsdGVyQ29uZGl0aW9uRUNsYXNzID0gbnVsbDsKKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByaXZhdGUgRUNsYXNzIGRhdGFJbnRlcmNoYW5nZUV4cG9ydEhpZGVFQ2xhc3MgPSBudWxsOworCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCiAJcHJpdmF0ZSBFQ2xhc3MgZGF0YUludGVyY2hhbmdlTWFya2VyUGF0aEVDbGFzcyA9IG51bGw7CiAKIAkvKioKQEAgLTI0Niw2ICsyODIsMjAgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJcHJpdmF0ZSBFRW51bSBjb25kaXRpb25BbmRPcGVyYXRvcjFFRW51bSA9IG51bGw7CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcml2YXRlIEVFbnVtIGNvbmRpdGlvbkFuZE9wZXJhdG9yMkVFbnVtID0gbnVsbDsKKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLwogCXByaXZhdGUgRURhdGFUeXBlIGludGVybmFsRU9iamVjdEVEYXRhVHlwZSA9IG51bGw7CiAKIAkvKioKQEAgLTQ4OCw2ICs1MzgsMTUgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJcHVibGljIEVBdHRyaWJ1dGUgZ2V0RGF0YUludGVyY2hhbmdlX0RlbGV0ZUZpbGVBZnRlckltcG9ydCgpIHsKKwkJcmV0dXJuIChFQXR0cmlidXRlKWRhdGFJbnRlcmNoYW5nZUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDgpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLwogCXB1YmxpYyBFQ2xhc3MgZ2V0RGF0YUludGVyY2hhbmdlRmlsZSgpIHsKIAkJcmV0dXJuIGRhdGFJbnRlcmNoYW5nZUZpbGVFQ2xhc3M7CiAJfQpAQCAtNjUwLDcgKzcwOSw3IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldERhdGFJbnRlcmNoYW5nZUJlYW5fTWFya0xhdGVzdCgpIHsKKwlwdWJsaWMgRUF0dHJpYnV0ZSBnZXREYXRhSW50ZXJjaGFuZ2VCZWFuX01hcmtMYXRlc3RJbXBvcnQoKSB7CiAJCXJldHVybiAoRUF0dHJpYnV0ZSlkYXRhSW50ZXJjaGFuZ2VCZWFuRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7CiAJfQogCkBAIC02NTksNyArNzE4LDcgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0RGF0YUludGVyY2hhbmdlQmVhbl9IYXNCbG9iTWFwcGluZygpIHsKKwlwdWJsaWMgRUF0dHJpYnV0ZSBnZXREYXRhSW50ZXJjaGFuZ2VCZWFuX01hcmtMYXRlc3RFeHBvcnQoKSB7CiAJCXJldHVybiAoRUF0dHJpYnV0ZSlkYXRhSW50ZXJjaGFuZ2VCZWFuRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMik7CiAJfQogCkBAIC02NjgsOCArNzI3LDI2IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLworCXB1YmxpYyBFQXR0cmlidXRlIGdldERhdGFJbnRlcmNoYW5nZUJlYW5fSGFzQmxvYk1hcHBpbmcoKSB7CisJCXJldHVybiAoRUF0dHJpYnV0ZSlkYXRhSW50ZXJjaGFuZ2VCZWFuRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMyk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCiAJcHVibGljIEVSZWZlcmVuY2UgZ2V0RGF0YUludGVyY2hhbmdlQmVhbl9MYXRlc3RQcm9wZXJ0eSgpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKWRhdGFJbnRlcmNoYW5nZUJlYW5FQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgzKTsKKwkJcmV0dXJuIChFUmVmZXJlbmNlKWRhdGFJbnRlcmNoYW5nZUJlYW5FQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg0KTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRVJlZmVyZW5jZSBnZXREYXRhSW50ZXJjaGFuZ2VCZWFuX0xhdGVzdEV4cFByb3BlcnR5KCkgeworCQlyZXR1cm4gKEVSZWZlcmVuY2UpZGF0YUludGVyY2hhbmdlQmVhbkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDUpOwogCX0KIAogCS8qKgpAQCAtNjc4LDcgKzc1NSw3IEBACiAJICogQGdlbmVyYXRlZAogCSAqLwogCXB1YmxpYyBFQXR0cmlidXRlIGdldERhdGFJbnRlcmNoYW5nZUJlYW5fRWxlbWVudE1hcCgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKWRhdGFJbnRlcmNoYW5nZUJlYW5FQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg0KTsKKwkJcmV0dXJuIChFQXR0cmlidXRlKWRhdGFJbnRlcmNoYW5nZUJlYW5FQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg2KTsKIAl9CiAKIAkvKioKQEAgLTY4Nyw3ICs3NjQsNyBAQAogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KIAlwdWJsaWMgRUF0dHJpYnV0ZSBnZXREYXRhSW50ZXJjaGFuZ2VCZWFuX05vZGVOYW1lKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpZGF0YUludGVyY2hhbmdlQmVhbkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDUpOworCQlyZXR1cm4gKEVBdHRyaWJ1dGUpZGF0YUludGVyY2hhbmdlQmVhbkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDcpOwogCX0KIAogCS8qKgpAQCAtNjk2LDI0ICs3NzMsNiBAQAogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KIAlwdWJsaWMgRVJlZmVyZW5jZSBnZXREYXRhSW50ZXJjaGFuZ2VCZWFuX0xvb2t1cCgpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKWRhdGFJbnRlcmNoYW5nZUJlYW5FQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg2KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXREYXRhSW50ZXJjaGFuZ2VCZWFuX0Zvcm1hdCgpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKWRhdGFJbnRlcmNoYW5nZUJlYW5FQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg3KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXREYXRhSW50ZXJjaGFuZ2VCZWFuX0V4cHJlc3Npb24oKSB7CiAJCXJldHVybiAoRVJlZmVyZW5jZSlkYXRhSW50ZXJjaGFuZ2VCZWFuRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoOCk7CiAJfQogCkBAIC03MjIsNyArNzgxLDcgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0RGF0YUludGVyY2hhbmdlQmVhbl9NYXBwaW5ncygpIHsKKwlwdWJsaWMgRVJlZmVyZW5jZSBnZXREYXRhSW50ZXJjaGFuZ2VCZWFuX0Zvcm1hdCgpIHsKIAkJcmV0dXJuIChFUmVmZXJlbmNlKWRhdGFJbnRlcmNoYW5nZUJlYW5FQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg5KTsKIAl9CiAKQEAgLTczMSw3ICs3OTAsNyBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXREYXRhSW50ZXJjaGFuZ2VCZWFuX0xvb2t1cEtleXMoKSB7CisJcHVibGljIEVSZWZlcmVuY2UgZ2V0RGF0YUludGVyY2hhbmdlQmVhbl9FeHByZXNzaW9uKCkgewogCQlyZXR1cm4gKEVSZWZlcmVuY2UpZGF0YUludGVyY2hhbmdlQmVhbkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEwKTsKIAl9CiAKQEAgLTc0MCw2ICs3OTksNDIgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJcHVibGljIEVSZWZlcmVuY2UgZ2V0RGF0YUludGVyY2hhbmdlQmVhbl9NYXBwaW5ncygpIHsKKwkJcmV0dXJuIChFUmVmZXJlbmNlKWRhdGFJbnRlcmNoYW5nZUJlYW5FQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxMSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVSZWZlcmVuY2UgZ2V0RGF0YUludGVyY2hhbmdlQmVhbl9Mb29rdXBLZXlzKCkgeworCQlyZXR1cm4gKEVSZWZlcmVuY2UpZGF0YUludGVyY2hhbmdlQmVhbkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEyKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRVJlZmVyZW5jZSBnZXREYXRhSW50ZXJjaGFuZ2VCZWFuX0V4cG9ydEV4cG9zZXMoKSB7CisJCXJldHVybiAoRVJlZmVyZW5jZSlkYXRhSW50ZXJjaGFuZ2VCZWFuRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMTMpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFUmVmZXJlbmNlIGdldERhdGFJbnRlcmNoYW5nZUJlYW5fRXhwb3J0RmlsdGVyKCkgeworCQlyZXR1cm4gKEVSZWZlcmVuY2UpZGF0YUludGVyY2hhbmdlQmVhbkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDE0KTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KIAlwdWJsaWMgRUNsYXNzIGdldERhdGFJbnRlcmNoYW5nZUtleSgpIHsKIAkJcmV0dXJuIGRhdGFJbnRlcmNoYW5nZUtleUVDbGFzczsKIAl9CkBAIC05NTYsNiArMTA1MSwxNDEgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJcHVibGljIEVDbGFzcyBnZXREYXRhSW50ZXJjaGFuZ2VFeHBvc2UoKSB7CisJCXJldHVybiBkYXRhSW50ZXJjaGFuZ2VFeHBvc2VFQ2xhc3M7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVSZWZlcmVuY2UgZ2V0RGF0YUludGVyY2hhbmdlRXhwb3NlX1JlZkVudGl0eSgpIHsKKwkJcmV0dXJuIChFUmVmZXJlbmNlKWRhdGFJbnRlcmNoYW5nZUV4cG9zZUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFUmVmZXJlbmNlIGdldERhdGFJbnRlcmNoYW5nZUV4cG9zZV9SZWZQcm9wZXJ0eSgpIHsKKwkJcmV0dXJuIChFUmVmZXJlbmNlKWRhdGFJbnRlcmNoYW5nZUV4cG9zZUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFUmVmZXJlbmNlIGdldERhdGFJbnRlcmNoYW5nZUV4cG9zZV9TdWJFeHBvc2UoKSB7CisJCXJldHVybiAoRVJlZmVyZW5jZSlkYXRhSW50ZXJjaGFuZ2VFeHBvc2VFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgyKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRUNsYXNzIGdldERhdGFJbnRlcmNoYW5nZUV4cG9ydEZpbHRlcigpIHsKKwkJcmV0dXJuIGRhdGFJbnRlcmNoYW5nZUV4cG9ydEZpbHRlckVDbGFzczsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRVJlZmVyZW5jZSBnZXREYXRhSW50ZXJjaGFuZ2VFeHBvcnRGaWx0ZXJfQ29uZGl0aW9uKCkgeworCQlyZXR1cm4gKEVSZWZlcmVuY2UpZGF0YUludGVyY2hhbmdlRXhwb3J0RmlsdGVyRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVSZWZlcmVuY2UgZ2V0RGF0YUludGVyY2hhbmdlRXhwb3J0RmlsdGVyX0hpZGRlbnByb3BlcnRpZXMoKSB7CisJCXJldHVybiAoRVJlZmVyZW5jZSlkYXRhSW50ZXJjaGFuZ2VFeHBvcnRGaWx0ZXJFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRUNsYXNzIGdldERhdGFJbnRlcmNoYW5nZUZpbHRlckNvbmRpdGlvbigpIHsKKwkJcmV0dXJuIGRhdGFJbnRlcmNoYW5nZUZpbHRlckNvbmRpdGlvbkVDbGFzczsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRVJlZmVyZW5jZSBnZXREYXRhSW50ZXJjaGFuZ2VGaWx0ZXJDb25kaXRpb25fUmVmUHJvcGVydHkoKSB7CisJCXJldHVybiAoRVJlZmVyZW5jZSlkYXRhSW50ZXJjaGFuZ2VGaWx0ZXJDb25kaXRpb25FQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRUF0dHJpYnV0ZSBnZXREYXRhSW50ZXJjaGFuZ2VGaWx0ZXJDb25kaXRpb25fT3BlcmF0b3IoKSB7CisJCXJldHVybiAoRUF0dHJpYnV0ZSlkYXRhSW50ZXJjaGFuZ2VGaWx0ZXJDb25kaXRpb25FQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRUF0dHJpYnV0ZSBnZXREYXRhSW50ZXJjaGFuZ2VGaWx0ZXJDb25kaXRpb25fVmFsdWUoKSB7CisJCXJldHVybiAoRUF0dHJpYnV0ZSlkYXRhSW50ZXJjaGFuZ2VGaWx0ZXJDb25kaXRpb25FQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgyKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRUF0dHJpYnV0ZSBnZXREYXRhSW50ZXJjaGFuZ2VGaWx0ZXJDb25kaXRpb25fT3BlcmF0b3IyKCkgeworCQlyZXR1cm4gKEVBdHRyaWJ1dGUpZGF0YUludGVyY2hhbmdlRmlsdGVyQ29uZGl0aW9uRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMyk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVSZWZlcmVuY2UgZ2V0RGF0YUludGVyY2hhbmdlRmlsdGVyQ29uZGl0aW9uX1N1YmNvbmRpdGlvbigpIHsKKwkJcmV0dXJuIChFUmVmZXJlbmNlKWRhdGFJbnRlcmNoYW5nZUZpbHRlckNvbmRpdGlvbkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDQpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFQ2xhc3MgZ2V0RGF0YUludGVyY2hhbmdlRXhwb3J0SGlkZSgpIHsKKwkJcmV0dXJuIGRhdGFJbnRlcmNoYW5nZUV4cG9ydEhpZGVFQ2xhc3M7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVSZWZlcmVuY2UgZ2V0RGF0YUludGVyY2hhbmdlRXhwb3J0SGlkZV9Qcm9wZXJ0eSgpIHsKKwkJcmV0dXJuIChFUmVmZXJlbmNlKWRhdGFJbnRlcmNoYW5nZUV4cG9ydEhpZGVFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KIAlwdWJsaWMgRUNsYXNzIGdldERhdGFJbnRlcmNoYW5nZU1hcmtlclBhdGgoKSB7CiAJCXJldHVybiBkYXRhSW50ZXJjaGFuZ2VNYXJrZXJQYXRoRUNsYXNzOwogCX0KQEAgLTExMTgsNiArMTM0OCwyNCBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlwdWJsaWMgRUVudW0gZ2V0Q29uZGl0aW9uQW5kT3BlcmF0b3IxKCkgeworCQlyZXR1cm4gY29uZGl0aW9uQW5kT3BlcmF0b3IxRUVudW07CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVFbnVtIGdldENvbmRpdGlvbkFuZE9wZXJhdG9yMigpIHsKKwkJcmV0dXJuIGNvbmRpdGlvbkFuZE9wZXJhdG9yMkVFbnVtOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLwogCXB1YmxpYyBFRGF0YVR5cGUgZ2V0SW50ZXJuYWxFT2JqZWN0KCkgewogCQlyZXR1cm4gaW50ZXJuYWxFT2JqZWN0RURhdGFUeXBlOwogCX0KQEAgLTExNzMsNiArMTQyMSw3IEBACiAJCWNyZWF0ZUVBdHRyaWJ1dGUoZGF0YUludGVyY2hhbmdlRUNsYXNzLCBEQVRBX0lOVEVSQ0hBTkdFX19NT0RFKTsKIAkJY3JlYXRlRVJlZmVyZW5jZShkYXRhSW50ZXJjaGFuZ2VFQ2xhc3MsIERBVEFfSU5URVJDSEFOR0VfX0ZJTEVfRU5EUE9JTlQpOwogCQljcmVhdGVFUmVmZXJlbmNlKGRhdGFJbnRlcmNoYW5nZUVDbGFzcywgREFUQV9JTlRFUkNIQU5HRV9fUEFUSCk7CisJCWNyZWF0ZUVBdHRyaWJ1dGUoZGF0YUludGVyY2hhbmdlRUNsYXNzLCBEQVRBX0lOVEVSQ0hBTkdFX19ERUxFVEVfRklMRV9BRlRFUl9JTVBPUlQpOwogCiAJCWRhdGFJbnRlcmNoYW5nZUZpbGVFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoREFUQV9JTlRFUkNIQU5HRV9GSUxFKTsKIAkJY3JlYXRlRUF0dHJpYnV0ZShkYXRhSW50ZXJjaGFuZ2VGaWxlRUNsYXNzLCBEQVRBX0lOVEVSQ0hBTkdFX0ZJTEVfX0VOQ09ESU5HKTsKQEAgLTExOTYsOSArMTQ0NSwxMSBAQAogCiAJCWRhdGFJbnRlcmNoYW5nZUJlYW5FQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoREFUQV9JTlRFUkNIQU5HRV9CRUFOKTsKIAkJY3JlYXRlRVJlZmVyZW5jZShkYXRhSW50ZXJjaGFuZ2VCZWFuRUNsYXNzLCBEQVRBX0lOVEVSQ0hBTkdFX0JFQU5fX0VOVElUWSk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoZGF0YUludGVyY2hhbmdlQmVhbkVDbGFzcywgREFUQV9JTlRFUkNIQU5HRV9CRUFOX19NQVJLX0xBVEVTVCk7CisJCWNyZWF0ZUVBdHRyaWJ1dGUoZGF0YUludGVyY2hhbmdlQmVhbkVDbGFzcywgREFUQV9JTlRFUkNIQU5HRV9CRUFOX19NQVJLX0xBVEVTVF9JTVBPUlQpOworCQljcmVhdGVFQXR0cmlidXRlKGRhdGFJbnRlcmNoYW5nZUJlYW5FQ2xhc3MsIERBVEFfSU5URVJDSEFOR0VfQkVBTl9fTUFSS19MQVRFU1RfRVhQT1JUKTsKIAkJY3JlYXRlRUF0dHJpYnV0ZShkYXRhSW50ZXJjaGFuZ2VCZWFuRUNsYXNzLCBEQVRBX0lOVEVSQ0hBTkdFX0JFQU5fX0hBU19CTE9CX01BUFBJTkcpOwogCQljcmVhdGVFUmVmZXJlbmNlKGRhdGFJbnRlcmNoYW5nZUJlYW5FQ2xhc3MsIERBVEFfSU5URVJDSEFOR0VfQkVBTl9fTEFURVNUX1BST1BFUlRZKTsKKwkJY3JlYXRlRVJlZmVyZW5jZShkYXRhSW50ZXJjaGFuZ2VCZWFuRUNsYXNzLCBEQVRBX0lOVEVSQ0hBTkdFX0JFQU5fX0xBVEVTVF9FWFBfUFJPUEVSVFkpOwogCQljcmVhdGVFQXR0cmlidXRlKGRhdGFJbnRlcmNoYW5nZUJlYW5FQ2xhc3MsIERBVEFfSU5URVJDSEFOR0VfQkVBTl9fRUxFTUVOVF9NQVApOwogCQljcmVhdGVFQXR0cmlidXRlKGRhdGFJbnRlcmNoYW5nZUJlYW5FQ2xhc3MsIERBVEFfSU5URVJDSEFOR0VfQkVBTl9fTk9ERV9OQU1FKTsKIAkJY3JlYXRlRVJlZmVyZW5jZShkYXRhSW50ZXJjaGFuZ2VCZWFuRUNsYXNzLCBEQVRBX0lOVEVSQ0hBTkdFX0JFQU5fX0xPT0tVUCk7CkBAIC0xMjA2LDYgKzE0NTcsOCBAQAogCQljcmVhdGVFUmVmZXJlbmNlKGRhdGFJbnRlcmNoYW5nZUJlYW5FQ2xhc3MsIERBVEFfSU5URVJDSEFOR0VfQkVBTl9fRVhQUkVTU0lPTik7CiAJCWNyZWF0ZUVSZWZlcmVuY2UoZGF0YUludGVyY2hhbmdlQmVhbkVDbGFzcywgREFUQV9JTlRFUkNIQU5HRV9CRUFOX19NQVBQSU5HUyk7CiAJCWNyZWF0ZUVSZWZlcmVuY2UoZGF0YUludGVyY2hhbmdlQmVhbkVDbGFzcywgREFUQV9JTlRFUkNIQU5HRV9CRUFOX19MT09LVVBfS0VZUyk7CisJCWNyZWF0ZUVSZWZlcmVuY2UoZGF0YUludGVyY2hhbmdlQmVhbkVDbGFzcywgREFUQV9JTlRFUkNIQU5HRV9CRUFOX19FWFBPUlRfRVhQT1NFUyk7CisJCWNyZWF0ZUVSZWZlcmVuY2UoZGF0YUludGVyY2hhbmdlQmVhbkVDbGFzcywgREFUQV9JTlRFUkNIQU5HRV9CRUFOX19FWFBPUlRfRklMVEVSKTsKIAogCQlkYXRhSW50ZXJjaGFuZ2VLZXlFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoREFUQV9JTlRFUkNIQU5HRV9LRVkpOwogCQljcmVhdGVFUmVmZXJlbmNlKGRhdGFJbnRlcmNoYW5nZUtleUVDbGFzcywgREFUQV9JTlRFUkNIQU5HRV9LRVlfX1BST1BFUlRZKTsKQEAgLTEyMzcsNiArMTQ5MCwyNSBAQAogCQljcmVhdGVFQXR0cmlidXRlKGRhdGFJbnRlcmNoYW5nZUxvb2t1cEVDbGFzcywgREFUQV9JTlRFUkNIQU5HRV9MT09LVVBfX0NBQ0hFX1NJWkUpOwogCQljcmVhdGVFUmVmZXJlbmNlKGRhdGFJbnRlcmNoYW5nZUxvb2t1cEVDbGFzcywgREFUQV9JTlRFUkNIQU5HRV9MT09LVVBfX01BUktFUl9QQVRIKTsKIAorCQlkYXRhSW50ZXJjaGFuZ2VFeHBvc2VFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoREFUQV9JTlRFUkNIQU5HRV9FWFBPU0UpOworCQljcmVhdGVFUmVmZXJlbmNlKGRhdGFJbnRlcmNoYW5nZUV4cG9zZUVDbGFzcywgREFUQV9JTlRFUkNIQU5HRV9FWFBPU0VfX1JFRl9FTlRJVFkpOworCQljcmVhdGVFUmVmZXJlbmNlKGRhdGFJbnRlcmNoYW5nZUV4cG9zZUVDbGFzcywgREFUQV9JTlRFUkNIQU5HRV9FWFBPU0VfX1JFRl9QUk9QRVJUWSk7CisJCWNyZWF0ZUVSZWZlcmVuY2UoZGF0YUludGVyY2hhbmdlRXhwb3NlRUNsYXNzLCBEQVRBX0lOVEVSQ0hBTkdFX0VYUE9TRV9fU1VCX0VYUE9TRSk7CisKKwkJZGF0YUludGVyY2hhbmdlRXhwb3J0RmlsdGVyRUNsYXNzID0gY3JlYXRlRUNsYXNzKERBVEFfSU5URVJDSEFOR0VfRVhQT1JUX0ZJTFRFUik7CisJCWNyZWF0ZUVSZWZlcmVuY2UoZGF0YUludGVyY2hhbmdlRXhwb3J0RmlsdGVyRUNsYXNzLCBEQVRBX0lOVEVSQ0hBTkdFX0VYUE9SVF9GSUxURVJfX0NPTkRJVElPTik7CisJCWNyZWF0ZUVSZWZlcmVuY2UoZGF0YUludGVyY2hhbmdlRXhwb3J0RmlsdGVyRUNsYXNzLCBEQVRBX0lOVEVSQ0hBTkdFX0VYUE9SVF9GSUxURVJfX0hJRERFTlBST1BFUlRJRVMpOworCisJCWRhdGFJbnRlcmNoYW5nZUZpbHRlckNvbmRpdGlvbkVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhEQVRBX0lOVEVSQ0hBTkdFX0ZJTFRFUl9DT05ESVRJT04pOworCQljcmVhdGVFUmVmZXJlbmNlKGRhdGFJbnRlcmNoYW5nZUZpbHRlckNvbmRpdGlvbkVDbGFzcywgREFUQV9JTlRFUkNIQU5HRV9GSUxURVJfQ09ORElUSU9OX19SRUZfUFJPUEVSVFkpOworCQljcmVhdGVFQXR0cmlidXRlKGRhdGFJbnRlcmNoYW5nZUZpbHRlckNvbmRpdGlvbkVDbGFzcywgREFUQV9JTlRFUkNIQU5HRV9GSUxURVJfQ09ORElUSU9OX19PUEVSQVRPUik7CisJCWNyZWF0ZUVBdHRyaWJ1dGUoZGF0YUludGVyY2hhbmdlRmlsdGVyQ29uZGl0aW9uRUNsYXNzLCBEQVRBX0lOVEVSQ0hBTkdFX0ZJTFRFUl9DT05ESVRJT05fX1ZBTFVFKTsKKwkJY3JlYXRlRUF0dHJpYnV0ZShkYXRhSW50ZXJjaGFuZ2VGaWx0ZXJDb25kaXRpb25FQ2xhc3MsIERBVEFfSU5URVJDSEFOR0VfRklMVEVSX0NPTkRJVElPTl9fT1BFUkFUT1IyKTsKKwkJY3JlYXRlRVJlZmVyZW5jZShkYXRhSW50ZXJjaGFuZ2VGaWx0ZXJDb25kaXRpb25FQ2xhc3MsIERBVEFfSU5URVJDSEFOR0VfRklMVEVSX0NPTkRJVElPTl9fU1VCQ09ORElUSU9OKTsKKworCQlkYXRhSW50ZXJjaGFuZ2VFeHBvcnRIaWRlRUNsYXNzID0gY3JlYXRlRUNsYXNzKERBVEFfSU5URVJDSEFOR0VfRVhQT1JUX0hJREUpOworCQljcmVhdGVFUmVmZXJlbmNlKGRhdGFJbnRlcmNoYW5nZUV4cG9ydEhpZGVFQ2xhc3MsIERBVEFfSU5URVJDSEFOR0VfRVhQT1JUX0hJREVfX1BST1BFUlRZKTsKKwogCQlkYXRhSW50ZXJjaGFuZ2VNYXJrZXJQYXRoRUNsYXNzID0gY3JlYXRlRUNsYXNzKERBVEFfSU5URVJDSEFOR0VfTUFSS0VSX1BBVEgpOwogCQljcmVhdGVFUmVmZXJlbmNlKGRhdGFJbnRlcmNoYW5nZU1hcmtlclBhdGhFQ2xhc3MsIERBVEFfSU5URVJDSEFOR0VfTUFSS0VSX1BBVEhfX1BBVEgpOwogCkBAIC0xMjYxLDYgKzE1MzMsOCBAQAogCQlwcmVkZWZpbmVkQmVhbkVudW1FRW51bSA9IGNyZWF0ZUVFbnVtKFBSRURFRklORURfQkVBTl9FTlVNKTsKIAkJcHJlZGVmaW5lZEJlYW5UeXBlRW51bUVFbnVtID0gY3JlYXRlRUVudW0oUFJFREVGSU5FRF9CRUFOX1RZUEVfRU5VTSk7CiAJCWVudGl0eU1hbmFnZXJNb2RlRUVudW0gPSBjcmVhdGVFRW51bShFTlRJVFlfTUFOQUdFUl9NT0RFKTsKKwkJY29uZGl0aW9uQW5kT3BlcmF0b3IxRUVudW0gPSBjcmVhdGVFRW51bShDT05ESVRJT05fQU5EX09QRVJBVE9SMSk7CisJCWNvbmRpdGlvbkFuZE9wZXJhdG9yMkVFbnVtID0gY3JlYXRlRUVudW0oQ09ORElUSU9OX0FORF9PUEVSQVRPUjIpOwogCiAJCS8vIENyZWF0ZSBkYXRhIHR5cGVzCiAJCWludGVybmFsRU9iamVjdEVEYXRhVHlwZSA9IGNyZWF0ZUVEYXRhVHlwZShJTlRFUk5BTF9FT0JKRUNUKTsKQEAgLTEzMTQsNiArMTU4OCwxMCBAQAogCQlkYXRhSW50ZXJjaGFuZ2VFbnRpdHlFeHByZXNzaW9uRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0RGF0YUludGVyY2hhbmdlRXhwcmVzc2lvbigpKTsKIAkJZGF0YUludGVyY2hhbmdlUHJlZGVmaW5lZEV4cHJlc3Npb25FQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXREYXRhSW50ZXJjaGFuZ2VFeHByZXNzaW9uKCkpOwogCQlkYXRhSW50ZXJjaGFuZ2VMb29rdXBFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXREYXRhSW50ZXJjaGFuZ2VMYXp5UmVzb2x2ZXIoKSk7CisJCWRhdGFJbnRlcmNoYW5nZUV4cG9zZUVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldERhdGFJbnRlcmNoYW5nZUxhenlSZXNvbHZlcigpKTsKKwkJZGF0YUludGVyY2hhbmdlRXhwb3J0RmlsdGVyRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0RGF0YUludGVyY2hhbmdlTGF6eVJlc29sdmVyKCkpOworCQlkYXRhSW50ZXJjaGFuZ2VGaWx0ZXJDb25kaXRpb25FQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXREYXRhSW50ZXJjaGFuZ2VMYXp5UmVzb2x2ZXIoKSk7CisJCWRhdGFJbnRlcmNoYW5nZUV4cG9ydEhpZGVFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXREYXRhSW50ZXJjaGFuZ2VMYXp5UmVzb2x2ZXIoKSk7CiAJCWRhdGFJbnRlcmNoYW5nZU1hcmtlclBhdGhFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXREYXRhSW50ZXJjaGFuZ2VMYXp5UmVzb2x2ZXIoKSk7CiAJCWRhdGFJbnRlcmNoYW5nZU1hcmtlckVudGl0eUVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldERhdGFJbnRlcmNoYW5nZUxhenlSZXNvbHZlcigpKTsKIAkJZGF0YUludGVyY2hhbmdlTWFwcGluZ0VDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldERhdGFJbnRlcmNoYW5nZUxhenlSZXNvbHZlcigpKTsKQEAgLTEzNDYsNiArMTYyNCw3IEBACiAJCWluaXRFQXR0cmlidXRlKGdldERhdGFJbnRlcmNoYW5nZV9Nb2RlKCksIHRoaXMuZ2V0RW50aXR5TWFuYWdlck1vZGUoKSwgIm1vZGUiLCBudWxsLCAwLCAxLCBEYXRhSW50ZXJjaGFuZ2UuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgIUlTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwogCQlpbml0RVJlZmVyZW5jZShnZXREYXRhSW50ZXJjaGFuZ2VfRmlsZUVuZHBvaW50KCksIHRoaXMuZ2V0RGF0YUludGVyY2hhbmdlRmlsZSgpLCBudWxsLCAiZmlsZUVuZHBvaW50IiwgbnVsbCwgMCwgMSwgRGF0YUludGVyY2hhbmdlLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwogCQlpbml0RVJlZmVyZW5jZShnZXREYXRhSW50ZXJjaGFuZ2VfUGF0aCgpLCB0aGlzLmdldERhdGFJbnRlcmNoYW5nZUJlYW4oKSwgbnVsbCwgInBhdGgiLCBudWxsLCAwLCAtMSwgRGF0YUludGVyY2hhbmdlLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOworCQlpbml0RUF0dHJpYnV0ZShnZXREYXRhSW50ZXJjaGFuZ2VfRGVsZXRlRmlsZUFmdGVySW1wb3J0KCksIHRoZUVjb3JlUGFja2FnZS5nZXRFQm9vbGVhbigpLCAiZGVsZXRlRmlsZUFmdGVySW1wb3J0IiwgbnVsbCwgMCwgMSwgRGF0YUludGVyY2hhbmdlLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsICFJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKIAogCQlpbml0RUNsYXNzKGRhdGFJbnRlcmNoYW5nZUZpbGVFQ2xhc3MsIERhdGFJbnRlcmNoYW5nZUZpbGUuY2xhc3MsICJEYXRhSW50ZXJjaGFuZ2VGaWxlIiwgSVNfQUJTVFJBQ1QsIElTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKIAkJaW5pdEVBdHRyaWJ1dGUoZ2V0RGF0YUludGVyY2hhbmdlRmlsZV9FbmNvZGluZygpLCB0aGVFY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAiZW5jb2RpbmciLCBudWxsLCAwLCAxLCBEYXRhSW50ZXJjaGFuZ2VGaWxlLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsICFJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKQEAgLTEzNjksOSArMTY0OCwxMSBAQAogCiAJCWluaXRFQ2xhc3MoZGF0YUludGVyY2hhbmdlQmVhbkVDbGFzcywgRGF0YUludGVyY2hhbmdlQmVhbi5jbGFzcywgIkRhdGFJbnRlcmNoYW5nZUJlYW4iLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7CiAJCWluaXRFUmVmZXJlbmNlKGdldERhdGFJbnRlcmNoYW5nZUJlYW5fRW50aXR5KCksIHRoZU9TQlBFbnRpdHlQYWNrYWdlLmdldExFbnRpdHkoKSwgbnVsbCwgImVudGl0eSIsIG51bGwsIDAsIDEsIERhdGFJbnRlcmNoYW5nZUJlYW4uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX0NPTVBPU0lURSwgSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldERhdGFJbnRlcmNoYW5nZUJlYW5fTWFya0xhdGVzdCgpLCB0aGVFY29yZVBhY2thZ2UuZ2V0RUJvb2xlYW4oKSwgIm1hcmtMYXRlc3QiLCBudWxsLCAwLCAxLCBEYXRhSW50ZXJjaGFuZ2VCZWFuLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsICFJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKKwkJaW5pdEVBdHRyaWJ1dGUoZ2V0RGF0YUludGVyY2hhbmdlQmVhbl9NYXJrTGF0ZXN0SW1wb3J0KCksIHRoZUVjb3JlUGFja2FnZS5nZXRFQm9vbGVhbigpLCAibWFya0xhdGVzdEltcG9ydCIsIG51bGwsIDAsIDEsIERhdGFJbnRlcmNoYW5nZUJlYW4uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgIUlTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOworCQlpbml0RUF0dHJpYnV0ZShnZXREYXRhSW50ZXJjaGFuZ2VCZWFuX01hcmtMYXRlc3RFeHBvcnQoKSwgdGhlRWNvcmVQYWNrYWdlLmdldEVCb29sZWFuKCksICJtYXJrTGF0ZXN0RXhwb3J0IiwgbnVsbCwgMCwgMSwgRGF0YUludGVyY2hhbmdlQmVhbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7CiAJCWluaXRFQXR0cmlidXRlKGdldERhdGFJbnRlcmNoYW5nZUJlYW5fSGFzQmxvYk1hcHBpbmcoKSwgdGhlRWNvcmVQYWNrYWdlLmdldEVCb29sZWFuKCksICJoYXNCbG9iTWFwcGluZyIsIG51bGwsIDAsIDEsIERhdGFJbnRlcmNoYW5nZUJlYW4uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgIUlTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwogCQlpbml0RVJlZmVyZW5jZShnZXREYXRhSW50ZXJjaGFuZ2VCZWFuX0xhdGVzdFByb3BlcnR5KCksIHRoZU9TQlBFbnRpdHlQYWNrYWdlLmdldExFbnRpdHlBdHRyaWJ1dGUoKSwgbnVsbCwgImxhdGVzdFByb3BlcnR5IiwgbnVsbCwgMCwgMSwgRGF0YUludGVyY2hhbmdlQmVhbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfQ09NUE9TSVRFLCBJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKKwkJaW5pdEVSZWZlcmVuY2UoZ2V0RGF0YUludGVyY2hhbmdlQmVhbl9MYXRlc3RFeHBQcm9wZXJ0eSgpLCB0aGVPU0JQRW50aXR5UGFja2FnZS5nZXRMRW50aXR5QXR0cmlidXRlKCksIG51bGwsICJsYXRlc3RFeHBQcm9wZXJ0eSIsIG51bGwsIDAsIDEsIERhdGFJbnRlcmNoYW5nZUJlYW4uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX0NPTVBPU0lURSwgSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7CiAJCWluaXRFQXR0cmlidXRlKGdldERhdGFJbnRlcmNoYW5nZUJlYW5fRWxlbWVudE1hcCgpLCB0aGVFY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAiZWxlbWVudE1hcCIsIG51bGwsIDAsIDEsIERhdGFJbnRlcmNoYW5nZUJlYW4uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgIUlTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwogCQlpbml0RUF0dHJpYnV0ZShnZXREYXRhSW50ZXJjaGFuZ2VCZWFuX05vZGVOYW1lKCksIHRoZUVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJub2RlTmFtZSIsIG51bGwsIDAsIDEsIERhdGFJbnRlcmNoYW5nZUJlYW4uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgIUlTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwogCQlpbml0RVJlZmVyZW5jZShnZXREYXRhSW50ZXJjaGFuZ2VCZWFuX0xvb2t1cCgpLCB0aGlzLmdldERhdGFJbnRlcmNoYW5nZUxvb2t1cCgpLCBudWxsLCAibG9va3VwIiwgbnVsbCwgMCwgLTEsIERhdGFJbnRlcmNoYW5nZUJlYW4uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7CkBAIC0xMzc5LDYgKzE2NjAsOCBAQAogCQlpbml0RVJlZmVyZW5jZShnZXREYXRhSW50ZXJjaGFuZ2VCZWFuX0V4cHJlc3Npb24oKSwgdGhpcy5nZXREYXRhSW50ZXJjaGFuZ2VFeHByZXNzaW9uKCksIG51bGwsICJleHByZXNzaW9uIiwgbnVsbCwgMCwgLTEsIERhdGFJbnRlcmNoYW5nZUJlYW4uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7CiAJCWluaXRFUmVmZXJlbmNlKGdldERhdGFJbnRlcmNoYW5nZUJlYW5fTWFwcGluZ3MoKSwgdGhpcy5nZXREYXRhSW50ZXJjaGFuZ2VNYXBwaW5nKCksIG51bGwsICJtYXBwaW5ncyIsIG51bGwsIDAsIC0xLCBEYXRhSW50ZXJjaGFuZ2VCZWFuLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwogCQlpbml0RVJlZmVyZW5jZShnZXREYXRhSW50ZXJjaGFuZ2VCZWFuX0xvb2t1cEtleXMoKSwgdGhpcy5nZXREYXRhSW50ZXJjaGFuZ2VLZXkoKSwgbnVsbCwgImxvb2t1cEtleXMiLCBudWxsLCAwLCAtMSwgRGF0YUludGVyY2hhbmdlQmVhbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKKwkJaW5pdEVSZWZlcmVuY2UoZ2V0RGF0YUludGVyY2hhbmdlQmVhbl9FeHBvcnRFeHBvc2VzKCksIHRoaXMuZ2V0RGF0YUludGVyY2hhbmdlRXhwb3NlKCksIG51bGwsICJleHBvcnRFeHBvc2VzIiwgbnVsbCwgMCwgLTEsIERhdGFJbnRlcmNoYW5nZUJlYW4uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7CisJCWluaXRFUmVmZXJlbmNlKGdldERhdGFJbnRlcmNoYW5nZUJlYW5fRXhwb3J0RmlsdGVyKCksIHRoaXMuZ2V0RGF0YUludGVyY2hhbmdlRXhwb3J0RmlsdGVyKCksIG51bGwsICJleHBvcnRGaWx0ZXIiLCBudWxsLCAwLCAxLCBEYXRhSW50ZXJjaGFuZ2VCZWFuLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwogCiAJCWluaXRFQ2xhc3MoZGF0YUludGVyY2hhbmdlS2V5RUNsYXNzLCBEYXRhSW50ZXJjaGFuZ2VLZXkuY2xhc3MsICJEYXRhSW50ZXJjaGFuZ2VLZXkiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7CiAJCWluaXRFUmVmZXJlbmNlKGdldERhdGFJbnRlcmNoYW5nZUtleV9Qcm9wZXJ0eSgpLCB0aGVPU0JQRW50aXR5UGFja2FnZS5nZXRMRW50aXR5QXR0cmlidXRlKCksIG51bGwsICJwcm9wZXJ0eSIsIG51bGwsIDAsIDEsIERhdGFJbnRlcmNoYW5nZUtleS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfQ09NUE9TSVRFLCBJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKQEAgLTE0MTAsNiArMTY5MywyNSBAQAogCQlpbml0RUF0dHJpYnV0ZShnZXREYXRhSW50ZXJjaGFuZ2VMb29rdXBfQ2FjaGVTaXplKCksIHRoZUVjb3JlUGFja2FnZS5nZXRFSW50KCksICJjYWNoZVNpemUiLCBudWxsLCAwLCAxLCBEYXRhSW50ZXJjaGFuZ2VMb29rdXAuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgIUlTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwogCQlpbml0RVJlZmVyZW5jZShnZXREYXRhSW50ZXJjaGFuZ2VMb29rdXBfTWFya2VyUGF0aCgpLCB0aGlzLmdldERhdGFJbnRlcmNoYW5nZU1hcmtlclBhdGgoKSwgbnVsbCwgIm1hcmtlclBhdGgiLCBudWxsLCAwLCAxLCBEYXRhSW50ZXJjaGFuZ2VMb29rdXAuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7CiAKKwkJaW5pdEVDbGFzcyhkYXRhSW50ZXJjaGFuZ2VFeHBvc2VFQ2xhc3MsIERhdGFJbnRlcmNoYW5nZUV4cG9zZS5jbGFzcywgIkRhdGFJbnRlcmNoYW5nZUV4cG9zZSIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKKwkJaW5pdEVSZWZlcmVuY2UoZ2V0RGF0YUludGVyY2hhbmdlRXhwb3NlX1JlZkVudGl0eSgpLCB0aGVPU0JQRW50aXR5UGFja2FnZS5nZXRMRW50aXR5UmVmZXJlbmNlKCksIG51bGwsICJyZWZFbnRpdHkiLCBudWxsLCAwLCAxLCBEYXRhSW50ZXJjaGFuZ2VFeHBvc2UuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX0NPTVBPU0lURSwgSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7CisJCWluaXRFUmVmZXJlbmNlKGdldERhdGFJbnRlcmNoYW5nZUV4cG9zZV9SZWZQcm9wZXJ0eSgpLCB0aGVPU0JQRW50aXR5UGFja2FnZS5nZXRMRW50aXR5QXR0cmlidXRlKCksIG51bGwsICJyZWZQcm9wZXJ0eSIsIG51bGwsIDAsIDEsIERhdGFJbnRlcmNoYW5nZUV4cG9zZS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfQ09NUE9TSVRFLCBJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKKwkJaW5pdEVSZWZlcmVuY2UoZ2V0RGF0YUludGVyY2hhbmdlRXhwb3NlX1N1YkV4cG9zZSgpLCB0aGlzLmdldERhdGFJbnRlcmNoYW5nZUV4cG9zZSgpLCBudWxsLCAic3ViRXhwb3NlIiwgbnVsbCwgMCwgMSwgRGF0YUludGVyY2hhbmdlRXhwb3NlLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOworCisJCWluaXRFQ2xhc3MoZGF0YUludGVyY2hhbmdlRXhwb3J0RmlsdGVyRUNsYXNzLCBEYXRhSW50ZXJjaGFuZ2VFeHBvcnRGaWx0ZXIuY2xhc3MsICJEYXRhSW50ZXJjaGFuZ2VFeHBvcnRGaWx0ZXIiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7CisJCWluaXRFUmVmZXJlbmNlKGdldERhdGFJbnRlcmNoYW5nZUV4cG9ydEZpbHRlcl9Db25kaXRpb24oKSwgdGhpcy5nZXREYXRhSW50ZXJjaGFuZ2VGaWx0ZXJDb25kaXRpb24oKSwgbnVsbCwgImNvbmRpdGlvbiIsIG51bGwsIDAsIDEsIERhdGFJbnRlcmNoYW5nZUV4cG9ydEZpbHRlci5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKKwkJaW5pdEVSZWZlcmVuY2UoZ2V0RGF0YUludGVyY2hhbmdlRXhwb3J0RmlsdGVyX0hpZGRlbnByb3BlcnRpZXMoKSwgdGhpcy5nZXREYXRhSW50ZXJjaGFuZ2VFeHBvcnRIaWRlKCksIG51bGwsICJoaWRkZW5wcm9wZXJ0aWVzIiwgbnVsbCwgMCwgLTEsIERhdGFJbnRlcmNoYW5nZUV4cG9ydEZpbHRlci5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKKworCQlpbml0RUNsYXNzKGRhdGFJbnRlcmNoYW5nZUZpbHRlckNvbmRpdGlvbkVDbGFzcywgRGF0YUludGVyY2hhbmdlRmlsdGVyQ29uZGl0aW9uLmNsYXNzLCAiRGF0YUludGVyY2hhbmdlRmlsdGVyQ29uZGl0aW9uIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOworCQlpbml0RVJlZmVyZW5jZShnZXREYXRhSW50ZXJjaGFuZ2VGaWx0ZXJDb25kaXRpb25fUmVmUHJvcGVydHkoKSwgdGhlT1NCUEVudGl0eVBhY2thZ2UuZ2V0TEVudGl0eUZlYXR1cmUoKSwgbnVsbCwgInJlZlByb3BlcnR5IiwgbnVsbCwgMCwgMSwgRGF0YUludGVyY2hhbmdlRmlsdGVyQ29uZGl0aW9uLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19DT01QT1NJVEUsIElTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOworCQlpbml0RUF0dHJpYnV0ZShnZXREYXRhSW50ZXJjaGFuZ2VGaWx0ZXJDb25kaXRpb25fT3BlcmF0b3IoKSwgdGhpcy5nZXRDb25kaXRpb25BbmRPcGVyYXRvcjEoKSwgIm9wZXJhdG9yIiwgbnVsbCwgMCwgMSwgRGF0YUludGVyY2hhbmdlRmlsdGVyQ29uZGl0aW9uLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsICFJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKKwkJaW5pdEVBdHRyaWJ1dGUoZ2V0RGF0YUludGVyY2hhbmdlRmlsdGVyQ29uZGl0aW9uX1ZhbHVlKCksIHRoZUVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJ2YWx1ZSIsIG51bGwsIDAsIDEsIERhdGFJbnRlcmNoYW5nZUZpbHRlckNvbmRpdGlvbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7CisJCWluaXRFQXR0cmlidXRlKGdldERhdGFJbnRlcmNoYW5nZUZpbHRlckNvbmRpdGlvbl9PcGVyYXRvcjIoKSwgdGhpcy5nZXRDb25kaXRpb25BbmRPcGVyYXRvcjIoKSwgIm9wZXJhdG9yMiIsIG51bGwsIDAsIDEsIERhdGFJbnRlcmNoYW5nZUZpbHRlckNvbmRpdGlvbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7CisJCWluaXRFUmVmZXJlbmNlKGdldERhdGFJbnRlcmNoYW5nZUZpbHRlckNvbmRpdGlvbl9TdWJjb25kaXRpb24oKSwgdGhpcy5nZXREYXRhSW50ZXJjaGFuZ2VGaWx0ZXJDb25kaXRpb24oKSwgbnVsbCwgInN1YmNvbmRpdGlvbiIsIG51bGwsIDAsIDEsIERhdGFJbnRlcmNoYW5nZUZpbHRlckNvbmRpdGlvbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKKworCQlpbml0RUNsYXNzKGRhdGFJbnRlcmNoYW5nZUV4cG9ydEhpZGVFQ2xhc3MsIERhdGFJbnRlcmNoYW5nZUV4cG9ydEhpZGUuY2xhc3MsICJEYXRhSW50ZXJjaGFuZ2VFeHBvcnRIaWRlIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOworCQlpbml0RVJlZmVyZW5jZShnZXREYXRhSW50ZXJjaGFuZ2VFeHBvcnRIaWRlX1Byb3BlcnR5KCksIHRoZU9TQlBFbnRpdHlQYWNrYWdlLmdldExFbnRpdHlGZWF0dXJlKCksIG51bGwsICJwcm9wZXJ0eSIsIG51bGwsIDAsIDEsIERhdGFJbnRlcmNoYW5nZUV4cG9ydEhpZGUuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX0NPTVBPU0lURSwgSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7CisKIAkJaW5pdEVDbGFzcyhkYXRhSW50ZXJjaGFuZ2VNYXJrZXJQYXRoRUNsYXNzLCBEYXRhSW50ZXJjaGFuZ2VNYXJrZXJQYXRoLmNsYXNzLCAiRGF0YUludGVyY2hhbmdlTWFya2VyUGF0aCIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKIAkJaW5pdEVSZWZlcmVuY2UoZ2V0RGF0YUludGVyY2hhbmdlTWFya2VyUGF0aF9QYXRoKCksIHRoaXMuZ2V0RGF0YUludGVyY2hhbmdlTWFya2VyRW50aXR5KCksIG51bGwsICJwYXRoIiwgbnVsbCwgMCwgLTEsIERhdGFJbnRlcmNoYW5nZU1hcmtlclBhdGguY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7CiAKQEAgLTE0NTUsNiArMTc1NywyNSBAQAogCQlhZGRFRW51bUxpdGVyYWwoZW50aXR5TWFuYWdlck1vZGVFRW51bSwgRW50aXR5TWFuYWdlck1vZGUuTUVSR0UpOwogCQlhZGRFRW51bUxpdGVyYWwoZW50aXR5TWFuYWdlck1vZGVFRW51bSwgRW50aXR5TWFuYWdlck1vZGUuUkVNT1ZFKTsKIAorCQlpbml0RUVudW0oY29uZGl0aW9uQW5kT3BlcmF0b3IxRUVudW0sIENvbmRpdGlvbkFuZE9wZXJhdG9yMS5jbGFzcywgIkNvbmRpdGlvbkFuZE9wZXJhdG9yMSIpOworCQlhZGRFRW51bUxpdGVyYWwoY29uZGl0aW9uQW5kT3BlcmF0b3IxRUVudW0sIENvbmRpdGlvbkFuZE9wZXJhdG9yMS5FUVVBTFMpOworCQlhZGRFRW51bUxpdGVyYWwoY29uZGl0aW9uQW5kT3BlcmF0b3IxRUVudW0sIENvbmRpdGlvbkFuZE9wZXJhdG9yMS5OT1RFUVVBTFMpOworCQlhZGRFRW51bUxpdGVyYWwoY29uZGl0aW9uQW5kT3BlcmF0b3IxRUVudW0sIENvbmRpdGlvbkFuZE9wZXJhdG9yMS5HUkVBVEVSVEhFTik7CisJCWFkZEVFbnVtTGl0ZXJhbChjb25kaXRpb25BbmRPcGVyYXRvcjFFRW51bSwgQ29uZGl0aW9uQW5kT3BlcmF0b3IxLkdSRUFURVJUSEVOT1JFUVVBTFRPKTsKKwkJYWRkRUVudW1MaXRlcmFsKGNvbmRpdGlvbkFuZE9wZXJhdG9yMUVFbnVtLCBDb25kaXRpb25BbmRPcGVyYXRvcjEuTEVTU1RIRU4pOworCQlhZGRFRW51bUxpdGVyYWwoY29uZGl0aW9uQW5kT3BlcmF0b3IxRUVudW0sIENvbmRpdGlvbkFuZE9wZXJhdG9yMS5MRVNTVEhFTk9SRVFVQUxUTyk7CisJCWFkZEVFbnVtTGl0ZXJhbChjb25kaXRpb25BbmRPcGVyYXRvcjFFRW51bSwgQ29uZGl0aW9uQW5kT3BlcmF0b3IxLklOKTsKKwkJYWRkRUVudW1MaXRlcmFsKGNvbmRpdGlvbkFuZE9wZXJhdG9yMUVFbnVtLCBDb25kaXRpb25BbmRPcGVyYXRvcjEuQkVUV0VFTik7CisJCWFkZEVFbnVtTGl0ZXJhbChjb25kaXRpb25BbmRPcGVyYXRvcjFFRW51bSwgQ29uZGl0aW9uQW5kT3BlcmF0b3IxLkxJS0UpOworCQlhZGRFRW51bUxpdGVyYWwoY29uZGl0aW9uQW5kT3BlcmF0b3IxRUVudW0sIENvbmRpdGlvbkFuZE9wZXJhdG9yMS5OT1QpOworCQlhZGRFRW51bUxpdGVyYWwoY29uZGl0aW9uQW5kT3BlcmF0b3IxRUVudW0sIENvbmRpdGlvbkFuZE9wZXJhdG9yMS5JU05VTEwpOworCQlhZGRFRW51bUxpdGVyYWwoY29uZGl0aW9uQW5kT3BlcmF0b3IxRUVudW0sIENvbmRpdGlvbkFuZE9wZXJhdG9yMS5JU05PVE5VTEwpOworCQlhZGRFRW51bUxpdGVyYWwoY29uZGl0aW9uQW5kT3BlcmF0b3IxRUVudW0sIENvbmRpdGlvbkFuZE9wZXJhdG9yMS5FWElTVFMpOworCisJCWluaXRFRW51bShjb25kaXRpb25BbmRPcGVyYXRvcjJFRW51bSwgQ29uZGl0aW9uQW5kT3BlcmF0b3IyLmNsYXNzLCAiQ29uZGl0aW9uQW5kT3BlcmF0b3IyIik7CisJCWFkZEVFbnVtTGl0ZXJhbChjb25kaXRpb25BbmRPcGVyYXRvcjJFRW51bSwgQ29uZGl0aW9uQW5kT3BlcmF0b3IyLkFORCk7CisJCWFkZEVFbnVtTGl0ZXJhbChjb25kaXRpb25BbmRPcGVyYXRvcjJFRW51bSwgQ29uZGl0aW9uQW5kT3BlcmF0b3IyLk9SKTsKKwogCQkvLyBJbml0aWFsaXplIGRhdGEgdHlwZXMKIAkJaW5pdEVEYXRhVHlwZShpbnRlcm5hbEVPYmplY3RFRGF0YVR5cGUsIEludGVybmFsRU9iamVjdC5jbGFzcywgIkludGVybmFsRU9iamVjdCIsIElTX1NFUklBTElaQUJMRSwgIUlTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7CiAKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLm9zYnAueHRleHQuZGF0YWludGVyY2hhbmdlL2VtZi1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9kYXRhaW50ZXJjaGFuZ2UvaW1wbC9EYXRhSW50ZXJjaGFuZ2VCYXNlSW1wbC5qYXZhIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5kYXRhaW50ZXJjaGFuZ2UvZW1mLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2RhdGFpbnRlcmNoYW5nZS9pbXBsL0RhdGFJbnRlcmNoYW5nZUJhc2VJbXBsLmphdmEKaW5kZXggNTUxY2Q5Ny4uNmIzZjc0YiAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5kYXRhaW50ZXJjaGFuZ2UvZW1mLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2RhdGFpbnRlcmNoYW5nZS9pbXBsL0RhdGFJbnRlcmNoYW5nZUJhc2VJbXBsLmphdmEKKysrIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5kYXRhaW50ZXJjaGFuZ2UvZW1mLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2RhdGFpbnRlcmNoYW5nZS9pbXBsL0RhdGFJbnRlcmNoYW5nZUJhc2VJbXBsLmphdmEKQEAgLTEsMTMgKzEsMTUgQEAKIC8qKgogICogQ29weXJpZ2h0IChjKSAyMDE0LCBMb2V0eiBHbWJIJkNvLktHIChIZWlkZWxiZXJnKQogICogIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIAorICogIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgMi4wICAKICAqICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAKLSAqICBodHRwey8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCAKKyAqICBodHRwczovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLyAKKyAqIAorICogIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIAogICogCiAgKiAgQmFzZWQgb24gaWRlYXMgZnJvbSBYdGV4dCwgWHRlbmQsIFhjb3JlCiAgKiAgIAotICogIENvbnRyaWJ1dG9yc3sgIAorICogIENvbnRyaWJ1dG9yczogIAogICogIAkJSm9lcmcgUmllZ2VsIC0gSW5pdGlhbCBpbXBsZW1lbnRhdGlvbiAKICAqICAKICAqLwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5kYXRhaW50ZXJjaGFuZ2UvZW1mLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2RhdGFpbnRlcmNoYW5nZS9pbXBsL0RhdGFJbnRlcmNoYW5nZUJlYW5JbXBsLmphdmEgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmRhdGFpbnRlcmNoYW5nZS9lbWYtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvZGF0YWludGVyY2hhbmdlL2ltcGwvRGF0YUludGVyY2hhbmdlQmVhbkltcGwuamF2YQppbmRleCAwZDgwODZhLi44MTFkYjk1IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmRhdGFpbnRlcmNoYW5nZS9lbWYtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvZGF0YWludGVyY2hhbmdlL2ltcGwvRGF0YUludGVyY2hhbmdlQmVhbkltcGwuamF2YQorKysgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmRhdGFpbnRlcmNoYW5nZS9lbWYtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvZGF0YWludGVyY2hhbmdlL2ltcGwvRGF0YUludGVyY2hhbmdlQmVhbkltcGwuamF2YQpAQCAtMSwxMyArMSwxNSBAQAogLyoqCiAgKiBDb3B5cmlnaHQgKGMpIDIwMTQsIExvZXR6IEdtYkgmQ28uS0cgKEhlaWRlbGJlcmcpCiAgKiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgCisgKiAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSAyLjAgIAogICogIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IAotICogIGh0dHB7Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIAorICogIGh0dHBzOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAvIAorICogCisgKiAgU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgCiAgKiAKICAqICBCYXNlZCBvbiBpZGVhcyBmcm9tIFh0ZXh0LCBYdGVuZCwgWGNvcmUKICAqICAgCi0gKiAgQ29udHJpYnV0b3JzeyAgCisgKiAgQ29udHJpYnV0b3JzOiAgCiAgKiAgCQlKb2VyZyBSaWVnZWwgLSBJbml0aWFsIGltcGxlbWVudGF0aW9uIAogICogIAogICovCkBAIC0zMyw2ICszNSw4IEBACiAKIGltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmRhdGFpbnRlcmNoYW5nZS5EYXRhRFNMUGFja2FnZTsKIGltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmRhdGFpbnRlcmNoYW5nZS5EYXRhSW50ZXJjaGFuZ2VCZWFuOworaW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAueHRleHQuZGF0YWludGVyY2hhbmdlLkRhdGFJbnRlcmNoYW5nZUV4cG9ydEZpbHRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmRhdGFpbnRlcmNoYW5nZS5EYXRhSW50ZXJjaGFuZ2VFeHBvc2U7CiBpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5kYXRhaW50ZXJjaGFuZ2UuRGF0YUludGVyY2hhbmdlRXhwcmVzc2lvbjsKIGltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmRhdGFpbnRlcmNoYW5nZS5EYXRhSW50ZXJjaGFuZ2VGb3JtYXQ7CiBpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5kYXRhaW50ZXJjaGFuZ2UuRGF0YUludGVyY2hhbmdlS2V5OwpAQCAtNDgsOSArNTIsMTEgQEAKICAqIDwvcD4KICAqIDx1bD4KICAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmRhdGFpbnRlcmNoYW5nZS5pbXBsLkRhdGFJbnRlcmNoYW5nZUJlYW5JbXBsI2dldEVudGl0eSA8ZW0+RW50aXR5PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmRhdGFpbnRlcmNoYW5nZS5pbXBsLkRhdGFJbnRlcmNoYW5nZUJlYW5JbXBsI2lzTWFya0xhdGVzdCA8ZW0+TWFyayBMYXRlc3Q8L2VtPn08L2xpPgorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQuZGF0YWludGVyY2hhbmdlLmltcGwuRGF0YUludGVyY2hhbmdlQmVhbkltcGwjaXNNYXJrTGF0ZXN0SW1wb3J0IDxlbT5NYXJrIExhdGVzdCBJbXBvcnQ8L2VtPn08L2xpPgorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQuZGF0YWludGVyY2hhbmdlLmltcGwuRGF0YUludGVyY2hhbmdlQmVhbkltcGwjaXNNYXJrTGF0ZXN0RXhwb3J0IDxlbT5NYXJrIExhdGVzdCBFeHBvcnQ8L2VtPn08L2xpPgogICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQuZGF0YWludGVyY2hhbmdlLmltcGwuRGF0YUludGVyY2hhbmdlQmVhbkltcGwjaXNIYXNCbG9iTWFwcGluZyA8ZW0+SGFzIEJsb2IgTWFwcGluZzwvZW0+fTwvbGk+CiAgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5kYXRhaW50ZXJjaGFuZ2UuaW1wbC5EYXRhSW50ZXJjaGFuZ2VCZWFuSW1wbCNnZXRMYXRlc3RQcm9wZXJ0eSA8ZW0+TGF0ZXN0IFByb3BlcnR5PC9lbT59PC9saT4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmRhdGFpbnRlcmNoYW5nZS5pbXBsLkRhdGFJbnRlcmNoYW5nZUJlYW5JbXBsI2dldExhdGVzdEV4cFByb3BlcnR5IDxlbT5MYXRlc3QgRXhwIFByb3BlcnR5PC9lbT59PC9saT4KICAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmRhdGFpbnRlcmNoYW5nZS5pbXBsLkRhdGFJbnRlcmNoYW5nZUJlYW5JbXBsI2dldEVsZW1lbnRNYXAgPGVtPkVsZW1lbnQgTWFwPC9lbT59PC9saT4KICAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmRhdGFpbnRlcmNoYW5nZS5pbXBsLkRhdGFJbnRlcmNoYW5nZUJlYW5JbXBsI2dldE5vZGVOYW1lIDxlbT5Ob2RlIE5hbWU8L2VtPn08L2xpPgogICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQuZGF0YWludGVyY2hhbmdlLmltcGwuRGF0YUludGVyY2hhbmdlQmVhbkltcGwjZ2V0TG9va3VwIDxlbT5Mb29rdXA8L2VtPn08L2xpPgpAQCAtNTgsNiArNjQsOCBAQAogICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQuZGF0YWludGVyY2hhbmdlLmltcGwuRGF0YUludGVyY2hhbmdlQmVhbkltcGwjZ2V0RXhwcmVzc2lvbiA8ZW0+RXhwcmVzc2lvbjwvZW0+fTwvbGk+CiAgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5kYXRhaW50ZXJjaGFuZ2UuaW1wbC5EYXRhSW50ZXJjaGFuZ2VCZWFuSW1wbCNnZXRNYXBwaW5ncyA8ZW0+TWFwcGluZ3M8L2VtPn08L2xpPgogICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQuZGF0YWludGVyY2hhbmdlLmltcGwuRGF0YUludGVyY2hhbmdlQmVhbkltcGwjZ2V0TG9va3VwS2V5cyA8ZW0+TG9va3VwIEtleXM8L2VtPn08L2xpPgorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQuZGF0YWludGVyY2hhbmdlLmltcGwuRGF0YUludGVyY2hhbmdlQmVhbkltcGwjZ2V0RXhwb3J0RXhwb3NlcyA8ZW0+RXhwb3J0IEV4cG9zZXM8L2VtPn08L2xpPgorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQuZGF0YWludGVyY2hhbmdlLmltcGwuRGF0YUludGVyY2hhbmdlQmVhbkltcGwjZ2V0RXhwb3J0RmlsdGVyIDxlbT5FeHBvcnQgRmlsdGVyPC9lbT59PC9saT4KICAqIDwvdWw+CiAgKgogICogQGdlbmVyYXRlZApAQCAtNzQsMjQgKzgyLDQ0IEBACiAJcHJvdGVjdGVkIExFbnRpdHkgZW50aXR5OwogCiAJLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzTWFya0xhdGVzdCgpIDxlbT5NYXJrIExhdGVzdDwvZW0+fScgYXR0cmlidXRlLgorCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc01hcmtMYXRlc3RJbXBvcnQoKSA8ZW0+TWFyayBMYXRlc3QgSW1wb3J0PC9lbT59JyBhdHRyaWJ1dGUuCiAJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc01hcmtMYXRlc3QoKQorCSAqIEBzZWUgI2lzTWFya0xhdGVzdEltcG9ydCgpCiAJICogQGdlbmVyYXRlZAogCSAqIEBvcmRlcmVkCiAJICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBib29sZWFuIE1BUktfTEFURVNUX0VERUZBVUxUID0gZmFsc2U7CisJcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBib29sZWFuIE1BUktfTEFURVNUX0lNUE9SVF9FREVGQVVMVCA9IGZhbHNlOwogCiAJLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNNYXJrTGF0ZXN0KCkgPGVtPk1hcmsgTGF0ZXN0PC9lbT59JyBhdHRyaWJ1dGUuCisJICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNNYXJrTGF0ZXN0SW1wb3J0KCkgPGVtPk1hcmsgTGF0ZXN0IEltcG9ydDwvZW0+fScgYXR0cmlidXRlLgogCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNNYXJrTGF0ZXN0KCkKKwkgKiBAc2VlICNpc01hcmtMYXRlc3RJbXBvcnQoKQogCSAqIEBnZW5lcmF0ZWQKIAkgKiBAb3JkZXJlZAogCSAqLwotCXByb3RlY3RlZCBib29sZWFuIG1hcmtMYXRlc3QgPSBNQVJLX0xBVEVTVF9FREVGQVVMVDsKKwlwcm90ZWN0ZWQgYm9vbGVhbiBtYXJrTGF0ZXN0SW1wb3J0ID0gTUFSS19MQVRFU1RfSU1QT1JUX0VERUZBVUxUOworCisJLyoqCisJICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzTWFya0xhdGVzdEV4cG9ydCgpIDxlbT5NYXJrIExhdGVzdCBFeHBvcnQ8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2lzTWFya0xhdGVzdEV4cG9ydCgpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBib29sZWFuIE1BUktfTEFURVNUX0VYUE9SVF9FREVGQVVMVCA9IGZhbHNlOworCisJLyoqCisJICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNNYXJrTGF0ZXN0RXhwb3J0KCkgPGVtPk1hcmsgTGF0ZXN0IEV4cG9ydDwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjaXNNYXJrTGF0ZXN0RXhwb3J0KCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgYm9vbGVhbiBtYXJrTGF0ZXN0RXhwb3J0ID0gTUFSS19MQVRFU1RfRVhQT1JUX0VERUZBVUxUOwogCiAJLyoqCiAJICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzSGFzQmxvYk1hcHBpbmcoKSA8ZW0+SGFzIEJsb2IgTWFwcGluZzwvZW0+fScgYXR0cmlidXRlLgpAQCAtMTI0LDYgKzE1MiwxNiBAQAogCXByb3RlY3RlZCBMRW50aXR5QXR0cmlidXRlIGxhdGVzdFByb3BlcnR5OwogCiAJLyoqCisJICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TGF0ZXN0RXhwUHJvcGVydHkoKSA8ZW0+TGF0ZXN0IEV4cCBQcm9wZXJ0eTwvZW0+fScgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjZ2V0TGF0ZXN0RXhwUHJvcGVydHkoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBMRW50aXR5QXR0cmlidXRlIGxhdGVzdEV4cFByb3BlcnR5OworCisJLyoqCiAJICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEVsZW1lbnRNYXAoKSA8ZW0+RWxlbWVudCBNYXA8L2VtPn0nIGF0dHJpYnV0ZS4KIAkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgpAQCAtMjE0LDYgKzI1MiwyNiBAQAogCXByb3RlY3RlZCBFTGlzdDxEYXRhSW50ZXJjaGFuZ2VLZXk+IGxvb2t1cEtleXM7CiAKIAkvKioKKwkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRFeHBvcnRFeHBvc2VzKCkgPGVtPkV4cG9ydCBFeHBvc2VzPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2dldEV4cG9ydEV4cG9zZXMoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBFTGlzdDxEYXRhSW50ZXJjaGFuZ2VFeHBvc2U+IGV4cG9ydEV4cG9zZXM7CisKKwkvKioKKwkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRFeHBvcnRGaWx0ZXIoKSA8ZW0+RXhwb3J0IEZpbHRlcjwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjZ2V0RXhwb3J0RmlsdGVyKCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgRGF0YUludGVyY2hhbmdlRXhwb3J0RmlsdGVyIGV4cG9ydEZpbHRlcjsKKworCS8qKgogCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZApAQCAtMjc1LDggKzMzMyw4IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLwotCXB1YmxpYyBib29sZWFuIGlzTWFya0xhdGVzdCgpIHsKLQkJcmV0dXJuIG1hcmtMYXRlc3Q7CisJcHVibGljIGJvb2xlYW4gaXNNYXJrTGF0ZXN0SW1wb3J0KCkgeworCQlyZXR1cm4gbWFya0xhdGVzdEltcG9ydDsKIAl9CiAKIAkvKioKQEAgLTI4NCwxMSArMzQyLDMyIEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLwotCXB1YmxpYyB2b2lkIHNldE1hcmtMYXRlc3QoYm9vbGVhbiBuZXdNYXJrTGF0ZXN0KSB7Ci0JCWJvb2xlYW4gb2xkTWFya0xhdGVzdCA9IG1hcmtMYXRlc3Q7Ci0JCW1hcmtMYXRlc3QgPSBuZXdNYXJrTGF0ZXN0OworCXB1YmxpYyB2b2lkIHNldE1hcmtMYXRlc3RJbXBvcnQoYm9vbGVhbiBuZXdNYXJrTGF0ZXN0SW1wb3J0KSB7CisJCWJvb2xlYW4gb2xkTWFya0xhdGVzdEltcG9ydCA9IG1hcmtMYXRlc3RJbXBvcnQ7CisJCW1hcmtMYXRlc3RJbXBvcnQgPSBuZXdNYXJrTGF0ZXN0SW1wb3J0OwogCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBEYXRhRFNMUGFja2FnZS5EQVRBX0lOVEVSQ0hBTkdFX0JFQU5fX01BUktfTEFURVNULCBvbGRNYXJrTGF0ZXN0LCBtYXJrTGF0ZXN0KSk7CisJCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBEYXRhRFNMUGFja2FnZS5EQVRBX0lOVEVSQ0hBTkdFX0JFQU5fX01BUktfTEFURVNUX0lNUE9SVCwgb2xkTWFya0xhdGVzdEltcG9ydCwgbWFya0xhdGVzdEltcG9ydCkpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBib29sZWFuIGlzTWFya0xhdGVzdEV4cG9ydCgpIHsKKwkJcmV0dXJuIG1hcmtMYXRlc3RFeHBvcnQ7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHZvaWQgc2V0TWFya0xhdGVzdEV4cG9ydChib29sZWFuIG5ld01hcmtMYXRlc3RFeHBvcnQpIHsKKwkJYm9vbGVhbiBvbGRNYXJrTGF0ZXN0RXhwb3J0ID0gbWFya0xhdGVzdEV4cG9ydDsKKwkJbWFya0xhdGVzdEV4cG9ydCA9IG5ld01hcmtMYXRlc3RFeHBvcnQ7CisJCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKKwkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIERhdGFEU0xQYWNrYWdlLkRBVEFfSU5URVJDSEFOR0VfQkVBTl9fTUFSS19MQVRFU1RfRVhQT1JULCBvbGRNYXJrTGF0ZXN0RXhwb3J0LCBtYXJrTGF0ZXN0RXhwb3J0KSk7CiAJfQogCiAJLyoqCkBAIC0zNTUsNiArNDM0LDQ0IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLworCXB1YmxpYyBMRW50aXR5QXR0cmlidXRlIGdldExhdGVzdEV4cFByb3BlcnR5KCkgeworCQlpZiAobGF0ZXN0RXhwUHJvcGVydHkgIT0gbnVsbCAmJiBsYXRlc3RFeHBQcm9wZXJ0eS5lSXNQcm94eSgpKSB7CisJCQlJbnRlcm5hbEVPYmplY3Qgb2xkTGF0ZXN0RXhwUHJvcGVydHkgPSAoSW50ZXJuYWxFT2JqZWN0KWxhdGVzdEV4cFByb3BlcnR5OworCQkJbGF0ZXN0RXhwUHJvcGVydHkgPSAoTEVudGl0eUF0dHJpYnV0ZSllUmVzb2x2ZVByb3h5KG9sZExhdGVzdEV4cFByb3BlcnR5KTsKKwkJCWlmIChsYXRlc3RFeHBQcm9wZXJ0eSAhPSBvbGRMYXRlc3RFeHBQcm9wZXJ0eSkgeworCQkJCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKKwkJCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlJFU09MVkUsIERhdGFEU0xQYWNrYWdlLkRBVEFfSU5URVJDSEFOR0VfQkVBTl9fTEFURVNUX0VYUF9QUk9QRVJUWSwgb2xkTGF0ZXN0RXhwUHJvcGVydHksIGxhdGVzdEV4cFByb3BlcnR5KSk7CisJCQl9CisJCX0KKwkJcmV0dXJuIGxhdGVzdEV4cFByb3BlcnR5OworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBMRW50aXR5QXR0cmlidXRlIGJhc2ljR2V0TGF0ZXN0RXhwUHJvcGVydHkoKSB7CisJCXJldHVybiBsYXRlc3RFeHBQcm9wZXJ0eTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXRMYXRlc3RFeHBQcm9wZXJ0eShMRW50aXR5QXR0cmlidXRlIG5ld0xhdGVzdEV4cFByb3BlcnR5KSB7CisJCUxFbnRpdHlBdHRyaWJ1dGUgb2xkTGF0ZXN0RXhwUHJvcGVydHkgPSBsYXRlc3RFeHBQcm9wZXJ0eTsKKwkJbGF0ZXN0RXhwUHJvcGVydHkgPSBuZXdMYXRlc3RFeHBQcm9wZXJ0eTsKKwkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQorCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRGF0YURTTFBhY2thZ2UuREFUQV9JTlRFUkNIQU5HRV9CRUFOX19MQVRFU1RfRVhQX1BST1BFUlRZLCBvbGRMYXRlc3RFeHBQcm9wZXJ0eSwgbGF0ZXN0RXhwUHJvcGVydHkpKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KIAlwdWJsaWMgU3RyaW5nIGdldEVsZW1lbnRNYXAoKSB7CiAJCXJldHVybiBlbGVtZW50TWFwOwogCX0KQEAgLTQ1Nyw2ICs1NzQsNjEgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJcHVibGljIEVMaXN0PERhdGFJbnRlcmNoYW5nZUV4cG9zZT4gZ2V0RXhwb3J0RXhwb3NlcygpIHsKKwkJaWYgKGV4cG9ydEV4cG9zZXMgPT0gbnVsbCkgeworCQkJZXhwb3J0RXhwb3NlcyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdDxEYXRhSW50ZXJjaGFuZ2VFeHBvc2U+KERhdGFJbnRlcmNoYW5nZUV4cG9zZS5jbGFzcywgdGhpcywgRGF0YURTTFBhY2thZ2UuREFUQV9JTlRFUkNIQU5HRV9CRUFOX19FWFBPUlRfRVhQT1NFUyk7CisJCX0KKwkJcmV0dXJuIGV4cG9ydEV4cG9zZXM7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIERhdGFJbnRlcmNoYW5nZUV4cG9ydEZpbHRlciBnZXRFeHBvcnRGaWx0ZXIoKSB7CisJCXJldHVybiBleHBvcnRGaWx0ZXI7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGJhc2ljU2V0RXhwb3J0RmlsdGVyKERhdGFJbnRlcmNoYW5nZUV4cG9ydEZpbHRlciBuZXdFeHBvcnRGaWx0ZXIsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKKwkJRGF0YUludGVyY2hhbmdlRXhwb3J0RmlsdGVyIG9sZEV4cG9ydEZpbHRlciA9IGV4cG9ydEZpbHRlcjsKKwkJZXhwb3J0RmlsdGVyID0gbmV3RXhwb3J0RmlsdGVyOworCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpIHsKKwkJCUVOb3RpZmljYXRpb25JbXBsIG5vdGlmaWNhdGlvbiA9IG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBEYXRhRFNMUGFja2FnZS5EQVRBX0lOVEVSQ0hBTkdFX0JFQU5fX0VYUE9SVF9GSUxURVIsIG9sZEV4cG9ydEZpbHRlciwgbmV3RXhwb3J0RmlsdGVyKTsKKwkJCWlmIChtc2dzID09IG51bGwpIG1zZ3MgPSBub3RpZmljYXRpb247IGVsc2UgbXNncy5hZGQobm90aWZpY2F0aW9uKTsKKwkJfQorCQlyZXR1cm4gbXNnczsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXRFeHBvcnRGaWx0ZXIoRGF0YUludGVyY2hhbmdlRXhwb3J0RmlsdGVyIG5ld0V4cG9ydEZpbHRlcikgeworCQlpZiAobmV3RXhwb3J0RmlsdGVyICE9IGV4cG9ydEZpbHRlcikgeworCQkJTm90aWZpY2F0aW9uQ2hhaW4gbXNncyA9IG51bGw7CisJCQlpZiAoZXhwb3J0RmlsdGVyICE9IG51bGwpCisJCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KWV4cG9ydEZpbHRlcikuZUludmVyc2VSZW1vdmUodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIERhdGFEU0xQYWNrYWdlLkRBVEFfSU5URVJDSEFOR0VfQkVBTl9fRVhQT1JUX0ZJTFRFUiwgbnVsbCwgbXNncyk7CisJCQlpZiAobmV3RXhwb3J0RmlsdGVyICE9IG51bGwpCisJCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KW5ld0V4cG9ydEZpbHRlcikuZUludmVyc2VBZGQodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIERhdGFEU0xQYWNrYWdlLkRBVEFfSU5URVJDSEFOR0VfQkVBTl9fRVhQT1JUX0ZJTFRFUiwgbnVsbCwgbXNncyk7CisJCQltc2dzID0gYmFzaWNTZXRFeHBvcnRGaWx0ZXIobmV3RXhwb3J0RmlsdGVyLCBtc2dzKTsKKwkJCWlmIChtc2dzICE9IG51bGwpIG1zZ3MuZGlzcGF0Y2goKTsKKwkJfQorCQllbHNlIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKKwkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIERhdGFEU0xQYWNrYWdlLkRBVEFfSU5URVJDSEFOR0VfQkVBTl9fRVhQT1JUX0ZJTFRFUiwgbmV3RXhwb3J0RmlsdGVyLCBuZXdFeHBvcnRGaWx0ZXIpKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KIAlAT3ZlcnJpZGUKIAlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7CiAJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CkBAIC00NzAsNiArNjQyLDEwIEBACiAJCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdDw/PilnZXRNYXBwaW5ncygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7CiAJCQljYXNlIERhdGFEU0xQYWNrYWdlLkRBVEFfSU5URVJDSEFOR0VfQkVBTl9fTE9PS1VQX0tFWVM6CiAJCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdDw/PilnZXRMb29rdXBLZXlzKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKKwkJCWNhc2UgRGF0YURTTFBhY2thZ2UuREFUQV9JTlRFUkNIQU5HRV9CRUFOX19FWFBPUlRfRVhQT1NFUzoKKwkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0PD8+KWdldEV4cG9ydEV4cG9zZXMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOworCQkJY2FzZSBEYXRhRFNMUGFja2FnZS5EQVRBX0lOVEVSQ0hBTkdFX0JFQU5fX0VYUE9SVF9GSUxURVI6CisJCQkJcmV0dXJuIGJhc2ljU2V0RXhwb3J0RmlsdGVyKG51bGwsIG1zZ3MpOwogCQl9CiAJCXJldHVybiBzdXBlci5lSW52ZXJzZVJlbW92ZShvdGhlckVuZCwgZmVhdHVyZUlELCBtc2dzKTsKIAl9CkBAIC00ODUsMTMgKzY2MSwxOCBAQAogCQkJY2FzZSBEYXRhRFNMUGFja2FnZS5EQVRBX0lOVEVSQ0hBTkdFX0JFQU5fX0VOVElUWToKIAkJCQlpZiAocmVzb2x2ZSkgcmV0dXJuIGdldEVudGl0eSgpOwogCQkJCXJldHVybiBiYXNpY0dldEVudGl0eSgpOwotCQkJY2FzZSBEYXRhRFNMUGFja2FnZS5EQVRBX0lOVEVSQ0hBTkdFX0JFQU5fX01BUktfTEFURVNUOgotCQkJCXJldHVybiBpc01hcmtMYXRlc3QoKTsKKwkJCWNhc2UgRGF0YURTTFBhY2thZ2UuREFUQV9JTlRFUkNIQU5HRV9CRUFOX19NQVJLX0xBVEVTVF9JTVBPUlQ6CisJCQkJcmV0dXJuIGlzTWFya0xhdGVzdEltcG9ydCgpOworCQkJY2FzZSBEYXRhRFNMUGFja2FnZS5EQVRBX0lOVEVSQ0hBTkdFX0JFQU5fX01BUktfTEFURVNUX0VYUE9SVDoKKwkJCQlyZXR1cm4gaXNNYXJrTGF0ZXN0RXhwb3J0KCk7CiAJCQljYXNlIERhdGFEU0xQYWNrYWdlLkRBVEFfSU5URVJDSEFOR0VfQkVBTl9fSEFTX0JMT0JfTUFQUElORzoKIAkJCQlyZXR1cm4gaXNIYXNCbG9iTWFwcGluZygpOwogCQkJY2FzZSBEYXRhRFNMUGFja2FnZS5EQVRBX0lOVEVSQ0hBTkdFX0JFQU5fX0xBVEVTVF9QUk9QRVJUWToKIAkJCQlpZiAocmVzb2x2ZSkgcmV0dXJuIGdldExhdGVzdFByb3BlcnR5KCk7CiAJCQkJcmV0dXJuIGJhc2ljR2V0TGF0ZXN0UHJvcGVydHkoKTsKKwkJCWNhc2UgRGF0YURTTFBhY2thZ2UuREFUQV9JTlRFUkNIQU5HRV9CRUFOX19MQVRFU1RfRVhQX1BST1BFUlRZOgorCQkJCWlmIChyZXNvbHZlKSByZXR1cm4gZ2V0TGF0ZXN0RXhwUHJvcGVydHkoKTsKKwkJCQlyZXR1cm4gYmFzaWNHZXRMYXRlc3RFeHBQcm9wZXJ0eSgpOwogCQkJY2FzZSBEYXRhRFNMUGFja2FnZS5EQVRBX0lOVEVSQ0hBTkdFX0JFQU5fX0VMRU1FTlRfTUFQOgogCQkJCXJldHVybiBnZXRFbGVtZW50TWFwKCk7CiAJCQljYXNlIERhdGFEU0xQYWNrYWdlLkRBVEFfSU5URVJDSEFOR0VfQkVBTl9fTk9ERV9OQU1FOgpAQCAtNTA2LDYgKzY4NywxMCBAQAogCQkJCXJldHVybiBnZXRNYXBwaW5ncygpOwogCQkJY2FzZSBEYXRhRFNMUGFja2FnZS5EQVRBX0lOVEVSQ0hBTkdFX0JFQU5fX0xPT0tVUF9LRVlTOgogCQkJCXJldHVybiBnZXRMb29rdXBLZXlzKCk7CisJCQljYXNlIERhdGFEU0xQYWNrYWdlLkRBVEFfSU5URVJDSEFOR0VfQkVBTl9fRVhQT1JUX0VYUE9TRVM6CisJCQkJcmV0dXJuIGdldEV4cG9ydEV4cG9zZXMoKTsKKwkJCWNhc2UgRGF0YURTTFBhY2thZ2UuREFUQV9JTlRFUkNIQU5HRV9CRUFOX19FWFBPUlRfRklMVEVSOgorCQkJCXJldHVybiBnZXRFeHBvcnRGaWx0ZXIoKTsKIAkJfQogCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKIAl9CkBAIC01MjIsOCArNzA3LDExIEBACiAJCQljYXNlIERhdGFEU0xQYWNrYWdlLkRBVEFfSU5URVJDSEFOR0VfQkVBTl9fRU5USVRZOgogCQkJCXNldEVudGl0eSgoTEVudGl0eSluZXdWYWx1ZSk7CiAJCQkJcmV0dXJuOwotCQkJY2FzZSBEYXRhRFNMUGFja2FnZS5EQVRBX0lOVEVSQ0hBTkdFX0JFQU5fX01BUktfTEFURVNUOgotCQkJCXNldE1hcmtMYXRlc3QoKEJvb2xlYW4pbmV3VmFsdWUpOworCQkJY2FzZSBEYXRhRFNMUGFja2FnZS5EQVRBX0lOVEVSQ0hBTkdFX0JFQU5fX01BUktfTEFURVNUX0lNUE9SVDoKKwkJCQlzZXRNYXJrTGF0ZXN0SW1wb3J0KChCb29sZWFuKW5ld1ZhbHVlKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIERhdGFEU0xQYWNrYWdlLkRBVEFfSU5URVJDSEFOR0VfQkVBTl9fTUFSS19MQVRFU1RfRVhQT1JUOgorCQkJCXNldE1hcmtMYXRlc3RFeHBvcnQoKEJvb2xlYW4pbmV3VmFsdWUpOwogCQkJCXJldHVybjsKIAkJCWNhc2UgRGF0YURTTFBhY2thZ2UuREFUQV9JTlRFUkNIQU5HRV9CRUFOX19IQVNfQkxPQl9NQVBQSU5HOgogCQkJCXNldEhhc0Jsb2JNYXBwaW5nKChCb29sZWFuKW5ld1ZhbHVlKTsKQEAgLTUzMSw2ICs3MTksOSBAQAogCQkJY2FzZSBEYXRhRFNMUGFja2FnZS5EQVRBX0lOVEVSQ0hBTkdFX0JFQU5fX0xBVEVTVF9QUk9QRVJUWToKIAkJCQlzZXRMYXRlc3RQcm9wZXJ0eSgoTEVudGl0eUF0dHJpYnV0ZSluZXdWYWx1ZSk7CiAJCQkJcmV0dXJuOworCQkJY2FzZSBEYXRhRFNMUGFja2FnZS5EQVRBX0lOVEVSQ0hBTkdFX0JFQU5fX0xBVEVTVF9FWFBfUFJPUEVSVFk6CisJCQkJc2V0TGF0ZXN0RXhwUHJvcGVydHkoKExFbnRpdHlBdHRyaWJ1dGUpbmV3VmFsdWUpOworCQkJCXJldHVybjsKIAkJCWNhc2UgRGF0YURTTFBhY2thZ2UuREFUQV9JTlRFUkNIQU5HRV9CRUFOX19FTEVNRU5UX01BUDoKIAkJCQlzZXRFbGVtZW50TWFwKChTdHJpbmcpbmV3VmFsdWUpOwogCQkJCXJldHVybjsKQEAgLTU1Nyw2ICs3NDgsMTMgQEAKIAkJCQlnZXRMb29rdXBLZXlzKCkuY2xlYXIoKTsKIAkJCQlnZXRMb29rdXBLZXlzKCkuYWRkQWxsKChDb2xsZWN0aW9uPD8gZXh0ZW5kcyBEYXRhSW50ZXJjaGFuZ2VLZXk+KW5ld1ZhbHVlKTsKIAkJCQlyZXR1cm47CisJCQljYXNlIERhdGFEU0xQYWNrYWdlLkRBVEFfSU5URVJDSEFOR0VfQkVBTl9fRVhQT1JUX0VYUE9TRVM6CisJCQkJZ2V0RXhwb3J0RXhwb3NlcygpLmNsZWFyKCk7CisJCQkJZ2V0RXhwb3J0RXhwb3NlcygpLmFkZEFsbCgoQ29sbGVjdGlvbjw/IGV4dGVuZHMgRGF0YUludGVyY2hhbmdlRXhwb3NlPiluZXdWYWx1ZSk7CisJCQkJcmV0dXJuOworCQkJY2FzZSBEYXRhRFNMUGFja2FnZS5EQVRBX0lOVEVSQ0hBTkdFX0JFQU5fX0VYUE9SVF9GSUxURVI6CisJCQkJc2V0RXhwb3J0RmlsdGVyKChEYXRhSW50ZXJjaGFuZ2VFeHBvcnRGaWx0ZXIpbmV3VmFsdWUpOworCQkJCXJldHVybjsKIAkJfQogCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOwogCX0KQEAgLTU3Miw4ICs3NzAsMTEgQEAKIAkJCWNhc2UgRGF0YURTTFBhY2thZ2UuREFUQV9JTlRFUkNIQU5HRV9CRUFOX19FTlRJVFk6CiAJCQkJc2V0RW50aXR5KChMRW50aXR5KW51bGwpOwogCQkJCXJldHVybjsKLQkJCWNhc2UgRGF0YURTTFBhY2thZ2UuREFUQV9JTlRFUkNIQU5HRV9CRUFOX19NQVJLX0xBVEVTVDoKLQkJCQlzZXRNYXJrTGF0ZXN0KE1BUktfTEFURVNUX0VERUZBVUxUKTsKKwkJCWNhc2UgRGF0YURTTFBhY2thZ2UuREFUQV9JTlRFUkNIQU5HRV9CRUFOX19NQVJLX0xBVEVTVF9JTVBPUlQ6CisJCQkJc2V0TWFya0xhdGVzdEltcG9ydChNQVJLX0xBVEVTVF9JTVBPUlRfRURFRkFVTFQpOworCQkJCXJldHVybjsKKwkJCWNhc2UgRGF0YURTTFBhY2thZ2UuREFUQV9JTlRFUkNIQU5HRV9CRUFOX19NQVJLX0xBVEVTVF9FWFBPUlQ6CisJCQkJc2V0TWFya0xhdGVzdEV4cG9ydChNQVJLX0xBVEVTVF9FWFBPUlRfRURFRkFVTFQpOwogCQkJCXJldHVybjsKIAkJCWNhc2UgRGF0YURTTFBhY2thZ2UuREFUQV9JTlRFUkNIQU5HRV9CRUFOX19IQVNfQkxPQl9NQVBQSU5HOgogCQkJCXNldEhhc0Jsb2JNYXBwaW5nKEhBU19CTE9CX01BUFBJTkdfRURFRkFVTFQpOwpAQCAtNTgxLDYgKzc4Miw5IEBACiAJCQljYXNlIERhdGFEU0xQYWNrYWdlLkRBVEFfSU5URVJDSEFOR0VfQkVBTl9fTEFURVNUX1BST1BFUlRZOgogCQkJCXNldExhdGVzdFByb3BlcnR5KChMRW50aXR5QXR0cmlidXRlKW51bGwpOwogCQkJCXJldHVybjsKKwkJCWNhc2UgRGF0YURTTFBhY2thZ2UuREFUQV9JTlRFUkNIQU5HRV9CRUFOX19MQVRFU1RfRVhQX1BST1BFUlRZOgorCQkJCXNldExhdGVzdEV4cFByb3BlcnR5KChMRW50aXR5QXR0cmlidXRlKW51bGwpOworCQkJCXJldHVybjsKIAkJCWNhc2UgRGF0YURTTFBhY2thZ2UuREFUQV9JTlRFUkNIQU5HRV9CRUFOX19FTEVNRU5UX01BUDoKIAkJCQlzZXRFbGVtZW50TWFwKEVMRU1FTlRfTUFQX0VERUZBVUxUKTsKIAkJCQlyZXR1cm47CkBAIC02MDIsNiArODA2LDEyIEBACiAJCQljYXNlIERhdGFEU0xQYWNrYWdlLkRBVEFfSU5URVJDSEFOR0VfQkVBTl9fTE9PS1VQX0tFWVM6CiAJCQkJZ2V0TG9va3VwS2V5cygpLmNsZWFyKCk7CiAJCQkJcmV0dXJuOworCQkJY2FzZSBEYXRhRFNMUGFja2FnZS5EQVRBX0lOVEVSQ0hBTkdFX0JFQU5fX0VYUE9SVF9FWFBPU0VTOgorCQkJCWdldEV4cG9ydEV4cG9zZXMoKS5jbGVhcigpOworCQkJCXJldHVybjsKKwkJCWNhc2UgRGF0YURTTFBhY2thZ2UuREFUQV9JTlRFUkNIQU5HRV9CRUFOX19FWFBPUlRfRklMVEVSOgorCQkJCXNldEV4cG9ydEZpbHRlcigoRGF0YUludGVyY2hhbmdlRXhwb3J0RmlsdGVyKW51bGwpOworCQkJCXJldHVybjsKIAkJfQogCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKIAl9CkBAIC02MTYsMTIgKzgyNiwxNiBAQAogCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewogCQkJY2FzZSBEYXRhRFNMUGFja2FnZS5EQVRBX0lOVEVSQ0hBTkdFX0JFQU5fX0VOVElUWToKIAkJCQlyZXR1cm4gZW50aXR5ICE9IG51bGw7Ci0JCQljYXNlIERhdGFEU0xQYWNrYWdlLkRBVEFfSU5URVJDSEFOR0VfQkVBTl9fTUFSS19MQVRFU1Q6Ci0JCQkJcmV0dXJuIG1hcmtMYXRlc3QgIT0gTUFSS19MQVRFU1RfRURFRkFVTFQ7CisJCQljYXNlIERhdGFEU0xQYWNrYWdlLkRBVEFfSU5URVJDSEFOR0VfQkVBTl9fTUFSS19MQVRFU1RfSU1QT1JUOgorCQkJCXJldHVybiBtYXJrTGF0ZXN0SW1wb3J0ICE9IE1BUktfTEFURVNUX0lNUE9SVF9FREVGQVVMVDsKKwkJCWNhc2UgRGF0YURTTFBhY2thZ2UuREFUQV9JTlRFUkNIQU5HRV9CRUFOX19NQVJLX0xBVEVTVF9FWFBPUlQ6CisJCQkJcmV0dXJuIG1hcmtMYXRlc3RFeHBvcnQgIT0gTUFSS19MQVRFU1RfRVhQT1JUX0VERUZBVUxUOwogCQkJY2FzZSBEYXRhRFNMUGFja2FnZS5EQVRBX0lOVEVSQ0hBTkdFX0JFQU5fX0hBU19CTE9CX01BUFBJTkc6CiAJCQkJcmV0dXJuIGhhc0Jsb2JNYXBwaW5nICE9IEhBU19CTE9CX01BUFBJTkdfRURFRkFVTFQ7CiAJCQljYXNlIERhdGFEU0xQYWNrYWdlLkRBVEFfSU5URVJDSEFOR0VfQkVBTl9fTEFURVNUX1BST1BFUlRZOgogCQkJCXJldHVybiBsYXRlc3RQcm9wZXJ0eSAhPSBudWxsOworCQkJY2FzZSBEYXRhRFNMUGFja2FnZS5EQVRBX0lOVEVSQ0hBTkdFX0JFQU5fX0xBVEVTVF9FWFBfUFJPUEVSVFk6CisJCQkJcmV0dXJuIGxhdGVzdEV4cFByb3BlcnR5ICE9IG51bGw7CiAJCQljYXNlIERhdGFEU0xQYWNrYWdlLkRBVEFfSU5URVJDSEFOR0VfQkVBTl9fRUxFTUVOVF9NQVA6CiAJCQkJcmV0dXJuIEVMRU1FTlRfTUFQX0VERUZBVUxUID09IG51bGwgPyBlbGVtZW50TWFwICE9IG51bGwgOiAhRUxFTUVOVF9NQVBfRURFRkFVTFQuZXF1YWxzKGVsZW1lbnRNYXApOwogCQkJY2FzZSBEYXRhRFNMUGFja2FnZS5EQVRBX0lOVEVSQ0hBTkdFX0JFQU5fX05PREVfTkFNRToKQEAgLTYzNiw2ICs4NTAsMTAgQEAKIAkJCQlyZXR1cm4gbWFwcGluZ3MgIT0gbnVsbCAmJiAhbWFwcGluZ3MuaXNFbXB0eSgpOwogCQkJY2FzZSBEYXRhRFNMUGFja2FnZS5EQVRBX0lOVEVSQ0hBTkdFX0JFQU5fX0xPT0tVUF9LRVlTOgogCQkJCXJldHVybiBsb29rdXBLZXlzICE9IG51bGwgJiYgIWxvb2t1cEtleXMuaXNFbXB0eSgpOworCQkJY2FzZSBEYXRhRFNMUGFja2FnZS5EQVRBX0lOVEVSQ0hBTkdFX0JFQU5fX0VYUE9SVF9FWFBPU0VTOgorCQkJCXJldHVybiBleHBvcnRFeHBvc2VzICE9IG51bGwgJiYgIWV4cG9ydEV4cG9zZXMuaXNFbXB0eSgpOworCQkJY2FzZSBEYXRhRFNMUGFja2FnZS5EQVRBX0lOVEVSQ0hBTkdFX0JFQU5fX0VYUE9SVF9GSUxURVI6CisJCQkJcmV0dXJuIGV4cG9ydEZpbHRlciAhPSBudWxsOwogCQl9CiAJCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKIAl9CkBAIC02NTAsOCArODY4LDEwIEBACiAJCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKIAogCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiIChtYXJrTGF0ZXN0OiAiKTsKLQkJcmVzdWx0LmFwcGVuZChtYXJrTGF0ZXN0KTsKKwkJcmVzdWx0LmFwcGVuZCgiIChtYXJrTGF0ZXN0SW1wb3J0OiAiKTsKKwkJcmVzdWx0LmFwcGVuZChtYXJrTGF0ZXN0SW1wb3J0KTsKKwkJcmVzdWx0LmFwcGVuZCgiLCBtYXJrTGF0ZXN0RXhwb3J0OiAiKTsKKwkJcmVzdWx0LmFwcGVuZChtYXJrTGF0ZXN0RXhwb3J0KTsKIAkJcmVzdWx0LmFwcGVuZCgiLCBoYXNCbG9iTWFwcGluZzogIik7CiAJCXJlc3VsdC5hcHBlbmQoaGFzQmxvYk1hcHBpbmcpOwogCQlyZXN1bHQuYXBwZW5kKCIsIGVsZW1lbnRNYXA6ICIpOwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5kYXRhaW50ZXJjaGFuZ2UvZW1mLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2RhdGFpbnRlcmNoYW5nZS9pbXBsL0RhdGFJbnRlcmNoYW5nZUJsb2JNYXBwaW5nSW1wbC5qYXZhIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5kYXRhaW50ZXJjaGFuZ2UvZW1mLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2RhdGFpbnRlcmNoYW5nZS9pbXBsL0RhdGFJbnRlcmNoYW5nZUJsb2JNYXBwaW5nSW1wbC5qYXZhCmluZGV4IDNmNTY2NzQuLjhhYmU3ZGIgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLm9zYnAueHRleHQuZGF0YWludGVyY2hhbmdlL2VtZi1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9kYXRhaW50ZXJjaGFuZ2UvaW1wbC9EYXRhSW50ZXJjaGFuZ2VCbG9iTWFwcGluZ0ltcGwuamF2YQorKysgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmRhdGFpbnRlcmNoYW5nZS9lbWYtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvZGF0YWludGVyY2hhbmdlL2ltcGwvRGF0YUludGVyY2hhbmdlQmxvYk1hcHBpbmdJbXBsLmphdmEKQEAgLTEsMTMgKzEsMTUgQEAKIC8qKgogICogQ29weXJpZ2h0IChjKSAyMDE0LCBMb2V0eiBHbWJIJkNvLktHIChIZWlkZWxiZXJnKQogICogIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIAorICogIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgMi4wICAKICAqICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAKLSAqICBodHRwey8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCAKKyAqICBodHRwczovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLyAKKyAqIAorICogIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIAogICogCiAgKiAgQmFzZWQgb24gaWRlYXMgZnJvbSBYdGV4dCwgWHRlbmQsIFhjb3JlCiAgKiAgIAotICogIENvbnRyaWJ1dG9yc3sgIAorICogIENvbnRyaWJ1dG9yczogIAogICogIAkJSm9lcmcgUmllZ2VsIC0gSW5pdGlhbCBpbXBsZW1lbnRhdGlvbiAKICAqICAKICAqLwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5kYXRhaW50ZXJjaGFuZ2UvZW1mLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2RhdGFpbnRlcmNoYW5nZS9pbXBsL0RhdGFJbnRlcmNoYW5nZUVudGl0eUV4cHJlc3Npb25JbXBsLmphdmEgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmRhdGFpbnRlcmNoYW5nZS9lbWYtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvZGF0YWludGVyY2hhbmdlL2ltcGwvRGF0YUludGVyY2hhbmdlRW50aXR5RXhwcmVzc2lvbkltcGwuamF2YQppbmRleCAzNTE1NGNmLi4xNmE2YmYxIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmRhdGFpbnRlcmNoYW5nZS9lbWYtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvZGF0YWludGVyY2hhbmdlL2ltcGwvRGF0YUludGVyY2hhbmdlRW50aXR5RXhwcmVzc2lvbkltcGwuamF2YQorKysgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmRhdGFpbnRlcmNoYW5nZS9lbWYtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvZGF0YWludGVyY2hhbmdlL2ltcGwvRGF0YUludGVyY2hhbmdlRW50aXR5RXhwcmVzc2lvbkltcGwuamF2YQpAQCAtMSwxMyArMSwxNSBAQAogLyoqCiAgKiBDb3B5cmlnaHQgKGMpIDIwMTQsIExvZXR6IEdtYkgmQ28uS0cgKEhlaWRlbGJlcmcpCiAgKiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgCisgKiAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSAyLjAgIAogICogIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IAotICogIGh0dHB7Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIAorICogIGh0dHBzOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAvIAorICogCisgKiAgU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgCiAgKiAKICAqICBCYXNlZCBvbiBpZGVhcyBmcm9tIFh0ZXh0LCBYdGVuZCwgWGNvcmUKICAqICAgCi0gKiAgQ29udHJpYnV0b3JzeyAgCisgKiAgQ29udHJpYnV0b3JzOiAgCiAgKiAgCQlKb2VyZyBSaWVnZWwgLSBJbml0aWFsIGltcGxlbWVudGF0aW9uIAogICogIAogICovCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmRhdGFpbnRlcmNoYW5nZS9lbWYtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvZGF0YWludGVyY2hhbmdlL2ltcGwvRGF0YUludGVyY2hhbmdlRXhwb3J0RmlsdGVySW1wbC5qYXZhIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5kYXRhaW50ZXJjaGFuZ2UvZW1mLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2RhdGFpbnRlcmNoYW5nZS9pbXBsL0RhdGFJbnRlcmNoYW5nZUV4cG9ydEZpbHRlckltcGwuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYThiZWI3Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5kYXRhaW50ZXJjaGFuZ2UvZW1mLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2RhdGFpbnRlcmNoYW5nZS9pbXBsL0RhdGFJbnRlcmNoYW5nZUV4cG9ydEZpbHRlckltcGwuamF2YQpAQCAtMCwwICsxLDIzMyBAQAorLyoqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTQsIExvZXR6IEdtYkgmQ28uS0cgKEhlaWRlbGJlcmcpCisgKiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKKyAqICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIDIuMCAgCisgKiAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgCisgKiAgaHR0cHM6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC8gCisgKiAKKyAqICBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCAKKyAqIAorICogIEJhc2VkIG9uIGlkZWFzIGZyb20gWHRleHQsIFh0ZW5kLCBYY29yZQorICogICAKKyAqICBDb250cmlidXRvcnM6ICAKKyAqICAJCUpvZXJnIFJpZWdlbCAtIEluaXRpYWwgaW1wbGVtZW50YXRpb24gCisgKiAgCisgKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2Uub3NicC54dGV4dC5kYXRhaW50ZXJjaGFuZ2UuaW1wbDsKKworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FT2JqZWN0Q29udGFpbm1lbnRFTGlzdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5JbnRlcm5hbEVMaXN0OworCitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5kYXRhaW50ZXJjaGFuZ2UuRGF0YURTTFBhY2thZ2U7CitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5kYXRhaW50ZXJjaGFuZ2UuRGF0YUludGVyY2hhbmdlRXhwb3J0RmlsdGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAueHRleHQuZGF0YWludGVyY2hhbmdlLkRhdGFJbnRlcmNoYW5nZUV4cG9ydEhpZGU7CitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5kYXRhaW50ZXJjaGFuZ2UuRGF0YUludGVyY2hhbmdlRmlsdGVyQ29uZGl0aW9uOworCisvKioKKyAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisgKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+RGF0YSBJbnRlcmNoYW5nZSBFeHBvcnQgRmlsdGVyPC9iPjwvZW0+Jy4KKyAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorICogPHA+CisgKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKKyAqIDwvcD4KKyAqIDx1bD4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmRhdGFpbnRlcmNoYW5nZS5pbXBsLkRhdGFJbnRlcmNoYW5nZUV4cG9ydEZpbHRlckltcGwjZ2V0Q29uZGl0aW9uIDxlbT5Db25kaXRpb248L2VtPn08L2xpPgorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQuZGF0YWludGVyY2hhbmdlLmltcGwuRGF0YUludGVyY2hhbmdlRXhwb3J0RmlsdGVySW1wbCNnZXRIaWRkZW5wcm9wZXJ0aWVzIDxlbT5IaWRkZW5wcm9wZXJ0aWVzPC9lbT59PC9saT4KKyAqIDwvdWw+CisgKgorICogQGdlbmVyYXRlZAorICovCitwdWJsaWMgY2xhc3MgRGF0YUludGVyY2hhbmdlRXhwb3J0RmlsdGVySW1wbCBleHRlbmRzIERhdGFJbnRlcmNoYW5nZUxhenlSZXNvbHZlckltcGwgaW1wbGVtZW50cyBEYXRhSW50ZXJjaGFuZ2VFeHBvcnRGaWx0ZXIgeworCS8qKgorCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldENvbmRpdGlvbigpIDxlbT5Db25kaXRpb248L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2dldENvbmRpdGlvbigpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIERhdGFJbnRlcmNoYW5nZUZpbHRlckNvbmRpdGlvbiBjb25kaXRpb247CisKKwkvKioKKwkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRIaWRkZW5wcm9wZXJ0aWVzKCkgPGVtPkhpZGRlbnByb3BlcnRpZXM8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjZ2V0SGlkZGVucHJvcGVydGllcygpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIEVMaXN0PERhdGFJbnRlcmNoYW5nZUV4cG9ydEhpZGU+IGhpZGRlbnByb3BlcnRpZXM7CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgRGF0YUludGVyY2hhbmdlRXhwb3J0RmlsdGVySW1wbCgpIHsKKwkJc3VwZXIoKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKKwkJcmV0dXJuIERhdGFEU0xQYWNrYWdlLkxpdGVyYWxzLkRBVEFfSU5URVJDSEFOR0VfRVhQT1JUX0ZJTFRFUjsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRGF0YUludGVyY2hhbmdlRmlsdGVyQ29uZGl0aW9uIGdldENvbmRpdGlvbigpIHsKKwkJcmV0dXJuIGNvbmRpdGlvbjsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gYmFzaWNTZXRDb25kaXRpb24oRGF0YUludGVyY2hhbmdlRmlsdGVyQ29uZGl0aW9uIG5ld0NvbmRpdGlvbiwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgeworCQlEYXRhSW50ZXJjaGFuZ2VGaWx0ZXJDb25kaXRpb24gb2xkQ29uZGl0aW9uID0gY29uZGl0aW9uOworCQljb25kaXRpb24gPSBuZXdDb25kaXRpb247CisJCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkgeworCQkJRU5vdGlmaWNhdGlvbkltcGwgbm90aWZpY2F0aW9uID0gbmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIERhdGFEU0xQYWNrYWdlLkRBVEFfSU5URVJDSEFOR0VfRVhQT1JUX0ZJTFRFUl9fQ09ORElUSU9OLCBvbGRDb25kaXRpb24sIG5ld0NvbmRpdGlvbik7CisJCQlpZiAobXNncyA9PSBudWxsKSBtc2dzID0gbm90aWZpY2F0aW9uOyBlbHNlIG1zZ3MuYWRkKG5vdGlmaWNhdGlvbik7CisJCX0KKwkJcmV0dXJuIG1zZ3M7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHZvaWQgc2V0Q29uZGl0aW9uKERhdGFJbnRlcmNoYW5nZUZpbHRlckNvbmRpdGlvbiBuZXdDb25kaXRpb24pIHsKKwkJaWYgKG5ld0NvbmRpdGlvbiAhPSBjb25kaXRpb24pIHsKKwkJCU5vdGlmaWNhdGlvbkNoYWluIG1zZ3MgPSBudWxsOworCQkJaWYgKGNvbmRpdGlvbiAhPSBudWxsKQorCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCljb25kaXRpb24pLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBEYXRhRFNMUGFja2FnZS5EQVRBX0lOVEVSQ0hBTkdFX0VYUE9SVF9GSUxURVJfX0NPTkRJVElPTiwgbnVsbCwgbXNncyk7CisJCQlpZiAobmV3Q29uZGl0aW9uICE9IG51bGwpCisJCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KW5ld0NvbmRpdGlvbikuZUludmVyc2VBZGQodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIERhdGFEU0xQYWNrYWdlLkRBVEFfSU5URVJDSEFOR0VfRVhQT1JUX0ZJTFRFUl9fQ09ORElUSU9OLCBudWxsLCBtc2dzKTsKKwkJCW1zZ3MgPSBiYXNpY1NldENvbmRpdGlvbihuZXdDb25kaXRpb24sIG1zZ3MpOworCQkJaWYgKG1zZ3MgIT0gbnVsbCkgbXNncy5kaXNwYXRjaCgpOworCQl9CisJCWVsc2UgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQorCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRGF0YURTTFBhY2thZ2UuREFUQV9JTlRFUkNIQU5HRV9FWFBPUlRfRklMVEVSX19DT05ESVRJT04sIG5ld0NvbmRpdGlvbiwgbmV3Q29uZGl0aW9uKSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVMaXN0PERhdGFJbnRlcmNoYW5nZUV4cG9ydEhpZGU+IGdldEhpZGRlbnByb3BlcnRpZXMoKSB7CisJCWlmIChoaWRkZW5wcm9wZXJ0aWVzID09IG51bGwpIHsKKwkJCWhpZGRlbnByb3BlcnRpZXMgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3Q8RGF0YUludGVyY2hhbmdlRXhwb3J0SGlkZT4oRGF0YUludGVyY2hhbmdlRXhwb3J0SGlkZS5jbGFzcywgdGhpcywgRGF0YURTTFBhY2thZ2UuREFUQV9JTlRFUkNIQU5HRV9FWFBPUlRfRklMVEVSX19ISURERU5QUk9QRVJUSUVTKTsKKwkJfQorCQlyZXR1cm4gaGlkZGVucHJvcGVydGllczsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7CisJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CisJCQljYXNlIERhdGFEU0xQYWNrYWdlLkRBVEFfSU5URVJDSEFOR0VfRVhQT1JUX0ZJTFRFUl9fQ09ORElUSU9OOgorCQkJCXJldHVybiBiYXNpY1NldENvbmRpdGlvbihudWxsLCBtc2dzKTsKKwkJCWNhc2UgRGF0YURTTFBhY2thZ2UuREFUQV9JTlRFUkNIQU5HRV9FWFBPUlRfRklMVEVSX19ISURERU5QUk9QRVJUSUVTOgorCQkJCXJldHVybiAoKEludGVybmFsRUxpc3Q8Pz4pZ2V0SGlkZGVucHJvcGVydGllcygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7CisJCX0KKwkJcmV0dXJuIHN1cGVyLmVJbnZlcnNlUmVtb3ZlKG90aGVyRW5kLCBmZWF0dXJlSUQsIG1zZ3MpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKKwkJc3dpdGNoIChmZWF0dXJlSUQpIHsKKwkJCWNhc2UgRGF0YURTTFBhY2thZ2UuREFUQV9JTlRFUkNIQU5HRV9FWFBPUlRfRklMVEVSX19DT05ESVRJT046CisJCQkJcmV0dXJuIGdldENvbmRpdGlvbigpOworCQkJY2FzZSBEYXRhRFNMUGFja2FnZS5EQVRBX0lOVEVSQ0hBTkdFX0VYUE9SVF9GSUxURVJfX0hJRERFTlBST1BFUlRJRVM6CisJCQkJcmV0dXJuIGdldEhpZGRlbnByb3BlcnRpZXMoKTsKKwkJfQorCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgeworCQlzd2l0Y2ggKGZlYXR1cmVJRCkgeworCQkJY2FzZSBEYXRhRFNMUGFja2FnZS5EQVRBX0lOVEVSQ0hBTkdFX0VYUE9SVF9GSUxURVJfX0NPTkRJVElPTjoKKwkJCQlzZXRDb25kaXRpb24oKERhdGFJbnRlcmNoYW5nZUZpbHRlckNvbmRpdGlvbiluZXdWYWx1ZSk7CisJCQkJcmV0dXJuOworCQkJY2FzZSBEYXRhRFNMUGFja2FnZS5EQVRBX0lOVEVSQ0hBTkdFX0VYUE9SVF9GSUxURVJfX0hJRERFTlBST1BFUlRJRVM6CisJCQkJZ2V0SGlkZGVucHJvcGVydGllcygpLmNsZWFyKCk7CisJCQkJZ2V0SGlkZGVucHJvcGVydGllcygpLmFkZEFsbCgoQ29sbGVjdGlvbjw/IGV4dGVuZHMgRGF0YUludGVyY2hhbmdlRXhwb3J0SGlkZT4pbmV3VmFsdWUpOworCQkJCXJldHVybjsKKwkJfQorCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7CisJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CisJCQljYXNlIERhdGFEU0xQYWNrYWdlLkRBVEFfSU5URVJDSEFOR0VfRVhQT1JUX0ZJTFRFUl9fQ09ORElUSU9OOgorCQkJCXNldENvbmRpdGlvbigoRGF0YUludGVyY2hhbmdlRmlsdGVyQ29uZGl0aW9uKW51bGwpOworCQkJCXJldHVybjsKKwkJCWNhc2UgRGF0YURTTFBhY2thZ2UuREFUQV9JTlRFUkNIQU5HRV9FWFBPUlRfRklMVEVSX19ISURERU5QUk9QRVJUSUVTOgorCQkJCWdldEhpZGRlbnByb3BlcnRpZXMoKS5jbGVhcigpOworCQkJCXJldHVybjsKKwkJfQorCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgeworCQlzd2l0Y2ggKGZlYXR1cmVJRCkgeworCQkJY2FzZSBEYXRhRFNMUGFja2FnZS5EQVRBX0lOVEVSQ0hBTkdFX0VYUE9SVF9GSUxURVJfX0NPTkRJVElPTjoKKwkJCQlyZXR1cm4gY29uZGl0aW9uICE9IG51bGw7CisJCQljYXNlIERhdGFEU0xQYWNrYWdlLkRBVEFfSU5URVJDSEFOR0VfRVhQT1JUX0ZJTFRFUl9fSElEREVOUFJPUEVSVElFUzoKKwkJCQlyZXR1cm4gaGlkZGVucHJvcGVydGllcyAhPSBudWxsICYmICFoaWRkZW5wcm9wZXJ0aWVzLmlzRW1wdHkoKTsKKwkJfQorCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7CisJfQorCit9IC8vRGF0YUludGVyY2hhbmdlRXhwb3J0RmlsdGVySW1wbApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5kYXRhaW50ZXJjaGFuZ2UvZW1mLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2RhdGFpbnRlcmNoYW5nZS9pbXBsL0RhdGFJbnRlcmNoYW5nZUV4cG9ydEhpZGVJbXBsLmphdmEgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmRhdGFpbnRlcmNoYW5nZS9lbWYtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvZGF0YWludGVyY2hhbmdlL2ltcGwvRGF0YUludGVyY2hhbmdlRXhwb3J0SGlkZUltcGwuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYjIwNzY1Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5kYXRhaW50ZXJjaGFuZ2UvZW1mLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2RhdGFpbnRlcmNoYW5nZS9pbXBsL0RhdGFJbnRlcmNoYW5nZUV4cG9ydEhpZGVJbXBsLmphdmEKQEAgLTAsMCArMSwxNzAgQEAKKy8qKgorICogQ29weXJpZ2h0IChjKSAyMDE0LCBMb2V0eiBHbWJIJkNvLktHIChIZWlkZWxiZXJnKQorICogIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCisgKiAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSAyLjAgIAorICogIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IAorICogIGh0dHBzOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAvIAorICogCisgKiAgU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgCisgKiAKKyAqICBCYXNlZCBvbiBpZGVhcyBmcm9tIFh0ZXh0LCBYdGVuZCwgWGNvcmUKKyAqICAgCisgKiAgQ29udHJpYnV0b3JzOiAgCisgKiAgCQlKb2VyZyBSaWVnZWwgLSBJbml0aWFsIGltcGxlbWVudGF0aW9uIAorICogIAorICovCitwYWNrYWdlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQuZGF0YWludGVyY2hhbmdlLmltcGw7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAuZHNsLnNlbWFudGljLmVudGl0eS5MRW50aXR5RmVhdHVyZTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAueHRleHQuZGF0YWludGVyY2hhbmdlLkRhdGFEU0xQYWNrYWdlOworaW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAueHRleHQuZGF0YWludGVyY2hhbmdlLkRhdGFJbnRlcmNoYW5nZUV4cG9ydEhpZGU7CisKKy8qKgorICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKyAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5EYXRhIEludGVyY2hhbmdlIEV4cG9ydCBIaWRlPC9iPjwvZW0+Jy4KKyAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorICogPHA+CisgKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKKyAqIDwvcD4KKyAqIDx1bD4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmRhdGFpbnRlcmNoYW5nZS5pbXBsLkRhdGFJbnRlcmNoYW5nZUV4cG9ydEhpZGVJbXBsI2dldFByb3BlcnR5IDxlbT5Qcm9wZXJ0eTwvZW0+fTwvbGk+CisgKiA8L3VsPgorICoKKyAqIEBnZW5lcmF0ZWQKKyAqLworcHVibGljIGNsYXNzIERhdGFJbnRlcmNoYW5nZUV4cG9ydEhpZGVJbXBsIGV4dGVuZHMgRGF0YUludGVyY2hhbmdlTGF6eVJlc29sdmVySW1wbCBpbXBsZW1lbnRzIERhdGFJbnRlcmNoYW5nZUV4cG9ydEhpZGUgeworCS8qKgorCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFByb3BlcnR5KCkgPGVtPlByb3BlcnR5PC9lbT59JyByZWZlcmVuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNnZXRQcm9wZXJ0eSgpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIExFbnRpdHlGZWF0dXJlIHByb3BlcnR5OworCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIERhdGFJbnRlcmNoYW5nZUV4cG9ydEhpZGVJbXBsKCkgeworCQlzdXBlcigpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgeworCQlyZXR1cm4gRGF0YURTTFBhY2thZ2UuTGl0ZXJhbHMuREFUQV9JTlRFUkNIQU5HRV9FWFBPUlRfSElERTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgTEVudGl0eUZlYXR1cmUgZ2V0UHJvcGVydHkoKSB7CisJCWlmIChwcm9wZXJ0eSAhPSBudWxsICYmIHByb3BlcnR5LmVJc1Byb3h5KCkpIHsKKwkJCUludGVybmFsRU9iamVjdCBvbGRQcm9wZXJ0eSA9IChJbnRlcm5hbEVPYmplY3QpcHJvcGVydHk7CisJCQlwcm9wZXJ0eSA9IChMRW50aXR5RmVhdHVyZSllUmVzb2x2ZVByb3h5KG9sZFByb3BlcnR5KTsKKwkJCWlmIChwcm9wZXJ0eSAhPSBvbGRQcm9wZXJ0eSkgeworCQkJCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKKwkJCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlJFU09MVkUsIERhdGFEU0xQYWNrYWdlLkRBVEFfSU5URVJDSEFOR0VfRVhQT1JUX0hJREVfX1BST1BFUlRZLCBvbGRQcm9wZXJ0eSwgcHJvcGVydHkpKTsKKwkJCX0KKwkJfQorCQlyZXR1cm4gcHJvcGVydHk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIExFbnRpdHlGZWF0dXJlIGJhc2ljR2V0UHJvcGVydHkoKSB7CisJCXJldHVybiBwcm9wZXJ0eTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXRQcm9wZXJ0eShMRW50aXR5RmVhdHVyZSBuZXdQcm9wZXJ0eSkgeworCQlMRW50aXR5RmVhdHVyZSBvbGRQcm9wZXJ0eSA9IHByb3BlcnR5OworCQlwcm9wZXJ0eSA9IG5ld1Byb3BlcnR5OworCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCisJCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBEYXRhRFNMUGFja2FnZS5EQVRBX0lOVEVSQ0hBTkdFX0VYUE9SVF9ISURFX19QUk9QRVJUWSwgb2xkUHJvcGVydHksIHByb3BlcnR5KSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgeworCQlzd2l0Y2ggKGZlYXR1cmVJRCkgeworCQkJY2FzZSBEYXRhRFNMUGFja2FnZS5EQVRBX0lOVEVSQ0hBTkdFX0VYUE9SVF9ISURFX19QUk9QRVJUWToKKwkJCQlpZiAocmVzb2x2ZSkgcmV0dXJuIGdldFByb3BlcnR5KCk7CisJCQkJcmV0dXJuIGJhc2ljR2V0UHJvcGVydHkoKTsKKwkJfQorCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgeworCQlzd2l0Y2ggKGZlYXR1cmVJRCkgeworCQkJY2FzZSBEYXRhRFNMUGFja2FnZS5EQVRBX0lOVEVSQ0hBTkdFX0VYUE9SVF9ISURFX19QUk9QRVJUWToKKwkJCQlzZXRQcm9wZXJ0eSgoTEVudGl0eUZlYXR1cmUpbmV3VmFsdWUpOworCQkJCXJldHVybjsKKwkJfQorCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7CisJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CisJCQljYXNlIERhdGFEU0xQYWNrYWdlLkRBVEFfSU5URVJDSEFOR0VfRVhQT1JUX0hJREVfX1BST1BFUlRZOgorCQkJCXNldFByb3BlcnR5KChMRW50aXR5RmVhdHVyZSludWxsKTsKKwkJCQlyZXR1cm47CisJCX0KKwkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKKwkJc3dpdGNoIChmZWF0dXJlSUQpIHsKKwkJCWNhc2UgRGF0YURTTFBhY2thZ2UuREFUQV9JTlRFUkNIQU5HRV9FWFBPUlRfSElERV9fUFJPUEVSVFk6CisJCQkJcmV0dXJuIHByb3BlcnR5ICE9IG51bGw7CisJCX0KKwkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOworCX0KKworfSAvL0RhdGFJbnRlcmNoYW5nZUV4cG9ydEhpZGVJbXBsCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmRhdGFpbnRlcmNoYW5nZS9lbWYtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvZGF0YWludGVyY2hhbmdlL2ltcGwvRGF0YUludGVyY2hhbmdlRXhwb3NlSW1wbC5qYXZhIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5kYXRhaW50ZXJjaGFuZ2UvZW1mLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2RhdGFpbnRlcmNoYW5nZS9pbXBsL0RhdGFJbnRlcmNoYW5nZUV4cG9zZUltcGwuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNjliODk4Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5kYXRhaW50ZXJjaGFuZ2UvZW1mLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2RhdGFpbnRlcmNoYW5nZS9pbXBsL0RhdGFJbnRlcmNoYW5nZUV4cG9zZUltcGwuamF2YQpAQCAtMCwwICsxLDMxMCBAQAorLyoqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTQsIExvZXR6IEdtYkgmQ28uS0cgKEhlaWRlbGJlcmcpCisgKiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKKyAqICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIDIuMCAgCisgKiAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgCisgKiAgaHR0cHM6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC8gCisgKiAKKyAqICBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCAKKyAqIAorICogIEJhc2VkIG9uIGlkZWFzIGZyb20gWHRleHQsIFh0ZW5kLCBYY29yZQorICogICAKKyAqICBDb250cmlidXRvcnM6ICAKKyAqICAJCUpvZXJnIFJpZWdlbCAtIEluaXRpYWwgaW1wbGVtZW50YXRpb24gCisgKiAgCisgKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2Uub3NicC54dGV4dC5kYXRhaW50ZXJjaGFuZ2UuaW1wbDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOworCitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC5kc2wuc2VtYW50aWMuZW50aXR5LkxFbnRpdHlBdHRyaWJ1dGU7CitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC5kc2wuc2VtYW50aWMuZW50aXR5LkxFbnRpdHlSZWZlcmVuY2U7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmRhdGFpbnRlcmNoYW5nZS5EYXRhRFNMUGFja2FnZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmRhdGFpbnRlcmNoYW5nZS5EYXRhSW50ZXJjaGFuZ2VFeHBvc2U7CisKKy8qKgorICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKyAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5EYXRhIEludGVyY2hhbmdlIEV4cG9zZTwvYj48L2VtPicuCisgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAqIDxwPgorICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6CisgKiA8L3A+CisgKiA8dWw+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5kYXRhaW50ZXJjaGFuZ2UuaW1wbC5EYXRhSW50ZXJjaGFuZ2VFeHBvc2VJbXBsI2dldFJlZkVudGl0eSA8ZW0+UmVmIEVudGl0eTwvZW0+fTwvbGk+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5kYXRhaW50ZXJjaGFuZ2UuaW1wbC5EYXRhSW50ZXJjaGFuZ2VFeHBvc2VJbXBsI2dldFJlZlByb3BlcnR5IDxlbT5SZWYgUHJvcGVydHk8L2VtPn08L2xpPgorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQuZGF0YWludGVyY2hhbmdlLmltcGwuRGF0YUludGVyY2hhbmdlRXhwb3NlSW1wbCNnZXRTdWJFeHBvc2UgPGVtPlN1YiBFeHBvc2U8L2VtPn08L2xpPgorICogPC91bD4KKyAqCisgKiBAZ2VuZXJhdGVkCisgKi8KK3B1YmxpYyBjbGFzcyBEYXRhSW50ZXJjaGFuZ2VFeHBvc2VJbXBsIGV4dGVuZHMgRGF0YUludGVyY2hhbmdlTGF6eVJlc29sdmVySW1wbCBpbXBsZW1lbnRzIERhdGFJbnRlcmNoYW5nZUV4cG9zZSB7CisJLyoqCisJICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UmVmRW50aXR5KCkgPGVtPlJlZiBFbnRpdHk8L2VtPn0nIHJlZmVyZW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2dldFJlZkVudGl0eSgpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIExFbnRpdHlSZWZlcmVuY2UgcmVmRW50aXR5OworCisJLyoqCisJICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UmVmUHJvcGVydHkoKSA8ZW0+UmVmIFByb3BlcnR5PC9lbT59JyByZWZlcmVuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNnZXRSZWZQcm9wZXJ0eSgpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIExFbnRpdHlBdHRyaWJ1dGUgcmVmUHJvcGVydHk7CisKKwkvKioKKwkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRTdWJFeHBvc2UoKSA8ZW0+U3ViIEV4cG9zZTwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjZ2V0U3ViRXhwb3NlKCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgRGF0YUludGVyY2hhbmdlRXhwb3NlIHN1YkV4cG9zZTsKKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCBEYXRhSW50ZXJjaGFuZ2VFeHBvc2VJbXBsKCkgeworCQlzdXBlcigpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgeworCQlyZXR1cm4gRGF0YURTTFBhY2thZ2UuTGl0ZXJhbHMuREFUQV9JTlRFUkNIQU5HRV9FWFBPU0U7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIExFbnRpdHlSZWZlcmVuY2UgZ2V0UmVmRW50aXR5KCkgeworCQlpZiAocmVmRW50aXR5ICE9IG51bGwgJiYgcmVmRW50aXR5LmVJc1Byb3h5KCkpIHsKKwkJCUludGVybmFsRU9iamVjdCBvbGRSZWZFbnRpdHkgPSAoSW50ZXJuYWxFT2JqZWN0KXJlZkVudGl0eTsKKwkJCXJlZkVudGl0eSA9IChMRW50aXR5UmVmZXJlbmNlKWVSZXNvbHZlUHJveHkob2xkUmVmRW50aXR5KTsKKwkJCWlmIChyZWZFbnRpdHkgIT0gb2xkUmVmRW50aXR5KSB7CisJCQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQorCQkJCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uUkVTT0xWRSwgRGF0YURTTFBhY2thZ2UuREFUQV9JTlRFUkNIQU5HRV9FWFBPU0VfX1JFRl9FTlRJVFksIG9sZFJlZkVudGl0eSwgcmVmRW50aXR5KSk7CisJCQl9CisJCX0KKwkJcmV0dXJuIHJlZkVudGl0eTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgTEVudGl0eVJlZmVyZW5jZSBiYXNpY0dldFJlZkVudGl0eSgpIHsKKwkJcmV0dXJuIHJlZkVudGl0eTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXRSZWZFbnRpdHkoTEVudGl0eVJlZmVyZW5jZSBuZXdSZWZFbnRpdHkpIHsKKwkJTEVudGl0eVJlZmVyZW5jZSBvbGRSZWZFbnRpdHkgPSByZWZFbnRpdHk7CisJCXJlZkVudGl0eSA9IG5ld1JlZkVudGl0eTsKKwkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQorCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRGF0YURTTFBhY2thZ2UuREFUQV9JTlRFUkNIQU5HRV9FWFBPU0VfX1JFRl9FTlRJVFksIG9sZFJlZkVudGl0eSwgcmVmRW50aXR5KSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIExFbnRpdHlBdHRyaWJ1dGUgZ2V0UmVmUHJvcGVydHkoKSB7CisJCWlmIChyZWZQcm9wZXJ0eSAhPSBudWxsICYmIHJlZlByb3BlcnR5LmVJc1Byb3h5KCkpIHsKKwkJCUludGVybmFsRU9iamVjdCBvbGRSZWZQcm9wZXJ0eSA9IChJbnRlcm5hbEVPYmplY3QpcmVmUHJvcGVydHk7CisJCQlyZWZQcm9wZXJ0eSA9IChMRW50aXR5QXR0cmlidXRlKWVSZXNvbHZlUHJveHkob2xkUmVmUHJvcGVydHkpOworCQkJaWYgKHJlZlByb3BlcnR5ICE9IG9sZFJlZlByb3BlcnR5KSB7CisJCQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQorCQkJCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uUkVTT0xWRSwgRGF0YURTTFBhY2thZ2UuREFUQV9JTlRFUkNIQU5HRV9FWFBPU0VfX1JFRl9QUk9QRVJUWSwgb2xkUmVmUHJvcGVydHksIHJlZlByb3BlcnR5KSk7CisJCQl9CisJCX0KKwkJcmV0dXJuIHJlZlByb3BlcnR5OworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBMRW50aXR5QXR0cmlidXRlIGJhc2ljR2V0UmVmUHJvcGVydHkoKSB7CisJCXJldHVybiByZWZQcm9wZXJ0eTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXRSZWZQcm9wZXJ0eShMRW50aXR5QXR0cmlidXRlIG5ld1JlZlByb3BlcnR5KSB7CisJCUxFbnRpdHlBdHRyaWJ1dGUgb2xkUmVmUHJvcGVydHkgPSByZWZQcm9wZXJ0eTsKKwkJcmVmUHJvcGVydHkgPSBuZXdSZWZQcm9wZXJ0eTsKKwkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQorCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRGF0YURTTFBhY2thZ2UuREFUQV9JTlRFUkNIQU5HRV9FWFBPU0VfX1JFRl9QUk9QRVJUWSwgb2xkUmVmUHJvcGVydHksIHJlZlByb3BlcnR5KSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIERhdGFJbnRlcmNoYW5nZUV4cG9zZSBnZXRTdWJFeHBvc2UoKSB7CisJCXJldHVybiBzdWJFeHBvc2U7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGJhc2ljU2V0U3ViRXhwb3NlKERhdGFJbnRlcmNoYW5nZUV4cG9zZSBuZXdTdWJFeHBvc2UsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKKwkJRGF0YUludGVyY2hhbmdlRXhwb3NlIG9sZFN1YkV4cG9zZSA9IHN1YkV4cG9zZTsKKwkJc3ViRXhwb3NlID0gbmV3U3ViRXhwb3NlOworCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpIHsKKwkJCUVOb3RpZmljYXRpb25JbXBsIG5vdGlmaWNhdGlvbiA9IG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBEYXRhRFNMUGFja2FnZS5EQVRBX0lOVEVSQ0hBTkdFX0VYUE9TRV9fU1VCX0VYUE9TRSwgb2xkU3ViRXhwb3NlLCBuZXdTdWJFeHBvc2UpOworCQkJaWYgKG1zZ3MgPT0gbnVsbCkgbXNncyA9IG5vdGlmaWNhdGlvbjsgZWxzZSBtc2dzLmFkZChub3RpZmljYXRpb24pOworCQl9CisJCXJldHVybiBtc2dzOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyB2b2lkIHNldFN1YkV4cG9zZShEYXRhSW50ZXJjaGFuZ2VFeHBvc2UgbmV3U3ViRXhwb3NlKSB7CisJCWlmIChuZXdTdWJFeHBvc2UgIT0gc3ViRXhwb3NlKSB7CisJCQlOb3RpZmljYXRpb25DaGFpbiBtc2dzID0gbnVsbDsKKwkJCWlmIChzdWJFeHBvc2UgIT0gbnVsbCkKKwkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3Qpc3ViRXhwb3NlKS5lSW52ZXJzZVJlbW92ZSh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gRGF0YURTTFBhY2thZ2UuREFUQV9JTlRFUkNIQU5HRV9FWFBPU0VfX1NVQl9FWFBPU0UsIG51bGwsIG1zZ3MpOworCQkJaWYgKG5ld1N1YkV4cG9zZSAhPSBudWxsKQorCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCluZXdTdWJFeHBvc2UpLmVJbnZlcnNlQWRkKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBEYXRhRFNMUGFja2FnZS5EQVRBX0lOVEVSQ0hBTkdFX0VYUE9TRV9fU1VCX0VYUE9TRSwgbnVsbCwgbXNncyk7CisJCQltc2dzID0gYmFzaWNTZXRTdWJFeHBvc2UobmV3U3ViRXhwb3NlLCBtc2dzKTsKKwkJCWlmIChtc2dzICE9IG51bGwpIG1zZ3MuZGlzcGF0Y2goKTsKKwkJfQorCQllbHNlIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKKwkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIERhdGFEU0xQYWNrYWdlLkRBVEFfSU5URVJDSEFOR0VfRVhQT1NFX19TVUJfRVhQT1NFLCBuZXdTdWJFeHBvc2UsIG5ld1N1YkV4cG9zZSkpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKKwkJc3dpdGNoIChmZWF0dXJlSUQpIHsKKwkJCWNhc2UgRGF0YURTTFBhY2thZ2UuREFUQV9JTlRFUkNIQU5HRV9FWFBPU0VfX1NVQl9FWFBPU0U6CisJCQkJcmV0dXJuIGJhc2ljU2V0U3ViRXhwb3NlKG51bGwsIG1zZ3MpOworCQl9CisJCXJldHVybiBzdXBlci5lSW52ZXJzZVJlbW92ZShvdGhlckVuZCwgZmVhdHVyZUlELCBtc2dzKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7CisJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CisJCQljYXNlIERhdGFEU0xQYWNrYWdlLkRBVEFfSU5URVJDSEFOR0VfRVhQT1NFX19SRUZfRU5USVRZOgorCQkJCWlmIChyZXNvbHZlKSByZXR1cm4gZ2V0UmVmRW50aXR5KCk7CisJCQkJcmV0dXJuIGJhc2ljR2V0UmVmRW50aXR5KCk7CisJCQljYXNlIERhdGFEU0xQYWNrYWdlLkRBVEFfSU5URVJDSEFOR0VfRVhQT1NFX19SRUZfUFJPUEVSVFk6CisJCQkJaWYgKHJlc29sdmUpIHJldHVybiBnZXRSZWZQcm9wZXJ0eSgpOworCQkJCXJldHVybiBiYXNpY0dldFJlZlByb3BlcnR5KCk7CisJCQljYXNlIERhdGFEU0xQYWNrYWdlLkRBVEFfSU5URVJDSEFOR0VfRVhQT1NFX19TVUJfRVhQT1NFOgorCQkJCXJldHVybiBnZXRTdWJFeHBvc2UoKTsKKwkJfQorCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgeworCQlzd2l0Y2ggKGZlYXR1cmVJRCkgeworCQkJY2FzZSBEYXRhRFNMUGFja2FnZS5EQVRBX0lOVEVSQ0hBTkdFX0VYUE9TRV9fUkVGX0VOVElUWToKKwkJCQlzZXRSZWZFbnRpdHkoKExFbnRpdHlSZWZlcmVuY2UpbmV3VmFsdWUpOworCQkJCXJldHVybjsKKwkJCWNhc2UgRGF0YURTTFBhY2thZ2UuREFUQV9JTlRFUkNIQU5HRV9FWFBPU0VfX1JFRl9QUk9QRVJUWToKKwkJCQlzZXRSZWZQcm9wZXJ0eSgoTEVudGl0eUF0dHJpYnV0ZSluZXdWYWx1ZSk7CisJCQkJcmV0dXJuOworCQkJY2FzZSBEYXRhRFNMUGFja2FnZS5EQVRBX0lOVEVSQ0hBTkdFX0VYUE9TRV9fU1VCX0VYUE9TRToKKwkJCQlzZXRTdWJFeHBvc2UoKERhdGFJbnRlcmNoYW5nZUV4cG9zZSluZXdWYWx1ZSk7CisJCQkJcmV0dXJuOworCQl9CisJCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKKwkJc3dpdGNoIChmZWF0dXJlSUQpIHsKKwkJCWNhc2UgRGF0YURTTFBhY2thZ2UuREFUQV9JTlRFUkNIQU5HRV9FWFBPU0VfX1JFRl9FTlRJVFk6CisJCQkJc2V0UmVmRW50aXR5KChMRW50aXR5UmVmZXJlbmNlKW51bGwpOworCQkJCXJldHVybjsKKwkJCWNhc2UgRGF0YURTTFBhY2thZ2UuREFUQV9JTlRFUkNIQU5HRV9FWFBPU0VfX1JFRl9QUk9QRVJUWToKKwkJCQlzZXRSZWZQcm9wZXJ0eSgoTEVudGl0eUF0dHJpYnV0ZSludWxsKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIERhdGFEU0xQYWNrYWdlLkRBVEFfSU5URVJDSEFOR0VfRVhQT1NFX19TVUJfRVhQT1NFOgorCQkJCXNldFN1YkV4cG9zZSgoRGF0YUludGVyY2hhbmdlRXhwb3NlKW51bGwpOworCQkJCXJldHVybjsKKwkJfQorCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgeworCQlzd2l0Y2ggKGZlYXR1cmVJRCkgeworCQkJY2FzZSBEYXRhRFNMUGFja2FnZS5EQVRBX0lOVEVSQ0hBTkdFX0VYUE9TRV9fUkVGX0VOVElUWToKKwkJCQlyZXR1cm4gcmVmRW50aXR5ICE9IG51bGw7CisJCQljYXNlIERhdGFEU0xQYWNrYWdlLkRBVEFfSU5URVJDSEFOR0VfRVhQT1NFX19SRUZfUFJPUEVSVFk6CisJCQkJcmV0dXJuIHJlZlByb3BlcnR5ICE9IG51bGw7CisJCQljYXNlIERhdGFEU0xQYWNrYWdlLkRBVEFfSU5URVJDSEFOR0VfRVhQT1NFX19TVUJfRVhQT1NFOgorCQkJCXJldHVybiBzdWJFeHBvc2UgIT0gbnVsbDsKKwkJfQorCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7CisJfQorCit9IC8vRGF0YUludGVyY2hhbmdlRXhwb3NlSW1wbApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5kYXRhaW50ZXJjaGFuZ2UvZW1mLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2RhdGFpbnRlcmNoYW5nZS9pbXBsL0RhdGFJbnRlcmNoYW5nZUZpbGVDU1ZJbXBsLmphdmEgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmRhdGFpbnRlcmNoYW5nZS9lbWYtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvZGF0YWludGVyY2hhbmdlL2ltcGwvRGF0YUludGVyY2hhbmdlRmlsZUNTVkltcGwuamF2YQppbmRleCBmNGExNDFkLi42ZTRkYzRmIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmRhdGFpbnRlcmNoYW5nZS9lbWYtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvZGF0YWludGVyY2hhbmdlL2ltcGwvRGF0YUludGVyY2hhbmdlRmlsZUNTVkltcGwuamF2YQorKysgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmRhdGFpbnRlcmNoYW5nZS9lbWYtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvZGF0YWludGVyY2hhbmdlL2ltcGwvRGF0YUludGVyY2hhbmdlRmlsZUNTVkltcGwuamF2YQpAQCAtMSwxMyArMSwxNSBAQAogLyoqCiAgKiBDb3B5cmlnaHQgKGMpIDIwMTQsIExvZXR6IEdtYkgmQ28uS0cgKEhlaWRlbGJlcmcpCiAgKiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgCisgKiAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSAyLjAgIAogICogIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IAotICogIGh0dHB7Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIAorICogIGh0dHBzOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAvIAorICogCisgKiAgU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgCiAgKiAKICAqICBCYXNlZCBvbiBpZGVhcyBmcm9tIFh0ZXh0LCBYdGVuZCwgWGNvcmUKICAqICAgCi0gKiAgQ29udHJpYnV0b3JzeyAgCisgKiAgQ29udHJpYnV0b3JzOiAgCiAgKiAgCQlKb2VyZyBSaWVnZWwgLSBJbml0aWFsIGltcGxlbWVudGF0aW9uIAogICogIAogICovCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmRhdGFpbnRlcmNoYW5nZS9lbWYtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvZGF0YWludGVyY2hhbmdlL2ltcGwvRGF0YUludGVyY2hhbmdlRmlsZUVESUltcGwuamF2YSBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQuZGF0YWludGVyY2hhbmdlL2VtZi1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9kYXRhaW50ZXJjaGFuZ2UvaW1wbC9EYXRhSW50ZXJjaGFuZ2VGaWxlRURJSW1wbC5qYXZhCmluZGV4IDYxZWM5ZWUuLmQ0YTMzMjkgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLm9zYnAueHRleHQuZGF0YWludGVyY2hhbmdlL2VtZi1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9kYXRhaW50ZXJjaGFuZ2UvaW1wbC9EYXRhSW50ZXJjaGFuZ2VGaWxlRURJSW1wbC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQuZGF0YWludGVyY2hhbmdlL2VtZi1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9kYXRhaW50ZXJjaGFuZ2UvaW1wbC9EYXRhSW50ZXJjaGFuZ2VGaWxlRURJSW1wbC5qYXZhCkBAIC0xLDEzICsxLDE1IEBACiAvKioKICAqIENvcHlyaWdodCAoYykgMjAxNCwgTG9ldHogR21iSCZDby5LRyAoSGVpZGVsYmVyZykKICAqICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCAKKyAqICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIDIuMCAgCiAgKiAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgCi0gKiAgaHR0cHsvL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwgCisgKiAgaHR0cHM6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC8gCisgKiAKKyAqICBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCAKICAqIAogICogIEJhc2VkIG9uIGlkZWFzIGZyb20gWHRleHQsIFh0ZW5kLCBYY29yZQogICogICAKLSAqICBDb250cmlidXRvcnN7ICAKKyAqICBDb250cmlidXRvcnM6ICAKICAqICAJCUpvZXJnIFJpZWdlbCAtIEluaXRpYWwgaW1wbGVtZW50YXRpb24gCiAgKiAgCiAgKi8KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLm9zYnAueHRleHQuZGF0YWludGVyY2hhbmdlL2VtZi1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9kYXRhaW50ZXJjaGFuZ2UvaW1wbC9EYXRhSW50ZXJjaGFuZ2VGaWxlWE1MSW1wbC5qYXZhIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5kYXRhaW50ZXJjaGFuZ2UvZW1mLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2RhdGFpbnRlcmNoYW5nZS9pbXBsL0RhdGFJbnRlcmNoYW5nZUZpbGVYTUxJbXBsLmphdmEKaW5kZXggZWVmMzc2YS4uNjAxYTM0OSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5kYXRhaW50ZXJjaGFuZ2UvZW1mLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2RhdGFpbnRlcmNoYW5nZS9pbXBsL0RhdGFJbnRlcmNoYW5nZUZpbGVYTUxJbXBsLmphdmEKKysrIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5kYXRhaW50ZXJjaGFuZ2UvZW1mLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2RhdGFpbnRlcmNoYW5nZS9pbXBsL0RhdGFJbnRlcmNoYW5nZUZpbGVYTUxJbXBsLmphdmEKQEAgLTEsMTMgKzEsMTUgQEAKIC8qKgogICogQ29weXJpZ2h0IChjKSAyMDE0LCBMb2V0eiBHbWJIJkNvLktHIChIZWlkZWxiZXJnKQogICogIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIAorICogIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgMi4wICAKICAqICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAKLSAqICBodHRwey8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCAKKyAqICBodHRwczovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLyAKKyAqIAorICogIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIAogICogCiAgKiAgQmFzZWQgb24gaWRlYXMgZnJvbSBYdGV4dCwgWHRlbmQsIFhjb3JlCiAgKiAgIAotICogIENvbnRyaWJ1dG9yc3sgIAorICogIENvbnRyaWJ1dG9yczogIAogICogIAkJSm9lcmcgUmllZ2VsIC0gSW5pdGlhbCBpbXBsZW1lbnRhdGlvbiAKICAqICAKICAqLwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5kYXRhaW50ZXJjaGFuZ2UvZW1mLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2RhdGFpbnRlcmNoYW5nZS9pbXBsL0RhdGFJbnRlcmNoYW5nZUZpbHRlckNvbmRpdGlvbkltcGwuamF2YSBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQuZGF0YWludGVyY2hhbmdlL2VtZi1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9kYXRhaW50ZXJjaGFuZ2UvaW1wbC9EYXRhSW50ZXJjaGFuZ2VGaWx0ZXJDb25kaXRpb25JbXBsLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODZjNTZkZgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQuZGF0YWludGVyY2hhbmdlL2VtZi1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9kYXRhaW50ZXJjaGFuZ2UvaW1wbC9EYXRhSW50ZXJjaGFuZ2VGaWx0ZXJDb25kaXRpb25JbXBsLmphdmEKQEAgLTAsMCArMSw0MjcgQEAKKy8qKgorICogQ29weXJpZ2h0IChjKSAyMDE0LCBMb2V0eiBHbWJIJkNvLktHIChIZWlkZWxiZXJnKQorICogIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCisgKiAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSAyLjAgIAorICogIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IAorICogIGh0dHBzOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAvIAorICogCisgKiAgU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgCisgKiAKKyAqICBCYXNlZCBvbiBpZGVhcyBmcm9tIFh0ZXh0LCBYdGVuZCwgWGNvcmUKKyAqICAgCisgKiAgQ29udHJpYnV0b3JzOiAgCisgKiAgCQlKb2VyZyBSaWVnZWwgLSBJbml0aWFsIGltcGxlbWVudGF0aW9uIAorICogIAorICovCitwYWNrYWdlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQuZGF0YWludGVyY2hhbmdlLmltcGw7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW47CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAuZHNsLnNlbWFudGljLmVudGl0eS5MRW50aXR5RmVhdHVyZTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAueHRleHQuZGF0YWludGVyY2hhbmdlLkNvbmRpdGlvbkFuZE9wZXJhdG9yMTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmRhdGFpbnRlcmNoYW5nZS5Db25kaXRpb25BbmRPcGVyYXRvcjI7CitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5kYXRhaW50ZXJjaGFuZ2UuRGF0YURTTFBhY2thZ2U7CitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5kYXRhaW50ZXJjaGFuZ2UuRGF0YUludGVyY2hhbmdlRmlsdGVyQ29uZGl0aW9uOworCisvKioKKyAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisgKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+RGF0YSBJbnRlcmNoYW5nZSBGaWx0ZXIgQ29uZGl0aW9uPC9iPjwvZW0+Jy4KKyAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorICogPHA+CisgKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKKyAqIDwvcD4KKyAqIDx1bD4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmRhdGFpbnRlcmNoYW5nZS5pbXBsLkRhdGFJbnRlcmNoYW5nZUZpbHRlckNvbmRpdGlvbkltcGwjZ2V0UmVmUHJvcGVydHkgPGVtPlJlZiBQcm9wZXJ0eTwvZW0+fTwvbGk+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5kYXRhaW50ZXJjaGFuZ2UuaW1wbC5EYXRhSW50ZXJjaGFuZ2VGaWx0ZXJDb25kaXRpb25JbXBsI2dldE9wZXJhdG9yIDxlbT5PcGVyYXRvcjwvZW0+fTwvbGk+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5kYXRhaW50ZXJjaGFuZ2UuaW1wbC5EYXRhSW50ZXJjaGFuZ2VGaWx0ZXJDb25kaXRpb25JbXBsI2dldFZhbHVlIDxlbT5WYWx1ZTwvZW0+fTwvbGk+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5kYXRhaW50ZXJjaGFuZ2UuaW1wbC5EYXRhSW50ZXJjaGFuZ2VGaWx0ZXJDb25kaXRpb25JbXBsI2dldE9wZXJhdG9yMiA8ZW0+T3BlcmF0b3IyPC9lbT59PC9saT4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmRhdGFpbnRlcmNoYW5nZS5pbXBsLkRhdGFJbnRlcmNoYW5nZUZpbHRlckNvbmRpdGlvbkltcGwjZ2V0U3ViY29uZGl0aW9uIDxlbT5TdWJjb25kaXRpb248L2VtPn08L2xpPgorICogPC91bD4KKyAqCisgKiBAZ2VuZXJhdGVkCisgKi8KK3B1YmxpYyBjbGFzcyBEYXRhSW50ZXJjaGFuZ2VGaWx0ZXJDb25kaXRpb25JbXBsIGV4dGVuZHMgRGF0YUludGVyY2hhbmdlTGF6eVJlc29sdmVySW1wbCBpbXBsZW1lbnRzIERhdGFJbnRlcmNoYW5nZUZpbHRlckNvbmRpdGlvbiB7CisJLyoqCisJICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UmVmUHJvcGVydHkoKSA8ZW0+UmVmIFByb3BlcnR5PC9lbT59JyByZWZlcmVuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNnZXRSZWZQcm9wZXJ0eSgpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIExFbnRpdHlGZWF0dXJlIHJlZlByb3BlcnR5OworCisJLyoqCisJICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE9wZXJhdG9yKCkgPGVtPk9wZXJhdG9yPC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNnZXRPcGVyYXRvcigpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBDb25kaXRpb25BbmRPcGVyYXRvcjEgT1BFUkFUT1JfRURFRkFVTFQgPSBDb25kaXRpb25BbmRPcGVyYXRvcjEuRVFVQUxTOworCisJLyoqCisJICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0T3BlcmF0b3IoKSA8ZW0+T3BlcmF0b3I8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2dldE9wZXJhdG9yKCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgQ29uZGl0aW9uQW5kT3BlcmF0b3IxIG9wZXJhdG9yID0gT1BFUkFUT1JfRURFRkFVTFQ7CisKKwkvKioKKwkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VmFsdWUoKSA8ZW0+VmFsdWU8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2dldFZhbHVlKCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBWQUxVRV9FREVGQVVMVCA9IG51bGw7CisKKwkvKioKKwkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRWYWx1ZSgpIDxlbT5WYWx1ZTwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjZ2V0VmFsdWUoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBTdHJpbmcgdmFsdWUgPSBWQUxVRV9FREVGQVVMVDsKKworCS8qKgorCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRPcGVyYXRvcjIoKSA8ZW0+T3BlcmF0b3IyPC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNnZXRPcGVyYXRvcjIoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgQ29uZGl0aW9uQW5kT3BlcmF0b3IyIE9QRVJBVE9SMl9FREVGQVVMVCA9IENvbmRpdGlvbkFuZE9wZXJhdG9yMi5BTkQ7CisKKwkvKioKKwkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRPcGVyYXRvcjIoKSA8ZW0+T3BlcmF0b3IyPC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNnZXRPcGVyYXRvcjIoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBDb25kaXRpb25BbmRPcGVyYXRvcjIgb3BlcmF0b3IyID0gT1BFUkFUT1IyX0VERUZBVUxUOworCisJLyoqCisJICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0U3ViY29uZGl0aW9uKCkgPGVtPlN1YmNvbmRpdGlvbjwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjZ2V0U3ViY29uZGl0aW9uKCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgRGF0YUludGVyY2hhbmdlRmlsdGVyQ29uZGl0aW9uIHN1YmNvbmRpdGlvbjsKKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCBEYXRhSW50ZXJjaGFuZ2VGaWx0ZXJDb25kaXRpb25JbXBsKCkgeworCQlzdXBlcigpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgeworCQlyZXR1cm4gRGF0YURTTFBhY2thZ2UuTGl0ZXJhbHMuREFUQV9JTlRFUkNIQU5HRV9GSUxURVJfQ09ORElUSU9OOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBMRW50aXR5RmVhdHVyZSBnZXRSZWZQcm9wZXJ0eSgpIHsKKwkJaWYgKHJlZlByb3BlcnR5ICE9IG51bGwgJiYgcmVmUHJvcGVydHkuZUlzUHJveHkoKSkgeworCQkJSW50ZXJuYWxFT2JqZWN0IG9sZFJlZlByb3BlcnR5ID0gKEludGVybmFsRU9iamVjdClyZWZQcm9wZXJ0eTsKKwkJCXJlZlByb3BlcnR5ID0gKExFbnRpdHlGZWF0dXJlKWVSZXNvbHZlUHJveHkob2xkUmVmUHJvcGVydHkpOworCQkJaWYgKHJlZlByb3BlcnR5ICE9IG9sZFJlZlByb3BlcnR5KSB7CisJCQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQorCQkJCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uUkVTT0xWRSwgRGF0YURTTFBhY2thZ2UuREFUQV9JTlRFUkNIQU5HRV9GSUxURVJfQ09ORElUSU9OX19SRUZfUFJPUEVSVFksIG9sZFJlZlByb3BlcnR5LCByZWZQcm9wZXJ0eSkpOworCQkJfQorCQl9CisJCXJldHVybiByZWZQcm9wZXJ0eTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgTEVudGl0eUZlYXR1cmUgYmFzaWNHZXRSZWZQcm9wZXJ0eSgpIHsKKwkJcmV0dXJuIHJlZlByb3BlcnR5OworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyB2b2lkIHNldFJlZlByb3BlcnR5KExFbnRpdHlGZWF0dXJlIG5ld1JlZlByb3BlcnR5KSB7CisJCUxFbnRpdHlGZWF0dXJlIG9sZFJlZlByb3BlcnR5ID0gcmVmUHJvcGVydHk7CisJCXJlZlByb3BlcnR5ID0gbmV3UmVmUHJvcGVydHk7CisJCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKKwkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIERhdGFEU0xQYWNrYWdlLkRBVEFfSU5URVJDSEFOR0VfRklMVEVSX0NPTkRJVElPTl9fUkVGX1BST1BFUlRZLCBvbGRSZWZQcm9wZXJ0eSwgcmVmUHJvcGVydHkpKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgQ29uZGl0aW9uQW5kT3BlcmF0b3IxIGdldE9wZXJhdG9yKCkgeworCQlyZXR1cm4gb3BlcmF0b3I7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHZvaWQgc2V0T3BlcmF0b3IoQ29uZGl0aW9uQW5kT3BlcmF0b3IxIG5ld09wZXJhdG9yKSB7CisJCUNvbmRpdGlvbkFuZE9wZXJhdG9yMSBvbGRPcGVyYXRvciA9IG9wZXJhdG9yOworCQlvcGVyYXRvciA9IG5ld09wZXJhdG9yID09IG51bGwgPyBPUEVSQVRPUl9FREVGQVVMVCA6IG5ld09wZXJhdG9yOworCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCisJCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBEYXRhRFNMUGFja2FnZS5EQVRBX0lOVEVSQ0hBTkdFX0ZJTFRFUl9DT05ESVRJT05fX09QRVJBVE9SLCBvbGRPcGVyYXRvciwgb3BlcmF0b3IpKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgU3RyaW5nIGdldFZhbHVlKCkgeworCQlyZXR1cm4gdmFsdWU7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHZvaWQgc2V0VmFsdWUoU3RyaW5nIG5ld1ZhbHVlKSB7CisJCVN0cmluZyBvbGRWYWx1ZSA9IHZhbHVlOworCQl2YWx1ZSA9IG5ld1ZhbHVlOworCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCisJCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBEYXRhRFNMUGFja2FnZS5EQVRBX0lOVEVSQ0hBTkdFX0ZJTFRFUl9DT05ESVRJT05fX1ZBTFVFLCBvbGRWYWx1ZSwgdmFsdWUpKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgQ29uZGl0aW9uQW5kT3BlcmF0b3IyIGdldE9wZXJhdG9yMigpIHsKKwkJcmV0dXJuIG9wZXJhdG9yMjsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXRPcGVyYXRvcjIoQ29uZGl0aW9uQW5kT3BlcmF0b3IyIG5ld09wZXJhdG9yMikgeworCQlDb25kaXRpb25BbmRPcGVyYXRvcjIgb2xkT3BlcmF0b3IyID0gb3BlcmF0b3IyOworCQlvcGVyYXRvcjIgPSBuZXdPcGVyYXRvcjIgPT0gbnVsbCA/IE9QRVJBVE9SMl9FREVGQVVMVCA6IG5ld09wZXJhdG9yMjsKKwkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQorCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRGF0YURTTFBhY2thZ2UuREFUQV9JTlRFUkNIQU5HRV9GSUxURVJfQ09ORElUSU9OX19PUEVSQVRPUjIsIG9sZE9wZXJhdG9yMiwgb3BlcmF0b3IyKSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIERhdGFJbnRlcmNoYW5nZUZpbHRlckNvbmRpdGlvbiBnZXRTdWJjb25kaXRpb24oKSB7CisJCXJldHVybiBzdWJjb25kaXRpb247CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGJhc2ljU2V0U3ViY29uZGl0aW9uKERhdGFJbnRlcmNoYW5nZUZpbHRlckNvbmRpdGlvbiBuZXdTdWJjb25kaXRpb24sIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKKwkJRGF0YUludGVyY2hhbmdlRmlsdGVyQ29uZGl0aW9uIG9sZFN1YmNvbmRpdGlvbiA9IHN1YmNvbmRpdGlvbjsKKwkJc3ViY29uZGl0aW9uID0gbmV3U3ViY29uZGl0aW9uOworCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpIHsKKwkJCUVOb3RpZmljYXRpb25JbXBsIG5vdGlmaWNhdGlvbiA9IG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBEYXRhRFNMUGFja2FnZS5EQVRBX0lOVEVSQ0hBTkdFX0ZJTFRFUl9DT05ESVRJT05fX1NVQkNPTkRJVElPTiwgb2xkU3ViY29uZGl0aW9uLCBuZXdTdWJjb25kaXRpb24pOworCQkJaWYgKG1zZ3MgPT0gbnVsbCkgbXNncyA9IG5vdGlmaWNhdGlvbjsgZWxzZSBtc2dzLmFkZChub3RpZmljYXRpb24pOworCQl9CisJCXJldHVybiBtc2dzOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyB2b2lkIHNldFN1YmNvbmRpdGlvbihEYXRhSW50ZXJjaGFuZ2VGaWx0ZXJDb25kaXRpb24gbmV3U3ViY29uZGl0aW9uKSB7CisJCWlmIChuZXdTdWJjb25kaXRpb24gIT0gc3ViY29uZGl0aW9uKSB7CisJCQlOb3RpZmljYXRpb25DaGFpbiBtc2dzID0gbnVsbDsKKwkJCWlmIChzdWJjb25kaXRpb24gIT0gbnVsbCkKKwkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3Qpc3ViY29uZGl0aW9uKS5lSW52ZXJzZVJlbW92ZSh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gRGF0YURTTFBhY2thZ2UuREFUQV9JTlRFUkNIQU5HRV9GSUxURVJfQ09ORElUSU9OX19TVUJDT05ESVRJT04sIG51bGwsIG1zZ3MpOworCQkJaWYgKG5ld1N1YmNvbmRpdGlvbiAhPSBudWxsKQorCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCluZXdTdWJjb25kaXRpb24pLmVJbnZlcnNlQWRkKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBEYXRhRFNMUGFja2FnZS5EQVRBX0lOVEVSQ0hBTkdFX0ZJTFRFUl9DT05ESVRJT05fX1NVQkNPTkRJVElPTiwgbnVsbCwgbXNncyk7CisJCQltc2dzID0gYmFzaWNTZXRTdWJjb25kaXRpb24obmV3U3ViY29uZGl0aW9uLCBtc2dzKTsKKwkJCWlmIChtc2dzICE9IG51bGwpIG1zZ3MuZGlzcGF0Y2goKTsKKwkJfQorCQllbHNlIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKKwkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIERhdGFEU0xQYWNrYWdlLkRBVEFfSU5URVJDSEFOR0VfRklMVEVSX0NPTkRJVElPTl9fU1VCQ09ORElUSU9OLCBuZXdTdWJjb25kaXRpb24sIG5ld1N1YmNvbmRpdGlvbikpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKKwkJc3dpdGNoIChmZWF0dXJlSUQpIHsKKwkJCWNhc2UgRGF0YURTTFBhY2thZ2UuREFUQV9JTlRFUkNIQU5HRV9GSUxURVJfQ09ORElUSU9OX19TVUJDT05ESVRJT046CisJCQkJcmV0dXJuIGJhc2ljU2V0U3ViY29uZGl0aW9uKG51bGwsIG1zZ3MpOworCQl9CisJCXJldHVybiBzdXBlci5lSW52ZXJzZVJlbW92ZShvdGhlckVuZCwgZmVhdHVyZUlELCBtc2dzKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7CisJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CisJCQljYXNlIERhdGFEU0xQYWNrYWdlLkRBVEFfSU5URVJDSEFOR0VfRklMVEVSX0NPTkRJVElPTl9fUkVGX1BST1BFUlRZOgorCQkJCWlmIChyZXNvbHZlKSByZXR1cm4gZ2V0UmVmUHJvcGVydHkoKTsKKwkJCQlyZXR1cm4gYmFzaWNHZXRSZWZQcm9wZXJ0eSgpOworCQkJY2FzZSBEYXRhRFNMUGFja2FnZS5EQVRBX0lOVEVSQ0hBTkdFX0ZJTFRFUl9DT05ESVRJT05fX09QRVJBVE9SOgorCQkJCXJldHVybiBnZXRPcGVyYXRvcigpOworCQkJY2FzZSBEYXRhRFNMUGFja2FnZS5EQVRBX0lOVEVSQ0hBTkdFX0ZJTFRFUl9DT05ESVRJT05fX1ZBTFVFOgorCQkJCXJldHVybiBnZXRWYWx1ZSgpOworCQkJY2FzZSBEYXRhRFNMUGFja2FnZS5EQVRBX0lOVEVSQ0hBTkdFX0ZJTFRFUl9DT05ESVRJT05fX09QRVJBVE9SMjoKKwkJCQlyZXR1cm4gZ2V0T3BlcmF0b3IyKCk7CisJCQljYXNlIERhdGFEU0xQYWNrYWdlLkRBVEFfSU5URVJDSEFOR0VfRklMVEVSX0NPTkRJVElPTl9fU1VCQ09ORElUSU9OOgorCQkJCXJldHVybiBnZXRTdWJjb25kaXRpb24oKTsKKwkJfQorCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgeworCQlzd2l0Y2ggKGZlYXR1cmVJRCkgeworCQkJY2FzZSBEYXRhRFNMUGFja2FnZS5EQVRBX0lOVEVSQ0hBTkdFX0ZJTFRFUl9DT05ESVRJT05fX1JFRl9QUk9QRVJUWToKKwkJCQlzZXRSZWZQcm9wZXJ0eSgoTEVudGl0eUZlYXR1cmUpbmV3VmFsdWUpOworCQkJCXJldHVybjsKKwkJCWNhc2UgRGF0YURTTFBhY2thZ2UuREFUQV9JTlRFUkNIQU5HRV9GSUxURVJfQ09ORElUSU9OX19PUEVSQVRPUjoKKwkJCQlzZXRPcGVyYXRvcigoQ29uZGl0aW9uQW5kT3BlcmF0b3IxKW5ld1ZhbHVlKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIERhdGFEU0xQYWNrYWdlLkRBVEFfSU5URVJDSEFOR0VfRklMVEVSX0NPTkRJVElPTl9fVkFMVUU6CisJCQkJc2V0VmFsdWUoKFN0cmluZyluZXdWYWx1ZSk7CisJCQkJcmV0dXJuOworCQkJY2FzZSBEYXRhRFNMUGFja2FnZS5EQVRBX0lOVEVSQ0hBTkdFX0ZJTFRFUl9DT05ESVRJT05fX09QRVJBVE9SMjoKKwkJCQlzZXRPcGVyYXRvcjIoKENvbmRpdGlvbkFuZE9wZXJhdG9yMiluZXdWYWx1ZSk7CisJCQkJcmV0dXJuOworCQkJY2FzZSBEYXRhRFNMUGFja2FnZS5EQVRBX0lOVEVSQ0hBTkdFX0ZJTFRFUl9DT05ESVRJT05fX1NVQkNPTkRJVElPTjoKKwkJCQlzZXRTdWJjb25kaXRpb24oKERhdGFJbnRlcmNoYW5nZUZpbHRlckNvbmRpdGlvbiluZXdWYWx1ZSk7CisJCQkJcmV0dXJuOworCQl9CisJCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKKwkJc3dpdGNoIChmZWF0dXJlSUQpIHsKKwkJCWNhc2UgRGF0YURTTFBhY2thZ2UuREFUQV9JTlRFUkNIQU5HRV9GSUxURVJfQ09ORElUSU9OX19SRUZfUFJPUEVSVFk6CisJCQkJc2V0UmVmUHJvcGVydHkoKExFbnRpdHlGZWF0dXJlKW51bGwpOworCQkJCXJldHVybjsKKwkJCWNhc2UgRGF0YURTTFBhY2thZ2UuREFUQV9JTlRFUkNIQU5HRV9GSUxURVJfQ09ORElUSU9OX19PUEVSQVRPUjoKKwkJCQlzZXRPcGVyYXRvcihPUEVSQVRPUl9FREVGQVVMVCk7CisJCQkJcmV0dXJuOworCQkJY2FzZSBEYXRhRFNMUGFja2FnZS5EQVRBX0lOVEVSQ0hBTkdFX0ZJTFRFUl9DT05ESVRJT05fX1ZBTFVFOgorCQkJCXNldFZhbHVlKFZBTFVFX0VERUZBVUxUKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIERhdGFEU0xQYWNrYWdlLkRBVEFfSU5URVJDSEFOR0VfRklMVEVSX0NPTkRJVElPTl9fT1BFUkFUT1IyOgorCQkJCXNldE9wZXJhdG9yMihPUEVSQVRPUjJfRURFRkFVTFQpOworCQkJCXJldHVybjsKKwkJCWNhc2UgRGF0YURTTFBhY2thZ2UuREFUQV9JTlRFUkNIQU5HRV9GSUxURVJfQ09ORElUSU9OX19TVUJDT05ESVRJT046CisJCQkJc2V0U3ViY29uZGl0aW9uKChEYXRhSW50ZXJjaGFuZ2VGaWx0ZXJDb25kaXRpb24pbnVsbCk7CisJCQkJcmV0dXJuOworCQl9CisJCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7CisJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CisJCQljYXNlIERhdGFEU0xQYWNrYWdlLkRBVEFfSU5URVJDSEFOR0VfRklMVEVSX0NPTkRJVElPTl9fUkVGX1BST1BFUlRZOgorCQkJCXJldHVybiByZWZQcm9wZXJ0eSAhPSBudWxsOworCQkJY2FzZSBEYXRhRFNMUGFja2FnZS5EQVRBX0lOVEVSQ0hBTkdFX0ZJTFRFUl9DT05ESVRJT05fX09QRVJBVE9SOgorCQkJCXJldHVybiBvcGVyYXRvciAhPSBPUEVSQVRPUl9FREVGQVVMVDsKKwkJCWNhc2UgRGF0YURTTFBhY2thZ2UuREFUQV9JTlRFUkNIQU5HRV9GSUxURVJfQ09ORElUSU9OX19WQUxVRToKKwkJCQlyZXR1cm4gVkFMVUVfRURFRkFVTFQgPT0gbnVsbCA/IHZhbHVlICE9IG51bGwgOiAhVkFMVUVfRURFRkFVTFQuZXF1YWxzKHZhbHVlKTsKKwkJCWNhc2UgRGF0YURTTFBhY2thZ2UuREFUQV9JTlRFUkNIQU5HRV9GSUxURVJfQ09ORElUSU9OX19PUEVSQVRPUjI6CisJCQkJcmV0dXJuIG9wZXJhdG9yMiAhPSBPUEVSQVRPUjJfRURFRkFVTFQ7CisJCQljYXNlIERhdGFEU0xQYWNrYWdlLkRBVEFfSU5URVJDSEFOR0VfRklMVEVSX0NPTkRJVElPTl9fU1VCQ09ORElUSU9OOgorCQkJCXJldHVybiBzdWJjb25kaXRpb24gIT0gbnVsbDsKKwkJfQorCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKwkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOworCisJCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOworCQlyZXN1bHQuYXBwZW5kKCIgKG9wZXJhdG9yOiAiKTsKKwkJcmVzdWx0LmFwcGVuZChvcGVyYXRvcik7CisJCXJlc3VsdC5hcHBlbmQoIiwgdmFsdWU6ICIpOworCQlyZXN1bHQuYXBwZW5kKHZhbHVlKTsKKwkJcmVzdWx0LmFwcGVuZCgiLCBvcGVyYXRvcjI6ICIpOworCQlyZXN1bHQuYXBwZW5kKG9wZXJhdG9yMik7CisJCXJlc3VsdC5hcHBlbmQoJyknKTsKKwkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOworCX0KKworfSAvL0RhdGFJbnRlcmNoYW5nZUZpbHRlckNvbmRpdGlvbkltcGwKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLm9zYnAueHRleHQuZGF0YWludGVyY2hhbmdlL2VtZi1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9kYXRhaW50ZXJjaGFuZ2UvaW1wbC9EYXRhSW50ZXJjaGFuZ2VGb3JtYXRJbXBsLmphdmEgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmRhdGFpbnRlcmNoYW5nZS9lbWYtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvZGF0YWludGVyY2hhbmdlL2ltcGwvRGF0YUludGVyY2hhbmdlRm9ybWF0SW1wbC5qYXZhCmluZGV4IDNhNDUwMzEuLmExNzc0OWEgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLm9zYnAueHRleHQuZGF0YWludGVyY2hhbmdlL2VtZi1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9kYXRhaW50ZXJjaGFuZ2UvaW1wbC9EYXRhSW50ZXJjaGFuZ2VGb3JtYXRJbXBsLmphdmEKKysrIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5kYXRhaW50ZXJjaGFuZ2UvZW1mLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2RhdGFpbnRlcmNoYW5nZS9pbXBsL0RhdGFJbnRlcmNoYW5nZUZvcm1hdEltcGwuamF2YQpAQCAtMSwxMyArMSwxNSBAQAogLyoqCiAgKiBDb3B5cmlnaHQgKGMpIDIwMTQsIExvZXR6IEdtYkgmQ28uS0cgKEhlaWRlbGJlcmcpCiAgKiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgCisgKiAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSAyLjAgIAogICogIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IAotICogIGh0dHB7Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIAorICogIGh0dHBzOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAvIAorICogCisgKiAgU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgCiAgKiAKICAqICBCYXNlZCBvbiBpZGVhcyBmcm9tIFh0ZXh0LCBYdGVuZCwgWGNvcmUKICAqICAgCi0gKiAgQ29udHJpYnV0b3JzeyAgCisgKiAgQ29udHJpYnV0b3JzOiAgCiAgKiAgCQlKb2VyZyBSaWVnZWwgLSBJbml0aWFsIGltcGxlbWVudGF0aW9uIAogICogIAogICovCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmRhdGFpbnRlcmNoYW5nZS9lbWYtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvZGF0YWludGVyY2hhbmdlL2ltcGwvRGF0YUludGVyY2hhbmdlSW1wbC5qYXZhIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5kYXRhaW50ZXJjaGFuZ2UvZW1mLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2RhdGFpbnRlcmNoYW5nZS9pbXBsL0RhdGFJbnRlcmNoYW5nZUltcGwuamF2YQppbmRleCA1OTQ2NDUyLi5hYTIzOTczIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmRhdGFpbnRlcmNoYW5nZS9lbWYtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvZGF0YWludGVyY2hhbmdlL2ltcGwvRGF0YUludGVyY2hhbmdlSW1wbC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQuZGF0YWludGVyY2hhbmdlL2VtZi1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9kYXRhaW50ZXJjaGFuZ2UvaW1wbC9EYXRhSW50ZXJjaGFuZ2VJbXBsLmphdmEKQEAgLTEsMTMgKzEsMTUgQEAKIC8qKgogICogQ29weXJpZ2h0IChjKSAyMDE0LCBMb2V0eiBHbWJIJkNvLktHIChIZWlkZWxiZXJnKQogICogIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIAorICogIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgMi4wICAKICAqICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAKLSAqICBodHRwey8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCAKKyAqICBodHRwczovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLyAKKyAqIAorICogIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIAogICogCiAgKiAgQmFzZWQgb24gaWRlYXMgZnJvbSBYdGV4dCwgWHRlbmQsIFhjb3JlCiAgKiAgIAotICogIENvbnRyaWJ1dG9yc3sgIAorICogIENvbnRyaWJ1dG9yczogIAogICogIAkJSm9lcmcgUmllZ2VsIC0gSW5pdGlhbCBpbXBsZW1lbnRhdGlvbiAKICAqICAKICAqLwpAQCAtNTAsNiArNTIsNyBAQAogICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQuZGF0YWludGVyY2hhbmdlLmltcGwuRGF0YUludGVyY2hhbmdlSW1wbCNnZXRNb2RlIDxlbT5Nb2RlPC9lbT59PC9saT4KICAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmRhdGFpbnRlcmNoYW5nZS5pbXBsLkRhdGFJbnRlcmNoYW5nZUltcGwjZ2V0RmlsZUVuZHBvaW50IDxlbT5GaWxlIEVuZHBvaW50PC9lbT59PC9saT4KICAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmRhdGFpbnRlcmNoYW5nZS5pbXBsLkRhdGFJbnRlcmNoYW5nZUltcGwjZ2V0UGF0aCA8ZW0+UGF0aDwvZW0+fTwvbGk+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5kYXRhaW50ZXJjaGFuZ2UuaW1wbC5EYXRhSW50ZXJjaGFuZ2VJbXBsI2lzRGVsZXRlRmlsZUFmdGVySW1wb3J0IDxlbT5EZWxldGUgRmlsZSBBZnRlciBJbXBvcnQ8L2VtPn08L2xpPgogICogPC91bD4KICAqCiAgKiBAZ2VuZXJhdGVkCkBAIC0xOTYsNiArMTk5LDI2IEBACiAJcHJvdGVjdGVkIEVMaXN0PERhdGFJbnRlcmNoYW5nZUJlYW4+IHBhdGg7CiAKIAkvKioKKwkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNEZWxldGVGaWxlQWZ0ZXJJbXBvcnQoKSA8ZW0+RGVsZXRlIEZpbGUgQWZ0ZXIgSW1wb3J0PC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNpc0RlbGV0ZUZpbGVBZnRlckltcG9ydCgpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBib29sZWFuIERFTEVURV9GSUxFX0FGVEVSX0lNUE9SVF9FREVGQVVMVCA9IGZhbHNlOworCisJLyoqCisJICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNEZWxldGVGaWxlQWZ0ZXJJbXBvcnQoKSA8ZW0+RGVsZXRlIEZpbGUgQWZ0ZXIgSW1wb3J0PC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNpc0RlbGV0ZUZpbGVBZnRlckltcG9ydCgpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIGJvb2xlYW4gZGVsZXRlRmlsZUFmdGVySW1wb3J0ID0gREVMRVRFX0ZJTEVfQUZURVJfSU1QT1JUX0VERUZBVUxUOworCisJLyoqCiAJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCkBAIC00MDAsNiArNDIzLDI3IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLworCXB1YmxpYyBib29sZWFuIGlzRGVsZXRlRmlsZUFmdGVySW1wb3J0KCkgeworCQlyZXR1cm4gZGVsZXRlRmlsZUFmdGVySW1wb3J0OworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyB2b2lkIHNldERlbGV0ZUZpbGVBZnRlckltcG9ydChib29sZWFuIG5ld0RlbGV0ZUZpbGVBZnRlckltcG9ydCkgeworCQlib29sZWFuIG9sZERlbGV0ZUZpbGVBZnRlckltcG9ydCA9IGRlbGV0ZUZpbGVBZnRlckltcG9ydDsKKwkJZGVsZXRlRmlsZUFmdGVySW1wb3J0ID0gbmV3RGVsZXRlRmlsZUFmdGVySW1wb3J0OworCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCisJCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBEYXRhRFNMUGFja2FnZS5EQVRBX0lOVEVSQ0hBTkdFX19ERUxFVEVfRklMRV9BRlRFUl9JTVBPUlQsIG9sZERlbGV0ZUZpbGVBZnRlckltcG9ydCwgZGVsZXRlRmlsZUFmdGVySW1wb3J0KSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCiAJQE92ZXJyaWRlCiAJcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewogCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewpAQCAtNDM1LDYgKzQ3OSw4IEBACiAJCQkJcmV0dXJuIGdldEZpbGVFbmRwb2ludCgpOwogCQkJY2FzZSBEYXRhRFNMUGFja2FnZS5EQVRBX0lOVEVSQ0hBTkdFX19QQVRIOgogCQkJCXJldHVybiBnZXRQYXRoKCk7CisJCQljYXNlIERhdGFEU0xQYWNrYWdlLkRBVEFfSU5URVJDSEFOR0VfX0RFTEVURV9GSUxFX0FGVEVSX0lNUE9SVDoKKwkJCQlyZXR1cm4gaXNEZWxldGVGaWxlQWZ0ZXJJbXBvcnQoKTsKIAkJfQogCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKIAl9CkBAIC00NzMsNiArNTE5LDkgQEAKIAkJCQlnZXRQYXRoKCkuY2xlYXIoKTsKIAkJCQlnZXRQYXRoKCkuYWRkQWxsKChDb2xsZWN0aW9uPD8gZXh0ZW5kcyBEYXRhSW50ZXJjaGFuZ2VCZWFuPiluZXdWYWx1ZSk7CiAJCQkJcmV0dXJuOworCQkJY2FzZSBEYXRhRFNMUGFja2FnZS5EQVRBX0lOVEVSQ0hBTkdFX19ERUxFVEVfRklMRV9BRlRFUl9JTVBPUlQ6CisJCQkJc2V0RGVsZXRlRmlsZUFmdGVySW1wb3J0KChCb29sZWFuKW5ld1ZhbHVlKTsKKwkJCQlyZXR1cm47CiAJCX0KIAkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKIAl9CkBAIC01MDksNiArNTU4LDkgQEAKIAkJCWNhc2UgRGF0YURTTFBhY2thZ2UuREFUQV9JTlRFUkNIQU5HRV9fUEFUSDoKIAkJCQlnZXRQYXRoKCkuY2xlYXIoKTsKIAkJCQlyZXR1cm47CisJCQljYXNlIERhdGFEU0xQYWNrYWdlLkRBVEFfSU5URVJDSEFOR0VfX0RFTEVURV9GSUxFX0FGVEVSX0lNUE9SVDoKKwkJCQlzZXREZWxldGVGaWxlQWZ0ZXJJbXBvcnQoREVMRVRFX0ZJTEVfQUZURVJfSU1QT1JUX0VERUZBVUxUKTsKKwkJCQlyZXR1cm47CiAJCX0KIAkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7CiAJfQpAQCAtNTM3LDYgKzU4OSw4IEBACiAJCQkJcmV0dXJuIGZpbGVFbmRwb2ludCAhPSBudWxsOwogCQkJY2FzZSBEYXRhRFNMUGFja2FnZS5EQVRBX0lOVEVSQ0hBTkdFX19QQVRIOgogCQkJCXJldHVybiBwYXRoICE9IG51bGwgJiYgIXBhdGguaXNFbXB0eSgpOworCQkJY2FzZSBEYXRhRFNMUGFja2FnZS5EQVRBX0lOVEVSQ0hBTkdFX19ERUxFVEVfRklMRV9BRlRFUl9JTVBPUlQ6CisJCQkJcmV0dXJuIGRlbGV0ZUZpbGVBZnRlckltcG9ydCAhPSBERUxFVEVfRklMRV9BRlRFUl9JTVBPUlRfRURFRkFVTFQ7CiAJCX0KIAkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOwogCX0KQEAgLTU2Myw2ICs2MTcsOCBAQAogCQlyZXN1bHQuYXBwZW5kKGVsZW1lbnRTaXplKTsKIAkJcmVzdWx0LmFwcGVuZCgiLCBtb2RlOiAiKTsKIAkJcmVzdWx0LmFwcGVuZChtb2RlKTsKKwkJcmVzdWx0LmFwcGVuZCgiLCBkZWxldGVGaWxlQWZ0ZXJJbXBvcnQ6ICIpOworCQlyZXN1bHQuYXBwZW5kKGRlbGV0ZUZpbGVBZnRlckltcG9ydCk7CiAJCXJlc3VsdC5hcHBlbmQoJyknKTsKIAkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwogCX0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLm9zYnAueHRleHQuZGF0YWludGVyY2hhbmdlL2VtZi1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9kYXRhaW50ZXJjaGFuZ2UvaW1wbC9EYXRhSW50ZXJjaGFuZ2VLZXlJbXBsLmphdmEgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmRhdGFpbnRlcmNoYW5nZS9lbWYtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvZGF0YWludGVyY2hhbmdlL2ltcGwvRGF0YUludGVyY2hhbmdlS2V5SW1wbC5qYXZhCmluZGV4IDMzY2I2OWYuLjBhOWMxZjcgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLm9zYnAueHRleHQuZGF0YWludGVyY2hhbmdlL2VtZi1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9kYXRhaW50ZXJjaGFuZ2UvaW1wbC9EYXRhSW50ZXJjaGFuZ2VLZXlJbXBsLmphdmEKKysrIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5kYXRhaW50ZXJjaGFuZ2UvZW1mLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2RhdGFpbnRlcmNoYW5nZS9pbXBsL0RhdGFJbnRlcmNoYW5nZUtleUltcGwuamF2YQpAQCAtMSwxMyArMSwxNSBAQAogLyoqCiAgKiBDb3B5cmlnaHQgKGMpIDIwMTQsIExvZXR6IEdtYkgmQ28uS0cgKEhlaWRlbGJlcmcpCiAgKiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgCisgKiAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSAyLjAgIAogICogIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IAotICogIGh0dHB7Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIAorICogIGh0dHBzOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAvIAorICogCisgKiAgU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgCiAgKiAKICAqICBCYXNlZCBvbiBpZGVhcyBmcm9tIFh0ZXh0LCBYdGVuZCwgWGNvcmUKICAqICAgCi0gKiAgQ29udHJpYnV0b3JzeyAgCisgKiAgQ29udHJpYnV0b3JzOiAgCiAgKiAgCQlKb2VyZyBSaWVnZWwgLSBJbml0aWFsIGltcGxlbWVudGF0aW9uIAogICogIAogICovCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmRhdGFpbnRlcmNoYW5nZS9lbWYtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvZGF0YWludGVyY2hhbmdlL2ltcGwvRGF0YUludGVyY2hhbmdlTGF6eVJlc29sdmVySW1wbC5qYXZhIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5kYXRhaW50ZXJjaGFuZ2UvZW1mLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2RhdGFpbnRlcmNoYW5nZS9pbXBsL0RhdGFJbnRlcmNoYW5nZUxhenlSZXNvbHZlckltcGwuamF2YQppbmRleCBjOWIxYTFmLi5jY2I0MjA0IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmRhdGFpbnRlcmNoYW5nZS9lbWYtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvZGF0YWludGVyY2hhbmdlL2ltcGwvRGF0YUludGVyY2hhbmdlTGF6eVJlc29sdmVySW1wbC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQuZGF0YWludGVyY2hhbmdlL2VtZi1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9kYXRhaW50ZXJjaGFuZ2UvaW1wbC9EYXRhSW50ZXJjaGFuZ2VMYXp5UmVzb2x2ZXJJbXBsLmphdmEKQEAgLTEsMTMgKzEsMTUgQEAKIC8qKgogICogQ29weXJpZ2h0IChjKSAyMDE0LCBMb2V0eiBHbWJIJkNvLktHIChIZWlkZWxiZXJnKQogICogIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIAorICogIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgMi4wICAKICAqICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAKLSAqICBodHRwey8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCAKKyAqICBodHRwczovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLyAKKyAqIAorICogIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIAogICogCiAgKiAgQmFzZWQgb24gaWRlYXMgZnJvbSBYdGV4dCwgWHRlbmQsIFhjb3JlCiAgKiAgIAotICogIENvbnRyaWJ1dG9yc3sgIAorICogIENvbnRyaWJ1dG9yczogIAogICogIAkJSm9lcmcgUmllZ2VsIC0gSW5pdGlhbCBpbXBsZW1lbnRhdGlvbiAKICAqICAKICAqLwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5kYXRhaW50ZXJjaGFuZ2UvZW1mLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2RhdGFpbnRlcmNoYW5nZS9pbXBsL0RhdGFJbnRlcmNoYW5nZUxvb2t1cEltcGwuamF2YSBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQuZGF0YWludGVyY2hhbmdlL2VtZi1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9kYXRhaW50ZXJjaGFuZ2UvaW1wbC9EYXRhSW50ZXJjaGFuZ2VMb29rdXBJbXBsLmphdmEKaW5kZXggOGQzYmM5Yy4uZDVjZTNjNyAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5kYXRhaW50ZXJjaGFuZ2UvZW1mLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2RhdGFpbnRlcmNoYW5nZS9pbXBsL0RhdGFJbnRlcmNoYW5nZUxvb2t1cEltcGwuamF2YQorKysgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmRhdGFpbnRlcmNoYW5nZS9lbWYtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvZGF0YWludGVyY2hhbmdlL2ltcGwvRGF0YUludGVyY2hhbmdlTG9va3VwSW1wbC5qYXZhCkBAIC0xLDEzICsxLDE1IEBACiAvKioKICAqIENvcHlyaWdodCAoYykgMjAxNCwgTG9ldHogR21iSCZDby5LRyAoSGVpZGVsYmVyZykKICAqICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCAKKyAqICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIDIuMCAgCiAgKiAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgCi0gKiAgaHR0cHsvL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwgCisgKiAgaHR0cHM6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC8gCisgKiAKKyAqICBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCAKICAqIAogICogIEJhc2VkIG9uIGlkZWFzIGZyb20gWHRleHQsIFh0ZW5kLCBYY29yZQogICogICAKLSAqICBDb250cmlidXRvcnN7ICAKKyAqICBDb250cmlidXRvcnM6ICAKICAqICAJCUpvZXJnIFJpZWdlbCAtIEluaXRpYWwgaW1wbGVtZW50YXRpb24gCiAgKiAgCiAgKi8KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLm9zYnAueHRleHQuZGF0YWludGVyY2hhbmdlL2VtZi1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9kYXRhaW50ZXJjaGFuZ2UvaW1wbC9EYXRhSW50ZXJjaGFuZ2VNYXJrZXJFbnRpdHlJbXBsLmphdmEgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmRhdGFpbnRlcmNoYW5nZS9lbWYtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvZGF0YWludGVyY2hhbmdlL2ltcGwvRGF0YUludGVyY2hhbmdlTWFya2VyRW50aXR5SW1wbC5qYXZhCmluZGV4IGQyNDY4YjAuLmM5MzhlMzYgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLm9zYnAueHRleHQuZGF0YWludGVyY2hhbmdlL2VtZi1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9kYXRhaW50ZXJjaGFuZ2UvaW1wbC9EYXRhSW50ZXJjaGFuZ2VNYXJrZXJFbnRpdHlJbXBsLmphdmEKKysrIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5kYXRhaW50ZXJjaGFuZ2UvZW1mLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2RhdGFpbnRlcmNoYW5nZS9pbXBsL0RhdGFJbnRlcmNoYW5nZU1hcmtlckVudGl0eUltcGwuamF2YQpAQCAtMSwxMyArMSwxNSBAQAogLyoqCiAgKiBDb3B5cmlnaHQgKGMpIDIwMTQsIExvZXR6IEdtYkgmQ28uS0cgKEhlaWRlbGJlcmcpCiAgKiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgCisgKiAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSAyLjAgIAogICogIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IAotICogIGh0dHB7Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIAorICogIGh0dHBzOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAvIAorICogCisgKiAgU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgCiAgKiAKICAqICBCYXNlZCBvbiBpZGVhcyBmcm9tIFh0ZXh0LCBYdGVuZCwgWGNvcmUKICAqICAgCi0gKiAgQ29udHJpYnV0b3JzeyAgCisgKiAgQ29udHJpYnV0b3JzOiAgCiAgKiAgCQlKb2VyZyBSaWVnZWwgLSBJbml0aWFsIGltcGxlbWVudGF0aW9uIAogICogIAogICovCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmRhdGFpbnRlcmNoYW5nZS9lbWYtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvZGF0YWludGVyY2hhbmdlL2ltcGwvRGF0YUludGVyY2hhbmdlTWFya2VyUGF0aEltcGwuamF2YSBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQuZGF0YWludGVyY2hhbmdlL2VtZi1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9kYXRhaW50ZXJjaGFuZ2UvaW1wbC9EYXRhSW50ZXJjaGFuZ2VNYXJrZXJQYXRoSW1wbC5qYXZhCmluZGV4IGU0NjRmYjcuLmNmYTgzNDYgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLm9zYnAueHRleHQuZGF0YWludGVyY2hhbmdlL2VtZi1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9kYXRhaW50ZXJjaGFuZ2UvaW1wbC9EYXRhSW50ZXJjaGFuZ2VNYXJrZXJQYXRoSW1wbC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQuZGF0YWludGVyY2hhbmdlL2VtZi1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9kYXRhaW50ZXJjaGFuZ2UvaW1wbC9EYXRhSW50ZXJjaGFuZ2VNYXJrZXJQYXRoSW1wbC5qYXZhCkBAIC0xLDEzICsxLDE1IEBACiAvKioKICAqIENvcHlyaWdodCAoYykgMjAxNCwgTG9ldHogR21iSCZDby5LRyAoSGVpZGVsYmVyZykKICAqICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCAKKyAqICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIDIuMCAgCiAgKiAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgCi0gKiAgaHR0cHsvL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwgCisgKiAgaHR0cHM6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC8gCisgKiAKKyAqICBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCAKICAqIAogICogIEJhc2VkIG9uIGlkZWFzIGZyb20gWHRleHQsIFh0ZW5kLCBYY29yZQogICogICAKLSAqICBDb250cmlidXRvcnN7ICAKKyAqICBDb250cmlidXRvcnM6ICAKICAqICAJCUpvZXJnIFJpZWdlbCAtIEluaXRpYWwgaW1wbGVtZW50YXRpb24gCiAgKiAgCiAgKi8KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLm9zYnAueHRleHQuZGF0YWludGVyY2hhbmdlL2VtZi1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9kYXRhaW50ZXJjaGFuZ2UvaW1wbC9EYXRhSW50ZXJjaGFuZ2VNb2RlbEltcGwuamF2YSBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQuZGF0YWludGVyY2hhbmdlL2VtZi1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9kYXRhaW50ZXJjaGFuZ2UvaW1wbC9EYXRhSW50ZXJjaGFuZ2VNb2RlbEltcGwuamF2YQppbmRleCBhNWJmMWEwLi4zM2EwMWQ1IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmRhdGFpbnRlcmNoYW5nZS9lbWYtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvZGF0YWludGVyY2hhbmdlL2ltcGwvRGF0YUludGVyY2hhbmdlTW9kZWxJbXBsLmphdmEKKysrIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5kYXRhaW50ZXJjaGFuZ2UvZW1mLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2RhdGFpbnRlcmNoYW5nZS9pbXBsL0RhdGFJbnRlcmNoYW5nZU1vZGVsSW1wbC5qYXZhCkBAIC0xLDEzICsxLDE1IEBACiAvKioKICAqIENvcHlyaWdodCAoYykgMjAxNCwgTG9ldHogR21iSCZDby5LRyAoSGVpZGVsYmVyZykKICAqICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCAKKyAqICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIDIuMCAgCiAgKiAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgCi0gKiAgaHR0cHsvL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwgCisgKiAgaHR0cHM6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC8gCisgKiAKKyAqICBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCAKICAqIAogICogIEJhc2VkIG9uIGlkZWFzIGZyb20gWHRleHQsIFh0ZW5kLCBYY29yZQogICogICAKLSAqICBDb250cmlidXRvcnN7ICAKKyAqICBDb250cmlidXRvcnM6ICAKICAqICAJCUpvZXJnIFJpZWdlbCAtIEluaXRpYWwgaW1wbGVtZW50YXRpb24gCiAgKiAgCiAgKi8KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLm9zYnAueHRleHQuZGF0YWludGVyY2hhbmdlL2VtZi1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9kYXRhaW50ZXJjaGFuZ2UvaW1wbC9EYXRhSW50ZXJjaGFuZ2VQYWNrYWdlSW1wbC5qYXZhIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5kYXRhaW50ZXJjaGFuZ2UvZW1mLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2RhdGFpbnRlcmNoYW5nZS9pbXBsL0RhdGFJbnRlcmNoYW5nZVBhY2thZ2VJbXBsLmphdmEKaW5kZXggNWFiOGZjYS4uZTI1MDI2OSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5kYXRhaW50ZXJjaGFuZ2UvZW1mLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2RhdGFpbnRlcmNoYW5nZS9pbXBsL0RhdGFJbnRlcmNoYW5nZVBhY2thZ2VJbXBsLmphdmEKKysrIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5kYXRhaW50ZXJjaGFuZ2UvZW1mLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2RhdGFpbnRlcmNoYW5nZS9pbXBsL0RhdGFJbnRlcmNoYW5nZVBhY2thZ2VJbXBsLmphdmEKQEAgLTEsMTMgKzEsMTUgQEAKIC8qKgogICogQ29weXJpZ2h0IChjKSAyMDE0LCBMb2V0eiBHbWJIJkNvLktHIChIZWlkZWxiZXJnKQogICogIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIAorICogIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgMi4wICAKICAqICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAKLSAqICBodHRwey8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCAKKyAqICBodHRwczovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLyAKKyAqIAorICogIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIAogICogCiAgKiAgQmFzZWQgb24gaWRlYXMgZnJvbSBYdGV4dCwgWHRlbmQsIFhjb3JlCiAgKiAgIAotICogIENvbnRyaWJ1dG9yc3sgIAorICogIENvbnRyaWJ1dG9yczogIAogICogIAkJSm9lcmcgUmllZ2VsIC0gSW5pdGlhbCBpbXBsZW1lbnRhdGlvbiAKICAqICAKICAqLwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5kYXRhaW50ZXJjaGFuZ2UvZW1mLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2RhdGFpbnRlcmNoYW5nZS9pbXBsL0RhdGFJbnRlcmNoYW5nZVByZWRlZmluZWRFeHByZXNzaW9uSW1wbC5qYXZhIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5kYXRhaW50ZXJjaGFuZ2UvZW1mLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2RhdGFpbnRlcmNoYW5nZS9pbXBsL0RhdGFJbnRlcmNoYW5nZVByZWRlZmluZWRFeHByZXNzaW9uSW1wbC5qYXZhCmluZGV4IDljODhhNWIuLjZjZmVjODIgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLm9zYnAueHRleHQuZGF0YWludGVyY2hhbmdlL2VtZi1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9kYXRhaW50ZXJjaGFuZ2UvaW1wbC9EYXRhSW50ZXJjaGFuZ2VQcmVkZWZpbmVkRXhwcmVzc2lvbkltcGwuamF2YQorKysgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmRhdGFpbnRlcmNoYW5nZS9lbWYtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvZGF0YWludGVyY2hhbmdlL2ltcGwvRGF0YUludGVyY2hhbmdlUHJlZGVmaW5lZEV4cHJlc3Npb25JbXBsLmphdmEKQEAgLTEsMTMgKzEsMTUgQEAKIC8qKgogICogQ29weXJpZ2h0IChjKSAyMDE0LCBMb2V0eiBHbWJIJkNvLktHIChIZWlkZWxiZXJnKQogICogIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIAorICogIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgMi4wICAKICAqICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAKLSAqICBodHRwey8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCAKKyAqICBodHRwczovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLyAKKyAqIAorICogIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIAogICogCiAgKiAgQmFzZWQgb24gaWRlYXMgZnJvbSBYdGV4dCwgWHRlbmQsIFhjb3JlCiAgKiAgIAotICogIENvbnRyaWJ1dG9yc3sgIAorICogIENvbnRyaWJ1dG9yczogIAogICogIAkJSm9lcmcgUmllZ2VsIC0gSW5pdGlhbCBpbXBsZW1lbnRhdGlvbiAKICAqICAKICAqLwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5kYXRhaW50ZXJjaGFuZ2UvZW1mLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2RhdGFpbnRlcmNoYW5nZS9pbXBsL0RhdGFJbnRlcmNoYW5nZVZhbHVlTWFwcGluZ0ltcGwuamF2YSBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQuZGF0YWludGVyY2hhbmdlL2VtZi1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9kYXRhaW50ZXJjaGFuZ2UvaW1wbC9EYXRhSW50ZXJjaGFuZ2VWYWx1ZU1hcHBpbmdJbXBsLmphdmEKaW5kZXggNzYwNWJmNS4uMDFkMzIyOCAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5kYXRhaW50ZXJjaGFuZ2UvZW1mLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2RhdGFpbnRlcmNoYW5nZS9pbXBsL0RhdGFJbnRlcmNoYW5nZVZhbHVlTWFwcGluZ0ltcGwuamF2YQorKysgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmRhdGFpbnRlcmNoYW5nZS9lbWYtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvZGF0YWludGVyY2hhbmdlL2ltcGwvRGF0YUludGVyY2hhbmdlVmFsdWVNYXBwaW5nSW1wbC5qYXZhCkBAIC0xLDEzICsxLDE1IEBACiAvKioKICAqIENvcHlyaWdodCAoYykgMjAxNCwgTG9ldHogR21iSCZDby5LRyAoSGVpZGVsYmVyZykKICAqICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCAKKyAqICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIDIuMCAgCiAgKiAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgCi0gKiAgaHR0cHsvL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwgCisgKiAgaHR0cHM6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC8gCisgKiAKKyAqICBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCAKICAqIAogICogIEJhc2VkIG9uIGlkZWFzIGZyb20gWHRleHQsIFh0ZW5kLCBYY29yZQogICogICAKLSAqICBDb250cmlidXRvcnN7ICAKKyAqICBDb250cmlidXRvcnM6ICAKICAqICAJCUpvZXJnIFJpZWdlbCAtIEluaXRpYWwgaW1wbGVtZW50YXRpb24gCiAgKiAgCiAgKi8KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLm9zYnAueHRleHQuZGF0YWludGVyY2hhbmdlL2VtZi1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9kYXRhaW50ZXJjaGFuZ2UvdXRpbC9EYXRhRFNMQWRhcHRlckZhY3RvcnkuamF2YSBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQuZGF0YWludGVyY2hhbmdlL2VtZi1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9kYXRhaW50ZXJjaGFuZ2UvdXRpbC9EYXRhRFNMQWRhcHRlckZhY3RvcnkuamF2YQppbmRleCA5YTY4MDdkLi5lNWQwZTkyIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmRhdGFpbnRlcmNoYW5nZS9lbWYtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvZGF0YWludGVyY2hhbmdlL3V0aWwvRGF0YURTTEFkYXB0ZXJGYWN0b3J5LmphdmEKKysrIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5kYXRhaW50ZXJjaGFuZ2UvZW1mLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2RhdGFpbnRlcmNoYW5nZS91dGlsL0RhdGFEU0xBZGFwdGVyRmFjdG9yeS5qYXZhCkBAIC0xLDEzICsxLDE1IEBACiAvKioKICAqIENvcHlyaWdodCAoYykgMjAxNCwgTG9ldHogR21iSCZDby5LRyAoSGVpZGVsYmVyZykKICAqICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCAKKyAqICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIDIuMCAgCiAgKiAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgCi0gKiAgaHR0cHsvL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwgCisgKiAgaHR0cHM6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC8gCisgKiAKKyAqICBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCAKICAqIAogICogIEJhc2VkIG9uIGlkZWFzIGZyb20gWHRleHQsIFh0ZW5kLCBYY29yZQogICogICAKLSAqICBDb250cmlidXRvcnN7ICAKKyAqICBDb250cmlidXRvcnM6ICAKICAqICAJCUpvZXJnIFJpZWdlbCAtIEluaXRpYWwgaW1wbGVtZW50YXRpb24gCiAgKiAgCiAgKi8KQEAgLTE0Niw2ICsxNDgsMjIgQEAKIAkJCQlyZXR1cm4gY3JlYXRlRGF0YUludGVyY2hhbmdlTG9va3VwQWRhcHRlcigpOwogCQkJfQogCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgQWRhcHRlciBjYXNlRGF0YUludGVyY2hhbmdlRXhwb3NlKERhdGFJbnRlcmNoYW5nZUV4cG9zZSBvYmplY3QpIHsKKwkJCQlyZXR1cm4gY3JlYXRlRGF0YUludGVyY2hhbmdlRXhwb3NlQWRhcHRlcigpOworCQkJfQorCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgQWRhcHRlciBjYXNlRGF0YUludGVyY2hhbmdlRXhwb3J0RmlsdGVyKERhdGFJbnRlcmNoYW5nZUV4cG9ydEZpbHRlciBvYmplY3QpIHsKKwkJCQlyZXR1cm4gY3JlYXRlRGF0YUludGVyY2hhbmdlRXhwb3J0RmlsdGVyQWRhcHRlcigpOworCQkJfQorCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgQWRhcHRlciBjYXNlRGF0YUludGVyY2hhbmdlRmlsdGVyQ29uZGl0aW9uKERhdGFJbnRlcmNoYW5nZUZpbHRlckNvbmRpdGlvbiBvYmplY3QpIHsKKwkJCQlyZXR1cm4gY3JlYXRlRGF0YUludGVyY2hhbmdlRmlsdGVyQ29uZGl0aW9uQWRhcHRlcigpOworCQkJfQorCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgQWRhcHRlciBjYXNlRGF0YUludGVyY2hhbmdlRXhwb3J0SGlkZShEYXRhSW50ZXJjaGFuZ2VFeHBvcnRIaWRlIG9iamVjdCkgeworCQkJCXJldHVybiBjcmVhdGVEYXRhSW50ZXJjaGFuZ2VFeHBvcnRIaWRlQWRhcHRlcigpOworCQkJfQorCQkJQE92ZXJyaWRlCiAJCQlwdWJsaWMgQWRhcHRlciBjYXNlRGF0YUludGVyY2hhbmdlTWFya2VyUGF0aChEYXRhSW50ZXJjaGFuZ2VNYXJrZXJQYXRoIG9iamVjdCkgewogCQkJCXJldHVybiBjcmVhdGVEYXRhSW50ZXJjaGFuZ2VNYXJrZXJQYXRoQWRhcHRlcigpOwogCQkJfQpAQCAtNDE4LDYgKzQzNiw2MiBAQAogCX0KIAogCS8qKgorCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5kYXRhaW50ZXJjaGFuZ2UuRGF0YUludGVyY2hhbmdlRXhwb3NlIDxlbT5EYXRhIEludGVyY2hhbmdlIEV4cG9zZTwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7CisJICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCisJICogQHNlZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmRhdGFpbnRlcmNoYW5nZS5EYXRhSW50ZXJjaGFuZ2VFeHBvc2UKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEFkYXB0ZXIgY3JlYXRlRGF0YUludGVyY2hhbmdlRXhwb3NlQWRhcHRlcigpIHsKKwkJcmV0dXJuIG51bGw7CisJfQorCisJLyoqCisJICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmRhdGFpbnRlcmNoYW5nZS5EYXRhSW50ZXJjaGFuZ2VFeHBvcnRGaWx0ZXIgPGVtPkRhdGEgSW50ZXJjaGFuZ2UgRXhwb3J0IEZpbHRlcjwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7CisJICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCisJICogQHNlZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmRhdGFpbnRlcmNoYW5nZS5EYXRhSW50ZXJjaGFuZ2VFeHBvcnRGaWx0ZXIKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEFkYXB0ZXIgY3JlYXRlRGF0YUludGVyY2hhbmdlRXhwb3J0RmlsdGVyQWRhcHRlcigpIHsKKwkJcmV0dXJuIG51bGw7CisJfQorCisJLyoqCisJICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmRhdGFpbnRlcmNoYW5nZS5EYXRhSW50ZXJjaGFuZ2VGaWx0ZXJDb25kaXRpb24gPGVtPkRhdGEgSW50ZXJjaGFuZ2UgRmlsdGVyIENvbmRpdGlvbjwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7CisJICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCisJICogQHNlZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmRhdGFpbnRlcmNoYW5nZS5EYXRhSW50ZXJjaGFuZ2VGaWx0ZXJDb25kaXRpb24KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEFkYXB0ZXIgY3JlYXRlRGF0YUludGVyY2hhbmdlRmlsdGVyQ29uZGl0aW9uQWRhcHRlcigpIHsKKwkJcmV0dXJuIG51bGw7CisJfQorCisJLyoqCisJICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmRhdGFpbnRlcmNoYW5nZS5EYXRhSW50ZXJjaGFuZ2VFeHBvcnRIaWRlIDxlbT5EYXRhIEludGVyY2hhbmdlIEV4cG9ydCBIaWRlPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKKwkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQuZGF0YWludGVyY2hhbmdlLkRhdGFJbnRlcmNoYW5nZUV4cG9ydEhpZGUKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEFkYXB0ZXIgY3JlYXRlRGF0YUludGVyY2hhbmdlRXhwb3J0SGlkZUFkYXB0ZXIoKSB7CisJCXJldHVybiBudWxsOworCX0KKworCS8qKgogCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5kYXRhaW50ZXJjaGFuZ2UuRGF0YUludGVyY2hhbmdlTWFya2VyUGF0aCA8ZW0+RGF0YSBJbnRlcmNoYW5nZSBNYXJrZXIgUGF0aDwvZW0+fScuCiAJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KIAkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmRhdGFpbnRlcmNoYW5nZS9lbWYtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvZGF0YWludGVyY2hhbmdlL3V0aWwvRGF0YURTTFN3aXRjaC5qYXZhIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5kYXRhaW50ZXJjaGFuZ2UvZW1mLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2RhdGFpbnRlcmNoYW5nZS91dGlsL0RhdGFEU0xTd2l0Y2guamF2YQppbmRleCBiM2ViZjcyLi4xODBhMjc4IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmRhdGFpbnRlcmNoYW5nZS9lbWYtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvZGF0YWludGVyY2hhbmdlL3V0aWwvRGF0YURTTFN3aXRjaC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQuZGF0YWludGVyY2hhbmdlL2VtZi1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9kYXRhaW50ZXJjaGFuZ2UvdXRpbC9EYXRhRFNMU3dpdGNoLmphdmEKQEAgLTEsMTMgKzEsMTUgQEAKIC8qKgogICogQ29weXJpZ2h0IChjKSAyMDE0LCBMb2V0eiBHbWJIJkNvLktHIChIZWlkZWxiZXJnKQogICogIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIAorICogIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgMi4wICAKICAqICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAKLSAqICBodHRwey8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCAKKyAqICBodHRwczovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLyAKKyAqIAorICogIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIAogICogCiAgKiAgQmFzZWQgb24gaWRlYXMgZnJvbSBYdGV4dCwgWHRlbmQsIFhjb3JlCiAgKiAgIAotICogIENvbnRyaWJ1dG9yc3sgIAorICogIENvbnRyaWJ1dG9yczogIAogICogIAkJSm9lcmcgUmllZ2VsIC0gSW5pdGlhbCBpbXBsZW1lbnRhdGlvbiAKICAqICAKICAqLwpAQCAtMTk3LDYgKzE5OSwzNCBAQAogCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7CiAJCQkJcmV0dXJuIHJlc3VsdDsKIAkJCX0KKwkJCWNhc2UgRGF0YURTTFBhY2thZ2UuREFUQV9JTlRFUkNIQU5HRV9FWFBPU0U6IHsKKwkJCQlEYXRhSW50ZXJjaGFuZ2VFeHBvc2UgZGF0YUludGVyY2hhbmdlRXhwb3NlID0gKERhdGFJbnRlcmNoYW5nZUV4cG9zZSl0aGVFT2JqZWN0OworCQkJCVQgcmVzdWx0ID0gY2FzZURhdGFJbnRlcmNoYW5nZUV4cG9zZShkYXRhSW50ZXJjaGFuZ2VFeHBvc2UpOworCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZURhdGFJbnRlcmNoYW5nZUxhenlSZXNvbHZlcihkYXRhSW50ZXJjaGFuZ2VFeHBvc2UpOworCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7CisJCQkJcmV0dXJuIHJlc3VsdDsKKwkJCX0KKwkJCWNhc2UgRGF0YURTTFBhY2thZ2UuREFUQV9JTlRFUkNIQU5HRV9FWFBPUlRfRklMVEVSOiB7CisJCQkJRGF0YUludGVyY2hhbmdlRXhwb3J0RmlsdGVyIGRhdGFJbnRlcmNoYW5nZUV4cG9ydEZpbHRlciA9IChEYXRhSW50ZXJjaGFuZ2VFeHBvcnRGaWx0ZXIpdGhlRU9iamVjdDsKKwkJCQlUIHJlc3VsdCA9IGNhc2VEYXRhSW50ZXJjaGFuZ2VFeHBvcnRGaWx0ZXIoZGF0YUludGVyY2hhbmdlRXhwb3J0RmlsdGVyKTsKKwkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VEYXRhSW50ZXJjaGFuZ2VMYXp5UmVzb2x2ZXIoZGF0YUludGVyY2hhbmdlRXhwb3J0RmlsdGVyKTsKKwkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOworCQkJCXJldHVybiByZXN1bHQ7CisJCQl9CisJCQljYXNlIERhdGFEU0xQYWNrYWdlLkRBVEFfSU5URVJDSEFOR0VfRklMVEVSX0NPTkRJVElPTjogeworCQkJCURhdGFJbnRlcmNoYW5nZUZpbHRlckNvbmRpdGlvbiBkYXRhSW50ZXJjaGFuZ2VGaWx0ZXJDb25kaXRpb24gPSAoRGF0YUludGVyY2hhbmdlRmlsdGVyQ29uZGl0aW9uKXRoZUVPYmplY3Q7CisJCQkJVCByZXN1bHQgPSBjYXNlRGF0YUludGVyY2hhbmdlRmlsdGVyQ29uZGl0aW9uKGRhdGFJbnRlcmNoYW5nZUZpbHRlckNvbmRpdGlvbik7CisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlRGF0YUludGVyY2hhbmdlTGF6eVJlc29sdmVyKGRhdGFJbnRlcmNoYW5nZUZpbHRlckNvbmRpdGlvbik7CisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKKwkJCQlyZXR1cm4gcmVzdWx0OworCQkJfQorCQkJY2FzZSBEYXRhRFNMUGFja2FnZS5EQVRBX0lOVEVSQ0hBTkdFX0VYUE9SVF9ISURFOiB7CisJCQkJRGF0YUludGVyY2hhbmdlRXhwb3J0SGlkZSBkYXRhSW50ZXJjaGFuZ2VFeHBvcnRIaWRlID0gKERhdGFJbnRlcmNoYW5nZUV4cG9ydEhpZGUpdGhlRU9iamVjdDsKKwkJCQlUIHJlc3VsdCA9IGNhc2VEYXRhSW50ZXJjaGFuZ2VFeHBvcnRIaWRlKGRhdGFJbnRlcmNoYW5nZUV4cG9ydEhpZGUpOworCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZURhdGFJbnRlcmNoYW5nZUxhenlSZXNvbHZlcihkYXRhSW50ZXJjaGFuZ2VFeHBvcnRIaWRlKTsKKwkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOworCQkJCXJldHVybiByZXN1bHQ7CisJCQl9CiAJCQljYXNlIERhdGFEU0xQYWNrYWdlLkRBVEFfSU5URVJDSEFOR0VfTUFSS0VSX1BBVEg6IHsKIAkJCQlEYXRhSW50ZXJjaGFuZ2VNYXJrZXJQYXRoIGRhdGFJbnRlcmNoYW5nZU1hcmtlclBhdGggPSAoRGF0YUludGVyY2hhbmdlTWFya2VyUGF0aCl0aGVFT2JqZWN0OwogCQkJCVQgcmVzdWx0ID0gY2FzZURhdGFJbnRlcmNoYW5nZU1hcmtlclBhdGgoZGF0YUludGVyY2hhbmdlTWFya2VyUGF0aCk7CkBAIC00NzksNiArNTA5LDY2IEBACiAJfQogCiAJLyoqCisJICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+RGF0YSBJbnRlcmNoYW5nZSBFeHBvc2U8L2VtPicuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKKwkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KKwkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5EYXRhIEludGVyY2hhbmdlIEV4cG9zZTwvZW0+Jy4KKwkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFQgY2FzZURhdGFJbnRlcmNoYW5nZUV4cG9zZShEYXRhSW50ZXJjaGFuZ2VFeHBvc2Ugb2JqZWN0KSB7CisJCXJldHVybiBudWxsOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkRhdGEgSW50ZXJjaGFuZ2UgRXhwb3J0IEZpbHRlcjwvZW0+Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOworCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgorCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkRhdGEgSW50ZXJjaGFuZ2UgRXhwb3J0IEZpbHRlcjwvZW0+Jy4KKwkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFQgY2FzZURhdGFJbnRlcmNoYW5nZUV4cG9ydEZpbHRlcihEYXRhSW50ZXJjaGFuZ2VFeHBvcnRGaWx0ZXIgb2JqZWN0KSB7CisJCXJldHVybiBudWxsOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkRhdGEgSW50ZXJjaGFuZ2UgRmlsdGVyIENvbmRpdGlvbjwvZW0+Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOworCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgorCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkRhdGEgSW50ZXJjaGFuZ2UgRmlsdGVyIENvbmRpdGlvbjwvZW0+Jy4KKwkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFQgY2FzZURhdGFJbnRlcmNoYW5nZUZpbHRlckNvbmRpdGlvbihEYXRhSW50ZXJjaGFuZ2VGaWx0ZXJDb25kaXRpb24gb2JqZWN0KSB7CisJCXJldHVybiBudWxsOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkRhdGEgSW50ZXJjaGFuZ2UgRXhwb3J0IEhpZGU8L2VtPicuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKKwkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KKwkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5EYXRhIEludGVyY2hhbmdlIEV4cG9ydCBIaWRlPC9lbT4nLgorCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgVCBjYXNlRGF0YUludGVyY2hhbmdlRXhwb3J0SGlkZShEYXRhSW50ZXJjaGFuZ2VFeHBvcnRIaWRlIG9iamVjdCkgeworCQlyZXR1cm4gbnVsbDsKKwl9CisKKwkvKioKIAkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5EYXRhIEludGVyY2hhbmdlIE1hcmtlciBQYXRoPC9lbT4nLgogCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CiAJICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmRhdGFpbnRlcmNoYW5nZS9lcGwtMi4wLmh0bWwgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmRhdGFpbnRlcmNoYW5nZS9lcGwtMi4wLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjM3YTE4MQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQuZGF0YWludGVyY2hhbmdlL2VwbC0yLjAuaHRtbApAQCAtMCwwICsxLDMwMCBAQAorPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgU3RyaWN0Ly9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXN0cmljdC5kdGQiPgorPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiIHhtbDpsYW5nPSJlbiIgbGFuZz0iZW4iPgorICA8aGVhZD4KKyAgICA8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11dGYtOCIgLz4KKyAgICA8dGl0bGU+RWNsaXBzZSBQdWJsaWMgTGljZW5zZSAtIFZlcnNpb24gMi4wPC90aXRsZT4KKyAgICA8c3R5bGUgdHlwZT0idGV4dC9jc3MiPgorICAgICAgYm9keSB7CisgICAgICAgIG1hcmdpbjogMS41ZW0gM2VtOworICAgICAgfQorICAgICAgaDF7CisgICAgICAgIGZvbnQtc2l6ZToxLjVlbTsKKyAgICAgIH0KKyAgICAgIGgyeworICAgICAgICBmb250LXNpemU6MWVtOworICAgICAgICBtYXJnaW4tYm90dG9tOjAuNWVtOworICAgICAgICBtYXJnaW4tdG9wOjFlbTsKKyAgICAgIH0KKyAgICAgIHAgeworICAgICAgICBtYXJnaW4tdG9wOiAgMC41ZW07CisgICAgICAgIG1hcmdpbi1ib3R0b206IDAuNWVtOworICAgICAgfQorICAgICAgdWwsIG9seworICAgICAgICBsaXN0LXN0eWxlLXR5cGU6bm9uZTsKKyAgICAgIH0KKyAgICA8L3N0eWxlPgorICA8L2hlYWQ+CisgIDxib2R5PgorICAgIDxoMT5FY2xpcHNlIFB1YmxpYyBMaWNlbnNlIC0gdiAyLjA8L2gxPgorICAgIDxwPlRIRSBBQ0NPTVBBTllJTkcgUFJPR1JBTSBJUyBQUk9WSURFRCBVTkRFUiBUSEUgVEVSTVMgT0YgVEhJUyBFQ0xJUFNFCisgICAgICBQVUJMSUMgTElDRU5TRSAoJmxkcXVvO0FHUkVFTUVOVCZyZHF1bzspLiBBTlkgVVNFLCBSRVBST0RVQ1RJT04gT1IgRElTVFJJQlVUSU9OCisgICAgICBPRiBUSEUgUFJPR1JBTSBDT05TVElUVVRFUyBSRUNJUElFTlQmIzAzOTtTIEFDQ0VQVEFOQ0UgT0YgVEhJUyBBR1JFRU1FTlQuCisgICAgPC9wPgorICAgIDxoMiBpZD0iZGVmaW5pdGlvbnMiPjEuIERFRklOSVRJT05TPC9oMj4KKyAgICA8cD4mbGRxdW87Q29udHJpYnV0aW9uJnJkcXVvOyBtZWFuczo8L3A+CisgICAgPHVsPgorICAgICAgPGxpPmEpIGluIHRoZSBjYXNlIG9mIHRoZSBpbml0aWFsIENvbnRyaWJ1dG9yLCB0aGUgaW5pdGlhbCBjb250ZW50CisgICAgICAgIERpc3RyaWJ1dGVkIHVuZGVyIHRoaXMgQWdyZWVtZW50LCBhbmQKKyAgICAgIDwvbGk+CisgICAgICA8bGk+CisgICAgICAgIGIpIGluIHRoZSBjYXNlIG9mIGVhY2ggc3Vic2VxdWVudCBDb250cmlidXRvcjoKKyAgICAgICAgPHVsPgorICAgICAgICAgIDxsaT5pKSBjaGFuZ2VzIHRvIHRoZSBQcm9ncmFtLCBhbmQ8L2xpPgorICAgICAgICAgIDxsaT5paSkgYWRkaXRpb25zIHRvIHRoZSBQcm9ncmFtOzwvbGk+CisgICAgICAgIDwvdWw+CisgICAgICAgIHdoZXJlIHN1Y2ggY2hhbmdlcyBhbmQvb3IgYWRkaXRpb25zIHRvIHRoZSBQcm9ncmFtIG9yaWdpbmF0ZSBmcm9tCisgICAgICAgIGFuZCBhcmUgRGlzdHJpYnV0ZWQgYnkgdGhhdCBwYXJ0aWN1bGFyIENvbnRyaWJ1dG9yLiBBIENvbnRyaWJ1dGlvbgorICAgICAgICAmbGRxdW87b3JpZ2luYXRlcyZyZHF1bzsgZnJvbSBhIENvbnRyaWJ1dG9yIGlmIGl0IHdhcyBhZGRlZCB0byB0aGUgUHJvZ3JhbSBieSBzdWNoCisgICAgICAgIENvbnRyaWJ1dG9yIGl0c2VsZiBvciBhbnlvbmUgYWN0aW5nIG9uIHN1Y2ggQ29udHJpYnV0b3ImIzAzOTtzIGJlaGFsZi4KKyAgICAgICAgQ29udHJpYnV0aW9ucyBkbyBub3QgaW5jbHVkZSBjaGFuZ2VzIG9yIGFkZGl0aW9ucyB0byB0aGUgUHJvZ3JhbSB0aGF0CisgICAgICAgIGFyZSBub3QgTW9kaWZpZWQgV29ya3MuCisgICAgICA8L2xpPgorICAgIDwvdWw+CisgICAgPHA+JmxkcXVvO0NvbnRyaWJ1dG9yJnJkcXVvOyBtZWFucyBhbnkgcGVyc29uIG9yIGVudGl0eSB0aGF0IERpc3RyaWJ1dGVzIHRoZSBQcm9ncmFtLjwvcD4KKyAgICA8cD4mbGRxdW87TGljZW5zZWQgUGF0ZW50cyZyZHF1bzsgbWVhbiBwYXRlbnQgY2xhaW1zIGxpY2Vuc2FibGUgYnkgYSBDb250cmlidXRvciB3aGljaAorICAgICAgYXJlIG5lY2Vzc2FyaWx5IGluZnJpbmdlZCBieSB0aGUgdXNlIG9yIHNhbGUgb2YgaXRzIENvbnRyaWJ1dGlvbiBhbG9uZQorICAgICAgb3Igd2hlbiBjb21iaW5lZCB3aXRoIHRoZSBQcm9ncmFtLgorICAgIDwvcD4KKyAgICA8cD4mbGRxdW87UHJvZ3JhbSZyZHF1bzsgbWVhbnMgdGhlIENvbnRyaWJ1dGlvbnMgRGlzdHJpYnV0ZWQgaW4gYWNjb3JkYW5jZSB3aXRoIHRoaXMKKyAgICAgIEFncmVlbWVudC4KKyAgICA8L3A+CisgICAgPHA+JmxkcXVvO1JlY2lwaWVudCZyZHF1bzsgbWVhbnMgYW55b25lIHdobyByZWNlaXZlcyB0aGUgUHJvZ3JhbSB1bmRlciB0aGlzIEFncmVlbWVudAorICAgICAgb3IgYW55IFNlY29uZGFyeSBMaWNlbnNlIChhcyBhcHBsaWNhYmxlKSwgaW5jbHVkaW5nIENvbnRyaWJ1dG9ycy4KKyAgICA8L3A+CisgICAgPHA+JmxkcXVvO0Rlcml2YXRpdmUgV29ya3MmcmRxdW87IHNoYWxsIG1lYW4gYW55IHdvcmssIHdoZXRoZXIgaW4gU291cmNlIENvZGUgb3Igb3RoZXIKKyAgICAgIGZvcm0sIHRoYXQgaXMgYmFzZWQgb24gKG9yIGRlcml2ZWQgZnJvbSkgdGhlIFByb2dyYW0gYW5kIGZvciB3aGljaCB0aGUKKyAgICAgIGVkaXRvcmlhbCByZXZpc2lvbnMsIGFubm90YXRpb25zLCBlbGFib3JhdGlvbnMsIG9yIG90aGVyIG1vZGlmaWNhdGlvbnMKKyAgICAgIHJlcHJlc2VudCwgYXMgYSB3aG9sZSwgYW4gb3JpZ2luYWwgd29yayBvZiBhdXRob3JzaGlwLgorICAgIDwvcD4KKyAgICA8cD4mbGRxdW87TW9kaWZpZWQgV29ya3MmcmRxdW87IHNoYWxsIG1lYW4gYW55IHdvcmsgaW4gU291cmNlIENvZGUgb3Igb3RoZXIgZm9ybSB0aGF0CisgICAgICByZXN1bHRzIGZyb20gYW4gYWRkaXRpb24gdG8sIGRlbGV0aW9uIGZyb20sIG9yIG1vZGlmaWNhdGlvbiBvZiB0aGUKKyAgICAgIGNvbnRlbnRzIG9mIHRoZSBQcm9ncmFtLCBpbmNsdWRpbmcsIGZvciBwdXJwb3NlcyBvZiBjbGFyaXR5IGFueSBuZXcgZmlsZQorICAgICAgaW4gU291cmNlIENvZGUgZm9ybSB0aGF0IGNvbnRhaW5zIGFueSBjb250ZW50cyBvZiB0aGUgUHJvZ3JhbS4gTW9kaWZpZWQKKyAgICAgIFdvcmtzIHNoYWxsIG5vdCBpbmNsdWRlIHdvcmtzIHRoYXQgY29udGFpbiBvbmx5IGRlY2xhcmF0aW9ucywgaW50ZXJmYWNlcywKKyAgICAgIHR5cGVzLCBjbGFzc2VzLCBzdHJ1Y3R1cmVzLCBvciBmaWxlcyBvZiB0aGUgUHJvZ3JhbSBzb2xlbHkgaW4gZWFjaCBjYXNlCisgICAgICBpbiBvcmRlciB0byBsaW5rIHRvLCBiaW5kIGJ5IG5hbWUsIG9yIHN1YmNsYXNzIHRoZSBQcm9ncmFtIG9yIE1vZGlmaWVkCisgICAgICBXb3JrcyB0aGVyZW9mLgorICAgIDwvcD4KKyAgICA8cD4mbGRxdW87RGlzdHJpYnV0ZSZyZHF1bzsgbWVhbnMgdGhlIGFjdHMgb2YgYSkgZGlzdHJpYnV0aW5nIG9yIGIpIG1ha2luZyBhdmFpbGFibGUKKyAgICAgIGluIGFueSBtYW5uZXIgdGhhdCBlbmFibGVzIHRoZSB0cmFuc2ZlciBvZiBhIGNvcHkuCisgICAgPC9wPgorICAgIDxwPiZsZHF1bztTb3VyY2UgQ29kZSZyZHF1bzsgbWVhbnMgdGhlIGZvcm0gb2YgYSBQcm9ncmFtIHByZWZlcnJlZCBmb3IgbWFraW5nCisgICAgICBtb2RpZmljYXRpb25zLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHNvZnR3YXJlIHNvdXJjZSBjb2RlLAorICAgICAgZG9jdW1lbnRhdGlvbiBzb3VyY2UsIGFuZCBjb25maWd1cmF0aW9uIGZpbGVzLgorICAgIDwvcD4KKyAgICA8cD4mbGRxdW87U2Vjb25kYXJ5IExpY2Vuc2UmcmRxdW87IG1lYW5zIGVpdGhlciB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgICAgICBWZXJzaW9uIDIuMCwgb3IgYW55IGxhdGVyIHZlcnNpb25zIG9mIHRoYXQgbGljZW5zZSwgaW5jbHVkaW5nIGFueQorICAgICAgZXhjZXB0aW9ucyBvciBhZGRpdGlvbmFsIHBlcm1pc3Npb25zIGFzIGlkZW50aWZpZWQgYnkgdGhlIGluaXRpYWwKKyAgICAgIENvbnRyaWJ1dG9yLgorICAgIDwvcD4KKyAgICA8aDIgaWQ9ImdyYW50LW9mLXJpZ2h0cyI+Mi4gR1JBTlQgT0YgUklHSFRTPC9oMj4KKyAgICA8dWw+CisgICAgICA8bGk+YSkgU3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhpcyBBZ3JlZW1lbnQsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5CisgICAgICAgIGdyYW50cyBSZWNpcGllbnQgYSBub24tZXhjbHVzaXZlLCB3b3JsZHdpZGUsIHJveWFsdHktZnJlZSBjb3B5cmlnaHQKKyAgICAgICAgbGljZW5zZSB0byByZXByb2R1Y2UsIHByZXBhcmUgRGVyaXZhdGl2ZSBXb3JrcyBvZiwgcHVibGljbHkgZGlzcGxheSwKKyAgICAgICAgcHVibGljbHkgcGVyZm9ybSwgRGlzdHJpYnV0ZSBhbmQgc3VibGljZW5zZSB0aGUgQ29udHJpYnV0aW9uIG9mIHN1Y2gKKyAgICAgICAgQ29udHJpYnV0b3IsIGlmIGFueSwgYW5kIHN1Y2ggRGVyaXZhdGl2ZSBXb3Jrcy4KKyAgICAgIDwvbGk+CisgICAgICA8bGk+YikgU3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhpcyBBZ3JlZW1lbnQsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5CisgICAgICAgIGdyYW50cyBSZWNpcGllbnQgYSBub24tZXhjbHVzaXZlLCB3b3JsZHdpZGUsIHJveWFsdHktZnJlZSBwYXRlbnQKKyAgICAgICAgbGljZW5zZSB1bmRlciBMaWNlbnNlZCBQYXRlbnRzIHRvIG1ha2UsIHVzZSwgc2VsbCwgb2ZmZXIgdG8gc2VsbCwKKyAgICAgICAgaW1wb3J0IGFuZCBvdGhlcndpc2UgdHJhbnNmZXIgdGhlIENvbnRyaWJ1dGlvbiBvZiBzdWNoIENvbnRyaWJ1dG9yLAorICAgICAgICBpZiBhbnksIGluIFNvdXJjZSBDb2RlIG9yIG90aGVyIGZvcm0uIFRoaXMgcGF0ZW50IGxpY2Vuc2Ugc2hhbGwKKyAgICAgICAgYXBwbHkgdG8gdGhlIGNvbWJpbmF0aW9uIG9mIHRoZSBDb250cmlidXRpb24gYW5kIHRoZSBQcm9ncmFtIGlmLAorICAgICAgICBhdCB0aGUgdGltZSB0aGUgQ29udHJpYnV0aW9uIGlzIGFkZGVkIGJ5IHRoZSBDb250cmlidXRvciwgc3VjaAorICAgICAgICBhZGRpdGlvbiBvZiB0aGUgQ29udHJpYnV0aW9uIGNhdXNlcyBzdWNoIGNvbWJpbmF0aW9uIHRvIGJlIGNvdmVyZWQKKyAgICAgICAgYnkgdGhlIExpY2Vuc2VkIFBhdGVudHMuIFRoZSBwYXRlbnQgbGljZW5zZSBzaGFsbCBub3QgYXBwbHkgdG8gYW55CisgICAgICAgIG90aGVyIGNvbWJpbmF0aW9ucyB3aGljaCBpbmNsdWRlIHRoZSBDb250cmlidXRpb24uIE5vIGhhcmR3YXJlIHBlcgorICAgICAgICBzZSBpcyBsaWNlbnNlZCBoZXJldW5kZXIuCisgICAgICA8L2xpPgorICAgICAgPGxpPmMpIFJlY2lwaWVudCB1bmRlcnN0YW5kcyB0aGF0IGFsdGhvdWdoIGVhY2ggQ29udHJpYnV0b3IgZ3JhbnRzIHRoZQorICAgICAgICBsaWNlbnNlcyB0byBpdHMgQ29udHJpYnV0aW9ucyBzZXQgZm9ydGggaGVyZWluLCBubyBhc3N1cmFuY2VzIGFyZQorICAgICAgICBwcm92aWRlZCBieSBhbnkgQ29udHJpYnV0b3IgdGhhdCB0aGUgUHJvZ3JhbSBkb2VzIG5vdCBpbmZyaW5nZSB0aGUKKyAgICAgICAgcGF0ZW50IG9yIG90aGVyIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgb2YgYW55IG90aGVyIGVudGl0eS4KKyAgICAgICAgRWFjaCBDb250cmlidXRvciBkaXNjbGFpbXMgYW55IGxpYWJpbGl0eSB0byBSZWNpcGllbnQgZm9yIGNsYWltcworICAgICAgICBicm91Z2h0IGJ5IGFueSBvdGhlciBlbnRpdHkgYmFzZWQgb24gaW5mcmluZ2VtZW50IG9mIGludGVsbGVjdHVhbAorICAgICAgICBwcm9wZXJ0eSByaWdodHMgb3Igb3RoZXJ3aXNlLiBBcyBhIGNvbmRpdGlvbiB0byBleGVyY2lzaW5nIHRoZSByaWdodHMKKyAgICAgICAgYW5kIGxpY2Vuc2VzIGdyYW50ZWQgaGVyZXVuZGVyLCBlYWNoIFJlY2lwaWVudCBoZXJlYnkgYXNzdW1lcyBzb2xlCisgICAgICAgIHJlc3BvbnNpYmlsaXR5IHRvIHNlY3VyZSBhbnkgb3RoZXIgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBuZWVkZWQsCisgICAgICAgIGlmIGFueS4gRm9yIGV4YW1wbGUsIGlmIGEgdGhpcmQgcGFydHkgcGF0ZW50IGxpY2Vuc2UgaXMgcmVxdWlyZWQgdG8KKyAgICAgICAgYWxsb3cgUmVjaXBpZW50IHRvIERpc3RyaWJ1dGUgdGhlIFByb2dyYW0sIGl0IGlzIFJlY2lwaWVudCYjMDM5O3MKKyAgICAgICAgcmVzcG9uc2liaWxpdHkgdG8gYWNxdWlyZSB0aGF0IGxpY2Vuc2UgYmVmb3JlIGRpc3RyaWJ1dGluZyB0aGUgUHJvZ3JhbS4KKyAgICAgIDwvbGk+CisgICAgICA8bGk+ZCkgRWFjaCBDb250cmlidXRvciByZXByZXNlbnRzIHRoYXQgdG8gaXRzIGtub3dsZWRnZSBpdCBoYXMgc3VmZmljaWVudAorICAgICAgICBjb3B5cmlnaHQgcmlnaHRzIGluIGl0cyBDb250cmlidXRpb24sIGlmIGFueSwgdG8gZ3JhbnQgdGhlIGNvcHlyaWdodAorICAgICAgICBsaWNlbnNlIHNldCBmb3J0aCBpbiB0aGlzIEFncmVlbWVudC4KKyAgICAgIDwvbGk+CisgICAgICA8bGk+ZSkgTm90d2l0aHN0YW5kaW5nIHRoZSB0ZXJtcyBvZiBhbnkgU2Vjb25kYXJ5IExpY2Vuc2UsIG5vIENvbnRyaWJ1dG9yCisgICAgICAgIG1ha2VzIGFkZGl0aW9uYWwgZ3JhbnRzIHRvIGFueSBSZWNpcGllbnQgKG90aGVyIHRoYW4gdGhvc2Ugc2V0IGZvcnRoCisgICAgICAgIGluIHRoaXMgQWdyZWVtZW50KSBhcyBhIHJlc3VsdCBvZiBzdWNoIFJlY2lwaWVudCYjMDM5O3MgcmVjZWlwdCBvZiB0aGUKKyAgICAgICAgUHJvZ3JhbSB1bmRlciB0aGUgdGVybXMgb2YgYSBTZWNvbmRhcnkgTGljZW5zZSAoaWYgcGVybWl0dGVkIHVuZGVyCisgICAgICAgIHRoZSB0ZXJtcyBvZiBTZWN0aW9uIDMpLgorICAgICAgPC9saT4KKyAgICA8L3VsPgorICAgIDxoMiBpZD0icmVxdWlyZW1lbnRzIj4zLiBSRVFVSVJFTUVOVFM8L2gyPgorICAgIDxwPjMuMSBJZiBhIENvbnRyaWJ1dG9yIERpc3RyaWJ1dGVzIHRoZSBQcm9ncmFtIGluIGFueSBmb3JtLCB0aGVuOjwvcD4KKyAgICA8dWw+CisgICAgICA8bGk+YSkgdGhlIFByb2dyYW0gbXVzdCBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIGFzIFNvdXJjZSBDb2RlLCBpbgorICAgICAgICBhY2NvcmRhbmNlIHdpdGggc2VjdGlvbiAzLjIsIGFuZCB0aGUgQ29udHJpYnV0b3IgbXVzdCBhY2NvbXBhbnkKKyAgICAgICAgdGhlIFByb2dyYW0gd2l0aCBhIHN0YXRlbWVudCB0aGF0IHRoZSBTb3VyY2UgQ29kZSBmb3IgdGhlIFByb2dyYW0KKyAgICAgICAgaXMgYXZhaWxhYmxlIHVuZGVyIHRoaXMgQWdyZWVtZW50LCBhbmQgaW5mb3JtcyBSZWNpcGllbnRzIGhvdyB0bworICAgICAgICBvYnRhaW4gaXQgaW4gYSByZWFzb25hYmxlIG1hbm5lciBvbiBvciB0aHJvdWdoIGEgbWVkaXVtIGN1c3RvbWFyaWx5CisgICAgICAgIHVzZWQgZm9yIHNvZnR3YXJlIGV4Y2hhbmdlOyBhbmQKKyAgICAgIDwvbGk+CisgICAgICA8bGk+CisgICAgICAgIGIpIHRoZSBDb250cmlidXRvciBtYXkgRGlzdHJpYnV0ZSB0aGUgUHJvZ3JhbSB1bmRlciBhIGxpY2Vuc2UKKyAgICAgICAgZGlmZmVyZW50IHRoYW4gdGhpcyBBZ3JlZW1lbnQsIHByb3ZpZGVkIHRoYXQgc3VjaCBsaWNlbnNlOgorICAgICAgICA8dWw+CisgICAgICAgICAgPGxpPmkpIGVmZmVjdGl2ZWx5IGRpc2NsYWltcyBvbiBiZWhhbGYgb2YgYWxsIG90aGVyIENvbnRyaWJ1dG9ycyBhbGwKKyAgICAgICAgICAgIHdhcnJhbnRpZXMgYW5kIGNvbmRpdGlvbnMsIGV4cHJlc3MgYW5kIGltcGxpZWQsIGluY2x1ZGluZyB3YXJyYW50aWVzCisgICAgICAgICAgICBvciBjb25kaXRpb25zIG9mIHRpdGxlIGFuZCBub24taW5mcmluZ2VtZW50LCBhbmQgaW1wbGllZCB3YXJyYW50aWVzCisgICAgICAgICAgICBvciBjb25kaXRpb25zIG9mIG1lcmNoYW50YWJpbGl0eSBhbmQgZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2U7CisgICAgICAgICAgPC9saT4KKyAgICAgICAgICA8bGk+aWkpIGVmZmVjdGl2ZWx5IGV4Y2x1ZGVzIG9uIGJlaGFsZiBvZiBhbGwgb3RoZXIgQ29udHJpYnV0b3JzIGFsbAorICAgICAgICAgICAgbGlhYmlsaXR5IGZvciBkYW1hZ2VzLCBpbmNsdWRpbmcgZGlyZWN0LCBpbmRpcmVjdCwgc3BlY2lhbCwgaW5jaWRlbnRhbAorICAgICAgICAgICAgYW5kIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywgc3VjaCBhcyBsb3N0IHByb2ZpdHM7CisgICAgICAgICAgPC9saT4KKyAgICAgICAgICA8bGk+aWlpKSBkb2VzIG5vdCBhdHRlbXB0IHRvIGxpbWl0IG9yIGFsdGVyIHRoZSByZWNpcGllbnRzJiMwMzk7IHJpZ2h0cyBpbiB0aGUKKyAgICAgICAgICAgIFNvdXJjZSBDb2RlIHVuZGVyIHNlY3Rpb24gMy4yOyBhbmQKKyAgICAgICAgICA8L2xpPgorICAgICAgICAgIDxsaT5pdikgcmVxdWlyZXMgYW55IHN1YnNlcXVlbnQgZGlzdHJpYnV0aW9uIG9mIHRoZSBQcm9ncmFtIGJ5IGFueSBwYXJ0eQorICAgICAgICAgICAgdG8gYmUgdW5kZXIgYSBsaWNlbnNlIHRoYXQgc2F0aXNmaWVzIHRoZSByZXF1aXJlbWVudHMgb2YgdGhpcyBzZWN0aW9uIDMuCisgICAgICAgICAgPC9saT4KKyAgICAgICAgPC91bD4KKyAgICAgIDwvbGk+CisgICAgPC91bD4KKyAgICA8cD4zLjIgV2hlbiB0aGUgUHJvZ3JhbSBpcyBEaXN0cmlidXRlZCBhcyBTb3VyY2UgQ29kZTo8L3A+CisgICAgPHVsPgorICAgICAgPGxpPmEpIGl0IG11c3QgYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhpcyBBZ3JlZW1lbnQsIG9yIGlmIHRoZSBQcm9ncmFtIChpKQorICAgICAgICBpcyBjb21iaW5lZCB3aXRoIG90aGVyIG1hdGVyaWFsIGluIGEgc2VwYXJhdGUgZmlsZSBvciBmaWxlcyBtYWRlIGF2YWlsYWJsZQorICAgICAgICB1bmRlciBhIFNlY29uZGFyeSBMaWNlbnNlLCBhbmQgKGlpKSB0aGUgaW5pdGlhbCBDb250cmlidXRvciBhdHRhY2hlZCB0bworICAgICAgICB0aGUgU291cmNlIENvZGUgdGhlIG5vdGljZSBkZXNjcmliZWQgaW4gRXhoaWJpdCBBIG9mIHRoaXMgQWdyZWVtZW50LAorICAgICAgICB0aGVuIHRoZSBQcm9ncmFtIG1heSBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2Ygc3VjaAorICAgICAgICBTZWNvbmRhcnkgTGljZW5zZXMsIGFuZAorICAgICAgPC9saT4KKyAgICAgIDxsaT5iKSBhIGNvcHkgb2YgdGhpcyBBZ3JlZW1lbnQgbXVzdCBiZSBpbmNsdWRlZCB3aXRoIGVhY2ggY29weSBvZiB0aGUgUHJvZ3JhbS48L2xpPgorICAgIDwvdWw+CisgICAgPHA+My4zIENvbnRyaWJ1dG9ycyBtYXkgbm90IHJlbW92ZSBvciBhbHRlciBhbnkgY29weXJpZ2h0LCBwYXRlbnQsIHRyYWRlbWFyaywKKyAgICAgIGF0dHJpYnV0aW9uIG5vdGljZXMsIGRpc2NsYWltZXJzIG9mIHdhcnJhbnR5LCBvciBsaW1pdGF0aW9ucyBvZiBsaWFiaWxpdHkKKyAgICAgICgmbHNxdW87bm90aWNlcyZyc3F1bzspIGNvbnRhaW5lZCB3aXRoaW4gdGhlIFByb2dyYW0gZnJvbSBhbnkgY29weSBvZiB0aGUgUHJvZ3JhbSB3aGljaAorICAgICAgdGhleSBEaXN0cmlidXRlLCBwcm92aWRlZCB0aGF0IENvbnRyaWJ1dG9ycyBtYXkgYWRkIHRoZWlyIG93biBhcHByb3ByaWF0ZQorICAgICAgbm90aWNlcy4KKyAgICA8L3A+CisgICAgPGgyIGlkPSJjb21tZXJjaWFsLWRpc3RyaWJ1dGlvbiI+NC4gQ09NTUVSQ0lBTCBESVNUUklCVVRJT048L2gyPgorICAgIDxwPkNvbW1lcmNpYWwgZGlzdHJpYnV0b3JzIG9mIHNvZnR3YXJlIG1heSBhY2NlcHQgY2VydGFpbiByZXNwb25zaWJpbGl0aWVzCisgICAgICB3aXRoIHJlc3BlY3QgdG8gZW5kIHVzZXJzLCBidXNpbmVzcyBwYXJ0bmVycyBhbmQgdGhlIGxpa2UuIFdoaWxlIHRoaXMKKyAgICAgIGxpY2Vuc2UgaXMgaW50ZW5kZWQgdG8gZmFjaWxpdGF0ZSB0aGUgY29tbWVyY2lhbCB1c2Ugb2YgdGhlIFByb2dyYW0sIHRoZQorICAgICAgQ29udHJpYnV0b3Igd2hvIGluY2x1ZGVzIHRoZSBQcm9ncmFtIGluIGEgY29tbWVyY2lhbCBwcm9kdWN0IG9mZmVyaW5nIHNob3VsZAorICAgICAgZG8gc28gaW4gYSBtYW5uZXIgd2hpY2ggZG9lcyBub3QgY3JlYXRlIHBvdGVudGlhbCBsaWFiaWxpdHkgZm9yIG90aGVyCisgICAgICBDb250cmlidXRvcnMuIFRoZXJlZm9yZSwgaWYgYSBDb250cmlidXRvciBpbmNsdWRlcyB0aGUgUHJvZ3JhbSBpbiBhCisgICAgICBjb21tZXJjaWFsIHByb2R1Y3Qgb2ZmZXJpbmcsIHN1Y2ggQ29udHJpYnV0b3IgKCZsZHF1bztDb21tZXJjaWFsIENvbnRyaWJ1dG9yJnJkcXVvOykKKyAgICAgIGhlcmVieSBhZ3JlZXMgdG8gZGVmZW5kIGFuZCBpbmRlbW5pZnkgZXZlcnkgb3RoZXIgQ29udHJpYnV0b3IKKyAgICAgICgmbGRxdW87SW5kZW1uaWZpZWQgQ29udHJpYnV0b3ImcmRxdW87KSBhZ2FpbnN0IGFueSBsb3NzZXMsIGRhbWFnZXMgYW5kIGNvc3RzCisgICAgICAoY29sbGVjdGl2ZWx5ICZsZHF1bztMb3NzZXMmcmRxdW87KSBhcmlzaW5nIGZyb20gY2xhaW1zLCBsYXdzdWl0cyBhbmQgb3RoZXIgbGVnYWwgYWN0aW9ucworICAgICAgYnJvdWdodCBieSBhIHRoaXJkIHBhcnR5IGFnYWluc3QgdGhlIEluZGVtbmlmaWVkIENvbnRyaWJ1dG9yIHRvIHRoZSBleHRlbnQKKyAgICAgIGNhdXNlZCBieSB0aGUgYWN0cyBvciBvbWlzc2lvbnMgb2Ygc3VjaCBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIGluIGNvbm5lY3Rpb24KKyAgICAgIHdpdGggaXRzIGRpc3RyaWJ1dGlvbiBvZiB0aGUgUHJvZ3JhbSBpbiBhIGNvbW1lcmNpYWwgcHJvZHVjdCBvZmZlcmluZy4KKyAgICAgIFRoZSBvYmxpZ2F0aW9ucyBpbiB0aGlzIHNlY3Rpb24gZG8gbm90IGFwcGx5IHRvIGFueSBjbGFpbXMgb3IgTG9zc2VzIHJlbGF0aW5nCisgICAgICB0byBhbnkgYWN0dWFsIG9yIGFsbGVnZWQgaW50ZWxsZWN0dWFsIHByb3BlcnR5IGluZnJpbmdlbWVudC4gSW4gb3JkZXIgdG8KKyAgICAgIHF1YWxpZnksIGFuIEluZGVtbmlmaWVkIENvbnRyaWJ1dG9yIG11c3Q6IGEpIHByb21wdGx5IG5vdGlmeSB0aGUKKyAgICAgIENvbW1lcmNpYWwgQ29udHJpYnV0b3IgaW4gd3JpdGluZyBvZiBzdWNoIGNsYWltLCBhbmQgYikgYWxsb3cgdGhlIENvbW1lcmNpYWwKKyAgICAgIENvbnRyaWJ1dG9yIHRvIGNvbnRyb2wsIGFuZCBjb29wZXJhdGUgd2l0aCB0aGUgQ29tbWVyY2lhbCBDb250cmlidXRvciBpbiwKKyAgICAgIHRoZSBkZWZlbnNlIGFuZCBhbnkgcmVsYXRlZCBzZXR0bGVtZW50IG5lZ290aWF0aW9ucy4gVGhlIEluZGVtbmlmaWVkCisgICAgICBDb250cmlidXRvciBtYXkgcGFydGljaXBhdGUgaW4gYW55IHN1Y2ggY2xhaW0gYXQgaXRzIG93biBleHBlbnNlLgorICAgIDwvcD4KKyAgICA8cD5Gb3IgZXhhbXBsZSwgYSBDb250cmlidXRvciBtaWdodCBpbmNsdWRlIHRoZSBQcm9ncmFtCisgICAgICBpbiBhIGNvbW1lcmNpYWwgcHJvZHVjdCBvZmZlcmluZywgUHJvZHVjdCBYLiBUaGF0IENvbnRyaWJ1dG9yIGlzIHRoZW4gYQorICAgICAgQ29tbWVyY2lhbCBDb250cmlidXRvci4gSWYgdGhhdCBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIHRoZW4gbWFrZXMgcGVyZm9ybWFuY2UKKyAgICAgIGNsYWltcywgb3Igb2ZmZXJzIHdhcnJhbnRpZXMgcmVsYXRlZCB0byBQcm9kdWN0IFgsIHRob3NlIHBlcmZvcm1hbmNlIGNsYWltcworICAgICAgYW5kIHdhcnJhbnRpZXMgYXJlIHN1Y2ggQ29tbWVyY2lhbCBDb250cmlidXRvciYjMDM5O3MgcmVzcG9uc2liaWxpdHkgYWxvbmUuCisgICAgICBVbmRlciB0aGlzIHNlY3Rpb24sIHRoZSBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIHdvdWxkIGhhdmUgdG8gZGVmZW5kIGNsYWltcworICAgICAgYWdhaW5zdCB0aGUgb3RoZXIgQ29udHJpYnV0b3JzIHJlbGF0ZWQgdG8gdGhvc2UgcGVyZm9ybWFuY2UgY2xhaW1zIGFuZAorICAgICAgd2FycmFudGllcywgYW5kIGlmIGEgY291cnQgcmVxdWlyZXMgYW55IG90aGVyIENvbnRyaWJ1dG9yIHRvIHBheSBhbnkgZGFtYWdlcworICAgICAgYXMgYSByZXN1bHQsIHRoZSBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIG11c3QgcGF5IHRob3NlIGRhbWFnZXMuCisgICAgPC9wPgorICAgIDxoMiBpZD0id2FycmFudHkiPjUuIE5PIFdBUlJBTlRZPC9oMj4KKyAgICA8cD5FWENFUFQgQVMgRVhQUkVTU0xZIFNFVCBGT1JUSCBJTiBUSElTIEFHUkVFTUVOVCwgQU5EIFRPIFRIRSBFWFRFTlQgUEVSTUlUVEVECisgICAgICBCWSBBUFBMSUNBQkxFIExBVywgVEhFIFBST0dSQU0gSVMgUFJPVklERUQgT04gQU4gJmxkcXVvO0FTIElTJnJkcXVvOyBCQVNJUywgV0lUSE9VVAorICAgICAgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBFSVRIRVIgRVhQUkVTUyBPUiBJTVBMSUVEIElOQ0xVRElORywKKyAgICAgIFdJVEhPVVQgTElNSVRBVElPTiwgQU5ZIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBUSVRMRSwgTk9OLUlORlJJTkdFTUVOVCwKKyAgICAgIE1FUkNIQU5UQUJJTElUWSBPUiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gRWFjaCBSZWNpcGllbnQgaXMKKyAgICAgIHNvbGVseSByZXNwb25zaWJsZSBmb3IgZGV0ZXJtaW5pbmcgdGhlIGFwcHJvcHJpYXRlbmVzcyBvZiB1c2luZyBhbmQKKyAgICAgIGRpc3RyaWJ1dGluZyB0aGUgUHJvZ3JhbSBhbmQgYXNzdW1lcyBhbGwgcmlza3MgYXNzb2NpYXRlZCB3aXRoIGl0cworICAgICAgZXhlcmNpc2Ugb2YgcmlnaHRzIHVuZGVyIHRoaXMgQWdyZWVtZW50LCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZQorICAgICAgcmlza3MgYW5kIGNvc3RzIG9mIHByb2dyYW0gZXJyb3JzLCBjb21wbGlhbmNlIHdpdGggYXBwbGljYWJsZSBsYXdzLCBkYW1hZ2UKKyAgICAgIHRvIG9yIGxvc3Mgb2YgZGF0YSwgcHJvZ3JhbXMgb3IgZXF1aXBtZW50LCBhbmQgdW5hdmFpbGFiaWxpdHkgb3IKKyAgICAgIGludGVycnVwdGlvbiBvZiBvcGVyYXRpb25zLgorICAgIDwvcD4KKyAgICA8aDIgaWQ9ImRpc2NsYWltZXIiPjYuIERJU0NMQUlNRVIgT0YgTElBQklMSVRZPC9oMj4KKyAgICA8cD5FWENFUFQgQVMgRVhQUkVTU0xZIFNFVCBGT1JUSCBJTiBUSElTIEFHUkVFTUVOVCwgQU5EIFRPIFRIRSBFWFRFTlQgUEVSTUlUVEVECisgICAgICBCWSBBUFBMSUNBQkxFIExBVywgTkVJVEhFUiBSRUNJUElFTlQgTk9SIEFOWSBDT05UUklCVVRPUlMgU0hBTEwgSEFWRSBBTlkKKyAgICAgIExJQUJJTElUWSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwKKyAgICAgIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HIFdJVEhPVVQgTElNSVRBVElPTiBMT1NUIFBST0ZJVFMpLAorICAgICAgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAgICAgIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKKyAgICAgIE9VVCBPRiBUSEUgVVNFIE9SIERJU1RSSUJVVElPTiBPRiBUSEUgUFJPR1JBTSBPUiBUSEUgRVhFUkNJU0UgT0YgQU5ZIFJJR0hUUworICAgICAgR1JBTlRFRCBIRVJFVU5ERVIsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0VTLgorICAgIDwvcD4KKyAgICA8aDIgaWQ9ImdlbmVyYWwiPjcuIEdFTkVSQUw8L2gyPgorICAgIDxwPklmIGFueSBwcm92aXNpb24gb2YgdGhpcyBBZ3JlZW1lbnQgaXMgaW52YWxpZCBvciB1bmVuZm9yY2VhYmxlIHVuZGVyCisgICAgICBhcHBsaWNhYmxlIGxhdywgaXQgc2hhbGwgbm90IGFmZmVjdCB0aGUgdmFsaWRpdHkgb3IgZW5mb3JjZWFiaWxpdHkgb2YgdGhlCisgICAgICByZW1haW5kZXIgb2YgdGhlIHRlcm1zIG9mIHRoaXMgQWdyZWVtZW50LCBhbmQgd2l0aG91dCBmdXJ0aGVyIGFjdGlvbiBieSB0aGUKKyAgICAgIHBhcnRpZXMgaGVyZXRvLCBzdWNoIHByb3Zpc2lvbiBzaGFsbCBiZSByZWZvcm1lZCB0byB0aGUgbWluaW11bSBleHRlbnQKKyAgICAgIG5lY2Vzc2FyeSB0byBtYWtlIHN1Y2ggcHJvdmlzaW9uIHZhbGlkIGFuZCBlbmZvcmNlYWJsZS4KKyAgICA8L3A+CisgICAgPHA+SWYgUmVjaXBpZW50IGluc3RpdHV0ZXMgcGF0ZW50IGxpdGlnYXRpb24gYWdhaW5zdCBhbnkgZW50aXR5IChpbmNsdWRpbmcgYQorICAgICAgY3Jvc3MtY2xhaW0gb3IgY291bnRlcmNsYWltIGluIGEgbGF3c3VpdCkgYWxsZWdpbmcgdGhhdCB0aGUgUHJvZ3JhbSBpdHNlbGYKKyAgICAgIChleGNsdWRpbmcgY29tYmluYXRpb25zIG9mIHRoZSBQcm9ncmFtIHdpdGggb3RoZXIgc29mdHdhcmUgb3IgaGFyZHdhcmUpCisgICAgICBpbmZyaW5nZXMgc3VjaCBSZWNpcGllbnQmIzAzOTtzIHBhdGVudChzKSwgdGhlbiBzdWNoIFJlY2lwaWVudCYjMDM5O3MgcmlnaHRzIGdyYW50ZWQKKyAgICAgIHVuZGVyIFNlY3Rpb24gMihiKSBzaGFsbCB0ZXJtaW5hdGUgYXMgb2YgdGhlIGRhdGUgc3VjaCBsaXRpZ2F0aW9uIGlzIGZpbGVkLgorICAgIDwvcD4KKyAgICA8cD5BbGwgUmVjaXBpZW50JiMwMzk7cyByaWdodHMgdW5kZXIgdGhpcyBBZ3JlZW1lbnQgc2hhbGwgdGVybWluYXRlIGlmIGl0IGZhaWxzIHRvCisgICAgICBjb21wbHkgd2l0aCBhbnkgb2YgdGhlIG1hdGVyaWFsIHRlcm1zIG9yIGNvbmRpdGlvbnMgb2YgdGhpcyBBZ3JlZW1lbnQgYW5kCisgICAgICBkb2VzIG5vdCBjdXJlIHN1Y2ggZmFpbHVyZSBpbiBhIHJlYXNvbmFibGUgcGVyaW9kIG9mIHRpbWUgYWZ0ZXIgYmVjb21pbmcKKyAgICAgIGF3YXJlIG9mIHN1Y2ggbm9uY29tcGxpYW5jZS4gSWYgYWxsIFJlY2lwaWVudCYjMDM5O3MgcmlnaHRzIHVuZGVyIHRoaXMgQWdyZWVtZW50CisgICAgICB0ZXJtaW5hdGUsIFJlY2lwaWVudCBhZ3JlZXMgdG8gY2Vhc2UgdXNlIGFuZCBkaXN0cmlidXRpb24gb2YgdGhlIFByb2dyYW0KKyAgICAgIGFzIHNvb24gYXMgcmVhc29uYWJseSBwcmFjdGljYWJsZS4gSG93ZXZlciwgUmVjaXBpZW50JiMwMzk7cyBvYmxpZ2F0aW9ucyB1bmRlcgorICAgICAgdGhpcyBBZ3JlZW1lbnQgYW5kIGFueSBsaWNlbnNlcyBncmFudGVkIGJ5IFJlY2lwaWVudCByZWxhdGluZyB0byB0aGUKKyAgICAgIFByb2dyYW0gc2hhbGwgY29udGludWUgYW5kIHN1cnZpdmUuCisgICAgPC9wPgorICAgIDxwPkV2ZXJ5b25lIGlzIHBlcm1pdHRlZCB0byBjb3B5IGFuZCBkaXN0cmlidXRlIGNvcGllcyBvZiB0aGlzIEFncmVlbWVudCwKKyAgICAgIGJ1dCBpbiBvcmRlciB0byBhdm9pZCBpbmNvbnNpc3RlbmN5IHRoZSBBZ3JlZW1lbnQgaXMgY29weXJpZ2h0ZWQgYW5kIG1heQorICAgICAgb25seSBiZSBtb2RpZmllZCBpbiB0aGUgZm9sbG93aW5nIG1hbm5lci4gVGhlIEFncmVlbWVudCBTdGV3YXJkIHJlc2VydmVzCisgICAgICB0aGUgcmlnaHQgdG8gcHVibGlzaCBuZXcgdmVyc2lvbnMgKGluY2x1ZGluZyByZXZpc2lvbnMpIG9mIHRoaXMgQWdyZWVtZW50CisgICAgICBmcm9tIHRpbWUgdG8gdGltZS4gTm8gb25lIG90aGVyIHRoYW4gdGhlIEFncmVlbWVudCBTdGV3YXJkIGhhcyB0aGUgcmlnaHQKKyAgICAgIHRvIG1vZGlmeSB0aGlzIEFncmVlbWVudC4gVGhlIEVjbGlwc2UgRm91bmRhdGlvbiBpcyB0aGUgaW5pdGlhbCBBZ3JlZW1lbnQKKyAgICAgIFN0ZXdhcmQuIFRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWF5IGFzc2lnbiB0aGUgcmVzcG9uc2liaWxpdHkgdG8gc2VydmUgYXMKKyAgICAgIHRoZSBBZ3JlZW1lbnQgU3Rld2FyZCB0byBhIHN1aXRhYmxlIHNlcGFyYXRlIGVudGl0eS4gRWFjaCBuZXcgdmVyc2lvbiBvZgorICAgICAgdGhlIEFncmVlbWVudCB3aWxsIGJlIGdpdmVuIGEgZGlzdGluZ3Vpc2hpbmcgdmVyc2lvbiBudW1iZXIuIFRoZSBQcm9ncmFtCisgICAgICAoaW5jbHVkaW5nIENvbnRyaWJ1dGlvbnMpIG1heSBhbHdheXMgYmUgRGlzdHJpYnV0ZWQgc3ViamVjdCB0byB0aGUgdmVyc2lvbgorICAgICAgb2YgdGhlIEFncmVlbWVudCB1bmRlciB3aGljaCBpdCB3YXMgcmVjZWl2ZWQuIEluIGFkZGl0aW9uLCBhZnRlciBhIG5ldworICAgICAgdmVyc2lvbiBvZiB0aGUgQWdyZWVtZW50IGlzIHB1Ymxpc2hlZCwgQ29udHJpYnV0b3IgbWF5IGVsZWN0IHRvIERpc3RyaWJ1dGUKKyAgICAgIHRoZSBQcm9ncmFtIChpbmNsdWRpbmcgaXRzIENvbnRyaWJ1dGlvbnMpIHVuZGVyIHRoZSBuZXcgdmVyc2lvbi4KKyAgICA8L3A+CisgICAgPHA+RXhjZXB0IGFzIGV4cHJlc3NseSBzdGF0ZWQgaW4gU2VjdGlvbnMgMihhKSBhbmQgMihiKSBhYm92ZSwgUmVjaXBpZW50CisgICAgICByZWNlaXZlcyBubyByaWdodHMgb3IgbGljZW5zZXMgdG8gdGhlIGludGVsbGVjdHVhbCBwcm9wZXJ0eSBvZiBhbnkKKyAgICAgIENvbnRyaWJ1dG9yIHVuZGVyIHRoaXMgQWdyZWVtZW50LCB3aGV0aGVyIGV4cHJlc3NseSwgYnkgaW1wbGljYXRpb24sCisgICAgICBlc3RvcHBlbCBvciBvdGhlcndpc2UuIEFsbCByaWdodHMgaW4gdGhlIFByb2dyYW0gbm90IGV4cHJlc3NseSBncmFudGVkCisgICAgICB1bmRlciB0aGlzIEFncmVlbWVudCBhcmUgcmVzZXJ2ZWQuIE5vdGhpbmcgaW4gdGhpcyBBZ3JlZW1lbnQgaXMgaW50ZW5kZWQKKyAgICAgIHRvIGJlIGVuZm9yY2VhYmxlIGJ5IGFueSBlbnRpdHkgdGhhdCBpcyBub3QgYSBDb250cmlidXRvciBvciBSZWNpcGllbnQuCisgICAgICBObyB0aGlyZC1wYXJ0eSBiZW5lZmljaWFyeSByaWdodHMgYXJlIGNyZWF0ZWQgdW5kZXIgdGhpcyBBZ3JlZW1lbnQuCisgICAgPC9wPgorICAgIDxoMiBpZD0iZXhoaWJpdC1hIj5FeGhpYml0IEEgJm5kYXNoOyBGb3JtIG9mIFNlY29uZGFyeSBMaWNlbnNlcyBOb3RpY2U8L2gyPgorICAgIDxwPiZsZHF1bztUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgCisgICAgCVNlY29uZGFyeSBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggCisgICAgCWluIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlLCB2LiAyLjAgYXJlIHNhdGlzZmllZDoge25hbWUgbGljZW5zZShzKSwKKyAgICAJdmVyc2lvbihzKSwgYW5kIGV4Y2VwdGlvbnMgb3IgYWRkaXRpb25hbCBwZXJtaXNzaW9ucyBoZXJlfS4mcmRxdW87CisgICAgPC9wPgorICAgIDxibG9ja3F1b3RlPgorICAgICAgPHA+U2ltcGx5IGluY2x1ZGluZyBhIGNvcHkgb2YgdGhpcyBBZ3JlZW1lbnQsIGluY2x1ZGluZyB0aGlzIEV4aGliaXQgQQorICAgICAgICBpcyBub3Qgc3VmZmljaWVudCB0byBsaWNlbnNlIHRoZSBTb3VyY2UgQ29kZSB1bmRlciBTZWNvbmRhcnkgTGljZW5zZXMuCisgICAgICA8L3A+CisgICAgICA8cD5JZiBpdCBpcyBub3QgcG9zc2libGUgb3IgZGVzaXJhYmxlIHRvIHB1dCB0aGUgbm90aWNlIGluIGEgcGFydGljdWxhciBmaWxlLAorICAgICAgICB0aGVuIFlvdSBtYXkgaW5jbHVkZSB0aGUgbm90aWNlIGluIGEgbG9jYXRpb24gKHN1Y2ggYXMgYSBMSUNFTlNFIGZpbGUgaW4gYQorICAgICAgICByZWxldmFudCBkaXJlY3RvcnkpIHdoZXJlIGEgcmVjaXBpZW50IHdvdWxkIGJlIGxpa2VseSB0byBsb29rIGZvcgorICAgICAgICBzdWNoIGEgbm90aWNlLgorICAgICAgPC9wPgorICAgICAgPHA+WW91IG1heSBhZGQgYWRkaXRpb25hbCBhY2N1cmF0ZSBub3RpY2VzIG9mIGNvcHlyaWdodCBvd25lcnNoaXAuPC9wPgorICAgIDwvYmxvY2txdW90ZT4KKyAgPC9ib2R5PgorPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLm9zYnAueHRleHQuZGF0YWludGVyY2hhbmdlL2VwbC12MTAuaHRtbCBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQuZGF0YWludGVyY2hhbmdlL2VwbC12MTAuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjM5OGFjYy4uMDAwMDAwMAotLS0gYS9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmRhdGFpbnRlcmNoYW5nZS9lcGwtdjEwLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyNTkgKzAsMCBAQAotPCEtLT94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iSVNPLTg4NTktMSIgPy0tPgotPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiPjxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9SVNPLTg4NTktMSI+Ci08dGl0bGU+RWNsaXBzZSBQdWJsaWMgTGljZW5zZSAtIFZlcnNpb24gMS4wPC90aXRsZT4KLTxzdHlsZSB0eXBlPSJ0ZXh0L2NzcyI+Ci0gIGJvZHkgewotICAgIHNpemU6IDguNWluIDExLjBpbjsKLSAgICBtYXJnaW46IDAuMjVpbiAwLjVpbiAwLjI1aW4gMC41aW47Ci0gICAgdGFiLWludGVydmFsOiAwLjVpbjsKLSAgICB9Ci0gIHAgeyAgCQotICAgIG1hcmdpbi1sZWZ0OiBhdXRvOwotICAgIG1hcmdpbi10b3A6ICAwLjVlbTsKLSAgICBtYXJnaW4tYm90dG9tOiAwLjVlbTsKLSAgICB9Ci0gIHAubGlzdCB7Ci0gIAltYXJnaW4tbGVmdDogMC41aW47Ci0gICAgbWFyZ2luLXRvcDogIDAuMDVlbTsKLSAgICBtYXJnaW4tYm90dG9tOiAwLjA1ZW07Ci0gICAgfQotICA8L3N0eWxlPgotCi08L2hlYWQ+Ci0KLTxib2R5IGxhbmc9IkVOLVVTIj4KLQotPGgyPkVjbGlwc2UgUHVibGljIExpY2Vuc2UgLSB2IDEuMDwvaDI+Ci0KLTxwPlRIRSBBQ0NPTVBBTllJTkcgUFJPR1JBTSBJUyBQUk9WSURFRCBVTkRFUiBUSEUgVEVSTVMgT0YgVEhJUyBFQ0xJUFNFCi1QVUJMSUMgTElDRU5TRSAoIkFHUkVFTUVOVCIpLiBBTlkgVVNFLCBSRVBST0RVQ1RJT04gT1IKLURJU1RSSUJVVElPTiBPRiBUSEUgUFJPR1JBTSBDT05TVElUVVRFUyBSRUNJUElFTlQnUyBBQ0NFUFRBTkNFIE9GIFRISVMKLUFHUkVFTUVOVC48L3A+Ci0KLTxwPjxiPjEuIERFRklOSVRJT05TPC9iPjwvcD4KLQotPHA+IkNvbnRyaWJ1dGlvbiIgbWVhbnM6PC9wPgotCi08cCBjbGFzcz0ibGlzdCI+YSkgaW4gdGhlIGNhc2Ugb2YgdGhlIGluaXRpYWwgQ29udHJpYnV0b3IsIHRoZSBpbml0aWFsCi1jb2RlIGFuZCBkb2N1bWVudGF0aW9uIGRpc3RyaWJ1dGVkIHVuZGVyIHRoaXMgQWdyZWVtZW50LCBhbmQ8L3A+Ci08cCBjbGFzcz0ibGlzdCI+YikgaW4gdGhlIGNhc2Ugb2YgZWFjaCBzdWJzZXF1ZW50IENvbnRyaWJ1dG9yOjwvcD4KLTxwIGNsYXNzPSJsaXN0Ij5pKSBjaGFuZ2VzIHRvIHRoZSBQcm9ncmFtLCBhbmQ8L3A+Ci08cCBjbGFzcz0ibGlzdCI+aWkpIGFkZGl0aW9ucyB0byB0aGUgUHJvZ3JhbTs8L3A+Ci08cCBjbGFzcz0ibGlzdCI+d2hlcmUgc3VjaCBjaGFuZ2VzIGFuZC9vciBhZGRpdGlvbnMgdG8gdGhlIFByb2dyYW0KLW9yaWdpbmF0ZSBmcm9tIGFuZCBhcmUgZGlzdHJpYnV0ZWQgYnkgdGhhdCBwYXJ0aWN1bGFyIENvbnRyaWJ1dG9yLiBBCi1Db250cmlidXRpb24gJ29yaWdpbmF0ZXMnIGZyb20gYSBDb250cmlidXRvciBpZiBpdCB3YXMgYWRkZWQgdG8gdGhlCi1Qcm9ncmFtIGJ5IHN1Y2ggQ29udHJpYnV0b3IgaXRzZWxmIG9yIGFueW9uZSBhY3Rpbmcgb24gc3VjaAotQ29udHJpYnV0b3IncyBiZWhhbGYuIENvbnRyaWJ1dGlvbnMgZG8gbm90IGluY2x1ZGUgYWRkaXRpb25zIHRvIHRoZQotUHJvZ3JhbSB3aGljaDogKGkpIGFyZSBzZXBhcmF0ZSBtb2R1bGVzIG9mIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIGluCi1jb25qdW5jdGlvbiB3aXRoIHRoZSBQcm9ncmFtIHVuZGVyIHRoZWlyIG93biBsaWNlbnNlIGFncmVlbWVudCwgYW5kIChpaSkKLWFyZSBub3QgZGVyaXZhdGl2ZSB3b3JrcyBvZiB0aGUgUHJvZ3JhbS48L3A+Ci0KLTxwPiJDb250cmlidXRvciIgbWVhbnMgYW55IHBlcnNvbiBvciBlbnRpdHkgdGhhdCBkaXN0cmlidXRlcwotdGhlIFByb2dyYW0uPC9wPgotCi08cD4iTGljZW5zZWQgUGF0ZW50cyIgbWVhbiBwYXRlbnQgY2xhaW1zIGxpY2Vuc2FibGUgYnkgYQotQ29udHJpYnV0b3Igd2hpY2ggYXJlIG5lY2Vzc2FyaWx5IGluZnJpbmdlZCBieSB0aGUgdXNlIG9yIHNhbGUgb2YgaXRzCi1Db250cmlidXRpb24gYWxvbmUgb3Igd2hlbiBjb21iaW5lZCB3aXRoIHRoZSBQcm9ncmFtLjwvcD4KLQotPHA+IlByb2dyYW0iIG1lYW5zIHRoZSBDb250cmlidXRpb25zIGRpc3RyaWJ1dGVkIGluIGFjY29yZGFuY2UKLXdpdGggdGhpcyBBZ3JlZW1lbnQuPC9wPgotCi08cD4iUmVjaXBpZW50IiBtZWFucyBhbnlvbmUgd2hvIHJlY2VpdmVzIHRoZSBQcm9ncmFtIHVuZGVyCi10aGlzIEFncmVlbWVudCwgaW5jbHVkaW5nIGFsbCBDb250cmlidXRvcnMuPC9wPgotCi08cD48Yj4yLiBHUkFOVCBPRiBSSUdIVFM8L2I+PC9wPgotCi08cCBjbGFzcz0ibGlzdCI+YSkgU3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhpcyBBZ3JlZW1lbnQsIGVhY2gKLUNvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgUmVjaXBpZW50IGEgbm9uLWV4Y2x1c2l2ZSwgd29ybGR3aWRlLAotcm95YWx0eS1mcmVlIGNvcHlyaWdodCBsaWNlbnNlIHRvIHJlcHJvZHVjZSwgcHJlcGFyZSBkZXJpdmF0aXZlIHdvcmtzCi1vZiwgcHVibGljbHkgZGlzcGxheSwgcHVibGljbHkgcGVyZm9ybSwgZGlzdHJpYnV0ZSBhbmQgc3VibGljZW5zZSB0aGUKLUNvbnRyaWJ1dGlvbiBvZiBzdWNoIENvbnRyaWJ1dG9yLCBpZiBhbnksIGFuZCBzdWNoIGRlcml2YXRpdmUgd29ya3MsIGluCi1zb3VyY2UgY29kZSBhbmQgb2JqZWN0IGNvZGUgZm9ybS48L3A+Ci0KLTxwIGNsYXNzPSJsaXN0Ij5iKSBTdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGlzIEFncmVlbWVudCwgZWFjaAotQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyBSZWNpcGllbnQgYSBub24tZXhjbHVzaXZlLCB3b3JsZHdpZGUsCi1yb3lhbHR5LWZyZWUgcGF0ZW50IGxpY2Vuc2UgdW5kZXIgTGljZW5zZWQgUGF0ZW50cyB0byBtYWtlLCB1c2UsIHNlbGwsCi1vZmZlciB0byBzZWxsLCBpbXBvcnQgYW5kIG90aGVyd2lzZSB0cmFuc2ZlciB0aGUgQ29udHJpYnV0aW9uIG9mIHN1Y2gKLUNvbnRyaWJ1dG9yLCBpZiBhbnksIGluIHNvdXJjZSBjb2RlIGFuZCBvYmplY3QgY29kZSBmb3JtLiBUaGlzIHBhdGVudAotbGljZW5zZSBzaGFsbCBhcHBseSB0byB0aGUgY29tYmluYXRpb24gb2YgdGhlIENvbnRyaWJ1dGlvbiBhbmQgdGhlCi1Qcm9ncmFtIGlmLCBhdCB0aGUgdGltZSB0aGUgQ29udHJpYnV0aW9uIGlzIGFkZGVkIGJ5IHRoZSBDb250cmlidXRvciwKLXN1Y2ggYWRkaXRpb24gb2YgdGhlIENvbnRyaWJ1dGlvbiBjYXVzZXMgc3VjaCBjb21iaW5hdGlvbiB0byBiZSBjb3ZlcmVkCi1ieSB0aGUgTGljZW5zZWQgUGF0ZW50cy4gVGhlIHBhdGVudCBsaWNlbnNlIHNoYWxsIG5vdCBhcHBseSB0byBhbnkgb3RoZXIKLWNvbWJpbmF0aW9ucyB3aGljaCBpbmNsdWRlIHRoZSBDb250cmlidXRpb24uIE5vIGhhcmR3YXJlIHBlciBzZSBpcwotbGljZW5zZWQgaGVyZXVuZGVyLjwvcD4KLQotPHAgY2xhc3M9Imxpc3QiPmMpIFJlY2lwaWVudCB1bmRlcnN0YW5kcyB0aGF0IGFsdGhvdWdoIGVhY2ggQ29udHJpYnV0b3IKLWdyYW50cyB0aGUgbGljZW5zZXMgdG8gaXRzIENvbnRyaWJ1dGlvbnMgc2V0IGZvcnRoIGhlcmVpbiwgbm8gYXNzdXJhbmNlcwotYXJlIHByb3ZpZGVkIGJ5IGFueSBDb250cmlidXRvciB0aGF0IHRoZSBQcm9ncmFtIGRvZXMgbm90IGluZnJpbmdlIHRoZQotcGF0ZW50IG9yIG90aGVyIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgb2YgYW55IG90aGVyIGVudGl0eS4gRWFjaAotQ29udHJpYnV0b3IgZGlzY2xhaW1zIGFueSBsaWFiaWxpdHkgdG8gUmVjaXBpZW50IGZvciBjbGFpbXMgYnJvdWdodCBieQotYW55IG90aGVyIGVudGl0eSBiYXNlZCBvbiBpbmZyaW5nZW1lbnQgb2YgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cwotb3Igb3RoZXJ3aXNlLiBBcyBhIGNvbmRpdGlvbiB0byBleGVyY2lzaW5nIHRoZSByaWdodHMgYW5kIGxpY2Vuc2VzCi1ncmFudGVkIGhlcmV1bmRlciwgZWFjaCBSZWNpcGllbnQgaGVyZWJ5IGFzc3VtZXMgc29sZSByZXNwb25zaWJpbGl0eSB0bwotc2VjdXJlIGFueSBvdGhlciBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIG5lZWRlZCwgaWYgYW55LiBGb3IKLWV4YW1wbGUsIGlmIGEgdGhpcmQgcGFydHkgcGF0ZW50IGxpY2Vuc2UgaXMgcmVxdWlyZWQgdG8gYWxsb3cgUmVjaXBpZW50Ci10byBkaXN0cmlidXRlIHRoZSBQcm9ncmFtLCBpdCBpcyBSZWNpcGllbnQncyByZXNwb25zaWJpbGl0eSB0byBhY3F1aXJlCi10aGF0IGxpY2Vuc2UgYmVmb3JlIGRpc3RyaWJ1dGluZyB0aGUgUHJvZ3JhbS48L3A+Ci0KLTxwIGNsYXNzPSJsaXN0Ij5kKSBFYWNoIENvbnRyaWJ1dG9yIHJlcHJlc2VudHMgdGhhdCB0byBpdHMga25vd2xlZGdlIGl0Ci1oYXMgc3VmZmljaWVudCBjb3B5cmlnaHQgcmlnaHRzIGluIGl0cyBDb250cmlidXRpb24sIGlmIGFueSwgdG8gZ3JhbnQKLXRoZSBjb3B5cmlnaHQgbGljZW5zZSBzZXQgZm9ydGggaW4gdGhpcyBBZ3JlZW1lbnQuPC9wPgotCi08cD48Yj4zLiBSRVFVSVJFTUVOVFM8L2I+PC9wPgotCi08cD5BIENvbnRyaWJ1dG9yIG1heSBjaG9vc2UgdG8gZGlzdHJpYnV0ZSB0aGUgUHJvZ3JhbSBpbiBvYmplY3QgY29kZQotZm9ybSB1bmRlciBpdHMgb3duIGxpY2Vuc2UgYWdyZWVtZW50LCBwcm92aWRlZCB0aGF0OjwvcD4KLQotPHAgY2xhc3M9Imxpc3QiPmEpIGl0IGNvbXBsaWVzIHdpdGggdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoaXMKLUFncmVlbWVudDsgYW5kPC9wPgotCi08cCBjbGFzcz0ibGlzdCI+YikgaXRzIGxpY2Vuc2UgYWdyZWVtZW50OjwvcD4KLQotPHAgY2xhc3M9Imxpc3QiPmkpIGVmZmVjdGl2ZWx5IGRpc2NsYWltcyBvbiBiZWhhbGYgb2YgYWxsIENvbnRyaWJ1dG9ycwotYWxsIHdhcnJhbnRpZXMgYW5kIGNvbmRpdGlvbnMsIGV4cHJlc3MgYW5kIGltcGxpZWQsIGluY2x1ZGluZyB3YXJyYW50aWVzCi1vciBjb25kaXRpb25zIG9mIHRpdGxlIGFuZCBub24taW5mcmluZ2VtZW50LCBhbmQgaW1wbGllZCB3YXJyYW50aWVzIG9yCi1jb25kaXRpb25zIG9mIG1lcmNoYW50YWJpbGl0eSBhbmQgZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2U7PC9wPgotCi08cCBjbGFzcz0ibGlzdCI+aWkpIGVmZmVjdGl2ZWx5IGV4Y2x1ZGVzIG9uIGJlaGFsZiBvZiBhbGwgQ29udHJpYnV0b3JzCi1hbGwgbGlhYmlsaXR5IGZvciBkYW1hZ2VzLCBpbmNsdWRpbmcgZGlyZWN0LCBpbmRpcmVjdCwgc3BlY2lhbCwKLWluY2lkZW50YWwgYW5kIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywgc3VjaCBhcyBsb3N0IHByb2ZpdHM7PC9wPgotCi08cCBjbGFzcz0ibGlzdCI+aWlpKSBzdGF0ZXMgdGhhdCBhbnkgcHJvdmlzaW9ucyB3aGljaCBkaWZmZXIgZnJvbSB0aGlzCi1BZ3JlZW1lbnQgYXJlIG9mZmVyZWQgYnkgdGhhdCBDb250cmlidXRvciBhbG9uZSBhbmQgbm90IGJ5IGFueSBvdGhlcgotcGFydHk7IGFuZDwvcD4KLQotPHAgY2xhc3M9Imxpc3QiPml2KSBzdGF0ZXMgdGhhdCBzb3VyY2UgY29kZSBmb3IgdGhlIFByb2dyYW0gaXMgYXZhaWxhYmxlCi1mcm9tIHN1Y2ggQ29udHJpYnV0b3IsIGFuZCBpbmZvcm1zIGxpY2Vuc2VlcyBob3cgdG8gb2J0YWluIGl0IGluIGEKLXJlYXNvbmFibGUgbWFubmVyIG9uIG9yIHRocm91Z2ggYSBtZWRpdW0gY3VzdG9tYXJpbHkgdXNlZCBmb3Igc29mdHdhcmUKLWV4Y2hhbmdlLjwvcD4KLQotPHA+V2hlbiB0aGUgUHJvZ3JhbSBpcyBtYWRlIGF2YWlsYWJsZSBpbiBzb3VyY2UgY29kZSBmb3JtOjwvcD4KLQotPHAgY2xhc3M9Imxpc3QiPmEpIGl0IG11c3QgYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhpcyBBZ3JlZW1lbnQ7IGFuZDwvcD4KLQotPHAgY2xhc3M9Imxpc3QiPmIpIGEgY29weSBvZiB0aGlzIEFncmVlbWVudCBtdXN0IGJlIGluY2x1ZGVkIHdpdGggZWFjaAotY29weSBvZiB0aGUgUHJvZ3JhbS48L3A+Ci0KLTxwPkNvbnRyaWJ1dG9ycyBtYXkgbm90IHJlbW92ZSBvciBhbHRlciBhbnkgY29weXJpZ2h0IG5vdGljZXMgY29udGFpbmVkCi13aXRoaW4gdGhlIFByb2dyYW0uPC9wPgotCi08cD5FYWNoIENvbnRyaWJ1dG9yIG11c3QgaWRlbnRpZnkgaXRzZWxmIGFzIHRoZSBvcmlnaW5hdG9yIG9mIGl0cwotQ29udHJpYnV0aW9uLCBpZiBhbnksIGluIGEgbWFubmVyIHRoYXQgcmVhc29uYWJseSBhbGxvd3Mgc3Vic2VxdWVudAotUmVjaXBpZW50cyB0byBpZGVudGlmeSB0aGUgb3JpZ2luYXRvciBvZiB0aGUgQ29udHJpYnV0aW9uLjwvcD4KLQotPHA+PGI+NC4gQ09NTUVSQ0lBTCBESVNUUklCVVRJT048L2I+PC9wPgotCi08cD5Db21tZXJjaWFsIGRpc3RyaWJ1dG9ycyBvZiBzb2Z0d2FyZSBtYXkgYWNjZXB0IGNlcnRhaW4KLXJlc3BvbnNpYmlsaXRpZXMgd2l0aCByZXNwZWN0IHRvIGVuZCB1c2VycywgYnVzaW5lc3MgcGFydG5lcnMgYW5kIHRoZQotbGlrZS4gV2hpbGUgdGhpcyBsaWNlbnNlIGlzIGludGVuZGVkIHRvIGZhY2lsaXRhdGUgdGhlIGNvbW1lcmNpYWwgdXNlIG9mCi10aGUgUHJvZ3JhbSwgdGhlIENvbnRyaWJ1dG9yIHdobyBpbmNsdWRlcyB0aGUgUHJvZ3JhbSBpbiBhIGNvbW1lcmNpYWwKLXByb2R1Y3Qgb2ZmZXJpbmcgc2hvdWxkIGRvIHNvIGluIGEgbWFubmVyIHdoaWNoIGRvZXMgbm90IGNyZWF0ZQotcG90ZW50aWFsIGxpYWJpbGl0eSBmb3Igb3RoZXIgQ29udHJpYnV0b3JzLiBUaGVyZWZvcmUsIGlmIGEgQ29udHJpYnV0b3IKLWluY2x1ZGVzIHRoZSBQcm9ncmFtIGluIGEgY29tbWVyY2lhbCBwcm9kdWN0IG9mZmVyaW5nLCBzdWNoIENvbnRyaWJ1dG9yCi0oIkNvbW1lcmNpYWwgQ29udHJpYnV0b3IiKSBoZXJlYnkgYWdyZWVzIHRvIGRlZmVuZCBhbmQKLWluZGVtbmlmeSBldmVyeSBvdGhlciBDb250cmlidXRvciAoIkluZGVtbmlmaWVkIENvbnRyaWJ1dG9yIikKLWFnYWluc3QgYW55IGxvc3NlcywgZGFtYWdlcyBhbmQgY29zdHMgKGNvbGxlY3RpdmVseSAiTG9zc2VzIikKLWFyaXNpbmcgZnJvbSBjbGFpbXMsIGxhd3N1aXRzIGFuZCBvdGhlciBsZWdhbCBhY3Rpb25zIGJyb3VnaHQgYnkgYSB0aGlyZAotcGFydHkgYWdhaW5zdCB0aGUgSW5kZW1uaWZpZWQgQ29udHJpYnV0b3IgdG8gdGhlIGV4dGVudCBjYXVzZWQgYnkgdGhlCi1hY3RzIG9yIG9taXNzaW9ucyBvZiBzdWNoIENvbW1lcmNpYWwgQ29udHJpYnV0b3IgaW4gY29ubmVjdGlvbiB3aXRoIGl0cwotZGlzdHJpYnV0aW9uIG9mIHRoZSBQcm9ncmFtIGluIGEgY29tbWVyY2lhbCBwcm9kdWN0IG9mZmVyaW5nLiBUaGUKLW9ibGlnYXRpb25zIGluIHRoaXMgc2VjdGlvbiBkbyBub3QgYXBwbHkgdG8gYW55IGNsYWltcyBvciBMb3NzZXMKLXJlbGF0aW5nIHRvIGFueSBhY3R1YWwgb3IgYWxsZWdlZCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgaW5mcmluZ2VtZW50LiBJbgotb3JkZXIgdG8gcXVhbGlmeSwgYW4gSW5kZW1uaWZpZWQgQ29udHJpYnV0b3IgbXVzdDogYSkgcHJvbXB0bHkgbm90aWZ5Ci10aGUgQ29tbWVyY2lhbCBDb250cmlidXRvciBpbiB3cml0aW5nIG9mIHN1Y2ggY2xhaW0sIGFuZCBiKSBhbGxvdyB0aGUKLUNvbW1lcmNpYWwgQ29udHJpYnV0b3IgdG8gY29udHJvbCwgYW5kIGNvb3BlcmF0ZSB3aXRoIHRoZSBDb21tZXJjaWFsCi1Db250cmlidXRvciBpbiwgdGhlIGRlZmVuc2UgYW5kIGFueSByZWxhdGVkIHNldHRsZW1lbnQgbmVnb3RpYXRpb25zLiBUaGUKLUluZGVtbmlmaWVkIENvbnRyaWJ1dG9yIG1heSBwYXJ0aWNpcGF0ZSBpbiBhbnkgc3VjaCBjbGFpbSBhdCBpdHMgb3duCi1leHBlbnNlLjwvcD4KLQotPHA+Rm9yIGV4YW1wbGUsIGEgQ29udHJpYnV0b3IgbWlnaHQgaW5jbHVkZSB0aGUgUHJvZ3JhbSBpbiBhIGNvbW1lcmNpYWwKLXByb2R1Y3Qgb2ZmZXJpbmcsIFByb2R1Y3QgWC4gVGhhdCBDb250cmlidXRvciBpcyB0aGVuIGEgQ29tbWVyY2lhbAotQ29udHJpYnV0b3IuIElmIHRoYXQgQ29tbWVyY2lhbCBDb250cmlidXRvciB0aGVuIG1ha2VzIHBlcmZvcm1hbmNlCi1jbGFpbXMsIG9yIG9mZmVycyB3YXJyYW50aWVzIHJlbGF0ZWQgdG8gUHJvZHVjdCBYLCB0aG9zZSBwZXJmb3JtYW5jZQotY2xhaW1zIGFuZCB3YXJyYW50aWVzIGFyZSBzdWNoIENvbW1lcmNpYWwgQ29udHJpYnV0b3IncyByZXNwb25zaWJpbGl0eQotYWxvbmUuIFVuZGVyIHRoaXMgc2VjdGlvbiwgdGhlIENvbW1lcmNpYWwgQ29udHJpYnV0b3Igd291bGQgaGF2ZSB0bwotZGVmZW5kIGNsYWltcyBhZ2FpbnN0IHRoZSBvdGhlciBDb250cmlidXRvcnMgcmVsYXRlZCB0byB0aG9zZQotcGVyZm9ybWFuY2UgY2xhaW1zIGFuZCB3YXJyYW50aWVzLCBhbmQgaWYgYSBjb3VydCByZXF1aXJlcyBhbnkgb3RoZXIKLUNvbnRyaWJ1dG9yIHRvIHBheSBhbnkgZGFtYWdlcyBhcyBhIHJlc3VsdCwgdGhlIENvbW1lcmNpYWwgQ29udHJpYnV0b3IKLW11c3QgcGF5IHRob3NlIGRhbWFnZXMuPC9wPgotCi08cD48Yj41LiBOTyBXQVJSQU5UWTwvYj48L3A+Ci0KLTxwPkVYQ0VQVCBBUyBFWFBSRVNTTFkgU0VUIEZPUlRIIElOIFRISVMgQUdSRUVNRU5ULCBUSEUgUFJPR1JBTSBJUwotUFJPVklERUQgT04gQU4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMKLU9GIEFOWSBLSU5ELCBFSVRIRVIgRVhQUkVTUyBPUiBJTVBMSUVEIElOQ0xVRElORywgV0lUSE9VVCBMSU1JVEFUSU9OLAotQU5ZIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBUSVRMRSwgTk9OLUlORlJJTkdFTUVOVCwgTUVSQ0hBTlRBQklMSVRZCi1PUiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gRWFjaCBSZWNpcGllbnQgaXMgc29sZWx5Ci1yZXNwb25zaWJsZSBmb3IgZGV0ZXJtaW5pbmcgdGhlIGFwcHJvcHJpYXRlbmVzcyBvZiB1c2luZyBhbmQKLWRpc3RyaWJ1dGluZyB0aGUgUHJvZ3JhbSBhbmQgYXNzdW1lcyBhbGwgcmlza3MgYXNzb2NpYXRlZCB3aXRoIGl0cwotZXhlcmNpc2Ugb2YgcmlnaHRzIHVuZGVyIHRoaXMgQWdyZWVtZW50ICwgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0bwotdGhlIHJpc2tzIGFuZCBjb3N0cyBvZiBwcm9ncmFtIGVycm9ycywgY29tcGxpYW5jZSB3aXRoIGFwcGxpY2FibGUgbGF3cywKLWRhbWFnZSB0byBvciBsb3NzIG9mIGRhdGEsIHByb2dyYW1zIG9yIGVxdWlwbWVudCwgYW5kIHVuYXZhaWxhYmlsaXR5IG9yCi1pbnRlcnJ1cHRpb24gb2Ygb3BlcmF0aW9ucy48L3A+Ci0KLTxwPjxiPjYuIERJU0NMQUlNRVIgT0YgTElBQklMSVRZPC9iPjwvcD4KLQotPHA+RVhDRVBUIEFTIEVYUFJFU1NMWSBTRVQgRk9SVEggSU4gVEhJUyBBR1JFRU1FTlQsIE5FSVRIRVIgUkVDSVBJRU5UCi1OT1IgQU5ZIENPTlRSSUJVVE9SUyBTSEFMTCBIQVZFIEFOWSBMSUFCSUxJVFkgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAotSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORwotV0lUSE9VVCBMSU1JVEFUSU9OIExPU1QgUFJPRklUUyksIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GCi1MSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORwotTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPUgotRElTVFJJQlVUSU9OIE9GIFRIRSBQUk9HUkFNIE9SIFRIRSBFWEVSQ0lTRSBPRiBBTlkgUklHSFRTIEdSQU5URUQKLUhFUkVVTkRFUiwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRVMuPC9wPgotCi08cD48Yj43LiBHRU5FUkFMPC9iPjwvcD4KLQotPHA+SWYgYW55IHByb3Zpc2lvbiBvZiB0aGlzIEFncmVlbWVudCBpcyBpbnZhbGlkIG9yIHVuZW5mb3JjZWFibGUgdW5kZXIKLWFwcGxpY2FibGUgbGF3LCBpdCBzaGFsbCBub3QgYWZmZWN0IHRoZSB2YWxpZGl0eSBvciBlbmZvcmNlYWJpbGl0eSBvZgotdGhlIHJlbWFpbmRlciBvZiB0aGUgdGVybXMgb2YgdGhpcyBBZ3JlZW1lbnQsIGFuZCB3aXRob3V0IGZ1cnRoZXIgYWN0aW9uCi1ieSB0aGUgcGFydGllcyBoZXJldG8sIHN1Y2ggcHJvdmlzaW9uIHNoYWxsIGJlIHJlZm9ybWVkIHRvIHRoZSBtaW5pbXVtCi1leHRlbnQgbmVjZXNzYXJ5IHRvIG1ha2Ugc3VjaCBwcm92aXNpb24gdmFsaWQgYW5kIGVuZm9yY2VhYmxlLjwvcD4KLQotPHA+SWYgUmVjaXBpZW50IGluc3RpdHV0ZXMgcGF0ZW50IGxpdGlnYXRpb24gYWdhaW5zdCBhbnkgZW50aXR5Ci0oaW5jbHVkaW5nIGEgY3Jvc3MtY2xhaW0gb3IgY291bnRlcmNsYWltIGluIGEgbGF3c3VpdCkgYWxsZWdpbmcgdGhhdCB0aGUKLVByb2dyYW0gaXRzZWxmIChleGNsdWRpbmcgY29tYmluYXRpb25zIG9mIHRoZSBQcm9ncmFtIHdpdGggb3RoZXIKLXNvZnR3YXJlIG9yIGhhcmR3YXJlKSBpbmZyaW5nZXMgc3VjaCBSZWNpcGllbnQncyBwYXRlbnQocyksIHRoZW4gc3VjaAotUmVjaXBpZW50J3MgcmlnaHRzIGdyYW50ZWQgdW5kZXIgU2VjdGlvbiAyKGIpIHNoYWxsIHRlcm1pbmF0ZSBhcyBvZiB0aGUKLWRhdGUgc3VjaCBsaXRpZ2F0aW9uIGlzIGZpbGVkLjwvcD4KLQotPHA+QWxsIFJlY2lwaWVudCdzIHJpZ2h0cyB1bmRlciB0aGlzIEFncmVlbWVudCBzaGFsbCB0ZXJtaW5hdGUgaWYgaXQKLWZhaWxzIHRvIGNvbXBseSB3aXRoIGFueSBvZiB0aGUgbWF0ZXJpYWwgdGVybXMgb3IgY29uZGl0aW9ucyBvZiB0aGlzCi1BZ3JlZW1lbnQgYW5kIGRvZXMgbm90IGN1cmUgc3VjaCBmYWlsdXJlIGluIGEgcmVhc29uYWJsZSBwZXJpb2Qgb2YgdGltZQotYWZ0ZXIgYmVjb21pbmcgYXdhcmUgb2Ygc3VjaCBub25jb21wbGlhbmNlLiBJZiBhbGwgUmVjaXBpZW50J3MgcmlnaHRzCi11bmRlciB0aGlzIEFncmVlbWVudCB0ZXJtaW5hdGUsIFJlY2lwaWVudCBhZ3JlZXMgdG8gY2Vhc2UgdXNlIGFuZAotZGlzdHJpYnV0aW9uIG9mIHRoZSBQcm9ncmFtIGFzIHNvb24gYXMgcmVhc29uYWJseSBwcmFjdGljYWJsZS4gSG93ZXZlciwKLVJlY2lwaWVudCdzIG9ibGlnYXRpb25zIHVuZGVyIHRoaXMgQWdyZWVtZW50IGFuZCBhbnkgbGljZW5zZXMgZ3JhbnRlZCBieQotUmVjaXBpZW50IHJlbGF0aW5nIHRvIHRoZSBQcm9ncmFtIHNoYWxsIGNvbnRpbnVlIGFuZCBzdXJ2aXZlLjwvcD4KLQotPHA+RXZlcnlvbmUgaXMgcGVybWl0dGVkIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUgY29waWVzIG9mIHRoaXMKLUFncmVlbWVudCwgYnV0IGluIG9yZGVyIHRvIGF2b2lkIGluY29uc2lzdGVuY3kgdGhlIEFncmVlbWVudCBpcwotY29weXJpZ2h0ZWQgYW5kIG1heSBvbmx5IGJlIG1vZGlmaWVkIGluIHRoZSBmb2xsb3dpbmcgbWFubmVyLiBUaGUKLUFncmVlbWVudCBTdGV3YXJkIHJlc2VydmVzIHRoZSByaWdodCB0byBwdWJsaXNoIG5ldyB2ZXJzaW9ucyAoaW5jbHVkaW5nCi1yZXZpc2lvbnMpIG9mIHRoaXMgQWdyZWVtZW50IGZyb20gdGltZSB0byB0aW1lLiBObyBvbmUgb3RoZXIgdGhhbiB0aGUKLUFncmVlbWVudCBTdGV3YXJkIGhhcyB0aGUgcmlnaHQgdG8gbW9kaWZ5IHRoaXMgQWdyZWVtZW50LiBUaGUgRWNsaXBzZQotRm91bmRhdGlvbiBpcyB0aGUgaW5pdGlhbCBBZ3JlZW1lbnQgU3Rld2FyZC4gVGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYXkKLWFzc2lnbiB0aGUgcmVzcG9uc2liaWxpdHkgdG8gc2VydmUgYXMgdGhlIEFncmVlbWVudCBTdGV3YXJkIHRvIGEKLXN1aXRhYmxlIHNlcGFyYXRlIGVudGl0eS4gRWFjaCBuZXcgdmVyc2lvbiBvZiB0aGUgQWdyZWVtZW50IHdpbGwgYmUKLWdpdmVuIGEgZGlzdGluZ3Vpc2hpbmcgdmVyc2lvbiBudW1iZXIuIFRoZSBQcm9ncmFtIChpbmNsdWRpbmcKLUNvbnRyaWJ1dGlvbnMpIG1heSBhbHdheXMgYmUgZGlzdHJpYnV0ZWQgc3ViamVjdCB0byB0aGUgdmVyc2lvbiBvZiB0aGUKLUFncmVlbWVudCB1bmRlciB3aGljaCBpdCB3YXMgcmVjZWl2ZWQuIEluIGFkZGl0aW9uLCBhZnRlciBhIG5ldyB2ZXJzaW9uCi1vZiB0aGUgQWdyZWVtZW50IGlzIHB1Ymxpc2hlZCwgQ29udHJpYnV0b3IgbWF5IGVsZWN0IHRvIGRpc3RyaWJ1dGUgdGhlCi1Qcm9ncmFtIChpbmNsdWRpbmcgaXRzIENvbnRyaWJ1dGlvbnMpIHVuZGVyIHRoZSBuZXcgdmVyc2lvbi4gRXhjZXB0IGFzCi1leHByZXNzbHkgc3RhdGVkIGluIFNlY3Rpb25zIDIoYSkgYW5kIDIoYikgYWJvdmUsIFJlY2lwaWVudCByZWNlaXZlcyBubwotcmlnaHRzIG9yIGxpY2Vuc2VzIHRvIHRoZSBpbnRlbGxlY3R1YWwgcHJvcGVydHkgb2YgYW55IENvbnRyaWJ1dG9yIHVuZGVyCi10aGlzIEFncmVlbWVudCwgd2hldGhlciBleHByZXNzbHksIGJ5IGltcGxpY2F0aW9uLCBlc3RvcHBlbCBvcgotb3RoZXJ3aXNlLiBBbGwgcmlnaHRzIGluIHRoZSBQcm9ncmFtIG5vdCBleHByZXNzbHkgZ3JhbnRlZCB1bmRlciB0aGlzCi1BZ3JlZW1lbnQgYXJlIHJlc2VydmVkLjwvcD4KLQotPHA+VGhpcyBBZ3JlZW1lbnQgaXMgZ292ZXJuZWQgYnkgdGhlIGxhd3Mgb2YgdGhlIFN0YXRlIG9mIE5ldyBZb3JrIGFuZAotdGhlIGludGVsbGVjdHVhbCBwcm9wZXJ0eSBsYXdzIG9mIHRoZSBVbml0ZWQgU3RhdGVzIG9mIEFtZXJpY2EuIE5vIHBhcnR5Ci10byB0aGlzIEFncmVlbWVudCB3aWxsIGJyaW5nIGEgbGVnYWwgYWN0aW9uIHVuZGVyIHRoaXMgQWdyZWVtZW50IG1vcmUKLXRoYW4gb25lIHllYXIgYWZ0ZXIgdGhlIGNhdXNlIG9mIGFjdGlvbiBhcm9zZS4gRWFjaCBwYXJ0eSB3YWl2ZXMgaXRzCi1yaWdodHMgdG8gYSBqdXJ5IHRyaWFsIGluIGFueSByZXN1bHRpbmcgbGl0aWdhdGlvbi48L3A+Ci0KLQotCi08L2JvZHk+PC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLm9zYnAueHRleHQuZGF0YWludGVyY2hhbmdlL2xpY2Vuc2UuaHRtbCBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQuZGF0YWludGVyY2hhbmdlL2xpY2Vuc2UuaHRtbAppbmRleCA2ZTU3OWE1Li4wMDhiODAxIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmRhdGFpbnRlcmNoYW5nZS9saWNlbnNlLmh0bWwKKysrIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5kYXRhaW50ZXJjaGFuZ2UvbGljZW5zZS5odG1sCkBAIC0xLDE2NCArMSwxODkgQEAKLTwhLS0/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IklTTy04ODU5LTEiID8tLT4KKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IklTTy04ODU5LTEiID8+CiA8IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBTdHJpY3QvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtc3RyaWN0LmR0ZCI+Ci08aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCI+PGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1JU08tODg1OS0xIj4KKzxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIj4KKzxoZWFkPgorPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9SVNPLTg4NTktMSIgLz4KIDx0aXRsZT5FY2xpcHNlIEZvdW5kYXRpb24gU29mdHdhcmUgVXNlciBBZ3JlZW1lbnQ8L3RpdGxlPgogPC9oZWFkPgogCiA8Ym9keSBsYW5nPSJFTi1VUyI+Ci08aDI+RWNsaXBzZSBGb3VuZGF0aW9uIFNvZnR3YXJlIFVzZXIgQWdyZWVtZW50PC9oMj4KLTxwPkZlYnJ1YXJ5IDEsIDIwMTE8L3A+CisJPGgyPkVjbGlwc2UgRm91bmRhdGlvbiBTb2Z0d2FyZSBVc2VyIEFncmVlbWVudDwvaDI+CisJPHA+Tm92ZW1iZXIgMjIsIDIwMTc8L3A+CiAKLTxoMz5Vc2FnZSBPZiBDb250ZW50PC9oMz4KKwk8aDM+VXNhZ2UgT2YgQ29udGVudDwvaDM+CiAKLTxwPlRIRSBFQ0xJUFNFIEZPVU5EQVRJT04gTUFLRVMgQVZBSUxBQkxFIFNPRlRXQVJFLCBET0NVTUVOVEFUSU9OLCBJTkZPUk1BVElPTiBBTkQvT1IgT1RIRVIgTUFURVJJQUxTIEZPUiBPUEVOIFNPVVJDRSBQUk9KRUNUUwotICAgKENPTExFQ1RJVkVMWSAiQ09OVEVOVCIpLiAgVVNFIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTIEFHUkVFTUVOVCBBTkQvT1IgVEhFIFRFUk1TIEFORAotICAgQ09ORElUSU9OUyBPRiBMSUNFTlNFIEFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gIEJZIFVTSU5HIFRIRSBDT05URU5ULCBZT1UgQUdSRUUgVEhBVCBZT1VSIFVTRQotICAgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhJUyBBR1JFRU1FTlQgQU5EL09SIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFMgT1IKLSAgIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuICBJRiBZT1UgRE8gTk9UIEFHUkVFIFRPIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTIEFHUkVFTUVOVCBBTkQgVEhFIFRFUk1TIEFORAotICAgQ09ORElUSU9OUyBPRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVywgVEhFTiBZT1UgTUFZIE5PVCBVU0UgVEhFIENPTlRFTlQuPC9wPgorCTxwPlRIRSBFQ0xJUFNFIEZPVU5EQVRJT04gTUFLRVMgQVZBSUxBQkxFIFNPRlRXQVJFLCBET0NVTUVOVEFUSU9OLAorCQlJTkZPUk1BVElPTiBBTkQvT1IgT1RIRVIgTUFURVJJQUxTIEZPUiBPUEVOIFNPVVJDRSBQUk9KRUNUUworCQkoQ09MTEVDVElWRUxZICZxdW90O0NPTlRFTlQmcXVvdDspLiBVU0UgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkKKwkJVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVMgQUdSRUVNRU5UIEFORC9PUiBUSEUgVEVSTVMgQU5ECisJCUNPTkRJVElPTlMgT0YgTElDRU5TRSBBR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQKKwkJQkVMT1cuIEJZIFVTSU5HIFRIRSBDT05URU5ULCBZT1UgQUdSRUUgVEhBVCBZT1VSIFVTRSBPRiBUSEUgQ09OVEVOVCBJUworCQlHT1ZFUk5FRCBCWSBUSElTIEFHUkVFTUVOVCBBTkQvT1IgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIEFOWQorCQlBUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VECisJCUJFTE9XLiBJRiBZT1UgRE8gTk9UIEFHUkVFIFRPIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTCisJCUFHUkVFTUVOVCBBTkQgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UKKwkJQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLCBUSEVOIFlPVSBNQVkgTk9UCisJCVVTRSBUSEUgQ09OVEVOVC48L3A+CiAKLTxoMz5BcHBsaWNhYmxlIExpY2Vuc2VzPC9oMz4KKwk8aDM+QXBwbGljYWJsZSBMaWNlbnNlczwvaDM+CiAKLTxwPlVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkLCBhbGwgQ29udGVudCBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZQotIEZvdW5kYXRpb24gaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgCi1FY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wCi0gICAoIkVQTCIpLiAgQSBjb3B5IG9mIHRoZSBFUEwgaXMgcHJvdmlkZWQgd2l0aCB0aGlzIENvbnRlbnQgYW5kIGlzIGFsc28KLSBhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sPC9hPi4KLSAgIEZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAiUHJvZ3JhbSIgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvcD4KKwk8cD4KKwkJVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQsIGFsbCBDb250ZW50IG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlCisJCUZvdW5kYXRpb24gaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUKKwkJRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIuMCAoJnF1b3Q7RVBMJnF1b3Q7KS4gQSBjb3B5IG9mIHRoZQorCQlFUEwgaXMgcHJvdmlkZWQgd2l0aCB0aGlzIENvbnRlbnQgYW5kIGlzIGFsc28gYXZhaWxhYmxlIGF0IDxhCisJCQlocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMDwvYT4uCisJCUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAmcXVvdDtQcm9ncmFtJnF1b3Q7IHdpbGwgbWVhbiB0aGUgQ29udGVudC4KKwk8L3A+CiAKLTxwPkNvbnRlbnQgaW5jbHVkZXMsIGJ1dCBpcyBub3QgbGltaXRlZCB0bywgc291cmNlIGNvZGUsIG9iamVjdCBjb2RlLCAKLWRvY3VtZW50YXRpb24gYW5kIG90aGVyIGZpbGVzIG1haW50YWluZWQgaW4gdGhlIEVjbGlwc2UgRm91bmRhdGlvbiAKLXNvdXJjZSBjb2RlCi0gICByZXBvc2l0b3J5ICgiUmVwb3NpdG9yeSIpIGluIHNvZnR3YXJlIG1vZHVsZXMgKCJNb2R1bGVzIikgYW5kIG1hZGUgCi1hdmFpbGFibGUgYXMgZG93bmxvYWRhYmxlIGFyY2hpdmVzICgiRG93bmxvYWRzIikuPC9wPgorCTxwPkNvbnRlbnQgaW5jbHVkZXMsIGJ1dCBpcyBub3QgbGltaXRlZCB0bywgc291cmNlIGNvZGUsIG9iamVjdAorCQljb2RlLCBkb2N1bWVudGF0aW9uIGFuZCBvdGhlciBmaWxlcyBtYWludGFpbmVkIGluIHRoZSBFY2xpcHNlCisJCUZvdW5kYXRpb24gc291cmNlIGNvZGUgcmVwb3NpdG9yeSAoJnF1b3Q7UmVwb3NpdG9yeSZxdW90OykgaW4gc29mdHdhcmUKKwkJbW9kdWxlcyAoJnF1b3Q7TW9kdWxlcyZxdW90OykgYW5kIG1hZGUgYXZhaWxhYmxlIGFzIGRvd25sb2FkYWJsZQorCQlhcmNoaXZlcyAoJnF1b3Q7RG93bmxvYWRzJnF1b3Q7KS48L3A+CiAKLTx1bD4KLSAgICAgICA8bGk+Q29udGVudCBtYXkgYmUgc3RydWN0dXJlZCBhbmQgcGFja2FnZWQgaW50byBtb2R1bGVzIHRvIAotZmFjaWxpdGF0ZSBkZWxpdmVyaW5nLCBleHRlbmRpbmcsIGFuZCB1cGdyYWRpbmcgdGhlIENvbnRlbnQuICBUeXBpY2FsIAotbW9kdWxlcyBtYXkgaW5jbHVkZSBwbHVnLWlucyAoIlBsdWctaW5zIiksIHBsdWctaW4gZnJhZ21lbnRzIAotKCJGcmFnbWVudHMiKSwgYW5kIGZlYXR1cmVzICgiRmVhdHVyZXMiKS48L2xpPgotICAgICAgIDxsaT5FYWNoIFBsdWctaW4gb3IgRnJhZ21lbnQgbWF5IGJlIHBhY2thZ2VkIGFzIGEgc3ViLWRpcmVjdG9yeSBvciBKQVIgKEphdmEmIzg0ODI7IEFSY2hpdmUpIGluIGEgZGlyZWN0b3J5IG5hbWVkICJwbHVnaW5zIi48L2xpPgotICAgICAgIDxsaT5BIEZlYXR1cmUgaXMgYSBidW5kbGUgb2Ygb25lIG9yIG1vcmUgUGx1Zy1pbnMgYW5kL29yIAotRnJhZ21lbnRzIGFuZCBhc3NvY2lhdGVkIG1hdGVyaWFsLiAgRWFjaCBGZWF0dXJlIG1heSBiZSBwYWNrYWdlZCBhcyBhIAotc3ViLWRpcmVjdG9yeSBpbiBhIGRpcmVjdG9yeSBuYW1lZCAiZmVhdHVyZXMiLiAgV2l0aGluIGEgRmVhdHVyZSwgZmlsZXMgCi1uYW1lZCAiZmVhdHVyZS54bWwiIG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyAKLW9mIHRoZSBQbHVnLWlucwotICAgICAgYW5kL29yIEZyYWdtZW50cyBhc3NvY2lhdGVkIHdpdGggdGhhdCBGZWF0dXJlLjwvbGk+Ci0gICAgICAgPGxpPkZlYXR1cmVzIG1heSBhbHNvIGluY2x1ZGUgb3RoZXIgRmVhdHVyZXMgKCJJbmNsdWRlZCAKLUZlYXR1cmVzIikuIFdpdGhpbiBhIEZlYXR1cmUsIGZpbGVzIG5hbWVkICJmZWF0dXJlLnhtbCIgbWF5IGNvbnRhaW4gYSAKLWxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2YgSW5jbHVkZWQgRmVhdHVyZXMuPC9saT4KLTwvdWw+CisJPHVsPgorCQk8bGk+Q29udGVudCBtYXkgYmUgc3RydWN0dXJlZCBhbmQgcGFja2FnZWQgaW50byBtb2R1bGVzIHRvCisJCQlmYWNpbGl0YXRlIGRlbGl2ZXJpbmcsIGV4dGVuZGluZywgYW5kIHVwZ3JhZGluZyB0aGUgQ29udGVudC4gVHlwaWNhbAorCQkJbW9kdWxlcyBtYXkgaW5jbHVkZSBwbHVnLWlucyAoJnF1b3Q7UGx1Zy1pbnMmcXVvdDspLCBwbHVnLWluCisJCQlmcmFnbWVudHMgKCZxdW90O0ZyYWdtZW50cyZxdW90OyksIGFuZCBmZWF0dXJlcworCQkJKCZxdW90O0ZlYXR1cmVzJnF1b3Q7KS48L2xpPgorCQk8bGk+RWFjaCBQbHVnLWluIG9yIEZyYWdtZW50IG1heSBiZSBwYWNrYWdlZCBhcyBhIHN1Yi1kaXJlY3RvcnkKKwkJCW9yIEpBUiAoSmF2YSZ0cmFkZTsgQVJjaGl2ZSkgaW4gYSBkaXJlY3RvcnkgbmFtZWQKKwkJCSZxdW90O3BsdWdpbnMmcXVvdDsuPC9saT4KKwkJPGxpPkEgRmVhdHVyZSBpcyBhIGJ1bmRsZSBvZiBvbmUgb3IgbW9yZSBQbHVnLWlucyBhbmQvb3IKKwkJCUZyYWdtZW50cyBhbmQgYXNzb2NpYXRlZCBtYXRlcmlhbC4gRWFjaCBGZWF0dXJlIG1heSBiZSBwYWNrYWdlZCBhcyBhCisJCQlzdWItZGlyZWN0b3J5IGluIGEgZGlyZWN0b3J5IG5hbWVkICZxdW90O2ZlYXR1cmVzJnF1b3Q7LiBXaXRoaW4gYQorCQkJRmVhdHVyZSwgZmlsZXMgbmFtZWQgJnF1b3Q7ZmVhdHVyZS54bWwmcXVvdDsgbWF5IGNvbnRhaW4gYSBsaXN0IG9mCisJCQl0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZiB0aGUgUGx1Zy1pbnMgYW5kL29yIEZyYWdtZW50cworCQkJYXNzb2NpYXRlZCB3aXRoIHRoYXQgRmVhdHVyZS48L2xpPgorCQk8bGk+RmVhdHVyZXMgbWF5IGFsc28gaW5jbHVkZSBvdGhlciBGZWF0dXJlcyAoJnF1b3Q7SW5jbHVkZWQKKwkJCUZlYXR1cmVzJnF1b3Q7KS4gV2l0aGluIGEgRmVhdHVyZSwgZmlsZXMgbmFtZWQKKwkJCSZxdW90O2ZlYXR1cmUueG1sJnF1b3Q7IG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24KKwkJCW51bWJlcnMgb2YgSW5jbHVkZWQgRmVhdHVyZXMuPC9saT4KKwk8L3VsPgogCi08cD5UaGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgc2hvdWxkIGJlIAotY29udGFpbmVkIGluIGZpbGVzIG5hbWVkICJhYm91dC5odG1sIiAoIkFib3V0cyIpLiBUaGUgdGVybXMgYW5kIAotY29uZGl0aW9ucyBnb3Zlcm5pbmcgRmVhdHVyZXMgYW5kCi1JbmNsdWRlZCBGZWF0dXJlcyBzaG91bGQgYmUgY29udGFpbmVkIGluIGZpbGVzIG5hbWVkICJsaWNlbnNlLmh0bWwiIAotKCJGZWF0dXJlIExpY2Vuc2VzIikuICBBYm91dHMgYW5kIEZlYXR1cmUgTGljZW5zZXMgbWF5IGJlIGxvY2F0ZWQgaW4gYW55Ci0gZGlyZWN0b3J5IG9mIGEgRG93bmxvYWQgb3IgTW9kdWxlCi1pbmNsdWRpbmcsIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgZm9sbG93aW5nIGxvY2F0aW9uczo8L3A+CisJPHA+VGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHNob3VsZAorCQliZSBjb250YWluZWQgaW4gZmlsZXMgbmFtZWQgJnF1b3Q7YWJvdXQuaHRtbCZxdW90OworCQkoJnF1b3Q7QWJvdXRzJnF1b3Q7KS4gVGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyBGZWF0dXJlcyBhbmQKKwkJSW5jbHVkZWQgRmVhdHVyZXMgc2hvdWxkIGJlIGNvbnRhaW5lZCBpbiBmaWxlcyBuYW1lZAorCQkmcXVvdDtsaWNlbnNlLmh0bWwmcXVvdDsgKCZxdW90O0ZlYXR1cmUgTGljZW5zZXMmcXVvdDspLiBBYm91dHMgYW5kCisJCUZlYXR1cmUgTGljZW5zZXMgbWF5IGJlIGxvY2F0ZWQgaW4gYW55IGRpcmVjdG9yeSBvZiBhIERvd25sb2FkIG9yCisJCU1vZHVsZSBpbmNsdWRpbmcsIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgZm9sbG93aW5nIGxvY2F0aW9uczo8L3A+CiAKLTx1bD4KLSAgICAgICA8bGk+VGhlIHRvcC1sZXZlbCAocm9vdCkgZGlyZWN0b3J5PC9saT4KLSAgICAgICA8bGk+UGx1Zy1pbiBhbmQgRnJhZ21lbnQgZGlyZWN0b3JpZXM8L2xpPgotICAgICAgIDxsaT5JbnNpZGUgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBwYWNrYWdlZCBhcyBKQVJzPC9saT4KLSAgICAgICA8bGk+U3ViLWRpcmVjdG9yaWVzIG9mIHRoZSBkaXJlY3RvcnkgbmFtZWQgInNyYyIgb2YgY2VydGFpbiBQbHVnLWluczwvbGk+Ci0gICAgICAgPGxpPkZlYXR1cmUgZGlyZWN0b3JpZXM8L2xpPgotPC91bD4KKwk8dWw+CisJCTxsaT5UaGUgdG9wLWxldmVsIChyb290KSBkaXJlY3Rvcnk8L2xpPgorCQk8bGk+UGx1Zy1pbiBhbmQgRnJhZ21lbnQgZGlyZWN0b3JpZXM8L2xpPgorCQk8bGk+SW5zaWRlIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgcGFja2FnZWQgYXMgSkFSczwvbGk+CisJCTxsaT5TdWItZGlyZWN0b3JpZXMgb2YgdGhlIGRpcmVjdG9yeSBuYW1lZCAmcXVvdDtzcmMmcXVvdDsgb2YKKwkJCWNlcnRhaW4gUGx1Zy1pbnM8L2xpPgorCQk8bGk+RmVhdHVyZSBkaXJlY3RvcmllczwvbGk+CisJPC91bD4KIAotPHA+Tm90ZTogaWYgYSBGZWF0dXJlIG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gaXMgCi1pbnN0YWxsZWQgdXNpbmcgdGhlIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5IChhcyBkZWZpbmVkIGJlbG93KSwgeW91IG11c3QKLSBhZ3JlZSB0byBhIGxpY2Vuc2UgKCJGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIikgZHVyaW5nIHRoZQotaW5zdGFsbGF0aW9uIHByb2Nlc3MuICBJZiB0aGUgRmVhdHVyZSBjb250YWlucyBJbmNsdWRlZCBGZWF0dXJlcywgdGhlIAotRmVhdHVyZSBVcGRhdGUgTGljZW5zZSBzaG91bGQgZWl0aGVyIHByb3ZpZGUgeW91IHdpdGggdGhlIHRlcm1zIGFuZCAKLWNvbmRpdGlvbnMgZ292ZXJuaW5nIHRoZSBJbmNsdWRlZCBGZWF0dXJlcyBvcgotaW5mb3JtIHlvdSB3aGVyZSB5b3UgY2FuIGxvY2F0ZSB0aGVtLiAgRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgbWF5IGJlIAotZm91bmQgaW4gdGhlICJsaWNlbnNlIiBwcm9wZXJ0eSBvZiBmaWxlcyBuYW1lZCAiZmVhdHVyZS5wcm9wZXJ0aWVzIiAKLWZvdW5kIHdpdGhpbiBhIEZlYXR1cmUuCi1TdWNoIEFib3V0cywgRmVhdHVyZSBMaWNlbnNlcywgYW5kIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIGNvbnRhaW4gdGhlIAotdGVybXMgYW5kIGNvbmRpdGlvbnMgKG9yIHJlZmVyZW5jZXMgdG8gc3VjaCB0ZXJtcyBhbmQgY29uZGl0aW9ucykgdGhhdCAKLWdvdmVybiB5b3VyIHVzZSBvZiB0aGUgYXNzb2NpYXRlZCBDb250ZW50IGluCi10aGF0IGRpcmVjdG9yeS48L3A+CisJPHA+Tm90ZTogaWYgYSBGZWF0dXJlIG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gaXMKKwkJaW5zdGFsbGVkIHVzaW5nIHRoZSBQcm92aXNpb25pbmcgVGVjaG5vbG9neSAoYXMgZGVmaW5lZCBiZWxvdyksIHlvdQorCQltdXN0IGFncmVlIHRvIGEgbGljZW5zZSAoJnF1b3Q7RmVhdHVyZSBVcGRhdGUgTGljZW5zZSZxdW90OykgZHVyaW5nCisJCXRoZSBpbnN0YWxsYXRpb24gcHJvY2Vzcy4gSWYgdGhlIEZlYXR1cmUgY29udGFpbnMgSW5jbHVkZWQgRmVhdHVyZXMsCisJCXRoZSBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIHNob3VsZCBlaXRoZXIgcHJvdmlkZSB5b3Ugd2l0aCB0aGUgdGVybXMKKwkJYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIHRoZSBJbmNsdWRlZCBGZWF0dXJlcyBvciBpbmZvcm0geW91IHdoZXJlIHlvdQorCQljYW4gbG9jYXRlIHRoZW0uIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIG1heSBiZSBmb3VuZCBpbiB0aGUKKwkJJnF1b3Q7bGljZW5zZSZxdW90OyBwcm9wZXJ0eSBvZiBmaWxlcyBuYW1lZAorCQkmcXVvdDtmZWF0dXJlLnByb3BlcnRpZXMmcXVvdDsgZm91bmQgd2l0aGluIGEgRmVhdHVyZS4gU3VjaCBBYm91dHMsCisJCUZlYXR1cmUgTGljZW5zZXMsIGFuZCBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBjb250YWluIHRoZSB0ZXJtcyBhbmQKKwkJY29uZGl0aW9ucyAob3IgcmVmZXJlbmNlcyB0byBzdWNoIHRlcm1zIGFuZCBjb25kaXRpb25zKSB0aGF0IGdvdmVybgorCQl5b3VyIHVzZSBvZiB0aGUgYXNzb2NpYXRlZCBDb250ZW50IGluIHRoYXQgZGlyZWN0b3J5LjwvcD4KIAotPHA+VEhFIEFCT1VUUywgRkVBVFVSRSBMSUNFTlNFUywgQU5EIEZFQVRVUkUgVVBEQVRFIExJQ0VOU0VTIE1BWSBSRUZFUiAKLVRPIFRIRSBFUEwgT1IgT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTLCBOT1RJQ0VTIE9SIFRFUk1TIEFORCBDT05ESVRJT05TLgotICBTT01FIE9GIFRIRVNFCi1PVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMgTUFZIElOQ0xVREUgKEJVVCBBUkUgTk9UIExJTUlURUQgVE8pOjwvcD4KKwk8cD5USEUgQUJPVVRTLCBGRUFUVVJFIExJQ0VOU0VTLCBBTkQgRkVBVFVSRSBVUERBVEUgTElDRU5TRVMgTUFZCisJCVJFRkVSIFRPIFRIRSBFUEwgT1IgT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTLCBOT1RJQ0VTIE9SIFRFUk1TIEFORAorCQlDT05ESVRJT05TLiBTT01FIE9GIFRIRVNFIE9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUyBNQVkgSU5DTFVERSAoQlVUCisJCUFSRSBOT1QgTElNSVRFRCBUTyk6PC9wPgogCi08dWw+Ci0gICAgICAgPGxpPkVjbGlwc2UgRGlzdHJpYnV0aW9uIExpY2Vuc2UgVmVyc2lvbiAxLjAgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xpY2Vuc2VzL2VkbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9saWNlbnNlcy9lZGwtdjEuMC5odG1sPC9hPik8L2xpPgotICAgICAgIDxsaT5Db21tb24gUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWw8L2E+KTwvbGk+Ci0gICAgICAgPGxpPkFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDEuMSAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFIj5odHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRTwvYT4pPC9saT4KLSAgICAgICA8bGk+QXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMi4wIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wIj5odHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjA8L2E+KTwvbGk+Ci0gICAgICAgPGxpPk1ldHJvIExpbmsgUHVibGljIExpY2Vuc2UgMS4wMCAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbmdyb3VwLm9yZy9vcGVubW90aWYvc3VwcG9ydGVycy9tZXRyb2xpbmsvbGljZW5zZS5odG1sIj5odHRwOi8vd3d3Lm9wZW5ncm91cC5vcmcvb3Blbm1vdGlmL3N1cHBvcnRlcnMvbWV0cm9saW5rL2xpY2Vuc2UuaHRtbDwvYT4pPC9saT4KLSAgICAgICA8bGk+TW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMSAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBML01QTC0xLjEuaHRtbCI+aHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvTVBMLTEuMS5odG1sPC9hPik8L2xpPgotPC91bD4KKwk8dWw+CisJCTxsaT5FY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wIChhdmFpbGFibGUgYXQgPGEKKwkJCWhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbDwvYT4pCisJCTwvbGk+CisJCTxsaT5FY2xpcHNlIERpc3RyaWJ1dGlvbiBMaWNlbnNlIFZlcnNpb24gMS4wIChhdmFpbGFibGUgYXQgPGEKKwkJCWhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGljZW5zZXMvZWRsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xpY2Vuc2VzL2VkbC12MS4wLmh0bWw8L2E+KQorCQk8L2xpPgorCQk8bGk+Q29tbW9uIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wIChhdmFpbGFibGUgYXQgPGEKKwkJCWhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbDwvYT4pCisJCTwvbGk+CisJCTxsaT5BcGFjaGUgU29mdHdhcmUgTGljZW5zZSAxLjEgKGF2YWlsYWJsZSBhdCA8YQorCQkJaHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UiPmh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFPC9hPikKKwkJPC9saT4KKwkJPGxpPkFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDIuMCAoYXZhaWxhYmxlIGF0IDxhCisJCQlocmVmPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAiPmh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMDwvYT4pCisJCTwvbGk+CisJCTxsaT5Nb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4xIChhdmFpbGFibGUgYXQgPGEKKwkJCWhyZWY9Imh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBML01QTC0xLjEuaHRtbCI+aHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvTVBMLTEuMS5odG1sPC9hPikKKwkJPC9saT4KKwk8L3VsPgogCi08cD5JVCBJUyBZT1VSIE9CTElHQVRJT04gVE8gUkVBRCBBTkQgQUNDRVBUIEFMTCBTVUNIIFRFUk1TIEFORCAKLUNPTkRJVElPTlMgUFJJT1IgVE8gVVNFIE9GIFRIRSBDT05URU5ULiAgSWYgbm8gQWJvdXQsIEZlYXR1cmUgTGljZW5zZSwgCi1vciBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIGlzIHByb3ZpZGVkLCBwbGVhc2UKLWNvbnRhY3QgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiB0byBkZXRlcm1pbmUgd2hhdCB0ZXJtcyBhbmQgY29uZGl0aW9ucyAKLWdvdmVybiB0aGF0IHBhcnRpY3VsYXIgQ29udGVudC48L3A+CisJPHA+SVQgSVMgWU9VUiBPQkxJR0FUSU9OIFRPIFJFQUQgQU5EIEFDQ0VQVCBBTEwgU1VDSCBURVJNUyBBTkQKKwkJQ09ORElUSU9OUyBQUklPUiBUTyBVU0UgT0YgVEhFIENPTlRFTlQuIElmIG5vIEFib3V0LCBGZWF0dXJlIExpY2Vuc2UsCisJCW9yIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2UgaXMgcHJvdmlkZWQsIHBsZWFzZSBjb250YWN0IHRoZSBFY2xpcHNlCisJCUZvdW5kYXRpb24gdG8gZGV0ZXJtaW5lIHdoYXQgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuIHRoYXQKKwkJcGFydGljdWxhciBDb250ZW50LjwvcD4KIAogCi08aDM+VXNlIG9mIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5PC9oMz4KKwk8aDM+VXNlIG9mIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5PC9oMz4KIAotPHA+VGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYWtlcyBhdmFpbGFibGUgcHJvdmlzaW9uaW5nIHNvZnR3YXJlLCAKLWV4YW1wbGVzIG9mIHdoaWNoIGluY2x1ZGUsIGJ1dCBhcmUgbm90IGxpbWl0ZWQgdG8sIHAyIGFuZCB0aGUgRWNsaXBzZQotICAgVXBkYXRlIE1hbmFnZXIgKCJQcm92aXNpb25pbmcgVGVjaG5vbG9neSIpIGZvciB0aGUgcHVycG9zZSBvZiAKLWFsbG93aW5nIHVzZXJzIHRvIGluc3RhbGwgc29mdHdhcmUsIGRvY3VtZW50YXRpb24sIGluZm9ybWF0aW9uIGFuZC9vcgotICAgb3RoZXIgbWF0ZXJpYWxzIChjb2xsZWN0aXZlbHkgIkluc3RhbGxhYmxlIFNvZnR3YXJlIikuIFRoaXMgCi1jYXBhYmlsaXR5IGlzIHByb3ZpZGVkIHdpdGggdGhlIGludGVudCBvZiBhbGxvd2luZyBzdWNoIHVzZXJzIHRvCi0gICBpbnN0YWxsLCBleHRlbmQgYW5kIHVwZGF0ZSBFY2xpcHNlLWJhc2VkIHByb2R1Y3RzLiBJbmZvcm1hdGlvbiBhYm91dCAKLXBhY2thZ2luZyBJbnN0YWxsYWJsZSBTb2Z0d2FyZSBpcyBhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL2VjbGlwc2Uub3JnL2VxdWlub3gvcDIvcmVwb3NpdG9yeV9wYWNrYWdpbmcuaHRtbCI+aHR0cDovL2VjbGlwc2Uub3JnL2VxdWlub3gvcDIvcmVwb3NpdG9yeV9wYWNrYWdpbmcuaHRtbDwvYT4KLSAgICgiU3BlY2lmaWNhdGlvbiIpLjwvcD4KKwk8cD4KKwkJVGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYWtlcyBhdmFpbGFibGUgcHJvdmlzaW9uaW5nIHNvZnR3YXJlLCBleGFtcGxlcworCQlvZiB3aGljaCBpbmNsdWRlLCBidXQgYXJlIG5vdCBsaW1pdGVkIHRvLCBwMiBhbmQgdGhlIEVjbGlwc2UgVXBkYXRlCisJCU1hbmFnZXIgKCZxdW90O1Byb3Zpc2lvbmluZyBUZWNobm9sb2d5JnF1b3Q7KSBmb3IgdGhlIHB1cnBvc2Ugb2YKKwkJYWxsb3dpbmcgdXNlcnMgdG8gaW5zdGFsbCBzb2Z0d2FyZSwgZG9jdW1lbnRhdGlvbiwgaW5mb3JtYXRpb24gYW5kL29yCisJCW90aGVyIG1hdGVyaWFscyAoY29sbGVjdGl2ZWx5ICZxdW90O0luc3RhbGxhYmxlIFNvZnR3YXJlJnF1b3Q7KS4gVGhpcworCQljYXBhYmlsaXR5IGlzIHByb3ZpZGVkIHdpdGggdGhlIGludGVudCBvZiBhbGxvd2luZyBzdWNoIHVzZXJzIHRvCisJCWluc3RhbGwsIGV4dGVuZCBhbmQgdXBkYXRlIEVjbGlwc2UtYmFzZWQgcHJvZHVjdHMuIEluZm9ybWF0aW9uIGFib3V0CisJCXBhY2thZ2luZyBJbnN0YWxsYWJsZSBTb2Z0d2FyZSBpcyBhdmFpbGFibGUgYXQgPGEKKwkJCWhyZWY9Imh0dHA6Ly9lY2xpcHNlLm9yZy9lcXVpbm94L3AyL3JlcG9zaXRvcnlfcGFja2FnaW5nLmh0bWwiPmh0dHA6Ly9lY2xpcHNlLm9yZy9lcXVpbm94L3AyL3JlcG9zaXRvcnlfcGFja2FnaW5nLmh0bWw8L2E+CisJCSgmcXVvdDtTcGVjaWZpY2F0aW9uJnF1b3Q7KS4KKwk8L3A+CiAKLTxwPllvdSBtYXkgdXNlIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5IHRvIGFsbG93IG90aGVyIHBhcnRpZXMgdG8gaW5zdGFsbAotIEluc3RhbGxhYmxlIFNvZnR3YXJlLiBZb3Ugc2hhbGwgYmUgcmVzcG9uc2libGUgZm9yIGVuYWJsaW5nIHRoZQotICAgYXBwbGljYWJsZSBsaWNlbnNlIGFncmVlbWVudHMgcmVsYXRpbmcgdG8gdGhlIEluc3RhbGxhYmxlIFNvZnR3YXJlIHRvCi0gYmUgcHJlc2VudGVkIHRvLCBhbmQgYWNjZXB0ZWQgYnksIHRoZSB1c2VycyBvZiB0aGUgUHJvdmlzaW9uaW5nIAotVGVjaG5vbG9neQotICAgaW4gYWNjb3JkYW5jZSB3aXRoIHRoZSBTcGVjaWZpY2F0aW9uLiBCeSB1c2luZyBQcm92aXNpb25pbmcgCi1UZWNobm9sb2d5IGluIHN1Y2ggYSBtYW5uZXIgYW5kIG1ha2luZyBpdCBhdmFpbGFibGUgaW4gYWNjb3JkYW5jZSB3aXRoIAotdGhlCi0gICBTcGVjaWZpY2F0aW9uLCB5b3UgZnVydGhlciBhY2tub3dsZWRnZSB5b3VyIGFncmVlbWVudCB0bywgYW5kIHRoZSAKLWFjcXVpc2l0aW9uIG9mIGFsbCBuZWNlc3NhcnkgcmlnaHRzIHRvIHBlcm1pdCB0aGUgZm9sbG93aW5nOjwvcD4KKwk8cD5Zb3UgbWF5IHVzZSBQcm92aXNpb25pbmcgVGVjaG5vbG9neSB0byBhbGxvdyBvdGhlciBwYXJ0aWVzIHRvCisJCWluc3RhbGwgSW5zdGFsbGFibGUgU29mdHdhcmUuIFlvdSBzaGFsbCBiZSByZXNwb25zaWJsZSBmb3IgZW5hYmxpbmcKKwkJdGhlIGFwcGxpY2FibGUgbGljZW5zZSBhZ3JlZW1lbnRzIHJlbGF0aW5nIHRvIHRoZSBJbnN0YWxsYWJsZSBTb2Z0d2FyZQorCQl0byBiZSBwcmVzZW50ZWQgdG8sIGFuZCBhY2NlcHRlZCBieSwgdGhlIHVzZXJzIG9mIHRoZSBQcm92aXNpb25pbmcKKwkJVGVjaG5vbG9neSBpbiBhY2NvcmRhbmNlIHdpdGggdGhlIFNwZWNpZmljYXRpb24uIEJ5IHVzaW5nIFByb3Zpc2lvbmluZworCQlUZWNobm9sb2d5IGluIHN1Y2ggYSBtYW5uZXIgYW5kIG1ha2luZyBpdCBhdmFpbGFibGUgaW4gYWNjb3JkYW5jZSB3aXRoCisJCXRoZSBTcGVjaWZpY2F0aW9uLCB5b3UgZnVydGhlciBhY2tub3dsZWRnZSB5b3VyIGFncmVlbWVudCB0bywgYW5kIHRoZQorCQlhY3F1aXNpdGlvbiBvZiBhbGwgbmVjZXNzYXJ5IHJpZ2h0cyB0byBwZXJtaXQgdGhlIGZvbGxvd2luZzo8L3A+CiAKLTxvbD4KLSAgICAgICA8bGk+QSBzZXJpZXMgb2YgYWN0aW9ucyBtYXkgb2NjdXIgKCJQcm92aXNpb25pbmcgUHJvY2VzcyIpIGluIAotd2hpY2ggYSB1c2VyIG1heSBleGVjdXRlIHRoZSBQcm92aXNpb25pbmcgVGVjaG5vbG9neQotICAgICAgIG9uIGEgbWFjaGluZSAoIlRhcmdldCBNYWNoaW5lIikgd2l0aCB0aGUgaW50ZW50IG9mIGluc3RhbGxpbmcsIAotZXh0ZW5kaW5nIG9yIHVwZGF0aW5nIHRoZSBmdW5jdGlvbmFsaXR5IG9mIGFuIEVjbGlwc2UtYmFzZWQKLSAgICAgICBwcm9kdWN0LjwvbGk+Ci0gICAgICAgPGxpPkR1cmluZyB0aGUgUHJvdmlzaW9uaW5nIFByb2Nlc3MsIHRoZSBQcm92aXNpb25pbmcgVGVjaG5vbG9neSAKLW1heSBjYXVzZSB0aGlyZCBwYXJ0eSBJbnN0YWxsYWJsZSBTb2Z0d2FyZSBvciBhIHBvcnRpb24gdGhlcmVvZiB0byBiZQotICAgICAgIGFjY2Vzc2VkIGFuZCBjb3BpZWQgdG8gdGhlIFRhcmdldCBNYWNoaW5lLjwvbGk+Ci0gICAgICAgPGxpPlB1cnN1YW50IHRvIHRoZSBTcGVjaWZpY2F0aW9uLCB5b3Ugd2lsbCBwcm92aWRlIHRvIHRoZSB1c2VyIAotdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIHRoYXQgZ292ZXJuIHRoZSB1c2Ugb2YgdGhlIEluc3RhbGxhYmxlCi0gICAgICAgU29mdHdhcmUgKCJJbnN0YWxsYWJsZSBTb2Z0d2FyZSBBZ3JlZW1lbnQiKSBhbmQgc3VjaCBJbnN0YWxsYWJsZSAKLVNvZnR3YXJlIEFncmVlbWVudCBzaGFsbCBiZSBhY2Nlc3NlZCBmcm9tIHRoZSBUYXJnZXQKLSAgICAgICBNYWNoaW5lIGluIGFjY29yZGFuY2Ugd2l0aCB0aGUgU3BlY2lmaWNhdGlvbi4gU3VjaCBJbnN0YWxsYWJsZSAKLVNvZnR3YXJlIEFncmVlbWVudCBtdXN0IGluZm9ybSB0aGUgdXNlciBvZiB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgdGhhdAotIGdvdmVybgotICAgICAgIHRoZSBJbnN0YWxsYWJsZSBTb2Z0d2FyZSBhbmQgbXVzdCBzb2xpY2l0IGFjY2VwdGFuY2UgYnkgdGhlIGVuZCAKLXVzZXIgaW4gdGhlIG1hbm5lciBwcmVzY3JpYmVkIGluIHN1Y2ggSW5zdGFsbGFibGUgU29mdHdhcmUgQWdyZWVtZW50LiAKLVVwb24gc3VjaAotICAgICAgIGluZGljYXRpb24gb2YgYWdyZWVtZW50IGJ5IHRoZSB1c2VyLCB0aGUgcHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kgCi13aWxsIGNvbXBsZXRlIGluc3RhbGxhdGlvbiBvZiB0aGUgSW5zdGFsbGFibGUgU29mdHdhcmUuPC9saT4KLTwvb2w+CisJPG9sPgorCQk8bGk+QSBzZXJpZXMgb2YgYWN0aW9ucyBtYXkgb2NjdXIgKCZxdW90O1Byb3Zpc2lvbmluZworCQkJUHJvY2VzcyZxdW90OykgaW4gd2hpY2ggYSB1c2VyIG1heSBleGVjdXRlIHRoZSBQcm92aXNpb25pbmcKKwkJCVRlY2hub2xvZ3kgb24gYSBtYWNoaW5lICgmcXVvdDtUYXJnZXQgTWFjaGluZSZxdW90Oykgd2l0aCB0aGUgaW50ZW50CisJCQlvZiBpbnN0YWxsaW5nLCBleHRlbmRpbmcgb3IgdXBkYXRpbmcgdGhlIGZ1bmN0aW9uYWxpdHkgb2YgYW4KKwkJCUVjbGlwc2UtYmFzZWQgcHJvZHVjdC48L2xpPgorCQk8bGk+RHVyaW5nIHRoZSBQcm92aXNpb25pbmcgUHJvY2VzcywgdGhlIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5CisJCQltYXkgY2F1c2UgdGhpcmQgcGFydHkgSW5zdGFsbGFibGUgU29mdHdhcmUgb3IgYSBwb3J0aW9uIHRoZXJlb2YgdG8gYmUKKwkJCWFjY2Vzc2VkIGFuZCBjb3BpZWQgdG8gdGhlIFRhcmdldCBNYWNoaW5lLjwvbGk+CisJCTxsaT5QdXJzdWFudCB0byB0aGUgU3BlY2lmaWNhdGlvbiwgeW91IHdpbGwgcHJvdmlkZSB0byB0aGUgdXNlcgorCQkJdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIHRoYXQgZ292ZXJuIHRoZSB1c2Ugb2YgdGhlIEluc3RhbGxhYmxlCisJCQlTb2Z0d2FyZSAoJnF1b3Q7SW5zdGFsbGFibGUgU29mdHdhcmUgQWdyZWVtZW50JnF1b3Q7KSBhbmQgc3VjaAorCQkJSW5zdGFsbGFibGUgU29mdHdhcmUgQWdyZWVtZW50IHNoYWxsIGJlIGFjY2Vzc2VkIGZyb20gdGhlIFRhcmdldAorCQkJTWFjaGluZSBpbiBhY2NvcmRhbmNlIHdpdGggdGhlIFNwZWNpZmljYXRpb24uIFN1Y2ggSW5zdGFsbGFibGUKKwkJCVNvZnR3YXJlIEFncmVlbWVudCBtdXN0IGluZm9ybSB0aGUgdXNlciBvZiB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMKKwkJCXRoYXQgZ292ZXJuIHRoZSBJbnN0YWxsYWJsZSBTb2Z0d2FyZSBhbmQgbXVzdCBzb2xpY2l0IGFjY2VwdGFuY2UgYnkKKwkJCXRoZSBlbmQgdXNlciBpbiB0aGUgbWFubmVyIHByZXNjcmliZWQgaW4gc3VjaCBJbnN0YWxsYWJsZSBTb2Z0d2FyZQorCQkJQWdyZWVtZW50LiBVcG9uIHN1Y2ggaW5kaWNhdGlvbiBvZiBhZ3JlZW1lbnQgYnkgdGhlIHVzZXIsIHRoZQorCQkJcHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kgd2lsbCBjb21wbGV0ZSBpbnN0YWxsYXRpb24gb2YgdGhlIEluc3RhbGxhYmxlCisJCQlTb2Z0d2FyZS48L2xpPgorCTwvb2w+CiAKLTxoMz5DcnlwdG9ncmFwaHk8L2gzPgorCTxoMz5DcnlwdG9ncmFwaHk8L2gzPgogCi08cD5Db250ZW50IG1heSBjb250YWluIGVuY3J5cHRpb24gc29mdHdhcmUuIFRoZSBjb3VudHJ5IGluIHdoaWNoIHlvdSBhcmUKLSBjdXJyZW50bHkgbWF5IGhhdmUgcmVzdHJpY3Rpb25zIG9uIHRoZSBpbXBvcnQsIHBvc3Nlc3Npb24sIGFuZCB1c2UsIAotYW5kL29yIHJlLWV4cG9ydCB0bwotICAgYW5vdGhlciBjb3VudHJ5LCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBCRUZPUkUgdXNpbmcgYW55IGVuY3J5cHRpb24gCi1zb2Z0d2FyZSwgcGxlYXNlIGNoZWNrIHRoZSBjb3VudHJ5J3MgbGF3cywgcmVndWxhdGlvbnMgYW5kIHBvbGljaWVzIAotY29uY2VybmluZyB0aGUgaW1wb3J0LAotICAgcG9zc2Vzc2lvbiwgb3IgdXNlLCBhbmQgcmUtZXhwb3J0IG9mIGVuY3J5cHRpb24gc29mdHdhcmUsIHRvIHNlZSBpZiAKLXRoaXMgaXMgcGVybWl0dGVkLjwvcD4KKwk8cD5Db250ZW50IG1heSBjb250YWluIGVuY3J5cHRpb24gc29mdHdhcmUuIFRoZSBjb3VudHJ5IGluIHdoaWNoCisJCXlvdSBhcmUgY3VycmVudGx5IG1heSBoYXZlIHJlc3RyaWN0aW9ucyBvbiB0aGUgaW1wb3J0LCBwb3NzZXNzaW9uLCBhbmQKKwkJdXNlLCBhbmQvb3IgcmUtZXhwb3J0IHRvIGFub3RoZXIgY291bnRyeSwgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZS4KKwkJQkVGT1JFIHVzaW5nIGFueSBlbmNyeXB0aW9uIHNvZnR3YXJlLCBwbGVhc2UgY2hlY2sgdGhlIGNvdW50cnkncyBsYXdzLAorCQlyZWd1bGF0aW9ucyBhbmQgcG9saWNpZXMgY29uY2VybmluZyB0aGUgaW1wb3J0LCBwb3NzZXNzaW9uLCBvciB1c2UsCisJCWFuZCByZS1leHBvcnQgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgdG8gc2VlIGlmIHRoaXMgaXMgcGVybWl0dGVkLjwvcD4KIAotPHA+PHNtYWxsPkphdmEgYW5kIGFsbCBKYXZhLWJhc2VkIHRyYWRlbWFya3MgYXJlIHRyYWRlbWFya3Mgb2YgT3JhY2xlIENvcnBvcmF0aW9uIGluIHRoZSBVbml0ZWQgU3RhdGVzLCBvdGhlciBjb3VudHJpZXMsIG9yIGJvdGguPC9zbWFsbD48L3A+Ci0KLQotPC9ib2R5PjwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCisJPHA+CisJCTxzbWFsbD5KYXZhIGFuZCBhbGwgSmF2YS1iYXNlZCB0cmFkZW1hcmtzIGFyZSB0cmFkZW1hcmtzIG9mCisJCQlPcmFjbGUgQ29ycG9yYXRpb24gaW4gdGhlIFVuaXRlZCBTdGF0ZXMsIG90aGVyIGNvdW50cmllcywgb3IgYm90aC48L3NtYWxsPgorCTwvcD4KKzwvYm9keT4KKzwvaHRtbD4KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLm9zYnAueHRleHQuZGF0YWludGVyY2hhbmdlL21vZGVsL0RhdGFEU0wueGNvcmUgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmRhdGFpbnRlcmNoYW5nZS9tb2RlbC9EYXRhRFNMLnhjb3JlCmluZGV4IDZjNmM3NWEuLjUwOWViMTkgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLm9zYnAueHRleHQuZGF0YWludGVyY2hhbmdlL21vZGVsL0RhdGFEU0wueGNvcmUKKysrIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5kYXRhaW50ZXJjaGFuZ2UvbW9kZWwvRGF0YURTTC54Y29yZQpAQCAtOSwxMyArOSwxNSBAQAogCiBAR2VuTW9kZWwoY29weXJpZ2h0VGV4dD0iQ29weXJpZ2h0IChjKSAyMDE0LCBMb2V0eiBHbWJIJkNvLktHIChIZWlkZWxiZXJnKQogIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIAorIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgMi4wICAKICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAKLSBodHRwey8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCAKKyBodHRwczovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLyAKKyAKKyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCAKIAogIEJhc2VkIG9uIGlkZWFzIGZyb20gWHRleHQsIFh0ZW5kLCBYY29yZQogICAKLSBDb250cmlidXRvcnN7ICAKKyBDb250cmlidXRvcnM6ICAKICAJCUpvZXJnIFJpZWdlbCAtIEluaXRpYWwgaW1wbGVtZW50YXRpb24gCiAgIikKIEBFY29yZShuc1VSST0iaHR0cDovL29zYnAuZWNsaXBzZS5vcmcveHRleHQvZGF0YWludGVyY2hhbmdlL0RhdGFEU0wiKQpAQCAtMjgsNiArMzAsNyBAQAogaW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAuZHNsLnNlbWFudGljLmNvbW1vbi50eXBlcy5MUGFja2FnZQogaW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAuZHNsLnNlbWFudGljLmVudGl0eS5MRW50aXR5CiBpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC5kc2wuc2VtYW50aWMuZW50aXR5LkxFbnRpdHlBdHRyaWJ1dGUKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLmRzbC5zZW1hbnRpYy5lbnRpdHkuTEVudGl0eUZlYXR1cmUKIGltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLmRzbC5zZW1hbnRpYy5lbnRpdHkuTEVudGl0eVJlZmVyZW5jZQogaW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAueHRleHQub3h0eXBlLnJlc291cmNlLkVjb3JlVXRpbDMKIGltcG9ydCBvcmcuZWNsaXBzZS54dGV4dC54dHlwZS5YSW1wb3J0U2VjdGlvbgpAQCAtNjMsNiArNjYsNyBAQAogCUVudGl0eU1hbmFnZXJNb2RlIG1vZGUKIAljb250YWlucyBEYXRhSW50ZXJjaGFuZ2VGaWxlIGZpbGVFbmRwb2ludAogCWNvbnRhaW5zIERhdGFJbnRlcmNoYW5nZUJlYW5bXSBwYXRoCisJYm9vbGVhbiBkZWxldGVGaWxlQWZ0ZXJJbXBvcnQKIH0KIAogaW50ZXJmYWNlIERhdGFJbnRlcmNoYW5nZUZpbGUgZXh0ZW5kcyBEYXRhSW50ZXJjaGFuZ2VMYXp5UmVzb2x2ZXJ7CkBAIC05MSw5ICs5NSwxMSBAQAogCiBjbGFzcyBEYXRhSW50ZXJjaGFuZ2VCZWFuIGV4dGVuZHMgRGF0YUludGVyY2hhbmdlTGF6eVJlc29sdmVyIHsKIAlyZWZlcnMgTEVudGl0eSBlbnRpdHkKLQlib29sZWFuIG1hcmtMYXRlc3QKKwlib29sZWFuIG1hcmtMYXRlc3RJbXBvcnQKKwlib29sZWFuIG1hcmtMYXRlc3RFeHBvcnQKIAlib29sZWFuIGhhc0Jsb2JNYXBwaW5nCiAJcmVmZXJzIExFbnRpdHlBdHRyaWJ1dGUgbGF0ZXN0UHJvcGVydHkKKwlyZWZlcnMgTEVudGl0eUF0dHJpYnV0ZSBsYXRlc3RFeHBQcm9wZXJ0eQogCVN0cmluZyBlbGVtZW50TWFwCiAJU3RyaW5nIG5vZGVOYW1lCiAJY29udGFpbnMgRGF0YUludGVyY2hhbmdlTG9va3VwW10gbG9va3VwCkBAIC0xMDEsNiArMTA3LDggQEAKIAljb250YWlucyBEYXRhSW50ZXJjaGFuZ2VFeHByZXNzaW9uW10gZXhwcmVzc2lvbgogCWNvbnRhaW5zIERhdGFJbnRlcmNoYW5nZU1hcHBpbmdbXSBtYXBwaW5ncwogCWNvbnRhaW5zIERhdGFJbnRlcmNoYW5nZUtleVtdIGxvb2t1cEtleXMKKwljb250YWlucyBEYXRhSW50ZXJjaGFuZ2VFeHBvc2VbXSBleHBvcnRFeHBvc2VzCisJY29udGFpbnMgRGF0YUludGVyY2hhbmdlRXhwb3J0RmlsdGVyIGV4cG9ydEZpbHRlcgogfQogCiBjbGFzcyBEYXRhSW50ZXJjaGFuZ2VLZXkgZXh0ZW5kcyAgRGF0YUludGVyY2hhbmdlTGF6eVJlc29sdmVyIHsKQEAgLTEzOSw2ICsxNDcsMjkgQEAKIAljb250YWlucyBEYXRhSW50ZXJjaGFuZ2VNYXJrZXJQYXRoIG1hcmtlclBhdGgKIH0KIAorY2xhc3MgRGF0YUludGVyY2hhbmdlRXhwb3NlIGV4dGVuZHMgRGF0YUludGVyY2hhbmdlTGF6eVJlc29sdmVyIHsKKwlyZWZlcnMgTEVudGl0eVJlZmVyZW5jZSByZWZFbnRpdHkKKwlyZWZlcnMgTEVudGl0eUF0dHJpYnV0ZSByZWZQcm9wZXJ0eQorCWNvbnRhaW5zIERhdGFJbnRlcmNoYW5nZUV4cG9zZSBzdWJFeHBvc2UKK30KKworY2xhc3MgRGF0YUludGVyY2hhbmdlRXhwb3J0RmlsdGVyIGV4dGVuZHMgRGF0YUludGVyY2hhbmdlTGF6eVJlc29sdmVyIHsKKwljb250YWlucyBEYXRhSW50ZXJjaGFuZ2VGaWx0ZXJDb25kaXRpb24gY29uZGl0aW9uCisJY29udGFpbnMgRGF0YUludGVyY2hhbmdlRXhwb3J0SGlkZVtdIGhpZGRlbnByb3BlcnRpZXMKK30KKworY2xhc3MgRGF0YUludGVyY2hhbmdlRmlsdGVyQ29uZGl0aW9uIGV4dGVuZHMgRGF0YUludGVyY2hhbmdlTGF6eVJlc29sdmVyIHsKKwlyZWZlcnMgTEVudGl0eUZlYXR1cmUgcmVmUHJvcGVydHkKKwlDb25kaXRpb25BbmRPcGVyYXRvcjEgb3BlcmF0b3IKKwlTdHJpbmcgdmFsdWUKKwlDb25kaXRpb25BbmRPcGVyYXRvcjIgb3BlcmF0b3IyCisJY29udGFpbnMgRGF0YUludGVyY2hhbmdlRmlsdGVyQ29uZGl0aW9uIHN1YmNvbmRpdGlvbgorfQorCitjbGFzcyBEYXRhSW50ZXJjaGFuZ2VFeHBvcnRIaWRlIGV4dGVuZHMgRGF0YUludGVyY2hhbmdlTGF6eVJlc29sdmVyIHsKKwlyZWZlcnMgTEVudGl0eUZlYXR1cmUgcHJvcGVydHkKK30KKwogY2xhc3MgRGF0YUludGVyY2hhbmdlTWFya2VyUGF0aCBleHRlbmRzIERhdGFJbnRlcmNoYW5nZUxhenlSZXNvbHZlciB7CiAJY29udGFpbnMgRGF0YUludGVyY2hhbmdlTWFya2VyRW50aXR5W10gcGF0aAkKIH0KQEAgLTE5MiwzICsyMjMsMjMgQEAKIAltZXJnZQkJYXMgJ21lcmdlJwogCXJlbW92ZQkJYXMgJ3JlbW92ZScKIH0KKworZW51bSBDb25kaXRpb25BbmRPcGVyYXRvcjF7CisJZXF1YWxzIGFzICc9JworCW5vdGVxdWFscyBhcyAnIT0nCisJZ3JlYXRlcnRoZW4gYXMgJz4nCisJZ3JlYXRlcnRoZW5vcmVxdWFsdG8gYXMgJz49JworCWxlc3N0aGVuIGFzICc8JworCWxlc3N0aGVub3JlcXVhbHRvIGFzICc8PScKKwlpbiBhcyAnaW4nCisJYmV0d2VlbiBhcyAnYmV0d2VlbicKKwlsaWtlIGFzICdsaWtlJworCW5vdCBhcyAnbm90JworCWlzbnVsbCBhcyAJJ2lzbnVsbCcKKwlpc25vdG51bGwgYXMgJ2lzbm90bnVsbCcKKwlleGlzdHMgYXMgJ2V4aXN0cycKK30KK2VudW0gQ29uZGl0aW9uQW5kT3BlcmF0b3IyeworCWFuZCBhcyAnYW5kJworCW9yIGFzICdvcicKK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmRhdGFpbnRlcmNoYW5nZS9wbHVnaW4ucHJvcGVydGllcyBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQuZGF0YWludGVyY2hhbmdlL3BsdWdpbi5wcm9wZXJ0aWVzCmluZGV4IGRmZDY5MWEuLmFlMDVmMDcgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLm9zYnAueHRleHQuZGF0YWludGVyY2hhbmdlL3BsdWdpbi5wcm9wZXJ0aWVzCisrKyBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQuZGF0YWludGVyY2hhbmdlL3BsdWdpbi5wcm9wZXJ0aWVzCkBAIC0xLDEyICsxLDE0IEBACiAjIENvcHlyaWdodCAoYykgMjAxNCwgTG9ldHogR21iSCZDby5LRyAoSGVpZGVsYmVyZykKICMgIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0jICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgCisjICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIDIuMCAgCiAjICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAKLSMgIGh0dHB7Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIAorIyAgaHR0cHM6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC8gCisjIAorIyAgU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgCiAjIAogIyAgQmFzZWQgb24gaWRlYXMgZnJvbSBYdGV4dCwgWHRlbmQsIFhjb3JlCiAjICAgCi0jICBDb250cmlidXRvcnN7ICAKKyMgIENvbnRyaWJ1dG9yczogIAogIyAgCQlKb2VyZyBSaWVnZWwgLSBJbml0aWFsIGltcGxlbWVudGF0aW9uIAogIyAgCiAKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLm9zYnAueHRleHQuZGF0YWludGVyY2hhbmdlL3BsdWdpbi54bWwgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmRhdGFpbnRlcmNoYW5nZS9wbHVnaW4ueG1sCmluZGV4IDA4MzY1ZjUuLjNiZDQzNjggMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLm9zYnAueHRleHQuZGF0YWludGVyY2hhbmdlL3BsdWdpbi54bWwKKysrIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5kYXRhaW50ZXJjaGFuZ2UvcGx1Z2luLnhtbApAQCAtNCw5ICs0LDExIEBACiA8IS0tCiAgQ29weXJpZ2h0IChjKSAyMDE0LCBMb2V0eiBHbWJIJkNvLktHIChIZWlkZWxiZXJnKQogICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgCisgIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgMi4wICAKICAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgCi0gIGh0dHB7Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIAorICBodHRwczovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLyAKKyAKKyAgU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgCiAgCiAgIEJhc2VkIG9uIGlkZWFzIGZyb20gWHRleHQsIFh0ZW5kLCBYY29yZQogICAgCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmRhdGFpbnRlcmNoYW5nZS9wb20ueG1sIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5kYXRhaW50ZXJjaGFuZ2UvcG9tLnhtbAppbmRleCA4M2VmNGQ3Li43Y2Q1ZjgyIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmRhdGFpbnRlcmNoYW5nZS9wb20ueG1sCisrKyBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQuZGF0YWludGVyY2hhbmdlL3BvbS54bWwKQEAgLTIsOSArMiwxMSBAQAogPCEtLSM9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KIDwhLS0jIENvcHlyaWdodCAoYykgMjAxMSwgMjAxNiAtIExvZXR6IEdtYkgmQ28uS0cgKDY5MTE1IEhlaWRlbGJlcmcsIEdlcm1hbnkpIC0tPgogPCEtLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAtLT4KLTwhLS0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCAtLT4KKzwhLS0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgMi4wICAtLT4KIDwhLS0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IC0tPgotPCEtLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwgLS0+Cis8IS0tIyBodHRwczovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLyAgICAtLT4KKzwhLS0jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgorPCEtLSMgU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgICAgICAgICAgLS0+CiA8IS0tIyAtLT4KIDwhLS0jIENvbnRyaWJ1dG9yczogLS0+CiA8IS0tIyAgICAgQ2hyaXN0b3BoZSBMb2V0eiAoTG9ldHogR21iSCZDby5LRykgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24gLS0+CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmRhdGFpbnRlcmNoYW5nZS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvZGF0YWludGVyY2hhbmdlL0Fic3RyYWN0RGF0YURTTFJ1bnRpbWVNb2R1bGUuamF2YSBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQuZGF0YWludGVyY2hhbmdlL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9kYXRhaW50ZXJjaGFuZ2UvQWJzdHJhY3REYXRhRFNMUnVudGltZU1vZHVsZS5qYXZhCmluZGV4IDJmYTcyMDEuLmNlNDA1NDYgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLm9zYnAueHRleHQuZGF0YWludGVyY2hhbmdlL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9kYXRhaW50ZXJjaGFuZ2UvQWJzdHJhY3REYXRhRFNMUnVudGltZU1vZHVsZS5qYXZhCisrKyBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQuZGF0YWludGVyY2hhbmdlL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9kYXRhaW50ZXJjaGFuZ2UvQWJzdHJhY3REYXRhRFNMUnVudGltZU1vZHVsZS5qYXZhCkBAIC0zLDkgKzMsMTEgQEAKICAqICBDb3B5cmlnaHQgKGMpIDIwMTEsIDIwMTYgLSBMb2V0eiBHbWJIJkNvLktHICg2OTExNSBIZWlkZWxiZXJnLCBHZXJtYW55KSAKICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICogIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgICAgICAgICAgIAotICogIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCAgICAgICAKKyAqICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIDIuMCAgICAgICAgCiAgKiAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgICAgICAgICAgICAgICAgICAKLSAqICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICogIGh0dHBzOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAvICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICogIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAqICBDb250cmlidXRvcnM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgKiAJICAgQ2hyaXN0b3BoZSBMb2V0eiAoTG9ldHogR21iSCZDby5LRykgLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmRhdGFpbnRlcmNoYW5nZS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvZGF0YWludGVyY2hhbmdlL0RhdGFEU0wueHRleHRiaW4gYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmRhdGFpbnRlcmNoYW5nZS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvZGF0YWludGVyY2hhbmdlL0RhdGFEU0wueHRleHRiaW4KaW5kZXggZmZiYTcxNS4uY2Y0YTQzOCAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5kYXRhaW50ZXJjaGFuZ2Uvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2RhdGFpbnRlcmNoYW5nZS9EYXRhRFNMLnh0ZXh0YmluCisrKyBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQuZGF0YWludGVyY2hhbmdlL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9kYXRhaW50ZXJjaGFuZ2UvRGF0YURTTC54dGV4dGJpbgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmRhdGFpbnRlcmNoYW5nZS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvZGF0YWludGVyY2hhbmdlL0RhdGFEU0xTdGFuZGFsb25lU2V0dXBHZW5lcmF0ZWQuamF2YSBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQuZGF0YWludGVyY2hhbmdlL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9kYXRhaW50ZXJjaGFuZ2UvRGF0YURTTFN0YW5kYWxvbmVTZXR1cEdlbmVyYXRlZC5qYXZhCmluZGV4IGI2NDdhOTkuLmUxN2RlYjMgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLm9zYnAueHRleHQuZGF0YWludGVyY2hhbmdlL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9kYXRhaW50ZXJjaGFuZ2UvRGF0YURTTFN0YW5kYWxvbmVTZXR1cEdlbmVyYXRlZC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQuZGF0YWludGVyY2hhbmdlL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9kYXRhaW50ZXJjaGFuZ2UvRGF0YURTTFN0YW5kYWxvbmVTZXR1cEdlbmVyYXRlZC5qYXZhCkBAIC0zLDkgKzMsMTEgQEAKICAqICBDb3B5cmlnaHQgKGMpIDIwMTEsIDIwMTYgLSBMb2V0eiBHbWJIJkNvLktHICg2OTExNSBIZWlkZWxiZXJnLCBHZXJtYW55KSAKICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICogIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgICAgICAgICAgIAotICogIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCAgICAgICAKKyAqICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIDIuMCAgICAgICAgCiAgKiAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgICAgICAgICAgICAgICAgICAKLSAqICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICogIGh0dHBzOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAvICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICogIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAqICBDb250cmlidXRvcnM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgKiAJICAgQ2hyaXN0b3BoZSBMb2V0eiAoTG9ldHogR21iSCZDby5LRykgLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmRhdGFpbnRlcmNoYW5nZS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvZGF0YWludGVyY2hhbmdlL3BhcnNlci9hbnRsci9EYXRhRFNMQW50bHJUb2tlbkZpbGVQcm92aWRlci5qYXZhIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5kYXRhaW50ZXJjaGFuZ2Uvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2RhdGFpbnRlcmNoYW5nZS9wYXJzZXIvYW50bHIvRGF0YURTTEFudGxyVG9rZW5GaWxlUHJvdmlkZXIuamF2YQppbmRleCAyYWJlN2Y1Li5iZDA2ZTg5IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmRhdGFpbnRlcmNoYW5nZS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvZGF0YWludGVyY2hhbmdlL3BhcnNlci9hbnRsci9EYXRhRFNMQW50bHJUb2tlbkZpbGVQcm92aWRlci5qYXZhCisrKyBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQuZGF0YWludGVyY2hhbmdlL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9kYXRhaW50ZXJjaGFuZ2UvcGFyc2VyL2FudGxyL0RhdGFEU0xBbnRsclRva2VuRmlsZVByb3ZpZGVyLmphdmEKQEAgLTMsOSArMywxMSBAQAogICogIENvcHlyaWdodCAoYykgMjAxMSwgMjAxNiAtIExvZXR6IEdtYkgmQ28uS0cgKDY5MTE1IEhlaWRlbGJlcmcsIEdlcm1hbnkpIAogICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgKiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAgICAgICAgICAgCi0gKiAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wICAgICAgIAorICogIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgMi4wICAgICAgICAKICAqICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAgICAgICAgICAgICAgICAgIAotICogIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKiAgaHR0cHM6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKiAgU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICogIENvbnRyaWJ1dG9yczogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAqIAkgICBDaHJpc3RvcGhlIExvZXR6IChMb2V0eiBHbWJIJkNvLktHKSAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLm9zYnAueHRleHQuZGF0YWludGVyY2hhbmdlL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9kYXRhaW50ZXJjaGFuZ2UvcGFyc2VyL2FudGxyL0RhdGFEU0xQYXJzZXIuamF2YSBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQuZGF0YWludGVyY2hhbmdlL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9kYXRhaW50ZXJjaGFuZ2UvcGFyc2VyL2FudGxyL0RhdGFEU0xQYXJzZXIuamF2YQppbmRleCA3ZDIwNTczLi42MjgwY2QzIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmRhdGFpbnRlcmNoYW5nZS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvZGF0YWludGVyY2hhbmdlL3BhcnNlci9hbnRsci9EYXRhRFNMUGFyc2VyLmphdmEKKysrIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5kYXRhaW50ZXJjaGFuZ2Uvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2RhdGFpbnRlcmNoYW5nZS9wYXJzZXIvYW50bHIvRGF0YURTTFBhcnNlci5qYXZhCkBAIC0zLDkgKzMsMTEgQEAKICAqICBDb3B5cmlnaHQgKGMpIDIwMTEsIDIwMTYgLSBMb2V0eiBHbWJIJkNvLktHICg2OTExNSBIZWlkZWxiZXJnLCBHZXJtYW55KSAKICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICogIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgICAgICAgICAgIAotICogIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCAgICAgICAKKyAqICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIDIuMCAgICAgICAgCiAgKiAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgICAgICAgICAgICAgICAgICAKLSAqICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICogIGh0dHBzOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAvICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICogIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAqICBDb250cmlidXRvcnM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgKiAJICAgQ2hyaXN0b3BoZSBMb2V0eiAoTG9ldHogR21iSCZDby5LRykgLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmRhdGFpbnRlcmNoYW5nZS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvZGF0YWludGVyY2hhbmdlL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbERhdGFEU0wuZyBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQuZGF0YWludGVyY2hhbmdlL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9kYXRhaW50ZXJjaGFuZ2UvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsRGF0YURTTC5nCmluZGV4IDBhMjZjOGEuLmIyYzlmNTQgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLm9zYnAueHRleHQuZGF0YWludGVyY2hhbmdlL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9kYXRhaW50ZXJjaGFuZ2UvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsRGF0YURTTC5nCisrKyBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQuZGF0YWludGVyY2hhbmdlL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9kYXRhaW50ZXJjaGFuZ2UvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsRGF0YURTTC5nCkBAIC0zOTQsMTYgKzM5NCwzMCBAQAogCQkJCSkKIAkJCSkKIAkJKT8KLQkJb3RoZXJsdl8xMT0nZmlsZScKKwkJKAorCQkJKAorCQkJCWx2X2RlbGV0ZUZpbGVBZnRlckltcG9ydF8xMV8wPSdkZWxldGVGaWxlQWZ0ZXJJbXBvcnQnCisJCQkJeworCQkJCQluZXdMZWFmTm9kZShsdl9kZWxldGVGaWxlQWZ0ZXJJbXBvcnRfMTFfMCwgZ3JhbW1hckFjY2Vzcy5nZXREYXRhSW50ZXJjaGFuZ2VBY2Nlc3MoKS5nZXREZWxldGVGaWxlQWZ0ZXJJbXBvcnREZWxldGVGaWxlQWZ0ZXJJbXBvcnRLZXl3b3JkXzhfMCgpKTsKKwkJCQl9CisJCQkJeworCQkJCQlpZiAoJGN1cnJlbnQ9PW51bGwpIHsKKwkJCQkJCSRjdXJyZW50ID0gY3JlYXRlTW9kZWxFbGVtZW50KGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YUludGVyY2hhbmdlUnVsZSgpKTsKKwkJCQkJfQorCQkJCQlzZXRXaXRoTGFzdENvbnN1bWVkKCRjdXJyZW50LCAiZGVsZXRlRmlsZUFmdGVySW1wb3J0IiwgdHJ1ZSwgImRlbGV0ZUZpbGVBZnRlckltcG9ydCIpOworCQkJCX0KKwkJCSkKKwkJKT8KKwkJb3RoZXJsdl8xMj0nZmlsZScKIAkJewotCQkJbmV3TGVhZk5vZGUob3RoZXJsdl8xMSwgZ3JhbW1hckFjY2Vzcy5nZXREYXRhSW50ZXJjaGFuZ2VBY2Nlc3MoKS5nZXRGaWxlS2V5d29yZF84KCkpOworCQkJbmV3TGVhZk5vZGUob3RoZXJsdl8xMiwgZ3JhbW1hckFjY2Vzcy5nZXREYXRhSW50ZXJjaGFuZ2VBY2Nlc3MoKS5nZXRGaWxlS2V5d29yZF85KCkpOwogCQl9CiAJCSgKIAkJCSgKIAkJCQl7Ci0JCQkJCW5ld0NvbXBvc2l0ZU5vZGUoZ3JhbW1hckFjY2Vzcy5nZXREYXRhSW50ZXJjaGFuZ2VBY2Nlc3MoKS5nZXRGaWxlRW5kcG9pbnREYXRhSW50ZXJjaGFuZ2VGaWxlUGFyc2VyUnVsZUNhbGxfOV8wKCkpOworCQkJCQluZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YUludGVyY2hhbmdlQWNjZXNzKCkuZ2V0RmlsZUVuZHBvaW50RGF0YUludGVyY2hhbmdlRmlsZVBhcnNlclJ1bGVDYWxsXzEwXzAoKSk7CiAJCQkJfQotCQkJCWx2X2ZpbGVFbmRwb2ludF8xMl8wPXJ1bGVEYXRhSW50ZXJjaGFuZ2VGaWxlCisJCQkJbHZfZmlsZUVuZHBvaW50XzEzXzA9cnVsZURhdGFJbnRlcmNoYW5nZUZpbGUKIAkJCQl7CiAJCQkJCWlmICgkY3VycmVudD09bnVsbCkgewogCQkJCQkJJGN1cnJlbnQgPSBjcmVhdGVNb2RlbEVsZW1lbnRGb3JQYXJlbnQoZ3JhbW1hckFjY2Vzcy5nZXREYXRhSW50ZXJjaGFuZ2VSdWxlKCkpOwpAQCAtNDExLDI2ICs0MjUsMjYgQEAKIAkJCQkJc2V0KAogCQkJCQkJJGN1cnJlbnQsCiAJCQkJCQkiZmlsZUVuZHBvaW50IiwKLQkJCQkJCWx2X2ZpbGVFbmRwb2ludF8xMl8wLAorCQkJCQkJbHZfZmlsZUVuZHBvaW50XzEzXzAsCiAJCQkJCQkib3JnLmVjbGlwc2Uub3NicC54dGV4dC5kYXRhaW50ZXJjaGFuZ2UuRGF0YURTTC5EYXRhSW50ZXJjaGFuZ2VGaWxlIik7CiAJCQkJCWFmdGVyUGFyc2VyT3JFbnVtUnVsZUNhbGwoKTsKIAkJCQl9CiAJCQkpCiAJCSkKLQkJb3RoZXJsdl8xMz0ncGF0aCcKKwkJb3RoZXJsdl8xND0ncGF0aCcKIAkJewotCQkJbmV3TGVhZk5vZGUob3RoZXJsdl8xMywgZ3JhbW1hckFjY2Vzcy5nZXREYXRhSW50ZXJjaGFuZ2VBY2Nlc3MoKS5nZXRQYXRoS2V5d29yZF8xMCgpKTsKKwkJCW5ld0xlYWZOb2RlKG90aGVybHZfMTQsIGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YUludGVyY2hhbmdlQWNjZXNzKCkuZ2V0UGF0aEtleXdvcmRfMTEoKSk7CiAJCX0KLQkJb3RoZXJsdl8xND0neycKKwkJb3RoZXJsdl8xNT0neycKIAkJewotCQkJbmV3TGVhZk5vZGUob3RoZXJsdl8xNCwgZ3JhbW1hckFjY2Vzcy5nZXREYXRhSW50ZXJjaGFuZ2VBY2Nlc3MoKS5nZXRMZWZ0Q3VybHlCcmFja2V0S2V5d29yZF8xMSgpKTsKKwkJCW5ld0xlYWZOb2RlKG90aGVybHZfMTUsIGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YUludGVyY2hhbmdlQWNjZXNzKCkuZ2V0TGVmdEN1cmx5QnJhY2tldEtleXdvcmRfMTIoKSk7CiAJCX0KIAkJKAogCQkJKAogCQkJCXsKLQkJCQkJbmV3Q29tcG9zaXRlTm9kZShncmFtbWFyQWNjZXNzLmdldERhdGFJbnRlcmNoYW5nZUFjY2VzcygpLmdldFBhdGhEYXRhSW50ZXJjaGFuZ2VCZWFuUGFyc2VyUnVsZUNhbGxfMTJfMCgpKTsKKwkJCQkJbmV3Q29tcG9zaXRlTm9kZShncmFtbWFyQWNjZXNzLmdldERhdGFJbnRlcmNoYW5nZUFjY2VzcygpLmdldFBhdGhEYXRhSW50ZXJjaGFuZ2VCZWFuUGFyc2VyUnVsZUNhbGxfMTNfMCgpKTsKIAkJCQl9Ci0JCQkJbHZfcGF0aF8xNV8wPXJ1bGVEYXRhSW50ZXJjaGFuZ2VCZWFuCisJCQkJbHZfcGF0aF8xNl8wPXJ1bGVEYXRhSW50ZXJjaGFuZ2VCZWFuCiAJCQkJewogCQkJCQlpZiAoJGN1cnJlbnQ9PW51bGwpIHsKIAkJCQkJCSRjdXJyZW50ID0gY3JlYXRlTW9kZWxFbGVtZW50Rm9yUGFyZW50KGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YUludGVyY2hhbmdlUnVsZSgpKTsKQEAgLTQzOCwxNSArNDUyLDE1IEBACiAJCQkJCWFkZCgKIAkJCQkJCSRjdXJyZW50LAogCQkJCQkJInBhdGgiLAotCQkJCQkJbHZfcGF0aF8xNV8wLAorCQkJCQkJbHZfcGF0aF8xNl8wLAogCQkJCQkJIm9yZy5lY2xpcHNlLm9zYnAueHRleHQuZGF0YWludGVyY2hhbmdlLkRhdGFEU0wuRGF0YUludGVyY2hhbmdlQmVhbiIpOwogCQkJCQlhZnRlclBhcnNlck9yRW51bVJ1bGVDYWxsKCk7CiAJCQkJfQogCQkJKQogCQkpKgotCQlvdGhlcmx2XzE2PSd9JworCQlvdGhlcmx2XzE3PSd9JwogCQl7Ci0JCQluZXdMZWFmTm9kZShvdGhlcmx2XzE2LCBncmFtbWFyQWNjZXNzLmdldERhdGFJbnRlcmNoYW5nZUFjY2VzcygpLmdldFJpZ2h0Q3VybHlCcmFja2V0S2V5d29yZF8xMygpKTsKKwkJCW5ld0xlYWZOb2RlKG90aGVybHZfMTcsIGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YUludGVyY2hhbmdlQWNjZXNzKCkuZ2V0UmlnaHRDdXJseUJyYWNrZXRLZXl3b3JkXzE0KCkpOwogCQl9CiAJKQogOwpAQCAtMTE1NSwxNSArMTE2OSwxNSBAQAogCQkoCiAJCQkoCiAJCQkJKAotCQkJCQlsdl9tYXJrTGF0ZXN0XzdfMD0nbWFya2VyJworCQkJCQlsdl9tYXJrTGF0ZXN0SW1wb3J0XzdfMD0nbGF0ZXN0SW1wb3J0JwogCQkJCQl7Ci0JCQkJCQluZXdMZWFmTm9kZShsdl9tYXJrTGF0ZXN0XzdfMCwgZ3JhbW1hckFjY2Vzcy5nZXREYXRhSW50ZXJjaGFuZ2VCZWFuQWNjZXNzKCkuZ2V0TWFya0xhdGVzdE1hcmtlcktleXdvcmRfNV8wXzAoKSk7CisJCQkJCQluZXdMZWFmTm9kZShsdl9tYXJrTGF0ZXN0SW1wb3J0XzdfMCwgZ3JhbW1hckFjY2Vzcy5nZXREYXRhSW50ZXJjaGFuZ2VCZWFuQWNjZXNzKCkuZ2V0TWFya0xhdGVzdEltcG9ydExhdGVzdEltcG9ydEtleXdvcmRfNV8wXzAoKSk7CiAJCQkJCX0KIAkJCQkJewogCQkJCQkJaWYgKCRjdXJyZW50PT1udWxsKSB7CiAJCQkJCQkJJGN1cnJlbnQgPSBjcmVhdGVNb2RlbEVsZW1lbnQoZ3JhbW1hckFjY2Vzcy5nZXREYXRhSW50ZXJjaGFuZ2VCZWFuUnVsZSgpKTsKIAkJCQkJCX0KLQkJCQkJCXNldFdpdGhMYXN0Q29uc3VtZWQoJGN1cnJlbnQsICJtYXJrTGF0ZXN0IiwgdHJ1ZSwgIm1hcmtlciIpOworCQkJCQkJc2V0V2l0aExhc3RDb25zdW1lZCgkY3VycmVudCwgIm1hcmtMYXRlc3RJbXBvcnQiLCB0cnVlLCAibGF0ZXN0SW1wb3J0Iik7CiAJCQkJCX0KIAkJCQkpCiAJCQkpCkBAIC0xMTgyLDIwICsxMTk2LDQ5IEBACiAJCQkpCiAJCSk/CiAJCSgKLQkJCW90aGVybHZfOT0nZXhwcmVzc2lvbicKKwkJCSgKKwkJCQkoCisJCQkJCWx2X21hcmtMYXRlc3RFeHBvcnRfOV8wPSdsYXRlc3RFeHBvcnQnCisJCQkJCXsKKwkJCQkJCW5ld0xlYWZOb2RlKGx2X21hcmtMYXRlc3RFeHBvcnRfOV8wLCBncmFtbWFyQWNjZXNzLmdldERhdGFJbnRlcmNoYW5nZUJlYW5BY2Nlc3MoKS5nZXRNYXJrTGF0ZXN0RXhwb3J0TGF0ZXN0RXhwb3J0S2V5d29yZF82XzBfMCgpKTsKKwkJCQkJfQorCQkJCQl7CisJCQkJCQlpZiAoJGN1cnJlbnQ9PW51bGwpIHsKKwkJCQkJCQkkY3VycmVudCA9IGNyZWF0ZU1vZGVsRWxlbWVudChncmFtbWFyQWNjZXNzLmdldERhdGFJbnRlcmNoYW5nZUJlYW5SdWxlKCkpOworCQkJCQkJfQorCQkJCQkJc2V0V2l0aExhc3RDb25zdW1lZCgkY3VycmVudCwgIm1hcmtMYXRlc3RFeHBvcnQiLCB0cnVlLCAibGF0ZXN0RXhwb3J0Iik7CisJCQkJCX0KKwkJCQkpCisJCQkpCisJCQkoCisJCQkJKAorCQkJCQl7CisJCQkJCQlpZiAoJGN1cnJlbnQ9PW51bGwpIHsKKwkJCQkJCQkkY3VycmVudCA9IGNyZWF0ZU1vZGVsRWxlbWVudChncmFtbWFyQWNjZXNzLmdldERhdGFJbnRlcmNoYW5nZUJlYW5SdWxlKCkpOworCQkJCQkJfQorCQkJCQl9CisJCQkJCW90aGVybHZfMTA9UlVMRV9JRAorCQkJCQl7CisJCQkJCQluZXdMZWFmTm9kZShvdGhlcmx2XzEwLCBncmFtbWFyQWNjZXNzLmdldERhdGFJbnRlcmNoYW5nZUJlYW5BY2Nlc3MoKS5nZXRMYXRlc3RFeHBQcm9wZXJ0eUxFbnRpdHlBdHRyaWJ1dGVDcm9zc1JlZmVyZW5jZV82XzFfMCgpKTsKKwkJCQkJfQorCQkJCSkKKwkJCSkKKwkJKT8KKwkJKAorCQkJb3RoZXJsdl8xMT0nZXhwcmVzc2lvbicKIAkJCXsKLQkJCQluZXdMZWFmTm9kZShvdGhlcmx2XzksIGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YUludGVyY2hhbmdlQmVhbkFjY2VzcygpLmdldEV4cHJlc3Npb25LZXl3b3JkXzZfMCgpKTsKKwkJCQluZXdMZWFmTm9kZShvdGhlcmx2XzExLCBncmFtbWFyQWNjZXNzLmdldERhdGFJbnRlcmNoYW5nZUJlYW5BY2Nlc3MoKS5nZXRFeHByZXNzaW9uS2V5d29yZF83XzAoKSk7CiAJCQl9Ci0JCQlvdGhlcmx2XzEwPSd7JworCQkJb3RoZXJsdl8xMj0neycKIAkJCXsKLQkJCQluZXdMZWFmTm9kZShvdGhlcmx2XzEwLCBncmFtbWFyQWNjZXNzLmdldERhdGFJbnRlcmNoYW5nZUJlYW5BY2Nlc3MoKS5nZXRMZWZ0Q3VybHlCcmFja2V0S2V5d29yZF82XzEoKSk7CisJCQkJbmV3TGVhZk5vZGUob3RoZXJsdl8xMiwgZ3JhbW1hckFjY2Vzcy5nZXREYXRhSW50ZXJjaGFuZ2VCZWFuQWNjZXNzKCkuZ2V0TGVmdEN1cmx5QnJhY2tldEtleXdvcmRfN18xKCkpOwogCQkJfQogCQkJKAogCQkJCSgKIAkJCQkJewotCQkJCQkJbmV3Q29tcG9zaXRlTm9kZShncmFtbWFyQWNjZXNzLmdldERhdGFJbnRlcmNoYW5nZUJlYW5BY2Nlc3MoKS5nZXRFeHByZXNzaW9uRGF0YUludGVyY2hhbmdlRXhwcmVzc2lvblBhcnNlclJ1bGVDYWxsXzZfMl8wKCkpOworCQkJCQkJbmV3Q29tcG9zaXRlTm9kZShncmFtbWFyQWNjZXNzLmdldERhdGFJbnRlcmNoYW5nZUJlYW5BY2Nlc3MoKS5nZXRFeHByZXNzaW9uRGF0YUludGVyY2hhbmdlRXhwcmVzc2lvblBhcnNlclJ1bGVDYWxsXzdfMl8wKCkpOwogCQkJCQl9Ci0JCQkJCWx2X2V4cHJlc3Npb25fMTFfMD1ydWxlRGF0YUludGVyY2hhbmdlRXhwcmVzc2lvbgorCQkJCQlsdl9leHByZXNzaW9uXzEzXzA9cnVsZURhdGFJbnRlcmNoYW5nZUV4cHJlc3Npb24KIAkJCQkJewogCQkJCQkJaWYgKCRjdXJyZW50PT1udWxsKSB7CiAJCQkJCQkJJGN1cnJlbnQgPSBjcmVhdGVNb2RlbEVsZW1lbnRGb3JQYXJlbnQoZ3JhbW1hckFjY2Vzcy5nZXREYXRhSW50ZXJjaGFuZ2VCZWFuUnVsZSgpKTsKQEAgLTEyMDMsMzIgKzEyNDYsMzIgQEAKIAkJCQkJCWFkZCgKIAkJCQkJCQkkY3VycmVudCwKIAkJCQkJCQkiZXhwcmVzc2lvbiIsCi0JCQkJCQkJbHZfZXhwcmVzc2lvbl8xMV8wLAorCQkJCQkJCWx2X2V4cHJlc3Npb25fMTNfMCwKIAkJCQkJCQkib3JnLmVjbGlwc2Uub3NicC54dGV4dC5kYXRhaW50ZXJjaGFuZ2UuRGF0YURTTC5EYXRhSW50ZXJjaGFuZ2VFeHByZXNzaW9uIik7CiAJCQkJCQlhZnRlclBhcnNlck9yRW51bVJ1bGVDYWxsKCk7CiAJCQkJCX0KIAkJCQkpCiAJCQkpKgotCQkJb3RoZXJsdl8xMj0nfScKKwkJCW90aGVybHZfMTQ9J30nCiAJCQl7Ci0JCQkJbmV3TGVhZk5vZGUob3RoZXJsdl8xMiwgZ3JhbW1hckFjY2Vzcy5nZXREYXRhSW50ZXJjaGFuZ2VCZWFuQWNjZXNzKCkuZ2V0UmlnaHRDdXJseUJyYWNrZXRLZXl3b3JkXzZfMygpKTsKKwkJCQluZXdMZWFmTm9kZShvdGhlcmx2XzE0LCBncmFtbWFyQWNjZXNzLmdldERhdGFJbnRlcmNoYW5nZUJlYW5BY2Nlc3MoKS5nZXRSaWdodEN1cmx5QnJhY2tldEtleXdvcmRfN18zKCkpOwogCQkJfQogCQkpPwogCQkoCi0JCQlvdGhlcmx2XzEzPSdsb29rdXAnCisJCQlvdGhlcmx2XzE1PSdsb29rdXAnCiAJCQl7Ci0JCQkJbmV3TGVhZk5vZGUob3RoZXJsdl8xMywgZ3JhbW1hckFjY2Vzcy5nZXREYXRhSW50ZXJjaGFuZ2VCZWFuQWNjZXNzKCkuZ2V0TG9va3VwS2V5d29yZF83XzAoKSk7CisJCQkJbmV3TGVhZk5vZGUob3RoZXJsdl8xNSwgZ3JhbW1hckFjY2Vzcy5nZXREYXRhSW50ZXJjaGFuZ2VCZWFuQWNjZXNzKCkuZ2V0TG9va3VwS2V5d29yZF84XzAoKSk7CiAJCQl9Ci0JCQlvdGhlcmx2XzE0PSd7JworCQkJb3RoZXJsdl8xNj0neycKIAkJCXsKLQkJCQluZXdMZWFmTm9kZShvdGhlcmx2XzE0LCBncmFtbWFyQWNjZXNzLmdldERhdGFJbnRlcmNoYW5nZUJlYW5BY2Nlc3MoKS5nZXRMZWZ0Q3VybHlCcmFja2V0S2V5d29yZF83XzEoKSk7CisJCQkJbmV3TGVhZk5vZGUob3RoZXJsdl8xNiwgZ3JhbW1hckFjY2Vzcy5nZXREYXRhSW50ZXJjaGFuZ2VCZWFuQWNjZXNzKCkuZ2V0TGVmdEN1cmx5QnJhY2tldEtleXdvcmRfOF8xKCkpOwogCQkJfQogCQkJKAogCQkJCSgKIAkJCQkJewotCQkJCQkJbmV3Q29tcG9zaXRlTm9kZShncmFtbWFyQWNjZXNzLmdldERhdGFJbnRlcmNoYW5nZUJlYW5BY2Nlc3MoKS5nZXRMb29rdXBEYXRhSW50ZXJjaGFuZ2VMb29rdXBQYXJzZXJSdWxlQ2FsbF83XzJfMCgpKTsKKwkJCQkJCW5ld0NvbXBvc2l0ZU5vZGUoZ3JhbW1hckFjY2Vzcy5nZXREYXRhSW50ZXJjaGFuZ2VCZWFuQWNjZXNzKCkuZ2V0TG9va3VwRGF0YUludGVyY2hhbmdlTG9va3VwUGFyc2VyUnVsZUNhbGxfOF8yXzAoKSk7CiAJCQkJCX0KLQkJCQkJbHZfbG9va3VwXzE1XzA9cnVsZURhdGFJbnRlcmNoYW5nZUxvb2t1cAorCQkJCQlsdl9sb29rdXBfMTdfMD1ydWxlRGF0YUludGVyY2hhbmdlTG9va3VwCiAJCQkJCXsKIAkJCQkJCWlmICgkY3VycmVudD09bnVsbCkgewogCQkJCQkJCSRjdXJyZW50ID0gY3JlYXRlTW9kZWxFbGVtZW50Rm9yUGFyZW50KGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YUludGVyY2hhbmdlQmVhblJ1bGUoKSk7CkBAIC0xMjM2LDMyICsxMjc5LDMyIEBACiAJCQkJCQlhZGQoCiAJCQkJCQkJJGN1cnJlbnQsCiAJCQkJCQkJImxvb2t1cCIsCi0JCQkJCQkJbHZfbG9va3VwXzE1XzAsCisJCQkJCQkJbHZfbG9va3VwXzE3XzAsCiAJCQkJCQkJIm9yZy5lY2xpcHNlLm9zYnAueHRleHQuZGF0YWludGVyY2hhbmdlLkRhdGFEU0wuRGF0YUludGVyY2hhbmdlTG9va3VwIik7CiAJCQkJCQlhZnRlclBhcnNlck9yRW51bVJ1bGVDYWxsKCk7CiAJCQkJCX0KIAkJCQkpCiAJCQkpKgotCQkJb3RoZXJsdl8xNj0nfScKKwkJCW90aGVybHZfMTg9J30nCiAJCQl7Ci0JCQkJbmV3TGVhZk5vZGUob3RoZXJsdl8xNiwgZ3JhbW1hckFjY2Vzcy5nZXREYXRhSW50ZXJjaGFuZ2VCZWFuQWNjZXNzKCkuZ2V0UmlnaHRDdXJseUJyYWNrZXRLZXl3b3JkXzdfMygpKTsKKwkJCQluZXdMZWFmTm9kZShvdGhlcmx2XzE4LCBncmFtbWFyQWNjZXNzLmdldERhdGFJbnRlcmNoYW5nZUJlYW5BY2Nlc3MoKS5nZXRSaWdodEN1cmx5QnJhY2tldEtleXdvcmRfOF8zKCkpOwogCQkJfQogCQkpPwogCQkoCi0JCQlvdGhlcmx2XzE3PSdmb3JtYXQnCisJCQlvdGhlcmx2XzE5PSdmb3JtYXQnCiAJCQl7Ci0JCQkJbmV3TGVhZk5vZGUob3RoZXJsdl8xNywgZ3JhbW1hckFjY2Vzcy5nZXREYXRhSW50ZXJjaGFuZ2VCZWFuQWNjZXNzKCkuZ2V0Rm9ybWF0S2V5d29yZF84XzAoKSk7CisJCQkJbmV3TGVhZk5vZGUob3RoZXJsdl8xOSwgZ3JhbW1hckFjY2Vzcy5nZXREYXRhSW50ZXJjaGFuZ2VCZWFuQWNjZXNzKCkuZ2V0Rm9ybWF0S2V5d29yZF85XzAoKSk7CiAJCQl9Ci0JCQlvdGhlcmx2XzE4PSd7JworCQkJb3RoZXJsdl8yMD0neycKIAkJCXsKLQkJCQluZXdMZWFmTm9kZShvdGhlcmx2XzE4LCBncmFtbWFyQWNjZXNzLmdldERhdGFJbnRlcmNoYW5nZUJlYW5BY2Nlc3MoKS5nZXRMZWZ0Q3VybHlCcmFja2V0S2V5d29yZF84XzEoKSk7CisJCQkJbmV3TGVhZk5vZGUob3RoZXJsdl8yMCwgZ3JhbW1hckFjY2Vzcy5nZXREYXRhSW50ZXJjaGFuZ2VCZWFuQWNjZXNzKCkuZ2V0TGVmdEN1cmx5QnJhY2tldEtleXdvcmRfOV8xKCkpOwogCQkJfQogCQkJKAogCQkJCSgKIAkJCQkJewotCQkJCQkJbmV3Q29tcG9zaXRlTm9kZShncmFtbWFyQWNjZXNzLmdldERhdGFJbnRlcmNoYW5nZUJlYW5BY2Nlc3MoKS5nZXRGb3JtYXREYXRhSW50ZXJjaGFuZ2VGb3JtYXRQYXJzZXJSdWxlQ2FsbF84XzJfMCgpKTsKKwkJCQkJCW5ld0NvbXBvc2l0ZU5vZGUoZ3JhbW1hckFjY2Vzcy5nZXREYXRhSW50ZXJjaGFuZ2VCZWFuQWNjZXNzKCkuZ2V0Rm9ybWF0RGF0YUludGVyY2hhbmdlRm9ybWF0UGFyc2VyUnVsZUNhbGxfOV8yXzAoKSk7CiAJCQkJCX0KLQkJCQkJbHZfZm9ybWF0XzE5XzA9cnVsZURhdGFJbnRlcmNoYW5nZUZvcm1hdAorCQkJCQlsdl9mb3JtYXRfMjFfMD1ydWxlRGF0YUludGVyY2hhbmdlRm9ybWF0CiAJCQkJCXsKIAkJCQkJCWlmICgkY3VycmVudD09bnVsbCkgewogCQkJCQkJCSRjdXJyZW50ID0gY3JlYXRlTW9kZWxFbGVtZW50Rm9yUGFyZW50KGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YUludGVyY2hhbmdlQmVhblJ1bGUoKSk7CkBAIC0xMjY5LDMyICsxMzEyLDY1IEBACiAJCQkJCQlhZGQoCiAJCQkJCQkJJGN1cnJlbnQsCiAJCQkJCQkJImZvcm1hdCIsCi0JCQkJCQkJbHZfZm9ybWF0XzE5XzAsCisJCQkJCQkJbHZfZm9ybWF0XzIxXzAsCiAJCQkJCQkJIm9yZy5lY2xpcHNlLm9zYnAueHRleHQuZGF0YWludGVyY2hhbmdlLkRhdGFEU0wuRGF0YUludGVyY2hhbmdlRm9ybWF0Iik7CiAJCQkJCQlhZnRlclBhcnNlck9yRW51bVJ1bGVDYWxsKCk7CiAJCQkJCX0KIAkJCQkpCiAJCQkpKgotCQkJb3RoZXJsdl8yMD0nfScKKwkJCW90aGVybHZfMjI9J30nCiAJCQl7Ci0JCQkJbmV3TGVhZk5vZGUob3RoZXJsdl8yMCwgZ3JhbW1hckFjY2Vzcy5nZXREYXRhSW50ZXJjaGFuZ2VCZWFuQWNjZXNzKCkuZ2V0UmlnaHRDdXJseUJyYWNrZXRLZXl3b3JkXzhfMygpKTsKKwkJCQluZXdMZWFmTm9kZShvdGhlcmx2XzIyLCBncmFtbWFyQWNjZXNzLmdldERhdGFJbnRlcmNoYW5nZUJlYW5BY2Nlc3MoKS5nZXRSaWdodEN1cmx5QnJhY2tldEtleXdvcmRfOV8zKCkpOwogCQkJfQogCQkpPwogCQkoCi0JCQlvdGhlcmx2XzIxPSdtYXBwaW5nJworCQkJb3RoZXJsdl8yMz0nZXhwb3NlJwogCQkJewotCQkJCW5ld0xlYWZOb2RlKG90aGVybHZfMjEsIGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YUludGVyY2hhbmdlQmVhbkFjY2VzcygpLmdldE1hcHBpbmdLZXl3b3JkXzlfMCgpKTsKKwkJCQluZXdMZWFmTm9kZShvdGhlcmx2XzIzLCBncmFtbWFyQWNjZXNzLmdldERhdGFJbnRlcmNoYW5nZUJlYW5BY2Nlc3MoKS5nZXRFeHBvc2VLZXl3b3JkXzEwXzAoKSk7CiAJCQl9Ci0JCQlvdGhlcmx2XzIyPSd7JworCQkJb3RoZXJsdl8yND0neycKIAkJCXsKLQkJCQluZXdMZWFmTm9kZShvdGhlcmx2XzIyLCBncmFtbWFyQWNjZXNzLmdldERhdGFJbnRlcmNoYW5nZUJlYW5BY2Nlc3MoKS5nZXRMZWZ0Q3VybHlCcmFja2V0S2V5d29yZF85XzEoKSk7CisJCQkJbmV3TGVhZk5vZGUob3RoZXJsdl8yNCwgZ3JhbW1hckFjY2Vzcy5nZXREYXRhSW50ZXJjaGFuZ2VCZWFuQWNjZXNzKCkuZ2V0TGVmdEN1cmx5QnJhY2tldEtleXdvcmRfMTBfMSgpKTsKIAkJCX0KIAkJCSgKIAkJCQkoCiAJCQkJCXsKLQkJCQkJCW5ld0NvbXBvc2l0ZU5vZGUoZ3JhbW1hckFjY2Vzcy5nZXREYXRhSW50ZXJjaGFuZ2VCZWFuQWNjZXNzKCkuZ2V0TWFwcGluZ3NEYXRhSW50ZXJjaGFuZ2VNYXBwaW5nUGFyc2VyUnVsZUNhbGxfOV8yXzAoKSk7CisJCQkJCQluZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YUludGVyY2hhbmdlQmVhbkFjY2VzcygpLmdldEV4cG9ydEV4cG9zZXNEYXRhSW50ZXJjaGFuZ2VFeHBvc2VQYXJzZXJSdWxlQ2FsbF8xMF8yXzAoKSk7CiAJCQkJCX0KLQkJCQkJbHZfbWFwcGluZ3NfMjNfMD1ydWxlRGF0YUludGVyY2hhbmdlTWFwcGluZworCQkJCQlsdl9leHBvcnRFeHBvc2VzXzI1XzA9cnVsZURhdGFJbnRlcmNoYW5nZUV4cG9zZQorCQkJCQl7CisJCQkJCQlpZiAoJGN1cnJlbnQ9PW51bGwpIHsKKwkJCQkJCQkkY3VycmVudCA9IGNyZWF0ZU1vZGVsRWxlbWVudEZvclBhcmVudChncmFtbWFyQWNjZXNzLmdldERhdGFJbnRlcmNoYW5nZUJlYW5SdWxlKCkpOworCQkJCQkJfQorCQkJCQkJYWRkKAorCQkJCQkJCSRjdXJyZW50LAorCQkJCQkJCSJleHBvcnRFeHBvc2VzIiwKKwkJCQkJCQlsdl9leHBvcnRFeHBvc2VzXzI1XzAsCisJCQkJCQkJIm9yZy5lY2xpcHNlLm9zYnAueHRleHQuZGF0YWludGVyY2hhbmdlLkRhdGFEU0wuRGF0YUludGVyY2hhbmdlRXhwb3NlIik7CisJCQkJCQlhZnRlclBhcnNlck9yRW51bVJ1bGVDYWxsKCk7CisJCQkJCX0KKwkJCQkpCisJCQkpKgorCQkJb3RoZXJsdl8yNj0nfScKKwkJCXsKKwkJCQluZXdMZWFmTm9kZShvdGhlcmx2XzI2LCBncmFtbWFyQWNjZXNzLmdldERhdGFJbnRlcmNoYW5nZUJlYW5BY2Nlc3MoKS5nZXRSaWdodEN1cmx5QnJhY2tldEtleXdvcmRfMTBfMygpKTsKKwkJCX0KKwkJKT8KKwkJKAorCQkJb3RoZXJsdl8yNz0nbWFwcGluZycKKwkJCXsKKwkJCQluZXdMZWFmTm9kZShvdGhlcmx2XzI3LCBncmFtbWFyQWNjZXNzLmdldERhdGFJbnRlcmNoYW5nZUJlYW5BY2Nlc3MoKS5nZXRNYXBwaW5nS2V5d29yZF8xMV8wKCkpOworCQkJfQorCQkJb3RoZXJsdl8yOD0neycKKwkJCXsKKwkJCQluZXdMZWFmTm9kZShvdGhlcmx2XzI4LCBncmFtbWFyQWNjZXNzLmdldERhdGFJbnRlcmNoYW5nZUJlYW5BY2Nlc3MoKS5nZXRMZWZ0Q3VybHlCcmFja2V0S2V5d29yZF8xMV8xKCkpOworCQkJfQorCQkJKAorCQkJCSgKKwkJCQkJeworCQkJCQkJbmV3Q29tcG9zaXRlTm9kZShncmFtbWFyQWNjZXNzLmdldERhdGFJbnRlcmNoYW5nZUJlYW5BY2Nlc3MoKS5nZXRNYXBwaW5nc0RhdGFJbnRlcmNoYW5nZU1hcHBpbmdQYXJzZXJSdWxlQ2FsbF8xMV8yXzAoKSk7CisJCQkJCX0KKwkJCQkJbHZfbWFwcGluZ3NfMjlfMD1ydWxlRGF0YUludGVyY2hhbmdlTWFwcGluZwogCQkJCQl7CiAJCQkJCQlpZiAoJGN1cnJlbnQ9PW51bGwpIHsKIAkJCQkJCQkkY3VycmVudCA9IGNyZWF0ZU1vZGVsRWxlbWVudEZvclBhcmVudChncmFtbWFyQWNjZXNzLmdldERhdGFJbnRlcmNoYW5nZUJlYW5SdWxlKCkpOwpAQCAtMTMwMiwzMiArMTM3OCwzMiBAQAogCQkJCQkJYWRkKAogCQkJCQkJCSRjdXJyZW50LAogCQkJCQkJCSJtYXBwaW5ncyIsCi0JCQkJCQkJbHZfbWFwcGluZ3NfMjNfMCwKKwkJCQkJCQlsdl9tYXBwaW5nc18yOV8wLAogCQkJCQkJCSJvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmRhdGFpbnRlcmNoYW5nZS5EYXRhRFNMLkRhdGFJbnRlcmNoYW5nZU1hcHBpbmciKTsKIAkJCQkJCWFmdGVyUGFyc2VyT3JFbnVtUnVsZUNhbGwoKTsKIAkJCQkJfQogCQkJCSkKIAkJCSkqCi0JCQlvdGhlcmx2XzI0PSd9JworCQkJb3RoZXJsdl8zMD0nfScKIAkJCXsKLQkJCQluZXdMZWFmTm9kZShvdGhlcmx2XzI0LCBncmFtbWFyQWNjZXNzLmdldERhdGFJbnRlcmNoYW5nZUJlYW5BY2Nlc3MoKS5nZXRSaWdodEN1cmx5QnJhY2tldEtleXdvcmRfOV8zKCkpOworCQkJCW5ld0xlYWZOb2RlKG90aGVybHZfMzAsIGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YUludGVyY2hhbmdlQmVhbkFjY2VzcygpLmdldFJpZ2h0Q3VybHlCcmFja2V0S2V5d29yZF8xMV8zKCkpOwogCQkJfQogCQkpPwogCQkoCi0JCQlvdGhlcmx2XzI1PSdrZXlzJworCQkJb3RoZXJsdl8zMT0na2V5cycKIAkJCXsKLQkJCQluZXdMZWFmTm9kZShvdGhlcmx2XzI1LCBncmFtbWFyQWNjZXNzLmdldERhdGFJbnRlcmNoYW5nZUJlYW5BY2Nlc3MoKS5nZXRLZXlzS2V5d29yZF8xMF8wKCkpOworCQkJCW5ld0xlYWZOb2RlKG90aGVybHZfMzEsIGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YUludGVyY2hhbmdlQmVhbkFjY2VzcygpLmdldEtleXNLZXl3b3JkXzEyXzAoKSk7CiAJCQl9Ci0JCQlvdGhlcmx2XzI2PSd7JworCQkJb3RoZXJsdl8zMj0neycKIAkJCXsKLQkJCQluZXdMZWFmTm9kZShvdGhlcmx2XzI2LCBncmFtbWFyQWNjZXNzLmdldERhdGFJbnRlcmNoYW5nZUJlYW5BY2Nlc3MoKS5nZXRMZWZ0Q3VybHlCcmFja2V0S2V5d29yZF8xMF8xKCkpOworCQkJCW5ld0xlYWZOb2RlKG90aGVybHZfMzIsIGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YUludGVyY2hhbmdlQmVhbkFjY2VzcygpLmdldExlZnRDdXJseUJyYWNrZXRLZXl3b3JkXzEyXzEoKSk7CiAJCQl9CiAJCQkoCiAJCQkJKAogCQkJCQl7Ci0JCQkJCQluZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YUludGVyY2hhbmdlQmVhbkFjY2VzcygpLmdldExvb2t1cEtleXNEYXRhSW50ZXJjaGFuZ2VLZXlQYXJzZXJSdWxlQ2FsbF8xMF8yXzAoKSk7CisJCQkJCQluZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YUludGVyY2hhbmdlQmVhbkFjY2VzcygpLmdldExvb2t1cEtleXNEYXRhSW50ZXJjaGFuZ2VLZXlQYXJzZXJSdWxlQ2FsbF8xMl8yXzAoKSk7CiAJCQkJCX0KLQkJCQkJbHZfbG9va3VwS2V5c18yN18wPXJ1bGVEYXRhSW50ZXJjaGFuZ2VLZXkKKwkJCQkJbHZfbG9va3VwS2V5c18zM18wPXJ1bGVEYXRhSW50ZXJjaGFuZ2VLZXkKIAkJCQkJewogCQkJCQkJaWYgKCRjdXJyZW50PT1udWxsKSB7CiAJCQkJCQkJJGN1cnJlbnQgPSBjcmVhdGVNb2RlbEVsZW1lbnRGb3JQYXJlbnQoZ3JhbW1hckFjY2Vzcy5nZXREYXRhSW50ZXJjaGFuZ2VCZWFuUnVsZSgpKTsKQEAgLTEzMzUsMTUgKzE0MTEsNDggQEAKIAkJCQkJCWFkZCgKIAkJCQkJCQkkY3VycmVudCwKIAkJCQkJCQkibG9va3VwS2V5cyIsCi0JCQkJCQkJbHZfbG9va3VwS2V5c18yN18wLAorCQkJCQkJCWx2X2xvb2t1cEtleXNfMzNfMCwKIAkJCQkJCQkib3JnLmVjbGlwc2Uub3NicC54dGV4dC5kYXRhaW50ZXJjaGFuZ2UuRGF0YURTTC5EYXRhSW50ZXJjaGFuZ2VLZXkiKTsKIAkJCQkJCWFmdGVyUGFyc2VyT3JFbnVtUnVsZUNhbGwoKTsKIAkJCQkJfQogCQkJCSkKIAkJCSkqCi0JCQlvdGhlcmx2XzI4PSd9JworCQkJb3RoZXJsdl8zND0nfScKIAkJCXsKLQkJCQluZXdMZWFmTm9kZShvdGhlcmx2XzI4LCBncmFtbWFyQWNjZXNzLmdldERhdGFJbnRlcmNoYW5nZUJlYW5BY2Nlc3MoKS5nZXRSaWdodEN1cmx5QnJhY2tldEtleXdvcmRfMTBfMygpKTsKKwkJCQluZXdMZWFmTm9kZShvdGhlcmx2XzM0LCBncmFtbWFyQWNjZXNzLmdldERhdGFJbnRlcmNoYW5nZUJlYW5BY2Nlc3MoKS5nZXRSaWdodEN1cmx5QnJhY2tldEtleXdvcmRfMTJfMygpKTsKKwkJCX0KKwkJKT8KKwkJKAorCQkJb3RoZXJsdl8zNT0nZXhwb3J0RmlsdGVyJworCQkJeworCQkJCW5ld0xlYWZOb2RlKG90aGVybHZfMzUsIGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YUludGVyY2hhbmdlQmVhbkFjY2VzcygpLmdldEV4cG9ydEZpbHRlcktleXdvcmRfMTNfMCgpKTsKKwkJCX0KKwkJCW90aGVybHZfMzY9J3snCisJCQl7CisJCQkJbmV3TGVhZk5vZGUob3RoZXJsdl8zNiwgZ3JhbW1hckFjY2Vzcy5nZXREYXRhSW50ZXJjaGFuZ2VCZWFuQWNjZXNzKCkuZ2V0TGVmdEN1cmx5QnJhY2tldEtleXdvcmRfMTNfMSgpKTsKKwkJCX0KKwkJCSgKKwkJCQkoCisJCQkJCXsKKwkJCQkJCW5ld0NvbXBvc2l0ZU5vZGUoZ3JhbW1hckFjY2Vzcy5nZXREYXRhSW50ZXJjaGFuZ2VCZWFuQWNjZXNzKCkuZ2V0RXhwb3J0RmlsdGVyRGF0YUludGVyY2hhbmdlRXhwb3J0RmlsdGVyUGFyc2VyUnVsZUNhbGxfMTNfMl8wKCkpOworCQkJCQl9CisJCQkJCWx2X2V4cG9ydEZpbHRlcl8zN18wPXJ1bGVEYXRhSW50ZXJjaGFuZ2VFeHBvcnRGaWx0ZXIKKwkJCQkJeworCQkJCQkJaWYgKCRjdXJyZW50PT1udWxsKSB7CisJCQkJCQkJJGN1cnJlbnQgPSBjcmVhdGVNb2RlbEVsZW1lbnRGb3JQYXJlbnQoZ3JhbW1hckFjY2Vzcy5nZXREYXRhSW50ZXJjaGFuZ2VCZWFuUnVsZSgpKTsKKwkJCQkJCX0KKwkJCQkJCXNldCgKKwkJCQkJCQkkY3VycmVudCwKKwkJCQkJCQkiZXhwb3J0RmlsdGVyIiwKKwkJCQkJCQlsdl9leHBvcnRGaWx0ZXJfMzdfMCwKKwkJCQkJCQkib3JnLmVjbGlwc2Uub3NicC54dGV4dC5kYXRhaW50ZXJjaGFuZ2UuRGF0YURTTC5EYXRhSW50ZXJjaGFuZ2VFeHBvcnRGaWx0ZXIiKTsKKwkJCQkJCWFmdGVyUGFyc2VyT3JFbnVtUnVsZUNhbGwoKTsKKwkJCQkJfQorCQkJCSkKKwkJCSkKKwkJCW90aGVybHZfMzg9J30nCisJCQl7CisJCQkJbmV3TGVhZk5vZGUob3RoZXJsdl8zOCwgZ3JhbW1hckFjY2Vzcy5nZXREYXRhSW50ZXJjaGFuZ2VCZWFuQWNjZXNzKCkuZ2V0UmlnaHRDdXJseUJyYWNrZXRLZXl3b3JkXzEzXzMoKSk7CiAJCQl9CiAJCSk/CiAJKQpAQCAtMTk1Miw2ICsyMDYxLDMzNiBAQAogCSkKIDsKIAorLy8gRW50cnkgcnVsZSBlbnRyeVJ1bGVEYXRhSW50ZXJjaGFuZ2VFeHBvc2UKK2VudHJ5UnVsZURhdGFJbnRlcmNoYW5nZUV4cG9zZSByZXR1cm5zIFtFT2JqZWN0IGN1cnJlbnQ9bnVsbF06CisJeyBuZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YUludGVyY2hhbmdlRXhwb3NlUnVsZSgpKTsgfQorCWl2X3J1bGVEYXRhSW50ZXJjaGFuZ2VFeHBvc2U9cnVsZURhdGFJbnRlcmNoYW5nZUV4cG9zZQorCXsgJGN1cnJlbnQ9JGl2X3J1bGVEYXRhSW50ZXJjaGFuZ2VFeHBvc2UuY3VycmVudDsgfQorCUVPRjsKKworLy8gUnVsZSBEYXRhSW50ZXJjaGFuZ2VFeHBvc2UKK3J1bGVEYXRhSW50ZXJjaGFuZ2VFeHBvc2UgcmV0dXJucyBbRU9iamVjdCBjdXJyZW50PW51bGxdCitAaW5pdCB7CisJZW50ZXJSdWxlKCk7Cit9CitAYWZ0ZXIgeworCWxlYXZlUnVsZSgpOworfToKKwkoCisJCSgKKwkJCXsKKwkJCQkkY3VycmVudCA9IGZvcmNlQ3JlYXRlTW9kZWxFbGVtZW50KAorCQkJCQlncmFtbWFyQWNjZXNzLmdldERhdGFJbnRlcmNoYW5nZUV4cG9zZUFjY2VzcygpLmdldERhdGFJbnRlcmNoYW5nZUV4cG9zZUFjdGlvbl8wKCksCisJCQkJCSRjdXJyZW50KTsKKwkJCX0KKwkJKQorCQlvdGhlcmx2XzE9J3JlZicKKwkJeworCQkJbmV3TGVhZk5vZGUob3RoZXJsdl8xLCBncmFtbWFyQWNjZXNzLmdldERhdGFJbnRlcmNoYW5nZUV4cG9zZUFjY2VzcygpLmdldFJlZktleXdvcmRfMSgpKTsKKwkJfQorCQkoCisJCQkoCisJCQkJeworCQkJCQlpZiAoJGN1cnJlbnQ9PW51bGwpIHsKKwkJCQkJCSRjdXJyZW50ID0gY3JlYXRlTW9kZWxFbGVtZW50KGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YUludGVyY2hhbmdlRXhwb3NlUnVsZSgpKTsKKwkJCQkJfQorCQkJCX0KKwkJCQlvdGhlcmx2XzI9UlVMRV9JRAorCQkJCXsKKwkJCQkJbmV3TGVhZk5vZGUob3RoZXJsdl8yLCBncmFtbWFyQWNjZXNzLmdldERhdGFJbnRlcmNoYW5nZUV4cG9zZUFjY2VzcygpLmdldFJlZkVudGl0eUxFbnRpdHlSZWZlcmVuY2VDcm9zc1JlZmVyZW5jZV8yXzAoKSk7CisJCQkJfQorCQkJKQorCQkpCisJCSgKKwkJCSgKKwkJCQlvdGhlcmx2XzM9J29uJworCQkJCXsKKwkJCQkJbmV3TGVhZk5vZGUob3RoZXJsdl8zLCBncmFtbWFyQWNjZXNzLmdldERhdGFJbnRlcmNoYW5nZUV4cG9zZUFjY2VzcygpLmdldE9uS2V5d29yZF8zXzBfMCgpKTsKKwkJCQl9CisJCQkJKAorCQkJCQkoCisJCQkJCQl7CisJCQkJCQkJaWYgKCRjdXJyZW50PT1udWxsKSB7CisJCQkJCQkJCSRjdXJyZW50ID0gY3JlYXRlTW9kZWxFbGVtZW50KGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YUludGVyY2hhbmdlRXhwb3NlUnVsZSgpKTsKKwkJCQkJCQl9CisJCQkJCQl9CisJCQkJCQlvdGhlcmx2XzQ9UlVMRV9JRAorCQkJCQkJeworCQkJCQkJCW5ld0xlYWZOb2RlKG90aGVybHZfNCwgZ3JhbW1hckFjY2Vzcy5nZXREYXRhSW50ZXJjaGFuZ2VFeHBvc2VBY2Nlc3MoKS5nZXRSZWZQcm9wZXJ0eUxFbnRpdHlBdHRyaWJ1dGVDcm9zc1JlZmVyZW5jZV8zXzBfMV8wKCkpOworCQkJCQkJfQorCQkJCQkpCisJCQkJKQorCQkJKQorCQkJICAgIHwKKwkJCSgKKwkJCQlvdGhlcmx2XzU9J2V4cG9zZScKKwkJCQl7CisJCQkJCW5ld0xlYWZOb2RlKG90aGVybHZfNSwgZ3JhbW1hckFjY2Vzcy5nZXREYXRhSW50ZXJjaGFuZ2VFeHBvc2VBY2Nlc3MoKS5nZXRFeHBvc2VLZXl3b3JkXzNfMV8wKCkpOworCQkJCX0KKwkJCQlvdGhlcmx2XzY9J3snCisJCQkJeworCQkJCQluZXdMZWFmTm9kZShvdGhlcmx2XzYsIGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YUludGVyY2hhbmdlRXhwb3NlQWNjZXNzKCkuZ2V0TGVmdEN1cmx5QnJhY2tldEtleXdvcmRfM18xXzEoKSk7CisJCQkJfQorCQkJCSgKKwkJCQkJKAorCQkJCQkJeworCQkJCQkJCW5ld0NvbXBvc2l0ZU5vZGUoZ3JhbW1hckFjY2Vzcy5nZXREYXRhSW50ZXJjaGFuZ2VFeHBvc2VBY2Nlc3MoKS5nZXRTdWJFeHBvc2VEYXRhSW50ZXJjaGFuZ2VFeHBvc2VQYXJzZXJSdWxlQ2FsbF8zXzFfMl8wKCkpOworCQkJCQkJfQorCQkJCQkJbHZfc3ViRXhwb3NlXzdfMD1ydWxlRGF0YUludGVyY2hhbmdlRXhwb3NlCisJCQkJCQl7CisJCQkJCQkJaWYgKCRjdXJyZW50PT1udWxsKSB7CisJCQkJCQkJCSRjdXJyZW50ID0gY3JlYXRlTW9kZWxFbGVtZW50Rm9yUGFyZW50KGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YUludGVyY2hhbmdlRXhwb3NlUnVsZSgpKTsKKwkJCQkJCQl9CisJCQkJCQkJc2V0KAorCQkJCQkJCQkkY3VycmVudCwKKwkJCQkJCQkJInN1YkV4cG9zZSIsCisJCQkJCQkJCWx2X3N1YkV4cG9zZV83XzAsCisJCQkJCQkJCSJvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmRhdGFpbnRlcmNoYW5nZS5EYXRhRFNMLkRhdGFJbnRlcmNoYW5nZUV4cG9zZSIpOworCQkJCQkJCWFmdGVyUGFyc2VyT3JFbnVtUnVsZUNhbGwoKTsKKwkJCQkJCX0KKwkJCQkJKQorCQkJCSkKKwkJCQlvdGhlcmx2Xzg9J30nCisJCQkJeworCQkJCQluZXdMZWFmTm9kZShvdGhlcmx2XzgsIGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YUludGVyY2hhbmdlRXhwb3NlQWNjZXNzKCkuZ2V0UmlnaHRDdXJseUJyYWNrZXRLZXl3b3JkXzNfMV8zKCkpOworCQkJCX0KKwkJCSkKKwkJKQorCSkKKzsKKworLy8gRW50cnkgcnVsZSBlbnRyeVJ1bGVEYXRhSW50ZXJjaGFuZ2VFeHBvcnRGaWx0ZXIKK2VudHJ5UnVsZURhdGFJbnRlcmNoYW5nZUV4cG9ydEZpbHRlciByZXR1cm5zIFtFT2JqZWN0IGN1cnJlbnQ9bnVsbF06CisJeyBuZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YUludGVyY2hhbmdlRXhwb3J0RmlsdGVyUnVsZSgpKTsgfQorCWl2X3J1bGVEYXRhSW50ZXJjaGFuZ2VFeHBvcnRGaWx0ZXI9cnVsZURhdGFJbnRlcmNoYW5nZUV4cG9ydEZpbHRlcgorCXsgJGN1cnJlbnQ9JGl2X3J1bGVEYXRhSW50ZXJjaGFuZ2VFeHBvcnRGaWx0ZXIuY3VycmVudDsgfQorCUVPRjsKKworLy8gUnVsZSBEYXRhSW50ZXJjaGFuZ2VFeHBvcnRGaWx0ZXIKK3J1bGVEYXRhSW50ZXJjaGFuZ2VFeHBvcnRGaWx0ZXIgcmV0dXJucyBbRU9iamVjdCBjdXJyZW50PW51bGxdCitAaW5pdCB7CisJZW50ZXJSdWxlKCk7Cit9CitAYWZ0ZXIgeworCWxlYXZlUnVsZSgpOworfToKKwkoCisJCSgKKwkJCXsKKwkJCQkkY3VycmVudCA9IGZvcmNlQ3JlYXRlTW9kZWxFbGVtZW50KAorCQkJCQlncmFtbWFyQWNjZXNzLmdldERhdGFJbnRlcmNoYW5nZUV4cG9ydEZpbHRlckFjY2VzcygpLmdldERhdGFJbnRlcmNoYW5nZUV4cG9ydEZpbHRlckFjdGlvbl8wKCksCisJCQkJCSRjdXJyZW50KTsKKwkJCX0KKwkJKQorCQkoCisJCQlvdGhlcmx2XzE9J3doZXJlJworCQkJeworCQkJCW5ld0xlYWZOb2RlKG90aGVybHZfMSwgZ3JhbW1hckFjY2Vzcy5nZXREYXRhSW50ZXJjaGFuZ2VFeHBvcnRGaWx0ZXJBY2Nlc3MoKS5nZXRXaGVyZUtleXdvcmRfMV8wKCkpOworCQkJfQorCQkJb3RoZXJsdl8yPSd7JworCQkJeworCQkJCW5ld0xlYWZOb2RlKG90aGVybHZfMiwgZ3JhbW1hckFjY2Vzcy5nZXREYXRhSW50ZXJjaGFuZ2VFeHBvcnRGaWx0ZXJBY2Nlc3MoKS5nZXRMZWZ0Q3VybHlCcmFja2V0S2V5d29yZF8xXzEoKSk7CisJCQl9CisJCQkoCisJCQkJKAorCQkJCQl7CisJCQkJCQluZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YUludGVyY2hhbmdlRXhwb3J0RmlsdGVyQWNjZXNzKCkuZ2V0Q29uZGl0aW9uRGF0YUludGVyY2hhbmdlRmlsdGVyQ29uZGl0aW9uUGFyc2VyUnVsZUNhbGxfMV8yXzAoKSk7CisJCQkJCX0KKwkJCQkJbHZfY29uZGl0aW9uXzNfMD1ydWxlRGF0YUludGVyY2hhbmdlRmlsdGVyQ29uZGl0aW9uCisJCQkJCXsKKwkJCQkJCWlmICgkY3VycmVudD09bnVsbCkgeworCQkJCQkJCSRjdXJyZW50ID0gY3JlYXRlTW9kZWxFbGVtZW50Rm9yUGFyZW50KGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YUludGVyY2hhbmdlRXhwb3J0RmlsdGVyUnVsZSgpKTsKKwkJCQkJCX0KKwkJCQkJCXNldCgKKwkJCQkJCQkkY3VycmVudCwKKwkJCQkJCQkiY29uZGl0aW9uIiwKKwkJCQkJCQlsdl9jb25kaXRpb25fM18wLAorCQkJCQkJCSJvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmRhdGFpbnRlcmNoYW5nZS5EYXRhRFNMLkRhdGFJbnRlcmNoYW5nZUZpbHRlckNvbmRpdGlvbiIpOworCQkJCQkJYWZ0ZXJQYXJzZXJPckVudW1SdWxlQ2FsbCgpOworCQkJCQl9CisJCQkJKQorCQkJKQorCQkJb3RoZXJsdl80PSd9JworCQkJeworCQkJCW5ld0xlYWZOb2RlKG90aGVybHZfNCwgZ3JhbW1hckFjY2Vzcy5nZXREYXRhSW50ZXJjaGFuZ2VFeHBvcnRGaWx0ZXJBY2Nlc3MoKS5nZXRSaWdodEN1cmx5QnJhY2tldEtleXdvcmRfMV8zKCkpOworCQkJfQorCQkpPworCQkoCisJCQlvdGhlcmx2XzU9J2hpZGUnCisJCQl7CisJCQkJbmV3TGVhZk5vZGUob3RoZXJsdl81LCBncmFtbWFyQWNjZXNzLmdldERhdGFJbnRlcmNoYW5nZUV4cG9ydEZpbHRlckFjY2VzcygpLmdldEhpZGVLZXl3b3JkXzJfMCgpKTsKKwkJCX0KKwkJCSgKKwkJCQkoCisJCQkJCXsKKwkJCQkJCW5ld0NvbXBvc2l0ZU5vZGUoZ3JhbW1hckFjY2Vzcy5nZXREYXRhSW50ZXJjaGFuZ2VFeHBvcnRGaWx0ZXJBY2Nlc3MoKS5nZXRIaWRkZW5wcm9wZXJ0aWVzRGF0YUludGVyY2hhbmdlRXhwb3J0SGlkZVBhcnNlclJ1bGVDYWxsXzJfMV8wKCkpOworCQkJCQl9CisJCQkJCWx2X2hpZGRlbnByb3BlcnRpZXNfNl8wPXJ1bGVEYXRhSW50ZXJjaGFuZ2VFeHBvcnRIaWRlCisJCQkJCXsKKwkJCQkJCWlmICgkY3VycmVudD09bnVsbCkgeworCQkJCQkJCSRjdXJyZW50ID0gY3JlYXRlTW9kZWxFbGVtZW50Rm9yUGFyZW50KGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YUludGVyY2hhbmdlRXhwb3J0RmlsdGVyUnVsZSgpKTsKKwkJCQkJCX0KKwkJCQkJCWFkZCgKKwkJCQkJCQkkY3VycmVudCwKKwkJCQkJCQkiaGlkZGVucHJvcGVydGllcyIsCisJCQkJCQkJbHZfaGlkZGVucHJvcGVydGllc182XzAsCisJCQkJCQkJIm9yZy5lY2xpcHNlLm9zYnAueHRleHQuZGF0YWludGVyY2hhbmdlLkRhdGFEU0wuRGF0YUludGVyY2hhbmdlRXhwb3J0SGlkZSIpOworCQkJCQkJYWZ0ZXJQYXJzZXJPckVudW1SdWxlQ2FsbCgpOworCQkJCQl9CisJCQkJKQorCQkJKSoKKwkJKT8KKwkpCis7CisKKy8vIEVudHJ5IHJ1bGUgZW50cnlSdWxlRGF0YUludGVyY2hhbmdlRmlsdGVyQ29uZGl0aW9uCitlbnRyeVJ1bGVEYXRhSW50ZXJjaGFuZ2VGaWx0ZXJDb25kaXRpb24gcmV0dXJucyBbRU9iamVjdCBjdXJyZW50PW51bGxdOgorCXsgbmV3Q29tcG9zaXRlTm9kZShncmFtbWFyQWNjZXNzLmdldERhdGFJbnRlcmNoYW5nZUZpbHRlckNvbmRpdGlvblJ1bGUoKSk7IH0KKwlpdl9ydWxlRGF0YUludGVyY2hhbmdlRmlsdGVyQ29uZGl0aW9uPXJ1bGVEYXRhSW50ZXJjaGFuZ2VGaWx0ZXJDb25kaXRpb24KKwl7ICRjdXJyZW50PSRpdl9ydWxlRGF0YUludGVyY2hhbmdlRmlsdGVyQ29uZGl0aW9uLmN1cnJlbnQ7IH0KKwlFT0Y7CisKKy8vIFJ1bGUgRGF0YUludGVyY2hhbmdlRmlsdGVyQ29uZGl0aW9uCitydWxlRGF0YUludGVyY2hhbmdlRmlsdGVyQ29uZGl0aW9uIHJldHVybnMgW0VPYmplY3QgY3VycmVudD1udWxsXQorQGluaXQgeworCWVudGVyUnVsZSgpOworfQorQGFmdGVyIHsKKwlsZWF2ZVJ1bGUoKTsKK306CisJKAorCQkoCisJCQkoCisJCQkJeworCQkJCQlpZiAoJGN1cnJlbnQ9PW51bGwpIHsKKwkJCQkJCSRjdXJyZW50ID0gY3JlYXRlTW9kZWxFbGVtZW50KGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YUludGVyY2hhbmdlRmlsdGVyQ29uZGl0aW9uUnVsZSgpKTsKKwkJCQkJfQorCQkJCX0KKwkJCQlvdGhlcmx2XzA9UlVMRV9JRAorCQkJCXsKKwkJCQkJbmV3TGVhZk5vZGUob3RoZXJsdl8wLCBncmFtbWFyQWNjZXNzLmdldERhdGFJbnRlcmNoYW5nZUZpbHRlckNvbmRpdGlvbkFjY2VzcygpLmdldFJlZlByb3BlcnR5TEVudGl0eUZlYXR1cmVDcm9zc1JlZmVyZW5jZV8wXzAoKSk7CisJCQkJfQorCQkJKQorCQkpCisJCSgKKwkJCSgKKwkJCQl7CisJCQkJCW5ld0NvbXBvc2l0ZU5vZGUoZ3JhbW1hckFjY2Vzcy5nZXREYXRhSW50ZXJjaGFuZ2VGaWx0ZXJDb25kaXRpb25BY2Nlc3MoKS5nZXRPcGVyYXRvckNvbmRpdGlvbkFuZE9wZXJhdG9yMUVudW1SdWxlQ2FsbF8xXzAoKSk7CisJCQkJfQorCQkJCWx2X29wZXJhdG9yXzFfMD1ydWxlQ29uZGl0aW9uQW5kT3BlcmF0b3IxCisJCQkJeworCQkJCQlpZiAoJGN1cnJlbnQ9PW51bGwpIHsKKwkJCQkJCSRjdXJyZW50ID0gY3JlYXRlTW9kZWxFbGVtZW50Rm9yUGFyZW50KGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YUludGVyY2hhbmdlRmlsdGVyQ29uZGl0aW9uUnVsZSgpKTsKKwkJCQkJfQorCQkJCQlzZXQoCisJCQkJCQkkY3VycmVudCwKKwkJCQkJCSJvcGVyYXRvciIsCisJCQkJCQlsdl9vcGVyYXRvcl8xXzAsCisJCQkJCQkib3JnLmVjbGlwc2Uub3NicC54dGV4dC5kYXRhaW50ZXJjaGFuZ2UuRGF0YURTTC5Db25kaXRpb25BbmRPcGVyYXRvcjEiKTsKKwkJCQkJYWZ0ZXJQYXJzZXJPckVudW1SdWxlQ2FsbCgpOworCQkJCX0KKwkJCSkKKwkJKQorCQkoCisJCQkoCisJCQkJbHZfdmFsdWVfMl8wPVJVTEVfU1RSSU5HCisJCQkJeworCQkJCQluZXdMZWFmTm9kZShsdl92YWx1ZV8yXzAsIGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YUludGVyY2hhbmdlRmlsdGVyQ29uZGl0aW9uQWNjZXNzKCkuZ2V0VmFsdWVTVFJJTkdUZXJtaW5hbFJ1bGVDYWxsXzJfMCgpKTsKKwkJCQl9CisJCQkJeworCQkJCQlpZiAoJGN1cnJlbnQ9PW51bGwpIHsKKwkJCQkJCSRjdXJyZW50ID0gY3JlYXRlTW9kZWxFbGVtZW50KGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YUludGVyY2hhbmdlRmlsdGVyQ29uZGl0aW9uUnVsZSgpKTsKKwkJCQkJfQorCQkJCQlzZXRXaXRoTGFzdENvbnN1bWVkKAorCQkJCQkJJGN1cnJlbnQsCisJCQkJCQkidmFsdWUiLAorCQkJCQkJbHZfdmFsdWVfMl8wLAorCQkJCQkJIm9yZy5lY2xpcHNlLnh0ZXh0LnhiYXNlLlh0eXBlLlNUUklORyIpOworCQkJCX0KKwkJCSkKKwkJKT8KKwkJKAorCQkJKAorCQkJCSgKKwkJCQkJeworCQkJCQkJbmV3Q29tcG9zaXRlTm9kZShncmFtbWFyQWNjZXNzLmdldERhdGFJbnRlcmNoYW5nZUZpbHRlckNvbmRpdGlvbkFjY2VzcygpLmdldE9wZXJhdG9yMkNvbmRpdGlvbkFuZE9wZXJhdG9yMkVudW1SdWxlQ2FsbF8zXzBfMCgpKTsKKwkJCQkJfQorCQkJCQlsdl9vcGVyYXRvcjJfM18wPXJ1bGVDb25kaXRpb25BbmRPcGVyYXRvcjIKKwkJCQkJeworCQkJCQkJaWYgKCRjdXJyZW50PT1udWxsKSB7CisJCQkJCQkJJGN1cnJlbnQgPSBjcmVhdGVNb2RlbEVsZW1lbnRGb3JQYXJlbnQoZ3JhbW1hckFjY2Vzcy5nZXREYXRhSW50ZXJjaGFuZ2VGaWx0ZXJDb25kaXRpb25SdWxlKCkpOworCQkJCQkJfQorCQkJCQkJc2V0KAorCQkJCQkJCSRjdXJyZW50LAorCQkJCQkJCSJvcGVyYXRvcjIiLAorCQkJCQkJCWx2X29wZXJhdG9yMl8zXzAsCisJCQkJCQkJIm9yZy5lY2xpcHNlLm9zYnAueHRleHQuZGF0YWludGVyY2hhbmdlLkRhdGFEU0wuQ29uZGl0aW9uQW5kT3BlcmF0b3IyIik7CisJCQkJCQlhZnRlclBhcnNlck9yRW51bVJ1bGVDYWxsKCk7CisJCQkJCX0KKwkJCQkpCisJCQkpCisJCQkoCisJCQkJKAorCQkJCQl7CisJCQkJCQluZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YUludGVyY2hhbmdlRmlsdGVyQ29uZGl0aW9uQWNjZXNzKCkuZ2V0U3ViY29uZGl0aW9uRGF0YUludGVyY2hhbmdlRmlsdGVyQ29uZGl0aW9uUGFyc2VyUnVsZUNhbGxfM18xXzAoKSk7CisJCQkJCX0KKwkJCQkJbHZfc3ViY29uZGl0aW9uXzRfMD1ydWxlRGF0YUludGVyY2hhbmdlRmlsdGVyQ29uZGl0aW9uCisJCQkJCXsKKwkJCQkJCWlmICgkY3VycmVudD09bnVsbCkgeworCQkJCQkJCSRjdXJyZW50ID0gY3JlYXRlTW9kZWxFbGVtZW50Rm9yUGFyZW50KGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YUludGVyY2hhbmdlRmlsdGVyQ29uZGl0aW9uUnVsZSgpKTsKKwkJCQkJCX0KKwkJCQkJCXNldCgKKwkJCQkJCQkkY3VycmVudCwKKwkJCQkJCQkic3ViY29uZGl0aW9uIiwKKwkJCQkJCQlsdl9zdWJjb25kaXRpb25fNF8wLAorCQkJCQkJCSJvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmRhdGFpbnRlcmNoYW5nZS5EYXRhRFNMLkRhdGFJbnRlcmNoYW5nZUZpbHRlckNvbmRpdGlvbiIpOworCQkJCQkJYWZ0ZXJQYXJzZXJPckVudW1SdWxlQ2FsbCgpOworCQkJCQl9CisJCQkJKQorCQkJKQorCQkpPworCSkKKzsKKworLy8gRW50cnkgcnVsZSBlbnRyeVJ1bGVEYXRhSW50ZXJjaGFuZ2VFeHBvcnRIaWRlCitlbnRyeVJ1bGVEYXRhSW50ZXJjaGFuZ2VFeHBvcnRIaWRlIHJldHVybnMgW0VPYmplY3QgY3VycmVudD1udWxsXToKKwl7IG5ld0NvbXBvc2l0ZU5vZGUoZ3JhbW1hckFjY2Vzcy5nZXREYXRhSW50ZXJjaGFuZ2VFeHBvcnRIaWRlUnVsZSgpKTsgfQorCWl2X3J1bGVEYXRhSW50ZXJjaGFuZ2VFeHBvcnRIaWRlPXJ1bGVEYXRhSW50ZXJjaGFuZ2VFeHBvcnRIaWRlCisJeyAkY3VycmVudD0kaXZfcnVsZURhdGFJbnRlcmNoYW5nZUV4cG9ydEhpZGUuY3VycmVudDsgfQorCUVPRjsKKworLy8gUnVsZSBEYXRhSW50ZXJjaGFuZ2VFeHBvcnRIaWRlCitydWxlRGF0YUludGVyY2hhbmdlRXhwb3J0SGlkZSByZXR1cm5zIFtFT2JqZWN0IGN1cnJlbnQ9bnVsbF0KK0Bpbml0IHsKKwllbnRlclJ1bGUoKTsKK30KK0BhZnRlciB7CisJbGVhdmVSdWxlKCk7Cit9OgorCSgKKwkJKAorCQkJeworCQkJCSRjdXJyZW50ID0gZm9yY2VDcmVhdGVNb2RlbEVsZW1lbnQoCisJCQkJCWdyYW1tYXJBY2Nlc3MuZ2V0RGF0YUludGVyY2hhbmdlRXhwb3J0SGlkZUFjY2VzcygpLmdldERhdGFJbnRlcmNoYW5nZUV4cG9ydEhpZGVBY3Rpb25fMCgpLAorCQkJCQkkY3VycmVudCk7CisJCQl9CisJCSkKKwkJKAorCQkJKAorCQkJCXsKKwkJCQkJaWYgKCRjdXJyZW50PT1udWxsKSB7CisJCQkJCQkkY3VycmVudCA9IGNyZWF0ZU1vZGVsRWxlbWVudChncmFtbWFyQWNjZXNzLmdldERhdGFJbnRlcmNoYW5nZUV4cG9ydEhpZGVSdWxlKCkpOworCQkJCQl9CisJCQkJfQorCQkJCW90aGVybHZfMT1SVUxFX0lECisJCQkJeworCQkJCQluZXdMZWFmTm9kZShvdGhlcmx2XzEsIGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YUludGVyY2hhbmdlRXhwb3J0SGlkZUFjY2VzcygpLmdldFByb3BlcnR5TEVudGl0eUZlYXR1cmVDcm9zc1JlZmVyZW5jZV8xXzAoKSk7CisJCQkJfQorCQkJKQorCQkpCisJKQorOworCiAvLyBFbnRyeSBydWxlIGVudHJ5UnVsZURhdGFJbnRlcmNoYW5nZVByZWRlZmluZWRFeHByZXNzaW9uCiBlbnRyeVJ1bGVEYXRhSW50ZXJjaGFuZ2VQcmVkZWZpbmVkRXhwcmVzc2lvbiByZXR1cm5zIFtFT2JqZWN0IGN1cnJlbnQ9bnVsbF06CiAJeyBuZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YUludGVyY2hhbmdlUHJlZGVmaW5lZEV4cHJlc3Npb25SdWxlKCkpOyB9CkBAIC05NDA3LDYgKzk4NDYsMTA4IEBACiAJKQogOwogCisvLyBSdWxlIENvbmRpdGlvbkFuZE9wZXJhdG9yMQorcnVsZUNvbmRpdGlvbkFuZE9wZXJhdG9yMSByZXR1cm5zIFtFbnVtZXJhdG9yIGN1cnJlbnQ9bnVsbF0KK0Bpbml0IHsKKwllbnRlclJ1bGUoKTsKK30KK0BhZnRlciB7CisJbGVhdmVSdWxlKCk7Cit9OgorCSgKKwkJKAorCQkJZW51bUxpdGVyYWxfMD0nPScKKwkJCXsKKwkJCQkkY3VycmVudCA9IGdyYW1tYXJBY2Nlc3MuZ2V0Q29uZGl0aW9uQW5kT3BlcmF0b3IxQWNjZXNzKCkuZ2V0RXF1YWxzRW51bUxpdGVyYWxEZWNsYXJhdGlvbl8wKCkuZ2V0RW51bUxpdGVyYWwoKS5nZXRJbnN0YW5jZSgpOworCQkJCW5ld0xlYWZOb2RlKGVudW1MaXRlcmFsXzAsIGdyYW1tYXJBY2Nlc3MuZ2V0Q29uZGl0aW9uQW5kT3BlcmF0b3IxQWNjZXNzKCkuZ2V0RXF1YWxzRW51bUxpdGVyYWxEZWNsYXJhdGlvbl8wKCkpOworCQkJfQorCQkpCisJCSAgICB8CisJCSgKKwkJCWVudW1MaXRlcmFsXzE9JyE9JworCQkJeworCQkJCSRjdXJyZW50ID0gZ3JhbW1hckFjY2Vzcy5nZXRDb25kaXRpb25BbmRPcGVyYXRvcjFBY2Nlc3MoKS5nZXROb3RlcXVhbHNFbnVtTGl0ZXJhbERlY2xhcmF0aW9uXzEoKS5nZXRFbnVtTGl0ZXJhbCgpLmdldEluc3RhbmNlKCk7CisJCQkJbmV3TGVhZk5vZGUoZW51bUxpdGVyYWxfMSwgZ3JhbW1hckFjY2Vzcy5nZXRDb25kaXRpb25BbmRPcGVyYXRvcjFBY2Nlc3MoKS5nZXROb3RlcXVhbHNFbnVtTGl0ZXJhbERlY2xhcmF0aW9uXzEoKSk7CisJCQl9CisJCSkKKwkJICAgIHwKKwkJKAorCQkJZW51bUxpdGVyYWxfMj0nPicKKwkJCXsKKwkJCQkkY3VycmVudCA9IGdyYW1tYXJBY2Nlc3MuZ2V0Q29uZGl0aW9uQW5kT3BlcmF0b3IxQWNjZXNzKCkuZ2V0R3JlYXRlcnRoZW5FbnVtTGl0ZXJhbERlY2xhcmF0aW9uXzIoKS5nZXRFbnVtTGl0ZXJhbCgpLmdldEluc3RhbmNlKCk7CisJCQkJbmV3TGVhZk5vZGUoZW51bUxpdGVyYWxfMiwgZ3JhbW1hckFjY2Vzcy5nZXRDb25kaXRpb25BbmRPcGVyYXRvcjFBY2Nlc3MoKS5nZXRHcmVhdGVydGhlbkVudW1MaXRlcmFsRGVjbGFyYXRpb25fMigpKTsKKwkJCX0KKwkJKQorCQkgICAgfAorCQkoCisJCQllbnVtTGl0ZXJhbF8zPSc+PScKKwkJCXsKKwkJCQkkY3VycmVudCA9IGdyYW1tYXJBY2Nlc3MuZ2V0Q29uZGl0aW9uQW5kT3BlcmF0b3IxQWNjZXNzKCkuZ2V0R3JlYXRlcnRoZW5vcmVxdWFsdG9FbnVtTGl0ZXJhbERlY2xhcmF0aW9uXzMoKS5nZXRFbnVtTGl0ZXJhbCgpLmdldEluc3RhbmNlKCk7CisJCQkJbmV3TGVhZk5vZGUoZW51bUxpdGVyYWxfMywgZ3JhbW1hckFjY2Vzcy5nZXRDb25kaXRpb25BbmRPcGVyYXRvcjFBY2Nlc3MoKS5nZXRHcmVhdGVydGhlbm9yZXF1YWx0b0VudW1MaXRlcmFsRGVjbGFyYXRpb25fMygpKTsKKwkJCX0KKwkJKQorCQkgICAgfAorCQkoCisJCQllbnVtTGl0ZXJhbF80PSc8JworCQkJeworCQkJCSRjdXJyZW50ID0gZ3JhbW1hckFjY2Vzcy5nZXRDb25kaXRpb25BbmRPcGVyYXRvcjFBY2Nlc3MoKS5nZXRMZXNzdGhlbkVudW1MaXRlcmFsRGVjbGFyYXRpb25fNCgpLmdldEVudW1MaXRlcmFsKCkuZ2V0SW5zdGFuY2UoKTsKKwkJCQluZXdMZWFmTm9kZShlbnVtTGl0ZXJhbF80LCBncmFtbWFyQWNjZXNzLmdldENvbmRpdGlvbkFuZE9wZXJhdG9yMUFjY2VzcygpLmdldExlc3N0aGVuRW51bUxpdGVyYWxEZWNsYXJhdGlvbl80KCkpOworCQkJfQorCQkpCisJCSAgICB8CisJCSgKKwkJCWVudW1MaXRlcmFsXzU9Jzw9JworCQkJeworCQkJCSRjdXJyZW50ID0gZ3JhbW1hckFjY2Vzcy5nZXRDb25kaXRpb25BbmRPcGVyYXRvcjFBY2Nlc3MoKS5nZXRMZXNzdGhlbm9yZXF1YWx0b0VudW1MaXRlcmFsRGVjbGFyYXRpb25fNSgpLmdldEVudW1MaXRlcmFsKCkuZ2V0SW5zdGFuY2UoKTsKKwkJCQluZXdMZWFmTm9kZShlbnVtTGl0ZXJhbF81LCBncmFtbWFyQWNjZXNzLmdldENvbmRpdGlvbkFuZE9wZXJhdG9yMUFjY2VzcygpLmdldExlc3N0aGVub3JlcXVhbHRvRW51bUxpdGVyYWxEZWNsYXJhdGlvbl81KCkpOworCQkJfQorCQkpCisJCSAgICB8CisJCSgKKwkJCWVudW1MaXRlcmFsXzY9J2lzbnVsbCcKKwkJCXsKKwkJCQkkY3VycmVudCA9IGdyYW1tYXJBY2Nlc3MuZ2V0Q29uZGl0aW9uQW5kT3BlcmF0b3IxQWNjZXNzKCkuZ2V0SXNudWxsRW51bUxpdGVyYWxEZWNsYXJhdGlvbl82KCkuZ2V0RW51bUxpdGVyYWwoKS5nZXRJbnN0YW5jZSgpOworCQkJCW5ld0xlYWZOb2RlKGVudW1MaXRlcmFsXzYsIGdyYW1tYXJBY2Nlc3MuZ2V0Q29uZGl0aW9uQW5kT3BlcmF0b3IxQWNjZXNzKCkuZ2V0SXNudWxsRW51bUxpdGVyYWxEZWNsYXJhdGlvbl82KCkpOworCQkJfQorCQkpCisJCSAgICB8CisJCSgKKwkJCWVudW1MaXRlcmFsXzc9J2lzbm90bnVsbCcKKwkJCXsKKwkJCQkkY3VycmVudCA9IGdyYW1tYXJBY2Nlc3MuZ2V0Q29uZGl0aW9uQW5kT3BlcmF0b3IxQWNjZXNzKCkuZ2V0SXNub3RudWxsRW51bUxpdGVyYWxEZWNsYXJhdGlvbl83KCkuZ2V0RW51bUxpdGVyYWwoKS5nZXRJbnN0YW5jZSgpOworCQkJCW5ld0xlYWZOb2RlKGVudW1MaXRlcmFsXzcsIGdyYW1tYXJBY2Nlc3MuZ2V0Q29uZGl0aW9uQW5kT3BlcmF0b3IxQWNjZXNzKCkuZ2V0SXNub3RudWxsRW51bUxpdGVyYWxEZWNsYXJhdGlvbl83KCkpOworCQkJfQorCQkpCisJKQorOworCisvLyBSdWxlIENvbmRpdGlvbkFuZE9wZXJhdG9yMgorcnVsZUNvbmRpdGlvbkFuZE9wZXJhdG9yMiByZXR1cm5zIFtFbnVtZXJhdG9yIGN1cnJlbnQ9bnVsbF0KK0Bpbml0IHsKKwllbnRlclJ1bGUoKTsKK30KK0BhZnRlciB7CisJbGVhdmVSdWxlKCk7Cit9OgorCSgKKwkJKAorCQkJZW51bUxpdGVyYWxfMD0nYW5kJworCQkJeworCQkJCSRjdXJyZW50ID0gZ3JhbW1hckFjY2Vzcy5nZXRDb25kaXRpb25BbmRPcGVyYXRvcjJBY2Nlc3MoKS5nZXRBbmRFbnVtTGl0ZXJhbERlY2xhcmF0aW9uXzAoKS5nZXRFbnVtTGl0ZXJhbCgpLmdldEluc3RhbmNlKCk7CisJCQkJbmV3TGVhZk5vZGUoZW51bUxpdGVyYWxfMCwgZ3JhbW1hckFjY2Vzcy5nZXRDb25kaXRpb25BbmRPcGVyYXRvcjJBY2Nlc3MoKS5nZXRBbmRFbnVtTGl0ZXJhbERlY2xhcmF0aW9uXzAoKSk7CisJCQl9CisJCSkKKwkJICAgIHwKKwkJKAorCQkJZW51bUxpdGVyYWxfMT0nb3InCisJCQl7CisJCQkJJGN1cnJlbnQgPSBncmFtbWFyQWNjZXNzLmdldENvbmRpdGlvbkFuZE9wZXJhdG9yMkFjY2VzcygpLmdldE9yRW51bUxpdGVyYWxEZWNsYXJhdGlvbl8xKCkuZ2V0RW51bUxpdGVyYWwoKS5nZXRJbnN0YW5jZSgpOworCQkJCW5ld0xlYWZOb2RlKGVudW1MaXRlcmFsXzEsIGdyYW1tYXJBY2Nlc3MuZ2V0Q29uZGl0aW9uQW5kT3BlcmF0b3IyQWNjZXNzKCkuZ2V0T3JFbnVtTGl0ZXJhbERlY2xhcmF0aW9uXzEoKSk7CisJCQl9CisJCSkKKwkpCis7CisKIFJVTEVfSEVYIDogKCcweCd8JzBYJykgKCcwJy4uJzknfCdhJy4uJ2YnfCdBJy4uJ0YnfCdfJykrICgnIycgKCgnYid8J0InKSAoJ2knfCdJJyl8KCdsJ3wnTCcpKSk/OwogCiBSVUxFX0lOVCA6ICcwJy4uJzknICgnMCcuLic5J3wnXycpKjsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLm9zYnAueHRleHQuZGF0YWludGVyY2hhbmdlL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9kYXRhaW50ZXJjaGFuZ2UvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsRGF0YURTTC50b2tlbnMgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmRhdGFpbnRlcmNoYW5nZS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvZGF0YWludGVyY2hhbmdlL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbERhdGFEU0wudG9rZW5zCmluZGV4IDZmMjQzODQuLjEyZjBhZmQgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLm9zYnAueHRleHQuZGF0YWludGVyY2hhbmdlL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9kYXRhaW50ZXJjaGFuZ2UvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsRGF0YURTTC50b2tlbnMKKysrIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5kYXRhaW50ZXJjaGFuZ2Uvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2RhdGFpbnRlcmNoYW5nZS9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxEYXRhRFNMLnRva2VucwpAQCAtMSwxNDQgKzEsMTU2IEBACi0nISc9MTA3Ci0nIT0nPTkyCi0nIT09Jz05NAotJyMnPTc4Ci0nJSc9MTA2Ci0nJT0nPTg1Ci0nJiYnPTkwCi0nJic9MTM3Ci0nKCc9NzQKLScpJz03NgotJyonPTcwCi0nKionPTEwNAotJyo9Jz04MwotJysnPTEwMgotJysrJz0xMDgKLScrPSc9ODEKLScsJz03NQotJy0nPTEwMwotJy0tJz0xMDkKLSctPSc9ODIKLSctPic9OTYKLScuJz02NwotJy4uJz05OAotJy4uPCc9OTcKLScvJz0xMDUKLScvPSc9ODQKLSc6Jz0xMTYKLSc6Oic9MTEwCi0nOyc9NzIKLSc8Jz04NgotJzw+Jz0xMDAKLSc9Jz03NwotJz09Jz05MQotJz09PSc9OTMKLSc9Pic9OTkKLSc+Jz04NwotJz49Jz04OAotJz8nPTEzNgotJz8uJz0xMTEKLSc/Oic9MTAxCi0nQCc9NzMKLSdDU1YnPTI4Ci0nRGF0ZSc9MTQ3Ci0nRURJJz0zMwotJ0V4ZWN1dGVDb250ZXh0Jz0xNTEKLSdNaWxsaXNlY29uZHMnPTE0OAotJ05hbm9zZWNvbmRzJz0xNDkKLSdOb3dEYXRlJz0xNDQKLSdSYW5kb20nPTE1MAotJ1N0YXJ0RGF0ZSc9MTQ1Ci0nVW5pdmVyc2FsbHlVbmlxdWVJZGVudGlmaWVyJz0xNDYKLSdYTUwnPTI0Ci0nWyc9NzkKLSddJz04MAotJ2FsbG93Tm9SZXN1bHQnPTUxCi0nYWxsb3dOb251bmlxdWVSZXN1bHQnPTUyCi0nYXMnPTYxCi0nYXNzaWduJz02MAotJ2NhY2hlU2l6ZSc9NDkKLSdjYXNlJz0xMTgKLSdjYXRjaCc9MTM1Ci0nY29kaW5nJz01NgotJ2NvcHknPTU3Ci0nY3JlYXRlT24nPTM4Ci0nZGVmYXVsdCc9MTE3Ci0nZGVsaW1pdGVyJz0yOQorJyEnPTExNAorJyE9Jz05OQorJyE9PSc9MTAxCisnIyc9ODUKKyclJz0xMTMKKyclPSc9OTIKKycmJic9OTcKKycmJz0xNDQKKycoJz04MQorJyknPTgzCisnKic9NzcKKycqKic9MTExCisnKj0nPTkwCisnKyc9MTA5CisnKysnPTExNQorJys9Jz04OAorJywnPTgyCisnLSc9MTEwCisnLS0nPTExNgorJy09Jz04OQorJy0+Jz0xMDMKKycuJz03NAorJy4uJz0xMDUKKycuLjwnPTEwNAorJy8nPTExMgorJy89Jz05MQorJzonPTEyMworJzo6Jz0xMTcKKyc7Jz03OQorJzwnPTkzCisnPD0nPTE2MgorJzw+Jz0xMDcKKyc9Jz04NAorJz09Jz05OAorJz09PSc9MTAwCisnPT4nPTEwNgorJz4nPTk0CisnPj0nPTk1CisnPyc9MTQzCisnPy4nPTExOAorJz86Jz0xMDgKKydAJz04MAorJ0NTVic9MjkKKydEYXRlJz0xNTQKKydFREknPTM0CisnRXhlY3V0ZUNvbnRleHQnPTE1OAorJ01pbGxpc2Vjb25kcyc9MTU1CisnTmFub3NlY29uZHMnPTE1NgorJ05vd0RhdGUnPTE1MQorJ1JhbmRvbSc9MTU3CisnU3RhcnREYXRlJz0xNTIKKydVbml2ZXJzYWxseVVuaXF1ZUlkZW50aWZpZXInPTE1MworJ1hNTCc9MjUKKydbJz04NgorJ10nPTg3CisnYWxsb3dOb1Jlc3VsdCc9NTUKKydhbGxvd05vbnVuaXF1ZVJlc3VsdCc9NTYKKydhbmQnPTE2NQorJ2FzJz02OAorJ2Fzc2lnbic9NjcKKydjYWNoZVNpemUnPTUzCisnY2FzZSc9MTI1CisnY2F0Y2gnPTE0MgorJ2NvZGluZyc9NjAKKydjb3B5Jz02MQorJ2NyZWF0ZU9uJz0zOQorJ2RlZmF1bHQnPTEyNAorJ2RlbGV0ZUZpbGVBZnRlckltcG9ydCc9MjIKKydkZWxpbWl0ZXInPTMwCiAnZGVzY3JpYmVkQnknPTE4Ci0nZG8nPTEyMAorJ2RvJz0xMjcKICdlbGVtZW50U2l6ZSc9MjEKLSdlbHNlJz0xMTQKLSdlbmNvZGluZyc9MjYKLSdlbnRpdHknPTM2Ci0nZXhwcmVzc2lvbic9NDAKLSdleHRlbmRzJz0xMjMKLSdleHRlbnNpb24nPTY1Ci0nZmFsc2UnPTEyNgotJ2ZpbGUnPTIyCi0nZmluYWxseSc9MTMzCi0nZm9yJz00NgotJ2Zvcm1hdCc9NDIKLSdmcm9tJz01OAotJ2lmJz0xMTMKLSdpbXBvcnQnPTY4Ci0naW5kZW50Jz0zMgotJ2luc3RhbmNlb2YnPTk1CisnZWxzZSc9MTIxCisnZW5jb2RpbmcnPTI3CisnZW50aXR5Jz0zNworJ2V4cG9ydEZpbHRlcic9NDgKKydleHBvc2UnPTQ1CisnZXhwcmVzc2lvbic9NDIKKydleHRlbmRzJz0xMzAKKydleHRlbnNpb24nPTcyCisnZmFsc2UnPTEzMworJ2ZpbGUnPTIzCisnZmluYWxseSc9MTQwCisnZm9yJz01MAorJ2Zvcm1hdCc9NDQKKydmcm9tJz02MgorJ2hpZGUnPTY2CisnaWYnPTEyMAorJ2ltcG9ydCc9NzUKKydpbmRlbnQnPTMzCisnaW5zdGFuY2VvZic9MTAyCiAnaW50ZXJjaGFuZ2UnPTE3Ci0nanBnJz0xMzkKLSdrZXknPTQ1Ci0na2V5cyc9NDQKLSdsb2NhbGUnPTI3Ci0nbG9va3VwJz00MQotJ21hcCc9NjIKLSdtYXBCbG9iJz02NAotJ21hcEJ5QXR0cmlidXRlJz0yNQotJ21hcFRvJz01MAotJ21hcHBpbmcnPTQzCi0nbWFwcGluZ01vZGVsJz0zNAotJ21hcmtlZEJ5Jz01NQotJ21hcmtlcic9MzkKLSdtYXJrZXJFbnRpdHknPTU0Ci0nbWFya2VyUGF0aCc9NTMKLSdtZXJnZSc9MTUzCi0nbWltZVR5cGUnPTY2Ci0nbXBlZyc9MTQxCi0nbmV3Jz0xMjUKLSdub2RlTmFtZSc9MzcKLSducyc9NzEKLSdudWxsJz0xMjgKLSdvY3RldC1zdHJlYW0nPTE0MgotJ29uJz00NworJ2lzbm90bnVsbCc9MTY0CisnaXNudWxsJz0xNjMKKydqcGcnPTE0NgorJ2tleSc9NDkKKydrZXlzJz00NworJ2xhdGVzdEV4cG9ydCc9NDEKKydsYXRlc3RJbXBvcnQnPTQwCisnbG9jYWxlJz0yOAorJ2xvb2t1cCc9NDMKKydtYXAnPTY5CisnbWFwQmxvYic9NzEKKydtYXBCeUF0dHJpYnV0ZSc9MjYKKydtYXBUbyc9NTQKKydtYXBwaW5nJz00NgorJ21hcHBpbmdNb2RlbCc9MzUKKydtYXJrZWRCeSc9NTkKKydtYXJrZXJFbnRpdHknPTU4CisnbWFya2VyUGF0aCc9NTcKKydtZXJnZSc9MTYwCisnbWltZVR5cGUnPTczCisnbXBlZyc9MTQ4CisnbmV3Jz0xMzIKKydub2RlTmFtZSc9MzgKKyducyc9NzgKKydudWxsJz0xMzUKKydvY3RldC1zdHJlYW0nPTE0OQorJ29uJz01MQorJ29yJz0xNjYKICdwYWNrYWdlJz0xMwotJ3BhdGgnPTIzCi0ncGRmJz0xNDMKLSdwZXJzaXN0Jz0xNTIKLSdwbGFpbic9MTM4Ci0ncG5nJz0xNDAKLSdwcm9wZXJ0eSc9NTkKLSdxdW90ZUNoYXJhY3Rlcic9MzAKLSdyZW1vdmUnPTE1NAorJ3BhdGgnPTI0CisncGRmJz0xNTAKKydwZXJzaXN0Jz0xNTkKKydwbGFpbic9MTQ1CisncG5nJz0xNDcKKydwcm9wZXJ0eSc9NjMKKydxdW90ZUNoYXJhY3Rlcic9MzEKKydyZWYnPTY0CisncmVtb3ZlJz0xNjEKICdyZXBvcnQnPTIwCi0ncmV0dXJuJz0xMzEKLSdza2lwTGluZXMnPTMxCi0nc3RhdGljJz02OQotJ3N1cGVyJz0xMjQKLSdzd2l0Y2gnPTExNQotJ3N5bmNocm9uaXplZCc9MTM0Ci0ndGhyb3cnPTEzMAorJ3JldHVybic9MTM4Cisnc2tpcExpbmVzJz0zMgorJ3N0YXRpYyc9NzYKKydzdXBlcic9MTMxCisnc3dpdGNoJz0xMjIKKydzeW5jaHJvbml6ZWQnPTE0MQorJ3Rocm93Jz0xMzcKICd0aXRsZSc9MTQKLSd0byc9NjMKLSd0cnVlJz0xMjcKLSd0cnknPTEzMgotJ3R5cGVvZic9MTI5Ci0ndmFsJz0xMjIKLSd2YWxpZGF0ZSc9MzUKLSd2YXInPTEyMQorJ3RvJz03MAorJ3RydWUnPTEzNAorJ3RyeSc9MTM5CisndHlwZW9mJz0xMzYKKyd2YWwnPTEyOQorJ3ZhbGlkYXRlJz0zNgorJ3Zhcic9MTI4CiAndmVjdG9yTmFtZSc9MTkKLSd3aGlsZSc9MTE5Ci0nd2l0aCc9NDgKKyd3aGVyZSc9NjUKKyd3aGlsZSc9MTI2Cisnd2l0aCc9NTIKICd7Jz0xNQotJ3wnPTExMgotJ3x8Jz04OQorJ3wnPTExOQorJ3x8Jz05NgogJ30nPTE2CiBSVUxFX0FOWV9PVEhFUj0xMgogUlVMRV9ERUNJTUFMPTgKQEAgLTIwNiw3ICsyMTgsMTkgQEAKIFRfXzE1Mj0xNTIKIFRfXzE1Mz0xNTMKIFRfXzE1ND0xNTQKK1RfXzE1NT0xNTUKK1RfXzE1Nj0xNTYKK1RfXzE1Nz0xNTcKK1RfXzE1OD0xNTgKK1RfXzE1OT0xNTkKIFRfXzE1PTE1CitUX18xNjA9MTYwCitUX18xNjE9MTYxCitUX18xNjI9MTYyCitUX18xNjM9MTYzCitUX18xNjQ9MTY0CitUX18xNjU9MTY1CitUX18xNjY9MTY2CiBUX18xNj0xNgogVF9fMTc9MTcKIFRfXzE4PTE4CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmRhdGFpbnRlcmNoYW5nZS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvZGF0YWludGVyY2hhbmdlL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbERhdGFEU0xMZXhlci5qYXZhIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5kYXRhaW50ZXJjaGFuZ2Uvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2RhdGFpbnRlcmNoYW5nZS9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxEYXRhRFNMTGV4ZXIuamF2YQppbmRleCBlYjIyNTk0Li4zYTIyMDA4IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmRhdGFpbnRlcmNoYW5nZS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvZGF0YWludGVyY2hhbmdlL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbERhdGFEU0xMZXhlci5qYXZhCisrKyBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQuZGF0YWludGVyY2hhbmdlL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9kYXRhaW50ZXJjaGFuZ2UvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsRGF0YURTTExleGVyLmphdmEKQEAgLTU4LDYgKzU4LDEzIEBACiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fMTI4PTEyODsKICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX182NT02NTsKICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX18xMjc9MTI3OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzE2Nj0xNjY7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fMTY1PTE2NTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX18xNjI9MTYyOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzE2MT0xNjE7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fMTY0PTE2NDsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX18xNjM9MTYzOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzE2MD0xNjA7CiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fMzc9Mzc7CiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fMzg9Mzg7CiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fMzk9Mzk7CkBAIC02NSwxMCArNzIsMTUgQEAKICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX18zND0zNDsKICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX18zNT0zNTsKICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX18zNj0zNjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX18xNTk9MTU5OwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzMwPTMwOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzE1OD0xNTg7CiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fMzE9MzE7CiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fMzI9MzI7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fMTU1PTE1NTsKICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX18xNTQ9MTU0OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzE1Nz0xNTc7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fMTU2PTE1NjsKICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX18xNTE9MTUxOwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzE1MD0xNTA7CiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fMTUzPTE1MzsKQEAgLTM3MCwxMCArMzgyLDEwIEBACiAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICBpbnQgX3R5cGUgPSBUX18yMjsKICAgICAgICAgICAgIGludCBfY2hhbm5lbCA9IERFRkFVTFRfVE9LRU5fQ0hBTk5FTDsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIwOjc6ICggJ2ZpbGUnICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIwOjk6ICdmaWxlJworICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjA6NzogKCAnZGVsZXRlRmlsZUFmdGVySW1wb3J0JyApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMDo5OiAnZGVsZXRlRmlsZUFmdGVySW1wb3J0JwogICAgICAgICAgICAgewotICAgICAgICAgICAgbWF0Y2goImZpbGUiKTsgCisgICAgICAgICAgICBtYXRjaCgiZGVsZXRlRmlsZUFmdGVySW1wb3J0Iik7IAogCiAKICAgICAgICAgICAgIH0KQEAgLTM5MSwxMCArNDAzLDEwIEBACiAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICBpbnQgX3R5cGUgPSBUX18yMzsKICAgICAgICAgICAgIGludCBfY2hhbm5lbCA9IERFRkFVTFRfVE9LRU5fQ0hBTk5FTDsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIxOjc6ICggJ3BhdGgnICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIxOjk6ICdwYXRoJworICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjE6NzogKCAnZmlsZScgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjE6OTogJ2ZpbGUnCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICBtYXRjaCgicGF0aCIpOyAKKyAgICAgICAgICAgIG1hdGNoKCJmaWxlIik7IAogCiAKICAgICAgICAgICAgIH0KQEAgLTQxMiwxMCArNDI0LDEwIEBACiAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICBpbnQgX3R5cGUgPSBUX18yNDsKICAgICAgICAgICAgIGludCBfY2hhbm5lbCA9IERFRkFVTFRfVE9LRU5fQ0hBTk5FTDsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIyOjc6ICggJ1hNTCcgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjI6OTogJ1hNTCcKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIyOjc6ICggJ3BhdGgnICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIyOjk6ICdwYXRoJwogICAgICAgICAgICAgewotICAgICAgICAgICAgbWF0Y2goIlhNTCIpOyAKKyAgICAgICAgICAgIG1hdGNoKCJwYXRoIik7IAogCiAKICAgICAgICAgICAgIH0KQEAgLTQzMywxMCArNDQ1LDEwIEBACiAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICBpbnQgX3R5cGUgPSBUX18yNTsKICAgICAgICAgICAgIGludCBfY2hhbm5lbCA9IERFRkFVTFRfVE9LRU5fQ0hBTk5FTDsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIzOjc6ICggJ21hcEJ5QXR0cmlidXRlJyApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMzo5OiAnbWFwQnlBdHRyaWJ1dGUnCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMzo3OiAoICdYTUwnICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIzOjk6ICdYTUwnCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICBtYXRjaCgibWFwQnlBdHRyaWJ1dGUiKTsgCisgICAgICAgICAgICBtYXRjaCgiWE1MIik7IAogCiAKICAgICAgICAgICAgIH0KQEAgLTQ1NCwxMCArNDY2LDEwIEBACiAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICBpbnQgX3R5cGUgPSBUX18yNjsKICAgICAgICAgICAgIGludCBfY2hhbm5lbCA9IERFRkFVTFRfVE9LRU5fQ0hBTk5FTDsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI0Ojc6ICggJ2VuY29kaW5nJyApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNDo5OiAnZW5jb2RpbmcnCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNDo3OiAoICdtYXBCeUF0dHJpYnV0ZScgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjQ6OTogJ21hcEJ5QXR0cmlidXRlJwogICAgICAgICAgICAgewotICAgICAgICAgICAgbWF0Y2goImVuY29kaW5nIik7IAorICAgICAgICAgICAgbWF0Y2goIm1hcEJ5QXR0cmlidXRlIik7IAogCiAKICAgICAgICAgICAgIH0KQEAgLTQ3NSwxMCArNDg3LDEwIEBACiAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICBpbnQgX3R5cGUgPSBUX18yNzsKICAgICAgICAgICAgIGludCBfY2hhbm5lbCA9IERFRkFVTFRfVE9LRU5fQ0hBTk5FTDsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI1Ojc6ICggJ2xvY2FsZScgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjU6OTogJ2xvY2FsZScKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI1Ojc6ICggJ2VuY29kaW5nJyApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNTo5OiAnZW5jb2RpbmcnCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICBtYXRjaCgibG9jYWxlIik7IAorICAgICAgICAgICAgbWF0Y2goImVuY29kaW5nIik7IAogCiAKICAgICAgICAgICAgIH0KQEAgLTQ5NiwxMCArNTA4LDEwIEBACiAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICBpbnQgX3R5cGUgPSBUX18yODsKICAgICAgICAgICAgIGludCBfY2hhbm5lbCA9IERFRkFVTFRfVE9LRU5fQ0hBTk5FTDsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI2Ojc6ICggJ0NTVicgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjY6OTogJ0NTVicKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI2Ojc6ICggJ2xvY2FsZScgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjY6OTogJ2xvY2FsZScKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIG1hdGNoKCJDU1YiKTsgCisgICAgICAgICAgICBtYXRjaCgibG9jYWxlIik7IAogCiAKICAgICAgICAgICAgIH0KQEAgLTUxNywxMCArNTI5LDEwIEBACiAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICBpbnQgX3R5cGUgPSBUX18yOTsKICAgICAgICAgICAgIGludCBfY2hhbm5lbCA9IERFRkFVTFRfVE9LRU5fQ0hBTk5FTDsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI3Ojc6ICggJ2RlbGltaXRlcicgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6Mjc6OTogJ2RlbGltaXRlcicKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI3Ojc6ICggJ0NTVicgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6Mjc6OTogJ0NTVicKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIG1hdGNoKCJkZWxpbWl0ZXIiKTsgCisgICAgICAgICAgICBtYXRjaCgiQ1NWIik7IAogCiAKICAgICAgICAgICAgIH0KQEAgLTUzOCwxMCArNTUwLDEwIEBACiAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICBpbnQgX3R5cGUgPSBUX18zMDsKICAgICAgICAgICAgIGludCBfY2hhbm5lbCA9IERFRkFVTFRfVE9LRU5fQ0hBTk5FTDsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI4Ojc6ICggJ3F1b3RlQ2hhcmFjdGVyJyApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyODo5OiAncXVvdGVDaGFyYWN0ZXInCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyODo3OiAoICdkZWxpbWl0ZXInICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI4Ojk6ICdkZWxpbWl0ZXInCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICBtYXRjaCgicXVvdGVDaGFyYWN0ZXIiKTsgCisgICAgICAgICAgICBtYXRjaCgiZGVsaW1pdGVyIik7IAogCiAKICAgICAgICAgICAgIH0KQEAgLTU1OSwxMCArNTcxLDEwIEBACiAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICBpbnQgX3R5cGUgPSBUX18zMTsKICAgICAgICAgICAgIGludCBfY2hhbm5lbCA9IERFRkFVTFRfVE9LRU5fQ0hBTk5FTDsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI5Ojc6ICggJ3NraXBMaW5lcycgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6Mjk6OTogJ3NraXBMaW5lcycKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI5Ojc6ICggJ3F1b3RlQ2hhcmFjdGVyJyApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyOTo5OiAncXVvdGVDaGFyYWN0ZXInCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICBtYXRjaCgic2tpcExpbmVzIik7IAorICAgICAgICAgICAgbWF0Y2goInF1b3RlQ2hhcmFjdGVyIik7IAogCiAKICAgICAgICAgICAgIH0KQEAgLTU4MCwxMCArNTkyLDEwIEBACiAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICBpbnQgX3R5cGUgPSBUX18zMjsKICAgICAgICAgICAgIGludCBfY2hhbm5lbCA9IERFRkFVTFRfVE9LRU5fQ0hBTk5FTDsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjMwOjc6ICggJ2luZGVudCcgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MzA6OTogJ2luZGVudCcKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjMwOjc6ICggJ3NraXBMaW5lcycgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MzA6OTogJ3NraXBMaW5lcycKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIG1hdGNoKCJpbmRlbnQiKTsgCisgICAgICAgICAgICBtYXRjaCgic2tpcExpbmVzIik7IAogCiAKICAgICAgICAgICAgIH0KQEAgLTYwMSwxMCArNjEzLDEwIEBACiAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICBpbnQgX3R5cGUgPSBUX18zMzsKICAgICAgICAgICAgIGludCBfY2hhbm5lbCA9IERFRkFVTFRfVE9LRU5fQ0hBTk5FTDsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjMxOjc6ICggJ0VESScgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MzE6OTogJ0VESScKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjMxOjc6ICggJ2luZGVudCcgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MzE6OTogJ2luZGVudCcKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIG1hdGNoKCJFREkiKTsgCisgICAgICAgICAgICBtYXRjaCgiaW5kZW50Iik7IAogCiAKICAgICAgICAgICAgIH0KQEAgLTYyMiwxMCArNjM0LDEwIEBACiAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICBpbnQgX3R5cGUgPSBUX18zNDsKICAgICAgICAgICAgIGludCBfY2hhbm5lbCA9IERFRkFVTFRfVE9LRU5fQ0hBTk5FTDsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjMyOjc6ICggJ21hcHBpbmdNb2RlbCcgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MzI6OTogJ21hcHBpbmdNb2RlbCcKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjMyOjc6ICggJ0VESScgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MzI6OTogJ0VESScKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIG1hdGNoKCJtYXBwaW5nTW9kZWwiKTsgCisgICAgICAgICAgICBtYXRjaCgiRURJIik7IAogCiAKICAgICAgICAgICAgIH0KQEAgLTY0MywxMCArNjU1LDEwIEBACiAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICBpbnQgX3R5cGUgPSBUX18zNTsKICAgICAgICAgICAgIGludCBfY2hhbm5lbCA9IERFRkFVTFRfVE9LRU5fQ0hBTk5FTDsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjMzOjc6ICggJ3ZhbGlkYXRlJyApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzozMzo5OiAndmFsaWRhdGUnCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzozMzo3OiAoICdtYXBwaW5nTW9kZWwnICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjMzOjk6ICdtYXBwaW5nTW9kZWwnCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICBtYXRjaCgidmFsaWRhdGUiKTsgCisgICAgICAgICAgICBtYXRjaCgibWFwcGluZ01vZGVsIik7IAogCiAKICAgICAgICAgICAgIH0KQEAgLTY2NCwxMCArNjc2LDEwIEBACiAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICBpbnQgX3R5cGUgPSBUX18zNjsKICAgICAgICAgICAgIGludCBfY2hhbm5lbCA9IERFRkFVTFRfVE9LRU5fQ0hBTk5FTDsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjM0Ojc6ICggJ2VudGl0eScgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MzQ6OTogJ2VudGl0eScKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjM0Ojc6ICggJ3ZhbGlkYXRlJyApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzozNDo5OiAndmFsaWRhdGUnCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICBtYXRjaCgiZW50aXR5Iik7IAorICAgICAgICAgICAgbWF0Y2goInZhbGlkYXRlIik7IAogCiAKICAgICAgICAgICAgIH0KQEAgLTY4NSwxMCArNjk3LDEwIEBACiAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICBpbnQgX3R5cGUgPSBUX18zNzsKICAgICAgICAgICAgIGludCBfY2hhbm5lbCA9IERFRkFVTFRfVE9LRU5fQ0hBTk5FTDsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjM1Ojc6ICggJ25vZGVOYW1lJyApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzozNTo5OiAnbm9kZU5hbWUnCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzozNTo3OiAoICdlbnRpdHknICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjM1Ojk6ICdlbnRpdHknCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICBtYXRjaCgibm9kZU5hbWUiKTsgCisgICAgICAgICAgICBtYXRjaCgiZW50aXR5Iik7IAogCiAKICAgICAgICAgICAgIH0KQEAgLTcwNiwxMCArNzE4LDEwIEBACiAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICBpbnQgX3R5cGUgPSBUX18zODsKICAgICAgICAgICAgIGludCBfY2hhbm5lbCA9IERFRkFVTFRfVE9LRU5fQ0hBTk5FTDsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjM2Ojc6ICggJ2NyZWF0ZU9uJyApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzozNjo5OiAnY3JlYXRlT24nCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzozNjo3OiAoICdub2RlTmFtZScgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MzY6OTogJ25vZGVOYW1lJwogICAgICAgICAgICAgewotICAgICAgICAgICAgbWF0Y2goImNyZWF0ZU9uIik7IAorICAgICAgICAgICAgbWF0Y2goIm5vZGVOYW1lIik7IAogCiAKICAgICAgICAgICAgIH0KQEAgLTcyNywxMCArNzM5LDEwIEBACiAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICBpbnQgX3R5cGUgPSBUX18zOTsKICAgICAgICAgICAgIGludCBfY2hhbm5lbCA9IERFRkFVTFRfVE9LRU5fQ0hBTk5FTDsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjM3Ojc6ICggJ21hcmtlcicgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6Mzc6OTogJ21hcmtlcicKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjM3Ojc6ICggJ2NyZWF0ZU9uJyApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzozNzo5OiAnY3JlYXRlT24nCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICBtYXRjaCgibWFya2VyIik7IAorICAgICAgICAgICAgbWF0Y2goImNyZWF0ZU9uIik7IAogCiAKICAgICAgICAgICAgIH0KQEAgLTc0OCwxMCArNzYwLDEwIEBACiAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICBpbnQgX3R5cGUgPSBUX180MDsKICAgICAgICAgICAgIGludCBfY2hhbm5lbCA9IERFRkFVTFRfVE9LRU5fQ0hBTk5FTDsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjM4Ojc6ICggJ2V4cHJlc3Npb24nICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjM4Ojk6ICdleHByZXNzaW9uJworICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6Mzg6NzogKCAnbGF0ZXN0SW1wb3J0JyApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzozODo5OiAnbGF0ZXN0SW1wb3J0JwogICAgICAgICAgICAgewotICAgICAgICAgICAgbWF0Y2goImV4cHJlc3Npb24iKTsgCisgICAgICAgICAgICBtYXRjaCgibGF0ZXN0SW1wb3J0Iik7IAogCiAKICAgICAgICAgICAgIH0KQEAgLTc2OSwxMCArNzgxLDEwIEBACiAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICBpbnQgX3R5cGUgPSBUX180MTsKICAgICAgICAgICAgIGludCBfY2hhbm5lbCA9IERFRkFVTFRfVE9LRU5fQ0hBTk5FTDsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjM5Ojc6ICggJ2xvb2t1cCcgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6Mzk6OTogJ2xvb2t1cCcKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjM5Ojc6ICggJ2xhdGVzdEV4cG9ydCcgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6Mzk6OTogJ2xhdGVzdEV4cG9ydCcKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIG1hdGNoKCJsb29rdXAiKTsgCisgICAgICAgICAgICBtYXRjaCgibGF0ZXN0RXhwb3J0Iik7IAogCiAKICAgICAgICAgICAgIH0KQEAgLTc5MCwxMCArODAyLDEwIEBACiAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICBpbnQgX3R5cGUgPSBUX180MjsKICAgICAgICAgICAgIGludCBfY2hhbm5lbCA9IERFRkFVTFRfVE9LRU5fQ0hBTk5FTDsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjQwOjc6ICggJ2Zvcm1hdCcgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NDA6OTogJ2Zvcm1hdCcKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjQwOjc6ICggJ2V4cHJlc3Npb24nICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjQwOjk6ICdleHByZXNzaW9uJwogICAgICAgICAgICAgewotICAgICAgICAgICAgbWF0Y2goImZvcm1hdCIpOyAKKyAgICAgICAgICAgIG1hdGNoKCJleHByZXNzaW9uIik7IAogCiAKICAgICAgICAgICAgIH0KQEAgLTgxMSwxMCArODIzLDEwIEBACiAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICBpbnQgX3R5cGUgPSBUX180MzsKICAgICAgICAgICAgIGludCBfY2hhbm5lbCA9IERFRkFVTFRfVE9LRU5fQ0hBTk5FTDsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjQxOjc6ICggJ21hcHBpbmcnICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjQxOjk6ICdtYXBwaW5nJworICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NDE6NzogKCAnbG9va3VwJyApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo0MTo5OiAnbG9va3VwJwogICAgICAgICAgICAgewotICAgICAgICAgICAgbWF0Y2goIm1hcHBpbmciKTsgCisgICAgICAgICAgICBtYXRjaCgibG9va3VwIik7IAogCiAKICAgICAgICAgICAgIH0KQEAgLTgzMiwxMCArODQ0LDEwIEBACiAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICBpbnQgX3R5cGUgPSBUX180NDsKICAgICAgICAgICAgIGludCBfY2hhbm5lbCA9IERFRkFVTFRfVE9LRU5fQ0hBTk5FTDsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjQyOjc6ICggJ2tleXMnICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjQyOjk6ICdrZXlzJworICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NDI6NzogKCAnZm9ybWF0JyApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo0Mjo5OiAnZm9ybWF0JwogICAgICAgICAgICAgewotICAgICAgICAgICAgbWF0Y2goImtleXMiKTsgCisgICAgICAgICAgICBtYXRjaCgiZm9ybWF0Iik7IAogCiAKICAgICAgICAgICAgIH0KQEAgLTg1MywxMCArODY1LDEwIEBACiAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICBpbnQgX3R5cGUgPSBUX180NTsKICAgICAgICAgICAgIGludCBfY2hhbm5lbCA9IERFRkFVTFRfVE9LRU5fQ0hBTk5FTDsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjQzOjc6ICggJ2tleScgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NDM6OTogJ2tleScKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjQzOjc6ICggJ2V4cG9zZScgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NDM6OTogJ2V4cG9zZScKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIG1hdGNoKCJrZXkiKTsgCisgICAgICAgICAgICBtYXRjaCgiZXhwb3NlIik7IAogCiAKICAgICAgICAgICAgIH0KQEAgLTg3NCwxMCArODg2LDEwIEBACiAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICBpbnQgX3R5cGUgPSBUX180NjsKICAgICAgICAgICAgIGludCBfY2hhbm5lbCA9IERFRkFVTFRfVE9LRU5fQ0hBTk5FTDsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjQ0Ojc6ICggJ2ZvcicgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NDQ6OTogJ2ZvcicKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjQ0Ojc6ICggJ21hcHBpbmcnICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjQ0Ojk6ICdtYXBwaW5nJwogICAgICAgICAgICAgewotICAgICAgICAgICAgbWF0Y2goImZvciIpOyAKKyAgICAgICAgICAgIG1hdGNoKCJtYXBwaW5nIik7IAogCiAKICAgICAgICAgICAgIH0KQEAgLTg5NSwxMCArOTA3LDEwIEBACiAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICBpbnQgX3R5cGUgPSBUX180NzsKICAgICAgICAgICAgIGludCBfY2hhbm5lbCA9IERFRkFVTFRfVE9LRU5fQ0hBTk5FTDsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjQ1Ojc6ICggJ29uJyApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo0NTo5OiAnb24nCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo0NTo3OiAoICdrZXlzJyApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo0NTo5OiAna2V5cycKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIG1hdGNoKCJvbiIpOyAKKyAgICAgICAgICAgIG1hdGNoKCJrZXlzIik7IAogCiAKICAgICAgICAgICAgIH0KQEAgLTkxNiwxMCArOTI4LDEwIEBACiAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICBpbnQgX3R5cGUgPSBUX180ODsKICAgICAgICAgICAgIGludCBfY2hhbm5lbCA9IERFRkFVTFRfVE9LRU5fQ0hBTk5FTDsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjQ2Ojc6ICggJ3dpdGgnICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjQ2Ojk6ICd3aXRoJworICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NDY6NzogKCAnZXhwb3J0RmlsdGVyJyApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo0Njo5OiAnZXhwb3J0RmlsdGVyJwogICAgICAgICAgICAgewotICAgICAgICAgICAgbWF0Y2goIndpdGgiKTsgCisgICAgICAgICAgICBtYXRjaCgiZXhwb3J0RmlsdGVyIik7IAogCiAKICAgICAgICAgICAgIH0KQEAgLTkzNywxMCArOTQ5LDEwIEBACiAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICBpbnQgX3R5cGUgPSBUX180OTsKICAgICAgICAgICAgIGludCBfY2hhbm5lbCA9IERFRkFVTFRfVE9LRU5fQ0hBTk5FTDsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjQ3Ojc6ICggJ2NhY2hlU2l6ZScgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NDc6OTogJ2NhY2hlU2l6ZScKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjQ3Ojc6ICggJ2tleScgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NDc6OTogJ2tleScKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIG1hdGNoKCJjYWNoZVNpemUiKTsgCisgICAgICAgICAgICBtYXRjaCgia2V5Iik7IAogCiAKICAgICAgICAgICAgIH0KQEAgLTk1OCwxMCArOTcwLDEwIEBACiAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICBpbnQgX3R5cGUgPSBUX181MDsKICAgICAgICAgICAgIGludCBfY2hhbm5lbCA9IERFRkFVTFRfVE9LRU5fQ0hBTk5FTDsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjQ4Ojc6ICggJ21hcFRvJyApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo0ODo5OiAnbWFwVG8nCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo0ODo3OiAoICdmb3InICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjQ4Ojk6ICdmb3InCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICBtYXRjaCgibWFwVG8iKTsgCisgICAgICAgICAgICBtYXRjaCgiZm9yIik7IAogCiAKICAgICAgICAgICAgIH0KQEAgLTk3OSwxMCArOTkxLDEwIEBACiAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICBpbnQgX3R5cGUgPSBUX181MTsKICAgICAgICAgICAgIGludCBfY2hhbm5lbCA9IERFRkFVTFRfVE9LRU5fQ0hBTk5FTDsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjQ5Ojc6ICggJ2FsbG93Tm9SZXN1bHQnICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjQ5Ojk6ICdhbGxvd05vUmVzdWx0JworICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NDk6NzogKCAnb24nICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjQ5Ojk6ICdvbicKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIG1hdGNoKCJhbGxvd05vUmVzdWx0Iik7IAorICAgICAgICAgICAgbWF0Y2goIm9uIik7IAogCiAKICAgICAgICAgICAgIH0KQEAgLTEwMDAsMTAgKzEwMTIsMTAgQEAKICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgIGludCBfdHlwZSA9IFRfXzUyOwogICAgICAgICAgICAgaW50IF9jaGFubmVsID0gREVGQVVMVF9UT0tFTl9DSEFOTkVMOwotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NTA6NzogKCAnYWxsb3dOb251bmlxdWVSZXN1bHQnICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjUwOjk6ICdhbGxvd05vbnVuaXF1ZVJlc3VsdCcKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjUwOjc6ICggJ3dpdGgnICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjUwOjk6ICd3aXRoJwogICAgICAgICAgICAgewotICAgICAgICAgICAgbWF0Y2goImFsbG93Tm9udW5pcXVlUmVzdWx0Iik7IAorICAgICAgICAgICAgbWF0Y2goIndpdGgiKTsgCiAKIAogICAgICAgICAgICAgfQpAQCAtMTAyMSwxMCArMTAzMywxMCBAQAogICAgICAgICB0cnkgewogICAgICAgICAgICAgaW50IF90eXBlID0gVF9fNTM7CiAgICAgICAgICAgICBpbnQgX2NoYW5uZWwgPSBERUZBVUxUX1RPS0VOX0NIQU5ORUw7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo1MTo3OiAoICdtYXJrZXJQYXRoJyApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo1MTo5OiAnbWFya2VyUGF0aCcKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjUxOjc6ICggJ2NhY2hlU2l6ZScgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NTE6OTogJ2NhY2hlU2l6ZScKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIG1hdGNoKCJtYXJrZXJQYXRoIik7IAorICAgICAgICAgICAgbWF0Y2goImNhY2hlU2l6ZSIpOyAKIAogCiAgICAgICAgICAgICB9CkBAIC0xMDQyLDEwICsxMDU0LDEwIEBACiAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICBpbnQgX3R5cGUgPSBUX181NDsKICAgICAgICAgICAgIGludCBfY2hhbm5lbCA9IERFRkFVTFRfVE9LRU5fQ0hBTk5FTDsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjUyOjc6ICggJ21hcmtlckVudGl0eScgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NTI6OTogJ21hcmtlckVudGl0eScKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjUyOjc6ICggJ21hcFRvJyApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo1Mjo5OiAnbWFwVG8nCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICBtYXRjaCgibWFya2VyRW50aXR5Iik7IAorICAgICAgICAgICAgbWF0Y2goIm1hcFRvIik7IAogCiAKICAgICAgICAgICAgIH0KQEAgLTEwNjMsMTAgKzEwNzUsMTAgQEAKICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgIGludCBfdHlwZSA9IFRfXzU1OwogICAgICAgICAgICAgaW50IF9jaGFubmVsID0gREVGQVVMVF9UT0tFTl9DSEFOTkVMOwotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NTM6NzogKCAnbWFya2VkQnknICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjUzOjk6ICdtYXJrZWRCeScKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjUzOjc6ICggJ2FsbG93Tm9SZXN1bHQnICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjUzOjk6ICdhbGxvd05vUmVzdWx0JwogICAgICAgICAgICAgewotICAgICAgICAgICAgbWF0Y2goIm1hcmtlZEJ5Iik7IAorICAgICAgICAgICAgbWF0Y2goImFsbG93Tm9SZXN1bHQiKTsgCiAKIAogICAgICAgICAgICAgfQpAQCAtMTA4NCwxMCArMTA5NiwxMCBAQAogICAgICAgICB0cnkgewogICAgICAgICAgICAgaW50IF90eXBlID0gVF9fNTY7CiAgICAgICAgICAgICBpbnQgX2NoYW5uZWwgPSBERUZBVUxUX1RPS0VOX0NIQU5ORUw7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo1NDo3OiAoICdjb2RpbmcnICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjU0Ojk6ICdjb2RpbmcnCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo1NDo3OiAoICdhbGxvd05vbnVuaXF1ZVJlc3VsdCcgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NTQ6OTogJ2FsbG93Tm9udW5pcXVlUmVzdWx0JwogICAgICAgICAgICAgewotICAgICAgICAgICAgbWF0Y2goImNvZGluZyIpOyAKKyAgICAgICAgICAgIG1hdGNoKCJhbGxvd05vbnVuaXF1ZVJlc3VsdCIpOyAKIAogCiAgICAgICAgICAgICB9CkBAIC0xMTA1LDEwICsxMTE3LDEwIEBACiAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICBpbnQgX3R5cGUgPSBUX181NzsKICAgICAgICAgICAgIGludCBfY2hhbm5lbCA9IERFRkFVTFRfVE9LRU5fQ0hBTk5FTDsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjU1Ojc6ICggJ2NvcHknICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjU1Ojk6ICdjb3B5JworICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NTU6NzogKCAnbWFya2VyUGF0aCcgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NTU6OTogJ21hcmtlclBhdGgnCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICBtYXRjaCgiY29weSIpOyAKKyAgICAgICAgICAgIG1hdGNoKCJtYXJrZXJQYXRoIik7IAogCiAKICAgICAgICAgICAgIH0KQEAgLTExMjYsMTAgKzExMzgsMTAgQEAKICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgIGludCBfdHlwZSA9IFRfXzU4OwogICAgICAgICAgICAgaW50IF9jaGFubmVsID0gREVGQVVMVF9UT0tFTl9DSEFOTkVMOwotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NTY6NzogKCAnZnJvbScgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NTY6OTogJ2Zyb20nCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo1Njo3OiAoICdtYXJrZXJFbnRpdHknICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjU2Ojk6ICdtYXJrZXJFbnRpdHknCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICBtYXRjaCgiZnJvbSIpOyAKKyAgICAgICAgICAgIG1hdGNoKCJtYXJrZXJFbnRpdHkiKTsgCiAKIAogICAgICAgICAgICAgfQpAQCAtMTE0NywxMCArMTE1OSwxMCBAQAogICAgICAgICB0cnkgewogICAgICAgICAgICAgaW50IF90eXBlID0gVF9fNTk7CiAgICAgICAgICAgICBpbnQgX2NoYW5uZWwgPSBERUZBVUxUX1RPS0VOX0NIQU5ORUw7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo1Nzo3OiAoICdwcm9wZXJ0eScgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NTc6OTogJ3Byb3BlcnR5JworICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NTc6NzogKCAnbWFya2VkQnknICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjU3Ojk6ICdtYXJrZWRCeScKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIG1hdGNoKCJwcm9wZXJ0eSIpOyAKKyAgICAgICAgICAgIG1hdGNoKCJtYXJrZWRCeSIpOyAKIAogCiAgICAgICAgICAgICB9CkBAIC0xMTY4LDEwICsxMTgwLDEwIEBACiAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICBpbnQgX3R5cGUgPSBUX182MDsKICAgICAgICAgICAgIGludCBfY2hhbm5lbCA9IERFRkFVTFRfVE9LRU5fQ0hBTk5FTDsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjU4Ojc6ICggJ2Fzc2lnbicgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NTg6OTogJ2Fzc2lnbicKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjU4Ojc6ICggJ2NvZGluZycgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NTg6OTogJ2NvZGluZycKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIG1hdGNoKCJhc3NpZ24iKTsgCisgICAgICAgICAgICBtYXRjaCgiY29kaW5nIik7IAogCiAKICAgICAgICAgICAgIH0KQEAgLTExODksMTAgKzEyMDEsMTAgQEAKICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgIGludCBfdHlwZSA9IFRfXzYxOwogICAgICAgICAgICAgaW50IF9jaGFubmVsID0gREVGQVVMVF9UT0tFTl9DSEFOTkVMOwotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NTk6NzogKCAnYXMnICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjU5Ojk6ICdhcycKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjU5Ojc6ICggJ2NvcHknICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjU5Ojk6ICdjb3B5JwogICAgICAgICAgICAgewotICAgICAgICAgICAgbWF0Y2goImFzIik7IAorICAgICAgICAgICAgbWF0Y2goImNvcHkiKTsgCiAKIAogICAgICAgICAgICAgfQpAQCAtMTIxMCwxMCArMTIyMiwxMCBAQAogICAgICAgICB0cnkgewogICAgICAgICAgICAgaW50IF90eXBlID0gVF9fNjI7CiAgICAgICAgICAgICBpbnQgX2NoYW5uZWwgPSBERUZBVUxUX1RPS0VOX0NIQU5ORUw7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo2MDo3OiAoICdtYXAnICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjYwOjk6ICdtYXAnCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo2MDo3OiAoICdmcm9tJyApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo2MDo5OiAnZnJvbScKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIG1hdGNoKCJtYXAiKTsgCisgICAgICAgICAgICBtYXRjaCgiZnJvbSIpOyAKIAogCiAgICAgICAgICAgICB9CkBAIC0xMjMxLDEwICsxMjQzLDEwIEBACiAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICBpbnQgX3R5cGUgPSBUX182MzsKICAgICAgICAgICAgIGludCBfY2hhbm5lbCA9IERFRkFVTFRfVE9LRU5fQ0hBTk5FTDsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjYxOjc6ICggJ3RvJyApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo2MTo5OiAndG8nCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo2MTo3OiAoICdwcm9wZXJ0eScgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NjE6OTogJ3Byb3BlcnR5JwogICAgICAgICAgICAgewotICAgICAgICAgICAgbWF0Y2goInRvIik7IAorICAgICAgICAgICAgbWF0Y2goInByb3BlcnR5Iik7IAogCiAKICAgICAgICAgICAgIH0KQEAgLTEyNTIsMTAgKzEyNjQsMTAgQEAKICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgIGludCBfdHlwZSA9IFRfXzY0OwogICAgICAgICAgICAgaW50IF9jaGFubmVsID0gREVGQVVMVF9UT0tFTl9DSEFOTkVMOwotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NjI6NzogKCAnbWFwQmxvYicgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NjI6OTogJ21hcEJsb2InCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo2Mjo3OiAoICdyZWYnICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjYyOjk6ICdyZWYnCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICBtYXRjaCgibWFwQmxvYiIpOyAKKyAgICAgICAgICAgIG1hdGNoKCJyZWYiKTsgCiAKIAogICAgICAgICAgICAgfQpAQCAtMTI3MywxMCArMTI4NSwxMCBAQAogICAgICAgICB0cnkgewogICAgICAgICAgICAgaW50IF90eXBlID0gVF9fNjU7CiAgICAgICAgICAgICBpbnQgX2NoYW5uZWwgPSBERUZBVUxUX1RPS0VOX0NIQU5ORUw7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo2Mzo3OiAoICdleHRlbnNpb24nICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjYzOjk6ICdleHRlbnNpb24nCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo2Mzo3OiAoICd3aGVyZScgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NjM6OTogJ3doZXJlJwogICAgICAgICAgICAgewotICAgICAgICAgICAgbWF0Y2goImV4dGVuc2lvbiIpOyAKKyAgICAgICAgICAgIG1hdGNoKCJ3aGVyZSIpOyAKIAogCiAgICAgICAgICAgICB9CkBAIC0xMjk0LDEwICsxMzA2LDEwIEBACiAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICBpbnQgX3R5cGUgPSBUX182NjsKICAgICAgICAgICAgIGludCBfY2hhbm5lbCA9IERFRkFVTFRfVE9LRU5fQ0hBTk5FTDsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjY0Ojc6ICggJ21pbWVUeXBlJyApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo2NDo5OiAnbWltZVR5cGUnCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo2NDo3OiAoICdoaWRlJyApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo2NDo5OiAnaGlkZScKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIG1hdGNoKCJtaW1lVHlwZSIpOyAKKyAgICAgICAgICAgIG1hdGNoKCJoaWRlIik7IAogCiAKICAgICAgICAgICAgIH0KQEAgLTEzMTUsMTAgKzEzMjcsMTEgQEAKICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgIGludCBfdHlwZSA9IFRfXzY3OwogICAgICAgICAgICAgaW50IF9jaGFubmVsID0gREVGQVVMVF9UT0tFTl9DSEFOTkVMOwotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NjU6NzogKCAnLicgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NjU6OTogJy4nCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo2NTo3OiAoICdhc3NpZ24nICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjY1Ojk6ICdhc3NpZ24nCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICBtYXRjaCgnLicpOyAKKyAgICAgICAgICAgIG1hdGNoKCJhc3NpZ24iKTsgCisKIAogICAgICAgICAgICAgfQogCkBAIC0xMzM1LDEwICsxMzQ4LDEwIEBACiAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICBpbnQgX3R5cGUgPSBUX182ODsKICAgICAgICAgICAgIGludCBfY2hhbm5lbCA9IERFRkFVTFRfVE9LRU5fQ0hBTk5FTDsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjY2Ojc6ICggJ2ltcG9ydCcgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NjY6OTogJ2ltcG9ydCcKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjY2Ojc6ICggJ2FzJyApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo2Njo5OiAnYXMnCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICBtYXRjaCgiaW1wb3J0Iik7IAorICAgICAgICAgICAgbWF0Y2goImFzIik7IAogCiAKICAgICAgICAgICAgIH0KQEAgLTEzNTYsMTAgKzEzNjksMTAgQEAKICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgIGludCBfdHlwZSA9IFRfXzY5OwogICAgICAgICAgICAgaW50IF9jaGFubmVsID0gREVGQVVMVF9UT0tFTl9DSEFOTkVMOwotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6Njc6NzogKCAnc3RhdGljJyApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo2Nzo5OiAnc3RhdGljJworICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6Njc6NzogKCAnbWFwJyApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo2Nzo5OiAnbWFwJwogICAgICAgICAgICAgewotICAgICAgICAgICAgbWF0Y2goInN0YXRpYyIpOyAKKyAgICAgICAgICAgIG1hdGNoKCJtYXAiKTsgCiAKIAogICAgICAgICAgICAgfQpAQCAtMTM3NywxMCArMTM5MCwxMSBAQAogICAgICAgICB0cnkgewogICAgICAgICAgICAgaW50IF90eXBlID0gVF9fNzA7CiAgICAgICAgICAgICBpbnQgX2NoYW5uZWwgPSBERUZBVUxUX1RPS0VOX0NIQU5ORUw7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo2ODo3OiAoICcqJyApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo2ODo5OiAnKicKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjY4Ojc6ICggJ3RvJyApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo2ODo5OiAndG8nCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICBtYXRjaCgnKicpOyAKKyAgICAgICAgICAgIG1hdGNoKCJ0byIpOyAKKwogCiAgICAgICAgICAgICB9CiAKQEAgLTEzOTcsMTAgKzE0MTEsMTAgQEAKICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgIGludCBfdHlwZSA9IFRfXzcxOwogICAgICAgICAgICAgaW50IF9jaGFubmVsID0gREVGQVVMVF9UT0tFTl9DSEFOTkVMOwotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6Njk6NzogKCAnbnMnICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjY5Ojk6ICducycKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjY5Ojc6ICggJ21hcEJsb2InICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjY5Ojk6ICdtYXBCbG9iJwogICAgICAgICAgICAgewotICAgICAgICAgICAgbWF0Y2goIm5zIik7IAorICAgICAgICAgICAgbWF0Y2goIm1hcEJsb2IiKTsgCiAKIAogICAgICAgICAgICAgfQpAQCAtMTQxOCwxMCArMTQzMiwxMSBAQAogICAgICAgICB0cnkgewogICAgICAgICAgICAgaW50IF90eXBlID0gVF9fNzI7CiAgICAgICAgICAgICBpbnQgX2NoYW5uZWwgPSBERUZBVUxUX1RPS0VOX0NIQU5ORUw7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo3MDo3OiAoICc7JyApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo3MDo5OiAnOycKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjcwOjc6ICggJ2V4dGVuc2lvbicgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NzA6OTogJ2V4dGVuc2lvbicKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIG1hdGNoKCc7Jyk7IAorICAgICAgICAgICAgbWF0Y2goImV4dGVuc2lvbiIpOyAKKwogCiAgICAgICAgICAgICB9CiAKQEAgLTE0MzgsMTAgKzE0NTMsMTEgQEAKICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgIGludCBfdHlwZSA9IFRfXzczOwogICAgICAgICAgICAgaW50IF9jaGFubmVsID0gREVGQVVMVF9UT0tFTl9DSEFOTkVMOwotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NzE6NzogKCAnQCcgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NzE6OTogJ0AnCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo3MTo3OiAoICdtaW1lVHlwZScgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NzE6OTogJ21pbWVUeXBlJwogICAgICAgICAgICAgewotICAgICAgICAgICAgbWF0Y2goJ0AnKTsgCisgICAgICAgICAgICBtYXRjaCgibWltZVR5cGUiKTsgCisKIAogICAgICAgICAgICAgfQogCkBAIC0xNDU4LDEwICsxNDc0LDEwIEBACiAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICBpbnQgX3R5cGUgPSBUX183NDsKICAgICAgICAgICAgIGludCBfY2hhbm5lbCA9IERFRkFVTFRfVE9LRU5fQ0hBTk5FTDsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjcyOjc6ICggJygnICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjcyOjk6ICcoJworICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NzI6NzogKCAnLicgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NzI6OTogJy4nCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICBtYXRjaCgnKCcpOyAKKyAgICAgICAgICAgIG1hdGNoKCcuJyk7IAogCiAgICAgICAgICAgICB9CiAKQEAgLTE0NzgsMTAgKzE0OTQsMTEgQEAKICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgIGludCBfdHlwZSA9IFRfXzc1OwogICAgICAgICAgICAgaW50IF9jaGFubmVsID0gREVGQVVMVF9UT0tFTl9DSEFOTkVMOwotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NzM6NzogKCAnLCcgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NzM6OTogJywnCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo3Mzo3OiAoICdpbXBvcnQnICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjczOjk6ICdpbXBvcnQnCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICBtYXRjaCgnLCcpOyAKKyAgICAgICAgICAgIG1hdGNoKCJpbXBvcnQiKTsgCisKIAogICAgICAgICAgICAgfQogCkBAIC0xNDk4LDEwICsxNTE1LDExIEBACiAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICBpbnQgX3R5cGUgPSBUX183NjsKICAgICAgICAgICAgIGludCBfY2hhbm5lbCA9IERFRkFVTFRfVE9LRU5fQ0hBTk5FTDsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjc0Ojc6ICggJyknICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjc0Ojk6ICcpJworICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NzQ6NzogKCAnc3RhdGljJyApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo3NDo5OiAnc3RhdGljJwogICAgICAgICAgICAgewotICAgICAgICAgICAgbWF0Y2goJyknKTsgCisgICAgICAgICAgICBtYXRjaCgic3RhdGljIik7IAorCiAKICAgICAgICAgICAgIH0KIApAQCAtMTUxOCwxMCArMTUzNiwxMCBAQAogICAgICAgICB0cnkgewogICAgICAgICAgICAgaW50IF90eXBlID0gVF9fNzc7CiAgICAgICAgICAgICBpbnQgX2NoYW5uZWwgPSBERUZBVUxUX1RPS0VOX0NIQU5ORUw7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo3NTo3OiAoICc9JyApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo3NTo5OiAnPScKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjc1Ojc6ICggJyonICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjc1Ojk6ICcqJwogICAgICAgICAgICAgewotICAgICAgICAgICAgbWF0Y2goJz0nKTsgCisgICAgICAgICAgICBtYXRjaCgnKicpOyAKIAogICAgICAgICAgICAgfQogCkBAIC0xNTM4LDEwICsxNTU2LDExIEBACiAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICBpbnQgX3R5cGUgPSBUX183ODsKICAgICAgICAgICAgIGludCBfY2hhbm5lbCA9IERFRkFVTFRfVE9LRU5fQ0hBTk5FTDsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjc2Ojc6ICggJyMnICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjc2Ojk6ICcjJworICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NzY6NzogKCAnbnMnICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjc2Ojk6ICducycKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIG1hdGNoKCcjJyk7IAorICAgICAgICAgICAgbWF0Y2goIm5zIik7IAorCiAKICAgICAgICAgICAgIH0KIApAQCAtMTU1OCwxMCArMTU3NywxMCBAQAogICAgICAgICB0cnkgewogICAgICAgICAgICAgaW50IF90eXBlID0gVF9fNzk7CiAgICAgICAgICAgICBpbnQgX2NoYW5uZWwgPSBERUZBVUxUX1RPS0VOX0NIQU5ORUw7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo3Nzo3OiAoICdbJyApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo3Nzo5OiAnWycKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjc3Ojc6ICggJzsnICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjc3Ojk6ICc7JwogICAgICAgICAgICAgewotICAgICAgICAgICAgbWF0Y2goJ1snKTsgCisgICAgICAgICAgICBtYXRjaCgnOycpOyAKIAogICAgICAgICAgICAgfQogCkBAIC0xNTc4LDEwICsxNTk3LDEwIEBACiAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICBpbnQgX3R5cGUgPSBUX184MDsKICAgICAgICAgICAgIGludCBfY2hhbm5lbCA9IERFRkFVTFRfVE9LRU5fQ0hBTk5FTDsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjc4Ojc6ICggJ10nICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjc4Ojk6ICddJworICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6Nzg6NzogKCAnQCcgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6Nzg6OTogJ0AnCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICBtYXRjaCgnXScpOyAKKyAgICAgICAgICAgIG1hdGNoKCdAJyk7IAogCiAgICAgICAgICAgICB9CiAKQEAgLTE1OTgsMTEgKzE2MTcsMTAgQEAKICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgIGludCBfdHlwZSA9IFRfXzgxOwogICAgICAgICAgICAgaW50IF9jaGFubmVsID0gREVGQVVMVF9UT0tFTl9DSEFOTkVMOwotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6Nzk6NzogKCAnKz0nICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjc5Ojk6ICcrPScKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjc5Ojc6ICggJygnICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjc5Ojk6ICcoJwogICAgICAgICAgICAgewotICAgICAgICAgICAgbWF0Y2goIis9Iik7IAotCisgICAgICAgICAgICBtYXRjaCgnKCcpOyAKIAogICAgICAgICAgICAgfQogCkBAIC0xNjE5LDExICsxNjM3LDEwIEBACiAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICBpbnQgX3R5cGUgPSBUX184MjsKICAgICAgICAgICAgIGludCBfY2hhbm5lbCA9IERFRkFVTFRfVE9LRU5fQ0hBTk5FTDsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjgwOjc6ICggJy09JyApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo4MDo5OiAnLT0nCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo4MDo3OiAoICcsJyApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo4MDo5OiAnLCcKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIG1hdGNoKCItPSIpOyAKLQorICAgICAgICAgICAgbWF0Y2goJywnKTsgCiAKICAgICAgICAgICAgIH0KIApAQCAtMTY0MCwxMSArMTY1NywxMCBAQAogICAgICAgICB0cnkgewogICAgICAgICAgICAgaW50IF90eXBlID0gVF9fODM7CiAgICAgICAgICAgICBpbnQgX2NoYW5uZWwgPSBERUZBVUxUX1RPS0VOX0NIQU5ORUw7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo4MTo3OiAoICcqPScgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6ODE6OTogJyo9JworICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6ODE6NzogKCAnKScgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6ODE6OTogJyknCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICBtYXRjaCgiKj0iKTsgCi0KKyAgICAgICAgICAgIG1hdGNoKCcpJyk7IAogCiAgICAgICAgICAgICB9CiAKQEAgLTE2NjEsMTEgKzE2NzcsMTAgQEAKICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgIGludCBfdHlwZSA9IFRfXzg0OwogICAgICAgICAgICAgaW50IF9jaGFubmVsID0gREVGQVVMVF9UT0tFTl9DSEFOTkVMOwotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6ODI6NzogKCAnLz0nICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjgyOjk6ICcvPScKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjgyOjc6ICggJz0nICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjgyOjk6ICc9JwogICAgICAgICAgICAgewotICAgICAgICAgICAgbWF0Y2goIi89Iik7IAotCisgICAgICAgICAgICBtYXRjaCgnPScpOyAKIAogICAgICAgICAgICAgfQogCkBAIC0xNjgyLDExICsxNjk3LDEwIEBACiAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICBpbnQgX3R5cGUgPSBUX184NTsKICAgICAgICAgICAgIGludCBfY2hhbm5lbCA9IERFRkFVTFRfVE9LRU5fQ0hBTk5FTDsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjgzOjc6ICggJyU9JyApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo4Mzo5OiAnJT0nCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo4Mzo3OiAoICcjJyApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo4Mzo5OiAnIycKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIG1hdGNoKCIlPSIpOyAKLQorICAgICAgICAgICAgbWF0Y2goJyMnKTsgCiAKICAgICAgICAgICAgIH0KIApAQCAtMTcwMywxMCArMTcxNywxMCBAQAogICAgICAgICB0cnkgewogICAgICAgICAgICAgaW50IF90eXBlID0gVF9fODY7CiAgICAgICAgICAgICBpbnQgX2NoYW5uZWwgPSBERUZBVUxUX1RPS0VOX0NIQU5ORUw7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo4NDo3OiAoICc8JyApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo4NDo5OiAnPCcKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjg0Ojc6ICggJ1snICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjg0Ojk6ICdbJwogICAgICAgICAgICAgewotICAgICAgICAgICAgbWF0Y2goJzwnKTsgCisgICAgICAgICAgICBtYXRjaCgnWycpOyAKIAogICAgICAgICAgICAgfQogCkBAIC0xNzIzLDEwICsxNzM3LDEwIEBACiAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICBpbnQgX3R5cGUgPSBUX184NzsKICAgICAgICAgICAgIGludCBfY2hhbm5lbCA9IERFRkFVTFRfVE9LRU5fQ0hBTk5FTDsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjg1Ojc6ICggJz4nICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjg1Ojk6ICc+JworICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6ODU6NzogKCAnXScgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6ODU6OTogJ10nCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICBtYXRjaCgnPicpOyAKKyAgICAgICAgICAgIG1hdGNoKCddJyk7IAogCiAgICAgICAgICAgICB9CiAKQEAgLTE3NDMsMTAgKzE3NTcsMTAgQEAKICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgIGludCBfdHlwZSA9IFRfXzg4OwogICAgICAgICAgICAgaW50IF9jaGFubmVsID0gREVGQVVMVF9UT0tFTl9DSEFOTkVMOwotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6ODY6NzogKCAnPj0nICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjg2Ojk6ICc+PScKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjg2Ojc6ICggJys9JyApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo4Njo5OiAnKz0nCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICBtYXRjaCgiPj0iKTsgCisgICAgICAgICAgICBtYXRjaCgiKz0iKTsgCiAKIAogICAgICAgICAgICAgfQpAQCAtMTc2NCwxMCArMTc3OCwxMCBAQAogICAgICAgICB0cnkgewogICAgICAgICAgICAgaW50IF90eXBlID0gVF9fODk7CiAgICAgICAgICAgICBpbnQgX2NoYW5uZWwgPSBERUZBVUxUX1RPS0VOX0NIQU5ORUw7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo4Nzo3OiAoICd8fCcgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6ODc6OTogJ3x8JworICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6ODc6NzogKCAnLT0nICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjg3Ojk6ICctPScKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIG1hdGNoKCJ8fCIpOyAKKyAgICAgICAgICAgIG1hdGNoKCItPSIpOyAKIAogCiAgICAgICAgICAgICB9CkBAIC0xNzg1LDEwICsxNzk5LDEwIEBACiAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICBpbnQgX3R5cGUgPSBUX185MDsKICAgICAgICAgICAgIGludCBfY2hhbm5lbCA9IERFRkFVTFRfVE9LRU5fQ0hBTk5FTDsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjg4Ojc6ICggJyYmJyApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo4ODo5OiAnJiYnCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo4ODo3OiAoICcqPScgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6ODg6OTogJyo9JwogICAgICAgICAgICAgewotICAgICAgICAgICAgbWF0Y2goIiYmIik7IAorICAgICAgICAgICAgbWF0Y2goIio9Iik7IAogCiAKICAgICAgICAgICAgIH0KQEAgLTE4MDYsMTAgKzE4MjAsMTAgQEAKICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgIGludCBfdHlwZSA9IFRfXzkxOwogICAgICAgICAgICAgaW50IF9jaGFubmVsID0gREVGQVVMVF9UT0tFTl9DSEFOTkVMOwotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6ODk6NzogKCAnPT0nICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjg5Ojk6ICc9PScKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjg5Ojc6ICggJy89JyApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo4OTo5OiAnLz0nCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICBtYXRjaCgiPT0iKTsgCisgICAgICAgICAgICBtYXRjaCgiLz0iKTsgCiAKIAogICAgICAgICAgICAgfQpAQCAtMTgyNywxMCArMTg0MSwxMCBAQAogICAgICAgICB0cnkgewogICAgICAgICAgICAgaW50IF90eXBlID0gVF9fOTI7CiAgICAgICAgICAgICBpbnQgX2NoYW5uZWwgPSBERUZBVUxUX1RPS0VOX0NIQU5ORUw7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo5MDo3OiAoICchPScgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6OTA6OTogJyE9JworICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6OTA6NzogKCAnJT0nICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjkwOjk6ICclPScKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIG1hdGNoKCIhPSIpOyAKKyAgICAgICAgICAgIG1hdGNoKCIlPSIpOyAKIAogCiAgICAgICAgICAgICB9CkBAIC0xODQ4LDExICsxODYyLDEwIEBACiAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICBpbnQgX3R5cGUgPSBUX185MzsKICAgICAgICAgICAgIGludCBfY2hhbm5lbCA9IERFRkFVTFRfVE9LRU5fQ0hBTk5FTDsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjkxOjc6ICggJz09PScgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6OTE6OTogJz09PScKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjkxOjc6ICggJzwnICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjkxOjk6ICc8JwogICAgICAgICAgICAgewotICAgICAgICAgICAgbWF0Y2goIj09PSIpOyAKLQorICAgICAgICAgICAgbWF0Y2goJzwnKTsgCiAKICAgICAgICAgICAgIH0KIApAQCAtMTg2OSwxMSArMTg4MiwxMCBAQAogICAgICAgICB0cnkgewogICAgICAgICAgICAgaW50IF90eXBlID0gVF9fOTQ7CiAgICAgICAgICAgICBpbnQgX2NoYW5uZWwgPSBERUZBVUxUX1RPS0VOX0NIQU5ORUw7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo5Mjo3OiAoICchPT0nICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjkyOjk6ICchPT0nCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo5Mjo3OiAoICc+JyApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo5Mjo5OiAnPicKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIG1hdGNoKCIhPT0iKTsgCi0KKyAgICAgICAgICAgIG1hdGNoKCc+Jyk7IAogCiAgICAgICAgICAgICB9CiAKQEAgLTE4OTAsMTAgKzE5MDIsMTAgQEAKICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgIGludCBfdHlwZSA9IFRfXzk1OwogICAgICAgICAgICAgaW50IF9jaGFubmVsID0gREVGQVVMVF9UT0tFTl9DSEFOTkVMOwotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6OTM6NzogKCAnaW5zdGFuY2VvZicgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6OTM6OTogJ2luc3RhbmNlb2YnCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo5Mzo3OiAoICc+PScgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6OTM6OTogJz49JwogICAgICAgICAgICAgewotICAgICAgICAgICAgbWF0Y2goImluc3RhbmNlb2YiKTsgCisgICAgICAgICAgICBtYXRjaCgiPj0iKTsgCiAKIAogICAgICAgICAgICAgfQpAQCAtMTkxMSwxMCArMTkyMywxMCBAQAogICAgICAgICB0cnkgewogICAgICAgICAgICAgaW50IF90eXBlID0gVF9fOTY7CiAgICAgICAgICAgICBpbnQgX2NoYW5uZWwgPSBERUZBVUxUX1RPS0VOX0NIQU5ORUw7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo5NDo3OiAoICctPicgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6OTQ6OTogJy0+JworICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6OTQ6NzogKCAnfHwnICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjk0Ojk6ICd8fCcKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIG1hdGNoKCItPiIpOyAKKyAgICAgICAgICAgIG1hdGNoKCJ8fCIpOyAKIAogCiAgICAgICAgICAgICB9CkBAIC0xOTMyLDEwICsxOTQ0LDEwIEBACiAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICBpbnQgX3R5cGUgPSBUX185NzsKICAgICAgICAgICAgIGludCBfY2hhbm5lbCA9IERFRkFVTFRfVE9LRU5fQ0hBTk5FTDsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjk1Ojc6ICggJy4uPCcgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6OTU6OTogJy4uPCcKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjk1Ojc6ICggJyYmJyApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo5NTo5OiAnJiYnCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICBtYXRjaCgiLi48Iik7IAorICAgICAgICAgICAgbWF0Y2goIiYmIik7IAogCiAKICAgICAgICAgICAgIH0KQEAgLTE5NTMsMTAgKzE5NjUsMTAgQEAKICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgIGludCBfdHlwZSA9IFRfXzk4OwogICAgICAgICAgICAgaW50IF9jaGFubmVsID0gREVGQVVMVF9UT0tFTl9DSEFOTkVMOwotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6OTY6NzogKCAnLi4nICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjk2Ojk6ICcuLicKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjk2Ojc6ICggJz09JyApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo5Njo5OiAnPT0nCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICBtYXRjaCgiLi4iKTsgCisgICAgICAgICAgICBtYXRjaCgiPT0iKTsgCiAKIAogICAgICAgICAgICAgfQpAQCAtMTk3NCwxMCArMTk4NiwxMCBAQAogICAgICAgICB0cnkgewogICAgICAgICAgICAgaW50IF90eXBlID0gVF9fOTk7CiAgICAgICAgICAgICBpbnQgX2NoYW5uZWwgPSBERUZBVUxUX1RPS0VOX0NIQU5ORUw7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo5Nzo3OiAoICc9PicgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6OTc6OTogJz0+JworICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6OTc6NzogKCAnIT0nICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjk3Ojk6ICchPScKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIG1hdGNoKCI9PiIpOyAKKyAgICAgICAgICAgIG1hdGNoKCIhPSIpOyAKIAogCiAgICAgICAgICAgICB9CkBAIC0xOTk1LDEwICsyMDA3LDEwIEBACiAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICBpbnQgX3R5cGUgPSBUX18xMDA7CiAgICAgICAgICAgICBpbnQgX2NoYW5uZWwgPSBERUZBVUxUX1RPS0VOX0NIQU5ORUw7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo5ODo4OiAoICc8PicgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6OTg6MTA6ICc8PicKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjk4Ojg6ICggJz09PScgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6OTg6MTA6ICc9PT0nCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICBtYXRjaCgiPD4iKTsgCisgICAgICAgICAgICBtYXRjaCgiPT09Iik7IAogCiAKICAgICAgICAgICAgIH0KQEAgLTIwMTYsMTAgKzIwMjgsMTAgQEAKICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgIGludCBfdHlwZSA9IFRfXzEwMTsKICAgICAgICAgICAgIGludCBfY2hhbm5lbCA9IERFRkFVTFRfVE9LRU5fQ0hBTk5FTDsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjk5Ojg6ICggJz86JyApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo5OToxMDogJz86JworICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6OTk6ODogKCAnIT09JyApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo5OToxMDogJyE9PScKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIG1hdGNoKCI/OiIpOyAKKyAgICAgICAgICAgIG1hdGNoKCIhPT0iKTsgCiAKIAogICAgICAgICAgICAgfQpAQCAtMjAzNywxMCArMjA0OSwxMSBAQAogICAgICAgICB0cnkgewogICAgICAgICAgICAgaW50IF90eXBlID0gVF9fMTAyOwogICAgICAgICAgICAgaW50IF9jaGFubmVsID0gREVGQVVMVF9UT0tFTl9DSEFOTkVMOwotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTAwOjg6ICggJysnICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEwMDoxMDogJysnCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMDA6ODogKCAnaW5zdGFuY2VvZicgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTAwOjEwOiAnaW5zdGFuY2VvZicKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIG1hdGNoKCcrJyk7IAorICAgICAgICAgICAgbWF0Y2goImluc3RhbmNlb2YiKTsgCisKIAogICAgICAgICAgICAgfQogCkBAIC0yMDU3LDEwICsyMDcwLDExIEBACiAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICBpbnQgX3R5cGUgPSBUX18xMDM7CiAgICAgICAgICAgICBpbnQgX2NoYW5uZWwgPSBERUZBVUxUX1RPS0VOX0NIQU5ORUw7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMDE6ODogKCAnLScgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTAxOjEwOiAnLScKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEwMTo4OiAoICctPicgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTAxOjEwOiAnLT4nCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICBtYXRjaCgnLScpOyAKKyAgICAgICAgICAgIG1hdGNoKCItPiIpOyAKKwogCiAgICAgICAgICAgICB9CiAKQEAgLTIwNzcsMTAgKzIwOTEsMTAgQEAKICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgIGludCBfdHlwZSA9IFRfXzEwNDsKICAgICAgICAgICAgIGludCBfY2hhbm5lbCA9IERFRkFVTFRfVE9LRU5fQ0hBTk5FTDsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEwMjo4OiAoICcqKicgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTAyOjEwOiAnKionCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMDI6ODogKCAnLi48JyApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMDI6MTA6ICcuLjwnCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICBtYXRjaCgiKioiKTsgCisgICAgICAgICAgICBtYXRjaCgiLi48Iik7IAogCiAKICAgICAgICAgICAgIH0KQEAgLTIwOTgsMTAgKzIxMTIsMTEgQEAKICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgIGludCBfdHlwZSA9IFRfXzEwNTsKICAgICAgICAgICAgIGludCBfY2hhbm5lbCA9IERFRkFVTFRfVE9LRU5fQ0hBTk5FTDsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEwMzo4OiAoICcvJyApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMDM6MTA6ICcvJworICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTAzOjg6ICggJy4uJyApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMDM6MTA6ICcuLicKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIG1hdGNoKCcvJyk7IAorICAgICAgICAgICAgbWF0Y2goIi4uIik7IAorCiAKICAgICAgICAgICAgIH0KIApAQCAtMjExOCwxMCArMjEzMywxMSBAQAogICAgICAgICB0cnkgewogICAgICAgICAgICAgaW50IF90eXBlID0gVF9fMTA2OwogICAgICAgICAgICAgaW50IF9jaGFubmVsID0gREVGQVVMVF9UT0tFTl9DSEFOTkVMOwotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTA0Ojg6ICggJyUnICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEwNDoxMDogJyUnCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMDQ6ODogKCAnPT4nICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEwNDoxMDogJz0+JwogICAgICAgICAgICAgewotICAgICAgICAgICAgbWF0Y2goJyUnKTsgCisgICAgICAgICAgICBtYXRjaCgiPT4iKTsgCisKIAogICAgICAgICAgICAgfQogCkBAIC0yMTM4LDEwICsyMTU0LDExIEBACiAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICBpbnQgX3R5cGUgPSBUX18xMDc7CiAgICAgICAgICAgICBpbnQgX2NoYW5uZWwgPSBERUZBVUxUX1RPS0VOX0NIQU5ORUw7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMDU6ODogKCAnIScgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTA1OjEwOiAnIScKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEwNTo4OiAoICc8PicgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTA1OjEwOiAnPD4nCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICBtYXRjaCgnIScpOyAKKyAgICAgICAgICAgIG1hdGNoKCI8PiIpOyAKKwogCiAgICAgICAgICAgICB9CiAKQEAgLTIxNTgsMTAgKzIxNzUsMTAgQEAKICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgIGludCBfdHlwZSA9IFRfXzEwODsKICAgICAgICAgICAgIGludCBfY2hhbm5lbCA9IERFRkFVTFRfVE9LRU5fQ0hBTk5FTDsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEwNjo4OiAoICcrKycgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTA2OjEwOiAnKysnCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMDY6ODogKCAnPzonICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEwNjoxMDogJz86JwogICAgICAgICAgICAgewotICAgICAgICAgICAgbWF0Y2goIisrIik7IAorICAgICAgICAgICAgbWF0Y2goIj86Iik7IAogCiAKICAgICAgICAgICAgIH0KQEAgLTIxNzksMTEgKzIxOTYsMTAgQEAKICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgIGludCBfdHlwZSA9IFRfXzEwOTsKICAgICAgICAgICAgIGludCBfY2hhbm5lbCA9IERFRkFVTFRfVE9LRU5fQ0hBTk5FTDsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEwNzo4OiAoICctLScgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTA3OjEwOiAnLS0nCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMDc6ODogKCAnKycgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTA3OjEwOiAnKycKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIG1hdGNoKCItLSIpOyAKLQorICAgICAgICAgICAgbWF0Y2goJysnKTsgCiAKICAgICAgICAgICAgIH0KIApAQCAtMjIwMCwxMSArMjIxNiwxMCBAQAogICAgICAgICB0cnkgewogICAgICAgICAgICAgaW50IF90eXBlID0gVF9fMTEwOwogICAgICAgICAgICAgaW50IF9jaGFubmVsID0gREVGQVVMVF9UT0tFTl9DSEFOTkVMOwotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTA4Ojg6ICggJzo6JyApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMDg6MTA6ICc6OicKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEwODo4OiAoICctJyApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMDg6MTA6ICctJwogICAgICAgICAgICAgewotICAgICAgICAgICAgbWF0Y2goIjo6Iik7IAotCisgICAgICAgICAgICBtYXRjaCgnLScpOyAKIAogICAgICAgICAgICAgfQogCkBAIC0yMjIxLDEwICsyMjM2LDEwIEBACiAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICBpbnQgX3R5cGUgPSBUX18xMTE7CiAgICAgICAgICAgICBpbnQgX2NoYW5uZWwgPSBERUZBVUxUX1RPS0VOX0NIQU5ORUw7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMDk6ODogKCAnPy4nICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEwOToxMDogJz8uJworICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTA5Ojg6ICggJyoqJyApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMDk6MTA6ICcqKicKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIG1hdGNoKCI/LiIpOyAKKyAgICAgICAgICAgIG1hdGNoKCIqKiIpOyAKIAogCiAgICAgICAgICAgICB9CkBAIC0yMjQyLDEwICsyMjU3LDEwIEBACiAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICBpbnQgX3R5cGUgPSBUX18xMTI7CiAgICAgICAgICAgICBpbnQgX2NoYW5uZWwgPSBERUZBVUxUX1RPS0VOX0NIQU5ORUw7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMTA6ODogKCAnfCcgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTEwOjEwOiAnfCcKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjExMDo4OiAoICcvJyApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMTA6MTA6ICcvJwogICAgICAgICAgICAgewotICAgICAgICAgICAgbWF0Y2goJ3wnKTsgCisgICAgICAgICAgICBtYXRjaCgnLycpOyAKIAogICAgICAgICAgICAgfQogCkBAIC0yMjYyLDExICsyMjc3LDEwIEBACiAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICBpbnQgX3R5cGUgPSBUX18xMTM7CiAgICAgICAgICAgICBpbnQgX2NoYW5uZWwgPSBERUZBVUxUX1RPS0VOX0NIQU5ORUw7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMTE6ODogKCAnaWYnICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjExMToxMDogJ2lmJworICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTExOjg6ICggJyUnICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjExMToxMDogJyUnCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICBtYXRjaCgiaWYiKTsgCi0KKyAgICAgICAgICAgIG1hdGNoKCclJyk7IAogCiAgICAgICAgICAgICB9CiAKQEAgLTIyODMsMTEgKzIyOTcsMTAgQEAKICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgIGludCBfdHlwZSA9IFRfXzExNDsKICAgICAgICAgICAgIGludCBfY2hhbm5lbCA9IERFRkFVTFRfVE9LRU5fQ0hBTk5FTDsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjExMjo4OiAoICdlbHNlJyApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMTI6MTA6ICdlbHNlJworICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTEyOjg6ICggJyEnICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjExMjoxMDogJyEnCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICBtYXRjaCgiZWxzZSIpOyAKLQorICAgICAgICAgICAgbWF0Y2goJyEnKTsgCiAKICAgICAgICAgICAgIH0KIApAQCAtMjMwNCwxMCArMjMxNywxMCBAQAogICAgICAgICB0cnkgewogICAgICAgICAgICAgaW50IF90eXBlID0gVF9fMTE1OwogICAgICAgICAgICAgaW50IF9jaGFubmVsID0gREVGQVVMVF9UT0tFTl9DSEFOTkVMOwotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTEzOjg6ICggJ3N3aXRjaCcgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTEzOjEwOiAnc3dpdGNoJworICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTEzOjg6ICggJysrJyApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMTM6MTA6ICcrKycKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIG1hdGNoKCJzd2l0Y2giKTsgCisgICAgICAgICAgICBtYXRjaCgiKysiKTsgCiAKIAogICAgICAgICAgICAgfQpAQCAtMjMyNSwxMCArMjMzOCwxMSBAQAogICAgICAgICB0cnkgewogICAgICAgICAgICAgaW50IF90eXBlID0gVF9fMTE2OwogICAgICAgICAgICAgaW50IF9jaGFubmVsID0gREVGQVVMVF9UT0tFTl9DSEFOTkVMOwotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTE0Ojg6ICggJzonICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjExNDoxMDogJzonCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMTQ6ODogKCAnLS0nICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjExNDoxMDogJy0tJwogICAgICAgICAgICAgewotICAgICAgICAgICAgbWF0Y2goJzonKTsgCisgICAgICAgICAgICBtYXRjaCgiLS0iKTsgCisKIAogICAgICAgICAgICAgfQogCkBAIC0yMzQ1LDEwICsyMzU5LDEwIEBACiAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICBpbnQgX3R5cGUgPSBUX18xMTc7CiAgICAgICAgICAgICBpbnQgX2NoYW5uZWwgPSBERUZBVUxUX1RPS0VOX0NIQU5ORUw7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMTU6ODogKCAnZGVmYXVsdCcgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTE1OjEwOiAnZGVmYXVsdCcKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjExNTo4OiAoICc6OicgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTE1OjEwOiAnOjonCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICBtYXRjaCgiZGVmYXVsdCIpOyAKKyAgICAgICAgICAgIG1hdGNoKCI6OiIpOyAKIAogCiAgICAgICAgICAgICB9CkBAIC0yMzY2LDEwICsyMzgwLDEwIEBACiAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICBpbnQgX3R5cGUgPSBUX18xMTg7CiAgICAgICAgICAgICBpbnQgX2NoYW5uZWwgPSBERUZBVUxUX1RPS0VOX0NIQU5ORUw7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMTY6ODogKCAnY2FzZScgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTE2OjEwOiAnY2FzZScKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjExNjo4OiAoICc/LicgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTE2OjEwOiAnPy4nCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICBtYXRjaCgiY2FzZSIpOyAKKyAgICAgICAgICAgIG1hdGNoKCI/LiIpOyAKIAogCiAgICAgICAgICAgICB9CkBAIC0yMzg3LDExICsyNDAxLDEwIEBACiAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICBpbnQgX3R5cGUgPSBUX18xMTk7CiAgICAgICAgICAgICBpbnQgX2NoYW5uZWwgPSBERUZBVUxUX1RPS0VOX0NIQU5ORUw7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMTc6ODogKCAnd2hpbGUnICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjExNzoxMDogJ3doaWxlJworICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTE3Ojg6ICggJ3wnICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjExNzoxMDogJ3wnCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICBtYXRjaCgid2hpbGUiKTsgCi0KKyAgICAgICAgICAgIG1hdGNoKCd8Jyk7IAogCiAgICAgICAgICAgICB9CiAKQEAgLTI0MDgsMTAgKzI0MjEsMTAgQEAKICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgIGludCBfdHlwZSA9IFRfXzEyMDsKICAgICAgICAgICAgIGludCBfY2hhbm5lbCA9IERFRkFVTFRfVE9LRU5fQ0hBTk5FTDsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjExODo4OiAoICdkbycgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTE4OjEwOiAnZG8nCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMTg6ODogKCAnaWYnICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjExODoxMDogJ2lmJwogICAgICAgICAgICAgewotICAgICAgICAgICAgbWF0Y2goImRvIik7IAorICAgICAgICAgICAgbWF0Y2goImlmIik7IAogCiAKICAgICAgICAgICAgIH0KQEAgLTI0MjksMTAgKzI0NDIsMTAgQEAKICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgIGludCBfdHlwZSA9IFRfXzEyMTsKICAgICAgICAgICAgIGludCBfY2hhbm5lbCA9IERFRkFVTFRfVE9LRU5fQ0hBTk5FTDsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjExOTo4OiAoICd2YXInICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjExOToxMDogJ3ZhcicKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjExOTo4OiAoICdlbHNlJyApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMTk6MTA6ICdlbHNlJwogICAgICAgICAgICAgewotICAgICAgICAgICAgbWF0Y2goInZhciIpOyAKKyAgICAgICAgICAgIG1hdGNoKCJlbHNlIik7IAogCiAKICAgICAgICAgICAgIH0KQEAgLTI0NTAsMTAgKzI0NjMsMTAgQEAKICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgIGludCBfdHlwZSA9IFRfXzEyMjsKICAgICAgICAgICAgIGludCBfY2hhbm5lbCA9IERFRkFVTFRfVE9LRU5fQ0hBTk5FTDsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEyMDo4OiAoICd2YWwnICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEyMDoxMDogJ3ZhbCcKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEyMDo4OiAoICdzd2l0Y2gnICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEyMDoxMDogJ3N3aXRjaCcKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIG1hdGNoKCJ2YWwiKTsgCisgICAgICAgICAgICBtYXRjaCgic3dpdGNoIik7IAogCiAKICAgICAgICAgICAgIH0KQEAgLTI0NzEsMTEgKzI0ODQsMTAgQEAKICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgIGludCBfdHlwZSA9IFRfXzEyMzsKICAgICAgICAgICAgIGludCBfY2hhbm5lbCA9IERFRkFVTFRfVE9LRU5fQ0hBTk5FTDsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEyMTo4OiAoICdleHRlbmRzJyApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMjE6MTA6ICdleHRlbmRzJworICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTIxOjg6ICggJzonICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEyMToxMDogJzonCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICBtYXRjaCgiZXh0ZW5kcyIpOyAKLQorICAgICAgICAgICAgbWF0Y2goJzonKTsgCiAKICAgICAgICAgICAgIH0KIApAQCAtMjQ5MiwxMCArMjUwNCwxMCBAQAogICAgICAgICB0cnkgewogICAgICAgICAgICAgaW50IF90eXBlID0gVF9fMTI0OwogICAgICAgICAgICAgaW50IF9jaGFubmVsID0gREVGQVVMVF9UT0tFTl9DSEFOTkVMOwotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTIyOjg6ICggJ3N1cGVyJyApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMjI6MTA6ICdzdXBlcicKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEyMjo4OiAoICdkZWZhdWx0JyApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMjI6MTA6ICdkZWZhdWx0JwogICAgICAgICAgICAgewotICAgICAgICAgICAgbWF0Y2goInN1cGVyIik7IAorICAgICAgICAgICAgbWF0Y2goImRlZmF1bHQiKTsgCiAKIAogICAgICAgICAgICAgfQpAQCAtMjUxMywxMCArMjUyNSwxMCBAQAogICAgICAgICB0cnkgewogICAgICAgICAgICAgaW50IF90eXBlID0gVF9fMTI1OwogICAgICAgICAgICAgaW50IF9jaGFubmVsID0gREVGQVVMVF9UT0tFTl9DSEFOTkVMOwotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTIzOjg6ICggJ25ldycgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTIzOjEwOiAnbmV3JworICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTIzOjg6ICggJ2Nhc2UnICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEyMzoxMDogJ2Nhc2UnCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICBtYXRjaCgibmV3Iik7IAorICAgICAgICAgICAgbWF0Y2goImNhc2UiKTsgCiAKIAogICAgICAgICAgICAgfQpAQCAtMjUzNCwxMCArMjU0NiwxMCBAQAogICAgICAgICB0cnkgewogICAgICAgICAgICAgaW50IF90eXBlID0gVF9fMTI2OwogICAgICAgICAgICAgaW50IF9jaGFubmVsID0gREVGQVVMVF9UT0tFTl9DSEFOTkVMOwotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTI0Ojg6ICggJ2ZhbHNlJyApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMjQ6MTA6ICdmYWxzZScKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEyNDo4OiAoICd3aGlsZScgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTI0OjEwOiAnd2hpbGUnCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICBtYXRjaCgiZmFsc2UiKTsgCisgICAgICAgICAgICBtYXRjaCgid2hpbGUiKTsgCiAKIAogICAgICAgICAgICAgfQpAQCAtMjU1NSwxMCArMjU2NywxMCBAQAogICAgICAgICB0cnkgewogICAgICAgICAgICAgaW50IF90eXBlID0gVF9fMTI3OwogICAgICAgICAgICAgaW50IF9jaGFubmVsID0gREVGQVVMVF9UT0tFTl9DSEFOTkVMOwotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTI1Ojg6ICggJ3RydWUnICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEyNToxMDogJ3RydWUnCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMjU6ODogKCAnZG8nICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEyNToxMDogJ2RvJwogICAgICAgICAgICAgewotICAgICAgICAgICAgbWF0Y2goInRydWUiKTsgCisgICAgICAgICAgICBtYXRjaCgiZG8iKTsgCiAKIAogICAgICAgICAgICAgfQpAQCAtMjU3NiwxMCArMjU4OCwxMCBAQAogICAgICAgICB0cnkgewogICAgICAgICAgICAgaW50IF90eXBlID0gVF9fMTI4OwogICAgICAgICAgICAgaW50IF9jaGFubmVsID0gREVGQVVMVF9UT0tFTl9DSEFOTkVMOwotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTI2Ojg6ICggJ251bGwnICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEyNjoxMDogJ251bGwnCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMjY6ODogKCAndmFyJyApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMjY6MTA6ICd2YXInCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICBtYXRjaCgibnVsbCIpOyAKKyAgICAgICAgICAgIG1hdGNoKCJ2YXIiKTsgCiAKIAogICAgICAgICAgICAgfQpAQCAtMjU5NywxMCArMjYwOSwxMCBAQAogICAgICAgICB0cnkgewogICAgICAgICAgICAgaW50IF90eXBlID0gVF9fMTI5OwogICAgICAgICAgICAgaW50IF9jaGFubmVsID0gREVGQVVMVF9UT0tFTl9DSEFOTkVMOwotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTI3Ojg6ICggJ3R5cGVvZicgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTI3OjEwOiAndHlwZW9mJworICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTI3Ojg6ICggJ3ZhbCcgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTI3OjEwOiAndmFsJwogICAgICAgICAgICAgewotICAgICAgICAgICAgbWF0Y2goInR5cGVvZiIpOyAKKyAgICAgICAgICAgIG1hdGNoKCJ2YWwiKTsgCiAKIAogICAgICAgICAgICAgfQpAQCAtMjYxOCwxMCArMjYzMCwxMCBAQAogICAgICAgICB0cnkgewogICAgICAgICAgICAgaW50IF90eXBlID0gVF9fMTMwOwogICAgICAgICAgICAgaW50IF9jaGFubmVsID0gREVGQVVMVF9UT0tFTl9DSEFOTkVMOwotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTI4Ojg6ICggJ3Rocm93JyApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMjg6MTA6ICd0aHJvdycKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEyODo4OiAoICdleHRlbmRzJyApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMjg6MTA6ICdleHRlbmRzJwogICAgICAgICAgICAgewotICAgICAgICAgICAgbWF0Y2goInRocm93Iik7IAorICAgICAgICAgICAgbWF0Y2goImV4dGVuZHMiKTsgCiAKIAogICAgICAgICAgICAgfQpAQCAtMjYzOSwxMCArMjY1MSwxMCBAQAogICAgICAgICB0cnkgewogICAgICAgICAgICAgaW50IF90eXBlID0gVF9fMTMxOwogICAgICAgICAgICAgaW50IF9jaGFubmVsID0gREVGQVVMVF9UT0tFTl9DSEFOTkVMOwotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTI5Ojg6ICggJ3JldHVybicgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTI5OjEwOiAncmV0dXJuJworICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTI5Ojg6ICggJ3N1cGVyJyApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMjk6MTA6ICdzdXBlcicKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIG1hdGNoKCJyZXR1cm4iKTsgCisgICAgICAgICAgICBtYXRjaCgic3VwZXIiKTsgCiAKIAogICAgICAgICAgICAgfQpAQCAtMjY2MCwxMCArMjY3MiwxMCBAQAogICAgICAgICB0cnkgewogICAgICAgICAgICAgaW50IF90eXBlID0gVF9fMTMyOwogICAgICAgICAgICAgaW50IF9jaGFubmVsID0gREVGQVVMVF9UT0tFTl9DSEFOTkVMOwotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTMwOjg6ICggJ3RyeScgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTMwOjEwOiAndHJ5JworICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTMwOjg6ICggJ25ldycgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTMwOjEwOiAnbmV3JwogICAgICAgICAgICAgewotICAgICAgICAgICAgbWF0Y2goInRyeSIpOyAKKyAgICAgICAgICAgIG1hdGNoKCJuZXciKTsgCiAKIAogICAgICAgICAgICAgfQpAQCAtMjY4MSwxMCArMjY5MywxMCBAQAogICAgICAgICB0cnkgewogICAgICAgICAgICAgaW50IF90eXBlID0gVF9fMTMzOwogICAgICAgICAgICAgaW50IF9jaGFubmVsID0gREVGQVVMVF9UT0tFTl9DSEFOTkVMOwotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTMxOjg6ICggJ2ZpbmFsbHknICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEzMToxMDogJ2ZpbmFsbHknCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMzE6ODogKCAnZmFsc2UnICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEzMToxMDogJ2ZhbHNlJwogICAgICAgICAgICAgewotICAgICAgICAgICAgbWF0Y2goImZpbmFsbHkiKTsgCisgICAgICAgICAgICBtYXRjaCgiZmFsc2UiKTsgCiAKIAogICAgICAgICAgICAgfQpAQCAtMjcwMiwxMCArMjcxNCwxMCBAQAogICAgICAgICB0cnkgewogICAgICAgICAgICAgaW50IF90eXBlID0gVF9fMTM0OwogICAgICAgICAgICAgaW50IF9jaGFubmVsID0gREVGQVVMVF9UT0tFTl9DSEFOTkVMOwotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTMyOjg6ICggJ3N5bmNocm9uaXplZCcgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTMyOjEwOiAnc3luY2hyb25pemVkJworICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTMyOjg6ICggJ3RydWUnICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEzMjoxMDogJ3RydWUnCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICBtYXRjaCgic3luY2hyb25pemVkIik7IAorICAgICAgICAgICAgbWF0Y2goInRydWUiKTsgCiAKIAogICAgICAgICAgICAgfQpAQCAtMjcyMywxMCArMjczNSwxMCBAQAogICAgICAgICB0cnkgewogICAgICAgICAgICAgaW50IF90eXBlID0gVF9fMTM1OwogICAgICAgICAgICAgaW50IF9jaGFubmVsID0gREVGQVVMVF9UT0tFTl9DSEFOTkVMOwotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTMzOjg6ICggJ2NhdGNoJyApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMzM6MTA6ICdjYXRjaCcKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEzMzo4OiAoICdudWxsJyApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMzM6MTA6ICdudWxsJwogICAgICAgICAgICAgewotICAgICAgICAgICAgbWF0Y2goImNhdGNoIik7IAorICAgICAgICAgICAgbWF0Y2goIm51bGwiKTsgCiAKIAogICAgICAgICAgICAgfQpAQCAtMjc0NCwxMCArMjc1NiwxMSBAQAogICAgICAgICB0cnkgewogICAgICAgICAgICAgaW50IF90eXBlID0gVF9fMTM2OwogICAgICAgICAgICAgaW50IF9jaGFubmVsID0gREVGQVVMVF9UT0tFTl9DSEFOTkVMOwotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTM0Ojg6ICggJz8nICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEzNDoxMDogJz8nCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMzQ6ODogKCAndHlwZW9mJyApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMzQ6MTA6ICd0eXBlb2YnCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICBtYXRjaCgnPycpOyAKKyAgICAgICAgICAgIG1hdGNoKCJ0eXBlb2YiKTsgCisKIAogICAgICAgICAgICAgfQogCkBAIC0yNzY0LDEwICsyNzc3LDExIEBACiAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICBpbnQgX3R5cGUgPSBUX18xMzc7CiAgICAgICAgICAgICBpbnQgX2NoYW5uZWwgPSBERUZBVUxUX1RPS0VOX0NIQU5ORUw7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMzU6ODogKCAnJicgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTM1OjEwOiAnJicKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEzNTo4OiAoICd0aHJvdycgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTM1OjEwOiAndGhyb3cnCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICBtYXRjaCgnJicpOyAKKyAgICAgICAgICAgIG1hdGNoKCJ0aHJvdyIpOyAKKwogCiAgICAgICAgICAgICB9CiAKQEAgLTI3ODQsMTAgKzI3OTgsMTAgQEAKICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgIGludCBfdHlwZSA9IFRfXzEzODsKICAgICAgICAgICAgIGludCBfY2hhbm5lbCA9IERFRkFVTFRfVE9LRU5fQ0hBTk5FTDsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEzNjo4OiAoICdwbGFpbicgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTM2OjEwOiAncGxhaW4nCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMzY6ODogKCAncmV0dXJuJyApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMzY6MTA6ICdyZXR1cm4nCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICBtYXRjaCgicGxhaW4iKTsgCisgICAgICAgICAgICBtYXRjaCgicmV0dXJuIik7IAogCiAKICAgICAgICAgICAgIH0KQEAgLTI4MDUsMTAgKzI4MTksMTAgQEAKICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgIGludCBfdHlwZSA9IFRfXzEzOTsKICAgICAgICAgICAgIGludCBfY2hhbm5lbCA9IERFRkFVTFRfVE9LRU5fQ0hBTk5FTDsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEzNzo4OiAoICdqcGcnICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEzNzoxMDogJ2pwZycKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEzNzo4OiAoICd0cnknICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEzNzoxMDogJ3RyeScKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIG1hdGNoKCJqcGciKTsgCisgICAgICAgICAgICBtYXRjaCgidHJ5Iik7IAogCiAKICAgICAgICAgICAgIH0KQEAgLTI4MjYsMTAgKzI4NDAsMTAgQEAKICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgIGludCBfdHlwZSA9IFRfXzE0MDsKICAgICAgICAgICAgIGludCBfY2hhbm5lbCA9IERFRkFVTFRfVE9LRU5fQ0hBTk5FTDsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEzODo4OiAoICdwbmcnICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEzODoxMDogJ3BuZycKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEzODo4OiAoICdmaW5hbGx5JyApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMzg6MTA6ICdmaW5hbGx5JwogICAgICAgICAgICAgewotICAgICAgICAgICAgbWF0Y2goInBuZyIpOyAKKyAgICAgICAgICAgIG1hdGNoKCJmaW5hbGx5Iik7IAogCiAKICAgICAgICAgICAgIH0KQEAgLTI4NDcsMTAgKzI4NjEsMTAgQEAKICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgIGludCBfdHlwZSA9IFRfXzE0MTsKICAgICAgICAgICAgIGludCBfY2hhbm5lbCA9IERFRkFVTFRfVE9LRU5fQ0hBTk5FTDsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEzOTo4OiAoICdtcGVnJyApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMzk6MTA6ICdtcGVnJworICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTM5Ojg6ICggJ3N5bmNocm9uaXplZCcgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTM5OjEwOiAnc3luY2hyb25pemVkJwogICAgICAgICAgICAgewotICAgICAgICAgICAgbWF0Y2goIm1wZWciKTsgCisgICAgICAgICAgICBtYXRjaCgic3luY2hyb25pemVkIik7IAogCiAKICAgICAgICAgICAgIH0KQEAgLTI4NjgsMTAgKzI4ODIsMTAgQEAKICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgIGludCBfdHlwZSA9IFRfXzE0MjsKICAgICAgICAgICAgIGludCBfY2hhbm5lbCA9IERFRkFVTFRfVE9LRU5fQ0hBTk5FTDsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE0MDo4OiAoICdvY3RldC1zdHJlYW0nICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE0MDoxMDogJ29jdGV0LXN0cmVhbScKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE0MDo4OiAoICdjYXRjaCcgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTQwOjEwOiAnY2F0Y2gnCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICBtYXRjaCgib2N0ZXQtc3RyZWFtIik7IAorICAgICAgICAgICAgbWF0Y2goImNhdGNoIik7IAogCiAKICAgICAgICAgICAgIH0KQEAgLTI4ODksMTEgKzI5MDMsMTAgQEAKICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgIGludCBfdHlwZSA9IFRfXzE0MzsKICAgICAgICAgICAgIGludCBfY2hhbm5lbCA9IERFRkFVTFRfVE9LRU5fQ0hBTk5FTDsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE0MTo4OiAoICdwZGYnICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE0MToxMDogJ3BkZicKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE0MTo4OiAoICc/JyApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNDE6MTA6ICc/JwogICAgICAgICAgICAgewotICAgICAgICAgICAgbWF0Y2goInBkZiIpOyAKLQorICAgICAgICAgICAgbWF0Y2goJz8nKTsgCiAKICAgICAgICAgICAgIH0KIApAQCAtMjkxMCwxMSArMjkyMywxMCBAQAogICAgICAgICB0cnkgewogICAgICAgICAgICAgaW50IF90eXBlID0gVF9fMTQ0OwogICAgICAgICAgICAgaW50IF9jaGFubmVsID0gREVGQVVMVF9UT0tFTl9DSEFOTkVMOwotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTQyOjg6ICggJ05vd0RhdGUnICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE0MjoxMDogJ05vd0RhdGUnCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNDI6ODogKCAnJicgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTQyOjEwOiAnJicKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIG1hdGNoKCJOb3dEYXRlIik7IAotCisgICAgICAgICAgICBtYXRjaCgnJicpOyAKIAogICAgICAgICAgICAgfQogCkBAIC0yOTMxLDEwICsyOTQzLDEwIEBACiAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICBpbnQgX3R5cGUgPSBUX18xNDU7CiAgICAgICAgICAgICBpbnQgX2NoYW5uZWwgPSBERUZBVUxUX1RPS0VOX0NIQU5ORUw7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNDM6ODogKCAnU3RhcnREYXRlJyApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNDM6MTA6ICdTdGFydERhdGUnCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNDM6ODogKCAncGxhaW4nICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE0MzoxMDogJ3BsYWluJwogICAgICAgICAgICAgewotICAgICAgICAgICAgbWF0Y2goIlN0YXJ0RGF0ZSIpOyAKKyAgICAgICAgICAgIG1hdGNoKCJwbGFpbiIpOyAKIAogCiAgICAgICAgICAgICB9CkBAIC0yOTUyLDEwICsyOTY0LDEwIEBACiAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICBpbnQgX3R5cGUgPSBUX18xNDY7CiAgICAgICAgICAgICBpbnQgX2NoYW5uZWwgPSBERUZBVUxUX1RPS0VOX0NIQU5ORUw7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNDQ6ODogKCAnVW5pdmVyc2FsbHlVbmlxdWVJZGVudGlmaWVyJyApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNDQ6MTA6ICdVbml2ZXJzYWxseVVuaXF1ZUlkZW50aWZpZXInCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNDQ6ODogKCAnanBnJyApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNDQ6MTA6ICdqcGcnCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICBtYXRjaCgiVW5pdmVyc2FsbHlVbmlxdWVJZGVudGlmaWVyIik7IAorICAgICAgICAgICAgbWF0Y2goImpwZyIpOyAKIAogCiAgICAgICAgICAgICB9CkBAIC0yOTczLDEwICsyOTg1LDEwIEBACiAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICBpbnQgX3R5cGUgPSBUX18xNDc7CiAgICAgICAgICAgICBpbnQgX2NoYW5uZWwgPSBERUZBVUxUX1RPS0VOX0NIQU5ORUw7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNDU6ODogKCAnRGF0ZScgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTQ1OjEwOiAnRGF0ZScKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE0NTo4OiAoICdwbmcnICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE0NToxMDogJ3BuZycKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIG1hdGNoKCJEYXRlIik7IAorICAgICAgICAgICAgbWF0Y2goInBuZyIpOyAKIAogCiAgICAgICAgICAgICB9CkBAIC0yOTk0LDEwICszMDA2LDEwIEBACiAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICBpbnQgX3R5cGUgPSBUX18xNDg7CiAgICAgICAgICAgICBpbnQgX2NoYW5uZWwgPSBERUZBVUxUX1RPS0VOX0NIQU5ORUw7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNDY6ODogKCAnTWlsbGlzZWNvbmRzJyApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNDY6MTA6ICdNaWxsaXNlY29uZHMnCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNDY6ODogKCAnbXBlZycgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTQ2OjEwOiAnbXBlZycKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIG1hdGNoKCJNaWxsaXNlY29uZHMiKTsgCisgICAgICAgICAgICBtYXRjaCgibXBlZyIpOyAKIAogCiAgICAgICAgICAgICB9CkBAIC0zMDE1LDEwICszMDI3LDEwIEBACiAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICBpbnQgX3R5cGUgPSBUX18xNDk7CiAgICAgICAgICAgICBpbnQgX2NoYW5uZWwgPSBERUZBVUxUX1RPS0VOX0NIQU5ORUw7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNDc6ODogKCAnTmFub3NlY29uZHMnICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE0NzoxMDogJ05hbm9zZWNvbmRzJworICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTQ3Ojg6ICggJ29jdGV0LXN0cmVhbScgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTQ3OjEwOiAnb2N0ZXQtc3RyZWFtJwogICAgICAgICAgICAgewotICAgICAgICAgICAgbWF0Y2goIk5hbm9zZWNvbmRzIik7IAorICAgICAgICAgICAgbWF0Y2goIm9jdGV0LXN0cmVhbSIpOyAKIAogCiAgICAgICAgICAgICB9CkBAIC0zMDM2LDEwICszMDQ4LDEwIEBACiAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICBpbnQgX3R5cGUgPSBUX18xNTA7CiAgICAgICAgICAgICBpbnQgX2NoYW5uZWwgPSBERUZBVUxUX1RPS0VOX0NIQU5ORUw7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNDg6ODogKCAnUmFuZG9tJyApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNDg6MTA6ICdSYW5kb20nCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNDg6ODogKCAncGRmJyApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNDg6MTA6ICdwZGYnCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICBtYXRjaCgiUmFuZG9tIik7IAorICAgICAgICAgICAgbWF0Y2goInBkZiIpOyAKIAogCiAgICAgICAgICAgICB9CkBAIC0zMDU3LDEwICszMDY5LDEwIEBACiAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICBpbnQgX3R5cGUgPSBUX18xNTE7CiAgICAgICAgICAgICBpbnQgX2NoYW5uZWwgPSBERUZBVUxUX1RPS0VOX0NIQU5ORUw7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNDk6ODogKCAnRXhlY3V0ZUNvbnRleHQnICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE0OToxMDogJ0V4ZWN1dGVDb250ZXh0JworICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTQ5Ojg6ICggJ05vd0RhdGUnICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE0OToxMDogJ05vd0RhdGUnCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICBtYXRjaCgiRXhlY3V0ZUNvbnRleHQiKTsgCisgICAgICAgICAgICBtYXRjaCgiTm93RGF0ZSIpOyAKIAogCiAgICAgICAgICAgICB9CkBAIC0zMDc4LDEwICszMDkwLDEwIEBACiAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICBpbnQgX3R5cGUgPSBUX18xNTI7CiAgICAgICAgICAgICBpbnQgX2NoYW5uZWwgPSBERUZBVUxUX1RPS0VOX0NIQU5ORUw7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNTA6ODogKCAncGVyc2lzdCcgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTUwOjEwOiAncGVyc2lzdCcKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE1MDo4OiAoICdTdGFydERhdGUnICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE1MDoxMDogJ1N0YXJ0RGF0ZScKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIG1hdGNoKCJwZXJzaXN0Iik7IAorICAgICAgICAgICAgbWF0Y2goIlN0YXJ0RGF0ZSIpOyAKIAogCiAgICAgICAgICAgICB9CkBAIC0zMDk5LDEwICszMTExLDEwIEBACiAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICBpbnQgX3R5cGUgPSBUX18xNTM7CiAgICAgICAgICAgICBpbnQgX2NoYW5uZWwgPSBERUZBVUxUX1RPS0VOX0NIQU5ORUw7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNTE6ODogKCAnbWVyZ2UnICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE1MToxMDogJ21lcmdlJworICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTUxOjg6ICggJ1VuaXZlcnNhbGx5VW5pcXVlSWRlbnRpZmllcicgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTUxOjEwOiAnVW5pdmVyc2FsbHlVbmlxdWVJZGVudGlmaWVyJwogICAgICAgICAgICAgewotICAgICAgICAgICAgbWF0Y2goIm1lcmdlIik7IAorICAgICAgICAgICAgbWF0Y2goIlVuaXZlcnNhbGx5VW5pcXVlSWRlbnRpZmllciIpOyAKIAogCiAgICAgICAgICAgICB9CkBAIC0zMTIwLDEwICszMTMyLDEwIEBACiAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICBpbnQgX3R5cGUgPSBUX18xNTQ7CiAgICAgICAgICAgICBpbnQgX2NoYW5uZWwgPSBERUZBVUxUX1RPS0VOX0NIQU5ORUw7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNTI6ODogKCAncmVtb3ZlJyApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNTI6MTA6ICdyZW1vdmUnCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNTI6ODogKCAnRGF0ZScgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTUyOjEwOiAnRGF0ZScKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIG1hdGNoKCJyZW1vdmUiKTsgCisgICAgICAgICAgICBtYXRjaCgiRGF0ZSIpOyAKIAogCiAgICAgICAgICAgICB9CkBAIC0zMTM2LDE1ICszMTQ4LDI2NyBAQAogICAgIH0KICAgICAvLyAkQU5UTFIgZW5kICJUX18xNTQiCiAKKyAgICAvLyAkQU5UTFIgc3RhcnQgIlRfXzE1NSIKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBtVF9fMTU1KCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGludCBfdHlwZSA9IFRfXzE1NTsKKyAgICAgICAgICAgIGludCBfY2hhbm5lbCA9IERFRkFVTFRfVE9LRU5fQ0hBTk5FTDsKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE1Mzo4OiAoICdNaWxsaXNlY29uZHMnICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE1MzoxMDogJ01pbGxpc2Vjb25kcycKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIG1hdGNoKCJNaWxsaXNlY29uZHMiKTsgCisKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzdGF0ZS50eXBlID0gX3R5cGU7CisgICAgICAgICAgICBzdGF0ZS5jaGFubmVsID0gX2NoYW5uZWw7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAiVF9fMTU1IgorCisgICAgLy8gJEFOVExSIHN0YXJ0ICJUX18xNTYiCisgICAgcHVibGljIGZpbmFsIHZvaWQgbVRfXzE1NigpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpbnQgX3R5cGUgPSBUX18xNTY7CisgICAgICAgICAgICBpbnQgX2NoYW5uZWwgPSBERUZBVUxUX1RPS0VOX0NIQU5ORUw7CisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNTQ6ODogKCAnTmFub3NlY29uZHMnICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE1NDoxMDogJ05hbm9zZWNvbmRzJworICAgICAgICAgICAgeworICAgICAgICAgICAgbWF0Y2goIk5hbm9zZWNvbmRzIik7IAorCisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3RhdGUudHlwZSA9IF90eXBlOworICAgICAgICAgICAgc3RhdGUuY2hhbm5lbCA9IF9jaGFubmVsOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgIlRfXzE1NiIKKworICAgIC8vICRBTlRMUiBzdGFydCAiVF9fMTU3IgorICAgIHB1YmxpYyBmaW5hbCB2b2lkIG1UX18xNTcoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgaW50IF90eXBlID0gVF9fMTU3OworICAgICAgICAgICAgaW50IF9jaGFubmVsID0gREVGQVVMVF9UT0tFTl9DSEFOTkVMOworICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTU1Ojg6ICggJ1JhbmRvbScgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTU1OjEwOiAnUmFuZG9tJworICAgICAgICAgICAgeworICAgICAgICAgICAgbWF0Y2goIlJhbmRvbSIpOyAKKworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN0YXRlLnR5cGUgPSBfdHlwZTsKKyAgICAgICAgICAgIHN0YXRlLmNoYW5uZWwgPSBfY2hhbm5lbDsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJUX18xNTciCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgIlRfXzE1OCIKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBtVF9fMTU4KCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGludCBfdHlwZSA9IFRfXzE1ODsKKyAgICAgICAgICAgIGludCBfY2hhbm5lbCA9IERFRkFVTFRfVE9LRU5fQ0hBTk5FTDsKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE1Njo4OiAoICdFeGVjdXRlQ29udGV4dCcgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTU2OjEwOiAnRXhlY3V0ZUNvbnRleHQnCisgICAgICAgICAgICB7CisgICAgICAgICAgICBtYXRjaCgiRXhlY3V0ZUNvbnRleHQiKTsgCisKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzdGF0ZS50eXBlID0gX3R5cGU7CisgICAgICAgICAgICBzdGF0ZS5jaGFubmVsID0gX2NoYW5uZWw7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAiVF9fMTU4IgorCisgICAgLy8gJEFOVExSIHN0YXJ0ICJUX18xNTkiCisgICAgcHVibGljIGZpbmFsIHZvaWQgbVRfXzE1OSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpbnQgX3R5cGUgPSBUX18xNTk7CisgICAgICAgICAgICBpbnQgX2NoYW5uZWwgPSBERUZBVUxUX1RPS0VOX0NIQU5ORUw7CisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNTc6ODogKCAncGVyc2lzdCcgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTU3OjEwOiAncGVyc2lzdCcKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIG1hdGNoKCJwZXJzaXN0Iik7IAorCisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3RhdGUudHlwZSA9IF90eXBlOworICAgICAgICAgICAgc3RhdGUuY2hhbm5lbCA9IF9jaGFubmVsOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgIlRfXzE1OSIKKworICAgIC8vICRBTlRMUiBzdGFydCAiVF9fMTYwIgorICAgIHB1YmxpYyBmaW5hbCB2b2lkIG1UX18xNjAoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgaW50IF90eXBlID0gVF9fMTYwOworICAgICAgICAgICAgaW50IF9jaGFubmVsID0gREVGQVVMVF9UT0tFTl9DSEFOTkVMOworICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTU4Ojg6ICggJ21lcmdlJyApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNTg6MTA6ICdtZXJnZScKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIG1hdGNoKCJtZXJnZSIpOyAKKworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN0YXRlLnR5cGUgPSBfdHlwZTsKKyAgICAgICAgICAgIHN0YXRlLmNoYW5uZWwgPSBfY2hhbm5lbDsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJUX18xNjAiCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgIlRfXzE2MSIKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBtVF9fMTYxKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGludCBfdHlwZSA9IFRfXzE2MTsKKyAgICAgICAgICAgIGludCBfY2hhbm5lbCA9IERFRkFVTFRfVE9LRU5fQ0hBTk5FTDsKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE1OTo4OiAoICdyZW1vdmUnICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE1OToxMDogJ3JlbW92ZScKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIG1hdGNoKCJyZW1vdmUiKTsgCisKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzdGF0ZS50eXBlID0gX3R5cGU7CisgICAgICAgICAgICBzdGF0ZS5jaGFubmVsID0gX2NoYW5uZWw7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAiVF9fMTYxIgorCisgICAgLy8gJEFOVExSIHN0YXJ0ICJUX18xNjIiCisgICAgcHVibGljIGZpbmFsIHZvaWQgbVRfXzE2MigpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpbnQgX3R5cGUgPSBUX18xNjI7CisgICAgICAgICAgICBpbnQgX2NoYW5uZWwgPSBERUZBVUxUX1RPS0VOX0NIQU5ORUw7CisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNjA6ODogKCAnPD0nICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE2MDoxMDogJzw9JworICAgICAgICAgICAgeworICAgICAgICAgICAgbWF0Y2goIjw9Iik7IAorCisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3RhdGUudHlwZSA9IF90eXBlOworICAgICAgICAgICAgc3RhdGUuY2hhbm5lbCA9IF9jaGFubmVsOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgIlRfXzE2MiIKKworICAgIC8vICRBTlRMUiBzdGFydCAiVF9fMTYzIgorICAgIHB1YmxpYyBmaW5hbCB2b2lkIG1UX18xNjMoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgaW50IF90eXBlID0gVF9fMTYzOworICAgICAgICAgICAgaW50IF9jaGFubmVsID0gREVGQVVMVF9UT0tFTl9DSEFOTkVMOworICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTYxOjg6ICggJ2lzbnVsbCcgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTYxOjEwOiAnaXNudWxsJworICAgICAgICAgICAgeworICAgICAgICAgICAgbWF0Y2goImlzbnVsbCIpOyAKKworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN0YXRlLnR5cGUgPSBfdHlwZTsKKyAgICAgICAgICAgIHN0YXRlLmNoYW5uZWwgPSBfY2hhbm5lbDsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJUX18xNjMiCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgIlRfXzE2NCIKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBtVF9fMTY0KCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGludCBfdHlwZSA9IFRfXzE2NDsKKyAgICAgICAgICAgIGludCBfY2hhbm5lbCA9IERFRkFVTFRfVE9LRU5fQ0hBTk5FTDsKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE2Mjo4OiAoICdpc25vdG51bGwnICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE2MjoxMDogJ2lzbm90bnVsbCcKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIG1hdGNoKCJpc25vdG51bGwiKTsgCisKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzdGF0ZS50eXBlID0gX3R5cGU7CisgICAgICAgICAgICBzdGF0ZS5jaGFubmVsID0gX2NoYW5uZWw7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAiVF9fMTY0IgorCisgICAgLy8gJEFOVExSIHN0YXJ0ICJUX18xNjUiCisgICAgcHVibGljIGZpbmFsIHZvaWQgbVRfXzE2NSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpbnQgX3R5cGUgPSBUX18xNjU7CisgICAgICAgICAgICBpbnQgX2NoYW5uZWwgPSBERUZBVUxUX1RPS0VOX0NIQU5ORUw7CisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNjM6ODogKCAnYW5kJyApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNjM6MTA6ICdhbmQnCisgICAgICAgICAgICB7CisgICAgICAgICAgICBtYXRjaCgiYW5kIik7IAorCisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3RhdGUudHlwZSA9IF90eXBlOworICAgICAgICAgICAgc3RhdGUuY2hhbm5lbCA9IF9jaGFubmVsOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgIlRfXzE2NSIKKworICAgIC8vICRBTlRMUiBzdGFydCAiVF9fMTY2IgorICAgIHB1YmxpYyBmaW5hbCB2b2lkIG1UX18xNjYoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgaW50IF90eXBlID0gVF9fMTY2OworICAgICAgICAgICAgaW50IF9jaGFubmVsID0gREVGQVVMVF9UT0tFTl9DSEFOTkVMOworICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTY0Ojg6ICggJ29yJyApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNjQ6MTA6ICdvcicKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIG1hdGNoKCJvciIpOyAKKworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN0YXRlLnR5cGUgPSBfdHlwZTsKKyAgICAgICAgICAgIHN0YXRlLmNoYW5uZWwgPSBfY2hhbm5lbDsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJUX18xNjYiCisKICAgICAvLyAkQU5UTFIgc3RhcnQgIlJVTEVfSEVYIgogICAgIHB1YmxpYyBmaW5hbCB2b2lkIG1SVUxFX0hFWCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICBpbnQgX3R5cGUgPSBSVUxFX0hFWDsKICAgICAgICAgICAgIGludCBfY2hhbm5lbCA9IERFRkFVTFRfVE9LRU5fQ0hBTk5FTDsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjk0MTA6MTA6ICggKCAnMHgnIHwgJzBYJyApICggJzAnIC4uICc5JyB8ICdhJyAuLiAnZicgfCAnQScgLi4gJ0YnIHwgJ18nICkrICggJyMnICggKCAnYicgfCAnQicgKSAoICdpJyB8ICdJJyApIHwgKCAnbCcgfCAnTCcgKSApICk/ICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjk0MTA6MTI6ICggJzB4JyB8ICcwWCcgKSAoICcwJyAuLiAnOScgfCAnYScgLi4gJ2YnIHwgJ0EnIC4uICdGJyB8ICdfJyApKyAoICcjJyAoICggJ2InIHwgJ0InICkgKCAnaScgfCAnSScgKSB8ICggJ2wnIHwgJ0wnICkgKSApPworICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6OTk1MToxMDogKCAoICcweCcgfCAnMFgnICkgKCAnMCcgLi4gJzknIHwgJ2EnIC4uICdmJyB8ICdBJyAuLiAnRicgfCAnXycgKSsgKCAnIycgKCAoICdiJyB8ICdCJyApICggJ2knIHwgJ0knICkgfCAoICdsJyB8ICdMJyApICkgKT8gKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6OTk1MToxMjogKCAnMHgnIHwgJzBYJyApICggJzAnIC4uICc5JyB8ICdhJyAuLiAnZicgfCAnQScgLi4gJ0YnIHwgJ18nICkrICggJyMnICggKCAnYicgfCAnQicgKSAoICdpJyB8ICdJJyApIHwgKCAnbCcgfCAnTCcgKSApICk/CiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo5NDEwOjEyOiAoICcweCcgfCAnMFgnICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjk5NTE6MTI6ICggJzB4JyB8ICcwWCcgKQogICAgICAgICAgICAgaW50IGFsdDE9MjsKICAgICAgICAgICAgIGludCBMQTFfMCA9IGlucHV0LkxBKDEpOwogCkBAIC0zMTcyLDcgKzM0MzYsNyBAQAogICAgICAgICAgICAgfQogICAgICAgICAgICAgc3dpdGNoIChhbHQxKSB7CiAgICAgICAgICAgICAgICAgY2FzZSAxIDoKLSAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6OTQxMDoxMzogJzB4JworICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo5OTUxOjEzOiAnMHgnCiAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgbWF0Y2goIjB4Iik7IAogCkBAIC0zMTgwLDcgKzM0NDQsNyBAQAogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgIGNhc2UgMiA6Ci0gICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjk0MTA6MTg6ICcwWCcKKyAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6OTk1MToxODogJzBYJwogICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgIG1hdGNoKCIwWCIpOyAKIApAQCAtMzE5MCw3ICszNDU0LDcgQEAKIAogICAgICAgICAgICAgfQogCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo5NDEwOjI0OiAoICcwJyAuLiAnOScgfCAnYScgLi4gJ2YnIHwgJ0EnIC4uICdGJyB8ICdfJyApKworICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6OTk1MToyNDogKCAnMCcgLi4gJzknIHwgJ2EnIC4uICdmJyB8ICdBJyAuLiAnRicgfCAnXycgKSsKICAgICAgICAgICAgIGludCBjbnQyPTA7CiAgICAgICAgICAgICBsb29wMjoKICAgICAgICAgICAgIGRvIHsKQEAgLTMyMjgsNyArMzQ5Miw3IEBACiAgICAgICAgICAgICAgICAgY250MisrOwogICAgICAgICAgICAgfSB3aGlsZSAodHJ1ZSk7CiAKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjk0MTA6NTg6ICggJyMnICggKCAnYicgfCAnQicgKSAoICdpJyB8ICdJJyApIHwgKCAnbCcgfCAnTCcgKSApICk/CisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo5OTUxOjU4OiAoICcjJyAoICggJ2InIHwgJ0InICkgKCAnaScgfCAnSScgKSB8ICggJ2wnIHwgJ0wnICkgKSApPwogICAgICAgICAgICAgaW50IGFsdDQ9MjsKICAgICAgICAgICAgIGludCBMQTRfMCA9IGlucHV0LkxBKDEpOwogCkBAIC0zMjM3LDEwICszNTAxLDEwIEBACiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBzd2l0Y2ggKGFsdDQpIHsKICAgICAgICAgICAgICAgICBjYXNlIDEgOgotICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo5NDEwOjU5OiAnIycgKCAoICdiJyB8ICdCJyApICggJ2knIHwgJ0knICkgfCAoICdsJyB8ICdMJyApICkKKyAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6OTk1MTo1OTogJyMnICggKCAnYicgfCAnQicgKSAoICdpJyB8ICdJJyApIHwgKCAnbCcgfCAnTCcgKSApCiAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgbWF0Y2goJyMnKTsgCi0gICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjk0MTA6NjM6ICggKCAnYicgfCAnQicgKSAoICdpJyB8ICdJJyApIHwgKCAnbCcgfCAnTCcgKSApCisgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjk5NTE6NjM6ICggKCAnYicgfCAnQicgKSAoICdpJyB8ICdJJyApIHwgKCAnbCcgfCAnTCcgKSApCiAgICAgICAgICAgICAgICAgICAgIGludCBhbHQzPTI7CiAgICAgICAgICAgICAgICAgICAgIGludCBMQTNfMCA9IGlucHV0LkxBKDEpOwogCkBAIC0zMjU4LDcgKzM1MjIsNyBAQAogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoYWx0MykgewogICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxIDoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo5NDEwOjY0OiAoICdiJyB8ICdCJyApICggJ2knIHwgJ0knICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo5OTUxOjY0OiAoICdiJyB8ICdCJyApICggJ2knIHwgJ0knICkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCBpbnB1dC5MQSgxKT09J0InfHxpbnB1dC5MQSgxKT09J2InICkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dC5jb25zdW1lKCk7CkBAIC0zMjgyLDcgKzM1NDYsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMiA6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6OTQxMDo4NDogKCAnbCcgfCAnTCcgKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjk5NTE6ODQ6ICggJ2wnIHwgJ0wnICkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCBpbnB1dC5MQSgxKT09J0wnfHxpbnB1dC5MQSgxKT09J2wnICkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dC5jb25zdW1lKCk7CkBAIC0zMzIxLDExICszNTg1LDExIEBACiAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICBpbnQgX3R5cGUgPSBSVUxFX0lOVDsKICAgICAgICAgICAgIGludCBfY2hhbm5lbCA9IERFRkFVTFRfVE9LRU5fQ0hBTk5FTDsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjk0MTI6MTA6ICggJzAnIC4uICc5JyAoICcwJyAuLiAnOScgfCAnXycgKSogKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6OTQxMjoxMjogJzAnIC4uICc5JyAoICcwJyAuLiAnOScgfCAnXycgKSoKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjk5NTM6MTA6ICggJzAnIC4uICc5JyAoICcwJyAuLiAnOScgfCAnXycgKSogKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6OTk1MzoxMjogJzAnIC4uICc5JyAoICcwJyAuLiAnOScgfCAnXycgKSoKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIG1hdGNoUmFuZ2UoJzAnLCc5Jyk7IAotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6OTQxMjoyMTogKCAnMCcgLi4gJzknIHwgJ18nICkqCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo5OTUzOjIxOiAoICcwJyAuLiAnOScgfCAnXycgKSoKICAgICAgICAgICAgIGxvb3A1OgogICAgICAgICAgICAgZG8gewogICAgICAgICAgICAgICAgIGludCBhbHQ1PTI7CkBAIC0zMzc0LDExICszNjM4LDExIEBACiAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICBpbnQgX3R5cGUgPSBSVUxFX0RFQ0lNQUw7CiAgICAgICAgICAgICBpbnQgX2NoYW5uZWwgPSBERUZBVUxUX1RPS0VOX0NIQU5ORUw7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo5NDE0OjE0OiAoIFJVTEVfSU5UICggKCAnZScgfCAnRScgKSAoICcrJyB8ICctJyApPyBSVUxFX0lOVCApPyAoICggJ2InIHwgJ0InICkgKCAnaScgfCAnSScgfCAnZCcgfCAnRCcgKSB8ICggJ2wnIHwgJ0wnIHwgJ2QnIHwgJ0QnIHwgJ2YnIHwgJ0YnICkgKT8gKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6OTQxNDoxNjogUlVMRV9JTlQgKCAoICdlJyB8ICdFJyApICggJysnIHwgJy0nICk/IFJVTEVfSU5UICk/ICggKCAnYicgfCAnQicgKSAoICdpJyB8ICdJJyB8ICdkJyB8ICdEJyApIHwgKCAnbCcgfCAnTCcgfCAnZCcgfCAnRCcgfCAnZicgfCAnRicgKSApPworICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6OTk1NToxNDogKCBSVUxFX0lOVCAoICggJ2UnIHwgJ0UnICkgKCAnKycgfCAnLScgKT8gUlVMRV9JTlQgKT8gKCAoICdiJyB8ICdCJyApICggJ2knIHwgJ0knIHwgJ2QnIHwgJ0QnICkgfCAoICdsJyB8ICdMJyB8ICdkJyB8ICdEJyB8ICdmJyB8ICdGJyApICk/ICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjk5NTU6MTY6IFJVTEVfSU5UICggKCAnZScgfCAnRScgKSAoICcrJyB8ICctJyApPyBSVUxFX0lOVCApPyAoICggJ2InIHwgJ0InICkgKCAnaScgfCAnSScgfCAnZCcgfCAnRCcgKSB8ICggJ2wnIHwgJ0wnIHwgJ2QnIHwgJ0QnIHwgJ2YnIHwgJ0YnICkgKT8KICAgICAgICAgICAgIHsKICAgICAgICAgICAgIG1SVUxFX0lOVCgpOyAKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjk0MTQ6MjU6ICggKCAnZScgfCAnRScgKSAoICcrJyB8ICctJyApPyBSVUxFX0lOVCApPworICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6OTk1NToyNTogKCAoICdlJyB8ICdFJyApICggJysnIHwgJy0nICk/IFJVTEVfSU5UICk/CiAgICAgICAgICAgICBpbnQgYWx0Nz0yOwogICAgICAgICAgICAgaW50IExBN18wID0gaW5wdXQuTEEoMSk7CiAKQEAgLTMzODcsNyArMzY1MSw3IEBACiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBzd2l0Y2ggKGFsdDcpIHsKICAgICAgICAgICAgICAgICBjYXNlIDEgOgotICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo5NDE0OjI2OiAoICdlJyB8ICdFJyApICggJysnIHwgJy0nICk/IFJVTEVfSU5UCisgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjk5NTU6MjY6ICggJ2UnIHwgJ0UnICkgKCAnKycgfCAnLScgKT8gUlVMRV9JTlQKICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICBpZiAoIGlucHV0LkxBKDEpPT0nRSd8fGlucHV0LkxBKDEpPT0nZScgKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dC5jb25zdW1lKCk7CkBAIC0zMzk4LDcgKzM2NjIsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgcmVjb3Zlcihtc2UpOwogICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbXNlO30KIAotICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo5NDE0OjM2OiAoICcrJyB8ICctJyApPworICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo5OTU1OjM2OiAoICcrJyB8ICctJyApPwogICAgICAgICAgICAgICAgICAgICBpbnQgYWx0Nj0yOwogICAgICAgICAgICAgICAgICAgICBpbnQgTEE2XzAgPSBpbnB1dC5MQSgxKTsKIApAQCAtMzQzMSw3ICszNjk1LDcgQEAKIAogICAgICAgICAgICAgfQogCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo5NDE0OjU4OiAoICggJ2InIHwgJ0InICkgKCAnaScgfCAnSScgfCAnZCcgfCAnRCcgKSB8ICggJ2wnIHwgJ0wnIHwgJ2QnIHwgJ0QnIHwgJ2YnIHwgJ0YnICkgKT8KKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjk5NTU6NTg6ICggKCAnYicgfCAnQicgKSAoICdpJyB8ICdJJyB8ICdkJyB8ICdEJyApIHwgKCAnbCcgfCAnTCcgfCAnZCcgfCAnRCcgfCAnZicgfCAnRicgKSApPwogICAgICAgICAgICAgaW50IGFsdDg9MzsKICAgICAgICAgICAgIGludCBMQThfMCA9IGlucHV0LkxBKDEpOwogCkBAIC0zNDQzLDcgKzM3MDcsNyBAQAogICAgICAgICAgICAgfQogICAgICAgICAgICAgc3dpdGNoIChhbHQ4KSB7CiAgICAgICAgICAgICAgICAgY2FzZSAxIDoKLSAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6OTQxNDo1OTogKCAnYicgfCAnQicgKSAoICdpJyB8ICdJJyB8ICdkJyB8ICdEJyApCisgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjk5NTU6NTk6ICggJ2InIHwgJ0InICkgKCAnaScgfCAnSScgfCAnZCcgfCAnRCcgKQogICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgIGlmICggaW5wdXQuTEEoMSk9PSdCJ3x8aW5wdXQuTEEoMSk9PSdiJyApIHsKICAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0LmNvbnN1bWUoKTsKQEAgLTM0NjcsNyArMzczMSw3IEBACiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgY2FzZSAyIDoKLSAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6OTQxNDo4NzogKCAnbCcgfCAnTCcgfCAnZCcgfCAnRCcgfCAnZicgfCAnRicgKQorICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo5OTU1Ojg3OiAoICdsJyB8ICdMJyB8ICdkJyB8ICdEJyB8ICdmJyB8ICdGJyApCiAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgaWYgKCBpbnB1dC5MQSgxKT09J0QnfHxpbnB1dC5MQSgxKT09J0YnfHxpbnB1dC5MQSgxKT09J0wnfHxpbnB1dC5MQSgxKT09J2QnfHxpbnB1dC5MQSgxKT09J2YnfHxpbnB1dC5MQSgxKT09J2wnICkgewogICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXQuY29uc3VtZSgpOwpAQCAtMzUwMCwxMCArMzc2NCwxMCBAQAogICAgICAgICB0cnkgewogICAgICAgICAgICAgaW50IF90eXBlID0gUlVMRV9JRDsKICAgICAgICAgICAgIGludCBfY2hhbm5lbCA9IERFRkFVTFRfVE9LRU5fQ0hBTk5FTDsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjk0MTY6OTogKCAoICdeJyApPyAoICdhJyAuLiAneicgfCAnQScgLi4gJ1onIHwgJyQnIHwgJ18nICkgKCAnYScgLi4gJ3onIHwgJ0EnIC4uICdaJyB8ICckJyB8ICdfJyB8ICcwJyAuLiAnOScgKSogKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6OTQxNjoxMTogKCAnXicgKT8gKCAnYScgLi4gJ3onIHwgJ0EnIC4uICdaJyB8ICckJyB8ICdfJyApICggJ2EnIC4uICd6JyB8ICdBJyAuLiAnWicgfCAnJCcgfCAnXycgfCAnMCcgLi4gJzknICkqCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo5OTU3Ojk6ICggKCAnXicgKT8gKCAnYScgLi4gJ3onIHwgJ0EnIC4uICdaJyB8ICckJyB8ICdfJyApICggJ2EnIC4uICd6JyB8ICdBJyAuLiAnWicgfCAnJCcgfCAnXycgfCAnMCcgLi4gJzknICkqICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjk5NTc6MTE6ICggJ14nICk/ICggJ2EnIC4uICd6JyB8ICdBJyAuLiAnWicgfCAnJCcgfCAnXycgKSAoICdhJyAuLiAneicgfCAnQScgLi4gJ1onIHwgJyQnIHwgJ18nIHwgJzAnIC4uICc5JyApKgogICAgICAgICAgICAgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6OTQxNjoxMTogKCAnXicgKT8KKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjk5NTc6MTE6ICggJ14nICk/CiAgICAgICAgICAgICBpbnQgYWx0OT0yOwogICAgICAgICAgICAgaW50IExBOV8wID0gaW5wdXQuTEEoMSk7CiAKQEAgLTM1MTIsNyArMzc3Niw3IEBACiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBzd2l0Y2ggKGFsdDkpIHsKICAgICAgICAgICAgICAgICBjYXNlIDEgOgotICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo5NDE2OjExOiAnXicKKyAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6OTk1NzoxMTogJ14nCiAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgbWF0Y2goJ14nKTsgCiAKQEAgLTM1MzAsNyArMzc5NCw3IEBACiAgICAgICAgICAgICAgICAgcmVjb3Zlcihtc2UpOwogICAgICAgICAgICAgICAgIHRocm93IG1zZTt9CiAKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjk0MTY6NDQ6ICggJ2EnIC4uICd6JyB8ICdBJyAuLiAnWicgfCAnJCcgfCAnXycgfCAnMCcgLi4gJzknICkqCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo5OTU3OjQ0OiAoICdhJyAuLiAneicgfCAnQScgLi4gJ1onIHwgJyQnIHwgJ18nIHwgJzAnIC4uICc5JyApKgogICAgICAgICAgICAgbG9vcDEwOgogICAgICAgICAgICAgZG8gewogICAgICAgICAgICAgICAgIGludCBhbHQxMD0yOwpAQCAtMzU3OSwxMCArMzg0MywxMCBAQAogICAgICAgICB0cnkgewogICAgICAgICAgICAgaW50IF90eXBlID0gUlVMRV9TVFJJTkc7CiAgICAgICAgICAgICBpbnQgX2NoYW5uZWwgPSBERUZBVUxUX1RPS0VOX0NIQU5ORUw7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo5NDE4OjEzOiAoICggJ1wiJyAoICdcXFxcJyAuIHwgfiAoICggJ1xcXFwnIHwgJ1wiJyApICkgKSogKCAnXCInICk/IHwgJ1xcJycgKCAnXFxcXCcgLiB8IH4gKCAoICdcXFxcJyB8ICdcXCcnICkgKSApKiAoICdcXCcnICk/ICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6OTQxODoxNTogKCAnXCInICggJ1xcXFwnIC4gfCB+ICggKCAnXFxcXCcgfCAnXCInICkgKSApKiAoICdcIicgKT8gfCAnXFwnJyAoICdcXFxcJyAuIHwgfiAoICggJ1xcXFwnIHwgJ1xcJycgKSApICkqICggJ1xcJycgKT8gKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6OTk1OToxMzogKCAoICdcIicgKCAnXFxcXCcgLiB8IH4gKCAoICdcXFxcJyB8ICdcIicgKSApICkqICggJ1wiJyApPyB8ICdcXCcnICggJ1xcXFwnIC4gfCB+ICggKCAnXFxcXCcgfCAnXFwnJyApICkgKSogKCAnXFwnJyApPyApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjk5NTk6MTU6ICggJ1wiJyAoICdcXFxcJyAuIHwgfiAoICggJ1xcXFwnIHwgJ1wiJyApICkgKSogKCAnXCInICk/IHwgJ1xcJycgKCAnXFxcXCcgLiB8IH4gKCAoICdcXFxcJyB8ICdcXCcnICkgKSApKiAoICdcXCcnICk/ICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjk0MTg6MTU6ICggJ1wiJyAoICdcXFxcJyAuIHwgfiAoICggJ1xcXFwnIHwgJ1wiJyApICkgKSogKCAnXCInICk/IHwgJ1xcJycgKCAnXFxcXCcgLiB8IH4gKCAoICdcXFxcJyB8ICdcXCcnICkgKSApKiAoICdcXCcnICk/ICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjk5NTk6MTU6ICggJ1wiJyAoICdcXFxcJyAuIHwgfiAoICggJ1xcXFwnIHwgJ1wiJyApICkgKSogKCAnXCInICk/IHwgJ1xcJycgKCAnXFxcXCcgLiB8IH4gKCAoICdcXFxcJyB8ICdcXCcnICkgKSApKiAoICdcXCcnICk/ICkKICAgICAgICAgICAgIGludCBhbHQxNT0yOwogICAgICAgICAgICAgaW50IExBMTVfMCA9IGlucHV0LkxBKDEpOwogCkBAIC0zNjAwLDEwICszODY0LDEwIEBACiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBzd2l0Y2ggKGFsdDE1KSB7CiAgICAgICAgICAgICAgICAgY2FzZSAxIDoKLSAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6OTQxODoxNjogJ1wiJyAoICdcXFxcJyAuIHwgfiAoICggJ1xcXFwnIHwgJ1wiJyApICkgKSogKCAnXCInICk/CisgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjk5NTk6MTY6ICdcIicgKCAnXFxcXCcgLiB8IH4gKCAoICdcXFxcJyB8ICdcIicgKSApICkqICggJ1wiJyApPwogICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgIG1hdGNoKCdcIicpOyAKLSAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6OTQxODoyMDogKCAnXFxcXCcgLiB8IH4gKCAoICdcXFxcJyB8ICdcIicgKSApICkqCisgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjk5NTk6MjA6ICggJ1xcXFwnIC4gfCB+ICggKCAnXFxcXCcgfCAnXCInICkgKSApKgogICAgICAgICAgICAgICAgICAgICBsb29wMTE6CiAgICAgICAgICAgICAgICAgICAgIGRvIHsKICAgICAgICAgICAgICAgICAgICAgICAgIGludCBhbHQxMT0zOwpAQCAtMzYxOSw3ICszODgzLDcgQEAKIAogICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChhbHQxMSkgewogICAgICAgICAgICAgICAgICAgICAJY2FzZSAxIDoKLSAgICAgICAgICAgICAgICAgICAgCSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo5NDE4OjIxOiAnXFxcXCcgLgorICAgICAgICAgICAgICAgICAgICAJICAgIC8vIEludGVybmFsRGF0YURTTC5nOjk5NTk6MjE6ICdcXFxcJyAuCiAgICAgICAgICAgICAgICAgICAgIAkgICAgewogICAgICAgICAgICAgICAgICAgICAJICAgIG1hdGNoKCdcXCcpOyAKICAgICAgICAgICAgICAgICAgICAgCSAgICBtYXRjaEFueSgpOyAKQEAgLTM2MjcsNyArMzg5MSw3IEBACiAgICAgICAgICAgICAgICAgICAgIAkgICAgfQogICAgICAgICAgICAgICAgICAgICAJICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAJY2FzZSAyIDoKLSAgICAgICAgICAgICAgICAgICAgCSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo5NDE4OjI4OiB+ICggKCAnXFxcXCcgfCAnXCInICkgKQorICAgICAgICAgICAgICAgICAgICAJICAgIC8vIEludGVybmFsRGF0YURTTC5nOjk5NTk6Mjg6IH4gKCAoICdcXFxcJyB8ICdcIicgKSApCiAgICAgICAgICAgICAgICAgICAgIAkgICAgewogICAgICAgICAgICAgICAgICAgICAJICAgIGlmICggKGlucHV0LkxBKDEpPj0nXHUwMDAwJyAmJiBpbnB1dC5MQSgxKTw9JyEnKXx8KGlucHV0LkxBKDEpPj0nIycgJiYgaW5wdXQuTEEoMSk8PSdbJyl8fChpbnB1dC5MQSgxKT49J10nICYmIGlucHV0LkxBKDEpPD0nXHVGRkZGJykgKSB7CiAgICAgICAgICAgICAgICAgICAgIAkgICAgICAgIGlucHV0LmNvbnN1bWUoKTsKQEAgLTM2NDcsNyArMzkxMSw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIH0gd2hpbGUgKHRydWUpOwogCi0gICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjk0MTg6NDQ6ICggJ1wiJyApPworICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo5OTU5OjQ0OiAoICdcIicgKT8KICAgICAgICAgICAgICAgICAgICAgaW50IGFsdDEyPTI7CiAgICAgICAgICAgICAgICAgICAgIGludCBMQTEyXzAgPSBpbnB1dC5MQSgxKTsKIApAQCAtMzY1Niw3ICszOTIwLDcgQEAKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKGFsdDEyKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDEgOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjk0MTg6NDQ6ICdcIicKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo5OTU5OjQ0OiAnXCInCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hdGNoKCdcIicpOyAKIApAQCAtMzY2OSwxMCArMzkzMywxMCBAQAogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgIGNhc2UgMiA6Ci0gICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjk0MTg6NDk6ICdcXCcnICggJ1xcXFwnIC4gfCB+ICggKCAnXFxcXCcgfCAnXFwnJyApICkgKSogKCAnXFwnJyApPworICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo5OTU5OjQ5OiAnXFwnJyAoICdcXFxcJyAuIHwgfiAoICggJ1xcXFwnIHwgJ1xcJycgKSApICkqICggJ1xcJycgKT8KICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICBtYXRjaCgnXCcnKTsgCi0gICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjk0MTg6NTQ6ICggJ1xcXFwnIC4gfCB+ICggKCAnXFxcXCcgfCAnXFwnJyApICkgKSoKKyAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6OTk1OTo1NDogKCAnXFxcXCcgLiB8IH4gKCAoICdcXFxcJyB8ICdcXCcnICkgKSApKgogICAgICAgICAgICAgICAgICAgICBsb29wMTM6CiAgICAgICAgICAgICAgICAgICAgIGRvIHsKICAgICAgICAgICAgICAgICAgICAgICAgIGludCBhbHQxMz0zOwpAQCAtMzY4OCw3ICszOTUyLDcgQEAKIAogICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChhbHQxMykgewogICAgICAgICAgICAgICAgICAgICAJY2FzZSAxIDoKLSAgICAgICAgICAgICAgICAgICAgCSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo5NDE4OjU1OiAnXFxcXCcgLgorICAgICAgICAgICAgICAgICAgICAJICAgIC8vIEludGVybmFsRGF0YURTTC5nOjk5NTk6NTU6ICdcXFxcJyAuCiAgICAgICAgICAgICAgICAgICAgIAkgICAgewogICAgICAgICAgICAgICAgICAgICAJICAgIG1hdGNoKCdcXCcpOyAKICAgICAgICAgICAgICAgICAgICAgCSAgICBtYXRjaEFueSgpOyAKQEAgLTM2OTYsNyArMzk2MCw3IEBACiAgICAgICAgICAgICAgICAgICAgIAkgICAgfQogICAgICAgICAgICAgICAgICAgICAJICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAJY2FzZSAyIDoKLSAgICAgICAgICAgICAgICAgICAgCSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo5NDE4OjYyOiB+ICggKCAnXFxcXCcgfCAnXFwnJyApICkKKyAgICAgICAgICAgICAgICAgICAgCSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo5OTU5OjYyOiB+ICggKCAnXFxcXCcgfCAnXFwnJyApICkKICAgICAgICAgICAgICAgICAgICAgCSAgICB7CiAgICAgICAgICAgICAgICAgICAgIAkgICAgaWYgKCAoaW5wdXQuTEEoMSk+PSdcdTAwMDAnICYmIGlucHV0LkxBKDEpPD0nJicpfHwoaW5wdXQuTEEoMSk+PScoJyAmJiBpbnB1dC5MQSgxKTw9J1snKXx8KGlucHV0LkxBKDEpPj0nXScgJiYgaW5wdXQuTEEoMSk8PSdcdUZGRkYnKSApIHsKICAgICAgICAgICAgICAgICAgICAgCSAgICAgICAgaW5wdXQuY29uc3VtZSgpOwpAQCAtMzcxNiw3ICszOTgwLDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgfSB3aGlsZSAodHJ1ZSk7CiAKLSAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6OTQxODo3OTogKCAnXFwnJyApPworICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo5OTU5Ojc5OiAoICdcXCcnICk/CiAgICAgICAgICAgICAgICAgICAgIGludCBhbHQxND0yOwogICAgICAgICAgICAgICAgICAgICBpbnQgTEExNF8wID0gaW5wdXQuTEEoMSk7CiAKQEAgLTM3MjUsNyArMzk4OSw3IEBACiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChhbHQxNCkgewogICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxIDoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo5NDE4Ojc5OiAnXFwnJworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjk5NTk6Nzk6ICdcXCcnCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hdGNoKCdcJycpOyAKIApAQCAtMzc1NiwxMiArNDAyMCwxMiBAQAogICAgICAgICB0cnkgewogICAgICAgICAgICAgaW50IF90eXBlID0gUlVMRV9NTF9DT01NRU5UOwogICAgICAgICAgICAgaW50IF9jaGFubmVsID0gREVGQVVMVF9UT0tFTl9DSEFOTkVMOwotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6OTQyMDoxNzogKCAnLyonICggb3B0aW9ucyB7Z3JlZWR5PWZhbHNlOyB9IDogLiApKiAnKi8nICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjk0MjA6MTk6ICcvKicgKCBvcHRpb25zIHtncmVlZHk9ZmFsc2U7IH0gOiAuICkqICcqLycKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjk5NjE6MTc6ICggJy8qJyAoIG9wdGlvbnMge2dyZWVkeT1mYWxzZTsgfSA6IC4gKSogJyovJyApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo5OTYxOjE5OiAnLyonICggb3B0aW9ucyB7Z3JlZWR5PWZhbHNlOyB9IDogLiApKiAnKi8nCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBtYXRjaCgiLyoiKTsgCiAKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjk0MjA6MjQ6ICggb3B0aW9ucyB7Z3JlZWR5PWZhbHNlOyB9IDogLiApKgorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6OTk2MToyNDogKCBvcHRpb25zIHtncmVlZHk9ZmFsc2U7IH0gOiAuICkqCiAgICAgICAgICAgICBsb29wMTY6CiAgICAgICAgICAgICBkbyB7CiAgICAgICAgICAgICAgICAgaW50IGFsdDE2PTI7CkBAIC0zNzg2LDcgKzQwNTAsNyBAQAogCiAgICAgICAgICAgICAgICAgc3dpdGNoIChhbHQxNikgewogICAgICAgICAgICAgCWNhc2UgMSA6Ci0gICAgICAgICAgICAJICAgIC8vIEludGVybmFsRGF0YURTTC5nOjk0MjA6NTI6IC4KKyAgICAgICAgICAgIAkgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6OTk2MTo1MjogLgogICAgICAgICAgICAgCSAgICB7CiAgICAgICAgICAgICAJICAgIG1hdGNoQW55KCk7IAogCkBAIC0zODE2LDEyICs0MDgwLDEyIEBACiAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICBpbnQgX3R5cGUgPSBSVUxFX1NMX0NPTU1FTlQ7CiAgICAgICAgICAgICBpbnQgX2NoYW5uZWwgPSBERUZBVUxUX1RPS0VOX0NIQU5ORUw7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo5NDIyOjE3OiAoICcvLycgKH4gKCAoICdcXG4nIHwgJ1xccicgKSApICkqICggKCAnXFxyJyApPyAnXFxuJyApPyApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo5NDIyOjE5OiAnLy8nICh+ICggKCAnXFxuJyB8ICdcXHInICkgKSApKiAoICggJ1xccicgKT8gJ1xcbicgKT8KKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjk5NjM6MTc6ICggJy8vJyAofiAoICggJ1xcbicgfCAnXFxyJyApICkgKSogKCAoICdcXHInICk/ICdcXG4nICk/ICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjk5NjM6MTk6ICcvLycgKH4gKCAoICdcXG4nIHwgJ1xccicgKSApICkqICggKCAnXFxyJyApPyAnXFxuJyApPwogICAgICAgICAgICAgewogICAgICAgICAgICAgbWF0Y2goIi8vIik7IAogCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo5NDIyOjI0OiAofiAoICggJ1xcbicgfCAnXFxyJyApICkgKSoKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjk5NjM6MjQ6ICh+ICggKCAnXFxuJyB8ICdcXHInICkgKSApKgogICAgICAgICAgICAgbG9vcDE3OgogICAgICAgICAgICAgZG8gewogICAgICAgICAgICAgICAgIGludCBhbHQxNz0yOwpAQCAtMzgzNCw3ICs0MDk4LDcgQEAKIAogICAgICAgICAgICAgICAgIHN3aXRjaCAoYWx0MTcpIHsKICAgICAgICAgICAgIAljYXNlIDEgOgotICAgICAgICAgICAgCSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo5NDIyOjI0OiB+ICggKCAnXFxuJyB8ICdcXHInICkgKQorICAgICAgICAgICAgCSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo5OTYzOjI0OiB+ICggKCAnXFxuJyB8ICdcXHInICkgKQogICAgICAgICAgICAgCSAgICB7CiAgICAgICAgICAgICAJICAgIGlmICggKGlucHV0LkxBKDEpPj0nXHUwMDAwJyAmJiBpbnB1dC5MQSgxKTw9J1x0Jyl8fChpbnB1dC5MQSgxKT49J1x1MDAwQicgJiYgaW5wdXQuTEEoMSk8PSdcZicpfHwoaW5wdXQuTEEoMSk+PSdcdTAwMEUnICYmIGlucHV0LkxBKDEpPD0nXHVGRkZGJykgKSB7CiAgICAgICAgICAgICAJICAgICAgICBpbnB1dC5jb25zdW1lKCk7CkBAIC0zODU0LDcgKzQxMTgsNyBAQAogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0gd2hpbGUgKHRydWUpOwogCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo5NDIyOjQwOiAoICggJ1xccicgKT8gJ1xcbicgKT8KKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjk5NjM6NDA6ICggKCAnXFxyJyApPyAnXFxuJyApPwogICAgICAgICAgICAgaW50IGFsdDE5PTI7CiAgICAgICAgICAgICBpbnQgTEExOV8wID0gaW5wdXQuTEEoMSk7CiAKQEAgLTM4NjMsOSArNDEyNyw5IEBACiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBzd2l0Y2ggKGFsdDE5KSB7CiAgICAgICAgICAgICAgICAgY2FzZSAxIDoKLSAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6OTQyMjo0MTogKCAnXFxyJyApPyAnXFxuJworICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo5OTYzOjQxOiAoICdcXHInICk/ICdcXG4nCiAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6OTQyMjo0MTogKCAnXFxyJyApPworICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo5OTYzOjQxOiAoICdcXHInICk/CiAgICAgICAgICAgICAgICAgICAgIGludCBhbHQxOD0yOwogICAgICAgICAgICAgICAgICAgICBpbnQgTEExOF8wID0gaW5wdXQuTEEoMSk7CiAKQEAgLTM4NzQsNyArNDEzOCw3IEBACiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChhbHQxOCkgewogICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxIDoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo5NDIyOjQxOiAnXFxyJworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjk5NjM6NDE6ICdcXHInCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hdGNoKCdccicpOyAKIApAQCAtMzkwNiwxMCArNDE3MCwxMCBAQAogICAgICAgICB0cnkgewogICAgICAgICAgICAgaW50IF90eXBlID0gUlVMRV9XUzsKICAgICAgICAgICAgIGludCBfY2hhbm5lbCA9IERFRkFVTFRfVE9LRU5fQ0hBTk5FTDsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjk0MjQ6OTogKCAoICcgJyB8ICdcXHQnIHwgJ1xccicgfCAnXFxuJyApKyApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo5NDI0OjExOiAoICcgJyB8ICdcXHQnIHwgJ1xccicgfCAnXFxuJyApKworICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6OTk2NTo5OiAoICggJyAnIHwgJ1xcdCcgfCAnXFxyJyB8ICdcXG4nICkrICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjk5NjU6MTE6ICggJyAnIHwgJ1xcdCcgfCAnXFxyJyB8ICdcXG4nICkrCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo5NDI0OjExOiAoICcgJyB8ICdcXHQnIHwgJ1xccicgfCAnXFxuJyApKworICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6OTk2NToxMTogKCAnICcgfCAnXFx0JyB8ICdcXHInIHwgJ1xcbicgKSsKICAgICAgICAgICAgIGludCBjbnQyMD0wOwogICAgICAgICAgICAgbG9vcDIwOgogICAgICAgICAgICAgZG8gewpAQCAtMzk2Myw4ICs0MjI3LDggQEAKICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgIGludCBfdHlwZSA9IFJVTEVfQU5ZX09USEVSOwogICAgICAgICAgICAgaW50IF9jaGFubmVsID0gREVGQVVMVF9UT0tFTl9DSEFOTkVMOwotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6OTQyNjoxNjogKCAuICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjk0MjY6MTg6IC4KKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjk5Njc6MTY6ICggLiApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo5OTY3OjE4OiAuCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBtYXRjaEFueSgpOyAKIApAQCAtMzk3OSw4ICs0MjQzLDggQEAKICAgICAvLyAkQU5UTFIgZW5kICJSVUxFX0FOWV9PVEhFUiIKIAogICAgIHB1YmxpYyB2b2lkIG1Ub2tlbnMoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewotICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxOjg6ICggVF9fMTMgfCBUX18xNCB8IFRfXzE1IHwgVF9fMTYgfCBUX18xNyB8IFRfXzE4IHwgVF9fMTkgfCBUX18yMCB8IFRfXzIxIHwgVF9fMjIgfCBUX18yMyB8IFRfXzI0IHwgVF9fMjUgfCBUX18yNiB8IFRfXzI3IHwgVF9fMjggfCBUX18yOSB8IFRfXzMwIHwgVF9fMzEgfCBUX18zMiB8IFRfXzMzIHwgVF9fMzQgfCBUX18zNSB8IFRfXzM2IHwgVF9fMzcgfCBUX18zOCB8IFRfXzM5IHwgVF9fNDAgfCBUX180MSB8IFRfXzQyIHwgVF9fNDMgfCBUX180NCB8IFRfXzQ1IHwgVF9fNDYgfCBUX180NyB8IFRfXzQ4IHwgVF9fNDkgfCBUX181MCB8IFRfXzUxIHwgVF9fNTIgfCBUX181MyB8IFRfXzU0IHwgVF9fNTUgfCBUX181NiB8IFRfXzU3IHwgVF9fNTggfCBUX181OSB8IFRfXzYwIHwgVF9fNjEgfCBUX182MiB8IFRfXzYzIHwgVF9fNjQgfCBUX182NSB8IFRfXzY2IHwgVF9fNjcgfCBUX182OCB8IFRfXzY5IHwgVF9fNzAgfCBUX183MSB8IFRfXzcyIHwgVF9fNzMgfCBUX183NCB8IFRfXzc1IHwgVF9fNzYgfCBUX183NyB8IFRfXzc4IHwgVF9fNzkgfCBUX184MCB8IFRfXzgxIHwgVF9fODIgfCBUX184MyB8IFRfXzg0IHwgVF9fODUgfCBUX184NiB8IFRfXzg3IHwgVF9fODggfCBUX184OSB8IFRfXzkwIHwgVF9fOTEgfCBUX185MiB8IFRfXzkzIHwgVF9fOTQgfCBUX185NSB8IFRfXzk2IHwgVF9fOTcgfCBUX185OCB8IFRfXzk5IHwgVF9fMTAwIHwgVF9fMTAxIHwgVF9fMTAyIHwgVF9fMTAzIHwgVF9fMTA0IHwgVF9fMTA1IHwgVF9fMTA2IHwgVF9fMTA3IHwgVF9fMTA4IHwgVF9fMTA5IHwgVF9fMTEwIHwgVF9fMTExIHwgVF9fMTEyIHwgVF9fMTEzIHwgVF9fMTE0IHwgVF9fMTE1IHwgVF9fMTE2IHwgVF9fMTE3IHwgVF9fMTE4IHwgVF9fMTE5IHwgVF9fMTIwIHwgVF9fMTIxIHwgVF9fMTIyIHwgVF9fMTIzIHwgVF9fMTI0IHwgVF9fMTI1IHwgVF9fMTI2IHwgVF9fMTI3IHwgVF9fMTI4IHwgVF9fMTI5IHwgVF9fMTMwIHwgVF9fMTMxIHwgVF9fMTMyIHwgVF9fMTMzIHwgVF9fMTM0IHwgVF9fMTM1IHwgVF9fMTM2IHwgVF9fMTM3IHwgVF9fMTM4IHwgVF9fMTM5IHwgVF9fMTQwIHwgVF9fMTQxIHwgVF9fMTQyIHwgVF9fMTQzIHwgVF9fMTQ0IHwgVF9fMTQ1IHwgVF9fMTQ2IHwgVF9fMTQ3IHwgVF9fMTQ4IHwgVF9fMTQ5IHwgVF9fMTUwIHwgVF9fMTUxIHwgVF9fMTUyIHwgVF9fMTUzIHwgVF9fMTU0IHwgUlVMRV9IRVggfCBSVUxFX0lOVCB8IFJVTEVfREVDSU1BTCB8IFJVTEVfSUQgfCBSVUxFX1NUUklORyB8IFJVTEVfTUxfQ09NTUVOVCB8IFJVTEVfU0xfQ09NTUVOVCB8IFJVTEVfV1MgfCBSVUxFX0FOWV9PVEhFUiApCi0gICAgICAgIGludCBhbHQyMT0xNTE7CisgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE6ODogKCBUX18xMyB8IFRfXzE0IHwgVF9fMTUgfCBUX18xNiB8IFRfXzE3IHwgVF9fMTggfCBUX18xOSB8IFRfXzIwIHwgVF9fMjEgfCBUX18yMiB8IFRfXzIzIHwgVF9fMjQgfCBUX18yNSB8IFRfXzI2IHwgVF9fMjcgfCBUX18yOCB8IFRfXzI5IHwgVF9fMzAgfCBUX18zMSB8IFRfXzMyIHwgVF9fMzMgfCBUX18zNCB8IFRfXzM1IHwgVF9fMzYgfCBUX18zNyB8IFRfXzM4IHwgVF9fMzkgfCBUX180MCB8IFRfXzQxIHwgVF9fNDIgfCBUX180MyB8IFRfXzQ0IHwgVF9fNDUgfCBUX180NiB8IFRfXzQ3IHwgVF9fNDggfCBUX180OSB8IFRfXzUwIHwgVF9fNTEgfCBUX181MiB8IFRfXzUzIHwgVF9fNTQgfCBUX181NSB8IFRfXzU2IHwgVF9fNTcgfCBUX181OCB8IFRfXzU5IHwgVF9fNjAgfCBUX182MSB8IFRfXzYyIHwgVF9fNjMgfCBUX182NCB8IFRfXzY1IHwgVF9fNjYgfCBUX182NyB8IFRfXzY4IHwgVF9fNjkgfCBUX183MCB8IFRfXzcxIHwgVF9fNzIgfCBUX183MyB8IFRfXzc0IHwgVF9fNzUgfCBUX183NiB8IFRfXzc3IHwgVF9fNzggfCBUX183OSB8IFRfXzgwIHwgVF9fODEgfCBUX184MiB8IFRfXzgzIHwgVF9fODQgfCBUX184NSB8IFRfXzg2IHwgVF9fODcgfCBUX184OCB8IFRfXzg5IHwgVF9fOTAgfCBUX185MSB8IFRfXzkyIHwgVF9fOTMgfCBUX185NCB8IFRfXzk1IHwgVF9fOTYgfCBUX185NyB8IFRfXzk4IHwgVF9fOTkgfCBUX18xMDAgfCBUX18xMDEgfCBUX18xMDIgfCBUX18xMDMgfCBUX18xMDQgfCBUX18xMDUgfCBUX18xMDYgfCBUX18xMDcgfCBUX18xMDggfCBUX18xMDkgfCBUX18xMTAgfCBUX18xMTEgfCBUX18xMTIgfCBUX18xMTMgfCBUX18xMTQgfCBUX18xMTUgfCBUX18xMTYgfCBUX18xMTcgfCBUX18xMTggfCBUX18xMTkgfCBUX18xMjAgfCBUX18xMjEgfCBUX18xMjIgfCBUX18xMjMgfCBUX18xMjQgfCBUX18xMjUgfCBUX18xMjYgfCBUX18xMjcgfCBUX18xMjggfCBUX18xMjkgfCBUX18xMzAgfCBUX18xMzEgfCBUX18xMzIgfCBUX18xMzMgfCBUX18xMzQgfCBUX18xMzUgfCBUX18xMzYgfCBUX18xMzcgfCBUX18xMzggfCBUX18xMzkgfCBUX18xNDAgfCBUX18xNDEgfCBUX18xNDIgfCBUX18xNDMgfCBUX18xNDQgfCBUX18xNDUgfCBUX18xNDYgfCBUX18xNDcgfCBUX18xNDggfCBUX18xNDkgfCBUX18xNTAgfCBUX18xNTEgfCBUX18xNTIgfCBUX18xNTMgfCBUX18xNTQgfCBUX18xNTUgfCBUX18xNTYgfCBUX18xNTcgfCBUX18xNTggfCBUX18xNTkgfCBUX18xNjAgfCBUX18xNjEgfCBUX18xNjIgfCBUX18xNjMgfCBUX18xNjQgfCBUX18xNjUgfCBUX18xNjYgfCBSVUxFX0hFWCB8IFJVTEVfSU5UIHwgUlVMRV9ERUNJTUFMIHwgUlVMRV9JRCB8IFJVTEVfU1RSSU5HIHwgUlVMRV9NTF9DT01NRU5UIHwgUlVMRV9TTF9DT01NRU5UIHwgUlVMRV9XUyB8IFJVTEVfQU5ZX09USEVSICkKKyAgICAgICAgaW50IGFsdDIxPTE2MzsKICAgICAgICAgYWx0MjEgPSBkZmEyMS5wcmVkaWN0KGlucHV0KTsKICAgICAgICAgc3dpdGNoIChhbHQyMSkgewogICAgICAgICAgICAgY2FzZSAxIDoKQEAgLTQ5NzgsNjMgKzUyNDIsMTQ3IEBACiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgY2FzZSAxNDMgOgotICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE6OTE3OiBSVUxFX0hFWAorICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE6OTE3OiBUX18xNTUKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbVRfXzE1NSgpOyAKKworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMTQ0IDoKKyAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxOjkyNDogVF9fMTU2CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG1UX18xNTYoKTsgCisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDE0NSA6CisgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTo5MzE6IFRfXzE1NworICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBtVF9fMTU3KCk7IAorCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAxNDYgOgorICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE6OTM4OiBUX18xNTgKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbVRfXzE1OCgpOyAKKworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMTQ3IDoKKyAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxOjk0NTogVF9fMTU5CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG1UX18xNTkoKTsgCisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDE0OCA6CisgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTo5NTI6IFRfXzE2MAorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBtVF9fMTYwKCk7IAorCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAxNDkgOgorICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE6OTU5OiBUX18xNjEKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbVRfXzE2MSgpOyAKKworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMTUwIDoKKyAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxOjk2NjogVF9fMTYyCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG1UX18xNjIoKTsgCisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDE1MSA6CisgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTo5NzM6IFRfXzE2MworICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBtVF9fMTYzKCk7IAorCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAxNTIgOgorICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE6OTgwOiBUX18xNjQKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbVRfXzE2NCgpOyAKKworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMTUzIDoKKyAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxOjk4NzogVF9fMTY1CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG1UX18xNjUoKTsgCisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDE1NCA6CisgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTo5OTQ6IFRfXzE2NgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBtVF9fMTY2KCk7IAorCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAxNTUgOgorICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE6MTAwMTogUlVMRV9IRVgKICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgbVJVTEVfSEVYKCk7IAogCiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSAxNDQgOgotICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE6OTI2OiBSVUxFX0lOVAorICAgICAgICAgICAgY2FzZSAxNTYgOgorICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE6MTAxMDogUlVMRV9JTlQKICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgbVJVTEVfSU5UKCk7IAogCiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSAxNDUgOgotICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE6OTM1OiBSVUxFX0RFQ0lNQUwKKyAgICAgICAgICAgIGNhc2UgMTU3IDoKKyAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxOjEwMTk6IFJVTEVfREVDSU1BTAogICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICBtUlVMRV9ERUNJTUFMKCk7IAogCiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSAxNDYgOgotICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE6OTQ4OiBSVUxFX0lECisgICAgICAgICAgICBjYXNlIDE1OCA6CisgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MToxMDMyOiBSVUxFX0lECiAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIG1SVUxFX0lEKCk7IAogCiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSAxNDcgOgotICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE6OTU2OiBSVUxFX1NUUklORworICAgICAgICAgICAgY2FzZSAxNTkgOgorICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE6MTA0MDogUlVMRV9TVFJJTkcKICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgbVJVTEVfU1RSSU5HKCk7IAogCiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSAxNDggOgotICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE6OTY4OiBSVUxFX01MX0NPTU1FTlQKKyAgICAgICAgICAgIGNhc2UgMTYwIDoKKyAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxOjEwNTI6IFJVTEVfTUxfQ09NTUVOVAogICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICBtUlVMRV9NTF9DT01NRU5UKCk7IAogCiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSAxNDkgOgotICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE6OTg0OiBSVUxFX1NMX0NPTU1FTlQKKyAgICAgICAgICAgIGNhc2UgMTYxIDoKKyAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxOjEwNjg6IFJVTEVfU0xfQ09NTUVOVAogICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICBtUlVMRV9TTF9DT01NRU5UKCk7IAogCiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSAxNTAgOgotICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE6MTAwMDogUlVMRV9XUworICAgICAgICAgICAgY2FzZSAxNjIgOgorICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE6MTA4NDogUlVMRV9XUwogICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICBtUlVMRV9XUygpOyAKIAogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgMTUxIDoKLSAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxOjEwMDg6IFJVTEVfQU5ZX09USEVSCisgICAgICAgICAgICBjYXNlIDE2MyA6CisgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MToxMDkyOiBSVUxFX0FOWV9PVEhFUgogICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICBtUlVMRV9BTllfT1RIRVIoKTsgCiAKQEAgLTUwNDgsNzA5ICs1Mzk2LDc4OSBAQAogCiAgICAgcHJvdGVjdGVkIERGQTIxIGRmYTIxID0gbmV3IERGQTIxKHRoaXMpOwogICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgREZBMjFfZW90UyA9Ci0gICAgICAgICJcMVx1ZmZmZlwyXDEwM1wyXHVmZmZmXDIzXDEwM1wxXDE3MFwxXDE3M1w1XHVmZmZmXDFcdTAwODNcM1x1ZmZmZlwxXHUwMDg5XDFcdTAwOGRcMVx1MDA5MVwxXHUwMDkzXDFcdTAwOTVcMVx1MDA5N1wxXHUwMDk5XDFcdTAwOWJcMVx1MDA5ZFwxXHUwMGEwXDFcdTAwYTJcN1wxMDNcMlx1MDBhZFwxXDc0XDVcdWZmZmZcNlwxMDNcMVx1ZmZmZlwxXDEwM1wxXHUwMGI5XDNcMTAzXDJcdWZmZmZcMlwxMDNcMVx1MDBjMlwxXDEwM1wxXHUwMGM2XDMyXDEwM1wxXHUwMGVhXDZcMTAzXDFcdTAwZjRcNFwxMDNcMVx1MDBmYVwxXHUwMGZjXDExXHVmZmZmXDFcdTAwZmVcMzJcdWZmZmZcMVx1MDEwMFw2XHVmZmZmXDEwXDEwM1wxXHVmZmZmXDFcdTAwYWRcNFx1ZmZmZlw0XDEwM1wxXHUwMTBkXDFcdTAxMGVcMlwxMDNcMVx1ZmZmZlwxXDEwM1wxXHUwMTEyXDZcMTAzXDFcdWZmZmZcM1wxMDNcMVx1ZmZmZlwxXDEwM1wxXHUwMTFlXDFcdTAxMWZcMTNcMTAzXDFcdTAxMmNcMlwxMDNcMVx1MDEyZlwxXHUwMTMzXDZcMTAzXDFcdTAxM2FcNlwxMDNcMVx1MDE0MVwyXDEwM1wxXHVmZmZmXDFcdTAxNDRcN1wxMDNcMVx1MDE0ZFwxXHVmZmZmXDVcMTAzXDdcdWZmZmZcMVx1MDE1M1wxMFwxMDNcMVx1MDE1Y1wyXDEwM1wyXHVmZmZmXDJcMTAzXDFcdTAxNjFcMVx1ZmZmZlwxM1wxMDNcMlx1ZmZmZlw0XDEwM1wxXHUwMTcxXDRcMTAzXDFcdTAxNzZcMlwxMDNcMVx1ZmZmZlwxXHUwMTc5XDFcMTAzXDFcdWZmZmZcM1wxMDNcMVx1ZmZmZlwyXDEwM1wxXHUwMTgxXDNcMTAzXDFcdWZmZmZcNlwxMDNcMVx1ZmZmZlwyXDEwM1wxXHVmZmZmXDFcdTAxOGRcMlwxMDNcMVx1MDE5MFwyXDEwM1wxXHUwMTkzXDFcdTAxOTRcMVx1ZmZmZlwxXDEwM1wxXHUwMTk2XDNcMTAzXDFcdWZmZmZcNFwxMDNcMVx1MDE5ZVwzXDEwM1wxXHVmZmZmXDFcMTAzXDFcdTAxYTNcMVwxMDNcMVx1MDFhNVwxXHVmZmZmXDFcMTAzXDFcdTAxYTdcMTVcMTAzXDFcdWZmZmZcNFwxMDNcMVx1ZmZmZlwyXDEwM1wxXHVmZmZmXDFcdTAxYmNcM1wxMDNcMVx1MDFjMFwyXDEwM1wxXHVmZmZmXDFcdTAxYzRcNlwxMDNcMVx1MDFjYlwzXDEwM1wxXHVmZmZmXDJcMTAzXDFcdWZmZmZcMVx1MDFkMVwxXDEwM1wyXHVmZmZmXDFcMTAzXDFcdWZmZmZcMVx1MDFkNFw2XDEwM1wxXHVmZmZmXDRcMTAzXDFcdWZmZmZcMVwxMDNcMVx1ZmZmZlwxXHUwMWUwXDFcdWZmZmZcMVwxMDNcMVx1MDFlMlwxXDEwM1wxXHUwMWU0XDVcMTAzXDFcdTAxZWFcMVx1MDFlYlwxXHUwMWVjXDJcMTAzXDFcdTAxZWZcNFwxMDNcMVx1MDFmNFwxXHVmZmZmXDNcMTAzXDFcdWZmZmZcMVx1MDFmYVwyXDEwM1wxXHVmZmZmXDFcdTAxZmRcMVx1MDFmZVwyXDEwM1wxXHUwMjAxXDFcdTAyMDJcMVx1ZmZmZlw1XDEwM1wxXHVmZmZmXDFcdTAyMDhcMlx1ZmZmZlwxXDEwM1wxXHUwMjBhXDVcMTAzXDFcdTAyMTBcMVx1MDIxMVwxXDEwM1wxXHUwMjEzXDFcdWZmZmZcMVwxMDNcMVx1ZmZmZlwxXDEwM1wxXHVmZmZmXDJcMTAzXDFcdTAyMThcMlwxMDNcM1x1ZmZmZlwyXDEwM1wxXHVmZmZmXDJcMTAzXDFcdTAyMWZcMVx1MDIyMFwxXHVmZmZmXDFcMTAzXDFcdTAyMjJcMVx1MDIyNFwyXDEwM1wxXHVmZmZmXDJcMTAzXDJcdWZmZmZcMlwxMDNcMlx1ZmZmZlw1XDEwM1wxXHVmZmZmXDFcMTAzXDFcdWZmZmZcMVx1MDIzMlw0XDEwM1wyXHVmZmZmXDFcdTAyMzdcMVx1ZmZmZlw0XDEwM1wxXHVmZmZmXDFcMTAzXDFcdTAyM2RcMVwxMDNcMVx1MDIzZlwyXDEwM1wyXHVmZmZmXDFcMTAzXDFcdWZmZmZcMVwxMDNcMVx1ZmZmZlwyXDEwM1wxXHUwMjQ2XDFcdTAyNDdcNFwxMDNcMVx1MDI0Y1wxXHUwMjRkXDNcMTAzXDFcdWZmZmZcNFwxMDNcMVx1ZmZmZlwzXDEwM1wxXHUwMjU4XDFcMTAzXDFcdWZmZmZcMVwxMDNcMVx1ZmZmZlwxXDEwM1wxXHUwMjVjXDRcMTAzXDJcdWZmZmZcMVwxMDNcMVx1MDI2MlwyXDEwM1wyXHVmZmZmXDFcdTAyNjVcM1wxMDNcMVx1MDI2OVwzXDEwM1wxXHUwMjZkXDFcMTAzXDFcdWZmZmZcMVx1MDI2ZlwxXDEwM1wxXHUwMjcxXDFcdWZmZmZcMlwxMDNcMVx1MDI3NFwyXDEwM1wxXHVmZmZmXDJcMTAzXDFcdWZmZmZcM1wxMDNcMVx1ZmZmZlwyXDEwM1wxXHUwMjdlXDFcdWZmZmZcMVx1MDI3ZlwxXHVmZmZmXDFcdTAyODBcMVx1ZmZmZlwyXDEwM1wxXHVmZmZmXDZcMTAzXDFcdTAyODlcMlwxMDNcM1x1ZmZmZlwxXDEwM1wxXHUwMjhkXDFcdTAyOGVcMVwxMDNcMVx1MDI5MFwzXDEwM1wxXHVmZmZmXDFcMTAzXDFcdTAyOTVcMVwxMDNcMlx1ZmZmZlwxXDEwM1wxXHVmZmZmXDFcMTAzXDFcdTAyOTlcMlwxMDNcMVx1ZmZmZlwxXHUwMjljXDFcdTAyOWRcMVx1MDI5ZVwxXHVmZmZmXDJcMTAzXDNcdWZmZmZcMTJcMTAzXDFcdTAyYWJcMVwxMDNcMVx1ZmZmZlw2XDEwM1wxXHUwMmIzXDFcdWZmZmYiOworICAgICAgICAiXDFcdWZmZmZcMlwxMDRcMlx1ZmZmZlwyNFwxMDRcMVwxNzZcMVx1MDA4MVw1XHVmZmZmXDFcdTAwODlcM1x1ZmZmZlwxXHUwMDhmXDFcdTAwOTNcMVx1MDA5N1wxXHUwMDk5XDFcdTAwOWNcMVx1MDA5ZVwxXHUwMGEwXDFcdTAwYTJcMVx1MDBhNFwxXHUwMGE3XDFcdTAwYTlcN1wxMDRcMlx1MDBiNFwxXDc1XDVcdWZmZmZcNlwxMDRcMVx1ZmZmZlwxXDEwNFwxXHUwMGMwXDNcMTA0XDJcdWZmZmZcMlwxMDRcMVx1MDBjOVwyXDEwNFwxXHUwMGNlXDMzXDEwNFwxXHUwMGY0XDZcMTA0XDFcdTAwZmVcMVwxMDRcMVx1MDEwMFwzXDEwNFwxXHUwMTA2XDJcMTA0XDFcdTAxMGFcMTFcdWZmZmZcMVx1MDEwY1wzM1x1ZmZmZlwxXHUwMTBlXDZcdWZmZmZcMTBcMTA0XDFcdWZmZmZcMVx1MDBiNFw0XHVmZmZmXDRcMTA0XDFcdTAxMWJcMVx1MDExY1wyXDEwNFwxXHVmZmZmXDFcMTA0XDFcdTAxMjBcNlwxMDRcMVx1ZmZmZlw0XDEwNFwxXHVmZmZmXDFcMTA0XDFcdTAxMmZcMVx1MDEzMFwxXDEwNFwxXHUwMTMyXDEyXDEwNFwxXHUwMTNmXDJcMTA0XDFcdTAxNDJcMVx1MDE0Nlw3XDEwNFwxXHUwMTRlXDZcMTA0XDFcdTAxNTVcMlwxMDRcMVx1ZmZmZlwxXHUwMTU4XDdcMTA0XDFcdTAxNjFcMVx1ZmZmZlwxXDEwNFwxXHVmZmZmXDVcMTA0XDFcdWZmZmZcMVx1MDE2OFwxXDEwNFw2XHVmZmZmXDFcdTAxNmFcMTBcMTA0XDFcdTAxNzNcMlwxMDRcMlx1ZmZmZlwyXDEwNFwxXHUwMTc4XDFcdWZmZmZcMTZcMTA0XDJcdWZmZmZcMVwxMDRcMVx1ZmZmZlwzXDEwNFwxXHUwMThiXDVcMTA0XDFcdTAxOTJcMlwxMDRcMVx1ZmZmZlwxXHUwMTk1XDFcMTA0XDFcdWZmZmZcM1wxMDRcMVx1ZmZmZlwyXDEwNFwxXHUwMTlkXDRcMTA0XDFcdWZmZmZcNlwxMDRcMVx1ZmZmZlwyXDEwNFwxXHVmZmZmXDFcdTAxYWFcMlwxMDRcMVx1MDFhZFwyXDEwNFwxXHUwMWIwXDFcdTAxYjFcMVx1ZmZmZlwxXDEwNFwxXHUwMWIzXDRcMTA0XDFcdWZmZmZcMVx1MDFiOFwxXHVmZmZmXDRcMTA0XDFcdTAxYmRcM1wxMDRcMVx1ZmZmZlwxXDEwNFwxXHUwMWMyXDFcMTA0XDFcdTAxYzRcMVx1ZmZmZlwxXDEwNFwxXHUwMWM2XDIwXDEwNFwxXHVmZmZmXDZcMTA0XDFcdWZmZmZcMlwxMDRcMVx1ZmZmZlwxXHUwMWUwXDNcMTA0XDFcdTAxZTRcMlwxMDRcMVx1ZmZmZlwxXHUwMWU4XDdcMTA0XDFcdTAxZjBcM1wxMDRcMVx1ZmZmZlwyXDEwNFwxXHVmZmZmXDFcdTAxZjZcMVwxMDRcMlx1ZmZmZlwxXDEwNFwxXHVmZmZmXDFcdTAxZjlcMVx1MDFmYVwyXDEwNFwxXHVmZmZmXDRcMTA0XDFcdWZmZmZcNFwxMDRcMVx1ZmZmZlwxXDEwNFwxXHVmZmZmXDFcdTAyMDZcMVx1ZmZmZlwxXDEwNFwxXHUwMjA4XDFcMTA0XDFcdTAyMGFcMVx1MDIwYlw3XDEwNFwxXHUwMjEzXDFcdTAyMTRcMVx1MDIxNVwyXDEwNFwxXHUwMjE4XDFcMTA0XDFcdTAyMWFcNFwxMDRcMVx1MDIxZlwxXHVmZmZmXDNcMTA0XDFcdWZmZmZcM1wxMDRcMVx1ZmZmZlwxXHUwMjI3XDFcdTAyMjhcM1wxMDRcMVx1MDIyZFwxXHUwMjJlXDFcdWZmZmZcNVwxMDRcMVx1ZmZmZlwxXHUwMjM0XDNcdWZmZmZcMVwxMDRcMVx1MDIzNlw1XDEwNFwxXHUwMjNjXDFcdTAyM2RcMVwxMDRcMVx1MDIzZlwxXHVmZmZmXDFcMTA0XDFcdWZmZmZcMVwxMDRcMlx1ZmZmZlw0XDEwNFwxXHUwMjQ2XDJcMTA0XDNcdWZmZmZcMlwxMDRcMVx1ZmZmZlwxXDEwNFwxXHVmZmZmXDJcMTA0XDFcdTAyNGVcMVx1MDI0ZlwxXHVmZmZmXDFcMTA0XDFcdTAyNTFcMVx1MDI1M1w0XDEwNFwyXHVmZmZmXDRcMTA0XDJcdWZmZmZcNVwxMDRcMVx1ZmZmZlwxXDEwNFwxXHVmZmZmXDFcdTAyNjNcNFwxMDRcMlx1ZmZmZlwxXHUwMjY4XDFcdWZmZmZcNlwxMDRcMVx1ZmZmZlwxXDEwNFwxXHUwMjcwXDFcMTA0XDFcdTAyNzJcM1wxMDRcMlx1ZmZmZlwxXDEwNFwxXHVmZmZmXDFcMTA0XDFcdWZmZmZcMlwxMDRcMVx1MDI3YVwxXHUwMjdiXDZcMTA0XDFcdTAyODJcMVx1MDI4M1wzXDEwNFwxXHVmZmZmXDRcMTA0XDFcdWZmZmZcMlwxMDRcMVx1MDI4ZFwyXDEwNFwxXHUwMjkwXDFcMTA0XDFcdWZmZmZcMVwxMDRcMVx1ZmZmZlwyXDEwNFwxXHUwMjk1XDRcMTA0XDJcdWZmZmZcM1wxMDRcMVx1MDI5ZFwyXDEwNFwyXHVmZmZmXDFcdTAyYTBcM1wxMDRcMVx1MDJhNFwzXDEwNFwxXHUwMmE4XDFcdWZmZmZcMlwxMDRcMVx1ZmZmZlwxXHUwMmFiXDFcMTA0XDFcdTAyYWRcMVwxMDRcMVx1ZmZmZlwyXDEwNFwxXHUwMmIxXDRcMTA0XDFcdWZmZmZcMlwxMDRcMVx1ZmZmZlwzXDEwNFwxXHVmZmZmXDJcMTA0XDFcdTAyYmRcMVx1ZmZmZlwxXHUwMmJlXDFcMTA0XDFcdWZmZmZcMVx1MDJjMFwxXHVmZmZmXDNcMTA0XDFcdWZmZmZcMTBcMTA0XDFcdTAyY2NcMlwxMDRcMlx1ZmZmZlwxXDEwNFwxXHVmZmZmXDFcdTAyZDBcMVwxMDRcMVx1MDJkMlwxXHUwMmQzXDFcdTAyZDRcMVx1MDJkNVwxXDEwNFwxXHUwMmQ3XDNcMTA0XDFcdWZmZmZcMVwxMDRcMVx1MDJkY1wxXDEwNFwxXHVmZmZmXDFcMTA0XDRcdWZmZmZcMVwxMDRcMVx1ZmZmZlwxXDEwNFwxXHUwMmUxXDJcMTA0XDFcdWZmZmZcMVwxMDRcMVx1MDJlNVwxXHUwMmU2XDFcdTAyZTdcMVx1ZmZmZlwzXDEwNFwzXHVmZmZmXDE3XDEwNFwxXHUwMmZhXDFcMTA0XDFcdTAyZmNcMVx1ZmZmZlwxXDEwNFwxXHVmZmZmXDVcMTA0XDFcdTAzMDNcMVx1ZmZmZiI7CiAgICAgc3RhdGljIGZpbmFsIFN0cmluZyBERkEyMV9lb2ZTID0KLSAgICAgICAgIlx1MDJiNFx1ZmZmZiI7CisgICAgICAgICJcdTAzMDRcdWZmZmYiOwogICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgREZBMjFfbWluUyA9Ci0gICAgICAgICJcMVwwXDFcMTQxXDFcMTUwXDJcdWZmZmZcMVwxNDZcMVwxNDVcMVwxNDFcMVwxNDVcMVwxNTRcMVwxNDFcMVwxMTVcMVwxNDFcMVwxNTdcMVwxMjNcMVwxNjVcMVwxNTNcMVwxMDRcMVwxNDVcMVwxNDFcMVwxNDVcMVwxNDNcMVwxNTBcMVwxNTRcMVw1NlwxXDUyXDVcdWZmZmZcMVw3NVwzXHVmZmZmXDFcNTNcMVw1NVwxXDUyXDFcNzVcMVw3NlwxXDc1XDFcMTc0XDFcNDZcMVw3NVwxXDU2XDFcNzJcMVwxNjBcMVwxNDFcMVwxNjRcMVwxNTZcMVwxNDFcMVwxNTFcMVwxNDFcMlw2MFwxXDQ0XDVcdWZmZmZcMVwxNDNcMVwxNTdcMVwxNDFcMVwxNDdcMVwxNDZcMVwxNjJcMVx1ZmZmZlwxXDE2NFwxXDQ0XDFcMTY1XDFcMTYwXDFcMTYyXDJcdWZmZmZcMVwxNDRcMVwxNjBcMVw0NFwxXDE0NlwxXDQ0XDFcMTQzXDFcMTU0XDFcMTU1XDFcMTQ1XDFcMTQzXDFcMTYwXDFcMTU0XDFcMTYyXDFcMTU3XDFcMTU0XDFcMTE0XDFcMTYwXDFcMTU1XDFcMTQ1XDFcMTYyXDFcMTQzXDFcMTI2XDFcMTU3XDFcMTUxXDFcMTQxXDFcMTUxXDFcMTYwXDFcMTU2XDFcMTExXDFcMTQ1XDFcMTQ0XDFcNDRcMVwxNjdcMVwxNTRcMVwxNDVcMVwxNDNcMVwxNDRcMVwxNzFcMVw0NFwyXDE2NFwxXDE1MVwxXDE1NFwxXDQ0XDFcNzRcMTFcdWZmZmZcMVw3NVwzMlx1ZmZmZlwxXDc1XDZcdWZmZmZcMVwxNDdcMVwxNjdcMVwxNTZcMVwxNDFcMVwxNTFcMVwxNjRcMVwxNTRcMVwxNTZcMVx1ZmZmZlwxXDYwXDRcdWZmZmZcMVwxNTNcMVwxNTBcMVwxNjBcMVwxNTFcMlw0NFwxXDE2M1wxXDE1NFwxXHVmZmZmXDFcMTQ1XDFcNDRcMVwxNDVcMVwxNTdcMlwxNDVcMVwxNjRcMVwxNTdcMVx1ZmZmZlwxXDE0M1wxXDE1MVwxXDE0MVwxXHVmZmZmXDFcMTY0XDJcNDRcMVwxNTdcMVwxNjVcMVwxNTdcMVwxNTVcMVwxNDVcMVwxNTdcMVwxNTFcMVwxNjJcMlwxNDVcMVwxNDFcMVw0NFwxXDE1NVwxXDE2M1wyXDQ0XDFcMTUzXDFcMTQ1XDJcMTQ3XDFcMTQxXDFcMTUzXDFcNDRcMVwxNjRcMVwxNjBcMlwxNjRcMVwxNDVcMVwxNDNcMVw0NFwxXDE0M1wxXDE0NVwxXHVmZmZmXDFcNDRcMVwxNTRcMVwxNDFcMVwxNTBcMVwxNDVcMVwxNDNcMVwxNTFcMVwxNzFcMVw0NFwxXHVmZmZmXDFcMTQ1XDFcMTUwXDFcMTU0XDFcMTU3XDFcMTUxXDdcdWZmZmZcMVw0NFwxXDEwNFwxXDE1N1wxXDE2MlwxXDE2NlwxXDE0NVwxXDE1NFwxXDE0NFwxXDE0MVwxXDQ0XDFcMTQ1XDFcMTU2XDJcdWZmZmZcMVwxNTFcMVwxNDVcMVw0NFwxXHVmZmZmXDFcMTU3XDFcMTY3XDFcMTYyXDFcMTU2XDFcMTQxXDJcMTYyXDFcMTU1XDFcMTY1XDFcMTU3XDFcMTQ0XDJcdWZmZmZcMlwxNjJcMVwxNjZcMVwxNDVcMVw0NFwxXDE0NFwxXDE2NFwxXDE0NVwxXDE1NlwxXDQ0XDFcMTU0XDFcMTQxXDFcdWZmZmZcMVw0NFwxXDE0NVwxXHVmZmZmXDFcMTU0XDFcMTUxXDFcMTU3XDFcdWZmZmZcMVwxNDVcMVwxMjRcMVw0NFwxXDE0NVwxXDE1NFwxXDE2NVwxXHVmZmZmXDFcMTQ1XDFcMTE0XDFcMTUxXDFcMTQzXDFcMTYyXDFcMTUwXDFcdWZmZmZcMVwxNjVcMVwxMTZcMVx1ZmZmZlwxXDQ0XDFcMTY0XDFcMTQ1XDFcNDRcMVwxNTBcMVwxNTZcMlw0NFwxXHVmZmZmXDFcMTY0XDFcNDRcMVwxNDVcMVwxNjdcMVwxNDdcMVx1ZmZmZlwxXDE0MVwxXDE2M1wxXDE2NFwxXDE0NVwxXDQ0XDFcMTUxXDFcMTU3XDFcMTQ3XDFcdWZmZmZcMVwxNjJcMVw0NFwxXDE2M1wxXDQ0XDFcdWZmZmZcMVwxNDZcMVw0NFwxXDE0M1wxXDE2NFwxXDE1NlwxXDE2NFwyXDE1MVwxXDE1NFwxXDE2MlwxXDE0MVwxXDE2NFwxXDE1NlwxXDE0NVwxXDE1NlwxXHVmZmZmXDFcMTUxXDFcMTcxXDFcMTYzXDFcMTQ0XDFcdWZmZmZcMVwxNTRcMVwxNjRcMVx1ZmZmZlwxXDQ0XDFcMTAxXDFcMTU3XDFcMTU2XDFcNDRcMVwxNDRcMVwxNzFcMVx1ZmZmZlwxXDQ0XDFcMTQ1XDFcMTYwXDFcMTAzXDFcMTUxXDFcMTQzXDFcMTUwXDFcNDRcMVwxNjJcMVwxNjRcMVwxNDFcMVx1ZmZmZlwxXDE0NVwxXDEyM1wxXHVmZmZmXDFcNDRcMVwxNDdcMlx1ZmZmZlwxXDU1XDFcdWZmZmZcMVw0NFwxXDExNlwxXDE1NlwxXDE2NFwxXDE0NVwxXDEwNFwxXDE2MlwxXHVmZmZmXDFcMTYzXDFcMTU1XDFcMTQ1XDFcMTY0XDFcdWZmZmZcMVwxNjRcMVx1ZmZmZlwxXDQ0XDFcdWZmZmZcMVwxNTBcMVw0NFwxXDE0M1wxXDQ0XDFcMTQyXDJcMTY0XDFcMTE2XDFcMTY0XDNcNDRcMVwxNjRcMVwxNTZcMVw0NFwxXDE2M1wxXDE1MVwxXDE2M1wxXDE3MVwxXDQ0XDFcdWZmZmZcMVwxNjRcMVwxNDJcMVwxNDdcMVx1ZmZmZlwxXDQ0XDFcMTAyXDFcMTYwXDFcdWZmZmZcMlw0NFwxXDE1MFwxXDE1NlwyXDQ0XDFcdWZmZmZcMVwxNTdcMVwxNDVcMVwxNTVcMVwxMTdcMVwxNTFcMVx1ZmZmZlwxXDQ0XDJcdWZmZmZcMVwxNTdcMVw0NFwxXDE0NVwxXDE0M1wxXDE0MVwxXDE2M1wxXDE0NVwyXDQ0XDFcMTcxXDFcNDRcMVx1ZmZmZlwxXDE0MVwxXHVmZmZmXDFcMTQ1XDFcdWZmZmZcMlwxNDVcMVw0NFwxXDE0MVwxXDE0NVwzXHVmZmZmXDFcMTIzXDFcMTQ3XDFcdWZmZmZcMVwxNTFcMVwxNTdcMlw0NFwxXHVmZmZmXDFcMTY0XDJcNDRcMVwxNDFcMVwxNTZcMVx1ZmZmZlwxXDE3MVwxXDE0NVwyXHVmZmZmXDFcMTQxXDFcMTQ1XDJcdWZmZmZcMVwxNTZcMVwxMDNcMVwxNDVcMVwxNTZcMVwxNzJcMVx1ZmZmZlwxXDEyMlwxXHVmZmZmXDFcNDRcMVwxNTdcMVwxNjRcMVwxNDFcMVwxNDNcMlx1ZmZmZlwxXDQ0XDFcdWZmZmZcMVwxNTZcMVwxNTdcMVwxNDRcMVwxNjJcMVx1ZmZmZlwxXDE1NVwxXDQ0XDFcMTUxXDFcNDRcMVwxNTdcMVwxNTZcMlx1ZmZmZlwxXDE2MlwxXHVmZmZmXDFcMTU3XDFcdWZmZmZcMlwxNjRcMlw0NFwxXDE2MlwxXDE2M1wxXDE1MVwxXDE1N1wyXDQ0XDJcMTQ1XDFcMTY1XDFcdWZmZmZcMVwxNTZcMVwxNDVcMVwxNTRcMVwxNTdcMVx1ZmZmZlwxXDE0N1wxXDE0NlwxXDEwMlwxXDQ0XDFcMTQ1XDFcdWZmZmZcMVwxNzJcMVx1ZmZmZlwxXDE1NlwxXDQ0XDFcMTUxXDFcMTQ0XDFcMTUwXDFcMTUxXDJcdWZmZmZcMVwxNDFcMVw0NFwxXDE3MlwxXDE1NlwyXHVmZmZmXDFcNDRcMVwxNjNcMVwxNTZcMVwxNDRcMVw0NFwxXDE1NFwxXDE1NlwxXDE0NVwxXDQ0XDFcMTcxXDFcdWZmZmZcMVw0NFwxXDE0NVwxXDQ0XDFcdWZmZmZcMVwxNDJcMVwxNDVcMVw0NFwxXDE2NFwxXDE0M1wxXHVmZmZmXDFcMTQ1XDFcMTY0XDFcdWZmZmZcMVwxNjVcMVwxNTFcMVwxNjNcMVx1ZmZmZlwxXDE3MVwxXDE0NFwxXDQ0XDFcdWZmZmZcMVw0NFwxXHVmZmZmXDFcNDRcMVx1ZmZmZlwxXDE2NVwxXDE1NFwxXHVmZmZmXDFcMTcxXDFcMTY0XDFcMTQ0XDFcMTQ1XDFcMTU0XDFcMTYxXDFcNDRcMVwxMjVcMVwxNjNcM1x1ZmZmZlwxXDE2NFwyXDQ0XDFcMTQ1XDFcNDRcMVwxNzBcMVwxNjRcMVwxNjVcMVx1ZmZmZlwxXDE1NlwxXDQ0XDFcMTQ1XDJcdWZmZmZcMVwxNjJcMVx1ZmZmZlwxXDE2NFwxXDQ0XDFcMTQ1XDFcMTUxXDFcdWZmZmZcM1w0NFwxXHVmZmZmXDFcMTIyXDFcMTYxXDNcdWZmZmZcMVwxNDVcMVwxNjVcMVwxNjNcMVwxNDVcMVwxNjVcMVwxMTFcMVwxNTRcMVwxNDRcMVwxNjRcMVwxNDVcMVw0NFwxXDE1NlwxXHVmZmZmXDFcMTY0XDFcMTUxXDFcMTQ2XDFcMTUxXDFcMTQ1XDFcMTYyXDFcNDRcMVx1ZmZmZiI7CisgICAgICAgICJcMVwwXDFcMTQxXDFcMTUwXDJcdWZmZmZcMVwxNDZcMVwxNDVcMVwxNDFcMVwxNDVcMVwxNTRcMVwxNDFcMVwxMTVcMlwxNDFcMVwxMjNcMVwxNjVcMVwxNTNcMVwxMDRcMVwxNDVcMVwxNDFcMVwxNDVcMVwxNDNcMVwxNTBcMVwxNTRcMVwxNTFcMVw1NlwxXDUyXDVcdWZmZmZcMVw3NVwzXHVmZmZmXDFcNTNcMVw1NVwxXDUyXDNcNzVcMVwxNzRcMVw0NlwxXDc1XDFcNTZcMVw3MlwxXDE2MFwxXDE0MVwxXDE2NFwxXDE1NlwxXDE0MVwxXDE1MVwxXDE0MVwyXDYwXDFcNDRcNVx1ZmZmZlwxXDE0M1wxXDE1N1wxXDE0MVwxXDE0N1wxXDE0NlwxXDE2MlwxXHVmZmZmXDFcMTY0XDFcNDRcMVwxNjVcMVwxNjBcMVwxNjJcMlx1ZmZmZlwxXDE0NFwxXDE2MFwxXDQ0XDFcMTU2XDFcMTQ2XDFcNDRcMVwxNDNcMVwxNTRcMVwxNDZcMVwxNDVcMVwxNDNcMVwxNjBcMVwxNTRcMVwxNjJcMVwxNTdcMVwxNTRcMVwxMTRcMVwxNjBcMVwxNTVcMVwxNDVcMVwxNjJcMVwxNDNcMVwxNjRcMVwxMjZcMVwxNTdcMVwxNTFcMVwxNDFcMVwxNTFcMVwxNjBcMVwxNTZcMVwxMTFcMVwxNDVcMVwxNDRcMVw0NFwxXDE2N1wxXDE1NFwxXDE0NVwxXDE0M1wxXDE0NFwxXDE3MVwxXDQ0XDFcMTY0XDFcNDRcMVwxNjRcMVwxNDVcMVwxNTRcMVw0NFwyXDE0NFwxXDc0XDExXHVmZmZmXDFcNzVcMzNcdWZmZmZcMVw3NVw2XHVmZmZmXDFcMTQ3XDFcMTY3XDFcMTU2XDFcMTQxXDFcMTUxXDFcMTY0XDFcMTU0XDFcMTU2XDFcdWZmZmZcMVw2MFw0XHVmZmZmXDFcMTUzXDFcMTUwXDFcMTYwXDFcMTUxXDJcNDRcMVwxNjNcMVwxNTRcMVx1ZmZmZlwxXDE0NVwxXDQ0XDFcMTQ1XDFcMTU3XDJcMTQ1XDFcMTY0XDFcMTU3XDFcdWZmZmZcMVwxNTdcMVwxNDNcMVwxNDVcMVwxNDFcMVx1ZmZmZlwxXDE2NFwyXDQ0XDFcMTU3XDFcNDRcMVwxNjVcMVwxNTdcMVwxNTVcMVwxNDVcMVwxNTdcMVwxNTFcMVwxNTdcMlwxNDVcMVwxNDFcMVw0NFwxXDE1NVwxXDE2M1wyXDQ0XDFcMTUzXDFcMTQ1XDJcMTQ3XDFcMTQxXDFcMTUzXDFcMTQ1XDFcNDRcMVwxNjRcMVwxNjBcMlwxNjRcMVwxNDVcMVwxNDNcMVw0NFwxXDE0M1wxXDE0NVwxXHVmZmZmXDFcNDRcMVwxNTRcMVwxNDFcMVwxNTBcMVwxNDVcMVwxNDNcMVwxNTFcMVwxNzFcMVw0NFwxXHVmZmZmXDFcMTQ1XDFcdWZmZmZcMVwxNTBcMVwxNjJcMVwxNTRcMVwxNTdcMVwxNTFcMVx1ZmZmZlwxXDQ0XDFcMTQ1XDZcdWZmZmZcMVw0NFwxXDEwNFwxXDE1N1wxXDE2MlwxXDE2NlwxXDE0NVwxXDE1NFwxXDE0NFwxXDE0MVwxXDQ0XDFcMTQ1XDFcMTU2XDJcdWZmZmZcMVwxNTFcMVwxNDVcMVw0NFwxXHVmZmZmXDFcMTU3XDFcMTY3XDFcMTYyXDFcMTU2XDFcMTQxXDFcMTYyXDFcMTU0XDFcMTY0XDFcMTYyXDFcMTY0XDFcMTU1XDFcMTY1XDFcMTU3XDFcMTQ0XDJcdWZmZmZcMVwxNjJcMVx1ZmZmZlwxXDE2MlwxXDE2NlwxXDE0NVwxXDQ0XDFcMTQ0XDFcMTY0XDFcMTQ1XDFcMTYyXDFcMTU2XDFcNDRcMVwxNTRcMVwxNDFcMVx1ZmZmZlwxXDQ0XDFcMTQ1XDFcdWZmZmZcMVwxNTRcMVwxNTFcMVwxNTdcMVx1ZmZmZlwxXDE0NVwxXDEyNFwxXDQ0XDFcMTQ1XDFcMTU0XDFcMTY1XDFcMTYzXDFcdWZmZmZcMVwxNDVcMVwxMTRcMVwxNTFcMVwxNDNcMVwxNjJcMVwxNTBcMVx1ZmZmZlwxXDE2NVwxXDExNlwxXHVmZmZmXDFcNDRcMVwxNjRcMVwxNDVcMVw0NFwxXDE1MFwxXDE1NlwyXDQ0XDFcdWZmZmZcMVwxNjRcMVw0NFwyXDE0NVwxXDE2N1wxXDE0N1wxXHVmZmZmXDFcNDRcMVx1ZmZmZlwxXDE0MVwxXDE2M1wxXDE2NFwxXDE0NVwxXDQ0XDFcMTUxXDFcMTU3XDFcMTQ3XDFcdWZmZmZcMVwxNjJcMVw0NFwxXDE2M1wxXDQ0XDFcdWZmZmZcMVwxNDZcMVw0NFwxXDE0M1wxXDE2NFwxXDE1NlwxXDE2NFwxXDE1NFwxXDE1NlwxXDE1MVwxXDE0NVwxXDE1MVwxXDE1NFwxXDE2MlwxXDE0MVwxXDE2NFwxXDE1NlwxXDE0NVwxXDE1NlwxXHVmZmZmXDFcMTUxXDFcMTcxXDFcMTYzXDFcMTQ1XDFcMTY0XDFcMTQ0XDFcdWZmZmZcMVwxNTRcMVwxNjRcMVx1ZmZmZlwxXDQ0XDFcMTAxXDFcMTU3XDFcMTU2XDFcNDRcMVwxNDRcMVwxNzFcMVx1ZmZmZlwxXDQ0XDFcMTQ1XDFcMTYwXDFcMTY0XDFcMTAzXDFcMTUxXDFcMTQzXDFcMTUwXDFcNDRcMVwxNjJcMVwxNjRcMVwxNDFcMVx1ZmZmZlwxXDE0NVwxXDEyM1wxXHVmZmZmXDFcNDRcMVwxNDdcMlx1ZmZmZlwxXDU1XDFcdWZmZmZcMlw0NFwxXDExNlwxXDE1NlwxXHVmZmZmXDFcMTY0XDFcMTQ1XDFcMTA0XDFcMTYyXDFcdWZmZmZcMVwxNjNcMVwxNTVcMVwxNDVcMVwxNjRcMVx1ZmZmZlwxXDE2NFwxXHVmZmZmXDFcNDRcMVx1ZmZmZlwxXDE1MFwxXDQ0XDFcMTQzXDJcNDRcMVwxNjVcMVwxNDJcMVwxMDZcMlwxNjRcMVwxMTZcMVwxNjRcM1w0NFwxXDE2NFwxXDE1NlwxXDQ0XDFcMTYzXDFcNDRcMVwxMDZcMVwxNTFcMVwxNjNcMVwxNzFcMVw0NFwxXHVmZmZmXDFcMTY0XDFcMTQyXDFcMTQ3XDFcdWZmZmZcMVwxMDVcMVwxMDJcMVwxNjBcMVx1ZmZmZlwyXDQ0XDFcMTA1XDFcMTUwXDFcMTU2XDJcNDRcMVx1ZmZmZlwxXDE1N1wxXDE0NVwxXDE1NVwxXDExN1wxXDE1MVwxXHVmZmZmXDFcNDRcM1x1ZmZmZlwxXDE1N1wxXDQ0XDFcMTQ1XDFcMTQzXDFcMTQxXDFcMTYzXDFcMTQ1XDJcNDRcMVwxNzFcMVw0NFwxXHVmZmZmXDFcMTQxXDFcdWZmZmZcMVwxNDVcMlx1ZmZmZlwxXDE1NFwxXDE0NVwxXDE1MVwxXDE0NVwxXDQ0XDFcMTQxXDFcMTQ1XDNcdWZmZmZcMVwxMjNcMVwxNDdcMVx1ZmZmZlwxXDE1MVwxXHVmZmZmXDFcMTUxXDFcMTU3XDJcNDRcMVx1ZmZmZlwxXDE2NFwyXDQ0XDFcMTQxXDFcMTU2XDFcMTcxXDFcMTQ1XDJcdWZmZmZcMVwxNTVcMVwxNzBcMVwxNDFcMVwxNDVcMlx1ZmZmZlwxXDE1NlwxXDEwM1wxXDE0NVwxXDE1NlwxXDE3MlwxXHVmZmZmXDFcMTIyXDFcdWZmZmZcMVw0NFwxXDE1N1wxXDE2NFwxXDE0MVwxXDE0M1wyXHVmZmZmXDFcNDRcMVx1ZmZmZlwxXDE1NlwxXDE1N1wxXDE1NFwxXDE0NFwxXDE1NFwxXDE2MlwxXHVmZmZmXDFcMTU1XDFcNDRcMVwxNTFcMVw0NFwxXDE1N1wxXDE1NFwxXDE1NlwyXHVmZmZmXDFcMTYyXDFcdWZmZmZcMVwxNTdcMVx1ZmZmZlwyXDE2NFwyXDQ0XDJcMTYwXDFcMTYyXDFcMTYzXDFcMTUxXDFcMTU3XDJcNDRcMlwxNDVcMVwxNjVcMVx1ZmZmZlwxXDE1NlwxXDE0NVwxXDE1NFwxXDE1N1wxXHVmZmZmXDFcMTQ3XDFcMTQ2XDFcNDRcMVwxMDJcMVwxNDVcMVw0NFwxXDE0NVwxXHVmZmZmXDFcMTcyXDFcdWZmZmZcMVwxNTZcMVwxNjRcMVw0NFwxXDE1MVwxXDE0NFwxXDE1MFwxXDE1MVwyXHVmZmZmXDJcMTU3XDFcMTQxXDFcNDRcMVwxNzJcMVwxNTZcMlx1ZmZmZlwxXDQ0XDFcMTYzXDFcMTU2XDFcMTQ0XDFcNDRcMVwxNTRcMVwxNTZcMVwxNDVcMVw0NFwxXHVmZmZmXDFcMTcxXDFcMTAxXDFcdWZmZmZcMVw0NFwxXDE0NVwxXDQ0XDFcMTQ1XDFcdWZmZmZcMVwxNDJcMVwxNDVcMVw0NFwxXDE2NFwyXDE2MlwxXDE0M1wxXHVmZmZmXDFcMTQ1XDFcMTY0XDFcdWZmZmZcMVwxNjVcMVwxNTFcMVwxNjNcMVx1ZmZmZlwxXDE3MVwxXDE0NFwxXDQ0XDFcdWZmZmZcMVw0NFwxXDE0NlwxXHVmZmZmXDFcNDRcMVx1ZmZmZlwxXDE2MlwxXDE2NVwxXDE1NFwxXHVmZmZmXDFcMTcxXDNcMTY0XDFcMTQ0XDFcMTQ1XDFcMTU0XDFcMTYxXDFcNDRcMVwxMjVcMVwxNjNcMlx1ZmZmZlwxXDE2NFwxXHVmZmZmXDFcNDRcMVwxNjRcNFw0NFwxXDE0NVwxXDQ0XDFcMTcwXDFcMTY0XDFcMTY1XDFcdWZmZmZcMVwxNTZcMVw0NFwxXDE0NVwxXHVmZmZmXDFcMTQ1XDRcdWZmZmZcMVwxNjJcMVx1ZmZmZlwxXDE2NFwxXDQ0XDFcMTQ1XDFcMTUxXDFcdWZmZmZcMVwxNjJcM1w0NFwxXHVmZmZmXDFcMTIyXDFcMTYxXDFcMTExXDNcdWZmZmZcMVwxNDVcMVwxNjVcMVwxNTVcMVwxNjNcMVwxNDVcMVwxNjBcMVwxNjVcMVwxMTFcMVwxNTdcMVwxNTRcMVwxNDRcMVwxNjJcMVwxNjRcMVwxNDVcMVwxNjRcMVw0NFwxXDE1NlwxXDQ0XDFcdWZmZmZcMVwxNjRcMVx1ZmZmZlwxXDE1MVwxXDE0NlwxXDE1MVwxXDE0NVwxXDE2MlwxXDQ0XDFcdWZmZmYiOwogICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgREZBMjFfbWF4UyA9Ci0gICAgICAgICJcMVx1ZmZmZlwxXDE2MlwxXDE3MVwyXHVmZmZmXDFcMTU2XDFcMTU3XDJcMTQ1XDFcMTcwXDFcMTYyXDFcMTE1XDFcMTYwXDFcMTU3XDFcMTIzXDFcMTY1XDFcMTcxXDFcMTcwXDFcMTY1XDFcMTYyXDFcMTQ1XDFcMTU2XDFcMTUxXDFcMTYzXDFcNTZcMVw3NVw1XHVmZmZmXDFcNzZcM1x1ZmZmZlwxXDc1XDFcNzZcMlw3NVwxXDc2XDFcNzVcMVwxNzRcMVw0NlwxXDc1XDJcNzJcMVwxNjBcMVwxNTdcMVwxNjRcMVwxNTZcMVwxNDFcMVwxNTFcMVwxNDFcMVwxNzBcMVwxNTRcMVwxNzJcNVx1ZmZmZlwxXDE2NFwxXDE1N1wxXDE0MVwxXDE0N1wxXDE0NlwxXDE2MlwxXHVmZmZmXDFcMTY0XDFcMTcyXDFcMTcxXDFcMTYwXDFcMTYyXDJcdWZmZmZcMVwxNjRcMVwxNjBcMVwxNzJcMVwxNjNcMVwxNzJcMVwxNDNcMVwxNjJcMVwxNjRcMVwxNjNcMlwxNjRcMVwxNTZcMVwxNjJcMVwxNTdcMVwxNTRcMVwxMTRcMVwxNjJcMVwxNTVcMVwxNDVcMVwxNjJcMVwxNTdcMVwxMjZcMVwxNTdcMVwxNTFcMVwxNDFcMVwxNTFcMVwxNjBcMVwxNTZcMVwxMTFcMVwxNDVcMVwxNDRcMVwxNzJcMVwxNjdcMVwxNTRcMVwxNDVcMVwxNjRcMVwxNjBcMVwxNzFcMVwxNzJcMlwxNjRcMVwxNTFcMVwxNTRcMVwxNzJcMVw3NFwxMVx1ZmZmZlwxXDc1XDMyXHVmZmZmXDFcNzVcNlx1ZmZmZlwxXDE0N1wxXDE2N1wxXDE1NlwxXDE0MVwxXDE1MVwxXDE2NFwxXDE1NFwxXDE1NlwxXHVmZmZmXDFcMTU0XDRcdWZmZmZcMVwxNTNcMVwxNTBcMVwxNjBcMVwxNTFcMlwxNzJcMVwxNjNcMVwxNTRcMVx1ZmZmZlwxXDE0NVwxXDE3MlwxXDE0NVwxXDE1N1wyXDE0NVwxXDE2NFwxXDE1N1wxXHVmZmZmXDFcMTQzXDFcMTUxXDFcMTQxXDFcdWZmZmZcMVwxNjRcMlwxNzJcMVwxNTdcMVwxNjVcMVwxNTdcMVwxNTVcMVwxNDVcMVwxNTdcMVwxNTFcMVwxNjJcMlwxNDVcMVwxNDFcMVwxNzJcMVwxNTVcMVwxNjNcMlwxNzJcMVwxNTNcMVwxNDVcMlwxNDdcMVwxNDFcMVwxNTNcMVwxNzJcMVwxNjRcMVwxNjBcMlwxNjRcMVwxNDVcMVwxNDNcMVwxNzJcMVwxNDNcMVwxNDVcMVx1ZmZmZlwxXDE3MlwxXDE1NFwxXDE0MVwxXDE1MFwxXDE0NVwxXDE0M1wxXDE1MVwxXDE3MVwxXDE3MlwxXHVmZmZmXDFcMTQ1XDFcMTUwXDFcMTU0XDFcMTU3XDFcMTUxXDdcdWZmZmZcMVwxNzJcMVwxMDRcMVwxNTdcMVwxNjJcMVwxNjZcMVwxNDVcMVwxNTRcMVwxNDRcMVwxNDFcMVwxNzJcMVwxNDVcMVwxNTZcMlx1ZmZmZlwxXDE1MVwxXDE0NVwxXDE3MlwxXHVmZmZmXDFcMTU3XDFcMTY3XDFcMTYyXDFcMTU2XDFcMTQxXDJcMTYyXDFcMTU1XDFcMTY1XDFcMTU3XDFcMTQ0XDJcdWZmZmZcMlwxNjJcMVwxNjZcMVwxNDVcMVwxNzJcMVwxNDRcMVwxNjRcMVwxNDVcMVwxNTZcMVwxNzJcMVwxNTRcMVwxNDFcMVx1ZmZmZlwxXDE3MlwxXDE0NVwxXHVmZmZmXDFcMTcxXDFcMTUxXDFcMTU3XDFcdWZmZmZcMVwxNDVcMVwxMjRcMVwxNzJcMVwxNDVcMVwxNTRcMVwxNjVcMVx1ZmZmZlwxXDE0NVwxXDExNFwxXDE1MVwxXDE0M1wxXDE2MlwxXDE1MFwxXHVmZmZmXDFcMTY1XDFcMTE2XDFcdWZmZmZcMVwxNzJcMVwxNjRcMVwxNDVcMVwxNzJcMVwxNTBcMVwxNTZcMlwxNzJcMVx1ZmZmZlwxXDE2NFwxXDE3MlwxXDE0NVwxXDE2N1wxXDE0N1wxXHVmZmZmXDFcMTQxXDFcMTYzXDFcMTY0XDFcMTQ1XDFcMTcyXDFcMTUxXDFcMTU3XDFcMTQ3XDFcdWZmZmZcMVwxNjJcMVwxNzJcMVwxNjNcMVwxNzJcMVx1ZmZmZlwxXDE0NlwxXDE3MlwxXDE0M1wxXDE2NFwxXDE1NlwxXDE2NFwyXDE1MVwxXDE1NFwxXDE2MlwxXDE0MVwxXDE2NFwxXDE1NlwxXDE0NVwxXDE1NlwxXHVmZmZmXDFcMTUxXDFcMTcxXDJcMTYzXDFcdWZmZmZcMVwxNTRcMVwxNjRcMVx1ZmZmZlwxXDE3MlwxXDEwMVwxXDE1N1wxXDE1NlwxXDE3MlwxXDE2MlwxXDE3MVwxXHVmZmZmXDFcMTcyXDFcMTQ1XDFcMTYwXDFcMTAzXDFcMTUxXDFcMTQzXDFcMTUwXDFcMTcyXDFcMTYyXDFcMTY0XDFcMTQxXDFcdWZmZmZcMVwxNDVcMVwxMjNcMVx1ZmZmZlwxXDE3MlwxXDE0N1wyXHVmZmZmXDFcNTVcMVx1ZmZmZlwxXDE3MlwxXDExNlwxXDE1NlwxXDE2NFwxXDE0NVwxXDEwNFwxXDE2MlwxXHVmZmZmXDFcMTYzXDFcMTU1XDFcMTQ1XDFcMTY0XDFcdWZmZmZcMVwxNjRcMVx1ZmZmZlwxXDE3MlwxXHVmZmZmXDFcMTUwXDFcMTcyXDFcMTQzXDFcMTcyXDFcMTQyXDJcMTY0XDFcMTE2XDFcMTY0XDNcMTcyXDFcMTY0XDFcMTU2XDFcMTcyXDFcMTYzXDFcMTUxXDFcMTYzXDFcMTcxXDFcMTcyXDFcdWZmZmZcMVwxNjRcMVwxNDJcMVwxNDdcMVx1ZmZmZlwxXDE3MlwxXDEwMlwxXDE2MFwxXHVmZmZmXDJcMTcyXDFcMTUwXDFcMTU2XDJcMTcyXDFcdWZmZmZcMVwxNTdcMVwxNDVcMVwxNTVcMVwxMTdcMVwxNTFcMVx1ZmZmZlwxXDE3MlwyXHVmZmZmXDFcMTU3XDFcMTcyXDFcMTQ1XDFcMTQzXDFcMTQxXDFcMTYzXDFcMTQ1XDJcMTcyXDFcMTcxXDFcMTcyXDFcdWZmZmZcMVwxNDFcMVx1ZmZmZlwxXDE0NVwxXHVmZmZmXDJcMTQ1XDFcMTcyXDFcMTQxXDFcMTQ1XDNcdWZmZmZcMVwxMjNcMVwxNDdcMVx1ZmZmZlwxXDE1MVwxXDE1N1wyXDE3MlwxXHVmZmZmXDFcMTY0XDJcMTcyXDFcMTQxXDFcMTU2XDFcdWZmZmZcMVwxNzFcMVwxNDVcMlx1ZmZmZlwxXDE0MVwxXDE0NVwyXHVmZmZmXDFcMTU2XDFcMTAzXDFcMTQ1XDFcMTU2XDFcMTcyXDFcdWZmZmZcMVwxNTZcMVx1ZmZmZlwxXDE3MlwxXDE1N1wxXDE2NFwxXDE0MVwxXDE0M1wyXHVmZmZmXDFcMTcyXDFcdWZmZmZcMVwxNTZcMVwxNTdcMVwxNDRcMVwxNjJcMVx1ZmZmZlwxXDE1NVwxXDE3MlwxXDE1MVwxXDE3MlwxXDE1N1wxXDE1NlwyXHVmZmZmXDFcMTYyXDFcdWZmZmZcMVwxNTdcMVx1ZmZmZlwyXDE2NFwyXDE3MlwxXDE2MlwxXDE2M1wxXDE1MVwxXDE1N1wyXDE3MlwyXDE0NVwxXDE2NVwxXHVmZmZmXDFcMTU2XDFcMTQ1XDFcMTU0XDFcMTU3XDFcdWZmZmZcMVwxNDdcMVwxNDZcMVwxMDJcMVwxNzJcMVwxNDVcMVx1ZmZmZlwxXDE3MlwxXHVmZmZmXDFcMTU2XDFcMTcyXDFcMTUxXDFcMTQ0XDFcMTUwXDFcMTUxXDJcdWZmZmZcMVwxNDFcMlwxNzJcMVwxNTZcMlx1ZmZmZlwxXDE3MlwxXDE2M1wxXDE1NlwxXDE0NFwxXDE3MlwxXDE1NFwxXDE1NlwxXDE0NVwxXDE3MlwxXDE3MVwxXHVmZmZmXDFcMTcyXDFcMTQ1XDFcMTcyXDFcdWZmZmZcMVwxNDJcMVwxNDVcMVwxNzJcMVwxNjRcMVwxNDNcMVx1ZmZmZlwxXDE0NVwxXDE2NFwxXHVmZmZmXDFcMTY1XDFcMTUxXDFcMTYzXDFcdWZmZmZcMVwxNzFcMVwxNDRcMVwxNzJcMVx1ZmZmZlwxXDE3MlwxXHVmZmZmXDFcMTcyXDFcdWZmZmZcMVwxNjVcMVwxNTRcMVx1ZmZmZlwxXDE3MVwxXDE2NFwxXDE0NFwxXDE0NVwxXDE1NFwxXDE2MVwxXDE3MlwxXDEyNVwxXDE2M1wzXHVmZmZmXDFcMTY0XDJcMTcyXDFcMTQ1XDFcMTcyXDFcMTcwXDFcMTY0XDFcMTY1XDFcdWZmZmZcMVwxNTZcMVwxNzJcMVwxNDVcMlx1ZmZmZlwxXDE2MlwxXHVmZmZmXDFcMTY0XDFcMTcyXDFcMTQ1XDFcMTUxXDFcdWZmZmZcM1wxNzJcMVx1ZmZmZlwxXDEyMlwxXDE2MVwzXHVmZmZmXDFcMTQ1XDFcMTY1XDFcMTYzXDFcMTQ1XDFcMTY1XDFcMTExXDFcMTU0XDFcMTQ0XDFcMTY0XDFcMTQ1XDFcMTcyXDFcMTU2XDFcdWZmZmZcMVwxNjRcMVwxNTFcMVwxNDZcMVwxNTFcMVwxNDVcMVwxNjJcMVwxNzJcMVx1ZmZmZiI7CisgICAgICAgICJcMVx1ZmZmZlwxXDE2MlwxXDE3MVwyXHVmZmZmXDFcMTYzXDFcMTU3XDJcMTQ1XDFcMTcwXDFcMTYyXDFcMTE1XDFcMTYwXDFcMTU3XDFcMTIzXDFcMTY1XDFcMTcxXDFcMTcwXDFcMTY1XDFcMTYyXDFcMTQ1XDFcMTYyXDFcMTUxXDFcMTYzXDFcMTUxXDFcNTZcMVw3NVw1XHVmZmZmXDFcNzZcM1x1ZmZmZlwxXDc1XDFcNzZcMlw3NVwxXDc2XDFcNzVcMVwxNzRcMVw0NlwxXDc1XDJcNzJcMVwxNjBcMVwxNTdcMVwxNjRcMVwxNTZcMVwxNDFcMVwxNTFcMVwxNDFcMVwxNzBcMVwxNTRcMVwxNzJcNVx1ZmZmZlwxXDE2NFwxXDE1N1wxXDE0MVwxXDE0N1wxXDE0NlwxXDE2MlwxXHVmZmZmXDFcMTY0XDFcMTcyXDFcMTcxXDFcMTYwXDFcMTYyXDJcdWZmZmZcMVwxNjRcMVwxNjBcMVwxNzJcMVwxNTZcMVwxNjNcMVwxNzJcMVwxNDNcMVwxNjJcMVwxNjRcMVwxNjNcMlwxNjRcMVwxNTZcMVwxNjJcMVwxNTdcMVwxNTRcMVwxMTRcMVwxNjJcMVwxNTVcMVwxNDVcMVwxNjJcMVwxNTdcMVwxNjRcMVwxMjZcMVwxNTdcMVwxNTFcMVwxNDFcMVwxNTFcMVwxNjBcMVwxNTZcMVwxMTFcMVwxNDVcMVwxNDRcMVwxNzJcMVwxNjdcMVwxNTRcMVwxNDVcMVwxNjRcMVwxNjBcMVwxNzFcMVwxNzJcMVwxNjRcMVwxNzJcMVwxNjRcMVwxNTFcMVwxNTRcMVwxNzJcMlwxNDRcMVw3NFwxMVx1ZmZmZlwxXDc1XDMzXHVmZmZmXDFcNzVcNlx1ZmZmZlwxXDE0N1wxXDE2N1wxXDE1NlwxXDE0MVwxXDE1MVwxXDE2NFwxXDE1NFwxXDE1NlwxXHVmZmZmXDFcMTU0XDRcdWZmZmZcMVwxNTNcMVwxNTBcMVwxNjBcMVwxNTFcMlwxNzJcMVwxNjNcMVwxNTRcMVx1ZmZmZlwxXDE0NVwxXDE3MlwxXDE0NVwxXDE1N1wyXDE0NVwxXDE2NFwxXDE1N1wxXHVmZmZmXDFcMTY1XDFcMTQzXDFcMTUxXDFcMTQxXDFcdWZmZmZcMVwxNjRcMlwxNzJcMVwxNTdcMVwxNzJcMVwxNjVcMVwxNTdcMVwxNTVcMVwxNDVcMVwxNTdcMVwxNTFcMVwxNjJcMlwxNDVcMVwxNDFcMVwxNzJcMVwxNTVcMVwxNjNcMlwxNzJcMVwxNTNcMVwxNDVcMlwxNDdcMVwxNDFcMVwxNTNcMVwxNDVcMVwxNzJcMVwxNjRcMVwxNjBcMlwxNjRcMVwxNDVcMVwxNDNcMVwxNzJcMVwxNDNcMVwxNDVcMVx1ZmZmZlwxXDE3MlwxXDE1NFwxXDE0MVwxXDE1MFwxXDE0NVwxXDE0M1wxXDE1MVwxXDE3MVwxXDE3MlwxXHVmZmZmXDFcMTQ1XDFcdWZmZmZcMVwxNTBcMVwxNjJcMVwxNTRcMVwxNTdcMVwxNTFcMVx1ZmZmZlwxXDE3MlwxXDE0NVw2XHVmZmZmXDFcMTcyXDFcMTA0XDFcMTU3XDFcMTYyXDFcMTY2XDFcMTQ1XDFcMTU0XDFcMTQ0XDFcMTQxXDFcMTcyXDFcMTQ1XDFcMTU2XDJcdWZmZmZcMVwxNTFcMVwxNDVcMVwxNzJcMVx1ZmZmZlwxXDE1N1wxXDE2N1wxXDE2MlwxXDE1NlwxXDE0MVwxXDE2MlwxXDE1NFwxXDE2NFwxXDE2MlwxXDE2NFwxXDE1NVwxXDE2NVwxXDE1N1wxXDE0NFwyXHVmZmZmXDFcMTYyXDFcdWZmZmZcMVwxNjJcMVwxNjZcMVwxNDVcMVwxNzJcMVwxNDRcMVwxNjRcMVwxNDVcMVwxNjNcMVwxNTZcMVwxNzJcMVwxNTRcMVwxNDFcMVx1ZmZmZlwxXDE3MlwxXDE0NVwxXHVmZmZmXDFcMTcxXDFcMTUxXDFcMTU3XDFcdWZmZmZcMVwxNDVcMVwxMjRcMVwxNzJcMVwxNDVcMVwxNTRcMVwxNjVcMVwxNjNcMVx1ZmZmZlwxXDE0NVwxXDExNFwxXDE1MVwxXDE0M1wxXDE2MlwxXDE1MFwxXHVmZmZmXDFcMTY1XDFcMTE2XDFcdWZmZmZcMVwxNzJcMVwxNjRcMVwxNDVcMVwxNzJcMVwxNTBcMVwxNTZcMlwxNzJcMVx1ZmZmZlwxXDE2NFwxXDE3MlwyXDE0NVwxXDE2N1wxXDE0N1wxXHVmZmZmXDFcMTcyXDFcdWZmZmZcMVwxNDFcMVwxNjNcMVwxNjRcMVwxNDVcMVwxNzJcMVwxNTFcMVwxNTdcMVwxNDdcMVx1ZmZmZlwxXDE2MlwxXDE3MlwxXDE2M1wxXDE3MlwxXHVmZmZmXDFcMTQ2XDFcMTcyXDFcMTQzXDFcMTY0XDFcMTU2XDFcMTY0XDFcMTU0XDFcMTU2XDFcMTUxXDFcMTQ1XDFcMTUxXDFcMTU0XDFcMTYyXDFcMTQxXDFcMTY0XDFcMTU2XDFcMTQ1XDFcMTU2XDFcdWZmZmZcMVwxNTFcMVwxNzFcMVwxNjNcMVwxNDVcMVwxNjRcMVwxNjNcMVx1ZmZmZlwxXDE1NFwxXDE2NFwxXHVmZmZmXDFcMTcyXDFcMTAxXDFcMTU3XDFcMTU2XDFcMTcyXDFcMTYyXDFcMTcxXDFcdWZmZmZcMVwxNzJcMVwxNDVcMVwxNjBcMVwxNjRcMVwxMDNcMVwxNTFcMVwxNDNcMVwxNTBcMVwxNzJcMVwxNjJcMVwxNjRcMVwxNDFcMVx1ZmZmZlwxXDE0NVwxXDEyM1wxXHVmZmZmXDFcMTcyXDFcMTQ3XDJcdWZmZmZcMVw1NVwxXHVmZmZmXDJcMTcyXDFcMTE2XDFcMTU2XDFcdWZmZmZcMVwxNjRcMVwxNDVcMVwxMDRcMVwxNjJcMVx1ZmZmZlwxXDE2M1wxXDE1NVwxXDE0NVwxXDE2NFwxXHVmZmZmXDFcMTY0XDFcdWZmZmZcMVwxNzJcMVx1ZmZmZlwxXDE1MFwxXDE3MlwxXDE0M1wyXDE3MlwxXDE2NVwxXDE0MlwxXDEwNlwyXDE2NFwxXDExNlwxXDE2NFwzXDE3MlwxXDE2NFwxXDE1NlwxXDE3MlwxXDE2M1wxXDE3MlwxXDEwNlwxXDE1MVwxXDE2M1wxXDE3MVwxXDE3MlwxXHVmZmZmXDFcMTY0XDFcMTQyXDFcMTQ3XDFcdWZmZmZcMVwxMjBcMVwxMDJcMVwxNjBcMVx1ZmZmZlwyXDE3MlwxXDExMVwxXDE1MFwxXDE1NlwyXDE3MlwxXHVmZmZmXDFcMTU3XDFcMTQ1XDFcMTU1XDFcMTE3XDFcMTUxXDFcdWZmZmZcMVwxNzJcM1x1ZmZmZlwxXDE1N1wxXDE3MlwxXDE0NVwxXDE0M1wxXDE0MVwxXDE2M1wxXDE0NVwyXDE3MlwxXDE3MVwxXDE3MlwxXHVmZmZmXDFcMTQxXDFcdWZmZmZcMVwxNDVcMlx1ZmZmZlwxXDE1NFwxXDE0NVwxXDE1MVwxXDE0NVwxXDE3MlwxXDE0MVwxXDE0NVwzXHVmZmZmXDFcMTIzXDFcMTQ3XDFcdWZmZmZcMVwxNTFcMVx1ZmZmZlwxXDE1MVwxXDE1N1wyXDE3MlwxXHVmZmZmXDFcMTY0XDJcMTcyXDFcMTQxXDFcMTU2XDFcMTcxXDFcMTQ1XDJcdWZmZmZcMVwxNTVcMVwxNzBcMVwxNDFcMVwxNDVcMlx1ZmZmZlwxXDE1NlwxXDEwM1wxXDE0NVwxXDE1NlwxXDE3MlwxXHVmZmZmXDFcMTU2XDFcdWZmZmZcMVwxNzJcMVwxNTdcMVwxNjRcMVwxNDFcMVwxNDNcMlx1ZmZmZlwxXDE3MlwxXHVmZmZmXDFcMTU2XDFcMTU3XDFcMTU0XDFcMTQ0XDFcMTU0XDFcMTYyXDFcdWZmZmZcMVwxNTVcMVwxNzJcMVwxNTFcMVwxNzJcMVwxNTdcMVwxNTRcMVwxNTZcMlx1ZmZmZlwxXDE2MlwxXHVmZmZmXDFcMTU3XDFcdWZmZmZcMlwxNjRcMlwxNzJcMlwxNjBcMVwxNjJcMVwxNjNcMVwxNTFcMVwxNTdcMlwxNzJcMlwxNDVcMVwxNjVcMVx1ZmZmZlwxXDE1NlwxXDE0NVwxXDE1NFwxXDE1N1wxXHVmZmZmXDFcMTQ3XDFcMTQ2XDFcMTcyXDFcMTAyXDFcMTQ1XDFcMTcyXDFcMTQ1XDFcdWZmZmZcMVwxNzJcMVx1ZmZmZlwxXDE1NlwxXDE2NFwxXDE3MlwxXDE1MVwxXDE0NFwxXDE1MFwxXDE1MVwyXHVmZmZmXDJcMTU3XDFcMTQxXDJcMTcyXDFcMTU2XDJcdWZmZmZcMVwxNzJcMVwxNjNcMVwxNTZcMVwxNDRcMVwxNzJcMVwxNTRcMVwxNTZcMVwxNDVcMVwxNzJcMVx1ZmZmZlwxXDE3MVwxXDEwMVwxXHVmZmZmXDFcMTcyXDFcMTQ1XDFcMTcyXDFcMTQ1XDFcdWZmZmZcMVwxNDJcMVwxNDVcMVwxNzJcMVwxNjRcMlwxNjJcMVwxNDNcMVx1ZmZmZlwxXDE0NVwxXDE2NFwxXHVmZmZmXDFcMTY1XDFcMTUxXDFcMTYzXDFcdWZmZmZcMVwxNzFcMVwxNDRcMVwxNzJcMVx1ZmZmZlwxXDE3MlwxXDE0NlwxXHVmZmZmXDFcMTcyXDFcdWZmZmZcMVwxNjJcMVwxNjVcMVwxNTRcMVx1ZmZmZlwxXDE3MVwzXDE2NFwxXDE0NFwxXDE0NVwxXDE1NFwxXDE2MVwxXDE3MlwxXDEyNVwxXDE2M1wyXHVmZmZmXDFcMTY0XDFcdWZmZmZcMVwxNzJcMVwxNjRcNFwxNzJcMVwxNDVcMVwxNzJcMVwxNzBcMVwxNjRcMVwxNjVcMVx1ZmZmZlwxXDE1NlwxXDE3MlwxXDE0NVwxXHVmZmZmXDFcMTQ1XDRcdWZmZmZcMVwxNjJcMVx1ZmZmZlwxXDE2NFwxXDE3MlwxXDE0NVwxXDE1MVwxXHVmZmZmXDFcMTYyXDNcMTcyXDFcdWZmZmZcMVwxMjJcMVwxNjFcMVwxMTFcM1x1ZmZmZlwxXDE0NVwxXDE2NVwxXDE1NVwxXDE2M1wxXDE0NVwxXDE2MFwxXDE2NVwxXDExMVwxXDE1N1wxXDE1NFwxXDE0NFwxXDE2MlwxXDE2NFwxXDE0NVwxXDE2NFwxXDE3MlwxXDE1NlwxXDE3MlwxXHVmZmZmXDFcMTY0XDFcdWZmZmZcMVwxNTFcMVwxNDZcMVwxNTFcMVwxNDVcMVwxNjJcMVwxNzJcMVx1ZmZmZiI7CiAgICAgc3RhdGljIGZpbmFsIFN0cmluZyBERkEyMV9hY2NlcHRTID0KLSAgICAgICAgIlwzXHVmZmZmXDFcM1wxXDRcMjVcdWZmZmZcMVw3NFwxXDc1XDFcNzZcMVw3N1wxXDEwMFwxXHVmZmZmXDFcMTAyXDFcMTAzXDFcMTA0XDI1XHVmZmZmXDFcdTAwOTJcMlx1MDA5M1wxXHUwMDk2XDFcdTAwOTdcNlx1ZmZmZlwxXHUwMDkyXDVcdWZmZmZcMVwzXDFcNFw1NVx1ZmZmZlwxXDY3XDFcMTA3XDFcMTM0XDFcNzJcMVw3NFwxXDc1XDFcNzZcMVw3N1wxXDEwMFwxXHVmZmZmXDFcMTI3XDFcMTAxXDFcMTAyXDFcMTAzXDFcMTA0XDFcMTA1XDFcMTQwXDFcMTMyXDFcMTA2XDFcMTI0XDFcMTQxXDFcMTMzXDFcMTEwXDFcdTAwOTRcMVx1MDA5NVwxXDEzNVwxXDExMVwxXDEzNlwxXDEzMFwxXDExMlwxXDExNFwxXDExM1wxXDExNVwxXDE0NFwxXDExNlwxXDE3NVwxXHVmZmZmXDFcMTM3XDFcMTMxXDFcMTQzXDFcMTc0XDFcMTQyXDFcMTUwXDEwXHVmZmZmXDFcdTAwOGZcMVx1ZmZmZlwxXHUwMDkwXDFcdTAwOTFcMVx1MDA5M1wxXHUwMDk2XDEwXHVmZmZmXDFcNjNcMTBcdWZmZmZcMVwxNDVcM1x1ZmZmZlwxXDE1NFw0M1x1ZmZmZlwxXDczXDExXHVmZmZmXDFcNDNcNVx1ZmZmZlwxXDYxXDFcMTI1XDFcMTI2XDFcMTIxXDFcMTE3XDFcMTIyXDFcMTIwXDE0XHVmZmZmXDFcdTAwODBcMVx1MDA4M1wzXHVmZmZmXDFcMTcwXDEzXHVmZmZmXDFcMTU2XDFcMTU1XDE0XHVmZmZmXDFcNDJcMlx1ZmZmZlwxXDE0XDNcdWZmZmZcMVw2Mlw2XHVmZmZmXDFcMjBcNlx1ZmZmZlwxXDI1XDJcdWZmZmZcMVwxNjFcMTBcdWZmZmZcMVw0MVw1XHVmZmZmXDFcMTc3XDEwXHVmZmZmXDFcMTNcNFx1ZmZmZlwxXDE2M1wxN1x1ZmZmZlwxXDE0Nlw0XHVmZmZmXDFcMTJcMlx1ZmZmZlwxXDU2XDdcdWZmZmZcMVx1MDA4MVwxM1x1ZmZmZlwxXDE2NFwyXHVmZmZmXDFcMTUyXDJcdWZmZmZcMVw1NVwxXDQwXDFcdWZmZmZcMVw0NFw3XHVmZmZmXDFcdTAwODdcNFx1ZmZmZlwxXDE3NlwxXHVmZmZmXDFcMlwxXHVmZmZmXDFcMTY2XDI0XHVmZmZmXDFcMTYyXDNcdWZmZmZcMVw0NlwzXHVmZmZmXDFcdTAwOGRcNlx1ZmZmZlwxXDE2MFw1XHVmZmZmXDFcMTczXDFcdWZmZmZcMVx1MDA4MlwxXDE1M1wxM1x1ZmZmZlwxXDE2NVwxXHVmZmZmXDFcMjRcMVx1ZmZmZlwxXDcwXDVcdWZmZmZcMVwxMFwxXDE2N1wxXHUwMDhlXDJcdWZmZmZcMVwzMFw0XHVmZmZmXDFcMzZcNVx1ZmZmZlwxXDMzXDJcdWZmZmZcMVwxN1wxXDM1XDJcdWZmZmZcMVw3MVwxXDE0N1w1XHVmZmZmXDFcNTRcMVx1ZmZmZlwxXDYwXDVcdWZmZmZcMVx1MDA4YVwxXDFcMVx1ZmZmZlwxXHUwMDhjXDRcdWZmZmZcMVwxNTFcNlx1ZmZmZlwxXDE1N1wxXDE3MVwxXHVmZmZmXDFcNjRcMVx1ZmZmZlwxXDM3XDE1XHVmZmZmXDFcdTAwODRcNFx1ZmZmZlwxXDU3XDVcdWZmZmZcMVwyN1wxXHVmZmZmXDFcMTZcNlx1ZmZmZlwxXDUzXDFcNjZcNFx1ZmZmZlwxXDMxXDFcMzJcMTJcdWZmZmZcMVwyMVwzXHVmZmZmXDFcNjVcNVx1ZmZmZlwxXDIzXDJcdWZmZmZcMVw0NVwzXHVmZmZmXDFcdTAwODVcM1x1ZmZmZlwxXDEyM1wxXHVmZmZmXDFcN1wxXHVmZmZmXDFcMzRcMlx1ZmZmZlwxXDUxXDExXHVmZmZmXDFcNVwxXDZcMVwxMVwxMFx1ZmZmZlwxXHUwMDg5XDNcdWZmZmZcMVwyNlwxXDUyXDFcdWZmZmZcMVwxNzJcNFx1ZmZmZlwxXHUwMDg4XDNcdWZmZmZcMVw0N1wyXHVmZmZmXDFcMTVcMVwyMlwxXHUwMDhiXDE0XHVmZmZmXDFcNTBcN1x1ZmZmZlwxXHUwMDg2IjsKKyAgICAgICAgIlwzXHVmZmZmXDFcM1wxXDRcMjZcdWZmZmZcMVwxMDNcMVwxMDRcMVwxMDVcMVwxMDZcMVwxMDdcMVx1ZmZmZlwxXDExMVwxXDExMlwxXDExM1wyNVx1ZmZmZlwxXHUwMDllXDJcdTAwOWZcMVx1MDBhMlwxXHUwMGEzXDZcdWZmZmZcMVx1MDA5ZVw1XHVmZmZmXDFcM1wxXDRcNjJcdWZmZmZcMVw3NlwxXDExNlwxXDE0M1wxXDEwMVwxXDEwM1wxXDEwNFwxXDEwNVwxXDEwNlwxXDEwN1wxXHVmZmZmXDFcMTM2XDFcMTEwXDFcMTExXDFcMTEyXDFcMTEzXDFcMTE0XDFcMTQ3XDFcMTQxXDFcMTE1XDFcMTMzXDFcMTUwXDFcMTQyXDFcMTE3XDFcdTAwYTBcMVx1MDBhMVwxXDE0NFwxXDEyMFwxXDE0NVwxXDEzN1wxXHUwMDk2XDFcMTIxXDFcMTIzXDFcMTIyXDFcMTI0XDFcMTUzXDFcMTI1XDFcdTAwODRcMVx1ZmZmZlwxXDE0NlwxXDE0MFwxXDE1MlwxXHUwMDgzXDFcMTUxXDFcMTU3XDEwXHVmZmZmXDFcdTAwOWJcMVx1ZmZmZlwxXHUwMDljXDFcdTAwOWRcMVx1MDA5ZlwxXHUwMGEyXDEwXHVmZmZmXDFcNzJcMTBcdWZmZmZcMVwxNTRcNFx1ZmZmZlwxXDE2M1w0NVx1ZmZmZlwxXDEwMlwxMVx1ZmZmZlwxXDQ3XDFcdWZmZmZcMVx1MDA5YVw1XHVmZmZmXDFcNzBcMlx1ZmZmZlwxXDEzNFwxXDEzNVwxXDEzMFwxXDEyNlwxXDEzMVwxXDEyN1wxNFx1ZmZmZlwxXHUwMDg3XDFcdTAwOGFcM1x1ZmZmZlwxXDE3N1wxNlx1ZmZmZlwxXDE2NVwxXDE2NFwxXHVmZmZmXDFcNjRcMTRcdWZmZmZcMVw0NlwyXHVmZmZmXDFcMTVcM1x1ZmZmZlwxXDcxXDdcdWZmZmZcMVwyMVw2XHVmZmZmXDFcMjZcMlx1ZmZmZlwxXDE3MFwxMFx1ZmZmZlwxXDQ1XDZcdWZmZmZcMVx1MDA5OVwxXHVmZmZmXDFcdTAwODZcMTBcdWZmZmZcMVwxNFw0XHVmZmZmXDFcMTcyXDIyXHVmZmZmXDFcMTU1XDZcdWZmZmZcMVwxM1wyXHVmZmZmXDFcNjJcN1x1ZmZmZlwxXHUwMDg4XDE0XHVmZmZmXDFcMTczXDJcdWZmZmZcMVwxNjFcMlx1ZmZmZlwxXDYxXDFcNDNcMVx1ZmZmZlwxXDUwXDRcdWZmZmZcMVw2Nlw0XHVmZmZmXDFcdTAwOGVcNFx1ZmZmZlwxXHUwMDg1XDFcdWZmZmZcMVwyXDFcdWZmZmZcMVwxNzVcMzFcdWZmZmZcMVwxNzFcM1x1ZmZmZlwxXDUyXDNcdWZmZmZcMVx1MDA5NFw3XHVmZmZmXDFcMTY3XDVcdWZmZmZcMVx1MDA4MlwxXHVmZmZmXDFcdTAwODlcMVw2NVwxXDE2MlwxM1x1ZmZmZlwxXDE3NFwxXHVmZmZmXDFcMjVcMVx1ZmZmZlwxXDc3XDFcdTAwOTdcN1x1ZmZmZlwxXDEwXDFcMTc2XDFcdTAwOTVcMlx1ZmZmZlwxXDMxXDFcdWZmZmZcMVw0MVw0XHVmZmZmXDFcNDBcN1x1ZmZmZlwxXDIwXDFcMzdcNFx1ZmZmZlwxXDEwMFwxXDE1Nlw1XHVmZmZmXDFcNjBcMVx1ZmZmZlwxXDY3XDVcdWZmZmZcMVx1MDA5MVwxXDFcMVx1ZmZmZlwxXHUwMDkzXDZcdWZmZmZcMVwxNjBcN1x1ZmZmZlwxXDE2NlwxXHUwMDgwXDFcdWZmZmZcMVw3M1wxXHVmZmZmXDFcNDJcMTdcdWZmZmZcMVx1MDA4Ylw0XHVmZmZmXDFcNjNcN1x1ZmZmZlwxXDMwXDFcdWZmZmZcMVwxN1w3XHVmZmZmXDFcNTdcMVw3NVw2XHVmZmZmXDFcMzJcMVwzM1wxMVx1ZmZmZlwxXHUwMDk4XDJcdWZmZmZcMVwyMlw0XHVmZmZmXDFcNzRcN1x1ZmZmZlwxXDI0XDJcdWZmZmZcMVw1MVwzXHVmZmZmXDFcdTAwOGNcM1x1ZmZmZlwxXDEzMlwyXHVmZmZmXDFcN1wxXHVmZmZmXDFcMzZcM1x1ZmZmZlwxXDU1XDEzXHVmZmZmXDFcNVwxXDZcMVx1ZmZmZlwxXDExXDEzXHVmZmZmXDFcdTAwOTBcM1x1ZmZmZlwxXDQ0XDFcdWZmZmZcMVwyN1wxXDU2XDFcMzRcMVwzNVwxXHVmZmZmXDFcdTAwODFcNFx1ZmZmZlwxXHUwMDhmXDRcdWZmZmZcMVw1M1wzXHVmZmZmXDFcMTZcMVwyM1wxXHUwMDkyXDIyXHVmZmZmXDFcNTRcMVx1ZmZmZlwxXDEyXDZcdWZmZmZcMVx1MDA4ZCI7CiAgICAgc3RhdGljIGZpbmFsIFN0cmluZyBERkEyMV9zcGVjaWFsUyA9Ci0gICAgICAgICJcMVwwXHUwMmIzXHVmZmZmfT4iOworICAgICAgICAiXDFcMFx1MDMwM1x1ZmZmZn0+IjsKICAgICBzdGF0aWMgZmluYWwgU3RyaW5nW10gREZBMjFfdHJhbnNpdGlvblMgPSB7Ci0gICAgICAgICAgICAiXDExXDc0XDJcNzNcMlw3NFwxXDczXDIyXDc0XDFcNzNcMVw1M1wxXDcxXDFcNDBcMVw3MFwxXDQ2XDFcNTJcMVw3MlwxXDM0XDFcMzZcMVwzMVwxXDQzXDFcMzVcMVw0NFwxXDMwXDFcNDVcMVw2NVwxMVw2NlwxXDU1XDFcMzJcMVw0N1wxXDM3XDFcNTBcMVw1NFwxXDMzXDJcNzBcMVwxNlwxXDYyXDFcMjFcN1w3MFwxXDYzXDFcNTdcM1w3MFwxXDY0XDFcNjBcMVw3MFwxXDYxXDJcNzBcMVwxM1wyXDcwXDFcNDFcMVw3NFwxXDQyXDFcNjdcMVw3MFwxXDc0XDFcMjdcMVw3MFwxXDIzXDFcNlwxXDExXDFcMTJcMlw3MFwxXDVcMVw1NlwxXDI0XDFcMTVcMVwxNFwxXDIyXDFcMjVcMVwxXDFcMTdcMVwxMFwxXDIwXDFcMlwxXDcwXDFcN1wxXDI2XDNcNzBcMVwzXDFcNTFcMVw0XHVmZjgyXDc0IiwKLSAgICAgICAgICAgICJcMVw3NVwyXHVmZmZmXDFcMTAxXDFcMTAyXDZcdWZmZmZcMVw3N1wxXHVmZmZmXDFcMTAwXDNcdWZmZmZcMVw3NiIsCi0gICAgICAgICAgICAiXDFcMTEwXDFcMTA0XDVcdWZmZmZcMVwxMDVcMlx1ZmZmZlwxXDEwNlw2XHVmZmZmXDFcMTA3IiwKKyAgICAgICAgICAgICJcMTFcNzVcMlw3NFwyXDc1XDFcNzRcMjJcNzVcMVw3NFwxXDU0XDFcNzJcMVw0MVwxXDcxXDFcNDdcMVw1M1wxXDczXDFcMzVcMVwzN1wxXDMyXDFcNDRcMVwzNlwxXDQ1XDFcMzFcMVw0NlwxXDY2XDExXDY3XDFcNTZcMVwzM1wxXDUwXDFcNDBcMVw1MVwxXDU1XDFcMzRcMlw3MVwxXDE2XDFcNjNcMVwyMVw3XDcxXDFcNjRcMVw2MFwzXDcxXDFcNjVcMVw2MVwxXDcxXDFcNjJcMlw3MVwxXDEzXDJcNzFcMVw0MlwxXDc1XDFcNDNcMVw3MFwxXDcxXDFcNzVcMVwyN1wxXDcxXDFcMjNcMVw2XDFcMTFcMVwxMlwxXDcxXDFcMzBcMVw1XDFcNTdcMVwyNFwxXDE1XDFcMTRcMVwyMlwxXDI1XDFcMVwxXDE3XDFcMTBcMVwyMFwxXDJcMVw3MVwxXDdcMVwyNlwzXDcxXDFcM1wxXDUyXDFcNFx1ZmY4Mlw3NSIsCisgICAgICAgICAgICAiXDFcNzZcMlx1ZmZmZlwxXDEwMlwxXDEwM1w2XHVmZmZmXDFcMTAwXDFcdWZmZmZcMVwxMDFcM1x1ZmZmZlwxXDc3IiwKKyAgICAgICAgICAgICJcMVwxMTFcMVwxMDVcNVx1ZmZmZlwxXDEwNlwyXHVmZmZmXDFcMTA3XDZcdWZmZmZcMVwxMTAiLAogICAgICAgICAgICAgIiIsCiAgICAgICAgICAgICAiIiwKLSAgICAgICAgICAgICJcMVwxMTVcNlx1ZmZmZlwxXDExNFwxXDExMyIsCi0gICAgICAgICAgICAiXDFcMTE2XDExXHVmZmZmXDFcMTE3IiwKLSAgICAgICAgICAgICJcMVwxMjFcM1x1ZmZmZlwxXDEyMCIsCi0gICAgICAgICAgICAiXDFcMTIyIiwKLSAgICAgICAgICAgICJcMVwxMjNcMVx1ZmZmZlwxXDEyNFwxMVx1ZmZmZlwxXDEyNSIsCi0gICAgICAgICAgICAiXDFcMTMxXDdcdWZmZmZcMVwxMjZcNVx1ZmZmZlwxXDEyN1wyXHVmZmZmXDFcMTMwIiwKLSAgICAgICAgICAgICJcMVwxMzIiLAotICAgICAgICAgICAgIlwxXDEzM1wzXHVmZmZmXDFcMTM2XDNcdWZmZmZcMVwxMzRcNlx1ZmZmZlwxXDEzNSIsCi0gICAgICAgICAgICAiXDFcMTM3IiwKLSAgICAgICAgICAgICJcMVwxNDAiLAotICAgICAgICAgICAgIlwxXDE0MSIsCi0gICAgICAgICAgICAiXDFcMTQyXDEwXHVmZmZmXDFcMTQzXDFcMTQ1XDFcdWZmZmZcMVwxNDRcMVx1ZmZmZlwxXDE0NiIsCi0gICAgICAgICAgICAiXDFcMTQ3XDYzXHVmZmZmXDFcMTUwIiwKLSAgICAgICAgICAgICJcMVwxNTNcMTFcdWZmZmZcMVwxNTFcM1x1ZmZmZlwxXDE1MlwxXHVmZmZmXDFcMTU0IiwKLSAgICAgICAgICAgICJcMVwxNTZcMTVcdWZmZmZcMVwxNTdcMlx1ZmZmZlwxXDE1NSIsCi0gICAgICAgICAgICAiXDFcMTYwIiwKLSAgICAgICAgICAgICJcMVwxNjJcMTJcdWZmZmZcMVwxNjEiLAotICAgICAgICAgICAgIlwxXDE2NFwxXDE2MyIsCi0gICAgICAgICAgICAiXDFcMTY1XDZcdWZmZmZcMVwxNjYiLAotICAgICAgICAgICAgIlwxXDE2NyIsCi0gICAgICAgICAgICAiXDFcMTcyXDIyXHVmZmZmXDFcMTcxIiwKKyAgICAgICAgICAgICJcMVwxMTZcNlx1ZmZmZlwxXDExNVwxXDExNFw0XHVmZmZmXDFcMTE3IiwKKyAgICAgICAgICAgICJcMVwxMjBcMTFcdWZmZmZcMVwxMjEiLAorICAgICAgICAgICAgIlwxXDEyM1wzXHVmZmZmXDFcMTIyIiwKKyAgICAgICAgICAgICJcMVwxMjQiLAorICAgICAgICAgICAgIlwxXDEyNVwxXHVmZmZmXDFcMTI2XDExXHVmZmZmXDFcMTI3IiwKKyAgICAgICAgICAgICJcMVwxMzNcN1x1ZmZmZlwxXDEzMFw1XHVmZmZmXDFcMTMxXDJcdWZmZmZcMVwxMzIiLAorICAgICAgICAgICAgIlwxXDEzNCIsCisgICAgICAgICAgICAiXDFcMTM1XDNcdWZmZmZcMVwxNDBcM1x1ZmZmZlwxXDEzNlw2XHVmZmZmXDFcMTM3IiwKKyAgICAgICAgICAgICJcMVwxNDJcMTVcdWZmZmZcMVwxNDEiLAorICAgICAgICAgICAgIlwxXDE0MyIsCisgICAgICAgICAgICAiXDFcMTQ0IiwKKyAgICAgICAgICAgICJcMVwxNDVcMTBcdWZmZmZcMVwxNDZcMVwxNTBcMVx1ZmZmZlwxXDE0N1wxXHVmZmZmXDFcMTUxIiwKKyAgICAgICAgICAgICJcMVwxNTJcNjNcdWZmZmZcMVwxNTMiLAorICAgICAgICAgICAgIlwxXDE1NlwxMVx1ZmZmZlwxXDE1NFwzXHVmZmZmXDFcMTU1XDFcdWZmZmZcMVwxNTciLAorICAgICAgICAgICAgIlwxXDE2MVwxNVx1ZmZmZlwxXDE2MlwyXHVmZmZmXDFcMTYwIiwKKyAgICAgICAgICAgICJcMVwxNjMiLAorICAgICAgICAgICAgIlwxXDE2NVwxMlx1ZmZmZlwxXDE2NFwzXHVmZmZmXDFcMTY2IiwKKyAgICAgICAgICAgICJcMVwxNzBcMVwxNjciLAorICAgICAgICAgICAgIlwxXDE3MVwxXHVmZmZmXDFcMTczXDRcdWZmZmZcMVwxNzIiLAorICAgICAgICAgICAgIlwxXDE3NCIsCisgICAgICAgICAgICAiXDFcMTc1IiwKKyAgICAgICAgICAgICJcMVx1MDA4MFwyMlx1ZmZmZlwxXDE3NyIsCiAgICAgICAgICAgICAiIiwKICAgICAgICAgICAgICIiLAogICAgICAgICAgICAgIiIsCiAgICAgICAgICAgICAiIiwKICAgICAgICAgICAgICIiLAotICAgICAgICAgICAgIlwxXHUwMDgxXDFcdTAwODIiLAorICAgICAgICAgICAgIlwxXHUwMDg3XDFcdTAwODgiLAogICAgICAgICAgICAgIiIsCiAgICAgICAgICAgICAiIiwKICAgICAgICAgICAgICIiLAotICAgICAgICAgICAgIlwxXHUwMDg4XDIxXHVmZmZmXDFcdTAwODciLAotICAgICAgICAgICAgIlwxXHUwMDhjXDE3XHVmZmZmXDFcdTAwOGFcMVx1MDA4YiIsCi0gICAgICAgICAgICAiXDFcdTAwOGZcNFx1ZmZmZlwxXHUwMDkwXDE1XHVmZmZmXDFcdTAwOGUiLAotICAgICAgICAgICAgIlwxXHUwMDkyIiwKLSAgICAgICAgICAgICJcMVx1MDA5NCIsCi0gICAgICAgICAgICAiXDFcdTAwOTYiLAorICAgICAgICAgICAgIlwxXHUwMDhlXDIxXHVmZmZmXDFcdTAwOGQiLAorICAgICAgICAgICAgIlwxXHUwMDkyXDE3XHVmZmZmXDFcdTAwOTBcMVx1MDA5MSIsCisgICAgICAgICAgICAiXDFcdTAwOTVcNFx1ZmZmZlwxXHUwMDk2XDE1XHVmZmZmXDFcdTAwOTQiLAogICAgICAgICAgICAgIlwxXHUwMDk4IiwKLSAgICAgICAgICAgICJcMVx1MDA5YSIsCi0gICAgICAgICAgICAiXDFcdTAwOWMiLAotICAgICAgICAgICAgIlwxXHUwMDlmXDEzXHVmZmZmXDFcdTAwOWUiLAorICAgICAgICAgICAgIlwxXHUwMDliXDFcdTAwOWEiLAorICAgICAgICAgICAgIlwxXHUwMDlkIiwKKyAgICAgICAgICAgICJcMVx1MDA5ZiIsCiAgICAgICAgICAgICAiXDFcdTAwYTEiLAogICAgICAgICAgICAgIlwxXHUwMGEzIiwKLSAgICAgICAgICAgICJcMVx1MDBhNVwxNVx1ZmZmZlwxXHUwMGE0IiwKLSAgICAgICAgICAgICJcMVx1MDBhNiIsCi0gICAgICAgICAgICAiXDFcdTAwYTciLAorICAgICAgICAgICAgIlwxXHUwMGE2XDEzXHVmZmZmXDFcdTAwYTUiLAogICAgICAgICAgICAgIlwxXHUwMGE4IiwKLSAgICAgICAgICAgICJcMVx1MDBhOSIsCiAgICAgICAgICAgICAiXDFcdTAwYWEiLAotICAgICAgICAgICAgIlwxMlx1MDBhY1wxMFx1ZmZmZlwxXHUwMGFlXDFcdWZmZmZcM1x1MDBhZVw1XHVmZmZmXDFcdTAwYWVcMTNcdWZmZmZcMVx1MDBhYlw2XHVmZmZmXDFcdTAwYWNcMlx1ZmZmZlwxXHUwMGFlXDFcdWZmZmZcM1x1MDBhZVw1XHVmZmZmXDFcdTAwYWVcMTNcdWZmZmZcMVx1MDBhYiIsCi0gICAgICAgICAgICAiXDEyXHUwMGFjXDEwXHVmZmZmXDFcdTAwYWVcMVx1ZmZmZlwzXHUwMGFlXDVcdWZmZmZcMVx1MDBhZVwyMlx1ZmZmZlwxXHUwMGFjXDJcdWZmZmZcMVx1MDBhZVwxXHVmZmZmXDNcdTAwYWVcNVx1ZmZmZlwxXHUwMGFlIiwKLSAgICAgICAgICAgICJcMVwxMDNcMzRcdWZmZmZcMzJcMTAzXDRcdWZmZmZcMVwxMDNcMVx1ZmZmZlwzMlwxMDMiLAorICAgICAgICAgICAgIlwxXHUwMGFjXDE1XHVmZmZmXDFcdTAwYWIiLAorICAgICAgICAgICAgIlwxXHUwMGFkIiwKKyAgICAgICAgICAgICJcMVx1MDBhZSIsCisgICAgICAgICAgICAiXDFcdTAwYWYiLAorICAgICAgICAgICAgIlwxXHUwMGIwIiwKKyAgICAgICAgICAgICJcMVx1MDBiMSIsCisgICAgICAgICAgICAiXDEyXHUwMGIzXDEwXHVmZmZmXDFcdTAwYjVcMVx1ZmZmZlwzXHUwMGI1XDVcdWZmZmZcMVx1MDBiNVwxM1x1ZmZmZlwxXHUwMGIyXDZcdWZmZmZcMVx1MDBiM1wyXHVmZmZmXDFcdTAwYjVcMVx1ZmZmZlwzXHUwMGI1XDVcdWZmZmZcMVx1MDBiNVwxM1x1ZmZmZlwxXHUwMGIyIiwKKyAgICAgICAgICAgICJcMTJcdTAwYjNcMTBcdWZmZmZcMVx1MDBiNVwxXHVmZmZmXDNcdTAwYjVcNVx1ZmZmZlwxXHUwMGI1XDIyXHVmZmZmXDFcdTAwYjNcMlx1ZmZmZlwxXHUwMGI1XDFcdWZmZmZcM1x1MDBiNVw1XHVmZmZmXDFcdTAwYjUiLAorICAgICAgICAgICAgIlwxXDEwNFwzNFx1ZmZmZlwzMlwxMDRcNFx1ZmZmZlwxXDEwNFwxXHVmZmZmXDMyXDEwNCIsCiAgICAgICAgICAgICAiIiwKICAgICAgICAgICAgICIiLAogICAgICAgICAgICAgIiIsCiAgICAgICAgICAgICAiIiwKICAgICAgICAgICAgICIiLAotICAgICAgICAgICAgIlwxXHUwMGIxXDIwXHVmZmZmXDFcdTAwYjIiLAotICAgICAgICAgICAgIlwxXHUwMGIzIiwKLSAgICAgICAgICAgICJcMVx1MDBiNCIsCi0gICAgICAgICAgICAiXDFcdTAwYjUiLAotICAgICAgICAgICAgIlwxXHUwMGI2IiwKLSAgICAgICAgICAgICJcMVx1MDBiNyIsCi0gICAgICAgICAgICAiIiwKLSAgICAgICAgICAgICJcMVx1MDBiOCIsCi0gICAgICAgICAgICAiXDFcMTAzXDEzXHVmZmZmXDEyXDEwM1w3XHVmZmZmXDMyXDEwM1w0XHVmZmZmXDFcMTAzXDFcdWZmZmZcMzJcMTAzIiwKLSAgICAgICAgICAgICJcMVx1MDBiYVwzXHVmZmZmXDFcdTAwYmIiLAorICAgICAgICAgICAgIlwxXHUwMGI4XDIwXHVmZmZmXDFcdTAwYjkiLAorICAgICAgICAgICAgIlwxXHUwMGJhIiwKKyAgICAgICAgICAgICJcMVx1MDBiYiIsCiAgICAgICAgICAgICAiXDFcdTAwYmMiLAogICAgICAgICAgICAgIlwxXHUwMGJkIiwKKyAgICAgICAgICAgICJcMVx1MDBiZSIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICJcMVx1MDBiZiIsCisgICAgICAgICAgICAiXDFcMTA0XDEzXHVmZmZmXDEyXDEwNFw3XHVmZmZmXDMyXDEwNFw0XHVmZmZmXDFcMTA0XDFcdWZmZmZcMzJcMTA0IiwKKyAgICAgICAgICAgICJcMVx1MDBjMVwzXHVmZmZmXDFcdTAwYzIiLAorICAgICAgICAgICAgIlwxXHUwMGMzIiwKKyAgICAgICAgICAgICJcMVx1MDBjNCIsCiAgICAgICAgICAgICAiIiwKICAgICAgICAgICAgICIiLAotICAgICAgICAgICAgIlwxXHUwMGJmXDE2XHVmZmZmXDFcdTAwYzBcMVx1MDBiZSIsCi0gICAgICAgICAgICAiXDFcdTAwYzEiLAotICAgICAgICAgICAgIlwxXDEwM1wxM1x1ZmZmZlwxMlwxMDNcN1x1ZmZmZlwzMlwxMDNcNFx1ZmZmZlwxXDEwM1wxXHVmZmZmXDMyXDEwMyIsCi0gICAgICAgICAgICAiXDFcdTAwYzVcNVx1ZmZmZlwxXHUwMGM0XDZcdWZmZmZcMVx1MDBjMyIsCi0gICAgICAgICAgICAiXDFcMTAzXDEzXHVmZmZmXDEyXDEwM1w3XHVmZmZmXDMyXDEwM1w0XHVmZmZmXDFcMTAzXDFcdWZmZmZcMzJcMTAzIiwKLSAgICAgICAgICAgICJcMVx1MDBjNyIsCi0gICAgICAgICAgICAiXDFcdTAwYzhcNVx1ZmZmZlwxXHUwMGM5IiwKLSAgICAgICAgICAgICJcMVx1MDBjY1wyXHVmZmZmXDFcdTAwY2FcM1x1ZmZmZlwxXHUwMGNiIiwKLSAgICAgICAgICAgICJcMVx1MDBjZFwxNVx1ZmZmZlwxXHUwMGNlIiwKLSAgICAgICAgICAgICJcMVx1MDBjZlwyMFx1ZmZmZlwxXHUwMGQwIiwKLSAgICAgICAgICAgICJcMVx1MDBkMVwzXHVmZmZmXDFcdTAwZDIiLAotICAgICAgICAgICAgIlwxXHUwMGQzXDFcdWZmZmZcMVx1MDBkNCIsCi0gICAgICAgICAgICAiXDFcdTAwZDUiLAotICAgICAgICAgICAgIlwxXHUwMGQ2IiwKLSAgICAgICAgICAgICJcMVx1MDBkNyIsCi0gICAgICAgICAgICAiXDFcdTAwZDgiLAotICAgICAgICAgICAgIlwxXHUwMGQ5XDFcdWZmZmZcMVx1MDBkYSIsCi0gICAgICAgICAgICAiXDFcdTAwZGIiLAotICAgICAgICAgICAgIlwxXHUwMGRjIiwKLSAgICAgICAgICAgICJcMVx1MDBkZCIsCi0gICAgICAgICAgICAiXDFcdTAwZGVcMTNcdWZmZmZcMVx1MDBkZiIsCisgICAgICAgICAgICAiXDFcdTAwYzZcMTZcdWZmZmZcMVx1MDBjN1wxXHUwMGM1IiwKKyAgICAgICAgICAgICJcMVx1MDBjOCIsCisgICAgICAgICAgICAiXDFcMTA0XDEzXHVmZmZmXDEyXDEwNFw3XHVmZmZmXDMyXDEwNFw0XHVmZmZmXDFcMTA0XDFcdWZmZmZcMzJcMTA0IiwKKyAgICAgICAgICAgICJcMVx1MDBjYSIsCisgICAgICAgICAgICAiXDFcdTAwY2RcNVx1ZmZmZlwxXHUwMGNjXDZcdWZmZmZcMVx1MDBjYiIsCisgICAgICAgICAgICAiXDFcMTA0XDEzXHVmZmZmXDEyXDEwNFw3XHVmZmZmXDMyXDEwNFw0XHVmZmZmXDFcMTA0XDFcdWZmZmZcMzJcMTA0IiwKKyAgICAgICAgICAgICJcMVx1MDBjZiIsCisgICAgICAgICAgICAiXDFcdTAwZDBcNVx1ZmZmZlwxXHUwMGQxIiwKKyAgICAgICAgICAgICJcMVx1MDBkM1w2XHVmZmZmXDFcdTAwZDVcMlx1ZmZmZlwxXHUwMGQyXDNcdWZmZmZcMVx1MDBkNCIsCisgICAgICAgICAgICAiXDFcdTAwZDZcMTVcdWZmZmZcMVx1MDBkNyIsCisgICAgICAgICAgICAiXDFcdTAwZDhcMjBcdWZmZmZcMVx1MDBkOSIsCisgICAgICAgICAgICAiXDFcdTAwZGFcM1x1ZmZmZlwxXHUwMGRiIiwKKyAgICAgICAgICAgICJcMVx1MDBkY1wxXHVmZmZmXDFcdTAwZGQiLAorICAgICAgICAgICAgIlwxXHUwMGRlIiwKKyAgICAgICAgICAgICJcMVx1MDBkZiIsCiAgICAgICAgICAgICAiXDFcdTAwZTAiLAogICAgICAgICAgICAgIlwxXHUwMGUxIiwKLSAgICAgICAgICAgICJcMVx1MDBlMiIsCi0gICAgICAgICAgICAiXDFcdTAwZTMiLAorICAgICAgICAgICAgIlwxXHUwMGUyXDFcdWZmZmZcMVx1MDBlMyIsCiAgICAgICAgICAgICAiXDFcdTAwZTQiLAogICAgICAgICAgICAgIlwxXHUwMGU1IiwKICAgICAgICAgICAgICJcMVx1MDBlNiIsCi0gICAgICAgICAgICAiXDFcdTAwZTciLAotICAgICAgICAgICAgIlwxXHUwMGU4IiwKKyAgICAgICAgICAgICJcMVx1MDBlN1wxM1x1ZmZmZlwxXHUwMGU4IiwKICAgICAgICAgICAgICJcMVx1MDBlOSIsCi0gICAgICAgICAgICAiXDFcMTAzXDEzXHVmZmZmXDEyXDEwM1w3XHVmZmZmXDMyXDEwM1w0XHVmZmZmXDFcMTAzXDFcdWZmZmZcMzJcMTAzIiwKKyAgICAgICAgICAgICJcMVx1MDBlYSIsCiAgICAgICAgICAgICAiXDFcdTAwZWIiLAogICAgICAgICAgICAgIlwxXHUwMGVjIiwKICAgICAgICAgICAgICJcMVx1MDBlZCIsCi0gICAgICAgICAgICAiXDFcdTAwZWVcMTdcdWZmZmZcMVx1MDBlZlwxXHUwMGYwIiwKLSAgICAgICAgICAgICJcMVx1MDBmMVwxM1x1ZmZmZlwxXHUwMGYyIiwKKyAgICAgICAgICAgICJcMVx1MDBlZSIsCisgICAgICAgICAgICAiXDFcdTAwZWYiLAorICAgICAgICAgICAgIlwxXHUwMGYwIiwKKyAgICAgICAgICAgICJcMVx1MDBmMSIsCisgICAgICAgICAgICAiXDFcdTAwZjIiLAogICAgICAgICAgICAgIlwxXHUwMGYzIiwKLSAgICAgICAgICAgICJcMVwxMDNcMTNcdWZmZmZcMTJcMTAzXDdcdWZmZmZcMzJcMTAzXDRcdWZmZmZcMVwxMDNcMVx1ZmZmZlwzMlwxMDMiLAorICAgICAgICAgICAgIlwxXDEwNFwxM1x1ZmZmZlwxMlwxMDRcN1x1ZmZmZlwzMlwxMDRcNFx1ZmZmZlwxXDEwNFwxXHVmZmZmXDMyXDEwNCIsCiAgICAgICAgICAgICAiXDFcdTAwZjUiLAogICAgICAgICAgICAgIlwxXHUwMGY2IiwKICAgICAgICAgICAgICJcMVx1MDBmNyIsCi0gICAgICAgICAgICAiXDFcdTAwZjgiLAotICAgICAgICAgICAgIlwxXDEwM1wxM1x1ZmZmZlwxMlwxMDNcN1x1ZmZmZlwzMlwxMDNcNFx1ZmZmZlwxXDEwM1wxXHVmZmZmXDIyXDEwM1wxXHUwMGY5XDdcMTAzIiwKLSAgICAgICAgICAgICJcMVx1MDBmYiIsCi0gICAgICAgICAgICAiIiwKLSAgICAgICAgICAgICIiLAotICAgICAgICAgICAgIiIsCi0gICAgICAgICAgICAiIiwKLSAgICAgICAgICAgICIiLAotICAgICAgICAgICAgIiIsCi0gICAgICAgICAgICAiIiwKLSAgICAgICAgICAgICIiLAotICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiXDFcdTAwZjhcMTdcdWZmZmZcMVx1MDBmOVwxXHUwMGZhIiwKKyAgICAgICAgICAgICJcMVx1MDBmYlwxM1x1ZmZmZlwxXHUwMGZjIiwKICAgICAgICAgICAgICJcMVx1MDBmZCIsCi0gICAgICAgICAgICAiIiwKLSAgICAgICAgICAgICIiLAotICAgICAgICAgICAgIiIsCi0gICAgICAgICAgICAiIiwKLSAgICAgICAgICAgICIiLAotICAgICAgICAgICAgIiIsCi0gICAgICAgICAgICAiIiwKLSAgICAgICAgICAgICIiLAotICAgICAgICAgICAgIiIsCi0gICAgICAgICAgICAiIiwKLSAgICAgICAgICAgICIiLAotICAgICAgICAgICAgIiIsCi0gICAgICAgICAgICAiIiwKLSAgICAgICAgICAgICIiLAotICAgICAgICAgICAgIiIsCi0gICAgICAgICAgICAiIiwKLSAgICAgICAgICAgICIiLAotICAgICAgICAgICAgIiIsCi0gICAgICAgICAgICAiIiwKLSAgICAgICAgICAgICIiLAotICAgICAgICAgICAgIiIsCi0gICAgICAgICAgICAiIiwKLSAgICAgICAgICAgICIiLAotICAgICAgICAgICAgIiIsCi0gICAgICAgICAgICAiIiwKLSAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIlwxXDEwNFwxM1x1ZmZmZlwxMlwxMDRcN1x1ZmZmZlwzMlwxMDRcNFx1ZmZmZlwxXDEwNFwxXHVmZmZmXDMyXDEwNCIsCiAgICAgICAgICAgICAiXDFcdTAwZmYiLAotICAgICAgICAgICAgIiIsCi0gICAgICAgICAgICAiIiwKLSAgICAgICAgICAgICIiLAotICAgICAgICAgICAgIiIsCi0gICAgICAgICAgICAiIiwKLSAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIlwxXDEwNFwxM1x1ZmZmZlwxMlwxMDRcN1x1ZmZmZlwzMlwxMDRcNFx1ZmZmZlwxXDEwNFwxXHVmZmZmXDMyXDEwNCIsCiAgICAgICAgICAgICAiXDFcdTAxMDEiLAotICAgICAgICAgICAgIlwxXHUwMTAyIiwKLSAgICAgICAgICAgICJcMVx1MDEwMyIsCisgICAgICAgICAgICAiXDFcdTAxMDJcM1x1ZmZmZlwxXHUwMTAzIiwKICAgICAgICAgICAgICJcMVx1MDEwNCIsCi0gICAgICAgICAgICAiXDFcdTAxMDUiLAotICAgICAgICAgICAgIlwxXHUwMTA2IiwKKyAgICAgICAgICAgICJcMVwxMDRcMTNcdWZmZmZcMTJcMTA0XDdcdWZmZmZcMzJcMTA0XDRcdWZmZmZcMVwxMDRcMVx1ZmZmZlwyMlwxMDRcMVx1MDEwNVw3XDEwNCIsCiAgICAgICAgICAgICAiXDFcdTAxMDciLAogICAgICAgICAgICAgIlwxXHUwMTA4IiwKLSAgICAgICAgICAgICIiLAotICAgICAgICAgICAgIlwxMlx1MDBhY1wxMFx1ZmZmZlwxXHUwMGFlXDFcdWZmZmZcM1x1MDBhZVw1XHVmZmZmXDFcdTAwYWVcMjJcdWZmZmZcMVx1MDBhY1wyXHVmZmZmXDFcdTAwYWVcMVx1ZmZmZlwzXHUwMGFlXDVcdWZmZmZcMVx1MDBhZSIsCi0gICAgICAgICAgICAiIiwKLSAgICAgICAgICAgICIiLAotICAgICAgICAgICAgIiIsCi0gICAgICAgICAgICAiIiwKICAgICAgICAgICAgICJcMVx1MDEwOSIsCi0gICAgICAgICAgICAiXDFcdTAxMGEiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAogICAgICAgICAgICAgIlwxXHUwMTBiIiwKLSAgICAgICAgICAgICJcMVx1MDEwYyIsCi0gICAgICAgICAgICAiXDFcMTAzXDEzXHVmZmZmXDEyXDEwM1w3XHVmZmZmXDMyXDEwM1w0XHVmZmZmXDFcMTAzXDFcdWZmZmZcMzJcMTAzIiwKLSAgICAgICAgICAgICJcMVwxMDNcMTNcdWZmZmZcMTJcMTAzXDdcdWZmZmZcMzJcMTAzXDRcdWZmZmZcMVwxMDNcMVx1ZmZmZlwzMlwxMDMiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIlwxXHUwMTBkIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiIiwKICAgICAgICAgICAgICJcMVx1MDEwZiIsCiAgICAgICAgICAgICAiXDFcdTAxMTAiLAotICAgICAgICAgICAgIiIsCiAgICAgICAgICAgICAiXDFcdTAxMTEiLAotICAgICAgICAgICAgIlwxXDEwM1wxM1x1ZmZmZlwxMlwxMDNcN1x1ZmZmZlwzMlwxMDNcNFx1ZmZmZlwxXDEwM1wxXHVmZmZmXDMyXDEwMyIsCisgICAgICAgICAgICAiXDFcdTAxMTIiLAogICAgICAgICAgICAgIlwxXHUwMTEzIiwKICAgICAgICAgICAgICJcMVx1MDExNCIsCiAgICAgICAgICAgICAiXDFcdTAxMTUiLAogICAgICAgICAgICAgIlwxXHUwMTE2IiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIlwxMlx1MDBiM1wxMFx1ZmZmZlwxXHUwMGI1XDFcdWZmZmZcM1x1MDBiNVw1XHVmZmZmXDFcdTAwYjVcMjJcdWZmZmZcMVx1MDBiM1wyXHVmZmZmXDFcdTAwYjVcMVx1ZmZmZlwzXHUwMGI1XDVcdWZmZmZcMVx1MDBiNSIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiIiwKICAgICAgICAgICAgICJcMVx1MDExNyIsCiAgICAgICAgICAgICAiXDFcdTAxMTgiLAotICAgICAgICAgICAgIiIsCiAgICAgICAgICAgICAiXDFcdTAxMTkiLAogICAgICAgICAgICAgIlwxXHUwMTFhIiwKLSAgICAgICAgICAgICJcMVx1MDExYiIsCisgICAgICAgICAgICAiXDFcMTA0XDEzXHVmZmZmXDEyXDEwNFw3XHVmZmZmXDMyXDEwNFw0XHVmZmZmXDFcMTA0XDFcdWZmZmZcMzJcMTA0IiwKKyAgICAgICAgICAgICJcMVwxMDRcMTNcdWZmZmZcMTJcMTA0XDdcdWZmZmZcMzJcMTA0XDRcdWZmZmZcMVwxMDRcMVx1ZmZmZlwzMlwxMDQiLAorICAgICAgICAgICAgIlwxXHUwMTFkIiwKKyAgICAgICAgICAgICJcMVx1MDExZSIsCiAgICAgICAgICAgICAiIiwKLSAgICAgICAgICAgICJcMVx1MDExYyIsCi0gICAgICAgICAgICAiXDFcMTAzXDEzXHVmZmZmXDEyXDEwM1w3XHVmZmZmXDMyXDEwM1w0XHVmZmZmXDFcMTAzXDFcdWZmZmZcMTBcMTAzXDFcdTAxMWRcMjFcMTAzIiwKLSAgICAgICAgICAgICJcMVwxMDNcMTNcdWZmZmZcMTJcMTAzXDdcdWZmZmZcMzJcMTAzXDRcdWZmZmZcMVwxMDNcMVx1ZmZmZlwzMlwxMDMiLAotICAgICAgICAgICAgIlwxXHUwMTIwIiwKKyAgICAgICAgICAgICJcMVx1MDExZiIsCisgICAgICAgICAgICAiXDFcMTA0XDEzXHVmZmZmXDEyXDEwNFw3XHVmZmZmXDMyXDEwNFw0XHVmZmZmXDFcMTA0XDFcdWZmZmZcMzJcMTA0IiwKICAgICAgICAgICAgICJcMVx1MDEyMSIsCiAgICAgICAgICAgICAiXDFcdTAxMjIiLAogICAgICAgICAgICAgIlwxXHUwMTIzIiwKICAgICAgICAgICAgICJcMVx1MDEyNCIsCiAgICAgICAgICAgICAiXDFcdTAxMjUiLAogICAgICAgICAgICAgIlwxXHUwMTI2IiwKLSAgICAgICAgICAgICJcMVx1MDEyNyIsCi0gICAgICAgICAgICAiXDFcdTAxMjgiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiXDFcdTAxMjhcNVx1ZmZmZlwxXHUwMTI3IiwKICAgICAgICAgICAgICJcMVx1MDEyOSIsCi0gICAgICAgICAgICAiXDFcdTAxMmEiLAotICAgICAgICAgICAgIlwxXDEwM1wxM1x1ZmZmZlwxMlwxMDNcN1x1ZmZmZlwzMlwxMDNcNFx1ZmZmZlwxXDEwM1wxXHVmZmZmXDE0XDEwM1wxXHUwMTJiXDE1XDEwMyIsCisgICAgICAgICAgICAiXDFcdTAxMmFcM1x1ZmZmZlwxXHUwMTJiIiwKKyAgICAgICAgICAgICJcMVx1MDEyYyIsCisgICAgICAgICAgICAiIiwKICAgICAgICAgICAgICJcMVx1MDEyZCIsCi0gICAgICAgICAgICAiXDFcdTAxMmUiLAotICAgICAgICAgICAgIlwxXDEwM1wxM1x1ZmZmZlwxMlwxMDNcN1x1ZmZmZlwzMlwxMDNcNFx1ZmZmZlwxXDEwM1wxXHVmZmZmXDMyXDEwMyIsCi0gICAgICAgICAgICAiXDFcMTAzXDEzXHVmZmZmXDEyXDEwM1w3XHVmZmZmXDFcMTAzXDFcdTAxMzBcMjFcMTAzXDFcdTAxMzJcNlwxMDNcNFx1ZmZmZlwxXDEwM1wxXHVmZmZmXDE3XDEwM1wxXHUwMTMxXDEyXDEwMyIsCisgICAgICAgICAgICAiXDFcMTA0XDEzXHVmZmZmXDEyXDEwNFw3XHVmZmZmXDMyXDEwNFw0XHVmZmZmXDFcMTA0XDFcdWZmZmZcMTBcMTA0XDFcdTAxMmVcMjFcMTA0IiwKKyAgICAgICAgICAgICJcMVwxMDRcMTNcdWZmZmZcMTJcMTA0XDdcdWZmZmZcMzJcMTA0XDRcdWZmZmZcMVwxMDRcMVx1ZmZmZlwzMlwxMDQiLAorICAgICAgICAgICAgIlwxXHUwMTMxIiwKKyAgICAgICAgICAgICJcMVwxMDRcMTNcdWZmZmZcMTJcMTA0XDdcdWZmZmZcMzJcMTA0XDRcdWZmZmZcMVwxMDRcMVx1ZmZmZlwzMlwxMDQiLAorICAgICAgICAgICAgIlwxXHUwMTMzIiwKICAgICAgICAgICAgICJcMVx1MDEzNCIsCiAgICAgICAgICAgICAiXDFcdTAxMzUiLAogICAgICAgICAgICAgIlwxXHUwMTM2IiwKICAgICAgICAgICAgICJcMVx1MDEzNyIsCiAgICAgICAgICAgICAiXDFcdTAxMzgiLAotICAgICAgICAgICAgIlwxXHUwMTM5IiwKLSAgICAgICAgICAgICJcMVwxMDNcMTNcdWZmZmZcMTJcMTAzXDdcdWZmZmZcMzJcMTAzXDRcdWZmZmZcMVwxMDNcMVx1ZmZmZlwzMlwxMDMiLAorICAgICAgICAgICAgIlwxXHUwMTNhXDJcdWZmZmZcMVx1MDEzOSIsCiAgICAgICAgICAgICAiXDFcdTAxM2IiLAogICAgICAgICAgICAgIlwxXHUwMTNjIiwKICAgICAgICAgICAgICJcMVx1MDEzZCIsCi0gICAgICAgICAgICAiXDFcdTAxM2UiLAotICAgICAgICAgICAgIlwxXHUwMTNmIiwKKyAgICAgICAgICAgICJcMVwxMDRcMTNcdWZmZmZcMTJcMTA0XDdcdWZmZmZcMzJcMTA0XDRcdWZmZmZcMVwxMDRcMVx1ZmZmZlwxNFwxMDRcMVx1MDEzZVwxNVwxMDQiLAogICAgICAgICAgICAgIlwxXHUwMTQwIiwKLSAgICAgICAgICAgICJcMVwxMDNcMTNcdWZmZmZcMTJcMTAzXDdcdWZmZmZcMzJcMTAzXDRcdWZmZmZcMVwxMDNcMVx1ZmZmZlwzMlwxMDMiLAotICAgICAgICAgICAgIlwxXHUwMTQyIiwKLSAgICAgICAgICAgICJcMVx1MDE0MyIsCi0gICAgICAgICAgICAiIiwKLSAgICAgICAgICAgICJcMVwxMDNcMTNcdWZmZmZcMTJcMTAzXDdcdWZmZmZcMzJcMTAzXDRcdWZmZmZcMVwxMDNcMVx1ZmZmZlwzMlwxMDMiLAotICAgICAgICAgICAgIlwxXHUwMTQ1IiwKLSAgICAgICAgICAgICJcMVx1MDE0NiIsCisgICAgICAgICAgICAiXDFcdTAxNDEiLAorICAgICAgICAgICAgIlwxXDEwNFwxM1x1ZmZmZlwxMlwxMDRcN1x1ZmZmZlwzMlwxMDRcNFx1ZmZmZlwxXDEwNFwxXHVmZmZmXDMyXDEwNCIsCisgICAgICAgICAgICAiXDFcMTA0XDEzXHVmZmZmXDEyXDEwNFw3XHVmZmZmXDFcMTA0XDFcdTAxNDNcMjFcMTA0XDFcdTAxNDVcNlwxMDRcNFx1ZmZmZlwxXDEwNFwxXHVmZmZmXDE3XDEwNFwxXHUwMTQ0XDEyXDEwNCIsCiAgICAgICAgICAgICAiXDFcdTAxNDciLAogICAgICAgICAgICAgIlwxXHUwMTQ4IiwKICAgICAgICAgICAgICJcMVx1MDE0OSIsCiAgICAgICAgICAgICAiXDFcdTAxNGEiLAogICAgICAgICAgICAgIlwxXHUwMTRiIiwKLSAgICAgICAgICAgICJcMVwxMDNcMTNcdWZmZmZcMTJcMTAzXDdcdWZmZmZcMzJcMTAzXDRcdWZmZmZcMVwxMDNcMVx1ZmZmZlwyMlwxMDNcMVx1MDE0Y1w3XDEwMyIsCi0gICAgICAgICAgICAiIiwKLSAgICAgICAgICAgICJcMVx1MDE0ZSIsCisgICAgICAgICAgICAiXDFcdTAxNGMiLAorICAgICAgICAgICAgIlwxXHUwMTRkIiwKKyAgICAgICAgICAgICJcMVwxMDRcMTNcdWZmZmZcMTJcMTA0XDdcdWZmZmZcMzJcMTA0XDRcdWZmZmZcMVwxMDRcMVx1ZmZmZlwzMlwxMDQiLAogICAgICAgICAgICAgIlwxXHUwMTRmIiwKICAgICAgICAgICAgICJcMVx1MDE1MCIsCiAgICAgICAgICAgICAiXDFcdTAxNTEiLAogICAgICAgICAgICAgIlwxXHUwMTUyIiwKLSAgICAgICAgICAgICIiLAotICAgICAgICAgICAgIiIsCi0gICAgICAgICAgICAiIiwKLSAgICAgICAgICAgICIiLAotICAgICAgICAgICAgIiIsCi0gICAgICAgICAgICAiIiwKLSAgICAgICAgICAgICIiLAotICAgICAgICAgICAgIlwxXDEwM1wxM1x1ZmZmZlwxMlwxMDNcN1x1ZmZmZlwzMlwxMDNcNFx1ZmZmZlwxXDEwM1wxXHVmZmZmXDMyXDEwMyIsCisgICAgICAgICAgICAiXDFcdTAxNTMiLAogICAgICAgICAgICAgIlwxXHUwMTU0IiwKLSAgICAgICAgICAgICJcMVx1MDE1NSIsCisgICAgICAgICAgICAiXDFcMTA0XDEzXHVmZmZmXDEyXDEwNFw3XHVmZmZmXDMyXDEwNFw0XHVmZmZmXDFcMTA0XDFcdWZmZmZcMzJcMTA0IiwKICAgICAgICAgICAgICJcMVx1MDE1NiIsCiAgICAgICAgICAgICAiXDFcdTAxNTciLAotICAgICAgICAgICAgIlwxXHUwMTU4IiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIlwxXDEwNFwxM1x1ZmZmZlwxMlwxMDRcN1x1ZmZmZlwzMlwxMDRcNFx1ZmZmZlwxXDEwNFwxXHVmZmZmXDMyXDEwNCIsCiAgICAgICAgICAgICAiXDFcdTAxNTkiLAogICAgICAgICAgICAgIlwxXHUwMTVhIiwKICAgICAgICAgICAgICJcMVx1MDE1YiIsCi0gICAgICAgICAgICAiXDFcMTAzXDEzXHVmZmZmXDEyXDEwM1w3XHVmZmZmXDMyXDEwM1w0XHVmZmZmXDFcMTAzXDFcdWZmZmZcMzJcMTAzIiwKKyAgICAgICAgICAgICJcMVx1MDE1YyIsCiAgICAgICAgICAgICAiXDFcdTAxNWQiLAogICAgICAgICAgICAgIlwxXHUwMTVlIiwKLSAgICAgICAgICAgICIiLAotICAgICAgICAgICAgIiIsCiAgICAgICAgICAgICAiXDFcdTAxNWYiLAotICAgICAgICAgICAgIlwxXHUwMTYwIiwKLSAgICAgICAgICAgICJcMVwxMDNcMTNcdWZmZmZcMTJcMTAzXDdcdWZmZmZcMzJcMTAzXDRcdWZmZmZcMVwxMDNcMVx1ZmZmZlwzMlwxMDMiLAorICAgICAgICAgICAgIlwxXDEwNFwxM1x1ZmZmZlwxMlwxMDRcN1x1ZmZmZlwzMlwxMDRcNFx1ZmZmZlwxXDEwNFwxXHVmZmZmXDIyXDEwNFwxXHUwMTYwXDdcMTA0IiwKICAgICAgICAgICAgICIiLAogICAgICAgICAgICAgIlwxXHUwMTYyIiwKKyAgICAgICAgICAgICIiLAogICAgICAgICAgICAgIlwxXHUwMTYzIiwKICAgICAgICAgICAgICJcMVx1MDE2NCIsCiAgICAgICAgICAgICAiXDFcdTAxNjUiLAogICAgICAgICAgICAgIlwxXHUwMTY2IiwKICAgICAgICAgICAgICJcMVx1MDE2NyIsCi0gICAgICAgICAgICAiXDFcdTAxNjgiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiXDFcMTA0XDEzXHVmZmZmXDEyXDEwNFw3XHVmZmZmXDMyXDEwNFw0XHVmZmZmXDFcMTA0XDFcdWZmZmZcMzJcMTA0IiwKICAgICAgICAgICAgICJcMVx1MDE2OSIsCi0gICAgICAgICAgICAiXDFcdTAxNmEiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIlwxXDEwNFwxM1x1ZmZmZlwxMlwxMDRcN1x1ZmZmZlwzMlwxMDRcNFx1ZmZmZlwxXDEwNFwxXHVmZmZmXDMyXDEwNCIsCiAgICAgICAgICAgICAiXDFcdTAxNmIiLAogICAgICAgICAgICAgIlwxXHUwMTZjIiwKLSAgICAgICAgICAgICIiLAotICAgICAgICAgICAgIiIsCiAgICAgICAgICAgICAiXDFcdTAxNmQiLAogICAgICAgICAgICAgIlwxXHUwMTZlIiwKICAgICAgICAgICAgICJcMVx1MDE2ZiIsCiAgICAgICAgICAgICAiXDFcdTAxNzAiLAotICAgICAgICAgICAgIlwxXDEwM1wxM1x1ZmZmZlwxMlwxMDNcN1x1ZmZmZlwzMlwxMDNcNFx1ZmZmZlwxXDEwM1wxXHVmZmZmXDMyXDEwMyIsCisgICAgICAgICAgICAiXDFcdTAxNzEiLAogICAgICAgICAgICAgIlwxXHUwMTcyIiwKLSAgICAgICAgICAgICJcMVx1MDE3MyIsCisgICAgICAgICAgICAiXDFcMTA0XDEzXHVmZmZmXDEyXDEwNFw3XHVmZmZmXDMyXDEwNFw0XHVmZmZmXDFcMTA0XDFcdWZmZmZcMzJcMTA0IiwKICAgICAgICAgICAgICJcMVx1MDE3NCIsCiAgICAgICAgICAgICAiXDFcdTAxNzUiLAotICAgICAgICAgICAgIlwxXDEwM1wxM1x1ZmZmZlwxMlwxMDNcN1x1ZmZmZlwzMlwxMDNcNFx1ZmZmZlwxXDEwM1wxXHVmZmZmXDMyXDEwMyIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIlwxXHUwMTc2IiwKICAgICAgICAgICAgICJcMVx1MDE3NyIsCi0gICAgICAgICAgICAiXDFcdTAxNzgiLAorICAgICAgICAgICAgIlwxXDEwNFwxM1x1ZmZmZlwxMlwxMDRcN1x1ZmZmZlwzMlwxMDRcNFx1ZmZmZlwxXDEwNFwxXHVmZmZmXDMyXDEwNCIsCiAgICAgICAgICAgICAiIiwKLSAgICAgICAgICAgICJcMVwxMDNcMTNcdWZmZmZcMTJcMTAzXDdcdWZmZmZcMzJcMTAzXDRcdWZmZmZcMVwxMDNcMVx1ZmZmZlwzMlwxMDMiLAorICAgICAgICAgICAgIlwxXHUwMTc5IiwKICAgICAgICAgICAgICJcMVx1MDE3YSIsCi0gICAgICAgICAgICAiIiwKLSAgICAgICAgICAgICJcMVx1MDE3Y1wxNFx1ZmZmZlwxXHUwMTdiIiwKKyAgICAgICAgICAgICJcMVx1MDE3YiIsCisgICAgICAgICAgICAiXDFcdTAxN2MiLAogICAgICAgICAgICAgIlwxXHUwMTdkIiwKICAgICAgICAgICAgICJcMVx1MDE3ZSIsCi0gICAgICAgICAgICAiIiwKICAgICAgICAgICAgICJcMVx1MDE3ZiIsCiAgICAgICAgICAgICAiXDFcdTAxODAiLAotICAgICAgICAgICAgIlwxXDEwM1wxM1x1ZmZmZlwxMlwxMDNcN1x1ZmZmZlwzMlwxMDNcNFx1ZmZmZlwxXDEwM1wxXHVmZmZmXDMyXDEwMyIsCisgICAgICAgICAgICAiXDFcdTAxODEiLAogICAgICAgICAgICAgIlwxXHUwMTgyIiwKICAgICAgICAgICAgICJcMVx1MDE4MyIsCiAgICAgICAgICAgICAiXDFcdTAxODQiLAotICAgICAgICAgICAgIiIsCiAgICAgICAgICAgICAiXDFcdTAxODUiLAogICAgICAgICAgICAgIlwxXHUwMTg2IiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIsCiAgICAgICAgICAgICAiXDFcdTAxODciLAorICAgICAgICAgICAgIiIsCiAgICAgICAgICAgICAiXDFcdTAxODgiLAogICAgICAgICAgICAgIlwxXHUwMTg5IiwKICAgICAgICAgICAgICJcMVx1MDE4YSIsCi0gICAgICAgICAgICAiIiwKLSAgICAgICAgICAgICJcMVx1MDE4YiIsCisgICAgICAgICAgICAiXDFcMTA0XDEzXHVmZmZmXDEyXDEwNFw3XHVmZmZmXDMyXDEwNFw0XHVmZmZmXDFcMTA0XDFcdWZmZmZcMzJcMTA0IiwKICAgICAgICAgICAgICJcMVx1MDE4YyIsCi0gICAgICAgICAgICAiIiwKLSAgICAgICAgICAgICJcMVwxMDNcMTNcdWZmZmZcMTJcMTAzXDdcdWZmZmZcMzJcMTAzXDRcdWZmZmZcMVwxMDNcMVx1ZmZmZlwzMlwxMDMiLAorICAgICAgICAgICAgIlwxXHUwMThkIiwKICAgICAgICAgICAgICJcMVx1MDE4ZSIsCi0gICAgICAgICAgICAiXDFcdTAxOGYiLAotICAgICAgICAgICAgIlwxXDEwM1wxM1x1ZmZmZlwxMlwxMDNcN1x1ZmZmZlwzMlwxMDNcNFx1ZmZmZlwxXDEwM1wxXHVmZmZmXDMyXDEwMyIsCisgICAgICAgICAgICAiXDFcdTAxOTBcMVx1MDE4ZiIsCiAgICAgICAgICAgICAiXDFcdTAxOTEiLAotICAgICAgICAgICAgIlwxXHUwMTkyIiwKLSAgICAgICAgICAgICJcMVwxMDNcMTNcdWZmZmZcMTJcMTAzXDdcdWZmZmZcMzJcMTAzXDRcdWZmZmZcMVwxMDNcMVx1ZmZmZlwzMlwxMDMiLAotICAgICAgICAgICAgIlwxXDEwM1wxM1x1ZmZmZlwxMlwxMDNcN1x1ZmZmZlwzMlwxMDNcNFx1ZmZmZlwxXDEwM1wxXHVmZmZmXDMyXDEwMyIsCisgICAgICAgICAgICAiXDFcMTA0XDEzXHVmZmZmXDEyXDEwNFw3XHVmZmZmXDMyXDEwNFw0XHVmZmZmXDFcMTA0XDFcdWZmZmZcMzJcMTA0IiwKKyAgICAgICAgICAgICJcMVx1MDE5MyIsCisgICAgICAgICAgICAiXDFcdTAxOTQiLAogICAgICAgICAgICAgIiIsCi0gICAgICAgICAgICAiXDFcdTAxOTUiLAotICAgICAgICAgICAgIlwxXDEwM1wxM1x1ZmZmZlwxMlwxMDNcN1x1ZmZmZlwzMlwxMDNcNFx1ZmZmZlwxXDEwM1wxXHVmZmZmXDMyXDEwMyIsCi0gICAgICAgICAgICAiXDFcdTAxOTciLAotICAgICAgICAgICAgIlwxXHUwMTk4IiwKKyAgICAgICAgICAgICJcMVwxMDRcMTNcdWZmZmZcMTJcMTA0XDdcdWZmZmZcMzJcMTA0XDRcdWZmZmZcMVwxMDRcMVx1ZmZmZlwzMlwxMDQiLAorICAgICAgICAgICAgIlwxXHUwMTk2IiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIlwxXHUwMTk4XDE0XHVmZmZmXDFcdTAxOTciLAogICAgICAgICAgICAgIlwxXHUwMTk5IiwKLSAgICAgICAgICAgICIiLAogICAgICAgICAgICAgIlwxXHUwMTlhIiwKKyAgICAgICAgICAgICIiLAogICAgICAgICAgICAgIlwxXHUwMTliIiwKICAgICAgICAgICAgICJcMVx1MDE5YyIsCi0gICAgICAgICAgICAiXDFcdTAxOWQiLAotICAgICAgICAgICAgIlwxXDEwM1wxM1x1ZmZmZlwxMlwxMDNcN1x1ZmZmZlwzMlwxMDNcNFx1ZmZmZlwxXDEwM1wxXHVmZmZmXDMyXDEwMyIsCisgICAgICAgICAgICAiXDFcMTA0XDEzXHVmZmZmXDEyXDEwNFw3XHVmZmZmXDMyXDEwNFw0XHVmZmZmXDFcMTA0XDFcdWZmZmZcMzJcMTA0IiwKKyAgICAgICAgICAgICJcMVx1MDE5ZSIsCiAgICAgICAgICAgICAiXDFcdTAxOWYiLAogICAgICAgICAgICAgIlwxXHUwMWEwIiwKICAgICAgICAgICAgICJcMVx1MDFhMSIsCiAgICAgICAgICAgICAiIiwKICAgICAgICAgICAgICJcMVx1MDFhMiIsCi0gICAgICAgICAgICAiXDFcMTAzXDEzXHVmZmZmXDEyXDEwM1w3XHVmZmZmXDMyXDEwM1w0XHVmZmZmXDFcMTAzXDFcdWZmZmZcMzJcMTAzIiwKKyAgICAgICAgICAgICJcMVx1MDFhMyIsCiAgICAgICAgICAgICAiXDFcdTAxYTQiLAotICAgICAgICAgICAgIlwxXDEwM1wxM1x1ZmZmZlwxMlwxMDNcN1x1ZmZmZlwzMlwxMDNcNFx1ZmZmZlwxXDEwM1wxXHVmZmZmXDMyXDEwMyIsCi0gICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICJcMVx1MDFhNSIsCiAgICAgICAgICAgICAiXDFcdTAxYTYiLAotICAgICAgICAgICAgIlwxXDEwM1wxM1x1ZmZmZlwxMlwxMDNcN1x1ZmZmZlwzMlwxMDNcNFx1ZmZmZlwxXDEwM1wxXHVmZmZmXDMyXDEwMyIsCisgICAgICAgICAgICAiXDFcdTAxYTciLAorICAgICAgICAgICAgIiIsCiAgICAgICAgICAgICAiXDFcdTAxYTgiLAogICAgICAgICAgICAgIlwxXHUwMWE5IiwKLSAgICAgICAgICAgICJcMVx1MDFhYSIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICJcMVwxMDRcMTNcdWZmZmZcMTJcMTA0XDdcdWZmZmZcMzJcMTA0XDRcdWZmZmZcMVwxMDRcMVx1ZmZmZlwzMlwxMDQiLAogICAgICAgICAgICAgIlwxXHUwMWFiIiwKICAgICAgICAgICAgICJcMVx1MDFhYyIsCi0gICAgICAgICAgICAiXDFcdTAxYWQiLAorICAgICAgICAgICAgIlwxXDEwNFwxM1x1ZmZmZlwxMlwxMDRcN1x1ZmZmZlwzMlwxMDRcNFx1ZmZmZlwxXDEwNFwxXHVmZmZmXDMyXDEwNCIsCiAgICAgICAgICAgICAiXDFcdTAxYWUiLAogICAgICAgICAgICAgIlwxXHUwMWFmIiwKLSAgICAgICAgICAgICJcMVx1MDFiMCIsCi0gICAgICAgICAgICAiXDFcdTAxYjEiLAotICAgICAgICAgICAgIlwxXHUwMWIyIiwKLSAgICAgICAgICAgICJcMVx1MDFiMyIsCi0gICAgICAgICAgICAiXDFcdTAxYjQiLAorICAgICAgICAgICAgIlwxXDEwNFwxM1x1ZmZmZlwxMlwxMDRcN1x1ZmZmZlwzMlwxMDRcNFx1ZmZmZlwxXDEwNFwxXHVmZmZmXDMyXDEwNCIsCisgICAgICAgICAgICAiXDFcMTA0XDEzXHVmZmZmXDEyXDEwNFw3XHVmZmZmXDMyXDEwNFw0XHVmZmZmXDFcMTA0XDFcdWZmZmZcMzJcMTA0IiwKICAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIlwxXHUwMWIyIiwKKyAgICAgICAgICAgICJcMVwxMDRcMTNcdWZmZmZcMTJcMTA0XDdcdWZmZmZcMzJcMTA0XDRcdWZmZmZcMVwxMDRcMVx1ZmZmZlwzMlwxMDQiLAorICAgICAgICAgICAgIlwxXHUwMWI0IiwKICAgICAgICAgICAgICJcMVx1MDFiNSIsCiAgICAgICAgICAgICAiXDFcdTAxYjYiLAogICAgICAgICAgICAgIlwxXHUwMWI3IiwKLSAgICAgICAgICAgICJcMVx1MDFiOVwxNlx1ZmZmZlwxXHUwMWI4IiwKICAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIlwxXDEwNFwxM1x1ZmZmZlwxMlwxMDRcN1x1ZmZmZlwzMlwxMDRcNFx1ZmZmZlwxXDEwNFwxXHVmZmZmXDMyXDEwNCIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICJcMVx1MDFiOSIsCiAgICAgICAgICAgICAiXDFcdTAxYmEiLAogICAgICAgICAgICAgIlwxXHUwMWJiIiwKLSAgICAgICAgICAgICIiLAotICAgICAgICAgICAgIlwxXDEwM1wxM1x1ZmZmZlwxMlwxMDNcN1x1ZmZmZlwzMlwxMDNcNFx1ZmZmZlwxXDEwM1wxXHVmZmZmXDMyXDEwMyIsCi0gICAgICAgICAgICAiXDFcdTAxYmQiLAorICAgICAgICAgICAgIlwxXHUwMWJjIiwKKyAgICAgICAgICAgICJcMVwxMDRcMTNcdWZmZmZcMTJcMTA0XDdcdWZmZmZcMzJcMTA0XDRcdWZmZmZcMVwxMDRcMVx1ZmZmZlwzMlwxMDQiLAogICAgICAgICAgICAgIlwxXHUwMWJlIiwKICAgICAgICAgICAgICJcMVx1MDFiZiIsCi0gICAgICAgICAgICAiXDFcMTAzXDEzXHVmZmZmXDEyXDEwM1w3XHVmZmZmXDMyXDEwM1w0XHVmZmZmXDFcMTAzXDFcdWZmZmZcMzJcMTAzIiwKLSAgICAgICAgICAgICJcMVx1MDFjMlwxNVx1ZmZmZlwxXHUwMWMxIiwKLSAgICAgICAgICAgICJcMVx1MDFjMyIsCisgICAgICAgICAgICAiXDFcdTAxYzAiLAogICAgICAgICAgICAgIiIsCi0gICAgICAgICAgICAiXDFcMTAzXDEzXHVmZmZmXDEyXDEwM1w3XHVmZmZmXDMyXDEwM1w0XHVmZmZmXDFcMTAzXDFcdWZmZmZcMzJcMTAzIiwKKyAgICAgICAgICAgICJcMVx1MDFjMSIsCisgICAgICAgICAgICAiXDFcMTA0XDEzXHVmZmZmXDEyXDEwNFw3XHVmZmZmXDMyXDEwNFw0XHVmZmZmXDFcMTA0XDFcdWZmZmZcMzJcMTA0IiwKKyAgICAgICAgICAgICJcMVx1MDFjMyIsCisgICAgICAgICAgICAiXDFcMTA0XDEzXHVmZmZmXDEyXDEwNFw3XHVmZmZmXDMyXDEwNFw0XHVmZmZmXDFcMTA0XDFcdWZmZmZcMzJcMTA0IiwKKyAgICAgICAgICAgICIiLAogICAgICAgICAgICAgIlwxXHUwMWM1IiwKLSAgICAgICAgICAgICJcMVx1MDFjNiIsCisgICAgICAgICAgICAiXDFcMTA0XDEzXHVmZmZmXDEyXDEwNFw3XHVmZmZmXDMyXDEwNFw0XHVmZmZmXDFcMTA0XDFcdWZmZmZcMzJcMTA0IiwKICAgICAgICAgICAgICJcMVx1MDFjNyIsCiAgICAgICAgICAgICAiXDFcdTAxYzgiLAogICAgICAgICAgICAgIlwxXHUwMWM5IiwKICAgICAgICAgICAgICJcMVx1MDFjYSIsCi0gICAgICAgICAgICAiXDFcMTAzXDEzXHVmZmZmXDEyXDEwM1w3XHVmZmZmXDMyXDEwM1w0XHVmZmZmXDFcMTAzXDFcdWZmZmZcMzJcMTAzIiwKKyAgICAgICAgICAgICJcMVx1MDFjYiIsCiAgICAgICAgICAgICAiXDFcdTAxY2MiLAogICAgICAgICAgICAgIlwxXHUwMWNkIiwKICAgICAgICAgICAgICJcMVx1MDFjZSIsCi0gICAgICAgICAgICAiIiwKICAgICAgICAgICAgICJcMVx1MDFjZiIsCiAgICAgICAgICAgICAiXDFcdTAxZDAiLAotICAgICAgICAgICAgIiIsCi0gICAgICAgICAgICAiXDFcMTAzXDEzXHVmZmZmXDEyXDEwM1w3XHVmZmZmXDMyXDEwM1w0XHVmZmZmXDFcMTAzXDFcdWZmZmZcMzJcMTAzIiwKKyAgICAgICAgICAgICJcMVx1MDFkMSIsCiAgICAgICAgICAgICAiXDFcdTAxZDIiLAotICAgICAgICAgICAgIiIsCi0gICAgICAgICAgICAiIiwKICAgICAgICAgICAgICJcMVx1MDFkMyIsCi0gICAgICAgICAgICAiIiwKLSAgICAgICAgICAgICJcMVwxMDNcMTNcdWZmZmZcMTJcMTAzXDdcdWZmZmZcMzJcMTAzXDRcdWZmZmZcMVwxMDNcMVx1ZmZmZlwzMlwxMDMiLAorICAgICAgICAgICAgIlwxXHUwMWQ0IiwKICAgICAgICAgICAgICJcMVx1MDFkNSIsCiAgICAgICAgICAgICAiXDFcdTAxZDYiLAorICAgICAgICAgICAgIiIsCiAgICAgICAgICAgICAiXDFcdTAxZDciLAogICAgICAgICAgICAgIlwxXHUwMWQ4IiwKICAgICAgICAgICAgICJcMVx1MDFkOSIsCiAgICAgICAgICAgICAiXDFcdTAxZGEiLAotICAgICAgICAgICAgIiIsCiAgICAgICAgICAgICAiXDFcdTAxZGIiLAotICAgICAgICAgICAgIlwxXHUwMWRjIiwKLSAgICAgICAgICAgICJcMVx1MDFkZCIsCi0gICAgICAgICAgICAiXDFcdTAxZGUiLAorICAgICAgICAgICAgIlwxXHUwMWRkXDE2XHVmZmZmXDFcdTAxZGMiLAogICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiXDFcdTAxZGUiLAogICAgICAgICAgICAgIlwxXHUwMWRmIiwKICAgICAgICAgICAgICIiLAotICAgICAgICAgICAgIlwxXDEwM1wxM1x1ZmZmZlwxMlwxMDNcN1x1ZmZmZlwzMlwxMDNcNFx1ZmZmZlwxXDEwM1wxXHVmZmZmXDMyXDEwMyIsCi0gICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICJcMVwxMDRcMTNcdWZmZmZcMTJcMTA0XDdcdWZmZmZcMzJcMTA0XDRcdWZmZmZcMVwxMDRcMVx1ZmZmZlwzMlwxMDQiLAogICAgICAgICAgICAgIlwxXHUwMWUxIiwKLSAgICAgICAgICAgICJcMVwxMDNcMTNcdWZmZmZcMTJcMTAzXDdcdWZmZmZcMzJcMTAzXDRcdWZmZmZcMVwxMDNcMVx1ZmZmZlwzMlwxMDMiLAorICAgICAgICAgICAgIlwxXHUwMWUyIiwKICAgICAgICAgICAgICJcMVx1MDFlMyIsCi0gICAgICAgICAgICAiXDFcMTAzXDEzXHVmZmZmXDEyXDEwM1w3XHVmZmZmXDMyXDEwM1w0XHVmZmZmXDFcMTAzXDFcdWZmZmZcMzJcMTAzIiwKLSAgICAgICAgICAgICJcMVx1MDFlNSIsCi0gICAgICAgICAgICAiXDFcdTAxZTYiLAorICAgICAgICAgICAgIlwxXDEwNFwxM1x1ZmZmZlwxMlwxMDRcN1x1ZmZmZlwzMlwxMDRcNFx1ZmZmZlwxXDEwNFwxXHVmZmZmXDMyXDEwNCIsCisgICAgICAgICAgICAiXDFcdTAxZTZcMTVcdWZmZmZcMVx1MDFlNSIsCiAgICAgICAgICAgICAiXDFcdTAxZTciLAotICAgICAgICAgICAgIlwxXHUwMWU4IiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIlwxXDEwNFwxM1x1ZmZmZlwxMlwxMDRcN1x1ZmZmZlwzMlwxMDRcNFx1ZmZmZlwxXDEwNFwxXHVmZmZmXDMyXDEwNCIsCiAgICAgICAgICAgICAiXDFcdTAxZTkiLAotICAgICAgICAgICAgIlwxXDEwM1wxM1x1ZmZmZlwxMlwxMDNcN1x1ZmZmZlwzMlwxMDNcNFx1ZmZmZlwxXDEwM1wxXHVmZmZmXDMyXDEwMyIsCi0gICAgICAgICAgICAiXDFcMTAzXDEzXHVmZmZmXDEyXDEwM1w3XHVmZmZmXDMyXDEwM1w0XHVmZmZmXDFcMTAzXDFcdWZmZmZcMzJcMTAzIiwKLSAgICAgICAgICAgICJcMVwxMDNcMTNcdWZmZmZcMTJcMTAzXDdcdWZmZmZcMzJcMTAzXDRcdWZmZmZcMVwxMDNcMVx1ZmZmZlwzMlwxMDMiLAorICAgICAgICAgICAgIlwxXHUwMWVhIiwKKyAgICAgICAgICAgICJcMVx1MDFlYiIsCisgICAgICAgICAgICAiXDFcdTAxZWMiLAogICAgICAgICAgICAgIlwxXHUwMWVkIiwKICAgICAgICAgICAgICJcMVx1MDFlZSIsCi0gICAgICAgICAgICAiXDFcMTAzXDEzXHVmZmZmXDEyXDEwM1w3XHVmZmZmXDMyXDEwM1w0XHVmZmZmXDFcMTAzXDFcdWZmZmZcMzJcMTAzIiwKLSAgICAgICAgICAgICJcMVx1MDFmMCIsCisgICAgICAgICAgICAiXDFcdTAxZWYiLAorICAgICAgICAgICAgIlwxXDEwNFwxM1x1ZmZmZlwxMlwxMDRcN1x1ZmZmZlwzMlwxMDRcNFx1ZmZmZlwxXDEwNFwxXHVmZmZmXDMyXDEwNCIsCiAgICAgICAgICAgICAiXDFcdTAxZjEiLAogICAgICAgICAgICAgIlwxXHUwMWYyIiwKICAgICAgICAgICAgICJcMVx1MDFmMyIsCi0gICAgICAgICAgICAiXDFcMTAzXDEzXHVmZmZmXDEyXDEwM1w3XHVmZmZmXDMyXDEwM1w0XHVmZmZmXDFcMTAzXDFcdWZmZmZcMzJcMTAzIiwKICAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIlwxXHUwMWY0IiwKICAgICAgICAgICAgICJcMVx1MDFmNSIsCi0gICAgICAgICAgICAiXDFcdTAxZjYiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiXDFcMTA0XDEzXHVmZmZmXDEyXDEwNFw3XHVmZmZmXDMyXDEwNFw0XHVmZmZmXDFcMTA0XDFcdWZmZmZcMzJcMTA0IiwKICAgICAgICAgICAgICJcMVx1MDFmNyIsCiAgICAgICAgICAgICAiIiwKLSAgICAgICAgICAgICJcMVwxMDNcMTNcdWZmZmZcMTJcMTAzXDdcdWZmZmZcNFwxMDNcMVx1MDFmOVwxMlwxMDNcMVx1MDFmOFwxMlwxMDNcNFx1ZmZmZlwxXDEwM1wxXHVmZmZmXDMyXDEwMyIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICJcMVx1MDFmOCIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICJcMVwxMDRcMTNcdWZmZmZcMTJcMTA0XDdcdWZmZmZcMzJcMTA0XDRcdWZmZmZcMVwxMDRcMVx1ZmZmZlwzMlwxMDQiLAorICAgICAgICAgICAgIlwxXDEwNFwxM1x1ZmZmZlwxMlwxMDRcN1x1ZmZmZlwzMlwxMDRcNFx1ZmZmZlwxXDEwNFwxXHVmZmZmXDMyXDEwNCIsCiAgICAgICAgICAgICAiXDFcdTAxZmIiLAogICAgICAgICAgICAgIlwxXHUwMWZjIiwKICAgICAgICAgICAgICIiLAotICAgICAgICAgICAgIlwxXDEwM1wxM1x1ZmZmZlwxMlwxMDNcN1x1ZmZmZlwzMlwxMDNcNFx1ZmZmZlwxXDEwM1wxXHVmZmZmXDMyXDEwMyIsCi0gICAgICAgICAgICAiXDFcMTAzXDEzXHVmZmZmXDEyXDEwM1w3XHVmZmZmXDMyXDEwM1w0XHVmZmZmXDFcMTAzXDFcdWZmZmZcMzJcMTAzIiwKKyAgICAgICAgICAgICJcMVx1MDFmZCIsCisgICAgICAgICAgICAiXDFcdTAxZmUiLAogICAgICAgICAgICAgIlwxXHUwMWZmIiwKICAgICAgICAgICAgICJcMVx1MDIwMCIsCi0gICAgICAgICAgICAiXDFcMTAzXDEzXHVmZmZmXDEyXDEwM1w3XHVmZmZmXDMyXDEwM1w0XHVmZmZmXDFcMTAzXDFcdWZmZmZcMzJcMTAzIiwKLSAgICAgICAgICAgICJcMVwxMDNcMTNcdWZmZmZcMTJcMTAzXDdcdWZmZmZcMzJcMTAzXDRcdWZmZmZcMVwxMDNcMVx1ZmZmZlwzMlwxMDMiLAogICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiXDFcdTAyMDEiLAorICAgICAgICAgICAgIlwxXHUwMjAyIiwKICAgICAgICAgICAgICJcMVx1MDIwMyIsCiAgICAgICAgICAgICAiXDFcdTAyMDQiLAorICAgICAgICAgICAgIiIsCiAgICAgICAgICAgICAiXDFcdTAyMDUiLAotICAgICAgICAgICAgIlwxXHUwMjA2IiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIlwxXDEwNFwxM1x1ZmZmZlwxMlwxMDRcN1x1ZmZmZlwzMlwxMDRcNFx1ZmZmZlwxXDEwNFwxXHVmZmZmXDMyXDEwNCIsCisgICAgICAgICAgICAiIiwKICAgICAgICAgICAgICJcMVx1MDIwNyIsCi0gICAgICAgICAgICAiIiwKLSAgICAgICAgICAgICJcMVwxMDNcMTNcdWZmZmZcMTJcMTAzXDdcdWZmZmZcMzJcMTAzXDRcdWZmZmZcMVwxMDNcMVx1ZmZmZlwzMlwxMDMiLAotICAgICAgICAgICAgIiIsCi0gICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICJcMVwxMDRcMTNcdWZmZmZcMTJcMTA0XDdcdWZmZmZcMzJcMTA0XDRcdWZmZmZcMVwxMDRcMVx1ZmZmZlwzMlwxMDQiLAogICAgICAgICAgICAgIlwxXHUwMjA5IiwKLSAgICAgICAgICAgICJcMVwxMDNcMTNcdWZmZmZcMTJcMTAzXDdcdWZmZmZcMzJcMTAzXDRcdWZmZmZcMVwxMDNcMVx1ZmZmZlwzMlwxMDMiLAotICAgICAgICAgICAgIlwxXHUwMjBiIiwKKyAgICAgICAgICAgICJcMVwxMDRcMTNcdWZmZmZcMTJcMTA0XDdcdWZmZmZcMzJcMTA0XDRcdWZmZmZcMVwxMDRcMVx1ZmZmZlwzMlwxMDQiLAorICAgICAgICAgICAgIlwxXDEwNFwxM1x1ZmZmZlwxMlwxMDRcN1x1ZmZmZlwzMlwxMDRcNFx1ZmZmZlwxXDEwNFwxXHVmZmZmXDMyXDEwNCIsCiAgICAgICAgICAgICAiXDFcdTAyMGMiLAogICAgICAgICAgICAgIlwxXHUwMjBkIiwKICAgICAgICAgICAgICJcMVx1MDIwZSIsCiAgICAgICAgICAgICAiXDFcdTAyMGYiLAotICAgICAgICAgICAgIlwxXDEwM1wxM1x1ZmZmZlwxMlwxMDNcN1x1ZmZmZlwzMlwxMDNcNFx1ZmZmZlwxXDEwM1wxXHVmZmZmXDMyXDEwMyIsCi0gICAgICAgICAgICAiXDFcMTAzXDEzXHVmZmZmXDEyXDEwM1w3XHVmZmZmXDMyXDEwM1w0XHVmZmZmXDFcMTAzXDFcdWZmZmZcMzJcMTAzIiwKKyAgICAgICAgICAgICJcMVx1MDIxMCIsCisgICAgICAgICAgICAiXDFcdTAyMTEiLAogICAgICAgICAgICAgIlwxXHUwMjEyIiwKLSAgICAgICAgICAgICJcMVwxMDNcMTNcdWZmZmZcMTJcMTAzXDdcdWZmZmZcMzJcMTAzXDRcdWZmZmZcMVwxMDNcMVx1ZmZmZlwzMlwxMDMiLAotICAgICAgICAgICAgIiIsCi0gICAgICAgICAgICAiXDFcdTAyMTQiLAotICAgICAgICAgICAgIiIsCi0gICAgICAgICAgICAiXDFcdTAyMTUiLAotICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiXDFcMTA0XDEzXHVmZmZmXDEyXDEwNFw3XHVmZmZmXDMyXDEwNFw0XHVmZmZmXDFcMTA0XDFcdWZmZmZcMzJcMTA0IiwKKyAgICAgICAgICAgICJcMVwxMDRcMTNcdWZmZmZcMTJcMTA0XDdcdWZmZmZcMzJcMTA0XDRcdWZmZmZcMVwxMDRcMVx1ZmZmZlwzMlwxMDQiLAorICAgICAgICAgICAgIlwxXDEwNFwxM1x1ZmZmZlwxMlwxMDRcN1x1ZmZmZlwzMlwxMDRcNFx1ZmZmZlwxXDEwNFwxXHVmZmZmXDMyXDEwNCIsCiAgICAgICAgICAgICAiXDFcdTAyMTYiLAogICAgICAgICAgICAgIlwxXHUwMjE3IiwKLSAgICAgICAgICAgICJcMVwxMDNcMTNcdWZmZmZcMTJcMTAzXDdcdWZmZmZcMzJcMTAzXDRcdWZmZmZcMVwxMDNcMVx1ZmZmZlwzMlwxMDMiLAorICAgICAgICAgICAgIlwxXDEwNFwxM1x1ZmZmZlwxMlwxMDRcN1x1ZmZmZlwzMlwxMDRcNFx1ZmZmZlwxXDEwNFwxXHVmZmZmXDMyXDEwNCIsCiAgICAgICAgICAgICAiXDFcdTAyMTkiLAotICAgICAgICAgICAgIlwxXHUwMjFhIiwKLSAgICAgICAgICAgICIiLAotICAgICAgICAgICAgIiIsCi0gICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICJcMVwxMDRcMTNcdWZmZmZcMTJcMTA0XDdcdWZmZmZcMzJcMTA0XDRcdWZmZmZcMVwxMDRcMVx1ZmZmZlwzMlwxMDQiLAogICAgICAgICAgICAgIlwxXHUwMjFiIiwKICAgICAgICAgICAgICJcMVx1MDIxYyIsCi0gICAgICAgICAgICAiIiwKICAgICAgICAgICAgICJcMVx1MDIxZCIsCiAgICAgICAgICAgICAiXDFcdTAyMWUiLAotICAgICAgICAgICAgIlwxXDEwM1wxM1x1ZmZmZlwxMlwxMDNcN1x1ZmZmZlwzMlwxMDNcNFx1ZmZmZlwxXDEwM1wxXHVmZmZmXDMyXDEwMyIsCi0gICAgICAgICAgICAiXDFcMTAzXDEzXHVmZmZmXDEyXDEwM1w3XHVmZmZmXDMyXDEwM1w0XHVmZmZmXDFcMTAzXDFcdWZmZmZcMzJcMTAzIiwKKyAgICAgICAgICAgICJcMVwxMDRcMTNcdWZmZmZcMTJcMTA0XDdcdWZmZmZcMzJcMTA0XDRcdWZmZmZcMVwxMDRcMVx1ZmZmZlwzMlwxMDQiLAogICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiXDFcdTAyMjAiLAogICAgICAgICAgICAgIlwxXHUwMjIxIiwKLSAgICAgICAgICAgICJcMVwxMDNcMTNcdWZmZmZcMTJcMTAzXDdcdWZmZmZcMzJcMTAzXDRcdWZmZmZcMVwxMDNcMVx1ZmZmZlwzMlwxMDMiLAotICAgICAgICAgICAgIlwxXDEwM1wxM1x1ZmZmZlwxMlwxMDNcN1x1ZmZmZlwxNFwxMDNcMVx1MDIyM1wxNVwxMDNcNFx1ZmZmZlwxXDEwM1wxXHVmZmZmXDMyXDEwMyIsCisgICAgICAgICAgICAiXDFcdTAyMjIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiXDFcdTAyMjRcMTJcdWZmZmZcMVx1MDIyMyIsCiAgICAgICAgICAgICAiXDFcdTAyMjUiLAogICAgICAgICAgICAgIlwxXHUwMjI2IiwKICAgICAgICAgICAgICIiLAotICAgICAgICAgICAgIlwxXHUwMjI3IiwKLSAgICAgICAgICAgICJcMVx1MDIyOCIsCi0gICAgICAgICAgICAiIiwKLSAgICAgICAgICAgICIiLAotICAgICAgICAgICAgIlwxXHUwMjI5IiwKLSAgICAgICAgICAgICJcMVx1MDIyYSIsCi0gICAgICAgICAgICAiIiwKLSAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIlwxXDEwNFwxM1x1ZmZmZlwxMlwxMDRcN1x1ZmZmZlwzMlwxMDRcNFx1ZmZmZlwxXDEwNFwxXHVmZmZmXDMyXDEwNCIsCisgICAgICAgICAgICAiXDFcMTA0XDEzXHVmZmZmXDEyXDEwNFw3XHVmZmZmXDMyXDEwNFw0XHVmZmZmXDFcMTA0XDFcdWZmZmZcMzJcMTA0IiwKKyAgICAgICAgICAgICJcMVx1MDIyYVwzXHVmZmZmXDFcdTAyMjkiLAogICAgICAgICAgICAgIlwxXHUwMjJiIiwKICAgICAgICAgICAgICJcMVx1MDIyYyIsCi0gICAgICAgICAgICAiXDFcdTAyMmQiLAotICAgICAgICAgICAgIlwxXHUwMjJlIiwKKyAgICAgICAgICAgICJcMVwxMDRcMTNcdWZmZmZcMTJcMTA0XDdcdWZmZmZcMzJcMTA0XDRcdWZmZmZcMVwxMDRcMVx1ZmZmZlwzMlwxMDQiLAorICAgICAgICAgICAgIlwxXDEwNFwxM1x1ZmZmZlwxMlwxMDRcN1x1ZmZmZlwzMlwxMDRcNFx1ZmZmZlwxXDEwNFwxXHVmZmZmXDMyXDEwNCIsCisgICAgICAgICAgICAiIiwKICAgICAgICAgICAgICJcMVx1MDIyZiIsCi0gICAgICAgICAgICAiIiwKLSAgICAgICAgICAgICJcMVx1MDIzMFwzM1x1ZmZmZlwxXHUwMjMxIiwKLSAgICAgICAgICAgICIiLAotICAgICAgICAgICAgIlwxXDEwM1wxM1x1ZmZmZlwxMlwxMDNcN1x1ZmZmZlwzMlwxMDNcNFx1ZmZmZlwxXDEwM1wxXHVmZmZmXDMyXDEwMyIsCisgICAgICAgICAgICAiXDFcdTAyMzAiLAorICAgICAgICAgICAgIlwxXHUwMjMxIiwKKyAgICAgICAgICAgICJcMVx1MDIzMiIsCiAgICAgICAgICAgICAiXDFcdTAyMzMiLAotICAgICAgICAgICAgIlwxXHUwMjM0IiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIlwxXDEwNFwxM1x1ZmZmZlwxMlwxMDRcN1x1ZmZmZlwzMlwxMDRcNFx1ZmZmZlwxXDEwNFwxXHVmZmZmXDMyXDEwNCIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIsCiAgICAgICAgICAgICAiXDFcdTAyMzUiLAotICAgICAgICAgICAgIlwxXHUwMjM2IiwKLSAgICAgICAgICAgICIiLAotICAgICAgICAgICAgIiIsCi0gICAgICAgICAgICAiXDFcMTAzXDEzXHVmZmZmXDEyXDEwM1w3XHVmZmZmXDMyXDEwM1w0XHVmZmZmXDFcMTAzXDFcdWZmZmZcMzJcMTAzIiwKLSAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIlwxXDEwNFwxM1x1ZmZmZlwxMlwxMDRcN1x1ZmZmZlwzMlwxMDRcNFx1ZmZmZlwxXDEwNFwxXHVmZmZmXDMyXDEwNCIsCisgICAgICAgICAgICAiXDFcdTAyMzciLAogICAgICAgICAgICAgIlwxXHUwMjM4IiwKICAgICAgICAgICAgICJcMVx1MDIzOSIsCiAgICAgICAgICAgICAiXDFcdTAyM2EiLAogICAgICAgICAgICAgIlwxXHUwMjNiIiwKLSAgICAgICAgICAgICIiLAotICAgICAgICAgICAgIlwxXHUwMjNjIiwKLSAgICAgICAgICAgICJcMVwxMDNcMTNcdWZmZmZcMTJcMTAzXDdcdWZmZmZcMzJcMTAzXDRcdWZmZmZcMVwxMDNcMVx1ZmZmZlwzMlwxMDMiLAorICAgICAgICAgICAgIlwxXDEwNFwxM1x1ZmZmZlwxMlwxMDRcN1x1ZmZmZlwzMlwxMDRcNFx1ZmZmZlwxXDEwNFwxXHVmZmZmXDMyXDEwNCIsCisgICAgICAgICAgICAiXDFcMTA0XDEzXHVmZmZmXDEyXDEwNFw3XHVmZmZmXDMyXDEwNFw0XHVmZmZmXDFcMTA0XDFcdWZmZmZcMzJcMTA0IiwKICAgICAgICAgICAgICJcMVx1MDIzZSIsCi0gICAgICAgICAgICAiXDFcMTAzXDEzXHVmZmZmXDEyXDEwM1w3XHVmZmZmXDMyXDEwM1w0XHVmZmZmXDFcMTAzXDFcdWZmZmZcMzJcMTAzIiwKKyAgICAgICAgICAgICJcMVwxMDRcMTNcdWZmZmZcMTJcMTA0XDdcdWZmZmZcMzJcMTA0XDRcdWZmZmZcMVwxMDRcMVx1ZmZmZlwzMlwxMDQiLAorICAgICAgICAgICAgIiIsCiAgICAgICAgICAgICAiXDFcdTAyNDAiLAorICAgICAgICAgICAgIiIsCiAgICAgICAgICAgICAiXDFcdTAyNDEiLAogICAgICAgICAgICAgIiIsCiAgICAgICAgICAgICAiIiwKICAgICAgICAgICAgICJcMVx1MDI0MiIsCi0gICAgICAgICAgICAiIiwKICAgICAgICAgICAgICJcMVx1MDI0MyIsCi0gICAgICAgICAgICAiIiwKICAgICAgICAgICAgICJcMVx1MDI0NCIsCiAgICAgICAgICAgICAiXDFcdTAyNDUiLAotICAgICAgICAgICAgIlwxXDEwM1wxM1x1ZmZmZlwxMlwxMDNcN1x1ZmZmZlwzMlwxMDNcNFx1ZmZmZlwxXDEwM1wxXHVmZmZmXDMyXDEwMyIsCi0gICAgICAgICAgICAiXDFcMTAzXDEzXHVmZmZmXDEyXDEwM1w3XHVmZmZmXDMyXDEwM1w0XHVmZmZmXDFcMTAzXDFcdWZmZmZcMzJcMTAzIiwKKyAgICAgICAgICAgICJcMVwxMDRcMTNcdWZmZmZcMTJcMTA0XDdcdWZmZmZcMzJcMTA0XDRcdWZmZmZcMVwxMDRcMVx1ZmZmZlwzMlwxMDQiLAorICAgICAgICAgICAgIlwxXHUwMjQ3IiwKICAgICAgICAgICAgICJcMVx1MDI0OCIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIsCiAgICAgICAgICAgICAiXDFcdTAyNDkiLAogICAgICAgICAgICAgIlwxXHUwMjRhIiwKKyAgICAgICAgICAgICIiLAogICAgICAgICAgICAgIlwxXHUwMjRiIiwKLSAgICAgICAgICAgICJcMVwxMDNcMTNcdWZmZmZcMTJcMTAzXDdcdWZmZmZcMzJcMTAzXDRcdWZmZmZcMVwxMDNcMVx1ZmZmZlwzMlwxMDMiLAotICAgICAgICAgICAgIlwxXDEwM1wxM1x1ZmZmZlwxMlwxMDNcN1x1ZmZmZlwzMlwxMDNcNFx1ZmZmZlwxXDEwM1wxXHVmZmZmXDMyXDEwMyIsCi0gICAgICAgICAgICAiXDFcdTAyNGUiLAotICAgICAgICAgICAgIlwxXHUwMjRmIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIlwxXHUwMjRjIiwKKyAgICAgICAgICAgICJcMVx1MDI0ZCIsCisgICAgICAgICAgICAiXDFcMTA0XDEzXHVmZmZmXDEyXDEwNFw3XHVmZmZmXDMyXDEwNFw0XHVmZmZmXDFcMTA0XDFcdWZmZmZcMzJcMTA0IiwKKyAgICAgICAgICAgICJcMVwxMDRcMTNcdWZmZmZcMTJcMTA0XDdcdWZmZmZcMzJcMTA0XDRcdWZmZmZcMVwxMDRcMVx1ZmZmZlwzMlwxMDQiLAorICAgICAgICAgICAgIiIsCiAgICAgICAgICAgICAiXDFcdTAyNTAiLAotICAgICAgICAgICAgIiIsCi0gICAgICAgICAgICAiXDFcdTAyNTEiLAotICAgICAgICAgICAgIlwxXHUwMjUyIiwKLSAgICAgICAgICAgICJcMVx1MDI1MyIsCisgICAgICAgICAgICAiXDFcMTA0XDEzXHVmZmZmXDEyXDEwNFw3XHVmZmZmXDMyXDEwNFw0XHVmZmZmXDFcMTA0XDFcdWZmZmZcMzJcMTA0IiwKKyAgICAgICAgICAgICJcMVwxMDRcMTNcdWZmZmZcMTJcMTA0XDdcdWZmZmZcMTRcMTA0XDFcdTAyNTJcMTVcMTA0XDRcdWZmZmZcMVwxMDRcMVx1ZmZmZlwzMlwxMDQiLAogICAgICAgICAgICAgIlwxXHUwMjU0IiwKLSAgICAgICAgICAgICIiLAogICAgICAgICAgICAgIlwxXHUwMjU1IiwKICAgICAgICAgICAgICJcMVx1MDI1NiIsCiAgICAgICAgICAgICAiXDFcdTAyNTciLAotICAgICAgICAgICAgIlwxXDEwM1wxM1x1ZmZmZlwxMlwxMDNcN1x1ZmZmZlwzMlwxMDNcNFx1ZmZmZlwxXDEwM1wxXHVmZmZmXDMyXDEwMyIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIlwxXHUwMjU4IiwKICAgICAgICAgICAgICJcMVx1MDI1OSIsCi0gICAgICAgICAgICAiIiwKICAgICAgICAgICAgICJcMVx1MDI1YSIsCi0gICAgICAgICAgICAiIiwKICAgICAgICAgICAgICJcMVx1MDI1YiIsCi0gICAgICAgICAgICAiXDFcMTAzXDEzXHVmZmZmXDEyXDEwM1w3XHVmZmZmXDMyXDEwM1w0XHVmZmZmXDFcMTAzXDFcdWZmZmZcMzJcMTAzIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiXDFcdTAyNWMiLAogICAgICAgICAgICAgIlwxXHUwMjVkIiwKICAgICAgICAgICAgICJcMVx1MDI1ZSIsCiAgICAgICAgICAgICAiXDFcdTAyNWYiLAogICAgICAgICAgICAgIlwxXHUwMjYwIiwKICAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIlwxXHUwMjYxXDMzXHVmZmZmXDFcdTAyNjIiLAogICAgICAgICAgICAgIiIsCi0gICAgICAgICAgICAiXDFcdTAyNjEiLAotICAgICAgICAgICAgIlwxXDEwM1wxM1x1ZmZmZlwxMlwxMDNcN1x1ZmZmZlwzMlwxMDNcNFx1ZmZmZlwxXDEwM1wxXHVmZmZmXDMyXDEwMyIsCi0gICAgICAgICAgICAiXDFcdTAyNjMiLAorICAgICAgICAgICAgIlwxXDEwNFwxM1x1ZmZmZlwxMlwxMDRcN1x1ZmZmZlwzMlwxMDRcNFx1ZmZmZlwxXDEwNFwxXHVmZmZmXDMyXDEwNCIsCiAgICAgICAgICAgICAiXDFcdTAyNjQiLAotICAgICAgICAgICAgIiIsCi0gICAgICAgICAgICAiIiwKLSAgICAgICAgICAgICJcMVwxMDNcMTNcdWZmZmZcMTJcMTAzXDdcdWZmZmZcMzJcMTAzXDRcdWZmZmZcMVwxMDNcMVx1ZmZmZlwzMlwxMDMiLAorICAgICAgICAgICAgIlwxXHUwMjY1IiwKICAgICAgICAgICAgICJcMVx1MDI2NiIsCiAgICAgICAgICAgICAiXDFcdTAyNjciLAotICAgICAgICAgICAgIlwxXHUwMjY4IiwKLSAgICAgICAgICAgICJcMVwxMDNcMTNcdWZmZmZcMTJcMTAzXDdcdWZmZmZcMzJcMTAzXDRcdWZmZmZcMVwxMDNcMVx1ZmZmZlwzMlwxMDMiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICJcMVwxMDRcMTNcdWZmZmZcMTJcMTA0XDdcdWZmZmZcMzJcMTA0XDRcdWZmZmZcMVwxMDRcMVx1ZmZmZlwzMlwxMDQiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiXDFcdTAyNjkiLAogICAgICAgICAgICAgIlwxXHUwMjZhIiwKICAgICAgICAgICAgICJcMVx1MDI2YiIsCiAgICAgICAgICAgICAiXDFcdTAyNmMiLAotICAgICAgICAgICAgIlwxXDEwM1wxM1x1ZmZmZlwxMlwxMDNcN1x1ZmZmZlwzMlwxMDNcNFx1ZmZmZlwxXDEwM1wxXHVmZmZmXDMyXDEwMyIsCisgICAgICAgICAgICAiXDFcdTAyNmQiLAogICAgICAgICAgICAgIlwxXHUwMjZlIiwKICAgICAgICAgICAgICIiLAotICAgICAgICAgICAgIlwxXDEwM1wxM1x1ZmZmZlwxMlwxMDNcN1x1ZmZmZlwzMlwxMDNcNFx1ZmZmZlwxXDEwM1wxXHVmZmZmXDMyXDEwMyIsCi0gICAgICAgICAgICAiXDFcdTAyNzAiLAotICAgICAgICAgICAgIlwxXDEwM1wxM1x1ZmZmZlwxMlwxMDNcN1x1ZmZmZlwzMlwxMDNcNFx1ZmZmZlwxXDEwM1wxXHVmZmZmXDMyXDEwMyIsCi0gICAgICAgICAgICAiIiwKLSAgICAgICAgICAgICJcMVx1MDI3MiIsCisgICAgICAgICAgICAiXDFcdTAyNmYiLAorICAgICAgICAgICAgIlwxXDEwNFwxM1x1ZmZmZlwxMlwxMDRcN1x1ZmZmZlwzMlwxMDRcNFx1ZmZmZlwxXDEwNFwxXHVmZmZmXDMyXDEwNCIsCisgICAgICAgICAgICAiXDFcdTAyNzEiLAorICAgICAgICAgICAgIlwxXDEwNFwxM1x1ZmZmZlwxMlwxMDRcN1x1ZmZmZlwzMlwxMDRcNFx1ZmZmZlwxXDEwNFwxXHVmZmZmXDMyXDEwNCIsCiAgICAgICAgICAgICAiXDFcdTAyNzMiLAotICAgICAgICAgICAgIlwxXDEwM1wxM1x1ZmZmZlwxMlwxMDNcN1x1ZmZmZlwzMlwxMDNcNFx1ZmZmZlwxXDEwM1wxXHVmZmZmXDMyXDEwMyIsCisgICAgICAgICAgICAiXDFcdTAyNzQiLAogICAgICAgICAgICAgIlwxXHUwMjc1IiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIsCiAgICAgICAgICAgICAiXDFcdTAyNzYiLAogICAgICAgICAgICAgIiIsCiAgICAgICAgICAgICAiXDFcdTAyNzciLAorICAgICAgICAgICAgIiIsCiAgICAgICAgICAgICAiXDFcdTAyNzgiLAotICAgICAgICAgICAgIiIsCiAgICAgICAgICAgICAiXDFcdTAyNzkiLAotICAgICAgICAgICAgIlwxXHUwMjdhIiwKLSAgICAgICAgICAgICJcMVx1MDI3YiIsCi0gICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICJcMVwxMDRcMTNcdWZmZmZcMTJcMTA0XDdcdWZmZmZcMzJcMTA0XDRcdWZmZmZcMVwxMDRcMVx1ZmZmZlwzMlwxMDQiLAorICAgICAgICAgICAgIlwxXDEwNFwxM1x1ZmZmZlwxMlwxMDRcN1x1ZmZmZlwzMlwxMDRcNFx1ZmZmZlwxXDEwNFwxXHVmZmZmXDMyXDEwNCIsCiAgICAgICAgICAgICAiXDFcdTAyN2MiLAogICAgICAgICAgICAgIlwxXHUwMjdkIiwKLSAgICAgICAgICAgICJcMVwxMDNcMTNcdWZmZmZcMTJcMTAzXDdcdWZmZmZcMzJcMTAzXDRcdWZmZmZcMVwxMDNcMVx1ZmZmZlwzMlwxMDMiLAotICAgICAgICAgICAgIiIsCi0gICAgICAgICAgICAiXDFcMTAzXDEzXHVmZmZmXDEyXDEwM1w3XHVmZmZmXDMyXDEwM1w0XHVmZmZmXDFcMTAzXDFcdWZmZmZcMzJcMTAzIiwKLSAgICAgICAgICAgICIiLAotICAgICAgICAgICAgIlwxXDEwM1wxM1x1ZmZmZlwxMlwxMDNcN1x1ZmZmZlwzMlwxMDNcNFx1ZmZmZlwxXDEwM1wxXHVmZmZmXDMyXDEwMyIsCi0gICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICJcMVx1MDI3ZSIsCisgICAgICAgICAgICAiXDFcdTAyN2YiLAorICAgICAgICAgICAgIlwxXHUwMjgwIiwKICAgICAgICAgICAgICJcMVx1MDI4MSIsCi0gICAgICAgICAgICAiXDFcdTAyODIiLAotICAgICAgICAgICAgIiIsCi0gICAgICAgICAgICAiXDFcdTAyODMiLAorICAgICAgICAgICAgIlwxXDEwNFwxM1x1ZmZmZlwxMlwxMDRcN1x1ZmZmZlwzMlwxMDRcNFx1ZmZmZlwxXDEwNFwxXHVmZmZmXDMyXDEwNCIsCisgICAgICAgICAgICAiXDFcMTA0XDEzXHVmZmZmXDEyXDEwNFw3XHVmZmZmXDMyXDEwNFw0XHVmZmZmXDFcMTA0XDFcdWZmZmZcMzJcMTA0IiwKICAgICAgICAgICAgICJcMVx1MDI4NCIsCiAgICAgICAgICAgICAiXDFcdTAyODUiLAogICAgICAgICAgICAgIlwxXHUwMjg2IiwKKyAgICAgICAgICAgICIiLAogICAgICAgICAgICAgIlwxXHUwMjg3IiwKICAgICAgICAgICAgICJcMVx1MDI4OCIsCi0gICAgICAgICAgICAiXDFcMTAzXDEzXHVmZmZmXDEyXDEwM1w3XHVmZmZmXDMyXDEwM1w0XHVmZmZmXDFcMTAzXDFcdWZmZmZcMzJcMTAzIiwKKyAgICAgICAgICAgICJcMVx1MDI4OSIsCiAgICAgICAgICAgICAiXDFcdTAyOGEiLAorICAgICAgICAgICAgIiIsCiAgICAgICAgICAgICAiXDFcdTAyOGIiLAotICAgICAgICAgICAgIiIsCi0gICAgICAgICAgICAiIiwKLSAgICAgICAgICAgICIiLAogICAgICAgICAgICAgIlwxXHUwMjhjIiwKLSAgICAgICAgICAgICJcMVwxMDNcMTNcdWZmZmZcMTJcMTAzXDdcdWZmZmZcMzJcMTAzXDRcdWZmZmZcMVwxMDNcMVx1ZmZmZlwzMlwxMDMiLAotICAgICAgICAgICAgIlwxXDEwM1wxM1x1ZmZmZlwxMlwxMDNcN1x1ZmZmZlwzMlwxMDNcNFx1ZmZmZlwxXDEwM1wxXHVmZmZmXDMyXDEwMyIsCisgICAgICAgICAgICAiXDFcMTA0XDEzXHVmZmZmXDEyXDEwNFw3XHVmZmZmXDMyXDEwNFw0XHVmZmZmXDFcMTA0XDFcdWZmZmZcMzJcMTA0IiwKKyAgICAgICAgICAgICJcMVx1MDI4ZSIsCiAgICAgICAgICAgICAiXDFcdTAyOGYiLAotICAgICAgICAgICAgIlwxXDEwM1wxM1x1ZmZmZlwxMlwxMDNcN1x1ZmZmZlwzMlwxMDNcNFx1ZmZmZlwxXDEwM1wxXHVmZmZmXDMyXDEwMyIsCisgICAgICAgICAgICAiXDFcMTA0XDEzXHVmZmZmXDEyXDEwNFw3XHVmZmZmXDMyXDEwNFw0XHVmZmZmXDFcMTA0XDFcdWZmZmZcMzJcMTA0IiwKICAgICAgICAgICAgICJcMVx1MDI5MSIsCisgICAgICAgICAgICAiIiwKICAgICAgICAgICAgICJcMVx1MDI5MiIsCisgICAgICAgICAgICAiIiwKICAgICAgICAgICAgICJcMVx1MDI5MyIsCi0gICAgICAgICAgICAiIiwKICAgICAgICAgICAgICJcMVx1MDI5NCIsCi0gICAgICAgICAgICAiXDFcMTAzXDEzXHVmZmZmXDEyXDEwM1w3XHVmZmZmXDMyXDEwM1w0XHVmZmZmXDFcMTAzXDFcdWZmZmZcMzJcMTAzIiwKKyAgICAgICAgICAgICJcMVwxMDRcMTNcdWZmZmZcMTJcMTA0XDdcdWZmZmZcMzJcMTA0XDRcdWZmZmZcMVwxMDRcMVx1ZmZmZlwzMlwxMDQiLAogICAgICAgICAgICAgIlwxXHUwMjk2IiwKLSAgICAgICAgICAgICIiLAotICAgICAgICAgICAgIiIsCiAgICAgICAgICAgICAiXDFcdTAyOTciLAotICAgICAgICAgICAgIiIsCiAgICAgICAgICAgICAiXDFcdTAyOTgiLAotICAgICAgICAgICAgIlwxXDEwM1wxM1x1ZmZmZlwxMlwxMDNcN1x1ZmZmZlwzMlwxMDNcNFx1ZmZmZlwxXDEwM1wxXHVmZmZmXDMyXDEwMyIsCisgICAgICAgICAgICAiXDFcdTAyOTkiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiIiwKICAgICAgICAgICAgICJcMVx1MDI5YSIsCiAgICAgICAgICAgICAiXDFcdTAyOWIiLAotICAgICAgICAgICAgIiIsCi0gICAgICAgICAgICAiXDFcMTAzXDEzXHVmZmZmXDEyXDEwM1w3XHVmZmZmXDMyXDEwM1w0XHVmZmZmXDFcMTAzXDFcdWZmZmZcMzJcMTAzIiwKLSAgICAgICAgICAgICJcMVwxMDNcMTNcdWZmZmZcMTJcMTAzXDdcdWZmZmZcMzJcMTAzXDRcdWZmZmZcMVwxMDNcMVx1ZmZmZlwzMlwxMDMiLAotICAgICAgICAgICAgIlwxXDEwM1wxM1x1ZmZmZlwxMlwxMDNcN1x1ZmZmZlwzMlwxMDNcNFx1ZmZmZlwxXDEwM1wxXHVmZmZmXDMyXDEwMyIsCi0gICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICJcMVx1MDI5YyIsCisgICAgICAgICAgICAiXDFcMTA0XDEzXHVmZmZmXDEyXDEwNFw3XHVmZmZmXDMyXDEwNFw0XHVmZmZmXDFcMTA0XDFcdWZmZmZcMzJcMTA0IiwKKyAgICAgICAgICAgICJcMVx1MDI5ZSIsCiAgICAgICAgICAgICAiXDFcdTAyOWYiLAotICAgICAgICAgICAgIlwxXHUwMmEwIiwKICAgICAgICAgICAgICIiLAogICAgICAgICAgICAgIiIsCi0gICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICJcMVwxMDRcMTNcdWZmZmZcMTJcMTA0XDdcdWZmZmZcMzJcMTA0XDRcdWZmZmZcMVwxMDRcMVx1ZmZmZlwzMlwxMDQiLAogICAgICAgICAgICAgIlwxXHUwMmExIiwKICAgICAgICAgICAgICJcMVx1MDJhMiIsCiAgICAgICAgICAgICAiXDFcdTAyYTMiLAotICAgICAgICAgICAgIlwxXHUwMmE0IiwKKyAgICAgICAgICAgICJcMVwxMDRcMTNcdWZmZmZcMTJcMTA0XDdcdWZmZmZcMzJcMTA0XDRcdWZmZmZcMVwxMDRcMVx1ZmZmZlwzMlwxMDQiLAogICAgICAgICAgICAgIlwxXHUwMmE1IiwKICAgICAgICAgICAgICJcMVx1MDJhNiIsCiAgICAgICAgICAgICAiXDFcdTAyYTciLAotICAgICAgICAgICAgIlwxXHUwMmE4IiwKKyAgICAgICAgICAgICJcMVwxMDRcMTNcdWZmZmZcMTJcMTA0XDdcdWZmZmZcMzJcMTA0XDRcdWZmZmZcMVwxMDRcMVx1ZmZmZlwzMlwxMDQiLAorICAgICAgICAgICAgIiIsCiAgICAgICAgICAgICAiXDFcdTAyYTkiLAogICAgICAgICAgICAgIlwxXHUwMmFhIiwKLSAgICAgICAgICAgICJcMVwxMDNcMTNcdWZmZmZcMTJcMTAzXDdcdWZmZmZcMzJcMTAzXDRcdWZmZmZcMVwxMDNcMVx1ZmZmZlwzMlwxMDMiLAotICAgICAgICAgICAgIlwxXHUwMmFjIiwKICAgICAgICAgICAgICIiLAotICAgICAgICAgICAgIlwxXHUwMmFkIiwKKyAgICAgICAgICAgICJcMVwxMDRcMTNcdWZmZmZcMTJcMTA0XDdcdWZmZmZcMzJcMTA0XDRcdWZmZmZcMVwxMDRcMVx1ZmZmZlwzMlwxMDQiLAorICAgICAgICAgICAgIlwxXHUwMmFjIiwKKyAgICAgICAgICAgICJcMVwxMDRcMTNcdWZmZmZcMTJcMTA0XDdcdWZmZmZcMzJcMTA0XDRcdWZmZmZcMVwxMDRcMVx1ZmZmZlwzMlwxMDQiLAogICAgICAgICAgICAgIlwxXHUwMmFlIiwKKyAgICAgICAgICAgICIiLAogICAgICAgICAgICAgIlwxXHUwMmFmIiwKICAgICAgICAgICAgICJcMVx1MDJiMCIsCi0gICAgICAgICAgICAiXDFcdTAyYjEiLAorICAgICAgICAgICAgIlwxXDEwNFwxM1x1ZmZmZlwxMlwxMDRcN1x1ZmZmZlwzMlwxMDRcNFx1ZmZmZlwxXDEwNFwxXHVmZmZmXDMyXDEwNCIsCiAgICAgICAgICAgICAiXDFcdTAyYjIiLAotICAgICAgICAgICAgIlwxXDEwM1wxM1x1ZmZmZlwxMlwxMDNcN1x1ZmZmZlwzMlwxMDNcNFx1ZmZmZlwxXDEwM1wxXHVmZmZmXDMyXDEwMyIsCisgICAgICAgICAgICAiXDFcdTAyYjMiLAorICAgICAgICAgICAgIlwxXHUwMmI0IiwKKyAgICAgICAgICAgICJcMVx1MDJiNSIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICJcMVx1MDJiNiIsCisgICAgICAgICAgICAiXDFcdTAyYjciLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiXDFcdTAyYjgiLAorICAgICAgICAgICAgIlwxXHUwMmI5IiwKKyAgICAgICAgICAgICJcMVx1MDJiYSIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICJcMVx1MDJiYiIsCisgICAgICAgICAgICAiXDFcdTAyYmMiLAorICAgICAgICAgICAgIlwxXDEwNFwxM1x1ZmZmZlwxMlwxMDRcN1x1ZmZmZlwzMlwxMDRcNFx1ZmZmZlwxXDEwNFwxXHVmZmZmXDMyXDEwNCIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICJcMVwxMDRcMTNcdWZmZmZcMTJcMTA0XDdcdWZmZmZcMzJcMTA0XDRcdWZmZmZcMVwxMDRcMVx1ZmZmZlwzMlwxMDQiLAorICAgICAgICAgICAgIlwxXHUwMmJmIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIlwxXDEwNFwxM1x1ZmZmZlwxMlwxMDRcN1x1ZmZmZlwzMlwxMDRcNFx1ZmZmZlwxXDEwNFwxXHVmZmZmXDMyXDEwNCIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICJcMVx1MDJjMSIsCisgICAgICAgICAgICAiXDFcdTAyYzIiLAorICAgICAgICAgICAgIlwxXHUwMmMzIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIlwxXHUwMmM0IiwKKyAgICAgICAgICAgICJcMVx1MDJjNSIsCisgICAgICAgICAgICAiXDFcdTAyYzYiLAorICAgICAgICAgICAgIlwxXHUwMmM3IiwKKyAgICAgICAgICAgICJcMVx1MDJjOCIsCisgICAgICAgICAgICAiXDFcdTAyYzkiLAorICAgICAgICAgICAgIlwxXHUwMmNhIiwKKyAgICAgICAgICAgICJcMVx1MDJjYiIsCisgICAgICAgICAgICAiXDFcMTA0XDEzXHVmZmZmXDEyXDEwNFw3XHVmZmZmXDMyXDEwNFw0XHVmZmZmXDFcMTA0XDFcdWZmZmZcMzJcMTA0IiwKKyAgICAgICAgICAgICJcMVx1MDJjZCIsCisgICAgICAgICAgICAiXDFcdTAyY2UiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICJcMVx1MDJjZiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICJcMVwxMDRcMTNcdWZmZmZcMTJcMTA0XDdcdWZmZmZcMzJcMTA0XDRcdWZmZmZcMVwxMDRcMVx1ZmZmZlwzMlwxMDQiLAorICAgICAgICAgICAgIlwxXHUwMmQxIiwKKyAgICAgICAgICAgICJcMVwxMDRcMTNcdWZmZmZcMTJcMTA0XDdcdWZmZmZcMzJcMTA0XDRcdWZmZmZcMVwxMDRcMVx1ZmZmZlwzMlwxMDQiLAorICAgICAgICAgICAgIlwxXDEwNFwxM1x1ZmZmZlwxMlwxMDRcN1x1ZmZmZlwzMlwxMDRcNFx1ZmZmZlwxXDEwNFwxXHVmZmZmXDMyXDEwNCIsCisgICAgICAgICAgICAiXDFcMTA0XDEzXHVmZmZmXDEyXDEwNFw3XHVmZmZmXDMyXDEwNFw0XHVmZmZmXDFcMTA0XDFcdWZmZmZcMzJcMTA0IiwKKyAgICAgICAgICAgICJcMVwxMDRcMTNcdWZmZmZcMTJcMTA0XDdcdWZmZmZcMzJcMTA0XDRcdWZmZmZcMVwxMDRcMVx1ZmZmZlwzMlwxMDQiLAorICAgICAgICAgICAgIlwxXHUwMmQ2IiwKKyAgICAgICAgICAgICJcMVwxMDRcMTNcdWZmZmZcMTJcMTA0XDdcdWZmZmZcMzJcMTA0XDRcdWZmZmZcMVwxMDRcMVx1ZmZmZlwzMlwxMDQiLAorICAgICAgICAgICAgIlwxXHUwMmQ4IiwKKyAgICAgICAgICAgICJcMVx1MDJkOSIsCisgICAgICAgICAgICAiXDFcdTAyZGEiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiXDFcdTAyZGIiLAorICAgICAgICAgICAgIlwxXDEwNFwxM1x1ZmZmZlwxMlwxMDRcN1x1ZmZmZlwzMlwxMDRcNFx1ZmZmZlwxXDEwNFwxXHVmZmZmXDMyXDEwNCIsCisgICAgICAgICAgICAiXDFcdTAyZGQiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiXDFcdTAyZGUiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiXDFcdTAyZGYiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiXDFcdTAyZTAiLAorICAgICAgICAgICAgIlwxXDEwNFwxM1x1ZmZmZlwxMlwxMDRcN1x1ZmZmZlwzMlwxMDRcNFx1ZmZmZlwxXDEwNFwxXHVmZmZmXDMyXDEwNCIsCisgICAgICAgICAgICAiXDFcdTAyZTIiLAorICAgICAgICAgICAgIlwxXHUwMmUzIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIlwxXHUwMmU0IiwKKyAgICAgICAgICAgICJcMVwxMDRcMTNcdWZmZmZcMTJcMTA0XDdcdWZmZmZcMzJcMTA0XDRcdWZmZmZcMVwxMDRcMVx1ZmZmZlwzMlwxMDQiLAorICAgICAgICAgICAgIlwxXDEwNFwxM1x1ZmZmZlwxMlwxMDRcN1x1ZmZmZlwzMlwxMDRcNFx1ZmZmZlwxXDEwNFwxXHVmZmZmXDMyXDEwNCIsCisgICAgICAgICAgICAiXDFcMTA0XDEzXHVmZmZmXDEyXDEwNFw3XHVmZmZmXDMyXDEwNFw0XHVmZmZmXDFcMTA0XDFcdWZmZmZcMzJcMTA0IiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIlwxXHUwMmU4IiwKKyAgICAgICAgICAgICJcMVx1MDJlOSIsCisgICAgICAgICAgICAiXDFcdTAyZWEiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIlwxXHUwMmViIiwKKyAgICAgICAgICAgICJcMVx1MDJlYyIsCisgICAgICAgICAgICAiXDFcdTAyZWQiLAorICAgICAgICAgICAgIlwxXHUwMmVlIiwKKyAgICAgICAgICAgICJcMVx1MDJlZiIsCisgICAgICAgICAgICAiXDFcdTAyZjAiLAorICAgICAgICAgICAgIlwxXHUwMmYxIiwKKyAgICAgICAgICAgICJcMVx1MDJmMiIsCisgICAgICAgICAgICAiXDFcdTAyZjMiLAorICAgICAgICAgICAgIlwxXHUwMmY0IiwKKyAgICAgICAgICAgICJcMVx1MDJmNSIsCisgICAgICAgICAgICAiXDFcdTAyZjYiLAorICAgICAgICAgICAgIlwxXHUwMmY3IiwKKyAgICAgICAgICAgICJcMVx1MDJmOCIsCisgICAgICAgICAgICAiXDFcdTAyZjkiLAorICAgICAgICAgICAgIlwxXDEwNFwxM1x1ZmZmZlwxMlwxMDRcN1x1ZmZmZlwzMlwxMDRcNFx1ZmZmZlwxXDEwNFwxXHVmZmZmXDMyXDEwNCIsCisgICAgICAgICAgICAiXDFcdTAyZmIiLAorICAgICAgICAgICAgIlwxXDEwNFwxM1x1ZmZmZlwxMlwxMDRcN1x1ZmZmZlwzMlwxMDRcNFx1ZmZmZlwxXDEwNFwxXHVmZmZmXDMyXDEwNCIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICJcMVx1MDJmZCIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICJcMVx1MDJmZSIsCisgICAgICAgICAgICAiXDFcdTAyZmYiLAorICAgICAgICAgICAgIlwxXHUwMzAwIiwKKyAgICAgICAgICAgICJcMVx1MDMwMSIsCisgICAgICAgICAgICAiXDFcdTAzMDIiLAorICAgICAgICAgICAgIlwxXDEwNFwxM1x1ZmZmZlwxMlwxMDRcN1x1ZmZmZlwzMlwxMDRcNFx1ZmZmZlwxXDEwNFwxXHVmZmZmXDMyXDEwNCIsCiAgICAgICAgICAgICAiIgogICAgIH07CiAKQEAgLTU3ODQsNyArNjIxMiw3IEBACiAgICAgICAgICAgICB0aGlzLnRyYW5zaXRpb24gPSBERkEyMV90cmFuc2l0aW9uOwogICAgICAgICB9CiAgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0RGVzY3JpcHRpb24oKSB7Ci0gICAgICAgICAgICByZXR1cm4gIjE6MTogVG9rZW5zIDogKCBUX18xMyB8IFRfXzE0IHwgVF9fMTUgfCBUX18xNiB8IFRfXzE3IHwgVF9fMTggfCBUX18xOSB8IFRfXzIwIHwgVF9fMjEgfCBUX18yMiB8IFRfXzIzIHwgVF9fMjQgfCBUX18yNSB8IFRfXzI2IHwgVF9fMjcgfCBUX18yOCB8IFRfXzI5IHwgVF9fMzAgfCBUX18zMSB8IFRfXzMyIHwgVF9fMzMgfCBUX18zNCB8IFRfXzM1IHwgVF9fMzYgfCBUX18zNyB8IFRfXzM4IHwgVF9fMzkgfCBUX180MCB8IFRfXzQxIHwgVF9fNDIgfCBUX180MyB8IFRfXzQ0IHwgVF9fNDUgfCBUX180NiB8IFRfXzQ3IHwgVF9fNDggfCBUX180OSB8IFRfXzUwIHwgVF9fNTEgfCBUX181MiB8IFRfXzUzIHwgVF9fNTQgfCBUX181NSB8IFRfXzU2IHwgVF9fNTcgfCBUX181OCB8IFRfXzU5IHwgVF9fNjAgfCBUX182MSB8IFRfXzYyIHwgVF9fNjMgfCBUX182NCB8IFRfXzY1IHwgVF9fNjYgfCBUX182NyB8IFRfXzY4IHwgVF9fNjkgfCBUX183MCB8IFRfXzcxIHwgVF9fNzIgfCBUX183MyB8IFRfXzc0IHwgVF9fNzUgfCBUX183NiB8IFRfXzc3IHwgVF9fNzggfCBUX183OSB8IFRfXzgwIHwgVF9fODEgfCBUX184MiB8IFRfXzgzIHwgVF9fODQgfCBUX184NSB8IFRfXzg2IHwgVF9fODcgfCBUX184OCB8IFRfXzg5IHwgVF9fOTAgfCBUX185MSB8IFRfXzkyIHwgVF9fOTMgfCBUX185NCB8IFRfXzk1IHwgVF9fOTYgfCBUX185NyB8IFRfXzk4IHwgVF9fOTkgfCBUX18xMDAgfCBUX18xMDEgfCBUX18xMDIgfCBUX18xMDMgfCBUX18xMDQgfCBUX18xMDUgfCBUX18xMDYgfCBUX18xMDcgfCBUX18xMDggfCBUX18xMDkgfCBUX18xMTAgfCBUX18xMTEgfCBUX18xMTIgfCBUX18xMTMgfCBUX18xMTQgfCBUX18xMTUgfCBUX18xMTYgfCBUX18xMTcgfCBUX18xMTggfCBUX18xMTkgfCBUX18xMjAgfCBUX18xMjEgfCBUX18xMjIgfCBUX18xMjMgfCBUX18xMjQgfCBUX18xMjUgfCBUX18xMjYgfCBUX18xMjcgfCBUX18xMjggfCBUX18xMjkgfCBUX18xMzAgfCBUX18xMzEgfCBUX18xMzIgfCBUX18xMzMgfCBUX18xMzQgfCBUX18xMzUgfCBUX18xMzYgfCBUX18xMzcgfCBUX18xMzggfCBUX18xMzkgfCBUX18xNDAgfCBUX18xNDEgfCBUX18xNDIgfCBUX18xNDMgfCBUX18xNDQgfCBUX18xNDUgfCBUX18xNDYgfCBUX18xNDcgfCBUX18xNDggfCBUX18xNDkgfCBUX18xNTAgfCBUX18xNTEgfCBUX18xNTIgfCBUX18xNTMgfCBUX18xNTQgfCBSVUxFX0hFWCB8IFJVTEVfSU5UIHwgUlVMRV9ERUNJTUFMIHwgUlVMRV9JRCB8IFJVTEVfU1RSSU5HIHwgUlVMRV9NTF9DT01NRU5UIHwgUlVMRV9TTF9DT01NRU5UIHwgUlVMRV9XUyB8IFJVTEVfQU5ZX09USEVSICk7IjsKKyAgICAgICAgICAgIHJldHVybiAiMToxOiBUb2tlbnMgOiAoIFRfXzEzIHwgVF9fMTQgfCBUX18xNSB8IFRfXzE2IHwgVF9fMTcgfCBUX18xOCB8IFRfXzE5IHwgVF9fMjAgfCBUX18yMSB8IFRfXzIyIHwgVF9fMjMgfCBUX18yNCB8IFRfXzI1IHwgVF9fMjYgfCBUX18yNyB8IFRfXzI4IHwgVF9fMjkgfCBUX18zMCB8IFRfXzMxIHwgVF9fMzIgfCBUX18zMyB8IFRfXzM0IHwgVF9fMzUgfCBUX18zNiB8IFRfXzM3IHwgVF9fMzggfCBUX18zOSB8IFRfXzQwIHwgVF9fNDEgfCBUX180MiB8IFRfXzQzIHwgVF9fNDQgfCBUX180NSB8IFRfXzQ2IHwgVF9fNDcgfCBUX180OCB8IFRfXzQ5IHwgVF9fNTAgfCBUX181MSB8IFRfXzUyIHwgVF9fNTMgfCBUX181NCB8IFRfXzU1IHwgVF9fNTYgfCBUX181NyB8IFRfXzU4IHwgVF9fNTkgfCBUX182MCB8IFRfXzYxIHwgVF9fNjIgfCBUX182MyB8IFRfXzY0IHwgVF9fNjUgfCBUX182NiB8IFRfXzY3IHwgVF9fNjggfCBUX182OSB8IFRfXzcwIHwgVF9fNzEgfCBUX183MiB8IFRfXzczIHwgVF9fNzQgfCBUX183NSB8IFRfXzc2IHwgVF9fNzcgfCBUX183OCB8IFRfXzc5IHwgVF9fODAgfCBUX184MSB8IFRfXzgyIHwgVF9fODMgfCBUX184NCB8IFRfXzg1IHwgVF9fODYgfCBUX184NyB8IFRfXzg4IHwgVF9fODkgfCBUX185MCB8IFRfXzkxIHwgVF9fOTIgfCBUX185MyB8IFRfXzk0IHwgVF9fOTUgfCBUX185NiB8IFRfXzk3IHwgVF9fOTggfCBUX185OSB8IFRfXzEwMCB8IFRfXzEwMSB8IFRfXzEwMiB8IFRfXzEwMyB8IFRfXzEwNCB8IFRfXzEwNSB8IFRfXzEwNiB8IFRfXzEwNyB8IFRfXzEwOCB8IFRfXzEwOSB8IFRfXzExMCB8IFRfXzExMSB8IFRfXzExMiB8IFRfXzExMyB8IFRfXzExNCB8IFRfXzExNSB8IFRfXzExNiB8IFRfXzExNyB8IFRfXzExOCB8IFRfXzExOSB8IFRfXzEyMCB8IFRfXzEyMSB8IFRfXzEyMiB8IFRfXzEyMyB8IFRfXzEyNCB8IFRfXzEyNSB8IFRfXzEyNiB8IFRfXzEyNyB8IFRfXzEyOCB8IFRfXzEyOSB8IFRfXzEzMCB8IFRfXzEzMSB8IFRfXzEzMiB8IFRfXzEzMyB8IFRfXzEzNCB8IFRfXzEzNSB8IFRfXzEzNiB8IFRfXzEzNyB8IFRfXzEzOCB8IFRfXzEzOSB8IFRfXzE0MCB8IFRfXzE0MSB8IFRfXzE0MiB8IFRfXzE0MyB8IFRfXzE0NCB8IFRfXzE0NSB8IFRfXzE0NiB8IFRfXzE0NyB8IFRfXzE0OCB8IFRfXzE0OSB8IFRfXzE1MCB8IFRfXzE1MSB8IFRfXzE1MiB8IFRfXzE1MyB8IFRfXzE1NCB8IFRfXzE1NSB8IFRfXzE1NiB8IFRfXzE1NyB8IFRfXzE1OCB8IFRfXzE1OSB8IFRfXzE2MCB8IFRfXzE2MSB8IFRfXzE2MiB8IFRfXzE2MyB8IFRfXzE2NCB8IFRfXzE2NSB8IFRfXzE2NiB8IFJVTEVfSEVYIHwgUlVMRV9JTlQgfCBSVUxFX0RFQ0lNQUwgfCBSVUxFX0lEIHwgUlVMRV9TVFJJTkcgfCBSVUxFX01MX0NPTU1FTlQgfCBSVUxFX1NMX0NPTU1FTlQgfCBSVUxFX1dTIHwgUlVMRV9BTllfT1RIRVIgKTsiOwogICAgICAgICB9CiAgICAgICAgIHB1YmxpYyBpbnQgc3BlY2lhbFN0YXRlVHJhbnNpdGlvbihpbnQgcywgSW50U3RyZWFtIF9pbnB1dCkgdGhyb3dzIE5vVmlhYmxlQWx0RXhjZXB0aW9uIHsKICAgICAgICAgICAgIEludFN0cmVhbSBpbnB1dCA9IF9pbnB1dDsKQEAgLTU4NDAsNzkgKzYyNjgsODEgQEAKIAogICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoIChMQTIxXzA9PSdhJykgKSB7cyA9IDIzO30KIAotICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoIChMQTIxXzA9PScuJykgKSB7cyA9IDI0O30KKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKCAoTEEyMV8wPT0naCcpICkge3MgPSAyNDt9CiAKLSAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKCAoTEEyMV8wPT0nKicpICkge3MgPSAyNTt9CisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICggKExBMjFfMD09Jy4nKSApIHtzID0gMjU7fQogCi0gICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICggKExBMjFfMD09JzsnKSApIHtzID0gMjY7fQorICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoIChMQTIxXzA9PScqJykgKSB7cyA9IDI2O30KIAotICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoIChMQTIxXzA9PSdAJykgKSB7cyA9IDI3O30KKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKCAoTEEyMV8wPT0nOycpICkge3MgPSAyNzt9CiAKLSAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKCAoTEEyMV8wPT0nKCcpICkge3MgPSAyODt9CisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICggKExBMjFfMD09J0AnKSApIHtzID0gMjg7fQogCi0gICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICggKExBMjFfMD09JywnKSApIHtzID0gMjk7fQorICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoIChMQTIxXzA9PScoJykgKSB7cyA9IDI5O30KIAotICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoIChMQTIxXzA9PScpJykgKSB7cyA9IDMwO30KKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKCAoTEEyMV8wPT0nLCcpICkge3MgPSAzMDt9CiAKLSAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKCAoTEEyMV8wPT0nPScpICkge3MgPSAzMTt9CisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICggKExBMjFfMD09JyknKSApIHtzID0gMzE7fQogCi0gICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICggKExBMjFfMD09JyMnKSApIHtzID0gMzI7fQorICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoIChMQTIxXzA9PSc9JykgKSB7cyA9IDMyO30KIAotICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoIChMQTIxXzA9PSdbJykgKSB7cyA9IDMzO30KKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKCAoTEEyMV8wPT0nIycpICkge3MgPSAzMzt9CiAKLSAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKCAoTEEyMV8wPT0nXScpICkge3MgPSAzNDt9CisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICggKExBMjFfMD09J1snKSApIHtzID0gMzQ7fQogCi0gICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICggKExBMjFfMD09JysnKSApIHtzID0gMzU7fQorICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoIChMQTIxXzA9PSddJykgKSB7cyA9IDM1O30KIAotICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoIChMQTIxXzA9PSctJykgKSB7cyA9IDM2O30KKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKCAoTEEyMV8wPT0nKycpICkge3MgPSAzNjt9CiAKLSAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKCAoTEEyMV8wPT0nLycpICkge3MgPSAzNzt9CisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICggKExBMjFfMD09Jy0nKSApIHtzID0gMzc7fQogCi0gICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICggKExBMjFfMD09JyUnKSApIHtzID0gMzg7fQorICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoIChMQTIxXzA9PScvJykgKSB7cyA9IDM4O30KIAotICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoIChMQTIxXzA9PSc8JykgKSB7cyA9IDM5O30KKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKCAoTEEyMV8wPT0nJScpICkge3MgPSAzOTt9CiAKLSAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKCAoTEEyMV8wPT0nPicpICkge3MgPSA0MDt9CisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICggKExBMjFfMD09JzwnKSApIHtzID0gNDA7fQogCi0gICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICggKExBMjFfMD09J3wnKSApIHtzID0gNDE7fQorICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoIChMQTIxXzA9PSc+JykgKSB7cyA9IDQxO30KIAotICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoIChMQTIxXzA9PScmJykgKSB7cyA9IDQyO30KKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKCAoTEEyMV8wPT0nfCcpICkge3MgPSA0Mjt9CiAKLSAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKCAoTEEyMV8wPT0nIScpICkge3MgPSA0Mzt9CisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICggKExBMjFfMD09JyYnKSApIHtzID0gNDM7fQogCi0gICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICggKExBMjFfMD09Jz8nKSApIHtzID0gNDQ7fQorICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoIChMQTIxXzA9PSchJykgKSB7cyA9IDQ0O30KIAotICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoIChMQTIxXzA9PSc6JykgKSB7cyA9IDQ1O30KKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKCAoTEEyMV8wPT0nPycpICkge3MgPSA0NTt9CiAKLSAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKCAoTEEyMV8wPT0naicpICkge3MgPSA0Njt9CisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICggKExBMjFfMD09JzonKSApIHtzID0gNDY7fQogCi0gICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICggKExBMjFfMD09J04nKSApIHtzID0gNDc7fQorICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoIChMQTIxXzA9PSdqJykgKSB7cyA9IDQ3O30KIAotICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoIChMQTIxXzA9PSdTJykgKSB7cyA9IDQ4O30KKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKCAoTEEyMV8wPT0nTicpICkge3MgPSA0ODt9CiAKLSAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKCAoTEEyMV8wPT0nVScpICkge3MgPSA0OTt9CisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICggKExBMjFfMD09J1MnKSApIHtzID0gNDk7fQogCi0gICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICggKExBMjFfMD09J0QnKSApIHtzID0gNTA7fQorICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoIChMQTIxXzA9PSdVJykgKSB7cyA9IDUwO30KIAotICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoIChMQTIxXzA9PSdNJykgKSB7cyA9IDUxO30KKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKCAoTEEyMV8wPT0nRCcpICkge3MgPSA1MTt9CiAKLSAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKCAoTEEyMV8wPT0nUicpICkge3MgPSA1Mjt9CisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICggKExBMjFfMD09J00nKSApIHtzID0gNTI7fQogCi0gICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICggKExBMjFfMD09JzAnKSApIHtzID0gNTM7fQorICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoIChMQTIxXzA9PSdSJykgKSB7cyA9IDUzO30KIAotICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoICgoTEEyMV8wPj0nMScgJiYgTEEyMV8wPD0nOScpKSApIHtzID0gNTQ7fQorICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoIChMQTIxXzA9PScwJykgKSB7cyA9IDU0O30KIAotICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoIChMQTIxXzA9PSdeJykgKSB7cyA9IDU1O30KKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKCAoKExBMjFfMD49JzEnICYmIExBMjFfMDw9JzknKSkgKSB7cyA9IDU1O30KIAotICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoIChMQTIxXzA9PSckJ3x8KExBMjFfMD49J0EnICYmIExBMjFfMDw9J0InKXx8KExBMjFfMD49J0YnICYmIExBMjFfMDw9J0wnKXx8KExBMjFfMD49J08nICYmIExBMjFfMDw9J1EnKXx8TEEyMV8wPT0nVCd8fChMQTIxXzA+PSdWJyAmJiBMQTIxXzA8PSdXJyl8fChMQTIxXzA+PSdZJyAmJiBMQTIxXzA8PSdaJyl8fExBMjFfMD09J18nfHxMQTIxXzA9PSdiJ3x8KExBMjFfMD49J2cnICYmIExBMjFfMDw9J2gnKXx8TEEyMV8wPT0ndSd8fChMQTIxXzA+PSd4JyAmJiBMQTIxXzA8PSd6JykpICkge3MgPSA1Njt9CisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICggKExBMjFfMD09J14nKSApIHtzID0gNTY7fQogCi0gICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICggKExBMjFfMD09J1wiJykgKSB7cyA9IDU3O30KKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKCAoTEEyMV8wPT0nJCd8fChMQTIxXzA+PSdBJyAmJiBMQTIxXzA8PSdCJyl8fChMQTIxXzA+PSdGJyAmJiBMQTIxXzA8PSdMJyl8fChMQTIxXzA+PSdPJyAmJiBMQTIxXzA8PSdRJyl8fExBMjFfMD09J1QnfHwoTEEyMV8wPj0nVicgJiYgTEEyMV8wPD0nVycpfHwoTEEyMV8wPj0nWScgJiYgTEEyMV8wPD0nWicpfHxMQTIxXzA9PSdfJ3x8TEEyMV8wPT0nYid8fExBMjFfMD09J2cnfHxMQTIxXzA9PSd1J3x8KExBMjFfMD49J3gnICYmIExBMjFfMDw9J3onKSkgKSB7cyA9IDU3O30KIAotICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoIChMQTIxXzA9PSdcJycpICkge3MgPSA1ODt9CisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICggKExBMjFfMD09J1wiJykgKSB7cyA9IDU4O30KIAotICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoICgoTEEyMV8wPj0nXHQnICYmIExBMjFfMDw9J1xuJyl8fExBMjFfMD09J1xyJ3x8TEEyMV8wPT0nICcpICkge3MgPSA1OTt9CisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICggKExBMjFfMD09J1wnJykgKSB7cyA9IDU5O30KIAotICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoICgoTEEyMV8wPj0nXHUwMDAwJyAmJiBMQTIxXzA8PSdcYicpfHwoTEEyMV8wPj0nXHUwMDBCJyAmJiBMQTIxXzA8PSdcZicpfHwoTEEyMV8wPj0nXHUwMDBFJyAmJiBMQTIxXzA8PSdcdTAwMUYnKXx8TEEyMV8wPT0nXFwnfHxMQTIxXzA9PSdgJ3x8KExBMjFfMD49J34nICYmIExBMjFfMDw9J1x1RkZGRicpKSApIHtzID0gNjA7fQorICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoICgoTEEyMV8wPj0nXHQnICYmIExBMjFfMDw9J1xuJyl8fExBMjFfMD09J1xyJ3x8TEEyMV8wPT0nICcpICkge3MgPSA2MDt9CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKCAoKExBMjFfMD49J1x1MDAwMCcgJiYgTEEyMV8wPD0nXGInKXx8KExBMjFfMD49J1x1MDAwQicgJiYgTEEyMV8wPD0nXGYnKXx8KExBMjFfMD49J1x1MDAwRScgJiYgTEEyMV8wPD0nXHUwMDFGJyl8fExBMjFfMD09J1xcJ3x8TEEyMV8wPT0nYCd8fChMQTIxXzA+PSd+JyAmJiBMQTIxXzA8PSdcdUZGRkYnKSkgKSB7cyA9IDYxO30KIAogICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCBzPj0wICkgcmV0dXJuIHM7CiAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLm9zYnAueHRleHQuZGF0YWludGVyY2hhbmdlL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9kYXRhaW50ZXJjaGFuZ2UvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsRGF0YURTTFBhcnNlci5qYXZhIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5kYXRhaW50ZXJjaGFuZ2Uvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2RhdGFpbnRlcmNoYW5nZS9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxEYXRhRFNMUGFyc2VyLmphdmEKaW5kZXggZWI0NGM1ZC4uMTAyNzUwNiAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5kYXRhaW50ZXJjaGFuZ2Uvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2RhdGFpbnRlcmNoYW5nZS9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxEYXRhRFNMUGFyc2VyLmphdmEKKysrIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5kYXRhaW50ZXJjaGFuZ2Uvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2RhdGFpbnRlcmNoYW5nZS9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxEYXRhRFNMUGFyc2VyLmphdmEKQEAgLTI1LDkgKzI1LDExIEBACiAgKiAgQ29weXJpZ2h0IChjKSAyMDExLCAyMDE2IC0gTG9ldHogR21iSCZDby5LRyAoNjkxMTUgSGVpZGVsYmVyZywgR2VybWFueSkgCiAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAqICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzICAgICAgICAgICAKLSAqICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgICAgICAgCisgKiAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSAyLjAgICAgICAgIAogICogIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0ICAgICAgICAgICAgICAgICAgCi0gKiAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAqICBodHRwczovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAqICBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgKiAgQ29udHJpYnV0b3JzOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICogCSAgIENocmlzdG9waGUgTG9ldHogKExvZXR6IEdtYkgmQ28uS0cpIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgpAQCAtMzgsNyArNDAsNyBAQAogQFN1cHByZXNzV2FybmluZ3MoImFsbCIpCiBwdWJsaWMgY2xhc3MgSW50ZXJuYWxEYXRhRFNMUGFyc2VyIGV4dGVuZHMgQWJzdHJhY3RJbnRlcm5hbEFudGxyUGFyc2VyIHsKICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZ1tdIHRva2VuTmFtZXMgPSBuZXcgU3RyaW5nW10gewotICAgICAgICAiPGludmFsaWQ+IiwgIjxFT1I+IiwgIjxET1dOPiIsICI8VVA+IiwgIlJVTEVfU1RSSU5HIiwgIlJVTEVfSU5UIiwgIlJVTEVfSUQiLCAiUlVMRV9IRVgiLCAiUlVMRV9ERUNJTUFMIiwgIlJVTEVfTUxfQ09NTUVOVCIsICJSVUxFX1NMX0NPTU1FTlQiLCAiUlVMRV9XUyIsICJSVUxFX0FOWV9PVEhFUiIsICIncGFja2FnZSciLCAiJ3RpdGxlJyIsICIneyciLCAiJ30nIiwgIidpbnRlcmNoYW5nZSciLCAiJ2Rlc2NyaWJlZEJ5JyIsICIndmVjdG9yTmFtZSciLCAiJ3JlcG9ydCciLCAiJ2VsZW1lbnRTaXplJyIsICInZmlsZSciLCAiJ3BhdGgnIiwgIidYTUwnIiwgIidtYXBCeUF0dHJpYnV0ZSciLCAiJ2VuY29kaW5nJyIsICInbG9jYWxlJyIsICInQ1NWJyIsICInZGVsaW1pdGVyJyIsICIncXVvdGVDaGFyYWN0ZXInIiwgIidza2lwTGluZXMnIiwgIidpbmRlbnQnIiwgIidFREknIiwgIidtYXBwaW5nTW9kZWwnIiwgIid2YWxpZGF0ZSciLCAiJ2VudGl0eSciLCAiJ25vZGVOYW1lJyIsICInY3JlYXRlT24nIiwgIidtYXJrZXInIiwgIidleHByZXNzaW9uJyIsICInbG9va3VwJyIsICInZm9ybWF0JyIsICInbWFwcGluZyciLCAiJ2tleXMnIiwgIidrZXknIiwgIidmb3InIiwgIidvbiciLCAiJ3dpdGgnIiwgIidjYWNoZVNpemUnIiwgIidtYXBUbyciLCAiJ2FsbG93Tm9SZXN1bHQnIiwgIidhbGxvd05vbnVuaXF1ZVJlc3VsdCciLCAiJ21hcmtlclBhdGgnIiwgIidtYXJrZXJFbnRpdHknIiwgIidtYXJrZWRCeSciLCAiJ2NvZGluZyciLCAiJ2NvcHknIiwgIidmcm9tJyIsICIncHJvcGVydHknIiwgIidhc3NpZ24nIiwgIidhcyciLCAiJ21hcCciLCAiJ3RvJyIsICInbWFwQmxvYiciLCAiJ2V4dGVuc2lvbiciLCAiJ21pbWVUeXBlJyIsICInLiciLCAiJ2ltcG9ydCciLCAiJ3N0YXRpYyciLCAiJyonIiwgIiducyciLCAiJzsnIiwgIidAJyIsICInKCciLCAiJywnIiwgIicpJyIsICInPSciLCAiJyMnIiwgIidbJyIsICInXSciLCAiJys9JyIsICInLT0nIiwgIicqPSciLCAiJy89JyIsICInJT0nIiwgIic8JyIsICInPiciLCAiJz49JyIsICInfHwnIiwgIicmJiciLCAiJz09JyIsICInIT0nIiwgIic9PT0nIiwgIichPT0nIiwgIidpbnN0YW5jZW9mJyIsICInLT4nIiwgIicuLjwnIiwgIicuLiciLCAiJz0+JyIsICInPD4nIiwgIic/OiciLCAiJysnIiwgIictJyIsICInKionIiwgIicvJyIsICInJSciLCAiJyEnIiwgIicrKyciLCAiJy0tJyIsICInOjonIiwgIic/LiciLCAiJ3wnIiwgIidpZiciLCAiJ2Vsc2UnIiwgIidzd2l0Y2gnIiwgIic6JyIsICInZGVmYXVsdCciLCAiJ2Nhc2UnIiwgIid3aGlsZSciLCAiJ2RvJyIsICIndmFyJyIsICIndmFsJyIsICInZXh0ZW5kcyciLCAiJ3N1cGVyJyIsICInbmV3JyIsICInZmFsc2UnIiwgIid0cnVlJyIsICInbnVsbCciLCAiJ3R5cGVvZiciLCAiJ3Rocm93JyIsICIncmV0dXJuJyIsICIndHJ5JyIsICInZmluYWxseSciLCAiJ3N5bmNocm9uaXplZCciLCAiJ2NhdGNoJyIsICInPyciLCAiJyYnIiwgIidwbGFpbiciLCAiJ2pwZyciLCAiJ3BuZyciLCAiJ21wZWcnIiwgIidvY3RldC1zdHJlYW0nIiwgIidwZGYnIiwgIidOb3dEYXRlJyIsICInU3RhcnREYXRlJyIsICInVW5pdmVyc2FsbHlVbmlxdWVJZGVudGlmaWVyJyIsICInRGF0ZSciLCAiJ01pbGxpc2Vjb25kcyciLCAiJ05hbm9zZWNvbmRzJyIsICInUmFuZG9tJyIsICInRXhlY3V0ZUNvbnRleHQnIiwgIidwZXJzaXN0JyIsICInbWVyZ2UnIiwgIidyZW1vdmUnIgorICAgICAgICAiPGludmFsaWQ+IiwgIjxFT1I+IiwgIjxET1dOPiIsICI8VVA+IiwgIlJVTEVfU1RSSU5HIiwgIlJVTEVfSU5UIiwgIlJVTEVfSUQiLCAiUlVMRV9IRVgiLCAiUlVMRV9ERUNJTUFMIiwgIlJVTEVfTUxfQ09NTUVOVCIsICJSVUxFX1NMX0NPTU1FTlQiLCAiUlVMRV9XUyIsICJSVUxFX0FOWV9PVEhFUiIsICIncGFja2FnZSciLCAiJ3RpdGxlJyIsICIneyciLCAiJ30nIiwgIidpbnRlcmNoYW5nZSciLCAiJ2Rlc2NyaWJlZEJ5JyIsICIndmVjdG9yTmFtZSciLCAiJ3JlcG9ydCciLCAiJ2VsZW1lbnRTaXplJyIsICInZGVsZXRlRmlsZUFmdGVySW1wb3J0JyIsICInZmlsZSciLCAiJ3BhdGgnIiwgIidYTUwnIiwgIidtYXBCeUF0dHJpYnV0ZSciLCAiJ2VuY29kaW5nJyIsICInbG9jYWxlJyIsICInQ1NWJyIsICInZGVsaW1pdGVyJyIsICIncXVvdGVDaGFyYWN0ZXInIiwgIidza2lwTGluZXMnIiwgIidpbmRlbnQnIiwgIidFREknIiwgIidtYXBwaW5nTW9kZWwnIiwgIid2YWxpZGF0ZSciLCAiJ2VudGl0eSciLCAiJ25vZGVOYW1lJyIsICInY3JlYXRlT24nIiwgIidsYXRlc3RJbXBvcnQnIiwgIidsYXRlc3RFeHBvcnQnIiwgIidleHByZXNzaW9uJyIsICInbG9va3VwJyIsICInZm9ybWF0JyIsICInZXhwb3NlJyIsICInbWFwcGluZyciLCAiJ2tleXMnIiwgIidleHBvcnRGaWx0ZXInIiwgIidrZXknIiwgIidmb3InIiwgIidvbiciLCAiJ3dpdGgnIiwgIidjYWNoZVNpemUnIiwgIidtYXBUbyciLCAiJ2FsbG93Tm9SZXN1bHQnIiwgIidhbGxvd05vbnVuaXF1ZVJlc3VsdCciLCAiJ21hcmtlclBhdGgnIiwgIidtYXJrZXJFbnRpdHknIiwgIidtYXJrZWRCeSciLCAiJ2NvZGluZyciLCAiJ2NvcHknIiwgIidmcm9tJyIsICIncHJvcGVydHknIiwgIidyZWYnIiwgIid3aGVyZSciLCAiJ2hpZGUnIiwgIidhc3NpZ24nIiwgIidhcyciLCAiJ21hcCciLCAiJ3RvJyIsICInbWFwQmxvYiciLCAiJ2V4dGVuc2lvbiciLCAiJ21pbWVUeXBlJyIsICInLiciLCAiJ2ltcG9ydCciLCAiJ3N0YXRpYyciLCAiJyonIiwgIiducyciLCAiJzsnIiwgIidAJyIsICInKCciLCAiJywnIiwgIicpJyIsICInPSciLCAiJyMnIiwgIidbJyIsICInXSciLCAiJys9JyIsICInLT0nIiwgIicqPSciLCAiJy89JyIsICInJT0nIiwgIic8JyIsICInPiciLCAiJz49JyIsICInfHwnIiwgIicmJiciLCAiJz09JyIsICInIT0nIiwgIic9PT0nIiwgIichPT0nIiwgIidpbnN0YW5jZW9mJyIsICInLT4nIiwgIicuLjwnIiwgIicuLiciLCAiJz0+JyIsICInPD4nIiwgIic/OiciLCAiJysnIiwgIictJyIsICInKionIiwgIicvJyIsICInJSciLCAiJyEnIiwgIicrKyciLCAiJy0tJyIsICInOjonIiwgIic/LiciLCAiJ3wnIiwgIidpZiciLCAiJ2Vsc2UnIiwgIidzd2l0Y2gnIiwgIic6JyIsICInZGVmYXVsdCciLCAiJ2Nhc2UnIiwgIid3aGlsZSciLCAiJ2RvJyIsICIndmFyJyIsICIndmFsJyIsICInZXh0ZW5kcyciLCAiJ3N1cGVyJyIsICInbmV3JyIsICInZmFsc2UnIiwgIid0cnVlJyIsICInbnVsbCciLCAiJ3R5cGVvZiciLCAiJ3Rocm93JyIsICIncmV0dXJuJyIsICIndHJ5JyIsICInZmluYWxseSciLCAiJ3N5bmNocm9uaXplZCciLCAiJ2NhdGNoJyIsICInPyciLCAiJyYnIiwgIidwbGFpbiciLCAiJ2pwZyciLCAiJ3BuZyciLCAiJ21wZWcnIiwgIidvY3RldC1zdHJlYW0nIiwgIidwZGYnIiwgIidOb3dEYXRlJyIsICInU3RhcnREYXRlJyIsICInVW5pdmVyc2FsbHlVbmlxdWVJZGVudGlmaWVyJyIsICInRGF0ZSciLCAiJ01pbGxpc2Vjb25kcyciLCAiJ05hbm9zZWNvbmRzJyIsICInUmFuZG9tJyIsICInRXhlY3V0ZUNvbnRleHQnIiwgIidwZXJzaXN0JyIsICInbWVyZ2UnIiwgIidyZW1vdmUnIiwgIic8PSciLCAiJ2lzbnVsbCciLCAiJ2lzbm90bnVsbCciLCAiJ2FuZCciLCAiJ29yJyIKICAgICB9OwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzE0ND0xNDQ7CiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fMTQzPTE0MzsKQEAgLTg2LDYgKzg4LDEzIEBACiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fMTI4PTEyODsKICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX182NT02NTsKICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX18xMjc9MTI3OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzE2Nj0xNjY7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fMTY1PTE2NTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX18xNjI9MTYyOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzE2MT0xNjE7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fMTY0PTE2NDsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX18xNjM9MTYzOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzE2MD0xNjA7CiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fMzc9Mzc7CiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fMzg9Mzg7CiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fMzk9Mzk7CkBAIC05MywxMCArMTAyLDE1IEBACiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fMzQ9MzQ7CiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fMzU9MzU7CiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fMzY9MzY7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fMTU5PTE1OTsKICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX18zMD0zMDsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX18xNTg9MTU4OwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzMxPTMxOwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzMyPTMyOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzE1NT0xNTU7CiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fMTU0PTE1NDsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX18xNTc9MTU3OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzE1Nj0xNTY7CiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fMTUxPTE1MTsKICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX18xNTA9MTUwOwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzE1Mz0xNTM7CkBAIC0yOTYsNyArMzEwLDcgQEAKICAgICAgICAgICAgIGludCBhbHQxPTI7CiAgICAgICAgICAgICBpbnQgTEExXzAgPSBpbnB1dC5MQSgxKTsKIAotICAgICAgICAgICAgaWYgKCAoTEExXzA9PTY4KSApIHsKKyAgICAgICAgICAgIGlmICggKExBMV8wPT03NSkgKSB7CiAgICAgICAgICAgICAgICAgYWx0MT0xOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgc3dpdGNoIChhbHQxKSB7CkBAIC03MjMsNyArNzM3LDcgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlRGF0YUludGVyY2hhbmdlIgotICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI0MzoxOiBydWxlRGF0YUludGVyY2hhbmdlIHJldHVybnMgW0VPYmplY3QgY3VycmVudD1udWxsXSA6ICggKCkgb3RoZXJsdl8xPSAnaW50ZXJjaGFuZ2UnICggKGx2X25hbWVfMl8wPSBydWxlVFJBTlNMQVRBQkxFSUQgKSApICggKCAobHZfZGVzY3JpcHRpb25fM18wPSAnZGVzY3JpYmVkQnknICkgKSAoIChsdl9kZXNjcmlwdGlvblZhbHVlXzRfMD0gcnVsZVRSQU5TTEFUQUJMRVNUUklORyApICkgKT8gKCAobHZfbW9kZV81XzA9IHJ1bGVFbnRpdHlNYW5hZ2VyTW9kZSApICkgKG90aGVybHZfNj0gJ3ZlY3Rvck5hbWUnICggKGx2X3ZlY3Rvck5hbWVfN18wPSBSVUxFX1NUUklORyApICkgKT8gKCAobHZfY3JlYXRlUmVwb3J0XzhfMD0gJ3JlcG9ydCcgKSApPyAob3RoZXJsdl85PSAnZWxlbWVudFNpemUnICggKGx2X2VsZW1lbnRTaXplXzEwXzA9IFJVTEVfSU5UICkgKSApPyBvdGhlcmx2XzExPSAnZmlsZScgKCAobHZfZmlsZUVuZHBvaW50XzEyXzA9IHJ1bGVEYXRhSW50ZXJjaGFuZ2VGaWxlICkgKSBvdGhlcmx2XzEzPSAncGF0aCcgb3RoZXJsdl8xND0gJ3snICggKGx2X3BhdGhfMTVfMD0gcnVsZURhdGFJbnRlcmNoYW5nZUJlYW4gKSApKiBvdGhlcmx2XzE2PSAnfScgKSA7CisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjQzOjE6IHJ1bGVEYXRhSW50ZXJjaGFuZ2UgcmV0dXJucyBbRU9iamVjdCBjdXJyZW50PW51bGxdIDogKCAoKSBvdGhlcmx2XzE9ICdpbnRlcmNoYW5nZScgKCAobHZfbmFtZV8yXzA9IHJ1bGVUUkFOU0xBVEFCTEVJRCApICkgKCAoIChsdl9kZXNjcmlwdGlvbl8zXzA9ICdkZXNjcmliZWRCeScgKSApICggKGx2X2Rlc2NyaXB0aW9uVmFsdWVfNF8wPSBydWxlVFJBTlNMQVRBQkxFU1RSSU5HICkgKSApPyAoIChsdl9tb2RlXzVfMD0gcnVsZUVudGl0eU1hbmFnZXJNb2RlICkgKSAob3RoZXJsdl82PSAndmVjdG9yTmFtZScgKCAobHZfdmVjdG9yTmFtZV83XzA9IFJVTEVfU1RSSU5HICkgKSApPyAoIChsdl9jcmVhdGVSZXBvcnRfOF8wPSAncmVwb3J0JyApICk/IChvdGhlcmx2Xzk9ICdlbGVtZW50U2l6ZScgKCAobHZfZWxlbWVudFNpemVfMTBfMD0gUlVMRV9JTlQgKSApICk/ICggKGx2X2RlbGV0ZUZpbGVBZnRlckltcG9ydF8xMV8wPSAnZGVsZXRlRmlsZUFmdGVySW1wb3J0JyApICk/IG90aGVybHZfMTI9ICdmaWxlJyAoIChsdl9maWxlRW5kcG9pbnRfMTNfMD0gcnVsZURhdGFJbnRlcmNoYW5nZUZpbGUgKSApIG90aGVybHZfMTQ9ICdwYXRoJyBvdGhlcmx2XzE1PSAneycgKCAobHZfcGF0aF8xNl8wPSBydWxlRGF0YUludGVyY2hhbmdlQmVhbiApICkqIG90aGVybHZfMTc9ICd9JyApIDsKICAgICBwdWJsaWMgZmluYWwgRU9iamVjdCBydWxlRGF0YUludGVyY2hhbmdlKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKICAgICAgICAgRU9iamVjdCBjdXJyZW50ID0gbnVsbDsKIApAQCAtNzM0LDMwICs3NDgsMzEgQEAKICAgICAgICAgVG9rZW4gbHZfY3JlYXRlUmVwb3J0XzhfMD1udWxsOwogICAgICAgICBUb2tlbiBvdGhlcmx2Xzk9bnVsbDsKICAgICAgICAgVG9rZW4gbHZfZWxlbWVudFNpemVfMTBfMD1udWxsOwotICAgICAgICBUb2tlbiBvdGhlcmx2XzExPW51bGw7Ci0gICAgICAgIFRva2VuIG90aGVybHZfMTM9bnVsbDsKKyAgICAgICAgVG9rZW4gbHZfZGVsZXRlRmlsZUFmdGVySW1wb3J0XzExXzA9bnVsbDsKKyAgICAgICAgVG9rZW4gb3RoZXJsdl8xMj1udWxsOwogICAgICAgICBUb2tlbiBvdGhlcmx2XzE0PW51bGw7Ci0gICAgICAgIFRva2VuIG90aGVybHZfMTY9bnVsbDsKKyAgICAgICAgVG9rZW4gb3RoZXJsdl8xNT1udWxsOworICAgICAgICBUb2tlbiBvdGhlcmx2XzE3PW51bGw7CiAgICAgICAgIEFudGxyRGF0YXR5cGVSdWxlVG9rZW4gbHZfbmFtZV8yXzAgPSBudWxsOwogCiAgICAgICAgIEFudGxyRGF0YXR5cGVSdWxlVG9rZW4gbHZfZGVzY3JpcHRpb25WYWx1ZV80XzAgPSBudWxsOwogCiAgICAgICAgIEVudW1lcmF0b3IgbHZfbW9kZV81XzAgPSBudWxsOwogCi0gICAgICAgIEVPYmplY3QgbHZfZmlsZUVuZHBvaW50XzEyXzAgPSBudWxsOworICAgICAgICBFT2JqZWN0IGx2X2ZpbGVFbmRwb2ludF8xM18wID0gbnVsbDsKIAotICAgICAgICBFT2JqZWN0IGx2X3BhdGhfMTVfMCA9IG51bGw7CisgICAgICAgIEVPYmplY3QgbHZfcGF0aF8xNl8wID0gbnVsbDsKIAogCiAKICAgICAgICAgCWVudGVyUnVsZSgpOwogCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNDk6MjogKCAoICgpIG90aGVybHZfMT0gJ2ludGVyY2hhbmdlJyAoIChsdl9uYW1lXzJfMD0gcnVsZVRSQU5TTEFUQUJMRUlEICkgKSAoICggKGx2X2Rlc2NyaXB0aW9uXzNfMD0gJ2Rlc2NyaWJlZEJ5JyApICkgKCAobHZfZGVzY3JpcHRpb25WYWx1ZV80XzA9IHJ1bGVUUkFOU0xBVEFCTEVTVFJJTkcgKSApICk/ICggKGx2X21vZGVfNV8wPSBydWxlRW50aXR5TWFuYWdlck1vZGUgKSApIChvdGhlcmx2XzY9ICd2ZWN0b3JOYW1lJyAoIChsdl92ZWN0b3JOYW1lXzdfMD0gUlVMRV9TVFJJTkcgKSApICk/ICggKGx2X2NyZWF0ZVJlcG9ydF84XzA9ICdyZXBvcnQnICkgKT8gKG90aGVybHZfOT0gJ2VsZW1lbnRTaXplJyAoIChsdl9lbGVtZW50U2l6ZV8xMF8wPSBSVUxFX0lOVCApICkgKT8gb3RoZXJsdl8xMT0gJ2ZpbGUnICggKGx2X2ZpbGVFbmRwb2ludF8xMl8wPSBydWxlRGF0YUludGVyY2hhbmdlRmlsZSApICkgb3RoZXJsdl8xMz0gJ3BhdGgnIG90aGVybHZfMTQ9ICd7JyAoIChsdl9wYXRoXzE1XzA9IHJ1bGVEYXRhSW50ZXJjaGFuZ2VCZWFuICkgKSogb3RoZXJsdl8xNj0gJ30nICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjUwOjI6ICggKCkgb3RoZXJsdl8xPSAnaW50ZXJjaGFuZ2UnICggKGx2X25hbWVfMl8wPSBydWxlVFJBTlNMQVRBQkxFSUQgKSApICggKCAobHZfZGVzY3JpcHRpb25fM18wPSAnZGVzY3JpYmVkQnknICkgKSAoIChsdl9kZXNjcmlwdGlvblZhbHVlXzRfMD0gcnVsZVRSQU5TTEFUQUJMRVNUUklORyApICkgKT8gKCAobHZfbW9kZV81XzA9IHJ1bGVFbnRpdHlNYW5hZ2VyTW9kZSApICkgKG90aGVybHZfNj0gJ3ZlY3Rvck5hbWUnICggKGx2X3ZlY3Rvck5hbWVfN18wPSBSVUxFX1NUUklORyApICkgKT8gKCAobHZfY3JlYXRlUmVwb3J0XzhfMD0gJ3JlcG9ydCcgKSApPyAob3RoZXJsdl85PSAnZWxlbWVudFNpemUnICggKGx2X2VsZW1lbnRTaXplXzEwXzA9IFJVTEVfSU5UICkgKSApPyBvdGhlcmx2XzExPSAnZmlsZScgKCAobHZfZmlsZUVuZHBvaW50XzEyXzA9IHJ1bGVEYXRhSW50ZXJjaGFuZ2VGaWxlICkgKSBvdGhlcmx2XzEzPSAncGF0aCcgb3RoZXJsdl8xND0gJ3snICggKGx2X3BhdGhfMTVfMD0gcnVsZURhdGFJbnRlcmNoYW5nZUJlYW4gKSApKiBvdGhlcmx2XzE2PSAnfScgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjQ5OjI6ICggKCAoKSBvdGhlcmx2XzE9ICdpbnRlcmNoYW5nZScgKCAobHZfbmFtZV8yXzA9IHJ1bGVUUkFOU0xBVEFCTEVJRCApICkgKCAoIChsdl9kZXNjcmlwdGlvbl8zXzA9ICdkZXNjcmliZWRCeScgKSApICggKGx2X2Rlc2NyaXB0aW9uVmFsdWVfNF8wPSBydWxlVFJBTlNMQVRBQkxFU1RSSU5HICkgKSApPyAoIChsdl9tb2RlXzVfMD0gcnVsZUVudGl0eU1hbmFnZXJNb2RlICkgKSAob3RoZXJsdl82PSAndmVjdG9yTmFtZScgKCAobHZfdmVjdG9yTmFtZV83XzA9IFJVTEVfU1RSSU5HICkgKSApPyAoIChsdl9jcmVhdGVSZXBvcnRfOF8wPSAncmVwb3J0JyApICk/IChvdGhlcmx2Xzk9ICdlbGVtZW50U2l6ZScgKCAobHZfZWxlbWVudFNpemVfMTBfMD0gUlVMRV9JTlQgKSApICk/ICggKGx2X2RlbGV0ZUZpbGVBZnRlckltcG9ydF8xMV8wPSAnZGVsZXRlRmlsZUFmdGVySW1wb3J0JyApICk/IG90aGVybHZfMTI9ICdmaWxlJyAoIChsdl9maWxlRW5kcG9pbnRfMTNfMD0gcnVsZURhdGFJbnRlcmNoYW5nZUZpbGUgKSApIG90aGVybHZfMTQ9ICdwYXRoJyBvdGhlcmx2XzE1PSAneycgKCAobHZfcGF0aF8xNl8wPSBydWxlRGF0YUludGVyY2hhbmdlQmVhbiApICkqIG90aGVybHZfMTc9ICd9JyApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI1MDoyOiAoICgpIG90aGVybHZfMT0gJ2ludGVyY2hhbmdlJyAoIChsdl9uYW1lXzJfMD0gcnVsZVRSQU5TTEFUQUJMRUlEICkgKSAoICggKGx2X2Rlc2NyaXB0aW9uXzNfMD0gJ2Rlc2NyaWJlZEJ5JyApICkgKCAobHZfZGVzY3JpcHRpb25WYWx1ZV80XzA9IHJ1bGVUUkFOU0xBVEFCTEVTVFJJTkcgKSApICk/ICggKGx2X21vZGVfNV8wPSBydWxlRW50aXR5TWFuYWdlck1vZGUgKSApIChvdGhlcmx2XzY9ICd2ZWN0b3JOYW1lJyAoIChsdl92ZWN0b3JOYW1lXzdfMD0gUlVMRV9TVFJJTkcgKSApICk/ICggKGx2X2NyZWF0ZVJlcG9ydF84XzA9ICdyZXBvcnQnICkgKT8gKG90aGVybHZfOT0gJ2VsZW1lbnRTaXplJyAoIChsdl9lbGVtZW50U2l6ZV8xMF8wPSBSVUxFX0lOVCApICkgKT8gKCAobHZfZGVsZXRlRmlsZUFmdGVySW1wb3J0XzExXzA9ICdkZWxldGVGaWxlQWZ0ZXJJbXBvcnQnICkgKT8gb3RoZXJsdl8xMj0gJ2ZpbGUnICggKGx2X2ZpbGVFbmRwb2ludF8xM18wPSBydWxlRGF0YUludGVyY2hhbmdlRmlsZSApICkgb3RoZXJsdl8xND0gJ3BhdGgnIG90aGVybHZfMTU9ICd7JyAoIChsdl9wYXRoXzE2XzA9IHJ1bGVEYXRhSW50ZXJjaGFuZ2VCZWFuICkgKSogb3RoZXJsdl8xNz0gJ30nICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI1MDoyOiAoICgpIG90aGVybHZfMT0gJ2ludGVyY2hhbmdlJyAoIChsdl9uYW1lXzJfMD0gcnVsZVRSQU5TTEFUQUJMRUlEICkgKSAoICggKGx2X2Rlc2NyaXB0aW9uXzNfMD0gJ2Rlc2NyaWJlZEJ5JyApICkgKCAobHZfZGVzY3JpcHRpb25WYWx1ZV80XzA9IHJ1bGVUUkFOU0xBVEFCTEVTVFJJTkcgKSApICk/ICggKGx2X21vZGVfNV8wPSBydWxlRW50aXR5TWFuYWdlck1vZGUgKSApIChvdGhlcmx2XzY9ICd2ZWN0b3JOYW1lJyAoIChsdl92ZWN0b3JOYW1lXzdfMD0gUlVMRV9TVFJJTkcgKSApICk/ICggKGx2X2NyZWF0ZVJlcG9ydF84XzA9ICdyZXBvcnQnICkgKT8gKG90aGVybHZfOT0gJ2VsZW1lbnRTaXplJyAoIChsdl9lbGVtZW50U2l6ZV8xMF8wPSBSVUxFX0lOVCApICkgKT8gb3RoZXJsdl8xMT0gJ2ZpbGUnICggKGx2X2ZpbGVFbmRwb2ludF8xMl8wPSBydWxlRGF0YUludGVyY2hhbmdlRmlsZSApICkgb3RoZXJsdl8xMz0gJ3BhdGgnIG90aGVybHZfMTQ9ICd7JyAoIChsdl9wYXRoXzE1XzA9IHJ1bGVEYXRhSW50ZXJjaGFuZ2VCZWFuICkgKSogb3RoZXJsdl8xNj0gJ30nICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI1MTozOiAoKSBvdGhlcmx2XzE9ICdpbnRlcmNoYW5nZScgKCAobHZfbmFtZV8yXzA9IHJ1bGVUUkFOU0xBVEFCTEVJRCApICkgKCAoIChsdl9kZXNjcmlwdGlvbl8zXzA9ICdkZXNjcmliZWRCeScgKSApICggKGx2X2Rlc2NyaXB0aW9uVmFsdWVfNF8wPSBydWxlVFJBTlNMQVRBQkxFU1RSSU5HICkgKSApPyAoIChsdl9tb2RlXzVfMD0gcnVsZUVudGl0eU1hbmFnZXJNb2RlICkgKSAob3RoZXJsdl82PSAndmVjdG9yTmFtZScgKCAobHZfdmVjdG9yTmFtZV83XzA9IFJVTEVfU1RSSU5HICkgKSApPyAoIChsdl9jcmVhdGVSZXBvcnRfOF8wPSAncmVwb3J0JyApICk/IChvdGhlcmx2Xzk9ICdlbGVtZW50U2l6ZScgKCAobHZfZWxlbWVudFNpemVfMTBfMD0gUlVMRV9JTlQgKSApICk/IG90aGVybHZfMTE9ICdmaWxlJyAoIChsdl9maWxlRW5kcG9pbnRfMTJfMD0gcnVsZURhdGFJbnRlcmNoYW5nZUZpbGUgKSApIG90aGVybHZfMTM9ICdwYXRoJyBvdGhlcmx2XzE0PSAneycgKCAobHZfcGF0aF8xNV8wPSBydWxlRGF0YUludGVyY2hhbmdlQmVhbiApICkqIG90aGVybHZfMTY9ICd9JworICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjUwOjI6ICggKCkgb3RoZXJsdl8xPSAnaW50ZXJjaGFuZ2UnICggKGx2X25hbWVfMl8wPSBydWxlVFJBTlNMQVRBQkxFSUQgKSApICggKCAobHZfZGVzY3JpcHRpb25fM18wPSAnZGVzY3JpYmVkQnknICkgKSAoIChsdl9kZXNjcmlwdGlvblZhbHVlXzRfMD0gcnVsZVRSQU5TTEFUQUJMRVNUUklORyApICkgKT8gKCAobHZfbW9kZV81XzA9IHJ1bGVFbnRpdHlNYW5hZ2VyTW9kZSApICkgKG90aGVybHZfNj0gJ3ZlY3Rvck5hbWUnICggKGx2X3ZlY3Rvck5hbWVfN18wPSBSVUxFX1NUUklORyApICkgKT8gKCAobHZfY3JlYXRlUmVwb3J0XzhfMD0gJ3JlcG9ydCcgKSApPyAob3RoZXJsdl85PSAnZWxlbWVudFNpemUnICggKGx2X2VsZW1lbnRTaXplXzEwXzA9IFJVTEVfSU5UICkgKSApPyAoIChsdl9kZWxldGVGaWxlQWZ0ZXJJbXBvcnRfMTFfMD0gJ2RlbGV0ZUZpbGVBZnRlckltcG9ydCcgKSApPyBvdGhlcmx2XzEyPSAnZmlsZScgKCAobHZfZmlsZUVuZHBvaW50XzEzXzA9IHJ1bGVEYXRhSW50ZXJjaGFuZ2VGaWxlICkgKSBvdGhlcmx2XzE0PSAncGF0aCcgb3RoZXJsdl8xNT0gJ3snICggKGx2X3BhdGhfMTZfMD0gcnVsZURhdGFJbnRlcmNoYW5nZUJlYW4gKSApKiBvdGhlcmx2XzE3PSAnfScgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjUxOjM6ICgpIG90aGVybHZfMT0gJ2ludGVyY2hhbmdlJyAoIChsdl9uYW1lXzJfMD0gcnVsZVRSQU5TTEFUQUJMRUlEICkgKSAoICggKGx2X2Rlc2NyaXB0aW9uXzNfMD0gJ2Rlc2NyaWJlZEJ5JyApICkgKCAobHZfZGVzY3JpcHRpb25WYWx1ZV80XzA9IHJ1bGVUUkFOU0xBVEFCTEVTVFJJTkcgKSApICk/ICggKGx2X21vZGVfNV8wPSBydWxlRW50aXR5TWFuYWdlck1vZGUgKSApIChvdGhlcmx2XzY9ICd2ZWN0b3JOYW1lJyAoIChsdl92ZWN0b3JOYW1lXzdfMD0gUlVMRV9TVFJJTkcgKSApICk/ICggKGx2X2NyZWF0ZVJlcG9ydF84XzA9ICdyZXBvcnQnICkgKT8gKG90aGVybHZfOT0gJ2VsZW1lbnRTaXplJyAoIChsdl9lbGVtZW50U2l6ZV8xMF8wPSBSVUxFX0lOVCApICkgKT8gKCAobHZfZGVsZXRlRmlsZUFmdGVySW1wb3J0XzExXzA9ICdkZWxldGVGaWxlQWZ0ZXJJbXBvcnQnICkgKT8gb3RoZXJsdl8xMj0gJ2ZpbGUnICggKGx2X2ZpbGVFbmRwb2ludF8xM18wPSBydWxlRGF0YUludGVyY2hhbmdlRmlsZSApICkgb3RoZXJsdl8xND0gJ3BhdGgnIG90aGVybHZfMTU9ICd7JyAoIChsdl9wYXRoXzE2XzA9IHJ1bGVEYXRhSW50ZXJjaGFuZ2VCZWFuICkgKSogb3RoZXJsdl8xNz0gJ30nCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNTE6MzogKCkKICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI1Mjo0OiAKQEAgLTEwNjksMjUgKzEwODQsNjIgQEAKIAogICAgICAgICAgICAgfQogCi0gICAgICAgICAgICBvdGhlcmx2XzExPShUb2tlbiltYXRjaChpbnB1dCwyMixGT0xMT1dfMTUpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gY3VycmVudDsKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjM5NzozOiAoIChsdl9kZWxldGVGaWxlQWZ0ZXJJbXBvcnRfMTFfMD0gJ2RlbGV0ZUZpbGVBZnRlckltcG9ydCcgKSApPworICAgICAgICAgICAgaW50IGFsdDk9MjsKKyAgICAgICAgICAgIGludCBMQTlfMCA9IGlucHV0LkxBKDEpOworCisgICAgICAgICAgICBpZiAoIChMQTlfMD09MjIpICkgeworICAgICAgICAgICAgICAgIGFsdDk9MTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHN3aXRjaCAoYWx0OSkgeworICAgICAgICAgICAgICAgIGNhc2UgMSA6CisgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjM5ODo0OiAobHZfZGVsZXRlRmlsZUFmdGVySW1wb3J0XzExXzA9ICdkZWxldGVGaWxlQWZ0ZXJJbXBvcnQnICkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzozOTg6NDogKGx2X2RlbGV0ZUZpbGVBZnRlckltcG9ydF8xMV8wPSAnZGVsZXRlRmlsZUFmdGVySW1wb3J0JyApCisgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjM5OTo1OiBsdl9kZWxldGVGaWxlQWZ0ZXJJbXBvcnRfMTFfMD0gJ2RlbGV0ZUZpbGVBZnRlckltcG9ydCcKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBsdl9kZWxldGVGaWxlQWZ0ZXJJbXBvcnRfMTFfMD0oVG9rZW4pbWF0Y2goaW5wdXQsMjIsRk9MTE9XXzE1KTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7CisgICAgICAgICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworCisgICAgICAgICAgICAgICAgICAgICAgCQkJCQluZXdMZWFmTm9kZShsdl9kZWxldGVGaWxlQWZ0ZXJJbXBvcnRfMTFfMCwgZ3JhbW1hckFjY2Vzcy5nZXREYXRhSW50ZXJjaGFuZ2VBY2Nlc3MoKS5nZXREZWxldGVGaWxlQWZ0ZXJJbXBvcnREZWxldGVGaWxlQWZ0ZXJJbXBvcnRLZXl3b3JkXzhfMCgpKTsKKyAgICAgICAgICAgICAgICAgICAgICAJCQkJCisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisKKyAgICAgICAgICAgICAgICAgICAgICAJCQkJCWlmIChjdXJyZW50PT1udWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgCQkJCQkJY3VycmVudCA9IGNyZWF0ZU1vZGVsRWxlbWVudChncmFtbWFyQWNjZXNzLmdldERhdGFJbnRlcmNoYW5nZVJ1bGUoKSk7CisgICAgICAgICAgICAgICAgICAgICAgCQkJCQl9CisgICAgICAgICAgICAgICAgICAgICAgCQkJCQlzZXRXaXRoTGFzdENvbnN1bWVkKGN1cnJlbnQsICJkZWxldGVGaWxlQWZ0ZXJJbXBvcnQiLCB0cnVlLCAiZGVsZXRlRmlsZUFmdGVySW1wb3J0Iik7CisgICAgICAgICAgICAgICAgICAgICAgCQkJCQorICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBvdGhlcmx2XzEyPShUb2tlbiltYXRjaChpbnB1dCwyMyxGT0xMT1dfMTYpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gY3VycmVudDsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogCi0gICAgICAgICAgICAgIAkJCW5ld0xlYWZOb2RlKG90aGVybHZfMTEsIGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YUludGVyY2hhbmdlQWNjZXNzKCkuZ2V0RmlsZUtleXdvcmRfOCgpKTsKKyAgICAgICAgICAgICAgCQkJbmV3TGVhZk5vZGUob3RoZXJsdl8xMiwgZ3JhbW1hckFjY2Vzcy5nZXREYXRhSW50ZXJjaGFuZ2VBY2Nlc3MoKS5nZXRGaWxlS2V5d29yZF85KCkpOwogICAgICAgICAgICAgICAJCQogICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NDAxOjM6ICggKGx2X2ZpbGVFbmRwb2ludF8xMl8wPSBydWxlRGF0YUludGVyY2hhbmdlRmlsZSApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjQwMjo0OiAobHZfZmlsZUVuZHBvaW50XzEyXzA9IHJ1bGVEYXRhSW50ZXJjaGFuZ2VGaWxlICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjQxNTozOiAoIChsdl9maWxlRW5kcG9pbnRfMTNfMD0gcnVsZURhdGFJbnRlcmNoYW5nZUZpbGUgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo0MTY6NDogKGx2X2ZpbGVFbmRwb2ludF8xM18wPSBydWxlRGF0YUludGVyY2hhbmdlRmlsZSApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo0MDI6NDogKGx2X2ZpbGVFbmRwb2ludF8xMl8wPSBydWxlRGF0YUludGVyY2hhbmdlRmlsZSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo0MDM6NTogbHZfZmlsZUVuZHBvaW50XzEyXzA9IHJ1bGVEYXRhSW50ZXJjaGFuZ2VGaWxlCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo0MTY6NDogKGx2X2ZpbGVFbmRwb2ludF8xM18wPSBydWxlRGF0YUludGVyY2hhbmdlRmlsZSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo0MTc6NTogbHZfZmlsZUVuZHBvaW50XzEzXzA9IHJ1bGVEYXRhSW50ZXJjaGFuZ2VGaWxlCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKIAotICAgICAgICAgICAgICAJCQkJCW5ld0NvbXBvc2l0ZU5vZGUoZ3JhbW1hckFjY2Vzcy5nZXREYXRhSW50ZXJjaGFuZ2VBY2Nlc3MoKS5nZXRGaWxlRW5kcG9pbnREYXRhSW50ZXJjaGFuZ2VGaWxlUGFyc2VyUnVsZUNhbGxfOV8wKCkpOworICAgICAgICAgICAgICAJCQkJCW5ld0NvbXBvc2l0ZU5vZGUoZ3JhbW1hckFjY2Vzcy5nZXREYXRhSW50ZXJjaGFuZ2VBY2Nlc3MoKS5nZXRGaWxlRW5kcG9pbnREYXRhSW50ZXJjaGFuZ2VGaWxlUGFyc2VyUnVsZUNhbGxfMTBfMCgpKTsKICAgICAgICAgICAgICAgCQkJCQogICAgICAgICAgICAgfQotICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMTYpOwotICAgICAgICAgICAgbHZfZmlsZUVuZHBvaW50XzEyXzA9cnVsZURhdGFJbnRlcmNoYW5nZUZpbGUoKTsKKyAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzE3KTsKKyAgICAgICAgICAgIGx2X2ZpbGVFbmRwb2ludF8xM18wPXJ1bGVEYXRhSW50ZXJjaGFuZ2VGaWxlKCk7CiAKICAgICAgICAgICAgIHN0YXRlLl9mc3AtLTsKICAgICAgICAgICAgIGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OwpAQCAtMTA5OSw3ICsxMTUxLDcgQEAKICAgICAgICAgICAgICAgCQkJCQlzZXQoCiAgICAgICAgICAgICAgIAkJCQkJCWN1cnJlbnQsCiAgICAgICAgICAgICAgIAkJCQkJCSJmaWxlRW5kcG9pbnQiLAotICAgICAgICAgICAgICAJCQkJCQlsdl9maWxlRW5kcG9pbnRfMTJfMCwKKyAgICAgICAgICAgICAgCQkJCQkJbHZfZmlsZUVuZHBvaW50XzEzXzAsCiAgICAgICAgICAgICAgIAkJCQkJCSJvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmRhdGFpbnRlcmNoYW5nZS5EYXRhRFNMLkRhdGFJbnRlcmNoYW5nZUZpbGUiKTsKICAgICAgICAgICAgICAgCQkJCQlhZnRlclBhcnNlck9yRW51bVJ1bGVDYWxsKCk7CiAgICAgICAgICAgICAgIAkJCQkKQEAgLTExMTAsNDMgKzExNjIsNDMgQEAKIAogICAgICAgICAgICAgfQogCi0gICAgICAgICAgICBvdGhlcmx2XzEzPShUb2tlbiltYXRjaChpbnB1dCwyMyxGT0xMT1dfMTcpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gY3VycmVudDsKKyAgICAgICAgICAgIG90aGVybHZfMTQ9KFRva2VuKW1hdGNoKGlucHV0LDI0LEZPTExPV18xOCk7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OwogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAKLSAgICAgICAgICAgICAgCQkJbmV3TGVhZk5vZGUob3RoZXJsdl8xMywgZ3JhbW1hckFjY2Vzcy5nZXREYXRhSW50ZXJjaGFuZ2VBY2Nlc3MoKS5nZXRQYXRoS2V5d29yZF8xMCgpKTsKKyAgICAgICAgICAgICAgCQkJbmV3TGVhZk5vZGUob3RoZXJsdl8xNCwgZ3JhbW1hckFjY2Vzcy5nZXREYXRhSW50ZXJjaGFuZ2VBY2Nlc3MoKS5nZXRQYXRoS2V5d29yZF8xMSgpKTsKICAgICAgICAgICAgICAgCQkKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG90aGVybHZfMTQ9KFRva2VuKW1hdGNoKGlucHV0LDE1LEZPTExPV18xOCk7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OworICAgICAgICAgICAgb3RoZXJsdl8xNT0oVG9rZW4pbWF0Y2goaW5wdXQsMTUsRk9MTE9XXzE5KTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKIAotICAgICAgICAgICAgICAJCQluZXdMZWFmTm9kZShvdGhlcmx2XzE0LCBncmFtbWFyQWNjZXNzLmdldERhdGFJbnRlcmNoYW5nZUFjY2VzcygpLmdldExlZnRDdXJseUJyYWNrZXRLZXl3b3JkXzExKCkpOworICAgICAgICAgICAgICAJCQluZXdMZWFmTm9kZShvdGhlcmx2XzE1LCBncmFtbWFyQWNjZXNzLmdldERhdGFJbnRlcmNoYW5nZUFjY2VzcygpLmdldExlZnRDdXJseUJyYWNrZXRLZXl3b3JkXzEyKCkpOwogICAgICAgICAgICAgICAJCQogICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NDI4OjM6ICggKGx2X3BhdGhfMTVfMD0gcnVsZURhdGFJbnRlcmNoYW5nZUJlYW4gKSApKgotICAgICAgICAgICAgbG9vcDk6CisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo0NDI6MzogKCAobHZfcGF0aF8xNl8wPSBydWxlRGF0YUludGVyY2hhbmdlQmVhbiApICkqCisgICAgICAgICAgICBsb29wMTA6CiAgICAgICAgICAgICBkbyB7Ci0gICAgICAgICAgICAgICAgaW50IGFsdDk9MjsKLSAgICAgICAgICAgICAgICBpbnQgTEE5XzAgPSBpbnB1dC5MQSgxKTsKKyAgICAgICAgICAgICAgICBpbnQgYWx0MTA9MjsKKyAgICAgICAgICAgICAgICBpbnQgTEExMF8wID0gaW5wdXQuTEEoMSk7CiAKLSAgICAgICAgICAgICAgICBpZiAoIChMQTlfMD09MzYpICkgewotICAgICAgICAgICAgICAgICAgICBhbHQ5PTE7CisgICAgICAgICAgICAgICAgaWYgKCAoTEExMF8wPT0zNykgKSB7CisgICAgICAgICAgICAgICAgICAgIGFsdDEwPTE7CiAgICAgICAgICAgICAgICAgfQogCiAKLSAgICAgICAgICAgICAgICBzd2l0Y2ggKGFsdDkpIHsKKyAgICAgICAgICAgICAgICBzd2l0Y2ggKGFsdDEwKSB7CiAgICAgICAgICAgICAJY2FzZSAxIDoKLSAgICAgICAgICAgIAkgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NDI5OjQ6IChsdl9wYXRoXzE1XzA9IHJ1bGVEYXRhSW50ZXJjaGFuZ2VCZWFuICkKKyAgICAgICAgICAgIAkgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NDQzOjQ6IChsdl9wYXRoXzE2XzA9IHJ1bGVEYXRhSW50ZXJjaGFuZ2VCZWFuICkKICAgICAgICAgICAgIAkgICAgewotICAgICAgICAgICAgCSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo0Mjk6NDogKGx2X3BhdGhfMTVfMD0gcnVsZURhdGFJbnRlcmNoYW5nZUJlYW4gKQotICAgICAgICAgICAgCSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo0MzA6NTogbHZfcGF0aF8xNV8wPSBydWxlRGF0YUludGVyY2hhbmdlQmVhbgorICAgICAgICAgICAgCSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo0NDM6NDogKGx2X3BhdGhfMTZfMD0gcnVsZURhdGFJbnRlcmNoYW5nZUJlYW4gKQorICAgICAgICAgICAgCSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo0NDQ6NTogbHZfcGF0aF8xNl8wPSBydWxlRGF0YUludGVyY2hhbmdlQmVhbgogICAgICAgICAgICAgCSAgICB7CiAgICAgICAgICAgICAJICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogCi0gICAgICAgICAgICAJICAgICAgCQkJCQluZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YUludGVyY2hhbmdlQWNjZXNzKCkuZ2V0UGF0aERhdGFJbnRlcmNoYW5nZUJlYW5QYXJzZXJSdWxlQ2FsbF8xMl8wKCkpOworICAgICAgICAgICAgCSAgICAgIAkJCQkJbmV3Q29tcG9zaXRlTm9kZShncmFtbWFyQWNjZXNzLmdldERhdGFJbnRlcmNoYW5nZUFjY2VzcygpLmdldFBhdGhEYXRhSW50ZXJjaGFuZ2VCZWFuUGFyc2VyUnVsZUNhbGxfMTNfMCgpKTsKICAgICAgICAgICAgIAkgICAgICAJCQkJCiAgICAgICAgICAgICAJICAgIH0KLSAgICAgICAgICAgIAkgICAgcHVzaEZvbGxvdyhGT0xMT1dfMTgpOwotICAgICAgICAgICAgCSAgICBsdl9wYXRoXzE1XzA9cnVsZURhdGFJbnRlcmNoYW5nZUJlYW4oKTsKKyAgICAgICAgICAgIAkgICAgcHVzaEZvbGxvdyhGT0xMT1dfMTkpOworICAgICAgICAgICAgCSAgICBsdl9wYXRoXzE2XzA9cnVsZURhdGFJbnRlcmNoYW5nZUJlYW4oKTsKIAogICAgICAgICAgICAgCSAgICBzdGF0ZS5fZnNwLS07CiAgICAgICAgICAgICAJICAgIGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OwpAQCAtMTE1OCw3ICsxMjEwLDcgQEAKICAgICAgICAgICAgIAkgICAgICAJCQkJCWFkZCgKICAgICAgICAgICAgIAkgICAgICAJCQkJCQljdXJyZW50LAogICAgICAgICAgICAgCSAgICAgIAkJCQkJCSJwYXRoIiwKLSAgICAgICAgICAgIAkgICAgICAJCQkJCQlsdl9wYXRoXzE1XzAsCisgICAgICAgICAgICAJICAgICAgCQkJCQkJbHZfcGF0aF8xNl8wLAogICAgICAgICAgICAgCSAgICAgIAkJCQkJCSJvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmRhdGFpbnRlcmNoYW5nZS5EYXRhRFNMLkRhdGFJbnRlcmNoYW5nZUJlYW4iKTsKICAgICAgICAgICAgIAkgICAgICAJCQkJCWFmdGVyUGFyc2VyT3JFbnVtUnVsZUNhbGwoKTsKICAgICAgICAgICAgIAkgICAgICAJCQkJCkBAIC0xMTcxLDE0ICsxMjIzLDE0IEBACiAgICAgICAgICAgICAJICAgIGJyZWFrOwogCiAgICAgICAgICAgICAJZGVmYXVsdCA6Ci0gICAgICAgICAgICAJICAgIGJyZWFrIGxvb3A5OworICAgICAgICAgICAgCSAgICBicmVhayBsb29wMTA7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfSB3aGlsZSAodHJ1ZSk7CiAKLSAgICAgICAgICAgIG90aGVybHZfMTY9KFRva2VuKW1hdGNoKGlucHV0LDE2LEZPTExPV18yKTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7CisgICAgICAgICAgICBvdGhlcmx2XzE3PShUb2tlbiltYXRjaChpbnB1dCwxNixGT0xMT1dfMik7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OwogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAKLSAgICAgICAgICAgICAgCQkJbmV3TGVhZk5vZGUob3RoZXJsdl8xNiwgZ3JhbW1hckFjY2Vzcy5nZXREYXRhSW50ZXJjaGFuZ2VBY2Nlc3MoKS5nZXRSaWdodEN1cmx5QnJhY2tldEtleXdvcmRfMTMoKSk7CisgICAgICAgICAgICAgIAkJCW5ld0xlYWZOb2RlKG90aGVybHZfMTcsIGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YUludGVyY2hhbmdlQWNjZXNzKCkuZ2V0UmlnaHRDdXJseUJyYWNrZXRLZXl3b3JkXzE0KCkpOwogICAgICAgICAgICAgICAJCQogICAgICAgICAgICAgfQogCkBAIC0xMjA2LDcgKzEyNTgsNyBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgImVudHJ5UnVsZURhdGFJbnRlcmNoYW5nZUZpbGUiCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NDU1OjE6IGVudHJ5UnVsZURhdGFJbnRlcmNoYW5nZUZpbGUgcmV0dXJucyBbRU9iamVjdCBjdXJyZW50PW51bGxdIDogaXZfcnVsZURhdGFJbnRlcmNoYW5nZUZpbGU9IHJ1bGVEYXRhSW50ZXJjaGFuZ2VGaWxlIEVPRiA7CisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NDY5OjE6IGVudHJ5UnVsZURhdGFJbnRlcmNoYW5nZUZpbGUgcmV0dXJucyBbRU9iamVjdCBjdXJyZW50PW51bGxdIDogaXZfcnVsZURhdGFJbnRlcmNoYW5nZUZpbGU9IHJ1bGVEYXRhSW50ZXJjaGFuZ2VGaWxlIEVPRiA7CiAgICAgcHVibGljIGZpbmFsIEVPYmplY3QgZW50cnlSdWxlRGF0YUludGVyY2hhbmdlRmlsZSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAgICAgICAgIEVPYmplY3QgY3VycmVudCA9IG51bGw7CiAKQEAgLTEyMTQsOCArMTI2Niw4IEBACiAKIAogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NDU1OjYwOiAoaXZfcnVsZURhdGFJbnRlcmNoYW5nZUZpbGU9IHJ1bGVEYXRhSW50ZXJjaGFuZ2VGaWxlIEVPRiApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo0NTY6MjogaXZfcnVsZURhdGFJbnRlcmNoYW5nZUZpbGU9IHJ1bGVEYXRhSW50ZXJjaGFuZ2VGaWxlIEVPRgorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NDY5OjYwOiAoaXZfcnVsZURhdGFJbnRlcmNoYW5nZUZpbGU9IHJ1bGVEYXRhSW50ZXJjaGFuZ2VGaWxlIEVPRiApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo0NzA6MjogaXZfcnVsZURhdGFJbnRlcmNoYW5nZUZpbGU9IHJ1bGVEYXRhSW50ZXJjaGFuZ2VGaWxlIEVPRgogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBuZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YUludGVyY2hhbmdlRmlsZVJ1bGUoKSk7IApAQCAtMTI0Niw3ICsxMjk4LDcgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlRGF0YUludGVyY2hhbmdlRmlsZSIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo0NjI6MTogcnVsZURhdGFJbnRlcmNoYW5nZUZpbGUgcmV0dXJucyBbRU9iamVjdCBjdXJyZW50PW51bGxdIDogKHRoaXNfRGF0YUludGVyY2hhbmdlRmlsZVhNTF8wPSBydWxlRGF0YUludGVyY2hhbmdlRmlsZVhNTCB8IHRoaXNfRGF0YUludGVyY2hhbmdlRmlsZUNTVl8xPSBydWxlRGF0YUludGVyY2hhbmdlRmlsZUNTViB8IHRoaXNfRGF0YUludGVyY2hhbmdlRmlsZUVESV8yPSBydWxlRGF0YUludGVyY2hhbmdlRmlsZUVESSApIDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo0NzY6MTogcnVsZURhdGFJbnRlcmNoYW5nZUZpbGUgcmV0dXJucyBbRU9iamVjdCBjdXJyZW50PW51bGxdIDogKHRoaXNfRGF0YUludGVyY2hhbmdlRmlsZVhNTF8wPSBydWxlRGF0YUludGVyY2hhbmdlRmlsZVhNTCB8IHRoaXNfRGF0YUludGVyY2hhbmdlRmlsZUNTVl8xPSBydWxlRGF0YUludGVyY2hhbmdlRmlsZUNTViB8IHRoaXNfRGF0YUludGVyY2hhbmdlRmlsZUVESV8yPSBydWxlRGF0YUludGVyY2hhbmdlRmlsZUVESSApIDsKICAgICBwdWJsaWMgZmluYWwgRU9iamVjdCBydWxlRGF0YUludGVyY2hhbmdlRmlsZSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAgICAgICAgIEVPYmplY3QgY3VycmVudCA9IG51bGw7CiAKQEAgLTEyNjEsMzggKzEzMTMsMzggQEAKICAgICAgICAgCWVudGVyUnVsZSgpOwogCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo0Njg6MjogKCAodGhpc19EYXRhSW50ZXJjaGFuZ2VGaWxlWE1MXzA9IHJ1bGVEYXRhSW50ZXJjaGFuZ2VGaWxlWE1MIHwgdGhpc19EYXRhSW50ZXJjaGFuZ2VGaWxlQ1NWXzE9IHJ1bGVEYXRhSW50ZXJjaGFuZ2VGaWxlQ1NWIHwgdGhpc19EYXRhSW50ZXJjaGFuZ2VGaWxlRURJXzI9IHJ1bGVEYXRhSW50ZXJjaGFuZ2VGaWxlRURJICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NDY5OjI6ICh0aGlzX0RhdGFJbnRlcmNoYW5nZUZpbGVYTUxfMD0gcnVsZURhdGFJbnRlcmNoYW5nZUZpbGVYTUwgfCB0aGlzX0RhdGFJbnRlcmNoYW5nZUZpbGVDU1ZfMT0gcnVsZURhdGFJbnRlcmNoYW5nZUZpbGVDU1YgfCB0aGlzX0RhdGFJbnRlcmNoYW5nZUZpbGVFRElfMj0gcnVsZURhdGFJbnRlcmNoYW5nZUZpbGVFREkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NDgyOjI6ICggKHRoaXNfRGF0YUludGVyY2hhbmdlRmlsZVhNTF8wPSBydWxlRGF0YUludGVyY2hhbmdlRmlsZVhNTCB8IHRoaXNfRGF0YUludGVyY2hhbmdlRmlsZUNTVl8xPSBydWxlRGF0YUludGVyY2hhbmdlRmlsZUNTViB8IHRoaXNfRGF0YUludGVyY2hhbmdlRmlsZUVESV8yPSBydWxlRGF0YUludGVyY2hhbmdlRmlsZUVESSApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjQ4MzoyOiAodGhpc19EYXRhSW50ZXJjaGFuZ2VGaWxlWE1MXzA9IHJ1bGVEYXRhSW50ZXJjaGFuZ2VGaWxlWE1MIHwgdGhpc19EYXRhSW50ZXJjaGFuZ2VGaWxlQ1NWXzE9IHJ1bGVEYXRhSW50ZXJjaGFuZ2VGaWxlQ1NWIHwgdGhpc19EYXRhSW50ZXJjaGFuZ2VGaWxlRURJXzI9IHJ1bGVEYXRhSW50ZXJjaGFuZ2VGaWxlRURJICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjQ2OToyOiAodGhpc19EYXRhSW50ZXJjaGFuZ2VGaWxlWE1MXzA9IHJ1bGVEYXRhSW50ZXJjaGFuZ2VGaWxlWE1MIHwgdGhpc19EYXRhSW50ZXJjaGFuZ2VGaWxlQ1NWXzE9IHJ1bGVEYXRhSW50ZXJjaGFuZ2VGaWxlQ1NWIHwgdGhpc19EYXRhSW50ZXJjaGFuZ2VGaWxlRURJXzI9IHJ1bGVEYXRhSW50ZXJjaGFuZ2VGaWxlRURJICkKLSAgICAgICAgICAgIGludCBhbHQxMD0zOworICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NDgzOjI6ICh0aGlzX0RhdGFJbnRlcmNoYW5nZUZpbGVYTUxfMD0gcnVsZURhdGFJbnRlcmNoYW5nZUZpbGVYTUwgfCB0aGlzX0RhdGFJbnRlcmNoYW5nZUZpbGVDU1ZfMT0gcnVsZURhdGFJbnRlcmNoYW5nZUZpbGVDU1YgfCB0aGlzX0RhdGFJbnRlcmNoYW5nZUZpbGVFRElfMj0gcnVsZURhdGFJbnRlcmNoYW5nZUZpbGVFREkgKQorICAgICAgICAgICAgaW50IGFsdDExPTM7CiAgICAgICAgICAgICBzd2l0Y2ggKCBpbnB1dC5MQSgxKSApIHsKLSAgICAgICAgICAgIGNhc2UgMjQ6CisgICAgICAgICAgICBjYXNlIDI1OgogICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBhbHQxMD0xOworICAgICAgICAgICAgICAgIGFsdDExPTE7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSAyODoKKyAgICAgICAgICAgIGNhc2UgMjk6CiAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGFsdDEwPTI7CisgICAgICAgICAgICAgICAgYWx0MTE9MjsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIDMzOgorICAgICAgICAgICAgY2FzZSAzNDoKICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgYWx0MTA9MzsKKyAgICAgICAgICAgICAgICBhbHQxMT0zOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICAgICAgaWYgKHN0YXRlLmJhY2t0cmFja2luZz4wKSB7c3RhdGUuZmFpbGVkPXRydWU7IHJldHVybiBjdXJyZW50O30KICAgICAgICAgICAgICAgICBOb1ZpYWJsZUFsdEV4Y2VwdGlvbiBudmFlID0KLSAgICAgICAgICAgICAgICAgICAgbmV3IE5vVmlhYmxlQWx0RXhjZXB0aW9uKCIiLCAxMCwgMCwgaW5wdXQpOworICAgICAgICAgICAgICAgICAgICBuZXcgTm9WaWFibGVBbHRFeGNlcHRpb24oIiIsIDExLCAwLCBpbnB1dCk7CiAKICAgICAgICAgICAgICAgICB0aHJvdyBudmFlOwogICAgICAgICAgICAgfQogCi0gICAgICAgICAgICBzd2l0Y2ggKGFsdDEwKSB7CisgICAgICAgICAgICBzd2l0Y2ggKGFsdDExKSB7CiAgICAgICAgICAgICAgICAgY2FzZSAxIDoKLSAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NDcwOjM6IHRoaXNfRGF0YUludGVyY2hhbmdlRmlsZVhNTF8wPSBydWxlRGF0YUludGVyY2hhbmdlRmlsZVhNTAorICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo0ODQ6MzogdGhpc19EYXRhSW50ZXJjaGFuZ2VGaWxlWE1MXzA9IHJ1bGVEYXRhSW50ZXJjaGFuZ2VGaWxlWE1MCiAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAKQEAgLTEzMTQsNyArMTM2Niw3IEBACiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgY2FzZSAyIDoKLSAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NDc5OjM6IHRoaXNfRGF0YUludGVyY2hhbmdlRmlsZUNTVl8xPSBydWxlRGF0YUludGVyY2hhbmdlRmlsZUNTVgorICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo0OTM6MzogdGhpc19EYXRhSW50ZXJjaGFuZ2VGaWxlQ1NWXzE9IHJ1bGVEYXRhSW50ZXJjaGFuZ2VGaWxlQ1NWCiAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAKQEAgLTEzMzYsNyArMTM4OCw3IEBACiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgY2FzZSAzIDoKLSAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NDg4OjM6IHRoaXNfRGF0YUludGVyY2hhbmdlRmlsZUVESV8yPSBydWxlRGF0YUludGVyY2hhbmdlRmlsZUVESQorICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo1MDI6MzogdGhpc19EYXRhSW50ZXJjaGFuZ2VGaWxlRURJXzI9IHJ1bGVEYXRhSW50ZXJjaGFuZ2VGaWxlRURJCiAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAKQEAgLTEzODIsNyArMTQzNCw3IEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAiZW50cnlSdWxlRGF0YUludGVyY2hhbmdlRmlsZVhNTCIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo1MDA6MTogZW50cnlSdWxlRGF0YUludGVyY2hhbmdlRmlsZVhNTCByZXR1cm5zIFtFT2JqZWN0IGN1cnJlbnQ9bnVsbF0gOiBpdl9ydWxlRGF0YUludGVyY2hhbmdlRmlsZVhNTD0gcnVsZURhdGFJbnRlcmNoYW5nZUZpbGVYTUwgRU9GIDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo1MTQ6MTogZW50cnlSdWxlRGF0YUludGVyY2hhbmdlRmlsZVhNTCByZXR1cm5zIFtFT2JqZWN0IGN1cnJlbnQ9bnVsbF0gOiBpdl9ydWxlRGF0YUludGVyY2hhbmdlRmlsZVhNTD0gcnVsZURhdGFJbnRlcmNoYW5nZUZpbGVYTUwgRU9GIDsKICAgICBwdWJsaWMgZmluYWwgRU9iamVjdCBlbnRyeVJ1bGVEYXRhSW50ZXJjaGFuZ2VGaWxlWE1MKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKICAgICAgICAgRU9iamVjdCBjdXJyZW50ID0gbnVsbDsKIApAQCAtMTM5MCw4ICsxNDQyLDggQEAKIAogCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo1MDA6NjM6IChpdl9ydWxlRGF0YUludGVyY2hhbmdlRmlsZVhNTD0gcnVsZURhdGFJbnRlcmNoYW5nZUZpbGVYTUwgRU9GICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjUwMToyOiBpdl9ydWxlRGF0YUludGVyY2hhbmdlRmlsZVhNTD0gcnVsZURhdGFJbnRlcmNoYW5nZUZpbGVYTUwgRU9GCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo1MTQ6NjM6IChpdl9ydWxlRGF0YUludGVyY2hhbmdlRmlsZVhNTD0gcnVsZURhdGFJbnRlcmNoYW5nZUZpbGVYTUwgRU9GICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjUxNToyOiBpdl9ydWxlRGF0YUludGVyY2hhbmdlRmlsZVhNTD0gcnVsZURhdGFJbnRlcmNoYW5nZUZpbGVYTUwgRU9GCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIG5ld0NvbXBvc2l0ZU5vZGUoZ3JhbW1hckFjY2Vzcy5nZXREYXRhSW50ZXJjaGFuZ2VGaWxlWE1MUnVsZSgpKTsgCkBAIC0xNDIyLDcgKzE0NzQsNyBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVEYXRhSW50ZXJjaGFuZ2VGaWxlWE1MIgotICAgIC8vIEludGVybmFsRGF0YURTTC5nOjUwNzoxOiBydWxlRGF0YUludGVyY2hhbmdlRmlsZVhNTCByZXR1cm5zIFtFT2JqZWN0IGN1cnJlbnQ9bnVsbF0gOiAoICgpIG90aGVybHZfMT0gJ1hNTCcgKCAobHZfZmlsZVVSTF8yXzA9IFJVTEVfU1RSSU5HICkgKSAoICggKCAoICh7Li4ufT8gPT4gKCAoey4uLn0/ID0+ICggKGx2X2J5QXR0cmlidXRlXzRfMD0gJ21hcEJ5QXR0cmlidXRlJyApICkgKSApICkgfCAoey4uLn0/ID0+ICggKHsuLi59PyA9PiAob3RoZXJsdl81PSAnZW5jb2RpbmcnICggKGx2X2VuY29kaW5nXzZfMD0gUlVMRV9TVFJJTkcgKSApICkgKSApICkgfCAoey4uLn0/ID0+ICggKHsuLi59PyA9PiAob3RoZXJsdl83PSAnbG9jYWxlJyAoIChsdl9sb2NhbGVfOF8wPSBSVUxFX1NUUklORyApICkgKSApICkgKSApKiApICkgKSApIDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo1MjE6MTogcnVsZURhdGFJbnRlcmNoYW5nZUZpbGVYTUwgcmV0dXJucyBbRU9iamVjdCBjdXJyZW50PW51bGxdIDogKCAoKSBvdGhlcmx2XzE9ICdYTUwnICggKGx2X2ZpbGVVUkxfMl8wPSBSVUxFX1NUUklORyApICkgKCAoICggKCAoey4uLn0/ID0+ICggKHsuLi59PyA9PiAoIChsdl9ieUF0dHJpYnV0ZV80XzA9ICdtYXBCeUF0dHJpYnV0ZScgKSApICkgKSApIHwgKHsuLi59PyA9PiAoICh7Li4ufT8gPT4gKG90aGVybHZfNT0gJ2VuY29kaW5nJyAoIChsdl9lbmNvZGluZ182XzA9IFJVTEVfU1RSSU5HICkgKSApICkgKSApIHwgKHsuLi59PyA9PiAoICh7Li4ufT8gPT4gKG90aGVybHZfNz0gJ2xvY2FsZScgKCAobHZfbG9jYWxlXzhfMD0gUlVMRV9TVFJJTkcgKSApICkgKSApICkgKSogKSApICkgKSA7CiAgICAgcHVibGljIGZpbmFsIEVPYmplY3QgcnVsZURhdGFJbnRlcmNoYW5nZUZpbGVYTUwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogICAgICAgICBFT2JqZWN0IGN1cnJlbnQgPSBudWxsOwogCkBAIC0xNDM4LDE0ICsxNDkwLDE0IEBACiAgICAgICAgIAllbnRlclJ1bGUoKTsKIAogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NTEzOjI6ICggKCAoKSBvdGhlcmx2XzE9ICdYTUwnICggKGx2X2ZpbGVVUkxfMl8wPSBSVUxFX1NUUklORyApICkgKCAoICggKCAoey4uLn0/ID0+ICggKHsuLi59PyA9PiAoIChsdl9ieUF0dHJpYnV0ZV80XzA9ICdtYXBCeUF0dHJpYnV0ZScgKSApICkgKSApIHwgKHsuLi59PyA9PiAoICh7Li4ufT8gPT4gKG90aGVybHZfNT0gJ2VuY29kaW5nJyAoIChsdl9lbmNvZGluZ182XzA9IFJVTEVfU1RSSU5HICkgKSApICkgKSApIHwgKHsuLi59PyA9PiAoICh7Li4ufT8gPT4gKG90aGVybHZfNz0gJ2xvY2FsZScgKCAobHZfbG9jYWxlXzhfMD0gUlVMRV9TVFJJTkcgKSApICkgKSApICkgKSogKSApICkgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo1MTQ6MjogKCAoKSBvdGhlcmx2XzE9ICdYTUwnICggKGx2X2ZpbGVVUkxfMl8wPSBSVUxFX1NUUklORyApICkgKCAoICggKCAoey4uLn0/ID0+ICggKHsuLi59PyA9PiAoIChsdl9ieUF0dHJpYnV0ZV80XzA9ICdtYXBCeUF0dHJpYnV0ZScgKSApICkgKSApIHwgKHsuLi59PyA9PiAoICh7Li4ufT8gPT4gKG90aGVybHZfNT0gJ2VuY29kaW5nJyAoIChsdl9lbmNvZGluZ182XzA9IFJVTEVfU1RSSU5HICkgKSApICkgKSApIHwgKHsuLi59PyA9PiAoICh7Li4ufT8gPT4gKG90aGVybHZfNz0gJ2xvY2FsZScgKCAobHZfbG9jYWxlXzhfMD0gUlVMRV9TVFJJTkcgKSApICkgKSApICkgKSogKSApICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NTI3OjI6ICggKCAoKSBvdGhlcmx2XzE9ICdYTUwnICggKGx2X2ZpbGVVUkxfMl8wPSBSVUxFX1NUUklORyApICkgKCAoICggKCAoey4uLn0/ID0+ICggKHsuLi59PyA9PiAoIChsdl9ieUF0dHJpYnV0ZV80XzA9ICdtYXBCeUF0dHJpYnV0ZScgKSApICkgKSApIHwgKHsuLi59PyA9PiAoICh7Li4ufT8gPT4gKG90aGVybHZfNT0gJ2VuY29kaW5nJyAoIChsdl9lbmNvZGluZ182XzA9IFJVTEVfU1RSSU5HICkgKSApICkgKSApIHwgKHsuLi59PyA9PiAoICh7Li4ufT8gPT4gKG90aGVybHZfNz0gJ2xvY2FsZScgKCAobHZfbG9jYWxlXzhfMD0gUlVMRV9TVFJJTkcgKSApICkgKSApICkgKSogKSApICkgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo1Mjg6MjogKCAoKSBvdGhlcmx2XzE9ICdYTUwnICggKGx2X2ZpbGVVUkxfMl8wPSBSVUxFX1NUUklORyApICkgKCAoICggKCAoey4uLn0/ID0+ICggKHsuLi59PyA9PiAoIChsdl9ieUF0dHJpYnV0ZV80XzA9ICdtYXBCeUF0dHJpYnV0ZScgKSApICkgKSApIHwgKHsuLi59PyA9PiAoICh7Li4ufT8gPT4gKG90aGVybHZfNT0gJ2VuY29kaW5nJyAoIChsdl9lbmNvZGluZ182XzA9IFJVTEVfU1RSSU5HICkgKSApICkgKSApIHwgKHsuLi59PyA9PiAoICh7Li4ufT8gPT4gKG90aGVybHZfNz0gJ2xvY2FsZScgKCAobHZfbG9jYWxlXzhfMD0gUlVMRV9TVFJJTkcgKSApICkgKSApICkgKSogKSApICkgKQogICAgICAgICAgICAgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NTE0OjI6ICggKCkgb3RoZXJsdl8xPSAnWE1MJyAoIChsdl9maWxlVVJMXzJfMD0gUlVMRV9TVFJJTkcgKSApICggKCAoICggKHsuLi59PyA9PiAoICh7Li4ufT8gPT4gKCAobHZfYnlBdHRyaWJ1dGVfNF8wPSAnbWFwQnlBdHRyaWJ1dGUnICkgKSApICkgKSB8ICh7Li4ufT8gPT4gKCAoey4uLn0/ID0+IChvdGhlcmx2XzU9ICdlbmNvZGluZycgKCAobHZfZW5jb2RpbmdfNl8wPSBSVUxFX1NUUklORyApICkgKSApICkgKSB8ICh7Li4ufT8gPT4gKCAoey4uLn0/ID0+IChvdGhlcmx2Xzc9ICdsb2NhbGUnICggKGx2X2xvY2FsZV84XzA9IFJVTEVfU1RSSU5HICkgKSApICkgKSApICkqICkgKSApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjUxNTozOiAoKSBvdGhlcmx2XzE9ICdYTUwnICggKGx2X2ZpbGVVUkxfMl8wPSBSVUxFX1NUUklORyApICkgKCAoICggKCAoey4uLn0/ID0+ICggKHsuLi59PyA9PiAoIChsdl9ieUF0dHJpYnV0ZV80XzA9ICdtYXBCeUF0dHJpYnV0ZScgKSApICkgKSApIHwgKHsuLi59PyA9PiAoICh7Li4ufT8gPT4gKG90aGVybHZfNT0gJ2VuY29kaW5nJyAoIChsdl9lbmNvZGluZ182XzA9IFJVTEVfU1RSSU5HICkgKSApICkgKSApIHwgKHsuLi59PyA9PiAoICh7Li4ufT8gPT4gKG90aGVybHZfNz0gJ2xvY2FsZScgKCAobHZfbG9jYWxlXzhfMD0gUlVMRV9TVFJJTkcgKSApICkgKSApICkgKSogKSApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjUyODoyOiAoICgpIG90aGVybHZfMT0gJ1hNTCcgKCAobHZfZmlsZVVSTF8yXzA9IFJVTEVfU1RSSU5HICkgKSAoICggKCAoICh7Li4ufT8gPT4gKCAoey4uLn0/ID0+ICggKGx2X2J5QXR0cmlidXRlXzRfMD0gJ21hcEJ5QXR0cmlidXRlJyApICkgKSApICkgfCAoey4uLn0/ID0+ICggKHsuLi59PyA9PiAob3RoZXJsdl81PSAnZW5jb2RpbmcnICggKGx2X2VuY29kaW5nXzZfMD0gUlVMRV9TVFJJTkcgKSApICkgKSApICkgfCAoey4uLn0/ID0+ICggKHsuLi59PyA9PiAob3RoZXJsdl83PSAnbG9jYWxlJyAoIChsdl9sb2NhbGVfOF8wPSBSVUxFX1NUUklORyApICkgKSApICkgKSApKiApICkgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo1Mjk6MzogKCkgb3RoZXJsdl8xPSAnWE1MJyAoIChsdl9maWxlVVJMXzJfMD0gUlVMRV9TVFJJTkcgKSApICggKCAoICggKHsuLi59PyA9PiAoICh7Li4ufT8gPT4gKCAobHZfYnlBdHRyaWJ1dGVfNF8wPSAnbWFwQnlBdHRyaWJ1dGUnICkgKSApICkgKSB8ICh7Li4ufT8gPT4gKCAoey4uLn0/ID0+IChvdGhlcmx2XzU9ICdlbmNvZGluZycgKCAobHZfZW5jb2RpbmdfNl8wPSBSVUxFX1NUUklORyApICkgKSApICkgKSB8ICh7Li4ufT8gPT4gKCAoey4uLn0/ID0+IChvdGhlcmx2Xzc9ICdsb2NhbGUnICggKGx2X2xvY2FsZV84XzA9IFJVTEVfU1RSSU5HICkgKSApICkgKSApICkqICkgKSApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo1MTU6MzogKCkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjUxNjo0OiAKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjUyOTozOiAoKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NTMwOjQ6IAogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAKQEAgLTE0NTcsMTkgKzE1MDksMTkgQEAKIAogICAgICAgICAgICAgfQogCi0gICAgICAgICAgICBvdGhlcmx2XzE9KFRva2VuKW1hdGNoKGlucHV0LDI0LEZPTExPV182KTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7CisgICAgICAgICAgICBvdGhlcmx2XzE9KFRva2VuKW1hdGNoKGlucHV0LDI1LEZPTExPV182KTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKIAogICAgICAgICAgICAgICAJCQluZXdMZWFmTm9kZShvdGhlcmx2XzEsIGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YUludGVyY2hhbmdlRmlsZVhNTEFjY2VzcygpLmdldFhNTEtleXdvcmRfMSgpKTsKICAgICAgICAgICAgICAgCQkKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjUyNjozOiAoIChsdl9maWxlVVJMXzJfMD0gUlVMRV9TVFJJTkcgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo1Mjc6NDogKGx2X2ZpbGVVUkxfMl8wPSBSVUxFX1NUUklORyApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo1NDA6MzogKCAobHZfZmlsZVVSTF8yXzA9IFJVTEVfU1RSSU5HICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NTQxOjQ6IChsdl9maWxlVVJMXzJfMD0gUlVMRV9TVFJJTkcgKQogICAgICAgICAgICAgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NTI3OjQ6IChsdl9maWxlVVJMXzJfMD0gUlVMRV9TVFJJTkcgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NTI4OjU6IGx2X2ZpbGVVUkxfMl8wPSBSVUxFX1NUUklORworICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NTQxOjQ6IChsdl9maWxlVVJMXzJfMD0gUlVMRV9TVFJJTkcgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NTQyOjU6IGx2X2ZpbGVVUkxfMl8wPSBSVUxFX1NUUklORwogICAgICAgICAgICAgewotICAgICAgICAgICAgbHZfZmlsZVVSTF8yXzA9KFRva2VuKW1hdGNoKGlucHV0LFJVTEVfU1RSSU5HLEZPTExPV18xOSk7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OworICAgICAgICAgICAgbHZfZmlsZVVSTF8yXzA9KFRva2VuKW1hdGNoKGlucHV0LFJVTEVfU1RSSU5HLEZPTExPV18yMCk7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OwogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAKICAgICAgICAgICAgICAgCQkJCQluZXdMZWFmTm9kZShsdl9maWxlVVJMXzJfMCwgZ3JhbW1hckFjY2Vzcy5nZXREYXRhSW50ZXJjaGFuZ2VGaWxlWE1MQWNjZXNzKCkuZ2V0RmlsZVVSTFNUUklOR1Rlcm1pbmFsUnVsZUNhbGxfMl8wKCkpOwpAQCAtMTQ5Myw2MiArMTU0NSw2MiBAQAogCiAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjU0NDozOiAoICggKCAoICh7Li4ufT8gPT4gKCAoey4uLn0/ID0+ICggKGx2X2J5QXR0cmlidXRlXzRfMD0gJ21hcEJ5QXR0cmlidXRlJyApICkgKSApICkgfCAoey4uLn0/ID0+ICggKHsuLi59PyA9PiAob3RoZXJsdl81PSAnZW5jb2RpbmcnICggKGx2X2VuY29kaW5nXzZfMD0gUlVMRV9TVFJJTkcgKSApICkgKSApICkgfCAoey4uLn0/ID0+ICggKHsuLi59PyA9PiAob3RoZXJsdl83PSAnbG9jYWxlJyAoIChsdl9sb2NhbGVfOF8wPSBSVUxFX1NUUklORyApICkgKSApICkgKSApKiApICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NTQ1OjQ6ICggKCAoICh7Li4ufT8gPT4gKCAoey4uLn0/ID0+ICggKGx2X2J5QXR0cmlidXRlXzRfMD0gJ21hcEJ5QXR0cmlidXRlJyApICkgKSApICkgfCAoey4uLn0/ID0+ICggKHsuLi59PyA9PiAob3RoZXJsdl81PSAnZW5jb2RpbmcnICggKGx2X2VuY29kaW5nXzZfMD0gUlVMRV9TVFJJTkcgKSApICkgKSApICkgfCAoey4uLn0/ID0+ICggKHsuLi59PyA9PiAob3RoZXJsdl83PSAnbG9jYWxlJyAoIChsdl9sb2NhbGVfOF8wPSBSVUxFX1NUUklORyApICkgKSApICkgKSApKiApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjU1ODozOiAoICggKCAoICh7Li4ufT8gPT4gKCAoey4uLn0/ID0+ICggKGx2X2J5QXR0cmlidXRlXzRfMD0gJ21hcEJ5QXR0cmlidXRlJyApICkgKSApICkgfCAoey4uLn0/ID0+ICggKHsuLi59PyA9PiAob3RoZXJsdl81PSAnZW5jb2RpbmcnICggKGx2X2VuY29kaW5nXzZfMD0gUlVMRV9TVFJJTkcgKSApICkgKSApICkgfCAoey4uLn0/ID0+ICggKHsuLi59PyA9PiAob3RoZXJsdl83PSAnbG9jYWxlJyAoIChsdl9sb2NhbGVfOF8wPSBSVUxFX1NUUklORyApICkgKSApICkgKSApKiApICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NTU5OjQ6ICggKCAoICh7Li4ufT8gPT4gKCAoey4uLn0/ID0+ICggKGx2X2J5QXR0cmlidXRlXzRfMD0gJ21hcEJ5QXR0cmlidXRlJyApICkgKSApICkgfCAoey4uLn0/ID0+ICggKHsuLi59PyA9PiAob3RoZXJsdl81PSAnZW5jb2RpbmcnICggKGx2X2VuY29kaW5nXzZfMD0gUlVMRV9TVFJJTkcgKSApICkgKSApICkgfCAoey4uLn0/ID0+ICggKHsuLi59PyA9PiAob3RoZXJsdl83PSAnbG9jYWxlJyAoIChsdl9sb2NhbGVfOF8wPSBSVUxFX1NUUklORyApICkgKSApICkgKSApKiApICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjU0NTo0OiAoICggKCAoey4uLn0/ID0+ICggKHsuLi59PyA9PiAoIChsdl9ieUF0dHJpYnV0ZV80XzA9ICdtYXBCeUF0dHJpYnV0ZScgKSApICkgKSApIHwgKHsuLi59PyA9PiAoICh7Li4ufT8gPT4gKG90aGVybHZfNT0gJ2VuY29kaW5nJyAoIChsdl9lbmNvZGluZ182XzA9IFJVTEVfU1RSSU5HICkgKSApICkgKSApIHwgKHsuLi59PyA9PiAoICh7Li4ufT8gPT4gKG90aGVybHZfNz0gJ2xvY2FsZScgKCAobHZfbG9jYWxlXzhfMD0gUlVMRV9TVFJJTkcgKSApICkgKSApICkgKSogKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo1NDY6NTogKCAoICh7Li4ufT8gPT4gKCAoey4uLn0/ID0+ICggKGx2X2J5QXR0cmlidXRlXzRfMD0gJ21hcEJ5QXR0cmlidXRlJyApICkgKSApICkgfCAoey4uLn0/ID0+ICggKHsuLi59PyA9PiAob3RoZXJsdl81PSAnZW5jb2RpbmcnICggKGx2X2VuY29kaW5nXzZfMD0gUlVMRV9TVFJJTkcgKSApICkgKSApICkgfCAoey4uLn0/ID0+ICggKHsuLi59PyA9PiAob3RoZXJsdl83PSAnbG9jYWxlJyAoIChsdl9sb2NhbGVfOF8wPSBSVUxFX1NUUklORyApICkgKSApICkgKSApKiApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo1NTk6NDogKCAoICggKHsuLi59PyA9PiAoICh7Li4ufT8gPT4gKCAobHZfYnlBdHRyaWJ1dGVfNF8wPSAnbWFwQnlBdHRyaWJ1dGUnICkgKSApICkgKSB8ICh7Li4ufT8gPT4gKCAoey4uLn0/ID0+IChvdGhlcmx2XzU9ICdlbmNvZGluZycgKCAobHZfZW5jb2RpbmdfNl8wPSBSVUxFX1NUUklORyApICkgKSApICkgKSB8ICh7Li4ufT8gPT4gKCAoey4uLn0/ID0+IChvdGhlcmx2Xzc9ICdsb2NhbGUnICggKGx2X2xvY2FsZV84XzA9IFJVTEVfU1RSSU5HICkgKSApICkgKSApICkqICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NTYwOjU6ICggKCAoey4uLn0/ID0+ICggKHsuLi59PyA9PiAoIChsdl9ieUF0dHJpYnV0ZV80XzA9ICdtYXBCeUF0dHJpYnV0ZScgKSApICkgKSApIHwgKHsuLi59PyA9PiAoICh7Li4ufT8gPT4gKG90aGVybHZfNT0gJ2VuY29kaW5nJyAoIChsdl9lbmNvZGluZ182XzA9IFJVTEVfU1RSSU5HICkgKSApICkgKSApIHwgKHsuLi59PyA9PiAoICh7Li4ufT8gPT4gKG90aGVybHZfNz0gJ2xvY2FsZScgKCAobHZfbG9jYWxlXzhfMD0gUlVMRV9TVFJJTkcgKSApICkgKSApICkgKSogKQogICAgICAgICAgICAgewogICAgICAgICAgICAgZ2V0VW5vcmRlcmVkR3JvdXBIZWxwZXIoKS5lbnRlcihncmFtbWFyQWNjZXNzLmdldERhdGFJbnRlcmNoYW5nZUZpbGVYTUxBY2Nlc3MoKS5nZXRVbm9yZGVyZWRHcm91cF8zKCkpOwotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NTQ5OjU6ICggKCAoey4uLn0/ID0+ICggKHsuLi59PyA9PiAoIChsdl9ieUF0dHJpYnV0ZV80XzA9ICdtYXBCeUF0dHJpYnV0ZScgKSApICkgKSApIHwgKHsuLi59PyA9PiAoICh7Li4ufT8gPT4gKG90aGVybHZfNT0gJ2VuY29kaW5nJyAoIChsdl9lbmNvZGluZ182XzA9IFJVTEVfU1RSSU5HICkgKSApICkgKSApIHwgKHsuLi59PyA9PiAoICh7Li4ufT8gPT4gKG90aGVybHZfNz0gJ2xvY2FsZScgKCAobHZfbG9jYWxlXzhfMD0gUlVMRV9TVFJJTkcgKSApICkgKSApICkgKSogKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NTUwOjY6ICggKHsuLi59PyA9PiAoICh7Li4ufT8gPT4gKCAobHZfYnlBdHRyaWJ1dGVfNF8wPSAnbWFwQnlBdHRyaWJ1dGUnICkgKSApICkgKSB8ICh7Li4ufT8gPT4gKCAoey4uLn0/ID0+IChvdGhlcmx2XzU9ICdlbmNvZGluZycgKCAobHZfZW5jb2RpbmdfNl8wPSBSVUxFX1NUUklORyApICkgKSApICkgKSB8ICh7Li4ufT8gPT4gKCAoey4uLn0/ID0+IChvdGhlcmx2Xzc9ICdsb2NhbGUnICggKGx2X2xvY2FsZV84XzA9IFJVTEVfU1RSSU5HICkgKSApICkgKSApICkqCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo1NjM6NTogKCAoICh7Li4ufT8gPT4gKCAoey4uLn0/ID0+ICggKGx2X2J5QXR0cmlidXRlXzRfMD0gJ21hcEJ5QXR0cmlidXRlJyApICkgKSApICkgfCAoey4uLn0/ID0+ICggKHsuLi59PyA9PiAob3RoZXJsdl81PSAnZW5jb2RpbmcnICggKGx2X2VuY29kaW5nXzZfMD0gUlVMRV9TVFJJTkcgKSApICkgKSApICkgfCAoey4uLn0/ID0+ICggKHsuLi59PyA9PiAob3RoZXJsdl83PSAnbG9jYWxlJyAoIChsdl9sb2NhbGVfOF8wPSBSVUxFX1NUUklORyApICkgKSApICkgKSApKiApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo1NjQ6NjogKCAoey4uLn0/ID0+ICggKHsuLi59PyA9PiAoIChsdl9ieUF0dHJpYnV0ZV80XzA9ICdtYXBCeUF0dHJpYnV0ZScgKSApICkgKSApIHwgKHsuLi59PyA9PiAoICh7Li4ufT8gPT4gKG90aGVybHZfNT0gJ2VuY29kaW5nJyAoIChsdl9lbmNvZGluZ182XzA9IFJVTEVfU1RSSU5HICkgKSApICkgKSApIHwgKHsuLi59PyA9PiAoICh7Li4ufT8gPT4gKG90aGVybHZfNz0gJ2xvY2FsZScgKCAobHZfbG9jYWxlXzhfMD0gUlVMRV9TVFJJTkcgKSApICkgKSApICkgKSoKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjU1MDo2OiAoICh7Li4ufT8gPT4gKCAoey4uLn0/ID0+ICggKGx2X2J5QXR0cmlidXRlXzRfMD0gJ21hcEJ5QXR0cmlidXRlJyApICkgKSApICkgfCAoey4uLn0/ID0+ICggKHsuLi59PyA9PiAob3RoZXJsdl81PSAnZW5jb2RpbmcnICggKGx2X2VuY29kaW5nXzZfMD0gUlVMRV9TVFJJTkcgKSApICkgKSApICkgfCAoey4uLn0/ID0+ICggKHsuLi59PyA9PiAob3RoZXJsdl83PSAnbG9jYWxlJyAoIChsdl9sb2NhbGVfOF8wPSBSVUxFX1NUUklORyApICkgKSApICkgKSApKgotICAgICAgICAgICAgbG9vcDExOgorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NTY0OjY6ICggKHsuLi59PyA9PiAoICh7Li4ufT8gPT4gKCAobHZfYnlBdHRyaWJ1dGVfNF8wPSAnbWFwQnlBdHRyaWJ1dGUnICkgKSApICkgKSB8ICh7Li4ufT8gPT4gKCAoey4uLn0/ID0+IChvdGhlcmx2XzU9ICdlbmNvZGluZycgKCAobHZfZW5jb2RpbmdfNl8wPSBSVUxFX1NUUklORyApICkgKSApICkgKSB8ICh7Li4ufT8gPT4gKCAoey4uLn0/ID0+IChvdGhlcmx2Xzc9ICdsb2NhbGUnICggKGx2X2xvY2FsZV84XzA9IFJVTEVfU1RSSU5HICkgKSApICkgKSApICkqCisgICAgICAgICAgICBsb29wMTI6CiAgICAgICAgICAgICBkbyB7Ci0gICAgICAgICAgICAgICAgaW50IGFsdDExPTQ7Ci0gICAgICAgICAgICAgICAgaW50IExBMTFfMCA9IGlucHV0LkxBKDEpOworICAgICAgICAgICAgICAgIGludCBhbHQxMj00OworICAgICAgICAgICAgICAgIGludCBMQTEyXzAgPSBpbnB1dC5MQSgxKTsKIAotICAgICAgICAgICAgICAgIGlmICggTEExMV8wID09IDI1ICYmIGdldFVub3JkZXJlZEdyb3VwSGVscGVyKCkuY2FuU2VsZWN0KGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YUludGVyY2hhbmdlRmlsZVhNTEFjY2VzcygpLmdldFVub3JkZXJlZEdyb3VwXzMoKSwgMCkgKSB7Ci0gICAgICAgICAgICAgICAgICAgIGFsdDExPTE7CisgICAgICAgICAgICAgICAgaWYgKCBMQTEyXzAgPT0gMjYgJiYgZ2V0VW5vcmRlcmVkR3JvdXBIZWxwZXIoKS5jYW5TZWxlY3QoZ3JhbW1hckFjY2Vzcy5nZXREYXRhSW50ZXJjaGFuZ2VGaWxlWE1MQWNjZXNzKCkuZ2V0VW5vcmRlcmVkR3JvdXBfMygpLCAwKSApIHsKKyAgICAgICAgICAgICAgICAgICAgYWx0MTI9MTsKICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZSBpZiAoIExBMTFfMCA9PSAyNiAmJiBnZXRVbm9yZGVyZWRHcm91cEhlbHBlcigpLmNhblNlbGVjdChncmFtbWFyQWNjZXNzLmdldERhdGFJbnRlcmNoYW5nZUZpbGVYTUxBY2Nlc3MoKS5nZXRVbm9yZGVyZWRHcm91cF8zKCksIDEpICkgewotICAgICAgICAgICAgICAgICAgICBhbHQxMT0yOworICAgICAgICAgICAgICAgIGVsc2UgaWYgKCBMQTEyXzAgPT0gMjcgJiYgZ2V0VW5vcmRlcmVkR3JvdXBIZWxwZXIoKS5jYW5TZWxlY3QoZ3JhbW1hckFjY2Vzcy5nZXREYXRhSW50ZXJjaGFuZ2VGaWxlWE1MQWNjZXNzKCkuZ2V0VW5vcmRlcmVkR3JvdXBfMygpLCAxKSApIHsKKyAgICAgICAgICAgICAgICAgICAgYWx0MTI9MjsKICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZSBpZiAoIExBMTFfMCA9PSAyNyAmJiBnZXRVbm9yZGVyZWRHcm91cEhlbHBlcigpLmNhblNlbGVjdChncmFtbWFyQWNjZXNzLmdldERhdGFJbnRlcmNoYW5nZUZpbGVYTUxBY2Nlc3MoKS5nZXRVbm9yZGVyZWRHcm91cF8zKCksIDIpICkgewotICAgICAgICAgICAgICAgICAgICBhbHQxMT0zOworICAgICAgICAgICAgICAgIGVsc2UgaWYgKCBMQTEyXzAgPT0gMjggJiYgZ2V0VW5vcmRlcmVkR3JvdXBIZWxwZXIoKS5jYW5TZWxlY3QoZ3JhbW1hckFjY2Vzcy5nZXREYXRhSW50ZXJjaGFuZ2VGaWxlWE1MQWNjZXNzKCkuZ2V0VW5vcmRlcmVkR3JvdXBfMygpLCAyKSApIHsKKyAgICAgICAgICAgICAgICAgICAgYWx0MTI9MzsKICAgICAgICAgICAgICAgICB9CiAKIAotICAgICAgICAgICAgICAgIHN3aXRjaCAoYWx0MTEpIHsKKyAgICAgICAgICAgICAgICBzd2l0Y2ggKGFsdDEyKSB7CiAgICAgICAgICAgICAJY2FzZSAxIDoKLSAgICAgICAgICAgIAkgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NTUxOjQ6ICh7Li4ufT8gPT4gKCAoey4uLn0/ID0+ICggKGx2X2J5QXR0cmlidXRlXzRfMD0gJ21hcEJ5QXR0cmlidXRlJyApICkgKSApICkKKyAgICAgICAgICAgIAkgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NTY1OjQ6ICh7Li4ufT8gPT4gKCAoey4uLn0/ID0+ICggKGx2X2J5QXR0cmlidXRlXzRfMD0gJ21hcEJ5QXR0cmlidXRlJyApICkgKSApICkKICAgICAgICAgICAgIAkgICAgewotICAgICAgICAgICAgCSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo1NTE6NDogKHsuLi59PyA9PiAoICh7Li4ufT8gPT4gKCAobHZfYnlBdHRyaWJ1dGVfNF8wPSAnbWFwQnlBdHRyaWJ1dGUnICkgKSApICkgKQotICAgICAgICAgICAgCSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo1NTI6NTogey4uLn0/ID0+ICggKHsuLi59PyA9PiAoIChsdl9ieUF0dHJpYnV0ZV80XzA9ICdtYXBCeUF0dHJpYnV0ZScgKSApICkgKQorICAgICAgICAgICAgCSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo1NjU6NDogKHsuLi59PyA9PiAoICh7Li4ufT8gPT4gKCAobHZfYnlBdHRyaWJ1dGVfNF8wPSAnbWFwQnlBdHRyaWJ1dGUnICkgKSApICkgKQorICAgICAgICAgICAgCSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo1NjY6NTogey4uLn0/ID0+ICggKHsuLi59PyA9PiAoIChsdl9ieUF0dHJpYnV0ZV80XzA9ICdtYXBCeUF0dHJpYnV0ZScgKSApICkgKQogICAgICAgICAgICAgCSAgICB7CiAgICAgICAgICAgICAJICAgIGlmICggISBnZXRVbm9yZGVyZWRHcm91cEhlbHBlcigpLmNhblNlbGVjdChncmFtbWFyQWNjZXNzLmdldERhdGFJbnRlcmNoYW5nZUZpbGVYTUxBY2Nlc3MoKS5nZXRVbm9yZGVyZWRHcm91cF8zKCksIDApICkgewogICAgICAgICAgICAgCSAgICAgICAgaWYgKHN0YXRlLmJhY2t0cmFja2luZz4wKSB7c3RhdGUuZmFpbGVkPXRydWU7IHJldHVybiBjdXJyZW50O30KICAgICAgICAgICAgIAkgICAgICAgIHRocm93IG5ldyBGYWlsZWRQcmVkaWNhdGVFeGNlcHRpb24oaW5wdXQsICJydWxlRGF0YUludGVyY2hhbmdlRmlsZVhNTCIsICJnZXRVbm9yZGVyZWRHcm91cEhlbHBlcigpLmNhblNlbGVjdChncmFtbWFyQWNjZXNzLmdldERhdGFJbnRlcmNoYW5nZUZpbGVYTUxBY2Nlc3MoKS5nZXRVbm9yZGVyZWRHcm91cF8zKCksIDApIik7CiAgICAgICAgICAgICAJICAgIH0KLSAgICAgICAgICAgIAkgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NTUyOjExOTogKCAoey4uLn0/ID0+ICggKGx2X2J5QXR0cmlidXRlXzRfMD0gJ21hcEJ5QXR0cmlidXRlJyApICkgKSApCi0gICAgICAgICAgICAJICAgIC8vIEludGVybmFsRGF0YURTTC5nOjU1Mzo2OiAoey4uLn0/ID0+ICggKGx2X2J5QXR0cmlidXRlXzRfMD0gJ21hcEJ5QXR0cmlidXRlJyApICkgKQorICAgICAgICAgICAgCSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo1NjY6MTE5OiAoICh7Li4ufT8gPT4gKCAobHZfYnlBdHRyaWJ1dGVfNF8wPSAnbWFwQnlBdHRyaWJ1dGUnICkgKSApICkKKyAgICAgICAgICAgIAkgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NTY3OjY6ICh7Li4ufT8gPT4gKCAobHZfYnlBdHRyaWJ1dGVfNF8wPSAnbWFwQnlBdHRyaWJ1dGUnICkgKSApCiAgICAgICAgICAgICAJICAgIHsKICAgICAgICAgICAgIAkgICAgZ2V0VW5vcmRlcmVkR3JvdXBIZWxwZXIoKS5zZWxlY3QoZ3JhbW1hckFjY2Vzcy5nZXREYXRhSW50ZXJjaGFuZ2VGaWxlWE1MQWNjZXNzKCkuZ2V0VW5vcmRlcmVkR3JvdXBfMygpLCAwKTsKLSAgICAgICAgICAgIAkgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NTU2Ojk6ICh7Li4ufT8gPT4gKCAobHZfYnlBdHRyaWJ1dGVfNF8wPSAnbWFwQnlBdHRyaWJ1dGUnICkgKSApCi0gICAgICAgICAgICAJICAgIC8vIEludGVybmFsRGF0YURTTC5nOjU1NjoxMDogey4uLn0/ID0+ICggKGx2X2J5QXR0cmlidXRlXzRfMD0gJ21hcEJ5QXR0cmlidXRlJyApICkKKyAgICAgICAgICAgIAkgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NTcwOjk6ICh7Li4ufT8gPT4gKCAobHZfYnlBdHRyaWJ1dGVfNF8wPSAnbWFwQnlBdHRyaWJ1dGUnICkgKSApCisgICAgICAgICAgICAJICAgIC8vIEludGVybmFsRGF0YURTTC5nOjU3MDoxMDogey4uLn0/ID0+ICggKGx2X2J5QXR0cmlidXRlXzRfMD0gJ21hcEJ5QXR0cmlidXRlJyApICkKICAgICAgICAgICAgIAkgICAgewogICAgICAgICAgICAgCSAgICBpZiAoICEoKHRydWUpKSApIHsKICAgICAgICAgICAgIAkgICAgICAgIGlmIChzdGF0ZS5iYWNrdHJhY2tpbmc+MCkge3N0YXRlLmZhaWxlZD10cnVlOyByZXR1cm4gY3VycmVudDt9CiAgICAgICAgICAgICAJICAgICAgICB0aHJvdyBuZXcgRmFpbGVkUHJlZGljYXRlRXhjZXB0aW9uKGlucHV0LCAicnVsZURhdGFJbnRlcmNoYW5nZUZpbGVYTUwiLCAidHJ1ZSIpOwogICAgICAgICAgICAgCSAgICB9Ci0gICAgICAgICAgICAJICAgIC8vIEludGVybmFsRGF0YURTTC5nOjU1NjoxOTogKCAobHZfYnlBdHRyaWJ1dGVfNF8wPSAnbWFwQnlBdHRyaWJ1dGUnICkgKQotICAgICAgICAgICAgCSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo1NTY6MjA6IChsdl9ieUF0dHJpYnV0ZV80XzA9ICdtYXBCeUF0dHJpYnV0ZScgKQorICAgICAgICAgICAgCSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo1NzA6MTk6ICggKGx2X2J5QXR0cmlidXRlXzRfMD0gJ21hcEJ5QXR0cmlidXRlJyApICkKKyAgICAgICAgICAgIAkgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NTcwOjIwOiAobHZfYnlBdHRyaWJ1dGVfNF8wPSAnbWFwQnlBdHRyaWJ1dGUnICkKICAgICAgICAgICAgIAkgICAgewotICAgICAgICAgICAgCSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo1NTY6MjA6IChsdl9ieUF0dHJpYnV0ZV80XzA9ICdtYXBCeUF0dHJpYnV0ZScgKQotICAgICAgICAgICAgCSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo1NTc6MTA6IGx2X2J5QXR0cmlidXRlXzRfMD0gJ21hcEJ5QXR0cmlidXRlJworICAgICAgICAgICAgCSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo1NzA6MjA6IChsdl9ieUF0dHJpYnV0ZV80XzA9ICdtYXBCeUF0dHJpYnV0ZScgKQorICAgICAgICAgICAgCSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo1NzE6MTA6IGx2X2J5QXR0cmlidXRlXzRfMD0gJ21hcEJ5QXR0cmlidXRlJwogICAgICAgICAgICAgCSAgICB7Ci0gICAgICAgICAgICAJICAgIGx2X2J5QXR0cmlidXRlXzRfMD0oVG9rZW4pbWF0Y2goaW5wdXQsMjUsRk9MTE9XXzE5KTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7CisgICAgICAgICAgICAJICAgIGx2X2J5QXR0cmlidXRlXzRfMD0oVG9rZW4pbWF0Y2goaW5wdXQsMjYsRk9MTE9XXzIwKTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7CiAgICAgICAgICAgICAJICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogCiAgICAgICAgICAgICAJICAgICAgCQkJCQkJCQkJCW5ld0xlYWZOb2RlKGx2X2J5QXR0cmlidXRlXzRfMCwgZ3JhbW1hckFjY2Vzcy5nZXREYXRhSW50ZXJjaGFuZ2VGaWxlWE1MQWNjZXNzKCkuZ2V0QnlBdHRyaWJ1dGVNYXBCeUF0dHJpYnV0ZUtleXdvcmRfM18wXzAoKSk7CkBAIC0xNTgyLDQyICsxNjM0LDQyIEBACiAgICAgICAgICAgICAJICAgIH0KICAgICAgICAgICAgIAkgICAgYnJlYWs7CiAgICAgICAgICAgICAJY2FzZSAyIDoKLSAgICAgICAgICAgIAkgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NTc0OjQ6ICh7Li4ufT8gPT4gKCAoey4uLn0/ID0+IChvdGhlcmx2XzU9ICdlbmNvZGluZycgKCAobHZfZW5jb2RpbmdfNl8wPSBSVUxFX1NUUklORyApICkgKSApICkgKQorICAgICAgICAgICAgCSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo1ODg6NDogKHsuLi59PyA9PiAoICh7Li4ufT8gPT4gKG90aGVybHZfNT0gJ2VuY29kaW5nJyAoIChsdl9lbmNvZGluZ182XzA9IFJVTEVfU1RSSU5HICkgKSApICkgKSApCiAgICAgICAgICAgICAJICAgIHsKLSAgICAgICAgICAgIAkgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NTc0OjQ6ICh7Li4ufT8gPT4gKCAoey4uLn0/ID0+IChvdGhlcmx2XzU9ICdlbmNvZGluZycgKCAobHZfZW5jb2RpbmdfNl8wPSBSVUxFX1NUUklORyApICkgKSApICkgKQotICAgICAgICAgICAgCSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo1NzU6NTogey4uLn0/ID0+ICggKHsuLi59PyA9PiAob3RoZXJsdl81PSAnZW5jb2RpbmcnICggKGx2X2VuY29kaW5nXzZfMD0gUlVMRV9TVFJJTkcgKSApICkgKSApCisgICAgICAgICAgICAJICAgIC8vIEludGVybmFsRGF0YURTTC5nOjU4ODo0OiAoey4uLn0/ID0+ICggKHsuLi59PyA9PiAob3RoZXJsdl81PSAnZW5jb2RpbmcnICggKGx2X2VuY29kaW5nXzZfMD0gUlVMRV9TVFJJTkcgKSApICkgKSApICkKKyAgICAgICAgICAgIAkgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NTg5OjU6IHsuLi59PyA9PiAoICh7Li4ufT8gPT4gKG90aGVybHZfNT0gJ2VuY29kaW5nJyAoIChsdl9lbmNvZGluZ182XzA9IFJVTEVfU1RSSU5HICkgKSApICkgKQogICAgICAgICAgICAgCSAgICB7CiAgICAgICAgICAgICAJICAgIGlmICggISBnZXRVbm9yZGVyZWRHcm91cEhlbHBlcigpLmNhblNlbGVjdChncmFtbWFyQWNjZXNzLmdldERhdGFJbnRlcmNoYW5nZUZpbGVYTUxBY2Nlc3MoKS5nZXRVbm9yZGVyZWRHcm91cF8zKCksIDEpICkgewogICAgICAgICAgICAgCSAgICAgICAgaWYgKHN0YXRlLmJhY2t0cmFja2luZz4wKSB7c3RhdGUuZmFpbGVkPXRydWU7IHJldHVybiBjdXJyZW50O30KICAgICAgICAgICAgIAkgICAgICAgIHRocm93IG5ldyBGYWlsZWRQcmVkaWNhdGVFeGNlcHRpb24oaW5wdXQsICJydWxlRGF0YUludGVyY2hhbmdlRmlsZVhNTCIsICJnZXRVbm9yZGVyZWRHcm91cEhlbHBlcigpLmNhblNlbGVjdChncmFtbWFyQWNjZXNzLmdldERhdGFJbnRlcmNoYW5nZUZpbGVYTUxBY2Nlc3MoKS5nZXRVbm9yZGVyZWRHcm91cF8zKCksIDEpIik7CiAgICAgICAgICAgICAJICAgIH0KLSAgICAgICAgICAgIAkgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NTc1OjExOTogKCAoey4uLn0/ID0+IChvdGhlcmx2XzU9ICdlbmNvZGluZycgKCAobHZfZW5jb2RpbmdfNl8wPSBSVUxFX1NUUklORyApICkgKSApICkKLSAgICAgICAgICAgIAkgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NTc2OjY6ICh7Li4ufT8gPT4gKG90aGVybHZfNT0gJ2VuY29kaW5nJyAoIChsdl9lbmNvZGluZ182XzA9IFJVTEVfU1RSSU5HICkgKSApICkKKyAgICAgICAgICAgIAkgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NTg5OjExOTogKCAoey4uLn0/ID0+IChvdGhlcmx2XzU9ICdlbmNvZGluZycgKCAobHZfZW5jb2RpbmdfNl8wPSBSVUxFX1NUUklORyApICkgKSApICkKKyAgICAgICAgICAgIAkgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NTkwOjY6ICh7Li4ufT8gPT4gKG90aGVybHZfNT0gJ2VuY29kaW5nJyAoIChsdl9lbmNvZGluZ182XzA9IFJVTEVfU1RSSU5HICkgKSApICkKICAgICAgICAgICAgIAkgICAgewogICAgICAgICAgICAgCSAgICBnZXRVbm9yZGVyZWRHcm91cEhlbHBlcigpLnNlbGVjdChncmFtbWFyQWNjZXNzLmdldERhdGFJbnRlcmNoYW5nZUZpbGVYTUxBY2Nlc3MoKS5nZXRVbm9yZGVyZWRHcm91cF8zKCksIDEpOwotICAgICAgICAgICAgCSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo1Nzk6OTogKHsuLi59PyA9PiAob3RoZXJsdl81PSAnZW5jb2RpbmcnICggKGx2X2VuY29kaW5nXzZfMD0gUlVMRV9TVFJJTkcgKSApICkgKQotICAgICAgICAgICAgCSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo1Nzk6MTA6IHsuLi59PyA9PiAob3RoZXJsdl81PSAnZW5jb2RpbmcnICggKGx2X2VuY29kaW5nXzZfMD0gUlVMRV9TVFJJTkcgKSApICkKKyAgICAgICAgICAgIAkgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NTkzOjk6ICh7Li4ufT8gPT4gKG90aGVybHZfNT0gJ2VuY29kaW5nJyAoIChsdl9lbmNvZGluZ182XzA9IFJVTEVfU1RSSU5HICkgKSApICkKKyAgICAgICAgICAgIAkgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NTkzOjEwOiB7Li4ufT8gPT4gKG90aGVybHZfNT0gJ2VuY29kaW5nJyAoIChsdl9lbmNvZGluZ182XzA9IFJVTEVfU1RSSU5HICkgKSApCiAgICAgICAgICAgICAJICAgIHsKICAgICAgICAgICAgIAkgICAgaWYgKCAhKCh0cnVlKSkgKSB7CiAgICAgICAgICAgICAJICAgICAgICBpZiAoc3RhdGUuYmFja3RyYWNraW5nPjApIHtzdGF0ZS5mYWlsZWQ9dHJ1ZTsgcmV0dXJuIGN1cnJlbnQ7fQogICAgICAgICAgICAgCSAgICAgICAgdGhyb3cgbmV3IEZhaWxlZFByZWRpY2F0ZUV4Y2VwdGlvbihpbnB1dCwgInJ1bGVEYXRhSW50ZXJjaGFuZ2VGaWxlWE1MIiwgInRydWUiKTsKICAgICAgICAgICAgIAkgICAgfQotICAgICAgICAgICAgCSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo1Nzk6MTk6IChvdGhlcmx2XzU9ICdlbmNvZGluZycgKCAobHZfZW5jb2RpbmdfNl8wPSBSVUxFX1NUUklORyApICkgKQotICAgICAgICAgICAgCSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo1Nzk6MjA6IG90aGVybHZfNT0gJ2VuY29kaW5nJyAoIChsdl9lbmNvZGluZ182XzA9IFJVTEVfU1RSSU5HICkgKQorICAgICAgICAgICAgCSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo1OTM6MTk6IChvdGhlcmx2XzU9ICdlbmNvZGluZycgKCAobHZfZW5jb2RpbmdfNl8wPSBSVUxFX1NUUklORyApICkgKQorICAgICAgICAgICAgCSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo1OTM6MjA6IG90aGVybHZfNT0gJ2VuY29kaW5nJyAoIChsdl9lbmNvZGluZ182XzA9IFJVTEVfU1RSSU5HICkgKQogICAgICAgICAgICAgCSAgICB7Ci0gICAgICAgICAgICAJICAgIG90aGVybHZfNT0oVG9rZW4pbWF0Y2goaW5wdXQsMjYsRk9MTE9XXzYpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gY3VycmVudDsKKyAgICAgICAgICAgIAkgICAgb3RoZXJsdl81PShUb2tlbiltYXRjaChpbnB1dCwyNyxGT0xMT1dfNik7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OwogICAgICAgICAgICAgCSAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKIAogICAgICAgICAgICAgCSAgICAgIAkJCQkJCQkJCW5ld0xlYWZOb2RlKG90aGVybHZfNSwgZ3JhbW1hckFjY2Vzcy5nZXREYXRhSW50ZXJjaGFuZ2VGaWxlWE1MQWNjZXNzKCkuZ2V0RW5jb2RpbmdLZXl3b3JkXzNfMV8wKCkpOwogICAgICAgICAgICAgCSAgICAgIAkJCQkJCQkJCiAgICAgICAgICAgICAJICAgIH0KLSAgICAgICAgICAgIAkgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NTgzOjk6ICggKGx2X2VuY29kaW5nXzZfMD0gUlVMRV9TVFJJTkcgKSApCi0gICAgICAgICAgICAJICAgIC8vIEludGVybmFsRGF0YURTTC5nOjU4NDoxMDogKGx2X2VuY29kaW5nXzZfMD0gUlVMRV9TVFJJTkcgKQorICAgICAgICAgICAgCSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo1OTc6OTogKCAobHZfZW5jb2RpbmdfNl8wPSBSVUxFX1NUUklORyApICkKKyAgICAgICAgICAgIAkgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NTk4OjEwOiAobHZfZW5jb2RpbmdfNl8wPSBSVUxFX1NUUklORyApCiAgICAgICAgICAgICAJICAgIHsKLSAgICAgICAgICAgIAkgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NTg0OjEwOiAobHZfZW5jb2RpbmdfNl8wPSBSVUxFX1NUUklORyApCi0gICAgICAgICAgICAJICAgIC8vIEludGVybmFsRGF0YURTTC5nOjU4NToxMTogbHZfZW5jb2RpbmdfNl8wPSBSVUxFX1NUUklORworICAgICAgICAgICAgCSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo1OTg6MTA6IChsdl9lbmNvZGluZ182XzA9IFJVTEVfU1RSSU5HICkKKyAgICAgICAgICAgIAkgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NTk5OjExOiBsdl9lbmNvZGluZ182XzA9IFJVTEVfU1RSSU5HCiAgICAgICAgICAgICAJICAgIHsKLSAgICAgICAgICAgIAkgICAgbHZfZW5jb2RpbmdfNl8wPShUb2tlbiltYXRjaChpbnB1dCxSVUxFX1NUUklORyxGT0xMT1dfMTkpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gY3VycmVudDsKKyAgICAgICAgICAgIAkgICAgbHZfZW5jb2RpbmdfNl8wPShUb2tlbiltYXRjaChpbnB1dCxSVUxFX1NUUklORyxGT0xMT1dfMjApOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gY3VycmVudDsKICAgICAgICAgICAgIAkgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAKICAgICAgICAgICAgIAkgICAgICAJCQkJCQkJCQkJCW5ld0xlYWZOb2RlKGx2X2VuY29kaW5nXzZfMCwgZ3JhbW1hckFjY2Vzcy5nZXREYXRhSW50ZXJjaGFuZ2VGaWxlWE1MQWNjZXNzKCkuZ2V0RW5jb2RpbmdTVFJJTkdUZXJtaW5hbFJ1bGVDYWxsXzNfMV8xXzAoKSk7CkBAIC0xNjU4LDQyICsxNzEwLDQyIEBACiAgICAgICAgICAgICAJICAgIH0KICAgICAgICAgICAgIAkgICAgYnJlYWs7CiAgICAgICAgICAgICAJY2FzZSAzIDoKLSAgICAgICAgICAgIAkgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NjA3OjQ6ICh7Li4ufT8gPT4gKCAoey4uLn0/ID0+IChvdGhlcmx2Xzc9ICdsb2NhbGUnICggKGx2X2xvY2FsZV84XzA9IFJVTEVfU1RSSU5HICkgKSApICkgKSApCisgICAgICAgICAgICAJICAgIC8vIEludGVybmFsRGF0YURTTC5nOjYyMTo0OiAoey4uLn0/ID0+ICggKHsuLi59PyA9PiAob3RoZXJsdl83PSAnbG9jYWxlJyAoIChsdl9sb2NhbGVfOF8wPSBSVUxFX1NUUklORyApICkgKSApICkgKQogICAgICAgICAgICAgCSAgICB7Ci0gICAgICAgICAgICAJICAgIC8vIEludGVybmFsRGF0YURTTC5nOjYwNzo0OiAoey4uLn0/ID0+ICggKHsuLi59PyA9PiAob3RoZXJsdl83PSAnbG9jYWxlJyAoIChsdl9sb2NhbGVfOF8wPSBSVUxFX1NUUklORyApICkgKSApICkgKQotICAgICAgICAgICAgCSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo2MDg6NTogey4uLn0/ID0+ICggKHsuLi59PyA9PiAob3RoZXJsdl83PSAnbG9jYWxlJyAoIChsdl9sb2NhbGVfOF8wPSBSVUxFX1NUUklORyApICkgKSApICkKKyAgICAgICAgICAgIAkgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NjIxOjQ6ICh7Li4ufT8gPT4gKCAoey4uLn0/ID0+IChvdGhlcmx2Xzc9ICdsb2NhbGUnICggKGx2X2xvY2FsZV84XzA9IFJVTEVfU1RSSU5HICkgKSApICkgKSApCisgICAgICAgICAgICAJICAgIC8vIEludGVybmFsRGF0YURTTC5nOjYyMjo1OiB7Li4ufT8gPT4gKCAoey4uLn0/ID0+IChvdGhlcmx2Xzc9ICdsb2NhbGUnICggKGx2X2xvY2FsZV84XzA9IFJVTEVfU1RSSU5HICkgKSApICkgKQogICAgICAgICAgICAgCSAgICB7CiAgICAgICAgICAgICAJICAgIGlmICggISBnZXRVbm9yZGVyZWRHcm91cEhlbHBlcigpLmNhblNlbGVjdChncmFtbWFyQWNjZXNzLmdldERhdGFJbnRlcmNoYW5nZUZpbGVYTUxBY2Nlc3MoKS5nZXRVbm9yZGVyZWRHcm91cF8zKCksIDIpICkgewogICAgICAgICAgICAgCSAgICAgICAgaWYgKHN0YXRlLmJhY2t0cmFja2luZz4wKSB7c3RhdGUuZmFpbGVkPXRydWU7IHJldHVybiBjdXJyZW50O30KICAgICAgICAgICAgIAkgICAgICAgIHRocm93IG5ldyBGYWlsZWRQcmVkaWNhdGVFeGNlcHRpb24oaW5wdXQsICJydWxlRGF0YUludGVyY2hhbmdlRmlsZVhNTCIsICJnZXRVbm9yZGVyZWRHcm91cEhlbHBlcigpLmNhblNlbGVjdChncmFtbWFyQWNjZXNzLmdldERhdGFJbnRlcmNoYW5nZUZpbGVYTUxBY2Nlc3MoKS5nZXRVbm9yZGVyZWRHcm91cF8zKCksIDIpIik7CiAgICAgICAgICAgICAJICAgIH0KLSAgICAgICAgICAgIAkgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NjA4OjExOTogKCAoey4uLn0/ID0+IChvdGhlcmx2Xzc9ICdsb2NhbGUnICggKGx2X2xvY2FsZV84XzA9IFJVTEVfU1RSSU5HICkgKSApICkgKQotICAgICAgICAgICAgCSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo2MDk6NjogKHsuLi59PyA9PiAob3RoZXJsdl83PSAnbG9jYWxlJyAoIChsdl9sb2NhbGVfOF8wPSBSVUxFX1NUUklORyApICkgKSApCisgICAgICAgICAgICAJICAgIC8vIEludGVybmFsRGF0YURTTC5nOjYyMjoxMTk6ICggKHsuLi59PyA9PiAob3RoZXJsdl83PSAnbG9jYWxlJyAoIChsdl9sb2NhbGVfOF8wPSBSVUxFX1NUUklORyApICkgKSApICkKKyAgICAgICAgICAgIAkgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NjIzOjY6ICh7Li4ufT8gPT4gKG90aGVybHZfNz0gJ2xvY2FsZScgKCAobHZfbG9jYWxlXzhfMD0gUlVMRV9TVFJJTkcgKSApICkgKQogICAgICAgICAgICAgCSAgICB7CiAgICAgICAgICAgICAJICAgIGdldFVub3JkZXJlZEdyb3VwSGVscGVyKCkuc2VsZWN0KGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YUludGVyY2hhbmdlRmlsZVhNTEFjY2VzcygpLmdldFVub3JkZXJlZEdyb3VwXzMoKSwgMik7Ci0gICAgICAgICAgICAJICAgIC8vIEludGVybmFsRGF0YURTTC5nOjYxMjo5OiAoey4uLn0/ID0+IChvdGhlcmx2Xzc9ICdsb2NhbGUnICggKGx2X2xvY2FsZV84XzA9IFJVTEVfU1RSSU5HICkgKSApICkKLSAgICAgICAgICAgIAkgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NjEyOjEwOiB7Li4ufT8gPT4gKG90aGVybHZfNz0gJ2xvY2FsZScgKCAobHZfbG9jYWxlXzhfMD0gUlVMRV9TVFJJTkcgKSApICkKKyAgICAgICAgICAgIAkgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NjI2Ojk6ICh7Li4ufT8gPT4gKG90aGVybHZfNz0gJ2xvY2FsZScgKCAobHZfbG9jYWxlXzhfMD0gUlVMRV9TVFJJTkcgKSApICkgKQorICAgICAgICAgICAgCSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo2MjY6MTA6IHsuLi59PyA9PiAob3RoZXJsdl83PSAnbG9jYWxlJyAoIChsdl9sb2NhbGVfOF8wPSBSVUxFX1NUUklORyApICkgKQogICAgICAgICAgICAgCSAgICB7CiAgICAgICAgICAgICAJICAgIGlmICggISgodHJ1ZSkpICkgewogICAgICAgICAgICAgCSAgICAgICAgaWYgKHN0YXRlLmJhY2t0cmFja2luZz4wKSB7c3RhdGUuZmFpbGVkPXRydWU7IHJldHVybiBjdXJyZW50O30KICAgICAgICAgICAgIAkgICAgICAgIHRocm93IG5ldyBGYWlsZWRQcmVkaWNhdGVFeGNlcHRpb24oaW5wdXQsICJydWxlRGF0YUludGVyY2hhbmdlRmlsZVhNTCIsICJ0cnVlIik7CiAgICAgICAgICAgICAJICAgIH0KLSAgICAgICAgICAgIAkgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NjEyOjE5OiAob3RoZXJsdl83PSAnbG9jYWxlJyAoIChsdl9sb2NhbGVfOF8wPSBSVUxFX1NUUklORyApICkgKQotICAgICAgICAgICAgCSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo2MTI6MjA6IG90aGVybHZfNz0gJ2xvY2FsZScgKCAobHZfbG9jYWxlXzhfMD0gUlVMRV9TVFJJTkcgKSApCisgICAgICAgICAgICAJICAgIC8vIEludGVybmFsRGF0YURTTC5nOjYyNjoxOTogKG90aGVybHZfNz0gJ2xvY2FsZScgKCAobHZfbG9jYWxlXzhfMD0gUlVMRV9TVFJJTkcgKSApICkKKyAgICAgICAgICAgIAkgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NjI2OjIwOiBvdGhlcmx2Xzc9ICdsb2NhbGUnICggKGx2X2xvY2FsZV84XzA9IFJVTEVfU1RSSU5HICkgKQogICAgICAgICAgICAgCSAgICB7Ci0gICAgICAgICAgICAJICAgIG90aGVybHZfNz0oVG9rZW4pbWF0Y2goaW5wdXQsMjcsRk9MTE9XXzYpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gY3VycmVudDsKKyAgICAgICAgICAgIAkgICAgb3RoZXJsdl83PShUb2tlbiltYXRjaChpbnB1dCwyOCxGT0xMT1dfNik7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OwogICAgICAgICAgICAgCSAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKIAogICAgICAgICAgICAgCSAgICAgIAkJCQkJCQkJCW5ld0xlYWZOb2RlKG90aGVybHZfNywgZ3JhbW1hckFjY2Vzcy5nZXREYXRhSW50ZXJjaGFuZ2VGaWxlWE1MQWNjZXNzKCkuZ2V0TG9jYWxlS2V5d29yZF8zXzJfMCgpKTsKICAgICAgICAgICAgIAkgICAgICAJCQkJCQkJCQogICAgICAgICAgICAgCSAgICB9Ci0gICAgICAgICAgICAJICAgIC8vIEludGVybmFsRGF0YURTTC5nOjYxNjo5OiAoIChsdl9sb2NhbGVfOF8wPSBSVUxFX1NUUklORyApICkKLSAgICAgICAgICAgIAkgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NjE3OjEwOiAobHZfbG9jYWxlXzhfMD0gUlVMRV9TVFJJTkcgKQorICAgICAgICAgICAgCSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo2MzA6OTogKCAobHZfbG9jYWxlXzhfMD0gUlVMRV9TVFJJTkcgKSApCisgICAgICAgICAgICAJICAgIC8vIEludGVybmFsRGF0YURTTC5nOjYzMToxMDogKGx2X2xvY2FsZV84XzA9IFJVTEVfU1RSSU5HICkKICAgICAgICAgICAgIAkgICAgewotICAgICAgICAgICAgCSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo2MTc6MTA6IChsdl9sb2NhbGVfOF8wPSBSVUxFX1NUUklORyApCi0gICAgICAgICAgICAJICAgIC8vIEludGVybmFsRGF0YURTTC5nOjYxODoxMTogbHZfbG9jYWxlXzhfMD0gUlVMRV9TVFJJTkcKKyAgICAgICAgICAgIAkgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NjMxOjEwOiAobHZfbG9jYWxlXzhfMD0gUlVMRV9TVFJJTkcgKQorICAgICAgICAgICAgCSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo2MzI6MTE6IGx2X2xvY2FsZV84XzA9IFJVTEVfU1RSSU5HCiAgICAgICAgICAgICAJICAgIHsKLSAgICAgICAgICAgIAkgICAgbHZfbG9jYWxlXzhfMD0oVG9rZW4pbWF0Y2goaW5wdXQsUlVMRV9TVFJJTkcsRk9MTE9XXzE5KTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7CisgICAgICAgICAgICAJICAgIGx2X2xvY2FsZV84XzA9KFRva2VuKW1hdGNoKGlucHV0LFJVTEVfU1RSSU5HLEZPTExPV18yMCk7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OwogICAgICAgICAgICAgCSAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKIAogICAgICAgICAgICAgCSAgICAgIAkJCQkJCQkJCQkJbmV3TGVhZk5vZGUobHZfbG9jYWxlXzhfMCwgZ3JhbW1hckFjY2Vzcy5nZXREYXRhSW50ZXJjaGFuZ2VGaWxlWE1MQWNjZXNzKCkuZ2V0TG9jYWxlU1RSSU5HVGVybWluYWxSdWxlQ2FsbF8zXzJfMV8wKCkpOwpAQCAtMTczNSw3ICsxNzg3LDcgQEAKICAgICAgICAgICAgIAkgICAgYnJlYWs7CiAKICAgICAgICAgICAgIAlkZWZhdWx0IDoKLSAgICAgICAgICAgIAkgICAgYnJlYWsgbG9vcDExOworICAgICAgICAgICAgCSAgICBicmVhayBsb29wMTI7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfSB3aGlsZSAodHJ1ZSk7CiAKQEAgLTE3NzQsNyArMTgyNiw3IEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAiZW50cnlSdWxlRGF0YUludGVyY2hhbmdlRmlsZUNTViIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo2NTE6MTogZW50cnlSdWxlRGF0YUludGVyY2hhbmdlRmlsZUNTViByZXR1cm5zIFtFT2JqZWN0IGN1cnJlbnQ9bnVsbF0gOiBpdl9ydWxlRGF0YUludGVyY2hhbmdlRmlsZUNTVj0gcnVsZURhdGFJbnRlcmNoYW5nZUZpbGVDU1YgRU9GIDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo2NjU6MTogZW50cnlSdWxlRGF0YUludGVyY2hhbmdlRmlsZUNTViByZXR1cm5zIFtFT2JqZWN0IGN1cnJlbnQ9bnVsbF0gOiBpdl9ydWxlRGF0YUludGVyY2hhbmdlRmlsZUNTVj0gcnVsZURhdGFJbnRlcmNoYW5nZUZpbGVDU1YgRU9GIDsKICAgICBwdWJsaWMgZmluYWwgRU9iamVjdCBlbnRyeVJ1bGVEYXRhSW50ZXJjaGFuZ2VGaWxlQ1NWKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKICAgICAgICAgRU9iamVjdCBjdXJyZW50ID0gbnVsbDsKIApAQCAtMTc4Miw4ICsxODM0LDggQEAKIAogCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo2NTE6NjM6IChpdl9ydWxlRGF0YUludGVyY2hhbmdlRmlsZUNTVj0gcnVsZURhdGFJbnRlcmNoYW5nZUZpbGVDU1YgRU9GICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjY1MjoyOiBpdl9ydWxlRGF0YUludGVyY2hhbmdlRmlsZUNTVj0gcnVsZURhdGFJbnRlcmNoYW5nZUZpbGVDU1YgRU9GCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo2NjU6NjM6IChpdl9ydWxlRGF0YUludGVyY2hhbmdlRmlsZUNTVj0gcnVsZURhdGFJbnRlcmNoYW5nZUZpbGVDU1YgRU9GICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjY2NjoyOiBpdl9ydWxlRGF0YUludGVyY2hhbmdlRmlsZUNTVj0gcnVsZURhdGFJbnRlcmNoYW5nZUZpbGVDU1YgRU9GCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIG5ld0NvbXBvc2l0ZU5vZGUoZ3JhbW1hckFjY2Vzcy5nZXREYXRhSW50ZXJjaGFuZ2VGaWxlQ1NWUnVsZSgpKTsgCkBAIC0xODE0LDcgKzE4NjYsNyBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVEYXRhSW50ZXJjaGFuZ2VGaWxlQ1NWIgotICAgIC8vIEludGVybmFsRGF0YURTTC5nOjY1ODoxOiBydWxlRGF0YUludGVyY2hhbmdlRmlsZUNTViByZXR1cm5zIFtFT2JqZWN0IGN1cnJlbnQ9bnVsbF0gOiAoICgpIG90aGVybHZfMT0gJ0NTVicgKCAobHZfZmlsZVVSTF8yXzA9IFJVTEVfU1RSSU5HICkgKSAoICggKCAoICh7Li4ufT8gPT4gKCAoey4uLn0/ID0+IChvdGhlcmx2XzQ9ICdkZWxpbWl0ZXInICggKGx2X2RlbGltaXRlcl81XzA9IFJVTEVfU1RSSU5HICkgKSApICkgKSApIHwgKHsuLi59PyA9PiAoICh7Li4ufT8gPT4gKG90aGVybHZfNj0gJ3F1b3RlQ2hhcmFjdGVyJyAoIChsdl9xdW90ZUNoYXJhY3Rlcl83XzA9IFJVTEVfU1RSSU5HICkgKSApICkgKSApIHwgKHsuLi59PyA9PiAoICh7Li4ufT8gPT4gKG90aGVybHZfOD0gJ3NraXBMaW5lcycgKCAobHZfc2tpcExpbmVzXzlfMD0gUlVMRV9JTlQgKSApICkgKSApICkgfCAoey4uLn0/ID0+ICggKHsuLi59PyA9PiAoIChsdl9pbmRlbnRfMTBfMD0gJ2luZGVudCcgKSApICkgKSApIHwgKHsuLi59PyA9PiAoICh7Li4ufT8gPT4gKG90aGVybHZfMTE9ICdlbmNvZGluZycgKCAobHZfZW5jb2RpbmdfMTJfMD0gUlVMRV9TVFJJTkcgKSApICkgKSApICkgfCAoey4uLn0/ID0+ICggKHsuLi59PyA9PiAob3RoZXJsdl8xMz0gJ2xvY2FsZScgKCAobHZfbG9jYWxlXzE0XzA9IFJVTEVfU1RSSU5HICkgKSApICkgKSApICkqICkgKSApICkgOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjY3MjoxOiBydWxlRGF0YUludGVyY2hhbmdlRmlsZUNTViByZXR1cm5zIFtFT2JqZWN0IGN1cnJlbnQ9bnVsbF0gOiAoICgpIG90aGVybHZfMT0gJ0NTVicgKCAobHZfZmlsZVVSTF8yXzA9IFJVTEVfU1RSSU5HICkgKSAoICggKCAoICh7Li4ufT8gPT4gKCAoey4uLn0/ID0+IChvdGhlcmx2XzQ9ICdkZWxpbWl0ZXInICggKGx2X2RlbGltaXRlcl81XzA9IFJVTEVfU1RSSU5HICkgKSApICkgKSApIHwgKHsuLi59PyA9PiAoICh7Li4ufT8gPT4gKG90aGVybHZfNj0gJ3F1b3RlQ2hhcmFjdGVyJyAoIChsdl9xdW90ZUNoYXJhY3Rlcl83XzA9IFJVTEVfU1RSSU5HICkgKSApICkgKSApIHwgKHsuLi59PyA9PiAoICh7Li4ufT8gPT4gKG90aGVybHZfOD0gJ3NraXBMaW5lcycgKCAobHZfc2tpcExpbmVzXzlfMD0gUlVMRV9JTlQgKSApICkgKSApICkgfCAoey4uLn0/ID0+ICggKHsuLi59PyA9PiAoIChsdl9pbmRlbnRfMTBfMD0gJ2luZGVudCcgKSApICkgKSApIHwgKHsuLi59PyA9PiAoICh7Li4ufT8gPT4gKG90aGVybHZfMTE9ICdlbmNvZGluZycgKCAobHZfZW5jb2RpbmdfMTJfMD0gUlVMRV9TVFJJTkcgKSApICkgKSApICkgfCAoey4uLn0/ID0+ICggKHsuLi59PyA9PiAob3RoZXJsdl8xMz0gJ2xvY2FsZScgKCAobHZfbG9jYWxlXzE0XzA9IFJVTEVfU1RSSU5HICkgKSApICkgKSApICkqICkgKSApICkgOwogICAgIHB1YmxpYyBmaW5hbCBFT2JqZWN0IHJ1bGVEYXRhSW50ZXJjaGFuZ2VGaWxlQ1NWKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKICAgICAgICAgRU9iamVjdCBjdXJyZW50ID0gbnVsbDsKIApAQCAtMTgzNiwxNCArMTg4OCwxNCBAQAogICAgICAgICAJZW50ZXJSdWxlKCk7CiAKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjY2NDoyOiAoICggKCkgb3RoZXJsdl8xPSAnQ1NWJyAoIChsdl9maWxlVVJMXzJfMD0gUlVMRV9TVFJJTkcgKSApICggKCAoICggKHsuLi59PyA9PiAoICh7Li4ufT8gPT4gKG90aGVybHZfND0gJ2RlbGltaXRlcicgKCAobHZfZGVsaW1pdGVyXzVfMD0gUlVMRV9TVFJJTkcgKSApICkgKSApICkgfCAoey4uLn0/ID0+ICggKHsuLi59PyA9PiAob3RoZXJsdl82PSAncXVvdGVDaGFyYWN0ZXInICggKGx2X3F1b3RlQ2hhcmFjdGVyXzdfMD0gUlVMRV9TVFJJTkcgKSApICkgKSApICkgfCAoey4uLn0/ID0+ICggKHsuLi59PyA9PiAob3RoZXJsdl84PSAnc2tpcExpbmVzJyAoIChsdl9za2lwTGluZXNfOV8wPSBSVUxFX0lOVCApICkgKSApICkgKSB8ICh7Li4ufT8gPT4gKCAoey4uLn0/ID0+ICggKGx2X2luZGVudF8xMF8wPSAnaW5kZW50JyApICkgKSApICkgfCAoey4uLn0/ID0+ICggKHsuLi59PyA9PiAob3RoZXJsdl8xMT0gJ2VuY29kaW5nJyAoIChsdl9lbmNvZGluZ18xMl8wPSBSVUxFX1NUUklORyApICkgKSApICkgKSB8ICh7Li4ufT8gPT4gKCAoey4uLn0/ID0+IChvdGhlcmx2XzEzPSAnbG9jYWxlJyAoIChsdl9sb2NhbGVfMTRfMD0gUlVMRV9TVFJJTkcgKSApICkgKSApICkgKSogKSApICkgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo2NjU6MjogKCAoKSBvdGhlcmx2XzE9ICdDU1YnICggKGx2X2ZpbGVVUkxfMl8wPSBSVUxFX1NUUklORyApICkgKCAoICggKCAoey4uLn0/ID0+ICggKHsuLi59PyA9PiAob3RoZXJsdl80PSAnZGVsaW1pdGVyJyAoIChsdl9kZWxpbWl0ZXJfNV8wPSBSVUxFX1NUUklORyApICkgKSApICkgKSB8ICh7Li4ufT8gPT4gKCAoey4uLn0/ID0+IChvdGhlcmx2XzY9ICdxdW90ZUNoYXJhY3RlcicgKCAobHZfcXVvdGVDaGFyYWN0ZXJfN18wPSBSVUxFX1NUUklORyApICkgKSApICkgKSB8ICh7Li4ufT8gPT4gKCAoey4uLn0/ID0+IChvdGhlcmx2Xzg9ICdza2lwTGluZXMnICggKGx2X3NraXBMaW5lc185XzA9IFJVTEVfSU5UICkgKSApICkgKSApIHwgKHsuLi59PyA9PiAoICh7Li4ufT8gPT4gKCAobHZfaW5kZW50XzEwXzA9ICdpbmRlbnQnICkgKSApICkgKSB8ICh7Li4ufT8gPT4gKCAoey4uLn0/ID0+IChvdGhlcmx2XzExPSAnZW5jb2RpbmcnICggKGx2X2VuY29kaW5nXzEyXzA9IFJVTEVfU1RSSU5HICkgKSApICkgKSApIHwgKHsuLi59PyA9PiAoICh7Li4ufT8gPT4gKG90aGVybHZfMTM9ICdsb2NhbGUnICggKGx2X2xvY2FsZV8xNF8wPSBSVUxFX1NUUklORyApICkgKSApICkgKSApKiApICkgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo2Nzg6MjogKCAoICgpIG90aGVybHZfMT0gJ0NTVicgKCAobHZfZmlsZVVSTF8yXzA9IFJVTEVfU1RSSU5HICkgKSAoICggKCAoICh7Li4ufT8gPT4gKCAoey4uLn0/ID0+IChvdGhlcmx2XzQ9ICdkZWxpbWl0ZXInICggKGx2X2RlbGltaXRlcl81XzA9IFJVTEVfU1RSSU5HICkgKSApICkgKSApIHwgKHsuLi59PyA9PiAoICh7Li4ufT8gPT4gKG90aGVybHZfNj0gJ3F1b3RlQ2hhcmFjdGVyJyAoIChsdl9xdW90ZUNoYXJhY3Rlcl83XzA9IFJVTEVfU1RSSU5HICkgKSApICkgKSApIHwgKHsuLi59PyA9PiAoICh7Li4ufT8gPT4gKG90aGVybHZfOD0gJ3NraXBMaW5lcycgKCAobHZfc2tpcExpbmVzXzlfMD0gUlVMRV9JTlQgKSApICkgKSApICkgfCAoey4uLn0/ID0+ICggKHsuLi59PyA9PiAoIChsdl9pbmRlbnRfMTBfMD0gJ2luZGVudCcgKSApICkgKSApIHwgKHsuLi59PyA9PiAoICh7Li4ufT8gPT4gKG90aGVybHZfMTE9ICdlbmNvZGluZycgKCAobHZfZW5jb2RpbmdfMTJfMD0gUlVMRV9TVFJJTkcgKSApICkgKSApICkgfCAoey4uLn0/ID0+ICggKHsuLi59PyA9PiAob3RoZXJsdl8xMz0gJ2xvY2FsZScgKCAobHZfbG9jYWxlXzE0XzA9IFJVTEVfU1RSSU5HICkgKSApICkgKSApICkqICkgKSApICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6Njc5OjI6ICggKCkgb3RoZXJsdl8xPSAnQ1NWJyAoIChsdl9maWxlVVJMXzJfMD0gUlVMRV9TVFJJTkcgKSApICggKCAoICggKHsuLi59PyA9PiAoICh7Li4ufT8gPT4gKG90aGVybHZfND0gJ2RlbGltaXRlcicgKCAobHZfZGVsaW1pdGVyXzVfMD0gUlVMRV9TVFJJTkcgKSApICkgKSApICkgfCAoey4uLn0/ID0+ICggKHsuLi59PyA9PiAob3RoZXJsdl82PSAncXVvdGVDaGFyYWN0ZXInICggKGx2X3F1b3RlQ2hhcmFjdGVyXzdfMD0gUlVMRV9TVFJJTkcgKSApICkgKSApICkgfCAoey4uLn0/ID0+ICggKHsuLi59PyA9PiAob3RoZXJsdl84PSAnc2tpcExpbmVzJyAoIChsdl9za2lwTGluZXNfOV8wPSBSVUxFX0lOVCApICkgKSApICkgKSB8ICh7Li4ufT8gPT4gKCAoey4uLn0/ID0+ICggKGx2X2luZGVudF8xMF8wPSAnaW5kZW50JyApICkgKSApICkgfCAoey4uLn0/ID0+ICggKHsuLi59PyA9PiAob3RoZXJsdl8xMT0gJ2VuY29kaW5nJyAoIChsdl9lbmNvZGluZ18xMl8wPSBSVUxFX1NUUklORyApICkgKSApICkgKSB8ICh7Li4ufT8gPT4gKCAoey4uLn0/ID0+IChvdGhlcmx2XzEzPSAnbG9jYWxlJyAoIChsdl9sb2NhbGVfMTRfMD0gUlVMRV9TVFJJTkcgKSApICkgKSApICkgKSogKSApICkgKQogICAgICAgICAgICAgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NjY1OjI6ICggKCkgb3RoZXJsdl8xPSAnQ1NWJyAoIChsdl9maWxlVVJMXzJfMD0gUlVMRV9TVFJJTkcgKSApICggKCAoICggKHsuLi59PyA9PiAoICh7Li4ufT8gPT4gKG90aGVybHZfND0gJ2RlbGltaXRlcicgKCAobHZfZGVsaW1pdGVyXzVfMD0gUlVMRV9TVFJJTkcgKSApICkgKSApICkgfCAoey4uLn0/ID0+ICggKHsuLi59PyA9PiAob3RoZXJsdl82PSAncXVvdGVDaGFyYWN0ZXInICggKGx2X3F1b3RlQ2hhcmFjdGVyXzdfMD0gUlVMRV9TVFJJTkcgKSApICkgKSApICkgfCAoey4uLn0/ID0+ICggKHsuLi59PyA9PiAob3RoZXJsdl84PSAnc2tpcExpbmVzJyAoIChsdl9za2lwTGluZXNfOV8wPSBSVUxFX0lOVCApICkgKSApICkgKSB8ICh7Li4ufT8gPT4gKCAoey4uLn0/ID0+ICggKGx2X2luZGVudF8xMF8wPSAnaW5kZW50JyApICkgKSApICkgfCAoey4uLn0/ID0+ICggKHsuLi59PyA9PiAob3RoZXJsdl8xMT0gJ2VuY29kaW5nJyAoIChsdl9lbmNvZGluZ18xMl8wPSBSVUxFX1NUUklORyApICkgKSApICkgKSB8ICh7Li4ufT8gPT4gKCAoey4uLn0/ID0+IChvdGhlcmx2XzEzPSAnbG9jYWxlJyAoIChsdl9sb2NhbGVfMTRfMD0gUlVMRV9TVFJJTkcgKSApICkgKSApICkgKSogKSApICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NjY2OjM6ICgpIG90aGVybHZfMT0gJ0NTVicgKCAobHZfZmlsZVVSTF8yXzA9IFJVTEVfU1RSSU5HICkgKSAoICggKCAoICh7Li4ufT8gPT4gKCAoey4uLn0/ID0+IChvdGhlcmx2XzQ9ICdkZWxpbWl0ZXInICggKGx2X2RlbGltaXRlcl81XzA9IFJVTEVfU1RSSU5HICkgKSApICkgKSApIHwgKHsuLi59PyA9PiAoICh7Li4ufT8gPT4gKG90aGVybHZfNj0gJ3F1b3RlQ2hhcmFjdGVyJyAoIChsdl9xdW90ZUNoYXJhY3Rlcl83XzA9IFJVTEVfU1RSSU5HICkgKSApICkgKSApIHwgKHsuLi59PyA9PiAoICh7Li4ufT8gPT4gKG90aGVybHZfOD0gJ3NraXBMaW5lcycgKCAobHZfc2tpcExpbmVzXzlfMD0gUlVMRV9JTlQgKSApICkgKSApICkgfCAoey4uLn0/ID0+ICggKHsuLi59PyA9PiAoIChsdl9pbmRlbnRfMTBfMD0gJ2luZGVudCcgKSApICkgKSApIHwgKHsuLi59PyA9PiAoICh7Li4ufT8gPT4gKG90aGVybHZfMTE9ICdlbmNvZGluZycgKCAobHZfZW5jb2RpbmdfMTJfMD0gUlVMRV9TVFJJTkcgKSApICkgKSApICkgfCAoey4uLn0/ID0+ICggKHsuLi59PyA9PiAob3RoZXJsdl8xMz0gJ2xvY2FsZScgKCAobHZfbG9jYWxlXzE0XzA9IFJVTEVfU1RSSU5HICkgKSApICkgKSApICkqICkgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo2Nzk6MjogKCAoKSBvdGhlcmx2XzE9ICdDU1YnICggKGx2X2ZpbGVVUkxfMl8wPSBSVUxFX1NUUklORyApICkgKCAoICggKCAoey4uLn0/ID0+ICggKHsuLi59PyA9PiAob3RoZXJsdl80PSAnZGVsaW1pdGVyJyAoIChsdl9kZWxpbWl0ZXJfNV8wPSBSVUxFX1NUUklORyApICkgKSApICkgKSB8ICh7Li4ufT8gPT4gKCAoey4uLn0/ID0+IChvdGhlcmx2XzY9ICdxdW90ZUNoYXJhY3RlcicgKCAobHZfcXVvdGVDaGFyYWN0ZXJfN18wPSBSVUxFX1NUUklORyApICkgKSApICkgKSB8ICh7Li4ufT8gPT4gKCAoey4uLn0/ID0+IChvdGhlcmx2Xzg9ICdza2lwTGluZXMnICggKGx2X3NraXBMaW5lc185XzA9IFJVTEVfSU5UICkgKSApICkgKSApIHwgKHsuLi59PyA9PiAoICh7Li4ufT8gPT4gKCAobHZfaW5kZW50XzEwXzA9ICdpbmRlbnQnICkgKSApICkgKSB8ICh7Li4ufT8gPT4gKCAoey4uLn0/ID0+IChvdGhlcmx2XzExPSAnZW5jb2RpbmcnICggKGx2X2VuY29kaW5nXzEyXzA9IFJVTEVfU1RSSU5HICkgKSApICkgKSApIHwgKHsuLi59PyA9PiAoICh7Li4ufT8gPT4gKG90aGVybHZfMTM9ICdsb2NhbGUnICggKGx2X2xvY2FsZV8xNF8wPSBSVUxFX1NUUklORyApICkgKSApICkgKSApKiApICkgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo2ODA6MzogKCkgb3RoZXJsdl8xPSAnQ1NWJyAoIChsdl9maWxlVVJMXzJfMD0gUlVMRV9TVFJJTkcgKSApICggKCAoICggKHsuLi59PyA9PiAoICh7Li4ufT8gPT4gKG90aGVybHZfND0gJ2RlbGltaXRlcicgKCAobHZfZGVsaW1pdGVyXzVfMD0gUlVMRV9TVFJJTkcgKSApICkgKSApICkgfCAoey4uLn0/ID0+ICggKHsuLi59PyA9PiAob3RoZXJsdl82PSAncXVvdGVDaGFyYWN0ZXInICggKGx2X3F1b3RlQ2hhcmFjdGVyXzdfMD0gUlVMRV9TVFJJTkcgKSApICkgKSApICkgfCAoey4uLn0/ID0+ICggKHsuLi59PyA9PiAob3RoZXJsdl84PSAnc2tpcExpbmVzJyAoIChsdl9za2lwTGluZXNfOV8wPSBSVUxFX0lOVCApICkgKSApICkgKSB8ICh7Li4ufT8gPT4gKCAoey4uLn0/ID0+ICggKGx2X2luZGVudF8xMF8wPSAnaW5kZW50JyApICkgKSApICkgfCAoey4uLn0/ID0+ICggKHsuLi59PyA9PiAob3RoZXJsdl8xMT0gJ2VuY29kaW5nJyAoIChsdl9lbmNvZGluZ18xMl8wPSBSVUxFX1NUUklORyApICkgKSApICkgKSB8ICh7Li4ufT8gPT4gKCAoey4uLn0/ID0+IChvdGhlcmx2XzEzPSAnbG9jYWxlJyAoIChsdl9sb2NhbGVfMTRfMD0gUlVMRV9TVFJJTkcgKSApICkgKSApICkgKSogKSApICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjY2NjozOiAoKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NjY3OjQ6IAorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NjgwOjM6ICgpCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo2ODE6NDogCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKIApAQCAtMTg1NSwxOSArMTkwNywxOSBAQAogCiAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgIG90aGVybHZfMT0oVG9rZW4pbWF0Y2goaW5wdXQsMjgsRk9MTE9XXzYpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gY3VycmVudDsKKyAgICAgICAgICAgIG90aGVybHZfMT0oVG9rZW4pbWF0Y2goaW5wdXQsMjksRk9MTE9XXzYpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gY3VycmVudDsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogCiAgICAgICAgICAgICAgIAkJCW5ld0xlYWZOb2RlKG90aGVybHZfMSwgZ3JhbW1hckFjY2Vzcy5nZXREYXRhSW50ZXJjaGFuZ2VGaWxlQ1NWQWNjZXNzKCkuZ2V0Q1NWS2V5d29yZF8xKCkpOwogICAgICAgICAgICAgICAJCQogICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6Njc3OjM6ICggKGx2X2ZpbGVVUkxfMl8wPSBSVUxFX1NUUklORyApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjY3ODo0OiAobHZfZmlsZVVSTF8yXzA9IFJVTEVfU1RSSU5HICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjY5MTozOiAoIChsdl9maWxlVVJMXzJfMD0gUlVMRV9TVFJJTkcgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo2OTI6NDogKGx2X2ZpbGVVUkxfMl8wPSBSVUxFX1NUUklORyApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo2Nzg6NDogKGx2X2ZpbGVVUkxfMl8wPSBSVUxFX1NUUklORyApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo2Nzk6NTogbHZfZmlsZVVSTF8yXzA9IFJVTEVfU1RSSU5HCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo2OTI6NDogKGx2X2ZpbGVVUkxfMl8wPSBSVUxFX1NUUklORyApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo2OTM6NTogbHZfZmlsZVVSTF8yXzA9IFJVTEVfU1RSSU5HCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICBsdl9maWxlVVJMXzJfMD0oVG9rZW4pbWF0Y2goaW5wdXQsUlVMRV9TVFJJTkcsRk9MTE9XXzIwKTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7CisgICAgICAgICAgICBsdl9maWxlVVJMXzJfMD0oVG9rZW4pbWF0Y2goaW5wdXQsUlVMRV9TVFJJTkcsRk9MTE9XXzIxKTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKIAogICAgICAgICAgICAgICAJCQkJCW5ld0xlYWZOb2RlKGx2X2ZpbGVVUkxfMl8wLCBncmFtbWFyQWNjZXNzLmdldERhdGFJbnRlcmNoYW5nZUZpbGVDU1ZBY2Nlc3MoKS5nZXRGaWxlVVJMU1RSSU5HVGVybWluYWxSdWxlQ2FsbF8yXzAoKSk7CkBAIC0xODkxLDgwICsxOTQzLDgwIEBACiAKICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6Njk1OjM6ICggKCAoICggKHsuLi59PyA9PiAoICh7Li4ufT8gPT4gKG90aGVybHZfND0gJ2RlbGltaXRlcicgKCAobHZfZGVsaW1pdGVyXzVfMD0gUlVMRV9TVFJJTkcgKSApICkgKSApICkgfCAoey4uLn0/ID0+ICggKHsuLi59PyA9PiAob3RoZXJsdl82PSAncXVvdGVDaGFyYWN0ZXInICggKGx2X3F1b3RlQ2hhcmFjdGVyXzdfMD0gUlVMRV9TVFJJTkcgKSApICkgKSApICkgfCAoey4uLn0/ID0+ICggKHsuLi59PyA9PiAob3RoZXJsdl84PSAnc2tpcExpbmVzJyAoIChsdl9za2lwTGluZXNfOV8wPSBSVUxFX0lOVCApICkgKSApICkgKSB8ICh7Li4ufT8gPT4gKCAoey4uLn0/ID0+ICggKGx2X2luZGVudF8xMF8wPSAnaW5kZW50JyApICkgKSApICkgfCAoey4uLn0/ID0+ICggKHsuLi59PyA9PiAob3RoZXJsdl8xMT0gJ2VuY29kaW5nJyAoIChsdl9lbmNvZGluZ18xMl8wPSBSVUxFX1NUUklORyApICkgKSApICkgKSB8ICh7Li4ufT8gPT4gKCAoey4uLn0/ID0+IChvdGhlcmx2XzEzPSAnbG9jYWxlJyAoIChsdl9sb2NhbGVfMTRfMD0gUlVMRV9TVFJJTkcgKSApICkgKSApICkgKSogKSApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjY5Njo0OiAoICggKCAoey4uLn0/ID0+ICggKHsuLi59PyA9PiAob3RoZXJsdl80PSAnZGVsaW1pdGVyJyAoIChsdl9kZWxpbWl0ZXJfNV8wPSBSVUxFX1NUUklORyApICkgKSApICkgKSB8ICh7Li4ufT8gPT4gKCAoey4uLn0/ID0+IChvdGhlcmx2XzY9ICdxdW90ZUNoYXJhY3RlcicgKCAobHZfcXVvdGVDaGFyYWN0ZXJfN18wPSBSVUxFX1NUUklORyApICkgKSApICkgKSB8ICh7Li4ufT8gPT4gKCAoey4uLn0/ID0+IChvdGhlcmx2Xzg9ICdza2lwTGluZXMnICggKGx2X3NraXBMaW5lc185XzA9IFJVTEVfSU5UICkgKSApICkgKSApIHwgKHsuLi59PyA9PiAoICh7Li4ufT8gPT4gKCAobHZfaW5kZW50XzEwXzA9ICdpbmRlbnQnICkgKSApICkgKSB8ICh7Li4ufT8gPT4gKCAoey4uLn0/ID0+IChvdGhlcmx2XzExPSAnZW5jb2RpbmcnICggKGx2X2VuY29kaW5nXzEyXzA9IFJVTEVfU1RSSU5HICkgKSApICkgKSApIHwgKHsuLi59PyA9PiAoICh7Li4ufT8gPT4gKG90aGVybHZfMTM9ICdsb2NhbGUnICggKGx2X2xvY2FsZV8xNF8wPSBSVUxFX1NUUklORyApICkgKSApICkgKSApKiApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjcwOTozOiAoICggKCAoICh7Li4ufT8gPT4gKCAoey4uLn0/ID0+IChvdGhlcmx2XzQ9ICdkZWxpbWl0ZXInICggKGx2X2RlbGltaXRlcl81XzA9IFJVTEVfU1RSSU5HICkgKSApICkgKSApIHwgKHsuLi59PyA9PiAoICh7Li4ufT8gPT4gKG90aGVybHZfNj0gJ3F1b3RlQ2hhcmFjdGVyJyAoIChsdl9xdW90ZUNoYXJhY3Rlcl83XzA9IFJVTEVfU1RSSU5HICkgKSApICkgKSApIHwgKHsuLi59PyA9PiAoICh7Li4ufT8gPT4gKG90aGVybHZfOD0gJ3NraXBMaW5lcycgKCAobHZfc2tpcExpbmVzXzlfMD0gUlVMRV9JTlQgKSApICkgKSApICkgfCAoey4uLn0/ID0+ICggKHsuLi59PyA9PiAoIChsdl9pbmRlbnRfMTBfMD0gJ2luZGVudCcgKSApICkgKSApIHwgKHsuLi59PyA9PiAoICh7Li4ufT8gPT4gKG90aGVybHZfMTE9ICdlbmNvZGluZycgKCAobHZfZW5jb2RpbmdfMTJfMD0gUlVMRV9TVFJJTkcgKSApICkgKSApICkgfCAoey4uLn0/ID0+ICggKHsuLi59PyA9PiAob3RoZXJsdl8xMz0gJ2xvY2FsZScgKCAobHZfbG9jYWxlXzE0XzA9IFJVTEVfU1RSSU5HICkgKSApICkgKSApICkqICkgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo3MTA6NDogKCAoICggKHsuLi59PyA9PiAoICh7Li4ufT8gPT4gKG90aGVybHZfND0gJ2RlbGltaXRlcicgKCAobHZfZGVsaW1pdGVyXzVfMD0gUlVMRV9TVFJJTkcgKSApICkgKSApICkgfCAoey4uLn0/ID0+ICggKHsuLi59PyA9PiAob3RoZXJsdl82PSAncXVvdGVDaGFyYWN0ZXInICggKGx2X3F1b3RlQ2hhcmFjdGVyXzdfMD0gUlVMRV9TVFJJTkcgKSApICkgKSApICkgfCAoey4uLn0/ID0+ICggKHsuLi59PyA9PiAob3RoZXJsdl84PSAnc2tpcExpbmVzJyAoIChsdl9za2lwTGluZXNfOV8wPSBSVUxFX0lOVCApICkgKSApICkgKSB8ICh7Li4ufT8gPT4gKCAoey4uLn0/ID0+ICggKGx2X2luZGVudF8xMF8wPSAnaW5kZW50JyApICkgKSApICkgfCAoey4uLn0/ID0+ICggKHsuLi59PyA9PiAob3RoZXJsdl8xMT0gJ2VuY29kaW5nJyAoIChsdl9lbmNvZGluZ18xMl8wPSBSVUxFX1NUUklORyApICkgKSApICkgKSB8ICh7Li4ufT8gPT4gKCAoey4uLn0/ID0+IChvdGhlcmx2XzEzPSAnbG9jYWxlJyAoIChsdl9sb2NhbGVfMTRfMD0gUlVMRV9TVFJJTkcgKSApICkgKSApICkgKSogKSApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo2OTY6NDogKCAoICggKHsuLi59PyA9PiAoICh7Li4ufT8gPT4gKG90aGVybHZfND0gJ2RlbGltaXRlcicgKCAobHZfZGVsaW1pdGVyXzVfMD0gUlVMRV9TVFJJTkcgKSApICkgKSApICkgfCAoey4uLn0/ID0+ICggKHsuLi59PyA9PiAob3RoZXJsdl82PSAncXVvdGVDaGFyYWN0ZXInICggKGx2X3F1b3RlQ2hhcmFjdGVyXzdfMD0gUlVMRV9TVFJJTkcgKSApICkgKSApICkgfCAoey4uLn0/ID0+ICggKHsuLi59PyA9PiAob3RoZXJsdl84PSAnc2tpcExpbmVzJyAoIChsdl9za2lwTGluZXNfOV8wPSBSVUxFX0lOVCApICkgKSApICkgKSB8ICh7Li4ufT8gPT4gKCAoey4uLn0/ID0+ICggKGx2X2luZGVudF8xMF8wPSAnaW5kZW50JyApICkgKSApICkgfCAoey4uLn0/ID0+ICggKHsuLi59PyA9PiAob3RoZXJsdl8xMT0gJ2VuY29kaW5nJyAoIChsdl9lbmNvZGluZ18xMl8wPSBSVUxFX1NUUklORyApICkgKSApICkgKSB8ICh7Li4ufT8gPT4gKCAoey4uLn0/ID0+IChvdGhlcmx2XzEzPSAnbG9jYWxlJyAoIChsdl9sb2NhbGVfMTRfMD0gUlVMRV9TVFJJTkcgKSApICkgKSApICkgKSogKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo2OTc6NTogKCAoICh7Li4ufT8gPT4gKCAoey4uLn0/ID0+IChvdGhlcmx2XzQ9ICdkZWxpbWl0ZXInICggKGx2X2RlbGltaXRlcl81XzA9IFJVTEVfU1RSSU5HICkgKSApICkgKSApIHwgKHsuLi59PyA9PiAoICh7Li4ufT8gPT4gKG90aGVybHZfNj0gJ3F1b3RlQ2hhcmFjdGVyJyAoIChsdl9xdW90ZUNoYXJhY3Rlcl83XzA9IFJVTEVfU1RSSU5HICkgKSApICkgKSApIHwgKHsuLi59PyA9PiAoICh7Li4ufT8gPT4gKG90aGVybHZfOD0gJ3NraXBMaW5lcycgKCAobHZfc2tpcExpbmVzXzlfMD0gUlVMRV9JTlQgKSApICkgKSApICkgfCAoey4uLn0/ID0+ICggKHsuLi59PyA9PiAoIChsdl9pbmRlbnRfMTBfMD0gJ2luZGVudCcgKSApICkgKSApIHwgKHsuLi59PyA9PiAoICh7Li4ufT8gPT4gKG90aGVybHZfMTE9ICdlbmNvZGluZycgKCAobHZfZW5jb2RpbmdfMTJfMD0gUlVMRV9TVFJJTkcgKSApICkgKSApICkgfCAoey4uLn0/ID0+ICggKHsuLi59PyA9PiAob3RoZXJsdl8xMz0gJ2xvY2FsZScgKCAobHZfbG9jYWxlXzE0XzA9IFJVTEVfU1RSSU5HICkgKSApICkgKSApICkqICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjcxMDo0OiAoICggKCAoey4uLn0/ID0+ICggKHsuLi59PyA9PiAob3RoZXJsdl80PSAnZGVsaW1pdGVyJyAoIChsdl9kZWxpbWl0ZXJfNV8wPSBSVUxFX1NUUklORyApICkgKSApICkgKSB8ICh7Li4ufT8gPT4gKCAoey4uLn0/ID0+IChvdGhlcmx2XzY9ICdxdW90ZUNoYXJhY3RlcicgKCAobHZfcXVvdGVDaGFyYWN0ZXJfN18wPSBSVUxFX1NUUklORyApICkgKSApICkgKSB8ICh7Li4ufT8gPT4gKCAoey4uLn0/ID0+IChvdGhlcmx2Xzg9ICdza2lwTGluZXMnICggKGx2X3NraXBMaW5lc185XzA9IFJVTEVfSU5UICkgKSApICkgKSApIHwgKHsuLi59PyA9PiAoICh7Li4ufT8gPT4gKCAobHZfaW5kZW50XzEwXzA9ICdpbmRlbnQnICkgKSApICkgKSB8ICh7Li4ufT8gPT4gKCAoey4uLn0/ID0+IChvdGhlcmx2XzExPSAnZW5jb2RpbmcnICggKGx2X2VuY29kaW5nXzEyXzA9IFJVTEVfU1RSSU5HICkgKSApICkgKSApIHwgKHsuLi59PyA9PiAoICh7Li4ufT8gPT4gKG90aGVybHZfMTM9ICdsb2NhbGUnICggKGx2X2xvY2FsZV8xNF8wPSBSVUxFX1NUUklORyApICkgKSApICkgKSApKiApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjcxMTo1OiAoICggKHsuLi59PyA9PiAoICh7Li4ufT8gPT4gKG90aGVybHZfND0gJ2RlbGltaXRlcicgKCAobHZfZGVsaW1pdGVyXzVfMD0gUlVMRV9TVFJJTkcgKSApICkgKSApICkgfCAoey4uLn0/ID0+ICggKHsuLi59PyA9PiAob3RoZXJsdl82PSAncXVvdGVDaGFyYWN0ZXInICggKGx2X3F1b3RlQ2hhcmFjdGVyXzdfMD0gUlVMRV9TVFJJTkcgKSApICkgKSApICkgfCAoey4uLn0/ID0+ICggKHsuLi59PyA9PiAob3RoZXJsdl84PSAnc2tpcExpbmVzJyAoIChsdl9za2lwTGluZXNfOV8wPSBSVUxFX0lOVCApICkgKSApICkgKSB8ICh7Li4ufT8gPT4gKCAoey4uLn0/ID0+ICggKGx2X2luZGVudF8xMF8wPSAnaW5kZW50JyApICkgKSApICkgfCAoey4uLn0/ID0+ICggKHsuLi59PyA9PiAob3RoZXJsdl8xMT0gJ2VuY29kaW5nJyAoIChsdl9lbmNvZGluZ18xMl8wPSBSVUxFX1NUUklORyApICkgKSApICkgKSB8ICh7Li4ufT8gPT4gKCAoey4uLn0/ID0+IChvdGhlcmx2XzEzPSAnbG9jYWxlJyAoIChsdl9sb2NhbGVfMTRfMD0gUlVMRV9TVFJJTkcgKSApICkgKSApICkgKSogKQogICAgICAgICAgICAgewogICAgICAgICAgICAgZ2V0VW5vcmRlcmVkR3JvdXBIZWxwZXIoKS5lbnRlcihncmFtbWFyQWNjZXNzLmdldERhdGFJbnRlcmNoYW5nZUZpbGVDU1ZBY2Nlc3MoKS5nZXRVbm9yZGVyZWRHcm91cF8zKCkpOwotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NzAwOjU6ICggKCAoey4uLn0/ID0+ICggKHsuLi59PyA9PiAob3RoZXJsdl80PSAnZGVsaW1pdGVyJyAoIChsdl9kZWxpbWl0ZXJfNV8wPSBSVUxFX1NUUklORyApICkgKSApICkgKSB8ICh7Li4ufT8gPT4gKCAoey4uLn0/ID0+IChvdGhlcmx2XzY9ICdxdW90ZUNoYXJhY3RlcicgKCAobHZfcXVvdGVDaGFyYWN0ZXJfN18wPSBSVUxFX1NUUklORyApICkgKSApICkgKSB8ICh7Li4ufT8gPT4gKCAoey4uLn0/ID0+IChvdGhlcmx2Xzg9ICdza2lwTGluZXMnICggKGx2X3NraXBMaW5lc185XzA9IFJVTEVfSU5UICkgKSApICkgKSApIHwgKHsuLi59PyA9PiAoICh7Li4ufT8gPT4gKCAobHZfaW5kZW50XzEwXzA9ICdpbmRlbnQnICkgKSApICkgKSB8ICh7Li4ufT8gPT4gKCAoey4uLn0/ID0+IChvdGhlcmx2XzExPSAnZW5jb2RpbmcnICggKGx2X2VuY29kaW5nXzEyXzA9IFJVTEVfU1RSSU5HICkgKSApICkgKSApIHwgKHsuLi59PyA9PiAoICh7Li4ufT8gPT4gKG90aGVybHZfMTM9ICdsb2NhbGUnICggKGx2X2xvY2FsZV8xNF8wPSBSVUxFX1NUUklORyApICkgKSApICkgKSApKiApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo3MDE6NjogKCAoey4uLn0/ID0+ICggKHsuLi59PyA9PiAob3RoZXJsdl80PSAnZGVsaW1pdGVyJyAoIChsdl9kZWxpbWl0ZXJfNV8wPSBSVUxFX1NUUklORyApICkgKSApICkgKSB8ICh7Li4ufT8gPT4gKCAoey4uLn0/ID0+IChvdGhlcmx2XzY9ICdxdW90ZUNoYXJhY3RlcicgKCAobHZfcXVvdGVDaGFyYWN0ZXJfN18wPSBSVUxFX1NUUklORyApICkgKSApICkgKSB8ICh7Li4ufT8gPT4gKCAoey4uLn0/ID0+IChvdGhlcmx2Xzg9ICdza2lwTGluZXMnICggKGx2X3NraXBMaW5lc185XzA9IFJVTEVfSU5UICkgKSApICkgKSApIHwgKHsuLi59PyA9PiAoICh7Li4ufT8gPT4gKCAobHZfaW5kZW50XzEwXzA9ICdpbmRlbnQnICkgKSApICkgKSB8ICh7Li4ufT8gPT4gKCAoey4uLn0/ID0+IChvdGhlcmx2XzExPSAnZW5jb2RpbmcnICggKGx2X2VuY29kaW5nXzEyXzA9IFJVTEVfU1RSSU5HICkgKSApICkgKSApIHwgKHsuLi59PyA9PiAoICh7Li4ufT8gPT4gKG90aGVybHZfMTM9ICdsb2NhbGUnICggKGx2X2xvY2FsZV8xNF8wPSBSVUxFX1NUUklORyApICkgKSApICkgKSApKgorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NzE0OjU6ICggKCAoey4uLn0/ID0+ICggKHsuLi59PyA9PiAob3RoZXJsdl80PSAnZGVsaW1pdGVyJyAoIChsdl9kZWxpbWl0ZXJfNV8wPSBSVUxFX1NUUklORyApICkgKSApICkgKSB8ICh7Li4ufT8gPT4gKCAoey4uLn0/ID0+IChvdGhlcmx2XzY9ICdxdW90ZUNoYXJhY3RlcicgKCAobHZfcXVvdGVDaGFyYWN0ZXJfN18wPSBSVUxFX1NUUklORyApICkgKSApICkgKSB8ICh7Li4ufT8gPT4gKCAoey4uLn0/ID0+IChvdGhlcmx2Xzg9ICdza2lwTGluZXMnICggKGx2X3NraXBMaW5lc185XzA9IFJVTEVfSU5UICkgKSApICkgKSApIHwgKHsuLi59PyA9PiAoICh7Li4ufT8gPT4gKCAobHZfaW5kZW50XzEwXzA9ICdpbmRlbnQnICkgKSApICkgKSB8ICh7Li4ufT8gPT4gKCAoey4uLn0/ID0+IChvdGhlcmx2XzExPSAnZW5jb2RpbmcnICggKGx2X2VuY29kaW5nXzEyXzA9IFJVTEVfU1RSSU5HICkgKSApICkgKSApIHwgKHsuLi59PyA9PiAoICh7Li4ufT8gPT4gKG90aGVybHZfMTM9ICdsb2NhbGUnICggKGx2X2xvY2FsZV8xNF8wPSBSVUxFX1NUUklORyApICkgKSApICkgKSApKiApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo3MTU6NjogKCAoey4uLn0/ID0+ICggKHsuLi59PyA9PiAob3RoZXJsdl80PSAnZGVsaW1pdGVyJyAoIChsdl9kZWxpbWl0ZXJfNV8wPSBSVUxFX1NUUklORyApICkgKSApICkgKSB8ICh7Li4ufT8gPT4gKCAoey4uLn0/ID0+IChvdGhlcmx2XzY9ICdxdW90ZUNoYXJhY3RlcicgKCAobHZfcXVvdGVDaGFyYWN0ZXJfN18wPSBSVUxFX1NUUklORyApICkgKSApICkgKSB8ICh7Li4ufT8gPT4gKCAoey4uLn0/ID0+IChvdGhlcmx2Xzg9ICdza2lwTGluZXMnICggKGx2X3NraXBMaW5lc185XzA9IFJVTEVfSU5UICkgKSApICkgKSApIHwgKHsuLi59PyA9PiAoICh7Li4ufT8gPT4gKCAobHZfaW5kZW50XzEwXzA9ICdpbmRlbnQnICkgKSApICkgKSB8ICh7Li4ufT8gPT4gKCAoey4uLn0/ID0+IChvdGhlcmx2XzExPSAnZW5jb2RpbmcnICggKGx2X2VuY29kaW5nXzEyXzA9IFJVTEVfU1RSSU5HICkgKSApICkgKSApIHwgKHsuLi59PyA9PiAoICh7Li4ufT8gPT4gKG90aGVybHZfMTM9ICdsb2NhbGUnICggKGx2X2xvY2FsZV8xNF8wPSBSVUxFX1NUUklORyApICkgKSApICkgKSApKgogICAgICAgICAgICAgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NzAxOjY6ICggKHsuLi59PyA9PiAoICh7Li4ufT8gPT4gKG90aGVybHZfND0gJ2RlbGltaXRlcicgKCAobHZfZGVsaW1pdGVyXzVfMD0gUlVMRV9TVFJJTkcgKSApICkgKSApICkgfCAoey4uLn0/ID0+ICggKHsuLi59PyA9PiAob3RoZXJsdl82PSAncXVvdGVDaGFyYWN0ZXInICggKGx2X3F1b3RlQ2hhcmFjdGVyXzdfMD0gUlVMRV9TVFJJTkcgKSApICkgKSApICkgfCAoey4uLn0/ID0+ICggKHsuLi59PyA9PiAob3RoZXJsdl84PSAnc2tpcExpbmVzJyAoIChsdl9za2lwTGluZXNfOV8wPSBSVUxFX0lOVCApICkgKSApICkgKSB8ICh7Li4ufT8gPT4gKCAoey4uLn0/ID0+ICggKGx2X2luZGVudF8xMF8wPSAnaW5kZW50JyApICkgKSApICkgfCAoey4uLn0/ID0+ICggKHsuLi59PyA9PiAob3RoZXJsdl8xMT0gJ2VuY29kaW5nJyAoIChsdl9lbmNvZGluZ18xMl8wPSBSVUxFX1NUUklORyApICkgKSApICkgKSB8ICh7Li4ufT8gPT4gKCAoey4uLn0/ID0+IChvdGhlcmx2XzEzPSAnbG9jYWxlJyAoIChsdl9sb2NhbGVfMTRfMD0gUlVMRV9TVFJJTkcgKSApICkgKSApICkgKSoKLSAgICAgICAgICAgIGxvb3AxMjoKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjcxNTo2OiAoICh7Li4ufT8gPT4gKCAoey4uLn0/ID0+IChvdGhlcmx2XzQ9ICdkZWxpbWl0ZXInICggKGx2X2RlbGltaXRlcl81XzA9IFJVTEVfU1RSSU5HICkgKSApICkgKSApIHwgKHsuLi59PyA9PiAoICh7Li4ufT8gPT4gKG90aGVybHZfNj0gJ3F1b3RlQ2hhcmFjdGVyJyAoIChsdl9xdW90ZUNoYXJhY3Rlcl83XzA9IFJVTEVfU1RSSU5HICkgKSApICkgKSApIHwgKHsuLi59PyA9PiAoICh7Li4ufT8gPT4gKG90aGVybHZfOD0gJ3NraXBMaW5lcycgKCAobHZfc2tpcExpbmVzXzlfMD0gUlVMRV9JTlQgKSApICkgKSApICkgfCAoey4uLn0/ID0+ICggKHsuLi59PyA9PiAoIChsdl9pbmRlbnRfMTBfMD0gJ2luZGVudCcgKSApICkgKSApIHwgKHsuLi59PyA9PiAoICh7Li4ufT8gPT4gKG90aGVybHZfMTE9ICdlbmNvZGluZycgKCAobHZfZW5jb2RpbmdfMTJfMD0gUlVMRV9TVFJJTkcgKSApICkgKSApICkgfCAoey4uLn0/ID0+ICggKHsuLi59PyA9PiAob3RoZXJsdl8xMz0gJ2xvY2FsZScgKCAobHZfbG9jYWxlXzE0XzA9IFJVTEVfU1RSSU5HICkgKSApICkgKSApICkqCisgICAgICAgICAgICBsb29wMTM6CiAgICAgICAgICAgICBkbyB7Ci0gICAgICAgICAgICAgICAgaW50IGFsdDEyPTc7Ci0gICAgICAgICAgICAgICAgaW50IExBMTJfMCA9IGlucHV0LkxBKDEpOworICAgICAgICAgICAgICAgIGludCBhbHQxMz03OworICAgICAgICAgICAgICAgIGludCBMQTEzXzAgPSBpbnB1dC5MQSgxKTsKIAotICAgICAgICAgICAgICAgIGlmICggTEExMl8wID09IDI5ICYmIGdldFVub3JkZXJlZEdyb3VwSGVscGVyKCkuY2FuU2VsZWN0KGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YUludGVyY2hhbmdlRmlsZUNTVkFjY2VzcygpLmdldFVub3JkZXJlZEdyb3VwXzMoKSwgMCkgKSB7Ci0gICAgICAgICAgICAgICAgICAgIGFsdDEyPTE7CisgICAgICAgICAgICAgICAgaWYgKCBMQTEzXzAgPT0gMzAgJiYgZ2V0VW5vcmRlcmVkR3JvdXBIZWxwZXIoKS5jYW5TZWxlY3QoZ3JhbW1hckFjY2Vzcy5nZXREYXRhSW50ZXJjaGFuZ2VGaWxlQ1NWQWNjZXNzKCkuZ2V0VW5vcmRlcmVkR3JvdXBfMygpLCAwKSApIHsKKyAgICAgICAgICAgICAgICAgICAgYWx0MTM9MTsKICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZSBpZiAoIExBMTJfMCA9PSAzMCAmJiBnZXRVbm9yZGVyZWRHcm91cEhlbHBlcigpLmNhblNlbGVjdChncmFtbWFyQWNjZXNzLmdldERhdGFJbnRlcmNoYW5nZUZpbGVDU1ZBY2Nlc3MoKS5nZXRVbm9yZGVyZWRHcm91cF8zKCksIDEpICkgewotICAgICAgICAgICAgICAgICAgICBhbHQxMj0yOworICAgICAgICAgICAgICAgIGVsc2UgaWYgKCBMQTEzXzAgPT0gMzEgJiYgZ2V0VW5vcmRlcmVkR3JvdXBIZWxwZXIoKS5jYW5TZWxlY3QoZ3JhbW1hckFjY2Vzcy5nZXREYXRhSW50ZXJjaGFuZ2VGaWxlQ1NWQWNjZXNzKCkuZ2V0VW5vcmRlcmVkR3JvdXBfMygpLCAxKSApIHsKKyAgICAgICAgICAgICAgICAgICAgYWx0MTM9MjsKICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZSBpZiAoIExBMTJfMCA9PSAzMSAmJiBnZXRVbm9yZGVyZWRHcm91cEhlbHBlcigpLmNhblNlbGVjdChncmFtbWFyQWNjZXNzLmdldERhdGFJbnRlcmNoYW5nZUZpbGVDU1ZBY2Nlc3MoKS5nZXRVbm9yZGVyZWRHcm91cF8zKCksIDIpICkgewotICAgICAgICAgICAgICAgICAgICBhbHQxMj0zOworICAgICAgICAgICAgICAgIGVsc2UgaWYgKCBMQTEzXzAgPT0gMzIgJiYgZ2V0VW5vcmRlcmVkR3JvdXBIZWxwZXIoKS5jYW5TZWxlY3QoZ3JhbW1hckFjY2Vzcy5nZXREYXRhSW50ZXJjaGFuZ2VGaWxlQ1NWQWNjZXNzKCkuZ2V0VW5vcmRlcmVkR3JvdXBfMygpLCAyKSApIHsKKyAgICAgICAgICAgICAgICAgICAgYWx0MTM9MzsKICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZSBpZiAoIExBMTJfMCA9PSAzMiAmJiBnZXRVbm9yZGVyZWRHcm91cEhlbHBlcigpLmNhblNlbGVjdChncmFtbWFyQWNjZXNzLmdldERhdGFJbnRlcmNoYW5nZUZpbGVDU1ZBY2Nlc3MoKS5nZXRVbm9yZGVyZWRHcm91cF8zKCksIDMpICkgewotICAgICAgICAgICAgICAgICAgICBhbHQxMj00OworICAgICAgICAgICAgICAgIGVsc2UgaWYgKCBMQTEzXzAgPT0gMzMgJiYgZ2V0VW5vcmRlcmVkR3JvdXBIZWxwZXIoKS5jYW5TZWxlY3QoZ3JhbW1hckFjY2Vzcy5nZXREYXRhSW50ZXJjaGFuZ2VGaWxlQ1NWQWNjZXNzKCkuZ2V0VW5vcmRlcmVkR3JvdXBfMygpLCAzKSApIHsKKyAgICAgICAgICAgICAgICAgICAgYWx0MTM9NDsKICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZSBpZiAoIExBMTJfMCA9PSAyNiAmJiBnZXRVbm9yZGVyZWRHcm91cEhlbHBlcigpLmNhblNlbGVjdChncmFtbWFyQWNjZXNzLmdldERhdGFJbnRlcmNoYW5nZUZpbGVDU1ZBY2Nlc3MoKS5nZXRVbm9yZGVyZWRHcm91cF8zKCksIDQpICkgewotICAgICAgICAgICAgICAgICAgICBhbHQxMj01OworICAgICAgICAgICAgICAgIGVsc2UgaWYgKCBMQTEzXzAgPT0gMjcgJiYgZ2V0VW5vcmRlcmVkR3JvdXBIZWxwZXIoKS5jYW5TZWxlY3QoZ3JhbW1hckFjY2Vzcy5nZXREYXRhSW50ZXJjaGFuZ2VGaWxlQ1NWQWNjZXNzKCkuZ2V0VW5vcmRlcmVkR3JvdXBfMygpLCA0KSApIHsKKyAgICAgICAgICAgICAgICAgICAgYWx0MTM9NTsKICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZSBpZiAoIExBMTJfMCA9PSAyNyAmJiBnZXRVbm9yZGVyZWRHcm91cEhlbHBlcigpLmNhblNlbGVjdChncmFtbWFyQWNjZXNzLmdldERhdGFJbnRlcmNoYW5nZUZpbGVDU1ZBY2Nlc3MoKS5nZXRVbm9yZGVyZWRHcm91cF8zKCksIDUpICkgewotICAgICAgICAgICAgICAgICAgICBhbHQxMj02OworICAgICAgICAgICAgICAgIGVsc2UgaWYgKCBMQTEzXzAgPT0gMjggJiYgZ2V0VW5vcmRlcmVkR3JvdXBIZWxwZXIoKS5jYW5TZWxlY3QoZ3JhbW1hckFjY2Vzcy5nZXREYXRhSW50ZXJjaGFuZ2VGaWxlQ1NWQWNjZXNzKCkuZ2V0VW5vcmRlcmVkR3JvdXBfMygpLCA1KSApIHsKKyAgICAgICAgICAgICAgICAgICAgYWx0MTM9NjsKICAgICAgICAgICAgICAgICB9CiAKIAotICAgICAgICAgICAgICAgIHN3aXRjaCAoYWx0MTIpIHsKKyAgICAgICAgICAgICAgICBzd2l0Y2ggKGFsdDEzKSB7CiAgICAgICAgICAgICAJY2FzZSAxIDoKLSAgICAgICAgICAgIAkgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NzAyOjQ6ICh7Li4ufT8gPT4gKCAoey4uLn0/ID0+IChvdGhlcmx2XzQ9ICdkZWxpbWl0ZXInICggKGx2X2RlbGltaXRlcl81XzA9IFJVTEVfU1RSSU5HICkgKSApICkgKSApCisgICAgICAgICAgICAJICAgIC8vIEludGVybmFsRGF0YURTTC5nOjcxNjo0OiAoey4uLn0/ID0+ICggKHsuLi59PyA9PiAob3RoZXJsdl80PSAnZGVsaW1pdGVyJyAoIChsdl9kZWxpbWl0ZXJfNV8wPSBSVUxFX1NUUklORyApICkgKSApICkgKQogICAgICAgICAgICAgCSAgICB7Ci0gICAgICAgICAgICAJICAgIC8vIEludGVybmFsRGF0YURTTC5nOjcwMjo0OiAoey4uLn0/ID0+ICggKHsuLi59PyA9PiAob3RoZXJsdl80PSAnZGVsaW1pdGVyJyAoIChsdl9kZWxpbWl0ZXJfNV8wPSBSVUxFX1NUUklORyApICkgKSApICkgKQotICAgICAgICAgICAgCSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo3MDM6NTogey4uLn0/ID0+ICggKHsuLi59PyA9PiAob3RoZXJsdl80PSAnZGVsaW1pdGVyJyAoIChsdl9kZWxpbWl0ZXJfNV8wPSBSVUxFX1NUUklORyApICkgKSApICkKKyAgICAgICAgICAgIAkgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NzE2OjQ6ICh7Li4ufT8gPT4gKCAoey4uLn0/ID0+IChvdGhlcmx2XzQ9ICdkZWxpbWl0ZXInICggKGx2X2RlbGltaXRlcl81XzA9IFJVTEVfU1RSSU5HICkgKSApICkgKSApCisgICAgICAgICAgICAJICAgIC8vIEludGVybmFsRGF0YURTTC5nOjcxNzo1OiB7Li4ufT8gPT4gKCAoey4uLn0/ID0+IChvdGhlcmx2XzQ9ICdkZWxpbWl0ZXInICggKGx2X2RlbGltaXRlcl81XzA9IFJVTEVfU1RSSU5HICkgKSApICkgKQogICAgICAgICAgICAgCSAgICB7CiAgICAgICAgICAgICAJICAgIGlmICggISBnZXRVbm9yZGVyZWRHcm91cEhlbHBlcigpLmNhblNlbGVjdChncmFtbWFyQWNjZXNzLmdldERhdGFJbnRlcmNoYW5nZUZpbGVDU1ZBY2Nlc3MoKS5nZXRVbm9yZGVyZWRHcm91cF8zKCksIDApICkgewogICAgICAgICAgICAgCSAgICAgICAgaWYgKHN0YXRlLmJhY2t0cmFja2luZz4wKSB7c3RhdGUuZmFpbGVkPXRydWU7IHJldHVybiBjdXJyZW50O30KICAgICAgICAgICAgIAkgICAgICAgIHRocm93IG5ldyBGYWlsZWRQcmVkaWNhdGVFeGNlcHRpb24oaW5wdXQsICJydWxlRGF0YUludGVyY2hhbmdlRmlsZUNTViIsICJnZXRVbm9yZGVyZWRHcm91cEhlbHBlcigpLmNhblNlbGVjdChncmFtbWFyQWNjZXNzLmdldERhdGFJbnRlcmNoYW5nZUZpbGVDU1ZBY2Nlc3MoKS5nZXRVbm9yZGVyZWRHcm91cF8zKCksIDApIik7CiAgICAgICAgICAgICAJICAgIH0KLSAgICAgICAgICAgIAkgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NzAzOjExOTogKCAoey4uLn0/ID0+IChvdGhlcmx2XzQ9ICdkZWxpbWl0ZXInICggKGx2X2RlbGltaXRlcl81XzA9IFJVTEVfU1RSSU5HICkgKSApICkgKQotICAgICAgICAgICAgCSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo3MDQ6NjogKHsuLi59PyA9PiAob3RoZXJsdl80PSAnZGVsaW1pdGVyJyAoIChsdl9kZWxpbWl0ZXJfNV8wPSBSVUxFX1NUUklORyApICkgKSApCisgICAgICAgICAgICAJICAgIC8vIEludGVybmFsRGF0YURTTC5nOjcxNzoxMTk6ICggKHsuLi59PyA9PiAob3RoZXJsdl80PSAnZGVsaW1pdGVyJyAoIChsdl9kZWxpbWl0ZXJfNV8wPSBSVUxFX1NUUklORyApICkgKSApICkKKyAgICAgICAgICAgIAkgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NzE4OjY6ICh7Li4ufT8gPT4gKG90aGVybHZfND0gJ2RlbGltaXRlcicgKCAobHZfZGVsaW1pdGVyXzVfMD0gUlVMRV9TVFJJTkcgKSApICkgKQogICAgICAgICAgICAgCSAgICB7CiAgICAgICAgICAgICAJICAgIGdldFVub3JkZXJlZEdyb3VwSGVscGVyKCkuc2VsZWN0KGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YUludGVyY2hhbmdlRmlsZUNTVkFjY2VzcygpLmdldFVub3JkZXJlZEdyb3VwXzMoKSwgMCk7Ci0gICAgICAgICAgICAJICAgIC8vIEludGVybmFsRGF0YURTTC5nOjcwNzo5OiAoey4uLn0/ID0+IChvdGhlcmx2XzQ9ICdkZWxpbWl0ZXInICggKGx2X2RlbGltaXRlcl81XzA9IFJVTEVfU1RSSU5HICkgKSApICkKLSAgICAgICAgICAgIAkgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NzA3OjEwOiB7Li4ufT8gPT4gKG90aGVybHZfND0gJ2RlbGltaXRlcicgKCAobHZfZGVsaW1pdGVyXzVfMD0gUlVMRV9TVFJJTkcgKSApICkKKyAgICAgICAgICAgIAkgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NzIxOjk6ICh7Li4ufT8gPT4gKG90aGVybHZfND0gJ2RlbGltaXRlcicgKCAobHZfZGVsaW1pdGVyXzVfMD0gUlVMRV9TVFJJTkcgKSApICkgKQorICAgICAgICAgICAgCSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo3MjE6MTA6IHsuLi59PyA9PiAob3RoZXJsdl80PSAnZGVsaW1pdGVyJyAoIChsdl9kZWxpbWl0ZXJfNV8wPSBSVUxFX1NUUklORyApICkgKQogICAgICAgICAgICAgCSAgICB7CiAgICAgICAgICAgICAJICAgIGlmICggISgodHJ1ZSkpICkgewogICAgICAgICAgICAgCSAgICAgICAgaWYgKHN0YXRlLmJhY2t0cmFja2luZz4wKSB7c3RhdGUuZmFpbGVkPXRydWU7IHJldHVybiBjdXJyZW50O30KICAgICAgICAgICAgIAkgICAgICAgIHRocm93IG5ldyBGYWlsZWRQcmVkaWNhdGVFeGNlcHRpb24oaW5wdXQsICJydWxlRGF0YUludGVyY2hhbmdlRmlsZUNTViIsICJ0cnVlIik7CiAgICAgICAgICAgICAJICAgIH0KLSAgICAgICAgICAgIAkgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NzA3OjE5OiAob3RoZXJsdl80PSAnZGVsaW1pdGVyJyAoIChsdl9kZWxpbWl0ZXJfNV8wPSBSVUxFX1NUUklORyApICkgKQotICAgICAgICAgICAgCSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo3MDc6MjA6IG90aGVybHZfND0gJ2RlbGltaXRlcicgKCAobHZfZGVsaW1pdGVyXzVfMD0gUlVMRV9TVFJJTkcgKSApCisgICAgICAgICAgICAJICAgIC8vIEludGVybmFsRGF0YURTTC5nOjcyMToxOTogKG90aGVybHZfND0gJ2RlbGltaXRlcicgKCAobHZfZGVsaW1pdGVyXzVfMD0gUlVMRV9TVFJJTkcgKSApICkKKyAgICAgICAgICAgIAkgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NzIxOjIwOiBvdGhlcmx2XzQ9ICdkZWxpbWl0ZXInICggKGx2X2RlbGltaXRlcl81XzA9IFJVTEVfU1RSSU5HICkgKQogICAgICAgICAgICAgCSAgICB7Ci0gICAgICAgICAgICAJICAgIG90aGVybHZfND0oVG9rZW4pbWF0Y2goaW5wdXQsMjksRk9MTE9XXzYpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gY3VycmVudDsKKyAgICAgICAgICAgIAkgICAgb3RoZXJsdl80PShUb2tlbiltYXRjaChpbnB1dCwzMCxGT0xMT1dfNik7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OwogICAgICAgICAgICAgCSAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKIAogICAgICAgICAgICAgCSAgICAgIAkJCQkJCQkJCW5ld0xlYWZOb2RlKG90aGVybHZfNCwgZ3JhbW1hckFjY2Vzcy5nZXREYXRhSW50ZXJjaGFuZ2VGaWxlQ1NWQWNjZXNzKCkuZ2V0RGVsaW1pdGVyS2V5d29yZF8zXzBfMCgpKTsKICAgICAgICAgICAgIAkgICAgICAJCQkJCQkJCQogICAgICAgICAgICAgCSAgICB9Ci0gICAgICAgICAgICAJICAgIC8vIEludGVybmFsRGF0YURTTC5nOjcxMTo5OiAoIChsdl9kZWxpbWl0ZXJfNV8wPSBSVUxFX1NUUklORyApICkKLSAgICAgICAgICAgIAkgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NzEyOjEwOiAobHZfZGVsaW1pdGVyXzVfMD0gUlVMRV9TVFJJTkcgKQorICAgICAgICAgICAgCSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo3MjU6OTogKCAobHZfZGVsaW1pdGVyXzVfMD0gUlVMRV9TVFJJTkcgKSApCisgICAgICAgICAgICAJICAgIC8vIEludGVybmFsRGF0YURTTC5nOjcyNjoxMDogKGx2X2RlbGltaXRlcl81XzA9IFJVTEVfU1RSSU5HICkKICAgICAgICAgICAgIAkgICAgewotICAgICAgICAgICAgCSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo3MTI6MTA6IChsdl9kZWxpbWl0ZXJfNV8wPSBSVUxFX1NUUklORyApCi0gICAgICAgICAgICAJICAgIC8vIEludGVybmFsRGF0YURTTC5nOjcxMzoxMTogbHZfZGVsaW1pdGVyXzVfMD0gUlVMRV9TVFJJTkcKKyAgICAgICAgICAgIAkgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NzI2OjEwOiAobHZfZGVsaW1pdGVyXzVfMD0gUlVMRV9TVFJJTkcgKQorICAgICAgICAgICAgCSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo3Mjc6MTE6IGx2X2RlbGltaXRlcl81XzA9IFJVTEVfU1RSSU5HCiAgICAgICAgICAgICAJICAgIHsKLSAgICAgICAgICAgIAkgICAgbHZfZGVsaW1pdGVyXzVfMD0oVG9rZW4pbWF0Y2goaW5wdXQsUlVMRV9TVFJJTkcsRk9MTE9XXzIwKTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7CisgICAgICAgICAgICAJICAgIGx2X2RlbGltaXRlcl81XzA9KFRva2VuKW1hdGNoKGlucHV0LFJVTEVfU1RSSU5HLEZPTExPV18yMSk7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OwogICAgICAgICAgICAgCSAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKIAogICAgICAgICAgICAgCSAgICAgIAkJCQkJCQkJCQkJbmV3TGVhZk5vZGUobHZfZGVsaW1pdGVyXzVfMCwgZ3JhbW1hckFjY2Vzcy5nZXREYXRhSW50ZXJjaGFuZ2VGaWxlQ1NWQWNjZXNzKCkuZ2V0RGVsaW1pdGVyU1RSSU5HVGVybWluYWxSdWxlQ2FsbF8zXzBfMV8wKCkpOwpAQCAtMjAwNSw0MiArMjA1Nyw0MiBAQAogICAgICAgICAgICAgCSAgICB9CiAgICAgICAgICAgICAJICAgIGJyZWFrOwogICAgICAgICAgICAgCWNhc2UgMiA6Ci0gICAgICAgICAgICAJICAgIC8vIEludGVybmFsRGF0YURTTC5nOjczNTo0OiAoey4uLn0/ID0+ICggKHsuLi59PyA9PiAob3RoZXJsdl82PSAncXVvdGVDaGFyYWN0ZXInICggKGx2X3F1b3RlQ2hhcmFjdGVyXzdfMD0gUlVMRV9TVFJJTkcgKSApICkgKSApICkKKyAgICAgICAgICAgIAkgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NzQ5OjQ6ICh7Li4ufT8gPT4gKCAoey4uLn0/ID0+IChvdGhlcmx2XzY9ICdxdW90ZUNoYXJhY3RlcicgKCAobHZfcXVvdGVDaGFyYWN0ZXJfN18wPSBSVUxFX1NUUklORyApICkgKSApICkgKQogICAgICAgICAgICAgCSAgICB7Ci0gICAgICAgICAgICAJICAgIC8vIEludGVybmFsRGF0YURTTC5nOjczNTo0OiAoey4uLn0/ID0+ICggKHsuLi59PyA9PiAob3RoZXJsdl82PSAncXVvdGVDaGFyYWN0ZXInICggKGx2X3F1b3RlQ2hhcmFjdGVyXzdfMD0gUlVMRV9TVFJJTkcgKSApICkgKSApICkKLSAgICAgICAgICAgIAkgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NzM2OjU6IHsuLi59PyA9PiAoICh7Li4ufT8gPT4gKG90aGVybHZfNj0gJ3F1b3RlQ2hhcmFjdGVyJyAoIChsdl9xdW90ZUNoYXJhY3Rlcl83XzA9IFJVTEVfU1RSSU5HICkgKSApICkgKQorICAgICAgICAgICAgCSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo3NDk6NDogKHsuLi59PyA9PiAoICh7Li4ufT8gPT4gKG90aGVybHZfNj0gJ3F1b3RlQ2hhcmFjdGVyJyAoIChsdl9xdW90ZUNoYXJhY3Rlcl83XzA9IFJVTEVfU1RSSU5HICkgKSApICkgKSApCisgICAgICAgICAgICAJICAgIC8vIEludGVybmFsRGF0YURTTC5nOjc1MDo1OiB7Li4ufT8gPT4gKCAoey4uLn0/ID0+IChvdGhlcmx2XzY9ICdxdW90ZUNoYXJhY3RlcicgKCAobHZfcXVvdGVDaGFyYWN0ZXJfN18wPSBSVUxFX1NUUklORyApICkgKSApICkKICAgICAgICAgICAgIAkgICAgewogICAgICAgICAgICAgCSAgICBpZiAoICEgZ2V0VW5vcmRlcmVkR3JvdXBIZWxwZXIoKS5jYW5TZWxlY3QoZ3JhbW1hckFjY2Vzcy5nZXREYXRhSW50ZXJjaGFuZ2VGaWxlQ1NWQWNjZXNzKCkuZ2V0VW5vcmRlcmVkR3JvdXBfMygpLCAxKSApIHsKICAgICAgICAgICAgIAkgICAgICAgIGlmIChzdGF0ZS5iYWNrdHJhY2tpbmc+MCkge3N0YXRlLmZhaWxlZD10cnVlOyByZXR1cm4gY3VycmVudDt9CiAgICAgICAgICAgICAJICAgICAgICB0aHJvdyBuZXcgRmFpbGVkUHJlZGljYXRlRXhjZXB0aW9uKGlucHV0LCAicnVsZURhdGFJbnRlcmNoYW5nZUZpbGVDU1YiLCAiZ2V0VW5vcmRlcmVkR3JvdXBIZWxwZXIoKS5jYW5TZWxlY3QoZ3JhbW1hckFjY2Vzcy5nZXREYXRhSW50ZXJjaGFuZ2VGaWxlQ1NWQWNjZXNzKCkuZ2V0VW5vcmRlcmVkR3JvdXBfMygpLCAxKSIpOwogICAgICAgICAgICAgCSAgICB9Ci0gICAgICAgICAgICAJICAgIC8vIEludGVybmFsRGF0YURTTC5nOjczNjoxMTk6ICggKHsuLi59PyA9PiAob3RoZXJsdl82PSAncXVvdGVDaGFyYWN0ZXInICggKGx2X3F1b3RlQ2hhcmFjdGVyXzdfMD0gUlVMRV9TVFJJTkcgKSApICkgKSApCi0gICAgICAgICAgICAJICAgIC8vIEludGVybmFsRGF0YURTTC5nOjczNzo2OiAoey4uLn0/ID0+IChvdGhlcmx2XzY9ICdxdW90ZUNoYXJhY3RlcicgKCAobHZfcXVvdGVDaGFyYWN0ZXJfN18wPSBSVUxFX1NUUklORyApICkgKSApCisgICAgICAgICAgICAJICAgIC8vIEludGVybmFsRGF0YURTTC5nOjc1MDoxMTk6ICggKHsuLi59PyA9PiAob3RoZXJsdl82PSAncXVvdGVDaGFyYWN0ZXInICggKGx2X3F1b3RlQ2hhcmFjdGVyXzdfMD0gUlVMRV9TVFJJTkcgKSApICkgKSApCisgICAgICAgICAgICAJICAgIC8vIEludGVybmFsRGF0YURTTC5nOjc1MTo2OiAoey4uLn0/ID0+IChvdGhlcmx2XzY9ICdxdW90ZUNoYXJhY3RlcicgKCAobHZfcXVvdGVDaGFyYWN0ZXJfN18wPSBSVUxFX1NUUklORyApICkgKSApCiAgICAgICAgICAgICAJICAgIHsKICAgICAgICAgICAgIAkgICAgZ2V0VW5vcmRlcmVkR3JvdXBIZWxwZXIoKS5zZWxlY3QoZ3JhbW1hckFjY2Vzcy5nZXREYXRhSW50ZXJjaGFuZ2VGaWxlQ1NWQWNjZXNzKCkuZ2V0VW5vcmRlcmVkR3JvdXBfMygpLCAxKTsKLSAgICAgICAgICAgIAkgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NzQwOjk6ICh7Li4ufT8gPT4gKG90aGVybHZfNj0gJ3F1b3RlQ2hhcmFjdGVyJyAoIChsdl9xdW90ZUNoYXJhY3Rlcl83XzA9IFJVTEVfU1RSSU5HICkgKSApICkKLSAgICAgICAgICAgIAkgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NzQwOjEwOiB7Li4ufT8gPT4gKG90aGVybHZfNj0gJ3F1b3RlQ2hhcmFjdGVyJyAoIChsdl9xdW90ZUNoYXJhY3Rlcl83XzA9IFJVTEVfU1RSSU5HICkgKSApCisgICAgICAgICAgICAJICAgIC8vIEludGVybmFsRGF0YURTTC5nOjc1NDo5OiAoey4uLn0/ID0+IChvdGhlcmx2XzY9ICdxdW90ZUNoYXJhY3RlcicgKCAobHZfcXVvdGVDaGFyYWN0ZXJfN18wPSBSVUxFX1NUUklORyApICkgKSApCisgICAgICAgICAgICAJICAgIC8vIEludGVybmFsRGF0YURTTC5nOjc1NDoxMDogey4uLn0/ID0+IChvdGhlcmx2XzY9ICdxdW90ZUNoYXJhY3RlcicgKCAobHZfcXVvdGVDaGFyYWN0ZXJfN18wPSBSVUxFX1NUUklORyApICkgKQogICAgICAgICAgICAgCSAgICB7CiAgICAgICAgICAgICAJICAgIGlmICggISgodHJ1ZSkpICkgewogICAgICAgICAgICAgCSAgICAgICAgaWYgKHN0YXRlLmJhY2t0cmFja2luZz4wKSB7c3RhdGUuZmFpbGVkPXRydWU7IHJldHVybiBjdXJyZW50O30KICAgICAgICAgICAgIAkgICAgICAgIHRocm93IG5ldyBGYWlsZWRQcmVkaWNhdGVFeGNlcHRpb24oaW5wdXQsICJydWxlRGF0YUludGVyY2hhbmdlRmlsZUNTViIsICJ0cnVlIik7CiAgICAgICAgICAgICAJICAgIH0KLSAgICAgICAgICAgIAkgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NzQwOjE5OiAob3RoZXJsdl82PSAncXVvdGVDaGFyYWN0ZXInICggKGx2X3F1b3RlQ2hhcmFjdGVyXzdfMD0gUlVMRV9TVFJJTkcgKSApICkKLSAgICAgICAgICAgIAkgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NzQwOjIwOiBvdGhlcmx2XzY9ICdxdW90ZUNoYXJhY3RlcicgKCAobHZfcXVvdGVDaGFyYWN0ZXJfN18wPSBSVUxFX1NUUklORyApICkKKyAgICAgICAgICAgIAkgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NzU0OjE5OiAob3RoZXJsdl82PSAncXVvdGVDaGFyYWN0ZXInICggKGx2X3F1b3RlQ2hhcmFjdGVyXzdfMD0gUlVMRV9TVFJJTkcgKSApICkKKyAgICAgICAgICAgIAkgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NzU0OjIwOiBvdGhlcmx2XzY9ICdxdW90ZUNoYXJhY3RlcicgKCAobHZfcXVvdGVDaGFyYWN0ZXJfN18wPSBSVUxFX1NUUklORyApICkKICAgICAgICAgICAgIAkgICAgewotICAgICAgICAgICAgCSAgICBvdGhlcmx2XzY9KFRva2VuKW1hdGNoKGlucHV0LDMwLEZPTExPV182KTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7CisgICAgICAgICAgICAJICAgIG90aGVybHZfNj0oVG9rZW4pbWF0Y2goaW5wdXQsMzEsRk9MTE9XXzYpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gY3VycmVudDsKICAgICAgICAgICAgIAkgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAKICAgICAgICAgICAgIAkgICAgICAJCQkJCQkJCQluZXdMZWFmTm9kZShvdGhlcmx2XzYsIGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YUludGVyY2hhbmdlRmlsZUNTVkFjY2VzcygpLmdldFF1b3RlQ2hhcmFjdGVyS2V5d29yZF8zXzFfMCgpKTsKICAgICAgICAgICAgIAkgICAgICAJCQkJCQkJCQogICAgICAgICAgICAgCSAgICB9Ci0gICAgICAgICAgICAJICAgIC8vIEludGVybmFsRGF0YURTTC5nOjc0NDo5OiAoIChsdl9xdW90ZUNoYXJhY3Rlcl83XzA9IFJVTEVfU1RSSU5HICkgKQotICAgICAgICAgICAgCSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo3NDU6MTA6IChsdl9xdW90ZUNoYXJhY3Rlcl83XzA9IFJVTEVfU1RSSU5HICkKKyAgICAgICAgICAgIAkgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NzU4Ojk6ICggKGx2X3F1b3RlQ2hhcmFjdGVyXzdfMD0gUlVMRV9TVFJJTkcgKSApCisgICAgICAgICAgICAJICAgIC8vIEludGVybmFsRGF0YURTTC5nOjc1OToxMDogKGx2X3F1b3RlQ2hhcmFjdGVyXzdfMD0gUlVMRV9TVFJJTkcgKQogICAgICAgICAgICAgCSAgICB7Ci0gICAgICAgICAgICAJICAgIC8vIEludGVybmFsRGF0YURTTC5nOjc0NToxMDogKGx2X3F1b3RlQ2hhcmFjdGVyXzdfMD0gUlVMRV9TVFJJTkcgKQotICAgICAgICAgICAgCSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo3NDY6MTE6IGx2X3F1b3RlQ2hhcmFjdGVyXzdfMD0gUlVMRV9TVFJJTkcKKyAgICAgICAgICAgIAkgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NzU5OjEwOiAobHZfcXVvdGVDaGFyYWN0ZXJfN18wPSBSVUxFX1NUUklORyApCisgICAgICAgICAgICAJICAgIC8vIEludGVybmFsRGF0YURTTC5nOjc2MDoxMTogbHZfcXVvdGVDaGFyYWN0ZXJfN18wPSBSVUxFX1NUUklORwogICAgICAgICAgICAgCSAgICB7Ci0gICAgICAgICAgICAJICAgIGx2X3F1b3RlQ2hhcmFjdGVyXzdfMD0oVG9rZW4pbWF0Y2goaW5wdXQsUlVMRV9TVFJJTkcsRk9MTE9XXzIwKTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7CisgICAgICAgICAgICAJICAgIGx2X3F1b3RlQ2hhcmFjdGVyXzdfMD0oVG9rZW4pbWF0Y2goaW5wdXQsUlVMRV9TVFJJTkcsRk9MTE9XXzIxKTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7CiAgICAgICAgICAgICAJICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogCiAgICAgICAgICAgICAJICAgICAgCQkJCQkJCQkJCQluZXdMZWFmTm9kZShsdl9xdW90ZUNoYXJhY3Rlcl83XzAsIGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YUludGVyY2hhbmdlRmlsZUNTVkFjY2VzcygpLmdldFF1b3RlQ2hhcmFjdGVyU1RSSU5HVGVybWluYWxSdWxlQ2FsbF8zXzFfMV8wKCkpOwpAQCAtMjA4MSw0MiArMjEzMyw0MiBAQAogICAgICAgICAgICAgCSAgICB9CiAgICAgICAgICAgICAJICAgIGJyZWFrOwogICAgICAgICAgICAgCWNhc2UgMyA6Ci0gICAgICAgICAgICAJICAgIC8vIEludGVybmFsRGF0YURTTC5nOjc2ODo0OiAoey4uLn0/ID0+ICggKHsuLi59PyA9PiAob3RoZXJsdl84PSAnc2tpcExpbmVzJyAoIChsdl9za2lwTGluZXNfOV8wPSBSVUxFX0lOVCApICkgKSApICkgKQorICAgICAgICAgICAgCSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo3ODI6NDogKHsuLi59PyA9PiAoICh7Li4ufT8gPT4gKG90aGVybHZfOD0gJ3NraXBMaW5lcycgKCAobHZfc2tpcExpbmVzXzlfMD0gUlVMRV9JTlQgKSApICkgKSApICkKICAgICAgICAgICAgIAkgICAgewotICAgICAgICAgICAgCSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo3Njg6NDogKHsuLi59PyA9PiAoICh7Li4ufT8gPT4gKG90aGVybHZfOD0gJ3NraXBMaW5lcycgKCAobHZfc2tpcExpbmVzXzlfMD0gUlVMRV9JTlQgKSApICkgKSApICkKLSAgICAgICAgICAgIAkgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NzY5OjU6IHsuLi59PyA9PiAoICh7Li4ufT8gPT4gKG90aGVybHZfOD0gJ3NraXBMaW5lcycgKCAobHZfc2tpcExpbmVzXzlfMD0gUlVMRV9JTlQgKSApICkgKSApCisgICAgICAgICAgICAJICAgIC8vIEludGVybmFsRGF0YURTTC5nOjc4Mjo0OiAoey4uLn0/ID0+ICggKHsuLi59PyA9PiAob3RoZXJsdl84PSAnc2tpcExpbmVzJyAoIChsdl9za2lwTGluZXNfOV8wPSBSVUxFX0lOVCApICkgKSApICkgKQorICAgICAgICAgICAgCSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo3ODM6NTogey4uLn0/ID0+ICggKHsuLi59PyA9PiAob3RoZXJsdl84PSAnc2tpcExpbmVzJyAoIChsdl9za2lwTGluZXNfOV8wPSBSVUxFX0lOVCApICkgKSApICkKICAgICAgICAgICAgIAkgICAgewogICAgICAgICAgICAgCSAgICBpZiAoICEgZ2V0VW5vcmRlcmVkR3JvdXBIZWxwZXIoKS5jYW5TZWxlY3QoZ3JhbW1hckFjY2Vzcy5nZXREYXRhSW50ZXJjaGFuZ2VGaWxlQ1NWQWNjZXNzKCkuZ2V0VW5vcmRlcmVkR3JvdXBfMygpLCAyKSApIHsKICAgICAgICAgICAgIAkgICAgICAgIGlmIChzdGF0ZS5iYWNrdHJhY2tpbmc+MCkge3N0YXRlLmZhaWxlZD10cnVlOyByZXR1cm4gY3VycmVudDt9CiAgICAgICAgICAgICAJICAgICAgICB0aHJvdyBuZXcgRmFpbGVkUHJlZGljYXRlRXhjZXB0aW9uKGlucHV0LCAicnVsZURhdGFJbnRlcmNoYW5nZUZpbGVDU1YiLCAiZ2V0VW5vcmRlcmVkR3JvdXBIZWxwZXIoKS5jYW5TZWxlY3QoZ3JhbW1hckFjY2Vzcy5nZXREYXRhSW50ZXJjaGFuZ2VGaWxlQ1NWQWNjZXNzKCkuZ2V0VW5vcmRlcmVkR3JvdXBfMygpLCAyKSIpOwogICAgICAgICAgICAgCSAgICB9Ci0gICAgICAgICAgICAJICAgIC8vIEludGVybmFsRGF0YURTTC5nOjc2OToxMTk6ICggKHsuLi59PyA9PiAob3RoZXJsdl84PSAnc2tpcExpbmVzJyAoIChsdl9za2lwTGluZXNfOV8wPSBSVUxFX0lOVCApICkgKSApICkKLSAgICAgICAgICAgIAkgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NzcwOjY6ICh7Li4ufT8gPT4gKG90aGVybHZfOD0gJ3NraXBMaW5lcycgKCAobHZfc2tpcExpbmVzXzlfMD0gUlVMRV9JTlQgKSApICkgKQorICAgICAgICAgICAgCSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo3ODM6MTE5OiAoICh7Li4ufT8gPT4gKG90aGVybHZfOD0gJ3NraXBMaW5lcycgKCAobHZfc2tpcExpbmVzXzlfMD0gUlVMRV9JTlQgKSApICkgKSApCisgICAgICAgICAgICAJICAgIC8vIEludGVybmFsRGF0YURTTC5nOjc4NDo2OiAoey4uLn0/ID0+IChvdGhlcmx2Xzg9ICdza2lwTGluZXMnICggKGx2X3NraXBMaW5lc185XzA9IFJVTEVfSU5UICkgKSApICkKICAgICAgICAgICAgIAkgICAgewogICAgICAgICAgICAgCSAgICBnZXRVbm9yZGVyZWRHcm91cEhlbHBlcigpLnNlbGVjdChncmFtbWFyQWNjZXNzLmdldERhdGFJbnRlcmNoYW5nZUZpbGVDU1ZBY2Nlc3MoKS5nZXRVbm9yZGVyZWRHcm91cF8zKCksIDIpOwotICAgICAgICAgICAgCSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo3NzM6OTogKHsuLi59PyA9PiAob3RoZXJsdl84PSAnc2tpcExpbmVzJyAoIChsdl9za2lwTGluZXNfOV8wPSBSVUxFX0lOVCApICkgKSApCi0gICAgICAgICAgICAJICAgIC8vIEludGVybmFsRGF0YURTTC5nOjc3MzoxMDogey4uLn0/ID0+IChvdGhlcmx2Xzg9ICdza2lwTGluZXMnICggKGx2X3NraXBMaW5lc185XzA9IFJVTEVfSU5UICkgKSApCisgICAgICAgICAgICAJICAgIC8vIEludGVybmFsRGF0YURTTC5nOjc4Nzo5OiAoey4uLn0/ID0+IChvdGhlcmx2Xzg9ICdza2lwTGluZXMnICggKGx2X3NraXBMaW5lc185XzA9IFJVTEVfSU5UICkgKSApICkKKyAgICAgICAgICAgIAkgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6Nzg3OjEwOiB7Li4ufT8gPT4gKG90aGVybHZfOD0gJ3NraXBMaW5lcycgKCAobHZfc2tpcExpbmVzXzlfMD0gUlVMRV9JTlQgKSApICkKICAgICAgICAgICAgIAkgICAgewogICAgICAgICAgICAgCSAgICBpZiAoICEoKHRydWUpKSApIHsKICAgICAgICAgICAgIAkgICAgICAgIGlmIChzdGF0ZS5iYWNrdHJhY2tpbmc+MCkge3N0YXRlLmZhaWxlZD10cnVlOyByZXR1cm4gY3VycmVudDt9CiAgICAgICAgICAgICAJICAgICAgICB0aHJvdyBuZXcgRmFpbGVkUHJlZGljYXRlRXhjZXB0aW9uKGlucHV0LCAicnVsZURhdGFJbnRlcmNoYW5nZUZpbGVDU1YiLCAidHJ1ZSIpOwogICAgICAgICAgICAgCSAgICB9Ci0gICAgICAgICAgICAJICAgIC8vIEludGVybmFsRGF0YURTTC5nOjc3MzoxOTogKG90aGVybHZfOD0gJ3NraXBMaW5lcycgKCAobHZfc2tpcExpbmVzXzlfMD0gUlVMRV9JTlQgKSApICkKLSAgICAgICAgICAgIAkgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NzczOjIwOiBvdGhlcmx2Xzg9ICdza2lwTGluZXMnICggKGx2X3NraXBMaW5lc185XzA9IFJVTEVfSU5UICkgKQorICAgICAgICAgICAgCSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo3ODc6MTk6IChvdGhlcmx2Xzg9ICdza2lwTGluZXMnICggKGx2X3NraXBMaW5lc185XzA9IFJVTEVfSU5UICkgKSApCisgICAgICAgICAgICAJICAgIC8vIEludGVybmFsRGF0YURTTC5nOjc4NzoyMDogb3RoZXJsdl84PSAnc2tpcExpbmVzJyAoIChsdl9za2lwTGluZXNfOV8wPSBSVUxFX0lOVCApICkKICAgICAgICAgICAgIAkgICAgewotICAgICAgICAgICAgCSAgICBvdGhlcmx2Xzg9KFRva2VuKW1hdGNoKGlucHV0LDMxLEZPTExPV18xMyk7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OworICAgICAgICAgICAgCSAgICBvdGhlcmx2Xzg9KFRva2VuKW1hdGNoKGlucHV0LDMyLEZPTExPV18xMyk7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OwogICAgICAgICAgICAgCSAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKIAogICAgICAgICAgICAgCSAgICAgIAkJCQkJCQkJCW5ld0xlYWZOb2RlKG90aGVybHZfOCwgZ3JhbW1hckFjY2Vzcy5nZXREYXRhSW50ZXJjaGFuZ2VGaWxlQ1NWQWNjZXNzKCkuZ2V0U2tpcExpbmVzS2V5d29yZF8zXzJfMCgpKTsKICAgICAgICAgICAgIAkgICAgICAJCQkJCQkJCQogICAgICAgICAgICAgCSAgICB9Ci0gICAgICAgICAgICAJICAgIC8vIEludGVybmFsRGF0YURTTC5nOjc3Nzo5OiAoIChsdl9za2lwTGluZXNfOV8wPSBSVUxFX0lOVCApICkKLSAgICAgICAgICAgIAkgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6Nzc4OjEwOiAobHZfc2tpcExpbmVzXzlfMD0gUlVMRV9JTlQgKQorICAgICAgICAgICAgCSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo3OTE6OTogKCAobHZfc2tpcExpbmVzXzlfMD0gUlVMRV9JTlQgKSApCisgICAgICAgICAgICAJICAgIC8vIEludGVybmFsRGF0YURTTC5nOjc5MjoxMDogKGx2X3NraXBMaW5lc185XzA9IFJVTEVfSU5UICkKICAgICAgICAgICAgIAkgICAgewotICAgICAgICAgICAgCSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo3Nzg6MTA6IChsdl9za2lwTGluZXNfOV8wPSBSVUxFX0lOVCApCi0gICAgICAgICAgICAJICAgIC8vIEludGVybmFsRGF0YURTTC5nOjc3OToxMTogbHZfc2tpcExpbmVzXzlfMD0gUlVMRV9JTlQKKyAgICAgICAgICAgIAkgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NzkyOjEwOiAobHZfc2tpcExpbmVzXzlfMD0gUlVMRV9JTlQgKQorICAgICAgICAgICAgCSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo3OTM6MTE6IGx2X3NraXBMaW5lc185XzA9IFJVTEVfSU5UCiAgICAgICAgICAgICAJICAgIHsKLSAgICAgICAgICAgIAkgICAgbHZfc2tpcExpbmVzXzlfMD0oVG9rZW4pbWF0Y2goaW5wdXQsUlVMRV9JTlQsRk9MTE9XXzIwKTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7CisgICAgICAgICAgICAJICAgIGx2X3NraXBMaW5lc185XzA9KFRva2VuKW1hdGNoKGlucHV0LFJVTEVfSU5ULEZPTExPV18yMSk7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OwogICAgICAgICAgICAgCSAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKIAogICAgICAgICAgICAgCSAgICAgIAkJCQkJCQkJCQkJbmV3TGVhZk5vZGUobHZfc2tpcExpbmVzXzlfMCwgZ3JhbW1hckFjY2Vzcy5nZXREYXRhSW50ZXJjaGFuZ2VGaWxlQ1NWQWNjZXNzKCkuZ2V0U2tpcExpbmVzSU5UVGVybWluYWxSdWxlQ2FsbF8zXzJfMV8wKCkpOwpAQCAtMjE1NywzMyArMjIwOSwzMyBAQAogICAgICAgICAgICAgCSAgICB9CiAgICAgICAgICAgICAJICAgIGJyZWFrOwogICAgICAgICAgICAgCWNhc2UgNCA6Ci0gICAgICAgICAgICAJICAgIC8vIEludGVybmFsRGF0YURTTC5nOjgwMTo0OiAoey4uLn0/ID0+ICggKHsuLi59PyA9PiAoIChsdl9pbmRlbnRfMTBfMD0gJ2luZGVudCcgKSApICkgKSApCisgICAgICAgICAgICAJICAgIC8vIEludGVybmFsRGF0YURTTC5nOjgxNTo0OiAoey4uLn0/ID0+ICggKHsuLi59PyA9PiAoIChsdl9pbmRlbnRfMTBfMD0gJ2luZGVudCcgKSApICkgKSApCiAgICAgICAgICAgICAJICAgIHsKLSAgICAgICAgICAgIAkgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6ODAxOjQ6ICh7Li4ufT8gPT4gKCAoey4uLn0/ID0+ICggKGx2X2luZGVudF8xMF8wPSAnaW5kZW50JyApICkgKSApICkKLSAgICAgICAgICAgIAkgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6ODAyOjU6IHsuLi59PyA9PiAoICh7Li4ufT8gPT4gKCAobHZfaW5kZW50XzEwXzA9ICdpbmRlbnQnICkgKSApICkKKyAgICAgICAgICAgIAkgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6ODE1OjQ6ICh7Li4ufT8gPT4gKCAoey4uLn0/ID0+ICggKGx2X2luZGVudF8xMF8wPSAnaW5kZW50JyApICkgKSApICkKKyAgICAgICAgICAgIAkgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6ODE2OjU6IHsuLi59PyA9PiAoICh7Li4ufT8gPT4gKCAobHZfaW5kZW50XzEwXzA9ICdpbmRlbnQnICkgKSApICkKICAgICAgICAgICAgIAkgICAgewogICAgICAgICAgICAgCSAgICBpZiAoICEgZ2V0VW5vcmRlcmVkR3JvdXBIZWxwZXIoKS5jYW5TZWxlY3QoZ3JhbW1hckFjY2Vzcy5nZXREYXRhSW50ZXJjaGFuZ2VGaWxlQ1NWQWNjZXNzKCkuZ2V0VW5vcmRlcmVkR3JvdXBfMygpLCAzKSApIHsKICAgICAgICAgICAgIAkgICAgICAgIGlmIChzdGF0ZS5iYWNrdHJhY2tpbmc+MCkge3N0YXRlLmZhaWxlZD10cnVlOyByZXR1cm4gY3VycmVudDt9CiAgICAgICAgICAgICAJICAgICAgICB0aHJvdyBuZXcgRmFpbGVkUHJlZGljYXRlRXhjZXB0aW9uKGlucHV0LCAicnVsZURhdGFJbnRlcmNoYW5nZUZpbGVDU1YiLCAiZ2V0VW5vcmRlcmVkR3JvdXBIZWxwZXIoKS5jYW5TZWxlY3QoZ3JhbW1hckFjY2Vzcy5nZXREYXRhSW50ZXJjaGFuZ2VGaWxlQ1NWQWNjZXNzKCkuZ2V0VW5vcmRlcmVkR3JvdXBfMygpLCAzKSIpOwogICAgICAgICAgICAgCSAgICB9Ci0gICAgICAgICAgICAJICAgIC8vIEludGVybmFsRGF0YURTTC5nOjgwMjoxMTk6ICggKHsuLi59PyA9PiAoIChsdl9pbmRlbnRfMTBfMD0gJ2luZGVudCcgKSApICkgKQotICAgICAgICAgICAgCSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo4MDM6NjogKHsuLi59PyA9PiAoIChsdl9pbmRlbnRfMTBfMD0gJ2luZGVudCcgKSApICkKKyAgICAgICAgICAgIAkgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6ODE2OjExOTogKCAoey4uLn0/ID0+ICggKGx2X2luZGVudF8xMF8wPSAnaW5kZW50JyApICkgKSApCisgICAgICAgICAgICAJICAgIC8vIEludGVybmFsRGF0YURTTC5nOjgxNzo2OiAoey4uLn0/ID0+ICggKGx2X2luZGVudF8xMF8wPSAnaW5kZW50JyApICkgKQogICAgICAgICAgICAgCSAgICB7CiAgICAgICAgICAgICAJICAgIGdldFVub3JkZXJlZEdyb3VwSGVscGVyKCkuc2VsZWN0KGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YUludGVyY2hhbmdlRmlsZUNTVkFjY2VzcygpLmdldFVub3JkZXJlZEdyb3VwXzMoKSwgMyk7Ci0gICAgICAgICAgICAJICAgIC8vIEludGVybmFsRGF0YURTTC5nOjgwNjo5OiAoey4uLn0/ID0+ICggKGx2X2luZGVudF8xMF8wPSAnaW5kZW50JyApICkgKQotICAgICAgICAgICAgCSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo4MDY6MTA6IHsuLi59PyA9PiAoIChsdl9pbmRlbnRfMTBfMD0gJ2luZGVudCcgKSApCisgICAgICAgICAgICAJICAgIC8vIEludGVybmFsRGF0YURTTC5nOjgyMDo5OiAoey4uLn0/ID0+ICggKGx2X2luZGVudF8xMF8wPSAnaW5kZW50JyApICkgKQorICAgICAgICAgICAgCSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo4MjA6MTA6IHsuLi59PyA9PiAoIChsdl9pbmRlbnRfMTBfMD0gJ2luZGVudCcgKSApCiAgICAgICAgICAgICAJICAgIHsKICAgICAgICAgICAgIAkgICAgaWYgKCAhKCh0cnVlKSkgKSB7CiAgICAgICAgICAgICAJICAgICAgICBpZiAoc3RhdGUuYmFja3RyYWNraW5nPjApIHtzdGF0ZS5mYWlsZWQ9dHJ1ZTsgcmV0dXJuIGN1cnJlbnQ7fQogICAgICAgICAgICAgCSAgICAgICAgdGhyb3cgbmV3IEZhaWxlZFByZWRpY2F0ZUV4Y2VwdGlvbihpbnB1dCwgInJ1bGVEYXRhSW50ZXJjaGFuZ2VGaWxlQ1NWIiwgInRydWUiKTsKICAgICAgICAgICAgIAkgICAgfQotICAgICAgICAgICAgCSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo4MDY6MTk6ICggKGx2X2luZGVudF8xMF8wPSAnaW5kZW50JyApICkKLSAgICAgICAgICAgIAkgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6ODA2OjIwOiAobHZfaW5kZW50XzEwXzA9ICdpbmRlbnQnICkKKyAgICAgICAgICAgIAkgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6ODIwOjE5OiAoIChsdl9pbmRlbnRfMTBfMD0gJ2luZGVudCcgKSApCisgICAgICAgICAgICAJICAgIC8vIEludGVybmFsRGF0YURTTC5nOjgyMDoyMDogKGx2X2luZGVudF8xMF8wPSAnaW5kZW50JyApCiAgICAgICAgICAgICAJICAgIHsKLSAgICAgICAgICAgIAkgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6ODA2OjIwOiAobHZfaW5kZW50XzEwXzA9ICdpbmRlbnQnICkKLSAgICAgICAgICAgIAkgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6ODA3OjEwOiBsdl9pbmRlbnRfMTBfMD0gJ2luZGVudCcKKyAgICAgICAgICAgIAkgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6ODIwOjIwOiAobHZfaW5kZW50XzEwXzA9ICdpbmRlbnQnICkKKyAgICAgICAgICAgIAkgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6ODIxOjEwOiBsdl9pbmRlbnRfMTBfMD0gJ2luZGVudCcKICAgICAgICAgICAgIAkgICAgewotICAgICAgICAgICAgCSAgICBsdl9pbmRlbnRfMTBfMD0oVG9rZW4pbWF0Y2goaW5wdXQsMzIsRk9MTE9XXzIwKTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7CisgICAgICAgICAgICAJICAgIGx2X2luZGVudF8xMF8wPShUb2tlbiltYXRjaChpbnB1dCwzMyxGT0xMT1dfMjEpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gY3VycmVudDsKICAgICAgICAgICAgIAkgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAKICAgICAgICAgICAgIAkgICAgICAJCQkJCQkJCQkJbmV3TGVhZk5vZGUobHZfaW5kZW50XzEwXzAsIGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YUludGVyY2hhbmdlRmlsZUNTVkFjY2VzcygpLmdldEluZGVudEluZGVudEtleXdvcmRfM18zXzAoKSk7CkBAIC0yMjE3LDQyICsyMjY5LDQyIEBACiAgICAgICAgICAgICAJICAgIH0KICAgICAgICAgICAgIAkgICAgYnJlYWs7CiAgICAgICAgICAgICAJY2FzZSA1IDoKLSAgICAgICAgICAgIAkgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6ODI0OjQ6ICh7Li4ufT8gPT4gKCAoey4uLn0/ID0+IChvdGhlcmx2XzExPSAnZW5jb2RpbmcnICggKGx2X2VuY29kaW5nXzEyXzA9IFJVTEVfU1RSSU5HICkgKSApICkgKSApCisgICAgICAgICAgICAJICAgIC8vIEludGVybmFsRGF0YURTTC5nOjgzODo0OiAoey4uLn0/ID0+ICggKHsuLi59PyA9PiAob3RoZXJsdl8xMT0gJ2VuY29kaW5nJyAoIChsdl9lbmNvZGluZ18xMl8wPSBSVUxFX1NUUklORyApICkgKSApICkgKQogICAgICAgICAgICAgCSAgICB7Ci0gICAgICAgICAgICAJICAgIC8vIEludGVybmFsRGF0YURTTC5nOjgyNDo0OiAoey4uLn0/ID0+ICggKHsuLi59PyA9PiAob3RoZXJsdl8xMT0gJ2VuY29kaW5nJyAoIChsdl9lbmNvZGluZ18xMl8wPSBSVUxFX1NUUklORyApICkgKSApICkgKQotICAgICAgICAgICAgCSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo4MjU6NTogey4uLn0/ID0+ICggKHsuLi59PyA9PiAob3RoZXJsdl8xMT0gJ2VuY29kaW5nJyAoIChsdl9lbmNvZGluZ18xMl8wPSBSVUxFX1NUUklORyApICkgKSApICkKKyAgICAgICAgICAgIAkgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6ODM4OjQ6ICh7Li4ufT8gPT4gKCAoey4uLn0/ID0+IChvdGhlcmx2XzExPSAnZW5jb2RpbmcnICggKGx2X2VuY29kaW5nXzEyXzA9IFJVTEVfU1RSSU5HICkgKSApICkgKSApCisgICAgICAgICAgICAJICAgIC8vIEludGVybmFsRGF0YURTTC5nOjgzOTo1OiB7Li4ufT8gPT4gKCAoey4uLn0/ID0+IChvdGhlcmx2XzExPSAnZW5jb2RpbmcnICggKGx2X2VuY29kaW5nXzEyXzA9IFJVTEVfU1RSSU5HICkgKSApICkgKQogICAgICAgICAgICAgCSAgICB7CiAgICAgICAgICAgICAJICAgIGlmICggISBnZXRVbm9yZGVyZWRHcm91cEhlbHBlcigpLmNhblNlbGVjdChncmFtbWFyQWNjZXNzLmdldERhdGFJbnRlcmNoYW5nZUZpbGVDU1ZBY2Nlc3MoKS5nZXRVbm9yZGVyZWRHcm91cF8zKCksIDQpICkgewogICAgICAgICAgICAgCSAgICAgICAgaWYgKHN0YXRlLmJhY2t0cmFja2luZz4wKSB7c3RhdGUuZmFpbGVkPXRydWU7IHJldHVybiBjdXJyZW50O30KICAgICAgICAgICAgIAkgICAgICAgIHRocm93IG5ldyBGYWlsZWRQcmVkaWNhdGVFeGNlcHRpb24oaW5wdXQsICJydWxlRGF0YUludGVyY2hhbmdlRmlsZUNTViIsICJnZXRVbm9yZGVyZWRHcm91cEhlbHBlcigpLmNhblNlbGVjdChncmFtbWFyQWNjZXNzLmdldERhdGFJbnRlcmNoYW5nZUZpbGVDU1ZBY2Nlc3MoKS5nZXRVbm9yZGVyZWRHcm91cF8zKCksIDQpIik7CiAgICAgICAgICAgICAJICAgIH0KLSAgICAgICAgICAgIAkgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6ODI1OjExOTogKCAoey4uLn0/ID0+IChvdGhlcmx2XzExPSAnZW5jb2RpbmcnICggKGx2X2VuY29kaW5nXzEyXzA9IFJVTEVfU1RSSU5HICkgKSApICkgKQotICAgICAgICAgICAgCSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo4MjY6NjogKHsuLi59PyA9PiAob3RoZXJsdl8xMT0gJ2VuY29kaW5nJyAoIChsdl9lbmNvZGluZ18xMl8wPSBSVUxFX1NUUklORyApICkgKSApCisgICAgICAgICAgICAJICAgIC8vIEludGVybmFsRGF0YURTTC5nOjgzOToxMTk6ICggKHsuLi59PyA9PiAob3RoZXJsdl8xMT0gJ2VuY29kaW5nJyAoIChsdl9lbmNvZGluZ18xMl8wPSBSVUxFX1NUUklORyApICkgKSApICkKKyAgICAgICAgICAgIAkgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6ODQwOjY6ICh7Li4ufT8gPT4gKG90aGVybHZfMTE9ICdlbmNvZGluZycgKCAobHZfZW5jb2RpbmdfMTJfMD0gUlVMRV9TVFJJTkcgKSApICkgKQogICAgICAgICAgICAgCSAgICB7CiAgICAgICAgICAgICAJICAgIGdldFVub3JkZXJlZEdyb3VwSGVscGVyKCkuc2VsZWN0KGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YUludGVyY2hhbmdlRmlsZUNTVkFjY2VzcygpLmdldFVub3JkZXJlZEdyb3VwXzMoKSwgNCk7Ci0gICAgICAgICAgICAJICAgIC8vIEludGVybmFsRGF0YURTTC5nOjgyOTo5OiAoey4uLn0/ID0+IChvdGhlcmx2XzExPSAnZW5jb2RpbmcnICggKGx2X2VuY29kaW5nXzEyXzA9IFJVTEVfU1RSSU5HICkgKSApICkKLSAgICAgICAgICAgIAkgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6ODI5OjEwOiB7Li4ufT8gPT4gKG90aGVybHZfMTE9ICdlbmNvZGluZycgKCAobHZfZW5jb2RpbmdfMTJfMD0gUlVMRV9TVFJJTkcgKSApICkKKyAgICAgICAgICAgIAkgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6ODQzOjk6ICh7Li4ufT8gPT4gKG90aGVybHZfMTE9ICdlbmNvZGluZycgKCAobHZfZW5jb2RpbmdfMTJfMD0gUlVMRV9TVFJJTkcgKSApICkgKQorICAgICAgICAgICAgCSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo4NDM6MTA6IHsuLi59PyA9PiAob3RoZXJsdl8xMT0gJ2VuY29kaW5nJyAoIChsdl9lbmNvZGluZ18xMl8wPSBSVUxFX1NUUklORyApICkgKQogICAgICAgICAgICAgCSAgICB7CiAgICAgICAgICAgICAJICAgIGlmICggISgodHJ1ZSkpICkgewogICAgICAgICAgICAgCSAgICAgICAgaWYgKHN0YXRlLmJhY2t0cmFja2luZz4wKSB7c3RhdGUuZmFpbGVkPXRydWU7IHJldHVybiBjdXJyZW50O30KICAgICAgICAgICAgIAkgICAgICAgIHRocm93IG5ldyBGYWlsZWRQcmVkaWNhdGVFeGNlcHRpb24oaW5wdXQsICJydWxlRGF0YUludGVyY2hhbmdlRmlsZUNTViIsICJ0cnVlIik7CiAgICAgICAgICAgICAJICAgIH0KLSAgICAgICAgICAgIAkgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6ODI5OjE5OiAob3RoZXJsdl8xMT0gJ2VuY29kaW5nJyAoIChsdl9lbmNvZGluZ18xMl8wPSBSVUxFX1NUUklORyApICkgKQotICAgICAgICAgICAgCSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo4Mjk6MjA6IG90aGVybHZfMTE9ICdlbmNvZGluZycgKCAobHZfZW5jb2RpbmdfMTJfMD0gUlVMRV9TVFJJTkcgKSApCisgICAgICAgICAgICAJICAgIC8vIEludGVybmFsRGF0YURTTC5nOjg0MzoxOTogKG90aGVybHZfMTE9ICdlbmNvZGluZycgKCAobHZfZW5jb2RpbmdfMTJfMD0gUlVMRV9TVFJJTkcgKSApICkKKyAgICAgICAgICAgIAkgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6ODQzOjIwOiBvdGhlcmx2XzExPSAnZW5jb2RpbmcnICggKGx2X2VuY29kaW5nXzEyXzA9IFJVTEVfU1RSSU5HICkgKQogICAgICAgICAgICAgCSAgICB7Ci0gICAgICAgICAgICAJICAgIG90aGVybHZfMTE9KFRva2VuKW1hdGNoKGlucHV0LDI2LEZPTExPV182KTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7CisgICAgICAgICAgICAJICAgIG90aGVybHZfMTE9KFRva2VuKW1hdGNoKGlucHV0LDI3LEZPTExPV182KTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7CiAgICAgICAgICAgICAJICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogCiAgICAgICAgICAgICAJICAgICAgCQkJCQkJCQkJbmV3TGVhZk5vZGUob3RoZXJsdl8xMSwgZ3JhbW1hckFjY2Vzcy5nZXREYXRhSW50ZXJjaGFuZ2VGaWxlQ1NWQWNjZXNzKCkuZ2V0RW5jb2RpbmdLZXl3b3JkXzNfNF8wKCkpOwogICAgICAgICAgICAgCSAgICAgIAkJCQkJCQkJCiAgICAgICAgICAgICAJICAgIH0KLSAgICAgICAgICAgIAkgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6ODMzOjk6ICggKGx2X2VuY29kaW5nXzEyXzA9IFJVTEVfU1RSSU5HICkgKQotICAgICAgICAgICAgCSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo4MzQ6MTA6IChsdl9lbmNvZGluZ18xMl8wPSBSVUxFX1NUUklORyApCisgICAgICAgICAgICAJICAgIC8vIEludGVybmFsRGF0YURTTC5nOjg0Nzo5OiAoIChsdl9lbmNvZGluZ18xMl8wPSBSVUxFX1NUUklORyApICkKKyAgICAgICAgICAgIAkgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6ODQ4OjEwOiAobHZfZW5jb2RpbmdfMTJfMD0gUlVMRV9TVFJJTkcgKQogICAgICAgICAgICAgCSAgICB7Ci0gICAgICAgICAgICAJICAgIC8vIEludGVybmFsRGF0YURTTC5nOjgzNDoxMDogKGx2X2VuY29kaW5nXzEyXzA9IFJVTEVfU1RSSU5HICkKLSAgICAgICAgICAgIAkgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6ODM1OjExOiBsdl9lbmNvZGluZ18xMl8wPSBSVUxFX1NUUklORworICAgICAgICAgICAgCSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo4NDg6MTA6IChsdl9lbmNvZGluZ18xMl8wPSBSVUxFX1NUUklORyApCisgICAgICAgICAgICAJICAgIC8vIEludGVybmFsRGF0YURTTC5nOjg0OToxMTogbHZfZW5jb2RpbmdfMTJfMD0gUlVMRV9TVFJJTkcKICAgICAgICAgICAgIAkgICAgewotICAgICAgICAgICAgCSAgICBsdl9lbmNvZGluZ18xMl8wPShUb2tlbiltYXRjaChpbnB1dCxSVUxFX1NUUklORyxGT0xMT1dfMjApOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gY3VycmVudDsKKyAgICAgICAgICAgIAkgICAgbHZfZW5jb2RpbmdfMTJfMD0oVG9rZW4pbWF0Y2goaW5wdXQsUlVMRV9TVFJJTkcsRk9MTE9XXzIxKTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7CiAgICAgICAgICAgICAJICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogCiAgICAgICAgICAgICAJICAgICAgCQkJCQkJCQkJCQluZXdMZWFmTm9kZShsdl9lbmNvZGluZ18xMl8wLCBncmFtbWFyQWNjZXNzLmdldERhdGFJbnRlcmNoYW5nZUZpbGVDU1ZBY2Nlc3MoKS5nZXRFbmNvZGluZ1NUUklOR1Rlcm1pbmFsUnVsZUNhbGxfM180XzFfMCgpKTsKQEAgLTIyOTMsNDIgKzIzNDUsNDIgQEAKICAgICAgICAgICAgIAkgICAgfQogICAgICAgICAgICAgCSAgICBicmVhazsKICAgICAgICAgICAgIAljYXNlIDYgOgotICAgICAgICAgICAgCSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo4NTc6NDogKHsuLi59PyA9PiAoICh7Li4ufT8gPT4gKG90aGVybHZfMTM9ICdsb2NhbGUnICggKGx2X2xvY2FsZV8xNF8wPSBSVUxFX1NUUklORyApICkgKSApICkgKQorICAgICAgICAgICAgCSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo4NzE6NDogKHsuLi59PyA9PiAoICh7Li4ufT8gPT4gKG90aGVybHZfMTM9ICdsb2NhbGUnICggKGx2X2xvY2FsZV8xNF8wPSBSVUxFX1NUUklORyApICkgKSApICkgKQogICAgICAgICAgICAgCSAgICB7Ci0gICAgICAgICAgICAJICAgIC8vIEludGVybmFsRGF0YURTTC5nOjg1Nzo0OiAoey4uLn0/ID0+ICggKHsuLi59PyA9PiAob3RoZXJsdl8xMz0gJ2xvY2FsZScgKCAobHZfbG9jYWxlXzE0XzA9IFJVTEVfU1RSSU5HICkgKSApICkgKSApCi0gICAgICAgICAgICAJICAgIC8vIEludGVybmFsRGF0YURTTC5nOjg1ODo1OiB7Li4ufT8gPT4gKCAoey4uLn0/ID0+IChvdGhlcmx2XzEzPSAnbG9jYWxlJyAoIChsdl9sb2NhbGVfMTRfMD0gUlVMRV9TVFJJTkcgKSApICkgKSApCisgICAgICAgICAgICAJICAgIC8vIEludGVybmFsRGF0YURTTC5nOjg3MTo0OiAoey4uLn0/ID0+ICggKHsuLi59PyA9PiAob3RoZXJsdl8xMz0gJ2xvY2FsZScgKCAobHZfbG9jYWxlXzE0XzA9IFJVTEVfU1RSSU5HICkgKSApICkgKSApCisgICAgICAgICAgICAJICAgIC8vIEludGVybmFsRGF0YURTTC5nOjg3Mjo1OiB7Li4ufT8gPT4gKCAoey4uLn0/ID0+IChvdGhlcmx2XzEzPSAnbG9jYWxlJyAoIChsdl9sb2NhbGVfMTRfMD0gUlVMRV9TVFJJTkcgKSApICkgKSApCiAgICAgICAgICAgICAJICAgIHsKICAgICAgICAgICAgIAkgICAgaWYgKCAhIGdldFVub3JkZXJlZEdyb3VwSGVscGVyKCkuY2FuU2VsZWN0KGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YUludGVyY2hhbmdlRmlsZUNTVkFjY2VzcygpLmdldFVub3JkZXJlZEdyb3VwXzMoKSwgNSkgKSB7CiAgICAgICAgICAgICAJICAgICAgICBpZiAoc3RhdGUuYmFja3RyYWNraW5nPjApIHtzdGF0ZS5mYWlsZWQ9dHJ1ZTsgcmV0dXJuIGN1cnJlbnQ7fQogICAgICAgICAgICAgCSAgICAgICAgdGhyb3cgbmV3IEZhaWxlZFByZWRpY2F0ZUV4Y2VwdGlvbihpbnB1dCwgInJ1bGVEYXRhSW50ZXJjaGFuZ2VGaWxlQ1NWIiwgImdldFVub3JkZXJlZEdyb3VwSGVscGVyKCkuY2FuU2VsZWN0KGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YUludGVyY2hhbmdlRmlsZUNTVkFjY2VzcygpLmdldFVub3JkZXJlZEdyb3VwXzMoKSwgNSkiKTsKICAgICAgICAgICAgIAkgICAgfQotICAgICAgICAgICAgCSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo4NTg6MTE5OiAoICh7Li4ufT8gPT4gKG90aGVybHZfMTM9ICdsb2NhbGUnICggKGx2X2xvY2FsZV8xNF8wPSBSVUxFX1NUUklORyApICkgKSApICkKLSAgICAgICAgICAgIAkgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6ODU5OjY6ICh7Li4ufT8gPT4gKG90aGVybHZfMTM9ICdsb2NhbGUnICggKGx2X2xvY2FsZV8xNF8wPSBSVUxFX1NUUklORyApICkgKSApCisgICAgICAgICAgICAJICAgIC8vIEludGVybmFsRGF0YURTTC5nOjg3MjoxMTk6ICggKHsuLi59PyA9PiAob3RoZXJsdl8xMz0gJ2xvY2FsZScgKCAobHZfbG9jYWxlXzE0XzA9IFJVTEVfU1RSSU5HICkgKSApICkgKQorICAgICAgICAgICAgCSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo4NzM6NjogKHsuLi59PyA9PiAob3RoZXJsdl8xMz0gJ2xvY2FsZScgKCAobHZfbG9jYWxlXzE0XzA9IFJVTEVfU1RSSU5HICkgKSApICkKICAgICAgICAgICAgIAkgICAgewogICAgICAgICAgICAgCSAgICBnZXRVbm9yZGVyZWRHcm91cEhlbHBlcigpLnNlbGVjdChncmFtbWFyQWNjZXNzLmdldERhdGFJbnRlcmNoYW5nZUZpbGVDU1ZBY2Nlc3MoKS5nZXRVbm9yZGVyZWRHcm91cF8zKCksIDUpOwotICAgICAgICAgICAgCSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo4NjI6OTogKHsuLi59PyA9PiAob3RoZXJsdl8xMz0gJ2xvY2FsZScgKCAobHZfbG9jYWxlXzE0XzA9IFJVTEVfU1RSSU5HICkgKSApICkKLSAgICAgICAgICAgIAkgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6ODYyOjEwOiB7Li4ufT8gPT4gKG90aGVybHZfMTM9ICdsb2NhbGUnICggKGx2X2xvY2FsZV8xNF8wPSBSVUxFX1NUUklORyApICkgKQorICAgICAgICAgICAgCSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo4NzY6OTogKHsuLi59PyA9PiAob3RoZXJsdl8xMz0gJ2xvY2FsZScgKCAobHZfbG9jYWxlXzE0XzA9IFJVTEVfU1RSSU5HICkgKSApICkKKyAgICAgICAgICAgIAkgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6ODc2OjEwOiB7Li4ufT8gPT4gKG90aGVybHZfMTM9ICdsb2NhbGUnICggKGx2X2xvY2FsZV8xNF8wPSBSVUxFX1NUUklORyApICkgKQogICAgICAgICAgICAgCSAgICB7CiAgICAgICAgICAgICAJICAgIGlmICggISgodHJ1ZSkpICkgewogICAgICAgICAgICAgCSAgICAgICAgaWYgKHN0YXRlLmJhY2t0cmFja2luZz4wKSB7c3RhdGUuZmFpbGVkPXRydWU7IHJldHVybiBjdXJyZW50O30KICAgICAgICAgICAgIAkgICAgICAgIHRocm93IG5ldyBGYWlsZWRQcmVkaWNhdGVFeGNlcHRpb24oaW5wdXQsICJydWxlRGF0YUludGVyY2hhbmdlRmlsZUNTViIsICJ0cnVlIik7CiAgICAgICAgICAgICAJICAgIH0KLSAgICAgICAgICAgIAkgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6ODYyOjE5OiAob3RoZXJsdl8xMz0gJ2xvY2FsZScgKCAobHZfbG9jYWxlXzE0XzA9IFJVTEVfU1RSSU5HICkgKSApCi0gICAgICAgICAgICAJICAgIC8vIEludGVybmFsRGF0YURTTC5nOjg2MjoyMDogb3RoZXJsdl8xMz0gJ2xvY2FsZScgKCAobHZfbG9jYWxlXzE0XzA9IFJVTEVfU1RSSU5HICkgKQorICAgICAgICAgICAgCSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo4NzY6MTk6IChvdGhlcmx2XzEzPSAnbG9jYWxlJyAoIChsdl9sb2NhbGVfMTRfMD0gUlVMRV9TVFJJTkcgKSApICkKKyAgICAgICAgICAgIAkgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6ODc2OjIwOiBvdGhlcmx2XzEzPSAnbG9jYWxlJyAoIChsdl9sb2NhbGVfMTRfMD0gUlVMRV9TVFJJTkcgKSApCiAgICAgICAgICAgICAJICAgIHsKLSAgICAgICAgICAgIAkgICAgb3RoZXJsdl8xMz0oVG9rZW4pbWF0Y2goaW5wdXQsMjcsRk9MTE9XXzYpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gY3VycmVudDsKKyAgICAgICAgICAgIAkgICAgb3RoZXJsdl8xMz0oVG9rZW4pbWF0Y2goaW5wdXQsMjgsRk9MTE9XXzYpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gY3VycmVudDsKICAgICAgICAgICAgIAkgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAKICAgICAgICAgICAgIAkgICAgICAJCQkJCQkJCQluZXdMZWFmTm9kZShvdGhlcmx2XzEzLCBncmFtbWFyQWNjZXNzLmdldERhdGFJbnRlcmNoYW5nZUZpbGVDU1ZBY2Nlc3MoKS5nZXRMb2NhbGVLZXl3b3JkXzNfNV8wKCkpOwogICAgICAgICAgICAgCSAgICAgIAkJCQkJCQkJCiAgICAgICAgICAgICAJICAgIH0KLSAgICAgICAgICAgIAkgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6ODY2Ojk6ICggKGx2X2xvY2FsZV8xNF8wPSBSVUxFX1NUUklORyApICkKLSAgICAgICAgICAgIAkgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6ODY3OjEwOiAobHZfbG9jYWxlXzE0XzA9IFJVTEVfU1RSSU5HICkKKyAgICAgICAgICAgIAkgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6ODgwOjk6ICggKGx2X2xvY2FsZV8xNF8wPSBSVUxFX1NUUklORyApICkKKyAgICAgICAgICAgIAkgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6ODgxOjEwOiAobHZfbG9jYWxlXzE0XzA9IFJVTEVfU1RSSU5HICkKICAgICAgICAgICAgIAkgICAgewotICAgICAgICAgICAgCSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo4Njc6MTA6IChsdl9sb2NhbGVfMTRfMD0gUlVMRV9TVFJJTkcgKQotICAgICAgICAgICAgCSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo4Njg6MTE6IGx2X2xvY2FsZV8xNF8wPSBSVUxFX1NUUklORworICAgICAgICAgICAgCSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo4ODE6MTA6IChsdl9sb2NhbGVfMTRfMD0gUlVMRV9TVFJJTkcgKQorICAgICAgICAgICAgCSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo4ODI6MTE6IGx2X2xvY2FsZV8xNF8wPSBSVUxFX1NUUklORwogICAgICAgICAgICAgCSAgICB7Ci0gICAgICAgICAgICAJICAgIGx2X2xvY2FsZV8xNF8wPShUb2tlbiltYXRjaChpbnB1dCxSVUxFX1NUUklORyxGT0xMT1dfMjApOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gY3VycmVudDsKKyAgICAgICAgICAgIAkgICAgbHZfbG9jYWxlXzE0XzA9KFRva2VuKW1hdGNoKGlucHV0LFJVTEVfU1RSSU5HLEZPTExPV18yMSk7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OwogICAgICAgICAgICAgCSAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKIAogICAgICAgICAgICAgCSAgICAgIAkJCQkJCQkJCQkJbmV3TGVhZk5vZGUobHZfbG9jYWxlXzE0XzAsIGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YUludGVyY2hhbmdlRmlsZUNTVkFjY2VzcygpLmdldExvY2FsZVNUUklOR1Rlcm1pbmFsUnVsZUNhbGxfM181XzFfMCgpKTsKQEAgLTIzNzAsNyArMjQyMiw3IEBACiAgICAgICAgICAgICAJICAgIGJyZWFrOwogCiAgICAgICAgICAgICAJZGVmYXVsdCA6Ci0gICAgICAgICAgICAJICAgIGJyZWFrIGxvb3AxMjsKKyAgICAgICAgICAgIAkgICAgYnJlYWsgbG9vcDEzOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0gd2hpbGUgKHRydWUpOwogCkBAIC0yNDA5LDcgKzI0NjEsNyBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgImVudHJ5UnVsZURhdGFJbnRlcmNoYW5nZUZpbGVFREkiCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6OTAxOjE6IGVudHJ5UnVsZURhdGFJbnRlcmNoYW5nZUZpbGVFREkgcmV0dXJucyBbRU9iamVjdCBjdXJyZW50PW51bGxdIDogaXZfcnVsZURhdGFJbnRlcmNoYW5nZUZpbGVFREk9IHJ1bGVEYXRhSW50ZXJjaGFuZ2VGaWxlRURJIEVPRiA7CisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6OTE1OjE6IGVudHJ5UnVsZURhdGFJbnRlcmNoYW5nZUZpbGVFREkgcmV0dXJucyBbRU9iamVjdCBjdXJyZW50PW51bGxdIDogaXZfcnVsZURhdGFJbnRlcmNoYW5nZUZpbGVFREk9IHJ1bGVEYXRhSW50ZXJjaGFuZ2VGaWxlRURJIEVPRiA7CiAgICAgcHVibGljIGZpbmFsIEVPYmplY3QgZW50cnlSdWxlRGF0YUludGVyY2hhbmdlRmlsZUVESSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAgICAgICAgIEVPYmplY3QgY3VycmVudCA9IG51bGw7CiAKQEAgLTI0MTcsOCArMjQ2OSw4IEBACiAKIAogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6OTAxOjYzOiAoaXZfcnVsZURhdGFJbnRlcmNoYW5nZUZpbGVFREk9IHJ1bGVEYXRhSW50ZXJjaGFuZ2VGaWxlRURJIEVPRiApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo5MDI6MjogaXZfcnVsZURhdGFJbnRlcmNoYW5nZUZpbGVFREk9IHJ1bGVEYXRhSW50ZXJjaGFuZ2VGaWxlRURJIEVPRgorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6OTE1OjYzOiAoaXZfcnVsZURhdGFJbnRlcmNoYW5nZUZpbGVFREk9IHJ1bGVEYXRhSW50ZXJjaGFuZ2VGaWxlRURJIEVPRiApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo5MTY6MjogaXZfcnVsZURhdGFJbnRlcmNoYW5nZUZpbGVFREk9IHJ1bGVEYXRhSW50ZXJjaGFuZ2VGaWxlRURJIEVPRgogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBuZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YUludGVyY2hhbmdlRmlsZUVESVJ1bGUoKSk7IApAQCAtMjQ0OSw3ICsyNTAxLDcgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlRGF0YUludGVyY2hhbmdlRmlsZUVESSIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo5MDg6MTogcnVsZURhdGFJbnRlcmNoYW5nZUZpbGVFREkgcmV0dXJucyBbRU9iamVjdCBjdXJyZW50PW51bGxdIDogKCAoKSBvdGhlcmx2XzE9ICdFREknICggKGx2X2ZpbGVVUkxfMl8wPSBSVUxFX1NUUklORyApICkgKCAoICggKCAoey4uLn0/ID0+ICggKHsuLi59PyA9PiAob3RoZXJsdl80PSAnZW5jb2RpbmcnICggKGx2X2VuY29kaW5nXzVfMD0gUlVMRV9TVFJJTkcgKSApICkgKSApICkgfCAoey4uLn0/ID0+ICggKHsuLi59PyA9PiAob3RoZXJsdl82PSAnbG9jYWxlJyAoIChsdl9sb2NhbGVfN18wPSBSVUxFX1NUUklORyApICkgKSApICkgKSApKiApICkgKSBvdGhlcmx2Xzg9ICdtYXBwaW5nTW9kZWwnICggKGx2X21hcHBpbmdNb2RlbF85XzA9IFJVTEVfU1RSSU5HICkgKSAoIChsdl92YWxpZGF0ZV8xMF8wPSAndmFsaWRhdGUnICkgKT8gKSA7CisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6OTIyOjE6IHJ1bGVEYXRhSW50ZXJjaGFuZ2VGaWxlRURJIHJldHVybnMgW0VPYmplY3QgY3VycmVudD1udWxsXSA6ICggKCkgb3RoZXJsdl8xPSAnRURJJyAoIChsdl9maWxlVVJMXzJfMD0gUlVMRV9TVFJJTkcgKSApICggKCAoICggKHsuLi59PyA9PiAoICh7Li4ufT8gPT4gKG90aGVybHZfND0gJ2VuY29kaW5nJyAoIChsdl9lbmNvZGluZ181XzA9IFJVTEVfU1RSSU5HICkgKSApICkgKSApIHwgKHsuLi59PyA9PiAoICh7Li4ufT8gPT4gKG90aGVybHZfNj0gJ2xvY2FsZScgKCAobHZfbG9jYWxlXzdfMD0gUlVMRV9TVFJJTkcgKSApICkgKSApICkgKSogKSApICkgb3RoZXJsdl84PSAnbWFwcGluZ01vZGVsJyAoIChsdl9tYXBwaW5nTW9kZWxfOV8wPSBSVUxFX1NUUklORyApICkgKCAobHZfdmFsaWRhdGVfMTBfMD0gJ3ZhbGlkYXRlJyApICk/ICkgOwogICAgIHB1YmxpYyBmaW5hbCBFT2JqZWN0IHJ1bGVEYXRhSW50ZXJjaGFuZ2VGaWxlRURJKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKICAgICAgICAgRU9iamVjdCBjdXJyZW50ID0gbnVsbDsKIApAQCAtMjQ2NywxNCArMjUxOSwxNCBAQAogICAgICAgICAJZW50ZXJSdWxlKCk7CiAKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjkxNDoyOiAoICggKCkgb3RoZXJsdl8xPSAnRURJJyAoIChsdl9maWxlVVJMXzJfMD0gUlVMRV9TVFJJTkcgKSApICggKCAoICggKHsuLi59PyA9PiAoICh7Li4ufT8gPT4gKG90aGVybHZfND0gJ2VuY29kaW5nJyAoIChsdl9lbmNvZGluZ181XzA9IFJVTEVfU1RSSU5HICkgKSApICkgKSApIHwgKHsuLi59PyA9PiAoICh7Li4ufT8gPT4gKG90aGVybHZfNj0gJ2xvY2FsZScgKCAobHZfbG9jYWxlXzdfMD0gUlVMRV9TVFJJTkcgKSApICkgKSApICkgKSogKSApICkgb3RoZXJsdl84PSAnbWFwcGluZ01vZGVsJyAoIChsdl9tYXBwaW5nTW9kZWxfOV8wPSBSVUxFX1NUUklORyApICkgKCAobHZfdmFsaWRhdGVfMTBfMD0gJ3ZhbGlkYXRlJyApICk/ICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6OTE1OjI6ICggKCkgb3RoZXJsdl8xPSAnRURJJyAoIChsdl9maWxlVVJMXzJfMD0gUlVMRV9TVFJJTkcgKSApICggKCAoICggKHsuLi59PyA9PiAoICh7Li4ufT8gPT4gKG90aGVybHZfND0gJ2VuY29kaW5nJyAoIChsdl9lbmNvZGluZ181XzA9IFJVTEVfU1RSSU5HICkgKSApICkgKSApIHwgKHsuLi59PyA9PiAoICh7Li4ufT8gPT4gKG90aGVybHZfNj0gJ2xvY2FsZScgKCAobHZfbG9jYWxlXzdfMD0gUlVMRV9TVFJJTkcgKSApICkgKSApICkgKSogKSApICkgb3RoZXJsdl84PSAnbWFwcGluZ01vZGVsJyAoIChsdl9tYXBwaW5nTW9kZWxfOV8wPSBSVUxFX1NUUklORyApICkgKCAobHZfdmFsaWRhdGVfMTBfMD0gJ3ZhbGlkYXRlJyApICk/ICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjkyODoyOiAoICggKCkgb3RoZXJsdl8xPSAnRURJJyAoIChsdl9maWxlVVJMXzJfMD0gUlVMRV9TVFJJTkcgKSApICggKCAoICggKHsuLi59PyA9PiAoICh7Li4ufT8gPT4gKG90aGVybHZfND0gJ2VuY29kaW5nJyAoIChsdl9lbmNvZGluZ181XzA9IFJVTEVfU1RSSU5HICkgKSApICkgKSApIHwgKHsuLi59PyA9PiAoICh7Li4ufT8gPT4gKG90aGVybHZfNj0gJ2xvY2FsZScgKCAobHZfbG9jYWxlXzdfMD0gUlVMRV9TVFJJTkcgKSApICkgKSApICkgKSogKSApICkgb3RoZXJsdl84PSAnbWFwcGluZ01vZGVsJyAoIChsdl9tYXBwaW5nTW9kZWxfOV8wPSBSVUxFX1NUUklORyApICkgKCAobHZfdmFsaWRhdGVfMTBfMD0gJ3ZhbGlkYXRlJyApICk/ICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6OTI5OjI6ICggKCkgb3RoZXJsdl8xPSAnRURJJyAoIChsdl9maWxlVVJMXzJfMD0gUlVMRV9TVFJJTkcgKSApICggKCAoICggKHsuLi59PyA9PiAoICh7Li4ufT8gPT4gKG90aGVybHZfND0gJ2VuY29kaW5nJyAoIChsdl9lbmNvZGluZ181XzA9IFJVTEVfU1RSSU5HICkgKSApICkgKSApIHwgKHsuLi59PyA9PiAoICh7Li4ufT8gPT4gKG90aGVybHZfNj0gJ2xvY2FsZScgKCAobHZfbG9jYWxlXzdfMD0gUlVMRV9TVFJJTkcgKSApICkgKSApICkgKSogKSApICkgb3RoZXJsdl84PSAnbWFwcGluZ01vZGVsJyAoIChsdl9tYXBwaW5nTW9kZWxfOV8wPSBSVUxFX1NUUklORyApICkgKCAobHZfdmFsaWRhdGVfMTBfMD0gJ3ZhbGlkYXRlJyApICk/ICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjkxNToyOiAoICgpIG90aGVybHZfMT0gJ0VESScgKCAobHZfZmlsZVVSTF8yXzA9IFJVTEVfU1RSSU5HICkgKSAoICggKCAoICh7Li4ufT8gPT4gKCAoey4uLn0/ID0+IChvdGhlcmx2XzQ9ICdlbmNvZGluZycgKCAobHZfZW5jb2RpbmdfNV8wPSBSVUxFX1NUUklORyApICkgKSApICkgKSB8ICh7Li4ufT8gPT4gKCAoey4uLn0/ID0+IChvdGhlcmx2XzY9ICdsb2NhbGUnICggKGx2X2xvY2FsZV83XzA9IFJVTEVfU1RSSU5HICkgKSApICkgKSApICkqICkgKSApIG90aGVybHZfOD0gJ21hcHBpbmdNb2RlbCcgKCAobHZfbWFwcGluZ01vZGVsXzlfMD0gUlVMRV9TVFJJTkcgKSApICggKGx2X3ZhbGlkYXRlXzEwXzA9ICd2YWxpZGF0ZScgKSApPyApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo5MTY6MzogKCkgb3RoZXJsdl8xPSAnRURJJyAoIChsdl9maWxlVVJMXzJfMD0gUlVMRV9TVFJJTkcgKSApICggKCAoICggKHsuLi59PyA9PiAoICh7Li4ufT8gPT4gKG90aGVybHZfND0gJ2VuY29kaW5nJyAoIChsdl9lbmNvZGluZ181XzA9IFJVTEVfU1RSSU5HICkgKSApICkgKSApIHwgKHsuLi59PyA9PiAoICh7Li4ufT8gPT4gKG90aGVybHZfNj0gJ2xvY2FsZScgKCAobHZfbG9jYWxlXzdfMD0gUlVMRV9TVFJJTkcgKSApICkgKSApICkgKSogKSApICkgb3RoZXJsdl84PSAnbWFwcGluZ01vZGVsJyAoIChsdl9tYXBwaW5nTW9kZWxfOV8wPSBSVUxFX1NUUklORyApICkgKCAobHZfdmFsaWRhdGVfMTBfMD0gJ3ZhbGlkYXRlJyApICk/CisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo5Mjk6MjogKCAoKSBvdGhlcmx2XzE9ICdFREknICggKGx2X2ZpbGVVUkxfMl8wPSBSVUxFX1NUUklORyApICkgKCAoICggKCAoey4uLn0/ID0+ICggKHsuLi59PyA9PiAob3RoZXJsdl80PSAnZW5jb2RpbmcnICggKGx2X2VuY29kaW5nXzVfMD0gUlVMRV9TVFJJTkcgKSApICkgKSApICkgfCAoey4uLn0/ID0+ICggKHsuLi59PyA9PiAob3RoZXJsdl82PSAnbG9jYWxlJyAoIChsdl9sb2NhbGVfN18wPSBSVUxFX1NUUklORyApICkgKSApICkgKSApKiApICkgKSBvdGhlcmx2Xzg9ICdtYXBwaW5nTW9kZWwnICggKGx2X21hcHBpbmdNb2RlbF85XzA9IFJVTEVfU1RSSU5HICkgKSAoIChsdl92YWxpZGF0ZV8xMF8wPSAndmFsaWRhdGUnICkgKT8gKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6OTMwOjM6ICgpIG90aGVybHZfMT0gJ0VESScgKCAobHZfZmlsZVVSTF8yXzA9IFJVTEVfU1RSSU5HICkgKSAoICggKCAoICh7Li4ufT8gPT4gKCAoey4uLn0/ID0+IChvdGhlcmx2XzQ9ICdlbmNvZGluZycgKCAobHZfZW5jb2RpbmdfNV8wPSBSVUxFX1NUUklORyApICkgKSApICkgKSB8ICh7Li4ufT8gPT4gKCAoey4uLn0/ID0+IChvdGhlcmx2XzY9ICdsb2NhbGUnICggKGx2X2xvY2FsZV83XzA9IFJVTEVfU1RSSU5HICkgKSApICkgKSApICkqICkgKSApIG90aGVybHZfOD0gJ21hcHBpbmdNb2RlbCcgKCAobHZfbWFwcGluZ01vZGVsXzlfMD0gUlVMRV9TVFJJTkcgKSApICggKGx2X3ZhbGlkYXRlXzEwXzA9ICd2YWxpZGF0ZScgKSApPwogICAgICAgICAgICAgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6OTE2OjM6ICgpCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo5MTc6NDogCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo5MzA6MzogKCkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjkzMTo0OiAKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogCkBAIC0yNDg2LDE5ICsyNTM4LDE5IEBACiAKICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgb3RoZXJsdl8xPShUb2tlbiltYXRjaChpbnB1dCwzMyxGT0xMT1dfNik7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OworICAgICAgICAgICAgb3RoZXJsdl8xPShUb2tlbiltYXRjaChpbnB1dCwzNCxGT0xMT1dfNik7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OwogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAKICAgICAgICAgICAgICAgCQkJbmV3TGVhZk5vZGUob3RoZXJsdl8xLCBncmFtbWFyQWNjZXNzLmdldERhdGFJbnRlcmNoYW5nZUZpbGVFRElBY2Nlc3MoKS5nZXRFRElLZXl3b3JkXzEoKSk7CiAgICAgICAgICAgICAgIAkJCiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo5Mjc6MzogKCAobHZfZmlsZVVSTF8yXzA9IFJVTEVfU1RSSU5HICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6OTI4OjQ6IChsdl9maWxlVVJMXzJfMD0gUlVMRV9TVFJJTkcgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6OTQxOjM6ICggKGx2X2ZpbGVVUkxfMl8wPSBSVUxFX1NUUklORyApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjk0Mjo0OiAobHZfZmlsZVVSTF8yXzA9IFJVTEVfU1RSSU5HICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjkyODo0OiAobHZfZmlsZVVSTF8yXzA9IFJVTEVfU1RSSU5HICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjkyOTo1OiBsdl9maWxlVVJMXzJfMD0gUlVMRV9TVFJJTkcKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjk0Mjo0OiAobHZfZmlsZVVSTF8yXzA9IFJVTEVfU1RSSU5HICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjk0Mzo1OiBsdl9maWxlVVJMXzJfMD0gUlVMRV9TVFJJTkcKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIGx2X2ZpbGVVUkxfMl8wPShUb2tlbiltYXRjaChpbnB1dCxSVUxFX1NUUklORyxGT0xMT1dfMjEpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gY3VycmVudDsKKyAgICAgICAgICAgIGx2X2ZpbGVVUkxfMl8wPShUb2tlbiltYXRjaChpbnB1dCxSVUxFX1NUUklORyxGT0xMT1dfMjIpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gY3VycmVudDsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogCiAgICAgICAgICAgICAgIAkJCQkJbmV3TGVhZk5vZGUobHZfZmlsZVVSTF8yXzAsIGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YUludGVyY2hhbmdlRmlsZUVESUFjY2VzcygpLmdldEZpbGVVUkxTVFJJTkdUZXJtaW5hbFJ1bGVDYWxsXzJfMCgpKTsKQEAgLTI1MjIsNjggKzI1NzQsNjggQEAKIAogICAgICAgICAgICAgfQogCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo5NDU6MzogKCAoICggKCAoey4uLn0/ID0+ICggKHsuLi59PyA9PiAob3RoZXJsdl80PSAnZW5jb2RpbmcnICggKGx2X2VuY29kaW5nXzVfMD0gUlVMRV9TVFJJTkcgKSApICkgKSApICkgfCAoey4uLn0/ID0+ICggKHsuLi59PyA9PiAob3RoZXJsdl82PSAnbG9jYWxlJyAoIChsdl9sb2NhbGVfN18wPSBSVUxFX1NUUklORyApICkgKSApICkgKSApKiApICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6OTQ2OjQ6ICggKCAoICh7Li4ufT8gPT4gKCAoey4uLn0/ID0+IChvdGhlcmx2XzQ9ICdlbmNvZGluZycgKCAobHZfZW5jb2RpbmdfNV8wPSBSVUxFX1NUUklORyApICkgKSApICkgKSB8ICh7Li4ufT8gPT4gKCAoey4uLn0/ID0+IChvdGhlcmx2XzY9ICdsb2NhbGUnICggKGx2X2xvY2FsZV83XzA9IFJVTEVfU1RSSU5HICkgKSApICkgKSApICkqICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6OTU5OjM6ICggKCAoICggKHsuLi59PyA9PiAoICh7Li4ufT8gPT4gKG90aGVybHZfND0gJ2VuY29kaW5nJyAoIChsdl9lbmNvZGluZ181XzA9IFJVTEVfU1RSSU5HICkgKSApICkgKSApIHwgKHsuLi59PyA9PiAoICh7Li4ufT8gPT4gKG90aGVybHZfNj0gJ2xvY2FsZScgKCAobHZfbG9jYWxlXzdfMD0gUlVMRV9TVFJJTkcgKSApICkgKSApICkgKSogKSApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjk2MDo0OiAoICggKCAoey4uLn0/ID0+ICggKHsuLi59PyA9PiAob3RoZXJsdl80PSAnZW5jb2RpbmcnICggKGx2X2VuY29kaW5nXzVfMD0gUlVMRV9TVFJJTkcgKSApICkgKSApICkgfCAoey4uLn0/ID0+ICggKHsuLi59PyA9PiAob3RoZXJsdl82PSAnbG9jYWxlJyAoIChsdl9sb2NhbGVfN18wPSBSVUxFX1NUUklORyApICkgKSApICkgKSApKiApICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjk0Njo0OiAoICggKCAoey4uLn0/ID0+ICggKHsuLi59PyA9PiAob3RoZXJsdl80PSAnZW5jb2RpbmcnICggKGx2X2VuY29kaW5nXzVfMD0gUlVMRV9TVFJJTkcgKSApICkgKSApICkgfCAoey4uLn0/ID0+ICggKHsuLi59PyA9PiAob3RoZXJsdl82PSAnbG9jYWxlJyAoIChsdl9sb2NhbGVfN18wPSBSVUxFX1NUUklORyApICkgKSApICkgKSApKiApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjk0Nzo1OiAoICggKHsuLi59PyA9PiAoICh7Li4ufT8gPT4gKG90aGVybHZfND0gJ2VuY29kaW5nJyAoIChsdl9lbmNvZGluZ181XzA9IFJVTEVfU1RSSU5HICkgKSApICkgKSApIHwgKHsuLi59PyA9PiAoICh7Li4ufT8gPT4gKG90aGVybHZfNj0gJ2xvY2FsZScgKCAobHZfbG9jYWxlXzdfMD0gUlVMRV9TVFJJTkcgKSApICkgKSApICkgKSogKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6OTYwOjQ6ICggKCAoICh7Li4ufT8gPT4gKCAoey4uLn0/ID0+IChvdGhlcmx2XzQ9ICdlbmNvZGluZycgKCAobHZfZW5jb2RpbmdfNV8wPSBSVUxFX1NUUklORyApICkgKSApICkgKSB8ICh7Li4ufT8gPT4gKCAoey4uLn0/ID0+IChvdGhlcmx2XzY9ICdsb2NhbGUnICggKGx2X2xvY2FsZV83XzA9IFJVTEVfU1RSSU5HICkgKSApICkgKSApICkqICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6OTYxOjU6ICggKCAoey4uLn0/ID0+ICggKHsuLi59PyA9PiAob3RoZXJsdl80PSAnZW5jb2RpbmcnICggKGx2X2VuY29kaW5nXzVfMD0gUlVMRV9TVFJJTkcgKSApICkgKSApICkgfCAoey4uLn0/ID0+ICggKHsuLi59PyA9PiAob3RoZXJsdl82PSAnbG9jYWxlJyAoIChsdl9sb2NhbGVfN18wPSBSVUxFX1NUUklORyApICkgKSApICkgKSApKiApCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBnZXRVbm9yZGVyZWRHcm91cEhlbHBlcigpLmVudGVyKGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YUludGVyY2hhbmdlRmlsZUVESUFjY2VzcygpLmdldFVub3JkZXJlZEdyb3VwXzMoKSk7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo5NTA6NTogKCAoICh7Li4ufT8gPT4gKCAoey4uLn0/ID0+IChvdGhlcmx2XzQ9ICdlbmNvZGluZycgKCAobHZfZW5jb2RpbmdfNV8wPSBSVUxFX1NUUklORyApICkgKSApICkgKSB8ICh7Li4ufT8gPT4gKCAoey4uLn0/ID0+IChvdGhlcmx2XzY9ICdsb2NhbGUnICggKGx2X2xvY2FsZV83XzA9IFJVTEVfU1RSSU5HICkgKSApICkgKSApICkqICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjk1MTo2OiAoICh7Li4ufT8gPT4gKCAoey4uLn0/ID0+IChvdGhlcmx2XzQ9ICdlbmNvZGluZycgKCAobHZfZW5jb2RpbmdfNV8wPSBSVUxFX1NUUklORyApICkgKSApICkgKSB8ICh7Li4ufT8gPT4gKCAoey4uLn0/ID0+IChvdGhlcmx2XzY9ICdsb2NhbGUnICggKGx2X2xvY2FsZV83XzA9IFJVTEVfU1RSSU5HICkgKSApICkgKSApICkqCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo5NjQ6NTogKCAoICh7Li4ufT8gPT4gKCAoey4uLn0/ID0+IChvdGhlcmx2XzQ9ICdlbmNvZGluZycgKCAobHZfZW5jb2RpbmdfNV8wPSBSVUxFX1NUUklORyApICkgKSApICkgKSB8ICh7Li4ufT8gPT4gKCAoey4uLn0/ID0+IChvdGhlcmx2XzY9ICdsb2NhbGUnICggKGx2X2xvY2FsZV83XzA9IFJVTEVfU1RSSU5HICkgKSApICkgKSApICkqICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjk2NTo2OiAoICh7Li4ufT8gPT4gKCAoey4uLn0/ID0+IChvdGhlcmx2XzQ9ICdlbmNvZGluZycgKCAobHZfZW5jb2RpbmdfNV8wPSBSVUxFX1NUUklORyApICkgKSApICkgKSB8ICh7Li4ufT8gPT4gKCAoey4uLn0/ID0+IChvdGhlcmx2XzY9ICdsb2NhbGUnICggKGx2X2xvY2FsZV83XzA9IFJVTEVfU1RSSU5HICkgKSApICkgKSApICkqCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo5NTE6NjogKCAoey4uLn0/ID0+ICggKHsuLi59PyA9PiAob3RoZXJsdl80PSAnZW5jb2RpbmcnICggKGx2X2VuY29kaW5nXzVfMD0gUlVMRV9TVFJJTkcgKSApICkgKSApICkgfCAoey4uLn0/ID0+ICggKHsuLi59PyA9PiAob3RoZXJsdl82PSAnbG9jYWxlJyAoIChsdl9sb2NhbGVfN18wPSBSVUxFX1NUUklORyApICkgKSApICkgKSApKgotICAgICAgICAgICAgbG9vcDEzOgorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6OTY1OjY6ICggKHsuLi59PyA9PiAoICh7Li4ufT8gPT4gKG90aGVybHZfND0gJ2VuY29kaW5nJyAoIChsdl9lbmNvZGluZ181XzA9IFJVTEVfU1RSSU5HICkgKSApICkgKSApIHwgKHsuLi59PyA9PiAoICh7Li4ufT8gPT4gKG90aGVybHZfNj0gJ2xvY2FsZScgKCAobHZfbG9jYWxlXzdfMD0gUlVMRV9TVFJJTkcgKSApICkgKSApICkgKSoKKyAgICAgICAgICAgIGxvb3AxNDoKICAgICAgICAgICAgIGRvIHsKLSAgICAgICAgICAgICAgICBpbnQgYWx0MTM9MzsKLSAgICAgICAgICAgICAgICBpbnQgTEExM18wID0gaW5wdXQuTEEoMSk7CisgICAgICAgICAgICAgICAgaW50IGFsdDE0PTM7CisgICAgICAgICAgICAgICAgaW50IExBMTRfMCA9IGlucHV0LkxBKDEpOwogCi0gICAgICAgICAgICAgICAgaWYgKCBMQTEzXzAgPT0gMjYgJiYgZ2V0VW5vcmRlcmVkR3JvdXBIZWxwZXIoKS5jYW5TZWxlY3QoZ3JhbW1hckFjY2Vzcy5nZXREYXRhSW50ZXJjaGFuZ2VGaWxlRURJQWNjZXNzKCkuZ2V0VW5vcmRlcmVkR3JvdXBfMygpLCAwKSApIHsKLSAgICAgICAgICAgICAgICAgICAgYWx0MTM9MTsKKyAgICAgICAgICAgICAgICBpZiAoIExBMTRfMCA9PSAyNyAmJiBnZXRVbm9yZGVyZWRHcm91cEhlbHBlcigpLmNhblNlbGVjdChncmFtbWFyQWNjZXNzLmdldERhdGFJbnRlcmNoYW5nZUZpbGVFRElBY2Nlc3MoKS5nZXRVbm9yZGVyZWRHcm91cF8zKCksIDApICkgeworICAgICAgICAgICAgICAgICAgICBhbHQxND0xOwogICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlIGlmICggTEExM18wID09IDI3ICYmIGdldFVub3JkZXJlZEdyb3VwSGVscGVyKCkuY2FuU2VsZWN0KGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YUludGVyY2hhbmdlRmlsZUVESUFjY2VzcygpLmdldFVub3JkZXJlZEdyb3VwXzMoKSwgMSkgKSB7Ci0gICAgICAgICAgICAgICAgICAgIGFsdDEzPTI7CisgICAgICAgICAgICAgICAgZWxzZSBpZiAoIExBMTRfMCA9PSAyOCAmJiBnZXRVbm9yZGVyZWRHcm91cEhlbHBlcigpLmNhblNlbGVjdChncmFtbWFyQWNjZXNzLmdldERhdGFJbnRlcmNoYW5nZUZpbGVFRElBY2Nlc3MoKS5nZXRVbm9yZGVyZWRHcm91cF8zKCksIDEpICkgeworICAgICAgICAgICAgICAgICAgICBhbHQxND0yOwogICAgICAgICAgICAgICAgIH0KIAogCi0gICAgICAgICAgICAgICAgc3dpdGNoIChhbHQxMykgeworICAgICAgICAgICAgICAgIHN3aXRjaCAoYWx0MTQpIHsKICAgICAgICAgICAgIAljYXNlIDEgOgotICAgICAgICAgICAgCSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo5NTI6NDogKHsuLi59PyA9PiAoICh7Li4ufT8gPT4gKG90aGVybHZfND0gJ2VuY29kaW5nJyAoIChsdl9lbmNvZGluZ181XzA9IFJVTEVfU1RSSU5HICkgKSApICkgKSApCisgICAgICAgICAgICAJICAgIC8vIEludGVybmFsRGF0YURTTC5nOjk2Njo0OiAoey4uLn0/ID0+ICggKHsuLi59PyA9PiAob3RoZXJsdl80PSAnZW5jb2RpbmcnICggKGx2X2VuY29kaW5nXzVfMD0gUlVMRV9TVFJJTkcgKSApICkgKSApICkKICAgICAgICAgICAgIAkgICAgewotICAgICAgICAgICAgCSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo5NTI6NDogKHsuLi59PyA9PiAoICh7Li4ufT8gPT4gKG90aGVybHZfND0gJ2VuY29kaW5nJyAoIChsdl9lbmNvZGluZ181XzA9IFJVTEVfU1RSSU5HICkgKSApICkgKSApCi0gICAgICAgICAgICAJICAgIC8vIEludGVybmFsRGF0YURTTC5nOjk1Mzo1OiB7Li4ufT8gPT4gKCAoey4uLn0/ID0+IChvdGhlcmx2XzQ9ICdlbmNvZGluZycgKCAobHZfZW5jb2RpbmdfNV8wPSBSVUxFX1NUUklORyApICkgKSApICkKKyAgICAgICAgICAgIAkgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6OTY2OjQ6ICh7Li4ufT8gPT4gKCAoey4uLn0/ID0+IChvdGhlcmx2XzQ9ICdlbmNvZGluZycgKCAobHZfZW5jb2RpbmdfNV8wPSBSVUxFX1NUUklORyApICkgKSApICkgKQorICAgICAgICAgICAgCSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo5Njc6NTogey4uLn0/ID0+ICggKHsuLi59PyA9PiAob3RoZXJsdl80PSAnZW5jb2RpbmcnICggKGx2X2VuY29kaW5nXzVfMD0gUlVMRV9TVFJJTkcgKSApICkgKSApCiAgICAgICAgICAgICAJICAgIHsKICAgICAgICAgICAgIAkgICAgaWYgKCAhIGdldFVub3JkZXJlZEdyb3VwSGVscGVyKCkuY2FuU2VsZWN0KGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YUludGVyY2hhbmdlRmlsZUVESUFjY2VzcygpLmdldFVub3JkZXJlZEdyb3VwXzMoKSwgMCkgKSB7CiAgICAgICAgICAgICAJICAgICAgICBpZiAoc3RhdGUuYmFja3RyYWNraW5nPjApIHtzdGF0ZS5mYWlsZWQ9dHJ1ZTsgcmV0dXJuIGN1cnJlbnQ7fQogICAgICAgICAgICAgCSAgICAgICAgdGhyb3cgbmV3IEZhaWxlZFByZWRpY2F0ZUV4Y2VwdGlvbihpbnB1dCwgInJ1bGVEYXRhSW50ZXJjaGFuZ2VGaWxlRURJIiwgImdldFVub3JkZXJlZEdyb3VwSGVscGVyKCkuY2FuU2VsZWN0KGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YUludGVyY2hhbmdlRmlsZUVESUFjY2VzcygpLmdldFVub3JkZXJlZEdyb3VwXzMoKSwgMCkiKTsKICAgICAgICAgICAgIAkgICAgfQotICAgICAgICAgICAgCSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo5NTM6MTE5OiAoICh7Li4ufT8gPT4gKG90aGVybHZfND0gJ2VuY29kaW5nJyAoIChsdl9lbmNvZGluZ181XzA9IFJVTEVfU1RSSU5HICkgKSApICkgKQotICAgICAgICAgICAgCSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo5NTQ6NjogKHsuLi59PyA9PiAob3RoZXJsdl80PSAnZW5jb2RpbmcnICggKGx2X2VuY29kaW5nXzVfMD0gUlVMRV9TVFJJTkcgKSApICkgKQorICAgICAgICAgICAgCSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo5Njc6MTE5OiAoICh7Li4ufT8gPT4gKG90aGVybHZfND0gJ2VuY29kaW5nJyAoIChsdl9lbmNvZGluZ181XzA9IFJVTEVfU1RSSU5HICkgKSApICkgKQorICAgICAgICAgICAgCSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo5Njg6NjogKHsuLi59PyA9PiAob3RoZXJsdl80PSAnZW5jb2RpbmcnICggKGx2X2VuY29kaW5nXzVfMD0gUlVMRV9TVFJJTkcgKSApICkgKQogICAgICAgICAgICAgCSAgICB7CiAgICAgICAgICAgICAJICAgIGdldFVub3JkZXJlZEdyb3VwSGVscGVyKCkuc2VsZWN0KGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YUludGVyY2hhbmdlRmlsZUVESUFjY2VzcygpLmdldFVub3JkZXJlZEdyb3VwXzMoKSwgMCk7Ci0gICAgICAgICAgICAJICAgIC8vIEludGVybmFsRGF0YURTTC5nOjk1Nzo5OiAoey4uLn0/ID0+IChvdGhlcmx2XzQ9ICdlbmNvZGluZycgKCAobHZfZW5jb2RpbmdfNV8wPSBSVUxFX1NUUklORyApICkgKSApCi0gICAgICAgICAgICAJICAgIC8vIEludGVybmFsRGF0YURTTC5nOjk1NzoxMDogey4uLn0/ID0+IChvdGhlcmx2XzQ9ICdlbmNvZGluZycgKCAobHZfZW5jb2RpbmdfNV8wPSBSVUxFX1NUUklORyApICkgKQorICAgICAgICAgICAgCSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo5NzE6OTogKHsuLi59PyA9PiAob3RoZXJsdl80PSAnZW5jb2RpbmcnICggKGx2X2VuY29kaW5nXzVfMD0gUlVMRV9TVFJJTkcgKSApICkgKQorICAgICAgICAgICAgCSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo5NzE6MTA6IHsuLi59PyA9PiAob3RoZXJsdl80PSAnZW5jb2RpbmcnICggKGx2X2VuY29kaW5nXzVfMD0gUlVMRV9TVFJJTkcgKSApICkKICAgICAgICAgICAgIAkgICAgewogICAgICAgICAgICAgCSAgICBpZiAoICEoKHRydWUpKSApIHsKICAgICAgICAgICAgIAkgICAgICAgIGlmIChzdGF0ZS5iYWNrdHJhY2tpbmc+MCkge3N0YXRlLmZhaWxlZD10cnVlOyByZXR1cm4gY3VycmVudDt9CiAgICAgICAgICAgICAJICAgICAgICB0aHJvdyBuZXcgRmFpbGVkUHJlZGljYXRlRXhjZXB0aW9uKGlucHV0LCAicnVsZURhdGFJbnRlcmNoYW5nZUZpbGVFREkiLCAidHJ1ZSIpOwogICAgICAgICAgICAgCSAgICB9Ci0gICAgICAgICAgICAJICAgIC8vIEludGVybmFsRGF0YURTTC5nOjk1NzoxOTogKG90aGVybHZfND0gJ2VuY29kaW5nJyAoIChsdl9lbmNvZGluZ181XzA9IFJVTEVfU1RSSU5HICkgKSApCi0gICAgICAgICAgICAJICAgIC8vIEludGVybmFsRGF0YURTTC5nOjk1NzoyMDogb3RoZXJsdl80PSAnZW5jb2RpbmcnICggKGx2X2VuY29kaW5nXzVfMD0gUlVMRV9TVFJJTkcgKSApCisgICAgICAgICAgICAJICAgIC8vIEludGVybmFsRGF0YURTTC5nOjk3MToxOTogKG90aGVybHZfND0gJ2VuY29kaW5nJyAoIChsdl9lbmNvZGluZ181XzA9IFJVTEVfU1RSSU5HICkgKSApCisgICAgICAgICAgICAJICAgIC8vIEludGVybmFsRGF0YURTTC5nOjk3MToyMDogb3RoZXJsdl80PSAnZW5jb2RpbmcnICggKGx2X2VuY29kaW5nXzVfMD0gUlVMRV9TVFJJTkcgKSApCiAgICAgICAgICAgICAJICAgIHsKLSAgICAgICAgICAgIAkgICAgb3RoZXJsdl80PShUb2tlbiltYXRjaChpbnB1dCwyNixGT0xMT1dfNik7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OworICAgICAgICAgICAgCSAgICBvdGhlcmx2XzQ9KFRva2VuKW1hdGNoKGlucHV0LDI3LEZPTExPV182KTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7CiAgICAgICAgICAgICAJICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogCiAgICAgICAgICAgICAJICAgICAgCQkJCQkJCQkJbmV3TGVhZk5vZGUob3RoZXJsdl80LCBncmFtbWFyQWNjZXNzLmdldERhdGFJbnRlcmNoYW5nZUZpbGVFRElBY2Nlc3MoKS5nZXRFbmNvZGluZ0tleXdvcmRfM18wXzAoKSk7CiAgICAgICAgICAgICAJICAgICAgCQkJCQkJCQkKICAgICAgICAgICAgIAkgICAgfQotICAgICAgICAgICAgCSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo5NjE6OTogKCAobHZfZW5jb2RpbmdfNV8wPSBSVUxFX1NUUklORyApICkKLSAgICAgICAgICAgIAkgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6OTYyOjEwOiAobHZfZW5jb2RpbmdfNV8wPSBSVUxFX1NUUklORyApCisgICAgICAgICAgICAJICAgIC8vIEludGVybmFsRGF0YURTTC5nOjk3NTo5OiAoIChsdl9lbmNvZGluZ181XzA9IFJVTEVfU1RSSU5HICkgKQorICAgICAgICAgICAgCSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo5NzY6MTA6IChsdl9lbmNvZGluZ181XzA9IFJVTEVfU1RSSU5HICkKICAgICAgICAgICAgIAkgICAgewotICAgICAgICAgICAgCSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo5NjI6MTA6IChsdl9lbmNvZGluZ181XzA9IFJVTEVfU1RSSU5HICkKLSAgICAgICAgICAgIAkgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6OTYzOjExOiBsdl9lbmNvZGluZ181XzA9IFJVTEVfU1RSSU5HCisgICAgICAgICAgICAJICAgIC8vIEludGVybmFsRGF0YURTTC5nOjk3NjoxMDogKGx2X2VuY29kaW5nXzVfMD0gUlVMRV9TVFJJTkcgKQorICAgICAgICAgICAgCSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo5Nzc6MTE6IGx2X2VuY29kaW5nXzVfMD0gUlVMRV9TVFJJTkcKICAgICAgICAgICAgIAkgICAgewotICAgICAgICAgICAgCSAgICBsdl9lbmNvZGluZ181XzA9KFRva2VuKW1hdGNoKGlucHV0LFJVTEVfU1RSSU5HLEZPTExPV18yMSk7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OworICAgICAgICAgICAgCSAgICBsdl9lbmNvZGluZ181XzA9KFRva2VuKW1hdGNoKGlucHV0LFJVTEVfU1RSSU5HLEZPTExPV18yMik7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OwogICAgICAgICAgICAgCSAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKIAogICAgICAgICAgICAgCSAgICAgIAkJCQkJCQkJCQkJbmV3TGVhZk5vZGUobHZfZW5jb2RpbmdfNV8wLCBncmFtbWFyQWNjZXNzLmdldERhdGFJbnRlcmNoYW5nZUZpbGVFRElBY2Nlc3MoKS5nZXRFbmNvZGluZ1NUUklOR1Rlcm1pbmFsUnVsZUNhbGxfM18wXzFfMCgpKTsKQEAgLTI2MjQsNDIgKzI2NzYsNDIgQEAKICAgICAgICAgICAgIAkgICAgfQogICAgICAgICAgICAgCSAgICBicmVhazsKICAgICAgICAgICAgIAljYXNlIDIgOgotICAgICAgICAgICAgCSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo5ODU6NDogKHsuLi59PyA9PiAoICh7Li4ufT8gPT4gKG90aGVybHZfNj0gJ2xvY2FsZScgKCAobHZfbG9jYWxlXzdfMD0gUlVMRV9TVFJJTkcgKSApICkgKSApICkKKyAgICAgICAgICAgIAkgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6OTk5OjQ6ICh7Li4ufT8gPT4gKCAoey4uLn0/ID0+IChvdGhlcmx2XzY9ICdsb2NhbGUnICggKGx2X2xvY2FsZV83XzA9IFJVTEVfU1RSSU5HICkgKSApICkgKSApCiAgICAgICAgICAgICAJICAgIHsKLSAgICAgICAgICAgIAkgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6OTg1OjQ6ICh7Li4ufT8gPT4gKCAoey4uLn0/ID0+IChvdGhlcmx2XzY9ICdsb2NhbGUnICggKGx2X2xvY2FsZV83XzA9IFJVTEVfU1RSSU5HICkgKSApICkgKSApCi0gICAgICAgICAgICAJICAgIC8vIEludGVybmFsRGF0YURTTC5nOjk4Njo1OiB7Li4ufT8gPT4gKCAoey4uLn0/ID0+IChvdGhlcmx2XzY9ICdsb2NhbGUnICggKGx2X2xvY2FsZV83XzA9IFJVTEVfU1RSSU5HICkgKSApICkgKQorICAgICAgICAgICAgCSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo5OTk6NDogKHsuLi59PyA9PiAoICh7Li4ufT8gPT4gKG90aGVybHZfNj0gJ2xvY2FsZScgKCAobHZfbG9jYWxlXzdfMD0gUlVMRV9TVFJJTkcgKSApICkgKSApICkKKyAgICAgICAgICAgIAkgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTAwMDo1OiB7Li4ufT8gPT4gKCAoey4uLn0/ID0+IChvdGhlcmx2XzY9ICdsb2NhbGUnICggKGx2X2xvY2FsZV83XzA9IFJVTEVfU1RSSU5HICkgKSApICkgKQogICAgICAgICAgICAgCSAgICB7CiAgICAgICAgICAgICAJICAgIGlmICggISBnZXRVbm9yZGVyZWRHcm91cEhlbHBlcigpLmNhblNlbGVjdChncmFtbWFyQWNjZXNzLmdldERhdGFJbnRlcmNoYW5nZUZpbGVFRElBY2Nlc3MoKS5nZXRVbm9yZGVyZWRHcm91cF8zKCksIDEpICkgewogICAgICAgICAgICAgCSAgICAgICAgaWYgKHN0YXRlLmJhY2t0cmFja2luZz4wKSB7c3RhdGUuZmFpbGVkPXRydWU7IHJldHVybiBjdXJyZW50O30KICAgICAgICAgICAgIAkgICAgICAgIHRocm93IG5ldyBGYWlsZWRQcmVkaWNhdGVFeGNlcHRpb24oaW5wdXQsICJydWxlRGF0YUludGVyY2hhbmdlRmlsZUVESSIsICJnZXRVbm9yZGVyZWRHcm91cEhlbHBlcigpLmNhblNlbGVjdChncmFtbWFyQWNjZXNzLmdldERhdGFJbnRlcmNoYW5nZUZpbGVFRElBY2Nlc3MoKS5nZXRVbm9yZGVyZWRHcm91cF8zKCksIDEpIik7CiAgICAgICAgICAgICAJICAgIH0KLSAgICAgICAgICAgIAkgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6OTg2OjExOTogKCAoey4uLn0/ID0+IChvdGhlcmx2XzY9ICdsb2NhbGUnICggKGx2X2xvY2FsZV83XzA9IFJVTEVfU1RSSU5HICkgKSApICkgKQotICAgICAgICAgICAgCSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo5ODc6NjogKHsuLi59PyA9PiAob3RoZXJsdl82PSAnbG9jYWxlJyAoIChsdl9sb2NhbGVfN18wPSBSVUxFX1NUUklORyApICkgKSApCisgICAgICAgICAgICAJICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEwMDA6MTE5OiAoICh7Li4ufT8gPT4gKG90aGVybHZfNj0gJ2xvY2FsZScgKCAobHZfbG9jYWxlXzdfMD0gUlVMRV9TVFJJTkcgKSApICkgKSApCisgICAgICAgICAgICAJICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEwMDE6NjogKHsuLi59PyA9PiAob3RoZXJsdl82PSAnbG9jYWxlJyAoIChsdl9sb2NhbGVfN18wPSBSVUxFX1NUUklORyApICkgKSApCiAgICAgICAgICAgICAJICAgIHsKICAgICAgICAgICAgIAkgICAgZ2V0VW5vcmRlcmVkR3JvdXBIZWxwZXIoKS5zZWxlY3QoZ3JhbW1hckFjY2Vzcy5nZXREYXRhSW50ZXJjaGFuZ2VGaWxlRURJQWNjZXNzKCkuZ2V0VW5vcmRlcmVkR3JvdXBfMygpLCAxKTsKLSAgICAgICAgICAgIAkgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6OTkwOjk6ICh7Li4ufT8gPT4gKG90aGVybHZfNj0gJ2xvY2FsZScgKCAobHZfbG9jYWxlXzdfMD0gUlVMRV9TVFJJTkcgKSApICkgKQotICAgICAgICAgICAgCSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo5OTA6MTA6IHsuLi59PyA9PiAob3RoZXJsdl82PSAnbG9jYWxlJyAoIChsdl9sb2NhbGVfN18wPSBSVUxFX1NUUklORyApICkgKQorICAgICAgICAgICAgCSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMDA0Ojk6ICh7Li4ufT8gPT4gKG90aGVybHZfNj0gJ2xvY2FsZScgKCAobHZfbG9jYWxlXzdfMD0gUlVMRV9TVFJJTkcgKSApICkgKQorICAgICAgICAgICAgCSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMDA0OjEwOiB7Li4ufT8gPT4gKG90aGVybHZfNj0gJ2xvY2FsZScgKCAobHZfbG9jYWxlXzdfMD0gUlVMRV9TVFJJTkcgKSApICkKICAgICAgICAgICAgIAkgICAgewogICAgICAgICAgICAgCSAgICBpZiAoICEoKHRydWUpKSApIHsKICAgICAgICAgICAgIAkgICAgICAgIGlmIChzdGF0ZS5iYWNrdHJhY2tpbmc+MCkge3N0YXRlLmZhaWxlZD10cnVlOyByZXR1cm4gY3VycmVudDt9CiAgICAgICAgICAgICAJICAgICAgICB0aHJvdyBuZXcgRmFpbGVkUHJlZGljYXRlRXhjZXB0aW9uKGlucHV0LCAicnVsZURhdGFJbnRlcmNoYW5nZUZpbGVFREkiLCAidHJ1ZSIpOwogICAgICAgICAgICAgCSAgICB9Ci0gICAgICAgICAgICAJICAgIC8vIEludGVybmFsRGF0YURTTC5nOjk5MDoxOTogKG90aGVybHZfNj0gJ2xvY2FsZScgKCAobHZfbG9jYWxlXzdfMD0gUlVMRV9TVFJJTkcgKSApICkKLSAgICAgICAgICAgIAkgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6OTkwOjIwOiBvdGhlcmx2XzY9ICdsb2NhbGUnICggKGx2X2xvY2FsZV83XzA9IFJVTEVfU1RSSU5HICkgKQorICAgICAgICAgICAgCSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMDA0OjE5OiAob3RoZXJsdl82PSAnbG9jYWxlJyAoIChsdl9sb2NhbGVfN18wPSBSVUxFX1NUUklORyApICkgKQorICAgICAgICAgICAgCSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMDA0OjIwOiBvdGhlcmx2XzY9ICdsb2NhbGUnICggKGx2X2xvY2FsZV83XzA9IFJVTEVfU1RSSU5HICkgKQogICAgICAgICAgICAgCSAgICB7Ci0gICAgICAgICAgICAJICAgIG90aGVybHZfNj0oVG9rZW4pbWF0Y2goaW5wdXQsMjcsRk9MTE9XXzYpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gY3VycmVudDsKKyAgICAgICAgICAgIAkgICAgb3RoZXJsdl82PShUb2tlbiltYXRjaChpbnB1dCwyOCxGT0xMT1dfNik7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OwogICAgICAgICAgICAgCSAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKIAogICAgICAgICAgICAgCSAgICAgIAkJCQkJCQkJCW5ld0xlYWZOb2RlKG90aGVybHZfNiwgZ3JhbW1hckFjY2Vzcy5nZXREYXRhSW50ZXJjaGFuZ2VGaWxlRURJQWNjZXNzKCkuZ2V0TG9jYWxlS2V5d29yZF8zXzFfMCgpKTsKICAgICAgICAgICAgIAkgICAgICAJCQkJCQkJCQogICAgICAgICAgICAgCSAgICB9Ci0gICAgICAgICAgICAJICAgIC8vIEludGVybmFsRGF0YURTTC5nOjk5NDo5OiAoIChsdl9sb2NhbGVfN18wPSBSVUxFX1NUUklORyApICkKLSAgICAgICAgICAgIAkgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6OTk1OjEwOiAobHZfbG9jYWxlXzdfMD0gUlVMRV9TVFJJTkcgKQorICAgICAgICAgICAgCSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMDA4Ojk6ICggKGx2X2xvY2FsZV83XzA9IFJVTEVfU1RSSU5HICkgKQorICAgICAgICAgICAgCSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMDA5OjEwOiAobHZfbG9jYWxlXzdfMD0gUlVMRV9TVFJJTkcgKQogICAgICAgICAgICAgCSAgICB7Ci0gICAgICAgICAgICAJICAgIC8vIEludGVybmFsRGF0YURTTC5nOjk5NToxMDogKGx2X2xvY2FsZV83XzA9IFJVTEVfU1RSSU5HICkKLSAgICAgICAgICAgIAkgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6OTk2OjExOiBsdl9sb2NhbGVfN18wPSBSVUxFX1NUUklORworICAgICAgICAgICAgCSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMDA5OjEwOiAobHZfbG9jYWxlXzdfMD0gUlVMRV9TVFJJTkcgKQorICAgICAgICAgICAgCSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMDEwOjExOiBsdl9sb2NhbGVfN18wPSBSVUxFX1NUUklORwogICAgICAgICAgICAgCSAgICB7Ci0gICAgICAgICAgICAJICAgIGx2X2xvY2FsZV83XzA9KFRva2VuKW1hdGNoKGlucHV0LFJVTEVfU1RSSU5HLEZPTExPV18yMSk7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OworICAgICAgICAgICAgCSAgICBsdl9sb2NhbGVfN18wPShUb2tlbiltYXRjaChpbnB1dCxSVUxFX1NUUklORyxGT0xMT1dfMjIpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gY3VycmVudDsKICAgICAgICAgICAgIAkgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAKICAgICAgICAgICAgIAkgICAgICAJCQkJCQkJCQkJCW5ld0xlYWZOb2RlKGx2X2xvY2FsZV83XzAsIGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YUludGVyY2hhbmdlRmlsZUVESUFjY2VzcygpLmdldExvY2FsZVNUUklOR1Rlcm1pbmFsUnVsZUNhbGxfM18xXzFfMCgpKTsKQEAgLTI3MDEsNyArMjc1Myw3IEBACiAgICAgICAgICAgICAJICAgIGJyZWFrOwogCiAgICAgICAgICAgICAJZGVmYXVsdCA6Ci0gICAgICAgICAgICAJICAgIGJyZWFrIGxvb3AxMzsKKyAgICAgICAgICAgIAkgICAgYnJlYWsgbG9vcDE0OwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0gd2hpbGUgKHRydWUpOwogCkBAIC0yNzE1LDE5ICsyNzY3LDE5IEBACiAKICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgb3RoZXJsdl84PShUb2tlbiltYXRjaChpbnB1dCwzNCxGT0xMT1dfNik7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OworICAgICAgICAgICAgb3RoZXJsdl84PShUb2tlbiltYXRjaChpbnB1dCwzNSxGT0xMT1dfNik7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OwogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAKICAgICAgICAgICAgICAgCQkJbmV3TGVhZk5vZGUob3RoZXJsdl84LCBncmFtbWFyQWNjZXNzLmdldERhdGFJbnRlcmNoYW5nZUZpbGVFRElBY2Nlc3MoKS5nZXRNYXBwaW5nTW9kZWxLZXl3b3JkXzQoKSk7CiAgICAgICAgICAgICAgIAkJCiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMDI5OjM6ICggKGx2X21hcHBpbmdNb2RlbF85XzA9IFJVTEVfU1RSSU5HICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTAzMDo0OiAobHZfbWFwcGluZ01vZGVsXzlfMD0gUlVMRV9TVFJJTkcgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTA0MzozOiAoIChsdl9tYXBwaW5nTW9kZWxfOV8wPSBSVUxFX1NUUklORyApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEwNDQ6NDogKGx2X21hcHBpbmdNb2RlbF85XzA9IFJVTEVfU1RSSU5HICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEwMzA6NDogKGx2X21hcHBpbmdNb2RlbF85XzA9IFJVTEVfU1RSSU5HICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEwMzE6NTogbHZfbWFwcGluZ01vZGVsXzlfMD0gUlVMRV9TVFJJTkcKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEwNDQ6NDogKGx2X21hcHBpbmdNb2RlbF85XzA9IFJVTEVfU1RSSU5HICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEwNDU6NTogbHZfbWFwcGluZ01vZGVsXzlfMD0gUlVMRV9TVFJJTkcKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIGx2X21hcHBpbmdNb2RlbF85XzA9KFRva2VuKW1hdGNoKGlucHV0LFJVTEVfU1RSSU5HLEZPTExPV18yMik7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OworICAgICAgICAgICAgbHZfbWFwcGluZ01vZGVsXzlfMD0oVG9rZW4pbWF0Y2goaW5wdXQsUlVMRV9TVFJJTkcsRk9MTE9XXzIzKTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKIAogICAgICAgICAgICAgICAJCQkJCW5ld0xlYWZOb2RlKGx2X21hcHBpbmdNb2RlbF85XzAsIGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YUludGVyY2hhbmdlRmlsZUVESUFjY2VzcygpLmdldE1hcHBpbmdNb2RlbFNUUklOR1Rlcm1pbmFsUnVsZUNhbGxfNV8wKCkpOwpAQCAtMjc1MSwyMSArMjgwMywyMSBAQAogCiAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEwNDc6MzogKCAobHZfdmFsaWRhdGVfMTBfMD0gJ3ZhbGlkYXRlJyApICk/Ci0gICAgICAgICAgICBpbnQgYWx0MTQ9MjsKLSAgICAgICAgICAgIGludCBMQTE0XzAgPSBpbnB1dC5MQSgxKTsKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEwNjE6MzogKCAobHZfdmFsaWRhdGVfMTBfMD0gJ3ZhbGlkYXRlJyApICk/CisgICAgICAgICAgICBpbnQgYWx0MTU9MjsKKyAgICAgICAgICAgIGludCBMQTE1XzAgPSBpbnB1dC5MQSgxKTsKIAotICAgICAgICAgICAgaWYgKCAoTEExNF8wPT0zNSkgKSB7Ci0gICAgICAgICAgICAgICAgYWx0MTQ9MTsKKyAgICAgICAgICAgIGlmICggKExBMTVfMD09MzYpICkgeworICAgICAgICAgICAgICAgIGFsdDE1PTE7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBzd2l0Y2ggKGFsdDE0KSB7CisgICAgICAgICAgICBzd2l0Y2ggKGFsdDE1KSB7CiAgICAgICAgICAgICAgICAgY2FzZSAxIDoKLSAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTA0ODo0OiAobHZfdmFsaWRhdGVfMTBfMD0gJ3ZhbGlkYXRlJyApCisgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEwNjI6NDogKGx2X3ZhbGlkYXRlXzEwXzA9ICd2YWxpZGF0ZScgKQogICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEwNDg6NDogKGx2X3ZhbGlkYXRlXzEwXzA9ICd2YWxpZGF0ZScgKQotICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMDQ5OjU6IGx2X3ZhbGlkYXRlXzEwXzA9ICd2YWxpZGF0ZScKKyAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTA2Mjo0OiAobHZfdmFsaWRhdGVfMTBfMD0gJ3ZhbGlkYXRlJyApCisgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEwNjM6NTogbHZfdmFsaWRhdGVfMTBfMD0gJ3ZhbGlkYXRlJwogICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGx2X3ZhbGlkYXRlXzEwXzA9KFRva2VuKW1hdGNoKGlucHV0LDM1LEZPTExPV18yKTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7CisgICAgICAgICAgICAgICAgICAgIGx2X3ZhbGlkYXRlXzEwXzA9KFRva2VuKW1hdGNoKGlucHV0LDM2LEZPTExPV18yKTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7CiAgICAgICAgICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogCiAgICAgICAgICAgICAgICAgICAgICAgCQkJCQluZXdMZWFmTm9kZShsdl92YWxpZGF0ZV8xMF8wLCBncmFtbWFyQWNjZXNzLmdldERhdGFJbnRlcmNoYW5nZUZpbGVFRElBY2Nlc3MoKS5nZXRWYWxpZGF0ZVZhbGlkYXRlS2V5d29yZF82XzAoKSk7CkBAIC0yODEzLDcgKzI4NjUsNyBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgImVudHJ5UnVsZURhdGFJbnRlcmNoYW5nZUJlYW4iCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTA2NToxOiBlbnRyeVJ1bGVEYXRhSW50ZXJjaGFuZ2VCZWFuIHJldHVybnMgW0VPYmplY3QgY3VycmVudD1udWxsXSA6IGl2X3J1bGVEYXRhSW50ZXJjaGFuZ2VCZWFuPSBydWxlRGF0YUludGVyY2hhbmdlQmVhbiBFT0YgOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEwNzk6MTogZW50cnlSdWxlRGF0YUludGVyY2hhbmdlQmVhbiByZXR1cm5zIFtFT2JqZWN0IGN1cnJlbnQ9bnVsbF0gOiBpdl9ydWxlRGF0YUludGVyY2hhbmdlQmVhbj0gcnVsZURhdGFJbnRlcmNoYW5nZUJlYW4gRU9GIDsKICAgICBwdWJsaWMgZmluYWwgRU9iamVjdCBlbnRyeVJ1bGVEYXRhSW50ZXJjaGFuZ2VCZWFuKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKICAgICAgICAgRU9iamVjdCBjdXJyZW50ID0gbnVsbDsKIApAQCAtMjgyMSw4ICsyODczLDggQEAKIAogCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMDY1OjYwOiAoaXZfcnVsZURhdGFJbnRlcmNoYW5nZUJlYW49IHJ1bGVEYXRhSW50ZXJjaGFuZ2VCZWFuIEVPRiApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMDY2OjI6IGl2X3J1bGVEYXRhSW50ZXJjaGFuZ2VCZWFuPSBydWxlRGF0YUludGVyY2hhbmdlQmVhbiBFT0YKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEwNzk6NjA6IChpdl9ydWxlRGF0YUludGVyY2hhbmdlQmVhbj0gcnVsZURhdGFJbnRlcmNoYW5nZUJlYW4gRU9GICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEwODA6MjogaXZfcnVsZURhdGFJbnRlcmNoYW5nZUJlYW49IHJ1bGVEYXRhSW50ZXJjaGFuZ2VCZWFuIEVPRgogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBuZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YUludGVyY2hhbmdlQmVhblJ1bGUoKSk7IApAQCAtMjg1Myw3ICsyOTA1LDcgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlRGF0YUludGVyY2hhbmdlQmVhbiIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMDcyOjE6IHJ1bGVEYXRhSW50ZXJjaGFuZ2VCZWFuIHJldHVybnMgW0VPYmplY3QgY3VycmVudD1udWxsXSA6ICggKCkgb3RoZXJsdl8xPSAnZW50aXR5JyAoICggcnVsZUxGUU4gKSApIChvdGhlcmx2XzM9ICdub2RlTmFtZScgKCAobHZfbm9kZU5hbWVfNF8wPSBSVUxFX1NUUklORyApICkgKT8gKG90aGVybHZfNT0gJ2NyZWF0ZU9uJyAoIChsdl9lbGVtZW50TWFwXzZfMD0gUlVMRV9TVFJJTkcgKSApICk/ICggKCAobHZfbWFya0xhdGVzdF83XzA9ICdtYXJrZXInICkgKSAoIChvdGhlcmx2Xzg9IFJVTEVfSUQgKSApICk/IChvdGhlcmx2Xzk9ICdleHByZXNzaW9uJyBvdGhlcmx2XzEwPSAneycgKCAobHZfZXhwcmVzc2lvbl8xMV8wPSBydWxlRGF0YUludGVyY2hhbmdlRXhwcmVzc2lvbiApICkqIG90aGVybHZfMTI9ICd9JyApPyAob3RoZXJsdl8xMz0gJ2xvb2t1cCcgb3RoZXJsdl8xND0gJ3snICggKGx2X2xvb2t1cF8xNV8wPSBydWxlRGF0YUludGVyY2hhbmdlTG9va3VwICkgKSogb3RoZXJsdl8xNj0gJ30nICk/IChvdGhlcmx2XzE3PSAnZm9ybWF0JyBvdGhlcmx2XzE4PSAneycgKCAobHZfZm9ybWF0XzE5XzA9IHJ1bGVEYXRhSW50ZXJjaGFuZ2VGb3JtYXQgKSApKiBvdGhlcmx2XzIwPSAnfScgKT8gKG90aGVybHZfMjE9ICdtYXBwaW5nJyBvdGhlcmx2XzIyPSAneycgKCAobHZfbWFwcGluZ3NfMjNfMD0gcnVsZURhdGFJbnRlcmNoYW5nZU1hcHBpbmcgKSApKiBvdGhlcmx2XzI0PSAnfScgKT8gKG90aGVybHZfMjU9ICdrZXlzJyBvdGhlcmx2XzI2PSAneycgKCAobHZfbG9va3VwS2V5c18yN18wPSBydWxlRGF0YUludGVyY2hhbmdlS2V5ICkgKSogb3RoZXJsdl8yOD0gJ30nICk/ICkgOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEwODY6MTogcnVsZURhdGFJbnRlcmNoYW5nZUJlYW4gcmV0dXJucyBbRU9iamVjdCBjdXJyZW50PW51bGxdIDogKCAoKSBvdGhlcmx2XzE9ICdlbnRpdHknICggKCBydWxlTEZRTiApICkgKG90aGVybHZfMz0gJ25vZGVOYW1lJyAoIChsdl9ub2RlTmFtZV80XzA9IFJVTEVfU1RSSU5HICkgKSApPyAob3RoZXJsdl81PSAnY3JlYXRlT24nICggKGx2X2VsZW1lbnRNYXBfNl8wPSBSVUxFX1NUUklORyApICkgKT8gKCAoIChsdl9tYXJrTGF0ZXN0SW1wb3J0XzdfMD0gJ2xhdGVzdEltcG9ydCcgKSApICggKG90aGVybHZfOD0gUlVMRV9JRCApICkgKT8gKCAoIChsdl9tYXJrTGF0ZXN0RXhwb3J0XzlfMD0gJ2xhdGVzdEV4cG9ydCcgKSApICggKG90aGVybHZfMTA9IFJVTEVfSUQgKSApICk/IChvdGhlcmx2XzExPSAnZXhwcmVzc2lvbicgb3RoZXJsdl8xMj0gJ3snICggKGx2X2V4cHJlc3Npb25fMTNfMD0gcnVsZURhdGFJbnRlcmNoYW5nZUV4cHJlc3Npb24gKSApKiBvdGhlcmx2XzE0PSAnfScgKT8gKG90aGVybHZfMTU9ICdsb29rdXAnIG90aGVybHZfMTY9ICd7JyAoIChsdl9sb29rdXBfMTdfMD0gcnVsZURhdGFJbnRlcmNoYW5nZUxvb2t1cCApICkqIG90aGVybHZfMTg9ICd9JyApPyAob3RoZXJsdl8xOT0gJ2Zvcm1hdCcgb3RoZXJsdl8yMD0gJ3snICggKGx2X2Zvcm1hdF8yMV8wPSBydWxlRGF0YUludGVyY2hhbmdlRm9ybWF0ICkgKSogb3RoZXJsdl8yMj0gJ30nICk/IChvdGhlcmx2XzIzPSAnZXhwb3NlJyBvdGhlcmx2XzI0PSAneycgKCAobHZfZXhwb3J0RXhwb3Nlc18yNV8wPSBydWxlRGF0YUludGVyY2hhbmdlRXhwb3NlICkgKSogb3RoZXJsdl8yNj0gJ30nICk/IChvdGhlcmx2XzI3PSAnbWFwcGluZycgb3RoZXJsdl8yOD0gJ3snICggKGx2X21hcHBpbmdzXzI5XzA9IHJ1bGVEYXRhSW50ZXJjaGFuZ2VNYXBwaW5nICkgKSogb3RoZXJsdl8zMD0gJ30nICk/IChvdGhlcmx2XzMxPSAna2V5cycgb3RoZXJsdl8zMj0gJ3snICggKGx2X2xvb2t1cEtleXNfMzNfMD0gcnVsZURhdGFJbnRlcmNoYW5nZUtleSApICkqIG90aGVybHZfMzQ9ICd9JyApPyAob3RoZXJsdl8zNT0gJ2V4cG9ydEZpbHRlcicgb3RoZXJsdl8zNj0gJ3snICggKGx2X2V4cG9ydEZpbHRlcl8zN18wPSBydWxlRGF0YUludGVyY2hhbmdlRXhwb3J0RmlsdGVyICkgKSBvdGhlcmx2XzM4PSAnfScgKT8gKSA7CiAgICAgcHVibGljIGZpbmFsIEVPYmplY3QgcnVsZURhdGFJbnRlcmNoYW5nZUJlYW4oKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogICAgICAgICBFT2JqZWN0IGN1cnJlbnQgPSBudWxsOwogCkBAIC0yODYyLDQ2ICsyOTE0LDU4IEBACiAgICAgICAgIFRva2VuIGx2X25vZGVOYW1lXzRfMD1udWxsOwogICAgICAgICBUb2tlbiBvdGhlcmx2XzU9bnVsbDsKICAgICAgICAgVG9rZW4gbHZfZWxlbWVudE1hcF82XzA9bnVsbDsKLSAgICAgICAgVG9rZW4gbHZfbWFya0xhdGVzdF83XzA9bnVsbDsKKyAgICAgICAgVG9rZW4gbHZfbWFya0xhdGVzdEltcG9ydF83XzA9bnVsbDsKICAgICAgICAgVG9rZW4gb3RoZXJsdl84PW51bGw7Ci0gICAgICAgIFRva2VuIG90aGVybHZfOT1udWxsOworICAgICAgICBUb2tlbiBsdl9tYXJrTGF0ZXN0RXhwb3J0XzlfMD1udWxsOwogICAgICAgICBUb2tlbiBvdGhlcmx2XzEwPW51bGw7CisgICAgICAgIFRva2VuIG90aGVybHZfMTE9bnVsbDsKICAgICAgICAgVG9rZW4gb3RoZXJsdl8xMj1udWxsOwotICAgICAgICBUb2tlbiBvdGhlcmx2XzEzPW51bGw7CiAgICAgICAgIFRva2VuIG90aGVybHZfMTQ9bnVsbDsKKyAgICAgICAgVG9rZW4gb3RoZXJsdl8xNT1udWxsOwogICAgICAgICBUb2tlbiBvdGhlcmx2XzE2PW51bGw7Ci0gICAgICAgIFRva2VuIG90aGVybHZfMTc9bnVsbDsKICAgICAgICAgVG9rZW4gb3RoZXJsdl8xOD1udWxsOworICAgICAgICBUb2tlbiBvdGhlcmx2XzE5PW51bGw7CiAgICAgICAgIFRva2VuIG90aGVybHZfMjA9bnVsbDsKLSAgICAgICAgVG9rZW4gb3RoZXJsdl8yMT1udWxsOwogICAgICAgICBUb2tlbiBvdGhlcmx2XzIyPW51bGw7CisgICAgICAgIFRva2VuIG90aGVybHZfMjM9bnVsbDsKICAgICAgICAgVG9rZW4gb3RoZXJsdl8yND1udWxsOwotICAgICAgICBUb2tlbiBvdGhlcmx2XzI1PW51bGw7CiAgICAgICAgIFRva2VuIG90aGVybHZfMjY9bnVsbDsKKyAgICAgICAgVG9rZW4gb3RoZXJsdl8yNz1udWxsOwogICAgICAgICBUb2tlbiBvdGhlcmx2XzI4PW51bGw7Ci0gICAgICAgIEVPYmplY3QgbHZfZXhwcmVzc2lvbl8xMV8wID0gbnVsbDsKKyAgICAgICAgVG9rZW4gb3RoZXJsdl8zMD1udWxsOworICAgICAgICBUb2tlbiBvdGhlcmx2XzMxPW51bGw7CisgICAgICAgIFRva2VuIG90aGVybHZfMzI9bnVsbDsKKyAgICAgICAgVG9rZW4gb3RoZXJsdl8zND1udWxsOworICAgICAgICBUb2tlbiBvdGhlcmx2XzM1PW51bGw7CisgICAgICAgIFRva2VuIG90aGVybHZfMzY9bnVsbDsKKyAgICAgICAgVG9rZW4gb3RoZXJsdl8zOD1udWxsOworICAgICAgICBFT2JqZWN0IGx2X2V4cHJlc3Npb25fMTNfMCA9IG51bGw7CiAKLSAgICAgICAgRU9iamVjdCBsdl9sb29rdXBfMTVfMCA9IG51bGw7CisgICAgICAgIEVPYmplY3QgbHZfbG9va3VwXzE3XzAgPSBudWxsOwogCi0gICAgICAgIEVPYmplY3QgbHZfZm9ybWF0XzE5XzAgPSBudWxsOworICAgICAgICBFT2JqZWN0IGx2X2Zvcm1hdF8yMV8wID0gbnVsbDsKIAotICAgICAgICBFT2JqZWN0IGx2X21hcHBpbmdzXzIzXzAgPSBudWxsOworICAgICAgICBFT2JqZWN0IGx2X2V4cG9ydEV4cG9zZXNfMjVfMCA9IG51bGw7CiAKLSAgICAgICAgRU9iamVjdCBsdl9sb29rdXBLZXlzXzI3XzAgPSBudWxsOworICAgICAgICBFT2JqZWN0IGx2X21hcHBpbmdzXzI5XzAgPSBudWxsOworCisgICAgICAgIEVPYmplY3QgbHZfbG9va3VwS2V5c18zM18wID0gbnVsbDsKKworICAgICAgICBFT2JqZWN0IGx2X2V4cG9ydEZpbHRlcl8zN18wID0gbnVsbDsKIAogCiAKICAgICAgICAgCWVudGVyUnVsZSgpOwogCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMDc4OjI6ICggKCAoKSBvdGhlcmx2XzE9ICdlbnRpdHknICggKCBydWxlTEZRTiApICkgKG90aGVybHZfMz0gJ25vZGVOYW1lJyAoIChsdl9ub2RlTmFtZV80XzA9IFJVTEVfU1RSSU5HICkgKSApPyAob3RoZXJsdl81PSAnY3JlYXRlT24nICggKGx2X2VsZW1lbnRNYXBfNl8wPSBSVUxFX1NUUklORyApICkgKT8gKCAoIChsdl9tYXJrTGF0ZXN0XzdfMD0gJ21hcmtlcicgKSApICggKG90aGVybHZfOD0gUlVMRV9JRCApICkgKT8gKG90aGVybHZfOT0gJ2V4cHJlc3Npb24nIG90aGVybHZfMTA9ICd7JyAoIChsdl9leHByZXNzaW9uXzExXzA9IHJ1bGVEYXRhSW50ZXJjaGFuZ2VFeHByZXNzaW9uICkgKSogb3RoZXJsdl8xMj0gJ30nICk/IChvdGhlcmx2XzEzPSAnbG9va3VwJyBvdGhlcmx2XzE0PSAneycgKCAobHZfbG9va3VwXzE1XzA9IHJ1bGVEYXRhSW50ZXJjaGFuZ2VMb29rdXAgKSApKiBvdGhlcmx2XzE2PSAnfScgKT8gKG90aGVybHZfMTc9ICdmb3JtYXQnIG90aGVybHZfMTg9ICd7JyAoIChsdl9mb3JtYXRfMTlfMD0gcnVsZURhdGFJbnRlcmNoYW5nZUZvcm1hdCApICkqIG90aGVybHZfMjA9ICd9JyApPyAob3RoZXJsdl8yMT0gJ21hcHBpbmcnIG90aGVybHZfMjI9ICd7JyAoIChsdl9tYXBwaW5nc18yM18wPSBydWxlRGF0YUludGVyY2hhbmdlTWFwcGluZyApICkqIG90aGVybHZfMjQ9ICd9JyApPyAob3RoZXJsdl8yNT0gJ2tleXMnIG90aGVybHZfMjY9ICd7JyAoIChsdl9sb29rdXBLZXlzXzI3XzA9IHJ1bGVEYXRhSW50ZXJjaGFuZ2VLZXkgKSApKiBvdGhlcmx2XzI4PSAnfScgKT8gKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMDc5OjI6ICggKCkgb3RoZXJsdl8xPSAnZW50aXR5JyAoICggcnVsZUxGUU4gKSApIChvdGhlcmx2XzM9ICdub2RlTmFtZScgKCAobHZfbm9kZU5hbWVfNF8wPSBSVUxFX1NUUklORyApICkgKT8gKG90aGVybHZfNT0gJ2NyZWF0ZU9uJyAoIChsdl9lbGVtZW50TWFwXzZfMD0gUlVMRV9TVFJJTkcgKSApICk/ICggKCAobHZfbWFya0xhdGVzdF83XzA9ICdtYXJrZXInICkgKSAoIChvdGhlcmx2Xzg9IFJVTEVfSUQgKSApICk/IChvdGhlcmx2Xzk9ICdleHByZXNzaW9uJyBvdGhlcmx2XzEwPSAneycgKCAobHZfZXhwcmVzc2lvbl8xMV8wPSBydWxlRGF0YUludGVyY2hhbmdlRXhwcmVzc2lvbiApICkqIG90aGVybHZfMTI9ICd9JyApPyAob3RoZXJsdl8xMz0gJ2xvb2t1cCcgb3RoZXJsdl8xND0gJ3snICggKGx2X2xvb2t1cF8xNV8wPSBydWxlRGF0YUludGVyY2hhbmdlTG9va3VwICkgKSogb3RoZXJsdl8xNj0gJ30nICk/IChvdGhlcmx2XzE3PSAnZm9ybWF0JyBvdGhlcmx2XzE4PSAneycgKCAobHZfZm9ybWF0XzE5XzA9IHJ1bGVEYXRhSW50ZXJjaGFuZ2VGb3JtYXQgKSApKiBvdGhlcmx2XzIwPSAnfScgKT8gKG90aGVybHZfMjE9ICdtYXBwaW5nJyBvdGhlcmx2XzIyPSAneycgKCAobHZfbWFwcGluZ3NfMjNfMD0gcnVsZURhdGFJbnRlcmNoYW5nZU1hcHBpbmcgKSApKiBvdGhlcmx2XzI0PSAnfScgKT8gKG90aGVybHZfMjU9ICdrZXlzJyBvdGhlcmx2XzI2PSAneycgKCAobHZfbG9va3VwS2V5c18yN18wPSBydWxlRGF0YUludGVyY2hhbmdlS2V5ICkgKSogb3RoZXJsdl8yOD0gJ30nICk/ICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEwOTI6MjogKCAoICgpIG90aGVybHZfMT0gJ2VudGl0eScgKCAoIHJ1bGVMRlFOICkgKSAob3RoZXJsdl8zPSAnbm9kZU5hbWUnICggKGx2X25vZGVOYW1lXzRfMD0gUlVMRV9TVFJJTkcgKSApICk/IChvdGhlcmx2XzU9ICdjcmVhdGVPbicgKCAobHZfZWxlbWVudE1hcF82XzA9IFJVTEVfU1RSSU5HICkgKSApPyAoICggKGx2X21hcmtMYXRlc3RJbXBvcnRfN18wPSAnbGF0ZXN0SW1wb3J0JyApICkgKCAob3RoZXJsdl84PSBSVUxFX0lEICkgKSApPyAoICggKGx2X21hcmtMYXRlc3RFeHBvcnRfOV8wPSAnbGF0ZXN0RXhwb3J0JyApICkgKCAob3RoZXJsdl8xMD0gUlVMRV9JRCApICkgKT8gKG90aGVybHZfMTE9ICdleHByZXNzaW9uJyBvdGhlcmx2XzEyPSAneycgKCAobHZfZXhwcmVzc2lvbl8xM18wPSBydWxlRGF0YUludGVyY2hhbmdlRXhwcmVzc2lvbiApICkqIG90aGVybHZfMTQ9ICd9JyApPyAob3RoZXJsdl8xNT0gJ2xvb2t1cCcgb3RoZXJsdl8xNj0gJ3snICggKGx2X2xvb2t1cF8xN18wPSBydWxlRGF0YUludGVyY2hhbmdlTG9va3VwICkgKSogb3RoZXJsdl8xOD0gJ30nICk/IChvdGhlcmx2XzE5PSAnZm9ybWF0JyBvdGhlcmx2XzIwPSAneycgKCAobHZfZm9ybWF0XzIxXzA9IHJ1bGVEYXRhSW50ZXJjaGFuZ2VGb3JtYXQgKSApKiBvdGhlcmx2XzIyPSAnfScgKT8gKG90aGVybHZfMjM9ICdleHBvc2UnIG90aGVybHZfMjQ9ICd7JyAoIChsdl9leHBvcnRFeHBvc2VzXzI1XzA9IHJ1bGVEYXRhSW50ZXJjaGFuZ2VFeHBvc2UgKSApKiBvdGhlcmx2XzI2PSAnfScgKT8gKG90aGVybHZfMjc9ICdtYXBwaW5nJyBvdGhlcmx2XzI4PSAneycgKCAobHZfbWFwcGluZ3NfMjlfMD0gcnVsZURhdGFJbnRlcmNoYW5nZU1hcHBpbmcgKSApKiBvdGhlcmx2XzMwPSAnfScgKT8gKG90aGVybHZfMzE9ICdrZXlzJyBvdGhlcmx2XzMyPSAneycgKCAobHZfbG9va3VwS2V5c18zM18wPSBydWxlRGF0YUludGVyY2hhbmdlS2V5ICkgKSogb3RoZXJsdl8zND0gJ30nICk/IChvdGhlcmx2XzM1PSAnZXhwb3J0RmlsdGVyJyBvdGhlcmx2XzM2PSAneycgKCAobHZfZXhwb3J0RmlsdGVyXzM3XzA9IHJ1bGVEYXRhSW50ZXJjaGFuZ2VFeHBvcnRGaWx0ZXIgKSApIG90aGVybHZfMzg9ICd9JyApPyApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEwOTM6MjogKCAoKSBvdGhlcmx2XzE9ICdlbnRpdHknICggKCBydWxlTEZRTiApICkgKG90aGVybHZfMz0gJ25vZGVOYW1lJyAoIChsdl9ub2RlTmFtZV80XzA9IFJVTEVfU1RSSU5HICkgKSApPyAob3RoZXJsdl81PSAnY3JlYXRlT24nICggKGx2X2VsZW1lbnRNYXBfNl8wPSBSVUxFX1NUUklORyApICkgKT8gKCAoIChsdl9tYXJrTGF0ZXN0SW1wb3J0XzdfMD0gJ2xhdGVzdEltcG9ydCcgKSApICggKG90aGVybHZfOD0gUlVMRV9JRCApICkgKT8gKCAoIChsdl9tYXJrTGF0ZXN0RXhwb3J0XzlfMD0gJ2xhdGVzdEV4cG9ydCcgKSApICggKG90aGVybHZfMTA9IFJVTEVfSUQgKSApICk/IChvdGhlcmx2XzExPSAnZXhwcmVzc2lvbicgb3RoZXJsdl8xMj0gJ3snICggKGx2X2V4cHJlc3Npb25fMTNfMD0gcnVsZURhdGFJbnRlcmNoYW5nZUV4cHJlc3Npb24gKSApKiBvdGhlcmx2XzE0PSAnfScgKT8gKG90aGVybHZfMTU9ICdsb29rdXAnIG90aGVybHZfMTY9ICd7JyAoIChsdl9sb29rdXBfMTdfMD0gcnVsZURhdGFJbnRlcmNoYW5nZUxvb2t1cCApICkqIG90aGVybHZfMTg9ICd9JyApPyAob3RoZXJsdl8xOT0gJ2Zvcm1hdCcgb3RoZXJsdl8yMD0gJ3snICggKGx2X2Zvcm1hdF8yMV8wPSBydWxlRGF0YUludGVyY2hhbmdlRm9ybWF0ICkgKSogb3RoZXJsdl8yMj0gJ30nICk/IChvdGhlcmx2XzIzPSAnZXhwb3NlJyBvdGhlcmx2XzI0PSAneycgKCAobHZfZXhwb3J0RXhwb3Nlc18yNV8wPSBydWxlRGF0YUludGVyY2hhbmdlRXhwb3NlICkgKSogb3RoZXJsdl8yNj0gJ30nICk/IChvdGhlcmx2XzI3PSAnbWFwcGluZycgb3RoZXJsdl8yOD0gJ3snICggKGx2X21hcHBpbmdzXzI5XzA9IHJ1bGVEYXRhSW50ZXJjaGFuZ2VNYXBwaW5nICkgKSogb3RoZXJsdl8zMD0gJ30nICk/IChvdGhlcmx2XzMxPSAna2V5cycgb3RoZXJsdl8zMj0gJ3snICggKGx2X2xvb2t1cEtleXNfMzNfMD0gcnVsZURhdGFJbnRlcmNoYW5nZUtleSApICkqIG90aGVybHZfMzQ9ICd9JyApPyAob3RoZXJsdl8zNT0gJ2V4cG9ydEZpbHRlcicgb3RoZXJsdl8zNj0gJ3snICggKGx2X2V4cG9ydEZpbHRlcl8zN18wPSBydWxlRGF0YUludGVyY2hhbmdlRXhwb3J0RmlsdGVyICkgKSBvdGhlcmx2XzM4PSAnfScgKT8gKQogICAgICAgICAgICAgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTA3OToyOiAoICgpIG90aGVybHZfMT0gJ2VudGl0eScgKCAoIHJ1bGVMRlFOICkgKSAob3RoZXJsdl8zPSAnbm9kZU5hbWUnICggKGx2X25vZGVOYW1lXzRfMD0gUlVMRV9TVFJJTkcgKSApICk/IChvdGhlcmx2XzU9ICdjcmVhdGVPbicgKCAobHZfZWxlbWVudE1hcF82XzA9IFJVTEVfU1RSSU5HICkgKSApPyAoICggKGx2X21hcmtMYXRlc3RfN18wPSAnbWFya2VyJyApICkgKCAob3RoZXJsdl84PSBSVUxFX0lEICkgKSApPyAob3RoZXJsdl85PSAnZXhwcmVzc2lvbicgb3RoZXJsdl8xMD0gJ3snICggKGx2X2V4cHJlc3Npb25fMTFfMD0gcnVsZURhdGFJbnRlcmNoYW5nZUV4cHJlc3Npb24gKSApKiBvdGhlcmx2XzEyPSAnfScgKT8gKG90aGVybHZfMTM9ICdsb29rdXAnIG90aGVybHZfMTQ9ICd7JyAoIChsdl9sb29rdXBfMTVfMD0gcnVsZURhdGFJbnRlcmNoYW5nZUxvb2t1cCApICkqIG90aGVybHZfMTY9ICd9JyApPyAob3RoZXJsdl8xNz0gJ2Zvcm1hdCcgb3RoZXJsdl8xOD0gJ3snICggKGx2X2Zvcm1hdF8xOV8wPSBydWxlRGF0YUludGVyY2hhbmdlRm9ybWF0ICkgKSogb3RoZXJsdl8yMD0gJ30nICk/IChvdGhlcmx2XzIxPSAnbWFwcGluZycgb3RoZXJsdl8yMj0gJ3snICggKGx2X21hcHBpbmdzXzIzXzA9IHJ1bGVEYXRhSW50ZXJjaGFuZ2VNYXBwaW5nICkgKSogb3RoZXJsdl8yND0gJ30nICk/IChvdGhlcmx2XzI1PSAna2V5cycgb3RoZXJsdl8yNj0gJ3snICggKGx2X2xvb2t1cEtleXNfMjdfMD0gcnVsZURhdGFJbnRlcmNoYW5nZUtleSApICkqIG90aGVybHZfMjg9ICd9JyApPyApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMDgwOjM6ICgpIG90aGVybHZfMT0gJ2VudGl0eScgKCAoIHJ1bGVMRlFOICkgKSAob3RoZXJsdl8zPSAnbm9kZU5hbWUnICggKGx2X25vZGVOYW1lXzRfMD0gUlVMRV9TVFJJTkcgKSApICk/IChvdGhlcmx2XzU9ICdjcmVhdGVPbicgKCAobHZfZWxlbWVudE1hcF82XzA9IFJVTEVfU1RSSU5HICkgKSApPyAoICggKGx2X21hcmtMYXRlc3RfN18wPSAnbWFya2VyJyApICkgKCAob3RoZXJsdl84PSBSVUxFX0lEICkgKSApPyAob3RoZXJsdl85PSAnZXhwcmVzc2lvbicgb3RoZXJsdl8xMD0gJ3snICggKGx2X2V4cHJlc3Npb25fMTFfMD0gcnVsZURhdGFJbnRlcmNoYW5nZUV4cHJlc3Npb24gKSApKiBvdGhlcmx2XzEyPSAnfScgKT8gKG90aGVybHZfMTM9ICdsb29rdXAnIG90aGVybHZfMTQ9ICd7JyAoIChsdl9sb29rdXBfMTVfMD0gcnVsZURhdGFJbnRlcmNoYW5nZUxvb2t1cCApICkqIG90aGVybHZfMTY9ICd9JyApPyAob3RoZXJsdl8xNz0gJ2Zvcm1hdCcgb3RoZXJsdl8xOD0gJ3snICggKGx2X2Zvcm1hdF8xOV8wPSBydWxlRGF0YUludGVyY2hhbmdlRm9ybWF0ICkgKSogb3RoZXJsdl8yMD0gJ30nICk/IChvdGhlcmx2XzIxPSAnbWFwcGluZycgb3RoZXJsdl8yMj0gJ3snICggKGx2X21hcHBpbmdzXzIzXzA9IHJ1bGVEYXRhSW50ZXJjaGFuZ2VNYXBwaW5nICkgKSogb3RoZXJsdl8yND0gJ30nICk/IChvdGhlcmx2XzI1PSAna2V5cycgb3RoZXJsdl8yNj0gJ3snICggKGx2X2xvb2t1cEtleXNfMjdfMD0gcnVsZURhdGFJbnRlcmNoYW5nZUtleSApICkqIG90aGVybHZfMjg9ICd9JyApPworICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTA5MzoyOiAoICgpIG90aGVybHZfMT0gJ2VudGl0eScgKCAoIHJ1bGVMRlFOICkgKSAob3RoZXJsdl8zPSAnbm9kZU5hbWUnICggKGx2X25vZGVOYW1lXzRfMD0gUlVMRV9TVFJJTkcgKSApICk/IChvdGhlcmx2XzU9ICdjcmVhdGVPbicgKCAobHZfZWxlbWVudE1hcF82XzA9IFJVTEVfU1RSSU5HICkgKSApPyAoICggKGx2X21hcmtMYXRlc3RJbXBvcnRfN18wPSAnbGF0ZXN0SW1wb3J0JyApICkgKCAob3RoZXJsdl84PSBSVUxFX0lEICkgKSApPyAoICggKGx2X21hcmtMYXRlc3RFeHBvcnRfOV8wPSAnbGF0ZXN0RXhwb3J0JyApICkgKCAob3RoZXJsdl8xMD0gUlVMRV9JRCApICkgKT8gKG90aGVybHZfMTE9ICdleHByZXNzaW9uJyBvdGhlcmx2XzEyPSAneycgKCAobHZfZXhwcmVzc2lvbl8xM18wPSBydWxlRGF0YUludGVyY2hhbmdlRXhwcmVzc2lvbiApICkqIG90aGVybHZfMTQ9ICd9JyApPyAob3RoZXJsdl8xNT0gJ2xvb2t1cCcgb3RoZXJsdl8xNj0gJ3snICggKGx2X2xvb2t1cF8xN18wPSBydWxlRGF0YUludGVyY2hhbmdlTG9va3VwICkgKSogb3RoZXJsdl8xOD0gJ30nICk/IChvdGhlcmx2XzE5PSAnZm9ybWF0JyBvdGhlcmx2XzIwPSAneycgKCAobHZfZm9ybWF0XzIxXzA9IHJ1bGVEYXRhSW50ZXJjaGFuZ2VGb3JtYXQgKSApKiBvdGhlcmx2XzIyPSAnfScgKT8gKG90aGVybHZfMjM9ICdleHBvc2UnIG90aGVybHZfMjQ9ICd7JyAoIChsdl9leHBvcnRFeHBvc2VzXzI1XzA9IHJ1bGVEYXRhSW50ZXJjaGFuZ2VFeHBvc2UgKSApKiBvdGhlcmx2XzI2PSAnfScgKT8gKG90aGVybHZfMjc9ICdtYXBwaW5nJyBvdGhlcmx2XzI4PSAneycgKCAobHZfbWFwcGluZ3NfMjlfMD0gcnVsZURhdGFJbnRlcmNoYW5nZU1hcHBpbmcgKSApKiBvdGhlcmx2XzMwPSAnfScgKT8gKG90aGVybHZfMzE9ICdrZXlzJyBvdGhlcmx2XzMyPSAneycgKCAobHZfbG9va3VwS2V5c18zM18wPSBydWxlRGF0YUludGVyY2hhbmdlS2V5ICkgKSogb3RoZXJsdl8zND0gJ30nICk/IChvdGhlcmx2XzM1PSAnZXhwb3J0RmlsdGVyJyBvdGhlcmx2XzM2PSAneycgKCAobHZfZXhwb3J0RmlsdGVyXzM3XzA9IHJ1bGVEYXRhSW50ZXJjaGFuZ2VFeHBvcnRGaWx0ZXIgKSApIG90aGVybHZfMzg9ICd9JyApPyApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMDk0OjM6ICgpIG90aGVybHZfMT0gJ2VudGl0eScgKCAoIHJ1bGVMRlFOICkgKSAob3RoZXJsdl8zPSAnbm9kZU5hbWUnICggKGx2X25vZGVOYW1lXzRfMD0gUlVMRV9TVFJJTkcgKSApICk/IChvdGhlcmx2XzU9ICdjcmVhdGVPbicgKCAobHZfZWxlbWVudE1hcF82XzA9IFJVTEVfU1RSSU5HICkgKSApPyAoICggKGx2X21hcmtMYXRlc3RJbXBvcnRfN18wPSAnbGF0ZXN0SW1wb3J0JyApICkgKCAob3RoZXJsdl84PSBSVUxFX0lEICkgKSApPyAoICggKGx2X21hcmtMYXRlc3RFeHBvcnRfOV8wPSAnbGF0ZXN0RXhwb3J0JyApICkgKCAob3RoZXJsdl8xMD0gUlVMRV9JRCApICkgKT8gKG90aGVybHZfMTE9ICdleHByZXNzaW9uJyBvdGhlcmx2XzEyPSAneycgKCAobHZfZXhwcmVzc2lvbl8xM18wPSBydWxlRGF0YUludGVyY2hhbmdlRXhwcmVzc2lvbiApICkqIG90aGVybHZfMTQ9ICd9JyApPyAob3RoZXJsdl8xNT0gJ2xvb2t1cCcgb3RoZXJsdl8xNj0gJ3snICggKGx2X2xvb2t1cF8xN18wPSBydWxlRGF0YUludGVyY2hhbmdlTG9va3VwICkgKSogb3RoZXJsdl8xOD0gJ30nICk/IChvdGhlcmx2XzE5PSAnZm9ybWF0JyBvdGhlcmx2XzIwPSAneycgKCAobHZfZm9ybWF0XzIxXzA9IHJ1bGVEYXRhSW50ZXJjaGFuZ2VGb3JtYXQgKSApKiBvdGhlcmx2XzIyPSAnfScgKT8gKG90aGVybHZfMjM9ICdleHBvc2UnIG90aGVybHZfMjQ9ICd7JyAoIChsdl9leHBvcnRFeHBvc2VzXzI1XzA9IHJ1bGVEYXRhSW50ZXJjaGFuZ2VFeHBvc2UgKSApKiBvdGhlcmx2XzI2PSAnfScgKT8gKG90aGVybHZfMjc9ICdtYXBwaW5nJyBvdGhlcmx2XzI4PSAneycgKCAobHZfbWFwcGluZ3NfMjlfMD0gcnVsZURhdGFJbnRlcmNoYW5nZU1hcHBpbmcgKSApKiBvdGhlcmx2XzMwPSAnfScgKT8gKG90aGVybHZfMzE9ICdrZXlzJyBvdGhlcmx2XzMyPSAneycgKCAobHZfbG9va3VwS2V5c18zM18wPSBydWxlRGF0YUludGVyY2hhbmdlS2V5ICkgKSogb3RoZXJsdl8zND0gJ30nICk/IChvdGhlcmx2XzM1PSAnZXhwb3J0RmlsdGVyJyBvdGhlcmx2XzM2PSAneycgKCAobHZfZXhwb3J0RmlsdGVyXzM3XzA9IHJ1bGVEYXRhSW50ZXJjaGFuZ2VFeHBvcnRGaWx0ZXIgKSApIG90aGVybHZfMzg9ICd9JyApPwogICAgICAgICAgICAgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTA4MDozOiAoKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTA4MTo0OiAKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEwOTQ6MzogKCkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEwOTU6NDogCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKIApAQCAtMjkxMywxNyArMjk3NywxNyBAQAogCiAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgIG90aGVybHZfMT0oVG9rZW4pbWF0Y2goaW5wdXQsMzYsRk9MTE9XXzQpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gY3VycmVudDsKKyAgICAgICAgICAgIG90aGVybHZfMT0oVG9rZW4pbWF0Y2goaW5wdXQsMzcsRk9MTE9XXzQpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gY3VycmVudDsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogCiAgICAgICAgICAgICAgIAkJCW5ld0xlYWZOb2RlKG90aGVybHZfMSwgZ3JhbW1hckFjY2Vzcy5nZXREYXRhSW50ZXJjaGFuZ2VCZWFuQWNjZXNzKCkuZ2V0RW50aXR5S2V5d29yZF8xKCkpOwogICAgICAgICAgICAgICAJCQogICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTA5MTozOiAoICggcnVsZUxGUU4gKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMDkyOjQ6ICggcnVsZUxGUU4gKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTEwNTozOiAoICggcnVsZUxGUU4gKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMTA2OjQ6ICggcnVsZUxGUU4gKQogICAgICAgICAgICAgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTA5Mjo0OiAoIHJ1bGVMRlFOICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEwOTM6NTogcnVsZUxGUU4KKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjExMDY6NDogKCBydWxlTEZRTiApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMTA3OjU6IHJ1bGVMRlFOCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKIApAQCAtMjkzNyw3ICszMDAxLDcgQEAKICAgICAgICAgICAgICAgCQkJCQluZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YUludGVyY2hhbmdlQmVhbkFjY2VzcygpLmdldEVudGl0eUxFbnRpdHlDcm9zc1JlZmVyZW5jZV8yXzAoKSk7CiAgICAgICAgICAgICAgIAkJCQkKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzIzKTsKKyAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzI0KTsKICAgICAgICAgICAgIHJ1bGVMRlFOKCk7CiAKICAgICAgICAgICAgIHN0YXRlLl9mc3AtLTsKQEAgLTI5NTMsMzAgKzMwMTcsMzAgQEAKIAogICAgICAgICAgICAgfQogCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMTA3OjM6IChvdGhlcmx2XzM9ICdub2RlTmFtZScgKCAobHZfbm9kZU5hbWVfNF8wPSBSVUxFX1NUUklORyApICkgKT8KLSAgICAgICAgICAgIGludCBhbHQxNT0yOwotICAgICAgICAgICAgaW50IExBMTVfMCA9IGlucHV0LkxBKDEpOworICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTEyMTozOiAob3RoZXJsdl8zPSAnbm9kZU5hbWUnICggKGx2X25vZGVOYW1lXzRfMD0gUlVMRV9TVFJJTkcgKSApICk/CisgICAgICAgICAgICBpbnQgYWx0MTY9MjsKKyAgICAgICAgICAgIGludCBMQTE2XzAgPSBpbnB1dC5MQSgxKTsKIAotICAgICAgICAgICAgaWYgKCAoTEExNV8wPT0zNykgKSB7Ci0gICAgICAgICAgICAgICAgYWx0MTU9MTsKKyAgICAgICAgICAgIGlmICggKExBMTZfMD09MzgpICkgeworICAgICAgICAgICAgICAgIGFsdDE2PTE7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBzd2l0Y2ggKGFsdDE1KSB7CisgICAgICAgICAgICBzd2l0Y2ggKGFsdDE2KSB7CiAgICAgICAgICAgICAgICAgY2FzZSAxIDoKLSAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTEwODo0OiBvdGhlcmx2XzM9ICdub2RlTmFtZScgKCAobHZfbm9kZU5hbWVfNF8wPSBSVUxFX1NUUklORyApICkKKyAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTEyMjo0OiBvdGhlcmx2XzM9ICdub2RlTmFtZScgKCAobHZfbm9kZU5hbWVfNF8wPSBSVUxFX1NUUklORyApICkKICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBvdGhlcmx2XzM9KFRva2VuKW1hdGNoKGlucHV0LDM3LEZPTExPV182KTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7CisgICAgICAgICAgICAgICAgICAgIG90aGVybHZfMz0oVG9rZW4pbWF0Y2goaW5wdXQsMzgsRk9MTE9XXzYpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gY3VycmVudDsKICAgICAgICAgICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAKICAgICAgICAgICAgICAgICAgICAgICAJCQkJbmV3TGVhZk5vZGUob3RoZXJsdl8zLCBncmFtbWFyQWNjZXNzLmdldERhdGFJbnRlcmNoYW5nZUJlYW5BY2Nlc3MoKS5nZXROb2RlTmFtZUtleXdvcmRfM18wKCkpOwogICAgICAgICAgICAgICAgICAgICAgIAkJCQogICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjExMTI6NDogKCAobHZfbm9kZU5hbWVfNF8wPSBSVUxFX1NUUklORyApICkKLSAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTExMzo1OiAobHZfbm9kZU5hbWVfNF8wPSBSVUxFX1NUUklORyApCisgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjExMjY6NDogKCAobHZfbm9kZU5hbWVfNF8wPSBSVUxFX1NUUklORyApICkKKyAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTEyNzo1OiAobHZfbm9kZU5hbWVfNF8wPSBSVUxFX1NUUklORyApCiAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTExMzo1OiAobHZfbm9kZU5hbWVfNF8wPSBSVUxFX1NUUklORyApCi0gICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjExMTQ6NjogbHZfbm9kZU5hbWVfNF8wPSBSVUxFX1NUUklORworICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMTI3OjU6IChsdl9ub2RlTmFtZV80XzA9IFJVTEVfU1RSSU5HICkKKyAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTEyODo2OiBsdl9ub2RlTmFtZV80XzA9IFJVTEVfU1RSSU5HCiAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgbHZfbm9kZU5hbWVfNF8wPShUb2tlbiltYXRjaChpbnB1dCxSVUxFX1NUUklORyxGT0xMT1dfMjQpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gY3VycmVudDsKKyAgICAgICAgICAgICAgICAgICAgbHZfbm9kZU5hbWVfNF8wPShUb2tlbiltYXRjaChpbnB1dCxSVUxFX1NUUklORyxGT0xMT1dfMjUpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gY3VycmVudDsKICAgICAgICAgICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAKICAgICAgICAgICAgICAgICAgICAgICAJCQkJCQluZXdMZWFmTm9kZShsdl9ub2RlTmFtZV80XzAsIGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YUludGVyY2hhbmdlQmVhbkFjY2VzcygpLmdldE5vZGVOYW1lU1RSSU5HVGVybWluYWxSdWxlQ2FsbF8zXzFfMCgpKTsKQEAgLTMwMDYsMzAgKzMwNzAsMzAgQEAKIAogICAgICAgICAgICAgfQogCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMTMxOjM6IChvdGhlcmx2XzU9ICdjcmVhdGVPbicgKCAobHZfZWxlbWVudE1hcF82XzA9IFJVTEVfU1RSSU5HICkgKSApPwotICAgICAgICAgICAgaW50IGFsdDE2PTI7Ci0gICAgICAgICAgICBpbnQgTEExNl8wID0gaW5wdXQuTEEoMSk7CisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMTQ1OjM6IChvdGhlcmx2XzU9ICdjcmVhdGVPbicgKCAobHZfZWxlbWVudE1hcF82XzA9IFJVTEVfU1RSSU5HICkgKSApPworICAgICAgICAgICAgaW50IGFsdDE3PTI7CisgICAgICAgICAgICBpbnQgTEExN18wID0gaW5wdXQuTEEoMSk7CiAKLSAgICAgICAgICAgIGlmICggKExBMTZfMD09MzgpICkgewotICAgICAgICAgICAgICAgIGFsdDE2PTE7CisgICAgICAgICAgICBpZiAoIChMQTE3XzA9PTM5KSApIHsKKyAgICAgICAgICAgICAgICBhbHQxNz0xOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgc3dpdGNoIChhbHQxNikgeworICAgICAgICAgICAgc3dpdGNoIChhbHQxNykgewogICAgICAgICAgICAgICAgIGNhc2UgMSA6Ci0gICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjExMzI6NDogb3RoZXJsdl81PSAnY3JlYXRlT24nICggKGx2X2VsZW1lbnRNYXBfNl8wPSBSVUxFX1NUUklORyApICkKKyAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTE0Njo0OiBvdGhlcmx2XzU9ICdjcmVhdGVPbicgKCAobHZfZWxlbWVudE1hcF82XzA9IFJVTEVfU1RSSU5HICkgKQogICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIG90aGVybHZfNT0oVG9rZW4pbWF0Y2goaW5wdXQsMzgsRk9MTE9XXzYpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gY3VycmVudDsKKyAgICAgICAgICAgICAgICAgICAgb3RoZXJsdl81PShUb2tlbiltYXRjaChpbnB1dCwzOSxGT0xMT1dfNik7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OwogICAgICAgICAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKIAogICAgICAgICAgICAgICAgICAgICAgIAkJCQluZXdMZWFmTm9kZShvdGhlcmx2XzUsIGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YUludGVyY2hhbmdlQmVhbkFjY2VzcygpLmdldENyZWF0ZU9uS2V5d29yZF80XzAoKSk7CiAgICAgICAgICAgICAgICAgICAgICAgCQkJCiAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTEzNjo0OiAoIChsdl9lbGVtZW50TWFwXzZfMD0gUlVMRV9TVFJJTkcgKSApCi0gICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjExMzc6NTogKGx2X2VsZW1lbnRNYXBfNl8wPSBSVUxFX1NUUklORyApCisgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjExNTA6NDogKCAobHZfZWxlbWVudE1hcF82XzA9IFJVTEVfU1RSSU5HICkgKQorICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMTUxOjU6IChsdl9lbGVtZW50TWFwXzZfMD0gUlVMRV9TVFJJTkcgKQogICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjExMzc6NTogKGx2X2VsZW1lbnRNYXBfNl8wPSBSVUxFX1NUUklORyApCi0gICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjExMzg6NjogbHZfZWxlbWVudE1hcF82XzA9IFJVTEVfU1RSSU5HCisgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjExNTE6NTogKGx2X2VsZW1lbnRNYXBfNl8wPSBSVUxFX1NUUklORyApCisgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjExNTI6NjogbHZfZWxlbWVudE1hcF82XzA9IFJVTEVfU1RSSU5HCiAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgbHZfZWxlbWVudE1hcF82XzA9KFRva2VuKW1hdGNoKGlucHV0LFJVTEVfU1RSSU5HLEZPTExPV18yNSk7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OworICAgICAgICAgICAgICAgICAgICBsdl9lbGVtZW50TWFwXzZfMD0oVG9rZW4pbWF0Y2goaW5wdXQsUlVMRV9TVFJJTkcsRk9MTE9XXzI2KTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7CiAgICAgICAgICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogCiAgICAgICAgICAgICAgICAgICAgICAgCQkJCQkJbmV3TGVhZk5vZGUobHZfZWxlbWVudE1hcF82XzAsIGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YUludGVyY2hhbmdlQmVhbkFjY2VzcygpLmdldEVsZW1lbnRNYXBTVFJJTkdUZXJtaW5hbFJ1bGVDYWxsXzRfMV8wKCkpOwpAQCAtMzA1OSwyNyArMzEyMywyNyBAQAogCiAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjExNTU6MzogKCAoIChsdl9tYXJrTGF0ZXN0XzdfMD0gJ21hcmtlcicgKSApICggKG90aGVybHZfOD0gUlVMRV9JRCApICkgKT8KLSAgICAgICAgICAgIGludCBhbHQxNz0yOwotICAgICAgICAgICAgaW50IExBMTdfMCA9IGlucHV0LkxBKDEpOworICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTE2OTozOiAoICggKGx2X21hcmtMYXRlc3RJbXBvcnRfN18wPSAnbGF0ZXN0SW1wb3J0JyApICkgKCAob3RoZXJsdl84PSBSVUxFX0lEICkgKSApPworICAgICAgICAgICAgaW50IGFsdDE4PTI7CisgICAgICAgICAgICBpbnQgTEExOF8wID0gaW5wdXQuTEEoMSk7CiAKLSAgICAgICAgICAgIGlmICggKExBMTdfMD09MzkpICkgewotICAgICAgICAgICAgICAgIGFsdDE3PTE7CisgICAgICAgICAgICBpZiAoIChMQTE4XzA9PTQwKSApIHsKKyAgICAgICAgICAgICAgICBhbHQxOD0xOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgc3dpdGNoIChhbHQxNykgeworICAgICAgICAgICAgc3dpdGNoIChhbHQxOCkgewogICAgICAgICAgICAgICAgIGNhc2UgMSA6Ci0gICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjExNTY6NDogKCAobHZfbWFya0xhdGVzdF83XzA9ICdtYXJrZXInICkgKSAoIChvdGhlcmx2Xzg9IFJVTEVfSUQgKSApCisgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjExNzA6NDogKCAobHZfbWFya0xhdGVzdEltcG9ydF83XzA9ICdsYXRlc3RJbXBvcnQnICkgKSAoIChvdGhlcmx2Xzg9IFJVTEVfSUQgKSApCiAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTE1Njo0OiAoIChsdl9tYXJrTGF0ZXN0XzdfMD0gJ21hcmtlcicgKSApCi0gICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjExNTc6NTogKGx2X21hcmtMYXRlc3RfN18wPSAnbWFya2VyJyApCisgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjExNzA6NDogKCAobHZfbWFya0xhdGVzdEltcG9ydF83XzA9ICdsYXRlc3RJbXBvcnQnICkgKQorICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMTcxOjU6IChsdl9tYXJrTGF0ZXN0SW1wb3J0XzdfMD0gJ2xhdGVzdEltcG9ydCcgKQogICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjExNTc6NTogKGx2X21hcmtMYXRlc3RfN18wPSAnbWFya2VyJyApCi0gICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjExNTg6NjogbHZfbWFya0xhdGVzdF83XzA9ICdtYXJrZXInCisgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjExNzE6NTogKGx2X21hcmtMYXRlc3RJbXBvcnRfN18wPSAnbGF0ZXN0SW1wb3J0JyApCisgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjExNzI6NjogbHZfbWFya0xhdGVzdEltcG9ydF83XzA9ICdsYXRlc3RJbXBvcnQnCiAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgbHZfbWFya0xhdGVzdF83XzA9KFRva2VuKW1hdGNoKGlucHV0LDM5LEZPTExPV180KTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7CisgICAgICAgICAgICAgICAgICAgIGx2X21hcmtMYXRlc3RJbXBvcnRfN18wPShUb2tlbiltYXRjaChpbnB1dCw0MCxGT0xMT1dfNCk7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OwogICAgICAgICAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKIAotICAgICAgICAgICAgICAgICAgICAgIAkJCQkJCW5ld0xlYWZOb2RlKGx2X21hcmtMYXRlc3RfN18wLCBncmFtbWFyQWNjZXNzLmdldERhdGFJbnRlcmNoYW5nZUJlYW5BY2Nlc3MoKS5nZXRNYXJrTGF0ZXN0TWFya2VyS2V5d29yZF81XzBfMCgpKTsKKyAgICAgICAgICAgICAgICAgICAgICAJCQkJCQluZXdMZWFmTm9kZShsdl9tYXJrTGF0ZXN0SW1wb3J0XzdfMCwgZ3JhbW1hckFjY2Vzcy5nZXREYXRhSW50ZXJjaGFuZ2VCZWFuQWNjZXNzKCkuZ2V0TWFya0xhdGVzdEltcG9ydExhdGVzdEltcG9ydEtleXdvcmRfNV8wXzAoKSk7CiAgICAgICAgICAgICAgICAgICAgICAgCQkJCQkKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKQEAgLTMwODcsNyArMzE1MSw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgCQkJCQkJaWYgKGN1cnJlbnQ9PW51bGwpIHsKICAgICAgICAgICAgICAgICAgICAgICAJCQkJCQkJY3VycmVudCA9IGNyZWF0ZU1vZGVsRWxlbWVudChncmFtbWFyQWNjZXNzLmdldERhdGFJbnRlcmNoYW5nZUJlYW5SdWxlKCkpOwogICAgICAgICAgICAgICAgICAgICAgIAkJCQkJCX0KLSAgICAgICAgICAgICAgICAgICAgICAJCQkJCQlzZXRXaXRoTGFzdENvbnN1bWVkKGN1cnJlbnQsICJtYXJrTGF0ZXN0IiwgdHJ1ZSwgIm1hcmtlciIpOworICAgICAgICAgICAgICAgICAgICAgIAkJCQkJCXNldFdpdGhMYXN0Q29uc3VtZWQoY3VycmVudCwgIm1hcmtMYXRlc3RJbXBvcnQiLCB0cnVlLCAibGF0ZXN0SW1wb3J0Iik7CiAgICAgICAgICAgICAgICAgICAgICAgCQkJCQkKICAgICAgICAgICAgICAgICAgICAgfQogCkBAIC0zMDk2LDExICszMTYwLDExIEBACiAKICAgICAgICAgICAgICAgICAgICAgfQogCi0gICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjExNzA6NDogKCAob3RoZXJsdl84PSBSVUxFX0lEICkgKQotICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMTcxOjU6IChvdGhlcmx2Xzg9IFJVTEVfSUQgKQorICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMTg0OjQ6ICggKG90aGVybHZfOD0gUlVMRV9JRCApICkKKyAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTE4NTo1OiAob3RoZXJsdl84PSBSVUxFX0lEICkKICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMTcxOjU6IChvdGhlcmx2Xzg9IFJVTEVfSUQgKQotICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMTcyOjY6IG90aGVybHZfOD0gUlVMRV9JRAorICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMTg1OjU6IChvdGhlcmx2Xzg9IFJVTEVfSUQgKQorICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMTg2OjY6IG90aGVybHZfOD0gUlVMRV9JRAogICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogCkBAIC0zMTA5LDcgKzMxNzMsNyBAQAogICAgICAgICAgICAgICAgICAgICAgIAkJCQkJCX0KICAgICAgICAgICAgICAgICAgICAgICAJCQkJCQogICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIG90aGVybHZfOD0oVG9rZW4pbWF0Y2goaW5wdXQsUlVMRV9JRCxGT0xMT1dfMjYpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gY3VycmVudDsKKyAgICAgICAgICAgICAgICAgICAgb3RoZXJsdl84PShUb2tlbiltYXRjaChpbnB1dCxSVUxFX0lELEZPTExPV18yNyk7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OwogICAgICAgICAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKIAogICAgICAgICAgICAgICAgICAgICAgIAkJCQkJCW5ld0xlYWZOb2RlKG90aGVybHZfOCwgZ3JhbW1hckFjY2Vzcy5nZXREYXRhSW50ZXJjaGFuZ2VCZWFuQWNjZXNzKCkuZ2V0TGF0ZXN0UHJvcGVydHlMRW50aXR5QXR0cmlidXRlQ3Jvc3NSZWZlcmVuY2VfNV8xXzAoKSk7CkBAIC0zMTI3LDU0ICszMTkxLDEyMiBAQAogCiAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjExODQ6MzogKG90aGVybHZfOT0gJ2V4cHJlc3Npb24nIG90aGVybHZfMTA9ICd7JyAoIChsdl9leHByZXNzaW9uXzExXzA9IHJ1bGVEYXRhSW50ZXJjaGFuZ2VFeHByZXNzaW9uICkgKSogb3RoZXJsdl8xMj0gJ30nICk/CisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMTk4OjM6ICggKCAobHZfbWFya0xhdGVzdEV4cG9ydF85XzA9ICdsYXRlc3RFeHBvcnQnICkgKSAoIChvdGhlcmx2XzEwPSBSVUxFX0lEICkgKSApPwogICAgICAgICAgICAgaW50IGFsdDE5PTI7CiAgICAgICAgICAgICBpbnQgTEExOV8wID0gaW5wdXQuTEEoMSk7CiAKLSAgICAgICAgICAgIGlmICggKExBMTlfMD09NDApICkgeworICAgICAgICAgICAgaWYgKCAoTEExOV8wPT00MSkgKSB7CiAgICAgICAgICAgICAgICAgYWx0MTk9MTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIHN3aXRjaCAoYWx0MTkpIHsKICAgICAgICAgICAgICAgICBjYXNlIDEgOgotICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMTg1OjQ6IG90aGVybHZfOT0gJ2V4cHJlc3Npb24nIG90aGVybHZfMTA9ICd7JyAoIChsdl9leHByZXNzaW9uXzExXzA9IHJ1bGVEYXRhSW50ZXJjaGFuZ2VFeHByZXNzaW9uICkgKSogb3RoZXJsdl8xMj0gJ30nCisgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjExOTk6NDogKCAobHZfbWFya0xhdGVzdEV4cG9ydF85XzA9ICdsYXRlc3RFeHBvcnQnICkgKSAoIChvdGhlcmx2XzEwPSBSVUxFX0lEICkgKQogICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIG90aGVybHZfOT0oVG9rZW4pbWF0Y2goaW5wdXQsNDAsRk9MTE9XXzE3KTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7CisgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjExOTk6NDogKCAobHZfbWFya0xhdGVzdEV4cG9ydF85XzA9ICdsYXRlc3RFeHBvcnQnICkgKQorICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMjAwOjU6IChsdl9tYXJrTGF0ZXN0RXhwb3J0XzlfMD0gJ2xhdGVzdEV4cG9ydCcgKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEyMDA6NTogKGx2X21hcmtMYXRlc3RFeHBvcnRfOV8wPSAnbGF0ZXN0RXhwb3J0JyApCisgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEyMDE6NjogbHZfbWFya0xhdGVzdEV4cG9ydF85XzA9ICdsYXRlc3RFeHBvcnQnCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgbHZfbWFya0xhdGVzdEV4cG9ydF85XzA9KFRva2VuKW1hdGNoKGlucHV0LDQxLEZPTExPV180KTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7CiAgICAgICAgICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogCi0gICAgICAgICAgICAgICAgICAgICAgCQkJCW5ld0xlYWZOb2RlKG90aGVybHZfOSwgZ3JhbW1hckFjY2Vzcy5nZXREYXRhSW50ZXJjaGFuZ2VCZWFuQWNjZXNzKCkuZ2V0RXhwcmVzc2lvbktleXdvcmRfNl8wKCkpOwotICAgICAgICAgICAgICAgICAgICAgIAkJCQorICAgICAgICAgICAgICAgICAgICAgIAkJCQkJCW5ld0xlYWZOb2RlKGx2X21hcmtMYXRlc3RFeHBvcnRfOV8wLCBncmFtbWFyQWNjZXNzLmdldERhdGFJbnRlcmNoYW5nZUJlYW5BY2Nlc3MoKS5nZXRNYXJrTGF0ZXN0RXhwb3J0TGF0ZXN0RXhwb3J0S2V5d29yZF82XzBfMCgpKTsKKyAgICAgICAgICAgICAgICAgICAgICAJCQkJCQogICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIG90aGVybHZfMTA9KFRva2VuKW1hdGNoKGlucHV0LDE1LEZPTExPV18yNyk7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OwogICAgICAgICAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKIAotICAgICAgICAgICAgICAgICAgICAgIAkJCQluZXdMZWFmTm9kZShvdGhlcmx2XzEwLCBncmFtbWFyQWNjZXNzLmdldERhdGFJbnRlcmNoYW5nZUJlYW5BY2Nlc3MoKS5nZXRMZWZ0Q3VybHlCcmFja2V0S2V5d29yZF82XzEoKSk7CisgICAgICAgICAgICAgICAgICAgICAgCQkJCQkJaWYgKGN1cnJlbnQ9PW51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAJCQkJCQkJY3VycmVudCA9IGNyZWF0ZU1vZGVsRWxlbWVudChncmFtbWFyQWNjZXNzLmdldERhdGFJbnRlcmNoYW5nZUJlYW5SdWxlKCkpOworICAgICAgICAgICAgICAgICAgICAgIAkJCQkJCX0KKyAgICAgICAgICAgICAgICAgICAgICAJCQkJCQlzZXRXaXRoTGFzdENvbnN1bWVkKGN1cnJlbnQsICJtYXJrTGF0ZXN0RXhwb3J0IiwgdHJ1ZSwgImxhdGVzdEV4cG9ydCIpOworICAgICAgICAgICAgICAgICAgICAgIAkJCQkJCisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTIxMzo0OiAoIChvdGhlcmx2XzEwPSBSVUxFX0lEICkgKQorICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMjE0OjU6IChvdGhlcmx2XzEwPSBSVUxFX0lEICkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMjE0OjU6IChvdGhlcmx2XzEwPSBSVUxFX0lEICkKKyAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTIxNTo2OiBvdGhlcmx2XzEwPSBSVUxFX0lECisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisKKyAgICAgICAgICAgICAgICAgICAgICAJCQkJCQlpZiAoY3VycmVudD09bnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgIAkJCQkJCQljdXJyZW50ID0gY3JlYXRlTW9kZWxFbGVtZW50KGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YUludGVyY2hhbmdlQmVhblJ1bGUoKSk7CisgICAgICAgICAgICAgICAgICAgICAgCQkJCQkJfQorICAgICAgICAgICAgICAgICAgICAgIAkJCQkJCisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgb3RoZXJsdl8xMD0oVG9rZW4pbWF0Y2goaW5wdXQsUlVMRV9JRCxGT0xMT1dfMjgpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gY3VycmVudDsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisKKyAgICAgICAgICAgICAgICAgICAgICAJCQkJCQluZXdMZWFmTm9kZShvdGhlcmx2XzEwLCBncmFtbWFyQWNjZXNzLmdldERhdGFJbnRlcmNoYW5nZUJlYW5BY2Nlc3MoKS5nZXRMYXRlc3RFeHBQcm9wZXJ0eUxFbnRpdHlBdHRyaWJ1dGVDcm9zc1JlZmVyZW5jZV82XzFfMCgpKTsKKyAgICAgICAgICAgICAgICAgICAgICAJCQkJCQorICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMjI3OjM6IChvdGhlcmx2XzExPSAnZXhwcmVzc2lvbicgb3RoZXJsdl8xMj0gJ3snICggKGx2X2V4cHJlc3Npb25fMTNfMD0gcnVsZURhdGFJbnRlcmNoYW5nZUV4cHJlc3Npb24gKSApKiBvdGhlcmx2XzE0PSAnfScgKT8KKyAgICAgICAgICAgIGludCBhbHQyMT0yOworICAgICAgICAgICAgaW50IExBMjFfMCA9IGlucHV0LkxBKDEpOworCisgICAgICAgICAgICBpZiAoIChMQTIxXzA9PTQyKSApIHsKKyAgICAgICAgICAgICAgICBhbHQyMT0xOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc3dpdGNoIChhbHQyMSkgeworICAgICAgICAgICAgICAgIGNhc2UgMSA6CisgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEyMjg6NDogb3RoZXJsdl8xMT0gJ2V4cHJlc3Npb24nIG90aGVybHZfMTI9ICd7JyAoIChsdl9leHByZXNzaW9uXzEzXzA9IHJ1bGVEYXRhSW50ZXJjaGFuZ2VFeHByZXNzaW9uICkgKSogb3RoZXJsdl8xND0gJ30nCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgb3RoZXJsdl8xMT0oVG9rZW4pbWF0Y2goaW5wdXQsNDIsRk9MTE9XXzE4KTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7CisgICAgICAgICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworCisgICAgICAgICAgICAgICAgICAgICAgCQkJCW5ld0xlYWZOb2RlKG90aGVybHZfMTEsIGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YUludGVyY2hhbmdlQmVhbkFjY2VzcygpLmdldEV4cHJlc3Npb25LZXl3b3JkXzdfMCgpKTsKICAgICAgICAgICAgICAgICAgICAgICAJCQkKICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMTkzOjQ6ICggKGx2X2V4cHJlc3Npb25fMTFfMD0gcnVsZURhdGFJbnRlcmNoYW5nZUV4cHJlc3Npb24gKSApKgotICAgICAgICAgICAgICAgICAgICBsb29wMTg6CisgICAgICAgICAgICAgICAgICAgIG90aGVybHZfMTI9KFRva2VuKW1hdGNoKGlucHV0LDE1LEZPTExPV18yOSk7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OworICAgICAgICAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKworICAgICAgICAgICAgICAgICAgICAgIAkJCQluZXdMZWFmTm9kZShvdGhlcmx2XzEyLCBncmFtbWFyQWNjZXNzLmdldERhdGFJbnRlcmNoYW5nZUJlYW5BY2Nlc3MoKS5nZXRMZWZ0Q3VybHlCcmFja2V0S2V5d29yZF83XzEoKSk7CisgICAgICAgICAgICAgICAgICAgICAgCQkJCisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTIzNjo0OiAoIChsdl9leHByZXNzaW9uXzEzXzA9IHJ1bGVEYXRhSW50ZXJjaGFuZ2VFeHByZXNzaW9uICkgKSoKKyAgICAgICAgICAgICAgICAgICAgbG9vcDIwOgogICAgICAgICAgICAgICAgICAgICBkbyB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpbnQgYWx0MTg9MjsKLSAgICAgICAgICAgICAgICAgICAgICAgIGludCBMQTE4XzAgPSBpbnB1dC5MQSgxKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBhbHQyMD0yOworICAgICAgICAgICAgICAgICAgICAgICAgaW50IExBMjBfMCA9IGlucHV0LkxBKDEpOwogCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIChMQTE4XzA9PTU3fHxMQTE4XzA9PTYwKSApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbHQxOD0xOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCAoTEEyMF8wPT02MXx8TEEyMF8wPT02NykgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWx0MjA9MTsKICAgICAgICAgICAgICAgICAgICAgICAgIH0KIAogCi0gICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKGFsdDE4KSB7CisgICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKGFsdDIwKSB7CiAgICAgICAgICAgICAgICAgICAgIAljYXNlIDEgOgotICAgICAgICAgICAgICAgICAgICAJICAgIC8vIEludGVybmFsRGF0YURTTC5nOjExOTQ6NTogKGx2X2V4cHJlc3Npb25fMTFfMD0gcnVsZURhdGFJbnRlcmNoYW5nZUV4cHJlc3Npb24gKQorICAgICAgICAgICAgICAgICAgICAJICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEyMzc6NTogKGx2X2V4cHJlc3Npb25fMTNfMD0gcnVsZURhdGFJbnRlcmNoYW5nZUV4cHJlc3Npb24gKQogICAgICAgICAgICAgICAgICAgICAJICAgIHsKLSAgICAgICAgICAgICAgICAgICAgCSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMTk0OjU6IChsdl9leHByZXNzaW9uXzExXzA9IHJ1bGVEYXRhSW50ZXJjaGFuZ2VFeHByZXNzaW9uICkKLSAgICAgICAgICAgICAgICAgICAgCSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMTk1OjY6IGx2X2V4cHJlc3Npb25fMTFfMD0gcnVsZURhdGFJbnRlcmNoYW5nZUV4cHJlc3Npb24KKyAgICAgICAgICAgICAgICAgICAgCSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMjM3OjU6IChsdl9leHByZXNzaW9uXzEzXzA9IHJ1bGVEYXRhSW50ZXJjaGFuZ2VFeHByZXNzaW9uICkKKyAgICAgICAgICAgICAgICAgICAgCSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMjM4OjY6IGx2X2V4cHJlc3Npb25fMTNfMD0gcnVsZURhdGFJbnRlcmNoYW5nZUV4cHJlc3Npb24KICAgICAgICAgICAgICAgICAgICAgCSAgICB7CiAgICAgICAgICAgICAgICAgICAgIAkgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAKLSAgICAgICAgICAgICAgICAgICAgCSAgICAgIAkJCQkJCW5ld0NvbXBvc2l0ZU5vZGUoZ3JhbW1hckFjY2Vzcy5nZXREYXRhSW50ZXJjaGFuZ2VCZWFuQWNjZXNzKCkuZ2V0RXhwcmVzc2lvbkRhdGFJbnRlcmNoYW5nZUV4cHJlc3Npb25QYXJzZXJSdWxlQ2FsbF82XzJfMCgpKTsKKyAgICAgICAgICAgICAgICAgICAgCSAgICAgIAkJCQkJCW5ld0NvbXBvc2l0ZU5vZGUoZ3JhbW1hckFjY2Vzcy5nZXREYXRhSW50ZXJjaGFuZ2VCZWFuQWNjZXNzKCkuZ2V0RXhwcmVzc2lvbkRhdGFJbnRlcmNoYW5nZUV4cHJlc3Npb25QYXJzZXJSdWxlQ2FsbF83XzJfMCgpKTsKICAgICAgICAgICAgICAgICAgICAgCSAgICAgIAkJCQkJCiAgICAgICAgICAgICAgICAgICAgIAkgICAgfQotICAgICAgICAgICAgICAgICAgICAJICAgIHB1c2hGb2xsb3coRk9MTE9XXzI3KTsKLSAgICAgICAgICAgICAgICAgICAgCSAgICBsdl9leHByZXNzaW9uXzExXzA9cnVsZURhdGFJbnRlcmNoYW5nZUV4cHJlc3Npb24oKTsKKyAgICAgICAgICAgICAgICAgICAgCSAgICBwdXNoRm9sbG93KEZPTExPV18yOSk7CisgICAgICAgICAgICAgICAgICAgIAkgICAgbHZfZXhwcmVzc2lvbl8xM18wPXJ1bGVEYXRhSW50ZXJjaGFuZ2VFeHByZXNzaW9uKCk7CiAKICAgICAgICAgICAgICAgICAgICAgCSAgICBzdGF0ZS5fZnNwLS07CiAgICAgICAgICAgICAgICAgICAgIAkgICAgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7CkBAIC0zMTg2LDcgKzMzMTgsNyBAQAogICAgICAgICAgICAgICAgICAgICAJICAgICAgCQkJCQkJYWRkKAogICAgICAgICAgICAgICAgICAgICAJICAgICAgCQkJCQkJCWN1cnJlbnQsCiAgICAgICAgICAgICAgICAgICAgIAkgICAgICAJCQkJCQkJImV4cHJlc3Npb24iLAotICAgICAgICAgICAgICAgICAgICAJICAgICAgCQkJCQkJCWx2X2V4cHJlc3Npb25fMTFfMCwKKyAgICAgICAgICAgICAgICAgICAgCSAgICAgIAkJCQkJCQlsdl9leHByZXNzaW9uXzEzXzAsCiAgICAgICAgICAgICAgICAgICAgIAkgICAgICAJCQkJCQkJIm9yZy5lY2xpcHNlLm9zYnAueHRleHQuZGF0YWludGVyY2hhbmdlLkRhdGFEU0wuRGF0YUludGVyY2hhbmdlRXhwcmVzc2lvbiIpOwogICAgICAgICAgICAgICAgICAgICAJICAgICAgCQkJCQkJYWZ0ZXJQYXJzZXJPckVudW1SdWxlQ2FsbCgpOwogICAgICAgICAgICAgICAgICAgICAJICAgICAgCQkJCQkKQEAgLTMxOTksMTAyICszMzMxLDE0IEBACiAgICAgICAgICAgICAgICAgICAgIAkgICAgYnJlYWs7CiAKICAgICAgICAgICAgICAgICAgICAgCWRlZmF1bHQgOgotICAgICAgICAgICAgICAgICAgICAJICAgIGJyZWFrIGxvb3AxODsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfSB3aGlsZSAodHJ1ZSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgb3RoZXJsdl8xMj0oVG9rZW4pbWF0Y2goaW5wdXQsMTYsRk9MTE9XXzI4KTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7Ci0gICAgICAgICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewotCi0gICAgICAgICAgICAgICAgICAgICAgCQkJCW5ld0xlYWZOb2RlKG90aGVybHZfMTIsIGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YUludGVyY2hhbmdlQmVhbkFjY2VzcygpLmdldFJpZ2h0Q3VybHlCcmFja2V0S2V5d29yZF82XzMoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgCQkJCi0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEyMTc6MzogKG90aGVybHZfMTM9ICdsb29rdXAnIG90aGVybHZfMTQ9ICd7JyAoIChsdl9sb29rdXBfMTVfMD0gcnVsZURhdGFJbnRlcmNoYW5nZUxvb2t1cCApICkqIG90aGVybHZfMTY9ICd9JyApPwotICAgICAgICAgICAgaW50IGFsdDIxPTI7Ci0gICAgICAgICAgICBpbnQgTEEyMV8wID0gaW5wdXQuTEEoMSk7Ci0KLSAgICAgICAgICAgIGlmICggKExBMjFfMD09NDEpICkgewotICAgICAgICAgICAgICAgIGFsdDIxPTE7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBzd2l0Y2ggKGFsdDIxKSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAxIDoKLSAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTIxODo0OiBvdGhlcmx2XzEzPSAnbG9va3VwJyBvdGhlcmx2XzE0PSAneycgKCAobHZfbG9va3VwXzE1XzA9IHJ1bGVEYXRhSW50ZXJjaGFuZ2VMb29rdXAgKSApKiBvdGhlcmx2XzE2PSAnfScKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBvdGhlcmx2XzEzPShUb2tlbiltYXRjaChpbnB1dCw0MSxGT0xMT1dfMTcpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gY3VycmVudDsKLSAgICAgICAgICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAJCQkJbmV3TGVhZk5vZGUob3RoZXJsdl8xMywgZ3JhbW1hckFjY2Vzcy5nZXREYXRhSW50ZXJjaGFuZ2VCZWFuQWNjZXNzKCkuZ2V0TG9va3VwS2V5d29yZF83XzAoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgCQkJCi0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgb3RoZXJsdl8xND0oVG9rZW4pbWF0Y2goaW5wdXQsMTUsRk9MTE9XXzI5KTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7Ci0gICAgICAgICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewotCi0gICAgICAgICAgICAgICAgICAgICAgCQkJCW5ld0xlYWZOb2RlKG90aGVybHZfMTQsIGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YUludGVyY2hhbmdlQmVhbkFjY2VzcygpLmdldExlZnRDdXJseUJyYWNrZXRLZXl3b3JkXzdfMSgpKTsKLSAgICAgICAgICAgICAgICAgICAgICAJCQkKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMjI2OjQ6ICggKGx2X2xvb2t1cF8xNV8wPSBydWxlRGF0YUludGVyY2hhbmdlTG9va3VwICkgKSoKLSAgICAgICAgICAgICAgICAgICAgbG9vcDIwOgotICAgICAgICAgICAgICAgICAgICBkbyB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpbnQgYWx0MjA9MjsKLSAgICAgICAgICAgICAgICAgICAgICAgIGludCBMQTIwXzAgPSBpbnB1dC5MQSgxKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCAoTEEyMF8wPT00NikgKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYWx0MjA9MTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotCi0gICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKGFsdDIwKSB7Ci0gICAgICAgICAgICAgICAgICAgIAljYXNlIDEgOgotICAgICAgICAgICAgICAgICAgICAJICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEyMjc6NTogKGx2X2xvb2t1cF8xNV8wPSBydWxlRGF0YUludGVyY2hhbmdlTG9va3VwICkKLSAgICAgICAgICAgICAgICAgICAgCSAgICB7Ci0gICAgICAgICAgICAgICAgICAgIAkgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTIyNzo1OiAobHZfbG9va3VwXzE1XzA9IHJ1bGVEYXRhSW50ZXJjaGFuZ2VMb29rdXAgKQotICAgICAgICAgICAgICAgICAgICAJICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEyMjg6NjogbHZfbG9va3VwXzE1XzA9IHJ1bGVEYXRhSW50ZXJjaGFuZ2VMb29rdXAKLSAgICAgICAgICAgICAgICAgICAgCSAgICB7Ci0gICAgICAgICAgICAgICAgICAgIAkgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7Ci0KLSAgICAgICAgICAgICAgICAgICAgCSAgICAgIAkJCQkJCW5ld0NvbXBvc2l0ZU5vZGUoZ3JhbW1hckFjY2Vzcy5nZXREYXRhSW50ZXJjaGFuZ2VCZWFuQWNjZXNzKCkuZ2V0TG9va3VwRGF0YUludGVyY2hhbmdlTG9va3VwUGFyc2VyUnVsZUNhbGxfN18yXzAoKSk7Ci0gICAgICAgICAgICAgICAgICAgIAkgICAgICAJCQkJCQotICAgICAgICAgICAgICAgICAgICAJICAgIH0KLSAgICAgICAgICAgICAgICAgICAgCSAgICBwdXNoRm9sbG93KEZPTExPV18yOSk7Ci0gICAgICAgICAgICAgICAgICAgIAkgICAgbHZfbG9va3VwXzE1XzA9cnVsZURhdGFJbnRlcmNoYW5nZUxvb2t1cCgpOwotCi0gICAgICAgICAgICAgICAgICAgIAkgICAgc3RhdGUuX2ZzcC0tOwotICAgICAgICAgICAgICAgICAgICAJICAgIGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OwotICAgICAgICAgICAgICAgICAgICAJICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewotCi0gICAgICAgICAgICAgICAgICAgIAkgICAgICAJCQkJCQlpZiAoY3VycmVudD09bnVsbCkgewotICAgICAgICAgICAgICAgICAgICAJICAgICAgCQkJCQkJCWN1cnJlbnQgPSBjcmVhdGVNb2RlbEVsZW1lbnRGb3JQYXJlbnQoZ3JhbW1hckFjY2Vzcy5nZXREYXRhSW50ZXJjaGFuZ2VCZWFuUnVsZSgpKTsKLSAgICAgICAgICAgICAgICAgICAgCSAgICAgIAkJCQkJCX0KLSAgICAgICAgICAgICAgICAgICAgCSAgICAgIAkJCQkJCWFkZCgKLSAgICAgICAgICAgICAgICAgICAgCSAgICAgIAkJCQkJCQljdXJyZW50LAotICAgICAgICAgICAgICAgICAgICAJICAgICAgCQkJCQkJCSJsb29rdXAiLAotICAgICAgICAgICAgICAgICAgICAJICAgICAgCQkJCQkJCWx2X2xvb2t1cF8xNV8wLAotICAgICAgICAgICAgICAgICAgICAJICAgICAgCQkJCQkJCSJvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmRhdGFpbnRlcmNoYW5nZS5EYXRhRFNMLkRhdGFJbnRlcmNoYW5nZUxvb2t1cCIpOwotICAgICAgICAgICAgICAgICAgICAJICAgICAgCQkJCQkJYWZ0ZXJQYXJzZXJPckVudW1SdWxlQ2FsbCgpOwotICAgICAgICAgICAgICAgICAgICAJICAgICAgCQkJCQkKLSAgICAgICAgICAgICAgICAgICAgCSAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgCSAgICB9Ci0KLQotICAgICAgICAgICAgICAgICAgICAJICAgIH0KLSAgICAgICAgICAgICAgICAgICAgCSAgICBicmVhazsKLQotICAgICAgICAgICAgICAgICAgICAJZGVmYXVsdCA6CiAgICAgICAgICAgICAgICAgICAgIAkgICAgYnJlYWsgbG9vcDIwOwogICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICB9IHdoaWxlICh0cnVlKTsKIAotICAgICAgICAgICAgICAgICAgICBvdGhlcmx2XzE2PShUb2tlbiltYXRjaChpbnB1dCwxNixGT0xMT1dfMzApOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gY3VycmVudDsKKyAgICAgICAgICAgICAgICAgICAgb3RoZXJsdl8xND0oVG9rZW4pbWF0Y2goaW5wdXQsMTYsRk9MTE9XXzMwKTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7CiAgICAgICAgICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogCi0gICAgICAgICAgICAgICAgICAgICAgCQkJCW5ld0xlYWZOb2RlKG90aGVybHZfMTYsIGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YUludGVyY2hhbmdlQmVhbkFjY2VzcygpLmdldFJpZ2h0Q3VybHlCcmFja2V0S2V5d29yZF83XzMoKSk7CisgICAgICAgICAgICAgICAgICAgICAgCQkJCW5ld0xlYWZOb2RlKG90aGVybHZfMTQsIGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YUludGVyY2hhbmdlQmVhbkFjY2VzcygpLmdldFJpZ2h0Q3VybHlCcmFja2V0S2V5d29yZF83XzMoKSk7CiAgICAgICAgICAgICAgICAgICAgICAgCQkJCiAgICAgICAgICAgICAgICAgICAgIH0KIApAQCAtMzMwMyw1NCArMzM0Nyw1NCBAQAogCiAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEyNTA6MzogKG90aGVybHZfMTc9ICdmb3JtYXQnIG90aGVybHZfMTg9ICd7JyAoIChsdl9mb3JtYXRfMTlfMD0gcnVsZURhdGFJbnRlcmNoYW5nZUZvcm1hdCApICkqIG90aGVybHZfMjA9ICd9JyApPworICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTI2MDozOiAob3RoZXJsdl8xNT0gJ2xvb2t1cCcgb3RoZXJsdl8xNj0gJ3snICggKGx2X2xvb2t1cF8xN18wPSBydWxlRGF0YUludGVyY2hhbmdlTG9va3VwICkgKSogb3RoZXJsdl8xOD0gJ30nICk/CiAgICAgICAgICAgICBpbnQgYWx0MjM9MjsKICAgICAgICAgICAgIGludCBMQTIzXzAgPSBpbnB1dC5MQSgxKTsKIAotICAgICAgICAgICAgaWYgKCAoTEEyM18wPT00MikgKSB7CisgICAgICAgICAgICBpZiAoIChMQTIzXzA9PTQzKSApIHsKICAgICAgICAgICAgICAgICBhbHQyMz0xOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgc3dpdGNoIChhbHQyMykgewogICAgICAgICAgICAgICAgIGNhc2UgMSA6Ci0gICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEyNTE6NDogb3RoZXJsdl8xNz0gJ2Zvcm1hdCcgb3RoZXJsdl8xOD0gJ3snICggKGx2X2Zvcm1hdF8xOV8wPSBydWxlRGF0YUludGVyY2hhbmdlRm9ybWF0ICkgKSogb3RoZXJsdl8yMD0gJ30nCisgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEyNjE6NDogb3RoZXJsdl8xNT0gJ2xvb2t1cCcgb3RoZXJsdl8xNj0gJ3snICggKGx2X2xvb2t1cF8xN18wPSBydWxlRGF0YUludGVyY2hhbmdlTG9va3VwICkgKSogb3RoZXJsdl8xOD0gJ30nCiAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgb3RoZXJsdl8xNz0oVG9rZW4pbWF0Y2goaW5wdXQsNDIsRk9MTE9XXzE3KTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7CisgICAgICAgICAgICAgICAgICAgIG90aGVybHZfMTU9KFRva2VuKW1hdGNoKGlucHV0LDQzLEZPTExPV18xOCk7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OwogICAgICAgICAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKIAotICAgICAgICAgICAgICAgICAgICAgIAkJCQluZXdMZWFmTm9kZShvdGhlcmx2XzE3LCBncmFtbWFyQWNjZXNzLmdldERhdGFJbnRlcmNoYW5nZUJlYW5BY2Nlc3MoKS5nZXRGb3JtYXRLZXl3b3JkXzhfMCgpKTsKKyAgICAgICAgICAgICAgICAgICAgICAJCQkJbmV3TGVhZk5vZGUob3RoZXJsdl8xNSwgZ3JhbW1hckFjY2Vzcy5nZXREYXRhSW50ZXJjaGFuZ2VCZWFuQWNjZXNzKCkuZ2V0TG9va3VwS2V5d29yZF84XzAoKSk7CiAgICAgICAgICAgICAgICAgICAgICAgCQkJCiAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgb3RoZXJsdl8xOD0oVG9rZW4pbWF0Y2goaW5wdXQsMTUsRk9MTE9XXzI5KTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7CisgICAgICAgICAgICAgICAgICAgIG90aGVybHZfMTY9KFRva2VuKW1hdGNoKGlucHV0LDE1LEZPTExPV18zMSk7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OwogICAgICAgICAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKIAotICAgICAgICAgICAgICAgICAgICAgIAkJCQluZXdMZWFmTm9kZShvdGhlcmx2XzE4LCBncmFtbWFyQWNjZXNzLmdldERhdGFJbnRlcmNoYW5nZUJlYW5BY2Nlc3MoKS5nZXRMZWZ0Q3VybHlCcmFja2V0S2V5d29yZF84XzEoKSk7CisgICAgICAgICAgICAgICAgICAgICAgCQkJCW5ld0xlYWZOb2RlKG90aGVybHZfMTYsIGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YUludGVyY2hhbmdlQmVhbkFjY2VzcygpLmdldExlZnRDdXJseUJyYWNrZXRLZXl3b3JkXzhfMSgpKTsKICAgICAgICAgICAgICAgICAgICAgICAJCQkKICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMjU5OjQ6ICggKGx2X2Zvcm1hdF8xOV8wPSBydWxlRGF0YUludGVyY2hhbmdlRm9ybWF0ICkgKSoKKyAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTI2OTo0OiAoIChsdl9sb29rdXBfMTdfMD0gcnVsZURhdGFJbnRlcmNoYW5nZUxvb2t1cCApICkqCiAgICAgICAgICAgICAgICAgICAgIGxvb3AyMjoKICAgICAgICAgICAgICAgICAgICAgZG8gewogICAgICAgICAgICAgICAgICAgICAgICAgaW50IGFsdDIyPTI7CiAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgTEEyMl8wID0gaW5wdXQuTEEoMSk7CiAKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICggKExBMjJfMD09NDYpICkgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCAoTEEyMl8wPT01MCkgKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWx0MjI9MTsKICAgICAgICAgICAgICAgICAgICAgICAgIH0KIAogCiAgICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKGFsdDIyKSB7CiAgICAgICAgICAgICAgICAgICAgIAljYXNlIDEgOgotICAgICAgICAgICAgICAgICAgICAJICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEyNjA6NTogKGx2X2Zvcm1hdF8xOV8wPSBydWxlRGF0YUludGVyY2hhbmdlRm9ybWF0ICkKKyAgICAgICAgICAgICAgICAgICAgCSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMjcwOjU6IChsdl9sb29rdXBfMTdfMD0gcnVsZURhdGFJbnRlcmNoYW5nZUxvb2t1cCApCiAgICAgICAgICAgICAgICAgICAgIAkgICAgewotICAgICAgICAgICAgICAgICAgICAJICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEyNjA6NTogKGx2X2Zvcm1hdF8xOV8wPSBydWxlRGF0YUludGVyY2hhbmdlRm9ybWF0ICkKLSAgICAgICAgICAgICAgICAgICAgCSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMjYxOjY6IGx2X2Zvcm1hdF8xOV8wPSBydWxlRGF0YUludGVyY2hhbmdlRm9ybWF0CisgICAgICAgICAgICAgICAgICAgIAkgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTI3MDo1OiAobHZfbG9va3VwXzE3XzA9IHJ1bGVEYXRhSW50ZXJjaGFuZ2VMb29rdXAgKQorICAgICAgICAgICAgICAgICAgICAJICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEyNzE6NjogbHZfbG9va3VwXzE3XzA9IHJ1bGVEYXRhSW50ZXJjaGFuZ2VMb29rdXAKICAgICAgICAgICAgICAgICAgICAgCSAgICB7CiAgICAgICAgICAgICAgICAgICAgIAkgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAKLSAgICAgICAgICAgICAgICAgICAgCSAgICAgIAkJCQkJCW5ld0NvbXBvc2l0ZU5vZGUoZ3JhbW1hckFjY2Vzcy5nZXREYXRhSW50ZXJjaGFuZ2VCZWFuQWNjZXNzKCkuZ2V0Rm9ybWF0RGF0YUludGVyY2hhbmdlRm9ybWF0UGFyc2VyUnVsZUNhbGxfOF8yXzAoKSk7CisgICAgICAgICAgICAgICAgICAgIAkgICAgICAJCQkJCQluZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YUludGVyY2hhbmdlQmVhbkFjY2VzcygpLmdldExvb2t1cERhdGFJbnRlcmNoYW5nZUxvb2t1cFBhcnNlclJ1bGVDYWxsXzhfMl8wKCkpOwogICAgICAgICAgICAgICAgICAgICAJICAgICAgCQkJCQkKICAgICAgICAgICAgICAgICAgICAgCSAgICB9Ci0gICAgICAgICAgICAgICAgICAgIAkgICAgcHVzaEZvbGxvdyhGT0xMT1dfMjkpOwotICAgICAgICAgICAgICAgICAgICAJICAgIGx2X2Zvcm1hdF8xOV8wPXJ1bGVEYXRhSW50ZXJjaGFuZ2VGb3JtYXQoKTsKKyAgICAgICAgICAgICAgICAgICAgCSAgICBwdXNoRm9sbG93KEZPTExPV18zMSk7CisgICAgICAgICAgICAgICAgICAgIAkgICAgbHZfbG9va3VwXzE3XzA9cnVsZURhdGFJbnRlcmNoYW5nZUxvb2t1cCgpOwogCiAgICAgICAgICAgICAgICAgICAgIAkgICAgc3RhdGUuX2ZzcC0tOwogICAgICAgICAgICAgICAgICAgICAJICAgIGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OwpAQCAtMzM2MSw5ICszNDA1LDkgQEAKICAgICAgICAgICAgICAgICAgICAgCSAgICAgIAkJCQkJCX0KICAgICAgICAgICAgICAgICAgICAgCSAgICAgIAkJCQkJCWFkZCgKICAgICAgICAgICAgICAgICAgICAgCSAgICAgIAkJCQkJCQljdXJyZW50LAotICAgICAgICAgICAgICAgICAgICAJICAgICAgCQkJCQkJCSJmb3JtYXQiLAotICAgICAgICAgICAgICAgICAgICAJICAgICAgCQkJCQkJCWx2X2Zvcm1hdF8xOV8wLAotICAgICAgICAgICAgICAgICAgICAJICAgICAgCQkJCQkJCSJvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmRhdGFpbnRlcmNoYW5nZS5EYXRhRFNMLkRhdGFJbnRlcmNoYW5nZUZvcm1hdCIpOworICAgICAgICAgICAgICAgICAgICAJICAgICAgCQkJCQkJCSJsb29rdXAiLAorICAgICAgICAgICAgICAgICAgICAJICAgICAgCQkJCQkJCWx2X2xvb2t1cF8xN18wLAorICAgICAgICAgICAgICAgICAgICAJICAgICAgCQkJCQkJCSJvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmRhdGFpbnRlcmNoYW5nZS5EYXRhRFNMLkRhdGFJbnRlcmNoYW5nZUxvb2t1cCIpOwogICAgICAgICAgICAgICAgICAgICAJICAgICAgCQkJCQkJYWZ0ZXJQYXJzZXJPckVudW1SdWxlQ2FsbCgpOwogICAgICAgICAgICAgICAgICAgICAJICAgICAgCQkJCQkKICAgICAgICAgICAgICAgICAgICAgCSAgICB9CkBAIC0zMzc5LDEwICszNDIzLDEwIEBACiAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIH0gd2hpbGUgKHRydWUpOwogCi0gICAgICAgICAgICAgICAgICAgIG90aGVybHZfMjA9KFRva2VuKW1hdGNoKGlucHV0LDE2LEZPTExPV18zMSk7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OworICAgICAgICAgICAgICAgICAgICBvdGhlcmx2XzE4PShUb2tlbiltYXRjaChpbnB1dCwxNixGT0xMT1dfMzIpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gY3VycmVudDsKICAgICAgICAgICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAKLSAgICAgICAgICAgICAgICAgICAgICAJCQkJbmV3TGVhZk5vZGUob3RoZXJsdl8yMCwgZ3JhbW1hckFjY2Vzcy5nZXREYXRhSW50ZXJjaGFuZ2VCZWFuQWNjZXNzKCkuZ2V0UmlnaHRDdXJseUJyYWNrZXRLZXl3b3JkXzhfMygpKTsKKyAgICAgICAgICAgICAgICAgICAgICAJCQkJbmV3TGVhZk5vZGUob3RoZXJsdl8xOCwgZ3JhbW1hckFjY2Vzcy5nZXREYXRhSW50ZXJjaGFuZ2VCZWFuQWNjZXNzKCkuZ2V0UmlnaHRDdXJseUJyYWNrZXRLZXl3b3JkXzhfMygpKTsKICAgICAgICAgICAgICAgICAgICAgICAJCQkKICAgICAgICAgICAgICAgICAgICAgfQogCkBAIC0zMzkxLDU0ICszNDM1LDU0IEBACiAKICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTI4MzozOiAob3RoZXJsdl8yMT0gJ21hcHBpbmcnIG90aGVybHZfMjI9ICd7JyAoIChsdl9tYXBwaW5nc18yM18wPSBydWxlRGF0YUludGVyY2hhbmdlTWFwcGluZyApICkqIG90aGVybHZfMjQ9ICd9JyApPworICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTI5MzozOiAob3RoZXJsdl8xOT0gJ2Zvcm1hdCcgb3RoZXJsdl8yMD0gJ3snICggKGx2X2Zvcm1hdF8yMV8wPSBydWxlRGF0YUludGVyY2hhbmdlRm9ybWF0ICkgKSogb3RoZXJsdl8yMj0gJ30nICk/CiAgICAgICAgICAgICBpbnQgYWx0MjU9MjsKICAgICAgICAgICAgIGludCBMQTI1XzAgPSBpbnB1dC5MQSgxKTsKIAotICAgICAgICAgICAgaWYgKCAoTEEyNV8wPT00MykgKSB7CisgICAgICAgICAgICBpZiAoIChMQTI1XzA9PTQ0KSApIHsKICAgICAgICAgICAgICAgICBhbHQyNT0xOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgc3dpdGNoIChhbHQyNSkgewogICAgICAgICAgICAgICAgIGNhc2UgMSA6Ci0gICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEyODQ6NDogb3RoZXJsdl8yMT0gJ21hcHBpbmcnIG90aGVybHZfMjI9ICd7JyAoIChsdl9tYXBwaW5nc18yM18wPSBydWxlRGF0YUludGVyY2hhbmdlTWFwcGluZyApICkqIG90aGVybHZfMjQ9ICd9JworICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMjk0OjQ6IG90aGVybHZfMTk9ICdmb3JtYXQnIG90aGVybHZfMjA9ICd7JyAoIChsdl9mb3JtYXRfMjFfMD0gcnVsZURhdGFJbnRlcmNoYW5nZUZvcm1hdCApICkqIG90aGVybHZfMjI9ICd9JwogICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIG90aGVybHZfMjE9KFRva2VuKW1hdGNoKGlucHV0LDQzLEZPTExPV18xNyk7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OworICAgICAgICAgICAgICAgICAgICBvdGhlcmx2XzE5PShUb2tlbiltYXRjaChpbnB1dCw0NCxGT0xMT1dfMTgpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gY3VycmVudDsKICAgICAgICAgICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAKLSAgICAgICAgICAgICAgICAgICAgICAJCQkJbmV3TGVhZk5vZGUob3RoZXJsdl8yMSwgZ3JhbW1hckFjY2Vzcy5nZXREYXRhSW50ZXJjaGFuZ2VCZWFuQWNjZXNzKCkuZ2V0TWFwcGluZ0tleXdvcmRfOV8wKCkpOworICAgICAgICAgICAgICAgICAgICAgIAkJCQluZXdMZWFmTm9kZShvdGhlcmx2XzE5LCBncmFtbWFyQWNjZXNzLmdldERhdGFJbnRlcmNoYW5nZUJlYW5BY2Nlc3MoKS5nZXRGb3JtYXRLZXl3b3JkXzlfMCgpKTsKICAgICAgICAgICAgICAgICAgICAgICAJCQkKICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBvdGhlcmx2XzIyPShUb2tlbiltYXRjaChpbnB1dCwxNSxGT0xMT1dfMzIpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gY3VycmVudDsKKyAgICAgICAgICAgICAgICAgICAgb3RoZXJsdl8yMD0oVG9rZW4pbWF0Y2goaW5wdXQsMTUsRk9MTE9XXzMxKTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7CiAgICAgICAgICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogCi0gICAgICAgICAgICAgICAgICAgICAgCQkJCW5ld0xlYWZOb2RlKG90aGVybHZfMjIsIGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YUludGVyY2hhbmdlQmVhbkFjY2VzcygpLmdldExlZnRDdXJseUJyYWNrZXRLZXl3b3JkXzlfMSgpKTsKKyAgICAgICAgICAgICAgICAgICAgICAJCQkJbmV3TGVhZk5vZGUob3RoZXJsdl8yMCwgZ3JhbW1hckFjY2Vzcy5nZXREYXRhSW50ZXJjaGFuZ2VCZWFuQWNjZXNzKCkuZ2V0TGVmdEN1cmx5QnJhY2tldEtleXdvcmRfOV8xKCkpOwogICAgICAgICAgICAgICAgICAgICAgIAkJCQogICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEyOTI6NDogKCAobHZfbWFwcGluZ3NfMjNfMD0gcnVsZURhdGFJbnRlcmNoYW5nZU1hcHBpbmcgKSApKgorICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMzAyOjQ6ICggKGx2X2Zvcm1hdF8yMV8wPSBydWxlRGF0YUludGVyY2hhbmdlRm9ybWF0ICkgKSoKICAgICAgICAgICAgICAgICAgICAgbG9vcDI0OgogICAgICAgICAgICAgICAgICAgICBkbyB7CiAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYWx0MjQ9MjsKICAgICAgICAgICAgICAgICAgICAgICAgIGludCBMQTI0XzAgPSBpbnB1dC5MQSgxKTsKIAotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCAoTEEyNF8wPT02Mnx8TEEyNF8wPT02NCkgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIChMQTI0XzA9PTUwKSApIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbHQyND0xOwogICAgICAgICAgICAgICAgICAgICAgICAgfQogCiAKICAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoYWx0MjQpIHsKICAgICAgICAgICAgICAgICAgICAgCWNhc2UgMSA6Ci0gICAgICAgICAgICAgICAgICAgIAkgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTI5Mzo1OiAobHZfbWFwcGluZ3NfMjNfMD0gcnVsZURhdGFJbnRlcmNoYW5nZU1hcHBpbmcgKQorICAgICAgICAgICAgICAgICAgICAJICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEzMDM6NTogKGx2X2Zvcm1hdF8yMV8wPSBydWxlRGF0YUludGVyY2hhbmdlRm9ybWF0ICkKICAgICAgICAgICAgICAgICAgICAgCSAgICB7Ci0gICAgICAgICAgICAgICAgICAgIAkgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTI5Mzo1OiAobHZfbWFwcGluZ3NfMjNfMD0gcnVsZURhdGFJbnRlcmNoYW5nZU1hcHBpbmcgKQotICAgICAgICAgICAgICAgICAgICAJICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEyOTQ6NjogbHZfbWFwcGluZ3NfMjNfMD0gcnVsZURhdGFJbnRlcmNoYW5nZU1hcHBpbmcKKyAgICAgICAgICAgICAgICAgICAgCSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMzAzOjU6IChsdl9mb3JtYXRfMjFfMD0gcnVsZURhdGFJbnRlcmNoYW5nZUZvcm1hdCApCisgICAgICAgICAgICAgICAgICAgIAkgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTMwNDo2OiBsdl9mb3JtYXRfMjFfMD0gcnVsZURhdGFJbnRlcmNoYW5nZUZvcm1hdAogICAgICAgICAgICAgICAgICAgICAJICAgIHsKICAgICAgICAgICAgICAgICAgICAgCSAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKIAotICAgICAgICAgICAgICAgICAgICAJICAgICAgCQkJCQkJbmV3Q29tcG9zaXRlTm9kZShncmFtbWFyQWNjZXNzLmdldERhdGFJbnRlcmNoYW5nZUJlYW5BY2Nlc3MoKS5nZXRNYXBwaW5nc0RhdGFJbnRlcmNoYW5nZU1hcHBpbmdQYXJzZXJSdWxlQ2FsbF85XzJfMCgpKTsKKyAgICAgICAgICAgICAgICAgICAgCSAgICAgIAkJCQkJCW5ld0NvbXBvc2l0ZU5vZGUoZ3JhbW1hckFjY2Vzcy5nZXREYXRhSW50ZXJjaGFuZ2VCZWFuQWNjZXNzKCkuZ2V0Rm9ybWF0RGF0YUludGVyY2hhbmdlRm9ybWF0UGFyc2VyUnVsZUNhbGxfOV8yXzAoKSk7CiAgICAgICAgICAgICAgICAgICAgIAkgICAgICAJCQkJCQogICAgICAgICAgICAgICAgICAgICAJICAgIH0KLSAgICAgICAgICAgICAgICAgICAgCSAgICBwdXNoRm9sbG93KEZPTExPV18zMik7Ci0gICAgICAgICAgICAgICAgICAgIAkgICAgbHZfbWFwcGluZ3NfMjNfMD1ydWxlRGF0YUludGVyY2hhbmdlTWFwcGluZygpOworICAgICAgICAgICAgICAgICAgICAJICAgIHB1c2hGb2xsb3coRk9MTE9XXzMxKTsKKyAgICAgICAgICAgICAgICAgICAgCSAgICBsdl9mb3JtYXRfMjFfMD1ydWxlRGF0YUludGVyY2hhbmdlRm9ybWF0KCk7CiAKICAgICAgICAgICAgICAgICAgICAgCSAgICBzdGF0ZS5fZnNwLS07CiAgICAgICAgICAgICAgICAgICAgIAkgICAgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7CkBAIC0zNDQ5LDkgKzM0OTMsOSBAQAogICAgICAgICAgICAgICAgICAgICAJICAgICAgCQkJCQkJfQogICAgICAgICAgICAgICAgICAgICAJICAgICAgCQkJCQkJYWRkKAogICAgICAgICAgICAgICAgICAgICAJICAgICAgCQkJCQkJCWN1cnJlbnQsCi0gICAgICAgICAgICAgICAgICAgIAkgICAgICAJCQkJCQkJIm1hcHBpbmdzIiwKLSAgICAgICAgICAgICAgICAgICAgCSAgICAgIAkJCQkJCQlsdl9tYXBwaW5nc18yM18wLAotICAgICAgICAgICAgICAgICAgICAJICAgICAgCQkJCQkJCSJvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmRhdGFpbnRlcmNoYW5nZS5EYXRhRFNMLkRhdGFJbnRlcmNoYW5nZU1hcHBpbmciKTsKKyAgICAgICAgICAgICAgICAgICAgCSAgICAgIAkJCQkJCQkiZm9ybWF0IiwKKyAgICAgICAgICAgICAgICAgICAgCSAgICAgIAkJCQkJCQlsdl9mb3JtYXRfMjFfMCwKKyAgICAgICAgICAgICAgICAgICAgCSAgICAgIAkJCQkJCQkib3JnLmVjbGlwc2Uub3NicC54dGV4dC5kYXRhaW50ZXJjaGFuZ2UuRGF0YURTTC5EYXRhSW50ZXJjaGFuZ2VGb3JtYXQiKTsKICAgICAgICAgICAgICAgICAgICAgCSAgICAgIAkJCQkJCWFmdGVyUGFyc2VyT3JFbnVtUnVsZUNhbGwoKTsKICAgICAgICAgICAgICAgICAgICAgCSAgICAgIAkJCQkJCiAgICAgICAgICAgICAgICAgICAgIAkgICAgfQpAQCAtMzQ2NywxMCArMzUxMSwxMCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICB9IHdoaWxlICh0cnVlKTsKIAotICAgICAgICAgICAgICAgICAgICBvdGhlcmx2XzI0PShUb2tlbiltYXRjaChpbnB1dCwxNixGT0xMT1dfMzMpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gY3VycmVudDsKKyAgICAgICAgICAgICAgICAgICAgb3RoZXJsdl8yMj0oVG9rZW4pbWF0Y2goaW5wdXQsMTYsRk9MTE9XXzMzKTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7CiAgICAgICAgICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogCi0gICAgICAgICAgICAgICAgICAgICAgCQkJCW5ld0xlYWZOb2RlKG90aGVybHZfMjQsIGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YUludGVyY2hhbmdlQmVhbkFjY2VzcygpLmdldFJpZ2h0Q3VybHlCcmFja2V0S2V5d29yZF85XzMoKSk7CisgICAgICAgICAgICAgICAgICAgICAgCQkJCW5ld0xlYWZOb2RlKG90aGVybHZfMjIsIGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YUludGVyY2hhbmdlQmVhbkFjY2VzcygpLmdldFJpZ2h0Q3VybHlCcmFja2V0S2V5d29yZF85XzMoKSk7CiAgICAgICAgICAgICAgICAgICAgICAgCQkJCiAgICAgICAgICAgICAgICAgICAgIH0KIApAQCAtMzQ3OSw1NCArMzUyMyw1NCBAQAogCiAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEzMTY6MzogKG90aGVybHZfMjU9ICdrZXlzJyBvdGhlcmx2XzI2PSAneycgKCAobHZfbG9va3VwS2V5c18yN18wPSBydWxlRGF0YUludGVyY2hhbmdlS2V5ICkgKSogb3RoZXJsdl8yOD0gJ30nICk/CisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMzI2OjM6IChvdGhlcmx2XzIzPSAnZXhwb3NlJyBvdGhlcmx2XzI0PSAneycgKCAobHZfZXhwb3J0RXhwb3Nlc18yNV8wPSBydWxlRGF0YUludGVyY2hhbmdlRXhwb3NlICkgKSogb3RoZXJsdl8yNj0gJ30nICk/CiAgICAgICAgICAgICBpbnQgYWx0Mjc9MjsKICAgICAgICAgICAgIGludCBMQTI3XzAgPSBpbnB1dC5MQSgxKTsKIAotICAgICAgICAgICAgaWYgKCAoTEEyN18wPT00NCkgKSB7CisgICAgICAgICAgICBpZiAoIChMQTI3XzA9PTQ1KSApIHsKICAgICAgICAgICAgICAgICBhbHQyNz0xOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgc3dpdGNoIChhbHQyNykgewogICAgICAgICAgICAgICAgIGNhc2UgMSA6Ci0gICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEzMTc6NDogb3RoZXJsdl8yNT0gJ2tleXMnIG90aGVybHZfMjY9ICd7JyAoIChsdl9sb29rdXBLZXlzXzI3XzA9IHJ1bGVEYXRhSW50ZXJjaGFuZ2VLZXkgKSApKiBvdGhlcmx2XzI4PSAnfScKKyAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTMyNzo0OiBvdGhlcmx2XzIzPSAnZXhwb3NlJyBvdGhlcmx2XzI0PSAneycgKCAobHZfZXhwb3J0RXhwb3Nlc18yNV8wPSBydWxlRGF0YUludGVyY2hhbmdlRXhwb3NlICkgKSogb3RoZXJsdl8yNj0gJ30nCiAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgb3RoZXJsdl8yNT0oVG9rZW4pbWF0Y2goaW5wdXQsNDQsRk9MTE9XXzE3KTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7CisgICAgICAgICAgICAgICAgICAgIG90aGVybHZfMjM9KFRva2VuKW1hdGNoKGlucHV0LDQ1LEZPTExPV18xOCk7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OwogICAgICAgICAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKIAotICAgICAgICAgICAgICAgICAgICAgIAkJCQluZXdMZWFmTm9kZShvdGhlcmx2XzI1LCBncmFtbWFyQWNjZXNzLmdldERhdGFJbnRlcmNoYW5nZUJlYW5BY2Nlc3MoKS5nZXRLZXlzS2V5d29yZF8xMF8wKCkpOworICAgICAgICAgICAgICAgICAgICAgIAkJCQluZXdMZWFmTm9kZShvdGhlcmx2XzIzLCBncmFtbWFyQWNjZXNzLmdldERhdGFJbnRlcmNoYW5nZUJlYW5BY2Nlc3MoKS5nZXRFeHBvc2VLZXl3b3JkXzEwXzAoKSk7CiAgICAgICAgICAgICAgICAgICAgICAgCQkJCiAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgb3RoZXJsdl8yNj0oVG9rZW4pbWF0Y2goaW5wdXQsMTUsRk9MTE9XXzM0KTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7CisgICAgICAgICAgICAgICAgICAgIG90aGVybHZfMjQ9KFRva2VuKW1hdGNoKGlucHV0LDE1LEZPTExPV18zNCk7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OwogICAgICAgICAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKIAotICAgICAgICAgICAgICAgICAgICAgIAkJCQluZXdMZWFmTm9kZShvdGhlcmx2XzI2LCBncmFtbWFyQWNjZXNzLmdldERhdGFJbnRlcmNoYW5nZUJlYW5BY2Nlc3MoKS5nZXRMZWZ0Q3VybHlCcmFja2V0S2V5d29yZF8xMF8xKCkpOworICAgICAgICAgICAgICAgICAgICAgIAkJCQluZXdMZWFmTm9kZShvdGhlcmx2XzI0LCBncmFtbWFyQWNjZXNzLmdldERhdGFJbnRlcmNoYW5nZUJlYW5BY2Nlc3MoKS5nZXRMZWZ0Q3VybHlCcmFja2V0S2V5d29yZF8xMF8xKCkpOwogICAgICAgICAgICAgICAgICAgICAgIAkJCQogICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEzMjU6NDogKCAobHZfbG9va3VwS2V5c18yN18wPSBydWxlRGF0YUludGVyY2hhbmdlS2V5ICkgKSoKKyAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTMzNTo0OiAoIChsdl9leHBvcnRFeHBvc2VzXzI1XzA9IHJ1bGVEYXRhSW50ZXJjaGFuZ2VFeHBvc2UgKSApKgogICAgICAgICAgICAgICAgICAgICBsb29wMjY6CiAgICAgICAgICAgICAgICAgICAgIGRvIHsKICAgICAgICAgICAgICAgICAgICAgICAgIGludCBhbHQyNj0yOwogICAgICAgICAgICAgICAgICAgICAgICAgaW50IExBMjZfMCA9IGlucHV0LkxBKDEpOwogCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIChMQTI2XzA9PTQ1KSApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICggKExBMjZfMD09NjQpICkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsdDI2PTE7CiAgICAgICAgICAgICAgICAgICAgICAgICB9CiAKIAogICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChhbHQyNikgewogICAgICAgICAgICAgICAgICAgICAJY2FzZSAxIDoKLSAgICAgICAgICAgICAgICAgICAgCSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMzI2OjU6IChsdl9sb29rdXBLZXlzXzI3XzA9IHJ1bGVEYXRhSW50ZXJjaGFuZ2VLZXkgKQorICAgICAgICAgICAgICAgICAgICAJICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEzMzY6NTogKGx2X2V4cG9ydEV4cG9zZXNfMjVfMD0gcnVsZURhdGFJbnRlcmNoYW5nZUV4cG9zZSApCiAgICAgICAgICAgICAgICAgICAgIAkgICAgewotICAgICAgICAgICAgICAgICAgICAJICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEzMjY6NTogKGx2X2xvb2t1cEtleXNfMjdfMD0gcnVsZURhdGFJbnRlcmNoYW5nZUtleSApCi0gICAgICAgICAgICAgICAgICAgIAkgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTMyNzo2OiBsdl9sb29rdXBLZXlzXzI3XzA9IHJ1bGVEYXRhSW50ZXJjaGFuZ2VLZXkKKyAgICAgICAgICAgICAgICAgICAgCSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMzM2OjU6IChsdl9leHBvcnRFeHBvc2VzXzI1XzA9IHJ1bGVEYXRhSW50ZXJjaGFuZ2VFeHBvc2UgKQorICAgICAgICAgICAgICAgICAgICAJICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEzMzc6NjogbHZfZXhwb3J0RXhwb3Nlc18yNV8wPSBydWxlRGF0YUludGVyY2hhbmdlRXhwb3NlCiAgICAgICAgICAgICAgICAgICAgIAkgICAgewogICAgICAgICAgICAgICAgICAgICAJICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogCi0gICAgICAgICAgICAgICAgICAgIAkgICAgICAJCQkJCQluZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YUludGVyY2hhbmdlQmVhbkFjY2VzcygpLmdldExvb2t1cEtleXNEYXRhSW50ZXJjaGFuZ2VLZXlQYXJzZXJSdWxlQ2FsbF8xMF8yXzAoKSk7CisgICAgICAgICAgICAgICAgICAgIAkgICAgICAJCQkJCQluZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YUludGVyY2hhbmdlQmVhbkFjY2VzcygpLmdldEV4cG9ydEV4cG9zZXNEYXRhSW50ZXJjaGFuZ2VFeHBvc2VQYXJzZXJSdWxlQ2FsbF8xMF8yXzAoKSk7CiAgICAgICAgICAgICAgICAgICAgIAkgICAgICAJCQkJCQogICAgICAgICAgICAgICAgICAgICAJICAgIH0KICAgICAgICAgICAgICAgICAgICAgCSAgICBwdXNoRm9sbG93KEZPTExPV18zNCk7Ci0gICAgICAgICAgICAgICAgICAgIAkgICAgbHZfbG9va3VwS2V5c18yN18wPXJ1bGVEYXRhSW50ZXJjaGFuZ2VLZXkoKTsKKyAgICAgICAgICAgICAgICAgICAgCSAgICBsdl9leHBvcnRFeHBvc2VzXzI1XzA9cnVsZURhdGFJbnRlcmNoYW5nZUV4cG9zZSgpOwogCiAgICAgICAgICAgICAgICAgICAgIAkgICAgc3RhdGUuX2ZzcC0tOwogICAgICAgICAgICAgICAgICAgICAJICAgIGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OwpAQCAtMzUzNyw5ICszNTgxLDkgQEAKICAgICAgICAgICAgICAgICAgICAgCSAgICAgIAkJCQkJCX0KICAgICAgICAgICAgICAgICAgICAgCSAgICAgIAkJCQkJCWFkZCgKICAgICAgICAgICAgICAgICAgICAgCSAgICAgIAkJCQkJCQljdXJyZW50LAotICAgICAgICAgICAgICAgICAgICAJICAgICAgCQkJCQkJCSJsb29rdXBLZXlzIiwKLSAgICAgICAgICAgICAgICAgICAgCSAgICAgIAkJCQkJCQlsdl9sb29rdXBLZXlzXzI3XzAsCi0gICAgICAgICAgICAgICAgICAgIAkgICAgICAJCQkJCQkJIm9yZy5lY2xpcHNlLm9zYnAueHRleHQuZGF0YWludGVyY2hhbmdlLkRhdGFEU0wuRGF0YUludGVyY2hhbmdlS2V5Iik7CisgICAgICAgICAgICAgICAgICAgIAkgICAgICAJCQkJCQkJImV4cG9ydEV4cG9zZXMiLAorICAgICAgICAgICAgICAgICAgICAJICAgICAgCQkJCQkJCWx2X2V4cG9ydEV4cG9zZXNfMjVfMCwKKyAgICAgICAgICAgICAgICAgICAgCSAgICAgIAkJCQkJCQkib3JnLmVjbGlwc2Uub3NicC54dGV4dC5kYXRhaW50ZXJjaGFuZ2UuRGF0YURTTC5EYXRhSW50ZXJjaGFuZ2VFeHBvc2UiKTsKICAgICAgICAgICAgICAgICAgICAgCSAgICAgIAkJCQkJCWFmdGVyUGFyc2VyT3JFbnVtUnVsZUNhbGwoKTsKICAgICAgICAgICAgICAgICAgICAgCSAgICAgIAkJCQkJCiAgICAgICAgICAgICAgICAgICAgIAkgICAgfQpAQCAtMzU1NSwxMCArMzU5OSwyNTYgQEAKICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgfSB3aGlsZSAodHJ1ZSk7CiAKLSAgICAgICAgICAgICAgICAgICAgb3RoZXJsdl8yOD0oVG9rZW4pbWF0Y2goaW5wdXQsMTYsRk9MTE9XXzIpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gY3VycmVudDsKKyAgICAgICAgICAgICAgICAgICAgb3RoZXJsdl8yNj0oVG9rZW4pbWF0Y2goaW5wdXQsMTYsRk9MTE9XXzM1KTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7CiAgICAgICAgICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogCi0gICAgICAgICAgICAgICAgICAgICAgCQkJCW5ld0xlYWZOb2RlKG90aGVybHZfMjgsIGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YUludGVyY2hhbmdlQmVhbkFjY2VzcygpLmdldFJpZ2h0Q3VybHlCcmFja2V0S2V5d29yZF8xMF8zKCkpOworICAgICAgICAgICAgICAgICAgICAgIAkJCQluZXdMZWFmTm9kZShvdGhlcmx2XzI2LCBncmFtbWFyQWNjZXNzLmdldERhdGFJbnRlcmNoYW5nZUJlYW5BY2Nlc3MoKS5nZXRSaWdodEN1cmx5QnJhY2tldEtleXdvcmRfMTBfMygpKTsKKyAgICAgICAgICAgICAgICAgICAgICAJCQkKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTM1OTozOiAob3RoZXJsdl8yNz0gJ21hcHBpbmcnIG90aGVybHZfMjg9ICd7JyAoIChsdl9tYXBwaW5nc18yOV8wPSBydWxlRGF0YUludGVyY2hhbmdlTWFwcGluZyApICkqIG90aGVybHZfMzA9ICd9JyApPworICAgICAgICAgICAgaW50IGFsdDI5PTI7CisgICAgICAgICAgICBpbnQgTEEyOV8wID0gaW5wdXQuTEEoMSk7CisKKyAgICAgICAgICAgIGlmICggKExBMjlfMD09NDYpICkgeworICAgICAgICAgICAgICAgIGFsdDI5PTE7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzd2l0Y2ggKGFsdDI5KSB7CisgICAgICAgICAgICAgICAgY2FzZSAxIDoKKyAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTM2MDo0OiBvdGhlcmx2XzI3PSAnbWFwcGluZycgb3RoZXJsdl8yOD0gJ3snICggKGx2X21hcHBpbmdzXzI5XzA9IHJ1bGVEYXRhSW50ZXJjaGFuZ2VNYXBwaW5nICkgKSogb3RoZXJsdl8zMD0gJ30nCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgb3RoZXJsdl8yNz0oVG9rZW4pbWF0Y2goaW5wdXQsNDYsRk9MTE9XXzE4KTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7CisgICAgICAgICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworCisgICAgICAgICAgICAgICAgICAgICAgCQkJCW5ld0xlYWZOb2RlKG90aGVybHZfMjcsIGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YUludGVyY2hhbmdlQmVhbkFjY2VzcygpLmdldE1hcHBpbmdLZXl3b3JkXzExXzAoKSk7CisgICAgICAgICAgICAgICAgICAgICAgCQkJCisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgb3RoZXJsdl8yOD0oVG9rZW4pbWF0Y2goaW5wdXQsMTUsRk9MTE9XXzM2KTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7CisgICAgICAgICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworCisgICAgICAgICAgICAgICAgICAgICAgCQkJCW5ld0xlYWZOb2RlKG90aGVybHZfMjgsIGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YUludGVyY2hhbmdlQmVhbkFjY2VzcygpLmdldExlZnRDdXJseUJyYWNrZXRLZXl3b3JkXzExXzEoKSk7CisgICAgICAgICAgICAgICAgICAgICAgCQkJCisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTM2ODo0OiAoIChsdl9tYXBwaW5nc18yOV8wPSBydWxlRGF0YUludGVyY2hhbmdlTWFwcGluZyApICkqCisgICAgICAgICAgICAgICAgICAgIGxvb3AyODoKKyAgICAgICAgICAgICAgICAgICAgZG8geworICAgICAgICAgICAgICAgICAgICAgICAgaW50IGFsdDI4PTI7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgTEEyOF8wID0gaW5wdXQuTEEoMSk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICggKExBMjhfMD09Njl8fExBMjhfMD09NzEpICkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsdDI4PTE7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChhbHQyOCkgeworICAgICAgICAgICAgICAgICAgICAJY2FzZSAxIDoKKyAgICAgICAgICAgICAgICAgICAgCSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMzY5OjU6IChsdl9tYXBwaW5nc18yOV8wPSBydWxlRGF0YUludGVyY2hhbmdlTWFwcGluZyApCisgICAgICAgICAgICAgICAgICAgIAkgICAgeworICAgICAgICAgICAgICAgICAgICAJICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEzNjk6NTogKGx2X21hcHBpbmdzXzI5XzA9IHJ1bGVEYXRhSW50ZXJjaGFuZ2VNYXBwaW5nICkKKyAgICAgICAgICAgICAgICAgICAgCSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMzcwOjY6IGx2X21hcHBpbmdzXzI5XzA9IHJ1bGVEYXRhSW50ZXJjaGFuZ2VNYXBwaW5nCisgICAgICAgICAgICAgICAgICAgIAkgICAgeworICAgICAgICAgICAgICAgICAgICAJICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworCisgICAgICAgICAgICAgICAgICAgIAkgICAgICAJCQkJCQluZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YUludGVyY2hhbmdlQmVhbkFjY2VzcygpLmdldE1hcHBpbmdzRGF0YUludGVyY2hhbmdlTWFwcGluZ1BhcnNlclJ1bGVDYWxsXzExXzJfMCgpKTsKKyAgICAgICAgICAgICAgICAgICAgCSAgICAgIAkJCQkJCisgICAgICAgICAgICAgICAgICAgIAkgICAgfQorICAgICAgICAgICAgICAgICAgICAJICAgIHB1c2hGb2xsb3coRk9MTE9XXzM2KTsKKyAgICAgICAgICAgICAgICAgICAgCSAgICBsdl9tYXBwaW5nc18yOV8wPXJ1bGVEYXRhSW50ZXJjaGFuZ2VNYXBwaW5nKCk7CisKKyAgICAgICAgICAgICAgICAgICAgCSAgICBzdGF0ZS5fZnNwLS07CisgICAgICAgICAgICAgICAgICAgIAkgICAgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7CisgICAgICAgICAgICAgICAgICAgIAkgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisKKyAgICAgICAgICAgICAgICAgICAgCSAgICAgIAkJCQkJCWlmIChjdXJyZW50PT1udWxsKSB7CisgICAgICAgICAgICAgICAgICAgIAkgICAgICAJCQkJCQkJY3VycmVudCA9IGNyZWF0ZU1vZGVsRWxlbWVudEZvclBhcmVudChncmFtbWFyQWNjZXNzLmdldERhdGFJbnRlcmNoYW5nZUJlYW5SdWxlKCkpOworICAgICAgICAgICAgICAgICAgICAJICAgICAgCQkJCQkJfQorICAgICAgICAgICAgICAgICAgICAJICAgICAgCQkJCQkJYWRkKAorICAgICAgICAgICAgICAgICAgICAJICAgICAgCQkJCQkJCWN1cnJlbnQsCisgICAgICAgICAgICAgICAgICAgIAkgICAgICAJCQkJCQkJIm1hcHBpbmdzIiwKKyAgICAgICAgICAgICAgICAgICAgCSAgICAgIAkJCQkJCQlsdl9tYXBwaW5nc18yOV8wLAorICAgICAgICAgICAgICAgICAgICAJICAgICAgCQkJCQkJCSJvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmRhdGFpbnRlcmNoYW5nZS5EYXRhRFNMLkRhdGFJbnRlcmNoYW5nZU1hcHBpbmciKTsKKyAgICAgICAgICAgICAgICAgICAgCSAgICAgIAkJCQkJCWFmdGVyUGFyc2VyT3JFbnVtUnVsZUNhbGwoKTsKKyAgICAgICAgICAgICAgICAgICAgCSAgICAgIAkJCQkJCisgICAgICAgICAgICAgICAgICAgIAkgICAgfQorCisgICAgICAgICAgICAgICAgICAgIAkgICAgfQorCisKKyAgICAgICAgICAgICAgICAgICAgCSAgICB9CisgICAgICAgICAgICAgICAgICAgIAkgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICAgICAgCWRlZmF1bHQgOgorICAgICAgICAgICAgICAgICAgICAJICAgIGJyZWFrIGxvb3AyODsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfSB3aGlsZSAodHJ1ZSk7CisKKyAgICAgICAgICAgICAgICAgICAgb3RoZXJsdl8zMD0oVG9rZW4pbWF0Y2goaW5wdXQsMTYsRk9MTE9XXzM3KTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7CisgICAgICAgICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworCisgICAgICAgICAgICAgICAgICAgICAgCQkJCW5ld0xlYWZOb2RlKG90aGVybHZfMzAsIGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YUludGVyY2hhbmdlQmVhbkFjY2VzcygpLmdldFJpZ2h0Q3VybHlCcmFja2V0S2V5d29yZF8xMV8zKCkpOworICAgICAgICAgICAgICAgICAgICAgIAkJCQorICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMzkyOjM6IChvdGhlcmx2XzMxPSAna2V5cycgb3RoZXJsdl8zMj0gJ3snICggKGx2X2xvb2t1cEtleXNfMzNfMD0gcnVsZURhdGFJbnRlcmNoYW5nZUtleSApICkqIG90aGVybHZfMzQ9ICd9JyApPworICAgICAgICAgICAgaW50IGFsdDMxPTI7CisgICAgICAgICAgICBpbnQgTEEzMV8wID0gaW5wdXQuTEEoMSk7CisKKyAgICAgICAgICAgIGlmICggKExBMzFfMD09NDcpICkgeworICAgICAgICAgICAgICAgIGFsdDMxPTE7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzd2l0Y2ggKGFsdDMxKSB7CisgICAgICAgICAgICAgICAgY2FzZSAxIDoKKyAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTM5Mzo0OiBvdGhlcmx2XzMxPSAna2V5cycgb3RoZXJsdl8zMj0gJ3snICggKGx2X2xvb2t1cEtleXNfMzNfMD0gcnVsZURhdGFJbnRlcmNoYW5nZUtleSApICkqIG90aGVybHZfMzQ9ICd9JworICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIG90aGVybHZfMzE9KFRva2VuKW1hdGNoKGlucHV0LDQ3LEZPTExPV18xOCk7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OworICAgICAgICAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKworICAgICAgICAgICAgICAgICAgICAgIAkJCQluZXdMZWFmTm9kZShvdGhlcmx2XzMxLCBncmFtbWFyQWNjZXNzLmdldERhdGFJbnRlcmNoYW5nZUJlYW5BY2Nlc3MoKS5nZXRLZXlzS2V5d29yZF8xMl8wKCkpOworICAgICAgICAgICAgICAgICAgICAgIAkJCQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIG90aGVybHZfMzI9KFRva2VuKW1hdGNoKGlucHV0LDE1LEZPTExPV18zOCk7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OworICAgICAgICAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKworICAgICAgICAgICAgICAgICAgICAgIAkJCQluZXdMZWFmTm9kZShvdGhlcmx2XzMyLCBncmFtbWFyQWNjZXNzLmdldERhdGFJbnRlcmNoYW5nZUJlYW5BY2Nlc3MoKS5nZXRMZWZ0Q3VybHlCcmFja2V0S2V5d29yZF8xMl8xKCkpOworICAgICAgICAgICAgICAgICAgICAgIAkJCQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE0MDE6NDogKCAobHZfbG9va3VwS2V5c18zM18wPSBydWxlRGF0YUludGVyY2hhbmdlS2V5ICkgKSoKKyAgICAgICAgICAgICAgICAgICAgbG9vcDMwOgorICAgICAgICAgICAgICAgICAgICBkbyB7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYWx0MzA9MjsKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBMQTMwXzAgPSBpbnB1dC5MQSgxKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCAoTEEzMF8wPT00OSkgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWx0MzA9MTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKGFsdDMwKSB7CisgICAgICAgICAgICAgICAgICAgIAljYXNlIDEgOgorICAgICAgICAgICAgICAgICAgICAJICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE0MDI6NTogKGx2X2xvb2t1cEtleXNfMzNfMD0gcnVsZURhdGFJbnRlcmNoYW5nZUtleSApCisgICAgICAgICAgICAgICAgICAgIAkgICAgeworICAgICAgICAgICAgICAgICAgICAJICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE0MDI6NTogKGx2X2xvb2t1cEtleXNfMzNfMD0gcnVsZURhdGFJbnRlcmNoYW5nZUtleSApCisgICAgICAgICAgICAgICAgICAgIAkgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTQwMzo2OiBsdl9sb29rdXBLZXlzXzMzXzA9IHJ1bGVEYXRhSW50ZXJjaGFuZ2VLZXkKKyAgICAgICAgICAgICAgICAgICAgCSAgICB7CisgICAgICAgICAgICAgICAgICAgIAkgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisKKyAgICAgICAgICAgICAgICAgICAgCSAgICAgIAkJCQkJCW5ld0NvbXBvc2l0ZU5vZGUoZ3JhbW1hckFjY2Vzcy5nZXREYXRhSW50ZXJjaGFuZ2VCZWFuQWNjZXNzKCkuZ2V0TG9va3VwS2V5c0RhdGFJbnRlcmNoYW5nZUtleVBhcnNlclJ1bGVDYWxsXzEyXzJfMCgpKTsKKyAgICAgICAgICAgICAgICAgICAgCSAgICAgIAkJCQkJCisgICAgICAgICAgICAgICAgICAgIAkgICAgfQorICAgICAgICAgICAgICAgICAgICAJICAgIHB1c2hGb2xsb3coRk9MTE9XXzM4KTsKKyAgICAgICAgICAgICAgICAgICAgCSAgICBsdl9sb29rdXBLZXlzXzMzXzA9cnVsZURhdGFJbnRlcmNoYW5nZUtleSgpOworCisgICAgICAgICAgICAgICAgICAgIAkgICAgc3RhdGUuX2ZzcC0tOworICAgICAgICAgICAgICAgICAgICAJICAgIGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OworICAgICAgICAgICAgICAgICAgICAJICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworCisgICAgICAgICAgICAgICAgICAgIAkgICAgICAJCQkJCQlpZiAoY3VycmVudD09bnVsbCkgeworICAgICAgICAgICAgICAgICAgICAJICAgICAgCQkJCQkJCWN1cnJlbnQgPSBjcmVhdGVNb2RlbEVsZW1lbnRGb3JQYXJlbnQoZ3JhbW1hckFjY2Vzcy5nZXREYXRhSW50ZXJjaGFuZ2VCZWFuUnVsZSgpKTsKKyAgICAgICAgICAgICAgICAgICAgCSAgICAgIAkJCQkJCX0KKyAgICAgICAgICAgICAgICAgICAgCSAgICAgIAkJCQkJCWFkZCgKKyAgICAgICAgICAgICAgICAgICAgCSAgICAgIAkJCQkJCQljdXJyZW50LAorICAgICAgICAgICAgICAgICAgICAJICAgICAgCQkJCQkJCSJsb29rdXBLZXlzIiwKKyAgICAgICAgICAgICAgICAgICAgCSAgICAgIAkJCQkJCQlsdl9sb29rdXBLZXlzXzMzXzAsCisgICAgICAgICAgICAgICAgICAgIAkgICAgICAJCQkJCQkJIm9yZy5lY2xpcHNlLm9zYnAueHRleHQuZGF0YWludGVyY2hhbmdlLkRhdGFEU0wuRGF0YUludGVyY2hhbmdlS2V5Iik7CisgICAgICAgICAgICAgICAgICAgIAkgICAgICAJCQkJCQlhZnRlclBhcnNlck9yRW51bVJ1bGVDYWxsKCk7CisgICAgICAgICAgICAgICAgICAgIAkgICAgICAJCQkJCQorICAgICAgICAgICAgICAgICAgICAJICAgIH0KKworICAgICAgICAgICAgICAgICAgICAJICAgIH0KKworCisgICAgICAgICAgICAgICAgICAgIAkgICAgfQorICAgICAgICAgICAgICAgICAgICAJICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgICAgIAlkZWZhdWx0IDoKKyAgICAgICAgICAgICAgICAgICAgCSAgICBicmVhayBsb29wMzA7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0gd2hpbGUgKHRydWUpOworCisgICAgICAgICAgICAgICAgICAgIG90aGVybHZfMzQ9KFRva2VuKW1hdGNoKGlucHV0LDE2LEZPTExPV18zOSk7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OworICAgICAgICAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKworICAgICAgICAgICAgICAgICAgICAgIAkJCQluZXdMZWFmTm9kZShvdGhlcmx2XzM0LCBncmFtbWFyQWNjZXNzLmdldERhdGFJbnRlcmNoYW5nZUJlYW5BY2Nlc3MoKS5nZXRSaWdodEN1cmx5QnJhY2tldEtleXdvcmRfMTJfMygpKTsKKyAgICAgICAgICAgICAgICAgICAgICAJCQkKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTQyNTozOiAob3RoZXJsdl8zNT0gJ2V4cG9ydEZpbHRlcicgb3RoZXJsdl8zNj0gJ3snICggKGx2X2V4cG9ydEZpbHRlcl8zN18wPSBydWxlRGF0YUludGVyY2hhbmdlRXhwb3J0RmlsdGVyICkgKSBvdGhlcmx2XzM4PSAnfScgKT8KKyAgICAgICAgICAgIGludCBhbHQzMj0yOworICAgICAgICAgICAgaW50IExBMzJfMCA9IGlucHV0LkxBKDEpOworCisgICAgICAgICAgICBpZiAoIChMQTMyXzA9PTQ4KSApIHsKKyAgICAgICAgICAgICAgICBhbHQzMj0xOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc3dpdGNoIChhbHQzMikgeworICAgICAgICAgICAgICAgIGNhc2UgMSA6CisgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE0MjY6NDogb3RoZXJsdl8zNT0gJ2V4cG9ydEZpbHRlcicgb3RoZXJsdl8zNj0gJ3snICggKGx2X2V4cG9ydEZpbHRlcl8zN18wPSBydWxlRGF0YUludGVyY2hhbmdlRXhwb3J0RmlsdGVyICkgKSBvdGhlcmx2XzM4PSAnfScKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBvdGhlcmx2XzM1PShUb2tlbiltYXRjaChpbnB1dCw0OCxGT0xMT1dfMTgpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gY3VycmVudDsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisKKyAgICAgICAgICAgICAgICAgICAgICAJCQkJbmV3TGVhZk5vZGUob3RoZXJsdl8zNSwgZ3JhbW1hckFjY2Vzcy5nZXREYXRhSW50ZXJjaGFuZ2VCZWFuQWNjZXNzKCkuZ2V0RXhwb3J0RmlsdGVyS2V5d29yZF8xM18wKCkpOworICAgICAgICAgICAgICAgICAgICAgIAkJCQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIG90aGVybHZfMzY9KFRva2VuKW1hdGNoKGlucHV0LDE1LEZPTExPV180MCk7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OworICAgICAgICAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKworICAgICAgICAgICAgICAgICAgICAgIAkJCQluZXdMZWFmTm9kZShvdGhlcmx2XzM2LCBncmFtbWFyQWNjZXNzLmdldERhdGFJbnRlcmNoYW5nZUJlYW5BY2Nlc3MoKS5nZXRMZWZ0Q3VybHlCcmFja2V0S2V5d29yZF8xM18xKCkpOworICAgICAgICAgICAgICAgICAgICAgIAkJCQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE0MzQ6NDogKCAobHZfZXhwb3J0RmlsdGVyXzM3XzA9IHJ1bGVEYXRhSW50ZXJjaGFuZ2VFeHBvcnRGaWx0ZXIgKSApCisgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE0MzU6NTogKGx2X2V4cG9ydEZpbHRlcl8zN18wPSBydWxlRGF0YUludGVyY2hhbmdlRXhwb3J0RmlsdGVyICkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNDM1OjU6IChsdl9leHBvcnRGaWx0ZXJfMzdfMD0gcnVsZURhdGFJbnRlcmNoYW5nZUV4cG9ydEZpbHRlciApCisgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE0MzY6NjogbHZfZXhwb3J0RmlsdGVyXzM3XzA9IHJ1bGVEYXRhSW50ZXJjaGFuZ2VFeHBvcnRGaWx0ZXIKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKworICAgICAgICAgICAgICAgICAgICAgIAkJCQkJCW5ld0NvbXBvc2l0ZU5vZGUoZ3JhbW1hckFjY2Vzcy5nZXREYXRhSW50ZXJjaGFuZ2VCZWFuQWNjZXNzKCkuZ2V0RXhwb3J0RmlsdGVyRGF0YUludGVyY2hhbmdlRXhwb3J0RmlsdGVyUGFyc2VyUnVsZUNhbGxfMTNfMl8wKCkpOworICAgICAgICAgICAgICAgICAgICAgIAkJCQkJCisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfNDEpOworICAgICAgICAgICAgICAgICAgICBsdl9leHBvcnRGaWx0ZXJfMzdfMD1ydWxlRGF0YUludGVyY2hhbmdlRXhwb3J0RmlsdGVyKCk7CisKKyAgICAgICAgICAgICAgICAgICAgc3RhdGUuX2ZzcC0tOworICAgICAgICAgICAgICAgICAgICBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gY3VycmVudDsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisKKyAgICAgICAgICAgICAgICAgICAgICAJCQkJCQlpZiAoY3VycmVudD09bnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgIAkJCQkJCQljdXJyZW50ID0gY3JlYXRlTW9kZWxFbGVtZW50Rm9yUGFyZW50KGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YUludGVyY2hhbmdlQmVhblJ1bGUoKSk7CisgICAgICAgICAgICAgICAgICAgICAgCQkJCQkJfQorICAgICAgICAgICAgICAgICAgICAgIAkJCQkJCXNldCgKKyAgICAgICAgICAgICAgICAgICAgICAJCQkJCQkJY3VycmVudCwKKyAgICAgICAgICAgICAgICAgICAgICAJCQkJCQkJImV4cG9ydEZpbHRlciIsCisgICAgICAgICAgICAgICAgICAgICAgCQkJCQkJCWx2X2V4cG9ydEZpbHRlcl8zN18wLAorICAgICAgICAgICAgICAgICAgICAgIAkJCQkJCQkib3JnLmVjbGlwc2Uub3NicC54dGV4dC5kYXRhaW50ZXJjaGFuZ2UuRGF0YURTTC5EYXRhSW50ZXJjaGFuZ2VFeHBvcnRGaWx0ZXIiKTsKKyAgICAgICAgICAgICAgICAgICAgICAJCQkJCQlhZnRlclBhcnNlck9yRW51bVJ1bGVDYWxsKCk7CisgICAgICAgICAgICAgICAgICAgICAgCQkJCQkKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBvdGhlcmx2XzM4PShUb2tlbiltYXRjaChpbnB1dCwxNixGT0xMT1dfMik7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OworICAgICAgICAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKworICAgICAgICAgICAgICAgICAgICAgIAkJCQluZXdMZWFmTm9kZShvdGhlcmx2XzM4LCBncmFtbWFyQWNjZXNzLmdldERhdGFJbnRlcmNoYW5nZUJlYW5BY2Nlc3MoKS5nZXRSaWdodEN1cmx5QnJhY2tldEtleXdvcmRfMTNfMygpKTsKICAgICAgICAgICAgICAgICAgICAgICAJCQkKICAgICAgICAgICAgICAgICAgICAgfQogCkBAIC0zNTkyLDcgKzM4ODIsNyBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgImVudHJ5UnVsZURhdGFJbnRlcmNoYW5nZUtleSIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMzUzOjE6IGVudHJ5UnVsZURhdGFJbnRlcmNoYW5nZUtleSByZXR1cm5zIFtFT2JqZWN0IGN1cnJlbnQ9bnVsbF0gOiBpdl9ydWxlRGF0YUludGVyY2hhbmdlS2V5PSBydWxlRGF0YUludGVyY2hhbmdlS2V5IEVPRiA7CisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTQ2MjoxOiBlbnRyeVJ1bGVEYXRhSW50ZXJjaGFuZ2VLZXkgcmV0dXJucyBbRU9iamVjdCBjdXJyZW50PW51bGxdIDogaXZfcnVsZURhdGFJbnRlcmNoYW5nZUtleT0gcnVsZURhdGFJbnRlcmNoYW5nZUtleSBFT0YgOwogICAgIHB1YmxpYyBmaW5hbCBFT2JqZWN0IGVudHJ5UnVsZURhdGFJbnRlcmNoYW5nZUtleSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAgICAgICAgIEVPYmplY3QgY3VycmVudCA9IG51bGw7CiAKQEAgLTM2MDAsOCArMzg5MCw4IEBACiAKIAogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTM1Mzo1OTogKGl2X3J1bGVEYXRhSW50ZXJjaGFuZ2VLZXk9IHJ1bGVEYXRhSW50ZXJjaGFuZ2VLZXkgRU9GICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEzNTQ6MjogaXZfcnVsZURhdGFJbnRlcmNoYW5nZUtleT0gcnVsZURhdGFJbnRlcmNoYW5nZUtleSBFT0YKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE0NjI6NTk6IChpdl9ydWxlRGF0YUludGVyY2hhbmdlS2V5PSBydWxlRGF0YUludGVyY2hhbmdlS2V5IEVPRiApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNDYzOjI6IGl2X3J1bGVEYXRhSW50ZXJjaGFuZ2VLZXk9IHJ1bGVEYXRhSW50ZXJjaGFuZ2VLZXkgRU9GCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIG5ld0NvbXBvc2l0ZU5vZGUoZ3JhbW1hckFjY2Vzcy5nZXREYXRhSW50ZXJjaGFuZ2VLZXlSdWxlKCkpOyAKQEAgLTM2MzIsNyArMzkyMiw3IEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZURhdGFJbnRlcmNoYW5nZUtleSIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMzYwOjE6IHJ1bGVEYXRhSW50ZXJjaGFuZ2VLZXkgcmV0dXJucyBbRU9iamVjdCBjdXJyZW50PW51bGxdIDogKCAoKSBvdGhlcmx2XzE9ICdrZXknICggKG90aGVybHZfMj0gUlVMRV9JRCApICkgKSA7CisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTQ2OToxOiBydWxlRGF0YUludGVyY2hhbmdlS2V5IHJldHVybnMgW0VPYmplY3QgY3VycmVudD1udWxsXSA6ICggKCkgb3RoZXJsdl8xPSAna2V5JyAoIChvdGhlcmx2XzI9IFJVTEVfSUQgKSApICkgOwogICAgIHB1YmxpYyBmaW5hbCBFT2JqZWN0IHJ1bGVEYXRhSW50ZXJjaGFuZ2VLZXkoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogICAgICAgICBFT2JqZWN0IGN1cnJlbnQgPSBudWxsOwogCkBAIC0zNjQzLDE0ICszOTMzLDE0IEBACiAgICAgICAgIAllbnRlclJ1bGUoKTsKIAogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTM2NjoyOiAoICggKCkgb3RoZXJsdl8xPSAna2V5JyAoIChvdGhlcmx2XzI9IFJVTEVfSUQgKSApICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTM2NzoyOiAoICgpIG90aGVybHZfMT0gJ2tleScgKCAob3RoZXJsdl8yPSBSVUxFX0lEICkgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNDc1OjI6ICggKCAoKSBvdGhlcmx2XzE9ICdrZXknICggKG90aGVybHZfMj0gUlVMRV9JRCApICkgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNDc2OjI6ICggKCkgb3RoZXJsdl8xPSAna2V5JyAoIChvdGhlcmx2XzI9IFJVTEVfSUQgKSApICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEzNjc6MjogKCAoKSBvdGhlcmx2XzE9ICdrZXknICggKG90aGVybHZfMj0gUlVMRV9JRCApICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTM2ODozOiAoKSBvdGhlcmx2XzE9ICdrZXknICggKG90aGVybHZfMj0gUlVMRV9JRCApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE0NzY6MjogKCAoKSBvdGhlcmx2XzE9ICdrZXknICggKG90aGVybHZfMj0gUlVMRV9JRCApICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTQ3NzozOiAoKSBvdGhlcmx2XzE9ICdrZXknICggKG90aGVybHZfMj0gUlVMRV9JRCApICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEzNjg6MzogKCkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEzNjk6NDogCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNDc3OjM6ICgpCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNDc4OjQ6IAogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAKQEAgLTM2NjIsMTcgKzM5NTIsMTcgQEAKIAogICAgICAgICAgICAgfQogCi0gICAgICAgICAgICBvdGhlcmx2XzE9KFRva2VuKW1hdGNoKGlucHV0LDQ1LEZPTExPV180KTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7CisgICAgICAgICAgICBvdGhlcmx2XzE9KFRva2VuKW1hdGNoKGlucHV0LDQ5LEZPTExPV180KTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKIAogICAgICAgICAgICAgICAJCQluZXdMZWFmTm9kZShvdGhlcmx2XzEsIGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YUludGVyY2hhbmdlS2V5QWNjZXNzKCkuZ2V0S2V5S2V5d29yZF8xKCkpOwogICAgICAgICAgICAgICAJCQogICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTM3OTozOiAoIChvdGhlcmx2XzI9IFJVTEVfSUQgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMzgwOjQ6IChvdGhlcmx2XzI9IFJVTEVfSUQgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTQ4ODozOiAoIChvdGhlcmx2XzI9IFJVTEVfSUQgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNDg5OjQ6IChvdGhlcmx2XzI9IFJVTEVfSUQgKQogICAgICAgICAgICAgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTM4MDo0OiAob3RoZXJsdl8yPSBSVUxFX0lEICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEzODE6NTogb3RoZXJsdl8yPSBSVUxFX0lECisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNDg5OjQ6IChvdGhlcmx2XzI9IFJVTEVfSUQgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTQ5MDo1OiBvdGhlcmx2XzI9IFJVTEVfSUQKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogCkBAIC0zNzE4LDcgKzQwMDgsNyBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgImVudHJ5UnVsZURhdGFJbnRlcmNoYW5nZUxvb2t1cCIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxMzk2OjE6IGVudHJ5UnVsZURhdGFJbnRlcmNoYW5nZUxvb2t1cCByZXR1cm5zIFtFT2JqZWN0IGN1cnJlbnQ9bnVsbF0gOiBpdl9ydWxlRGF0YUludGVyY2hhbmdlTG9va3VwPSBydWxlRGF0YUludGVyY2hhbmdlTG9va3VwIEVPRiA7CisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTUwNToxOiBlbnRyeVJ1bGVEYXRhSW50ZXJjaGFuZ2VMb29rdXAgcmV0dXJucyBbRU9iamVjdCBjdXJyZW50PW51bGxdIDogaXZfcnVsZURhdGFJbnRlcmNoYW5nZUxvb2t1cD0gcnVsZURhdGFJbnRlcmNoYW5nZUxvb2t1cCBFT0YgOwogICAgIHB1YmxpYyBmaW5hbCBFT2JqZWN0IGVudHJ5UnVsZURhdGFJbnRlcmNoYW5nZUxvb2t1cCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAgICAgICAgIEVPYmplY3QgY3VycmVudCA9IG51bGw7CiAKQEAgLTM3MjYsOCArNDAxNiw4IEBACiAKIAogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTM5Njo2MjogKGl2X3J1bGVEYXRhSW50ZXJjaGFuZ2VMb29rdXA9IHJ1bGVEYXRhSW50ZXJjaGFuZ2VMb29rdXAgRU9GICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjEzOTc6MjogaXZfcnVsZURhdGFJbnRlcmNoYW5nZUxvb2t1cD0gcnVsZURhdGFJbnRlcmNoYW5nZUxvb2t1cCBFT0YKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE1MDU6NjI6IChpdl9ydWxlRGF0YUludGVyY2hhbmdlTG9va3VwPSBydWxlRGF0YUludGVyY2hhbmdlTG9va3VwIEVPRiApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNTA2OjI6IGl2X3J1bGVEYXRhSW50ZXJjaGFuZ2VMb29rdXA9IHJ1bGVEYXRhSW50ZXJjaGFuZ2VMb29rdXAgRU9GCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIG5ld0NvbXBvc2l0ZU5vZGUoZ3JhbW1hckFjY2Vzcy5nZXREYXRhSW50ZXJjaGFuZ2VMb29rdXBSdWxlKCkpOyAKQEAgLTM3NTgsNyArNDA0OCw3IEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZURhdGFJbnRlcmNoYW5nZUxvb2t1cCIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNDAzOjE6IHJ1bGVEYXRhSW50ZXJjaGFuZ2VMb29rdXAgcmV0dXJucyBbRU9iamVjdCBjdXJyZW50PW51bGxdIDogKCAoKSBvdGhlcmx2XzE9ICdmb3InICggKG90aGVybHZfMj0gUlVMRV9JRCApICkgb3RoZXJsdl8zPSAnb24nICggKG90aGVybHZfND0gUlVMRV9JRCApICkgKG90aGVybHZfNT0gJ2NyZWF0ZU9uJyAoIChsdl9lbGVtZW50TWFwXzZfMD0gUlVMRV9TVFJJTkcgKSApICk/IG90aGVybHZfNz0gJ3dpdGgnICggKG90aGVybHZfOD0gUlVMRV9JRCApICkgKCAoIChsdl9jYWNoZWRfOV8wPSAnY2FjaGVTaXplJyApICkgKCAobHZfY2FjaGVTaXplXzEwXzA9IFJVTEVfSU5UICkgKSApPyAob3RoZXJsdl8xMT0gJ21hcFRvJyAoIChsdl9kYXRhTWFwXzEyXzA9IFJVTEVfU1RSSU5HICkgKSApPyAoICggKCAoICh7Li4ufT8gPT4gKCAoey4uLn0/ID0+ICggKGx2X2FsbG93Tm9SZXN1bHRfMTRfMD0gJ2FsbG93Tm9SZXN1bHQnICkgKSApICkgKSB8ICh7Li4ufT8gPT4gKCAoey4uLn0/ID0+ICggKGx2X2FsbG93Tm9udW5pcXVlUmVzdWx0XzE1XzA9ICdhbGxvd05vbnVuaXF1ZVJlc3VsdCcgKSApICkgKSApIHwgKHsuLi59PyA9PiAoICh7Li4ufT8gPT4gKCAobHZfbWFya2VyUGF0aF8xNl8wPSBydWxlRGF0YUludGVyY2hhbmdlTWFya2VyUGF0aCApICkgKSApICkgKSogKSApICkgKSA7CisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTUxMjoxOiBydWxlRGF0YUludGVyY2hhbmdlTG9va3VwIHJldHVybnMgW0VPYmplY3QgY3VycmVudD1udWxsXSA6ICggKCkgb3RoZXJsdl8xPSAnZm9yJyAoIChvdGhlcmx2XzI9IFJVTEVfSUQgKSApIG90aGVybHZfMz0gJ29uJyAoIChvdGhlcmx2XzQ9IFJVTEVfSUQgKSApIChvdGhlcmx2XzU9ICdjcmVhdGVPbicgKCAobHZfZWxlbWVudE1hcF82XzA9IFJVTEVfU1RSSU5HICkgKSApPyBvdGhlcmx2Xzc9ICd3aXRoJyAoIChvdGhlcmx2Xzg9IFJVTEVfSUQgKSApICggKCAobHZfY2FjaGVkXzlfMD0gJ2NhY2hlU2l6ZScgKSApICggKGx2X2NhY2hlU2l6ZV8xMF8wPSBSVUxFX0lOVCApICkgKT8gKG90aGVybHZfMTE9ICdtYXBUbycgKCAobHZfZGF0YU1hcF8xMl8wPSBSVUxFX1NUUklORyApICkgKT8gKCAoICggKCAoey4uLn0/ID0+ICggKHsuLi59PyA9PiAoIChsdl9hbGxvd05vUmVzdWx0XzE0XzA9ICdhbGxvd05vUmVzdWx0JyApICkgKSApICkgfCAoey4uLn0/ID0+ICggKHsuLi59PyA9PiAoIChsdl9hbGxvd05vbnVuaXF1ZVJlc3VsdF8xNV8wPSAnYWxsb3dOb251bmlxdWVSZXN1bHQnICkgKSApICkgKSB8ICh7Li4ufT8gPT4gKCAoey4uLn0/ID0+ICggKGx2X21hcmtlclBhdGhfMTZfMD0gcnVsZURhdGFJbnRlcmNoYW5nZU1hcmtlclBhdGggKSApICkgKSApICkqICkgKSApICkgOwogICAgIHB1YmxpYyBmaW5hbCBFT2JqZWN0IHJ1bGVEYXRhSW50ZXJjaGFuZ2VMb29rdXAoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogICAgICAgICBFT2JqZWN0IGN1cnJlbnQgPSBudWxsOwogCkBAIC0zNzgzLDE0ICs0MDczLDE0IEBACiAgICAgICAgIAllbnRlclJ1bGUoKTsKIAogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTQwOToyOiAoICggKCkgb3RoZXJsdl8xPSAnZm9yJyAoIChvdGhlcmx2XzI9IFJVTEVfSUQgKSApIG90aGVybHZfMz0gJ29uJyAoIChvdGhlcmx2XzQ9IFJVTEVfSUQgKSApIChvdGhlcmx2XzU9ICdjcmVhdGVPbicgKCAobHZfZWxlbWVudE1hcF82XzA9IFJVTEVfU1RSSU5HICkgKSApPyBvdGhlcmx2Xzc9ICd3aXRoJyAoIChvdGhlcmx2Xzg9IFJVTEVfSUQgKSApICggKCAobHZfY2FjaGVkXzlfMD0gJ2NhY2hlU2l6ZScgKSApICggKGx2X2NhY2hlU2l6ZV8xMF8wPSBSVUxFX0lOVCApICkgKT8gKG90aGVybHZfMTE9ICdtYXBUbycgKCAobHZfZGF0YU1hcF8xMl8wPSBSVUxFX1NUUklORyApICkgKT8gKCAoICggKCAoey4uLn0/ID0+ICggKHsuLi59PyA9PiAoIChsdl9hbGxvd05vUmVzdWx0XzE0XzA9ICdhbGxvd05vUmVzdWx0JyApICkgKSApICkgfCAoey4uLn0/ID0+ICggKHsuLi59PyA9PiAoIChsdl9hbGxvd05vbnVuaXF1ZVJlc3VsdF8xNV8wPSAnYWxsb3dOb251bmlxdWVSZXN1bHQnICkgKSApICkgKSB8ICh7Li4ufT8gPT4gKCAoey4uLn0/ID0+ICggKGx2X21hcmtlclBhdGhfMTZfMD0gcnVsZURhdGFJbnRlcmNoYW5nZU1hcmtlclBhdGggKSApICkgKSApICkqICkgKSApICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTQxMDoyOiAoICgpIG90aGVybHZfMT0gJ2ZvcicgKCAob3RoZXJsdl8yPSBSVUxFX0lEICkgKSBvdGhlcmx2XzM9ICdvbicgKCAob3RoZXJsdl80PSBSVUxFX0lEICkgKSAob3RoZXJsdl81PSAnY3JlYXRlT24nICggKGx2X2VsZW1lbnRNYXBfNl8wPSBSVUxFX1NUUklORyApICkgKT8gb3RoZXJsdl83PSAnd2l0aCcgKCAob3RoZXJsdl84PSBSVUxFX0lEICkgKSAoICggKGx2X2NhY2hlZF85XzA9ICdjYWNoZVNpemUnICkgKSAoIChsdl9jYWNoZVNpemVfMTBfMD0gUlVMRV9JTlQgKSApICk/IChvdGhlcmx2XzExPSAnbWFwVG8nICggKGx2X2RhdGFNYXBfMTJfMD0gUlVMRV9TVFJJTkcgKSApICk/ICggKCAoICggKHsuLi59PyA9PiAoICh7Li4ufT8gPT4gKCAobHZfYWxsb3dOb1Jlc3VsdF8xNF8wPSAnYWxsb3dOb1Jlc3VsdCcgKSApICkgKSApIHwgKHsuLi59PyA9PiAoICh7Li4ufT8gPT4gKCAobHZfYWxsb3dOb251bmlxdWVSZXN1bHRfMTVfMD0gJ2FsbG93Tm9udW5pcXVlUmVzdWx0JyApICkgKSApICkgfCAoey4uLn0/ID0+ICggKHsuLi59PyA9PiAoIChsdl9tYXJrZXJQYXRoXzE2XzA9IHJ1bGVEYXRhSW50ZXJjaGFuZ2VNYXJrZXJQYXRoICkgKSApICkgKSApKiApICkgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNTE4OjI6ICggKCAoKSBvdGhlcmx2XzE9ICdmb3InICggKG90aGVybHZfMj0gUlVMRV9JRCApICkgb3RoZXJsdl8zPSAnb24nICggKG90aGVybHZfND0gUlVMRV9JRCApICkgKG90aGVybHZfNT0gJ2NyZWF0ZU9uJyAoIChsdl9lbGVtZW50TWFwXzZfMD0gUlVMRV9TVFJJTkcgKSApICk/IG90aGVybHZfNz0gJ3dpdGgnICggKG90aGVybHZfOD0gUlVMRV9JRCApICkgKCAoIChsdl9jYWNoZWRfOV8wPSAnY2FjaGVTaXplJyApICkgKCAobHZfY2FjaGVTaXplXzEwXzA9IFJVTEVfSU5UICkgKSApPyAob3RoZXJsdl8xMT0gJ21hcFRvJyAoIChsdl9kYXRhTWFwXzEyXzA9IFJVTEVfU1RSSU5HICkgKSApPyAoICggKCAoICh7Li4ufT8gPT4gKCAoey4uLn0/ID0+ICggKGx2X2FsbG93Tm9SZXN1bHRfMTRfMD0gJ2FsbG93Tm9SZXN1bHQnICkgKSApICkgKSB8ICh7Li4ufT8gPT4gKCAoey4uLn0/ID0+ICggKGx2X2FsbG93Tm9udW5pcXVlUmVzdWx0XzE1XzA9ICdhbGxvd05vbnVuaXF1ZVJlc3VsdCcgKSApICkgKSApIHwgKHsuLi59PyA9PiAoICh7Li4ufT8gPT4gKCAobHZfbWFya2VyUGF0aF8xNl8wPSBydWxlRGF0YUludGVyY2hhbmdlTWFya2VyUGF0aCApICkgKSApICkgKSogKSApICkgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNTE5OjI6ICggKCkgb3RoZXJsdl8xPSAnZm9yJyAoIChvdGhlcmx2XzI9IFJVTEVfSUQgKSApIG90aGVybHZfMz0gJ29uJyAoIChvdGhlcmx2XzQ9IFJVTEVfSUQgKSApIChvdGhlcmx2XzU9ICdjcmVhdGVPbicgKCAobHZfZWxlbWVudE1hcF82XzA9IFJVTEVfU1RSSU5HICkgKSApPyBvdGhlcmx2Xzc9ICd3aXRoJyAoIChvdGhlcmx2Xzg9IFJVTEVfSUQgKSApICggKCAobHZfY2FjaGVkXzlfMD0gJ2NhY2hlU2l6ZScgKSApICggKGx2X2NhY2hlU2l6ZV8xMF8wPSBSVUxFX0lOVCApICkgKT8gKG90aGVybHZfMTE9ICdtYXBUbycgKCAobHZfZGF0YU1hcF8xMl8wPSBSVUxFX1NUUklORyApICkgKT8gKCAoICggKCAoey4uLn0/ID0+ICggKHsuLi59PyA9PiAoIChsdl9hbGxvd05vUmVzdWx0XzE0XzA9ICdhbGxvd05vUmVzdWx0JyApICkgKSApICkgfCAoey4uLn0/ID0+ICggKHsuLi59PyA9PiAoIChsdl9hbGxvd05vbnVuaXF1ZVJlc3VsdF8xNV8wPSAnYWxsb3dOb251bmlxdWVSZXN1bHQnICkgKSApICkgKSB8ICh7Li4ufT8gPT4gKCAoey4uLn0/ID0+ICggKGx2X21hcmtlclBhdGhfMTZfMD0gcnVsZURhdGFJbnRlcmNoYW5nZU1hcmtlclBhdGggKSApICkgKSApICkqICkgKSApICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE0MTA6MjogKCAoKSBvdGhlcmx2XzE9ICdmb3InICggKG90aGVybHZfMj0gUlVMRV9JRCApICkgb3RoZXJsdl8zPSAnb24nICggKG90aGVybHZfND0gUlVMRV9JRCApICkgKG90aGVybHZfNT0gJ2NyZWF0ZU9uJyAoIChsdl9lbGVtZW50TWFwXzZfMD0gUlVMRV9TVFJJTkcgKSApICk/IG90aGVybHZfNz0gJ3dpdGgnICggKG90aGVybHZfOD0gUlVMRV9JRCApICkgKCAoIChsdl9jYWNoZWRfOV8wPSAnY2FjaGVTaXplJyApICkgKCAobHZfY2FjaGVTaXplXzEwXzA9IFJVTEVfSU5UICkgKSApPyAob3RoZXJsdl8xMT0gJ21hcFRvJyAoIChsdl9kYXRhTWFwXzEyXzA9IFJVTEVfU1RSSU5HICkgKSApPyAoICggKCAoICh7Li4ufT8gPT4gKCAoey4uLn0/ID0+ICggKGx2X2FsbG93Tm9SZXN1bHRfMTRfMD0gJ2FsbG93Tm9SZXN1bHQnICkgKSApICkgKSB8ICh7Li4ufT8gPT4gKCAoey4uLn0/ID0+ICggKGx2X2FsbG93Tm9udW5pcXVlUmVzdWx0XzE1XzA9ICdhbGxvd05vbnVuaXF1ZVJlc3VsdCcgKSApICkgKSApIHwgKHsuLi59PyA9PiAoICh7Li4ufT8gPT4gKCAobHZfbWFya2VyUGF0aF8xNl8wPSBydWxlRGF0YUludGVyY2hhbmdlTWFya2VyUGF0aCApICkgKSApICkgKSogKSApICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTQxMTozOiAoKSBvdGhlcmx2XzE9ICdmb3InICggKG90aGVybHZfMj0gUlVMRV9JRCApICkgb3RoZXJsdl8zPSAnb24nICggKG90aGVybHZfND0gUlVMRV9JRCApICkgKG90aGVybHZfNT0gJ2NyZWF0ZU9uJyAoIChsdl9lbGVtZW50TWFwXzZfMD0gUlVMRV9TVFJJTkcgKSApICk/IG90aGVybHZfNz0gJ3dpdGgnICggKG90aGVybHZfOD0gUlVMRV9JRCApICkgKCAoIChsdl9jYWNoZWRfOV8wPSAnY2FjaGVTaXplJyApICkgKCAobHZfY2FjaGVTaXplXzEwXzA9IFJVTEVfSU5UICkgKSApPyAob3RoZXJsdl8xMT0gJ21hcFRvJyAoIChsdl9kYXRhTWFwXzEyXzA9IFJVTEVfU1RSSU5HICkgKSApPyAoICggKCAoICh7Li4ufT8gPT4gKCAoey4uLn0/ID0+ICggKGx2X2FsbG93Tm9SZXN1bHRfMTRfMD0gJ2FsbG93Tm9SZXN1bHQnICkgKSApICkgKSB8ICh7Li4ufT8gPT4gKCAoey4uLn0/ID0+ICggKGx2X2FsbG93Tm9udW5pcXVlUmVzdWx0XzE1XzA9ICdhbGxvd05vbnVuaXF1ZVJlc3VsdCcgKSApICkgKSApIHwgKHsuLi59PyA9PiAoICh7Li4ufT8gPT4gKCAobHZfbWFya2VyUGF0aF8xNl8wPSBydWxlRGF0YUludGVyY2hhbmdlTWFya2VyUGF0aCApICkgKSApICkgKSogKSApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE1MTk6MjogKCAoKSBvdGhlcmx2XzE9ICdmb3InICggKG90aGVybHZfMj0gUlVMRV9JRCApICkgb3RoZXJsdl8zPSAnb24nICggKG90aGVybHZfND0gUlVMRV9JRCApICkgKG90aGVybHZfNT0gJ2NyZWF0ZU9uJyAoIChsdl9lbGVtZW50TWFwXzZfMD0gUlVMRV9TVFJJTkcgKSApICk/IG90aGVybHZfNz0gJ3dpdGgnICggKG90aGVybHZfOD0gUlVMRV9JRCApICkgKCAoIChsdl9jYWNoZWRfOV8wPSAnY2FjaGVTaXplJyApICkgKCAobHZfY2FjaGVTaXplXzEwXzA9IFJVTEVfSU5UICkgKSApPyAob3RoZXJsdl8xMT0gJ21hcFRvJyAoIChsdl9kYXRhTWFwXzEyXzA9IFJVTEVfU1RSSU5HICkgKSApPyAoICggKCAoICh7Li4ufT8gPT4gKCAoey4uLn0/ID0+ICggKGx2X2FsbG93Tm9SZXN1bHRfMTRfMD0gJ2FsbG93Tm9SZXN1bHQnICkgKSApICkgKSB8ICh7Li4ufT8gPT4gKCAoey4uLn0/ID0+ICggKGx2X2FsbG93Tm9udW5pcXVlUmVzdWx0XzE1XzA9ICdhbGxvd05vbnVuaXF1ZVJlc3VsdCcgKSApICkgKSApIHwgKHsuLi59PyA9PiAoICh7Li4ufT8gPT4gKCAobHZfbWFya2VyUGF0aF8xNl8wPSBydWxlRGF0YUludGVyY2hhbmdlTWFya2VyUGF0aCApICkgKSApICkgKSogKSApICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTUyMDozOiAoKSBvdGhlcmx2XzE9ICdmb3InICggKG90aGVybHZfMj0gUlVMRV9JRCApICkgb3RoZXJsdl8zPSAnb24nICggKG90aGVybHZfND0gUlVMRV9JRCApICkgKG90aGVybHZfNT0gJ2NyZWF0ZU9uJyAoIChsdl9lbGVtZW50TWFwXzZfMD0gUlVMRV9TVFJJTkcgKSApICk/IG90aGVybHZfNz0gJ3dpdGgnICggKG90aGVybHZfOD0gUlVMRV9JRCApICkgKCAoIChsdl9jYWNoZWRfOV8wPSAnY2FjaGVTaXplJyApICkgKCAobHZfY2FjaGVTaXplXzEwXzA9IFJVTEVfSU5UICkgKSApPyAob3RoZXJsdl8xMT0gJ21hcFRvJyAoIChsdl9kYXRhTWFwXzEyXzA9IFJVTEVfU1RSSU5HICkgKSApPyAoICggKCAoICh7Li4ufT8gPT4gKCAoey4uLn0/ID0+ICggKGx2X2FsbG93Tm9SZXN1bHRfMTRfMD0gJ2FsbG93Tm9SZXN1bHQnICkgKSApICkgKSB8ICh7Li4ufT8gPT4gKCAoey4uLn0/ID0+ICggKGx2X2FsbG93Tm9udW5pcXVlUmVzdWx0XzE1XzA9ICdhbGxvd05vbnVuaXF1ZVJlc3VsdCcgKSApICkgKSApIHwgKHsuLi59PyA9PiAoICh7Li4ufT8gPT4gKCAobHZfbWFya2VyUGF0aF8xNl8wPSBydWxlRGF0YUludGVyY2hhbmdlTWFya2VyUGF0aCApICkgKSApICkgKSogKSApICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE0MTE6MzogKCkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE0MTI6NDogCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNTIwOjM6ICgpCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNTIxOjQ6IAogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAKQEAgLTM4MDIsMTcgKzQwOTIsMTcgQEAKIAogICAgICAgICAgICAgfQogCi0gICAgICAgICAgICBvdGhlcmx2XzE9KFRva2VuKW1hdGNoKGlucHV0LDQ2LEZPTExPV180KTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7CisgICAgICAgICAgICBvdGhlcmx2XzE9KFRva2VuKW1hdGNoKGlucHV0LDUwLEZPTExPV180KTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKIAogICAgICAgICAgICAgICAJCQluZXdMZWFmTm9kZShvdGhlcmx2XzEsIGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YUludGVyY2hhbmdlTG9va3VwQWNjZXNzKCkuZ2V0Rm9yS2V5d29yZF8xKCkpOwogICAgICAgICAgICAgICAJCQogICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTQyMjozOiAoIChvdGhlcmx2XzI9IFJVTEVfSUQgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNDIzOjQ6IChvdGhlcmx2XzI9IFJVTEVfSUQgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTUzMTozOiAoIChvdGhlcmx2XzI9IFJVTEVfSUQgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNTMyOjQ6IChvdGhlcmx2XzI9IFJVTEVfSUQgKQogICAgICAgICAgICAgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTQyMzo0OiAob3RoZXJsdl8yPSBSVUxFX0lEICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE0MjQ6NTogb3RoZXJsdl8yPSBSVUxFX0lECisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNTMyOjQ6IChvdGhlcmx2XzI9IFJVTEVfSUQgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTUzMzo1OiBvdGhlcmx2XzI9IFJVTEVfSUQKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogCkBAIC0zODIxLDcgKzQxMTEsNyBAQAogICAgICAgICAgICAgICAJCQkJCX0KICAgICAgICAgICAgICAgCQkJCQogICAgICAgICAgICAgfQotICAgICAgICAgICAgb3RoZXJsdl8yPShUb2tlbiltYXRjaChpbnB1dCxSVUxFX0lELEZPTExPV18zNSk7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OworICAgICAgICAgICAgb3RoZXJsdl8yPShUb2tlbiltYXRjaChpbnB1dCxSVUxFX0lELEZPTExPV180Mik7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OwogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAKICAgICAgICAgICAgICAgCQkJCQluZXdMZWFmTm9kZShvdGhlcmx2XzIsIGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YUludGVyY2hhbmdlTG9va3VwQWNjZXNzKCkuZ2V0VGFyZ2V0UHJvcGVydHlMRW50aXR5UmVmZXJlbmNlQ3Jvc3NSZWZlcmVuY2VfMl8wKCkpOwpAQCAtMzgzMywxNyArNDEyMywxNyBAQAogCiAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgIG90aGVybHZfMz0oVG9rZW4pbWF0Y2goaW5wdXQsNDcsRk9MTE9XXzQpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gY3VycmVudDsKKyAgICAgICAgICAgIG90aGVybHZfMz0oVG9rZW4pbWF0Y2goaW5wdXQsNTEsRk9MTE9XXzQpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gY3VycmVudDsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogCiAgICAgICAgICAgICAgIAkJCW5ld0xlYWZOb2RlKG90aGVybHZfMywgZ3JhbW1hckFjY2Vzcy5nZXREYXRhSW50ZXJjaGFuZ2VMb29rdXBBY2Nlc3MoKS5nZXRPbktleXdvcmRfMygpKTsKICAgICAgICAgICAgICAgCQkKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE0Mzk6MzogKCAob3RoZXJsdl80PSBSVUxFX0lEICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTQ0MDo0OiAob3RoZXJsdl80PSBSVUxFX0lEICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE1NDg6MzogKCAob3RoZXJsdl80PSBSVUxFX0lEICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTU0OTo0OiAob3RoZXJsdl80PSBSVUxFX0lEICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE0NDA6NDogKG90aGVybHZfND0gUlVMRV9JRCApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNDQxOjU6IG90aGVybHZfND0gUlVMRV9JRAorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTU0OTo0OiAob3RoZXJsdl80PSBSVUxFX0lEICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE1NTA6NTogb3RoZXJsdl80PSBSVUxFX0lECiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKIApAQCAtMzg1Miw3ICs0MTQyLDcgQEAKICAgICAgICAgICAgICAgCQkJCQl9CiAgICAgICAgICAgICAgIAkJCQkKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG90aGVybHZfND0oVG9rZW4pbWF0Y2goaW5wdXQsUlVMRV9JRCxGT0xMT1dfMzYpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gY3VycmVudDsKKyAgICAgICAgICAgIG90aGVybHZfND0oVG9rZW4pbWF0Y2goaW5wdXQsUlVMRV9JRCxGT0xMT1dfNDMpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gY3VycmVudDsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogCiAgICAgICAgICAgICAgIAkJCQkJbmV3TGVhZk5vZGUob3RoZXJsdl80LCBncmFtbWFyQWNjZXNzLmdldERhdGFJbnRlcmNoYW5nZUxvb2t1cEFjY2VzcygpLmdldEVudGl0eUxFbnRpdHlDcm9zc1JlZmVyZW5jZV80XzAoKSk7CkBAIC0zODY0LDMwICs0MTU0LDMwIEBACiAKICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTQ1MjozOiAob3RoZXJsdl81PSAnY3JlYXRlT24nICggKGx2X2VsZW1lbnRNYXBfNl8wPSBSVUxFX1NUUklORyApICkgKT8KLSAgICAgICAgICAgIGludCBhbHQyOD0yOwotICAgICAgICAgICAgaW50IExBMjhfMCA9IGlucHV0LkxBKDEpOworICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTU2MTozOiAob3RoZXJsdl81PSAnY3JlYXRlT24nICggKGx2X2VsZW1lbnRNYXBfNl8wPSBSVUxFX1NUUklORyApICkgKT8KKyAgICAgICAgICAgIGludCBhbHQzMz0yOworICAgICAgICAgICAgaW50IExBMzNfMCA9IGlucHV0LkxBKDEpOwogCi0gICAgICAgICAgICBpZiAoIChMQTI4XzA9PTM4KSApIHsKLSAgICAgICAgICAgICAgICBhbHQyOD0xOworICAgICAgICAgICAgaWYgKCAoTEEzM18wPT0zOSkgKSB7CisgICAgICAgICAgICAgICAgYWx0MzM9MTsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHN3aXRjaCAoYWx0MjgpIHsKKyAgICAgICAgICAgIHN3aXRjaCAoYWx0MzMpIHsKICAgICAgICAgICAgICAgICBjYXNlIDEgOgotICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNDUzOjQ6IG90aGVybHZfNT0gJ2NyZWF0ZU9uJyAoIChsdl9lbGVtZW50TWFwXzZfMD0gUlVMRV9TVFJJTkcgKSApCisgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE1NjI6NDogb3RoZXJsdl81PSAnY3JlYXRlT24nICggKGx2X2VsZW1lbnRNYXBfNl8wPSBSVUxFX1NUUklORyApICkKICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBvdGhlcmx2XzU9KFRva2VuKW1hdGNoKGlucHV0LDM4LEZPTExPV182KTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7CisgICAgICAgICAgICAgICAgICAgIG90aGVybHZfNT0oVG9rZW4pbWF0Y2goaW5wdXQsMzksRk9MTE9XXzYpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gY3VycmVudDsKICAgICAgICAgICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAKICAgICAgICAgICAgICAgICAgICAgICAJCQkJbmV3TGVhZk5vZGUob3RoZXJsdl81LCBncmFtbWFyQWNjZXNzLmdldERhdGFJbnRlcmNoYW5nZUxvb2t1cEFjY2VzcygpLmdldENyZWF0ZU9uS2V5d29yZF81XzAoKSk7CiAgICAgICAgICAgICAgICAgICAgICAgCQkJCiAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTQ1Nzo0OiAoIChsdl9lbGVtZW50TWFwXzZfMD0gUlVMRV9TVFJJTkcgKSApCi0gICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE0NTg6NTogKGx2X2VsZW1lbnRNYXBfNl8wPSBSVUxFX1NUUklORyApCisgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE1NjY6NDogKCAobHZfZWxlbWVudE1hcF82XzA9IFJVTEVfU1RSSU5HICkgKQorICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNTY3OjU6IChsdl9lbGVtZW50TWFwXzZfMD0gUlVMRV9TVFJJTkcgKQogICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE0NTg6NTogKGx2X2VsZW1lbnRNYXBfNl8wPSBSVUxFX1NUUklORyApCi0gICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE0NTk6NjogbHZfZWxlbWVudE1hcF82XzA9IFJVTEVfU1RSSU5HCisgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE1Njc6NTogKGx2X2VsZW1lbnRNYXBfNl8wPSBSVUxFX1NUUklORyApCisgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE1Njg6NjogbHZfZWxlbWVudE1hcF82XzA9IFJVTEVfU1RSSU5HCiAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgbHZfZWxlbWVudE1hcF82XzA9KFRva2VuKW1hdGNoKGlucHV0LFJVTEVfU1RSSU5HLEZPTExPV18zNyk7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OworICAgICAgICAgICAgICAgICAgICBsdl9lbGVtZW50TWFwXzZfMD0oVG9rZW4pbWF0Y2goaW5wdXQsUlVMRV9TVFJJTkcsRk9MTE9XXzQ0KTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7CiAgICAgICAgICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogCiAgICAgICAgICAgICAgICAgICAgICAgCQkJCQkJbmV3TGVhZk5vZGUobHZfZWxlbWVudE1hcF82XzAsIGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YUludGVyY2hhbmdlTG9va3VwQWNjZXNzKCkuZ2V0RWxlbWVudE1hcFNUUklOR1Rlcm1pbmFsUnVsZUNhbGxfNV8xXzAoKSk7CkBAIC0zOTE3LDE3ICs0MjA3LDE3IEBACiAKICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgb3RoZXJsdl83PShUb2tlbiltYXRjaChpbnB1dCw0OCxGT0xMT1dfNCk7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OworICAgICAgICAgICAgb3RoZXJsdl83PShUb2tlbiltYXRjaChpbnB1dCw1MixGT0xMT1dfNCk7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OwogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAKICAgICAgICAgICAgICAgCQkJbmV3TGVhZk5vZGUob3RoZXJsdl83LCBncmFtbWFyQWNjZXNzLmdldERhdGFJbnRlcmNoYW5nZUxvb2t1cEFjY2VzcygpLmdldFdpdGhLZXl3b3JkXzYoKSk7CiAgICAgICAgICAgICAgIAkJCiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNDgwOjM6ICggKG90aGVybHZfOD0gUlVMRV9JRCApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE0ODE6NDogKG90aGVybHZfOD0gUlVMRV9JRCApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNTg5OjM6ICggKG90aGVybHZfOD0gUlVMRV9JRCApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE1OTA6NDogKG90aGVybHZfOD0gUlVMRV9JRCApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNDgxOjQ6IChvdGhlcmx2Xzg9IFJVTEVfSUQgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTQ4Mjo1OiBvdGhlcmx2Xzg9IFJVTEVfSUQKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE1OTA6NDogKG90aGVybHZfOD0gUlVMRV9JRCApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNTkxOjU6IG90aGVybHZfOD0gUlVMRV9JRAogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAKQEAgLTM5MzYsNyArNDIyNiw3IEBACiAgICAgICAgICAgICAgIAkJCQkJfQogICAgICAgICAgICAgICAJCQkJCiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBvdGhlcmx2Xzg9KFRva2VuKW1hdGNoKGlucHV0LFJVTEVfSUQsRk9MTE9XXzM4KTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7CisgICAgICAgICAgICBvdGhlcmx2Xzg9KFRva2VuKW1hdGNoKGlucHV0LFJVTEVfSUQsRk9MTE9XXzQ1KTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKIAogICAgICAgICAgICAgICAJCQkJCW5ld0xlYWZOb2RlKG90aGVybHZfOCwgZ3JhbW1hckFjY2Vzcy5nZXREYXRhSW50ZXJjaGFuZ2VMb29rdXBBY2Nlc3MoKS5nZXRRdWVyeVByb3BlcnR5TEVudGl0eUF0dHJpYnV0ZUNyb3NzUmVmZXJlbmNlXzdfMCgpKTsKQEAgLTM5NDgsMjQgKzQyMzgsMjQgQEAKIAogICAgICAgICAgICAgfQogCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNDkzOjM6ICggKCAobHZfY2FjaGVkXzlfMD0gJ2NhY2hlU2l6ZScgKSApICggKGx2X2NhY2hlU2l6ZV8xMF8wPSBSVUxFX0lOVCApICkgKT8KLSAgICAgICAgICAgIGludCBhbHQyOT0yOwotICAgICAgICAgICAgaW50IExBMjlfMCA9IGlucHV0LkxBKDEpOworICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTYwMjozOiAoICggKGx2X2NhY2hlZF85XzA9ICdjYWNoZVNpemUnICkgKSAoIChsdl9jYWNoZVNpemVfMTBfMD0gUlVMRV9JTlQgKSApICk/CisgICAgICAgICAgICBpbnQgYWx0MzQ9MjsKKyAgICAgICAgICAgIGludCBMQTM0XzAgPSBpbnB1dC5MQSgxKTsKIAotICAgICAgICAgICAgaWYgKCAoTEEyOV8wPT00OSkgKSB7Ci0gICAgICAgICAgICAgICAgYWx0Mjk9MTsKKyAgICAgICAgICAgIGlmICggKExBMzRfMD09NTMpICkgeworICAgICAgICAgICAgICAgIGFsdDM0PTE7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBzd2l0Y2ggKGFsdDI5KSB7CisgICAgICAgICAgICBzd2l0Y2ggKGFsdDM0KSB7CiAgICAgICAgICAgICAgICAgY2FzZSAxIDoKLSAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTQ5NDo0OiAoIChsdl9jYWNoZWRfOV8wPSAnY2FjaGVTaXplJyApICkgKCAobHZfY2FjaGVTaXplXzEwXzA9IFJVTEVfSU5UICkgKQorICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNjAzOjQ6ICggKGx2X2NhY2hlZF85XzA9ICdjYWNoZVNpemUnICkgKSAoIChsdl9jYWNoZVNpemVfMTBfMD0gUlVMRV9JTlQgKSApCiAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTQ5NDo0OiAoIChsdl9jYWNoZWRfOV8wPSAnY2FjaGVTaXplJyApICkKLSAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTQ5NTo1OiAobHZfY2FjaGVkXzlfMD0gJ2NhY2hlU2l6ZScgKQorICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNjAzOjQ6ICggKGx2X2NhY2hlZF85XzA9ICdjYWNoZVNpemUnICkgKQorICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNjA0OjU6IChsdl9jYWNoZWRfOV8wPSAnY2FjaGVTaXplJyApCiAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTQ5NTo1OiAobHZfY2FjaGVkXzlfMD0gJ2NhY2hlU2l6ZScgKQotICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNDk2OjY6IGx2X2NhY2hlZF85XzA9ICdjYWNoZVNpemUnCisgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE2MDQ6NTogKGx2X2NhY2hlZF85XzA9ICdjYWNoZVNpemUnICkKKyAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTYwNTo2OiBsdl9jYWNoZWRfOV8wPSAnY2FjaGVTaXplJwogICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGx2X2NhY2hlZF85XzA9KFRva2VuKW1hdGNoKGlucHV0LDQ5LEZPTExPV18xMyk7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OworICAgICAgICAgICAgICAgICAgICBsdl9jYWNoZWRfOV8wPShUb2tlbiltYXRjaChpbnB1dCw1MyxGT0xMT1dfMTMpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gY3VycmVudDsKICAgICAgICAgICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAKICAgICAgICAgICAgICAgICAgICAgICAJCQkJCQluZXdMZWFmTm9kZShsdl9jYWNoZWRfOV8wLCBncmFtbWFyQWNjZXNzLmdldERhdGFJbnRlcmNoYW5nZUxvb2t1cEFjY2VzcygpLmdldENhY2hlZENhY2hlU2l6ZUtleXdvcmRfOF8wXzAoKSk7CkBAIC0zOTg1LDEzICs0Mjc1LDEzIEBACiAKICAgICAgICAgICAgICAgICAgICAgfQogCi0gICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE1MDg6NDogKCAobHZfY2FjaGVTaXplXzEwXzA9IFJVTEVfSU5UICkgKQotICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNTA5OjU6IChsdl9jYWNoZVNpemVfMTBfMD0gUlVMRV9JTlQgKQorICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNjE3OjQ6ICggKGx2X2NhY2hlU2l6ZV8xMF8wPSBSVUxFX0lOVCApICkKKyAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTYxODo1OiAobHZfY2FjaGVTaXplXzEwXzA9IFJVTEVfSU5UICkKICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNTA5OjU6IChsdl9jYWNoZVNpemVfMTBfMD0gUlVMRV9JTlQgKQotICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNTEwOjY6IGx2X2NhY2hlU2l6ZV8xMF8wPSBSVUxFX0lOVAorICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNjE4OjU6IChsdl9jYWNoZVNpemVfMTBfMD0gUlVMRV9JTlQgKQorICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNjE5OjY6IGx2X2NhY2hlU2l6ZV8xMF8wPSBSVUxFX0lOVAogICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGx2X2NhY2hlU2l6ZV8xMF8wPShUb2tlbiltYXRjaChpbnB1dCxSVUxFX0lOVCxGT0xMT1dfMzkpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gY3VycmVudDsKKyAgICAgICAgICAgICAgICAgICAgbHZfY2FjaGVTaXplXzEwXzA9KFRva2VuKW1hdGNoKGlucHV0LFJVTEVfSU5ULEZPTExPV180Nik7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OwogICAgICAgICAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKIAogICAgICAgICAgICAgICAgICAgICAgIAkJCQkJCW5ld0xlYWZOb2RlKGx2X2NhY2hlU2l6ZV8xMF8wLCBncmFtbWFyQWNjZXNzLmdldERhdGFJbnRlcmNoYW5nZUxvb2t1cEFjY2VzcygpLmdldENhY2hlU2l6ZUlOVFRlcm1pbmFsUnVsZUNhbGxfOF8xXzAoKSk7CkBAIC00MDIxLDMwICs0MzExLDMwIEBACiAKICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTUyNzozOiAob3RoZXJsdl8xMT0gJ21hcFRvJyAoIChsdl9kYXRhTWFwXzEyXzA9IFJVTEVfU1RSSU5HICkgKSApPwotICAgICAgICAgICAgaW50IGFsdDMwPTI7Ci0gICAgICAgICAgICBpbnQgTEEzMF8wID0gaW5wdXQuTEEoMSk7CisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNjM2OjM6IChvdGhlcmx2XzExPSAnbWFwVG8nICggKGx2X2RhdGFNYXBfMTJfMD0gUlVMRV9TVFJJTkcgKSApICk/CisgICAgICAgICAgICBpbnQgYWx0MzU9MjsKKyAgICAgICAgICAgIGludCBMQTM1XzAgPSBpbnB1dC5MQSgxKTsKIAotICAgICAgICAgICAgaWYgKCAoTEEzMF8wPT01MCkgKSB7Ci0gICAgICAgICAgICAgICAgYWx0MzA9MTsKKyAgICAgICAgICAgIGlmICggKExBMzVfMD09NTQpICkgeworICAgICAgICAgICAgICAgIGFsdDM1PTE7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBzd2l0Y2ggKGFsdDMwKSB7CisgICAgICAgICAgICBzd2l0Y2ggKGFsdDM1KSB7CiAgICAgICAgICAgICAgICAgY2FzZSAxIDoKLSAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTUyODo0OiBvdGhlcmx2XzExPSAnbWFwVG8nICggKGx2X2RhdGFNYXBfMTJfMD0gUlVMRV9TVFJJTkcgKSApCisgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE2Mzc6NDogb3RoZXJsdl8xMT0gJ21hcFRvJyAoIChsdl9kYXRhTWFwXzEyXzA9IFJVTEVfU1RSSU5HICkgKQogICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIG90aGVybHZfMTE9KFRva2VuKW1hdGNoKGlucHV0LDUwLEZPTExPV182KTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7CisgICAgICAgICAgICAgICAgICAgIG90aGVybHZfMTE9KFRva2VuKW1hdGNoKGlucHV0LDU0LEZPTExPV182KTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7CiAgICAgICAgICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogCiAgICAgICAgICAgICAgICAgICAgICAgCQkJCW5ld0xlYWZOb2RlKG90aGVybHZfMTEsIGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YUludGVyY2hhbmdlTG9va3VwQWNjZXNzKCkuZ2V0TWFwVG9LZXl3b3JkXzlfMCgpKTsKICAgICAgICAgICAgICAgICAgICAgICAJCQkKICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNTMyOjQ6ICggKGx2X2RhdGFNYXBfMTJfMD0gUlVMRV9TVFJJTkcgKSApCi0gICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE1MzM6NTogKGx2X2RhdGFNYXBfMTJfMD0gUlVMRV9TVFJJTkcgKQorICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNjQxOjQ6ICggKGx2X2RhdGFNYXBfMTJfMD0gUlVMRV9TVFJJTkcgKSApCisgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE2NDI6NTogKGx2X2RhdGFNYXBfMTJfMD0gUlVMRV9TVFJJTkcgKQogICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE1MzM6NTogKGx2X2RhdGFNYXBfMTJfMD0gUlVMRV9TVFJJTkcgKQotICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNTM0OjY6IGx2X2RhdGFNYXBfMTJfMD0gUlVMRV9TVFJJTkcKKyAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTY0Mjo1OiAobHZfZGF0YU1hcF8xMl8wPSBSVUxFX1NUUklORyApCisgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE2NDM6NjogbHZfZGF0YU1hcF8xMl8wPSBSVUxFX1NUUklORwogICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGx2X2RhdGFNYXBfMTJfMD0oVG9rZW4pbWF0Y2goaW5wdXQsUlVMRV9TVFJJTkcsRk9MTE9XXzQwKTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7CisgICAgICAgICAgICAgICAgICAgIGx2X2RhdGFNYXBfMTJfMD0oVG9rZW4pbWF0Y2goaW5wdXQsUlVMRV9TVFJJTkcsRk9MTE9XXzQ3KTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7CiAgICAgICAgICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogCiAgICAgICAgICAgICAgICAgICAgICAgCQkJCQkJbmV3TGVhZk5vZGUobHZfZGF0YU1hcF8xMl8wLCBncmFtbWFyQWNjZXNzLmdldERhdGFJbnRlcmNoYW5nZUxvb2t1cEFjY2VzcygpLmdldERhdGFNYXBTVFJJTkdUZXJtaW5hbFJ1bGVDYWxsXzlfMV8wKCkpOwpAQCAtNDA3NCw2MiArNDM2NCw2MiBAQAogCiAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE1NTE6MzogKCAoICggKCAoey4uLn0/ID0+ICggKHsuLi59PyA9PiAoIChsdl9hbGxvd05vUmVzdWx0XzE0XzA9ICdhbGxvd05vUmVzdWx0JyApICkgKSApICkgfCAoey4uLn0/ID0+ICggKHsuLi59PyA9PiAoIChsdl9hbGxvd05vbnVuaXF1ZVJlc3VsdF8xNV8wPSAnYWxsb3dOb251bmlxdWVSZXN1bHQnICkgKSApICkgKSB8ICh7Li4ufT8gPT4gKCAoey4uLn0/ID0+ICggKGx2X21hcmtlclBhdGhfMTZfMD0gcnVsZURhdGFJbnRlcmNoYW5nZU1hcmtlclBhdGggKSApICkgKSApICkqICkgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNTUyOjQ6ICggKCAoICh7Li4ufT8gPT4gKCAoey4uLn0/ID0+ICggKGx2X2FsbG93Tm9SZXN1bHRfMTRfMD0gJ2FsbG93Tm9SZXN1bHQnICkgKSApICkgKSB8ICh7Li4ufT8gPT4gKCAoey4uLn0/ID0+ICggKGx2X2FsbG93Tm9udW5pcXVlUmVzdWx0XzE1XzA9ICdhbGxvd05vbnVuaXF1ZVJlc3VsdCcgKSApICkgKSApIHwgKHsuLi59PyA9PiAoICh7Li4ufT8gPT4gKCAobHZfbWFya2VyUGF0aF8xNl8wPSBydWxlRGF0YUludGVyY2hhbmdlTWFya2VyUGF0aCApICkgKSApICkgKSogKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNjYwOjM6ICggKCAoICggKHsuLi59PyA9PiAoICh7Li4ufT8gPT4gKCAobHZfYWxsb3dOb1Jlc3VsdF8xNF8wPSAnYWxsb3dOb1Jlc3VsdCcgKSApICkgKSApIHwgKHsuLi59PyA9PiAoICh7Li4ufT8gPT4gKCAobHZfYWxsb3dOb251bmlxdWVSZXN1bHRfMTVfMD0gJ2FsbG93Tm9udW5pcXVlUmVzdWx0JyApICkgKSApICkgfCAoey4uLn0/ID0+ICggKHsuLi59PyA9PiAoIChsdl9tYXJrZXJQYXRoXzE2XzA9IHJ1bGVEYXRhSW50ZXJjaGFuZ2VNYXJrZXJQYXRoICkgKSApICkgKSApKiApICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTY2MTo0OiAoICggKCAoey4uLn0/ID0+ICggKHsuLi59PyA9PiAoIChsdl9hbGxvd05vUmVzdWx0XzE0XzA9ICdhbGxvd05vUmVzdWx0JyApICkgKSApICkgfCAoey4uLn0/ID0+ICggKHsuLi59PyA9PiAoIChsdl9hbGxvd05vbnVuaXF1ZVJlc3VsdF8xNV8wPSAnYWxsb3dOb251bmlxdWVSZXN1bHQnICkgKSApICkgKSB8ICh7Li4ufT8gPT4gKCAoey4uLn0/ID0+ICggKGx2X21hcmtlclBhdGhfMTZfMD0gcnVsZURhdGFJbnRlcmNoYW5nZU1hcmtlclBhdGggKSApICkgKSApICkqICkgKQogICAgICAgICAgICAgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTU1Mjo0OiAoICggKCAoey4uLn0/ID0+ICggKHsuLi59PyA9PiAoIChsdl9hbGxvd05vUmVzdWx0XzE0XzA9ICdhbGxvd05vUmVzdWx0JyApICkgKSApICkgfCAoey4uLn0/ID0+ICggKHsuLi59PyA9PiAoIChsdl9hbGxvd05vbnVuaXF1ZVJlc3VsdF8xNV8wPSAnYWxsb3dOb251bmlxdWVSZXN1bHQnICkgKSApICkgKSB8ICh7Li4ufT8gPT4gKCAoey4uLn0/ID0+ICggKGx2X21hcmtlclBhdGhfMTZfMD0gcnVsZURhdGFJbnRlcmNoYW5nZU1hcmtlclBhdGggKSApICkgKSApICkqICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTU1Mzo1OiAoICggKHsuLi59PyA9PiAoICh7Li4ufT8gPT4gKCAobHZfYWxsb3dOb1Jlc3VsdF8xNF8wPSAnYWxsb3dOb1Jlc3VsdCcgKSApICkgKSApIHwgKHsuLi59PyA9PiAoICh7Li4ufT8gPT4gKCAobHZfYWxsb3dOb251bmlxdWVSZXN1bHRfMTVfMD0gJ2FsbG93Tm9udW5pcXVlUmVzdWx0JyApICkgKSApICkgfCAoey4uLn0/ID0+ICggKHsuLi59PyA9PiAoIChsdl9tYXJrZXJQYXRoXzE2XzA9IHJ1bGVEYXRhSW50ZXJjaGFuZ2VNYXJrZXJQYXRoICkgKSApICkgKSApKiApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNjYxOjQ6ICggKCAoICh7Li4ufT8gPT4gKCAoey4uLn0/ID0+ICggKGx2X2FsbG93Tm9SZXN1bHRfMTRfMD0gJ2FsbG93Tm9SZXN1bHQnICkgKSApICkgKSB8ICh7Li4ufT8gPT4gKCAoey4uLn0/ID0+ICggKGx2X2FsbG93Tm9udW5pcXVlUmVzdWx0XzE1XzA9ICdhbGxvd05vbnVuaXF1ZVJlc3VsdCcgKSApICkgKSApIHwgKHsuLi59PyA9PiAoICh7Li4ufT8gPT4gKCAobHZfbWFya2VyUGF0aF8xNl8wPSBydWxlRGF0YUludGVyY2hhbmdlTWFya2VyUGF0aCApICkgKSApICkgKSogKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNjYyOjU6ICggKCAoey4uLn0/ID0+ICggKHsuLi59PyA9PiAoIChsdl9hbGxvd05vUmVzdWx0XzE0XzA9ICdhbGxvd05vUmVzdWx0JyApICkgKSApICkgfCAoey4uLn0/ID0+ICggKHsuLi59PyA9PiAoIChsdl9hbGxvd05vbnVuaXF1ZVJlc3VsdF8xNV8wPSAnYWxsb3dOb251bmlxdWVSZXN1bHQnICkgKSApICkgKSB8ICh7Li4ufT8gPT4gKCAoey4uLn0/ID0+ICggKGx2X21hcmtlclBhdGhfMTZfMD0gcnVsZURhdGFJbnRlcmNoYW5nZU1hcmtlclBhdGggKSApICkgKSApICkqICkKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGdldFVub3JkZXJlZEdyb3VwSGVscGVyKCkuZW50ZXIoZ3JhbW1hckFjY2Vzcy5nZXREYXRhSW50ZXJjaGFuZ2VMb29rdXBBY2Nlc3MoKS5nZXRVbm9yZGVyZWRHcm91cF8xMCgpKTsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE1NTY6NTogKCAoICh7Li4ufT8gPT4gKCAoey4uLn0/ID0+ICggKGx2X2FsbG93Tm9SZXN1bHRfMTRfMD0gJ2FsbG93Tm9SZXN1bHQnICkgKSApICkgKSB8ICh7Li4ufT8gPT4gKCAoey4uLn0/ID0+ICggKGx2X2FsbG93Tm9udW5pcXVlUmVzdWx0XzE1XzA9ICdhbGxvd05vbnVuaXF1ZVJlc3VsdCcgKSApICkgKSApIHwgKHsuLi59PyA9PiAoICh7Li4ufT8gPT4gKCAobHZfbWFya2VyUGF0aF8xNl8wPSBydWxlRGF0YUludGVyY2hhbmdlTWFya2VyUGF0aCApICkgKSApICkgKSogKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTU1Nzo2OiAoICh7Li4ufT8gPT4gKCAoey4uLn0/ID0+ICggKGx2X2FsbG93Tm9SZXN1bHRfMTRfMD0gJ2FsbG93Tm9SZXN1bHQnICkgKSApICkgKSB8ICh7Li4ufT8gPT4gKCAoey4uLn0/ID0+ICggKGx2X2FsbG93Tm9udW5pcXVlUmVzdWx0XzE1XzA9ICdhbGxvd05vbnVuaXF1ZVJlc3VsdCcgKSApICkgKSApIHwgKHsuLi59PyA9PiAoICh7Li4ufT8gPT4gKCAobHZfbWFya2VyUGF0aF8xNl8wPSBydWxlRGF0YUludGVyY2hhbmdlTWFya2VyUGF0aCApICkgKSApICkgKSoKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE2NjU6NTogKCAoICh7Li4ufT8gPT4gKCAoey4uLn0/ID0+ICggKGx2X2FsbG93Tm9SZXN1bHRfMTRfMD0gJ2FsbG93Tm9SZXN1bHQnICkgKSApICkgKSB8ICh7Li4ufT8gPT4gKCAoey4uLn0/ID0+ICggKGx2X2FsbG93Tm9udW5pcXVlUmVzdWx0XzE1XzA9ICdhbGxvd05vbnVuaXF1ZVJlc3VsdCcgKSApICkgKSApIHwgKHsuLi59PyA9PiAoICh7Li4ufT8gPT4gKCAobHZfbWFya2VyUGF0aF8xNl8wPSBydWxlRGF0YUludGVyY2hhbmdlTWFya2VyUGF0aCApICkgKSApICkgKSogKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTY2Njo2OiAoICh7Li4ufT8gPT4gKCAoey4uLn0/ID0+ICggKGx2X2FsbG93Tm9SZXN1bHRfMTRfMD0gJ2FsbG93Tm9SZXN1bHQnICkgKSApICkgKSB8ICh7Li4ufT8gPT4gKCAoey4uLn0/ID0+ICggKGx2X2FsbG93Tm9udW5pcXVlUmVzdWx0XzE1XzA9ICdhbGxvd05vbnVuaXF1ZVJlc3VsdCcgKSApICkgKSApIHwgKHsuLi59PyA9PiAoICh7Li4ufT8gPT4gKCAobHZfbWFya2VyUGF0aF8xNl8wPSBydWxlRGF0YUludGVyY2hhbmdlTWFya2VyUGF0aCApICkgKSApICkgKSoKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE1NTc6NjogKCAoey4uLn0/ID0+ICggKHsuLi59PyA9PiAoIChsdl9hbGxvd05vUmVzdWx0XzE0XzA9ICdhbGxvd05vUmVzdWx0JyApICkgKSApICkgfCAoey4uLn0/ID0+ICggKHsuLi59PyA9PiAoIChsdl9hbGxvd05vbnVuaXF1ZVJlc3VsdF8xNV8wPSAnYWxsb3dOb251bmlxdWVSZXN1bHQnICkgKSApICkgKSB8ICh7Li4ufT8gPT4gKCAoey4uLn0/ID0+ICggKGx2X21hcmtlclBhdGhfMTZfMD0gcnVsZURhdGFJbnRlcmNoYW5nZU1hcmtlclBhdGggKSApICkgKSApICkqCi0gICAgICAgICAgICBsb29wMzE6CisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNjY2OjY6ICggKHsuLi59PyA9PiAoICh7Li4ufT8gPT4gKCAobHZfYWxsb3dOb1Jlc3VsdF8xNF8wPSAnYWxsb3dOb1Jlc3VsdCcgKSApICkgKSApIHwgKHsuLi59PyA9PiAoICh7Li4ufT8gPT4gKCAobHZfYWxsb3dOb251bmlxdWVSZXN1bHRfMTVfMD0gJ2FsbG93Tm9udW5pcXVlUmVzdWx0JyApICkgKSApICkgfCAoey4uLn0/ID0+ICggKHsuLi59PyA9PiAoIChsdl9tYXJrZXJQYXRoXzE2XzA9IHJ1bGVEYXRhSW50ZXJjaGFuZ2VNYXJrZXJQYXRoICkgKSApICkgKSApKgorICAgICAgICAgICAgbG9vcDM2OgogICAgICAgICAgICAgZG8gewotICAgICAgICAgICAgICAgIGludCBhbHQzMT00OwotICAgICAgICAgICAgICAgIGludCBMQTMxXzAgPSBpbnB1dC5MQSgxKTsKKyAgICAgICAgICAgICAgICBpbnQgYWx0MzY9NDsKKyAgICAgICAgICAgICAgICBpbnQgTEEzNl8wID0gaW5wdXQuTEEoMSk7CiAKLSAgICAgICAgICAgICAgICBpZiAoIExBMzFfMCA9PSA1MSAmJiBnZXRVbm9yZGVyZWRHcm91cEhlbHBlcigpLmNhblNlbGVjdChncmFtbWFyQWNjZXNzLmdldERhdGFJbnRlcmNoYW5nZUxvb2t1cEFjY2VzcygpLmdldFVub3JkZXJlZEdyb3VwXzEwKCksIDApICkgewotICAgICAgICAgICAgICAgICAgICBhbHQzMT0xOworICAgICAgICAgICAgICAgIGlmICggTEEzNl8wID09IDU1ICYmIGdldFVub3JkZXJlZEdyb3VwSGVscGVyKCkuY2FuU2VsZWN0KGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YUludGVyY2hhbmdlTG9va3VwQWNjZXNzKCkuZ2V0VW5vcmRlcmVkR3JvdXBfMTAoKSwgMCkgKSB7CisgICAgICAgICAgICAgICAgICAgIGFsdDM2PTE7CiAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UgaWYgKCBMQTMxXzAgPT0gNTIgJiYgZ2V0VW5vcmRlcmVkR3JvdXBIZWxwZXIoKS5jYW5TZWxlY3QoZ3JhbW1hckFjY2Vzcy5nZXREYXRhSW50ZXJjaGFuZ2VMb29rdXBBY2Nlc3MoKS5nZXRVbm9yZGVyZWRHcm91cF8xMCgpLCAxKSApIHsKLSAgICAgICAgICAgICAgICAgICAgYWx0MzE9MjsKKyAgICAgICAgICAgICAgICBlbHNlIGlmICggTEEzNl8wID09IDU2ICYmIGdldFVub3JkZXJlZEdyb3VwSGVscGVyKCkuY2FuU2VsZWN0KGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YUludGVyY2hhbmdlTG9va3VwQWNjZXNzKCkuZ2V0VW5vcmRlcmVkR3JvdXBfMTAoKSwgMSkgKSB7CisgICAgICAgICAgICAgICAgICAgIGFsdDM2PTI7CiAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UgaWYgKCBMQTMxXzAgPT0gNTMgJiYgZ2V0VW5vcmRlcmVkR3JvdXBIZWxwZXIoKS5jYW5TZWxlY3QoZ3JhbW1hckFjY2Vzcy5nZXREYXRhSW50ZXJjaGFuZ2VMb29rdXBBY2Nlc3MoKS5nZXRVbm9yZGVyZWRHcm91cF8xMCgpLCAyKSApIHsKLSAgICAgICAgICAgICAgICAgICAgYWx0MzE9MzsKKyAgICAgICAgICAgICAgICBlbHNlIGlmICggTEEzNl8wID09IDU3ICYmIGdldFVub3JkZXJlZEdyb3VwSGVscGVyKCkuY2FuU2VsZWN0KGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YUludGVyY2hhbmdlTG9va3VwQWNjZXNzKCkuZ2V0VW5vcmRlcmVkR3JvdXBfMTAoKSwgMikgKSB7CisgICAgICAgICAgICAgICAgICAgIGFsdDM2PTM7CiAgICAgICAgICAgICAgICAgfQogCiAKLSAgICAgICAgICAgICAgICBzd2l0Y2ggKGFsdDMxKSB7CisgICAgICAgICAgICAgICAgc3dpdGNoIChhbHQzNikgewogICAgICAgICAgICAgCWNhc2UgMSA6Ci0gICAgICAgICAgICAJICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE1NTg6NDogKHsuLi59PyA9PiAoICh7Li4ufT8gPT4gKCAobHZfYWxsb3dOb1Jlc3VsdF8xNF8wPSAnYWxsb3dOb1Jlc3VsdCcgKSApICkgKSApCisgICAgICAgICAgICAJICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE2Njc6NDogKHsuLi59PyA9PiAoICh7Li4ufT8gPT4gKCAobHZfYWxsb3dOb1Jlc3VsdF8xNF8wPSAnYWxsb3dOb1Jlc3VsdCcgKSApICkgKSApCiAgICAgICAgICAgICAJICAgIHsKLSAgICAgICAgICAgIAkgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTU1ODo0OiAoey4uLn0/ID0+ICggKHsuLi59PyA9PiAoIChsdl9hbGxvd05vUmVzdWx0XzE0XzA9ICdhbGxvd05vUmVzdWx0JyApICkgKSApICkKLSAgICAgICAgICAgIAkgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTU1OTo1OiB7Li4ufT8gPT4gKCAoey4uLn0/ID0+ICggKGx2X2FsbG93Tm9SZXN1bHRfMTRfMD0gJ2FsbG93Tm9SZXN1bHQnICkgKSApICkKKyAgICAgICAgICAgIAkgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTY2Nzo0OiAoey4uLn0/ID0+ICggKHsuLi59PyA9PiAoIChsdl9hbGxvd05vUmVzdWx0XzE0XzA9ICdhbGxvd05vUmVzdWx0JyApICkgKSApICkKKyAgICAgICAgICAgIAkgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTY2ODo1OiB7Li4ufT8gPT4gKCAoey4uLn0/ID0+ICggKGx2X2FsbG93Tm9SZXN1bHRfMTRfMD0gJ2FsbG93Tm9SZXN1bHQnICkgKSApICkKICAgICAgICAgICAgIAkgICAgewogICAgICAgICAgICAgCSAgICBpZiAoICEgZ2V0VW5vcmRlcmVkR3JvdXBIZWxwZXIoKS5jYW5TZWxlY3QoZ3JhbW1hckFjY2Vzcy5nZXREYXRhSW50ZXJjaGFuZ2VMb29rdXBBY2Nlc3MoKS5nZXRVbm9yZGVyZWRHcm91cF8xMCgpLCAwKSApIHsKICAgICAgICAgICAgIAkgICAgICAgIGlmIChzdGF0ZS5iYWNrdHJhY2tpbmc+MCkge3N0YXRlLmZhaWxlZD10cnVlOyByZXR1cm4gY3VycmVudDt9CiAgICAgICAgICAgICAJICAgICAgICB0aHJvdyBuZXcgRmFpbGVkUHJlZGljYXRlRXhjZXB0aW9uKGlucHV0LCAicnVsZURhdGFJbnRlcmNoYW5nZUxvb2t1cCIsICJnZXRVbm9yZGVyZWRHcm91cEhlbHBlcigpLmNhblNlbGVjdChncmFtbWFyQWNjZXNzLmdldERhdGFJbnRlcmNoYW5nZUxvb2t1cEFjY2VzcygpLmdldFVub3JkZXJlZEdyb3VwXzEwKCksIDApIik7CiAgICAgICAgICAgICAJICAgIH0KLSAgICAgICAgICAgIAkgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTU1OToxMTk6ICggKHsuLi59PyA9PiAoIChsdl9hbGxvd05vUmVzdWx0XzE0XzA9ICdhbGxvd05vUmVzdWx0JyApICkgKSApCi0gICAgICAgICAgICAJICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE1NjA6NjogKHsuLi59PyA9PiAoIChsdl9hbGxvd05vUmVzdWx0XzE0XzA9ICdhbGxvd05vUmVzdWx0JyApICkgKQorICAgICAgICAgICAgCSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNjY4OjExOTogKCAoey4uLn0/ID0+ICggKGx2X2FsbG93Tm9SZXN1bHRfMTRfMD0gJ2FsbG93Tm9SZXN1bHQnICkgKSApICkKKyAgICAgICAgICAgIAkgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTY2OTo2OiAoey4uLn0/ID0+ICggKGx2X2FsbG93Tm9SZXN1bHRfMTRfMD0gJ2FsbG93Tm9SZXN1bHQnICkgKSApCiAgICAgICAgICAgICAJICAgIHsKICAgICAgICAgICAgIAkgICAgZ2V0VW5vcmRlcmVkR3JvdXBIZWxwZXIoKS5zZWxlY3QoZ3JhbW1hckFjY2Vzcy5nZXREYXRhSW50ZXJjaGFuZ2VMb29rdXBBY2Nlc3MoKS5nZXRVbm9yZGVyZWRHcm91cF8xMCgpLCAwKTsKLSAgICAgICAgICAgIAkgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTU2Mzo5OiAoey4uLn0/ID0+ICggKGx2X2FsbG93Tm9SZXN1bHRfMTRfMD0gJ2FsbG93Tm9SZXN1bHQnICkgKSApCi0gICAgICAgICAgICAJICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE1NjM6MTA6IHsuLi59PyA9PiAoIChsdl9hbGxvd05vUmVzdWx0XzE0XzA9ICdhbGxvd05vUmVzdWx0JyApICkKKyAgICAgICAgICAgIAkgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTY3Mjo5OiAoey4uLn0/ID0+ICggKGx2X2FsbG93Tm9SZXN1bHRfMTRfMD0gJ2FsbG93Tm9SZXN1bHQnICkgKSApCisgICAgICAgICAgICAJICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE2NzI6MTA6IHsuLi59PyA9PiAoIChsdl9hbGxvd05vUmVzdWx0XzE0XzA9ICdhbGxvd05vUmVzdWx0JyApICkKICAgICAgICAgICAgIAkgICAgewogICAgICAgICAgICAgCSAgICBpZiAoICEoKHRydWUpKSApIHsKICAgICAgICAgICAgIAkgICAgICAgIGlmIChzdGF0ZS5iYWNrdHJhY2tpbmc+MCkge3N0YXRlLmZhaWxlZD10cnVlOyByZXR1cm4gY3VycmVudDt9CiAgICAgICAgICAgICAJICAgICAgICB0aHJvdyBuZXcgRmFpbGVkUHJlZGljYXRlRXhjZXB0aW9uKGlucHV0LCAicnVsZURhdGFJbnRlcmNoYW5nZUxvb2t1cCIsICJ0cnVlIik7CiAgICAgICAgICAgICAJICAgIH0KLSAgICAgICAgICAgIAkgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTU2MzoxOTogKCAobHZfYWxsb3dOb1Jlc3VsdF8xNF8wPSAnYWxsb3dOb1Jlc3VsdCcgKSApCi0gICAgICAgICAgICAJICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE1NjM6MjA6IChsdl9hbGxvd05vUmVzdWx0XzE0XzA9ICdhbGxvd05vUmVzdWx0JyApCisgICAgICAgICAgICAJICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE2NzI6MTk6ICggKGx2X2FsbG93Tm9SZXN1bHRfMTRfMD0gJ2FsbG93Tm9SZXN1bHQnICkgKQorICAgICAgICAgICAgCSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNjcyOjIwOiAobHZfYWxsb3dOb1Jlc3VsdF8xNF8wPSAnYWxsb3dOb1Jlc3VsdCcgKQogICAgICAgICAgICAgCSAgICB7Ci0gICAgICAgICAgICAJICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE1NjM6MjA6IChsdl9hbGxvd05vUmVzdWx0XzE0XzA9ICdhbGxvd05vUmVzdWx0JyApCi0gICAgICAgICAgICAJICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE1NjQ6MTA6IGx2X2FsbG93Tm9SZXN1bHRfMTRfMD0gJ2FsbG93Tm9SZXN1bHQnCisgICAgICAgICAgICAJICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE2NzI6MjA6IChsdl9hbGxvd05vUmVzdWx0XzE0XzA9ICdhbGxvd05vUmVzdWx0JyApCisgICAgICAgICAgICAJICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE2NzM6MTA6IGx2X2FsbG93Tm9SZXN1bHRfMTRfMD0gJ2FsbG93Tm9SZXN1bHQnCiAgICAgICAgICAgICAJICAgIHsKLSAgICAgICAgICAgIAkgICAgbHZfYWxsb3dOb1Jlc3VsdF8xNF8wPShUb2tlbiltYXRjaChpbnB1dCw1MSxGT0xMT1dfNDApOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gY3VycmVudDsKKyAgICAgICAgICAgIAkgICAgbHZfYWxsb3dOb1Jlc3VsdF8xNF8wPShUb2tlbiltYXRjaChpbnB1dCw1NSxGT0xMT1dfNDcpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gY3VycmVudDsKICAgICAgICAgICAgIAkgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAKICAgICAgICAgICAgIAkgICAgICAJCQkJCQkJCQkJbmV3TGVhZk5vZGUobHZfYWxsb3dOb1Jlc3VsdF8xNF8wLCBncmFtbWFyQWNjZXNzLmdldERhdGFJbnRlcmNoYW5nZUxvb2t1cEFjY2VzcygpLmdldEFsbG93Tm9SZXN1bHRBbGxvd05vUmVzdWx0S2V5d29yZF8xMF8wXzAoKSk7CkBAIC00MTYzLDMzICs0NDUzLDMzIEBACiAgICAgICAgICAgICAJICAgIH0KICAgICAgICAgICAgIAkgICAgYnJlYWs7CiAgICAgICAgICAgICAJY2FzZSAyIDoKLSAgICAgICAgICAgIAkgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTU4MTo0OiAoey4uLn0/ID0+ICggKHsuLi59PyA9PiAoIChsdl9hbGxvd05vbnVuaXF1ZVJlc3VsdF8xNV8wPSAnYWxsb3dOb251bmlxdWVSZXN1bHQnICkgKSApICkgKQorICAgICAgICAgICAgCSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNjkwOjQ6ICh7Li4ufT8gPT4gKCAoey4uLn0/ID0+ICggKGx2X2FsbG93Tm9udW5pcXVlUmVzdWx0XzE1XzA9ICdhbGxvd05vbnVuaXF1ZVJlc3VsdCcgKSApICkgKSApCiAgICAgICAgICAgICAJICAgIHsKLSAgICAgICAgICAgIAkgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTU4MTo0OiAoey4uLn0/ID0+ICggKHsuLi59PyA9PiAoIChsdl9hbGxvd05vbnVuaXF1ZVJlc3VsdF8xNV8wPSAnYWxsb3dOb251bmlxdWVSZXN1bHQnICkgKSApICkgKQotICAgICAgICAgICAgCSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNTgyOjU6IHsuLi59PyA9PiAoICh7Li4ufT8gPT4gKCAobHZfYWxsb3dOb251bmlxdWVSZXN1bHRfMTVfMD0gJ2FsbG93Tm9udW5pcXVlUmVzdWx0JyApICkgKSApCisgICAgICAgICAgICAJICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE2OTA6NDogKHsuLi59PyA9PiAoICh7Li4ufT8gPT4gKCAobHZfYWxsb3dOb251bmlxdWVSZXN1bHRfMTVfMD0gJ2FsbG93Tm9udW5pcXVlUmVzdWx0JyApICkgKSApICkKKyAgICAgICAgICAgIAkgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTY5MTo1OiB7Li4ufT8gPT4gKCAoey4uLn0/ID0+ICggKGx2X2FsbG93Tm9udW5pcXVlUmVzdWx0XzE1XzA9ICdhbGxvd05vbnVuaXF1ZVJlc3VsdCcgKSApICkgKQogICAgICAgICAgICAgCSAgICB7CiAgICAgICAgICAgICAJICAgIGlmICggISBnZXRVbm9yZGVyZWRHcm91cEhlbHBlcigpLmNhblNlbGVjdChncmFtbWFyQWNjZXNzLmdldERhdGFJbnRlcmNoYW5nZUxvb2t1cEFjY2VzcygpLmdldFVub3JkZXJlZEdyb3VwXzEwKCksIDEpICkgewogICAgICAgICAgICAgCSAgICAgICAgaWYgKHN0YXRlLmJhY2t0cmFja2luZz4wKSB7c3RhdGUuZmFpbGVkPXRydWU7IHJldHVybiBjdXJyZW50O30KICAgICAgICAgICAgIAkgICAgICAgIHRocm93IG5ldyBGYWlsZWRQcmVkaWNhdGVFeGNlcHRpb24oaW5wdXQsICJydWxlRGF0YUludGVyY2hhbmdlTG9va3VwIiwgImdldFVub3JkZXJlZEdyb3VwSGVscGVyKCkuY2FuU2VsZWN0KGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YUludGVyY2hhbmdlTG9va3VwQWNjZXNzKCkuZ2V0VW5vcmRlcmVkR3JvdXBfMTAoKSwgMSkiKTsKICAgICAgICAgICAgIAkgICAgfQotICAgICAgICAgICAgCSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNTgyOjExOTogKCAoey4uLn0/ID0+ICggKGx2X2FsbG93Tm9udW5pcXVlUmVzdWx0XzE1XzA9ICdhbGxvd05vbnVuaXF1ZVJlc3VsdCcgKSApICkgKQotICAgICAgICAgICAgCSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNTgzOjY6ICh7Li4ufT8gPT4gKCAobHZfYWxsb3dOb251bmlxdWVSZXN1bHRfMTVfMD0gJ2FsbG93Tm9udW5pcXVlUmVzdWx0JyApICkgKQorICAgICAgICAgICAgCSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNjkxOjExOTogKCAoey4uLn0/ID0+ICggKGx2X2FsbG93Tm9udW5pcXVlUmVzdWx0XzE1XzA9ICdhbGxvd05vbnVuaXF1ZVJlc3VsdCcgKSApICkgKQorICAgICAgICAgICAgCSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNjkyOjY6ICh7Li4ufT8gPT4gKCAobHZfYWxsb3dOb251bmlxdWVSZXN1bHRfMTVfMD0gJ2FsbG93Tm9udW5pcXVlUmVzdWx0JyApICkgKQogICAgICAgICAgICAgCSAgICB7CiAgICAgICAgICAgICAJICAgIGdldFVub3JkZXJlZEdyb3VwSGVscGVyKCkuc2VsZWN0KGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YUludGVyY2hhbmdlTG9va3VwQWNjZXNzKCkuZ2V0VW5vcmRlcmVkR3JvdXBfMTAoKSwgMSk7Ci0gICAgICAgICAgICAJICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE1ODY6OTogKHsuLi59PyA9PiAoIChsdl9hbGxvd05vbnVuaXF1ZVJlc3VsdF8xNV8wPSAnYWxsb3dOb251bmlxdWVSZXN1bHQnICkgKSApCi0gICAgICAgICAgICAJICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE1ODY6MTA6IHsuLi59PyA9PiAoIChsdl9hbGxvd05vbnVuaXF1ZVJlc3VsdF8xNV8wPSAnYWxsb3dOb251bmlxdWVSZXN1bHQnICkgKQorICAgICAgICAgICAgCSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNjk1Ojk6ICh7Li4ufT8gPT4gKCAobHZfYWxsb3dOb251bmlxdWVSZXN1bHRfMTVfMD0gJ2FsbG93Tm9udW5pcXVlUmVzdWx0JyApICkgKQorICAgICAgICAgICAgCSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNjk1OjEwOiB7Li4ufT8gPT4gKCAobHZfYWxsb3dOb251bmlxdWVSZXN1bHRfMTVfMD0gJ2FsbG93Tm9udW5pcXVlUmVzdWx0JyApICkKICAgICAgICAgICAgIAkgICAgewogICAgICAgICAgICAgCSAgICBpZiAoICEoKHRydWUpKSApIHsKICAgICAgICAgICAgIAkgICAgICAgIGlmIChzdGF0ZS5iYWNrdHJhY2tpbmc+MCkge3N0YXRlLmZhaWxlZD10cnVlOyByZXR1cm4gY3VycmVudDt9CiAgICAgICAgICAgICAJICAgICAgICB0aHJvdyBuZXcgRmFpbGVkUHJlZGljYXRlRXhjZXB0aW9uKGlucHV0LCAicnVsZURhdGFJbnRlcmNoYW5nZUxvb2t1cCIsICJ0cnVlIik7CiAgICAgICAgICAgICAJICAgIH0KLSAgICAgICAgICAgIAkgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTU4NjoxOTogKCAobHZfYWxsb3dOb251bmlxdWVSZXN1bHRfMTVfMD0gJ2FsbG93Tm9udW5pcXVlUmVzdWx0JyApICkKLSAgICAgICAgICAgIAkgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTU4NjoyMDogKGx2X2FsbG93Tm9udW5pcXVlUmVzdWx0XzE1XzA9ICdhbGxvd05vbnVuaXF1ZVJlc3VsdCcgKQorICAgICAgICAgICAgCSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNjk1OjE5OiAoIChsdl9hbGxvd05vbnVuaXF1ZVJlc3VsdF8xNV8wPSAnYWxsb3dOb251bmlxdWVSZXN1bHQnICkgKQorICAgICAgICAgICAgCSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNjk1OjIwOiAobHZfYWxsb3dOb251bmlxdWVSZXN1bHRfMTVfMD0gJ2FsbG93Tm9udW5pcXVlUmVzdWx0JyApCiAgICAgICAgICAgICAJICAgIHsKLSAgICAgICAgICAgIAkgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTU4NjoyMDogKGx2X2FsbG93Tm9udW5pcXVlUmVzdWx0XzE1XzA9ICdhbGxvd05vbnVuaXF1ZVJlc3VsdCcgKQotICAgICAgICAgICAgCSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNTg3OjEwOiBsdl9hbGxvd05vbnVuaXF1ZVJlc3VsdF8xNV8wPSAnYWxsb3dOb251bmlxdWVSZXN1bHQnCisgICAgICAgICAgICAJICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE2OTU6MjA6IChsdl9hbGxvd05vbnVuaXF1ZVJlc3VsdF8xNV8wPSAnYWxsb3dOb251bmlxdWVSZXN1bHQnICkKKyAgICAgICAgICAgIAkgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTY5NjoxMDogbHZfYWxsb3dOb251bmlxdWVSZXN1bHRfMTVfMD0gJ2FsbG93Tm9udW5pcXVlUmVzdWx0JwogICAgICAgICAgICAgCSAgICB7Ci0gICAgICAgICAgICAJICAgIGx2X2FsbG93Tm9udW5pcXVlUmVzdWx0XzE1XzA9KFRva2VuKW1hdGNoKGlucHV0LDUyLEZPTExPV180MCk7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OworICAgICAgICAgICAgCSAgICBsdl9hbGxvd05vbnVuaXF1ZVJlc3VsdF8xNV8wPShUb2tlbiltYXRjaChpbnB1dCw1NixGT0xMT1dfNDcpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gY3VycmVudDsKICAgICAgICAgICAgIAkgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAKICAgICAgICAgICAgIAkgICAgICAJCQkJCQkJCQkJbmV3TGVhZk5vZGUobHZfYWxsb3dOb251bmlxdWVSZXN1bHRfMTVfMCwgZ3JhbW1hckFjY2Vzcy5nZXREYXRhSW50ZXJjaGFuZ2VMb29rdXBBY2Nlc3MoKS5nZXRBbGxvd05vbnVuaXF1ZVJlc3VsdEFsbG93Tm9udW5pcXVlUmVzdWx0S2V5d29yZF8xMF8xXzAoKSk7CkBAIC00MjIzLDM4ICs0NTEzLDM4IEBACiAgICAgICAgICAgICAJICAgIH0KICAgICAgICAgICAgIAkgICAgYnJlYWs7CiAgICAgICAgICAgICAJY2FzZSAzIDoKLSAgICAgICAgICAgIAkgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTYwNDo0OiAoey4uLn0/ID0+ICggKHsuLi59PyA9PiAoIChsdl9tYXJrZXJQYXRoXzE2XzA9IHJ1bGVEYXRhSW50ZXJjaGFuZ2VNYXJrZXJQYXRoICkgKSApICkgKQorICAgICAgICAgICAgCSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNzEzOjQ6ICh7Li4ufT8gPT4gKCAoey4uLn0/ID0+ICggKGx2X21hcmtlclBhdGhfMTZfMD0gcnVsZURhdGFJbnRlcmNoYW5nZU1hcmtlclBhdGggKSApICkgKSApCiAgICAgICAgICAgICAJICAgIHsKLSAgICAgICAgICAgIAkgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTYwNDo0OiAoey4uLn0/ID0+ICggKHsuLi59PyA9PiAoIChsdl9tYXJrZXJQYXRoXzE2XzA9IHJ1bGVEYXRhSW50ZXJjaGFuZ2VNYXJrZXJQYXRoICkgKSApICkgKQotICAgICAgICAgICAgCSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNjA1OjU6IHsuLi59PyA9PiAoICh7Li4ufT8gPT4gKCAobHZfbWFya2VyUGF0aF8xNl8wPSBydWxlRGF0YUludGVyY2hhbmdlTWFya2VyUGF0aCApICkgKSApCisgICAgICAgICAgICAJICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE3MTM6NDogKHsuLi59PyA9PiAoICh7Li4ufT8gPT4gKCAobHZfbWFya2VyUGF0aF8xNl8wPSBydWxlRGF0YUludGVyY2hhbmdlTWFya2VyUGF0aCApICkgKSApICkKKyAgICAgICAgICAgIAkgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTcxNDo1OiB7Li4ufT8gPT4gKCAoey4uLn0/ID0+ICggKGx2X21hcmtlclBhdGhfMTZfMD0gcnVsZURhdGFJbnRlcmNoYW5nZU1hcmtlclBhdGggKSApICkgKQogICAgICAgICAgICAgCSAgICB7CiAgICAgICAgICAgICAJICAgIGlmICggISBnZXRVbm9yZGVyZWRHcm91cEhlbHBlcigpLmNhblNlbGVjdChncmFtbWFyQWNjZXNzLmdldERhdGFJbnRlcmNoYW5nZUxvb2t1cEFjY2VzcygpLmdldFVub3JkZXJlZEdyb3VwXzEwKCksIDIpICkgewogICAgICAgICAgICAgCSAgICAgICAgaWYgKHN0YXRlLmJhY2t0cmFja2luZz4wKSB7c3RhdGUuZmFpbGVkPXRydWU7IHJldHVybiBjdXJyZW50O30KICAgICAgICAgICAgIAkgICAgICAgIHRocm93IG5ldyBGYWlsZWRQcmVkaWNhdGVFeGNlcHRpb24oaW5wdXQsICJydWxlRGF0YUludGVyY2hhbmdlTG9va3VwIiwgImdldFVub3JkZXJlZEdyb3VwSGVscGVyKCkuY2FuU2VsZWN0KGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YUludGVyY2hhbmdlTG9va3VwQWNjZXNzKCkuZ2V0VW5vcmRlcmVkR3JvdXBfMTAoKSwgMikiKTsKICAgICAgICAgICAgIAkgICAgfQotICAgICAgICAgICAgCSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNjA1OjExOTogKCAoey4uLn0/ID0+ICggKGx2X21hcmtlclBhdGhfMTZfMD0gcnVsZURhdGFJbnRlcmNoYW5nZU1hcmtlclBhdGggKSApICkgKQotICAgICAgICAgICAgCSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNjA2OjY6ICh7Li4ufT8gPT4gKCAobHZfbWFya2VyUGF0aF8xNl8wPSBydWxlRGF0YUludGVyY2hhbmdlTWFya2VyUGF0aCApICkgKQorICAgICAgICAgICAgCSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNzE0OjExOTogKCAoey4uLn0/ID0+ICggKGx2X21hcmtlclBhdGhfMTZfMD0gcnVsZURhdGFJbnRlcmNoYW5nZU1hcmtlclBhdGggKSApICkgKQorICAgICAgICAgICAgCSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNzE1OjY6ICh7Li4ufT8gPT4gKCAobHZfbWFya2VyUGF0aF8xNl8wPSBydWxlRGF0YUludGVyY2hhbmdlTWFya2VyUGF0aCApICkgKQogICAgICAgICAgICAgCSAgICB7CiAgICAgICAgICAgICAJICAgIGdldFVub3JkZXJlZEdyb3VwSGVscGVyKCkuc2VsZWN0KGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YUludGVyY2hhbmdlTG9va3VwQWNjZXNzKCkuZ2V0VW5vcmRlcmVkR3JvdXBfMTAoKSwgMik7Ci0gICAgICAgICAgICAJICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE2MDk6OTogKHsuLi59PyA9PiAoIChsdl9tYXJrZXJQYXRoXzE2XzA9IHJ1bGVEYXRhSW50ZXJjaGFuZ2VNYXJrZXJQYXRoICkgKSApCi0gICAgICAgICAgICAJICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE2MDk6MTA6IHsuLi59PyA9PiAoIChsdl9tYXJrZXJQYXRoXzE2XzA9IHJ1bGVEYXRhSW50ZXJjaGFuZ2VNYXJrZXJQYXRoICkgKQorICAgICAgICAgICAgCSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNzE4Ojk6ICh7Li4ufT8gPT4gKCAobHZfbWFya2VyUGF0aF8xNl8wPSBydWxlRGF0YUludGVyY2hhbmdlTWFya2VyUGF0aCApICkgKQorICAgICAgICAgICAgCSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNzE4OjEwOiB7Li4ufT8gPT4gKCAobHZfbWFya2VyUGF0aF8xNl8wPSBydWxlRGF0YUludGVyY2hhbmdlTWFya2VyUGF0aCApICkKICAgICAgICAgICAgIAkgICAgewogICAgICAgICAgICAgCSAgICBpZiAoICEoKHRydWUpKSApIHsKICAgICAgICAgICAgIAkgICAgICAgIGlmIChzdGF0ZS5iYWNrdHJhY2tpbmc+MCkge3N0YXRlLmZhaWxlZD10cnVlOyByZXR1cm4gY3VycmVudDt9CiAgICAgICAgICAgICAJICAgICAgICB0aHJvdyBuZXcgRmFpbGVkUHJlZGljYXRlRXhjZXB0aW9uKGlucHV0LCAicnVsZURhdGFJbnRlcmNoYW5nZUxvb2t1cCIsICJ0cnVlIik7CiAgICAgICAgICAgICAJICAgIH0KLSAgICAgICAgICAgIAkgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTYwOToxOTogKCAobHZfbWFya2VyUGF0aF8xNl8wPSBydWxlRGF0YUludGVyY2hhbmdlTWFya2VyUGF0aCApICkKLSAgICAgICAgICAgIAkgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTYwOToyMDogKGx2X21hcmtlclBhdGhfMTZfMD0gcnVsZURhdGFJbnRlcmNoYW5nZU1hcmtlclBhdGggKQorICAgICAgICAgICAgCSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNzE4OjE5OiAoIChsdl9tYXJrZXJQYXRoXzE2XzA9IHJ1bGVEYXRhSW50ZXJjaGFuZ2VNYXJrZXJQYXRoICkgKQorICAgICAgICAgICAgCSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNzE4OjIwOiAobHZfbWFya2VyUGF0aF8xNl8wPSBydWxlRGF0YUludGVyY2hhbmdlTWFya2VyUGF0aCApCiAgICAgICAgICAgICAJICAgIHsKLSAgICAgICAgICAgIAkgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTYwOToyMDogKGx2X21hcmtlclBhdGhfMTZfMD0gcnVsZURhdGFJbnRlcmNoYW5nZU1hcmtlclBhdGggKQotICAgICAgICAgICAgCSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNjEwOjEwOiBsdl9tYXJrZXJQYXRoXzE2XzA9IHJ1bGVEYXRhSW50ZXJjaGFuZ2VNYXJrZXJQYXRoCisgICAgICAgICAgICAJICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE3MTg6MjA6IChsdl9tYXJrZXJQYXRoXzE2XzA9IHJ1bGVEYXRhSW50ZXJjaGFuZ2VNYXJrZXJQYXRoICkKKyAgICAgICAgICAgIAkgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTcxOToxMDogbHZfbWFya2VyUGF0aF8xNl8wPSBydWxlRGF0YUludGVyY2hhbmdlTWFya2VyUGF0aAogICAgICAgICAgICAgCSAgICB7CiAgICAgICAgICAgICAJICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogCiAgICAgICAgICAgICAJICAgICAgCQkJCQkJCQkJCW5ld0NvbXBvc2l0ZU5vZGUoZ3JhbW1hckFjY2Vzcy5nZXREYXRhSW50ZXJjaGFuZ2VMb29rdXBBY2Nlc3MoKS5nZXRNYXJrZXJQYXRoRGF0YUludGVyY2hhbmdlTWFya2VyUGF0aFBhcnNlclJ1bGVDYWxsXzEwXzJfMCgpKTsKICAgICAgICAgICAgIAkgICAgICAJCQkJCQkJCQkKICAgICAgICAgICAgIAkgICAgfQotICAgICAgICAgICAgCSAgICBwdXNoRm9sbG93KEZPTExPV180MCk7CisgICAgICAgICAgICAJICAgIHB1c2hGb2xsb3coRk9MTE9XXzQ3KTsKICAgICAgICAgICAgIAkgICAgbHZfbWFya2VyUGF0aF8xNl8wPXJ1bGVEYXRhSW50ZXJjaGFuZ2VNYXJrZXJQYXRoKCk7CiAKICAgICAgICAgICAgIAkgICAgc3RhdGUuX2ZzcC0tOwpAQCAtNDI5Myw3ICs0NTgzLDcgQEAKICAgICAgICAgICAgIAkgICAgYnJlYWs7CiAKICAgICAgICAgICAgIAlkZWZhdWx0IDoKLSAgICAgICAgICAgIAkgICAgYnJlYWsgbG9vcDMxOworICAgICAgICAgICAgCSAgICBicmVhayBsb29wMzY7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfSB3aGlsZSAodHJ1ZSk7CiAKQEAgLTQzMzIsNyArNDYyMiw3IEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAiZW50cnlSdWxlRGF0YUludGVyY2hhbmdlTWFya2VyUGF0aCIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNjQzOjE6IGVudHJ5UnVsZURhdGFJbnRlcmNoYW5nZU1hcmtlclBhdGggcmV0dXJucyBbRU9iamVjdCBjdXJyZW50PW51bGxdIDogaXZfcnVsZURhdGFJbnRlcmNoYW5nZU1hcmtlclBhdGg9IHJ1bGVEYXRhSW50ZXJjaGFuZ2VNYXJrZXJQYXRoIEVPRiA7CisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTc1MjoxOiBlbnRyeVJ1bGVEYXRhSW50ZXJjaGFuZ2VNYXJrZXJQYXRoIHJldHVybnMgW0VPYmplY3QgY3VycmVudD1udWxsXSA6IGl2X3J1bGVEYXRhSW50ZXJjaGFuZ2VNYXJrZXJQYXRoPSBydWxlRGF0YUludGVyY2hhbmdlTWFya2VyUGF0aCBFT0YgOwogICAgIHB1YmxpYyBmaW5hbCBFT2JqZWN0IGVudHJ5UnVsZURhdGFJbnRlcmNoYW5nZU1hcmtlclBhdGgoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogICAgICAgICBFT2JqZWN0IGN1cnJlbnQgPSBudWxsOwogCkBAIC00MzQwLDggKzQ2MzAsOCBAQAogCiAKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE2NDM6NjY6IChpdl9ydWxlRGF0YUludGVyY2hhbmdlTWFya2VyUGF0aD0gcnVsZURhdGFJbnRlcmNoYW5nZU1hcmtlclBhdGggRU9GICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE2NDQ6MjogaXZfcnVsZURhdGFJbnRlcmNoYW5nZU1hcmtlclBhdGg9IHJ1bGVEYXRhSW50ZXJjaGFuZ2VNYXJrZXJQYXRoIEVPRgorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTc1Mjo2NjogKGl2X3J1bGVEYXRhSW50ZXJjaGFuZ2VNYXJrZXJQYXRoPSBydWxlRGF0YUludGVyY2hhbmdlTWFya2VyUGF0aCBFT0YgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTc1MzoyOiBpdl9ydWxlRGF0YUludGVyY2hhbmdlTWFya2VyUGF0aD0gcnVsZURhdGFJbnRlcmNoYW5nZU1hcmtlclBhdGggRU9GCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIG5ld0NvbXBvc2l0ZU5vZGUoZ3JhbW1hckFjY2Vzcy5nZXREYXRhSW50ZXJjaGFuZ2VNYXJrZXJQYXRoUnVsZSgpKTsgCkBAIC00MzcyLDcgKzQ2NjIsNyBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVEYXRhSW50ZXJjaGFuZ2VNYXJrZXJQYXRoIgotICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE2NTA6MTogcnVsZURhdGFJbnRlcmNoYW5nZU1hcmtlclBhdGggcmV0dXJucyBbRU9iamVjdCBjdXJyZW50PW51bGxdIDogKCAoKSBvdGhlcmx2XzE9ICdtYXJrZXJQYXRoJyBvdGhlcmx2XzI9ICd7JyAoIChsdl9wYXRoXzNfMD0gcnVsZURhdGFJbnRlcmNoYW5nZU1hcmtlckVudGl0eSApICkqIG90aGVybHZfND0gJ30nICkgOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE3NTk6MTogcnVsZURhdGFJbnRlcmNoYW5nZU1hcmtlclBhdGggcmV0dXJucyBbRU9iamVjdCBjdXJyZW50PW51bGxdIDogKCAoKSBvdGhlcmx2XzE9ICdtYXJrZXJQYXRoJyBvdGhlcmx2XzI9ICd7JyAoIChsdl9wYXRoXzNfMD0gcnVsZURhdGFJbnRlcmNoYW5nZU1hcmtlckVudGl0eSApICkqIG90aGVybHZfND0gJ30nICkgOwogICAgIHB1YmxpYyBmaW5hbCBFT2JqZWN0IHJ1bGVEYXRhSW50ZXJjaGFuZ2VNYXJrZXJQYXRoKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKICAgICAgICAgRU9iamVjdCBjdXJyZW50ID0gbnVsbDsKIApAQCAtNDM4NiwxNCArNDY3NiwxNCBAQAogICAgICAgICAJZW50ZXJSdWxlKCk7CiAKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE2NTY6MjogKCAoICgpIG90aGVybHZfMT0gJ21hcmtlclBhdGgnIG90aGVybHZfMj0gJ3snICggKGx2X3BhdGhfM18wPSBydWxlRGF0YUludGVyY2hhbmdlTWFya2VyRW50aXR5ICkgKSogb3RoZXJsdl80PSAnfScgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNjU3OjI6ICggKCkgb3RoZXJsdl8xPSAnbWFya2VyUGF0aCcgb3RoZXJsdl8yPSAneycgKCAobHZfcGF0aF8zXzA9IHJ1bGVEYXRhSW50ZXJjaGFuZ2VNYXJrZXJFbnRpdHkgKSApKiBvdGhlcmx2XzQ9ICd9JyApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNzY1OjI6ICggKCAoKSBvdGhlcmx2XzE9ICdtYXJrZXJQYXRoJyBvdGhlcmx2XzI9ICd7JyAoIChsdl9wYXRoXzNfMD0gcnVsZURhdGFJbnRlcmNoYW5nZU1hcmtlckVudGl0eSApICkqIG90aGVybHZfND0gJ30nICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTc2NjoyOiAoICgpIG90aGVybHZfMT0gJ21hcmtlclBhdGgnIG90aGVybHZfMj0gJ3snICggKGx2X3BhdGhfM18wPSBydWxlRGF0YUludGVyY2hhbmdlTWFya2VyRW50aXR5ICkgKSogb3RoZXJsdl80PSAnfScgKQogICAgICAgICAgICAgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTY1NzoyOiAoICgpIG90aGVybHZfMT0gJ21hcmtlclBhdGgnIG90aGVybHZfMj0gJ3snICggKGx2X3BhdGhfM18wPSBydWxlRGF0YUludGVyY2hhbmdlTWFya2VyRW50aXR5ICkgKSogb3RoZXJsdl80PSAnfScgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTY1ODozOiAoKSBvdGhlcmx2XzE9ICdtYXJrZXJQYXRoJyBvdGhlcmx2XzI9ICd7JyAoIChsdl9wYXRoXzNfMD0gcnVsZURhdGFJbnRlcmNoYW5nZU1hcmtlckVudGl0eSApICkqIG90aGVybHZfND0gJ30nCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNzY2OjI6ICggKCkgb3RoZXJsdl8xPSAnbWFya2VyUGF0aCcgb3RoZXJsdl8yPSAneycgKCAobHZfcGF0aF8zXzA9IHJ1bGVEYXRhSW50ZXJjaGFuZ2VNYXJrZXJFbnRpdHkgKSApKiBvdGhlcmx2XzQ9ICd9JyApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNzY3OjM6ICgpIG90aGVybHZfMT0gJ21hcmtlclBhdGgnIG90aGVybHZfMj0gJ3snICggKGx2X3BhdGhfM18wPSBydWxlRGF0YUludGVyY2hhbmdlTWFya2VyRW50aXR5ICkgKSogb3RoZXJsdl80PSAnfScKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE2NTg6MzogKCkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE2NTk6NDogCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNzY3OjM6ICgpCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNzY4OjQ6IAogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAKQEAgLTQ0MDUsNDIgKzQ2OTUsNDIgQEAKIAogICAgICAgICAgICAgfQogCi0gICAgICAgICAgICBvdGhlcmx2XzE9KFRva2VuKW1hdGNoKGlucHV0LDUzLEZPTExPV18xNyk7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OworICAgICAgICAgICAgb3RoZXJsdl8xPShUb2tlbiltYXRjaChpbnB1dCw1NyxGT0xMT1dfMTgpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gY3VycmVudDsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogCiAgICAgICAgICAgICAgIAkJCW5ld0xlYWZOb2RlKG90aGVybHZfMSwgZ3JhbW1hckFjY2Vzcy5nZXREYXRhSW50ZXJjaGFuZ2VNYXJrZXJQYXRoQWNjZXNzKCkuZ2V0TWFya2VyUGF0aEtleXdvcmRfMSgpKTsKICAgICAgICAgICAgICAgCQkKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG90aGVybHZfMj0oVG9rZW4pbWF0Y2goaW5wdXQsMTUsRk9MTE9XXzQxKTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7CisgICAgICAgICAgICBvdGhlcmx2XzI9KFRva2VuKW1hdGNoKGlucHV0LDE1LEZPTExPV180OCk7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OwogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAKICAgICAgICAgICAgICAgCQkJbmV3TGVhZk5vZGUob3RoZXJsdl8yLCBncmFtbWFyQWNjZXNzLmdldERhdGFJbnRlcmNoYW5nZU1hcmtlclBhdGhBY2Nlc3MoKS5nZXRMZWZ0Q3VybHlCcmFja2V0S2V5d29yZF8yKCkpOwogICAgICAgICAgICAgICAJCQogICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTY3MzozOiAoIChsdl9wYXRoXzNfMD0gcnVsZURhdGFJbnRlcmNoYW5nZU1hcmtlckVudGl0eSApICkqCi0gICAgICAgICAgICBsb29wMzI6CisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNzgyOjM6ICggKGx2X3BhdGhfM18wPSBydWxlRGF0YUludGVyY2hhbmdlTWFya2VyRW50aXR5ICkgKSoKKyAgICAgICAgICAgIGxvb3AzNzoKICAgICAgICAgICAgIGRvIHsKLSAgICAgICAgICAgICAgICBpbnQgYWx0MzI9MjsKLSAgICAgICAgICAgICAgICBpbnQgTEEzMl8wID0gaW5wdXQuTEEoMSk7CisgICAgICAgICAgICAgICAgaW50IGFsdDM3PTI7CisgICAgICAgICAgICAgICAgaW50IExBMzdfMCA9IGlucHV0LkxBKDEpOwogCi0gICAgICAgICAgICAgICAgaWYgKCAoTEEzMl8wPT01NCkgKSB7Ci0gICAgICAgICAgICAgICAgICAgIGFsdDMyPTE7CisgICAgICAgICAgICAgICAgaWYgKCAoTEEzN18wPT01OCkgKSB7CisgICAgICAgICAgICAgICAgICAgIGFsdDM3PTE7CiAgICAgICAgICAgICAgICAgfQogCiAKLSAgICAgICAgICAgICAgICBzd2l0Y2ggKGFsdDMyKSB7CisgICAgICAgICAgICAgICAgc3dpdGNoIChhbHQzNykgewogICAgICAgICAgICAgCWNhc2UgMSA6Ci0gICAgICAgICAgICAJICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE2NzQ6NDogKGx2X3BhdGhfM18wPSBydWxlRGF0YUludGVyY2hhbmdlTWFya2VyRW50aXR5ICkKKyAgICAgICAgICAgIAkgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTc4Mzo0OiAobHZfcGF0aF8zXzA9IHJ1bGVEYXRhSW50ZXJjaGFuZ2VNYXJrZXJFbnRpdHkgKQogICAgICAgICAgICAgCSAgICB7Ci0gICAgICAgICAgICAJICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE2NzQ6NDogKGx2X3BhdGhfM18wPSBydWxlRGF0YUludGVyY2hhbmdlTWFya2VyRW50aXR5ICkKLSAgICAgICAgICAgIAkgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTY3NTo1OiBsdl9wYXRoXzNfMD0gcnVsZURhdGFJbnRlcmNoYW5nZU1hcmtlckVudGl0eQorICAgICAgICAgICAgCSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNzgzOjQ6IChsdl9wYXRoXzNfMD0gcnVsZURhdGFJbnRlcmNoYW5nZU1hcmtlckVudGl0eSApCisgICAgICAgICAgICAJICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE3ODQ6NTogbHZfcGF0aF8zXzA9IHJ1bGVEYXRhSW50ZXJjaGFuZ2VNYXJrZXJFbnRpdHkKICAgICAgICAgICAgIAkgICAgewogICAgICAgICAgICAgCSAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKIAogICAgICAgICAgICAgCSAgICAgIAkJCQkJbmV3Q29tcG9zaXRlTm9kZShncmFtbWFyQWNjZXNzLmdldERhdGFJbnRlcmNoYW5nZU1hcmtlclBhdGhBY2Nlc3MoKS5nZXRQYXRoRGF0YUludGVyY2hhbmdlTWFya2VyRW50aXR5UGFyc2VyUnVsZUNhbGxfM18wKCkpOwogICAgICAgICAgICAgCSAgICAgIAkJCQkKICAgICAgICAgICAgIAkgICAgfQotICAgICAgICAgICAgCSAgICBwdXNoRm9sbG93KEZPTExPV180MSk7CisgICAgICAgICAgICAJICAgIHB1c2hGb2xsb3coRk9MTE9XXzQ4KTsKICAgICAgICAgICAgIAkgICAgbHZfcGF0aF8zXzA9cnVsZURhdGFJbnRlcmNoYW5nZU1hcmtlckVudGl0eSgpOwogCiAgICAgICAgICAgICAJICAgIHN0YXRlLl9mc3AtLTsKQEAgLTQ0NjYsNyArNDc1Niw3IEBACiAgICAgICAgICAgICAJICAgIGJyZWFrOwogCiAgICAgICAgICAgICAJZGVmYXVsdCA6Ci0gICAgICAgICAgICAJICAgIGJyZWFrIGxvb3AzMjsKKyAgICAgICAgICAgIAkgICAgYnJlYWsgbG9vcDM3OwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0gd2hpbGUgKHRydWUpOwogCkBAIC00NTAxLDcgKzQ3OTEsNyBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgImVudHJ5UnVsZURhdGFJbnRlcmNoYW5nZU1hcmtlckVudGl0eSIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNzAwOjE6IGVudHJ5UnVsZURhdGFJbnRlcmNoYW5nZU1hcmtlckVudGl0eSByZXR1cm5zIFtFT2JqZWN0IGN1cnJlbnQ9bnVsbF0gOiBpdl9ydWxlRGF0YUludGVyY2hhbmdlTWFya2VyRW50aXR5PSBydWxlRGF0YUludGVyY2hhbmdlTWFya2VyRW50aXR5IEVPRiA7CisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTgwOToxOiBlbnRyeVJ1bGVEYXRhSW50ZXJjaGFuZ2VNYXJrZXJFbnRpdHkgcmV0dXJucyBbRU9iamVjdCBjdXJyZW50PW51bGxdIDogaXZfcnVsZURhdGFJbnRlcmNoYW5nZU1hcmtlckVudGl0eT0gcnVsZURhdGFJbnRlcmNoYW5nZU1hcmtlckVudGl0eSBFT0YgOwogICAgIHB1YmxpYyBmaW5hbCBFT2JqZWN0IGVudHJ5UnVsZURhdGFJbnRlcmNoYW5nZU1hcmtlckVudGl0eSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAgICAgICAgIEVPYmplY3QgY3VycmVudCA9IG51bGw7CiAKQEAgLTQ1MDksOCArNDc5OSw4IEBACiAKIAogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTcwMDo2ODogKGl2X3J1bGVEYXRhSW50ZXJjaGFuZ2VNYXJrZXJFbnRpdHk9IHJ1bGVEYXRhSW50ZXJjaGFuZ2VNYXJrZXJFbnRpdHkgRU9GICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE3MDE6MjogaXZfcnVsZURhdGFJbnRlcmNoYW5nZU1hcmtlckVudGl0eT0gcnVsZURhdGFJbnRlcmNoYW5nZU1hcmtlckVudGl0eSBFT0YKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE4MDk6Njg6IChpdl9ydWxlRGF0YUludGVyY2hhbmdlTWFya2VyRW50aXR5PSBydWxlRGF0YUludGVyY2hhbmdlTWFya2VyRW50aXR5IEVPRiApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxODEwOjI6IGl2X3J1bGVEYXRhSW50ZXJjaGFuZ2VNYXJrZXJFbnRpdHk9IHJ1bGVEYXRhSW50ZXJjaGFuZ2VNYXJrZXJFbnRpdHkgRU9GCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIG5ld0NvbXBvc2l0ZU5vZGUoZ3JhbW1hckFjY2Vzcy5nZXREYXRhSW50ZXJjaGFuZ2VNYXJrZXJFbnRpdHlSdWxlKCkpOyAKQEAgLTQ1NDEsNyArNDgzMSw3IEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZURhdGFJbnRlcmNoYW5nZU1hcmtlckVudGl0eSIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNzA3OjE6IHJ1bGVEYXRhSW50ZXJjaGFuZ2VNYXJrZXJFbnRpdHkgcmV0dXJucyBbRU9iamVjdCBjdXJyZW50PW51bGxdIDogKCAoKSBvdGhlcmx2XzE9ICdtYXJrZXJFbnRpdHknICggKCBydWxlTEZRTiApICkgKCAoIChsdl9tYXJrTGF0ZXN0XzNfMD0gJ21hcmtlZEJ5JyApICkgKCAob3RoZXJsdl80PSBSVUxFX0lEICkgKSApPyApIDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxODE2OjE6IHJ1bGVEYXRhSW50ZXJjaGFuZ2VNYXJrZXJFbnRpdHkgcmV0dXJucyBbRU9iamVjdCBjdXJyZW50PW51bGxdIDogKCAoKSBvdGhlcmx2XzE9ICdtYXJrZXJFbnRpdHknICggKCBydWxlTEZRTiApICkgKCAoIChsdl9tYXJrTGF0ZXN0XzNfMD0gJ21hcmtlZEJ5JyApICkgKCAob3RoZXJsdl80PSBSVUxFX0lEICkgKSApPyApIDsKICAgICBwdWJsaWMgZmluYWwgRU9iamVjdCBydWxlRGF0YUludGVyY2hhbmdlTWFya2VyRW50aXR5KCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKICAgICAgICAgRU9iamVjdCBjdXJyZW50ID0gbnVsbDsKIApAQCAtNDU1MywxNCArNDg0MywxNCBAQAogICAgICAgICAJZW50ZXJSdWxlKCk7CiAKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE3MTM6MjogKCAoICgpIG90aGVybHZfMT0gJ21hcmtlckVudGl0eScgKCAoIHJ1bGVMRlFOICkgKSAoICggKGx2X21hcmtMYXRlc3RfM18wPSAnbWFya2VkQnknICkgKSAoIChvdGhlcmx2XzQ9IFJVTEVfSUQgKSApICk/ICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTcxNDoyOiAoICgpIG90aGVybHZfMT0gJ21hcmtlckVudGl0eScgKCAoIHJ1bGVMRlFOICkgKSAoICggKGx2X21hcmtMYXRlc3RfM18wPSAnbWFya2VkQnknICkgKSAoIChvdGhlcmx2XzQ9IFJVTEVfSUQgKSApICk/ICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE4MjI6MjogKCAoICgpIG90aGVybHZfMT0gJ21hcmtlckVudGl0eScgKCAoIHJ1bGVMRlFOICkgKSAoICggKGx2X21hcmtMYXRlc3RfM18wPSAnbWFya2VkQnknICkgKSAoIChvdGhlcmx2XzQ9IFJVTEVfSUQgKSApICk/ICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTgyMzoyOiAoICgpIG90aGVybHZfMT0gJ21hcmtlckVudGl0eScgKCAoIHJ1bGVMRlFOICkgKSAoICggKGx2X21hcmtMYXRlc3RfM18wPSAnbWFya2VkQnknICkgKSAoIChvdGhlcmx2XzQ9IFJVTEVfSUQgKSApICk/ICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE3MTQ6MjogKCAoKSBvdGhlcmx2XzE9ICdtYXJrZXJFbnRpdHknICggKCBydWxlTEZRTiApICkgKCAoIChsdl9tYXJrTGF0ZXN0XzNfMD0gJ21hcmtlZEJ5JyApICkgKCAob3RoZXJsdl80PSBSVUxFX0lEICkgKSApPyApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNzE1OjM6ICgpIG90aGVybHZfMT0gJ21hcmtlckVudGl0eScgKCAoIHJ1bGVMRlFOICkgKSAoICggKGx2X21hcmtMYXRlc3RfM18wPSAnbWFya2VkQnknICkgKSAoIChvdGhlcmx2XzQ9IFJVTEVfSUQgKSApICk/CisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxODIzOjI6ICggKCkgb3RoZXJsdl8xPSAnbWFya2VyRW50aXR5JyAoICggcnVsZUxGUU4gKSApICggKCAobHZfbWFya0xhdGVzdF8zXzA9ICdtYXJrZWRCeScgKSApICggKG90aGVybHZfND0gUlVMRV9JRCApICkgKT8gKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTgyNDozOiAoKSBvdGhlcmx2XzE9ICdtYXJrZXJFbnRpdHknICggKCBydWxlTEZRTiApICkgKCAoIChsdl9tYXJrTGF0ZXN0XzNfMD0gJ21hcmtlZEJ5JyApICkgKCAob3RoZXJsdl80PSBSVUxFX0lEICkgKSApPwogICAgICAgICAgICAgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTcxNTozOiAoKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTcxNjo0OiAKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE4MjQ6MzogKCkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE4MjU6NDogCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKIApAQCAtNDU3MiwxNyArNDg2MiwxNyBAQAogCiAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgIG90aGVybHZfMT0oVG9rZW4pbWF0Y2goaW5wdXQsNTQsRk9MTE9XXzQpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gY3VycmVudDsKKyAgICAgICAgICAgIG90aGVybHZfMT0oVG9rZW4pbWF0Y2goaW5wdXQsNTgsRk9MTE9XXzQpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gY3VycmVudDsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogCiAgICAgICAgICAgICAgIAkJCW5ld0xlYWZOb2RlKG90aGVybHZfMSwgZ3JhbW1hckFjY2Vzcy5nZXREYXRhSW50ZXJjaGFuZ2VNYXJrZXJFbnRpdHlBY2Nlc3MoKS5nZXRNYXJrZXJFbnRpdHlLZXl3b3JkXzEoKSk7CiAgICAgICAgICAgICAgIAkJCiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNzI2OjM6ICggKCBydWxlTEZRTiApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE3Mjc6NDogKCBydWxlTEZRTiApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxODM1OjM6ICggKCBydWxlTEZRTiApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE4MzY6NDogKCBydWxlTEZRTiApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNzI3OjQ6ICggcnVsZUxGUU4gKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTcyODo1OiBydWxlTEZRTgorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTgzNjo0OiAoIHJ1bGVMRlFOICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE4Mzc6NTogcnVsZUxGUU4KICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogCkBAIC00NTk2LDcgKzQ4ODYsNyBAQAogICAgICAgICAgICAgICAJCQkJCW5ld0NvbXBvc2l0ZU5vZGUoZ3JhbW1hckFjY2Vzcy5nZXREYXRhSW50ZXJjaGFuZ2VNYXJrZXJFbnRpdHlBY2Nlc3MoKS5nZXRNYXJrZXJFbnRpdHlMRW50aXR5Q3Jvc3NSZWZlcmVuY2VfMl8wKCkpOwogICAgICAgICAgICAgICAJCQkJCiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV180Mik7CisgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV180OSk7CiAgICAgICAgICAgICBydWxlTEZRTigpOwogCiAgICAgICAgICAgICBzdGF0ZS5fZnNwLS07CkBAIC00NjEyLDI0ICs0OTAyLDI0IEBACiAKICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTc0MjozOiAoICggKGx2X21hcmtMYXRlc3RfM18wPSAnbWFya2VkQnknICkgKSAoIChvdGhlcmx2XzQ9IFJVTEVfSUQgKSApICk/Ci0gICAgICAgICAgICBpbnQgYWx0MzM9MjsKLSAgICAgICAgICAgIGludCBMQTMzXzAgPSBpbnB1dC5MQSgxKTsKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE4NTE6MzogKCAoIChsdl9tYXJrTGF0ZXN0XzNfMD0gJ21hcmtlZEJ5JyApICkgKCAob3RoZXJsdl80PSBSVUxFX0lEICkgKSApPworICAgICAgICAgICAgaW50IGFsdDM4PTI7CisgICAgICAgICAgICBpbnQgTEEzOF8wID0gaW5wdXQuTEEoMSk7CiAKLSAgICAgICAgICAgIGlmICggKExBMzNfMD09NTUpICkgewotICAgICAgICAgICAgICAgIGFsdDMzPTE7CisgICAgICAgICAgICBpZiAoIChMQTM4XzA9PTU5KSApIHsKKyAgICAgICAgICAgICAgICBhbHQzOD0xOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgc3dpdGNoIChhbHQzMykgeworICAgICAgICAgICAgc3dpdGNoIChhbHQzOCkgewogICAgICAgICAgICAgICAgIGNhc2UgMSA6Ci0gICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE3NDM6NDogKCAobHZfbWFya0xhdGVzdF8zXzA9ICdtYXJrZWRCeScgKSApICggKG90aGVybHZfND0gUlVMRV9JRCApICkKKyAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTg1Mjo0OiAoIChsdl9tYXJrTGF0ZXN0XzNfMD0gJ21hcmtlZEJ5JyApICkgKCAob3RoZXJsdl80PSBSVUxFX0lEICkgKQogICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE3NDM6NDogKCAobHZfbWFya0xhdGVzdF8zXzA9ICdtYXJrZWRCeScgKSApCi0gICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE3NDQ6NTogKGx2X21hcmtMYXRlc3RfM18wPSAnbWFya2VkQnknICkKKyAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTg1Mjo0OiAoIChsdl9tYXJrTGF0ZXN0XzNfMD0gJ21hcmtlZEJ5JyApICkKKyAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTg1Mzo1OiAobHZfbWFya0xhdGVzdF8zXzA9ICdtYXJrZWRCeScgKQogICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE3NDQ6NTogKGx2X21hcmtMYXRlc3RfM18wPSAnbWFya2VkQnknICkKLSAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTc0NTo2OiBsdl9tYXJrTGF0ZXN0XzNfMD0gJ21hcmtlZEJ5JworICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxODUzOjU6IChsdl9tYXJrTGF0ZXN0XzNfMD0gJ21hcmtlZEJ5JyApCisgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE4NTQ6NjogbHZfbWFya0xhdGVzdF8zXzA9ICdtYXJrZWRCeScKICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBsdl9tYXJrTGF0ZXN0XzNfMD0oVG9rZW4pbWF0Y2goaW5wdXQsNTUsRk9MTE9XXzQpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gY3VycmVudDsKKyAgICAgICAgICAgICAgICAgICAgbHZfbWFya0xhdGVzdF8zXzA9KFRva2VuKW1hdGNoKGlucHV0LDU5LEZPTExPV180KTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7CiAgICAgICAgICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogCiAgICAgICAgICAgICAgICAgICAgICAgCQkJCQkJbmV3TGVhZk5vZGUobHZfbWFya0xhdGVzdF8zXzAsIGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YUludGVyY2hhbmdlTWFya2VyRW50aXR5QWNjZXNzKCkuZ2V0TWFya0xhdGVzdE1hcmtlZEJ5S2V5d29yZF8zXzBfMCgpKTsKQEAgLTQ2NDksMTEgKzQ5MzksMTEgQEAKIAogICAgICAgICAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTc1Nzo0OiAoIChvdGhlcmx2XzQ9IFJVTEVfSUQgKSApCi0gICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE3NTg6NTogKG90aGVybHZfND0gUlVMRV9JRCApCisgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE4NjY6NDogKCAob3RoZXJsdl80PSBSVUxFX0lEICkgKQorICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxODY3OjU6IChvdGhlcmx2XzQ9IFJVTEVfSUQgKQogICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE3NTg6NTogKG90aGVybHZfND0gUlVMRV9JRCApCi0gICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE3NTk6Njogb3RoZXJsdl80PSBSVUxFX0lECisgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE4Njc6NTogKG90aGVybHZfND0gUlVMRV9JRCApCisgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE4Njg6Njogb3RoZXJsdl80PSBSVUxFX0lECiAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAKQEAgLTQ3MDUsNyArNDk5NSw3IEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAiZW50cnlSdWxlRGF0YUludGVyY2hhbmdlRm9ybWF0IgotICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE3NzU6MTogZW50cnlSdWxlRGF0YUludGVyY2hhbmdlRm9ybWF0IHJldHVybnMgW0VPYmplY3QgY3VycmVudD1udWxsXSA6IGl2X3J1bGVEYXRhSW50ZXJjaGFuZ2VGb3JtYXQ9IHJ1bGVEYXRhSW50ZXJjaGFuZ2VGb3JtYXQgRU9GIDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxODg0OjE6IGVudHJ5UnVsZURhdGFJbnRlcmNoYW5nZUZvcm1hdCByZXR1cm5zIFtFT2JqZWN0IGN1cnJlbnQ9bnVsbF0gOiBpdl9ydWxlRGF0YUludGVyY2hhbmdlRm9ybWF0PSBydWxlRGF0YUludGVyY2hhbmdlRm9ybWF0IEVPRiA7CiAgICAgcHVibGljIGZpbmFsIEVPYmplY3QgZW50cnlSdWxlRGF0YUludGVyY2hhbmdlRm9ybWF0KCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKICAgICAgICAgRU9iamVjdCBjdXJyZW50ID0gbnVsbDsKIApAQCAtNDcxMyw4ICs1MDAzLDggQEAKIAogCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNzc1OjYyOiAoaXZfcnVsZURhdGFJbnRlcmNoYW5nZUZvcm1hdD0gcnVsZURhdGFJbnRlcmNoYW5nZUZvcm1hdCBFT0YgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTc3NjoyOiBpdl9ydWxlRGF0YUludGVyY2hhbmdlRm9ybWF0PSBydWxlRGF0YUludGVyY2hhbmdlRm9ybWF0IEVPRgorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTg4NDo2MjogKGl2X3J1bGVEYXRhSW50ZXJjaGFuZ2VGb3JtYXQ9IHJ1bGVEYXRhSW50ZXJjaGFuZ2VGb3JtYXQgRU9GICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE4ODU6MjogaXZfcnVsZURhdGFJbnRlcmNoYW5nZUZvcm1hdD0gcnVsZURhdGFJbnRlcmNoYW5nZUZvcm1hdCBFT0YKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgbmV3Q29tcG9zaXRlTm9kZShncmFtbWFyQWNjZXNzLmdldERhdGFJbnRlcmNoYW5nZUZvcm1hdFJ1bGUoKSk7IApAQCAtNDc0NSw3ICs1MDM1LDcgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlRGF0YUludGVyY2hhbmdlRm9ybWF0IgotICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE3ODI6MTogcnVsZURhdGFJbnRlcmNoYW5nZUZvcm1hdCByZXR1cm5zIFtFT2JqZWN0IGN1cnJlbnQ9bnVsbF0gOiAoICgpIG90aGVybHZfMT0gJ2ZvcicgKCAob3RoZXJsdl8yPSBSVUxFX0lEICkgKSBvdGhlcmx2XzM9ICdjb2RpbmcnICggKGx2X2Zvcm1hdF80XzA9IFJVTEVfU1RSSU5HICkgKSApIDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxODkxOjE6IHJ1bGVEYXRhSW50ZXJjaGFuZ2VGb3JtYXQgcmV0dXJucyBbRU9iamVjdCBjdXJyZW50PW51bGxdIDogKCAoKSBvdGhlcmx2XzE9ICdmb3InICggKG90aGVybHZfMj0gUlVMRV9JRCApICkgb3RoZXJsdl8zPSAnY29kaW5nJyAoIChsdl9mb3JtYXRfNF8wPSBSVUxFX1NUUklORyApICkgKSA7CiAgICAgcHVibGljIGZpbmFsIEVPYmplY3QgcnVsZURhdGFJbnRlcmNoYW5nZUZvcm1hdCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAgICAgICAgIEVPYmplY3QgY3VycmVudCA9IG51bGw7CiAKQEAgLTQ3NTgsMTQgKzUwNDgsMTQgQEAKICAgICAgICAgCWVudGVyUnVsZSgpOwogCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNzg4OjI6ICggKCAoKSBvdGhlcmx2XzE9ICdmb3InICggKG90aGVybHZfMj0gUlVMRV9JRCApICkgb3RoZXJsdl8zPSAnY29kaW5nJyAoIChsdl9mb3JtYXRfNF8wPSBSVUxFX1NUUklORyApICkgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNzg5OjI6ICggKCkgb3RoZXJsdl8xPSAnZm9yJyAoIChvdGhlcmx2XzI9IFJVTEVfSUQgKSApIG90aGVybHZfMz0gJ2NvZGluZycgKCAobHZfZm9ybWF0XzRfMD0gUlVMRV9TVFJJTkcgKSApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE4OTc6MjogKCAoICgpIG90aGVybHZfMT0gJ2ZvcicgKCAob3RoZXJsdl8yPSBSVUxFX0lEICkgKSBvdGhlcmx2XzM9ICdjb2RpbmcnICggKGx2X2Zvcm1hdF80XzA9IFJVTEVfU1RSSU5HICkgKSApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE4OTg6MjogKCAoKSBvdGhlcmx2XzE9ICdmb3InICggKG90aGVybHZfMj0gUlVMRV9JRCApICkgb3RoZXJsdl8zPSAnY29kaW5nJyAoIChsdl9mb3JtYXRfNF8wPSBSVUxFX1NUUklORyApICkgKQogICAgICAgICAgICAgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTc4OToyOiAoICgpIG90aGVybHZfMT0gJ2ZvcicgKCAob3RoZXJsdl8yPSBSVUxFX0lEICkgKSBvdGhlcmx2XzM9ICdjb2RpbmcnICggKGx2X2Zvcm1hdF80XzA9IFJVTEVfU1RSSU5HICkgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxNzkwOjM6ICgpIG90aGVybHZfMT0gJ2ZvcicgKCAob3RoZXJsdl8yPSBSVUxFX0lEICkgKSBvdGhlcmx2XzM9ICdjb2RpbmcnICggKGx2X2Zvcm1hdF80XzA9IFJVTEVfU1RSSU5HICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTg5ODoyOiAoICgpIG90aGVybHZfMT0gJ2ZvcicgKCAob3RoZXJsdl8yPSBSVUxFX0lEICkgKSBvdGhlcmx2XzM9ICdjb2RpbmcnICggKGx2X2Zvcm1hdF80XzA9IFJVTEVfU1RSSU5HICkgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxODk5OjM6ICgpIG90aGVybHZfMT0gJ2ZvcicgKCAob3RoZXJsdl8yPSBSVUxFX0lEICkgKSBvdGhlcmx2XzM9ICdjb2RpbmcnICggKGx2X2Zvcm1hdF80XzA9IFJVTEVfU1RSSU5HICkgKQogICAgICAgICAgICAgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTc5MDozOiAoKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTc5MTo0OiAKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE4OTk6MzogKCkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE5MDA6NDogCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKIApAQCAtNDc3NywxNyArNTA2NywxNyBAQAogCiAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgIG90aGVybHZfMT0oVG9rZW4pbWF0Y2goaW5wdXQsNDYsRk9MTE9XXzQpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gY3VycmVudDsKKyAgICAgICAgICAgIG90aGVybHZfMT0oVG9rZW4pbWF0Y2goaW5wdXQsNTAsRk9MTE9XXzQpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gY3VycmVudDsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogCiAgICAgICAgICAgICAgIAkJCW5ld0xlYWZOb2RlKG90aGVybHZfMSwgZ3JhbW1hckFjY2Vzcy5nZXREYXRhSW50ZXJjaGFuZ2VGb3JtYXRBY2Nlc3MoKS5nZXRGb3JLZXl3b3JkXzEoKSk7CiAgICAgICAgICAgICAgIAkJCiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxODAxOjM6ICggKG90aGVybHZfMj0gUlVMRV9JRCApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE4MDI6NDogKG90aGVybHZfMj0gUlVMRV9JRCApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxOTEwOjM6ICggKG90aGVybHZfMj0gUlVMRV9JRCApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE5MTE6NDogKG90aGVybHZfMj0gUlVMRV9JRCApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxODAyOjQ6IChvdGhlcmx2XzI9IFJVTEVfSUQgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTgwMzo1OiBvdGhlcmx2XzI9IFJVTEVfSUQKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE5MTE6NDogKG90aGVybHZfMj0gUlVMRV9JRCApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxOTEyOjU6IG90aGVybHZfMj0gUlVMRV9JRAogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAKQEAgLTQ3OTYsNyArNTA4Niw3IEBACiAgICAgICAgICAgICAgIAkJCQkJfQogICAgICAgICAgICAgICAJCQkJCiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBvdGhlcmx2XzI9KFRva2VuKW1hdGNoKGlucHV0LFJVTEVfSUQsRk9MTE9XXzQzKTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7CisgICAgICAgICAgICBvdGhlcmx2XzI9KFRva2VuKW1hdGNoKGlucHV0LFJVTEVfSUQsRk9MTE9XXzUwKTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKIAogICAgICAgICAgICAgICAJCQkJCW5ld0xlYWZOb2RlKG90aGVybHZfMiwgZ3JhbW1hckFjY2Vzcy5nZXREYXRhSW50ZXJjaGFuZ2VGb3JtYXRBY2Nlc3MoKS5nZXRUYXJnZXRQcm9wZXJ0eUxFbnRpdHlBdHRyaWJ1dGVDcm9zc1JlZmVyZW5jZV8yXzAoKSk7CkBAIC00ODA4LDE3ICs1MDk4LDE3IEBACiAKICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgb3RoZXJsdl8zPShUb2tlbiltYXRjaChpbnB1dCw1NixGT0xMT1dfNik7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OworICAgICAgICAgICAgb3RoZXJsdl8zPShUb2tlbiltYXRjaChpbnB1dCw2MCxGT0xMT1dfNik7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OwogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAKICAgICAgICAgICAgICAgCQkJbmV3TGVhZk5vZGUob3RoZXJsdl8zLCBncmFtbWFyQWNjZXNzLmdldERhdGFJbnRlcmNoYW5nZUZvcm1hdEFjY2VzcygpLmdldENvZGluZ0tleXdvcmRfMygpKTsKICAgICAgICAgICAgICAgCQkKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE4MTg6MzogKCAobHZfZm9ybWF0XzRfMD0gUlVMRV9TVFJJTkcgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxODE5OjQ6IChsdl9mb3JtYXRfNF8wPSBSVUxFX1NUUklORyApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxOTI3OjM6ICggKGx2X2Zvcm1hdF80XzA9IFJVTEVfU1RSSU5HICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTkyODo0OiAobHZfZm9ybWF0XzRfMD0gUlVMRV9TVFJJTkcgKQogICAgICAgICAgICAgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTgxOTo0OiAobHZfZm9ybWF0XzRfMD0gUlVMRV9TVFJJTkcgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTgyMDo1OiBsdl9mb3JtYXRfNF8wPSBSVUxFX1NUUklORworICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTkyODo0OiAobHZfZm9ybWF0XzRfMD0gUlVMRV9TVFJJTkcgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTkyOTo1OiBsdl9mb3JtYXRfNF8wPSBSVUxFX1NUUklORwogICAgICAgICAgICAgewogICAgICAgICAgICAgbHZfZm9ybWF0XzRfMD0oVG9rZW4pbWF0Y2goaW5wdXQsUlVMRV9TVFJJTkcsRk9MTE9XXzIpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gY3VycmVudDsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewpAQCAtNDg2OSw3ICs1MTU5LDcgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJlbnRyeVJ1bGVEYXRhSW50ZXJjaGFuZ2VFeHByZXNzaW9uIgotICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE4NDA6MTogZW50cnlSdWxlRGF0YUludGVyY2hhbmdlRXhwcmVzc2lvbiByZXR1cm5zIFtFT2JqZWN0IGN1cnJlbnQ9bnVsbF0gOiBpdl9ydWxlRGF0YUludGVyY2hhbmdlRXhwcmVzc2lvbj0gcnVsZURhdGFJbnRlcmNoYW5nZUV4cHJlc3Npb24gRU9GIDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxOTQ5OjE6IGVudHJ5UnVsZURhdGFJbnRlcmNoYW5nZUV4cHJlc3Npb24gcmV0dXJucyBbRU9iamVjdCBjdXJyZW50PW51bGxdIDogaXZfcnVsZURhdGFJbnRlcmNoYW5nZUV4cHJlc3Npb249IHJ1bGVEYXRhSW50ZXJjaGFuZ2VFeHByZXNzaW9uIEVPRiA7CiAgICAgcHVibGljIGZpbmFsIEVPYmplY3QgZW50cnlSdWxlRGF0YUludGVyY2hhbmdlRXhwcmVzc2lvbigpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAgICAgICAgIEVPYmplY3QgY3VycmVudCA9IG51bGw7CiAKQEAgLTQ4NzcsOCArNTE2Nyw4IEBACiAKIAogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTg0MDo2NjogKGl2X3J1bGVEYXRhSW50ZXJjaGFuZ2VFeHByZXNzaW9uPSBydWxlRGF0YUludGVyY2hhbmdlRXhwcmVzc2lvbiBFT0YgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTg0MToyOiBpdl9ydWxlRGF0YUludGVyY2hhbmdlRXhwcmVzc2lvbj0gcnVsZURhdGFJbnRlcmNoYW5nZUV4cHJlc3Npb24gRU9GCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxOTQ5OjY2OiAoaXZfcnVsZURhdGFJbnRlcmNoYW5nZUV4cHJlc3Npb249IHJ1bGVEYXRhSW50ZXJjaGFuZ2VFeHByZXNzaW9uIEVPRiApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxOTUwOjI6IGl2X3J1bGVEYXRhSW50ZXJjaGFuZ2VFeHByZXNzaW9uPSBydWxlRGF0YUludGVyY2hhbmdlRXhwcmVzc2lvbiBFT0YKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgbmV3Q29tcG9zaXRlTm9kZShncmFtbWFyQWNjZXNzLmdldERhdGFJbnRlcmNoYW5nZUV4cHJlc3Npb25SdWxlKCkpOyAKQEAgLTQ5MDksNyArNTE5OSw3IEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZURhdGFJbnRlcmNoYW5nZUV4cHJlc3Npb24iCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTg0NzoxOiBydWxlRGF0YUludGVyY2hhbmdlRXhwcmVzc2lvbiByZXR1cm5zIFtFT2JqZWN0IGN1cnJlbnQ9bnVsbF0gOiAodGhpc19EYXRhSW50ZXJjaGFuZ2VFbnRpdHlFeHByZXNzaW9uXzA9IHJ1bGVEYXRhSW50ZXJjaGFuZ2VFbnRpdHlFeHByZXNzaW9uIHwgdGhpc19EYXRhSW50ZXJjaGFuZ2VQcmVkZWZpbmVkRXhwcmVzc2lvbl8xPSBydWxlRGF0YUludGVyY2hhbmdlUHJlZGVmaW5lZEV4cHJlc3Npb24gKSA7CisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTk1NjoxOiBydWxlRGF0YUludGVyY2hhbmdlRXhwcmVzc2lvbiByZXR1cm5zIFtFT2JqZWN0IGN1cnJlbnQ9bnVsbF0gOiAodGhpc19EYXRhSW50ZXJjaGFuZ2VFbnRpdHlFeHByZXNzaW9uXzA9IHJ1bGVEYXRhSW50ZXJjaGFuZ2VFbnRpdHlFeHByZXNzaW9uIHwgdGhpc19EYXRhSW50ZXJjaGFuZ2VQcmVkZWZpbmVkRXhwcmVzc2lvbl8xPSBydWxlRGF0YUludGVyY2hhbmdlUHJlZGVmaW5lZEV4cHJlc3Npb24gKSA7CiAgICAgcHVibGljIGZpbmFsIEVPYmplY3QgcnVsZURhdGFJbnRlcmNoYW5nZUV4cHJlc3Npb24oKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogICAgICAgICBFT2JqZWN0IGN1cnJlbnQgPSBudWxsOwogCkBAIC00OTIyLDI5ICs1MjEyLDI5IEBACiAgICAgICAgIAllbnRlclJ1bGUoKTsKIAogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTg1MzoyOiAoICh0aGlzX0RhdGFJbnRlcmNoYW5nZUVudGl0eUV4cHJlc3Npb25fMD0gcnVsZURhdGFJbnRlcmNoYW5nZUVudGl0eUV4cHJlc3Npb24gfCB0aGlzX0RhdGFJbnRlcmNoYW5nZVByZWRlZmluZWRFeHByZXNzaW9uXzE9IHJ1bGVEYXRhSW50ZXJjaGFuZ2VQcmVkZWZpbmVkRXhwcmVzc2lvbiApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE4NTQ6MjogKHRoaXNfRGF0YUludGVyY2hhbmdlRW50aXR5RXhwcmVzc2lvbl8wPSBydWxlRGF0YUludGVyY2hhbmdlRW50aXR5RXhwcmVzc2lvbiB8IHRoaXNfRGF0YUludGVyY2hhbmdlUHJlZGVmaW5lZEV4cHJlc3Npb25fMT0gcnVsZURhdGFJbnRlcmNoYW5nZVByZWRlZmluZWRFeHByZXNzaW9uICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE5NjI6MjogKCAodGhpc19EYXRhSW50ZXJjaGFuZ2VFbnRpdHlFeHByZXNzaW9uXzA9IHJ1bGVEYXRhSW50ZXJjaGFuZ2VFbnRpdHlFeHByZXNzaW9uIHwgdGhpc19EYXRhSW50ZXJjaGFuZ2VQcmVkZWZpbmVkRXhwcmVzc2lvbl8xPSBydWxlRGF0YUludGVyY2hhbmdlUHJlZGVmaW5lZEV4cHJlc3Npb24gKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxOTYzOjI6ICh0aGlzX0RhdGFJbnRlcmNoYW5nZUVudGl0eUV4cHJlc3Npb25fMD0gcnVsZURhdGFJbnRlcmNoYW5nZUVudGl0eUV4cHJlc3Npb24gfCB0aGlzX0RhdGFJbnRlcmNoYW5nZVByZWRlZmluZWRFeHByZXNzaW9uXzE9IHJ1bGVEYXRhSW50ZXJjaGFuZ2VQcmVkZWZpbmVkRXhwcmVzc2lvbiApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxODU0OjI6ICh0aGlzX0RhdGFJbnRlcmNoYW5nZUVudGl0eUV4cHJlc3Npb25fMD0gcnVsZURhdGFJbnRlcmNoYW5nZUVudGl0eUV4cHJlc3Npb24gfCB0aGlzX0RhdGFJbnRlcmNoYW5nZVByZWRlZmluZWRFeHByZXNzaW9uXzE9IHJ1bGVEYXRhSW50ZXJjaGFuZ2VQcmVkZWZpbmVkRXhwcmVzc2lvbiApCi0gICAgICAgICAgICBpbnQgYWx0MzQ9MjsKLSAgICAgICAgICAgIGludCBMQTM0XzAgPSBpbnB1dC5MQSgxKTsKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE5NjM6MjogKHRoaXNfRGF0YUludGVyY2hhbmdlRW50aXR5RXhwcmVzc2lvbl8wPSBydWxlRGF0YUludGVyY2hhbmdlRW50aXR5RXhwcmVzc2lvbiB8IHRoaXNfRGF0YUludGVyY2hhbmdlUHJlZGVmaW5lZEV4cHJlc3Npb25fMT0gcnVsZURhdGFJbnRlcmNoYW5nZVByZWRlZmluZWRFeHByZXNzaW9uICkKKyAgICAgICAgICAgIGludCBhbHQzOT0yOworICAgICAgICAgICAgaW50IExBMzlfMCA9IGlucHV0LkxBKDEpOwogCi0gICAgICAgICAgICBpZiAoIChMQTM0XzA9PTU3KSApIHsKLSAgICAgICAgICAgICAgICBhbHQzND0xOworICAgICAgICAgICAgaWYgKCAoTEEzOV8wPT02MSkgKSB7CisgICAgICAgICAgICAgICAgYWx0Mzk9MTsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgaWYgKCAoTEEzNF8wPT02MCkgKSB7Ci0gICAgICAgICAgICAgICAgYWx0MzQ9MjsKKyAgICAgICAgICAgIGVsc2UgaWYgKCAoTEEzOV8wPT02NykgKSB7CisgICAgICAgICAgICAgICAgYWx0Mzk9MjsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgIGlmIChzdGF0ZS5iYWNrdHJhY2tpbmc+MCkge3N0YXRlLmZhaWxlZD10cnVlOyByZXR1cm4gY3VycmVudDt9CiAgICAgICAgICAgICAgICAgTm9WaWFibGVBbHRFeGNlcHRpb24gbnZhZSA9Ci0gICAgICAgICAgICAgICAgICAgIG5ldyBOb1ZpYWJsZUFsdEV4Y2VwdGlvbigiIiwgMzQsIDAsIGlucHV0KTsKKyAgICAgICAgICAgICAgICAgICAgbmV3IE5vVmlhYmxlQWx0RXhjZXB0aW9uKCIiLCAzOSwgMCwgaW5wdXQpOwogCiAgICAgICAgICAgICAgICAgdGhyb3cgbnZhZTsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHN3aXRjaCAoYWx0MzQpIHsKKyAgICAgICAgICAgIHN3aXRjaCAoYWx0MzkpIHsKICAgICAgICAgICAgICAgICBjYXNlIDEgOgotICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxODU1OjM6IHRoaXNfRGF0YUludGVyY2hhbmdlRW50aXR5RXhwcmVzc2lvbl8wPSBydWxlRGF0YUludGVyY2hhbmdlRW50aXR5RXhwcmVzc2lvbgorICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxOTY0OjM6IHRoaXNfRGF0YUludGVyY2hhbmdlRW50aXR5RXhwcmVzc2lvbl8wPSBydWxlRGF0YUludGVyY2hhbmdlRW50aXR5RXhwcmVzc2lvbgogICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogCkBAIC00OTY2LDcgKzUyNTYsNyBAQAogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgIGNhc2UgMiA6Ci0gICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE4NjQ6MzogdGhpc19EYXRhSW50ZXJjaGFuZ2VQcmVkZWZpbmVkRXhwcmVzc2lvbl8xPSBydWxlRGF0YUludGVyY2hhbmdlUHJlZGVmaW5lZEV4cHJlc3Npb24KKyAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTk3MzozOiB0aGlzX0RhdGFJbnRlcmNoYW5nZVByZWRlZmluZWRFeHByZXNzaW9uXzE9IHJ1bGVEYXRhSW50ZXJjaGFuZ2VQcmVkZWZpbmVkRXhwcmVzc2lvbgogICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogCkBAIC01MDEyLDcgKzUzMDIsNyBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgImVudHJ5UnVsZURhdGFJbnRlcmNoYW5nZUVudGl0eUV4cHJlc3Npb24iCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTg3NjoxOiBlbnRyeVJ1bGVEYXRhSW50ZXJjaGFuZ2VFbnRpdHlFeHByZXNzaW9uIHJldHVybnMgW0VPYmplY3QgY3VycmVudD1udWxsXSA6IGl2X3J1bGVEYXRhSW50ZXJjaGFuZ2VFbnRpdHlFeHByZXNzaW9uPSBydWxlRGF0YUludGVyY2hhbmdlRW50aXR5RXhwcmVzc2lvbiBFT0YgOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE5ODU6MTogZW50cnlSdWxlRGF0YUludGVyY2hhbmdlRW50aXR5RXhwcmVzc2lvbiByZXR1cm5zIFtFT2JqZWN0IGN1cnJlbnQ9bnVsbF0gOiBpdl9ydWxlRGF0YUludGVyY2hhbmdlRW50aXR5RXhwcmVzc2lvbj0gcnVsZURhdGFJbnRlcmNoYW5nZUVudGl0eUV4cHJlc3Npb24gRU9GIDsKICAgICBwdWJsaWMgZmluYWwgRU9iamVjdCBlbnRyeVJ1bGVEYXRhSW50ZXJjaGFuZ2VFbnRpdHlFeHByZXNzaW9uKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKICAgICAgICAgRU9iamVjdCBjdXJyZW50ID0gbnVsbDsKIApAQCAtNTAyMCw4ICs1MzEwLDggQEAKIAogCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxODc2OjcyOiAoaXZfcnVsZURhdGFJbnRlcmNoYW5nZUVudGl0eUV4cHJlc3Npb249IHJ1bGVEYXRhSW50ZXJjaGFuZ2VFbnRpdHlFeHByZXNzaW9uIEVPRiApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxODc3OjI6IGl2X3J1bGVEYXRhSW50ZXJjaGFuZ2VFbnRpdHlFeHByZXNzaW9uPSBydWxlRGF0YUludGVyY2hhbmdlRW50aXR5RXhwcmVzc2lvbiBFT0YKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE5ODU6NzI6IChpdl9ydWxlRGF0YUludGVyY2hhbmdlRW50aXR5RXhwcmVzc2lvbj0gcnVsZURhdGFJbnRlcmNoYW5nZUVudGl0eUV4cHJlc3Npb24gRU9GICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE5ODY6MjogaXZfcnVsZURhdGFJbnRlcmNoYW5nZUVudGl0eUV4cHJlc3Npb249IHJ1bGVEYXRhSW50ZXJjaGFuZ2VFbnRpdHlFeHByZXNzaW9uIEVPRgogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBuZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YUludGVyY2hhbmdlRW50aXR5RXhwcmVzc2lvblJ1bGUoKSk7IApAQCAtNTA1Miw3ICs1MzQyLDcgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlRGF0YUludGVyY2hhbmdlRW50aXR5RXhwcmVzc2lvbiIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxODgzOjE6IHJ1bGVEYXRhSW50ZXJjaGFuZ2VFbnRpdHlFeHByZXNzaW9uIHJldHVybnMgW0VPYmplY3QgY3VycmVudD1udWxsXSA6ICggKCkgb3RoZXJsdl8xPSAnY29weScgKCAob3RoZXJsdl8yPSBSVUxFX0lEICkgKSBvdGhlcmx2XzM9ICdmcm9tJyAoICggcnVsZUxGUU4gKSApIG90aGVybHZfNT0gJ3Byb3BlcnR5JyAoIChvdGhlcmx2XzY9IFJVTEVfSUQgKSApICkgOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE5OTI6MTogcnVsZURhdGFJbnRlcmNoYW5nZUVudGl0eUV4cHJlc3Npb24gcmV0dXJucyBbRU9iamVjdCBjdXJyZW50PW51bGxdIDogKCAoKSBvdGhlcmx2XzE9ICdjb3B5JyAoIChvdGhlcmx2XzI9IFJVTEVfSUQgKSApIG90aGVybHZfMz0gJ2Zyb20nICggKCBydWxlTEZRTiApICkgb3RoZXJsdl81PSAncHJvcGVydHknICggKG90aGVybHZfNj0gUlVMRV9JRCApICkgKSA7CiAgICAgcHVibGljIGZpbmFsIEVPYmplY3QgcnVsZURhdGFJbnRlcmNoYW5nZUVudGl0eUV4cHJlc3Npb24oKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogICAgICAgICBFT2JqZWN0IGN1cnJlbnQgPSBudWxsOwogCkBAIC01MDY2LDE0ICs1MzU2LDE0IEBACiAgICAgICAgIAllbnRlclJ1bGUoKTsKIAogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTg4OToyOiAoICggKCkgb3RoZXJsdl8xPSAnY29weScgKCAob3RoZXJsdl8yPSBSVUxFX0lEICkgKSBvdGhlcmx2XzM9ICdmcm9tJyAoICggcnVsZUxGUU4gKSApIG90aGVybHZfNT0gJ3Byb3BlcnR5JyAoIChvdGhlcmx2XzY9IFJVTEVfSUQgKSApICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTg5MDoyOiAoICgpIG90aGVybHZfMT0gJ2NvcHknICggKG90aGVybHZfMj0gUlVMRV9JRCApICkgb3RoZXJsdl8zPSAnZnJvbScgKCAoIHJ1bGVMRlFOICkgKSBvdGhlcmx2XzU9ICdwcm9wZXJ0eScgKCAob3RoZXJsdl82PSBSVUxFX0lEICkgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxOTk4OjI6ICggKCAoKSBvdGhlcmx2XzE9ICdjb3B5JyAoIChvdGhlcmx2XzI9IFJVTEVfSUQgKSApIG90aGVybHZfMz0gJ2Zyb20nICggKCBydWxlTEZRTiApICkgb3RoZXJsdl81PSAncHJvcGVydHknICggKG90aGVybHZfNj0gUlVMRV9JRCApICkgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxOTk5OjI6ICggKCkgb3RoZXJsdl8xPSAnY29weScgKCAob3RoZXJsdl8yPSBSVUxFX0lEICkgKSBvdGhlcmx2XzM9ICdmcm9tJyAoICggcnVsZUxGUU4gKSApIG90aGVybHZfNT0gJ3Byb3BlcnR5JyAoIChvdGhlcmx2XzY9IFJVTEVfSUQgKSApICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE4OTA6MjogKCAoKSBvdGhlcmx2XzE9ICdjb3B5JyAoIChvdGhlcmx2XzI9IFJVTEVfSUQgKSApIG90aGVybHZfMz0gJ2Zyb20nICggKCBydWxlTEZRTiApICkgb3RoZXJsdl81PSAncHJvcGVydHknICggKG90aGVybHZfNj0gUlVMRV9JRCApICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTg5MTozOiAoKSBvdGhlcmx2XzE9ICdjb3B5JyAoIChvdGhlcmx2XzI9IFJVTEVfSUQgKSApIG90aGVybHZfMz0gJ2Zyb20nICggKCBydWxlTEZRTiApICkgb3RoZXJsdl81PSAncHJvcGVydHknICggKG90aGVybHZfNj0gUlVMRV9JRCApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE5OTk6MjogKCAoKSBvdGhlcmx2XzE9ICdjb3B5JyAoIChvdGhlcmx2XzI9IFJVTEVfSUQgKSApIG90aGVybHZfMz0gJ2Zyb20nICggKCBydWxlTEZRTiApICkgb3RoZXJsdl81PSAncHJvcGVydHknICggKG90aGVybHZfNj0gUlVMRV9JRCApICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjAwMDozOiAoKSBvdGhlcmx2XzE9ICdjb3B5JyAoIChvdGhlcmx2XzI9IFJVTEVfSUQgKSApIG90aGVybHZfMz0gJ2Zyb20nICggKCBydWxlTEZRTiApICkgb3RoZXJsdl81PSAncHJvcGVydHknICggKG90aGVybHZfNj0gUlVMRV9JRCApICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE4OTE6MzogKCkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE4OTI6NDogCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMDAwOjM6ICgpCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMDAxOjQ6IAogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAKQEAgLTUwODUsMTcgKzUzNzUsMTcgQEAKIAogICAgICAgICAgICAgfQogCi0gICAgICAgICAgICBvdGhlcmx2XzE9KFRva2VuKW1hdGNoKGlucHV0LDU3LEZPTExPV180KTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7CisgICAgICAgICAgICBvdGhlcmx2XzE9KFRva2VuKW1hdGNoKGlucHV0LDYxLEZPTExPV180KTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKIAogICAgICAgICAgICAgICAJCQluZXdMZWFmTm9kZShvdGhlcmx2XzEsIGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YUludGVyY2hhbmdlRW50aXR5RXhwcmVzc2lvbkFjY2VzcygpLmdldENvcHlLZXl3b3JkXzEoKSk7CiAgICAgICAgICAgICAgIAkJCiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxOTAyOjM6ICggKG90aGVybHZfMj0gUlVMRV9JRCApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE5MDM6NDogKG90aGVybHZfMj0gUlVMRV9JRCApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMDExOjM6ICggKG90aGVybHZfMj0gUlVMRV9JRCApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIwMTI6NDogKG90aGVybHZfMj0gUlVMRV9JRCApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxOTAzOjQ6IChvdGhlcmx2XzI9IFJVTEVfSUQgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTkwNDo1OiBvdGhlcmx2XzI9IFJVTEVfSUQKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIwMTI6NDogKG90aGVybHZfMj0gUlVMRV9JRCApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMDEzOjU6IG90aGVybHZfMj0gUlVMRV9JRAogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAKQEAgLTUxMDQsNyArNTM5NCw3IEBACiAgICAgICAgICAgICAgIAkJCQkJfQogICAgICAgICAgICAgICAJCQkJCiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBvdGhlcmx2XzI9KFRva2VuKW1hdGNoKGlucHV0LFJVTEVfSUQsRk9MTE9XXzQ0KTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7CisgICAgICAgICAgICBvdGhlcmx2XzI9KFRva2VuKW1hdGNoKGlucHV0LFJVTEVfSUQsRk9MTE9XXzUxKTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKIAogICAgICAgICAgICAgICAJCQkJCW5ld0xlYWZOb2RlKG90aGVybHZfMiwgZ3JhbW1hckFjY2Vzcy5nZXREYXRhSW50ZXJjaGFuZ2VFbnRpdHlFeHByZXNzaW9uQWNjZXNzKCkuZ2V0VGFyZ2V0UHJvcGVydHlMRW50aXR5QXR0cmlidXRlQ3Jvc3NSZWZlcmVuY2VfMl8wKCkpOwpAQCAtNTExNiwxNyArNTQwNiwxNyBAQAogCiAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgIG90aGVybHZfMz0oVG9rZW4pbWF0Y2goaW5wdXQsNTgsRk9MTE9XXzQpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gY3VycmVudDsKKyAgICAgICAgICAgIG90aGVybHZfMz0oVG9rZW4pbWF0Y2goaW5wdXQsNjIsRk9MTE9XXzQpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gY3VycmVudDsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogCiAgICAgICAgICAgICAgIAkJCW5ld0xlYWZOb2RlKG90aGVybHZfMywgZ3JhbW1hckFjY2Vzcy5nZXREYXRhSW50ZXJjaGFuZ2VFbnRpdHlFeHByZXNzaW9uQWNjZXNzKCkuZ2V0RnJvbUtleXdvcmRfMygpKTsKICAgICAgICAgICAgICAgCQkKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE5MTk6MzogKCAoIHJ1bGVMRlFOICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTkyMDo0OiAoIHJ1bGVMRlFOICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIwMjg6MzogKCAoIHJ1bGVMRlFOICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjAyOTo0OiAoIHJ1bGVMRlFOICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE5MjA6NDogKCBydWxlTEZRTiApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxOTIxOjU6IHJ1bGVMRlFOCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMDI5OjQ6ICggcnVsZUxGUU4gKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjAzMDo1OiBydWxlTEZRTgogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAKQEAgLTUxNDAsNyArNTQzMCw3IEBACiAgICAgICAgICAgICAgIAkJCQkJbmV3Q29tcG9zaXRlTm9kZShncmFtbWFyQWNjZXNzLmdldERhdGFJbnRlcmNoYW5nZUVudGl0eUV4cHJlc3Npb25BY2Nlc3MoKS5nZXRFbnRpdHlMRW50aXR5Q3Jvc3NSZWZlcmVuY2VfNF8wKCkpOwogICAgICAgICAgICAgICAJCQkJCiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV180NSk7CisgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV181Mik7CiAgICAgICAgICAgICBydWxlTEZRTigpOwogCiAgICAgICAgICAgICBzdGF0ZS5fZnNwLS07CkBAIC01MTU2LDE3ICs1NDQ2LDE3IEBACiAKICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgb3RoZXJsdl81PShUb2tlbiltYXRjaChpbnB1dCw1OSxGT0xMT1dfNCk7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OworICAgICAgICAgICAgb3RoZXJsdl81PShUb2tlbiltYXRjaChpbnB1dCw2MyxGT0xMT1dfNCk7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OwogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAKICAgICAgICAgICAgICAgCQkJbmV3TGVhZk5vZGUob3RoZXJsdl81LCBncmFtbWFyQWNjZXNzLmdldERhdGFJbnRlcmNoYW5nZUVudGl0eUV4cHJlc3Npb25BY2Nlc3MoKS5nZXRQcm9wZXJ0eUtleXdvcmRfNSgpKTsKICAgICAgICAgICAgICAgCQkKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE5Mzk6MzogKCAob3RoZXJsdl82PSBSVUxFX0lEICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTk0MDo0OiAob3RoZXJsdl82PSBSVUxFX0lEICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIwNDg6MzogKCAob3RoZXJsdl82PSBSVUxFX0lEICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjA0OTo0OiAob3RoZXJsdl82PSBSVUxFX0lEICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE5NDA6NDogKG90aGVybHZfNj0gUlVMRV9JRCApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxOTQxOjU6IG90aGVybHZfNj0gUlVMRV9JRAorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjA0OTo0OiAob3RoZXJsdl82PSBSVUxFX0lEICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIwNTA6NTogb3RoZXJsdl82PSBSVUxFX0lECiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKIApAQCAtNTIxMSw4ICs1NTAxLDkxMiBAQAogICAgIC8vICRBTlRMUiBlbmQgInJ1bGVEYXRhSW50ZXJjaGFuZ2VFbnRpdHlFeHByZXNzaW9uIgogCiAKKyAgICAvLyAkQU5UTFIgc3RhcnQgImVudHJ5UnVsZURhdGFJbnRlcmNoYW5nZUV4cG9zZSIKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMDY1OjE6IGVudHJ5UnVsZURhdGFJbnRlcmNoYW5nZUV4cG9zZSByZXR1cm5zIFtFT2JqZWN0IGN1cnJlbnQ9bnVsbF0gOiBpdl9ydWxlRGF0YUludGVyY2hhbmdlRXhwb3NlPSBydWxlRGF0YUludGVyY2hhbmdlRXhwb3NlIEVPRiA7CisgICAgcHVibGljIGZpbmFsIEVPYmplY3QgZW50cnlSdWxlRGF0YUludGVyY2hhbmdlRXhwb3NlKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgRU9iamVjdCBjdXJyZW50ID0gbnVsbDsKKworICAgICAgICBFT2JqZWN0IGl2X3J1bGVEYXRhSW50ZXJjaGFuZ2VFeHBvc2UgPSBudWxsOworCisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIwNjU6NjI6IChpdl9ydWxlRGF0YUludGVyY2hhbmdlRXhwb3NlPSBydWxlRGF0YUludGVyY2hhbmdlRXhwb3NlIEVPRiApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMDY2OjI6IGl2X3J1bGVEYXRhSW50ZXJjaGFuZ2VFeHBvc2U9IHJ1bGVEYXRhSW50ZXJjaGFuZ2VFeHBvc2UgRU9GCisgICAgICAgICAgICB7CisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIG5ld0NvbXBvc2l0ZU5vZGUoZ3JhbW1hckFjY2Vzcy5nZXREYXRhSW50ZXJjaGFuZ2VFeHBvc2VSdWxlKCkpOyAKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzEpOworICAgICAgICAgICAgaXZfcnVsZURhdGFJbnRlcmNoYW5nZUV4cG9zZT1ydWxlRGF0YUludGVyY2hhbmdlRXhwb3NlKCk7CisKKyAgICAgICAgICAgIHN0YXRlLl9mc3AtLTsKKyAgICAgICAgICAgIGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBjdXJyZW50ID1pdl9ydWxlRGF0YUludGVyY2hhbmdlRXhwb3NlOyAKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1hdGNoKGlucHV0LEVPRixGT0xMT1dfMik7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OworCisgICAgICAgICAgICB9CisKKyAgICAgICAgfQorCisgICAgICAgICAgICBjYXRjaCAoUmVjb2duaXRpb25FeGNlcHRpb24gcmUpIHsKKyAgICAgICAgICAgICAgICByZWNvdmVyKGlucHV0LHJlKTsKKyAgICAgICAgICAgICAgICBhcHBlbmRTa2lwcGVkVG9rZW5zKCk7CisgICAgICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgICAgIHJldHVybiBjdXJyZW50OworICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJlbnRyeVJ1bGVEYXRhSW50ZXJjaGFuZ2VFeHBvc2UiCisKKworICAgIC8vICRBTlRMUiBzdGFydCAicnVsZURhdGFJbnRlcmNoYW5nZUV4cG9zZSIKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMDcyOjE6IHJ1bGVEYXRhSW50ZXJjaGFuZ2VFeHBvc2UgcmV0dXJucyBbRU9iamVjdCBjdXJyZW50PW51bGxdIDogKCAoKSBvdGhlcmx2XzE9ICdyZWYnICggKG90aGVybHZfMj0gUlVMRV9JRCApICkgKCAob3RoZXJsdl8zPSAnb24nICggKG90aGVybHZfND0gUlVMRV9JRCApICkgKSB8IChvdGhlcmx2XzU9ICdleHBvc2UnIG90aGVybHZfNj0gJ3snICggKGx2X3N1YkV4cG9zZV83XzA9IHJ1bGVEYXRhSW50ZXJjaGFuZ2VFeHBvc2UgKSApIG90aGVybHZfOD0gJ30nICkgKSApIDsKKyAgICBwdWJsaWMgZmluYWwgRU9iamVjdCBydWxlRGF0YUludGVyY2hhbmdlRXhwb3NlKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgRU9iamVjdCBjdXJyZW50ID0gbnVsbDsKKworICAgICAgICBUb2tlbiBvdGhlcmx2XzE9bnVsbDsKKyAgICAgICAgVG9rZW4gb3RoZXJsdl8yPW51bGw7CisgICAgICAgIFRva2VuIG90aGVybHZfMz1udWxsOworICAgICAgICBUb2tlbiBvdGhlcmx2XzQ9bnVsbDsKKyAgICAgICAgVG9rZW4gb3RoZXJsdl81PW51bGw7CisgICAgICAgIFRva2VuIG90aGVybHZfNj1udWxsOworICAgICAgICBUb2tlbiBvdGhlcmx2Xzg9bnVsbDsKKyAgICAgICAgRU9iamVjdCBsdl9zdWJFeHBvc2VfN18wID0gbnVsbDsKKworCisKKyAgICAgICAgCWVudGVyUnVsZSgpOworCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMDc4OjI6ICggKCAoKSBvdGhlcmx2XzE9ICdyZWYnICggKG90aGVybHZfMj0gUlVMRV9JRCApICkgKCAob3RoZXJsdl8zPSAnb24nICggKG90aGVybHZfND0gUlVMRV9JRCApICkgKSB8IChvdGhlcmx2XzU9ICdleHBvc2UnIG90aGVybHZfNj0gJ3snICggKGx2X3N1YkV4cG9zZV83XzA9IHJ1bGVEYXRhSW50ZXJjaGFuZ2VFeHBvc2UgKSApIG90aGVybHZfOD0gJ30nICkgKSApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIwNzk6MjogKCAoKSBvdGhlcmx2XzE9ICdyZWYnICggKG90aGVybHZfMj0gUlVMRV9JRCApICkgKCAob3RoZXJsdl8zPSAnb24nICggKG90aGVybHZfND0gUlVMRV9JRCApICkgKSB8IChvdGhlcmx2XzU9ICdleHBvc2UnIG90aGVybHZfNj0gJ3snICggKGx2X3N1YkV4cG9zZV83XzA9IHJ1bGVEYXRhSW50ZXJjaGFuZ2VFeHBvc2UgKSApIG90aGVybHZfOD0gJ30nICkgKSApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMDc5OjI6ICggKCkgb3RoZXJsdl8xPSAncmVmJyAoIChvdGhlcmx2XzI9IFJVTEVfSUQgKSApICggKG90aGVybHZfMz0gJ29uJyAoIChvdGhlcmx2XzQ9IFJVTEVfSUQgKSApICkgfCAob3RoZXJsdl81PSAnZXhwb3NlJyBvdGhlcmx2XzY9ICd7JyAoIChsdl9zdWJFeHBvc2VfN18wPSBydWxlRGF0YUludGVyY2hhbmdlRXhwb3NlICkgKSBvdGhlcmx2Xzg9ICd9JyApICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjA4MDozOiAoKSBvdGhlcmx2XzE9ICdyZWYnICggKG90aGVybHZfMj0gUlVMRV9JRCApICkgKCAob3RoZXJsdl8zPSAnb24nICggKG90aGVybHZfND0gUlVMRV9JRCApICkgKSB8IChvdGhlcmx2XzU9ICdleHBvc2UnIG90aGVybHZfNj0gJ3snICggKGx2X3N1YkV4cG9zZV83XzA9IHJ1bGVEYXRhSW50ZXJjaGFuZ2VFeHBvc2UgKSApIG90aGVybHZfOD0gJ30nICkgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjA4MDozOiAoKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjA4MTo0OiAKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworCisgICAgICAgICAgICAgIAkJCQljdXJyZW50ID0gZm9yY2VDcmVhdGVNb2RlbEVsZW1lbnQoCisgICAgICAgICAgICAgIAkJCQkJZ3JhbW1hckFjY2Vzcy5nZXREYXRhSW50ZXJjaGFuZ2VFeHBvc2VBY2Nlc3MoKS5nZXREYXRhSW50ZXJjaGFuZ2VFeHBvc2VBY3Rpb25fMCgpLAorICAgICAgICAgICAgICAJCQkJCWN1cnJlbnQpOworICAgICAgICAgICAgICAJCQkKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBvdGhlcmx2XzE9KFRva2VuKW1hdGNoKGlucHV0LDY0LEZPTExPV180KTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7CisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKworICAgICAgICAgICAgICAJCQluZXdMZWFmTm9kZShvdGhlcmx2XzEsIGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YUludGVyY2hhbmdlRXhwb3NlQWNjZXNzKCkuZ2V0UmVmS2V5d29yZF8xKCkpOworICAgICAgICAgICAgICAJCQorICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjA5MTozOiAoIChvdGhlcmx2XzI9IFJVTEVfSUQgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMDkyOjQ6IChvdGhlcmx2XzI9IFJVTEVfSUQgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjA5Mjo0OiAob3RoZXJsdl8yPSBSVUxFX0lEICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIwOTM6NTogb3RoZXJsdl8yPSBSVUxFX0lECisgICAgICAgICAgICB7CisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKworICAgICAgICAgICAgICAJCQkJCWlmIChjdXJyZW50PT1udWxsKSB7CisgICAgICAgICAgICAgIAkJCQkJCWN1cnJlbnQgPSBjcmVhdGVNb2RlbEVsZW1lbnQoZ3JhbW1hckFjY2Vzcy5nZXREYXRhSW50ZXJjaGFuZ2VFeHBvc2VSdWxlKCkpOworICAgICAgICAgICAgICAJCQkJCX0KKyAgICAgICAgICAgICAgCQkJCQorICAgICAgICAgICAgfQorICAgICAgICAgICAgb3RoZXJsdl8yPShUb2tlbiltYXRjaChpbnB1dCxSVUxFX0lELEZPTExPV181Myk7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisKKyAgICAgICAgICAgICAgCQkJCQluZXdMZWFmTm9kZShvdGhlcmx2XzIsIGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YUludGVyY2hhbmdlRXhwb3NlQWNjZXNzKCkuZ2V0UmVmRW50aXR5TEVudGl0eVJlZmVyZW5jZUNyb3NzUmVmZXJlbmNlXzJfMCgpKTsKKyAgICAgICAgICAgICAgCQkJCQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMTA0OjM6ICggKG90aGVybHZfMz0gJ29uJyAoIChvdGhlcmx2XzQ9IFJVTEVfSUQgKSApICkgfCAob3RoZXJsdl81PSAnZXhwb3NlJyBvdGhlcmx2XzY9ICd7JyAoIChsdl9zdWJFeHBvc2VfN18wPSBydWxlRGF0YUludGVyY2hhbmdlRXhwb3NlICkgKSBvdGhlcmx2Xzg9ICd9JyApICkKKyAgICAgICAgICAgIGludCBhbHQ0MD0yOworICAgICAgICAgICAgaW50IExBNDBfMCA9IGlucHV0LkxBKDEpOworCisgICAgICAgICAgICBpZiAoIChMQTQwXzA9PTUxKSApIHsKKyAgICAgICAgICAgICAgICBhbHQ0MD0xOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiAoIChMQTQwXzA9PTQ1KSApIHsKKyAgICAgICAgICAgICAgICBhbHQ0MD0yOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgaWYgKHN0YXRlLmJhY2t0cmFja2luZz4wKSB7c3RhdGUuZmFpbGVkPXRydWU7IHJldHVybiBjdXJyZW50O30KKyAgICAgICAgICAgICAgICBOb1ZpYWJsZUFsdEV4Y2VwdGlvbiBudmFlID0KKyAgICAgICAgICAgICAgICAgICAgbmV3IE5vVmlhYmxlQWx0RXhjZXB0aW9uKCIiLCA0MCwgMCwgaW5wdXQpOworCisgICAgICAgICAgICAgICAgdGhyb3cgbnZhZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHN3aXRjaCAoYWx0NDApIHsKKyAgICAgICAgICAgICAgICBjYXNlIDEgOgorICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMTA1OjQ6IChvdGhlcmx2XzM9ICdvbicgKCAob3RoZXJsdl80PSBSVUxFX0lEICkgKSApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjEwNTo0OiAob3RoZXJsdl8zPSAnb24nICggKG90aGVybHZfND0gUlVMRV9JRCApICkgKQorICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMTA2OjU6IG90aGVybHZfMz0gJ29uJyAoIChvdGhlcmx2XzQ9IFJVTEVfSUQgKSApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgb3RoZXJsdl8zPShUb2tlbiltYXRjaChpbnB1dCw1MSxGT0xMT1dfNCk7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OworICAgICAgICAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKworICAgICAgICAgICAgICAgICAgICAgIAkJCQkJbmV3TGVhZk5vZGUob3RoZXJsdl8zLCBncmFtbWFyQWNjZXNzLmdldERhdGFJbnRlcmNoYW5nZUV4cG9zZUFjY2VzcygpLmdldE9uS2V5d29yZF8zXzBfMCgpKTsKKyAgICAgICAgICAgICAgICAgICAgICAJCQkJCisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjExMDo1OiAoIChvdGhlcmx2XzQ9IFJVTEVfSUQgKSApCisgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIxMTE6NjogKG90aGVybHZfND0gUlVMRV9JRCApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjExMTo2OiAob3RoZXJsdl80PSBSVUxFX0lEICkKKyAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjExMjo3OiBvdGhlcmx2XzQ9IFJVTEVfSUQKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKworICAgICAgICAgICAgICAgICAgICAgIAkJCQkJCQlpZiAoY3VycmVudD09bnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgIAkJCQkJCQkJY3VycmVudCA9IGNyZWF0ZU1vZGVsRWxlbWVudChncmFtbWFyQWNjZXNzLmdldERhdGFJbnRlcmNoYW5nZUV4cG9zZVJ1bGUoKSk7CisgICAgICAgICAgICAgICAgICAgICAgCQkJCQkJCX0KKyAgICAgICAgICAgICAgICAgICAgICAJCQkJCQkKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBvdGhlcmx2XzQ9KFRva2VuKW1hdGNoKGlucHV0LFJVTEVfSUQsRk9MTE9XXzIpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gY3VycmVudDsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisKKyAgICAgICAgICAgICAgICAgICAgICAJCQkJCQkJbmV3TGVhZk5vZGUob3RoZXJsdl80LCBncmFtbWFyQWNjZXNzLmdldERhdGFJbnRlcmNoYW5nZUV4cG9zZUFjY2VzcygpLmdldFJlZlByb3BlcnR5TEVudGl0eUF0dHJpYnV0ZUNyb3NzUmVmZXJlbmNlXzNfMF8xXzAoKSk7CisgICAgICAgICAgICAgICAgICAgICAgCQkJCQkJCisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgMiA6CisgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIxMjU6NDogKG90aGVybHZfNT0gJ2V4cG9zZScgb3RoZXJsdl82PSAneycgKCAobHZfc3ViRXhwb3NlXzdfMD0gcnVsZURhdGFJbnRlcmNoYW5nZUV4cG9zZSApICkgb3RoZXJsdl84PSAnfScgKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIxMjU6NDogKG90aGVybHZfNT0gJ2V4cG9zZScgb3RoZXJsdl82PSAneycgKCAobHZfc3ViRXhwb3NlXzdfMD0gcnVsZURhdGFJbnRlcmNoYW5nZUV4cG9zZSApICkgb3RoZXJsdl84PSAnfScgKQorICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMTI2OjU6IG90aGVybHZfNT0gJ2V4cG9zZScgb3RoZXJsdl82PSAneycgKCAobHZfc3ViRXhwb3NlXzdfMD0gcnVsZURhdGFJbnRlcmNoYW5nZUV4cG9zZSApICkgb3RoZXJsdl84PSAnfScKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBvdGhlcmx2XzU9KFRva2VuKW1hdGNoKGlucHV0LDQ1LEZPTExPV18xOCk7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OworICAgICAgICAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKworICAgICAgICAgICAgICAgICAgICAgIAkJCQkJbmV3TGVhZk5vZGUob3RoZXJsdl81LCBncmFtbWFyQWNjZXNzLmdldERhdGFJbnRlcmNoYW5nZUV4cG9zZUFjY2VzcygpLmdldEV4cG9zZUtleXdvcmRfM18xXzAoKSk7CisgICAgICAgICAgICAgICAgICAgICAgCQkJCQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIG90aGVybHZfNj0oVG9rZW4pbWF0Y2goaW5wdXQsMTUsRk9MTE9XXzU0KTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7CisgICAgICAgICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworCisgICAgICAgICAgICAgICAgICAgICAgCQkJCQluZXdMZWFmTm9kZShvdGhlcmx2XzYsIGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YUludGVyY2hhbmdlRXhwb3NlQWNjZXNzKCkuZ2V0TGVmdEN1cmx5QnJhY2tldEtleXdvcmRfM18xXzEoKSk7CisgICAgICAgICAgICAgICAgICAgICAgCQkJCQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIxMzQ6NTogKCAobHZfc3ViRXhwb3NlXzdfMD0gcnVsZURhdGFJbnRlcmNoYW5nZUV4cG9zZSApICkKKyAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjEzNTo2OiAobHZfc3ViRXhwb3NlXzdfMD0gcnVsZURhdGFJbnRlcmNoYW5nZUV4cG9zZSApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjEzNTo2OiAobHZfc3ViRXhwb3NlXzdfMD0gcnVsZURhdGFJbnRlcmNoYW5nZUV4cG9zZSApCisgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIxMzY6NzogbHZfc3ViRXhwb3NlXzdfMD0gcnVsZURhdGFJbnRlcmNoYW5nZUV4cG9zZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworCisgICAgICAgICAgICAgICAgICAgICAgCQkJCQkJCW5ld0NvbXBvc2l0ZU5vZGUoZ3JhbW1hckFjY2Vzcy5nZXREYXRhSW50ZXJjaGFuZ2VFeHBvc2VBY2Nlc3MoKS5nZXRTdWJFeHBvc2VEYXRhSW50ZXJjaGFuZ2VFeHBvc2VQYXJzZXJSdWxlQ2FsbF8zXzFfMl8wKCkpOworICAgICAgICAgICAgICAgICAgICAgIAkJCQkJCQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzQxKTsKKyAgICAgICAgICAgICAgICAgICAgbHZfc3ViRXhwb3NlXzdfMD1ydWxlRGF0YUludGVyY2hhbmdlRXhwb3NlKCk7CisKKyAgICAgICAgICAgICAgICAgICAgc3RhdGUuX2ZzcC0tOworICAgICAgICAgICAgICAgICAgICBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gY3VycmVudDsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisKKyAgICAgICAgICAgICAgICAgICAgICAJCQkJCQkJaWYgKGN1cnJlbnQ9PW51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAJCQkJCQkJCWN1cnJlbnQgPSBjcmVhdGVNb2RlbEVsZW1lbnRGb3JQYXJlbnQoZ3JhbW1hckFjY2Vzcy5nZXREYXRhSW50ZXJjaGFuZ2VFeHBvc2VSdWxlKCkpOworICAgICAgICAgICAgICAgICAgICAgIAkJCQkJCQl9CisgICAgICAgICAgICAgICAgICAgICAgCQkJCQkJCXNldCgKKyAgICAgICAgICAgICAgICAgICAgICAJCQkJCQkJCWN1cnJlbnQsCisgICAgICAgICAgICAgICAgICAgICAgCQkJCQkJCQkic3ViRXhwb3NlIiwKKyAgICAgICAgICAgICAgICAgICAgICAJCQkJCQkJCWx2X3N1YkV4cG9zZV83XzAsCisgICAgICAgICAgICAgICAgICAgICAgCQkJCQkJCQkib3JnLmVjbGlwc2Uub3NicC54dGV4dC5kYXRhaW50ZXJjaGFuZ2UuRGF0YURTTC5EYXRhSW50ZXJjaGFuZ2VFeHBvc2UiKTsKKyAgICAgICAgICAgICAgICAgICAgICAJCQkJCQkJYWZ0ZXJQYXJzZXJPckVudW1SdWxlQ2FsbCgpOworICAgICAgICAgICAgICAgICAgICAgIAkJCQkJCQorICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIG90aGVybHZfOD0oVG9rZW4pbWF0Y2goaW5wdXQsMTYsRk9MTE9XXzIpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gY3VycmVudDsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisKKyAgICAgICAgICAgICAgICAgICAgICAJCQkJCW5ld0xlYWZOb2RlKG90aGVybHZfOCwgZ3JhbW1hckFjY2Vzcy5nZXREYXRhSW50ZXJjaGFuZ2VFeHBvc2VBY2Nlc3MoKS5nZXRSaWdodEN1cmx5QnJhY2tldEtleXdvcmRfM18xXzMoKSk7CisgICAgICAgICAgICAgICAgICAgICAgCQkJCQorICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworCisgICAgICAgICAgICAgIAlsZWF2ZVJ1bGUoKTsKKworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgICAgIGNhdGNoIChSZWNvZ25pdGlvbkV4Y2VwdGlvbiByZSkgeworICAgICAgICAgICAgICAgIHJlY292ZXIoaW5wdXQscmUpOworICAgICAgICAgICAgICAgIGFwcGVuZFNraXBwZWRUb2tlbnMoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGN1cnJlbnQ7CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgInJ1bGVEYXRhSW50ZXJjaGFuZ2VFeHBvc2UiCisKKworICAgIC8vICRBTlRMUiBzdGFydCAiZW50cnlSdWxlRGF0YUludGVyY2hhbmdlRXhwb3J0RmlsdGVyIgorICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIxNjM6MTogZW50cnlSdWxlRGF0YUludGVyY2hhbmdlRXhwb3J0RmlsdGVyIHJldHVybnMgW0VPYmplY3QgY3VycmVudD1udWxsXSA6IGl2X3J1bGVEYXRhSW50ZXJjaGFuZ2VFeHBvcnRGaWx0ZXI9IHJ1bGVEYXRhSW50ZXJjaGFuZ2VFeHBvcnRGaWx0ZXIgRU9GIDsKKyAgICBwdWJsaWMgZmluYWwgRU9iamVjdCBlbnRyeVJ1bGVEYXRhSW50ZXJjaGFuZ2VFeHBvcnRGaWx0ZXIoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICBFT2JqZWN0IGN1cnJlbnQgPSBudWxsOworCisgICAgICAgIEVPYmplY3QgaXZfcnVsZURhdGFJbnRlcmNoYW5nZUV4cG9ydEZpbHRlciA9IG51bGw7CisKKworICAgICAgICB0cnkgeworICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjE2Mzo2ODogKGl2X3J1bGVEYXRhSW50ZXJjaGFuZ2VFeHBvcnRGaWx0ZXI9IHJ1bGVEYXRhSW50ZXJjaGFuZ2VFeHBvcnRGaWx0ZXIgRU9GICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIxNjQ6MjogaXZfcnVsZURhdGFJbnRlcmNoYW5nZUV4cG9ydEZpbHRlcj0gcnVsZURhdGFJbnRlcmNoYW5nZUV4cG9ydEZpbHRlciBFT0YKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgbmV3Q29tcG9zaXRlTm9kZShncmFtbWFyQWNjZXNzLmdldERhdGFJbnRlcmNoYW5nZUV4cG9ydEZpbHRlclJ1bGUoKSk7IAorICAgICAgICAgICAgfQorICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMSk7CisgICAgICAgICAgICBpdl9ydWxlRGF0YUludGVyY2hhbmdlRXhwb3J0RmlsdGVyPXJ1bGVEYXRhSW50ZXJjaGFuZ2VFeHBvcnRGaWx0ZXIoKTsKKworICAgICAgICAgICAgc3RhdGUuX2ZzcC0tOworICAgICAgICAgICAgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7CisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIGN1cnJlbnQgPWl2X3J1bGVEYXRhSW50ZXJjaGFuZ2VFeHBvcnRGaWx0ZXI7IAorICAgICAgICAgICAgfQorICAgICAgICAgICAgbWF0Y2goaW5wdXQsRU9GLEZPTExPV18yKTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7CisKKyAgICAgICAgICAgIH0KKworICAgICAgICB9CisKKyAgICAgICAgICAgIGNhdGNoIChSZWNvZ25pdGlvbkV4Y2VwdGlvbiByZSkgeworICAgICAgICAgICAgICAgIHJlY292ZXIoaW5wdXQscmUpOworICAgICAgICAgICAgICAgIGFwcGVuZFNraXBwZWRUb2tlbnMoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGN1cnJlbnQ7CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgImVudHJ5UnVsZURhdGFJbnRlcmNoYW5nZUV4cG9ydEZpbHRlciIKKworCisgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlRGF0YUludGVyY2hhbmdlRXhwb3J0RmlsdGVyIgorICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIxNzA6MTogcnVsZURhdGFJbnRlcmNoYW5nZUV4cG9ydEZpbHRlciByZXR1cm5zIFtFT2JqZWN0IGN1cnJlbnQ9bnVsbF0gOiAoICgpIChvdGhlcmx2XzE9ICd3aGVyZScgb3RoZXJsdl8yPSAneycgKCAobHZfY29uZGl0aW9uXzNfMD0gcnVsZURhdGFJbnRlcmNoYW5nZUZpbHRlckNvbmRpdGlvbiApICkgb3RoZXJsdl80PSAnfScgKT8gKG90aGVybHZfNT0gJ2hpZGUnICggKGx2X2hpZGRlbnByb3BlcnRpZXNfNl8wPSBydWxlRGF0YUludGVyY2hhbmdlRXhwb3J0SGlkZSApICkqICk/ICkgOworICAgIHB1YmxpYyBmaW5hbCBFT2JqZWN0IHJ1bGVEYXRhSW50ZXJjaGFuZ2VFeHBvcnRGaWx0ZXIoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICBFT2JqZWN0IGN1cnJlbnQgPSBudWxsOworCisgICAgICAgIFRva2VuIG90aGVybHZfMT1udWxsOworICAgICAgICBUb2tlbiBvdGhlcmx2XzI9bnVsbDsKKyAgICAgICAgVG9rZW4gb3RoZXJsdl80PW51bGw7CisgICAgICAgIFRva2VuIG90aGVybHZfNT1udWxsOworICAgICAgICBFT2JqZWN0IGx2X2NvbmRpdGlvbl8zXzAgPSBudWxsOworCisgICAgICAgIEVPYmplY3QgbHZfaGlkZGVucHJvcGVydGllc182XzAgPSBudWxsOworCisKKworICAgICAgICAJZW50ZXJSdWxlKCk7CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIxNzY6MjogKCAoICgpIChvdGhlcmx2XzE9ICd3aGVyZScgb3RoZXJsdl8yPSAneycgKCAobHZfY29uZGl0aW9uXzNfMD0gcnVsZURhdGFJbnRlcmNoYW5nZUZpbHRlckNvbmRpdGlvbiApICkgb3RoZXJsdl80PSAnfScgKT8gKG90aGVybHZfNT0gJ2hpZGUnICggKGx2X2hpZGRlbnByb3BlcnRpZXNfNl8wPSBydWxlRGF0YUludGVyY2hhbmdlRXhwb3J0SGlkZSApICkqICk/ICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjE3NzoyOiAoICgpIChvdGhlcmx2XzE9ICd3aGVyZScgb3RoZXJsdl8yPSAneycgKCAobHZfY29uZGl0aW9uXzNfMD0gcnVsZURhdGFJbnRlcmNoYW5nZUZpbHRlckNvbmRpdGlvbiApICkgb3RoZXJsdl80PSAnfScgKT8gKG90aGVybHZfNT0gJ2hpZGUnICggKGx2X2hpZGRlbnByb3BlcnRpZXNfNl8wPSBydWxlRGF0YUludGVyY2hhbmdlRXhwb3J0SGlkZSApICkqICk/ICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIxNzc6MjogKCAoKSAob3RoZXJsdl8xPSAnd2hlcmUnIG90aGVybHZfMj0gJ3snICggKGx2X2NvbmRpdGlvbl8zXzA9IHJ1bGVEYXRhSW50ZXJjaGFuZ2VGaWx0ZXJDb25kaXRpb24gKSApIG90aGVybHZfND0gJ30nICk/IChvdGhlcmx2XzU9ICdoaWRlJyAoIChsdl9oaWRkZW5wcm9wZXJ0aWVzXzZfMD0gcnVsZURhdGFJbnRlcmNoYW5nZUV4cG9ydEhpZGUgKSApKiApPyApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMTc4OjM6ICgpIChvdGhlcmx2XzE9ICd3aGVyZScgb3RoZXJsdl8yPSAneycgKCAobHZfY29uZGl0aW9uXzNfMD0gcnVsZURhdGFJbnRlcmNoYW5nZUZpbHRlckNvbmRpdGlvbiApICkgb3RoZXJsdl80PSAnfScgKT8gKG90aGVybHZfNT0gJ2hpZGUnICggKGx2X2hpZGRlbnByb3BlcnRpZXNfNl8wPSBydWxlRGF0YUludGVyY2hhbmdlRXhwb3J0SGlkZSApICkqICk/CisgICAgICAgICAgICB7CisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMTc4OjM6ICgpCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMTc5OjQ6IAorICAgICAgICAgICAgeworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisKKyAgICAgICAgICAgICAgCQkJCWN1cnJlbnQgPSBmb3JjZUNyZWF0ZU1vZGVsRWxlbWVudCgKKyAgICAgICAgICAgICAgCQkJCQlncmFtbWFyQWNjZXNzLmdldERhdGFJbnRlcmNoYW5nZUV4cG9ydEZpbHRlckFjY2VzcygpLmdldERhdGFJbnRlcmNoYW5nZUV4cG9ydEZpbHRlckFjdGlvbl8wKCksCisgICAgICAgICAgICAgIAkJCQkJY3VycmVudCk7CisgICAgICAgICAgICAgIAkJCQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIxODU6MzogKG90aGVybHZfMT0gJ3doZXJlJyBvdGhlcmx2XzI9ICd7JyAoIChsdl9jb25kaXRpb25fM18wPSBydWxlRGF0YUludGVyY2hhbmdlRmlsdGVyQ29uZGl0aW9uICkgKSBvdGhlcmx2XzQ9ICd9JyApPworICAgICAgICAgICAgaW50IGFsdDQxPTI7CisgICAgICAgICAgICBpbnQgTEE0MV8wID0gaW5wdXQuTEEoMSk7CisKKyAgICAgICAgICAgIGlmICggKExBNDFfMD09NjUpICkgeworICAgICAgICAgICAgICAgIGFsdDQxPTE7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzd2l0Y2ggKGFsdDQxKSB7CisgICAgICAgICAgICAgICAgY2FzZSAxIDoKKyAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjE4Njo0OiBvdGhlcmx2XzE9ICd3aGVyZScgb3RoZXJsdl8yPSAneycgKCAobHZfY29uZGl0aW9uXzNfMD0gcnVsZURhdGFJbnRlcmNoYW5nZUZpbHRlckNvbmRpdGlvbiApICkgb3RoZXJsdl80PSAnfScKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBvdGhlcmx2XzE9KFRva2VuKW1hdGNoKGlucHV0LDY1LEZPTExPV18xOCk7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OworICAgICAgICAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKworICAgICAgICAgICAgICAgICAgICAgIAkJCQluZXdMZWFmTm9kZShvdGhlcmx2XzEsIGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YUludGVyY2hhbmdlRXhwb3J0RmlsdGVyQWNjZXNzKCkuZ2V0V2hlcmVLZXl3b3JkXzFfMCgpKTsKKyAgICAgICAgICAgICAgICAgICAgICAJCQkKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBvdGhlcmx2XzI9KFRva2VuKW1hdGNoKGlucHV0LDE1LEZPTExPV180KTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7CisgICAgICAgICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworCisgICAgICAgICAgICAgICAgICAgICAgCQkJCW5ld0xlYWZOb2RlKG90aGVybHZfMiwgZ3JhbW1hckFjY2Vzcy5nZXREYXRhSW50ZXJjaGFuZ2VFeHBvcnRGaWx0ZXJBY2Nlc3MoKS5nZXRMZWZ0Q3VybHlCcmFja2V0S2V5d29yZF8xXzEoKSk7CisgICAgICAgICAgICAgICAgICAgICAgCQkJCisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjE5NDo0OiAoIChsdl9jb25kaXRpb25fM18wPSBydWxlRGF0YUludGVyY2hhbmdlRmlsdGVyQ29uZGl0aW9uICkgKQorICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMTk1OjU6IChsdl9jb25kaXRpb25fM18wPSBydWxlRGF0YUludGVyY2hhbmdlRmlsdGVyQ29uZGl0aW9uICkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMTk1OjU6IChsdl9jb25kaXRpb25fM18wPSBydWxlRGF0YUludGVyY2hhbmdlRmlsdGVyQ29uZGl0aW9uICkKKyAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjE5Njo2OiBsdl9jb25kaXRpb25fM18wPSBydWxlRGF0YUludGVyY2hhbmdlRmlsdGVyQ29uZGl0aW9uCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisKKyAgICAgICAgICAgICAgICAgICAgICAJCQkJCQluZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YUludGVyY2hhbmdlRXhwb3J0RmlsdGVyQWNjZXNzKCkuZ2V0Q29uZGl0aW9uRGF0YUludGVyY2hhbmdlRmlsdGVyQ29uZGl0aW9uUGFyc2VyUnVsZUNhbGxfMV8yXzAoKSk7CisgICAgICAgICAgICAgICAgICAgICAgCQkJCQkKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV180MSk7CisgICAgICAgICAgICAgICAgICAgIGx2X2NvbmRpdGlvbl8zXzA9cnVsZURhdGFJbnRlcmNoYW5nZUZpbHRlckNvbmRpdGlvbigpOworCisgICAgICAgICAgICAgICAgICAgIHN0YXRlLl9mc3AtLTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7CisgICAgICAgICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworCisgICAgICAgICAgICAgICAgICAgICAgCQkJCQkJaWYgKGN1cnJlbnQ9PW51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAJCQkJCQkJY3VycmVudCA9IGNyZWF0ZU1vZGVsRWxlbWVudEZvclBhcmVudChncmFtbWFyQWNjZXNzLmdldERhdGFJbnRlcmNoYW5nZUV4cG9ydEZpbHRlclJ1bGUoKSk7CisgICAgICAgICAgICAgICAgICAgICAgCQkJCQkJfQorICAgICAgICAgICAgICAgICAgICAgIAkJCQkJCXNldCgKKyAgICAgICAgICAgICAgICAgICAgICAJCQkJCQkJY3VycmVudCwKKyAgICAgICAgICAgICAgICAgICAgICAJCQkJCQkJImNvbmRpdGlvbiIsCisgICAgICAgICAgICAgICAgICAgICAgCQkJCQkJCWx2X2NvbmRpdGlvbl8zXzAsCisgICAgICAgICAgICAgICAgICAgICAgCQkJCQkJCSJvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmRhdGFpbnRlcmNoYW5nZS5EYXRhRFNMLkRhdGFJbnRlcmNoYW5nZUZpbHRlckNvbmRpdGlvbiIpOworICAgICAgICAgICAgICAgICAgICAgIAkJCQkJCWFmdGVyUGFyc2VyT3JFbnVtUnVsZUNhbGwoKTsKKyAgICAgICAgICAgICAgICAgICAgICAJCQkJCQorICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIG90aGVybHZfND0oVG9rZW4pbWF0Y2goaW5wdXQsMTYsRk9MTE9XXzU1KTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7CisgICAgICAgICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworCisgICAgICAgICAgICAgICAgICAgICAgCQkJCW5ld0xlYWZOb2RlKG90aGVybHZfNCwgZ3JhbW1hckFjY2Vzcy5nZXREYXRhSW50ZXJjaGFuZ2VFeHBvcnRGaWx0ZXJBY2Nlc3MoKS5nZXRSaWdodEN1cmx5QnJhY2tldEtleXdvcmRfMV8zKCkpOworICAgICAgICAgICAgICAgICAgICAgIAkJCQorICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMjE4OjM6IChvdGhlcmx2XzU9ICdoaWRlJyAoIChsdl9oaWRkZW5wcm9wZXJ0aWVzXzZfMD0gcnVsZURhdGFJbnRlcmNoYW5nZUV4cG9ydEhpZGUgKSApKiApPworICAgICAgICAgICAgaW50IGFsdDQzPTI7CisgICAgICAgICAgICBpbnQgTEE0M18wID0gaW5wdXQuTEEoMSk7CisKKyAgICAgICAgICAgIGlmICggKExBNDNfMD09NjYpICkgeworICAgICAgICAgICAgICAgIGFsdDQzPTE7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzd2l0Y2ggKGFsdDQzKSB7CisgICAgICAgICAgICAgICAgY2FzZSAxIDoKKyAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjIxOTo0OiBvdGhlcmx2XzU9ICdoaWRlJyAoIChsdl9oaWRkZW5wcm9wZXJ0aWVzXzZfMD0gcnVsZURhdGFJbnRlcmNoYW5nZUV4cG9ydEhpZGUgKSApKgorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIG90aGVybHZfNT0oVG9rZW4pbWF0Y2goaW5wdXQsNjYsRk9MTE9XXzU2KTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7CisgICAgICAgICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworCisgICAgICAgICAgICAgICAgICAgICAgCQkJCW5ld0xlYWZOb2RlKG90aGVybHZfNSwgZ3JhbW1hckFjY2Vzcy5nZXREYXRhSW50ZXJjaGFuZ2VFeHBvcnRGaWx0ZXJBY2Nlc3MoKS5nZXRIaWRlS2V5d29yZF8yXzAoKSk7CisgICAgICAgICAgICAgICAgICAgICAgCQkJCisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjIyMzo0OiAoIChsdl9oaWRkZW5wcm9wZXJ0aWVzXzZfMD0gcnVsZURhdGFJbnRlcmNoYW5nZUV4cG9ydEhpZGUgKSApKgorICAgICAgICAgICAgICAgICAgICBsb29wNDI6CisgICAgICAgICAgICAgICAgICAgIGRvIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBhbHQ0Mj0yOworICAgICAgICAgICAgICAgICAgICAgICAgaW50IExBNDJfMCA9IGlucHV0LkxBKDEpOworCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIChMQTQyXzA9PVJVTEVfSUQpICkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsdDQyPTE7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChhbHQ0MikgeworICAgICAgICAgICAgICAgICAgICAJY2FzZSAxIDoKKyAgICAgICAgICAgICAgICAgICAgCSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMjI0OjU6IChsdl9oaWRkZW5wcm9wZXJ0aWVzXzZfMD0gcnVsZURhdGFJbnRlcmNoYW5nZUV4cG9ydEhpZGUgKQorICAgICAgICAgICAgICAgICAgICAJICAgIHsKKyAgICAgICAgICAgICAgICAgICAgCSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMjI0OjU6IChsdl9oaWRkZW5wcm9wZXJ0aWVzXzZfMD0gcnVsZURhdGFJbnRlcmNoYW5nZUV4cG9ydEhpZGUgKQorICAgICAgICAgICAgICAgICAgICAJICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIyMjU6NjogbHZfaGlkZGVucHJvcGVydGllc182XzA9IHJ1bGVEYXRhSW50ZXJjaGFuZ2VFeHBvcnRIaWRlCisgICAgICAgICAgICAgICAgICAgIAkgICAgeworICAgICAgICAgICAgICAgICAgICAJICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworCisgICAgICAgICAgICAgICAgICAgIAkgICAgICAJCQkJCQluZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YUludGVyY2hhbmdlRXhwb3J0RmlsdGVyQWNjZXNzKCkuZ2V0SGlkZGVucHJvcGVydGllc0RhdGFJbnRlcmNoYW5nZUV4cG9ydEhpZGVQYXJzZXJSdWxlQ2FsbF8yXzFfMCgpKTsKKyAgICAgICAgICAgICAgICAgICAgCSAgICAgIAkJCQkJCisgICAgICAgICAgICAgICAgICAgIAkgICAgfQorICAgICAgICAgICAgICAgICAgICAJICAgIHB1c2hGb2xsb3coRk9MTE9XXzU2KTsKKyAgICAgICAgICAgICAgICAgICAgCSAgICBsdl9oaWRkZW5wcm9wZXJ0aWVzXzZfMD1ydWxlRGF0YUludGVyY2hhbmdlRXhwb3J0SGlkZSgpOworCisgICAgICAgICAgICAgICAgICAgIAkgICAgc3RhdGUuX2ZzcC0tOworICAgICAgICAgICAgICAgICAgICAJICAgIGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OworICAgICAgICAgICAgICAgICAgICAJICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworCisgICAgICAgICAgICAgICAgICAgIAkgICAgICAJCQkJCQlpZiAoY3VycmVudD09bnVsbCkgeworICAgICAgICAgICAgICAgICAgICAJICAgICAgCQkJCQkJCWN1cnJlbnQgPSBjcmVhdGVNb2RlbEVsZW1lbnRGb3JQYXJlbnQoZ3JhbW1hckFjY2Vzcy5nZXREYXRhSW50ZXJjaGFuZ2VFeHBvcnRGaWx0ZXJSdWxlKCkpOworICAgICAgICAgICAgICAgICAgICAJICAgICAgCQkJCQkJfQorICAgICAgICAgICAgICAgICAgICAJICAgICAgCQkJCQkJYWRkKAorICAgICAgICAgICAgICAgICAgICAJICAgICAgCQkJCQkJCWN1cnJlbnQsCisgICAgICAgICAgICAgICAgICAgIAkgICAgICAJCQkJCQkJImhpZGRlbnByb3BlcnRpZXMiLAorICAgICAgICAgICAgICAgICAgICAJICAgICAgCQkJCQkJCWx2X2hpZGRlbnByb3BlcnRpZXNfNl8wLAorICAgICAgICAgICAgICAgICAgICAJICAgICAgCQkJCQkJCSJvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmRhdGFpbnRlcmNoYW5nZS5EYXRhRFNMLkRhdGFJbnRlcmNoYW5nZUV4cG9ydEhpZGUiKTsKKyAgICAgICAgICAgICAgICAgICAgCSAgICAgIAkJCQkJCWFmdGVyUGFyc2VyT3JFbnVtUnVsZUNhbGwoKTsKKyAgICAgICAgICAgICAgICAgICAgCSAgICAgIAkJCQkJCisgICAgICAgICAgICAgICAgICAgIAkgICAgfQorCisgICAgICAgICAgICAgICAgICAgIAkgICAgfQorCisKKyAgICAgICAgICAgICAgICAgICAgCSAgICB9CisgICAgICAgICAgICAgICAgICAgIAkgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICAgICAgCWRlZmF1bHQgOgorICAgICAgICAgICAgICAgICAgICAJICAgIGJyZWFrIGxvb3A0MjsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfSB3aGlsZSAodHJ1ZSk7CisKKworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisKKyAgICAgICAgICAgICAgCWxlYXZlUnVsZSgpOworCisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAgICAgY2F0Y2ggKFJlY29nbml0aW9uRXhjZXB0aW9uIHJlKSB7CisgICAgICAgICAgICAgICAgcmVjb3ZlcihpbnB1dCxyZSk7CisgICAgICAgICAgICAgICAgYXBwZW5kU2tpcHBlZFRva2VucygpOworICAgICAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gY3VycmVudDsKKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAicnVsZURhdGFJbnRlcmNoYW5nZUV4cG9ydEZpbHRlciIKKworCisgICAgLy8gJEFOVExSIHN0YXJ0ICJlbnRyeVJ1bGVEYXRhSW50ZXJjaGFuZ2VGaWx0ZXJDb25kaXRpb24iCisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjI0NzoxOiBlbnRyeVJ1bGVEYXRhSW50ZXJjaGFuZ2VGaWx0ZXJDb25kaXRpb24gcmV0dXJucyBbRU9iamVjdCBjdXJyZW50PW51bGxdIDogaXZfcnVsZURhdGFJbnRlcmNoYW5nZUZpbHRlckNvbmRpdGlvbj0gcnVsZURhdGFJbnRlcmNoYW5nZUZpbHRlckNvbmRpdGlvbiBFT0YgOworICAgIHB1YmxpYyBmaW5hbCBFT2JqZWN0IGVudHJ5UnVsZURhdGFJbnRlcmNoYW5nZUZpbHRlckNvbmRpdGlvbigpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIEVPYmplY3QgY3VycmVudCA9IG51bGw7CisKKyAgICAgICAgRU9iamVjdCBpdl9ydWxlRGF0YUludGVyY2hhbmdlRmlsdGVyQ29uZGl0aW9uID0gbnVsbDsKKworCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMjQ3OjcxOiAoaXZfcnVsZURhdGFJbnRlcmNoYW5nZUZpbHRlckNvbmRpdGlvbj0gcnVsZURhdGFJbnRlcmNoYW5nZUZpbHRlckNvbmRpdGlvbiBFT0YgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjI0ODoyOiBpdl9ydWxlRGF0YUludGVyY2hhbmdlRmlsdGVyQ29uZGl0aW9uPSBydWxlRGF0YUludGVyY2hhbmdlRmlsdGVyQ29uZGl0aW9uIEVPRgorICAgICAgICAgICAgeworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBuZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YUludGVyY2hhbmdlRmlsdGVyQ29uZGl0aW9uUnVsZSgpKTsgCisgICAgICAgICAgICB9CisgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV18xKTsKKyAgICAgICAgICAgIGl2X3J1bGVEYXRhSW50ZXJjaGFuZ2VGaWx0ZXJDb25kaXRpb249cnVsZURhdGFJbnRlcmNoYW5nZUZpbHRlckNvbmRpdGlvbigpOworCisgICAgICAgICAgICBzdGF0ZS5fZnNwLS07CisgICAgICAgICAgICBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gY3VycmVudDsKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgY3VycmVudCA9aXZfcnVsZURhdGFJbnRlcmNoYW5nZUZpbHRlckNvbmRpdGlvbjsgCisgICAgICAgICAgICB9CisgICAgICAgICAgICBtYXRjaChpbnB1dCxFT0YsRk9MTE9XXzIpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gY3VycmVudDsKKworICAgICAgICAgICAgfQorCisgICAgICAgIH0KKworICAgICAgICAgICAgY2F0Y2ggKFJlY29nbml0aW9uRXhjZXB0aW9uIHJlKSB7CisgICAgICAgICAgICAgICAgcmVjb3ZlcihpbnB1dCxyZSk7CisgICAgICAgICAgICAgICAgYXBwZW5kU2tpcHBlZFRva2VucygpOworICAgICAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gY3VycmVudDsKKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAiZW50cnlSdWxlRGF0YUludGVyY2hhbmdlRmlsdGVyQ29uZGl0aW9uIgorCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVEYXRhSW50ZXJjaGFuZ2VGaWx0ZXJDb25kaXRpb24iCisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjI1NDoxOiBydWxlRGF0YUludGVyY2hhbmdlRmlsdGVyQ29uZGl0aW9uIHJldHVybnMgW0VPYmplY3QgY3VycmVudD1udWxsXSA6ICggKCAob3RoZXJsdl8wPSBSVUxFX0lEICkgKSAoIChsdl9vcGVyYXRvcl8xXzA9IHJ1bGVDb25kaXRpb25BbmRPcGVyYXRvcjEgKSApICggKGx2X3ZhbHVlXzJfMD0gUlVMRV9TVFJJTkcgKSApPyAoICggKGx2X29wZXJhdG9yMl8zXzA9IHJ1bGVDb25kaXRpb25BbmRPcGVyYXRvcjIgKSApICggKGx2X3N1YmNvbmRpdGlvbl80XzA9IHJ1bGVEYXRhSW50ZXJjaGFuZ2VGaWx0ZXJDb25kaXRpb24gKSApICk/ICkgOworICAgIHB1YmxpYyBmaW5hbCBFT2JqZWN0IHJ1bGVEYXRhSW50ZXJjaGFuZ2VGaWx0ZXJDb25kaXRpb24oKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICBFT2JqZWN0IGN1cnJlbnQgPSBudWxsOworCisgICAgICAgIFRva2VuIG90aGVybHZfMD1udWxsOworICAgICAgICBUb2tlbiBsdl92YWx1ZV8yXzA9bnVsbDsKKyAgICAgICAgRW51bWVyYXRvciBsdl9vcGVyYXRvcl8xXzAgPSBudWxsOworCisgICAgICAgIEVudW1lcmF0b3IgbHZfb3BlcmF0b3IyXzNfMCA9IG51bGw7CisKKyAgICAgICAgRU9iamVjdCBsdl9zdWJjb25kaXRpb25fNF8wID0gbnVsbDsKKworCisKKyAgICAgICAgCWVudGVyUnVsZSgpOworCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMjYwOjI6ICggKCAoIChvdGhlcmx2XzA9IFJVTEVfSUQgKSApICggKGx2X29wZXJhdG9yXzFfMD0gcnVsZUNvbmRpdGlvbkFuZE9wZXJhdG9yMSApICkgKCAobHZfdmFsdWVfMl8wPSBSVUxFX1NUUklORyApICk/ICggKCAobHZfb3BlcmF0b3IyXzNfMD0gcnVsZUNvbmRpdGlvbkFuZE9wZXJhdG9yMiApICkgKCAobHZfc3ViY29uZGl0aW9uXzRfMD0gcnVsZURhdGFJbnRlcmNoYW5nZUZpbHRlckNvbmRpdGlvbiApICkgKT8gKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMjYxOjI6ICggKCAob3RoZXJsdl8wPSBSVUxFX0lEICkgKSAoIChsdl9vcGVyYXRvcl8xXzA9IHJ1bGVDb25kaXRpb25BbmRPcGVyYXRvcjEgKSApICggKGx2X3ZhbHVlXzJfMD0gUlVMRV9TVFJJTkcgKSApPyAoICggKGx2X29wZXJhdG9yMl8zXzA9IHJ1bGVDb25kaXRpb25BbmRPcGVyYXRvcjIgKSApICggKGx2X3N1YmNvbmRpdGlvbl80XzA9IHJ1bGVEYXRhSW50ZXJjaGFuZ2VGaWx0ZXJDb25kaXRpb24gKSApICk/ICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIyNjE6MjogKCAoIChvdGhlcmx2XzA9IFJVTEVfSUQgKSApICggKGx2X29wZXJhdG9yXzFfMD0gcnVsZUNvbmRpdGlvbkFuZE9wZXJhdG9yMSApICkgKCAobHZfdmFsdWVfMl8wPSBSVUxFX1NUUklORyApICk/ICggKCAobHZfb3BlcmF0b3IyXzNfMD0gcnVsZUNvbmRpdGlvbkFuZE9wZXJhdG9yMiApICkgKCAobHZfc3ViY29uZGl0aW9uXzRfMD0gcnVsZURhdGFJbnRlcmNoYW5nZUZpbHRlckNvbmRpdGlvbiApICkgKT8gKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjI2MjozOiAoIChvdGhlcmx2XzA9IFJVTEVfSUQgKSApICggKGx2X29wZXJhdG9yXzFfMD0gcnVsZUNvbmRpdGlvbkFuZE9wZXJhdG9yMSApICkgKCAobHZfdmFsdWVfMl8wPSBSVUxFX1NUUklORyApICk/ICggKCAobHZfb3BlcmF0b3IyXzNfMD0gcnVsZUNvbmRpdGlvbkFuZE9wZXJhdG9yMiApICkgKCAobHZfc3ViY29uZGl0aW9uXzRfMD0gcnVsZURhdGFJbnRlcmNoYW5nZUZpbHRlckNvbmRpdGlvbiApICkgKT8KKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIyNjI6MzogKCAob3RoZXJsdl8wPSBSVUxFX0lEICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjI2Mzo0OiAob3RoZXJsdl8wPSBSVUxFX0lEICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIyNjM6NDogKG90aGVybHZfMD0gUlVMRV9JRCApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMjY0OjU6IG90aGVybHZfMD0gUlVMRV9JRAorICAgICAgICAgICAgeworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisKKyAgICAgICAgICAgICAgCQkJCQlpZiAoY3VycmVudD09bnVsbCkgeworICAgICAgICAgICAgICAJCQkJCQljdXJyZW50ID0gY3JlYXRlTW9kZWxFbGVtZW50KGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YUludGVyY2hhbmdlRmlsdGVyQ29uZGl0aW9uUnVsZSgpKTsKKyAgICAgICAgICAgICAgCQkJCQl9CisgICAgICAgICAgICAgIAkJCQkKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG90aGVybHZfMD0oVG9rZW4pbWF0Y2goaW5wdXQsUlVMRV9JRCxGT0xMT1dfNTcpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gY3VycmVudDsKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworCisgICAgICAgICAgICAgIAkJCQkJbmV3TGVhZk5vZGUob3RoZXJsdl8wLCBncmFtbWFyQWNjZXNzLmdldERhdGFJbnRlcmNoYW5nZUZpbHRlckNvbmRpdGlvbkFjY2VzcygpLmdldFJlZlByb3BlcnR5TEVudGl0eUZlYXR1cmVDcm9zc1JlZmVyZW5jZV8wXzAoKSk7CisgICAgICAgICAgICAgIAkJCQkKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjI3NTozOiAoIChsdl9vcGVyYXRvcl8xXzA9IHJ1bGVDb25kaXRpb25BbmRPcGVyYXRvcjEgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMjc2OjQ6IChsdl9vcGVyYXRvcl8xXzA9IHJ1bGVDb25kaXRpb25BbmRPcGVyYXRvcjEgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjI3Njo0OiAobHZfb3BlcmF0b3JfMV8wPSBydWxlQ29uZGl0aW9uQW5kT3BlcmF0b3IxICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIyNzc6NTogbHZfb3BlcmF0b3JfMV8wPSBydWxlQ29uZGl0aW9uQW5kT3BlcmF0b3IxCisgICAgICAgICAgICB7CisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKworICAgICAgICAgICAgICAJCQkJCW5ld0NvbXBvc2l0ZU5vZGUoZ3JhbW1hckFjY2Vzcy5nZXREYXRhSW50ZXJjaGFuZ2VGaWx0ZXJDb25kaXRpb25BY2Nlc3MoKS5nZXRPcGVyYXRvckNvbmRpdGlvbkFuZE9wZXJhdG9yMUVudW1SdWxlQ2FsbF8xXzAoKSk7CisgICAgICAgICAgICAgIAkJCQkKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzU4KTsKKyAgICAgICAgICAgIGx2X29wZXJhdG9yXzFfMD1ydWxlQ29uZGl0aW9uQW5kT3BlcmF0b3IxKCk7CisKKyAgICAgICAgICAgIHN0YXRlLl9mc3AtLTsKKyAgICAgICAgICAgIGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisKKyAgICAgICAgICAgICAgCQkJCQlpZiAoY3VycmVudD09bnVsbCkgeworICAgICAgICAgICAgICAJCQkJCQljdXJyZW50ID0gY3JlYXRlTW9kZWxFbGVtZW50Rm9yUGFyZW50KGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YUludGVyY2hhbmdlRmlsdGVyQ29uZGl0aW9uUnVsZSgpKTsKKyAgICAgICAgICAgICAgCQkJCQl9CisgICAgICAgICAgICAgIAkJCQkJc2V0KAorICAgICAgICAgICAgICAJCQkJCQljdXJyZW50LAorICAgICAgICAgICAgICAJCQkJCQkib3BlcmF0b3IiLAorICAgICAgICAgICAgICAJCQkJCQlsdl9vcGVyYXRvcl8xXzAsCisgICAgICAgICAgICAgIAkJCQkJCSJvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmRhdGFpbnRlcmNoYW5nZS5EYXRhRFNMLkNvbmRpdGlvbkFuZE9wZXJhdG9yMSIpOworICAgICAgICAgICAgICAJCQkJCWFmdGVyUGFyc2VyT3JFbnVtUnVsZUNhbGwoKTsKKyAgICAgICAgICAgICAgCQkJCQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMjk0OjM6ICggKGx2X3ZhbHVlXzJfMD0gUlVMRV9TVFJJTkcgKSApPworICAgICAgICAgICAgaW50IGFsdDQ0PTI7CisgICAgICAgICAgICBpbnQgTEE0NF8wID0gaW5wdXQuTEEoMSk7CisKKyAgICAgICAgICAgIGlmICggKExBNDRfMD09UlVMRV9TVFJJTkcpICkgeworICAgICAgICAgICAgICAgIGFsdDQ0PTE7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzd2l0Y2ggKGFsdDQ0KSB7CisgICAgICAgICAgICAgICAgY2FzZSAxIDoKKyAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjI5NTo0OiAobHZfdmFsdWVfMl8wPSBSVUxFX1NUUklORyApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjI5NTo0OiAobHZfdmFsdWVfMl8wPSBSVUxFX1NUUklORyApCisgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIyOTY6NTogbHZfdmFsdWVfMl8wPSBSVUxFX1NUUklORworICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGx2X3ZhbHVlXzJfMD0oVG9rZW4pbWF0Y2goaW5wdXQsUlVMRV9TVFJJTkcsRk9MTE9XXzU5KTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7CisgICAgICAgICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworCisgICAgICAgICAgICAgICAgICAgICAgCQkJCQluZXdMZWFmTm9kZShsdl92YWx1ZV8yXzAsIGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YUludGVyY2hhbmdlRmlsdGVyQ29uZGl0aW9uQWNjZXNzKCkuZ2V0VmFsdWVTVFJJTkdUZXJtaW5hbFJ1bGVDYWxsXzJfMCgpKTsKKyAgICAgICAgICAgICAgICAgICAgICAJCQkJCisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisKKyAgICAgICAgICAgICAgICAgICAgICAJCQkJCWlmIChjdXJyZW50PT1udWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgCQkJCQkJY3VycmVudCA9IGNyZWF0ZU1vZGVsRWxlbWVudChncmFtbWFyQWNjZXNzLmdldERhdGFJbnRlcmNoYW5nZUZpbHRlckNvbmRpdGlvblJ1bGUoKSk7CisgICAgICAgICAgICAgICAgICAgICAgCQkJCQl9CisgICAgICAgICAgICAgICAgICAgICAgCQkJCQlzZXRXaXRoTGFzdENvbnN1bWVkKAorICAgICAgICAgICAgICAgICAgICAgIAkJCQkJCWN1cnJlbnQsCisgICAgICAgICAgICAgICAgICAgICAgCQkJCQkJInZhbHVlIiwKKyAgICAgICAgICAgICAgICAgICAgICAJCQkJCQlsdl92YWx1ZV8yXzAsCisgICAgICAgICAgICAgICAgICAgICAgCQkJCQkJIm9yZy5lY2xpcHNlLnh0ZXh0LnhiYXNlLlh0eXBlLlNUUklORyIpOworICAgICAgICAgICAgICAgICAgICAgIAkJCQkKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjMxMjozOiAoICggKGx2X29wZXJhdG9yMl8zXzA9IHJ1bGVDb25kaXRpb25BbmRPcGVyYXRvcjIgKSApICggKGx2X3N1YmNvbmRpdGlvbl80XzA9IHJ1bGVEYXRhSW50ZXJjaGFuZ2VGaWx0ZXJDb25kaXRpb24gKSApICk/CisgICAgICAgICAgICBpbnQgYWx0NDU9MjsKKyAgICAgICAgICAgIGludCBMQTQ1XzAgPSBpbnB1dC5MQSgxKTsKKworICAgICAgICAgICAgaWYgKCAoKExBNDVfMD49MTY1ICYmIExBNDVfMDw9MTY2KSkgKSB7CisgICAgICAgICAgICAgICAgYWx0NDU9MTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHN3aXRjaCAoYWx0NDUpIHsKKyAgICAgICAgICAgICAgICBjYXNlIDEgOgorICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMzEzOjQ6ICggKGx2X29wZXJhdG9yMl8zXzA9IHJ1bGVDb25kaXRpb25BbmRPcGVyYXRvcjIgKSApICggKGx2X3N1YmNvbmRpdGlvbl80XzA9IHJ1bGVEYXRhSW50ZXJjaGFuZ2VGaWx0ZXJDb25kaXRpb24gKSApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjMxMzo0OiAoIChsdl9vcGVyYXRvcjJfM18wPSBydWxlQ29uZGl0aW9uQW5kT3BlcmF0b3IyICkgKQorICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMzE0OjU6IChsdl9vcGVyYXRvcjJfM18wPSBydWxlQ29uZGl0aW9uQW5kT3BlcmF0b3IyICkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMzE0OjU6IChsdl9vcGVyYXRvcjJfM18wPSBydWxlQ29uZGl0aW9uQW5kT3BlcmF0b3IyICkKKyAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjMxNTo2OiBsdl9vcGVyYXRvcjJfM18wPSBydWxlQ29uZGl0aW9uQW5kT3BlcmF0b3IyCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisKKyAgICAgICAgICAgICAgICAgICAgICAJCQkJCQluZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YUludGVyY2hhbmdlRmlsdGVyQ29uZGl0aW9uQWNjZXNzKCkuZ2V0T3BlcmF0b3IyQ29uZGl0aW9uQW5kT3BlcmF0b3IyRW51bVJ1bGVDYWxsXzNfMF8wKCkpOworICAgICAgICAgICAgICAgICAgICAgIAkJCQkJCisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfNCk7CisgICAgICAgICAgICAgICAgICAgIGx2X29wZXJhdG9yMl8zXzA9cnVsZUNvbmRpdGlvbkFuZE9wZXJhdG9yMigpOworCisgICAgICAgICAgICAgICAgICAgIHN0YXRlLl9mc3AtLTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7CisgICAgICAgICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworCisgICAgICAgICAgICAgICAgICAgICAgCQkJCQkJaWYgKGN1cnJlbnQ9PW51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAJCQkJCQkJY3VycmVudCA9IGNyZWF0ZU1vZGVsRWxlbWVudEZvclBhcmVudChncmFtbWFyQWNjZXNzLmdldERhdGFJbnRlcmNoYW5nZUZpbHRlckNvbmRpdGlvblJ1bGUoKSk7CisgICAgICAgICAgICAgICAgICAgICAgCQkJCQkJfQorICAgICAgICAgICAgICAgICAgICAgIAkJCQkJCXNldCgKKyAgICAgICAgICAgICAgICAgICAgICAJCQkJCQkJY3VycmVudCwKKyAgICAgICAgICAgICAgICAgICAgICAJCQkJCQkJIm9wZXJhdG9yMiIsCisgICAgICAgICAgICAgICAgICAgICAgCQkJCQkJCWx2X29wZXJhdG9yMl8zXzAsCisgICAgICAgICAgICAgICAgICAgICAgCQkJCQkJCSJvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmRhdGFpbnRlcmNoYW5nZS5EYXRhRFNMLkNvbmRpdGlvbkFuZE9wZXJhdG9yMiIpOworICAgICAgICAgICAgICAgICAgICAgIAkJCQkJCWFmdGVyUGFyc2VyT3JFbnVtUnVsZUNhbGwoKTsKKyAgICAgICAgICAgICAgICAgICAgICAJCQkJCQorICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIzMzI6NDogKCAobHZfc3ViY29uZGl0aW9uXzRfMD0gcnVsZURhdGFJbnRlcmNoYW5nZUZpbHRlckNvbmRpdGlvbiApICkKKyAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjMzMzo1OiAobHZfc3ViY29uZGl0aW9uXzRfMD0gcnVsZURhdGFJbnRlcmNoYW5nZUZpbHRlckNvbmRpdGlvbiApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjMzMzo1OiAobHZfc3ViY29uZGl0aW9uXzRfMD0gcnVsZURhdGFJbnRlcmNoYW5nZUZpbHRlckNvbmRpdGlvbiApCisgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIzMzQ6NjogbHZfc3ViY29uZGl0aW9uXzRfMD0gcnVsZURhdGFJbnRlcmNoYW5nZUZpbHRlckNvbmRpdGlvbgorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworCisgICAgICAgICAgICAgICAgICAgICAgCQkJCQkJbmV3Q29tcG9zaXRlTm9kZShncmFtbWFyQWNjZXNzLmdldERhdGFJbnRlcmNoYW5nZUZpbHRlckNvbmRpdGlvbkFjY2VzcygpLmdldFN1YmNvbmRpdGlvbkRhdGFJbnRlcmNoYW5nZUZpbHRlckNvbmRpdGlvblBhcnNlclJ1bGVDYWxsXzNfMV8wKCkpOworICAgICAgICAgICAgICAgICAgICAgIAkJCQkJCisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMik7CisgICAgICAgICAgICAgICAgICAgIGx2X3N1YmNvbmRpdGlvbl80XzA9cnVsZURhdGFJbnRlcmNoYW5nZUZpbHRlckNvbmRpdGlvbigpOworCisgICAgICAgICAgICAgICAgICAgIHN0YXRlLl9mc3AtLTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7CisgICAgICAgICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworCisgICAgICAgICAgICAgICAgICAgICAgCQkJCQkJaWYgKGN1cnJlbnQ9PW51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAJCQkJCQkJY3VycmVudCA9IGNyZWF0ZU1vZGVsRWxlbWVudEZvclBhcmVudChncmFtbWFyQWNjZXNzLmdldERhdGFJbnRlcmNoYW5nZUZpbHRlckNvbmRpdGlvblJ1bGUoKSk7CisgICAgICAgICAgICAgICAgICAgICAgCQkJCQkJfQorICAgICAgICAgICAgICAgICAgICAgIAkJCQkJCXNldCgKKyAgICAgICAgICAgICAgICAgICAgICAJCQkJCQkJY3VycmVudCwKKyAgICAgICAgICAgICAgICAgICAgICAJCQkJCQkJInN1YmNvbmRpdGlvbiIsCisgICAgICAgICAgICAgICAgICAgICAgCQkJCQkJCWx2X3N1YmNvbmRpdGlvbl80XzAsCisgICAgICAgICAgICAgICAgICAgICAgCQkJCQkJCSJvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmRhdGFpbnRlcmNoYW5nZS5EYXRhRFNMLkRhdGFJbnRlcmNoYW5nZUZpbHRlckNvbmRpdGlvbiIpOworICAgICAgICAgICAgICAgICAgICAgIAkJCQkJCWFmdGVyUGFyc2VyT3JFbnVtUnVsZUNhbGwoKTsKKyAgICAgICAgICAgICAgICAgICAgICAJCQkJCQorICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworCisgICAgICAgICAgICAgIAlsZWF2ZVJ1bGUoKTsKKworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgICAgIGNhdGNoIChSZWNvZ25pdGlvbkV4Y2VwdGlvbiByZSkgeworICAgICAgICAgICAgICAgIHJlY292ZXIoaW5wdXQscmUpOworICAgICAgICAgICAgICAgIGFwcGVuZFNraXBwZWRUb2tlbnMoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGN1cnJlbnQ7CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgInJ1bGVEYXRhSW50ZXJjaGFuZ2VGaWx0ZXJDb25kaXRpb24iCisKKworICAgIC8vICRBTlRMUiBzdGFydCAiZW50cnlSdWxlRGF0YUludGVyY2hhbmdlRXhwb3J0SGlkZSIKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMzU2OjE6IGVudHJ5UnVsZURhdGFJbnRlcmNoYW5nZUV4cG9ydEhpZGUgcmV0dXJucyBbRU9iamVjdCBjdXJyZW50PW51bGxdIDogaXZfcnVsZURhdGFJbnRlcmNoYW5nZUV4cG9ydEhpZGU9IHJ1bGVEYXRhSW50ZXJjaGFuZ2VFeHBvcnRIaWRlIEVPRiA7CisgICAgcHVibGljIGZpbmFsIEVPYmplY3QgZW50cnlSdWxlRGF0YUludGVyY2hhbmdlRXhwb3J0SGlkZSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIEVPYmplY3QgY3VycmVudCA9IG51bGw7CisKKyAgICAgICAgRU9iamVjdCBpdl9ydWxlRGF0YUludGVyY2hhbmdlRXhwb3J0SGlkZSA9IG51bGw7CisKKworICAgICAgICB0cnkgeworICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjM1Njo2NjogKGl2X3J1bGVEYXRhSW50ZXJjaGFuZ2VFeHBvcnRIaWRlPSBydWxlRGF0YUludGVyY2hhbmdlRXhwb3J0SGlkZSBFT0YgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjM1NzoyOiBpdl9ydWxlRGF0YUludGVyY2hhbmdlRXhwb3J0SGlkZT0gcnVsZURhdGFJbnRlcmNoYW5nZUV4cG9ydEhpZGUgRU9GCisgICAgICAgICAgICB7CisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIG5ld0NvbXBvc2l0ZU5vZGUoZ3JhbW1hckFjY2Vzcy5nZXREYXRhSW50ZXJjaGFuZ2VFeHBvcnRIaWRlUnVsZSgpKTsgCisgICAgICAgICAgICB9CisgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV18xKTsKKyAgICAgICAgICAgIGl2X3J1bGVEYXRhSW50ZXJjaGFuZ2VFeHBvcnRIaWRlPXJ1bGVEYXRhSW50ZXJjaGFuZ2VFeHBvcnRIaWRlKCk7CisKKyAgICAgICAgICAgIHN0YXRlLl9mc3AtLTsKKyAgICAgICAgICAgIGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBjdXJyZW50ID1pdl9ydWxlRGF0YUludGVyY2hhbmdlRXhwb3J0SGlkZTsgCisgICAgICAgICAgICB9CisgICAgICAgICAgICBtYXRjaChpbnB1dCxFT0YsRk9MTE9XXzIpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gY3VycmVudDsKKworICAgICAgICAgICAgfQorCisgICAgICAgIH0KKworICAgICAgICAgICAgY2F0Y2ggKFJlY29nbml0aW9uRXhjZXB0aW9uIHJlKSB7CisgICAgICAgICAgICAgICAgcmVjb3ZlcihpbnB1dCxyZSk7CisgICAgICAgICAgICAgICAgYXBwZW5kU2tpcHBlZFRva2VucygpOworICAgICAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gY3VycmVudDsKKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAiZW50cnlSdWxlRGF0YUludGVyY2hhbmdlRXhwb3J0SGlkZSIKKworCisgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlRGF0YUludGVyY2hhbmdlRXhwb3J0SGlkZSIKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMzYzOjE6IHJ1bGVEYXRhSW50ZXJjaGFuZ2VFeHBvcnRIaWRlIHJldHVybnMgW0VPYmplY3QgY3VycmVudD1udWxsXSA6ICggKCkgKCAob3RoZXJsdl8xPSBSVUxFX0lEICkgKSApIDsKKyAgICBwdWJsaWMgZmluYWwgRU9iamVjdCBydWxlRGF0YUludGVyY2hhbmdlRXhwb3J0SGlkZSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIEVPYmplY3QgY3VycmVudCA9IG51bGw7CisKKyAgICAgICAgVG9rZW4gb3RoZXJsdl8xPW51bGw7CisKKworICAgICAgICAJZW50ZXJSdWxlKCk7CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIzNjk6MjogKCAoICgpICggKG90aGVybHZfMT0gUlVMRV9JRCApICkgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMzcwOjI6ICggKCkgKCAob3RoZXJsdl8xPSBSVUxFX0lEICkgKSApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMzcwOjI6ICggKCkgKCAob3RoZXJsdl8xPSBSVUxFX0lEICkgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMzcxOjM6ICgpICggKG90aGVybHZfMT0gUlVMRV9JRCApICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIzNzE6MzogKCkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIzNzI6NDogCisgICAgICAgICAgICB7CisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKworICAgICAgICAgICAgICAJCQkJY3VycmVudCA9IGZvcmNlQ3JlYXRlTW9kZWxFbGVtZW50KAorICAgICAgICAgICAgICAJCQkJCWdyYW1tYXJBY2Nlc3MuZ2V0RGF0YUludGVyY2hhbmdlRXhwb3J0SGlkZUFjY2VzcygpLmdldERhdGFJbnRlcmNoYW5nZUV4cG9ydEhpZGVBY3Rpb25fMCgpLAorICAgICAgICAgICAgICAJCQkJCWN1cnJlbnQpOworICAgICAgICAgICAgICAJCQkKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMzc4OjM6ICggKG90aGVybHZfMT0gUlVMRV9JRCApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIzNzk6NDogKG90aGVybHZfMT0gUlVMRV9JRCApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMzc5OjQ6IChvdGhlcmx2XzE9IFJVTEVfSUQgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjM4MDo1OiBvdGhlcmx2XzE9IFJVTEVfSUQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworCisgICAgICAgICAgICAgIAkJCQkJaWYgKGN1cnJlbnQ9PW51bGwpIHsKKyAgICAgICAgICAgICAgCQkJCQkJY3VycmVudCA9IGNyZWF0ZU1vZGVsRWxlbWVudChncmFtbWFyQWNjZXNzLmdldERhdGFJbnRlcmNoYW5nZUV4cG9ydEhpZGVSdWxlKCkpOworICAgICAgICAgICAgICAJCQkJCX0KKyAgICAgICAgICAgICAgCQkJCQorICAgICAgICAgICAgfQorICAgICAgICAgICAgb3RoZXJsdl8xPShUb2tlbiltYXRjaChpbnB1dCxSVUxFX0lELEZPTExPV18yKTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7CisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKworICAgICAgICAgICAgICAJCQkJCW5ld0xlYWZOb2RlKG90aGVybHZfMSwgZ3JhbW1hckFjY2Vzcy5nZXREYXRhSW50ZXJjaGFuZ2VFeHBvcnRIaWRlQWNjZXNzKCkuZ2V0UHJvcGVydHlMRW50aXR5RmVhdHVyZUNyb3NzUmVmZXJlbmNlXzFfMCgpKTsKKyAgICAgICAgICAgICAgCQkJCQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworCisgICAgICAgICAgICAgIAlsZWF2ZVJ1bGUoKTsKKworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgICAgIGNhdGNoIChSZWNvZ25pdGlvbkV4Y2VwdGlvbiByZSkgeworICAgICAgICAgICAgICAgIHJlY292ZXIoaW5wdXQscmUpOworICAgICAgICAgICAgICAgIGFwcGVuZFNraXBwZWRUb2tlbnMoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGN1cnJlbnQ7CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgInJ1bGVEYXRhSW50ZXJjaGFuZ2VFeHBvcnRIaWRlIgorCisKICAgICAvLyAkQU5UTFIgc3RhcnQgImVudHJ5UnVsZURhdGFJbnRlcmNoYW5nZVByZWRlZmluZWRFeHByZXNzaW9uIgotICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE5NTY6MTogZW50cnlSdWxlRGF0YUludGVyY2hhbmdlUHJlZGVmaW5lZEV4cHJlc3Npb24gcmV0dXJucyBbRU9iamVjdCBjdXJyZW50PW51bGxdIDogaXZfcnVsZURhdGFJbnRlcmNoYW5nZVByZWRlZmluZWRFeHByZXNzaW9uPSBydWxlRGF0YUludGVyY2hhbmdlUHJlZGVmaW5lZEV4cHJlc3Npb24gRU9GIDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMzk1OjE6IGVudHJ5UnVsZURhdGFJbnRlcmNoYW5nZVByZWRlZmluZWRFeHByZXNzaW9uIHJldHVybnMgW0VPYmplY3QgY3VycmVudD1udWxsXSA6IGl2X3J1bGVEYXRhSW50ZXJjaGFuZ2VQcmVkZWZpbmVkRXhwcmVzc2lvbj0gcnVsZURhdGFJbnRlcmNoYW5nZVByZWRlZmluZWRFeHByZXNzaW9uIEVPRiA7CiAgICAgcHVibGljIGZpbmFsIEVPYmplY3QgZW50cnlSdWxlRGF0YUludGVyY2hhbmdlUHJlZGVmaW5lZEV4cHJlc3Npb24oKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogICAgICAgICBFT2JqZWN0IGN1cnJlbnQgPSBudWxsOwogCkBAIC01MjIwLDggKzY0MTQsOCBAQAogCiAKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE5NTY6NzY6IChpdl9ydWxlRGF0YUludGVyY2hhbmdlUHJlZGVmaW5lZEV4cHJlc3Npb249IHJ1bGVEYXRhSW50ZXJjaGFuZ2VQcmVkZWZpbmVkRXhwcmVzc2lvbiBFT0YgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTk1NzoyOiBpdl9ydWxlRGF0YUludGVyY2hhbmdlUHJlZGVmaW5lZEV4cHJlc3Npb249IHJ1bGVEYXRhSW50ZXJjaGFuZ2VQcmVkZWZpbmVkRXhwcmVzc2lvbiBFT0YKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIzOTU6NzY6IChpdl9ydWxlRGF0YUludGVyY2hhbmdlUHJlZGVmaW5lZEV4cHJlc3Npb249IHJ1bGVEYXRhSW50ZXJjaGFuZ2VQcmVkZWZpbmVkRXhwcmVzc2lvbiBFT0YgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjM5NjoyOiBpdl9ydWxlRGF0YUludGVyY2hhbmdlUHJlZGVmaW5lZEV4cHJlc3Npb249IHJ1bGVEYXRhSW50ZXJjaGFuZ2VQcmVkZWZpbmVkRXhwcmVzc2lvbiBFT0YKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgbmV3Q29tcG9zaXRlTm9kZShncmFtbWFyQWNjZXNzLmdldERhdGFJbnRlcmNoYW5nZVByZWRlZmluZWRFeHByZXNzaW9uUnVsZSgpKTsgCkBAIC01MjUyLDcgKzY0NDYsNyBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVEYXRhSW50ZXJjaGFuZ2VQcmVkZWZpbmVkRXhwcmVzc2lvbiIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxOTYzOjE6IHJ1bGVEYXRhSW50ZXJjaGFuZ2VQcmVkZWZpbmVkRXhwcmVzc2lvbiByZXR1cm5zIFtFT2JqZWN0IGN1cnJlbnQ9bnVsbF0gOiAoICgpIG90aGVybHZfMT0gJ2Fzc2lnbicgKCAob3RoZXJsdl8yPSBSVUxFX0lEICkgKSBvdGhlcmx2XzM9ICd3aXRoJyAoIChsdl9iZWFuXzRfMD0gcnVsZVByZWRlZmluZWRCZWFuRW51bSApICkgb3RoZXJsdl81PSAnYXMnICggKGx2X2JlYW5UeXBlXzZfMD0gcnVsZVByZWRlZmluZWRCZWFuVHlwZUVudW0gKSApICkgOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI0MDI6MTogcnVsZURhdGFJbnRlcmNoYW5nZVByZWRlZmluZWRFeHByZXNzaW9uIHJldHVybnMgW0VPYmplY3QgY3VycmVudD1udWxsXSA6ICggKCkgb3RoZXJsdl8xPSAnYXNzaWduJyAoIChvdGhlcmx2XzI9IFJVTEVfSUQgKSApIG90aGVybHZfMz0gJ3dpdGgnICggKGx2X2JlYW5fNF8wPSBydWxlUHJlZGVmaW5lZEJlYW5FbnVtICkgKSBvdGhlcmx2XzU9ICdhcycgKCAobHZfYmVhblR5cGVfNl8wPSBydWxlUHJlZGVmaW5lZEJlYW5UeXBlRW51bSApICkgKSA7CiAgICAgcHVibGljIGZpbmFsIEVPYmplY3QgcnVsZURhdGFJbnRlcmNoYW5nZVByZWRlZmluZWRFeHByZXNzaW9uKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKICAgICAgICAgRU9iamVjdCBjdXJyZW50ID0gbnVsbDsKIApAQCAtNTI2OSwxNCArNjQ2MywxNCBAQAogICAgICAgICAJZW50ZXJSdWxlKCk7CiAKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE5Njk6MjogKCAoICgpIG90aGVybHZfMT0gJ2Fzc2lnbicgKCAob3RoZXJsdl8yPSBSVUxFX0lEICkgKSBvdGhlcmx2XzM9ICd3aXRoJyAoIChsdl9iZWFuXzRfMD0gcnVsZVByZWRlZmluZWRCZWFuRW51bSApICkgb3RoZXJsdl81PSAnYXMnICggKGx2X2JlYW5UeXBlXzZfMD0gcnVsZVByZWRlZmluZWRCZWFuVHlwZUVudW0gKSApICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTk3MDoyOiAoICgpIG90aGVybHZfMT0gJ2Fzc2lnbicgKCAob3RoZXJsdl8yPSBSVUxFX0lEICkgKSBvdGhlcmx2XzM9ICd3aXRoJyAoIChsdl9iZWFuXzRfMD0gcnVsZVByZWRlZmluZWRCZWFuRW51bSApICkgb3RoZXJsdl81PSAnYXMnICggKGx2X2JlYW5UeXBlXzZfMD0gcnVsZVByZWRlZmluZWRCZWFuVHlwZUVudW0gKSApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI0MDg6MjogKCAoICgpIG90aGVybHZfMT0gJ2Fzc2lnbicgKCAob3RoZXJsdl8yPSBSVUxFX0lEICkgKSBvdGhlcmx2XzM9ICd3aXRoJyAoIChsdl9iZWFuXzRfMD0gcnVsZVByZWRlZmluZWRCZWFuRW51bSApICkgb3RoZXJsdl81PSAnYXMnICggKGx2X2JlYW5UeXBlXzZfMD0gcnVsZVByZWRlZmluZWRCZWFuVHlwZUVudW0gKSApICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjQwOToyOiAoICgpIG90aGVybHZfMT0gJ2Fzc2lnbicgKCAob3RoZXJsdl8yPSBSVUxFX0lEICkgKSBvdGhlcmx2XzM9ICd3aXRoJyAoIChsdl9iZWFuXzRfMD0gcnVsZVByZWRlZmluZWRCZWFuRW51bSApICkgb3RoZXJsdl81PSAnYXMnICggKGx2X2JlYW5UeXBlXzZfMD0gcnVsZVByZWRlZmluZWRCZWFuVHlwZUVudW0gKSApICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE5NzA6MjogKCAoKSBvdGhlcmx2XzE9ICdhc3NpZ24nICggKG90aGVybHZfMj0gUlVMRV9JRCApICkgb3RoZXJsdl8zPSAnd2l0aCcgKCAobHZfYmVhbl80XzA9IHJ1bGVQcmVkZWZpbmVkQmVhbkVudW0gKSApIG90aGVybHZfNT0gJ2FzJyAoIChsdl9iZWFuVHlwZV82XzA9IHJ1bGVQcmVkZWZpbmVkQmVhblR5cGVFbnVtICkgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxOTcxOjM6ICgpIG90aGVybHZfMT0gJ2Fzc2lnbicgKCAob3RoZXJsdl8yPSBSVUxFX0lEICkgKSBvdGhlcmx2XzM9ICd3aXRoJyAoIChsdl9iZWFuXzRfMD0gcnVsZVByZWRlZmluZWRCZWFuRW51bSApICkgb3RoZXJsdl81PSAnYXMnICggKGx2X2JlYW5UeXBlXzZfMD0gcnVsZVByZWRlZmluZWRCZWFuVHlwZUVudW0gKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNDA5OjI6ICggKCkgb3RoZXJsdl8xPSAnYXNzaWduJyAoIChvdGhlcmx2XzI9IFJVTEVfSUQgKSApIG90aGVybHZfMz0gJ3dpdGgnICggKGx2X2JlYW5fNF8wPSBydWxlUHJlZGVmaW5lZEJlYW5FbnVtICkgKSBvdGhlcmx2XzU9ICdhcycgKCAobHZfYmVhblR5cGVfNl8wPSBydWxlUHJlZGVmaW5lZEJlYW5UeXBlRW51bSApICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjQxMDozOiAoKSBvdGhlcmx2XzE9ICdhc3NpZ24nICggKG90aGVybHZfMj0gUlVMRV9JRCApICkgb3RoZXJsdl8zPSAnd2l0aCcgKCAobHZfYmVhbl80XzA9IHJ1bGVQcmVkZWZpbmVkQmVhbkVudW0gKSApIG90aGVybHZfNT0gJ2FzJyAoIChsdl9iZWFuVHlwZV82XzA9IHJ1bGVQcmVkZWZpbmVkQmVhblR5cGVFbnVtICkgKQogICAgICAgICAgICAgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTk3MTozOiAoKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTk3Mjo0OiAKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI0MTA6MzogKCkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI0MTE6NDogCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKIApAQCAtNTI4OCwxNyArNjQ4MiwxNyBAQAogCiAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgIG90aGVybHZfMT0oVG9rZW4pbWF0Y2goaW5wdXQsNjAsRk9MTE9XXzQpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gY3VycmVudDsKKyAgICAgICAgICAgIG90aGVybHZfMT0oVG9rZW4pbWF0Y2goaW5wdXQsNjcsRk9MTE9XXzQpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gY3VycmVudDsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogCiAgICAgICAgICAgICAgIAkJCW5ld0xlYWZOb2RlKG90aGVybHZfMSwgZ3JhbW1hckFjY2Vzcy5nZXREYXRhSW50ZXJjaGFuZ2VQcmVkZWZpbmVkRXhwcmVzc2lvbkFjY2VzcygpLmdldEFzc2lnbktleXdvcmRfMSgpKTsKICAgICAgICAgICAgICAgCQkKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE5ODI6MzogKCAob3RoZXJsdl8yPSBSVUxFX0lEICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MTk4Mzo0OiAob3RoZXJsdl8yPSBSVUxFX0lEICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI0MjE6MzogKCAob3RoZXJsdl8yPSBSVUxFX0lEICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjQyMjo0OiAob3RoZXJsdl8yPSBSVUxFX0lEICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE5ODM6NDogKG90aGVybHZfMj0gUlVMRV9JRCApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoxOTg0OjU6IG90aGVybHZfMj0gUlVMRV9JRAorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjQyMjo0OiAob3RoZXJsdl8yPSBSVUxFX0lEICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI0MjM6NTogb3RoZXJsdl8yPSBSVUxFX0lECiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKIApAQCAtNTMwNyw3ICs2NTAxLDcgQEAKICAgICAgICAgICAgICAgCQkJCQl9CiAgICAgICAgICAgICAgIAkJCQkKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG90aGVybHZfMj0oVG9rZW4pbWF0Y2goaW5wdXQsUlVMRV9JRCxGT0xMT1dfMzcpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gY3VycmVudDsKKyAgICAgICAgICAgIG90aGVybHZfMj0oVG9rZW4pbWF0Y2goaW5wdXQsUlVMRV9JRCxGT0xMT1dfNDQpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gY3VycmVudDsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogCiAgICAgICAgICAgICAgIAkJCQkJbmV3TGVhZk5vZGUob3RoZXJsdl8yLCBncmFtbWFyQWNjZXNzLmdldERhdGFJbnRlcmNoYW5nZVByZWRlZmluZWRFeHByZXNzaW9uQWNjZXNzKCkuZ2V0VGFyZ2V0UHJvcGVydHlMRW50aXR5QXR0cmlidXRlQ3Jvc3NSZWZlcmVuY2VfMl8wKCkpOwpAQCAtNTMxOSwyNCArNjUxMywyNCBAQAogCiAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgIG90aGVybHZfMz0oVG9rZW4pbWF0Y2goaW5wdXQsNDgsRk9MTE9XXzQ2KTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7CisgICAgICAgICAgICBvdGhlcmx2XzM9KFRva2VuKW1hdGNoKGlucHV0LDUyLEZPTExPV182MCk7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OwogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAKICAgICAgICAgICAgICAgCQkJbmV3TGVhZk5vZGUob3RoZXJsdl8zLCBncmFtbWFyQWNjZXNzLmdldERhdGFJbnRlcmNoYW5nZVByZWRlZmluZWRFeHByZXNzaW9uQWNjZXNzKCkuZ2V0V2l0aEtleXdvcmRfMygpKTsKICAgICAgICAgICAgICAgCQkKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjE5OTk6MzogKCAobHZfYmVhbl80XzA9IHJ1bGVQcmVkZWZpbmVkQmVhbkVudW0gKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMDAwOjQ6IChsdl9iZWFuXzRfMD0gcnVsZVByZWRlZmluZWRCZWFuRW51bSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNDM4OjM6ICggKGx2X2JlYW5fNF8wPSBydWxlUHJlZGVmaW5lZEJlYW5FbnVtICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjQzOTo0OiAobHZfYmVhbl80XzA9IHJ1bGVQcmVkZWZpbmVkQmVhbkVudW0gKQogICAgICAgICAgICAgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjAwMDo0OiAobHZfYmVhbl80XzA9IHJ1bGVQcmVkZWZpbmVkQmVhbkVudW0gKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjAwMTo1OiBsdl9iZWFuXzRfMD0gcnVsZVByZWRlZmluZWRCZWFuRW51bQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjQzOTo0OiAobHZfYmVhbl80XzA9IHJ1bGVQcmVkZWZpbmVkQmVhbkVudW0gKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjQ0MDo1OiBsdl9iZWFuXzRfMD0gcnVsZVByZWRlZmluZWRCZWFuRW51bQogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAKICAgICAgICAgICAgICAgCQkJCQluZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YUludGVyY2hhbmdlUHJlZGVmaW5lZEV4cHJlc3Npb25BY2Nlc3MoKS5nZXRCZWFuUHJlZGVmaW5lZEJlYW5FbnVtRW51bVJ1bGVDYWxsXzRfMCgpKTsKICAgICAgICAgICAgICAgCQkJCQogICAgICAgICAgICAgfQotICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfNDcpOworICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfNjEpOwogICAgICAgICAgICAgbHZfYmVhbl80XzA9cnVsZVByZWRlZmluZWRCZWFuRW51bSgpOwogCiAgICAgICAgICAgICBzdGF0ZS5fZnNwLS07CkBAIC01MzYwLDE3ICs2NTU0LDE3IEBACiAKICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgb3RoZXJsdl81PShUb2tlbiltYXRjaChpbnB1dCw2MSxGT0xMT1dfNDgpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gY3VycmVudDsKKyAgICAgICAgICAgIG90aGVybHZfNT0oVG9rZW4pbWF0Y2goaW5wdXQsNjgsRk9MTE9XXzYyKTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKIAogICAgICAgICAgICAgICAJCQluZXdMZWFmTm9kZShvdGhlcmx2XzUsIGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YUludGVyY2hhbmdlUHJlZGVmaW5lZEV4cHJlc3Npb25BY2Nlc3MoKS5nZXRBc0tleXdvcmRfNSgpKTsKICAgICAgICAgICAgICAgCQkKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIwMjI6MzogKCAobHZfYmVhblR5cGVfNl8wPSBydWxlUHJlZGVmaW5lZEJlYW5UeXBlRW51bSApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIwMjM6NDogKGx2X2JlYW5UeXBlXzZfMD0gcnVsZVByZWRlZmluZWRCZWFuVHlwZUVudW0gKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjQ2MTozOiAoIChsdl9iZWFuVHlwZV82XzA9IHJ1bGVQcmVkZWZpbmVkQmVhblR5cGVFbnVtICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjQ2Mjo0OiAobHZfYmVhblR5cGVfNl8wPSBydWxlUHJlZGVmaW5lZEJlYW5UeXBlRW51bSApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMDIzOjQ6IChsdl9iZWFuVHlwZV82XzA9IHJ1bGVQcmVkZWZpbmVkQmVhblR5cGVFbnVtICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIwMjQ6NTogbHZfYmVhblR5cGVfNl8wPSBydWxlUHJlZGVmaW5lZEJlYW5UeXBlRW51bQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjQ2Mjo0OiAobHZfYmVhblR5cGVfNl8wPSBydWxlUHJlZGVmaW5lZEJlYW5UeXBlRW51bSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNDYzOjU6IGx2X2JlYW5UeXBlXzZfMD0gcnVsZVByZWRlZmluZWRCZWFuVHlwZUVudW0KICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogCkBAIC01NDI2LDcgKzY2MjAsNyBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgImVudHJ5UnVsZURhdGFJbnRlcmNoYW5nZU1hcHBpbmciCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjA0NToxOiBlbnRyeVJ1bGVEYXRhSW50ZXJjaGFuZ2VNYXBwaW5nIHJldHVybnMgW0VPYmplY3QgY3VycmVudD1udWxsXSA6IGl2X3J1bGVEYXRhSW50ZXJjaGFuZ2VNYXBwaW5nPSBydWxlRGF0YUludGVyY2hhbmdlTWFwcGluZyBFT0YgOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI0ODQ6MTogZW50cnlSdWxlRGF0YUludGVyY2hhbmdlTWFwcGluZyByZXR1cm5zIFtFT2JqZWN0IGN1cnJlbnQ9bnVsbF0gOiBpdl9ydWxlRGF0YUludGVyY2hhbmdlTWFwcGluZz0gcnVsZURhdGFJbnRlcmNoYW5nZU1hcHBpbmcgRU9GIDsKICAgICBwdWJsaWMgZmluYWwgRU9iamVjdCBlbnRyeVJ1bGVEYXRhSW50ZXJjaGFuZ2VNYXBwaW5nKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKICAgICAgICAgRU9iamVjdCBjdXJyZW50ID0gbnVsbDsKIApAQCAtNTQzNCw4ICs2NjI4LDggQEAKIAogCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMDQ1OjYzOiAoaXZfcnVsZURhdGFJbnRlcmNoYW5nZU1hcHBpbmc9IHJ1bGVEYXRhSW50ZXJjaGFuZ2VNYXBwaW5nIEVPRiApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMDQ2OjI6IGl2X3J1bGVEYXRhSW50ZXJjaGFuZ2VNYXBwaW5nPSBydWxlRGF0YUludGVyY2hhbmdlTWFwcGluZyBFT0YKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI0ODQ6NjM6IChpdl9ydWxlRGF0YUludGVyY2hhbmdlTWFwcGluZz0gcnVsZURhdGFJbnRlcmNoYW5nZU1hcHBpbmcgRU9GICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI0ODU6MjogaXZfcnVsZURhdGFJbnRlcmNoYW5nZU1hcHBpbmc9IHJ1bGVEYXRhSW50ZXJjaGFuZ2VNYXBwaW5nIEVPRgogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBuZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YUludGVyY2hhbmdlTWFwcGluZ1J1bGUoKSk7IApAQCAtNTQ2Niw3ICs2NjYwLDcgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlRGF0YUludGVyY2hhbmdlTWFwcGluZyIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMDUyOjE6IHJ1bGVEYXRhSW50ZXJjaGFuZ2VNYXBwaW5nIHJldHVybnMgW0VPYmplY3QgY3VycmVudD1udWxsXSA6ICh0aGlzX0RhdGFJbnRlcmNoYW5nZVZhbHVlTWFwcGluZ18wPSBydWxlRGF0YUludGVyY2hhbmdlVmFsdWVNYXBwaW5nIHwgdGhpc19EYXRhSW50ZXJjaGFuZ2VCbG9iTWFwcGluZ18xPSBydWxlRGF0YUludGVyY2hhbmdlQmxvYk1hcHBpbmcgKSA7CisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjQ5MToxOiBydWxlRGF0YUludGVyY2hhbmdlTWFwcGluZyByZXR1cm5zIFtFT2JqZWN0IGN1cnJlbnQ9bnVsbF0gOiAodGhpc19EYXRhSW50ZXJjaGFuZ2VWYWx1ZU1hcHBpbmdfMD0gcnVsZURhdGFJbnRlcmNoYW5nZVZhbHVlTWFwcGluZyB8IHRoaXNfRGF0YUludGVyY2hhbmdlQmxvYk1hcHBpbmdfMT0gcnVsZURhdGFJbnRlcmNoYW5nZUJsb2JNYXBwaW5nICkgOwogICAgIHB1YmxpYyBmaW5hbCBFT2JqZWN0IHJ1bGVEYXRhSW50ZXJjaGFuZ2VNYXBwaW5nKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKICAgICAgICAgRU9iamVjdCBjdXJyZW50ID0gbnVsbDsKIApAQCAtNTQ3OSwyOSArNjY3MywyOSBAQAogICAgICAgICAJZW50ZXJSdWxlKCk7CiAKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIwNTg6MjogKCAodGhpc19EYXRhSW50ZXJjaGFuZ2VWYWx1ZU1hcHBpbmdfMD0gcnVsZURhdGFJbnRlcmNoYW5nZVZhbHVlTWFwcGluZyB8IHRoaXNfRGF0YUludGVyY2hhbmdlQmxvYk1hcHBpbmdfMT0gcnVsZURhdGFJbnRlcmNoYW5nZUJsb2JNYXBwaW5nICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjA1OToyOiAodGhpc19EYXRhSW50ZXJjaGFuZ2VWYWx1ZU1hcHBpbmdfMD0gcnVsZURhdGFJbnRlcmNoYW5nZVZhbHVlTWFwcGluZyB8IHRoaXNfRGF0YUludGVyY2hhbmdlQmxvYk1hcHBpbmdfMT0gcnVsZURhdGFJbnRlcmNoYW5nZUJsb2JNYXBwaW5nICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI0OTc6MjogKCAodGhpc19EYXRhSW50ZXJjaGFuZ2VWYWx1ZU1hcHBpbmdfMD0gcnVsZURhdGFJbnRlcmNoYW5nZVZhbHVlTWFwcGluZyB8IHRoaXNfRGF0YUludGVyY2hhbmdlQmxvYk1hcHBpbmdfMT0gcnVsZURhdGFJbnRlcmNoYW5nZUJsb2JNYXBwaW5nICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjQ5ODoyOiAodGhpc19EYXRhSW50ZXJjaGFuZ2VWYWx1ZU1hcHBpbmdfMD0gcnVsZURhdGFJbnRlcmNoYW5nZVZhbHVlTWFwcGluZyB8IHRoaXNfRGF0YUludGVyY2hhbmdlQmxvYk1hcHBpbmdfMT0gcnVsZURhdGFJbnRlcmNoYW5nZUJsb2JNYXBwaW5nICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIwNTk6MjogKHRoaXNfRGF0YUludGVyY2hhbmdlVmFsdWVNYXBwaW5nXzA9IHJ1bGVEYXRhSW50ZXJjaGFuZ2VWYWx1ZU1hcHBpbmcgfCB0aGlzX0RhdGFJbnRlcmNoYW5nZUJsb2JNYXBwaW5nXzE9IHJ1bGVEYXRhSW50ZXJjaGFuZ2VCbG9iTWFwcGluZyApCi0gICAgICAgICAgICBpbnQgYWx0MzU9MjsKLSAgICAgICAgICAgIGludCBMQTM1XzAgPSBpbnB1dC5MQSgxKTsKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI0OTg6MjogKHRoaXNfRGF0YUludGVyY2hhbmdlVmFsdWVNYXBwaW5nXzA9IHJ1bGVEYXRhSW50ZXJjaGFuZ2VWYWx1ZU1hcHBpbmcgfCB0aGlzX0RhdGFJbnRlcmNoYW5nZUJsb2JNYXBwaW5nXzE9IHJ1bGVEYXRhSW50ZXJjaGFuZ2VCbG9iTWFwcGluZyApCisgICAgICAgICAgICBpbnQgYWx0NDY9MjsKKyAgICAgICAgICAgIGludCBMQTQ2XzAgPSBpbnB1dC5MQSgxKTsKIAotICAgICAgICAgICAgaWYgKCAoTEEzNV8wPT02MikgKSB7Ci0gICAgICAgICAgICAgICAgYWx0MzU9MTsKKyAgICAgICAgICAgIGlmICggKExBNDZfMD09NjkpICkgeworICAgICAgICAgICAgICAgIGFsdDQ2PTE7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIGlmICggKExBMzVfMD09NjQpICkgewotICAgICAgICAgICAgICAgIGFsdDM1PTI7CisgICAgICAgICAgICBlbHNlIGlmICggKExBNDZfMD09NzEpICkgeworICAgICAgICAgICAgICAgIGFsdDQ2PTI7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICBpZiAoc3RhdGUuYmFja3RyYWNraW5nPjApIHtzdGF0ZS5mYWlsZWQ9dHJ1ZTsgcmV0dXJuIGN1cnJlbnQ7fQogICAgICAgICAgICAgICAgIE5vVmlhYmxlQWx0RXhjZXB0aW9uIG52YWUgPQotICAgICAgICAgICAgICAgICAgICBuZXcgTm9WaWFibGVBbHRFeGNlcHRpb24oIiIsIDM1LCAwLCBpbnB1dCk7CisgICAgICAgICAgICAgICAgICAgIG5ldyBOb1ZpYWJsZUFsdEV4Y2VwdGlvbigiIiwgNDYsIDAsIGlucHV0KTsKIAogICAgICAgICAgICAgICAgIHRocm93IG52YWU7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBzd2l0Y2ggKGFsdDM1KSB7CisgICAgICAgICAgICBzd2l0Y2ggKGFsdDQ2KSB7CiAgICAgICAgICAgICAgICAgY2FzZSAxIDoKLSAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjA2MDozOiB0aGlzX0RhdGFJbnRlcmNoYW5nZVZhbHVlTWFwcGluZ18wPSBydWxlRGF0YUludGVyY2hhbmdlVmFsdWVNYXBwaW5nCisgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI0OTk6MzogdGhpc19EYXRhSW50ZXJjaGFuZ2VWYWx1ZU1hcHBpbmdfMD0gcnVsZURhdGFJbnRlcmNoYW5nZVZhbHVlTWFwcGluZwogICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogCkBAIC01NTIzLDcgKzY3MTcsNyBAQAogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgIGNhc2UgMiA6Ci0gICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIwNjk6MzogdGhpc19EYXRhSW50ZXJjaGFuZ2VCbG9iTWFwcGluZ18xPSBydWxlRGF0YUludGVyY2hhbmdlQmxvYk1hcHBpbmcKKyAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjUwODozOiB0aGlzX0RhdGFJbnRlcmNoYW5nZUJsb2JNYXBwaW5nXzE9IHJ1bGVEYXRhSW50ZXJjaGFuZ2VCbG9iTWFwcGluZwogICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogCkBAIC01NTY5LDcgKzY3NjMsNyBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgImVudHJ5UnVsZURhdGFJbnRlcmNoYW5nZVZhbHVlTWFwcGluZyIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMDgxOjE6IGVudHJ5UnVsZURhdGFJbnRlcmNoYW5nZVZhbHVlTWFwcGluZyByZXR1cm5zIFtFT2JqZWN0IGN1cnJlbnQ9bnVsbF0gOiBpdl9ydWxlRGF0YUludGVyY2hhbmdlVmFsdWVNYXBwaW5nPSBydWxlRGF0YUludGVyY2hhbmdlVmFsdWVNYXBwaW5nIEVPRiA7CisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjUyMDoxOiBlbnRyeVJ1bGVEYXRhSW50ZXJjaGFuZ2VWYWx1ZU1hcHBpbmcgcmV0dXJucyBbRU9iamVjdCBjdXJyZW50PW51bGxdIDogaXZfcnVsZURhdGFJbnRlcmNoYW5nZVZhbHVlTWFwcGluZz0gcnVsZURhdGFJbnRlcmNoYW5nZVZhbHVlTWFwcGluZyBFT0YgOwogICAgIHB1YmxpYyBmaW5hbCBFT2JqZWN0IGVudHJ5UnVsZURhdGFJbnRlcmNoYW5nZVZhbHVlTWFwcGluZygpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAgICAgICAgIEVPYmplY3QgY3VycmVudCA9IG51bGw7CiAKQEAgLTU1NzcsOCArNjc3MSw4IEBACiAKIAogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjA4MTo2ODogKGl2X3J1bGVEYXRhSW50ZXJjaGFuZ2VWYWx1ZU1hcHBpbmc9IHJ1bGVEYXRhSW50ZXJjaGFuZ2VWYWx1ZU1hcHBpbmcgRU9GICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIwODI6MjogaXZfcnVsZURhdGFJbnRlcmNoYW5nZVZhbHVlTWFwcGluZz0gcnVsZURhdGFJbnRlcmNoYW5nZVZhbHVlTWFwcGluZyBFT0YKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI1MjA6Njg6IChpdl9ydWxlRGF0YUludGVyY2hhbmdlVmFsdWVNYXBwaW5nPSBydWxlRGF0YUludGVyY2hhbmdlVmFsdWVNYXBwaW5nIEVPRiApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNTIxOjI6IGl2X3J1bGVEYXRhSW50ZXJjaGFuZ2VWYWx1ZU1hcHBpbmc9IHJ1bGVEYXRhSW50ZXJjaGFuZ2VWYWx1ZU1hcHBpbmcgRU9GCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIG5ld0NvbXBvc2l0ZU5vZGUoZ3JhbW1hckFjY2Vzcy5nZXREYXRhSW50ZXJjaGFuZ2VWYWx1ZU1hcHBpbmdSdWxlKCkpOyAKQEAgLTU2MDksNyArNjgwMyw3IEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZURhdGFJbnRlcmNoYW5nZVZhbHVlTWFwcGluZyIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMDg4OjE6IHJ1bGVEYXRhSW50ZXJjaGFuZ2VWYWx1ZU1hcHBpbmcgcmV0dXJucyBbRU9iamVjdCBjdXJyZW50PW51bGxdIDogKCAoKSBvdGhlcmx2XzE9ICdtYXAnICggKG90aGVybHZfMj0gUlVMRV9JRCApICkgb3RoZXJsdl8zPSAndG8nICggKGx2X2RhdGFfNF8wPSBSVUxFX1NUUklORyApICkgKSA7CisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjUyNzoxOiBydWxlRGF0YUludGVyY2hhbmdlVmFsdWVNYXBwaW5nIHJldHVybnMgW0VPYmplY3QgY3VycmVudD1udWxsXSA6ICggKCkgb3RoZXJsdl8xPSAnbWFwJyAoIChvdGhlcmx2XzI9IFJVTEVfSUQgKSApIG90aGVybHZfMz0gJ3RvJyAoIChsdl9kYXRhXzRfMD0gUlVMRV9TVFJJTkcgKSApICkgOwogICAgIHB1YmxpYyBmaW5hbCBFT2JqZWN0IHJ1bGVEYXRhSW50ZXJjaGFuZ2VWYWx1ZU1hcHBpbmcoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogICAgICAgICBFT2JqZWN0IGN1cnJlbnQgPSBudWxsOwogCkBAIC01NjIyLDE0ICs2ODE2LDE0IEBACiAgICAgICAgIAllbnRlclJ1bGUoKTsKIAogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjA5NDoyOiAoICggKCkgb3RoZXJsdl8xPSAnbWFwJyAoIChvdGhlcmx2XzI9IFJVTEVfSUQgKSApIG90aGVybHZfMz0gJ3RvJyAoIChsdl9kYXRhXzRfMD0gUlVMRV9TVFJJTkcgKSApICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjA5NToyOiAoICgpIG90aGVybHZfMT0gJ21hcCcgKCAob3RoZXJsdl8yPSBSVUxFX0lEICkgKSBvdGhlcmx2XzM9ICd0bycgKCAobHZfZGF0YV80XzA9IFJVTEVfU1RSSU5HICkgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNTMzOjI6ICggKCAoKSBvdGhlcmx2XzE9ICdtYXAnICggKG90aGVybHZfMj0gUlVMRV9JRCApICkgb3RoZXJsdl8zPSAndG8nICggKGx2X2RhdGFfNF8wPSBSVUxFX1NUUklORyApICkgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNTM0OjI6ICggKCkgb3RoZXJsdl8xPSAnbWFwJyAoIChvdGhlcmx2XzI9IFJVTEVfSUQgKSApIG90aGVybHZfMz0gJ3RvJyAoIChsdl9kYXRhXzRfMD0gUlVMRV9TVFJJTkcgKSApICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIwOTU6MjogKCAoKSBvdGhlcmx2XzE9ICdtYXAnICggKG90aGVybHZfMj0gUlVMRV9JRCApICkgb3RoZXJsdl8zPSAndG8nICggKGx2X2RhdGFfNF8wPSBSVUxFX1NUUklORyApICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjA5NjozOiAoKSBvdGhlcmx2XzE9ICdtYXAnICggKG90aGVybHZfMj0gUlVMRV9JRCApICkgb3RoZXJsdl8zPSAndG8nICggKGx2X2RhdGFfNF8wPSBSVUxFX1NUUklORyApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI1MzQ6MjogKCAoKSBvdGhlcmx2XzE9ICdtYXAnICggKG90aGVybHZfMj0gUlVMRV9JRCApICkgb3RoZXJsdl8zPSAndG8nICggKGx2X2RhdGFfNF8wPSBSVUxFX1NUUklORyApICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjUzNTozOiAoKSBvdGhlcmx2XzE9ICdtYXAnICggKG90aGVybHZfMj0gUlVMRV9JRCApICkgb3RoZXJsdl8zPSAndG8nICggKGx2X2RhdGFfNF8wPSBSVUxFX1NUUklORyApICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIwOTY6MzogKCkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIwOTc6NDogCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNTM1OjM6ICgpCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNTM2OjQ6IAogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAKQEAgLTU2NDEsMTcgKzY4MzUsMTcgQEAKIAogICAgICAgICAgICAgfQogCi0gICAgICAgICAgICBvdGhlcmx2XzE9KFRva2VuKW1hdGNoKGlucHV0LDYyLEZPTExPV180KTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7CisgICAgICAgICAgICBvdGhlcmx2XzE9KFRva2VuKW1hdGNoKGlucHV0LDY5LEZPTExPV180KTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKIAogICAgICAgICAgICAgICAJCQluZXdMZWFmTm9kZShvdGhlcmx2XzEsIGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YUludGVyY2hhbmdlVmFsdWVNYXBwaW5nQWNjZXNzKCkuZ2V0TWFwS2V5d29yZF8xKCkpOwogICAgICAgICAgICAgICAJCQogICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjEwNzozOiAoIChvdGhlcmx2XzI9IFJVTEVfSUQgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMTA4OjQ6IChvdGhlcmx2XzI9IFJVTEVfSUQgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjU0NjozOiAoIChvdGhlcmx2XzI9IFJVTEVfSUQgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNTQ3OjQ6IChvdGhlcmx2XzI9IFJVTEVfSUQgKQogICAgICAgICAgICAgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjEwODo0OiAob3RoZXJsdl8yPSBSVUxFX0lEICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIxMDk6NTogb3RoZXJsdl8yPSBSVUxFX0lECisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNTQ3OjQ6IChvdGhlcmx2XzI9IFJVTEVfSUQgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjU0ODo1OiBvdGhlcmx2XzI9IFJVTEVfSUQKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogCkBAIC01NjYwLDcgKzY4NTQsNyBAQAogICAgICAgICAgICAgICAJCQkJCX0KICAgICAgICAgICAgICAgCQkJCQogICAgICAgICAgICAgfQotICAgICAgICAgICAgb3RoZXJsdl8yPShUb2tlbiltYXRjaChpbnB1dCxSVUxFX0lELEZPTExPV180OSk7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OworICAgICAgICAgICAgb3RoZXJsdl8yPShUb2tlbiltYXRjaChpbnB1dCxSVUxFX0lELEZPTExPV182Myk7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OwogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAKICAgICAgICAgICAgICAgCQkJCQluZXdMZWFmTm9kZShvdGhlcmx2XzIsIGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YUludGVyY2hhbmdlVmFsdWVNYXBwaW5nQWNjZXNzKCkuZ2V0UHJvcGVydHlMRW50aXR5QXR0cmlidXRlQ3Jvc3NSZWZlcmVuY2VfMl8wKCkpOwpAQCAtNTY3MiwxNyArNjg2NiwxNyBAQAogCiAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgIG90aGVybHZfMz0oVG9rZW4pbWF0Y2goaW5wdXQsNjMsRk9MTE9XXzYpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gY3VycmVudDsKKyAgICAgICAgICAgIG90aGVybHZfMz0oVG9rZW4pbWF0Y2goaW5wdXQsNzAsRk9MTE9XXzYpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gY3VycmVudDsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogCiAgICAgICAgICAgICAgIAkJCW5ld0xlYWZOb2RlKG90aGVybHZfMywgZ3JhbW1hckFjY2Vzcy5nZXREYXRhSW50ZXJjaGFuZ2VWYWx1ZU1hcHBpbmdBY2Nlc3MoKS5nZXRUb0tleXdvcmRfMygpKTsKICAgICAgICAgICAgICAgCQkKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIxMjQ6MzogKCAobHZfZGF0YV80XzA9IFJVTEVfU1RSSU5HICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjEyNTo0OiAobHZfZGF0YV80XzA9IFJVTEVfU1RSSU5HICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI1NjM6MzogKCAobHZfZGF0YV80XzA9IFJVTEVfU1RSSU5HICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjU2NDo0OiAobHZfZGF0YV80XzA9IFJVTEVfU1RSSU5HICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIxMjU6NDogKGx2X2RhdGFfNF8wPSBSVUxFX1NUUklORyApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMTI2OjU6IGx2X2RhdGFfNF8wPSBSVUxFX1NUUklORworICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjU2NDo0OiAobHZfZGF0YV80XzA9IFJVTEVfU1RSSU5HICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI1NjU6NTogbHZfZGF0YV80XzA9IFJVTEVfU1RSSU5HCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBsdl9kYXRhXzRfMD0oVG9rZW4pbWF0Y2goaW5wdXQsUlVMRV9TVFJJTkcsRk9MTE9XXzIpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gY3VycmVudDsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewpAQCAtNTczMyw3ICs2OTI3LDcgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJlbnRyeVJ1bGVEYXRhSW50ZXJjaGFuZ2VCbG9iTWFwcGluZyIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMTQ2OjE6IGVudHJ5UnVsZURhdGFJbnRlcmNoYW5nZUJsb2JNYXBwaW5nIHJldHVybnMgW0VPYmplY3QgY3VycmVudD1udWxsXSA6IGl2X3J1bGVEYXRhSW50ZXJjaGFuZ2VCbG9iTWFwcGluZz0gcnVsZURhdGFJbnRlcmNoYW5nZUJsb2JNYXBwaW5nIEVPRiA7CisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjU4NToxOiBlbnRyeVJ1bGVEYXRhSW50ZXJjaGFuZ2VCbG9iTWFwcGluZyByZXR1cm5zIFtFT2JqZWN0IGN1cnJlbnQ9bnVsbF0gOiBpdl9ydWxlRGF0YUludGVyY2hhbmdlQmxvYk1hcHBpbmc9IHJ1bGVEYXRhSW50ZXJjaGFuZ2VCbG9iTWFwcGluZyBFT0YgOwogICAgIHB1YmxpYyBmaW5hbCBFT2JqZWN0IGVudHJ5UnVsZURhdGFJbnRlcmNoYW5nZUJsb2JNYXBwaW5nKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKICAgICAgICAgRU9iamVjdCBjdXJyZW50ID0gbnVsbDsKIApAQCAtNTc0MSw4ICs2OTM1LDggQEAKIAogCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMTQ2OjY3OiAoaXZfcnVsZURhdGFJbnRlcmNoYW5nZUJsb2JNYXBwaW5nPSBydWxlRGF0YUludGVyY2hhbmdlQmxvYk1hcHBpbmcgRU9GICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIxNDc6MjogaXZfcnVsZURhdGFJbnRlcmNoYW5nZUJsb2JNYXBwaW5nPSBydWxlRGF0YUludGVyY2hhbmdlQmxvYk1hcHBpbmcgRU9GCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNTg1OjY3OiAoaXZfcnVsZURhdGFJbnRlcmNoYW5nZUJsb2JNYXBwaW5nPSBydWxlRGF0YUludGVyY2hhbmdlQmxvYk1hcHBpbmcgRU9GICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI1ODY6MjogaXZfcnVsZURhdGFJbnRlcmNoYW5nZUJsb2JNYXBwaW5nPSBydWxlRGF0YUludGVyY2hhbmdlQmxvYk1hcHBpbmcgRU9GCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIG5ld0NvbXBvc2l0ZU5vZGUoZ3JhbW1hckFjY2Vzcy5nZXREYXRhSW50ZXJjaGFuZ2VCbG9iTWFwcGluZ1J1bGUoKSk7IApAQCAtNTc3Myw3ICs2OTY3LDcgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlRGF0YUludGVyY2hhbmdlQmxvYk1hcHBpbmciCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjE1MzoxOiBydWxlRGF0YUludGVyY2hhbmdlQmxvYk1hcHBpbmcgcmV0dXJucyBbRU9iamVjdCBjdXJyZW50PW51bGxdIDogKCAoKSBvdGhlcmx2XzE9ICdtYXBCbG9iJyAoIChvdGhlcmx2XzI9IFJVTEVfSUQgKSApIG90aGVybHZfMz0gJ3RvJyAoIChsdl9kYXRhXzRfMD0gUlVMRV9TVFJJTkcgKSApIChvdGhlcmx2XzU9ICdleHRlbnNpb24nICggKGx2X2Jsb2JGaWxlRXh0ZW5zaW9uXzZfMD0gUlVMRV9TVFJJTkcgKSApICk/IChvdGhlcmx2Xzc9ICdwYXRoJyAoIChsdl9ibG9iUGF0aF84XzA9IFJVTEVfU1RSSU5HICkgKSApPyBvdGhlcmx2Xzk9ICdtaW1lVHlwZScgKCAobHZfbWltZVR5cGVfMTBfMD0gcnVsZVByZWRlZmluZWRCbG9iTWltZVR5cGVFbnVtICkgKSApIDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNTkyOjE6IHJ1bGVEYXRhSW50ZXJjaGFuZ2VCbG9iTWFwcGluZyByZXR1cm5zIFtFT2JqZWN0IGN1cnJlbnQ9bnVsbF0gOiAoICgpIG90aGVybHZfMT0gJ21hcEJsb2InICggKG90aGVybHZfMj0gUlVMRV9JRCApICkgb3RoZXJsdl8zPSAndG8nICggKGx2X2RhdGFfNF8wPSBSVUxFX1NUUklORyApICkgKG90aGVybHZfNT0gJ2V4dGVuc2lvbicgKCAobHZfYmxvYkZpbGVFeHRlbnNpb25fNl8wPSBSVUxFX1NUUklORyApICkgKT8gKG90aGVybHZfNz0gJ3BhdGgnICggKGx2X2Jsb2JQYXRoXzhfMD0gUlVMRV9TVFJJTkcgKSApICk/IG90aGVybHZfOT0gJ21pbWVUeXBlJyAoIChsdl9taW1lVHlwZV8xMF8wPSBydWxlUHJlZGVmaW5lZEJsb2JNaW1lVHlwZUVudW0gKSApICkgOwogICAgIHB1YmxpYyBmaW5hbCBFT2JqZWN0IHJ1bGVEYXRhSW50ZXJjaGFuZ2VCbG9iTWFwcGluZygpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAgICAgICAgIEVPYmplY3QgY3VycmVudCA9IG51bGw7CiAKQEAgLTU3OTMsMTQgKzY5ODcsMTQgQEAKICAgICAgICAgCWVudGVyUnVsZSgpOwogCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMTU5OjI6ICggKCAoKSBvdGhlcmx2XzE9ICdtYXBCbG9iJyAoIChvdGhlcmx2XzI9IFJVTEVfSUQgKSApIG90aGVybHZfMz0gJ3RvJyAoIChsdl9kYXRhXzRfMD0gUlVMRV9TVFJJTkcgKSApIChvdGhlcmx2XzU9ICdleHRlbnNpb24nICggKGx2X2Jsb2JGaWxlRXh0ZW5zaW9uXzZfMD0gUlVMRV9TVFJJTkcgKSApICk/IChvdGhlcmx2Xzc9ICdwYXRoJyAoIChsdl9ibG9iUGF0aF84XzA9IFJVTEVfU1RSSU5HICkgKSApPyBvdGhlcmx2Xzk9ICdtaW1lVHlwZScgKCAobHZfbWltZVR5cGVfMTBfMD0gcnVsZVByZWRlZmluZWRCbG9iTWltZVR5cGVFbnVtICkgKSApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIxNjA6MjogKCAoKSBvdGhlcmx2XzE9ICdtYXBCbG9iJyAoIChvdGhlcmx2XzI9IFJVTEVfSUQgKSApIG90aGVybHZfMz0gJ3RvJyAoIChsdl9kYXRhXzRfMD0gUlVMRV9TVFJJTkcgKSApIChvdGhlcmx2XzU9ICdleHRlbnNpb24nICggKGx2X2Jsb2JGaWxlRXh0ZW5zaW9uXzZfMD0gUlVMRV9TVFJJTkcgKSApICk/IChvdGhlcmx2Xzc9ICdwYXRoJyAoIChsdl9ibG9iUGF0aF84XzA9IFJVTEVfU1RSSU5HICkgKSApPyBvdGhlcmx2Xzk9ICdtaW1lVHlwZScgKCAobHZfbWltZVR5cGVfMTBfMD0gcnVsZVByZWRlZmluZWRCbG9iTWltZVR5cGVFbnVtICkgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNTk4OjI6ICggKCAoKSBvdGhlcmx2XzE9ICdtYXBCbG9iJyAoIChvdGhlcmx2XzI9IFJVTEVfSUQgKSApIG90aGVybHZfMz0gJ3RvJyAoIChsdl9kYXRhXzRfMD0gUlVMRV9TVFJJTkcgKSApIChvdGhlcmx2XzU9ICdleHRlbnNpb24nICggKGx2X2Jsb2JGaWxlRXh0ZW5zaW9uXzZfMD0gUlVMRV9TVFJJTkcgKSApICk/IChvdGhlcmx2Xzc9ICdwYXRoJyAoIChsdl9ibG9iUGF0aF84XzA9IFJVTEVfU1RSSU5HICkgKSApPyBvdGhlcmx2Xzk9ICdtaW1lVHlwZScgKCAobHZfbWltZVR5cGVfMTBfMD0gcnVsZVByZWRlZmluZWRCbG9iTWltZVR5cGVFbnVtICkgKSApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI1OTk6MjogKCAoKSBvdGhlcmx2XzE9ICdtYXBCbG9iJyAoIChvdGhlcmx2XzI9IFJVTEVfSUQgKSApIG90aGVybHZfMz0gJ3RvJyAoIChsdl9kYXRhXzRfMD0gUlVMRV9TVFJJTkcgKSApIChvdGhlcmx2XzU9ICdleHRlbnNpb24nICggKGx2X2Jsb2JGaWxlRXh0ZW5zaW9uXzZfMD0gUlVMRV9TVFJJTkcgKSApICk/IChvdGhlcmx2Xzc9ICdwYXRoJyAoIChsdl9ibG9iUGF0aF84XzA9IFJVTEVfU1RSSU5HICkgKSApPyBvdGhlcmx2Xzk9ICdtaW1lVHlwZScgKCAobHZfbWltZVR5cGVfMTBfMD0gcnVsZVByZWRlZmluZWRCbG9iTWltZVR5cGVFbnVtICkgKSApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMTYwOjI6ICggKCkgb3RoZXJsdl8xPSAnbWFwQmxvYicgKCAob3RoZXJsdl8yPSBSVUxFX0lEICkgKSBvdGhlcmx2XzM9ICd0bycgKCAobHZfZGF0YV80XzA9IFJVTEVfU1RSSU5HICkgKSAob3RoZXJsdl81PSAnZXh0ZW5zaW9uJyAoIChsdl9ibG9iRmlsZUV4dGVuc2lvbl82XzA9IFJVTEVfU1RSSU5HICkgKSApPyAob3RoZXJsdl83PSAncGF0aCcgKCAobHZfYmxvYlBhdGhfOF8wPSBSVUxFX1NUUklORyApICkgKT8gb3RoZXJsdl85PSAnbWltZVR5cGUnICggKGx2X21pbWVUeXBlXzEwXzA9IHJ1bGVQcmVkZWZpbmVkQmxvYk1pbWVUeXBlRW51bSApICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjE2MTozOiAoKSBvdGhlcmx2XzE9ICdtYXBCbG9iJyAoIChvdGhlcmx2XzI9IFJVTEVfSUQgKSApIG90aGVybHZfMz0gJ3RvJyAoIChsdl9kYXRhXzRfMD0gUlVMRV9TVFJJTkcgKSApIChvdGhlcmx2XzU9ICdleHRlbnNpb24nICggKGx2X2Jsb2JGaWxlRXh0ZW5zaW9uXzZfMD0gUlVMRV9TVFJJTkcgKSApICk/IChvdGhlcmx2Xzc9ICdwYXRoJyAoIChsdl9ibG9iUGF0aF84XzA9IFJVTEVfU1RSSU5HICkgKSApPyBvdGhlcmx2Xzk9ICdtaW1lVHlwZScgKCAobHZfbWltZVR5cGVfMTBfMD0gcnVsZVByZWRlZmluZWRCbG9iTWltZVR5cGVFbnVtICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjU5OToyOiAoICgpIG90aGVybHZfMT0gJ21hcEJsb2InICggKG90aGVybHZfMj0gUlVMRV9JRCApICkgb3RoZXJsdl8zPSAndG8nICggKGx2X2RhdGFfNF8wPSBSVUxFX1NUUklORyApICkgKG90aGVybHZfNT0gJ2V4dGVuc2lvbicgKCAobHZfYmxvYkZpbGVFeHRlbnNpb25fNl8wPSBSVUxFX1NUUklORyApICkgKT8gKG90aGVybHZfNz0gJ3BhdGgnICggKGx2X2Jsb2JQYXRoXzhfMD0gUlVMRV9TVFJJTkcgKSApICk/IG90aGVybHZfOT0gJ21pbWVUeXBlJyAoIChsdl9taW1lVHlwZV8xMF8wPSBydWxlUHJlZGVmaW5lZEJsb2JNaW1lVHlwZUVudW0gKSApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI2MDA6MzogKCkgb3RoZXJsdl8xPSAnbWFwQmxvYicgKCAob3RoZXJsdl8yPSBSVUxFX0lEICkgKSBvdGhlcmx2XzM9ICd0bycgKCAobHZfZGF0YV80XzA9IFJVTEVfU1RSSU5HICkgKSAob3RoZXJsdl81PSAnZXh0ZW5zaW9uJyAoIChsdl9ibG9iRmlsZUV4dGVuc2lvbl82XzA9IFJVTEVfU1RSSU5HICkgKSApPyAob3RoZXJsdl83PSAncGF0aCcgKCAobHZfYmxvYlBhdGhfOF8wPSBSVUxFX1NUUklORyApICkgKT8gb3RoZXJsdl85PSAnbWltZVR5cGUnICggKGx2X21pbWVUeXBlXzEwXzA9IHJ1bGVQcmVkZWZpbmVkQmxvYk1pbWVUeXBlRW51bSApICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIxNjE6MzogKCkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIxNjI6NDogCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNjAwOjM6ICgpCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNjAxOjQ6IAogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAKQEAgLTU4MTIsMTcgKzcwMDYsMTcgQEAKIAogICAgICAgICAgICAgfQogCi0gICAgICAgICAgICBvdGhlcmx2XzE9KFRva2VuKW1hdGNoKGlucHV0LDY0LEZPTExPV180KTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7CisgICAgICAgICAgICBvdGhlcmx2XzE9KFRva2VuKW1hdGNoKGlucHV0LDcxLEZPTExPV180KTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKIAogICAgICAgICAgICAgICAJCQluZXdMZWFmTm9kZShvdGhlcmx2XzEsIGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YUludGVyY2hhbmdlQmxvYk1hcHBpbmdBY2Nlc3MoKS5nZXRNYXBCbG9iS2V5d29yZF8xKCkpOwogICAgICAgICAgICAgICAJCQogICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjE3MjozOiAoIChvdGhlcmx2XzI9IFJVTEVfSUQgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMTczOjQ6IChvdGhlcmx2XzI9IFJVTEVfSUQgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjYxMTozOiAoIChvdGhlcmx2XzI9IFJVTEVfSUQgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNjEyOjQ6IChvdGhlcmx2XzI9IFJVTEVfSUQgKQogICAgICAgICAgICAgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjE3Mzo0OiAob3RoZXJsdl8yPSBSVUxFX0lEICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIxNzQ6NTogb3RoZXJsdl8yPSBSVUxFX0lECisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNjEyOjQ6IChvdGhlcmx2XzI9IFJVTEVfSUQgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjYxMzo1OiBvdGhlcmx2XzI9IFJVTEVfSUQKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogCkBAIC01ODMxLDcgKzcwMjUsNyBAQAogICAgICAgICAgICAgICAJCQkJCX0KICAgICAgICAgICAgICAgCQkJCQogICAgICAgICAgICAgfQotICAgICAgICAgICAgb3RoZXJsdl8yPShUb2tlbiltYXRjaChpbnB1dCxSVUxFX0lELEZPTExPV180OSk7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OworICAgICAgICAgICAgb3RoZXJsdl8yPShUb2tlbiltYXRjaChpbnB1dCxSVUxFX0lELEZPTExPV182Myk7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OwogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAKICAgICAgICAgICAgICAgCQkJCQluZXdMZWFmTm9kZShvdGhlcmx2XzIsIGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YUludGVyY2hhbmdlQmxvYk1hcHBpbmdBY2Nlc3MoKS5nZXRQcm9wZXJ0eUxFbnRpdHlBdHRyaWJ1dGVDcm9zc1JlZmVyZW5jZV8yXzAoKSk7CkBAIC01ODQzLDE5ICs3MDM3LDE5IEBACiAKICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgb3RoZXJsdl8zPShUb2tlbiltYXRjaChpbnB1dCw2MyxGT0xMT1dfNik7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OworICAgICAgICAgICAgb3RoZXJsdl8zPShUb2tlbiltYXRjaChpbnB1dCw3MCxGT0xMT1dfNik7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OwogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAKICAgICAgICAgICAgICAgCQkJbmV3TGVhZk5vZGUob3RoZXJsdl8zLCBncmFtbWFyQWNjZXNzLmdldERhdGFJbnRlcmNoYW5nZUJsb2JNYXBwaW5nQWNjZXNzKCkuZ2V0VG9LZXl3b3JkXzMoKSk7CiAgICAgICAgICAgICAgIAkJCiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMTg5OjM6ICggKGx2X2RhdGFfNF8wPSBSVUxFX1NUUklORyApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIxOTA6NDogKGx2X2RhdGFfNF8wPSBSVUxFX1NUUklORyApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNjI4OjM6ICggKGx2X2RhdGFfNF8wPSBSVUxFX1NUUklORyApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI2Mjk6NDogKGx2X2RhdGFfNF8wPSBSVUxFX1NUUklORyApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMTkwOjQ6IChsdl9kYXRhXzRfMD0gUlVMRV9TVFJJTkcgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjE5MTo1OiBsdl9kYXRhXzRfMD0gUlVMRV9TVFJJTkcKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI2Mjk6NDogKGx2X2RhdGFfNF8wPSBSVUxFX1NUUklORyApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNjMwOjU6IGx2X2RhdGFfNF8wPSBSVUxFX1NUUklORwogICAgICAgICAgICAgewotICAgICAgICAgICAgbHZfZGF0YV80XzA9KFRva2VuKW1hdGNoKGlucHV0LFJVTEVfU1RSSU5HLEZPTExPV181MCk7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OworICAgICAgICAgICAgbHZfZGF0YV80XzA9KFRva2VuKW1hdGNoKGlucHV0LFJVTEVfU1RSSU5HLEZPTExPV182NCk7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OwogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAKICAgICAgICAgICAgICAgCQkJCQluZXdMZWFmTm9kZShsdl9kYXRhXzRfMCwgZ3JhbW1hckFjY2Vzcy5nZXREYXRhSW50ZXJjaGFuZ2VCbG9iTWFwcGluZ0FjY2VzcygpLmdldERhdGFTVFJJTkdUZXJtaW5hbFJ1bGVDYWxsXzRfMCgpKTsKQEAgLTU4NzksMzAgKzcwNzMsMzAgQEAKIAogICAgICAgICAgICAgfQogCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMjA3OjM6IChvdGhlcmx2XzU9ICdleHRlbnNpb24nICggKGx2X2Jsb2JGaWxlRXh0ZW5zaW9uXzZfMD0gUlVMRV9TVFJJTkcgKSApICk/Ci0gICAgICAgICAgICBpbnQgYWx0MzY9MjsKLSAgICAgICAgICAgIGludCBMQTM2XzAgPSBpbnB1dC5MQSgxKTsKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI2NDY6MzogKG90aGVybHZfNT0gJ2V4dGVuc2lvbicgKCAobHZfYmxvYkZpbGVFeHRlbnNpb25fNl8wPSBSVUxFX1NUUklORyApICkgKT8KKyAgICAgICAgICAgIGludCBhbHQ0Nz0yOworICAgICAgICAgICAgaW50IExBNDdfMCA9IGlucHV0LkxBKDEpOwogCi0gICAgICAgICAgICBpZiAoIChMQTM2XzA9PTY1KSApIHsKLSAgICAgICAgICAgICAgICBhbHQzNj0xOworICAgICAgICAgICAgaWYgKCAoTEE0N18wPT03MikgKSB7CisgICAgICAgICAgICAgICAgYWx0NDc9MTsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHN3aXRjaCAoYWx0MzYpIHsKKyAgICAgICAgICAgIHN3aXRjaCAoYWx0NDcpIHsKICAgICAgICAgICAgICAgICBjYXNlIDEgOgotICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMjA4OjQ6IG90aGVybHZfNT0gJ2V4dGVuc2lvbicgKCAobHZfYmxvYkZpbGVFeHRlbnNpb25fNl8wPSBSVUxFX1NUUklORyApICkKKyAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjY0Nzo0OiBvdGhlcmx2XzU9ICdleHRlbnNpb24nICggKGx2X2Jsb2JGaWxlRXh0ZW5zaW9uXzZfMD0gUlVMRV9TVFJJTkcgKSApCiAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgb3RoZXJsdl81PShUb2tlbiltYXRjaChpbnB1dCw2NSxGT0xMT1dfNik7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OworICAgICAgICAgICAgICAgICAgICBvdGhlcmx2XzU9KFRva2VuKW1hdGNoKGlucHV0LDcyLEZPTExPV182KTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7CiAgICAgICAgICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogCiAgICAgICAgICAgICAgICAgICAgICAgCQkJCW5ld0xlYWZOb2RlKG90aGVybHZfNSwgZ3JhbW1hckFjY2Vzcy5nZXREYXRhSW50ZXJjaGFuZ2VCbG9iTWFwcGluZ0FjY2VzcygpLmdldEV4dGVuc2lvbktleXdvcmRfNV8wKCkpOwogICAgICAgICAgICAgICAgICAgICAgIAkJCQogICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIyMTI6NDogKCAobHZfYmxvYkZpbGVFeHRlbnNpb25fNl8wPSBSVUxFX1NUUklORyApICkKLSAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjIxMzo1OiAobHZfYmxvYkZpbGVFeHRlbnNpb25fNl8wPSBSVUxFX1NUUklORyApCisgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI2NTE6NDogKCAobHZfYmxvYkZpbGVFeHRlbnNpb25fNl8wPSBSVUxFX1NUUklORyApICkKKyAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjY1Mjo1OiAobHZfYmxvYkZpbGVFeHRlbnNpb25fNl8wPSBSVUxFX1NUUklORyApCiAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjIxMzo1OiAobHZfYmxvYkZpbGVFeHRlbnNpb25fNl8wPSBSVUxFX1NUUklORyApCi0gICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIyMTQ6NjogbHZfYmxvYkZpbGVFeHRlbnNpb25fNl8wPSBSVUxFX1NUUklORworICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNjUyOjU6IChsdl9ibG9iRmlsZUV4dGVuc2lvbl82XzA9IFJVTEVfU1RSSU5HICkKKyAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjY1Mzo2OiBsdl9ibG9iRmlsZUV4dGVuc2lvbl82XzA9IFJVTEVfU1RSSU5HCiAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgbHZfYmxvYkZpbGVFeHRlbnNpb25fNl8wPShUb2tlbiltYXRjaChpbnB1dCxSVUxFX1NUUklORyxGT0xMT1dfNTEpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gY3VycmVudDsKKyAgICAgICAgICAgICAgICAgICAgbHZfYmxvYkZpbGVFeHRlbnNpb25fNl8wPShUb2tlbiltYXRjaChpbnB1dCxSVUxFX1NUUklORyxGT0xMT1dfNjUpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gY3VycmVudDsKICAgICAgICAgICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAKICAgICAgICAgICAgICAgICAgICAgICAJCQkJCQluZXdMZWFmTm9kZShsdl9ibG9iRmlsZUV4dGVuc2lvbl82XzAsIGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YUludGVyY2hhbmdlQmxvYk1hcHBpbmdBY2Nlc3MoKS5nZXRCbG9iRmlsZUV4dGVuc2lvblNUUklOR1Rlcm1pbmFsUnVsZUNhbGxfNV8xXzAoKSk7CkBAIC01OTMyLDMwICs3MTI2LDMwIEBACiAKICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjIzMTozOiAob3RoZXJsdl83PSAncGF0aCcgKCAobHZfYmxvYlBhdGhfOF8wPSBSVUxFX1NUUklORyApICkgKT8KLSAgICAgICAgICAgIGludCBhbHQzNz0yOwotICAgICAgICAgICAgaW50IExBMzdfMCA9IGlucHV0LkxBKDEpOworICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjY3MDozOiAob3RoZXJsdl83PSAncGF0aCcgKCAobHZfYmxvYlBhdGhfOF8wPSBSVUxFX1NUUklORyApICkgKT8KKyAgICAgICAgICAgIGludCBhbHQ0OD0yOworICAgICAgICAgICAgaW50IExBNDhfMCA9IGlucHV0LkxBKDEpOwogCi0gICAgICAgICAgICBpZiAoIChMQTM3XzA9PTIzKSApIHsKLSAgICAgICAgICAgICAgICBhbHQzNz0xOworICAgICAgICAgICAgaWYgKCAoTEE0OF8wPT0yNCkgKSB7CisgICAgICAgICAgICAgICAgYWx0NDg9MTsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHN3aXRjaCAoYWx0MzcpIHsKKyAgICAgICAgICAgIHN3aXRjaCAoYWx0NDgpIHsKICAgICAgICAgICAgICAgICBjYXNlIDEgOgotICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMjMyOjQ6IG90aGVybHZfNz0gJ3BhdGgnICggKGx2X2Jsb2JQYXRoXzhfMD0gUlVMRV9TVFJJTkcgKSApCisgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI2NzE6NDogb3RoZXJsdl83PSAncGF0aCcgKCAobHZfYmxvYlBhdGhfOF8wPSBSVUxFX1NUUklORyApICkKICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBvdGhlcmx2Xzc9KFRva2VuKW1hdGNoKGlucHV0LDIzLEZPTExPV182KTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7CisgICAgICAgICAgICAgICAgICAgIG90aGVybHZfNz0oVG9rZW4pbWF0Y2goaW5wdXQsMjQsRk9MTE9XXzYpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gY3VycmVudDsKICAgICAgICAgICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAKICAgICAgICAgICAgICAgICAgICAgICAJCQkJbmV3TGVhZk5vZGUob3RoZXJsdl83LCBncmFtbWFyQWNjZXNzLmdldERhdGFJbnRlcmNoYW5nZUJsb2JNYXBwaW5nQWNjZXNzKCkuZ2V0UGF0aEtleXdvcmRfNl8wKCkpOwogICAgICAgICAgICAgICAgICAgICAgIAkJCQogICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIyMzY6NDogKCAobHZfYmxvYlBhdGhfOF8wPSBSVUxFX1NUUklORyApICkKLSAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjIzNzo1OiAobHZfYmxvYlBhdGhfOF8wPSBSVUxFX1NUUklORyApCisgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI2NzU6NDogKCAobHZfYmxvYlBhdGhfOF8wPSBSVUxFX1NUUklORyApICkKKyAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjY3Njo1OiAobHZfYmxvYlBhdGhfOF8wPSBSVUxFX1NUUklORyApCiAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjIzNzo1OiAobHZfYmxvYlBhdGhfOF8wPSBSVUxFX1NUUklORyApCi0gICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIyMzg6NjogbHZfYmxvYlBhdGhfOF8wPSBSVUxFX1NUUklORworICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNjc2OjU6IChsdl9ibG9iUGF0aF84XzA9IFJVTEVfU1RSSU5HICkKKyAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjY3Nzo2OiBsdl9ibG9iUGF0aF84XzA9IFJVTEVfU1RSSU5HCiAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgbHZfYmxvYlBhdGhfOF8wPShUb2tlbiltYXRjaChpbnB1dCxSVUxFX1NUUklORyxGT0xMT1dfNTIpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gY3VycmVudDsKKyAgICAgICAgICAgICAgICAgICAgbHZfYmxvYlBhdGhfOF8wPShUb2tlbiltYXRjaChpbnB1dCxSVUxFX1NUUklORyxGT0xMT1dfNjYpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gY3VycmVudDsKICAgICAgICAgICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAKICAgICAgICAgICAgICAgICAgICAgICAJCQkJCQluZXdMZWFmTm9kZShsdl9ibG9iUGF0aF84XzAsIGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YUludGVyY2hhbmdlQmxvYk1hcHBpbmdBY2Nlc3MoKS5nZXRCbG9iUGF0aFNUUklOR1Rlcm1pbmFsUnVsZUNhbGxfNl8xXzAoKSk7CkBAIC01OTg1LDE3ICs3MTc5LDE3IEBACiAKICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgb3RoZXJsdl85PShUb2tlbiltYXRjaChpbnB1dCw2NixGT0xMT1dfNTMpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gY3VycmVudDsKKyAgICAgICAgICAgIG90aGVybHZfOT0oVG9rZW4pbWF0Y2goaW5wdXQsNzMsRk9MTE9XXzY3KTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKIAogICAgICAgICAgICAgICAJCQluZXdMZWFmTm9kZShvdGhlcmx2XzksIGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YUludGVyY2hhbmdlQmxvYk1hcHBpbmdBY2Nlc3MoKS5nZXRNaW1lVHlwZUtleXdvcmRfNygpKTsKICAgICAgICAgICAgICAgCQkKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIyNTk6MzogKCAobHZfbWltZVR5cGVfMTBfMD0gcnVsZVByZWRlZmluZWRCbG9iTWltZVR5cGVFbnVtICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjI2MDo0OiAobHZfbWltZVR5cGVfMTBfMD0gcnVsZVByZWRlZmluZWRCbG9iTWltZVR5cGVFbnVtICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI2OTg6MzogKCAobHZfbWltZVR5cGVfMTBfMD0gcnVsZVByZWRlZmluZWRCbG9iTWltZVR5cGVFbnVtICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjY5OTo0OiAobHZfbWltZVR5cGVfMTBfMD0gcnVsZVByZWRlZmluZWRCbG9iTWltZVR5cGVFbnVtICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIyNjA6NDogKGx2X21pbWVUeXBlXzEwXzA9IHJ1bGVQcmVkZWZpbmVkQmxvYk1pbWVUeXBlRW51bSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMjYxOjU6IGx2X21pbWVUeXBlXzEwXzA9IHJ1bGVQcmVkZWZpbmVkQmxvYk1pbWVUeXBlRW51bQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjY5OTo0OiAobHZfbWltZVR5cGVfMTBfMD0gcnVsZVByZWRlZmluZWRCbG9iTWltZVR5cGVFbnVtICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI3MDA6NTogbHZfbWltZVR5cGVfMTBfMD0gcnVsZVByZWRlZmluZWRCbG9iTWltZVR5cGVFbnVtCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKIApAQCAtNjA1MSw3ICs3MjQ1LDcgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJlbnRyeVJ1bGVMRlFOIgotICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIyODI6MTogZW50cnlSdWxlTEZRTiByZXR1cm5zIFtTdHJpbmcgY3VycmVudD1udWxsXSA6IGl2X3J1bGVMRlFOPSBydWxlTEZRTiBFT0YgOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI3MjE6MTogZW50cnlSdWxlTEZRTiByZXR1cm5zIFtTdHJpbmcgY3VycmVudD1udWxsXSA6IGl2X3J1bGVMRlFOPSBydWxlTEZRTiBFT0YgOwogICAgIHB1YmxpYyBmaW5hbCBTdHJpbmcgZW50cnlSdWxlTEZRTigpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAgICAgICAgIFN0cmluZyBjdXJyZW50ID0gbnVsbDsKIApAQCAtNjA1OSw4ICs3MjUzLDggQEAKIAogCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMjgyOjQ0OiAoaXZfcnVsZUxGUU49IHJ1bGVMRlFOIEVPRiApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMjgzOjI6IGl2X3J1bGVMRlFOPSBydWxlTEZRTiBFT0YKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI3MjE6NDQ6IChpdl9ydWxlTEZRTj0gcnVsZUxGUU4gRU9GICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI3MjI6MjogaXZfcnVsZUxGUU49IHJ1bGVMRlFOIEVPRgogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBuZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0TEZRTlJ1bGUoKSk7IApAQCAtNjA5MSw3ICs3Mjg1LDcgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlTEZRTiIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMjg5OjE6IHJ1bGVMRlFOIHJldHVybnMgW0FudGxyRGF0YXR5cGVSdWxlVG9rZW4gY3VycmVudD1uZXcgQW50bHJEYXRhdHlwZVJ1bGVUb2tlbigpXSA6ICh0aGlzX0lEXzA9IFJVTEVfSUQgKGt3PSAnLicgdGhpc19JRF8yPSBSVUxFX0lEICkqICkgOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI3Mjg6MTogcnVsZUxGUU4gcmV0dXJucyBbQW50bHJEYXRhdHlwZVJ1bGVUb2tlbiBjdXJyZW50PW5ldyBBbnRsckRhdGF0eXBlUnVsZVRva2VuKCldIDogKHRoaXNfSURfMD0gUlVMRV9JRCAoa3c9ICcuJyB0aGlzX0lEXzI9IFJVTEVfSUQgKSogKSA7CiAgICAgcHVibGljIGZpbmFsIEFudGxyRGF0YXR5cGVSdWxlVG9rZW4gcnVsZUxGUU4oKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogICAgICAgICBBbnRsckRhdGF0eXBlUnVsZVRva2VuIGN1cnJlbnQgPSBuZXcgQW50bHJEYXRhdHlwZVJ1bGVUb2tlbigpOwogCkBAIC02MTAzLDEzICs3Mjk3LDEzIEBACiAgICAgICAgIAllbnRlclJ1bGUoKTsKIAogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjI5NToyOiAoICh0aGlzX0lEXzA9IFJVTEVfSUQgKGt3PSAnLicgdGhpc19JRF8yPSBSVUxFX0lEICkqICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjI5NjoyOiAodGhpc19JRF8wPSBSVUxFX0lEIChrdz0gJy4nIHRoaXNfSURfMj0gUlVMRV9JRCApKiApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNzM0OjI6ICggKHRoaXNfSURfMD0gUlVMRV9JRCAoa3c9ICcuJyB0aGlzX0lEXzI9IFJVTEVfSUQgKSogKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNzM1OjI6ICh0aGlzX0lEXzA9IFJVTEVfSUQgKGt3PSAnLicgdGhpc19JRF8yPSBSVUxFX0lEICkqICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIyOTY6MjogKHRoaXNfSURfMD0gUlVMRV9JRCAoa3c9ICcuJyB0aGlzX0lEXzI9IFJVTEVfSUQgKSogKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjI5NzozOiB0aGlzX0lEXzA9IFJVTEVfSUQgKGt3PSAnLicgdGhpc19JRF8yPSBSVUxFX0lEICkqCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNzM1OjI6ICh0aGlzX0lEXzA9IFJVTEVfSUQgKGt3PSAnLicgdGhpc19JRF8yPSBSVUxFX0lEICkqICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI3MzY6MzogdGhpc19JRF8wPSBSVUxFX0lEIChrdz0gJy4nIHRoaXNfSURfMj0gUlVMRV9JRCApKgogICAgICAgICAgICAgewotICAgICAgICAgICAgdGhpc19JRF8wPShUb2tlbiltYXRjaChpbnB1dCxSVUxFX0lELEZPTExPV181NCk7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OworICAgICAgICAgICAgdGhpc19JRF8wPShUb2tlbiltYXRjaChpbnB1dCxSVUxFX0lELEZPTExPV182OCk7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OwogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAKICAgICAgICAgICAgICAgCQkJY3VycmVudC5tZXJnZSh0aGlzX0lEXzApOwpAQCAtNjEyMCwyOSArNzMxNCwyOSBAQAogICAgICAgICAgICAgICAJCQluZXdMZWFmTm9kZSh0aGlzX0lEXzAsIGdyYW1tYXJBY2Nlc3MuZ2V0TEZRTkFjY2VzcygpLmdldElEVGVybWluYWxSdWxlQ2FsbF8wKCkpOwogICAgICAgICAgICAgICAJCQogICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjMwNDozOiAoa3c9ICcuJyB0aGlzX0lEXzI9IFJVTEVfSUQgKSoKLSAgICAgICAgICAgIGxvb3AzODoKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI3NDM6MzogKGt3PSAnLicgdGhpc19JRF8yPSBSVUxFX0lEICkqCisgICAgICAgICAgICBsb29wNDk6CiAgICAgICAgICAgICBkbyB7Ci0gICAgICAgICAgICAgICAgaW50IGFsdDM4PTI7Ci0gICAgICAgICAgICAgICAgaW50IExBMzhfMCA9IGlucHV0LkxBKDEpOworICAgICAgICAgICAgICAgIGludCBhbHQ0OT0yOworICAgICAgICAgICAgICAgIGludCBMQTQ5XzAgPSBpbnB1dC5MQSgxKTsKIAotICAgICAgICAgICAgICAgIGlmICggKExBMzhfMD09NjcpICkgewotICAgICAgICAgICAgICAgICAgICBhbHQzOD0xOworICAgICAgICAgICAgICAgIGlmICggKExBNDlfMD09NzQpICkgeworICAgICAgICAgICAgICAgICAgICBhbHQ0OT0xOwogICAgICAgICAgICAgICAgIH0KIAogCi0gICAgICAgICAgICAgICAgc3dpdGNoIChhbHQzOCkgeworICAgICAgICAgICAgICAgIHN3aXRjaCAoYWx0NDkpIHsKICAgICAgICAgICAgIAljYXNlIDEgOgotICAgICAgICAgICAgCSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMzA1OjQ6IGt3PSAnLicgdGhpc19JRF8yPSBSVUxFX0lECisgICAgICAgICAgICAJICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI3NDQ6NDoga3c9ICcuJyB0aGlzX0lEXzI9IFJVTEVfSUQKICAgICAgICAgICAgIAkgICAgewotICAgICAgICAgICAgCSAgICBrdz0oVG9rZW4pbWF0Y2goaW5wdXQsNjcsRk9MTE9XXzQpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gY3VycmVudDsKKyAgICAgICAgICAgIAkgICAga3c9KFRva2VuKW1hdGNoKGlucHV0LDc0LEZPTExPV180KTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7CiAgICAgICAgICAgICAJICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogCiAgICAgICAgICAgICAJICAgICAgCQkJCWN1cnJlbnQubWVyZ2Uoa3cpOwogICAgICAgICAgICAgCSAgICAgIAkJCQluZXdMZWFmTm9kZShrdywgZ3JhbW1hckFjY2Vzcy5nZXRMRlFOQWNjZXNzKCkuZ2V0RnVsbFN0b3BLZXl3b3JkXzFfMCgpKTsKICAgICAgICAgICAgIAkgICAgICAJCQkKICAgICAgICAgICAgIAkgICAgfQotICAgICAgICAgICAgCSAgICB0aGlzX0lEXzI9KFRva2VuKW1hdGNoKGlucHV0LFJVTEVfSUQsRk9MTE9XXzU0KTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7CisgICAgICAgICAgICAJICAgIHRoaXNfSURfMj0oVG9rZW4pbWF0Y2goaW5wdXQsUlVMRV9JRCxGT0xMT1dfNjgpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gY3VycmVudDsKICAgICAgICAgICAgIAkgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAKICAgICAgICAgICAgIAkgICAgICAJCQkJY3VycmVudC5tZXJnZSh0aGlzX0lEXzIpOwpAQCAtNjE1OCw3ICs3MzUyLDcgQEAKICAgICAgICAgICAgIAkgICAgYnJlYWs7CiAKICAgICAgICAgICAgIAlkZWZhdWx0IDoKLSAgICAgICAgICAgIAkgICAgYnJlYWsgbG9vcDM4OworICAgICAgICAgICAgCSAgICBicmVhayBsb29wNDk7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfSB3aGlsZSAodHJ1ZSk7CiAKQEAgLTYxODcsNyArNzM4MSw3IEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAiZW50cnlSdWxlVFJBTlNMQVRBQkxFU1RSSU5HIgotICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIzMjI6MTogZW50cnlSdWxlVFJBTlNMQVRBQkxFU1RSSU5HIHJldHVybnMgW1N0cmluZyBjdXJyZW50PW51bGxdIDogaXZfcnVsZVRSQU5TTEFUQUJMRVNUUklORz0gcnVsZVRSQU5TTEFUQUJMRVNUUklORyBFT0YgOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI3NjE6MTogZW50cnlSdWxlVFJBTlNMQVRBQkxFU1RSSU5HIHJldHVybnMgW1N0cmluZyBjdXJyZW50PW51bGxdIDogaXZfcnVsZVRSQU5TTEFUQUJMRVNUUklORz0gcnVsZVRSQU5TTEFUQUJMRVNUUklORyBFT0YgOwogICAgIHB1YmxpYyBmaW5hbCBTdHJpbmcgZW50cnlSdWxlVFJBTlNMQVRBQkxFU1RSSU5HKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKICAgICAgICAgU3RyaW5nIGN1cnJlbnQgPSBudWxsOwogCkBAIC02MTk1LDggKzczODksOCBAQAogCiAKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIzMjI6NTg6IChpdl9ydWxlVFJBTlNMQVRBQkxFU1RSSU5HPSBydWxlVFJBTlNMQVRBQkxFU1RSSU5HIEVPRiApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMzIzOjI6IGl2X3J1bGVUUkFOU0xBVEFCTEVTVFJJTkc9IHJ1bGVUUkFOU0xBVEFCTEVTVFJJTkcgRU9GCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNzYxOjU4OiAoaXZfcnVsZVRSQU5TTEFUQUJMRVNUUklORz0gcnVsZVRSQU5TTEFUQUJMRVNUUklORyBFT0YgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6Mjc2MjoyOiBpdl9ydWxlVFJBTlNMQVRBQkxFU1RSSU5HPSBydWxlVFJBTlNMQVRBQkxFU1RSSU5HIEVPRgogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBuZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0VFJBTlNMQVRBQkxFU1RSSU5HUnVsZSgpKTsgCkBAIC02MjI3LDcgKzc0MjEsNyBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVUUkFOU0xBVEFCTEVTVFJJTkciCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjMyOToxOiBydWxlVFJBTlNMQVRBQkxFU1RSSU5HIHJldHVybnMgW0FudGxyRGF0YXR5cGVSdWxlVG9rZW4gY3VycmVudD1uZXcgQW50bHJEYXRhdHlwZVJ1bGVUb2tlbigpXSA6IHRoaXNfU1RSSU5HXzA9IFJVTEVfU1RSSU5HIDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNzY4OjE6IHJ1bGVUUkFOU0xBVEFCTEVTVFJJTkcgcmV0dXJucyBbQW50bHJEYXRhdHlwZVJ1bGVUb2tlbiBjdXJyZW50PW5ldyBBbnRsckRhdGF0eXBlUnVsZVRva2VuKCldIDogdGhpc19TVFJJTkdfMD0gUlVMRV9TVFJJTkcgOwogICAgIHB1YmxpYyBmaW5hbCBBbnRsckRhdGF0eXBlUnVsZVRva2VuIHJ1bGVUUkFOU0xBVEFCTEVTVFJJTkcoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogICAgICAgICBBbnRsckRhdGF0eXBlUnVsZVRva2VuIGN1cnJlbnQgPSBuZXcgQW50bHJEYXRhdHlwZVJ1bGVUb2tlbigpOwogCkBAIC02MjM3LDggKzc0MzEsOCBAQAogICAgICAgICAJZW50ZXJSdWxlKCk7CiAKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIzMzU6MjogKHRoaXNfU1RSSU5HXzA9IFJVTEVfU1RSSU5HICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIzMzY6MjogdGhpc19TVFJJTkdfMD0gUlVMRV9TVFJJTkcKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI3NzQ6MjogKHRoaXNfU1RSSU5HXzA9IFJVTEVfU1RSSU5HICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI3NzU6MjogdGhpc19TVFJJTkdfMD0gUlVMRV9TVFJJTkcKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIHRoaXNfU1RSSU5HXzA9KFRva2VuKW1hdGNoKGlucHV0LFJVTEVfU1RSSU5HLEZPTExPV18yKTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKQEAgLTYyNzMsNyArNzQ2Nyw3IEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAiZW50cnlSdWxlVFJBTlNMQVRBQkxFSUQiCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjM0NjoxOiBlbnRyeVJ1bGVUUkFOU0xBVEFCTEVJRCByZXR1cm5zIFtTdHJpbmcgY3VycmVudD1udWxsXSA6IGl2X3J1bGVUUkFOU0xBVEFCTEVJRD0gcnVsZVRSQU5TTEFUQUJMRUlEIEVPRiA7CisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6Mjc4NToxOiBlbnRyeVJ1bGVUUkFOU0xBVEFCTEVJRCByZXR1cm5zIFtTdHJpbmcgY3VycmVudD1udWxsXSA6IGl2X3J1bGVUUkFOU0xBVEFCTEVJRD0gcnVsZVRSQU5TTEFUQUJMRUlEIEVPRiA7CiAgICAgcHVibGljIGZpbmFsIFN0cmluZyBlbnRyeVJ1bGVUUkFOU0xBVEFCTEVJRCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAgICAgICAgIFN0cmluZyBjdXJyZW50ID0gbnVsbDsKIApAQCAtNjI4MSw4ICs3NDc1LDggQEAKIAogCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMzQ2OjU0OiAoaXZfcnVsZVRSQU5TTEFUQUJMRUlEPSBydWxlVFJBTlNMQVRBQkxFSUQgRU9GICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIzNDc6MjogaXZfcnVsZVRSQU5TTEFUQUJMRUlEPSBydWxlVFJBTlNMQVRBQkxFSUQgRU9GCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNzg1OjU0OiAoaXZfcnVsZVRSQU5TTEFUQUJMRUlEPSBydWxlVFJBTlNMQVRBQkxFSUQgRU9GICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI3ODY6MjogaXZfcnVsZVRSQU5TTEFUQUJMRUlEPSBydWxlVFJBTlNMQVRBQkxFSUQgRU9GCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIG5ld0NvbXBvc2l0ZU5vZGUoZ3JhbW1hckFjY2Vzcy5nZXRUUkFOU0xBVEFCTEVJRFJ1bGUoKSk7IApAQCAtNjMxMyw3ICs3NTA3LDcgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlVFJBTlNMQVRBQkxFSUQiCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjM1MzoxOiBydWxlVFJBTlNMQVRBQkxFSUQgcmV0dXJucyBbQW50bHJEYXRhdHlwZVJ1bGVUb2tlbiBjdXJyZW50PW5ldyBBbnRsckRhdGF0eXBlUnVsZVRva2VuKCldIDogdGhpc19JRF8wPSBSVUxFX0lEIDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNzkyOjE6IHJ1bGVUUkFOU0xBVEFCTEVJRCByZXR1cm5zIFtBbnRsckRhdGF0eXBlUnVsZVRva2VuIGN1cnJlbnQ9bmV3IEFudGxyRGF0YXR5cGVSdWxlVG9rZW4oKV0gOiB0aGlzX0lEXzA9IFJVTEVfSUQgOwogICAgIHB1YmxpYyBmaW5hbCBBbnRsckRhdGF0eXBlUnVsZVRva2VuIHJ1bGVUUkFOU0xBVEFCTEVJRCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAgICAgICAgIEFudGxyRGF0YXR5cGVSdWxlVG9rZW4gY3VycmVudCA9IG5ldyBBbnRsckRhdGF0eXBlUnVsZVRva2VuKCk7CiAKQEAgLTYzMjMsOCArNzUxNyw4IEBACiAgICAgICAgIAllbnRlclJ1bGUoKTsKIAogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjM1OToyOiAodGhpc19JRF8wPSBSVUxFX0lEICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIzNjA6MjogdGhpc19JRF8wPSBSVUxFX0lECisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNzk4OjI6ICh0aGlzX0lEXzA9IFJVTEVfSUQgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6Mjc5OToyOiB0aGlzX0lEXzA9IFJVTEVfSUQKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIHRoaXNfSURfMD0oVG9rZW4pbWF0Y2goaW5wdXQsUlVMRV9JRCxGT0xMT1dfMik7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OwogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CkBAIC02MzU5LDcgKzc1NTMsNyBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgImVudHJ5UnVsZVhJbXBvcnREZWNsYXJhdGlvbiIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMzcwOjE6IGVudHJ5UnVsZVhJbXBvcnREZWNsYXJhdGlvbiByZXR1cm5zIFtFT2JqZWN0IGN1cnJlbnQ9bnVsbF0gOiBpdl9ydWxlWEltcG9ydERlY2xhcmF0aW9uPSBydWxlWEltcG9ydERlY2xhcmF0aW9uIEVPRiA7CisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjgwOToxOiBlbnRyeVJ1bGVYSW1wb3J0RGVjbGFyYXRpb24gcmV0dXJucyBbRU9iamVjdCBjdXJyZW50PW51bGxdIDogaXZfcnVsZVhJbXBvcnREZWNsYXJhdGlvbj0gcnVsZVhJbXBvcnREZWNsYXJhdGlvbiBFT0YgOwogICAgIHB1YmxpYyBmaW5hbCBFT2JqZWN0IGVudHJ5UnVsZVhJbXBvcnREZWNsYXJhdGlvbigpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAgICAgICAgIEVPYmplY3QgY3VycmVudCA9IG51bGw7CiAKQEAgLTYzNjcsOCArNzU2MSw4IEBACiAKIAogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjM3MDo1OTogKGl2X3J1bGVYSW1wb3J0RGVjbGFyYXRpb249IHJ1bGVYSW1wb3J0RGVjbGFyYXRpb24gRU9GICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIzNzE6MjogaXZfcnVsZVhJbXBvcnREZWNsYXJhdGlvbj0gcnVsZVhJbXBvcnREZWNsYXJhdGlvbiBFT0YKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI4MDk6NTk6IChpdl9ydWxlWEltcG9ydERlY2xhcmF0aW9uPSBydWxlWEltcG9ydERlY2xhcmF0aW9uIEVPRiApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyODEwOjI6IGl2X3J1bGVYSW1wb3J0RGVjbGFyYXRpb249IHJ1bGVYSW1wb3J0RGVjbGFyYXRpb24gRU9GCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIG5ld0NvbXBvc2l0ZU5vZGUoZ3JhbW1hckFjY2Vzcy5nZXRYSW1wb3J0RGVjbGFyYXRpb25SdWxlKCkpOyAKQEAgLTYzOTksNyArNzU5Myw3IEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZVhJbXBvcnREZWNsYXJhdGlvbiIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMzc3OjE6IHJ1bGVYSW1wb3J0RGVjbGFyYXRpb24gcmV0dXJucyBbRU9iamVjdCBjdXJyZW50PW51bGxdIDogKCAoKSBvdGhlcmx2XzE9ICdpbXBvcnQnICggKCAoIChsdl9zdGF0aWNfMl8wPSAnc3RhdGljJyApICkgKCAobHZfZXh0ZW5zaW9uXzNfMD0gJ2V4dGVuc2lvbicgKSApPyAoICggcnVsZVF1YWxpZmllZE5hbWVJblN0YXRpY0ltcG9ydCApICkgKCAoIChsdl93aWxkY2FyZF81XzA9ICcqJyApICkgfCAoIChsdl9tZW1iZXJOYW1lXzZfMD0gcnVsZVZhbGlkSUQgKSApICkgKSB8ICggKCBydWxlUXVhbGlmaWVkTmFtZSApICkgfCAoIChsdl9pbXBvcnRlZE5hbWVzcGFjZV84XzA9IHJ1bGVRdWFsaWZpZWROYW1lV2l0aFdpbGRjYXJkICkgKSB8ICggKCAobHZfZnFuSW1wb3J0XzlfMD0gJ25zJyApICkgKCAobHZfaW1wb3J0ZWRGdWxseVF1YWxpZmllZE5hbWVfMTBfMD0gcnVsZVF1YWxpZmllZE5hbWUgKSApICkgKSAob3RoZXJsdl8xMT0gJzsnICk/ICkgOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI4MTY6MTogcnVsZVhJbXBvcnREZWNsYXJhdGlvbiByZXR1cm5zIFtFT2JqZWN0IGN1cnJlbnQ9bnVsbF0gOiAoICgpIG90aGVybHZfMT0gJ2ltcG9ydCcgKCAoICggKGx2X3N0YXRpY18yXzA9ICdzdGF0aWMnICkgKSAoIChsdl9leHRlbnNpb25fM18wPSAnZXh0ZW5zaW9uJyApICk/ICggKCBydWxlUXVhbGlmaWVkTmFtZUluU3RhdGljSW1wb3J0ICkgKSAoICggKGx2X3dpbGRjYXJkXzVfMD0gJyonICkgKSB8ICggKGx2X21lbWJlck5hbWVfNl8wPSBydWxlVmFsaWRJRCApICkgKSApIHwgKCAoIHJ1bGVRdWFsaWZpZWROYW1lICkgKSB8ICggKGx2X2ltcG9ydGVkTmFtZXNwYWNlXzhfMD0gcnVsZVF1YWxpZmllZE5hbWVXaXRoV2lsZGNhcmQgKSApIHwgKCAoIChsdl9mcW5JbXBvcnRfOV8wPSAnbnMnICkgKSAoIChsdl9pbXBvcnRlZEZ1bGx5UXVhbGlmaWVkTmFtZV8xMF8wPSBydWxlUXVhbGlmaWVkTmFtZSApICkgKSApIChvdGhlcmx2XzExPSAnOycgKT8gKSA7CiAgICAgcHVibGljIGZpbmFsIEVPYmplY3QgcnVsZVhJbXBvcnREZWNsYXJhdGlvbigpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAgICAgICAgIEVPYmplY3QgY3VycmVudCA9IG51bGw7CiAKQEAgLTY0MjAsMTQgKzc2MTQsMTQgQEAKICAgICAgICAgCWVudGVyUnVsZSgpOwogCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMzgzOjI6ICggKCAoKSBvdGhlcmx2XzE9ICdpbXBvcnQnICggKCAoIChsdl9zdGF0aWNfMl8wPSAnc3RhdGljJyApICkgKCAobHZfZXh0ZW5zaW9uXzNfMD0gJ2V4dGVuc2lvbicgKSApPyAoICggcnVsZVF1YWxpZmllZE5hbWVJblN0YXRpY0ltcG9ydCApICkgKCAoIChsdl93aWxkY2FyZF81XzA9ICcqJyApICkgfCAoIChsdl9tZW1iZXJOYW1lXzZfMD0gcnVsZVZhbGlkSUQgKSApICkgKSB8ICggKCBydWxlUXVhbGlmaWVkTmFtZSApICkgfCAoIChsdl9pbXBvcnRlZE5hbWVzcGFjZV84XzA9IHJ1bGVRdWFsaWZpZWROYW1lV2l0aFdpbGRjYXJkICkgKSB8ICggKCAobHZfZnFuSW1wb3J0XzlfMD0gJ25zJyApICkgKCAobHZfaW1wb3J0ZWRGdWxseVF1YWxpZmllZE5hbWVfMTBfMD0gcnVsZVF1YWxpZmllZE5hbWUgKSApICkgKSAob3RoZXJsdl8xMT0gJzsnICk/ICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjM4NDoyOiAoICgpIG90aGVybHZfMT0gJ2ltcG9ydCcgKCAoICggKGx2X3N0YXRpY18yXzA9ICdzdGF0aWMnICkgKSAoIChsdl9leHRlbnNpb25fM18wPSAnZXh0ZW5zaW9uJyApICk/ICggKCBydWxlUXVhbGlmaWVkTmFtZUluU3RhdGljSW1wb3J0ICkgKSAoICggKGx2X3dpbGRjYXJkXzVfMD0gJyonICkgKSB8ICggKGx2X21lbWJlck5hbWVfNl8wPSBydWxlVmFsaWRJRCApICkgKSApIHwgKCAoIHJ1bGVRdWFsaWZpZWROYW1lICkgKSB8ICggKGx2X2ltcG9ydGVkTmFtZXNwYWNlXzhfMD0gcnVsZVF1YWxpZmllZE5hbWVXaXRoV2lsZGNhcmQgKSApIHwgKCAoIChsdl9mcW5JbXBvcnRfOV8wPSAnbnMnICkgKSAoIChsdl9pbXBvcnRlZEZ1bGx5UXVhbGlmaWVkTmFtZV8xMF8wPSBydWxlUXVhbGlmaWVkTmFtZSApICkgKSApIChvdGhlcmx2XzExPSAnOycgKT8gKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjgyMjoyOiAoICggKCkgb3RoZXJsdl8xPSAnaW1wb3J0JyAoICggKCAobHZfc3RhdGljXzJfMD0gJ3N0YXRpYycgKSApICggKGx2X2V4dGVuc2lvbl8zXzA9ICdleHRlbnNpb24nICkgKT8gKCAoIHJ1bGVRdWFsaWZpZWROYW1lSW5TdGF0aWNJbXBvcnQgKSApICggKCAobHZfd2lsZGNhcmRfNV8wPSAnKicgKSApIHwgKCAobHZfbWVtYmVyTmFtZV82XzA9IHJ1bGVWYWxpZElEICkgKSApICkgfCAoICggcnVsZVF1YWxpZmllZE5hbWUgKSApIHwgKCAobHZfaW1wb3J0ZWROYW1lc3BhY2VfOF8wPSBydWxlUXVhbGlmaWVkTmFtZVdpdGhXaWxkY2FyZCApICkgfCAoICggKGx2X2ZxbkltcG9ydF85XzA9ICducycgKSApICggKGx2X2ltcG9ydGVkRnVsbHlRdWFsaWZpZWROYW1lXzEwXzA9IHJ1bGVRdWFsaWZpZWROYW1lICkgKSApICkgKG90aGVybHZfMTE9ICc7JyApPyApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI4MjM6MjogKCAoKSBvdGhlcmx2XzE9ICdpbXBvcnQnICggKCAoIChsdl9zdGF0aWNfMl8wPSAnc3RhdGljJyApICkgKCAobHZfZXh0ZW5zaW9uXzNfMD0gJ2V4dGVuc2lvbicgKSApPyAoICggcnVsZVF1YWxpZmllZE5hbWVJblN0YXRpY0ltcG9ydCApICkgKCAoIChsdl93aWxkY2FyZF81XzA9ICcqJyApICkgfCAoIChsdl9tZW1iZXJOYW1lXzZfMD0gcnVsZVZhbGlkSUQgKSApICkgKSB8ICggKCBydWxlUXVhbGlmaWVkTmFtZSApICkgfCAoIChsdl9pbXBvcnRlZE5hbWVzcGFjZV84XzA9IHJ1bGVRdWFsaWZpZWROYW1lV2l0aFdpbGRjYXJkICkgKSB8ICggKCAobHZfZnFuSW1wb3J0XzlfMD0gJ25zJyApICkgKCAobHZfaW1wb3J0ZWRGdWxseVF1YWxpZmllZE5hbWVfMTBfMD0gcnVsZVF1YWxpZmllZE5hbWUgKSApICkgKSAob3RoZXJsdl8xMT0gJzsnICk/ICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIzODQ6MjogKCAoKSBvdGhlcmx2XzE9ICdpbXBvcnQnICggKCAoIChsdl9zdGF0aWNfMl8wPSAnc3RhdGljJyApICkgKCAobHZfZXh0ZW5zaW9uXzNfMD0gJ2V4dGVuc2lvbicgKSApPyAoICggcnVsZVF1YWxpZmllZE5hbWVJblN0YXRpY0ltcG9ydCApICkgKCAoIChsdl93aWxkY2FyZF81XzA9ICcqJyApICkgfCAoIChsdl9tZW1iZXJOYW1lXzZfMD0gcnVsZVZhbGlkSUQgKSApICkgKSB8ICggKCBydWxlUXVhbGlmaWVkTmFtZSApICkgfCAoIChsdl9pbXBvcnRlZE5hbWVzcGFjZV84XzA9IHJ1bGVRdWFsaWZpZWROYW1lV2l0aFdpbGRjYXJkICkgKSB8ICggKCAobHZfZnFuSW1wb3J0XzlfMD0gJ25zJyApICkgKCAobHZfaW1wb3J0ZWRGdWxseVF1YWxpZmllZE5hbWVfMTBfMD0gcnVsZVF1YWxpZmllZE5hbWUgKSApICkgKSAob3RoZXJsdl8xMT0gJzsnICk/ICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIzODU6MzogKCkgb3RoZXJsdl8xPSAnaW1wb3J0JyAoICggKCAobHZfc3RhdGljXzJfMD0gJ3N0YXRpYycgKSApICggKGx2X2V4dGVuc2lvbl8zXzA9ICdleHRlbnNpb24nICkgKT8gKCAoIHJ1bGVRdWFsaWZpZWROYW1lSW5TdGF0aWNJbXBvcnQgKSApICggKCAobHZfd2lsZGNhcmRfNV8wPSAnKicgKSApIHwgKCAobHZfbWVtYmVyTmFtZV82XzA9IHJ1bGVWYWxpZElEICkgKSApICkgfCAoICggcnVsZVF1YWxpZmllZE5hbWUgKSApIHwgKCAobHZfaW1wb3J0ZWROYW1lc3BhY2VfOF8wPSBydWxlUXVhbGlmaWVkTmFtZVdpdGhXaWxkY2FyZCApICkgfCAoICggKGx2X2ZxbkltcG9ydF85XzA9ICducycgKSApICggKGx2X2ltcG9ydGVkRnVsbHlRdWFsaWZpZWROYW1lXzEwXzA9IHJ1bGVRdWFsaWZpZWROYW1lICkgKSApICkgKG90aGVybHZfMTE9ICc7JyApPworICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjgyMzoyOiAoICgpIG90aGVybHZfMT0gJ2ltcG9ydCcgKCAoICggKGx2X3N0YXRpY18yXzA9ICdzdGF0aWMnICkgKSAoIChsdl9leHRlbnNpb25fM18wPSAnZXh0ZW5zaW9uJyApICk/ICggKCBydWxlUXVhbGlmaWVkTmFtZUluU3RhdGljSW1wb3J0ICkgKSAoICggKGx2X3dpbGRjYXJkXzVfMD0gJyonICkgKSB8ICggKGx2X21lbWJlck5hbWVfNl8wPSBydWxlVmFsaWRJRCApICkgKSApIHwgKCAoIHJ1bGVRdWFsaWZpZWROYW1lICkgKSB8ICggKGx2X2ltcG9ydGVkTmFtZXNwYWNlXzhfMD0gcnVsZVF1YWxpZmllZE5hbWVXaXRoV2lsZGNhcmQgKSApIHwgKCAoIChsdl9mcW5JbXBvcnRfOV8wPSAnbnMnICkgKSAoIChsdl9pbXBvcnRlZEZ1bGx5UXVhbGlmaWVkTmFtZV8xMF8wPSBydWxlUXVhbGlmaWVkTmFtZSApICkgKSApIChvdGhlcmx2XzExPSAnOycgKT8gKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjgyNDozOiAoKSBvdGhlcmx2XzE9ICdpbXBvcnQnICggKCAoIChsdl9zdGF0aWNfMl8wPSAnc3RhdGljJyApICkgKCAobHZfZXh0ZW5zaW9uXzNfMD0gJ2V4dGVuc2lvbicgKSApPyAoICggcnVsZVF1YWxpZmllZE5hbWVJblN0YXRpY0ltcG9ydCApICkgKCAoIChsdl93aWxkY2FyZF81XzA9ICcqJyApICkgfCAoIChsdl9tZW1iZXJOYW1lXzZfMD0gcnVsZVZhbGlkSUQgKSApICkgKSB8ICggKCBydWxlUXVhbGlmaWVkTmFtZSApICkgfCAoIChsdl9pbXBvcnRlZE5hbWVzcGFjZV84XzA9IHJ1bGVRdWFsaWZpZWROYW1lV2l0aFdpbGRjYXJkICkgKSB8ICggKCAobHZfZnFuSW1wb3J0XzlfMD0gJ25zJyApICkgKCAobHZfaW1wb3J0ZWRGdWxseVF1YWxpZmllZE5hbWVfMTBfMD0gcnVsZVF1YWxpZmllZE5hbWUgKSApICkgKSAob3RoZXJsdl8xMT0gJzsnICk/CiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMzg1OjM6ICgpCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMzg2OjQ6IAorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjgyNDozOiAoKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjgyNTo0OiAKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogCkBAIC02NDM5LDI5ICs3NjMzLDI5IEBACiAKICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgb3RoZXJsdl8xPShUb2tlbiltYXRjaChpbnB1dCw2OCxGT0xMT1dfNTUpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gY3VycmVudDsKKyAgICAgICAgICAgIG90aGVybHZfMT0oVG9rZW4pbWF0Y2goaW5wdXQsNzUsRk9MTE9XXzY5KTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKIAogICAgICAgICAgICAgICAJCQluZXdMZWFmTm9kZShvdGhlcmx2XzEsIGdyYW1tYXJBY2Nlc3MuZ2V0WEltcG9ydERlY2xhcmF0aW9uQWNjZXNzKCkuZ2V0SW1wb3J0S2V5d29yZF8xKCkpOwogICAgICAgICAgICAgICAJCQogICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjM5NjozOiAoICggKCAobHZfc3RhdGljXzJfMD0gJ3N0YXRpYycgKSApICggKGx2X2V4dGVuc2lvbl8zXzA9ICdleHRlbnNpb24nICkgKT8gKCAoIHJ1bGVRdWFsaWZpZWROYW1lSW5TdGF0aWNJbXBvcnQgKSApICggKCAobHZfd2lsZGNhcmRfNV8wPSAnKicgKSApIHwgKCAobHZfbWVtYmVyTmFtZV82XzA9IHJ1bGVWYWxpZElEICkgKSApICkgfCAoICggcnVsZVF1YWxpZmllZE5hbWUgKSApIHwgKCAobHZfaW1wb3J0ZWROYW1lc3BhY2VfOF8wPSBydWxlUXVhbGlmaWVkTmFtZVdpdGhXaWxkY2FyZCApICkgfCAoICggKGx2X2ZxbkltcG9ydF85XzA9ICducycgKSApICggKGx2X2ltcG9ydGVkRnVsbHlRdWFsaWZpZWROYW1lXzEwXzA9IHJ1bGVRdWFsaWZpZWROYW1lICkgKSApICkKLSAgICAgICAgICAgIGludCBhbHQ0MT00OwotICAgICAgICAgICAgYWx0NDEgPSBkZmE0MS5wcmVkaWN0KGlucHV0KTsKLSAgICAgICAgICAgIHN3aXRjaCAoYWx0NDEpIHsKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI4MzU6MzogKCAoICggKGx2X3N0YXRpY18yXzA9ICdzdGF0aWMnICkgKSAoIChsdl9leHRlbnNpb25fM18wPSAnZXh0ZW5zaW9uJyApICk/ICggKCBydWxlUXVhbGlmaWVkTmFtZUluU3RhdGljSW1wb3J0ICkgKSAoICggKGx2X3dpbGRjYXJkXzVfMD0gJyonICkgKSB8ICggKGx2X21lbWJlck5hbWVfNl8wPSBydWxlVmFsaWRJRCApICkgKSApIHwgKCAoIHJ1bGVRdWFsaWZpZWROYW1lICkgKSB8ICggKGx2X2ltcG9ydGVkTmFtZXNwYWNlXzhfMD0gcnVsZVF1YWxpZmllZE5hbWVXaXRoV2lsZGNhcmQgKSApIHwgKCAoIChsdl9mcW5JbXBvcnRfOV8wPSAnbnMnICkgKSAoIChsdl9pbXBvcnRlZEZ1bGx5UXVhbGlmaWVkTmFtZV8xMF8wPSBydWxlUXVhbGlmaWVkTmFtZSApICkgKSApCisgICAgICAgICAgICBpbnQgYWx0NTI9NDsKKyAgICAgICAgICAgIGFsdDUyID0gZGZhNTIucHJlZGljdChpbnB1dCk7CisgICAgICAgICAgICBzd2l0Y2ggKGFsdDUyKSB7CiAgICAgICAgICAgICAgICAgY2FzZSAxIDoKLSAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjM5Nzo0OiAoICggKGx2X3N0YXRpY18yXzA9ICdzdGF0aWMnICkgKSAoIChsdl9leHRlbnNpb25fM18wPSAnZXh0ZW5zaW9uJyApICk/ICggKCBydWxlUXVhbGlmaWVkTmFtZUluU3RhdGljSW1wb3J0ICkgKSAoICggKGx2X3dpbGRjYXJkXzVfMD0gJyonICkgKSB8ICggKGx2X21lbWJlck5hbWVfNl8wPSBydWxlVmFsaWRJRCApICkgKSApCisgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI4MzY6NDogKCAoIChsdl9zdGF0aWNfMl8wPSAnc3RhdGljJyApICkgKCAobHZfZXh0ZW5zaW9uXzNfMD0gJ2V4dGVuc2lvbicgKSApPyAoICggcnVsZVF1YWxpZmllZE5hbWVJblN0YXRpY0ltcG9ydCApICkgKCAoIChsdl93aWxkY2FyZF81XzA9ICcqJyApICkgfCAoIChsdl9tZW1iZXJOYW1lXzZfMD0gcnVsZVZhbGlkSUQgKSApICkgKQogICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjIzOTc6NDogKCAoIChsdl9zdGF0aWNfMl8wPSAnc3RhdGljJyApICkgKCAobHZfZXh0ZW5zaW9uXzNfMD0gJ2V4dGVuc2lvbicgKSApPyAoICggcnVsZVF1YWxpZmllZE5hbWVJblN0YXRpY0ltcG9ydCApICkgKCAoIChsdl93aWxkY2FyZF81XzA9ICcqJyApICkgfCAoIChsdl9tZW1iZXJOYW1lXzZfMD0gcnVsZVZhbGlkSUQgKSApICkgKQotICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMzk4OjU6ICggKGx2X3N0YXRpY18yXzA9ICdzdGF0aWMnICkgKSAoIChsdl9leHRlbnNpb25fM18wPSAnZXh0ZW5zaW9uJyApICk/ICggKCBydWxlUXVhbGlmaWVkTmFtZUluU3RhdGljSW1wb3J0ICkgKSAoICggKGx2X3dpbGRjYXJkXzVfMD0gJyonICkgKSB8ICggKGx2X21lbWJlck5hbWVfNl8wPSBydWxlVmFsaWRJRCApICkgKQorICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyODM2OjQ6ICggKCAobHZfc3RhdGljXzJfMD0gJ3N0YXRpYycgKSApICggKGx2X2V4dGVuc2lvbl8zXzA9ICdleHRlbnNpb24nICkgKT8gKCAoIHJ1bGVRdWFsaWZpZWROYW1lSW5TdGF0aWNJbXBvcnQgKSApICggKCAobHZfd2lsZGNhcmRfNV8wPSAnKicgKSApIHwgKCAobHZfbWVtYmVyTmFtZV82XzA9IHJ1bGVWYWxpZElEICkgKSApICkKKyAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjgzNzo1OiAoIChsdl9zdGF0aWNfMl8wPSAnc3RhdGljJyApICkgKCAobHZfZXh0ZW5zaW9uXzNfMD0gJ2V4dGVuc2lvbicgKSApPyAoICggcnVsZVF1YWxpZmllZE5hbWVJblN0YXRpY0ltcG9ydCApICkgKCAoIChsdl93aWxkY2FyZF81XzA9ICcqJyApICkgfCAoIChsdl9tZW1iZXJOYW1lXzZfMD0gcnVsZVZhbGlkSUQgKSApICkKICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMzk4OjU6ICggKGx2X3N0YXRpY18yXzA9ICdzdGF0aWMnICkgKQotICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMzk5OjY6IChsdl9zdGF0aWNfMl8wPSAnc3RhdGljJyApCisgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI4Mzc6NTogKCAobHZfc3RhdGljXzJfMD0gJ3N0YXRpYycgKSApCisgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI4Mzg6NjogKGx2X3N0YXRpY18yXzA9ICdzdGF0aWMnICkKICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyMzk5OjY6IChsdl9zdGF0aWNfMl8wPSAnc3RhdGljJyApCi0gICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI0MDA6NzogbHZfc3RhdGljXzJfMD0gJ3N0YXRpYycKKyAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjgzODo2OiAobHZfc3RhdGljXzJfMD0gJ3N0YXRpYycgKQorICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyODM5Ojc6IGx2X3N0YXRpY18yXzA9ICdzdGF0aWMnCiAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgbHZfc3RhdGljXzJfMD0oVG9rZW4pbWF0Y2goaW5wdXQsNjksRk9MTE9XXzU2KTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7CisgICAgICAgICAgICAgICAgICAgIGx2X3N0YXRpY18yXzA9KFRva2VuKW1hdGNoKGlucHV0LDc2LEZPTExPV183MCk7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OwogICAgICAgICAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKIAogICAgICAgICAgICAgICAgICAgICAgIAkJCQkJCQluZXdMZWFmTm9kZShsdl9zdGF0aWNfMl8wLCBncmFtbWFyQWNjZXNzLmdldFhJbXBvcnREZWNsYXJhdGlvbkFjY2VzcygpLmdldFN0YXRpY1N0YXRpY0tleXdvcmRfMl8wXzBfMCgpKTsKQEAgLTY0ODEsMjEgKzc2NzUsMjEgQEAKIAogICAgICAgICAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjQxMjo1OiAoIChsdl9leHRlbnNpb25fM18wPSAnZXh0ZW5zaW9uJyApICk/Ci0gICAgICAgICAgICAgICAgICAgIGludCBhbHQzOT0yOwotICAgICAgICAgICAgICAgICAgICBpbnQgTEEzOV8wID0gaW5wdXQuTEEoMSk7CisgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI4NTE6NTogKCAobHZfZXh0ZW5zaW9uXzNfMD0gJ2V4dGVuc2lvbicgKSApPworICAgICAgICAgICAgICAgICAgICBpbnQgYWx0NTA9MjsKKyAgICAgICAgICAgICAgICAgICAgaW50IExBNTBfMCA9IGlucHV0LkxBKDEpOwogCi0gICAgICAgICAgICAgICAgICAgIGlmICggKExBMzlfMD09NjUpICkgewotICAgICAgICAgICAgICAgICAgICAgICAgYWx0Mzk9MTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCAoTEE1MF8wPT03MikgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBhbHQ1MD0xOwogICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoYWx0MzkpIHsKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChhbHQ1MCkgewogICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxIDoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNDEzOjY6IChsdl9leHRlbnNpb25fM18wPSAnZXh0ZW5zaW9uJyApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6Mjg1Mjo2OiAobHZfZXh0ZW5zaW9uXzNfMD0gJ2V4dGVuc2lvbicgKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNDEzOjY6IChsdl9leHRlbnNpb25fM18wPSAnZXh0ZW5zaW9uJyApCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjQxNDo3OiBsdl9leHRlbnNpb25fM18wPSAnZXh0ZW5zaW9uJworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI4NTI6NjogKGx2X2V4dGVuc2lvbl8zXzA9ICdleHRlbnNpb24nICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyODUzOjc6IGx2X2V4dGVuc2lvbl8zXzA9ICdleHRlbnNpb24nCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGx2X2V4dGVuc2lvbl8zXzA9KFRva2VuKW1hdGNoKGlucHV0LDY1LEZPTExPV181Nik7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGx2X2V4dGVuc2lvbl8zXzA9KFRva2VuKW1hdGNoKGlucHV0LDcyLEZPTExPV183MCk7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAJCQkJCQkJbmV3TGVhZk5vZGUobHZfZXh0ZW5zaW9uXzNfMCwgZ3JhbW1hckFjY2Vzcy5nZXRYSW1wb3J0RGVjbGFyYXRpb25BY2Nlc3MoKS5nZXRFeHRlbnNpb25FeHRlbnNpb25LZXl3b3JkXzJfMF8xXzAoKSk7CkBAIC02NTE4LDExICs3NzEyLDExIEBACiAKICAgICAgICAgICAgICAgICAgICAgfQogCi0gICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI0MjY6NTogKCAoIHJ1bGVRdWFsaWZpZWROYW1lSW5TdGF0aWNJbXBvcnQgKSApCi0gICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI0Mjc6NjogKCBydWxlUXVhbGlmaWVkTmFtZUluU3RhdGljSW1wb3J0ICkKKyAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6Mjg2NTo1OiAoICggcnVsZVF1YWxpZmllZE5hbWVJblN0YXRpY0ltcG9ydCApICkKKyAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6Mjg2Njo2OiAoIHJ1bGVRdWFsaWZpZWROYW1lSW5TdGF0aWNJbXBvcnQgKQogICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI0Mjc6NjogKCBydWxlUXVhbGlmaWVkTmFtZUluU3RhdGljSW1wb3J0ICkKLSAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjQyODo3OiBydWxlUXVhbGlmaWVkTmFtZUluU3RhdGljSW1wb3J0CisgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI4NjY6NjogKCBydWxlUXVhbGlmaWVkTmFtZUluU3RhdGljSW1wb3J0ICkKKyAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6Mjg2Nzo3OiBydWxlUXVhbGlmaWVkTmFtZUluU3RhdGljSW1wb3J0CiAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAKQEAgLTY1MzYsNyArNzczMCw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgCQkJCQkJCW5ld0NvbXBvc2l0ZU5vZGUoZ3JhbW1hckFjY2Vzcy5nZXRYSW1wb3J0RGVjbGFyYXRpb25BY2Nlc3MoKS5nZXRJbXBvcnRlZFR5cGVKdm1EZWNsYXJlZFR5cGVDcm9zc1JlZmVyZW5jZV8yXzBfMl8wKCkpOwogICAgICAgICAgICAgICAgICAgICAgIAkJCQkJCQogICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzU3KTsKKyAgICAgICAgICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfNzEpOwogICAgICAgICAgICAgICAgICAgICBydWxlUXVhbGlmaWVkTmFtZUluU3RhdGljSW1wb3J0KCk7CiAKICAgICAgICAgICAgICAgICAgICAgc3RhdGUuX2ZzcC0tOwpAQCAtNjU1MiwzNCArNzc0NiwzNCBAQAogCiAgICAgICAgICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNDQyOjU6ICggKCAobHZfd2lsZGNhcmRfNV8wPSAnKicgKSApIHwgKCAobHZfbWVtYmVyTmFtZV82XzA9IHJ1bGVWYWxpZElEICkgKSApCi0gICAgICAgICAgICAgICAgICAgIGludCBhbHQ0MD0yOwotICAgICAgICAgICAgICAgICAgICBpbnQgTEE0MF8wID0gaW5wdXQuTEEoMSk7CisgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI4ODE6NTogKCAoIChsdl93aWxkY2FyZF81XzA9ICcqJyApICkgfCAoIChsdl9tZW1iZXJOYW1lXzZfMD0gcnVsZVZhbGlkSUQgKSApICkKKyAgICAgICAgICAgICAgICAgICAgaW50IGFsdDUxPTI7CisgICAgICAgICAgICAgICAgICAgIGludCBMQTUxXzAgPSBpbnB1dC5MQSgxKTsKIAotICAgICAgICAgICAgICAgICAgICBpZiAoIChMQTQwXzA9PTcwKSApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGFsdDQwPTE7CisgICAgICAgICAgICAgICAgICAgIGlmICggKExBNTFfMD09NzcpICkgeworICAgICAgICAgICAgICAgICAgICAgICAgYWx0NTE9MTsKICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICggKExBNDBfMD09UlVMRV9JRCkgKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBhbHQ0MD0yOworICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICggKExBNTFfMD09UlVMRV9JRCkgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBhbHQ1MT0yOwogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN0YXRlLmJhY2t0cmFja2luZz4wKSB7c3RhdGUuZmFpbGVkPXRydWU7IHJldHVybiBjdXJyZW50O30KICAgICAgICAgICAgICAgICAgICAgICAgIE5vVmlhYmxlQWx0RXhjZXB0aW9uIG52YWUgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBOb1ZpYWJsZUFsdEV4Y2VwdGlvbigiIiwgNDAsIDAsIGlucHV0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgTm9WaWFibGVBbHRFeGNlcHRpb24oIiIsIDUxLCAwLCBpbnB1dCk7CiAKICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG52YWU7CiAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChhbHQ0MCkgeworICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKGFsdDUxKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDEgOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI0NDM6NjogKCAobHZfd2lsZGNhcmRfNV8wPSAnKicgKSApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6Mjg4Mjo2OiAoIChsdl93aWxkY2FyZF81XzA9ICcqJyApICkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjQ0Mzo2OiAoIChsdl93aWxkY2FyZF81XzA9ICcqJyApICkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNDQ0Ojc6IChsdl93aWxkY2FyZF81XzA9ICcqJyApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6Mjg4Mjo2OiAoIChsdl93aWxkY2FyZF81XzA9ICcqJyApICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyODgzOjc6IChsdl93aWxkY2FyZF81XzA9ICcqJyApCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI0NDQ6NzogKGx2X3dpbGRjYXJkXzVfMD0gJyonICkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNDQ1Ojg6IGx2X3dpbGRjYXJkXzVfMD0gJyonCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6Mjg4Mzo3OiAobHZfd2lsZGNhcmRfNV8wPSAnKicgKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI4ODQ6ODogbHZfd2lsZGNhcmRfNV8wPSAnKicKICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbHZfd2lsZGNhcmRfNV8wPShUb2tlbiltYXRjaChpbnB1dCw3MCxGT0xMT1dfNTgpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gY3VycmVudDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBsdl93aWxkY2FyZF81XzA9KFRva2VuKW1hdGNoKGlucHV0LDc3LEZPTExPV183Mik7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAJCQkJCQkJCW5ld0xlYWZOb2RlKGx2X3dpbGRjYXJkXzVfMCwgZ3JhbW1hckFjY2Vzcy5nZXRYSW1wb3J0RGVjbGFyYXRpb25BY2Nlc3MoKS5nZXRXaWxkY2FyZEFzdGVyaXNrS2V5d29yZF8yXzBfM18wXzAoKSk7CkBAIC02NjAzLDIwICs3Nzk3LDIwIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAyIDoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNDU4OjY6ICggKGx2X21lbWJlck5hbWVfNl8wPSBydWxlVmFsaWRJRCApICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyODk3OjY6ICggKGx2X21lbWJlck5hbWVfNl8wPSBydWxlVmFsaWRJRCApICkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjQ1ODo2OiAoIChsdl9tZW1iZXJOYW1lXzZfMD0gcnVsZVZhbGlkSUQgKSApCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjQ1OTo3OiAobHZfbWVtYmVyTmFtZV82XzA9IHJ1bGVWYWxpZElEICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyODk3OjY6ICggKGx2X21lbWJlck5hbWVfNl8wPSBydWxlVmFsaWRJRCApICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyODk4Ojc6IChsdl9tZW1iZXJOYW1lXzZfMD0gcnVsZVZhbGlkSUQgKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNDU5Ojc6IChsdl9tZW1iZXJOYW1lXzZfMD0gcnVsZVZhbGlkSUQgKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI0NjA6ODogbHZfbWVtYmVyTmFtZV82XzA9IHJ1bGVWYWxpZElECisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6Mjg5ODo3OiAobHZfbWVtYmVyTmFtZV82XzA9IHJ1bGVWYWxpZElEICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyODk5Ojg6IGx2X21lbWJlck5hbWVfNl8wPSBydWxlVmFsaWRJRAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCQkJCQkJCQluZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0WEltcG9ydERlY2xhcmF0aW9uQWNjZXNzKCkuZ2V0TWVtYmVyTmFtZVZhbGlkSURQYXJzZXJSdWxlQ2FsbF8yXzBfM18xXzAoKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAJCQkJCQkJCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzU4KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV183Mik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbHZfbWVtYmVyTmFtZV82XzA9cnVsZVZhbGlkSUQoKTsKIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlLl9mc3AtLTsKQEAgLTY2NTMsMTMgKzc4NDcsMTMgQEAKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICBjYXNlIDIgOgotICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNDgwOjQ6ICggKCBydWxlUXVhbGlmaWVkTmFtZSApICkKKyAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjkxOTo0OiAoICggcnVsZVF1YWxpZmllZE5hbWUgKSApCiAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjQ4MDo0OiAoICggcnVsZVF1YWxpZmllZE5hbWUgKSApCi0gICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI0ODE6NTogKCBydWxlUXVhbGlmaWVkTmFtZSApCisgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI5MTk6NDogKCAoIHJ1bGVRdWFsaWZpZWROYW1lICkgKQorICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyOTIwOjU6ICggcnVsZVF1YWxpZmllZE5hbWUgKQogICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI0ODE6NTogKCBydWxlUXVhbGlmaWVkTmFtZSApCi0gICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI0ODI6NjogcnVsZVF1YWxpZmllZE5hbWUKKyAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjkyMDo1OiAoIHJ1bGVRdWFsaWZpZWROYW1lICkKKyAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjkyMTo2OiBydWxlUXVhbGlmaWVkTmFtZQogICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogCkBAIC02NjczLDcgKzc4NjcsNyBAQAogICAgICAgICAgICAgICAgICAgICAgIAkJCQkJCW5ld0NvbXBvc2l0ZU5vZGUoZ3JhbW1hckFjY2Vzcy5nZXRYSW1wb3J0RGVjbGFyYXRpb25BY2Nlc3MoKS5nZXRJbXBvcnRlZFR5cGVKdm1EZWNsYXJlZFR5cGVDcm9zc1JlZmVyZW5jZV8yXzFfMCgpKTsKICAgICAgICAgICAgICAgICAgICAgICAJCQkJCQogICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzU4KTsKKyAgICAgICAgICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfNzIpOwogICAgICAgICAgICAgICAgICAgICBydWxlUXVhbGlmaWVkTmFtZSgpOwogCiAgICAgICAgICAgICAgICAgICAgIHN0YXRlLl9mc3AtLTsKQEAgLTY2OTMsMjAgKzc4ODcsMjAgQEAKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICBjYXNlIDMgOgotICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNDk3OjQ6ICggKGx2X2ltcG9ydGVkTmFtZXNwYWNlXzhfMD0gcnVsZVF1YWxpZmllZE5hbWVXaXRoV2lsZGNhcmQgKSApCisgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI5MzY6NDogKCAobHZfaW1wb3J0ZWROYW1lc3BhY2VfOF8wPSBydWxlUXVhbGlmaWVkTmFtZVdpdGhXaWxkY2FyZCApICkKICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNDk3OjQ6ICggKGx2X2ltcG9ydGVkTmFtZXNwYWNlXzhfMD0gcnVsZVF1YWxpZmllZE5hbWVXaXRoV2lsZGNhcmQgKSApCi0gICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI0OTg6NTogKGx2X2ltcG9ydGVkTmFtZXNwYWNlXzhfMD0gcnVsZVF1YWxpZmllZE5hbWVXaXRoV2lsZGNhcmQgKQorICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyOTM2OjQ6ICggKGx2X2ltcG9ydGVkTmFtZXNwYWNlXzhfMD0gcnVsZVF1YWxpZmllZE5hbWVXaXRoV2lsZGNhcmQgKSApCisgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI5Mzc6NTogKGx2X2ltcG9ydGVkTmFtZXNwYWNlXzhfMD0gcnVsZVF1YWxpZmllZE5hbWVXaXRoV2lsZGNhcmQgKQogICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI0OTg6NTogKGx2X2ltcG9ydGVkTmFtZXNwYWNlXzhfMD0gcnVsZVF1YWxpZmllZE5hbWVXaXRoV2lsZGNhcmQgKQotICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNDk5OjY6IGx2X2ltcG9ydGVkTmFtZXNwYWNlXzhfMD0gcnVsZVF1YWxpZmllZE5hbWVXaXRoV2lsZGNhcmQKKyAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjkzNzo1OiAobHZfaW1wb3J0ZWROYW1lc3BhY2VfOF8wPSBydWxlUXVhbGlmaWVkTmFtZVdpdGhXaWxkY2FyZCApCisgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI5Mzg6NjogbHZfaW1wb3J0ZWROYW1lc3BhY2VfOF8wPSBydWxlUXVhbGlmaWVkTmFtZVdpdGhXaWxkY2FyZAogICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogCiAgICAgICAgICAgICAgICAgICAgICAgCQkJCQkJbmV3Q29tcG9zaXRlTm9kZShncmFtbWFyQWNjZXNzLmdldFhJbXBvcnREZWNsYXJhdGlvbkFjY2VzcygpLmdldEltcG9ydGVkTmFtZXNwYWNlUXVhbGlmaWVkTmFtZVdpdGhXaWxkY2FyZFBhcnNlclJ1bGVDYWxsXzJfMl8wKCkpOwogICAgICAgICAgICAgICAgICAgICAgIAkJCQkJCiAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfNTgpOworICAgICAgICAgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV183Mik7CiAgICAgICAgICAgICAgICAgICAgIGx2X2ltcG9ydGVkTmFtZXNwYWNlXzhfMD1ydWxlUXVhbGlmaWVkTmFtZVdpdGhXaWxkY2FyZCgpOwogCiAgICAgICAgICAgICAgICAgICAgIHN0YXRlLl9mc3AtLTsKQEAgLTY3MzQsMTggKzc5MjgsMTggQEAKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICBjYXNlIDQgOgotICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNTE3OjQ6ICggKCAobHZfZnFuSW1wb3J0XzlfMD0gJ25zJyApICkgKCAobHZfaW1wb3J0ZWRGdWxseVF1YWxpZmllZE5hbWVfMTBfMD0gcnVsZVF1YWxpZmllZE5hbWUgKSApICkKKyAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6Mjk1Njo0OiAoICggKGx2X2ZxbkltcG9ydF85XzA9ICducycgKSApICggKGx2X2ltcG9ydGVkRnVsbHlRdWFsaWZpZWROYW1lXzEwXzA9IHJ1bGVRdWFsaWZpZWROYW1lICkgKSApCiAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjUxNzo0OiAoICggKGx2X2ZxbkltcG9ydF85XzA9ICducycgKSApICggKGx2X2ltcG9ydGVkRnVsbHlRdWFsaWZpZWROYW1lXzEwXzA9IHJ1bGVRdWFsaWZpZWROYW1lICkgKSApCi0gICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI1MTg6NTogKCAobHZfZnFuSW1wb3J0XzlfMD0gJ25zJyApICkgKCAobHZfaW1wb3J0ZWRGdWxseVF1YWxpZmllZE5hbWVfMTBfMD0gcnVsZVF1YWxpZmllZE5hbWUgKSApCisgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI5NTY6NDogKCAoIChsdl9mcW5JbXBvcnRfOV8wPSAnbnMnICkgKSAoIChsdl9pbXBvcnRlZEZ1bGx5UXVhbGlmaWVkTmFtZV8xMF8wPSBydWxlUXVhbGlmaWVkTmFtZSApICkgKQorICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyOTU3OjU6ICggKGx2X2ZxbkltcG9ydF85XzA9ICducycgKSApICggKGx2X2ltcG9ydGVkRnVsbHlRdWFsaWZpZWROYW1lXzEwXzA9IHJ1bGVRdWFsaWZpZWROYW1lICkgKQogICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI1MTg6NTogKCAobHZfZnFuSW1wb3J0XzlfMD0gJ25zJyApICkKLSAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjUxOTo2OiAobHZfZnFuSW1wb3J0XzlfMD0gJ25zJyApCisgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI5NTc6NTogKCAobHZfZnFuSW1wb3J0XzlfMD0gJ25zJyApICkKKyAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6Mjk1ODo2OiAobHZfZnFuSW1wb3J0XzlfMD0gJ25zJyApCiAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjUxOTo2OiAobHZfZnFuSW1wb3J0XzlfMD0gJ25zJyApCi0gICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI1MjA6NzogbHZfZnFuSW1wb3J0XzlfMD0gJ25zJworICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyOTU4OjY6IChsdl9mcW5JbXBvcnRfOV8wPSAnbnMnICkKKyAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6Mjk1OTo3OiBsdl9mcW5JbXBvcnRfOV8wPSAnbnMnCiAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgbHZfZnFuSW1wb3J0XzlfMD0oVG9rZW4pbWF0Y2goaW5wdXQsNzEsRk9MTE9XXzQpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gY3VycmVudDsKKyAgICAgICAgICAgICAgICAgICAgbHZfZnFuSW1wb3J0XzlfMD0oVG9rZW4pbWF0Y2goaW5wdXQsNzgsRk9MTE9XXzQpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gY3VycmVudDsKICAgICAgICAgICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAKICAgICAgICAgICAgICAgICAgICAgICAJCQkJCQkJbmV3TGVhZk5vZGUobHZfZnFuSW1wb3J0XzlfMCwgZ3JhbW1hckFjY2Vzcy5nZXRYSW1wb3J0RGVjbGFyYXRpb25BY2Nlc3MoKS5nZXRGcW5JbXBvcnROc0tleXdvcmRfMl8zXzBfMCgpKTsKQEAgLTY3NjUsMTggKzc5NTksMTggQEAKIAogICAgICAgICAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjUzMjo1OiAoIChsdl9pbXBvcnRlZEZ1bGx5UXVhbGlmaWVkTmFtZV8xMF8wPSBydWxlUXVhbGlmaWVkTmFtZSApICkKLSAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjUzMzo2OiAobHZfaW1wb3J0ZWRGdWxseVF1YWxpZmllZE5hbWVfMTBfMD0gcnVsZVF1YWxpZmllZE5hbWUgKQorICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyOTcxOjU6ICggKGx2X2ltcG9ydGVkRnVsbHlRdWFsaWZpZWROYW1lXzEwXzA9IHJ1bGVRdWFsaWZpZWROYW1lICkgKQorICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyOTcyOjY6IChsdl9pbXBvcnRlZEZ1bGx5UXVhbGlmaWVkTmFtZV8xMF8wPSBydWxlUXVhbGlmaWVkTmFtZSApCiAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjUzMzo2OiAobHZfaW1wb3J0ZWRGdWxseVF1YWxpZmllZE5hbWVfMTBfMD0gcnVsZVF1YWxpZmllZE5hbWUgKQotICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNTM0Ojc6IGx2X2ltcG9ydGVkRnVsbHlRdWFsaWZpZWROYW1lXzEwXzA9IHJ1bGVRdWFsaWZpZWROYW1lCisgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI5NzI6NjogKGx2X2ltcG9ydGVkRnVsbHlRdWFsaWZpZWROYW1lXzEwXzA9IHJ1bGVRdWFsaWZpZWROYW1lICkKKyAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6Mjk3Mzo3OiBsdl9pbXBvcnRlZEZ1bGx5UXVhbGlmaWVkTmFtZV8xMF8wPSBydWxlUXVhbGlmaWVkTmFtZQogICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogCiAgICAgICAgICAgICAgICAgICAgICAgCQkJCQkJCW5ld0NvbXBvc2l0ZU5vZGUoZ3JhbW1hckFjY2Vzcy5nZXRYSW1wb3J0RGVjbGFyYXRpb25BY2Nlc3MoKS5nZXRJbXBvcnRlZEZ1bGx5UXVhbGlmaWVkTmFtZVF1YWxpZmllZE5hbWVQYXJzZXJSdWxlQ2FsbF8yXzNfMV8wKCkpOwogICAgICAgICAgICAgICAgICAgICAgIAkJCQkJCQogICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzU4KTsKKyAgICAgICAgICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfNzIpOwogICAgICAgICAgICAgICAgICAgICBsdl9pbXBvcnRlZEZ1bGx5UXVhbGlmaWVkTmFtZV8xMF8wPXJ1bGVRdWFsaWZpZWROYW1lKCk7CiAKICAgICAgICAgICAgICAgICAgICAgc3RhdGUuX2ZzcC0tOwpAQCAtNjgwOSwxOCArODAwMywxOCBAQAogCiAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI1NTM6MzogKG90aGVybHZfMTE9ICc7JyApPwotICAgICAgICAgICAgaW50IGFsdDQyPTI7Ci0gICAgICAgICAgICBpbnQgTEE0Ml8wID0gaW5wdXQuTEEoMSk7CisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyOTkyOjM6IChvdGhlcmx2XzExPSAnOycgKT8KKyAgICAgICAgICAgIGludCBhbHQ1Mz0yOworICAgICAgICAgICAgaW50IExBNTNfMCA9IGlucHV0LkxBKDEpOwogCi0gICAgICAgICAgICBpZiAoIChMQTQyXzA9PTcyKSApIHsKLSAgICAgICAgICAgICAgICBhbHQ0Mj0xOworICAgICAgICAgICAgaWYgKCAoTEE1M18wPT03OSkgKSB7CisgICAgICAgICAgICAgICAgYWx0NTM9MTsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHN3aXRjaCAoYWx0NDIpIHsKKyAgICAgICAgICAgIHN3aXRjaCAoYWx0NTMpIHsKICAgICAgICAgICAgICAgICBjYXNlIDEgOgotICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNTU0OjQ6IG90aGVybHZfMTE9ICc7JworICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyOTkzOjQ6IG90aGVybHZfMTE9ICc7JwogICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIG90aGVybHZfMTE9KFRva2VuKW1hdGNoKGlucHV0LDcyLEZPTExPV18yKTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7CisgICAgICAgICAgICAgICAgICAgIG90aGVybHZfMTE9KFRva2VuKW1hdGNoKGlucHV0LDc5LEZPTExPV18yKTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7CiAgICAgICAgICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogCiAgICAgICAgICAgICAgICAgICAgICAgCQkJCW5ld0xlYWZOb2RlKG90aGVybHZfMTEsIGdyYW1tYXJBY2Nlc3MuZ2V0WEltcG9ydERlY2xhcmF0aW9uQWNjZXNzKCkuZ2V0U2VtaWNvbG9uS2V5d29yZF8zKCkpOwpAQCAtNjg1Nyw3ICs4MDUxLDcgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJlbnRyeVJ1bGVYQW5ub3RhdGlvbiIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNTYzOjE6IGVudHJ5UnVsZVhBbm5vdGF0aW9uIHJldHVybnMgW0VPYmplY3QgY3VycmVudD1udWxsXSA6IGl2X3J1bGVYQW5ub3RhdGlvbj0gcnVsZVhBbm5vdGF0aW9uIEVPRiA7CisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MzAwMjoxOiBlbnRyeVJ1bGVYQW5ub3RhdGlvbiByZXR1cm5zIFtFT2JqZWN0IGN1cnJlbnQ9bnVsbF0gOiBpdl9ydWxlWEFubm90YXRpb249IHJ1bGVYQW5ub3RhdGlvbiBFT0YgOwogICAgIHB1YmxpYyBmaW5hbCBFT2JqZWN0IGVudHJ5UnVsZVhBbm5vdGF0aW9uKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKICAgICAgICAgRU9iamVjdCBjdXJyZW50ID0gbnVsbDsKIApAQCAtNjg2NSw4ICs4MDU5LDggQEAKIAogCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNTYzOjUyOiAoaXZfcnVsZVhBbm5vdGF0aW9uPSBydWxlWEFubm90YXRpb24gRU9GICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI1NjQ6MjogaXZfcnVsZVhBbm5vdGF0aW9uPSBydWxlWEFubm90YXRpb24gRU9GCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzozMDAyOjUyOiAoaXZfcnVsZVhBbm5vdGF0aW9uPSBydWxlWEFubm90YXRpb24gRU9GICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjMwMDM6MjogaXZfcnVsZVhBbm5vdGF0aW9uPSBydWxlWEFubm90YXRpb24gRU9GCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIG5ld0NvbXBvc2l0ZU5vZGUoZ3JhbW1hckFjY2Vzcy5nZXRYQW5ub3RhdGlvblJ1bGUoKSk7IApAQCAtNjg5Nyw3ICs4MDkxLDcgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlWEFubm90YXRpb24iCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjU3MDoxOiBydWxlWEFubm90YXRpb24gcmV0dXJucyBbRU9iamVjdCBjdXJyZW50PW51bGxdIDogKCAoKSBvdGhlcmx2XzE9ICdAJyAoICggcnVsZVF1YWxpZmllZE5hbWUgKSApICggKCAoICcoJyApPT5vdGhlcmx2XzM9ICcoJyApICggKCAoICggKCAoICggcnVsZVZhbGlkSUQgKSApICc9JyApICk9PiAobHZfZWxlbWVudFZhbHVlUGFpcnNfNF8wPSBydWxlWEFubm90YXRpb25FbGVtZW50VmFsdWVQYWlyICkgKSAob3RoZXJsdl81PSAnLCcgKCAoICggKCAoIHJ1bGVWYWxpZElEICkgKSAnPScgKSApPT4gKGx2X2VsZW1lbnRWYWx1ZVBhaXJzXzZfMD0gcnVsZVhBbm5vdGF0aW9uRWxlbWVudFZhbHVlUGFpciApICkgKSogKSB8ICggKGx2X3ZhbHVlXzdfMD0gcnVsZVhBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3QgKSApICk/IG90aGVybHZfOD0gJyknICk/ICkgOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjMwMDk6MTogcnVsZVhBbm5vdGF0aW9uIHJldHVybnMgW0VPYmplY3QgY3VycmVudD1udWxsXSA6ICggKCkgb3RoZXJsdl8xPSAnQCcgKCAoIHJ1bGVRdWFsaWZpZWROYW1lICkgKSAoICggKCAnKCcgKT0+b3RoZXJsdl8zPSAnKCcgKSAoICggKCAoICggKCAoIHJ1bGVWYWxpZElEICkgKSAnPScgKSApPT4gKGx2X2VsZW1lbnRWYWx1ZVBhaXJzXzRfMD0gcnVsZVhBbm5vdGF0aW9uRWxlbWVudFZhbHVlUGFpciApICkgKG90aGVybHZfNT0gJywnICggKCAoICggKCBydWxlVmFsaWRJRCApICkgJz0nICkgKT0+IChsdl9lbGVtZW50VmFsdWVQYWlyc182XzA9IHJ1bGVYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZVBhaXIgKSApICkqICkgfCAoIChsdl92YWx1ZV83XzA9IHJ1bGVYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0ICkgKSApPyBvdGhlcmx2Xzg9ICcpJyApPyApIDsKICAgICBwdWJsaWMgZmluYWwgRU9iamVjdCBydWxlWEFubm90YXRpb24oKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogICAgICAgICBFT2JqZWN0IGN1cnJlbnQgPSBudWxsOwogCkBAIC02OTE2LDE0ICs4MTEwLDE0IEBACiAgICAgICAgIAllbnRlclJ1bGUoKTsKIAogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjU3NjoyOiAoICggKCkgb3RoZXJsdl8xPSAnQCcgKCAoIHJ1bGVRdWFsaWZpZWROYW1lICkgKSAoICggKCAnKCcgKT0+b3RoZXJsdl8zPSAnKCcgKSAoICggKCAoICggKCAoIHJ1bGVWYWxpZElEICkgKSAnPScgKSApPT4gKGx2X2VsZW1lbnRWYWx1ZVBhaXJzXzRfMD0gcnVsZVhBbm5vdGF0aW9uRWxlbWVudFZhbHVlUGFpciApICkgKG90aGVybHZfNT0gJywnICggKCAoICggKCBydWxlVmFsaWRJRCApICkgJz0nICkgKT0+IChsdl9lbGVtZW50VmFsdWVQYWlyc182XzA9IHJ1bGVYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZVBhaXIgKSApICkqICkgfCAoIChsdl92YWx1ZV83XzA9IHJ1bGVYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0ICkgKSApPyBvdGhlcmx2Xzg9ICcpJyApPyApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI1Nzc6MjogKCAoKSBvdGhlcmx2XzE9ICdAJyAoICggcnVsZVF1YWxpZmllZE5hbWUgKSApICggKCAoICcoJyApPT5vdGhlcmx2XzM9ICcoJyApICggKCAoICggKCAoICggcnVsZVZhbGlkSUQgKSApICc9JyApICk9PiAobHZfZWxlbWVudFZhbHVlUGFpcnNfNF8wPSBydWxlWEFubm90YXRpb25FbGVtZW50VmFsdWVQYWlyICkgKSAob3RoZXJsdl81PSAnLCcgKCAoICggKCAoIHJ1bGVWYWxpZElEICkgKSAnPScgKSApPT4gKGx2X2VsZW1lbnRWYWx1ZVBhaXJzXzZfMD0gcnVsZVhBbm5vdGF0aW9uRWxlbWVudFZhbHVlUGFpciApICkgKSogKSB8ICggKGx2X3ZhbHVlXzdfMD0gcnVsZVhBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3QgKSApICk/IG90aGVybHZfOD0gJyknICk/ICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjMwMTU6MjogKCAoICgpIG90aGVybHZfMT0gJ0AnICggKCBydWxlUXVhbGlmaWVkTmFtZSApICkgKCAoICggJygnICk9Pm90aGVybHZfMz0gJygnICkgKCAoICggKCAoICggKCBydWxlVmFsaWRJRCApICkgJz0nICkgKT0+IChsdl9lbGVtZW50VmFsdWVQYWlyc180XzA9IHJ1bGVYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZVBhaXIgKSApIChvdGhlcmx2XzU9ICcsJyAoICggKCAoICggcnVsZVZhbGlkSUQgKSApICc9JyApICk9PiAobHZfZWxlbWVudFZhbHVlUGFpcnNfNl8wPSBydWxlWEFubm90YXRpb25FbGVtZW50VmFsdWVQYWlyICkgKSApKiApIHwgKCAobHZfdmFsdWVfN18wPSBydWxlWEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdCApICkgKT8gb3RoZXJsdl84PSAnKScgKT8gKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzozMDE2OjI6ICggKCkgb3RoZXJsdl8xPSAnQCcgKCAoIHJ1bGVRdWFsaWZpZWROYW1lICkgKSAoICggKCAnKCcgKT0+b3RoZXJsdl8zPSAnKCcgKSAoICggKCAoICggKCAoIHJ1bGVWYWxpZElEICkgKSAnPScgKSApPT4gKGx2X2VsZW1lbnRWYWx1ZVBhaXJzXzRfMD0gcnVsZVhBbm5vdGF0aW9uRWxlbWVudFZhbHVlUGFpciApICkgKG90aGVybHZfNT0gJywnICggKCAoICggKCBydWxlVmFsaWRJRCApICkgJz0nICkgKT0+IChsdl9lbGVtZW50VmFsdWVQYWlyc182XzA9IHJ1bGVYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZVBhaXIgKSApICkqICkgfCAoIChsdl92YWx1ZV83XzA9IHJ1bGVYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0ICkgKSApPyBvdGhlcmx2Xzg9ICcpJyApPyApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNTc3OjI6ICggKCkgb3RoZXJsdl8xPSAnQCcgKCAoIHJ1bGVRdWFsaWZpZWROYW1lICkgKSAoICggKCAnKCcgKT0+b3RoZXJsdl8zPSAnKCcgKSAoICggKCAoICggKCAoIHJ1bGVWYWxpZElEICkgKSAnPScgKSApPT4gKGx2X2VsZW1lbnRWYWx1ZVBhaXJzXzRfMD0gcnVsZVhBbm5vdGF0aW9uRWxlbWVudFZhbHVlUGFpciApICkgKG90aGVybHZfNT0gJywnICggKCAoICggKCBydWxlVmFsaWRJRCApICkgJz0nICkgKT0+IChsdl9lbGVtZW50VmFsdWVQYWlyc182XzA9IHJ1bGVYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZVBhaXIgKSApICkqICkgfCAoIChsdl92YWx1ZV83XzA9IHJ1bGVYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0ICkgKSApPyBvdGhlcmx2Xzg9ICcpJyApPyApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNTc4OjM6ICgpIG90aGVybHZfMT0gJ0AnICggKCBydWxlUXVhbGlmaWVkTmFtZSApICkgKCAoICggJygnICk9Pm90aGVybHZfMz0gJygnICkgKCAoICggKCAoICggKCBydWxlVmFsaWRJRCApICkgJz0nICkgKT0+IChsdl9lbGVtZW50VmFsdWVQYWlyc180XzA9IHJ1bGVYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZVBhaXIgKSApIChvdGhlcmx2XzU9ICcsJyAoICggKCAoICggcnVsZVZhbGlkSUQgKSApICc9JyApICk9PiAobHZfZWxlbWVudFZhbHVlUGFpcnNfNl8wPSBydWxlWEFubm90YXRpb25FbGVtZW50VmFsdWVQYWlyICkgKSApKiApIHwgKCAobHZfdmFsdWVfN18wPSBydWxlWEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdCApICkgKT8gb3RoZXJsdl84PSAnKScgKT8KKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjMwMTY6MjogKCAoKSBvdGhlcmx2XzE9ICdAJyAoICggcnVsZVF1YWxpZmllZE5hbWUgKSApICggKCAoICcoJyApPT5vdGhlcmx2XzM9ICcoJyApICggKCAoICggKCAoICggcnVsZVZhbGlkSUQgKSApICc9JyApICk9PiAobHZfZWxlbWVudFZhbHVlUGFpcnNfNF8wPSBydWxlWEFubm90YXRpb25FbGVtZW50VmFsdWVQYWlyICkgKSAob3RoZXJsdl81PSAnLCcgKCAoICggKCAoIHJ1bGVWYWxpZElEICkgKSAnPScgKSApPT4gKGx2X2VsZW1lbnRWYWx1ZVBhaXJzXzZfMD0gcnVsZVhBbm5vdGF0aW9uRWxlbWVudFZhbHVlUGFpciApICkgKSogKSB8ICggKGx2X3ZhbHVlXzdfMD0gcnVsZVhBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3QgKSApICk/IG90aGVybHZfOD0gJyknICk/ICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjMwMTc6MzogKCkgb3RoZXJsdl8xPSAnQCcgKCAoIHJ1bGVRdWFsaWZpZWROYW1lICkgKSAoICggKCAnKCcgKT0+b3RoZXJsdl8zPSAnKCcgKSAoICggKCAoICggKCAoIHJ1bGVWYWxpZElEICkgKSAnPScgKSApPT4gKGx2X2VsZW1lbnRWYWx1ZVBhaXJzXzRfMD0gcnVsZVhBbm5vdGF0aW9uRWxlbWVudFZhbHVlUGFpciApICkgKG90aGVybHZfNT0gJywnICggKCAoICggKCBydWxlVmFsaWRJRCApICkgJz0nICkgKT0+IChsdl9lbGVtZW50VmFsdWVQYWlyc182XzA9IHJ1bGVYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZVBhaXIgKSApICkqICkgfCAoIChsdl92YWx1ZV83XzA9IHJ1bGVYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0ICkgKSApPyBvdGhlcmx2Xzg9ICcpJyApPwogICAgICAgICAgICAgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjU3ODozOiAoKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjU3OTo0OiAKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjMwMTc6MzogKCkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjMwMTg6NDogCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKIApAQCAtNjkzNSwxNyArODEyOSwxNyBAQAogCiAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgIG90aGVybHZfMT0oVG9rZW4pbWF0Y2goaW5wdXQsNzMsRk9MTE9XXzQpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gY3VycmVudDsKKyAgICAgICAgICAgIG90aGVybHZfMT0oVG9rZW4pbWF0Y2goaW5wdXQsODAsRk9MTE9XXzQpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gY3VycmVudDsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogCiAgICAgICAgICAgICAgIAkJCW5ld0xlYWZOb2RlKG90aGVybHZfMSwgZ3JhbW1hckFjY2Vzcy5nZXRYQW5ub3RhdGlvbkFjY2VzcygpLmdldENvbW1lcmNpYWxBdEtleXdvcmRfMSgpKTsKICAgICAgICAgICAgICAgCQkKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI1ODk6MzogKCAoIHJ1bGVRdWFsaWZpZWROYW1lICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjU5MDo0OiAoIHJ1bGVRdWFsaWZpZWROYW1lICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjMwMjg6MzogKCAoIHJ1bGVRdWFsaWZpZWROYW1lICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MzAyOTo0OiAoIHJ1bGVRdWFsaWZpZWROYW1lICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI1OTA6NDogKCBydWxlUXVhbGlmaWVkTmFtZSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNTkxOjU6IHJ1bGVRdWFsaWZpZWROYW1lCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzozMDI5OjQ6ICggcnVsZVF1YWxpZmllZE5hbWUgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MzAzMDo1OiBydWxlUXVhbGlmaWVkTmFtZQogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAKQEAgLTY5NTksNyArODE1Myw3IEBACiAgICAgICAgICAgICAgIAkJCQkJbmV3Q29tcG9zaXRlTm9kZShncmFtbWFyQWNjZXNzLmdldFhBbm5vdGF0aW9uQWNjZXNzKCkuZ2V0QW5ub3RhdGlvblR5cGVKdm1Bbm5vdGF0aW9uVHlwZUNyb3NzUmVmZXJlbmNlXzJfMCgpKTsKICAgICAgICAgICAgICAgCQkJCQogICAgICAgICAgICAgfQotICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfNTkpOworICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfNzMpOwogICAgICAgICAgICAgcnVsZVF1YWxpZmllZE5hbWUoKTsKIAogICAgICAgICAgICAgc3RhdGUuX2ZzcC0tOwpAQCAtNjk3NSwyMSArODE2OSwyMSBAQAogCiAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI2MDU6MzogKCAoICggJygnICk9Pm90aGVybHZfMz0gJygnICkgKCAoICggKCAoICggKCBydWxlVmFsaWRJRCApICkgJz0nICkgKT0+IChsdl9lbGVtZW50VmFsdWVQYWlyc180XzA9IHJ1bGVYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZVBhaXIgKSApIChvdGhlcmx2XzU9ICcsJyAoICggKCAoICggcnVsZVZhbGlkSUQgKSApICc9JyApICk9PiAobHZfZWxlbWVudFZhbHVlUGFpcnNfNl8wPSBydWxlWEFubm90YXRpb25FbGVtZW50VmFsdWVQYWlyICkgKSApKiApIHwgKCAobHZfdmFsdWVfN18wPSBydWxlWEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdCApICkgKT8gb3RoZXJsdl84PSAnKScgKT8KLSAgICAgICAgICAgIGludCBhbHQ0NT0yOwotICAgICAgICAgICAgaW50IExBNDVfMCA9IGlucHV0LkxBKDEpOworICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MzA0NDozOiAoICggKCAnKCcgKT0+b3RoZXJsdl8zPSAnKCcgKSAoICggKCAoICggKCAoIHJ1bGVWYWxpZElEICkgKSAnPScgKSApPT4gKGx2X2VsZW1lbnRWYWx1ZVBhaXJzXzRfMD0gcnVsZVhBbm5vdGF0aW9uRWxlbWVudFZhbHVlUGFpciApICkgKG90aGVybHZfNT0gJywnICggKCAoICggKCBydWxlVmFsaWRJRCApICkgJz0nICkgKT0+IChsdl9lbGVtZW50VmFsdWVQYWlyc182XzA9IHJ1bGVYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZVBhaXIgKSApICkqICkgfCAoIChsdl92YWx1ZV83XzA9IHJ1bGVYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0ICkgKSApPyBvdGhlcmx2Xzg9ICcpJyApPworICAgICAgICAgICAgaW50IGFsdDU2PTI7CisgICAgICAgICAgICBpbnQgTEE1Nl8wID0gaW5wdXQuTEEoMSk7CiAKLSAgICAgICAgICAgIGlmICggKExBNDVfMD09NzQpICYmIChzeW5wcmVkMV9JbnRlcm5hbERhdGFEU0woKSkpIHsKLSAgICAgICAgICAgICAgICBhbHQ0NT0xOworICAgICAgICAgICAgaWYgKCAoTEE1Nl8wPT04MSkgJiYgKHN5bnByZWQxX0ludGVybmFsRGF0YURTTCgpKSkgeworICAgICAgICAgICAgICAgIGFsdDU2PTE7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBzd2l0Y2ggKGFsdDQ1KSB7CisgICAgICAgICAgICBzd2l0Y2ggKGFsdDU2KSB7CiAgICAgICAgICAgICAgICAgY2FzZSAxIDoKLSAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjYwNjo0OiAoICggJygnICk9Pm90aGVybHZfMz0gJygnICkgKCAoICggKCAoICggKCBydWxlVmFsaWRJRCApICkgJz0nICkgKT0+IChsdl9lbGVtZW50VmFsdWVQYWlyc180XzA9IHJ1bGVYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZVBhaXIgKSApIChvdGhlcmx2XzU9ICcsJyAoICggKCAoICggcnVsZVZhbGlkSUQgKSApICc9JyApICk9PiAobHZfZWxlbWVudFZhbHVlUGFpcnNfNl8wPSBydWxlWEFubm90YXRpb25FbGVtZW50VmFsdWVQYWlyICkgKSApKiApIHwgKCAobHZfdmFsdWVfN18wPSBydWxlWEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdCApICkgKT8gb3RoZXJsdl84PSAnKScKKyAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MzA0NTo0OiAoICggJygnICk9Pm90aGVybHZfMz0gJygnICkgKCAoICggKCAoICggKCBydWxlVmFsaWRJRCApICkgJz0nICkgKT0+IChsdl9lbGVtZW50VmFsdWVQYWlyc180XzA9IHJ1bGVYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZVBhaXIgKSApIChvdGhlcmx2XzU9ICcsJyAoICggKCAoICggcnVsZVZhbGlkSUQgKSApICc9JyApICk9PiAobHZfZWxlbWVudFZhbHVlUGFpcnNfNl8wPSBydWxlWEFubm90YXRpb25FbGVtZW50VmFsdWVQYWlyICkgKSApKiApIHwgKCAobHZfdmFsdWVfN18wPSBydWxlWEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdCApICkgKT8gb3RoZXJsdl84PSAnKScKICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNjA2OjQ6ICggKCAnKCcgKT0+b3RoZXJsdl8zPSAnKCcgKQotICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNjA3OjU6ICggJygnICk9Pm90aGVybHZfMz0gJygnCisgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjMwNDU6NDogKCAoICcoJyApPT5vdGhlcmx2XzM9ICcoJyApCisgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjMwNDY6NTogKCAnKCcgKT0+b3RoZXJsdl8zPSAnKCcKICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBvdGhlcmx2XzM9KFRva2VuKW1hdGNoKGlucHV0LDc0LEZPTExPV182MCk7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OworICAgICAgICAgICAgICAgICAgICBvdGhlcmx2XzM9KFRva2VuKW1hdGNoKGlucHV0LDgxLEZPTExPV183NCk7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OwogICAgICAgICAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKIAogICAgICAgICAgICAgICAgICAgICAgIAkJCQkJbmV3TGVhZk5vZGUob3RoZXJsdl8zLCBncmFtbWFyQWNjZXNzLmdldFhBbm5vdGF0aW9uQWNjZXNzKCkuZ2V0TGVmdFBhcmVudGhlc2lzS2V5d29yZF8zXzAoKSk7CkBAIC02OTk4LDI4ICs4MTkyLDI4IEBACiAKICAgICAgICAgICAgICAgICAgICAgfQogCi0gICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI2MTM6NDogKCAoICggKCAoICggKCBydWxlVmFsaWRJRCApICkgJz0nICkgKT0+IChsdl9lbGVtZW50VmFsdWVQYWlyc180XzA9IHJ1bGVYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZVBhaXIgKSApIChvdGhlcmx2XzU9ICcsJyAoICggKCAoICggcnVsZVZhbGlkSUQgKSApICc9JyApICk9PiAobHZfZWxlbWVudFZhbHVlUGFpcnNfNl8wPSBydWxlWEFubm90YXRpb25FbGVtZW50VmFsdWVQYWlyICkgKSApKiApIHwgKCAobHZfdmFsdWVfN18wPSBydWxlWEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdCApICkgKT8KLSAgICAgICAgICAgICAgICAgICAgaW50IGFsdDQ0PTM7Ci0gICAgICAgICAgICAgICAgICAgIGFsdDQ0ID0gZGZhNDQucHJlZGljdChpbnB1dCk7Ci0gICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoYWx0NDQpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MzA1Mjo0OiAoICggKCAoICggKCAoIHJ1bGVWYWxpZElEICkgKSAnPScgKSApPT4gKGx2X2VsZW1lbnRWYWx1ZVBhaXJzXzRfMD0gcnVsZVhBbm5vdGF0aW9uRWxlbWVudFZhbHVlUGFpciApICkgKG90aGVybHZfNT0gJywnICggKCAoICggKCBydWxlVmFsaWRJRCApICkgJz0nICkgKT0+IChsdl9lbGVtZW50VmFsdWVQYWlyc182XzA9IHJ1bGVYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZVBhaXIgKSApICkqICkgfCAoIChsdl92YWx1ZV83XzA9IHJ1bGVYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0ICkgKSApPworICAgICAgICAgICAgICAgICAgICBpbnQgYWx0NTU9MzsKKyAgICAgICAgICAgICAgICAgICAgYWx0NTUgPSBkZmE1NS5wcmVkaWN0KGlucHV0KTsKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChhbHQ1NSkgewogICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxIDoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNjE0OjU6ICggKCAoICggKCAoIHJ1bGVWYWxpZElEICkgKSAnPScgKSApPT4gKGx2X2VsZW1lbnRWYWx1ZVBhaXJzXzRfMD0gcnVsZVhBbm5vdGF0aW9uRWxlbWVudFZhbHVlUGFpciApICkgKG90aGVybHZfNT0gJywnICggKCAoICggKCBydWxlVmFsaWRJRCApICkgJz0nICkgKT0+IChsdl9lbGVtZW50VmFsdWVQYWlyc182XzA9IHJ1bGVYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZVBhaXIgKSApICkqICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzozMDUzOjU6ICggKCAoICggKCAoIHJ1bGVWYWxpZElEICkgKSAnPScgKSApPT4gKGx2X2VsZW1lbnRWYWx1ZVBhaXJzXzRfMD0gcnVsZVhBbm5vdGF0aW9uRWxlbWVudFZhbHVlUGFpciApICkgKG90aGVybHZfNT0gJywnICggKCAoICggKCBydWxlVmFsaWRJRCApICkgJz0nICkgKT0+IChsdl9lbGVtZW50VmFsdWVQYWlyc182XzA9IHJ1bGVYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZVBhaXIgKSApICkqICkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjYxNDo1OiAoICggKCAoICggKCBydWxlVmFsaWRJRCApICkgJz0nICkgKT0+IChsdl9lbGVtZW50VmFsdWVQYWlyc180XzA9IHJ1bGVYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZVBhaXIgKSApIChvdGhlcmx2XzU9ICcsJyAoICggKCAoICggcnVsZVZhbGlkSUQgKSApICc9JyApICk9PiAobHZfZWxlbWVudFZhbHVlUGFpcnNfNl8wPSBydWxlWEFubm90YXRpb25FbGVtZW50VmFsdWVQYWlyICkgKSApKiApCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjYxNTo2OiAoICggKCAoICggcnVsZVZhbGlkSUQgKSApICc9JyApICk9PiAobHZfZWxlbWVudFZhbHVlUGFpcnNfNF8wPSBydWxlWEFubm90YXRpb25FbGVtZW50VmFsdWVQYWlyICkgKSAob3RoZXJsdl81PSAnLCcgKCAoICggKCAoIHJ1bGVWYWxpZElEICkgKSAnPScgKSApPT4gKGx2X2VsZW1lbnRWYWx1ZVBhaXJzXzZfMD0gcnVsZVhBbm5vdGF0aW9uRWxlbWVudFZhbHVlUGFpciApICkgKSoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzozMDUzOjU6ICggKCAoICggKCAoIHJ1bGVWYWxpZElEICkgKSAnPScgKSApPT4gKGx2X2VsZW1lbnRWYWx1ZVBhaXJzXzRfMD0gcnVsZVhBbm5vdGF0aW9uRWxlbWVudFZhbHVlUGFpciApICkgKG90aGVybHZfNT0gJywnICggKCAoICggKCBydWxlVmFsaWRJRCApICkgJz0nICkgKT0+IChsdl9lbGVtZW50VmFsdWVQYWlyc182XzA9IHJ1bGVYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZVBhaXIgKSApICkqICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzozMDU0OjY6ICggKCAoICggKCBydWxlVmFsaWRJRCApICkgJz0nICkgKT0+IChsdl9lbGVtZW50VmFsdWVQYWlyc180XzA9IHJ1bGVYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZVBhaXIgKSApIChvdGhlcmx2XzU9ICcsJyAoICggKCAoICggcnVsZVZhbGlkSUQgKSApICc9JyApICk9PiAobHZfZWxlbWVudFZhbHVlUGFpcnNfNl8wPSBydWxlWEFubm90YXRpb25FbGVtZW50VmFsdWVQYWlyICkgKSApKgogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNjE1OjY6ICggKCAoICggKCBydWxlVmFsaWRJRCApICkgJz0nICkgKT0+IChsdl9lbGVtZW50VmFsdWVQYWlyc180XzA9IHJ1bGVYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZVBhaXIgKSApCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjYxNjo3OiAoICggKCAoIHJ1bGVWYWxpZElEICkgKSAnPScgKSApPT4gKGx2X2VsZW1lbnRWYWx1ZVBhaXJzXzRfMD0gcnVsZVhBbm5vdGF0aW9uRWxlbWVudFZhbHVlUGFpciApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MzA1NDo2OiAoICggKCAoICggcnVsZVZhbGlkSUQgKSApICc9JyApICk9PiAobHZfZWxlbWVudFZhbHVlUGFpcnNfNF8wPSBydWxlWEFubm90YXRpb25FbGVtZW50VmFsdWVQYWlyICkgKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjMwNTU6NzogKCAoICggKCBydWxlVmFsaWRJRCApICkgJz0nICkgKT0+IChsdl9lbGVtZW50VmFsdWVQYWlyc180XzA9IHJ1bGVYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZVBhaXIgKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNjI1Ojc6IChsdl9lbGVtZW50VmFsdWVQYWlyc180XzA9IHJ1bGVYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZVBhaXIgKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI2MjY6ODogbHZfZWxlbWVudFZhbHVlUGFpcnNfNF8wPSBydWxlWEFubm90YXRpb25FbGVtZW50VmFsdWVQYWlyCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MzA2NDo3OiAobHZfZWxlbWVudFZhbHVlUGFpcnNfNF8wPSBydWxlWEFubm90YXRpb25FbGVtZW50VmFsdWVQYWlyICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzozMDY1Ojg6IGx2X2VsZW1lbnRWYWx1ZVBhaXJzXzRfMD0gcnVsZVhBbm5vdGF0aW9uRWxlbWVudFZhbHVlUGFpcgogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCQkJCQkJCQluZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0WEFubm90YXRpb25BY2Nlc3MoKS5nZXRFbGVtZW50VmFsdWVQYWlyc1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlUGFpclBhcnNlclJ1bGVDYWxsXzNfMV8wXzBfMCgpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAkJCQkJCQkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfNjEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzc1KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsdl9lbGVtZW50VmFsdWVQYWlyc180XzA9cnVsZVhBbm5vdGF0aW9uRWxlbWVudFZhbHVlUGFpcigpOwogCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGUuX2ZzcC0tOwpAQCAtNzA0MywzOSArODIzNywzOSBAQAogCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjY0Mzo2OiAob3RoZXJsdl81PSAnLCcgKCAoICggKCAoIHJ1bGVWYWxpZElEICkgKSAnPScgKSApPT4gKGx2X2VsZW1lbnRWYWx1ZVBhaXJzXzZfMD0gcnVsZVhBbm5vdGF0aW9uRWxlbWVudFZhbHVlUGFpciApICkgKSoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb29wNDM6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MzA4Mjo2OiAob3RoZXJsdl81PSAnLCcgKCAoICggKCAoIHJ1bGVWYWxpZElEICkgKSAnPScgKSApPT4gKGx2X2VsZW1lbnRWYWx1ZVBhaXJzXzZfMD0gcnVsZVhBbm5vdGF0aW9uRWxlbWVudFZhbHVlUGFpciApICkgKSoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb29wNTQ6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG8gewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYWx0NDM9MjsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IExBNDNfMCA9IGlucHV0LkxBKDEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYWx0NTQ9MjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IExBNTRfMCA9IGlucHV0LkxBKDEpOwogCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICggKExBNDNfMD09NzUpICkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWx0NDM9MTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCAoTEE1NF8wPT04MikgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbHQ1ND0xOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAKIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKGFsdDQzKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoYWx0NTQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAJY2FzZSAxIDoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAJICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI2NDQ6Nzogb3RoZXJsdl81PSAnLCcgKCAoICggKCAoIHJ1bGVWYWxpZElEICkgKSAnPScgKSApPT4gKGx2X2VsZW1lbnRWYWx1ZVBhaXJzXzZfMD0gcnVsZVhBbm5vdGF0aW9uRWxlbWVudFZhbHVlUGFpciApICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAJICAgIC8vIEludGVybmFsRGF0YURTTC5nOjMwODM6Nzogb3RoZXJsdl81PSAnLCcgKCAoICggKCAoIHJ1bGVWYWxpZElEICkgKSAnPScgKSApPT4gKGx2X2VsZW1lbnRWYWx1ZVBhaXJzXzZfMD0gcnVsZVhBbm5vdGF0aW9uRWxlbWVudFZhbHVlUGFpciApICkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAJICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAJICAgIG90aGVybHZfNT0oVG9rZW4pbWF0Y2goaW5wdXQsNzUsRk9MTE9XXzQpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gY3VycmVudDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAJICAgIG90aGVybHZfNT0oVG9rZW4pbWF0Y2goaW5wdXQsODIsRk9MTE9XXzQpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gY3VycmVudDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAJICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCSAgICAgIAkJCQkJCQluZXdMZWFmTm9kZShvdGhlcmx2XzUsIGdyYW1tYXJBY2Nlc3MuZ2V0WEFubm90YXRpb25BY2Nlc3MoKS5nZXRDb21tYUtleXdvcmRfM18xXzBfMV8wKCkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIAkgICAgICAJCQkJCQkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAJICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAJICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI2NDg6NzogKCAoICggKCAoIHJ1bGVWYWxpZElEICkgKSAnPScgKSApPT4gKGx2X2VsZW1lbnRWYWx1ZVBhaXJzXzZfMD0gcnVsZVhBbm5vdGF0aW9uRWxlbWVudFZhbHVlUGFpciApICkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAJICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI2NDk6ODogKCAoICggKCBydWxlVmFsaWRJRCApICkgJz0nICkgKT0+IChsdl9lbGVtZW50VmFsdWVQYWlyc182XzA9IHJ1bGVYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZVBhaXIgKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIAkgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MzA4Nzo3OiAoICggKCAoICggcnVsZVZhbGlkSUQgKSApICc9JyApICk9PiAobHZfZWxlbWVudFZhbHVlUGFpcnNfNl8wPSBydWxlWEFubm90YXRpb25FbGVtZW50VmFsdWVQYWlyICkgKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIAkgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MzA4ODo4OiAoICggKCAoIHJ1bGVWYWxpZElEICkgKSAnPScgKSApPT4gKGx2X2VsZW1lbnRWYWx1ZVBhaXJzXzZfMD0gcnVsZVhBbm5vdGF0aW9uRWxlbWVudFZhbHVlUGFpciApCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCSAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgCSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNjU4Ojg6IChsdl9lbGVtZW50VmFsdWVQYWlyc182XzA9IHJ1bGVYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZVBhaXIgKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIAkgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjY1OTo5OiBsdl9lbGVtZW50VmFsdWVQYWlyc182XzA9IHJ1bGVYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZVBhaXIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAJICAgIC8vIEludGVybmFsRGF0YURTTC5nOjMwOTc6ODogKGx2X2VsZW1lbnRWYWx1ZVBhaXJzXzZfMD0gcnVsZVhBbm5vdGF0aW9uRWxlbWVudFZhbHVlUGFpciApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgCSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzozMDk4Ojk6IGx2X2VsZW1lbnRWYWx1ZVBhaXJzXzZfMD0gcnVsZVhBbm5vdGF0aW9uRWxlbWVudFZhbHVlUGFpcgogICAgICAgICAgICAgICAgICAgICAgICAgICAgIAkgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgIAkgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAJICAgICAgCQkJCQkJCQkJbmV3Q29tcG9zaXRlTm9kZShncmFtbWFyQWNjZXNzLmdldFhBbm5vdGF0aW9uQWNjZXNzKCkuZ2V0RWxlbWVudFZhbHVlUGFpcnNYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZVBhaXJQYXJzZXJSdWxlQ2FsbF8zXzFfMF8xXzFfMCgpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAJICAgICAgCQkJCQkJCQkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAJICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAJICAgIHB1c2hGb2xsb3coRk9MTE9XXzYxKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAJICAgIHB1c2hGb2xsb3coRk9MTE9XXzc1KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAJICAgIGx2X2VsZW1lbnRWYWx1ZVBhaXJzXzZfMD1ydWxlWEFubm90YXRpb25FbGVtZW50VmFsdWVQYWlyKCk7CiAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAJICAgIHN0YXRlLl9mc3AtLTsKQEAgLTcxMDQsNyArODI5OCw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCSAgICBicmVhazsKIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIAlkZWZhdWx0IDoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAJICAgIGJyZWFrIGxvb3A0MzsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAJICAgIGJyZWFrIGxvb3A1NDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gd2hpbGUgKHRydWUpOwogCkBAIC03MTE1LDIwICs4MzA5LDIwIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAyIDoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNjc5OjU6ICggKGx2X3ZhbHVlXzdfMD0gcnVsZVhBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3QgKSApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MzExODo1OiAoIChsdl92YWx1ZV83XzA9IHJ1bGVYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0ICkgKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNjc5OjU6ICggKGx2X3ZhbHVlXzdfMD0gcnVsZVhBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3QgKSApCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjY4MDo2OiAobHZfdmFsdWVfN18wPSBydWxlWEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdCApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MzExODo1OiAoIChsdl92YWx1ZV83XzA9IHJ1bGVYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0ICkgKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjMxMTk6NjogKGx2X3ZhbHVlXzdfMD0gcnVsZVhBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3QgKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNjgwOjY6IChsdl92YWx1ZV83XzA9IHJ1bGVYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0ICkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNjgxOjc6IGx2X3ZhbHVlXzdfMD0gcnVsZVhBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3QKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzozMTE5OjY6IChsdl92YWx1ZV83XzA9IHJ1bGVYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0ICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzozMTIwOjc6IGx2X3ZhbHVlXzdfMD0gcnVsZVhBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3QKICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAkJCQkJCQluZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0WEFubm90YXRpb25BY2Nlc3MoKS5nZXRWYWx1ZVhBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RQYXJzZXJSdWxlQ2FsbF8zXzFfMV8wKCkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCQkJCQkJCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzYyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV183Nik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbHZfdmFsdWVfN18wPXJ1bGVYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0KCk7CiAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZS5fZnNwLS07CkBAIC03MTU4LDcgKzgzNTIsNyBAQAogCiAgICAgICAgICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgICAgICAgICBvdGhlcmx2Xzg9KFRva2VuKW1hdGNoKGlucHV0LDc2LEZPTExPV18yKTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7CisgICAgICAgICAgICAgICAgICAgIG90aGVybHZfOD0oVG9rZW4pbWF0Y2goaW5wdXQsODMsRk9MTE9XXzIpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gY3VycmVudDsKICAgICAgICAgICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAKICAgICAgICAgICAgICAgICAgICAgICAJCQkJbmV3TGVhZk5vZGUob3RoZXJsdl84LCBncmFtbWFyQWNjZXNzLmdldFhBbm5vdGF0aW9uQWNjZXNzKCkuZ2V0UmlnaHRQYXJlbnRoZXNpc0tleXdvcmRfM18yKCkpOwpAQCAtNzE5NSw3ICs4Mzg5LDcgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJlbnRyeVJ1bGVYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZVBhaXIiCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjcwODoxOiBlbnRyeVJ1bGVYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZVBhaXIgcmV0dXJucyBbRU9iamVjdCBjdXJyZW50PW51bGxdIDogaXZfcnVsZVhBbm5vdGF0aW9uRWxlbWVudFZhbHVlUGFpcj0gcnVsZVhBbm5vdGF0aW9uRWxlbWVudFZhbHVlUGFpciBFT0YgOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjMxNDc6MTogZW50cnlSdWxlWEFubm90YXRpb25FbGVtZW50VmFsdWVQYWlyIHJldHVybnMgW0VPYmplY3QgY3VycmVudD1udWxsXSA6IGl2X3J1bGVYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZVBhaXI9IHJ1bGVYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZVBhaXIgRU9GIDsKICAgICBwdWJsaWMgZmluYWwgRU9iamVjdCBlbnRyeVJ1bGVYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZVBhaXIoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogICAgICAgICBFT2JqZWN0IGN1cnJlbnQgPSBudWxsOwogCkBAIC03MjAzLDggKzgzOTcsOCBAQAogCiAKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI3MDg6Njg6IChpdl9ydWxlWEFubm90YXRpb25FbGVtZW50VmFsdWVQYWlyPSBydWxlWEFubm90YXRpb25FbGVtZW50VmFsdWVQYWlyIEVPRiApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNzA5OjI6IGl2X3J1bGVYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZVBhaXI9IHJ1bGVYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZVBhaXIgRU9GCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzozMTQ3OjY4OiAoaXZfcnVsZVhBbm5vdGF0aW9uRWxlbWVudFZhbHVlUGFpcj0gcnVsZVhBbm5vdGF0aW9uRWxlbWVudFZhbHVlUGFpciBFT0YgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MzE0ODoyOiBpdl9ydWxlWEFubm90YXRpb25FbGVtZW50VmFsdWVQYWlyPSBydWxlWEFubm90YXRpb25FbGVtZW50VmFsdWVQYWlyIEVPRgogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBuZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0WEFubm90YXRpb25FbGVtZW50VmFsdWVQYWlyUnVsZSgpKTsgCkBAIC03MjM1LDcgKzg0MjksNyBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZVBhaXIiCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjcxNToxOiBydWxlWEFubm90YXRpb25FbGVtZW50VmFsdWVQYWlyIHJldHVybnMgW0VPYmplY3QgY3VycmVudD1udWxsXSA6ICggKCAoICggKCAoIHJ1bGVWYWxpZElEICkgKSAnPScgKSApPT4gKCAoICggcnVsZVZhbGlkSUQgKSApIG90aGVybHZfMT0gJz0nICkgKSAoIChsdl92YWx1ZV8yXzA9IHJ1bGVYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZSApICkgKSA7CisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MzE1NDoxOiBydWxlWEFubm90YXRpb25FbGVtZW50VmFsdWVQYWlyIHJldHVybnMgW0VPYmplY3QgY3VycmVudD1udWxsXSA6ICggKCAoICggKCAoIHJ1bGVWYWxpZElEICkgKSAnPScgKSApPT4gKCAoICggcnVsZVZhbGlkSUQgKSApIG90aGVybHZfMT0gJz0nICkgKSAoIChsdl92YWx1ZV8yXzA9IHJ1bGVYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZSApICkgKSA7CiAgICAgcHVibGljIGZpbmFsIEVPYmplY3QgcnVsZVhBbm5vdGF0aW9uRWxlbWVudFZhbHVlUGFpcigpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAgICAgICAgIEVPYmplY3QgY3VycmVudCA9IG51bGw7CiAKQEAgLTcyNDcsMjMgKzg0NDEsMjMgQEAKICAgICAgICAgCWVudGVyUnVsZSgpOwogCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNzIxOjI6ICggKCAoICggKCAoICggcnVsZVZhbGlkSUQgKSApICc9JyApICk9PiAoICggKCBydWxlVmFsaWRJRCApICkgb3RoZXJsdl8xPSAnPScgKSApICggKGx2X3ZhbHVlXzJfMD0gcnVsZVhBbm5vdGF0aW9uRWxlbWVudFZhbHVlICkgKSApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI3MjI6MjogKCAoICggKCAoICggcnVsZVZhbGlkSUQgKSApICc9JyApICk9PiAoICggKCBydWxlVmFsaWRJRCApICkgb3RoZXJsdl8xPSAnPScgKSApICggKGx2X3ZhbHVlXzJfMD0gcnVsZVhBbm5vdGF0aW9uRWxlbWVudFZhbHVlICkgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzozMTYwOjI6ICggKCAoICggKCAoICggcnVsZVZhbGlkSUQgKSApICc9JyApICk9PiAoICggKCBydWxlVmFsaWRJRCApICkgb3RoZXJsdl8xPSAnPScgKSApICggKGx2X3ZhbHVlXzJfMD0gcnVsZVhBbm5vdGF0aW9uRWxlbWVudFZhbHVlICkgKSApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjMxNjE6MjogKCAoICggKCAoICggcnVsZVZhbGlkSUQgKSApICc9JyApICk9PiAoICggKCBydWxlVmFsaWRJRCApICkgb3RoZXJsdl8xPSAnPScgKSApICggKGx2X3ZhbHVlXzJfMD0gcnVsZVhBbm5vdGF0aW9uRWxlbWVudFZhbHVlICkgKSApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNzIyOjI6ICggKCAoICggKCAoIHJ1bGVWYWxpZElEICkgKSAnPScgKSApPT4gKCAoICggcnVsZVZhbGlkSUQgKSApIG90aGVybHZfMT0gJz0nICkgKSAoIChsdl92YWx1ZV8yXzA9IHJ1bGVYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZSApICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjcyMzozOiAoICggKCAoICggcnVsZVZhbGlkSUQgKSApICc9JyApICk9PiAoICggKCBydWxlVmFsaWRJRCApICkgb3RoZXJsdl8xPSAnPScgKSApICggKGx2X3ZhbHVlXzJfMD0gcnVsZVhBbm5vdGF0aW9uRWxlbWVudFZhbHVlICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MzE2MToyOiAoICggKCAoICggKCBydWxlVmFsaWRJRCApICkgJz0nICkgKT0+ICggKCAoIHJ1bGVWYWxpZElEICkgKSBvdGhlcmx2XzE9ICc9JyApICkgKCAobHZfdmFsdWVfMl8wPSBydWxlWEFubm90YXRpb25FbGVtZW50VmFsdWUgKSApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjMxNjI6MzogKCAoICggKCAoIHJ1bGVWYWxpZElEICkgKSAnPScgKSApPT4gKCAoICggcnVsZVZhbGlkSUQgKSApIG90aGVybHZfMT0gJz0nICkgKSAoIChsdl92YWx1ZV8yXzA9IHJ1bGVYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZSApICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI3MjM6MzogKCAoICggKCAoIHJ1bGVWYWxpZElEICkgKSAnPScgKSApPT4gKCAoICggcnVsZVZhbGlkSUQgKSApIG90aGVybHZfMT0gJz0nICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjcyNDo0OiAoICggKCAoIHJ1bGVWYWxpZElEICkgKSAnPScgKSApPT4gKCAoICggcnVsZVZhbGlkSUQgKSApIG90aGVybHZfMT0gJz0nICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjMxNjI6MzogKCAoICggKCAoIHJ1bGVWYWxpZElEICkgKSAnPScgKSApPT4gKCAoICggcnVsZVZhbGlkSUQgKSApIG90aGVybHZfMT0gJz0nICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MzE2Mzo0OiAoICggKCAoIHJ1bGVWYWxpZElEICkgKSAnPScgKSApPT4gKCAoICggcnVsZVZhbGlkSUQgKSApIG90aGVybHZfMT0gJz0nICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI3MzM6NDogKCAoICggcnVsZVZhbGlkSUQgKSApIG90aGVybHZfMT0gJz0nICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI3MzQ6NTogKCAoIHJ1bGVWYWxpZElEICkgKSBvdGhlcmx2XzE9ICc9JworICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MzE3Mjo0OiAoICggKCBydWxlVmFsaWRJRCApICkgb3RoZXJsdl8xPSAnPScgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MzE3Mzo1OiAoICggcnVsZVZhbGlkSUQgKSApIG90aGVybHZfMT0gJz0nCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNzM0OjU6ICggKCBydWxlVmFsaWRJRCApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI3MzU6NjogKCBydWxlVmFsaWRJRCApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzozMTczOjU6ICggKCBydWxlVmFsaWRJRCApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjMxNzQ6NjogKCBydWxlVmFsaWRJRCApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNzM1OjY6ICggcnVsZVZhbGlkSUQgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjczNjo3OiBydWxlVmFsaWRJRAorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MzE3NDo2OiAoIHJ1bGVWYWxpZElEICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjMxNzU6NzogcnVsZVZhbGlkSUQKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogCkBAIC03Mjc3LDcgKzg0NzEsNyBAQAogICAgICAgICAgICAgICAJCQkJCQkJbmV3Q29tcG9zaXRlTm9kZShncmFtbWFyQWNjZXNzLmdldFhBbm5vdGF0aW9uRWxlbWVudFZhbHVlUGFpckFjY2VzcygpLmdldEVsZW1lbnRKdm1PcGVyYXRpb25Dcm9zc1JlZmVyZW5jZV8wXzBfMF8wKCkpOwogICAgICAgICAgICAgICAJCQkJCQkKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzYzKTsKKyAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzc3KTsKICAgICAgICAgICAgIHJ1bGVWYWxpZElEKCk7CiAKICAgICAgICAgICAgIHN0YXRlLl9mc3AtLTsKQEAgLTcyOTMsNyArODQ4Nyw3IEBACiAKICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgb3RoZXJsdl8xPShUb2tlbiltYXRjaChpbnB1dCw3NyxGT0xMT1dfNjQpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gY3VycmVudDsKKyAgICAgICAgICAgIG90aGVybHZfMT0oVG9rZW4pbWF0Y2goaW5wdXQsODQsRk9MTE9XXzc4KTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKIAogICAgICAgICAgICAgICAJCQkJCW5ld0xlYWZOb2RlKG90aGVybHZfMSwgZ3JhbW1hckFjY2Vzcy5nZXRYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZVBhaXJBY2Nlc3MoKS5nZXRFcXVhbHNTaWduS2V5d29yZF8wXzBfMSgpKTsKQEAgLTczMDUsMTEgKzg0OTksMTEgQEAKIAogICAgICAgICAgICAgfQogCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNzU2OjM6ICggKGx2X3ZhbHVlXzJfMD0gcnVsZVhBbm5vdGF0aW9uRWxlbWVudFZhbHVlICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6Mjc1Nzo0OiAobHZfdmFsdWVfMl8wPSBydWxlWEFubm90YXRpb25FbGVtZW50VmFsdWUgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MzE5NTozOiAoIChsdl92YWx1ZV8yXzA9IHJ1bGVYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZSApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjMxOTY6NDogKGx2X3ZhbHVlXzJfMD0gcnVsZVhBbm5vdGF0aW9uRWxlbWVudFZhbHVlICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI3NTc6NDogKGx2X3ZhbHVlXzJfMD0gcnVsZVhBbm5vdGF0aW9uRWxlbWVudFZhbHVlICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI3NTg6NTogbHZfdmFsdWVfMl8wPSBydWxlWEFubm90YXRpb25FbGVtZW50VmFsdWUKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjMxOTY6NDogKGx2X3ZhbHVlXzJfMD0gcnVsZVhBbm5vdGF0aW9uRWxlbWVudFZhbHVlICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjMxOTc6NTogbHZfdmFsdWVfMl8wPSBydWxlWEFubm90YXRpb25FbGVtZW50VmFsdWUKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogCkBAIC03MzY1LDcgKzg1NTksNyBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgImVudHJ5UnVsZVhBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3QiCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6Mjc3OToxOiBlbnRyeVJ1bGVYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0IHJldHVybnMgW0VPYmplY3QgY3VycmVudD1udWxsXSA6IGl2X3J1bGVYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0PSBydWxlWEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdCBFT0YgOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjMyMTg6MTogZW50cnlSdWxlWEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdCByZXR1cm5zIFtFT2JqZWN0IGN1cnJlbnQ9bnVsbF0gOiBpdl9ydWxlWEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdD0gcnVsZVhBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3QgRU9GIDsKICAgICBwdWJsaWMgZmluYWwgRU9iamVjdCBlbnRyeVJ1bGVYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0KCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKICAgICAgICAgRU9iamVjdCBjdXJyZW50ID0gbnVsbDsKIApAQCAtNzM3Myw4ICs4NTY3LDggQEAKIAogCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNzc5Ojc1OiAoaXZfcnVsZVhBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3Q9IHJ1bGVYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0IEVPRiApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNzgwOjI6IGl2X3J1bGVYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0PSBydWxlWEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdCBFT0YKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjMyMTg6NzU6IChpdl9ydWxlWEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdD0gcnVsZVhBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3QgRU9GICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjMyMTk6MjogaXZfcnVsZVhBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3Q9IHJ1bGVYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0IEVPRgogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBuZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0WEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdFJ1bGUoKSk7IApAQCAtNzQwNSw3ICs4NTk5LDcgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlWEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdCIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNzg2OjE6IHJ1bGVYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0IHJldHVybnMgW0VPYmplY3QgY3VycmVudD1udWxsXSA6ICggKCAoICggKCAoKSAnIycgJ1snICkgKT0+ICggKCkgb3RoZXJsdl8xPSAnIycgb3RoZXJsdl8yPSAnWycgKSApICggKCAobHZfZWxlbWVudHNfM18wPSBydWxlWEFubm90YXRpb25PckV4cHJlc3Npb24gKSApIChvdGhlcmx2XzQ9ICcsJyAoIChsdl9lbGVtZW50c181XzA9IHJ1bGVYQW5ub3RhdGlvbk9yRXhwcmVzc2lvbiApICkgKSogKT8gb3RoZXJsdl82PSAnXScgKSB8ICh0aGlzX1hBbm5vdGF0aW9uT3JFeHByZXNzaW9uXzc9IHJ1bGVYQW5ub3RhdGlvbk9yRXhwcmVzc2lvbiAoICgpIChvdGhlcmx2Xzk9ICcsJyAoIChsdl9lbGVtZW50c18xMF8wPSBydWxlWEFubm90YXRpb25PckV4cHJlc3Npb24gKSApICkrICk/ICkgKSA7CisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MzIyNToxOiBydWxlWEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdCByZXR1cm5zIFtFT2JqZWN0IGN1cnJlbnQ9bnVsbF0gOiAoICggKCAoICggKCkgJyMnICdbJyApICk9PiAoICgpIG90aGVybHZfMT0gJyMnIG90aGVybHZfMj0gJ1snICkgKSAoICggKGx2X2VsZW1lbnRzXzNfMD0gcnVsZVhBbm5vdGF0aW9uT3JFeHByZXNzaW9uICkgKSAob3RoZXJsdl80PSAnLCcgKCAobHZfZWxlbWVudHNfNV8wPSBydWxlWEFubm90YXRpb25PckV4cHJlc3Npb24gKSApICkqICk/IG90aGVybHZfNj0gJ10nICkgfCAodGhpc19YQW5ub3RhdGlvbk9yRXhwcmVzc2lvbl83PSBydWxlWEFubm90YXRpb25PckV4cHJlc3Npb24gKCAoKSAob3RoZXJsdl85PSAnLCcgKCAobHZfZWxlbWVudHNfMTBfMD0gcnVsZVhBbm5vdGF0aW9uT3JFeHByZXNzaW9uICkgKSApKyApPyApICkgOwogICAgIHB1YmxpYyBmaW5hbCBFT2JqZWN0IHJ1bGVYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0KCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKICAgICAgICAgRU9iamVjdCBjdXJyZW50ID0gbnVsbDsKIApAQCAtNzQyNywyNyArODYyMSwyNyBAQAogICAgICAgICAJZW50ZXJSdWxlKCk7CiAKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI3OTI6MjogKCAoICggKCAoICggKCkgJyMnICdbJyApICk9PiAoICgpIG90aGVybHZfMT0gJyMnIG90aGVybHZfMj0gJ1snICkgKSAoICggKGx2X2VsZW1lbnRzXzNfMD0gcnVsZVhBbm5vdGF0aW9uT3JFeHByZXNzaW9uICkgKSAob3RoZXJsdl80PSAnLCcgKCAobHZfZWxlbWVudHNfNV8wPSBydWxlWEFubm90YXRpb25PckV4cHJlc3Npb24gKSApICkqICk/IG90aGVybHZfNj0gJ10nICkgfCAodGhpc19YQW5ub3RhdGlvbk9yRXhwcmVzc2lvbl83PSBydWxlWEFubm90YXRpb25PckV4cHJlc3Npb24gKCAoKSAob3RoZXJsdl85PSAnLCcgKCAobHZfZWxlbWVudHNfMTBfMD0gcnVsZVhBbm5vdGF0aW9uT3JFeHByZXNzaW9uICkgKSApKyApPyApICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6Mjc5MzoyOiAoICggKCAoICggKCkgJyMnICdbJyApICk9PiAoICgpIG90aGVybHZfMT0gJyMnIG90aGVybHZfMj0gJ1snICkgKSAoICggKGx2X2VsZW1lbnRzXzNfMD0gcnVsZVhBbm5vdGF0aW9uT3JFeHByZXNzaW9uICkgKSAob3RoZXJsdl80PSAnLCcgKCAobHZfZWxlbWVudHNfNV8wPSBydWxlWEFubm90YXRpb25PckV4cHJlc3Npb24gKSApICkqICk/IG90aGVybHZfNj0gJ10nICkgfCAodGhpc19YQW5ub3RhdGlvbk9yRXhwcmVzc2lvbl83PSBydWxlWEFubm90YXRpb25PckV4cHJlc3Npb24gKCAoKSAob3RoZXJsdl85PSAnLCcgKCAobHZfZWxlbWVudHNfMTBfMD0gcnVsZVhBbm5vdGF0aW9uT3JFeHByZXNzaW9uICkgKSApKyApPyApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjMyMzE6MjogKCAoICggKCAoICggKCkgJyMnICdbJyApICk9PiAoICgpIG90aGVybHZfMT0gJyMnIG90aGVybHZfMj0gJ1snICkgKSAoICggKGx2X2VsZW1lbnRzXzNfMD0gcnVsZVhBbm5vdGF0aW9uT3JFeHByZXNzaW9uICkgKSAob3RoZXJsdl80PSAnLCcgKCAobHZfZWxlbWVudHNfNV8wPSBydWxlWEFubm90YXRpb25PckV4cHJlc3Npb24gKSApICkqICk/IG90aGVybHZfNj0gJ10nICkgfCAodGhpc19YQW5ub3RhdGlvbk9yRXhwcmVzc2lvbl83PSBydWxlWEFubm90YXRpb25PckV4cHJlc3Npb24gKCAoKSAob3RoZXJsdl85PSAnLCcgKCAobHZfZWxlbWVudHNfMTBfMD0gcnVsZVhBbm5vdGF0aW9uT3JFeHByZXNzaW9uICkgKSApKyApPyApICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MzIzMjoyOiAoICggKCAoICggKCkgJyMnICdbJyApICk9PiAoICgpIG90aGVybHZfMT0gJyMnIG90aGVybHZfMj0gJ1snICkgKSAoICggKGx2X2VsZW1lbnRzXzNfMD0gcnVsZVhBbm5vdGF0aW9uT3JFeHByZXNzaW9uICkgKSAob3RoZXJsdl80PSAnLCcgKCAobHZfZWxlbWVudHNfNV8wPSBydWxlWEFubm90YXRpb25PckV4cHJlc3Npb24gKSApICkqICk/IG90aGVybHZfNj0gJ10nICkgfCAodGhpc19YQW5ub3RhdGlvbk9yRXhwcmVzc2lvbl83PSBydWxlWEFubm90YXRpb25PckV4cHJlc3Npb24gKCAoKSAob3RoZXJsdl85PSAnLCcgKCAobHZfZWxlbWVudHNfMTBfMD0gcnVsZVhBbm5vdGF0aW9uT3JFeHByZXNzaW9uICkgKSApKyApPyApICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI3OTM6MjogKCAoICggKCAoICgpICcjJyAnWycgKSApPT4gKCAoKSBvdGhlcmx2XzE9ICcjJyBvdGhlcmx2XzI9ICdbJyApICkgKCAoIChsdl9lbGVtZW50c18zXzA9IHJ1bGVYQW5ub3RhdGlvbk9yRXhwcmVzc2lvbiApICkgKG90aGVybHZfND0gJywnICggKGx2X2VsZW1lbnRzXzVfMD0gcnVsZVhBbm5vdGF0aW9uT3JFeHByZXNzaW9uICkgKSApKiApPyBvdGhlcmx2XzY9ICddJyApIHwgKHRoaXNfWEFubm90YXRpb25PckV4cHJlc3Npb25fNz0gcnVsZVhBbm5vdGF0aW9uT3JFeHByZXNzaW9uICggKCkgKG90aGVybHZfOT0gJywnICggKGx2X2VsZW1lbnRzXzEwXzA9IHJ1bGVYQW5ub3RhdGlvbk9yRXhwcmVzc2lvbiApICkgKSsgKT8gKSApCi0gICAgICAgICAgICBpbnQgYWx0NTA9MjsKLSAgICAgICAgICAgIGFsdDUwID0gZGZhNTAucHJlZGljdChpbnB1dCk7Ci0gICAgICAgICAgICBzd2l0Y2ggKGFsdDUwKSB7CisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzozMjMyOjI6ICggKCAoICggKCAoKSAnIycgJ1snICkgKT0+ICggKCkgb3RoZXJsdl8xPSAnIycgb3RoZXJsdl8yPSAnWycgKSApICggKCAobHZfZWxlbWVudHNfM18wPSBydWxlWEFubm90YXRpb25PckV4cHJlc3Npb24gKSApIChvdGhlcmx2XzQ9ICcsJyAoIChsdl9lbGVtZW50c181XzA9IHJ1bGVYQW5ub3RhdGlvbk9yRXhwcmVzc2lvbiApICkgKSogKT8gb3RoZXJsdl82PSAnXScgKSB8ICh0aGlzX1hBbm5vdGF0aW9uT3JFeHByZXNzaW9uXzc9IHJ1bGVYQW5ub3RhdGlvbk9yRXhwcmVzc2lvbiAoICgpIChvdGhlcmx2Xzk9ICcsJyAoIChsdl9lbGVtZW50c18xMF8wPSBydWxlWEFubm90YXRpb25PckV4cHJlc3Npb24gKSApICkrICk/ICkgKQorICAgICAgICAgICAgaW50IGFsdDYxPTI7CisgICAgICAgICAgICBhbHQ2MSA9IGRmYTYxLnByZWRpY3QoaW5wdXQpOworICAgICAgICAgICAgc3dpdGNoIChhbHQ2MSkgewogICAgICAgICAgICAgICAgIGNhc2UgMSA6Ci0gICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI3OTQ6MzogKCAoICggKCAoKSAnIycgJ1snICkgKT0+ICggKCkgb3RoZXJsdl8xPSAnIycgb3RoZXJsdl8yPSAnWycgKSApICggKCAobHZfZWxlbWVudHNfM18wPSBydWxlWEFubm90YXRpb25PckV4cHJlc3Npb24gKSApIChvdGhlcmx2XzQ9ICcsJyAoIChsdl9lbGVtZW50c181XzA9IHJ1bGVYQW5ub3RhdGlvbk9yRXhwcmVzc2lvbiApICkgKSogKT8gb3RoZXJsdl82PSAnXScgKQorICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzozMjMzOjM6ICggKCAoICggKCkgJyMnICdbJyApICk9PiAoICgpIG90aGVybHZfMT0gJyMnIG90aGVybHZfMj0gJ1snICkgKSAoICggKGx2X2VsZW1lbnRzXzNfMD0gcnVsZVhBbm5vdGF0aW9uT3JFeHByZXNzaW9uICkgKSAob3RoZXJsdl80PSAnLCcgKCAobHZfZWxlbWVudHNfNV8wPSBydWxlWEFubm90YXRpb25PckV4cHJlc3Npb24gKSApICkqICk/IG90aGVybHZfNj0gJ10nICkKICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNzk0OjM6ICggKCAoICggKCkgJyMnICdbJyApICk9PiAoICgpIG90aGVybHZfMT0gJyMnIG90aGVybHZfMj0gJ1snICkgKSAoICggKGx2X2VsZW1lbnRzXzNfMD0gcnVsZVhBbm5vdGF0aW9uT3JFeHByZXNzaW9uICkgKSAob3RoZXJsdl80PSAnLCcgKCAobHZfZWxlbWVudHNfNV8wPSBydWxlWEFubm90YXRpb25PckV4cHJlc3Npb24gKSApICkqICk/IG90aGVybHZfNj0gJ10nICkKLSAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6Mjc5NTo0OiAoICggKCAoKSAnIycgJ1snICkgKT0+ICggKCkgb3RoZXJsdl8xPSAnIycgb3RoZXJsdl8yPSAnWycgKSApICggKCAobHZfZWxlbWVudHNfM18wPSBydWxlWEFubm90YXRpb25PckV4cHJlc3Npb24gKSApIChvdGhlcmx2XzQ9ICcsJyAoIChsdl9lbGVtZW50c181XzA9IHJ1bGVYQW5ub3RhdGlvbk9yRXhwcmVzc2lvbiApICkgKSogKT8gb3RoZXJsdl82PSAnXScKKyAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MzIzMzozOiAoICggKCAoICgpICcjJyAnWycgKSApPT4gKCAoKSBvdGhlcmx2XzE9ICcjJyBvdGhlcmx2XzI9ICdbJyApICkgKCAoIChsdl9lbGVtZW50c18zXzA9IHJ1bGVYQW5ub3RhdGlvbk9yRXhwcmVzc2lvbiApICkgKG90aGVybHZfND0gJywnICggKGx2X2VsZW1lbnRzXzVfMD0gcnVsZVhBbm5vdGF0aW9uT3JFeHByZXNzaW9uICkgKSApKiApPyBvdGhlcmx2XzY9ICddJyApCisgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjMyMzQ6NDogKCAoICggKCkgJyMnICdbJyApICk9PiAoICgpIG90aGVybHZfMT0gJyMnIG90aGVybHZfMj0gJ1snICkgKSAoICggKGx2X2VsZW1lbnRzXzNfMD0gcnVsZVhBbm5vdGF0aW9uT3JFeHByZXNzaW9uICkgKSAob3RoZXJsdl80PSAnLCcgKCAobHZfZWxlbWVudHNfNV8wPSBydWxlWEFubm90YXRpb25PckV4cHJlc3Npb24gKSApICkqICk/IG90aGVybHZfNj0gJ10nCiAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6Mjc5NTo0OiAoICggKCAoKSAnIycgJ1snICkgKT0+ICggKCkgb3RoZXJsdl8xPSAnIycgb3RoZXJsdl8yPSAnWycgKSApCi0gICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI3OTY6NTogKCAoICgpICcjJyAnWycgKSApPT4gKCAoKSBvdGhlcmx2XzE9ICcjJyBvdGhlcmx2XzI9ICdbJyApCisgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjMyMzQ6NDogKCAoICggKCkgJyMnICdbJyApICk9PiAoICgpIG90aGVybHZfMT0gJyMnIG90aGVybHZfMj0gJ1snICkgKQorICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzozMjM1OjU6ICggKCAoKSAnIycgJ1snICkgKT0+ICggKCkgb3RoZXJsdl8xPSAnIycgb3RoZXJsdl8yPSAnWycgKQogICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI4MDM6NTogKCAoKSBvdGhlcmx2XzE9ICcjJyBvdGhlcmx2XzI9ICdbJyApCi0gICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI4MDQ6NjogKCkgb3RoZXJsdl8xPSAnIycgb3RoZXJsdl8yPSAnWycKKyAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MzI0Mjo1OiAoICgpIG90aGVybHZfMT0gJyMnIG90aGVybHZfMj0gJ1snICkKKyAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MzI0Mzo2OiAoKSBvdGhlcmx2XzE9ICcjJyBvdGhlcmx2XzI9ICdbJwogICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI4MDQ6NjogKCkKLSAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjgwNTo3OiAKKyAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MzI0Mzo2OiAoKQorICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzozMjQ0Ojc6IAogICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogCkBAIC03NDU5LDEzICs4NjUzLDEzIEBACiAKICAgICAgICAgICAgICAgICAgICAgfQogCi0gICAgICAgICAgICAgICAgICAgIG90aGVybHZfMT0oVG9rZW4pbWF0Y2goaW5wdXQsNzgsRk9MTE9XXzY1KTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7CisgICAgICAgICAgICAgICAgICAgIG90aGVybHZfMT0oVG9rZW4pbWF0Y2goaW5wdXQsODUsRk9MTE9XXzc5KTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7CiAgICAgICAgICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogCiAgICAgICAgICAgICAgICAgICAgICAgCQkJCQkJbmV3TGVhZk5vZGUob3RoZXJsdl8xLCBncmFtbWFyQWNjZXNzLmdldFhBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RBY2Nlc3MoKS5nZXROdW1iZXJTaWduS2V5d29yZF8wXzBfMF8xKCkpOwogICAgICAgICAgICAgICAgICAgICAgIAkJCQkJCiAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgb3RoZXJsdl8yPShUb2tlbiltYXRjaChpbnB1dCw3OSxGT0xMT1dfNjYpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gY3VycmVudDsKKyAgICAgICAgICAgICAgICAgICAgb3RoZXJsdl8yPShUb2tlbiltYXRjaChpbnB1dCw4NixGT0xMT1dfODApOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gY3VycmVudDsKICAgICAgICAgICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAKICAgICAgICAgICAgICAgICAgICAgICAJCQkJCQluZXdMZWFmTm9kZShvdGhlcmx2XzIsIGdyYW1tYXJBY2Nlc3MuZ2V0WEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdEFjY2VzcygpLmdldExlZnRTcXVhcmVCcmFja2V0S2V5d29yZF8wXzBfMF8yKCkpOwpAQCAtNzQ3NywyOSArODY3MSwyOSBAQAogCiAgICAgICAgICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyODIxOjQ6ICggKCAobHZfZWxlbWVudHNfM18wPSBydWxlWEFubm90YXRpb25PckV4cHJlc3Npb24gKSApIChvdGhlcmx2XzQ9ICcsJyAoIChsdl9lbGVtZW50c181XzA9IHJ1bGVYQW5ub3RhdGlvbk9yRXhwcmVzc2lvbiApICkgKSogKT8KLSAgICAgICAgICAgICAgICAgICAgaW50IGFsdDQ3PTI7Ci0gICAgICAgICAgICAgICAgICAgIGludCBMQTQ3XzAgPSBpbnB1dC5MQSgxKTsKKyAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MzI2MDo0OiAoICggKGx2X2VsZW1lbnRzXzNfMD0gcnVsZVhBbm5vdGF0aW9uT3JFeHByZXNzaW9uICkgKSAob3RoZXJsdl80PSAnLCcgKCAobHZfZWxlbWVudHNfNV8wPSBydWxlWEFubm90YXRpb25PckV4cHJlc3Npb24gKSApICkqICk/CisgICAgICAgICAgICAgICAgICAgIGludCBhbHQ1OD0yOworICAgICAgICAgICAgICAgICAgICBpbnQgTEE1OF8wID0gaW5wdXQuTEEoMSk7CiAKLSAgICAgICAgICAgICAgICAgICAgaWYgKCAoKExBNDdfMD49UlVMRV9TVFJJTkcgJiYgTEE0N18wPD1SVUxFX0RFQ0lNQUwpfHxMQTQ3XzA9PTE1fHxMQTQ3XzA9PTQ2fHxMQTQ3XzA9PTY1fHwoTEE0N18wPj02OCAmJiBMQTQ3XzA8PTY5KXx8KExBNDdfMD49NzMgJiYgTEE0N18wPD03NCl8fChMQTQ3XzA+PTc4ICYmIExBNDdfMDw9NzkpfHxMQTQ3XzA9PTg2fHwoTEE0N18wPj0xMDIgJiYgTEE0N18wPD0xMDMpfHxMQTQ3XzA9PTEwN3x8TEE0N18wPT0xMTN8fExBNDdfMD09MTE1fHwoTEE0N18wPj0xMTkgJiYgTEE0N18wPD0xMjApfHwoTEE0N18wPj0xMjMgJiYgTEE0N18wPD0xMzIpfHxMQTQ3XzA9PTEzNCkgKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBhbHQ0Nz0xOworICAgICAgICAgICAgICAgICAgICBpZiAoICgoTEE1OF8wPj1SVUxFX1NUUklORyAmJiBMQTU4XzA8PVJVTEVfREVDSU1BTCl8fExBNThfMD09MTV8fExBNThfMD09NTB8fExBNThfMD09NzJ8fChMQTU4XzA+PTc1ICYmIExBNThfMDw9NzYpfHwoTEE1OF8wPj04MCAmJiBMQTU4XzA8PTgxKXx8KExBNThfMD49ODUgJiYgTEE1OF8wPD04Nil8fExBNThfMD09OTN8fChMQTU4XzA+PTEwOSAmJiBMQTU4XzA8PTExMCl8fExBNThfMD09MTE0fHxMQTU4XzA9PTEyMHx8TEE1OF8wPT0xMjJ8fChMQTU4XzA+PTEyNiAmJiBMQTU4XzA8PTEyNyl8fChMQTU4XzA+PTEzMCAmJiBMQTU4XzA8PTEzOSl8fExBNThfMD09MTQxKSApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFsdDU4PTE7CiAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChhbHQ0NykgeworICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKGFsdDU4KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDEgOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI4MjI6NTogKCAobHZfZWxlbWVudHNfM18wPSBydWxlWEFubm90YXRpb25PckV4cHJlc3Npb24gKSApIChvdGhlcmx2XzQ9ICcsJyAoIChsdl9lbGVtZW50c181XzA9IHJ1bGVYQW5ub3RhdGlvbk9yRXhwcmVzc2lvbiApICkgKSoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzozMjYxOjU6ICggKGx2X2VsZW1lbnRzXzNfMD0gcnVsZVhBbm5vdGF0aW9uT3JFeHByZXNzaW9uICkgKSAob3RoZXJsdl80PSAnLCcgKCAobHZfZWxlbWVudHNfNV8wPSBydWxlWEFubm90YXRpb25PckV4cHJlc3Npb24gKSApICkqCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI4MjI6NTogKCAobHZfZWxlbWVudHNfM18wPSBydWxlWEFubm90YXRpb25PckV4cHJlc3Npb24gKSApCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjgyMzo2OiAobHZfZWxlbWVudHNfM18wPSBydWxlWEFubm90YXRpb25PckV4cHJlc3Npb24gKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjMyNjE6NTogKCAobHZfZWxlbWVudHNfM18wPSBydWxlWEFubm90YXRpb25PckV4cHJlc3Npb24gKSApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MzI2Mjo2OiAobHZfZWxlbWVudHNfM18wPSBydWxlWEFubm90YXRpb25PckV4cHJlc3Npb24gKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyODIzOjY6IChsdl9lbGVtZW50c18zXzA9IHJ1bGVYQW5ub3RhdGlvbk9yRXhwcmVzc2lvbiApCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjgyNDo3OiBsdl9lbGVtZW50c18zXzA9IHJ1bGVYQW5ub3RhdGlvbk9yRXhwcmVzc2lvbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjMyNjI6NjogKGx2X2VsZW1lbnRzXzNfMD0gcnVsZVhBbm5vdGF0aW9uT3JFeHByZXNzaW9uICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzozMjYzOjc6IGx2X2VsZW1lbnRzXzNfMD0gcnVsZVhBbm5vdGF0aW9uT3JFeHByZXNzaW9uCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAJCQkJCQkJbmV3Q29tcG9zaXRlTm9kZShncmFtbWFyQWNjZXNzLmdldFhBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RBY2Nlc3MoKS5nZXRFbGVtZW50c1hBbm5vdGF0aW9uT3JFeHByZXNzaW9uUGFyc2VyUnVsZUNhbGxfMF8xXzBfMCgpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAkJCQkJCQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV182Nyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfODEpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGx2X2VsZW1lbnRzXzNfMD1ydWxlWEFubm90YXRpb25PckV4cHJlc3Npb24oKTsKIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlLl9mc3AtLTsKQEAgLTc1MjMsMzkgKzg3MTcsMzkgQEAKIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI4NDE6NTogKG90aGVybHZfND0gJywnICggKGx2X2VsZW1lbnRzXzVfMD0gcnVsZVhBbm5vdGF0aW9uT3JFeHByZXNzaW9uICkgKSApKgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvb3A0NjoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzozMjgwOjU6IChvdGhlcmx2XzQ9ICcsJyAoIChsdl9lbGVtZW50c181XzA9IHJ1bGVYQW5ub3RhdGlvbk9yRXhwcmVzc2lvbiApICkgKSoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb29wNTc6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG8gewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYWx0NDY9MjsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IExBNDZfMCA9IGlucHV0LkxBKDEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYWx0NTc9MjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IExBNTdfMCA9IGlucHV0LkxBKDEpOwogCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICggKExBNDZfMD09NzUpICkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWx0NDY9MTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCAoTEE1N18wPT04MikgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbHQ1Nz0xOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAKIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKGFsdDQ2KSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoYWx0NTcpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAJY2FzZSAxIDoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAJICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI4NDI6Njogb3RoZXJsdl80PSAnLCcgKCAobHZfZWxlbWVudHNfNV8wPSBydWxlWEFubm90YXRpb25PckV4cHJlc3Npb24gKSApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgCSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzozMjgxOjY6IG90aGVybHZfND0gJywnICggKGx2X2VsZW1lbnRzXzVfMD0gcnVsZVhBbm5vdGF0aW9uT3JFeHByZXNzaW9uICkgKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIAkgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIAkgICAgb3RoZXJsdl80PShUb2tlbiltYXRjaChpbnB1dCw3NSxGT0xMT1dfNjQpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gY3VycmVudDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAJICAgIG90aGVybHZfND0oVG9rZW4pbWF0Y2goaW5wdXQsODIsRk9MTE9XXzc4KTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCSAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIAkgICAgICAJCQkJCQluZXdMZWFmTm9kZShvdGhlcmx2XzQsIGdyYW1tYXJBY2Nlc3MuZ2V0WEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdEFjY2VzcygpLmdldENvbW1hS2V5d29yZF8wXzFfMV8wKCkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIAkgICAgICAJCQkJCQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIAkgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIAkgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6Mjg0Njo2OiAoIChsdl9lbGVtZW50c181XzA9IHJ1bGVYQW5ub3RhdGlvbk9yRXhwcmVzc2lvbiApICkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAJICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI4NDc6NzogKGx2X2VsZW1lbnRzXzVfMD0gcnVsZVhBbm5vdGF0aW9uT3JFeHByZXNzaW9uICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAJICAgIC8vIEludGVybmFsRGF0YURTTC5nOjMyODU6NjogKCAobHZfZWxlbWVudHNfNV8wPSBydWxlWEFubm90YXRpb25PckV4cHJlc3Npb24gKSApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgCSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzozMjg2Ojc6IChsdl9lbGVtZW50c181XzA9IHJ1bGVYQW5ub3RhdGlvbk9yRXhwcmVzc2lvbiApCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCSAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgCSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyODQ3Ojc6IChsdl9lbGVtZW50c181XzA9IHJ1bGVYQW5ub3RhdGlvbk9yRXhwcmVzc2lvbiApCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgCSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyODQ4Ojg6IGx2X2VsZW1lbnRzXzVfMD0gcnVsZVhBbm5vdGF0aW9uT3JFeHByZXNzaW9uCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgCSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzozMjg2Ojc6IChsdl9lbGVtZW50c181XzA9IHJ1bGVYQW5ub3RhdGlvbk9yRXhwcmVzc2lvbiApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgCSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzozMjg3Ojg6IGx2X2VsZW1lbnRzXzVfMD0gcnVsZVhBbm5vdGF0aW9uT3JFeHByZXNzaW9uCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCSAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCSAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIAkgICAgICAJCQkJCQkJCW5ld0NvbXBvc2l0ZU5vZGUoZ3JhbW1hckFjY2Vzcy5nZXRYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0QWNjZXNzKCkuZ2V0RWxlbWVudHNYQW5ub3RhdGlvbk9yRXhwcmVzc2lvblBhcnNlclJ1bGVDYWxsXzBfMV8xXzFfMCgpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAJICAgICAgCQkJCQkJCQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIAkgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIAkgICAgcHVzaEZvbGxvdyhGT0xMT1dfNjcpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIAkgICAgcHVzaEZvbGxvdyhGT0xMT1dfODEpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIAkgICAgbHZfZWxlbWVudHNfNV8wPXJ1bGVYQW5ub3RhdGlvbk9yRXhwcmVzc2lvbigpOwogCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCSAgICBzdGF0ZS5fZnNwLS07CkBAIC03NTg0LDcgKzg3NzgsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIAkgICAgYnJlYWs7CiAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAJZGVmYXVsdCA6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgCSAgICBicmVhayBsb29wNDY7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgCSAgICBicmVhayBsb29wNTc7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IHdoaWxlICh0cnVlKTsKIApAQCAtNzU5NCw3ICs4Nzg4LDcgQEAKIAogICAgICAgICAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgICAgICAgICAgb3RoZXJsdl82PShUb2tlbiltYXRjaChpbnB1dCw4MCxGT0xMT1dfMik7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OworICAgICAgICAgICAgICAgICAgICBvdGhlcmx2XzY9KFRva2VuKW1hdGNoKGlucHV0LDg3LEZPTExPV18yKTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7CiAgICAgICAgICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogCiAgICAgICAgICAgICAgICAgICAgICAgCQkJCW5ld0xlYWZOb2RlKG90aGVybHZfNiwgZ3JhbW1hckFjY2Vzcy5nZXRYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0QWNjZXNzKCkuZ2V0UmlnaHRTcXVhcmVCcmFja2V0S2V5d29yZF8wXzIoKSk7CkBAIC03NjA3LDE3ICs4ODAxLDE3IEBACiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgY2FzZSAyIDoKLSAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6Mjg3MzozOiAodGhpc19YQW5ub3RhdGlvbk9yRXhwcmVzc2lvbl83PSBydWxlWEFubm90YXRpb25PckV4cHJlc3Npb24gKCAoKSAob3RoZXJsdl85PSAnLCcgKCAobHZfZWxlbWVudHNfMTBfMD0gcnVsZVhBbm5vdGF0aW9uT3JFeHByZXNzaW9uICkgKSApKyApPyApCisgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjMzMTI6MzogKHRoaXNfWEFubm90YXRpb25PckV4cHJlc3Npb25fNz0gcnVsZVhBbm5vdGF0aW9uT3JFeHByZXNzaW9uICggKCkgKG90aGVybHZfOT0gJywnICggKGx2X2VsZW1lbnRzXzEwXzA9IHJ1bGVYQW5ub3RhdGlvbk9yRXhwcmVzc2lvbiApICkgKSsgKT8gKQogICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI4NzM6MzogKHRoaXNfWEFubm90YXRpb25PckV4cHJlc3Npb25fNz0gcnVsZVhBbm5vdGF0aW9uT3JFeHByZXNzaW9uICggKCkgKG90aGVybHZfOT0gJywnICggKGx2X2VsZW1lbnRzXzEwXzA9IHJ1bGVYQW5ub3RhdGlvbk9yRXhwcmVzc2lvbiApICkgKSsgKT8gKQotICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyODc0OjQ6IHRoaXNfWEFubm90YXRpb25PckV4cHJlc3Npb25fNz0gcnVsZVhBbm5vdGF0aW9uT3JFeHByZXNzaW9uICggKCkgKG90aGVybHZfOT0gJywnICggKGx2X2VsZW1lbnRzXzEwXzA9IHJ1bGVYQW5ub3RhdGlvbk9yRXhwcmVzc2lvbiApICkgKSsgKT8KKyAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MzMxMjozOiAodGhpc19YQW5ub3RhdGlvbk9yRXhwcmVzc2lvbl83PSBydWxlWEFubm90YXRpb25PckV4cHJlc3Npb24gKCAoKSAob3RoZXJsdl85PSAnLCcgKCAobHZfZWxlbWVudHNfMTBfMD0gcnVsZVhBbm5vdGF0aW9uT3JFeHByZXNzaW9uICkgKSApKyApPyApCisgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjMzMTM6NDogdGhpc19YQW5ub3RhdGlvbk9yRXhwcmVzc2lvbl83PSBydWxlWEFubm90YXRpb25PckV4cHJlc3Npb24gKCAoKSAob3RoZXJsdl85PSAnLCcgKCAobHZfZWxlbWVudHNfMTBfMD0gcnVsZVhBbm5vdGF0aW9uT3JFeHByZXNzaW9uICkgKSApKyApPwogICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogCiAgICAgICAgICAgICAgICAgICAgICAgCQkJCW5ld0NvbXBvc2l0ZU5vZGUoZ3JhbW1hckFjY2Vzcy5nZXRYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0QWNjZXNzKCkuZ2V0WEFubm90YXRpb25PckV4cHJlc3Npb25QYXJzZXJSdWxlQ2FsbF8xXzAoKSk7CiAgICAgICAgICAgICAgICAgICAgICAgCQkJCiAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfNjgpOworICAgICAgICAgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV184Mik7CiAgICAgICAgICAgICAgICAgICAgIHRoaXNfWEFubm90YXRpb25PckV4cHJlc3Npb25fNz1ydWxlWEFubm90YXRpb25PckV4cHJlc3Npb24oKTsKIAogICAgICAgICAgICAgICAgICAgICBzdGF0ZS5fZnNwLS07CkBAIC03NjI4LDE5ICs4ODIyLDE5IEBACiAgICAgICAgICAgICAgICAgICAgICAgCQkJCWFmdGVyUGFyc2VyT3JFbnVtUnVsZUNhbGwoKTsKICAgICAgICAgICAgICAgICAgICAgICAJCQkKICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyODgyOjQ6ICggKCkgKG90aGVybHZfOT0gJywnICggKGx2X2VsZW1lbnRzXzEwXzA9IHJ1bGVYQW5ub3RhdGlvbk9yRXhwcmVzc2lvbiApICkgKSsgKT8KLSAgICAgICAgICAgICAgICAgICAgaW50IGFsdDQ5PTI7Ci0gICAgICAgICAgICAgICAgICAgIGludCBMQTQ5XzAgPSBpbnB1dC5MQSgxKTsKKyAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MzMyMTo0OiAoICgpIChvdGhlcmx2Xzk9ICcsJyAoIChsdl9lbGVtZW50c18xMF8wPSBydWxlWEFubm90YXRpb25PckV4cHJlc3Npb24gKSApICkrICk/CisgICAgICAgICAgICAgICAgICAgIGludCBhbHQ2MD0yOworICAgICAgICAgICAgICAgICAgICBpbnQgTEE2MF8wID0gaW5wdXQuTEEoMSk7CiAKLSAgICAgICAgICAgICAgICAgICAgaWYgKCAoTEE0OV8wPT03NSkgKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBhbHQ0OT0xOworICAgICAgICAgICAgICAgICAgICBpZiAoIChMQTYwXzA9PTgyKSApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFsdDYwPTE7CiAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChhbHQ0OSkgeworICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKGFsdDYwKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDEgOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI4ODM6NTogKCkgKG90aGVybHZfOT0gJywnICggKGx2X2VsZW1lbnRzXzEwXzA9IHJ1bGVYQW5ub3RhdGlvbk9yRXhwcmVzc2lvbiApICkgKSsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzozMzIyOjU6ICgpIChvdGhlcmx2Xzk9ICcsJyAoIChsdl9lbGVtZW50c18xMF8wPSBydWxlWEFubm90YXRpb25PckV4cHJlc3Npb24gKSApICkrCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI4ODM6NTogKCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyODg0OjY6IAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjMzMjI6NTogKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzozMzIzOjY6IAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKIApAQCAtNzY1Miw0MCArODg0Niw0MCBAQAogCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6Mjg5MDo1OiAob3RoZXJsdl85PSAnLCcgKCAobHZfZWxlbWVudHNfMTBfMD0gcnVsZVhBbm5vdGF0aW9uT3JFeHByZXNzaW9uICkgKSApKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjbnQ0OD0wOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvb3A0ODoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzozMzI5OjU6IChvdGhlcmx2Xzk9ICcsJyAoIChsdl9lbGVtZW50c18xMF8wPSBydWxlWEFubm90YXRpb25PckV4cHJlc3Npb24gKSApICkrCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNudDU5PTA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9vcDU5OgogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGFsdDQ4PTI7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBMQTQ4XzAgPSBpbnB1dC5MQSgxKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGFsdDU5PTI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBMQTU5XzAgPSBpbnB1dC5MQSgxKTsKIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIChMQTQ4XzA9PTc1KSApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsdDQ4PTE7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICggKExBNTlfMD09ODIpICkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWx0NTk9MTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogCiAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChhbHQ0OCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKGFsdDU5KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCWNhc2UgMSA6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgCSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyODkxOjY6IG90aGVybHZfOT0gJywnICggKGx2X2VsZW1lbnRzXzEwXzA9IHJ1bGVYQW5ub3RhdGlvbk9yRXhwcmVzc2lvbiApICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAJICAgIC8vIEludGVybmFsRGF0YURTTC5nOjMzMzA6Njogb3RoZXJsdl85PSAnLCcgKCAobHZfZWxlbWVudHNfMTBfMD0gcnVsZVhBbm5vdGF0aW9uT3JFeHByZXNzaW9uICkgKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIAkgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIAkgICAgb3RoZXJsdl85PShUb2tlbiltYXRjaChpbnB1dCw3NSxGT0xMT1dfNjQpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gY3VycmVudDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAJICAgIG90aGVybHZfOT0oVG9rZW4pbWF0Y2goaW5wdXQsODIsRk9MTE9XXzc4KTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCSAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIAkgICAgICAJCQkJCQluZXdMZWFmTm9kZShvdGhlcmx2XzksIGdyYW1tYXJBY2Nlc3MuZ2V0WEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdEFjY2VzcygpLmdldENvbW1hS2V5d29yZF8xXzFfMV8wKCkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIAkgICAgICAJCQkJCQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIAkgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIAkgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6Mjg5NTo2OiAoIChsdl9lbGVtZW50c18xMF8wPSBydWxlWEFubm90YXRpb25PckV4cHJlc3Npb24gKSApCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgCSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyODk2Ojc6IChsdl9lbGVtZW50c18xMF8wPSBydWxlWEFubm90YXRpb25PckV4cHJlc3Npb24gKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIAkgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MzMzNDo2OiAoIChsdl9lbGVtZW50c18xMF8wPSBydWxlWEFubm90YXRpb25PckV4cHJlc3Npb24gKSApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgCSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzozMzM1Ojc6IChsdl9lbGVtZW50c18xMF8wPSBydWxlWEFubm90YXRpb25PckV4cHJlc3Npb24gKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIAkgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIAkgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6Mjg5Njo3OiAobHZfZWxlbWVudHNfMTBfMD0gcnVsZVhBbm5vdGF0aW9uT3JFeHByZXNzaW9uICkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAJICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI4OTc6ODogbHZfZWxlbWVudHNfMTBfMD0gcnVsZVhBbm5vdGF0aW9uT3JFeHByZXNzaW9uCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgCSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzozMzM1Ojc6IChsdl9lbGVtZW50c18xMF8wPSBydWxlWEFubm90YXRpb25PckV4cHJlc3Npb24gKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIAkgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MzMzNjo4OiBsdl9lbGVtZW50c18xMF8wPSBydWxlWEFubm90YXRpb25PckV4cHJlc3Npb24KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAJICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAJICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCSAgICAgIAkJCQkJCQkJbmV3Q29tcG9zaXRlTm9kZShncmFtbWFyQWNjZXNzLmdldFhBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RBY2Nlc3MoKS5nZXRFbGVtZW50c1hBbm5vdGF0aW9uT3JFeHByZXNzaW9uUGFyc2VyUnVsZUNhbGxfMV8xXzFfMV8wKCkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIAkgICAgICAJCQkJCQkJCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCSAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgCSAgICBwdXNoRm9sbG93KEZPTExPV182OCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgCSAgICBwdXNoRm9sbG93KEZPTExPV184Mik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCSAgICBsdl9lbGVtZW50c18xMF8wPXJ1bGVYQW5ub3RhdGlvbk9yRXhwcmVzc2lvbigpOwogCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCSAgICBzdGF0ZS5fZnNwLS07CkBAIC03NzE0LDEzICs4OTA4LDEzIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCSAgICBicmVhazsKIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIAlkZWZhdWx0IDoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAJICAgIGlmICggY250NDggPj0gMSApIGJyZWFrIGxvb3A0ODsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAJICAgIGlmICggY250NTkgPj0gMSApIGJyZWFrIGxvb3A1OTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAJICAgIGlmIChzdGF0ZS5iYWNrdHJhY2tpbmc+MCkge3N0YXRlLmZhaWxlZD10cnVlOyByZXR1cm4gY3VycmVudDt9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRWFybHlFeGl0RXhjZXB0aW9uIGVlZSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBFYXJseUV4aXRFeGNlcHRpb24oNDgsIGlucHV0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEVhcmx5RXhpdEV4Y2VwdGlvbig1OSwgaW5wdXQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IGVlZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbnQ0OCsrOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbnQ1OSsrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gd2hpbGUgKHRydWUpOwogCiAKQEAgLTc3NjAsNyArODk1NCw3IEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAiZW50cnlSdWxlWEFubm90YXRpb25FbGVtZW50VmFsdWUiCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjkyMToxOiBlbnRyeVJ1bGVYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZSByZXR1cm5zIFtFT2JqZWN0IGN1cnJlbnQ9bnVsbF0gOiBpdl9ydWxlWEFubm90YXRpb25FbGVtZW50VmFsdWU9IHJ1bGVYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZSBFT0YgOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjMzNjA6MTogZW50cnlSdWxlWEFubm90YXRpb25FbGVtZW50VmFsdWUgcmV0dXJucyBbRU9iamVjdCBjdXJyZW50PW51bGxdIDogaXZfcnVsZVhBbm5vdGF0aW9uRWxlbWVudFZhbHVlPSBydWxlWEFubm90YXRpb25FbGVtZW50VmFsdWUgRU9GIDsKICAgICBwdWJsaWMgZmluYWwgRU9iamVjdCBlbnRyeVJ1bGVYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAgICAgICAgIEVPYmplY3QgY3VycmVudCA9IG51bGw7CiAKQEAgLTc3NjgsOCArODk2Miw4IEBACiAKIAogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjkyMTo2NDogKGl2X3J1bGVYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZT0gcnVsZVhBbm5vdGF0aW9uRWxlbWVudFZhbHVlIEVPRiApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyOTIyOjI6IGl2X3J1bGVYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZT0gcnVsZVhBbm5vdGF0aW9uRWxlbWVudFZhbHVlIEVPRgorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MzM2MDo2NDogKGl2X3J1bGVYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZT0gcnVsZVhBbm5vdGF0aW9uRWxlbWVudFZhbHVlIEVPRiApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzozMzYxOjI6IGl2X3J1bGVYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZT0gcnVsZVhBbm5vdGF0aW9uRWxlbWVudFZhbHVlIEVPRgogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBuZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0WEFubm90YXRpb25FbGVtZW50VmFsdWVSdWxlKCkpOyAKQEAgLTc4MDAsNyArODk5NCw3IEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZVhBbm5vdGF0aW9uRWxlbWVudFZhbHVlIgotICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI5Mjg6MTogcnVsZVhBbm5vdGF0aW9uRWxlbWVudFZhbHVlIHJldHVybnMgW0VPYmplY3QgY3VycmVudD1udWxsXSA6ICggKCAoICggKCAoKSAnIycgJ1snICkgKT0+ICggKCkgb3RoZXJsdl8xPSAnIycgb3RoZXJsdl8yPSAnWycgKSApICggKCAobHZfZWxlbWVudHNfM18wPSBydWxlWEFubm90YXRpb25PckV4cHJlc3Npb24gKSApIChvdGhlcmx2XzQ9ICcsJyAoIChsdl9lbGVtZW50c181XzA9IHJ1bGVYQW5ub3RhdGlvbk9yRXhwcmVzc2lvbiApICkgKSogKT8gb3RoZXJsdl82PSAnXScgKSB8IHRoaXNfWEFubm90YXRpb25PckV4cHJlc3Npb25fNz0gcnVsZVhBbm5vdGF0aW9uT3JFeHByZXNzaW9uICkgOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjMzNjc6MTogcnVsZVhBbm5vdGF0aW9uRWxlbWVudFZhbHVlIHJldHVybnMgW0VPYmplY3QgY3VycmVudD1udWxsXSA6ICggKCAoICggKCAoKSAnIycgJ1snICkgKT0+ICggKCkgb3RoZXJsdl8xPSAnIycgb3RoZXJsdl8yPSAnWycgKSApICggKCAobHZfZWxlbWVudHNfM18wPSBydWxlWEFubm90YXRpb25PckV4cHJlc3Npb24gKSApIChvdGhlcmx2XzQ9ICcsJyAoIChsdl9lbGVtZW50c181XzA9IHJ1bGVYQW5ub3RhdGlvbk9yRXhwcmVzc2lvbiApICkgKSogKT8gb3RoZXJsdl82PSAnXScgKSB8IHRoaXNfWEFubm90YXRpb25PckV4cHJlc3Npb25fNz0gcnVsZVhBbm5vdGF0aW9uT3JFeHByZXNzaW9uICkgOwogICAgIHB1YmxpYyBmaW5hbCBFT2JqZWN0IHJ1bGVYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAgICAgICAgIEVPYmplY3QgY3VycmVudCA9IG51bGw7CiAKQEAgLTc4MTksMjcgKzkwMTMsMjcgQEAKICAgICAgICAgCWVudGVyUnVsZSgpOwogCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyOTM0OjI6ICggKCAoICggKCAoICgpICcjJyAnWycgKSApPT4gKCAoKSBvdGhlcmx2XzE9ICcjJyBvdGhlcmx2XzI9ICdbJyApICkgKCAoIChsdl9lbGVtZW50c18zXzA9IHJ1bGVYQW5ub3RhdGlvbk9yRXhwcmVzc2lvbiApICkgKG90aGVybHZfND0gJywnICggKGx2X2VsZW1lbnRzXzVfMD0gcnVsZVhBbm5vdGF0aW9uT3JFeHByZXNzaW9uICkgKSApKiApPyBvdGhlcmx2XzY9ICddJyApIHwgdGhpc19YQW5ub3RhdGlvbk9yRXhwcmVzc2lvbl83PSBydWxlWEFubm90YXRpb25PckV4cHJlc3Npb24gKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyOTM1OjI6ICggKCAoICggKCAoKSAnIycgJ1snICkgKT0+ICggKCkgb3RoZXJsdl8xPSAnIycgb3RoZXJsdl8yPSAnWycgKSApICggKCAobHZfZWxlbWVudHNfM18wPSBydWxlWEFubm90YXRpb25PckV4cHJlc3Npb24gKSApIChvdGhlcmx2XzQ9ICcsJyAoIChsdl9lbGVtZW50c181XzA9IHJ1bGVYQW5ub3RhdGlvbk9yRXhwcmVzc2lvbiApICkgKSogKT8gb3RoZXJsdl82PSAnXScgKSB8IHRoaXNfWEFubm90YXRpb25PckV4cHJlc3Npb25fNz0gcnVsZVhBbm5vdGF0aW9uT3JFeHByZXNzaW9uICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjMzNzM6MjogKCAoICggKCAoICggKCkgJyMnICdbJyApICk9PiAoICgpIG90aGVybHZfMT0gJyMnIG90aGVybHZfMj0gJ1snICkgKSAoICggKGx2X2VsZW1lbnRzXzNfMD0gcnVsZVhBbm5vdGF0aW9uT3JFeHByZXNzaW9uICkgKSAob3RoZXJsdl80PSAnLCcgKCAobHZfZWxlbWVudHNfNV8wPSBydWxlWEFubm90YXRpb25PckV4cHJlc3Npb24gKSApICkqICk/IG90aGVybHZfNj0gJ10nICkgfCB0aGlzX1hBbm5vdGF0aW9uT3JFeHByZXNzaW9uXzc9IHJ1bGVYQW5ub3RhdGlvbk9yRXhwcmVzc2lvbiApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjMzNzQ6MjogKCAoICggKCAoICgpICcjJyAnWycgKSApPT4gKCAoKSBvdGhlcmx2XzE9ICcjJyBvdGhlcmx2XzI9ICdbJyApICkgKCAoIChsdl9lbGVtZW50c18zXzA9IHJ1bGVYQW5ub3RhdGlvbk9yRXhwcmVzc2lvbiApICkgKG90aGVybHZfND0gJywnICggKGx2X2VsZW1lbnRzXzVfMD0gcnVsZVhBbm5vdGF0aW9uT3JFeHByZXNzaW9uICkgKSApKiApPyBvdGhlcmx2XzY9ICddJyApIHwgdGhpc19YQW5ub3RhdGlvbk9yRXhwcmVzc2lvbl83PSBydWxlWEFubm90YXRpb25PckV4cHJlc3Npb24gKQogICAgICAgICAgICAgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjkzNToyOiAoICggKCAoICggKCkgJyMnICdbJyApICk9PiAoICgpIG90aGVybHZfMT0gJyMnIG90aGVybHZfMj0gJ1snICkgKSAoICggKGx2X2VsZW1lbnRzXzNfMD0gcnVsZVhBbm5vdGF0aW9uT3JFeHByZXNzaW9uICkgKSAob3RoZXJsdl80PSAnLCcgKCAobHZfZWxlbWVudHNfNV8wPSBydWxlWEFubm90YXRpb25PckV4cHJlc3Npb24gKSApICkqICk/IG90aGVybHZfNj0gJ10nICkgfCB0aGlzX1hBbm5vdGF0aW9uT3JFeHByZXNzaW9uXzc9IHJ1bGVYQW5ub3RhdGlvbk9yRXhwcmVzc2lvbiApCi0gICAgICAgICAgICBpbnQgYWx0NTM9MjsKLSAgICAgICAgICAgIGFsdDUzID0gZGZhNTMucHJlZGljdChpbnB1dCk7Ci0gICAgICAgICAgICBzd2l0Y2ggKGFsdDUzKSB7CisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzozMzc0OjI6ICggKCAoICggKCAoKSAnIycgJ1snICkgKT0+ICggKCkgb3RoZXJsdl8xPSAnIycgb3RoZXJsdl8yPSAnWycgKSApICggKCAobHZfZWxlbWVudHNfM18wPSBydWxlWEFubm90YXRpb25PckV4cHJlc3Npb24gKSApIChvdGhlcmx2XzQ9ICcsJyAoIChsdl9lbGVtZW50c181XzA9IHJ1bGVYQW5ub3RhdGlvbk9yRXhwcmVzc2lvbiApICkgKSogKT8gb3RoZXJsdl82PSAnXScgKSB8IHRoaXNfWEFubm90YXRpb25PckV4cHJlc3Npb25fNz0gcnVsZVhBbm5vdGF0aW9uT3JFeHByZXNzaW9uICkKKyAgICAgICAgICAgIGludCBhbHQ2ND0yOworICAgICAgICAgICAgYWx0NjQgPSBkZmE2NC5wcmVkaWN0KGlucHV0KTsKKyAgICAgICAgICAgIHN3aXRjaCAoYWx0NjQpIHsKICAgICAgICAgICAgICAgICBjYXNlIDEgOgotICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyOTM2OjM6ICggKCAoICggKCkgJyMnICdbJyApICk9PiAoICgpIG90aGVybHZfMT0gJyMnIG90aGVybHZfMj0gJ1snICkgKSAoICggKGx2X2VsZW1lbnRzXzNfMD0gcnVsZVhBbm5vdGF0aW9uT3JFeHByZXNzaW9uICkgKSAob3RoZXJsdl80PSAnLCcgKCAobHZfZWxlbWVudHNfNV8wPSBydWxlWEFubm90YXRpb25PckV4cHJlc3Npb24gKSApICkqICk/IG90aGVybHZfNj0gJ10nICkKKyAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MzM3NTozOiAoICggKCAoICgpICcjJyAnWycgKSApPT4gKCAoKSBvdGhlcmx2XzE9ICcjJyBvdGhlcmx2XzI9ICdbJyApICkgKCAoIChsdl9lbGVtZW50c18zXzA9IHJ1bGVYQW5ub3RhdGlvbk9yRXhwcmVzc2lvbiApICkgKG90aGVybHZfND0gJywnICggKGx2X2VsZW1lbnRzXzVfMD0gcnVsZVhBbm5vdGF0aW9uT3JFeHByZXNzaW9uICkgKSApKiApPyBvdGhlcmx2XzY9ICddJyApCiAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjkzNjozOiAoICggKCAoICgpICcjJyAnWycgKSApPT4gKCAoKSBvdGhlcmx2XzE9ICcjJyBvdGhlcmx2XzI9ICdbJyApICkgKCAoIChsdl9lbGVtZW50c18zXzA9IHJ1bGVYQW5ub3RhdGlvbk9yRXhwcmVzc2lvbiApICkgKG90aGVybHZfND0gJywnICggKGx2X2VsZW1lbnRzXzVfMD0gcnVsZVhBbm5vdGF0aW9uT3JFeHByZXNzaW9uICkgKSApKiApPyBvdGhlcmx2XzY9ICddJyApCi0gICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI5Mzc6NDogKCAoICggKCkgJyMnICdbJyApICk9PiAoICgpIG90aGVybHZfMT0gJyMnIG90aGVybHZfMj0gJ1snICkgKSAoICggKGx2X2VsZW1lbnRzXzNfMD0gcnVsZVhBbm5vdGF0aW9uT3JFeHByZXNzaW9uICkgKSAob3RoZXJsdl80PSAnLCcgKCAobHZfZWxlbWVudHNfNV8wPSBydWxlWEFubm90YXRpb25PckV4cHJlc3Npb24gKSApICkqICk/IG90aGVybHZfNj0gJ10nCisgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjMzNzU6MzogKCAoICggKCAoKSAnIycgJ1snICkgKT0+ICggKCkgb3RoZXJsdl8xPSAnIycgb3RoZXJsdl8yPSAnWycgKSApICggKCAobHZfZWxlbWVudHNfM18wPSBydWxlWEFubm90YXRpb25PckV4cHJlc3Npb24gKSApIChvdGhlcmx2XzQ9ICcsJyAoIChsdl9lbGVtZW50c181XzA9IHJ1bGVYQW5ub3RhdGlvbk9yRXhwcmVzc2lvbiApICkgKSogKT8gb3RoZXJsdl82PSAnXScgKQorICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzozMzc2OjQ6ICggKCAoICgpICcjJyAnWycgKSApPT4gKCAoKSBvdGhlcmx2XzE9ICcjJyBvdGhlcmx2XzI9ICdbJyApICkgKCAoIChsdl9lbGVtZW50c18zXzA9IHJ1bGVYQW5ub3RhdGlvbk9yRXhwcmVzc2lvbiApICkgKG90aGVybHZfND0gJywnICggKGx2X2VsZW1lbnRzXzVfMD0gcnVsZVhBbm5vdGF0aW9uT3JFeHByZXNzaW9uICkgKSApKiApPyBvdGhlcmx2XzY9ICddJwogICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI5Mzc6NDogKCAoICggKCkgJyMnICdbJyApICk9PiAoICgpIG90aGVybHZfMT0gJyMnIG90aGVybHZfMj0gJ1snICkgKQotICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyOTM4OjU6ICggKCAoKSAnIycgJ1snICkgKT0+ICggKCkgb3RoZXJsdl8xPSAnIycgb3RoZXJsdl8yPSAnWycgKQorICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzozMzc2OjQ6ICggKCAoICgpICcjJyAnWycgKSApPT4gKCAoKSBvdGhlcmx2XzE9ICcjJyBvdGhlcmx2XzI9ICdbJyApICkKKyAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MzM3Nzo1OiAoICggKCkgJyMnICdbJyApICk9PiAoICgpIG90aGVybHZfMT0gJyMnIG90aGVybHZfMj0gJ1snICkKICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyOTQ1OjU6ICggKCkgb3RoZXJsdl8xPSAnIycgb3RoZXJsdl8yPSAnWycgKQotICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyOTQ2OjY6ICgpIG90aGVybHZfMT0gJyMnIG90aGVybHZfMj0gJ1snCisgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjMzODQ6NTogKCAoKSBvdGhlcmx2XzE9ICcjJyBvdGhlcmx2XzI9ICdbJyApCisgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjMzODU6NjogKCkgb3RoZXJsdl8xPSAnIycgb3RoZXJsdl8yPSAnWycKICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyOTQ2OjY6ICgpCi0gICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI5NDc6NzogCisgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjMzODU6NjogKCkKKyAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MzM4Njo3OiAKICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKIApAQCAtNzg1MSwxMyArOTA0NSwxMyBAQAogCiAgICAgICAgICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgICAgICAgICBvdGhlcmx2XzE9KFRva2VuKW1hdGNoKGlucHV0LDc4LEZPTExPV182NSk7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OworICAgICAgICAgICAgICAgICAgICBvdGhlcmx2XzE9KFRva2VuKW1hdGNoKGlucHV0LDg1LEZPTExPV183OSk7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OwogICAgICAgICAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKIAogICAgICAgICAgICAgICAgICAgICAgIAkJCQkJCW5ld0xlYWZOb2RlKG90aGVybHZfMSwgZ3JhbW1hckFjY2Vzcy5nZXRYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZUFjY2VzcygpLmdldE51bWJlclNpZ25LZXl3b3JkXzBfMF8wXzEoKSk7CiAgICAgICAgICAgICAgICAgICAgICAgCQkJCQkKICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBvdGhlcmx2XzI9KFRva2VuKW1hdGNoKGlucHV0LDc5LEZPTExPV182Nik7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OworICAgICAgICAgICAgICAgICAgICBvdGhlcmx2XzI9KFRva2VuKW1hdGNoKGlucHV0LDg2LEZPTExPV184MCk7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OwogICAgICAgICAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKIAogICAgICAgICAgICAgICAgICAgICAgIAkJCQkJCW5ld0xlYWZOb2RlKG90aGVybHZfMiwgZ3JhbW1hckFjY2Vzcy5nZXRYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZUFjY2VzcygpLmdldExlZnRTcXVhcmVCcmFja2V0S2V5d29yZF8wXzBfMF8yKCkpOwpAQCAtNzg2OSwyOSArOTA2MywyOSBAQAogCiAgICAgICAgICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyOTYzOjQ6ICggKCAobHZfZWxlbWVudHNfM18wPSBydWxlWEFubm90YXRpb25PckV4cHJlc3Npb24gKSApIChvdGhlcmx2XzQ9ICcsJyAoIChsdl9lbGVtZW50c181XzA9IHJ1bGVYQW5ub3RhdGlvbk9yRXhwcmVzc2lvbiApICkgKSogKT8KLSAgICAgICAgICAgICAgICAgICAgaW50IGFsdDUyPTI7Ci0gICAgICAgICAgICAgICAgICAgIGludCBMQTUyXzAgPSBpbnB1dC5MQSgxKTsKKyAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MzQwMjo0OiAoICggKGx2X2VsZW1lbnRzXzNfMD0gcnVsZVhBbm5vdGF0aW9uT3JFeHByZXNzaW9uICkgKSAob3RoZXJsdl80PSAnLCcgKCAobHZfZWxlbWVudHNfNV8wPSBydWxlWEFubm90YXRpb25PckV4cHJlc3Npb24gKSApICkqICk/CisgICAgICAgICAgICAgICAgICAgIGludCBhbHQ2Mz0yOworICAgICAgICAgICAgICAgICAgICBpbnQgTEE2M18wID0gaW5wdXQuTEEoMSk7CiAKLSAgICAgICAgICAgICAgICAgICAgaWYgKCAoKExBNTJfMD49UlVMRV9TVFJJTkcgJiYgTEE1Ml8wPD1SVUxFX0RFQ0lNQUwpfHxMQTUyXzA9PTE1fHxMQTUyXzA9PTQ2fHxMQTUyXzA9PTY1fHwoTEE1Ml8wPj02OCAmJiBMQTUyXzA8PTY5KXx8KExBNTJfMD49NzMgJiYgTEE1Ml8wPD03NCl8fChMQTUyXzA+PTc4ICYmIExBNTJfMDw9NzkpfHxMQTUyXzA9PTg2fHwoTEE1Ml8wPj0xMDIgJiYgTEE1Ml8wPD0xMDMpfHxMQTUyXzA9PTEwN3x8TEE1Ml8wPT0xMTN8fExBNTJfMD09MTE1fHwoTEE1Ml8wPj0xMTkgJiYgTEE1Ml8wPD0xMjApfHwoTEE1Ml8wPj0xMjMgJiYgTEE1Ml8wPD0xMzIpfHxMQTUyXzA9PTEzNCkgKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBhbHQ1Mj0xOworICAgICAgICAgICAgICAgICAgICBpZiAoICgoTEE2M18wPj1SVUxFX1NUUklORyAmJiBMQTYzXzA8PVJVTEVfREVDSU1BTCl8fExBNjNfMD09MTV8fExBNjNfMD09NTB8fExBNjNfMD09NzJ8fChMQTYzXzA+PTc1ICYmIExBNjNfMDw9NzYpfHwoTEE2M18wPj04MCAmJiBMQTYzXzA8PTgxKXx8KExBNjNfMD49ODUgJiYgTEE2M18wPD04Nil8fExBNjNfMD09OTN8fChMQTYzXzA+PTEwOSAmJiBMQTYzXzA8PTExMCl8fExBNjNfMD09MTE0fHxMQTYzXzA9PTEyMHx8TEE2M18wPT0xMjJ8fChMQTYzXzA+PTEyNiAmJiBMQTYzXzA8PTEyNyl8fChMQTYzXzA+PTEzMCAmJiBMQTYzXzA8PTEzOSl8fExBNjNfMD09MTQxKSApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFsdDYzPTE7CiAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChhbHQ1MikgeworICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKGFsdDYzKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDEgOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI5NjQ6NTogKCAobHZfZWxlbWVudHNfM18wPSBydWxlWEFubm90YXRpb25PckV4cHJlc3Npb24gKSApIChvdGhlcmx2XzQ9ICcsJyAoIChsdl9lbGVtZW50c181XzA9IHJ1bGVYQW5ub3RhdGlvbk9yRXhwcmVzc2lvbiApICkgKSoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzozNDAzOjU6ICggKGx2X2VsZW1lbnRzXzNfMD0gcnVsZVhBbm5vdGF0aW9uT3JFeHByZXNzaW9uICkgKSAob3RoZXJsdl80PSAnLCcgKCAobHZfZWxlbWVudHNfNV8wPSBydWxlWEFubm90YXRpb25PckV4cHJlc3Npb24gKSApICkqCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI5NjQ6NTogKCAobHZfZWxlbWVudHNfM18wPSBydWxlWEFubm90YXRpb25PckV4cHJlc3Npb24gKSApCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6Mjk2NTo2OiAobHZfZWxlbWVudHNfM18wPSBydWxlWEFubm90YXRpb25PckV4cHJlc3Npb24gKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjM0MDM6NTogKCAobHZfZWxlbWVudHNfM18wPSBydWxlWEFubm90YXRpb25PckV4cHJlc3Npb24gKSApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MzQwNDo2OiAobHZfZWxlbWVudHNfM18wPSBydWxlWEFubm90YXRpb25PckV4cHJlc3Npb24gKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyOTY1OjY6IChsdl9lbGVtZW50c18zXzA9IHJ1bGVYQW5ub3RhdGlvbk9yRXhwcmVzc2lvbiApCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6Mjk2Njo3OiBsdl9lbGVtZW50c18zXzA9IHJ1bGVYQW5ub3RhdGlvbk9yRXhwcmVzc2lvbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjM0MDQ6NjogKGx2X2VsZW1lbnRzXzNfMD0gcnVsZVhBbm5vdGF0aW9uT3JFeHByZXNzaW9uICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzozNDA1Ojc6IGx2X2VsZW1lbnRzXzNfMD0gcnVsZVhBbm5vdGF0aW9uT3JFeHByZXNzaW9uCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAJCQkJCQkJbmV3Q29tcG9zaXRlTm9kZShncmFtbWFyQWNjZXNzLmdldFhBbm5vdGF0aW9uRWxlbWVudFZhbHVlQWNjZXNzKCkuZ2V0RWxlbWVudHNYQW5ub3RhdGlvbk9yRXhwcmVzc2lvblBhcnNlclJ1bGVDYWxsXzBfMV8wXzAoKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAJCQkJCQkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfNjcpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzgxKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsdl9lbGVtZW50c18zXzA9cnVsZVhBbm5vdGF0aW9uT3JFeHByZXNzaW9uKCk7CiAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZS5fZnNwLS07CkBAIC03OTE1LDM5ICs5MTA5LDM5IEBACiAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyOTgzOjU6IChvdGhlcmx2XzQ9ICcsJyAoIChsdl9lbGVtZW50c181XzA9IHJ1bGVYQW5ub3RhdGlvbk9yRXhwcmVzc2lvbiApICkgKSoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb29wNTE6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MzQyMjo1OiAob3RoZXJsdl80PSAnLCcgKCAobHZfZWxlbWVudHNfNV8wPSBydWxlWEFubm90YXRpb25PckV4cHJlc3Npb24gKSApICkqCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9vcDYyOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGFsdDUxPTI7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBMQTUxXzAgPSBpbnB1dC5MQSgxKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGFsdDYyPTI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBMQTYyXzAgPSBpbnB1dC5MQSgxKTsKIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIChMQTUxXzA9PTc1KSApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsdDUxPTE7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICggKExBNjJfMD09ODIpICkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWx0NjI9MTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogCiAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChhbHQ1MSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKGFsdDYyKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCWNhc2UgMSA6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgCSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyOTg0OjY6IG90aGVybHZfND0gJywnICggKGx2X2VsZW1lbnRzXzVfMD0gcnVsZVhBbm5vdGF0aW9uT3JFeHByZXNzaW9uICkgKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIAkgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MzQyMzo2OiBvdGhlcmx2XzQ9ICcsJyAoIChsdl9lbGVtZW50c181XzA9IHJ1bGVYQW5ub3RhdGlvbk9yRXhwcmVzc2lvbiApICkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAJICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAJICAgIG90aGVybHZfND0oVG9rZW4pbWF0Y2goaW5wdXQsNzUsRk9MTE9XXzY0KTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgCSAgICBvdGhlcmx2XzQ9KFRva2VuKW1hdGNoKGlucHV0LDgyLEZPTExPV183OCk7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIAkgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAJICAgICAgCQkJCQkJbmV3TGVhZk5vZGUob3RoZXJsdl80LCBncmFtbWFyQWNjZXNzLmdldFhBbm5vdGF0aW9uRWxlbWVudFZhbHVlQWNjZXNzKCkuZ2V0Q29tbWFLZXl3b3JkXzBfMV8xXzAoKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCSAgICAgIAkJCQkJCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCSAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgCSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyOTg4OjY6ICggKGx2X2VsZW1lbnRzXzVfMD0gcnVsZVhBbm5vdGF0aW9uT3JFeHByZXNzaW9uICkgKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIAkgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6Mjk4OTo3OiAobHZfZWxlbWVudHNfNV8wPSBydWxlWEFubm90YXRpb25PckV4cHJlc3Npb24gKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIAkgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MzQyNzo2OiAoIChsdl9lbGVtZW50c181XzA9IHJ1bGVYQW5ub3RhdGlvbk9yRXhwcmVzc2lvbiApICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAJICAgIC8vIEludGVybmFsRGF0YURTTC5nOjM0Mjg6NzogKGx2X2VsZW1lbnRzXzVfMD0gcnVsZVhBbm5vdGF0aW9uT3JFeHByZXNzaW9uICkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAJICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAJICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI5ODk6NzogKGx2X2VsZW1lbnRzXzVfMD0gcnVsZVhBbm5vdGF0aW9uT3JFeHByZXNzaW9uICkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAJICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI5OTA6ODogbHZfZWxlbWVudHNfNV8wPSBydWxlWEFubm90YXRpb25PckV4cHJlc3Npb24KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAJICAgIC8vIEludGVybmFsRGF0YURTTC5nOjM0Mjg6NzogKGx2X2VsZW1lbnRzXzVfMD0gcnVsZVhBbm5vdGF0aW9uT3JFeHByZXNzaW9uICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAJICAgIC8vIEludGVybmFsRGF0YURTTC5nOjM0Mjk6ODogbHZfZWxlbWVudHNfNV8wPSBydWxlWEFubm90YXRpb25PckV4cHJlc3Npb24KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAJICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAJICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCSAgICAgIAkJCQkJCQkJbmV3Q29tcG9zaXRlTm9kZShncmFtbWFyQWNjZXNzLmdldFhBbm5vdGF0aW9uRWxlbWVudFZhbHVlQWNjZXNzKCkuZ2V0RWxlbWVudHNYQW5ub3RhdGlvbk9yRXhwcmVzc2lvblBhcnNlclJ1bGVDYWxsXzBfMV8xXzFfMCgpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAJICAgICAgCQkJCQkJCQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIAkgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIAkgICAgcHVzaEZvbGxvdyhGT0xMT1dfNjcpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIAkgICAgcHVzaEZvbGxvdyhGT0xMT1dfODEpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIAkgICAgbHZfZWxlbWVudHNfNV8wPXJ1bGVYQW5ub3RhdGlvbk9yRXhwcmVzc2lvbigpOwogCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCSAgICBzdGF0ZS5fZnNwLS07CkBAIC03OTc2LDcgKzkxNzAsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIAkgICAgYnJlYWs7CiAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAJZGVmYXVsdCA6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgCSAgICBicmVhayBsb29wNTE7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgCSAgICBicmVhayBsb29wNjI7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IHdoaWxlICh0cnVlKTsKIApAQCAtNzk4Niw3ICs5MTgwLDcgQEAKIAogICAgICAgICAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgICAgICAgICAgb3RoZXJsdl82PShUb2tlbiltYXRjaChpbnB1dCw4MCxGT0xMT1dfMik7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OworICAgICAgICAgICAgICAgICAgICBvdGhlcmx2XzY9KFRva2VuKW1hdGNoKGlucHV0LDg3LEZPTExPV18yKTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7CiAgICAgICAgICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogCiAgICAgICAgICAgICAgICAgICAgICAgCQkJCW5ld0xlYWZOb2RlKG90aGVybHZfNiwgZ3JhbW1hckFjY2Vzcy5nZXRYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZUFjY2VzcygpLmdldFJpZ2h0U3F1YXJlQnJhY2tldEtleXdvcmRfMF8yKCkpOwpAQCAtNzk5OSw3ICs5MTkzLDcgQEAKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICBjYXNlIDIgOgotICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzozMDE1OjM6IHRoaXNfWEFubm90YXRpb25PckV4cHJlc3Npb25fNz0gcnVsZVhBbm5vdGF0aW9uT3JFeHByZXNzaW9uCisgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjM0NTQ6MzogdGhpc19YQW5ub3RhdGlvbk9yRXhwcmVzc2lvbl83PSBydWxlWEFubm90YXRpb25PckV4cHJlc3Npb24KICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKIApAQCAtODA0NSw3ICs5MjM5LDcgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJlbnRyeVJ1bGVYQW5ub3RhdGlvbk9yRXhwcmVzc2lvbiIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzozMDI3OjE6IGVudHJ5UnVsZVhBbm5vdGF0aW9uT3JFeHByZXNzaW9uIHJldHVybnMgW0VPYmplY3QgY3VycmVudD1udWxsXSA6IGl2X3J1bGVYQW5ub3RhdGlvbk9yRXhwcmVzc2lvbj0gcnVsZVhBbm5vdGF0aW9uT3JFeHByZXNzaW9uIEVPRiA7CisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MzQ2NjoxOiBlbnRyeVJ1bGVYQW5ub3RhdGlvbk9yRXhwcmVzc2lvbiByZXR1cm5zIFtFT2JqZWN0IGN1cnJlbnQ9bnVsbF0gOiBpdl9ydWxlWEFubm90YXRpb25PckV4cHJlc3Npb249IHJ1bGVYQW5ub3RhdGlvbk9yRXhwcmVzc2lvbiBFT0YgOwogICAgIHB1YmxpYyBmaW5hbCBFT2JqZWN0IGVudHJ5UnVsZVhBbm5vdGF0aW9uT3JFeHByZXNzaW9uKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKICAgICAgICAgRU9iamVjdCBjdXJyZW50ID0gbnVsbDsKIApAQCAtODA1Myw4ICs5MjQ3LDggQEAKIAogCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzozMDI3OjY0OiAoaXZfcnVsZVhBbm5vdGF0aW9uT3JFeHByZXNzaW9uPSBydWxlWEFubm90YXRpb25PckV4cHJlc3Npb24gRU9GICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjMwMjg6MjogaXZfcnVsZVhBbm5vdGF0aW9uT3JFeHByZXNzaW9uPSBydWxlWEFubm90YXRpb25PckV4cHJlc3Npb24gRU9GCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzozNDY2OjY0OiAoaXZfcnVsZVhBbm5vdGF0aW9uT3JFeHByZXNzaW9uPSBydWxlWEFubm90YXRpb25PckV4cHJlc3Npb24gRU9GICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjM0Njc6MjogaXZfcnVsZVhBbm5vdGF0aW9uT3JFeHByZXNzaW9uPSBydWxlWEFubm90YXRpb25PckV4cHJlc3Npb24gRU9GCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIG5ld0NvbXBvc2l0ZU5vZGUoZ3JhbW1hckFjY2Vzcy5nZXRYQW5ub3RhdGlvbk9yRXhwcmVzc2lvblJ1bGUoKSk7IApAQCAtODA4NSw3ICs5Mjc5LDcgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlWEFubm90YXRpb25PckV4cHJlc3Npb24iCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MzAzNDoxOiBydWxlWEFubm90YXRpb25PckV4cHJlc3Npb24gcmV0dXJucyBbRU9iamVjdCBjdXJyZW50PW51bGxdIDogKHRoaXNfWEFubm90YXRpb25fMD0gcnVsZVhBbm5vdGF0aW9uIHwgdGhpc19YRXhwcmVzc2lvbl8xPSBydWxlWEV4cHJlc3Npb24gKSA7CisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MzQ3MzoxOiBydWxlWEFubm90YXRpb25PckV4cHJlc3Npb24gcmV0dXJucyBbRU9iamVjdCBjdXJyZW50PW51bGxdIDogKHRoaXNfWEFubm90YXRpb25fMD0gcnVsZVhBbm5vdGF0aW9uIHwgdGhpc19YRXhwcmVzc2lvbl8xPSBydWxlWEV4cHJlc3Npb24gKSA7CiAgICAgcHVibGljIGZpbmFsIEVPYmplY3QgcnVsZVhBbm5vdGF0aW9uT3JFeHByZXNzaW9uKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKICAgICAgICAgRU9iamVjdCBjdXJyZW50ID0gbnVsbDsKIApAQCAtODA5OCwyOSArOTI5MiwyOSBAQAogICAgICAgICAJZW50ZXJSdWxlKCk7CiAKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjMwNDA6MjogKCAodGhpc19YQW5ub3RhdGlvbl8wPSBydWxlWEFubm90YXRpb24gfCB0aGlzX1hFeHByZXNzaW9uXzE9IHJ1bGVYRXhwcmVzc2lvbiApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjMwNDE6MjogKHRoaXNfWEFubm90YXRpb25fMD0gcnVsZVhBbm5vdGF0aW9uIHwgdGhpc19YRXhwcmVzc2lvbl8xPSBydWxlWEV4cHJlc3Npb24gKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MzQ3OToyOiAoICh0aGlzX1hBbm5vdGF0aW9uXzA9IHJ1bGVYQW5ub3RhdGlvbiB8IHRoaXNfWEV4cHJlc3Npb25fMT0gcnVsZVhFeHByZXNzaW9uICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MzQ4MDoyOiAodGhpc19YQW5ub3RhdGlvbl8wPSBydWxlWEFubm90YXRpb24gfCB0aGlzX1hFeHByZXNzaW9uXzE9IHJ1bGVYRXhwcmVzc2lvbiApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzozMDQxOjI6ICh0aGlzX1hBbm5vdGF0aW9uXzA9IHJ1bGVYQW5ub3RhdGlvbiB8IHRoaXNfWEV4cHJlc3Npb25fMT0gcnVsZVhFeHByZXNzaW9uICkKLSAgICAgICAgICAgIGludCBhbHQ1ND0yOwotICAgICAgICAgICAgaW50IExBNTRfMCA9IGlucHV0LkxBKDEpOworICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MzQ4MDoyOiAodGhpc19YQW5ub3RhdGlvbl8wPSBydWxlWEFubm90YXRpb24gfCB0aGlzX1hFeHByZXNzaW9uXzE9IHJ1bGVYRXhwcmVzc2lvbiApCisgICAgICAgICAgICBpbnQgYWx0NjU9MjsKKyAgICAgICAgICAgIGludCBMQTY1XzAgPSBpbnB1dC5MQSgxKTsKIAotICAgICAgICAgICAgaWYgKCAoTEE1NF8wPT03MykgKSB7Ci0gICAgICAgICAgICAgICAgYWx0NTQ9MTsKKyAgICAgICAgICAgIGlmICggKExBNjVfMD09ODApICkgeworICAgICAgICAgICAgICAgIGFsdDY1PTE7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIGlmICggKChMQTU0XzA+PVJVTEVfU1RSSU5HICYmIExBNTRfMDw9UlVMRV9ERUNJTUFMKXx8TEE1NF8wPT0xNXx8TEE1NF8wPT00Nnx8TEE1NF8wPT02NXx8KExBNTRfMD49NjggJiYgTEE1NF8wPD02OSl8fExBNTRfMD09NzR8fChMQTU0XzA+PTc4ICYmIExBNTRfMDw9NzkpfHxMQTU0XzA9PTg2fHwoTEE1NF8wPj0xMDIgJiYgTEE1NF8wPD0xMDMpfHxMQTU0XzA9PTEwN3x8TEE1NF8wPT0xMTN8fExBNTRfMD09MTE1fHwoTEE1NF8wPj0xMTkgJiYgTEE1NF8wPD0xMjApfHwoTEE1NF8wPj0xMjMgJiYgTEE1NF8wPD0xMzIpfHxMQTU0XzA9PTEzNCkgKSB7Ci0gICAgICAgICAgICAgICAgYWx0NTQ9MjsKKyAgICAgICAgICAgIGVsc2UgaWYgKCAoKExBNjVfMD49UlVMRV9TVFJJTkcgJiYgTEE2NV8wPD1SVUxFX0RFQ0lNQUwpfHxMQTY1XzA9PTE1fHxMQTY1XzA9PTUwfHxMQTY1XzA9PTcyfHwoTEE2NV8wPj03NSAmJiBMQTY1XzA8PTc2KXx8TEE2NV8wPT04MXx8KExBNjVfMD49ODUgJiYgTEE2NV8wPD04Nil8fExBNjVfMD09OTN8fChMQTY1XzA+PTEwOSAmJiBMQTY1XzA8PTExMCl8fExBNjVfMD09MTE0fHxMQTY1XzA9PTEyMHx8TEE2NV8wPT0xMjJ8fChMQTY1XzA+PTEyNiAmJiBMQTY1XzA8PTEyNyl8fChMQTY1XzA+PTEzMCAmJiBMQTY1XzA8PTEzOSl8fExBNjVfMD09MTQxKSApIHsKKyAgICAgICAgICAgICAgICBhbHQ2NT0yOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgaWYgKHN0YXRlLmJhY2t0cmFja2luZz4wKSB7c3RhdGUuZmFpbGVkPXRydWU7IHJldHVybiBjdXJyZW50O30KICAgICAgICAgICAgICAgICBOb1ZpYWJsZUFsdEV4Y2VwdGlvbiBudmFlID0KLSAgICAgICAgICAgICAgICAgICAgbmV3IE5vVmlhYmxlQWx0RXhjZXB0aW9uKCIiLCA1NCwgMCwgaW5wdXQpOworICAgICAgICAgICAgICAgICAgICBuZXcgTm9WaWFibGVBbHRFeGNlcHRpb24oIiIsIDY1LCAwLCBpbnB1dCk7CiAKICAgICAgICAgICAgICAgICB0aHJvdyBudmFlOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgc3dpdGNoIChhbHQ1NCkgeworICAgICAgICAgICAgc3dpdGNoIChhbHQ2NSkgewogICAgICAgICAgICAgICAgIGNhc2UgMSA6Ci0gICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjMwNDI6MzogdGhpc19YQW5ub3RhdGlvbl8wPSBydWxlWEFubm90YXRpb24KKyAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MzQ4MTozOiB0aGlzX1hBbm5vdGF0aW9uXzA9IHJ1bGVYQW5ub3RhdGlvbgogICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogCkBAIC04MTQyLDcgKzkzMzYsNyBAQAogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgIGNhc2UgMiA6Ci0gICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjMwNTE6MzogdGhpc19YRXhwcmVzc2lvbl8xPSBydWxlWEV4cHJlc3Npb24KKyAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MzQ5MDozOiB0aGlzX1hFeHByZXNzaW9uXzE9IHJ1bGVYRXhwcmVzc2lvbgogICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogCkBAIC04MTg4LDcgKzkzODIsNyBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgImVudHJ5UnVsZVhFeHByZXNzaW9uIgotICAgIC8vIEludGVybmFsRGF0YURTTC5nOjMwNjM6MTogZW50cnlSdWxlWEV4cHJlc3Npb24gcmV0dXJucyBbRU9iamVjdCBjdXJyZW50PW51bGxdIDogaXZfcnVsZVhFeHByZXNzaW9uPSBydWxlWEV4cHJlc3Npb24gRU9GIDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzozNTAyOjE6IGVudHJ5UnVsZVhFeHByZXNzaW9uIHJldHVybnMgW0VPYmplY3QgY3VycmVudD1udWxsXSA6IGl2X3J1bGVYRXhwcmVzc2lvbj0gcnVsZVhFeHByZXNzaW9uIEVPRiA7CiAgICAgcHVibGljIGZpbmFsIEVPYmplY3QgZW50cnlSdWxlWEV4cHJlc3Npb24oKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogICAgICAgICBFT2JqZWN0IGN1cnJlbnQgPSBudWxsOwogCkBAIC04MTk2LDggKzkzOTAsOCBAQAogCiAKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjMwNjM6NTI6IChpdl9ydWxlWEV4cHJlc3Npb249IHJ1bGVYRXhwcmVzc2lvbiBFT0YgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MzA2NDoyOiBpdl9ydWxlWEV4cHJlc3Npb249IHJ1bGVYRXhwcmVzc2lvbiBFT0YKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjM1MDI6NTI6IChpdl9ydWxlWEV4cHJlc3Npb249IHJ1bGVYRXhwcmVzc2lvbiBFT0YgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MzUwMzoyOiBpdl9ydWxlWEV4cHJlc3Npb249IHJ1bGVYRXhwcmVzc2lvbiBFT0YKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgbmV3Q29tcG9zaXRlTm9kZShncmFtbWFyQWNjZXNzLmdldFhFeHByZXNzaW9uUnVsZSgpKTsgCkBAIC04MjI4LDcgKzk0MjIsNyBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVYRXhwcmVzc2lvbiIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzozMDcwOjE6IHJ1bGVYRXhwcmVzc2lvbiByZXR1cm5zIFtFT2JqZWN0IGN1cnJlbnQ9bnVsbF0gOiB0aGlzX1hBc3NpZ25tZW50XzA9IHJ1bGVYQXNzaWdubWVudCA7CisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MzUwOToxOiBydWxlWEV4cHJlc3Npb24gcmV0dXJucyBbRU9iamVjdCBjdXJyZW50PW51bGxdIDogdGhpc19YQXNzaWdubWVudF8wPSBydWxlWEFzc2lnbm1lbnQgOwogICAgIHB1YmxpYyBmaW5hbCBFT2JqZWN0IHJ1bGVYRXhwcmVzc2lvbigpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAgICAgICAgIEVPYmplY3QgY3VycmVudCA9IG51bGw7CiAKQEAgLTgyMzksOCArOTQzMyw4IEBACiAgICAgICAgIAllbnRlclJ1bGUoKTsKIAogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MzA3NjoyOiAodGhpc19YQXNzaWdubWVudF8wPSBydWxlWEFzc2lnbm1lbnQgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MzA3NzoyOiB0aGlzX1hBc3NpZ25tZW50XzA9IHJ1bGVYQXNzaWdubWVudAorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MzUxNToyOiAodGhpc19YQXNzaWdubWVudF8wPSBydWxlWEFzc2lnbm1lbnQgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MzUxNjoyOiB0aGlzX1hBc3NpZ25tZW50XzA9IHJ1bGVYQXNzaWdubWVudAogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAKQEAgLTgyODAsNyArOTQ3NCw3IEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAiZW50cnlSdWxlWEFzc2lnbm1lbnQiCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MzA4ODoxOiBlbnRyeVJ1bGVYQXNzaWdubWVudCByZXR1cm5zIFtFT2JqZWN0IGN1cnJlbnQ9bnVsbF0gOiBpdl9ydWxlWEFzc2lnbm1lbnQ9IHJ1bGVYQXNzaWdubWVudCBFT0YgOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjM1Mjc6MTogZW50cnlSdWxlWEFzc2lnbm1lbnQgcmV0dXJucyBbRU9iamVjdCBjdXJyZW50PW51bGxdIDogaXZfcnVsZVhBc3NpZ25tZW50PSBydWxlWEFzc2lnbm1lbnQgRU9GIDsKICAgICBwdWJsaWMgZmluYWwgRU9iamVjdCBlbnRyeVJ1bGVYQXNzaWdubWVudCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAgICAgICAgIEVPYmplY3QgY3VycmVudCA9IG51bGw7CiAKQEAgLTgyODgsOCArOTQ4Miw4IEBACiAKIAogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MzA4ODo1MjogKGl2X3J1bGVYQXNzaWdubWVudD0gcnVsZVhBc3NpZ25tZW50IEVPRiApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzozMDg5OjI6IGl2X3J1bGVYQXNzaWdubWVudD0gcnVsZVhBc3NpZ25tZW50IEVPRgorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MzUyNzo1MjogKGl2X3J1bGVYQXNzaWdubWVudD0gcnVsZVhBc3NpZ25tZW50IEVPRiApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzozNTI4OjI6IGl2X3J1bGVYQXNzaWdubWVudD0gcnVsZVhBc3NpZ25tZW50IEVPRgogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBuZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0WEFzc2lnbm1lbnRSdWxlKCkpOyAKQEAgLTgzMjAsNyArOTUxNCw3IEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZVhBc3NpZ25tZW50IgotICAgIC8vIEludGVybmFsRGF0YURTTC5nOjMwOTU6MTogcnVsZVhBc3NpZ25tZW50IHJldHVybnMgW0VPYmplY3QgY3VycmVudD1udWxsXSA6ICggKCAoKSAoICggcnVsZUZlYXR1cmVDYWxsSUQgKSApIHJ1bGVPcFNpbmdsZUFzc2lnbiAoIChsdl92YWx1ZV8zXzA9IHJ1bGVYQXNzaWdubWVudCApICkgKSB8ICh0aGlzX1hPckV4cHJlc3Npb25fND0gcnVsZVhPckV4cHJlc3Npb24gKCAoICggKCAoKSAoICggcnVsZU9wTXVsdGlBc3NpZ24gKSApICkgKT0+ICggKCkgKCAoIHJ1bGVPcE11bHRpQXNzaWduICkgKSApICkgKCAobHZfcmlnaHRPcGVyYW5kXzdfMD0gcnVsZVhBc3NpZ25tZW50ICkgKSApPyApICkgOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjM1MzQ6MTogcnVsZVhBc3NpZ25tZW50IHJldHVybnMgW0VPYmplY3QgY3VycmVudD1udWxsXSA6ICggKCAoKSAoICggcnVsZUZlYXR1cmVDYWxsSUQgKSApIHJ1bGVPcFNpbmdsZUFzc2lnbiAoIChsdl92YWx1ZV8zXzA9IHJ1bGVYQXNzaWdubWVudCApICkgKSB8ICh0aGlzX1hPckV4cHJlc3Npb25fND0gcnVsZVhPckV4cHJlc3Npb24gKCAoICggKCAoKSAoICggcnVsZU9wTXVsdGlBc3NpZ24gKSApICkgKT0+ICggKCkgKCAoIHJ1bGVPcE11bHRpQXNzaWduICkgKSApICkgKCAobHZfcmlnaHRPcGVyYW5kXzdfMD0gcnVsZVhBc3NpZ25tZW50ICkgKSApPyApICkgOwogICAgIHB1YmxpYyBmaW5hbCBFT2JqZWN0IHJ1bGVYQXNzaWdubWVudCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAgICAgICAgIEVPYmplY3QgY3VycmVudCA9IG51bGw7CiAKQEAgLTgzMzUsMTAyICs5NTI5LDEwMiBAQAogICAgICAgICAJZW50ZXJSdWxlKCk7CiAKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjMxMDE6MjogKCAoICggKCkgKCAoIHJ1bGVGZWF0dXJlQ2FsbElEICkgKSBydWxlT3BTaW5nbGVBc3NpZ24gKCAobHZfdmFsdWVfM18wPSBydWxlWEFzc2lnbm1lbnQgKSApICkgfCAodGhpc19YT3JFeHByZXNzaW9uXzQ9IHJ1bGVYT3JFeHByZXNzaW9uICggKCAoICggKCkgKCAoIHJ1bGVPcE11bHRpQXNzaWduICkgKSApICk9PiAoICgpICggKCBydWxlT3BNdWx0aUFzc2lnbiApICkgKSApICggKGx2X3JpZ2h0T3BlcmFuZF83XzA9IHJ1bGVYQXNzaWdubWVudCApICkgKT8gKSApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjMxMDI6MjogKCAoICgpICggKCBydWxlRmVhdHVyZUNhbGxJRCApICkgcnVsZU9wU2luZ2xlQXNzaWduICggKGx2X3ZhbHVlXzNfMD0gcnVsZVhBc3NpZ25tZW50ICkgKSApIHwgKHRoaXNfWE9yRXhwcmVzc2lvbl80PSBydWxlWE9yRXhwcmVzc2lvbiAoICggKCAoICgpICggKCBydWxlT3BNdWx0aUFzc2lnbiApICkgKSApPT4gKCAoKSAoICggcnVsZU9wTXVsdGlBc3NpZ24gKSApICkgKSAoIChsdl9yaWdodE9wZXJhbmRfN18wPSBydWxlWEFzc2lnbm1lbnQgKSApICk/ICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MzU0MDoyOiAoICggKCAoKSAoICggcnVsZUZlYXR1cmVDYWxsSUQgKSApIHJ1bGVPcFNpbmdsZUFzc2lnbiAoIChsdl92YWx1ZV8zXzA9IHJ1bGVYQXNzaWdubWVudCApICkgKSB8ICh0aGlzX1hPckV4cHJlc3Npb25fND0gcnVsZVhPckV4cHJlc3Npb24gKCAoICggKCAoKSAoICggcnVsZU9wTXVsdGlBc3NpZ24gKSApICkgKT0+ICggKCkgKCAoIHJ1bGVPcE11bHRpQXNzaWduICkgKSApICkgKCAobHZfcmlnaHRPcGVyYW5kXzdfMD0gcnVsZVhBc3NpZ25tZW50ICkgKSApPyApICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MzU0MToyOiAoICggKCkgKCAoIHJ1bGVGZWF0dXJlQ2FsbElEICkgKSBydWxlT3BTaW5nbGVBc3NpZ24gKCAobHZfdmFsdWVfM18wPSBydWxlWEFzc2lnbm1lbnQgKSApICkgfCAodGhpc19YT3JFeHByZXNzaW9uXzQ9IHJ1bGVYT3JFeHByZXNzaW9uICggKCAoICggKCkgKCAoIHJ1bGVPcE11bHRpQXNzaWduICkgKSApICk9PiAoICgpICggKCBydWxlT3BNdWx0aUFzc2lnbiApICkgKSApICggKGx2X3JpZ2h0T3BlcmFuZF83XzA9IHJ1bGVYQXNzaWdubWVudCApICkgKT8gKSApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzozMTAyOjI6ICggKCAoKSAoICggcnVsZUZlYXR1cmVDYWxsSUQgKSApIHJ1bGVPcFNpbmdsZUFzc2lnbiAoIChsdl92YWx1ZV8zXzA9IHJ1bGVYQXNzaWdubWVudCApICkgKSB8ICh0aGlzX1hPckV4cHJlc3Npb25fND0gcnVsZVhPckV4cHJlc3Npb24gKCAoICggKCAoKSAoICggcnVsZU9wTXVsdGlBc3NpZ24gKSApICkgKT0+ICggKCkgKCAoIHJ1bGVPcE11bHRpQXNzaWduICkgKSApICkgKCAobHZfcmlnaHRPcGVyYW5kXzdfMD0gcnVsZVhBc3NpZ25tZW50ICkgKSApPyApICkKLSAgICAgICAgICAgIGludCBhbHQ1Nj0yOworICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MzU0MToyOiAoICggKCkgKCAoIHJ1bGVGZWF0dXJlQ2FsbElEICkgKSBydWxlT3BTaW5nbGVBc3NpZ24gKCAobHZfdmFsdWVfM18wPSBydWxlWEFzc2lnbm1lbnQgKSApICkgfCAodGhpc19YT3JFeHByZXNzaW9uXzQ9IHJ1bGVYT3JFeHByZXNzaW9uICggKCAoICggKCkgKCAoIHJ1bGVPcE11bHRpQXNzaWduICkgKSApICk9PiAoICgpICggKCBydWxlT3BNdWx0aUFzc2lnbiApICkgKSApICggKGx2X3JpZ2h0T3BlcmFuZF83XzA9IHJ1bGVYQXNzaWdubWVudCApICkgKT8gKSApCisgICAgICAgICAgICBpbnQgYWx0Njc9MjsKICAgICAgICAgICAgIHN3aXRjaCAoIGlucHV0LkxBKDEpICkgewogICAgICAgICAgICAgY2FzZSBSVUxFX0lEOgogICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpbnQgTEE1Nl8xID0gaW5wdXQuTEEoMik7CisgICAgICAgICAgICAgICAgaW50IExBNjdfMSA9IGlucHV0LkxBKDIpOwogCi0gICAgICAgICAgICAgICAgaWYgKCAoTEE1Nl8xPT03NykgKSB7Ci0gICAgICAgICAgICAgICAgICAgIGFsdDU2PTE7CisgICAgICAgICAgICAgICAgaWYgKCAoTEE2N18xPT1FT0Z8fChMQTY3XzE+PVJVTEVfU1RSSU5HICYmIExBNjdfMTw9UlVMRV9ERUNJTUFMKXx8KExBNjdfMT49MTUgJiYgTEE2N18xPD0xNil8fExBNjdfMT09NTB8fExBNjdfMT09Njh8fExBNjdfMT09NzJ8fChMQTY3XzE+PTc0ICYmIExBNjdfMTw9NzcpfHxMQTY3XzE9PTc5fHwoTEE2N18xPj04MSAmJiBMQTY3XzE8PTgzKXx8KExBNjdfMT49ODUgJiYgTEE2N18xPD0xMTgpfHwoTEE2N18xPj0xMjAgJiYgTEE2N18xPD0xNDIpKSApIHsKKyAgICAgICAgICAgICAgICAgICAgYWx0Njc9MjsKICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZSBpZiAoIChMQTU2XzE9PUVPRnx8KExBNTZfMT49UlVMRV9TVFJJTkcgJiYgTEE1Nl8xPD1SVUxFX0RFQ0lNQUwpfHwoTEE1Nl8xPj0xNSAmJiBMQTU2XzE8PTE2KXx8TEE1Nl8xPT00Nnx8TEE1Nl8xPT02MXx8TEE1Nl8xPT02NXx8KExBNTZfMT49NjcgJiYgTEE1Nl8xPD03MCl8fExBNTZfMT09NzJ8fChMQTU2XzE+PTc0ICYmIExBNTZfMTw9NzYpfHwoTEE1Nl8xPj03OCAmJiBMQTU2XzE8PTExMSl8fChMQTU2XzE+PTExMyAmJiBMQTU2XzE8PTEzNSkpICkgewotICAgICAgICAgICAgICAgICAgICBhbHQ1Nj0yOworICAgICAgICAgICAgICAgIGVsc2UgaWYgKCAoTEE2N18xPT04NCkgKSB7CisgICAgICAgICAgICAgICAgICAgIGFsdDY3PTE7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICBpZiAoc3RhdGUuYmFja3RyYWNraW5nPjApIHtzdGF0ZS5mYWlsZWQ9dHJ1ZTsgcmV0dXJuIGN1cnJlbnQ7fQogICAgICAgICAgICAgICAgICAgICBOb1ZpYWJsZUFsdEV4Y2VwdGlvbiBudmFlID0KLSAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBOb1ZpYWJsZUFsdEV4Y2VwdGlvbigiIiwgNTYsIDEsIGlucHV0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBOb1ZpYWJsZUFsdEV4Y2VwdGlvbigiIiwgNjcsIDEsIGlucHV0KTsKIAogICAgICAgICAgICAgICAgICAgICB0aHJvdyBudmFlOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIDEyMzoKKyAgICAgICAgICAgIGNhc2UgMTMwOgogICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpbnQgTEE1Nl8yID0gaW5wdXQuTEEoMik7CisgICAgICAgICAgICAgICAgaW50IExBNjdfMiA9IGlucHV0LkxBKDIpOwogCi0gICAgICAgICAgICAgICAgaWYgKCAoTEE1Nl8yPT1FT0Z8fChMQTU2XzI+PVJVTEVfU1RSSU5HICYmIExBNTZfMjw9UlVMRV9ERUNJTUFMKXx8KExBNTZfMj49MTUgJiYgTEE1Nl8yPD0xNil8fExBNTZfMj09NDZ8fExBNTZfMj09NjF8fExBNTZfMj09NjV8fChMQTU2XzI+PTY3ICYmIExBNTZfMjw9NzApfHxMQTU2XzI9PTcyfHwoTEE1Nl8yPj03NCAmJiBMQTU2XzI8PTc2KXx8KExBNTZfMj49NzggJiYgTEE1Nl8yPD0xMTEpfHwoTEE1Nl8yPj0xMTMgJiYgTEE1Nl8yPD0xMzUpKSApIHsKLSAgICAgICAgICAgICAgICAgICAgYWx0NTY9MjsKKyAgICAgICAgICAgICAgICBpZiAoIChMQTY3XzI9PUVPRnx8KExBNjdfMj49UlVMRV9TVFJJTkcgJiYgTEE2N18yPD1SVUxFX0RFQ0lNQUwpfHwoTEE2N18yPj0xNSAmJiBMQTY3XzI8PTE2KXx8TEE2N18yPT01MHx8TEE2N18yPT02OHx8TEE2N18yPT03Mnx8KExBNjdfMj49NzQgJiYgTEE2N18yPD03Nyl8fExBNjdfMj09Nzl8fChMQTY3XzI+PTgxICYmIExBNjdfMjw9ODMpfHwoTEE2N18yPj04NSAmJiBMQTY3XzI8PTExOCl8fChMQTY3XzI+PTEyMCAmJiBMQTY3XzI8PTE0MikpICkgeworICAgICAgICAgICAgICAgICAgICBhbHQ2Nz0yOwogICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlIGlmICggKExBNTZfMj09NzcpICkgewotICAgICAgICAgICAgICAgICAgICBhbHQ1Nj0xOworICAgICAgICAgICAgICAgIGVsc2UgaWYgKCAoTEE2N18yPT04NCkgKSB7CisgICAgICAgICAgICAgICAgICAgIGFsdDY3PTE7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICBpZiAoc3RhdGUuYmFja3RyYWNraW5nPjApIHtzdGF0ZS5mYWlsZWQ9dHJ1ZTsgcmV0dXJuIGN1cnJlbnQ7fQogICAgICAgICAgICAgICAgICAgICBOb1ZpYWJsZUFsdEV4Y2VwdGlvbiBudmFlID0KLSAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBOb1ZpYWJsZUFsdEV4Y2VwdGlvbigiIiwgNTYsIDIsIGlucHV0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBOb1ZpYWJsZUFsdEV4Y2VwdGlvbigiIiwgNjcsIDIsIGlucHV0KTsKIAogICAgICAgICAgICAgICAgICAgICB0aHJvdyBudmFlOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIDY5OgorICAgICAgICAgICAgY2FzZSA3NjoKICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaW50IExBNTZfMyA9IGlucHV0LkxBKDIpOworICAgICAgICAgICAgICAgIGludCBMQTY3XzMgPSBpbnB1dC5MQSgyKTsKIAotICAgICAgICAgICAgICAgIGlmICggKExBNTZfMz09NzcpICkgewotICAgICAgICAgICAgICAgICAgICBhbHQ1Nj0xOworICAgICAgICAgICAgICAgIGlmICggKExBNjdfMz09RU9GfHwoTEE2N18zPj1SVUxFX1NUUklORyAmJiBMQTY3XzM8PVJVTEVfREVDSU1BTCl8fChMQTY3XzM+PTE1ICYmIExBNjdfMzw9MTYpfHxMQTY3XzM9PTUwfHxMQTY3XzM9PTY4fHxMQTY3XzM9PTcyfHwoTEE2N18zPj03NCAmJiBMQTY3XzM8PTc3KXx8TEE2N18zPT03OXx8KExBNjdfMz49ODEgJiYgTEE2N18zPD04Myl8fChMQTY3XzM+PTg1ICYmIExBNjdfMzw9MTE4KXx8KExBNjdfMz49MTIwICYmIExBNjdfMzw9MTQyKSkgKSB7CisgICAgICAgICAgICAgICAgICAgIGFsdDY3PTI7CiAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UgaWYgKCAoTEE1Nl8zPT1FT0Z8fChMQTU2XzM+PVJVTEVfU1RSSU5HICYmIExBNTZfMzw9UlVMRV9ERUNJTUFMKXx8KExBNTZfMz49MTUgJiYgTEE1Nl8zPD0xNil8fExBNTZfMz09NDZ8fExBNTZfMz09NjF8fExBNTZfMz09NjV8fChMQTU2XzM+PTY3ICYmIExBNTZfMzw9NzApfHxMQTU2XzM9PTcyfHwoTEE1Nl8zPj03NCAmJiBMQTU2XzM8PTc2KXx8KExBNTZfMz49NzggJiYgTEE1Nl8zPD0xMTEpfHwoTEE1Nl8zPj0xMTMgJiYgTEE1Nl8zPD0xMzUpKSApIHsKLSAgICAgICAgICAgICAgICAgICAgYWx0NTY9MjsKKyAgICAgICAgICAgICAgICBlbHNlIGlmICggKExBNjdfMz09ODQpICkgeworICAgICAgICAgICAgICAgICAgICBhbHQ2Nz0xOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgaWYgKHN0YXRlLmJhY2t0cmFja2luZz4wKSB7c3RhdGUuZmFpbGVkPXRydWU7IHJldHVybiBjdXJyZW50O30KICAgICAgICAgICAgICAgICAgICAgTm9WaWFibGVBbHRFeGNlcHRpb24gbnZhZSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICBuZXcgTm9WaWFibGVBbHRFeGNlcHRpb24oIiIsIDU2LCAzLCBpbnB1dCk7CisgICAgICAgICAgICAgICAgICAgICAgICBuZXcgTm9WaWFibGVBbHRFeGNlcHRpb24oIiIsIDY3LCAzLCBpbnB1dCk7CiAKICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbnZhZTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSA2ODoKKyAgICAgICAgICAgIGNhc2UgNzU6CiAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGludCBMQTU2XzQgPSBpbnB1dC5MQSgyKTsKKyAgICAgICAgICAgICAgICBpbnQgTEE2N180ID0gaW5wdXQuTEEoMik7CiAKLSAgICAgICAgICAgICAgICBpZiAoIChMQTU2XzQ9PTc3KSApIHsKLSAgICAgICAgICAgICAgICAgICAgYWx0NTY9MTsKKyAgICAgICAgICAgICAgICBpZiAoIChMQTY3XzQ9PUVPRnx8KExBNjdfND49UlVMRV9TVFJJTkcgJiYgTEE2N180PD1SVUxFX0RFQ0lNQUwpfHwoTEE2N180Pj0xNSAmJiBMQTY3XzQ8PTE2KXx8TEE2N180PT01MHx8TEE2N180PT02OHx8TEE2N180PT03Mnx8KExBNjdfND49NzQgJiYgTEE2N180PD03Nyl8fExBNjdfND09Nzl8fChMQTY3XzQ+PTgxICYmIExBNjdfNDw9ODMpfHwoTEE2N180Pj04NSAmJiBMQTY3XzQ8PTExOCl8fChMQTY3XzQ+PTEyMCAmJiBMQTY3XzQ8PTE0MikpICkgeworICAgICAgICAgICAgICAgICAgICBhbHQ2Nz0yOwogICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlIGlmICggKExBNTZfND09RU9GfHwoTEE1Nl80Pj1SVUxFX1NUUklORyAmJiBMQTU2XzQ8PVJVTEVfREVDSU1BTCl8fChMQTU2XzQ+PTE1ICYmIExBNTZfNDw9MTYpfHxMQTU2XzQ9PTQ2fHxMQTU2XzQ9PTYxfHxMQTU2XzQ9PTY1fHwoTEE1Nl80Pj02NyAmJiBMQTU2XzQ8PTcwKXx8TEE1Nl80PT03Mnx8KExBNTZfND49NzQgJiYgTEE1Nl80PD03Nil8fChMQTU2XzQ+PTc4ICYmIExBNTZfNDw9MTExKXx8KExBNTZfND49MTEzICYmIExBNTZfNDw9MTM1KSkgKSB7Ci0gICAgICAgICAgICAgICAgICAgIGFsdDU2PTI7CisgICAgICAgICAgICAgICAgZWxzZSBpZiAoIChMQTY3XzQ9PTg0KSApIHsKKyAgICAgICAgICAgICAgICAgICAgYWx0Njc9MTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgIGlmIChzdGF0ZS5iYWNrdHJhY2tpbmc+MCkge3N0YXRlLmZhaWxlZD10cnVlOyByZXR1cm4gY3VycmVudDt9CiAgICAgICAgICAgICAgICAgICAgIE5vVmlhYmxlQWx0RXhjZXB0aW9uIG52YWUgPQotICAgICAgICAgICAgICAgICAgICAgICAgbmV3IE5vVmlhYmxlQWx0RXhjZXB0aW9uKCIiLCA1NiwgNCwgaW5wdXQpOworICAgICAgICAgICAgICAgICAgICAgICAgbmV3IE5vVmlhYmxlQWx0RXhjZXB0aW9uKCIiLCA2NywgNCwgaW5wdXQpOwogCiAgICAgICAgICAgICAgICAgICAgIHRocm93IG52YWU7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgNjU6CisgICAgICAgICAgICBjYXNlIDcyOgogICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpbnQgTEE1Nl81ID0gaW5wdXQuTEEoMik7CisgICAgICAgICAgICAgICAgaW50IExBNjdfNSA9IGlucHV0LkxBKDIpOwogCi0gICAgICAgICAgICAgICAgaWYgKCAoTEE1Nl81PT1FT0Z8fChMQTU2XzU+PVJVTEVfU1RSSU5HICYmIExBNTZfNTw9UlVMRV9ERUNJTUFMKXx8KExBNTZfNT49MTUgJiYgTEE1Nl81PD0xNil8fExBNTZfNT09NDZ8fExBNTZfNT09NjF8fExBNTZfNT09NjV8fChMQTU2XzU+PTY3ICYmIExBNTZfNTw9NzApfHxMQTU2XzU9PTcyfHwoTEE1Nl81Pj03NCAmJiBMQTU2XzU8PTc2KXx8KExBNTZfNT49NzggJiYgTEE1Nl81PD0xMTEpfHwoTEE1Nl81Pj0xMTMgJiYgTEE1Nl81PD0xMzUpKSApIHsKLSAgICAgICAgICAgICAgICAgICAgYWx0NTY9MjsKKyAgICAgICAgICAgICAgICBpZiAoIChMQTY3XzU9PUVPRnx8KExBNjdfNT49UlVMRV9TVFJJTkcgJiYgTEE2N181PD1SVUxFX0RFQ0lNQUwpfHwoTEE2N181Pj0xNSAmJiBMQTY3XzU8PTE2KXx8TEE2N181PT01MHx8TEE2N181PT02OHx8TEE2N181PT03Mnx8KExBNjdfNT49NzQgJiYgTEE2N181PD03Nyl8fExBNjdfNT09Nzl8fChMQTY3XzU+PTgxICYmIExBNjdfNTw9ODMpfHwoTEE2N181Pj04NSAmJiBMQTY3XzU8PTExOCl8fChMQTY3XzU+PTEyMCAmJiBMQTY3XzU8PTE0MikpICkgeworICAgICAgICAgICAgICAgICAgICBhbHQ2Nz0yOwogICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlIGlmICggKExBNTZfNT09NzcpICkgewotICAgICAgICAgICAgICAgICAgICBhbHQ1Nj0xOworICAgICAgICAgICAgICAgIGVsc2UgaWYgKCAoTEE2N181PT04NCkgKSB7CisgICAgICAgICAgICAgICAgICAgIGFsdDY3PTE7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICBpZiAoc3RhdGUuYmFja3RyYWNraW5nPjApIHtzdGF0ZS5mYWlsZWQ9dHJ1ZTsgcmV0dXJuIGN1cnJlbnQ7fQogICAgICAgICAgICAgICAgICAgICBOb1ZpYWJsZUFsdEV4Y2VwdGlvbiBudmFlID0KLSAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBOb1ZpYWJsZUFsdEV4Y2VwdGlvbigiIiwgNTYsIDUsIGlucHV0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBOb1ZpYWJsZUFsdEV4Y2VwdGlvbigiIiwgNjcsIDUsIGlucHV0KTsKIAogICAgICAgICAgICAgICAgICAgICB0aHJvdyBudmFlOwogICAgICAgICAgICAgICAgIH0KQEAgLTg0NDEsNDkgKzk2MzUsNDkgQEAKICAgICAgICAgICAgIGNhc2UgUlVMRV9IRVg6CiAgICAgICAgICAgICBjYXNlIFJVTEVfREVDSU1BTDoKICAgICAgICAgICAgIGNhc2UgMTU6Ci0gICAgICAgICAgICBjYXNlIDQ2OgotICAgICAgICAgICAgY2FzZSA3NDoKLSAgICAgICAgICAgIGNhc2UgNzg6Ci0gICAgICAgICAgICBjYXNlIDc5OgorICAgICAgICAgICAgY2FzZSA1MDoKKyAgICAgICAgICAgIGNhc2UgODE6CisgICAgICAgICAgICBjYXNlIDg1OgogICAgICAgICAgICAgY2FzZSA4NjoKLSAgICAgICAgICAgIGNhc2UgMTAyOgotICAgICAgICAgICAgY2FzZSAxMDM6Ci0gICAgICAgICAgICBjYXNlIDEwNzoKLSAgICAgICAgICAgIGNhc2UgMTEzOgotICAgICAgICAgICAgY2FzZSAxMTU6Ci0gICAgICAgICAgICBjYXNlIDExOToKKyAgICAgICAgICAgIGNhc2UgOTM6CisgICAgICAgICAgICBjYXNlIDEwOToKKyAgICAgICAgICAgIGNhc2UgMTEwOgorICAgICAgICAgICAgY2FzZSAxMTQ6CiAgICAgICAgICAgICBjYXNlIDEyMDoKLSAgICAgICAgICAgIGNhc2UgMTI0OgotICAgICAgICAgICAgY2FzZSAxMjU6CisgICAgICAgICAgICBjYXNlIDEyMjoKICAgICAgICAgICAgIGNhc2UgMTI2OgogICAgICAgICAgICAgY2FzZSAxMjc6Ci0gICAgICAgICAgICBjYXNlIDEyODoKLSAgICAgICAgICAgIGNhc2UgMTI5OgotICAgICAgICAgICAgY2FzZSAxMzA6CiAgICAgICAgICAgICBjYXNlIDEzMToKICAgICAgICAgICAgIGNhc2UgMTMyOgorICAgICAgICAgICAgY2FzZSAxMzM6CiAgICAgICAgICAgICBjYXNlIDEzNDoKKyAgICAgICAgICAgIGNhc2UgMTM1OgorICAgICAgICAgICAgY2FzZSAxMzY6CisgICAgICAgICAgICBjYXNlIDEzNzoKKyAgICAgICAgICAgIGNhc2UgMTM4OgorICAgICAgICAgICAgY2FzZSAxMzk6CisgICAgICAgICAgICBjYXNlIDE0MToKICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgYWx0NTY9MjsKKyAgICAgICAgICAgICAgICBhbHQ2Nz0yOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICAgICAgaWYgKHN0YXRlLmJhY2t0cmFja2luZz4wKSB7c3RhdGUuZmFpbGVkPXRydWU7IHJldHVybiBjdXJyZW50O30KICAgICAgICAgICAgICAgICBOb1ZpYWJsZUFsdEV4Y2VwdGlvbiBudmFlID0KLSAgICAgICAgICAgICAgICAgICAgbmV3IE5vVmlhYmxlQWx0RXhjZXB0aW9uKCIiLCA1NiwgMCwgaW5wdXQpOworICAgICAgICAgICAgICAgICAgICBuZXcgTm9WaWFibGVBbHRFeGNlcHRpb24oIiIsIDY3LCAwLCBpbnB1dCk7CiAKICAgICAgICAgICAgICAgICB0aHJvdyBudmFlOwogICAgICAgICAgICAgfQogCi0gICAgICAgICAgICBzd2l0Y2ggKGFsdDU2KSB7CisgICAgICAgICAgICBzd2l0Y2ggKGFsdDY3KSB7CiAgICAgICAgICAgICAgICAgY2FzZSAxIDoKLSAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MzEwMzozOiAoICgpICggKCBydWxlRmVhdHVyZUNhbGxJRCApICkgcnVsZU9wU2luZ2xlQXNzaWduICggKGx2X3ZhbHVlXzNfMD0gcnVsZVhBc3NpZ25tZW50ICkgKSApCisgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjM1NDI6MzogKCAoKSAoICggcnVsZUZlYXR1cmVDYWxsSUQgKSApIHJ1bGVPcFNpbmdsZUFzc2lnbiAoIChsdl92YWx1ZV8zXzA9IHJ1bGVYQXNzaWdubWVudCApICkgKQogICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjMxMDM6MzogKCAoKSAoICggcnVsZUZlYXR1cmVDYWxsSUQgKSApIHJ1bGVPcFNpbmdsZUFzc2lnbiAoIChsdl92YWx1ZV8zXzA9IHJ1bGVYQXNzaWdubWVudCApICkgKQotICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzozMTA0OjQ6ICgpICggKCBydWxlRmVhdHVyZUNhbGxJRCApICkgcnVsZU9wU2luZ2xlQXNzaWduICggKGx2X3ZhbHVlXzNfMD0gcnVsZVhBc3NpZ25tZW50ICkgKQorICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzozNTQyOjM6ICggKCkgKCAoIHJ1bGVGZWF0dXJlQ2FsbElEICkgKSBydWxlT3BTaW5nbGVBc3NpZ24gKCAobHZfdmFsdWVfM18wPSBydWxlWEFzc2lnbm1lbnQgKSApICkKKyAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MzU0Mzo0OiAoKSAoICggcnVsZUZlYXR1cmVDYWxsSUQgKSApIHJ1bGVPcFNpbmdsZUFzc2lnbiAoIChsdl92YWx1ZV8zXzA9IHJ1bGVYQXNzaWdubWVudCApICkKICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzozMTA0OjQ6ICgpCi0gICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjMxMDU6NTogCisgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjM1NDM6NDogKCkKKyAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MzU0NDo1OiAKICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKIApAQCAtODQ5NSwxMSArOTY4OSwxMSBAQAogCiAgICAgICAgICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzozMTExOjQ6ICggKCBydWxlRmVhdHVyZUNhbGxJRCApICkKLSAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MzExMjo1OiAoIHJ1bGVGZWF0dXJlQ2FsbElEICkKKyAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MzU1MDo0OiAoICggcnVsZUZlYXR1cmVDYWxsSUQgKSApCisgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjM1NTE6NTogKCBydWxlRmVhdHVyZUNhbGxJRCApCiAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MzExMjo1OiAoIHJ1bGVGZWF0dXJlQ2FsbElEICkKLSAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MzExMzo2OiBydWxlRmVhdHVyZUNhbGxJRAorICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzozNTUxOjU6ICggcnVsZUZlYXR1cmVDYWxsSUQgKQorICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzozNTUyOjY6IHJ1bGVGZWF0dXJlQ2FsbElECiAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAKQEAgLTg1MTMsNyArOTcwNyw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgCQkJCQkJbmV3Q29tcG9zaXRlTm9kZShncmFtbWFyQWNjZXNzLmdldFhBc3NpZ25tZW50QWNjZXNzKCkuZ2V0RmVhdHVyZUp2bUlkZW50aWZpYWJsZUVsZW1lbnRDcm9zc1JlZmVyZW5jZV8wXzFfMCgpKTsKICAgICAgICAgICAgICAgICAgICAgICAJCQkJCQogICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzYzKTsKKyAgICAgICAgICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfNzcpOwogICAgICAgICAgICAgICAgICAgICBydWxlRmVhdHVyZUNhbGxJRCgpOwogCiAgICAgICAgICAgICAgICAgICAgIHN0YXRlLl9mc3AtLTsKQEAgLTg1MzQsNyArOTcyOCw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgCQkJCW5ld0NvbXBvc2l0ZU5vZGUoZ3JhbW1hckFjY2Vzcy5nZXRYQXNzaWdubWVudEFjY2VzcygpLmdldE9wU2luZ2xlQXNzaWduUGFyc2VyUnVsZUNhbGxfMF8yKCkpOwogICAgICAgICAgICAgICAgICAgICAgIAkJCQogICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzY0KTsKKyAgICAgICAgICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfNzgpOwogICAgICAgICAgICAgICAgICAgICBydWxlT3BTaW5nbGVBc3NpZ24oKTsKIAogICAgICAgICAgICAgICAgICAgICBzdGF0ZS5fZnNwLS07CkBAIC04NTQ0LDExICs5NzM4LDExIEBACiAgICAgICAgICAgICAgICAgICAgICAgCQkJCWFmdGVyUGFyc2VyT3JFbnVtUnVsZUNhbGwoKTsKICAgICAgICAgICAgICAgICAgICAgICAJCQkKICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzozMTM0OjQ6ICggKGx2X3ZhbHVlXzNfMD0gcnVsZVhBc3NpZ25tZW50ICkgKQotICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzozMTM1OjU6IChsdl92YWx1ZV8zXzA9IHJ1bGVYQXNzaWdubWVudCApCisgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjM1NzM6NDogKCAobHZfdmFsdWVfM18wPSBydWxlWEFzc2lnbm1lbnQgKSApCisgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjM1NzQ6NTogKGx2X3ZhbHVlXzNfMD0gcnVsZVhBc3NpZ25tZW50ICkKICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzozMTM1OjU6IChsdl92YWx1ZV8zXzA9IHJ1bGVYQXNzaWdubWVudCApCi0gICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjMxMzY6NjogbHZfdmFsdWVfM18wPSBydWxlWEFzc2lnbm1lbnQKKyAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MzU3NDo1OiAobHZfdmFsdWVfM18wPSBydWxlWEFzc2lnbm1lbnQgKQorICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzozNTc1OjY6IGx2X3ZhbHVlXzNfMD0gcnVsZVhBc3NpZ25tZW50CiAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAKQEAgLTg1ODYsMTcgKzk3ODAsMTcgQEAKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICBjYXNlIDIgOgotICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzozMTU1OjM6ICh0aGlzX1hPckV4cHJlc3Npb25fND0gcnVsZVhPckV4cHJlc3Npb24gKCAoICggKCAoKSAoICggcnVsZU9wTXVsdGlBc3NpZ24gKSApICkgKT0+ICggKCkgKCAoIHJ1bGVPcE11bHRpQXNzaWduICkgKSApICkgKCAobHZfcmlnaHRPcGVyYW5kXzdfMD0gcnVsZVhBc3NpZ25tZW50ICkgKSApPyApCisgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjM1OTQ6MzogKHRoaXNfWE9yRXhwcmVzc2lvbl80PSBydWxlWE9yRXhwcmVzc2lvbiAoICggKCAoICgpICggKCBydWxlT3BNdWx0aUFzc2lnbiApICkgKSApPT4gKCAoKSAoICggcnVsZU9wTXVsdGlBc3NpZ24gKSApICkgKSAoIChsdl9yaWdodE9wZXJhbmRfN18wPSBydWxlWEFzc2lnbm1lbnQgKSApICk/ICkKICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzozMTU1OjM6ICh0aGlzX1hPckV4cHJlc3Npb25fND0gcnVsZVhPckV4cHJlc3Npb24gKCAoICggKCAoKSAoICggcnVsZU9wTXVsdGlBc3NpZ24gKSApICkgKT0+ICggKCkgKCAoIHJ1bGVPcE11bHRpQXNzaWduICkgKSApICkgKCAobHZfcmlnaHRPcGVyYW5kXzdfMD0gcnVsZVhBc3NpZ25tZW50ICkgKSApPyApCi0gICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjMxNTY6NDogdGhpc19YT3JFeHByZXNzaW9uXzQ9IHJ1bGVYT3JFeHByZXNzaW9uICggKCAoICggKCkgKCAoIHJ1bGVPcE11bHRpQXNzaWduICkgKSApICk9PiAoICgpICggKCBydWxlT3BNdWx0aUFzc2lnbiApICkgKSApICggKGx2X3JpZ2h0T3BlcmFuZF83XzA9IHJ1bGVYQXNzaWdubWVudCApICkgKT8KKyAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MzU5NDozOiAodGhpc19YT3JFeHByZXNzaW9uXzQ9IHJ1bGVYT3JFeHByZXNzaW9uICggKCAoICggKCkgKCAoIHJ1bGVPcE11bHRpQXNzaWduICkgKSApICk9PiAoICgpICggKCBydWxlT3BNdWx0aUFzc2lnbiApICkgKSApICggKGx2X3JpZ2h0T3BlcmFuZF83XzA9IHJ1bGVYQXNzaWdubWVudCApICkgKT8gKQorICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzozNTk1OjQ6IHRoaXNfWE9yRXhwcmVzc2lvbl80PSBydWxlWE9yRXhwcmVzc2lvbiAoICggKCAoICgpICggKCBydWxlT3BNdWx0aUFzc2lnbiApICkgKSApPT4gKCAoKSAoICggcnVsZU9wTXVsdGlBc3NpZ24gKSApICkgKSAoIChsdl9yaWdodE9wZXJhbmRfN18wPSBydWxlWEFzc2lnbm1lbnQgKSApICk/CiAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAKICAgICAgICAgICAgICAgICAgICAgICAJCQkJbmV3Q29tcG9zaXRlTm9kZShncmFtbWFyQWNjZXNzLmdldFhBc3NpZ25tZW50QWNjZXNzKCkuZ2V0WE9yRXhwcmVzc2lvblBhcnNlclJ1bGVDYWxsXzFfMCgpKTsKICAgICAgICAgICAgICAgICAgICAgICAJCQkKICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV182OSk7CisgICAgICAgICAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzgzKTsKICAgICAgICAgICAgICAgICAgICAgdGhpc19YT3JFeHByZXNzaW9uXzQ9cnVsZVhPckV4cHJlc3Npb24oKTsKIAogICAgICAgICAgICAgICAgICAgICBzdGF0ZS5fZnNwLS07CkBAIC04NjA3LDIxICs5ODAxLDIxIEBACiAgICAgICAgICAgICAgICAgICAgICAgCQkJCWFmdGVyUGFyc2VyT3JFbnVtUnVsZUNhbGwoKTsKICAgICAgICAgICAgICAgICAgICAgICAJCQkKICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzozMTY0OjQ6ICggKCAoICggKCkgKCAoIHJ1bGVPcE11bHRpQXNzaWduICkgKSApICk9PiAoICgpICggKCBydWxlT3BNdWx0aUFzc2lnbiApICkgKSApICggKGx2X3JpZ2h0T3BlcmFuZF83XzA9IHJ1bGVYQXNzaWdubWVudCApICkgKT8KLSAgICAgICAgICAgICAgICAgICAgaW50IGFsdDU1PTI7Ci0gICAgICAgICAgICAgICAgICAgIGFsdDU1ID0gZGZhNTUucHJlZGljdChpbnB1dCk7Ci0gICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoYWx0NTUpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MzYwMzo0OiAoICggKCAoICgpICggKCBydWxlT3BNdWx0aUFzc2lnbiApICkgKSApPT4gKCAoKSAoICggcnVsZU9wTXVsdGlBc3NpZ24gKSApICkgKSAoIChsdl9yaWdodE9wZXJhbmRfN18wPSBydWxlWEFzc2lnbm1lbnQgKSApICk/CisgICAgICAgICAgICAgICAgICAgIGludCBhbHQ2Nj0yOworICAgICAgICAgICAgICAgICAgICBhbHQ2NiA9IGRmYTY2LnByZWRpY3QoaW5wdXQpOworICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKGFsdDY2KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDEgOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjMxNjU6NTogKCAoICggKCkgKCAoIHJ1bGVPcE11bHRpQXNzaWduICkgKSApICk9PiAoICgpICggKCBydWxlT3BNdWx0aUFzc2lnbiApICkgKSApICggKGx2X3JpZ2h0T3BlcmFuZF83XzA9IHJ1bGVYQXNzaWdubWVudCApICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzozNjA0OjU6ICggKCAoICgpICggKCBydWxlT3BNdWx0aUFzc2lnbiApICkgKSApPT4gKCAoKSAoICggcnVsZU9wTXVsdGlBc3NpZ24gKSApICkgKSAoIChsdl9yaWdodE9wZXJhbmRfN18wPSBydWxlWEFzc2lnbm1lbnQgKSApCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjMxNjU6NTogKCAoICggKCkgKCAoIHJ1bGVPcE11bHRpQXNzaWduICkgKSApICk9PiAoICgpICggKCBydWxlT3BNdWx0aUFzc2lnbiApICkgKSApCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MzE2Njo2OiAoICggKCkgKCAoIHJ1bGVPcE11bHRpQXNzaWduICkgKSApICk9PiAoICgpICggKCBydWxlT3BNdWx0aUFzc2lnbiApICkgKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjM2MDQ6NTogKCAoICggKCkgKCAoIHJ1bGVPcE11bHRpQXNzaWduICkgKSApICk9PiAoICgpICggKCBydWxlT3BNdWx0aUFzc2lnbiApICkgKSApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MzYwNTo2OiAoICggKCkgKCAoIHJ1bGVPcE11bHRpQXNzaWduICkgKSApICk9PiAoICgpICggKCBydWxlT3BNdWx0aUFzc2lnbiApICkgKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzozMTc2OjY6ICggKCkgKCAoIHJ1bGVPcE11bHRpQXNzaWduICkgKSApCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MzE3Nzo3OiAoKSAoICggcnVsZU9wTXVsdGlBc3NpZ24gKSApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MzYxNTo2OiAoICgpICggKCBydWxlT3BNdWx0aUFzc2lnbiApICkgKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjM2MTY6NzogKCkgKCAoIHJ1bGVPcE11bHRpQXNzaWduICkgKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzozMTc3Ojc6ICgpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MzE3ODo4OiAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzozNjE2Ojc6ICgpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MzYxNzo4OiAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAKQEAgLTg2MzMsMTEgKzk4MjcsMTEgQEAKIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjMxODQ6NzogKCAoIHJ1bGVPcE11bHRpQXNzaWduICkgKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjMxODU6ODogKCBydWxlT3BNdWx0aUFzc2lnbiApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MzYyMzo3OiAoICggcnVsZU9wTXVsdGlBc3NpZ24gKSApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MzYyNDo4OiAoIHJ1bGVPcE11bHRpQXNzaWduICkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MzE4NTo4OiAoIHJ1bGVPcE11bHRpQXNzaWduICkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzozMTg2Ojk6IHJ1bGVPcE11bHRpQXNzaWduCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MzYyNDo4OiAoIHJ1bGVPcE11bHRpQXNzaWduICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzozNjI1Ojk6IHJ1bGVPcE11bHRpQXNzaWduCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogCkBAIC04NjUxLDcgKzk4NDUsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCQkJCQkJCQkJbmV3Q29tcG9zaXRlTm9kZShncmFtbWFyQWNjZXNzLmdldFhBc3NpZ25tZW50QWNjZXNzKCkuZ2V0RmVhdHVyZUp2bUlkZW50aWZpYWJsZUVsZW1lbnRDcm9zc1JlZmVyZW5jZV8xXzFfMF8wXzFfMCgpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAkJCQkJCQkJCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzY0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV183OCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcnVsZU9wTXVsdGlBc3NpZ24oKTsKIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlLl9mc3AtLTsKQEAgLTg2NzMsMTEgKzk4NjcsMTEgQEAKIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjMyMDI6NTogKCAobHZfcmlnaHRPcGVyYW5kXzdfMD0gcnVsZVhBc3NpZ25tZW50ICkgKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjMyMDM6NjogKGx2X3JpZ2h0T3BlcmFuZF83XzA9IHJ1bGVYQXNzaWdubWVudCApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MzY0MTo1OiAoIChsdl9yaWdodE9wZXJhbmRfN18wPSBydWxlWEFzc2lnbm1lbnQgKSApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MzY0Mjo2OiAobHZfcmlnaHRPcGVyYW5kXzdfMD0gcnVsZVhBc3NpZ25tZW50ICkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MzIwMzo2OiAobHZfcmlnaHRPcGVyYW5kXzdfMD0gcnVsZVhBc3NpZ25tZW50ICkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzozMjA0Ojc6IGx2X3JpZ2h0T3BlcmFuZF83XzA9IHJ1bGVYQXNzaWdubWVudAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjM2NDI6NjogKGx2X3JpZ2h0T3BlcmFuZF83XzA9IHJ1bGVYQXNzaWdubWVudCApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MzY0Mzo3OiBsdl9yaWdodE9wZXJhbmRfN18wPSBydWxlWEFzc2lnbm1lbnQKICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAKQEAgLTg3NDUsNyArOTkzOSw3IEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAiZW50cnlSdWxlT3BTaW5nbGVBc3NpZ24iCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MzIyNzoxOiBlbnRyeVJ1bGVPcFNpbmdsZUFzc2lnbiByZXR1cm5zIFtTdHJpbmcgY3VycmVudD1udWxsXSA6IGl2X3J1bGVPcFNpbmdsZUFzc2lnbj0gcnVsZU9wU2luZ2xlQXNzaWduIEVPRiA7CisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MzY2NjoxOiBlbnRyeVJ1bGVPcFNpbmdsZUFzc2lnbiByZXR1cm5zIFtTdHJpbmcgY3VycmVudD1udWxsXSA6IGl2X3J1bGVPcFNpbmdsZUFzc2lnbj0gcnVsZU9wU2luZ2xlQXNzaWduIEVPRiA7CiAgICAgcHVibGljIGZpbmFsIFN0cmluZyBlbnRyeVJ1bGVPcFNpbmdsZUFzc2lnbigpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAgICAgICAgIFN0cmluZyBjdXJyZW50ID0gbnVsbDsKIApAQCAtODc1Myw4ICs5OTQ3LDggQEAKIAogCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzozMjI3OjU0OiAoaXZfcnVsZU9wU2luZ2xlQXNzaWduPSBydWxlT3BTaW5nbGVBc3NpZ24gRU9GICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjMyMjg6MjogaXZfcnVsZU9wU2luZ2xlQXNzaWduPSBydWxlT3BTaW5nbGVBc3NpZ24gRU9GCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzozNjY2OjU0OiAoaXZfcnVsZU9wU2luZ2xlQXNzaWduPSBydWxlT3BTaW5nbGVBc3NpZ24gRU9GICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjM2Njc6MjogaXZfcnVsZU9wU2luZ2xlQXNzaWduPSBydWxlT3BTaW5nbGVBc3NpZ24gRU9GCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIG5ld0NvbXBvc2l0ZU5vZGUoZ3JhbW1hckFjY2Vzcy5nZXRPcFNpbmdsZUFzc2lnblJ1bGUoKSk7IApAQCAtODc4NSw3ICs5OTc5LDcgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlT3BTaW5nbGVBc3NpZ24iCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MzIzNDoxOiBydWxlT3BTaW5nbGVBc3NpZ24gcmV0dXJucyBbQW50bHJEYXRhdHlwZVJ1bGVUb2tlbiBjdXJyZW50PW5ldyBBbnRsckRhdGF0eXBlUnVsZVRva2VuKCldIDoga3c9ICc9JyA7CisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MzY3MzoxOiBydWxlT3BTaW5nbGVBc3NpZ24gcmV0dXJucyBbQW50bHJEYXRhdHlwZVJ1bGVUb2tlbiBjdXJyZW50PW5ldyBBbnRsckRhdGF0eXBlUnVsZVRva2VuKCldIDoga3c9ICc9JyA7CiAgICAgcHVibGljIGZpbmFsIEFudGxyRGF0YXR5cGVSdWxlVG9rZW4gcnVsZU9wU2luZ2xlQXNzaWduKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKICAgICAgICAgQW50bHJEYXRhdHlwZVJ1bGVUb2tlbiBjdXJyZW50ID0gbmV3IEFudGxyRGF0YXR5cGVSdWxlVG9rZW4oKTsKIApAQCAtODc5NSwxMCArOTk4OSwxMCBAQAogICAgICAgICAJZW50ZXJSdWxlKCk7CiAKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjMyNDA6MjogKGt3PSAnPScgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MzI0MToyOiBrdz0gJz0nCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzozNjc5OjI6IChrdz0gJz0nICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjM2ODA6Mjoga3c9ICc9JwogICAgICAgICAgICAgewotICAgICAgICAgICAga3c9KFRva2VuKW1hdGNoKGlucHV0LDc3LEZPTExPV18yKTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7CisgICAgICAgICAgICBrdz0oVG9rZW4pbWF0Y2goaW5wdXQsODQsRk9MTE9XXzIpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gY3VycmVudDsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogCiAgICAgICAgICAgICAgIAkJY3VycmVudC5tZXJnZShrdyk7CkBAIC04ODI3LDcgKzEwMDIxLDcgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJlbnRyeVJ1bGVPcE11bHRpQXNzaWduIgotICAgIC8vIEludGVybmFsRGF0YURTTC5nOjMyNDk6MTogZW50cnlSdWxlT3BNdWx0aUFzc2lnbiByZXR1cm5zIFtTdHJpbmcgY3VycmVudD1udWxsXSA6IGl2X3J1bGVPcE11bHRpQXNzaWduPSBydWxlT3BNdWx0aUFzc2lnbiBFT0YgOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjM2ODg6MTogZW50cnlSdWxlT3BNdWx0aUFzc2lnbiByZXR1cm5zIFtTdHJpbmcgY3VycmVudD1udWxsXSA6IGl2X3J1bGVPcE11bHRpQXNzaWduPSBydWxlT3BNdWx0aUFzc2lnbiBFT0YgOwogICAgIHB1YmxpYyBmaW5hbCBTdHJpbmcgZW50cnlSdWxlT3BNdWx0aUFzc2lnbigpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAgICAgICAgIFN0cmluZyBjdXJyZW50ID0gbnVsbDsKIApAQCAtODgzNSw4ICsxMDAyOSw4IEBACiAKIAogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MzI0OTo1MzogKGl2X3J1bGVPcE11bHRpQXNzaWduPSBydWxlT3BNdWx0aUFzc2lnbiBFT0YgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MzI1MDoyOiBpdl9ydWxlT3BNdWx0aUFzc2lnbj0gcnVsZU9wTXVsdGlBc3NpZ24gRU9GCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzozNjg4OjUzOiAoaXZfcnVsZU9wTXVsdGlBc3NpZ249IHJ1bGVPcE11bHRpQXNzaWduIEVPRiApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzozNjg5OjI6IGl2X3J1bGVPcE11bHRpQXNzaWduPSBydWxlT3BNdWx0aUFzc2lnbiBFT0YKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgbmV3Q29tcG9zaXRlTm9kZShncmFtbWFyQWNjZXNzLmdldE9wTXVsdGlBc3NpZ25SdWxlKCkpOyAKQEAgLTg4NjcsNyArMTAwNjEsNyBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVPcE11bHRpQXNzaWduIgotICAgIC8vIEludGVybmFsRGF0YURTTC5nOjMyNTY6MTogcnVsZU9wTXVsdGlBc3NpZ24gcmV0dXJucyBbQW50bHJEYXRhdHlwZVJ1bGVUb2tlbiBjdXJyZW50PW5ldyBBbnRsckRhdGF0eXBlUnVsZVRva2VuKCldIDogKGt3PSAnKz0nIHwga3c9ICctPScgfCBrdz0gJyo9JyB8IGt3PSAnLz0nIHwga3c9ICclPScgfCAoa3c9ICc8JyBrdz0gJzwnIGt3PSAnPScgKSB8IChrdz0gJz4nIChrdz0gJz4nICk/IGt3PSAnPj0nICkgKSA7CisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MzY5NToxOiBydWxlT3BNdWx0aUFzc2lnbiByZXR1cm5zIFtBbnRsckRhdGF0eXBlUnVsZVRva2VuIGN1cnJlbnQ9bmV3IEFudGxyRGF0YXR5cGVSdWxlVG9rZW4oKV0gOiAoa3c9ICcrPScgfCBrdz0gJy09JyB8IGt3PSAnKj0nIHwga3c9ICcvPScgfCBrdz0gJyU9JyB8IChrdz0gJzwnIGt3PSAnPCcga3c9ICc9JyApIHwgKGt3PSAnPicgKGt3PSAnPicgKT8ga3c9ICc+PScgKSApIDsKICAgICBwdWJsaWMgZmluYWwgQW50bHJEYXRhdHlwZVJ1bGVUb2tlbiBydWxlT3BNdWx0aUFzc2lnbigpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAgICAgICAgIEFudGxyRGF0YXR5cGVSdWxlVG9rZW4gY3VycmVudCA9IG5ldyBBbnRsckRhdGF0eXBlUnVsZVRva2VuKCk7CiAKQEAgLTg4NzcsNjAgKzEwMDcxLDYwIEBACiAgICAgICAgIAllbnRlclJ1bGUoKTsKIAogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MzI2MjoyOiAoIChrdz0gJys9JyB8IGt3PSAnLT0nIHwga3c9ICcqPScgfCBrdz0gJy89JyB8IGt3PSAnJT0nIHwgKGt3PSAnPCcga3c9ICc8JyBrdz0gJz0nICkgfCAoa3c9ICc+JyAoa3c9ICc+JyApPyBrdz0gJz49JyApICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MzI2MzoyOiAoa3c9ICcrPScgfCBrdz0gJy09JyB8IGt3PSAnKj0nIHwga3c9ICcvPScgfCBrdz0gJyU9JyB8IChrdz0gJzwnIGt3PSAnPCcga3c9ICc9JyApIHwgKGt3PSAnPicgKGt3PSAnPicgKT8ga3c9ICc+PScgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzozNzAxOjI6ICggKGt3PSAnKz0nIHwga3c9ICctPScgfCBrdz0gJyo9JyB8IGt3PSAnLz0nIHwga3c9ICclPScgfCAoa3c9ICc8JyBrdz0gJzwnIGt3PSAnPScgKSB8IChrdz0gJz4nIChrdz0gJz4nICk/IGt3PSAnPj0nICkgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzozNzAyOjI6IChrdz0gJys9JyB8IGt3PSAnLT0nIHwga3c9ICcqPScgfCBrdz0gJy89JyB8IGt3PSAnJT0nIHwgKGt3PSAnPCcga3c9ICc8JyBrdz0gJz0nICkgfCAoa3c9ICc+JyAoa3c9ICc+JyApPyBrdz0gJz49JyApICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjMyNjM6MjogKGt3PSAnKz0nIHwga3c9ICctPScgfCBrdz0gJyo9JyB8IGt3PSAnLz0nIHwga3c9ICclPScgfCAoa3c9ICc8JyBrdz0gJzwnIGt3PSAnPScgKSB8IChrdz0gJz4nIChrdz0gJz4nICk/IGt3PSAnPj0nICkgKQotICAgICAgICAgICAgaW50IGFsdDU4PTc7CisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzozNzAyOjI6IChrdz0gJys9JyB8IGt3PSAnLT0nIHwga3c9ICcqPScgfCBrdz0gJy89JyB8IGt3PSAnJT0nIHwgKGt3PSAnPCcga3c9ICc8JyBrdz0gJz0nICkgfCAoa3c9ICc+JyAoa3c9ICc+JyApPyBrdz0gJz49JyApICkKKyAgICAgICAgICAgIGludCBhbHQ2OT03OwogICAgICAgICAgICAgc3dpdGNoICggaW5wdXQuTEEoMSkgKSB7Ci0gICAgICAgICAgICBjYXNlIDgxOgorICAgICAgICAgICAgY2FzZSA4ODoKICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgYWx0NTg9MTsKKyAgICAgICAgICAgICAgICBhbHQ2OT0xOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgODI6CisgICAgICAgICAgICBjYXNlIDg5OgogICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBhbHQ1OD0yOworICAgICAgICAgICAgICAgIGFsdDY5PTI7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSA4MzoKKyAgICAgICAgICAgIGNhc2UgOTA6CiAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGFsdDU4PTM7CisgICAgICAgICAgICAgICAgYWx0Njk9MzsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIDg0OgorICAgICAgICAgICAgY2FzZSA5MToKICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgYWx0NTg9NDsKKyAgICAgICAgICAgICAgICBhbHQ2OT00OwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgODU6CisgICAgICAgICAgICBjYXNlIDkyOgogICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBhbHQ1OD01OworICAgICAgICAgICAgICAgIGFsdDY5PTU7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSA4NjoKKyAgICAgICAgICAgIGNhc2UgOTM6CiAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGFsdDU4PTY7CisgICAgICAgICAgICAgICAgYWx0Njk9NjsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIDg3OgorICAgICAgICAgICAgY2FzZSA5NDoKICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgYWx0NTg9NzsKKyAgICAgICAgICAgICAgICBhbHQ2OT03OwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICAgICAgaWYgKHN0YXRlLmJhY2t0cmFja2luZz4wKSB7c3RhdGUuZmFpbGVkPXRydWU7IHJldHVybiBjdXJyZW50O30KICAgICAgICAgICAgICAgICBOb1ZpYWJsZUFsdEV4Y2VwdGlvbiBudmFlID0KLSAgICAgICAgICAgICAgICAgICAgbmV3IE5vVmlhYmxlQWx0RXhjZXB0aW9uKCIiLCA1OCwgMCwgaW5wdXQpOworICAgICAgICAgICAgICAgICAgICBuZXcgTm9WaWFibGVBbHRFeGNlcHRpb24oIiIsIDY5LCAwLCBpbnB1dCk7CiAKICAgICAgICAgICAgICAgICB0aHJvdyBudmFlOwogICAgICAgICAgICAgfQogCi0gICAgICAgICAgICBzd2l0Y2ggKGFsdDU4KSB7CisgICAgICAgICAgICBzd2l0Y2ggKGFsdDY5KSB7CiAgICAgICAgICAgICAgICAgY2FzZSAxIDoKLSAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MzI2NDozOiBrdz0gJys9JworICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzozNzAzOjM6IGt3PSAnKz0nCiAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAga3c9KFRva2VuKW1hdGNoKGlucHV0LDgxLEZPTExPV18yKTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7CisgICAgICAgICAgICAgICAgICAgIGt3PShUb2tlbiltYXRjaChpbnB1dCw4OCxGT0xMT1dfMik7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OwogICAgICAgICAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKIAogICAgICAgICAgICAgICAgICAgICAgIAkJCWN1cnJlbnQubWVyZ2Uoa3cpOwpAQCAtODk0MSw5ICsxMDEzNSw5IEBACiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgY2FzZSAyIDoKLSAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MzI3MDozOiBrdz0gJy09JworICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzozNzA5OjM6IGt3PSAnLT0nCiAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAga3c9KFRva2VuKW1hdGNoKGlucHV0LDgyLEZPTExPV18yKTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7CisgICAgICAgICAgICAgICAgICAgIGt3PShUb2tlbiltYXRjaChpbnB1dCw4OSxGT0xMT1dfMik7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OwogICAgICAgICAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKIAogICAgICAgICAgICAgICAgICAgICAgIAkJCWN1cnJlbnQubWVyZ2Uoa3cpOwpAQCAtODk1NCw5ICsxMDE0OCw5IEBACiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgY2FzZSAzIDoKLSAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MzI3NjozOiBrdz0gJyo9JworICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzozNzE1OjM6IGt3PSAnKj0nCiAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAga3c9KFRva2VuKW1hdGNoKGlucHV0LDgzLEZPTExPV18yKTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7CisgICAgICAgICAgICAgICAgICAgIGt3PShUb2tlbiltYXRjaChpbnB1dCw5MCxGT0xMT1dfMik7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OwogICAgICAgICAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKIAogICAgICAgICAgICAgICAgICAgICAgIAkJCWN1cnJlbnQubWVyZ2Uoa3cpOwpAQCAtODk2Nyw5ICsxMDE2MSw5IEBACiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgY2FzZSA0IDoKLSAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MzI4MjozOiBrdz0gJy89JworICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzozNzIxOjM6IGt3PSAnLz0nCiAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAga3c9KFRva2VuKW1hdGNoKGlucHV0LDg0LEZPTExPV18yKTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7CisgICAgICAgICAgICAgICAgICAgIGt3PShUb2tlbiltYXRjaChpbnB1dCw5MSxGT0xMT1dfMik7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OwogICAgICAgICAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKIAogICAgICAgICAgICAgICAgICAgICAgIAkJCWN1cnJlbnQubWVyZ2Uoa3cpOwpAQCAtODk4MCw5ICsxMDE3NCw5IEBACiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgY2FzZSA1IDoKLSAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MzI4ODozOiBrdz0gJyU9JworICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzozNzI3OjM6IGt3PSAnJT0nCiAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAga3c9KFRva2VuKW1hdGNoKGlucHV0LDg1LEZPTExPV18yKTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7CisgICAgICAgICAgICAgICAgICAgIGt3PShUb2tlbiltYXRjaChpbnB1dCw5MixGT0xMT1dfMik7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OwogICAgICAgICAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKIAogICAgICAgICAgICAgICAgICAgICAgIAkJCWN1cnJlbnQubWVyZ2Uoa3cpOwpAQCAtODk5MywyNiArMTAxODcsMjYgQEAKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICBjYXNlIDYgOgotICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzozMjk0OjM6IChrdz0gJzwnIGt3PSAnPCcga3c9ICc9JyApCisgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjM3MzM6MzogKGt3PSAnPCcga3c9ICc8JyBrdz0gJz0nICkKICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzozMjk0OjM6IChrdz0gJzwnIGt3PSAnPCcga3c9ICc9JyApCi0gICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjMyOTU6NDoga3c9ICc8JyBrdz0gJzwnIGt3PSAnPScKKyAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MzczMzozOiAoa3c9ICc8JyBrdz0gJzwnIGt3PSAnPScgKQorICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzozNzM0OjQ6IGt3PSAnPCcga3c9ICc8JyBrdz0gJz0nCiAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAga3c9KFRva2VuKW1hdGNoKGlucHV0LDg2LEZPTExPV183MCk7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OworICAgICAgICAgICAgICAgICAgICBrdz0oVG9rZW4pbWF0Y2goaW5wdXQsOTMsRk9MTE9XXzg0KTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7CiAgICAgICAgICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogCiAgICAgICAgICAgICAgICAgICAgICAgCQkJCWN1cnJlbnQubWVyZ2Uoa3cpOwogICAgICAgICAgICAgICAgICAgICAgIAkJCQluZXdMZWFmTm9kZShrdywgZ3JhbW1hckFjY2Vzcy5nZXRPcE11bHRpQXNzaWduQWNjZXNzKCkuZ2V0TGVzc1RoYW5TaWduS2V5d29yZF81XzAoKSk7CiAgICAgICAgICAgICAgICAgICAgICAgCQkJCiAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAga3c9KFRva2VuKW1hdGNoKGlucHV0LDg2LEZPTExPV182Myk7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OworICAgICAgICAgICAgICAgICAgICBrdz0oVG9rZW4pbWF0Y2goaW5wdXQsOTMsRk9MTE9XXzc3KTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7CiAgICAgICAgICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogCiAgICAgICAgICAgICAgICAgICAgICAgCQkJCWN1cnJlbnQubWVyZ2Uoa3cpOwogICAgICAgICAgICAgICAgICAgICAgIAkJCQluZXdMZWFmTm9kZShrdywgZ3JhbW1hckFjY2Vzcy5nZXRPcE11bHRpQXNzaWduQWNjZXNzKCkuZ2V0TGVzc1RoYW5TaWduS2V5d29yZF81XzEoKSk7CiAgICAgICAgICAgICAgICAgICAgICAgCQkJCiAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAga3c9KFRva2VuKW1hdGNoKGlucHV0LDc3LEZPTExPV18yKTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7CisgICAgICAgICAgICAgICAgICAgIGt3PShUb2tlbiltYXRjaChpbnB1dCw4NCxGT0xMT1dfMik7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OwogICAgICAgICAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKIAogICAgICAgICAgICAgICAgICAgICAgIAkJCQljdXJyZW50Lm1lcmdlKGt3KTsKQEAgLTkwMjYsMzAgKzEwMjIwLDMwIEBACiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgY2FzZSA3IDoKLSAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MzMxMjozOiAoa3c9ICc+JyAoa3c9ICc+JyApPyBrdz0gJz49JyApCisgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjM3NTE6MzogKGt3PSAnPicgKGt3PSAnPicgKT8ga3c9ICc+PScgKQogICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjMzMTI6MzogKGt3PSAnPicgKGt3PSAnPicgKT8ga3c9ICc+PScgKQotICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzozMzEzOjQ6IGt3PSAnPicgKGt3PSAnPicgKT8ga3c9ICc+PScKKyAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6Mzc1MTozOiAoa3c9ICc+JyAoa3c9ICc+JyApPyBrdz0gJz49JyApCisgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjM3NTI6NDoga3c9ICc+JyAoa3c9ICc+JyApPyBrdz0gJz49JwogICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGt3PShUb2tlbiltYXRjaChpbnB1dCw4NyxGT0xMT1dfNzEpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gY3VycmVudDsKKyAgICAgICAgICAgICAgICAgICAga3c9KFRva2VuKW1hdGNoKGlucHV0LDk0LEZPTExPV184NSk7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OwogICAgICAgICAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKIAogICAgICAgICAgICAgICAgICAgICAgIAkJCQljdXJyZW50Lm1lcmdlKGt3KTsKICAgICAgICAgICAgICAgICAgICAgICAJCQkJbmV3TGVhZk5vZGUoa3csIGdyYW1tYXJBY2Nlc3MuZ2V0T3BNdWx0aUFzc2lnbkFjY2VzcygpLmdldEdyZWF0ZXJUaGFuU2lnbktleXdvcmRfNl8wKCkpOwogICAgICAgICAgICAgICAgICAgICAgIAkJCQogICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjMzMTg6NDogKGt3PSAnPicgKT8KLSAgICAgICAgICAgICAgICAgICAgaW50IGFsdDU3PTI7Ci0gICAgICAgICAgICAgICAgICAgIGludCBMQTU3XzAgPSBpbnB1dC5MQSgxKTsKKyAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6Mzc1Nzo0OiAoa3c9ICc+JyApPworICAgICAgICAgICAgICAgICAgICBpbnQgYWx0Njg9MjsKKyAgICAgICAgICAgICAgICAgICAgaW50IExBNjhfMCA9IGlucHV0LkxBKDEpOwogCi0gICAgICAgICAgICAgICAgICAgIGlmICggKExBNTdfMD09ODcpICkgewotICAgICAgICAgICAgICAgICAgICAgICAgYWx0NTc9MTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCAoTEE2OF8wPT05NCkgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBhbHQ2OD0xOwogICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoYWx0NTcpIHsKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChhbHQ2OCkgewogICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxIDoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzozMzE5OjU6IGt3PSAnPicKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzozNzU4OjU6IGt3PSAnPicKICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAga3c9KFRva2VuKW1hdGNoKGlucHV0LDg3LEZPTExPV183Mik7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGt3PShUb2tlbiltYXRjaChpbnB1dCw5NCxGT0xMT1dfODYpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gY3VycmVudDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCQkJCQljdXJyZW50Lm1lcmdlKGt3KTsKQEAgLTkwNjIsNyArMTAyNTYsNyBAQAogCiAgICAgICAgICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgICAgICAgICBrdz0oVG9rZW4pbWF0Y2goaW5wdXQsODgsRk9MTE9XXzIpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gY3VycmVudDsKKyAgICAgICAgICAgICAgICAgICAga3c9KFRva2VuKW1hdGNoKGlucHV0LDk1LEZPTExPV18yKTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7CiAgICAgICAgICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogCiAgICAgICAgICAgICAgICAgICAgICAgCQkJCWN1cnJlbnQubWVyZ2Uoa3cpOwpAQCAtOTEwMCw3ICsxMDI5NCw3IEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAiZW50cnlSdWxlWE9yRXhwcmVzc2lvbiIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzozMzM1OjE6IGVudHJ5UnVsZVhPckV4cHJlc3Npb24gcmV0dXJucyBbRU9iamVjdCBjdXJyZW50PW51bGxdIDogaXZfcnVsZVhPckV4cHJlc3Npb249IHJ1bGVYT3JFeHByZXNzaW9uIEVPRiA7CisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6Mzc3NDoxOiBlbnRyeVJ1bGVYT3JFeHByZXNzaW9uIHJldHVybnMgW0VPYmplY3QgY3VycmVudD1udWxsXSA6IGl2X3J1bGVYT3JFeHByZXNzaW9uPSBydWxlWE9yRXhwcmVzc2lvbiBFT0YgOwogICAgIHB1YmxpYyBmaW5hbCBFT2JqZWN0IGVudHJ5UnVsZVhPckV4cHJlc3Npb24oKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogICAgICAgICBFT2JqZWN0IGN1cnJlbnQgPSBudWxsOwogCkBAIC05MTA4LDggKzEwMzAyLDggQEAKIAogCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzozMzM1OjU0OiAoaXZfcnVsZVhPckV4cHJlc3Npb249IHJ1bGVYT3JFeHByZXNzaW9uIEVPRiApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzozMzM2OjI6IGl2X3J1bGVYT3JFeHByZXNzaW9uPSBydWxlWE9yRXhwcmVzc2lvbiBFT0YKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjM3NzQ6NTQ6IChpdl9ydWxlWE9yRXhwcmVzc2lvbj0gcnVsZVhPckV4cHJlc3Npb24gRU9GICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjM3NzU6MjogaXZfcnVsZVhPckV4cHJlc3Npb249IHJ1bGVYT3JFeHByZXNzaW9uIEVPRgogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBuZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0WE9yRXhwcmVzc2lvblJ1bGUoKSk7IApAQCAtOTE0MCw3ICsxMDMzNCw3IEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZVhPckV4cHJlc3Npb24iCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MzM0MjoxOiBydWxlWE9yRXhwcmVzc2lvbiByZXR1cm5zIFtFT2JqZWN0IGN1cnJlbnQ9bnVsbF0gOiAodGhpc19YQW5kRXhwcmVzc2lvbl8wPSBydWxlWEFuZEV4cHJlc3Npb24gKCAoICggKCAoKSAoICggcnVsZU9wT3IgKSApICkgKT0+ICggKCkgKCAoIHJ1bGVPcE9yICkgKSApICkgKCAobHZfcmlnaHRPcGVyYW5kXzNfMD0gcnVsZVhBbmRFeHByZXNzaW9uICkgKSApKiApIDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzozNzgxOjE6IHJ1bGVYT3JFeHByZXNzaW9uIHJldHVybnMgW0VPYmplY3QgY3VycmVudD1udWxsXSA6ICh0aGlzX1hBbmRFeHByZXNzaW9uXzA9IHJ1bGVYQW5kRXhwcmVzc2lvbiAoICggKCAoICgpICggKCBydWxlT3BPciApICkgKSApPT4gKCAoKSAoICggcnVsZU9wT3IgKSApICkgKSAoIChsdl9yaWdodE9wZXJhbmRfM18wPSBydWxlWEFuZEV4cHJlc3Npb24gKSApICkqICkgOwogICAgIHB1YmxpYyBmaW5hbCBFT2JqZWN0IHJ1bGVYT3JFeHByZXNzaW9uKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKICAgICAgICAgRU9iamVjdCBjdXJyZW50ID0gbnVsbDsKIApAQCAtOTE1MywxOCArMTAzNDcsMTggQEAKICAgICAgICAgCWVudGVyUnVsZSgpOwogCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzozMzQ4OjI6ICggKHRoaXNfWEFuZEV4cHJlc3Npb25fMD0gcnVsZVhBbmRFeHByZXNzaW9uICggKCAoICggKCkgKCAoIHJ1bGVPcE9yICkgKSApICk9PiAoICgpICggKCBydWxlT3BPciApICkgKSApICggKGx2X3JpZ2h0T3BlcmFuZF8zXzA9IHJ1bGVYQW5kRXhwcmVzc2lvbiApICkgKSogKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzozMzQ5OjI6ICh0aGlzX1hBbmRFeHByZXNzaW9uXzA9IHJ1bGVYQW5kRXhwcmVzc2lvbiAoICggKCAoICgpICggKCBydWxlT3BPciApICkgKSApPT4gKCAoKSAoICggcnVsZU9wT3IgKSApICkgKSAoIChsdl9yaWdodE9wZXJhbmRfM18wPSBydWxlWEFuZEV4cHJlc3Npb24gKSApICkqICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjM3ODc6MjogKCAodGhpc19YQW5kRXhwcmVzc2lvbl8wPSBydWxlWEFuZEV4cHJlc3Npb24gKCAoICggKCAoKSAoICggcnVsZU9wT3IgKSApICkgKT0+ICggKCkgKCAoIHJ1bGVPcE9yICkgKSApICkgKCAobHZfcmlnaHRPcGVyYW5kXzNfMD0gcnVsZVhBbmRFeHByZXNzaW9uICkgKSApKiApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjM3ODg6MjogKHRoaXNfWEFuZEV4cHJlc3Npb25fMD0gcnVsZVhBbmRFeHByZXNzaW9uICggKCAoICggKCkgKCAoIHJ1bGVPcE9yICkgKSApICk9PiAoICgpICggKCBydWxlT3BPciApICkgKSApICggKGx2X3JpZ2h0T3BlcmFuZF8zXzA9IHJ1bGVYQW5kRXhwcmVzc2lvbiApICkgKSogKQogICAgICAgICAgICAgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MzM0OToyOiAodGhpc19YQW5kRXhwcmVzc2lvbl8wPSBydWxlWEFuZEV4cHJlc3Npb24gKCAoICggKCAoKSAoICggcnVsZU9wT3IgKSApICkgKT0+ICggKCkgKCAoIHJ1bGVPcE9yICkgKSApICkgKCAobHZfcmlnaHRPcGVyYW5kXzNfMD0gcnVsZVhBbmRFeHByZXNzaW9uICkgKSApKiApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzozMzUwOjM6IHRoaXNfWEFuZEV4cHJlc3Npb25fMD0gcnVsZVhBbmRFeHByZXNzaW9uICggKCAoICggKCkgKCAoIHJ1bGVPcE9yICkgKSApICk9PiAoICgpICggKCBydWxlT3BPciApICkgKSApICggKGx2X3JpZ2h0T3BlcmFuZF8zXzA9IHJ1bGVYQW5kRXhwcmVzc2lvbiApICkgKSoKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjM3ODg6MjogKHRoaXNfWEFuZEV4cHJlc3Npb25fMD0gcnVsZVhBbmRFeHByZXNzaW9uICggKCAoICggKCkgKCAoIHJ1bGVPcE9yICkgKSApICk9PiAoICgpICggKCBydWxlT3BPciApICkgKSApICggKGx2X3JpZ2h0T3BlcmFuZF8zXzA9IHJ1bGVYQW5kRXhwcmVzc2lvbiApICkgKSogKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6Mzc4OTozOiB0aGlzX1hBbmRFeHByZXNzaW9uXzA9IHJ1bGVYQW5kRXhwcmVzc2lvbiAoICggKCAoICgpICggKCBydWxlT3BPciApICkgKSApPT4gKCAoKSAoICggcnVsZU9wT3IgKSApICkgKSAoIChsdl9yaWdodE9wZXJhbmRfM18wPSBydWxlWEFuZEV4cHJlc3Npb24gKSApICkqCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKIAogICAgICAgICAgICAgICAJCQluZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0WE9yRXhwcmVzc2lvbkFjY2VzcygpLmdldFhBbmRFeHByZXNzaW9uUGFyc2VyUnVsZUNhbGxfMCgpKTsKICAgICAgICAgICAgICAgCQkKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzczKTsKKyAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzg3KTsKICAgICAgICAgICAgIHRoaXNfWEFuZEV4cHJlc3Npb25fMD1ydWxlWEFuZEV4cHJlc3Npb24oKTsKIAogICAgICAgICAgICAgc3RhdGUuX2ZzcC0tOwpAQCAtOTE3NSwzNSArMTAzNjksMzUgQEAKICAgICAgICAgICAgICAgCQkJYWZ0ZXJQYXJzZXJPckVudW1SdWxlQ2FsbCgpOwogICAgICAgICAgICAgICAJCQogICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MzM1ODozOiAoICggKCAoICgpICggKCBydWxlT3BPciApICkgKSApPT4gKCAoKSAoICggcnVsZU9wT3IgKSApICkgKSAoIChsdl9yaWdodE9wZXJhbmRfM18wPSBydWxlWEFuZEV4cHJlc3Npb24gKSApICkqCi0gICAgICAgICAgICBsb29wNTk6CisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzozNzk3OjM6ICggKCAoICggKCkgKCAoIHJ1bGVPcE9yICkgKSApICk9PiAoICgpICggKCBydWxlT3BPciApICkgKSApICggKGx2X3JpZ2h0T3BlcmFuZF8zXzA9IHJ1bGVYQW5kRXhwcmVzc2lvbiApICkgKSoKKyAgICAgICAgICAgIGxvb3A3MDoKICAgICAgICAgICAgIGRvIHsKLSAgICAgICAgICAgICAgICBpbnQgYWx0NTk9MjsKLSAgICAgICAgICAgICAgICBpbnQgTEE1OV8wID0gaW5wdXQuTEEoMSk7CisgICAgICAgICAgICAgICAgaW50IGFsdDcwPTI7CisgICAgICAgICAgICAgICAgaW50IExBNzBfMCA9IGlucHV0LkxBKDEpOwogCi0gICAgICAgICAgICAgICAgaWYgKCAoTEE1OV8wPT04OSkgKSB7Ci0gICAgICAgICAgICAgICAgICAgIGludCBMQTU5XzIgPSBpbnB1dC5MQSgyKTsKKyAgICAgICAgICAgICAgICBpZiAoIChMQTcwXzA9PTk2KSApIHsKKyAgICAgICAgICAgICAgICAgICAgaW50IExBNzBfMiA9IGlucHV0LkxBKDIpOwogCiAgICAgICAgICAgICAgICAgICAgIGlmICggKHN5bnByZWQ4X0ludGVybmFsRGF0YURTTCgpKSApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGFsdDU5PTE7CisgICAgICAgICAgICAgICAgICAgICAgICBhbHQ3MD0xOwogICAgICAgICAgICAgICAgICAgICB9CiAKIAogICAgICAgICAgICAgICAgIH0KIAogCi0gICAgICAgICAgICAgICAgc3dpdGNoIChhbHQ1OSkgeworICAgICAgICAgICAgICAgIHN3aXRjaCAoYWx0NzApIHsKICAgICAgICAgICAgIAljYXNlIDEgOgotICAgICAgICAgICAgCSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzozMzU5OjQ6ICggKCAoICgpICggKCBydWxlT3BPciApICkgKSApPT4gKCAoKSAoICggcnVsZU9wT3IgKSApICkgKSAoIChsdl9yaWdodE9wZXJhbmRfM18wPSBydWxlWEFuZEV4cHJlc3Npb24gKSApCisgICAgICAgICAgICAJICAgIC8vIEludGVybmFsRGF0YURTTC5nOjM3OTg6NDogKCAoICggKCkgKCAoIHJ1bGVPcE9yICkgKSApICk9PiAoICgpICggKCBydWxlT3BPciApICkgKSApICggKGx2X3JpZ2h0T3BlcmFuZF8zXzA9IHJ1bGVYQW5kRXhwcmVzc2lvbiApICkKICAgICAgICAgICAgIAkgICAgewotICAgICAgICAgICAgCSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzozMzU5OjQ6ICggKCAoICgpICggKCBydWxlT3BPciApICkgKSApPT4gKCAoKSAoICggcnVsZU9wT3IgKSApICkgKQotICAgICAgICAgICAgCSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzozMzYwOjU6ICggKCAoKSAoICggcnVsZU9wT3IgKSApICkgKT0+ICggKCkgKCAoIHJ1bGVPcE9yICkgKSApCisgICAgICAgICAgICAJICAgIC8vIEludGVybmFsRGF0YURTTC5nOjM3OTg6NDogKCAoICggKCkgKCAoIHJ1bGVPcE9yICkgKSApICk9PiAoICgpICggKCBydWxlT3BPciApICkgKSApCisgICAgICAgICAgICAJICAgIC8vIEludGVybmFsRGF0YURTTC5nOjM3OTk6NTogKCAoICgpICggKCBydWxlT3BPciApICkgKSApPT4gKCAoKSAoICggcnVsZU9wT3IgKSApICkKICAgICAgICAgICAgIAkgICAgewotICAgICAgICAgICAgCSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzozMzcwOjU6ICggKCkgKCAoIHJ1bGVPcE9yICkgKSApCi0gICAgICAgICAgICAJICAgIC8vIEludGVybmFsRGF0YURTTC5nOjMzNzE6NjogKCkgKCAoIHJ1bGVPcE9yICkgKQorICAgICAgICAgICAgCSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzozODA5OjU6ICggKCkgKCAoIHJ1bGVPcE9yICkgKSApCisgICAgICAgICAgICAJICAgIC8vIEludGVybmFsRGF0YURTTC5nOjM4MTA6NjogKCkgKCAoIHJ1bGVPcE9yICkgKQogICAgICAgICAgICAgCSAgICB7Ci0gICAgICAgICAgICAJICAgIC8vIEludGVybmFsRGF0YURTTC5nOjMzNzE6NjogKCkKLSAgICAgICAgICAgIAkgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MzM3Mjo3OiAKKyAgICAgICAgICAgIAkgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MzgxMDo2OiAoKQorICAgICAgICAgICAgCSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzozODExOjc6IAogICAgICAgICAgICAgCSAgICB7CiAgICAgICAgICAgICAJICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogCkBAIC05MjE1LDExICsxMDQwOSwxMSBAQAogCiAgICAgICAgICAgICAJICAgIH0KIAotICAgICAgICAgICAgCSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzozMzc4OjY6ICggKCBydWxlT3BPciApICkKLSAgICAgICAgICAgIAkgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MzM3OTo3OiAoIHJ1bGVPcE9yICkKKyAgICAgICAgICAgIAkgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MzgxNzo2OiAoICggcnVsZU9wT3IgKSApCisgICAgICAgICAgICAJICAgIC8vIEludGVybmFsRGF0YURTTC5nOjM4MTg6NzogKCBydWxlT3BPciApCiAgICAgICAgICAgICAJICAgIHsKLSAgICAgICAgICAgIAkgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MzM3OTo3OiAoIHJ1bGVPcE9yICkKLSAgICAgICAgICAgIAkgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MzM4MDo4OiBydWxlT3BPcgorICAgICAgICAgICAgCSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzozODE4Ojc6ICggcnVsZU9wT3IgKQorICAgICAgICAgICAgCSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzozODE5Ojg6IHJ1bGVPcE9yCiAgICAgICAgICAgICAJICAgIHsKICAgICAgICAgICAgIAkgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAKQEAgLTkyMzMsNyArMTA0MjcsNyBAQAogICAgICAgICAgICAgCSAgICAgIAkJCQkJCQkJbmV3Q29tcG9zaXRlTm9kZShncmFtbWFyQWNjZXNzLmdldFhPckV4cHJlc3Npb25BY2Nlc3MoKS5nZXRGZWF0dXJlSnZtSWRlbnRpZmlhYmxlRWxlbWVudENyb3NzUmVmZXJlbmNlXzFfMF8wXzFfMCgpKTsKICAgICAgICAgICAgIAkgICAgICAJCQkJCQkJCiAgICAgICAgICAgICAJICAgIH0KLSAgICAgICAgICAgIAkgICAgcHVzaEZvbGxvdyhGT0xMT1dfNjQpOworICAgICAgICAgICAgCSAgICBwdXNoRm9sbG93KEZPTExPV183OCk7CiAgICAgICAgICAgICAJICAgIHJ1bGVPcE9yKCk7CiAKICAgICAgICAgICAgIAkgICAgc3RhdGUuX2ZzcC0tOwpAQCAtOTI1NSwxOCArMTA0NDksMTggQEAKIAogICAgICAgICAgICAgCSAgICB9CiAKLSAgICAgICAgICAgIAkgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MzM5Njo0OiAoIChsdl9yaWdodE9wZXJhbmRfM18wPSBydWxlWEFuZEV4cHJlc3Npb24gKSApCi0gICAgICAgICAgICAJICAgIC8vIEludGVybmFsRGF0YURTTC5nOjMzOTc6NTogKGx2X3JpZ2h0T3BlcmFuZF8zXzA9IHJ1bGVYQW5kRXhwcmVzc2lvbiApCisgICAgICAgICAgICAJICAgIC8vIEludGVybmFsRGF0YURTTC5nOjM4MzU6NDogKCAobHZfcmlnaHRPcGVyYW5kXzNfMD0gcnVsZVhBbmRFeHByZXNzaW9uICkgKQorICAgICAgICAgICAgCSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzozODM2OjU6IChsdl9yaWdodE9wZXJhbmRfM18wPSBydWxlWEFuZEV4cHJlc3Npb24gKQogICAgICAgICAgICAgCSAgICB7Ci0gICAgICAgICAgICAJICAgIC8vIEludGVybmFsRGF0YURTTC5nOjMzOTc6NTogKGx2X3JpZ2h0T3BlcmFuZF8zXzA9IHJ1bGVYQW5kRXhwcmVzc2lvbiApCi0gICAgICAgICAgICAJICAgIC8vIEludGVybmFsRGF0YURTTC5nOjMzOTg6NjogbHZfcmlnaHRPcGVyYW5kXzNfMD0gcnVsZVhBbmRFeHByZXNzaW9uCisgICAgICAgICAgICAJICAgIC8vIEludGVybmFsRGF0YURTTC5nOjM4MzY6NTogKGx2X3JpZ2h0T3BlcmFuZF8zXzA9IHJ1bGVYQW5kRXhwcmVzc2lvbiApCisgICAgICAgICAgICAJICAgIC8vIEludGVybmFsRGF0YURTTC5nOjM4Mzc6NjogbHZfcmlnaHRPcGVyYW5kXzNfMD0gcnVsZVhBbmRFeHByZXNzaW9uCiAgICAgICAgICAgICAJICAgIHsKICAgICAgICAgICAgIAkgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAKICAgICAgICAgICAgIAkgICAgICAJCQkJCQluZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0WE9yRXhwcmVzc2lvbkFjY2VzcygpLmdldFJpZ2h0T3BlcmFuZFhBbmRFeHByZXNzaW9uUGFyc2VyUnVsZUNhbGxfMV8xXzAoKSk7CiAgICAgICAgICAgICAJICAgICAgCQkJCQkKICAgICAgICAgICAgIAkgICAgfQotICAgICAgICAgICAgCSAgICBwdXNoRm9sbG93KEZPTExPV183Myk7CisgICAgICAgICAgICAJICAgIHB1c2hGb2xsb3coRk9MTE9XXzg3KTsKICAgICAgICAgICAgIAkgICAgbHZfcmlnaHRPcGVyYW5kXzNfMD1ydWxlWEFuZEV4cHJlc3Npb24oKTsKIAogICAgICAgICAgICAgCSAgICBzdGF0ZS5fZnNwLS07CkBAIC05Mjk1LDcgKzEwNDg5LDcgQEAKICAgICAgICAgICAgIAkgICAgYnJlYWs7CiAKICAgICAgICAgICAgIAlkZWZhdWx0IDoKLSAgICAgICAgICAgIAkgICAgYnJlYWsgbG9vcDU5OworICAgICAgICAgICAgCSAgICBicmVhayBsb29wNzA7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfSB3aGlsZSAodHJ1ZSk7CiAKQEAgLTkzMjQsNyArMTA1MTgsNyBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgImVudHJ5UnVsZU9wT3IiCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MzQyMDoxOiBlbnRyeVJ1bGVPcE9yIHJldHVybnMgW1N0cmluZyBjdXJyZW50PW51bGxdIDogaXZfcnVsZU9wT3I9IHJ1bGVPcE9yIEVPRiA7CisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6Mzg1OToxOiBlbnRyeVJ1bGVPcE9yIHJldHVybnMgW1N0cmluZyBjdXJyZW50PW51bGxdIDogaXZfcnVsZU9wT3I9IHJ1bGVPcE9yIEVPRiA7CiAgICAgcHVibGljIGZpbmFsIFN0cmluZyBlbnRyeVJ1bGVPcE9yKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKICAgICAgICAgU3RyaW5nIGN1cnJlbnQgPSBudWxsOwogCkBAIC05MzMyLDggKzEwNTI2LDggQEAKIAogCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzozNDIwOjQ0OiAoaXZfcnVsZU9wT3I9IHJ1bGVPcE9yIEVPRiApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzozNDIxOjI6IGl2X3J1bGVPcE9yPSBydWxlT3BPciBFT0YKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjM4NTk6NDQ6IChpdl9ydWxlT3BPcj0gcnVsZU9wT3IgRU9GICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjM4NjA6MjogaXZfcnVsZU9wT3I9IHJ1bGVPcE9yIEVPRgogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBuZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0T3BPclJ1bGUoKSk7IApAQCAtOTM2NCw3ICsxMDU1OCw3IEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZU9wT3IiCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MzQyNzoxOiBydWxlT3BPciByZXR1cm5zIFtBbnRsckRhdGF0eXBlUnVsZVRva2VuIGN1cnJlbnQ9bmV3IEFudGxyRGF0YXR5cGVSdWxlVG9rZW4oKV0gOiBrdz0gJ3x8JyA7CisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6Mzg2NjoxOiBydWxlT3BPciByZXR1cm5zIFtBbnRsckRhdGF0eXBlUnVsZVRva2VuIGN1cnJlbnQ9bmV3IEFudGxyRGF0YXR5cGVSdWxlVG9rZW4oKV0gOiBrdz0gJ3x8JyA7CiAgICAgcHVibGljIGZpbmFsIEFudGxyRGF0YXR5cGVSdWxlVG9rZW4gcnVsZU9wT3IoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogICAgICAgICBBbnRsckRhdGF0eXBlUnVsZVRva2VuIGN1cnJlbnQgPSBuZXcgQW50bHJEYXRhdHlwZVJ1bGVUb2tlbigpOwogCkBAIC05Mzc0LDEwICsxMDU2OCwxMCBAQAogICAgICAgICAJZW50ZXJSdWxlKCk7CiAKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjM0MzM6MjogKGt3PSAnfHwnICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjM0MzQ6Mjoga3c9ICd8fCcKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjM4NzI6MjogKGt3PSAnfHwnICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjM4NzM6Mjoga3c9ICd8fCcKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIGt3PShUb2tlbiltYXRjaChpbnB1dCw4OSxGT0xMT1dfMik7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OworICAgICAgICAgICAga3c9KFRva2VuKW1hdGNoKGlucHV0LDk2LEZPTExPV18yKTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKIAogICAgICAgICAgICAgICAJCWN1cnJlbnQubWVyZ2Uoa3cpOwpAQCAtOTQwNiw3ICsxMDYwMCw3IEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAiZW50cnlSdWxlWEFuZEV4cHJlc3Npb24iCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MzQ0MjoxOiBlbnRyeVJ1bGVYQW5kRXhwcmVzc2lvbiByZXR1cm5zIFtFT2JqZWN0IGN1cnJlbnQ9bnVsbF0gOiBpdl9ydWxlWEFuZEV4cHJlc3Npb249IHJ1bGVYQW5kRXhwcmVzc2lvbiBFT0YgOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjM4ODE6MTogZW50cnlSdWxlWEFuZEV4cHJlc3Npb24gcmV0dXJucyBbRU9iamVjdCBjdXJyZW50PW51bGxdIDogaXZfcnVsZVhBbmRFeHByZXNzaW9uPSBydWxlWEFuZEV4cHJlc3Npb24gRU9GIDsKICAgICBwdWJsaWMgZmluYWwgRU9iamVjdCBlbnRyeVJ1bGVYQW5kRXhwcmVzc2lvbigpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAgICAgICAgIEVPYmplY3QgY3VycmVudCA9IG51bGw7CiAKQEAgLTk0MTQsOCArMTA2MDgsOCBAQAogCiAKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjM0NDI6NTU6IChpdl9ydWxlWEFuZEV4cHJlc3Npb249IHJ1bGVYQW5kRXhwcmVzc2lvbiBFT0YgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MzQ0MzoyOiBpdl9ydWxlWEFuZEV4cHJlc3Npb249IHJ1bGVYQW5kRXhwcmVzc2lvbiBFT0YKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjM4ODE6NTU6IChpdl9ydWxlWEFuZEV4cHJlc3Npb249IHJ1bGVYQW5kRXhwcmVzc2lvbiBFT0YgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6Mzg4MjoyOiBpdl9ydWxlWEFuZEV4cHJlc3Npb249IHJ1bGVYQW5kRXhwcmVzc2lvbiBFT0YKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgbmV3Q29tcG9zaXRlTm9kZShncmFtbWFyQWNjZXNzLmdldFhBbmRFeHByZXNzaW9uUnVsZSgpKTsgCkBAIC05NDQ2LDcgKzEwNjQwLDcgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlWEFuZEV4cHJlc3Npb24iCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MzQ0OToxOiBydWxlWEFuZEV4cHJlc3Npb24gcmV0dXJucyBbRU9iamVjdCBjdXJyZW50PW51bGxdIDogKHRoaXNfWEVxdWFsaXR5RXhwcmVzc2lvbl8wPSBydWxlWEVxdWFsaXR5RXhwcmVzc2lvbiAoICggKCAoICgpICggKCBydWxlT3BBbmQgKSApICkgKT0+ICggKCkgKCAoIHJ1bGVPcEFuZCApICkgKSApICggKGx2X3JpZ2h0T3BlcmFuZF8zXzA9IHJ1bGVYRXF1YWxpdHlFeHByZXNzaW9uICkgKSApKiApIDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzozODg4OjE6IHJ1bGVYQW5kRXhwcmVzc2lvbiByZXR1cm5zIFtFT2JqZWN0IGN1cnJlbnQ9bnVsbF0gOiAodGhpc19YRXF1YWxpdHlFeHByZXNzaW9uXzA9IHJ1bGVYRXF1YWxpdHlFeHByZXNzaW9uICggKCAoICggKCkgKCAoIHJ1bGVPcEFuZCApICkgKSApPT4gKCAoKSAoICggcnVsZU9wQW5kICkgKSApICkgKCAobHZfcmlnaHRPcGVyYW5kXzNfMD0gcnVsZVhFcXVhbGl0eUV4cHJlc3Npb24gKSApICkqICkgOwogICAgIHB1YmxpYyBmaW5hbCBFT2JqZWN0IHJ1bGVYQW5kRXhwcmVzc2lvbigpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAgICAgICAgIEVPYmplY3QgY3VycmVudCA9IG51bGw7CiAKQEAgLTk0NTksMTggKzEwNjUzLDE4IEBACiAgICAgICAgIAllbnRlclJ1bGUoKTsKIAogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MzQ1NToyOiAoICh0aGlzX1hFcXVhbGl0eUV4cHJlc3Npb25fMD0gcnVsZVhFcXVhbGl0eUV4cHJlc3Npb24gKCAoICggKCAoKSAoICggcnVsZU9wQW5kICkgKSApICk9PiAoICgpICggKCBydWxlT3BBbmQgKSApICkgKSAoIChsdl9yaWdodE9wZXJhbmRfM18wPSBydWxlWEVxdWFsaXR5RXhwcmVzc2lvbiApICkgKSogKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzozNDU2OjI6ICh0aGlzX1hFcXVhbGl0eUV4cHJlc3Npb25fMD0gcnVsZVhFcXVhbGl0eUV4cHJlc3Npb24gKCAoICggKCAoKSAoICggcnVsZU9wQW5kICkgKSApICk9PiAoICgpICggKCBydWxlT3BBbmQgKSApICkgKSAoIChsdl9yaWdodE9wZXJhbmRfM18wPSBydWxlWEVxdWFsaXR5RXhwcmVzc2lvbiApICkgKSogKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6Mzg5NDoyOiAoICh0aGlzX1hFcXVhbGl0eUV4cHJlc3Npb25fMD0gcnVsZVhFcXVhbGl0eUV4cHJlc3Npb24gKCAoICggKCAoKSAoICggcnVsZU9wQW5kICkgKSApICk9PiAoICgpICggKCBydWxlT3BBbmQgKSApICkgKSAoIChsdl9yaWdodE9wZXJhbmRfM18wPSBydWxlWEVxdWFsaXR5RXhwcmVzc2lvbiApICkgKSogKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzozODk1OjI6ICh0aGlzX1hFcXVhbGl0eUV4cHJlc3Npb25fMD0gcnVsZVhFcXVhbGl0eUV4cHJlc3Npb24gKCAoICggKCAoKSAoICggcnVsZU9wQW5kICkgKSApICk9PiAoICgpICggKCBydWxlT3BBbmQgKSApICkgKSAoIChsdl9yaWdodE9wZXJhbmRfM18wPSBydWxlWEVxdWFsaXR5RXhwcmVzc2lvbiApICkgKSogKQogICAgICAgICAgICAgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MzQ1NjoyOiAodGhpc19YRXF1YWxpdHlFeHByZXNzaW9uXzA9IHJ1bGVYRXF1YWxpdHlFeHByZXNzaW9uICggKCAoICggKCkgKCAoIHJ1bGVPcEFuZCApICkgKSApPT4gKCAoKSAoICggcnVsZU9wQW5kICkgKSApICkgKCAobHZfcmlnaHRPcGVyYW5kXzNfMD0gcnVsZVhFcXVhbGl0eUV4cHJlc3Npb24gKSApICkqICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjM0NTc6MzogdGhpc19YRXF1YWxpdHlFeHByZXNzaW9uXzA9IHJ1bGVYRXF1YWxpdHlFeHByZXNzaW9uICggKCAoICggKCkgKCAoIHJ1bGVPcEFuZCApICkgKSApPT4gKCAoKSAoICggcnVsZU9wQW5kICkgKSApICkgKCAobHZfcmlnaHRPcGVyYW5kXzNfMD0gcnVsZVhFcXVhbGl0eUV4cHJlc3Npb24gKSApICkqCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzozODk1OjI6ICh0aGlzX1hFcXVhbGl0eUV4cHJlc3Npb25fMD0gcnVsZVhFcXVhbGl0eUV4cHJlc3Npb24gKCAoICggKCAoKSAoICggcnVsZU9wQW5kICkgKSApICk9PiAoICgpICggKCBydWxlT3BBbmQgKSApICkgKSAoIChsdl9yaWdodE9wZXJhbmRfM18wPSBydWxlWEVxdWFsaXR5RXhwcmVzc2lvbiApICkgKSogKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6Mzg5NjozOiB0aGlzX1hFcXVhbGl0eUV4cHJlc3Npb25fMD0gcnVsZVhFcXVhbGl0eUV4cHJlc3Npb24gKCAoICggKCAoKSAoICggcnVsZU9wQW5kICkgKSApICk9PiAoICgpICggKCBydWxlT3BBbmQgKSApICkgKSAoIChsdl9yaWdodE9wZXJhbmRfM18wPSBydWxlWEVxdWFsaXR5RXhwcmVzc2lvbiApICkgKSoKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogCiAgICAgICAgICAgICAgIAkJCW5ld0NvbXBvc2l0ZU5vZGUoZ3JhbW1hckFjY2Vzcy5nZXRYQW5kRXhwcmVzc2lvbkFjY2VzcygpLmdldFhFcXVhbGl0eUV4cHJlc3Npb25QYXJzZXJSdWxlQ2FsbF8wKCkpOwogICAgICAgICAgICAgICAJCQogICAgICAgICAgICAgfQotICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfNzQpOworICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfODgpOwogICAgICAgICAgICAgdGhpc19YRXF1YWxpdHlFeHByZXNzaW9uXzA9cnVsZVhFcXVhbGl0eUV4cHJlc3Npb24oKTsKIAogICAgICAgICAgICAgc3RhdGUuX2ZzcC0tOwpAQCAtOTQ4MSwzNSArMTA2NzUsMzUgQEAKICAgICAgICAgICAgICAgCQkJYWZ0ZXJQYXJzZXJPckVudW1SdWxlQ2FsbCgpOwogICAgICAgICAgICAgICAJCQogICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MzQ2NTozOiAoICggKCAoICgpICggKCBydWxlT3BBbmQgKSApICkgKT0+ICggKCkgKCAoIHJ1bGVPcEFuZCApICkgKSApICggKGx2X3JpZ2h0T3BlcmFuZF8zXzA9IHJ1bGVYRXF1YWxpdHlFeHByZXNzaW9uICkgKSApKgotICAgICAgICAgICAgbG9vcDYwOgorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MzkwNDozOiAoICggKCAoICgpICggKCBydWxlT3BBbmQgKSApICkgKT0+ICggKCkgKCAoIHJ1bGVPcEFuZCApICkgKSApICggKGx2X3JpZ2h0T3BlcmFuZF8zXzA9IHJ1bGVYRXF1YWxpdHlFeHByZXNzaW9uICkgKSApKgorICAgICAgICAgICAgbG9vcDcxOgogICAgICAgICAgICAgZG8gewotICAgICAgICAgICAgICAgIGludCBhbHQ2MD0yOwotICAgICAgICAgICAgICAgIGludCBMQTYwXzAgPSBpbnB1dC5MQSgxKTsKKyAgICAgICAgICAgICAgICBpbnQgYWx0NzE9MjsKKyAgICAgICAgICAgICAgICBpbnQgTEE3MV8wID0gaW5wdXQuTEEoMSk7CiAKLSAgICAgICAgICAgICAgICBpZiAoIChMQTYwXzA9PTkwKSApIHsKLSAgICAgICAgICAgICAgICAgICAgaW50IExBNjBfMiA9IGlucHV0LkxBKDIpOworICAgICAgICAgICAgICAgIGlmICggKExBNzFfMD09OTcpICkgeworICAgICAgICAgICAgICAgICAgICBpbnQgTEE3MV8yID0gaW5wdXQuTEEoMik7CiAKICAgICAgICAgICAgICAgICAgICAgaWYgKCAoc3lucHJlZDlfSW50ZXJuYWxEYXRhRFNMKCkpICkgewotICAgICAgICAgICAgICAgICAgICAgICAgYWx0NjA9MTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFsdDcxPTE7CiAgICAgICAgICAgICAgICAgICAgIH0KIAogCiAgICAgICAgICAgICAgICAgfQogCiAKLSAgICAgICAgICAgICAgICBzd2l0Y2ggKGFsdDYwKSB7CisgICAgICAgICAgICAgICAgc3dpdGNoIChhbHQ3MSkgewogICAgICAgICAgICAgCWNhc2UgMSA6Ci0gICAgICAgICAgICAJICAgIC8vIEludGVybmFsRGF0YURTTC5nOjM0NjY6NDogKCAoICggKCkgKCAoIHJ1bGVPcEFuZCApICkgKSApPT4gKCAoKSAoICggcnVsZU9wQW5kICkgKSApICkgKCAobHZfcmlnaHRPcGVyYW5kXzNfMD0gcnVsZVhFcXVhbGl0eUV4cHJlc3Npb24gKSApCisgICAgICAgICAgICAJICAgIC8vIEludGVybmFsRGF0YURTTC5nOjM5MDU6NDogKCAoICggKCkgKCAoIHJ1bGVPcEFuZCApICkgKSApPT4gKCAoKSAoICggcnVsZU9wQW5kICkgKSApICkgKCAobHZfcmlnaHRPcGVyYW5kXzNfMD0gcnVsZVhFcXVhbGl0eUV4cHJlc3Npb24gKSApCiAgICAgICAgICAgICAJICAgIHsKLSAgICAgICAgICAgIAkgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MzQ2Njo0OiAoICggKCAoKSAoICggcnVsZU9wQW5kICkgKSApICk9PiAoICgpICggKCBydWxlT3BBbmQgKSApICkgKQotICAgICAgICAgICAgCSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzozNDY3OjU6ICggKCAoKSAoICggcnVsZU9wQW5kICkgKSApICk9PiAoICgpICggKCBydWxlT3BBbmQgKSApICkKKyAgICAgICAgICAgIAkgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MzkwNTo0OiAoICggKCAoKSAoICggcnVsZU9wQW5kICkgKSApICk9PiAoICgpICggKCBydWxlT3BBbmQgKSApICkgKQorICAgICAgICAgICAgCSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzozOTA2OjU6ICggKCAoKSAoICggcnVsZU9wQW5kICkgKSApICk9PiAoICgpICggKCBydWxlT3BBbmQgKSApICkKICAgICAgICAgICAgIAkgICAgewotICAgICAgICAgICAgCSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzozNDc3OjU6ICggKCkgKCAoIHJ1bGVPcEFuZCApICkgKQotICAgICAgICAgICAgCSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzozNDc4OjY6ICgpICggKCBydWxlT3BBbmQgKSApCisgICAgICAgICAgICAJICAgIC8vIEludGVybmFsRGF0YURTTC5nOjM5MTY6NTogKCAoKSAoICggcnVsZU9wQW5kICkgKSApCisgICAgICAgICAgICAJICAgIC8vIEludGVybmFsRGF0YURTTC5nOjM5MTc6NjogKCkgKCAoIHJ1bGVPcEFuZCApICkKICAgICAgICAgICAgIAkgICAgewotICAgICAgICAgICAgCSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzozNDc4OjY6ICgpCi0gICAgICAgICAgICAJICAgIC8vIEludGVybmFsRGF0YURTTC5nOjM0Nzk6NzogCisgICAgICAgICAgICAJICAgIC8vIEludGVybmFsRGF0YURTTC5nOjM5MTc6NjogKCkKKyAgICAgICAgICAgIAkgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MzkxODo3OiAKICAgICAgICAgICAgIAkgICAgewogICAgICAgICAgICAgCSAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKIApAQCAtOTUyMSwxMSArMTA3MTUsMTEgQEAKIAogICAgICAgICAgICAgCSAgICB9CiAKLSAgICAgICAgICAgIAkgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MzQ4NTo2OiAoICggcnVsZU9wQW5kICkgKQotICAgICAgICAgICAgCSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzozNDg2Ojc6ICggcnVsZU9wQW5kICkKKyAgICAgICAgICAgIAkgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MzkyNDo2OiAoICggcnVsZU9wQW5kICkgKQorICAgICAgICAgICAgCSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzozOTI1Ojc6ICggcnVsZU9wQW5kICkKICAgICAgICAgICAgIAkgICAgewotICAgICAgICAgICAgCSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzozNDg2Ojc6ICggcnVsZU9wQW5kICkKLSAgICAgICAgICAgIAkgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MzQ4Nzo4OiBydWxlT3BBbmQKKyAgICAgICAgICAgIAkgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MzkyNTo3OiAoIHJ1bGVPcEFuZCApCisgICAgICAgICAgICAJICAgIC8vIEludGVybmFsRGF0YURTTC5nOjM5MjY6ODogcnVsZU9wQW5kCiAgICAgICAgICAgICAJICAgIHsKICAgICAgICAgICAgIAkgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAKQEAgLTk1MzksNyArMTA3MzMsNyBAQAogICAgICAgICAgICAgCSAgICAgIAkJCQkJCQkJbmV3Q29tcG9zaXRlTm9kZShncmFtbWFyQWNjZXNzLmdldFhBbmRFeHByZXNzaW9uQWNjZXNzKCkuZ2V0RmVhdHVyZUp2bUlkZW50aWZpYWJsZUVsZW1lbnRDcm9zc1JlZmVyZW5jZV8xXzBfMF8xXzAoKSk7CiAgICAgICAgICAgICAJICAgICAgCQkJCQkJCQogICAgICAgICAgICAgCSAgICB9Ci0gICAgICAgICAgICAJICAgIHB1c2hGb2xsb3coRk9MTE9XXzY0KTsKKyAgICAgICAgICAgIAkgICAgcHVzaEZvbGxvdyhGT0xMT1dfNzgpOwogICAgICAgICAgICAgCSAgICBydWxlT3BBbmQoKTsKIAogICAgICAgICAgICAgCSAgICBzdGF0ZS5fZnNwLS07CkBAIC05NTYxLDE4ICsxMDc1NSwxOCBAQAogCiAgICAgICAgICAgICAJICAgIH0KIAotICAgICAgICAgICAgCSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzozNTAzOjQ6ICggKGx2X3JpZ2h0T3BlcmFuZF8zXzA9IHJ1bGVYRXF1YWxpdHlFeHByZXNzaW9uICkgKQotICAgICAgICAgICAgCSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzozNTA0OjU6IChsdl9yaWdodE9wZXJhbmRfM18wPSBydWxlWEVxdWFsaXR5RXhwcmVzc2lvbiApCisgICAgICAgICAgICAJICAgIC8vIEludGVybmFsRGF0YURTTC5nOjM5NDI6NDogKCAobHZfcmlnaHRPcGVyYW5kXzNfMD0gcnVsZVhFcXVhbGl0eUV4cHJlc3Npb24gKSApCisgICAgICAgICAgICAJICAgIC8vIEludGVybmFsRGF0YURTTC5nOjM5NDM6NTogKGx2X3JpZ2h0T3BlcmFuZF8zXzA9IHJ1bGVYRXF1YWxpdHlFeHByZXNzaW9uICkKICAgICAgICAgICAgIAkgICAgewotICAgICAgICAgICAgCSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzozNTA0OjU6IChsdl9yaWdodE9wZXJhbmRfM18wPSBydWxlWEVxdWFsaXR5RXhwcmVzc2lvbiApCi0gICAgICAgICAgICAJICAgIC8vIEludGVybmFsRGF0YURTTC5nOjM1MDU6NjogbHZfcmlnaHRPcGVyYW5kXzNfMD0gcnVsZVhFcXVhbGl0eUV4cHJlc3Npb24KKyAgICAgICAgICAgIAkgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6Mzk0Mzo1OiAobHZfcmlnaHRPcGVyYW5kXzNfMD0gcnVsZVhFcXVhbGl0eUV4cHJlc3Npb24gKQorICAgICAgICAgICAgCSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzozOTQ0OjY6IGx2X3JpZ2h0T3BlcmFuZF8zXzA9IHJ1bGVYRXF1YWxpdHlFeHByZXNzaW9uCiAgICAgICAgICAgICAJICAgIHsKICAgICAgICAgICAgIAkgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAKICAgICAgICAgICAgIAkgICAgICAJCQkJCQluZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0WEFuZEV4cHJlc3Npb25BY2Nlc3MoKS5nZXRSaWdodE9wZXJhbmRYRXF1YWxpdHlFeHByZXNzaW9uUGFyc2VyUnVsZUNhbGxfMV8xXzAoKSk7CiAgICAgICAgICAgICAJICAgICAgCQkJCQkKICAgICAgICAgICAgIAkgICAgfQotICAgICAgICAgICAgCSAgICBwdXNoRm9sbG93KEZPTExPV183NCk7CisgICAgICAgICAgICAJICAgIHB1c2hGb2xsb3coRk9MTE9XXzg4KTsKICAgICAgICAgICAgIAkgICAgbHZfcmlnaHRPcGVyYW5kXzNfMD1ydWxlWEVxdWFsaXR5RXhwcmVzc2lvbigpOwogCiAgICAgICAgICAgICAJICAgIHN0YXRlLl9mc3AtLTsKQEAgLTk2MDEsMjI1OSArMTA3OTUsNiBAQAogICAgICAgICAgICAgCSAgICBicmVhazsKIAogICAgICAgICAgICAgCWRlZmF1bHQgOgotICAgICAgICAgICAgCSAgICBicmVhayBsb29wNjA7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSB3aGlsZSAodHJ1ZSk7Ci0KLQotICAgICAgICAgICAgfQotCi0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7Ci0KLSAgICAgICAgICAgICAgCWxlYXZlUnVsZSgpOwotCi0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAgICAgY2F0Y2ggKFJlY29nbml0aW9uRXhjZXB0aW9uIHJlKSB7Ci0gICAgICAgICAgICAgICAgcmVjb3ZlcihpbnB1dCxyZSk7Ci0gICAgICAgICAgICAgICAgYXBwZW5kU2tpcHBlZFRva2VucygpOwotICAgICAgICAgICAgfQotICAgICAgICBmaW5hbGx5IHsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gY3VycmVudDsKLSAgICB9Ci0gICAgLy8gJEFOVExSIGVuZCAicnVsZVhBbmRFeHByZXNzaW9uIgotCi0KLSAgICAvLyAkQU5UTFIgc3RhcnQgImVudHJ5UnVsZU9wQW5kIgotICAgIC8vIEludGVybmFsRGF0YURTTC5nOjM1Mjc6MTogZW50cnlSdWxlT3BBbmQgcmV0dXJucyBbU3RyaW5nIGN1cnJlbnQ9bnVsbF0gOiBpdl9ydWxlT3BBbmQ9IHJ1bGVPcEFuZCBFT0YgOwotICAgIHB1YmxpYyBmaW5hbCBTdHJpbmcgZW50cnlSdWxlT3BBbmQoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewotICAgICAgICBTdHJpbmcgY3VycmVudCA9IG51bGw7Ci0KLSAgICAgICAgQW50bHJEYXRhdHlwZVJ1bGVUb2tlbiBpdl9ydWxlT3BBbmQgPSBudWxsOwotCi0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjM1Mjc6NDU6IChpdl9ydWxlT3BBbmQ9IHJ1bGVPcEFuZCBFT0YgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MzUyODoyOiBpdl9ydWxlT3BBbmQ9IHJ1bGVPcEFuZCBFT0YKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewotICAgICAgICAgICAgICAgbmV3Q29tcG9zaXRlTm9kZShncmFtbWFyQWNjZXNzLmdldE9wQW5kUnVsZSgpKTsgCi0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV18xKTsKLSAgICAgICAgICAgIGl2X3J1bGVPcEFuZD1ydWxlT3BBbmQoKTsKLQotICAgICAgICAgICAgc3RhdGUuX2ZzcC0tOwotICAgICAgICAgICAgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7Ci0gICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKLSAgICAgICAgICAgICAgIGN1cnJlbnQgPWl2X3J1bGVPcEFuZC5nZXRUZXh0KCk7IAotICAgICAgICAgICAgfQotICAgICAgICAgICAgbWF0Y2goaW5wdXQsRU9GLEZPTExPV18yKTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7Ci0KLSAgICAgICAgICAgIH0KLQotICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhdGNoIChSZWNvZ25pdGlvbkV4Y2VwdGlvbiByZSkgewotICAgICAgICAgICAgICAgIHJlY292ZXIoaW5wdXQscmUpOwotICAgICAgICAgICAgICAgIGFwcGVuZFNraXBwZWRUb2tlbnMoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgZmluYWxseSB7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGN1cnJlbnQ7Ci0gICAgfQotICAgIC8vICRBTlRMUiBlbmQgImVudHJ5UnVsZU9wQW5kIgotCi0KLSAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVPcEFuZCIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzozNTM0OjE6IHJ1bGVPcEFuZCByZXR1cm5zIFtBbnRsckRhdGF0eXBlUnVsZVRva2VuIGN1cnJlbnQ9bmV3IEFudGxyRGF0YXR5cGVSdWxlVG9rZW4oKV0gOiBrdz0gJyYmJyA7Ci0gICAgcHVibGljIGZpbmFsIEFudGxyRGF0YXR5cGVSdWxlVG9rZW4gcnVsZU9wQW5kKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKLSAgICAgICAgQW50bHJEYXRhdHlwZVJ1bGVUb2tlbiBjdXJyZW50ID0gbmV3IEFudGxyRGF0YXR5cGVSdWxlVG9rZW4oKTsKLQotICAgICAgICBUb2tlbiBrdz1udWxsOwotCi0KLSAgICAgICAgCWVudGVyUnVsZSgpOwotCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzozNTQwOjI6IChrdz0gJyYmJyApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzozNTQxOjI6IGt3PSAnJiYnCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICBrdz0oVG9rZW4pbWF0Y2goaW5wdXQsOTAsRk9MTE9XXzIpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gY3VycmVudDsKLSAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewotCi0gICAgICAgICAgICAgIAkJY3VycmVudC5tZXJnZShrdyk7Ci0gICAgICAgICAgICAgIAkJbmV3TGVhZk5vZGUoa3csIGdyYW1tYXJBY2Nlc3MuZ2V0T3BBbmRBY2Nlc3MoKS5nZXRBbXBlcnNhbmRBbXBlcnNhbmRLZXl3b3JkKCkpOwotICAgICAgICAgICAgICAJCi0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7Ci0KLSAgICAgICAgICAgICAgCWxlYXZlUnVsZSgpOwotCi0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAgICAgY2F0Y2ggKFJlY29nbml0aW9uRXhjZXB0aW9uIHJlKSB7Ci0gICAgICAgICAgICAgICAgcmVjb3ZlcihpbnB1dCxyZSk7Ci0gICAgICAgICAgICAgICAgYXBwZW5kU2tpcHBlZFRva2VucygpOwotICAgICAgICAgICAgfQotICAgICAgICBmaW5hbGx5IHsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gY3VycmVudDsKLSAgICB9Ci0gICAgLy8gJEFOVExSIGVuZCAicnVsZU9wQW5kIgotCi0KLSAgICAvLyAkQU5UTFIgc3RhcnQgImVudHJ5UnVsZVhFcXVhbGl0eUV4cHJlc3Npb24iCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MzU0OToxOiBlbnRyeVJ1bGVYRXF1YWxpdHlFeHByZXNzaW9uIHJldHVybnMgW0VPYmplY3QgY3VycmVudD1udWxsXSA6IGl2X3J1bGVYRXF1YWxpdHlFeHByZXNzaW9uPSBydWxlWEVxdWFsaXR5RXhwcmVzc2lvbiBFT0YgOwotICAgIHB1YmxpYyBmaW5hbCBFT2JqZWN0IGVudHJ5UnVsZVhFcXVhbGl0eUV4cHJlc3Npb24oKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewotICAgICAgICBFT2JqZWN0IGN1cnJlbnQgPSBudWxsOwotCi0gICAgICAgIEVPYmplY3QgaXZfcnVsZVhFcXVhbGl0eUV4cHJlc3Npb24gPSBudWxsOwotCi0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjM1NDk6NjA6IChpdl9ydWxlWEVxdWFsaXR5RXhwcmVzc2lvbj0gcnVsZVhFcXVhbGl0eUV4cHJlc3Npb24gRU9GICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjM1NTA6MjogaXZfcnVsZVhFcXVhbGl0eUV4cHJlc3Npb249IHJ1bGVYRXF1YWxpdHlFeHByZXNzaW9uIEVPRgotICAgICAgICAgICAgewotICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7Ci0gICAgICAgICAgICAgICBuZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0WEVxdWFsaXR5RXhwcmVzc2lvblJ1bGUoKSk7IAotICAgICAgICAgICAgfQotICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMSk7Ci0gICAgICAgICAgICBpdl9ydWxlWEVxdWFsaXR5RXhwcmVzc2lvbj1ydWxlWEVxdWFsaXR5RXhwcmVzc2lvbigpOwotCi0gICAgICAgICAgICBzdGF0ZS5fZnNwLS07Ci0gICAgICAgICAgICBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gY3VycmVudDsKLSAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewotICAgICAgICAgICAgICAgY3VycmVudCA9aXZfcnVsZVhFcXVhbGl0eUV4cHJlc3Npb247IAotICAgICAgICAgICAgfQotICAgICAgICAgICAgbWF0Y2goaW5wdXQsRU9GLEZPTExPV18yKTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7Ci0KLSAgICAgICAgICAgIH0KLQotICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhdGNoIChSZWNvZ25pdGlvbkV4Y2VwdGlvbiByZSkgewotICAgICAgICAgICAgICAgIHJlY292ZXIoaW5wdXQscmUpOwotICAgICAgICAgICAgICAgIGFwcGVuZFNraXBwZWRUb2tlbnMoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgZmluYWxseSB7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGN1cnJlbnQ7Ci0gICAgfQotICAgIC8vICRBTlRMUiBlbmQgImVudHJ5UnVsZVhFcXVhbGl0eUV4cHJlc3Npb24iCi0KLQotICAgIC8vICRBTlRMUiBzdGFydCAicnVsZVhFcXVhbGl0eUV4cHJlc3Npb24iCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MzU1NjoxOiBydWxlWEVxdWFsaXR5RXhwcmVzc2lvbiByZXR1cm5zIFtFT2JqZWN0IGN1cnJlbnQ9bnVsbF0gOiAodGhpc19YUmVsYXRpb25hbEV4cHJlc3Npb25fMD0gcnVsZVhSZWxhdGlvbmFsRXhwcmVzc2lvbiAoICggKCAoICgpICggKCBydWxlT3BFcXVhbGl0eSApICkgKSApPT4gKCAoKSAoICggcnVsZU9wRXF1YWxpdHkgKSApICkgKSAoIChsdl9yaWdodE9wZXJhbmRfM18wPSBydWxlWFJlbGF0aW9uYWxFeHByZXNzaW9uICkgKSApKiApIDsKLSAgICBwdWJsaWMgZmluYWwgRU9iamVjdCBydWxlWEVxdWFsaXR5RXhwcmVzc2lvbigpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7Ci0gICAgICAgIEVPYmplY3QgY3VycmVudCA9IG51bGw7Ci0KLSAgICAgICAgRU9iamVjdCB0aGlzX1hSZWxhdGlvbmFsRXhwcmVzc2lvbl8wID0gbnVsbDsKLQotICAgICAgICBFT2JqZWN0IGx2X3JpZ2h0T3BlcmFuZF8zXzAgPSBudWxsOwotCi0KLQotICAgICAgICAJZW50ZXJSdWxlKCk7Ci0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjM1NjI6MjogKCAodGhpc19YUmVsYXRpb25hbEV4cHJlc3Npb25fMD0gcnVsZVhSZWxhdGlvbmFsRXhwcmVzc2lvbiAoICggKCAoICgpICggKCBydWxlT3BFcXVhbGl0eSApICkgKSApPT4gKCAoKSAoICggcnVsZU9wRXF1YWxpdHkgKSApICkgKSAoIChsdl9yaWdodE9wZXJhbmRfM18wPSBydWxlWFJlbGF0aW9uYWxFeHByZXNzaW9uICkgKSApKiApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjM1NjM6MjogKHRoaXNfWFJlbGF0aW9uYWxFeHByZXNzaW9uXzA9IHJ1bGVYUmVsYXRpb25hbEV4cHJlc3Npb24gKCAoICggKCAoKSAoICggcnVsZU9wRXF1YWxpdHkgKSApICkgKT0+ICggKCkgKCAoIHJ1bGVPcEVxdWFsaXR5ICkgKSApICkgKCAobHZfcmlnaHRPcGVyYW5kXzNfMD0gcnVsZVhSZWxhdGlvbmFsRXhwcmVzc2lvbiApICkgKSogKQotICAgICAgICAgICAgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MzU2MzoyOiAodGhpc19YUmVsYXRpb25hbEV4cHJlc3Npb25fMD0gcnVsZVhSZWxhdGlvbmFsRXhwcmVzc2lvbiAoICggKCAoICgpICggKCBydWxlT3BFcXVhbGl0eSApICkgKSApPT4gKCAoKSAoICggcnVsZU9wRXF1YWxpdHkgKSApICkgKSAoIChsdl9yaWdodE9wZXJhbmRfM18wPSBydWxlWFJlbGF0aW9uYWxFeHByZXNzaW9uICkgKSApKiApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzozNTY0OjM6IHRoaXNfWFJlbGF0aW9uYWxFeHByZXNzaW9uXzA9IHJ1bGVYUmVsYXRpb25hbEV4cHJlc3Npb24gKCAoICggKCAoKSAoICggcnVsZU9wRXF1YWxpdHkgKSApICkgKT0+ICggKCkgKCAoIHJ1bGVPcEVxdWFsaXR5ICkgKSApICkgKCAobHZfcmlnaHRPcGVyYW5kXzNfMD0gcnVsZVhSZWxhdGlvbmFsRXhwcmVzc2lvbiApICkgKSoKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewotCi0gICAgICAgICAgICAgIAkJCW5ld0NvbXBvc2l0ZU5vZGUoZ3JhbW1hckFjY2Vzcy5nZXRYRXF1YWxpdHlFeHByZXNzaW9uQWNjZXNzKCkuZ2V0WFJlbGF0aW9uYWxFeHByZXNzaW9uUGFyc2VyUnVsZUNhbGxfMCgpKTsKLSAgICAgICAgICAgICAgCQkKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzc1KTsKLSAgICAgICAgICAgIHRoaXNfWFJlbGF0aW9uYWxFeHByZXNzaW9uXzA9cnVsZVhSZWxhdGlvbmFsRXhwcmVzc2lvbigpOwotCi0gICAgICAgICAgICBzdGF0ZS5fZnNwLS07Ci0gICAgICAgICAgICBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gY3VycmVudDsKLSAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewotCi0gICAgICAgICAgICAgIAkJCWN1cnJlbnQgPSB0aGlzX1hSZWxhdGlvbmFsRXhwcmVzc2lvbl8wOwotICAgICAgICAgICAgICAJCQlhZnRlclBhcnNlck9yRW51bVJ1bGVDYWxsKCk7Ci0gICAgICAgICAgICAgIAkJCi0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzozNTcyOjM6ICggKCAoICggKCkgKCAoIHJ1bGVPcEVxdWFsaXR5ICkgKSApICk9PiAoICgpICggKCBydWxlT3BFcXVhbGl0eSApICkgKSApICggKGx2X3JpZ2h0T3BlcmFuZF8zXzA9IHJ1bGVYUmVsYXRpb25hbEV4cHJlc3Npb24gKSApICkqCi0gICAgICAgICAgICBsb29wNjE6Ci0gICAgICAgICAgICBkbyB7Ci0gICAgICAgICAgICAgICAgaW50IGFsdDYxPTI7Ci0gICAgICAgICAgICAgICAgc3dpdGNoICggaW5wdXQuTEEoMSkgKSB7Ci0gICAgICAgICAgICAgICAgY2FzZSA5MToKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBpbnQgTEE2MV8yID0gaW5wdXQuTEEoMik7Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYgKCAoc3lucHJlZDEwX0ludGVybmFsRGF0YURTTCgpKSApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGFsdDYxPTE7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotCi0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgY2FzZSA5MjoKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBpbnQgTEE2MV8zID0gaW5wdXQuTEEoMik7Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYgKCAoc3lucHJlZDEwX0ludGVybmFsRGF0YURTTCgpKSApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGFsdDYxPTE7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotCi0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgY2FzZSA5MzoKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBpbnQgTEE2MV80ID0gaW5wdXQuTEEoMik7Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYgKCAoc3lucHJlZDEwX0ludGVybmFsRGF0YURTTCgpKSApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGFsdDYxPTE7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotCi0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgY2FzZSA5NDoKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBpbnQgTEE2MV81ID0gaW5wdXQuTEEoMik7Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYgKCAoc3lucHJlZDEwX0ludGVybmFsRGF0YURTTCgpKSApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGFsdDYxPTE7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotCi0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBzd2l0Y2ggKGFsdDYxKSB7Ci0gICAgICAgICAgICAJY2FzZSAxIDoKLSAgICAgICAgICAgIAkgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MzU3Mzo0OiAoICggKCAoKSAoICggcnVsZU9wRXF1YWxpdHkgKSApICkgKT0+ICggKCkgKCAoIHJ1bGVPcEVxdWFsaXR5ICkgKSApICkgKCAobHZfcmlnaHRPcGVyYW5kXzNfMD0gcnVsZVhSZWxhdGlvbmFsRXhwcmVzc2lvbiApICkKLSAgICAgICAgICAgIAkgICAgewotICAgICAgICAgICAgCSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzozNTczOjQ6ICggKCAoICgpICggKCBydWxlT3BFcXVhbGl0eSApICkgKSApPT4gKCAoKSAoICggcnVsZU9wRXF1YWxpdHkgKSApICkgKQotICAgICAgICAgICAgCSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzozNTc0OjU6ICggKCAoKSAoICggcnVsZU9wRXF1YWxpdHkgKSApICkgKT0+ICggKCkgKCAoIHJ1bGVPcEVxdWFsaXR5ICkgKSApCi0gICAgICAgICAgICAJICAgIHsKLSAgICAgICAgICAgIAkgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MzU4NDo1OiAoICgpICggKCBydWxlT3BFcXVhbGl0eSApICkgKQotICAgICAgICAgICAgCSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzozNTg1OjY6ICgpICggKCBydWxlT3BFcXVhbGl0eSApICkKLSAgICAgICAgICAgIAkgICAgewotICAgICAgICAgICAgCSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzozNTg1OjY6ICgpCi0gICAgICAgICAgICAJICAgIC8vIEludGVybmFsRGF0YURTTC5nOjM1ODY6NzogCi0gICAgICAgICAgICAJICAgIHsKLSAgICAgICAgICAgIAkgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7Ci0KLSAgICAgICAgICAgIAkgICAgICAJCQkJCQkJY3VycmVudCA9IGZvcmNlQ3JlYXRlTW9kZWxFbGVtZW50QW5kU2V0KAotICAgICAgICAgICAgCSAgICAgIAkJCQkJCQkJZ3JhbW1hckFjY2Vzcy5nZXRYRXF1YWxpdHlFeHByZXNzaW9uQWNjZXNzKCkuZ2V0WEJpbmFyeU9wZXJhdGlvbkxlZnRPcGVyYW5kQWN0aW9uXzFfMF8wXzAoKSwKLSAgICAgICAgICAgIAkgICAgICAJCQkJCQkJCWN1cnJlbnQpOwotICAgICAgICAgICAgCSAgICAgIAkJCQkJCQotICAgICAgICAgICAgCSAgICB9Ci0KLSAgICAgICAgICAgIAkgICAgfQotCi0gICAgICAgICAgICAJICAgIC8vIEludGVybmFsRGF0YURTTC5nOjM1OTI6NjogKCAoIHJ1bGVPcEVxdWFsaXR5ICkgKQotICAgICAgICAgICAgCSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzozNTkzOjc6ICggcnVsZU9wRXF1YWxpdHkgKQotICAgICAgICAgICAgCSAgICB7Ci0gICAgICAgICAgICAJICAgIC8vIEludGVybmFsRGF0YURTTC5nOjM1OTM6NzogKCBydWxlT3BFcXVhbGl0eSApCi0gICAgICAgICAgICAJICAgIC8vIEludGVybmFsRGF0YURTTC5nOjM1OTQ6ODogcnVsZU9wRXF1YWxpdHkKLSAgICAgICAgICAgIAkgICAgewotICAgICAgICAgICAgCSAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKLQotICAgICAgICAgICAgCSAgICAgIAkJCQkJCQkJaWYgKGN1cnJlbnQ9PW51bGwpIHsKLSAgICAgICAgICAgIAkgICAgICAJCQkJCQkJCQljdXJyZW50ID0gY3JlYXRlTW9kZWxFbGVtZW50KGdyYW1tYXJBY2Nlc3MuZ2V0WEVxdWFsaXR5RXhwcmVzc2lvblJ1bGUoKSk7Ci0gICAgICAgICAgICAJICAgICAgCQkJCQkJCQl9Ci0gICAgICAgICAgICAJICAgICAgCQkJCQkJCQotICAgICAgICAgICAgCSAgICB9Ci0gICAgICAgICAgICAJICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewotCi0gICAgICAgICAgICAJICAgICAgCQkJCQkJCQluZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0WEVxdWFsaXR5RXhwcmVzc2lvbkFjY2VzcygpLmdldEZlYXR1cmVKdm1JZGVudGlmaWFibGVFbGVtZW50Q3Jvc3NSZWZlcmVuY2VfMV8wXzBfMV8wKCkpOwotICAgICAgICAgICAgCSAgICAgIAkJCQkJCQkKLSAgICAgICAgICAgIAkgICAgfQotICAgICAgICAgICAgCSAgICBwdXNoRm9sbG93KEZPTExPV182NCk7Ci0gICAgICAgICAgICAJICAgIHJ1bGVPcEVxdWFsaXR5KCk7Ci0KLSAgICAgICAgICAgIAkgICAgc3RhdGUuX2ZzcC0tOwotICAgICAgICAgICAgCSAgICBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gY3VycmVudDsKLSAgICAgICAgICAgIAkgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7Ci0KLSAgICAgICAgICAgIAkgICAgICAJCQkJCQkJCWFmdGVyUGFyc2VyT3JFbnVtUnVsZUNhbGwoKTsKLSAgICAgICAgICAgIAkgICAgICAJCQkJCQkJCi0gICAgICAgICAgICAJICAgIH0KLQotICAgICAgICAgICAgCSAgICB9Ci0KLQotICAgICAgICAgICAgCSAgICB9Ci0KLQotICAgICAgICAgICAgCSAgICB9Ci0KLQotICAgICAgICAgICAgCSAgICB9Ci0KLSAgICAgICAgICAgIAkgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MzYxMDo0OiAoIChsdl9yaWdodE9wZXJhbmRfM18wPSBydWxlWFJlbGF0aW9uYWxFeHByZXNzaW9uICkgKQotICAgICAgICAgICAgCSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzozNjExOjU6IChsdl9yaWdodE9wZXJhbmRfM18wPSBydWxlWFJlbGF0aW9uYWxFeHByZXNzaW9uICkKLSAgICAgICAgICAgIAkgICAgewotICAgICAgICAgICAgCSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzozNjExOjU6IChsdl9yaWdodE9wZXJhbmRfM18wPSBydWxlWFJlbGF0aW9uYWxFeHByZXNzaW9uICkKLSAgICAgICAgICAgIAkgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MzYxMjo2OiBsdl9yaWdodE9wZXJhbmRfM18wPSBydWxlWFJlbGF0aW9uYWxFeHByZXNzaW9uCi0gICAgICAgICAgICAJICAgIHsKLSAgICAgICAgICAgIAkgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7Ci0KLSAgICAgICAgICAgIAkgICAgICAJCQkJCQluZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0WEVxdWFsaXR5RXhwcmVzc2lvbkFjY2VzcygpLmdldFJpZ2h0T3BlcmFuZFhSZWxhdGlvbmFsRXhwcmVzc2lvblBhcnNlclJ1bGVDYWxsXzFfMV8wKCkpOwotICAgICAgICAgICAgCSAgICAgIAkJCQkJCi0gICAgICAgICAgICAJICAgIH0KLSAgICAgICAgICAgIAkgICAgcHVzaEZvbGxvdyhGT0xMT1dfNzUpOwotICAgICAgICAgICAgCSAgICBsdl9yaWdodE9wZXJhbmRfM18wPXJ1bGVYUmVsYXRpb25hbEV4cHJlc3Npb24oKTsKLQotICAgICAgICAgICAgCSAgICBzdGF0ZS5fZnNwLS07Ci0gICAgICAgICAgICAJICAgIGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OwotICAgICAgICAgICAgCSAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKLQotICAgICAgICAgICAgCSAgICAgIAkJCQkJCWlmIChjdXJyZW50PT1udWxsKSB7Ci0gICAgICAgICAgICAJICAgICAgCQkJCQkJCWN1cnJlbnQgPSBjcmVhdGVNb2RlbEVsZW1lbnRGb3JQYXJlbnQoZ3JhbW1hckFjY2Vzcy5nZXRYRXF1YWxpdHlFeHByZXNzaW9uUnVsZSgpKTsKLSAgICAgICAgICAgIAkgICAgICAJCQkJCQl9Ci0gICAgICAgICAgICAJICAgICAgCQkJCQkJc2V0KAotICAgICAgICAgICAgCSAgICAgIAkJCQkJCQljdXJyZW50LAotICAgICAgICAgICAgCSAgICAgIAkJCQkJCQkicmlnaHRPcGVyYW5kIiwKLSAgICAgICAgICAgIAkgICAgICAJCQkJCQkJbHZfcmlnaHRPcGVyYW5kXzNfMCwKLSAgICAgICAgICAgIAkgICAgICAJCQkJCQkJIm9yZy5lY2xpcHNlLnh0ZXh0LnhiYXNlLlhiYXNlLlhSZWxhdGlvbmFsRXhwcmVzc2lvbiIpOwotICAgICAgICAgICAgCSAgICAgIAkJCQkJCWFmdGVyUGFyc2VyT3JFbnVtUnVsZUNhbGwoKTsKLSAgICAgICAgICAgIAkgICAgICAJCQkJCQotICAgICAgICAgICAgCSAgICB9Ci0KLSAgICAgICAgICAgIAkgICAgfQotCi0KLSAgICAgICAgICAgIAkgICAgfQotCi0KLSAgICAgICAgICAgIAkgICAgfQotICAgICAgICAgICAgCSAgICBicmVhazsKLQotICAgICAgICAgICAgCWRlZmF1bHQgOgotICAgICAgICAgICAgCSAgICBicmVhayBsb29wNjE7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSB3aGlsZSAodHJ1ZSk7Ci0KLQotICAgICAgICAgICAgfQotCi0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7Ci0KLSAgICAgICAgICAgICAgCWxlYXZlUnVsZSgpOwotCi0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAgICAgY2F0Y2ggKFJlY29nbml0aW9uRXhjZXB0aW9uIHJlKSB7Ci0gICAgICAgICAgICAgICAgcmVjb3ZlcihpbnB1dCxyZSk7Ci0gICAgICAgICAgICAgICAgYXBwZW5kU2tpcHBlZFRva2VucygpOwotICAgICAgICAgICAgfQotICAgICAgICBmaW5hbGx5IHsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gY3VycmVudDsKLSAgICB9Ci0gICAgLy8gJEFOVExSIGVuZCAicnVsZVhFcXVhbGl0eUV4cHJlc3Npb24iCi0KLQotICAgIC8vICRBTlRMUiBzdGFydCAiZW50cnlSdWxlT3BFcXVhbGl0eSIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzozNjM0OjE6IGVudHJ5UnVsZU9wRXF1YWxpdHkgcmV0dXJucyBbU3RyaW5nIGN1cnJlbnQ9bnVsbF0gOiBpdl9ydWxlT3BFcXVhbGl0eT0gcnVsZU9wRXF1YWxpdHkgRU9GIDsKLSAgICBwdWJsaWMgZmluYWwgU3RyaW5nIGVudHJ5UnVsZU9wRXF1YWxpdHkoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewotICAgICAgICBTdHJpbmcgY3VycmVudCA9IG51bGw7Ci0KLSAgICAgICAgQW50bHJEYXRhdHlwZVJ1bGVUb2tlbiBpdl9ydWxlT3BFcXVhbGl0eSA9IG51bGw7Ci0KLQotICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MzYzNDo1MDogKGl2X3J1bGVPcEVxdWFsaXR5PSBydWxlT3BFcXVhbGl0eSBFT0YgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MzYzNToyOiBpdl9ydWxlT3BFcXVhbGl0eT0gcnVsZU9wRXF1YWxpdHkgRU9GCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKLSAgICAgICAgICAgICAgIG5ld0NvbXBvc2l0ZU5vZGUoZ3JhbW1hckFjY2Vzcy5nZXRPcEVxdWFsaXR5UnVsZSgpKTsgCi0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV18xKTsKLSAgICAgICAgICAgIGl2X3J1bGVPcEVxdWFsaXR5PXJ1bGVPcEVxdWFsaXR5KCk7Ci0KLSAgICAgICAgICAgIHN0YXRlLl9mc3AtLTsKLSAgICAgICAgICAgIGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OwotICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7Ci0gICAgICAgICAgICAgICBjdXJyZW50ID1pdl9ydWxlT3BFcXVhbGl0eS5nZXRUZXh0KCk7IAotICAgICAgICAgICAgfQotICAgICAgICAgICAgbWF0Y2goaW5wdXQsRU9GLEZPTExPV18yKTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7Ci0KLSAgICAgICAgICAgIH0KLQotICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhdGNoIChSZWNvZ25pdGlvbkV4Y2VwdGlvbiByZSkgewotICAgICAgICAgICAgICAgIHJlY292ZXIoaW5wdXQscmUpOwotICAgICAgICAgICAgICAgIGFwcGVuZFNraXBwZWRUb2tlbnMoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgZmluYWxseSB7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGN1cnJlbnQ7Ci0gICAgfQotICAgIC8vICRBTlRMUiBlbmQgImVudHJ5UnVsZU9wRXF1YWxpdHkiCi0KLQotICAgIC8vICRBTlRMUiBzdGFydCAicnVsZU9wRXF1YWxpdHkiCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MzY0MToxOiBydWxlT3BFcXVhbGl0eSByZXR1cm5zIFtBbnRsckRhdGF0eXBlUnVsZVRva2VuIGN1cnJlbnQ9bmV3IEFudGxyRGF0YXR5cGVSdWxlVG9rZW4oKV0gOiAoa3c9ICc9PScgfCBrdz0gJyE9JyB8IGt3PSAnPT09JyB8IGt3PSAnIT09JyApIDsKLSAgICBwdWJsaWMgZmluYWwgQW50bHJEYXRhdHlwZVJ1bGVUb2tlbiBydWxlT3BFcXVhbGl0eSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7Ci0gICAgICAgIEFudGxyRGF0YXR5cGVSdWxlVG9rZW4gY3VycmVudCA9IG5ldyBBbnRsckRhdGF0eXBlUnVsZVRva2VuKCk7Ci0KLSAgICAgICAgVG9rZW4ga3c9bnVsbDsKLQotCi0gICAgICAgIAllbnRlclJ1bGUoKTsKLQotICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MzY0NzoyOiAoIChrdz0gJz09JyB8IGt3PSAnIT0nIHwga3c9ICc9PT0nIHwga3c9ICchPT0nICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MzY0ODoyOiAoa3c9ICc9PScgfCBrdz0gJyE9JyB8IGt3PSAnPT09JyB8IGt3PSAnIT09JyApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzozNjQ4OjI6IChrdz0gJz09JyB8IGt3PSAnIT0nIHwga3c9ICc9PT0nIHwga3c9ICchPT0nICkKLSAgICAgICAgICAgIGludCBhbHQ2Mj00OwotICAgICAgICAgICAgc3dpdGNoICggaW5wdXQuTEEoMSkgKSB7Ci0gICAgICAgICAgICBjYXNlIDkxOgotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBhbHQ2Mj0xOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgOTI6Ci0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGFsdDYyPTI7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSA5MzoKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgYWx0NjI9MzsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIDk0OgotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBhbHQ2Mj00OwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgaWYgKHN0YXRlLmJhY2t0cmFja2luZz4wKSB7c3RhdGUuZmFpbGVkPXRydWU7IHJldHVybiBjdXJyZW50O30KLSAgICAgICAgICAgICAgICBOb1ZpYWJsZUFsdEV4Y2VwdGlvbiBudmFlID0KLSAgICAgICAgICAgICAgICAgICAgbmV3IE5vVmlhYmxlQWx0RXhjZXB0aW9uKCIiLCA2MiwgMCwgaW5wdXQpOwotCi0gICAgICAgICAgICAgICAgdGhyb3cgbnZhZTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgc3dpdGNoIChhbHQ2MikgewotICAgICAgICAgICAgICAgIGNhc2UgMSA6Ci0gICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjM2NDk6Mzoga3c9ICc9PScKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBrdz0oVG9rZW4pbWF0Y2goaW5wdXQsOTEsRk9MTE9XXzIpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gY3VycmVudDsKLSAgICAgICAgICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAJCQljdXJyZW50Lm1lcmdlKGt3KTsKLSAgICAgICAgICAgICAgICAgICAgICAJCQluZXdMZWFmTm9kZShrdywgZ3JhbW1hckFjY2Vzcy5nZXRPcEVxdWFsaXR5QWNjZXNzKCkuZ2V0RXF1YWxzU2lnbkVxdWFsc1NpZ25LZXl3b3JkXzAoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgCQkKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgY2FzZSAyIDoKLSAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MzY1NTozOiBrdz0gJyE9JwotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGt3PShUb2tlbiltYXRjaChpbnB1dCw5MixGT0xMT1dfMik7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OwotICAgICAgICAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKLQotICAgICAgICAgICAgICAgICAgICAgIAkJCWN1cnJlbnQubWVyZ2Uoa3cpOwotICAgICAgICAgICAgICAgICAgICAgIAkJCW5ld0xlYWZOb2RlKGt3LCBncmFtbWFyQWNjZXNzLmdldE9wRXF1YWxpdHlBY2Nlc3MoKS5nZXRFeGNsYW1hdGlvbk1hcmtFcXVhbHNTaWduS2V5d29yZF8xKCkpOwotICAgICAgICAgICAgICAgICAgICAgIAkJCi0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgMyA6Ci0gICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjM2NjE6Mzoga3c9ICc9PT0nCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAga3c9KFRva2VuKW1hdGNoKGlucHV0LDkzLEZPTExPV18yKTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7Ci0gICAgICAgICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewotCi0gICAgICAgICAgICAgICAgICAgICAgCQkJY3VycmVudC5tZXJnZShrdyk7Ci0gICAgICAgICAgICAgICAgICAgICAgCQkJbmV3TGVhZk5vZGUoa3csIGdyYW1tYXJBY2Nlc3MuZ2V0T3BFcXVhbGl0eUFjY2VzcygpLmdldEVxdWFsc1NpZ25FcXVhbHNTaWduRXF1YWxzU2lnbktleXdvcmRfMigpKTsKLSAgICAgICAgICAgICAgICAgICAgICAJCQotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlIDQgOgotICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzozNjY3OjM6IGt3PSAnIT09JwotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGt3PShUb2tlbiltYXRjaChpbnB1dCw5NCxGT0xMT1dfMik7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OwotICAgICAgICAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKLQotICAgICAgICAgICAgICAgICAgICAgIAkJCWN1cnJlbnQubWVyZ2Uoa3cpOwotICAgICAgICAgICAgICAgICAgICAgIAkJCW5ld0xlYWZOb2RlKGt3LCBncmFtbWFyQWNjZXNzLmdldE9wRXF1YWxpdHlBY2Nlc3MoKS5nZXRFeGNsYW1hdGlvbk1hcmtFcXVhbHNTaWduRXF1YWxzU2lnbktleXdvcmRfMygpKTsKLSAgICAgICAgICAgICAgICAgICAgICAJCQotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgfQotCi0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7Ci0KLSAgICAgICAgICAgICAgCWxlYXZlUnVsZSgpOwotCi0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAgICAgY2F0Y2ggKFJlY29nbml0aW9uRXhjZXB0aW9uIHJlKSB7Ci0gICAgICAgICAgICAgICAgcmVjb3ZlcihpbnB1dCxyZSk7Ci0gICAgICAgICAgICAgICAgYXBwZW5kU2tpcHBlZFRva2VucygpOwotICAgICAgICAgICAgfQotICAgICAgICBmaW5hbGx5IHsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gY3VycmVudDsKLSAgICB9Ci0gICAgLy8gJEFOVExSIGVuZCAicnVsZU9wRXF1YWxpdHkiCi0KLQotICAgIC8vICRBTlRMUiBzdGFydCAiZW50cnlSdWxlWFJlbGF0aW9uYWxFeHByZXNzaW9uIgotICAgIC8vIEludGVybmFsRGF0YURTTC5nOjM2NzY6MTogZW50cnlSdWxlWFJlbGF0aW9uYWxFeHByZXNzaW9uIHJldHVybnMgW0VPYmplY3QgY3VycmVudD1udWxsXSA6IGl2X3J1bGVYUmVsYXRpb25hbEV4cHJlc3Npb249IHJ1bGVYUmVsYXRpb25hbEV4cHJlc3Npb24gRU9GIDsKLSAgICBwdWJsaWMgZmluYWwgRU9iamVjdCBlbnRyeVJ1bGVYUmVsYXRpb25hbEV4cHJlc3Npb24oKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewotICAgICAgICBFT2JqZWN0IGN1cnJlbnQgPSBudWxsOwotCi0gICAgICAgIEVPYmplY3QgaXZfcnVsZVhSZWxhdGlvbmFsRXhwcmVzc2lvbiA9IG51bGw7Ci0KLQotICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MzY3Njo2MjogKGl2X3J1bGVYUmVsYXRpb25hbEV4cHJlc3Npb249IHJ1bGVYUmVsYXRpb25hbEV4cHJlc3Npb24gRU9GICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjM2Nzc6MjogaXZfcnVsZVhSZWxhdGlvbmFsRXhwcmVzc2lvbj0gcnVsZVhSZWxhdGlvbmFsRXhwcmVzc2lvbiBFT0YKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewotICAgICAgICAgICAgICAgbmV3Q29tcG9zaXRlTm9kZShncmFtbWFyQWNjZXNzLmdldFhSZWxhdGlvbmFsRXhwcmVzc2lvblJ1bGUoKSk7IAotICAgICAgICAgICAgfQotICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMSk7Ci0gICAgICAgICAgICBpdl9ydWxlWFJlbGF0aW9uYWxFeHByZXNzaW9uPXJ1bGVYUmVsYXRpb25hbEV4cHJlc3Npb24oKTsKLQotICAgICAgICAgICAgc3RhdGUuX2ZzcC0tOwotICAgICAgICAgICAgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7Ci0gICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKLSAgICAgICAgICAgICAgIGN1cnJlbnQgPWl2X3J1bGVYUmVsYXRpb25hbEV4cHJlc3Npb247IAotICAgICAgICAgICAgfQotICAgICAgICAgICAgbWF0Y2goaW5wdXQsRU9GLEZPTExPV18yKTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7Ci0KLSAgICAgICAgICAgIH0KLQotICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhdGNoIChSZWNvZ25pdGlvbkV4Y2VwdGlvbiByZSkgewotICAgICAgICAgICAgICAgIHJlY292ZXIoaW5wdXQscmUpOwotICAgICAgICAgICAgICAgIGFwcGVuZFNraXBwZWRUb2tlbnMoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgZmluYWxseSB7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGN1cnJlbnQ7Ci0gICAgfQotICAgIC8vICRBTlRMUiBlbmQgImVudHJ5UnVsZVhSZWxhdGlvbmFsRXhwcmVzc2lvbiIKLQotCi0gICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlWFJlbGF0aW9uYWxFeHByZXNzaW9uIgotICAgIC8vIEludGVybmFsRGF0YURTTC5nOjM2ODM6MTogcnVsZVhSZWxhdGlvbmFsRXhwcmVzc2lvbiByZXR1cm5zIFtFT2JqZWN0IGN1cnJlbnQ9bnVsbF0gOiAodGhpc19YT3RoZXJPcGVyYXRvckV4cHJlc3Npb25fMD0gcnVsZVhPdGhlck9wZXJhdG9yRXhwcmVzc2lvbiAoICggKCAoICggKCkgJ2luc3RhbmNlb2YnICkgKT0+ICggKCkgb3RoZXJsdl8yPSAnaW5zdGFuY2VvZicgKSApICggKGx2X3R5cGVfM18wPSBydWxlSnZtVHlwZVJlZmVyZW5jZSApICkgKSB8ICggKCAoICggKCkgKCAoIHJ1bGVPcENvbXBhcmUgKSApICkgKT0+ICggKCkgKCAoIHJ1bGVPcENvbXBhcmUgKSApICkgKSAoIChsdl9yaWdodE9wZXJhbmRfNl8wPSBydWxlWE90aGVyT3BlcmF0b3JFeHByZXNzaW9uICkgKSApICkqICkgOwotICAgIHB1YmxpYyBmaW5hbCBFT2JqZWN0IHJ1bGVYUmVsYXRpb25hbEV4cHJlc3Npb24oKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewotICAgICAgICBFT2JqZWN0IGN1cnJlbnQgPSBudWxsOwotCi0gICAgICAgIFRva2VuIG90aGVybHZfMj1udWxsOwotICAgICAgICBFT2JqZWN0IHRoaXNfWE90aGVyT3BlcmF0b3JFeHByZXNzaW9uXzAgPSBudWxsOwotCi0gICAgICAgIEVPYmplY3QgbHZfdHlwZV8zXzAgPSBudWxsOwotCi0gICAgICAgIEVPYmplY3QgbHZfcmlnaHRPcGVyYW5kXzZfMCA9IG51bGw7Ci0KLQotCi0gICAgICAgIAllbnRlclJ1bGUoKTsKLQotICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MzY4OToyOiAoICh0aGlzX1hPdGhlck9wZXJhdG9yRXhwcmVzc2lvbl8wPSBydWxlWE90aGVyT3BlcmF0b3JFeHByZXNzaW9uICggKCAoICggKCAoKSAnaW5zdGFuY2VvZicgKSApPT4gKCAoKSBvdGhlcmx2XzI9ICdpbnN0YW5jZW9mJyApICkgKCAobHZfdHlwZV8zXzA9IHJ1bGVKdm1UeXBlUmVmZXJlbmNlICkgKSApIHwgKCAoICggKCAoKSAoICggcnVsZU9wQ29tcGFyZSApICkgKSApPT4gKCAoKSAoICggcnVsZU9wQ29tcGFyZSApICkgKSApICggKGx2X3JpZ2h0T3BlcmFuZF82XzA9IHJ1bGVYT3RoZXJPcGVyYXRvckV4cHJlc3Npb24gKSApICkgKSogKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzozNjkwOjI6ICh0aGlzX1hPdGhlck9wZXJhdG9yRXhwcmVzc2lvbl8wPSBydWxlWE90aGVyT3BlcmF0b3JFeHByZXNzaW9uICggKCAoICggKCAoKSAnaW5zdGFuY2VvZicgKSApPT4gKCAoKSBvdGhlcmx2XzI9ICdpbnN0YW5jZW9mJyApICkgKCAobHZfdHlwZV8zXzA9IHJ1bGVKdm1UeXBlUmVmZXJlbmNlICkgKSApIHwgKCAoICggKCAoKSAoICggcnVsZU9wQ29tcGFyZSApICkgKSApPT4gKCAoKSAoICggcnVsZU9wQ29tcGFyZSApICkgKSApICggKGx2X3JpZ2h0T3BlcmFuZF82XzA9IHJ1bGVYT3RoZXJPcGVyYXRvckV4cHJlc3Npb24gKSApICkgKSogKQotICAgICAgICAgICAgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MzY5MDoyOiAodGhpc19YT3RoZXJPcGVyYXRvckV4cHJlc3Npb25fMD0gcnVsZVhPdGhlck9wZXJhdG9yRXhwcmVzc2lvbiAoICggKCAoICggKCkgJ2luc3RhbmNlb2YnICkgKT0+ICggKCkgb3RoZXJsdl8yPSAnaW5zdGFuY2VvZicgKSApICggKGx2X3R5cGVfM18wPSBydWxlSnZtVHlwZVJlZmVyZW5jZSApICkgKSB8ICggKCAoICggKCkgKCAoIHJ1bGVPcENvbXBhcmUgKSApICkgKT0+ICggKCkgKCAoIHJ1bGVPcENvbXBhcmUgKSApICkgKSAoIChsdl9yaWdodE9wZXJhbmRfNl8wPSBydWxlWE90aGVyT3BlcmF0b3JFeHByZXNzaW9uICkgKSApICkqICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjM2OTE6MzogdGhpc19YT3RoZXJPcGVyYXRvckV4cHJlc3Npb25fMD0gcnVsZVhPdGhlck9wZXJhdG9yRXhwcmVzc2lvbiAoICggKCAoICggKCkgJ2luc3RhbmNlb2YnICkgKT0+ICggKCkgb3RoZXJsdl8yPSAnaW5zdGFuY2VvZicgKSApICggKGx2X3R5cGVfM18wPSBydWxlSnZtVHlwZVJlZmVyZW5jZSApICkgKSB8ICggKCAoICggKCkgKCAoIHJ1bGVPcENvbXBhcmUgKSApICkgKT0+ICggKCkgKCAoIHJ1bGVPcENvbXBhcmUgKSApICkgKSAoIChsdl9yaWdodE9wZXJhbmRfNl8wPSBydWxlWE90aGVyT3BlcmF0b3JFeHByZXNzaW9uICkgKSApICkqCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKLQotICAgICAgICAgICAgICAJCQluZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0WFJlbGF0aW9uYWxFeHByZXNzaW9uQWNjZXNzKCkuZ2V0WE90aGVyT3BlcmF0b3JFeHByZXNzaW9uUGFyc2VyUnVsZUNhbGxfMCgpKTsKLSAgICAgICAgICAgICAgCQkKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzc2KTsKLSAgICAgICAgICAgIHRoaXNfWE90aGVyT3BlcmF0b3JFeHByZXNzaW9uXzA9cnVsZVhPdGhlck9wZXJhdG9yRXhwcmVzc2lvbigpOwotCi0gICAgICAgICAgICBzdGF0ZS5fZnNwLS07Ci0gICAgICAgICAgICBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gY3VycmVudDsKLSAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewotCi0gICAgICAgICAgICAgIAkJCWN1cnJlbnQgPSB0aGlzX1hPdGhlck9wZXJhdG9yRXhwcmVzc2lvbl8wOwotICAgICAgICAgICAgICAJCQlhZnRlclBhcnNlck9yRW51bVJ1bGVDYWxsKCk7Ci0gICAgICAgICAgICAgIAkJCi0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzozNjk5OjM6ICggKCAoICggKCAoKSAnaW5zdGFuY2VvZicgKSApPT4gKCAoKSBvdGhlcmx2XzI9ICdpbnN0YW5jZW9mJyApICkgKCAobHZfdHlwZV8zXzA9IHJ1bGVKdm1UeXBlUmVmZXJlbmNlICkgKSApIHwgKCAoICggKCAoKSAoICggcnVsZU9wQ29tcGFyZSApICkgKSApPT4gKCAoKSAoICggcnVsZU9wQ29tcGFyZSApICkgKSApICggKGx2X3JpZ2h0T3BlcmFuZF82XzA9IHJ1bGVYT3RoZXJPcGVyYXRvckV4cHJlc3Npb24gKSApICkgKSoKLSAgICAgICAgICAgIGxvb3A2MzoKLSAgICAgICAgICAgIGRvIHsKLSAgICAgICAgICAgICAgICBpbnQgYWx0NjM9MzsKLSAgICAgICAgICAgICAgICBzd2l0Y2ggKCBpbnB1dC5MQSgxKSApIHsKLSAgICAgICAgICAgICAgICBjYXNlIDg2OgotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGludCBMQTYzXzIgPSBpbnB1dC5MQSgyKTsKLQotICAgICAgICAgICAgICAgICAgICBpZiAoIChzeW5wcmVkMTJfSW50ZXJuYWxEYXRhRFNMKCkpICkgewotICAgICAgICAgICAgICAgICAgICAgICAgYWx0NjM9MjsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlIDg3OgotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGludCBMQTYzXzMgPSBpbnB1dC5MQSgyKTsKLQotICAgICAgICAgICAgICAgICAgICBpZiAoIChzeW5wcmVkMTJfSW50ZXJuYWxEYXRhRFNMKCkpICkgewotICAgICAgICAgICAgICAgICAgICAgICAgYWx0NjM9MjsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlIDk1OgotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGludCBMQTYzXzQgPSBpbnB1dC5MQSgyKTsKLQotICAgICAgICAgICAgICAgICAgICBpZiAoIChzeW5wcmVkMTFfSW50ZXJuYWxEYXRhRFNMKCkpICkgewotICAgICAgICAgICAgICAgICAgICAgICAgYWx0NjM9MTsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlIDg4OgotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGludCBMQTYzXzUgPSBpbnB1dC5MQSgyKTsKLQotICAgICAgICAgICAgICAgICAgICBpZiAoIChzeW5wcmVkMTJfSW50ZXJuYWxEYXRhRFNMKCkpICkgewotICAgICAgICAgICAgICAgICAgICAgICAgYWx0NjM9MjsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIHN3aXRjaCAoYWx0NjMpIHsKLSAgICAgICAgICAgIAljYXNlIDEgOgotICAgICAgICAgICAgCSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzozNzAwOjQ6ICggKCAoICggKCkgJ2luc3RhbmNlb2YnICkgKT0+ICggKCkgb3RoZXJsdl8yPSAnaW5zdGFuY2VvZicgKSApICggKGx2X3R5cGVfM18wPSBydWxlSnZtVHlwZVJlZmVyZW5jZSApICkgKQotICAgICAgICAgICAgCSAgICB7Ci0gICAgICAgICAgICAJICAgIC8vIEludGVybmFsRGF0YURTTC5nOjM3MDA6NDogKCAoICggKCAoKSAnaW5zdGFuY2VvZicgKSApPT4gKCAoKSBvdGhlcmx2XzI9ICdpbnN0YW5jZW9mJyApICkgKCAobHZfdHlwZV8zXzA9IHJ1bGVKdm1UeXBlUmVmZXJlbmNlICkgKSApCi0gICAgICAgICAgICAJICAgIC8vIEludGVybmFsRGF0YURTTC5nOjM3MDE6NTogKCAoICggKCkgJ2luc3RhbmNlb2YnICkgKT0+ICggKCkgb3RoZXJsdl8yPSAnaW5zdGFuY2VvZicgKSApICggKGx2X3R5cGVfM18wPSBydWxlSnZtVHlwZVJlZmVyZW5jZSApICkKLSAgICAgICAgICAgIAkgICAgewotICAgICAgICAgICAgCSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzozNzAxOjU6ICggKCAoICgpICdpbnN0YW5jZW9mJyApICk9PiAoICgpIG90aGVybHZfMj0gJ2luc3RhbmNlb2YnICkgKQotICAgICAgICAgICAgCSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzozNzAyOjY6ICggKCAoKSAnaW5zdGFuY2VvZicgKSApPT4gKCAoKSBvdGhlcmx2XzI9ICdpbnN0YW5jZW9mJyApCi0gICAgICAgICAgICAJICAgIHsKLSAgICAgICAgICAgIAkgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MzcwODo2OiAoICgpIG90aGVybHZfMj0gJ2luc3RhbmNlb2YnICkKLSAgICAgICAgICAgIAkgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MzcwOTo3OiAoKSBvdGhlcmx2XzI9ICdpbnN0YW5jZW9mJwotICAgICAgICAgICAgCSAgICB7Ci0gICAgICAgICAgICAJICAgIC8vIEludGVybmFsRGF0YURTTC5nOjM3MDk6NzogKCkKLSAgICAgICAgICAgIAkgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MzcxMDo4OiAKLSAgICAgICAgICAgIAkgICAgewotICAgICAgICAgICAgCSAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKLQotICAgICAgICAgICAgCSAgICAgIAkJCQkJCQkJY3VycmVudCA9IGZvcmNlQ3JlYXRlTW9kZWxFbGVtZW50QW5kU2V0KAotICAgICAgICAgICAgCSAgICAgIAkJCQkJCQkJCWdyYW1tYXJBY2Nlc3MuZ2V0WFJlbGF0aW9uYWxFeHByZXNzaW9uQWNjZXNzKCkuZ2V0WEluc3RhbmNlT2ZFeHByZXNzaW9uRXhwcmVzc2lvbkFjdGlvbl8xXzBfMF8wXzAoKSwKLSAgICAgICAgICAgIAkgICAgICAJCQkJCQkJCQljdXJyZW50KTsKLSAgICAgICAgICAgIAkgICAgICAJCQkJCQkJCi0gICAgICAgICAgICAJICAgIH0KLQotICAgICAgICAgICAgCSAgICB9Ci0KLSAgICAgICAgICAgIAkgICAgb3RoZXJsdl8yPShUb2tlbiltYXRjaChpbnB1dCw5NSxGT0xMT1dfNzcpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gY3VycmVudDsKLSAgICAgICAgICAgIAkgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7Ci0KLSAgICAgICAgICAgIAkgICAgICAJCQkJCQkJbmV3TGVhZk5vZGUob3RoZXJsdl8yLCBncmFtbWFyQWNjZXNzLmdldFhSZWxhdGlvbmFsRXhwcmVzc2lvbkFjY2VzcygpLmdldEluc3RhbmNlb2ZLZXl3b3JkXzFfMF8wXzBfMSgpKTsKLSAgICAgICAgICAgIAkgICAgICAJCQkJCQkKLSAgICAgICAgICAgIAkgICAgfQotCi0gICAgICAgICAgICAJICAgIH0KLQotCi0gICAgICAgICAgICAJICAgIH0KLQotICAgICAgICAgICAgCSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzozNzIyOjU6ICggKGx2X3R5cGVfM18wPSBydWxlSnZtVHlwZVJlZmVyZW5jZSApICkKLSAgICAgICAgICAgIAkgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MzcyMzo2OiAobHZfdHlwZV8zXzA9IHJ1bGVKdm1UeXBlUmVmZXJlbmNlICkKLSAgICAgICAgICAgIAkgICAgewotICAgICAgICAgICAgCSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzozNzIzOjY6IChsdl90eXBlXzNfMD0gcnVsZUp2bVR5cGVSZWZlcmVuY2UgKQotICAgICAgICAgICAgCSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzozNzI0Ojc6IGx2X3R5cGVfM18wPSBydWxlSnZtVHlwZVJlZmVyZW5jZQotICAgICAgICAgICAgCSAgICB7Ci0gICAgICAgICAgICAJICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewotCi0gICAgICAgICAgICAJICAgICAgCQkJCQkJCW5ld0NvbXBvc2l0ZU5vZGUoZ3JhbW1hckFjY2Vzcy5nZXRYUmVsYXRpb25hbEV4cHJlc3Npb25BY2Nlc3MoKS5nZXRUeXBlSnZtVHlwZVJlZmVyZW5jZVBhcnNlclJ1bGVDYWxsXzFfMF8xXzAoKSk7Ci0gICAgICAgICAgICAJICAgICAgCQkJCQkJCi0gICAgICAgICAgICAJICAgIH0KLSAgICAgICAgICAgIAkgICAgcHVzaEZvbGxvdyhGT0xMT1dfNzYpOwotICAgICAgICAgICAgCSAgICBsdl90eXBlXzNfMD1ydWxlSnZtVHlwZVJlZmVyZW5jZSgpOwotCi0gICAgICAgICAgICAJICAgIHN0YXRlLl9mc3AtLTsKLSAgICAgICAgICAgIAkgICAgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7Ci0gICAgICAgICAgICAJICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewotCi0gICAgICAgICAgICAJICAgICAgCQkJCQkJCWlmIChjdXJyZW50PT1udWxsKSB7Ci0gICAgICAgICAgICAJICAgICAgCQkJCQkJCQljdXJyZW50ID0gY3JlYXRlTW9kZWxFbGVtZW50Rm9yUGFyZW50KGdyYW1tYXJBY2Nlc3MuZ2V0WFJlbGF0aW9uYWxFeHByZXNzaW9uUnVsZSgpKTsKLSAgICAgICAgICAgIAkgICAgICAJCQkJCQkJfQotICAgICAgICAgICAgCSAgICAgIAkJCQkJCQlzZXQoCi0gICAgICAgICAgICAJICAgICAgCQkJCQkJCQljdXJyZW50LAotICAgICAgICAgICAgCSAgICAgIAkJCQkJCQkJInR5cGUiLAotICAgICAgICAgICAgCSAgICAgIAkJCQkJCQkJbHZfdHlwZV8zXzAsCi0gICAgICAgICAgICAJICAgICAgCQkJCQkJCQkib3JnLmVjbGlwc2UueHRleHQueGJhc2UuWHR5cGUuSnZtVHlwZVJlZmVyZW5jZSIpOwotICAgICAgICAgICAgCSAgICAgIAkJCQkJCQlhZnRlclBhcnNlck9yRW51bVJ1bGVDYWxsKCk7Ci0gICAgICAgICAgICAJICAgICAgCQkJCQkJCi0gICAgICAgICAgICAJICAgIH0KLQotICAgICAgICAgICAgCSAgICB9Ci0KLQotICAgICAgICAgICAgCSAgICB9Ci0KLQotICAgICAgICAgICAgCSAgICB9Ci0KLQotICAgICAgICAgICAgCSAgICB9Ci0gICAgICAgICAgICAJICAgIGJyZWFrOwotICAgICAgICAgICAgCWNhc2UgMiA6Ci0gICAgICAgICAgICAJICAgIC8vIEludGVybmFsRGF0YURTTC5nOjM3NDM6NDogKCAoICggKCAoKSAoICggcnVsZU9wQ29tcGFyZSApICkgKSApPT4gKCAoKSAoICggcnVsZU9wQ29tcGFyZSApICkgKSApICggKGx2X3JpZ2h0T3BlcmFuZF82XzA9IHJ1bGVYT3RoZXJPcGVyYXRvckV4cHJlc3Npb24gKSApICkKLSAgICAgICAgICAgIAkgICAgewotICAgICAgICAgICAgCSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzozNzQzOjQ6ICggKCAoICggKCkgKCAoIHJ1bGVPcENvbXBhcmUgKSApICkgKT0+ICggKCkgKCAoIHJ1bGVPcENvbXBhcmUgKSApICkgKSAoIChsdl9yaWdodE9wZXJhbmRfNl8wPSBydWxlWE90aGVyT3BlcmF0b3JFeHByZXNzaW9uICkgKSApCi0gICAgICAgICAgICAJICAgIC8vIEludGVybmFsRGF0YURTTC5nOjM3NDQ6NTogKCAoICggKCkgKCAoIHJ1bGVPcENvbXBhcmUgKSApICkgKT0+ICggKCkgKCAoIHJ1bGVPcENvbXBhcmUgKSApICkgKSAoIChsdl9yaWdodE9wZXJhbmRfNl8wPSBydWxlWE90aGVyT3BlcmF0b3JFeHByZXNzaW9uICkgKQotICAgICAgICAgICAgCSAgICB7Ci0gICAgICAgICAgICAJICAgIC8vIEludGVybmFsRGF0YURTTC5nOjM3NDQ6NTogKCAoICggKCkgKCAoIHJ1bGVPcENvbXBhcmUgKSApICkgKT0+ICggKCkgKCAoIHJ1bGVPcENvbXBhcmUgKSApICkgKQotICAgICAgICAgICAgCSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzozNzQ1OjY6ICggKCAoKSAoICggcnVsZU9wQ29tcGFyZSApICkgKSApPT4gKCAoKSAoICggcnVsZU9wQ29tcGFyZSApICkgKQotICAgICAgICAgICAgCSAgICB7Ci0gICAgICAgICAgICAJICAgIC8vIEludGVybmFsRGF0YURTTC5nOjM3NTU6NjogKCAoKSAoICggcnVsZU9wQ29tcGFyZSApICkgKQotICAgICAgICAgICAgCSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzozNzU2Ojc6ICgpICggKCBydWxlT3BDb21wYXJlICkgKQotICAgICAgICAgICAgCSAgICB7Ci0gICAgICAgICAgICAJICAgIC8vIEludGVybmFsRGF0YURTTC5nOjM3NTY6NzogKCkKLSAgICAgICAgICAgIAkgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6Mzc1Nzo4OiAKLSAgICAgICAgICAgIAkgICAgewotICAgICAgICAgICAgCSAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKLQotICAgICAgICAgICAgCSAgICAgIAkJCQkJCQkJY3VycmVudCA9IGZvcmNlQ3JlYXRlTW9kZWxFbGVtZW50QW5kU2V0KAotICAgICAgICAgICAgCSAgICAgIAkJCQkJCQkJCWdyYW1tYXJBY2Nlc3MuZ2V0WFJlbGF0aW9uYWxFeHByZXNzaW9uQWNjZXNzKCkuZ2V0WEJpbmFyeU9wZXJhdGlvbkxlZnRPcGVyYW5kQWN0aW9uXzFfMV8wXzBfMCgpLAotICAgICAgICAgICAgCSAgICAgIAkJCQkJCQkJCWN1cnJlbnQpOwotICAgICAgICAgICAgCSAgICAgIAkJCQkJCQkKLSAgICAgICAgICAgIAkgICAgfQotCi0gICAgICAgICAgICAJICAgIH0KLQotICAgICAgICAgICAgCSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzozNzYzOjc6ICggKCBydWxlT3BDb21wYXJlICkgKQotICAgICAgICAgICAgCSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzozNzY0Ojg6ICggcnVsZU9wQ29tcGFyZSApCi0gICAgICAgICAgICAJICAgIHsKLSAgICAgICAgICAgIAkgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6Mzc2NDo4OiAoIHJ1bGVPcENvbXBhcmUgKQotICAgICAgICAgICAgCSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzozNzY1Ojk6IHJ1bGVPcENvbXBhcmUKLSAgICAgICAgICAgIAkgICAgewotICAgICAgICAgICAgCSAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKLQotICAgICAgICAgICAgCSAgICAgIAkJCQkJCQkJCWlmIChjdXJyZW50PT1udWxsKSB7Ci0gICAgICAgICAgICAJICAgICAgCQkJCQkJCQkJCWN1cnJlbnQgPSBjcmVhdGVNb2RlbEVsZW1lbnQoZ3JhbW1hckFjY2Vzcy5nZXRYUmVsYXRpb25hbEV4cHJlc3Npb25SdWxlKCkpOwotICAgICAgICAgICAgCSAgICAgIAkJCQkJCQkJCX0KLSAgICAgICAgICAgIAkgICAgICAJCQkJCQkJCQotICAgICAgICAgICAgCSAgICB9Ci0gICAgICAgICAgICAJICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewotCi0gICAgICAgICAgICAJICAgICAgCQkJCQkJCQkJbmV3Q29tcG9zaXRlTm9kZShncmFtbWFyQWNjZXNzLmdldFhSZWxhdGlvbmFsRXhwcmVzc2lvbkFjY2VzcygpLmdldEZlYXR1cmVKdm1JZGVudGlmaWFibGVFbGVtZW50Q3Jvc3NSZWZlcmVuY2VfMV8xXzBfMF8xXzAoKSk7Ci0gICAgICAgICAgICAJICAgICAgCQkJCQkJCQkKLSAgICAgICAgICAgIAkgICAgfQotICAgICAgICAgICAgCSAgICBwdXNoRm9sbG93KEZPTExPV182NCk7Ci0gICAgICAgICAgICAJICAgIHJ1bGVPcENvbXBhcmUoKTsKLQotICAgICAgICAgICAgCSAgICBzdGF0ZS5fZnNwLS07Ci0gICAgICAgICAgICAJICAgIGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OwotICAgICAgICAgICAgCSAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKLQotICAgICAgICAgICAgCSAgICAgIAkJCQkJCQkJCWFmdGVyUGFyc2VyT3JFbnVtUnVsZUNhbGwoKTsKLSAgICAgICAgICAgIAkgICAgICAJCQkJCQkJCQotICAgICAgICAgICAgCSAgICB9Ci0KLSAgICAgICAgICAgIAkgICAgfQotCi0KLSAgICAgICAgICAgIAkgICAgfQotCi0KLSAgICAgICAgICAgIAkgICAgfQotCi0KLSAgICAgICAgICAgIAkgICAgfQotCi0gICAgICAgICAgICAJICAgIC8vIEludGVybmFsRGF0YURTTC5nOjM3ODE6NTogKCAobHZfcmlnaHRPcGVyYW5kXzZfMD0gcnVsZVhPdGhlck9wZXJhdG9yRXhwcmVzc2lvbiApICkKLSAgICAgICAgICAgIAkgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6Mzc4Mjo2OiAobHZfcmlnaHRPcGVyYW5kXzZfMD0gcnVsZVhPdGhlck9wZXJhdG9yRXhwcmVzc2lvbiApCi0gICAgICAgICAgICAJICAgIHsKLSAgICAgICAgICAgIAkgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6Mzc4Mjo2OiAobHZfcmlnaHRPcGVyYW5kXzZfMD0gcnVsZVhPdGhlck9wZXJhdG9yRXhwcmVzc2lvbiApCi0gICAgICAgICAgICAJICAgIC8vIEludGVybmFsRGF0YURTTC5nOjM3ODM6NzogbHZfcmlnaHRPcGVyYW5kXzZfMD0gcnVsZVhPdGhlck9wZXJhdG9yRXhwcmVzc2lvbgotICAgICAgICAgICAgCSAgICB7Ci0gICAgICAgICAgICAJICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewotCi0gICAgICAgICAgICAJICAgICAgCQkJCQkJCW5ld0NvbXBvc2l0ZU5vZGUoZ3JhbW1hckFjY2Vzcy5nZXRYUmVsYXRpb25hbEV4cHJlc3Npb25BY2Nlc3MoKS5nZXRSaWdodE9wZXJhbmRYT3RoZXJPcGVyYXRvckV4cHJlc3Npb25QYXJzZXJSdWxlQ2FsbF8xXzFfMV8wKCkpOwotICAgICAgICAgICAgCSAgICAgIAkJCQkJCQotICAgICAgICAgICAgCSAgICB9Ci0gICAgICAgICAgICAJICAgIHB1c2hGb2xsb3coRk9MTE9XXzc2KTsKLSAgICAgICAgICAgIAkgICAgbHZfcmlnaHRPcGVyYW5kXzZfMD1ydWxlWE90aGVyT3BlcmF0b3JFeHByZXNzaW9uKCk7Ci0KLSAgICAgICAgICAgIAkgICAgc3RhdGUuX2ZzcC0tOwotICAgICAgICAgICAgCSAgICBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gY3VycmVudDsKLSAgICAgICAgICAgIAkgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7Ci0KLSAgICAgICAgICAgIAkgICAgICAJCQkJCQkJaWYgKGN1cnJlbnQ9PW51bGwpIHsKLSAgICAgICAgICAgIAkgICAgICAJCQkJCQkJCWN1cnJlbnQgPSBjcmVhdGVNb2RlbEVsZW1lbnRGb3JQYXJlbnQoZ3JhbW1hckFjY2Vzcy5nZXRYUmVsYXRpb25hbEV4cHJlc3Npb25SdWxlKCkpOwotICAgICAgICAgICAgCSAgICAgIAkJCQkJCQl9Ci0gICAgICAgICAgICAJICAgICAgCQkJCQkJCXNldCgKLSAgICAgICAgICAgIAkgICAgICAJCQkJCQkJCWN1cnJlbnQsCi0gICAgICAgICAgICAJICAgICAgCQkJCQkJCQkicmlnaHRPcGVyYW5kIiwKLSAgICAgICAgICAgIAkgICAgICAJCQkJCQkJCWx2X3JpZ2h0T3BlcmFuZF82XzAsCi0gICAgICAgICAgICAJICAgICAgCQkJCQkJCQkib3JnLmVjbGlwc2UueHRleHQueGJhc2UuWGJhc2UuWE90aGVyT3BlcmF0b3JFeHByZXNzaW9uIik7Ci0gICAgICAgICAgICAJICAgICAgCQkJCQkJCWFmdGVyUGFyc2VyT3JFbnVtUnVsZUNhbGwoKTsKLSAgICAgICAgICAgIAkgICAgICAJCQkJCQkKLSAgICAgICAgICAgIAkgICAgfQotCi0gICAgICAgICAgICAJICAgIH0KLQotCi0gICAgICAgICAgICAJICAgIH0KLQotCi0gICAgICAgICAgICAJICAgIH0KLQotCi0gICAgICAgICAgICAJICAgIH0KLSAgICAgICAgICAgIAkgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgIAlkZWZhdWx0IDoKLSAgICAgICAgICAgIAkgICAgYnJlYWsgbG9vcDYzOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gd2hpbGUgKHRydWUpOwotCi0KLSAgICAgICAgICAgIH0KLQotCi0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewotCi0gICAgICAgICAgICAgIAlsZWF2ZVJ1bGUoKTsKLQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhdGNoIChSZWNvZ25pdGlvbkV4Y2VwdGlvbiByZSkgewotICAgICAgICAgICAgICAgIHJlY292ZXIoaW5wdXQscmUpOwotICAgICAgICAgICAgICAgIGFwcGVuZFNraXBwZWRUb2tlbnMoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgZmluYWxseSB7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGN1cnJlbnQ7Ci0gICAgfQotICAgIC8vICRBTlRMUiBlbmQgInJ1bGVYUmVsYXRpb25hbEV4cHJlc3Npb24iCi0KLQotICAgIC8vICRBTlRMUiBzdGFydCAiZW50cnlSdWxlT3BDb21wYXJlIgotICAgIC8vIEludGVybmFsRGF0YURTTC5nOjM4MDY6MTogZW50cnlSdWxlT3BDb21wYXJlIHJldHVybnMgW1N0cmluZyBjdXJyZW50PW51bGxdIDogaXZfcnVsZU9wQ29tcGFyZT0gcnVsZU9wQ29tcGFyZSBFT0YgOwotICAgIHB1YmxpYyBmaW5hbCBTdHJpbmcgZW50cnlSdWxlT3BDb21wYXJlKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKLSAgICAgICAgU3RyaW5nIGN1cnJlbnQgPSBudWxsOwotCi0gICAgICAgIEFudGxyRGF0YXR5cGVSdWxlVG9rZW4gaXZfcnVsZU9wQ29tcGFyZSA9IG51bGw7Ci0KLQotICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MzgwNjo0OTogKGl2X3J1bGVPcENvbXBhcmU9IHJ1bGVPcENvbXBhcmUgRU9GICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjM4MDc6MjogaXZfcnVsZU9wQ29tcGFyZT0gcnVsZU9wQ29tcGFyZSBFT0YKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewotICAgICAgICAgICAgICAgbmV3Q29tcG9zaXRlTm9kZShncmFtbWFyQWNjZXNzLmdldE9wQ29tcGFyZVJ1bGUoKSk7IAotICAgICAgICAgICAgfQotICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMSk7Ci0gICAgICAgICAgICBpdl9ydWxlT3BDb21wYXJlPXJ1bGVPcENvbXBhcmUoKTsKLQotICAgICAgICAgICAgc3RhdGUuX2ZzcC0tOwotICAgICAgICAgICAgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7Ci0gICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKLSAgICAgICAgICAgICAgIGN1cnJlbnQgPWl2X3J1bGVPcENvbXBhcmUuZ2V0VGV4dCgpOyAKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1hdGNoKGlucHV0LEVPRixGT0xMT1dfMik7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OwotCi0gICAgICAgICAgICB9Ci0KLSAgICAgICAgfQotCi0gICAgICAgICAgICBjYXRjaCAoUmVjb2duaXRpb25FeGNlcHRpb24gcmUpIHsKLSAgICAgICAgICAgICAgICByZWNvdmVyKGlucHV0LHJlKTsKLSAgICAgICAgICAgICAgICBhcHBlbmRTa2lwcGVkVG9rZW5zKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIGZpbmFsbHkgewotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBjdXJyZW50OwotICAgIH0KLSAgICAvLyAkQU5UTFIgZW5kICJlbnRyeVJ1bGVPcENvbXBhcmUiCi0KLQotICAgIC8vICRBTlRMUiBzdGFydCAicnVsZU9wQ29tcGFyZSIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzozODEzOjE6IHJ1bGVPcENvbXBhcmUgcmV0dXJucyBbQW50bHJEYXRhdHlwZVJ1bGVUb2tlbiBjdXJyZW50PW5ldyBBbnRsckRhdGF0eXBlUnVsZVRva2VuKCldIDogKGt3PSAnPj0nIHwgKGt3PSAnPCcga3c9ICc9JyApIHwga3c9ICc+JyB8IGt3PSAnPCcgKSA7Ci0gICAgcHVibGljIGZpbmFsIEFudGxyRGF0YXR5cGVSdWxlVG9rZW4gcnVsZU9wQ29tcGFyZSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7Ci0gICAgICAgIEFudGxyRGF0YXR5cGVSdWxlVG9rZW4gY3VycmVudCA9IG5ldyBBbnRsckRhdGF0eXBlUnVsZVRva2VuKCk7Ci0KLSAgICAgICAgVG9rZW4ga3c9bnVsbDsKLQotCi0gICAgICAgIAllbnRlclJ1bGUoKTsKLQotICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MzgxOToyOiAoIChrdz0gJz49JyB8IChrdz0gJzwnIGt3PSAnPScgKSB8IGt3PSAnPicgfCBrdz0gJzwnICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MzgyMDoyOiAoa3c9ICc+PScgfCAoa3c9ICc8JyBrdz0gJz0nICkgfCBrdz0gJz4nIHwga3c9ICc8JyApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzozODIwOjI6IChrdz0gJz49JyB8IChrdz0gJzwnIGt3PSAnPScgKSB8IGt3PSAnPicgfCBrdz0gJzwnICkKLSAgICAgICAgICAgIGludCBhbHQ2ND00OwotICAgICAgICAgICAgc3dpdGNoICggaW5wdXQuTEEoMSkgKSB7Ci0gICAgICAgICAgICBjYXNlIDg4OgotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBhbHQ2ND0xOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgODY6Ci0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGludCBMQTY0XzIgPSBpbnB1dC5MQSgyKTsKLQotICAgICAgICAgICAgICAgIGlmICggKExBNjRfMj09RU9GfHwoTEE2NF8yPj1SVUxFX1NUUklORyAmJiBMQTY0XzI8PVJVTEVfREVDSU1BTCl8fExBNjRfMj09MTV8fExBNjRfMj09NDZ8fExBNjRfMj09NjV8fChMQTY0XzI+PTY4ICYmIExBNjRfMjw9NjkpfHxMQTY0XzI9PTc0fHwoTEE2NF8yPj03OCAmJiBMQTY0XzI8PTc5KXx8TEE2NF8yPT04Nnx8KExBNjRfMj49MTAyICYmIExBNjRfMjw9MTAzKXx8TEE2NF8yPT0xMDd8fExBNjRfMj09MTEzfHxMQTY0XzI9PTExNXx8KExBNjRfMj49MTE5ICYmIExBNjRfMjw9MTIwKXx8KExBNjRfMj49MTIzICYmIExBNjRfMjw9MTMyKXx8TEE2NF8yPT0xMzQpICkgewotICAgICAgICAgICAgICAgICAgICBhbHQ2ND00OwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlIGlmICggKExBNjRfMj09NzcpICkgewotICAgICAgICAgICAgICAgICAgICBhbHQ2ND0yOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHN0YXRlLmJhY2t0cmFja2luZz4wKSB7c3RhdGUuZmFpbGVkPXRydWU7IHJldHVybiBjdXJyZW50O30KLSAgICAgICAgICAgICAgICAgICAgTm9WaWFibGVBbHRFeGNlcHRpb24gbnZhZSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICBuZXcgTm9WaWFibGVBbHRFeGNlcHRpb24oIiIsIDY0LCAyLCBpbnB1dCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgbnZhZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSA4NzoKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgYWx0NjQ9MzsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgIGlmIChzdGF0ZS5iYWNrdHJhY2tpbmc+MCkge3N0YXRlLmZhaWxlZD10cnVlOyByZXR1cm4gY3VycmVudDt9Ci0gICAgICAgICAgICAgICAgTm9WaWFibGVBbHRFeGNlcHRpb24gbnZhZSA9Ci0gICAgICAgICAgICAgICAgICAgIG5ldyBOb1ZpYWJsZUFsdEV4Y2VwdGlvbigiIiwgNjQsIDAsIGlucHV0KTsKLQotICAgICAgICAgICAgICAgIHRocm93IG52YWU7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHN3aXRjaCAoYWx0NjQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDEgOgotICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzozODIxOjM6IGt3PSAnPj0nCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAga3c9KFRva2VuKW1hdGNoKGlucHV0LDg4LEZPTExPV18yKTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7Ci0gICAgICAgICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewotCi0gICAgICAgICAgICAgICAgICAgICAgCQkJY3VycmVudC5tZXJnZShrdyk7Ci0gICAgICAgICAgICAgICAgICAgICAgCQkJbmV3TGVhZk5vZGUoa3csIGdyYW1tYXJBY2Nlc3MuZ2V0T3BDb21wYXJlQWNjZXNzKCkuZ2V0R3JlYXRlclRoYW5TaWduRXF1YWxzU2lnbktleXdvcmRfMCgpKTsKLSAgICAgICAgICAgICAgICAgICAgICAJCQotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlIDIgOgotICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzozODI3OjM6IChrdz0gJzwnIGt3PSAnPScgKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjM4Mjc6MzogKGt3PSAnPCcga3c9ICc9JyApCi0gICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjM4Mjg6NDoga3c9ICc8JyBrdz0gJz0nCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAga3c9KFRva2VuKW1hdGNoKGlucHV0LDg2LEZPTExPV182Myk7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OwotICAgICAgICAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKLQotICAgICAgICAgICAgICAgICAgICAgIAkJCQljdXJyZW50Lm1lcmdlKGt3KTsKLSAgICAgICAgICAgICAgICAgICAgICAJCQkJbmV3TGVhZk5vZGUoa3csIGdyYW1tYXJBY2Nlc3MuZ2V0T3BDb21wYXJlQWNjZXNzKCkuZ2V0TGVzc1RoYW5TaWduS2V5d29yZF8xXzAoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgCQkJCi0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAga3c9KFRva2VuKW1hdGNoKGlucHV0LDc3LEZPTExPV18yKTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7Ci0gICAgICAgICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewotCi0gICAgICAgICAgICAgICAgICAgICAgCQkJCWN1cnJlbnQubWVyZ2Uoa3cpOwotICAgICAgICAgICAgICAgICAgICAgIAkJCQluZXdMZWFmTm9kZShrdywgZ3JhbW1hckFjY2Vzcy5nZXRPcENvbXBhcmVBY2Nlc3MoKS5nZXRFcXVhbHNTaWduS2V5d29yZF8xXzEoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgCQkJCi0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICB9Ci0KLQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgMyA6Ci0gICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjM4NDA6Mzoga3c9ICc+JwotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGt3PShUb2tlbiltYXRjaChpbnB1dCw4NyxGT0xMT1dfMik7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OwotICAgICAgICAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKLQotICAgICAgICAgICAgICAgICAgICAgIAkJCWN1cnJlbnQubWVyZ2Uoa3cpOwotICAgICAgICAgICAgICAgICAgICAgIAkJCW5ld0xlYWZOb2RlKGt3LCBncmFtbWFyQWNjZXNzLmdldE9wQ29tcGFyZUFjY2VzcygpLmdldEdyZWF0ZXJUaGFuU2lnbktleXdvcmRfMigpKTsKLSAgICAgICAgICAgICAgICAgICAgICAJCQotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlIDQgOgotICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzozODQ2OjM6IGt3PSAnPCcKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBrdz0oVG9rZW4pbWF0Y2goaW5wdXQsODYsRk9MTE9XXzIpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gY3VycmVudDsKLSAgICAgICAgICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAJCQljdXJyZW50Lm1lcmdlKGt3KTsKLSAgICAgICAgICAgICAgICAgICAgICAJCQluZXdMZWFmTm9kZShrdywgZ3JhbW1hckFjY2Vzcy5nZXRPcENvbXBhcmVBY2Nlc3MoKS5nZXRMZXNzVGhhblNpZ25LZXl3b3JkXzMoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgCQkKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgIH0KLQotCi0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewotCi0gICAgICAgICAgICAgIAlsZWF2ZVJ1bGUoKTsKLQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhdGNoIChSZWNvZ25pdGlvbkV4Y2VwdGlvbiByZSkgewotICAgICAgICAgICAgICAgIHJlY292ZXIoaW5wdXQscmUpOwotICAgICAgICAgICAgICAgIGFwcGVuZFNraXBwZWRUb2tlbnMoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgZmluYWxseSB7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGN1cnJlbnQ7Ci0gICAgfQotICAgIC8vICRBTlRMUiBlbmQgInJ1bGVPcENvbXBhcmUiCi0KLQotICAgIC8vICRBTlRMUiBzdGFydCAiZW50cnlSdWxlWE90aGVyT3BlcmF0b3JFeHByZXNzaW9uIgotICAgIC8vIEludGVybmFsRGF0YURTTC5nOjM4NTU6MTogZW50cnlSdWxlWE90aGVyT3BlcmF0b3JFeHByZXNzaW9uIHJldHVybnMgW0VPYmplY3QgY3VycmVudD1udWxsXSA6IGl2X3J1bGVYT3RoZXJPcGVyYXRvckV4cHJlc3Npb249IHJ1bGVYT3RoZXJPcGVyYXRvckV4cHJlc3Npb24gRU9GIDsKLSAgICBwdWJsaWMgZmluYWwgRU9iamVjdCBlbnRyeVJ1bGVYT3RoZXJPcGVyYXRvckV4cHJlc3Npb24oKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewotICAgICAgICBFT2JqZWN0IGN1cnJlbnQgPSBudWxsOwotCi0gICAgICAgIEVPYmplY3QgaXZfcnVsZVhPdGhlck9wZXJhdG9yRXhwcmVzc2lvbiA9IG51bGw7Ci0KLQotICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6Mzg1NTo2NTogKGl2X3J1bGVYT3RoZXJPcGVyYXRvckV4cHJlc3Npb249IHJ1bGVYT3RoZXJPcGVyYXRvckV4cHJlc3Npb24gRU9GICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjM4NTY6MjogaXZfcnVsZVhPdGhlck9wZXJhdG9yRXhwcmVzc2lvbj0gcnVsZVhPdGhlck9wZXJhdG9yRXhwcmVzc2lvbiBFT0YKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewotICAgICAgICAgICAgICAgbmV3Q29tcG9zaXRlTm9kZShncmFtbWFyQWNjZXNzLmdldFhPdGhlck9wZXJhdG9yRXhwcmVzc2lvblJ1bGUoKSk7IAotICAgICAgICAgICAgfQotICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMSk7Ci0gICAgICAgICAgICBpdl9ydWxlWE90aGVyT3BlcmF0b3JFeHByZXNzaW9uPXJ1bGVYT3RoZXJPcGVyYXRvckV4cHJlc3Npb24oKTsKLQotICAgICAgICAgICAgc3RhdGUuX2ZzcC0tOwotICAgICAgICAgICAgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7Ci0gICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKLSAgICAgICAgICAgICAgIGN1cnJlbnQgPWl2X3J1bGVYT3RoZXJPcGVyYXRvckV4cHJlc3Npb247IAotICAgICAgICAgICAgfQotICAgICAgICAgICAgbWF0Y2goaW5wdXQsRU9GLEZPTExPV18yKTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7Ci0KLSAgICAgICAgICAgIH0KLQotICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhdGNoIChSZWNvZ25pdGlvbkV4Y2VwdGlvbiByZSkgewotICAgICAgICAgICAgICAgIHJlY292ZXIoaW5wdXQscmUpOwotICAgICAgICAgICAgICAgIGFwcGVuZFNraXBwZWRUb2tlbnMoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgZmluYWxseSB7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGN1cnJlbnQ7Ci0gICAgfQotICAgIC8vICRBTlRMUiBlbmQgImVudHJ5UnVsZVhPdGhlck9wZXJhdG9yRXhwcmVzc2lvbiIKLQotCi0gICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlWE90aGVyT3BlcmF0b3JFeHByZXNzaW9uIgotICAgIC8vIEludGVybmFsRGF0YURTTC5nOjM4NjI6MTogcnVsZVhPdGhlck9wZXJhdG9yRXhwcmVzc2lvbiByZXR1cm5zIFtFT2JqZWN0IGN1cnJlbnQ9bnVsbF0gOiAodGhpc19YQWRkaXRpdmVFeHByZXNzaW9uXzA9IHJ1bGVYQWRkaXRpdmVFeHByZXNzaW9uICggKCAoICggKCkgKCAoIHJ1bGVPcE90aGVyICkgKSApICk9PiAoICgpICggKCBydWxlT3BPdGhlciApICkgKSApICggKGx2X3JpZ2h0T3BlcmFuZF8zXzA9IHJ1bGVYQWRkaXRpdmVFeHByZXNzaW9uICkgKSApKiApIDsKLSAgICBwdWJsaWMgZmluYWwgRU9iamVjdCBydWxlWE90aGVyT3BlcmF0b3JFeHByZXNzaW9uKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKLSAgICAgICAgRU9iamVjdCBjdXJyZW50ID0gbnVsbDsKLQotICAgICAgICBFT2JqZWN0IHRoaXNfWEFkZGl0aXZlRXhwcmVzc2lvbl8wID0gbnVsbDsKLQotICAgICAgICBFT2JqZWN0IGx2X3JpZ2h0T3BlcmFuZF8zXzAgPSBudWxsOwotCi0KLQotICAgICAgICAJZW50ZXJSdWxlKCk7Ci0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjM4Njg6MjogKCAodGhpc19YQWRkaXRpdmVFeHByZXNzaW9uXzA9IHJ1bGVYQWRkaXRpdmVFeHByZXNzaW9uICggKCAoICggKCkgKCAoIHJ1bGVPcE90aGVyICkgKSApICk9PiAoICgpICggKCBydWxlT3BPdGhlciApICkgKSApICggKGx2X3JpZ2h0T3BlcmFuZF8zXzA9IHJ1bGVYQWRkaXRpdmVFeHByZXNzaW9uICkgKSApKiApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjM4Njk6MjogKHRoaXNfWEFkZGl0aXZlRXhwcmVzc2lvbl8wPSBydWxlWEFkZGl0aXZlRXhwcmVzc2lvbiAoICggKCAoICgpICggKCBydWxlT3BPdGhlciApICkgKSApPT4gKCAoKSAoICggcnVsZU9wT3RoZXIgKSApICkgKSAoIChsdl9yaWdodE9wZXJhbmRfM18wPSBydWxlWEFkZGl0aXZlRXhwcmVzc2lvbiApICkgKSogKQotICAgICAgICAgICAgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6Mzg2OToyOiAodGhpc19YQWRkaXRpdmVFeHByZXNzaW9uXzA9IHJ1bGVYQWRkaXRpdmVFeHByZXNzaW9uICggKCAoICggKCkgKCAoIHJ1bGVPcE90aGVyICkgKSApICk9PiAoICgpICggKCBydWxlT3BPdGhlciApICkgKSApICggKGx2X3JpZ2h0T3BlcmFuZF8zXzA9IHJ1bGVYQWRkaXRpdmVFeHByZXNzaW9uICkgKSApKiApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzozODcwOjM6IHRoaXNfWEFkZGl0aXZlRXhwcmVzc2lvbl8wPSBydWxlWEFkZGl0aXZlRXhwcmVzc2lvbiAoICggKCAoICgpICggKCBydWxlT3BPdGhlciApICkgKSApPT4gKCAoKSAoICggcnVsZU9wT3RoZXIgKSApICkgKSAoIChsdl9yaWdodE9wZXJhbmRfM18wPSBydWxlWEFkZGl0aXZlRXhwcmVzc2lvbiApICkgKSoKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewotCi0gICAgICAgICAgICAgIAkJCW5ld0NvbXBvc2l0ZU5vZGUoZ3JhbW1hckFjY2Vzcy5nZXRYT3RoZXJPcGVyYXRvckV4cHJlc3Npb25BY2Nlc3MoKS5nZXRYQWRkaXRpdmVFeHByZXNzaW9uUGFyc2VyUnVsZUNhbGxfMCgpKTsKLSAgICAgICAgICAgICAgCQkKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzc4KTsKLSAgICAgICAgICAgIHRoaXNfWEFkZGl0aXZlRXhwcmVzc2lvbl8wPXJ1bGVYQWRkaXRpdmVFeHByZXNzaW9uKCk7Ci0KLSAgICAgICAgICAgIHN0YXRlLl9mc3AtLTsKLSAgICAgICAgICAgIGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OwotICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7Ci0KLSAgICAgICAgICAgICAgCQkJY3VycmVudCA9IHRoaXNfWEFkZGl0aXZlRXhwcmVzc2lvbl8wOwotICAgICAgICAgICAgICAJCQlhZnRlclBhcnNlck9yRW51bVJ1bGVDYWxsKCk7Ci0gICAgICAgICAgICAgIAkJCi0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzozODc4OjM6ICggKCAoICggKCkgKCAoIHJ1bGVPcE90aGVyICkgKSApICk9PiAoICgpICggKCBydWxlT3BPdGhlciApICkgKSApICggKGx2X3JpZ2h0T3BlcmFuZF8zXzA9IHJ1bGVYQWRkaXRpdmVFeHByZXNzaW9uICkgKSApKgotICAgICAgICAgICAgbG9vcDY1OgotICAgICAgICAgICAgZG8gewotICAgICAgICAgICAgICAgIGludCBhbHQ2NT0yOwotICAgICAgICAgICAgICAgIGFsdDY1ID0gZGZhNjUucHJlZGljdChpbnB1dCk7Ci0gICAgICAgICAgICAgICAgc3dpdGNoIChhbHQ2NSkgewotICAgICAgICAgICAgCWNhc2UgMSA6Ci0gICAgICAgICAgICAJICAgIC8vIEludGVybmFsRGF0YURTTC5nOjM4Nzk6NDogKCAoICggKCkgKCAoIHJ1bGVPcE90aGVyICkgKSApICk9PiAoICgpICggKCBydWxlT3BPdGhlciApICkgKSApICggKGx2X3JpZ2h0T3BlcmFuZF8zXzA9IHJ1bGVYQWRkaXRpdmVFeHByZXNzaW9uICkgKQotICAgICAgICAgICAgCSAgICB7Ci0gICAgICAgICAgICAJICAgIC8vIEludGVybmFsRGF0YURTTC5nOjM4Nzk6NDogKCAoICggKCkgKCAoIHJ1bGVPcE90aGVyICkgKSApICk9PiAoICgpICggKCBydWxlT3BPdGhlciApICkgKSApCi0gICAgICAgICAgICAJICAgIC8vIEludGVybmFsRGF0YURTTC5nOjM4ODA6NTogKCAoICgpICggKCBydWxlT3BPdGhlciApICkgKSApPT4gKCAoKSAoICggcnVsZU9wT3RoZXIgKSApICkKLSAgICAgICAgICAgIAkgICAgewotICAgICAgICAgICAgCSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzozODkwOjU6ICggKCkgKCAoIHJ1bGVPcE90aGVyICkgKSApCi0gICAgICAgICAgICAJICAgIC8vIEludGVybmFsRGF0YURTTC5nOjM4OTE6NjogKCkgKCAoIHJ1bGVPcE90aGVyICkgKQotICAgICAgICAgICAgCSAgICB7Ci0gICAgICAgICAgICAJICAgIC8vIEludGVybmFsRGF0YURTTC5nOjM4OTE6NjogKCkKLSAgICAgICAgICAgIAkgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6Mzg5Mjo3OiAKLSAgICAgICAgICAgIAkgICAgewotICAgICAgICAgICAgCSAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKLQotICAgICAgICAgICAgCSAgICAgIAkJCQkJCQljdXJyZW50ID0gZm9yY2VDcmVhdGVNb2RlbEVsZW1lbnRBbmRTZXQoCi0gICAgICAgICAgICAJICAgICAgCQkJCQkJCQlncmFtbWFyQWNjZXNzLmdldFhPdGhlck9wZXJhdG9yRXhwcmVzc2lvbkFjY2VzcygpLmdldFhCaW5hcnlPcGVyYXRpb25MZWZ0T3BlcmFuZEFjdGlvbl8xXzBfMF8wKCksCi0gICAgICAgICAgICAJICAgICAgCQkJCQkJCQljdXJyZW50KTsKLSAgICAgICAgICAgIAkgICAgICAJCQkJCQkKLSAgICAgICAgICAgIAkgICAgfQotCi0gICAgICAgICAgICAJICAgIH0KLQotICAgICAgICAgICAgCSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzozODk4OjY6ICggKCBydWxlT3BPdGhlciApICkKLSAgICAgICAgICAgIAkgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6Mzg5OTo3OiAoIHJ1bGVPcE90aGVyICkKLSAgICAgICAgICAgIAkgICAgewotICAgICAgICAgICAgCSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzozODk5Ojc6ICggcnVsZU9wT3RoZXIgKQotICAgICAgICAgICAgCSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzozOTAwOjg6IHJ1bGVPcE90aGVyCi0gICAgICAgICAgICAJICAgIHsKLSAgICAgICAgICAgIAkgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7Ci0KLSAgICAgICAgICAgIAkgICAgICAJCQkJCQkJCWlmIChjdXJyZW50PT1udWxsKSB7Ci0gICAgICAgICAgICAJICAgICAgCQkJCQkJCQkJY3VycmVudCA9IGNyZWF0ZU1vZGVsRWxlbWVudChncmFtbWFyQWNjZXNzLmdldFhPdGhlck9wZXJhdG9yRXhwcmVzc2lvblJ1bGUoKSk7Ci0gICAgICAgICAgICAJICAgICAgCQkJCQkJCQl9Ci0gICAgICAgICAgICAJICAgICAgCQkJCQkJCQotICAgICAgICAgICAgCSAgICB9Ci0gICAgICAgICAgICAJICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewotCi0gICAgICAgICAgICAJICAgICAgCQkJCQkJCQluZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0WE90aGVyT3BlcmF0b3JFeHByZXNzaW9uQWNjZXNzKCkuZ2V0RmVhdHVyZUp2bUlkZW50aWZpYWJsZUVsZW1lbnRDcm9zc1JlZmVyZW5jZV8xXzBfMF8xXzAoKSk7Ci0gICAgICAgICAgICAJICAgICAgCQkJCQkJCQotICAgICAgICAgICAgCSAgICB9Ci0gICAgICAgICAgICAJICAgIHB1c2hGb2xsb3coRk9MTE9XXzY0KTsKLSAgICAgICAgICAgIAkgICAgcnVsZU9wT3RoZXIoKTsKLQotICAgICAgICAgICAgCSAgICBzdGF0ZS5fZnNwLS07Ci0gICAgICAgICAgICAJICAgIGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OwotICAgICAgICAgICAgCSAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKLQotICAgICAgICAgICAgCSAgICAgIAkJCQkJCQkJYWZ0ZXJQYXJzZXJPckVudW1SdWxlQ2FsbCgpOwotICAgICAgICAgICAgCSAgICAgIAkJCQkJCQkKLSAgICAgICAgICAgIAkgICAgfQotCi0gICAgICAgICAgICAJICAgIH0KLQotCi0gICAgICAgICAgICAJICAgIH0KLQotCi0gICAgICAgICAgICAJICAgIH0KLQotCi0gICAgICAgICAgICAJICAgIH0KLQotICAgICAgICAgICAgCSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzozOTE2OjQ6ICggKGx2X3JpZ2h0T3BlcmFuZF8zXzA9IHJ1bGVYQWRkaXRpdmVFeHByZXNzaW9uICkgKQotICAgICAgICAgICAgCSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzozOTE3OjU6IChsdl9yaWdodE9wZXJhbmRfM18wPSBydWxlWEFkZGl0aXZlRXhwcmVzc2lvbiApCi0gICAgICAgICAgICAJICAgIHsKLSAgICAgICAgICAgIAkgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MzkxNzo1OiAobHZfcmlnaHRPcGVyYW5kXzNfMD0gcnVsZVhBZGRpdGl2ZUV4cHJlc3Npb24gKQotICAgICAgICAgICAgCSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzozOTE4OjY6IGx2X3JpZ2h0T3BlcmFuZF8zXzA9IHJ1bGVYQWRkaXRpdmVFeHByZXNzaW9uCi0gICAgICAgICAgICAJICAgIHsKLSAgICAgICAgICAgIAkgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7Ci0KLSAgICAgICAgICAgIAkgICAgICAJCQkJCQluZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0WE90aGVyT3BlcmF0b3JFeHByZXNzaW9uQWNjZXNzKCkuZ2V0UmlnaHRPcGVyYW5kWEFkZGl0aXZlRXhwcmVzc2lvblBhcnNlclJ1bGVDYWxsXzFfMV8wKCkpOwotICAgICAgICAgICAgCSAgICAgIAkJCQkJCi0gICAgICAgICAgICAJICAgIH0KLSAgICAgICAgICAgIAkgICAgcHVzaEZvbGxvdyhGT0xMT1dfNzgpOwotICAgICAgICAgICAgCSAgICBsdl9yaWdodE9wZXJhbmRfM18wPXJ1bGVYQWRkaXRpdmVFeHByZXNzaW9uKCk7Ci0KLSAgICAgICAgICAgIAkgICAgc3RhdGUuX2ZzcC0tOwotICAgICAgICAgICAgCSAgICBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gY3VycmVudDsKLSAgICAgICAgICAgIAkgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7Ci0KLSAgICAgICAgICAgIAkgICAgICAJCQkJCQlpZiAoY3VycmVudD09bnVsbCkgewotICAgICAgICAgICAgCSAgICAgIAkJCQkJCQljdXJyZW50ID0gY3JlYXRlTW9kZWxFbGVtZW50Rm9yUGFyZW50KGdyYW1tYXJBY2Nlc3MuZ2V0WE90aGVyT3BlcmF0b3JFeHByZXNzaW9uUnVsZSgpKTsKLSAgICAgICAgICAgIAkgICAgICAJCQkJCQl9Ci0gICAgICAgICAgICAJICAgICAgCQkJCQkJc2V0KAotICAgICAgICAgICAgCSAgICAgIAkJCQkJCQljdXJyZW50LAotICAgICAgICAgICAgCSAgICAgIAkJCQkJCQkicmlnaHRPcGVyYW5kIiwKLSAgICAgICAgICAgIAkgICAgICAJCQkJCQkJbHZfcmlnaHRPcGVyYW5kXzNfMCwKLSAgICAgICAgICAgIAkgICAgICAJCQkJCQkJIm9yZy5lY2xpcHNlLnh0ZXh0LnhiYXNlLlhiYXNlLlhBZGRpdGl2ZUV4cHJlc3Npb24iKTsKLSAgICAgICAgICAgIAkgICAgICAJCQkJCQlhZnRlclBhcnNlck9yRW51bVJ1bGVDYWxsKCk7Ci0gICAgICAgICAgICAJICAgICAgCQkJCQkKLSAgICAgICAgICAgIAkgICAgfQotCi0gICAgICAgICAgICAJICAgIH0KLQotCi0gICAgICAgICAgICAJICAgIH0KLQotCi0gICAgICAgICAgICAJICAgIH0KLSAgICAgICAgICAgIAkgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgIAlkZWZhdWx0IDoKLSAgICAgICAgICAgIAkgICAgYnJlYWsgbG9vcDY1OwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gd2hpbGUgKHRydWUpOwotCi0KLSAgICAgICAgICAgIH0KLQotCi0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewotCi0gICAgICAgICAgICAgIAlsZWF2ZVJ1bGUoKTsKLQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhdGNoIChSZWNvZ25pdGlvbkV4Y2VwdGlvbiByZSkgewotICAgICAgICAgICAgICAgIHJlY292ZXIoaW5wdXQscmUpOwotICAgICAgICAgICAgICAgIGFwcGVuZFNraXBwZWRUb2tlbnMoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgZmluYWxseSB7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGN1cnJlbnQ7Ci0gICAgfQotICAgIC8vICRBTlRMUiBlbmQgInJ1bGVYT3RoZXJPcGVyYXRvckV4cHJlc3Npb24iCi0KLQotICAgIC8vICRBTlRMUiBzdGFydCAiZW50cnlSdWxlT3BPdGhlciIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzozOTQwOjE6IGVudHJ5UnVsZU9wT3RoZXIgcmV0dXJucyBbU3RyaW5nIGN1cnJlbnQ9bnVsbF0gOiBpdl9ydWxlT3BPdGhlcj0gcnVsZU9wT3RoZXIgRU9GIDsKLSAgICBwdWJsaWMgZmluYWwgU3RyaW5nIGVudHJ5UnVsZU9wT3RoZXIoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewotICAgICAgICBTdHJpbmcgY3VycmVudCA9IG51bGw7Ci0KLSAgICAgICAgQW50bHJEYXRhdHlwZVJ1bGVUb2tlbiBpdl9ydWxlT3BPdGhlciA9IG51bGw7Ci0KLQotICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6Mzk0MDo0NzogKGl2X3J1bGVPcE90aGVyPSBydWxlT3BPdGhlciBFT0YgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6Mzk0MToyOiBpdl9ydWxlT3BPdGhlcj0gcnVsZU9wT3RoZXIgRU9GCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKLSAgICAgICAgICAgICAgIG5ld0NvbXBvc2l0ZU5vZGUoZ3JhbW1hckFjY2Vzcy5nZXRPcE90aGVyUnVsZSgpKTsgCi0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV18xKTsKLSAgICAgICAgICAgIGl2X3J1bGVPcE90aGVyPXJ1bGVPcE90aGVyKCk7Ci0KLSAgICAgICAgICAgIHN0YXRlLl9mc3AtLTsKLSAgICAgICAgICAgIGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OwotICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7Ci0gICAgICAgICAgICAgICBjdXJyZW50ID1pdl9ydWxlT3BPdGhlci5nZXRUZXh0KCk7IAotICAgICAgICAgICAgfQotICAgICAgICAgICAgbWF0Y2goaW5wdXQsRU9GLEZPTExPV18yKTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7Ci0KLSAgICAgICAgICAgIH0KLQotICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhdGNoIChSZWNvZ25pdGlvbkV4Y2VwdGlvbiByZSkgewotICAgICAgICAgICAgICAgIHJlY292ZXIoaW5wdXQscmUpOwotICAgICAgICAgICAgICAgIGFwcGVuZFNraXBwZWRUb2tlbnMoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgZmluYWxseSB7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGN1cnJlbnQ7Ci0gICAgfQotICAgIC8vICRBTlRMUiBlbmQgImVudHJ5UnVsZU9wT3RoZXIiCi0KLQotICAgIC8vICRBTlRMUiBzdGFydCAicnVsZU9wT3RoZXIiCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6Mzk0NzoxOiBydWxlT3BPdGhlciByZXR1cm5zIFtBbnRsckRhdGF0eXBlUnVsZVRva2VuIGN1cnJlbnQ9bmV3IEFudGxyRGF0YXR5cGVSdWxlVG9rZW4oKV0gOiAoa3c9ICctPicgfCBrdz0gJy4uPCcgfCAoa3c9ICc+JyBrdz0gJy4uJyApIHwga3c9ICcuLicgfCBrdz0gJz0+JyB8IChrdz0gJz4nICggKCAoICggJz4nICc+JyApICk9PiAoa3c9ICc+JyBrdz0gJz4nICkgKSB8IGt3PSAnPicgKSApIHwgKGt3PSAnPCcgKCAoICggKCAnPCcgJzwnICkgKT0+IChrdz0gJzwnIGt3PSAnPCcgKSApIHwga3c9ICc8JyB8IGt3PSAnPT4nICkgKSB8IGt3PSAnPD4nIHwga3c9ICc/OicgKSA7Ci0gICAgcHVibGljIGZpbmFsIEFudGxyRGF0YXR5cGVSdWxlVG9rZW4gcnVsZU9wT3RoZXIoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewotICAgICAgICBBbnRsckRhdGF0eXBlUnVsZVRva2VuIGN1cnJlbnQgPSBuZXcgQW50bHJEYXRhdHlwZVJ1bGVUb2tlbigpOwotCi0gICAgICAgIFRva2VuIGt3PW51bGw7Ci0KLQotICAgICAgICAJZW50ZXJSdWxlKCk7Ci0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjM5NTM6MjogKCAoa3c9ICctPicgfCBrdz0gJy4uPCcgfCAoa3c9ICc+JyBrdz0gJy4uJyApIHwga3c9ICcuLicgfCBrdz0gJz0+JyB8IChrdz0gJz4nICggKCAoICggJz4nICc+JyApICk9PiAoa3c9ICc+JyBrdz0gJz4nICkgKSB8IGt3PSAnPicgKSApIHwgKGt3PSAnPCcgKCAoICggKCAnPCcgJzwnICkgKT0+IChrdz0gJzwnIGt3PSAnPCcgKSApIHwga3c9ICc8JyB8IGt3PSAnPT4nICkgKSB8IGt3PSAnPD4nIHwga3c9ICc/OicgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzozOTU0OjI6IChrdz0gJy0+JyB8IGt3PSAnLi48JyB8IChrdz0gJz4nIGt3PSAnLi4nICkgfCBrdz0gJy4uJyB8IGt3PSAnPT4nIHwgKGt3PSAnPicgKCAoICggKCAnPicgJz4nICkgKT0+IChrdz0gJz4nIGt3PSAnPicgKSApIHwga3c9ICc+JyApICkgfCAoa3c9ICc8JyAoICggKCAoICc8JyAnPCcgKSApPT4gKGt3PSAnPCcga3c9ICc8JyApICkgfCBrdz0gJzwnIHwga3c9ICc9PicgKSApIHwga3c9ICc8PicgfCBrdz0gJz86JyApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzozOTU0OjI6IChrdz0gJy0+JyB8IGt3PSAnLi48JyB8IChrdz0gJz4nIGt3PSAnLi4nICkgfCBrdz0gJy4uJyB8IGt3PSAnPT4nIHwgKGt3PSAnPicgKCAoICggKCAnPicgJz4nICkgKT0+IChrdz0gJz4nIGt3PSAnPicgKSApIHwga3c9ICc+JyApICkgfCAoa3c9ICc8JyAoICggKCAoICc8JyAnPCcgKSApPT4gKGt3PSAnPCcga3c9ICc8JyApICkgfCBrdz0gJzwnIHwga3c9ICc9PicgKSApIHwga3c9ICc8PicgfCBrdz0gJz86JyApCi0gICAgICAgICAgICBpbnQgYWx0Njg9OTsKLSAgICAgICAgICAgIGFsdDY4ID0gZGZhNjgucHJlZGljdChpbnB1dCk7Ci0gICAgICAgICAgICBzd2l0Y2ggKGFsdDY4KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAxIDoKLSAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6Mzk1NTozOiBrdz0gJy0+JwotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGt3PShUb2tlbiltYXRjaChpbnB1dCw5NixGT0xMT1dfMik7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OwotICAgICAgICAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKLQotICAgICAgICAgICAgICAgICAgICAgIAkJCWN1cnJlbnQubWVyZ2Uoa3cpOwotICAgICAgICAgICAgICAgICAgICAgIAkJCW5ld0xlYWZOb2RlKGt3LCBncmFtbWFyQWNjZXNzLmdldE9wT3RoZXJBY2Nlc3MoKS5nZXRIeXBoZW5NaW51c0dyZWF0ZXJUaGFuU2lnbktleXdvcmRfMCgpKTsKLSAgICAgICAgICAgICAgICAgICAgICAJCQotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlIDIgOgotICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzozOTYxOjM6IGt3PSAnLi48JwotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGt3PShUb2tlbiltYXRjaChpbnB1dCw5NyxGT0xMT1dfMik7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OwotICAgICAgICAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKLQotICAgICAgICAgICAgICAgICAgICAgIAkJCWN1cnJlbnQubWVyZ2Uoa3cpOwotICAgICAgICAgICAgICAgICAgICAgIAkJCW5ld0xlYWZOb2RlKGt3LCBncmFtbWFyQWNjZXNzLmdldE9wT3RoZXJBY2Nlc3MoKS5nZXRGdWxsU3RvcEZ1bGxTdG9wTGVzc1RoYW5TaWduS2V5d29yZF8xKCkpOwotICAgICAgICAgICAgICAgICAgICAgIAkJCi0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgMyA6Ci0gICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjM5Njc6MzogKGt3PSAnPicga3c9ICcuLicgKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjM5Njc6MzogKGt3PSAnPicga3c9ICcuLicgKQotICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzozOTY4OjQ6IGt3PSAnPicga3c9ICcuLicKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBrdz0oVG9rZW4pbWF0Y2goaW5wdXQsODcsRk9MTE9XXzc5KTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7Ci0gICAgICAgICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewotCi0gICAgICAgICAgICAgICAgICAgICAgCQkJCWN1cnJlbnQubWVyZ2Uoa3cpOwotICAgICAgICAgICAgICAgICAgICAgIAkJCQluZXdMZWFmTm9kZShrdywgZ3JhbW1hckFjY2Vzcy5nZXRPcE90aGVyQWNjZXNzKCkuZ2V0R3JlYXRlclRoYW5TaWduS2V5d29yZF8yXzAoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgCQkJCi0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAga3c9KFRva2VuKW1hdGNoKGlucHV0LDk4LEZPTExPV18yKTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7Ci0gICAgICAgICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewotCi0gICAgICAgICAgICAgICAgICAgICAgCQkJCWN1cnJlbnQubWVyZ2Uoa3cpOwotICAgICAgICAgICAgICAgICAgICAgIAkJCQluZXdMZWFmTm9kZShrdywgZ3JhbW1hckFjY2Vzcy5nZXRPcE90aGVyQWNjZXNzKCkuZ2V0RnVsbFN0b3BGdWxsU3RvcEtleXdvcmRfMl8xKCkpOwotICAgICAgICAgICAgICAgICAgICAgIAkJCQotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgfQotCi0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlIDQgOgotICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzozOTgwOjM6IGt3PSAnLi4nCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAga3c9KFRva2VuKW1hdGNoKGlucHV0LDk4LEZPTExPV18yKTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7Ci0gICAgICAgICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewotCi0gICAgICAgICAgICAgICAgICAgICAgCQkJY3VycmVudC5tZXJnZShrdyk7Ci0gICAgICAgICAgICAgICAgICAgICAgCQkJbmV3TGVhZk5vZGUoa3csIGdyYW1tYXJBY2Nlc3MuZ2V0T3BPdGhlckFjY2VzcygpLmdldEZ1bGxTdG9wRnVsbFN0b3BLZXl3b3JkXzMoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgCQkKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgY2FzZSA1IDoKLSAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6Mzk4NjozOiBrdz0gJz0+JwotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGt3PShUb2tlbiltYXRjaChpbnB1dCw5OSxGT0xMT1dfMik7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OwotICAgICAgICAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKLQotICAgICAgICAgICAgICAgICAgICAgIAkJCWN1cnJlbnQubWVyZ2Uoa3cpOwotICAgICAgICAgICAgICAgICAgICAgIAkJCW5ld0xlYWZOb2RlKGt3LCBncmFtbWFyQWNjZXNzLmdldE9wT3RoZXJBY2Nlc3MoKS5nZXRFcXVhbHNTaWduR3JlYXRlclRoYW5TaWduS2V5d29yZF80KCkpOwotICAgICAgICAgICAgICAgICAgICAgIAkJCi0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgNiA6Ci0gICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjM5OTI6MzogKGt3PSAnPicgKCAoICggKCAnPicgJz4nICkgKT0+IChrdz0gJz4nIGt3PSAnPicgKSApIHwga3c9ICc+JyApICkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzozOTkyOjM6IChrdz0gJz4nICggKCAoICggJz4nICc+JyApICk9PiAoa3c9ICc+JyBrdz0gJz4nICkgKSB8IGt3PSAnPicgKSApCi0gICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjM5OTM6NDoga3c9ICc+JyAoICggKCAoICc+JyAnPicgKSApPT4gKGt3PSAnPicga3c9ICc+JyApICkgfCBrdz0gJz4nICkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBrdz0oVG9rZW4pbWF0Y2goaW5wdXQsODcsRk9MTE9XXzgwKTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7Ci0gICAgICAgICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewotCi0gICAgICAgICAgICAgICAgICAgICAgCQkJCWN1cnJlbnQubWVyZ2Uoa3cpOwotICAgICAgICAgICAgICAgICAgICAgIAkJCQluZXdMZWFmTm9kZShrdywgZ3JhbW1hckFjY2Vzcy5nZXRPcE90aGVyQWNjZXNzKCkuZ2V0R3JlYXRlclRoYW5TaWduS2V5d29yZF81XzAoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgCQkJCi0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6Mzk5ODo0OiAoICggKCAoICc+JyAnPicgKSApPT4gKGt3PSAnPicga3c9ICc+JyApICkgfCBrdz0gJz4nICkKLSAgICAgICAgICAgICAgICAgICAgaW50IGFsdDY2PTI7Ci0gICAgICAgICAgICAgICAgICAgIGludCBMQTY2XzAgPSBpbnB1dC5MQSgxKTsKLQotICAgICAgICAgICAgICAgICAgICBpZiAoIChMQTY2XzA9PTg3KSApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGludCBMQTY2XzEgPSBpbnB1dC5MQSgyKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCAoTEE2Nl8xPT1FT0Z8fChMQTY2XzE+PVJVTEVfU1RSSU5HICYmIExBNjZfMTw9UlVMRV9ERUNJTUFMKXx8TEE2Nl8xPT0xNXx8TEE2Nl8xPT00Nnx8TEE2Nl8xPT02NXx8KExBNjZfMT49NjggJiYgTEE2Nl8xPD02OSl8fExBNjZfMT09NzR8fChMQTY2XzE+PTc4ICYmIExBNjZfMTw9NzkpfHxMQTY2XzE9PTg2fHwoTEE2Nl8xPj0xMDIgJiYgTEE2Nl8xPD0xMDMpfHxMQTY2XzE9PTEwN3x8TEE2Nl8xPT0xMTN8fExBNjZfMT09MTE1fHwoTEE2Nl8xPj0xMTkgJiYgTEE2Nl8xPD0xMjApfHwoTEE2Nl8xPj0xMjMgJiYgTEE2Nl8xPD0xMzIpfHxMQTY2XzE9PTEzNCkgKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYWx0NjY9MjsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKCAoTEE2Nl8xPT04NykgJiYgKHN5bnByZWQxNF9JbnRlcm5hbERhdGFEU0woKSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbHQ2Nj0xOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN0YXRlLmJhY2t0cmFja2luZz4wKSB7c3RhdGUuZmFpbGVkPXRydWU7IHJldHVybiBjdXJyZW50O30KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBOb1ZpYWJsZUFsdEV4Y2VwdGlvbiBudmFlID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IE5vVmlhYmxlQWx0RXhjZXB0aW9uKCIiLCA2NiwgMSwgaW5wdXQpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbnZhZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdGF0ZS5iYWNrdHJhY2tpbmc+MCkge3N0YXRlLmZhaWxlZD10cnVlOyByZXR1cm4gY3VycmVudDt9Ci0gICAgICAgICAgICAgICAgICAgICAgICBOb1ZpYWJsZUFsdEV4Y2VwdGlvbiBudmFlID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgTm9WaWFibGVBbHRFeGNlcHRpb24oIiIsIDY2LCAwLCBpbnB1dCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG52YWU7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChhbHQ2NikgewotICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxIDoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzozOTk5OjU6ICggKCAoICc+JyAnPicgKSApPT4gKGt3PSAnPicga3c9ICc+JyApICkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6Mzk5OTo1OiAoICggKCAnPicgJz4nICkgKT0+IChrdz0gJz4nIGt3PSAnPicgKSApCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NDAwMDo2OiAoICggJz4nICc+JyApICk9PiAoa3c9ICc+JyBrdz0gJz4nICkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NDAwNTo2OiAoa3c9ICc+JyBrdz0gJz4nICkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo0MDA2Ojc6IGt3PSAnPicga3c9ICc+JwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBrdz0oVG9rZW4pbWF0Y2goaW5wdXQsODcsRk9MTE9XXzgwKTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAkJCQkJCQljdXJyZW50Lm1lcmdlKGt3KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAkJCQkJCQluZXdMZWFmTm9kZShrdywgZ3JhbW1hckFjY2Vzcy5nZXRPcE90aGVyQWNjZXNzKCkuZ2V0R3JlYXRlclRoYW5TaWduS2V5d29yZF81XzFfMF8wXzAoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAJCQkJCQkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAga3c9KFRva2VuKW1hdGNoKGlucHV0LDg3LEZPTExPV18yKTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAkJCQkJCQljdXJyZW50Lm1lcmdlKGt3KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAkJCQkJCQluZXdMZWFmTm9kZShrdywgZ3JhbW1hckFjY2Vzcy5nZXRPcE90aGVyQWNjZXNzKCkuZ2V0R3JlYXRlclRoYW5TaWduS2V5d29yZF81XzFfMF8wXzEoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAJCQkJCQkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAyIDoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo0MDE5OjU6IGt3PSAnPicKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAga3c9KFRva2VuKW1hdGNoKGlucHV0LDg3LEZPTExPV18yKTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAkJCQkJY3VycmVudC5tZXJnZShrdyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAJCQkJCW5ld0xlYWZOb2RlKGt3LCBncmFtbWFyQWNjZXNzLmdldE9wT3RoZXJBY2Nlc3MoKS5nZXRHcmVhdGVyVGhhblNpZ25LZXl3b3JkXzVfMV8xKCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCQkJCQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgICAgICB9Ci0KLQotICAgICAgICAgICAgICAgICAgICB9Ci0KLQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgNyA6Ci0gICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjQwMjc6MzogKGt3PSAnPCcgKCAoICggKCAnPCcgJzwnICkgKT0+IChrdz0gJzwnIGt3PSAnPCcgKSApIHwga3c9ICc8JyB8IGt3PSAnPT4nICkgKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjQwMjc6MzogKGt3PSAnPCcgKCAoICggKCAnPCcgJzwnICkgKT0+IChrdz0gJzwnIGt3PSAnPCcgKSApIHwga3c9ICc8JyB8IGt3PSAnPT4nICkgKQotICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo0MDI4OjQ6IGt3PSAnPCcgKCAoICggKCAnPCcgJzwnICkgKT0+IChrdz0gJzwnIGt3PSAnPCcgKSApIHwga3c9ICc8JyB8IGt3PSAnPT4nICkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBrdz0oVG9rZW4pbWF0Y2goaW5wdXQsODYsRk9MTE9XXzgxKTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7Ci0gICAgICAgICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewotCi0gICAgICAgICAgICAgICAgICAgICAgCQkJCWN1cnJlbnQubWVyZ2Uoa3cpOwotICAgICAgICAgICAgICAgICAgICAgIAkJCQluZXdMZWFmTm9kZShrdywgZ3JhbW1hckFjY2Vzcy5nZXRPcE90aGVyQWNjZXNzKCkuZ2V0TGVzc1RoYW5TaWduS2V5d29yZF82XzAoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgCQkJCi0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NDAzMzo0OiAoICggKCAoICc8JyAnPCcgKSApPT4gKGt3PSAnPCcga3c9ICc8JyApICkgfCBrdz0gJzwnIHwga3c9ICc9PicgKQotICAgICAgICAgICAgICAgICAgICBpbnQgYWx0Njc9MzsKLSAgICAgICAgICAgICAgICAgICAgaW50IExBNjdfMCA9IGlucHV0LkxBKDEpOwotCi0gICAgICAgICAgICAgICAgICAgIGlmICggKExBNjdfMD09ODYpICkgewotICAgICAgICAgICAgICAgICAgICAgICAgaW50IExBNjdfMSA9IGlucHV0LkxBKDIpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIChzeW5wcmVkMTVfSW50ZXJuYWxEYXRhRFNMKCkpICkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsdDY3PTE7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICggKHRydWUpICkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsdDY3PTI7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3RhdGUuYmFja3RyYWNraW5nPjApIHtzdGF0ZS5mYWlsZWQ9dHJ1ZTsgcmV0dXJuIGN1cnJlbnQ7fQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5vVmlhYmxlQWx0RXhjZXB0aW9uIG52YWUgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgTm9WaWFibGVBbHRFeGNlcHRpb24oIiIsIDY3LCAxLCBpbnB1dCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBudmFlOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKCAoTEE2N18wPT05OSkgKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBhbHQ2Nz0zOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN0YXRlLmJhY2t0cmFja2luZz4wKSB7c3RhdGUuZmFpbGVkPXRydWU7IHJldHVybiBjdXJyZW50O30KLSAgICAgICAgICAgICAgICAgICAgICAgIE5vVmlhYmxlQWx0RXhjZXB0aW9uIG52YWUgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBOb1ZpYWJsZUFsdEV4Y2VwdGlvbigiIiwgNjcsIDAsIGlucHV0KTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbnZhZTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKGFsdDY3KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDEgOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjQwMzQ6NTogKCAoICggJzwnICc8JyApICk9PiAoa3c9ICc8JyBrdz0gJzwnICkgKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo0MDM0OjU6ICggKCAoICc8JyAnPCcgKSApPT4gKGt3PSAnPCcga3c9ICc8JyApICkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo0MDM1OjY6ICggKCAnPCcgJzwnICkgKT0+IChrdz0gJzwnIGt3PSAnPCcgKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo0MDQwOjY6IChrdz0gJzwnIGt3PSAnPCcgKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjQwNDE6Nzoga3c9ICc8JyBrdz0gJzwnCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGt3PShUb2tlbiltYXRjaChpbnB1dCw4NixGT0xMT1dfNzApOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gY3VycmVudDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCQkJCQkJCWN1cnJlbnQubWVyZ2Uoa3cpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCQkJCQkJCW5ld0xlYWZOb2RlKGt3LCBncmFtbWFyQWNjZXNzLmdldE9wT3RoZXJBY2Nlc3MoKS5nZXRMZXNzVGhhblNpZ25LZXl3b3JkXzZfMV8wXzBfMCgpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAkJCQkJCQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBrdz0oVG9rZW4pbWF0Y2goaW5wdXQsODYsRk9MTE9XXzIpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gY3VycmVudDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCQkJCQkJCWN1cnJlbnQubWVyZ2Uoa3cpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCQkJCQkJCW5ld0xlYWZOb2RlKGt3LCBncmFtbWFyQWNjZXNzLmdldE9wT3RoZXJBY2Nlc3MoKS5nZXRMZXNzVGhhblNpZ25LZXl3b3JkXzZfMV8wXzBfMSgpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAkJCQkJCQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDIgOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjQwNTQ6NToga3c9ICc8JwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBrdz0oVG9rZW4pbWF0Y2goaW5wdXQsODYsRk9MTE9XXzIpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gY3VycmVudDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCQkJCQljdXJyZW50Lm1lcmdlKGt3KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAkJCQkJbmV3TGVhZk5vZGUoa3csIGdyYW1tYXJBY2Nlc3MuZ2V0T3BPdGhlckFjY2VzcygpLmdldExlc3NUaGFuU2lnbktleXdvcmRfNl8xXzEoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAJCQkJCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAzIDoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo0MDYwOjU6IGt3PSAnPT4nCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGt3PShUb2tlbiltYXRjaChpbnB1dCw5OSxGT0xMT1dfMik7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAJCQkJCWN1cnJlbnQubWVyZ2Uoa3cpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCQkJCQluZXdMZWFmTm9kZShrdywgZ3JhbW1hckFjY2Vzcy5nZXRPcE90aGVyQWNjZXNzKCkuZ2V0RXF1YWxzU2lnbkdyZWF0ZXJUaGFuU2lnbktleXdvcmRfNl8xXzIoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAJCQkJCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgICAgIH0KLQotCi0gICAgICAgICAgICAgICAgICAgIH0KLQotCi0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgY2FzZSA4IDoKLSAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NDA2ODozOiBrdz0gJzw+JwotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGt3PShUb2tlbiltYXRjaChpbnB1dCwxMDAsRk9MTE9XXzIpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gY3VycmVudDsKLSAgICAgICAgICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAJCQljdXJyZW50Lm1lcmdlKGt3KTsKLSAgICAgICAgICAgICAgICAgICAgICAJCQluZXdMZWFmTm9kZShrdywgZ3JhbW1hckFjY2Vzcy5nZXRPcE90aGVyQWNjZXNzKCkuZ2V0TGVzc1RoYW5TaWduR3JlYXRlclRoYW5TaWduS2V5d29yZF83KCkpOwotICAgICAgICAgICAgICAgICAgICAgIAkJCi0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgOSA6Ci0gICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjQwNzQ6Mzoga3c9ICc/OicKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBrdz0oVG9rZW4pbWF0Y2goaW5wdXQsMTAxLEZPTExPV18yKTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7Ci0gICAgICAgICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewotCi0gICAgICAgICAgICAgICAgICAgICAgCQkJY3VycmVudC5tZXJnZShrdyk7Ci0gICAgICAgICAgICAgICAgICAgICAgCQkJbmV3TGVhZk5vZGUoa3csIGdyYW1tYXJBY2Nlc3MuZ2V0T3BPdGhlckFjY2VzcygpLmdldFF1ZXN0aW9uTWFya0NvbG9uS2V5d29yZF84KCkpOwotICAgICAgICAgICAgICAgICAgICAgIAkJCi0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICB9Ci0KLQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKLQotICAgICAgICAgICAgICAJbGVhdmVSdWxlKCk7Ci0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgICAgICBjYXRjaCAoUmVjb2duaXRpb25FeGNlcHRpb24gcmUpIHsKLSAgICAgICAgICAgICAgICByZWNvdmVyKGlucHV0LHJlKTsKLSAgICAgICAgICAgICAgICBhcHBlbmRTa2lwcGVkVG9rZW5zKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIGZpbmFsbHkgewotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBjdXJyZW50OwotICAgIH0KLSAgICAvLyAkQU5UTFIgZW5kICJydWxlT3BPdGhlciIKLQotCi0gICAgLy8gJEFOVExSIHN0YXJ0ICJlbnRyeVJ1bGVYQWRkaXRpdmVFeHByZXNzaW9uIgotICAgIC8vIEludGVybmFsRGF0YURTTC5nOjQwODM6MTogZW50cnlSdWxlWEFkZGl0aXZlRXhwcmVzc2lvbiByZXR1cm5zIFtFT2JqZWN0IGN1cnJlbnQ9bnVsbF0gOiBpdl9ydWxlWEFkZGl0aXZlRXhwcmVzc2lvbj0gcnVsZVhBZGRpdGl2ZUV4cHJlc3Npb24gRU9GIDsKLSAgICBwdWJsaWMgZmluYWwgRU9iamVjdCBlbnRyeVJ1bGVYQWRkaXRpdmVFeHByZXNzaW9uKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKLSAgICAgICAgRU9iamVjdCBjdXJyZW50ID0gbnVsbDsKLQotICAgICAgICBFT2JqZWN0IGl2X3J1bGVYQWRkaXRpdmVFeHByZXNzaW9uID0gbnVsbDsKLQotCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo0MDgzOjYwOiAoaXZfcnVsZVhBZGRpdGl2ZUV4cHJlc3Npb249IHJ1bGVYQWRkaXRpdmVFeHByZXNzaW9uIEVPRiApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo0MDg0OjI6IGl2X3J1bGVYQWRkaXRpdmVFeHByZXNzaW9uPSBydWxlWEFkZGl0aXZlRXhwcmVzc2lvbiBFT0YKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewotICAgICAgICAgICAgICAgbmV3Q29tcG9zaXRlTm9kZShncmFtbWFyQWNjZXNzLmdldFhBZGRpdGl2ZUV4cHJlc3Npb25SdWxlKCkpOyAKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzEpOwotICAgICAgICAgICAgaXZfcnVsZVhBZGRpdGl2ZUV4cHJlc3Npb249cnVsZVhBZGRpdGl2ZUV4cHJlc3Npb24oKTsKLQotICAgICAgICAgICAgc3RhdGUuX2ZzcC0tOwotICAgICAgICAgICAgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7Ci0gICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKLSAgICAgICAgICAgICAgIGN1cnJlbnQgPWl2X3J1bGVYQWRkaXRpdmVFeHByZXNzaW9uOyAKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1hdGNoKGlucHV0LEVPRixGT0xMT1dfMik7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OwotCi0gICAgICAgICAgICB9Ci0KLSAgICAgICAgfQotCi0gICAgICAgICAgICBjYXRjaCAoUmVjb2duaXRpb25FeGNlcHRpb24gcmUpIHsKLSAgICAgICAgICAgICAgICByZWNvdmVyKGlucHV0LHJlKTsKLSAgICAgICAgICAgICAgICBhcHBlbmRTa2lwcGVkVG9rZW5zKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIGZpbmFsbHkgewotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBjdXJyZW50OwotICAgIH0KLSAgICAvLyAkQU5UTFIgZW5kICJlbnRyeVJ1bGVYQWRkaXRpdmVFeHByZXNzaW9uIgotCi0KLSAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVYQWRkaXRpdmVFeHByZXNzaW9uIgotICAgIC8vIEludGVybmFsRGF0YURTTC5nOjQwOTA6MTogcnVsZVhBZGRpdGl2ZUV4cHJlc3Npb24gcmV0dXJucyBbRU9iamVjdCBjdXJyZW50PW51bGxdIDogKHRoaXNfWE11bHRpcGxpY2F0aXZlRXhwcmVzc2lvbl8wPSBydWxlWE11bHRpcGxpY2F0aXZlRXhwcmVzc2lvbiAoICggKCAoICgpICggKCBydWxlT3BBZGQgKSApICkgKT0+ICggKCkgKCAoIHJ1bGVPcEFkZCApICkgKSApICggKGx2X3JpZ2h0T3BlcmFuZF8zXzA9IHJ1bGVYTXVsdGlwbGljYXRpdmVFeHByZXNzaW9uICkgKSApKiApIDsKLSAgICBwdWJsaWMgZmluYWwgRU9iamVjdCBydWxlWEFkZGl0aXZlRXhwcmVzc2lvbigpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7Ci0gICAgICAgIEVPYmplY3QgY3VycmVudCA9IG51bGw7Ci0KLSAgICAgICAgRU9iamVjdCB0aGlzX1hNdWx0aXBsaWNhdGl2ZUV4cHJlc3Npb25fMCA9IG51bGw7Ci0KLSAgICAgICAgRU9iamVjdCBsdl9yaWdodE9wZXJhbmRfM18wID0gbnVsbDsKLQotCi0KLSAgICAgICAgCWVudGVyUnVsZSgpOwotCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo0MDk2OjI6ICggKHRoaXNfWE11bHRpcGxpY2F0aXZlRXhwcmVzc2lvbl8wPSBydWxlWE11bHRpcGxpY2F0aXZlRXhwcmVzc2lvbiAoICggKCAoICgpICggKCBydWxlT3BBZGQgKSApICkgKT0+ICggKCkgKCAoIHJ1bGVPcEFkZCApICkgKSApICggKGx2X3JpZ2h0T3BlcmFuZF8zXzA9IHJ1bGVYTXVsdGlwbGljYXRpdmVFeHByZXNzaW9uICkgKSApKiApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjQwOTc6MjogKHRoaXNfWE11bHRpcGxpY2F0aXZlRXhwcmVzc2lvbl8wPSBydWxlWE11bHRpcGxpY2F0aXZlRXhwcmVzc2lvbiAoICggKCAoICgpICggKCBydWxlT3BBZGQgKSApICkgKT0+ICggKCkgKCAoIHJ1bGVPcEFkZCApICkgKSApICggKGx2X3JpZ2h0T3BlcmFuZF8zXzA9IHJ1bGVYTXVsdGlwbGljYXRpdmVFeHByZXNzaW9uICkgKSApKiApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo0MDk3OjI6ICh0aGlzX1hNdWx0aXBsaWNhdGl2ZUV4cHJlc3Npb25fMD0gcnVsZVhNdWx0aXBsaWNhdGl2ZUV4cHJlc3Npb24gKCAoICggKCAoKSAoICggcnVsZU9wQWRkICkgKSApICk9PiAoICgpICggKCBydWxlT3BBZGQgKSApICkgKSAoIChsdl9yaWdodE9wZXJhbmRfM18wPSBydWxlWE11bHRpcGxpY2F0aXZlRXhwcmVzc2lvbiApICkgKSogKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NDA5ODozOiB0aGlzX1hNdWx0aXBsaWNhdGl2ZUV4cHJlc3Npb25fMD0gcnVsZVhNdWx0aXBsaWNhdGl2ZUV4cHJlc3Npb24gKCAoICggKCAoKSAoICggcnVsZU9wQWRkICkgKSApICk9PiAoICgpICggKCBydWxlT3BBZGQgKSApICkgKSAoIChsdl9yaWdodE9wZXJhbmRfM18wPSBydWxlWE11bHRpcGxpY2F0aXZlRXhwcmVzc2lvbiApICkgKSoKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewotCi0gICAgICAgICAgICAgIAkJCW5ld0NvbXBvc2l0ZU5vZGUoZ3JhbW1hckFjY2Vzcy5nZXRYQWRkaXRpdmVFeHByZXNzaW9uQWNjZXNzKCkuZ2V0WE11bHRpcGxpY2F0aXZlRXhwcmVzc2lvblBhcnNlclJ1bGVDYWxsXzAoKSk7Ci0gICAgICAgICAgICAgIAkJCi0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV184Mik7Ci0gICAgICAgICAgICB0aGlzX1hNdWx0aXBsaWNhdGl2ZUV4cHJlc3Npb25fMD1ydWxlWE11bHRpcGxpY2F0aXZlRXhwcmVzc2lvbigpOwotCi0gICAgICAgICAgICBzdGF0ZS5fZnNwLS07Ci0gICAgICAgICAgICBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gY3VycmVudDsKLSAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewotCi0gICAgICAgICAgICAgIAkJCWN1cnJlbnQgPSB0aGlzX1hNdWx0aXBsaWNhdGl2ZUV4cHJlc3Npb25fMDsKLSAgICAgICAgICAgICAgCQkJYWZ0ZXJQYXJzZXJPckVudW1SdWxlQ2FsbCgpOwotICAgICAgICAgICAgICAJCQotICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NDEwNjozOiAoICggKCAoICgpICggKCBydWxlT3BBZGQgKSApICkgKT0+ICggKCkgKCAoIHJ1bGVPcEFkZCApICkgKSApICggKGx2X3JpZ2h0T3BlcmFuZF8zXzA9IHJ1bGVYTXVsdGlwbGljYXRpdmVFeHByZXNzaW9uICkgKSApKgotICAgICAgICAgICAgbG9vcDY5OgotICAgICAgICAgICAgZG8gewotICAgICAgICAgICAgICAgIGludCBhbHQ2OT0yOwotICAgICAgICAgICAgICAgIGludCBMQTY5XzAgPSBpbnB1dC5MQSgxKTsKLQotICAgICAgICAgICAgICAgIGlmICggKExBNjlfMD09MTAyKSApIHsKLSAgICAgICAgICAgICAgICAgICAgaW50IExBNjlfMiA9IGlucHV0LkxBKDIpOwotCi0gICAgICAgICAgICAgICAgICAgIGlmICggKHN5bnByZWQxNl9JbnRlcm5hbERhdGFEU0woKSkgKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBhbHQ2OT0xOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlIGlmICggKExBNjlfMD09MTAzKSApIHsKLSAgICAgICAgICAgICAgICAgICAgaW50IExBNjlfMyA9IGlucHV0LkxBKDIpOwotCi0gICAgICAgICAgICAgICAgICAgIGlmICggKHN5bnByZWQxNl9JbnRlcm5hbERhdGFEU0woKSkgKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBhbHQ2OT0xOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLQotICAgICAgICAgICAgICAgIH0KLQotCi0gICAgICAgICAgICAgICAgc3dpdGNoIChhbHQ2OSkgewotICAgICAgICAgICAgCWNhc2UgMSA6Ci0gICAgICAgICAgICAJICAgIC8vIEludGVybmFsRGF0YURTTC5nOjQxMDc6NDogKCAoICggKCkgKCAoIHJ1bGVPcEFkZCApICkgKSApPT4gKCAoKSAoICggcnVsZU9wQWRkICkgKSApICkgKCAobHZfcmlnaHRPcGVyYW5kXzNfMD0gcnVsZVhNdWx0aXBsaWNhdGl2ZUV4cHJlc3Npb24gKSApCi0gICAgICAgICAgICAJICAgIHsKLSAgICAgICAgICAgIAkgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NDEwNzo0OiAoICggKCAoKSAoICggcnVsZU9wQWRkICkgKSApICk9PiAoICgpICggKCBydWxlT3BBZGQgKSApICkgKQotICAgICAgICAgICAgCSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo0MTA4OjU6ICggKCAoKSAoICggcnVsZU9wQWRkICkgKSApICk9PiAoICgpICggKCBydWxlT3BBZGQgKSApICkKLSAgICAgICAgICAgIAkgICAgewotICAgICAgICAgICAgCSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo0MTE4OjU6ICggKCkgKCAoIHJ1bGVPcEFkZCApICkgKQotICAgICAgICAgICAgCSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo0MTE5OjY6ICgpICggKCBydWxlT3BBZGQgKSApCi0gICAgICAgICAgICAJICAgIHsKLSAgICAgICAgICAgIAkgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NDExOTo2OiAoKQotICAgICAgICAgICAgCSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo0MTIwOjc6IAotICAgICAgICAgICAgCSAgICB7Ci0gICAgICAgICAgICAJICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewotCi0gICAgICAgICAgICAJICAgICAgCQkJCQkJCWN1cnJlbnQgPSBmb3JjZUNyZWF0ZU1vZGVsRWxlbWVudEFuZFNldCgKLSAgICAgICAgICAgIAkgICAgICAJCQkJCQkJCWdyYW1tYXJBY2Nlc3MuZ2V0WEFkZGl0aXZlRXhwcmVzc2lvbkFjY2VzcygpLmdldFhCaW5hcnlPcGVyYXRpb25MZWZ0T3BlcmFuZEFjdGlvbl8xXzBfMF8wKCksCi0gICAgICAgICAgICAJICAgICAgCQkJCQkJCQljdXJyZW50KTsKLSAgICAgICAgICAgIAkgICAgICAJCQkJCQkKLSAgICAgICAgICAgIAkgICAgfQotCi0gICAgICAgICAgICAJICAgIH0KLQotICAgICAgICAgICAgCSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo0MTI2OjY6ICggKCBydWxlT3BBZGQgKSApCi0gICAgICAgICAgICAJICAgIC8vIEludGVybmFsRGF0YURTTC5nOjQxMjc6NzogKCBydWxlT3BBZGQgKQotICAgICAgICAgICAgCSAgICB7Ci0gICAgICAgICAgICAJICAgIC8vIEludGVybmFsRGF0YURTTC5nOjQxMjc6NzogKCBydWxlT3BBZGQgKQotICAgICAgICAgICAgCSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo0MTI4Ojg6IHJ1bGVPcEFkZAotICAgICAgICAgICAgCSAgICB7Ci0gICAgICAgICAgICAJICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewotCi0gICAgICAgICAgICAJICAgICAgCQkJCQkJCQlpZiAoY3VycmVudD09bnVsbCkgewotICAgICAgICAgICAgCSAgICAgIAkJCQkJCQkJCWN1cnJlbnQgPSBjcmVhdGVNb2RlbEVsZW1lbnQoZ3JhbW1hckFjY2Vzcy5nZXRYQWRkaXRpdmVFeHByZXNzaW9uUnVsZSgpKTsKLSAgICAgICAgICAgIAkgICAgICAJCQkJCQkJCX0KLSAgICAgICAgICAgIAkgICAgICAJCQkJCQkJCi0gICAgICAgICAgICAJICAgIH0KLSAgICAgICAgICAgIAkgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7Ci0KLSAgICAgICAgICAgIAkgICAgICAJCQkJCQkJCW5ld0NvbXBvc2l0ZU5vZGUoZ3JhbW1hckFjY2Vzcy5nZXRYQWRkaXRpdmVFeHByZXNzaW9uQWNjZXNzKCkuZ2V0RmVhdHVyZUp2bUlkZW50aWZpYWJsZUVsZW1lbnRDcm9zc1JlZmVyZW5jZV8xXzBfMF8xXzAoKSk7Ci0gICAgICAgICAgICAJICAgICAgCQkJCQkJCQotICAgICAgICAgICAgCSAgICB9Ci0gICAgICAgICAgICAJICAgIHB1c2hGb2xsb3coRk9MTE9XXzY0KTsKLSAgICAgICAgICAgIAkgICAgcnVsZU9wQWRkKCk7Ci0KLSAgICAgICAgICAgIAkgICAgc3RhdGUuX2ZzcC0tOwotICAgICAgICAgICAgCSAgICBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gY3VycmVudDsKLSAgICAgICAgICAgIAkgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7Ci0KLSAgICAgICAgICAgIAkgICAgICAJCQkJCQkJCWFmdGVyUGFyc2VyT3JFbnVtUnVsZUNhbGwoKTsKLSAgICAgICAgICAgIAkgICAgICAJCQkJCQkJCi0gICAgICAgICAgICAJICAgIH0KLQotICAgICAgICAgICAgCSAgICB9Ci0KLQotICAgICAgICAgICAgCSAgICB9Ci0KLQotICAgICAgICAgICAgCSAgICB9Ci0KLQotICAgICAgICAgICAgCSAgICB9Ci0KLSAgICAgICAgICAgIAkgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NDE0NDo0OiAoIChsdl9yaWdodE9wZXJhbmRfM18wPSBydWxlWE11bHRpcGxpY2F0aXZlRXhwcmVzc2lvbiApICkKLSAgICAgICAgICAgIAkgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NDE0NTo1OiAobHZfcmlnaHRPcGVyYW5kXzNfMD0gcnVsZVhNdWx0aXBsaWNhdGl2ZUV4cHJlc3Npb24gKQotICAgICAgICAgICAgCSAgICB7Ci0gICAgICAgICAgICAJICAgIC8vIEludGVybmFsRGF0YURTTC5nOjQxNDU6NTogKGx2X3JpZ2h0T3BlcmFuZF8zXzA9IHJ1bGVYTXVsdGlwbGljYXRpdmVFeHByZXNzaW9uICkKLSAgICAgICAgICAgIAkgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NDE0Njo2OiBsdl9yaWdodE9wZXJhbmRfM18wPSBydWxlWE11bHRpcGxpY2F0aXZlRXhwcmVzc2lvbgotICAgICAgICAgICAgCSAgICB7Ci0gICAgICAgICAgICAJICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewotCi0gICAgICAgICAgICAJICAgICAgCQkJCQkJbmV3Q29tcG9zaXRlTm9kZShncmFtbWFyQWNjZXNzLmdldFhBZGRpdGl2ZUV4cHJlc3Npb25BY2Nlc3MoKS5nZXRSaWdodE9wZXJhbmRYTXVsdGlwbGljYXRpdmVFeHByZXNzaW9uUGFyc2VyUnVsZUNhbGxfMV8xXzAoKSk7Ci0gICAgICAgICAgICAJICAgICAgCQkJCQkKLSAgICAgICAgICAgIAkgICAgfQotICAgICAgICAgICAgCSAgICBwdXNoRm9sbG93KEZPTExPV184Mik7Ci0gICAgICAgICAgICAJICAgIGx2X3JpZ2h0T3BlcmFuZF8zXzA9cnVsZVhNdWx0aXBsaWNhdGl2ZUV4cHJlc3Npb24oKTsKLQotICAgICAgICAgICAgCSAgICBzdGF0ZS5fZnNwLS07Ci0gICAgICAgICAgICAJICAgIGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OwotICAgICAgICAgICAgCSAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKLQotICAgICAgICAgICAgCSAgICAgIAkJCQkJCWlmIChjdXJyZW50PT1udWxsKSB7Ci0gICAgICAgICAgICAJICAgICAgCQkJCQkJCWN1cnJlbnQgPSBjcmVhdGVNb2RlbEVsZW1lbnRGb3JQYXJlbnQoZ3JhbW1hckFjY2Vzcy5nZXRYQWRkaXRpdmVFeHByZXNzaW9uUnVsZSgpKTsKLSAgICAgICAgICAgIAkgICAgICAJCQkJCQl9Ci0gICAgICAgICAgICAJICAgICAgCQkJCQkJc2V0KAotICAgICAgICAgICAgCSAgICAgIAkJCQkJCQljdXJyZW50LAotICAgICAgICAgICAgCSAgICAgIAkJCQkJCQkicmlnaHRPcGVyYW5kIiwKLSAgICAgICAgICAgIAkgICAgICAJCQkJCQkJbHZfcmlnaHRPcGVyYW5kXzNfMCwKLSAgICAgICAgICAgIAkgICAgICAJCQkJCQkJIm9yZy5lY2xpcHNlLnh0ZXh0LnhiYXNlLlhiYXNlLlhNdWx0aXBsaWNhdGl2ZUV4cHJlc3Npb24iKTsKLSAgICAgICAgICAgIAkgICAgICAJCQkJCQlhZnRlclBhcnNlck9yRW51bVJ1bGVDYWxsKCk7Ci0gICAgICAgICAgICAJICAgICAgCQkJCQkKLSAgICAgICAgICAgIAkgICAgfQotCi0gICAgICAgICAgICAJICAgIH0KLQotCi0gICAgICAgICAgICAJICAgIH0KLQotCi0gICAgICAgICAgICAJICAgIH0KLSAgICAgICAgICAgIAkgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgIAlkZWZhdWx0IDoKLSAgICAgICAgICAgIAkgICAgYnJlYWsgbG9vcDY5OwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gd2hpbGUgKHRydWUpOwotCi0KLSAgICAgICAgICAgIH0KLQotCi0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewotCi0gICAgICAgICAgICAgIAlsZWF2ZVJ1bGUoKTsKLQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhdGNoIChSZWNvZ25pdGlvbkV4Y2VwdGlvbiByZSkgewotICAgICAgICAgICAgICAgIHJlY292ZXIoaW5wdXQscmUpOwotICAgICAgICAgICAgICAgIGFwcGVuZFNraXBwZWRUb2tlbnMoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgZmluYWxseSB7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGN1cnJlbnQ7Ci0gICAgfQotICAgIC8vICRBTlRMUiBlbmQgInJ1bGVYQWRkaXRpdmVFeHByZXNzaW9uIgotCi0KLSAgICAvLyAkQU5UTFIgc3RhcnQgImVudHJ5UnVsZU9wQWRkIgotICAgIC8vIEludGVybmFsRGF0YURTTC5nOjQxNjg6MTogZW50cnlSdWxlT3BBZGQgcmV0dXJucyBbU3RyaW5nIGN1cnJlbnQ9bnVsbF0gOiBpdl9ydWxlT3BBZGQ9IHJ1bGVPcEFkZCBFT0YgOwotICAgIHB1YmxpYyBmaW5hbCBTdHJpbmcgZW50cnlSdWxlT3BBZGQoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewotICAgICAgICBTdHJpbmcgY3VycmVudCA9IG51bGw7Ci0KLSAgICAgICAgQW50bHJEYXRhdHlwZVJ1bGVUb2tlbiBpdl9ydWxlT3BBZGQgPSBudWxsOwotCi0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjQxNjg6NDU6IChpdl9ydWxlT3BBZGQ9IHJ1bGVPcEFkZCBFT0YgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NDE2OToyOiBpdl9ydWxlT3BBZGQ9IHJ1bGVPcEFkZCBFT0YKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewotICAgICAgICAgICAgICAgbmV3Q29tcG9zaXRlTm9kZShncmFtbWFyQWNjZXNzLmdldE9wQWRkUnVsZSgpKTsgCi0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV18xKTsKLSAgICAgICAgICAgIGl2X3J1bGVPcEFkZD1ydWxlT3BBZGQoKTsKLQotICAgICAgICAgICAgc3RhdGUuX2ZzcC0tOwotICAgICAgICAgICAgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7Ci0gICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKLSAgICAgICAgICAgICAgIGN1cnJlbnQgPWl2X3J1bGVPcEFkZC5nZXRUZXh0KCk7IAotICAgICAgICAgICAgfQotICAgICAgICAgICAgbWF0Y2goaW5wdXQsRU9GLEZPTExPV18yKTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7Ci0KLSAgICAgICAgICAgIH0KLQotICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhdGNoIChSZWNvZ25pdGlvbkV4Y2VwdGlvbiByZSkgewotICAgICAgICAgICAgICAgIHJlY292ZXIoaW5wdXQscmUpOwotICAgICAgICAgICAgICAgIGFwcGVuZFNraXBwZWRUb2tlbnMoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgZmluYWxseSB7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGN1cnJlbnQ7Ci0gICAgfQotICAgIC8vICRBTlRMUiBlbmQgImVudHJ5UnVsZU9wQWRkIgotCi0KLSAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVPcEFkZCIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo0MTc1OjE6IHJ1bGVPcEFkZCByZXR1cm5zIFtBbnRsckRhdGF0eXBlUnVsZVRva2VuIGN1cnJlbnQ9bmV3IEFudGxyRGF0YXR5cGVSdWxlVG9rZW4oKV0gOiAoa3c9ICcrJyB8IGt3PSAnLScgKSA7Ci0gICAgcHVibGljIGZpbmFsIEFudGxyRGF0YXR5cGVSdWxlVG9rZW4gcnVsZU9wQWRkKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKLSAgICAgICAgQW50bHJEYXRhdHlwZVJ1bGVUb2tlbiBjdXJyZW50ID0gbmV3IEFudGxyRGF0YXR5cGVSdWxlVG9rZW4oKTsKLQotICAgICAgICBUb2tlbiBrdz1udWxsOwotCi0KLSAgICAgICAgCWVudGVyUnVsZSgpOwotCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo0MTgxOjI6ICggKGt3PSAnKycgfCBrdz0gJy0nICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NDE4MjoyOiAoa3c9ICcrJyB8IGt3PSAnLScgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NDE4MjoyOiAoa3c9ICcrJyB8IGt3PSAnLScgKQotICAgICAgICAgICAgaW50IGFsdDcwPTI7Ci0gICAgICAgICAgICBpbnQgTEE3MF8wID0gaW5wdXQuTEEoMSk7Ci0KLSAgICAgICAgICAgIGlmICggKExBNzBfMD09MTAyKSApIHsKLSAgICAgICAgICAgICAgICBhbHQ3MD0xOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSBpZiAoIChMQTcwXzA9PTEwMykgKSB7Ci0gICAgICAgICAgICAgICAgYWx0NzA9MjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgIGlmIChzdGF0ZS5iYWNrdHJhY2tpbmc+MCkge3N0YXRlLmZhaWxlZD10cnVlOyByZXR1cm4gY3VycmVudDt9Ci0gICAgICAgICAgICAgICAgTm9WaWFibGVBbHRFeGNlcHRpb24gbnZhZSA9Ci0gICAgICAgICAgICAgICAgICAgIG5ldyBOb1ZpYWJsZUFsdEV4Y2VwdGlvbigiIiwgNzAsIDAsIGlucHV0KTsKLQotICAgICAgICAgICAgICAgIHRocm93IG52YWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBzd2l0Y2ggKGFsdDcwKSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAxIDoKLSAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NDE4MzozOiBrdz0gJysnCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAga3c9KFRva2VuKW1hdGNoKGlucHV0LDEwMixGT0xMT1dfMik7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OwotICAgICAgICAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKLQotICAgICAgICAgICAgICAgICAgICAgIAkJCWN1cnJlbnQubWVyZ2Uoa3cpOwotICAgICAgICAgICAgICAgICAgICAgIAkJCW5ld0xlYWZOb2RlKGt3LCBncmFtbWFyQWNjZXNzLmdldE9wQWRkQWNjZXNzKCkuZ2V0UGx1c1NpZ25LZXl3b3JkXzAoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgCQkKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgY2FzZSAyIDoKLSAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NDE4OTozOiBrdz0gJy0nCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAga3c9KFRva2VuKW1hdGNoKGlucHV0LDEwMyxGT0xMT1dfMik7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OwotICAgICAgICAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKLQotICAgICAgICAgICAgICAgICAgICAgIAkJCWN1cnJlbnQubWVyZ2Uoa3cpOwotICAgICAgICAgICAgICAgICAgICAgIAkJCW5ld0xlYWZOb2RlKGt3LCBncmFtbWFyQWNjZXNzLmdldE9wQWRkQWNjZXNzKCkuZ2V0SHlwaGVuTWludXNLZXl3b3JkXzEoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgCQkKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgIH0KLQotCi0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewotCi0gICAgICAgICAgICAgIAlsZWF2ZVJ1bGUoKTsKLQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhdGNoIChSZWNvZ25pdGlvbkV4Y2VwdGlvbiByZSkgewotICAgICAgICAgICAgICAgIHJlY292ZXIoaW5wdXQscmUpOwotICAgICAgICAgICAgICAgIGFwcGVuZFNraXBwZWRUb2tlbnMoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgZmluYWxseSB7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGN1cnJlbnQ7Ci0gICAgfQotICAgIC8vICRBTlRMUiBlbmQgInJ1bGVPcEFkZCIKLQotCi0gICAgLy8gJEFOVExSIHN0YXJ0ICJlbnRyeVJ1bGVYTXVsdGlwbGljYXRpdmVFeHByZXNzaW9uIgotICAgIC8vIEludGVybmFsRGF0YURTTC5nOjQxOTg6MTogZW50cnlSdWxlWE11bHRpcGxpY2F0aXZlRXhwcmVzc2lvbiByZXR1cm5zIFtFT2JqZWN0IGN1cnJlbnQ9bnVsbF0gOiBpdl9ydWxlWE11bHRpcGxpY2F0aXZlRXhwcmVzc2lvbj0gcnVsZVhNdWx0aXBsaWNhdGl2ZUV4cHJlc3Npb24gRU9GIDsKLSAgICBwdWJsaWMgZmluYWwgRU9iamVjdCBlbnRyeVJ1bGVYTXVsdGlwbGljYXRpdmVFeHByZXNzaW9uKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKLSAgICAgICAgRU9iamVjdCBjdXJyZW50ID0gbnVsbDsKLQotICAgICAgICBFT2JqZWN0IGl2X3J1bGVYTXVsdGlwbGljYXRpdmVFeHByZXNzaW9uID0gbnVsbDsKLQotCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo0MTk4OjY2OiAoaXZfcnVsZVhNdWx0aXBsaWNhdGl2ZUV4cHJlc3Npb249IHJ1bGVYTXVsdGlwbGljYXRpdmVFeHByZXNzaW9uIEVPRiApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo0MTk5OjI6IGl2X3J1bGVYTXVsdGlwbGljYXRpdmVFeHByZXNzaW9uPSBydWxlWE11bHRpcGxpY2F0aXZlRXhwcmVzc2lvbiBFT0YKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewotICAgICAgICAgICAgICAgbmV3Q29tcG9zaXRlTm9kZShncmFtbWFyQWNjZXNzLmdldFhNdWx0aXBsaWNhdGl2ZUV4cHJlc3Npb25SdWxlKCkpOyAKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzEpOwotICAgICAgICAgICAgaXZfcnVsZVhNdWx0aXBsaWNhdGl2ZUV4cHJlc3Npb249cnVsZVhNdWx0aXBsaWNhdGl2ZUV4cHJlc3Npb24oKTsKLQotICAgICAgICAgICAgc3RhdGUuX2ZzcC0tOwotICAgICAgICAgICAgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7Ci0gICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKLSAgICAgICAgICAgICAgIGN1cnJlbnQgPWl2X3J1bGVYTXVsdGlwbGljYXRpdmVFeHByZXNzaW9uOyAKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1hdGNoKGlucHV0LEVPRixGT0xMT1dfMik7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OwotCi0gICAgICAgICAgICB9Ci0KLSAgICAgICAgfQotCi0gICAgICAgICAgICBjYXRjaCAoUmVjb2duaXRpb25FeGNlcHRpb24gcmUpIHsKLSAgICAgICAgICAgICAgICByZWNvdmVyKGlucHV0LHJlKTsKLSAgICAgICAgICAgICAgICBhcHBlbmRTa2lwcGVkVG9rZW5zKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIGZpbmFsbHkgewotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBjdXJyZW50OwotICAgIH0KLSAgICAvLyAkQU5UTFIgZW5kICJlbnRyeVJ1bGVYTXVsdGlwbGljYXRpdmVFeHByZXNzaW9uIgotCi0KLSAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVYTXVsdGlwbGljYXRpdmVFeHByZXNzaW9uIgotICAgIC8vIEludGVybmFsRGF0YURTTC5nOjQyMDU6MTogcnVsZVhNdWx0aXBsaWNhdGl2ZUV4cHJlc3Npb24gcmV0dXJucyBbRU9iamVjdCBjdXJyZW50PW51bGxdIDogKHRoaXNfWFVuYXJ5T3BlcmF0aW9uXzA9IHJ1bGVYVW5hcnlPcGVyYXRpb24gKCAoICggKCAoKSAoICggcnVsZU9wTXVsdGkgKSApICkgKT0+ICggKCkgKCAoIHJ1bGVPcE11bHRpICkgKSApICkgKCAobHZfcmlnaHRPcGVyYW5kXzNfMD0gcnVsZVhVbmFyeU9wZXJhdGlvbiApICkgKSogKSA7Ci0gICAgcHVibGljIGZpbmFsIEVPYmplY3QgcnVsZVhNdWx0aXBsaWNhdGl2ZUV4cHJlc3Npb24oKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewotICAgICAgICBFT2JqZWN0IGN1cnJlbnQgPSBudWxsOwotCi0gICAgICAgIEVPYmplY3QgdGhpc19YVW5hcnlPcGVyYXRpb25fMCA9IG51bGw7Ci0KLSAgICAgICAgRU9iamVjdCBsdl9yaWdodE9wZXJhbmRfM18wID0gbnVsbDsKLQotCi0KLSAgICAgICAgCWVudGVyUnVsZSgpOwotCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo0MjExOjI6ICggKHRoaXNfWFVuYXJ5T3BlcmF0aW9uXzA9IHJ1bGVYVW5hcnlPcGVyYXRpb24gKCAoICggKCAoKSAoICggcnVsZU9wTXVsdGkgKSApICkgKT0+ICggKCkgKCAoIHJ1bGVPcE11bHRpICkgKSApICkgKCAobHZfcmlnaHRPcGVyYW5kXzNfMD0gcnVsZVhVbmFyeU9wZXJhdGlvbiApICkgKSogKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo0MjEyOjI6ICh0aGlzX1hVbmFyeU9wZXJhdGlvbl8wPSBydWxlWFVuYXJ5T3BlcmF0aW9uICggKCAoICggKCkgKCAoIHJ1bGVPcE11bHRpICkgKSApICk9PiAoICgpICggKCBydWxlT3BNdWx0aSApICkgKSApICggKGx2X3JpZ2h0T3BlcmFuZF8zXzA9IHJ1bGVYVW5hcnlPcGVyYXRpb24gKSApICkqICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjQyMTI6MjogKHRoaXNfWFVuYXJ5T3BlcmF0aW9uXzA9IHJ1bGVYVW5hcnlPcGVyYXRpb24gKCAoICggKCAoKSAoICggcnVsZU9wTXVsdGkgKSApICkgKT0+ICggKCkgKCAoIHJ1bGVPcE11bHRpICkgKSApICkgKCAobHZfcmlnaHRPcGVyYW5kXzNfMD0gcnVsZVhVbmFyeU9wZXJhdGlvbiApICkgKSogKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NDIxMzozOiB0aGlzX1hVbmFyeU9wZXJhdGlvbl8wPSBydWxlWFVuYXJ5T3BlcmF0aW9uICggKCAoICggKCkgKCAoIHJ1bGVPcE11bHRpICkgKSApICk9PiAoICgpICggKCBydWxlT3BNdWx0aSApICkgKSApICggKGx2X3JpZ2h0T3BlcmFuZF8zXzA9IHJ1bGVYVW5hcnlPcGVyYXRpb24gKSApICkqCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKLQotICAgICAgICAgICAgICAJCQluZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0WE11bHRpcGxpY2F0aXZlRXhwcmVzc2lvbkFjY2VzcygpLmdldFhVbmFyeU9wZXJhdGlvblBhcnNlclJ1bGVDYWxsXzAoKSk7Ci0gICAgICAgICAgICAgIAkJCi0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV184Myk7Ci0gICAgICAgICAgICB0aGlzX1hVbmFyeU9wZXJhdGlvbl8wPXJ1bGVYVW5hcnlPcGVyYXRpb24oKTsKLQotICAgICAgICAgICAgc3RhdGUuX2ZzcC0tOwotICAgICAgICAgICAgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7Ci0gICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKLQotICAgICAgICAgICAgICAJCQljdXJyZW50ID0gdGhpc19YVW5hcnlPcGVyYXRpb25fMDsKLSAgICAgICAgICAgICAgCQkJYWZ0ZXJQYXJzZXJPckVudW1SdWxlQ2FsbCgpOwotICAgICAgICAgICAgICAJCQotICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NDIyMTozOiAoICggKCAoICgpICggKCBydWxlT3BNdWx0aSApICkgKSApPT4gKCAoKSAoICggcnVsZU9wTXVsdGkgKSApICkgKSAoIChsdl9yaWdodE9wZXJhbmRfM18wPSBydWxlWFVuYXJ5T3BlcmF0aW9uICkgKSApKgotICAgICAgICAgICAgbG9vcDcxOgotICAgICAgICAgICAgZG8gewotICAgICAgICAgICAgICAgIGludCBhbHQ3MT0yOwotICAgICAgICAgICAgICAgIHN3aXRjaCAoIGlucHV0LkxBKDEpICkgewotICAgICAgICAgICAgICAgIGNhc2UgNzA6Ci0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgaW50IExBNzFfMiA9IGlucHV0LkxBKDIpOwotCi0gICAgICAgICAgICAgICAgICAgIGlmICggKHN5bnByZWQxN19JbnRlcm5hbERhdGFEU0woKSkgKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBhbHQ3MT0xOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgMTA0OgotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGludCBMQTcxXzMgPSBpbnB1dC5MQSgyKTsKLQotICAgICAgICAgICAgICAgICAgICBpZiAoIChzeW5wcmVkMTdfSW50ZXJuYWxEYXRhRFNMKCkpICkgewotICAgICAgICAgICAgICAgICAgICAgICAgYWx0NzE9MTsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlIDEwNToKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBpbnQgTEE3MV80ID0gaW5wdXQuTEEoMik7Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYgKCAoc3lucHJlZDE3X0ludGVybmFsRGF0YURTTCgpKSApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGFsdDcxPTE7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotCi0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgY2FzZSAxMDY6Ci0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgaW50IExBNzFfNSA9IGlucHV0LkxBKDIpOwotCi0gICAgICAgICAgICAgICAgICAgIGlmICggKHN5bnByZWQxN19JbnRlcm5hbERhdGFEU0woKSkgKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBhbHQ3MT0xOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgc3dpdGNoIChhbHQ3MSkgewotICAgICAgICAgICAgCWNhc2UgMSA6Ci0gICAgICAgICAgICAJICAgIC8vIEludGVybmFsRGF0YURTTC5nOjQyMjI6NDogKCAoICggKCkgKCAoIHJ1bGVPcE11bHRpICkgKSApICk9PiAoICgpICggKCBydWxlT3BNdWx0aSApICkgKSApICggKGx2X3JpZ2h0T3BlcmFuZF8zXzA9IHJ1bGVYVW5hcnlPcGVyYXRpb24gKSApCi0gICAgICAgICAgICAJICAgIHsKLSAgICAgICAgICAgIAkgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NDIyMjo0OiAoICggKCAoKSAoICggcnVsZU9wTXVsdGkgKSApICkgKT0+ICggKCkgKCAoIHJ1bGVPcE11bHRpICkgKSApICkKLSAgICAgICAgICAgIAkgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NDIyMzo1OiAoICggKCkgKCAoIHJ1bGVPcE11bHRpICkgKSApICk9PiAoICgpICggKCBydWxlT3BNdWx0aSApICkgKQotICAgICAgICAgICAgCSAgICB7Ci0gICAgICAgICAgICAJICAgIC8vIEludGVybmFsRGF0YURTTC5nOjQyMzM6NTogKCAoKSAoICggcnVsZU9wTXVsdGkgKSApICkKLSAgICAgICAgICAgIAkgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NDIzNDo2OiAoKSAoICggcnVsZU9wTXVsdGkgKSApCi0gICAgICAgICAgICAJICAgIHsKLSAgICAgICAgICAgIAkgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NDIzNDo2OiAoKQotICAgICAgICAgICAgCSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo0MjM1Ojc6IAotICAgICAgICAgICAgCSAgICB7Ci0gICAgICAgICAgICAJICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewotCi0gICAgICAgICAgICAJICAgICAgCQkJCQkJCWN1cnJlbnQgPSBmb3JjZUNyZWF0ZU1vZGVsRWxlbWVudEFuZFNldCgKLSAgICAgICAgICAgIAkgICAgICAJCQkJCQkJCWdyYW1tYXJBY2Nlc3MuZ2V0WE11bHRpcGxpY2F0aXZlRXhwcmVzc2lvbkFjY2VzcygpLmdldFhCaW5hcnlPcGVyYXRpb25MZWZ0T3BlcmFuZEFjdGlvbl8xXzBfMF8wKCksCi0gICAgICAgICAgICAJICAgICAgCQkJCQkJCQljdXJyZW50KTsKLSAgICAgICAgICAgIAkgICAgICAJCQkJCQkKLSAgICAgICAgICAgIAkgICAgfQotCi0gICAgICAgICAgICAJICAgIH0KLQotICAgICAgICAgICAgCSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo0MjQxOjY6ICggKCBydWxlT3BNdWx0aSApICkKLSAgICAgICAgICAgIAkgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NDI0Mjo3OiAoIHJ1bGVPcE11bHRpICkKLSAgICAgICAgICAgIAkgICAgewotICAgICAgICAgICAgCSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo0MjQyOjc6ICggcnVsZU9wTXVsdGkgKQotICAgICAgICAgICAgCSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo0MjQzOjg6IHJ1bGVPcE11bHRpCi0gICAgICAgICAgICAJICAgIHsKLSAgICAgICAgICAgIAkgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7Ci0KLSAgICAgICAgICAgIAkgICAgICAJCQkJCQkJCWlmIChjdXJyZW50PT1udWxsKSB7Ci0gICAgICAgICAgICAJICAgICAgCQkJCQkJCQkJY3VycmVudCA9IGNyZWF0ZU1vZGVsRWxlbWVudChncmFtbWFyQWNjZXNzLmdldFhNdWx0aXBsaWNhdGl2ZUV4cHJlc3Npb25SdWxlKCkpOwotICAgICAgICAgICAgCSAgICAgIAkJCQkJCQkJfQotICAgICAgICAgICAgCSAgICAgIAkJCQkJCQkKLSAgICAgICAgICAgIAkgICAgfQotICAgICAgICAgICAgCSAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKLQotICAgICAgICAgICAgCSAgICAgIAkJCQkJCQkJbmV3Q29tcG9zaXRlTm9kZShncmFtbWFyQWNjZXNzLmdldFhNdWx0aXBsaWNhdGl2ZUV4cHJlc3Npb25BY2Nlc3MoKS5nZXRGZWF0dXJlSnZtSWRlbnRpZmlhYmxlRWxlbWVudENyb3NzUmVmZXJlbmNlXzFfMF8wXzFfMCgpKTsKLSAgICAgICAgICAgIAkgICAgICAJCQkJCQkJCi0gICAgICAgICAgICAJICAgIH0KLSAgICAgICAgICAgIAkgICAgcHVzaEZvbGxvdyhGT0xMT1dfNjQpOwotICAgICAgICAgICAgCSAgICBydWxlT3BNdWx0aSgpOwotCi0gICAgICAgICAgICAJICAgIHN0YXRlLl9mc3AtLTsKLSAgICAgICAgICAgIAkgICAgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7Ci0gICAgICAgICAgICAJICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewotCi0gICAgICAgICAgICAJICAgICAgCQkJCQkJCQlhZnRlclBhcnNlck9yRW51bVJ1bGVDYWxsKCk7Ci0gICAgICAgICAgICAJICAgICAgCQkJCQkJCQotICAgICAgICAgICAgCSAgICB9Ci0KLSAgICAgICAgICAgIAkgICAgfQotCi0KLSAgICAgICAgICAgIAkgICAgfQotCi0KLSAgICAgICAgICAgIAkgICAgfQotCi0KLSAgICAgICAgICAgIAkgICAgfQotCi0gICAgICAgICAgICAJICAgIC8vIEludGVybmFsRGF0YURTTC5nOjQyNTk6NDogKCAobHZfcmlnaHRPcGVyYW5kXzNfMD0gcnVsZVhVbmFyeU9wZXJhdGlvbiApICkKLSAgICAgICAgICAgIAkgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NDI2MDo1OiAobHZfcmlnaHRPcGVyYW5kXzNfMD0gcnVsZVhVbmFyeU9wZXJhdGlvbiApCi0gICAgICAgICAgICAJICAgIHsKLSAgICAgICAgICAgIAkgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NDI2MDo1OiAobHZfcmlnaHRPcGVyYW5kXzNfMD0gcnVsZVhVbmFyeU9wZXJhdGlvbiApCi0gICAgICAgICAgICAJICAgIC8vIEludGVybmFsRGF0YURTTC5nOjQyNjE6NjogbHZfcmlnaHRPcGVyYW5kXzNfMD0gcnVsZVhVbmFyeU9wZXJhdGlvbgotICAgICAgICAgICAgCSAgICB7Ci0gICAgICAgICAgICAJICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewotCi0gICAgICAgICAgICAJICAgICAgCQkJCQkJbmV3Q29tcG9zaXRlTm9kZShncmFtbWFyQWNjZXNzLmdldFhNdWx0aXBsaWNhdGl2ZUV4cHJlc3Npb25BY2Nlc3MoKS5nZXRSaWdodE9wZXJhbmRYVW5hcnlPcGVyYXRpb25QYXJzZXJSdWxlQ2FsbF8xXzFfMCgpKTsKLSAgICAgICAgICAgIAkgICAgICAJCQkJCQotICAgICAgICAgICAgCSAgICB9Ci0gICAgICAgICAgICAJICAgIHB1c2hGb2xsb3coRk9MTE9XXzgzKTsKLSAgICAgICAgICAgIAkgICAgbHZfcmlnaHRPcGVyYW5kXzNfMD1ydWxlWFVuYXJ5T3BlcmF0aW9uKCk7Ci0KLSAgICAgICAgICAgIAkgICAgc3RhdGUuX2ZzcC0tOwotICAgICAgICAgICAgCSAgICBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gY3VycmVudDsKLSAgICAgICAgICAgIAkgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7Ci0KLSAgICAgICAgICAgIAkgICAgICAJCQkJCQlpZiAoY3VycmVudD09bnVsbCkgewotICAgICAgICAgICAgCSAgICAgIAkJCQkJCQljdXJyZW50ID0gY3JlYXRlTW9kZWxFbGVtZW50Rm9yUGFyZW50KGdyYW1tYXJBY2Nlc3MuZ2V0WE11bHRpcGxpY2F0aXZlRXhwcmVzc2lvblJ1bGUoKSk7Ci0gICAgICAgICAgICAJICAgICAgCQkJCQkJfQotICAgICAgICAgICAgCSAgICAgIAkJCQkJCXNldCgKLSAgICAgICAgICAgIAkgICAgICAJCQkJCQkJY3VycmVudCwKLSAgICAgICAgICAgIAkgICAgICAJCQkJCQkJInJpZ2h0T3BlcmFuZCIsCi0gICAgICAgICAgICAJICAgICAgCQkJCQkJCWx2X3JpZ2h0T3BlcmFuZF8zXzAsCi0gICAgICAgICAgICAJICAgICAgCQkJCQkJCSJvcmcuZWNsaXBzZS54dGV4dC54YmFzZS5YYmFzZS5YVW5hcnlPcGVyYXRpb24iKTsKLSAgICAgICAgICAgIAkgICAgICAJCQkJCQlhZnRlclBhcnNlck9yRW51bVJ1bGVDYWxsKCk7Ci0gICAgICAgICAgICAJICAgICAgCQkJCQkKLSAgICAgICAgICAgIAkgICAgfQotCi0gICAgICAgICAgICAJICAgIH0KLQotCi0gICAgICAgICAgICAJICAgIH0KLQotCi0gICAgICAgICAgICAJICAgIH0KLSAgICAgICAgICAgIAkgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgIAlkZWZhdWx0IDoKICAgICAgICAgICAgIAkgICAgYnJlYWsgbG9vcDcxOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0gd2hpbGUgKHRydWUpOwpAQCAtMTE4NzksMTEgKzEwODIwLDIyNjQgQEAKICAgICAgICAgfQogICAgICAgICByZXR1cm4gY3VycmVudDsKICAgICB9CisgICAgLy8gJEFOVExSIGVuZCAicnVsZVhBbmRFeHByZXNzaW9uIgorCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgImVudHJ5UnVsZU9wQW5kIgorICAgIC8vIEludGVybmFsRGF0YURTTC5nOjM5NjY6MTogZW50cnlSdWxlT3BBbmQgcmV0dXJucyBbU3RyaW5nIGN1cnJlbnQ9bnVsbF0gOiBpdl9ydWxlT3BBbmQ9IHJ1bGVPcEFuZCBFT0YgOworICAgIHB1YmxpYyBmaW5hbCBTdHJpbmcgZW50cnlSdWxlT3BBbmQoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICBTdHJpbmcgY3VycmVudCA9IG51bGw7CisKKyAgICAgICAgQW50bHJEYXRhdHlwZVJ1bGVUb2tlbiBpdl9ydWxlT3BBbmQgPSBudWxsOworCisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjM5NjY6NDU6IChpdl9ydWxlT3BBbmQ9IHJ1bGVPcEFuZCBFT0YgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6Mzk2NzoyOiBpdl9ydWxlT3BBbmQ9IHJ1bGVPcEFuZCBFT0YKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgbmV3Q29tcG9zaXRlTm9kZShncmFtbWFyQWNjZXNzLmdldE9wQW5kUnVsZSgpKTsgCisgICAgICAgICAgICB9CisgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV18xKTsKKyAgICAgICAgICAgIGl2X3J1bGVPcEFuZD1ydWxlT3BBbmQoKTsKKworICAgICAgICAgICAgc3RhdGUuX2ZzcC0tOworICAgICAgICAgICAgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7CisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIGN1cnJlbnQgPWl2X3J1bGVPcEFuZC5nZXRUZXh0KCk7IAorICAgICAgICAgICAgfQorICAgICAgICAgICAgbWF0Y2goaW5wdXQsRU9GLEZPTExPV18yKTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7CisKKyAgICAgICAgICAgIH0KKworICAgICAgICB9CisKKyAgICAgICAgICAgIGNhdGNoIChSZWNvZ25pdGlvbkV4Y2VwdGlvbiByZSkgeworICAgICAgICAgICAgICAgIHJlY292ZXIoaW5wdXQscmUpOworICAgICAgICAgICAgICAgIGFwcGVuZFNraXBwZWRUb2tlbnMoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGN1cnJlbnQ7CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgImVudHJ5UnVsZU9wQW5kIgorCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVPcEFuZCIKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzozOTczOjE6IHJ1bGVPcEFuZCByZXR1cm5zIFtBbnRsckRhdGF0eXBlUnVsZVRva2VuIGN1cnJlbnQ9bmV3IEFudGxyRGF0YXR5cGVSdWxlVG9rZW4oKV0gOiBrdz0gJyYmJyA7CisgICAgcHVibGljIGZpbmFsIEFudGxyRGF0YXR5cGVSdWxlVG9rZW4gcnVsZU9wQW5kKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgQW50bHJEYXRhdHlwZVJ1bGVUb2tlbiBjdXJyZW50ID0gbmV3IEFudGxyRGF0YXR5cGVSdWxlVG9rZW4oKTsKKworICAgICAgICBUb2tlbiBrdz1udWxsOworCisKKyAgICAgICAgCWVudGVyUnVsZSgpOworCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzozOTc5OjI6IChrdz0gJyYmJyApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzozOTgwOjI6IGt3PSAnJiYnCisgICAgICAgICAgICB7CisgICAgICAgICAgICBrdz0oVG9rZW4pbWF0Y2goaW5wdXQsOTcsRk9MTE9XXzIpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gY3VycmVudDsKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworCisgICAgICAgICAgICAgIAkJY3VycmVudC5tZXJnZShrdyk7CisgICAgICAgICAgICAgIAkJbmV3TGVhZk5vZGUoa3csIGdyYW1tYXJBY2Nlc3MuZ2V0T3BBbmRBY2Nlc3MoKS5nZXRBbXBlcnNhbmRBbXBlcnNhbmRLZXl3b3JkKCkpOworICAgICAgICAgICAgICAJCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisKKyAgICAgICAgICAgICAgCWxlYXZlUnVsZSgpOworCisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAgICAgY2F0Y2ggKFJlY29nbml0aW9uRXhjZXB0aW9uIHJlKSB7CisgICAgICAgICAgICAgICAgcmVjb3ZlcihpbnB1dCxyZSk7CisgICAgICAgICAgICAgICAgYXBwZW5kU2tpcHBlZFRva2VucygpOworICAgICAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gY3VycmVudDsKKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAicnVsZU9wQW5kIgorCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgImVudHJ5UnVsZVhFcXVhbGl0eUV4cHJlc3Npb24iCisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6Mzk4ODoxOiBlbnRyeVJ1bGVYRXF1YWxpdHlFeHByZXNzaW9uIHJldHVybnMgW0VPYmplY3QgY3VycmVudD1udWxsXSA6IGl2X3J1bGVYRXF1YWxpdHlFeHByZXNzaW9uPSBydWxlWEVxdWFsaXR5RXhwcmVzc2lvbiBFT0YgOworICAgIHB1YmxpYyBmaW5hbCBFT2JqZWN0IGVudHJ5UnVsZVhFcXVhbGl0eUV4cHJlc3Npb24oKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICBFT2JqZWN0IGN1cnJlbnQgPSBudWxsOworCisgICAgICAgIEVPYmplY3QgaXZfcnVsZVhFcXVhbGl0eUV4cHJlc3Npb24gPSBudWxsOworCisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjM5ODg6NjA6IChpdl9ydWxlWEVxdWFsaXR5RXhwcmVzc2lvbj0gcnVsZVhFcXVhbGl0eUV4cHJlc3Npb24gRU9GICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjM5ODk6MjogaXZfcnVsZVhFcXVhbGl0eUV4cHJlc3Npb249IHJ1bGVYRXF1YWxpdHlFeHByZXNzaW9uIEVPRgorICAgICAgICAgICAgeworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBuZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0WEVxdWFsaXR5RXhwcmVzc2lvblJ1bGUoKSk7IAorICAgICAgICAgICAgfQorICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMSk7CisgICAgICAgICAgICBpdl9ydWxlWEVxdWFsaXR5RXhwcmVzc2lvbj1ydWxlWEVxdWFsaXR5RXhwcmVzc2lvbigpOworCisgICAgICAgICAgICBzdGF0ZS5fZnNwLS07CisgICAgICAgICAgICBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gY3VycmVudDsKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgY3VycmVudCA9aXZfcnVsZVhFcXVhbGl0eUV4cHJlc3Npb247IAorICAgICAgICAgICAgfQorICAgICAgICAgICAgbWF0Y2goaW5wdXQsRU9GLEZPTExPV18yKTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7CisKKyAgICAgICAgICAgIH0KKworICAgICAgICB9CisKKyAgICAgICAgICAgIGNhdGNoIChSZWNvZ25pdGlvbkV4Y2VwdGlvbiByZSkgeworICAgICAgICAgICAgICAgIHJlY292ZXIoaW5wdXQscmUpOworICAgICAgICAgICAgICAgIGFwcGVuZFNraXBwZWRUb2tlbnMoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGN1cnJlbnQ7CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgImVudHJ5UnVsZVhFcXVhbGl0eUV4cHJlc3Npb24iCisKKworICAgIC8vICRBTlRMUiBzdGFydCAicnVsZVhFcXVhbGl0eUV4cHJlc3Npb24iCisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6Mzk5NToxOiBydWxlWEVxdWFsaXR5RXhwcmVzc2lvbiByZXR1cm5zIFtFT2JqZWN0IGN1cnJlbnQ9bnVsbF0gOiAodGhpc19YUmVsYXRpb25hbEV4cHJlc3Npb25fMD0gcnVsZVhSZWxhdGlvbmFsRXhwcmVzc2lvbiAoICggKCAoICgpICggKCBydWxlT3BFcXVhbGl0eSApICkgKSApPT4gKCAoKSAoICggcnVsZU9wRXF1YWxpdHkgKSApICkgKSAoIChsdl9yaWdodE9wZXJhbmRfM18wPSBydWxlWFJlbGF0aW9uYWxFeHByZXNzaW9uICkgKSApKiApIDsKKyAgICBwdWJsaWMgZmluYWwgRU9iamVjdCBydWxlWEVxdWFsaXR5RXhwcmVzc2lvbigpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIEVPYmplY3QgY3VycmVudCA9IG51bGw7CisKKyAgICAgICAgRU9iamVjdCB0aGlzX1hSZWxhdGlvbmFsRXhwcmVzc2lvbl8wID0gbnVsbDsKKworICAgICAgICBFT2JqZWN0IGx2X3JpZ2h0T3BlcmFuZF8zXzAgPSBudWxsOworCisKKworICAgICAgICAJZW50ZXJSdWxlKCk7CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjQwMDE6MjogKCAodGhpc19YUmVsYXRpb25hbEV4cHJlc3Npb25fMD0gcnVsZVhSZWxhdGlvbmFsRXhwcmVzc2lvbiAoICggKCAoICgpICggKCBydWxlT3BFcXVhbGl0eSApICkgKSApPT4gKCAoKSAoICggcnVsZU9wRXF1YWxpdHkgKSApICkgKSAoIChsdl9yaWdodE9wZXJhbmRfM18wPSBydWxlWFJlbGF0aW9uYWxFeHByZXNzaW9uICkgKSApKiApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjQwMDI6MjogKHRoaXNfWFJlbGF0aW9uYWxFeHByZXNzaW9uXzA9IHJ1bGVYUmVsYXRpb25hbEV4cHJlc3Npb24gKCAoICggKCAoKSAoICggcnVsZU9wRXF1YWxpdHkgKSApICkgKT0+ICggKCkgKCAoIHJ1bGVPcEVxdWFsaXR5ICkgKSApICkgKCAobHZfcmlnaHRPcGVyYW5kXzNfMD0gcnVsZVhSZWxhdGlvbmFsRXhwcmVzc2lvbiApICkgKSogKQorICAgICAgICAgICAgeworICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NDAwMjoyOiAodGhpc19YUmVsYXRpb25hbEV4cHJlc3Npb25fMD0gcnVsZVhSZWxhdGlvbmFsRXhwcmVzc2lvbiAoICggKCAoICgpICggKCBydWxlT3BFcXVhbGl0eSApICkgKSApPT4gKCAoKSAoICggcnVsZU9wRXF1YWxpdHkgKSApICkgKSAoIChsdl9yaWdodE9wZXJhbmRfM18wPSBydWxlWFJlbGF0aW9uYWxFeHByZXNzaW9uICkgKSApKiApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo0MDAzOjM6IHRoaXNfWFJlbGF0aW9uYWxFeHByZXNzaW9uXzA9IHJ1bGVYUmVsYXRpb25hbEV4cHJlc3Npb24gKCAoICggKCAoKSAoICggcnVsZU9wRXF1YWxpdHkgKSApICkgKT0+ICggKCkgKCAoIHJ1bGVPcEVxdWFsaXR5ICkgKSApICkgKCAobHZfcmlnaHRPcGVyYW5kXzNfMD0gcnVsZVhSZWxhdGlvbmFsRXhwcmVzc2lvbiApICkgKSoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworCisgICAgICAgICAgICAgIAkJCW5ld0NvbXBvc2l0ZU5vZGUoZ3JhbW1hckFjY2Vzcy5nZXRYRXF1YWxpdHlFeHByZXNzaW9uQWNjZXNzKCkuZ2V0WFJlbGF0aW9uYWxFeHByZXNzaW9uUGFyc2VyUnVsZUNhbGxfMCgpKTsKKyAgICAgICAgICAgICAgCQkKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzg5KTsKKyAgICAgICAgICAgIHRoaXNfWFJlbGF0aW9uYWxFeHByZXNzaW9uXzA9cnVsZVhSZWxhdGlvbmFsRXhwcmVzc2lvbigpOworCisgICAgICAgICAgICBzdGF0ZS5fZnNwLS07CisgICAgICAgICAgICBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gY3VycmVudDsKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworCisgICAgICAgICAgICAgIAkJCWN1cnJlbnQgPSB0aGlzX1hSZWxhdGlvbmFsRXhwcmVzc2lvbl8wOworICAgICAgICAgICAgICAJCQlhZnRlclBhcnNlck9yRW51bVJ1bGVDYWxsKCk7CisgICAgICAgICAgICAgIAkJCisgICAgICAgICAgICB9CisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo0MDExOjM6ICggKCAoICggKCkgKCAoIHJ1bGVPcEVxdWFsaXR5ICkgKSApICk9PiAoICgpICggKCBydWxlT3BFcXVhbGl0eSApICkgKSApICggKGx2X3JpZ2h0T3BlcmFuZF8zXzA9IHJ1bGVYUmVsYXRpb25hbEV4cHJlc3Npb24gKSApICkqCisgICAgICAgICAgICBsb29wNzI6CisgICAgICAgICAgICBkbyB7CisgICAgICAgICAgICAgICAgaW50IGFsdDcyPTI7CisgICAgICAgICAgICAgICAgc3dpdGNoICggaW5wdXQuTEEoMSkgKSB7CisgICAgICAgICAgICAgICAgY2FzZSA5ODoKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpbnQgTEE3Ml8yID0gaW5wdXQuTEEoMik7CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKCAoc3lucHJlZDEwX0ludGVybmFsRGF0YURTTCgpKSApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFsdDcyPTE7CisgICAgICAgICAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSA5OToKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpbnQgTEE3Ml8zID0gaW5wdXQuTEEoMik7CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKCAoc3lucHJlZDEwX0ludGVybmFsRGF0YURTTCgpKSApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFsdDcyPTE7CisgICAgICAgICAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSAxMDA6CisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaW50IExBNzJfNCA9IGlucHV0LkxBKDIpOworCisgICAgICAgICAgICAgICAgICAgIGlmICggKHN5bnByZWQxMF9JbnRlcm5hbERhdGFEU0woKSkgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBhbHQ3Mj0xOworICAgICAgICAgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgMTAxOgorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGludCBMQTcyXzUgPSBpbnB1dC5MQSgyKTsKKworICAgICAgICAgICAgICAgICAgICBpZiAoIChzeW5wcmVkMTBfSW50ZXJuYWxEYXRhRFNMKCkpICkgeworICAgICAgICAgICAgICAgICAgICAgICAgYWx0NzI9MTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHN3aXRjaCAoYWx0NzIpIHsKKyAgICAgICAgICAgIAljYXNlIDEgOgorICAgICAgICAgICAgCSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo0MDEyOjQ6ICggKCAoICgpICggKCBydWxlT3BFcXVhbGl0eSApICkgKSApPT4gKCAoKSAoICggcnVsZU9wRXF1YWxpdHkgKSApICkgKSAoIChsdl9yaWdodE9wZXJhbmRfM18wPSBydWxlWFJlbGF0aW9uYWxFeHByZXNzaW9uICkgKQorICAgICAgICAgICAgCSAgICB7CisgICAgICAgICAgICAJICAgIC8vIEludGVybmFsRGF0YURTTC5nOjQwMTI6NDogKCAoICggKCkgKCAoIHJ1bGVPcEVxdWFsaXR5ICkgKSApICk9PiAoICgpICggKCBydWxlT3BFcXVhbGl0eSApICkgKSApCisgICAgICAgICAgICAJICAgIC8vIEludGVybmFsRGF0YURTTC5nOjQwMTM6NTogKCAoICgpICggKCBydWxlT3BFcXVhbGl0eSApICkgKSApPT4gKCAoKSAoICggcnVsZU9wRXF1YWxpdHkgKSApICkKKyAgICAgICAgICAgIAkgICAgeworICAgICAgICAgICAgCSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo0MDIzOjU6ICggKCkgKCAoIHJ1bGVPcEVxdWFsaXR5ICkgKSApCisgICAgICAgICAgICAJICAgIC8vIEludGVybmFsRGF0YURTTC5nOjQwMjQ6NjogKCkgKCAoIHJ1bGVPcEVxdWFsaXR5ICkgKQorICAgICAgICAgICAgCSAgICB7CisgICAgICAgICAgICAJICAgIC8vIEludGVybmFsRGF0YURTTC5nOjQwMjQ6NjogKCkKKyAgICAgICAgICAgIAkgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NDAyNTo3OiAKKyAgICAgICAgICAgIAkgICAgeworICAgICAgICAgICAgCSAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKworICAgICAgICAgICAgCSAgICAgIAkJCQkJCQljdXJyZW50ID0gZm9yY2VDcmVhdGVNb2RlbEVsZW1lbnRBbmRTZXQoCisgICAgICAgICAgICAJICAgICAgCQkJCQkJCQlncmFtbWFyQWNjZXNzLmdldFhFcXVhbGl0eUV4cHJlc3Npb25BY2Nlc3MoKS5nZXRYQmluYXJ5T3BlcmF0aW9uTGVmdE9wZXJhbmRBY3Rpb25fMV8wXzBfMCgpLAorICAgICAgICAgICAgCSAgICAgIAkJCQkJCQkJY3VycmVudCk7CisgICAgICAgICAgICAJICAgICAgCQkJCQkJCisgICAgICAgICAgICAJICAgIH0KKworICAgICAgICAgICAgCSAgICB9CisKKyAgICAgICAgICAgIAkgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NDAzMTo2OiAoICggcnVsZU9wRXF1YWxpdHkgKSApCisgICAgICAgICAgICAJICAgIC8vIEludGVybmFsRGF0YURTTC5nOjQwMzI6NzogKCBydWxlT3BFcXVhbGl0eSApCisgICAgICAgICAgICAJICAgIHsKKyAgICAgICAgICAgIAkgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NDAzMjo3OiAoIHJ1bGVPcEVxdWFsaXR5ICkKKyAgICAgICAgICAgIAkgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NDAzMzo4OiBydWxlT3BFcXVhbGl0eQorICAgICAgICAgICAgCSAgICB7CisgICAgICAgICAgICAJICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworCisgICAgICAgICAgICAJICAgICAgCQkJCQkJCQlpZiAoY3VycmVudD09bnVsbCkgeworICAgICAgICAgICAgCSAgICAgIAkJCQkJCQkJCWN1cnJlbnQgPSBjcmVhdGVNb2RlbEVsZW1lbnQoZ3JhbW1hckFjY2Vzcy5nZXRYRXF1YWxpdHlFeHByZXNzaW9uUnVsZSgpKTsKKyAgICAgICAgICAgIAkgICAgICAJCQkJCQkJCX0KKyAgICAgICAgICAgIAkgICAgICAJCQkJCQkJCisgICAgICAgICAgICAJICAgIH0KKyAgICAgICAgICAgIAkgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisKKyAgICAgICAgICAgIAkgICAgICAJCQkJCQkJCW5ld0NvbXBvc2l0ZU5vZGUoZ3JhbW1hckFjY2Vzcy5nZXRYRXF1YWxpdHlFeHByZXNzaW9uQWNjZXNzKCkuZ2V0RmVhdHVyZUp2bUlkZW50aWZpYWJsZUVsZW1lbnRDcm9zc1JlZmVyZW5jZV8xXzBfMF8xXzAoKSk7CisgICAgICAgICAgICAJICAgICAgCQkJCQkJCQorICAgICAgICAgICAgCSAgICB9CisgICAgICAgICAgICAJICAgIHB1c2hGb2xsb3coRk9MTE9XXzc4KTsKKyAgICAgICAgICAgIAkgICAgcnVsZU9wRXF1YWxpdHkoKTsKKworICAgICAgICAgICAgCSAgICBzdGF0ZS5fZnNwLS07CisgICAgICAgICAgICAJICAgIGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OworICAgICAgICAgICAgCSAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKworICAgICAgICAgICAgCSAgICAgIAkJCQkJCQkJYWZ0ZXJQYXJzZXJPckVudW1SdWxlQ2FsbCgpOworICAgICAgICAgICAgCSAgICAgIAkJCQkJCQkKKyAgICAgICAgICAgIAkgICAgfQorCisgICAgICAgICAgICAJICAgIH0KKworCisgICAgICAgICAgICAJICAgIH0KKworCisgICAgICAgICAgICAJICAgIH0KKworCisgICAgICAgICAgICAJICAgIH0KKworICAgICAgICAgICAgCSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo0MDQ5OjQ6ICggKGx2X3JpZ2h0T3BlcmFuZF8zXzA9IHJ1bGVYUmVsYXRpb25hbEV4cHJlc3Npb24gKSApCisgICAgICAgICAgICAJICAgIC8vIEludGVybmFsRGF0YURTTC5nOjQwNTA6NTogKGx2X3JpZ2h0T3BlcmFuZF8zXzA9IHJ1bGVYUmVsYXRpb25hbEV4cHJlc3Npb24gKQorICAgICAgICAgICAgCSAgICB7CisgICAgICAgICAgICAJICAgIC8vIEludGVybmFsRGF0YURTTC5nOjQwNTA6NTogKGx2X3JpZ2h0T3BlcmFuZF8zXzA9IHJ1bGVYUmVsYXRpb25hbEV4cHJlc3Npb24gKQorICAgICAgICAgICAgCSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo0MDUxOjY6IGx2X3JpZ2h0T3BlcmFuZF8zXzA9IHJ1bGVYUmVsYXRpb25hbEV4cHJlc3Npb24KKyAgICAgICAgICAgIAkgICAgeworICAgICAgICAgICAgCSAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKworICAgICAgICAgICAgCSAgICAgIAkJCQkJCW5ld0NvbXBvc2l0ZU5vZGUoZ3JhbW1hckFjY2Vzcy5nZXRYRXF1YWxpdHlFeHByZXNzaW9uQWNjZXNzKCkuZ2V0UmlnaHRPcGVyYW5kWFJlbGF0aW9uYWxFeHByZXNzaW9uUGFyc2VyUnVsZUNhbGxfMV8xXzAoKSk7CisgICAgICAgICAgICAJICAgICAgCQkJCQkKKyAgICAgICAgICAgIAkgICAgfQorICAgICAgICAgICAgCSAgICBwdXNoRm9sbG93KEZPTExPV184OSk7CisgICAgICAgICAgICAJICAgIGx2X3JpZ2h0T3BlcmFuZF8zXzA9cnVsZVhSZWxhdGlvbmFsRXhwcmVzc2lvbigpOworCisgICAgICAgICAgICAJICAgIHN0YXRlLl9mc3AtLTsKKyAgICAgICAgICAgIAkgICAgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7CisgICAgICAgICAgICAJICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworCisgICAgICAgICAgICAJICAgICAgCQkJCQkJaWYgKGN1cnJlbnQ9PW51bGwpIHsKKyAgICAgICAgICAgIAkgICAgICAJCQkJCQkJY3VycmVudCA9IGNyZWF0ZU1vZGVsRWxlbWVudEZvclBhcmVudChncmFtbWFyQWNjZXNzLmdldFhFcXVhbGl0eUV4cHJlc3Npb25SdWxlKCkpOworICAgICAgICAgICAgCSAgICAgIAkJCQkJCX0KKyAgICAgICAgICAgIAkgICAgICAJCQkJCQlzZXQoCisgICAgICAgICAgICAJICAgICAgCQkJCQkJCWN1cnJlbnQsCisgICAgICAgICAgICAJICAgICAgCQkJCQkJCSJyaWdodE9wZXJhbmQiLAorICAgICAgICAgICAgCSAgICAgIAkJCQkJCQlsdl9yaWdodE9wZXJhbmRfM18wLAorICAgICAgICAgICAgCSAgICAgIAkJCQkJCQkib3JnLmVjbGlwc2UueHRleHQueGJhc2UuWGJhc2UuWFJlbGF0aW9uYWxFeHByZXNzaW9uIik7CisgICAgICAgICAgICAJICAgICAgCQkJCQkJYWZ0ZXJQYXJzZXJPckVudW1SdWxlQ2FsbCgpOworICAgICAgICAgICAgCSAgICAgIAkJCQkJCisgICAgICAgICAgICAJICAgIH0KKworICAgICAgICAgICAgCSAgICB9CisKKworICAgICAgICAgICAgCSAgICB9CisKKworICAgICAgICAgICAgCSAgICB9CisgICAgICAgICAgICAJICAgIGJyZWFrOworCisgICAgICAgICAgICAJZGVmYXVsdCA6CisgICAgICAgICAgICAJICAgIGJyZWFrIGxvb3A3MjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IHdoaWxlICh0cnVlKTsKKworCisgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKworICAgICAgICAgICAgICAJbGVhdmVSdWxlKCk7CisKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgICAgICBjYXRjaCAoUmVjb2duaXRpb25FeGNlcHRpb24gcmUpIHsKKyAgICAgICAgICAgICAgICByZWNvdmVyKGlucHV0LHJlKTsKKyAgICAgICAgICAgICAgICBhcHBlbmRTa2lwcGVkVG9rZW5zKCk7CisgICAgICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgICAgIHJldHVybiBjdXJyZW50OworICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJydWxlWEVxdWFsaXR5RXhwcmVzc2lvbiIKKworCisgICAgLy8gJEFOVExSIHN0YXJ0ICJlbnRyeVJ1bGVPcEVxdWFsaXR5IgorICAgIC8vIEludGVybmFsRGF0YURTTC5nOjQwNzM6MTogZW50cnlSdWxlT3BFcXVhbGl0eSByZXR1cm5zIFtTdHJpbmcgY3VycmVudD1udWxsXSA6IGl2X3J1bGVPcEVxdWFsaXR5PSBydWxlT3BFcXVhbGl0eSBFT0YgOworICAgIHB1YmxpYyBmaW5hbCBTdHJpbmcgZW50cnlSdWxlT3BFcXVhbGl0eSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIFN0cmluZyBjdXJyZW50ID0gbnVsbDsKKworICAgICAgICBBbnRsckRhdGF0eXBlUnVsZVRva2VuIGl2X3J1bGVPcEVxdWFsaXR5ID0gbnVsbDsKKworCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo0MDczOjUwOiAoaXZfcnVsZU9wRXF1YWxpdHk9IHJ1bGVPcEVxdWFsaXR5IEVPRiApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo0MDc0OjI6IGl2X3J1bGVPcEVxdWFsaXR5PSBydWxlT3BFcXVhbGl0eSBFT0YKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgbmV3Q29tcG9zaXRlTm9kZShncmFtbWFyQWNjZXNzLmdldE9wRXF1YWxpdHlSdWxlKCkpOyAKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzEpOworICAgICAgICAgICAgaXZfcnVsZU9wRXF1YWxpdHk9cnVsZU9wRXF1YWxpdHkoKTsKKworICAgICAgICAgICAgc3RhdGUuX2ZzcC0tOworICAgICAgICAgICAgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7CisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIGN1cnJlbnQgPWl2X3J1bGVPcEVxdWFsaXR5LmdldFRleHQoKTsgCisgICAgICAgICAgICB9CisgICAgICAgICAgICBtYXRjaChpbnB1dCxFT0YsRk9MTE9XXzIpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gY3VycmVudDsKKworICAgICAgICAgICAgfQorCisgICAgICAgIH0KKworICAgICAgICAgICAgY2F0Y2ggKFJlY29nbml0aW9uRXhjZXB0aW9uIHJlKSB7CisgICAgICAgICAgICAgICAgcmVjb3ZlcihpbnB1dCxyZSk7CisgICAgICAgICAgICAgICAgYXBwZW5kU2tpcHBlZFRva2VucygpOworICAgICAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gY3VycmVudDsKKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAiZW50cnlSdWxlT3BFcXVhbGl0eSIKKworCisgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlT3BFcXVhbGl0eSIKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo0MDgwOjE6IHJ1bGVPcEVxdWFsaXR5IHJldHVybnMgW0FudGxyRGF0YXR5cGVSdWxlVG9rZW4gY3VycmVudD1uZXcgQW50bHJEYXRhdHlwZVJ1bGVUb2tlbigpXSA6IChrdz0gJz09JyB8IGt3PSAnIT0nIHwga3c9ICc9PT0nIHwga3c9ICchPT0nICkgOworICAgIHB1YmxpYyBmaW5hbCBBbnRsckRhdGF0eXBlUnVsZVRva2VuIHJ1bGVPcEVxdWFsaXR5KCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgQW50bHJEYXRhdHlwZVJ1bGVUb2tlbiBjdXJyZW50ID0gbmV3IEFudGxyRGF0YXR5cGVSdWxlVG9rZW4oKTsKKworICAgICAgICBUb2tlbiBrdz1udWxsOworCisKKyAgICAgICAgCWVudGVyUnVsZSgpOworCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo0MDg2OjI6ICggKGt3PSAnPT0nIHwga3c9ICchPScgfCBrdz0gJz09PScgfCBrdz0gJyE9PScgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo0MDg3OjI6IChrdz0gJz09JyB8IGt3PSAnIT0nIHwga3c9ICc9PT0nIHwga3c9ICchPT0nICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjQwODc6MjogKGt3PSAnPT0nIHwga3c9ICchPScgfCBrdz0gJz09PScgfCBrdz0gJyE9PScgKQorICAgICAgICAgICAgaW50IGFsdDczPTQ7CisgICAgICAgICAgICBzd2l0Y2ggKCBpbnB1dC5MQSgxKSApIHsKKyAgICAgICAgICAgIGNhc2UgOTg6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGFsdDczPTE7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSA5OToKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYWx0NzM9MjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDEwMDoKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYWx0NzM9MzsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDEwMToKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYWx0NzM9NDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIGlmIChzdGF0ZS5iYWNrdHJhY2tpbmc+MCkge3N0YXRlLmZhaWxlZD10cnVlOyByZXR1cm4gY3VycmVudDt9CisgICAgICAgICAgICAgICAgTm9WaWFibGVBbHRFeGNlcHRpb24gbnZhZSA9CisgICAgICAgICAgICAgICAgICAgIG5ldyBOb1ZpYWJsZUFsdEV4Y2VwdGlvbigiIiwgNzMsIDAsIGlucHV0KTsKKworICAgICAgICAgICAgICAgIHRocm93IG52YWU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN3aXRjaCAoYWx0NzMpIHsKKyAgICAgICAgICAgICAgICBjYXNlIDEgOgorICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo0MDg4OjM6IGt3PSAnPT0nCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAga3c9KFRva2VuKW1hdGNoKGlucHV0LDk4LEZPTExPV18yKTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7CisgICAgICAgICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworCisgICAgICAgICAgICAgICAgICAgICAgCQkJY3VycmVudC5tZXJnZShrdyk7CisgICAgICAgICAgICAgICAgICAgICAgCQkJbmV3TGVhZk5vZGUoa3csIGdyYW1tYXJBY2Nlc3MuZ2V0T3BFcXVhbGl0eUFjY2VzcygpLmdldEVxdWFsc1NpZ25FcXVhbHNTaWduS2V5d29yZF8wKCkpOworICAgICAgICAgICAgICAgICAgICAgIAkJCisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgMiA6CisgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjQwOTQ6Mzoga3c9ICchPScKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBrdz0oVG9rZW4pbWF0Y2goaW5wdXQsOTksRk9MTE9XXzIpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gY3VycmVudDsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisKKyAgICAgICAgICAgICAgICAgICAgICAJCQljdXJyZW50Lm1lcmdlKGt3KTsKKyAgICAgICAgICAgICAgICAgICAgICAJCQluZXdMZWFmTm9kZShrdywgZ3JhbW1hckFjY2Vzcy5nZXRPcEVxdWFsaXR5QWNjZXNzKCkuZ2V0RXhjbGFtYXRpb25NYXJrRXF1YWxzU2lnbktleXdvcmRfMSgpKTsKKyAgICAgICAgICAgICAgICAgICAgICAJCQorICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIDMgOgorICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo0MTAwOjM6IGt3PSAnPT09JworICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGt3PShUb2tlbiltYXRjaChpbnB1dCwxMDAsRk9MTE9XXzIpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gY3VycmVudDsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisKKyAgICAgICAgICAgICAgICAgICAgICAJCQljdXJyZW50Lm1lcmdlKGt3KTsKKyAgICAgICAgICAgICAgICAgICAgICAJCQluZXdMZWFmTm9kZShrdywgZ3JhbW1hckFjY2Vzcy5nZXRPcEVxdWFsaXR5QWNjZXNzKCkuZ2V0RXF1YWxzU2lnbkVxdWFsc1NpZ25FcXVhbHNTaWduS2V5d29yZF8yKCkpOworICAgICAgICAgICAgICAgICAgICAgIAkJCisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgNCA6CisgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjQxMDY6Mzoga3c9ICchPT0nCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAga3c9KFRva2VuKW1hdGNoKGlucHV0LDEwMSxGT0xMT1dfMik7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OworICAgICAgICAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKworICAgICAgICAgICAgICAgICAgICAgIAkJCWN1cnJlbnQubWVyZ2Uoa3cpOworICAgICAgICAgICAgICAgICAgICAgIAkJCW5ld0xlYWZOb2RlKGt3LCBncmFtbWFyQWNjZXNzLmdldE9wRXF1YWxpdHlBY2Nlc3MoKS5nZXRFeGNsYW1hdGlvbk1hcmtFcXVhbHNTaWduRXF1YWxzU2lnbktleXdvcmRfMygpKTsKKyAgICAgICAgICAgICAgICAgICAgICAJCQorICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisKKyAgICAgICAgICAgICAgCWxlYXZlUnVsZSgpOworCisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAgICAgY2F0Y2ggKFJlY29nbml0aW9uRXhjZXB0aW9uIHJlKSB7CisgICAgICAgICAgICAgICAgcmVjb3ZlcihpbnB1dCxyZSk7CisgICAgICAgICAgICAgICAgYXBwZW5kU2tpcHBlZFRva2VucygpOworICAgICAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gY3VycmVudDsKKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAicnVsZU9wRXF1YWxpdHkiCisKKworICAgIC8vICRBTlRMUiBzdGFydCAiZW50cnlSdWxlWFJlbGF0aW9uYWxFeHByZXNzaW9uIgorICAgIC8vIEludGVybmFsRGF0YURTTC5nOjQxMTU6MTogZW50cnlSdWxlWFJlbGF0aW9uYWxFeHByZXNzaW9uIHJldHVybnMgW0VPYmplY3QgY3VycmVudD1udWxsXSA6IGl2X3J1bGVYUmVsYXRpb25hbEV4cHJlc3Npb249IHJ1bGVYUmVsYXRpb25hbEV4cHJlc3Npb24gRU9GIDsKKyAgICBwdWJsaWMgZmluYWwgRU9iamVjdCBlbnRyeVJ1bGVYUmVsYXRpb25hbEV4cHJlc3Npb24oKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICBFT2JqZWN0IGN1cnJlbnQgPSBudWxsOworCisgICAgICAgIEVPYmplY3QgaXZfcnVsZVhSZWxhdGlvbmFsRXhwcmVzc2lvbiA9IG51bGw7CisKKworICAgICAgICB0cnkgeworICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NDExNTo2MjogKGl2X3J1bGVYUmVsYXRpb25hbEV4cHJlc3Npb249IHJ1bGVYUmVsYXRpb25hbEV4cHJlc3Npb24gRU9GICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjQxMTY6MjogaXZfcnVsZVhSZWxhdGlvbmFsRXhwcmVzc2lvbj0gcnVsZVhSZWxhdGlvbmFsRXhwcmVzc2lvbiBFT0YKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgbmV3Q29tcG9zaXRlTm9kZShncmFtbWFyQWNjZXNzLmdldFhSZWxhdGlvbmFsRXhwcmVzc2lvblJ1bGUoKSk7IAorICAgICAgICAgICAgfQorICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMSk7CisgICAgICAgICAgICBpdl9ydWxlWFJlbGF0aW9uYWxFeHByZXNzaW9uPXJ1bGVYUmVsYXRpb25hbEV4cHJlc3Npb24oKTsKKworICAgICAgICAgICAgc3RhdGUuX2ZzcC0tOworICAgICAgICAgICAgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7CisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIGN1cnJlbnQgPWl2X3J1bGVYUmVsYXRpb25hbEV4cHJlc3Npb247IAorICAgICAgICAgICAgfQorICAgICAgICAgICAgbWF0Y2goaW5wdXQsRU9GLEZPTExPV18yKTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7CisKKyAgICAgICAgICAgIH0KKworICAgICAgICB9CisKKyAgICAgICAgICAgIGNhdGNoIChSZWNvZ25pdGlvbkV4Y2VwdGlvbiByZSkgeworICAgICAgICAgICAgICAgIHJlY292ZXIoaW5wdXQscmUpOworICAgICAgICAgICAgICAgIGFwcGVuZFNraXBwZWRUb2tlbnMoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGN1cnJlbnQ7CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgImVudHJ5UnVsZVhSZWxhdGlvbmFsRXhwcmVzc2lvbiIKKworCisgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlWFJlbGF0aW9uYWxFeHByZXNzaW9uIgorICAgIC8vIEludGVybmFsRGF0YURTTC5nOjQxMjI6MTogcnVsZVhSZWxhdGlvbmFsRXhwcmVzc2lvbiByZXR1cm5zIFtFT2JqZWN0IGN1cnJlbnQ9bnVsbF0gOiAodGhpc19YT3RoZXJPcGVyYXRvckV4cHJlc3Npb25fMD0gcnVsZVhPdGhlck9wZXJhdG9yRXhwcmVzc2lvbiAoICggKCAoICggKCkgJ2luc3RhbmNlb2YnICkgKT0+ICggKCkgb3RoZXJsdl8yPSAnaW5zdGFuY2VvZicgKSApICggKGx2X3R5cGVfM18wPSBydWxlSnZtVHlwZVJlZmVyZW5jZSApICkgKSB8ICggKCAoICggKCkgKCAoIHJ1bGVPcENvbXBhcmUgKSApICkgKT0+ICggKCkgKCAoIHJ1bGVPcENvbXBhcmUgKSApICkgKSAoIChsdl9yaWdodE9wZXJhbmRfNl8wPSBydWxlWE90aGVyT3BlcmF0b3JFeHByZXNzaW9uICkgKSApICkqICkgOworICAgIHB1YmxpYyBmaW5hbCBFT2JqZWN0IHJ1bGVYUmVsYXRpb25hbEV4cHJlc3Npb24oKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICBFT2JqZWN0IGN1cnJlbnQgPSBudWxsOworCisgICAgICAgIFRva2VuIG90aGVybHZfMj1udWxsOworICAgICAgICBFT2JqZWN0IHRoaXNfWE90aGVyT3BlcmF0b3JFeHByZXNzaW9uXzAgPSBudWxsOworCisgICAgICAgIEVPYmplY3QgbHZfdHlwZV8zXzAgPSBudWxsOworCisgICAgICAgIEVPYmplY3QgbHZfcmlnaHRPcGVyYW5kXzZfMCA9IG51bGw7CisKKworCisgICAgICAgIAllbnRlclJ1bGUoKTsKKworICAgICAgICB0cnkgeworICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NDEyODoyOiAoICh0aGlzX1hPdGhlck9wZXJhdG9yRXhwcmVzc2lvbl8wPSBydWxlWE90aGVyT3BlcmF0b3JFeHByZXNzaW9uICggKCAoICggKCAoKSAnaW5zdGFuY2VvZicgKSApPT4gKCAoKSBvdGhlcmx2XzI9ICdpbnN0YW5jZW9mJyApICkgKCAobHZfdHlwZV8zXzA9IHJ1bGVKdm1UeXBlUmVmZXJlbmNlICkgKSApIHwgKCAoICggKCAoKSAoICggcnVsZU9wQ29tcGFyZSApICkgKSApPT4gKCAoKSAoICggcnVsZU9wQ29tcGFyZSApICkgKSApICggKGx2X3JpZ2h0T3BlcmFuZF82XzA9IHJ1bGVYT3RoZXJPcGVyYXRvckV4cHJlc3Npb24gKSApICkgKSogKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo0MTI5OjI6ICh0aGlzX1hPdGhlck9wZXJhdG9yRXhwcmVzc2lvbl8wPSBydWxlWE90aGVyT3BlcmF0b3JFeHByZXNzaW9uICggKCAoICggKCAoKSAnaW5zdGFuY2VvZicgKSApPT4gKCAoKSBvdGhlcmx2XzI9ICdpbnN0YW5jZW9mJyApICkgKCAobHZfdHlwZV8zXzA9IHJ1bGVKdm1UeXBlUmVmZXJlbmNlICkgKSApIHwgKCAoICggKCAoKSAoICggcnVsZU9wQ29tcGFyZSApICkgKSApPT4gKCAoKSAoICggcnVsZU9wQ29tcGFyZSApICkgKSApICggKGx2X3JpZ2h0T3BlcmFuZF82XzA9IHJ1bGVYT3RoZXJPcGVyYXRvckV4cHJlc3Npb24gKSApICkgKSogKQorICAgICAgICAgICAgeworICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NDEyOToyOiAodGhpc19YT3RoZXJPcGVyYXRvckV4cHJlc3Npb25fMD0gcnVsZVhPdGhlck9wZXJhdG9yRXhwcmVzc2lvbiAoICggKCAoICggKCkgJ2luc3RhbmNlb2YnICkgKT0+ICggKCkgb3RoZXJsdl8yPSAnaW5zdGFuY2VvZicgKSApICggKGx2X3R5cGVfM18wPSBydWxlSnZtVHlwZVJlZmVyZW5jZSApICkgKSB8ICggKCAoICggKCkgKCAoIHJ1bGVPcENvbXBhcmUgKSApICkgKT0+ICggKCkgKCAoIHJ1bGVPcENvbXBhcmUgKSApICkgKSAoIChsdl9yaWdodE9wZXJhbmRfNl8wPSBydWxlWE90aGVyT3BlcmF0b3JFeHByZXNzaW9uICkgKSApICkqICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjQxMzA6MzogdGhpc19YT3RoZXJPcGVyYXRvckV4cHJlc3Npb25fMD0gcnVsZVhPdGhlck9wZXJhdG9yRXhwcmVzc2lvbiAoICggKCAoICggKCkgJ2luc3RhbmNlb2YnICkgKT0+ICggKCkgb3RoZXJsdl8yPSAnaW5zdGFuY2VvZicgKSApICggKGx2X3R5cGVfM18wPSBydWxlSnZtVHlwZVJlZmVyZW5jZSApICkgKSB8ICggKCAoICggKCkgKCAoIHJ1bGVPcENvbXBhcmUgKSApICkgKT0+ICggKCkgKCAoIHJ1bGVPcENvbXBhcmUgKSApICkgKSAoIChsdl9yaWdodE9wZXJhbmRfNl8wPSBydWxlWE90aGVyT3BlcmF0b3JFeHByZXNzaW9uICkgKSApICkqCisgICAgICAgICAgICB7CisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKworICAgICAgICAgICAgICAJCQluZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0WFJlbGF0aW9uYWxFeHByZXNzaW9uQWNjZXNzKCkuZ2V0WE90aGVyT3BlcmF0b3JFeHByZXNzaW9uUGFyc2VyUnVsZUNhbGxfMCgpKTsKKyAgICAgICAgICAgICAgCQkKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzkwKTsKKyAgICAgICAgICAgIHRoaXNfWE90aGVyT3BlcmF0b3JFeHByZXNzaW9uXzA9cnVsZVhPdGhlck9wZXJhdG9yRXhwcmVzc2lvbigpOworCisgICAgICAgICAgICBzdGF0ZS5fZnNwLS07CisgICAgICAgICAgICBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gY3VycmVudDsKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworCisgICAgICAgICAgICAgIAkJCWN1cnJlbnQgPSB0aGlzX1hPdGhlck9wZXJhdG9yRXhwcmVzc2lvbl8wOworICAgICAgICAgICAgICAJCQlhZnRlclBhcnNlck9yRW51bVJ1bGVDYWxsKCk7CisgICAgICAgICAgICAgIAkJCisgICAgICAgICAgICB9CisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo0MTM4OjM6ICggKCAoICggKCAoKSAnaW5zdGFuY2VvZicgKSApPT4gKCAoKSBvdGhlcmx2XzI9ICdpbnN0YW5jZW9mJyApICkgKCAobHZfdHlwZV8zXzA9IHJ1bGVKdm1UeXBlUmVmZXJlbmNlICkgKSApIHwgKCAoICggKCAoKSAoICggcnVsZU9wQ29tcGFyZSApICkgKSApPT4gKCAoKSAoICggcnVsZU9wQ29tcGFyZSApICkgKSApICggKGx2X3JpZ2h0T3BlcmFuZF82XzA9IHJ1bGVYT3RoZXJPcGVyYXRvckV4cHJlc3Npb24gKSApICkgKSoKKyAgICAgICAgICAgIGxvb3A3NDoKKyAgICAgICAgICAgIGRvIHsKKyAgICAgICAgICAgICAgICBpbnQgYWx0NzQ9MzsKKyAgICAgICAgICAgICAgICBzd2l0Y2ggKCBpbnB1dC5MQSgxKSApIHsKKyAgICAgICAgICAgICAgICBjYXNlIDkzOgorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGludCBMQTc0XzIgPSBpbnB1dC5MQSgyKTsKKworICAgICAgICAgICAgICAgICAgICBpZiAoIChzeW5wcmVkMTJfSW50ZXJuYWxEYXRhRFNMKCkpICkgeworICAgICAgICAgICAgICAgICAgICAgICAgYWx0NzQ9MjsKKyAgICAgICAgICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIDk0OgorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGludCBMQTc0XzMgPSBpbnB1dC5MQSgyKTsKKworICAgICAgICAgICAgICAgICAgICBpZiAoIChzeW5wcmVkMTJfSW50ZXJuYWxEYXRhRFNMKCkpICkgeworICAgICAgICAgICAgICAgICAgICAgICAgYWx0NzQ9MjsKKyAgICAgICAgICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIDEwMjoKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpbnQgTEE3NF80ID0gaW5wdXQuTEEoMik7CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKCAoc3lucHJlZDExX0ludGVybmFsRGF0YURTTCgpKSApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFsdDc0PTE7CisgICAgICAgICAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSA5NToKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpbnQgTEE3NF81ID0gaW5wdXQuTEEoMik7CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKCAoc3lucHJlZDEyX0ludGVybmFsRGF0YURTTCgpKSApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFsdDc0PTI7CisgICAgICAgICAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBzd2l0Y2ggKGFsdDc0KSB7CisgICAgICAgICAgICAJY2FzZSAxIDoKKyAgICAgICAgICAgIAkgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NDEzOTo0OiAoICggKCAoICgpICdpbnN0YW5jZW9mJyApICk9PiAoICgpIG90aGVybHZfMj0gJ2luc3RhbmNlb2YnICkgKSAoIChsdl90eXBlXzNfMD0gcnVsZUp2bVR5cGVSZWZlcmVuY2UgKSApICkKKyAgICAgICAgICAgIAkgICAgeworICAgICAgICAgICAgCSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo0MTM5OjQ6ICggKCAoICggKCkgJ2luc3RhbmNlb2YnICkgKT0+ICggKCkgb3RoZXJsdl8yPSAnaW5zdGFuY2VvZicgKSApICggKGx2X3R5cGVfM18wPSBydWxlSnZtVHlwZVJlZmVyZW5jZSApICkgKQorICAgICAgICAgICAgCSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo0MTQwOjU6ICggKCAoICgpICdpbnN0YW5jZW9mJyApICk9PiAoICgpIG90aGVybHZfMj0gJ2luc3RhbmNlb2YnICkgKSAoIChsdl90eXBlXzNfMD0gcnVsZUp2bVR5cGVSZWZlcmVuY2UgKSApCisgICAgICAgICAgICAJICAgIHsKKyAgICAgICAgICAgIAkgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NDE0MDo1OiAoICggKCAoKSAnaW5zdGFuY2VvZicgKSApPT4gKCAoKSBvdGhlcmx2XzI9ICdpbnN0YW5jZW9mJyApICkKKyAgICAgICAgICAgIAkgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NDE0MTo2OiAoICggKCkgJ2luc3RhbmNlb2YnICkgKT0+ICggKCkgb3RoZXJsdl8yPSAnaW5zdGFuY2VvZicgKQorICAgICAgICAgICAgCSAgICB7CisgICAgICAgICAgICAJICAgIC8vIEludGVybmFsRGF0YURTTC5nOjQxNDc6NjogKCAoKSBvdGhlcmx2XzI9ICdpbnN0YW5jZW9mJyApCisgICAgICAgICAgICAJICAgIC8vIEludGVybmFsRGF0YURTTC5nOjQxNDg6NzogKCkgb3RoZXJsdl8yPSAnaW5zdGFuY2VvZicKKyAgICAgICAgICAgIAkgICAgeworICAgICAgICAgICAgCSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo0MTQ4Ojc6ICgpCisgICAgICAgICAgICAJICAgIC8vIEludGVybmFsRGF0YURTTC5nOjQxNDk6ODogCisgICAgICAgICAgICAJICAgIHsKKyAgICAgICAgICAgIAkgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisKKyAgICAgICAgICAgIAkgICAgICAJCQkJCQkJCWN1cnJlbnQgPSBmb3JjZUNyZWF0ZU1vZGVsRWxlbWVudEFuZFNldCgKKyAgICAgICAgICAgIAkgICAgICAJCQkJCQkJCQlncmFtbWFyQWNjZXNzLmdldFhSZWxhdGlvbmFsRXhwcmVzc2lvbkFjY2VzcygpLmdldFhJbnN0YW5jZU9mRXhwcmVzc2lvbkV4cHJlc3Npb25BY3Rpb25fMV8wXzBfMF8wKCksCisgICAgICAgICAgICAJICAgICAgCQkJCQkJCQkJY3VycmVudCk7CisgICAgICAgICAgICAJICAgICAgCQkJCQkJCQorICAgICAgICAgICAgCSAgICB9CisKKyAgICAgICAgICAgIAkgICAgfQorCisgICAgICAgICAgICAJICAgIG90aGVybHZfMj0oVG9rZW4pbWF0Y2goaW5wdXQsMTAyLEZPTExPV185MSk7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OworICAgICAgICAgICAgCSAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKworICAgICAgICAgICAgCSAgICAgIAkJCQkJCQluZXdMZWFmTm9kZShvdGhlcmx2XzIsIGdyYW1tYXJBY2Nlc3MuZ2V0WFJlbGF0aW9uYWxFeHByZXNzaW9uQWNjZXNzKCkuZ2V0SW5zdGFuY2VvZktleXdvcmRfMV8wXzBfMF8xKCkpOworICAgICAgICAgICAgCSAgICAgIAkJCQkJCQorICAgICAgICAgICAgCSAgICB9CisKKyAgICAgICAgICAgIAkgICAgfQorCisKKyAgICAgICAgICAgIAkgICAgfQorCisgICAgICAgICAgICAJICAgIC8vIEludGVybmFsRGF0YURTTC5nOjQxNjE6NTogKCAobHZfdHlwZV8zXzA9IHJ1bGVKdm1UeXBlUmVmZXJlbmNlICkgKQorICAgICAgICAgICAgCSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo0MTYyOjY6IChsdl90eXBlXzNfMD0gcnVsZUp2bVR5cGVSZWZlcmVuY2UgKQorICAgICAgICAgICAgCSAgICB7CisgICAgICAgICAgICAJICAgIC8vIEludGVybmFsRGF0YURTTC5nOjQxNjI6NjogKGx2X3R5cGVfM18wPSBydWxlSnZtVHlwZVJlZmVyZW5jZSApCisgICAgICAgICAgICAJICAgIC8vIEludGVybmFsRGF0YURTTC5nOjQxNjM6NzogbHZfdHlwZV8zXzA9IHJ1bGVKdm1UeXBlUmVmZXJlbmNlCisgICAgICAgICAgICAJICAgIHsKKyAgICAgICAgICAgIAkgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisKKyAgICAgICAgICAgIAkgICAgICAJCQkJCQkJbmV3Q29tcG9zaXRlTm9kZShncmFtbWFyQWNjZXNzLmdldFhSZWxhdGlvbmFsRXhwcmVzc2lvbkFjY2VzcygpLmdldFR5cGVKdm1UeXBlUmVmZXJlbmNlUGFyc2VyUnVsZUNhbGxfMV8wXzFfMCgpKTsKKyAgICAgICAgICAgIAkgICAgICAJCQkJCQkKKyAgICAgICAgICAgIAkgICAgfQorICAgICAgICAgICAgCSAgICBwdXNoRm9sbG93KEZPTExPV185MCk7CisgICAgICAgICAgICAJICAgIGx2X3R5cGVfM18wPXJ1bGVKdm1UeXBlUmVmZXJlbmNlKCk7CisKKyAgICAgICAgICAgIAkgICAgc3RhdGUuX2ZzcC0tOworICAgICAgICAgICAgCSAgICBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gY3VycmVudDsKKyAgICAgICAgICAgIAkgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisKKyAgICAgICAgICAgIAkgICAgICAJCQkJCQkJaWYgKGN1cnJlbnQ9PW51bGwpIHsKKyAgICAgICAgICAgIAkgICAgICAJCQkJCQkJCWN1cnJlbnQgPSBjcmVhdGVNb2RlbEVsZW1lbnRGb3JQYXJlbnQoZ3JhbW1hckFjY2Vzcy5nZXRYUmVsYXRpb25hbEV4cHJlc3Npb25SdWxlKCkpOworICAgICAgICAgICAgCSAgICAgIAkJCQkJCQl9CisgICAgICAgICAgICAJICAgICAgCQkJCQkJCXNldCgKKyAgICAgICAgICAgIAkgICAgICAJCQkJCQkJCWN1cnJlbnQsCisgICAgICAgICAgICAJICAgICAgCQkJCQkJCQkidHlwZSIsCisgICAgICAgICAgICAJICAgICAgCQkJCQkJCQlsdl90eXBlXzNfMCwKKyAgICAgICAgICAgIAkgICAgICAJCQkJCQkJCSJvcmcuZWNsaXBzZS54dGV4dC54YmFzZS5YdHlwZS5Kdm1UeXBlUmVmZXJlbmNlIik7CisgICAgICAgICAgICAJICAgICAgCQkJCQkJCWFmdGVyUGFyc2VyT3JFbnVtUnVsZUNhbGwoKTsKKyAgICAgICAgICAgIAkgICAgICAJCQkJCQkKKyAgICAgICAgICAgIAkgICAgfQorCisgICAgICAgICAgICAJICAgIH0KKworCisgICAgICAgICAgICAJICAgIH0KKworCisgICAgICAgICAgICAJICAgIH0KKworCisgICAgICAgICAgICAJICAgIH0KKyAgICAgICAgICAgIAkgICAgYnJlYWs7CisgICAgICAgICAgICAJY2FzZSAyIDoKKyAgICAgICAgICAgIAkgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NDE4Mjo0OiAoICggKCAoICgpICggKCBydWxlT3BDb21wYXJlICkgKSApICk9PiAoICgpICggKCBydWxlT3BDb21wYXJlICkgKSApICkgKCAobHZfcmlnaHRPcGVyYW5kXzZfMD0gcnVsZVhPdGhlck9wZXJhdG9yRXhwcmVzc2lvbiApICkgKQorICAgICAgICAgICAgCSAgICB7CisgICAgICAgICAgICAJICAgIC8vIEludGVybmFsRGF0YURTTC5nOjQxODI6NDogKCAoICggKCAoKSAoICggcnVsZU9wQ29tcGFyZSApICkgKSApPT4gKCAoKSAoICggcnVsZU9wQ29tcGFyZSApICkgKSApICggKGx2X3JpZ2h0T3BlcmFuZF82XzA9IHJ1bGVYT3RoZXJPcGVyYXRvckV4cHJlc3Npb24gKSApICkKKyAgICAgICAgICAgIAkgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NDE4Mzo1OiAoICggKCAoKSAoICggcnVsZU9wQ29tcGFyZSApICkgKSApPT4gKCAoKSAoICggcnVsZU9wQ29tcGFyZSApICkgKSApICggKGx2X3JpZ2h0T3BlcmFuZF82XzA9IHJ1bGVYT3RoZXJPcGVyYXRvckV4cHJlc3Npb24gKSApCisgICAgICAgICAgICAJICAgIHsKKyAgICAgICAgICAgIAkgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NDE4Mzo1OiAoICggKCAoKSAoICggcnVsZU9wQ29tcGFyZSApICkgKSApPT4gKCAoKSAoICggcnVsZU9wQ29tcGFyZSApICkgKSApCisgICAgICAgICAgICAJICAgIC8vIEludGVybmFsRGF0YURTTC5nOjQxODQ6NjogKCAoICgpICggKCBydWxlT3BDb21wYXJlICkgKSApICk9PiAoICgpICggKCBydWxlT3BDb21wYXJlICkgKSApCisgICAgICAgICAgICAJICAgIHsKKyAgICAgICAgICAgIAkgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NDE5NDo2OiAoICgpICggKCBydWxlT3BDb21wYXJlICkgKSApCisgICAgICAgICAgICAJICAgIC8vIEludGVybmFsRGF0YURTTC5nOjQxOTU6NzogKCkgKCAoIHJ1bGVPcENvbXBhcmUgKSApCisgICAgICAgICAgICAJICAgIHsKKyAgICAgICAgICAgIAkgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NDE5NTo3OiAoKQorICAgICAgICAgICAgCSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo0MTk2Ojg6IAorICAgICAgICAgICAgCSAgICB7CisgICAgICAgICAgICAJICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworCisgICAgICAgICAgICAJICAgICAgCQkJCQkJCQljdXJyZW50ID0gZm9yY2VDcmVhdGVNb2RlbEVsZW1lbnRBbmRTZXQoCisgICAgICAgICAgICAJICAgICAgCQkJCQkJCQkJZ3JhbW1hckFjY2Vzcy5nZXRYUmVsYXRpb25hbEV4cHJlc3Npb25BY2Nlc3MoKS5nZXRYQmluYXJ5T3BlcmF0aW9uTGVmdE9wZXJhbmRBY3Rpb25fMV8xXzBfMF8wKCksCisgICAgICAgICAgICAJICAgICAgCQkJCQkJCQkJY3VycmVudCk7CisgICAgICAgICAgICAJICAgICAgCQkJCQkJCQorICAgICAgICAgICAgCSAgICB9CisKKyAgICAgICAgICAgIAkgICAgfQorCisgICAgICAgICAgICAJICAgIC8vIEludGVybmFsRGF0YURTTC5nOjQyMDI6NzogKCAoIHJ1bGVPcENvbXBhcmUgKSApCisgICAgICAgICAgICAJICAgIC8vIEludGVybmFsRGF0YURTTC5nOjQyMDM6ODogKCBydWxlT3BDb21wYXJlICkKKyAgICAgICAgICAgIAkgICAgeworICAgICAgICAgICAgCSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo0MjAzOjg6ICggcnVsZU9wQ29tcGFyZSApCisgICAgICAgICAgICAJICAgIC8vIEludGVybmFsRGF0YURTTC5nOjQyMDQ6OTogcnVsZU9wQ29tcGFyZQorICAgICAgICAgICAgCSAgICB7CisgICAgICAgICAgICAJICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworCisgICAgICAgICAgICAJICAgICAgCQkJCQkJCQkJaWYgKGN1cnJlbnQ9PW51bGwpIHsKKyAgICAgICAgICAgIAkgICAgICAJCQkJCQkJCQkJY3VycmVudCA9IGNyZWF0ZU1vZGVsRWxlbWVudChncmFtbWFyQWNjZXNzLmdldFhSZWxhdGlvbmFsRXhwcmVzc2lvblJ1bGUoKSk7CisgICAgICAgICAgICAJICAgICAgCQkJCQkJCQkJfQorICAgICAgICAgICAgCSAgICAgIAkJCQkJCQkJCisgICAgICAgICAgICAJICAgIH0KKyAgICAgICAgICAgIAkgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisKKyAgICAgICAgICAgIAkgICAgICAJCQkJCQkJCQluZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0WFJlbGF0aW9uYWxFeHByZXNzaW9uQWNjZXNzKCkuZ2V0RmVhdHVyZUp2bUlkZW50aWZpYWJsZUVsZW1lbnRDcm9zc1JlZmVyZW5jZV8xXzFfMF8wXzFfMCgpKTsKKyAgICAgICAgICAgIAkgICAgICAJCQkJCQkJCQorICAgICAgICAgICAgCSAgICB9CisgICAgICAgICAgICAJICAgIHB1c2hGb2xsb3coRk9MTE9XXzc4KTsKKyAgICAgICAgICAgIAkgICAgcnVsZU9wQ29tcGFyZSgpOworCisgICAgICAgICAgICAJICAgIHN0YXRlLl9mc3AtLTsKKyAgICAgICAgICAgIAkgICAgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7CisgICAgICAgICAgICAJICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworCisgICAgICAgICAgICAJICAgICAgCQkJCQkJCQkJYWZ0ZXJQYXJzZXJPckVudW1SdWxlQ2FsbCgpOworICAgICAgICAgICAgCSAgICAgIAkJCQkJCQkJCisgICAgICAgICAgICAJICAgIH0KKworICAgICAgICAgICAgCSAgICB9CisKKworICAgICAgICAgICAgCSAgICB9CisKKworICAgICAgICAgICAgCSAgICB9CisKKworICAgICAgICAgICAgCSAgICB9CisKKyAgICAgICAgICAgIAkgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NDIyMDo1OiAoIChsdl9yaWdodE9wZXJhbmRfNl8wPSBydWxlWE90aGVyT3BlcmF0b3JFeHByZXNzaW9uICkgKQorICAgICAgICAgICAgCSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo0MjIxOjY6IChsdl9yaWdodE9wZXJhbmRfNl8wPSBydWxlWE90aGVyT3BlcmF0b3JFeHByZXNzaW9uICkKKyAgICAgICAgICAgIAkgICAgeworICAgICAgICAgICAgCSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo0MjIxOjY6IChsdl9yaWdodE9wZXJhbmRfNl8wPSBydWxlWE90aGVyT3BlcmF0b3JFeHByZXNzaW9uICkKKyAgICAgICAgICAgIAkgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NDIyMjo3OiBsdl9yaWdodE9wZXJhbmRfNl8wPSBydWxlWE90aGVyT3BlcmF0b3JFeHByZXNzaW9uCisgICAgICAgICAgICAJICAgIHsKKyAgICAgICAgICAgIAkgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisKKyAgICAgICAgICAgIAkgICAgICAJCQkJCQkJbmV3Q29tcG9zaXRlTm9kZShncmFtbWFyQWNjZXNzLmdldFhSZWxhdGlvbmFsRXhwcmVzc2lvbkFjY2VzcygpLmdldFJpZ2h0T3BlcmFuZFhPdGhlck9wZXJhdG9yRXhwcmVzc2lvblBhcnNlclJ1bGVDYWxsXzFfMV8xXzAoKSk7CisgICAgICAgICAgICAJICAgICAgCQkJCQkJCisgICAgICAgICAgICAJICAgIH0KKyAgICAgICAgICAgIAkgICAgcHVzaEZvbGxvdyhGT0xMT1dfOTApOworICAgICAgICAgICAgCSAgICBsdl9yaWdodE9wZXJhbmRfNl8wPXJ1bGVYT3RoZXJPcGVyYXRvckV4cHJlc3Npb24oKTsKKworICAgICAgICAgICAgCSAgICBzdGF0ZS5fZnNwLS07CisgICAgICAgICAgICAJICAgIGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OworICAgICAgICAgICAgCSAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKworICAgICAgICAgICAgCSAgICAgIAkJCQkJCQlpZiAoY3VycmVudD09bnVsbCkgeworICAgICAgICAgICAgCSAgICAgIAkJCQkJCQkJY3VycmVudCA9IGNyZWF0ZU1vZGVsRWxlbWVudEZvclBhcmVudChncmFtbWFyQWNjZXNzLmdldFhSZWxhdGlvbmFsRXhwcmVzc2lvblJ1bGUoKSk7CisgICAgICAgICAgICAJICAgICAgCQkJCQkJCX0KKyAgICAgICAgICAgIAkgICAgICAJCQkJCQkJc2V0KAorICAgICAgICAgICAgCSAgICAgIAkJCQkJCQkJY3VycmVudCwKKyAgICAgICAgICAgIAkgICAgICAJCQkJCQkJCSJyaWdodE9wZXJhbmQiLAorICAgICAgICAgICAgCSAgICAgIAkJCQkJCQkJbHZfcmlnaHRPcGVyYW5kXzZfMCwKKyAgICAgICAgICAgIAkgICAgICAJCQkJCQkJCSJvcmcuZWNsaXBzZS54dGV4dC54YmFzZS5YYmFzZS5YT3RoZXJPcGVyYXRvckV4cHJlc3Npb24iKTsKKyAgICAgICAgICAgIAkgICAgICAJCQkJCQkJYWZ0ZXJQYXJzZXJPckVudW1SdWxlQ2FsbCgpOworICAgICAgICAgICAgCSAgICAgIAkJCQkJCQorICAgICAgICAgICAgCSAgICB9CisKKyAgICAgICAgICAgIAkgICAgfQorCisKKyAgICAgICAgICAgIAkgICAgfQorCisKKyAgICAgICAgICAgIAkgICAgfQorCisKKyAgICAgICAgICAgIAkgICAgfQorICAgICAgICAgICAgCSAgICBicmVhazsKKworICAgICAgICAgICAgCWRlZmF1bHQgOgorICAgICAgICAgICAgCSAgICBicmVhayBsb29wNzQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSB3aGlsZSAodHJ1ZSk7CisKKworICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisKKyAgICAgICAgICAgICAgCWxlYXZlUnVsZSgpOworCisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAgICAgY2F0Y2ggKFJlY29nbml0aW9uRXhjZXB0aW9uIHJlKSB7CisgICAgICAgICAgICAgICAgcmVjb3ZlcihpbnB1dCxyZSk7CisgICAgICAgICAgICAgICAgYXBwZW5kU2tpcHBlZFRva2VucygpOworICAgICAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gY3VycmVudDsKKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAicnVsZVhSZWxhdGlvbmFsRXhwcmVzc2lvbiIKKworCisgICAgLy8gJEFOVExSIHN0YXJ0ICJlbnRyeVJ1bGVPcENvbXBhcmUiCisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NDI0NToxOiBlbnRyeVJ1bGVPcENvbXBhcmUgcmV0dXJucyBbU3RyaW5nIGN1cnJlbnQ9bnVsbF0gOiBpdl9ydWxlT3BDb21wYXJlPSBydWxlT3BDb21wYXJlIEVPRiA7CisgICAgcHVibGljIGZpbmFsIFN0cmluZyBlbnRyeVJ1bGVPcENvbXBhcmUoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICBTdHJpbmcgY3VycmVudCA9IG51bGw7CisKKyAgICAgICAgQW50bHJEYXRhdHlwZVJ1bGVUb2tlbiBpdl9ydWxlT3BDb21wYXJlID0gbnVsbDsKKworCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo0MjQ1OjQ5OiAoaXZfcnVsZU9wQ29tcGFyZT0gcnVsZU9wQ29tcGFyZSBFT0YgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NDI0NjoyOiBpdl9ydWxlT3BDb21wYXJlPSBydWxlT3BDb21wYXJlIEVPRgorICAgICAgICAgICAgeworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBuZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0T3BDb21wYXJlUnVsZSgpKTsgCisgICAgICAgICAgICB9CisgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV18xKTsKKyAgICAgICAgICAgIGl2X3J1bGVPcENvbXBhcmU9cnVsZU9wQ29tcGFyZSgpOworCisgICAgICAgICAgICBzdGF0ZS5fZnNwLS07CisgICAgICAgICAgICBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gY3VycmVudDsKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgY3VycmVudCA9aXZfcnVsZU9wQ29tcGFyZS5nZXRUZXh0KCk7IAorICAgICAgICAgICAgfQorICAgICAgICAgICAgbWF0Y2goaW5wdXQsRU9GLEZPTExPV18yKTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7CisKKyAgICAgICAgICAgIH0KKworICAgICAgICB9CisKKyAgICAgICAgICAgIGNhdGNoIChSZWNvZ25pdGlvbkV4Y2VwdGlvbiByZSkgeworICAgICAgICAgICAgICAgIHJlY292ZXIoaW5wdXQscmUpOworICAgICAgICAgICAgICAgIGFwcGVuZFNraXBwZWRUb2tlbnMoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGN1cnJlbnQ7CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgImVudHJ5UnVsZU9wQ29tcGFyZSIKKworCisgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlT3BDb21wYXJlIgorICAgIC8vIEludGVybmFsRGF0YURTTC5nOjQyNTI6MTogcnVsZU9wQ29tcGFyZSByZXR1cm5zIFtBbnRsckRhdGF0eXBlUnVsZVRva2VuIGN1cnJlbnQ9bmV3IEFudGxyRGF0YXR5cGVSdWxlVG9rZW4oKV0gOiAoa3c9ICc+PScgfCAoa3c9ICc8JyBrdz0gJz0nICkgfCBrdz0gJz4nIHwga3c9ICc8JyApIDsKKyAgICBwdWJsaWMgZmluYWwgQW50bHJEYXRhdHlwZVJ1bGVUb2tlbiBydWxlT3BDb21wYXJlKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgQW50bHJEYXRhdHlwZVJ1bGVUb2tlbiBjdXJyZW50ID0gbmV3IEFudGxyRGF0YXR5cGVSdWxlVG9rZW4oKTsKKworICAgICAgICBUb2tlbiBrdz1udWxsOworCisKKyAgICAgICAgCWVudGVyUnVsZSgpOworCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo0MjU4OjI6ICggKGt3PSAnPj0nIHwgKGt3PSAnPCcga3c9ICc9JyApIHwga3c9ICc+JyB8IGt3PSAnPCcgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo0MjU5OjI6IChrdz0gJz49JyB8IChrdz0gJzwnIGt3PSAnPScgKSB8IGt3PSAnPicgfCBrdz0gJzwnICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjQyNTk6MjogKGt3PSAnPj0nIHwgKGt3PSAnPCcga3c9ICc9JyApIHwga3c9ICc+JyB8IGt3PSAnPCcgKQorICAgICAgICAgICAgaW50IGFsdDc1PTQ7CisgICAgICAgICAgICBzd2l0Y2ggKCBpbnB1dC5MQSgxKSApIHsKKyAgICAgICAgICAgIGNhc2UgOTU6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGFsdDc1PTE7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSA5MzoKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaW50IExBNzVfMiA9IGlucHV0LkxBKDIpOworCisgICAgICAgICAgICAgICAgaWYgKCAoTEE3NV8yPT1FT0Z8fChMQTc1XzI+PVJVTEVfU1RSSU5HICYmIExBNzVfMjw9UlVMRV9ERUNJTUFMKXx8TEE3NV8yPT0xNXx8TEE3NV8yPT01MHx8TEE3NV8yPT03Mnx8KExBNzVfMj49NzUgJiYgTEE3NV8yPD03Nil8fExBNzVfMj09ODF8fChMQTc1XzI+PTg1ICYmIExBNzVfMjw9ODYpfHxMQTc1XzI9PTkzfHwoTEE3NV8yPj0xMDkgJiYgTEE3NV8yPD0xMTApfHxMQTc1XzI9PTExNHx8TEE3NV8yPT0xMjB8fExBNzVfMj09MTIyfHwoTEE3NV8yPj0xMjYgJiYgTEE3NV8yPD0xMjcpfHwoTEE3NV8yPj0xMzAgJiYgTEE3NV8yPD0xMzkpfHxMQTc1XzI9PTE0MSkgKSB7CisgICAgICAgICAgICAgICAgICAgIGFsdDc1PTQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgaWYgKCAoTEE3NV8yPT04NCkgKSB7CisgICAgICAgICAgICAgICAgICAgIGFsdDc1PTI7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgICAgICBpZiAoc3RhdGUuYmFja3RyYWNraW5nPjApIHtzdGF0ZS5mYWlsZWQ9dHJ1ZTsgcmV0dXJuIGN1cnJlbnQ7fQorICAgICAgICAgICAgICAgICAgICBOb1ZpYWJsZUFsdEV4Y2VwdGlvbiBudmFlID0KKyAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBOb1ZpYWJsZUFsdEV4Y2VwdGlvbigiIiwgNzUsIDIsIGlucHV0KTsKKworICAgICAgICAgICAgICAgICAgICB0aHJvdyBudmFlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDk0OgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBhbHQ3NT0zOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgaWYgKHN0YXRlLmJhY2t0cmFja2luZz4wKSB7c3RhdGUuZmFpbGVkPXRydWU7IHJldHVybiBjdXJyZW50O30KKyAgICAgICAgICAgICAgICBOb1ZpYWJsZUFsdEV4Y2VwdGlvbiBudmFlID0KKyAgICAgICAgICAgICAgICAgICAgbmV3IE5vVmlhYmxlQWx0RXhjZXB0aW9uKCIiLCA3NSwgMCwgaW5wdXQpOworCisgICAgICAgICAgICAgICAgdGhyb3cgbnZhZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3dpdGNoIChhbHQ3NSkgeworICAgICAgICAgICAgICAgIGNhc2UgMSA6CisgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjQyNjA6Mzoga3c9ICc+PScKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBrdz0oVG9rZW4pbWF0Y2goaW5wdXQsOTUsRk9MTE9XXzIpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gY3VycmVudDsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisKKyAgICAgICAgICAgICAgICAgICAgICAJCQljdXJyZW50Lm1lcmdlKGt3KTsKKyAgICAgICAgICAgICAgICAgICAgICAJCQluZXdMZWFmTm9kZShrdywgZ3JhbW1hckFjY2Vzcy5nZXRPcENvbXBhcmVBY2Nlc3MoKS5nZXRHcmVhdGVyVGhhblNpZ25FcXVhbHNTaWduS2V5d29yZF8wKCkpOworICAgICAgICAgICAgICAgICAgICAgIAkJCisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgMiA6CisgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjQyNjY6MzogKGt3PSAnPCcga3c9ICc9JyApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NDI2NjozOiAoa3c9ICc8JyBrdz0gJz0nICkKKyAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NDI2Nzo0OiBrdz0gJzwnIGt3PSAnPScKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBrdz0oVG9rZW4pbWF0Y2goaW5wdXQsOTMsRk9MTE9XXzc3KTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7CisgICAgICAgICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworCisgICAgICAgICAgICAgICAgICAgICAgCQkJCWN1cnJlbnQubWVyZ2Uoa3cpOworICAgICAgICAgICAgICAgICAgICAgIAkJCQluZXdMZWFmTm9kZShrdywgZ3JhbW1hckFjY2Vzcy5nZXRPcENvbXBhcmVBY2Nlc3MoKS5nZXRMZXNzVGhhblNpZ25LZXl3b3JkXzFfMCgpKTsKKyAgICAgICAgICAgICAgICAgICAgICAJCQkKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBrdz0oVG9rZW4pbWF0Y2goaW5wdXQsODQsRk9MTE9XXzIpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gY3VycmVudDsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisKKyAgICAgICAgICAgICAgICAgICAgICAJCQkJY3VycmVudC5tZXJnZShrdyk7CisgICAgICAgICAgICAgICAgICAgICAgCQkJCW5ld0xlYWZOb2RlKGt3LCBncmFtbWFyQWNjZXNzLmdldE9wQ29tcGFyZUFjY2VzcygpLmdldEVxdWFsc1NpZ25LZXl3b3JkXzFfMSgpKTsKKyAgICAgICAgICAgICAgICAgICAgICAJCQkKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSAzIDoKKyAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NDI3OTozOiBrdz0gJz4nCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAga3c9KFRva2VuKW1hdGNoKGlucHV0LDk0LEZPTExPV18yKTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7CisgICAgICAgICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworCisgICAgICAgICAgICAgICAgICAgICAgCQkJY3VycmVudC5tZXJnZShrdyk7CisgICAgICAgICAgICAgICAgICAgICAgCQkJbmV3TGVhZk5vZGUoa3csIGdyYW1tYXJBY2Nlc3MuZ2V0T3BDb21wYXJlQWNjZXNzKCkuZ2V0R3JlYXRlclRoYW5TaWduS2V5d29yZF8yKCkpOworICAgICAgICAgICAgICAgICAgICAgIAkJCisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgNCA6CisgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjQyODU6Mzoga3c9ICc8JworICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGt3PShUb2tlbiltYXRjaChpbnB1dCw5MyxGT0xMT1dfMik7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OworICAgICAgICAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKworICAgICAgICAgICAgICAgICAgICAgIAkJCWN1cnJlbnQubWVyZ2Uoa3cpOworICAgICAgICAgICAgICAgICAgICAgIAkJCW5ld0xlYWZOb2RlKGt3LCBncmFtbWFyQWNjZXNzLmdldE9wQ29tcGFyZUFjY2VzcygpLmdldExlc3NUaGFuU2lnbktleXdvcmRfMygpKTsKKyAgICAgICAgICAgICAgICAgICAgICAJCQorICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisKKyAgICAgICAgICAgICAgCWxlYXZlUnVsZSgpOworCisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAgICAgY2F0Y2ggKFJlY29nbml0aW9uRXhjZXB0aW9uIHJlKSB7CisgICAgICAgICAgICAgICAgcmVjb3ZlcihpbnB1dCxyZSk7CisgICAgICAgICAgICAgICAgYXBwZW5kU2tpcHBlZFRva2VucygpOworICAgICAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gY3VycmVudDsKKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAicnVsZU9wQ29tcGFyZSIKKworCisgICAgLy8gJEFOVExSIHN0YXJ0ICJlbnRyeVJ1bGVYT3RoZXJPcGVyYXRvckV4cHJlc3Npb24iCisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NDI5NDoxOiBlbnRyeVJ1bGVYT3RoZXJPcGVyYXRvckV4cHJlc3Npb24gcmV0dXJucyBbRU9iamVjdCBjdXJyZW50PW51bGxdIDogaXZfcnVsZVhPdGhlck9wZXJhdG9yRXhwcmVzc2lvbj0gcnVsZVhPdGhlck9wZXJhdG9yRXhwcmVzc2lvbiBFT0YgOworICAgIHB1YmxpYyBmaW5hbCBFT2JqZWN0IGVudHJ5UnVsZVhPdGhlck9wZXJhdG9yRXhwcmVzc2lvbigpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIEVPYmplY3QgY3VycmVudCA9IG51bGw7CisKKyAgICAgICAgRU9iamVjdCBpdl9ydWxlWE90aGVyT3BlcmF0b3JFeHByZXNzaW9uID0gbnVsbDsKKworCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo0Mjk0OjY1OiAoaXZfcnVsZVhPdGhlck9wZXJhdG9yRXhwcmVzc2lvbj0gcnVsZVhPdGhlck9wZXJhdG9yRXhwcmVzc2lvbiBFT0YgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NDI5NToyOiBpdl9ydWxlWE90aGVyT3BlcmF0b3JFeHByZXNzaW9uPSBydWxlWE90aGVyT3BlcmF0b3JFeHByZXNzaW9uIEVPRgorICAgICAgICAgICAgeworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBuZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0WE90aGVyT3BlcmF0b3JFeHByZXNzaW9uUnVsZSgpKTsgCisgICAgICAgICAgICB9CisgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV18xKTsKKyAgICAgICAgICAgIGl2X3J1bGVYT3RoZXJPcGVyYXRvckV4cHJlc3Npb249cnVsZVhPdGhlck9wZXJhdG9yRXhwcmVzc2lvbigpOworCisgICAgICAgICAgICBzdGF0ZS5fZnNwLS07CisgICAgICAgICAgICBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gY3VycmVudDsKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgY3VycmVudCA9aXZfcnVsZVhPdGhlck9wZXJhdG9yRXhwcmVzc2lvbjsgCisgICAgICAgICAgICB9CisgICAgICAgICAgICBtYXRjaChpbnB1dCxFT0YsRk9MTE9XXzIpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gY3VycmVudDsKKworICAgICAgICAgICAgfQorCisgICAgICAgIH0KKworICAgICAgICAgICAgY2F0Y2ggKFJlY29nbml0aW9uRXhjZXB0aW9uIHJlKSB7CisgICAgICAgICAgICAgICAgcmVjb3ZlcihpbnB1dCxyZSk7CisgICAgICAgICAgICAgICAgYXBwZW5kU2tpcHBlZFRva2VucygpOworICAgICAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gY3VycmVudDsKKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAiZW50cnlSdWxlWE90aGVyT3BlcmF0b3JFeHByZXNzaW9uIgorCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVYT3RoZXJPcGVyYXRvckV4cHJlc3Npb24iCisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NDMwMToxOiBydWxlWE90aGVyT3BlcmF0b3JFeHByZXNzaW9uIHJldHVybnMgW0VPYmplY3QgY3VycmVudD1udWxsXSA6ICh0aGlzX1hBZGRpdGl2ZUV4cHJlc3Npb25fMD0gcnVsZVhBZGRpdGl2ZUV4cHJlc3Npb24gKCAoICggKCAoKSAoICggcnVsZU9wT3RoZXIgKSApICkgKT0+ICggKCkgKCAoIHJ1bGVPcE90aGVyICkgKSApICkgKCAobHZfcmlnaHRPcGVyYW5kXzNfMD0gcnVsZVhBZGRpdGl2ZUV4cHJlc3Npb24gKSApICkqICkgOworICAgIHB1YmxpYyBmaW5hbCBFT2JqZWN0IHJ1bGVYT3RoZXJPcGVyYXRvckV4cHJlc3Npb24oKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICBFT2JqZWN0IGN1cnJlbnQgPSBudWxsOworCisgICAgICAgIEVPYmplY3QgdGhpc19YQWRkaXRpdmVFeHByZXNzaW9uXzAgPSBudWxsOworCisgICAgICAgIEVPYmplY3QgbHZfcmlnaHRPcGVyYW5kXzNfMCA9IG51bGw7CisKKworCisgICAgICAgIAllbnRlclJ1bGUoKTsKKworICAgICAgICB0cnkgeworICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NDMwNzoyOiAoICh0aGlzX1hBZGRpdGl2ZUV4cHJlc3Npb25fMD0gcnVsZVhBZGRpdGl2ZUV4cHJlc3Npb24gKCAoICggKCAoKSAoICggcnVsZU9wT3RoZXIgKSApICkgKT0+ICggKCkgKCAoIHJ1bGVPcE90aGVyICkgKSApICkgKCAobHZfcmlnaHRPcGVyYW5kXzNfMD0gcnVsZVhBZGRpdGl2ZUV4cHJlc3Npb24gKSApICkqICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NDMwODoyOiAodGhpc19YQWRkaXRpdmVFeHByZXNzaW9uXzA9IHJ1bGVYQWRkaXRpdmVFeHByZXNzaW9uICggKCAoICggKCkgKCAoIHJ1bGVPcE90aGVyICkgKSApICk9PiAoICgpICggKCBydWxlT3BPdGhlciApICkgKSApICggKGx2X3JpZ2h0T3BlcmFuZF8zXzA9IHJ1bGVYQWRkaXRpdmVFeHByZXNzaW9uICkgKSApKiApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo0MzA4OjI6ICh0aGlzX1hBZGRpdGl2ZUV4cHJlc3Npb25fMD0gcnVsZVhBZGRpdGl2ZUV4cHJlc3Npb24gKCAoICggKCAoKSAoICggcnVsZU9wT3RoZXIgKSApICkgKT0+ICggKCkgKCAoIHJ1bGVPcE90aGVyICkgKSApICkgKCAobHZfcmlnaHRPcGVyYW5kXzNfMD0gcnVsZVhBZGRpdGl2ZUV4cHJlc3Npb24gKSApICkqICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjQzMDk6MzogdGhpc19YQWRkaXRpdmVFeHByZXNzaW9uXzA9IHJ1bGVYQWRkaXRpdmVFeHByZXNzaW9uICggKCAoICggKCkgKCAoIHJ1bGVPcE90aGVyICkgKSApICk9PiAoICgpICggKCBydWxlT3BPdGhlciApICkgKSApICggKGx2X3JpZ2h0T3BlcmFuZF8zXzA9IHJ1bGVYQWRkaXRpdmVFeHByZXNzaW9uICkgKSApKgorICAgICAgICAgICAgeworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisKKyAgICAgICAgICAgICAgCQkJbmV3Q29tcG9zaXRlTm9kZShncmFtbWFyQWNjZXNzLmdldFhPdGhlck9wZXJhdG9yRXhwcmVzc2lvbkFjY2VzcygpLmdldFhBZGRpdGl2ZUV4cHJlc3Npb25QYXJzZXJSdWxlQ2FsbF8wKCkpOworICAgICAgICAgICAgICAJCQorICAgICAgICAgICAgfQorICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfOTIpOworICAgICAgICAgICAgdGhpc19YQWRkaXRpdmVFeHByZXNzaW9uXzA9cnVsZVhBZGRpdGl2ZUV4cHJlc3Npb24oKTsKKworICAgICAgICAgICAgc3RhdGUuX2ZzcC0tOworICAgICAgICAgICAgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7CisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKworICAgICAgICAgICAgICAJCQljdXJyZW50ID0gdGhpc19YQWRkaXRpdmVFeHByZXNzaW9uXzA7CisgICAgICAgICAgICAgIAkJCWFmdGVyUGFyc2VyT3JFbnVtUnVsZUNhbGwoKTsKKyAgICAgICAgICAgICAgCQkKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjQzMTc6MzogKCAoICggKCAoKSAoICggcnVsZU9wT3RoZXIgKSApICkgKT0+ICggKCkgKCAoIHJ1bGVPcE90aGVyICkgKSApICkgKCAobHZfcmlnaHRPcGVyYW5kXzNfMD0gcnVsZVhBZGRpdGl2ZUV4cHJlc3Npb24gKSApICkqCisgICAgICAgICAgICBsb29wNzY6CisgICAgICAgICAgICBkbyB7CisgICAgICAgICAgICAgICAgaW50IGFsdDc2PTI7CisgICAgICAgICAgICAgICAgYWx0NzYgPSBkZmE3Ni5wcmVkaWN0KGlucHV0KTsKKyAgICAgICAgICAgICAgICBzd2l0Y2ggKGFsdDc2KSB7CisgICAgICAgICAgICAJY2FzZSAxIDoKKyAgICAgICAgICAgIAkgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NDMxODo0OiAoICggKCAoKSAoICggcnVsZU9wT3RoZXIgKSApICkgKT0+ICggKCkgKCAoIHJ1bGVPcE90aGVyICkgKSApICkgKCAobHZfcmlnaHRPcGVyYW5kXzNfMD0gcnVsZVhBZGRpdGl2ZUV4cHJlc3Npb24gKSApCisgICAgICAgICAgICAJICAgIHsKKyAgICAgICAgICAgIAkgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NDMxODo0OiAoICggKCAoKSAoICggcnVsZU9wT3RoZXIgKSApICkgKT0+ICggKCkgKCAoIHJ1bGVPcE90aGVyICkgKSApICkKKyAgICAgICAgICAgIAkgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NDMxOTo1OiAoICggKCkgKCAoIHJ1bGVPcE90aGVyICkgKSApICk9PiAoICgpICggKCBydWxlT3BPdGhlciApICkgKQorICAgICAgICAgICAgCSAgICB7CisgICAgICAgICAgICAJICAgIC8vIEludGVybmFsRGF0YURTTC5nOjQzMjk6NTogKCAoKSAoICggcnVsZU9wT3RoZXIgKSApICkKKyAgICAgICAgICAgIAkgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NDMzMDo2OiAoKSAoICggcnVsZU9wT3RoZXIgKSApCisgICAgICAgICAgICAJICAgIHsKKyAgICAgICAgICAgIAkgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NDMzMDo2OiAoKQorICAgICAgICAgICAgCSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo0MzMxOjc6IAorICAgICAgICAgICAgCSAgICB7CisgICAgICAgICAgICAJICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworCisgICAgICAgICAgICAJICAgICAgCQkJCQkJCWN1cnJlbnQgPSBmb3JjZUNyZWF0ZU1vZGVsRWxlbWVudEFuZFNldCgKKyAgICAgICAgICAgIAkgICAgICAJCQkJCQkJCWdyYW1tYXJBY2Nlc3MuZ2V0WE90aGVyT3BlcmF0b3JFeHByZXNzaW9uQWNjZXNzKCkuZ2V0WEJpbmFyeU9wZXJhdGlvbkxlZnRPcGVyYW5kQWN0aW9uXzFfMF8wXzAoKSwKKyAgICAgICAgICAgIAkgICAgICAJCQkJCQkJCWN1cnJlbnQpOworICAgICAgICAgICAgCSAgICAgIAkJCQkJCQorICAgICAgICAgICAgCSAgICB9CisKKyAgICAgICAgICAgIAkgICAgfQorCisgICAgICAgICAgICAJICAgIC8vIEludGVybmFsRGF0YURTTC5nOjQzMzc6NjogKCAoIHJ1bGVPcE90aGVyICkgKQorICAgICAgICAgICAgCSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo0MzM4Ojc6ICggcnVsZU9wT3RoZXIgKQorICAgICAgICAgICAgCSAgICB7CisgICAgICAgICAgICAJICAgIC8vIEludGVybmFsRGF0YURTTC5nOjQzMzg6NzogKCBydWxlT3BPdGhlciApCisgICAgICAgICAgICAJICAgIC8vIEludGVybmFsRGF0YURTTC5nOjQzMzk6ODogcnVsZU9wT3RoZXIKKyAgICAgICAgICAgIAkgICAgeworICAgICAgICAgICAgCSAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKworICAgICAgICAgICAgCSAgICAgIAkJCQkJCQkJaWYgKGN1cnJlbnQ9PW51bGwpIHsKKyAgICAgICAgICAgIAkgICAgICAJCQkJCQkJCQljdXJyZW50ID0gY3JlYXRlTW9kZWxFbGVtZW50KGdyYW1tYXJBY2Nlc3MuZ2V0WE90aGVyT3BlcmF0b3JFeHByZXNzaW9uUnVsZSgpKTsKKyAgICAgICAgICAgIAkgICAgICAJCQkJCQkJCX0KKyAgICAgICAgICAgIAkgICAgICAJCQkJCQkJCisgICAgICAgICAgICAJICAgIH0KKyAgICAgICAgICAgIAkgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisKKyAgICAgICAgICAgIAkgICAgICAJCQkJCQkJCW5ld0NvbXBvc2l0ZU5vZGUoZ3JhbW1hckFjY2Vzcy5nZXRYT3RoZXJPcGVyYXRvckV4cHJlc3Npb25BY2Nlc3MoKS5nZXRGZWF0dXJlSnZtSWRlbnRpZmlhYmxlRWxlbWVudENyb3NzUmVmZXJlbmNlXzFfMF8wXzFfMCgpKTsKKyAgICAgICAgICAgIAkgICAgICAJCQkJCQkJCisgICAgICAgICAgICAJICAgIH0KKyAgICAgICAgICAgIAkgICAgcHVzaEZvbGxvdyhGT0xMT1dfNzgpOworICAgICAgICAgICAgCSAgICBydWxlT3BPdGhlcigpOworCisgICAgICAgICAgICAJICAgIHN0YXRlLl9mc3AtLTsKKyAgICAgICAgICAgIAkgICAgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7CisgICAgICAgICAgICAJICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworCisgICAgICAgICAgICAJICAgICAgCQkJCQkJCQlhZnRlclBhcnNlck9yRW51bVJ1bGVDYWxsKCk7CisgICAgICAgICAgICAJICAgICAgCQkJCQkJCQorICAgICAgICAgICAgCSAgICB9CisKKyAgICAgICAgICAgIAkgICAgfQorCisKKyAgICAgICAgICAgIAkgICAgfQorCisKKyAgICAgICAgICAgIAkgICAgfQorCisKKyAgICAgICAgICAgIAkgICAgfQorCisgICAgICAgICAgICAJICAgIC8vIEludGVybmFsRGF0YURTTC5nOjQzNTU6NDogKCAobHZfcmlnaHRPcGVyYW5kXzNfMD0gcnVsZVhBZGRpdGl2ZUV4cHJlc3Npb24gKSApCisgICAgICAgICAgICAJICAgIC8vIEludGVybmFsRGF0YURTTC5nOjQzNTY6NTogKGx2X3JpZ2h0T3BlcmFuZF8zXzA9IHJ1bGVYQWRkaXRpdmVFeHByZXNzaW9uICkKKyAgICAgICAgICAgIAkgICAgeworICAgICAgICAgICAgCSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo0MzU2OjU6IChsdl9yaWdodE9wZXJhbmRfM18wPSBydWxlWEFkZGl0aXZlRXhwcmVzc2lvbiApCisgICAgICAgICAgICAJICAgIC8vIEludGVybmFsRGF0YURTTC5nOjQzNTc6NjogbHZfcmlnaHRPcGVyYW5kXzNfMD0gcnVsZVhBZGRpdGl2ZUV4cHJlc3Npb24KKyAgICAgICAgICAgIAkgICAgeworICAgICAgICAgICAgCSAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKworICAgICAgICAgICAgCSAgICAgIAkJCQkJCW5ld0NvbXBvc2l0ZU5vZGUoZ3JhbW1hckFjY2Vzcy5nZXRYT3RoZXJPcGVyYXRvckV4cHJlc3Npb25BY2Nlc3MoKS5nZXRSaWdodE9wZXJhbmRYQWRkaXRpdmVFeHByZXNzaW9uUGFyc2VyUnVsZUNhbGxfMV8xXzAoKSk7CisgICAgICAgICAgICAJICAgICAgCQkJCQkKKyAgICAgICAgICAgIAkgICAgfQorICAgICAgICAgICAgCSAgICBwdXNoRm9sbG93KEZPTExPV185Mik7CisgICAgICAgICAgICAJICAgIGx2X3JpZ2h0T3BlcmFuZF8zXzA9cnVsZVhBZGRpdGl2ZUV4cHJlc3Npb24oKTsKKworICAgICAgICAgICAgCSAgICBzdGF0ZS5fZnNwLS07CisgICAgICAgICAgICAJICAgIGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OworICAgICAgICAgICAgCSAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKworICAgICAgICAgICAgCSAgICAgIAkJCQkJCWlmIChjdXJyZW50PT1udWxsKSB7CisgICAgICAgICAgICAJICAgICAgCQkJCQkJCWN1cnJlbnQgPSBjcmVhdGVNb2RlbEVsZW1lbnRGb3JQYXJlbnQoZ3JhbW1hckFjY2Vzcy5nZXRYT3RoZXJPcGVyYXRvckV4cHJlc3Npb25SdWxlKCkpOworICAgICAgICAgICAgCSAgICAgIAkJCQkJCX0KKyAgICAgICAgICAgIAkgICAgICAJCQkJCQlzZXQoCisgICAgICAgICAgICAJICAgICAgCQkJCQkJCWN1cnJlbnQsCisgICAgICAgICAgICAJICAgICAgCQkJCQkJCSJyaWdodE9wZXJhbmQiLAorICAgICAgICAgICAgCSAgICAgIAkJCQkJCQlsdl9yaWdodE9wZXJhbmRfM18wLAorICAgICAgICAgICAgCSAgICAgIAkJCQkJCQkib3JnLmVjbGlwc2UueHRleHQueGJhc2UuWGJhc2UuWEFkZGl0aXZlRXhwcmVzc2lvbiIpOworICAgICAgICAgICAgCSAgICAgIAkJCQkJCWFmdGVyUGFyc2VyT3JFbnVtUnVsZUNhbGwoKTsKKyAgICAgICAgICAgIAkgICAgICAJCQkJCQorICAgICAgICAgICAgCSAgICB9CisKKyAgICAgICAgICAgIAkgICAgfQorCisKKyAgICAgICAgICAgIAkgICAgfQorCisKKyAgICAgICAgICAgIAkgICAgfQorICAgICAgICAgICAgCSAgICBicmVhazsKKworICAgICAgICAgICAgCWRlZmF1bHQgOgorICAgICAgICAgICAgCSAgICBicmVhayBsb29wNzY7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSB3aGlsZSAodHJ1ZSk7CisKKworICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisKKyAgICAgICAgICAgICAgCWxlYXZlUnVsZSgpOworCisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAgICAgY2F0Y2ggKFJlY29nbml0aW9uRXhjZXB0aW9uIHJlKSB7CisgICAgICAgICAgICAgICAgcmVjb3ZlcihpbnB1dCxyZSk7CisgICAgICAgICAgICAgICAgYXBwZW5kU2tpcHBlZFRva2VucygpOworICAgICAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gY3VycmVudDsKKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAicnVsZVhPdGhlck9wZXJhdG9yRXhwcmVzc2lvbiIKKworCisgICAgLy8gJEFOVExSIHN0YXJ0ICJlbnRyeVJ1bGVPcE90aGVyIgorICAgIC8vIEludGVybmFsRGF0YURTTC5nOjQzNzk6MTogZW50cnlSdWxlT3BPdGhlciByZXR1cm5zIFtTdHJpbmcgY3VycmVudD1udWxsXSA6IGl2X3J1bGVPcE90aGVyPSBydWxlT3BPdGhlciBFT0YgOworICAgIHB1YmxpYyBmaW5hbCBTdHJpbmcgZW50cnlSdWxlT3BPdGhlcigpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIFN0cmluZyBjdXJyZW50ID0gbnVsbDsKKworICAgICAgICBBbnRsckRhdGF0eXBlUnVsZVRva2VuIGl2X3J1bGVPcE90aGVyID0gbnVsbDsKKworCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo0Mzc5OjQ3OiAoaXZfcnVsZU9wT3RoZXI9IHJ1bGVPcE90aGVyIEVPRiApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo0MzgwOjI6IGl2X3J1bGVPcE90aGVyPSBydWxlT3BPdGhlciBFT0YKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgbmV3Q29tcG9zaXRlTm9kZShncmFtbWFyQWNjZXNzLmdldE9wT3RoZXJSdWxlKCkpOyAKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzEpOworICAgICAgICAgICAgaXZfcnVsZU9wT3RoZXI9cnVsZU9wT3RoZXIoKTsKKworICAgICAgICAgICAgc3RhdGUuX2ZzcC0tOworICAgICAgICAgICAgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7CisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIGN1cnJlbnQgPWl2X3J1bGVPcE90aGVyLmdldFRleHQoKTsgCisgICAgICAgICAgICB9CisgICAgICAgICAgICBtYXRjaChpbnB1dCxFT0YsRk9MTE9XXzIpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gY3VycmVudDsKKworICAgICAgICAgICAgfQorCisgICAgICAgIH0KKworICAgICAgICAgICAgY2F0Y2ggKFJlY29nbml0aW9uRXhjZXB0aW9uIHJlKSB7CisgICAgICAgICAgICAgICAgcmVjb3ZlcihpbnB1dCxyZSk7CisgICAgICAgICAgICAgICAgYXBwZW5kU2tpcHBlZFRva2VucygpOworICAgICAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gY3VycmVudDsKKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAiZW50cnlSdWxlT3BPdGhlciIKKworCisgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlT3BPdGhlciIKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo0Mzg2OjE6IHJ1bGVPcE90aGVyIHJldHVybnMgW0FudGxyRGF0YXR5cGVSdWxlVG9rZW4gY3VycmVudD1uZXcgQW50bHJEYXRhdHlwZVJ1bGVUb2tlbigpXSA6IChrdz0gJy0+JyB8IGt3PSAnLi48JyB8IChrdz0gJz4nIGt3PSAnLi4nICkgfCBrdz0gJy4uJyB8IGt3PSAnPT4nIHwgKGt3PSAnPicgKCAoICggKCAnPicgJz4nICkgKT0+IChrdz0gJz4nIGt3PSAnPicgKSApIHwga3c9ICc+JyApICkgfCAoa3c9ICc8JyAoICggKCAoICc8JyAnPCcgKSApPT4gKGt3PSAnPCcga3c9ICc8JyApICkgfCBrdz0gJzwnIHwga3c9ICc9PicgKSApIHwga3c9ICc8PicgfCBrdz0gJz86JyApIDsKKyAgICBwdWJsaWMgZmluYWwgQW50bHJEYXRhdHlwZVJ1bGVUb2tlbiBydWxlT3BPdGhlcigpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIEFudGxyRGF0YXR5cGVSdWxlVG9rZW4gY3VycmVudCA9IG5ldyBBbnRsckRhdGF0eXBlUnVsZVRva2VuKCk7CisKKyAgICAgICAgVG9rZW4ga3c9bnVsbDsKKworCisgICAgICAgIAllbnRlclJ1bGUoKTsKKworICAgICAgICB0cnkgeworICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NDM5MjoyOiAoIChrdz0gJy0+JyB8IGt3PSAnLi48JyB8IChrdz0gJz4nIGt3PSAnLi4nICkgfCBrdz0gJy4uJyB8IGt3PSAnPT4nIHwgKGt3PSAnPicgKCAoICggKCAnPicgJz4nICkgKT0+IChrdz0gJz4nIGt3PSAnPicgKSApIHwga3c9ICc+JyApICkgfCAoa3c9ICc8JyAoICggKCAoICc8JyAnPCcgKSApPT4gKGt3PSAnPCcga3c9ICc8JyApICkgfCBrdz0gJzwnIHwga3c9ICc9PicgKSApIHwga3c9ICc8PicgfCBrdz0gJz86JyApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjQzOTM6MjogKGt3PSAnLT4nIHwga3c9ICcuLjwnIHwgKGt3PSAnPicga3c9ICcuLicgKSB8IGt3PSAnLi4nIHwga3c9ICc9PicgfCAoa3c9ICc+JyAoICggKCAoICc+JyAnPicgKSApPT4gKGt3PSAnPicga3c9ICc+JyApICkgfCBrdz0gJz4nICkgKSB8IChrdz0gJzwnICggKCAoICggJzwnICc8JyApICk9PiAoa3c9ICc8JyBrdz0gJzwnICkgKSB8IGt3PSAnPCcgfCBrdz0gJz0+JyApICkgfCBrdz0gJzw+JyB8IGt3PSAnPzonICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjQzOTM6MjogKGt3PSAnLT4nIHwga3c9ICcuLjwnIHwgKGt3PSAnPicga3c9ICcuLicgKSB8IGt3PSAnLi4nIHwga3c9ICc9PicgfCAoa3c9ICc+JyAoICggKCAoICc+JyAnPicgKSApPT4gKGt3PSAnPicga3c9ICc+JyApICkgfCBrdz0gJz4nICkgKSB8IChrdz0gJzwnICggKCAoICggJzwnICc8JyApICk9PiAoa3c9ICc8JyBrdz0gJzwnICkgKSB8IGt3PSAnPCcgfCBrdz0gJz0+JyApICkgfCBrdz0gJzw+JyB8IGt3PSAnPzonICkKKyAgICAgICAgICAgIGludCBhbHQ3OT05OworICAgICAgICAgICAgYWx0NzkgPSBkZmE3OS5wcmVkaWN0KGlucHV0KTsKKyAgICAgICAgICAgIHN3aXRjaCAoYWx0NzkpIHsKKyAgICAgICAgICAgICAgICBjYXNlIDEgOgorICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo0Mzk0OjM6IGt3PSAnLT4nCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAga3c9KFRva2VuKW1hdGNoKGlucHV0LDEwMyxGT0xMT1dfMik7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OworICAgICAgICAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKworICAgICAgICAgICAgICAgICAgICAgIAkJCWN1cnJlbnQubWVyZ2Uoa3cpOworICAgICAgICAgICAgICAgICAgICAgIAkJCW5ld0xlYWZOb2RlKGt3LCBncmFtbWFyQWNjZXNzLmdldE9wT3RoZXJBY2Nlc3MoKS5nZXRIeXBoZW5NaW51c0dyZWF0ZXJUaGFuU2lnbktleXdvcmRfMCgpKTsKKyAgICAgICAgICAgICAgICAgICAgICAJCQorICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIDIgOgorICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo0NDAwOjM6IGt3PSAnLi48JworICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGt3PShUb2tlbiltYXRjaChpbnB1dCwxMDQsRk9MTE9XXzIpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gY3VycmVudDsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisKKyAgICAgICAgICAgICAgICAgICAgICAJCQljdXJyZW50Lm1lcmdlKGt3KTsKKyAgICAgICAgICAgICAgICAgICAgICAJCQluZXdMZWFmTm9kZShrdywgZ3JhbW1hckFjY2Vzcy5nZXRPcE90aGVyQWNjZXNzKCkuZ2V0RnVsbFN0b3BGdWxsU3RvcExlc3NUaGFuU2lnbktleXdvcmRfMSgpKTsKKyAgICAgICAgICAgICAgICAgICAgICAJCQorICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIDMgOgorICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo0NDA2OjM6IChrdz0gJz4nIGt3PSAnLi4nICkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo0NDA2OjM6IChrdz0gJz4nIGt3PSAnLi4nICkKKyAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NDQwNzo0OiBrdz0gJz4nIGt3PSAnLi4nCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAga3c9KFRva2VuKW1hdGNoKGlucHV0LDk0LEZPTExPV185Myk7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OworICAgICAgICAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKworICAgICAgICAgICAgICAgICAgICAgIAkJCQljdXJyZW50Lm1lcmdlKGt3KTsKKyAgICAgICAgICAgICAgICAgICAgICAJCQkJbmV3TGVhZk5vZGUoa3csIGdyYW1tYXJBY2Nlc3MuZ2V0T3BPdGhlckFjY2VzcygpLmdldEdyZWF0ZXJUaGFuU2lnbktleXdvcmRfMl8wKCkpOworICAgICAgICAgICAgICAgICAgICAgIAkJCQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGt3PShUb2tlbiltYXRjaChpbnB1dCwxMDUsRk9MTE9XXzIpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gY3VycmVudDsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisKKyAgICAgICAgICAgICAgICAgICAgICAJCQkJY3VycmVudC5tZXJnZShrdyk7CisgICAgICAgICAgICAgICAgICAgICAgCQkJCW5ld0xlYWZOb2RlKGt3LCBncmFtbWFyQWNjZXNzLmdldE9wT3RoZXJBY2Nlc3MoKS5nZXRGdWxsU3RvcEZ1bGxTdG9wS2V5d29yZF8yXzEoKSk7CisgICAgICAgICAgICAgICAgICAgICAgCQkJCisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgNCA6CisgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjQ0MTk6Mzoga3c9ICcuLicKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBrdz0oVG9rZW4pbWF0Y2goaW5wdXQsMTA1LEZPTExPV18yKTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7CisgICAgICAgICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworCisgICAgICAgICAgICAgICAgICAgICAgCQkJY3VycmVudC5tZXJnZShrdyk7CisgICAgICAgICAgICAgICAgICAgICAgCQkJbmV3TGVhZk5vZGUoa3csIGdyYW1tYXJBY2Nlc3MuZ2V0T3BPdGhlckFjY2VzcygpLmdldEZ1bGxTdG9wRnVsbFN0b3BLZXl3b3JkXzMoKSk7CisgICAgICAgICAgICAgICAgICAgICAgCQkKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSA1IDoKKyAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NDQyNTozOiBrdz0gJz0+JworICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGt3PShUb2tlbiltYXRjaChpbnB1dCwxMDYsRk9MTE9XXzIpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gY3VycmVudDsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisKKyAgICAgICAgICAgICAgICAgICAgICAJCQljdXJyZW50Lm1lcmdlKGt3KTsKKyAgICAgICAgICAgICAgICAgICAgICAJCQluZXdMZWFmTm9kZShrdywgZ3JhbW1hckFjY2Vzcy5nZXRPcE90aGVyQWNjZXNzKCkuZ2V0RXF1YWxzU2lnbkdyZWF0ZXJUaGFuU2lnbktleXdvcmRfNCgpKTsKKyAgICAgICAgICAgICAgICAgICAgICAJCQorICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIDYgOgorICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo0NDMxOjM6IChrdz0gJz4nICggKCAoICggJz4nICc+JyApICk9PiAoa3c9ICc+JyBrdz0gJz4nICkgKSB8IGt3PSAnPicgKSApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NDQzMTozOiAoa3c9ICc+JyAoICggKCAoICc+JyAnPicgKSApPT4gKGt3PSAnPicga3c9ICc+JyApICkgfCBrdz0gJz4nICkgKQorICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo0NDMyOjQ6IGt3PSAnPicgKCAoICggKCAnPicgJz4nICkgKT0+IChrdz0gJz4nIGt3PSAnPicgKSApIHwga3c9ICc+JyApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAga3c9KFRva2VuKW1hdGNoKGlucHV0LDk0LEZPTExPV185NCk7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OworICAgICAgICAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKworICAgICAgICAgICAgICAgICAgICAgIAkJCQljdXJyZW50Lm1lcmdlKGt3KTsKKyAgICAgICAgICAgICAgICAgICAgICAJCQkJbmV3TGVhZk5vZGUoa3csIGdyYW1tYXJBY2Nlc3MuZ2V0T3BPdGhlckFjY2VzcygpLmdldEdyZWF0ZXJUaGFuU2lnbktleXdvcmRfNV8wKCkpOworICAgICAgICAgICAgICAgICAgICAgIAkJCQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjQ0Mzc6NDogKCAoICggKCAnPicgJz4nICkgKT0+IChrdz0gJz4nIGt3PSAnPicgKSApIHwga3c9ICc+JyApCisgICAgICAgICAgICAgICAgICAgIGludCBhbHQ3Nz0yOworICAgICAgICAgICAgICAgICAgICBpbnQgTEE3N18wID0gaW5wdXQuTEEoMSk7CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKCAoTEE3N18wPT05NCkgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgTEE3N18xID0gaW5wdXQuTEEoMik7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICggKExBNzdfMT09RU9GfHwoTEE3N18xPj1SVUxFX1NUUklORyAmJiBMQTc3XzE8PVJVTEVfREVDSU1BTCl8fExBNzdfMT09MTV8fExBNzdfMT09NTB8fExBNzdfMT09NzJ8fChMQTc3XzE+PTc1ICYmIExBNzdfMTw9NzYpfHxMQTc3XzE9PTgxfHwoTEE3N18xPj04NSAmJiBMQTc3XzE8PTg2KXx8TEE3N18xPT05M3x8KExBNzdfMT49MTA5ICYmIExBNzdfMTw9MTEwKXx8TEE3N18xPT0xMTR8fExBNzdfMT09MTIwfHxMQTc3XzE9PTEyMnx8KExBNzdfMT49MTI2ICYmIExBNzdfMTw9MTI3KXx8KExBNzdfMT49MTMwICYmIExBNzdfMTw9MTM5KXx8TEE3N18xPT0xNDEpICkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsdDc3PTI7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICggKExBNzdfMT09OTQpICYmIChzeW5wcmVkMTRfSW50ZXJuYWxEYXRhRFNMKCkpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWx0Nzc9MTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdGF0ZS5iYWNrdHJhY2tpbmc+MCkge3N0YXRlLmZhaWxlZD10cnVlOyByZXR1cm4gY3VycmVudDt9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTm9WaWFibGVBbHRFeGNlcHRpb24gbnZhZSA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBOb1ZpYWJsZUFsdEV4Y2VwdGlvbigiIiwgNzcsIDEsIGlucHV0KTsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG52YWU7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3RhdGUuYmFja3RyYWNraW5nPjApIHtzdGF0ZS5mYWlsZWQ9dHJ1ZTsgcmV0dXJuIGN1cnJlbnQ7fQorICAgICAgICAgICAgICAgICAgICAgICAgTm9WaWFibGVBbHRFeGNlcHRpb24gbnZhZSA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IE5vVmlhYmxlQWx0RXhjZXB0aW9uKCIiLCA3NywgMCwgaW5wdXQpOworCisgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBudmFlOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoYWx0NzcpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMSA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NDQzODo1OiAoICggKCAnPicgJz4nICkgKT0+IChrdz0gJz4nIGt3PSAnPicgKSApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjQ0Mzg6NTogKCAoICggJz4nICc+JyApICk9PiAoa3c9ICc+JyBrdz0gJz4nICkgKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjQ0Mzk6NjogKCAoICc+JyAnPicgKSApPT4gKGt3PSAnPicga3c9ICc+JyApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjQ0NDQ6NjogKGt3PSAnPicga3c9ICc+JyApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NDQ0NTo3OiBrdz0gJz4nIGt3PSAnPicKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAga3c9KFRva2VuKW1hdGNoKGlucHV0LDk0LEZPTExPV185NCk7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAJCQkJCQkJY3VycmVudC5tZXJnZShrdyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAJCQkJCQkJbmV3TGVhZk5vZGUoa3csIGdyYW1tYXJBY2Nlc3MuZ2V0T3BPdGhlckFjY2VzcygpLmdldEdyZWF0ZXJUaGFuU2lnbktleXdvcmRfNV8xXzBfMF8wKCkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCQkJCQkJCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGt3PShUb2tlbiltYXRjaChpbnB1dCw5NCxGT0xMT1dfMik7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAJCQkJCQkJY3VycmVudC5tZXJnZShrdyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAJCQkJCQkJbmV3TGVhZk5vZGUoa3csIGdyYW1tYXJBY2Nlc3MuZ2V0T3BPdGhlckFjY2VzcygpLmdldEdyZWF0ZXJUaGFuU2lnbktleXdvcmRfNV8xXzBfMF8xKCkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCQkJCQkJCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMiA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NDQ1ODo1OiBrdz0gJz4nCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGt3PShUb2tlbiltYXRjaChpbnB1dCw5NCxGT0xMT1dfMik7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAJCQkJCWN1cnJlbnQubWVyZ2Uoa3cpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCQkJCQluZXdMZWFmTm9kZShrdywgZ3JhbW1hckFjY2Vzcy5nZXRPcE90aGVyQWNjZXNzKCkuZ2V0R3JlYXRlclRoYW5TaWduS2V5d29yZF81XzFfMSgpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAkJCQkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIDcgOgorICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo0NDY2OjM6IChrdz0gJzwnICggKCAoICggJzwnICc8JyApICk9PiAoa3c9ICc8JyBrdz0gJzwnICkgKSB8IGt3PSAnPCcgfCBrdz0gJz0+JyApICkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo0NDY2OjM6IChrdz0gJzwnICggKCAoICggJzwnICc8JyApICk9PiAoa3c9ICc8JyBrdz0gJzwnICkgKSB8IGt3PSAnPCcgfCBrdz0gJz0+JyApICkKKyAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NDQ2Nzo0OiBrdz0gJzwnICggKCAoICggJzwnICc8JyApICk9PiAoa3c9ICc8JyBrdz0gJzwnICkgKSB8IGt3PSAnPCcgfCBrdz0gJz0+JyApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAga3c9KFRva2VuKW1hdGNoKGlucHV0LDkzLEZPTExPV185NSk7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OworICAgICAgICAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKworICAgICAgICAgICAgICAgICAgICAgIAkJCQljdXJyZW50Lm1lcmdlKGt3KTsKKyAgICAgICAgICAgICAgICAgICAgICAJCQkJbmV3TGVhZk5vZGUoa3csIGdyYW1tYXJBY2Nlc3MuZ2V0T3BPdGhlckFjY2VzcygpLmdldExlc3NUaGFuU2lnbktleXdvcmRfNl8wKCkpOworICAgICAgICAgICAgICAgICAgICAgIAkJCQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjQ0NzI6NDogKCAoICggKCAnPCcgJzwnICkgKT0+IChrdz0gJzwnIGt3PSAnPCcgKSApIHwga3c9ICc8JyB8IGt3PSAnPT4nICkKKyAgICAgICAgICAgICAgICAgICAgaW50IGFsdDc4PTM7CisgICAgICAgICAgICAgICAgICAgIGludCBMQTc4XzAgPSBpbnB1dC5MQSgxKTsKKworICAgICAgICAgICAgICAgICAgICBpZiAoIChMQTc4XzA9PTkzKSApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBMQTc4XzEgPSBpbnB1dC5MQSgyKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCAoc3lucHJlZDE1X0ludGVybmFsRGF0YURTTCgpKSApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbHQ3OD0xOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoICh0cnVlKSApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbHQ3OD0yOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN0YXRlLmJhY2t0cmFja2luZz4wKSB7c3RhdGUuZmFpbGVkPXRydWU7IHJldHVybiBjdXJyZW50O30KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBOb1ZpYWJsZUFsdEV4Y2VwdGlvbiBudmFlID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IE5vVmlhYmxlQWx0RXhjZXB0aW9uKCIiLCA3OCwgMSwgaW5wdXQpOworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbnZhZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICggKExBNzhfMD09MTA2KSApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFsdDc4PTM7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3RhdGUuYmFja3RyYWNraW5nPjApIHtzdGF0ZS5mYWlsZWQ9dHJ1ZTsgcmV0dXJuIGN1cnJlbnQ7fQorICAgICAgICAgICAgICAgICAgICAgICAgTm9WaWFibGVBbHRFeGNlcHRpb24gbnZhZSA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IE5vVmlhYmxlQWx0RXhjZXB0aW9uKCIiLCA3OCwgMCwgaW5wdXQpOworCisgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBudmFlOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoYWx0NzgpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMSA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NDQ3Mzo1OiAoICggKCAnPCcgJzwnICkgKT0+IChrdz0gJzwnIGt3PSAnPCcgKSApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjQ0NzM6NTogKCAoICggJzwnICc8JyApICk9PiAoa3c9ICc8JyBrdz0gJzwnICkgKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjQ0NzQ6NjogKCAoICc8JyAnPCcgKSApPT4gKGt3PSAnPCcga3c9ICc8JyApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjQ0Nzk6NjogKGt3PSAnPCcga3c9ICc8JyApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NDQ4MDo3OiBrdz0gJzwnIGt3PSAnPCcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAga3c9KFRva2VuKW1hdGNoKGlucHV0LDkzLEZPTExPV184NCk7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAJCQkJCQkJY3VycmVudC5tZXJnZShrdyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAJCQkJCQkJbmV3TGVhZk5vZGUoa3csIGdyYW1tYXJBY2Nlc3MuZ2V0T3BPdGhlckFjY2VzcygpLmdldExlc3NUaGFuU2lnbktleXdvcmRfNl8xXzBfMF8wKCkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCQkJCQkJCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGt3PShUb2tlbiltYXRjaChpbnB1dCw5MyxGT0xMT1dfMik7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAJCQkJCQkJY3VycmVudC5tZXJnZShrdyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAJCQkJCQkJbmV3TGVhZk5vZGUoa3csIGdyYW1tYXJBY2Nlc3MuZ2V0T3BPdGhlckFjY2VzcygpLmdldExlc3NUaGFuU2lnbktleXdvcmRfNl8xXzBfMF8xKCkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCQkJCQkJCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMiA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NDQ5Mzo1OiBrdz0gJzwnCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGt3PShUb2tlbiltYXRjaChpbnB1dCw5MyxGT0xMT1dfMik7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAJCQkJCWN1cnJlbnQubWVyZ2Uoa3cpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCQkJCQluZXdMZWFmTm9kZShrdywgZ3JhbW1hckFjY2Vzcy5nZXRPcE90aGVyQWNjZXNzKCkuZ2V0TGVzc1RoYW5TaWduS2V5d29yZF82XzFfMSgpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAkJCQkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDMgOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjQ0OTk6NToga3c9ICc9PicKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAga3c9KFRva2VuKW1hdGNoKGlucHV0LDEwNixGT0xMT1dfMik7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAJCQkJCWN1cnJlbnQubWVyZ2Uoa3cpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCQkJCQluZXdMZWFmTm9kZShrdywgZ3JhbW1hckFjY2Vzcy5nZXRPcE90aGVyQWNjZXNzKCkuZ2V0RXF1YWxzU2lnbkdyZWF0ZXJUaGFuU2lnbktleXdvcmRfNl8xXzIoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAJCQkJCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSA4IDoKKyAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NDUwNzozOiBrdz0gJzw+JworICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGt3PShUb2tlbiltYXRjaChpbnB1dCwxMDcsRk9MTE9XXzIpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gY3VycmVudDsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisKKyAgICAgICAgICAgICAgICAgICAgICAJCQljdXJyZW50Lm1lcmdlKGt3KTsKKyAgICAgICAgICAgICAgICAgICAgICAJCQluZXdMZWFmTm9kZShrdywgZ3JhbW1hckFjY2Vzcy5nZXRPcE90aGVyQWNjZXNzKCkuZ2V0TGVzc1RoYW5TaWduR3JlYXRlclRoYW5TaWduS2V5d29yZF83KCkpOworICAgICAgICAgICAgICAgICAgICAgIAkJCisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgOSA6CisgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjQ1MTM6Mzoga3c9ICc/OicKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBrdz0oVG9rZW4pbWF0Y2goaW5wdXQsMTA4LEZPTExPV18yKTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7CisgICAgICAgICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworCisgICAgICAgICAgICAgICAgICAgICAgCQkJY3VycmVudC5tZXJnZShrdyk7CisgICAgICAgICAgICAgICAgICAgICAgCQkJbmV3TGVhZk5vZGUoa3csIGdyYW1tYXJBY2Nlc3MuZ2V0T3BPdGhlckFjY2VzcygpLmdldFF1ZXN0aW9uTWFya0NvbG9uS2V5d29yZF84KCkpOworICAgICAgICAgICAgICAgICAgICAgIAkJCisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKworICAgICAgICAgICAgICAJbGVhdmVSdWxlKCk7CisKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgICAgICBjYXRjaCAoUmVjb2duaXRpb25FeGNlcHRpb24gcmUpIHsKKyAgICAgICAgICAgICAgICByZWNvdmVyKGlucHV0LHJlKTsKKyAgICAgICAgICAgICAgICBhcHBlbmRTa2lwcGVkVG9rZW5zKCk7CisgICAgICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgICAgIHJldHVybiBjdXJyZW50OworICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJydWxlT3BPdGhlciIKKworCisgICAgLy8gJEFOVExSIHN0YXJ0ICJlbnRyeVJ1bGVYQWRkaXRpdmVFeHByZXNzaW9uIgorICAgIC8vIEludGVybmFsRGF0YURTTC5nOjQ1MjI6MTogZW50cnlSdWxlWEFkZGl0aXZlRXhwcmVzc2lvbiByZXR1cm5zIFtFT2JqZWN0IGN1cnJlbnQ9bnVsbF0gOiBpdl9ydWxlWEFkZGl0aXZlRXhwcmVzc2lvbj0gcnVsZVhBZGRpdGl2ZUV4cHJlc3Npb24gRU9GIDsKKyAgICBwdWJsaWMgZmluYWwgRU9iamVjdCBlbnRyeVJ1bGVYQWRkaXRpdmVFeHByZXNzaW9uKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgRU9iamVjdCBjdXJyZW50ID0gbnVsbDsKKworICAgICAgICBFT2JqZWN0IGl2X3J1bGVYQWRkaXRpdmVFeHByZXNzaW9uID0gbnVsbDsKKworCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo0NTIyOjYwOiAoaXZfcnVsZVhBZGRpdGl2ZUV4cHJlc3Npb249IHJ1bGVYQWRkaXRpdmVFeHByZXNzaW9uIEVPRiApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo0NTIzOjI6IGl2X3J1bGVYQWRkaXRpdmVFeHByZXNzaW9uPSBydWxlWEFkZGl0aXZlRXhwcmVzc2lvbiBFT0YKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgbmV3Q29tcG9zaXRlTm9kZShncmFtbWFyQWNjZXNzLmdldFhBZGRpdGl2ZUV4cHJlc3Npb25SdWxlKCkpOyAKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzEpOworICAgICAgICAgICAgaXZfcnVsZVhBZGRpdGl2ZUV4cHJlc3Npb249cnVsZVhBZGRpdGl2ZUV4cHJlc3Npb24oKTsKKworICAgICAgICAgICAgc3RhdGUuX2ZzcC0tOworICAgICAgICAgICAgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7CisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIGN1cnJlbnQgPWl2X3J1bGVYQWRkaXRpdmVFeHByZXNzaW9uOyAKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1hdGNoKGlucHV0LEVPRixGT0xMT1dfMik7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OworCisgICAgICAgICAgICB9CisKKyAgICAgICAgfQorCisgICAgICAgICAgICBjYXRjaCAoUmVjb2duaXRpb25FeGNlcHRpb24gcmUpIHsKKyAgICAgICAgICAgICAgICByZWNvdmVyKGlucHV0LHJlKTsKKyAgICAgICAgICAgICAgICBhcHBlbmRTa2lwcGVkVG9rZW5zKCk7CisgICAgICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgICAgIHJldHVybiBjdXJyZW50OworICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJlbnRyeVJ1bGVYQWRkaXRpdmVFeHByZXNzaW9uIgorCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVYQWRkaXRpdmVFeHByZXNzaW9uIgorICAgIC8vIEludGVybmFsRGF0YURTTC5nOjQ1Mjk6MTogcnVsZVhBZGRpdGl2ZUV4cHJlc3Npb24gcmV0dXJucyBbRU9iamVjdCBjdXJyZW50PW51bGxdIDogKHRoaXNfWE11bHRpcGxpY2F0aXZlRXhwcmVzc2lvbl8wPSBydWxlWE11bHRpcGxpY2F0aXZlRXhwcmVzc2lvbiAoICggKCAoICgpICggKCBydWxlT3BBZGQgKSApICkgKT0+ICggKCkgKCAoIHJ1bGVPcEFkZCApICkgKSApICggKGx2X3JpZ2h0T3BlcmFuZF8zXzA9IHJ1bGVYTXVsdGlwbGljYXRpdmVFeHByZXNzaW9uICkgKSApKiApIDsKKyAgICBwdWJsaWMgZmluYWwgRU9iamVjdCBydWxlWEFkZGl0aXZlRXhwcmVzc2lvbigpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIEVPYmplY3QgY3VycmVudCA9IG51bGw7CisKKyAgICAgICAgRU9iamVjdCB0aGlzX1hNdWx0aXBsaWNhdGl2ZUV4cHJlc3Npb25fMCA9IG51bGw7CisKKyAgICAgICAgRU9iamVjdCBsdl9yaWdodE9wZXJhbmRfM18wID0gbnVsbDsKKworCisKKyAgICAgICAgCWVudGVyUnVsZSgpOworCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo0NTM1OjI6ICggKHRoaXNfWE11bHRpcGxpY2F0aXZlRXhwcmVzc2lvbl8wPSBydWxlWE11bHRpcGxpY2F0aXZlRXhwcmVzc2lvbiAoICggKCAoICgpICggKCBydWxlT3BBZGQgKSApICkgKT0+ICggKCkgKCAoIHJ1bGVPcEFkZCApICkgKSApICggKGx2X3JpZ2h0T3BlcmFuZF8zXzA9IHJ1bGVYTXVsdGlwbGljYXRpdmVFeHByZXNzaW9uICkgKSApKiApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjQ1MzY6MjogKHRoaXNfWE11bHRpcGxpY2F0aXZlRXhwcmVzc2lvbl8wPSBydWxlWE11bHRpcGxpY2F0aXZlRXhwcmVzc2lvbiAoICggKCAoICgpICggKCBydWxlT3BBZGQgKSApICkgKT0+ICggKCkgKCAoIHJ1bGVPcEFkZCApICkgKSApICggKGx2X3JpZ2h0T3BlcmFuZF8zXzA9IHJ1bGVYTXVsdGlwbGljYXRpdmVFeHByZXNzaW9uICkgKSApKiApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo0NTM2OjI6ICh0aGlzX1hNdWx0aXBsaWNhdGl2ZUV4cHJlc3Npb25fMD0gcnVsZVhNdWx0aXBsaWNhdGl2ZUV4cHJlc3Npb24gKCAoICggKCAoKSAoICggcnVsZU9wQWRkICkgKSApICk9PiAoICgpICggKCBydWxlT3BBZGQgKSApICkgKSAoIChsdl9yaWdodE9wZXJhbmRfM18wPSBydWxlWE11bHRpcGxpY2F0aXZlRXhwcmVzc2lvbiApICkgKSogKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NDUzNzozOiB0aGlzX1hNdWx0aXBsaWNhdGl2ZUV4cHJlc3Npb25fMD0gcnVsZVhNdWx0aXBsaWNhdGl2ZUV4cHJlc3Npb24gKCAoICggKCAoKSAoICggcnVsZU9wQWRkICkgKSApICk9PiAoICgpICggKCBydWxlT3BBZGQgKSApICkgKSAoIChsdl9yaWdodE9wZXJhbmRfM18wPSBydWxlWE11bHRpcGxpY2F0aXZlRXhwcmVzc2lvbiApICkgKSoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworCisgICAgICAgICAgICAgIAkJCW5ld0NvbXBvc2l0ZU5vZGUoZ3JhbW1hckFjY2Vzcy5nZXRYQWRkaXRpdmVFeHByZXNzaW9uQWNjZXNzKCkuZ2V0WE11bHRpcGxpY2F0aXZlRXhwcmVzc2lvblBhcnNlclJ1bGVDYWxsXzAoKSk7CisgICAgICAgICAgICAgIAkJCisgICAgICAgICAgICB9CisgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV185Nik7CisgICAgICAgICAgICB0aGlzX1hNdWx0aXBsaWNhdGl2ZUV4cHJlc3Npb25fMD1ydWxlWE11bHRpcGxpY2F0aXZlRXhwcmVzc2lvbigpOworCisgICAgICAgICAgICBzdGF0ZS5fZnNwLS07CisgICAgICAgICAgICBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gY3VycmVudDsKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworCisgICAgICAgICAgICAgIAkJCWN1cnJlbnQgPSB0aGlzX1hNdWx0aXBsaWNhdGl2ZUV4cHJlc3Npb25fMDsKKyAgICAgICAgICAgICAgCQkJYWZ0ZXJQYXJzZXJPckVudW1SdWxlQ2FsbCgpOworICAgICAgICAgICAgICAJCQorICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NDU0NTozOiAoICggKCAoICgpICggKCBydWxlT3BBZGQgKSApICkgKT0+ICggKCkgKCAoIHJ1bGVPcEFkZCApICkgKSApICggKGx2X3JpZ2h0T3BlcmFuZF8zXzA9IHJ1bGVYTXVsdGlwbGljYXRpdmVFeHByZXNzaW9uICkgKSApKgorICAgICAgICAgICAgbG9vcDgwOgorICAgICAgICAgICAgZG8geworICAgICAgICAgICAgICAgIGludCBhbHQ4MD0yOworICAgICAgICAgICAgICAgIGludCBMQTgwXzAgPSBpbnB1dC5MQSgxKTsKKworICAgICAgICAgICAgICAgIGlmICggKExBODBfMD09MTA5KSApIHsKKyAgICAgICAgICAgICAgICAgICAgaW50IExBODBfMiA9IGlucHV0LkxBKDIpOworCisgICAgICAgICAgICAgICAgICAgIGlmICggKHN5bnByZWQxNl9JbnRlcm5hbERhdGFEU0woKSkgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBhbHQ4MD0xOworICAgICAgICAgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIGlmICggKExBODBfMD09MTEwKSApIHsKKyAgICAgICAgICAgICAgICAgICAgaW50IExBODBfMyA9IGlucHV0LkxBKDIpOworCisgICAgICAgICAgICAgICAgICAgIGlmICggKHN5bnByZWQxNl9JbnRlcm5hbERhdGFEU0woKSkgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBhbHQ4MD0xOworICAgICAgICAgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICAgICAgc3dpdGNoIChhbHQ4MCkgeworICAgICAgICAgICAgCWNhc2UgMSA6CisgICAgICAgICAgICAJICAgIC8vIEludGVybmFsRGF0YURTTC5nOjQ1NDY6NDogKCAoICggKCkgKCAoIHJ1bGVPcEFkZCApICkgKSApPT4gKCAoKSAoICggcnVsZU9wQWRkICkgKSApICkgKCAobHZfcmlnaHRPcGVyYW5kXzNfMD0gcnVsZVhNdWx0aXBsaWNhdGl2ZUV4cHJlc3Npb24gKSApCisgICAgICAgICAgICAJICAgIHsKKyAgICAgICAgICAgIAkgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NDU0Njo0OiAoICggKCAoKSAoICggcnVsZU9wQWRkICkgKSApICk9PiAoICgpICggKCBydWxlT3BBZGQgKSApICkgKQorICAgICAgICAgICAgCSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo0NTQ3OjU6ICggKCAoKSAoICggcnVsZU9wQWRkICkgKSApICk9PiAoICgpICggKCBydWxlT3BBZGQgKSApICkKKyAgICAgICAgICAgIAkgICAgeworICAgICAgICAgICAgCSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo0NTU3OjU6ICggKCkgKCAoIHJ1bGVPcEFkZCApICkgKQorICAgICAgICAgICAgCSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo0NTU4OjY6ICgpICggKCBydWxlT3BBZGQgKSApCisgICAgICAgICAgICAJICAgIHsKKyAgICAgICAgICAgIAkgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NDU1ODo2OiAoKQorICAgICAgICAgICAgCSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo0NTU5Ojc6IAorICAgICAgICAgICAgCSAgICB7CisgICAgICAgICAgICAJICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworCisgICAgICAgICAgICAJICAgICAgCQkJCQkJCWN1cnJlbnQgPSBmb3JjZUNyZWF0ZU1vZGVsRWxlbWVudEFuZFNldCgKKyAgICAgICAgICAgIAkgICAgICAJCQkJCQkJCWdyYW1tYXJBY2Nlc3MuZ2V0WEFkZGl0aXZlRXhwcmVzc2lvbkFjY2VzcygpLmdldFhCaW5hcnlPcGVyYXRpb25MZWZ0T3BlcmFuZEFjdGlvbl8xXzBfMF8wKCksCisgICAgICAgICAgICAJICAgICAgCQkJCQkJCQljdXJyZW50KTsKKyAgICAgICAgICAgIAkgICAgICAJCQkJCQkKKyAgICAgICAgICAgIAkgICAgfQorCisgICAgICAgICAgICAJICAgIH0KKworICAgICAgICAgICAgCSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo0NTY1OjY6ICggKCBydWxlT3BBZGQgKSApCisgICAgICAgICAgICAJICAgIC8vIEludGVybmFsRGF0YURTTC5nOjQ1NjY6NzogKCBydWxlT3BBZGQgKQorICAgICAgICAgICAgCSAgICB7CisgICAgICAgICAgICAJICAgIC8vIEludGVybmFsRGF0YURTTC5nOjQ1NjY6NzogKCBydWxlT3BBZGQgKQorICAgICAgICAgICAgCSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo0NTY3Ojg6IHJ1bGVPcEFkZAorICAgICAgICAgICAgCSAgICB7CisgICAgICAgICAgICAJICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworCisgICAgICAgICAgICAJICAgICAgCQkJCQkJCQlpZiAoY3VycmVudD09bnVsbCkgeworICAgICAgICAgICAgCSAgICAgIAkJCQkJCQkJCWN1cnJlbnQgPSBjcmVhdGVNb2RlbEVsZW1lbnQoZ3JhbW1hckFjY2Vzcy5nZXRYQWRkaXRpdmVFeHByZXNzaW9uUnVsZSgpKTsKKyAgICAgICAgICAgIAkgICAgICAJCQkJCQkJCX0KKyAgICAgICAgICAgIAkgICAgICAJCQkJCQkJCisgICAgICAgICAgICAJICAgIH0KKyAgICAgICAgICAgIAkgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisKKyAgICAgICAgICAgIAkgICAgICAJCQkJCQkJCW5ld0NvbXBvc2l0ZU5vZGUoZ3JhbW1hckFjY2Vzcy5nZXRYQWRkaXRpdmVFeHByZXNzaW9uQWNjZXNzKCkuZ2V0RmVhdHVyZUp2bUlkZW50aWZpYWJsZUVsZW1lbnRDcm9zc1JlZmVyZW5jZV8xXzBfMF8xXzAoKSk7CisgICAgICAgICAgICAJICAgICAgCQkJCQkJCQorICAgICAgICAgICAgCSAgICB9CisgICAgICAgICAgICAJICAgIHB1c2hGb2xsb3coRk9MTE9XXzc4KTsKKyAgICAgICAgICAgIAkgICAgcnVsZU9wQWRkKCk7CisKKyAgICAgICAgICAgIAkgICAgc3RhdGUuX2ZzcC0tOworICAgICAgICAgICAgCSAgICBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gY3VycmVudDsKKyAgICAgICAgICAgIAkgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisKKyAgICAgICAgICAgIAkgICAgICAJCQkJCQkJCWFmdGVyUGFyc2VyT3JFbnVtUnVsZUNhbGwoKTsKKyAgICAgICAgICAgIAkgICAgICAJCQkJCQkJCisgICAgICAgICAgICAJICAgIH0KKworICAgICAgICAgICAgCSAgICB9CisKKworICAgICAgICAgICAgCSAgICB9CisKKworICAgICAgICAgICAgCSAgICB9CisKKworICAgICAgICAgICAgCSAgICB9CisKKyAgICAgICAgICAgIAkgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NDU4Mzo0OiAoIChsdl9yaWdodE9wZXJhbmRfM18wPSBydWxlWE11bHRpcGxpY2F0aXZlRXhwcmVzc2lvbiApICkKKyAgICAgICAgICAgIAkgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NDU4NDo1OiAobHZfcmlnaHRPcGVyYW5kXzNfMD0gcnVsZVhNdWx0aXBsaWNhdGl2ZUV4cHJlc3Npb24gKQorICAgICAgICAgICAgCSAgICB7CisgICAgICAgICAgICAJICAgIC8vIEludGVybmFsRGF0YURTTC5nOjQ1ODQ6NTogKGx2X3JpZ2h0T3BlcmFuZF8zXzA9IHJ1bGVYTXVsdGlwbGljYXRpdmVFeHByZXNzaW9uICkKKyAgICAgICAgICAgIAkgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NDU4NTo2OiBsdl9yaWdodE9wZXJhbmRfM18wPSBydWxlWE11bHRpcGxpY2F0aXZlRXhwcmVzc2lvbgorICAgICAgICAgICAgCSAgICB7CisgICAgICAgICAgICAJICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworCisgICAgICAgICAgICAJICAgICAgCQkJCQkJbmV3Q29tcG9zaXRlTm9kZShncmFtbWFyQWNjZXNzLmdldFhBZGRpdGl2ZUV4cHJlc3Npb25BY2Nlc3MoKS5nZXRSaWdodE9wZXJhbmRYTXVsdGlwbGljYXRpdmVFeHByZXNzaW9uUGFyc2VyUnVsZUNhbGxfMV8xXzAoKSk7CisgICAgICAgICAgICAJICAgICAgCQkJCQkKKyAgICAgICAgICAgIAkgICAgfQorICAgICAgICAgICAgCSAgICBwdXNoRm9sbG93KEZPTExPV185Nik7CisgICAgICAgICAgICAJICAgIGx2X3JpZ2h0T3BlcmFuZF8zXzA9cnVsZVhNdWx0aXBsaWNhdGl2ZUV4cHJlc3Npb24oKTsKKworICAgICAgICAgICAgCSAgICBzdGF0ZS5fZnNwLS07CisgICAgICAgICAgICAJICAgIGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OworICAgICAgICAgICAgCSAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKworICAgICAgICAgICAgCSAgICAgIAkJCQkJCWlmIChjdXJyZW50PT1udWxsKSB7CisgICAgICAgICAgICAJICAgICAgCQkJCQkJCWN1cnJlbnQgPSBjcmVhdGVNb2RlbEVsZW1lbnRGb3JQYXJlbnQoZ3JhbW1hckFjY2Vzcy5nZXRYQWRkaXRpdmVFeHByZXNzaW9uUnVsZSgpKTsKKyAgICAgICAgICAgIAkgICAgICAJCQkJCQl9CisgICAgICAgICAgICAJICAgICAgCQkJCQkJc2V0KAorICAgICAgICAgICAgCSAgICAgIAkJCQkJCQljdXJyZW50LAorICAgICAgICAgICAgCSAgICAgIAkJCQkJCQkicmlnaHRPcGVyYW5kIiwKKyAgICAgICAgICAgIAkgICAgICAJCQkJCQkJbHZfcmlnaHRPcGVyYW5kXzNfMCwKKyAgICAgICAgICAgIAkgICAgICAJCQkJCQkJIm9yZy5lY2xpcHNlLnh0ZXh0LnhiYXNlLlhiYXNlLlhNdWx0aXBsaWNhdGl2ZUV4cHJlc3Npb24iKTsKKyAgICAgICAgICAgIAkgICAgICAJCQkJCQlhZnRlclBhcnNlck9yRW51bVJ1bGVDYWxsKCk7CisgICAgICAgICAgICAJICAgICAgCQkJCQkKKyAgICAgICAgICAgIAkgICAgfQorCisgICAgICAgICAgICAJICAgIH0KKworCisgICAgICAgICAgICAJICAgIH0KKworCisgICAgICAgICAgICAJICAgIH0KKyAgICAgICAgICAgIAkgICAgYnJlYWs7CisKKyAgICAgICAgICAgIAlkZWZhdWx0IDoKKyAgICAgICAgICAgIAkgICAgYnJlYWsgbG9vcDgwOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gd2hpbGUgKHRydWUpOworCisKKyAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworCisgICAgICAgICAgICAgIAlsZWF2ZVJ1bGUoKTsKKworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgICAgIGNhdGNoIChSZWNvZ25pdGlvbkV4Y2VwdGlvbiByZSkgeworICAgICAgICAgICAgICAgIHJlY292ZXIoaW5wdXQscmUpOworICAgICAgICAgICAgICAgIGFwcGVuZFNraXBwZWRUb2tlbnMoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGN1cnJlbnQ7CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgInJ1bGVYQWRkaXRpdmVFeHByZXNzaW9uIgorCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgImVudHJ5UnVsZU9wQWRkIgorICAgIC8vIEludGVybmFsRGF0YURTTC5nOjQ2MDc6MTogZW50cnlSdWxlT3BBZGQgcmV0dXJucyBbU3RyaW5nIGN1cnJlbnQ9bnVsbF0gOiBpdl9ydWxlT3BBZGQ9IHJ1bGVPcEFkZCBFT0YgOworICAgIHB1YmxpYyBmaW5hbCBTdHJpbmcgZW50cnlSdWxlT3BBZGQoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICBTdHJpbmcgY3VycmVudCA9IG51bGw7CisKKyAgICAgICAgQW50bHJEYXRhdHlwZVJ1bGVUb2tlbiBpdl9ydWxlT3BBZGQgPSBudWxsOworCisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjQ2MDc6NDU6IChpdl9ydWxlT3BBZGQ9IHJ1bGVPcEFkZCBFT0YgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NDYwODoyOiBpdl9ydWxlT3BBZGQ9IHJ1bGVPcEFkZCBFT0YKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgbmV3Q29tcG9zaXRlTm9kZShncmFtbWFyQWNjZXNzLmdldE9wQWRkUnVsZSgpKTsgCisgICAgICAgICAgICB9CisgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV18xKTsKKyAgICAgICAgICAgIGl2X3J1bGVPcEFkZD1ydWxlT3BBZGQoKTsKKworICAgICAgICAgICAgc3RhdGUuX2ZzcC0tOworICAgICAgICAgICAgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7CisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIGN1cnJlbnQgPWl2X3J1bGVPcEFkZC5nZXRUZXh0KCk7IAorICAgICAgICAgICAgfQorICAgICAgICAgICAgbWF0Y2goaW5wdXQsRU9GLEZPTExPV18yKTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7CisKKyAgICAgICAgICAgIH0KKworICAgICAgICB9CisKKyAgICAgICAgICAgIGNhdGNoIChSZWNvZ25pdGlvbkV4Y2VwdGlvbiByZSkgeworICAgICAgICAgICAgICAgIHJlY292ZXIoaW5wdXQscmUpOworICAgICAgICAgICAgICAgIGFwcGVuZFNraXBwZWRUb2tlbnMoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGN1cnJlbnQ7CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgImVudHJ5UnVsZU9wQWRkIgorCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVPcEFkZCIKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo0NjE0OjE6IHJ1bGVPcEFkZCByZXR1cm5zIFtBbnRsckRhdGF0eXBlUnVsZVRva2VuIGN1cnJlbnQ9bmV3IEFudGxyRGF0YXR5cGVSdWxlVG9rZW4oKV0gOiAoa3c9ICcrJyB8IGt3PSAnLScgKSA7CisgICAgcHVibGljIGZpbmFsIEFudGxyRGF0YXR5cGVSdWxlVG9rZW4gcnVsZU9wQWRkKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgQW50bHJEYXRhdHlwZVJ1bGVUb2tlbiBjdXJyZW50ID0gbmV3IEFudGxyRGF0YXR5cGVSdWxlVG9rZW4oKTsKKworICAgICAgICBUb2tlbiBrdz1udWxsOworCisKKyAgICAgICAgCWVudGVyUnVsZSgpOworCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo0NjIwOjI6ICggKGt3PSAnKycgfCBrdz0gJy0nICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NDYyMToyOiAoa3c9ICcrJyB8IGt3PSAnLScgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NDYyMToyOiAoa3c9ICcrJyB8IGt3PSAnLScgKQorICAgICAgICAgICAgaW50IGFsdDgxPTI7CisgICAgICAgICAgICBpbnQgTEE4MV8wID0gaW5wdXQuTEEoMSk7CisKKyAgICAgICAgICAgIGlmICggKExBODFfMD09MTA5KSApIHsKKyAgICAgICAgICAgICAgICBhbHQ4MT0xOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiAoIChMQTgxXzA9PTExMCkgKSB7CisgICAgICAgICAgICAgICAgYWx0ODE9MjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgIGlmIChzdGF0ZS5iYWNrdHJhY2tpbmc+MCkge3N0YXRlLmZhaWxlZD10cnVlOyByZXR1cm4gY3VycmVudDt9CisgICAgICAgICAgICAgICAgTm9WaWFibGVBbHRFeGNlcHRpb24gbnZhZSA9CisgICAgICAgICAgICAgICAgICAgIG5ldyBOb1ZpYWJsZUFsdEV4Y2VwdGlvbigiIiwgODEsIDAsIGlucHV0KTsKKworICAgICAgICAgICAgICAgIHRocm93IG52YWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzd2l0Y2ggKGFsdDgxKSB7CisgICAgICAgICAgICAgICAgY2FzZSAxIDoKKyAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NDYyMjozOiBrdz0gJysnCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAga3c9KFRva2VuKW1hdGNoKGlucHV0LDEwOSxGT0xMT1dfMik7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OworICAgICAgICAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKworICAgICAgICAgICAgICAgICAgICAgIAkJCWN1cnJlbnQubWVyZ2Uoa3cpOworICAgICAgICAgICAgICAgICAgICAgIAkJCW5ld0xlYWZOb2RlKGt3LCBncmFtbWFyQWNjZXNzLmdldE9wQWRkQWNjZXNzKCkuZ2V0UGx1c1NpZ25LZXl3b3JkXzAoKSk7CisgICAgICAgICAgICAgICAgICAgICAgCQkKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSAyIDoKKyAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NDYyODozOiBrdz0gJy0nCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAga3c9KFRva2VuKW1hdGNoKGlucHV0LDExMCxGT0xMT1dfMik7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OworICAgICAgICAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKworICAgICAgICAgICAgICAgICAgICAgIAkJCWN1cnJlbnQubWVyZ2Uoa3cpOworICAgICAgICAgICAgICAgICAgICAgIAkJCW5ld0xlYWZOb2RlKGt3LCBncmFtbWFyQWNjZXNzLmdldE9wQWRkQWNjZXNzKCkuZ2V0SHlwaGVuTWludXNLZXl3b3JkXzEoKSk7CisgICAgICAgICAgICAgICAgICAgICAgCQkKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworCisgICAgICAgICAgICAgIAlsZWF2ZVJ1bGUoKTsKKworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgICAgIGNhdGNoIChSZWNvZ25pdGlvbkV4Y2VwdGlvbiByZSkgeworICAgICAgICAgICAgICAgIHJlY292ZXIoaW5wdXQscmUpOworICAgICAgICAgICAgICAgIGFwcGVuZFNraXBwZWRUb2tlbnMoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGN1cnJlbnQ7CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgInJ1bGVPcEFkZCIKKworCisgICAgLy8gJEFOVExSIHN0YXJ0ICJlbnRyeVJ1bGVYTXVsdGlwbGljYXRpdmVFeHByZXNzaW9uIgorICAgIC8vIEludGVybmFsRGF0YURTTC5nOjQ2Mzc6MTogZW50cnlSdWxlWE11bHRpcGxpY2F0aXZlRXhwcmVzc2lvbiByZXR1cm5zIFtFT2JqZWN0IGN1cnJlbnQ9bnVsbF0gOiBpdl9ydWxlWE11bHRpcGxpY2F0aXZlRXhwcmVzc2lvbj0gcnVsZVhNdWx0aXBsaWNhdGl2ZUV4cHJlc3Npb24gRU9GIDsKKyAgICBwdWJsaWMgZmluYWwgRU9iamVjdCBlbnRyeVJ1bGVYTXVsdGlwbGljYXRpdmVFeHByZXNzaW9uKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgRU9iamVjdCBjdXJyZW50ID0gbnVsbDsKKworICAgICAgICBFT2JqZWN0IGl2X3J1bGVYTXVsdGlwbGljYXRpdmVFeHByZXNzaW9uID0gbnVsbDsKKworCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo0NjM3OjY2OiAoaXZfcnVsZVhNdWx0aXBsaWNhdGl2ZUV4cHJlc3Npb249IHJ1bGVYTXVsdGlwbGljYXRpdmVFeHByZXNzaW9uIEVPRiApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo0NjM4OjI6IGl2X3J1bGVYTXVsdGlwbGljYXRpdmVFeHByZXNzaW9uPSBydWxlWE11bHRpcGxpY2F0aXZlRXhwcmVzc2lvbiBFT0YKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgbmV3Q29tcG9zaXRlTm9kZShncmFtbWFyQWNjZXNzLmdldFhNdWx0aXBsaWNhdGl2ZUV4cHJlc3Npb25SdWxlKCkpOyAKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzEpOworICAgICAgICAgICAgaXZfcnVsZVhNdWx0aXBsaWNhdGl2ZUV4cHJlc3Npb249cnVsZVhNdWx0aXBsaWNhdGl2ZUV4cHJlc3Npb24oKTsKKworICAgICAgICAgICAgc3RhdGUuX2ZzcC0tOworICAgICAgICAgICAgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7CisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIGN1cnJlbnQgPWl2X3J1bGVYTXVsdGlwbGljYXRpdmVFeHByZXNzaW9uOyAKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1hdGNoKGlucHV0LEVPRixGT0xMT1dfMik7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OworCisgICAgICAgICAgICB9CisKKyAgICAgICAgfQorCisgICAgICAgICAgICBjYXRjaCAoUmVjb2duaXRpb25FeGNlcHRpb24gcmUpIHsKKyAgICAgICAgICAgICAgICByZWNvdmVyKGlucHV0LHJlKTsKKyAgICAgICAgICAgICAgICBhcHBlbmRTa2lwcGVkVG9rZW5zKCk7CisgICAgICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgICAgIHJldHVybiBjdXJyZW50OworICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJlbnRyeVJ1bGVYTXVsdGlwbGljYXRpdmVFeHByZXNzaW9uIgorCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVYTXVsdGlwbGljYXRpdmVFeHByZXNzaW9uIgorICAgIC8vIEludGVybmFsRGF0YURTTC5nOjQ2NDQ6MTogcnVsZVhNdWx0aXBsaWNhdGl2ZUV4cHJlc3Npb24gcmV0dXJucyBbRU9iamVjdCBjdXJyZW50PW51bGxdIDogKHRoaXNfWFVuYXJ5T3BlcmF0aW9uXzA9IHJ1bGVYVW5hcnlPcGVyYXRpb24gKCAoICggKCAoKSAoICggcnVsZU9wTXVsdGkgKSApICkgKT0+ICggKCkgKCAoIHJ1bGVPcE11bHRpICkgKSApICkgKCAobHZfcmlnaHRPcGVyYW5kXzNfMD0gcnVsZVhVbmFyeU9wZXJhdGlvbiApICkgKSogKSA7CisgICAgcHVibGljIGZpbmFsIEVPYmplY3QgcnVsZVhNdWx0aXBsaWNhdGl2ZUV4cHJlc3Npb24oKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICBFT2JqZWN0IGN1cnJlbnQgPSBudWxsOworCisgICAgICAgIEVPYmplY3QgdGhpc19YVW5hcnlPcGVyYXRpb25fMCA9IG51bGw7CisKKyAgICAgICAgRU9iamVjdCBsdl9yaWdodE9wZXJhbmRfM18wID0gbnVsbDsKKworCisKKyAgICAgICAgCWVudGVyUnVsZSgpOworCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo0NjUwOjI6ICggKHRoaXNfWFVuYXJ5T3BlcmF0aW9uXzA9IHJ1bGVYVW5hcnlPcGVyYXRpb24gKCAoICggKCAoKSAoICggcnVsZU9wTXVsdGkgKSApICkgKT0+ICggKCkgKCAoIHJ1bGVPcE11bHRpICkgKSApICkgKCAobHZfcmlnaHRPcGVyYW5kXzNfMD0gcnVsZVhVbmFyeU9wZXJhdGlvbiApICkgKSogKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo0NjUxOjI6ICh0aGlzX1hVbmFyeU9wZXJhdGlvbl8wPSBydWxlWFVuYXJ5T3BlcmF0aW9uICggKCAoICggKCkgKCAoIHJ1bGVPcE11bHRpICkgKSApICk9PiAoICgpICggKCBydWxlT3BNdWx0aSApICkgKSApICggKGx2X3JpZ2h0T3BlcmFuZF8zXzA9IHJ1bGVYVW5hcnlPcGVyYXRpb24gKSApICkqICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjQ2NTE6MjogKHRoaXNfWFVuYXJ5T3BlcmF0aW9uXzA9IHJ1bGVYVW5hcnlPcGVyYXRpb24gKCAoICggKCAoKSAoICggcnVsZU9wTXVsdGkgKSApICkgKT0+ICggKCkgKCAoIHJ1bGVPcE11bHRpICkgKSApICkgKCAobHZfcmlnaHRPcGVyYW5kXzNfMD0gcnVsZVhVbmFyeU9wZXJhdGlvbiApICkgKSogKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NDY1MjozOiB0aGlzX1hVbmFyeU9wZXJhdGlvbl8wPSBydWxlWFVuYXJ5T3BlcmF0aW9uICggKCAoICggKCkgKCAoIHJ1bGVPcE11bHRpICkgKSApICk9PiAoICgpICggKCBydWxlT3BNdWx0aSApICkgKSApICggKGx2X3JpZ2h0T3BlcmFuZF8zXzA9IHJ1bGVYVW5hcnlPcGVyYXRpb24gKSApICkqCisgICAgICAgICAgICB7CisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKworICAgICAgICAgICAgICAJCQluZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0WE11bHRpcGxpY2F0aXZlRXhwcmVzc2lvbkFjY2VzcygpLmdldFhVbmFyeU9wZXJhdGlvblBhcnNlclJ1bGVDYWxsXzAoKSk7CisgICAgICAgICAgICAgIAkJCisgICAgICAgICAgICB9CisgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV185Nyk7CisgICAgICAgICAgICB0aGlzX1hVbmFyeU9wZXJhdGlvbl8wPXJ1bGVYVW5hcnlPcGVyYXRpb24oKTsKKworICAgICAgICAgICAgc3RhdGUuX2ZzcC0tOworICAgICAgICAgICAgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7CisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKworICAgICAgICAgICAgICAJCQljdXJyZW50ID0gdGhpc19YVW5hcnlPcGVyYXRpb25fMDsKKyAgICAgICAgICAgICAgCQkJYWZ0ZXJQYXJzZXJPckVudW1SdWxlQ2FsbCgpOworICAgICAgICAgICAgICAJCQorICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NDY2MDozOiAoICggKCAoICgpICggKCBydWxlT3BNdWx0aSApICkgKSApPT4gKCAoKSAoICggcnVsZU9wTXVsdGkgKSApICkgKSAoIChsdl9yaWdodE9wZXJhbmRfM18wPSBydWxlWFVuYXJ5T3BlcmF0aW9uICkgKSApKgorICAgICAgICAgICAgbG9vcDgyOgorICAgICAgICAgICAgZG8geworICAgICAgICAgICAgICAgIGludCBhbHQ4Mj0yOworICAgICAgICAgICAgICAgIHN3aXRjaCAoIGlucHV0LkxBKDEpICkgeworICAgICAgICAgICAgICAgIGNhc2UgNzc6CisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaW50IExBODJfMiA9IGlucHV0LkxBKDIpOworCisgICAgICAgICAgICAgICAgICAgIGlmICggKHN5bnByZWQxN19JbnRlcm5hbERhdGFEU0woKSkgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBhbHQ4Mj0xOworICAgICAgICAgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgMTExOgorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGludCBMQTgyXzMgPSBpbnB1dC5MQSgyKTsKKworICAgICAgICAgICAgICAgICAgICBpZiAoIChzeW5wcmVkMTdfSW50ZXJuYWxEYXRhRFNMKCkpICkgeworICAgICAgICAgICAgICAgICAgICAgICAgYWx0ODI9MTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIDExMjoKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpbnQgTEE4Ml80ID0gaW5wdXQuTEEoMik7CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKCAoc3lucHJlZDE3X0ludGVybmFsRGF0YURTTCgpKSApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFsdDgyPTE7CisgICAgICAgICAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSAxMTM6CisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaW50IExBODJfNSA9IGlucHV0LkxBKDIpOworCisgICAgICAgICAgICAgICAgICAgIGlmICggKHN5bnByZWQxN19JbnRlcm5hbERhdGFEU0woKSkgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBhbHQ4Mj0xOworICAgICAgICAgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgc3dpdGNoIChhbHQ4MikgeworICAgICAgICAgICAgCWNhc2UgMSA6CisgICAgICAgICAgICAJICAgIC8vIEludGVybmFsRGF0YURTTC5nOjQ2NjE6NDogKCAoICggKCkgKCAoIHJ1bGVPcE11bHRpICkgKSApICk9PiAoICgpICggKCBydWxlT3BNdWx0aSApICkgKSApICggKGx2X3JpZ2h0T3BlcmFuZF8zXzA9IHJ1bGVYVW5hcnlPcGVyYXRpb24gKSApCisgICAgICAgICAgICAJICAgIHsKKyAgICAgICAgICAgIAkgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NDY2MTo0OiAoICggKCAoKSAoICggcnVsZU9wTXVsdGkgKSApICkgKT0+ICggKCkgKCAoIHJ1bGVPcE11bHRpICkgKSApICkKKyAgICAgICAgICAgIAkgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NDY2Mjo1OiAoICggKCkgKCAoIHJ1bGVPcE11bHRpICkgKSApICk9PiAoICgpICggKCBydWxlT3BNdWx0aSApICkgKQorICAgICAgICAgICAgCSAgICB7CisgICAgICAgICAgICAJICAgIC8vIEludGVybmFsRGF0YURTTC5nOjQ2NzI6NTogKCAoKSAoICggcnVsZU9wTXVsdGkgKSApICkKKyAgICAgICAgICAgIAkgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NDY3Mzo2OiAoKSAoICggcnVsZU9wTXVsdGkgKSApCisgICAgICAgICAgICAJICAgIHsKKyAgICAgICAgICAgIAkgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NDY3Mzo2OiAoKQorICAgICAgICAgICAgCSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo0Njc0Ojc6IAorICAgICAgICAgICAgCSAgICB7CisgICAgICAgICAgICAJICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworCisgICAgICAgICAgICAJICAgICAgCQkJCQkJCWN1cnJlbnQgPSBmb3JjZUNyZWF0ZU1vZGVsRWxlbWVudEFuZFNldCgKKyAgICAgICAgICAgIAkgICAgICAJCQkJCQkJCWdyYW1tYXJBY2Nlc3MuZ2V0WE11bHRpcGxpY2F0aXZlRXhwcmVzc2lvbkFjY2VzcygpLmdldFhCaW5hcnlPcGVyYXRpb25MZWZ0T3BlcmFuZEFjdGlvbl8xXzBfMF8wKCksCisgICAgICAgICAgICAJICAgICAgCQkJCQkJCQljdXJyZW50KTsKKyAgICAgICAgICAgIAkgICAgICAJCQkJCQkKKyAgICAgICAgICAgIAkgICAgfQorCisgICAgICAgICAgICAJICAgIH0KKworICAgICAgICAgICAgCSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo0NjgwOjY6ICggKCBydWxlT3BNdWx0aSApICkKKyAgICAgICAgICAgIAkgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NDY4MTo3OiAoIHJ1bGVPcE11bHRpICkKKyAgICAgICAgICAgIAkgICAgeworICAgICAgICAgICAgCSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo0NjgxOjc6ICggcnVsZU9wTXVsdGkgKQorICAgICAgICAgICAgCSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo0NjgyOjg6IHJ1bGVPcE11bHRpCisgICAgICAgICAgICAJICAgIHsKKyAgICAgICAgICAgIAkgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisKKyAgICAgICAgICAgIAkgICAgICAJCQkJCQkJCWlmIChjdXJyZW50PT1udWxsKSB7CisgICAgICAgICAgICAJICAgICAgCQkJCQkJCQkJY3VycmVudCA9IGNyZWF0ZU1vZGVsRWxlbWVudChncmFtbWFyQWNjZXNzLmdldFhNdWx0aXBsaWNhdGl2ZUV4cHJlc3Npb25SdWxlKCkpOworICAgICAgICAgICAgCSAgICAgIAkJCQkJCQkJfQorICAgICAgICAgICAgCSAgICAgIAkJCQkJCQkKKyAgICAgICAgICAgIAkgICAgfQorICAgICAgICAgICAgCSAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKworICAgICAgICAgICAgCSAgICAgIAkJCQkJCQkJbmV3Q29tcG9zaXRlTm9kZShncmFtbWFyQWNjZXNzLmdldFhNdWx0aXBsaWNhdGl2ZUV4cHJlc3Npb25BY2Nlc3MoKS5nZXRGZWF0dXJlSnZtSWRlbnRpZmlhYmxlRWxlbWVudENyb3NzUmVmZXJlbmNlXzFfMF8wXzFfMCgpKTsKKyAgICAgICAgICAgIAkgICAgICAJCQkJCQkJCisgICAgICAgICAgICAJICAgIH0KKyAgICAgICAgICAgIAkgICAgcHVzaEZvbGxvdyhGT0xMT1dfNzgpOworICAgICAgICAgICAgCSAgICBydWxlT3BNdWx0aSgpOworCisgICAgICAgICAgICAJICAgIHN0YXRlLl9mc3AtLTsKKyAgICAgICAgICAgIAkgICAgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7CisgICAgICAgICAgICAJICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworCisgICAgICAgICAgICAJICAgICAgCQkJCQkJCQlhZnRlclBhcnNlck9yRW51bVJ1bGVDYWxsKCk7CisgICAgICAgICAgICAJICAgICAgCQkJCQkJCQorICAgICAgICAgICAgCSAgICB9CisKKyAgICAgICAgICAgIAkgICAgfQorCisKKyAgICAgICAgICAgIAkgICAgfQorCisKKyAgICAgICAgICAgIAkgICAgfQorCisKKyAgICAgICAgICAgIAkgICAgfQorCisgICAgICAgICAgICAJICAgIC8vIEludGVybmFsRGF0YURTTC5nOjQ2OTg6NDogKCAobHZfcmlnaHRPcGVyYW5kXzNfMD0gcnVsZVhVbmFyeU9wZXJhdGlvbiApICkKKyAgICAgICAgICAgIAkgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NDY5OTo1OiAobHZfcmlnaHRPcGVyYW5kXzNfMD0gcnVsZVhVbmFyeU9wZXJhdGlvbiApCisgICAgICAgICAgICAJICAgIHsKKyAgICAgICAgICAgIAkgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NDY5OTo1OiAobHZfcmlnaHRPcGVyYW5kXzNfMD0gcnVsZVhVbmFyeU9wZXJhdGlvbiApCisgICAgICAgICAgICAJICAgIC8vIEludGVybmFsRGF0YURTTC5nOjQ3MDA6NjogbHZfcmlnaHRPcGVyYW5kXzNfMD0gcnVsZVhVbmFyeU9wZXJhdGlvbgorICAgICAgICAgICAgCSAgICB7CisgICAgICAgICAgICAJICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworCisgICAgICAgICAgICAJICAgICAgCQkJCQkJbmV3Q29tcG9zaXRlTm9kZShncmFtbWFyQWNjZXNzLmdldFhNdWx0aXBsaWNhdGl2ZUV4cHJlc3Npb25BY2Nlc3MoKS5nZXRSaWdodE9wZXJhbmRYVW5hcnlPcGVyYXRpb25QYXJzZXJSdWxlQ2FsbF8xXzFfMCgpKTsKKyAgICAgICAgICAgIAkgICAgICAJCQkJCQorICAgICAgICAgICAgCSAgICB9CisgICAgICAgICAgICAJICAgIHB1c2hGb2xsb3coRk9MTE9XXzk3KTsKKyAgICAgICAgICAgIAkgICAgbHZfcmlnaHRPcGVyYW5kXzNfMD1ydWxlWFVuYXJ5T3BlcmF0aW9uKCk7CisKKyAgICAgICAgICAgIAkgICAgc3RhdGUuX2ZzcC0tOworICAgICAgICAgICAgCSAgICBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gY3VycmVudDsKKyAgICAgICAgICAgIAkgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisKKyAgICAgICAgICAgIAkgICAgICAJCQkJCQlpZiAoY3VycmVudD09bnVsbCkgeworICAgICAgICAgICAgCSAgICAgIAkJCQkJCQljdXJyZW50ID0gY3JlYXRlTW9kZWxFbGVtZW50Rm9yUGFyZW50KGdyYW1tYXJBY2Nlc3MuZ2V0WE11bHRpcGxpY2F0aXZlRXhwcmVzc2lvblJ1bGUoKSk7CisgICAgICAgICAgICAJICAgICAgCQkJCQkJfQorICAgICAgICAgICAgCSAgICAgIAkJCQkJCXNldCgKKyAgICAgICAgICAgIAkgICAgICAJCQkJCQkJY3VycmVudCwKKyAgICAgICAgICAgIAkgICAgICAJCQkJCQkJInJpZ2h0T3BlcmFuZCIsCisgICAgICAgICAgICAJICAgICAgCQkJCQkJCWx2X3JpZ2h0T3BlcmFuZF8zXzAsCisgICAgICAgICAgICAJICAgICAgCQkJCQkJCSJvcmcuZWNsaXBzZS54dGV4dC54YmFzZS5YYmFzZS5YVW5hcnlPcGVyYXRpb24iKTsKKyAgICAgICAgICAgIAkgICAgICAJCQkJCQlhZnRlclBhcnNlck9yRW51bVJ1bGVDYWxsKCk7CisgICAgICAgICAgICAJICAgICAgCQkJCQkKKyAgICAgICAgICAgIAkgICAgfQorCisgICAgICAgICAgICAJICAgIH0KKworCisgICAgICAgICAgICAJICAgIH0KKworCisgICAgICAgICAgICAJICAgIH0KKyAgICAgICAgICAgIAkgICAgYnJlYWs7CisKKyAgICAgICAgICAgIAlkZWZhdWx0IDoKKyAgICAgICAgICAgIAkgICAgYnJlYWsgbG9vcDgyOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gd2hpbGUgKHRydWUpOworCisKKyAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworCisgICAgICAgICAgICAgIAlsZWF2ZVJ1bGUoKTsKKworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgICAgIGNhdGNoIChSZWNvZ25pdGlvbkV4Y2VwdGlvbiByZSkgeworICAgICAgICAgICAgICAgIHJlY292ZXIoaW5wdXQscmUpOworICAgICAgICAgICAgICAgIGFwcGVuZFNraXBwZWRUb2tlbnMoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGN1cnJlbnQ7CisgICAgfQogICAgIC8vICRBTlRMUiBlbmQgInJ1bGVYTXVsdGlwbGljYXRpdmVFeHByZXNzaW9uIgogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgImVudHJ5UnVsZU9wTXVsdGkiCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NDI4MzoxOiBlbnRyeVJ1bGVPcE11bHRpIHJldHVybnMgW1N0cmluZyBjdXJyZW50PW51bGxdIDogaXZfcnVsZU9wTXVsdGk9IHJ1bGVPcE11bHRpIEVPRiA7CisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NDcyMjoxOiBlbnRyeVJ1bGVPcE11bHRpIHJldHVybnMgW1N0cmluZyBjdXJyZW50PW51bGxdIDogaXZfcnVsZU9wTXVsdGk9IHJ1bGVPcE11bHRpIEVPRiA7CiAgICAgcHVibGljIGZpbmFsIFN0cmluZyBlbnRyeVJ1bGVPcE11bHRpKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKICAgICAgICAgU3RyaW5nIGN1cnJlbnQgPSBudWxsOwogCkBAIC0xMTg5MSw4ICsxMzA4NSw4IEBACiAKIAogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NDI4Mzo0NzogKGl2X3J1bGVPcE11bHRpPSBydWxlT3BNdWx0aSBFT0YgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NDI4NDoyOiBpdl9ydWxlT3BNdWx0aT0gcnVsZU9wTXVsdGkgRU9GCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo0NzIyOjQ3OiAoaXZfcnVsZU9wTXVsdGk9IHJ1bGVPcE11bHRpIEVPRiApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo0NzIzOjI6IGl2X3J1bGVPcE11bHRpPSBydWxlT3BNdWx0aSBFT0YKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgbmV3Q29tcG9zaXRlTm9kZShncmFtbWFyQWNjZXNzLmdldE9wTXVsdGlSdWxlKCkpOyAKQEAgLTExOTIzLDcgKzEzMTE3LDcgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlT3BNdWx0aSIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo0MjkwOjE6IHJ1bGVPcE11bHRpIHJldHVybnMgW0FudGxyRGF0YXR5cGVSdWxlVG9rZW4gY3VycmVudD1uZXcgQW50bHJEYXRhdHlwZVJ1bGVUb2tlbigpXSA6IChrdz0gJyonIHwga3c9ICcqKicgfCBrdz0gJy8nIHwga3c9ICclJyApIDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo0NzI5OjE6IHJ1bGVPcE11bHRpIHJldHVybnMgW0FudGxyRGF0YXR5cGVSdWxlVG9rZW4gY3VycmVudD1uZXcgQW50bHJEYXRhdHlwZVJ1bGVUb2tlbigpXSA6IChrdz0gJyonIHwga3c9ICcqKicgfCBrdz0gJy8nIHwga3c9ICclJyApIDsKICAgICBwdWJsaWMgZmluYWwgQW50bHJEYXRhdHlwZVJ1bGVUb2tlbiBydWxlT3BNdWx0aSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAgICAgICAgIEFudGxyRGF0YXR5cGVSdWxlVG9rZW4gY3VycmVudCA9IG5ldyBBbnRsckRhdGF0eXBlUnVsZVRva2VuKCk7CiAKQEAgLTExOTMzLDQ1ICsxMzEyNyw0NSBAQAogICAgICAgICAJZW50ZXJSdWxlKCk7CiAKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjQyOTY6MjogKCAoa3c9ICcqJyB8IGt3PSAnKionIHwga3c9ICcvJyB8IGt3PSAnJScgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo0Mjk3OjI6IChrdz0gJyonIHwga3c9ICcqKicgfCBrdz0gJy8nIHwga3c9ICclJyApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo0NzM1OjI6ICggKGt3PSAnKicgfCBrdz0gJyoqJyB8IGt3PSAnLycgfCBrdz0gJyUnICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NDczNjoyOiAoa3c9ICcqJyB8IGt3PSAnKionIHwga3c9ICcvJyB8IGt3PSAnJScgKQogICAgICAgICAgICAgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NDI5NzoyOiAoa3c9ICcqJyB8IGt3PSAnKionIHwga3c9ICcvJyB8IGt3PSAnJScgKQotICAgICAgICAgICAgaW50IGFsdDcyPTQ7CisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo0NzM2OjI6IChrdz0gJyonIHwga3c9ICcqKicgfCBrdz0gJy8nIHwga3c9ICclJyApCisgICAgICAgICAgICBpbnQgYWx0ODM9NDsKICAgICAgICAgICAgIHN3aXRjaCAoIGlucHV0LkxBKDEpICkgewotICAgICAgICAgICAgY2FzZSA3MDoKKyAgICAgICAgICAgIGNhc2UgNzc6CiAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGFsdDcyPTE7CisgICAgICAgICAgICAgICAgYWx0ODM9MTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIDEwNDoKKyAgICAgICAgICAgIGNhc2UgMTExOgogICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBhbHQ3Mj0yOworICAgICAgICAgICAgICAgIGFsdDgzPTI7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSAxMDU6CisgICAgICAgICAgICBjYXNlIDExMjoKICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgYWx0NzI9MzsKKyAgICAgICAgICAgICAgICBhbHQ4Mz0zOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgMTA2OgorICAgICAgICAgICAgY2FzZSAxMTM6CiAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGFsdDcyPTQ7CisgICAgICAgICAgICAgICAgYWx0ODM9NDsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgICAgIGlmIChzdGF0ZS5iYWNrdHJhY2tpbmc+MCkge3N0YXRlLmZhaWxlZD10cnVlOyByZXR1cm4gY3VycmVudDt9CiAgICAgICAgICAgICAgICAgTm9WaWFibGVBbHRFeGNlcHRpb24gbnZhZSA9Ci0gICAgICAgICAgICAgICAgICAgIG5ldyBOb1ZpYWJsZUFsdEV4Y2VwdGlvbigiIiwgNzIsIDAsIGlucHV0KTsKKyAgICAgICAgICAgICAgICAgICAgbmV3IE5vVmlhYmxlQWx0RXhjZXB0aW9uKCIiLCA4MywgMCwgaW5wdXQpOwogCiAgICAgICAgICAgICAgICAgdGhyb3cgbnZhZTsKICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgc3dpdGNoIChhbHQ3MikgeworICAgICAgICAgICAgc3dpdGNoIChhbHQ4MykgewogICAgICAgICAgICAgICAgIGNhc2UgMSA6Ci0gICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjQyOTg6Mzoga3c9ICcqJworICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo0NzM3OjM6IGt3PSAnKicKICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBrdz0oVG9rZW4pbWF0Y2goaW5wdXQsNzAsRk9MTE9XXzIpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gY3VycmVudDsKKyAgICAgICAgICAgICAgICAgICAga3c9KFRva2VuKW1hdGNoKGlucHV0LDc3LEZPTExPV18yKTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7CiAgICAgICAgICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogCiAgICAgICAgICAgICAgICAgICAgICAgCQkJY3VycmVudC5tZXJnZShrdyk7CkBAIC0xMTk4Miw5ICsxMzE3Niw5IEBACiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgY2FzZSAyIDoKLSAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NDMwNDozOiBrdz0gJyoqJworICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo0NzQzOjM6IGt3PSAnKionCiAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAga3c9KFRva2VuKW1hdGNoKGlucHV0LDEwNCxGT0xMT1dfMik7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OworICAgICAgICAgICAgICAgICAgICBrdz0oVG9rZW4pbWF0Y2goaW5wdXQsMTExLEZPTExPV18yKTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7CiAgICAgICAgICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogCiAgICAgICAgICAgICAgICAgICAgICAgCQkJY3VycmVudC5tZXJnZShrdyk7CkBAIC0xMTk5NSw5ICsxMzE4OSw5IEBACiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgY2FzZSAzIDoKLSAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NDMxMDozOiBrdz0gJy8nCisgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjQ3NDk6Mzoga3c9ICcvJwogICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGt3PShUb2tlbiltYXRjaChpbnB1dCwxMDUsRk9MTE9XXzIpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gY3VycmVudDsKKyAgICAgICAgICAgICAgICAgICAga3c9KFRva2VuKW1hdGNoKGlucHV0LDExMixGT0xMT1dfMik7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OwogICAgICAgICAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKIAogICAgICAgICAgICAgICAgICAgICAgIAkJCWN1cnJlbnQubWVyZ2Uoa3cpOwpAQCAtMTIwMDgsOSArMTMyMDIsOSBAQAogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgIGNhc2UgNCA6Ci0gICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjQzMTY6Mzoga3c9ICclJworICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo0NzU1OjM6IGt3PSAnJScKICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBrdz0oVG9rZW4pbWF0Y2goaW5wdXQsMTA2LEZPTExPV18yKTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7CisgICAgICAgICAgICAgICAgICAgIGt3PShUb2tlbiltYXRjaChpbnB1dCwxMTMsRk9MTE9XXzIpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gY3VycmVudDsKICAgICAgICAgICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAKICAgICAgICAgICAgICAgICAgICAgICAJCQljdXJyZW50Lm1lcmdlKGt3KTsKQEAgLTEyMDQ1LDcgKzEzMjM5LDcgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJlbnRyeVJ1bGVYVW5hcnlPcGVyYXRpb24iCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NDMyNToxOiBlbnRyeVJ1bGVYVW5hcnlPcGVyYXRpb24gcmV0dXJucyBbRU9iamVjdCBjdXJyZW50PW51bGxdIDogaXZfcnVsZVhVbmFyeU9wZXJhdGlvbj0gcnVsZVhVbmFyeU9wZXJhdGlvbiBFT0YgOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjQ3NjQ6MTogZW50cnlSdWxlWFVuYXJ5T3BlcmF0aW9uIHJldHVybnMgW0VPYmplY3QgY3VycmVudD1udWxsXSA6IGl2X3J1bGVYVW5hcnlPcGVyYXRpb249IHJ1bGVYVW5hcnlPcGVyYXRpb24gRU9GIDsKICAgICBwdWJsaWMgZmluYWwgRU9iamVjdCBlbnRyeVJ1bGVYVW5hcnlPcGVyYXRpb24oKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogICAgICAgICBFT2JqZWN0IGN1cnJlbnQgPSBudWxsOwogCkBAIC0xMjA1Myw4ICsxMzI0Nyw4IEBACiAKIAogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NDMyNTo1NjogKGl2X3J1bGVYVW5hcnlPcGVyYXRpb249IHJ1bGVYVW5hcnlPcGVyYXRpb24gRU9GICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjQzMjY6MjogaXZfcnVsZVhVbmFyeU9wZXJhdGlvbj0gcnVsZVhVbmFyeU9wZXJhdGlvbiBFT0YKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjQ3NjQ6NTY6IChpdl9ydWxlWFVuYXJ5T3BlcmF0aW9uPSBydWxlWFVuYXJ5T3BlcmF0aW9uIEVPRiApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo0NzY1OjI6IGl2X3J1bGVYVW5hcnlPcGVyYXRpb249IHJ1bGVYVW5hcnlPcGVyYXRpb24gRU9GCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIG5ld0NvbXBvc2l0ZU5vZGUoZ3JhbW1hckFjY2Vzcy5nZXRYVW5hcnlPcGVyYXRpb25SdWxlKCkpOyAKQEAgLTEyMDg1LDcgKzEzMjc5LDcgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlWFVuYXJ5T3BlcmF0aW9uIgotICAgIC8vIEludGVybmFsRGF0YURTTC5nOjQzMzI6MTogcnVsZVhVbmFyeU9wZXJhdGlvbiByZXR1cm5zIFtFT2JqZWN0IGN1cnJlbnQ9bnVsbF0gOiAoICggKCkgKCAoIHJ1bGVPcFVuYXJ5ICkgKSAoIChsdl9vcGVyYW5kXzJfMD0gcnVsZVhVbmFyeU9wZXJhdGlvbiApICkgKSB8IHRoaXNfWENhc3RlZEV4cHJlc3Npb25fMz0gcnVsZVhDYXN0ZWRFeHByZXNzaW9uICkgOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjQ3NzE6MTogcnVsZVhVbmFyeU9wZXJhdGlvbiByZXR1cm5zIFtFT2JqZWN0IGN1cnJlbnQ9bnVsbF0gOiAoICggKCkgKCAoIHJ1bGVPcFVuYXJ5ICkgKSAoIChsdl9vcGVyYW5kXzJfMD0gcnVsZVhVbmFyeU9wZXJhdGlvbiApICkgKSB8IHRoaXNfWENhc3RlZEV4cHJlc3Npb25fMz0gcnVsZVhDYXN0ZWRFeHByZXNzaW9uICkgOwogICAgIHB1YmxpYyBmaW5hbCBFT2JqZWN0IHJ1bGVYVW5hcnlPcGVyYXRpb24oKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogICAgICAgICBFT2JqZWN0IGN1cnJlbnQgPSBudWxsOwogCkBAIC0xMjA5OCwzNSArMTMyOTIsMzUgQEAKICAgICAgICAgCWVudGVyUnVsZSgpOwogCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo0MzM4OjI6ICggKCAoICgpICggKCBydWxlT3BVbmFyeSApICkgKCAobHZfb3BlcmFuZF8yXzA9IHJ1bGVYVW5hcnlPcGVyYXRpb24gKSApICkgfCB0aGlzX1hDYXN0ZWRFeHByZXNzaW9uXzM9IHJ1bGVYQ2FzdGVkRXhwcmVzc2lvbiApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjQzMzk6MjogKCAoICgpICggKCBydWxlT3BVbmFyeSApICkgKCAobHZfb3BlcmFuZF8yXzA9IHJ1bGVYVW5hcnlPcGVyYXRpb24gKSApICkgfCB0aGlzX1hDYXN0ZWRFeHByZXNzaW9uXzM9IHJ1bGVYQ2FzdGVkRXhwcmVzc2lvbiApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo0Nzc3OjI6ICggKCAoICgpICggKCBydWxlT3BVbmFyeSApICkgKCAobHZfb3BlcmFuZF8yXzA9IHJ1bGVYVW5hcnlPcGVyYXRpb24gKSApICkgfCB0aGlzX1hDYXN0ZWRFeHByZXNzaW9uXzM9IHJ1bGVYQ2FzdGVkRXhwcmVzc2lvbiApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjQ3Nzg6MjogKCAoICgpICggKCBydWxlT3BVbmFyeSApICkgKCAobHZfb3BlcmFuZF8yXzA9IHJ1bGVYVW5hcnlPcGVyYXRpb24gKSApICkgfCB0aGlzX1hDYXN0ZWRFeHByZXNzaW9uXzM9IHJ1bGVYQ2FzdGVkRXhwcmVzc2lvbiApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo0MzM5OjI6ICggKCAoKSAoICggcnVsZU9wVW5hcnkgKSApICggKGx2X29wZXJhbmRfMl8wPSBydWxlWFVuYXJ5T3BlcmF0aW9uICkgKSApIHwgdGhpc19YQ2FzdGVkRXhwcmVzc2lvbl8zPSBydWxlWENhc3RlZEV4cHJlc3Npb24gKQotICAgICAgICAgICAgaW50IGFsdDczPTI7Ci0gICAgICAgICAgICBpbnQgTEE3M18wID0gaW5wdXQuTEEoMSk7CisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo0Nzc4OjI6ICggKCAoKSAoICggcnVsZU9wVW5hcnkgKSApICggKGx2X29wZXJhbmRfMl8wPSBydWxlWFVuYXJ5T3BlcmF0aW9uICkgKSApIHwgdGhpc19YQ2FzdGVkRXhwcmVzc2lvbl8zPSBydWxlWENhc3RlZEV4cHJlc3Npb24gKQorICAgICAgICAgICAgaW50IGFsdDg0PTI7CisgICAgICAgICAgICBpbnQgTEE4NF8wID0gaW5wdXQuTEEoMSk7CiAKLSAgICAgICAgICAgIGlmICggKChMQTczXzA+PTEwMiAmJiBMQTczXzA8PTEwMyl8fExBNzNfMD09MTA3KSApIHsKLSAgICAgICAgICAgICAgICBhbHQ3Mz0xOworICAgICAgICAgICAgaWYgKCAoKExBODRfMD49MTA5ICYmIExBODRfMDw9MTEwKXx8TEE4NF8wPT0xMTQpICkgeworICAgICAgICAgICAgICAgIGFsdDg0PTE7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIGlmICggKChMQTczXzA+PVJVTEVfU1RSSU5HICYmIExBNzNfMDw9UlVMRV9ERUNJTUFMKXx8TEE3M18wPT0xNXx8TEE3M18wPT00Nnx8TEE3M18wPT02NXx8KExBNzNfMD49NjggJiYgTEE3M18wPD02OSl8fExBNzNfMD09NzR8fChMQTczXzA+PTc4ICYmIExBNzNfMDw9NzkpfHxMQTczXzA9PTg2fHxMQTczXzA9PTExM3x8TEE3M18wPT0xMTV8fChMQTczXzA+PTExOSAmJiBMQTczXzA8PTEyMCl8fChMQTczXzA+PTEyMyAmJiBMQTczXzA8PTEzMil8fExBNzNfMD09MTM0KSApIHsKLSAgICAgICAgICAgICAgICBhbHQ3Mz0yOworICAgICAgICAgICAgZWxzZSBpZiAoICgoTEE4NF8wPj1SVUxFX1NUUklORyAmJiBMQTg0XzA8PVJVTEVfREVDSU1BTCl8fExBODRfMD09MTV8fExBODRfMD09NTB8fExBODRfMD09NzJ8fChMQTg0XzA+PTc1ICYmIExBODRfMDw9NzYpfHxMQTg0XzA9PTgxfHwoTEE4NF8wPj04NSAmJiBMQTg0XzA8PTg2KXx8TEE4NF8wPT05M3x8TEE4NF8wPT0xMjB8fExBODRfMD09MTIyfHwoTEE4NF8wPj0xMjYgJiYgTEE4NF8wPD0xMjcpfHwoTEE4NF8wPj0xMzAgJiYgTEE4NF8wPD0xMzkpfHxMQTg0XzA9PTE0MSkgKSB7CisgICAgICAgICAgICAgICAgYWx0ODQ9MjsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgIGlmIChzdGF0ZS5iYWNrdHJhY2tpbmc+MCkge3N0YXRlLmZhaWxlZD10cnVlOyByZXR1cm4gY3VycmVudDt9CiAgICAgICAgICAgICAgICAgTm9WaWFibGVBbHRFeGNlcHRpb24gbnZhZSA9Ci0gICAgICAgICAgICAgICAgICAgIG5ldyBOb1ZpYWJsZUFsdEV4Y2VwdGlvbigiIiwgNzMsIDAsIGlucHV0KTsKKyAgICAgICAgICAgICAgICAgICAgbmV3IE5vVmlhYmxlQWx0RXhjZXB0aW9uKCIiLCA4NCwgMCwgaW5wdXQpOwogCiAgICAgICAgICAgICAgICAgdGhyb3cgbnZhZTsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHN3aXRjaCAoYWx0NzMpIHsKKyAgICAgICAgICAgIHN3aXRjaCAoYWx0ODQpIHsKICAgICAgICAgICAgICAgICBjYXNlIDEgOgotICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo0MzQwOjM6ICggKCkgKCAoIHJ1bGVPcFVuYXJ5ICkgKSAoIChsdl9vcGVyYW5kXzJfMD0gcnVsZVhVbmFyeU9wZXJhdGlvbiApICkgKQorICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo0Nzc5OjM6ICggKCkgKCAoIHJ1bGVPcFVuYXJ5ICkgKSAoIChsdl9vcGVyYW5kXzJfMD0gcnVsZVhVbmFyeU9wZXJhdGlvbiApICkgKQogICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjQzNDA6MzogKCAoKSAoICggcnVsZU9wVW5hcnkgKSApICggKGx2X29wZXJhbmRfMl8wPSBydWxlWFVuYXJ5T3BlcmF0aW9uICkgKSApCi0gICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjQzNDE6NDogKCkgKCAoIHJ1bGVPcFVuYXJ5ICkgKSAoIChsdl9vcGVyYW5kXzJfMD0gcnVsZVhVbmFyeU9wZXJhdGlvbiApICkKKyAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NDc3OTozOiAoICgpICggKCBydWxlT3BVbmFyeSApICkgKCAobHZfb3BlcmFuZF8yXzA9IHJ1bGVYVW5hcnlPcGVyYXRpb24gKSApICkKKyAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NDc4MDo0OiAoKSAoICggcnVsZU9wVW5hcnkgKSApICggKGx2X29wZXJhbmRfMl8wPSBydWxlWFVuYXJ5T3BlcmF0aW9uICkgKQogICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjQzNDE6NDogKCkKLSAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NDM0Mjo1OiAKKyAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NDc4MDo0OiAoKQorICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo0NzgxOjU6IAogICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogCkBAIC0xMjEzOCwxMSArMTMzMzIsMTEgQEAKIAogICAgICAgICAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NDM0ODo0OiAoICggcnVsZU9wVW5hcnkgKSApCi0gICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjQzNDk6NTogKCBydWxlT3BVbmFyeSApCisgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjQ3ODc6NDogKCAoIHJ1bGVPcFVuYXJ5ICkgKQorICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo0Nzg4OjU6ICggcnVsZU9wVW5hcnkgKQogICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjQzNDk6NTogKCBydWxlT3BVbmFyeSApCi0gICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjQzNTA6NjogcnVsZU9wVW5hcnkKKyAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NDc4ODo1OiAoIHJ1bGVPcFVuYXJ5ICkKKyAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NDc4OTo2OiBydWxlT3BVbmFyeQogICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogCkBAIC0xMjE1Niw3ICsxMzM1MCw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgCQkJCQkJbmV3Q29tcG9zaXRlTm9kZShncmFtbWFyQWNjZXNzLmdldFhVbmFyeU9wZXJhdGlvbkFjY2VzcygpLmdldEZlYXR1cmVKdm1JZGVudGlmaWFibGVFbGVtZW50Q3Jvc3NSZWZlcmVuY2VfMF8xXzAoKSk7CiAgICAgICAgICAgICAgICAgICAgICAgCQkJCQkKICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV182NCk7CisgICAgICAgICAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzc4KTsKICAgICAgICAgICAgICAgICAgICAgcnVsZU9wVW5hcnkoKTsKIAogICAgICAgICAgICAgICAgICAgICBzdGF0ZS5fZnNwLS07CkBAIC0xMjE3MiwxMSArMTMzNjYsMTEgQEAKIAogICAgICAgICAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NDM2NDo0OiAoIChsdl9vcGVyYW5kXzJfMD0gcnVsZVhVbmFyeU9wZXJhdGlvbiApICkKLSAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NDM2NTo1OiAobHZfb3BlcmFuZF8yXzA9IHJ1bGVYVW5hcnlPcGVyYXRpb24gKQorICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo0ODAzOjQ6ICggKGx2X29wZXJhbmRfMl8wPSBydWxlWFVuYXJ5T3BlcmF0aW9uICkgKQorICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo0ODA0OjU6IChsdl9vcGVyYW5kXzJfMD0gcnVsZVhVbmFyeU9wZXJhdGlvbiApCiAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NDM2NTo1OiAobHZfb3BlcmFuZF8yXzA9IHJ1bGVYVW5hcnlPcGVyYXRpb24gKQotICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo0MzY2OjY6IGx2X29wZXJhbmRfMl8wPSBydWxlWFVuYXJ5T3BlcmF0aW9uCisgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjQ4MDQ6NTogKGx2X29wZXJhbmRfMl8wPSBydWxlWFVuYXJ5T3BlcmF0aW9uICkKKyAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NDgwNTo2OiBsdl9vcGVyYW5kXzJfMD0gcnVsZVhVbmFyeU9wZXJhdGlvbgogICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogCkBAIC0xMjIxNCw3ICsxMzQwOCw3IEBACiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgY2FzZSAyIDoKLSAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NDM4NTozOiB0aGlzX1hDYXN0ZWRFeHByZXNzaW9uXzM9IHJ1bGVYQ2FzdGVkRXhwcmVzc2lvbgorICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo0ODI0OjM6IHRoaXNfWENhc3RlZEV4cHJlc3Npb25fMz0gcnVsZVhDYXN0ZWRFeHByZXNzaW9uCiAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAKQEAgLTEyMjYwLDcgKzEzNDU0LDcgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJlbnRyeVJ1bGVPcFVuYXJ5IgotICAgIC8vIEludGVybmFsRGF0YURTTC5nOjQzOTc6MTogZW50cnlSdWxlT3BVbmFyeSByZXR1cm5zIFtTdHJpbmcgY3VycmVudD1udWxsXSA6IGl2X3J1bGVPcFVuYXJ5PSBydWxlT3BVbmFyeSBFT0YgOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjQ4MzY6MTogZW50cnlSdWxlT3BVbmFyeSByZXR1cm5zIFtTdHJpbmcgY3VycmVudD1udWxsXSA6IGl2X3J1bGVPcFVuYXJ5PSBydWxlT3BVbmFyeSBFT0YgOwogICAgIHB1YmxpYyBmaW5hbCBTdHJpbmcgZW50cnlSdWxlT3BVbmFyeSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAgICAgICAgIFN0cmluZyBjdXJyZW50ID0gbnVsbDsKIApAQCAtMTIyNjgsOCArMTM0NjIsOCBAQAogCiAKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjQzOTc6NDc6IChpdl9ydWxlT3BVbmFyeT0gcnVsZU9wVW5hcnkgRU9GICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjQzOTg6MjogaXZfcnVsZU9wVW5hcnk9IHJ1bGVPcFVuYXJ5IEVPRgorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NDgzNjo0NzogKGl2X3J1bGVPcFVuYXJ5PSBydWxlT3BVbmFyeSBFT0YgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NDgzNzoyOiBpdl9ydWxlT3BVbmFyeT0gcnVsZU9wVW5hcnkgRU9GCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIG5ld0NvbXBvc2l0ZU5vZGUoZ3JhbW1hckFjY2Vzcy5nZXRPcFVuYXJ5UnVsZSgpKTsgCkBAIC0xMjMwMCw3ICsxMzQ5NCw3IEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZU9wVW5hcnkiCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NDQwNDoxOiBydWxlT3BVbmFyeSByZXR1cm5zIFtBbnRsckRhdGF0eXBlUnVsZVRva2VuIGN1cnJlbnQ9bmV3IEFudGxyRGF0YXR5cGVSdWxlVG9rZW4oKV0gOiAoa3c9ICchJyB8IGt3PSAnLScgfCBrdz0gJysnICkgOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjQ4NDM6MTogcnVsZU9wVW5hcnkgcmV0dXJucyBbQW50bHJEYXRhdHlwZVJ1bGVUb2tlbiBjdXJyZW50PW5ldyBBbnRsckRhdGF0eXBlUnVsZVRva2VuKCldIDogKGt3PSAnIScgfCBrdz0gJy0nIHwga3c9ICcrJyApIDsKICAgICBwdWJsaWMgZmluYWwgQW50bHJEYXRhdHlwZVJ1bGVUb2tlbiBydWxlT3BVbmFyeSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAgICAgICAgIEFudGxyRGF0YXR5cGVSdWxlVG9rZW4gY3VycmVudCA9IG5ldyBBbnRsckRhdGF0eXBlUnVsZVRva2VuKCk7CiAKQEAgLTEyMzEwLDQwICsxMzUwNCw0MCBAQAogICAgICAgICAJZW50ZXJSdWxlKCk7CiAKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjQ0MTA6MjogKCAoa3c9ICchJyB8IGt3PSAnLScgfCBrdz0gJysnICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NDQxMToyOiAoa3c9ICchJyB8IGt3PSAnLScgfCBrdz0gJysnICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjQ4NDk6MjogKCAoa3c9ICchJyB8IGt3PSAnLScgfCBrdz0gJysnICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NDg1MDoyOiAoa3c9ICchJyB8IGt3PSAnLScgfCBrdz0gJysnICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjQ0MTE6MjogKGt3PSAnIScgfCBrdz0gJy0nIHwga3c9ICcrJyApCi0gICAgICAgICAgICBpbnQgYWx0NzQ9MzsKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjQ4NTA6MjogKGt3PSAnIScgfCBrdz0gJy0nIHwga3c9ICcrJyApCisgICAgICAgICAgICBpbnQgYWx0ODU9MzsKICAgICAgICAgICAgIHN3aXRjaCAoIGlucHV0LkxBKDEpICkgewotICAgICAgICAgICAgY2FzZSAxMDc6CisgICAgICAgICAgICBjYXNlIDExNDoKICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgYWx0NzQ9MTsKKyAgICAgICAgICAgICAgICBhbHQ4NT0xOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgMTAzOgorICAgICAgICAgICAgY2FzZSAxMTA6CiAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGFsdDc0PTI7CisgICAgICAgICAgICAgICAgYWx0ODU9MjsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIDEwMjoKKyAgICAgICAgICAgIGNhc2UgMTA5OgogICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBhbHQ3ND0zOworICAgICAgICAgICAgICAgIGFsdDg1PTM7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgICAgICBpZiAoc3RhdGUuYmFja3RyYWNraW5nPjApIHtzdGF0ZS5mYWlsZWQ9dHJ1ZTsgcmV0dXJuIGN1cnJlbnQ7fQogICAgICAgICAgICAgICAgIE5vVmlhYmxlQWx0RXhjZXB0aW9uIG52YWUgPQotICAgICAgICAgICAgICAgICAgICBuZXcgTm9WaWFibGVBbHRFeGNlcHRpb24oIiIsIDc0LCAwLCBpbnB1dCk7CisgICAgICAgICAgICAgICAgICAgIG5ldyBOb1ZpYWJsZUFsdEV4Y2VwdGlvbigiIiwgODUsIDAsIGlucHV0KTsKIAogICAgICAgICAgICAgICAgIHRocm93IG52YWU7CiAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgIHN3aXRjaCAoYWx0NzQpIHsKKyAgICAgICAgICAgIHN3aXRjaCAoYWx0ODUpIHsKICAgICAgICAgICAgICAgICBjYXNlIDEgOgotICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo0NDEyOjM6IGt3PSAnIScKKyAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NDg1MTozOiBrdz0gJyEnCiAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAga3c9KFRva2VuKW1hdGNoKGlucHV0LDEwNyxGT0xMT1dfMik7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OworICAgICAgICAgICAgICAgICAgICBrdz0oVG9rZW4pbWF0Y2goaW5wdXQsMTE0LEZPTExPV18yKTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7CiAgICAgICAgICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogCiAgICAgICAgICAgICAgICAgICAgICAgCQkJY3VycmVudC5tZXJnZShrdyk7CkBAIC0xMjM1NCw5ICsxMzU0OCw5IEBACiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgY2FzZSAyIDoKLSAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NDQxODozOiBrdz0gJy0nCisgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjQ4NTc6Mzoga3c9ICctJwogICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGt3PShUb2tlbiltYXRjaChpbnB1dCwxMDMsRk9MTE9XXzIpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gY3VycmVudDsKKyAgICAgICAgICAgICAgICAgICAga3c9KFRva2VuKW1hdGNoKGlucHV0LDExMCxGT0xMT1dfMik7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OwogICAgICAgICAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKIAogICAgICAgICAgICAgICAgICAgICAgIAkJCWN1cnJlbnQubWVyZ2Uoa3cpOwpAQCAtMTIzNjcsOSArMTM1NjEsOSBAQAogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgIGNhc2UgMyA6Ci0gICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjQ0MjQ6Mzoga3c9ICcrJworICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo0ODYzOjM6IGt3PSAnKycKICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBrdz0oVG9rZW4pbWF0Y2goaW5wdXQsMTAyLEZPTExPV18yKTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7CisgICAgICAgICAgICAgICAgICAgIGt3PShUb2tlbiltYXRjaChpbnB1dCwxMDksRk9MTE9XXzIpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gY3VycmVudDsKICAgICAgICAgICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAKICAgICAgICAgICAgICAgICAgICAgICAJCQljdXJyZW50Lm1lcmdlKGt3KTsKQEAgLTEyNDA0LDcgKzEzNTk4LDcgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJlbnRyeVJ1bGVYQ2FzdGVkRXhwcmVzc2lvbiIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo0NDMzOjE6IGVudHJ5UnVsZVhDYXN0ZWRFeHByZXNzaW9uIHJldHVybnMgW0VPYmplY3QgY3VycmVudD1udWxsXSA6IGl2X3J1bGVYQ2FzdGVkRXhwcmVzc2lvbj0gcnVsZVhDYXN0ZWRFeHByZXNzaW9uIEVPRiA7CisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NDg3MjoxOiBlbnRyeVJ1bGVYQ2FzdGVkRXhwcmVzc2lvbiByZXR1cm5zIFtFT2JqZWN0IGN1cnJlbnQ9bnVsbF0gOiBpdl9ydWxlWENhc3RlZEV4cHJlc3Npb249IHJ1bGVYQ2FzdGVkRXhwcmVzc2lvbiBFT0YgOwogICAgIHB1YmxpYyBmaW5hbCBFT2JqZWN0IGVudHJ5UnVsZVhDYXN0ZWRFeHByZXNzaW9uKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKICAgICAgICAgRU9iamVjdCBjdXJyZW50ID0gbnVsbDsKIApAQCAtMTI0MTIsOCArMTM2MDYsOCBAQAogCiAKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjQ0MzM6NTg6IChpdl9ydWxlWENhc3RlZEV4cHJlc3Npb249IHJ1bGVYQ2FzdGVkRXhwcmVzc2lvbiBFT0YgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NDQzNDoyOiBpdl9ydWxlWENhc3RlZEV4cHJlc3Npb249IHJ1bGVYQ2FzdGVkRXhwcmVzc2lvbiBFT0YKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjQ4NzI6NTg6IChpdl9ydWxlWENhc3RlZEV4cHJlc3Npb249IHJ1bGVYQ2FzdGVkRXhwcmVzc2lvbiBFT0YgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NDg3MzoyOiBpdl9ydWxlWENhc3RlZEV4cHJlc3Npb249IHJ1bGVYQ2FzdGVkRXhwcmVzc2lvbiBFT0YKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgbmV3Q29tcG9zaXRlTm9kZShncmFtbWFyQWNjZXNzLmdldFhDYXN0ZWRFeHByZXNzaW9uUnVsZSgpKTsgCkBAIC0xMjQ0NCw3ICsxMzYzOCw3IEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZVhDYXN0ZWRFeHByZXNzaW9uIgotICAgIC8vIEludGVybmFsRGF0YURTTC5nOjQ0NDA6MTogcnVsZVhDYXN0ZWRFeHByZXNzaW9uIHJldHVybnMgW0VPYmplY3QgY3VycmVudD1udWxsXSA6ICh0aGlzX1hQb3N0Zml4T3BlcmF0aW9uXzA9IHJ1bGVYUG9zdGZpeE9wZXJhdGlvbiAoICggKCAoICgpICdhcycgKSApPT4gKCAoKSBvdGhlcmx2XzI9ICdhcycgKSApICggKGx2X3R5cGVfM18wPSBydWxlSnZtVHlwZVJlZmVyZW5jZSApICkgKSogKSA7CisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NDg3OToxOiBydWxlWENhc3RlZEV4cHJlc3Npb24gcmV0dXJucyBbRU9iamVjdCBjdXJyZW50PW51bGxdIDogKHRoaXNfWFBvc3RmaXhPcGVyYXRpb25fMD0gcnVsZVhQb3N0Zml4T3BlcmF0aW9uICggKCAoICggKCkgJ2FzJyApICk9PiAoICgpIG90aGVybHZfMj0gJ2FzJyApICkgKCAobHZfdHlwZV8zXzA9IHJ1bGVKdm1UeXBlUmVmZXJlbmNlICkgKSApKiApIDsKICAgICBwdWJsaWMgZmluYWwgRU9iamVjdCBydWxlWENhc3RlZEV4cHJlc3Npb24oKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogICAgICAgICBFT2JqZWN0IGN1cnJlbnQgPSBudWxsOwogCkBAIC0xMjQ1OCwxOCArMTM2NTIsMTggQEAKICAgICAgICAgCWVudGVyUnVsZSgpOwogCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo0NDQ2OjI6ICggKHRoaXNfWFBvc3RmaXhPcGVyYXRpb25fMD0gcnVsZVhQb3N0Zml4T3BlcmF0aW9uICggKCAoICggKCkgJ2FzJyApICk9PiAoICgpIG90aGVybHZfMj0gJ2FzJyApICkgKCAobHZfdHlwZV8zXzA9IHJ1bGVKdm1UeXBlUmVmZXJlbmNlICkgKSApKiApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjQ0NDc6MjogKHRoaXNfWFBvc3RmaXhPcGVyYXRpb25fMD0gcnVsZVhQb3N0Zml4T3BlcmF0aW9uICggKCAoICggKCkgJ2FzJyApICk9PiAoICgpIG90aGVybHZfMj0gJ2FzJyApICkgKCAobHZfdHlwZV8zXzA9IHJ1bGVKdm1UeXBlUmVmZXJlbmNlICkgKSApKiApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo0ODg1OjI6ICggKHRoaXNfWFBvc3RmaXhPcGVyYXRpb25fMD0gcnVsZVhQb3N0Zml4T3BlcmF0aW9uICggKCAoICggKCkgJ2FzJyApICk9PiAoICgpIG90aGVybHZfMj0gJ2FzJyApICkgKCAobHZfdHlwZV8zXzA9IHJ1bGVKdm1UeXBlUmVmZXJlbmNlICkgKSApKiApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjQ4ODY6MjogKHRoaXNfWFBvc3RmaXhPcGVyYXRpb25fMD0gcnVsZVhQb3N0Zml4T3BlcmF0aW9uICggKCAoICggKCkgJ2FzJyApICk9PiAoICgpIG90aGVybHZfMj0gJ2FzJyApICkgKCAobHZfdHlwZV8zXzA9IHJ1bGVKdm1UeXBlUmVmZXJlbmNlICkgKSApKiApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo0NDQ3OjI6ICh0aGlzX1hQb3N0Zml4T3BlcmF0aW9uXzA9IHJ1bGVYUG9zdGZpeE9wZXJhdGlvbiAoICggKCAoICgpICdhcycgKSApPT4gKCAoKSBvdGhlcmx2XzI9ICdhcycgKSApICggKGx2X3R5cGVfM18wPSBydWxlSnZtVHlwZVJlZmVyZW5jZSApICkgKSogKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NDQ0ODozOiB0aGlzX1hQb3N0Zml4T3BlcmF0aW9uXzA9IHJ1bGVYUG9zdGZpeE9wZXJhdGlvbiAoICggKCAoICgpICdhcycgKSApPT4gKCAoKSBvdGhlcmx2XzI9ICdhcycgKSApICggKGx2X3R5cGVfM18wPSBydWxlSnZtVHlwZVJlZmVyZW5jZSApICkgKSoKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjQ4ODY6MjogKHRoaXNfWFBvc3RmaXhPcGVyYXRpb25fMD0gcnVsZVhQb3N0Zml4T3BlcmF0aW9uICggKCAoICggKCkgJ2FzJyApICk9PiAoICgpIG90aGVybHZfMj0gJ2FzJyApICkgKCAobHZfdHlwZV8zXzA9IHJ1bGVKdm1UeXBlUmVmZXJlbmNlICkgKSApKiApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo0ODg3OjM6IHRoaXNfWFBvc3RmaXhPcGVyYXRpb25fMD0gcnVsZVhQb3N0Zml4T3BlcmF0aW9uICggKCAoICggKCkgJ2FzJyApICk9PiAoICgpIG90aGVybHZfMj0gJ2FzJyApICkgKCAobHZfdHlwZV8zXzA9IHJ1bGVKdm1UeXBlUmVmZXJlbmNlICkgKSApKgogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAKICAgICAgICAgICAgICAgCQkJbmV3Q29tcG9zaXRlTm9kZShncmFtbWFyQWNjZXNzLmdldFhDYXN0ZWRFeHByZXNzaW9uQWNjZXNzKCkuZ2V0WFBvc3RmaXhPcGVyYXRpb25QYXJzZXJSdWxlQ2FsbF8wKCkpOwogICAgICAgICAgICAgICAJCQogICAgICAgICAgICAgfQotICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfODQpOworICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfOTgpOwogICAgICAgICAgICAgdGhpc19YUG9zdGZpeE9wZXJhdGlvbl8wPXJ1bGVYUG9zdGZpeE9wZXJhdGlvbigpOwogCiAgICAgICAgICAgICBzdGF0ZS5fZnNwLS07CkBAIC0xMjQ4MCwzNSArMTM2NzQsMzUgQEAKICAgICAgICAgICAgICAgCQkJYWZ0ZXJQYXJzZXJPckVudW1SdWxlQ2FsbCgpOwogICAgICAgICAgICAgICAJCQogICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NDQ1NjozOiAoICggKCAoICgpICdhcycgKSApPT4gKCAoKSBvdGhlcmx2XzI9ICdhcycgKSApICggKGx2X3R5cGVfM18wPSBydWxlSnZtVHlwZVJlZmVyZW5jZSApICkgKSoKLSAgICAgICAgICAgIGxvb3A3NToKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjQ4OTU6MzogKCAoICggKCAoKSAnYXMnICkgKT0+ICggKCkgb3RoZXJsdl8yPSAnYXMnICkgKSAoIChsdl90eXBlXzNfMD0gcnVsZUp2bVR5cGVSZWZlcmVuY2UgKSApICkqCisgICAgICAgICAgICBsb29wODY6CiAgICAgICAgICAgICBkbyB7Ci0gICAgICAgICAgICAgICAgaW50IGFsdDc1PTI7Ci0gICAgICAgICAgICAgICAgaW50IExBNzVfMCA9IGlucHV0LkxBKDEpOworICAgICAgICAgICAgICAgIGludCBhbHQ4Nj0yOworICAgICAgICAgICAgICAgIGludCBMQTg2XzAgPSBpbnB1dC5MQSgxKTsKIAotICAgICAgICAgICAgICAgIGlmICggKExBNzVfMD09NjEpICkgewotICAgICAgICAgICAgICAgICAgICBpbnQgTEE3NV8yID0gaW5wdXQuTEEoMik7CisgICAgICAgICAgICAgICAgaWYgKCAoTEE4Nl8wPT02OCkgKSB7CisgICAgICAgICAgICAgICAgICAgIGludCBMQTg2XzIgPSBpbnB1dC5MQSgyKTsKIAogICAgICAgICAgICAgICAgICAgICBpZiAoIChzeW5wcmVkMThfSW50ZXJuYWxEYXRhRFNMKCkpICkgewotICAgICAgICAgICAgICAgICAgICAgICAgYWx0NzU9MTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFsdDg2PTE7CiAgICAgICAgICAgICAgICAgICAgIH0KIAogCiAgICAgICAgICAgICAgICAgfQogCiAKLSAgICAgICAgICAgICAgICBzd2l0Y2ggKGFsdDc1KSB7CisgICAgICAgICAgICAgICAgc3dpdGNoIChhbHQ4NikgewogICAgICAgICAgICAgCWNhc2UgMSA6Ci0gICAgICAgICAgICAJICAgIC8vIEludGVybmFsRGF0YURTTC5nOjQ0NTc6NDogKCAoICggKCkgJ2FzJyApICk9PiAoICgpIG90aGVybHZfMj0gJ2FzJyApICkgKCAobHZfdHlwZV8zXzA9IHJ1bGVKdm1UeXBlUmVmZXJlbmNlICkgKQorICAgICAgICAgICAgCSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo0ODk2OjQ6ICggKCAoICgpICdhcycgKSApPT4gKCAoKSBvdGhlcmx2XzI9ICdhcycgKSApICggKGx2X3R5cGVfM18wPSBydWxlSnZtVHlwZVJlZmVyZW5jZSApICkKICAgICAgICAgICAgIAkgICAgewotICAgICAgICAgICAgCSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo0NDU3OjQ6ICggKCAoICgpICdhcycgKSApPT4gKCAoKSBvdGhlcmx2XzI9ICdhcycgKSApCi0gICAgICAgICAgICAJICAgIC8vIEludGVybmFsRGF0YURTTC5nOjQ0NTg6NTogKCAoICgpICdhcycgKSApPT4gKCAoKSBvdGhlcmx2XzI9ICdhcycgKQorICAgICAgICAgICAgCSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo0ODk2OjQ6ICggKCAoICgpICdhcycgKSApPT4gKCAoKSBvdGhlcmx2XzI9ICdhcycgKSApCisgICAgICAgICAgICAJICAgIC8vIEludGVybmFsRGF0YURTTC5nOjQ4OTc6NTogKCAoICgpICdhcycgKSApPT4gKCAoKSBvdGhlcmx2XzI9ICdhcycgKQogICAgICAgICAgICAgCSAgICB7Ci0gICAgICAgICAgICAJICAgIC8vIEludGVybmFsRGF0YURTTC5nOjQ0NjQ6NTogKCAoKSBvdGhlcmx2XzI9ICdhcycgKQotICAgICAgICAgICAgCSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo0NDY1OjY6ICgpIG90aGVybHZfMj0gJ2FzJworICAgICAgICAgICAgCSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo0OTAzOjU6ICggKCkgb3RoZXJsdl8yPSAnYXMnICkKKyAgICAgICAgICAgIAkgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NDkwNDo2OiAoKSBvdGhlcmx2XzI9ICdhcycKICAgICAgICAgICAgIAkgICAgewotICAgICAgICAgICAgCSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo0NDY1OjY6ICgpCi0gICAgICAgICAgICAJICAgIC8vIEludGVybmFsRGF0YURTTC5nOjQ0NjY6NzogCisgICAgICAgICAgICAJICAgIC8vIEludGVybmFsRGF0YURTTC5nOjQ5MDQ6NjogKCkKKyAgICAgICAgICAgIAkgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NDkwNTo3OiAKICAgICAgICAgICAgIAkgICAgewogICAgICAgICAgICAgCSAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKIApAQCAtMTI1MjAsNyArMTM3MTQsNyBAQAogCiAgICAgICAgICAgICAJICAgIH0KIAotICAgICAgICAgICAgCSAgICBvdGhlcmx2XzI9KFRva2VuKW1hdGNoKGlucHV0LDYxLEZPTExPV183Nyk7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OworICAgICAgICAgICAgCSAgICBvdGhlcmx2XzI9KFRva2VuKW1hdGNoKGlucHV0LDY4LEZPTExPV185MSk7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OwogICAgICAgICAgICAgCSAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKIAogICAgICAgICAgICAgCSAgICAgIAkJCQkJCW5ld0xlYWZOb2RlKG90aGVybHZfMiwgZ3JhbW1hckFjY2Vzcy5nZXRYQ2FzdGVkRXhwcmVzc2lvbkFjY2VzcygpLmdldEFzS2V5d29yZF8xXzBfMF8xKCkpOwpAQCAtMTI1MzIsMTggKzEzNzI2LDE4IEBACiAKICAgICAgICAgICAgIAkgICAgfQogCi0gICAgICAgICAgICAJICAgIC8vIEludGVybmFsRGF0YURTTC5nOjQ0Nzg6NDogKCAobHZfdHlwZV8zXzA9IHJ1bGVKdm1UeXBlUmVmZXJlbmNlICkgKQotICAgICAgICAgICAgCSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo0NDc5OjU6IChsdl90eXBlXzNfMD0gcnVsZUp2bVR5cGVSZWZlcmVuY2UgKQorICAgICAgICAgICAgCSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo0OTE3OjQ6ICggKGx2X3R5cGVfM18wPSBydWxlSnZtVHlwZVJlZmVyZW5jZSApICkKKyAgICAgICAgICAgIAkgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NDkxODo1OiAobHZfdHlwZV8zXzA9IHJ1bGVKdm1UeXBlUmVmZXJlbmNlICkKICAgICAgICAgICAgIAkgICAgewotICAgICAgICAgICAgCSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo0NDc5OjU6IChsdl90eXBlXzNfMD0gcnVsZUp2bVR5cGVSZWZlcmVuY2UgKQotICAgICAgICAgICAgCSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo0NDgwOjY6IGx2X3R5cGVfM18wPSBydWxlSnZtVHlwZVJlZmVyZW5jZQorICAgICAgICAgICAgCSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo0OTE4OjU6IChsdl90eXBlXzNfMD0gcnVsZUp2bVR5cGVSZWZlcmVuY2UgKQorICAgICAgICAgICAgCSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo0OTE5OjY6IGx2X3R5cGVfM18wPSBydWxlSnZtVHlwZVJlZmVyZW5jZQogICAgICAgICAgICAgCSAgICB7CiAgICAgICAgICAgICAJICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogCiAgICAgICAgICAgICAJICAgICAgCQkJCQkJbmV3Q29tcG9zaXRlTm9kZShncmFtbWFyQWNjZXNzLmdldFhDYXN0ZWRFeHByZXNzaW9uQWNjZXNzKCkuZ2V0VHlwZUp2bVR5cGVSZWZlcmVuY2VQYXJzZXJSdWxlQ2FsbF8xXzFfMCgpKTsKICAgICAgICAgICAgIAkgICAgICAJCQkJCQogICAgICAgICAgICAgCSAgICB9Ci0gICAgICAgICAgICAJICAgIHB1c2hGb2xsb3coRk9MTE9XXzg0KTsKKyAgICAgICAgICAgIAkgICAgcHVzaEZvbGxvdyhGT0xMT1dfOTgpOwogICAgICAgICAgICAgCSAgICBsdl90eXBlXzNfMD1ydWxlSnZtVHlwZVJlZmVyZW5jZSgpOwogCiAgICAgICAgICAgICAJICAgIHN0YXRlLl9mc3AtLTsKQEAgLTEyNTcyLDcgKzEzNzY2LDcgQEAKICAgICAgICAgICAgIAkgICAgYnJlYWs7CiAKICAgICAgICAgICAgIAlkZWZhdWx0IDoKLSAgICAgICAgICAgIAkgICAgYnJlYWsgbG9vcDc1OworICAgICAgICAgICAgCSAgICBicmVhayBsb29wODY7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfSB3aGlsZSAodHJ1ZSk7CiAKQEAgLTEyNjAxLDcgKzEzNzk1LDcgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJlbnRyeVJ1bGVYUG9zdGZpeE9wZXJhdGlvbiIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo0NTAyOjE6IGVudHJ5UnVsZVhQb3N0Zml4T3BlcmF0aW9uIHJldHVybnMgW0VPYmplY3QgY3VycmVudD1udWxsXSA6IGl2X3J1bGVYUG9zdGZpeE9wZXJhdGlvbj0gcnVsZVhQb3N0Zml4T3BlcmF0aW9uIEVPRiA7CisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NDk0MToxOiBlbnRyeVJ1bGVYUG9zdGZpeE9wZXJhdGlvbiByZXR1cm5zIFtFT2JqZWN0IGN1cnJlbnQ9bnVsbF0gOiBpdl9ydWxlWFBvc3RmaXhPcGVyYXRpb249IHJ1bGVYUG9zdGZpeE9wZXJhdGlvbiBFT0YgOwogICAgIHB1YmxpYyBmaW5hbCBFT2JqZWN0IGVudHJ5UnVsZVhQb3N0Zml4T3BlcmF0aW9uKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKICAgICAgICAgRU9iamVjdCBjdXJyZW50ID0gbnVsbDsKIApAQCAtMTI2MDksOCArMTM4MDMsOCBAQAogCiAKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjQ1MDI6NTg6IChpdl9ydWxlWFBvc3RmaXhPcGVyYXRpb249IHJ1bGVYUG9zdGZpeE9wZXJhdGlvbiBFT0YgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NDUwMzoyOiBpdl9ydWxlWFBvc3RmaXhPcGVyYXRpb249IHJ1bGVYUG9zdGZpeE9wZXJhdGlvbiBFT0YKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjQ5NDE6NTg6IChpdl9ydWxlWFBvc3RmaXhPcGVyYXRpb249IHJ1bGVYUG9zdGZpeE9wZXJhdGlvbiBFT0YgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NDk0MjoyOiBpdl9ydWxlWFBvc3RmaXhPcGVyYXRpb249IHJ1bGVYUG9zdGZpeE9wZXJhdGlvbiBFT0YKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgbmV3Q29tcG9zaXRlTm9kZShncmFtbWFyQWNjZXNzLmdldFhQb3N0Zml4T3BlcmF0aW9uUnVsZSgpKTsgCkBAIC0xMjY0MSw3ICsxMzgzNSw3IEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZVhQb3N0Zml4T3BlcmF0aW9uIgotICAgIC8vIEludGVybmFsRGF0YURTTC5nOjQ1MDk6MTogcnVsZVhQb3N0Zml4T3BlcmF0aW9uIHJldHVybnMgW0VPYmplY3QgY3VycmVudD1udWxsXSA6ICh0aGlzX1hNZW1iZXJGZWF0dXJlQ2FsbF8wPSBydWxlWE1lbWJlckZlYXR1cmVDYWxsICggKCAoICgpICggKCBydWxlT3BQb3N0Zml4ICkgKSApICk9PiAoICgpICggKCBydWxlT3BQb3N0Zml4ICkgKSApICk/ICkgOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjQ5NDg6MTogcnVsZVhQb3N0Zml4T3BlcmF0aW9uIHJldHVybnMgW0VPYmplY3QgY3VycmVudD1udWxsXSA6ICh0aGlzX1hNZW1iZXJGZWF0dXJlQ2FsbF8wPSBydWxlWE1lbWJlckZlYXR1cmVDYWxsICggKCAoICgpICggKCBydWxlT3BQb3N0Zml4ICkgKSApICk9PiAoICgpICggKCBydWxlT3BQb3N0Zml4ICkgKSApICk/ICkgOwogICAgIHB1YmxpYyBmaW5hbCBFT2JqZWN0IHJ1bGVYUG9zdGZpeE9wZXJhdGlvbigpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAgICAgICAgIEVPYmplY3QgY3VycmVudCA9IG51bGw7CiAKQEAgLTEyNjUyLDE4ICsxMzg0NiwxOCBAQAogICAgICAgICAJZW50ZXJSdWxlKCk7CiAKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjQ1MTU6MjogKCAodGhpc19YTWVtYmVyRmVhdHVyZUNhbGxfMD0gcnVsZVhNZW1iZXJGZWF0dXJlQ2FsbCAoICggKCAoKSAoICggcnVsZU9wUG9zdGZpeCApICkgKSApPT4gKCAoKSAoICggcnVsZU9wUG9zdGZpeCApICkgKSApPyApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjQ1MTY6MjogKHRoaXNfWE1lbWJlckZlYXR1cmVDYWxsXzA9IHJ1bGVYTWVtYmVyRmVhdHVyZUNhbGwgKCAoICggKCkgKCAoIHJ1bGVPcFBvc3RmaXggKSApICkgKT0+ICggKCkgKCAoIHJ1bGVPcFBvc3RmaXggKSApICkgKT8gKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NDk1NDoyOiAoICh0aGlzX1hNZW1iZXJGZWF0dXJlQ2FsbF8wPSBydWxlWE1lbWJlckZlYXR1cmVDYWxsICggKCAoICgpICggKCBydWxlT3BQb3N0Zml4ICkgKSApICk9PiAoICgpICggKCBydWxlT3BQb3N0Zml4ICkgKSApICk/ICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NDk1NToyOiAodGhpc19YTWVtYmVyRmVhdHVyZUNhbGxfMD0gcnVsZVhNZW1iZXJGZWF0dXJlQ2FsbCAoICggKCAoKSAoICggcnVsZU9wUG9zdGZpeCApICkgKSApPT4gKCAoKSAoICggcnVsZU9wUG9zdGZpeCApICkgKSApPyApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo0NTE2OjI6ICh0aGlzX1hNZW1iZXJGZWF0dXJlQ2FsbF8wPSBydWxlWE1lbWJlckZlYXR1cmVDYWxsICggKCAoICgpICggKCBydWxlT3BQb3N0Zml4ICkgKSApICk9PiAoICgpICggKCBydWxlT3BQb3N0Zml4ICkgKSApICk/ICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjQ1MTc6MzogdGhpc19YTWVtYmVyRmVhdHVyZUNhbGxfMD0gcnVsZVhNZW1iZXJGZWF0dXJlQ2FsbCAoICggKCAoKSAoICggcnVsZU9wUG9zdGZpeCApICkgKSApPT4gKCAoKSAoICggcnVsZU9wUG9zdGZpeCApICkgKSApPworICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NDk1NToyOiAodGhpc19YTWVtYmVyRmVhdHVyZUNhbGxfMD0gcnVsZVhNZW1iZXJGZWF0dXJlQ2FsbCAoICggKCAoKSAoICggcnVsZU9wUG9zdGZpeCApICkgKSApPT4gKCAoKSAoICggcnVsZU9wUG9zdGZpeCApICkgKSApPyApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo0OTU2OjM6IHRoaXNfWE1lbWJlckZlYXR1cmVDYWxsXzA9IHJ1bGVYTWVtYmVyRmVhdHVyZUNhbGwgKCAoICggKCkgKCAoIHJ1bGVPcFBvc3RmaXggKSApICkgKT0+ICggKCkgKCAoIHJ1bGVPcFBvc3RmaXggKSApICkgKT8KICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogCiAgICAgICAgICAgICAgIAkJCW5ld0NvbXBvc2l0ZU5vZGUoZ3JhbW1hckFjY2Vzcy5nZXRYUG9zdGZpeE9wZXJhdGlvbkFjY2VzcygpLmdldFhNZW1iZXJGZWF0dXJlQ2FsbFBhcnNlclJ1bGVDYWxsXzAoKSk7CiAgICAgICAgICAgICAgIAkJCiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV184NSk7CisgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV185OSk7CiAgICAgICAgICAgICB0aGlzX1hNZW1iZXJGZWF0dXJlQ2FsbF8wPXJ1bGVYTWVtYmVyRmVhdHVyZUNhbGwoKTsKIAogICAgICAgICAgICAgc3RhdGUuX2ZzcC0tOwpAQCAtMTI2NzQsMzMgKzEzODY4LDMzIEBACiAgICAgICAgICAgICAgIAkJCWFmdGVyUGFyc2VyT3JFbnVtUnVsZUNhbGwoKTsKICAgICAgICAgICAgICAgCQkKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjQ1MjU6MzogKCAoICggKCkgKCAoIHJ1bGVPcFBvc3RmaXggKSApICkgKT0+ICggKCkgKCAoIHJ1bGVPcFBvc3RmaXggKSApICkgKT8KLSAgICAgICAgICAgIGludCBhbHQ3Nj0yOwotICAgICAgICAgICAgaW50IExBNzZfMCA9IGlucHV0LkxBKDEpOworICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NDk2NDozOiAoICggKCAoKSAoICggcnVsZU9wUG9zdGZpeCApICkgKSApPT4gKCAoKSAoICggcnVsZU9wUG9zdGZpeCApICkgKSApPworICAgICAgICAgICAgaW50IGFsdDg3PTI7CisgICAgICAgICAgICBpbnQgTEE4N18wID0gaW5wdXQuTEEoMSk7CiAKLSAgICAgICAgICAgIGlmICggKExBNzZfMD09MTA4KSApIHsKLSAgICAgICAgICAgICAgICBpbnQgTEE3Nl8xID0gaW5wdXQuTEEoMik7CisgICAgICAgICAgICBpZiAoIChMQTg3XzA9PTExNSkgKSB7CisgICAgICAgICAgICAgICAgaW50IExBODdfMSA9IGlucHV0LkxBKDIpOwogCiAgICAgICAgICAgICAgICAgaWYgKCAoc3lucHJlZDE5X0ludGVybmFsRGF0YURTTCgpKSApIHsKLSAgICAgICAgICAgICAgICAgICAgYWx0NzY9MTsKKyAgICAgICAgICAgICAgICAgICAgYWx0ODc9MTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIGlmICggKExBNzZfMD09MTA5KSApIHsKLSAgICAgICAgICAgICAgICBpbnQgTEE3Nl8yID0gaW5wdXQuTEEoMik7CisgICAgICAgICAgICBlbHNlIGlmICggKExBODdfMD09MTE2KSApIHsKKyAgICAgICAgICAgICAgICBpbnQgTEE4N18yID0gaW5wdXQuTEEoMik7CiAKICAgICAgICAgICAgICAgICBpZiAoIChzeW5wcmVkMTlfSW50ZXJuYWxEYXRhRFNMKCkpICkgewotICAgICAgICAgICAgICAgICAgICBhbHQ3Nj0xOworICAgICAgICAgICAgICAgICAgICBhbHQ4Nz0xOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHN3aXRjaCAoYWx0NzYpIHsKKyAgICAgICAgICAgIHN3aXRjaCAoYWx0ODcpIHsKICAgICAgICAgICAgICAgICBjYXNlIDEgOgotICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo0NTI2OjQ6ICggKCAoKSAoICggcnVsZU9wUG9zdGZpeCApICkgKSApPT4gKCAoKSAoICggcnVsZU9wUG9zdGZpeCApICkgKQorICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo0OTY1OjQ6ICggKCAoKSAoICggcnVsZU9wUG9zdGZpeCApICkgKSApPT4gKCAoKSAoICggcnVsZU9wUG9zdGZpeCApICkgKQogICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjQ1MzY6NDogKCAoKSAoICggcnVsZU9wUG9zdGZpeCApICkgKQotICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo0NTM3OjU6ICgpICggKCBydWxlT3BQb3N0Zml4ICkgKQorICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo0OTc1OjQ6ICggKCkgKCAoIHJ1bGVPcFBvc3RmaXggKSApICkKKyAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NDk3Njo1OiAoKSAoICggcnVsZU9wUG9zdGZpeCApICkKICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo0NTM3OjU6ICgpCi0gICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjQ1Mzg6NjogCisgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjQ5NzY6NTogKCkKKyAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NDk3Nzo2OiAKICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKIApAQCAtMTI3MTIsMTEgKzEzOTA2LDExIEBACiAKICAgICAgICAgICAgICAgICAgICAgfQogCi0gICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjQ1NDQ6NTogKCAoIHJ1bGVPcFBvc3RmaXggKSApCi0gICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjQ1NDU6NjogKCBydWxlT3BQb3N0Zml4ICkKKyAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NDk4Mzo1OiAoICggcnVsZU9wUG9zdGZpeCApICkKKyAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NDk4NDo2OiAoIHJ1bGVPcFBvc3RmaXggKQogICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjQ1NDU6NjogKCBydWxlT3BQb3N0Zml4ICkKLSAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NDU0Njo3OiBydWxlT3BQb3N0Zml4CisgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjQ5ODQ6NjogKCBydWxlT3BQb3N0Zml4ICkKKyAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NDk4NTo3OiBydWxlT3BQb3N0Zml4CiAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAKQEAgLTEyNzgwLDcgKzEzOTc0LDcgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJlbnRyeVJ1bGVPcFBvc3RmaXgiCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NDU2NjoxOiBlbnRyeVJ1bGVPcFBvc3RmaXggcmV0dXJucyBbU3RyaW5nIGN1cnJlbnQ9bnVsbF0gOiBpdl9ydWxlT3BQb3N0Zml4PSBydWxlT3BQb3N0Zml4IEVPRiA7CisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NTAwNToxOiBlbnRyeVJ1bGVPcFBvc3RmaXggcmV0dXJucyBbU3RyaW5nIGN1cnJlbnQ9bnVsbF0gOiBpdl9ydWxlT3BQb3N0Zml4PSBydWxlT3BQb3N0Zml4IEVPRiA7CiAgICAgcHVibGljIGZpbmFsIFN0cmluZyBlbnRyeVJ1bGVPcFBvc3RmaXgoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogICAgICAgICBTdHJpbmcgY3VycmVudCA9IG51bGw7CiAKQEAgLTEyNzg4LDggKzEzOTgyLDggQEAKIAogCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo0NTY2OjQ5OiAoaXZfcnVsZU9wUG9zdGZpeD0gcnVsZU9wUG9zdGZpeCBFT0YgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NDU2NzoyOiBpdl9ydWxlT3BQb3N0Zml4PSBydWxlT3BQb3N0Zml4IEVPRgorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NTAwNTo0OTogKGl2X3J1bGVPcFBvc3RmaXg9IHJ1bGVPcFBvc3RmaXggRU9GICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjUwMDY6MjogaXZfcnVsZU9wUG9zdGZpeD0gcnVsZU9wUG9zdGZpeCBFT0YKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgbmV3Q29tcG9zaXRlTm9kZShncmFtbWFyQWNjZXNzLmdldE9wUG9zdGZpeFJ1bGUoKSk7IApAQCAtMTI4MjAsNyArMTQwMTQsNyBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVPcFBvc3RmaXgiCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NDU3MzoxOiBydWxlT3BQb3N0Zml4IHJldHVybnMgW0FudGxyRGF0YXR5cGVSdWxlVG9rZW4gY3VycmVudD1uZXcgQW50bHJEYXRhdHlwZVJ1bGVUb2tlbigpXSA6IChrdz0gJysrJyB8IGt3PSAnLS0nICkgOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjUwMTI6MTogcnVsZU9wUG9zdGZpeCByZXR1cm5zIFtBbnRsckRhdGF0eXBlUnVsZVRva2VuIGN1cnJlbnQ9bmV3IEFudGxyRGF0YXR5cGVSdWxlVG9rZW4oKV0gOiAoa3c9ICcrKycgfCBrdz0gJy0tJyApIDsKICAgICBwdWJsaWMgZmluYWwgQW50bHJEYXRhdHlwZVJ1bGVUb2tlbiBydWxlT3BQb3N0Zml4KCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKICAgICAgICAgQW50bHJEYXRhdHlwZVJ1bGVUb2tlbiBjdXJyZW50ID0gbmV3IEFudGxyRGF0YXR5cGVSdWxlVG9rZW4oKTsKIApAQCAtMTI4MzAsMzEgKzE0MDI0LDMxIEBACiAgICAgICAgIAllbnRlclJ1bGUoKTsKIAogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NDU3OToyOiAoIChrdz0gJysrJyB8IGt3PSAnLS0nICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NDU4MDoyOiAoa3c9ICcrKycgfCBrdz0gJy0tJyApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo1MDE4OjI6ICggKGt3PSAnKysnIHwga3c9ICctLScgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo1MDE5OjI6IChrdz0gJysrJyB8IGt3PSAnLS0nICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjQ1ODA6MjogKGt3PSAnKysnIHwga3c9ICctLScgKQotICAgICAgICAgICAgaW50IGFsdDc3PTI7Ci0gICAgICAgICAgICBpbnQgTEE3N18wID0gaW5wdXQuTEEoMSk7CisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo1MDE5OjI6IChrdz0gJysrJyB8IGt3PSAnLS0nICkKKyAgICAgICAgICAgIGludCBhbHQ4OD0yOworICAgICAgICAgICAgaW50IExBODhfMCA9IGlucHV0LkxBKDEpOwogCi0gICAgICAgICAgICBpZiAoIChMQTc3XzA9PTEwOCkgKSB7Ci0gICAgICAgICAgICAgICAgYWx0Nzc9MTsKKyAgICAgICAgICAgIGlmICggKExBODhfMD09MTE1KSApIHsKKyAgICAgICAgICAgICAgICBhbHQ4OD0xOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSBpZiAoIChMQTc3XzA9PTEwOSkgKSB7Ci0gICAgICAgICAgICAgICAgYWx0Nzc9MjsKKyAgICAgICAgICAgIGVsc2UgaWYgKCAoTEE4OF8wPT0xMTYpICkgeworICAgICAgICAgICAgICAgIGFsdDg4PTI7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICBpZiAoc3RhdGUuYmFja3RyYWNraW5nPjApIHtzdGF0ZS5mYWlsZWQ9dHJ1ZTsgcmV0dXJuIGN1cnJlbnQ7fQogICAgICAgICAgICAgICAgIE5vVmlhYmxlQWx0RXhjZXB0aW9uIG52YWUgPQotICAgICAgICAgICAgICAgICAgICBuZXcgTm9WaWFibGVBbHRFeGNlcHRpb24oIiIsIDc3LCAwLCBpbnB1dCk7CisgICAgICAgICAgICAgICAgICAgIG5ldyBOb1ZpYWJsZUFsdEV4Y2VwdGlvbigiIiwgODgsIDAsIGlucHV0KTsKIAogICAgICAgICAgICAgICAgIHRocm93IG52YWU7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBzd2l0Y2ggKGFsdDc3KSB7CisgICAgICAgICAgICBzd2l0Y2ggKGFsdDg4KSB7CiAgICAgICAgICAgICAgICAgY2FzZSAxIDoKLSAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NDU4MTozOiBrdz0gJysrJworICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo1MDIwOjM6IGt3PSAnKysnCiAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAga3c9KFRva2VuKW1hdGNoKGlucHV0LDEwOCxGT0xMT1dfMik7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OworICAgICAgICAgICAgICAgICAgICBrdz0oVG9rZW4pbWF0Y2goaW5wdXQsMTE1LEZPTExPV18yKTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7CiAgICAgICAgICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogCiAgICAgICAgICAgICAgICAgICAgICAgCQkJY3VycmVudC5tZXJnZShrdyk7CkBAIC0xMjg2NSw5ICsxNDA1OSw5IEBACiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgY2FzZSAyIDoKLSAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NDU4NzozOiBrdz0gJy0tJworICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo1MDI2OjM6IGt3PSAnLS0nCiAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAga3c9KFRva2VuKW1hdGNoKGlucHV0LDEwOSxGT0xMT1dfMik7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OworICAgICAgICAgICAgICAgICAgICBrdz0oVG9rZW4pbWF0Y2goaW5wdXQsMTE2LEZPTExPV18yKTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7CiAgICAgICAgICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogCiAgICAgICAgICAgICAgICAgICAgICAgCQkJY3VycmVudC5tZXJnZShrdyk7CkBAIC0xMjkwMiw3ICsxNDA5Niw3IEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAiZW50cnlSdWxlWE1lbWJlckZlYXR1cmVDYWxsIgotICAgIC8vIEludGVybmFsRGF0YURTTC5nOjQ1OTY6MTogZW50cnlSdWxlWE1lbWJlckZlYXR1cmVDYWxsIHJldHVybnMgW0VPYmplY3QgY3VycmVudD1udWxsXSA6IGl2X3J1bGVYTWVtYmVyRmVhdHVyZUNhbGw9IHJ1bGVYTWVtYmVyRmVhdHVyZUNhbGwgRU9GIDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo1MDM1OjE6IGVudHJ5UnVsZVhNZW1iZXJGZWF0dXJlQ2FsbCByZXR1cm5zIFtFT2JqZWN0IGN1cnJlbnQ9bnVsbF0gOiBpdl9ydWxlWE1lbWJlckZlYXR1cmVDYWxsPSBydWxlWE1lbWJlckZlYXR1cmVDYWxsIEVPRiA7CiAgICAgcHVibGljIGZpbmFsIEVPYmplY3QgZW50cnlSdWxlWE1lbWJlckZlYXR1cmVDYWxsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKICAgICAgICAgRU9iamVjdCBjdXJyZW50ID0gbnVsbDsKIApAQCAtMTI5MTAsOCArMTQxMDQsOCBAQAogCiAKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjQ1OTY6NTk6IChpdl9ydWxlWE1lbWJlckZlYXR1cmVDYWxsPSBydWxlWE1lbWJlckZlYXR1cmVDYWxsIEVPRiApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo0NTk3OjI6IGl2X3J1bGVYTWVtYmVyRmVhdHVyZUNhbGw9IHJ1bGVYTWVtYmVyRmVhdHVyZUNhbGwgRU9GCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo1MDM1OjU5OiAoaXZfcnVsZVhNZW1iZXJGZWF0dXJlQ2FsbD0gcnVsZVhNZW1iZXJGZWF0dXJlQ2FsbCBFT0YgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NTAzNjoyOiBpdl9ydWxlWE1lbWJlckZlYXR1cmVDYWxsPSBydWxlWE1lbWJlckZlYXR1cmVDYWxsIEVPRgogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBuZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0WE1lbWJlckZlYXR1cmVDYWxsUnVsZSgpKTsgCkBAIC0xMjk0Miw3ICsxNDEzNiw3IEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZVhNZW1iZXJGZWF0dXJlQ2FsbCIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo0NjAzOjE6IHJ1bGVYTWVtYmVyRmVhdHVyZUNhbGwgcmV0dXJucyBbRU9iamVjdCBjdXJyZW50PW51bGxdIDogKHRoaXNfWFByaW1hcnlFeHByZXNzaW9uXzA9IHJ1bGVYUHJpbWFyeUV4cHJlc3Npb24gKCAoICggKCAoICgpICggJy4nIHwgKCAoICc6OicgKSApICkgKCAoIHJ1bGVGZWF0dXJlQ2FsbElEICkgKSBydWxlT3BTaW5nbGVBc3NpZ24gKSApPT4gKCAoKSAob3RoZXJsdl8yPSAnLicgfCAoIChsdl9leHBsaWNpdFN0YXRpY18zXzA9ICc6OicgKSApICkgKCAoIHJ1bGVGZWF0dXJlQ2FsbElEICkgKSBydWxlT3BTaW5nbGVBc3NpZ24gKSApICggKGx2X3ZhbHVlXzZfMD0gcnVsZVhBc3NpZ25tZW50ICkgKSApIHwgKCAoICggKCAoKSAoICcuJyB8ICggKCAnPy4nICkgKSB8ICggKCAnOjonICkgKSApICkgKT0+ICggKCkgKG90aGVybHZfOD0gJy4nIHwgKCAobHZfbnVsbFNhZmVfOV8wPSAnPy4nICkgKSB8ICggKGx2X2V4cGxpY2l0U3RhdGljXzEwXzA9ICc6OicgKSApICkgKSApIChvdGhlcmx2XzExPSAnPCcgKCAobHZfdHlwZUFyZ3VtZW50c18xMl8wPSBydWxlSnZtQXJndW1lbnRUeXBlUmVmZXJlbmNlICkgKSAob3RoZXJsdl8xMz0gJywnICggKGx2X3R5cGVBcmd1bWVudHNfMTRfMD0gcnVsZUp2bUFyZ3VtZW50VHlwZVJlZmVyZW5jZSApICkgKSogb3RoZXJsdl8xNT0gJz4nICk/ICggKCBydWxlSWRPclN1cGVyICkgKSAoICggKCAoICcoJyApICk9PiAobHZfZXhwbGljaXRPcGVyYXRpb25DYWxsXzE3XzA9ICcoJyApICkgKCAoICggKCAoKSAoICggKCBydWxlSnZtRm9ybWFsUGFyYW1ldGVyICkgKSAoICcsJyAoICggcnVsZUp2bUZvcm1hbFBhcmFtZXRlciApICkgKSogKT8gKCAoICd8JyApICkgKSApPT4gKGx2X21lbWJlckNhbGxBcmd1bWVudHNfMThfMD0gcnVsZVhTaG9ydENsb3N1cmUgKSApIHwgKCAoIChsdl9tZW1iZXJDYWxsQXJndW1lbnRzXzE5XzA9IHJ1bGVYRXhwcmVzc2lvbiApICkgKG90aGVybHZfMjA9ICcsJyAoIChsdl9tZW1iZXJDYWxsQXJndW1lbnRzXzIxXzA9IHJ1bGVYRXhwcmVzc2lvbiApICkgKSogKSApPyBvdGhlcmx2XzIyPSAnKScgKT8gKCAoICggKCkgJ1snICkgKT0+IChsdl9tZW1iZXJDYWxsQXJndW1lbnRzXzIzXzA9IHJ1bGVYQ2xvc3VyZSApICk/ICkgKSogKSA7CisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NTA0MjoxOiBydWxlWE1lbWJlckZlYXR1cmVDYWxsIHJldHVybnMgW0VPYmplY3QgY3VycmVudD1udWxsXSA6ICh0aGlzX1hQcmltYXJ5RXhwcmVzc2lvbl8wPSBydWxlWFByaW1hcnlFeHByZXNzaW9uICggKCAoICggKCAoKSAoICcuJyB8ICggKCAnOjonICkgKSApICggKCBydWxlRmVhdHVyZUNhbGxJRCApICkgcnVsZU9wU2luZ2xlQXNzaWduICkgKT0+ICggKCkgKG90aGVybHZfMj0gJy4nIHwgKCAobHZfZXhwbGljaXRTdGF0aWNfM18wPSAnOjonICkgKSApICggKCBydWxlRmVhdHVyZUNhbGxJRCApICkgcnVsZU9wU2luZ2xlQXNzaWduICkgKSAoIChsdl92YWx1ZV82XzA9IHJ1bGVYQXNzaWdubWVudCApICkgKSB8ICggKCAoICggKCkgKCAnLicgfCAoICggJz8uJyApICkgfCAoICggJzo6JyApICkgKSApICk9PiAoICgpIChvdGhlcmx2Xzg9ICcuJyB8ICggKGx2X251bGxTYWZlXzlfMD0gJz8uJyApICkgfCAoIChsdl9leHBsaWNpdFN0YXRpY18xMF8wPSAnOjonICkgKSApICkgKSAob3RoZXJsdl8xMT0gJzwnICggKGx2X3R5cGVBcmd1bWVudHNfMTJfMD0gcnVsZUp2bUFyZ3VtZW50VHlwZVJlZmVyZW5jZSApICkgKG90aGVybHZfMTM9ICcsJyAoIChsdl90eXBlQXJndW1lbnRzXzE0XzA9IHJ1bGVKdm1Bcmd1bWVudFR5cGVSZWZlcmVuY2UgKSApICkqIG90aGVybHZfMTU9ICc+JyApPyAoICggcnVsZUlkT3JTdXBlciApICkgKCAoICggKCAnKCcgKSApPT4gKGx2X2V4cGxpY2l0T3BlcmF0aW9uQ2FsbF8xN18wPSAnKCcgKSApICggKCAoICggKCkgKCAoICggcnVsZUp2bUZvcm1hbFBhcmFtZXRlciApICkgKCAnLCcgKCAoIHJ1bGVKdm1Gb3JtYWxQYXJhbWV0ZXIgKSApICkqICk/ICggKCAnfCcgKSApICkgKT0+IChsdl9tZW1iZXJDYWxsQXJndW1lbnRzXzE4XzA9IHJ1bGVYU2hvcnRDbG9zdXJlICkgKSB8ICggKCAobHZfbWVtYmVyQ2FsbEFyZ3VtZW50c18xOV8wPSBydWxlWEV4cHJlc3Npb24gKSApIChvdGhlcmx2XzIwPSAnLCcgKCAobHZfbWVtYmVyQ2FsbEFyZ3VtZW50c18yMV8wPSBydWxlWEV4cHJlc3Npb24gKSApICkqICkgKT8gb3RoZXJsdl8yMj0gJyknICk/ICggKCAoICgpICdbJyApICk9PiAobHZfbWVtYmVyQ2FsbEFyZ3VtZW50c18yM18wPSBydWxlWENsb3N1cmUgKSApPyApICkqICkgOwogICAgIHB1YmxpYyBmaW5hbCBFT2JqZWN0IHJ1bGVYTWVtYmVyRmVhdHVyZUNhbGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogICAgICAgICBFT2JqZWN0IGN1cnJlbnQgPSBudWxsOwogCkBAIC0xMjk3OCwxOCArMTQxNzIsMTggQEAKICAgICAgICAgCWVudGVyUnVsZSgpOwogCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo0NjA5OjI6ICggKHRoaXNfWFByaW1hcnlFeHByZXNzaW9uXzA9IHJ1bGVYUHJpbWFyeUV4cHJlc3Npb24gKCAoICggKCAoICgpICggJy4nIHwgKCAoICc6OicgKSApICkgKCAoIHJ1bGVGZWF0dXJlQ2FsbElEICkgKSBydWxlT3BTaW5nbGVBc3NpZ24gKSApPT4gKCAoKSAob3RoZXJsdl8yPSAnLicgfCAoIChsdl9leHBsaWNpdFN0YXRpY18zXzA9ICc6OicgKSApICkgKCAoIHJ1bGVGZWF0dXJlQ2FsbElEICkgKSBydWxlT3BTaW5nbGVBc3NpZ24gKSApICggKGx2X3ZhbHVlXzZfMD0gcnVsZVhBc3NpZ25tZW50ICkgKSApIHwgKCAoICggKCAoKSAoICcuJyB8ICggKCAnPy4nICkgKSB8ICggKCAnOjonICkgKSApICkgKT0+ICggKCkgKG90aGVybHZfOD0gJy4nIHwgKCAobHZfbnVsbFNhZmVfOV8wPSAnPy4nICkgKSB8ICggKGx2X2V4cGxpY2l0U3RhdGljXzEwXzA9ICc6OicgKSApICkgKSApIChvdGhlcmx2XzExPSAnPCcgKCAobHZfdHlwZUFyZ3VtZW50c18xMl8wPSBydWxlSnZtQXJndW1lbnRUeXBlUmVmZXJlbmNlICkgKSAob3RoZXJsdl8xMz0gJywnICggKGx2X3R5cGVBcmd1bWVudHNfMTRfMD0gcnVsZUp2bUFyZ3VtZW50VHlwZVJlZmVyZW5jZSApICkgKSogb3RoZXJsdl8xNT0gJz4nICk/ICggKCBydWxlSWRPclN1cGVyICkgKSAoICggKCAoICcoJyApICk9PiAobHZfZXhwbGljaXRPcGVyYXRpb25DYWxsXzE3XzA9ICcoJyApICkgKCAoICggKCAoKSAoICggKCBydWxlSnZtRm9ybWFsUGFyYW1ldGVyICkgKSAoICcsJyAoICggcnVsZUp2bUZvcm1hbFBhcmFtZXRlciApICkgKSogKT8gKCAoICd8JyApICkgKSApPT4gKGx2X21lbWJlckNhbGxBcmd1bWVudHNfMThfMD0gcnVsZVhTaG9ydENsb3N1cmUgKSApIHwgKCAoIChsdl9tZW1iZXJDYWxsQXJndW1lbnRzXzE5XzA9IHJ1bGVYRXhwcmVzc2lvbiApICkgKG90aGVybHZfMjA9ICcsJyAoIChsdl9tZW1iZXJDYWxsQXJndW1lbnRzXzIxXzA9IHJ1bGVYRXhwcmVzc2lvbiApICkgKSogKSApPyBvdGhlcmx2XzIyPSAnKScgKT8gKCAoICggKCkgJ1snICkgKT0+IChsdl9tZW1iZXJDYWxsQXJndW1lbnRzXzIzXzA9IHJ1bGVYQ2xvc3VyZSApICk/ICkgKSogKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo0NjEwOjI6ICh0aGlzX1hQcmltYXJ5RXhwcmVzc2lvbl8wPSBydWxlWFByaW1hcnlFeHByZXNzaW9uICggKCAoICggKCAoKSAoICcuJyB8ICggKCAnOjonICkgKSApICggKCBydWxlRmVhdHVyZUNhbGxJRCApICkgcnVsZU9wU2luZ2xlQXNzaWduICkgKT0+ICggKCkgKG90aGVybHZfMj0gJy4nIHwgKCAobHZfZXhwbGljaXRTdGF0aWNfM18wPSAnOjonICkgKSApICggKCBydWxlRmVhdHVyZUNhbGxJRCApICkgcnVsZU9wU2luZ2xlQXNzaWduICkgKSAoIChsdl92YWx1ZV82XzA9IHJ1bGVYQXNzaWdubWVudCApICkgKSB8ICggKCAoICggKCkgKCAnLicgfCAoICggJz8uJyApICkgfCAoICggJzo6JyApICkgKSApICk9PiAoICgpIChvdGhlcmx2Xzg9ICcuJyB8ICggKGx2X251bGxTYWZlXzlfMD0gJz8uJyApICkgfCAoIChsdl9leHBsaWNpdFN0YXRpY18xMF8wPSAnOjonICkgKSApICkgKSAob3RoZXJsdl8xMT0gJzwnICggKGx2X3R5cGVBcmd1bWVudHNfMTJfMD0gcnVsZUp2bUFyZ3VtZW50VHlwZVJlZmVyZW5jZSApICkgKG90aGVybHZfMTM9ICcsJyAoIChsdl90eXBlQXJndW1lbnRzXzE0XzA9IHJ1bGVKdm1Bcmd1bWVudFR5cGVSZWZlcmVuY2UgKSApICkqIG90aGVybHZfMTU9ICc+JyApPyAoICggcnVsZUlkT3JTdXBlciApICkgKCAoICggKCAnKCcgKSApPT4gKGx2X2V4cGxpY2l0T3BlcmF0aW9uQ2FsbF8xN18wPSAnKCcgKSApICggKCAoICggKCkgKCAoICggcnVsZUp2bUZvcm1hbFBhcmFtZXRlciApICkgKCAnLCcgKCAoIHJ1bGVKdm1Gb3JtYWxQYXJhbWV0ZXIgKSApICkqICk/ICggKCAnfCcgKSApICkgKT0+IChsdl9tZW1iZXJDYWxsQXJndW1lbnRzXzE4XzA9IHJ1bGVYU2hvcnRDbG9zdXJlICkgKSB8ICggKCAobHZfbWVtYmVyQ2FsbEFyZ3VtZW50c18xOV8wPSBydWxlWEV4cHJlc3Npb24gKSApIChvdGhlcmx2XzIwPSAnLCcgKCAobHZfbWVtYmVyQ2FsbEFyZ3VtZW50c18yMV8wPSBydWxlWEV4cHJlc3Npb24gKSApICkqICkgKT8gb3RoZXJsdl8yMj0gJyknICk/ICggKCAoICgpICdbJyApICk9PiAobHZfbWVtYmVyQ2FsbEFyZ3VtZW50c18yM18wPSBydWxlWENsb3N1cmUgKSApPyApICkqICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjUwNDg6MjogKCAodGhpc19YUHJpbWFyeUV4cHJlc3Npb25fMD0gcnVsZVhQcmltYXJ5RXhwcmVzc2lvbiAoICggKCAoICggKCkgKCAnLicgfCAoICggJzo6JyApICkgKSAoICggcnVsZUZlYXR1cmVDYWxsSUQgKSApIHJ1bGVPcFNpbmdsZUFzc2lnbiApICk9PiAoICgpIChvdGhlcmx2XzI9ICcuJyB8ICggKGx2X2V4cGxpY2l0U3RhdGljXzNfMD0gJzo6JyApICkgKSAoICggcnVsZUZlYXR1cmVDYWxsSUQgKSApIHJ1bGVPcFNpbmdsZUFzc2lnbiApICkgKCAobHZfdmFsdWVfNl8wPSBydWxlWEFzc2lnbm1lbnQgKSApICkgfCAoICggKCAoICgpICggJy4nIHwgKCAoICc/LicgKSApIHwgKCAoICc6OicgKSApICkgKSApPT4gKCAoKSAob3RoZXJsdl84PSAnLicgfCAoIChsdl9udWxsU2FmZV85XzA9ICc/LicgKSApIHwgKCAobHZfZXhwbGljaXRTdGF0aWNfMTBfMD0gJzo6JyApICkgKSApICkgKG90aGVybHZfMTE9ICc8JyAoIChsdl90eXBlQXJndW1lbnRzXzEyXzA9IHJ1bGVKdm1Bcmd1bWVudFR5cGVSZWZlcmVuY2UgKSApIChvdGhlcmx2XzEzPSAnLCcgKCAobHZfdHlwZUFyZ3VtZW50c18xNF8wPSBydWxlSnZtQXJndW1lbnRUeXBlUmVmZXJlbmNlICkgKSApKiBvdGhlcmx2XzE1PSAnPicgKT8gKCAoIHJ1bGVJZE9yU3VwZXIgKSApICggKCAoICggJygnICkgKT0+IChsdl9leHBsaWNpdE9wZXJhdGlvbkNhbGxfMTdfMD0gJygnICkgKSAoICggKCAoICgpICggKCAoIHJ1bGVKdm1Gb3JtYWxQYXJhbWV0ZXIgKSApICggJywnICggKCBydWxlSnZtRm9ybWFsUGFyYW1ldGVyICkgKSApKiApPyAoICggJ3wnICkgKSApICk9PiAobHZfbWVtYmVyQ2FsbEFyZ3VtZW50c18xOF8wPSBydWxlWFNob3J0Q2xvc3VyZSApICkgfCAoICggKGx2X21lbWJlckNhbGxBcmd1bWVudHNfMTlfMD0gcnVsZVhFeHByZXNzaW9uICkgKSAob3RoZXJsdl8yMD0gJywnICggKGx2X21lbWJlckNhbGxBcmd1bWVudHNfMjFfMD0gcnVsZVhFeHByZXNzaW9uICkgKSApKiApICk/IG90aGVybHZfMjI9ICcpJyApPyAoICggKCAoKSAnWycgKSApPT4gKGx2X21lbWJlckNhbGxBcmd1bWVudHNfMjNfMD0gcnVsZVhDbG9zdXJlICkgKT8gKSApKiApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjUwNDk6MjogKHRoaXNfWFByaW1hcnlFeHByZXNzaW9uXzA9IHJ1bGVYUHJpbWFyeUV4cHJlc3Npb24gKCAoICggKCAoICgpICggJy4nIHwgKCAoICc6OicgKSApICkgKCAoIHJ1bGVGZWF0dXJlQ2FsbElEICkgKSBydWxlT3BTaW5nbGVBc3NpZ24gKSApPT4gKCAoKSAob3RoZXJsdl8yPSAnLicgfCAoIChsdl9leHBsaWNpdFN0YXRpY18zXzA9ICc6OicgKSApICkgKCAoIHJ1bGVGZWF0dXJlQ2FsbElEICkgKSBydWxlT3BTaW5nbGVBc3NpZ24gKSApICggKGx2X3ZhbHVlXzZfMD0gcnVsZVhBc3NpZ25tZW50ICkgKSApIHwgKCAoICggKCAoKSAoICcuJyB8ICggKCAnPy4nICkgKSB8ICggKCAnOjonICkgKSApICkgKT0+ICggKCkgKG90aGVybHZfOD0gJy4nIHwgKCAobHZfbnVsbFNhZmVfOV8wPSAnPy4nICkgKSB8ICggKGx2X2V4cGxpY2l0U3RhdGljXzEwXzA9ICc6OicgKSApICkgKSApIChvdGhlcmx2XzExPSAnPCcgKCAobHZfdHlwZUFyZ3VtZW50c18xMl8wPSBydWxlSnZtQXJndW1lbnRUeXBlUmVmZXJlbmNlICkgKSAob3RoZXJsdl8xMz0gJywnICggKGx2X3R5cGVBcmd1bWVudHNfMTRfMD0gcnVsZUp2bUFyZ3VtZW50VHlwZVJlZmVyZW5jZSApICkgKSogb3RoZXJsdl8xNT0gJz4nICk/ICggKCBydWxlSWRPclN1cGVyICkgKSAoICggKCAoICcoJyApICk9PiAobHZfZXhwbGljaXRPcGVyYXRpb25DYWxsXzE3XzA9ICcoJyApICkgKCAoICggKCAoKSAoICggKCBydWxlSnZtRm9ybWFsUGFyYW1ldGVyICkgKSAoICcsJyAoICggcnVsZUp2bUZvcm1hbFBhcmFtZXRlciApICkgKSogKT8gKCAoICd8JyApICkgKSApPT4gKGx2X21lbWJlckNhbGxBcmd1bWVudHNfMThfMD0gcnVsZVhTaG9ydENsb3N1cmUgKSApIHwgKCAoIChsdl9tZW1iZXJDYWxsQXJndW1lbnRzXzE5XzA9IHJ1bGVYRXhwcmVzc2lvbiApICkgKG90aGVybHZfMjA9ICcsJyAoIChsdl9tZW1iZXJDYWxsQXJndW1lbnRzXzIxXzA9IHJ1bGVYRXhwcmVzc2lvbiApICkgKSogKSApPyBvdGhlcmx2XzIyPSAnKScgKT8gKCAoICggKCkgJ1snICkgKT0+IChsdl9tZW1iZXJDYWxsQXJndW1lbnRzXzIzXzA9IHJ1bGVYQ2xvc3VyZSApICk/ICkgKSogKQogICAgICAgICAgICAgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NDYxMDoyOiAodGhpc19YUHJpbWFyeUV4cHJlc3Npb25fMD0gcnVsZVhQcmltYXJ5RXhwcmVzc2lvbiAoICggKCAoICggKCkgKCAnLicgfCAoICggJzo6JyApICkgKSAoICggcnVsZUZlYXR1cmVDYWxsSUQgKSApIHJ1bGVPcFNpbmdsZUFzc2lnbiApICk9PiAoICgpIChvdGhlcmx2XzI9ICcuJyB8ICggKGx2X2V4cGxpY2l0U3RhdGljXzNfMD0gJzo6JyApICkgKSAoICggcnVsZUZlYXR1cmVDYWxsSUQgKSApIHJ1bGVPcFNpbmdsZUFzc2lnbiApICkgKCAobHZfdmFsdWVfNl8wPSBydWxlWEFzc2lnbm1lbnQgKSApICkgfCAoICggKCAoICgpICggJy4nIHwgKCAoICc/LicgKSApIHwgKCAoICc6OicgKSApICkgKSApPT4gKCAoKSAob3RoZXJsdl84PSAnLicgfCAoIChsdl9udWxsU2FmZV85XzA9ICc/LicgKSApIHwgKCAobHZfZXhwbGljaXRTdGF0aWNfMTBfMD0gJzo6JyApICkgKSApICkgKG90aGVybHZfMTE9ICc8JyAoIChsdl90eXBlQXJndW1lbnRzXzEyXzA9IHJ1bGVKdm1Bcmd1bWVudFR5cGVSZWZlcmVuY2UgKSApIChvdGhlcmx2XzEzPSAnLCcgKCAobHZfdHlwZUFyZ3VtZW50c18xNF8wPSBydWxlSnZtQXJndW1lbnRUeXBlUmVmZXJlbmNlICkgKSApKiBvdGhlcmx2XzE1PSAnPicgKT8gKCAoIHJ1bGVJZE9yU3VwZXIgKSApICggKCAoICggJygnICkgKT0+IChsdl9leHBsaWNpdE9wZXJhdGlvbkNhbGxfMTdfMD0gJygnICkgKSAoICggKCAoICgpICggKCAoIHJ1bGVKdm1Gb3JtYWxQYXJhbWV0ZXIgKSApICggJywnICggKCBydWxlSnZtRm9ybWFsUGFyYW1ldGVyICkgKSApKiApPyAoICggJ3wnICkgKSApICk9PiAobHZfbWVtYmVyQ2FsbEFyZ3VtZW50c18xOF8wPSBydWxlWFNob3J0Q2xvc3VyZSApICkgfCAoICggKGx2X21lbWJlckNhbGxBcmd1bWVudHNfMTlfMD0gcnVsZVhFeHByZXNzaW9uICkgKSAob3RoZXJsdl8yMD0gJywnICggKGx2X21lbWJlckNhbGxBcmd1bWVudHNfMjFfMD0gcnVsZVhFeHByZXNzaW9uICkgKSApKiApICk/IG90aGVybHZfMjI9ICcpJyApPyAoICggKCAoKSAnWycgKSApPT4gKGx2X21lbWJlckNhbGxBcmd1bWVudHNfMjNfMD0gcnVsZVhDbG9zdXJlICkgKT8gKSApKiApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo0NjExOjM6IHRoaXNfWFByaW1hcnlFeHByZXNzaW9uXzA9IHJ1bGVYUHJpbWFyeUV4cHJlc3Npb24gKCAoICggKCAoICgpICggJy4nIHwgKCAoICc6OicgKSApICkgKCAoIHJ1bGVGZWF0dXJlQ2FsbElEICkgKSBydWxlT3BTaW5nbGVBc3NpZ24gKSApPT4gKCAoKSAob3RoZXJsdl8yPSAnLicgfCAoIChsdl9leHBsaWNpdFN0YXRpY18zXzA9ICc6OicgKSApICkgKCAoIHJ1bGVGZWF0dXJlQ2FsbElEICkgKSBydWxlT3BTaW5nbGVBc3NpZ24gKSApICggKGx2X3ZhbHVlXzZfMD0gcnVsZVhBc3NpZ25tZW50ICkgKSApIHwgKCAoICggKCAoKSAoICcuJyB8ICggKCAnPy4nICkgKSB8ICggKCAnOjonICkgKSApICkgKT0+ICggKCkgKG90aGVybHZfOD0gJy4nIHwgKCAobHZfbnVsbFNhZmVfOV8wPSAnPy4nICkgKSB8ICggKGx2X2V4cGxpY2l0U3RhdGljXzEwXzA9ICc6OicgKSApICkgKSApIChvdGhlcmx2XzExPSAnPCcgKCAobHZfdHlwZUFyZ3VtZW50c18xMl8wPSBydWxlSnZtQXJndW1lbnRUeXBlUmVmZXJlbmNlICkgKSAob3RoZXJsdl8xMz0gJywnICggKGx2X3R5cGVBcmd1bWVudHNfMTRfMD0gcnVsZUp2bUFyZ3VtZW50VHlwZVJlZmVyZW5jZSApICkgKSogb3RoZXJsdl8xNT0gJz4nICk/ICggKCBydWxlSWRPclN1cGVyICkgKSAoICggKCAoICcoJyApICk9PiAobHZfZXhwbGljaXRPcGVyYXRpb25DYWxsXzE3XzA9ICcoJyApICkgKCAoICggKCAoKSAoICggKCBydWxlSnZtRm9ybWFsUGFyYW1ldGVyICkgKSAoICcsJyAoICggcnVsZUp2bUZvcm1hbFBhcmFtZXRlciApICkgKSogKT8gKCAoICd8JyApICkgKSApPT4gKGx2X21lbWJlckNhbGxBcmd1bWVudHNfMThfMD0gcnVsZVhTaG9ydENsb3N1cmUgKSApIHwgKCAoIChsdl9tZW1iZXJDYWxsQXJndW1lbnRzXzE5XzA9IHJ1bGVYRXhwcmVzc2lvbiApICkgKG90aGVybHZfMjA9ICcsJyAoIChsdl9tZW1iZXJDYWxsQXJndW1lbnRzXzIxXzA9IHJ1bGVYRXhwcmVzc2lvbiApICkgKSogKSApPyBvdGhlcmx2XzIyPSAnKScgKT8gKCAoICggKCkgJ1snICkgKT0+IChsdl9tZW1iZXJDYWxsQXJndW1lbnRzXzIzXzA9IHJ1bGVYQ2xvc3VyZSApICk/ICkgKSoKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjUwNDk6MjogKHRoaXNfWFByaW1hcnlFeHByZXNzaW9uXzA9IHJ1bGVYUHJpbWFyeUV4cHJlc3Npb24gKCAoICggKCAoICgpICggJy4nIHwgKCAoICc6OicgKSApICkgKCAoIHJ1bGVGZWF0dXJlQ2FsbElEICkgKSBydWxlT3BTaW5nbGVBc3NpZ24gKSApPT4gKCAoKSAob3RoZXJsdl8yPSAnLicgfCAoIChsdl9leHBsaWNpdFN0YXRpY18zXzA9ICc6OicgKSApICkgKCAoIHJ1bGVGZWF0dXJlQ2FsbElEICkgKSBydWxlT3BTaW5nbGVBc3NpZ24gKSApICggKGx2X3ZhbHVlXzZfMD0gcnVsZVhBc3NpZ25tZW50ICkgKSApIHwgKCAoICggKCAoKSAoICcuJyB8ICggKCAnPy4nICkgKSB8ICggKCAnOjonICkgKSApICkgKT0+ICggKCkgKG90aGVybHZfOD0gJy4nIHwgKCAobHZfbnVsbFNhZmVfOV8wPSAnPy4nICkgKSB8ICggKGx2X2V4cGxpY2l0U3RhdGljXzEwXzA9ICc6OicgKSApICkgKSApIChvdGhlcmx2XzExPSAnPCcgKCAobHZfdHlwZUFyZ3VtZW50c18xMl8wPSBydWxlSnZtQXJndW1lbnRUeXBlUmVmZXJlbmNlICkgKSAob3RoZXJsdl8xMz0gJywnICggKGx2X3R5cGVBcmd1bWVudHNfMTRfMD0gcnVsZUp2bUFyZ3VtZW50VHlwZVJlZmVyZW5jZSApICkgKSogb3RoZXJsdl8xNT0gJz4nICk/ICggKCBydWxlSWRPclN1cGVyICkgKSAoICggKCAoICcoJyApICk9PiAobHZfZXhwbGljaXRPcGVyYXRpb25DYWxsXzE3XzA9ICcoJyApICkgKCAoICggKCAoKSAoICggKCBydWxlSnZtRm9ybWFsUGFyYW1ldGVyICkgKSAoICcsJyAoICggcnVsZUp2bUZvcm1hbFBhcmFtZXRlciApICkgKSogKT8gKCAoICd8JyApICkgKSApPT4gKGx2X21lbWJlckNhbGxBcmd1bWVudHNfMThfMD0gcnVsZVhTaG9ydENsb3N1cmUgKSApIHwgKCAoIChsdl9tZW1iZXJDYWxsQXJndW1lbnRzXzE5XzA9IHJ1bGVYRXhwcmVzc2lvbiApICkgKG90aGVybHZfMjA9ICcsJyAoIChsdl9tZW1iZXJDYWxsQXJndW1lbnRzXzIxXzA9IHJ1bGVYRXhwcmVzc2lvbiApICkgKSogKSApPyBvdGhlcmx2XzIyPSAnKScgKT8gKCAoICggKCkgJ1snICkgKT0+IChsdl9tZW1iZXJDYWxsQXJndW1lbnRzXzIzXzA9IHJ1bGVYQ2xvc3VyZSApICk/ICkgKSogKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NTA1MDozOiB0aGlzX1hQcmltYXJ5RXhwcmVzc2lvbl8wPSBydWxlWFByaW1hcnlFeHByZXNzaW9uICggKCAoICggKCAoKSAoICcuJyB8ICggKCAnOjonICkgKSApICggKCBydWxlRmVhdHVyZUNhbGxJRCApICkgcnVsZU9wU2luZ2xlQXNzaWduICkgKT0+ICggKCkgKG90aGVybHZfMj0gJy4nIHwgKCAobHZfZXhwbGljaXRTdGF0aWNfM18wPSAnOjonICkgKSApICggKCBydWxlRmVhdHVyZUNhbGxJRCApICkgcnVsZU9wU2luZ2xlQXNzaWduICkgKSAoIChsdl92YWx1ZV82XzA9IHJ1bGVYQXNzaWdubWVudCApICkgKSB8ICggKCAoICggKCkgKCAnLicgfCAoICggJz8uJyApICkgfCAoICggJzo6JyApICkgKSApICk9PiAoICgpIChvdGhlcmx2Xzg9ICcuJyB8ICggKGx2X251bGxTYWZlXzlfMD0gJz8uJyApICkgfCAoIChsdl9leHBsaWNpdFN0YXRpY18xMF8wPSAnOjonICkgKSApICkgKSAob3RoZXJsdl8xMT0gJzwnICggKGx2X3R5cGVBcmd1bWVudHNfMTJfMD0gcnVsZUp2bUFyZ3VtZW50VHlwZVJlZmVyZW5jZSApICkgKG90aGVybHZfMTM9ICcsJyAoIChsdl90eXBlQXJndW1lbnRzXzE0XzA9IHJ1bGVKdm1Bcmd1bWVudFR5cGVSZWZlcmVuY2UgKSApICkqIG90aGVybHZfMTU9ICc+JyApPyAoICggcnVsZUlkT3JTdXBlciApICkgKCAoICggKCAnKCcgKSApPT4gKGx2X2V4cGxpY2l0T3BlcmF0aW9uQ2FsbF8xN18wPSAnKCcgKSApICggKCAoICggKCkgKCAoICggcnVsZUp2bUZvcm1hbFBhcmFtZXRlciApICkgKCAnLCcgKCAoIHJ1bGVKdm1Gb3JtYWxQYXJhbWV0ZXIgKSApICkqICk/ICggKCAnfCcgKSApICkgKT0+IChsdl9tZW1iZXJDYWxsQXJndW1lbnRzXzE4XzA9IHJ1bGVYU2hvcnRDbG9zdXJlICkgKSB8ICggKCAobHZfbWVtYmVyQ2FsbEFyZ3VtZW50c18xOV8wPSBydWxlWEV4cHJlc3Npb24gKSApIChvdGhlcmx2XzIwPSAnLCcgKCAobHZfbWVtYmVyQ2FsbEFyZ3VtZW50c18yMV8wPSBydWxlWEV4cHJlc3Npb24gKSApICkqICkgKT8gb3RoZXJsdl8yMj0gJyknICk/ICggKCAoICgpICdbJyApICk9PiAobHZfbWVtYmVyQ2FsbEFyZ3VtZW50c18yM18wPSBydWxlWENsb3N1cmUgKSApPyApICkqCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKIAogICAgICAgICAgICAgICAJCQluZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0WE1lbWJlckZlYXR1cmVDYWxsQWNjZXNzKCkuZ2V0WFByaW1hcnlFeHByZXNzaW9uUGFyc2VyUnVsZUNhbGxfMCgpKTsKICAgICAgICAgICAgICAgCQkKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzg2KTsKKyAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzEwMCk7CiAgICAgICAgICAgICB0aGlzX1hQcmltYXJ5RXhwcmVzc2lvbl8wPXJ1bGVYUHJpbWFyeUV4cHJlc3Npb24oKTsKIAogICAgICAgICAgICAgc3RhdGUuX2ZzcC0tOwpAQCAtMTMwMDAsNDUgKzE0MTk0LDQ1IEBACiAgICAgICAgICAgICAgIAkJCWFmdGVyUGFyc2VyT3JFbnVtUnVsZUNhbGwoKTsKICAgICAgICAgICAgICAgCQkKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjQ2MTk6MzogKCAoICggKCAoICgpICggJy4nIHwgKCAoICc6OicgKSApICkgKCAoIHJ1bGVGZWF0dXJlQ2FsbElEICkgKSBydWxlT3BTaW5nbGVBc3NpZ24gKSApPT4gKCAoKSAob3RoZXJsdl8yPSAnLicgfCAoIChsdl9leHBsaWNpdFN0YXRpY18zXzA9ICc6OicgKSApICkgKCAoIHJ1bGVGZWF0dXJlQ2FsbElEICkgKSBydWxlT3BTaW5nbGVBc3NpZ24gKSApICggKGx2X3ZhbHVlXzZfMD0gcnVsZVhBc3NpZ25tZW50ICkgKSApIHwgKCAoICggKCAoKSAoICcuJyB8ICggKCAnPy4nICkgKSB8ICggKCAnOjonICkgKSApICkgKT0+ICggKCkgKG90aGVybHZfOD0gJy4nIHwgKCAobHZfbnVsbFNhZmVfOV8wPSAnPy4nICkgKSB8ICggKGx2X2V4cGxpY2l0U3RhdGljXzEwXzA9ICc6OicgKSApICkgKSApIChvdGhlcmx2XzExPSAnPCcgKCAobHZfdHlwZUFyZ3VtZW50c18xMl8wPSBydWxlSnZtQXJndW1lbnRUeXBlUmVmZXJlbmNlICkgKSAob3RoZXJsdl8xMz0gJywnICggKGx2X3R5cGVBcmd1bWVudHNfMTRfMD0gcnVsZUp2bUFyZ3VtZW50VHlwZVJlZmVyZW5jZSApICkgKSogb3RoZXJsdl8xNT0gJz4nICk/ICggKCBydWxlSWRPclN1cGVyICkgKSAoICggKCAoICcoJyApICk9PiAobHZfZXhwbGljaXRPcGVyYXRpb25DYWxsXzE3XzA9ICcoJyApICkgKCAoICggKCAoKSAoICggKCBydWxlSnZtRm9ybWFsUGFyYW1ldGVyICkgKSAoICcsJyAoICggcnVsZUp2bUZvcm1hbFBhcmFtZXRlciApICkgKSogKT8gKCAoICd8JyApICkgKSApPT4gKGx2X21lbWJlckNhbGxBcmd1bWVudHNfMThfMD0gcnVsZVhTaG9ydENsb3N1cmUgKSApIHwgKCAoIChsdl9tZW1iZXJDYWxsQXJndW1lbnRzXzE5XzA9IHJ1bGVYRXhwcmVzc2lvbiApICkgKG90aGVybHZfMjA9ICcsJyAoIChsdl9tZW1iZXJDYWxsQXJndW1lbnRzXzIxXzA9IHJ1bGVYRXhwcmVzc2lvbiApICkgKSogKSApPyBvdGhlcmx2XzIyPSAnKScgKT8gKCAoICggKCkgJ1snICkgKT0+IChsdl9tZW1iZXJDYWxsQXJndW1lbnRzXzIzXzA9IHJ1bGVYQ2xvc3VyZSApICk/ICkgKSoKLSAgICAgICAgICAgIGxvb3A4NjoKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjUwNTg6MzogKCAoICggKCAoICgpICggJy4nIHwgKCAoICc6OicgKSApICkgKCAoIHJ1bGVGZWF0dXJlQ2FsbElEICkgKSBydWxlT3BTaW5nbGVBc3NpZ24gKSApPT4gKCAoKSAob3RoZXJsdl8yPSAnLicgfCAoIChsdl9leHBsaWNpdFN0YXRpY18zXzA9ICc6OicgKSApICkgKCAoIHJ1bGVGZWF0dXJlQ2FsbElEICkgKSBydWxlT3BTaW5nbGVBc3NpZ24gKSApICggKGx2X3ZhbHVlXzZfMD0gcnVsZVhBc3NpZ25tZW50ICkgKSApIHwgKCAoICggKCAoKSAoICcuJyB8ICggKCAnPy4nICkgKSB8ICggKCAnOjonICkgKSApICkgKT0+ICggKCkgKG90aGVybHZfOD0gJy4nIHwgKCAobHZfbnVsbFNhZmVfOV8wPSAnPy4nICkgKSB8ICggKGx2X2V4cGxpY2l0U3RhdGljXzEwXzA9ICc6OicgKSApICkgKSApIChvdGhlcmx2XzExPSAnPCcgKCAobHZfdHlwZUFyZ3VtZW50c18xMl8wPSBydWxlSnZtQXJndW1lbnRUeXBlUmVmZXJlbmNlICkgKSAob3RoZXJsdl8xMz0gJywnICggKGx2X3R5cGVBcmd1bWVudHNfMTRfMD0gcnVsZUp2bUFyZ3VtZW50VHlwZVJlZmVyZW5jZSApICkgKSogb3RoZXJsdl8xNT0gJz4nICk/ICggKCBydWxlSWRPclN1cGVyICkgKSAoICggKCAoICcoJyApICk9PiAobHZfZXhwbGljaXRPcGVyYXRpb25DYWxsXzE3XzA9ICcoJyApICkgKCAoICggKCAoKSAoICggKCBydWxlSnZtRm9ybWFsUGFyYW1ldGVyICkgKSAoICcsJyAoICggcnVsZUp2bUZvcm1hbFBhcmFtZXRlciApICkgKSogKT8gKCAoICd8JyApICkgKSApPT4gKGx2X21lbWJlckNhbGxBcmd1bWVudHNfMThfMD0gcnVsZVhTaG9ydENsb3N1cmUgKSApIHwgKCAoIChsdl9tZW1iZXJDYWxsQXJndW1lbnRzXzE5XzA9IHJ1bGVYRXhwcmVzc2lvbiApICkgKG90aGVybHZfMjA9ICcsJyAoIChsdl9tZW1iZXJDYWxsQXJndW1lbnRzXzIxXzA9IHJ1bGVYRXhwcmVzc2lvbiApICkgKSogKSApPyBvdGhlcmx2XzIyPSAnKScgKT8gKCAoICggKCkgJ1snICkgKT0+IChsdl9tZW1iZXJDYWxsQXJndW1lbnRzXzIzXzA9IHJ1bGVYQ2xvc3VyZSApICk/ICkgKSoKKyAgICAgICAgICAgIGxvb3A5NzoKICAgICAgICAgICAgIGRvIHsKLSAgICAgICAgICAgICAgICBpbnQgYWx0ODY9MzsKKyAgICAgICAgICAgICAgICBpbnQgYWx0OTc9MzsKICAgICAgICAgICAgICAgICBzd2l0Y2ggKCBpbnB1dC5MQSgxKSApIHsKLSAgICAgICAgICAgICAgICBjYXNlIDY3OgorICAgICAgICAgICAgICAgIGNhc2UgNzQ6CiAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgaW50IExBODZfMiA9IGlucHV0LkxBKDIpOworICAgICAgICAgICAgICAgICAgICBpbnQgTEE5N18yID0gaW5wdXQuTEEoMik7CiAKICAgICAgICAgICAgICAgICAgICAgaWYgKCAoc3lucHJlZDIwX0ludGVybmFsRGF0YURTTCgpKSApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGFsdDg2PTE7CisgICAgICAgICAgICAgICAgICAgICAgICBhbHQ5Nz0xOwogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKCAoc3lucHJlZDIxX0ludGVybmFsRGF0YURTTCgpKSApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGFsdDg2PTI7CisgICAgICAgICAgICAgICAgICAgICAgICBhbHQ5Nz0yOwogICAgICAgICAgICAgICAgICAgICB9CiAKIAogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgMTEwOgorICAgICAgICAgICAgICAgIGNhc2UgMTE3OgogICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGludCBMQTg2XzMgPSBpbnB1dC5MQSgyKTsKKyAgICAgICAgICAgICAgICAgICAgaW50IExBOTdfMyA9IGlucHV0LkxBKDIpOwogCiAgICAgICAgICAgICAgICAgICAgIGlmICggKHN5bnByZWQyMF9JbnRlcm5hbERhdGFEU0woKSkgKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBhbHQ4Nj0xOworICAgICAgICAgICAgICAgICAgICAgICAgYWx0OTc9MTsKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICggKHN5bnByZWQyMV9JbnRlcm5hbERhdGFEU0woKSkgKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBhbHQ4Nj0yOworICAgICAgICAgICAgICAgICAgICAgICAgYWx0OTc9MjsKICAgICAgICAgICAgICAgICAgICAgfQogCiAKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlIDExMToKKyAgICAgICAgICAgICAgICBjYXNlIDExODoKICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBpbnQgTEE4Nl80ID0gaW5wdXQuTEEoMik7CisgICAgICAgICAgICAgICAgICAgIGludCBMQTk3XzQgPSBpbnB1dC5MQSgyKTsKIAogICAgICAgICAgICAgICAgICAgICBpZiAoIChzeW5wcmVkMjFfSW50ZXJuYWxEYXRhRFNMKCkpICkgewotICAgICAgICAgICAgICAgICAgICAgICAgYWx0ODY9MjsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFsdDk3PTI7CiAgICAgICAgICAgICAgICAgICAgIH0KIAogCkBAIC0xMzA0NywyMSArMTQyNDEsMjEgQEAKIAogICAgICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgICAgIHN3aXRjaCAoYWx0ODYpIHsKKyAgICAgICAgICAgICAgICBzd2l0Y2ggKGFsdDk3KSB7CiAgICAgICAgICAgICAJY2FzZSAxIDoKLSAgICAgICAgICAgIAkgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NDYyMDo0OiAoICggKCAoICgpICggJy4nIHwgKCAoICc6OicgKSApICkgKCAoIHJ1bGVGZWF0dXJlQ2FsbElEICkgKSBydWxlT3BTaW5nbGVBc3NpZ24gKSApPT4gKCAoKSAob3RoZXJsdl8yPSAnLicgfCAoIChsdl9leHBsaWNpdFN0YXRpY18zXzA9ICc6OicgKSApICkgKCAoIHJ1bGVGZWF0dXJlQ2FsbElEICkgKSBydWxlT3BTaW5nbGVBc3NpZ24gKSApICggKGx2X3ZhbHVlXzZfMD0gcnVsZVhBc3NpZ25tZW50ICkgKSApCisgICAgICAgICAgICAJICAgIC8vIEludGVybmFsRGF0YURTTC5nOjUwNTk6NDogKCAoICggKCAoKSAoICcuJyB8ICggKCAnOjonICkgKSApICggKCBydWxlRmVhdHVyZUNhbGxJRCApICkgcnVsZU9wU2luZ2xlQXNzaWduICkgKT0+ICggKCkgKG90aGVybHZfMj0gJy4nIHwgKCAobHZfZXhwbGljaXRTdGF0aWNfM18wPSAnOjonICkgKSApICggKCBydWxlRmVhdHVyZUNhbGxJRCApICkgcnVsZU9wU2luZ2xlQXNzaWduICkgKSAoIChsdl92YWx1ZV82XzA9IHJ1bGVYQXNzaWdubWVudCApICkgKQogICAgICAgICAgICAgCSAgICB7Ci0gICAgICAgICAgICAJICAgIC8vIEludGVybmFsRGF0YURTTC5nOjQ2MjA6NDogKCAoICggKCAoKSAoICcuJyB8ICggKCAnOjonICkgKSApICggKCBydWxlRmVhdHVyZUNhbGxJRCApICkgcnVsZU9wU2luZ2xlQXNzaWduICkgKT0+ICggKCkgKG90aGVybHZfMj0gJy4nIHwgKCAobHZfZXhwbGljaXRTdGF0aWNfM18wPSAnOjonICkgKSApICggKCBydWxlRmVhdHVyZUNhbGxJRCApICkgcnVsZU9wU2luZ2xlQXNzaWduICkgKSAoIChsdl92YWx1ZV82XzA9IHJ1bGVYQXNzaWdubWVudCApICkgKQotICAgICAgICAgICAgCSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo0NjIxOjU6ICggKCAoICgpICggJy4nIHwgKCAoICc6OicgKSApICkgKCAoIHJ1bGVGZWF0dXJlQ2FsbElEICkgKSBydWxlT3BTaW5nbGVBc3NpZ24gKSApPT4gKCAoKSAob3RoZXJsdl8yPSAnLicgfCAoIChsdl9leHBsaWNpdFN0YXRpY18zXzA9ICc6OicgKSApICkgKCAoIHJ1bGVGZWF0dXJlQ2FsbElEICkgKSBydWxlT3BTaW5nbGVBc3NpZ24gKSApICggKGx2X3ZhbHVlXzZfMD0gcnVsZVhBc3NpZ25tZW50ICkgKQorICAgICAgICAgICAgCSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo1MDU5OjQ6ICggKCAoICggKCkgKCAnLicgfCAoICggJzo6JyApICkgKSAoICggcnVsZUZlYXR1cmVDYWxsSUQgKSApIHJ1bGVPcFNpbmdsZUFzc2lnbiApICk9PiAoICgpIChvdGhlcmx2XzI9ICcuJyB8ICggKGx2X2V4cGxpY2l0U3RhdGljXzNfMD0gJzo6JyApICkgKSAoICggcnVsZUZlYXR1cmVDYWxsSUQgKSApIHJ1bGVPcFNpbmdsZUFzc2lnbiApICkgKCAobHZfdmFsdWVfNl8wPSBydWxlWEFzc2lnbm1lbnQgKSApICkKKyAgICAgICAgICAgIAkgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NTA2MDo1OiAoICggKCAoKSAoICcuJyB8ICggKCAnOjonICkgKSApICggKCBydWxlRmVhdHVyZUNhbGxJRCApICkgcnVsZU9wU2luZ2xlQXNzaWduICkgKT0+ICggKCkgKG90aGVybHZfMj0gJy4nIHwgKCAobHZfZXhwbGljaXRTdGF0aWNfM18wPSAnOjonICkgKSApICggKCBydWxlRmVhdHVyZUNhbGxJRCApICkgcnVsZU9wU2luZ2xlQXNzaWduICkgKSAoIChsdl92YWx1ZV82XzA9IHJ1bGVYQXNzaWdubWVudCApICkKICAgICAgICAgICAgIAkgICAgewotICAgICAgICAgICAgCSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo0NjIxOjU6ICggKCAoICgpICggJy4nIHwgKCAoICc6OicgKSApICkgKCAoIHJ1bGVGZWF0dXJlQ2FsbElEICkgKSBydWxlT3BTaW5nbGVBc3NpZ24gKSApPT4gKCAoKSAob3RoZXJsdl8yPSAnLicgfCAoIChsdl9leHBsaWNpdFN0YXRpY18zXzA9ICc6OicgKSApICkgKCAoIHJ1bGVGZWF0dXJlQ2FsbElEICkgKSBydWxlT3BTaW5nbGVBc3NpZ24gKSApCi0gICAgICAgICAgICAJICAgIC8vIEludGVybmFsRGF0YURTTC5nOjQ2MjI6NjogKCAoICgpICggJy4nIHwgKCAoICc6OicgKSApICkgKCAoIHJ1bGVGZWF0dXJlQ2FsbElEICkgKSBydWxlT3BTaW5nbGVBc3NpZ24gKSApPT4gKCAoKSAob3RoZXJsdl8yPSAnLicgfCAoIChsdl9leHBsaWNpdFN0YXRpY18zXzA9ICc6OicgKSApICkgKCAoIHJ1bGVGZWF0dXJlQ2FsbElEICkgKSBydWxlT3BTaW5nbGVBc3NpZ24gKQorICAgICAgICAgICAgCSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo1MDYwOjU6ICggKCAoICgpICggJy4nIHwgKCAoICc6OicgKSApICkgKCAoIHJ1bGVGZWF0dXJlQ2FsbElEICkgKSBydWxlT3BTaW5nbGVBc3NpZ24gKSApPT4gKCAoKSAob3RoZXJsdl8yPSAnLicgfCAoIChsdl9leHBsaWNpdFN0YXRpY18zXzA9ICc6OicgKSApICkgKCAoIHJ1bGVGZWF0dXJlQ2FsbElEICkgKSBydWxlT3BTaW5nbGVBc3NpZ24gKSApCisgICAgICAgICAgICAJICAgIC8vIEludGVybmFsRGF0YURTTC5nOjUwNjE6NjogKCAoICgpICggJy4nIHwgKCAoICc6OicgKSApICkgKCAoIHJ1bGVGZWF0dXJlQ2FsbElEICkgKSBydWxlT3BTaW5nbGVBc3NpZ24gKSApPT4gKCAoKSAob3RoZXJsdl8yPSAnLicgfCAoIChsdl9leHBsaWNpdFN0YXRpY18zXzA9ICc6OicgKSApICkgKCAoIHJ1bGVGZWF0dXJlQ2FsbElEICkgKSBydWxlT3BTaW5nbGVBc3NpZ24gKQogICAgICAgICAgICAgCSAgICB7Ci0gICAgICAgICAgICAJICAgIC8vIEludGVybmFsRGF0YURTTC5nOjQ2NDI6NjogKCAoKSAob3RoZXJsdl8yPSAnLicgfCAoIChsdl9leHBsaWNpdFN0YXRpY18zXzA9ICc6OicgKSApICkgKCAoIHJ1bGVGZWF0dXJlQ2FsbElEICkgKSBydWxlT3BTaW5nbGVBc3NpZ24gKQotICAgICAgICAgICAgCSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo0NjQzOjc6ICgpIChvdGhlcmx2XzI9ICcuJyB8ICggKGx2X2V4cGxpY2l0U3RhdGljXzNfMD0gJzo6JyApICkgKSAoICggcnVsZUZlYXR1cmVDYWxsSUQgKSApIHJ1bGVPcFNpbmdsZUFzc2lnbgorICAgICAgICAgICAgCSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo1MDgxOjY6ICggKCkgKG90aGVybHZfMj0gJy4nIHwgKCAobHZfZXhwbGljaXRTdGF0aWNfM18wPSAnOjonICkgKSApICggKCBydWxlRmVhdHVyZUNhbGxJRCApICkgcnVsZU9wU2luZ2xlQXNzaWduICkKKyAgICAgICAgICAgIAkgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NTA4Mjo3OiAoKSAob3RoZXJsdl8yPSAnLicgfCAoIChsdl9leHBsaWNpdFN0YXRpY18zXzA9ICc6OicgKSApICkgKCAoIHJ1bGVGZWF0dXJlQ2FsbElEICkgKSBydWxlT3BTaW5nbGVBc3NpZ24KICAgICAgICAgICAgIAkgICAgewotICAgICAgICAgICAgCSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo0NjQzOjc6ICgpCi0gICAgICAgICAgICAJICAgIC8vIEludGVybmFsRGF0YURTTC5nOjQ2NDQ6ODogCisgICAgICAgICAgICAJICAgIC8vIEludGVybmFsRGF0YURTTC5nOjUwODI6NzogKCkKKyAgICAgICAgICAgIAkgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NTA4Mzo4OiAKICAgICAgICAgICAgIAkgICAgewogICAgICAgICAgICAgCSAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKIApAQCAtMTMwNzMsMjggKzE0MjY3LDI4IEBACiAKICAgICAgICAgICAgIAkgICAgfQogCi0gICAgICAgICAgICAJICAgIC8vIEludGVybmFsRGF0YURTTC5nOjQ2NTA6NzogKG90aGVybHZfMj0gJy4nIHwgKCAobHZfZXhwbGljaXRTdGF0aWNfM18wPSAnOjonICkgKSApCi0gICAgICAgICAgICAJICAgIGludCBhbHQ3OD0yOwotICAgICAgICAgICAgCSAgICBpbnQgTEE3OF8wID0gaW5wdXQuTEEoMSk7CisgICAgICAgICAgICAJICAgIC8vIEludGVybmFsRGF0YURTTC5nOjUwODk6NzogKG90aGVybHZfMj0gJy4nIHwgKCAobHZfZXhwbGljaXRTdGF0aWNfM18wPSAnOjonICkgKSApCisgICAgICAgICAgICAJICAgIGludCBhbHQ4OT0yOworICAgICAgICAgICAgCSAgICBpbnQgTEE4OV8wID0gaW5wdXQuTEEoMSk7CiAKLSAgICAgICAgICAgIAkgICAgaWYgKCAoTEE3OF8wPT02NykgKSB7Ci0gICAgICAgICAgICAJICAgICAgICBhbHQ3OD0xOworICAgICAgICAgICAgCSAgICBpZiAoIChMQTg5XzA9PTc0KSApIHsKKyAgICAgICAgICAgIAkgICAgICAgIGFsdDg5PTE7CiAgICAgICAgICAgICAJICAgIH0KLSAgICAgICAgICAgIAkgICAgZWxzZSBpZiAoIChMQTc4XzA9PTExMCkgKSB7Ci0gICAgICAgICAgICAJICAgICAgICBhbHQ3OD0yOworICAgICAgICAgICAgCSAgICBlbHNlIGlmICggKExBODlfMD09MTE3KSApIHsKKyAgICAgICAgICAgIAkgICAgICAgIGFsdDg5PTI7CiAgICAgICAgICAgICAJICAgIH0KICAgICAgICAgICAgIAkgICAgZWxzZSB7CiAgICAgICAgICAgICAJICAgICAgICBpZiAoc3RhdGUuYmFja3RyYWNraW5nPjApIHtzdGF0ZS5mYWlsZWQ9dHJ1ZTsgcmV0dXJuIGN1cnJlbnQ7fQogICAgICAgICAgICAgCSAgICAgICAgTm9WaWFibGVBbHRFeGNlcHRpb24gbnZhZSA9Ci0gICAgICAgICAgICAJICAgICAgICAgICAgbmV3IE5vVmlhYmxlQWx0RXhjZXB0aW9uKCIiLCA3OCwgMCwgaW5wdXQpOworICAgICAgICAgICAgCSAgICAgICAgICAgIG5ldyBOb1ZpYWJsZUFsdEV4Y2VwdGlvbigiIiwgODksIDAsIGlucHV0KTsKIAogICAgICAgICAgICAgCSAgICAgICAgdGhyb3cgbnZhZTsKICAgICAgICAgICAgIAkgICAgfQotICAgICAgICAgICAgCSAgICBzd2l0Y2ggKGFsdDc4KSB7CisgICAgICAgICAgICAJICAgIHN3aXRjaCAoYWx0ODkpIHsKICAgICAgICAgICAgIAkgICAgICAgIGNhc2UgMSA6Ci0gICAgICAgICAgICAJICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NDY1MTo4OiBvdGhlcmx2XzI9ICcuJworICAgICAgICAgICAgCSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjUwOTA6ODogb3RoZXJsdl8yPSAnLicKICAgICAgICAgICAgIAkgICAgICAgICAgICB7Ci0gICAgICAgICAgICAJICAgICAgICAgICAgb3RoZXJsdl8yPShUb2tlbiltYXRjaChpbnB1dCw2NyxGT0xMT1dfODcpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gY3VycmVudDsKKyAgICAgICAgICAgIAkgICAgICAgICAgICBvdGhlcmx2XzI9KFRva2VuKW1hdGNoKGlucHV0LDc0LEZPTExPV18xMDEpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gY3VycmVudDsKICAgICAgICAgICAgIAkgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKIAogICAgICAgICAgICAgCSAgICAgICAgICAgICAgCQkJCQkJCQluZXdMZWFmTm9kZShvdGhlcmx2XzIsIGdyYW1tYXJBY2Nlc3MuZ2V0WE1lbWJlckZlYXR1cmVDYWxsQWNjZXNzKCkuZ2V0RnVsbFN0b3BLZXl3b3JkXzFfMF8wXzBfMV8wKCkpOwpAQCAtMTMxMDQsMTUgKzE0Mjk4LDE1IEBACiAgICAgICAgICAgICAJICAgICAgICAgICAgfQogICAgICAgICAgICAgCSAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgCSAgICAgICAgY2FzZSAyIDoKLSAgICAgICAgICAgIAkgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo0NjU2Ojg6ICggKGx2X2V4cGxpY2l0U3RhdGljXzNfMD0gJzo6JyApICkKKyAgICAgICAgICAgIAkgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo1MDk1Ojg6ICggKGx2X2V4cGxpY2l0U3RhdGljXzNfMD0gJzo6JyApICkKICAgICAgICAgICAgIAkgICAgICAgICAgICB7Ci0gICAgICAgICAgICAJICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NDY1Njo4OiAoIChsdl9leHBsaWNpdFN0YXRpY18zXzA9ICc6OicgKSApCi0gICAgICAgICAgICAJICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NDY1Nzo5OiAobHZfZXhwbGljaXRTdGF0aWNfM18wPSAnOjonICkKKyAgICAgICAgICAgIAkgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo1MDk1Ojg6ICggKGx2X2V4cGxpY2l0U3RhdGljXzNfMD0gJzo6JyApICkKKyAgICAgICAgICAgIAkgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo1MDk2Ojk6IChsdl9leHBsaWNpdFN0YXRpY18zXzA9ICc6OicgKQogICAgICAgICAgICAgCSAgICAgICAgICAgIHsKLSAgICAgICAgICAgIAkgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo0NjU3Ojk6IChsdl9leHBsaWNpdFN0YXRpY18zXzA9ICc6OicgKQotICAgICAgICAgICAgCSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjQ2NTg6MTA6IGx2X2V4cGxpY2l0U3RhdGljXzNfMD0gJzo6JworICAgICAgICAgICAgCSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjUwOTY6OTogKGx2X2V4cGxpY2l0U3RhdGljXzNfMD0gJzo6JyApCisgICAgICAgICAgICAJICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NTA5NzoxMDogbHZfZXhwbGljaXRTdGF0aWNfM18wPSAnOjonCiAgICAgICAgICAgICAJICAgICAgICAgICAgewotICAgICAgICAgICAgCSAgICAgICAgICAgIGx2X2V4cGxpY2l0U3RhdGljXzNfMD0oVG9rZW4pbWF0Y2goaW5wdXQsMTEwLEZPTExPV184Nyk7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OworICAgICAgICAgICAgCSAgICAgICAgICAgIGx2X2V4cGxpY2l0U3RhdGljXzNfMD0oVG9rZW4pbWF0Y2goaW5wdXQsMTE3LEZPTExPV18xMDEpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gY3VycmVudDsKICAgICAgICAgICAgIAkgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKIAogICAgICAgICAgICAgCSAgICAgICAgICAgICAgCQkJCQkJCQkJCW5ld0xlYWZOb2RlKGx2X2V4cGxpY2l0U3RhdGljXzNfMCwgZ3JhbW1hckFjY2Vzcy5nZXRYTWVtYmVyRmVhdHVyZUNhbGxBY2Nlc3MoKS5nZXRFeHBsaWNpdFN0YXRpY0NvbG9uQ29sb25LZXl3b3JkXzFfMF8wXzBfMV8xXzAoKSk7CkBAIC0xMzEzOCwxMSArMTQzMzIsMTEgQEAKIAogICAgICAgICAgICAgCSAgICB9CiAKLSAgICAgICAgICAgIAkgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NDY3MTo3OiAoICggcnVsZUZlYXR1cmVDYWxsSUQgKSApCi0gICAgICAgICAgICAJICAgIC8vIEludGVybmFsRGF0YURTTC5nOjQ2NzI6ODogKCBydWxlRmVhdHVyZUNhbGxJRCApCisgICAgICAgICAgICAJICAgIC8vIEludGVybmFsRGF0YURTTC5nOjUxMTA6NzogKCAoIHJ1bGVGZWF0dXJlQ2FsbElEICkgKQorICAgICAgICAgICAgCSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo1MTExOjg6ICggcnVsZUZlYXR1cmVDYWxsSUQgKQogICAgICAgICAgICAgCSAgICB7Ci0gICAgICAgICAgICAJICAgIC8vIEludGVybmFsRGF0YURTTC5nOjQ2NzI6ODogKCBydWxlRmVhdHVyZUNhbGxJRCApCi0gICAgICAgICAgICAJICAgIC8vIEludGVybmFsRGF0YURTTC5nOjQ2NzM6OTogcnVsZUZlYXR1cmVDYWxsSUQKKyAgICAgICAgICAgIAkgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NTExMTo4OiAoIHJ1bGVGZWF0dXJlQ2FsbElEICkKKyAgICAgICAgICAgIAkgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NTExMjo5OiBydWxlRmVhdHVyZUNhbGxJRAogICAgICAgICAgICAgCSAgICB7CiAgICAgICAgICAgICAJICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogCkBAIC0xMzE1Niw3ICsxNDM1MCw3IEBACiAgICAgICAgICAgICAJICAgICAgCQkJCQkJCQkJbmV3Q29tcG9zaXRlTm9kZShncmFtbWFyQWNjZXNzLmdldFhNZW1iZXJGZWF0dXJlQ2FsbEFjY2VzcygpLmdldEZlYXR1cmVKdm1JZGVudGlmaWFibGVFbGVtZW50Q3Jvc3NSZWZlcmVuY2VfMV8wXzBfMF8yXzAoKSk7CiAgICAgICAgICAgICAJICAgICAgCQkJCQkJCQkKICAgICAgICAgICAgIAkgICAgfQotICAgICAgICAgICAgCSAgICBwdXNoRm9sbG93KEZPTExPV182Myk7CisgICAgICAgICAgICAJICAgIHB1c2hGb2xsb3coRk9MTE9XXzc3KTsKICAgICAgICAgICAgIAkgICAgcnVsZUZlYXR1cmVDYWxsSUQoKTsKIAogICAgICAgICAgICAgCSAgICBzdGF0ZS5fZnNwLS07CkBAIC0xMzE3Nyw3ICsxNDM3MSw3IEBACiAgICAgICAgICAgICAJICAgICAgCQkJCQkJCW5ld0NvbXBvc2l0ZU5vZGUoZ3JhbW1hckFjY2Vzcy5nZXRYTWVtYmVyRmVhdHVyZUNhbGxBY2Nlc3MoKS5nZXRPcFNpbmdsZUFzc2lnblBhcnNlclJ1bGVDYWxsXzFfMF8wXzBfMygpKTsKICAgICAgICAgICAgIAkgICAgICAJCQkJCQkKICAgICAgICAgICAgIAkgICAgfQotICAgICAgICAgICAgCSAgICBwdXNoRm9sbG93KEZPTExPV182NCk7CisgICAgICAgICAgICAJICAgIHB1c2hGb2xsb3coRk9MTE9XXzc4KTsKICAgICAgICAgICAgIAkgICAgcnVsZU9wU2luZ2xlQXNzaWduKCk7CiAKICAgICAgICAgICAgIAkgICAgc3RhdGUuX2ZzcC0tOwpAQCAtMTMxOTMsMTggKzE0Mzg3LDE4IEBACiAKICAgICAgICAgICAgIAkgICAgfQogCi0gICAgICAgICAgICAJICAgIC8vIEludGVybmFsRGF0YURTTC5nOjQ2OTY6NTogKCAobHZfdmFsdWVfNl8wPSBydWxlWEFzc2lnbm1lbnQgKSApCi0gICAgICAgICAgICAJICAgIC8vIEludGVybmFsRGF0YURTTC5nOjQ2OTc6NjogKGx2X3ZhbHVlXzZfMD0gcnVsZVhBc3NpZ25tZW50ICkKKyAgICAgICAgICAgIAkgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NTEzNTo1OiAoIChsdl92YWx1ZV82XzA9IHJ1bGVYQXNzaWdubWVudCApICkKKyAgICAgICAgICAgIAkgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NTEzNjo2OiAobHZfdmFsdWVfNl8wPSBydWxlWEFzc2lnbm1lbnQgKQogICAgICAgICAgICAgCSAgICB7Ci0gICAgICAgICAgICAJICAgIC8vIEludGVybmFsRGF0YURTTC5nOjQ2OTc6NjogKGx2X3ZhbHVlXzZfMD0gcnVsZVhBc3NpZ25tZW50ICkKLSAgICAgICAgICAgIAkgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NDY5ODo3OiBsdl92YWx1ZV82XzA9IHJ1bGVYQXNzaWdubWVudAorICAgICAgICAgICAgCSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo1MTM2OjY6IChsdl92YWx1ZV82XzA9IHJ1bGVYQXNzaWdubWVudCApCisgICAgICAgICAgICAJICAgIC8vIEludGVybmFsRGF0YURTTC5nOjUxMzc6NzogbHZfdmFsdWVfNl8wPSBydWxlWEFzc2lnbm1lbnQKICAgICAgICAgICAgIAkgICAgewogICAgICAgICAgICAgCSAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKIAogICAgICAgICAgICAgCSAgICAgIAkJCQkJCQluZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0WE1lbWJlckZlYXR1cmVDYWxsQWNjZXNzKCkuZ2V0VmFsdWVYQXNzaWdubWVudFBhcnNlclJ1bGVDYWxsXzFfMF8xXzAoKSk7CiAgICAgICAgICAgICAJICAgICAgCQkJCQkJCiAgICAgICAgICAgICAJICAgIH0KLSAgICAgICAgICAgIAkgICAgcHVzaEZvbGxvdyhGT0xMT1dfODYpOworICAgICAgICAgICAgCSAgICBwdXNoRm9sbG93KEZPTExPV18xMDApOwogICAgICAgICAgICAgCSAgICBsdl92YWx1ZV82XzA9cnVsZVhBc3NpZ25tZW50KCk7CiAKICAgICAgICAgICAgIAkgICAgc3RhdGUuX2ZzcC0tOwpAQCAtMTMyMzUsMTkgKzE0NDI5LDE5IEBACiAgICAgICAgICAgICAJICAgIH0KICAgICAgICAgICAgIAkgICAgYnJlYWs7CiAgICAgICAgICAgICAJY2FzZSAyIDoKLSAgICAgICAgICAgIAkgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NDcxNzo0OiAoICggKCAoICgpICggJy4nIHwgKCAoICc/LicgKSApIHwgKCAoICc6OicgKSApICkgKSApPT4gKCAoKSAob3RoZXJsdl84PSAnLicgfCAoIChsdl9udWxsU2FmZV85XzA9ICc/LicgKSApIHwgKCAobHZfZXhwbGljaXRTdGF0aWNfMTBfMD0gJzo6JyApICkgKSApICkgKG90aGVybHZfMTE9ICc8JyAoIChsdl90eXBlQXJndW1lbnRzXzEyXzA9IHJ1bGVKdm1Bcmd1bWVudFR5cGVSZWZlcmVuY2UgKSApIChvdGhlcmx2XzEzPSAnLCcgKCAobHZfdHlwZUFyZ3VtZW50c18xNF8wPSBydWxlSnZtQXJndW1lbnRUeXBlUmVmZXJlbmNlICkgKSApKiBvdGhlcmx2XzE1PSAnPicgKT8gKCAoIHJ1bGVJZE9yU3VwZXIgKSApICggKCAoICggJygnICkgKT0+IChsdl9leHBsaWNpdE9wZXJhdGlvbkNhbGxfMTdfMD0gJygnICkgKSAoICggKCAoICgpICggKCAoIHJ1bGVKdm1Gb3JtYWxQYXJhbWV0ZXIgKSApICggJywnICggKCBydWxlSnZtRm9ybWFsUGFyYW1ldGVyICkgKSApKiApPyAoICggJ3wnICkgKSApICk9PiAobHZfbWVtYmVyQ2FsbEFyZ3VtZW50c18xOF8wPSBydWxlWFNob3J0Q2xvc3VyZSApICkgfCAoICggKGx2X21lbWJlckNhbGxBcmd1bWVudHNfMTlfMD0gcnVsZVhFeHByZXNzaW9uICkgKSAob3RoZXJsdl8yMD0gJywnICggKGx2X21lbWJlckNhbGxBcmd1bWVudHNfMjFfMD0gcnVsZVhFeHByZXNzaW9uICkgKSApKiApICk/IG90aGVybHZfMjI9ICcpJyApPyAoICggKCAoKSAnWycgKSApPT4gKGx2X21lbWJlckNhbGxBcmd1bWVudHNfMjNfMD0gcnVsZVhDbG9zdXJlICkgKT8gKQorICAgICAgICAgICAgCSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo1MTU2OjQ6ICggKCAoICggKCkgKCAnLicgfCAoICggJz8uJyApICkgfCAoICggJzo6JyApICkgKSApICk9PiAoICgpIChvdGhlcmx2Xzg9ICcuJyB8ICggKGx2X251bGxTYWZlXzlfMD0gJz8uJyApICkgfCAoIChsdl9leHBsaWNpdFN0YXRpY18xMF8wPSAnOjonICkgKSApICkgKSAob3RoZXJsdl8xMT0gJzwnICggKGx2X3R5cGVBcmd1bWVudHNfMTJfMD0gcnVsZUp2bUFyZ3VtZW50VHlwZVJlZmVyZW5jZSApICkgKG90aGVybHZfMTM9ICcsJyAoIChsdl90eXBlQXJndW1lbnRzXzE0XzA9IHJ1bGVKdm1Bcmd1bWVudFR5cGVSZWZlcmVuY2UgKSApICkqIG90aGVybHZfMTU9ICc+JyApPyAoICggcnVsZUlkT3JTdXBlciApICkgKCAoICggKCAnKCcgKSApPT4gKGx2X2V4cGxpY2l0T3BlcmF0aW9uQ2FsbF8xN18wPSAnKCcgKSApICggKCAoICggKCkgKCAoICggcnVsZUp2bUZvcm1hbFBhcmFtZXRlciApICkgKCAnLCcgKCAoIHJ1bGVKdm1Gb3JtYWxQYXJhbWV0ZXIgKSApICkqICk/ICggKCAnfCcgKSApICkgKT0+IChsdl9tZW1iZXJDYWxsQXJndW1lbnRzXzE4XzA9IHJ1bGVYU2hvcnRDbG9zdXJlICkgKSB8ICggKCAobHZfbWVtYmVyQ2FsbEFyZ3VtZW50c18xOV8wPSBydWxlWEV4cHJlc3Npb24gKSApIChvdGhlcmx2XzIwPSAnLCcgKCAobHZfbWVtYmVyQ2FsbEFyZ3VtZW50c18yMV8wPSBydWxlWEV4cHJlc3Npb24gKSApICkqICkgKT8gb3RoZXJsdl8yMj0gJyknICk/ICggKCAoICgpICdbJyApICk9PiAobHZfbWVtYmVyQ2FsbEFyZ3VtZW50c18yM18wPSBydWxlWENsb3N1cmUgKSApPyApCiAgICAgICAgICAgICAJICAgIHsKLSAgICAgICAgICAgIAkgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NDcxNzo0OiAoICggKCAoICgpICggJy4nIHwgKCAoICc/LicgKSApIHwgKCAoICc6OicgKSApICkgKSApPT4gKCAoKSAob3RoZXJsdl84PSAnLicgfCAoIChsdl9udWxsU2FmZV85XzA9ICc/LicgKSApIHwgKCAobHZfZXhwbGljaXRTdGF0aWNfMTBfMD0gJzo6JyApICkgKSApICkgKG90aGVybHZfMTE9ICc8JyAoIChsdl90eXBlQXJndW1lbnRzXzEyXzA9IHJ1bGVKdm1Bcmd1bWVudFR5cGVSZWZlcmVuY2UgKSApIChvdGhlcmx2XzEzPSAnLCcgKCAobHZfdHlwZUFyZ3VtZW50c18xNF8wPSBydWxlSnZtQXJndW1lbnRUeXBlUmVmZXJlbmNlICkgKSApKiBvdGhlcmx2XzE1PSAnPicgKT8gKCAoIHJ1bGVJZE9yU3VwZXIgKSApICggKCAoICggJygnICkgKT0+IChsdl9leHBsaWNpdE9wZXJhdGlvbkNhbGxfMTdfMD0gJygnICkgKSAoICggKCAoICgpICggKCAoIHJ1bGVKdm1Gb3JtYWxQYXJhbWV0ZXIgKSApICggJywnICggKCBydWxlSnZtRm9ybWFsUGFyYW1ldGVyICkgKSApKiApPyAoICggJ3wnICkgKSApICk9PiAobHZfbWVtYmVyQ2FsbEFyZ3VtZW50c18xOF8wPSBydWxlWFNob3J0Q2xvc3VyZSApICkgfCAoICggKGx2X21lbWJlckNhbGxBcmd1bWVudHNfMTlfMD0gcnVsZVhFeHByZXNzaW9uICkgKSAob3RoZXJsdl8yMD0gJywnICggKGx2X21lbWJlckNhbGxBcmd1bWVudHNfMjFfMD0gcnVsZVhFeHByZXNzaW9uICkgKSApKiApICk/IG90aGVybHZfMjI9ICcpJyApPyAoICggKCAoKSAnWycgKSApPT4gKGx2X21lbWJlckNhbGxBcmd1bWVudHNfMjNfMD0gcnVsZVhDbG9zdXJlICkgKT8gKQotICAgICAgICAgICAgCSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo0NzE4OjU6ICggKCAoICgpICggJy4nIHwgKCAoICc/LicgKSApIHwgKCAoICc6OicgKSApICkgKSApPT4gKCAoKSAob3RoZXJsdl84PSAnLicgfCAoIChsdl9udWxsU2FmZV85XzA9ICc/LicgKSApIHwgKCAobHZfZXhwbGljaXRTdGF0aWNfMTBfMD0gJzo6JyApICkgKSApICkgKG90aGVybHZfMTE9ICc8JyAoIChsdl90eXBlQXJndW1lbnRzXzEyXzA9IHJ1bGVKdm1Bcmd1bWVudFR5cGVSZWZlcmVuY2UgKSApIChvdGhlcmx2XzEzPSAnLCcgKCAobHZfdHlwZUFyZ3VtZW50c18xNF8wPSBydWxlSnZtQXJndW1lbnRUeXBlUmVmZXJlbmNlICkgKSApKiBvdGhlcmx2XzE1PSAnPicgKT8gKCAoIHJ1bGVJZE9yU3VwZXIgKSApICggKCAoICggJygnICkgKT0+IChsdl9leHBsaWNpdE9wZXJhdGlvbkNhbGxfMTdfMD0gJygnICkgKSAoICggKCAoICgpICggKCAoIHJ1bGVKdm1Gb3JtYWxQYXJhbWV0ZXIgKSApICggJywnICggKCBydWxlSnZtRm9ybWFsUGFyYW1ldGVyICkgKSApKiApPyAoICggJ3wnICkgKSApICk9PiAobHZfbWVtYmVyQ2FsbEFyZ3VtZW50c18xOF8wPSBydWxlWFNob3J0Q2xvc3VyZSApICkgfCAoICggKGx2X21lbWJlckNhbGxBcmd1bWVudHNfMTlfMD0gcnVsZVhFeHByZXNzaW9uICkgKSAob3RoZXJsdl8yMD0gJywnICggKGx2X21lbWJlckNhbGxBcmd1bWVudHNfMjFfMD0gcnVsZVhFeHByZXNzaW9uICkgKSApKiApICk/IG90aGVybHZfMjI9ICcpJyApPyAoICggKCAoKSAnWycgKSApPT4gKGx2X21lbWJlckNhbGxBcmd1bWVudHNfMjNfMD0gcnVsZVhDbG9zdXJlICkgKT8KKyAgICAgICAgICAgIAkgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NTE1Njo0OiAoICggKCAoICgpICggJy4nIHwgKCAoICc/LicgKSApIHwgKCAoICc6OicgKSApICkgKSApPT4gKCAoKSAob3RoZXJsdl84PSAnLicgfCAoIChsdl9udWxsU2FmZV85XzA9ICc/LicgKSApIHwgKCAobHZfZXhwbGljaXRTdGF0aWNfMTBfMD0gJzo6JyApICkgKSApICkgKG90aGVybHZfMTE9ICc8JyAoIChsdl90eXBlQXJndW1lbnRzXzEyXzA9IHJ1bGVKdm1Bcmd1bWVudFR5cGVSZWZlcmVuY2UgKSApIChvdGhlcmx2XzEzPSAnLCcgKCAobHZfdHlwZUFyZ3VtZW50c18xNF8wPSBydWxlSnZtQXJndW1lbnRUeXBlUmVmZXJlbmNlICkgKSApKiBvdGhlcmx2XzE1PSAnPicgKT8gKCAoIHJ1bGVJZE9yU3VwZXIgKSApICggKCAoICggJygnICkgKT0+IChsdl9leHBsaWNpdE9wZXJhdGlvbkNhbGxfMTdfMD0gJygnICkgKSAoICggKCAoICgpICggKCAoIHJ1bGVKdm1Gb3JtYWxQYXJhbWV0ZXIgKSApICggJywnICggKCBydWxlSnZtRm9ybWFsUGFyYW1ldGVyICkgKSApKiApPyAoICggJ3wnICkgKSApICk9PiAobHZfbWVtYmVyQ2FsbEFyZ3VtZW50c18xOF8wPSBydWxlWFNob3J0Q2xvc3VyZSApICkgfCAoICggKGx2X21lbWJlckNhbGxBcmd1bWVudHNfMTlfMD0gcnVsZVhFeHByZXNzaW9uICkgKSAob3RoZXJsdl8yMD0gJywnICggKGx2X21lbWJlckNhbGxBcmd1bWVudHNfMjFfMD0gcnVsZVhFeHByZXNzaW9uICkgKSApKiApICk/IG90aGVybHZfMjI9ICcpJyApPyAoICggKCAoKSAnWycgKSApPT4gKGx2X21lbWJlckNhbGxBcmd1bWVudHNfMjNfMD0gcnVsZVhDbG9zdXJlICkgKT8gKQorICAgICAgICAgICAgCSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo1MTU3OjU6ICggKCAoICgpICggJy4nIHwgKCAoICc/LicgKSApIHwgKCAoICc6OicgKSApICkgKSApPT4gKCAoKSAob3RoZXJsdl84PSAnLicgfCAoIChsdl9udWxsU2FmZV85XzA9ICc/LicgKSApIHwgKCAobHZfZXhwbGljaXRTdGF0aWNfMTBfMD0gJzo6JyApICkgKSApICkgKG90aGVybHZfMTE9ICc8JyAoIChsdl90eXBlQXJndW1lbnRzXzEyXzA9IHJ1bGVKdm1Bcmd1bWVudFR5cGVSZWZlcmVuY2UgKSApIChvdGhlcmx2XzEzPSAnLCcgKCAobHZfdHlwZUFyZ3VtZW50c18xNF8wPSBydWxlSnZtQXJndW1lbnRUeXBlUmVmZXJlbmNlICkgKSApKiBvdGhlcmx2XzE1PSAnPicgKT8gKCAoIHJ1bGVJZE9yU3VwZXIgKSApICggKCAoICggJygnICkgKT0+IChsdl9leHBsaWNpdE9wZXJhdGlvbkNhbGxfMTdfMD0gJygnICkgKSAoICggKCAoICgpICggKCAoIHJ1bGVKdm1Gb3JtYWxQYXJhbWV0ZXIgKSApICggJywnICggKCBydWxlSnZtRm9ybWFsUGFyYW1ldGVyICkgKSApKiApPyAoICggJ3wnICkgKSApICk9PiAobHZfbWVtYmVyQ2FsbEFyZ3VtZW50c18xOF8wPSBydWxlWFNob3J0Q2xvc3VyZSApICkgfCAoICggKGx2X21lbWJlckNhbGxBcmd1bWVudHNfMTlfMD0gcnVsZVhFeHByZXNzaW9uICkgKSAob3RoZXJsdl8yMD0gJywnICggKGx2X21lbWJlckNhbGxBcmd1bWVudHNfMjFfMD0gcnVsZVhFeHByZXNzaW9uICkgKSApKiApICk/IG90aGVybHZfMjI9ICcpJyApPyAoICggKCAoKSAnWycgKSApPT4gKGx2X21lbWJlckNhbGxBcmd1bWVudHNfMjNfMD0gcnVsZVhDbG9zdXJlICkgKT8KICAgICAgICAgICAgIAkgICAgewotICAgICAgICAgICAgCSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo0NzE4OjU6ICggKCAoICgpICggJy4nIHwgKCAoICc/LicgKSApIHwgKCAoICc6OicgKSApICkgKSApPT4gKCAoKSAob3RoZXJsdl84PSAnLicgfCAoIChsdl9udWxsU2FmZV85XzA9ICc/LicgKSApIHwgKCAobHZfZXhwbGljaXRTdGF0aWNfMTBfMD0gJzo6JyApICkgKSApICkKLSAgICAgICAgICAgIAkgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NDcxOTo2OiAoICggKCkgKCAnLicgfCAoICggJz8uJyApICkgfCAoICggJzo6JyApICkgKSApICk9PiAoICgpIChvdGhlcmx2Xzg9ICcuJyB8ICggKGx2X251bGxTYWZlXzlfMD0gJz8uJyApICkgfCAoIChsdl9leHBsaWNpdFN0YXRpY18xMF8wPSAnOjonICkgKSApICkKKyAgICAgICAgICAgIAkgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NTE1Nzo1OiAoICggKCAoKSAoICcuJyB8ICggKCAnPy4nICkgKSB8ICggKCAnOjonICkgKSApICkgKT0+ICggKCkgKG90aGVybHZfOD0gJy4nIHwgKCAobHZfbnVsbFNhZmVfOV8wPSAnPy4nICkgKSB8ICggKGx2X2V4cGxpY2l0U3RhdGljXzEwXzA9ICc6OicgKSApICkgKSApCisgICAgICAgICAgICAJICAgIC8vIEludGVybmFsRGF0YURTTC5nOjUxNTg6NjogKCAoICgpICggJy4nIHwgKCAoICc/LicgKSApIHwgKCAoICc6OicgKSApICkgKSApPT4gKCAoKSAob3RoZXJsdl84PSAnLicgfCAoIChsdl9udWxsU2FmZV85XzA9ICc/LicgKSApIHwgKCAobHZfZXhwbGljaXRTdGF0aWNfMTBfMD0gJzo6JyApICkgKSApCiAgICAgICAgICAgICAJICAgIHsKLSAgICAgICAgICAgIAkgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NDczOTo2OiAoICgpIChvdGhlcmx2Xzg9ICcuJyB8ICggKGx2X251bGxTYWZlXzlfMD0gJz8uJyApICkgfCAoIChsdl9leHBsaWNpdFN0YXRpY18xMF8wPSAnOjonICkgKSApICkKLSAgICAgICAgICAgIAkgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NDc0MDo3OiAoKSAob3RoZXJsdl84PSAnLicgfCAoIChsdl9udWxsU2FmZV85XzA9ICc/LicgKSApIHwgKCAobHZfZXhwbGljaXRTdGF0aWNfMTBfMD0gJzo6JyApICkgKQorICAgICAgICAgICAgCSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo1MTc4OjY6ICggKCkgKG90aGVybHZfOD0gJy4nIHwgKCAobHZfbnVsbFNhZmVfOV8wPSAnPy4nICkgKSB8ICggKGx2X2V4cGxpY2l0U3RhdGljXzEwXzA9ICc6OicgKSApICkgKQorICAgICAgICAgICAgCSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo1MTc5Ojc6ICgpIChvdGhlcmx2Xzg9ICcuJyB8ICggKGx2X251bGxTYWZlXzlfMD0gJz8uJyApICkgfCAoIChsdl9leHBsaWNpdFN0YXRpY18xMF8wPSAnOjonICkgKSApCiAgICAgICAgICAgICAJICAgIHsKLSAgICAgICAgICAgIAkgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NDc0MDo3OiAoKQotICAgICAgICAgICAgCSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo0NzQxOjg6IAorICAgICAgICAgICAgCSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo1MTc5Ojc6ICgpCisgICAgICAgICAgICAJICAgIC8vIEludGVybmFsRGF0YURTTC5nOjUxODA6ODogCiAgICAgICAgICAgICAJICAgIHsKICAgICAgICAgICAgIAkgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAKQEAgLTEzMjU5LDM3ICsxNDQ1MywzNyBAQAogCiAgICAgICAgICAgICAJICAgIH0KIAotICAgICAgICAgICAgCSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo0NzQ3Ojc6IChvdGhlcmx2Xzg9ICcuJyB8ICggKGx2X251bGxTYWZlXzlfMD0gJz8uJyApICkgfCAoIChsdl9leHBsaWNpdFN0YXRpY18xMF8wPSAnOjonICkgKSApCi0gICAgICAgICAgICAJICAgIGludCBhbHQ3OT0zOworICAgICAgICAgICAgCSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo1MTg2Ojc6IChvdGhlcmx2Xzg9ICcuJyB8ICggKGx2X251bGxTYWZlXzlfMD0gJz8uJyApICkgfCAoIChsdl9leHBsaWNpdFN0YXRpY18xMF8wPSAnOjonICkgKSApCisgICAgICAgICAgICAJICAgIGludCBhbHQ5MD0zOwogICAgICAgICAgICAgCSAgICBzd2l0Y2ggKCBpbnB1dC5MQSgxKSApIHsKLSAgICAgICAgICAgIAkgICAgY2FzZSA2NzoKKyAgICAgICAgICAgIAkgICAgY2FzZSA3NDoKICAgICAgICAgICAgIAkgICAgICAgIHsKLSAgICAgICAgICAgIAkgICAgICAgIGFsdDc5PTE7CisgICAgICAgICAgICAJICAgICAgICBhbHQ5MD0xOwogICAgICAgICAgICAgCSAgICAgICAgfQogICAgICAgICAgICAgCSAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAJICAgIGNhc2UgMTExOgorICAgICAgICAgICAgCSAgICBjYXNlIDExODoKICAgICAgICAgICAgIAkgICAgICAgIHsKLSAgICAgICAgICAgIAkgICAgICAgIGFsdDc5PTI7CisgICAgICAgICAgICAJICAgICAgICBhbHQ5MD0yOwogICAgICAgICAgICAgCSAgICAgICAgfQogICAgICAgICAgICAgCSAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAJICAgIGNhc2UgMTEwOgorICAgICAgICAgICAgCSAgICBjYXNlIDExNzoKICAgICAgICAgICAgIAkgICAgICAgIHsKLSAgICAgICAgICAgIAkgICAgICAgIGFsdDc5PTM7CisgICAgICAgICAgICAJICAgICAgICBhbHQ5MD0zOwogICAgICAgICAgICAgCSAgICAgICAgfQogICAgICAgICAgICAgCSAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAJICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICAJICAgICAgICBpZiAoc3RhdGUuYmFja3RyYWNraW5nPjApIHtzdGF0ZS5mYWlsZWQ9dHJ1ZTsgcmV0dXJuIGN1cnJlbnQ7fQogICAgICAgICAgICAgCSAgICAgICAgTm9WaWFibGVBbHRFeGNlcHRpb24gbnZhZSA9Ci0gICAgICAgICAgICAJICAgICAgICAgICAgbmV3IE5vVmlhYmxlQWx0RXhjZXB0aW9uKCIiLCA3OSwgMCwgaW5wdXQpOworICAgICAgICAgICAgCSAgICAgICAgICAgIG5ldyBOb1ZpYWJsZUFsdEV4Y2VwdGlvbigiIiwgOTAsIDAsIGlucHV0KTsKIAogICAgICAgICAgICAgCSAgICAgICAgdGhyb3cgbnZhZTsKICAgICAgICAgICAgIAkgICAgfQogCi0gICAgICAgICAgICAJICAgIHN3aXRjaCAoYWx0NzkpIHsKKyAgICAgICAgICAgIAkgICAgc3dpdGNoIChhbHQ5MCkgewogICAgICAgICAgICAgCSAgICAgICAgY2FzZSAxIDoKLSAgICAgICAgICAgIAkgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo0NzQ4Ojg6IG90aGVybHZfOD0gJy4nCisgICAgICAgICAgICAJICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NTE4Nzo4OiBvdGhlcmx2Xzg9ICcuJwogICAgICAgICAgICAgCSAgICAgICAgICAgIHsKLSAgICAgICAgICAgIAkgICAgICAgICAgICBvdGhlcmx2Xzg9KFRva2VuKW1hdGNoKGlucHV0LDY3LEZPTExPV184OCk7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OworICAgICAgICAgICAgCSAgICAgICAgICAgIG90aGVybHZfOD0oVG9rZW4pbWF0Y2goaW5wdXQsNzQsRk9MTE9XXzEwMik7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OwogICAgICAgICAgICAgCSAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogCiAgICAgICAgICAgICAJICAgICAgICAgICAgICAJCQkJCQkJCW5ld0xlYWZOb2RlKG90aGVybHZfOCwgZ3JhbW1hckFjY2Vzcy5nZXRYTWVtYmVyRmVhdHVyZUNhbGxBY2Nlc3MoKS5nZXRGdWxsU3RvcEtleXdvcmRfMV8xXzBfMF8xXzAoKSk7CkBAIC0xMzI5OSwxNSArMTQ0OTMsMTUgQEAKICAgICAgICAgICAgIAkgICAgICAgICAgICB9CiAgICAgICAgICAgICAJICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAJICAgICAgICBjYXNlIDIgOgotICAgICAgICAgICAgCSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjQ3NTM6ODogKCAobHZfbnVsbFNhZmVfOV8wPSAnPy4nICkgKQorICAgICAgICAgICAgCSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjUxOTI6ODogKCAobHZfbnVsbFNhZmVfOV8wPSAnPy4nICkgKQogICAgICAgICAgICAgCSAgICAgICAgICAgIHsKLSAgICAgICAgICAgIAkgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo0NzUzOjg6ICggKGx2X251bGxTYWZlXzlfMD0gJz8uJyApICkKLSAgICAgICAgICAgIAkgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo0NzU0Ojk6IChsdl9udWxsU2FmZV85XzA9ICc/LicgKQorICAgICAgICAgICAgCSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjUxOTI6ODogKCAobHZfbnVsbFNhZmVfOV8wPSAnPy4nICkgKQorICAgICAgICAgICAgCSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjUxOTM6OTogKGx2X251bGxTYWZlXzlfMD0gJz8uJyApCiAgICAgICAgICAgICAJICAgICAgICAgICAgewotICAgICAgICAgICAgCSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjQ3NTQ6OTogKGx2X251bGxTYWZlXzlfMD0gJz8uJyApCi0gICAgICAgICAgICAJICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NDc1NToxMDogbHZfbnVsbFNhZmVfOV8wPSAnPy4nCisgICAgICAgICAgICAJICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NTE5Mzo5OiAobHZfbnVsbFNhZmVfOV8wPSAnPy4nICkKKyAgICAgICAgICAgIAkgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo1MTk0OjEwOiBsdl9udWxsU2FmZV85XzA9ICc/LicKICAgICAgICAgICAgIAkgICAgICAgICAgICB7Ci0gICAgICAgICAgICAJICAgICAgICAgICAgbHZfbnVsbFNhZmVfOV8wPShUb2tlbiltYXRjaChpbnB1dCwxMTEsRk9MTE9XXzg4KTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7CisgICAgICAgICAgICAJICAgICAgICAgICAgbHZfbnVsbFNhZmVfOV8wPShUb2tlbiltYXRjaChpbnB1dCwxMTgsRk9MTE9XXzEwMik7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OwogICAgICAgICAgICAgCSAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogCiAgICAgICAgICAgICAJICAgICAgICAgICAgICAJCQkJCQkJCQkJbmV3TGVhZk5vZGUobHZfbnVsbFNhZmVfOV8wLCBncmFtbWFyQWNjZXNzLmdldFhNZW1iZXJGZWF0dXJlQ2FsbEFjY2VzcygpLmdldE51bGxTYWZlUXVlc3Rpb25NYXJrRnVsbFN0b3BLZXl3b3JkXzFfMV8wXzBfMV8xXzAoKSk7CkBAIC0xMzMzMSwxNSArMTQ1MjUsMTUgQEAKICAgICAgICAgICAgIAkgICAgICAgICAgICB9CiAgICAgICAgICAgICAJICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAJICAgICAgICBjYXNlIDMgOgotICAgICAgICAgICAgCSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjQ3Njg6ODogKCAobHZfZXhwbGljaXRTdGF0aWNfMTBfMD0gJzo6JyApICkKKyAgICAgICAgICAgIAkgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo1MjA3Ojg6ICggKGx2X2V4cGxpY2l0U3RhdGljXzEwXzA9ICc6OicgKSApCiAgICAgICAgICAgICAJICAgICAgICAgICAgewotICAgICAgICAgICAgCSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjQ3Njg6ODogKCAobHZfZXhwbGljaXRTdGF0aWNfMTBfMD0gJzo6JyApICkKLSAgICAgICAgICAgIAkgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo0NzY5Ojk6IChsdl9leHBsaWNpdFN0YXRpY18xMF8wPSAnOjonICkKKyAgICAgICAgICAgIAkgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo1MjA3Ojg6ICggKGx2X2V4cGxpY2l0U3RhdGljXzEwXzA9ICc6OicgKSApCisgICAgICAgICAgICAJICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NTIwODo5OiAobHZfZXhwbGljaXRTdGF0aWNfMTBfMD0gJzo6JyApCiAgICAgICAgICAgICAJICAgICAgICAgICAgewotICAgICAgICAgICAgCSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjQ3Njk6OTogKGx2X2V4cGxpY2l0U3RhdGljXzEwXzA9ICc6OicgKQotICAgICAgICAgICAgCSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjQ3NzA6MTA6IGx2X2V4cGxpY2l0U3RhdGljXzEwXzA9ICc6OicKKyAgICAgICAgICAgIAkgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo1MjA4Ojk6IChsdl9leHBsaWNpdFN0YXRpY18xMF8wPSAnOjonICkKKyAgICAgICAgICAgIAkgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo1MjA5OjEwOiBsdl9leHBsaWNpdFN0YXRpY18xMF8wPSAnOjonCiAgICAgICAgICAgICAJICAgICAgICAgICAgewotICAgICAgICAgICAgCSAgICAgICAgICAgIGx2X2V4cGxpY2l0U3RhdGljXzEwXzA9KFRva2VuKW1hdGNoKGlucHV0LDExMCxGT0xMT1dfODgpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gY3VycmVudDsKKyAgICAgICAgICAgIAkgICAgICAgICAgICBsdl9leHBsaWNpdFN0YXRpY18xMF8wPShUb2tlbiltYXRjaChpbnB1dCwxMTcsRk9MTE9XXzEwMik7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OwogICAgICAgICAgICAgCSAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogCiAgICAgICAgICAgICAJICAgICAgICAgICAgICAJCQkJCQkJCQkJbmV3TGVhZk5vZGUobHZfZXhwbGljaXRTdGF0aWNfMTBfMCwgZ3JhbW1hckFjY2Vzcy5nZXRYTWVtYmVyRmVhdHVyZUNhbGxBY2Nlc3MoKS5nZXRFeHBsaWNpdFN0YXRpY0NvbG9uQ29sb25LZXl3b3JkXzFfMV8wXzBfMV8yXzAoKSk7CkBAIC0xMzM3MSwzNSArMTQ1NjUsMzUgQEAKIAogICAgICAgICAgICAgCSAgICB9CiAKLSAgICAgICAgICAgIAkgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NDc4NTo1OiAob3RoZXJsdl8xMT0gJzwnICggKGx2X3R5cGVBcmd1bWVudHNfMTJfMD0gcnVsZUp2bUFyZ3VtZW50VHlwZVJlZmVyZW5jZSApICkgKG90aGVybHZfMTM9ICcsJyAoIChsdl90eXBlQXJndW1lbnRzXzE0XzA9IHJ1bGVKdm1Bcmd1bWVudFR5cGVSZWZlcmVuY2UgKSApICkqIG90aGVybHZfMTU9ICc+JyApPwotICAgICAgICAgICAgCSAgICBpbnQgYWx0ODE9MjsKLSAgICAgICAgICAgIAkgICAgaW50IExBODFfMCA9IGlucHV0LkxBKDEpOworICAgICAgICAgICAgCSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo1MjI0OjU6IChvdGhlcmx2XzExPSAnPCcgKCAobHZfdHlwZUFyZ3VtZW50c18xMl8wPSBydWxlSnZtQXJndW1lbnRUeXBlUmVmZXJlbmNlICkgKSAob3RoZXJsdl8xMz0gJywnICggKGx2X3R5cGVBcmd1bWVudHNfMTRfMD0gcnVsZUp2bUFyZ3VtZW50VHlwZVJlZmVyZW5jZSApICkgKSogb3RoZXJsdl8xNT0gJz4nICk/CisgICAgICAgICAgICAJICAgIGludCBhbHQ5Mj0yOworICAgICAgICAgICAgCSAgICBpbnQgTEE5Ml8wID0gaW5wdXQuTEEoMSk7CiAKLSAgICAgICAgICAgIAkgICAgaWYgKCAoTEE4MV8wPT04NikgKSB7Ci0gICAgICAgICAgICAJICAgICAgICBhbHQ4MT0xOworICAgICAgICAgICAgCSAgICBpZiAoIChMQTkyXzA9PTkzKSApIHsKKyAgICAgICAgICAgIAkgICAgICAgIGFsdDkyPTE7CiAgICAgICAgICAgICAJICAgIH0KLSAgICAgICAgICAgIAkgICAgc3dpdGNoIChhbHQ4MSkgeworICAgICAgICAgICAgCSAgICBzd2l0Y2ggKGFsdDkyKSB7CiAgICAgICAgICAgICAJICAgICAgICBjYXNlIDEgOgotICAgICAgICAgICAgCSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjQ3ODY6Njogb3RoZXJsdl8xMT0gJzwnICggKGx2X3R5cGVBcmd1bWVudHNfMTJfMD0gcnVsZUp2bUFyZ3VtZW50VHlwZVJlZmVyZW5jZSApICkgKG90aGVybHZfMTM9ICcsJyAoIChsdl90eXBlQXJndW1lbnRzXzE0XzA9IHJ1bGVKdm1Bcmd1bWVudFR5cGVSZWZlcmVuY2UgKSApICkqIG90aGVybHZfMTU9ICc+JworICAgICAgICAgICAgCSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjUyMjU6Njogb3RoZXJsdl8xMT0gJzwnICggKGx2X3R5cGVBcmd1bWVudHNfMTJfMD0gcnVsZUp2bUFyZ3VtZW50VHlwZVJlZmVyZW5jZSApICkgKG90aGVybHZfMTM9ICcsJyAoIChsdl90eXBlQXJndW1lbnRzXzE0XzA9IHJ1bGVKdm1Bcmd1bWVudFR5cGVSZWZlcmVuY2UgKSApICkqIG90aGVybHZfMTU9ICc+JwogICAgICAgICAgICAgCSAgICAgICAgICAgIHsKLSAgICAgICAgICAgIAkgICAgICAgICAgICBvdGhlcmx2XzExPShUb2tlbiltYXRjaChpbnB1dCw4NixGT0xMT1dfODkpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gY3VycmVudDsKKyAgICAgICAgICAgIAkgICAgICAgICAgICBvdGhlcmx2XzExPShUb2tlbiltYXRjaChpbnB1dCw5MyxGT0xMT1dfMTAzKTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7CiAgICAgICAgICAgICAJICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAKICAgICAgICAgICAgIAkgICAgICAgICAgICAgIAkJCQkJCW5ld0xlYWZOb2RlKG90aGVybHZfMTEsIGdyYW1tYXJBY2Nlc3MuZ2V0WE1lbWJlckZlYXR1cmVDYWxsQWNjZXNzKCkuZ2V0TGVzc1RoYW5TaWduS2V5d29yZF8xXzFfMV8wKCkpOwogICAgICAgICAgICAgCSAgICAgICAgICAgICAgCQkJCQkKICAgICAgICAgICAgIAkgICAgICAgICAgICB9Ci0gICAgICAgICAgICAJICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NDc5MDo2OiAoIChsdl90eXBlQXJndW1lbnRzXzEyXzA9IHJ1bGVKdm1Bcmd1bWVudFR5cGVSZWZlcmVuY2UgKSApCi0gICAgICAgICAgICAJICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NDc5MTo3OiAobHZfdHlwZUFyZ3VtZW50c18xMl8wPSBydWxlSnZtQXJndW1lbnRUeXBlUmVmZXJlbmNlICkKKyAgICAgICAgICAgIAkgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo1MjI5OjY6ICggKGx2X3R5cGVBcmd1bWVudHNfMTJfMD0gcnVsZUp2bUFyZ3VtZW50VHlwZVJlZmVyZW5jZSApICkKKyAgICAgICAgICAgIAkgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo1MjMwOjc6IChsdl90eXBlQXJndW1lbnRzXzEyXzA9IHJ1bGVKdm1Bcmd1bWVudFR5cGVSZWZlcmVuY2UgKQogICAgICAgICAgICAgCSAgICAgICAgICAgIHsKLSAgICAgICAgICAgIAkgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo0NzkxOjc6IChsdl90eXBlQXJndW1lbnRzXzEyXzA9IHJ1bGVKdm1Bcmd1bWVudFR5cGVSZWZlcmVuY2UgKQotICAgICAgICAgICAgCSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjQ3OTI6ODogbHZfdHlwZUFyZ3VtZW50c18xMl8wPSBydWxlSnZtQXJndW1lbnRUeXBlUmVmZXJlbmNlCisgICAgICAgICAgICAJICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NTIzMDo3OiAobHZfdHlwZUFyZ3VtZW50c18xMl8wPSBydWxlSnZtQXJndW1lbnRUeXBlUmVmZXJlbmNlICkKKyAgICAgICAgICAgIAkgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo1MjMxOjg6IGx2X3R5cGVBcmd1bWVudHNfMTJfMD0gcnVsZUp2bUFyZ3VtZW50VHlwZVJlZmVyZW5jZQogICAgICAgICAgICAgCSAgICAgICAgICAgIHsKICAgICAgICAgICAgIAkgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKIAogICAgICAgICAgICAgCSAgICAgICAgICAgICAgCQkJCQkJCQluZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0WE1lbWJlckZlYXR1cmVDYWxsQWNjZXNzKCkuZ2V0VHlwZUFyZ3VtZW50c0p2bUFyZ3VtZW50VHlwZVJlZmVyZW5jZVBhcnNlclJ1bGVDYWxsXzFfMV8xXzFfMCgpKTsKICAgICAgICAgICAgIAkgICAgICAgICAgICAgIAkJCQkJCQkKICAgICAgICAgICAgIAkgICAgICAgICAgICB9Ci0gICAgICAgICAgICAJICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfOTApOworICAgICAgICAgICAgCSAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzEwNCk7CiAgICAgICAgICAgICAJICAgICAgICAgICAgbHZfdHlwZUFyZ3VtZW50c18xMl8wPXJ1bGVKdm1Bcmd1bWVudFR5cGVSZWZlcmVuY2UoKTsKIAogICAgICAgICAgICAgCSAgICAgICAgICAgIHN0YXRlLl9mc3AtLTsKQEAgLTEzNDIzLDM5ICsxNDYxNywzOSBAQAogCiAgICAgICAgICAgICAJICAgICAgICAgICAgfQogCi0gICAgICAgICAgICAJICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NDgwOTo2OiAob3RoZXJsdl8xMz0gJywnICggKGx2X3R5cGVBcmd1bWVudHNfMTRfMD0gcnVsZUp2bUFyZ3VtZW50VHlwZVJlZmVyZW5jZSApICkgKSoKLSAgICAgICAgICAgIAkgICAgICAgICAgICBsb29wODA6CisgICAgICAgICAgICAJICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NTI0ODo2OiAob3RoZXJsdl8xMz0gJywnICggKGx2X3R5cGVBcmd1bWVudHNfMTRfMD0gcnVsZUp2bUFyZ3VtZW50VHlwZVJlZmVyZW5jZSApICkgKSoKKyAgICAgICAgICAgIAkgICAgICAgICAgICBsb29wOTE6CiAgICAgICAgICAgICAJICAgICAgICAgICAgZG8gewotICAgICAgICAgICAgCSAgICAgICAgICAgICAgICBpbnQgYWx0ODA9MjsKLSAgICAgICAgICAgIAkgICAgICAgICAgICAgICAgaW50IExBODBfMCA9IGlucHV0LkxBKDEpOworICAgICAgICAgICAgCSAgICAgICAgICAgICAgICBpbnQgYWx0OTE9MjsKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgICAgaW50IExBOTFfMCA9IGlucHV0LkxBKDEpOwogCi0gICAgICAgICAgICAJICAgICAgICAgICAgICAgIGlmICggKExBODBfMD09NzUpICkgewotICAgICAgICAgICAgCSAgICAgICAgICAgICAgICAgICAgYWx0ODA9MTsKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgICAgaWYgKCAoTEE5MV8wPT04MikgKSB7CisgICAgICAgICAgICAJICAgICAgICAgICAgICAgICAgICBhbHQ5MT0xOwogICAgICAgICAgICAgCSAgICAgICAgICAgICAgICB9CiAKIAotICAgICAgICAgICAgCSAgICAgICAgICAgICAgICBzd2l0Y2ggKGFsdDgwKSB7CisgICAgICAgICAgICAJICAgICAgICAgICAgICAgIHN3aXRjaCAoYWx0OTEpIHsKICAgICAgICAgICAgIAkgICAgICAgICAgICAJY2FzZSAxIDoKLSAgICAgICAgICAgIAkgICAgICAgICAgICAJICAgIC8vIEludGVybmFsRGF0YURTTC5nOjQ4MTA6Nzogb3RoZXJsdl8xMz0gJywnICggKGx2X3R5cGVBcmd1bWVudHNfMTRfMD0gcnVsZUp2bUFyZ3VtZW50VHlwZVJlZmVyZW5jZSApICkKKyAgICAgICAgICAgIAkgICAgICAgICAgICAJICAgIC8vIEludGVybmFsRGF0YURTTC5nOjUyNDk6Nzogb3RoZXJsdl8xMz0gJywnICggKGx2X3R5cGVBcmd1bWVudHNfMTRfMD0gcnVsZUp2bUFyZ3VtZW50VHlwZVJlZmVyZW5jZSApICkKICAgICAgICAgICAgIAkgICAgICAgICAgICAJICAgIHsKLSAgICAgICAgICAgIAkgICAgICAgICAgICAJICAgIG90aGVybHZfMTM9KFRva2VuKW1hdGNoKGlucHV0LDc1LEZPTExPV184OSk7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OworICAgICAgICAgICAgCSAgICAgICAgICAgIAkgICAgb3RoZXJsdl8xMz0oVG9rZW4pbWF0Y2goaW5wdXQsODIsRk9MTE9XXzEwMyk7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OwogICAgICAgICAgICAgCSAgICAgICAgICAgIAkgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAKICAgICAgICAgICAgIAkgICAgICAgICAgICAJICAgICAgCQkJCQkJCW5ld0xlYWZOb2RlKG90aGVybHZfMTMsIGdyYW1tYXJBY2Nlc3MuZ2V0WE1lbWJlckZlYXR1cmVDYWxsQWNjZXNzKCkuZ2V0Q29tbWFLZXl3b3JkXzFfMV8xXzJfMCgpKTsKICAgICAgICAgICAgIAkgICAgICAgICAgICAJICAgICAgCQkJCQkJCiAgICAgICAgICAgICAJICAgICAgICAgICAgCSAgICB9Ci0gICAgICAgICAgICAJICAgICAgICAgICAgCSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo0ODE0Ojc6ICggKGx2X3R5cGVBcmd1bWVudHNfMTRfMD0gcnVsZUp2bUFyZ3VtZW50VHlwZVJlZmVyZW5jZSApICkKLSAgICAgICAgICAgIAkgICAgICAgICAgICAJICAgIC8vIEludGVybmFsRGF0YURTTC5nOjQ4MTU6ODogKGx2X3R5cGVBcmd1bWVudHNfMTRfMD0gcnVsZUp2bUFyZ3VtZW50VHlwZVJlZmVyZW5jZSApCisgICAgICAgICAgICAJICAgICAgICAgICAgCSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo1MjUzOjc6ICggKGx2X3R5cGVBcmd1bWVudHNfMTRfMD0gcnVsZUp2bUFyZ3VtZW50VHlwZVJlZmVyZW5jZSApICkKKyAgICAgICAgICAgIAkgICAgICAgICAgICAJICAgIC8vIEludGVybmFsRGF0YURTTC5nOjUyNTQ6ODogKGx2X3R5cGVBcmd1bWVudHNfMTRfMD0gcnVsZUp2bUFyZ3VtZW50VHlwZVJlZmVyZW5jZSApCiAgICAgICAgICAgICAJICAgICAgICAgICAgCSAgICB7Ci0gICAgICAgICAgICAJICAgICAgICAgICAgCSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo0ODE1Ojg6IChsdl90eXBlQXJndW1lbnRzXzE0XzA9IHJ1bGVKdm1Bcmd1bWVudFR5cGVSZWZlcmVuY2UgKQotICAgICAgICAgICAgCSAgICAgICAgICAgIAkgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NDgxNjo5OiBsdl90eXBlQXJndW1lbnRzXzE0XzA9IHJ1bGVKdm1Bcmd1bWVudFR5cGVSZWZlcmVuY2UKKyAgICAgICAgICAgIAkgICAgICAgICAgICAJICAgIC8vIEludGVybmFsRGF0YURTTC5nOjUyNTQ6ODogKGx2X3R5cGVBcmd1bWVudHNfMTRfMD0gcnVsZUp2bUFyZ3VtZW50VHlwZVJlZmVyZW5jZSApCisgICAgICAgICAgICAJICAgICAgICAgICAgCSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo1MjU1Ojk6IGx2X3R5cGVBcmd1bWVudHNfMTRfMD0gcnVsZUp2bUFyZ3VtZW50VHlwZVJlZmVyZW5jZQogICAgICAgICAgICAgCSAgICAgICAgICAgIAkgICAgewogICAgICAgICAgICAgCSAgICAgICAgICAgIAkgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAKICAgICAgICAgICAgIAkgICAgICAgICAgICAJICAgICAgCQkJCQkJCQkJbmV3Q29tcG9zaXRlTm9kZShncmFtbWFyQWNjZXNzLmdldFhNZW1iZXJGZWF0dXJlQ2FsbEFjY2VzcygpLmdldFR5cGVBcmd1bWVudHNKdm1Bcmd1bWVudFR5cGVSZWZlcmVuY2VQYXJzZXJSdWxlQ2FsbF8xXzFfMV8yXzFfMCgpKTsKICAgICAgICAgICAgIAkgICAgICAgICAgICAJICAgICAgCQkJCQkJCQkKICAgICAgICAgICAgIAkgICAgICAgICAgICAJICAgIH0KLSAgICAgICAgICAgIAkgICAgICAgICAgICAJICAgIHB1c2hGb2xsb3coRk9MTE9XXzkwKTsKKyAgICAgICAgICAgIAkgICAgICAgICAgICAJICAgIHB1c2hGb2xsb3coRk9MTE9XXzEwNCk7CiAgICAgICAgICAgICAJICAgICAgICAgICAgCSAgICBsdl90eXBlQXJndW1lbnRzXzE0XzA9cnVsZUp2bUFyZ3VtZW50VHlwZVJlZmVyZW5jZSgpOwogCiAgICAgICAgICAgICAJICAgICAgICAgICAgCSAgICBzdGF0ZS5fZnNwLS07CkBAIC0xMzQ4NCwxMSArMTQ2NzgsMTEgQEAKICAgICAgICAgICAgIAkgICAgICAgICAgICAJICAgIGJyZWFrOwogCiAgICAgICAgICAgICAJICAgICAgICAgICAgCWRlZmF1bHQgOgotICAgICAgICAgICAgCSAgICAgICAgICAgIAkgICAgYnJlYWsgbG9vcDgwOworICAgICAgICAgICAgCSAgICAgICAgICAgIAkgICAgYnJlYWsgbG9vcDkxOwogICAgICAgICAgICAgCSAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAJICAgICAgICAgICAgfSB3aGlsZSAodHJ1ZSk7CiAKLSAgICAgICAgICAgIAkgICAgICAgICAgICBvdGhlcmx2XzE1PShUb2tlbiltYXRjaChpbnB1dCw4NyxGT0xMT1dfODgpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gY3VycmVudDsKKyAgICAgICAgICAgIAkgICAgICAgICAgICBvdGhlcmx2XzE1PShUb2tlbiltYXRjaChpbnB1dCw5NCxGT0xMT1dfMTAyKTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7CiAgICAgICAgICAgICAJICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAKICAgICAgICAgICAgIAkgICAgICAgICAgICAgIAkJCQkJCW5ld0xlYWZOb2RlKG90aGVybHZfMTUsIGdyYW1tYXJBY2Nlc3MuZ2V0WE1lbWJlckZlYXR1cmVDYWxsQWNjZXNzKCkuZ2V0R3JlYXRlclRoYW5TaWduS2V5d29yZF8xXzFfMV8zKCkpOwpAQCAtMTM1MDAsMTEgKzE0Njk0LDExIEBACiAKICAgICAgICAgICAgIAkgICAgfQogCi0gICAgICAgICAgICAJICAgIC8vIEludGVybmFsRGF0YURTTC5nOjQ4Mzk6NTogKCAoIHJ1bGVJZE9yU3VwZXIgKSApCi0gICAgICAgICAgICAJICAgIC8vIEludGVybmFsRGF0YURTTC5nOjQ4NDA6NjogKCBydWxlSWRPclN1cGVyICkKKyAgICAgICAgICAgIAkgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NTI3ODo1OiAoICggcnVsZUlkT3JTdXBlciApICkKKyAgICAgICAgICAgIAkgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NTI3OTo2OiAoIHJ1bGVJZE9yU3VwZXIgKQogICAgICAgICAgICAgCSAgICB7Ci0gICAgICAgICAgICAJICAgIC8vIEludGVybmFsRGF0YURTTC5nOjQ4NDA6NjogKCBydWxlSWRPclN1cGVyICkKLSAgICAgICAgICAgIAkgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NDg0MTo3OiBydWxlSWRPclN1cGVyCisgICAgICAgICAgICAJICAgIC8vIEludGVybmFsRGF0YURTTC5nOjUyNzk6NjogKCBydWxlSWRPclN1cGVyICkKKyAgICAgICAgICAgIAkgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NTI4MDo3OiBydWxlSWRPclN1cGVyCiAgICAgICAgICAgICAJICAgIHsKICAgICAgICAgICAgIAkgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAKQEAgLTEzNTE4LDcgKzE0NzEyLDcgQEAKICAgICAgICAgICAgIAkgICAgICAJCQkJCQkJbmV3Q29tcG9zaXRlTm9kZShncmFtbWFyQWNjZXNzLmdldFhNZW1iZXJGZWF0dXJlQ2FsbEFjY2VzcygpLmdldEZlYXR1cmVKdm1JZGVudGlmaWFibGVFbGVtZW50Q3Jvc3NSZWZlcmVuY2VfMV8xXzJfMCgpKTsKICAgICAgICAgICAgIAkgICAgICAJCQkJCQkKICAgICAgICAgICAgIAkgICAgfQotICAgICAgICAgICAgCSAgICBwdXNoRm9sbG93KEZPTExPV185MSk7CisgICAgICAgICAgICAJICAgIHB1c2hGb2xsb3coRk9MTE9XXzEwNSk7CiAgICAgICAgICAgICAJICAgIHJ1bGVJZE9yU3VwZXIoKTsKIAogICAgICAgICAgICAgCSAgICBzdGF0ZS5fZnNwLS07CkBAIC0xMzUzNCwyMCArMTQ3MjgsMjAgQEAKIAogICAgICAgICAgICAgCSAgICB9CiAKLSAgICAgICAgICAgIAkgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NDg1NTo1OiAoICggKCAoICcoJyApICk9PiAobHZfZXhwbGljaXRPcGVyYXRpb25DYWxsXzE3XzA9ICcoJyApICkgKCAoICggKCAoKSAoICggKCBydWxlSnZtRm9ybWFsUGFyYW1ldGVyICkgKSAoICcsJyAoICggcnVsZUp2bUZvcm1hbFBhcmFtZXRlciApICkgKSogKT8gKCAoICd8JyApICkgKSApPT4gKGx2X21lbWJlckNhbGxBcmd1bWVudHNfMThfMD0gcnVsZVhTaG9ydENsb3N1cmUgKSApIHwgKCAoIChsdl9tZW1iZXJDYWxsQXJndW1lbnRzXzE5XzA9IHJ1bGVYRXhwcmVzc2lvbiApICkgKG90aGVybHZfMjA9ICcsJyAoIChsdl9tZW1iZXJDYWxsQXJndW1lbnRzXzIxXzA9IHJ1bGVYRXhwcmVzc2lvbiApICkgKSogKSApPyBvdGhlcmx2XzIyPSAnKScgKT8KLSAgICAgICAgICAgIAkgICAgaW50IGFsdDg0PTI7Ci0gICAgICAgICAgICAJICAgIGFsdDg0ID0gZGZhODQucHJlZGljdChpbnB1dCk7Ci0gICAgICAgICAgICAJICAgIHN3aXRjaCAoYWx0ODQpIHsKKyAgICAgICAgICAgIAkgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NTI5NDo1OiAoICggKCAoICcoJyApICk9PiAobHZfZXhwbGljaXRPcGVyYXRpb25DYWxsXzE3XzA9ICcoJyApICkgKCAoICggKCAoKSAoICggKCBydWxlSnZtRm9ybWFsUGFyYW1ldGVyICkgKSAoICcsJyAoICggcnVsZUp2bUZvcm1hbFBhcmFtZXRlciApICkgKSogKT8gKCAoICd8JyApICkgKSApPT4gKGx2X21lbWJlckNhbGxBcmd1bWVudHNfMThfMD0gcnVsZVhTaG9ydENsb3N1cmUgKSApIHwgKCAoIChsdl9tZW1iZXJDYWxsQXJndW1lbnRzXzE5XzA9IHJ1bGVYRXhwcmVzc2lvbiApICkgKG90aGVybHZfMjA9ICcsJyAoIChsdl9tZW1iZXJDYWxsQXJndW1lbnRzXzIxXzA9IHJ1bGVYRXhwcmVzc2lvbiApICkgKSogKSApPyBvdGhlcmx2XzIyPSAnKScgKT8KKyAgICAgICAgICAgIAkgICAgaW50IGFsdDk1PTI7CisgICAgICAgICAgICAJICAgIGFsdDk1ID0gZGZhOTUucHJlZGljdChpbnB1dCk7CisgICAgICAgICAgICAJICAgIHN3aXRjaCAoYWx0OTUpIHsKICAgICAgICAgICAgIAkgICAgICAgIGNhc2UgMSA6Ci0gICAgICAgICAgICAJICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NDg1Njo2OiAoICggKCAnKCcgKSApPT4gKGx2X2V4cGxpY2l0T3BlcmF0aW9uQ2FsbF8xN18wPSAnKCcgKSApICggKCAoICggKCkgKCAoICggcnVsZUp2bUZvcm1hbFBhcmFtZXRlciApICkgKCAnLCcgKCAoIHJ1bGVKdm1Gb3JtYWxQYXJhbWV0ZXIgKSApICkqICk/ICggKCAnfCcgKSApICkgKT0+IChsdl9tZW1iZXJDYWxsQXJndW1lbnRzXzE4XzA9IHJ1bGVYU2hvcnRDbG9zdXJlICkgKSB8ICggKCAobHZfbWVtYmVyQ2FsbEFyZ3VtZW50c18xOV8wPSBydWxlWEV4cHJlc3Npb24gKSApIChvdGhlcmx2XzIwPSAnLCcgKCAobHZfbWVtYmVyQ2FsbEFyZ3VtZW50c18yMV8wPSBydWxlWEV4cHJlc3Npb24gKSApICkqICkgKT8gb3RoZXJsdl8yMj0gJyknCisgICAgICAgICAgICAJICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NTI5NTo2OiAoICggKCAnKCcgKSApPT4gKGx2X2V4cGxpY2l0T3BlcmF0aW9uQ2FsbF8xN18wPSAnKCcgKSApICggKCAoICggKCkgKCAoICggcnVsZUp2bUZvcm1hbFBhcmFtZXRlciApICkgKCAnLCcgKCAoIHJ1bGVKdm1Gb3JtYWxQYXJhbWV0ZXIgKSApICkqICk/ICggKCAnfCcgKSApICkgKT0+IChsdl9tZW1iZXJDYWxsQXJndW1lbnRzXzE4XzA9IHJ1bGVYU2hvcnRDbG9zdXJlICkgKSB8ICggKCAobHZfbWVtYmVyQ2FsbEFyZ3VtZW50c18xOV8wPSBydWxlWEV4cHJlc3Npb24gKSApIChvdGhlcmx2XzIwPSAnLCcgKCAobHZfbWVtYmVyQ2FsbEFyZ3VtZW50c18yMV8wPSBydWxlWEV4cHJlc3Npb24gKSApICkqICkgKT8gb3RoZXJsdl8yMj0gJyknCiAgICAgICAgICAgICAJICAgICAgICAgICAgewotICAgICAgICAgICAgCSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjQ4NTY6NjogKCAoICggJygnICkgKT0+IChsdl9leHBsaWNpdE9wZXJhdGlvbkNhbGxfMTdfMD0gJygnICkgKQotICAgICAgICAgICAgCSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjQ4NTc6NzogKCAoICcoJyApICk9PiAobHZfZXhwbGljaXRPcGVyYXRpb25DYWxsXzE3XzA9ICcoJyApCisgICAgICAgICAgICAJICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NTI5NTo2OiAoICggKCAnKCcgKSApPT4gKGx2X2V4cGxpY2l0T3BlcmF0aW9uQ2FsbF8xN18wPSAnKCcgKSApCisgICAgICAgICAgICAJICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NTI5Njo3OiAoICggJygnICkgKT0+IChsdl9leHBsaWNpdE9wZXJhdGlvbkNhbGxfMTdfMD0gJygnICkKICAgICAgICAgICAgIAkgICAgICAgICAgICB7Ci0gICAgICAgICAgICAJICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NDg2MTo3OiAobHZfZXhwbGljaXRPcGVyYXRpb25DYWxsXzE3XzA9ICcoJyApCi0gICAgICAgICAgICAJICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NDg2Mjo4OiBsdl9leHBsaWNpdE9wZXJhdGlvbkNhbGxfMTdfMD0gJygnCisgICAgICAgICAgICAJICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NTMwMDo3OiAobHZfZXhwbGljaXRPcGVyYXRpb25DYWxsXzE3XzA9ICcoJyApCisgICAgICAgICAgICAJICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NTMwMTo4OiBsdl9leHBsaWNpdE9wZXJhdGlvbkNhbGxfMTdfMD0gJygnCiAgICAgICAgICAgICAJICAgICAgICAgICAgewotICAgICAgICAgICAgCSAgICAgICAgICAgIGx2X2V4cGxpY2l0T3BlcmF0aW9uQ2FsbF8xN18wPShUb2tlbiltYXRjaChpbnB1dCw3NCxGT0xMT1dfOTIpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gY3VycmVudDsKKyAgICAgICAgICAgIAkgICAgICAgICAgICBsdl9leHBsaWNpdE9wZXJhdGlvbkNhbGxfMTdfMD0oVG9rZW4pbWF0Y2goaW5wdXQsODEsRk9MTE9XXzEwNik7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OwogICAgICAgICAgICAgCSAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogCiAgICAgICAgICAgICAJICAgICAgICAgICAgICAJCQkJCQkJCW5ld0xlYWZOb2RlKGx2X2V4cGxpY2l0T3BlcmF0aW9uQ2FsbF8xN18wLCBncmFtbWFyQWNjZXNzLmdldFhNZW1iZXJGZWF0dXJlQ2FsbEFjY2VzcygpLmdldEV4cGxpY2l0T3BlcmF0aW9uQ2FsbExlZnRQYXJlbnRoZXNpc0tleXdvcmRfMV8xXzNfMF8wKCkpOwpAQCAtMTM1NjcsMjUgKzE0NzYxLDI1IEBACiAKICAgICAgICAgICAgIAkgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgIAkgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo0ODc0OjY6ICggKCAoICggKCkgKCAoICggcnVsZUp2bUZvcm1hbFBhcmFtZXRlciApICkgKCAnLCcgKCAoIHJ1bGVKdm1Gb3JtYWxQYXJhbWV0ZXIgKSApICkqICk/ICggKCAnfCcgKSApICkgKT0+IChsdl9tZW1iZXJDYWxsQXJndW1lbnRzXzE4XzA9IHJ1bGVYU2hvcnRDbG9zdXJlICkgKSB8ICggKCAobHZfbWVtYmVyQ2FsbEFyZ3VtZW50c18xOV8wPSBydWxlWEV4cHJlc3Npb24gKSApIChvdGhlcmx2XzIwPSAnLCcgKCAobHZfbWVtYmVyQ2FsbEFyZ3VtZW50c18yMV8wPSBydWxlWEV4cHJlc3Npb24gKSApICkqICkgKT8KLSAgICAgICAgICAgIAkgICAgICAgICAgICBpbnQgYWx0ODM9MzsKLSAgICAgICAgICAgIAkgICAgICAgICAgICBhbHQ4MyA9IGRmYTgzLnByZWRpY3QoaW5wdXQpOwotICAgICAgICAgICAgCSAgICAgICAgICAgIHN3aXRjaCAoYWx0ODMpIHsKKyAgICAgICAgICAgIAkgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo1MzEzOjY6ICggKCAoICggKCkgKCAoICggcnVsZUp2bUZvcm1hbFBhcmFtZXRlciApICkgKCAnLCcgKCAoIHJ1bGVKdm1Gb3JtYWxQYXJhbWV0ZXIgKSApICkqICk/ICggKCAnfCcgKSApICkgKT0+IChsdl9tZW1iZXJDYWxsQXJndW1lbnRzXzE4XzA9IHJ1bGVYU2hvcnRDbG9zdXJlICkgKSB8ICggKCAobHZfbWVtYmVyQ2FsbEFyZ3VtZW50c18xOV8wPSBydWxlWEV4cHJlc3Npb24gKSApIChvdGhlcmx2XzIwPSAnLCcgKCAobHZfbWVtYmVyQ2FsbEFyZ3VtZW50c18yMV8wPSBydWxlWEV4cHJlc3Npb24gKSApICkqICkgKT8KKyAgICAgICAgICAgIAkgICAgICAgICAgICBpbnQgYWx0OTQ9MzsKKyAgICAgICAgICAgIAkgICAgICAgICAgICBhbHQ5NCA9IGRmYTk0LnByZWRpY3QoaW5wdXQpOworICAgICAgICAgICAgCSAgICAgICAgICAgIHN3aXRjaCAoYWx0OTQpIHsKICAgICAgICAgICAgIAkgICAgICAgICAgICAgICAgY2FzZSAxIDoKLSAgICAgICAgICAgIAkgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjQ4NzU6NzogKCAoICggKCkgKCAoICggcnVsZUp2bUZvcm1hbFBhcmFtZXRlciApICkgKCAnLCcgKCAoIHJ1bGVKdm1Gb3JtYWxQYXJhbWV0ZXIgKSApICkqICk/ICggKCAnfCcgKSApICkgKT0+IChsdl9tZW1iZXJDYWxsQXJndW1lbnRzXzE4XzA9IHJ1bGVYU2hvcnRDbG9zdXJlICkgKQorICAgICAgICAgICAgCSAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NTMxNDo3OiAoICggKCAoKSAoICggKCBydWxlSnZtRm9ybWFsUGFyYW1ldGVyICkgKSAoICcsJyAoICggcnVsZUp2bUZvcm1hbFBhcmFtZXRlciApICkgKSogKT8gKCAoICd8JyApICkgKSApPT4gKGx2X21lbWJlckNhbGxBcmd1bWVudHNfMThfMD0gcnVsZVhTaG9ydENsb3N1cmUgKSApCiAgICAgICAgICAgICAJICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAJICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo0ODc1Ojc6ICggKCAoICgpICggKCAoIHJ1bGVKdm1Gb3JtYWxQYXJhbWV0ZXIgKSApICggJywnICggKCBydWxlSnZtRm9ybWFsUGFyYW1ldGVyICkgKSApKiApPyAoICggJ3wnICkgKSApICk9PiAobHZfbWVtYmVyQ2FsbEFyZ3VtZW50c18xOF8wPSBydWxlWFNob3J0Q2xvc3VyZSApICkKLSAgICAgICAgICAgIAkgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjQ4NzY6ODogKCAoICgpICggKCAoIHJ1bGVKdm1Gb3JtYWxQYXJhbWV0ZXIgKSApICggJywnICggKCBydWxlSnZtRm9ybWFsUGFyYW1ldGVyICkgKSApKiApPyAoICggJ3wnICkgKSApICk9PiAobHZfbWVtYmVyQ2FsbEFyZ3VtZW50c18xOF8wPSBydWxlWFNob3J0Q2xvc3VyZSApCisgICAgICAgICAgICAJICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo1MzE0Ojc6ICggKCAoICgpICggKCAoIHJ1bGVKdm1Gb3JtYWxQYXJhbWV0ZXIgKSApICggJywnICggKCBydWxlSnZtRm9ybWFsUGFyYW1ldGVyICkgKSApKiApPyAoICggJ3wnICkgKSApICk9PiAobHZfbWVtYmVyQ2FsbEFyZ3VtZW50c18xOF8wPSBydWxlWFNob3J0Q2xvc3VyZSApICkKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjUzMTU6ODogKCAoICgpICggKCAoIHJ1bGVKdm1Gb3JtYWxQYXJhbWV0ZXIgKSApICggJywnICggKCBydWxlSnZtRm9ybWFsUGFyYW1ldGVyICkgKSApKiApPyAoICggJ3wnICkgKSApICk9PiAobHZfbWVtYmVyQ2FsbEFyZ3VtZW50c18xOF8wPSBydWxlWFNob3J0Q2xvc3VyZSApCiAgICAgICAgICAgICAJICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAJICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo0OTAxOjg6IChsdl9tZW1iZXJDYWxsQXJndW1lbnRzXzE4XzA9IHJ1bGVYU2hvcnRDbG9zdXJlICkKLSAgICAgICAgICAgIAkgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjQ5MDI6OTogbHZfbWVtYmVyQ2FsbEFyZ3VtZW50c18xOF8wPSBydWxlWFNob3J0Q2xvc3VyZQorICAgICAgICAgICAgCSAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NTM0MDo4OiAobHZfbWVtYmVyQ2FsbEFyZ3VtZW50c18xOF8wPSBydWxlWFNob3J0Q2xvc3VyZSApCisgICAgICAgICAgICAJICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo1MzQxOjk6IGx2X21lbWJlckNhbGxBcmd1bWVudHNfMThfMD0gcnVsZVhTaG9ydENsb3N1cmUKICAgICAgICAgICAgIAkgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgIAkgICAgICAgICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogCiAgICAgICAgICAgICAJICAgICAgICAgICAgICAgICAgICAgIAkJCQkJCQkJCW5ld0NvbXBvc2l0ZU5vZGUoZ3JhbW1hckFjY2Vzcy5nZXRYTWVtYmVyRmVhdHVyZUNhbGxBY2Nlc3MoKS5nZXRNZW1iZXJDYWxsQXJndW1lbnRzWFNob3J0Q2xvc3VyZVBhcnNlclJ1bGVDYWxsXzFfMV8zXzFfMF8wKCkpOwogICAgICAgICAgICAgCSAgICAgICAgICAgICAgICAgICAgICAJCQkJCQkJCQogICAgICAgICAgICAgCSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgCSAgICAgICAgICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfNjIpOworICAgICAgICAgICAgCSAgICAgICAgICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfNzYpOwogICAgICAgICAgICAgCSAgICAgICAgICAgICAgICAgICAgbHZfbWVtYmVyQ2FsbEFyZ3VtZW50c18xOF8wPXJ1bGVYU2hvcnRDbG9zdXJlKCk7CiAKICAgICAgICAgICAgIAkgICAgICAgICAgICAgICAgICAgIHN0YXRlLl9mc3AtLTsKQEAgLTEzNjEzLDIzICsxNDgwNywyMyBAQAogICAgICAgICAgICAgCSAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgCSAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAJICAgICAgICAgICAgICAgIGNhc2UgMiA6Ci0gICAgICAgICAgICAJICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo0OTIwOjc6ICggKCAobHZfbWVtYmVyQ2FsbEFyZ3VtZW50c18xOV8wPSBydWxlWEV4cHJlc3Npb24gKSApIChvdGhlcmx2XzIwPSAnLCcgKCAobHZfbWVtYmVyQ2FsbEFyZ3VtZW50c18yMV8wPSBydWxlWEV4cHJlc3Npb24gKSApICkqICkKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjUzNTk6NzogKCAoIChsdl9tZW1iZXJDYWxsQXJndW1lbnRzXzE5XzA9IHJ1bGVYRXhwcmVzc2lvbiApICkgKG90aGVybHZfMjA9ICcsJyAoIChsdl9tZW1iZXJDYWxsQXJndW1lbnRzXzIxXzA9IHJ1bGVYRXhwcmVzc2lvbiApICkgKSogKQogICAgICAgICAgICAgCSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgCSAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NDkyMDo3OiAoICggKGx2X21lbWJlckNhbGxBcmd1bWVudHNfMTlfMD0gcnVsZVhFeHByZXNzaW9uICkgKSAob3RoZXJsdl8yMD0gJywnICggKGx2X21lbWJlckNhbGxBcmd1bWVudHNfMjFfMD0gcnVsZVhFeHByZXNzaW9uICkgKSApKiApCi0gICAgICAgICAgICAJICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo0OTIxOjg6ICggKGx2X21lbWJlckNhbGxBcmd1bWVudHNfMTlfMD0gcnVsZVhFeHByZXNzaW9uICkgKSAob3RoZXJsdl8yMD0gJywnICggKGx2X21lbWJlckNhbGxBcmd1bWVudHNfMjFfMD0gcnVsZVhFeHByZXNzaW9uICkgKSApKgorICAgICAgICAgICAgCSAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NTM1OTo3OiAoICggKGx2X21lbWJlckNhbGxBcmd1bWVudHNfMTlfMD0gcnVsZVhFeHByZXNzaW9uICkgKSAob3RoZXJsdl8yMD0gJywnICggKGx2X21lbWJlckNhbGxBcmd1bWVudHNfMjFfMD0gcnVsZVhFeHByZXNzaW9uICkgKSApKiApCisgICAgICAgICAgICAJICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo1MzYwOjg6ICggKGx2X21lbWJlckNhbGxBcmd1bWVudHNfMTlfMD0gcnVsZVhFeHByZXNzaW9uICkgKSAob3RoZXJsdl8yMD0gJywnICggKGx2X21lbWJlckNhbGxBcmd1bWVudHNfMjFfMD0gcnVsZVhFeHByZXNzaW9uICkgKSApKgogICAgICAgICAgICAgCSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgCSAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NDkyMTo4OiAoIChsdl9tZW1iZXJDYWxsQXJndW1lbnRzXzE5XzA9IHJ1bGVYRXhwcmVzc2lvbiApICkKLSAgICAgICAgICAgIAkgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjQ5MjI6OTogKGx2X21lbWJlckNhbGxBcmd1bWVudHNfMTlfMD0gcnVsZVhFeHByZXNzaW9uICkKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjUzNjA6ODogKCAobHZfbWVtYmVyQ2FsbEFyZ3VtZW50c18xOV8wPSBydWxlWEV4cHJlc3Npb24gKSApCisgICAgICAgICAgICAJICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo1MzYxOjk6IChsdl9tZW1iZXJDYWxsQXJndW1lbnRzXzE5XzA9IHJ1bGVYRXhwcmVzc2lvbiApCiAgICAgICAgICAgICAJICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAJICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo0OTIyOjk6IChsdl9tZW1iZXJDYWxsQXJndW1lbnRzXzE5XzA9IHJ1bGVYRXhwcmVzc2lvbiApCi0gICAgICAgICAgICAJICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo0OTIzOjEwOiBsdl9tZW1iZXJDYWxsQXJndW1lbnRzXzE5XzA9IHJ1bGVYRXhwcmVzc2lvbgorICAgICAgICAgICAgCSAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NTM2MTo5OiAobHZfbWVtYmVyQ2FsbEFyZ3VtZW50c18xOV8wPSBydWxlWEV4cHJlc3Npb24gKQorICAgICAgICAgICAgCSAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NTM2MjoxMDogbHZfbWVtYmVyQ2FsbEFyZ3VtZW50c18xOV8wPSBydWxlWEV4cHJlc3Npb24KICAgICAgICAgICAgIAkgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgIAkgICAgICAgICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogCiAgICAgICAgICAgICAJICAgICAgICAgICAgICAgICAgICAgIAkJCQkJCQkJCQluZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0WE1lbWJlckZlYXR1cmVDYWxsQWNjZXNzKCkuZ2V0TWVtYmVyQ2FsbEFyZ3VtZW50c1hFeHByZXNzaW9uUGFyc2VyUnVsZUNhbGxfMV8xXzNfMV8xXzBfMCgpKTsKICAgICAgICAgICAgIAkgICAgICAgICAgICAgICAgICAgICAgCQkJCQkJCQkJCiAgICAgICAgICAgICAJICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAJICAgICAgICAgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV182MSk7CisgICAgICAgICAgICAJICAgICAgICAgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV183NSk7CiAgICAgICAgICAgICAJICAgICAgICAgICAgICAgICAgICBsdl9tZW1iZXJDYWxsQXJndW1lbnRzXzE5XzA9cnVsZVhFeHByZXNzaW9uKCk7CiAKICAgICAgICAgICAgIAkgICAgICAgICAgICAgICAgICAgIHN0YXRlLl9mc3AtLTsKQEAgLTEzNjUzLDM5ICsxNDg0NywzOSBAQAogCiAgICAgICAgICAgICAJICAgICAgICAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgIAkgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjQ5NDA6ODogKG90aGVybHZfMjA9ICcsJyAoIChsdl9tZW1iZXJDYWxsQXJndW1lbnRzXzIxXzA9IHJ1bGVYRXhwcmVzc2lvbiApICkgKSoKLSAgICAgICAgICAgIAkgICAgICAgICAgICAgICAgICAgIGxvb3A4MjoKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjUzNzk6ODogKG90aGVybHZfMjA9ICcsJyAoIChsdl9tZW1iZXJDYWxsQXJndW1lbnRzXzIxXzA9IHJ1bGVYRXhwcmVzc2lvbiApICkgKSoKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgICAgICAgIGxvb3A5MzoKICAgICAgICAgICAgIAkgICAgICAgICAgICAgICAgICAgIGRvIHsKLSAgICAgICAgICAgIAkgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYWx0ODI9MjsKLSAgICAgICAgICAgIAkgICAgICAgICAgICAgICAgICAgICAgICBpbnQgTEE4Ml8wID0gaW5wdXQuTEEoMSk7CisgICAgICAgICAgICAJICAgICAgICAgICAgICAgICAgICAgICAgaW50IGFsdDkzPTI7CisgICAgICAgICAgICAJICAgICAgICAgICAgICAgICAgICAgICAgaW50IExBOTNfMCA9IGlucHV0LkxBKDEpOwogCi0gICAgICAgICAgICAJICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCAoTEE4Ml8wPT03NSkgKSB7Ci0gICAgICAgICAgICAJICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsdDgyPTE7CisgICAgICAgICAgICAJICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCAoTEE5M18wPT04MikgKSB7CisgICAgICAgICAgICAJICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsdDkzPTE7CiAgICAgICAgICAgICAJICAgICAgICAgICAgICAgICAgICAgICAgfQogCiAKLSAgICAgICAgICAgIAkgICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKGFsdDgyKSB7CisgICAgICAgICAgICAJICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChhbHQ5MykgewogICAgICAgICAgICAgCSAgICAgICAgICAgICAgICAgICAgCWNhc2UgMSA6Ci0gICAgICAgICAgICAJICAgICAgICAgICAgICAgICAgICAJICAgIC8vIEludGVybmFsRGF0YURTTC5nOjQ5NDE6OTogb3RoZXJsdl8yMD0gJywnICggKGx2X21lbWJlckNhbGxBcmd1bWVudHNfMjFfMD0gcnVsZVhFeHByZXNzaW9uICkgKQorICAgICAgICAgICAgCSAgICAgICAgICAgICAgICAgICAgCSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo1MzgwOjk6IG90aGVybHZfMjA9ICcsJyAoIChsdl9tZW1iZXJDYWxsQXJndW1lbnRzXzIxXzA9IHJ1bGVYRXhwcmVzc2lvbiApICkKICAgICAgICAgICAgIAkgICAgICAgICAgICAgICAgICAgIAkgICAgewotICAgICAgICAgICAgCSAgICAgICAgICAgICAgICAgICAgCSAgICBvdGhlcmx2XzIwPShUb2tlbiltYXRjaChpbnB1dCw3NSxGT0xMT1dfNjQpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gY3VycmVudDsKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgICAgICAgIAkgICAgb3RoZXJsdl8yMD0oVG9rZW4pbWF0Y2goaW5wdXQsODIsRk9MTE9XXzc4KTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7CiAgICAgICAgICAgICAJICAgICAgICAgICAgICAgICAgICAJICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogCiAgICAgICAgICAgICAJICAgICAgICAgICAgICAgICAgICAJICAgICAgCQkJCQkJCQkJbmV3TGVhZk5vZGUob3RoZXJsdl8yMCwgZ3JhbW1hckFjY2Vzcy5nZXRYTWVtYmVyRmVhdHVyZUNhbGxBY2Nlc3MoKS5nZXRDb21tYUtleXdvcmRfMV8xXzNfMV8xXzFfMCgpKTsKICAgICAgICAgICAgIAkgICAgICAgICAgICAgICAgICAgIAkgICAgICAJCQkJCQkJCQogICAgICAgICAgICAgCSAgICAgICAgICAgICAgICAgICAgCSAgICB9Ci0gICAgICAgICAgICAJICAgICAgICAgICAgICAgICAgICAJICAgIC8vIEludGVybmFsRGF0YURTTC5nOjQ5NDU6OTogKCAobHZfbWVtYmVyQ2FsbEFyZ3VtZW50c18yMV8wPSBydWxlWEV4cHJlc3Npb24gKSApCi0gICAgICAgICAgICAJICAgICAgICAgICAgICAgICAgICAJICAgIC8vIEludGVybmFsRGF0YURTTC5nOjQ5NDY6MTA6IChsdl9tZW1iZXJDYWxsQXJndW1lbnRzXzIxXzA9IHJ1bGVYRXhwcmVzc2lvbiApCisgICAgICAgICAgICAJICAgICAgICAgICAgICAgICAgICAJICAgIC8vIEludGVybmFsRGF0YURTTC5nOjUzODQ6OTogKCAobHZfbWVtYmVyQ2FsbEFyZ3VtZW50c18yMV8wPSBydWxlWEV4cHJlc3Npb24gKSApCisgICAgICAgICAgICAJICAgICAgICAgICAgICAgICAgICAJICAgIC8vIEludGVybmFsRGF0YURTTC5nOjUzODU6MTA6IChsdl9tZW1iZXJDYWxsQXJndW1lbnRzXzIxXzA9IHJ1bGVYRXhwcmVzc2lvbiApCiAgICAgICAgICAgICAJICAgICAgICAgICAgICAgICAgICAJICAgIHsKLSAgICAgICAgICAgIAkgICAgICAgICAgICAgICAgICAgIAkgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NDk0NjoxMDogKGx2X21lbWJlckNhbGxBcmd1bWVudHNfMjFfMD0gcnVsZVhFeHByZXNzaW9uICkKLSAgICAgICAgICAgIAkgICAgICAgICAgICAgICAgICAgIAkgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NDk0NzoxMTogbHZfbWVtYmVyQ2FsbEFyZ3VtZW50c18yMV8wPSBydWxlWEV4cHJlc3Npb24KKyAgICAgICAgICAgIAkgICAgICAgICAgICAgICAgICAgIAkgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NTM4NToxMDogKGx2X21lbWJlckNhbGxBcmd1bWVudHNfMjFfMD0gcnVsZVhFeHByZXNzaW9uICkKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgICAgICAgIAkgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NTM4NjoxMTogbHZfbWVtYmVyQ2FsbEFyZ3VtZW50c18yMV8wPSBydWxlWEV4cHJlc3Npb24KICAgICAgICAgICAgIAkgICAgICAgICAgICAgICAgICAgIAkgICAgewogICAgICAgICAgICAgCSAgICAgICAgICAgICAgICAgICAgCSAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKIAogICAgICAgICAgICAgCSAgICAgICAgICAgICAgICAgICAgCSAgICAgIAkJCQkJCQkJCQkJbmV3Q29tcG9zaXRlTm9kZShncmFtbWFyQWNjZXNzLmdldFhNZW1iZXJGZWF0dXJlQ2FsbEFjY2VzcygpLmdldE1lbWJlckNhbGxBcmd1bWVudHNYRXhwcmVzc2lvblBhcnNlclJ1bGVDYWxsXzFfMV8zXzFfMV8xXzFfMCgpKTsKICAgICAgICAgICAgIAkgICAgICAgICAgICAgICAgICAgIAkgICAgICAJCQkJCQkJCQkJCiAgICAgICAgICAgICAJICAgICAgICAgICAgICAgICAgICAJICAgIH0KLSAgICAgICAgICAgIAkgICAgICAgICAgICAgICAgICAgIAkgICAgcHVzaEZvbGxvdyhGT0xMT1dfNjEpOworICAgICAgICAgICAgCSAgICAgICAgICAgICAgICAgICAgCSAgICBwdXNoRm9sbG93KEZPTExPV183NSk7CiAgICAgICAgICAgICAJICAgICAgICAgICAgICAgICAgICAJICAgIGx2X21lbWJlckNhbGxBcmd1bWVudHNfMjFfMD1ydWxlWEV4cHJlc3Npb24oKTsKIAogICAgICAgICAgICAgCSAgICAgICAgICAgICAgICAgICAgCSAgICBzdGF0ZS5fZnNwLS07CkBAIC0xMzcxNCw3ICsxNDkwOCw3IEBACiAgICAgICAgICAgICAJICAgICAgICAgICAgICAgICAgICAJICAgIGJyZWFrOwogCiAgICAgICAgICAgICAJICAgICAgICAgICAgICAgICAgICAJZGVmYXVsdCA6Ci0gICAgICAgICAgICAJICAgICAgICAgICAgICAgICAgICAJICAgIGJyZWFrIGxvb3A4MjsKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgICAgICAgIAkgICAgYnJlYWsgbG9vcDkzOwogICAgICAgICAgICAgCSAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIAkgICAgICAgICAgICAgICAgICAgIH0gd2hpbGUgKHRydWUpOwogCkBAIC0xMzcyNyw3ICsxNDkyMSw3IEBACiAKICAgICAgICAgICAgIAkgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgIAkgICAgICAgICAgICBvdGhlcmx2XzIyPShUb2tlbiltYXRjaChpbnB1dCw3NixGT0xMT1dfOTMpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gY3VycmVudDsKKyAgICAgICAgICAgIAkgICAgICAgICAgICBvdGhlcmx2XzIyPShUb2tlbiltYXRjaChpbnB1dCw4MyxGT0xMT1dfMTA3KTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7CiAgICAgICAgICAgICAJICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAKICAgICAgICAgICAgIAkgICAgICAgICAgICAgIAkJCQkJCW5ld0xlYWZOb2RlKG90aGVybHZfMjIsIGdyYW1tYXJBY2Nlc3MuZ2V0WE1lbWJlckZlYXR1cmVDYWxsQWNjZXNzKCkuZ2V0UmlnaHRQYXJlbnRoZXNpc0tleXdvcmRfMV8xXzNfMigpKTsKQEAgLTEzNzM5LDIyICsxNDkzMywyMiBAQAogCiAgICAgICAgICAgICAJICAgIH0KIAotICAgICAgICAgICAgCSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo0OTcyOjU6ICggKCAoICgpICdbJyApICk9PiAobHZfbWVtYmVyQ2FsbEFyZ3VtZW50c18yM18wPSBydWxlWENsb3N1cmUgKSApPwotICAgICAgICAgICAgCSAgICBpbnQgYWx0ODU9MjsKLSAgICAgICAgICAgIAkgICAgYWx0ODUgPSBkZmE4NS5wcmVkaWN0KGlucHV0KTsKLSAgICAgICAgICAgIAkgICAgc3dpdGNoIChhbHQ4NSkgeworICAgICAgICAgICAgCSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo1NDExOjU6ICggKCAoICgpICdbJyApICk9PiAobHZfbWVtYmVyQ2FsbEFyZ3VtZW50c18yM18wPSBydWxlWENsb3N1cmUgKSApPworICAgICAgICAgICAgCSAgICBpbnQgYWx0OTY9MjsKKyAgICAgICAgICAgIAkgICAgYWx0OTYgPSBkZmE5Ni5wcmVkaWN0KGlucHV0KTsKKyAgICAgICAgICAgIAkgICAgc3dpdGNoIChhbHQ5NikgewogICAgICAgICAgICAgCSAgICAgICAgY2FzZSAxIDoKLSAgICAgICAgICAgIAkgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo0OTczOjY6ICggKCAoKSAnWycgKSApPT4gKGx2X21lbWJlckNhbGxBcmd1bWVudHNfMjNfMD0gcnVsZVhDbG9zdXJlICkKKyAgICAgICAgICAgIAkgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo1NDEyOjY6ICggKCAoKSAnWycgKSApPT4gKGx2X21lbWJlckNhbGxBcmd1bWVudHNfMjNfMD0gcnVsZVhDbG9zdXJlICkKICAgICAgICAgICAgIAkgICAgICAgICAgICB7Ci0gICAgICAgICAgICAJICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NDk3OTo2OiAobHZfbWVtYmVyQ2FsbEFyZ3VtZW50c18yM18wPSBydWxlWENsb3N1cmUgKQotICAgICAgICAgICAgCSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjQ5ODA6NzogbHZfbWVtYmVyQ2FsbEFyZ3VtZW50c18yM18wPSBydWxlWENsb3N1cmUKKyAgICAgICAgICAgIAkgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo1NDE4OjY6IChsdl9tZW1iZXJDYWxsQXJndW1lbnRzXzIzXzA9IHJ1bGVYQ2xvc3VyZSApCisgICAgICAgICAgICAJICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NTQxOTo3OiBsdl9tZW1iZXJDYWxsQXJndW1lbnRzXzIzXzA9IHJ1bGVYQ2xvc3VyZQogICAgICAgICAgICAgCSAgICAgICAgICAgIHsKICAgICAgICAgICAgIAkgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKIAogICAgICAgICAgICAgCSAgICAgICAgICAgICAgCQkJCQkJCW5ld0NvbXBvc2l0ZU5vZGUoZ3JhbW1hckFjY2Vzcy5nZXRYTWVtYmVyRmVhdHVyZUNhbGxBY2Nlc3MoKS5nZXRNZW1iZXJDYWxsQXJndW1lbnRzWENsb3N1cmVQYXJzZXJSdWxlQ2FsbF8xXzFfNF8wKCkpOwogICAgICAgICAgICAgCSAgICAgICAgICAgICAgCQkJCQkJCiAgICAgICAgICAgICAJICAgICAgICAgICAgfQotICAgICAgICAgICAgCSAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzg2KTsKKyAgICAgICAgICAgIAkgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV18xMDApOwogICAgICAgICAgICAgCSAgICAgICAgICAgIGx2X21lbWJlckNhbGxBcmd1bWVudHNfMjNfMD1ydWxlWENsb3N1cmUoKTsKIAogICAgICAgICAgICAgCSAgICAgICAgICAgIHN0YXRlLl9mc3AtLTsKQEAgLTEzNzg5LDcgKzE0OTgzLDcgQEAKICAgICAgICAgICAgIAkgICAgYnJlYWs7CiAKICAgICAgICAgICAgIAlkZWZhdWx0IDoKLSAgICAgICAgICAgIAkgICAgYnJlYWsgbG9vcDg2OworICAgICAgICAgICAgCSAgICBicmVhayBsb29wOTc7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfSB3aGlsZSAodHJ1ZSk7CiAKQEAgLTEzODE4LDcgKzE1MDEyLDcgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJlbnRyeVJ1bGVYUHJpbWFyeUV4cHJlc3Npb24iCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NTAwMzoxOiBlbnRyeVJ1bGVYUHJpbWFyeUV4cHJlc3Npb24gcmV0dXJucyBbRU9iamVjdCBjdXJyZW50PW51bGxdIDogaXZfcnVsZVhQcmltYXJ5RXhwcmVzc2lvbj0gcnVsZVhQcmltYXJ5RXhwcmVzc2lvbiBFT0YgOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjU0NDI6MTogZW50cnlSdWxlWFByaW1hcnlFeHByZXNzaW9uIHJldHVybnMgW0VPYmplY3QgY3VycmVudD1udWxsXSA6IGl2X3J1bGVYUHJpbWFyeUV4cHJlc3Npb249IHJ1bGVYUHJpbWFyeUV4cHJlc3Npb24gRU9GIDsKICAgICBwdWJsaWMgZmluYWwgRU9iamVjdCBlbnRyeVJ1bGVYUHJpbWFyeUV4cHJlc3Npb24oKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogICAgICAgICBFT2JqZWN0IGN1cnJlbnQgPSBudWxsOwogCkBAIC0xMzgyNiw4ICsxNTAyMCw4IEBACiAKIAogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NTAwMzo1OTogKGl2X3J1bGVYUHJpbWFyeUV4cHJlc3Npb249IHJ1bGVYUHJpbWFyeUV4cHJlc3Npb24gRU9GICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjUwMDQ6MjogaXZfcnVsZVhQcmltYXJ5RXhwcmVzc2lvbj0gcnVsZVhQcmltYXJ5RXhwcmVzc2lvbiBFT0YKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjU0NDI6NTk6IChpdl9ydWxlWFByaW1hcnlFeHByZXNzaW9uPSBydWxlWFByaW1hcnlFeHByZXNzaW9uIEVPRiApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo1NDQzOjI6IGl2X3J1bGVYUHJpbWFyeUV4cHJlc3Npb249IHJ1bGVYUHJpbWFyeUV4cHJlc3Npb24gRU9GCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIG5ld0NvbXBvc2l0ZU5vZGUoZ3JhbW1hckFjY2Vzcy5nZXRYUHJpbWFyeUV4cHJlc3Npb25SdWxlKCkpOyAKQEAgLTEzODU4LDcgKzE1MDUyLDcgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlWFByaW1hcnlFeHByZXNzaW9uIgotICAgIC8vIEludGVybmFsRGF0YURTTC5nOjUwMTA6MTogcnVsZVhQcmltYXJ5RXhwcmVzc2lvbiByZXR1cm5zIFtFT2JqZWN0IGN1cnJlbnQ9bnVsbF0gOiAodGhpc19YQ29uc3RydWN0b3JDYWxsXzA9IHJ1bGVYQ29uc3RydWN0b3JDYWxsIHwgdGhpc19YQmxvY2tFeHByZXNzaW9uXzE9IHJ1bGVYQmxvY2tFeHByZXNzaW9uIHwgdGhpc19YU3dpdGNoRXhwcmVzc2lvbl8yPSBydWxlWFN3aXRjaEV4cHJlc3Npb24gfCAoICggKCAoKSAnc3luY2hyb25pemVkJyAnKCcgKSApPT50aGlzX1hTeW5jaHJvbml6ZWRFeHByZXNzaW9uXzM9IHJ1bGVYU3luY2hyb25pemVkRXhwcmVzc2lvbiApIHwgdGhpc19YRmVhdHVyZUNhbGxfND0gcnVsZVhGZWF0dXJlQ2FsbCB8IHRoaXNfWExpdGVyYWxfNT0gcnVsZVhMaXRlcmFsIHwgdGhpc19YSWZFeHByZXNzaW9uXzY9IHJ1bGVYSWZFeHByZXNzaW9uIHwgKCAoICggKCkgJ2ZvcicgJygnICggKCBydWxlSnZtRm9ybWFsUGFyYW1ldGVyICkgKSAnOicgKSApPT50aGlzX1hGb3JMb29wRXhwcmVzc2lvbl83PSBydWxlWEZvckxvb3BFeHByZXNzaW9uICkgfCB0aGlzX1hCYXNpY0Zvckxvb3BFeHByZXNzaW9uXzg9IHJ1bGVYQmFzaWNGb3JMb29wRXhwcmVzc2lvbiB8IHRoaXNfWFdoaWxlRXhwcmVzc2lvbl85PSBydWxlWFdoaWxlRXhwcmVzc2lvbiB8IHRoaXNfWERvV2hpbGVFeHByZXNzaW9uXzEwPSBydWxlWERvV2hpbGVFeHByZXNzaW9uIHwgdGhpc19YVGhyb3dFeHByZXNzaW9uXzExPSBydWxlWFRocm93RXhwcmVzc2lvbiB8IHRoaXNfWFJldHVybkV4cHJlc3Npb25fMTI9IHJ1bGVYUmV0dXJuRXhwcmVzc2lvbiB8IHRoaXNfWFRyeUNhdGNoRmluYWxseUV4cHJlc3Npb25fMTM9IHJ1bGVYVHJ5Q2F0Y2hGaW5hbGx5RXhwcmVzc2lvbiB8IHRoaXNfWFBhcmVudGhlc2l6ZWRFeHByZXNzaW9uXzE0PSBydWxlWFBhcmVudGhlc2l6ZWRFeHByZXNzaW9uICkgOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjU0NDk6MTogcnVsZVhQcmltYXJ5RXhwcmVzc2lvbiByZXR1cm5zIFtFT2JqZWN0IGN1cnJlbnQ9bnVsbF0gOiAodGhpc19YQ29uc3RydWN0b3JDYWxsXzA9IHJ1bGVYQ29uc3RydWN0b3JDYWxsIHwgdGhpc19YQmxvY2tFeHByZXNzaW9uXzE9IHJ1bGVYQmxvY2tFeHByZXNzaW9uIHwgdGhpc19YU3dpdGNoRXhwcmVzc2lvbl8yPSBydWxlWFN3aXRjaEV4cHJlc3Npb24gfCAoICggKCAoKSAnc3luY2hyb25pemVkJyAnKCcgKSApPT50aGlzX1hTeW5jaHJvbml6ZWRFeHByZXNzaW9uXzM9IHJ1bGVYU3luY2hyb25pemVkRXhwcmVzc2lvbiApIHwgdGhpc19YRmVhdHVyZUNhbGxfND0gcnVsZVhGZWF0dXJlQ2FsbCB8IHRoaXNfWExpdGVyYWxfNT0gcnVsZVhMaXRlcmFsIHwgdGhpc19YSWZFeHByZXNzaW9uXzY9IHJ1bGVYSWZFeHByZXNzaW9uIHwgKCAoICggKCkgJ2ZvcicgJygnICggKCBydWxlSnZtRm9ybWFsUGFyYW1ldGVyICkgKSAnOicgKSApPT50aGlzX1hGb3JMb29wRXhwcmVzc2lvbl83PSBydWxlWEZvckxvb3BFeHByZXNzaW9uICkgfCB0aGlzX1hCYXNpY0Zvckxvb3BFeHByZXNzaW9uXzg9IHJ1bGVYQmFzaWNGb3JMb29wRXhwcmVzc2lvbiB8IHRoaXNfWFdoaWxlRXhwcmVzc2lvbl85PSBydWxlWFdoaWxlRXhwcmVzc2lvbiB8IHRoaXNfWERvV2hpbGVFeHByZXNzaW9uXzEwPSBydWxlWERvV2hpbGVFeHByZXNzaW9uIHwgdGhpc19YVGhyb3dFeHByZXNzaW9uXzExPSBydWxlWFRocm93RXhwcmVzc2lvbiB8IHRoaXNfWFJldHVybkV4cHJlc3Npb25fMTI9IHJ1bGVYUmV0dXJuRXhwcmVzc2lvbiB8IHRoaXNfWFRyeUNhdGNoRmluYWxseUV4cHJlc3Npb25fMTM9IHJ1bGVYVHJ5Q2F0Y2hGaW5hbGx5RXhwcmVzc2lvbiB8IHRoaXNfWFBhcmVudGhlc2l6ZWRFeHByZXNzaW9uXzE0PSBydWxlWFBhcmVudGhlc2l6ZWRFeHByZXNzaW9uICkgOwogICAgIHB1YmxpYyBmaW5hbCBFT2JqZWN0IHJ1bGVYUHJpbWFyeUV4cHJlc3Npb24oKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogICAgICAgICBFT2JqZWN0IGN1cnJlbnQgPSBudWxsOwogCkBAIC0xMzg5NywxNSArMTUwOTEsMTUgQEAKICAgICAgICAgCWVudGVyUnVsZSgpOwogCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo1MDE2OjI6ICggKHRoaXNfWENvbnN0cnVjdG9yQ2FsbF8wPSBydWxlWENvbnN0cnVjdG9yQ2FsbCB8IHRoaXNfWEJsb2NrRXhwcmVzc2lvbl8xPSBydWxlWEJsb2NrRXhwcmVzc2lvbiB8IHRoaXNfWFN3aXRjaEV4cHJlc3Npb25fMj0gcnVsZVhTd2l0Y2hFeHByZXNzaW9uIHwgKCAoICggKCkgJ3N5bmNocm9uaXplZCcgJygnICkgKT0+dGhpc19YU3luY2hyb25pemVkRXhwcmVzc2lvbl8zPSBydWxlWFN5bmNocm9uaXplZEV4cHJlc3Npb24gKSB8IHRoaXNfWEZlYXR1cmVDYWxsXzQ9IHJ1bGVYRmVhdHVyZUNhbGwgfCB0aGlzX1hMaXRlcmFsXzU9IHJ1bGVYTGl0ZXJhbCB8IHRoaXNfWElmRXhwcmVzc2lvbl82PSBydWxlWElmRXhwcmVzc2lvbiB8ICggKCAoICgpICdmb3InICcoJyAoICggcnVsZUp2bUZvcm1hbFBhcmFtZXRlciApICkgJzonICkgKT0+dGhpc19YRm9yTG9vcEV4cHJlc3Npb25fNz0gcnVsZVhGb3JMb29wRXhwcmVzc2lvbiApIHwgdGhpc19YQmFzaWNGb3JMb29wRXhwcmVzc2lvbl84PSBydWxlWEJhc2ljRm9yTG9vcEV4cHJlc3Npb24gfCB0aGlzX1hXaGlsZUV4cHJlc3Npb25fOT0gcnVsZVhXaGlsZUV4cHJlc3Npb24gfCB0aGlzX1hEb1doaWxlRXhwcmVzc2lvbl8xMD0gcnVsZVhEb1doaWxlRXhwcmVzc2lvbiB8IHRoaXNfWFRocm93RXhwcmVzc2lvbl8xMT0gcnVsZVhUaHJvd0V4cHJlc3Npb24gfCB0aGlzX1hSZXR1cm5FeHByZXNzaW9uXzEyPSBydWxlWFJldHVybkV4cHJlc3Npb24gfCB0aGlzX1hUcnlDYXRjaEZpbmFsbHlFeHByZXNzaW9uXzEzPSBydWxlWFRyeUNhdGNoRmluYWxseUV4cHJlc3Npb24gfCB0aGlzX1hQYXJlbnRoZXNpemVkRXhwcmVzc2lvbl8xND0gcnVsZVhQYXJlbnRoZXNpemVkRXhwcmVzc2lvbiApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjUwMTc6MjogKHRoaXNfWENvbnN0cnVjdG9yQ2FsbF8wPSBydWxlWENvbnN0cnVjdG9yQ2FsbCB8IHRoaXNfWEJsb2NrRXhwcmVzc2lvbl8xPSBydWxlWEJsb2NrRXhwcmVzc2lvbiB8IHRoaXNfWFN3aXRjaEV4cHJlc3Npb25fMj0gcnVsZVhTd2l0Y2hFeHByZXNzaW9uIHwgKCAoICggKCkgJ3N5bmNocm9uaXplZCcgJygnICkgKT0+dGhpc19YU3luY2hyb25pemVkRXhwcmVzc2lvbl8zPSBydWxlWFN5bmNocm9uaXplZEV4cHJlc3Npb24gKSB8IHRoaXNfWEZlYXR1cmVDYWxsXzQ9IHJ1bGVYRmVhdHVyZUNhbGwgfCB0aGlzX1hMaXRlcmFsXzU9IHJ1bGVYTGl0ZXJhbCB8IHRoaXNfWElmRXhwcmVzc2lvbl82PSBydWxlWElmRXhwcmVzc2lvbiB8ICggKCAoICgpICdmb3InICcoJyAoICggcnVsZUp2bUZvcm1hbFBhcmFtZXRlciApICkgJzonICkgKT0+dGhpc19YRm9yTG9vcEV4cHJlc3Npb25fNz0gcnVsZVhGb3JMb29wRXhwcmVzc2lvbiApIHwgdGhpc19YQmFzaWNGb3JMb29wRXhwcmVzc2lvbl84PSBydWxlWEJhc2ljRm9yTG9vcEV4cHJlc3Npb24gfCB0aGlzX1hXaGlsZUV4cHJlc3Npb25fOT0gcnVsZVhXaGlsZUV4cHJlc3Npb24gfCB0aGlzX1hEb1doaWxlRXhwcmVzc2lvbl8xMD0gcnVsZVhEb1doaWxlRXhwcmVzc2lvbiB8IHRoaXNfWFRocm93RXhwcmVzc2lvbl8xMT0gcnVsZVhUaHJvd0V4cHJlc3Npb24gfCB0aGlzX1hSZXR1cm5FeHByZXNzaW9uXzEyPSBydWxlWFJldHVybkV4cHJlc3Npb24gfCB0aGlzX1hUcnlDYXRjaEZpbmFsbHlFeHByZXNzaW9uXzEzPSBydWxlWFRyeUNhdGNoRmluYWxseUV4cHJlc3Npb24gfCB0aGlzX1hQYXJlbnRoZXNpemVkRXhwcmVzc2lvbl8xND0gcnVsZVhQYXJlbnRoZXNpemVkRXhwcmVzc2lvbiApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo1NDU1OjI6ICggKHRoaXNfWENvbnN0cnVjdG9yQ2FsbF8wPSBydWxlWENvbnN0cnVjdG9yQ2FsbCB8IHRoaXNfWEJsb2NrRXhwcmVzc2lvbl8xPSBydWxlWEJsb2NrRXhwcmVzc2lvbiB8IHRoaXNfWFN3aXRjaEV4cHJlc3Npb25fMj0gcnVsZVhTd2l0Y2hFeHByZXNzaW9uIHwgKCAoICggKCkgJ3N5bmNocm9uaXplZCcgJygnICkgKT0+dGhpc19YU3luY2hyb25pemVkRXhwcmVzc2lvbl8zPSBydWxlWFN5bmNocm9uaXplZEV4cHJlc3Npb24gKSB8IHRoaXNfWEZlYXR1cmVDYWxsXzQ9IHJ1bGVYRmVhdHVyZUNhbGwgfCB0aGlzX1hMaXRlcmFsXzU9IHJ1bGVYTGl0ZXJhbCB8IHRoaXNfWElmRXhwcmVzc2lvbl82PSBydWxlWElmRXhwcmVzc2lvbiB8ICggKCAoICgpICdmb3InICcoJyAoICggcnVsZUp2bUZvcm1hbFBhcmFtZXRlciApICkgJzonICkgKT0+dGhpc19YRm9yTG9vcEV4cHJlc3Npb25fNz0gcnVsZVhGb3JMb29wRXhwcmVzc2lvbiApIHwgdGhpc19YQmFzaWNGb3JMb29wRXhwcmVzc2lvbl84PSBydWxlWEJhc2ljRm9yTG9vcEV4cHJlc3Npb24gfCB0aGlzX1hXaGlsZUV4cHJlc3Npb25fOT0gcnVsZVhXaGlsZUV4cHJlc3Npb24gfCB0aGlzX1hEb1doaWxlRXhwcmVzc2lvbl8xMD0gcnVsZVhEb1doaWxlRXhwcmVzc2lvbiB8IHRoaXNfWFRocm93RXhwcmVzc2lvbl8xMT0gcnVsZVhUaHJvd0V4cHJlc3Npb24gfCB0aGlzX1hSZXR1cm5FeHByZXNzaW9uXzEyPSBydWxlWFJldHVybkV4cHJlc3Npb24gfCB0aGlzX1hUcnlDYXRjaEZpbmFsbHlFeHByZXNzaW9uXzEzPSBydWxlWFRyeUNhdGNoRmluYWxseUV4cHJlc3Npb24gfCB0aGlzX1hQYXJlbnRoZXNpemVkRXhwcmVzc2lvbl8xND0gcnVsZVhQYXJlbnRoZXNpemVkRXhwcmVzc2lvbiApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjU0NTY6MjogKHRoaXNfWENvbnN0cnVjdG9yQ2FsbF8wPSBydWxlWENvbnN0cnVjdG9yQ2FsbCB8IHRoaXNfWEJsb2NrRXhwcmVzc2lvbl8xPSBydWxlWEJsb2NrRXhwcmVzc2lvbiB8IHRoaXNfWFN3aXRjaEV4cHJlc3Npb25fMj0gcnVsZVhTd2l0Y2hFeHByZXNzaW9uIHwgKCAoICggKCkgJ3N5bmNocm9uaXplZCcgJygnICkgKT0+dGhpc19YU3luY2hyb25pemVkRXhwcmVzc2lvbl8zPSBydWxlWFN5bmNocm9uaXplZEV4cHJlc3Npb24gKSB8IHRoaXNfWEZlYXR1cmVDYWxsXzQ9IHJ1bGVYRmVhdHVyZUNhbGwgfCB0aGlzX1hMaXRlcmFsXzU9IHJ1bGVYTGl0ZXJhbCB8IHRoaXNfWElmRXhwcmVzc2lvbl82PSBydWxlWElmRXhwcmVzc2lvbiB8ICggKCAoICgpICdmb3InICcoJyAoICggcnVsZUp2bUZvcm1hbFBhcmFtZXRlciApICkgJzonICkgKT0+dGhpc19YRm9yTG9vcEV4cHJlc3Npb25fNz0gcnVsZVhGb3JMb29wRXhwcmVzc2lvbiApIHwgdGhpc19YQmFzaWNGb3JMb29wRXhwcmVzc2lvbl84PSBydWxlWEJhc2ljRm9yTG9vcEV4cHJlc3Npb24gfCB0aGlzX1hXaGlsZUV4cHJlc3Npb25fOT0gcnVsZVhXaGlsZUV4cHJlc3Npb24gfCB0aGlzX1hEb1doaWxlRXhwcmVzc2lvbl8xMD0gcnVsZVhEb1doaWxlRXhwcmVzc2lvbiB8IHRoaXNfWFRocm93RXhwcmVzc2lvbl8xMT0gcnVsZVhUaHJvd0V4cHJlc3Npb24gfCB0aGlzX1hSZXR1cm5FeHByZXNzaW9uXzEyPSBydWxlWFJldHVybkV4cHJlc3Npb24gfCB0aGlzX1hUcnlDYXRjaEZpbmFsbHlFeHByZXNzaW9uXzEzPSBydWxlWFRyeUNhdGNoRmluYWxseUV4cHJlc3Npb24gfCB0aGlzX1hQYXJlbnRoZXNpemVkRXhwcmVzc2lvbl8xND0gcnVsZVhQYXJlbnRoZXNpemVkRXhwcmVzc2lvbiApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo1MDE3OjI6ICh0aGlzX1hDb25zdHJ1Y3RvckNhbGxfMD0gcnVsZVhDb25zdHJ1Y3RvckNhbGwgfCB0aGlzX1hCbG9ja0V4cHJlc3Npb25fMT0gcnVsZVhCbG9ja0V4cHJlc3Npb24gfCB0aGlzX1hTd2l0Y2hFeHByZXNzaW9uXzI9IHJ1bGVYU3dpdGNoRXhwcmVzc2lvbiB8ICggKCAoICgpICdzeW5jaHJvbml6ZWQnICcoJyApICk9PnRoaXNfWFN5bmNocm9uaXplZEV4cHJlc3Npb25fMz0gcnVsZVhTeW5jaHJvbml6ZWRFeHByZXNzaW9uICkgfCB0aGlzX1hGZWF0dXJlQ2FsbF80PSBydWxlWEZlYXR1cmVDYWxsIHwgdGhpc19YTGl0ZXJhbF81PSBydWxlWExpdGVyYWwgfCB0aGlzX1hJZkV4cHJlc3Npb25fNj0gcnVsZVhJZkV4cHJlc3Npb24gfCAoICggKCAoKSAnZm9yJyAnKCcgKCAoIHJ1bGVKdm1Gb3JtYWxQYXJhbWV0ZXIgKSApICc6JyApICk9PnRoaXNfWEZvckxvb3BFeHByZXNzaW9uXzc9IHJ1bGVYRm9yTG9vcEV4cHJlc3Npb24gKSB8IHRoaXNfWEJhc2ljRm9yTG9vcEV4cHJlc3Npb25fOD0gcnVsZVhCYXNpY0Zvckxvb3BFeHByZXNzaW9uIHwgdGhpc19YV2hpbGVFeHByZXNzaW9uXzk9IHJ1bGVYV2hpbGVFeHByZXNzaW9uIHwgdGhpc19YRG9XaGlsZUV4cHJlc3Npb25fMTA9IHJ1bGVYRG9XaGlsZUV4cHJlc3Npb24gfCB0aGlzX1hUaHJvd0V4cHJlc3Npb25fMTE9IHJ1bGVYVGhyb3dFeHByZXNzaW9uIHwgdGhpc19YUmV0dXJuRXhwcmVzc2lvbl8xMj0gcnVsZVhSZXR1cm5FeHByZXNzaW9uIHwgdGhpc19YVHJ5Q2F0Y2hGaW5hbGx5RXhwcmVzc2lvbl8xMz0gcnVsZVhUcnlDYXRjaEZpbmFsbHlFeHByZXNzaW9uIHwgdGhpc19YUGFyZW50aGVzaXplZEV4cHJlc3Npb25fMTQ9IHJ1bGVYUGFyZW50aGVzaXplZEV4cHJlc3Npb24gKQotICAgICAgICAgICAgaW50IGFsdDg3PTE1OwotICAgICAgICAgICAgYWx0ODcgPSBkZmE4Ny5wcmVkaWN0KGlucHV0KTsKLSAgICAgICAgICAgIHN3aXRjaCAoYWx0ODcpIHsKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjU0NTY6MjogKHRoaXNfWENvbnN0cnVjdG9yQ2FsbF8wPSBydWxlWENvbnN0cnVjdG9yQ2FsbCB8IHRoaXNfWEJsb2NrRXhwcmVzc2lvbl8xPSBydWxlWEJsb2NrRXhwcmVzc2lvbiB8IHRoaXNfWFN3aXRjaEV4cHJlc3Npb25fMj0gcnVsZVhTd2l0Y2hFeHByZXNzaW9uIHwgKCAoICggKCkgJ3N5bmNocm9uaXplZCcgJygnICkgKT0+dGhpc19YU3luY2hyb25pemVkRXhwcmVzc2lvbl8zPSBydWxlWFN5bmNocm9uaXplZEV4cHJlc3Npb24gKSB8IHRoaXNfWEZlYXR1cmVDYWxsXzQ9IHJ1bGVYRmVhdHVyZUNhbGwgfCB0aGlzX1hMaXRlcmFsXzU9IHJ1bGVYTGl0ZXJhbCB8IHRoaXNfWElmRXhwcmVzc2lvbl82PSBydWxlWElmRXhwcmVzc2lvbiB8ICggKCAoICgpICdmb3InICcoJyAoICggcnVsZUp2bUZvcm1hbFBhcmFtZXRlciApICkgJzonICkgKT0+dGhpc19YRm9yTG9vcEV4cHJlc3Npb25fNz0gcnVsZVhGb3JMb29wRXhwcmVzc2lvbiApIHwgdGhpc19YQmFzaWNGb3JMb29wRXhwcmVzc2lvbl84PSBydWxlWEJhc2ljRm9yTG9vcEV4cHJlc3Npb24gfCB0aGlzX1hXaGlsZUV4cHJlc3Npb25fOT0gcnVsZVhXaGlsZUV4cHJlc3Npb24gfCB0aGlzX1hEb1doaWxlRXhwcmVzc2lvbl8xMD0gcnVsZVhEb1doaWxlRXhwcmVzc2lvbiB8IHRoaXNfWFRocm93RXhwcmVzc2lvbl8xMT0gcnVsZVhUaHJvd0V4cHJlc3Npb24gfCB0aGlzX1hSZXR1cm5FeHByZXNzaW9uXzEyPSBydWxlWFJldHVybkV4cHJlc3Npb24gfCB0aGlzX1hUcnlDYXRjaEZpbmFsbHlFeHByZXNzaW9uXzEzPSBydWxlWFRyeUNhdGNoRmluYWxseUV4cHJlc3Npb24gfCB0aGlzX1hQYXJlbnRoZXNpemVkRXhwcmVzc2lvbl8xND0gcnVsZVhQYXJlbnRoZXNpemVkRXhwcmVzc2lvbiApCisgICAgICAgICAgICBpbnQgYWx0OTg9MTU7CisgICAgICAgICAgICBhbHQ5OCA9IGRmYTk4LnByZWRpY3QoaW5wdXQpOworICAgICAgICAgICAgc3dpdGNoIChhbHQ5OCkgewogICAgICAgICAgICAgICAgIGNhc2UgMSA6Ci0gICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjUwMTg6MzogdGhpc19YQ29uc3RydWN0b3JDYWxsXzA9IHJ1bGVYQ29uc3RydWN0b3JDYWxsCisgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjU0NTc6MzogdGhpc19YQ29uc3RydWN0b3JDYWxsXzA9IHJ1bGVYQ29uc3RydWN0b3JDYWxsCiAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAKQEAgLTEzOTI3LDcgKzE1MTIxLDcgQEAKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICBjYXNlIDIgOgotICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo1MDI3OjM6IHRoaXNfWEJsb2NrRXhwcmVzc2lvbl8xPSBydWxlWEJsb2NrRXhwcmVzc2lvbgorICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo1NDY2OjM6IHRoaXNfWEJsb2NrRXhwcmVzc2lvbl8xPSBydWxlWEJsb2NrRXhwcmVzc2lvbgogICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogCkBAIC0xMzk0OSw3ICsxNTE0Myw3IEBACiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgY2FzZSAzIDoKLSAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NTAzNjozOiB0aGlzX1hTd2l0Y2hFeHByZXNzaW9uXzI9IHJ1bGVYU3dpdGNoRXhwcmVzc2lvbgorICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo1NDc1OjM6IHRoaXNfWFN3aXRjaEV4cHJlc3Npb25fMj0gcnVsZVhTd2l0Y2hFeHByZXNzaW9uCiAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAKQEAgLTEzOTcxLDEwICsxNTE2NSwxMCBAQAogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgIGNhc2UgNCA6Ci0gICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjUwNDU6MzogKCAoICggKCkgJ3N5bmNocm9uaXplZCcgJygnICkgKT0+dGhpc19YU3luY2hyb25pemVkRXhwcmVzc2lvbl8zPSBydWxlWFN5bmNocm9uaXplZEV4cHJlc3Npb24gKQorICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo1NDg0OjM6ICggKCAoICgpICdzeW5jaHJvbml6ZWQnICcoJyApICk9PnRoaXNfWFN5bmNocm9uaXplZEV4cHJlc3Npb25fMz0gcnVsZVhTeW5jaHJvbml6ZWRFeHByZXNzaW9uICkKICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo1MDQ1OjM6ICggKCAoICgpICdzeW5jaHJvbml6ZWQnICcoJyApICk9PnRoaXNfWFN5bmNocm9uaXplZEV4cHJlc3Npb25fMz0gcnVsZVhTeW5jaHJvbml6ZWRFeHByZXNzaW9uICkKLSAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NTA0Njo0OiAoICggKCkgJ3N5bmNocm9uaXplZCcgJygnICkgKT0+dGhpc19YU3luY2hyb25pemVkRXhwcmVzc2lvbl8zPSBydWxlWFN5bmNocm9uaXplZEV4cHJlc3Npb24KKyAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NTQ4NDozOiAoICggKCAoKSAnc3luY2hyb25pemVkJyAnKCcgKSApPT50aGlzX1hTeW5jaHJvbml6ZWRFeHByZXNzaW9uXzM9IHJ1bGVYU3luY2hyb25pemVkRXhwcmVzc2lvbiApCisgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjU0ODU6NDogKCAoICgpICdzeW5jaHJvbml6ZWQnICcoJyApICk9PnRoaXNfWFN5bmNocm9uaXplZEV4cHJlc3Npb25fMz0gcnVsZVhTeW5jaHJvbml6ZWRFeHByZXNzaW9uCiAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAKQEAgLTEzOTk5LDcgKzE1MTkzLDcgQEAKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICBjYXNlIDUgOgotICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo1MDYzOjM6IHRoaXNfWEZlYXR1cmVDYWxsXzQ9IHJ1bGVYRmVhdHVyZUNhbGwKKyAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NTUwMjozOiB0aGlzX1hGZWF0dXJlQ2FsbF80PSBydWxlWEZlYXR1cmVDYWxsCiAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAKQEAgLTE0MDIxLDcgKzE1MjE1LDcgQEAKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICBjYXNlIDYgOgotICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo1MDcyOjM6IHRoaXNfWExpdGVyYWxfNT0gcnVsZVhMaXRlcmFsCisgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjU1MTE6MzogdGhpc19YTGl0ZXJhbF81PSBydWxlWExpdGVyYWwKICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKIApAQCAtMTQwNDMsNyArMTUyMzcsNyBAQAogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgIGNhc2UgNyA6Ci0gICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjUwODE6MzogdGhpc19YSWZFeHByZXNzaW9uXzY9IHJ1bGVYSWZFeHByZXNzaW9uCisgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjU1MjA6MzogdGhpc19YSWZFeHByZXNzaW9uXzY9IHJ1bGVYSWZFeHByZXNzaW9uCiAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAKQEAgLTE0MDY1LDEwICsxNTI1OSwxMCBAQAogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgIGNhc2UgOCA6Ci0gICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjUwOTA6MzogKCAoICggKCkgJ2ZvcicgJygnICggKCBydWxlSnZtRm9ybWFsUGFyYW1ldGVyICkgKSAnOicgKSApPT50aGlzX1hGb3JMb29wRXhwcmVzc2lvbl83PSBydWxlWEZvckxvb3BFeHByZXNzaW9uICkKKyAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NTUyOTozOiAoICggKCAoKSAnZm9yJyAnKCcgKCAoIHJ1bGVKdm1Gb3JtYWxQYXJhbWV0ZXIgKSApICc6JyApICk9PnRoaXNfWEZvckxvb3BFeHByZXNzaW9uXzc9IHJ1bGVYRm9yTG9vcEV4cHJlc3Npb24gKQogICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjUwOTA6MzogKCAoICggKCkgJ2ZvcicgJygnICggKCBydWxlSnZtRm9ybWFsUGFyYW1ldGVyICkgKSAnOicgKSApPT50aGlzX1hGb3JMb29wRXhwcmVzc2lvbl83PSBydWxlWEZvckxvb3BFeHByZXNzaW9uICkKLSAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NTA5MTo0OiAoICggKCkgJ2ZvcicgJygnICggKCBydWxlSnZtRm9ybWFsUGFyYW1ldGVyICkgKSAnOicgKSApPT50aGlzX1hGb3JMb29wRXhwcmVzc2lvbl83PSBydWxlWEZvckxvb3BFeHByZXNzaW9uCisgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjU1Mjk6MzogKCAoICggKCkgJ2ZvcicgJygnICggKCBydWxlSnZtRm9ybWFsUGFyYW1ldGVyICkgKSAnOicgKSApPT50aGlzX1hGb3JMb29wRXhwcmVzc2lvbl83PSBydWxlWEZvckxvb3BFeHByZXNzaW9uICkKKyAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NTUzMDo0OiAoICggKCkgJ2ZvcicgJygnICggKCBydWxlSnZtRm9ybWFsUGFyYW1ldGVyICkgKSAnOicgKSApPT50aGlzX1hGb3JMb29wRXhwcmVzc2lvbl83PSBydWxlWEZvckxvb3BFeHByZXNzaW9uCiAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAKQEAgLTE0MDkzLDcgKzE1Mjg3LDcgQEAKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICBjYXNlIDkgOgotICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo1MTE0OjM6IHRoaXNfWEJhc2ljRm9yTG9vcEV4cHJlc3Npb25fOD0gcnVsZVhCYXNpY0Zvckxvb3BFeHByZXNzaW9uCisgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjU1NTM6MzogdGhpc19YQmFzaWNGb3JMb29wRXhwcmVzc2lvbl84PSBydWxlWEJhc2ljRm9yTG9vcEV4cHJlc3Npb24KICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKIApAQCAtMTQxMTUsNyArMTUzMDksNyBAQAogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgIGNhc2UgMTAgOgotICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo1MTIzOjM6IHRoaXNfWFdoaWxlRXhwcmVzc2lvbl85PSBydWxlWFdoaWxlRXhwcmVzc2lvbgorICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo1NTYyOjM6IHRoaXNfWFdoaWxlRXhwcmVzc2lvbl85PSBydWxlWFdoaWxlRXhwcmVzc2lvbgogICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogCkBAIC0xNDEzNyw3ICsxNTMzMSw3IEBACiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgY2FzZSAxMSA6Ci0gICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjUxMzI6MzogdGhpc19YRG9XaGlsZUV4cHJlc3Npb25fMTA9IHJ1bGVYRG9XaGlsZUV4cHJlc3Npb24KKyAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NTU3MTozOiB0aGlzX1hEb1doaWxlRXhwcmVzc2lvbl8xMD0gcnVsZVhEb1doaWxlRXhwcmVzc2lvbgogICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogCkBAIC0xNDE1OSw3ICsxNTM1Myw3IEBACiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgY2FzZSAxMiA6Ci0gICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjUxNDE6MzogdGhpc19YVGhyb3dFeHByZXNzaW9uXzExPSBydWxlWFRocm93RXhwcmVzc2lvbgorICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo1NTgwOjM6IHRoaXNfWFRocm93RXhwcmVzc2lvbl8xMT0gcnVsZVhUaHJvd0V4cHJlc3Npb24KICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKIApAQCAtMTQxODEsNyArMTUzNzUsNyBAQAogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgIGNhc2UgMTMgOgotICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo1MTUwOjM6IHRoaXNfWFJldHVybkV4cHJlc3Npb25fMTI9IHJ1bGVYUmV0dXJuRXhwcmVzc2lvbgorICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo1NTg5OjM6IHRoaXNfWFJldHVybkV4cHJlc3Npb25fMTI9IHJ1bGVYUmV0dXJuRXhwcmVzc2lvbgogICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogCkBAIC0xNDIwMyw3ICsxNTM5Nyw3IEBACiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgY2FzZSAxNCA6Ci0gICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjUxNTk6MzogdGhpc19YVHJ5Q2F0Y2hGaW5hbGx5RXhwcmVzc2lvbl8xMz0gcnVsZVhUcnlDYXRjaEZpbmFsbHlFeHByZXNzaW9uCisgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjU1OTg6MzogdGhpc19YVHJ5Q2F0Y2hGaW5hbGx5RXhwcmVzc2lvbl8xMz0gcnVsZVhUcnlDYXRjaEZpbmFsbHlFeHByZXNzaW9uCiAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAKQEAgLTE0MjI1LDcgKzE1NDE5LDcgQEAKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICBjYXNlIDE1IDoKLSAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NTE2ODozOiB0aGlzX1hQYXJlbnRoZXNpemVkRXhwcmVzc2lvbl8xND0gcnVsZVhQYXJlbnRoZXNpemVkRXhwcmVzc2lvbgorICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo1NjA3OjM6IHRoaXNfWFBhcmVudGhlc2l6ZWRFeHByZXNzaW9uXzE0PSBydWxlWFBhcmVudGhlc2l6ZWRFeHByZXNzaW9uCiAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAKQEAgLTE0MjcxLDcgKzE1NDY1LDcgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJlbnRyeVJ1bGVYTGl0ZXJhbCIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo1MTgwOjE6IGVudHJ5UnVsZVhMaXRlcmFsIHJldHVybnMgW0VPYmplY3QgY3VycmVudD1udWxsXSA6IGl2X3J1bGVYTGl0ZXJhbD0gcnVsZVhMaXRlcmFsIEVPRiA7CisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NTYxOToxOiBlbnRyeVJ1bGVYTGl0ZXJhbCByZXR1cm5zIFtFT2JqZWN0IGN1cnJlbnQ9bnVsbF0gOiBpdl9ydWxlWExpdGVyYWw9IHJ1bGVYTGl0ZXJhbCBFT0YgOwogICAgIHB1YmxpYyBmaW5hbCBFT2JqZWN0IGVudHJ5UnVsZVhMaXRlcmFsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKICAgICAgICAgRU9iamVjdCBjdXJyZW50ID0gbnVsbDsKIApAQCAtMTQyNzksOCArMTU0NzMsOCBAQAogCiAKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjUxODA6NDk6IChpdl9ydWxlWExpdGVyYWw9IHJ1bGVYTGl0ZXJhbCBFT0YgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NTE4MToyOiBpdl9ydWxlWExpdGVyYWw9IHJ1bGVYTGl0ZXJhbCBFT0YKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjU2MTk6NDk6IChpdl9ydWxlWExpdGVyYWw9IHJ1bGVYTGl0ZXJhbCBFT0YgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NTYyMDoyOiBpdl9ydWxlWExpdGVyYWw9IHJ1bGVYTGl0ZXJhbCBFT0YKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgbmV3Q29tcG9zaXRlTm9kZShncmFtbWFyQWNjZXNzLmdldFhMaXRlcmFsUnVsZSgpKTsgCkBAIC0xNDMxMSw3ICsxNTUwNSw3IEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZVhMaXRlcmFsIgotICAgIC8vIEludGVybmFsRGF0YURTTC5nOjUxODc6MTogcnVsZVhMaXRlcmFsIHJldHVybnMgW0VPYmplY3QgY3VycmVudD1udWxsXSA6ICh0aGlzX1hDb2xsZWN0aW9uTGl0ZXJhbF8wPSBydWxlWENvbGxlY3Rpb25MaXRlcmFsIHwgKCAoICggKCkgJ1snICkgKT0+dGhpc19YQ2xvc3VyZV8xPSBydWxlWENsb3N1cmUgKSB8IHRoaXNfWEJvb2xlYW5MaXRlcmFsXzI9IHJ1bGVYQm9vbGVhbkxpdGVyYWwgfCB0aGlzX1hOdW1iZXJMaXRlcmFsXzM9IHJ1bGVYTnVtYmVyTGl0ZXJhbCB8IHRoaXNfWE51bGxMaXRlcmFsXzQ9IHJ1bGVYTnVsbExpdGVyYWwgfCB0aGlzX1hTdHJpbmdMaXRlcmFsXzU9IHJ1bGVYU3RyaW5nTGl0ZXJhbCB8IHRoaXNfWFR5cGVMaXRlcmFsXzY9IHJ1bGVYVHlwZUxpdGVyYWwgKSA7CisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NTYyNjoxOiBydWxlWExpdGVyYWwgcmV0dXJucyBbRU9iamVjdCBjdXJyZW50PW51bGxdIDogKHRoaXNfWENvbGxlY3Rpb25MaXRlcmFsXzA9IHJ1bGVYQ29sbGVjdGlvbkxpdGVyYWwgfCAoICggKCAoKSAnWycgKSApPT50aGlzX1hDbG9zdXJlXzE9IHJ1bGVYQ2xvc3VyZSApIHwgdGhpc19YQm9vbGVhbkxpdGVyYWxfMj0gcnVsZVhCb29sZWFuTGl0ZXJhbCB8IHRoaXNfWE51bWJlckxpdGVyYWxfMz0gcnVsZVhOdW1iZXJMaXRlcmFsIHwgdGhpc19YTnVsbExpdGVyYWxfND0gcnVsZVhOdWxsTGl0ZXJhbCB8IHRoaXNfWFN0cmluZ0xpdGVyYWxfNT0gcnVsZVhTdHJpbmdMaXRlcmFsIHwgdGhpc19YVHlwZUxpdGVyYWxfNj0gcnVsZVhUeXBlTGl0ZXJhbCApIDsKICAgICBwdWJsaWMgZmluYWwgRU9iamVjdCBydWxlWExpdGVyYWwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogICAgICAgICBFT2JqZWN0IGN1cnJlbnQgPSBudWxsOwogCkBAIC0xNDMzNCw0NCArMTU1MjgsNDQgQEAKICAgICAgICAgCWVudGVyUnVsZSgpOwogCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo1MTkzOjI6ICggKHRoaXNfWENvbGxlY3Rpb25MaXRlcmFsXzA9IHJ1bGVYQ29sbGVjdGlvbkxpdGVyYWwgfCAoICggKCAoKSAnWycgKSApPT50aGlzX1hDbG9zdXJlXzE9IHJ1bGVYQ2xvc3VyZSApIHwgdGhpc19YQm9vbGVhbkxpdGVyYWxfMj0gcnVsZVhCb29sZWFuTGl0ZXJhbCB8IHRoaXNfWE51bWJlckxpdGVyYWxfMz0gcnVsZVhOdW1iZXJMaXRlcmFsIHwgdGhpc19YTnVsbExpdGVyYWxfND0gcnVsZVhOdWxsTGl0ZXJhbCB8IHRoaXNfWFN0cmluZ0xpdGVyYWxfNT0gcnVsZVhTdHJpbmdMaXRlcmFsIHwgdGhpc19YVHlwZUxpdGVyYWxfNj0gcnVsZVhUeXBlTGl0ZXJhbCApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjUxOTQ6MjogKHRoaXNfWENvbGxlY3Rpb25MaXRlcmFsXzA9IHJ1bGVYQ29sbGVjdGlvbkxpdGVyYWwgfCAoICggKCAoKSAnWycgKSApPT50aGlzX1hDbG9zdXJlXzE9IHJ1bGVYQ2xvc3VyZSApIHwgdGhpc19YQm9vbGVhbkxpdGVyYWxfMj0gcnVsZVhCb29sZWFuTGl0ZXJhbCB8IHRoaXNfWE51bWJlckxpdGVyYWxfMz0gcnVsZVhOdW1iZXJMaXRlcmFsIHwgdGhpc19YTnVsbExpdGVyYWxfND0gcnVsZVhOdWxsTGl0ZXJhbCB8IHRoaXNfWFN0cmluZ0xpdGVyYWxfNT0gcnVsZVhTdHJpbmdMaXRlcmFsIHwgdGhpc19YVHlwZUxpdGVyYWxfNj0gcnVsZVhUeXBlTGl0ZXJhbCApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo1NjMyOjI6ICggKHRoaXNfWENvbGxlY3Rpb25MaXRlcmFsXzA9IHJ1bGVYQ29sbGVjdGlvbkxpdGVyYWwgfCAoICggKCAoKSAnWycgKSApPT50aGlzX1hDbG9zdXJlXzE9IHJ1bGVYQ2xvc3VyZSApIHwgdGhpc19YQm9vbGVhbkxpdGVyYWxfMj0gcnVsZVhCb29sZWFuTGl0ZXJhbCB8IHRoaXNfWE51bWJlckxpdGVyYWxfMz0gcnVsZVhOdW1iZXJMaXRlcmFsIHwgdGhpc19YTnVsbExpdGVyYWxfND0gcnVsZVhOdWxsTGl0ZXJhbCB8IHRoaXNfWFN0cmluZ0xpdGVyYWxfNT0gcnVsZVhTdHJpbmdMaXRlcmFsIHwgdGhpc19YVHlwZUxpdGVyYWxfNj0gcnVsZVhUeXBlTGl0ZXJhbCApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjU2MzM6MjogKHRoaXNfWENvbGxlY3Rpb25MaXRlcmFsXzA9IHJ1bGVYQ29sbGVjdGlvbkxpdGVyYWwgfCAoICggKCAoKSAnWycgKSApPT50aGlzX1hDbG9zdXJlXzE9IHJ1bGVYQ2xvc3VyZSApIHwgdGhpc19YQm9vbGVhbkxpdGVyYWxfMj0gcnVsZVhCb29sZWFuTGl0ZXJhbCB8IHRoaXNfWE51bWJlckxpdGVyYWxfMz0gcnVsZVhOdW1iZXJMaXRlcmFsIHwgdGhpc19YTnVsbExpdGVyYWxfND0gcnVsZVhOdWxsTGl0ZXJhbCB8IHRoaXNfWFN0cmluZ0xpdGVyYWxfNT0gcnVsZVhTdHJpbmdMaXRlcmFsIHwgdGhpc19YVHlwZUxpdGVyYWxfNj0gcnVsZVhUeXBlTGl0ZXJhbCApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo1MTk0OjI6ICh0aGlzX1hDb2xsZWN0aW9uTGl0ZXJhbF8wPSBydWxlWENvbGxlY3Rpb25MaXRlcmFsIHwgKCAoICggKCkgJ1snICkgKT0+dGhpc19YQ2xvc3VyZV8xPSBydWxlWENsb3N1cmUgKSB8IHRoaXNfWEJvb2xlYW5MaXRlcmFsXzI9IHJ1bGVYQm9vbGVhbkxpdGVyYWwgfCB0aGlzX1hOdW1iZXJMaXRlcmFsXzM9IHJ1bGVYTnVtYmVyTGl0ZXJhbCB8IHRoaXNfWE51bGxMaXRlcmFsXzQ9IHJ1bGVYTnVsbExpdGVyYWwgfCB0aGlzX1hTdHJpbmdMaXRlcmFsXzU9IHJ1bGVYU3RyaW5nTGl0ZXJhbCB8IHRoaXNfWFR5cGVMaXRlcmFsXzY9IHJ1bGVYVHlwZUxpdGVyYWwgKQotICAgICAgICAgICAgaW50IGFsdDg4PTc7Ci0gICAgICAgICAgICBpbnQgTEE4OF8wID0gaW5wdXQuTEEoMSk7CisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo1NjMzOjI6ICh0aGlzX1hDb2xsZWN0aW9uTGl0ZXJhbF8wPSBydWxlWENvbGxlY3Rpb25MaXRlcmFsIHwgKCAoICggKCkgJ1snICkgKT0+dGhpc19YQ2xvc3VyZV8xPSBydWxlWENsb3N1cmUgKSB8IHRoaXNfWEJvb2xlYW5MaXRlcmFsXzI9IHJ1bGVYQm9vbGVhbkxpdGVyYWwgfCB0aGlzX1hOdW1iZXJMaXRlcmFsXzM9IHJ1bGVYTnVtYmVyTGl0ZXJhbCB8IHRoaXNfWE51bGxMaXRlcmFsXzQ9IHJ1bGVYTnVsbExpdGVyYWwgfCB0aGlzX1hTdHJpbmdMaXRlcmFsXzU9IHJ1bGVYU3RyaW5nTGl0ZXJhbCB8IHRoaXNfWFR5cGVMaXRlcmFsXzY9IHJ1bGVYVHlwZUxpdGVyYWwgKQorICAgICAgICAgICAgaW50IGFsdDk5PTc7CisgICAgICAgICAgICBpbnQgTEE5OV8wID0gaW5wdXQuTEEoMSk7CiAKLSAgICAgICAgICAgIGlmICggKExBODhfMD09NzgpICkgewotICAgICAgICAgICAgICAgIGFsdDg4PTE7CisgICAgICAgICAgICBpZiAoIChMQTk5XzA9PTg1KSApIHsKKyAgICAgICAgICAgICAgICBhbHQ5OT0xOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSBpZiAoIChMQTg4XzA9PTc5KSAmJiAoc3lucHJlZDI3X0ludGVybmFsRGF0YURTTCgpKSkgewotICAgICAgICAgICAgICAgIGFsdDg4PTI7CisgICAgICAgICAgICBlbHNlIGlmICggKExBOTlfMD09ODYpICYmIChzeW5wcmVkMjdfSW50ZXJuYWxEYXRhRFNMKCkpKSB7CisgICAgICAgICAgICAgICAgYWx0OTk9MjsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgaWYgKCAoKExBODhfMD49MTI2ICYmIExBODhfMDw9MTI3KSkgKSB7Ci0gICAgICAgICAgICAgICAgYWx0ODg9MzsKKyAgICAgICAgICAgIGVsc2UgaWYgKCAoKExBOTlfMD49MTMzICYmIExBOTlfMDw9MTM0KSkgKSB7CisgICAgICAgICAgICAgICAgYWx0OTk9MzsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgaWYgKCAoTEE4OF8wPT1SVUxFX0lOVHx8KExBODhfMD49UlVMRV9IRVggJiYgTEE4OF8wPD1SVUxFX0RFQ0lNQUwpKSApIHsKLSAgICAgICAgICAgICAgICBhbHQ4OD00OworICAgICAgICAgICAgZWxzZSBpZiAoIChMQTk5XzA9PVJVTEVfSU5UfHwoTEE5OV8wPj1SVUxFX0hFWCAmJiBMQTk5XzA8PVJVTEVfREVDSU1BTCkpICkgeworICAgICAgICAgICAgICAgIGFsdDk5PTQ7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIGlmICggKExBODhfMD09MTI4KSApIHsKLSAgICAgICAgICAgICAgICBhbHQ4OD01OworICAgICAgICAgICAgZWxzZSBpZiAoIChMQTk5XzA9PTEzNSkgKSB7CisgICAgICAgICAgICAgICAgYWx0OTk9NTsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgaWYgKCAoTEE4OF8wPT1SVUxFX1NUUklORykgKSB7Ci0gICAgICAgICAgICAgICAgYWx0ODg9NjsKKyAgICAgICAgICAgIGVsc2UgaWYgKCAoTEE5OV8wPT1SVUxFX1NUUklORykgKSB7CisgICAgICAgICAgICAgICAgYWx0OTk9NjsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgaWYgKCAoTEE4OF8wPT0xMjkpICkgewotICAgICAgICAgICAgICAgIGFsdDg4PTc7CisgICAgICAgICAgICBlbHNlIGlmICggKExBOTlfMD09MTM2KSApIHsKKyAgICAgICAgICAgICAgICBhbHQ5OT03OwogICAgICAgICAgICAgfQogICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgaWYgKHN0YXRlLmJhY2t0cmFja2luZz4wKSB7c3RhdGUuZmFpbGVkPXRydWU7IHJldHVybiBjdXJyZW50O30KICAgICAgICAgICAgICAgICBOb1ZpYWJsZUFsdEV4Y2VwdGlvbiBudmFlID0KLSAgICAgICAgICAgICAgICAgICAgbmV3IE5vVmlhYmxlQWx0RXhjZXB0aW9uKCIiLCA4OCwgMCwgaW5wdXQpOworICAgICAgICAgICAgICAgICAgICBuZXcgTm9WaWFibGVBbHRFeGNlcHRpb24oIiIsIDk5LCAwLCBpbnB1dCk7CiAKICAgICAgICAgICAgICAgICB0aHJvdyBudmFlOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgc3dpdGNoIChhbHQ4OCkgeworICAgICAgICAgICAgc3dpdGNoIChhbHQ5OSkgewogICAgICAgICAgICAgICAgIGNhc2UgMSA6Ci0gICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjUxOTU6MzogdGhpc19YQ29sbGVjdGlvbkxpdGVyYWxfMD0gcnVsZVhDb2xsZWN0aW9uTGl0ZXJhbAorICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo1NjM0OjM6IHRoaXNfWENvbGxlY3Rpb25MaXRlcmFsXzA9IHJ1bGVYQ29sbGVjdGlvbkxpdGVyYWwKICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKIApAQCAtMTQzOTMsMTAgKzE1NTg3LDEwIEBACiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgY2FzZSAyIDoKLSAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NTIwNDozOiAoICggKCAoKSAnWycgKSApPT50aGlzX1hDbG9zdXJlXzE9IHJ1bGVYQ2xvc3VyZSApCisgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjU2NDM6MzogKCAoICggKCkgJ1snICkgKT0+dGhpc19YQ2xvc3VyZV8xPSBydWxlWENsb3N1cmUgKQogICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjUyMDQ6MzogKCAoICggKCkgJ1snICkgKT0+dGhpc19YQ2xvc3VyZV8xPSBydWxlWENsb3N1cmUgKQotICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo1MjA1OjQ6ICggKCAoKSAnWycgKSApPT50aGlzX1hDbG9zdXJlXzE9IHJ1bGVYQ2xvc3VyZQorICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo1NjQzOjM6ICggKCAoICgpICdbJyApICk9PnRoaXNfWENsb3N1cmVfMT0gcnVsZVhDbG9zdXJlICkKKyAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NTY0NDo0OiAoICggKCkgJ1snICkgKT0+dGhpc19YQ2xvc3VyZV8xPSBydWxlWENsb3N1cmUKICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKIApAQCAtMTQ0MjEsNyArMTU2MTUsNyBAQAogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgIGNhc2UgMyA6Ci0gICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjUyMjE6MzogdGhpc19YQm9vbGVhbkxpdGVyYWxfMj0gcnVsZVhCb29sZWFuTGl0ZXJhbAorICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo1NjYwOjM6IHRoaXNfWEJvb2xlYW5MaXRlcmFsXzI9IHJ1bGVYQm9vbGVhbkxpdGVyYWwKICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKIApAQCAtMTQ0NDMsNyArMTU2MzcsNyBAQAogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgIGNhc2UgNCA6Ci0gICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjUyMzA6MzogdGhpc19YTnVtYmVyTGl0ZXJhbF8zPSBydWxlWE51bWJlckxpdGVyYWwKKyAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NTY2OTozOiB0aGlzX1hOdW1iZXJMaXRlcmFsXzM9IHJ1bGVYTnVtYmVyTGl0ZXJhbAogICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogCkBAIC0xNDQ2NSw3ICsxNTY1OSw3IEBACiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgY2FzZSA1IDoKLSAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NTIzOTozOiB0aGlzX1hOdWxsTGl0ZXJhbF80PSBydWxlWE51bGxMaXRlcmFsCisgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjU2Nzg6MzogdGhpc19YTnVsbExpdGVyYWxfND0gcnVsZVhOdWxsTGl0ZXJhbAogICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogCkBAIC0xNDQ4Nyw3ICsxNTY4MSw3IEBACiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgY2FzZSA2IDoKLSAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NTI0ODozOiB0aGlzX1hTdHJpbmdMaXRlcmFsXzU9IHJ1bGVYU3RyaW5nTGl0ZXJhbAorICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo1Njg3OjM6IHRoaXNfWFN0cmluZ0xpdGVyYWxfNT0gcnVsZVhTdHJpbmdMaXRlcmFsCiAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAKQEAgLTE0NTA5LDcgKzE1NzAzLDcgQEAKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICBjYXNlIDcgOgotICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo1MjU3OjM6IHRoaXNfWFR5cGVMaXRlcmFsXzY9IHJ1bGVYVHlwZUxpdGVyYWwKKyAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NTY5NjozOiB0aGlzX1hUeXBlTGl0ZXJhbF82PSBydWxlWFR5cGVMaXRlcmFsCiAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAKQEAgLTE0NTU1LDcgKzE1NzQ5LDcgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJlbnRyeVJ1bGVYQ29sbGVjdGlvbkxpdGVyYWwiCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NTI2OToxOiBlbnRyeVJ1bGVYQ29sbGVjdGlvbkxpdGVyYWwgcmV0dXJucyBbRU9iamVjdCBjdXJyZW50PW51bGxdIDogaXZfcnVsZVhDb2xsZWN0aW9uTGl0ZXJhbD0gcnVsZVhDb2xsZWN0aW9uTGl0ZXJhbCBFT0YgOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjU3MDg6MTogZW50cnlSdWxlWENvbGxlY3Rpb25MaXRlcmFsIHJldHVybnMgW0VPYmplY3QgY3VycmVudD1udWxsXSA6IGl2X3J1bGVYQ29sbGVjdGlvbkxpdGVyYWw9IHJ1bGVYQ29sbGVjdGlvbkxpdGVyYWwgRU9GIDsKICAgICBwdWJsaWMgZmluYWwgRU9iamVjdCBlbnRyeVJ1bGVYQ29sbGVjdGlvbkxpdGVyYWwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogICAgICAgICBFT2JqZWN0IGN1cnJlbnQgPSBudWxsOwogCkBAIC0xNDU2Myw4ICsxNTc1Nyw4IEBACiAKIAogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NTI2OTo1OTogKGl2X3J1bGVYQ29sbGVjdGlvbkxpdGVyYWw9IHJ1bGVYQ29sbGVjdGlvbkxpdGVyYWwgRU9GICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjUyNzA6MjogaXZfcnVsZVhDb2xsZWN0aW9uTGl0ZXJhbD0gcnVsZVhDb2xsZWN0aW9uTGl0ZXJhbCBFT0YKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjU3MDg6NTk6IChpdl9ydWxlWENvbGxlY3Rpb25MaXRlcmFsPSBydWxlWENvbGxlY3Rpb25MaXRlcmFsIEVPRiApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo1NzA5OjI6IGl2X3J1bGVYQ29sbGVjdGlvbkxpdGVyYWw9IHJ1bGVYQ29sbGVjdGlvbkxpdGVyYWwgRU9GCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIG5ld0NvbXBvc2l0ZU5vZGUoZ3JhbW1hckFjY2Vzcy5nZXRYQ29sbGVjdGlvbkxpdGVyYWxSdWxlKCkpOyAKQEAgLTE0NTk1LDcgKzE1Nzg5LDcgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlWENvbGxlY3Rpb25MaXRlcmFsIgotICAgIC8vIEludGVybmFsRGF0YURTTC5nOjUyNzY6MTogcnVsZVhDb2xsZWN0aW9uTGl0ZXJhbCByZXR1cm5zIFtFT2JqZWN0IGN1cnJlbnQ9bnVsbF0gOiAodGhpc19YU2V0TGl0ZXJhbF8wPSBydWxlWFNldExpdGVyYWwgfCB0aGlzX1hMaXN0TGl0ZXJhbF8xPSBydWxlWExpc3RMaXRlcmFsICkgOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjU3MTU6MTogcnVsZVhDb2xsZWN0aW9uTGl0ZXJhbCByZXR1cm5zIFtFT2JqZWN0IGN1cnJlbnQ9bnVsbF0gOiAodGhpc19YU2V0TGl0ZXJhbF8wPSBydWxlWFNldExpdGVyYWwgfCB0aGlzX1hMaXN0TGl0ZXJhbF8xPSBydWxlWExpc3RMaXRlcmFsICkgOwogICAgIHB1YmxpYyBmaW5hbCBFT2JqZWN0IHJ1bGVYQ29sbGVjdGlvbkxpdGVyYWwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogICAgICAgICBFT2JqZWN0IGN1cnJlbnQgPSBudWxsOwogCkBAIC0xNDYwOCwyNiArMTU4MDIsMjYgQEAKICAgICAgICAgCWVudGVyUnVsZSgpOwogCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo1MjgyOjI6ICggKHRoaXNfWFNldExpdGVyYWxfMD0gcnVsZVhTZXRMaXRlcmFsIHwgdGhpc19YTGlzdExpdGVyYWxfMT0gcnVsZVhMaXN0TGl0ZXJhbCApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjUyODM6MjogKHRoaXNfWFNldExpdGVyYWxfMD0gcnVsZVhTZXRMaXRlcmFsIHwgdGhpc19YTGlzdExpdGVyYWxfMT0gcnVsZVhMaXN0TGl0ZXJhbCApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo1NzIxOjI6ICggKHRoaXNfWFNldExpdGVyYWxfMD0gcnVsZVhTZXRMaXRlcmFsIHwgdGhpc19YTGlzdExpdGVyYWxfMT0gcnVsZVhMaXN0TGl0ZXJhbCApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjU3MjI6MjogKHRoaXNfWFNldExpdGVyYWxfMD0gcnVsZVhTZXRMaXRlcmFsIHwgdGhpc19YTGlzdExpdGVyYWxfMT0gcnVsZVhMaXN0TGl0ZXJhbCApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo1MjgzOjI6ICh0aGlzX1hTZXRMaXRlcmFsXzA9IHJ1bGVYU2V0TGl0ZXJhbCB8IHRoaXNfWExpc3RMaXRlcmFsXzE9IHJ1bGVYTGlzdExpdGVyYWwgKQotICAgICAgICAgICAgaW50IGFsdDg5PTI7Ci0gICAgICAgICAgICBpbnQgTEE4OV8wID0gaW5wdXQuTEEoMSk7CisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo1NzIyOjI6ICh0aGlzX1hTZXRMaXRlcmFsXzA9IHJ1bGVYU2V0TGl0ZXJhbCB8IHRoaXNfWExpc3RMaXRlcmFsXzE9IHJ1bGVYTGlzdExpdGVyYWwgKQorICAgICAgICAgICAgaW50IGFsdDEwMD0yOworICAgICAgICAgICAgaW50IExBMTAwXzAgPSBpbnB1dC5MQSgxKTsKIAotICAgICAgICAgICAgaWYgKCAoTEE4OV8wPT03OCkgKSB7Ci0gICAgICAgICAgICAgICAgaW50IExBODlfMSA9IGlucHV0LkxBKDIpOworICAgICAgICAgICAgaWYgKCAoTEExMDBfMD09ODUpICkgeworICAgICAgICAgICAgICAgIGludCBMQTEwMF8xID0gaW5wdXQuTEEoMik7CiAKLSAgICAgICAgICAgICAgICBpZiAoIChMQTg5XzE9PTc5KSApIHsKLSAgICAgICAgICAgICAgICAgICAgYWx0ODk9MjsKKyAgICAgICAgICAgICAgICBpZiAoIChMQTEwMF8xPT04NikgKSB7CisgICAgICAgICAgICAgICAgICAgIGFsdDEwMD0yOwogICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlIGlmICggKExBODlfMT09MTUpICkgewotICAgICAgICAgICAgICAgICAgICBhbHQ4OT0xOworICAgICAgICAgICAgICAgIGVsc2UgaWYgKCAoTEExMDBfMT09MTUpICkgeworICAgICAgICAgICAgICAgICAgICBhbHQxMDA9MTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgIGlmIChzdGF0ZS5iYWNrdHJhY2tpbmc+MCkge3N0YXRlLmZhaWxlZD10cnVlOyByZXR1cm4gY3VycmVudDt9CiAgICAgICAgICAgICAgICAgICAgIE5vVmlhYmxlQWx0RXhjZXB0aW9uIG52YWUgPQotICAgICAgICAgICAgICAgICAgICAgICAgbmV3IE5vVmlhYmxlQWx0RXhjZXB0aW9uKCIiLCA4OSwgMSwgaW5wdXQpOworICAgICAgICAgICAgICAgICAgICAgICAgbmV3IE5vVmlhYmxlQWx0RXhjZXB0aW9uKCIiLCAxMDAsIDEsIGlucHV0KTsKIAogICAgICAgICAgICAgICAgICAgICB0aHJvdyBudmFlOwogICAgICAgICAgICAgICAgIH0KQEAgLTE0NjM1LDEzICsxNTgyOSwxMyBAQAogICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgaWYgKHN0YXRlLmJhY2t0cmFja2luZz4wKSB7c3RhdGUuZmFpbGVkPXRydWU7IHJldHVybiBjdXJyZW50O30KICAgICAgICAgICAgICAgICBOb1ZpYWJsZUFsdEV4Y2VwdGlvbiBudmFlID0KLSAgICAgICAgICAgICAgICAgICAgbmV3IE5vVmlhYmxlQWx0RXhjZXB0aW9uKCIiLCA4OSwgMCwgaW5wdXQpOworICAgICAgICAgICAgICAgICAgICBuZXcgTm9WaWFibGVBbHRFeGNlcHRpb24oIiIsIDEwMCwgMCwgaW5wdXQpOwogCiAgICAgICAgICAgICAgICAgdGhyb3cgbnZhZTsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHN3aXRjaCAoYWx0ODkpIHsKKyAgICAgICAgICAgIHN3aXRjaCAoYWx0MTAwKSB7CiAgICAgICAgICAgICAgICAgY2FzZSAxIDoKLSAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NTI4NDozOiB0aGlzX1hTZXRMaXRlcmFsXzA9IHJ1bGVYU2V0TGl0ZXJhbAorICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo1NzIzOjM6IHRoaXNfWFNldExpdGVyYWxfMD0gcnVsZVhTZXRMaXRlcmFsCiAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAKQEAgLTE0NjYzLDcgKzE1ODU3LDcgQEAKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICBjYXNlIDIgOgotICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo1MjkzOjM6IHRoaXNfWExpc3RMaXRlcmFsXzE9IHJ1bGVYTGlzdExpdGVyYWwKKyAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NTczMjozOiB0aGlzX1hMaXN0TGl0ZXJhbF8xPSBydWxlWExpc3RMaXRlcmFsCiAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAKQEAgLTE0NzA5LDcgKzE1OTAzLDcgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJlbnRyeVJ1bGVYU2V0TGl0ZXJhbCIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo1MzA1OjE6IGVudHJ5UnVsZVhTZXRMaXRlcmFsIHJldHVybnMgW0VPYmplY3QgY3VycmVudD1udWxsXSA6IGl2X3J1bGVYU2V0TGl0ZXJhbD0gcnVsZVhTZXRMaXRlcmFsIEVPRiA7CisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NTc0NDoxOiBlbnRyeVJ1bGVYU2V0TGl0ZXJhbCByZXR1cm5zIFtFT2JqZWN0IGN1cnJlbnQ9bnVsbF0gOiBpdl9ydWxlWFNldExpdGVyYWw9IHJ1bGVYU2V0TGl0ZXJhbCBFT0YgOwogICAgIHB1YmxpYyBmaW5hbCBFT2JqZWN0IGVudHJ5UnVsZVhTZXRMaXRlcmFsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKICAgICAgICAgRU9iamVjdCBjdXJyZW50ID0gbnVsbDsKIApAQCAtMTQ3MTcsOCArMTU5MTEsOCBAQAogCiAKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjUzMDU6NTI6IChpdl9ydWxlWFNldExpdGVyYWw9IHJ1bGVYU2V0TGl0ZXJhbCBFT0YgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NTMwNjoyOiBpdl9ydWxlWFNldExpdGVyYWw9IHJ1bGVYU2V0TGl0ZXJhbCBFT0YKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjU3NDQ6NTI6IChpdl9ydWxlWFNldExpdGVyYWw9IHJ1bGVYU2V0TGl0ZXJhbCBFT0YgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NTc0NToyOiBpdl9ydWxlWFNldExpdGVyYWw9IHJ1bGVYU2V0TGl0ZXJhbCBFT0YKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgbmV3Q29tcG9zaXRlTm9kZShncmFtbWFyQWNjZXNzLmdldFhTZXRMaXRlcmFsUnVsZSgpKTsgCkBAIC0xNDc0OSw3ICsxNTk0Myw3IEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZVhTZXRMaXRlcmFsIgotICAgIC8vIEludGVybmFsRGF0YURTTC5nOjUzMTI6MTogcnVsZVhTZXRMaXRlcmFsIHJldHVybnMgW0VPYmplY3QgY3VycmVudD1udWxsXSA6ICggKCkgb3RoZXJsdl8xPSAnIycgb3RoZXJsdl8yPSAneycgKCAoIChsdl9lbGVtZW50c18zXzA9IHJ1bGVYRXhwcmVzc2lvbiApICkgKG90aGVybHZfND0gJywnICggKGx2X2VsZW1lbnRzXzVfMD0gcnVsZVhFeHByZXNzaW9uICkgKSApKiApPyBvdGhlcmx2XzY9ICd9JyApIDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo1NzUxOjE6IHJ1bGVYU2V0TGl0ZXJhbCByZXR1cm5zIFtFT2JqZWN0IGN1cnJlbnQ9bnVsbF0gOiAoICgpIG90aGVybHZfMT0gJyMnIG90aGVybHZfMj0gJ3snICggKCAobHZfZWxlbWVudHNfM18wPSBydWxlWEV4cHJlc3Npb24gKSApIChvdGhlcmx2XzQ9ICcsJyAoIChsdl9lbGVtZW50c181XzA9IHJ1bGVYRXhwcmVzc2lvbiApICkgKSogKT8gb3RoZXJsdl82PSAnfScgKSA7CiAgICAgcHVibGljIGZpbmFsIEVPYmplY3QgcnVsZVhTZXRMaXRlcmFsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKICAgICAgICAgRU9iamVjdCBjdXJyZW50ID0gbnVsbDsKIApAQCAtMTQ3NjYsMTQgKzE1OTYwLDE0IEBACiAgICAgICAgIAllbnRlclJ1bGUoKTsKIAogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NTMxODoyOiAoICggKCkgb3RoZXJsdl8xPSAnIycgb3RoZXJsdl8yPSAneycgKCAoIChsdl9lbGVtZW50c18zXzA9IHJ1bGVYRXhwcmVzc2lvbiApICkgKG90aGVybHZfND0gJywnICggKGx2X2VsZW1lbnRzXzVfMD0gcnVsZVhFeHByZXNzaW9uICkgKSApKiApPyBvdGhlcmx2XzY9ICd9JyApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjUzMTk6MjogKCAoKSBvdGhlcmx2XzE9ICcjJyBvdGhlcmx2XzI9ICd7JyAoICggKGx2X2VsZW1lbnRzXzNfMD0gcnVsZVhFeHByZXNzaW9uICkgKSAob3RoZXJsdl80PSAnLCcgKCAobHZfZWxlbWVudHNfNV8wPSBydWxlWEV4cHJlc3Npb24gKSApICkqICk/IG90aGVybHZfNj0gJ30nICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjU3NTc6MjogKCAoICgpIG90aGVybHZfMT0gJyMnIG90aGVybHZfMj0gJ3snICggKCAobHZfZWxlbWVudHNfM18wPSBydWxlWEV4cHJlc3Npb24gKSApIChvdGhlcmx2XzQ9ICcsJyAoIChsdl9lbGVtZW50c181XzA9IHJ1bGVYRXhwcmVzc2lvbiApICkgKSogKT8gb3RoZXJsdl82PSAnfScgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo1NzU4OjI6ICggKCkgb3RoZXJsdl8xPSAnIycgb3RoZXJsdl8yPSAneycgKCAoIChsdl9lbGVtZW50c18zXzA9IHJ1bGVYRXhwcmVzc2lvbiApICkgKG90aGVybHZfND0gJywnICggKGx2X2VsZW1lbnRzXzVfMD0gcnVsZVhFeHByZXNzaW9uICkgKSApKiApPyBvdGhlcmx2XzY9ICd9JyApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo1MzE5OjI6ICggKCkgb3RoZXJsdl8xPSAnIycgb3RoZXJsdl8yPSAneycgKCAoIChsdl9lbGVtZW50c18zXzA9IHJ1bGVYRXhwcmVzc2lvbiApICkgKG90aGVybHZfND0gJywnICggKGx2X2VsZW1lbnRzXzVfMD0gcnVsZVhFeHByZXNzaW9uICkgKSApKiApPyBvdGhlcmx2XzY9ICd9JyApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo1MzIwOjM6ICgpIG90aGVybHZfMT0gJyMnIG90aGVybHZfMj0gJ3snICggKCAobHZfZWxlbWVudHNfM18wPSBydWxlWEV4cHJlc3Npb24gKSApIChvdGhlcmx2XzQ9ICcsJyAoIChsdl9lbGVtZW50c181XzA9IHJ1bGVYRXhwcmVzc2lvbiApICkgKSogKT8gb3RoZXJsdl82PSAnfScKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjU3NTg6MjogKCAoKSBvdGhlcmx2XzE9ICcjJyBvdGhlcmx2XzI9ICd7JyAoICggKGx2X2VsZW1lbnRzXzNfMD0gcnVsZVhFeHByZXNzaW9uICkgKSAob3RoZXJsdl80PSAnLCcgKCAobHZfZWxlbWVudHNfNV8wPSBydWxlWEV4cHJlc3Npb24gKSApICkqICk/IG90aGVybHZfNj0gJ30nICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjU3NTk6MzogKCkgb3RoZXJsdl8xPSAnIycgb3RoZXJsdl8yPSAneycgKCAoIChsdl9lbGVtZW50c18zXzA9IHJ1bGVYRXhwcmVzc2lvbiApICkgKG90aGVybHZfND0gJywnICggKGx2X2VsZW1lbnRzXzVfMD0gcnVsZVhFeHByZXNzaW9uICkgKSApKiApPyBvdGhlcmx2XzY9ICd9JwogICAgICAgICAgICAgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NTMyMDozOiAoKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NTMyMTo0OiAKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjU3NTk6MzogKCkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjU3NjA6NDogCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKIApAQCAtMTQ3ODUsNDEgKzE1OTc5LDQxIEBACiAKICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgb3RoZXJsdl8xPShUb2tlbiltYXRjaChpbnB1dCw3OCxGT0xMT1dfMTcpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gY3VycmVudDsKKyAgICAgICAgICAgIG90aGVybHZfMT0oVG9rZW4pbWF0Y2goaW5wdXQsODUsRk9MTE9XXzE4KTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKIAogICAgICAgICAgICAgICAJCQluZXdMZWFmTm9kZShvdGhlcmx2XzEsIGdyYW1tYXJBY2Nlc3MuZ2V0WFNldExpdGVyYWxBY2Nlc3MoKS5nZXROdW1iZXJTaWduS2V5d29yZF8xKCkpOwogICAgICAgICAgICAgICAJCQogICAgICAgICAgICAgfQotICAgICAgICAgICAgb3RoZXJsdl8yPShUb2tlbiltYXRjaChpbnB1dCwxNSxGT0xMT1dfOTQpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gY3VycmVudDsKKyAgICAgICAgICAgIG90aGVybHZfMj0oVG9rZW4pbWF0Y2goaW5wdXQsMTUsRk9MTE9XXzEwOCk7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OwogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAKICAgICAgICAgICAgICAgCQkJbmV3TGVhZk5vZGUob3RoZXJsdl8yLCBncmFtbWFyQWNjZXNzLmdldFhTZXRMaXRlcmFsQWNjZXNzKCkuZ2V0TGVmdEN1cmx5QnJhY2tldEtleXdvcmRfMigpKTsKICAgICAgICAgICAgICAgCQkKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjUzMzU6MzogKCAoIChsdl9lbGVtZW50c18zXzA9IHJ1bGVYRXhwcmVzc2lvbiApICkgKG90aGVybHZfND0gJywnICggKGx2X2VsZW1lbnRzXzVfMD0gcnVsZVhFeHByZXNzaW9uICkgKSApKiApPwotICAgICAgICAgICAgaW50IGFsdDkxPTI7Ci0gICAgICAgICAgICBpbnQgTEE5MV8wID0gaW5wdXQuTEEoMSk7CisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo1Nzc0OjM6ICggKCAobHZfZWxlbWVudHNfM18wPSBydWxlWEV4cHJlc3Npb24gKSApIChvdGhlcmx2XzQ9ICcsJyAoIChsdl9lbGVtZW50c181XzA9IHJ1bGVYRXhwcmVzc2lvbiApICkgKSogKT8KKyAgICAgICAgICAgIGludCBhbHQxMDI9MjsKKyAgICAgICAgICAgIGludCBMQTEwMl8wID0gaW5wdXQuTEEoMSk7CiAKLSAgICAgICAgICAgIGlmICggKChMQTkxXzA+PVJVTEVfU1RSSU5HICYmIExBOTFfMDw9UlVMRV9ERUNJTUFMKXx8TEE5MV8wPT0xNXx8TEE5MV8wPT00Nnx8TEE5MV8wPT02NXx8KExBOTFfMD49NjggJiYgTEE5MV8wPD02OSl8fExBOTFfMD09NzR8fChMQTkxXzA+PTc4ICYmIExBOTFfMDw9NzkpfHxMQTkxXzA9PTg2fHwoTEE5MV8wPj0xMDIgJiYgTEE5MV8wPD0xMDMpfHxMQTkxXzA9PTEwN3x8TEE5MV8wPT0xMTN8fExBOTFfMD09MTE1fHwoTEE5MV8wPj0xMTkgJiYgTEE5MV8wPD0xMjApfHwoTEE5MV8wPj0xMjMgJiYgTEE5MV8wPD0xMzIpfHxMQTkxXzA9PTEzNCkgKSB7Ci0gICAgICAgICAgICAgICAgYWx0OTE9MTsKKyAgICAgICAgICAgIGlmICggKChMQTEwMl8wPj1SVUxFX1NUUklORyAmJiBMQTEwMl8wPD1SVUxFX0RFQ0lNQUwpfHxMQTEwMl8wPT0xNXx8TEExMDJfMD09NTB8fExBMTAyXzA9PTcyfHwoTEExMDJfMD49NzUgJiYgTEExMDJfMDw9NzYpfHxMQTEwMl8wPT04MXx8KExBMTAyXzA+PTg1ICYmIExBMTAyXzA8PTg2KXx8TEExMDJfMD09OTN8fChMQTEwMl8wPj0xMDkgJiYgTEExMDJfMDw9MTEwKXx8TEExMDJfMD09MTE0fHxMQTEwMl8wPT0xMjB8fExBMTAyXzA9PTEyMnx8KExBMTAyXzA+PTEyNiAmJiBMQTEwMl8wPD0xMjcpfHwoTEExMDJfMD49MTMwICYmIExBMTAyXzA8PTEzOSl8fExBMTAyXzA9PTE0MSkgKSB7CisgICAgICAgICAgICAgICAgYWx0MTAyPTE7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBzd2l0Y2ggKGFsdDkxKSB7CisgICAgICAgICAgICBzd2l0Y2ggKGFsdDEwMikgewogICAgICAgICAgICAgICAgIGNhc2UgMSA6Ci0gICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjUzMzY6NDogKCAobHZfZWxlbWVudHNfM18wPSBydWxlWEV4cHJlc3Npb24gKSApIChvdGhlcmx2XzQ9ICcsJyAoIChsdl9lbGVtZW50c181XzA9IHJ1bGVYRXhwcmVzc2lvbiApICkgKSoKKyAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NTc3NTo0OiAoIChsdl9lbGVtZW50c18zXzA9IHJ1bGVYRXhwcmVzc2lvbiApICkgKG90aGVybHZfND0gJywnICggKGx2X2VsZW1lbnRzXzVfMD0gcnVsZVhFeHByZXNzaW9uICkgKSApKgogICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjUzMzY6NDogKCAobHZfZWxlbWVudHNfM18wPSBydWxlWEV4cHJlc3Npb24gKSApCi0gICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjUzMzc6NTogKGx2X2VsZW1lbnRzXzNfMD0gcnVsZVhFeHByZXNzaW9uICkKKyAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NTc3NTo0OiAoIChsdl9lbGVtZW50c18zXzA9IHJ1bGVYRXhwcmVzc2lvbiApICkKKyAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NTc3Njo1OiAobHZfZWxlbWVudHNfM18wPSBydWxlWEV4cHJlc3Npb24gKQogICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjUzMzc6NTogKGx2X2VsZW1lbnRzXzNfMD0gcnVsZVhFeHByZXNzaW9uICkKLSAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NTMzODo2OiBsdl9lbGVtZW50c18zXzA9IHJ1bGVYRXhwcmVzc2lvbgorICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo1Nzc2OjU6IChsdl9lbGVtZW50c18zXzA9IHJ1bGVYRXhwcmVzc2lvbiApCisgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjU3Nzc6NjogbHZfZWxlbWVudHNfM18wPSBydWxlWEV4cHJlc3Npb24KICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKIAogICAgICAgICAgICAgICAgICAgICAgIAkJCQkJCW5ld0NvbXBvc2l0ZU5vZGUoZ3JhbW1hckFjY2Vzcy5nZXRYU2V0TGl0ZXJhbEFjY2VzcygpLmdldEVsZW1lbnRzWEV4cHJlc3Npb25QYXJzZXJSdWxlQ2FsbF8zXzBfMCgpKTsKICAgICAgICAgICAgICAgICAgICAgICAJCQkJCQogICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzk1KTsKKyAgICAgICAgICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMTA5KTsKICAgICAgICAgICAgICAgICAgICAgbHZfZWxlbWVudHNfM18wPXJ1bGVYRXhwcmVzc2lvbigpOwogCiAgICAgICAgICAgICAgICAgICAgIHN0YXRlLl9mc3AtLTsKQEAgLTE0ODQzLDM5ICsxNjAzNywzOSBAQAogCiAgICAgICAgICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo1MzU1OjQ6IChvdGhlcmx2XzQ9ICcsJyAoIChsdl9lbGVtZW50c181XzA9IHJ1bGVYRXhwcmVzc2lvbiApICkgKSoKLSAgICAgICAgICAgICAgICAgICAgbG9vcDkwOgorICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo1Nzk0OjQ6IChvdGhlcmx2XzQ9ICcsJyAoIChsdl9lbGVtZW50c181XzA9IHJ1bGVYRXhwcmVzc2lvbiApICkgKSoKKyAgICAgICAgICAgICAgICAgICAgbG9vcDEwMToKICAgICAgICAgICAgICAgICAgICAgZG8gewotICAgICAgICAgICAgICAgICAgICAgICAgaW50IGFsdDkwPTI7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpbnQgTEE5MF8wID0gaW5wdXQuTEEoMSk7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYWx0MTAxPTI7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgTEExMDFfMCA9IGlucHV0LkxBKDEpOwogCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIChMQTkwXzA9PTc1KSApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbHQ5MD0xOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCAoTEExMDFfMD09ODIpICkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsdDEwMT0xOwogICAgICAgICAgICAgICAgICAgICAgICAgfQogCiAKLSAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoYWx0OTApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoYWx0MTAxKSB7CiAgICAgICAgICAgICAgICAgICAgIAljYXNlIDEgOgotICAgICAgICAgICAgICAgICAgICAJICAgIC8vIEludGVybmFsRGF0YURTTC5nOjUzNTY6NTogb3RoZXJsdl80PSAnLCcgKCAobHZfZWxlbWVudHNfNV8wPSBydWxlWEV4cHJlc3Npb24gKSApCisgICAgICAgICAgICAgICAgICAgIAkgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NTc5NTo1OiBvdGhlcmx2XzQ9ICcsJyAoIChsdl9lbGVtZW50c181XzA9IHJ1bGVYRXhwcmVzc2lvbiApICkKICAgICAgICAgICAgICAgICAgICAgCSAgICB7Ci0gICAgICAgICAgICAgICAgICAgIAkgICAgb3RoZXJsdl80PShUb2tlbiltYXRjaChpbnB1dCw3NSxGT0xMT1dfNjQpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gY3VycmVudDsKKyAgICAgICAgICAgICAgICAgICAgCSAgICBvdGhlcmx2XzQ9KFRva2VuKW1hdGNoKGlucHV0LDgyLEZPTExPV183OCk7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OwogICAgICAgICAgICAgICAgICAgICAJICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogCiAgICAgICAgICAgICAgICAgICAgIAkgICAgICAJCQkJCW5ld0xlYWZOb2RlKG90aGVybHZfNCwgZ3JhbW1hckFjY2Vzcy5nZXRYU2V0TGl0ZXJhbEFjY2VzcygpLmdldENvbW1hS2V5d29yZF8zXzFfMCgpKTsKICAgICAgICAgICAgICAgICAgICAgCSAgICAgIAkJCQkKICAgICAgICAgICAgICAgICAgICAgCSAgICB9Ci0gICAgICAgICAgICAgICAgICAgIAkgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NTM2MDo1OiAoIChsdl9lbGVtZW50c181XzA9IHJ1bGVYRXhwcmVzc2lvbiApICkKLSAgICAgICAgICAgICAgICAgICAgCSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo1MzYxOjY6IChsdl9lbGVtZW50c181XzA9IHJ1bGVYRXhwcmVzc2lvbiApCisgICAgICAgICAgICAgICAgICAgIAkgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NTc5OTo1OiAoIChsdl9lbGVtZW50c181XzA9IHJ1bGVYRXhwcmVzc2lvbiApICkKKyAgICAgICAgICAgICAgICAgICAgCSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo1ODAwOjY6IChsdl9lbGVtZW50c181XzA9IHJ1bGVYRXhwcmVzc2lvbiApCiAgICAgICAgICAgICAgICAgICAgIAkgICAgewotICAgICAgICAgICAgICAgICAgICAJICAgIC8vIEludGVybmFsRGF0YURTTC5nOjUzNjE6NjogKGx2X2VsZW1lbnRzXzVfMD0gcnVsZVhFeHByZXNzaW9uICkKLSAgICAgICAgICAgICAgICAgICAgCSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo1MzYyOjc6IGx2X2VsZW1lbnRzXzVfMD0gcnVsZVhFeHByZXNzaW9uCisgICAgICAgICAgICAgICAgICAgIAkgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NTgwMDo2OiAobHZfZWxlbWVudHNfNV8wPSBydWxlWEV4cHJlc3Npb24gKQorICAgICAgICAgICAgICAgICAgICAJICAgIC8vIEludGVybmFsRGF0YURTTC5nOjU4MDE6NzogbHZfZWxlbWVudHNfNV8wPSBydWxlWEV4cHJlc3Npb24KICAgICAgICAgICAgICAgICAgICAgCSAgICB7CiAgICAgICAgICAgICAgICAgICAgIAkgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAKICAgICAgICAgICAgICAgICAgICAgCSAgICAgIAkJCQkJCQluZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0WFNldExpdGVyYWxBY2Nlc3MoKS5nZXRFbGVtZW50c1hFeHByZXNzaW9uUGFyc2VyUnVsZUNhbGxfM18xXzFfMCgpKTsKICAgICAgICAgICAgICAgICAgICAgCSAgICAgIAkJCQkJCQogICAgICAgICAgICAgICAgICAgICAJICAgIH0KLSAgICAgICAgICAgICAgICAgICAgCSAgICBwdXNoRm9sbG93KEZPTExPV185NSk7CisgICAgICAgICAgICAgICAgICAgIAkgICAgcHVzaEZvbGxvdyhGT0xMT1dfMTA5KTsKICAgICAgICAgICAgICAgICAgICAgCSAgICBsdl9lbGVtZW50c181XzA9cnVsZVhFeHByZXNzaW9uKCk7CiAKICAgICAgICAgICAgICAgICAgICAgCSAgICBzdGF0ZS5fZnNwLS07CkBAIC0xNDkwNCw3ICsxNjA5OCw3IEBACiAgICAgICAgICAgICAgICAgICAgIAkgICAgYnJlYWs7CiAKICAgICAgICAgICAgICAgICAgICAgCWRlZmF1bHQgOgotICAgICAgICAgICAgICAgICAgICAJICAgIGJyZWFrIGxvb3A5MDsKKyAgICAgICAgICAgICAgICAgICAgCSAgICBicmVhayBsb29wMTAxOwogICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICB9IHdoaWxlICh0cnVlKTsKIApAQCAtMTQ5NDUsNyArMTYxMzksNyBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgImVudHJ5UnVsZVhMaXN0TGl0ZXJhbCIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo1Mzg5OjE6IGVudHJ5UnVsZVhMaXN0TGl0ZXJhbCByZXR1cm5zIFtFT2JqZWN0IGN1cnJlbnQ9bnVsbF0gOiBpdl9ydWxlWExpc3RMaXRlcmFsPSBydWxlWExpc3RMaXRlcmFsIEVPRiA7CisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NTgyODoxOiBlbnRyeVJ1bGVYTGlzdExpdGVyYWwgcmV0dXJucyBbRU9iamVjdCBjdXJyZW50PW51bGxdIDogaXZfcnVsZVhMaXN0TGl0ZXJhbD0gcnVsZVhMaXN0TGl0ZXJhbCBFT0YgOwogICAgIHB1YmxpYyBmaW5hbCBFT2JqZWN0IGVudHJ5UnVsZVhMaXN0TGl0ZXJhbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAgICAgICAgIEVPYmplY3QgY3VycmVudCA9IG51bGw7CiAKQEAgLTE0OTUzLDggKzE2MTQ3LDggQEAKIAogCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo1Mzg5OjUzOiAoaXZfcnVsZVhMaXN0TGl0ZXJhbD0gcnVsZVhMaXN0TGl0ZXJhbCBFT0YgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NTM5MDoyOiBpdl9ydWxlWExpc3RMaXRlcmFsPSBydWxlWExpc3RMaXRlcmFsIEVPRgorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NTgyODo1MzogKGl2X3J1bGVYTGlzdExpdGVyYWw9IHJ1bGVYTGlzdExpdGVyYWwgRU9GICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjU4Mjk6MjogaXZfcnVsZVhMaXN0TGl0ZXJhbD0gcnVsZVhMaXN0TGl0ZXJhbCBFT0YKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgbmV3Q29tcG9zaXRlTm9kZShncmFtbWFyQWNjZXNzLmdldFhMaXN0TGl0ZXJhbFJ1bGUoKSk7IApAQCAtMTQ5ODUsNyArMTYxNzksNyBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVYTGlzdExpdGVyYWwiCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NTM5NjoxOiBydWxlWExpc3RMaXRlcmFsIHJldHVybnMgW0VPYmplY3QgY3VycmVudD1udWxsXSA6ICggKCkgb3RoZXJsdl8xPSAnIycgb3RoZXJsdl8yPSAnWycgKCAoIChsdl9lbGVtZW50c18zXzA9IHJ1bGVYRXhwcmVzc2lvbiApICkgKG90aGVybHZfND0gJywnICggKGx2X2VsZW1lbnRzXzVfMD0gcnVsZVhFeHByZXNzaW9uICkgKSApKiApPyBvdGhlcmx2XzY9ICddJyApIDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo1ODM1OjE6IHJ1bGVYTGlzdExpdGVyYWwgcmV0dXJucyBbRU9iamVjdCBjdXJyZW50PW51bGxdIDogKCAoKSBvdGhlcmx2XzE9ICcjJyBvdGhlcmx2XzI9ICdbJyAoICggKGx2X2VsZW1lbnRzXzNfMD0gcnVsZVhFeHByZXNzaW9uICkgKSAob3RoZXJsdl80PSAnLCcgKCAobHZfZWxlbWVudHNfNV8wPSBydWxlWEV4cHJlc3Npb24gKSApICkqICk/IG90aGVybHZfNj0gJ10nICkgOwogICAgIHB1YmxpYyBmaW5hbCBFT2JqZWN0IHJ1bGVYTGlzdExpdGVyYWwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogICAgICAgICBFT2JqZWN0IGN1cnJlbnQgPSBudWxsOwogCkBAIC0xNTAwMiwxNCArMTYxOTYsMTQgQEAKICAgICAgICAgCWVudGVyUnVsZSgpOwogCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo1NDAyOjI6ICggKCAoKSBvdGhlcmx2XzE9ICcjJyBvdGhlcmx2XzI9ICdbJyAoICggKGx2X2VsZW1lbnRzXzNfMD0gcnVsZVhFeHByZXNzaW9uICkgKSAob3RoZXJsdl80PSAnLCcgKCAobHZfZWxlbWVudHNfNV8wPSBydWxlWEV4cHJlc3Npb24gKSApICkqICk/IG90aGVybHZfNj0gJ10nICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NTQwMzoyOiAoICgpIG90aGVybHZfMT0gJyMnIG90aGVybHZfMj0gJ1snICggKCAobHZfZWxlbWVudHNfM18wPSBydWxlWEV4cHJlc3Npb24gKSApIChvdGhlcmx2XzQ9ICcsJyAoIChsdl9lbGVtZW50c181XzA9IHJ1bGVYRXhwcmVzc2lvbiApICkgKSogKT8gb3RoZXJsdl82PSAnXScgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NTg0MToyOiAoICggKCkgb3RoZXJsdl8xPSAnIycgb3RoZXJsdl8yPSAnWycgKCAoIChsdl9lbGVtZW50c18zXzA9IHJ1bGVYRXhwcmVzc2lvbiApICkgKG90aGVybHZfND0gJywnICggKGx2X2VsZW1lbnRzXzVfMD0gcnVsZVhFeHByZXNzaW9uICkgKSApKiApPyBvdGhlcmx2XzY9ICddJyApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjU4NDI6MjogKCAoKSBvdGhlcmx2XzE9ICcjJyBvdGhlcmx2XzI9ICdbJyAoICggKGx2X2VsZW1lbnRzXzNfMD0gcnVsZVhFeHByZXNzaW9uICkgKSAob3RoZXJsdl80PSAnLCcgKCAobHZfZWxlbWVudHNfNV8wPSBydWxlWEV4cHJlc3Npb24gKSApICkqICk/IG90aGVybHZfNj0gJ10nICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjU0MDM6MjogKCAoKSBvdGhlcmx2XzE9ICcjJyBvdGhlcmx2XzI9ICdbJyAoICggKGx2X2VsZW1lbnRzXzNfMD0gcnVsZVhFeHByZXNzaW9uICkgKSAob3RoZXJsdl80PSAnLCcgKCAobHZfZWxlbWVudHNfNV8wPSBydWxlWEV4cHJlc3Npb24gKSApICkqICk/IG90aGVybHZfNj0gJ10nICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjU0MDQ6MzogKCkgb3RoZXJsdl8xPSAnIycgb3RoZXJsdl8yPSAnWycgKCAoIChsdl9lbGVtZW50c18zXzA9IHJ1bGVYRXhwcmVzc2lvbiApICkgKG90aGVybHZfND0gJywnICggKGx2X2VsZW1lbnRzXzVfMD0gcnVsZVhFeHByZXNzaW9uICkgKSApKiApPyBvdGhlcmx2XzY9ICddJworICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NTg0MjoyOiAoICgpIG90aGVybHZfMT0gJyMnIG90aGVybHZfMj0gJ1snICggKCAobHZfZWxlbWVudHNfM18wPSBydWxlWEV4cHJlc3Npb24gKSApIChvdGhlcmx2XzQ9ICcsJyAoIChsdl9lbGVtZW50c181XzA9IHJ1bGVYRXhwcmVzc2lvbiApICkgKSogKT8gb3RoZXJsdl82PSAnXScgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NTg0MzozOiAoKSBvdGhlcmx2XzE9ICcjJyBvdGhlcmx2XzI9ICdbJyAoICggKGx2X2VsZW1lbnRzXzNfMD0gcnVsZVhFeHByZXNzaW9uICkgKSAob3RoZXJsdl80PSAnLCcgKCAobHZfZWxlbWVudHNfNV8wPSBydWxlWEV4cHJlc3Npb24gKSApICkqICk/IG90aGVybHZfNj0gJ10nCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo1NDA0OjM6ICgpCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo1NDA1OjQ6IAorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NTg0MzozOiAoKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NTg0NDo0OiAKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogCkBAIC0xNTAyMSw0MSArMTYyMTUsNDEgQEAKIAogICAgICAgICAgICAgfQogCi0gICAgICAgICAgICBvdGhlcmx2XzE9KFRva2VuKW1hdGNoKGlucHV0LDc4LEZPTExPV182NSk7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OworICAgICAgICAgICAgb3RoZXJsdl8xPShUb2tlbiltYXRjaChpbnB1dCw4NSxGT0xMT1dfNzkpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gY3VycmVudDsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogCiAgICAgICAgICAgICAgIAkJCW5ld0xlYWZOb2RlKG90aGVybHZfMSwgZ3JhbW1hckFjY2Vzcy5nZXRYTGlzdExpdGVyYWxBY2Nlc3MoKS5nZXROdW1iZXJTaWduS2V5d29yZF8xKCkpOwogICAgICAgICAgICAgICAJCQogICAgICAgICAgICAgfQotICAgICAgICAgICAgb3RoZXJsdl8yPShUb2tlbiltYXRjaChpbnB1dCw3OSxGT0xMT1dfNjYpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gY3VycmVudDsKKyAgICAgICAgICAgIG90aGVybHZfMj0oVG9rZW4pbWF0Y2goaW5wdXQsODYsRk9MTE9XXzgwKTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKIAogICAgICAgICAgICAgICAJCQluZXdMZWFmTm9kZShvdGhlcmx2XzIsIGdyYW1tYXJBY2Nlc3MuZ2V0WExpc3RMaXRlcmFsQWNjZXNzKCkuZ2V0TGVmdFNxdWFyZUJyYWNrZXRLZXl3b3JkXzIoKSk7CiAgICAgICAgICAgICAgIAkJCiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo1NDE5OjM6ICggKCAobHZfZWxlbWVudHNfM18wPSBydWxlWEV4cHJlc3Npb24gKSApIChvdGhlcmx2XzQ9ICcsJyAoIChsdl9lbGVtZW50c181XzA9IHJ1bGVYRXhwcmVzc2lvbiApICkgKSogKT8KLSAgICAgICAgICAgIGludCBhbHQ5Mz0yOwotICAgICAgICAgICAgaW50IExBOTNfMCA9IGlucHV0LkxBKDEpOworICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NTg1ODozOiAoICggKGx2X2VsZW1lbnRzXzNfMD0gcnVsZVhFeHByZXNzaW9uICkgKSAob3RoZXJsdl80PSAnLCcgKCAobHZfZWxlbWVudHNfNV8wPSBydWxlWEV4cHJlc3Npb24gKSApICkqICk/CisgICAgICAgICAgICBpbnQgYWx0MTA0PTI7CisgICAgICAgICAgICBpbnQgTEExMDRfMCA9IGlucHV0LkxBKDEpOwogCi0gICAgICAgICAgICBpZiAoICgoTEE5M18wPj1SVUxFX1NUUklORyAmJiBMQTkzXzA8PVJVTEVfREVDSU1BTCl8fExBOTNfMD09MTV8fExBOTNfMD09NDZ8fExBOTNfMD09NjV8fChMQTkzXzA+PTY4ICYmIExBOTNfMDw9NjkpfHxMQTkzXzA9PTc0fHwoTEE5M18wPj03OCAmJiBMQTkzXzA8PTc5KXx8TEE5M18wPT04Nnx8KExBOTNfMD49MTAyICYmIExBOTNfMDw9MTAzKXx8TEE5M18wPT0xMDd8fExBOTNfMD09MTEzfHxMQTkzXzA9PTExNXx8KExBOTNfMD49MTE5ICYmIExBOTNfMDw9MTIwKXx8KExBOTNfMD49MTIzICYmIExBOTNfMDw9MTMyKXx8TEE5M18wPT0xMzQpICkgewotICAgICAgICAgICAgICAgIGFsdDkzPTE7CisgICAgICAgICAgICBpZiAoICgoTEExMDRfMD49UlVMRV9TVFJJTkcgJiYgTEExMDRfMDw9UlVMRV9ERUNJTUFMKXx8TEExMDRfMD09MTV8fExBMTA0XzA9PTUwfHxMQTEwNF8wPT03Mnx8KExBMTA0XzA+PTc1ICYmIExBMTA0XzA8PTc2KXx8TEExMDRfMD09ODF8fChMQTEwNF8wPj04NSAmJiBMQTEwNF8wPD04Nil8fExBMTA0XzA9PTkzfHwoTEExMDRfMD49MTA5ICYmIExBMTA0XzA8PTExMCl8fExBMTA0XzA9PTExNHx8TEExMDRfMD09MTIwfHxMQTEwNF8wPT0xMjJ8fChMQTEwNF8wPj0xMjYgJiYgTEExMDRfMDw9MTI3KXx8KExBMTA0XzA+PTEzMCAmJiBMQTEwNF8wPD0xMzkpfHxMQTEwNF8wPT0xNDEpICkgeworICAgICAgICAgICAgICAgIGFsdDEwND0xOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgc3dpdGNoIChhbHQ5MykgeworICAgICAgICAgICAgc3dpdGNoIChhbHQxMDQpIHsKICAgICAgICAgICAgICAgICBjYXNlIDEgOgotICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo1NDIwOjQ6ICggKGx2X2VsZW1lbnRzXzNfMD0gcnVsZVhFeHByZXNzaW9uICkgKSAob3RoZXJsdl80PSAnLCcgKCAobHZfZWxlbWVudHNfNV8wPSBydWxlWEV4cHJlc3Npb24gKSApICkqCisgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjU4NTk6NDogKCAobHZfZWxlbWVudHNfM18wPSBydWxlWEV4cHJlc3Npb24gKSApIChvdGhlcmx2XzQ9ICcsJyAoIChsdl9lbGVtZW50c181XzA9IHJ1bGVYRXhwcmVzc2lvbiApICkgKSoKICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo1NDIwOjQ6ICggKGx2X2VsZW1lbnRzXzNfMD0gcnVsZVhFeHByZXNzaW9uICkgKQotICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo1NDIxOjU6IChsdl9lbGVtZW50c18zXzA9IHJ1bGVYRXhwcmVzc2lvbiApCisgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjU4NTk6NDogKCAobHZfZWxlbWVudHNfM18wPSBydWxlWEV4cHJlc3Npb24gKSApCisgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjU4NjA6NTogKGx2X2VsZW1lbnRzXzNfMD0gcnVsZVhFeHByZXNzaW9uICkKICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo1NDIxOjU6IChsdl9lbGVtZW50c18zXzA9IHJ1bGVYRXhwcmVzc2lvbiApCi0gICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjU0MjI6NjogbHZfZWxlbWVudHNfM18wPSBydWxlWEV4cHJlc3Npb24KKyAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NTg2MDo1OiAobHZfZWxlbWVudHNfM18wPSBydWxlWEV4cHJlc3Npb24gKQorICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo1ODYxOjY6IGx2X2VsZW1lbnRzXzNfMD0gcnVsZVhFeHByZXNzaW9uCiAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAKICAgICAgICAgICAgICAgICAgICAgICAJCQkJCQluZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0WExpc3RMaXRlcmFsQWNjZXNzKCkuZ2V0RWxlbWVudHNYRXhwcmVzc2lvblBhcnNlclJ1bGVDYWxsXzNfMF8wKCkpOwogICAgICAgICAgICAgICAgICAgICAgIAkJCQkJCiAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfNjcpOworICAgICAgICAgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV184MSk7CiAgICAgICAgICAgICAgICAgICAgIGx2X2VsZW1lbnRzXzNfMD1ydWxlWEV4cHJlc3Npb24oKTsKIAogICAgICAgICAgICAgICAgICAgICBzdGF0ZS5fZnNwLS07CkBAIC0xNTA3OSwzOSArMTYyNzMsMzkgQEAKIAogICAgICAgICAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NTQzOTo0OiAob3RoZXJsdl80PSAnLCcgKCAobHZfZWxlbWVudHNfNV8wPSBydWxlWEV4cHJlc3Npb24gKSApICkqCi0gICAgICAgICAgICAgICAgICAgIGxvb3A5MjoKKyAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NTg3ODo0OiAob3RoZXJsdl80PSAnLCcgKCAobHZfZWxlbWVudHNfNV8wPSBydWxlWEV4cHJlc3Npb24gKSApICkqCisgICAgICAgICAgICAgICAgICAgIGxvb3AxMDM6CiAgICAgICAgICAgICAgICAgICAgIGRvIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGludCBhbHQ5Mj0yOwotICAgICAgICAgICAgICAgICAgICAgICAgaW50IExBOTJfMCA9IGlucHV0LkxBKDEpOworICAgICAgICAgICAgICAgICAgICAgICAgaW50IGFsdDEwMz0yOworICAgICAgICAgICAgICAgICAgICAgICAgaW50IExBMTAzXzAgPSBpbnB1dC5MQSgxKTsKIAotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCAoTEE5Ml8wPT03NSkgKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYWx0OTI9MTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICggKExBMTAzXzA9PTgyKSApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbHQxMDM9MTsKICAgICAgICAgICAgICAgICAgICAgICAgIH0KIAogCi0gICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKGFsdDkyKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKGFsdDEwMykgewogICAgICAgICAgICAgICAgICAgICAJY2FzZSAxIDoKLSAgICAgICAgICAgICAgICAgICAgCSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo1NDQwOjU6IG90aGVybHZfND0gJywnICggKGx2X2VsZW1lbnRzXzVfMD0gcnVsZVhFeHByZXNzaW9uICkgKQorICAgICAgICAgICAgICAgICAgICAJICAgIC8vIEludGVybmFsRGF0YURTTC5nOjU4Nzk6NTogb3RoZXJsdl80PSAnLCcgKCAobHZfZWxlbWVudHNfNV8wPSBydWxlWEV4cHJlc3Npb24gKSApCiAgICAgICAgICAgICAgICAgICAgIAkgICAgewotICAgICAgICAgICAgICAgICAgICAJICAgIG90aGVybHZfND0oVG9rZW4pbWF0Y2goaW5wdXQsNzUsRk9MTE9XXzY0KTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7CisgICAgICAgICAgICAgICAgICAgIAkgICAgb3RoZXJsdl80PShUb2tlbiltYXRjaChpbnB1dCw4MixGT0xMT1dfNzgpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gY3VycmVudDsKICAgICAgICAgICAgICAgICAgICAgCSAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKIAogICAgICAgICAgICAgICAgICAgICAJICAgICAgCQkJCQluZXdMZWFmTm9kZShvdGhlcmx2XzQsIGdyYW1tYXJBY2Nlc3MuZ2V0WExpc3RMaXRlcmFsQWNjZXNzKCkuZ2V0Q29tbWFLZXl3b3JkXzNfMV8wKCkpOwogICAgICAgICAgICAgICAgICAgICAJICAgICAgCQkJCQogICAgICAgICAgICAgICAgICAgICAJICAgIH0KLSAgICAgICAgICAgICAgICAgICAgCSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo1NDQ0OjU6ICggKGx2X2VsZW1lbnRzXzVfMD0gcnVsZVhFeHByZXNzaW9uICkgKQotICAgICAgICAgICAgICAgICAgICAJICAgIC8vIEludGVybmFsRGF0YURTTC5nOjU0NDU6NjogKGx2X2VsZW1lbnRzXzVfMD0gcnVsZVhFeHByZXNzaW9uICkKKyAgICAgICAgICAgICAgICAgICAgCSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo1ODgzOjU6ICggKGx2X2VsZW1lbnRzXzVfMD0gcnVsZVhFeHByZXNzaW9uICkgKQorICAgICAgICAgICAgICAgICAgICAJICAgIC8vIEludGVybmFsRGF0YURTTC5nOjU4ODQ6NjogKGx2X2VsZW1lbnRzXzVfMD0gcnVsZVhFeHByZXNzaW9uICkKICAgICAgICAgICAgICAgICAgICAgCSAgICB7Ci0gICAgICAgICAgICAgICAgICAgIAkgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NTQ0NTo2OiAobHZfZWxlbWVudHNfNV8wPSBydWxlWEV4cHJlc3Npb24gKQotICAgICAgICAgICAgICAgICAgICAJICAgIC8vIEludGVybmFsRGF0YURTTC5nOjU0NDY6NzogbHZfZWxlbWVudHNfNV8wPSBydWxlWEV4cHJlc3Npb24KKyAgICAgICAgICAgICAgICAgICAgCSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo1ODg0OjY6IChsdl9lbGVtZW50c181XzA9IHJ1bGVYRXhwcmVzc2lvbiApCisgICAgICAgICAgICAgICAgICAgIAkgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NTg4NTo3OiBsdl9lbGVtZW50c181XzA9IHJ1bGVYRXhwcmVzc2lvbgogICAgICAgICAgICAgICAgICAgICAJICAgIHsKICAgICAgICAgICAgICAgICAgICAgCSAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKIAogICAgICAgICAgICAgICAgICAgICAJICAgICAgCQkJCQkJCW5ld0NvbXBvc2l0ZU5vZGUoZ3JhbW1hckFjY2Vzcy5nZXRYTGlzdExpdGVyYWxBY2Nlc3MoKS5nZXRFbGVtZW50c1hFeHByZXNzaW9uUGFyc2VyUnVsZUNhbGxfM18xXzFfMCgpKTsKICAgICAgICAgICAgICAgICAgICAgCSAgICAgIAkJCQkJCQogICAgICAgICAgICAgICAgICAgICAJICAgIH0KLSAgICAgICAgICAgICAgICAgICAgCSAgICBwdXNoRm9sbG93KEZPTExPV182Nyk7CisgICAgICAgICAgICAgICAgICAgIAkgICAgcHVzaEZvbGxvdyhGT0xMT1dfODEpOwogICAgICAgICAgICAgICAgICAgICAJICAgIGx2X2VsZW1lbnRzXzVfMD1ydWxlWEV4cHJlc3Npb24oKTsKIAogICAgICAgICAgICAgICAgICAgICAJICAgIHN0YXRlLl9mc3AtLTsKQEAgLTE1MTQwLDcgKzE2MzM0LDcgQEAKICAgICAgICAgICAgICAgICAgICAgCSAgICBicmVhazsKIAogICAgICAgICAgICAgICAgICAgICAJZGVmYXVsdCA6Ci0gICAgICAgICAgICAgICAgICAgIAkgICAgYnJlYWsgbG9vcDkyOworICAgICAgICAgICAgICAgICAgICAJICAgIGJyZWFrIGxvb3AxMDM7CiAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIH0gd2hpbGUgKHRydWUpOwogCkBAIC0xNTE1MCw3ICsxNjM0NCw3IEBACiAKICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgb3RoZXJsdl82PShUb2tlbiltYXRjaChpbnB1dCw4MCxGT0xMT1dfMik7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OworICAgICAgICAgICAgb3RoZXJsdl82PShUb2tlbiltYXRjaChpbnB1dCw4NyxGT0xMT1dfMik7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OwogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAKICAgICAgICAgICAgICAgCQkJbmV3TGVhZk5vZGUob3RoZXJsdl82LCBncmFtbWFyQWNjZXNzLmdldFhMaXN0TGl0ZXJhbEFjY2VzcygpLmdldFJpZ2h0U3F1YXJlQnJhY2tldEtleXdvcmRfNCgpKTsKQEAgLTE1MTgxLDcgKzE2Mzc1LDcgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJlbnRyeVJ1bGVYQ2xvc3VyZSIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo1NDczOjE6IGVudHJ5UnVsZVhDbG9zdXJlIHJldHVybnMgW0VPYmplY3QgY3VycmVudD1udWxsXSA6IGl2X3J1bGVYQ2xvc3VyZT0gcnVsZVhDbG9zdXJlIEVPRiA7CisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NTkxMjoxOiBlbnRyeVJ1bGVYQ2xvc3VyZSByZXR1cm5zIFtFT2JqZWN0IGN1cnJlbnQ9bnVsbF0gOiBpdl9ydWxlWENsb3N1cmU9IHJ1bGVYQ2xvc3VyZSBFT0YgOwogICAgIHB1YmxpYyBmaW5hbCBFT2JqZWN0IGVudHJ5UnVsZVhDbG9zdXJlKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKICAgICAgICAgRU9iamVjdCBjdXJyZW50ID0gbnVsbDsKIApAQCAtMTUxODksOCArMTYzODMsOCBAQAogCiAKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjU0NzM6NDk6IChpdl9ydWxlWENsb3N1cmU9IHJ1bGVYQ2xvc3VyZSBFT0YgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NTQ3NDoyOiBpdl9ydWxlWENsb3N1cmU9IHJ1bGVYQ2xvc3VyZSBFT0YKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjU5MTI6NDk6IChpdl9ydWxlWENsb3N1cmU9IHJ1bGVYQ2xvc3VyZSBFT0YgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NTkxMzoyOiBpdl9ydWxlWENsb3N1cmU9IHJ1bGVYQ2xvc3VyZSBFT0YKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgbmV3Q29tcG9zaXRlTm9kZShncmFtbWFyQWNjZXNzLmdldFhDbG9zdXJlUnVsZSgpKTsgCkBAIC0xNTIyMSw3ICsxNjQxNSw3IEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZVhDbG9zdXJlIgotICAgIC8vIEludGVybmFsRGF0YURTTC5nOjU0ODA6MTogcnVsZVhDbG9zdXJlIHJldHVybnMgW0VPYmplY3QgY3VycmVudD1udWxsXSA6ICggKCAoICggKCkgJ1snICkgKT0+ICggKCkgb3RoZXJsdl8xPSAnWycgKSApICggKCAoICggKCAoIHJ1bGVKdm1Gb3JtYWxQYXJhbWV0ZXIgKSApICggJywnICggKCBydWxlSnZtRm9ybWFsUGFyYW1ldGVyICkgKSApKiApPyAoICggJ3wnICkgKSApICk9PiAoICggKCAobHZfZGVjbGFyZWRGb3JtYWxQYXJhbWV0ZXJzXzJfMD0gcnVsZUp2bUZvcm1hbFBhcmFtZXRlciApICkgKG90aGVybHZfMz0gJywnICggKGx2X2RlY2xhcmVkRm9ybWFsUGFyYW1ldGVyc180XzA9IHJ1bGVKdm1Gb3JtYWxQYXJhbWV0ZXIgKSApICkqICk/ICggKGx2X2V4cGxpY2l0U3ludGF4XzVfMD0gJ3wnICkgKSApICk/ICggKGx2X2V4cHJlc3Npb25fNl8wPSBydWxlWEV4cHJlc3Npb25JbkNsb3N1cmUgKSApIG90aGVybHZfNz0gJ10nICkgOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjU5MTk6MTogcnVsZVhDbG9zdXJlIHJldHVybnMgW0VPYmplY3QgY3VycmVudD1udWxsXSA6ICggKCAoICggKCkgJ1snICkgKT0+ICggKCkgb3RoZXJsdl8xPSAnWycgKSApICggKCAoICggKCAoIHJ1bGVKdm1Gb3JtYWxQYXJhbWV0ZXIgKSApICggJywnICggKCBydWxlSnZtRm9ybWFsUGFyYW1ldGVyICkgKSApKiApPyAoICggJ3wnICkgKSApICk9PiAoICggKCAobHZfZGVjbGFyZWRGb3JtYWxQYXJhbWV0ZXJzXzJfMD0gcnVsZUp2bUZvcm1hbFBhcmFtZXRlciApICkgKG90aGVybHZfMz0gJywnICggKGx2X2RlY2xhcmVkRm9ybWFsUGFyYW1ldGVyc180XzA9IHJ1bGVKdm1Gb3JtYWxQYXJhbWV0ZXIgKSApICkqICk/ICggKGx2X2V4cGxpY2l0U3ludGF4XzVfMD0gJ3wnICkgKSApICk/ICggKGx2X2V4cHJlc3Npb25fNl8wPSBydWxlWEV4cHJlc3Npb25JbkNsb3N1cmUgKSApIG90aGVybHZfNz0gJ10nICkgOwogICAgIHB1YmxpYyBmaW5hbCBFT2JqZWN0IHJ1bGVYQ2xvc3VyZSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAgICAgICAgIEVPYmplY3QgY3VycmVudCA9IG51bGw7CiAKQEAgLTE1MjQwLDIwICsxNjQzNCwyMCBAQAogICAgICAgICAJZW50ZXJSdWxlKCk7CiAKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjU0ODY6MjogKCAoICggKCAoICgpICdbJyApICk9PiAoICgpIG90aGVybHZfMT0gJ1snICkgKSAoICggKCAoICggKCBydWxlSnZtRm9ybWFsUGFyYW1ldGVyICkgKSAoICcsJyAoICggcnVsZUp2bUZvcm1hbFBhcmFtZXRlciApICkgKSogKT8gKCAoICd8JyApICkgKSApPT4gKCAoICggKGx2X2RlY2xhcmVkRm9ybWFsUGFyYW1ldGVyc18yXzA9IHJ1bGVKdm1Gb3JtYWxQYXJhbWV0ZXIgKSApIChvdGhlcmx2XzM9ICcsJyAoIChsdl9kZWNsYXJlZEZvcm1hbFBhcmFtZXRlcnNfNF8wPSBydWxlSnZtRm9ybWFsUGFyYW1ldGVyICkgKSApKiApPyAoIChsdl9leHBsaWNpdFN5bnRheF81XzA9ICd8JyApICkgKSApPyAoIChsdl9leHByZXNzaW9uXzZfMD0gcnVsZVhFeHByZXNzaW9uSW5DbG9zdXJlICkgKSBvdGhlcmx2Xzc9ICddJyApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjU0ODc6MjogKCAoICggKCAoKSAnWycgKSApPT4gKCAoKSBvdGhlcmx2XzE9ICdbJyApICkgKCAoICggKCAoICggcnVsZUp2bUZvcm1hbFBhcmFtZXRlciApICkgKCAnLCcgKCAoIHJ1bGVKdm1Gb3JtYWxQYXJhbWV0ZXIgKSApICkqICk/ICggKCAnfCcgKSApICkgKT0+ICggKCAoIChsdl9kZWNsYXJlZEZvcm1hbFBhcmFtZXRlcnNfMl8wPSBydWxlSnZtRm9ybWFsUGFyYW1ldGVyICkgKSAob3RoZXJsdl8zPSAnLCcgKCAobHZfZGVjbGFyZWRGb3JtYWxQYXJhbWV0ZXJzXzRfMD0gcnVsZUp2bUZvcm1hbFBhcmFtZXRlciApICkgKSogKT8gKCAobHZfZXhwbGljaXRTeW50YXhfNV8wPSAnfCcgKSApICkgKT8gKCAobHZfZXhwcmVzc2lvbl82XzA9IHJ1bGVYRXhwcmVzc2lvbkluQ2xvc3VyZSApICkgb3RoZXJsdl83PSAnXScgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NTkyNToyOiAoICggKCAoICggKCkgJ1snICkgKT0+ICggKCkgb3RoZXJsdl8xPSAnWycgKSApICggKCAoICggKCAoIHJ1bGVKdm1Gb3JtYWxQYXJhbWV0ZXIgKSApICggJywnICggKCBydWxlSnZtRm9ybWFsUGFyYW1ldGVyICkgKSApKiApPyAoICggJ3wnICkgKSApICk9PiAoICggKCAobHZfZGVjbGFyZWRGb3JtYWxQYXJhbWV0ZXJzXzJfMD0gcnVsZUp2bUZvcm1hbFBhcmFtZXRlciApICkgKG90aGVybHZfMz0gJywnICggKGx2X2RlY2xhcmVkRm9ybWFsUGFyYW1ldGVyc180XzA9IHJ1bGVKdm1Gb3JtYWxQYXJhbWV0ZXIgKSApICkqICk/ICggKGx2X2V4cGxpY2l0U3ludGF4XzVfMD0gJ3wnICkgKSApICk/ICggKGx2X2V4cHJlc3Npb25fNl8wPSBydWxlWEV4cHJlc3Npb25JbkNsb3N1cmUgKSApIG90aGVybHZfNz0gJ10nICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NTkyNjoyOiAoICggKCAoICgpICdbJyApICk9PiAoICgpIG90aGVybHZfMT0gJ1snICkgKSAoICggKCAoICggKCBydWxlSnZtRm9ybWFsUGFyYW1ldGVyICkgKSAoICcsJyAoICggcnVsZUp2bUZvcm1hbFBhcmFtZXRlciApICkgKSogKT8gKCAoICd8JyApICkgKSApPT4gKCAoICggKGx2X2RlY2xhcmVkRm9ybWFsUGFyYW1ldGVyc18yXzA9IHJ1bGVKdm1Gb3JtYWxQYXJhbWV0ZXIgKSApIChvdGhlcmx2XzM9ICcsJyAoIChsdl9kZWNsYXJlZEZvcm1hbFBhcmFtZXRlcnNfNF8wPSBydWxlSnZtRm9ybWFsUGFyYW1ldGVyICkgKSApKiApPyAoIChsdl9leHBsaWNpdFN5bnRheF81XzA9ICd8JyApICkgKSApPyAoIChsdl9leHByZXNzaW9uXzZfMD0gcnVsZVhFeHByZXNzaW9uSW5DbG9zdXJlICkgKSBvdGhlcmx2Xzc9ICddJyApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo1NDg3OjI6ICggKCAoICggKCkgJ1snICkgKT0+ICggKCkgb3RoZXJsdl8xPSAnWycgKSApICggKCAoICggKCAoIHJ1bGVKdm1Gb3JtYWxQYXJhbWV0ZXIgKSApICggJywnICggKCBydWxlSnZtRm9ybWFsUGFyYW1ldGVyICkgKSApKiApPyAoICggJ3wnICkgKSApICk9PiAoICggKCAobHZfZGVjbGFyZWRGb3JtYWxQYXJhbWV0ZXJzXzJfMD0gcnVsZUp2bUZvcm1hbFBhcmFtZXRlciApICkgKG90aGVybHZfMz0gJywnICggKGx2X2RlY2xhcmVkRm9ybWFsUGFyYW1ldGVyc180XzA9IHJ1bGVKdm1Gb3JtYWxQYXJhbWV0ZXIgKSApICkqICk/ICggKGx2X2V4cGxpY2l0U3ludGF4XzVfMD0gJ3wnICkgKSApICk/ICggKGx2X2V4cHJlc3Npb25fNl8wPSBydWxlWEV4cHJlc3Npb25JbkNsb3N1cmUgKSApIG90aGVybHZfNz0gJ10nICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjU0ODg6MzogKCAoICggKCkgJ1snICkgKT0+ICggKCkgb3RoZXJsdl8xPSAnWycgKSApICggKCAoICggKCAoIHJ1bGVKdm1Gb3JtYWxQYXJhbWV0ZXIgKSApICggJywnICggKCBydWxlSnZtRm9ybWFsUGFyYW1ldGVyICkgKSApKiApPyAoICggJ3wnICkgKSApICk9PiAoICggKCAobHZfZGVjbGFyZWRGb3JtYWxQYXJhbWV0ZXJzXzJfMD0gcnVsZUp2bUZvcm1hbFBhcmFtZXRlciApICkgKG90aGVybHZfMz0gJywnICggKGx2X2RlY2xhcmVkRm9ybWFsUGFyYW1ldGVyc180XzA9IHJ1bGVKdm1Gb3JtYWxQYXJhbWV0ZXIgKSApICkqICk/ICggKGx2X2V4cGxpY2l0U3ludGF4XzVfMD0gJ3wnICkgKSApICk/ICggKGx2X2V4cHJlc3Npb25fNl8wPSBydWxlWEV4cHJlc3Npb25JbkNsb3N1cmUgKSApIG90aGVybHZfNz0gJ10nCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo1OTI2OjI6ICggKCAoICggKCkgJ1snICkgKT0+ICggKCkgb3RoZXJsdl8xPSAnWycgKSApICggKCAoICggKCAoIHJ1bGVKdm1Gb3JtYWxQYXJhbWV0ZXIgKSApICggJywnICggKCBydWxlSnZtRm9ybWFsUGFyYW1ldGVyICkgKSApKiApPyAoICggJ3wnICkgKSApICk9PiAoICggKCAobHZfZGVjbGFyZWRGb3JtYWxQYXJhbWV0ZXJzXzJfMD0gcnVsZUp2bUZvcm1hbFBhcmFtZXRlciApICkgKG90aGVybHZfMz0gJywnICggKGx2X2RlY2xhcmVkRm9ybWFsUGFyYW1ldGVyc180XzA9IHJ1bGVKdm1Gb3JtYWxQYXJhbWV0ZXIgKSApICkqICk/ICggKGx2X2V4cGxpY2l0U3ludGF4XzVfMD0gJ3wnICkgKSApICk/ICggKGx2X2V4cHJlc3Npb25fNl8wPSBydWxlWEV4cHJlc3Npb25JbkNsb3N1cmUgKSApIG90aGVybHZfNz0gJ10nICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjU5Mjc6MzogKCAoICggKCkgJ1snICkgKT0+ICggKCkgb3RoZXJsdl8xPSAnWycgKSApICggKCAoICggKCAoIHJ1bGVKdm1Gb3JtYWxQYXJhbWV0ZXIgKSApICggJywnICggKCBydWxlSnZtRm9ybWFsUGFyYW1ldGVyICkgKSApKiApPyAoICggJ3wnICkgKSApICk9PiAoICggKCAobHZfZGVjbGFyZWRGb3JtYWxQYXJhbWV0ZXJzXzJfMD0gcnVsZUp2bUZvcm1hbFBhcmFtZXRlciApICkgKG90aGVybHZfMz0gJywnICggKGx2X2RlY2xhcmVkRm9ybWFsUGFyYW1ldGVyc180XzA9IHJ1bGVKdm1Gb3JtYWxQYXJhbWV0ZXIgKSApICkqICk/ICggKGx2X2V4cGxpY2l0U3ludGF4XzVfMD0gJ3wnICkgKSApICk/ICggKGx2X2V4cHJlc3Npb25fNl8wPSBydWxlWEV4cHJlc3Npb25JbkNsb3N1cmUgKSApIG90aGVybHZfNz0gJ10nCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo1NDg4OjM6ICggKCAoICgpICdbJyApICk9PiAoICgpIG90aGVybHZfMT0gJ1snICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NTQ4OTo0OiAoICggKCkgJ1snICkgKT0+ICggKCkgb3RoZXJsdl8xPSAnWycgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NTkyNzozOiAoICggKCAoKSAnWycgKSApPT4gKCAoKSBvdGhlcmx2XzE9ICdbJyApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjU5Mjg6NDogKCAoICgpICdbJyApICk9PiAoICgpIG90aGVybHZfMT0gJ1snICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjU0OTU6NDogKCAoKSBvdGhlcmx2XzE9ICdbJyApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo1NDk2OjU6ICgpIG90aGVybHZfMT0gJ1snCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo1OTM0OjQ6ICggKCkgb3RoZXJsdl8xPSAnWycgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NTkzNTo1OiAoKSBvdGhlcmx2XzE9ICdbJwogICAgICAgICAgICAgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NTQ5Njo1OiAoKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NTQ5Nzo2OiAKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjU5MzU6NTogKCkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjU5MzY6NjogCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKIApAQCAtMTUyNjUsNyArMTY0NTksNyBAQAogCiAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgIG90aGVybHZfMT0oVG9rZW4pbWF0Y2goaW5wdXQsNzksRk9MTE9XXzk2KTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7CisgICAgICAgICAgICBvdGhlcmx2XzE9KFRva2VuKW1hdGNoKGlucHV0LDg2LEZPTExPV18xMTApOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gY3VycmVudDsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogCiAgICAgICAgICAgICAgIAkJCQkJbmV3TGVhZk5vZGUob3RoZXJsdl8xLCBncmFtbWFyQWNjZXNzLmdldFhDbG9zdXJlQWNjZXNzKCkuZ2V0TGVmdFNxdWFyZUJyYWNrZXRLZXl3b3JkXzBfMF8xKCkpOwpAQCAtMTUyNzcsMzkgKzE2NDcxLDM5IEBACiAKICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NTUwOTozOiAoICggKCAoICggKCBydWxlSnZtRm9ybWFsUGFyYW1ldGVyICkgKSAoICcsJyAoICggcnVsZUp2bUZvcm1hbFBhcmFtZXRlciApICkgKSogKT8gKCAoICd8JyApICkgKSApPT4gKCAoICggKGx2X2RlY2xhcmVkRm9ybWFsUGFyYW1ldGVyc18yXzA9IHJ1bGVKdm1Gb3JtYWxQYXJhbWV0ZXIgKSApIChvdGhlcmx2XzM9ICcsJyAoIChsdl9kZWNsYXJlZEZvcm1hbFBhcmFtZXRlcnNfNF8wPSBydWxlSnZtRm9ybWFsUGFyYW1ldGVyICkgKSApKiApPyAoIChsdl9leHBsaWNpdFN5bnRheF81XzA9ICd8JyApICkgKSApPwotICAgICAgICAgICAgaW50IGFsdDk2PTI7Ci0gICAgICAgICAgICBhbHQ5NiA9IGRmYTk2LnByZWRpY3QoaW5wdXQpOwotICAgICAgICAgICAgc3dpdGNoIChhbHQ5NikgeworICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NTk0ODozOiAoICggKCAoICggKCBydWxlSnZtRm9ybWFsUGFyYW1ldGVyICkgKSAoICcsJyAoICggcnVsZUp2bUZvcm1hbFBhcmFtZXRlciApICkgKSogKT8gKCAoICd8JyApICkgKSApPT4gKCAoICggKGx2X2RlY2xhcmVkRm9ybWFsUGFyYW1ldGVyc18yXzA9IHJ1bGVKdm1Gb3JtYWxQYXJhbWV0ZXIgKSApIChvdGhlcmx2XzM9ICcsJyAoIChsdl9kZWNsYXJlZEZvcm1hbFBhcmFtZXRlcnNfNF8wPSBydWxlSnZtRm9ybWFsUGFyYW1ldGVyICkgKSApKiApPyAoIChsdl9leHBsaWNpdFN5bnRheF81XzA9ICd8JyApICkgKSApPworICAgICAgICAgICAgaW50IGFsdDEwNz0yOworICAgICAgICAgICAgYWx0MTA3ID0gZGZhMTA3LnByZWRpY3QoaW5wdXQpOworICAgICAgICAgICAgc3dpdGNoIChhbHQxMDcpIHsKICAgICAgICAgICAgICAgICBjYXNlIDEgOgotICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo1NTEwOjQ6ICggKCAoICggKCBydWxlSnZtRm9ybWFsUGFyYW1ldGVyICkgKSAoICcsJyAoICggcnVsZUp2bUZvcm1hbFBhcmFtZXRlciApICkgKSogKT8gKCAoICd8JyApICkgKSApPT4gKCAoICggKGx2X2RlY2xhcmVkRm9ybWFsUGFyYW1ldGVyc18yXzA9IHJ1bGVKdm1Gb3JtYWxQYXJhbWV0ZXIgKSApIChvdGhlcmx2XzM9ICcsJyAoIChsdl9kZWNsYXJlZEZvcm1hbFBhcmFtZXRlcnNfNF8wPSBydWxlSnZtRm9ybWFsUGFyYW1ldGVyICkgKSApKiApPyAoIChsdl9leHBsaWNpdFN5bnRheF81XzA9ICd8JyApICkgKQorICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo1OTQ5OjQ6ICggKCAoICggKCBydWxlSnZtRm9ybWFsUGFyYW1ldGVyICkgKSAoICcsJyAoICggcnVsZUp2bUZvcm1hbFBhcmFtZXRlciApICkgKSogKT8gKCAoICd8JyApICkgKSApPT4gKCAoICggKGx2X2RlY2xhcmVkRm9ybWFsUGFyYW1ldGVyc18yXzA9IHJ1bGVKdm1Gb3JtYWxQYXJhbWV0ZXIgKSApIChvdGhlcmx2XzM9ICcsJyAoIChsdl9kZWNsYXJlZEZvcm1hbFBhcmFtZXRlcnNfNF8wPSBydWxlSnZtRm9ybWFsUGFyYW1ldGVyICkgKSApKiApPyAoIChsdl9leHBsaWNpdFN5bnRheF81XzA9ICd8JyApICkgKQogICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjU1MzM6NDogKCAoICggKGx2X2RlY2xhcmVkRm9ybWFsUGFyYW1ldGVyc18yXzA9IHJ1bGVKdm1Gb3JtYWxQYXJhbWV0ZXIgKSApIChvdGhlcmx2XzM9ICcsJyAoIChsdl9kZWNsYXJlZEZvcm1hbFBhcmFtZXRlcnNfNF8wPSBydWxlSnZtRm9ybWFsUGFyYW1ldGVyICkgKSApKiApPyAoIChsdl9leHBsaWNpdFN5bnRheF81XzA9ICd8JyApICkgKQotICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo1NTM0OjU6ICggKCAobHZfZGVjbGFyZWRGb3JtYWxQYXJhbWV0ZXJzXzJfMD0gcnVsZUp2bUZvcm1hbFBhcmFtZXRlciApICkgKG90aGVybHZfMz0gJywnICggKGx2X2RlY2xhcmVkRm9ybWFsUGFyYW1ldGVyc180XzA9IHJ1bGVKdm1Gb3JtYWxQYXJhbWV0ZXIgKSApICkqICk/ICggKGx2X2V4cGxpY2l0U3ludGF4XzVfMD0gJ3wnICkgKQorICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo1OTcyOjQ6ICggKCAoIChsdl9kZWNsYXJlZEZvcm1hbFBhcmFtZXRlcnNfMl8wPSBydWxlSnZtRm9ybWFsUGFyYW1ldGVyICkgKSAob3RoZXJsdl8zPSAnLCcgKCAobHZfZGVjbGFyZWRGb3JtYWxQYXJhbWV0ZXJzXzRfMD0gcnVsZUp2bUZvcm1hbFBhcmFtZXRlciApICkgKSogKT8gKCAobHZfZXhwbGljaXRTeW50YXhfNV8wPSAnfCcgKSApICkKKyAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NTk3Mzo1OiAoICggKGx2X2RlY2xhcmVkRm9ybWFsUGFyYW1ldGVyc18yXzA9IHJ1bGVKdm1Gb3JtYWxQYXJhbWV0ZXIgKSApIChvdGhlcmx2XzM9ICcsJyAoIChsdl9kZWNsYXJlZEZvcm1hbFBhcmFtZXRlcnNfNF8wPSBydWxlSnZtRm9ybWFsUGFyYW1ldGVyICkgKSApKiApPyAoIChsdl9leHBsaWNpdFN5bnRheF81XzA9ICd8JyApICkKICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo1NTM0OjU6ICggKCAobHZfZGVjbGFyZWRGb3JtYWxQYXJhbWV0ZXJzXzJfMD0gcnVsZUp2bUZvcm1hbFBhcmFtZXRlciApICkgKG90aGVybHZfMz0gJywnICggKGx2X2RlY2xhcmVkRm9ybWFsUGFyYW1ldGVyc180XzA9IHJ1bGVKdm1Gb3JtYWxQYXJhbWV0ZXIgKSApICkqICk/Ci0gICAgICAgICAgICAgICAgICAgIGludCBhbHQ5NT0yOwotICAgICAgICAgICAgICAgICAgICBpbnQgTEE5NV8wID0gaW5wdXQuTEEoMSk7CisgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjU5NzM6NTogKCAoIChsdl9kZWNsYXJlZEZvcm1hbFBhcmFtZXRlcnNfMl8wPSBydWxlSnZtRm9ybWFsUGFyYW1ldGVyICkgKSAob3RoZXJsdl8zPSAnLCcgKCAobHZfZGVjbGFyZWRGb3JtYWxQYXJhbWV0ZXJzXzRfMD0gcnVsZUp2bUZvcm1hbFBhcmFtZXRlciApICkgKSogKT8KKyAgICAgICAgICAgICAgICAgICAgaW50IGFsdDEwNj0yOworICAgICAgICAgICAgICAgICAgICBpbnQgTEExMDZfMCA9IGlucHV0LkxBKDEpOwogCi0gICAgICAgICAgICAgICAgICAgIGlmICggKExBOTVfMD09UlVMRV9JRHx8TEE5NV8wPT03NHx8TEE5NV8wPT05OSkgKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBhbHQ5NT0xOworICAgICAgICAgICAgICAgICAgICBpZiAoIChMQTEwNl8wPT1SVUxFX0lEfHxMQTEwNl8wPT04MXx8TEExMDZfMD09MTA2KSApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFsdDEwNj0xOwogICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoYWx0OTUpIHsKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChhbHQxMDYpIHsKICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMSA6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NTUzNTo2OiAoIChsdl9kZWNsYXJlZEZvcm1hbFBhcmFtZXRlcnNfMl8wPSBydWxlSnZtRm9ybWFsUGFyYW1ldGVyICkgKSAob3RoZXJsdl8zPSAnLCcgKCAobHZfZGVjbGFyZWRGb3JtYWxQYXJhbWV0ZXJzXzRfMD0gcnVsZUp2bUZvcm1hbFBhcmFtZXRlciApICkgKSoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo1OTc0OjY6ICggKGx2X2RlY2xhcmVkRm9ybWFsUGFyYW1ldGVyc18yXzA9IHJ1bGVKdm1Gb3JtYWxQYXJhbWV0ZXIgKSApIChvdGhlcmx2XzM9ICcsJyAoIChsdl9kZWNsYXJlZEZvcm1hbFBhcmFtZXRlcnNfNF8wPSBydWxlSnZtRm9ybWFsUGFyYW1ldGVyICkgKSApKgogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo1NTM1OjY6ICggKGx2X2RlY2xhcmVkRm9ybWFsUGFyYW1ldGVyc18yXzA9IHJ1bGVKdm1Gb3JtYWxQYXJhbWV0ZXIgKSApCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NTUzNjo3OiAobHZfZGVjbGFyZWRGb3JtYWxQYXJhbWV0ZXJzXzJfMD0gcnVsZUp2bUZvcm1hbFBhcmFtZXRlciApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NTk3NDo2OiAoIChsdl9kZWNsYXJlZEZvcm1hbFBhcmFtZXRlcnNfMl8wPSBydWxlSnZtRm9ybWFsUGFyYW1ldGVyICkgKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjU5NzU6NzogKGx2X2RlY2xhcmVkRm9ybWFsUGFyYW1ldGVyc18yXzA9IHJ1bGVKdm1Gb3JtYWxQYXJhbWV0ZXIgKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo1NTM2Ojc6IChsdl9kZWNsYXJlZEZvcm1hbFBhcmFtZXRlcnNfMl8wPSBydWxlSnZtRm9ybWFsUGFyYW1ldGVyICkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo1NTM3Ojg6IGx2X2RlY2xhcmVkRm9ybWFsUGFyYW1ldGVyc18yXzA9IHJ1bGVKdm1Gb3JtYWxQYXJhbWV0ZXIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo1OTc1Ojc6IChsdl9kZWNsYXJlZEZvcm1hbFBhcmFtZXRlcnNfMl8wPSBydWxlSnZtRm9ybWFsUGFyYW1ldGVyICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo1OTc2Ojg6IGx2X2RlY2xhcmVkRm9ybWFsUGFyYW1ldGVyc18yXzA9IHJ1bGVKdm1Gb3JtYWxQYXJhbWV0ZXIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAkJCQkJCQkJbmV3Q29tcG9zaXRlTm9kZShncmFtbWFyQWNjZXNzLmdldFhDbG9zdXJlQWNjZXNzKCkuZ2V0RGVjbGFyZWRGb3JtYWxQYXJhbWV0ZXJzSnZtRm9ybWFsUGFyYW1ldGVyUGFyc2VyUnVsZUNhbGxfMV8wXzBfMF8wKCkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCQkJCQkJCQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV185Nyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMTExKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsdl9kZWNsYXJlZEZvcm1hbFBhcmFtZXRlcnNfMl8wPXJ1bGVKdm1Gb3JtYWxQYXJhbWV0ZXIoKTsKIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlLl9mc3AtLTsKQEAgLTE1MzMzLDM5ICsxNjUyNywzOSBAQAogCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NTU1NDo2OiAob3RoZXJsdl8zPSAnLCcgKCAobHZfZGVjbGFyZWRGb3JtYWxQYXJhbWV0ZXJzXzRfMD0gcnVsZUp2bUZvcm1hbFBhcmFtZXRlciApICkgKSoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb29wOTQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NTk5Mzo2OiAob3RoZXJsdl8zPSAnLCcgKCAobHZfZGVjbGFyZWRGb3JtYWxQYXJhbWV0ZXJzXzRfMD0gcnVsZUp2bUZvcm1hbFBhcmFtZXRlciApICkgKSoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb29wMTA1OgogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGFsdDk0PTI7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBMQTk0XzAgPSBpbnB1dC5MQSgxKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGFsdDEwNT0yOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgTEExMDVfMCA9IGlucHV0LkxBKDEpOwogCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICggKExBOTRfMD09NzUpICkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWx0OTQ9MTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCAoTEExMDVfMD09ODIpICkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWx0MTA1PTE7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KIAogCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoYWx0OTQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChhbHQxMDUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAJY2FzZSAxIDoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAJICAgIC8vIEludGVybmFsRGF0YURTTC5nOjU1NTU6Nzogb3RoZXJsdl8zPSAnLCcgKCAobHZfZGVjbGFyZWRGb3JtYWxQYXJhbWV0ZXJzXzRfMD0gcnVsZUp2bUZvcm1hbFBhcmFtZXRlciApICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAJICAgIC8vIEludGVybmFsRGF0YURTTC5nOjU5OTQ6Nzogb3RoZXJsdl8zPSAnLCcgKCAobHZfZGVjbGFyZWRGb3JtYWxQYXJhbWV0ZXJzXzRfMD0gcnVsZUp2bUZvcm1hbFBhcmFtZXRlciApICkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAJICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAJICAgIG90aGVybHZfMz0oVG9rZW4pbWF0Y2goaW5wdXQsNzUsRk9MTE9XXzc3KTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgCSAgICBvdGhlcmx2XzM9KFRva2VuKW1hdGNoKGlucHV0LDgyLEZPTExPV185MSk7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIAkgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAJICAgICAgCQkJCQkJCW5ld0xlYWZOb2RlKG90aGVybHZfMywgZ3JhbW1hckFjY2Vzcy5nZXRYQ2xvc3VyZUFjY2VzcygpLmdldENvbW1hS2V5d29yZF8xXzBfMF8xXzAoKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCSAgICAgIAkJCQkJCQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIAkgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIAkgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NTU1OTo3OiAoIChsdl9kZWNsYXJlZEZvcm1hbFBhcmFtZXRlcnNfNF8wPSBydWxlSnZtRm9ybWFsUGFyYW1ldGVyICkgKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIAkgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NTU2MDo4OiAobHZfZGVjbGFyZWRGb3JtYWxQYXJhbWV0ZXJzXzRfMD0gcnVsZUp2bUZvcm1hbFBhcmFtZXRlciApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgCSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo1OTk4Ojc6ICggKGx2X2RlY2xhcmVkRm9ybWFsUGFyYW1ldGVyc180XzA9IHJ1bGVKdm1Gb3JtYWxQYXJhbWV0ZXIgKSApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgCSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo1OTk5Ojg6IChsdl9kZWNsYXJlZEZvcm1hbFBhcmFtZXRlcnNfNF8wPSBydWxlSnZtRm9ybWFsUGFyYW1ldGVyICkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAJICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAJICAgIC8vIEludGVybmFsRGF0YURTTC5nOjU1NjA6ODogKGx2X2RlY2xhcmVkRm9ybWFsUGFyYW1ldGVyc180XzA9IHJ1bGVKdm1Gb3JtYWxQYXJhbWV0ZXIgKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIAkgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NTU2MTo5OiBsdl9kZWNsYXJlZEZvcm1hbFBhcmFtZXRlcnNfNF8wPSBydWxlSnZtRm9ybWFsUGFyYW1ldGVyCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgCSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo1OTk5Ojg6IChsdl9kZWNsYXJlZEZvcm1hbFBhcmFtZXRlcnNfNF8wPSBydWxlSnZtRm9ybWFsUGFyYW1ldGVyICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAJICAgIC8vIEludGVybmFsRGF0YURTTC5nOjYwMDA6OTogbHZfZGVjbGFyZWRGb3JtYWxQYXJhbWV0ZXJzXzRfMD0gcnVsZUp2bUZvcm1hbFBhcmFtZXRlcgogICAgICAgICAgICAgICAgICAgICAgICAgICAgIAkgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgIAkgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAJICAgICAgCQkJCQkJCQkJbmV3Q29tcG9zaXRlTm9kZShncmFtbWFyQWNjZXNzLmdldFhDbG9zdXJlQWNjZXNzKCkuZ2V0RGVjbGFyZWRGb3JtYWxQYXJhbWV0ZXJzSnZtRm9ybWFsUGFyYW1ldGVyUGFyc2VyUnVsZUNhbGxfMV8wXzBfMV8xXzAoKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCSAgICAgIAkJCQkJCQkJCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCSAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgCSAgICBwdXNoRm9sbG93KEZPTExPV185Nyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgCSAgICBwdXNoRm9sbG93KEZPTExPV18xMTEpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIAkgICAgbHZfZGVjbGFyZWRGb3JtYWxQYXJhbWV0ZXJzXzRfMD1ydWxlSnZtRm9ybWFsUGFyYW1ldGVyKCk7CiAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAJICAgIHN0YXRlLl9mc3AtLTsKQEAgLTE1Mzk0LDcgKzE2NTg4LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAJICAgIGJyZWFrOwogCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCWRlZmF1bHQgOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIAkgICAgYnJlYWsgbG9vcDk0OworICAgICAgICAgICAgICAgICAgICAgICAgICAgIAkgICAgYnJlYWsgbG9vcDEwNTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gd2hpbGUgKHRydWUpOwogCkBAIC0xNTQwNCwxMyArMTY1OTgsMTMgQEAKIAogICAgICAgICAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NTU4MDo1OiAoIChsdl9leHBsaWNpdFN5bnRheF81XzA9ICd8JyApICkKLSAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NTU4MTo2OiAobHZfZXhwbGljaXRTeW50YXhfNV8wPSAnfCcgKQorICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo2MDE5OjU6ICggKGx2X2V4cGxpY2l0U3ludGF4XzVfMD0gJ3wnICkgKQorICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo2MDIwOjY6IChsdl9leHBsaWNpdFN5bnRheF81XzA9ICd8JyApCiAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NTU4MTo2OiAobHZfZXhwbGljaXRTeW50YXhfNV8wPSAnfCcgKQotICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo1NTgyOjc6IGx2X2V4cGxpY2l0U3ludGF4XzVfMD0gJ3wnCisgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjYwMjA6NjogKGx2X2V4cGxpY2l0U3ludGF4XzVfMD0gJ3wnICkKKyAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NjAyMTo3OiBsdl9leHBsaWNpdFN5bnRheF81XzA9ICd8JwogICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGx2X2V4cGxpY2l0U3ludGF4XzVfMD0oVG9rZW4pbWF0Y2goaW5wdXQsMTEyLEZPTExPV185OCk7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OworICAgICAgICAgICAgICAgICAgICBsdl9leHBsaWNpdFN5bnRheF81XzA9KFRva2VuKW1hdGNoKGlucHV0LDExOSxGT0xMT1dfMTEyKTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7CiAgICAgICAgICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogCiAgICAgICAgICAgICAgICAgICAgICAgCQkJCQkJCW5ld0xlYWZOb2RlKGx2X2V4cGxpY2l0U3ludGF4XzVfMCwgZ3JhbW1hckFjY2Vzcy5nZXRYQ2xvc3VyZUFjY2VzcygpLmdldEV4cGxpY2l0U3ludGF4VmVydGljYWxMaW5lS2V5d29yZF8xXzBfMV8wKCkpOwpAQCAtMTU0MzksMTggKzE2NjMzLDE4IEBACiAKICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NTU5NjozOiAoIChsdl9leHByZXNzaW9uXzZfMD0gcnVsZVhFeHByZXNzaW9uSW5DbG9zdXJlICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NTU5Nzo0OiAobHZfZXhwcmVzc2lvbl82XzA9IHJ1bGVYRXhwcmVzc2lvbkluQ2xvc3VyZSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo2MDM1OjM6ICggKGx2X2V4cHJlc3Npb25fNl8wPSBydWxlWEV4cHJlc3Npb25JbkNsb3N1cmUgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo2MDM2OjQ6IChsdl9leHByZXNzaW9uXzZfMD0gcnVsZVhFeHByZXNzaW9uSW5DbG9zdXJlICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjU1OTc6NDogKGx2X2V4cHJlc3Npb25fNl8wPSBydWxlWEV4cHJlc3Npb25JbkNsb3N1cmUgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NTU5ODo1OiBsdl9leHByZXNzaW9uXzZfMD0gcnVsZVhFeHByZXNzaW9uSW5DbG9zdXJlCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo2MDM2OjQ6IChsdl9leHByZXNzaW9uXzZfMD0gcnVsZVhFeHByZXNzaW9uSW5DbG9zdXJlICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjYwMzc6NTogbHZfZXhwcmVzc2lvbl82XzA9IHJ1bGVYRXhwcmVzc2lvbkluQ2xvc3VyZQogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAKICAgICAgICAgICAgICAgCQkJCQluZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0WENsb3N1cmVBY2Nlc3MoKS5nZXRFeHByZXNzaW9uWEV4cHJlc3Npb25JbkNsb3N1cmVQYXJzZXJSdWxlQ2FsbF8yXzAoKSk7CiAgICAgICAgICAgICAgIAkJCQkKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzk5KTsKKyAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzExMyk7CiAgICAgICAgICAgICBsdl9leHByZXNzaW9uXzZfMD1ydWxlWEV4cHJlc3Npb25JbkNsb3N1cmUoKTsKIAogICAgICAgICAgICAgc3RhdGUuX2ZzcC0tOwpAQCAtMTU0NzQsNyArMTY2NjgsNyBAQAogCiAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgIG90aGVybHZfNz0oVG9rZW4pbWF0Y2goaW5wdXQsODAsRk9MTE9XXzIpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gY3VycmVudDsKKyAgICAgICAgICAgIG90aGVybHZfNz0oVG9rZW4pbWF0Y2goaW5wdXQsODcsRk9MTE9XXzIpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gY3VycmVudDsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogCiAgICAgICAgICAgICAgIAkJCW5ld0xlYWZOb2RlKG90aGVybHZfNywgZ3JhbW1hckFjY2Vzcy5nZXRYQ2xvc3VyZUFjY2VzcygpLmdldFJpZ2h0U3F1YXJlQnJhY2tldEtleXdvcmRfMygpKTsKQEAgLTE1NTA1LDcgKzE2Njk5LDcgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJlbnRyeVJ1bGVYRXhwcmVzc2lvbkluQ2xvc3VyZSIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo1NjIzOjE6IGVudHJ5UnVsZVhFeHByZXNzaW9uSW5DbG9zdXJlIHJldHVybnMgW0VPYmplY3QgY3VycmVudD1udWxsXSA6IGl2X3J1bGVYRXhwcmVzc2lvbkluQ2xvc3VyZT0gcnVsZVhFeHByZXNzaW9uSW5DbG9zdXJlIEVPRiA7CisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NjA2MjoxOiBlbnRyeVJ1bGVYRXhwcmVzc2lvbkluQ2xvc3VyZSByZXR1cm5zIFtFT2JqZWN0IGN1cnJlbnQ9bnVsbF0gOiBpdl9ydWxlWEV4cHJlc3Npb25JbkNsb3N1cmU9IHJ1bGVYRXhwcmVzc2lvbkluQ2xvc3VyZSBFT0YgOwogICAgIHB1YmxpYyBmaW5hbCBFT2JqZWN0IGVudHJ5UnVsZVhFeHByZXNzaW9uSW5DbG9zdXJlKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKICAgICAgICAgRU9iamVjdCBjdXJyZW50ID0gbnVsbDsKIApAQCAtMTU1MTMsOCArMTY3MDcsOCBAQAogCiAKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjU2MjM6NjE6IChpdl9ydWxlWEV4cHJlc3Npb25JbkNsb3N1cmU9IHJ1bGVYRXhwcmVzc2lvbkluQ2xvc3VyZSBFT0YgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NTYyNDoyOiBpdl9ydWxlWEV4cHJlc3Npb25JbkNsb3N1cmU9IHJ1bGVYRXhwcmVzc2lvbkluQ2xvc3VyZSBFT0YKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjYwNjI6NjE6IChpdl9ydWxlWEV4cHJlc3Npb25JbkNsb3N1cmU9IHJ1bGVYRXhwcmVzc2lvbkluQ2xvc3VyZSBFT0YgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NjA2MzoyOiBpdl9ydWxlWEV4cHJlc3Npb25JbkNsb3N1cmU9IHJ1bGVYRXhwcmVzc2lvbkluQ2xvc3VyZSBFT0YKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgbmV3Q29tcG9zaXRlTm9kZShncmFtbWFyQWNjZXNzLmdldFhFeHByZXNzaW9uSW5DbG9zdXJlUnVsZSgpKTsgCkBAIC0xNTU0NSw3ICsxNjczOSw3IEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZVhFeHByZXNzaW9uSW5DbG9zdXJlIgotICAgIC8vIEludGVybmFsRGF0YURTTC5nOjU2MzA6MTogcnVsZVhFeHByZXNzaW9uSW5DbG9zdXJlIHJldHVybnMgW0VPYmplY3QgY3VycmVudD1udWxsXSA6ICggKCkgKCAoIChsdl9leHByZXNzaW9uc18xXzA9IHJ1bGVYRXhwcmVzc2lvbk9yVmFyRGVjbGFyYXRpb24gKSApIChvdGhlcmx2XzI9ICc7JyApPyApKiApIDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo2MDY5OjE6IHJ1bGVYRXhwcmVzc2lvbkluQ2xvc3VyZSByZXR1cm5zIFtFT2JqZWN0IGN1cnJlbnQ9bnVsbF0gOiAoICgpICggKCAobHZfZXhwcmVzc2lvbnNfMV8wPSBydWxlWEV4cHJlc3Npb25PclZhckRlY2xhcmF0aW9uICkgKSAob3RoZXJsdl8yPSAnOycgKT8gKSogKSA7CiAgICAgcHVibGljIGZpbmFsIEVPYmplY3QgcnVsZVhFeHByZXNzaW9uSW5DbG9zdXJlKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKICAgICAgICAgRU9iamVjdCBjdXJyZW50ID0gbnVsbDsKIApAQCAtMTU1NTcsMTQgKzE2NzUxLDE0IEBACiAgICAgICAgIAllbnRlclJ1bGUoKTsKIAogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NTYzNjoyOiAoICggKCkgKCAoIChsdl9leHByZXNzaW9uc18xXzA9IHJ1bGVYRXhwcmVzc2lvbk9yVmFyRGVjbGFyYXRpb24gKSApIChvdGhlcmx2XzI9ICc7JyApPyApKiApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjU2Mzc6MjogKCAoKSAoICggKGx2X2V4cHJlc3Npb25zXzFfMD0gcnVsZVhFeHByZXNzaW9uT3JWYXJEZWNsYXJhdGlvbiApICkgKG90aGVybHZfMj0gJzsnICk/ICkqICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjYwNzU6MjogKCAoICgpICggKCAobHZfZXhwcmVzc2lvbnNfMV8wPSBydWxlWEV4cHJlc3Npb25PclZhckRlY2xhcmF0aW9uICkgKSAob3RoZXJsdl8yPSAnOycgKT8gKSogKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo2MDc2OjI6ICggKCkgKCAoIChsdl9leHByZXNzaW9uc18xXzA9IHJ1bGVYRXhwcmVzc2lvbk9yVmFyRGVjbGFyYXRpb24gKSApIChvdGhlcmx2XzI9ICc7JyApPyApKiApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo1NjM3OjI6ICggKCkgKCAoIChsdl9leHByZXNzaW9uc18xXzA9IHJ1bGVYRXhwcmVzc2lvbk9yVmFyRGVjbGFyYXRpb24gKSApIChvdGhlcmx2XzI9ICc7JyApPyApKiApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo1NjM4OjM6ICgpICggKCAobHZfZXhwcmVzc2lvbnNfMV8wPSBydWxlWEV4cHJlc3Npb25PclZhckRlY2xhcmF0aW9uICkgKSAob3RoZXJsdl8yPSAnOycgKT8gKSoKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjYwNzY6MjogKCAoKSAoICggKGx2X2V4cHJlc3Npb25zXzFfMD0gcnVsZVhFeHByZXNzaW9uT3JWYXJEZWNsYXJhdGlvbiApICkgKG90aGVybHZfMj0gJzsnICk/ICkqICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjYwNzc6MzogKCkgKCAoIChsdl9leHByZXNzaW9uc18xXzA9IHJ1bGVYRXhwcmVzc2lvbk9yVmFyRGVjbGFyYXRpb24gKSApIChvdGhlcmx2XzI9ICc7JyApPyApKgogICAgICAgICAgICAgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NTYzODozOiAoKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NTYzOTo0OiAKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjYwNzc6MzogKCkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjYwNzg6NDogCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKIApAQCAtMTU1NzYsMzMgKzE2NzcwLDMzIEBACiAKICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NTY0NTozOiAoICggKGx2X2V4cHJlc3Npb25zXzFfMD0gcnVsZVhFeHByZXNzaW9uT3JWYXJEZWNsYXJhdGlvbiApICkgKG90aGVybHZfMj0gJzsnICk/ICkqCi0gICAgICAgICAgICBsb29wOTg6CisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo2MDg0OjM6ICggKCAobHZfZXhwcmVzc2lvbnNfMV8wPSBydWxlWEV4cHJlc3Npb25PclZhckRlY2xhcmF0aW9uICkgKSAob3RoZXJsdl8yPSAnOycgKT8gKSoKKyAgICAgICAgICAgIGxvb3AxMDk6CiAgICAgICAgICAgICBkbyB7Ci0gICAgICAgICAgICAgICAgaW50IGFsdDk4PTI7Ci0gICAgICAgICAgICAgICAgaW50IExBOThfMCA9IGlucHV0LkxBKDEpOworICAgICAgICAgICAgICAgIGludCBhbHQxMDk9MjsKKyAgICAgICAgICAgICAgICBpbnQgTEExMDlfMCA9IGlucHV0LkxBKDEpOwogCi0gICAgICAgICAgICAgICAgaWYgKCAoKExBOThfMD49UlVMRV9TVFJJTkcgJiYgTEE5OF8wPD1SVUxFX0RFQ0lNQUwpfHxMQTk4XzA9PTE1fHxMQTk4XzA9PTQ2fHxMQTk4XzA9PTY1fHwoTEE5OF8wPj02OCAmJiBMQTk4XzA8PTY5KXx8TEE5OF8wPT03NHx8KExBOThfMD49NzggJiYgTEE5OF8wPD03OSl8fExBOThfMD09ODZ8fChMQTk4XzA+PTEwMiAmJiBMQTk4XzA8PTEwMyl8fExBOThfMD09MTA3fHxMQTk4XzA9PTExM3x8TEE5OF8wPT0xMTV8fChMQTk4XzA+PTExOSAmJiBMQTk4XzA8PTEzMil8fExBOThfMD09MTM0KSApIHsKLSAgICAgICAgICAgICAgICAgICAgYWx0OTg9MTsKKyAgICAgICAgICAgICAgICBpZiAoICgoTEExMDlfMD49UlVMRV9TVFJJTkcgJiYgTEExMDlfMDw9UlVMRV9ERUNJTUFMKXx8TEExMDlfMD09MTV8fExBMTA5XzA9PTUwfHxMQTEwOV8wPT03Mnx8KExBMTA5XzA+PTc1ICYmIExBMTA5XzA8PTc2KXx8TEExMDlfMD09ODF8fChMQTEwOV8wPj04NSAmJiBMQTEwOV8wPD04Nil8fExBMTA5XzA9PTkzfHwoTEExMDlfMD49MTA5ICYmIExBMTA5XzA8PTExMCl8fExBMTA5XzA9PTExNHx8TEExMDlfMD09MTIwfHxMQTEwOV8wPT0xMjJ8fChMQTEwOV8wPj0xMjYgJiYgTEExMDlfMDw9MTM5KXx8TEExMDlfMD09MTQxKSApIHsKKyAgICAgICAgICAgICAgICAgICAgYWx0MTA5PTE7CiAgICAgICAgICAgICAgICAgfQogCiAKLSAgICAgICAgICAgICAgICBzd2l0Y2ggKGFsdDk4KSB7CisgICAgICAgICAgICAgICAgc3dpdGNoIChhbHQxMDkpIHsKICAgICAgICAgICAgIAljYXNlIDEgOgotICAgICAgICAgICAgCSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo1NjQ2OjQ6ICggKGx2X2V4cHJlc3Npb25zXzFfMD0gcnVsZVhFeHByZXNzaW9uT3JWYXJEZWNsYXJhdGlvbiApICkgKG90aGVybHZfMj0gJzsnICk/CisgICAgICAgICAgICAJICAgIC8vIEludGVybmFsRGF0YURTTC5nOjYwODU6NDogKCAobHZfZXhwcmVzc2lvbnNfMV8wPSBydWxlWEV4cHJlc3Npb25PclZhckRlY2xhcmF0aW9uICkgKSAob3RoZXJsdl8yPSAnOycgKT8KICAgICAgICAgICAgIAkgICAgewotICAgICAgICAgICAgCSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo1NjQ2OjQ6ICggKGx2X2V4cHJlc3Npb25zXzFfMD0gcnVsZVhFeHByZXNzaW9uT3JWYXJEZWNsYXJhdGlvbiApICkKLSAgICAgICAgICAgIAkgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NTY0Nzo1OiAobHZfZXhwcmVzc2lvbnNfMV8wPSBydWxlWEV4cHJlc3Npb25PclZhckRlY2xhcmF0aW9uICkKKyAgICAgICAgICAgIAkgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NjA4NTo0OiAoIChsdl9leHByZXNzaW9uc18xXzA9IHJ1bGVYRXhwcmVzc2lvbk9yVmFyRGVjbGFyYXRpb24gKSApCisgICAgICAgICAgICAJICAgIC8vIEludGVybmFsRGF0YURTTC5nOjYwODY6NTogKGx2X2V4cHJlc3Npb25zXzFfMD0gcnVsZVhFeHByZXNzaW9uT3JWYXJEZWNsYXJhdGlvbiApCiAgICAgICAgICAgICAJICAgIHsKLSAgICAgICAgICAgIAkgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NTY0Nzo1OiAobHZfZXhwcmVzc2lvbnNfMV8wPSBydWxlWEV4cHJlc3Npb25PclZhckRlY2xhcmF0aW9uICkKLSAgICAgICAgICAgIAkgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NTY0ODo2OiBsdl9leHByZXNzaW9uc18xXzA9IHJ1bGVYRXhwcmVzc2lvbk9yVmFyRGVjbGFyYXRpb24KKyAgICAgICAgICAgIAkgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NjA4Njo1OiAobHZfZXhwcmVzc2lvbnNfMV8wPSBydWxlWEV4cHJlc3Npb25PclZhckRlY2xhcmF0aW9uICkKKyAgICAgICAgICAgIAkgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NjA4Nzo2OiBsdl9leHByZXNzaW9uc18xXzA9IHJ1bGVYRXhwcmVzc2lvbk9yVmFyRGVjbGFyYXRpb24KICAgICAgICAgICAgIAkgICAgewogICAgICAgICAgICAgCSAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKIAogICAgICAgICAgICAgCSAgICAgIAkJCQkJCW5ld0NvbXBvc2l0ZU5vZGUoZ3JhbW1hckFjY2Vzcy5nZXRYRXhwcmVzc2lvbkluQ2xvc3VyZUFjY2VzcygpLmdldEV4cHJlc3Npb25zWEV4cHJlc3Npb25PclZhckRlY2xhcmF0aW9uUGFyc2VyUnVsZUNhbGxfMV8wXzAoKSk7CiAgICAgICAgICAgICAJICAgICAgCQkJCQkKICAgICAgICAgICAgIAkgICAgfQotICAgICAgICAgICAgCSAgICBwdXNoRm9sbG93KEZPTExPV18xMDApOworICAgICAgICAgICAgCSAgICBwdXNoRm9sbG93KEZPTExPV18xMTQpOwogICAgICAgICAgICAgCSAgICBsdl9leHByZXNzaW9uc18xXzA9cnVsZVhFeHByZXNzaW9uT3JWYXJEZWNsYXJhdGlvbigpOwogCiAgICAgICAgICAgICAJICAgIHN0YXRlLl9mc3AtLTsKQEAgLTE1NjI2LDE4ICsxNjgyMCwxOCBAQAogCiAgICAgICAgICAgICAJICAgIH0KIAotICAgICAgICAgICAgCSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo1NjY1OjQ6IChvdGhlcmx2XzI9ICc7JyApPwotICAgICAgICAgICAgCSAgICBpbnQgYWx0OTc9MjsKLSAgICAgICAgICAgIAkgICAgaW50IExBOTdfMCA9IGlucHV0LkxBKDEpOworICAgICAgICAgICAgCSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo2MTA0OjQ6IChvdGhlcmx2XzI9ICc7JyApPworICAgICAgICAgICAgCSAgICBpbnQgYWx0MTA4PTI7CisgICAgICAgICAgICAJICAgIGludCBMQTEwOF8wID0gaW5wdXQuTEEoMSk7CiAKLSAgICAgICAgICAgIAkgICAgaWYgKCAoTEE5N18wPT03MikgKSB7Ci0gICAgICAgICAgICAJICAgICAgICBhbHQ5Nz0xOworICAgICAgICAgICAgCSAgICBpZiAoIChMQTEwOF8wPT03OSkgKSB7CisgICAgICAgICAgICAJICAgICAgICBhbHQxMDg9MTsKICAgICAgICAgICAgIAkgICAgfQotICAgICAgICAgICAgCSAgICBzd2l0Y2ggKGFsdDk3KSB7CisgICAgICAgICAgICAJICAgIHN3aXRjaCAoYWx0MTA4KSB7CiAgICAgICAgICAgICAJICAgICAgICBjYXNlIDEgOgotICAgICAgICAgICAgCSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjU2NjY6NTogb3RoZXJsdl8yPSAnOycKKyAgICAgICAgICAgIAkgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo2MTA1OjU6IG90aGVybHZfMj0gJzsnCiAgICAgICAgICAgICAJICAgICAgICAgICAgewotICAgICAgICAgICAgCSAgICAgICAgICAgIG90aGVybHZfMj0oVG9rZW4pbWF0Y2goaW5wdXQsNzIsRk9MTE9XXzEwMSk7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OworICAgICAgICAgICAgCSAgICAgICAgICAgIG90aGVybHZfMj0oVG9rZW4pbWF0Y2goaW5wdXQsNzksRk9MTE9XXzExNSk7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OwogICAgICAgICAgICAgCSAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogCiAgICAgICAgICAgICAJICAgICAgICAgICAgICAJCQkJCW5ld0xlYWZOb2RlKG90aGVybHZfMiwgZ3JhbW1hckFjY2Vzcy5nZXRYRXhwcmVzc2lvbkluQ2xvc3VyZUFjY2VzcygpLmdldFNlbWljb2xvbktleXdvcmRfMV8xKCkpOwpAQCAtMTU2NTQsNyArMTY4NDgsNyBAQAogICAgICAgICAgICAgCSAgICBicmVhazsKIAogICAgICAgICAgICAgCWRlZmF1bHQgOgotICAgICAgICAgICAgCSAgICBicmVhayBsb29wOTg7CisgICAgICAgICAgICAJICAgIGJyZWFrIGxvb3AxMDk7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfSB3aGlsZSAodHJ1ZSk7CiAKQEAgLTE1NjgzLDcgKzE2ODc3LDcgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJlbnRyeVJ1bGVYU2hvcnRDbG9zdXJlIgotICAgIC8vIEludGVybmFsRGF0YURTTC5nOjU2NzY6MTogZW50cnlSdWxlWFNob3J0Q2xvc3VyZSByZXR1cm5zIFtFT2JqZWN0IGN1cnJlbnQ9bnVsbF0gOiBpdl9ydWxlWFNob3J0Q2xvc3VyZT0gcnVsZVhTaG9ydENsb3N1cmUgRU9GIDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo2MTE1OjE6IGVudHJ5UnVsZVhTaG9ydENsb3N1cmUgcmV0dXJucyBbRU9iamVjdCBjdXJyZW50PW51bGxdIDogaXZfcnVsZVhTaG9ydENsb3N1cmU9IHJ1bGVYU2hvcnRDbG9zdXJlIEVPRiA7CiAgICAgcHVibGljIGZpbmFsIEVPYmplY3QgZW50cnlSdWxlWFNob3J0Q2xvc3VyZSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAgICAgICAgIEVPYmplY3QgY3VycmVudCA9IG51bGw7CiAKQEAgLTE1NjkxLDggKzE2ODg1LDggQEAKIAogCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo1Njc2OjU0OiAoaXZfcnVsZVhTaG9ydENsb3N1cmU9IHJ1bGVYU2hvcnRDbG9zdXJlIEVPRiApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo1Njc3OjI6IGl2X3J1bGVYU2hvcnRDbG9zdXJlPSBydWxlWFNob3J0Q2xvc3VyZSBFT0YKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjYxMTU6NTQ6IChpdl9ydWxlWFNob3J0Q2xvc3VyZT0gcnVsZVhTaG9ydENsb3N1cmUgRU9GICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjYxMTY6MjogaXZfcnVsZVhTaG9ydENsb3N1cmU9IHJ1bGVYU2hvcnRDbG9zdXJlIEVPRgogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBuZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0WFNob3J0Q2xvc3VyZVJ1bGUoKSk7IApAQCAtMTU3MjMsNyArMTY5MTcsNyBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVYU2hvcnRDbG9zdXJlIgotICAgIC8vIEludGVybmFsRGF0YURTTC5nOjU2ODM6MTogcnVsZVhTaG9ydENsb3N1cmUgcmV0dXJucyBbRU9iamVjdCBjdXJyZW50PW51bGxdIDogKCAoICggKCAoKSAoICggKCBydWxlSnZtRm9ybWFsUGFyYW1ldGVyICkgKSAoICcsJyAoICggcnVsZUp2bUZvcm1hbFBhcmFtZXRlciApICkgKSogKT8gKCAoICd8JyApICkgKSApPT4gKCAoKSAoICggKGx2X2RlY2xhcmVkRm9ybWFsUGFyYW1ldGVyc18xXzA9IHJ1bGVKdm1Gb3JtYWxQYXJhbWV0ZXIgKSApIChvdGhlcmx2XzI9ICcsJyAoIChsdl9kZWNsYXJlZEZvcm1hbFBhcmFtZXRlcnNfM18wPSBydWxlSnZtRm9ybWFsUGFyYW1ldGVyICkgKSApKiApPyAoIChsdl9leHBsaWNpdFN5bnRheF80XzA9ICd8JyApICkgKSApICggKGx2X2V4cHJlc3Npb25fNV8wPSBydWxlWEV4cHJlc3Npb24gKSApICkgOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjYxMjI6MTogcnVsZVhTaG9ydENsb3N1cmUgcmV0dXJucyBbRU9iamVjdCBjdXJyZW50PW51bGxdIDogKCAoICggKCAoKSAoICggKCBydWxlSnZtRm9ybWFsUGFyYW1ldGVyICkgKSAoICcsJyAoICggcnVsZUp2bUZvcm1hbFBhcmFtZXRlciApICkgKSogKT8gKCAoICd8JyApICkgKSApPT4gKCAoKSAoICggKGx2X2RlY2xhcmVkRm9ybWFsUGFyYW1ldGVyc18xXzA9IHJ1bGVKdm1Gb3JtYWxQYXJhbWV0ZXIgKSApIChvdGhlcmx2XzI9ICcsJyAoIChsdl9kZWNsYXJlZEZvcm1hbFBhcmFtZXRlcnNfM18wPSBydWxlSnZtRm9ybWFsUGFyYW1ldGVyICkgKSApKiApPyAoIChsdl9leHBsaWNpdFN5bnRheF80XzA9ICd8JyApICkgKSApICggKGx2X2V4cHJlc3Npb25fNV8wPSBydWxlWEV4cHJlc3Npb24gKSApICkgOwogICAgIHB1YmxpYyBmaW5hbCBFT2JqZWN0IHJ1bGVYU2hvcnRDbG9zdXJlKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKICAgICAgICAgRU9iamVjdCBjdXJyZW50ID0gbnVsbDsKIApAQCAtMTU3NDAsMjAgKzE2OTM0LDIwIEBACiAgICAgICAgIAllbnRlclJ1bGUoKTsKIAogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NTY4OToyOiAoICggKCAoICggKCkgKCAoICggcnVsZUp2bUZvcm1hbFBhcmFtZXRlciApICkgKCAnLCcgKCAoIHJ1bGVKdm1Gb3JtYWxQYXJhbWV0ZXIgKSApICkqICk/ICggKCAnfCcgKSApICkgKT0+ICggKCkgKCAoIChsdl9kZWNsYXJlZEZvcm1hbFBhcmFtZXRlcnNfMV8wPSBydWxlSnZtRm9ybWFsUGFyYW1ldGVyICkgKSAob3RoZXJsdl8yPSAnLCcgKCAobHZfZGVjbGFyZWRGb3JtYWxQYXJhbWV0ZXJzXzNfMD0gcnVsZUp2bUZvcm1hbFBhcmFtZXRlciApICkgKSogKT8gKCAobHZfZXhwbGljaXRTeW50YXhfNF8wPSAnfCcgKSApICkgKSAoIChsdl9leHByZXNzaW9uXzVfMD0gcnVsZVhFeHByZXNzaW9uICkgKSApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjU2OTA6MjogKCAoICggKCAoKSAoICggKCBydWxlSnZtRm9ybWFsUGFyYW1ldGVyICkgKSAoICcsJyAoICggcnVsZUp2bUZvcm1hbFBhcmFtZXRlciApICkgKSogKT8gKCAoICd8JyApICkgKSApPT4gKCAoKSAoICggKGx2X2RlY2xhcmVkRm9ybWFsUGFyYW1ldGVyc18xXzA9IHJ1bGVKdm1Gb3JtYWxQYXJhbWV0ZXIgKSApIChvdGhlcmx2XzI9ICcsJyAoIChsdl9kZWNsYXJlZEZvcm1hbFBhcmFtZXRlcnNfM18wPSBydWxlSnZtRm9ybWFsUGFyYW1ldGVyICkgKSApKiApPyAoIChsdl9leHBsaWNpdFN5bnRheF80XzA9ICd8JyApICkgKSApICggKGx2X2V4cHJlc3Npb25fNV8wPSBydWxlWEV4cHJlc3Npb24gKSApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjYxMjg6MjogKCAoICggKCAoICgpICggKCAoIHJ1bGVKdm1Gb3JtYWxQYXJhbWV0ZXIgKSApICggJywnICggKCBydWxlSnZtRm9ybWFsUGFyYW1ldGVyICkgKSApKiApPyAoICggJ3wnICkgKSApICk9PiAoICgpICggKCAobHZfZGVjbGFyZWRGb3JtYWxQYXJhbWV0ZXJzXzFfMD0gcnVsZUp2bUZvcm1hbFBhcmFtZXRlciApICkgKG90aGVybHZfMj0gJywnICggKGx2X2RlY2xhcmVkRm9ybWFsUGFyYW1ldGVyc18zXzA9IHJ1bGVKdm1Gb3JtYWxQYXJhbWV0ZXIgKSApICkqICk/ICggKGx2X2V4cGxpY2l0U3ludGF4XzRfMD0gJ3wnICkgKSApICkgKCAobHZfZXhwcmVzc2lvbl81XzA9IHJ1bGVYRXhwcmVzc2lvbiApICkgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo2MTI5OjI6ICggKCAoICggKCkgKCAoICggcnVsZUp2bUZvcm1hbFBhcmFtZXRlciApICkgKCAnLCcgKCAoIHJ1bGVKdm1Gb3JtYWxQYXJhbWV0ZXIgKSApICkqICk/ICggKCAnfCcgKSApICkgKT0+ICggKCkgKCAoIChsdl9kZWNsYXJlZEZvcm1hbFBhcmFtZXRlcnNfMV8wPSBydWxlSnZtRm9ybWFsUGFyYW1ldGVyICkgKSAob3RoZXJsdl8yPSAnLCcgKCAobHZfZGVjbGFyZWRGb3JtYWxQYXJhbWV0ZXJzXzNfMD0gcnVsZUp2bUZvcm1hbFBhcmFtZXRlciApICkgKSogKT8gKCAobHZfZXhwbGljaXRTeW50YXhfNF8wPSAnfCcgKSApICkgKSAoIChsdl9leHByZXNzaW9uXzVfMD0gcnVsZVhFeHByZXNzaW9uICkgKSApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo1NjkwOjI6ICggKCAoICggKCkgKCAoICggcnVsZUp2bUZvcm1hbFBhcmFtZXRlciApICkgKCAnLCcgKCAoIHJ1bGVKdm1Gb3JtYWxQYXJhbWV0ZXIgKSApICkqICk/ICggKCAnfCcgKSApICkgKT0+ICggKCkgKCAoIChsdl9kZWNsYXJlZEZvcm1hbFBhcmFtZXRlcnNfMV8wPSBydWxlSnZtRm9ybWFsUGFyYW1ldGVyICkgKSAob3RoZXJsdl8yPSAnLCcgKCAobHZfZGVjbGFyZWRGb3JtYWxQYXJhbWV0ZXJzXzNfMD0gcnVsZUp2bUZvcm1hbFBhcmFtZXRlciApICkgKSogKT8gKCAobHZfZXhwbGljaXRTeW50YXhfNF8wPSAnfCcgKSApICkgKSAoIChsdl9leHByZXNzaW9uXzVfMD0gcnVsZVhFeHByZXNzaW9uICkgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo1NjkxOjM6ICggKCAoICgpICggKCAoIHJ1bGVKdm1Gb3JtYWxQYXJhbWV0ZXIgKSApICggJywnICggKCBydWxlSnZtRm9ybWFsUGFyYW1ldGVyICkgKSApKiApPyAoICggJ3wnICkgKSApICk9PiAoICgpICggKCAobHZfZGVjbGFyZWRGb3JtYWxQYXJhbWV0ZXJzXzFfMD0gcnVsZUp2bUZvcm1hbFBhcmFtZXRlciApICkgKG90aGVybHZfMj0gJywnICggKGx2X2RlY2xhcmVkRm9ybWFsUGFyYW1ldGVyc18zXzA9IHJ1bGVKdm1Gb3JtYWxQYXJhbWV0ZXIgKSApICkqICk/ICggKGx2X2V4cGxpY2l0U3ludGF4XzRfMD0gJ3wnICkgKSApICkgKCAobHZfZXhwcmVzc2lvbl81XzA9IHJ1bGVYRXhwcmVzc2lvbiApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjYxMjk6MjogKCAoICggKCAoKSAoICggKCBydWxlSnZtRm9ybWFsUGFyYW1ldGVyICkgKSAoICcsJyAoICggcnVsZUp2bUZvcm1hbFBhcmFtZXRlciApICkgKSogKT8gKCAoICd8JyApICkgKSApPT4gKCAoKSAoICggKGx2X2RlY2xhcmVkRm9ybWFsUGFyYW1ldGVyc18xXzA9IHJ1bGVKdm1Gb3JtYWxQYXJhbWV0ZXIgKSApIChvdGhlcmx2XzI9ICcsJyAoIChsdl9kZWNsYXJlZEZvcm1hbFBhcmFtZXRlcnNfM18wPSBydWxlSnZtRm9ybWFsUGFyYW1ldGVyICkgKSApKiApPyAoIChsdl9leHBsaWNpdFN5bnRheF80XzA9ICd8JyApICkgKSApICggKGx2X2V4cHJlc3Npb25fNV8wPSBydWxlWEV4cHJlc3Npb24gKSApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjYxMzA6MzogKCAoICggKCkgKCAoICggcnVsZUp2bUZvcm1hbFBhcmFtZXRlciApICkgKCAnLCcgKCAoIHJ1bGVKdm1Gb3JtYWxQYXJhbWV0ZXIgKSApICkqICk/ICggKCAnfCcgKSApICkgKT0+ICggKCkgKCAoIChsdl9kZWNsYXJlZEZvcm1hbFBhcmFtZXRlcnNfMV8wPSBydWxlSnZtRm9ybWFsUGFyYW1ldGVyICkgKSAob3RoZXJsdl8yPSAnLCcgKCAobHZfZGVjbGFyZWRGb3JtYWxQYXJhbWV0ZXJzXzNfMD0gcnVsZUp2bUZvcm1hbFBhcmFtZXRlciApICkgKSogKT8gKCAobHZfZXhwbGljaXRTeW50YXhfNF8wPSAnfCcgKSApICkgKSAoIChsdl9leHByZXNzaW9uXzVfMD0gcnVsZVhFeHByZXNzaW9uICkgKQogICAgICAgICAgICAgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NTY5MTozOiAoICggKCAoKSAoICggKCBydWxlSnZtRm9ybWFsUGFyYW1ldGVyICkgKSAoICcsJyAoICggcnVsZUp2bUZvcm1hbFBhcmFtZXRlciApICkgKSogKT8gKCAoICd8JyApICkgKSApPT4gKCAoKSAoICggKGx2X2RlY2xhcmVkRm9ybWFsUGFyYW1ldGVyc18xXzA9IHJ1bGVKdm1Gb3JtYWxQYXJhbWV0ZXIgKSApIChvdGhlcmx2XzI9ICcsJyAoIChsdl9kZWNsYXJlZEZvcm1hbFBhcmFtZXRlcnNfM18wPSBydWxlSnZtRm9ybWFsUGFyYW1ldGVyICkgKSApKiApPyAoIChsdl9leHBsaWNpdFN5bnRheF80XzA9ICd8JyApICkgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo1NjkyOjQ6ICggKCAoKSAoICggKCBydWxlSnZtRm9ybWFsUGFyYW1ldGVyICkgKSAoICcsJyAoICggcnVsZUp2bUZvcm1hbFBhcmFtZXRlciApICkgKSogKT8gKCAoICd8JyApICkgKSApPT4gKCAoKSAoICggKGx2X2RlY2xhcmVkRm9ybWFsUGFyYW1ldGVyc18xXzA9IHJ1bGVKdm1Gb3JtYWxQYXJhbWV0ZXIgKSApIChvdGhlcmx2XzI9ICcsJyAoIChsdl9kZWNsYXJlZEZvcm1hbFBhcmFtZXRlcnNfM18wPSBydWxlSnZtRm9ybWFsUGFyYW1ldGVyICkgKSApKiApPyAoIChsdl9leHBsaWNpdFN5bnRheF80XzA9ICd8JyApICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NjEzMDozOiAoICggKCAoKSAoICggKCBydWxlSnZtRm9ybWFsUGFyYW1ldGVyICkgKSAoICcsJyAoICggcnVsZUp2bUZvcm1hbFBhcmFtZXRlciApICkgKSogKT8gKCAoICd8JyApICkgKSApPT4gKCAoKSAoICggKGx2X2RlY2xhcmVkRm9ybWFsUGFyYW1ldGVyc18xXzA9IHJ1bGVKdm1Gb3JtYWxQYXJhbWV0ZXIgKSApIChvdGhlcmx2XzI9ICcsJyAoIChsdl9kZWNsYXJlZEZvcm1hbFBhcmFtZXRlcnNfM18wPSBydWxlSnZtRm9ybWFsUGFyYW1ldGVyICkgKSApKiApPyAoIChsdl9leHBsaWNpdFN5bnRheF80XzA9ICd8JyApICkgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo2MTMxOjQ6ICggKCAoKSAoICggKCBydWxlSnZtRm9ybWFsUGFyYW1ldGVyICkgKSAoICcsJyAoICggcnVsZUp2bUZvcm1hbFBhcmFtZXRlciApICkgKSogKT8gKCAoICd8JyApICkgKSApPT4gKCAoKSAoICggKGx2X2RlY2xhcmVkRm9ybWFsUGFyYW1ldGVyc18xXzA9IHJ1bGVKdm1Gb3JtYWxQYXJhbWV0ZXIgKSApIChvdGhlcmx2XzI9ICcsJyAoIChsdl9kZWNsYXJlZEZvcm1hbFBhcmFtZXRlcnNfM18wPSBydWxlSnZtRm9ybWFsUGFyYW1ldGVyICkgKSApKiApPyAoIChsdl9leHBsaWNpdFN5bnRheF80XzA9ICd8JyApICkgKQogICAgICAgICAgICAgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NTcxNzo0OiAoICgpICggKCAobHZfZGVjbGFyZWRGb3JtYWxQYXJhbWV0ZXJzXzFfMD0gcnVsZUp2bUZvcm1hbFBhcmFtZXRlciApICkgKG90aGVybHZfMj0gJywnICggKGx2X2RlY2xhcmVkRm9ybWFsUGFyYW1ldGVyc18zXzA9IHJ1bGVKdm1Gb3JtYWxQYXJhbWV0ZXIgKSApICkqICk/ICggKGx2X2V4cGxpY2l0U3ludGF4XzRfMD0gJ3wnICkgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo1NzE4OjU6ICgpICggKCAobHZfZGVjbGFyZWRGb3JtYWxQYXJhbWV0ZXJzXzFfMD0gcnVsZUp2bUZvcm1hbFBhcmFtZXRlciApICkgKG90aGVybHZfMj0gJywnICggKGx2X2RlY2xhcmVkRm9ybWFsUGFyYW1ldGVyc18zXzA9IHJ1bGVKdm1Gb3JtYWxQYXJhbWV0ZXIgKSApICkqICk/ICggKGx2X2V4cGxpY2l0U3ludGF4XzRfMD0gJ3wnICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NjE1Njo0OiAoICgpICggKCAobHZfZGVjbGFyZWRGb3JtYWxQYXJhbWV0ZXJzXzFfMD0gcnVsZUp2bUZvcm1hbFBhcmFtZXRlciApICkgKG90aGVybHZfMj0gJywnICggKGx2X2RlY2xhcmVkRm9ybWFsUGFyYW1ldGVyc18zXzA9IHJ1bGVKdm1Gb3JtYWxQYXJhbWV0ZXIgKSApICkqICk/ICggKGx2X2V4cGxpY2l0U3ludGF4XzRfMD0gJ3wnICkgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo2MTU3OjU6ICgpICggKCAobHZfZGVjbGFyZWRGb3JtYWxQYXJhbWV0ZXJzXzFfMD0gcnVsZUp2bUZvcm1hbFBhcmFtZXRlciApICkgKG90aGVybHZfMj0gJywnICggKGx2X2RlY2xhcmVkRm9ybWFsUGFyYW1ldGVyc18zXzA9IHJ1bGVKdm1Gb3JtYWxQYXJhbWV0ZXIgKSApICkqICk/ICggKGx2X2V4cGxpY2l0U3ludGF4XzRfMD0gJ3wnICkgKQogICAgICAgICAgICAgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NTcxODo1OiAoKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NTcxOTo2OiAKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjYxNTc6NTogKCkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjYxNTg6NjogCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKIApAQCAtMTU3NjUsMjkgKzE2OTU5LDI5IEBACiAKICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NTcyNTo1OiAoICggKGx2X2RlY2xhcmVkRm9ybWFsUGFyYW1ldGVyc18xXzA9IHJ1bGVKdm1Gb3JtYWxQYXJhbWV0ZXIgKSApIChvdGhlcmx2XzI9ICcsJyAoIChsdl9kZWNsYXJlZEZvcm1hbFBhcmFtZXRlcnNfM18wPSBydWxlSnZtRm9ybWFsUGFyYW1ldGVyICkgKSApKiApPwotICAgICAgICAgICAgaW50IGFsdDEwMD0yOwotICAgICAgICAgICAgaW50IExBMTAwXzAgPSBpbnB1dC5MQSgxKTsKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjYxNjQ6NTogKCAoIChsdl9kZWNsYXJlZEZvcm1hbFBhcmFtZXRlcnNfMV8wPSBydWxlSnZtRm9ybWFsUGFyYW1ldGVyICkgKSAob3RoZXJsdl8yPSAnLCcgKCAobHZfZGVjbGFyZWRGb3JtYWxQYXJhbWV0ZXJzXzNfMD0gcnVsZUp2bUZvcm1hbFBhcmFtZXRlciApICkgKSogKT8KKyAgICAgICAgICAgIGludCBhbHQxMTE9MjsKKyAgICAgICAgICAgIGludCBMQTExMV8wID0gaW5wdXQuTEEoMSk7CiAKLSAgICAgICAgICAgIGlmICggKExBMTAwXzA9PVJVTEVfSUR8fExBMTAwXzA9PTc0fHxMQTEwMF8wPT05OSkgKSB7Ci0gICAgICAgICAgICAgICAgYWx0MTAwPTE7CisgICAgICAgICAgICBpZiAoIChMQTExMV8wPT1SVUxFX0lEfHxMQTExMV8wPT04MXx8TEExMTFfMD09MTA2KSApIHsKKyAgICAgICAgICAgICAgICBhbHQxMTE9MTsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHN3aXRjaCAoYWx0MTAwKSB7CisgICAgICAgICAgICBzd2l0Y2ggKGFsdDExMSkgewogICAgICAgICAgICAgICAgIGNhc2UgMSA6Ci0gICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjU3MjY6NjogKCAobHZfZGVjbGFyZWRGb3JtYWxQYXJhbWV0ZXJzXzFfMD0gcnVsZUp2bUZvcm1hbFBhcmFtZXRlciApICkgKG90aGVybHZfMj0gJywnICggKGx2X2RlY2xhcmVkRm9ybWFsUGFyYW1ldGVyc18zXzA9IHJ1bGVKdm1Gb3JtYWxQYXJhbWV0ZXIgKSApICkqCisgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjYxNjU6NjogKCAobHZfZGVjbGFyZWRGb3JtYWxQYXJhbWV0ZXJzXzFfMD0gcnVsZUp2bUZvcm1hbFBhcmFtZXRlciApICkgKG90aGVybHZfMj0gJywnICggKGx2X2RlY2xhcmVkRm9ybWFsUGFyYW1ldGVyc18zXzA9IHJ1bGVKdm1Gb3JtYWxQYXJhbWV0ZXIgKSApICkqCiAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NTcyNjo2OiAoIChsdl9kZWNsYXJlZEZvcm1hbFBhcmFtZXRlcnNfMV8wPSBydWxlSnZtRm9ybWFsUGFyYW1ldGVyICkgKQotICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo1NzI3Ojc6IChsdl9kZWNsYXJlZEZvcm1hbFBhcmFtZXRlcnNfMV8wPSBydWxlSnZtRm9ybWFsUGFyYW1ldGVyICkKKyAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NjE2NTo2OiAoIChsdl9kZWNsYXJlZEZvcm1hbFBhcmFtZXRlcnNfMV8wPSBydWxlSnZtRm9ybWFsUGFyYW1ldGVyICkgKQorICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo2MTY2Ojc6IChsdl9kZWNsYXJlZEZvcm1hbFBhcmFtZXRlcnNfMV8wPSBydWxlSnZtRm9ybWFsUGFyYW1ldGVyICkKICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo1NzI3Ojc6IChsdl9kZWNsYXJlZEZvcm1hbFBhcmFtZXRlcnNfMV8wPSBydWxlSnZtRm9ybWFsUGFyYW1ldGVyICkKLSAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NTcyODo4OiBsdl9kZWNsYXJlZEZvcm1hbFBhcmFtZXRlcnNfMV8wPSBydWxlSnZtRm9ybWFsUGFyYW1ldGVyCisgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjYxNjY6NzogKGx2X2RlY2xhcmVkRm9ybWFsUGFyYW1ldGVyc18xXzA9IHJ1bGVKdm1Gb3JtYWxQYXJhbWV0ZXIgKQorICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo2MTY3Ojg6IGx2X2RlY2xhcmVkRm9ybWFsUGFyYW1ldGVyc18xXzA9IHJ1bGVKdm1Gb3JtYWxQYXJhbWV0ZXIKICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKIAogICAgICAgICAgICAgICAgICAgICAgIAkJCQkJCQkJbmV3Q29tcG9zaXRlTm9kZShncmFtbWFyQWNjZXNzLmdldFhTaG9ydENsb3N1cmVBY2Nlc3MoKS5nZXREZWNsYXJlZEZvcm1hbFBhcmFtZXRlcnNKdm1Gb3JtYWxQYXJhbWV0ZXJQYXJzZXJSdWxlQ2FsbF8wXzBfMV8wXzAoKSk7CiAgICAgICAgICAgICAgICAgICAgICAgCQkJCQkJCQogICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzk3KTsKKyAgICAgICAgICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMTExKTsKICAgICAgICAgICAgICAgICAgICAgbHZfZGVjbGFyZWRGb3JtYWxQYXJhbWV0ZXJzXzFfMD1ydWxlSnZtRm9ybWFsUGFyYW1ldGVyKCk7CiAKICAgICAgICAgICAgICAgICAgICAgc3RhdGUuX2ZzcC0tOwpAQCAtMTU4MTEsMzkgKzE3MDA1LDM5IEBACiAKICAgICAgICAgICAgICAgICAgICAgfQogCi0gICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjU3NDU6NjogKG90aGVybHZfMj0gJywnICggKGx2X2RlY2xhcmVkRm9ybWFsUGFyYW1ldGVyc18zXzA9IHJ1bGVKdm1Gb3JtYWxQYXJhbWV0ZXIgKSApICkqCi0gICAgICAgICAgICAgICAgICAgIGxvb3A5OToKKyAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NjE4NDo2OiAob3RoZXJsdl8yPSAnLCcgKCAobHZfZGVjbGFyZWRGb3JtYWxQYXJhbWV0ZXJzXzNfMD0gcnVsZUp2bUZvcm1hbFBhcmFtZXRlciApICkgKSoKKyAgICAgICAgICAgICAgICAgICAgbG9vcDExMDoKICAgICAgICAgICAgICAgICAgICAgZG8gewotICAgICAgICAgICAgICAgICAgICAgICAgaW50IGFsdDk5PTI7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpbnQgTEE5OV8wID0gaW5wdXQuTEEoMSk7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYWx0MTEwPTI7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgTEExMTBfMCA9IGlucHV0LkxBKDEpOwogCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIChMQTk5XzA9PTc1KSApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbHQ5OT0xOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCAoTEExMTBfMD09ODIpICkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsdDExMD0xOwogICAgICAgICAgICAgICAgICAgICAgICAgfQogCiAKLSAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoYWx0OTkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoYWx0MTEwKSB7CiAgICAgICAgICAgICAgICAgICAgIAljYXNlIDEgOgotICAgICAgICAgICAgICAgICAgICAJICAgIC8vIEludGVybmFsRGF0YURTTC5nOjU3NDY6Nzogb3RoZXJsdl8yPSAnLCcgKCAobHZfZGVjbGFyZWRGb3JtYWxQYXJhbWV0ZXJzXzNfMD0gcnVsZUp2bUZvcm1hbFBhcmFtZXRlciApICkKKyAgICAgICAgICAgICAgICAgICAgCSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo2MTg1Ojc6IG90aGVybHZfMj0gJywnICggKGx2X2RlY2xhcmVkRm9ybWFsUGFyYW1ldGVyc18zXzA9IHJ1bGVKdm1Gb3JtYWxQYXJhbWV0ZXIgKSApCiAgICAgICAgICAgICAgICAgICAgIAkgICAgewotICAgICAgICAgICAgICAgICAgICAJICAgIG90aGVybHZfMj0oVG9rZW4pbWF0Y2goaW5wdXQsNzUsRk9MTE9XXzc3KTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7CisgICAgICAgICAgICAgICAgICAgIAkgICAgb3RoZXJsdl8yPShUb2tlbiltYXRjaChpbnB1dCw4MixGT0xMT1dfOTEpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gY3VycmVudDsKICAgICAgICAgICAgICAgICAgICAgCSAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKIAogICAgICAgICAgICAgICAgICAgICAJICAgICAgCQkJCQkJCW5ld0xlYWZOb2RlKG90aGVybHZfMiwgZ3JhbW1hckFjY2Vzcy5nZXRYU2hvcnRDbG9zdXJlQWNjZXNzKCkuZ2V0Q29tbWFLZXl3b3JkXzBfMF8xXzFfMCgpKTsKICAgICAgICAgICAgICAgICAgICAgCSAgICAgIAkJCQkJCQogICAgICAgICAgICAgICAgICAgICAJICAgIH0KLSAgICAgICAgICAgICAgICAgICAgCSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo1NzUwOjc6ICggKGx2X2RlY2xhcmVkRm9ybWFsUGFyYW1ldGVyc18zXzA9IHJ1bGVKdm1Gb3JtYWxQYXJhbWV0ZXIgKSApCi0gICAgICAgICAgICAgICAgICAgIAkgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NTc1MTo4OiAobHZfZGVjbGFyZWRGb3JtYWxQYXJhbWV0ZXJzXzNfMD0gcnVsZUp2bUZvcm1hbFBhcmFtZXRlciApCisgICAgICAgICAgICAgICAgICAgIAkgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NjE4OTo3OiAoIChsdl9kZWNsYXJlZEZvcm1hbFBhcmFtZXRlcnNfM18wPSBydWxlSnZtRm9ybWFsUGFyYW1ldGVyICkgKQorICAgICAgICAgICAgICAgICAgICAJICAgIC8vIEludGVybmFsRGF0YURTTC5nOjYxOTA6ODogKGx2X2RlY2xhcmVkRm9ybWFsUGFyYW1ldGVyc18zXzA9IHJ1bGVKdm1Gb3JtYWxQYXJhbWV0ZXIgKQogICAgICAgICAgICAgICAgICAgICAJICAgIHsKLSAgICAgICAgICAgICAgICAgICAgCSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo1NzUxOjg6IChsdl9kZWNsYXJlZEZvcm1hbFBhcmFtZXRlcnNfM18wPSBydWxlSnZtRm9ybWFsUGFyYW1ldGVyICkKLSAgICAgICAgICAgICAgICAgICAgCSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo1NzUyOjk6IGx2X2RlY2xhcmVkRm9ybWFsUGFyYW1ldGVyc18zXzA9IHJ1bGVKdm1Gb3JtYWxQYXJhbWV0ZXIKKyAgICAgICAgICAgICAgICAgICAgCSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo2MTkwOjg6IChsdl9kZWNsYXJlZEZvcm1hbFBhcmFtZXRlcnNfM18wPSBydWxlSnZtRm9ybWFsUGFyYW1ldGVyICkKKyAgICAgICAgICAgICAgICAgICAgCSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo2MTkxOjk6IGx2X2RlY2xhcmVkRm9ybWFsUGFyYW1ldGVyc18zXzA9IHJ1bGVKdm1Gb3JtYWxQYXJhbWV0ZXIKICAgICAgICAgICAgICAgICAgICAgCSAgICB7CiAgICAgICAgICAgICAgICAgICAgIAkgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAKICAgICAgICAgICAgICAgICAgICAgCSAgICAgIAkJCQkJCQkJCW5ld0NvbXBvc2l0ZU5vZGUoZ3JhbW1hckFjY2Vzcy5nZXRYU2hvcnRDbG9zdXJlQWNjZXNzKCkuZ2V0RGVjbGFyZWRGb3JtYWxQYXJhbWV0ZXJzSnZtRm9ybWFsUGFyYW1ldGVyUGFyc2VyUnVsZUNhbGxfMF8wXzFfMV8xXzAoKSk7CiAgICAgICAgICAgICAgICAgICAgIAkgICAgICAJCQkJCQkJCQogICAgICAgICAgICAgICAgICAgICAJICAgIH0KLSAgICAgICAgICAgICAgICAgICAgCSAgICBwdXNoRm9sbG93KEZPTExPV185Nyk7CisgICAgICAgICAgICAgICAgICAgIAkgICAgcHVzaEZvbGxvdyhGT0xMT1dfMTExKTsKICAgICAgICAgICAgICAgICAgICAgCSAgICBsdl9kZWNsYXJlZEZvcm1hbFBhcmFtZXRlcnNfM18wPXJ1bGVKdm1Gb3JtYWxQYXJhbWV0ZXIoKTsKIAogICAgICAgICAgICAgICAgICAgICAJICAgIHN0YXRlLl9mc3AtLTsKQEAgLTE1ODcyLDcgKzE3MDY2LDcgQEAKICAgICAgICAgICAgICAgICAgICAgCSAgICBicmVhazsKIAogICAgICAgICAgICAgICAgICAgICAJZGVmYXVsdCA6Ci0gICAgICAgICAgICAgICAgICAgIAkgICAgYnJlYWsgbG9vcDk5OworICAgICAgICAgICAgICAgICAgICAJICAgIGJyZWFrIGxvb3AxMTA7CiAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIH0gd2hpbGUgKHRydWUpOwogCkBAIC0xNTg4MiwxMyArMTcwNzYsMTMgQEAKIAogICAgICAgICAgICAgfQogCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo1NzcxOjU6ICggKGx2X2V4cGxpY2l0U3ludGF4XzRfMD0gJ3wnICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NTc3Mjo2OiAobHZfZXhwbGljaXRTeW50YXhfNF8wPSAnfCcgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NjIxMDo1OiAoIChsdl9leHBsaWNpdFN5bnRheF80XzA9ICd8JyApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjYyMTE6NjogKGx2X2V4cGxpY2l0U3ludGF4XzRfMD0gJ3wnICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjU3NzI6NjogKGx2X2V4cGxpY2l0U3ludGF4XzRfMD0gJ3wnICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjU3NzM6NzogbHZfZXhwbGljaXRTeW50YXhfNF8wPSAnfCcKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjYyMTE6NjogKGx2X2V4cGxpY2l0U3ludGF4XzRfMD0gJ3wnICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjYyMTI6NzogbHZfZXhwbGljaXRTeW50YXhfNF8wPSAnfCcKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIGx2X2V4cGxpY2l0U3ludGF4XzRfMD0oVG9rZW4pbWF0Y2goaW5wdXQsMTEyLEZPTExPV182NCk7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OworICAgICAgICAgICAgbHZfZXhwbGljaXRTeW50YXhfNF8wPShUb2tlbiltYXRjaChpbnB1dCwxMTksRk9MTE9XXzc4KTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKIAogICAgICAgICAgICAgICAJCQkJCQkJbmV3TGVhZk5vZGUobHZfZXhwbGljaXRTeW50YXhfNF8wLCBncmFtbWFyQWNjZXNzLmdldFhTaG9ydENsb3N1cmVBY2Nlc3MoKS5nZXRFeHBsaWNpdFN5bnRheFZlcnRpY2FsTGluZUtleXdvcmRfMF8wXzJfMCgpKTsKQEAgLTE1OTE0LDExICsxNzEwOCwxMSBAQAogCiAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjU3ODc6MzogKCAobHZfZXhwcmVzc2lvbl81XzA9IHJ1bGVYRXhwcmVzc2lvbiApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjU3ODg6NDogKGx2X2V4cHJlc3Npb25fNV8wPSBydWxlWEV4cHJlc3Npb24gKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NjIyNjozOiAoIChsdl9leHByZXNzaW9uXzVfMD0gcnVsZVhFeHByZXNzaW9uICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NjIyNzo0OiAobHZfZXhwcmVzc2lvbl81XzA9IHJ1bGVYRXhwcmVzc2lvbiApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo1Nzg4OjQ6IChsdl9leHByZXNzaW9uXzVfMD0gcnVsZVhFeHByZXNzaW9uICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjU3ODk6NTogbHZfZXhwcmVzc2lvbl81XzA9IHJ1bGVYRXhwcmVzc2lvbgorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NjIyNzo0OiAobHZfZXhwcmVzc2lvbl81XzA9IHJ1bGVYRXhwcmVzc2lvbiApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo2MjI4OjU6IGx2X2V4cHJlc3Npb25fNV8wPSBydWxlWEV4cHJlc3Npb24KICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogCkBAIC0xNTk3NCw3ICsxNzE2OCw3IEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAiZW50cnlSdWxlWFBhcmVudGhlc2l6ZWRFeHByZXNzaW9uIgotICAgIC8vIEludGVybmFsRGF0YURTTC5nOjU4MTA6MTogZW50cnlSdWxlWFBhcmVudGhlc2l6ZWRFeHByZXNzaW9uIHJldHVybnMgW0VPYmplY3QgY3VycmVudD1udWxsXSA6IGl2X3J1bGVYUGFyZW50aGVzaXplZEV4cHJlc3Npb249IHJ1bGVYUGFyZW50aGVzaXplZEV4cHJlc3Npb24gRU9GIDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo2MjQ5OjE6IGVudHJ5UnVsZVhQYXJlbnRoZXNpemVkRXhwcmVzc2lvbiByZXR1cm5zIFtFT2JqZWN0IGN1cnJlbnQ9bnVsbF0gOiBpdl9ydWxlWFBhcmVudGhlc2l6ZWRFeHByZXNzaW9uPSBydWxlWFBhcmVudGhlc2l6ZWRFeHByZXNzaW9uIEVPRiA7CiAgICAgcHVibGljIGZpbmFsIEVPYmplY3QgZW50cnlSdWxlWFBhcmVudGhlc2l6ZWRFeHByZXNzaW9uKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKICAgICAgICAgRU9iamVjdCBjdXJyZW50ID0gbnVsbDsKIApAQCAtMTU5ODIsOCArMTcxNzYsOCBAQAogCiAKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjU4MTA6NjU6IChpdl9ydWxlWFBhcmVudGhlc2l6ZWRFeHByZXNzaW9uPSBydWxlWFBhcmVudGhlc2l6ZWRFeHByZXNzaW9uIEVPRiApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo1ODExOjI6IGl2X3J1bGVYUGFyZW50aGVzaXplZEV4cHJlc3Npb249IHJ1bGVYUGFyZW50aGVzaXplZEV4cHJlc3Npb24gRU9GCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo2MjQ5OjY1OiAoaXZfcnVsZVhQYXJlbnRoZXNpemVkRXhwcmVzc2lvbj0gcnVsZVhQYXJlbnRoZXNpemVkRXhwcmVzc2lvbiBFT0YgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NjI1MDoyOiBpdl9ydWxlWFBhcmVudGhlc2l6ZWRFeHByZXNzaW9uPSBydWxlWFBhcmVudGhlc2l6ZWRFeHByZXNzaW9uIEVPRgogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBuZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0WFBhcmVudGhlc2l6ZWRFeHByZXNzaW9uUnVsZSgpKTsgCkBAIC0xNjAxNCw3ICsxNzIwOCw3IEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZVhQYXJlbnRoZXNpemVkRXhwcmVzc2lvbiIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo1ODE3OjE6IHJ1bGVYUGFyZW50aGVzaXplZEV4cHJlc3Npb24gcmV0dXJucyBbRU9iamVjdCBjdXJyZW50PW51bGxdIDogKG90aGVybHZfMD0gJygnIHRoaXNfWEV4cHJlc3Npb25fMT0gcnVsZVhFeHByZXNzaW9uIG90aGVybHZfMj0gJyknICkgOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjYyNTY6MTogcnVsZVhQYXJlbnRoZXNpemVkRXhwcmVzc2lvbiByZXR1cm5zIFtFT2JqZWN0IGN1cnJlbnQ9bnVsbF0gOiAob3RoZXJsdl8wPSAnKCcgdGhpc19YRXhwcmVzc2lvbl8xPSBydWxlWEV4cHJlc3Npb24gb3RoZXJsdl8yPSAnKScgKSA7CiAgICAgcHVibGljIGZpbmFsIEVPYmplY3QgcnVsZVhQYXJlbnRoZXNpemVkRXhwcmVzc2lvbigpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAgICAgICAgIEVPYmplY3QgY3VycmVudCA9IG51bGw7CiAKQEAgLTE2MDI3LDEzICsxNzIyMSwxMyBAQAogICAgICAgICAJZW50ZXJSdWxlKCk7CiAKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjU4MjM6MjogKCAob3RoZXJsdl8wPSAnKCcgdGhpc19YRXhwcmVzc2lvbl8xPSBydWxlWEV4cHJlc3Npb24gb3RoZXJsdl8yPSAnKScgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo1ODI0OjI6IChvdGhlcmx2XzA9ICcoJyB0aGlzX1hFeHByZXNzaW9uXzE9IHJ1bGVYRXhwcmVzc2lvbiBvdGhlcmx2XzI9ICcpJyApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo2MjYyOjI6ICggKG90aGVybHZfMD0gJygnIHRoaXNfWEV4cHJlc3Npb25fMT0gcnVsZVhFeHByZXNzaW9uIG90aGVybHZfMj0gJyknICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NjI2MzoyOiAob3RoZXJsdl8wPSAnKCcgdGhpc19YRXhwcmVzc2lvbl8xPSBydWxlWEV4cHJlc3Npb24gb3RoZXJsdl8yPSAnKScgKQogICAgICAgICAgICAgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NTgyNDoyOiAob3RoZXJsdl8wPSAnKCcgdGhpc19YRXhwcmVzc2lvbl8xPSBydWxlWEV4cHJlc3Npb24gb3RoZXJsdl8yPSAnKScgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NTgyNTozOiBvdGhlcmx2XzA9ICcoJyB0aGlzX1hFeHByZXNzaW9uXzE9IHJ1bGVYRXhwcmVzc2lvbiBvdGhlcmx2XzI9ICcpJworICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NjI2MzoyOiAob3RoZXJsdl8wPSAnKCcgdGhpc19YRXhwcmVzc2lvbl8xPSBydWxlWEV4cHJlc3Npb24gb3RoZXJsdl8yPSAnKScgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NjI2NDozOiBvdGhlcmx2XzA9ICcoJyB0aGlzX1hFeHByZXNzaW9uXzE9IHJ1bGVYRXhwcmVzc2lvbiBvdGhlcmx2XzI9ICcpJwogICAgICAgICAgICAgewotICAgICAgICAgICAgb3RoZXJsdl8wPShUb2tlbiltYXRjaChpbnB1dCw3NCxGT0xMT1dfNjQpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gY3VycmVudDsKKyAgICAgICAgICAgIG90aGVybHZfMD0oVG9rZW4pbWF0Y2goaW5wdXQsODEsRk9MTE9XXzc4KTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKIAogICAgICAgICAgICAgICAJCQluZXdMZWFmTm9kZShvdGhlcmx2XzAsIGdyYW1tYXJBY2Nlc3MuZ2V0WFBhcmVudGhlc2l6ZWRFeHByZXNzaW9uQWNjZXNzKCkuZ2V0TGVmdFBhcmVudGhlc2lzS2V5d29yZF8wKCkpOwpAQCAtMTYwNDQsNyArMTcyMzgsNyBAQAogICAgICAgICAgICAgICAJCQluZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0WFBhcmVudGhlc2l6ZWRFeHByZXNzaW9uQWNjZXNzKCkuZ2V0WEV4cHJlc3Npb25QYXJzZXJSdWxlQ2FsbF8xKCkpOwogICAgICAgICAgICAgICAJCQogICAgICAgICAgICAgfQotICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfNjIpOworICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfNzYpOwogICAgICAgICAgICAgdGhpc19YRXhwcmVzc2lvbl8xPXJ1bGVYRXhwcmVzc2lvbigpOwogCiAgICAgICAgICAgICBzdGF0ZS5fZnNwLS07CkBAIC0xNjA1NSw3ICsxNzI0OSw3IEBACiAgICAgICAgICAgICAgIAkJCWFmdGVyUGFyc2VyT3JFbnVtUnVsZUNhbGwoKTsKICAgICAgICAgICAgICAgCQkKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG90aGVybHZfMj0oVG9rZW4pbWF0Y2goaW5wdXQsNzYsRk9MTE9XXzIpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gY3VycmVudDsKKyAgICAgICAgICAgIG90aGVybHZfMj0oVG9rZW4pbWF0Y2goaW5wdXQsODMsRk9MTE9XXzIpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gY3VycmVudDsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogCiAgICAgICAgICAgICAgIAkJCW5ld0xlYWZOb2RlKG90aGVybHZfMiwgZ3JhbW1hckFjY2Vzcy5nZXRYUGFyZW50aGVzaXplZEV4cHJlc3Npb25BY2Nlc3MoKS5nZXRSaWdodFBhcmVudGhlc2lzS2V5d29yZF8yKCkpOwpAQCAtMTYwODYsNyArMTcyODAsNyBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgImVudHJ5UnVsZVhJZkV4cHJlc3Npb24iCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NTg0NToxOiBlbnRyeVJ1bGVYSWZFeHByZXNzaW9uIHJldHVybnMgW0VPYmplY3QgY3VycmVudD1udWxsXSA6IGl2X3J1bGVYSWZFeHByZXNzaW9uPSBydWxlWElmRXhwcmVzc2lvbiBFT0YgOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjYyODQ6MTogZW50cnlSdWxlWElmRXhwcmVzc2lvbiByZXR1cm5zIFtFT2JqZWN0IGN1cnJlbnQ9bnVsbF0gOiBpdl9ydWxlWElmRXhwcmVzc2lvbj0gcnVsZVhJZkV4cHJlc3Npb24gRU9GIDsKICAgICBwdWJsaWMgZmluYWwgRU9iamVjdCBlbnRyeVJ1bGVYSWZFeHByZXNzaW9uKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKICAgICAgICAgRU9iamVjdCBjdXJyZW50ID0gbnVsbDsKIApAQCAtMTYwOTQsOCArMTcyODgsOCBAQAogCiAKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjU4NDU6NTQ6IChpdl9ydWxlWElmRXhwcmVzc2lvbj0gcnVsZVhJZkV4cHJlc3Npb24gRU9GICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjU4NDY6MjogaXZfcnVsZVhJZkV4cHJlc3Npb249IHJ1bGVYSWZFeHByZXNzaW9uIEVPRgorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NjI4NDo1NDogKGl2X3J1bGVYSWZFeHByZXNzaW9uPSBydWxlWElmRXhwcmVzc2lvbiBFT0YgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NjI4NToyOiBpdl9ydWxlWElmRXhwcmVzc2lvbj0gcnVsZVhJZkV4cHJlc3Npb24gRU9GCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIG5ld0NvbXBvc2l0ZU5vZGUoZ3JhbW1hckFjY2Vzcy5nZXRYSWZFeHByZXNzaW9uUnVsZSgpKTsgCkBAIC0xNjEyNiw3ICsxNzMyMCw3IEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZVhJZkV4cHJlc3Npb24iCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NTg1MjoxOiBydWxlWElmRXhwcmVzc2lvbiByZXR1cm5zIFtFT2JqZWN0IGN1cnJlbnQ9bnVsbF0gOiAoICgpIG90aGVybHZfMT0gJ2lmJyBvdGhlcmx2XzI9ICcoJyAoIChsdl9pZl8zXzA9IHJ1bGVYRXhwcmVzc2lvbiApICkgb3RoZXJsdl80PSAnKScgKCAobHZfdGhlbl81XzA9IHJ1bGVYRXhwcmVzc2lvbiApICkgKCAoICggJ2Vsc2UnICk9Pm90aGVybHZfNj0gJ2Vsc2UnICkgKCAobHZfZWxzZV83XzA9IHJ1bGVYRXhwcmVzc2lvbiApICkgKT8gKSA7CisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NjI5MToxOiBydWxlWElmRXhwcmVzc2lvbiByZXR1cm5zIFtFT2JqZWN0IGN1cnJlbnQ9bnVsbF0gOiAoICgpIG90aGVybHZfMT0gJ2lmJyBvdGhlcmx2XzI9ICcoJyAoIChsdl9pZl8zXzA9IHJ1bGVYRXhwcmVzc2lvbiApICkgb3RoZXJsdl80PSAnKScgKCAobHZfdGhlbl81XzA9IHJ1bGVYRXhwcmVzc2lvbiApICkgKCAoICggJ2Vsc2UnICk9Pm90aGVybHZfNj0gJ2Vsc2UnICkgKCAobHZfZWxzZV83XzA9IHJ1bGVYRXhwcmVzc2lvbiApICkgKT8gKSA7CiAgICAgcHVibGljIGZpbmFsIEVPYmplY3QgcnVsZVhJZkV4cHJlc3Npb24oKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogICAgICAgICBFT2JqZWN0IGN1cnJlbnQgPSBudWxsOwogCkBAIC0xNjE0NSwxNCArMTczMzksMTQgQEAKICAgICAgICAgCWVudGVyUnVsZSgpOwogCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo1ODU4OjI6ICggKCAoKSBvdGhlcmx2XzE9ICdpZicgb3RoZXJsdl8yPSAnKCcgKCAobHZfaWZfM18wPSBydWxlWEV4cHJlc3Npb24gKSApIG90aGVybHZfND0gJyknICggKGx2X3RoZW5fNV8wPSBydWxlWEV4cHJlc3Npb24gKSApICggKCAoICdlbHNlJyApPT5vdGhlcmx2XzY9ICdlbHNlJyApICggKGx2X2Vsc2VfN18wPSBydWxlWEV4cHJlc3Npb24gKSApICk/ICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NTg1OToyOiAoICgpIG90aGVybHZfMT0gJ2lmJyBvdGhlcmx2XzI9ICcoJyAoIChsdl9pZl8zXzA9IHJ1bGVYRXhwcmVzc2lvbiApICkgb3RoZXJsdl80PSAnKScgKCAobHZfdGhlbl81XzA9IHJ1bGVYRXhwcmVzc2lvbiApICkgKCAoICggJ2Vsc2UnICk9Pm90aGVybHZfNj0gJ2Vsc2UnICkgKCAobHZfZWxzZV83XzA9IHJ1bGVYRXhwcmVzc2lvbiApICkgKT8gKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NjI5NzoyOiAoICggKCkgb3RoZXJsdl8xPSAnaWYnIG90aGVybHZfMj0gJygnICggKGx2X2lmXzNfMD0gcnVsZVhFeHByZXNzaW9uICkgKSBvdGhlcmx2XzQ9ICcpJyAoIChsdl90aGVuXzVfMD0gcnVsZVhFeHByZXNzaW9uICkgKSAoICggKCAnZWxzZScgKT0+b3RoZXJsdl82PSAnZWxzZScgKSAoIChsdl9lbHNlXzdfMD0gcnVsZVhFeHByZXNzaW9uICkgKSApPyApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjYyOTg6MjogKCAoKSBvdGhlcmx2XzE9ICdpZicgb3RoZXJsdl8yPSAnKCcgKCAobHZfaWZfM18wPSBydWxlWEV4cHJlc3Npb24gKSApIG90aGVybHZfND0gJyknICggKGx2X3RoZW5fNV8wPSBydWxlWEV4cHJlc3Npb24gKSApICggKCAoICdlbHNlJyApPT5vdGhlcmx2XzY9ICdlbHNlJyApICggKGx2X2Vsc2VfN18wPSBydWxlWEV4cHJlc3Npb24gKSApICk/ICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjU4NTk6MjogKCAoKSBvdGhlcmx2XzE9ICdpZicgb3RoZXJsdl8yPSAnKCcgKCAobHZfaWZfM18wPSBydWxlWEV4cHJlc3Npb24gKSApIG90aGVybHZfND0gJyknICggKGx2X3RoZW5fNV8wPSBydWxlWEV4cHJlc3Npb24gKSApICggKCAoICdlbHNlJyApPT5vdGhlcmx2XzY9ICdlbHNlJyApICggKGx2X2Vsc2VfN18wPSBydWxlWEV4cHJlc3Npb24gKSApICk/ICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjU4NjA6MzogKCkgb3RoZXJsdl8xPSAnaWYnIG90aGVybHZfMj0gJygnICggKGx2X2lmXzNfMD0gcnVsZVhFeHByZXNzaW9uICkgKSBvdGhlcmx2XzQ9ICcpJyAoIChsdl90aGVuXzVfMD0gcnVsZVhFeHByZXNzaW9uICkgKSAoICggKCAnZWxzZScgKT0+b3RoZXJsdl82PSAnZWxzZScgKSAoIChsdl9lbHNlXzdfMD0gcnVsZVhFeHByZXNzaW9uICkgKSApPworICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NjI5ODoyOiAoICgpIG90aGVybHZfMT0gJ2lmJyBvdGhlcmx2XzI9ICcoJyAoIChsdl9pZl8zXzA9IHJ1bGVYRXhwcmVzc2lvbiApICkgb3RoZXJsdl80PSAnKScgKCAobHZfdGhlbl81XzA9IHJ1bGVYRXhwcmVzc2lvbiApICkgKCAoICggJ2Vsc2UnICk9Pm90aGVybHZfNj0gJ2Vsc2UnICkgKCAobHZfZWxzZV83XzA9IHJ1bGVYRXhwcmVzc2lvbiApICkgKT8gKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NjI5OTozOiAoKSBvdGhlcmx2XzE9ICdpZicgb3RoZXJsdl8yPSAnKCcgKCAobHZfaWZfM18wPSBydWxlWEV4cHJlc3Npb24gKSApIG90aGVybHZfND0gJyknICggKGx2X3RoZW5fNV8wPSBydWxlWEV4cHJlc3Npb24gKSApICggKCAoICdlbHNlJyApPT5vdGhlcmx2XzY9ICdlbHNlJyApICggKGx2X2Vsc2VfN18wPSBydWxlWEV4cHJlc3Npb24gKSApICk/CiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo1ODYwOjM6ICgpCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo1ODYxOjQ6IAorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NjI5OTozOiAoKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NjMwMDo0OiAKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogCkBAIC0xNjE2NCwzMCArMTczNTgsMzAgQEAKIAogICAgICAgICAgICAgfQogCi0gICAgICAgICAgICBvdGhlcmx2XzE9KFRva2VuKW1hdGNoKGlucHV0LDExMyxGT0xMT1dfMTAyKTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7CisgICAgICAgICAgICBvdGhlcmx2XzE9KFRva2VuKW1hdGNoKGlucHV0LDEyMCxGT0xMT1dfMTE2KTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKIAogICAgICAgICAgICAgICAJCQluZXdMZWFmTm9kZShvdGhlcmx2XzEsIGdyYW1tYXJBY2Nlc3MuZ2V0WElmRXhwcmVzc2lvbkFjY2VzcygpLmdldElmS2V5d29yZF8xKCkpOwogICAgICAgICAgICAgICAJCQogICAgICAgICAgICAgfQotICAgICAgICAgICAgb3RoZXJsdl8yPShUb2tlbiltYXRjaChpbnB1dCw3NCxGT0xMT1dfNjQpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gY3VycmVudDsKKyAgICAgICAgICAgIG90aGVybHZfMj0oVG9rZW4pbWF0Y2goaW5wdXQsODEsRk9MTE9XXzc4KTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKIAogICAgICAgICAgICAgICAJCQluZXdMZWFmTm9kZShvdGhlcmx2XzIsIGdyYW1tYXJBY2Nlc3MuZ2V0WElmRXhwcmVzc2lvbkFjY2VzcygpLmdldExlZnRQYXJlbnRoZXNpc0tleXdvcmRfMigpKTsKICAgICAgICAgICAgICAgCQkKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjU4NzU6MzogKCAobHZfaWZfM18wPSBydWxlWEV4cHJlc3Npb24gKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo1ODc2OjQ6IChsdl9pZl8zXzA9IHJ1bGVYRXhwcmVzc2lvbiApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo2MzE0OjM6ICggKGx2X2lmXzNfMD0gcnVsZVhFeHByZXNzaW9uICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NjMxNTo0OiAobHZfaWZfM18wPSBydWxlWEV4cHJlc3Npb24gKQogICAgICAgICAgICAgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NTg3Njo0OiAobHZfaWZfM18wPSBydWxlWEV4cHJlc3Npb24gKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NTg3Nzo1OiBsdl9pZl8zXzA9IHJ1bGVYRXhwcmVzc2lvbgorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NjMxNTo0OiAobHZfaWZfM18wPSBydWxlWEV4cHJlc3Npb24gKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NjMxNjo1OiBsdl9pZl8zXzA9IHJ1bGVYRXhwcmVzc2lvbgogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAKICAgICAgICAgICAgICAgCQkJCQluZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0WElmRXhwcmVzc2lvbkFjY2VzcygpLmdldElmWEV4cHJlc3Npb25QYXJzZXJSdWxlQ2FsbF8zXzAoKSk7CiAgICAgICAgICAgICAgIAkJCQkKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzYyKTsKKyAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzc2KTsKICAgICAgICAgICAgIGx2X2lmXzNfMD1ydWxlWEV4cHJlc3Npb24oKTsKIAogICAgICAgICAgICAgc3RhdGUuX2ZzcC0tOwpAQCAtMTYyMTEsMjQgKzE3NDA1LDI0IEBACiAKICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgb3RoZXJsdl80PShUb2tlbiltYXRjaChpbnB1dCw3NixGT0xMT1dfNjQpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gY3VycmVudDsKKyAgICAgICAgICAgIG90aGVybHZfND0oVG9rZW4pbWF0Y2goaW5wdXQsODMsRk9MTE9XXzc4KTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKIAogICAgICAgICAgICAgICAJCQluZXdMZWFmTm9kZShvdGhlcmx2XzQsIGdyYW1tYXJBY2Nlc3MuZ2V0WElmRXhwcmVzc2lvbkFjY2VzcygpLmdldFJpZ2h0UGFyZW50aGVzaXNLZXl3b3JkXzQoKSk7CiAgICAgICAgICAgICAgIAkJCiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo1ODk4OjM6ICggKGx2X3RoZW5fNV8wPSBydWxlWEV4cHJlc3Npb24gKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo1ODk5OjQ6IChsdl90aGVuXzVfMD0gcnVsZVhFeHByZXNzaW9uICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjYzMzc6MzogKCAobHZfdGhlbl81XzA9IHJ1bGVYRXhwcmVzc2lvbiApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjYzMzg6NDogKGx2X3RoZW5fNV8wPSBydWxlWEV4cHJlc3Npb24gKQogICAgICAgICAgICAgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NTg5OTo0OiAobHZfdGhlbl81XzA9IHJ1bGVYRXhwcmVzc2lvbiApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo1OTAwOjU6IGx2X3RoZW5fNV8wPSBydWxlWEV4cHJlc3Npb24KKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjYzMzg6NDogKGx2X3RoZW5fNV8wPSBydWxlWEV4cHJlc3Npb24gKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NjMzOTo1OiBsdl90aGVuXzVfMD0gcnVsZVhFeHByZXNzaW9uCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKIAogICAgICAgICAgICAgICAJCQkJCW5ld0NvbXBvc2l0ZU5vZGUoZ3JhbW1hckFjY2Vzcy5nZXRYSWZFeHByZXNzaW9uQWNjZXNzKCkuZ2V0VGhlblhFeHByZXNzaW9uUGFyc2VyUnVsZUNhbGxfNV8wKCkpOwogICAgICAgICAgICAgICAJCQkJCiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV18xMDMpOworICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMTE3KTsKICAgICAgICAgICAgIGx2X3RoZW5fNV8wPXJ1bGVYRXhwcmVzc2lvbigpOwogCiAgICAgICAgICAgICBzdGF0ZS5fZnNwLS07CkBAIC0xNjI1MiwyNSArMTc0NDYsMjUgQEAKIAogICAgICAgICAgICAgfQogCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo1OTE3OjM6ICggKCAoICdlbHNlJyApPT5vdGhlcmx2XzY9ICdlbHNlJyApICggKGx2X2Vsc2VfN18wPSBydWxlWEV4cHJlc3Npb24gKSApICk/Ci0gICAgICAgICAgICBpbnQgYWx0MTAxPTI7Ci0gICAgICAgICAgICBpbnQgTEExMDFfMCA9IGlucHV0LkxBKDEpOworICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NjM1NjozOiAoICggKCAnZWxzZScgKT0+b3RoZXJsdl82PSAnZWxzZScgKSAoIChsdl9lbHNlXzdfMD0gcnVsZVhFeHByZXNzaW9uICkgKSApPworICAgICAgICAgICAgaW50IGFsdDExMj0yOworICAgICAgICAgICAgaW50IExBMTEyXzAgPSBpbnB1dC5MQSgxKTsKIAotICAgICAgICAgICAgaWYgKCAoTEExMDFfMD09MTE0KSApIHsKLSAgICAgICAgICAgICAgICBpbnQgTEExMDFfMSA9IGlucHV0LkxBKDIpOworICAgICAgICAgICAgaWYgKCAoTEExMTJfMD09MTIxKSApIHsKKyAgICAgICAgICAgICAgICBpbnQgTEExMTJfMSA9IGlucHV0LkxBKDIpOwogCiAgICAgICAgICAgICAgICAgaWYgKCAoc3lucHJlZDMxX0ludGVybmFsRGF0YURTTCgpKSApIHsKLSAgICAgICAgICAgICAgICAgICAgYWx0MTAxPTE7CisgICAgICAgICAgICAgICAgICAgIGFsdDExMj0xOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHN3aXRjaCAoYWx0MTAxKSB7CisgICAgICAgICAgICBzd2l0Y2ggKGFsdDExMikgewogICAgICAgICAgICAgICAgIGNhc2UgMSA6Ci0gICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjU5MTg6NDogKCAoICdlbHNlJyApPT5vdGhlcmx2XzY9ICdlbHNlJyApICggKGx2X2Vsc2VfN18wPSBydWxlWEV4cHJlc3Npb24gKSApCisgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjYzNTc6NDogKCAoICdlbHNlJyApPT5vdGhlcmx2XzY9ICdlbHNlJyApICggKGx2X2Vsc2VfN18wPSBydWxlWEV4cHJlc3Npb24gKSApCiAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NTkxODo0OiAoICggJ2Vsc2UnICk9Pm90aGVybHZfNj0gJ2Vsc2UnICkKLSAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NTkxOTo1OiAoICdlbHNlJyApPT5vdGhlcmx2XzY9ICdlbHNlJworICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo2MzU3OjQ6ICggKCAnZWxzZScgKT0+b3RoZXJsdl82PSAnZWxzZScgKQorICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo2MzU4OjU6ICggJ2Vsc2UnICk9Pm90aGVybHZfNj0gJ2Vsc2UnCiAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgb3RoZXJsdl82PShUb2tlbiltYXRjaChpbnB1dCwxMTQsRk9MTE9XXzY0KTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7CisgICAgICAgICAgICAgICAgICAgIG90aGVybHZfNj0oVG9rZW4pbWF0Y2goaW5wdXQsMTIxLEZPTExPV183OCk7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OwogICAgICAgICAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKIAogICAgICAgICAgICAgICAgICAgICAgIAkJCQkJbmV3TGVhZk5vZGUob3RoZXJsdl82LCBncmFtbWFyQWNjZXNzLmdldFhJZkV4cHJlc3Npb25BY2Nlc3MoKS5nZXRFbHNlS2V5d29yZF82XzAoKSk7CkBAIC0xNjI3OSwxMSArMTc0NzMsMTEgQEAKIAogICAgICAgICAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NTkyNTo0OiAoIChsdl9lbHNlXzdfMD0gcnVsZVhFeHByZXNzaW9uICkgKQotICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo1OTI2OjU6IChsdl9lbHNlXzdfMD0gcnVsZVhFeHByZXNzaW9uICkKKyAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NjM2NDo0OiAoIChsdl9lbHNlXzdfMD0gcnVsZVhFeHByZXNzaW9uICkgKQorICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo2MzY1OjU6IChsdl9lbHNlXzdfMD0gcnVsZVhFeHByZXNzaW9uICkKICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo1OTI2OjU6IChsdl9lbHNlXzdfMD0gcnVsZVhFeHByZXNzaW9uICkKLSAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NTkyNzo2OiBsdl9lbHNlXzdfMD0gcnVsZVhFeHByZXNzaW9uCisgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjYzNjU6NTogKGx2X2Vsc2VfN18wPSBydWxlWEV4cHJlc3Npb24gKQorICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo2MzY2OjY6IGx2X2Vsc2VfN18wPSBydWxlWEV4cHJlc3Npb24KICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKIApAQCAtMTYzNDUsNyArMTc1MzksNyBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgImVudHJ5UnVsZVhTd2l0Y2hFeHByZXNzaW9uIgotICAgIC8vIEludGVybmFsRGF0YURTTC5nOjU5NDk6MTogZW50cnlSdWxlWFN3aXRjaEV4cHJlc3Npb24gcmV0dXJucyBbRU9iamVjdCBjdXJyZW50PW51bGxdIDogaXZfcnVsZVhTd2l0Y2hFeHByZXNzaW9uPSBydWxlWFN3aXRjaEV4cHJlc3Npb24gRU9GIDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo2Mzg4OjE6IGVudHJ5UnVsZVhTd2l0Y2hFeHByZXNzaW9uIHJldHVybnMgW0VPYmplY3QgY3VycmVudD1udWxsXSA6IGl2X3J1bGVYU3dpdGNoRXhwcmVzc2lvbj0gcnVsZVhTd2l0Y2hFeHByZXNzaW9uIEVPRiA7CiAgICAgcHVibGljIGZpbmFsIEVPYmplY3QgZW50cnlSdWxlWFN3aXRjaEV4cHJlc3Npb24oKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogICAgICAgICBFT2JqZWN0IGN1cnJlbnQgPSBudWxsOwogCkBAIC0xNjM1Myw4ICsxNzU0Nyw4IEBACiAKIAogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NTk0OTo1ODogKGl2X3J1bGVYU3dpdGNoRXhwcmVzc2lvbj0gcnVsZVhTd2l0Y2hFeHByZXNzaW9uIEVPRiApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo1OTUwOjI6IGl2X3J1bGVYU3dpdGNoRXhwcmVzc2lvbj0gcnVsZVhTd2l0Y2hFeHByZXNzaW9uIEVPRgorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NjM4ODo1ODogKGl2X3J1bGVYU3dpdGNoRXhwcmVzc2lvbj0gcnVsZVhTd2l0Y2hFeHByZXNzaW9uIEVPRiApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo2Mzg5OjI6IGl2X3J1bGVYU3dpdGNoRXhwcmVzc2lvbj0gcnVsZVhTd2l0Y2hFeHByZXNzaW9uIEVPRgogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBuZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0WFN3aXRjaEV4cHJlc3Npb25SdWxlKCkpOyAKQEAgLTE2Mzg1LDcgKzE3NTc5LDcgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlWFN3aXRjaEV4cHJlc3Npb24iCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NTk1NjoxOiBydWxlWFN3aXRjaEV4cHJlc3Npb24gcmV0dXJucyBbRU9iamVjdCBjdXJyZW50PW51bGxdIDogKCAoKSBvdGhlcmx2XzE9ICdzd2l0Y2gnICggKCAoICggKCAnKCcgKCAoIHJ1bGVKdm1Gb3JtYWxQYXJhbWV0ZXIgKSApICc6JyApICk9PiAob3RoZXJsdl8yPSAnKCcgKCAobHZfZGVjbGFyZWRQYXJhbV8zXzA9IHJ1bGVKdm1Gb3JtYWxQYXJhbWV0ZXIgKSApIG90aGVybHZfND0gJzonICkgKSAoIChsdl9zd2l0Y2hfNV8wPSBydWxlWEV4cHJlc3Npb24gKSApIG90aGVybHZfNj0gJyknICkgfCAoICggKCAoICggKCBydWxlSnZtRm9ybWFsUGFyYW1ldGVyICkgKSAnOicgKSApPT4gKCAoIChsdl9kZWNsYXJlZFBhcmFtXzdfMD0gcnVsZUp2bUZvcm1hbFBhcmFtZXRlciApICkgb3RoZXJsdl84PSAnOicgKSApPyAoIChsdl9zd2l0Y2hfOV8wPSBydWxlWEV4cHJlc3Npb24gKSApICkgKSBvdGhlcmx2XzEwPSAneycgKCAobHZfY2FzZXNfMTFfMD0gcnVsZVhDYXNlUGFydCApICkqIChvdGhlcmx2XzEyPSAnZGVmYXVsdCcgb3RoZXJsdl8xMz0gJzonICggKGx2X2RlZmF1bHRfMTRfMD0gcnVsZVhFeHByZXNzaW9uICkgKSApPyBvdGhlcmx2XzE1PSAnfScgKSA7CisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NjM5NToxOiBydWxlWFN3aXRjaEV4cHJlc3Npb24gcmV0dXJucyBbRU9iamVjdCBjdXJyZW50PW51bGxdIDogKCAoKSBvdGhlcmx2XzE9ICdzd2l0Y2gnICggKCAoICggKCAnKCcgKCAoIHJ1bGVKdm1Gb3JtYWxQYXJhbWV0ZXIgKSApICc6JyApICk9PiAob3RoZXJsdl8yPSAnKCcgKCAobHZfZGVjbGFyZWRQYXJhbV8zXzA9IHJ1bGVKdm1Gb3JtYWxQYXJhbWV0ZXIgKSApIG90aGVybHZfND0gJzonICkgKSAoIChsdl9zd2l0Y2hfNV8wPSBydWxlWEV4cHJlc3Npb24gKSApIG90aGVybHZfNj0gJyknICkgfCAoICggKCAoICggKCBydWxlSnZtRm9ybWFsUGFyYW1ldGVyICkgKSAnOicgKSApPT4gKCAoIChsdl9kZWNsYXJlZFBhcmFtXzdfMD0gcnVsZUp2bUZvcm1hbFBhcmFtZXRlciApICkgb3RoZXJsdl84PSAnOicgKSApPyAoIChsdl9zd2l0Y2hfOV8wPSBydWxlWEV4cHJlc3Npb24gKSApICkgKSBvdGhlcmx2XzEwPSAneycgKCAobHZfY2FzZXNfMTFfMD0gcnVsZVhDYXNlUGFydCApICkqIChvdGhlcmx2XzEyPSAnZGVmYXVsdCcgb3RoZXJsdl8xMz0gJzonICggKGx2X2RlZmF1bHRfMTRfMD0gcnVsZVhFeHByZXNzaW9uICkgKSApPyBvdGhlcmx2XzE1PSAnfScgKSA7CiAgICAgcHVibGljIGZpbmFsIEVPYmplY3QgcnVsZVhTd2l0Y2hFeHByZXNzaW9uKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKICAgICAgICAgRU9iamVjdCBjdXJyZW50ID0gbnVsbDsKIApAQCAtMTY0MTUsMTQgKzE3NjA5LDE0IEBACiAgICAgICAgIAllbnRlclJ1bGUoKTsKIAogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NTk2MjoyOiAoICggKCkgb3RoZXJsdl8xPSAnc3dpdGNoJyAoICggKCAoICggJygnICggKCBydWxlSnZtRm9ybWFsUGFyYW1ldGVyICkgKSAnOicgKSApPT4gKG90aGVybHZfMj0gJygnICggKGx2X2RlY2xhcmVkUGFyYW1fM18wPSBydWxlSnZtRm9ybWFsUGFyYW1ldGVyICkgKSBvdGhlcmx2XzQ9ICc6JyApICkgKCAobHZfc3dpdGNoXzVfMD0gcnVsZVhFeHByZXNzaW9uICkgKSBvdGhlcmx2XzY9ICcpJyApIHwgKCAoICggKCAoICggcnVsZUp2bUZvcm1hbFBhcmFtZXRlciApICkgJzonICkgKT0+ICggKCAobHZfZGVjbGFyZWRQYXJhbV83XzA9IHJ1bGVKdm1Gb3JtYWxQYXJhbWV0ZXIgKSApIG90aGVybHZfOD0gJzonICkgKT8gKCAobHZfc3dpdGNoXzlfMD0gcnVsZVhFeHByZXNzaW9uICkgKSApICkgb3RoZXJsdl8xMD0gJ3snICggKGx2X2Nhc2VzXzExXzA9IHJ1bGVYQ2FzZVBhcnQgKSApKiAob3RoZXJsdl8xMj0gJ2RlZmF1bHQnIG90aGVybHZfMTM9ICc6JyAoIChsdl9kZWZhdWx0XzE0XzA9IHJ1bGVYRXhwcmVzc2lvbiApICkgKT8gb3RoZXJsdl8xNT0gJ30nICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NTk2MzoyOiAoICgpIG90aGVybHZfMT0gJ3N3aXRjaCcgKCAoICggKCAoICcoJyAoICggcnVsZUp2bUZvcm1hbFBhcmFtZXRlciApICkgJzonICkgKT0+IChvdGhlcmx2XzI9ICcoJyAoIChsdl9kZWNsYXJlZFBhcmFtXzNfMD0gcnVsZUp2bUZvcm1hbFBhcmFtZXRlciApICkgb3RoZXJsdl80PSAnOicgKSApICggKGx2X3N3aXRjaF81XzA9IHJ1bGVYRXhwcmVzc2lvbiApICkgb3RoZXJsdl82PSAnKScgKSB8ICggKCAoICggKCAoIHJ1bGVKdm1Gb3JtYWxQYXJhbWV0ZXIgKSApICc6JyApICk9PiAoICggKGx2X2RlY2xhcmVkUGFyYW1fN18wPSBydWxlSnZtRm9ybWFsUGFyYW1ldGVyICkgKSBvdGhlcmx2Xzg9ICc6JyApICk/ICggKGx2X3N3aXRjaF85XzA9IHJ1bGVYRXhwcmVzc2lvbiApICkgKSApIG90aGVybHZfMTA9ICd7JyAoIChsdl9jYXNlc18xMV8wPSBydWxlWENhc2VQYXJ0ICkgKSogKG90aGVybHZfMTI9ICdkZWZhdWx0JyBvdGhlcmx2XzEzPSAnOicgKCAobHZfZGVmYXVsdF8xNF8wPSBydWxlWEV4cHJlc3Npb24gKSApICk/IG90aGVybHZfMTU9ICd9JyApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo2NDAxOjI6ICggKCAoKSBvdGhlcmx2XzE9ICdzd2l0Y2gnICggKCAoICggKCAnKCcgKCAoIHJ1bGVKdm1Gb3JtYWxQYXJhbWV0ZXIgKSApICc6JyApICk9PiAob3RoZXJsdl8yPSAnKCcgKCAobHZfZGVjbGFyZWRQYXJhbV8zXzA9IHJ1bGVKdm1Gb3JtYWxQYXJhbWV0ZXIgKSApIG90aGVybHZfND0gJzonICkgKSAoIChsdl9zd2l0Y2hfNV8wPSBydWxlWEV4cHJlc3Npb24gKSApIG90aGVybHZfNj0gJyknICkgfCAoICggKCAoICggKCBydWxlSnZtRm9ybWFsUGFyYW1ldGVyICkgKSAnOicgKSApPT4gKCAoIChsdl9kZWNsYXJlZFBhcmFtXzdfMD0gcnVsZUp2bUZvcm1hbFBhcmFtZXRlciApICkgb3RoZXJsdl84PSAnOicgKSApPyAoIChsdl9zd2l0Y2hfOV8wPSBydWxlWEV4cHJlc3Npb24gKSApICkgKSBvdGhlcmx2XzEwPSAneycgKCAobHZfY2FzZXNfMTFfMD0gcnVsZVhDYXNlUGFydCApICkqIChvdGhlcmx2XzEyPSAnZGVmYXVsdCcgb3RoZXJsdl8xMz0gJzonICggKGx2X2RlZmF1bHRfMTRfMD0gcnVsZVhFeHByZXNzaW9uICkgKSApPyBvdGhlcmx2XzE1PSAnfScgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo2NDAyOjI6ICggKCkgb3RoZXJsdl8xPSAnc3dpdGNoJyAoICggKCAoICggJygnICggKCBydWxlSnZtRm9ybWFsUGFyYW1ldGVyICkgKSAnOicgKSApPT4gKG90aGVybHZfMj0gJygnICggKGx2X2RlY2xhcmVkUGFyYW1fM18wPSBydWxlSnZtRm9ybWFsUGFyYW1ldGVyICkgKSBvdGhlcmx2XzQ9ICc6JyApICkgKCAobHZfc3dpdGNoXzVfMD0gcnVsZVhFeHByZXNzaW9uICkgKSBvdGhlcmx2XzY9ICcpJyApIHwgKCAoICggKCAoICggcnVsZUp2bUZvcm1hbFBhcmFtZXRlciApICkgJzonICkgKT0+ICggKCAobHZfZGVjbGFyZWRQYXJhbV83XzA9IHJ1bGVKdm1Gb3JtYWxQYXJhbWV0ZXIgKSApIG90aGVybHZfOD0gJzonICkgKT8gKCAobHZfc3dpdGNoXzlfMD0gcnVsZVhFeHByZXNzaW9uICkgKSApICkgb3RoZXJsdl8xMD0gJ3snICggKGx2X2Nhc2VzXzExXzA9IHJ1bGVYQ2FzZVBhcnQgKSApKiAob3RoZXJsdl8xMj0gJ2RlZmF1bHQnIG90aGVybHZfMTM9ICc6JyAoIChsdl9kZWZhdWx0XzE0XzA9IHJ1bGVYRXhwcmVzc2lvbiApICkgKT8gb3RoZXJsdl8xNT0gJ30nICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjU5NjM6MjogKCAoKSBvdGhlcmx2XzE9ICdzd2l0Y2gnICggKCAoICggKCAnKCcgKCAoIHJ1bGVKdm1Gb3JtYWxQYXJhbWV0ZXIgKSApICc6JyApICk9PiAob3RoZXJsdl8yPSAnKCcgKCAobHZfZGVjbGFyZWRQYXJhbV8zXzA9IHJ1bGVKdm1Gb3JtYWxQYXJhbWV0ZXIgKSApIG90aGVybHZfND0gJzonICkgKSAoIChsdl9zd2l0Y2hfNV8wPSBydWxlWEV4cHJlc3Npb24gKSApIG90aGVybHZfNj0gJyknICkgfCAoICggKCAoICggKCBydWxlSnZtRm9ybWFsUGFyYW1ldGVyICkgKSAnOicgKSApPT4gKCAoIChsdl9kZWNsYXJlZFBhcmFtXzdfMD0gcnVsZUp2bUZvcm1hbFBhcmFtZXRlciApICkgb3RoZXJsdl84PSAnOicgKSApPyAoIChsdl9zd2l0Y2hfOV8wPSBydWxlWEV4cHJlc3Npb24gKSApICkgKSBvdGhlcmx2XzEwPSAneycgKCAobHZfY2FzZXNfMTFfMD0gcnVsZVhDYXNlUGFydCApICkqIChvdGhlcmx2XzEyPSAnZGVmYXVsdCcgb3RoZXJsdl8xMz0gJzonICggKGx2X2RlZmF1bHRfMTRfMD0gcnVsZVhFeHByZXNzaW9uICkgKSApPyBvdGhlcmx2XzE1PSAnfScgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NTk2NDozOiAoKSBvdGhlcmx2XzE9ICdzd2l0Y2gnICggKCAoICggKCAnKCcgKCAoIHJ1bGVKdm1Gb3JtYWxQYXJhbWV0ZXIgKSApICc6JyApICk9PiAob3RoZXJsdl8yPSAnKCcgKCAobHZfZGVjbGFyZWRQYXJhbV8zXzA9IHJ1bGVKdm1Gb3JtYWxQYXJhbWV0ZXIgKSApIG90aGVybHZfND0gJzonICkgKSAoIChsdl9zd2l0Y2hfNV8wPSBydWxlWEV4cHJlc3Npb24gKSApIG90aGVybHZfNj0gJyknICkgfCAoICggKCAoICggKCBydWxlSnZtRm9ybWFsUGFyYW1ldGVyICkgKSAnOicgKSApPT4gKCAoIChsdl9kZWNsYXJlZFBhcmFtXzdfMD0gcnVsZUp2bUZvcm1hbFBhcmFtZXRlciApICkgb3RoZXJsdl84PSAnOicgKSApPyAoIChsdl9zd2l0Y2hfOV8wPSBydWxlWEV4cHJlc3Npb24gKSApICkgKSBvdGhlcmx2XzEwPSAneycgKCAobHZfY2FzZXNfMTFfMD0gcnVsZVhDYXNlUGFydCApICkqIChvdGhlcmx2XzEyPSAnZGVmYXVsdCcgb3RoZXJsdl8xMz0gJzonICggKGx2X2RlZmF1bHRfMTRfMD0gcnVsZVhFeHByZXNzaW9uICkgKSApPyBvdGhlcmx2XzE1PSAnfScKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjY0MDI6MjogKCAoKSBvdGhlcmx2XzE9ICdzd2l0Y2gnICggKCAoICggKCAnKCcgKCAoIHJ1bGVKdm1Gb3JtYWxQYXJhbWV0ZXIgKSApICc6JyApICk9PiAob3RoZXJsdl8yPSAnKCcgKCAobHZfZGVjbGFyZWRQYXJhbV8zXzA9IHJ1bGVKdm1Gb3JtYWxQYXJhbWV0ZXIgKSApIG90aGVybHZfND0gJzonICkgKSAoIChsdl9zd2l0Y2hfNV8wPSBydWxlWEV4cHJlc3Npb24gKSApIG90aGVybHZfNj0gJyknICkgfCAoICggKCAoICggKCBydWxlSnZtRm9ybWFsUGFyYW1ldGVyICkgKSAnOicgKSApPT4gKCAoIChsdl9kZWNsYXJlZFBhcmFtXzdfMD0gcnVsZUp2bUZvcm1hbFBhcmFtZXRlciApICkgb3RoZXJsdl84PSAnOicgKSApPyAoIChsdl9zd2l0Y2hfOV8wPSBydWxlWEV4cHJlc3Npb24gKSApICkgKSBvdGhlcmx2XzEwPSAneycgKCAobHZfY2FzZXNfMTFfMD0gcnVsZVhDYXNlUGFydCApICkqIChvdGhlcmx2XzEyPSAnZGVmYXVsdCcgb3RoZXJsdl8xMz0gJzonICggKGx2X2RlZmF1bHRfMTRfMD0gcnVsZVhFeHByZXNzaW9uICkgKSApPyBvdGhlcmx2XzE1PSAnfScgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NjQwMzozOiAoKSBvdGhlcmx2XzE9ICdzd2l0Y2gnICggKCAoICggKCAnKCcgKCAoIHJ1bGVKdm1Gb3JtYWxQYXJhbWV0ZXIgKSApICc6JyApICk9PiAob3RoZXJsdl8yPSAnKCcgKCAobHZfZGVjbGFyZWRQYXJhbV8zXzA9IHJ1bGVKdm1Gb3JtYWxQYXJhbWV0ZXIgKSApIG90aGVybHZfND0gJzonICkgKSAoIChsdl9zd2l0Y2hfNV8wPSBydWxlWEV4cHJlc3Npb24gKSApIG90aGVybHZfNj0gJyknICkgfCAoICggKCAoICggKCBydWxlSnZtRm9ybWFsUGFyYW1ldGVyICkgKSAnOicgKSApPT4gKCAoIChsdl9kZWNsYXJlZFBhcmFtXzdfMD0gcnVsZUp2bUZvcm1hbFBhcmFtZXRlciApICkgb3RoZXJsdl84PSAnOicgKSApPyAoIChsdl9zd2l0Y2hfOV8wPSBydWxlWEV4cHJlc3Npb24gKSApICkgKSBvdGhlcmx2XzEwPSAneycgKCAobHZfY2FzZXNfMTFfMD0gcnVsZVhDYXNlUGFydCApICkqIChvdGhlcmx2XzEyPSAnZGVmYXVsdCcgb3RoZXJsdl8xMz0gJzonICggKGx2X2RlZmF1bHRfMTRfMD0gcnVsZVhFeHByZXNzaW9uICkgKSApPyBvdGhlcmx2XzE1PSAnfScKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjU5NjQ6MzogKCkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjU5NjU6NDogCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo2NDAzOjM6ICgpCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo2NDA0OjQ6IAogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAKQEAgLTE2NDM0LDQ2ICsxNzYyOCw0NiBAQAogCiAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgIG90aGVybHZfMT0oVG9rZW4pbWF0Y2goaW5wdXQsMTE1LEZPTExPV18xMDQpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gY3VycmVudDsKKyAgICAgICAgICAgIG90aGVybHZfMT0oVG9rZW4pbWF0Y2goaW5wdXQsMTIyLEZPTExPV18xMTgpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gY3VycmVudDsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogCiAgICAgICAgICAgICAgIAkJCW5ld0xlYWZOb2RlKG90aGVybHZfMSwgZ3JhbW1hckFjY2Vzcy5nZXRYU3dpdGNoRXhwcmVzc2lvbkFjY2VzcygpLmdldFN3aXRjaEtleXdvcmRfMSgpKTsKICAgICAgICAgICAgICAgCQkKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjU5NzU6MzogKCAoICggKCAoICcoJyAoICggcnVsZUp2bUZvcm1hbFBhcmFtZXRlciApICkgJzonICkgKT0+IChvdGhlcmx2XzI9ICcoJyAoIChsdl9kZWNsYXJlZFBhcmFtXzNfMD0gcnVsZUp2bUZvcm1hbFBhcmFtZXRlciApICkgb3RoZXJsdl80PSAnOicgKSApICggKGx2X3N3aXRjaF81XzA9IHJ1bGVYRXhwcmVzc2lvbiApICkgb3RoZXJsdl82PSAnKScgKSB8ICggKCAoICggKCAoIHJ1bGVKdm1Gb3JtYWxQYXJhbWV0ZXIgKSApICc6JyApICk9PiAoICggKGx2X2RlY2xhcmVkUGFyYW1fN18wPSBydWxlSnZtRm9ybWFsUGFyYW1ldGVyICkgKSBvdGhlcmx2Xzg9ICc6JyApICk/ICggKGx2X3N3aXRjaF85XzA9IHJ1bGVYRXhwcmVzc2lvbiApICkgKSApCi0gICAgICAgICAgICBpbnQgYWx0MTAzPTI7Ci0gICAgICAgICAgICBhbHQxMDMgPSBkZmExMDMucHJlZGljdChpbnB1dCk7Ci0gICAgICAgICAgICBzd2l0Y2ggKGFsdDEwMykgeworICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NjQxNDozOiAoICggKCAoICggJygnICggKCBydWxlSnZtRm9ybWFsUGFyYW1ldGVyICkgKSAnOicgKSApPT4gKG90aGVybHZfMj0gJygnICggKGx2X2RlY2xhcmVkUGFyYW1fM18wPSBydWxlSnZtRm9ybWFsUGFyYW1ldGVyICkgKSBvdGhlcmx2XzQ9ICc6JyApICkgKCAobHZfc3dpdGNoXzVfMD0gcnVsZVhFeHByZXNzaW9uICkgKSBvdGhlcmx2XzY9ICcpJyApIHwgKCAoICggKCAoICggcnVsZUp2bUZvcm1hbFBhcmFtZXRlciApICkgJzonICkgKT0+ICggKCAobHZfZGVjbGFyZWRQYXJhbV83XzA9IHJ1bGVKdm1Gb3JtYWxQYXJhbWV0ZXIgKSApIG90aGVybHZfOD0gJzonICkgKT8gKCAobHZfc3dpdGNoXzlfMD0gcnVsZVhFeHByZXNzaW9uICkgKSApICkKKyAgICAgICAgICAgIGludCBhbHQxMTQ9MjsKKyAgICAgICAgICAgIGFsdDExNCA9IGRmYTExNC5wcmVkaWN0KGlucHV0KTsKKyAgICAgICAgICAgIHN3aXRjaCAoYWx0MTE0KSB7CiAgICAgICAgICAgICAgICAgY2FzZSAxIDoKLSAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NTk3Njo0OiAoICggKCAoICcoJyAoICggcnVsZUp2bUZvcm1hbFBhcmFtZXRlciApICkgJzonICkgKT0+IChvdGhlcmx2XzI9ICcoJyAoIChsdl9kZWNsYXJlZFBhcmFtXzNfMD0gcnVsZUp2bUZvcm1hbFBhcmFtZXRlciApICkgb3RoZXJsdl80PSAnOicgKSApICggKGx2X3N3aXRjaF81XzA9IHJ1bGVYRXhwcmVzc2lvbiApICkgb3RoZXJsdl82PSAnKScgKQorICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo2NDE1OjQ6ICggKCAoICggJygnICggKCBydWxlSnZtRm9ybWFsUGFyYW1ldGVyICkgKSAnOicgKSApPT4gKG90aGVybHZfMj0gJygnICggKGx2X2RlY2xhcmVkUGFyYW1fM18wPSBydWxlSnZtRm9ybWFsUGFyYW1ldGVyICkgKSBvdGhlcmx2XzQ9ICc6JyApICkgKCAobHZfc3dpdGNoXzVfMD0gcnVsZVhFeHByZXNzaW9uICkgKSBvdGhlcmx2XzY9ICcpJyApCiAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NTk3Njo0OiAoICggKCAoICcoJyAoICggcnVsZUp2bUZvcm1hbFBhcmFtZXRlciApICkgJzonICkgKT0+IChvdGhlcmx2XzI9ICcoJyAoIChsdl9kZWNsYXJlZFBhcmFtXzNfMD0gcnVsZUp2bUZvcm1hbFBhcmFtZXRlciApICkgb3RoZXJsdl80PSAnOicgKSApICggKGx2X3N3aXRjaF81XzA9IHJ1bGVYRXhwcmVzc2lvbiApICkgb3RoZXJsdl82PSAnKScgKQotICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo1OTc3OjU6ICggKCAoICcoJyAoICggcnVsZUp2bUZvcm1hbFBhcmFtZXRlciApICkgJzonICkgKT0+IChvdGhlcmx2XzI9ICcoJyAoIChsdl9kZWNsYXJlZFBhcmFtXzNfMD0gcnVsZUp2bUZvcm1hbFBhcmFtZXRlciApICkgb3RoZXJsdl80PSAnOicgKSApICggKGx2X3N3aXRjaF81XzA9IHJ1bGVYRXhwcmVzc2lvbiApICkgb3RoZXJsdl82PSAnKScKKyAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NjQxNTo0OiAoICggKCAoICcoJyAoICggcnVsZUp2bUZvcm1hbFBhcmFtZXRlciApICkgJzonICkgKT0+IChvdGhlcmx2XzI9ICcoJyAoIChsdl9kZWNsYXJlZFBhcmFtXzNfMD0gcnVsZUp2bUZvcm1hbFBhcmFtZXRlciApICkgb3RoZXJsdl80PSAnOicgKSApICggKGx2X3N3aXRjaF81XzA9IHJ1bGVYRXhwcmVzc2lvbiApICkgb3RoZXJsdl82PSAnKScgKQorICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo2NDE2OjU6ICggKCAoICcoJyAoICggcnVsZUp2bUZvcm1hbFBhcmFtZXRlciApICkgJzonICkgKT0+IChvdGhlcmx2XzI9ICcoJyAoIChsdl9kZWNsYXJlZFBhcmFtXzNfMD0gcnVsZUp2bUZvcm1hbFBhcmFtZXRlciApICkgb3RoZXJsdl80PSAnOicgKSApICggKGx2X3N3aXRjaF81XzA9IHJ1bGVYRXhwcmVzc2lvbiApICkgb3RoZXJsdl82PSAnKScKICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo1OTc3OjU6ICggKCAoICcoJyAoICggcnVsZUp2bUZvcm1hbFBhcmFtZXRlciApICkgJzonICkgKT0+IChvdGhlcmx2XzI9ICcoJyAoIChsdl9kZWNsYXJlZFBhcmFtXzNfMD0gcnVsZUp2bUZvcm1hbFBhcmFtZXRlciApICkgb3RoZXJsdl80PSAnOicgKSApCi0gICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjU5Nzg6NjogKCAoICcoJyAoICggcnVsZUp2bUZvcm1hbFBhcmFtZXRlciApICkgJzonICkgKT0+IChvdGhlcmx2XzI9ICcoJyAoIChsdl9kZWNsYXJlZFBhcmFtXzNfMD0gcnVsZUp2bUZvcm1hbFBhcmFtZXRlciApICkgb3RoZXJsdl80PSAnOicgKQorICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo2NDE2OjU6ICggKCAoICcoJyAoICggcnVsZUp2bUZvcm1hbFBhcmFtZXRlciApICkgJzonICkgKT0+IChvdGhlcmx2XzI9ICcoJyAoIChsdl9kZWNsYXJlZFBhcmFtXzNfMD0gcnVsZUp2bUZvcm1hbFBhcmFtZXRlciApICkgb3RoZXJsdl80PSAnOicgKSApCisgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjY0MTc6NjogKCAoICcoJyAoICggcnVsZUp2bUZvcm1hbFBhcmFtZXRlciApICkgJzonICkgKT0+IChvdGhlcmx2XzI9ICcoJyAoIChsdl9kZWNsYXJlZFBhcmFtXzNfMD0gcnVsZUp2bUZvcm1hbFBhcmFtZXRlciApICkgb3RoZXJsdl80PSAnOicgKQogICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjU5ODg6NjogKG90aGVybHZfMj0gJygnICggKGx2X2RlY2xhcmVkUGFyYW1fM18wPSBydWxlSnZtRm9ybWFsUGFyYW1ldGVyICkgKSBvdGhlcmx2XzQ9ICc6JyApCi0gICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjU5ODk6Nzogb3RoZXJsdl8yPSAnKCcgKCAobHZfZGVjbGFyZWRQYXJhbV8zXzA9IHJ1bGVKdm1Gb3JtYWxQYXJhbWV0ZXIgKSApIG90aGVybHZfND0gJzonCisgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjY0Mjc6NjogKG90aGVybHZfMj0gJygnICggKGx2X2RlY2xhcmVkUGFyYW1fM18wPSBydWxlSnZtRm9ybWFsUGFyYW1ldGVyICkgKSBvdGhlcmx2XzQ9ICc6JyApCisgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjY0Mjg6Nzogb3RoZXJsdl8yPSAnKCcgKCAobHZfZGVjbGFyZWRQYXJhbV8zXzA9IHJ1bGVKdm1Gb3JtYWxQYXJhbWV0ZXIgKSApIG90aGVybHZfND0gJzonCiAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgb3RoZXJsdl8yPShUb2tlbiltYXRjaChpbnB1dCw3NCxGT0xMT1dfNzcpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gY3VycmVudDsKKyAgICAgICAgICAgICAgICAgICAgb3RoZXJsdl8yPShUb2tlbiltYXRjaChpbnB1dCw4MSxGT0xMT1dfOTEpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gY3VycmVudDsKICAgICAgICAgICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAKICAgICAgICAgICAgICAgICAgICAgICAJCQkJCQkJbmV3TGVhZk5vZGUob3RoZXJsdl8yLCBncmFtbWFyQWNjZXNzLmdldFhTd2l0Y2hFeHByZXNzaW9uQWNjZXNzKCkuZ2V0TGVmdFBhcmVudGhlc2lzS2V5d29yZF8yXzBfMF8wXzAoKSk7CiAgICAgICAgICAgICAgICAgICAgICAgCQkJCQkJCiAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NTk5Mzo3OiAoIChsdl9kZWNsYXJlZFBhcmFtXzNfMD0gcnVsZUp2bUZvcm1hbFBhcmFtZXRlciApICkKLSAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NTk5NDo4OiAobHZfZGVjbGFyZWRQYXJhbV8zXzA9IHJ1bGVKdm1Gb3JtYWxQYXJhbWV0ZXIgKQorICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo2NDMyOjc6ICggKGx2X2RlY2xhcmVkUGFyYW1fM18wPSBydWxlSnZtRm9ybWFsUGFyYW1ldGVyICkgKQorICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo2NDMzOjg6IChsdl9kZWNsYXJlZFBhcmFtXzNfMD0gcnVsZUp2bUZvcm1hbFBhcmFtZXRlciApCiAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NTk5NDo4OiAobHZfZGVjbGFyZWRQYXJhbV8zXzA9IHJ1bGVKdm1Gb3JtYWxQYXJhbWV0ZXIgKQotICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo1OTk1Ojk6IGx2X2RlY2xhcmVkUGFyYW1fM18wPSBydWxlSnZtRm9ybWFsUGFyYW1ldGVyCisgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjY0MzM6ODogKGx2X2RlY2xhcmVkUGFyYW1fM18wPSBydWxlSnZtRm9ybWFsUGFyYW1ldGVyICkKKyAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NjQzNDo5OiBsdl9kZWNsYXJlZFBhcmFtXzNfMD0gcnVsZUp2bUZvcm1hbFBhcmFtZXRlcgogICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogCiAgICAgICAgICAgICAgICAgICAgICAgCQkJCQkJCQkJbmV3Q29tcG9zaXRlTm9kZShncmFtbWFyQWNjZXNzLmdldFhTd2l0Y2hFeHByZXNzaW9uQWNjZXNzKCkuZ2V0RGVjbGFyZWRQYXJhbUp2bUZvcm1hbFBhcmFtZXRlclBhcnNlclJ1bGVDYWxsXzJfMF8wXzBfMV8wKCkpOwogICAgICAgICAgICAgICAgICAgICAgIAkJCQkJCQkJCiAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMTA1KTsKKyAgICAgICAgICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMTE5KTsKICAgICAgICAgICAgICAgICAgICAgbHZfZGVjbGFyZWRQYXJhbV8zXzA9cnVsZUp2bUZvcm1hbFBhcmFtZXRlcigpOwogCiAgICAgICAgICAgICAgICAgICAgIHN0YXRlLl9mc3AtLTsKQEAgLTE2NDk3LDcgKzE3NjkxLDcgQEAKIAogICAgICAgICAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgICAgICAgICAgb3RoZXJsdl80PShUb2tlbiltYXRjaChpbnB1dCwxMTYsRk9MTE9XXzY0KTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7CisgICAgICAgICAgICAgICAgICAgIG90aGVybHZfND0oVG9rZW4pbWF0Y2goaW5wdXQsMTIzLEZPTExPV183OCk7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OwogICAgICAgICAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKIAogICAgICAgICAgICAgICAgICAgICAgIAkJCQkJCQluZXdMZWFmTm9kZShvdGhlcmx2XzQsIGdyYW1tYXJBY2Nlc3MuZ2V0WFN3aXRjaEV4cHJlc3Npb25BY2Nlc3MoKS5nZXRDb2xvbktleXdvcmRfMl8wXzBfMF8yKCkpOwpAQCAtMTY1MDksMTggKzE3NzAzLDE4IEBACiAKICAgICAgICAgICAgICAgICAgICAgfQogCi0gICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjYwMTg6NTogKCAobHZfc3dpdGNoXzVfMD0gcnVsZVhFeHByZXNzaW9uICkgKQotICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo2MDE5OjY6IChsdl9zd2l0Y2hfNV8wPSBydWxlWEV4cHJlc3Npb24gKQorICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo2NDU3OjU6ICggKGx2X3N3aXRjaF81XzA9IHJ1bGVYRXhwcmVzc2lvbiApICkKKyAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NjQ1ODo2OiAobHZfc3dpdGNoXzVfMD0gcnVsZVhFeHByZXNzaW9uICkKICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo2MDE5OjY6IChsdl9zd2l0Y2hfNV8wPSBydWxlWEV4cHJlc3Npb24gKQotICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo2MDIwOjc6IGx2X3N3aXRjaF81XzA9IHJ1bGVYRXhwcmVzc2lvbgorICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo2NDU4OjY6IChsdl9zd2l0Y2hfNV8wPSBydWxlWEV4cHJlc3Npb24gKQorICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo2NDU5Ojc6IGx2X3N3aXRjaF81XzA9IHJ1bGVYRXhwcmVzc2lvbgogICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogCiAgICAgICAgICAgICAgICAgICAgICAgCQkJCQkJCW5ld0NvbXBvc2l0ZU5vZGUoZ3JhbW1hckFjY2Vzcy5nZXRYU3dpdGNoRXhwcmVzc2lvbkFjY2VzcygpLmdldFN3aXRjaFhFeHByZXNzaW9uUGFyc2VyUnVsZUNhbGxfMl8wXzFfMCgpKTsKICAgICAgICAgICAgICAgICAgICAgICAJCQkJCQkKICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV182Mik7CisgICAgICAgICAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzc2KTsKICAgICAgICAgICAgICAgICAgICAgbHZfc3dpdGNoXzVfMD1ydWxlWEV4cHJlc3Npb24oKTsKIAogICAgICAgICAgICAgICAgICAgICBzdGF0ZS5fZnNwLS07CkBAIC0xNjU0NCw3ICsxNzczOCw3IEBACiAKICAgICAgICAgICAgICAgICAgICAgfQogCi0gICAgICAgICAgICAgICAgICAgIG90aGVybHZfNj0oVG9rZW4pbWF0Y2goaW5wdXQsNzYsRk9MTE9XXzE3KTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7CisgICAgICAgICAgICAgICAgICAgIG90aGVybHZfNj0oVG9rZW4pbWF0Y2goaW5wdXQsODMsRk9MTE9XXzE4KTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7CiAgICAgICAgICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogCiAgICAgICAgICAgICAgICAgICAgICAgCQkJCQluZXdMZWFmTm9kZShvdGhlcmx2XzYsIGdyYW1tYXJBY2Nlc3MuZ2V0WFN3aXRjaEV4cHJlc3Npb25BY2Nlc3MoKS5nZXRSaWdodFBhcmVudGhlc2lzS2V5d29yZF8yXzBfMigpKTsKQEAgLTE2NTU3LDMzICsxNzc1MSwzMyBAQAogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgIGNhc2UgMiA6Ci0gICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjYwNDM6NDogKCAoICggKCAoICggcnVsZUp2bUZvcm1hbFBhcmFtZXRlciApICkgJzonICkgKT0+ICggKCAobHZfZGVjbGFyZWRQYXJhbV83XzA9IHJ1bGVKdm1Gb3JtYWxQYXJhbWV0ZXIgKSApIG90aGVybHZfOD0gJzonICkgKT8gKCAobHZfc3dpdGNoXzlfMD0gcnVsZVhFeHByZXNzaW9uICkgKSApCisgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjY0ODI6NDogKCAoICggKCAoICggcnVsZUp2bUZvcm1hbFBhcmFtZXRlciApICkgJzonICkgKT0+ICggKCAobHZfZGVjbGFyZWRQYXJhbV83XzA9IHJ1bGVKdm1Gb3JtYWxQYXJhbWV0ZXIgKSApIG90aGVybHZfOD0gJzonICkgKT8gKCAobHZfc3dpdGNoXzlfMD0gcnVsZVhFeHByZXNzaW9uICkgKSApCiAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NjA0Mzo0OiAoICggKCAoICggKCBydWxlSnZtRm9ybWFsUGFyYW1ldGVyICkgKSAnOicgKSApPT4gKCAoIChsdl9kZWNsYXJlZFBhcmFtXzdfMD0gcnVsZUp2bUZvcm1hbFBhcmFtZXRlciApICkgb3RoZXJsdl84PSAnOicgKSApPyAoIChsdl9zd2l0Y2hfOV8wPSBydWxlWEV4cHJlc3Npb24gKSApICkKLSAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NjA0NDo1OiAoICggKCAoICggcnVsZUp2bUZvcm1hbFBhcmFtZXRlciApICkgJzonICkgKT0+ICggKCAobHZfZGVjbGFyZWRQYXJhbV83XzA9IHJ1bGVKdm1Gb3JtYWxQYXJhbWV0ZXIgKSApIG90aGVybHZfOD0gJzonICkgKT8gKCAobHZfc3dpdGNoXzlfMD0gcnVsZVhFeHByZXNzaW9uICkgKQorICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo2NDgyOjQ6ICggKCAoICggKCAoIHJ1bGVKdm1Gb3JtYWxQYXJhbWV0ZXIgKSApICc6JyApICk9PiAoICggKGx2X2RlY2xhcmVkUGFyYW1fN18wPSBydWxlSnZtRm9ybWFsUGFyYW1ldGVyICkgKSBvdGhlcmx2Xzg9ICc6JyApICk/ICggKGx2X3N3aXRjaF85XzA9IHJ1bGVYRXhwcmVzc2lvbiApICkgKQorICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo2NDgzOjU6ICggKCAoICggKCBydWxlSnZtRm9ybWFsUGFyYW1ldGVyICkgKSAnOicgKSApPT4gKCAoIChsdl9kZWNsYXJlZFBhcmFtXzdfMD0gcnVsZUp2bUZvcm1hbFBhcmFtZXRlciApICkgb3RoZXJsdl84PSAnOicgKSApPyAoIChsdl9zd2l0Y2hfOV8wPSBydWxlWEV4cHJlc3Npb24gKSApCiAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NjA0NDo1OiAoICggKCAoICggcnVsZUp2bUZvcm1hbFBhcmFtZXRlciApICkgJzonICkgKT0+ICggKCAobHZfZGVjbGFyZWRQYXJhbV83XzA9IHJ1bGVKdm1Gb3JtYWxQYXJhbWV0ZXIgKSApIG90aGVybHZfOD0gJzonICkgKT8KLSAgICAgICAgICAgICAgICAgICAgaW50IGFsdDEwMj0yOwotICAgICAgICAgICAgICAgICAgICBhbHQxMDIgPSBkZmExMDIucHJlZGljdChpbnB1dCk7Ci0gICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoYWx0MTAyKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjY0ODM6NTogKCAoICggKCAoIHJ1bGVKdm1Gb3JtYWxQYXJhbWV0ZXIgKSApICc6JyApICk9PiAoICggKGx2X2RlY2xhcmVkUGFyYW1fN18wPSBydWxlSnZtRm9ybWFsUGFyYW1ldGVyICkgKSBvdGhlcmx2Xzg9ICc6JyApICk/CisgICAgICAgICAgICAgICAgICAgIGludCBhbHQxMTM9MjsKKyAgICAgICAgICAgICAgICAgICAgYWx0MTEzID0gZGZhMTEzLnByZWRpY3QoaW5wdXQpOworICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKGFsdDExMykgewogICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxIDoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo2MDQ1OjY6ICggKCAoICggcnVsZUp2bUZvcm1hbFBhcmFtZXRlciApICkgJzonICkgKT0+ICggKCAobHZfZGVjbGFyZWRQYXJhbV83XzA9IHJ1bGVKdm1Gb3JtYWxQYXJhbWV0ZXIgKSApIG90aGVybHZfOD0gJzonICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo2NDg0OjY6ICggKCAoICggcnVsZUp2bUZvcm1hbFBhcmFtZXRlciApICkgJzonICkgKT0+ICggKCAobHZfZGVjbGFyZWRQYXJhbV83XzA9IHJ1bGVKdm1Gb3JtYWxQYXJhbWV0ZXIgKSApIG90aGVybHZfOD0gJzonICkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NjA1NDo2OiAoICggKGx2X2RlY2xhcmVkUGFyYW1fN18wPSBydWxlSnZtRm9ybWFsUGFyYW1ldGVyICkgKSBvdGhlcmx2Xzg9ICc6JyApCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NjA1NTo3OiAoIChsdl9kZWNsYXJlZFBhcmFtXzdfMD0gcnVsZUp2bUZvcm1hbFBhcmFtZXRlciApICkgb3RoZXJsdl84PSAnOicKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo2NDkzOjY6ICggKCAobHZfZGVjbGFyZWRQYXJhbV83XzA9IHJ1bGVKdm1Gb3JtYWxQYXJhbWV0ZXIgKSApIG90aGVybHZfOD0gJzonICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo2NDk0Ojc6ICggKGx2X2RlY2xhcmVkUGFyYW1fN18wPSBydWxlSnZtRm9ybWFsUGFyYW1ldGVyICkgKSBvdGhlcmx2Xzg9ICc6JwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo2MDU1Ojc6ICggKGx2X2RlY2xhcmVkUGFyYW1fN18wPSBydWxlSnZtRm9ybWFsUGFyYW1ldGVyICkgKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjYwNTY6ODogKGx2X2RlY2xhcmVkUGFyYW1fN18wPSBydWxlSnZtRm9ybWFsUGFyYW1ldGVyICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo2NDk0Ojc6ICggKGx2X2RlY2xhcmVkUGFyYW1fN18wPSBydWxlSnZtRm9ybWFsUGFyYW1ldGVyICkgKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjY0OTU6ODogKGx2X2RlY2xhcmVkUGFyYW1fN18wPSBydWxlSnZtRm9ybWFsUGFyYW1ldGVyICkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NjA1Njo4OiAobHZfZGVjbGFyZWRQYXJhbV83XzA9IHJ1bGVKdm1Gb3JtYWxQYXJhbWV0ZXIgKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjYwNTc6OTogbHZfZGVjbGFyZWRQYXJhbV83XzA9IHJ1bGVKdm1Gb3JtYWxQYXJhbWV0ZXIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo2NDk1Ojg6IChsdl9kZWNsYXJlZFBhcmFtXzdfMD0gcnVsZUp2bUZvcm1hbFBhcmFtZXRlciApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NjQ5Njo5OiBsdl9kZWNsYXJlZFBhcmFtXzdfMD0gcnVsZUp2bUZvcm1hbFBhcmFtZXRlcgogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCQkJCQkJCQkJbmV3Q29tcG9zaXRlTm9kZShncmFtbWFyQWNjZXNzLmdldFhTd2l0Y2hFeHByZXNzaW9uQWNjZXNzKCkuZ2V0RGVjbGFyZWRQYXJhbUp2bUZvcm1hbFBhcmFtZXRlclBhcnNlclJ1bGVDYWxsXzJfMV8wXzBfMF8wKCkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCQkJCQkJCQkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMTA1KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV18xMTkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGx2X2RlY2xhcmVkUGFyYW1fN18wPXJ1bGVKdm1Gb3JtYWxQYXJhbWV0ZXIoKTsKIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlLl9mc3AtLTsKQEAgLTE2NjA3LDcgKzE3ODAxLDcgQEAKIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG90aGVybHZfOD0oVG9rZW4pbWF0Y2goaW5wdXQsMTE2LEZPTExPV182NCk7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG90aGVybHZfOD0oVG9rZW4pbWF0Y2goaW5wdXQsMTIzLEZPTExPV183OCk7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAJCQkJCQkJbmV3TGVhZk5vZGUob3RoZXJsdl84LCBncmFtbWFyQWNjZXNzLmdldFhTd2l0Y2hFeHByZXNzaW9uQWNjZXNzKCkuZ2V0Q29sb25LZXl3b3JkXzJfMV8wXzBfMSgpKTsKQEAgLTE2NjIyLDE4ICsxNzgxNiwxOCBAQAogCiAgICAgICAgICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo2MDgwOjU6ICggKGx2X3N3aXRjaF85XzA9IHJ1bGVYRXhwcmVzc2lvbiApICkKLSAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NjA4MTo2OiAobHZfc3dpdGNoXzlfMD0gcnVsZVhFeHByZXNzaW9uICkKKyAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NjUxOTo1OiAoIChsdl9zd2l0Y2hfOV8wPSBydWxlWEV4cHJlc3Npb24gKSApCisgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjY1MjA6NjogKGx2X3N3aXRjaF85XzA9IHJ1bGVYRXhwcmVzc2lvbiApCiAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NjA4MTo2OiAobHZfc3dpdGNoXzlfMD0gcnVsZVhFeHByZXNzaW9uICkKLSAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NjA4Mjo3OiBsdl9zd2l0Y2hfOV8wPSBydWxlWEV4cHJlc3Npb24KKyAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NjUyMDo2OiAobHZfc3dpdGNoXzlfMD0gcnVsZVhFeHByZXNzaW9uICkKKyAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NjUyMTo3OiBsdl9zd2l0Y2hfOV8wPSBydWxlWEV4cHJlc3Npb24KICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKIAogICAgICAgICAgICAgICAgICAgICAgIAkJCQkJCQluZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0WFN3aXRjaEV4cHJlc3Npb25BY2Nlc3MoKS5nZXRTd2l0Y2hYRXhwcmVzc2lvblBhcnNlclJ1bGVDYWxsXzJfMV8xXzAoKSk7CiAgICAgICAgICAgICAgICAgICAgICAgCQkJCQkJCiAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMTcpOworICAgICAgICAgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV18xOCk7CiAgICAgICAgICAgICAgICAgICAgIGx2X3N3aXRjaF85XzA9cnVsZVhFeHByZXNzaW9uKCk7CiAKICAgICAgICAgICAgICAgICAgICAgc3RhdGUuX2ZzcC0tOwpAQCAtMTY2NjYsMzYgKzE3ODYwLDM2IEBACiAKICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgb3RoZXJsdl8xMD0oVG9rZW4pbWF0Y2goaW5wdXQsMTUsRk9MTE9XXzEwNik7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OworICAgICAgICAgICAgb3RoZXJsdl8xMD0oVG9rZW4pbWF0Y2goaW5wdXQsMTUsRk9MTE9XXzEyMCk7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OwogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAKICAgICAgICAgICAgICAgCQkJbmV3TGVhZk5vZGUob3RoZXJsdl8xMCwgZ3JhbW1hckFjY2Vzcy5nZXRYU3dpdGNoRXhwcmVzc2lvbkFjY2VzcygpLmdldExlZnRDdXJseUJyYWNrZXRLZXl3b3JkXzMoKSk7CiAgICAgICAgICAgICAgIAkJCiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo2MTA1OjM6ICggKGx2X2Nhc2VzXzExXzA9IHJ1bGVYQ2FzZVBhcnQgKSApKgotICAgICAgICAgICAgbG9vcDEwNDoKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjY1NDQ6MzogKCAobHZfY2FzZXNfMTFfMD0gcnVsZVhDYXNlUGFydCApICkqCisgICAgICAgICAgICBsb29wMTE1OgogICAgICAgICAgICAgZG8gewotICAgICAgICAgICAgICAgIGludCBhbHQxMDQ9MjsKLSAgICAgICAgICAgICAgICBpbnQgTEExMDRfMCA9IGlucHV0LkxBKDEpOworICAgICAgICAgICAgICAgIGludCBhbHQxMTU9MjsKKyAgICAgICAgICAgICAgICBpbnQgTEExMTVfMCA9IGlucHV0LkxBKDEpOwogCi0gICAgICAgICAgICAgICAgaWYgKCAoTEExMDRfMD09UlVMRV9JRHx8KExBMTA0XzA+PTc0ICYmIExBMTA0XzA8PTc1KXx8TEExMDRfMD09OTl8fExBMTA0XzA9PTExNnx8TEExMDRfMD09MTE4KSApIHsKLSAgICAgICAgICAgICAgICAgICAgYWx0MTA0PTE7CisgICAgICAgICAgICAgICAgaWYgKCAoTEExMTVfMD09UlVMRV9JRHx8KExBMTE1XzA+PTgxICYmIExBMTE1XzA8PTgyKXx8TEExMTVfMD09MTA2fHxMQTExNV8wPT0xMjN8fExBMTE1XzA9PTEyNSkgKSB7CisgICAgICAgICAgICAgICAgICAgIGFsdDExNT0xOwogICAgICAgICAgICAgICAgIH0KIAogCi0gICAgICAgICAgICAgICAgc3dpdGNoIChhbHQxMDQpIHsKKyAgICAgICAgICAgICAgICBzd2l0Y2ggKGFsdDExNSkgewogICAgICAgICAgICAgCWNhc2UgMSA6Ci0gICAgICAgICAgICAJICAgIC8vIEludGVybmFsRGF0YURTTC5nOjYxMDY6NDogKGx2X2Nhc2VzXzExXzA9IHJ1bGVYQ2FzZVBhcnQgKQorICAgICAgICAgICAgCSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo2NTQ1OjQ6IChsdl9jYXNlc18xMV8wPSBydWxlWENhc2VQYXJ0ICkKICAgICAgICAgICAgIAkgICAgewotICAgICAgICAgICAgCSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo2MTA2OjQ6IChsdl9jYXNlc18xMV8wPSBydWxlWENhc2VQYXJ0ICkKLSAgICAgICAgICAgIAkgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NjEwNzo1OiBsdl9jYXNlc18xMV8wPSBydWxlWENhc2VQYXJ0CisgICAgICAgICAgICAJICAgIC8vIEludGVybmFsRGF0YURTTC5nOjY1NDU6NDogKGx2X2Nhc2VzXzExXzA9IHJ1bGVYQ2FzZVBhcnQgKQorICAgICAgICAgICAgCSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo2NTQ2OjU6IGx2X2Nhc2VzXzExXzA9IHJ1bGVYQ2FzZVBhcnQKICAgICAgICAgICAgIAkgICAgewogICAgICAgICAgICAgCSAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKIAogICAgICAgICAgICAgCSAgICAgIAkJCQkJbmV3Q29tcG9zaXRlTm9kZShncmFtbWFyQWNjZXNzLmdldFhTd2l0Y2hFeHByZXNzaW9uQWNjZXNzKCkuZ2V0Q2FzZXNYQ2FzZVBhcnRQYXJzZXJSdWxlQ2FsbF80XzAoKSk7CiAgICAgICAgICAgICAJICAgICAgCQkJCQogICAgICAgICAgICAgCSAgICB9Ci0gICAgICAgICAgICAJICAgIHB1c2hGb2xsb3coRk9MTE9XXzEwNik7CisgICAgICAgICAgICAJICAgIHB1c2hGb2xsb3coRk9MTE9XXzEyMCk7CiAgICAgICAgICAgICAJICAgIGx2X2Nhc2VzXzExXzA9cnVsZVhDYXNlUGFydCgpOwogCiAgICAgICAgICAgICAJICAgIHN0YXRlLl9mc3AtLTsKQEAgLTE2NzIxLDQ1ICsxNzkxNSw0NSBAQAogICAgICAgICAgICAgCSAgICBicmVhazsKIAogICAgICAgICAgICAgCWRlZmF1bHQgOgotICAgICAgICAgICAgCSAgICBicmVhayBsb29wMTA0OworICAgICAgICAgICAgCSAgICBicmVhayBsb29wMTE1OwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0gd2hpbGUgKHRydWUpOwogCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo2MTI0OjM6IChvdGhlcmx2XzEyPSAnZGVmYXVsdCcgb3RoZXJsdl8xMz0gJzonICggKGx2X2RlZmF1bHRfMTRfMD0gcnVsZVhFeHByZXNzaW9uICkgKSApPwotICAgICAgICAgICAgaW50IGFsdDEwNT0yOwotICAgICAgICAgICAgaW50IExBMTA1XzAgPSBpbnB1dC5MQSgxKTsKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjY1NjM6MzogKG90aGVybHZfMTI9ICdkZWZhdWx0JyBvdGhlcmx2XzEzPSAnOicgKCAobHZfZGVmYXVsdF8xNF8wPSBydWxlWEV4cHJlc3Npb24gKSApICk/CisgICAgICAgICAgICBpbnQgYWx0MTE2PTI7CisgICAgICAgICAgICBpbnQgTEExMTZfMCA9IGlucHV0LkxBKDEpOwogCi0gICAgICAgICAgICBpZiAoIChMQTEwNV8wPT0xMTcpICkgewotICAgICAgICAgICAgICAgIGFsdDEwNT0xOworICAgICAgICAgICAgaWYgKCAoTEExMTZfMD09MTI0KSApIHsKKyAgICAgICAgICAgICAgICBhbHQxMTY9MTsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHN3aXRjaCAoYWx0MTA1KSB7CisgICAgICAgICAgICBzd2l0Y2ggKGFsdDExNikgewogICAgICAgICAgICAgICAgIGNhc2UgMSA6Ci0gICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjYxMjU6NDogb3RoZXJsdl8xMj0gJ2RlZmF1bHQnIG90aGVybHZfMTM9ICc6JyAoIChsdl9kZWZhdWx0XzE0XzA9IHJ1bGVYRXhwcmVzc2lvbiApICkKKyAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NjU2NDo0OiBvdGhlcmx2XzEyPSAnZGVmYXVsdCcgb3RoZXJsdl8xMz0gJzonICggKGx2X2RlZmF1bHRfMTRfMD0gcnVsZVhFeHByZXNzaW9uICkgKQogICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIG90aGVybHZfMTI9KFRva2VuKW1hdGNoKGlucHV0LDExNyxGT0xMT1dfMTA1KTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7CisgICAgICAgICAgICAgICAgICAgIG90aGVybHZfMTI9KFRva2VuKW1hdGNoKGlucHV0LDEyNCxGT0xMT1dfMTE5KTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7CiAgICAgICAgICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogCiAgICAgICAgICAgICAgICAgICAgICAgCQkJCW5ld0xlYWZOb2RlKG90aGVybHZfMTIsIGdyYW1tYXJBY2Nlc3MuZ2V0WFN3aXRjaEV4cHJlc3Npb25BY2Nlc3MoKS5nZXREZWZhdWx0S2V5d29yZF81XzAoKSk7CiAgICAgICAgICAgICAgICAgICAgICAgCQkJCiAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgb3RoZXJsdl8xMz0oVG9rZW4pbWF0Y2goaW5wdXQsMTE2LEZPTExPV182NCk7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OworICAgICAgICAgICAgICAgICAgICBvdGhlcmx2XzEzPShUb2tlbiltYXRjaChpbnB1dCwxMjMsRk9MTE9XXzc4KTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7CiAgICAgICAgICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogCiAgICAgICAgICAgICAgICAgICAgICAgCQkJCW5ld0xlYWZOb2RlKG90aGVybHZfMTMsIGdyYW1tYXJBY2Nlc3MuZ2V0WFN3aXRjaEV4cHJlc3Npb25BY2Nlc3MoKS5nZXRDb2xvbktleXdvcmRfNV8xKCkpOwogICAgICAgICAgICAgICAgICAgICAgIAkJCQogICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjYxMzM6NDogKCAobHZfZGVmYXVsdF8xNF8wPSBydWxlWEV4cHJlc3Npb24gKSApCi0gICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjYxMzQ6NTogKGx2X2RlZmF1bHRfMTRfMD0gcnVsZVhFeHByZXNzaW9uICkKKyAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NjU3Mjo0OiAoIChsdl9kZWZhdWx0XzE0XzA9IHJ1bGVYRXhwcmVzc2lvbiApICkKKyAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NjU3Mzo1OiAobHZfZGVmYXVsdF8xNF8wPSBydWxlWEV4cHJlc3Npb24gKQogICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjYxMzQ6NTogKGx2X2RlZmF1bHRfMTRfMD0gcnVsZVhFeHByZXNzaW9uICkKLSAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NjEzNTo2OiBsdl9kZWZhdWx0XzE0XzA9IHJ1bGVYRXhwcmVzc2lvbgorICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo2NTczOjU6IChsdl9kZWZhdWx0XzE0XzA9IHJ1bGVYRXhwcmVzc2lvbiApCisgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjY1NzQ6NjogbHZfZGVmYXVsdF8xNF8wPSBydWxlWEV4cHJlc3Npb24KICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKIAogICAgICAgICAgICAgICAgICAgICAgIAkJCQkJCW5ld0NvbXBvc2l0ZU5vZGUoZ3JhbW1hckFjY2Vzcy5nZXRYU3dpdGNoRXhwcmVzc2lvbkFjY2VzcygpLmdldERlZmF1bHRYRXhwcmVzc2lvblBhcnNlclJ1bGVDYWxsXzVfMl8wKCkpOwogICAgICAgICAgICAgICAgICAgICAgIAkJCQkJCiAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMTA3KTsKKyAgICAgICAgICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfNDEpOwogICAgICAgICAgICAgICAgICAgICBsdl9kZWZhdWx0XzE0XzA9cnVsZVhFeHByZXNzaW9uKCk7CiAKICAgICAgICAgICAgICAgICAgICAgc3RhdGUuX2ZzcC0tOwpAQCAtMTY4MjAsNyArMTgwMTQsNyBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgImVudHJ5UnVsZVhDYXNlUGFydCIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo2MTYxOjE6IGVudHJ5UnVsZVhDYXNlUGFydCByZXR1cm5zIFtFT2JqZWN0IGN1cnJlbnQ9bnVsbF0gOiBpdl9ydWxlWENhc2VQYXJ0PSBydWxlWENhc2VQYXJ0IEVPRiA7CisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NjYwMDoxOiBlbnRyeVJ1bGVYQ2FzZVBhcnQgcmV0dXJucyBbRU9iamVjdCBjdXJyZW50PW51bGxdIDogaXZfcnVsZVhDYXNlUGFydD0gcnVsZVhDYXNlUGFydCBFT0YgOwogICAgIHB1YmxpYyBmaW5hbCBFT2JqZWN0IGVudHJ5UnVsZVhDYXNlUGFydCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAgICAgICAgIEVPYmplY3QgY3VycmVudCA9IG51bGw7CiAKQEAgLTE2ODI4LDggKzE4MDIyLDggQEAKIAogCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo2MTYxOjUwOiAoaXZfcnVsZVhDYXNlUGFydD0gcnVsZVhDYXNlUGFydCBFT0YgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NjE2MjoyOiBpdl9ydWxlWENhc2VQYXJ0PSBydWxlWENhc2VQYXJ0IEVPRgorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NjYwMDo1MDogKGl2X3J1bGVYQ2FzZVBhcnQ9IHJ1bGVYQ2FzZVBhcnQgRU9GICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjY2MDE6MjogaXZfcnVsZVhDYXNlUGFydD0gcnVsZVhDYXNlUGFydCBFT0YKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgbmV3Q29tcG9zaXRlTm9kZShncmFtbWFyQWNjZXNzLmdldFhDYXNlUGFydFJ1bGUoKSk7IApAQCAtMTY4NjAsNyArMTgwNTQsNyBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVYQ2FzZVBhcnQiCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NjE2ODoxOiBydWxlWENhc2VQYXJ0IHJldHVybnMgW0VPYmplY3QgY3VycmVudD1udWxsXSA6ICggKCkgKCAobHZfdHlwZUd1YXJkXzFfMD0gcnVsZUp2bVR5cGVSZWZlcmVuY2UgKSApPyAob3RoZXJsdl8yPSAnY2FzZScgKCAobHZfY2FzZV8zXzA9IHJ1bGVYRXhwcmVzc2lvbiApICkgKT8gKCAob3RoZXJsdl80PSAnOicgKCAobHZfdGhlbl81XzA9IHJ1bGVYRXhwcmVzc2lvbiApICkgKSB8ICggKGx2X2ZhbGxUaHJvdWdoXzZfMD0gJywnICkgKSApICkgOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjY2MDc6MTogcnVsZVhDYXNlUGFydCByZXR1cm5zIFtFT2JqZWN0IGN1cnJlbnQ9bnVsbF0gOiAoICgpICggKGx2X3R5cGVHdWFyZF8xXzA9IHJ1bGVKdm1UeXBlUmVmZXJlbmNlICkgKT8gKG90aGVybHZfMj0gJ2Nhc2UnICggKGx2X2Nhc2VfM18wPSBydWxlWEV4cHJlc3Npb24gKSApICk/ICggKG90aGVybHZfND0gJzonICggKGx2X3RoZW5fNV8wPSBydWxlWEV4cHJlc3Npb24gKSApICkgfCAoIChsdl9mYWxsVGhyb3VnaF82XzA9ICcsJyApICkgKSApIDsKICAgICBwdWJsaWMgZmluYWwgRU9iamVjdCBydWxlWENhc2VQYXJ0KCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKICAgICAgICAgRU9iamVjdCBjdXJyZW50ID0gbnVsbDsKIApAQCAtMTY4NzgsMTQgKzE4MDcyLDE0IEBACiAgICAgICAgIAllbnRlclJ1bGUoKTsKIAogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NjE3NDoyOiAoICggKCkgKCAobHZfdHlwZUd1YXJkXzFfMD0gcnVsZUp2bVR5cGVSZWZlcmVuY2UgKSApPyAob3RoZXJsdl8yPSAnY2FzZScgKCAobHZfY2FzZV8zXzA9IHJ1bGVYRXhwcmVzc2lvbiApICkgKT8gKCAob3RoZXJsdl80PSAnOicgKCAobHZfdGhlbl81XzA9IHJ1bGVYRXhwcmVzc2lvbiApICkgKSB8ICggKGx2X2ZhbGxUaHJvdWdoXzZfMD0gJywnICkgKSApICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NjE3NToyOiAoICgpICggKGx2X3R5cGVHdWFyZF8xXzA9IHJ1bGVKdm1UeXBlUmVmZXJlbmNlICkgKT8gKG90aGVybHZfMj0gJ2Nhc2UnICggKGx2X2Nhc2VfM18wPSBydWxlWEV4cHJlc3Npb24gKSApICk/ICggKG90aGVybHZfND0gJzonICggKGx2X3RoZW5fNV8wPSBydWxlWEV4cHJlc3Npb24gKSApICkgfCAoIChsdl9mYWxsVGhyb3VnaF82XzA9ICcsJyApICkgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo2NjEzOjI6ICggKCAoKSAoIChsdl90eXBlR3VhcmRfMV8wPSBydWxlSnZtVHlwZVJlZmVyZW5jZSApICk/IChvdGhlcmx2XzI9ICdjYXNlJyAoIChsdl9jYXNlXzNfMD0gcnVsZVhFeHByZXNzaW9uICkgKSApPyAoIChvdGhlcmx2XzQ9ICc6JyAoIChsdl90aGVuXzVfMD0gcnVsZVhFeHByZXNzaW9uICkgKSApIHwgKCAobHZfZmFsbFRocm91Z2hfNl8wPSAnLCcgKSApICkgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo2NjE0OjI6ICggKCkgKCAobHZfdHlwZUd1YXJkXzFfMD0gcnVsZUp2bVR5cGVSZWZlcmVuY2UgKSApPyAob3RoZXJsdl8yPSAnY2FzZScgKCAobHZfY2FzZV8zXzA9IHJ1bGVYRXhwcmVzc2lvbiApICkgKT8gKCAob3RoZXJsdl80PSAnOicgKCAobHZfdGhlbl81XzA9IHJ1bGVYRXhwcmVzc2lvbiApICkgKSB8ICggKGx2X2ZhbGxUaHJvdWdoXzZfMD0gJywnICkgKSApICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjYxNzU6MjogKCAoKSAoIChsdl90eXBlR3VhcmRfMV8wPSBydWxlSnZtVHlwZVJlZmVyZW5jZSApICk/IChvdGhlcmx2XzI9ICdjYXNlJyAoIChsdl9jYXNlXzNfMD0gcnVsZVhFeHByZXNzaW9uICkgKSApPyAoIChvdGhlcmx2XzQ9ICc6JyAoIChsdl90aGVuXzVfMD0gcnVsZVhFeHByZXNzaW9uICkgKSApIHwgKCAobHZfZmFsbFRocm91Z2hfNl8wPSAnLCcgKSApICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NjE3NjozOiAoKSAoIChsdl90eXBlR3VhcmRfMV8wPSBydWxlSnZtVHlwZVJlZmVyZW5jZSApICk/IChvdGhlcmx2XzI9ICdjYXNlJyAoIChsdl9jYXNlXzNfMD0gcnVsZVhFeHByZXNzaW9uICkgKSApPyAoIChvdGhlcmx2XzQ9ICc6JyAoIChsdl90aGVuXzVfMD0gcnVsZVhFeHByZXNzaW9uICkgKSApIHwgKCAobHZfZmFsbFRocm91Z2hfNl8wPSAnLCcgKSApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjY2MTQ6MjogKCAoKSAoIChsdl90eXBlR3VhcmRfMV8wPSBydWxlSnZtVHlwZVJlZmVyZW5jZSApICk/IChvdGhlcmx2XzI9ICdjYXNlJyAoIChsdl9jYXNlXzNfMD0gcnVsZVhFeHByZXNzaW9uICkgKSApPyAoIChvdGhlcmx2XzQ9ICc6JyAoIChsdl90aGVuXzVfMD0gcnVsZVhFeHByZXNzaW9uICkgKSApIHwgKCAobHZfZmFsbFRocm91Z2hfNl8wPSAnLCcgKSApICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NjYxNTozOiAoKSAoIChsdl90eXBlR3VhcmRfMV8wPSBydWxlSnZtVHlwZVJlZmVyZW5jZSApICk/IChvdGhlcmx2XzI9ICdjYXNlJyAoIChsdl9jYXNlXzNfMD0gcnVsZVhFeHByZXNzaW9uICkgKSApPyAoIChvdGhlcmx2XzQ9ICc6JyAoIChsdl90aGVuXzVfMD0gcnVsZVhFeHByZXNzaW9uICkgKSApIHwgKCAobHZfZmFsbFRocm91Z2hfNl8wPSAnLCcgKSApICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjYxNzY6MzogKCkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjYxNzc6NDogCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo2NjE1OjM6ICgpCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo2NjE2OjQ6IAogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAKQEAgLTE2ODk3LDI2ICsxODA5MSwyNiBAQAogCiAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjYxODM6MzogKCAobHZfdHlwZUd1YXJkXzFfMD0gcnVsZUp2bVR5cGVSZWZlcmVuY2UgKSApPwotICAgICAgICAgICAgaW50IGFsdDEwNj0yOwotICAgICAgICAgICAgaW50IExBMTA2XzAgPSBpbnB1dC5MQSgxKTsKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjY2MjI6MzogKCAobHZfdHlwZUd1YXJkXzFfMD0gcnVsZUp2bVR5cGVSZWZlcmVuY2UgKSApPworICAgICAgICAgICAgaW50IGFsdDExNz0yOworICAgICAgICAgICAgaW50IExBMTE3XzAgPSBpbnB1dC5MQSgxKTsKIAotICAgICAgICAgICAgaWYgKCAoTEExMDZfMD09UlVMRV9JRHx8TEExMDZfMD09NzR8fExBMTA2XzA9PTk5KSApIHsKLSAgICAgICAgICAgICAgICBhbHQxMDY9MTsKKyAgICAgICAgICAgIGlmICggKExBMTE3XzA9PVJVTEVfSUR8fExBMTE3XzA9PTgxfHxMQTExN18wPT0xMDYpICkgeworICAgICAgICAgICAgICAgIGFsdDExNz0xOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgc3dpdGNoIChhbHQxMDYpIHsKKyAgICAgICAgICAgIHN3aXRjaCAoYWx0MTE3KSB7CiAgICAgICAgICAgICAgICAgY2FzZSAxIDoKLSAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NjE4NDo0OiAobHZfdHlwZUd1YXJkXzFfMD0gcnVsZUp2bVR5cGVSZWZlcmVuY2UgKQorICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo2NjIzOjQ6IChsdl90eXBlR3VhcmRfMV8wPSBydWxlSnZtVHlwZVJlZmVyZW5jZSApCiAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NjE4NDo0OiAobHZfdHlwZUd1YXJkXzFfMD0gcnVsZUp2bVR5cGVSZWZlcmVuY2UgKQotICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo2MTg1OjU6IGx2X3R5cGVHdWFyZF8xXzA9IHJ1bGVKdm1UeXBlUmVmZXJlbmNlCisgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjY2MjM6NDogKGx2X3R5cGVHdWFyZF8xXzA9IHJ1bGVKdm1UeXBlUmVmZXJlbmNlICkKKyAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NjYyNDo1OiBsdl90eXBlR3VhcmRfMV8wPSBydWxlSnZtVHlwZVJlZmVyZW5jZQogICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogCiAgICAgICAgICAgICAgICAgICAgICAgCQkJCQluZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0WENhc2VQYXJ0QWNjZXNzKCkuZ2V0VHlwZUd1YXJkSnZtVHlwZVJlZmVyZW5jZVBhcnNlclJ1bGVDYWxsXzFfMCgpKTsKICAgICAgICAgICAgICAgICAgICAgICAJCQkJCiAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMTA4KTsKKyAgICAgICAgICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMTIxKTsKICAgICAgICAgICAgICAgICAgICAgbHZfdHlwZUd1YXJkXzFfMD1ydWxlSnZtVHlwZVJlZmVyZW5jZSgpOwogCiAgICAgICAgICAgICAgICAgICAgIHN0YXRlLl9mc3AtLTsKQEAgLTE2OTQzLDM1ICsxODEzNywzNSBAQAogCiAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjYyMDI6MzogKG90aGVybHZfMj0gJ2Nhc2UnICggKGx2X2Nhc2VfM18wPSBydWxlWEV4cHJlc3Npb24gKSApICk/Ci0gICAgICAgICAgICBpbnQgYWx0MTA3PTI7Ci0gICAgICAgICAgICBpbnQgTEExMDdfMCA9IGlucHV0LkxBKDEpOworICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NjY0MTozOiAob3RoZXJsdl8yPSAnY2FzZScgKCAobHZfY2FzZV8zXzA9IHJ1bGVYRXhwcmVzc2lvbiApICkgKT8KKyAgICAgICAgICAgIGludCBhbHQxMTg9MjsKKyAgICAgICAgICAgIGludCBMQTExOF8wID0gaW5wdXQuTEEoMSk7CiAKLSAgICAgICAgICAgIGlmICggKExBMTA3XzA9PTExOCkgKSB7Ci0gICAgICAgICAgICAgICAgYWx0MTA3PTE7CisgICAgICAgICAgICBpZiAoIChMQTExOF8wPT0xMjUpICkgeworICAgICAgICAgICAgICAgIGFsdDExOD0xOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgc3dpdGNoIChhbHQxMDcpIHsKKyAgICAgICAgICAgIHN3aXRjaCAoYWx0MTE4KSB7CiAgICAgICAgICAgICAgICAgY2FzZSAxIDoKLSAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NjIwMzo0OiBvdGhlcmx2XzI9ICdjYXNlJyAoIChsdl9jYXNlXzNfMD0gcnVsZVhFeHByZXNzaW9uICkgKQorICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo2NjQyOjQ6IG90aGVybHZfMj0gJ2Nhc2UnICggKGx2X2Nhc2VfM18wPSBydWxlWEV4cHJlc3Npb24gKSApCiAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgb3RoZXJsdl8yPShUb2tlbiltYXRjaChpbnB1dCwxMTgsRk9MTE9XXzY0KTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7CisgICAgICAgICAgICAgICAgICAgIG90aGVybHZfMj0oVG9rZW4pbWF0Y2goaW5wdXQsMTI1LEZPTExPV183OCk7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OwogICAgICAgICAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKIAogICAgICAgICAgICAgICAgICAgICAgIAkJCQluZXdMZWFmTm9kZShvdGhlcmx2XzIsIGdyYW1tYXJBY2Nlc3MuZ2V0WENhc2VQYXJ0QWNjZXNzKCkuZ2V0Q2FzZUtleXdvcmRfMl8wKCkpOwogICAgICAgICAgICAgICAgICAgICAgIAkJCQogICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjYyMDc6NDogKCAobHZfY2FzZV8zXzA9IHJ1bGVYRXhwcmVzc2lvbiApICkKLSAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NjIwODo1OiAobHZfY2FzZV8zXzA9IHJ1bGVYRXhwcmVzc2lvbiApCisgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjY2NDY6NDogKCAobHZfY2FzZV8zXzA9IHJ1bGVYRXhwcmVzc2lvbiApICkKKyAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NjY0Nzo1OiAobHZfY2FzZV8zXzA9IHJ1bGVYRXhwcmVzc2lvbiApCiAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NjIwODo1OiAobHZfY2FzZV8zXzA9IHJ1bGVYRXhwcmVzc2lvbiApCi0gICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjYyMDk6NjogbHZfY2FzZV8zXzA9IHJ1bGVYRXhwcmVzc2lvbgorICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo2NjQ3OjU6IChsdl9jYXNlXzNfMD0gcnVsZVhFeHByZXNzaW9uICkKKyAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NjY0ODo2OiBsdl9jYXNlXzNfMD0gcnVsZVhFeHByZXNzaW9uCiAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAKICAgICAgICAgICAgICAgICAgICAgICAJCQkJCQluZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0WENhc2VQYXJ0QWNjZXNzKCkuZ2V0Q2FzZVhFeHByZXNzaW9uUGFyc2VyUnVsZUNhbGxfMl8xXzAoKSk7CiAgICAgICAgICAgICAgICAgICAgICAgCQkJCQkKICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV18xMDkpOworICAgICAgICAgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV18xMjIpOwogICAgICAgICAgICAgICAgICAgICBsdl9jYXNlXzNfMD1ydWxlWEV4cHJlc3Npb24oKTsKIAogICAgICAgICAgICAgICAgICAgICBzdGF0ZS5fZnNwLS07CkBAIC0xNzAwMSw0MSArMTgxOTUsNDEgQEAKIAogICAgICAgICAgICAgfQogCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo2MjI3OjM6ICggKG90aGVybHZfND0gJzonICggKGx2X3RoZW5fNV8wPSBydWxlWEV4cHJlc3Npb24gKSApICkgfCAoIChsdl9mYWxsVGhyb3VnaF82XzA9ICcsJyApICkgKQotICAgICAgICAgICAgaW50IGFsdDEwOD0yOwotICAgICAgICAgICAgaW50IExBMTA4XzAgPSBpbnB1dC5MQSgxKTsKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjY2NjY6MzogKCAob3RoZXJsdl80PSAnOicgKCAobHZfdGhlbl81XzA9IHJ1bGVYRXhwcmVzc2lvbiApICkgKSB8ICggKGx2X2ZhbGxUaHJvdWdoXzZfMD0gJywnICkgKSApCisgICAgICAgICAgICBpbnQgYWx0MTE5PTI7CisgICAgICAgICAgICBpbnQgTEExMTlfMCA9IGlucHV0LkxBKDEpOwogCi0gICAgICAgICAgICBpZiAoIChMQTEwOF8wPT0xMTYpICkgewotICAgICAgICAgICAgICAgIGFsdDEwOD0xOworICAgICAgICAgICAgaWYgKCAoTEExMTlfMD09MTIzKSApIHsKKyAgICAgICAgICAgICAgICBhbHQxMTk9MTsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgaWYgKCAoTEExMDhfMD09NzUpICkgewotICAgICAgICAgICAgICAgIGFsdDEwOD0yOworICAgICAgICAgICAgZWxzZSBpZiAoIChMQTExOV8wPT04MikgKSB7CisgICAgICAgICAgICAgICAgYWx0MTE5PTI7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICBpZiAoc3RhdGUuYmFja3RyYWNraW5nPjApIHtzdGF0ZS5mYWlsZWQ9dHJ1ZTsgcmV0dXJuIGN1cnJlbnQ7fQogICAgICAgICAgICAgICAgIE5vVmlhYmxlQWx0RXhjZXB0aW9uIG52YWUgPQotICAgICAgICAgICAgICAgICAgICBuZXcgTm9WaWFibGVBbHRFeGNlcHRpb24oIiIsIDEwOCwgMCwgaW5wdXQpOworICAgICAgICAgICAgICAgICAgICBuZXcgTm9WaWFibGVBbHRFeGNlcHRpb24oIiIsIDExOSwgMCwgaW5wdXQpOwogCiAgICAgICAgICAgICAgICAgdGhyb3cgbnZhZTsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHN3aXRjaCAoYWx0MTA4KSB7CisgICAgICAgICAgICBzd2l0Y2ggKGFsdDExOSkgewogICAgICAgICAgICAgICAgIGNhc2UgMSA6Ci0gICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjYyMjg6NDogKG90aGVybHZfND0gJzonICggKGx2X3RoZW5fNV8wPSBydWxlWEV4cHJlc3Npb24gKSApICkKKyAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NjY2Nzo0OiAob3RoZXJsdl80PSAnOicgKCAobHZfdGhlbl81XzA9IHJ1bGVYRXhwcmVzc2lvbiApICkgKQogICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjYyMjg6NDogKG90aGVybHZfND0gJzonICggKGx2X3RoZW5fNV8wPSBydWxlWEV4cHJlc3Npb24gKSApICkKLSAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NjIyOTo1OiBvdGhlcmx2XzQ9ICc6JyAoIChsdl90aGVuXzVfMD0gcnVsZVhFeHByZXNzaW9uICkgKQorICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo2NjY3OjQ6IChvdGhlcmx2XzQ9ICc6JyAoIChsdl90aGVuXzVfMD0gcnVsZVhFeHByZXNzaW9uICkgKSApCisgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjY2Njg6NTogb3RoZXJsdl80PSAnOicgKCAobHZfdGhlbl81XzA9IHJ1bGVYRXhwcmVzc2lvbiApICkKICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBvdGhlcmx2XzQ9KFRva2VuKW1hdGNoKGlucHV0LDExNixGT0xMT1dfNjQpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gY3VycmVudDsKKyAgICAgICAgICAgICAgICAgICAgb3RoZXJsdl80PShUb2tlbiltYXRjaChpbnB1dCwxMjMsRk9MTE9XXzc4KTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7CiAgICAgICAgICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogCiAgICAgICAgICAgICAgICAgICAgICAgCQkJCQluZXdMZWFmTm9kZShvdGhlcmx2XzQsIGdyYW1tYXJBY2Nlc3MuZ2V0WENhc2VQYXJ0QWNjZXNzKCkuZ2V0Q29sb25LZXl3b3JkXzNfMF8wKCkpOwogICAgICAgICAgICAgICAgICAgICAgIAkJCQkKICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo2MjMzOjU6ICggKGx2X3RoZW5fNV8wPSBydWxlWEV4cHJlc3Npb24gKSApCi0gICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjYyMzQ6NjogKGx2X3RoZW5fNV8wPSBydWxlWEV4cHJlc3Npb24gKQorICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo2NjcyOjU6ICggKGx2X3RoZW5fNV8wPSBydWxlWEV4cHJlc3Npb24gKSApCisgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjY2NzM6NjogKGx2X3RoZW5fNV8wPSBydWxlWEV4cHJlc3Npb24gKQogICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjYyMzQ6NjogKGx2X3RoZW5fNV8wPSBydWxlWEV4cHJlc3Npb24gKQotICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo2MjM1Ojc6IGx2X3RoZW5fNV8wPSBydWxlWEV4cHJlc3Npb24KKyAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NjY3Mzo2OiAobHZfdGhlbl81XzA9IHJ1bGVYRXhwcmVzc2lvbiApCisgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjY2NzQ6NzogbHZfdGhlbl81XzA9IHJ1bGVYRXhwcmVzc2lvbgogICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogCkBAIC0xNzA3MywxNSArMTgyNjcsMTUgQEAKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICBjYXNlIDIgOgotICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo2MjU0OjQ6ICggKGx2X2ZhbGxUaHJvdWdoXzZfMD0gJywnICkgKQorICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo2NjkzOjQ6ICggKGx2X2ZhbGxUaHJvdWdoXzZfMD0gJywnICkgKQogICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjYyNTQ6NDogKCAobHZfZmFsbFRocm91Z2hfNl8wPSAnLCcgKSApCi0gICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjYyNTU6NTogKGx2X2ZhbGxUaHJvdWdoXzZfMD0gJywnICkKKyAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NjY5Mzo0OiAoIChsdl9mYWxsVGhyb3VnaF82XzA9ICcsJyApICkKKyAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NjY5NDo1OiAobHZfZmFsbFRocm91Z2hfNl8wPSAnLCcgKQogICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjYyNTU6NTogKGx2X2ZhbGxUaHJvdWdoXzZfMD0gJywnICkKLSAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NjI1Njo2OiBsdl9mYWxsVGhyb3VnaF82XzA9ICcsJworICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo2Njk0OjU6IChsdl9mYWxsVGhyb3VnaF82XzA9ICcsJyApCisgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjY2OTU6NjogbHZfZmFsbFRocm91Z2hfNl8wPSAnLCcKICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBsdl9mYWxsVGhyb3VnaF82XzA9KFRva2VuKW1hdGNoKGlucHV0LDc1LEZPTExPV18yKTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7CisgICAgICAgICAgICAgICAgICAgIGx2X2ZhbGxUaHJvdWdoXzZfMD0oVG9rZW4pbWF0Y2goaW5wdXQsODIsRk9MTE9XXzIpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gY3VycmVudDsKICAgICAgICAgICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAKICAgICAgICAgICAgICAgICAgICAgICAJCQkJCQluZXdMZWFmTm9kZShsdl9mYWxsVGhyb3VnaF82XzAsIGdyYW1tYXJBY2Nlc3MuZ2V0WENhc2VQYXJ0QWNjZXNzKCkuZ2V0RmFsbFRocm91Z2hDb21tYUtleXdvcmRfM18xXzAoKSk7CkBAIC0xNzEzMiw3ICsxODMyNiw3IEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAiZW50cnlSdWxlWEZvckxvb3BFeHByZXNzaW9uIgotICAgIC8vIEludGVybmFsRGF0YURTTC5nOjYyNzM6MTogZW50cnlSdWxlWEZvckxvb3BFeHByZXNzaW9uIHJldHVybnMgW0VPYmplY3QgY3VycmVudD1udWxsXSA6IGl2X3J1bGVYRm9yTG9vcEV4cHJlc3Npb249IHJ1bGVYRm9yTG9vcEV4cHJlc3Npb24gRU9GIDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo2NzEyOjE6IGVudHJ5UnVsZVhGb3JMb29wRXhwcmVzc2lvbiByZXR1cm5zIFtFT2JqZWN0IGN1cnJlbnQ9bnVsbF0gOiBpdl9ydWxlWEZvckxvb3BFeHByZXNzaW9uPSBydWxlWEZvckxvb3BFeHByZXNzaW9uIEVPRiA7CiAgICAgcHVibGljIGZpbmFsIEVPYmplY3QgZW50cnlSdWxlWEZvckxvb3BFeHByZXNzaW9uKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKICAgICAgICAgRU9iamVjdCBjdXJyZW50ID0gbnVsbDsKIApAQCAtMTcxNDAsOCArMTgzMzQsOCBAQAogCiAKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjYyNzM6NTk6IChpdl9ydWxlWEZvckxvb3BFeHByZXNzaW9uPSBydWxlWEZvckxvb3BFeHByZXNzaW9uIEVPRiApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo2Mjc0OjI6IGl2X3J1bGVYRm9yTG9vcEV4cHJlc3Npb249IHJ1bGVYRm9yTG9vcEV4cHJlc3Npb24gRU9GCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo2NzEyOjU5OiAoaXZfcnVsZVhGb3JMb29wRXhwcmVzc2lvbj0gcnVsZVhGb3JMb29wRXhwcmVzc2lvbiBFT0YgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NjcxMzoyOiBpdl9ydWxlWEZvckxvb3BFeHByZXNzaW9uPSBydWxlWEZvckxvb3BFeHByZXNzaW9uIEVPRgogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBuZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0WEZvckxvb3BFeHByZXNzaW9uUnVsZSgpKTsgCkBAIC0xNzE3Miw3ICsxODM2Niw3IEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZVhGb3JMb29wRXhwcmVzc2lvbiIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo2MjgwOjE6IHJ1bGVYRm9yTG9vcEV4cHJlc3Npb24gcmV0dXJucyBbRU9iamVjdCBjdXJyZW50PW51bGxdIDogKCAoICggKCAoKSAnZm9yJyAnKCcgKCAoIHJ1bGVKdm1Gb3JtYWxQYXJhbWV0ZXIgKSApICc6JyApICk9PiAoICgpIG90aGVybHZfMT0gJ2Zvcicgb3RoZXJsdl8yPSAnKCcgKCAobHZfZGVjbGFyZWRQYXJhbV8zXzA9IHJ1bGVKdm1Gb3JtYWxQYXJhbWV0ZXIgKSApIG90aGVybHZfND0gJzonICkgKSAoIChsdl9mb3JFeHByZXNzaW9uXzVfMD0gcnVsZVhFeHByZXNzaW9uICkgKSBvdGhlcmx2XzY9ICcpJyAoIChsdl9lYWNoRXhwcmVzc2lvbl83XzA9IHJ1bGVYRXhwcmVzc2lvbiApICkgKSA7CisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NjcxOToxOiBydWxlWEZvckxvb3BFeHByZXNzaW9uIHJldHVybnMgW0VPYmplY3QgY3VycmVudD1udWxsXSA6ICggKCAoICggKCkgJ2ZvcicgJygnICggKCBydWxlSnZtRm9ybWFsUGFyYW1ldGVyICkgKSAnOicgKSApPT4gKCAoKSBvdGhlcmx2XzE9ICdmb3InIG90aGVybHZfMj0gJygnICggKGx2X2RlY2xhcmVkUGFyYW1fM18wPSBydWxlSnZtRm9ybWFsUGFyYW1ldGVyICkgKSBvdGhlcmx2XzQ9ICc6JyApICkgKCAobHZfZm9yRXhwcmVzc2lvbl81XzA9IHJ1bGVYRXhwcmVzc2lvbiApICkgb3RoZXJsdl82PSAnKScgKCAobHZfZWFjaEV4cHJlc3Npb25fN18wPSBydWxlWEV4cHJlc3Npb24gKSApICkgOwogICAgIHB1YmxpYyBmaW5hbCBFT2JqZWN0IHJ1bGVYRm9yTG9vcEV4cHJlc3Npb24oKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogICAgICAgICBFT2JqZWN0IGN1cnJlbnQgPSBudWxsOwogCkBAIC0xNzE5MSwyMCArMTgzODUsMjAgQEAKICAgICAgICAgCWVudGVyUnVsZSgpOwogCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo2Mjg2OjI6ICggKCAoICggKCAoKSAnZm9yJyAnKCcgKCAoIHJ1bGVKdm1Gb3JtYWxQYXJhbWV0ZXIgKSApICc6JyApICk9PiAoICgpIG90aGVybHZfMT0gJ2Zvcicgb3RoZXJsdl8yPSAnKCcgKCAobHZfZGVjbGFyZWRQYXJhbV8zXzA9IHJ1bGVKdm1Gb3JtYWxQYXJhbWV0ZXIgKSApIG90aGVybHZfND0gJzonICkgKSAoIChsdl9mb3JFeHByZXNzaW9uXzVfMD0gcnVsZVhFeHByZXNzaW9uICkgKSBvdGhlcmx2XzY9ICcpJyAoIChsdl9lYWNoRXhwcmVzc2lvbl83XzA9IHJ1bGVYRXhwcmVzc2lvbiApICkgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo2Mjg3OjI6ICggKCAoICggKCkgJ2ZvcicgJygnICggKCBydWxlSnZtRm9ybWFsUGFyYW1ldGVyICkgKSAnOicgKSApPT4gKCAoKSBvdGhlcmx2XzE9ICdmb3InIG90aGVybHZfMj0gJygnICggKGx2X2RlY2xhcmVkUGFyYW1fM18wPSBydWxlSnZtRm9ybWFsUGFyYW1ldGVyICkgKSBvdGhlcmx2XzQ9ICc6JyApICkgKCAobHZfZm9yRXhwcmVzc2lvbl81XzA9IHJ1bGVYRXhwcmVzc2lvbiApICkgb3RoZXJsdl82PSAnKScgKCAobHZfZWFjaEV4cHJlc3Npb25fN18wPSBydWxlWEV4cHJlc3Npb24gKSApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjY3MjU6MjogKCAoICggKCAoICgpICdmb3InICcoJyAoICggcnVsZUp2bUZvcm1hbFBhcmFtZXRlciApICkgJzonICkgKT0+ICggKCkgb3RoZXJsdl8xPSAnZm9yJyBvdGhlcmx2XzI9ICcoJyAoIChsdl9kZWNsYXJlZFBhcmFtXzNfMD0gcnVsZUp2bUZvcm1hbFBhcmFtZXRlciApICkgb3RoZXJsdl80PSAnOicgKSApICggKGx2X2ZvckV4cHJlc3Npb25fNV8wPSBydWxlWEV4cHJlc3Npb24gKSApIG90aGVybHZfNj0gJyknICggKGx2X2VhY2hFeHByZXNzaW9uXzdfMD0gcnVsZVhFeHByZXNzaW9uICkgKSApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjY3MjY6MjogKCAoICggKCAoKSAnZm9yJyAnKCcgKCAoIHJ1bGVKdm1Gb3JtYWxQYXJhbWV0ZXIgKSApICc6JyApICk9PiAoICgpIG90aGVybHZfMT0gJ2Zvcicgb3RoZXJsdl8yPSAnKCcgKCAobHZfZGVjbGFyZWRQYXJhbV8zXzA9IHJ1bGVKdm1Gb3JtYWxQYXJhbWV0ZXIgKSApIG90aGVybHZfND0gJzonICkgKSAoIChsdl9mb3JFeHByZXNzaW9uXzVfMD0gcnVsZVhFeHByZXNzaW9uICkgKSBvdGhlcmx2XzY9ICcpJyAoIChsdl9lYWNoRXhwcmVzc2lvbl83XzA9IHJ1bGVYRXhwcmVzc2lvbiApICkgKQogICAgICAgICAgICAgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NjI4NzoyOiAoICggKCAoICgpICdmb3InICcoJyAoICggcnVsZUp2bUZvcm1hbFBhcmFtZXRlciApICkgJzonICkgKT0+ICggKCkgb3RoZXJsdl8xPSAnZm9yJyBvdGhlcmx2XzI9ICcoJyAoIChsdl9kZWNsYXJlZFBhcmFtXzNfMD0gcnVsZUp2bUZvcm1hbFBhcmFtZXRlciApICkgb3RoZXJsdl80PSAnOicgKSApICggKGx2X2ZvckV4cHJlc3Npb25fNV8wPSBydWxlWEV4cHJlc3Npb24gKSApIG90aGVybHZfNj0gJyknICggKGx2X2VhY2hFeHByZXNzaW9uXzdfMD0gcnVsZVhFeHByZXNzaW9uICkgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo2Mjg4OjM6ICggKCAoICgpICdmb3InICcoJyAoICggcnVsZUp2bUZvcm1hbFBhcmFtZXRlciApICkgJzonICkgKT0+ICggKCkgb3RoZXJsdl8xPSAnZm9yJyBvdGhlcmx2XzI9ICcoJyAoIChsdl9kZWNsYXJlZFBhcmFtXzNfMD0gcnVsZUp2bUZvcm1hbFBhcmFtZXRlciApICkgb3RoZXJsdl80PSAnOicgKSApICggKGx2X2ZvckV4cHJlc3Npb25fNV8wPSBydWxlWEV4cHJlc3Npb24gKSApIG90aGVybHZfNj0gJyknICggKGx2X2VhY2hFeHByZXNzaW9uXzdfMD0gcnVsZVhFeHByZXNzaW9uICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NjcyNjoyOiAoICggKCAoICgpICdmb3InICcoJyAoICggcnVsZUp2bUZvcm1hbFBhcmFtZXRlciApICkgJzonICkgKT0+ICggKCkgb3RoZXJsdl8xPSAnZm9yJyBvdGhlcmx2XzI9ICcoJyAoIChsdl9kZWNsYXJlZFBhcmFtXzNfMD0gcnVsZUp2bUZvcm1hbFBhcmFtZXRlciApICkgb3RoZXJsdl80PSAnOicgKSApICggKGx2X2ZvckV4cHJlc3Npb25fNV8wPSBydWxlWEV4cHJlc3Npb24gKSApIG90aGVybHZfNj0gJyknICggKGx2X2VhY2hFeHByZXNzaW9uXzdfMD0gcnVsZVhFeHByZXNzaW9uICkgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo2NzI3OjM6ICggKCAoICgpICdmb3InICcoJyAoICggcnVsZUp2bUZvcm1hbFBhcmFtZXRlciApICkgJzonICkgKT0+ICggKCkgb3RoZXJsdl8xPSAnZm9yJyBvdGhlcmx2XzI9ICcoJyAoIChsdl9kZWNsYXJlZFBhcmFtXzNfMD0gcnVsZUp2bUZvcm1hbFBhcmFtZXRlciApICkgb3RoZXJsdl80PSAnOicgKSApICggKGx2X2ZvckV4cHJlc3Npb25fNV8wPSBydWxlWEV4cHJlc3Npb24gKSApIG90aGVybHZfNj0gJyknICggKGx2X2VhY2hFeHByZXNzaW9uXzdfMD0gcnVsZVhFeHByZXNzaW9uICkgKQogICAgICAgICAgICAgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NjI4ODozOiAoICggKCAoKSAnZm9yJyAnKCcgKCAoIHJ1bGVKdm1Gb3JtYWxQYXJhbWV0ZXIgKSApICc6JyApICk9PiAoICgpIG90aGVybHZfMT0gJ2Zvcicgb3RoZXJsdl8yPSAnKCcgKCAobHZfZGVjbGFyZWRQYXJhbV8zXzA9IHJ1bGVKdm1Gb3JtYWxQYXJhbWV0ZXIgKSApIG90aGVybHZfND0gJzonICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NjI4OTo0OiAoICggKCkgJ2ZvcicgJygnICggKCBydWxlSnZtRm9ybWFsUGFyYW1ldGVyICkgKSAnOicgKSApPT4gKCAoKSBvdGhlcmx2XzE9ICdmb3InIG90aGVybHZfMj0gJygnICggKGx2X2RlY2xhcmVkUGFyYW1fM18wPSBydWxlSnZtRm9ybWFsUGFyYW1ldGVyICkgKSBvdGhlcmx2XzQ9ICc6JyApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo2NzI3OjM6ICggKCAoICgpICdmb3InICcoJyAoICggcnVsZUp2bUZvcm1hbFBhcmFtZXRlciApICkgJzonICkgKT0+ICggKCkgb3RoZXJsdl8xPSAnZm9yJyBvdGhlcmx2XzI9ICcoJyAoIChsdl9kZWNsYXJlZFBhcmFtXzNfMD0gcnVsZUp2bUZvcm1hbFBhcmFtZXRlciApICkgb3RoZXJsdl80PSAnOicgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo2NzI4OjQ6ICggKCAoKSAnZm9yJyAnKCcgKCAoIHJ1bGVKdm1Gb3JtYWxQYXJhbWV0ZXIgKSApICc6JyApICk9PiAoICgpIG90aGVybHZfMT0gJ2Zvcicgb3RoZXJsdl8yPSAnKCcgKCAobHZfZGVjbGFyZWRQYXJhbV8zXzA9IHJ1bGVKdm1Gb3JtYWxQYXJhbWV0ZXIgKSApIG90aGVybHZfND0gJzonICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjYzMDI6NDogKCAoKSBvdGhlcmx2XzE9ICdmb3InIG90aGVybHZfMj0gJygnICggKGx2X2RlY2xhcmVkUGFyYW1fM18wPSBydWxlSnZtRm9ybWFsUGFyYW1ldGVyICkgKSBvdGhlcmx2XzQ9ICc6JyApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo2MzAzOjU6ICgpIG90aGVybHZfMT0gJ2Zvcicgb3RoZXJsdl8yPSAnKCcgKCAobHZfZGVjbGFyZWRQYXJhbV8zXzA9IHJ1bGVKdm1Gb3JtYWxQYXJhbWV0ZXIgKSApIG90aGVybHZfND0gJzonCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo2NzQxOjQ6ICggKCkgb3RoZXJsdl8xPSAnZm9yJyBvdGhlcmx2XzI9ICcoJyAoIChsdl9kZWNsYXJlZFBhcmFtXzNfMD0gcnVsZUp2bUZvcm1hbFBhcmFtZXRlciApICkgb3RoZXJsdl80PSAnOicgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6Njc0Mjo1OiAoKSBvdGhlcmx2XzE9ICdmb3InIG90aGVybHZfMj0gJygnICggKGx2X2RlY2xhcmVkUGFyYW1fM18wPSBydWxlSnZtRm9ybWFsUGFyYW1ldGVyICkgKSBvdGhlcmx2XzQ9ICc6JwogICAgICAgICAgICAgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NjMwMzo1OiAoKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NjMwNDo2OiAKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjY3NDI6NTogKCkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjY3NDM6NjogCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKIApAQCAtMTcyMTYsMzAgKzE4NDEwLDMwIEBACiAKICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgb3RoZXJsdl8xPShUb2tlbiltYXRjaChpbnB1dCw0NixGT0xMT1dfMTAyKTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7CisgICAgICAgICAgICBvdGhlcmx2XzE9KFRva2VuKW1hdGNoKGlucHV0LDUwLEZPTExPV18xMTYpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gY3VycmVudDsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogCiAgICAgICAgICAgICAgIAkJCQkJbmV3TGVhZk5vZGUob3RoZXJsdl8xLCBncmFtbWFyQWNjZXNzLmdldFhGb3JMb29wRXhwcmVzc2lvbkFjY2VzcygpLmdldEZvcktleXdvcmRfMF8wXzEoKSk7CiAgICAgICAgICAgICAgIAkJCQkKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG90aGVybHZfMj0oVG9rZW4pbWF0Y2goaW5wdXQsNzQsRk9MTE9XXzc3KTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7CisgICAgICAgICAgICBvdGhlcmx2XzI9KFRva2VuKW1hdGNoKGlucHV0LDgxLEZPTExPV185MSk7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OwogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAKICAgICAgICAgICAgICAgCQkJCQluZXdMZWFmTm9kZShvdGhlcmx2XzIsIGdyYW1tYXJBY2Nlc3MuZ2V0WEZvckxvb3BFeHByZXNzaW9uQWNjZXNzKCkuZ2V0TGVmdFBhcmVudGhlc2lzS2V5d29yZF8wXzBfMigpKTsKICAgICAgICAgICAgICAgCQkJCQogICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NjMxODo1OiAoIChsdl9kZWNsYXJlZFBhcmFtXzNfMD0gcnVsZUp2bUZvcm1hbFBhcmFtZXRlciApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjYzMTk6NjogKGx2X2RlY2xhcmVkUGFyYW1fM18wPSBydWxlSnZtRm9ybWFsUGFyYW1ldGVyICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjY3NTc6NTogKCAobHZfZGVjbGFyZWRQYXJhbV8zXzA9IHJ1bGVKdm1Gb3JtYWxQYXJhbWV0ZXIgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo2NzU4OjY6IChsdl9kZWNsYXJlZFBhcmFtXzNfMD0gcnVsZUp2bUZvcm1hbFBhcmFtZXRlciApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo2MzE5OjY6IChsdl9kZWNsYXJlZFBhcmFtXzNfMD0gcnVsZUp2bUZvcm1hbFBhcmFtZXRlciApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo2MzIwOjc6IGx2X2RlY2xhcmVkUGFyYW1fM18wPSBydWxlSnZtRm9ybWFsUGFyYW1ldGVyCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo2NzU4OjY6IChsdl9kZWNsYXJlZFBhcmFtXzNfMD0gcnVsZUp2bUZvcm1hbFBhcmFtZXRlciApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo2NzU5Ojc6IGx2X2RlY2xhcmVkUGFyYW1fM18wPSBydWxlSnZtRm9ybWFsUGFyYW1ldGVyCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKIAogICAgICAgICAgICAgICAJCQkJCQkJbmV3Q29tcG9zaXRlTm9kZShncmFtbWFyQWNjZXNzLmdldFhGb3JMb29wRXhwcmVzc2lvbkFjY2VzcygpLmdldERlY2xhcmVkUGFyYW1Kdm1Gb3JtYWxQYXJhbWV0ZXJQYXJzZXJSdWxlQ2FsbF8wXzBfM18wKCkpOwogICAgICAgICAgICAgICAJCQkJCQkKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzEwNSk7CisgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV18xMTkpOwogICAgICAgICAgICAgbHZfZGVjbGFyZWRQYXJhbV8zXzA9cnVsZUp2bUZvcm1hbFBhcmFtZXRlcigpOwogCiAgICAgICAgICAgICBzdGF0ZS5fZnNwLS07CkBAIC0xNzI2Myw3ICsxODQ1Nyw3IEBACiAKICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgb3RoZXJsdl80PShUb2tlbiltYXRjaChpbnB1dCwxMTYsRk9MTE9XXzY0KTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7CisgICAgICAgICAgICBvdGhlcmx2XzQ9KFRva2VuKW1hdGNoKGlucHV0LDEyMyxGT0xMT1dfNzgpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gY3VycmVudDsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogCiAgICAgICAgICAgICAgIAkJCQkJbmV3TGVhZk5vZGUob3RoZXJsdl80LCBncmFtbWFyQWNjZXNzLmdldFhGb3JMb29wRXhwcmVzc2lvbkFjY2VzcygpLmdldENvbG9uS2V5d29yZF8wXzBfNCgpKTsKQEAgLTE3Mjc1LDE4ICsxODQ2OSwxOCBAQAogCiAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjYzNDM6MzogKCAobHZfZm9yRXhwcmVzc2lvbl81XzA9IHJ1bGVYRXhwcmVzc2lvbiApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjYzNDQ6NDogKGx2X2ZvckV4cHJlc3Npb25fNV8wPSBydWxlWEV4cHJlc3Npb24gKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6Njc4MjozOiAoIChsdl9mb3JFeHByZXNzaW9uXzVfMD0gcnVsZVhFeHByZXNzaW9uICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6Njc4Mzo0OiAobHZfZm9yRXhwcmVzc2lvbl81XzA9IHJ1bGVYRXhwcmVzc2lvbiApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo2MzQ0OjQ6IChsdl9mb3JFeHByZXNzaW9uXzVfMD0gcnVsZVhFeHByZXNzaW9uICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjYzNDU6NTogbHZfZm9yRXhwcmVzc2lvbl81XzA9IHJ1bGVYRXhwcmVzc2lvbgorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6Njc4Mzo0OiAobHZfZm9yRXhwcmVzc2lvbl81XzA9IHJ1bGVYRXhwcmVzc2lvbiApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo2Nzg0OjU6IGx2X2ZvckV4cHJlc3Npb25fNV8wPSBydWxlWEV4cHJlc3Npb24KICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogCiAgICAgICAgICAgICAgIAkJCQkJbmV3Q29tcG9zaXRlTm9kZShncmFtbWFyQWNjZXNzLmdldFhGb3JMb29wRXhwcmVzc2lvbkFjY2VzcygpLmdldEZvckV4cHJlc3Npb25YRXhwcmVzc2lvblBhcnNlclJ1bGVDYWxsXzFfMCgpKTsKICAgICAgICAgICAgICAgCQkJCQogICAgICAgICAgICAgfQotICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfNjIpOworICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfNzYpOwogICAgICAgICAgICAgbHZfZm9yRXhwcmVzc2lvbl81XzA9cnVsZVhFeHByZXNzaW9uKCk7CiAKICAgICAgICAgICAgIHN0YXRlLl9mc3AtLTsKQEAgLTE3MzEwLDE3ICsxODUwNCwxNyBAQAogCiAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgIG90aGVybHZfNj0oVG9rZW4pbWF0Y2goaW5wdXQsNzYsRk9MTE9XXzY0KTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7CisgICAgICAgICAgICBvdGhlcmx2XzY9KFRva2VuKW1hdGNoKGlucHV0LDgzLEZPTExPV183OCk7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OwogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAKICAgICAgICAgICAgICAgCQkJbmV3TGVhZk5vZGUob3RoZXJsdl82LCBncmFtbWFyQWNjZXNzLmdldFhGb3JMb29wRXhwcmVzc2lvbkFjY2VzcygpLmdldFJpZ2h0UGFyZW50aGVzaXNLZXl3b3JkXzIoKSk7CiAgICAgICAgICAgICAgIAkJCiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo2MzY2OjM6ICggKGx2X2VhY2hFeHByZXNzaW9uXzdfMD0gcnVsZVhFeHByZXNzaW9uICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NjM2Nzo0OiAobHZfZWFjaEV4cHJlc3Npb25fN18wPSBydWxlWEV4cHJlc3Npb24gKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NjgwNTozOiAoIChsdl9lYWNoRXhwcmVzc2lvbl83XzA9IHJ1bGVYRXhwcmVzc2lvbiApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjY4MDY6NDogKGx2X2VhY2hFeHByZXNzaW9uXzdfMD0gcnVsZVhFeHByZXNzaW9uICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjYzNjc6NDogKGx2X2VhY2hFeHByZXNzaW9uXzdfMD0gcnVsZVhFeHByZXNzaW9uICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjYzNjg6NTogbHZfZWFjaEV4cHJlc3Npb25fN18wPSBydWxlWEV4cHJlc3Npb24KKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjY4MDY6NDogKGx2X2VhY2hFeHByZXNzaW9uXzdfMD0gcnVsZVhFeHByZXNzaW9uICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjY4MDc6NTogbHZfZWFjaEV4cHJlc3Npb25fN18wPSBydWxlWEV4cHJlc3Npb24KICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogCkBAIC0xNzM3Niw3ICsxODU3MCw3IEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAiZW50cnlSdWxlWEJhc2ljRm9yTG9vcEV4cHJlc3Npb24iCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NjM4OToxOiBlbnRyeVJ1bGVYQmFzaWNGb3JMb29wRXhwcmVzc2lvbiByZXR1cm5zIFtFT2JqZWN0IGN1cnJlbnQ9bnVsbF0gOiBpdl9ydWxlWEJhc2ljRm9yTG9vcEV4cHJlc3Npb249IHJ1bGVYQmFzaWNGb3JMb29wRXhwcmVzc2lvbiBFT0YgOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjY4Mjg6MTogZW50cnlSdWxlWEJhc2ljRm9yTG9vcEV4cHJlc3Npb24gcmV0dXJucyBbRU9iamVjdCBjdXJyZW50PW51bGxdIDogaXZfcnVsZVhCYXNpY0Zvckxvb3BFeHByZXNzaW9uPSBydWxlWEJhc2ljRm9yTG9vcEV4cHJlc3Npb24gRU9GIDsKICAgICBwdWJsaWMgZmluYWwgRU9iamVjdCBlbnRyeVJ1bGVYQmFzaWNGb3JMb29wRXhwcmVzc2lvbigpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAgICAgICAgIEVPYmplY3QgY3VycmVudCA9IG51bGw7CiAKQEAgLTE3Mzg0LDggKzE4NTc4LDggQEAKIAogCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo2Mzg5OjY0OiAoaXZfcnVsZVhCYXNpY0Zvckxvb3BFeHByZXNzaW9uPSBydWxlWEJhc2ljRm9yTG9vcEV4cHJlc3Npb24gRU9GICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjYzOTA6MjogaXZfcnVsZVhCYXNpY0Zvckxvb3BFeHByZXNzaW9uPSBydWxlWEJhc2ljRm9yTG9vcEV4cHJlc3Npb24gRU9GCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo2ODI4OjY0OiAoaXZfcnVsZVhCYXNpY0Zvckxvb3BFeHByZXNzaW9uPSBydWxlWEJhc2ljRm9yTG9vcEV4cHJlc3Npb24gRU9GICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjY4Mjk6MjogaXZfcnVsZVhCYXNpY0Zvckxvb3BFeHByZXNzaW9uPSBydWxlWEJhc2ljRm9yTG9vcEV4cHJlc3Npb24gRU9GCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIG5ld0NvbXBvc2l0ZU5vZGUoZ3JhbW1hckFjY2Vzcy5nZXRYQmFzaWNGb3JMb29wRXhwcmVzc2lvblJ1bGUoKSk7IApAQCAtMTc0MTYsNyArMTg2MTAsNyBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVYQmFzaWNGb3JMb29wRXhwcmVzc2lvbiIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo2Mzk2OjE6IHJ1bGVYQmFzaWNGb3JMb29wRXhwcmVzc2lvbiByZXR1cm5zIFtFT2JqZWN0IGN1cnJlbnQ9bnVsbF0gOiAoICgpIG90aGVybHZfMT0gJ2Zvcicgb3RoZXJsdl8yPSAnKCcgKCAoIChsdl9pbml0RXhwcmVzc2lvbnNfM18wPSBydWxlWEV4cHJlc3Npb25PclZhckRlY2xhcmF0aW9uICkgKSAob3RoZXJsdl80PSAnLCcgKCAobHZfaW5pdEV4cHJlc3Npb25zXzVfMD0gcnVsZVhFeHByZXNzaW9uT3JWYXJEZWNsYXJhdGlvbiApICkgKSogKT8gb3RoZXJsdl82PSAnOycgKCAobHZfZXhwcmVzc2lvbl83XzA9IHJ1bGVYRXhwcmVzc2lvbiApICk/IG90aGVybHZfOD0gJzsnICggKCAobHZfdXBkYXRlRXhwcmVzc2lvbnNfOV8wPSBydWxlWEV4cHJlc3Npb24gKSApIChvdGhlcmx2XzEwPSAnLCcgKCAobHZfdXBkYXRlRXhwcmVzc2lvbnNfMTFfMD0gcnVsZVhFeHByZXNzaW9uICkgKSApKiApPyBvdGhlcmx2XzEyPSAnKScgKCAobHZfZWFjaEV4cHJlc3Npb25fMTNfMD0gcnVsZVhFeHByZXNzaW9uICkgKSApIDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo2ODM1OjE6IHJ1bGVYQmFzaWNGb3JMb29wRXhwcmVzc2lvbiByZXR1cm5zIFtFT2JqZWN0IGN1cnJlbnQ9bnVsbF0gOiAoICgpIG90aGVybHZfMT0gJ2Zvcicgb3RoZXJsdl8yPSAnKCcgKCAoIChsdl9pbml0RXhwcmVzc2lvbnNfM18wPSBydWxlWEV4cHJlc3Npb25PclZhckRlY2xhcmF0aW9uICkgKSAob3RoZXJsdl80PSAnLCcgKCAobHZfaW5pdEV4cHJlc3Npb25zXzVfMD0gcnVsZVhFeHByZXNzaW9uT3JWYXJEZWNsYXJhdGlvbiApICkgKSogKT8gb3RoZXJsdl82PSAnOycgKCAobHZfZXhwcmVzc2lvbl83XzA9IHJ1bGVYRXhwcmVzc2lvbiApICk/IG90aGVybHZfOD0gJzsnICggKCAobHZfdXBkYXRlRXhwcmVzc2lvbnNfOV8wPSBydWxlWEV4cHJlc3Npb24gKSApIChvdGhlcmx2XzEwPSAnLCcgKCAobHZfdXBkYXRlRXhwcmVzc2lvbnNfMTFfMD0gcnVsZVhFeHByZXNzaW9uICkgKSApKiApPyBvdGhlcmx2XzEyPSAnKScgKCAobHZfZWFjaEV4cHJlc3Npb25fMTNfMD0gcnVsZVhFeHByZXNzaW9uICkgKSApIDsKICAgICBwdWJsaWMgZmluYWwgRU9iamVjdCBydWxlWEJhc2ljRm9yTG9vcEV4cHJlc3Npb24oKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogICAgICAgICBFT2JqZWN0IGN1cnJlbnQgPSBudWxsOwogCkBAIC0xNzQ0NCwxNCArMTg2MzgsMTQgQEAKICAgICAgICAgCWVudGVyUnVsZSgpOwogCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo2NDAyOjI6ICggKCAoKSBvdGhlcmx2XzE9ICdmb3InIG90aGVybHZfMj0gJygnICggKCAobHZfaW5pdEV4cHJlc3Npb25zXzNfMD0gcnVsZVhFeHByZXNzaW9uT3JWYXJEZWNsYXJhdGlvbiApICkgKG90aGVybHZfND0gJywnICggKGx2X2luaXRFeHByZXNzaW9uc181XzA9IHJ1bGVYRXhwcmVzc2lvbk9yVmFyRGVjbGFyYXRpb24gKSApICkqICk/IG90aGVybHZfNj0gJzsnICggKGx2X2V4cHJlc3Npb25fN18wPSBydWxlWEV4cHJlc3Npb24gKSApPyBvdGhlcmx2Xzg9ICc7JyAoICggKGx2X3VwZGF0ZUV4cHJlc3Npb25zXzlfMD0gcnVsZVhFeHByZXNzaW9uICkgKSAob3RoZXJsdl8xMD0gJywnICggKGx2X3VwZGF0ZUV4cHJlc3Npb25zXzExXzA9IHJ1bGVYRXhwcmVzc2lvbiApICkgKSogKT8gb3RoZXJsdl8xMj0gJyknICggKGx2X2VhY2hFeHByZXNzaW9uXzEzXzA9IHJ1bGVYRXhwcmVzc2lvbiApICkgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo2NDAzOjI6ICggKCkgb3RoZXJsdl8xPSAnZm9yJyBvdGhlcmx2XzI9ICcoJyAoICggKGx2X2luaXRFeHByZXNzaW9uc18zXzA9IHJ1bGVYRXhwcmVzc2lvbk9yVmFyRGVjbGFyYXRpb24gKSApIChvdGhlcmx2XzQ9ICcsJyAoIChsdl9pbml0RXhwcmVzc2lvbnNfNV8wPSBydWxlWEV4cHJlc3Npb25PclZhckRlY2xhcmF0aW9uICkgKSApKiApPyBvdGhlcmx2XzY9ICc7JyAoIChsdl9leHByZXNzaW9uXzdfMD0gcnVsZVhFeHByZXNzaW9uICkgKT8gb3RoZXJsdl84PSAnOycgKCAoIChsdl91cGRhdGVFeHByZXNzaW9uc185XzA9IHJ1bGVYRXhwcmVzc2lvbiApICkgKG90aGVybHZfMTA9ICcsJyAoIChsdl91cGRhdGVFeHByZXNzaW9uc18xMV8wPSBydWxlWEV4cHJlc3Npb24gKSApICkqICk/IG90aGVybHZfMTI9ICcpJyAoIChsdl9lYWNoRXhwcmVzc2lvbl8xM18wPSBydWxlWEV4cHJlc3Npb24gKSApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjY4NDE6MjogKCAoICgpIG90aGVybHZfMT0gJ2Zvcicgb3RoZXJsdl8yPSAnKCcgKCAoIChsdl9pbml0RXhwcmVzc2lvbnNfM18wPSBydWxlWEV4cHJlc3Npb25PclZhckRlY2xhcmF0aW9uICkgKSAob3RoZXJsdl80PSAnLCcgKCAobHZfaW5pdEV4cHJlc3Npb25zXzVfMD0gcnVsZVhFeHByZXNzaW9uT3JWYXJEZWNsYXJhdGlvbiApICkgKSogKT8gb3RoZXJsdl82PSAnOycgKCAobHZfZXhwcmVzc2lvbl83XzA9IHJ1bGVYRXhwcmVzc2lvbiApICk/IG90aGVybHZfOD0gJzsnICggKCAobHZfdXBkYXRlRXhwcmVzc2lvbnNfOV8wPSBydWxlWEV4cHJlc3Npb24gKSApIChvdGhlcmx2XzEwPSAnLCcgKCAobHZfdXBkYXRlRXhwcmVzc2lvbnNfMTFfMD0gcnVsZVhFeHByZXNzaW9uICkgKSApKiApPyBvdGhlcmx2XzEyPSAnKScgKCAobHZfZWFjaEV4cHJlc3Npb25fMTNfMD0gcnVsZVhFeHByZXNzaW9uICkgKSApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjY4NDI6MjogKCAoKSBvdGhlcmx2XzE9ICdmb3InIG90aGVybHZfMj0gJygnICggKCAobHZfaW5pdEV4cHJlc3Npb25zXzNfMD0gcnVsZVhFeHByZXNzaW9uT3JWYXJEZWNsYXJhdGlvbiApICkgKG90aGVybHZfND0gJywnICggKGx2X2luaXRFeHByZXNzaW9uc181XzA9IHJ1bGVYRXhwcmVzc2lvbk9yVmFyRGVjbGFyYXRpb24gKSApICkqICk/IG90aGVybHZfNj0gJzsnICggKGx2X2V4cHJlc3Npb25fN18wPSBydWxlWEV4cHJlc3Npb24gKSApPyBvdGhlcmx2Xzg9ICc7JyAoICggKGx2X3VwZGF0ZUV4cHJlc3Npb25zXzlfMD0gcnVsZVhFeHByZXNzaW9uICkgKSAob3RoZXJsdl8xMD0gJywnICggKGx2X3VwZGF0ZUV4cHJlc3Npb25zXzExXzA9IHJ1bGVYRXhwcmVzc2lvbiApICkgKSogKT8gb3RoZXJsdl8xMj0gJyknICggKGx2X2VhY2hFeHByZXNzaW9uXzEzXzA9IHJ1bGVYRXhwcmVzc2lvbiApICkgKQogICAgICAgICAgICAgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NjQwMzoyOiAoICgpIG90aGVybHZfMT0gJ2Zvcicgb3RoZXJsdl8yPSAnKCcgKCAoIChsdl9pbml0RXhwcmVzc2lvbnNfM18wPSBydWxlWEV4cHJlc3Npb25PclZhckRlY2xhcmF0aW9uICkgKSAob3RoZXJsdl80PSAnLCcgKCAobHZfaW5pdEV4cHJlc3Npb25zXzVfMD0gcnVsZVhFeHByZXNzaW9uT3JWYXJEZWNsYXJhdGlvbiApICkgKSogKT8gb3RoZXJsdl82PSAnOycgKCAobHZfZXhwcmVzc2lvbl83XzA9IHJ1bGVYRXhwcmVzc2lvbiApICk/IG90aGVybHZfOD0gJzsnICggKCAobHZfdXBkYXRlRXhwcmVzc2lvbnNfOV8wPSBydWxlWEV4cHJlc3Npb24gKSApIChvdGhlcmx2XzEwPSAnLCcgKCAobHZfdXBkYXRlRXhwcmVzc2lvbnNfMTFfMD0gcnVsZVhFeHByZXNzaW9uICkgKSApKiApPyBvdGhlcmx2XzEyPSAnKScgKCAobHZfZWFjaEV4cHJlc3Npb25fMTNfMD0gcnVsZVhFeHByZXNzaW9uICkgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo2NDA0OjM6ICgpIG90aGVybHZfMT0gJ2Zvcicgb3RoZXJsdl8yPSAnKCcgKCAoIChsdl9pbml0RXhwcmVzc2lvbnNfM18wPSBydWxlWEV4cHJlc3Npb25PclZhckRlY2xhcmF0aW9uICkgKSAob3RoZXJsdl80PSAnLCcgKCAobHZfaW5pdEV4cHJlc3Npb25zXzVfMD0gcnVsZVhFeHByZXNzaW9uT3JWYXJEZWNsYXJhdGlvbiApICkgKSogKT8gb3RoZXJsdl82PSAnOycgKCAobHZfZXhwcmVzc2lvbl83XzA9IHJ1bGVYRXhwcmVzc2lvbiApICk/IG90aGVybHZfOD0gJzsnICggKCAobHZfdXBkYXRlRXhwcmVzc2lvbnNfOV8wPSBydWxlWEV4cHJlc3Npb24gKSApIChvdGhlcmx2XzEwPSAnLCcgKCAobHZfdXBkYXRlRXhwcmVzc2lvbnNfMTFfMD0gcnVsZVhFeHByZXNzaW9uICkgKSApKiApPyBvdGhlcmx2XzEyPSAnKScgKCAobHZfZWFjaEV4cHJlc3Npb25fMTNfMD0gcnVsZVhFeHByZXNzaW9uICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6Njg0MjoyOiAoICgpIG90aGVybHZfMT0gJ2Zvcicgb3RoZXJsdl8yPSAnKCcgKCAoIChsdl9pbml0RXhwcmVzc2lvbnNfM18wPSBydWxlWEV4cHJlc3Npb25PclZhckRlY2xhcmF0aW9uICkgKSAob3RoZXJsdl80PSAnLCcgKCAobHZfaW5pdEV4cHJlc3Npb25zXzVfMD0gcnVsZVhFeHByZXNzaW9uT3JWYXJEZWNsYXJhdGlvbiApICkgKSogKT8gb3RoZXJsdl82PSAnOycgKCAobHZfZXhwcmVzc2lvbl83XzA9IHJ1bGVYRXhwcmVzc2lvbiApICk/IG90aGVybHZfOD0gJzsnICggKCAobHZfdXBkYXRlRXhwcmVzc2lvbnNfOV8wPSBydWxlWEV4cHJlc3Npb24gKSApIChvdGhlcmx2XzEwPSAnLCcgKCAobHZfdXBkYXRlRXhwcmVzc2lvbnNfMTFfMD0gcnVsZVhFeHByZXNzaW9uICkgKSApKiApPyBvdGhlcmx2XzEyPSAnKScgKCAobHZfZWFjaEV4cHJlc3Npb25fMTNfMD0gcnVsZVhFeHByZXNzaW9uICkgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo2ODQzOjM6ICgpIG90aGVybHZfMT0gJ2Zvcicgb3RoZXJsdl8yPSAnKCcgKCAoIChsdl9pbml0RXhwcmVzc2lvbnNfM18wPSBydWxlWEV4cHJlc3Npb25PclZhckRlY2xhcmF0aW9uICkgKSAob3RoZXJsdl80PSAnLCcgKCAobHZfaW5pdEV4cHJlc3Npb25zXzVfMD0gcnVsZVhFeHByZXNzaW9uT3JWYXJEZWNsYXJhdGlvbiApICkgKSogKT8gb3RoZXJsdl82PSAnOycgKCAobHZfZXhwcmVzc2lvbl83XzA9IHJ1bGVYRXhwcmVzc2lvbiApICk/IG90aGVybHZfOD0gJzsnICggKCAobHZfdXBkYXRlRXhwcmVzc2lvbnNfOV8wPSBydWxlWEV4cHJlc3Npb24gKSApIChvdGhlcmx2XzEwPSAnLCcgKCAobHZfdXBkYXRlRXhwcmVzc2lvbnNfMTFfMD0gcnVsZVhFeHByZXNzaW9uICkgKSApKiApPyBvdGhlcmx2XzEyPSAnKScgKCAobHZfZWFjaEV4cHJlc3Npb25fMTNfMD0gcnVsZVhFeHByZXNzaW9uICkgKQogICAgICAgICAgICAgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NjQwNDozOiAoKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NjQwNTo0OiAKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjY4NDM6MzogKCkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjY4NDQ6NDogCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKIApAQCAtMTc0NjMsNDEgKzE4NjU3LDQxIEBACiAKICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgb3RoZXJsdl8xPShUb2tlbiltYXRjaChpbnB1dCw0NixGT0xMT1dfMTAyKTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7CisgICAgICAgICAgICBvdGhlcmx2XzE9KFRva2VuKW1hdGNoKGlucHV0LDUwLEZPTExPV18xMTYpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gY3VycmVudDsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogCiAgICAgICAgICAgICAgIAkJCW5ld0xlYWZOb2RlKG90aGVybHZfMSwgZ3JhbW1hckFjY2Vzcy5nZXRYQmFzaWNGb3JMb29wRXhwcmVzc2lvbkFjY2VzcygpLmdldEZvcktleXdvcmRfMSgpKTsKICAgICAgICAgICAgICAgCQkKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG90aGVybHZfMj0oVG9rZW4pbWF0Y2goaW5wdXQsNzQsRk9MTE9XXzExMCk7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OworICAgICAgICAgICAgb3RoZXJsdl8yPShUb2tlbiltYXRjaChpbnB1dCw4MSxGT0xMT1dfMTIzKTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKIAogICAgICAgICAgICAgICAJCQluZXdMZWFmTm9kZShvdGhlcmx2XzIsIGdyYW1tYXJBY2Nlc3MuZ2V0WEJhc2ljRm9yTG9vcEV4cHJlc3Npb25BY2Nlc3MoKS5nZXRMZWZ0UGFyZW50aGVzaXNLZXl3b3JkXzIoKSk7CiAgICAgICAgICAgICAgIAkJCiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo2NDE5OjM6ICggKCAobHZfaW5pdEV4cHJlc3Npb25zXzNfMD0gcnVsZVhFeHByZXNzaW9uT3JWYXJEZWNsYXJhdGlvbiApICkgKG90aGVybHZfND0gJywnICggKGx2X2luaXRFeHByZXNzaW9uc181XzA9IHJ1bGVYRXhwcmVzc2lvbk9yVmFyRGVjbGFyYXRpb24gKSApICkqICk/Ci0gICAgICAgICAgICBpbnQgYWx0MTEwPTI7Ci0gICAgICAgICAgICBpbnQgTEExMTBfMCA9IGlucHV0LkxBKDEpOworICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6Njg1ODozOiAoICggKGx2X2luaXRFeHByZXNzaW9uc18zXzA9IHJ1bGVYRXhwcmVzc2lvbk9yVmFyRGVjbGFyYXRpb24gKSApIChvdGhlcmx2XzQ9ICcsJyAoIChsdl9pbml0RXhwcmVzc2lvbnNfNV8wPSBydWxlWEV4cHJlc3Npb25PclZhckRlY2xhcmF0aW9uICkgKSApKiApPworICAgICAgICAgICAgaW50IGFsdDEyMT0yOworICAgICAgICAgICAgaW50IExBMTIxXzAgPSBpbnB1dC5MQSgxKTsKIAotICAgICAgICAgICAgaWYgKCAoKExBMTEwXzA+PVJVTEVfU1RSSU5HICYmIExBMTEwXzA8PVJVTEVfREVDSU1BTCl8fExBMTEwXzA9PTE1fHxMQTExMF8wPT00Nnx8TEExMTBfMD09NjV8fChMQTExMF8wPj02OCAmJiBMQTExMF8wPD02OSl8fExBMTEwXzA9PTc0fHwoTEExMTBfMD49NzggJiYgTEExMTBfMDw9NzkpfHxMQTExMF8wPT04Nnx8KExBMTEwXzA+PTEwMiAmJiBMQTExMF8wPD0xMDMpfHxMQTExMF8wPT0xMDd8fExBMTEwXzA9PTExM3x8TEExMTBfMD09MTE1fHwoTEExMTBfMD49MTE5ICYmIExBMTEwXzA8PTEzMil8fExBMTEwXzA9PTEzNCkgKSB7Ci0gICAgICAgICAgICAgICAgYWx0MTEwPTE7CisgICAgICAgICAgICBpZiAoICgoTEExMjFfMD49UlVMRV9TVFJJTkcgJiYgTEExMjFfMDw9UlVMRV9ERUNJTUFMKXx8TEExMjFfMD09MTV8fExBMTIxXzA9PTUwfHxMQTEyMV8wPT03Mnx8KExBMTIxXzA+PTc1ICYmIExBMTIxXzA8PTc2KXx8TEExMjFfMD09ODF8fChMQTEyMV8wPj04NSAmJiBMQTEyMV8wPD04Nil8fExBMTIxXzA9PTkzfHwoTEExMjFfMD49MTA5ICYmIExBMTIxXzA8PTExMCl8fExBMTIxXzA9PTExNHx8TEExMjFfMD09MTIwfHxMQTEyMV8wPT0xMjJ8fChMQTEyMV8wPj0xMjYgJiYgTEExMjFfMDw9MTM5KXx8TEExMjFfMD09MTQxKSApIHsKKyAgICAgICAgICAgICAgICBhbHQxMjE9MTsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHN3aXRjaCAoYWx0MTEwKSB7CisgICAgICAgICAgICBzd2l0Y2ggKGFsdDEyMSkgewogICAgICAgICAgICAgICAgIGNhc2UgMSA6Ci0gICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjY0MjA6NDogKCAobHZfaW5pdEV4cHJlc3Npb25zXzNfMD0gcnVsZVhFeHByZXNzaW9uT3JWYXJEZWNsYXJhdGlvbiApICkgKG90aGVybHZfND0gJywnICggKGx2X2luaXRFeHByZXNzaW9uc181XzA9IHJ1bGVYRXhwcmVzc2lvbk9yVmFyRGVjbGFyYXRpb24gKSApICkqCisgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjY4NTk6NDogKCAobHZfaW5pdEV4cHJlc3Npb25zXzNfMD0gcnVsZVhFeHByZXNzaW9uT3JWYXJEZWNsYXJhdGlvbiApICkgKG90aGVybHZfND0gJywnICggKGx2X2luaXRFeHByZXNzaW9uc181XzA9IHJ1bGVYRXhwcmVzc2lvbk9yVmFyRGVjbGFyYXRpb24gKSApICkqCiAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NjQyMDo0OiAoIChsdl9pbml0RXhwcmVzc2lvbnNfM18wPSBydWxlWEV4cHJlc3Npb25PclZhckRlY2xhcmF0aW9uICkgKQotICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo2NDIxOjU6IChsdl9pbml0RXhwcmVzc2lvbnNfM18wPSBydWxlWEV4cHJlc3Npb25PclZhckRlY2xhcmF0aW9uICkKKyAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6Njg1OTo0OiAoIChsdl9pbml0RXhwcmVzc2lvbnNfM18wPSBydWxlWEV4cHJlc3Npb25PclZhckRlY2xhcmF0aW9uICkgKQorICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo2ODYwOjU6IChsdl9pbml0RXhwcmVzc2lvbnNfM18wPSBydWxlWEV4cHJlc3Npb25PclZhckRlY2xhcmF0aW9uICkKICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo2NDIxOjU6IChsdl9pbml0RXhwcmVzc2lvbnNfM18wPSBydWxlWEV4cHJlc3Npb25PclZhckRlY2xhcmF0aW9uICkKLSAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NjQyMjo2OiBsdl9pbml0RXhwcmVzc2lvbnNfM18wPSBydWxlWEV4cHJlc3Npb25PclZhckRlY2xhcmF0aW9uCisgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjY4NjA6NTogKGx2X2luaXRFeHByZXNzaW9uc18zXzA9IHJ1bGVYRXhwcmVzc2lvbk9yVmFyRGVjbGFyYXRpb24gKQorICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo2ODYxOjY6IGx2X2luaXRFeHByZXNzaW9uc18zXzA9IHJ1bGVYRXhwcmVzc2lvbk9yVmFyRGVjbGFyYXRpb24KICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKIAogICAgICAgICAgICAgICAgICAgICAgIAkJCQkJCW5ld0NvbXBvc2l0ZU5vZGUoZ3JhbW1hckFjY2Vzcy5nZXRYQmFzaWNGb3JMb29wRXhwcmVzc2lvbkFjY2VzcygpLmdldEluaXRFeHByZXNzaW9uc1hFeHByZXNzaW9uT3JWYXJEZWNsYXJhdGlvblBhcnNlclJ1bGVDYWxsXzNfMF8wKCkpOwogICAgICAgICAgICAgICAgICAgICAgIAkJCQkJCiAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMTExKTsKKyAgICAgICAgICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMTI0KTsKICAgICAgICAgICAgICAgICAgICAgbHZfaW5pdEV4cHJlc3Npb25zXzNfMD1ydWxlWEV4cHJlc3Npb25PclZhckRlY2xhcmF0aW9uKCk7CiAKICAgICAgICAgICAgICAgICAgICAgc3RhdGUuX2ZzcC0tOwpAQCAtMTc1MjEsMzkgKzE4NzE1LDM5IEBACiAKICAgICAgICAgICAgICAgICAgICAgfQogCi0gICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjY0Mzk6NDogKG90aGVybHZfND0gJywnICggKGx2X2luaXRFeHByZXNzaW9uc181XzA9IHJ1bGVYRXhwcmVzc2lvbk9yVmFyRGVjbGFyYXRpb24gKSApICkqCi0gICAgICAgICAgICAgICAgICAgIGxvb3AxMDk6CisgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjY4Nzg6NDogKG90aGVybHZfND0gJywnICggKGx2X2luaXRFeHByZXNzaW9uc181XzA9IHJ1bGVYRXhwcmVzc2lvbk9yVmFyRGVjbGFyYXRpb24gKSApICkqCisgICAgICAgICAgICAgICAgICAgIGxvb3AxMjA6CiAgICAgICAgICAgICAgICAgICAgIGRvIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGludCBhbHQxMDk9MjsKLSAgICAgICAgICAgICAgICAgICAgICAgIGludCBMQTEwOV8wID0gaW5wdXQuTEEoMSk7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYWx0MTIwPTI7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgTEExMjBfMCA9IGlucHV0LkxBKDEpOwogCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIChMQTEwOV8wPT03NSkgKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYWx0MTA5PTE7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIChMQTEyMF8wPT04MikgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWx0MTIwPTE7CiAgICAgICAgICAgICAgICAgICAgICAgICB9CiAKIAotICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChhbHQxMDkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoYWx0MTIwKSB7CiAgICAgICAgICAgICAgICAgICAgIAljYXNlIDEgOgotICAgICAgICAgICAgICAgICAgICAJICAgIC8vIEludGVybmFsRGF0YURTTC5nOjY0NDA6NTogb3RoZXJsdl80PSAnLCcgKCAobHZfaW5pdEV4cHJlc3Npb25zXzVfMD0gcnVsZVhFeHByZXNzaW9uT3JWYXJEZWNsYXJhdGlvbiApICkKKyAgICAgICAgICAgICAgICAgICAgCSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo2ODc5OjU6IG90aGVybHZfND0gJywnICggKGx2X2luaXRFeHByZXNzaW9uc181XzA9IHJ1bGVYRXhwcmVzc2lvbk9yVmFyRGVjbGFyYXRpb24gKSApCiAgICAgICAgICAgICAgICAgICAgIAkgICAgewotICAgICAgICAgICAgICAgICAgICAJICAgIG90aGVybHZfND0oVG9rZW4pbWF0Y2goaW5wdXQsNzUsRk9MTE9XXzExMik7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OworICAgICAgICAgICAgICAgICAgICAJICAgIG90aGVybHZfND0oVG9rZW4pbWF0Y2goaW5wdXQsODIsRk9MTE9XXzEyNSk7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OwogICAgICAgICAgICAgICAgICAgICAJICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogCiAgICAgICAgICAgICAgICAgICAgIAkgICAgICAJCQkJCW5ld0xlYWZOb2RlKG90aGVybHZfNCwgZ3JhbW1hckFjY2Vzcy5nZXRYQmFzaWNGb3JMb29wRXhwcmVzc2lvbkFjY2VzcygpLmdldENvbW1hS2V5d29yZF8zXzFfMCgpKTsKICAgICAgICAgICAgICAgICAgICAgCSAgICAgIAkJCQkKICAgICAgICAgICAgICAgICAgICAgCSAgICB9Ci0gICAgICAgICAgICAgICAgICAgIAkgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NjQ0NDo1OiAoIChsdl9pbml0RXhwcmVzc2lvbnNfNV8wPSBydWxlWEV4cHJlc3Npb25PclZhckRlY2xhcmF0aW9uICkgKQotICAgICAgICAgICAgICAgICAgICAJICAgIC8vIEludGVybmFsRGF0YURTTC5nOjY0NDU6NjogKGx2X2luaXRFeHByZXNzaW9uc181XzA9IHJ1bGVYRXhwcmVzc2lvbk9yVmFyRGVjbGFyYXRpb24gKQorICAgICAgICAgICAgICAgICAgICAJICAgIC8vIEludGVybmFsRGF0YURTTC5nOjY4ODM6NTogKCAobHZfaW5pdEV4cHJlc3Npb25zXzVfMD0gcnVsZVhFeHByZXNzaW9uT3JWYXJEZWNsYXJhdGlvbiApICkKKyAgICAgICAgICAgICAgICAgICAgCSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo2ODg0OjY6IChsdl9pbml0RXhwcmVzc2lvbnNfNV8wPSBydWxlWEV4cHJlc3Npb25PclZhckRlY2xhcmF0aW9uICkKICAgICAgICAgICAgICAgICAgICAgCSAgICB7Ci0gICAgICAgICAgICAgICAgICAgIAkgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NjQ0NTo2OiAobHZfaW5pdEV4cHJlc3Npb25zXzVfMD0gcnVsZVhFeHByZXNzaW9uT3JWYXJEZWNsYXJhdGlvbiApCi0gICAgICAgICAgICAgICAgICAgIAkgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NjQ0Njo3OiBsdl9pbml0RXhwcmVzc2lvbnNfNV8wPSBydWxlWEV4cHJlc3Npb25PclZhckRlY2xhcmF0aW9uCisgICAgICAgICAgICAgICAgICAgIAkgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6Njg4NDo2OiAobHZfaW5pdEV4cHJlc3Npb25zXzVfMD0gcnVsZVhFeHByZXNzaW9uT3JWYXJEZWNsYXJhdGlvbiApCisgICAgICAgICAgICAgICAgICAgIAkgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6Njg4NTo3OiBsdl9pbml0RXhwcmVzc2lvbnNfNV8wPSBydWxlWEV4cHJlc3Npb25PclZhckRlY2xhcmF0aW9uCiAgICAgICAgICAgICAgICAgICAgIAkgICAgewogICAgICAgICAgICAgICAgICAgICAJICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogCiAgICAgICAgICAgICAgICAgICAgIAkgICAgICAJCQkJCQkJbmV3Q29tcG9zaXRlTm9kZShncmFtbWFyQWNjZXNzLmdldFhCYXNpY0Zvckxvb3BFeHByZXNzaW9uQWNjZXNzKCkuZ2V0SW5pdEV4cHJlc3Npb25zWEV4cHJlc3Npb25PclZhckRlY2xhcmF0aW9uUGFyc2VyUnVsZUNhbGxfM18xXzFfMCgpKTsKICAgICAgICAgICAgICAgICAgICAgCSAgICAgIAkJCQkJCQogICAgICAgICAgICAgICAgICAgICAJICAgIH0KLSAgICAgICAgICAgICAgICAgICAgCSAgICBwdXNoRm9sbG93KEZPTExPV18xMTEpOworICAgICAgICAgICAgICAgICAgICAJICAgIHB1c2hGb2xsb3coRk9MTE9XXzEyNCk7CiAgICAgICAgICAgICAgICAgICAgIAkgICAgbHZfaW5pdEV4cHJlc3Npb25zXzVfMD1ydWxlWEV4cHJlc3Npb25PclZhckRlY2xhcmF0aW9uKCk7CiAKICAgICAgICAgICAgICAgICAgICAgCSAgICBzdGF0ZS5fZnNwLS07CkBAIC0xNzU4Miw3ICsxODc3Niw3IEBACiAgICAgICAgICAgICAgICAgICAgIAkgICAgYnJlYWs7CiAKICAgICAgICAgICAgICAgICAgICAgCWRlZmF1bHQgOgotICAgICAgICAgICAgICAgICAgICAJICAgIGJyZWFrIGxvb3AxMDk7CisgICAgICAgICAgICAgICAgICAgIAkgICAgYnJlYWsgbG9vcDEyMDsKICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgfSB3aGlsZSAodHJ1ZSk7CiAKQEAgLTE3NTkyLDMyICsxODc4NiwzMiBAQAogCiAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgIG90aGVybHZfNj0oVG9rZW4pbWF0Y2goaW5wdXQsNzIsRk9MTE9XXzExMyk7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OworICAgICAgICAgICAgb3RoZXJsdl82PShUb2tlbiltYXRjaChpbnB1dCw3OSxGT0xMT1dfMTI2KTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKIAogICAgICAgICAgICAgICAJCQluZXdMZWFmTm9kZShvdGhlcmx2XzYsIGdyYW1tYXJBY2Nlc3MuZ2V0WEJhc2ljRm9yTG9vcEV4cHJlc3Npb25BY2Nlc3MoKS5nZXRTZW1pY29sb25LZXl3b3JkXzQoKSk7CiAgICAgICAgICAgICAgIAkJCiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo2NDY5OjM6ICggKGx2X2V4cHJlc3Npb25fN18wPSBydWxlWEV4cHJlc3Npb24gKSApPwotICAgICAgICAgICAgaW50IGFsdDExMT0yOwotICAgICAgICAgICAgaW50IExBMTExXzAgPSBpbnB1dC5MQSgxKTsKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjY5MDg6MzogKCAobHZfZXhwcmVzc2lvbl83XzA9IHJ1bGVYRXhwcmVzc2lvbiApICk/CisgICAgICAgICAgICBpbnQgYWx0MTIyPTI7CisgICAgICAgICAgICBpbnQgTEExMjJfMCA9IGlucHV0LkxBKDEpOwogCi0gICAgICAgICAgICBpZiAoICgoTEExMTFfMD49UlVMRV9TVFJJTkcgJiYgTEExMTFfMDw9UlVMRV9ERUNJTUFMKXx8TEExMTFfMD09MTV8fExBMTExXzA9PTQ2fHxMQTExMV8wPT02NXx8KExBMTExXzA+PTY4ICYmIExBMTExXzA8PTY5KXx8TEExMTFfMD09NzR8fChMQTExMV8wPj03OCAmJiBMQTExMV8wPD03OSl8fExBMTExXzA9PTg2fHwoTEExMTFfMD49MTAyICYmIExBMTExXzA8PTEwMyl8fExBMTExXzA9PTEwN3x8TEExMTFfMD09MTEzfHxMQTExMV8wPT0xMTV8fChMQTExMV8wPj0xMTkgJiYgTEExMTFfMDw9MTIwKXx8KExBMTExXzA+PTEyMyAmJiBMQTExMV8wPD0xMzIpfHxMQTExMV8wPT0xMzQpICkgewotICAgICAgICAgICAgICAgIGFsdDExMT0xOworICAgICAgICAgICAgaWYgKCAoKExBMTIyXzA+PVJVTEVfU1RSSU5HICYmIExBMTIyXzA8PVJVTEVfREVDSU1BTCl8fExBMTIyXzA9PTE1fHxMQTEyMl8wPT01MHx8TEExMjJfMD09NzJ8fChMQTEyMl8wPj03NSAmJiBMQTEyMl8wPD03Nil8fExBMTIyXzA9PTgxfHwoTEExMjJfMD49ODUgJiYgTEExMjJfMDw9ODYpfHxMQTEyMl8wPT05M3x8KExBMTIyXzA+PTEwOSAmJiBMQTEyMl8wPD0xMTApfHxMQTEyMl8wPT0xMTR8fExBMTIyXzA9PTEyMHx8TEExMjJfMD09MTIyfHwoTEExMjJfMD49MTI2ICYmIExBMTIyXzA8PTEyNyl8fChMQTEyMl8wPj0xMzAgJiYgTEExMjJfMDw9MTM5KXx8TEExMjJfMD09MTQxKSApIHsKKyAgICAgICAgICAgICAgICBhbHQxMjI9MTsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHN3aXRjaCAoYWx0MTExKSB7CisgICAgICAgICAgICBzd2l0Y2ggKGFsdDEyMikgewogICAgICAgICAgICAgICAgIGNhc2UgMSA6Ci0gICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjY0NzA6NDogKGx2X2V4cHJlc3Npb25fN18wPSBydWxlWEV4cHJlc3Npb24gKQorICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo2OTA5OjQ6IChsdl9leHByZXNzaW9uXzdfMD0gcnVsZVhFeHByZXNzaW9uICkKICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo2NDcwOjQ6IChsdl9leHByZXNzaW9uXzdfMD0gcnVsZVhFeHByZXNzaW9uICkKLSAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NjQ3MTo1OiBsdl9leHByZXNzaW9uXzdfMD0gcnVsZVhFeHByZXNzaW9uCisgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjY5MDk6NDogKGx2X2V4cHJlc3Npb25fN18wPSBydWxlWEV4cHJlc3Npb24gKQorICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo2OTEwOjU6IGx2X2V4cHJlc3Npb25fN18wPSBydWxlWEV4cHJlc3Npb24KICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKIAogICAgICAgICAgICAgICAgICAgICAgIAkJCQkJbmV3Q29tcG9zaXRlTm9kZShncmFtbWFyQWNjZXNzLmdldFhCYXNpY0Zvckxvb3BFeHByZXNzaW9uQWNjZXNzKCkuZ2V0RXhwcmVzc2lvblhFeHByZXNzaW9uUGFyc2VyUnVsZUNhbGxfNV8wKCkpOwogICAgICAgICAgICAgICAgICAgICAgIAkJCQkKICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV18xMTQpOworICAgICAgICAgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV18xMjcpOwogICAgICAgICAgICAgICAgICAgICBsdl9leHByZXNzaW9uXzdfMD1ydWxlWEV4cHJlc3Npb24oKTsKIAogICAgICAgICAgICAgICAgICAgICBzdGF0ZS5fZnNwLS07CkBAIC0xNzY0NCwzNSArMTg4MzgsMzUgQEAKIAogICAgICAgICAgICAgfQogCi0gICAgICAgICAgICBvdGhlcmx2Xzg9KFRva2VuKW1hdGNoKGlucHV0LDcyLEZPTExPV182MCk7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OworICAgICAgICAgICAgb3RoZXJsdl84PShUb2tlbiltYXRjaChpbnB1dCw3OSxGT0xMT1dfNzQpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gY3VycmVudDsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogCiAgICAgICAgICAgICAgIAkJCW5ld0xlYWZOb2RlKG90aGVybHZfOCwgZ3JhbW1hckFjY2Vzcy5nZXRYQmFzaWNGb3JMb29wRXhwcmVzc2lvbkFjY2VzcygpLmdldFNlbWljb2xvbktleXdvcmRfNigpKTsKICAgICAgICAgICAgICAgCQkKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjY0OTI6MzogKCAoIChsdl91cGRhdGVFeHByZXNzaW9uc185XzA9IHJ1bGVYRXhwcmVzc2lvbiApICkgKG90aGVybHZfMTA9ICcsJyAoIChsdl91cGRhdGVFeHByZXNzaW9uc18xMV8wPSBydWxlWEV4cHJlc3Npb24gKSApICkqICk/Ci0gICAgICAgICAgICBpbnQgYWx0MTEzPTI7Ci0gICAgICAgICAgICBpbnQgTEExMTNfMCA9IGlucHV0LkxBKDEpOworICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NjkzMTozOiAoICggKGx2X3VwZGF0ZUV4cHJlc3Npb25zXzlfMD0gcnVsZVhFeHByZXNzaW9uICkgKSAob3RoZXJsdl8xMD0gJywnICggKGx2X3VwZGF0ZUV4cHJlc3Npb25zXzExXzA9IHJ1bGVYRXhwcmVzc2lvbiApICkgKSogKT8KKyAgICAgICAgICAgIGludCBhbHQxMjQ9MjsKKyAgICAgICAgICAgIGludCBMQTEyNF8wID0gaW5wdXQuTEEoMSk7CiAKLSAgICAgICAgICAgIGlmICggKChMQTExM18wPj1SVUxFX1NUUklORyAmJiBMQTExM18wPD1SVUxFX0RFQ0lNQUwpfHxMQTExM18wPT0xNXx8TEExMTNfMD09NDZ8fExBMTEzXzA9PTY1fHwoTEExMTNfMD49NjggJiYgTEExMTNfMDw9NjkpfHxMQTExM18wPT03NHx8KExBMTEzXzA+PTc4ICYmIExBMTEzXzA8PTc5KXx8TEExMTNfMD09ODZ8fChMQTExM18wPj0xMDIgJiYgTEExMTNfMDw9MTAzKXx8TEExMTNfMD09MTA3fHxMQTExM18wPT0xMTN8fExBMTEzXzA9PTExNXx8KExBMTEzXzA+PTExOSAmJiBMQTExM18wPD0xMjApfHwoTEExMTNfMD49MTIzICYmIExBMTEzXzA8PTEzMil8fExBMTEzXzA9PTEzNCkgKSB7Ci0gICAgICAgICAgICAgICAgYWx0MTEzPTE7CisgICAgICAgICAgICBpZiAoICgoTEExMjRfMD49UlVMRV9TVFJJTkcgJiYgTEExMjRfMDw9UlVMRV9ERUNJTUFMKXx8TEExMjRfMD09MTV8fExBMTI0XzA9PTUwfHxMQTEyNF8wPT03Mnx8KExBMTI0XzA+PTc1ICYmIExBMTI0XzA8PTc2KXx8TEExMjRfMD09ODF8fChMQTEyNF8wPj04NSAmJiBMQTEyNF8wPD04Nil8fExBMTI0XzA9PTkzfHwoTEExMjRfMD49MTA5ICYmIExBMTI0XzA8PTExMCl8fExBMTI0XzA9PTExNHx8TEExMjRfMD09MTIwfHxMQTEyNF8wPT0xMjJ8fChMQTEyNF8wPj0xMjYgJiYgTEExMjRfMDw9MTI3KXx8KExBMTI0XzA+PTEzMCAmJiBMQTEyNF8wPD0xMzkpfHxMQTEyNF8wPT0xNDEpICkgeworICAgICAgICAgICAgICAgIGFsdDEyND0xOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgc3dpdGNoIChhbHQxMTMpIHsKKyAgICAgICAgICAgIHN3aXRjaCAoYWx0MTI0KSB7CiAgICAgICAgICAgICAgICAgY2FzZSAxIDoKLSAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NjQ5Mzo0OiAoIChsdl91cGRhdGVFeHByZXNzaW9uc185XzA9IHJ1bGVYRXhwcmVzc2lvbiApICkgKG90aGVybHZfMTA9ICcsJyAoIChsdl91cGRhdGVFeHByZXNzaW9uc18xMV8wPSBydWxlWEV4cHJlc3Npb24gKSApICkqCisgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjY5MzI6NDogKCAobHZfdXBkYXRlRXhwcmVzc2lvbnNfOV8wPSBydWxlWEV4cHJlc3Npb24gKSApIChvdGhlcmx2XzEwPSAnLCcgKCAobHZfdXBkYXRlRXhwcmVzc2lvbnNfMTFfMD0gcnVsZVhFeHByZXNzaW9uICkgKSApKgogICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjY0OTM6NDogKCAobHZfdXBkYXRlRXhwcmVzc2lvbnNfOV8wPSBydWxlWEV4cHJlc3Npb24gKSApCi0gICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjY0OTQ6NTogKGx2X3VwZGF0ZUV4cHJlc3Npb25zXzlfMD0gcnVsZVhFeHByZXNzaW9uICkKKyAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NjkzMjo0OiAoIChsdl91cGRhdGVFeHByZXNzaW9uc185XzA9IHJ1bGVYRXhwcmVzc2lvbiApICkKKyAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NjkzMzo1OiAobHZfdXBkYXRlRXhwcmVzc2lvbnNfOV8wPSBydWxlWEV4cHJlc3Npb24gKQogICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjY0OTQ6NTogKGx2X3VwZGF0ZUV4cHJlc3Npb25zXzlfMD0gcnVsZVhFeHByZXNzaW9uICkKLSAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NjQ5NTo2OiBsdl91cGRhdGVFeHByZXNzaW9uc185XzA9IHJ1bGVYRXhwcmVzc2lvbgorICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo2OTMzOjU6IChsdl91cGRhdGVFeHByZXNzaW9uc185XzA9IHJ1bGVYRXhwcmVzc2lvbiApCisgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjY5MzQ6NjogbHZfdXBkYXRlRXhwcmVzc2lvbnNfOV8wPSBydWxlWEV4cHJlc3Npb24KICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKIAogICAgICAgICAgICAgICAgICAgICAgIAkJCQkJCW5ld0NvbXBvc2l0ZU5vZGUoZ3JhbW1hckFjY2Vzcy5nZXRYQmFzaWNGb3JMb29wRXhwcmVzc2lvbkFjY2VzcygpLmdldFVwZGF0ZUV4cHJlc3Npb25zWEV4cHJlc3Npb25QYXJzZXJSdWxlQ2FsbF83XzBfMCgpKTsKICAgICAgICAgICAgICAgICAgICAgICAJCQkJCQogICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzYxKTsKKyAgICAgICAgICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfNzUpOwogICAgICAgICAgICAgICAgICAgICBsdl91cGRhdGVFeHByZXNzaW9uc185XzA9cnVsZVhFeHByZXNzaW9uKCk7CiAKICAgICAgICAgICAgICAgICAgICAgc3RhdGUuX2ZzcC0tOwpAQCAtMTc2OTYsMzkgKzE4ODkwLDM5IEBACiAKICAgICAgICAgICAgICAgICAgICAgfQogCi0gICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjY1MTI6NDogKG90aGVybHZfMTA9ICcsJyAoIChsdl91cGRhdGVFeHByZXNzaW9uc18xMV8wPSBydWxlWEV4cHJlc3Npb24gKSApICkqCi0gICAgICAgICAgICAgICAgICAgIGxvb3AxMTI6CisgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjY5NTE6NDogKG90aGVybHZfMTA9ICcsJyAoIChsdl91cGRhdGVFeHByZXNzaW9uc18xMV8wPSBydWxlWEV4cHJlc3Npb24gKSApICkqCisgICAgICAgICAgICAgICAgICAgIGxvb3AxMjM6CiAgICAgICAgICAgICAgICAgICAgIGRvIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGludCBhbHQxMTI9MjsKLSAgICAgICAgICAgICAgICAgICAgICAgIGludCBMQTExMl8wID0gaW5wdXQuTEEoMSk7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYWx0MTIzPTI7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgTEExMjNfMCA9IGlucHV0LkxBKDEpOwogCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIChMQTExMl8wPT03NSkgKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYWx0MTEyPTE7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIChMQTEyM18wPT04MikgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWx0MTIzPTE7CiAgICAgICAgICAgICAgICAgICAgICAgICB9CiAKIAotICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChhbHQxMTIpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoYWx0MTIzKSB7CiAgICAgICAgICAgICAgICAgICAgIAljYXNlIDEgOgotICAgICAgICAgICAgICAgICAgICAJICAgIC8vIEludGVybmFsRGF0YURTTC5nOjY1MTM6NTogb3RoZXJsdl8xMD0gJywnICggKGx2X3VwZGF0ZUV4cHJlc3Npb25zXzExXzA9IHJ1bGVYRXhwcmVzc2lvbiApICkKKyAgICAgICAgICAgICAgICAgICAgCSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo2OTUyOjU6IG90aGVybHZfMTA9ICcsJyAoIChsdl91cGRhdGVFeHByZXNzaW9uc18xMV8wPSBydWxlWEV4cHJlc3Npb24gKSApCiAgICAgICAgICAgICAgICAgICAgIAkgICAgewotICAgICAgICAgICAgICAgICAgICAJICAgIG90aGVybHZfMTA9KFRva2VuKW1hdGNoKGlucHV0LDc1LEZPTExPV182NCk7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OworICAgICAgICAgICAgICAgICAgICAJICAgIG90aGVybHZfMTA9KFRva2VuKW1hdGNoKGlucHV0LDgyLEZPTExPV183OCk7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OwogICAgICAgICAgICAgICAgICAgICAJICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogCiAgICAgICAgICAgICAgICAgICAgIAkgICAgICAJCQkJCW5ld0xlYWZOb2RlKG90aGVybHZfMTAsIGdyYW1tYXJBY2Nlc3MuZ2V0WEJhc2ljRm9yTG9vcEV4cHJlc3Npb25BY2Nlc3MoKS5nZXRDb21tYUtleXdvcmRfN18xXzAoKSk7CiAgICAgICAgICAgICAgICAgICAgIAkgICAgICAJCQkJCiAgICAgICAgICAgICAgICAgICAgIAkgICAgfQotICAgICAgICAgICAgICAgICAgICAJICAgIC8vIEludGVybmFsRGF0YURTTC5nOjY1MTc6NTogKCAobHZfdXBkYXRlRXhwcmVzc2lvbnNfMTFfMD0gcnVsZVhFeHByZXNzaW9uICkgKQotICAgICAgICAgICAgICAgICAgICAJICAgIC8vIEludGVybmFsRGF0YURTTC5nOjY1MTg6NjogKGx2X3VwZGF0ZUV4cHJlc3Npb25zXzExXzA9IHJ1bGVYRXhwcmVzc2lvbiApCisgICAgICAgICAgICAgICAgICAgIAkgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6Njk1Njo1OiAoIChsdl91cGRhdGVFeHByZXNzaW9uc18xMV8wPSBydWxlWEV4cHJlc3Npb24gKSApCisgICAgICAgICAgICAgICAgICAgIAkgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6Njk1Nzo2OiAobHZfdXBkYXRlRXhwcmVzc2lvbnNfMTFfMD0gcnVsZVhFeHByZXNzaW9uICkKICAgICAgICAgICAgICAgICAgICAgCSAgICB7Ci0gICAgICAgICAgICAgICAgICAgIAkgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NjUxODo2OiAobHZfdXBkYXRlRXhwcmVzc2lvbnNfMTFfMD0gcnVsZVhFeHByZXNzaW9uICkKLSAgICAgICAgICAgICAgICAgICAgCSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo2NTE5Ojc6IGx2X3VwZGF0ZUV4cHJlc3Npb25zXzExXzA9IHJ1bGVYRXhwcmVzc2lvbgorICAgICAgICAgICAgICAgICAgICAJICAgIC8vIEludGVybmFsRGF0YURTTC5nOjY5NTc6NjogKGx2X3VwZGF0ZUV4cHJlc3Npb25zXzExXzA9IHJ1bGVYRXhwcmVzc2lvbiApCisgICAgICAgICAgICAgICAgICAgIAkgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6Njk1ODo3OiBsdl91cGRhdGVFeHByZXNzaW9uc18xMV8wPSBydWxlWEV4cHJlc3Npb24KICAgICAgICAgICAgICAgICAgICAgCSAgICB7CiAgICAgICAgICAgICAgICAgICAgIAkgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAKICAgICAgICAgICAgICAgICAgICAgCSAgICAgIAkJCQkJCQluZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0WEJhc2ljRm9yTG9vcEV4cHJlc3Npb25BY2Nlc3MoKS5nZXRVcGRhdGVFeHByZXNzaW9uc1hFeHByZXNzaW9uUGFyc2VyUnVsZUNhbGxfN18xXzFfMCgpKTsKICAgICAgICAgICAgICAgICAgICAgCSAgICAgIAkJCQkJCQogICAgICAgICAgICAgICAgICAgICAJICAgIH0KLSAgICAgICAgICAgICAgICAgICAgCSAgICBwdXNoRm9sbG93KEZPTExPV182MSk7CisgICAgICAgICAgICAgICAgICAgIAkgICAgcHVzaEZvbGxvdyhGT0xMT1dfNzUpOwogICAgICAgICAgICAgICAgICAgICAJICAgIGx2X3VwZGF0ZUV4cHJlc3Npb25zXzExXzA9cnVsZVhFeHByZXNzaW9uKCk7CiAKICAgICAgICAgICAgICAgICAgICAgCSAgICBzdGF0ZS5fZnNwLS07CkBAIC0xNzc1Nyw3ICsxODk1MSw3IEBACiAgICAgICAgICAgICAgICAgICAgIAkgICAgYnJlYWs7CiAKICAgICAgICAgICAgICAgICAgICAgCWRlZmF1bHQgOgotICAgICAgICAgICAgICAgICAgICAJICAgIGJyZWFrIGxvb3AxMTI7CisgICAgICAgICAgICAgICAgICAgIAkgICAgYnJlYWsgbG9vcDEyMzsKICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgfSB3aGlsZSAodHJ1ZSk7CiAKQEAgLTE3NzY3LDE3ICsxODk2MSwxNyBAQAogCiAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgIG90aGVybHZfMTI9KFRva2VuKW1hdGNoKGlucHV0LDc2LEZPTExPV182NCk7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OworICAgICAgICAgICAgb3RoZXJsdl8xMj0oVG9rZW4pbWF0Y2goaW5wdXQsODMsRk9MTE9XXzc4KTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKIAogICAgICAgICAgICAgICAJCQluZXdMZWFmTm9kZShvdGhlcmx2XzEyLCBncmFtbWFyQWNjZXNzLmdldFhCYXNpY0Zvckxvb3BFeHByZXNzaW9uQWNjZXNzKCkuZ2V0UmlnaHRQYXJlbnRoZXNpc0tleXdvcmRfOCgpKTsKICAgICAgICAgICAgICAgCQkKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjY1NDI6MzogKCAobHZfZWFjaEV4cHJlc3Npb25fMTNfMD0gcnVsZVhFeHByZXNzaW9uICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NjU0Mzo0OiAobHZfZWFjaEV4cHJlc3Npb25fMTNfMD0gcnVsZVhFeHByZXNzaW9uICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjY5ODE6MzogKCAobHZfZWFjaEV4cHJlc3Npb25fMTNfMD0gcnVsZVhFeHByZXNzaW9uICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6Njk4Mjo0OiAobHZfZWFjaEV4cHJlc3Npb25fMTNfMD0gcnVsZVhFeHByZXNzaW9uICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjY1NDM6NDogKGx2X2VhY2hFeHByZXNzaW9uXzEzXzA9IHJ1bGVYRXhwcmVzc2lvbiApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo2NTQ0OjU6IGx2X2VhY2hFeHByZXNzaW9uXzEzXzA9IHJ1bGVYRXhwcmVzc2lvbgorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6Njk4Mjo0OiAobHZfZWFjaEV4cHJlc3Npb25fMTNfMD0gcnVsZVhFeHByZXNzaW9uICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjY5ODM6NTogbHZfZWFjaEV4cHJlc3Npb25fMTNfMD0gcnVsZVhFeHByZXNzaW9uCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKIApAQCAtMTc4MzMsNyArMTkwMjcsNyBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgImVudHJ5UnVsZVhXaGlsZUV4cHJlc3Npb24iCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NjU2NToxOiBlbnRyeVJ1bGVYV2hpbGVFeHByZXNzaW9uIHJldHVybnMgW0VPYmplY3QgY3VycmVudD1udWxsXSA6IGl2X3J1bGVYV2hpbGVFeHByZXNzaW9uPSBydWxlWFdoaWxlRXhwcmVzc2lvbiBFT0YgOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjcwMDQ6MTogZW50cnlSdWxlWFdoaWxlRXhwcmVzc2lvbiByZXR1cm5zIFtFT2JqZWN0IGN1cnJlbnQ9bnVsbF0gOiBpdl9ydWxlWFdoaWxlRXhwcmVzc2lvbj0gcnVsZVhXaGlsZUV4cHJlc3Npb24gRU9GIDsKICAgICBwdWJsaWMgZmluYWwgRU9iamVjdCBlbnRyeVJ1bGVYV2hpbGVFeHByZXNzaW9uKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKICAgICAgICAgRU9iamVjdCBjdXJyZW50ID0gbnVsbDsKIApAQCAtMTc4NDEsOCArMTkwMzUsOCBAQAogCiAKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjY1NjU6NTc6IChpdl9ydWxlWFdoaWxlRXhwcmVzc2lvbj0gcnVsZVhXaGlsZUV4cHJlc3Npb24gRU9GICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjY1NjY6MjogaXZfcnVsZVhXaGlsZUV4cHJlc3Npb249IHJ1bGVYV2hpbGVFeHByZXNzaW9uIEVPRgorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NzAwNDo1NzogKGl2X3J1bGVYV2hpbGVFeHByZXNzaW9uPSBydWxlWFdoaWxlRXhwcmVzc2lvbiBFT0YgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NzAwNToyOiBpdl9ydWxlWFdoaWxlRXhwcmVzc2lvbj0gcnVsZVhXaGlsZUV4cHJlc3Npb24gRU9GCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIG5ld0NvbXBvc2l0ZU5vZGUoZ3JhbW1hckFjY2Vzcy5nZXRYV2hpbGVFeHByZXNzaW9uUnVsZSgpKTsgCkBAIC0xNzg3Myw3ICsxOTA2Nyw3IEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZVhXaGlsZUV4cHJlc3Npb24iCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NjU3MjoxOiBydWxlWFdoaWxlRXhwcmVzc2lvbiByZXR1cm5zIFtFT2JqZWN0IGN1cnJlbnQ9bnVsbF0gOiAoICgpIG90aGVybHZfMT0gJ3doaWxlJyBvdGhlcmx2XzI9ICcoJyAoIChsdl9wcmVkaWNhdGVfM18wPSBydWxlWEV4cHJlc3Npb24gKSApIG90aGVybHZfND0gJyknICggKGx2X2JvZHlfNV8wPSBydWxlWEV4cHJlc3Npb24gKSApICkgOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjcwMTE6MTogcnVsZVhXaGlsZUV4cHJlc3Npb24gcmV0dXJucyBbRU9iamVjdCBjdXJyZW50PW51bGxdIDogKCAoKSBvdGhlcmx2XzE9ICd3aGlsZScgb3RoZXJsdl8yPSAnKCcgKCAobHZfcHJlZGljYXRlXzNfMD0gcnVsZVhFeHByZXNzaW9uICkgKSBvdGhlcmx2XzQ9ICcpJyAoIChsdl9ib2R5XzVfMD0gcnVsZVhFeHByZXNzaW9uICkgKSApIDsKICAgICBwdWJsaWMgZmluYWwgRU9iamVjdCBydWxlWFdoaWxlRXhwcmVzc2lvbigpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAgICAgICAgIEVPYmplY3QgY3VycmVudCA9IG51bGw7CiAKQEAgLTE3ODg5LDE0ICsxOTA4MywxNCBAQAogICAgICAgICAJZW50ZXJSdWxlKCk7CiAKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjY1Nzg6MjogKCAoICgpIG90aGVybHZfMT0gJ3doaWxlJyBvdGhlcmx2XzI9ICcoJyAoIChsdl9wcmVkaWNhdGVfM18wPSBydWxlWEV4cHJlc3Npb24gKSApIG90aGVybHZfND0gJyknICggKGx2X2JvZHlfNV8wPSBydWxlWEV4cHJlc3Npb24gKSApICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NjU3OToyOiAoICgpIG90aGVybHZfMT0gJ3doaWxlJyBvdGhlcmx2XzI9ICcoJyAoIChsdl9wcmVkaWNhdGVfM18wPSBydWxlWEV4cHJlc3Npb24gKSApIG90aGVybHZfND0gJyknICggKGx2X2JvZHlfNV8wPSBydWxlWEV4cHJlc3Npb24gKSApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjcwMTc6MjogKCAoICgpIG90aGVybHZfMT0gJ3doaWxlJyBvdGhlcmx2XzI9ICcoJyAoIChsdl9wcmVkaWNhdGVfM18wPSBydWxlWEV4cHJlc3Npb24gKSApIG90aGVybHZfND0gJyknICggKGx2X2JvZHlfNV8wPSBydWxlWEV4cHJlc3Npb24gKSApICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NzAxODoyOiAoICgpIG90aGVybHZfMT0gJ3doaWxlJyBvdGhlcmx2XzI9ICcoJyAoIChsdl9wcmVkaWNhdGVfM18wPSBydWxlWEV4cHJlc3Npb24gKSApIG90aGVybHZfND0gJyknICggKGx2X2JvZHlfNV8wPSBydWxlWEV4cHJlc3Npb24gKSApICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjY1Nzk6MjogKCAoKSBvdGhlcmx2XzE9ICd3aGlsZScgb3RoZXJsdl8yPSAnKCcgKCAobHZfcHJlZGljYXRlXzNfMD0gcnVsZVhFeHByZXNzaW9uICkgKSBvdGhlcmx2XzQ9ICcpJyAoIChsdl9ib2R5XzVfMD0gcnVsZVhFeHByZXNzaW9uICkgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo2NTgwOjM6ICgpIG90aGVybHZfMT0gJ3doaWxlJyBvdGhlcmx2XzI9ICcoJyAoIChsdl9wcmVkaWNhdGVfM18wPSBydWxlWEV4cHJlc3Npb24gKSApIG90aGVybHZfND0gJyknICggKGx2X2JvZHlfNV8wPSBydWxlWEV4cHJlc3Npb24gKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo3MDE4OjI6ICggKCkgb3RoZXJsdl8xPSAnd2hpbGUnIG90aGVybHZfMj0gJygnICggKGx2X3ByZWRpY2F0ZV8zXzA9IHJ1bGVYRXhwcmVzc2lvbiApICkgb3RoZXJsdl80PSAnKScgKCAobHZfYm9keV81XzA9IHJ1bGVYRXhwcmVzc2lvbiApICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NzAxOTozOiAoKSBvdGhlcmx2XzE9ICd3aGlsZScgb3RoZXJsdl8yPSAnKCcgKCAobHZfcHJlZGljYXRlXzNfMD0gcnVsZVhFeHByZXNzaW9uICkgKSBvdGhlcmx2XzQ9ICcpJyAoIChsdl9ib2R5XzVfMD0gcnVsZVhFeHByZXNzaW9uICkgKQogICAgICAgICAgICAgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NjU4MDozOiAoKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NjU4MTo0OiAKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjcwMTk6MzogKCkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjcwMjA6NDogCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKIApAQCAtMTc5MDgsMzAgKzE5MTAyLDMwIEBACiAKICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgb3RoZXJsdl8xPShUb2tlbiltYXRjaChpbnB1dCwxMTksRk9MTE9XXzEwMik7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OworICAgICAgICAgICAgb3RoZXJsdl8xPShUb2tlbiltYXRjaChpbnB1dCwxMjYsRk9MTE9XXzExNik7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OwogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAKICAgICAgICAgICAgICAgCQkJbmV3TGVhZk5vZGUob3RoZXJsdl8xLCBncmFtbWFyQWNjZXNzLmdldFhXaGlsZUV4cHJlc3Npb25BY2Nlc3MoKS5nZXRXaGlsZUtleXdvcmRfMSgpKTsKICAgICAgICAgICAgICAgCQkKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG90aGVybHZfMj0oVG9rZW4pbWF0Y2goaW5wdXQsNzQsRk9MTE9XXzY0KTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7CisgICAgICAgICAgICBvdGhlcmx2XzI9KFRva2VuKW1hdGNoKGlucHV0LDgxLEZPTExPV183OCk7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OwogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAKICAgICAgICAgICAgICAgCQkJbmV3TGVhZk5vZGUob3RoZXJsdl8yLCBncmFtbWFyQWNjZXNzLmdldFhXaGlsZUV4cHJlc3Npb25BY2Nlc3MoKS5nZXRMZWZ0UGFyZW50aGVzaXNLZXl3b3JkXzIoKSk7CiAgICAgICAgICAgICAgIAkJCiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo2NTk1OjM6ICggKGx2X3ByZWRpY2F0ZV8zXzA9IHJ1bGVYRXhwcmVzc2lvbiApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjY1OTY6NDogKGx2X3ByZWRpY2F0ZV8zXzA9IHJ1bGVYRXhwcmVzc2lvbiApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo3MDM0OjM6ICggKGx2X3ByZWRpY2F0ZV8zXzA9IHJ1bGVYRXhwcmVzc2lvbiApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjcwMzU6NDogKGx2X3ByZWRpY2F0ZV8zXzA9IHJ1bGVYRXhwcmVzc2lvbiApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo2NTk2OjQ6IChsdl9wcmVkaWNhdGVfM18wPSBydWxlWEV4cHJlc3Npb24gKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NjU5Nzo1OiBsdl9wcmVkaWNhdGVfM18wPSBydWxlWEV4cHJlc3Npb24KKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjcwMzU6NDogKGx2X3ByZWRpY2F0ZV8zXzA9IHJ1bGVYRXhwcmVzc2lvbiApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo3MDM2OjU6IGx2X3ByZWRpY2F0ZV8zXzA9IHJ1bGVYRXhwcmVzc2lvbgogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAKICAgICAgICAgICAgICAgCQkJCQluZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0WFdoaWxlRXhwcmVzc2lvbkFjY2VzcygpLmdldFByZWRpY2F0ZVhFeHByZXNzaW9uUGFyc2VyUnVsZUNhbGxfM18wKCkpOwogICAgICAgICAgICAgICAJCQkJCiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV182Mik7CisgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV183Nik7CiAgICAgICAgICAgICBsdl9wcmVkaWNhdGVfM18wPXJ1bGVYRXhwcmVzc2lvbigpOwogCiAgICAgICAgICAgICBzdGF0ZS5fZnNwLS07CkBAIC0xNzk1NSwxNyArMTkxNDksMTcgQEAKIAogICAgICAgICAgICAgfQogCi0gICAgICAgICAgICBvdGhlcmx2XzQ9KFRva2VuKW1hdGNoKGlucHV0LDc2LEZPTExPV182NCk7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OworICAgICAgICAgICAgb3RoZXJsdl80PShUb2tlbiltYXRjaChpbnB1dCw4MyxGT0xMT1dfNzgpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gY3VycmVudDsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogCiAgICAgICAgICAgICAgIAkJCW5ld0xlYWZOb2RlKG90aGVybHZfNCwgZ3JhbW1hckFjY2Vzcy5nZXRYV2hpbGVFeHByZXNzaW9uQWNjZXNzKCkuZ2V0UmlnaHRQYXJlbnRoZXNpc0tleXdvcmRfNCgpKTsKICAgICAgICAgICAgICAgCQkKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjY2MTg6MzogKCAobHZfYm9keV81XzA9IHJ1bGVYRXhwcmVzc2lvbiApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjY2MTk6NDogKGx2X2JvZHlfNV8wPSBydWxlWEV4cHJlc3Npb24gKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NzA1NzozOiAoIChsdl9ib2R5XzVfMD0gcnVsZVhFeHByZXNzaW9uICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NzA1ODo0OiAobHZfYm9keV81XzA9IHJ1bGVYRXhwcmVzc2lvbiApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo2NjE5OjQ6IChsdl9ib2R5XzVfMD0gcnVsZVhFeHByZXNzaW9uICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjY2MjA6NTogbHZfYm9keV81XzA9IHJ1bGVYRXhwcmVzc2lvbgorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NzA1ODo0OiAobHZfYm9keV81XzA9IHJ1bGVYRXhwcmVzc2lvbiApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo3MDU5OjU6IGx2X2JvZHlfNV8wPSBydWxlWEV4cHJlc3Npb24KICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogCkBAIC0xODAyMSw3ICsxOTIxNSw3IEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAiZW50cnlSdWxlWERvV2hpbGVFeHByZXNzaW9uIgotICAgIC8vIEludGVybmFsRGF0YURTTC5nOjY2NDE6MTogZW50cnlSdWxlWERvV2hpbGVFeHByZXNzaW9uIHJldHVybnMgW0VPYmplY3QgY3VycmVudD1udWxsXSA6IGl2X3J1bGVYRG9XaGlsZUV4cHJlc3Npb249IHJ1bGVYRG9XaGlsZUV4cHJlc3Npb24gRU9GIDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo3MDgwOjE6IGVudHJ5UnVsZVhEb1doaWxlRXhwcmVzc2lvbiByZXR1cm5zIFtFT2JqZWN0IGN1cnJlbnQ9bnVsbF0gOiBpdl9ydWxlWERvV2hpbGVFeHByZXNzaW9uPSBydWxlWERvV2hpbGVFeHByZXNzaW9uIEVPRiA7CiAgICAgcHVibGljIGZpbmFsIEVPYmplY3QgZW50cnlSdWxlWERvV2hpbGVFeHByZXNzaW9uKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKICAgICAgICAgRU9iamVjdCBjdXJyZW50ID0gbnVsbDsKIApAQCAtMTgwMjksOCArMTkyMjMsOCBAQAogCiAKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjY2NDE6NTk6IChpdl9ydWxlWERvV2hpbGVFeHByZXNzaW9uPSBydWxlWERvV2hpbGVFeHByZXNzaW9uIEVPRiApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo2NjQyOjI6IGl2X3J1bGVYRG9XaGlsZUV4cHJlc3Npb249IHJ1bGVYRG9XaGlsZUV4cHJlc3Npb24gRU9GCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo3MDgwOjU5OiAoaXZfcnVsZVhEb1doaWxlRXhwcmVzc2lvbj0gcnVsZVhEb1doaWxlRXhwcmVzc2lvbiBFT0YgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NzA4MToyOiBpdl9ydWxlWERvV2hpbGVFeHByZXNzaW9uPSBydWxlWERvV2hpbGVFeHByZXNzaW9uIEVPRgogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBuZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0WERvV2hpbGVFeHByZXNzaW9uUnVsZSgpKTsgCkBAIC0xODA2MSw3ICsxOTI1NSw3IEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZVhEb1doaWxlRXhwcmVzc2lvbiIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo2NjQ4OjE6IHJ1bGVYRG9XaGlsZUV4cHJlc3Npb24gcmV0dXJucyBbRU9iamVjdCBjdXJyZW50PW51bGxdIDogKCAoKSBvdGhlcmx2XzE9ICdkbycgKCAobHZfYm9keV8yXzA9IHJ1bGVYRXhwcmVzc2lvbiApICkgb3RoZXJsdl8zPSAnd2hpbGUnIG90aGVybHZfND0gJygnICggKGx2X3ByZWRpY2F0ZV81XzA9IHJ1bGVYRXhwcmVzc2lvbiApICkgb3RoZXJsdl82PSAnKScgKSA7CisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NzA4NzoxOiBydWxlWERvV2hpbGVFeHByZXNzaW9uIHJldHVybnMgW0VPYmplY3QgY3VycmVudD1udWxsXSA6ICggKCkgb3RoZXJsdl8xPSAnZG8nICggKGx2X2JvZHlfMl8wPSBydWxlWEV4cHJlc3Npb24gKSApIG90aGVybHZfMz0gJ3doaWxlJyBvdGhlcmx2XzQ9ICcoJyAoIChsdl9wcmVkaWNhdGVfNV8wPSBydWxlWEV4cHJlc3Npb24gKSApIG90aGVybHZfNj0gJyknICkgOwogICAgIHB1YmxpYyBmaW5hbCBFT2JqZWN0IHJ1bGVYRG9XaGlsZUV4cHJlc3Npb24oKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogICAgICAgICBFT2JqZWN0IGN1cnJlbnQgPSBudWxsOwogCkBAIC0xODA3OCwxNCArMTkyNzIsMTQgQEAKICAgICAgICAgCWVudGVyUnVsZSgpOwogCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo2NjU0OjI6ICggKCAoKSBvdGhlcmx2XzE9ICdkbycgKCAobHZfYm9keV8yXzA9IHJ1bGVYRXhwcmVzc2lvbiApICkgb3RoZXJsdl8zPSAnd2hpbGUnIG90aGVybHZfND0gJygnICggKGx2X3ByZWRpY2F0ZV81XzA9IHJ1bGVYRXhwcmVzc2lvbiApICkgb3RoZXJsdl82PSAnKScgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo2NjU1OjI6ICggKCkgb3RoZXJsdl8xPSAnZG8nICggKGx2X2JvZHlfMl8wPSBydWxlWEV4cHJlc3Npb24gKSApIG90aGVybHZfMz0gJ3doaWxlJyBvdGhlcmx2XzQ9ICcoJyAoIChsdl9wcmVkaWNhdGVfNV8wPSBydWxlWEV4cHJlc3Npb24gKSApIG90aGVybHZfNj0gJyknICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjcwOTM6MjogKCAoICgpIG90aGVybHZfMT0gJ2RvJyAoIChsdl9ib2R5XzJfMD0gcnVsZVhFeHByZXNzaW9uICkgKSBvdGhlcmx2XzM9ICd3aGlsZScgb3RoZXJsdl80PSAnKCcgKCAobHZfcHJlZGljYXRlXzVfMD0gcnVsZVhFeHByZXNzaW9uICkgKSBvdGhlcmx2XzY9ICcpJyApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjcwOTQ6MjogKCAoKSBvdGhlcmx2XzE9ICdkbycgKCAobHZfYm9keV8yXzA9IHJ1bGVYRXhwcmVzc2lvbiApICkgb3RoZXJsdl8zPSAnd2hpbGUnIG90aGVybHZfND0gJygnICggKGx2X3ByZWRpY2F0ZV81XzA9IHJ1bGVYRXhwcmVzc2lvbiApICkgb3RoZXJsdl82PSAnKScgKQogICAgICAgICAgICAgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NjY1NToyOiAoICgpIG90aGVybHZfMT0gJ2RvJyAoIChsdl9ib2R5XzJfMD0gcnVsZVhFeHByZXNzaW9uICkgKSBvdGhlcmx2XzM9ICd3aGlsZScgb3RoZXJsdl80PSAnKCcgKCAobHZfcHJlZGljYXRlXzVfMD0gcnVsZVhFeHByZXNzaW9uICkgKSBvdGhlcmx2XzY9ICcpJyApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo2NjU2OjM6ICgpIG90aGVybHZfMT0gJ2RvJyAoIChsdl9ib2R5XzJfMD0gcnVsZVhFeHByZXNzaW9uICkgKSBvdGhlcmx2XzM9ICd3aGlsZScgb3RoZXJsdl80PSAnKCcgKCAobHZfcHJlZGljYXRlXzVfMD0gcnVsZVhFeHByZXNzaW9uICkgKSBvdGhlcmx2XzY9ICcpJworICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NzA5NDoyOiAoICgpIG90aGVybHZfMT0gJ2RvJyAoIChsdl9ib2R5XzJfMD0gcnVsZVhFeHByZXNzaW9uICkgKSBvdGhlcmx2XzM9ICd3aGlsZScgb3RoZXJsdl80PSAnKCcgKCAobHZfcHJlZGljYXRlXzVfMD0gcnVsZVhFeHByZXNzaW9uICkgKSBvdGhlcmx2XzY9ICcpJyApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo3MDk1OjM6ICgpIG90aGVybHZfMT0gJ2RvJyAoIChsdl9ib2R5XzJfMD0gcnVsZVhFeHByZXNzaW9uICkgKSBvdGhlcmx2XzM9ICd3aGlsZScgb3RoZXJsdl80PSAnKCcgKCAobHZfcHJlZGljYXRlXzVfMD0gcnVsZVhFeHByZXNzaW9uICkgKSBvdGhlcmx2XzY9ICcpJwogICAgICAgICAgICAgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NjY1NjozOiAoKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NjY1Nzo0OiAKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjcwOTU6MzogKCkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjcwOTY6NDogCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKIApAQCAtMTgwOTcsMjQgKzE5MjkxLDI0IEBACiAKICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgb3RoZXJsdl8xPShUb2tlbiltYXRjaChpbnB1dCwxMjAsRk9MTE9XXzY0KTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7CisgICAgICAgICAgICBvdGhlcmx2XzE9KFRva2VuKW1hdGNoKGlucHV0LDEyNyxGT0xMT1dfNzgpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gY3VycmVudDsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogCiAgICAgICAgICAgICAgIAkJCW5ld0xlYWZOb2RlKG90aGVybHZfMSwgZ3JhbW1hckFjY2Vzcy5nZXRYRG9XaGlsZUV4cHJlc3Npb25BY2Nlc3MoKS5nZXREb0tleXdvcmRfMSgpKTsKICAgICAgICAgICAgICAgCQkKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjY2Njc6MzogKCAobHZfYm9keV8yXzA9IHJ1bGVYRXhwcmVzc2lvbiApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjY2Njg6NDogKGx2X2JvZHlfMl8wPSBydWxlWEV4cHJlc3Npb24gKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NzEwNjozOiAoIChsdl9ib2R5XzJfMD0gcnVsZVhFeHByZXNzaW9uICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NzEwNzo0OiAobHZfYm9keV8yXzA9IHJ1bGVYRXhwcmVzc2lvbiApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo2NjY4OjQ6IChsdl9ib2R5XzJfMD0gcnVsZVhFeHByZXNzaW9uICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjY2Njk6NTogbHZfYm9keV8yXzA9IHJ1bGVYRXhwcmVzc2lvbgorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NzEwNzo0OiAobHZfYm9keV8yXzA9IHJ1bGVYRXhwcmVzc2lvbiApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo3MTA4OjU6IGx2X2JvZHlfMl8wPSBydWxlWEV4cHJlc3Npb24KICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogCiAgICAgICAgICAgICAgIAkJCQkJbmV3Q29tcG9zaXRlTm9kZShncmFtbWFyQWNjZXNzLmdldFhEb1doaWxlRXhwcmVzc2lvbkFjY2VzcygpLmdldEJvZHlYRXhwcmVzc2lvblBhcnNlclJ1bGVDYWxsXzJfMCgpKTsKICAgICAgICAgICAgICAgCQkJCQogICAgICAgICAgICAgfQotICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMTE1KTsKKyAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzEyOCk7CiAgICAgICAgICAgICBsdl9ib2R5XzJfMD1ydWxlWEV4cHJlc3Npb24oKTsKIAogICAgICAgICAgICAgc3RhdGUuX2ZzcC0tOwpAQCAtMTgxMzgsMzAgKzE5MzMyLDMwIEBACiAKICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgb3RoZXJsdl8zPShUb2tlbiltYXRjaChpbnB1dCwxMTksRk9MTE9XXzEwMik7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OworICAgICAgICAgICAgb3RoZXJsdl8zPShUb2tlbiltYXRjaChpbnB1dCwxMjYsRk9MTE9XXzExNik7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OwogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAKICAgICAgICAgICAgICAgCQkJbmV3TGVhZk5vZGUob3RoZXJsdl8zLCBncmFtbWFyQWNjZXNzLmdldFhEb1doaWxlRXhwcmVzc2lvbkFjY2VzcygpLmdldFdoaWxlS2V5d29yZF8zKCkpOwogICAgICAgICAgICAgICAJCQogICAgICAgICAgICAgfQotICAgICAgICAgICAgb3RoZXJsdl80PShUb2tlbiltYXRjaChpbnB1dCw3NCxGT0xMT1dfNjQpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gY3VycmVudDsKKyAgICAgICAgICAgIG90aGVybHZfND0oVG9rZW4pbWF0Y2goaW5wdXQsODEsRk9MTE9XXzc4KTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKIAogICAgICAgICAgICAgICAJCQluZXdMZWFmTm9kZShvdGhlcmx2XzQsIGdyYW1tYXJBY2Nlc3MuZ2V0WERvV2hpbGVFeHByZXNzaW9uQWNjZXNzKCkuZ2V0TGVmdFBhcmVudGhlc2lzS2V5d29yZF80KCkpOwogICAgICAgICAgICAgICAJCQogICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NjY5NDozOiAoIChsdl9wcmVkaWNhdGVfNV8wPSBydWxlWEV4cHJlc3Npb24gKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo2Njk1OjQ6IChsdl9wcmVkaWNhdGVfNV8wPSBydWxlWEV4cHJlc3Npb24gKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NzEzMzozOiAoIChsdl9wcmVkaWNhdGVfNV8wPSBydWxlWEV4cHJlc3Npb24gKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo3MTM0OjQ6IChsdl9wcmVkaWNhdGVfNV8wPSBydWxlWEV4cHJlc3Npb24gKQogICAgICAgICAgICAgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NjY5NTo0OiAobHZfcHJlZGljYXRlXzVfMD0gcnVsZVhFeHByZXNzaW9uICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjY2OTY6NTogbHZfcHJlZGljYXRlXzVfMD0gcnVsZVhFeHByZXNzaW9uCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo3MTM0OjQ6IChsdl9wcmVkaWNhdGVfNV8wPSBydWxlWEV4cHJlc3Npb24gKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NzEzNTo1OiBsdl9wcmVkaWNhdGVfNV8wPSBydWxlWEV4cHJlc3Npb24KICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogCiAgICAgICAgICAgICAgIAkJCQkJbmV3Q29tcG9zaXRlTm9kZShncmFtbWFyQWNjZXNzLmdldFhEb1doaWxlRXhwcmVzc2lvbkFjY2VzcygpLmdldFByZWRpY2F0ZVhFeHByZXNzaW9uUGFyc2VyUnVsZUNhbGxfNV8wKCkpOwogICAgICAgICAgICAgICAJCQkJCiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV182Mik7CisgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV183Nik7CiAgICAgICAgICAgICBsdl9wcmVkaWNhdGVfNV8wPXJ1bGVYRXhwcmVzc2lvbigpOwogCiAgICAgICAgICAgICBzdGF0ZS5fZnNwLS07CkBAIC0xODE4NSw3ICsxOTM3OSw3IEBACiAKICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgb3RoZXJsdl82PShUb2tlbiltYXRjaChpbnB1dCw3NixGT0xMT1dfMik7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OworICAgICAgICAgICAgb3RoZXJsdl82PShUb2tlbiltYXRjaChpbnB1dCw4MyxGT0xMT1dfMik7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OwogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAKICAgICAgICAgICAgICAgCQkJbmV3TGVhZk5vZGUob3RoZXJsdl82LCBncmFtbWFyQWNjZXNzLmdldFhEb1doaWxlRXhwcmVzc2lvbkFjY2VzcygpLmdldFJpZ2h0UGFyZW50aGVzaXNLZXl3b3JkXzYoKSk7CkBAIC0xODIxNiw3ICsxOTQxMCw3IEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAiZW50cnlSdWxlWEJsb2NrRXhwcmVzc2lvbiIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo2NzIxOjE6IGVudHJ5UnVsZVhCbG9ja0V4cHJlc3Npb24gcmV0dXJucyBbRU9iamVjdCBjdXJyZW50PW51bGxdIDogaXZfcnVsZVhCbG9ja0V4cHJlc3Npb249IHJ1bGVYQmxvY2tFeHByZXNzaW9uIEVPRiA7CisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NzE2MDoxOiBlbnRyeVJ1bGVYQmxvY2tFeHByZXNzaW9uIHJldHVybnMgW0VPYmplY3QgY3VycmVudD1udWxsXSA6IGl2X3J1bGVYQmxvY2tFeHByZXNzaW9uPSBydWxlWEJsb2NrRXhwcmVzc2lvbiBFT0YgOwogICAgIHB1YmxpYyBmaW5hbCBFT2JqZWN0IGVudHJ5UnVsZVhCbG9ja0V4cHJlc3Npb24oKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogICAgICAgICBFT2JqZWN0IGN1cnJlbnQgPSBudWxsOwogCkBAIC0xODIyNCw4ICsxOTQxOCw4IEBACiAKIAogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NjcyMTo1NzogKGl2X3J1bGVYQmxvY2tFeHByZXNzaW9uPSBydWxlWEJsb2NrRXhwcmVzc2lvbiBFT0YgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NjcyMjoyOiBpdl9ydWxlWEJsb2NrRXhwcmVzc2lvbj0gcnVsZVhCbG9ja0V4cHJlc3Npb24gRU9GCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo3MTYwOjU3OiAoaXZfcnVsZVhCbG9ja0V4cHJlc3Npb249IHJ1bGVYQmxvY2tFeHByZXNzaW9uIEVPRiApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo3MTYxOjI6IGl2X3J1bGVYQmxvY2tFeHByZXNzaW9uPSBydWxlWEJsb2NrRXhwcmVzc2lvbiBFT0YKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgbmV3Q29tcG9zaXRlTm9kZShncmFtbWFyQWNjZXNzLmdldFhCbG9ja0V4cHJlc3Npb25SdWxlKCkpOyAKQEAgLTE4MjU2LDcgKzE5NDUwLDcgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlWEJsb2NrRXhwcmVzc2lvbiIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo2NzI4OjE6IHJ1bGVYQmxvY2tFeHByZXNzaW9uIHJldHVybnMgW0VPYmplY3QgY3VycmVudD1udWxsXSA6ICggKCkgb3RoZXJsdl8xPSAneycgKCAoIChsdl9leHByZXNzaW9uc18yXzA9IHJ1bGVYRXhwcmVzc2lvbk9yVmFyRGVjbGFyYXRpb24gKSApIChvdGhlcmx2XzM9ICc7JyApPyApKiBvdGhlcmx2XzQ9ICd9JyApIDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo3MTY3OjE6IHJ1bGVYQmxvY2tFeHByZXNzaW9uIHJldHVybnMgW0VPYmplY3QgY3VycmVudD1udWxsXSA6ICggKCkgb3RoZXJsdl8xPSAneycgKCAoIChsdl9leHByZXNzaW9uc18yXzA9IHJ1bGVYRXhwcmVzc2lvbk9yVmFyRGVjbGFyYXRpb24gKSApIChvdGhlcmx2XzM9ICc7JyApPyApKiBvdGhlcmx2XzQ9ICd9JyApIDsKICAgICBwdWJsaWMgZmluYWwgRU9iamVjdCBydWxlWEJsb2NrRXhwcmVzc2lvbigpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAgICAgICAgIEVPYmplY3QgY3VycmVudCA9IG51bGw7CiAKQEAgLTE4MjcwLDE0ICsxOTQ2NCwxNCBAQAogICAgICAgICAJZW50ZXJSdWxlKCk7CiAKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjY3MzQ6MjogKCAoICgpIG90aGVybHZfMT0gJ3snICggKCAobHZfZXhwcmVzc2lvbnNfMl8wPSBydWxlWEV4cHJlc3Npb25PclZhckRlY2xhcmF0aW9uICkgKSAob3RoZXJsdl8zPSAnOycgKT8gKSogb3RoZXJsdl80PSAnfScgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo2NzM1OjI6ICggKCkgb3RoZXJsdl8xPSAneycgKCAoIChsdl9leHByZXNzaW9uc18yXzA9IHJ1bGVYRXhwcmVzc2lvbk9yVmFyRGVjbGFyYXRpb24gKSApIChvdGhlcmx2XzM9ICc7JyApPyApKiBvdGhlcmx2XzQ9ICd9JyApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo3MTczOjI6ICggKCAoKSBvdGhlcmx2XzE9ICd7JyAoICggKGx2X2V4cHJlc3Npb25zXzJfMD0gcnVsZVhFeHByZXNzaW9uT3JWYXJEZWNsYXJhdGlvbiApICkgKG90aGVybHZfMz0gJzsnICk/ICkqIG90aGVybHZfND0gJ30nICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NzE3NDoyOiAoICgpIG90aGVybHZfMT0gJ3snICggKCAobHZfZXhwcmVzc2lvbnNfMl8wPSBydWxlWEV4cHJlc3Npb25PclZhckRlY2xhcmF0aW9uICkgKSAob3RoZXJsdl8zPSAnOycgKT8gKSogb3RoZXJsdl80PSAnfScgKQogICAgICAgICAgICAgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NjczNToyOiAoICgpIG90aGVybHZfMT0gJ3snICggKCAobHZfZXhwcmVzc2lvbnNfMl8wPSBydWxlWEV4cHJlc3Npb25PclZhckRlY2xhcmF0aW9uICkgKSAob3RoZXJsdl8zPSAnOycgKT8gKSogb3RoZXJsdl80PSAnfScgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NjczNjozOiAoKSBvdGhlcmx2XzE9ICd7JyAoICggKGx2X2V4cHJlc3Npb25zXzJfMD0gcnVsZVhFeHByZXNzaW9uT3JWYXJEZWNsYXJhdGlvbiApICkgKG90aGVybHZfMz0gJzsnICk/ICkqIG90aGVybHZfND0gJ30nCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo3MTc0OjI6ICggKCkgb3RoZXJsdl8xPSAneycgKCAoIChsdl9leHByZXNzaW9uc18yXzA9IHJ1bGVYRXhwcmVzc2lvbk9yVmFyRGVjbGFyYXRpb24gKSApIChvdGhlcmx2XzM9ICc7JyApPyApKiBvdGhlcmx2XzQ9ICd9JyApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo3MTc1OjM6ICgpIG90aGVybHZfMT0gJ3snICggKCAobHZfZXhwcmVzc2lvbnNfMl8wPSBydWxlWEV4cHJlc3Npb25PclZhckRlY2xhcmF0aW9uICkgKSAob3RoZXJsdl8zPSAnOycgKT8gKSogb3RoZXJsdl80PSAnfScKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjY3MzY6MzogKCkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjY3Mzc6NDogCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo3MTc1OjM6ICgpCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo3MTc2OjQ6IAogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAKQEAgLTE4Mjg5LDM5ICsxOTQ4MywzOSBAQAogCiAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgIG90aGVybHZfMT0oVG9rZW4pbWF0Y2goaW5wdXQsMTUsRk9MTE9XXzExNik7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OworICAgICAgICAgICAgb3RoZXJsdl8xPShUb2tlbiltYXRjaChpbnB1dCwxNSxGT0xMT1dfMTI5KTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKIAogICAgICAgICAgICAgICAJCQluZXdMZWFmTm9kZShvdGhlcmx2XzEsIGdyYW1tYXJBY2Nlc3MuZ2V0WEJsb2NrRXhwcmVzc2lvbkFjY2VzcygpLmdldExlZnRDdXJseUJyYWNrZXRLZXl3b3JkXzEoKSk7CiAgICAgICAgICAgICAgIAkJCiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo2NzQ3OjM6ICggKCAobHZfZXhwcmVzc2lvbnNfMl8wPSBydWxlWEV4cHJlc3Npb25PclZhckRlY2xhcmF0aW9uICkgKSAob3RoZXJsdl8zPSAnOycgKT8gKSoKLSAgICAgICAgICAgIGxvb3AxMTU6CisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo3MTg2OjM6ICggKCAobHZfZXhwcmVzc2lvbnNfMl8wPSBydWxlWEV4cHJlc3Npb25PclZhckRlY2xhcmF0aW9uICkgKSAob3RoZXJsdl8zPSAnOycgKT8gKSoKKyAgICAgICAgICAgIGxvb3AxMjY6CiAgICAgICAgICAgICBkbyB7Ci0gICAgICAgICAgICAgICAgaW50IGFsdDExNT0yOwotICAgICAgICAgICAgICAgIGludCBMQTExNV8wID0gaW5wdXQuTEEoMSk7CisgICAgICAgICAgICAgICAgaW50IGFsdDEyNj0yOworICAgICAgICAgICAgICAgIGludCBMQTEyNl8wID0gaW5wdXQuTEEoMSk7CiAKLSAgICAgICAgICAgICAgICBpZiAoICgoTEExMTVfMD49UlVMRV9TVFJJTkcgJiYgTEExMTVfMDw9UlVMRV9ERUNJTUFMKXx8TEExMTVfMD09MTV8fExBMTE1XzA9PTQ2fHxMQTExNV8wPT02NXx8KExBMTE1XzA+PTY4ICYmIExBMTE1XzA8PTY5KXx8TEExMTVfMD09NzR8fChMQTExNV8wPj03OCAmJiBMQTExNV8wPD03OSl8fExBMTE1XzA9PTg2fHwoTEExMTVfMD49MTAyICYmIExBMTE1XzA8PTEwMyl8fExBMTE1XzA9PTEwN3x8TEExMTVfMD09MTEzfHxMQTExNV8wPT0xMTV8fChMQTExNV8wPj0xMTkgJiYgTEExMTVfMDw9MTMyKXx8TEExMTVfMD09MTM0KSApIHsKLSAgICAgICAgICAgICAgICAgICAgYWx0MTE1PTE7CisgICAgICAgICAgICAgICAgaWYgKCAoKExBMTI2XzA+PVJVTEVfU1RSSU5HICYmIExBMTI2XzA8PVJVTEVfREVDSU1BTCl8fExBMTI2XzA9PTE1fHxMQTEyNl8wPT01MHx8TEExMjZfMD09NzJ8fChMQTEyNl8wPj03NSAmJiBMQTEyNl8wPD03Nil8fExBMTI2XzA9PTgxfHwoTEExMjZfMD49ODUgJiYgTEExMjZfMDw9ODYpfHxMQTEyNl8wPT05M3x8KExBMTI2XzA+PTEwOSAmJiBMQTEyNl8wPD0xMTApfHxMQTEyNl8wPT0xMTR8fExBMTI2XzA9PTEyMHx8TEExMjZfMD09MTIyfHwoTEExMjZfMD49MTI2ICYmIExBMTI2XzA8PTEzOSl8fExBMTI2XzA9PTE0MSkgKSB7CisgICAgICAgICAgICAgICAgICAgIGFsdDEyNj0xOwogICAgICAgICAgICAgICAgIH0KIAogCi0gICAgICAgICAgICAgICAgc3dpdGNoIChhbHQxMTUpIHsKKyAgICAgICAgICAgICAgICBzd2l0Y2ggKGFsdDEyNikgewogICAgICAgICAgICAgCWNhc2UgMSA6Ci0gICAgICAgICAgICAJICAgIC8vIEludGVybmFsRGF0YURTTC5nOjY3NDg6NDogKCAobHZfZXhwcmVzc2lvbnNfMl8wPSBydWxlWEV4cHJlc3Npb25PclZhckRlY2xhcmF0aW9uICkgKSAob3RoZXJsdl8zPSAnOycgKT8KKyAgICAgICAgICAgIAkgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NzE4Nzo0OiAoIChsdl9leHByZXNzaW9uc18yXzA9IHJ1bGVYRXhwcmVzc2lvbk9yVmFyRGVjbGFyYXRpb24gKSApIChvdGhlcmx2XzM9ICc7JyApPwogICAgICAgICAgICAgCSAgICB7Ci0gICAgICAgICAgICAJICAgIC8vIEludGVybmFsRGF0YURTTC5nOjY3NDg6NDogKCAobHZfZXhwcmVzc2lvbnNfMl8wPSBydWxlWEV4cHJlc3Npb25PclZhckRlY2xhcmF0aW9uICkgKQotICAgICAgICAgICAgCSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo2NzQ5OjU6IChsdl9leHByZXNzaW9uc18yXzA9IHJ1bGVYRXhwcmVzc2lvbk9yVmFyRGVjbGFyYXRpb24gKQorICAgICAgICAgICAgCSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo3MTg3OjQ6ICggKGx2X2V4cHJlc3Npb25zXzJfMD0gcnVsZVhFeHByZXNzaW9uT3JWYXJEZWNsYXJhdGlvbiApICkKKyAgICAgICAgICAgIAkgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NzE4ODo1OiAobHZfZXhwcmVzc2lvbnNfMl8wPSBydWxlWEV4cHJlc3Npb25PclZhckRlY2xhcmF0aW9uICkKICAgICAgICAgICAgIAkgICAgewotICAgICAgICAgICAgCSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo2NzQ5OjU6IChsdl9leHByZXNzaW9uc18yXzA9IHJ1bGVYRXhwcmVzc2lvbk9yVmFyRGVjbGFyYXRpb24gKQotICAgICAgICAgICAgCSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo2NzUwOjY6IGx2X2V4cHJlc3Npb25zXzJfMD0gcnVsZVhFeHByZXNzaW9uT3JWYXJEZWNsYXJhdGlvbgorICAgICAgICAgICAgCSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo3MTg4OjU6IChsdl9leHByZXNzaW9uc18yXzA9IHJ1bGVYRXhwcmVzc2lvbk9yVmFyRGVjbGFyYXRpb24gKQorICAgICAgICAgICAgCSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo3MTg5OjY6IGx2X2V4cHJlc3Npb25zXzJfMD0gcnVsZVhFeHByZXNzaW9uT3JWYXJEZWNsYXJhdGlvbgogICAgICAgICAgICAgCSAgICB7CiAgICAgICAgICAgICAJICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogCiAgICAgICAgICAgICAJICAgICAgCQkJCQkJbmV3Q29tcG9zaXRlTm9kZShncmFtbWFyQWNjZXNzLmdldFhCbG9ja0V4cHJlc3Npb25BY2Nlc3MoKS5nZXRFeHByZXNzaW9uc1hFeHByZXNzaW9uT3JWYXJEZWNsYXJhdGlvblBhcnNlclJ1bGVDYWxsXzJfMF8wKCkpOwogICAgICAgICAgICAgCSAgICAgIAkJCQkJCiAgICAgICAgICAgICAJICAgIH0KLSAgICAgICAgICAgIAkgICAgcHVzaEZvbGxvdyhGT0xMT1dfMTE3KTsKKyAgICAgICAgICAgIAkgICAgcHVzaEZvbGxvdyhGT0xMT1dfMTMwKTsKICAgICAgICAgICAgIAkgICAgbHZfZXhwcmVzc2lvbnNfMl8wPXJ1bGVYRXhwcmVzc2lvbk9yVmFyRGVjbGFyYXRpb24oKTsKIAogICAgICAgICAgICAgCSAgICBzdGF0ZS5fZnNwLS07CkBAIC0xODM0NSwxOCArMTk1MzksMTggQEAKIAogICAgICAgICAgICAgCSAgICB9CiAKLSAgICAgICAgICAgIAkgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6Njc2Nzo0OiAob3RoZXJsdl8zPSAnOycgKT8KLSAgICAgICAgICAgIAkgICAgaW50IGFsdDExND0yOwotICAgICAgICAgICAgCSAgICBpbnQgTEExMTRfMCA9IGlucHV0LkxBKDEpOworICAgICAgICAgICAgCSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo3MjA2OjQ6IChvdGhlcmx2XzM9ICc7JyApPworICAgICAgICAgICAgCSAgICBpbnQgYWx0MTI1PTI7CisgICAgICAgICAgICAJICAgIGludCBMQTEyNV8wID0gaW5wdXQuTEEoMSk7CiAKLSAgICAgICAgICAgIAkgICAgaWYgKCAoTEExMTRfMD09NzIpICkgewotICAgICAgICAgICAgCSAgICAgICAgYWx0MTE0PTE7CisgICAgICAgICAgICAJICAgIGlmICggKExBMTI1XzA9PTc5KSApIHsKKyAgICAgICAgICAgIAkgICAgICAgIGFsdDEyNT0xOwogICAgICAgICAgICAgCSAgICB9Ci0gICAgICAgICAgICAJICAgIHN3aXRjaCAoYWx0MTE0KSB7CisgICAgICAgICAgICAJICAgIHN3aXRjaCAoYWx0MTI1KSB7CiAgICAgICAgICAgICAJICAgICAgICBjYXNlIDEgOgotICAgICAgICAgICAgCSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjY3Njg6NTogb3RoZXJsdl8zPSAnOycKKyAgICAgICAgICAgIAkgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo3MjA3OjU6IG90aGVybHZfMz0gJzsnCiAgICAgICAgICAgICAJICAgICAgICAgICAgewotICAgICAgICAgICAgCSAgICAgICAgICAgIG90aGVybHZfMz0oVG9rZW4pbWF0Y2goaW5wdXQsNzIsRk9MTE9XXzExNik7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OworICAgICAgICAgICAgCSAgICAgICAgICAgIG90aGVybHZfMz0oVG9rZW4pbWF0Y2goaW5wdXQsNzksRk9MTE9XXzEyOSk7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OwogICAgICAgICAgICAgCSAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogCiAgICAgICAgICAgICAJICAgICAgICAgICAgICAJCQkJCW5ld0xlYWZOb2RlKG90aGVybHZfMywgZ3JhbW1hckFjY2Vzcy5nZXRYQmxvY2tFeHByZXNzaW9uQWNjZXNzKCkuZ2V0U2VtaWNvbG9uS2V5d29yZF8yXzEoKSk7CkBAIC0xODM3Myw3ICsxOTU2Nyw3IEBACiAgICAgICAgICAgICAJICAgIGJyZWFrOwogCiAgICAgICAgICAgICAJZGVmYXVsdCA6Ci0gICAgICAgICAgICAJICAgIGJyZWFrIGxvb3AxMTU7CisgICAgICAgICAgICAJICAgIGJyZWFrIGxvb3AxMjY7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfSB3aGlsZSAodHJ1ZSk7CiAKQEAgLTE4NDA4LDcgKzE5NjAyLDcgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJlbnRyeVJ1bGVYRXhwcmVzc2lvbk9yVmFyRGVjbGFyYXRpb24iCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6Njc4MjoxOiBlbnRyeVJ1bGVYRXhwcmVzc2lvbk9yVmFyRGVjbGFyYXRpb24gcmV0dXJucyBbRU9iamVjdCBjdXJyZW50PW51bGxdIDogaXZfcnVsZVhFeHByZXNzaW9uT3JWYXJEZWNsYXJhdGlvbj0gcnVsZVhFeHByZXNzaW9uT3JWYXJEZWNsYXJhdGlvbiBFT0YgOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjcyMjE6MTogZW50cnlSdWxlWEV4cHJlc3Npb25PclZhckRlY2xhcmF0aW9uIHJldHVybnMgW0VPYmplY3QgY3VycmVudD1udWxsXSA6IGl2X3J1bGVYRXhwcmVzc2lvbk9yVmFyRGVjbGFyYXRpb249IHJ1bGVYRXhwcmVzc2lvbk9yVmFyRGVjbGFyYXRpb24gRU9GIDsKICAgICBwdWJsaWMgZmluYWwgRU9iamVjdCBlbnRyeVJ1bGVYRXhwcmVzc2lvbk9yVmFyRGVjbGFyYXRpb24oKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogICAgICAgICBFT2JqZWN0IGN1cnJlbnQgPSBudWxsOwogCkBAIC0xODQxNiw4ICsxOTYxMCw4IEBACiAKIAogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6Njc4Mjo2ODogKGl2X3J1bGVYRXhwcmVzc2lvbk9yVmFyRGVjbGFyYXRpb249IHJ1bGVYRXhwcmVzc2lvbk9yVmFyRGVjbGFyYXRpb24gRU9GICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjY3ODM6MjogaXZfcnVsZVhFeHByZXNzaW9uT3JWYXJEZWNsYXJhdGlvbj0gcnVsZVhFeHByZXNzaW9uT3JWYXJEZWNsYXJhdGlvbiBFT0YKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjcyMjE6Njg6IChpdl9ydWxlWEV4cHJlc3Npb25PclZhckRlY2xhcmF0aW9uPSBydWxlWEV4cHJlc3Npb25PclZhckRlY2xhcmF0aW9uIEVPRiApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo3MjIyOjI6IGl2X3J1bGVYRXhwcmVzc2lvbk9yVmFyRGVjbGFyYXRpb249IHJ1bGVYRXhwcmVzc2lvbk9yVmFyRGVjbGFyYXRpb24gRU9GCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIG5ld0NvbXBvc2l0ZU5vZGUoZ3JhbW1hckFjY2Vzcy5nZXRYRXhwcmVzc2lvbk9yVmFyRGVjbGFyYXRpb25SdWxlKCkpOyAKQEAgLTE4NDQ4LDcgKzE5NjQyLDcgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlWEV4cHJlc3Npb25PclZhckRlY2xhcmF0aW9uIgotICAgIC8vIEludGVybmFsRGF0YURTTC5nOjY3ODk6MTogcnVsZVhFeHByZXNzaW9uT3JWYXJEZWNsYXJhdGlvbiByZXR1cm5zIFtFT2JqZWN0IGN1cnJlbnQ9bnVsbF0gOiAodGhpc19YVmFyaWFibGVEZWNsYXJhdGlvbl8wPSBydWxlWFZhcmlhYmxlRGVjbGFyYXRpb24gfCB0aGlzX1hFeHByZXNzaW9uXzE9IHJ1bGVYRXhwcmVzc2lvbiApIDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo3MjI4OjE6IHJ1bGVYRXhwcmVzc2lvbk9yVmFyRGVjbGFyYXRpb24gcmV0dXJucyBbRU9iamVjdCBjdXJyZW50PW51bGxdIDogKHRoaXNfWFZhcmlhYmxlRGVjbGFyYXRpb25fMD0gcnVsZVhWYXJpYWJsZURlY2xhcmF0aW9uIHwgdGhpc19YRXhwcmVzc2lvbl8xPSBydWxlWEV4cHJlc3Npb24gKSA7CiAgICAgcHVibGljIGZpbmFsIEVPYmplY3QgcnVsZVhFeHByZXNzaW9uT3JWYXJEZWNsYXJhdGlvbigpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAgICAgICAgIEVPYmplY3QgY3VycmVudCA9IG51bGw7CiAKQEAgLTE4NDYxLDI5ICsxOTY1NSwyOSBAQAogICAgICAgICAJZW50ZXJSdWxlKCk7CiAKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjY3OTU6MjogKCAodGhpc19YVmFyaWFibGVEZWNsYXJhdGlvbl8wPSBydWxlWFZhcmlhYmxlRGVjbGFyYXRpb24gfCB0aGlzX1hFeHByZXNzaW9uXzE9IHJ1bGVYRXhwcmVzc2lvbiApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjY3OTY6MjogKHRoaXNfWFZhcmlhYmxlRGVjbGFyYXRpb25fMD0gcnVsZVhWYXJpYWJsZURlY2xhcmF0aW9uIHwgdGhpc19YRXhwcmVzc2lvbl8xPSBydWxlWEV4cHJlc3Npb24gKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NzIzNDoyOiAoICh0aGlzX1hWYXJpYWJsZURlY2xhcmF0aW9uXzA9IHJ1bGVYVmFyaWFibGVEZWNsYXJhdGlvbiB8IHRoaXNfWEV4cHJlc3Npb25fMT0gcnVsZVhFeHByZXNzaW9uICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NzIzNToyOiAodGhpc19YVmFyaWFibGVEZWNsYXJhdGlvbl8wPSBydWxlWFZhcmlhYmxlRGVjbGFyYXRpb24gfCB0aGlzX1hFeHByZXNzaW9uXzE9IHJ1bGVYRXhwcmVzc2lvbiApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo2Nzk2OjI6ICh0aGlzX1hWYXJpYWJsZURlY2xhcmF0aW9uXzA9IHJ1bGVYVmFyaWFibGVEZWNsYXJhdGlvbiB8IHRoaXNfWEV4cHJlc3Npb25fMT0gcnVsZVhFeHByZXNzaW9uICkKLSAgICAgICAgICAgIGludCBhbHQxMTY9MjsKLSAgICAgICAgICAgIGludCBMQTExNl8wID0gaW5wdXQuTEEoMSk7CisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo3MjM1OjI6ICh0aGlzX1hWYXJpYWJsZURlY2xhcmF0aW9uXzA9IHJ1bGVYVmFyaWFibGVEZWNsYXJhdGlvbiB8IHRoaXNfWEV4cHJlc3Npb25fMT0gcnVsZVhFeHByZXNzaW9uICkKKyAgICAgICAgICAgIGludCBhbHQxMjc9MjsKKyAgICAgICAgICAgIGludCBMQTEyN18wID0gaW5wdXQuTEEoMSk7CiAKLSAgICAgICAgICAgIGlmICggKChMQTExNl8wPj0xMjEgJiYgTEExMTZfMDw9MTIyKSkgKSB7Ci0gICAgICAgICAgICAgICAgYWx0MTE2PTE7CisgICAgICAgICAgICBpZiAoICgoTEExMjdfMD49MTI4ICYmIExBMTI3XzA8PTEyOSkpICkgeworICAgICAgICAgICAgICAgIGFsdDEyNz0xOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSBpZiAoICgoTEExMTZfMD49UlVMRV9TVFJJTkcgJiYgTEExMTZfMDw9UlVMRV9ERUNJTUFMKXx8TEExMTZfMD09MTV8fExBMTE2XzA9PTQ2fHxMQTExNl8wPT02NXx8KExBMTE2XzA+PTY4ICYmIExBMTE2XzA8PTY5KXx8TEExMTZfMD09NzR8fChMQTExNl8wPj03OCAmJiBMQTExNl8wPD03OSl8fExBMTE2XzA9PTg2fHwoTEExMTZfMD49MTAyICYmIExBMTE2XzA8PTEwMyl8fExBMTE2XzA9PTEwN3x8TEExMTZfMD09MTEzfHxMQTExNl8wPT0xMTV8fChMQTExNl8wPj0xMTkgJiYgTEExMTZfMDw9MTIwKXx8KExBMTE2XzA+PTEyMyAmJiBMQTExNl8wPD0xMzIpfHxMQTExNl8wPT0xMzQpICkgewotICAgICAgICAgICAgICAgIGFsdDExNj0yOworICAgICAgICAgICAgZWxzZSBpZiAoICgoTEExMjdfMD49UlVMRV9TVFJJTkcgJiYgTEExMjdfMDw9UlVMRV9ERUNJTUFMKXx8TEExMjdfMD09MTV8fExBMTI3XzA9PTUwfHxMQTEyN18wPT03Mnx8KExBMTI3XzA+PTc1ICYmIExBMTI3XzA8PTc2KXx8TEExMjdfMD09ODF8fChMQTEyN18wPj04NSAmJiBMQTEyN18wPD04Nil8fExBMTI3XzA9PTkzfHwoTEExMjdfMD49MTA5ICYmIExBMTI3XzA8PTExMCl8fExBMTI3XzA9PTExNHx8TEExMjdfMD09MTIwfHxMQTEyN18wPT0xMjJ8fChMQTEyN18wPj0xMjYgJiYgTEExMjdfMDw9MTI3KXx8KExBMTI3XzA+PTEzMCAmJiBMQTEyN18wPD0xMzkpfHxMQTEyN18wPT0xNDEpICkgeworICAgICAgICAgICAgICAgIGFsdDEyNz0yOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgaWYgKHN0YXRlLmJhY2t0cmFja2luZz4wKSB7c3RhdGUuZmFpbGVkPXRydWU7IHJldHVybiBjdXJyZW50O30KICAgICAgICAgICAgICAgICBOb1ZpYWJsZUFsdEV4Y2VwdGlvbiBudmFlID0KLSAgICAgICAgICAgICAgICAgICAgbmV3IE5vVmlhYmxlQWx0RXhjZXB0aW9uKCIiLCAxMTYsIDAsIGlucHV0KTsKKyAgICAgICAgICAgICAgICAgICAgbmV3IE5vVmlhYmxlQWx0RXhjZXB0aW9uKCIiLCAxMjcsIDAsIGlucHV0KTsKIAogICAgICAgICAgICAgICAgIHRocm93IG52YWU7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBzd2l0Y2ggKGFsdDExNikgeworICAgICAgICAgICAgc3dpdGNoIChhbHQxMjcpIHsKICAgICAgICAgICAgICAgICBjYXNlIDEgOgotICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo2Nzk3OjM6IHRoaXNfWFZhcmlhYmxlRGVjbGFyYXRpb25fMD0gcnVsZVhWYXJpYWJsZURlY2xhcmF0aW9uCisgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjcyMzY6MzogdGhpc19YVmFyaWFibGVEZWNsYXJhdGlvbl8wPSBydWxlWFZhcmlhYmxlRGVjbGFyYXRpb24KICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKIApAQCAtMTg1MDUsNyArMTk2OTksNyBAQAogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgIGNhc2UgMiA6Ci0gICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjY4MDY6MzogdGhpc19YRXhwcmVzc2lvbl8xPSBydWxlWEV4cHJlc3Npb24KKyAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NzI0NTozOiB0aGlzX1hFeHByZXNzaW9uXzE9IHJ1bGVYRXhwcmVzc2lvbgogICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogCkBAIC0xODU1MSw3ICsxOTc0NSw3IEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAiZW50cnlSdWxlWFZhcmlhYmxlRGVjbGFyYXRpb24iCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NjgxODoxOiBlbnRyeVJ1bGVYVmFyaWFibGVEZWNsYXJhdGlvbiByZXR1cm5zIFtFT2JqZWN0IGN1cnJlbnQ9bnVsbF0gOiBpdl9ydWxlWFZhcmlhYmxlRGVjbGFyYXRpb249IHJ1bGVYVmFyaWFibGVEZWNsYXJhdGlvbiBFT0YgOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjcyNTc6MTogZW50cnlSdWxlWFZhcmlhYmxlRGVjbGFyYXRpb24gcmV0dXJucyBbRU9iamVjdCBjdXJyZW50PW51bGxdIDogaXZfcnVsZVhWYXJpYWJsZURlY2xhcmF0aW9uPSBydWxlWFZhcmlhYmxlRGVjbGFyYXRpb24gRU9GIDsKICAgICBwdWJsaWMgZmluYWwgRU9iamVjdCBlbnRyeVJ1bGVYVmFyaWFibGVEZWNsYXJhdGlvbigpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAgICAgICAgIEVPYmplY3QgY3VycmVudCA9IG51bGw7CiAKQEAgLTE4NTU5LDggKzE5NzUzLDggQEAKIAogCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo2ODE4OjYxOiAoaXZfcnVsZVhWYXJpYWJsZURlY2xhcmF0aW9uPSBydWxlWFZhcmlhYmxlRGVjbGFyYXRpb24gRU9GICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjY4MTk6MjogaXZfcnVsZVhWYXJpYWJsZURlY2xhcmF0aW9uPSBydWxlWFZhcmlhYmxlRGVjbGFyYXRpb24gRU9GCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo3MjU3OjYxOiAoaXZfcnVsZVhWYXJpYWJsZURlY2xhcmF0aW9uPSBydWxlWFZhcmlhYmxlRGVjbGFyYXRpb24gRU9GICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjcyNTg6MjogaXZfcnVsZVhWYXJpYWJsZURlY2xhcmF0aW9uPSBydWxlWFZhcmlhYmxlRGVjbGFyYXRpb24gRU9GCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIG5ld0NvbXBvc2l0ZU5vZGUoZ3JhbW1hckFjY2Vzcy5nZXRYVmFyaWFibGVEZWNsYXJhdGlvblJ1bGUoKSk7IApAQCAtMTg1OTEsNyArMTk3ODUsNyBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVYVmFyaWFibGVEZWNsYXJhdGlvbiIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo2ODI1OjE6IHJ1bGVYVmFyaWFibGVEZWNsYXJhdGlvbiByZXR1cm5zIFtFT2JqZWN0IGN1cnJlbnQ9bnVsbF0gOiAoICgpICggKCAobHZfd3JpdGVhYmxlXzFfMD0gJ3ZhcicgKSApIHwgb3RoZXJsdl8yPSAndmFsJyApICggKCAoICggKCAoIHJ1bGVKdm1UeXBlUmVmZXJlbmNlICkgKSAoICggcnVsZVZhbGlkSUQgKSApICkgKT0+ICggKCAobHZfdHlwZV8zXzA9IHJ1bGVKdm1UeXBlUmVmZXJlbmNlICkgKSAoIChsdl9uYW1lXzRfMD0gcnVsZVZhbGlkSUQgKSApICkgKSB8ICggKGx2X25hbWVfNV8wPSBydWxlVmFsaWRJRCApICkgKSAob3RoZXJsdl82PSAnPScgKCAobHZfcmlnaHRfN18wPSBydWxlWEV4cHJlc3Npb24gKSApICk/ICkgOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjcyNjQ6MTogcnVsZVhWYXJpYWJsZURlY2xhcmF0aW9uIHJldHVybnMgW0VPYmplY3QgY3VycmVudD1udWxsXSA6ICggKCkgKCAoIChsdl93cml0ZWFibGVfMV8wPSAndmFyJyApICkgfCBvdGhlcmx2XzI9ICd2YWwnICkgKCAoICggKCAoICggcnVsZUp2bVR5cGVSZWZlcmVuY2UgKSApICggKCBydWxlVmFsaWRJRCApICkgKSApPT4gKCAoIChsdl90eXBlXzNfMD0gcnVsZUp2bVR5cGVSZWZlcmVuY2UgKSApICggKGx2X25hbWVfNF8wPSBydWxlVmFsaWRJRCApICkgKSApIHwgKCAobHZfbmFtZV81XzA9IHJ1bGVWYWxpZElEICkgKSApIChvdGhlcmx2XzY9ICc9JyAoIChsdl9yaWdodF83XzA9IHJ1bGVYRXhwcmVzc2lvbiApICkgKT8gKSA7CiAgICAgcHVibGljIGZpbmFsIEVPYmplY3QgcnVsZVhWYXJpYWJsZURlY2xhcmF0aW9uKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKICAgICAgICAgRU9iamVjdCBjdXJyZW50ID0gbnVsbDsKIApAQCAtMTg2MTEsMTQgKzE5ODA1LDE0IEBACiAgICAgICAgIAllbnRlclJ1bGUoKTsKIAogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NjgzMToyOiAoICggKCkgKCAoIChsdl93cml0ZWFibGVfMV8wPSAndmFyJyApICkgfCBvdGhlcmx2XzI9ICd2YWwnICkgKCAoICggKCAoICggcnVsZUp2bVR5cGVSZWZlcmVuY2UgKSApICggKCBydWxlVmFsaWRJRCApICkgKSApPT4gKCAoIChsdl90eXBlXzNfMD0gcnVsZUp2bVR5cGVSZWZlcmVuY2UgKSApICggKGx2X25hbWVfNF8wPSBydWxlVmFsaWRJRCApICkgKSApIHwgKCAobHZfbmFtZV81XzA9IHJ1bGVWYWxpZElEICkgKSApIChvdGhlcmx2XzY9ICc9JyAoIChsdl9yaWdodF83XzA9IHJ1bGVYRXhwcmVzc2lvbiApICkgKT8gKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo2ODMyOjI6ICggKCkgKCAoIChsdl93cml0ZWFibGVfMV8wPSAndmFyJyApICkgfCBvdGhlcmx2XzI9ICd2YWwnICkgKCAoICggKCAoICggcnVsZUp2bVR5cGVSZWZlcmVuY2UgKSApICggKCBydWxlVmFsaWRJRCApICkgKSApPT4gKCAoIChsdl90eXBlXzNfMD0gcnVsZUp2bVR5cGVSZWZlcmVuY2UgKSApICggKGx2X25hbWVfNF8wPSBydWxlVmFsaWRJRCApICkgKSApIHwgKCAobHZfbmFtZV81XzA9IHJ1bGVWYWxpZElEICkgKSApIChvdGhlcmx2XzY9ICc9JyAoIChsdl9yaWdodF83XzA9IHJ1bGVYRXhwcmVzc2lvbiApICkgKT8gKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NzI3MDoyOiAoICggKCkgKCAoIChsdl93cml0ZWFibGVfMV8wPSAndmFyJyApICkgfCBvdGhlcmx2XzI9ICd2YWwnICkgKCAoICggKCAoICggcnVsZUp2bVR5cGVSZWZlcmVuY2UgKSApICggKCBydWxlVmFsaWRJRCApICkgKSApPT4gKCAoIChsdl90eXBlXzNfMD0gcnVsZUp2bVR5cGVSZWZlcmVuY2UgKSApICggKGx2X25hbWVfNF8wPSBydWxlVmFsaWRJRCApICkgKSApIHwgKCAobHZfbmFtZV81XzA9IHJ1bGVWYWxpZElEICkgKSApIChvdGhlcmx2XzY9ICc9JyAoIChsdl9yaWdodF83XzA9IHJ1bGVYRXhwcmVzc2lvbiApICkgKT8gKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo3MjcxOjI6ICggKCkgKCAoIChsdl93cml0ZWFibGVfMV8wPSAndmFyJyApICkgfCBvdGhlcmx2XzI9ICd2YWwnICkgKCAoICggKCAoICggcnVsZUp2bVR5cGVSZWZlcmVuY2UgKSApICggKCBydWxlVmFsaWRJRCApICkgKSApPT4gKCAoIChsdl90eXBlXzNfMD0gcnVsZUp2bVR5cGVSZWZlcmVuY2UgKSApICggKGx2X25hbWVfNF8wPSBydWxlVmFsaWRJRCApICkgKSApIHwgKCAobHZfbmFtZV81XzA9IHJ1bGVWYWxpZElEICkgKSApIChvdGhlcmx2XzY9ICc9JyAoIChsdl9yaWdodF83XzA9IHJ1bGVYRXhwcmVzc2lvbiApICkgKT8gKQogICAgICAgICAgICAgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NjgzMjoyOiAoICgpICggKCAobHZfd3JpdGVhYmxlXzFfMD0gJ3ZhcicgKSApIHwgb3RoZXJsdl8yPSAndmFsJyApICggKCAoICggKCAoIHJ1bGVKdm1UeXBlUmVmZXJlbmNlICkgKSAoICggcnVsZVZhbGlkSUQgKSApICkgKT0+ICggKCAobHZfdHlwZV8zXzA9IHJ1bGVKdm1UeXBlUmVmZXJlbmNlICkgKSAoIChsdl9uYW1lXzRfMD0gcnVsZVZhbGlkSUQgKSApICkgKSB8ICggKGx2X25hbWVfNV8wPSBydWxlVmFsaWRJRCApICkgKSAob3RoZXJsdl82PSAnPScgKCAobHZfcmlnaHRfN18wPSBydWxlWEV4cHJlc3Npb24gKSApICk/ICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjY4MzM6MzogKCkgKCAoIChsdl93cml0ZWFibGVfMV8wPSAndmFyJyApICkgfCBvdGhlcmx2XzI9ICd2YWwnICkgKCAoICggKCAoICggcnVsZUp2bVR5cGVSZWZlcmVuY2UgKSApICggKCBydWxlVmFsaWRJRCApICkgKSApPT4gKCAoIChsdl90eXBlXzNfMD0gcnVsZUp2bVR5cGVSZWZlcmVuY2UgKSApICggKGx2X25hbWVfNF8wPSBydWxlVmFsaWRJRCApICkgKSApIHwgKCAobHZfbmFtZV81XzA9IHJ1bGVWYWxpZElEICkgKSApIChvdGhlcmx2XzY9ICc9JyAoIChsdl9yaWdodF83XzA9IHJ1bGVYRXhwcmVzc2lvbiApICkgKT8KKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjcyNzE6MjogKCAoKSAoICggKGx2X3dyaXRlYWJsZV8xXzA9ICd2YXInICkgKSB8IG90aGVybHZfMj0gJ3ZhbCcgKSAoICggKCAoICggKCBydWxlSnZtVHlwZVJlZmVyZW5jZSApICkgKCAoIHJ1bGVWYWxpZElEICkgKSApICk9PiAoICggKGx2X3R5cGVfM18wPSBydWxlSnZtVHlwZVJlZmVyZW5jZSApICkgKCAobHZfbmFtZV80XzA9IHJ1bGVWYWxpZElEICkgKSApICkgfCAoIChsdl9uYW1lXzVfMD0gcnVsZVZhbGlkSUQgKSApICkgKG90aGVybHZfNj0gJz0nICggKGx2X3JpZ2h0XzdfMD0gcnVsZVhFeHByZXNzaW9uICkgKSApPyApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo3MjcyOjM6ICgpICggKCAobHZfd3JpdGVhYmxlXzFfMD0gJ3ZhcicgKSApIHwgb3RoZXJsdl8yPSAndmFsJyApICggKCAoICggKCAoIHJ1bGVKdm1UeXBlUmVmZXJlbmNlICkgKSAoICggcnVsZVZhbGlkSUQgKSApICkgKT0+ICggKCAobHZfdHlwZV8zXzA9IHJ1bGVKdm1UeXBlUmVmZXJlbmNlICkgKSAoIChsdl9uYW1lXzRfMD0gcnVsZVZhbGlkSUQgKSApICkgKSB8ICggKGx2X25hbWVfNV8wPSBydWxlVmFsaWRJRCApICkgKSAob3RoZXJsdl82PSAnPScgKCAobHZfcmlnaHRfN18wPSBydWxlWEV4cHJlc3Npb24gKSApICk/CiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo2ODMzOjM6ICgpCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo2ODM0OjQ6IAorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NzI3MjozOiAoKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NzI3Mzo0OiAKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogCkBAIC0xODYzMCwzNCArMTk4MjQsMzQgQEAKIAogICAgICAgICAgICAgfQogCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo2ODQwOjM6ICggKCAobHZfd3JpdGVhYmxlXzFfMD0gJ3ZhcicgKSApIHwgb3RoZXJsdl8yPSAndmFsJyApCi0gICAgICAgICAgICBpbnQgYWx0MTE3PTI7Ci0gICAgICAgICAgICBpbnQgTEExMTdfMCA9IGlucHV0LkxBKDEpOworICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NzI3OTozOiAoICggKGx2X3dyaXRlYWJsZV8xXzA9ICd2YXInICkgKSB8IG90aGVybHZfMj0gJ3ZhbCcgKQorICAgICAgICAgICAgaW50IGFsdDEyOD0yOworICAgICAgICAgICAgaW50IExBMTI4XzAgPSBpbnB1dC5MQSgxKTsKIAotICAgICAgICAgICAgaWYgKCAoTEExMTdfMD09MTIxKSApIHsKLSAgICAgICAgICAgICAgICBhbHQxMTc9MTsKKyAgICAgICAgICAgIGlmICggKExBMTI4XzA9PTEyOCkgKSB7CisgICAgICAgICAgICAgICAgYWx0MTI4PTE7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIGlmICggKExBMTE3XzA9PTEyMikgKSB7Ci0gICAgICAgICAgICAgICAgYWx0MTE3PTI7CisgICAgICAgICAgICBlbHNlIGlmICggKExBMTI4XzA9PTEyOSkgKSB7CisgICAgICAgICAgICAgICAgYWx0MTI4PTI7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICBpZiAoc3RhdGUuYmFja3RyYWNraW5nPjApIHtzdGF0ZS5mYWlsZWQ9dHJ1ZTsgcmV0dXJuIGN1cnJlbnQ7fQogICAgICAgICAgICAgICAgIE5vVmlhYmxlQWx0RXhjZXB0aW9uIG52YWUgPQotICAgICAgICAgICAgICAgICAgICBuZXcgTm9WaWFibGVBbHRFeGNlcHRpb24oIiIsIDExNywgMCwgaW5wdXQpOworICAgICAgICAgICAgICAgICAgICBuZXcgTm9WaWFibGVBbHRFeGNlcHRpb24oIiIsIDEyOCwgMCwgaW5wdXQpOwogCiAgICAgICAgICAgICAgICAgdGhyb3cgbnZhZTsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHN3aXRjaCAoYWx0MTE3KSB7CisgICAgICAgICAgICBzd2l0Y2ggKGFsdDEyOCkgewogICAgICAgICAgICAgICAgIGNhc2UgMSA6Ci0gICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjY4NDE6NDogKCAobHZfd3JpdGVhYmxlXzFfMD0gJ3ZhcicgKSApCisgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjcyODA6NDogKCAobHZfd3JpdGVhYmxlXzFfMD0gJ3ZhcicgKSApCiAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6Njg0MTo0OiAoIChsdl93cml0ZWFibGVfMV8wPSAndmFyJyApICkKLSAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6Njg0Mjo1OiAobHZfd3JpdGVhYmxlXzFfMD0gJ3ZhcicgKQorICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo3MjgwOjQ6ICggKGx2X3dyaXRlYWJsZV8xXzA9ICd2YXInICkgKQorICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo3MjgxOjU6IChsdl93cml0ZWFibGVfMV8wPSAndmFyJyApCiAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6Njg0Mjo1OiAobHZfd3JpdGVhYmxlXzFfMD0gJ3ZhcicgKQotICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo2ODQzOjY6IGx2X3dyaXRlYWJsZV8xXzA9ICd2YXInCisgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjcyODE6NTogKGx2X3dyaXRlYWJsZV8xXzA9ICd2YXInICkKKyAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NzI4Mjo2OiBsdl93cml0ZWFibGVfMV8wPSAndmFyJwogICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGx2X3dyaXRlYWJsZV8xXzA9KFRva2VuKW1hdGNoKGlucHV0LDEyMSxGT0xMT1dfNzcpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gY3VycmVudDsKKyAgICAgICAgICAgICAgICAgICAgbHZfd3JpdGVhYmxlXzFfMD0oVG9rZW4pbWF0Y2goaW5wdXQsMTI4LEZPTExPV185MSk7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OwogICAgICAgICAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKIAogICAgICAgICAgICAgICAgICAgICAgIAkJCQkJCW5ld0xlYWZOb2RlKGx2X3dyaXRlYWJsZV8xXzAsIGdyYW1tYXJBY2Nlc3MuZ2V0WFZhcmlhYmxlRGVjbGFyYXRpb25BY2Nlc3MoKS5nZXRXcml0ZWFibGVWYXJLZXl3b3JkXzFfMF8wKCkpOwpAQCAtMTg2ODEsOSArMTk4NzUsOSBAQAogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgIGNhc2UgMiA6Ci0gICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjY4NTY6NDogb3RoZXJsdl8yPSAndmFsJworICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo3Mjk1OjQ6IG90aGVybHZfMj0gJ3ZhbCcKICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBvdGhlcmx2XzI9KFRva2VuKW1hdGNoKGlucHV0LDEyMixGT0xMT1dfNzcpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gY3VycmVudDsKKyAgICAgICAgICAgICAgICAgICAgb3RoZXJsdl8yPShUb2tlbiltYXRjaChpbnB1dCwxMjksRk9MTE9XXzkxKTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7CiAgICAgICAgICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogCiAgICAgICAgICAgICAgICAgICAgICAgCQkJCW5ld0xlYWZOb2RlKG90aGVybHZfMiwgZ3JhbW1hckFjY2Vzcy5nZXRYVmFyaWFibGVEZWNsYXJhdGlvbkFjY2VzcygpLmdldFZhbEtleXdvcmRfMV8xKCkpOwpAQCAtMTg2OTUsNTUgKzE5ODg5LDU1IEBACiAKICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6Njg2MTozOiAoICggKCAoICggKCBydWxlSnZtVHlwZVJlZmVyZW5jZSApICkgKCAoIHJ1bGVWYWxpZElEICkgKSApICk9PiAoICggKGx2X3R5cGVfM18wPSBydWxlSnZtVHlwZVJlZmVyZW5jZSApICkgKCAobHZfbmFtZV80XzA9IHJ1bGVWYWxpZElEICkgKSApICkgfCAoIChsdl9uYW1lXzVfMD0gcnVsZVZhbGlkSUQgKSApICkKLSAgICAgICAgICAgIGludCBhbHQxMTg9MjsKLSAgICAgICAgICAgIGludCBMQTExOF8wID0gaW5wdXQuTEEoMSk7CisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo3MzAwOjM6ICggKCAoICggKCAoIHJ1bGVKdm1UeXBlUmVmZXJlbmNlICkgKSAoICggcnVsZVZhbGlkSUQgKSApICkgKT0+ICggKCAobHZfdHlwZV8zXzA9IHJ1bGVKdm1UeXBlUmVmZXJlbmNlICkgKSAoIChsdl9uYW1lXzRfMD0gcnVsZVZhbGlkSUQgKSApICkgKSB8ICggKGx2X25hbWVfNV8wPSBydWxlVmFsaWRJRCApICkgKQorICAgICAgICAgICAgaW50IGFsdDEyOT0yOworICAgICAgICAgICAgaW50IExBMTI5XzAgPSBpbnB1dC5MQSgxKTsKIAotICAgICAgICAgICAgaWYgKCAoTEExMThfMD09UlVMRV9JRCkgKSB7Ci0gICAgICAgICAgICAgICAgaW50IExBMTE4XzEgPSBpbnB1dC5MQSgyKTsKKyAgICAgICAgICAgIGlmICggKExBMTI5XzA9PVJVTEVfSUQpICkgeworICAgICAgICAgICAgICAgIGludCBMQTEyOV8xID0gaW5wdXQuTEEoMik7CiAKICAgICAgICAgICAgICAgICBpZiAoIChzeW5wcmVkMzVfSW50ZXJuYWxEYXRhRFNMKCkpICkgewotICAgICAgICAgICAgICAgICAgICBhbHQxMTg9MTsKKyAgICAgICAgICAgICAgICAgICAgYWx0MTI5PTE7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIGVsc2UgaWYgKCAodHJ1ZSkgKSB7Ci0gICAgICAgICAgICAgICAgICAgIGFsdDExOD0yOworICAgICAgICAgICAgICAgICAgICBhbHQxMjk9MjsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgIGlmIChzdGF0ZS5iYWNrdHJhY2tpbmc+MCkge3N0YXRlLmZhaWxlZD10cnVlOyByZXR1cm4gY3VycmVudDt9CiAgICAgICAgICAgICAgICAgICAgIE5vVmlhYmxlQWx0RXhjZXB0aW9uIG52YWUgPQotICAgICAgICAgICAgICAgICAgICAgICAgbmV3IE5vVmlhYmxlQWx0RXhjZXB0aW9uKCIiLCAxMTgsIDEsIGlucHV0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBOb1ZpYWJsZUFsdEV4Y2VwdGlvbigiIiwgMTI5LCAxLCBpbnB1dCk7CiAKICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbnZhZTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIGlmICggKExBMTE4XzA9PTc0KSAmJiAoc3lucHJlZDM1X0ludGVybmFsRGF0YURTTCgpKSkgewotICAgICAgICAgICAgICAgIGFsdDExOD0xOworICAgICAgICAgICAgZWxzZSBpZiAoIChMQTEyOV8wPT04MSkgJiYgKHN5bnByZWQzNV9JbnRlcm5hbERhdGFEU0woKSkpIHsKKyAgICAgICAgICAgICAgICBhbHQxMjk9MTsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgaWYgKCAoTEExMThfMD09OTkpICYmIChzeW5wcmVkMzVfSW50ZXJuYWxEYXRhRFNMKCkpKSB7Ci0gICAgICAgICAgICAgICAgYWx0MTE4PTE7CisgICAgICAgICAgICBlbHNlIGlmICggKExBMTI5XzA9PTEwNikgJiYgKHN5bnByZWQzNV9JbnRlcm5hbERhdGFEU0woKSkpIHsKKyAgICAgICAgICAgICAgICBhbHQxMjk9MTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgIGlmIChzdGF0ZS5iYWNrdHJhY2tpbmc+MCkge3N0YXRlLmZhaWxlZD10cnVlOyByZXR1cm4gY3VycmVudDt9CiAgICAgICAgICAgICAgICAgTm9WaWFibGVBbHRFeGNlcHRpb24gbnZhZSA9Ci0gICAgICAgICAgICAgICAgICAgIG5ldyBOb1ZpYWJsZUFsdEV4Y2VwdGlvbigiIiwgMTE4LCAwLCBpbnB1dCk7CisgICAgICAgICAgICAgICAgICAgIG5ldyBOb1ZpYWJsZUFsdEV4Y2VwdGlvbigiIiwgMTI5LCAwLCBpbnB1dCk7CiAKICAgICAgICAgICAgICAgICB0aHJvdyBudmFlOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgc3dpdGNoIChhbHQxMTgpIHsKKyAgICAgICAgICAgIHN3aXRjaCAoYWx0MTI5KSB7CiAgICAgICAgICAgICAgICAgY2FzZSAxIDoKLSAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6Njg2Mjo0OiAoICggKCAoICggcnVsZUp2bVR5cGVSZWZlcmVuY2UgKSApICggKCBydWxlVmFsaWRJRCApICkgKSApPT4gKCAoIChsdl90eXBlXzNfMD0gcnVsZUp2bVR5cGVSZWZlcmVuY2UgKSApICggKGx2X25hbWVfNF8wPSBydWxlVmFsaWRJRCApICkgKSApCisgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjczMDE6NDogKCAoICggKCAoIHJ1bGVKdm1UeXBlUmVmZXJlbmNlICkgKSAoICggcnVsZVZhbGlkSUQgKSApICkgKT0+ICggKCAobHZfdHlwZV8zXzA9IHJ1bGVKdm1UeXBlUmVmZXJlbmNlICkgKSAoIChsdl9uYW1lXzRfMD0gcnVsZVZhbGlkSUQgKSApICkgKQogICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjY4NjI6NDogKCAoICggKCAoIHJ1bGVKdm1UeXBlUmVmZXJlbmNlICkgKSAoICggcnVsZVZhbGlkSUQgKSApICkgKT0+ICggKCAobHZfdHlwZV8zXzA9IHJ1bGVKdm1UeXBlUmVmZXJlbmNlICkgKSAoIChsdl9uYW1lXzRfMD0gcnVsZVZhbGlkSUQgKSApICkgKQotICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo2ODYzOjU6ICggKCAoICggcnVsZUp2bVR5cGVSZWZlcmVuY2UgKSApICggKCBydWxlVmFsaWRJRCApICkgKSApPT4gKCAoIChsdl90eXBlXzNfMD0gcnVsZUp2bVR5cGVSZWZlcmVuY2UgKSApICggKGx2X25hbWVfNF8wPSBydWxlVmFsaWRJRCApICkgKQorICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo3MzAxOjQ6ICggKCAoICggKCBydWxlSnZtVHlwZVJlZmVyZW5jZSApICkgKCAoIHJ1bGVWYWxpZElEICkgKSApICk9PiAoICggKGx2X3R5cGVfM18wPSBydWxlSnZtVHlwZVJlZmVyZW5jZSApICkgKCAobHZfbmFtZV80XzA9IHJ1bGVWYWxpZElEICkgKSApICkKKyAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NzMwMjo1OiAoICggKCAoIHJ1bGVKdm1UeXBlUmVmZXJlbmNlICkgKSAoICggcnVsZVZhbGlkSUQgKSApICkgKT0+ICggKCAobHZfdHlwZV8zXzA9IHJ1bGVKdm1UeXBlUmVmZXJlbmNlICkgKSAoIChsdl9uYW1lXzRfMD0gcnVsZVZhbGlkSUQgKSApICkKICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo2ODc2OjU6ICggKCAobHZfdHlwZV8zXzA9IHJ1bGVKdm1UeXBlUmVmZXJlbmNlICkgKSAoIChsdl9uYW1lXzRfMD0gcnVsZVZhbGlkSUQgKSApICkKLSAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6Njg3Nzo2OiAoIChsdl90eXBlXzNfMD0gcnVsZUp2bVR5cGVSZWZlcmVuY2UgKSApICggKGx2X25hbWVfNF8wPSBydWxlVmFsaWRJRCApICkKKyAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NzMxNTo1OiAoICggKGx2X3R5cGVfM18wPSBydWxlSnZtVHlwZVJlZmVyZW5jZSApICkgKCAobHZfbmFtZV80XzA9IHJ1bGVWYWxpZElEICkgKSApCisgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjczMTY6NjogKCAobHZfdHlwZV8zXzA9IHJ1bGVKdm1UeXBlUmVmZXJlbmNlICkgKSAoIChsdl9uYW1lXzRfMD0gcnVsZVZhbGlkSUQgKSApCiAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6Njg3Nzo2OiAoIChsdl90eXBlXzNfMD0gcnVsZUp2bVR5cGVSZWZlcmVuY2UgKSApCi0gICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjY4Nzg6NzogKGx2X3R5cGVfM18wPSBydWxlSnZtVHlwZVJlZmVyZW5jZSApCisgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjczMTY6NjogKCAobHZfdHlwZV8zXzA9IHJ1bGVKdm1UeXBlUmVmZXJlbmNlICkgKQorICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo3MzE3Ojc6IChsdl90eXBlXzNfMD0gcnVsZUp2bVR5cGVSZWZlcmVuY2UgKQogICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjY4Nzg6NzogKGx2X3R5cGVfM18wPSBydWxlSnZtVHlwZVJlZmVyZW5jZSApCi0gICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjY4Nzk6ODogbHZfdHlwZV8zXzA9IHJ1bGVKdm1UeXBlUmVmZXJlbmNlCisgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjczMTc6NzogKGx2X3R5cGVfM18wPSBydWxlSnZtVHlwZVJlZmVyZW5jZSApCisgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjczMTg6ODogbHZfdHlwZV8zXzA9IHJ1bGVKdm1UeXBlUmVmZXJlbmNlCiAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAKQEAgLTE4Nzc0LDE4ICsxOTk2OCwxOCBAQAogCiAgICAgICAgICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo2ODk2OjY6ICggKGx2X25hbWVfNF8wPSBydWxlVmFsaWRJRCApICkKLSAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6Njg5Nzo3OiAobHZfbmFtZV80XzA9IHJ1bGVWYWxpZElEICkKKyAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NzMzNTo2OiAoIChsdl9uYW1lXzRfMD0gcnVsZVZhbGlkSUQgKSApCisgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjczMzY6NzogKGx2X25hbWVfNF8wPSBydWxlVmFsaWRJRCApCiAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6Njg5Nzo3OiAobHZfbmFtZV80XzA9IHJ1bGVWYWxpZElEICkKLSAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6Njg5ODo4OiBsdl9uYW1lXzRfMD0gcnVsZVZhbGlkSUQKKyAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NzMzNjo3OiAobHZfbmFtZV80XzA9IHJ1bGVWYWxpZElEICkKKyAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NzMzNzo4OiBsdl9uYW1lXzRfMD0gcnVsZVZhbGlkSUQKICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKIAogICAgICAgICAgICAgICAgICAgICAgIAkJCQkJCQkJbmV3Q29tcG9zaXRlTm9kZShncmFtbWFyQWNjZXNzLmdldFhWYXJpYWJsZURlY2xhcmF0aW9uQWNjZXNzKCkuZ2V0TmFtZVZhbGlkSURQYXJzZXJSdWxlQ2FsbF8yXzBfMF8xXzAoKSk7CiAgICAgICAgICAgICAgICAgICAgICAgCQkJCQkJCQogICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzExOCk7CisgICAgICAgICAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzEzMSk7CiAgICAgICAgICAgICAgICAgICAgIGx2X25hbWVfNF8wPXJ1bGVWYWxpZElEKCk7CiAKICAgICAgICAgICAgICAgICAgICAgc3RhdGUuX2ZzcC0tOwpAQCAtMTg4MTksMjAgKzIwMDEzLDIwIEBACiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgY2FzZSAyIDoKLSAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NjkxODo0OiAoIChsdl9uYW1lXzVfMD0gcnVsZVZhbGlkSUQgKSApCisgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjczNTc6NDogKCAobHZfbmFtZV81XzA9IHJ1bGVWYWxpZElEICkgKQogICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjY5MTg6NDogKCAobHZfbmFtZV81XzA9IHJ1bGVWYWxpZElEICkgKQotICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo2OTE5OjU6IChsdl9uYW1lXzVfMD0gcnVsZVZhbGlkSUQgKQorICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo3MzU3OjQ6ICggKGx2X25hbWVfNV8wPSBydWxlVmFsaWRJRCApICkKKyAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NzM1ODo1OiAobHZfbmFtZV81XzA9IHJ1bGVWYWxpZElEICkKICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo2OTE5OjU6IChsdl9uYW1lXzVfMD0gcnVsZVZhbGlkSUQgKQotICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo2OTIwOjY6IGx2X25hbWVfNV8wPSBydWxlVmFsaWRJRAorICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo3MzU4OjU6IChsdl9uYW1lXzVfMD0gcnVsZVZhbGlkSUQgKQorICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo3MzU5OjY6IGx2X25hbWVfNV8wPSBydWxlVmFsaWRJRAogICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogCiAgICAgICAgICAgICAgICAgICAgICAgCQkJCQkJbmV3Q29tcG9zaXRlTm9kZShncmFtbWFyQWNjZXNzLmdldFhWYXJpYWJsZURlY2xhcmF0aW9uQWNjZXNzKCkuZ2V0TmFtZVZhbGlkSURQYXJzZXJSdWxlQ2FsbF8yXzFfMCgpKTsKICAgICAgICAgICAgICAgICAgICAgICAJCQkJCQogICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzExOCk7CisgICAgICAgICAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzEzMSk7CiAgICAgICAgICAgICAgICAgICAgIGx2X25hbWVfNV8wPXJ1bGVWYWxpZElEKCk7CiAKICAgICAgICAgICAgICAgICAgICAgc3RhdGUuX2ZzcC0tOwpAQCAtMTg4NjIsMjggKzIwMDU2LDI4IEBACiAKICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NjkzODozOiAob3RoZXJsdl82PSAnPScgKCAobHZfcmlnaHRfN18wPSBydWxlWEV4cHJlc3Npb24gKSApICk/Ci0gICAgICAgICAgICBpbnQgYWx0MTE5PTI7Ci0gICAgICAgICAgICBpbnQgTEExMTlfMCA9IGlucHV0LkxBKDEpOworICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NzM3NzozOiAob3RoZXJsdl82PSAnPScgKCAobHZfcmlnaHRfN18wPSBydWxlWEV4cHJlc3Npb24gKSApICk/CisgICAgICAgICAgICBpbnQgYWx0MTMwPTI7CisgICAgICAgICAgICBpbnQgTEExMzBfMCA9IGlucHV0LkxBKDEpOwogCi0gICAgICAgICAgICBpZiAoIChMQTExOV8wPT03NykgKSB7Ci0gICAgICAgICAgICAgICAgYWx0MTE5PTE7CisgICAgICAgICAgICBpZiAoIChMQTEzMF8wPT04NCkgKSB7CisgICAgICAgICAgICAgICAgYWx0MTMwPTE7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBzd2l0Y2ggKGFsdDExOSkgeworICAgICAgICAgICAgc3dpdGNoIChhbHQxMzApIHsKICAgICAgICAgICAgICAgICBjYXNlIDEgOgotICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo2OTM5OjQ6IG90aGVybHZfNj0gJz0nICggKGx2X3JpZ2h0XzdfMD0gcnVsZVhFeHByZXNzaW9uICkgKQorICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo3Mzc4OjQ6IG90aGVybHZfNj0gJz0nICggKGx2X3JpZ2h0XzdfMD0gcnVsZVhFeHByZXNzaW9uICkgKQogICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIG90aGVybHZfNj0oVG9rZW4pbWF0Y2goaW5wdXQsNzcsRk9MTE9XXzY0KTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7CisgICAgICAgICAgICAgICAgICAgIG90aGVybHZfNj0oVG9rZW4pbWF0Y2goaW5wdXQsODQsRk9MTE9XXzc4KTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7CiAgICAgICAgICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogCiAgICAgICAgICAgICAgICAgICAgICAgCQkJCW5ld0xlYWZOb2RlKG90aGVybHZfNiwgZ3JhbW1hckFjY2Vzcy5nZXRYVmFyaWFibGVEZWNsYXJhdGlvbkFjY2VzcygpLmdldEVxdWFsc1NpZ25LZXl3b3JkXzNfMCgpKTsKICAgICAgICAgICAgICAgICAgICAgICAJCQkKICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo2OTQzOjQ6ICggKGx2X3JpZ2h0XzdfMD0gcnVsZVhFeHByZXNzaW9uICkgKQotICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo2OTQ0OjU6IChsdl9yaWdodF83XzA9IHJ1bGVYRXhwcmVzc2lvbiApCisgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjczODI6NDogKCAobHZfcmlnaHRfN18wPSBydWxlWEV4cHJlc3Npb24gKSApCisgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjczODM6NTogKGx2X3JpZ2h0XzdfMD0gcnVsZVhFeHByZXNzaW9uICkKICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo2OTQ0OjU6IChsdl9yaWdodF83XzA9IHJ1bGVYRXhwcmVzc2lvbiApCi0gICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjY5NDU6NjogbHZfcmlnaHRfN18wPSBydWxlWEV4cHJlc3Npb24KKyAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NzM4Mzo1OiAobHZfcmlnaHRfN18wPSBydWxlWEV4cHJlc3Npb24gKQorICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo3Mzg0OjY6IGx2X3JpZ2h0XzdfMD0gcnVsZVhFeHByZXNzaW9uCiAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAKQEAgLTE4OTQ1LDcgKzIwMTM5LDcgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJlbnRyeVJ1bGVKdm1Gb3JtYWxQYXJhbWV0ZXIiCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6Njk2NzoxOiBlbnRyeVJ1bGVKdm1Gb3JtYWxQYXJhbWV0ZXIgcmV0dXJucyBbRU9iamVjdCBjdXJyZW50PW51bGxdIDogaXZfcnVsZUp2bUZvcm1hbFBhcmFtZXRlcj0gcnVsZUp2bUZvcm1hbFBhcmFtZXRlciBFT0YgOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjc0MDY6MTogZW50cnlSdWxlSnZtRm9ybWFsUGFyYW1ldGVyIHJldHVybnMgW0VPYmplY3QgY3VycmVudD1udWxsXSA6IGl2X3J1bGVKdm1Gb3JtYWxQYXJhbWV0ZXI9IHJ1bGVKdm1Gb3JtYWxQYXJhbWV0ZXIgRU9GIDsKICAgICBwdWJsaWMgZmluYWwgRU9iamVjdCBlbnRyeVJ1bGVKdm1Gb3JtYWxQYXJhbWV0ZXIoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogICAgICAgICBFT2JqZWN0IGN1cnJlbnQgPSBudWxsOwogCkBAIC0xODk1Myw4ICsyMDE0Nyw4IEBACiAKIAogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6Njk2Nzo1OTogKGl2X3J1bGVKdm1Gb3JtYWxQYXJhbWV0ZXI9IHJ1bGVKdm1Gb3JtYWxQYXJhbWV0ZXIgRU9GICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjY5Njg6MjogaXZfcnVsZUp2bUZvcm1hbFBhcmFtZXRlcj0gcnVsZUp2bUZvcm1hbFBhcmFtZXRlciBFT0YKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjc0MDY6NTk6IChpdl9ydWxlSnZtRm9ybWFsUGFyYW1ldGVyPSBydWxlSnZtRm9ybWFsUGFyYW1ldGVyIEVPRiApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo3NDA3OjI6IGl2X3J1bGVKdm1Gb3JtYWxQYXJhbWV0ZXI9IHJ1bGVKdm1Gb3JtYWxQYXJhbWV0ZXIgRU9GCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIG5ld0NvbXBvc2l0ZU5vZGUoZ3JhbW1hckFjY2Vzcy5nZXRKdm1Gb3JtYWxQYXJhbWV0ZXJSdWxlKCkpOyAKQEAgLTE4OTg1LDcgKzIwMTc5LDcgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlSnZtRm9ybWFsUGFyYW1ldGVyIgotICAgIC8vIEludGVybmFsRGF0YURTTC5nOjY5NzQ6MTogcnVsZUp2bUZvcm1hbFBhcmFtZXRlciByZXR1cm5zIFtFT2JqZWN0IGN1cnJlbnQ9bnVsbF0gOiAoICggKGx2X3BhcmFtZXRlclR5cGVfMF8wPSBydWxlSnZtVHlwZVJlZmVyZW5jZSApICk/ICggKGx2X25hbWVfMV8wPSBydWxlVmFsaWRJRCApICkgKSA7CisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NzQxMzoxOiBydWxlSnZtRm9ybWFsUGFyYW1ldGVyIHJldHVybnMgW0VPYmplY3QgY3VycmVudD1udWxsXSA6ICggKCAobHZfcGFyYW1ldGVyVHlwZV8wXzA9IHJ1bGVKdm1UeXBlUmVmZXJlbmNlICkgKT8gKCAobHZfbmFtZV8xXzA9IHJ1bGVWYWxpZElEICkgKSApIDsKICAgICBwdWJsaWMgZmluYWwgRU9iamVjdCBydWxlSnZtRm9ybWFsUGFyYW1ldGVyKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKICAgICAgICAgRU9iamVjdCBjdXJyZW50ID0gbnVsbDsKIApAQCAtMTg5OTgsMzIgKzIwMTkyLDMyIEBACiAgICAgICAgIAllbnRlclJ1bGUoKTsKIAogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6Njk4MDoyOiAoICggKCAobHZfcGFyYW1ldGVyVHlwZV8wXzA9IHJ1bGVKdm1UeXBlUmVmZXJlbmNlICkgKT8gKCAobHZfbmFtZV8xXzA9IHJ1bGVWYWxpZElEICkgKSApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjY5ODE6MjogKCAoIChsdl9wYXJhbWV0ZXJUeXBlXzBfMD0gcnVsZUp2bVR5cGVSZWZlcmVuY2UgKSApPyAoIChsdl9uYW1lXzFfMD0gcnVsZVZhbGlkSUQgKSApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjc0MTk6MjogKCAoICggKGx2X3BhcmFtZXRlclR5cGVfMF8wPSBydWxlSnZtVHlwZVJlZmVyZW5jZSApICk/ICggKGx2X25hbWVfMV8wPSBydWxlVmFsaWRJRCApICkgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo3NDIwOjI6ICggKCAobHZfcGFyYW1ldGVyVHlwZV8wXzA9IHJ1bGVKdm1UeXBlUmVmZXJlbmNlICkgKT8gKCAobHZfbmFtZV8xXzA9IHJ1bGVWYWxpZElEICkgKSApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo2OTgxOjI6ICggKCAobHZfcGFyYW1ldGVyVHlwZV8wXzA9IHJ1bGVKdm1UeXBlUmVmZXJlbmNlICkgKT8gKCAobHZfbmFtZV8xXzA9IHJ1bGVWYWxpZElEICkgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo2OTgyOjM6ICggKGx2X3BhcmFtZXRlclR5cGVfMF8wPSBydWxlSnZtVHlwZVJlZmVyZW5jZSApICk/ICggKGx2X25hbWVfMV8wPSBydWxlVmFsaWRJRCApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjc0MjA6MjogKCAoIChsdl9wYXJhbWV0ZXJUeXBlXzBfMD0gcnVsZUp2bVR5cGVSZWZlcmVuY2UgKSApPyAoIChsdl9uYW1lXzFfMD0gcnVsZVZhbGlkSUQgKSApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjc0MjE6MzogKCAobHZfcGFyYW1ldGVyVHlwZV8wXzA9IHJ1bGVKdm1UeXBlUmVmZXJlbmNlICkgKT8gKCAobHZfbmFtZV8xXzA9IHJ1bGVWYWxpZElEICkgKQogICAgICAgICAgICAgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6Njk4MjozOiAoIChsdl9wYXJhbWV0ZXJUeXBlXzBfMD0gcnVsZUp2bVR5cGVSZWZlcmVuY2UgKSApPwotICAgICAgICAgICAgaW50IGFsdDEyMD0yOwotICAgICAgICAgICAgaW50IExBMTIwXzAgPSBpbnB1dC5MQSgxKTsKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjc0MjE6MzogKCAobHZfcGFyYW1ldGVyVHlwZV8wXzA9IHJ1bGVKdm1UeXBlUmVmZXJlbmNlICkgKT8KKyAgICAgICAgICAgIGludCBhbHQxMzE9MjsKKyAgICAgICAgICAgIGludCBMQTEzMV8wID0gaW5wdXQuTEEoMSk7CiAKLSAgICAgICAgICAgIGlmICggKExBMTIwXzA9PVJVTEVfSUQpICkgewotICAgICAgICAgICAgICAgIGludCBMQTEyMF8xID0gaW5wdXQuTEEoMik7CisgICAgICAgICAgICBpZiAoIChMQTEzMV8wPT1SVUxFX0lEKSApIHsKKyAgICAgICAgICAgICAgICBpbnQgTEExMzFfMSA9IGlucHV0LkxBKDIpOwogCi0gICAgICAgICAgICAgICAgaWYgKCAoTEExMjBfMT09UlVMRV9JRHx8TEExMjBfMT09Njd8fExBMTIwXzE9PTc5fHxMQTEyMF8xPT04NikgKSB7Ci0gICAgICAgICAgICAgICAgICAgIGFsdDEyMD0xOworICAgICAgICAgICAgICAgIGlmICggKExBMTMxXzE9PVJVTEVfSUR8fExBMTMxXzE9PTc0fHxMQTEzMV8xPT04Nnx8TEExMzFfMT09OTMpICkgeworICAgICAgICAgICAgICAgICAgICBhbHQxMzE9MTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIGlmICggKExBMTIwXzA9PTc0fHxMQTEyMF8wPT05OSkgKSB7Ci0gICAgICAgICAgICAgICAgYWx0MTIwPTE7CisgICAgICAgICAgICBlbHNlIGlmICggKExBMTMxXzA9PTgxfHxMQTEzMV8wPT0xMDYpICkgeworICAgICAgICAgICAgICAgIGFsdDEzMT0xOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgc3dpdGNoIChhbHQxMjApIHsKKyAgICAgICAgICAgIHN3aXRjaCAoYWx0MTMxKSB7CiAgICAgICAgICAgICAgICAgY2FzZSAxIDoKLSAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6Njk4Mzo0OiAobHZfcGFyYW1ldGVyVHlwZV8wXzA9IHJ1bGVKdm1UeXBlUmVmZXJlbmNlICkKKyAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NzQyMjo0OiAobHZfcGFyYW1ldGVyVHlwZV8wXzA9IHJ1bGVKdm1UeXBlUmVmZXJlbmNlICkKICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo2OTgzOjQ6IChsdl9wYXJhbWV0ZXJUeXBlXzBfMD0gcnVsZUp2bVR5cGVSZWZlcmVuY2UgKQotICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo2OTg0OjU6IGx2X3BhcmFtZXRlclR5cGVfMF8wPSBydWxlSnZtVHlwZVJlZmVyZW5jZQorICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo3NDIyOjQ6IChsdl9wYXJhbWV0ZXJUeXBlXzBfMD0gcnVsZUp2bVR5cGVSZWZlcmVuY2UgKQorICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo3NDIzOjU6IGx2X3BhcmFtZXRlclR5cGVfMF8wPSBydWxlSnZtVHlwZVJlZmVyZW5jZQogICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogCkBAIC0xOTA1NywxMSArMjAyNTEsMTEgQEAKIAogICAgICAgICAgICAgfQogCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo3MDAxOjM6ICggKGx2X25hbWVfMV8wPSBydWxlVmFsaWRJRCApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjcwMDI6NDogKGx2X25hbWVfMV8wPSBydWxlVmFsaWRJRCApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo3NDQwOjM6ICggKGx2X25hbWVfMV8wPSBydWxlVmFsaWRJRCApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjc0NDE6NDogKGx2X25hbWVfMV8wPSBydWxlVmFsaWRJRCApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo3MDAyOjQ6IChsdl9uYW1lXzFfMD0gcnVsZVZhbGlkSUQgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NzAwMzo1OiBsdl9uYW1lXzFfMD0gcnVsZVZhbGlkSUQKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjc0NDE6NDogKGx2X25hbWVfMV8wPSBydWxlVmFsaWRJRCApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo3NDQyOjU6IGx2X25hbWVfMV8wPSBydWxlVmFsaWRJRAogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAKQEAgLTE5MTE3LDcgKzIwMzExLDcgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJlbnRyeVJ1bGVGdWxsSnZtRm9ybWFsUGFyYW1ldGVyIgotICAgIC8vIEludGVybmFsRGF0YURTTC5nOjcwMjQ6MTogZW50cnlSdWxlRnVsbEp2bUZvcm1hbFBhcmFtZXRlciByZXR1cm5zIFtFT2JqZWN0IGN1cnJlbnQ9bnVsbF0gOiBpdl9ydWxlRnVsbEp2bUZvcm1hbFBhcmFtZXRlcj0gcnVsZUZ1bGxKdm1Gb3JtYWxQYXJhbWV0ZXIgRU9GIDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo3NDYzOjE6IGVudHJ5UnVsZUZ1bGxKdm1Gb3JtYWxQYXJhbWV0ZXIgcmV0dXJucyBbRU9iamVjdCBjdXJyZW50PW51bGxdIDogaXZfcnVsZUZ1bGxKdm1Gb3JtYWxQYXJhbWV0ZXI9IHJ1bGVGdWxsSnZtRm9ybWFsUGFyYW1ldGVyIEVPRiA7CiAgICAgcHVibGljIGZpbmFsIEVPYmplY3QgZW50cnlSdWxlRnVsbEp2bUZvcm1hbFBhcmFtZXRlcigpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAgICAgICAgIEVPYmplY3QgY3VycmVudCA9IG51bGw7CiAKQEAgLTE5MTI1LDggKzIwMzE5LDggQEAKIAogCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo3MDI0OjYzOiAoaXZfcnVsZUZ1bGxKdm1Gb3JtYWxQYXJhbWV0ZXI9IHJ1bGVGdWxsSnZtRm9ybWFsUGFyYW1ldGVyIEVPRiApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo3MDI1OjI6IGl2X3J1bGVGdWxsSnZtRm9ybWFsUGFyYW1ldGVyPSBydWxlRnVsbEp2bUZvcm1hbFBhcmFtZXRlciBFT0YKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjc0NjM6NjM6IChpdl9ydWxlRnVsbEp2bUZvcm1hbFBhcmFtZXRlcj0gcnVsZUZ1bGxKdm1Gb3JtYWxQYXJhbWV0ZXIgRU9GICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjc0NjQ6MjogaXZfcnVsZUZ1bGxKdm1Gb3JtYWxQYXJhbWV0ZXI9IHJ1bGVGdWxsSnZtRm9ybWFsUGFyYW1ldGVyIEVPRgogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBuZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0RnVsbEp2bUZvcm1hbFBhcmFtZXRlclJ1bGUoKSk7IApAQCAtMTkxNTcsNyArMjAzNTEsNyBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVGdWxsSnZtRm9ybWFsUGFyYW1ldGVyIgotICAgIC8vIEludGVybmFsRGF0YURTTC5nOjcwMzE6MTogcnVsZUZ1bGxKdm1Gb3JtYWxQYXJhbWV0ZXIgcmV0dXJucyBbRU9iamVjdCBjdXJyZW50PW51bGxdIDogKCAoIChsdl9wYXJhbWV0ZXJUeXBlXzBfMD0gcnVsZUp2bVR5cGVSZWZlcmVuY2UgKSApICggKGx2X25hbWVfMV8wPSBydWxlVmFsaWRJRCApICkgKSA7CisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NzQ3MDoxOiBydWxlRnVsbEp2bUZvcm1hbFBhcmFtZXRlciByZXR1cm5zIFtFT2JqZWN0IGN1cnJlbnQ9bnVsbF0gOiAoICggKGx2X3BhcmFtZXRlclR5cGVfMF8wPSBydWxlSnZtVHlwZVJlZmVyZW5jZSApICkgKCAobHZfbmFtZV8xXzA9IHJ1bGVWYWxpZElEICkgKSApIDsKICAgICBwdWJsaWMgZmluYWwgRU9iamVjdCBydWxlRnVsbEp2bUZvcm1hbFBhcmFtZXRlcigpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAgICAgICAgIEVPYmplY3QgY3VycmVudCA9IG51bGw7CiAKQEAgLTE5MTcwLDE3ICsyMDM2NCwxNyBAQAogICAgICAgICAJZW50ZXJSdWxlKCk7CiAKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjcwMzc6MjogKCAoICggKGx2X3BhcmFtZXRlclR5cGVfMF8wPSBydWxlSnZtVHlwZVJlZmVyZW5jZSApICkgKCAobHZfbmFtZV8xXzA9IHJ1bGVWYWxpZElEICkgKSApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjcwMzg6MjogKCAoIChsdl9wYXJhbWV0ZXJUeXBlXzBfMD0gcnVsZUp2bVR5cGVSZWZlcmVuY2UgKSApICggKGx2X25hbWVfMV8wPSBydWxlVmFsaWRJRCApICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NzQ3NjoyOiAoICggKCAobHZfcGFyYW1ldGVyVHlwZV8wXzA9IHJ1bGVKdm1UeXBlUmVmZXJlbmNlICkgKSAoIChsdl9uYW1lXzFfMD0gcnVsZVZhbGlkSUQgKSApICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NzQ3NzoyOiAoICggKGx2X3BhcmFtZXRlclR5cGVfMF8wPSBydWxlSnZtVHlwZVJlZmVyZW5jZSApICkgKCAobHZfbmFtZV8xXzA9IHJ1bGVWYWxpZElEICkgKSApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo3MDM4OjI6ICggKCAobHZfcGFyYW1ldGVyVHlwZV8wXzA9IHJ1bGVKdm1UeXBlUmVmZXJlbmNlICkgKSAoIChsdl9uYW1lXzFfMD0gcnVsZVZhbGlkSUQgKSApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjcwMzk6MzogKCAobHZfcGFyYW1ldGVyVHlwZV8wXzA9IHJ1bGVKdm1UeXBlUmVmZXJlbmNlICkgKSAoIChsdl9uYW1lXzFfMD0gcnVsZVZhbGlkSUQgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo3NDc3OjI6ICggKCAobHZfcGFyYW1ldGVyVHlwZV8wXzA9IHJ1bGVKdm1UeXBlUmVmZXJlbmNlICkgKSAoIChsdl9uYW1lXzFfMD0gcnVsZVZhbGlkSUQgKSApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjc0Nzg6MzogKCAobHZfcGFyYW1ldGVyVHlwZV8wXzA9IHJ1bGVKdm1UeXBlUmVmZXJlbmNlICkgKSAoIChsdl9uYW1lXzFfMD0gcnVsZVZhbGlkSUQgKSApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo3MDM5OjM6ICggKGx2X3BhcmFtZXRlclR5cGVfMF8wPSBydWxlSnZtVHlwZVJlZmVyZW5jZSApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjcwNDA6NDogKGx2X3BhcmFtZXRlclR5cGVfMF8wPSBydWxlSnZtVHlwZVJlZmVyZW5jZSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo3NDc4OjM6ICggKGx2X3BhcmFtZXRlclR5cGVfMF8wPSBydWxlSnZtVHlwZVJlZmVyZW5jZSApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjc0Nzk6NDogKGx2X3BhcmFtZXRlclR5cGVfMF8wPSBydWxlSnZtVHlwZVJlZmVyZW5jZSApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo3MDQwOjQ6IChsdl9wYXJhbWV0ZXJUeXBlXzBfMD0gcnVsZUp2bVR5cGVSZWZlcmVuY2UgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NzA0MTo1OiBsdl9wYXJhbWV0ZXJUeXBlXzBfMD0gcnVsZUp2bVR5cGVSZWZlcmVuY2UKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjc0Nzk6NDogKGx2X3BhcmFtZXRlclR5cGVfMF8wPSBydWxlSnZtVHlwZVJlZmVyZW5jZSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo3NDgwOjU6IGx2X3BhcmFtZXRlclR5cGVfMF8wPSBydWxlSnZtVHlwZVJlZmVyZW5jZQogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAKQEAgLTE5MjExLDExICsyMDQwNSwxMSBAQAogCiAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjcwNTg6MzogKCAobHZfbmFtZV8xXzA9IHJ1bGVWYWxpZElEICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NzA1OTo0OiAobHZfbmFtZV8xXzA9IHJ1bGVWYWxpZElEICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjc0OTc6MzogKCAobHZfbmFtZV8xXzA9IHJ1bGVWYWxpZElEICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NzQ5ODo0OiAobHZfbmFtZV8xXzA9IHJ1bGVWYWxpZElEICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjcwNTk6NDogKGx2X25hbWVfMV8wPSBydWxlVmFsaWRJRCApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo3MDYwOjU6IGx2X25hbWVfMV8wPSBydWxlVmFsaWRJRAorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NzQ5ODo0OiAobHZfbmFtZV8xXzA9IHJ1bGVWYWxpZElEICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjc0OTk6NTogbHZfbmFtZV8xXzA9IHJ1bGVWYWxpZElECiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKIApAQCAtMTkyNzEsNyArMjA0NjUsNyBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgImVudHJ5UnVsZVhGZWF0dXJlQ2FsbCIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo3MDgxOjE6IGVudHJ5UnVsZVhGZWF0dXJlQ2FsbCByZXR1cm5zIFtFT2JqZWN0IGN1cnJlbnQ9bnVsbF0gOiBpdl9ydWxlWEZlYXR1cmVDYWxsPSBydWxlWEZlYXR1cmVDYWxsIEVPRiA7CisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NzUyMDoxOiBlbnRyeVJ1bGVYRmVhdHVyZUNhbGwgcmV0dXJucyBbRU9iamVjdCBjdXJyZW50PW51bGxdIDogaXZfcnVsZVhGZWF0dXJlQ2FsbD0gcnVsZVhGZWF0dXJlQ2FsbCBFT0YgOwogICAgIHB1YmxpYyBmaW5hbCBFT2JqZWN0IGVudHJ5UnVsZVhGZWF0dXJlQ2FsbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAgICAgICAgIEVPYmplY3QgY3VycmVudCA9IG51bGw7CiAKQEAgLTE5Mjc5LDggKzIwNDczLDggQEAKIAogCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo3MDgxOjUzOiAoaXZfcnVsZVhGZWF0dXJlQ2FsbD0gcnVsZVhGZWF0dXJlQ2FsbCBFT0YgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NzA4MjoyOiBpdl9ydWxlWEZlYXR1cmVDYWxsPSBydWxlWEZlYXR1cmVDYWxsIEVPRgorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NzUyMDo1MzogKGl2X3J1bGVYRmVhdHVyZUNhbGw9IHJ1bGVYRmVhdHVyZUNhbGwgRU9GICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjc1MjE6MjogaXZfcnVsZVhGZWF0dXJlQ2FsbD0gcnVsZVhGZWF0dXJlQ2FsbCBFT0YKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgbmV3Q29tcG9zaXRlTm9kZShncmFtbWFyQWNjZXNzLmdldFhGZWF0dXJlQ2FsbFJ1bGUoKSk7IApAQCAtMTkzMTEsNyArMjA1MDUsNyBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVYRmVhdHVyZUNhbGwiCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NzA4ODoxOiBydWxlWEZlYXR1cmVDYWxsIHJldHVybnMgW0VPYmplY3QgY3VycmVudD1udWxsXSA6ICggKCkgKG90aGVybHZfMT0gJzwnICggKGx2X3R5cGVBcmd1bWVudHNfMl8wPSBydWxlSnZtQXJndW1lbnRUeXBlUmVmZXJlbmNlICkgKSAob3RoZXJsdl8zPSAnLCcgKCAobHZfdHlwZUFyZ3VtZW50c180XzA9IHJ1bGVKdm1Bcmd1bWVudFR5cGVSZWZlcmVuY2UgKSApICkqIG90aGVybHZfNT0gJz4nICk/ICggKCBydWxlSWRPclN1cGVyICkgKSAoICggKCAoICcoJyApICk9PiAobHZfZXhwbGljaXRPcGVyYXRpb25DYWxsXzdfMD0gJygnICkgKSAoICggKCAoICgpICggKCAoIHJ1bGVKdm1Gb3JtYWxQYXJhbWV0ZXIgKSApICggJywnICggKCBydWxlSnZtRm9ybWFsUGFyYW1ldGVyICkgKSApKiApPyAoICggJ3wnICkgKSApICk9PiAobHZfZmVhdHVyZUNhbGxBcmd1bWVudHNfOF8wPSBydWxlWFNob3J0Q2xvc3VyZSApICkgfCAoICggKGx2X2ZlYXR1cmVDYWxsQXJndW1lbnRzXzlfMD0gcnVsZVhFeHByZXNzaW9uICkgKSAob3RoZXJsdl8xMD0gJywnICggKGx2X2ZlYXR1cmVDYWxsQXJndW1lbnRzXzExXzA9IHJ1bGVYRXhwcmVzc2lvbiApICkgKSogKSApPyBvdGhlcmx2XzEyPSAnKScgKT8gKCAoICggKCkgJ1snICkgKT0+IChsdl9mZWF0dXJlQ2FsbEFyZ3VtZW50c18xM18wPSBydWxlWENsb3N1cmUgKSApPyApIDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo3NTI3OjE6IHJ1bGVYRmVhdHVyZUNhbGwgcmV0dXJucyBbRU9iamVjdCBjdXJyZW50PW51bGxdIDogKCAoKSAob3RoZXJsdl8xPSAnPCcgKCAobHZfdHlwZUFyZ3VtZW50c18yXzA9IHJ1bGVKdm1Bcmd1bWVudFR5cGVSZWZlcmVuY2UgKSApIChvdGhlcmx2XzM9ICcsJyAoIChsdl90eXBlQXJndW1lbnRzXzRfMD0gcnVsZUp2bUFyZ3VtZW50VHlwZVJlZmVyZW5jZSApICkgKSogb3RoZXJsdl81PSAnPicgKT8gKCAoIHJ1bGVJZE9yU3VwZXIgKSApICggKCAoICggJygnICkgKT0+IChsdl9leHBsaWNpdE9wZXJhdGlvbkNhbGxfN18wPSAnKCcgKSApICggKCAoICggKCkgKCAoICggcnVsZUp2bUZvcm1hbFBhcmFtZXRlciApICkgKCAnLCcgKCAoIHJ1bGVKdm1Gb3JtYWxQYXJhbWV0ZXIgKSApICkqICk/ICggKCAnfCcgKSApICkgKT0+IChsdl9mZWF0dXJlQ2FsbEFyZ3VtZW50c184XzA9IHJ1bGVYU2hvcnRDbG9zdXJlICkgKSB8ICggKCAobHZfZmVhdHVyZUNhbGxBcmd1bWVudHNfOV8wPSBydWxlWEV4cHJlc3Npb24gKSApIChvdGhlcmx2XzEwPSAnLCcgKCAobHZfZmVhdHVyZUNhbGxBcmd1bWVudHNfMTFfMD0gcnVsZVhFeHByZXNzaW9uICkgKSApKiApICk/IG90aGVybHZfMTI9ICcpJyApPyAoICggKCAoKSAnWycgKSApPT4gKGx2X2ZlYXR1cmVDYWxsQXJndW1lbnRzXzEzXzA9IHJ1bGVYQ2xvc3VyZSApICk/ICkgOwogICAgIHB1YmxpYyBmaW5hbCBFT2JqZWN0IHJ1bGVYRmVhdHVyZUNhbGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogICAgICAgICBFT2JqZWN0IGN1cnJlbnQgPSBudWxsOwogCkBAIC0xOTMzOCwxNCArMjA1MzIsMTQgQEAKICAgICAgICAgCWVudGVyUnVsZSgpOwogCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo3MDk0OjI6ICggKCAoKSAob3RoZXJsdl8xPSAnPCcgKCAobHZfdHlwZUFyZ3VtZW50c18yXzA9IHJ1bGVKdm1Bcmd1bWVudFR5cGVSZWZlcmVuY2UgKSApIChvdGhlcmx2XzM9ICcsJyAoIChsdl90eXBlQXJndW1lbnRzXzRfMD0gcnVsZUp2bUFyZ3VtZW50VHlwZVJlZmVyZW5jZSApICkgKSogb3RoZXJsdl81PSAnPicgKT8gKCAoIHJ1bGVJZE9yU3VwZXIgKSApICggKCAoICggJygnICkgKT0+IChsdl9leHBsaWNpdE9wZXJhdGlvbkNhbGxfN18wPSAnKCcgKSApICggKCAoICggKCkgKCAoICggcnVsZUp2bUZvcm1hbFBhcmFtZXRlciApICkgKCAnLCcgKCAoIHJ1bGVKdm1Gb3JtYWxQYXJhbWV0ZXIgKSApICkqICk/ICggKCAnfCcgKSApICkgKT0+IChsdl9mZWF0dXJlQ2FsbEFyZ3VtZW50c184XzA9IHJ1bGVYU2hvcnRDbG9zdXJlICkgKSB8ICggKCAobHZfZmVhdHVyZUNhbGxBcmd1bWVudHNfOV8wPSBydWxlWEV4cHJlc3Npb24gKSApIChvdGhlcmx2XzEwPSAnLCcgKCAobHZfZmVhdHVyZUNhbGxBcmd1bWVudHNfMTFfMD0gcnVsZVhFeHByZXNzaW9uICkgKSApKiApICk/IG90aGVybHZfMTI9ICcpJyApPyAoICggKCAoKSAnWycgKSApPT4gKGx2X2ZlYXR1cmVDYWxsQXJndW1lbnRzXzEzXzA9IHJ1bGVYQ2xvc3VyZSApICk/ICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NzA5NToyOiAoICgpIChvdGhlcmx2XzE9ICc8JyAoIChsdl90eXBlQXJndW1lbnRzXzJfMD0gcnVsZUp2bUFyZ3VtZW50VHlwZVJlZmVyZW5jZSApICkgKG90aGVybHZfMz0gJywnICggKGx2X3R5cGVBcmd1bWVudHNfNF8wPSBydWxlSnZtQXJndW1lbnRUeXBlUmVmZXJlbmNlICkgKSApKiBvdGhlcmx2XzU9ICc+JyApPyAoICggcnVsZUlkT3JTdXBlciApICkgKCAoICggKCAnKCcgKSApPT4gKGx2X2V4cGxpY2l0T3BlcmF0aW9uQ2FsbF83XzA9ICcoJyApICkgKCAoICggKCAoKSAoICggKCBydWxlSnZtRm9ybWFsUGFyYW1ldGVyICkgKSAoICcsJyAoICggcnVsZUp2bUZvcm1hbFBhcmFtZXRlciApICkgKSogKT8gKCAoICd8JyApICkgKSApPT4gKGx2X2ZlYXR1cmVDYWxsQXJndW1lbnRzXzhfMD0gcnVsZVhTaG9ydENsb3N1cmUgKSApIHwgKCAoIChsdl9mZWF0dXJlQ2FsbEFyZ3VtZW50c185XzA9IHJ1bGVYRXhwcmVzc2lvbiApICkgKG90aGVybHZfMTA9ICcsJyAoIChsdl9mZWF0dXJlQ2FsbEFyZ3VtZW50c18xMV8wPSBydWxlWEV4cHJlc3Npb24gKSApICkqICkgKT8gb3RoZXJsdl8xMj0gJyknICk/ICggKCAoICgpICdbJyApICk9PiAobHZfZmVhdHVyZUNhbGxBcmd1bWVudHNfMTNfMD0gcnVsZVhDbG9zdXJlICkgKT8gKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NzUzMzoyOiAoICggKCkgKG90aGVybHZfMT0gJzwnICggKGx2X3R5cGVBcmd1bWVudHNfMl8wPSBydWxlSnZtQXJndW1lbnRUeXBlUmVmZXJlbmNlICkgKSAob3RoZXJsdl8zPSAnLCcgKCAobHZfdHlwZUFyZ3VtZW50c180XzA9IHJ1bGVKdm1Bcmd1bWVudFR5cGVSZWZlcmVuY2UgKSApICkqIG90aGVybHZfNT0gJz4nICk/ICggKCBydWxlSWRPclN1cGVyICkgKSAoICggKCAoICcoJyApICk9PiAobHZfZXhwbGljaXRPcGVyYXRpb25DYWxsXzdfMD0gJygnICkgKSAoICggKCAoICgpICggKCAoIHJ1bGVKdm1Gb3JtYWxQYXJhbWV0ZXIgKSApICggJywnICggKCBydWxlSnZtRm9ybWFsUGFyYW1ldGVyICkgKSApKiApPyAoICggJ3wnICkgKSApICk9PiAobHZfZmVhdHVyZUNhbGxBcmd1bWVudHNfOF8wPSBydWxlWFNob3J0Q2xvc3VyZSApICkgfCAoICggKGx2X2ZlYXR1cmVDYWxsQXJndW1lbnRzXzlfMD0gcnVsZVhFeHByZXNzaW9uICkgKSAob3RoZXJsdl8xMD0gJywnICggKGx2X2ZlYXR1cmVDYWxsQXJndW1lbnRzXzExXzA9IHJ1bGVYRXhwcmVzc2lvbiApICkgKSogKSApPyBvdGhlcmx2XzEyPSAnKScgKT8gKCAoICggKCkgJ1snICkgKT0+IChsdl9mZWF0dXJlQ2FsbEFyZ3VtZW50c18xM18wPSBydWxlWENsb3N1cmUgKSApPyApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjc1MzQ6MjogKCAoKSAob3RoZXJsdl8xPSAnPCcgKCAobHZfdHlwZUFyZ3VtZW50c18yXzA9IHJ1bGVKdm1Bcmd1bWVudFR5cGVSZWZlcmVuY2UgKSApIChvdGhlcmx2XzM9ICcsJyAoIChsdl90eXBlQXJndW1lbnRzXzRfMD0gcnVsZUp2bUFyZ3VtZW50VHlwZVJlZmVyZW5jZSApICkgKSogb3RoZXJsdl81PSAnPicgKT8gKCAoIHJ1bGVJZE9yU3VwZXIgKSApICggKCAoICggJygnICkgKT0+IChsdl9leHBsaWNpdE9wZXJhdGlvbkNhbGxfN18wPSAnKCcgKSApICggKCAoICggKCkgKCAoICggcnVsZUp2bUZvcm1hbFBhcmFtZXRlciApICkgKCAnLCcgKCAoIHJ1bGVKdm1Gb3JtYWxQYXJhbWV0ZXIgKSApICkqICk/ICggKCAnfCcgKSApICkgKT0+IChsdl9mZWF0dXJlQ2FsbEFyZ3VtZW50c184XzA9IHJ1bGVYU2hvcnRDbG9zdXJlICkgKSB8ICggKCAobHZfZmVhdHVyZUNhbGxBcmd1bWVudHNfOV8wPSBydWxlWEV4cHJlc3Npb24gKSApIChvdGhlcmx2XzEwPSAnLCcgKCAobHZfZmVhdHVyZUNhbGxBcmd1bWVudHNfMTFfMD0gcnVsZVhFeHByZXNzaW9uICkgKSApKiApICk/IG90aGVybHZfMTI9ICcpJyApPyAoICggKCAoKSAnWycgKSApPT4gKGx2X2ZlYXR1cmVDYWxsQXJndW1lbnRzXzEzXzA9IHJ1bGVYQ2xvc3VyZSApICk/ICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjcwOTU6MjogKCAoKSAob3RoZXJsdl8xPSAnPCcgKCAobHZfdHlwZUFyZ3VtZW50c18yXzA9IHJ1bGVKdm1Bcmd1bWVudFR5cGVSZWZlcmVuY2UgKSApIChvdGhlcmx2XzM9ICcsJyAoIChsdl90eXBlQXJndW1lbnRzXzRfMD0gcnVsZUp2bUFyZ3VtZW50VHlwZVJlZmVyZW5jZSApICkgKSogb3RoZXJsdl81PSAnPicgKT8gKCAoIHJ1bGVJZE9yU3VwZXIgKSApICggKCAoICggJygnICkgKT0+IChsdl9leHBsaWNpdE9wZXJhdGlvbkNhbGxfN18wPSAnKCcgKSApICggKCAoICggKCkgKCAoICggcnVsZUp2bUZvcm1hbFBhcmFtZXRlciApICkgKCAnLCcgKCAoIHJ1bGVKdm1Gb3JtYWxQYXJhbWV0ZXIgKSApICkqICk/ICggKCAnfCcgKSApICkgKT0+IChsdl9mZWF0dXJlQ2FsbEFyZ3VtZW50c184XzA9IHJ1bGVYU2hvcnRDbG9zdXJlICkgKSB8ICggKCAobHZfZmVhdHVyZUNhbGxBcmd1bWVudHNfOV8wPSBydWxlWEV4cHJlc3Npb24gKSApIChvdGhlcmx2XzEwPSAnLCcgKCAobHZfZmVhdHVyZUNhbGxBcmd1bWVudHNfMTFfMD0gcnVsZVhFeHByZXNzaW9uICkgKSApKiApICk/IG90aGVybHZfMTI9ICcpJyApPyAoICggKCAoKSAnWycgKSApPT4gKGx2X2ZlYXR1cmVDYWxsQXJndW1lbnRzXzEzXzA9IHJ1bGVYQ2xvc3VyZSApICk/ICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjcwOTY6MzogKCkgKG90aGVybHZfMT0gJzwnICggKGx2X3R5cGVBcmd1bWVudHNfMl8wPSBydWxlSnZtQXJndW1lbnRUeXBlUmVmZXJlbmNlICkgKSAob3RoZXJsdl8zPSAnLCcgKCAobHZfdHlwZUFyZ3VtZW50c180XzA9IHJ1bGVKdm1Bcmd1bWVudFR5cGVSZWZlcmVuY2UgKSApICkqIG90aGVybHZfNT0gJz4nICk/ICggKCBydWxlSWRPclN1cGVyICkgKSAoICggKCAoICcoJyApICk9PiAobHZfZXhwbGljaXRPcGVyYXRpb25DYWxsXzdfMD0gJygnICkgKSAoICggKCAoICgpICggKCAoIHJ1bGVKdm1Gb3JtYWxQYXJhbWV0ZXIgKSApICggJywnICggKCBydWxlSnZtRm9ybWFsUGFyYW1ldGVyICkgKSApKiApPyAoICggJ3wnICkgKSApICk9PiAobHZfZmVhdHVyZUNhbGxBcmd1bWVudHNfOF8wPSBydWxlWFNob3J0Q2xvc3VyZSApICkgfCAoICggKGx2X2ZlYXR1cmVDYWxsQXJndW1lbnRzXzlfMD0gcnVsZVhFeHByZXNzaW9uICkgKSAob3RoZXJsdl8xMD0gJywnICggKGx2X2ZlYXR1cmVDYWxsQXJndW1lbnRzXzExXzA9IHJ1bGVYRXhwcmVzc2lvbiApICkgKSogKSApPyBvdGhlcmx2XzEyPSAnKScgKT8gKCAoICggKCkgJ1snICkgKT0+IChsdl9mZWF0dXJlQ2FsbEFyZ3VtZW50c18xM18wPSBydWxlWENsb3N1cmUgKSApPworICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NzUzNDoyOiAoICgpIChvdGhlcmx2XzE9ICc8JyAoIChsdl90eXBlQXJndW1lbnRzXzJfMD0gcnVsZUp2bUFyZ3VtZW50VHlwZVJlZmVyZW5jZSApICkgKG90aGVybHZfMz0gJywnICggKGx2X3R5cGVBcmd1bWVudHNfNF8wPSBydWxlSnZtQXJndW1lbnRUeXBlUmVmZXJlbmNlICkgKSApKiBvdGhlcmx2XzU9ICc+JyApPyAoICggcnVsZUlkT3JTdXBlciApICkgKCAoICggKCAnKCcgKSApPT4gKGx2X2V4cGxpY2l0T3BlcmF0aW9uQ2FsbF83XzA9ICcoJyApICkgKCAoICggKCAoKSAoICggKCBydWxlSnZtRm9ybWFsUGFyYW1ldGVyICkgKSAoICcsJyAoICggcnVsZUp2bUZvcm1hbFBhcmFtZXRlciApICkgKSogKT8gKCAoICd8JyApICkgKSApPT4gKGx2X2ZlYXR1cmVDYWxsQXJndW1lbnRzXzhfMD0gcnVsZVhTaG9ydENsb3N1cmUgKSApIHwgKCAoIChsdl9mZWF0dXJlQ2FsbEFyZ3VtZW50c185XzA9IHJ1bGVYRXhwcmVzc2lvbiApICkgKG90aGVybHZfMTA9ICcsJyAoIChsdl9mZWF0dXJlQ2FsbEFyZ3VtZW50c18xMV8wPSBydWxlWEV4cHJlc3Npb24gKSApICkqICkgKT8gb3RoZXJsdl8xMj0gJyknICk/ICggKCAoICgpICdbJyApICk9PiAobHZfZmVhdHVyZUNhbGxBcmd1bWVudHNfMTNfMD0gcnVsZVhDbG9zdXJlICkgKT8gKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NzUzNTozOiAoKSAob3RoZXJsdl8xPSAnPCcgKCAobHZfdHlwZUFyZ3VtZW50c18yXzA9IHJ1bGVKdm1Bcmd1bWVudFR5cGVSZWZlcmVuY2UgKSApIChvdGhlcmx2XzM9ICcsJyAoIChsdl90eXBlQXJndW1lbnRzXzRfMD0gcnVsZUp2bUFyZ3VtZW50VHlwZVJlZmVyZW5jZSApICkgKSogb3RoZXJsdl81PSAnPicgKT8gKCAoIHJ1bGVJZE9yU3VwZXIgKSApICggKCAoICggJygnICkgKT0+IChsdl9leHBsaWNpdE9wZXJhdGlvbkNhbGxfN18wPSAnKCcgKSApICggKCAoICggKCkgKCAoICggcnVsZUp2bUZvcm1hbFBhcmFtZXRlciApICkgKCAnLCcgKCAoIHJ1bGVKdm1Gb3JtYWxQYXJhbWV0ZXIgKSApICkqICk/ICggKCAnfCcgKSApICkgKT0+IChsdl9mZWF0dXJlQ2FsbEFyZ3VtZW50c184XzA9IHJ1bGVYU2hvcnRDbG9zdXJlICkgKSB8ICggKCAobHZfZmVhdHVyZUNhbGxBcmd1bWVudHNfOV8wPSBydWxlWEV4cHJlc3Npb24gKSApIChvdGhlcmx2XzEwPSAnLCcgKCAobHZfZmVhdHVyZUNhbGxBcmd1bWVudHNfMTFfMD0gcnVsZVhFeHByZXNzaW9uICkgKSApKiApICk/IG90aGVybHZfMTI9ICcpJyApPyAoICggKCAoKSAnWycgKSApPT4gKGx2X2ZlYXR1cmVDYWxsQXJndW1lbnRzXzEzXzA9IHJ1bGVYQ2xvc3VyZSApICk/CiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo3MDk2OjM6ICgpCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo3MDk3OjQ6IAorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NzUzNTozOiAoKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NzUzNjo0OiAKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogCkBAIC0xOTM1NywzNSArMjA1NTEsMzUgQEAKIAogICAgICAgICAgICAgfQogCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo3MTAzOjM6IChvdGhlcmx2XzE9ICc8JyAoIChsdl90eXBlQXJndW1lbnRzXzJfMD0gcnVsZUp2bUFyZ3VtZW50VHlwZVJlZmVyZW5jZSApICkgKG90aGVybHZfMz0gJywnICggKGx2X3R5cGVBcmd1bWVudHNfNF8wPSBydWxlSnZtQXJndW1lbnRUeXBlUmVmZXJlbmNlICkgKSApKiBvdGhlcmx2XzU9ICc+JyApPwotICAgICAgICAgICAgaW50IGFsdDEyMj0yOwotICAgICAgICAgICAgaW50IExBMTIyXzAgPSBpbnB1dC5MQSgxKTsKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjc1NDI6MzogKG90aGVybHZfMT0gJzwnICggKGx2X3R5cGVBcmd1bWVudHNfMl8wPSBydWxlSnZtQXJndW1lbnRUeXBlUmVmZXJlbmNlICkgKSAob3RoZXJsdl8zPSAnLCcgKCAobHZfdHlwZUFyZ3VtZW50c180XzA9IHJ1bGVKdm1Bcmd1bWVudFR5cGVSZWZlcmVuY2UgKSApICkqIG90aGVybHZfNT0gJz4nICk/CisgICAgICAgICAgICBpbnQgYWx0MTMzPTI7CisgICAgICAgICAgICBpbnQgTEExMzNfMCA9IGlucHV0LkxBKDEpOwogCi0gICAgICAgICAgICBpZiAoIChMQTEyMl8wPT04NikgKSB7Ci0gICAgICAgICAgICAgICAgYWx0MTIyPTE7CisgICAgICAgICAgICBpZiAoIChMQTEzM18wPT05MykgKSB7CisgICAgICAgICAgICAgICAgYWx0MTMzPTE7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBzd2l0Y2ggKGFsdDEyMikgeworICAgICAgICAgICAgc3dpdGNoIChhbHQxMzMpIHsKICAgICAgICAgICAgICAgICBjYXNlIDEgOgotICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo3MTA0OjQ6IG90aGVybHZfMT0gJzwnICggKGx2X3R5cGVBcmd1bWVudHNfMl8wPSBydWxlSnZtQXJndW1lbnRUeXBlUmVmZXJlbmNlICkgKSAob3RoZXJsdl8zPSAnLCcgKCAobHZfdHlwZUFyZ3VtZW50c180XzA9IHJ1bGVKdm1Bcmd1bWVudFR5cGVSZWZlcmVuY2UgKSApICkqIG90aGVybHZfNT0gJz4nCisgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjc1NDM6NDogb3RoZXJsdl8xPSAnPCcgKCAobHZfdHlwZUFyZ3VtZW50c18yXzA9IHJ1bGVKdm1Bcmd1bWVudFR5cGVSZWZlcmVuY2UgKSApIChvdGhlcmx2XzM9ICcsJyAoIChsdl90eXBlQXJndW1lbnRzXzRfMD0gcnVsZUp2bUFyZ3VtZW50VHlwZVJlZmVyZW5jZSApICkgKSogb3RoZXJsdl81PSAnPicKICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBvdGhlcmx2XzE9KFRva2VuKW1hdGNoKGlucHV0LDg2LEZPTExPV184OSk7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OworICAgICAgICAgICAgICAgICAgICBvdGhlcmx2XzE9KFRva2VuKW1hdGNoKGlucHV0LDkzLEZPTExPV18xMDMpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gY3VycmVudDsKICAgICAgICAgICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAKICAgICAgICAgICAgICAgICAgICAgICAJCQkJbmV3TGVhZk5vZGUob3RoZXJsdl8xLCBncmFtbWFyQWNjZXNzLmdldFhGZWF0dXJlQ2FsbEFjY2VzcygpLmdldExlc3NUaGFuU2lnbktleXdvcmRfMV8wKCkpOwogICAgICAgICAgICAgICAgICAgICAgIAkJCQogICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjcxMDg6NDogKCAobHZfdHlwZUFyZ3VtZW50c18yXzA9IHJ1bGVKdm1Bcmd1bWVudFR5cGVSZWZlcmVuY2UgKSApCi0gICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjcxMDk6NTogKGx2X3R5cGVBcmd1bWVudHNfMl8wPSBydWxlSnZtQXJndW1lbnRUeXBlUmVmZXJlbmNlICkKKyAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NzU0Nzo0OiAoIChsdl90eXBlQXJndW1lbnRzXzJfMD0gcnVsZUp2bUFyZ3VtZW50VHlwZVJlZmVyZW5jZSApICkKKyAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NzU0ODo1OiAobHZfdHlwZUFyZ3VtZW50c18yXzA9IHJ1bGVKdm1Bcmd1bWVudFR5cGVSZWZlcmVuY2UgKQogICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjcxMDk6NTogKGx2X3R5cGVBcmd1bWVudHNfMl8wPSBydWxlSnZtQXJndW1lbnRUeXBlUmVmZXJlbmNlICkKLSAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NzExMDo2OiBsdl90eXBlQXJndW1lbnRzXzJfMD0gcnVsZUp2bUFyZ3VtZW50VHlwZVJlZmVyZW5jZQorICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo3NTQ4OjU6IChsdl90eXBlQXJndW1lbnRzXzJfMD0gcnVsZUp2bUFyZ3VtZW50VHlwZVJlZmVyZW5jZSApCisgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjc1NDk6NjogbHZfdHlwZUFyZ3VtZW50c18yXzA9IHJ1bGVKdm1Bcmd1bWVudFR5cGVSZWZlcmVuY2UKICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKIAogICAgICAgICAgICAgICAgICAgICAgIAkJCQkJCW5ld0NvbXBvc2l0ZU5vZGUoZ3JhbW1hckFjY2Vzcy5nZXRYRmVhdHVyZUNhbGxBY2Nlc3MoKS5nZXRUeXBlQXJndW1lbnRzSnZtQXJndW1lbnRUeXBlUmVmZXJlbmNlUGFyc2VyUnVsZUNhbGxfMV8xXzAoKSk7CiAgICAgICAgICAgICAgICAgICAgICAgCQkJCQkKICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV185MCk7CisgICAgICAgICAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzEwNCk7CiAgICAgICAgICAgICAgICAgICAgIGx2X3R5cGVBcmd1bWVudHNfMl8wPXJ1bGVKdm1Bcmd1bWVudFR5cGVSZWZlcmVuY2UoKTsKIAogICAgICAgICAgICAgICAgICAgICBzdGF0ZS5fZnNwLS07CkBAIC0xOTQwOSwzOSArMjA2MDMsMzkgQEAKIAogICAgICAgICAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NzEyNzo0OiAob3RoZXJsdl8zPSAnLCcgKCAobHZfdHlwZUFyZ3VtZW50c180XzA9IHJ1bGVKdm1Bcmd1bWVudFR5cGVSZWZlcmVuY2UgKSApICkqCi0gICAgICAgICAgICAgICAgICAgIGxvb3AxMjE6CisgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjc1NjY6NDogKG90aGVybHZfMz0gJywnICggKGx2X3R5cGVBcmd1bWVudHNfNF8wPSBydWxlSnZtQXJndW1lbnRUeXBlUmVmZXJlbmNlICkgKSApKgorICAgICAgICAgICAgICAgICAgICBsb29wMTMyOgogICAgICAgICAgICAgICAgICAgICBkbyB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpbnQgYWx0MTIxPTI7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpbnQgTEExMjFfMCA9IGlucHV0LkxBKDEpOworICAgICAgICAgICAgICAgICAgICAgICAgaW50IGFsdDEzMj0yOworICAgICAgICAgICAgICAgICAgICAgICAgaW50IExBMTMyXzAgPSBpbnB1dC5MQSgxKTsKIAotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCAoTEExMjFfMD09NzUpICkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsdDEyMT0xOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCAoTEExMzJfMD09ODIpICkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsdDEzMj0xOwogICAgICAgICAgICAgICAgICAgICAgICAgfQogCiAKLSAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoYWx0MTIxKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKGFsdDEzMikgewogICAgICAgICAgICAgICAgICAgICAJY2FzZSAxIDoKLSAgICAgICAgICAgICAgICAgICAgCSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo3MTI4OjU6IG90aGVybHZfMz0gJywnICggKGx2X3R5cGVBcmd1bWVudHNfNF8wPSBydWxlSnZtQXJndW1lbnRUeXBlUmVmZXJlbmNlICkgKQorICAgICAgICAgICAgICAgICAgICAJICAgIC8vIEludGVybmFsRGF0YURTTC5nOjc1Njc6NTogb3RoZXJsdl8zPSAnLCcgKCAobHZfdHlwZUFyZ3VtZW50c180XzA9IHJ1bGVKdm1Bcmd1bWVudFR5cGVSZWZlcmVuY2UgKSApCiAgICAgICAgICAgICAgICAgICAgIAkgICAgewotICAgICAgICAgICAgICAgICAgICAJICAgIG90aGVybHZfMz0oVG9rZW4pbWF0Y2goaW5wdXQsNzUsRk9MTE9XXzg5KTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7CisgICAgICAgICAgICAgICAgICAgIAkgICAgb3RoZXJsdl8zPShUb2tlbiltYXRjaChpbnB1dCw4MixGT0xMT1dfMTAzKTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7CiAgICAgICAgICAgICAgICAgICAgIAkgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAKICAgICAgICAgICAgICAgICAgICAgCSAgICAgIAkJCQkJbmV3TGVhZk5vZGUob3RoZXJsdl8zLCBncmFtbWFyQWNjZXNzLmdldFhGZWF0dXJlQ2FsbEFjY2VzcygpLmdldENvbW1hS2V5d29yZF8xXzJfMCgpKTsKICAgICAgICAgICAgICAgICAgICAgCSAgICAgIAkJCQkKICAgICAgICAgICAgICAgICAgICAgCSAgICB9Ci0gICAgICAgICAgICAgICAgICAgIAkgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NzEzMjo1OiAoIChsdl90eXBlQXJndW1lbnRzXzRfMD0gcnVsZUp2bUFyZ3VtZW50VHlwZVJlZmVyZW5jZSApICkKLSAgICAgICAgICAgICAgICAgICAgCSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo3MTMzOjY6IChsdl90eXBlQXJndW1lbnRzXzRfMD0gcnVsZUp2bUFyZ3VtZW50VHlwZVJlZmVyZW5jZSApCisgICAgICAgICAgICAgICAgICAgIAkgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NzU3MTo1OiAoIChsdl90eXBlQXJndW1lbnRzXzRfMD0gcnVsZUp2bUFyZ3VtZW50VHlwZVJlZmVyZW5jZSApICkKKyAgICAgICAgICAgICAgICAgICAgCSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo3NTcyOjY6IChsdl90eXBlQXJndW1lbnRzXzRfMD0gcnVsZUp2bUFyZ3VtZW50VHlwZVJlZmVyZW5jZSApCiAgICAgICAgICAgICAgICAgICAgIAkgICAgewotICAgICAgICAgICAgICAgICAgICAJICAgIC8vIEludGVybmFsRGF0YURTTC5nOjcxMzM6NjogKGx2X3R5cGVBcmd1bWVudHNfNF8wPSBydWxlSnZtQXJndW1lbnRUeXBlUmVmZXJlbmNlICkKLSAgICAgICAgICAgICAgICAgICAgCSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo3MTM0Ojc6IGx2X3R5cGVBcmd1bWVudHNfNF8wPSBydWxlSnZtQXJndW1lbnRUeXBlUmVmZXJlbmNlCisgICAgICAgICAgICAgICAgICAgIAkgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NzU3Mjo2OiAobHZfdHlwZUFyZ3VtZW50c180XzA9IHJ1bGVKdm1Bcmd1bWVudFR5cGVSZWZlcmVuY2UgKQorICAgICAgICAgICAgICAgICAgICAJICAgIC8vIEludGVybmFsRGF0YURTTC5nOjc1NzM6NzogbHZfdHlwZUFyZ3VtZW50c180XzA9IHJ1bGVKdm1Bcmd1bWVudFR5cGVSZWZlcmVuY2UKICAgICAgICAgICAgICAgICAgICAgCSAgICB7CiAgICAgICAgICAgICAgICAgICAgIAkgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAKICAgICAgICAgICAgICAgICAgICAgCSAgICAgIAkJCQkJCQluZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0WEZlYXR1cmVDYWxsQWNjZXNzKCkuZ2V0VHlwZUFyZ3VtZW50c0p2bUFyZ3VtZW50VHlwZVJlZmVyZW5jZVBhcnNlclJ1bGVDYWxsXzFfMl8xXzAoKSk7CiAgICAgICAgICAgICAgICAgICAgIAkgICAgICAJCQkJCQkKICAgICAgICAgICAgICAgICAgICAgCSAgICB9Ci0gICAgICAgICAgICAgICAgICAgIAkgICAgcHVzaEZvbGxvdyhGT0xMT1dfOTApOworICAgICAgICAgICAgICAgICAgICAJICAgIHB1c2hGb2xsb3coRk9MTE9XXzEwNCk7CiAgICAgICAgICAgICAgICAgICAgIAkgICAgbHZfdHlwZUFyZ3VtZW50c180XzA9cnVsZUp2bUFyZ3VtZW50VHlwZVJlZmVyZW5jZSgpOwogCiAgICAgICAgICAgICAgICAgICAgIAkgICAgc3RhdGUuX2ZzcC0tOwpAQCAtMTk0NzAsMTEgKzIwNjY0LDExIEBACiAgICAgICAgICAgICAgICAgICAgIAkgICAgYnJlYWs7CiAKICAgICAgICAgICAgICAgICAgICAgCWRlZmF1bHQgOgotICAgICAgICAgICAgICAgICAgICAJICAgIGJyZWFrIGxvb3AxMjE7CisgICAgICAgICAgICAgICAgICAgIAkgICAgYnJlYWsgbG9vcDEzMjsKICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgfSB3aGlsZSAodHJ1ZSk7CiAKLSAgICAgICAgICAgICAgICAgICAgb3RoZXJsdl81PShUb2tlbiltYXRjaChpbnB1dCw4NyxGT0xMT1dfODgpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gY3VycmVudDsKKyAgICAgICAgICAgICAgICAgICAgb3RoZXJsdl81PShUb2tlbiltYXRjaChpbnB1dCw5NCxGT0xMT1dfMTAyKTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7CiAgICAgICAgICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogCiAgICAgICAgICAgICAgICAgICAgICAgCQkJCW5ld0xlYWZOb2RlKG90aGVybHZfNSwgZ3JhbW1hckFjY2Vzcy5nZXRYRmVhdHVyZUNhbGxBY2Nlc3MoKS5nZXRHcmVhdGVyVGhhblNpZ25LZXl3b3JkXzFfMygpKTsKQEAgLTE5NDg2LDExICsyMDY4MCwxMSBAQAogCiAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjcxNTc6MzogKCAoIHJ1bGVJZE9yU3VwZXIgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo3MTU4OjQ6ICggcnVsZUlkT3JTdXBlciApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo3NTk2OjM6ICggKCBydWxlSWRPclN1cGVyICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NzU5Nzo0OiAoIHJ1bGVJZE9yU3VwZXIgKQogICAgICAgICAgICAgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NzE1ODo0OiAoIHJ1bGVJZE9yU3VwZXIgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NzE1OTo1OiBydWxlSWRPclN1cGVyCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo3NTk3OjQ6ICggcnVsZUlkT3JTdXBlciApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo3NTk4OjU6IHJ1bGVJZE9yU3VwZXIKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogCkBAIC0xOTUwNCw3ICsyMDY5OCw3IEBACiAgICAgICAgICAgICAgIAkJCQkJbmV3Q29tcG9zaXRlTm9kZShncmFtbWFyQWNjZXNzLmdldFhGZWF0dXJlQ2FsbEFjY2VzcygpLmdldEZlYXR1cmVKdm1JZGVudGlmaWFibGVFbGVtZW50Q3Jvc3NSZWZlcmVuY2VfMl8wKCkpOwogICAgICAgICAgICAgICAJCQkJCiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV18xMTkpOworICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMTMyKTsKICAgICAgICAgICAgIHJ1bGVJZE9yU3VwZXIoKTsKIAogICAgICAgICAgICAgc3RhdGUuX2ZzcC0tOwpAQCAtMTk1MjAsMjAgKzIwNzE0LDIwIEBACiAKICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NzE3MzozOiAoICggKCAoICcoJyApICk9PiAobHZfZXhwbGljaXRPcGVyYXRpb25DYWxsXzdfMD0gJygnICkgKSAoICggKCAoICgpICggKCAoIHJ1bGVKdm1Gb3JtYWxQYXJhbWV0ZXIgKSApICggJywnICggKCBydWxlSnZtRm9ybWFsUGFyYW1ldGVyICkgKSApKiApPyAoICggJ3wnICkgKSApICk9PiAobHZfZmVhdHVyZUNhbGxBcmd1bWVudHNfOF8wPSBydWxlWFNob3J0Q2xvc3VyZSApICkgfCAoICggKGx2X2ZlYXR1cmVDYWxsQXJndW1lbnRzXzlfMD0gcnVsZVhFeHByZXNzaW9uICkgKSAob3RoZXJsdl8xMD0gJywnICggKGx2X2ZlYXR1cmVDYWxsQXJndW1lbnRzXzExXzA9IHJ1bGVYRXhwcmVzc2lvbiApICkgKSogKSApPyBvdGhlcmx2XzEyPSAnKScgKT8KLSAgICAgICAgICAgIGludCBhbHQxMjU9MjsKLSAgICAgICAgICAgIGFsdDEyNSA9IGRmYTEyNS5wcmVkaWN0KGlucHV0KTsKLSAgICAgICAgICAgIHN3aXRjaCAoYWx0MTI1KSB7CisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo3NjEyOjM6ICggKCAoICggJygnICkgKT0+IChsdl9leHBsaWNpdE9wZXJhdGlvbkNhbGxfN18wPSAnKCcgKSApICggKCAoICggKCkgKCAoICggcnVsZUp2bUZvcm1hbFBhcmFtZXRlciApICkgKCAnLCcgKCAoIHJ1bGVKdm1Gb3JtYWxQYXJhbWV0ZXIgKSApICkqICk/ICggKCAnfCcgKSApICkgKT0+IChsdl9mZWF0dXJlQ2FsbEFyZ3VtZW50c184XzA9IHJ1bGVYU2hvcnRDbG9zdXJlICkgKSB8ICggKCAobHZfZmVhdHVyZUNhbGxBcmd1bWVudHNfOV8wPSBydWxlWEV4cHJlc3Npb24gKSApIChvdGhlcmx2XzEwPSAnLCcgKCAobHZfZmVhdHVyZUNhbGxBcmd1bWVudHNfMTFfMD0gcnVsZVhFeHByZXNzaW9uICkgKSApKiApICk/IG90aGVybHZfMTI9ICcpJyApPworICAgICAgICAgICAgaW50IGFsdDEzNj0yOworICAgICAgICAgICAgYWx0MTM2ID0gZGZhMTM2LnByZWRpY3QoaW5wdXQpOworICAgICAgICAgICAgc3dpdGNoIChhbHQxMzYpIHsKICAgICAgICAgICAgICAgICBjYXNlIDEgOgotICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo3MTc0OjQ6ICggKCAoICcoJyApICk9PiAobHZfZXhwbGljaXRPcGVyYXRpb25DYWxsXzdfMD0gJygnICkgKSAoICggKCAoICgpICggKCAoIHJ1bGVKdm1Gb3JtYWxQYXJhbWV0ZXIgKSApICggJywnICggKCBydWxlSnZtRm9ybWFsUGFyYW1ldGVyICkgKSApKiApPyAoICggJ3wnICkgKSApICk9PiAobHZfZmVhdHVyZUNhbGxBcmd1bWVudHNfOF8wPSBydWxlWFNob3J0Q2xvc3VyZSApICkgfCAoICggKGx2X2ZlYXR1cmVDYWxsQXJndW1lbnRzXzlfMD0gcnVsZVhFeHByZXNzaW9uICkgKSAob3RoZXJsdl8xMD0gJywnICggKGx2X2ZlYXR1cmVDYWxsQXJndW1lbnRzXzExXzA9IHJ1bGVYRXhwcmVzc2lvbiApICkgKSogKSApPyBvdGhlcmx2XzEyPSAnKScKKyAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NzYxMzo0OiAoICggKCAnKCcgKSApPT4gKGx2X2V4cGxpY2l0T3BlcmF0aW9uQ2FsbF83XzA9ICcoJyApICkgKCAoICggKCAoKSAoICggKCBydWxlSnZtRm9ybWFsUGFyYW1ldGVyICkgKSAoICcsJyAoICggcnVsZUp2bUZvcm1hbFBhcmFtZXRlciApICkgKSogKT8gKCAoICd8JyApICkgKSApPT4gKGx2X2ZlYXR1cmVDYWxsQXJndW1lbnRzXzhfMD0gcnVsZVhTaG9ydENsb3N1cmUgKSApIHwgKCAoIChsdl9mZWF0dXJlQ2FsbEFyZ3VtZW50c185XzA9IHJ1bGVYRXhwcmVzc2lvbiApICkgKG90aGVybHZfMTA9ICcsJyAoIChsdl9mZWF0dXJlQ2FsbEFyZ3VtZW50c18xMV8wPSBydWxlWEV4cHJlc3Npb24gKSApICkqICkgKT8gb3RoZXJsdl8xMj0gJyknCiAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NzE3NDo0OiAoICggKCAnKCcgKSApPT4gKGx2X2V4cGxpY2l0T3BlcmF0aW9uQ2FsbF83XzA9ICcoJyApICkKLSAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NzE3NTo1OiAoICggJygnICkgKT0+IChsdl9leHBsaWNpdE9wZXJhdGlvbkNhbGxfN18wPSAnKCcgKQorICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo3NjEzOjQ6ICggKCAoICcoJyApICk9PiAobHZfZXhwbGljaXRPcGVyYXRpb25DYWxsXzdfMD0gJygnICkgKQorICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo3NjE0OjU6ICggKCAnKCcgKSApPT4gKGx2X2V4cGxpY2l0T3BlcmF0aW9uQ2FsbF83XzA9ICcoJyApCiAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NzE3OTo1OiAobHZfZXhwbGljaXRPcGVyYXRpb25DYWxsXzdfMD0gJygnICkKLSAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NzE4MDo2OiBsdl9leHBsaWNpdE9wZXJhdGlvbkNhbGxfN18wPSAnKCcKKyAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NzYxODo1OiAobHZfZXhwbGljaXRPcGVyYXRpb25DYWxsXzdfMD0gJygnICkKKyAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NzYxOTo2OiBsdl9leHBsaWNpdE9wZXJhdGlvbkNhbGxfN18wPSAnKCcKICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBsdl9leHBsaWNpdE9wZXJhdGlvbkNhbGxfN18wPShUb2tlbiltYXRjaChpbnB1dCw3NCxGT0xMT1dfOTIpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gY3VycmVudDsKKyAgICAgICAgICAgICAgICAgICAgbHZfZXhwbGljaXRPcGVyYXRpb25DYWxsXzdfMD0oVG9rZW4pbWF0Y2goaW5wdXQsODEsRk9MTE9XXzEwNik7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OwogICAgICAgICAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKIAogICAgICAgICAgICAgICAgICAgICAgIAkJCQkJCW5ld0xlYWZOb2RlKGx2X2V4cGxpY2l0T3BlcmF0aW9uQ2FsbF83XzAsIGdyYW1tYXJBY2Nlc3MuZ2V0WEZlYXR1cmVDYWxsQWNjZXNzKCkuZ2V0RXhwbGljaXRPcGVyYXRpb25DYWxsTGVmdFBhcmVudGhlc2lzS2V5d29yZF8zXzBfMCgpKTsKQEAgLTE5NTUzLDI1ICsyMDc0NywyNSBAQAogCiAgICAgICAgICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo3MTkyOjQ6ICggKCAoICggKCkgKCAoICggcnVsZUp2bUZvcm1hbFBhcmFtZXRlciApICkgKCAnLCcgKCAoIHJ1bGVKdm1Gb3JtYWxQYXJhbWV0ZXIgKSApICkqICk/ICggKCAnfCcgKSApICkgKT0+IChsdl9mZWF0dXJlQ2FsbEFyZ3VtZW50c184XzA9IHJ1bGVYU2hvcnRDbG9zdXJlICkgKSB8ICggKCAobHZfZmVhdHVyZUNhbGxBcmd1bWVudHNfOV8wPSBydWxlWEV4cHJlc3Npb24gKSApIChvdGhlcmx2XzEwPSAnLCcgKCAobHZfZmVhdHVyZUNhbGxBcmd1bWVudHNfMTFfMD0gcnVsZVhFeHByZXNzaW9uICkgKSApKiApICk/Ci0gICAgICAgICAgICAgICAgICAgIGludCBhbHQxMjQ9MzsKLSAgICAgICAgICAgICAgICAgICAgYWx0MTI0ID0gZGZhMTI0LnByZWRpY3QoaW5wdXQpOwotICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKGFsdDEyNCkgeworICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo3NjMxOjQ6ICggKCAoICggKCkgKCAoICggcnVsZUp2bUZvcm1hbFBhcmFtZXRlciApICkgKCAnLCcgKCAoIHJ1bGVKdm1Gb3JtYWxQYXJhbWV0ZXIgKSApICkqICk/ICggKCAnfCcgKSApICkgKT0+IChsdl9mZWF0dXJlQ2FsbEFyZ3VtZW50c184XzA9IHJ1bGVYU2hvcnRDbG9zdXJlICkgKSB8ICggKCAobHZfZmVhdHVyZUNhbGxBcmd1bWVudHNfOV8wPSBydWxlWEV4cHJlc3Npb24gKSApIChvdGhlcmx2XzEwPSAnLCcgKCAobHZfZmVhdHVyZUNhbGxBcmd1bWVudHNfMTFfMD0gcnVsZVhFeHByZXNzaW9uICkgKSApKiApICk/CisgICAgICAgICAgICAgICAgICAgIGludCBhbHQxMzU9MzsKKyAgICAgICAgICAgICAgICAgICAgYWx0MTM1ID0gZGZhMTM1LnByZWRpY3QoaW5wdXQpOworICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKGFsdDEzNSkgewogICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxIDoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo3MTkzOjU6ICggKCAoICgpICggKCAoIHJ1bGVKdm1Gb3JtYWxQYXJhbWV0ZXIgKSApICggJywnICggKCBydWxlSnZtRm9ybWFsUGFyYW1ldGVyICkgKSApKiApPyAoICggJ3wnICkgKSApICk9PiAobHZfZmVhdHVyZUNhbGxBcmd1bWVudHNfOF8wPSBydWxlWFNob3J0Q2xvc3VyZSApICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo3NjMyOjU6ICggKCAoICgpICggKCAoIHJ1bGVKdm1Gb3JtYWxQYXJhbWV0ZXIgKSApICggJywnICggKCBydWxlSnZtRm9ybWFsUGFyYW1ldGVyICkgKSApKiApPyAoICggJ3wnICkgKSApICk9PiAobHZfZmVhdHVyZUNhbGxBcmd1bWVudHNfOF8wPSBydWxlWFNob3J0Q2xvc3VyZSApICkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NzE5Mzo1OiAoICggKCAoKSAoICggKCBydWxlSnZtRm9ybWFsUGFyYW1ldGVyICkgKSAoICcsJyAoICggcnVsZUp2bUZvcm1hbFBhcmFtZXRlciApICkgKSogKT8gKCAoICd8JyApICkgKSApPT4gKGx2X2ZlYXR1cmVDYWxsQXJndW1lbnRzXzhfMD0gcnVsZVhTaG9ydENsb3N1cmUgKSApCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NzE5NDo2OiAoICggKCkgKCAoICggcnVsZUp2bUZvcm1hbFBhcmFtZXRlciApICkgKCAnLCcgKCAoIHJ1bGVKdm1Gb3JtYWxQYXJhbWV0ZXIgKSApICkqICk/ICggKCAnfCcgKSApICkgKT0+IChsdl9mZWF0dXJlQ2FsbEFyZ3VtZW50c184XzA9IHJ1bGVYU2hvcnRDbG9zdXJlICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo3NjMyOjU6ICggKCAoICgpICggKCAoIHJ1bGVKdm1Gb3JtYWxQYXJhbWV0ZXIgKSApICggJywnICggKCBydWxlSnZtRm9ybWFsUGFyYW1ldGVyICkgKSApKiApPyAoICggJ3wnICkgKSApICk9PiAobHZfZmVhdHVyZUNhbGxBcmd1bWVudHNfOF8wPSBydWxlWFNob3J0Q2xvc3VyZSApICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo3NjMzOjY6ICggKCAoKSAoICggKCBydWxlSnZtRm9ybWFsUGFyYW1ldGVyICkgKSAoICcsJyAoICggcnVsZUp2bUZvcm1hbFBhcmFtZXRlciApICkgKSogKT8gKCAoICd8JyApICkgKSApPT4gKGx2X2ZlYXR1cmVDYWxsQXJndW1lbnRzXzhfMD0gcnVsZVhTaG9ydENsb3N1cmUgKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo3MjE5OjY6IChsdl9mZWF0dXJlQ2FsbEFyZ3VtZW50c184XzA9IHJ1bGVYU2hvcnRDbG9zdXJlICkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo3MjIwOjc6IGx2X2ZlYXR1cmVDYWxsQXJndW1lbnRzXzhfMD0gcnVsZVhTaG9ydENsb3N1cmUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo3NjU4OjY6IChsdl9mZWF0dXJlQ2FsbEFyZ3VtZW50c184XzA9IHJ1bGVYU2hvcnRDbG9zdXJlICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo3NjU5Ojc6IGx2X2ZlYXR1cmVDYWxsQXJndW1lbnRzXzhfMD0gcnVsZVhTaG9ydENsb3N1cmUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAkJCQkJCQluZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0WEZlYXR1cmVDYWxsQWNjZXNzKCkuZ2V0RmVhdHVyZUNhbGxBcmd1bWVudHNYU2hvcnRDbG9zdXJlUGFyc2VyUnVsZUNhbGxfM18xXzBfMCgpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAkJCQkJCQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV182Mik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfNzYpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGx2X2ZlYXR1cmVDYWxsQXJndW1lbnRzXzhfMD1ydWxlWFNob3J0Q2xvc3VyZSgpOwogCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGUuX2ZzcC0tOwpAQCAtMTk1OTksMjMgKzIwNzkzLDIzIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAyIDoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo3MjM4OjU6ICggKCAobHZfZmVhdHVyZUNhbGxBcmd1bWVudHNfOV8wPSBydWxlWEV4cHJlc3Npb24gKSApIChvdGhlcmx2XzEwPSAnLCcgKCAobHZfZmVhdHVyZUNhbGxBcmd1bWVudHNfMTFfMD0gcnVsZVhFeHByZXNzaW9uICkgKSApKiApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NzY3Nzo1OiAoICggKGx2X2ZlYXR1cmVDYWxsQXJndW1lbnRzXzlfMD0gcnVsZVhFeHByZXNzaW9uICkgKSAob3RoZXJsdl8xMD0gJywnICggKGx2X2ZlYXR1cmVDYWxsQXJndW1lbnRzXzExXzA9IHJ1bGVYRXhwcmVzc2lvbiApICkgKSogKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo3MjM4OjU6ICggKCAobHZfZmVhdHVyZUNhbGxBcmd1bWVudHNfOV8wPSBydWxlWEV4cHJlc3Npb24gKSApIChvdGhlcmx2XzEwPSAnLCcgKCAobHZfZmVhdHVyZUNhbGxBcmd1bWVudHNfMTFfMD0gcnVsZVhFeHByZXNzaW9uICkgKSApKiApCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NzIzOTo2OiAoIChsdl9mZWF0dXJlQ2FsbEFyZ3VtZW50c185XzA9IHJ1bGVYRXhwcmVzc2lvbiApICkgKG90aGVybHZfMTA9ICcsJyAoIChsdl9mZWF0dXJlQ2FsbEFyZ3VtZW50c18xMV8wPSBydWxlWEV4cHJlc3Npb24gKSApICkqCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NzY3Nzo1OiAoICggKGx2X2ZlYXR1cmVDYWxsQXJndW1lbnRzXzlfMD0gcnVsZVhFeHByZXNzaW9uICkgKSAob3RoZXJsdl8xMD0gJywnICggKGx2X2ZlYXR1cmVDYWxsQXJndW1lbnRzXzExXzA9IHJ1bGVYRXhwcmVzc2lvbiApICkgKSogKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjc2Nzg6NjogKCAobHZfZmVhdHVyZUNhbGxBcmd1bWVudHNfOV8wPSBydWxlWEV4cHJlc3Npb24gKSApIChvdGhlcmx2XzEwPSAnLCcgKCAobHZfZmVhdHVyZUNhbGxBcmd1bWVudHNfMTFfMD0gcnVsZVhFeHByZXNzaW9uICkgKSApKgogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo3MjM5OjY6ICggKGx2X2ZlYXR1cmVDYWxsQXJndW1lbnRzXzlfMD0gcnVsZVhFeHByZXNzaW9uICkgKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjcyNDA6NzogKGx2X2ZlYXR1cmVDYWxsQXJndW1lbnRzXzlfMD0gcnVsZVhFeHByZXNzaW9uICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo3Njc4OjY6ICggKGx2X2ZlYXR1cmVDYWxsQXJndW1lbnRzXzlfMD0gcnVsZVhFeHByZXNzaW9uICkgKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjc2Nzk6NzogKGx2X2ZlYXR1cmVDYWxsQXJndW1lbnRzXzlfMD0gcnVsZVhFeHByZXNzaW9uICkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NzI0MDo3OiAobHZfZmVhdHVyZUNhbGxBcmd1bWVudHNfOV8wPSBydWxlWEV4cHJlc3Npb24gKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjcyNDE6ODogbHZfZmVhdHVyZUNhbGxBcmd1bWVudHNfOV8wPSBydWxlWEV4cHJlc3Npb24KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo3Njc5Ojc6IChsdl9mZWF0dXJlQ2FsbEFyZ3VtZW50c185XzA9IHJ1bGVYRXhwcmVzc2lvbiApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NzY4MDo4OiBsdl9mZWF0dXJlQ2FsbEFyZ3VtZW50c185XzA9IHJ1bGVYRXhwcmVzc2lvbgogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCQkJCQkJCQluZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0WEZlYXR1cmVDYWxsQWNjZXNzKCkuZ2V0RmVhdHVyZUNhbGxBcmd1bWVudHNYRXhwcmVzc2lvblBhcnNlclJ1bGVDYWxsXzNfMV8xXzBfMCgpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAkJCQkJCQkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfNjEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzc1KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsdl9mZWF0dXJlQ2FsbEFyZ3VtZW50c185XzA9cnVsZVhFeHByZXNzaW9uKCk7CiAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZS5fZnNwLS07CkBAIC0xOTYzOSwzOSArMjA4MzMsMzkgQEAKIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjcyNTg6NjogKG90aGVybHZfMTA9ICcsJyAoIChsdl9mZWF0dXJlQ2FsbEFyZ3VtZW50c18xMV8wPSBydWxlWEV4cHJlc3Npb24gKSApICkqCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9vcDEyMzoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo3Njk3OjY6IChvdGhlcmx2XzEwPSAnLCcgKCAobHZfZmVhdHVyZUNhbGxBcmd1bWVudHNfMTFfMD0gcnVsZVhFeHByZXNzaW9uICkgKSApKgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvb3AxMzQ6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG8gewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYWx0MTIzPTI7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBMQTEyM18wID0gaW5wdXQuTEEoMSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBhbHQxMzQ9MjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IExBMTM0XzAgPSBpbnB1dC5MQSgxKTsKIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIChMQTEyM18wPT03NSkgKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbHQxMjM9MTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCAoTEExMzRfMD09ODIpICkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWx0MTM0PTE7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KIAogCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoYWx0MTIzKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoYWx0MTM0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCWNhc2UgMSA6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgCSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo3MjU5Ojc6IG90aGVybHZfMTA9ICcsJyAoIChsdl9mZWF0dXJlQ2FsbEFyZ3VtZW50c18xMV8wPSBydWxlWEV4cHJlc3Npb24gKSApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgCSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo3Njk4Ojc6IG90aGVybHZfMTA9ICcsJyAoIChsdl9mZWF0dXJlQ2FsbEFyZ3VtZW50c18xMV8wPSBydWxlWEV4cHJlc3Npb24gKSApCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCSAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgCSAgICBvdGhlcmx2XzEwPShUb2tlbiltYXRjaChpbnB1dCw3NSxGT0xMT1dfNjQpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gY3VycmVudDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAJICAgIG90aGVybHZfMTA9KFRva2VuKW1hdGNoKGlucHV0LDgyLEZPTExPV183OCk7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIAkgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAJICAgICAgCQkJCQkJCW5ld0xlYWZOb2RlKG90aGVybHZfMTAsIGdyYW1tYXJBY2Nlc3MuZ2V0WEZlYXR1cmVDYWxsQWNjZXNzKCkuZ2V0Q29tbWFLZXl3b3JkXzNfMV8xXzFfMCgpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAJICAgICAgCQkJCQkJCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCSAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgCSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo3MjYzOjc6ICggKGx2X2ZlYXR1cmVDYWxsQXJndW1lbnRzXzExXzA9IHJ1bGVYRXhwcmVzc2lvbiApICkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAJICAgIC8vIEludGVybmFsRGF0YURTTC5nOjcyNjQ6ODogKGx2X2ZlYXR1cmVDYWxsQXJndW1lbnRzXzExXzA9IHJ1bGVYRXhwcmVzc2lvbiApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgCSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo3NzAyOjc6ICggKGx2X2ZlYXR1cmVDYWxsQXJndW1lbnRzXzExXzA9IHJ1bGVYRXhwcmVzc2lvbiApICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAJICAgIC8vIEludGVybmFsRGF0YURTTC5nOjc3MDM6ODogKGx2X2ZlYXR1cmVDYWxsQXJndW1lbnRzXzExXzA9IHJ1bGVYRXhwcmVzc2lvbiApCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCSAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgCSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo3MjY0Ojg6IChsdl9mZWF0dXJlQ2FsbEFyZ3VtZW50c18xMV8wPSBydWxlWEV4cHJlc3Npb24gKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIAkgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NzI2NTo5OiBsdl9mZWF0dXJlQ2FsbEFyZ3VtZW50c18xMV8wPSBydWxlWEV4cHJlc3Npb24KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAJICAgIC8vIEludGVybmFsRGF0YURTTC5nOjc3MDM6ODogKGx2X2ZlYXR1cmVDYWxsQXJndW1lbnRzXzExXzA9IHJ1bGVYRXhwcmVzc2lvbiApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgCSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo3NzA0Ojk6IGx2X2ZlYXR1cmVDYWxsQXJndW1lbnRzXzExXzA9IHJ1bGVYRXhwcmVzc2lvbgogICAgICAgICAgICAgICAgICAgICAgICAgICAgIAkgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgIAkgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAJICAgICAgCQkJCQkJCQkJbmV3Q29tcG9zaXRlTm9kZShncmFtbWFyQWNjZXNzLmdldFhGZWF0dXJlQ2FsbEFjY2VzcygpLmdldEZlYXR1cmVDYWxsQXJndW1lbnRzWEV4cHJlc3Npb25QYXJzZXJSdWxlQ2FsbF8zXzFfMV8xXzFfMCgpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAJICAgICAgCQkJCQkJCQkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAJICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAJICAgIHB1c2hGb2xsb3coRk9MTE9XXzYxKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAJICAgIHB1c2hGb2xsb3coRk9MTE9XXzc1KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAJICAgIGx2X2ZlYXR1cmVDYWxsQXJndW1lbnRzXzExXzA9cnVsZVhFeHByZXNzaW9uKCk7CiAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAJICAgIHN0YXRlLl9mc3AtLTsKQEAgLTE5NzAwLDcgKzIwODk0LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAJICAgIGJyZWFrOwogCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCWRlZmF1bHQgOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIAkgICAgYnJlYWsgbG9vcDEyMzsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAJICAgIGJyZWFrIGxvb3AxMzQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IHdoaWxlICh0cnVlKTsKIApAQCAtMTk3MTMsNyArMjA5MDcsNyBAQAogCiAgICAgICAgICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgICAgICAgICBvdGhlcmx2XzEyPShUb2tlbiltYXRjaChpbnB1dCw3NixGT0xMT1dfMTIwKTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7CisgICAgICAgICAgICAgICAgICAgIG90aGVybHZfMTI9KFRva2VuKW1hdGNoKGlucHV0LDgzLEZPTExPV18xMzMpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gY3VycmVudDsKICAgICAgICAgICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAKICAgICAgICAgICAgICAgICAgICAgICAJCQkJbmV3TGVhZk5vZGUob3RoZXJsdl8xMiwgZ3JhbW1hckFjY2Vzcy5nZXRYRmVhdHVyZUNhbGxBY2Nlc3MoKS5nZXRSaWdodFBhcmVudGhlc2lzS2V5d29yZF8zXzIoKSk7CkBAIC0xOTcyNSwxNSArMjA5MTksMTUgQEAKIAogICAgICAgICAgICAgfQogCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo3MjkwOjM6ICggKCAoICgpICdbJyApICk9PiAobHZfZmVhdHVyZUNhbGxBcmd1bWVudHNfMTNfMD0gcnVsZVhDbG9zdXJlICkgKT8KLSAgICAgICAgICAgIGludCBhbHQxMjY9MjsKLSAgICAgICAgICAgIGFsdDEyNiA9IGRmYTEyNi5wcmVkaWN0KGlucHV0KTsKLSAgICAgICAgICAgIHN3aXRjaCAoYWx0MTI2KSB7CisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo3NzI5OjM6ICggKCAoICgpICdbJyApICk9PiAobHZfZmVhdHVyZUNhbGxBcmd1bWVudHNfMTNfMD0gcnVsZVhDbG9zdXJlICkgKT8KKyAgICAgICAgICAgIGludCBhbHQxMzc9MjsKKyAgICAgICAgICAgIGFsdDEzNyA9IGRmYTEzNy5wcmVkaWN0KGlucHV0KTsKKyAgICAgICAgICAgIHN3aXRjaCAoYWx0MTM3KSB7CiAgICAgICAgICAgICAgICAgY2FzZSAxIDoKLSAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NzI5MTo0OiAoICggKCkgJ1snICkgKT0+IChsdl9mZWF0dXJlQ2FsbEFyZ3VtZW50c18xM18wPSBydWxlWENsb3N1cmUgKQorICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo3NzMwOjQ6ICggKCAoKSAnWycgKSApPT4gKGx2X2ZlYXR1cmVDYWxsQXJndW1lbnRzXzEzXzA9IHJ1bGVYQ2xvc3VyZSApCiAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NzI5Nzo0OiAobHZfZmVhdHVyZUNhbGxBcmd1bWVudHNfMTNfMD0gcnVsZVhDbG9zdXJlICkKLSAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NzI5ODo1OiBsdl9mZWF0dXJlQ2FsbEFyZ3VtZW50c18xM18wPSBydWxlWENsb3N1cmUKKyAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NzczNjo0OiAobHZfZmVhdHVyZUNhbGxBcmd1bWVudHNfMTNfMD0gcnVsZVhDbG9zdXJlICkKKyAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NzczNzo1OiBsdl9mZWF0dXJlQ2FsbEFyZ3VtZW50c18xM18wPSBydWxlWENsb3N1cmUKICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKIApAQCAtMTk3OTIsNyArMjA5ODYsNyBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgImVudHJ5UnVsZUZlYXR1cmVDYWxsSUQiCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NzMxOToxOiBlbnRyeVJ1bGVGZWF0dXJlQ2FsbElEIHJldHVybnMgW1N0cmluZyBjdXJyZW50PW51bGxdIDogaXZfcnVsZUZlYXR1cmVDYWxsSUQ9IHJ1bGVGZWF0dXJlQ2FsbElEIEVPRiA7CisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6Nzc1ODoxOiBlbnRyeVJ1bGVGZWF0dXJlQ2FsbElEIHJldHVybnMgW1N0cmluZyBjdXJyZW50PW51bGxdIDogaXZfcnVsZUZlYXR1cmVDYWxsSUQ9IHJ1bGVGZWF0dXJlQ2FsbElEIEVPRiA7CiAgICAgcHVibGljIGZpbmFsIFN0cmluZyBlbnRyeVJ1bGVGZWF0dXJlQ2FsbElEKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKICAgICAgICAgU3RyaW5nIGN1cnJlbnQgPSBudWxsOwogCkBAIC0xOTgwMCw4ICsyMDk5NCw4IEBACiAKIAogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NzMxOTo1MzogKGl2X3J1bGVGZWF0dXJlQ2FsbElEPSBydWxlRmVhdHVyZUNhbGxJRCBFT0YgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NzMyMDoyOiBpdl9ydWxlRmVhdHVyZUNhbGxJRD0gcnVsZUZlYXR1cmVDYWxsSUQgRU9GCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo3NzU4OjUzOiAoaXZfcnVsZUZlYXR1cmVDYWxsSUQ9IHJ1bGVGZWF0dXJlQ2FsbElEIEVPRiApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo3NzU5OjI6IGl2X3J1bGVGZWF0dXJlQ2FsbElEPSBydWxlRmVhdHVyZUNhbGxJRCBFT0YKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgbmV3Q29tcG9zaXRlTm9kZShncmFtbWFyQWNjZXNzLmdldEZlYXR1cmVDYWxsSURSdWxlKCkpOyAKQEAgLTE5ODMyLDcgKzIxMDI2LDcgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlRmVhdHVyZUNhbGxJRCIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo3MzI2OjE6IHJ1bGVGZWF0dXJlQ2FsbElEIHJldHVybnMgW0FudGxyRGF0YXR5cGVSdWxlVG9rZW4gY3VycmVudD1uZXcgQW50bHJEYXRhdHlwZVJ1bGVUb2tlbigpXSA6ICh0aGlzX1ZhbGlkSURfMD0gcnVsZVZhbGlkSUQgfCBrdz0gJ2V4dGVuZHMnIHwga3c9ICdzdGF0aWMnIHwga3c9ICdpbXBvcnQnIHwga3c9ICdleHRlbnNpb24nICkgOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjc3NjU6MTogcnVsZUZlYXR1cmVDYWxsSUQgcmV0dXJucyBbQW50bHJEYXRhdHlwZVJ1bGVUb2tlbiBjdXJyZW50PW5ldyBBbnRsckRhdGF0eXBlUnVsZVRva2VuKCldIDogKHRoaXNfVmFsaWRJRF8wPSBydWxlVmFsaWRJRCB8IGt3PSAnZXh0ZW5kcycgfCBrdz0gJ3N0YXRpYycgfCBrdz0gJ2ltcG9ydCcgfCBrdz0gJ2V4dGVuc2lvbicgKSA7CiAgICAgcHVibGljIGZpbmFsIEFudGxyRGF0YXR5cGVSdWxlVG9rZW4gcnVsZUZlYXR1cmVDYWxsSUQoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogICAgICAgICBBbnRsckRhdGF0eXBlUnVsZVRva2VuIGN1cnJlbnQgPSBuZXcgQW50bHJEYXRhdHlwZVJ1bGVUb2tlbigpOwogCkBAIC0xOTg0NCw0OCArMjEwMzgsNDggQEAKICAgICAgICAgCWVudGVyUnVsZSgpOwogCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo3MzMyOjI6ICggKHRoaXNfVmFsaWRJRF8wPSBydWxlVmFsaWRJRCB8IGt3PSAnZXh0ZW5kcycgfCBrdz0gJ3N0YXRpYycgfCBrdz0gJ2ltcG9ydCcgfCBrdz0gJ2V4dGVuc2lvbicgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo3MzMzOjI6ICh0aGlzX1ZhbGlkSURfMD0gcnVsZVZhbGlkSUQgfCBrdz0gJ2V4dGVuZHMnIHwga3c9ICdzdGF0aWMnIHwga3c9ICdpbXBvcnQnIHwga3c9ICdleHRlbnNpb24nICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjc3NzE6MjogKCAodGhpc19WYWxpZElEXzA9IHJ1bGVWYWxpZElEIHwga3c9ICdleHRlbmRzJyB8IGt3PSAnc3RhdGljJyB8IGt3PSAnaW1wb3J0JyB8IGt3PSAnZXh0ZW5zaW9uJyApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjc3NzI6MjogKHRoaXNfVmFsaWRJRF8wPSBydWxlVmFsaWRJRCB8IGt3PSAnZXh0ZW5kcycgfCBrdz0gJ3N0YXRpYycgfCBrdz0gJ2ltcG9ydCcgfCBrdz0gJ2V4dGVuc2lvbicgKQogICAgICAgICAgICAgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NzMzMzoyOiAodGhpc19WYWxpZElEXzA9IHJ1bGVWYWxpZElEIHwga3c9ICdleHRlbmRzJyB8IGt3PSAnc3RhdGljJyB8IGt3PSAnaW1wb3J0JyB8IGt3PSAnZXh0ZW5zaW9uJyApCi0gICAgICAgICAgICBpbnQgYWx0MTI3PTU7CisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo3NzcyOjI6ICh0aGlzX1ZhbGlkSURfMD0gcnVsZVZhbGlkSUQgfCBrdz0gJ2V4dGVuZHMnIHwga3c9ICdzdGF0aWMnIHwga3c9ICdpbXBvcnQnIHwga3c9ICdleHRlbnNpb24nICkKKyAgICAgICAgICAgIGludCBhbHQxMzg9NTsKICAgICAgICAgICAgIHN3aXRjaCAoIGlucHV0LkxBKDEpICkgewogICAgICAgICAgICAgY2FzZSBSVUxFX0lEOgogICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBhbHQxMjc9MTsKKyAgICAgICAgICAgICAgICBhbHQxMzg9MTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIDEyMzoKKyAgICAgICAgICAgIGNhc2UgMTMwOgogICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBhbHQxMjc9MjsKKyAgICAgICAgICAgICAgICBhbHQxMzg9MjsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIDY5OgorICAgICAgICAgICAgY2FzZSA3NjoKICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgYWx0MTI3PTM7CisgICAgICAgICAgICAgICAgYWx0MTM4PTM7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSA2ODoKKyAgICAgICAgICAgIGNhc2UgNzU6CiAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGFsdDEyNz00OworICAgICAgICAgICAgICAgIGFsdDEzOD00OwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgNjU6CisgICAgICAgICAgICBjYXNlIDcyOgogICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBhbHQxMjc9NTsKKyAgICAgICAgICAgICAgICBhbHQxMzg9NTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgICAgIGlmIChzdGF0ZS5iYWNrdHJhY2tpbmc+MCkge3N0YXRlLmZhaWxlZD10cnVlOyByZXR1cm4gY3VycmVudDt9CiAgICAgICAgICAgICAgICAgTm9WaWFibGVBbHRFeGNlcHRpb24gbnZhZSA9Ci0gICAgICAgICAgICAgICAgICAgIG5ldyBOb1ZpYWJsZUFsdEV4Y2VwdGlvbigiIiwgMTI3LCAwLCBpbnB1dCk7CisgICAgICAgICAgICAgICAgICAgIG5ldyBOb1ZpYWJsZUFsdEV4Y2VwdGlvbigiIiwgMTM4LCAwLCBpbnB1dCk7CiAKICAgICAgICAgICAgICAgICB0aHJvdyBudmFlOwogICAgICAgICAgICAgfQogCi0gICAgICAgICAgICBzd2l0Y2ggKGFsdDEyNykgeworICAgICAgICAgICAgc3dpdGNoIChhbHQxMzgpIHsKICAgICAgICAgICAgICAgICBjYXNlIDEgOgotICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo3MzM0OjM6IHRoaXNfVmFsaWRJRF8wPSBydWxlVmFsaWRJRAorICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo3NzczOjM6IHRoaXNfVmFsaWRJRF8wPSBydWxlVmFsaWRJRAogICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogCkBAIC0xOTkxMSw5ICsyMTEwNSw5IEBACiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgY2FzZSAyIDoKLSAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NzM0NTozOiBrdz0gJ2V4dGVuZHMnCisgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjc3ODQ6Mzoga3c9ICdleHRlbmRzJwogICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGt3PShUb2tlbiltYXRjaChpbnB1dCwxMjMsRk9MTE9XXzIpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gY3VycmVudDsKKyAgICAgICAgICAgICAgICAgICAga3c9KFRva2VuKW1hdGNoKGlucHV0LDEzMCxGT0xMT1dfMik7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OwogICAgICAgICAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKIAogICAgICAgICAgICAgICAgICAgICAgIAkJCWN1cnJlbnQubWVyZ2Uoa3cpOwpAQCAtMTk5MjQsOSArMjExMTgsOSBAQAogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgIGNhc2UgMyA6Ci0gICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjczNTE6Mzoga3c9ICdzdGF0aWMnCisgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjc3OTA6Mzoga3c9ICdzdGF0aWMnCiAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAga3c9KFRva2VuKW1hdGNoKGlucHV0LDY5LEZPTExPV18yKTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7CisgICAgICAgICAgICAgICAgICAgIGt3PShUb2tlbiltYXRjaChpbnB1dCw3NixGT0xMT1dfMik7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OwogICAgICAgICAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKIAogICAgICAgICAgICAgICAgICAgICAgIAkJCWN1cnJlbnQubWVyZ2Uoa3cpOwpAQCAtMTk5MzcsOSArMjExMzEsOSBAQAogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgIGNhc2UgNCA6Ci0gICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjczNTc6Mzoga3c9ICdpbXBvcnQnCisgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjc3OTY6Mzoga3c9ICdpbXBvcnQnCiAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAga3c9KFRva2VuKW1hdGNoKGlucHV0LDY4LEZPTExPV18yKTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7CisgICAgICAgICAgICAgICAgICAgIGt3PShUb2tlbiltYXRjaChpbnB1dCw3NSxGT0xMT1dfMik7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OwogICAgICAgICAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKIAogICAgICAgICAgICAgICAgICAgICAgIAkJCWN1cnJlbnQubWVyZ2Uoa3cpOwpAQCAtMTk5NTAsOSArMjExNDQsOSBAQAogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgIGNhc2UgNSA6Ci0gICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjczNjM6Mzoga3c9ICdleHRlbnNpb24nCisgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjc4MDI6Mzoga3c9ICdleHRlbnNpb24nCiAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAga3c9KFRva2VuKW1hdGNoKGlucHV0LDY1LEZPTExPV18yKTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7CisgICAgICAgICAgICAgICAgICAgIGt3PShUb2tlbiltYXRjaChpbnB1dCw3MixGT0xMT1dfMik7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OwogICAgICAgICAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKIAogICAgICAgICAgICAgICAgICAgICAgIAkJCWN1cnJlbnQubWVyZ2Uoa3cpOwpAQCAtMTk5ODcsNyArMjExODEsNyBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgImVudHJ5UnVsZUlkT3JTdXBlciIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo3MzcyOjE6IGVudHJ5UnVsZUlkT3JTdXBlciByZXR1cm5zIFtTdHJpbmcgY3VycmVudD1udWxsXSA6IGl2X3J1bGVJZE9yU3VwZXI9IHJ1bGVJZE9yU3VwZXIgRU9GIDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo3ODExOjE6IGVudHJ5UnVsZUlkT3JTdXBlciByZXR1cm5zIFtTdHJpbmcgY3VycmVudD1udWxsXSA6IGl2X3J1bGVJZE9yU3VwZXI9IHJ1bGVJZE9yU3VwZXIgRU9GIDsKICAgICBwdWJsaWMgZmluYWwgU3RyaW5nIGVudHJ5UnVsZUlkT3JTdXBlcigpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAgICAgICAgIFN0cmluZyBjdXJyZW50ID0gbnVsbDsKIApAQCAtMTk5OTUsOCArMjExODksOCBAQAogCiAKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjczNzI6NDk6IChpdl9ydWxlSWRPclN1cGVyPSBydWxlSWRPclN1cGVyIEVPRiApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo3MzczOjI6IGl2X3J1bGVJZE9yU3VwZXI9IHJ1bGVJZE9yU3VwZXIgRU9GCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo3ODExOjQ5OiAoaXZfcnVsZUlkT3JTdXBlcj0gcnVsZUlkT3JTdXBlciBFT0YgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NzgxMjoyOiBpdl9ydWxlSWRPclN1cGVyPSBydWxlSWRPclN1cGVyIEVPRgogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBuZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0SWRPclN1cGVyUnVsZSgpKTsgCkBAIC0yMDAyNyw3ICsyMTIyMSw3IEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZUlkT3JTdXBlciIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo3Mzc5OjE6IHJ1bGVJZE9yU3VwZXIgcmV0dXJucyBbQW50bHJEYXRhdHlwZVJ1bGVUb2tlbiBjdXJyZW50PW5ldyBBbnRsckRhdGF0eXBlUnVsZVRva2VuKCldIDogKHRoaXNfRmVhdHVyZUNhbGxJRF8wPSBydWxlRmVhdHVyZUNhbGxJRCB8IGt3PSAnc3VwZXInICkgOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjc4MTg6MTogcnVsZUlkT3JTdXBlciByZXR1cm5zIFtBbnRsckRhdGF0eXBlUnVsZVRva2VuIGN1cnJlbnQ9bmV3IEFudGxyRGF0YXR5cGVSdWxlVG9rZW4oKV0gOiAodGhpc19GZWF0dXJlQ2FsbElEXzA9IHJ1bGVGZWF0dXJlQ2FsbElEIHwga3c9ICdzdXBlcicgKSA7CiAgICAgcHVibGljIGZpbmFsIEFudGxyRGF0YXR5cGVSdWxlVG9rZW4gcnVsZUlkT3JTdXBlcigpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAgICAgICAgIEFudGxyRGF0YXR5cGVSdWxlVG9rZW4gY3VycmVudCA9IG5ldyBBbnRsckRhdGF0eXBlUnVsZVRva2VuKCk7CiAKQEAgLTIwMDM5LDI5ICsyMTIzMywyOSBAQAogICAgICAgICAJZW50ZXJSdWxlKCk7CiAKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjczODU6MjogKCAodGhpc19GZWF0dXJlQ2FsbElEXzA9IHJ1bGVGZWF0dXJlQ2FsbElEIHwga3c9ICdzdXBlcicgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo3Mzg2OjI6ICh0aGlzX0ZlYXR1cmVDYWxsSURfMD0gcnVsZUZlYXR1cmVDYWxsSUQgfCBrdz0gJ3N1cGVyJyApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo3ODI0OjI6ICggKHRoaXNfRmVhdHVyZUNhbGxJRF8wPSBydWxlRmVhdHVyZUNhbGxJRCB8IGt3PSAnc3VwZXInICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NzgyNToyOiAodGhpc19GZWF0dXJlQ2FsbElEXzA9IHJ1bGVGZWF0dXJlQ2FsbElEIHwga3c9ICdzdXBlcicgKQogICAgICAgICAgICAgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NzM4NjoyOiAodGhpc19GZWF0dXJlQ2FsbElEXzA9IHJ1bGVGZWF0dXJlQ2FsbElEIHwga3c9ICdzdXBlcicgKQotICAgICAgICAgICAgaW50IGFsdDEyOD0yOwotICAgICAgICAgICAgaW50IExBMTI4XzAgPSBpbnB1dC5MQSgxKTsKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjc4MjU6MjogKHRoaXNfRmVhdHVyZUNhbGxJRF8wPSBydWxlRmVhdHVyZUNhbGxJRCB8IGt3PSAnc3VwZXInICkKKyAgICAgICAgICAgIGludCBhbHQxMzk9MjsKKyAgICAgICAgICAgIGludCBMQTEzOV8wID0gaW5wdXQuTEEoMSk7CiAKLSAgICAgICAgICAgIGlmICggKExBMTI4XzA9PVJVTEVfSUR8fExBMTI4XzA9PTY1fHwoTEExMjhfMD49NjggJiYgTEExMjhfMDw9NjkpfHxMQTEyOF8wPT0xMjMpICkgewotICAgICAgICAgICAgICAgIGFsdDEyOD0xOworICAgICAgICAgICAgaWYgKCAoTEExMzlfMD09UlVMRV9JRHx8TEExMzlfMD09NzJ8fChMQTEzOV8wPj03NSAmJiBMQTEzOV8wPD03Nil8fExBMTM5XzA9PTEzMCkgKSB7CisgICAgICAgICAgICAgICAgYWx0MTM5PTE7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIGlmICggKExBMTI4XzA9PTEyNCkgKSB7Ci0gICAgICAgICAgICAgICAgYWx0MTI4PTI7CisgICAgICAgICAgICBlbHNlIGlmICggKExBMTM5XzA9PTEzMSkgKSB7CisgICAgICAgICAgICAgICAgYWx0MTM5PTI7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICBpZiAoc3RhdGUuYmFja3RyYWNraW5nPjApIHtzdGF0ZS5mYWlsZWQ9dHJ1ZTsgcmV0dXJuIGN1cnJlbnQ7fQogICAgICAgICAgICAgICAgIE5vVmlhYmxlQWx0RXhjZXB0aW9uIG52YWUgPQotICAgICAgICAgICAgICAgICAgICBuZXcgTm9WaWFibGVBbHRFeGNlcHRpb24oIiIsIDEyOCwgMCwgaW5wdXQpOworICAgICAgICAgICAgICAgICAgICBuZXcgTm9WaWFibGVBbHRFeGNlcHRpb24oIiIsIDEzOSwgMCwgaW5wdXQpOwogCiAgICAgICAgICAgICAgICAgdGhyb3cgbnZhZTsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHN3aXRjaCAoYWx0MTI4KSB7CisgICAgICAgICAgICBzd2l0Y2ggKGFsdDEzOSkgewogICAgICAgICAgICAgICAgIGNhc2UgMSA6Ci0gICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjczODc6MzogdGhpc19GZWF0dXJlQ2FsbElEXzA9IHJ1bGVGZWF0dXJlQ2FsbElECisgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjc4MjY6MzogdGhpc19GZWF0dXJlQ2FsbElEXzA9IHJ1bGVGZWF0dXJlQ2FsbElECiAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAKQEAgLTIwMDg3LDkgKzIxMjgxLDkgQEAKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICBjYXNlIDIgOgotICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo3Mzk4OjM6IGt3PSAnc3VwZXInCisgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjc4Mzc6Mzoga3c9ICdzdXBlcicKICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBrdz0oVG9rZW4pbWF0Y2goaW5wdXQsMTI0LEZPTExPV18yKTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7CisgICAgICAgICAgICAgICAgICAgIGt3PShUb2tlbiltYXRjaChpbnB1dCwxMzEsRk9MTE9XXzIpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gY3VycmVudDsKICAgICAgICAgICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAKICAgICAgICAgICAgICAgICAgICAgICAJCQljdXJyZW50Lm1lcmdlKGt3KTsKQEAgLTIwMTI0LDcgKzIxMzE4LDcgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJlbnRyeVJ1bGVYQ29uc3RydWN0b3JDYWxsIgotICAgIC8vIEludGVybmFsRGF0YURTTC5nOjc0MDc6MTogZW50cnlSdWxlWENvbnN0cnVjdG9yQ2FsbCByZXR1cm5zIFtFT2JqZWN0IGN1cnJlbnQ9bnVsbF0gOiBpdl9ydWxlWENvbnN0cnVjdG9yQ2FsbD0gcnVsZVhDb25zdHJ1Y3RvckNhbGwgRU9GIDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo3ODQ2OjE6IGVudHJ5UnVsZVhDb25zdHJ1Y3RvckNhbGwgcmV0dXJucyBbRU9iamVjdCBjdXJyZW50PW51bGxdIDogaXZfcnVsZVhDb25zdHJ1Y3RvckNhbGw9IHJ1bGVYQ29uc3RydWN0b3JDYWxsIEVPRiA7CiAgICAgcHVibGljIGZpbmFsIEVPYmplY3QgZW50cnlSdWxlWENvbnN0cnVjdG9yQ2FsbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAgICAgICAgIEVPYmplY3QgY3VycmVudCA9IG51bGw7CiAKQEAgLTIwMTMyLDggKzIxMzI2LDggQEAKIAogCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo3NDA3OjU3OiAoaXZfcnVsZVhDb25zdHJ1Y3RvckNhbGw9IHJ1bGVYQ29uc3RydWN0b3JDYWxsIEVPRiApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo3NDA4OjI6IGl2X3J1bGVYQ29uc3RydWN0b3JDYWxsPSBydWxlWENvbnN0cnVjdG9yQ2FsbCBFT0YKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjc4NDY6NTc6IChpdl9ydWxlWENvbnN0cnVjdG9yQ2FsbD0gcnVsZVhDb25zdHJ1Y3RvckNhbGwgRU9GICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjc4NDc6MjogaXZfcnVsZVhDb25zdHJ1Y3RvckNhbGw9IHJ1bGVYQ29uc3RydWN0b3JDYWxsIEVPRgogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBuZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0WENvbnN0cnVjdG9yQ2FsbFJ1bGUoKSk7IApAQCAtMjAxNjQsNyArMjEzNTgsNyBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVYQ29uc3RydWN0b3JDYWxsIgotICAgIC8vIEludGVybmFsRGF0YURTTC5nOjc0MTQ6MTogcnVsZVhDb25zdHJ1Y3RvckNhbGwgcmV0dXJucyBbRU9iamVjdCBjdXJyZW50PW51bGxdIDogKCAoKSBvdGhlcmx2XzE9ICduZXcnICggKCBydWxlUXVhbGlmaWVkTmFtZSApICkgKCAoICggJzwnICk9Pm90aGVybHZfMz0gJzwnICkgKCAobHZfdHlwZUFyZ3VtZW50c180XzA9IHJ1bGVKdm1Bcmd1bWVudFR5cGVSZWZlcmVuY2UgKSApIChvdGhlcmx2XzU9ICcsJyAoIChsdl90eXBlQXJndW1lbnRzXzZfMD0gcnVsZUp2bUFyZ3VtZW50VHlwZVJlZmVyZW5jZSApICkgKSogb3RoZXJsdl83PSAnPicgKT8gKCAoICggKCAnKCcgKSApPT4gKGx2X2V4cGxpY2l0Q29uc3RydWN0b3JDYWxsXzhfMD0gJygnICkgKSAoICggKCAoICgpICggKCAoIHJ1bGVKdm1Gb3JtYWxQYXJhbWV0ZXIgKSApICggJywnICggKCBydWxlSnZtRm9ybWFsUGFyYW1ldGVyICkgKSApKiApPyAoICggJ3wnICkgKSApICk9PiAobHZfYXJndW1lbnRzXzlfMD0gcnVsZVhTaG9ydENsb3N1cmUgKSApIHwgKCAoIChsdl9hcmd1bWVudHNfMTBfMD0gcnVsZVhFeHByZXNzaW9uICkgKSAob3RoZXJsdl8xMT0gJywnICggKGx2X2FyZ3VtZW50c18xMl8wPSBydWxlWEV4cHJlc3Npb24gKSApICkqICkgKT8gb3RoZXJsdl8xMz0gJyknICk/ICggKCAoICgpICdbJyApICk9PiAobHZfYXJndW1lbnRzXzE0XzA9IHJ1bGVYQ2xvc3VyZSApICk/ICkgOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjc4NTM6MTogcnVsZVhDb25zdHJ1Y3RvckNhbGwgcmV0dXJucyBbRU9iamVjdCBjdXJyZW50PW51bGxdIDogKCAoKSBvdGhlcmx2XzE9ICduZXcnICggKCBydWxlUXVhbGlmaWVkTmFtZSApICkgKCAoICggJzwnICk9Pm90aGVybHZfMz0gJzwnICkgKCAobHZfdHlwZUFyZ3VtZW50c180XzA9IHJ1bGVKdm1Bcmd1bWVudFR5cGVSZWZlcmVuY2UgKSApIChvdGhlcmx2XzU9ICcsJyAoIChsdl90eXBlQXJndW1lbnRzXzZfMD0gcnVsZUp2bUFyZ3VtZW50VHlwZVJlZmVyZW5jZSApICkgKSogb3RoZXJsdl83PSAnPicgKT8gKCAoICggKCAnKCcgKSApPT4gKGx2X2V4cGxpY2l0Q29uc3RydWN0b3JDYWxsXzhfMD0gJygnICkgKSAoICggKCAoICgpICggKCAoIHJ1bGVKdm1Gb3JtYWxQYXJhbWV0ZXIgKSApICggJywnICggKCBydWxlSnZtRm9ybWFsUGFyYW1ldGVyICkgKSApKiApPyAoICggJ3wnICkgKSApICk9PiAobHZfYXJndW1lbnRzXzlfMD0gcnVsZVhTaG9ydENsb3N1cmUgKSApIHwgKCAoIChsdl9hcmd1bWVudHNfMTBfMD0gcnVsZVhFeHByZXNzaW9uICkgKSAob3RoZXJsdl8xMT0gJywnICggKGx2X2FyZ3VtZW50c18xMl8wPSBydWxlWEV4cHJlc3Npb24gKSApICkqICkgKT8gb3RoZXJsdl8xMz0gJyknICk/ICggKCAoICgpICdbJyApICk9PiAobHZfYXJndW1lbnRzXzE0XzA9IHJ1bGVYQ2xvc3VyZSApICk/ICkgOwogICAgIHB1YmxpYyBmaW5hbCBFT2JqZWN0IHJ1bGVYQ29uc3RydWN0b3JDYWxsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKICAgICAgICAgRU9iamVjdCBjdXJyZW50ID0gbnVsbDsKIApAQCAtMjAxOTIsMTQgKzIxMzg2LDE0IEBACiAgICAgICAgIAllbnRlclJ1bGUoKTsKIAogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NzQyMDoyOiAoICggKCkgb3RoZXJsdl8xPSAnbmV3JyAoICggcnVsZVF1YWxpZmllZE5hbWUgKSApICggKCAoICc8JyApPT5vdGhlcmx2XzM9ICc8JyApICggKGx2X3R5cGVBcmd1bWVudHNfNF8wPSBydWxlSnZtQXJndW1lbnRUeXBlUmVmZXJlbmNlICkgKSAob3RoZXJsdl81PSAnLCcgKCAobHZfdHlwZUFyZ3VtZW50c182XzA9IHJ1bGVKdm1Bcmd1bWVudFR5cGVSZWZlcmVuY2UgKSApICkqIG90aGVybHZfNz0gJz4nICk/ICggKCAoICggJygnICkgKT0+IChsdl9leHBsaWNpdENvbnN0cnVjdG9yQ2FsbF84XzA9ICcoJyApICkgKCAoICggKCAoKSAoICggKCBydWxlSnZtRm9ybWFsUGFyYW1ldGVyICkgKSAoICcsJyAoICggcnVsZUp2bUZvcm1hbFBhcmFtZXRlciApICkgKSogKT8gKCAoICd8JyApICkgKSApPT4gKGx2X2FyZ3VtZW50c185XzA9IHJ1bGVYU2hvcnRDbG9zdXJlICkgKSB8ICggKCAobHZfYXJndW1lbnRzXzEwXzA9IHJ1bGVYRXhwcmVzc2lvbiApICkgKG90aGVybHZfMTE9ICcsJyAoIChsdl9hcmd1bWVudHNfMTJfMD0gcnVsZVhFeHByZXNzaW9uICkgKSApKiApICk/IG90aGVybHZfMTM9ICcpJyApPyAoICggKCAoKSAnWycgKSApPT4gKGx2X2FyZ3VtZW50c18xNF8wPSBydWxlWENsb3N1cmUgKSApPyApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjc0MjE6MjogKCAoKSBvdGhlcmx2XzE9ICduZXcnICggKCBydWxlUXVhbGlmaWVkTmFtZSApICkgKCAoICggJzwnICk9Pm90aGVybHZfMz0gJzwnICkgKCAobHZfdHlwZUFyZ3VtZW50c180XzA9IHJ1bGVKdm1Bcmd1bWVudFR5cGVSZWZlcmVuY2UgKSApIChvdGhlcmx2XzU9ICcsJyAoIChsdl90eXBlQXJndW1lbnRzXzZfMD0gcnVsZUp2bUFyZ3VtZW50VHlwZVJlZmVyZW5jZSApICkgKSogb3RoZXJsdl83PSAnPicgKT8gKCAoICggKCAnKCcgKSApPT4gKGx2X2V4cGxpY2l0Q29uc3RydWN0b3JDYWxsXzhfMD0gJygnICkgKSAoICggKCAoICgpICggKCAoIHJ1bGVKdm1Gb3JtYWxQYXJhbWV0ZXIgKSApICggJywnICggKCBydWxlSnZtRm9ybWFsUGFyYW1ldGVyICkgKSApKiApPyAoICggJ3wnICkgKSApICk9PiAobHZfYXJndW1lbnRzXzlfMD0gcnVsZVhTaG9ydENsb3N1cmUgKSApIHwgKCAoIChsdl9hcmd1bWVudHNfMTBfMD0gcnVsZVhFeHByZXNzaW9uICkgKSAob3RoZXJsdl8xMT0gJywnICggKGx2X2FyZ3VtZW50c18xMl8wPSBydWxlWEV4cHJlc3Npb24gKSApICkqICkgKT8gb3RoZXJsdl8xMz0gJyknICk/ICggKCAoICgpICdbJyApICk9PiAobHZfYXJndW1lbnRzXzE0XzA9IHJ1bGVYQ2xvc3VyZSApICk/ICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjc4NTk6MjogKCAoICgpIG90aGVybHZfMT0gJ25ldycgKCAoIHJ1bGVRdWFsaWZpZWROYW1lICkgKSAoICggKCAnPCcgKT0+b3RoZXJsdl8zPSAnPCcgKSAoIChsdl90eXBlQXJndW1lbnRzXzRfMD0gcnVsZUp2bUFyZ3VtZW50VHlwZVJlZmVyZW5jZSApICkgKG90aGVybHZfNT0gJywnICggKGx2X3R5cGVBcmd1bWVudHNfNl8wPSBydWxlSnZtQXJndW1lbnRUeXBlUmVmZXJlbmNlICkgKSApKiBvdGhlcmx2Xzc9ICc+JyApPyAoICggKCAoICcoJyApICk9PiAobHZfZXhwbGljaXRDb25zdHJ1Y3RvckNhbGxfOF8wPSAnKCcgKSApICggKCAoICggKCkgKCAoICggcnVsZUp2bUZvcm1hbFBhcmFtZXRlciApICkgKCAnLCcgKCAoIHJ1bGVKdm1Gb3JtYWxQYXJhbWV0ZXIgKSApICkqICk/ICggKCAnfCcgKSApICkgKT0+IChsdl9hcmd1bWVudHNfOV8wPSBydWxlWFNob3J0Q2xvc3VyZSApICkgfCAoICggKGx2X2FyZ3VtZW50c18xMF8wPSBydWxlWEV4cHJlc3Npb24gKSApIChvdGhlcmx2XzExPSAnLCcgKCAobHZfYXJndW1lbnRzXzEyXzA9IHJ1bGVYRXhwcmVzc2lvbiApICkgKSogKSApPyBvdGhlcmx2XzEzPSAnKScgKT8gKCAoICggKCkgJ1snICkgKT0+IChsdl9hcmd1bWVudHNfMTRfMD0gcnVsZVhDbG9zdXJlICkgKT8gKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo3ODYwOjI6ICggKCkgb3RoZXJsdl8xPSAnbmV3JyAoICggcnVsZVF1YWxpZmllZE5hbWUgKSApICggKCAoICc8JyApPT5vdGhlcmx2XzM9ICc8JyApICggKGx2X3R5cGVBcmd1bWVudHNfNF8wPSBydWxlSnZtQXJndW1lbnRUeXBlUmVmZXJlbmNlICkgKSAob3RoZXJsdl81PSAnLCcgKCAobHZfdHlwZUFyZ3VtZW50c182XzA9IHJ1bGVKdm1Bcmd1bWVudFR5cGVSZWZlcmVuY2UgKSApICkqIG90aGVybHZfNz0gJz4nICk/ICggKCAoICggJygnICkgKT0+IChsdl9leHBsaWNpdENvbnN0cnVjdG9yQ2FsbF84XzA9ICcoJyApICkgKCAoICggKCAoKSAoICggKCBydWxlSnZtRm9ybWFsUGFyYW1ldGVyICkgKSAoICcsJyAoICggcnVsZUp2bUZvcm1hbFBhcmFtZXRlciApICkgKSogKT8gKCAoICd8JyApICkgKSApPT4gKGx2X2FyZ3VtZW50c185XzA9IHJ1bGVYU2hvcnRDbG9zdXJlICkgKSB8ICggKCAobHZfYXJndW1lbnRzXzEwXzA9IHJ1bGVYRXhwcmVzc2lvbiApICkgKG90aGVybHZfMTE9ICcsJyAoIChsdl9hcmd1bWVudHNfMTJfMD0gcnVsZVhFeHByZXNzaW9uICkgKSApKiApICk/IG90aGVybHZfMTM9ICcpJyApPyAoICggKCAoKSAnWycgKSApPT4gKGx2X2FyZ3VtZW50c18xNF8wPSBydWxlWENsb3N1cmUgKSApPyApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo3NDIxOjI6ICggKCkgb3RoZXJsdl8xPSAnbmV3JyAoICggcnVsZVF1YWxpZmllZE5hbWUgKSApICggKCAoICc8JyApPT5vdGhlcmx2XzM9ICc8JyApICggKGx2X3R5cGVBcmd1bWVudHNfNF8wPSBydWxlSnZtQXJndW1lbnRUeXBlUmVmZXJlbmNlICkgKSAob3RoZXJsdl81PSAnLCcgKCAobHZfdHlwZUFyZ3VtZW50c182XzA9IHJ1bGVKdm1Bcmd1bWVudFR5cGVSZWZlcmVuY2UgKSApICkqIG90aGVybHZfNz0gJz4nICk/ICggKCAoICggJygnICkgKT0+IChsdl9leHBsaWNpdENvbnN0cnVjdG9yQ2FsbF84XzA9ICcoJyApICkgKCAoICggKCAoKSAoICggKCBydWxlSnZtRm9ybWFsUGFyYW1ldGVyICkgKSAoICcsJyAoICggcnVsZUp2bUZvcm1hbFBhcmFtZXRlciApICkgKSogKT8gKCAoICd8JyApICkgKSApPT4gKGx2X2FyZ3VtZW50c185XzA9IHJ1bGVYU2hvcnRDbG9zdXJlICkgKSB8ICggKCAobHZfYXJndW1lbnRzXzEwXzA9IHJ1bGVYRXhwcmVzc2lvbiApICkgKG90aGVybHZfMTE9ICcsJyAoIChsdl9hcmd1bWVudHNfMTJfMD0gcnVsZVhFeHByZXNzaW9uICkgKSApKiApICk/IG90aGVybHZfMTM9ICcpJyApPyAoICggKCAoKSAnWycgKSApPT4gKGx2X2FyZ3VtZW50c18xNF8wPSBydWxlWENsb3N1cmUgKSApPyApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo3NDIyOjM6ICgpIG90aGVybHZfMT0gJ25ldycgKCAoIHJ1bGVRdWFsaWZpZWROYW1lICkgKSAoICggKCAnPCcgKT0+b3RoZXJsdl8zPSAnPCcgKSAoIChsdl90eXBlQXJndW1lbnRzXzRfMD0gcnVsZUp2bUFyZ3VtZW50VHlwZVJlZmVyZW5jZSApICkgKG90aGVybHZfNT0gJywnICggKGx2X3R5cGVBcmd1bWVudHNfNl8wPSBydWxlSnZtQXJndW1lbnRUeXBlUmVmZXJlbmNlICkgKSApKiBvdGhlcmx2Xzc9ICc+JyApPyAoICggKCAoICcoJyApICk9PiAobHZfZXhwbGljaXRDb25zdHJ1Y3RvckNhbGxfOF8wPSAnKCcgKSApICggKCAoICggKCkgKCAoICggcnVsZUp2bUZvcm1hbFBhcmFtZXRlciApICkgKCAnLCcgKCAoIHJ1bGVKdm1Gb3JtYWxQYXJhbWV0ZXIgKSApICkqICk/ICggKCAnfCcgKSApICkgKT0+IChsdl9hcmd1bWVudHNfOV8wPSBydWxlWFNob3J0Q2xvc3VyZSApICkgfCAoICggKGx2X2FyZ3VtZW50c18xMF8wPSBydWxlWEV4cHJlc3Npb24gKSApIChvdGhlcmx2XzExPSAnLCcgKCAobHZfYXJndW1lbnRzXzEyXzA9IHJ1bGVYRXhwcmVzc2lvbiApICkgKSogKSApPyBvdGhlcmx2XzEzPSAnKScgKT8gKCAoICggKCkgJ1snICkgKT0+IChsdl9hcmd1bWVudHNfMTRfMD0gcnVsZVhDbG9zdXJlICkgKT8KKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjc4NjA6MjogKCAoKSBvdGhlcmx2XzE9ICduZXcnICggKCBydWxlUXVhbGlmaWVkTmFtZSApICkgKCAoICggJzwnICk9Pm90aGVybHZfMz0gJzwnICkgKCAobHZfdHlwZUFyZ3VtZW50c180XzA9IHJ1bGVKdm1Bcmd1bWVudFR5cGVSZWZlcmVuY2UgKSApIChvdGhlcmx2XzU9ICcsJyAoIChsdl90eXBlQXJndW1lbnRzXzZfMD0gcnVsZUp2bUFyZ3VtZW50VHlwZVJlZmVyZW5jZSApICkgKSogb3RoZXJsdl83PSAnPicgKT8gKCAoICggKCAnKCcgKSApPT4gKGx2X2V4cGxpY2l0Q29uc3RydWN0b3JDYWxsXzhfMD0gJygnICkgKSAoICggKCAoICgpICggKCAoIHJ1bGVKdm1Gb3JtYWxQYXJhbWV0ZXIgKSApICggJywnICggKCBydWxlSnZtRm9ybWFsUGFyYW1ldGVyICkgKSApKiApPyAoICggJ3wnICkgKSApICk9PiAobHZfYXJndW1lbnRzXzlfMD0gcnVsZVhTaG9ydENsb3N1cmUgKSApIHwgKCAoIChsdl9hcmd1bWVudHNfMTBfMD0gcnVsZVhFeHByZXNzaW9uICkgKSAob3RoZXJsdl8xMT0gJywnICggKGx2X2FyZ3VtZW50c18xMl8wPSBydWxlWEV4cHJlc3Npb24gKSApICkqICkgKT8gb3RoZXJsdl8xMz0gJyknICk/ICggKCAoICgpICdbJyApICk9PiAobHZfYXJndW1lbnRzXzE0XzA9IHJ1bGVYQ2xvc3VyZSApICk/ICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjc4NjE6MzogKCkgb3RoZXJsdl8xPSAnbmV3JyAoICggcnVsZVF1YWxpZmllZE5hbWUgKSApICggKCAoICc8JyApPT5vdGhlcmx2XzM9ICc8JyApICggKGx2X3R5cGVBcmd1bWVudHNfNF8wPSBydWxlSnZtQXJndW1lbnRUeXBlUmVmZXJlbmNlICkgKSAob3RoZXJsdl81PSAnLCcgKCAobHZfdHlwZUFyZ3VtZW50c182XzA9IHJ1bGVKdm1Bcmd1bWVudFR5cGVSZWZlcmVuY2UgKSApICkqIG90aGVybHZfNz0gJz4nICk/ICggKCAoICggJygnICkgKT0+IChsdl9leHBsaWNpdENvbnN0cnVjdG9yQ2FsbF84XzA9ICcoJyApICkgKCAoICggKCAoKSAoICggKCBydWxlSnZtRm9ybWFsUGFyYW1ldGVyICkgKSAoICcsJyAoICggcnVsZUp2bUZvcm1hbFBhcmFtZXRlciApICkgKSogKT8gKCAoICd8JyApICkgKSApPT4gKGx2X2FyZ3VtZW50c185XzA9IHJ1bGVYU2hvcnRDbG9zdXJlICkgKSB8ICggKCAobHZfYXJndW1lbnRzXzEwXzA9IHJ1bGVYRXhwcmVzc2lvbiApICkgKG90aGVybHZfMTE9ICcsJyAoIChsdl9hcmd1bWVudHNfMTJfMD0gcnVsZVhFeHByZXNzaW9uICkgKSApKiApICk/IG90aGVybHZfMTM9ICcpJyApPyAoICggKCAoKSAnWycgKSApPT4gKGx2X2FyZ3VtZW50c18xNF8wPSBydWxlWENsb3N1cmUgKSApPwogICAgICAgICAgICAgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NzQyMjozOiAoKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NzQyMzo0OiAKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjc4NjE6MzogKCkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjc4NjI6NDogCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKIApAQCAtMjAyMTEsMTcgKzIxNDA1LDE3IEBACiAKICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgb3RoZXJsdl8xPShUb2tlbiltYXRjaChpbnB1dCwxMjUsRk9MTE9XXzQpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gY3VycmVudDsKKyAgICAgICAgICAgIG90aGVybHZfMT0oVG9rZW4pbWF0Y2goaW5wdXQsMTMyLEZPTExPV180KTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKIAogICAgICAgICAgICAgICAJCQluZXdMZWFmTm9kZShvdGhlcmx2XzEsIGdyYW1tYXJBY2Nlc3MuZ2V0WENvbnN0cnVjdG9yQ2FsbEFjY2VzcygpLmdldE5ld0tleXdvcmRfMSgpKTsKICAgICAgICAgICAgICAgCQkKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjc0MzM6MzogKCAoIHJ1bGVRdWFsaWZpZWROYW1lICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NzQzNDo0OiAoIHJ1bGVRdWFsaWZpZWROYW1lICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjc4NzI6MzogKCAoIHJ1bGVRdWFsaWZpZWROYW1lICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6Nzg3Mzo0OiAoIHJ1bGVRdWFsaWZpZWROYW1lICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjc0MzQ6NDogKCBydWxlUXVhbGlmaWVkTmFtZSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo3NDM1OjU6IHJ1bGVRdWFsaWZpZWROYW1lCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo3ODczOjQ6ICggcnVsZVF1YWxpZmllZE5hbWUgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6Nzg3NDo1OiBydWxlUXVhbGlmaWVkTmFtZQogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAKQEAgLTIwMjM1LDcgKzIxNDI5LDcgQEAKICAgICAgICAgICAgICAgCQkJCQluZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0WENvbnN0cnVjdG9yQ2FsbEFjY2VzcygpLmdldENvbnN0cnVjdG9ySnZtQ29uc3RydWN0b3JDcm9zc1JlZmVyZW5jZV8yXzAoKSk7CiAgICAgICAgICAgICAgIAkJCQkKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzEyMSk7CisgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV18xMzQpOwogICAgICAgICAgICAgcnVsZVF1YWxpZmllZE5hbWUoKTsKIAogICAgICAgICAgICAgc3RhdGUuX2ZzcC0tOwpAQCAtMjAyNTEsMTcgKzIxNDQ1LDE3IEBACiAKICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NzQ0OTozOiAoICggKCAnPCcgKT0+b3RoZXJsdl8zPSAnPCcgKSAoIChsdl90eXBlQXJndW1lbnRzXzRfMD0gcnVsZUp2bUFyZ3VtZW50VHlwZVJlZmVyZW5jZSApICkgKG90aGVybHZfNT0gJywnICggKGx2X3R5cGVBcmd1bWVudHNfNl8wPSBydWxlSnZtQXJndW1lbnRUeXBlUmVmZXJlbmNlICkgKSApKiBvdGhlcmx2Xzc9ICc+JyApPwotICAgICAgICAgICAgaW50IGFsdDEzMD0yOwotICAgICAgICAgICAgYWx0MTMwID0gZGZhMTMwLnByZWRpY3QoaW5wdXQpOwotICAgICAgICAgICAgc3dpdGNoIChhbHQxMzApIHsKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjc4ODg6MzogKCAoICggJzwnICk9Pm90aGVybHZfMz0gJzwnICkgKCAobHZfdHlwZUFyZ3VtZW50c180XzA9IHJ1bGVKdm1Bcmd1bWVudFR5cGVSZWZlcmVuY2UgKSApIChvdGhlcmx2XzU9ICcsJyAoIChsdl90eXBlQXJndW1lbnRzXzZfMD0gcnVsZUp2bUFyZ3VtZW50VHlwZVJlZmVyZW5jZSApICkgKSogb3RoZXJsdl83PSAnPicgKT8KKyAgICAgICAgICAgIGludCBhbHQxNDE9MjsKKyAgICAgICAgICAgIGFsdDE0MSA9IGRmYTE0MS5wcmVkaWN0KGlucHV0KTsKKyAgICAgICAgICAgIHN3aXRjaCAoYWx0MTQxKSB7CiAgICAgICAgICAgICAgICAgY2FzZSAxIDoKLSAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NzQ1MDo0OiAoICggJzwnICk9Pm90aGVybHZfMz0gJzwnICkgKCAobHZfdHlwZUFyZ3VtZW50c180XzA9IHJ1bGVKdm1Bcmd1bWVudFR5cGVSZWZlcmVuY2UgKSApIChvdGhlcmx2XzU9ICcsJyAoIChsdl90eXBlQXJndW1lbnRzXzZfMD0gcnVsZUp2bUFyZ3VtZW50VHlwZVJlZmVyZW5jZSApICkgKSogb3RoZXJsdl83PSAnPicKKyAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6Nzg4OTo0OiAoICggJzwnICk9Pm90aGVybHZfMz0gJzwnICkgKCAobHZfdHlwZUFyZ3VtZW50c180XzA9IHJ1bGVKdm1Bcmd1bWVudFR5cGVSZWZlcmVuY2UgKSApIChvdGhlcmx2XzU9ICcsJyAoIChsdl90eXBlQXJndW1lbnRzXzZfMD0gcnVsZUp2bUFyZ3VtZW50VHlwZVJlZmVyZW5jZSApICkgKSogb3RoZXJsdl83PSAnPicKICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo3NDUwOjQ6ICggKCAnPCcgKT0+b3RoZXJsdl8zPSAnPCcgKQotICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo3NDUxOjU6ICggJzwnICk9Pm90aGVybHZfMz0gJzwnCisgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjc4ODk6NDogKCAoICc8JyApPT5vdGhlcmx2XzM9ICc8JyApCisgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjc4OTA6NTogKCAnPCcgKT0+b3RoZXJsdl8zPSAnPCcKICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBvdGhlcmx2XzM9KFRva2VuKW1hdGNoKGlucHV0LDg2LEZPTExPV184OSk7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OworICAgICAgICAgICAgICAgICAgICBvdGhlcmx2XzM9KFRva2VuKW1hdGNoKGlucHV0LDkzLEZPTExPV18xMDMpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gY3VycmVudDsKICAgICAgICAgICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAKICAgICAgICAgICAgICAgICAgICAgICAJCQkJCW5ld0xlYWZOb2RlKG90aGVybHZfMywgZ3JhbW1hckFjY2Vzcy5nZXRYQ29uc3RydWN0b3JDYWxsQWNjZXNzKCkuZ2V0TGVzc1RoYW5TaWduS2V5d29yZF8zXzAoKSk7CkBAIC0yMDI3MCwxOCArMjE0NjQsMTggQEAKIAogICAgICAgICAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NzQ1Nzo0OiAoIChsdl90eXBlQXJndW1lbnRzXzRfMD0gcnVsZUp2bUFyZ3VtZW50VHlwZVJlZmVyZW5jZSApICkKLSAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NzQ1ODo1OiAobHZfdHlwZUFyZ3VtZW50c180XzA9IHJ1bGVKdm1Bcmd1bWVudFR5cGVSZWZlcmVuY2UgKQorICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo3ODk2OjQ6ICggKGx2X3R5cGVBcmd1bWVudHNfNF8wPSBydWxlSnZtQXJndW1lbnRUeXBlUmVmZXJlbmNlICkgKQorICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo3ODk3OjU6IChsdl90eXBlQXJndW1lbnRzXzRfMD0gcnVsZUp2bUFyZ3VtZW50VHlwZVJlZmVyZW5jZSApCiAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NzQ1ODo1OiAobHZfdHlwZUFyZ3VtZW50c180XzA9IHJ1bGVKdm1Bcmd1bWVudFR5cGVSZWZlcmVuY2UgKQotICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo3NDU5OjY6IGx2X3R5cGVBcmd1bWVudHNfNF8wPSBydWxlSnZtQXJndW1lbnRUeXBlUmVmZXJlbmNlCisgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjc4OTc6NTogKGx2X3R5cGVBcmd1bWVudHNfNF8wPSBydWxlSnZtQXJndW1lbnRUeXBlUmVmZXJlbmNlICkKKyAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6Nzg5ODo2OiBsdl90eXBlQXJndW1lbnRzXzRfMD0gcnVsZUp2bUFyZ3VtZW50VHlwZVJlZmVyZW5jZQogICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogCiAgICAgICAgICAgICAgICAgICAgICAgCQkJCQkJbmV3Q29tcG9zaXRlTm9kZShncmFtbWFyQWNjZXNzLmdldFhDb25zdHJ1Y3RvckNhbGxBY2Nlc3MoKS5nZXRUeXBlQXJndW1lbnRzSnZtQXJndW1lbnRUeXBlUmVmZXJlbmNlUGFyc2VyUnVsZUNhbGxfM18xXzAoKSk7CiAgICAgICAgICAgICAgICAgICAgICAgCQkJCQkKICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV185MCk7CisgICAgICAgICAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzEwNCk7CiAgICAgICAgICAgICAgICAgICAgIGx2X3R5cGVBcmd1bWVudHNfNF8wPXJ1bGVKdm1Bcmd1bWVudFR5cGVSZWZlcmVuY2UoKTsKIAogICAgICAgICAgICAgICAgICAgICBzdGF0ZS5fZnNwLS07CkBAIC0yMDMwNSwzOSArMjE0OTksMzkgQEAKIAogICAgICAgICAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NzQ3Njo0OiAob3RoZXJsdl81PSAnLCcgKCAobHZfdHlwZUFyZ3VtZW50c182XzA9IHJ1bGVKdm1Bcmd1bWVudFR5cGVSZWZlcmVuY2UgKSApICkqCi0gICAgICAgICAgICAgICAgICAgIGxvb3AxMjk6CisgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjc5MTU6NDogKG90aGVybHZfNT0gJywnICggKGx2X3R5cGVBcmd1bWVudHNfNl8wPSBydWxlSnZtQXJndW1lbnRUeXBlUmVmZXJlbmNlICkgKSApKgorICAgICAgICAgICAgICAgICAgICBsb29wMTQwOgogICAgICAgICAgICAgICAgICAgICBkbyB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpbnQgYWx0MTI5PTI7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpbnQgTEExMjlfMCA9IGlucHV0LkxBKDEpOworICAgICAgICAgICAgICAgICAgICAgICAgaW50IGFsdDE0MD0yOworICAgICAgICAgICAgICAgICAgICAgICAgaW50IExBMTQwXzAgPSBpbnB1dC5MQSgxKTsKIAotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCAoTEExMjlfMD09NzUpICkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsdDEyOT0xOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCAoTEExNDBfMD09ODIpICkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsdDE0MD0xOwogICAgICAgICAgICAgICAgICAgICAgICAgfQogCiAKLSAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoYWx0MTI5KSB7CisgICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKGFsdDE0MCkgewogICAgICAgICAgICAgICAgICAgICAJY2FzZSAxIDoKLSAgICAgICAgICAgICAgICAgICAgCSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo3NDc3OjU6IG90aGVybHZfNT0gJywnICggKGx2X3R5cGVBcmd1bWVudHNfNl8wPSBydWxlSnZtQXJndW1lbnRUeXBlUmVmZXJlbmNlICkgKQorICAgICAgICAgICAgICAgICAgICAJICAgIC8vIEludGVybmFsRGF0YURTTC5nOjc5MTY6NTogb3RoZXJsdl81PSAnLCcgKCAobHZfdHlwZUFyZ3VtZW50c182XzA9IHJ1bGVKdm1Bcmd1bWVudFR5cGVSZWZlcmVuY2UgKSApCiAgICAgICAgICAgICAgICAgICAgIAkgICAgewotICAgICAgICAgICAgICAgICAgICAJICAgIG90aGVybHZfNT0oVG9rZW4pbWF0Y2goaW5wdXQsNzUsRk9MTE9XXzg5KTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7CisgICAgICAgICAgICAgICAgICAgIAkgICAgb3RoZXJsdl81PShUb2tlbiltYXRjaChpbnB1dCw4MixGT0xMT1dfMTAzKTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7CiAgICAgICAgICAgICAgICAgICAgIAkgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAKICAgICAgICAgICAgICAgICAgICAgCSAgICAgIAkJCQkJbmV3TGVhZk5vZGUob3RoZXJsdl81LCBncmFtbWFyQWNjZXNzLmdldFhDb25zdHJ1Y3RvckNhbGxBY2Nlc3MoKS5nZXRDb21tYUtleXdvcmRfM18yXzAoKSk7CiAgICAgICAgICAgICAgICAgICAgIAkgICAgICAJCQkJCiAgICAgICAgICAgICAgICAgICAgIAkgICAgfQotICAgICAgICAgICAgICAgICAgICAJICAgIC8vIEludGVybmFsRGF0YURTTC5nOjc0ODE6NTogKCAobHZfdHlwZUFyZ3VtZW50c182XzA9IHJ1bGVKdm1Bcmd1bWVudFR5cGVSZWZlcmVuY2UgKSApCi0gICAgICAgICAgICAgICAgICAgIAkgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NzQ4Mjo2OiAobHZfdHlwZUFyZ3VtZW50c182XzA9IHJ1bGVKdm1Bcmd1bWVudFR5cGVSZWZlcmVuY2UgKQorICAgICAgICAgICAgICAgICAgICAJICAgIC8vIEludGVybmFsRGF0YURTTC5nOjc5MjA6NTogKCAobHZfdHlwZUFyZ3VtZW50c182XzA9IHJ1bGVKdm1Bcmd1bWVudFR5cGVSZWZlcmVuY2UgKSApCisgICAgICAgICAgICAgICAgICAgIAkgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NzkyMTo2OiAobHZfdHlwZUFyZ3VtZW50c182XzA9IHJ1bGVKdm1Bcmd1bWVudFR5cGVSZWZlcmVuY2UgKQogICAgICAgICAgICAgICAgICAgICAJICAgIHsKLSAgICAgICAgICAgICAgICAgICAgCSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo3NDgyOjY6IChsdl90eXBlQXJndW1lbnRzXzZfMD0gcnVsZUp2bUFyZ3VtZW50VHlwZVJlZmVyZW5jZSApCi0gICAgICAgICAgICAgICAgICAgIAkgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NzQ4Mzo3OiBsdl90eXBlQXJndW1lbnRzXzZfMD0gcnVsZUp2bUFyZ3VtZW50VHlwZVJlZmVyZW5jZQorICAgICAgICAgICAgICAgICAgICAJICAgIC8vIEludGVybmFsRGF0YURTTC5nOjc5MjE6NjogKGx2X3R5cGVBcmd1bWVudHNfNl8wPSBydWxlSnZtQXJndW1lbnRUeXBlUmVmZXJlbmNlICkKKyAgICAgICAgICAgICAgICAgICAgCSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo3OTIyOjc6IGx2X3R5cGVBcmd1bWVudHNfNl8wPSBydWxlSnZtQXJndW1lbnRUeXBlUmVmZXJlbmNlCiAgICAgICAgICAgICAgICAgICAgIAkgICAgewogICAgICAgICAgICAgICAgICAgICAJICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogCiAgICAgICAgICAgICAgICAgICAgIAkgICAgICAJCQkJCQkJbmV3Q29tcG9zaXRlTm9kZShncmFtbWFyQWNjZXNzLmdldFhDb25zdHJ1Y3RvckNhbGxBY2Nlc3MoKS5nZXRUeXBlQXJndW1lbnRzSnZtQXJndW1lbnRUeXBlUmVmZXJlbmNlUGFyc2VyUnVsZUNhbGxfM18yXzFfMCgpKTsKICAgICAgICAgICAgICAgICAgICAgCSAgICAgIAkJCQkJCQogICAgICAgICAgICAgICAgICAgICAJICAgIH0KLSAgICAgICAgICAgICAgICAgICAgCSAgICBwdXNoRm9sbG93KEZPTExPV185MCk7CisgICAgICAgICAgICAgICAgICAgIAkgICAgcHVzaEZvbGxvdyhGT0xMT1dfMTA0KTsKICAgICAgICAgICAgICAgICAgICAgCSAgICBsdl90eXBlQXJndW1lbnRzXzZfMD1ydWxlSnZtQXJndW1lbnRUeXBlUmVmZXJlbmNlKCk7CiAKICAgICAgICAgICAgICAgICAgICAgCSAgICBzdGF0ZS5fZnNwLS07CkBAIC0yMDM2NiwxMSArMjE1NjAsMTEgQEAKICAgICAgICAgICAgICAgICAgICAgCSAgICBicmVhazsKIAogICAgICAgICAgICAgICAgICAgICAJZGVmYXVsdCA6Ci0gICAgICAgICAgICAgICAgICAgIAkgICAgYnJlYWsgbG9vcDEyOTsKKyAgICAgICAgICAgICAgICAgICAgCSAgICBicmVhayBsb29wMTQwOwogICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICB9IHdoaWxlICh0cnVlKTsKIAotICAgICAgICAgICAgICAgICAgICBvdGhlcmx2Xzc9KFRva2VuKW1hdGNoKGlucHV0LDg3LEZPTExPV18xMTkpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gY3VycmVudDsKKyAgICAgICAgICAgICAgICAgICAgb3RoZXJsdl83PShUb2tlbiltYXRjaChpbnB1dCw5NCxGT0xMT1dfMTMyKTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7CiAgICAgICAgICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogCiAgICAgICAgICAgICAgICAgICAgICAgCQkJCW5ld0xlYWZOb2RlKG90aGVybHZfNywgZ3JhbW1hckFjY2Vzcy5nZXRYQ29uc3RydWN0b3JDYWxsQWNjZXNzKCkuZ2V0R3JlYXRlclRoYW5TaWduS2V5d29yZF8zXzMoKSk7CkBAIC0yMDM4MiwyMCArMjE1NzYsMjAgQEAKIAogICAgICAgICAgICAgfQogCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo3NTA2OjM6ICggKCAoICggJygnICkgKT0+IChsdl9leHBsaWNpdENvbnN0cnVjdG9yQ2FsbF84XzA9ICcoJyApICkgKCAoICggKCAoKSAoICggKCBydWxlSnZtRm9ybWFsUGFyYW1ldGVyICkgKSAoICcsJyAoICggcnVsZUp2bUZvcm1hbFBhcmFtZXRlciApICkgKSogKT8gKCAoICd8JyApICkgKSApPT4gKGx2X2FyZ3VtZW50c185XzA9IHJ1bGVYU2hvcnRDbG9zdXJlICkgKSB8ICggKCAobHZfYXJndW1lbnRzXzEwXzA9IHJ1bGVYRXhwcmVzc2lvbiApICkgKG90aGVybHZfMTE9ICcsJyAoIChsdl9hcmd1bWVudHNfMTJfMD0gcnVsZVhFeHByZXNzaW9uICkgKSApKiApICk/IG90aGVybHZfMTM9ICcpJyApPwotICAgICAgICAgICAgaW50IGFsdDEzMz0yOwotICAgICAgICAgICAgYWx0MTMzID0gZGZhMTMzLnByZWRpY3QoaW5wdXQpOwotICAgICAgICAgICAgc3dpdGNoIChhbHQxMzMpIHsKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjc5NDU6MzogKCAoICggKCAnKCcgKSApPT4gKGx2X2V4cGxpY2l0Q29uc3RydWN0b3JDYWxsXzhfMD0gJygnICkgKSAoICggKCAoICgpICggKCAoIHJ1bGVKdm1Gb3JtYWxQYXJhbWV0ZXIgKSApICggJywnICggKCBydWxlSnZtRm9ybWFsUGFyYW1ldGVyICkgKSApKiApPyAoICggJ3wnICkgKSApICk9PiAobHZfYXJndW1lbnRzXzlfMD0gcnVsZVhTaG9ydENsb3N1cmUgKSApIHwgKCAoIChsdl9hcmd1bWVudHNfMTBfMD0gcnVsZVhFeHByZXNzaW9uICkgKSAob3RoZXJsdl8xMT0gJywnICggKGx2X2FyZ3VtZW50c18xMl8wPSBydWxlWEV4cHJlc3Npb24gKSApICkqICkgKT8gb3RoZXJsdl8xMz0gJyknICk/CisgICAgICAgICAgICBpbnQgYWx0MTQ0PTI7CisgICAgICAgICAgICBhbHQxNDQgPSBkZmExNDQucHJlZGljdChpbnB1dCk7CisgICAgICAgICAgICBzd2l0Y2ggKGFsdDE0NCkgewogICAgICAgICAgICAgICAgIGNhc2UgMSA6Ci0gICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjc1MDc6NDogKCAoICggJygnICkgKT0+IChsdl9leHBsaWNpdENvbnN0cnVjdG9yQ2FsbF84XzA9ICcoJyApICkgKCAoICggKCAoKSAoICggKCBydWxlSnZtRm9ybWFsUGFyYW1ldGVyICkgKSAoICcsJyAoICggcnVsZUp2bUZvcm1hbFBhcmFtZXRlciApICkgKSogKT8gKCAoICd8JyApICkgKSApPT4gKGx2X2FyZ3VtZW50c185XzA9IHJ1bGVYU2hvcnRDbG9zdXJlICkgKSB8ICggKCAobHZfYXJndW1lbnRzXzEwXzA9IHJ1bGVYRXhwcmVzc2lvbiApICkgKG90aGVybHZfMTE9ICcsJyAoIChsdl9hcmd1bWVudHNfMTJfMD0gcnVsZVhFeHByZXNzaW9uICkgKSApKiApICk/IG90aGVybHZfMTM9ICcpJworICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo3OTQ2OjQ6ICggKCAoICcoJyApICk9PiAobHZfZXhwbGljaXRDb25zdHJ1Y3RvckNhbGxfOF8wPSAnKCcgKSApICggKCAoICggKCkgKCAoICggcnVsZUp2bUZvcm1hbFBhcmFtZXRlciApICkgKCAnLCcgKCAoIHJ1bGVKdm1Gb3JtYWxQYXJhbWV0ZXIgKSApICkqICk/ICggKCAnfCcgKSApICkgKT0+IChsdl9hcmd1bWVudHNfOV8wPSBydWxlWFNob3J0Q2xvc3VyZSApICkgfCAoICggKGx2X2FyZ3VtZW50c18xMF8wPSBydWxlWEV4cHJlc3Npb24gKSApIChvdGhlcmx2XzExPSAnLCcgKCAobHZfYXJndW1lbnRzXzEyXzA9IHJ1bGVYRXhwcmVzc2lvbiApICkgKSogKSApPyBvdGhlcmx2XzEzPSAnKScKICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo3NTA3OjQ6ICggKCAoICcoJyApICk9PiAobHZfZXhwbGljaXRDb25zdHJ1Y3RvckNhbGxfOF8wPSAnKCcgKSApCi0gICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjc1MDg6NTogKCAoICcoJyApICk9PiAobHZfZXhwbGljaXRDb25zdHJ1Y3RvckNhbGxfOF8wPSAnKCcgKQorICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo3OTQ2OjQ6ICggKCAoICcoJyApICk9PiAobHZfZXhwbGljaXRDb25zdHJ1Y3RvckNhbGxfOF8wPSAnKCcgKSApCisgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjc5NDc6NTogKCAoICcoJyApICk9PiAobHZfZXhwbGljaXRDb25zdHJ1Y3RvckNhbGxfOF8wPSAnKCcgKQogICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjc1MTI6NTogKGx2X2V4cGxpY2l0Q29uc3RydWN0b3JDYWxsXzhfMD0gJygnICkKLSAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NzUxMzo2OiBsdl9leHBsaWNpdENvbnN0cnVjdG9yQ2FsbF84XzA9ICcoJworICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo3OTUxOjU6IChsdl9leHBsaWNpdENvbnN0cnVjdG9yQ2FsbF84XzA9ICcoJyApCisgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjc5NTI6NjogbHZfZXhwbGljaXRDb25zdHJ1Y3RvckNhbGxfOF8wPSAnKCcKICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBsdl9leHBsaWNpdENvbnN0cnVjdG9yQ2FsbF84XzA9KFRva2VuKW1hdGNoKGlucHV0LDc0LEZPTExPV185Mik7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OworICAgICAgICAgICAgICAgICAgICBsdl9leHBsaWNpdENvbnN0cnVjdG9yQ2FsbF84XzA9KFRva2VuKW1hdGNoKGlucHV0LDgxLEZPTExPV18xMDYpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gY3VycmVudDsKICAgICAgICAgICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAKICAgICAgICAgICAgICAgICAgICAgICAJCQkJCQluZXdMZWFmTm9kZShsdl9leHBsaWNpdENvbnN0cnVjdG9yQ2FsbF84XzAsIGdyYW1tYXJBY2Nlc3MuZ2V0WENvbnN0cnVjdG9yQ2FsbEFjY2VzcygpLmdldEV4cGxpY2l0Q29uc3RydWN0b3JDYWxsTGVmdFBhcmVudGhlc2lzS2V5d29yZF80XzBfMCgpKTsKQEAgLTIwNDE1LDI1ICsyMTYwOSwyNSBAQAogCiAgICAgICAgICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo3NTI1OjQ6ICggKCAoICggKCkgKCAoICggcnVsZUp2bUZvcm1hbFBhcmFtZXRlciApICkgKCAnLCcgKCAoIHJ1bGVKdm1Gb3JtYWxQYXJhbWV0ZXIgKSApICkqICk/ICggKCAnfCcgKSApICkgKT0+IChsdl9hcmd1bWVudHNfOV8wPSBydWxlWFNob3J0Q2xvc3VyZSApICkgfCAoICggKGx2X2FyZ3VtZW50c18xMF8wPSBydWxlWEV4cHJlc3Npb24gKSApIChvdGhlcmx2XzExPSAnLCcgKCAobHZfYXJndW1lbnRzXzEyXzA9IHJ1bGVYRXhwcmVzc2lvbiApICkgKSogKSApPwotICAgICAgICAgICAgICAgICAgICBpbnQgYWx0MTMyPTM7Ci0gICAgICAgICAgICAgICAgICAgIGFsdDEzMiA9IGRmYTEzMi5wcmVkaWN0KGlucHV0KTsKLSAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChhbHQxMzIpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6Nzk2NDo0OiAoICggKCAoICgpICggKCAoIHJ1bGVKdm1Gb3JtYWxQYXJhbWV0ZXIgKSApICggJywnICggKCBydWxlSnZtRm9ybWFsUGFyYW1ldGVyICkgKSApKiApPyAoICggJ3wnICkgKSApICk9PiAobHZfYXJndW1lbnRzXzlfMD0gcnVsZVhTaG9ydENsb3N1cmUgKSApIHwgKCAoIChsdl9hcmd1bWVudHNfMTBfMD0gcnVsZVhFeHByZXNzaW9uICkgKSAob3RoZXJsdl8xMT0gJywnICggKGx2X2FyZ3VtZW50c18xMl8wPSBydWxlWEV4cHJlc3Npb24gKSApICkqICkgKT8KKyAgICAgICAgICAgICAgICAgICAgaW50IGFsdDE0Mz0zOworICAgICAgICAgICAgICAgICAgICBhbHQxNDMgPSBkZmExNDMucHJlZGljdChpbnB1dCk7CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoYWx0MTQzKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDEgOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjc1MjY6NTogKCAoICggKCkgKCAoICggcnVsZUp2bUZvcm1hbFBhcmFtZXRlciApICkgKCAnLCcgKCAoIHJ1bGVKdm1Gb3JtYWxQYXJhbWV0ZXIgKSApICkqICk/ICggKCAnfCcgKSApICkgKT0+IChsdl9hcmd1bWVudHNfOV8wPSBydWxlWFNob3J0Q2xvc3VyZSApICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo3OTY1OjU6ICggKCAoICgpICggKCAoIHJ1bGVKdm1Gb3JtYWxQYXJhbWV0ZXIgKSApICggJywnICggKCBydWxlSnZtRm9ybWFsUGFyYW1ldGVyICkgKSApKiApPyAoICggJ3wnICkgKSApICk9PiAobHZfYXJndW1lbnRzXzlfMD0gcnVsZVhTaG9ydENsb3N1cmUgKSApCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjc1MjY6NTogKCAoICggKCkgKCAoICggcnVsZUp2bUZvcm1hbFBhcmFtZXRlciApICkgKCAnLCcgKCAoIHJ1bGVKdm1Gb3JtYWxQYXJhbWV0ZXIgKSApICkqICk/ICggKCAnfCcgKSApICkgKT0+IChsdl9hcmd1bWVudHNfOV8wPSBydWxlWFNob3J0Q2xvc3VyZSApICkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo3NTI3OjY6ICggKCAoKSAoICggKCBydWxlSnZtRm9ybWFsUGFyYW1ldGVyICkgKSAoICcsJyAoICggcnVsZUp2bUZvcm1hbFBhcmFtZXRlciApICkgKSogKT8gKCAoICd8JyApICkgKSApPT4gKGx2X2FyZ3VtZW50c185XzA9IHJ1bGVYU2hvcnRDbG9zdXJlICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo3OTY1OjU6ICggKCAoICgpICggKCAoIHJ1bGVKdm1Gb3JtYWxQYXJhbWV0ZXIgKSApICggJywnICggKCBydWxlSnZtRm9ybWFsUGFyYW1ldGVyICkgKSApKiApPyAoICggJ3wnICkgKSApICk9PiAobHZfYXJndW1lbnRzXzlfMD0gcnVsZVhTaG9ydENsb3N1cmUgKSApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6Nzk2Njo2OiAoICggKCkgKCAoICggcnVsZUp2bUZvcm1hbFBhcmFtZXRlciApICkgKCAnLCcgKCAoIHJ1bGVKdm1Gb3JtYWxQYXJhbWV0ZXIgKSApICkqICk/ICggKCAnfCcgKSApICkgKT0+IChsdl9hcmd1bWVudHNfOV8wPSBydWxlWFNob3J0Q2xvc3VyZSApCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjc1NTI6NjogKGx2X2FyZ3VtZW50c185XzA9IHJ1bGVYU2hvcnRDbG9zdXJlICkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo3NTUzOjc6IGx2X2FyZ3VtZW50c185XzA9IHJ1bGVYU2hvcnRDbG9zdXJlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6Nzk5MTo2OiAobHZfYXJndW1lbnRzXzlfMD0gcnVsZVhTaG9ydENsb3N1cmUgKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjc5OTI6NzogbHZfYXJndW1lbnRzXzlfMD0gcnVsZVhTaG9ydENsb3N1cmUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAkJCQkJCQluZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0WENvbnN0cnVjdG9yQ2FsbEFjY2VzcygpLmdldEFyZ3VtZW50c1hTaG9ydENsb3N1cmVQYXJzZXJSdWxlQ2FsbF80XzFfMF8wKCkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCQkJCQkJCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzYyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV183Nik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbHZfYXJndW1lbnRzXzlfMD1ydWxlWFNob3J0Q2xvc3VyZSgpOwogCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGUuX2ZzcC0tOwpAQCAtMjA0NjEsMjMgKzIxNjU1LDIzIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAyIDoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo3NTcxOjU6ICggKCAobHZfYXJndW1lbnRzXzEwXzA9IHJ1bGVYRXhwcmVzc2lvbiApICkgKG90aGVybHZfMTE9ICcsJyAoIChsdl9hcmd1bWVudHNfMTJfMD0gcnVsZVhFeHByZXNzaW9uICkgKSApKiApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6ODAxMDo1OiAoICggKGx2X2FyZ3VtZW50c18xMF8wPSBydWxlWEV4cHJlc3Npb24gKSApIChvdGhlcmx2XzExPSAnLCcgKCAobHZfYXJndW1lbnRzXzEyXzA9IHJ1bGVYRXhwcmVzc2lvbiApICkgKSogKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo3NTcxOjU6ICggKCAobHZfYXJndW1lbnRzXzEwXzA9IHJ1bGVYRXhwcmVzc2lvbiApICkgKG90aGVybHZfMTE9ICcsJyAoIChsdl9hcmd1bWVudHNfMTJfMD0gcnVsZVhFeHByZXNzaW9uICkgKSApKiApCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NzU3Mjo2OiAoIChsdl9hcmd1bWVudHNfMTBfMD0gcnVsZVhFeHByZXNzaW9uICkgKSAob3RoZXJsdl8xMT0gJywnICggKGx2X2FyZ3VtZW50c18xMl8wPSBydWxlWEV4cHJlc3Npb24gKSApICkqCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6ODAxMDo1OiAoICggKGx2X2FyZ3VtZW50c18xMF8wPSBydWxlWEV4cHJlc3Npb24gKSApIChvdGhlcmx2XzExPSAnLCcgKCAobHZfYXJndW1lbnRzXzEyXzA9IHJ1bGVYRXhwcmVzc2lvbiApICkgKSogKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjgwMTE6NjogKCAobHZfYXJndW1lbnRzXzEwXzA9IHJ1bGVYRXhwcmVzc2lvbiApICkgKG90aGVybHZfMTE9ICcsJyAoIChsdl9hcmd1bWVudHNfMTJfMD0gcnVsZVhFeHByZXNzaW9uICkgKSApKgogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo3NTcyOjY6ICggKGx2X2FyZ3VtZW50c18xMF8wPSBydWxlWEV4cHJlc3Npb24gKSApCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NzU3Mzo3OiAobHZfYXJndW1lbnRzXzEwXzA9IHJ1bGVYRXhwcmVzc2lvbiApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6ODAxMTo2OiAoIChsdl9hcmd1bWVudHNfMTBfMD0gcnVsZVhFeHByZXNzaW9uICkgKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjgwMTI6NzogKGx2X2FyZ3VtZW50c18xMF8wPSBydWxlWEV4cHJlc3Npb24gKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo3NTczOjc6IChsdl9hcmd1bWVudHNfMTBfMD0gcnVsZVhFeHByZXNzaW9uICkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo3NTc0Ojg6IGx2X2FyZ3VtZW50c18xMF8wPSBydWxlWEV4cHJlc3Npb24KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo4MDEyOjc6IChsdl9hcmd1bWVudHNfMTBfMD0gcnVsZVhFeHByZXNzaW9uICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo4MDEzOjg6IGx2X2FyZ3VtZW50c18xMF8wPSBydWxlWEV4cHJlc3Npb24KICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAkJCQkJCQkJbmV3Q29tcG9zaXRlTm9kZShncmFtbWFyQWNjZXNzLmdldFhDb25zdHJ1Y3RvckNhbGxBY2Nlc3MoKS5nZXRBcmd1bWVudHNYRXhwcmVzc2lvblBhcnNlclJ1bGVDYWxsXzRfMV8xXzBfMCgpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAkJCQkJCQkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfNjEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzc1KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsdl9hcmd1bWVudHNfMTBfMD1ydWxlWEV4cHJlc3Npb24oKTsKIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlLl9mc3AtLTsKQEAgLTIwNTAxLDM5ICsyMTY5NSwzOSBAQAogCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NzU5MTo2OiAob3RoZXJsdl8xMT0gJywnICggKGx2X2FyZ3VtZW50c18xMl8wPSBydWxlWEV4cHJlc3Npb24gKSApICkqCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9vcDEzMToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo4MDMwOjY6IChvdGhlcmx2XzExPSAnLCcgKCAobHZfYXJndW1lbnRzXzEyXzA9IHJ1bGVYRXhwcmVzc2lvbiApICkgKSoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb29wMTQyOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGFsdDEzMT0yOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgTEExMzFfMCA9IGlucHV0LkxBKDEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYWx0MTQyPTI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBMQTE0Ml8wID0gaW5wdXQuTEEoMSk7CiAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCAoTEExMzFfMD09NzUpICkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWx0MTMxPTE7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICggKExBMTQyXzA9PTgyKSApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsdDE0Mj0xOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAKIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKGFsdDEzMSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKGFsdDE0MikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgIAljYXNlIDEgOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIAkgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NzU5Mjo3OiBvdGhlcmx2XzExPSAnLCcgKCAobHZfYXJndW1lbnRzXzEyXzA9IHJ1bGVYRXhwcmVzc2lvbiApICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAJICAgIC8vIEludGVybmFsRGF0YURTTC5nOjgwMzE6Nzogb3RoZXJsdl8xMT0gJywnICggKGx2X2FyZ3VtZW50c18xMl8wPSBydWxlWEV4cHJlc3Npb24gKSApCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCSAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgCSAgICBvdGhlcmx2XzExPShUb2tlbiltYXRjaChpbnB1dCw3NSxGT0xMT1dfNjQpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gY3VycmVudDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAJICAgIG90aGVybHZfMTE9KFRva2VuKW1hdGNoKGlucHV0LDgyLEZPTExPV183OCk7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIAkgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAJICAgICAgCQkJCQkJCW5ld0xlYWZOb2RlKG90aGVybHZfMTEsIGdyYW1tYXJBY2Nlc3MuZ2V0WENvbnN0cnVjdG9yQ2FsbEFjY2VzcygpLmdldENvbW1hS2V5d29yZF80XzFfMV8xXzAoKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCSAgICAgIAkJCQkJCQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIAkgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIAkgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NzU5Njo3OiAoIChsdl9hcmd1bWVudHNfMTJfMD0gcnVsZVhFeHByZXNzaW9uICkgKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIAkgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NzU5Nzo4OiAobHZfYXJndW1lbnRzXzEyXzA9IHJ1bGVYRXhwcmVzc2lvbiApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgCSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo4MDM1Ojc6ICggKGx2X2FyZ3VtZW50c18xMl8wPSBydWxlWEV4cHJlc3Npb24gKSApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgCSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo4MDM2Ojg6IChsdl9hcmd1bWVudHNfMTJfMD0gcnVsZVhFeHByZXNzaW9uICkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAJICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAJICAgIC8vIEludGVybmFsRGF0YURTTC5nOjc1OTc6ODogKGx2X2FyZ3VtZW50c18xMl8wPSBydWxlWEV4cHJlc3Npb24gKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIAkgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NzU5ODo5OiBsdl9hcmd1bWVudHNfMTJfMD0gcnVsZVhFeHByZXNzaW9uCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgCSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo4MDM2Ojg6IChsdl9hcmd1bWVudHNfMTJfMD0gcnVsZVhFeHByZXNzaW9uICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAJICAgIC8vIEludGVybmFsRGF0YURTTC5nOjgwMzc6OTogbHZfYXJndW1lbnRzXzEyXzA9IHJ1bGVYRXhwcmVzc2lvbgogICAgICAgICAgICAgICAgICAgICAgICAgICAgIAkgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgIAkgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAJICAgICAgCQkJCQkJCQkJbmV3Q29tcG9zaXRlTm9kZShncmFtbWFyQWNjZXNzLmdldFhDb25zdHJ1Y3RvckNhbGxBY2Nlc3MoKS5nZXRBcmd1bWVudHNYRXhwcmVzc2lvblBhcnNlclJ1bGVDYWxsXzRfMV8xXzFfMV8wKCkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIAkgICAgICAJCQkJCQkJCQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIAkgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIAkgICAgcHVzaEZvbGxvdyhGT0xMT1dfNjEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIAkgICAgcHVzaEZvbGxvdyhGT0xMT1dfNzUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIAkgICAgbHZfYXJndW1lbnRzXzEyXzA9cnVsZVhFeHByZXNzaW9uKCk7CiAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAJICAgIHN0YXRlLl9mc3AtLTsKQEAgLTIwNTYyLDcgKzIxNzU2LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAJICAgIGJyZWFrOwogCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCWRlZmF1bHQgOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIAkgICAgYnJlYWsgbG9vcDEzMTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAJICAgIGJyZWFrIGxvb3AxNDI7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IHdoaWxlICh0cnVlKTsKIApAQCAtMjA1NzUsNyArMjE3NjksNyBAQAogCiAgICAgICAgICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgICAgICAgICBvdGhlcmx2XzEzPShUb2tlbiltYXRjaChpbnB1dCw3NixGT0xMT1dfMTIwKTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7CisgICAgICAgICAgICAgICAgICAgIG90aGVybHZfMTM9KFRva2VuKW1hdGNoKGlucHV0LDgzLEZPTExPV18xMzMpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gY3VycmVudDsKICAgICAgICAgICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAKICAgICAgICAgICAgICAgICAgICAgICAJCQkJbmV3TGVhZk5vZGUob3RoZXJsdl8xMywgZ3JhbW1hckFjY2Vzcy5nZXRYQ29uc3RydWN0b3JDYWxsQWNjZXNzKCkuZ2V0UmlnaHRQYXJlbnRoZXNpc0tleXdvcmRfNF8yKCkpOwpAQCAtMjA1ODcsMTUgKzIxNzgxLDE1IEBACiAKICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NzYyMzozOiAoICggKCAoKSAnWycgKSApPT4gKGx2X2FyZ3VtZW50c18xNF8wPSBydWxlWENsb3N1cmUgKSApPwotICAgICAgICAgICAgaW50IGFsdDEzND0yOwotICAgICAgICAgICAgYWx0MTM0ID0gZGZhMTM0LnByZWRpY3QoaW5wdXQpOwotICAgICAgICAgICAgc3dpdGNoIChhbHQxMzQpIHsKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjgwNjI6MzogKCAoICggKCkgJ1snICkgKT0+IChsdl9hcmd1bWVudHNfMTRfMD0gcnVsZVhDbG9zdXJlICkgKT8KKyAgICAgICAgICAgIGludCBhbHQxNDU9MjsKKyAgICAgICAgICAgIGFsdDE0NSA9IGRmYTE0NS5wcmVkaWN0KGlucHV0KTsKKyAgICAgICAgICAgIHN3aXRjaCAoYWx0MTQ1KSB7CiAgICAgICAgICAgICAgICAgY2FzZSAxIDoKLSAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NzYyNDo0OiAoICggKCkgJ1snICkgKT0+IChsdl9hcmd1bWVudHNfMTRfMD0gcnVsZVhDbG9zdXJlICkKKyAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6ODA2Mzo0OiAoICggKCkgJ1snICkgKT0+IChsdl9hcmd1bWVudHNfMTRfMD0gcnVsZVhDbG9zdXJlICkKICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo3NjMwOjQ6IChsdl9hcmd1bWVudHNfMTRfMD0gcnVsZVhDbG9zdXJlICkKLSAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NzYzMTo1OiBsdl9hcmd1bWVudHNfMTRfMD0gcnVsZVhDbG9zdXJlCisgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjgwNjk6NDogKGx2X2FyZ3VtZW50c18xNF8wPSBydWxlWENsb3N1cmUgKQorICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo4MDcwOjU6IGx2X2FyZ3VtZW50c18xNF8wPSBydWxlWENsb3N1cmUKICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKIApAQCAtMjA2NTQsNyArMjE4NDgsNyBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgImVudHJ5UnVsZVhCb29sZWFuTGl0ZXJhbCIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo3NjUyOjE6IGVudHJ5UnVsZVhCb29sZWFuTGl0ZXJhbCByZXR1cm5zIFtFT2JqZWN0IGN1cnJlbnQ9bnVsbF0gOiBpdl9ydWxlWEJvb2xlYW5MaXRlcmFsPSBydWxlWEJvb2xlYW5MaXRlcmFsIEVPRiA7CisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6ODA5MToxOiBlbnRyeVJ1bGVYQm9vbGVhbkxpdGVyYWwgcmV0dXJucyBbRU9iamVjdCBjdXJyZW50PW51bGxdIDogaXZfcnVsZVhCb29sZWFuTGl0ZXJhbD0gcnVsZVhCb29sZWFuTGl0ZXJhbCBFT0YgOwogICAgIHB1YmxpYyBmaW5hbCBFT2JqZWN0IGVudHJ5UnVsZVhCb29sZWFuTGl0ZXJhbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAgICAgICAgIEVPYmplY3QgY3VycmVudCA9IG51bGw7CiAKQEAgLTIwNjYyLDggKzIxODU2LDggQEAKIAogCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo3NjUyOjU2OiAoaXZfcnVsZVhCb29sZWFuTGl0ZXJhbD0gcnVsZVhCb29sZWFuTGl0ZXJhbCBFT0YgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NzY1MzoyOiBpdl9ydWxlWEJvb2xlYW5MaXRlcmFsPSBydWxlWEJvb2xlYW5MaXRlcmFsIEVPRgorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6ODA5MTo1NjogKGl2X3J1bGVYQm9vbGVhbkxpdGVyYWw9IHJ1bGVYQm9vbGVhbkxpdGVyYWwgRU9GICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjgwOTI6MjogaXZfcnVsZVhCb29sZWFuTGl0ZXJhbD0gcnVsZVhCb29sZWFuTGl0ZXJhbCBFT0YKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgbmV3Q29tcG9zaXRlTm9kZShncmFtbWFyQWNjZXNzLmdldFhCb29sZWFuTGl0ZXJhbFJ1bGUoKSk7IApAQCAtMjA2OTQsNyArMjE4ODgsNyBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVYQm9vbGVhbkxpdGVyYWwiCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NzY1OToxOiBydWxlWEJvb2xlYW5MaXRlcmFsIHJldHVybnMgW0VPYmplY3QgY3VycmVudD1udWxsXSA6ICggKCkgKG90aGVybHZfMT0gJ2ZhbHNlJyB8ICggKGx2X2lzVHJ1ZV8yXzA9ICd0cnVlJyApICkgKSApIDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo4MDk4OjE6IHJ1bGVYQm9vbGVhbkxpdGVyYWwgcmV0dXJucyBbRU9iamVjdCBjdXJyZW50PW51bGxdIDogKCAoKSAob3RoZXJsdl8xPSAnZmFsc2UnIHwgKCAobHZfaXNUcnVlXzJfMD0gJ3RydWUnICkgKSApICkgOwogICAgIHB1YmxpYyBmaW5hbCBFT2JqZWN0IHJ1bGVYQm9vbGVhbkxpdGVyYWwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogICAgICAgICBFT2JqZWN0IGN1cnJlbnQgPSBudWxsOwogCkBAIC0yMDcwNSwxNCArMjE4OTksMTQgQEAKICAgICAgICAgCWVudGVyUnVsZSgpOwogCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo3NjY1OjI6ICggKCAoKSAob3RoZXJsdl8xPSAnZmFsc2UnIHwgKCAobHZfaXNUcnVlXzJfMD0gJ3RydWUnICkgKSApICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NzY2NjoyOiAoICgpIChvdGhlcmx2XzE9ICdmYWxzZScgfCAoIChsdl9pc1RydWVfMl8wPSAndHJ1ZScgKSApICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6ODEwNDoyOiAoICggKCkgKG90aGVybHZfMT0gJ2ZhbHNlJyB8ICggKGx2X2lzVHJ1ZV8yXzA9ICd0cnVlJyApICkgKSApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjgxMDU6MjogKCAoKSAob3RoZXJsdl8xPSAnZmFsc2UnIHwgKCAobHZfaXNUcnVlXzJfMD0gJ3RydWUnICkgKSApICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjc2NjY6MjogKCAoKSAob3RoZXJsdl8xPSAnZmFsc2UnIHwgKCAobHZfaXNUcnVlXzJfMD0gJ3RydWUnICkgKSApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjc2Njc6MzogKCkgKG90aGVybHZfMT0gJ2ZhbHNlJyB8ICggKGx2X2lzVHJ1ZV8yXzA9ICd0cnVlJyApICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6ODEwNToyOiAoICgpIChvdGhlcmx2XzE9ICdmYWxzZScgfCAoIChsdl9pc1RydWVfMl8wPSAndHJ1ZScgKSApICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6ODEwNjozOiAoKSAob3RoZXJsdl8xPSAnZmFsc2UnIHwgKCAobHZfaXNUcnVlXzJfMD0gJ3RydWUnICkgKSApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo3NjY3OjM6ICgpCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo3NjY4OjQ6IAorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6ODEwNjozOiAoKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6ODEwNzo0OiAKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogCkBAIC0yMDcyNCwyOCArMjE5MTgsMjggQEAKIAogICAgICAgICAgICAgfQogCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo3Njc0OjM6IChvdGhlcmx2XzE9ICdmYWxzZScgfCAoIChsdl9pc1RydWVfMl8wPSAndHJ1ZScgKSApICkKLSAgICAgICAgICAgIGludCBhbHQxMzU9MjsKLSAgICAgICAgICAgIGludCBMQTEzNV8wID0gaW5wdXQuTEEoMSk7CisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo4MTEzOjM6IChvdGhlcmx2XzE9ICdmYWxzZScgfCAoIChsdl9pc1RydWVfMl8wPSAndHJ1ZScgKSApICkKKyAgICAgICAgICAgIGludCBhbHQxNDY9MjsKKyAgICAgICAgICAgIGludCBMQTE0Nl8wID0gaW5wdXQuTEEoMSk7CiAKLSAgICAgICAgICAgIGlmICggKExBMTM1XzA9PTEyNikgKSB7Ci0gICAgICAgICAgICAgICAgYWx0MTM1PTE7CisgICAgICAgICAgICBpZiAoIChMQTE0Nl8wPT0xMzMpICkgeworICAgICAgICAgICAgICAgIGFsdDE0Nj0xOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSBpZiAoIChMQTEzNV8wPT0xMjcpICkgewotICAgICAgICAgICAgICAgIGFsdDEzNT0yOworICAgICAgICAgICAgZWxzZSBpZiAoIChMQTE0Nl8wPT0xMzQpICkgeworICAgICAgICAgICAgICAgIGFsdDE0Nj0yOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgaWYgKHN0YXRlLmJhY2t0cmFja2luZz4wKSB7c3RhdGUuZmFpbGVkPXRydWU7IHJldHVybiBjdXJyZW50O30KICAgICAgICAgICAgICAgICBOb1ZpYWJsZUFsdEV4Y2VwdGlvbiBudmFlID0KLSAgICAgICAgICAgICAgICAgICAgbmV3IE5vVmlhYmxlQWx0RXhjZXB0aW9uKCIiLCAxMzUsIDAsIGlucHV0KTsKKyAgICAgICAgICAgICAgICAgICAgbmV3IE5vVmlhYmxlQWx0RXhjZXB0aW9uKCIiLCAxNDYsIDAsIGlucHV0KTsKIAogICAgICAgICAgICAgICAgIHRocm93IG52YWU7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBzd2l0Y2ggKGFsdDEzNSkgeworICAgICAgICAgICAgc3dpdGNoIChhbHQxNDYpIHsKICAgICAgICAgICAgICAgICBjYXNlIDEgOgotICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo3Njc1OjQ6IG90aGVybHZfMT0gJ2ZhbHNlJworICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo4MTE0OjQ6IG90aGVybHZfMT0gJ2ZhbHNlJwogICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIG90aGVybHZfMT0oVG9rZW4pbWF0Y2goaW5wdXQsMTI2LEZPTExPV18yKTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7CisgICAgICAgICAgICAgICAgICAgIG90aGVybHZfMT0oVG9rZW4pbWF0Y2goaW5wdXQsMTMzLEZPTExPV18yKTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7CiAgICAgICAgICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogCiAgICAgICAgICAgICAgICAgICAgICAgCQkJCW5ld0xlYWZOb2RlKG90aGVybHZfMSwgZ3JhbW1hckFjY2Vzcy5nZXRYQm9vbGVhbkxpdGVyYWxBY2Nlc3MoKS5nZXRGYWxzZUtleXdvcmRfMV8wKCkpOwpAQCAtMjA3NTUsMTUgKzIxOTQ5LDE1IEBACiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgY2FzZSAyIDoKLSAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NzY4MDo0OiAoIChsdl9pc1RydWVfMl8wPSAndHJ1ZScgKSApCisgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjgxMTk6NDogKCAobHZfaXNUcnVlXzJfMD0gJ3RydWUnICkgKQogICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjc2ODA6NDogKCAobHZfaXNUcnVlXzJfMD0gJ3RydWUnICkgKQotICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo3NjgxOjU6IChsdl9pc1RydWVfMl8wPSAndHJ1ZScgKQorICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo4MTE5OjQ6ICggKGx2X2lzVHJ1ZV8yXzA9ICd0cnVlJyApICkKKyAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6ODEyMDo1OiAobHZfaXNUcnVlXzJfMD0gJ3RydWUnICkKICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo3NjgxOjU6IChsdl9pc1RydWVfMl8wPSAndHJ1ZScgKQotICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo3NjgyOjY6IGx2X2lzVHJ1ZV8yXzA9ICd0cnVlJworICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo4MTIwOjU6IChsdl9pc1RydWVfMl8wPSAndHJ1ZScgKQorICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo4MTIxOjY6IGx2X2lzVHJ1ZV8yXzA9ICd0cnVlJwogICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGx2X2lzVHJ1ZV8yXzA9KFRva2VuKW1hdGNoKGlucHV0LDEyNyxGT0xMT1dfMik7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OworICAgICAgICAgICAgICAgICAgICBsdl9pc1RydWVfMl8wPShUb2tlbiltYXRjaChpbnB1dCwxMzQsRk9MTE9XXzIpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gY3VycmVudDsKICAgICAgICAgICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAKICAgICAgICAgICAgICAgICAgICAgICAJCQkJCQluZXdMZWFmTm9kZShsdl9pc1RydWVfMl8wLCBncmFtbWFyQWNjZXNzLmdldFhCb29sZWFuTGl0ZXJhbEFjY2VzcygpLmdldElzVHJ1ZVRydWVLZXl3b3JkXzFfMV8wKCkpOwpAQCAtMjA4MTQsNyArMjIwMDgsNyBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgImVudHJ5UnVsZVhOdWxsTGl0ZXJhbCIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo3Njk5OjE6IGVudHJ5UnVsZVhOdWxsTGl0ZXJhbCByZXR1cm5zIFtFT2JqZWN0IGN1cnJlbnQ9bnVsbF0gOiBpdl9ydWxlWE51bGxMaXRlcmFsPSBydWxlWE51bGxMaXRlcmFsIEVPRiA7CisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6ODEzODoxOiBlbnRyeVJ1bGVYTnVsbExpdGVyYWwgcmV0dXJucyBbRU9iamVjdCBjdXJyZW50PW51bGxdIDogaXZfcnVsZVhOdWxsTGl0ZXJhbD0gcnVsZVhOdWxsTGl0ZXJhbCBFT0YgOwogICAgIHB1YmxpYyBmaW5hbCBFT2JqZWN0IGVudHJ5UnVsZVhOdWxsTGl0ZXJhbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAgICAgICAgIEVPYmplY3QgY3VycmVudCA9IG51bGw7CiAKQEAgLTIwODIyLDggKzIyMDE2LDggQEAKIAogCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo3Njk5OjUzOiAoaXZfcnVsZVhOdWxsTGl0ZXJhbD0gcnVsZVhOdWxsTGl0ZXJhbCBFT0YgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NzcwMDoyOiBpdl9ydWxlWE51bGxMaXRlcmFsPSBydWxlWE51bGxMaXRlcmFsIEVPRgorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6ODEzODo1MzogKGl2X3J1bGVYTnVsbExpdGVyYWw9IHJ1bGVYTnVsbExpdGVyYWwgRU9GICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjgxMzk6MjogaXZfcnVsZVhOdWxsTGl0ZXJhbD0gcnVsZVhOdWxsTGl0ZXJhbCBFT0YKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgbmV3Q29tcG9zaXRlTm9kZShncmFtbWFyQWNjZXNzLmdldFhOdWxsTGl0ZXJhbFJ1bGUoKSk7IApAQCAtMjA4NTQsNyArMjIwNDgsNyBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVYTnVsbExpdGVyYWwiCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NzcwNjoxOiBydWxlWE51bGxMaXRlcmFsIHJldHVybnMgW0VPYmplY3QgY3VycmVudD1udWxsXSA6ICggKCkgb3RoZXJsdl8xPSAnbnVsbCcgKSA7CisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6ODE0NToxOiBydWxlWE51bGxMaXRlcmFsIHJldHVybnMgW0VPYmplY3QgY3VycmVudD1udWxsXSA6ICggKCkgb3RoZXJsdl8xPSAnbnVsbCcgKSA7CiAgICAgcHVibGljIGZpbmFsIEVPYmplY3QgcnVsZVhOdWxsTGl0ZXJhbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAgICAgICAgIEVPYmplY3QgY3VycmVudCA9IG51bGw7CiAKQEAgLTIwODY0LDE0ICsyMjA1OCwxNCBAQAogICAgICAgICAJZW50ZXJSdWxlKCk7CiAKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjc3MTI6MjogKCAoICgpIG90aGVybHZfMT0gJ251bGwnICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NzcxMzoyOiAoICgpIG90aGVybHZfMT0gJ251bGwnICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjgxNTE6MjogKCAoICgpIG90aGVybHZfMT0gJ251bGwnICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6ODE1MjoyOiAoICgpIG90aGVybHZfMT0gJ251bGwnICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjc3MTM6MjogKCAoKSBvdGhlcmx2XzE9ICdudWxsJyApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo3NzE0OjM6ICgpIG90aGVybHZfMT0gJ251bGwnCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo4MTUyOjI6ICggKCkgb3RoZXJsdl8xPSAnbnVsbCcgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6ODE1MzozOiAoKSBvdGhlcmx2XzE9ICdudWxsJwogICAgICAgICAgICAgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NzcxNDozOiAoKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NzcxNTo0OiAKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjgxNTM6MzogKCkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjgxNTQ6NDogCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKIApAQCAtMjA4ODMsNyArMjIwNzcsNyBAQAogCiAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgIG90aGVybHZfMT0oVG9rZW4pbWF0Y2goaW5wdXQsMTI4LEZPTExPV18yKTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7CisgICAgICAgICAgICBvdGhlcmx2XzE9KFRva2VuKW1hdGNoKGlucHV0LDEzNSxGT0xMT1dfMik7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OwogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAKICAgICAgICAgICAgICAgCQkJbmV3TGVhZk5vZGUob3RoZXJsdl8xLCBncmFtbWFyQWNjZXNzLmdldFhOdWxsTGl0ZXJhbEFjY2VzcygpLmdldE51bGxLZXl3b3JkXzEoKSk7CkBAIC0yMDkxNCw3ICsyMjEwOCw3IEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAiZW50cnlSdWxlWE51bWJlckxpdGVyYWwiCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NzcyOToxOiBlbnRyeVJ1bGVYTnVtYmVyTGl0ZXJhbCByZXR1cm5zIFtFT2JqZWN0IGN1cnJlbnQ9bnVsbF0gOiBpdl9ydWxlWE51bWJlckxpdGVyYWw9IHJ1bGVYTnVtYmVyTGl0ZXJhbCBFT0YgOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjgxNjg6MTogZW50cnlSdWxlWE51bWJlckxpdGVyYWwgcmV0dXJucyBbRU9iamVjdCBjdXJyZW50PW51bGxdIDogaXZfcnVsZVhOdW1iZXJMaXRlcmFsPSBydWxlWE51bWJlckxpdGVyYWwgRU9GIDsKICAgICBwdWJsaWMgZmluYWwgRU9iamVjdCBlbnRyeVJ1bGVYTnVtYmVyTGl0ZXJhbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAgICAgICAgIEVPYmplY3QgY3VycmVudCA9IG51bGw7CiAKQEAgLTIwOTIyLDggKzIyMTE2LDggQEAKIAogCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo3NzI5OjU1OiAoaXZfcnVsZVhOdW1iZXJMaXRlcmFsPSBydWxlWE51bWJlckxpdGVyYWwgRU9GICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjc3MzA6MjogaXZfcnVsZVhOdW1iZXJMaXRlcmFsPSBydWxlWE51bWJlckxpdGVyYWwgRU9GCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo4MTY4OjU1OiAoaXZfcnVsZVhOdW1iZXJMaXRlcmFsPSBydWxlWE51bWJlckxpdGVyYWwgRU9GICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjgxNjk6MjogaXZfcnVsZVhOdW1iZXJMaXRlcmFsPSBydWxlWE51bWJlckxpdGVyYWwgRU9GCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIG5ld0NvbXBvc2l0ZU5vZGUoZ3JhbW1hckFjY2Vzcy5nZXRYTnVtYmVyTGl0ZXJhbFJ1bGUoKSk7IApAQCAtMjA5NTQsNyArMjIxNDgsNyBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVYTnVtYmVyTGl0ZXJhbCIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo3NzM2OjE6IHJ1bGVYTnVtYmVyTGl0ZXJhbCByZXR1cm5zIFtFT2JqZWN0IGN1cnJlbnQ9bnVsbF0gOiAoICgpICggKGx2X3ZhbHVlXzFfMD0gcnVsZU51bWJlciApICkgKSA7CisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6ODE3NToxOiBydWxlWE51bWJlckxpdGVyYWwgcmV0dXJucyBbRU9iamVjdCBjdXJyZW50PW51bGxdIDogKCAoKSAoIChsdl92YWx1ZV8xXzA9IHJ1bGVOdW1iZXIgKSApICkgOwogICAgIHB1YmxpYyBmaW5hbCBFT2JqZWN0IHJ1bGVYTnVtYmVyTGl0ZXJhbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAgICAgICAgIEVPYmplY3QgY3VycmVudCA9IG51bGw7CiAKQEAgLTIwOTY1LDE0ICsyMjE1OSwxNCBAQAogICAgICAgICAJZW50ZXJSdWxlKCk7CiAKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjc3NDI6MjogKCAoICgpICggKGx2X3ZhbHVlXzFfMD0gcnVsZU51bWJlciApICkgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo3NzQzOjI6ICggKCkgKCAobHZfdmFsdWVfMV8wPSBydWxlTnVtYmVyICkgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo4MTgxOjI6ICggKCAoKSAoIChsdl92YWx1ZV8xXzA9IHJ1bGVOdW1iZXIgKSApICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6ODE4MjoyOiAoICgpICggKGx2X3ZhbHVlXzFfMD0gcnVsZU51bWJlciApICkgKQogICAgICAgICAgICAgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6Nzc0MzoyOiAoICgpICggKGx2X3ZhbHVlXzFfMD0gcnVsZU51bWJlciApICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6Nzc0NDozOiAoKSAoIChsdl92YWx1ZV8xXzA9IHJ1bGVOdW1iZXIgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo4MTgyOjI6ICggKCkgKCAobHZfdmFsdWVfMV8wPSBydWxlTnVtYmVyICkgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo4MTgzOjM6ICgpICggKGx2X3ZhbHVlXzFfMD0gcnVsZU51bWJlciApICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjc3NDQ6MzogKCkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjc3NDU6NDogCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo4MTgzOjM6ICgpCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo4MTg0OjQ6IAogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAKQEAgLTIwOTg0LDExICsyMjE3OCwxMSBAQAogCiAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjc3NTE6MzogKCAobHZfdmFsdWVfMV8wPSBydWxlTnVtYmVyICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6Nzc1Mjo0OiAobHZfdmFsdWVfMV8wPSBydWxlTnVtYmVyICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjgxOTA6MzogKCAobHZfdmFsdWVfMV8wPSBydWxlTnVtYmVyICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6ODE5MTo0OiAobHZfdmFsdWVfMV8wPSBydWxlTnVtYmVyICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjc3NTI6NDogKGx2X3ZhbHVlXzFfMD0gcnVsZU51bWJlciApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo3NzUzOjU6IGx2X3ZhbHVlXzFfMD0gcnVsZU51bWJlcgorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6ODE5MTo0OiAobHZfdmFsdWVfMV8wPSBydWxlTnVtYmVyICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjgxOTI6NTogbHZfdmFsdWVfMV8wPSBydWxlTnVtYmVyCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKIApAQCAtMjEwNDQsNyArMjIyMzgsNyBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgImVudHJ5UnVsZVhTdHJpbmdMaXRlcmFsIgotICAgIC8vIEludGVybmFsRGF0YURTTC5nOjc3NzQ6MTogZW50cnlSdWxlWFN0cmluZ0xpdGVyYWwgcmV0dXJucyBbRU9iamVjdCBjdXJyZW50PW51bGxdIDogaXZfcnVsZVhTdHJpbmdMaXRlcmFsPSBydWxlWFN0cmluZ0xpdGVyYWwgRU9GIDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo4MjEzOjE6IGVudHJ5UnVsZVhTdHJpbmdMaXRlcmFsIHJldHVybnMgW0VPYmplY3QgY3VycmVudD1udWxsXSA6IGl2X3J1bGVYU3RyaW5nTGl0ZXJhbD0gcnVsZVhTdHJpbmdMaXRlcmFsIEVPRiA7CiAgICAgcHVibGljIGZpbmFsIEVPYmplY3QgZW50cnlSdWxlWFN0cmluZ0xpdGVyYWwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogICAgICAgICBFT2JqZWN0IGN1cnJlbnQgPSBudWxsOwogCkBAIC0yMTA1Miw4ICsyMjI0Niw4IEBACiAKIAogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6Nzc3NDo1NTogKGl2X3J1bGVYU3RyaW5nTGl0ZXJhbD0gcnVsZVhTdHJpbmdMaXRlcmFsIEVPRiApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo3Nzc1OjI6IGl2X3J1bGVYU3RyaW5nTGl0ZXJhbD0gcnVsZVhTdHJpbmdMaXRlcmFsIEVPRgorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6ODIxMzo1NTogKGl2X3J1bGVYU3RyaW5nTGl0ZXJhbD0gcnVsZVhTdHJpbmdMaXRlcmFsIEVPRiApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo4MjE0OjI6IGl2X3J1bGVYU3RyaW5nTGl0ZXJhbD0gcnVsZVhTdHJpbmdMaXRlcmFsIEVPRgogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBuZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0WFN0cmluZ0xpdGVyYWxSdWxlKCkpOyAKQEAgLTIxMDg0LDcgKzIyMjc4LDcgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlWFN0cmluZ0xpdGVyYWwiCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6Nzc4MToxOiBydWxlWFN0cmluZ0xpdGVyYWwgcmV0dXJucyBbRU9iamVjdCBjdXJyZW50PW51bGxdIDogKCAoKSAoIChsdl92YWx1ZV8xXzA9IFJVTEVfU1RSSU5HICkgKSApIDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo4MjIwOjE6IHJ1bGVYU3RyaW5nTGl0ZXJhbCByZXR1cm5zIFtFT2JqZWN0IGN1cnJlbnQ9bnVsbF0gOiAoICgpICggKGx2X3ZhbHVlXzFfMD0gUlVMRV9TVFJJTkcgKSApICkgOwogICAgIHB1YmxpYyBmaW5hbCBFT2JqZWN0IHJ1bGVYU3RyaW5nTGl0ZXJhbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAgICAgICAgIEVPYmplY3QgY3VycmVudCA9IG51bGw7CiAKQEAgLTIxMDk0LDE0ICsyMjI4OCwxNCBAQAogICAgICAgICAJZW50ZXJSdWxlKCk7CiAKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjc3ODc6MjogKCAoICgpICggKGx2X3ZhbHVlXzFfMD0gUlVMRV9TVFJJTkcgKSApICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6Nzc4ODoyOiAoICgpICggKGx2X3ZhbHVlXzFfMD0gUlVMRV9TVFJJTkcgKSApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjgyMjY6MjogKCAoICgpICggKGx2X3ZhbHVlXzFfMD0gUlVMRV9TVFJJTkcgKSApICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6ODIyNzoyOiAoICgpICggKGx2X3ZhbHVlXzFfMD0gUlVMRV9TVFJJTkcgKSApICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjc3ODg6MjogKCAoKSAoIChsdl92YWx1ZV8xXzA9IFJVTEVfU1RSSU5HICkgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo3Nzg5OjM6ICgpICggKGx2X3ZhbHVlXzFfMD0gUlVMRV9TVFJJTkcgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo4MjI3OjI6ICggKCkgKCAobHZfdmFsdWVfMV8wPSBSVUxFX1NUUklORyApICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6ODIyODozOiAoKSAoIChsdl92YWx1ZV8xXzA9IFJVTEVfU1RSSU5HICkgKQogICAgICAgICAgICAgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6Nzc4OTozOiAoKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6Nzc5MDo0OiAKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjgyMjg6MzogKCkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjgyMjk6NDogCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKIApAQCAtMjExMTMsMTEgKzIyMzA3LDExIEBACiAKICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6Nzc5NjozOiAoIChsdl92YWx1ZV8xXzA9IFJVTEVfU1RSSU5HICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6Nzc5Nzo0OiAobHZfdmFsdWVfMV8wPSBSVUxFX1NUUklORyApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo4MjM1OjM6ICggKGx2X3ZhbHVlXzFfMD0gUlVMRV9TVFJJTkcgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo4MjM2OjQ6IChsdl92YWx1ZV8xXzA9IFJVTEVfU1RSSU5HICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjc3OTc6NDogKGx2X3ZhbHVlXzFfMD0gUlVMRV9TVFJJTkcgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6Nzc5ODo1OiBsdl92YWx1ZV8xXzA9IFJVTEVfU1RSSU5HCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo4MjM2OjQ6IChsdl92YWx1ZV8xXzA9IFJVTEVfU1RSSU5HICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjgyMzc6NTogbHZfdmFsdWVfMV8wPSBSVUxFX1NUUklORwogICAgICAgICAgICAgewogICAgICAgICAgICAgbHZfdmFsdWVfMV8wPShUb2tlbiltYXRjaChpbnB1dCxSVUxFX1NUUklORyxGT0xMT1dfMik7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OwogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CkBAIC0yMTE2OCw3ICsyMjM2Miw3IEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAiZW50cnlSdWxlWFR5cGVMaXRlcmFsIgotICAgIC8vIEludGVybmFsRGF0YURTTC5nOjc4MTg6MTogZW50cnlSdWxlWFR5cGVMaXRlcmFsIHJldHVybnMgW0VPYmplY3QgY3VycmVudD1udWxsXSA6IGl2X3J1bGVYVHlwZUxpdGVyYWw9IHJ1bGVYVHlwZUxpdGVyYWwgRU9GIDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo4MjU3OjE6IGVudHJ5UnVsZVhUeXBlTGl0ZXJhbCByZXR1cm5zIFtFT2JqZWN0IGN1cnJlbnQ9bnVsbF0gOiBpdl9ydWxlWFR5cGVMaXRlcmFsPSBydWxlWFR5cGVMaXRlcmFsIEVPRiA7CiAgICAgcHVibGljIGZpbmFsIEVPYmplY3QgZW50cnlSdWxlWFR5cGVMaXRlcmFsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKICAgICAgICAgRU9iamVjdCBjdXJyZW50ID0gbnVsbDsKIApAQCAtMjExNzYsOCArMjIzNzAsOCBAQAogCiAKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjc4MTg6NTM6IChpdl9ydWxlWFR5cGVMaXRlcmFsPSBydWxlWFR5cGVMaXRlcmFsIEVPRiApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo3ODE5OjI6IGl2X3J1bGVYVHlwZUxpdGVyYWw9IHJ1bGVYVHlwZUxpdGVyYWwgRU9GCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo4MjU3OjUzOiAoaXZfcnVsZVhUeXBlTGl0ZXJhbD0gcnVsZVhUeXBlTGl0ZXJhbCBFT0YgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6ODI1ODoyOiBpdl9ydWxlWFR5cGVMaXRlcmFsPSBydWxlWFR5cGVMaXRlcmFsIEVPRgogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBuZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0WFR5cGVMaXRlcmFsUnVsZSgpKTsgCkBAIC0yMTIwOCw3ICsyMjQwMiw3IEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZVhUeXBlTGl0ZXJhbCIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo3ODI1OjE6IHJ1bGVYVHlwZUxpdGVyYWwgcmV0dXJucyBbRU9iamVjdCBjdXJyZW50PW51bGxdIDogKCAoKSBvdGhlcmx2XzE9ICd0eXBlb2YnIG90aGVybHZfMj0gJygnICggKCBydWxlUXVhbGlmaWVkTmFtZSApICkgKCAobHZfYXJyYXlEaW1lbnNpb25zXzRfMD0gcnVsZUFycmF5QnJhY2tldHMgKSApKiBvdGhlcmx2XzU9ICcpJyApIDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo4MjY0OjE6IHJ1bGVYVHlwZUxpdGVyYWwgcmV0dXJucyBbRU9iamVjdCBjdXJyZW50PW51bGxdIDogKCAoKSBvdGhlcmx2XzE9ICd0eXBlb2YnIG90aGVybHZfMj0gJygnICggKCBydWxlUXVhbGlmaWVkTmFtZSApICkgKCAobHZfYXJyYXlEaW1lbnNpb25zXzRfMD0gcnVsZUFycmF5QnJhY2tldHMgKSApKiBvdGhlcmx2XzU9ICcpJyApIDsKICAgICBwdWJsaWMgZmluYWwgRU9iamVjdCBydWxlWFR5cGVMaXRlcmFsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKICAgICAgICAgRU9iamVjdCBjdXJyZW50ID0gbnVsbDsKIApAQCAtMjEyMjIsMTQgKzIyNDE2LDE0IEBACiAgICAgICAgIAllbnRlclJ1bGUoKTsKIAogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NzgzMToyOiAoICggKCkgb3RoZXJsdl8xPSAndHlwZW9mJyBvdGhlcmx2XzI9ICcoJyAoICggcnVsZVF1YWxpZmllZE5hbWUgKSApICggKGx2X2FycmF5RGltZW5zaW9uc180XzA9IHJ1bGVBcnJheUJyYWNrZXRzICkgKSogb3RoZXJsdl81PSAnKScgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo3ODMyOjI6ICggKCkgb3RoZXJsdl8xPSAndHlwZW9mJyBvdGhlcmx2XzI9ICcoJyAoICggcnVsZVF1YWxpZmllZE5hbWUgKSApICggKGx2X2FycmF5RGltZW5zaW9uc180XzA9IHJ1bGVBcnJheUJyYWNrZXRzICkgKSogb3RoZXJsdl81PSAnKScgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6ODI3MDoyOiAoICggKCkgb3RoZXJsdl8xPSAndHlwZW9mJyBvdGhlcmx2XzI9ICcoJyAoICggcnVsZVF1YWxpZmllZE5hbWUgKSApICggKGx2X2FycmF5RGltZW5zaW9uc180XzA9IHJ1bGVBcnJheUJyYWNrZXRzICkgKSogb3RoZXJsdl81PSAnKScgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo4MjcxOjI6ICggKCkgb3RoZXJsdl8xPSAndHlwZW9mJyBvdGhlcmx2XzI9ICcoJyAoICggcnVsZVF1YWxpZmllZE5hbWUgKSApICggKGx2X2FycmF5RGltZW5zaW9uc180XzA9IHJ1bGVBcnJheUJyYWNrZXRzICkgKSogb3RoZXJsdl81PSAnKScgKQogICAgICAgICAgICAgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NzgzMjoyOiAoICgpIG90aGVybHZfMT0gJ3R5cGVvZicgb3RoZXJsdl8yPSAnKCcgKCAoIHJ1bGVRdWFsaWZpZWROYW1lICkgKSAoIChsdl9hcnJheURpbWVuc2lvbnNfNF8wPSBydWxlQXJyYXlCcmFja2V0cyApICkqIG90aGVybHZfNT0gJyknICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjc4MzM6MzogKCkgb3RoZXJsdl8xPSAndHlwZW9mJyBvdGhlcmx2XzI9ICcoJyAoICggcnVsZVF1YWxpZmllZE5hbWUgKSApICggKGx2X2FycmF5RGltZW5zaW9uc180XzA9IHJ1bGVBcnJheUJyYWNrZXRzICkgKSogb3RoZXJsdl81PSAnKScKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjgyNzE6MjogKCAoKSBvdGhlcmx2XzE9ICd0eXBlb2YnIG90aGVybHZfMj0gJygnICggKCBydWxlUXVhbGlmaWVkTmFtZSApICkgKCAobHZfYXJyYXlEaW1lbnNpb25zXzRfMD0gcnVsZUFycmF5QnJhY2tldHMgKSApKiBvdGhlcmx2XzU9ICcpJyApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo4MjcyOjM6ICgpIG90aGVybHZfMT0gJ3R5cGVvZicgb3RoZXJsdl8yPSAnKCcgKCAoIHJ1bGVRdWFsaWZpZWROYW1lICkgKSAoIChsdl9hcnJheURpbWVuc2lvbnNfNF8wPSBydWxlQXJyYXlCcmFja2V0cyApICkqIG90aGVybHZfNT0gJyknCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo3ODMzOjM6ICgpCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo3ODM0OjQ6IAorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6ODI3MjozOiAoKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6ODI3Mzo0OiAKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogCkBAIC0yMTI0MSwyMyArMjI0MzUsMjMgQEAKIAogICAgICAgICAgICAgfQogCi0gICAgICAgICAgICBvdGhlcmx2XzE9KFRva2VuKW1hdGNoKGlucHV0LDEyOSxGT0xMT1dfMTAyKTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7CisgICAgICAgICAgICBvdGhlcmx2XzE9KFRva2VuKW1hdGNoKGlucHV0LDEzNixGT0xMT1dfMTE2KTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKIAogICAgICAgICAgICAgICAJCQluZXdMZWFmTm9kZShvdGhlcmx2XzEsIGdyYW1tYXJBY2Nlc3MuZ2V0WFR5cGVMaXRlcmFsQWNjZXNzKCkuZ2V0VHlwZW9mS2V5d29yZF8xKCkpOwogICAgICAgICAgICAgICAJCQogICAgICAgICAgICAgfQotICAgICAgICAgICAgb3RoZXJsdl8yPShUb2tlbiltYXRjaChpbnB1dCw3NCxGT0xMT1dfNCk7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OworICAgICAgICAgICAgb3RoZXJsdl8yPShUb2tlbiltYXRjaChpbnB1dCw4MSxGT0xMT1dfNCk7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OwogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAKICAgICAgICAgICAgICAgCQkJbmV3TGVhZk5vZGUob3RoZXJsdl8yLCBncmFtbWFyQWNjZXNzLmdldFhUeXBlTGl0ZXJhbEFjY2VzcygpLmdldExlZnRQYXJlbnRoZXNpc0tleXdvcmRfMigpKTsKICAgICAgICAgICAgICAgCQkKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjc4NDg6MzogKCAoIHJ1bGVRdWFsaWZpZWROYW1lICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6Nzg0OTo0OiAoIHJ1bGVRdWFsaWZpZWROYW1lICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjgyODc6MzogKCAoIHJ1bGVRdWFsaWZpZWROYW1lICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6ODI4ODo0OiAoIHJ1bGVRdWFsaWZpZWROYW1lICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjc4NDk6NDogKCBydWxlUXVhbGlmaWVkTmFtZSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo3ODUwOjU6IHJ1bGVRdWFsaWZpZWROYW1lCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo4Mjg4OjQ6ICggcnVsZVF1YWxpZmllZE5hbWUgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6ODI4OTo1OiBydWxlUXVhbGlmaWVkTmFtZQogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAKQEAgLTIxMjcxLDcgKzIyNDY1LDcgQEAKICAgICAgICAgICAgICAgCQkJCQluZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0WFR5cGVMaXRlcmFsQWNjZXNzKCkuZ2V0VHlwZUp2bVR5cGVDcm9zc1JlZmVyZW5jZV8zXzAoKSk7CiAgICAgICAgICAgICAgIAkJCQkKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzEyMik7CisgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV18xMzUpOwogICAgICAgICAgICAgcnVsZVF1YWxpZmllZE5hbWUoKTsKIAogICAgICAgICAgICAgc3RhdGUuX2ZzcC0tOwpAQCAtMjEyODcsMzAgKzIyNDgxLDMwIEBACiAKICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6Nzg2NDozOiAoIChsdl9hcnJheURpbWVuc2lvbnNfNF8wPSBydWxlQXJyYXlCcmFja2V0cyApICkqCi0gICAgICAgICAgICBsb29wMTM2OgorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6ODMwMzozOiAoIChsdl9hcnJheURpbWVuc2lvbnNfNF8wPSBydWxlQXJyYXlCcmFja2V0cyApICkqCisgICAgICAgICAgICBsb29wMTQ3OgogICAgICAgICAgICAgZG8gewotICAgICAgICAgICAgICAgIGludCBhbHQxMzY9MjsKLSAgICAgICAgICAgICAgICBpbnQgTEExMzZfMCA9IGlucHV0LkxBKDEpOworICAgICAgICAgICAgICAgIGludCBhbHQxNDc9MjsKKyAgICAgICAgICAgICAgICBpbnQgTEExNDdfMCA9IGlucHV0LkxBKDEpOwogCi0gICAgICAgICAgICAgICAgaWYgKCAoTEExMzZfMD09NzkpICkgewotICAgICAgICAgICAgICAgICAgICBhbHQxMzY9MTsKKyAgICAgICAgICAgICAgICBpZiAoIChMQTE0N18wPT04NikgKSB7CisgICAgICAgICAgICAgICAgICAgIGFsdDE0Nz0xOwogICAgICAgICAgICAgICAgIH0KIAogCi0gICAgICAgICAgICAgICAgc3dpdGNoIChhbHQxMzYpIHsKKyAgICAgICAgICAgICAgICBzd2l0Y2ggKGFsdDE0NykgewogICAgICAgICAgICAgCWNhc2UgMSA6Ci0gICAgICAgICAgICAJICAgIC8vIEludGVybmFsRGF0YURTTC5nOjc4NjU6NDogKGx2X2FycmF5RGltZW5zaW9uc180XzA9IHJ1bGVBcnJheUJyYWNrZXRzICkKKyAgICAgICAgICAgIAkgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6ODMwNDo0OiAobHZfYXJyYXlEaW1lbnNpb25zXzRfMD0gcnVsZUFycmF5QnJhY2tldHMgKQogICAgICAgICAgICAgCSAgICB7Ci0gICAgICAgICAgICAJICAgIC8vIEludGVybmFsRGF0YURTTC5nOjc4NjU6NDogKGx2X2FycmF5RGltZW5zaW9uc180XzA9IHJ1bGVBcnJheUJyYWNrZXRzICkKLSAgICAgICAgICAgIAkgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6Nzg2Njo1OiBsdl9hcnJheURpbWVuc2lvbnNfNF8wPSBydWxlQXJyYXlCcmFja2V0cworICAgICAgICAgICAgCSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo4MzA0OjQ6IChsdl9hcnJheURpbWVuc2lvbnNfNF8wPSBydWxlQXJyYXlCcmFja2V0cyApCisgICAgICAgICAgICAJICAgIC8vIEludGVybmFsRGF0YURTTC5nOjgzMDU6NTogbHZfYXJyYXlEaW1lbnNpb25zXzRfMD0gcnVsZUFycmF5QnJhY2tldHMKICAgICAgICAgICAgIAkgICAgewogICAgICAgICAgICAgCSAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKIAogICAgICAgICAgICAgCSAgICAgIAkJCQkJbmV3Q29tcG9zaXRlTm9kZShncmFtbWFyQWNjZXNzLmdldFhUeXBlTGl0ZXJhbEFjY2VzcygpLmdldEFycmF5RGltZW5zaW9uc0FycmF5QnJhY2tldHNQYXJzZXJSdWxlQ2FsbF80XzAoKSk7CiAgICAgICAgICAgICAJICAgICAgCQkJCQogICAgICAgICAgICAgCSAgICB9Ci0gICAgICAgICAgICAJICAgIHB1c2hGb2xsb3coRk9MTE9XXzEyMik7CisgICAgICAgICAgICAJICAgIHB1c2hGb2xsb3coRk9MTE9XXzEzNSk7CiAgICAgICAgICAgICAJICAgIGx2X2FycmF5RGltZW5zaW9uc180XzA9cnVsZUFycmF5QnJhY2tldHMoKTsKIAogICAgICAgICAgICAgCSAgICBzdGF0ZS5fZnNwLS07CkBAIC0yMTMzNiwxMSArMjI1MzAsMTEgQEAKICAgICAgICAgICAgIAkgICAgYnJlYWs7CiAKICAgICAgICAgICAgIAlkZWZhdWx0IDoKLSAgICAgICAgICAgIAkgICAgYnJlYWsgbG9vcDEzNjsKKyAgICAgICAgICAgIAkgICAgYnJlYWsgbG9vcDE0NzsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9IHdoaWxlICh0cnVlKTsKIAotICAgICAgICAgICAgb3RoZXJsdl81PShUb2tlbiltYXRjaChpbnB1dCw3NixGT0xMT1dfMik7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OworICAgICAgICAgICAgb3RoZXJsdl81PShUb2tlbiltYXRjaChpbnB1dCw4MyxGT0xMT1dfMik7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OwogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAKICAgICAgICAgICAgICAgCQkJbmV3TGVhZk5vZGUob3RoZXJsdl81LCBncmFtbWFyQWNjZXNzLmdldFhUeXBlTGl0ZXJhbEFjY2VzcygpLmdldFJpZ2h0UGFyZW50aGVzaXNLZXl3b3JkXzUoKSk7CkBAIC0yMTM3MSw3ICsyMjU2NSw3IEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAiZW50cnlSdWxlWFRocm93RXhwcmVzc2lvbiIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo3ODkxOjE6IGVudHJ5UnVsZVhUaHJvd0V4cHJlc3Npb24gcmV0dXJucyBbRU9iamVjdCBjdXJyZW50PW51bGxdIDogaXZfcnVsZVhUaHJvd0V4cHJlc3Npb249IHJ1bGVYVGhyb3dFeHByZXNzaW9uIEVPRiA7CisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6ODMzMDoxOiBlbnRyeVJ1bGVYVGhyb3dFeHByZXNzaW9uIHJldHVybnMgW0VPYmplY3QgY3VycmVudD1udWxsXSA6IGl2X3J1bGVYVGhyb3dFeHByZXNzaW9uPSBydWxlWFRocm93RXhwcmVzc2lvbiBFT0YgOwogICAgIHB1YmxpYyBmaW5hbCBFT2JqZWN0IGVudHJ5UnVsZVhUaHJvd0V4cHJlc3Npb24oKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogICAgICAgICBFT2JqZWN0IGN1cnJlbnQgPSBudWxsOwogCkBAIC0yMTM3OSw4ICsyMjU3Myw4IEBACiAKIAogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6Nzg5MTo1NzogKGl2X3J1bGVYVGhyb3dFeHByZXNzaW9uPSBydWxlWFRocm93RXhwcmVzc2lvbiBFT0YgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6Nzg5MjoyOiBpdl9ydWxlWFRocm93RXhwcmVzc2lvbj0gcnVsZVhUaHJvd0V4cHJlc3Npb24gRU9GCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo4MzMwOjU3OiAoaXZfcnVsZVhUaHJvd0V4cHJlc3Npb249IHJ1bGVYVGhyb3dFeHByZXNzaW9uIEVPRiApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo4MzMxOjI6IGl2X3J1bGVYVGhyb3dFeHByZXNzaW9uPSBydWxlWFRocm93RXhwcmVzc2lvbiBFT0YKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgbmV3Q29tcG9zaXRlTm9kZShncmFtbWFyQWNjZXNzLmdldFhUaHJvd0V4cHJlc3Npb25SdWxlKCkpOyAKQEAgLTIxNDExLDcgKzIyNjA1LDcgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlWFRocm93RXhwcmVzc2lvbiIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo3ODk4OjE6IHJ1bGVYVGhyb3dFeHByZXNzaW9uIHJldHVybnMgW0VPYmplY3QgY3VycmVudD1udWxsXSA6ICggKCkgb3RoZXJsdl8xPSAndGhyb3cnICggKGx2X2V4cHJlc3Npb25fMl8wPSBydWxlWEV4cHJlc3Npb24gKSApICkgOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjgzMzc6MTogcnVsZVhUaHJvd0V4cHJlc3Npb24gcmV0dXJucyBbRU9iamVjdCBjdXJyZW50PW51bGxdIDogKCAoKSBvdGhlcmx2XzE9ICd0aHJvdycgKCAobHZfZXhwcmVzc2lvbl8yXzA9IHJ1bGVYRXhwcmVzc2lvbiApICkgKSA7CiAgICAgcHVibGljIGZpbmFsIEVPYmplY3QgcnVsZVhUaHJvd0V4cHJlc3Npb24oKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogICAgICAgICBFT2JqZWN0IGN1cnJlbnQgPSBudWxsOwogCkBAIC0yMTQyMywxNCArMjI2MTcsMTQgQEAKICAgICAgICAgCWVudGVyUnVsZSgpOwogCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo3OTA0OjI6ICggKCAoKSBvdGhlcmx2XzE9ICd0aHJvdycgKCAobHZfZXhwcmVzc2lvbl8yXzA9IHJ1bGVYRXhwcmVzc2lvbiApICkgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo3OTA1OjI6ICggKCkgb3RoZXJsdl8xPSAndGhyb3cnICggKGx2X2V4cHJlc3Npb25fMl8wPSBydWxlWEV4cHJlc3Npb24gKSApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjgzNDM6MjogKCAoICgpIG90aGVybHZfMT0gJ3Rocm93JyAoIChsdl9leHByZXNzaW9uXzJfMD0gcnVsZVhFeHByZXNzaW9uICkgKSApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjgzNDQ6MjogKCAoKSBvdGhlcmx2XzE9ICd0aHJvdycgKCAobHZfZXhwcmVzc2lvbl8yXzA9IHJ1bGVYRXhwcmVzc2lvbiApICkgKQogICAgICAgICAgICAgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NzkwNToyOiAoICgpIG90aGVybHZfMT0gJ3Rocm93JyAoIChsdl9leHByZXNzaW9uXzJfMD0gcnVsZVhFeHByZXNzaW9uICkgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo3OTA2OjM6ICgpIG90aGVybHZfMT0gJ3Rocm93JyAoIChsdl9leHByZXNzaW9uXzJfMD0gcnVsZVhFeHByZXNzaW9uICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6ODM0NDoyOiAoICgpIG90aGVybHZfMT0gJ3Rocm93JyAoIChsdl9leHByZXNzaW9uXzJfMD0gcnVsZVhFeHByZXNzaW9uICkgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo4MzQ1OjM6ICgpIG90aGVybHZfMT0gJ3Rocm93JyAoIChsdl9leHByZXNzaW9uXzJfMD0gcnVsZVhFeHByZXNzaW9uICkgKQogICAgICAgICAgICAgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NzkwNjozOiAoKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NzkwNzo0OiAKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjgzNDU6MzogKCkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjgzNDY6NDogCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKIApAQCAtMjE0NDIsMTcgKzIyNjM2LDE3IEBACiAKICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgb3RoZXJsdl8xPShUb2tlbiltYXRjaChpbnB1dCwxMzAsRk9MTE9XXzY0KTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7CisgICAgICAgICAgICBvdGhlcmx2XzE9KFRva2VuKW1hdGNoKGlucHV0LDEzNyxGT0xMT1dfNzgpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gY3VycmVudDsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogCiAgICAgICAgICAgICAgIAkJCW5ld0xlYWZOb2RlKG90aGVybHZfMSwgZ3JhbW1hckFjY2Vzcy5nZXRYVGhyb3dFeHByZXNzaW9uQWNjZXNzKCkuZ2V0VGhyb3dLZXl3b3JkXzEoKSk7CiAgICAgICAgICAgICAgIAkJCiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo3OTE3OjM6ICggKGx2X2V4cHJlc3Npb25fMl8wPSBydWxlWEV4cHJlc3Npb24gKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo3OTE4OjQ6IChsdl9leHByZXNzaW9uXzJfMD0gcnVsZVhFeHByZXNzaW9uICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjgzNTY6MzogKCAobHZfZXhwcmVzc2lvbl8yXzA9IHJ1bGVYRXhwcmVzc2lvbiApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjgzNTc6NDogKGx2X2V4cHJlc3Npb25fMl8wPSBydWxlWEV4cHJlc3Npb24gKQogICAgICAgICAgICAgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NzkxODo0OiAobHZfZXhwcmVzc2lvbl8yXzA9IHJ1bGVYRXhwcmVzc2lvbiApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo3OTE5OjU6IGx2X2V4cHJlc3Npb25fMl8wPSBydWxlWEV4cHJlc3Npb24KKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjgzNTc6NDogKGx2X2V4cHJlc3Npb25fMl8wPSBydWxlWEV4cHJlc3Npb24gKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6ODM1ODo1OiBsdl9leHByZXNzaW9uXzJfMD0gcnVsZVhFeHByZXNzaW9uCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKIApAQCAtMjE1MDgsNyArMjI3MDIsNyBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgImVudHJ5UnVsZVhSZXR1cm5FeHByZXNzaW9uIgotICAgIC8vIEludGVybmFsRGF0YURTTC5nOjc5NDA6MTogZW50cnlSdWxlWFJldHVybkV4cHJlc3Npb24gcmV0dXJucyBbRU9iamVjdCBjdXJyZW50PW51bGxdIDogaXZfcnVsZVhSZXR1cm5FeHByZXNzaW9uPSBydWxlWFJldHVybkV4cHJlc3Npb24gRU9GIDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo4Mzc5OjE6IGVudHJ5UnVsZVhSZXR1cm5FeHByZXNzaW9uIHJldHVybnMgW0VPYmplY3QgY3VycmVudD1udWxsXSA6IGl2X3J1bGVYUmV0dXJuRXhwcmVzc2lvbj0gcnVsZVhSZXR1cm5FeHByZXNzaW9uIEVPRiA7CiAgICAgcHVibGljIGZpbmFsIEVPYmplY3QgZW50cnlSdWxlWFJldHVybkV4cHJlc3Npb24oKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogICAgICAgICBFT2JqZWN0IGN1cnJlbnQgPSBudWxsOwogCkBAIC0yMTUxNiw4ICsyMjcxMCw4IEBACiAKIAogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6Nzk0MDo1ODogKGl2X3J1bGVYUmV0dXJuRXhwcmVzc2lvbj0gcnVsZVhSZXR1cm5FeHByZXNzaW9uIEVPRiApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo3OTQxOjI6IGl2X3J1bGVYUmV0dXJuRXhwcmVzc2lvbj0gcnVsZVhSZXR1cm5FeHByZXNzaW9uIEVPRgorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6ODM3OTo1ODogKGl2X3J1bGVYUmV0dXJuRXhwcmVzc2lvbj0gcnVsZVhSZXR1cm5FeHByZXNzaW9uIEVPRiApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo4MzgwOjI6IGl2X3J1bGVYUmV0dXJuRXhwcmVzc2lvbj0gcnVsZVhSZXR1cm5FeHByZXNzaW9uIEVPRgogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBuZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0WFJldHVybkV4cHJlc3Npb25SdWxlKCkpOyAKQEAgLTIxNTQ4LDcgKzIyNzQyLDcgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlWFJldHVybkV4cHJlc3Npb24iCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6Nzk0NzoxOiBydWxlWFJldHVybkV4cHJlc3Npb24gcmV0dXJucyBbRU9iamVjdCBjdXJyZW50PW51bGxdIDogKCAoKSBvdGhlcmx2XzE9ICdyZXR1cm4nICggKCAnZXh0ZW5kcycgfCAnc3RhdGljJyB8ICdpbXBvcnQnIHwgJ2V4dGVuc2lvbicgfCAnIScgfCAnLScgfCAnKycgfCAnbmV3JyB8ICd7JyB8ICdzd2l0Y2gnIHwgJ3N5bmNocm9uaXplZCcgfCAnPCcgfCAnc3VwZXInIHwgJyMnIHwgJ1snIHwgJ2ZhbHNlJyB8ICd0cnVlJyB8ICdudWxsJyB8ICd0eXBlb2YnIHwgJ2lmJyB8ICdmb3InIHwgJ3doaWxlJyB8ICdkbycgfCAndGhyb3cnIHwgJ3JldHVybicgfCAndHJ5JyB8ICcoJyB8IFJVTEVfSUQgfCBSVUxFX0hFWCB8IFJVTEVfSU5UIHwgUlVMRV9ERUNJTUFMIHwgUlVMRV9TVFJJTkcgKT0+IChsdl9leHByZXNzaW9uXzJfMD0gcnVsZVhFeHByZXNzaW9uICkgKT8gKSA7CisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6ODM4NjoxOiBydWxlWFJldHVybkV4cHJlc3Npb24gcmV0dXJucyBbRU9iamVjdCBjdXJyZW50PW51bGxdIDogKCAoKSBvdGhlcmx2XzE9ICdyZXR1cm4nICggKCAnZXh0ZW5kcycgfCAnc3RhdGljJyB8ICdpbXBvcnQnIHwgJ2V4dGVuc2lvbicgfCAnIScgfCAnLScgfCAnKycgfCAnbmV3JyB8ICd7JyB8ICdzd2l0Y2gnIHwgJ3N5bmNocm9uaXplZCcgfCAnPCcgfCAnc3VwZXInIHwgJyMnIHwgJ1snIHwgJ2ZhbHNlJyB8ICd0cnVlJyB8ICdudWxsJyB8ICd0eXBlb2YnIHwgJ2lmJyB8ICdmb3InIHwgJ3doaWxlJyB8ICdkbycgfCAndGhyb3cnIHwgJ3JldHVybicgfCAndHJ5JyB8ICcoJyB8IFJVTEVfSUQgfCBSVUxFX0hFWCB8IFJVTEVfSU5UIHwgUlVMRV9ERUNJTUFMIHwgUlVMRV9TVFJJTkcgKT0+IChsdl9leHByZXNzaW9uXzJfMD0gcnVsZVhFeHByZXNzaW9uICkgKT8gKSA7CiAgICAgcHVibGljIGZpbmFsIEVPYmplY3QgcnVsZVhSZXR1cm5FeHByZXNzaW9uKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKICAgICAgICAgRU9iamVjdCBjdXJyZW50ID0gbnVsbDsKIApAQCAtMjE1NjAsMTQgKzIyNzU0LDE0IEBACiAgICAgICAgIAllbnRlclJ1bGUoKTsKIAogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6Nzk1MzoyOiAoICggKCkgb3RoZXJsdl8xPSAncmV0dXJuJyAoICggJ2V4dGVuZHMnIHwgJ3N0YXRpYycgfCAnaW1wb3J0JyB8ICdleHRlbnNpb24nIHwgJyEnIHwgJy0nIHwgJysnIHwgJ25ldycgfCAneycgfCAnc3dpdGNoJyB8ICdzeW5jaHJvbml6ZWQnIHwgJzwnIHwgJ3N1cGVyJyB8ICcjJyB8ICdbJyB8ICdmYWxzZScgfCAndHJ1ZScgfCAnbnVsbCcgfCAndHlwZW9mJyB8ICdpZicgfCAnZm9yJyB8ICd3aGlsZScgfCAnZG8nIHwgJ3Rocm93JyB8ICdyZXR1cm4nIHwgJ3RyeScgfCAnKCcgfCBSVUxFX0lEIHwgUlVMRV9IRVggfCBSVUxFX0lOVCB8IFJVTEVfREVDSU1BTCB8IFJVTEVfU1RSSU5HICk9PiAobHZfZXhwcmVzc2lvbl8yXzA9IHJ1bGVYRXhwcmVzc2lvbiApICk/ICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6Nzk1NDoyOiAoICgpIG90aGVybHZfMT0gJ3JldHVybicgKCAoICdleHRlbmRzJyB8ICdzdGF0aWMnIHwgJ2ltcG9ydCcgfCAnZXh0ZW5zaW9uJyB8ICchJyB8ICctJyB8ICcrJyB8ICduZXcnIHwgJ3snIHwgJ3N3aXRjaCcgfCAnc3luY2hyb25pemVkJyB8ICc8JyB8ICdzdXBlcicgfCAnIycgfCAnWycgfCAnZmFsc2UnIHwgJ3RydWUnIHwgJ251bGwnIHwgJ3R5cGVvZicgfCAnaWYnIHwgJ2ZvcicgfCAnd2hpbGUnIHwgJ2RvJyB8ICd0aHJvdycgfCAncmV0dXJuJyB8ICd0cnknIHwgJygnIHwgUlVMRV9JRCB8IFJVTEVfSEVYIHwgUlVMRV9JTlQgfCBSVUxFX0RFQ0lNQUwgfCBSVUxFX1NUUklORyApPT4gKGx2X2V4cHJlc3Npb25fMl8wPSBydWxlWEV4cHJlc3Npb24gKSApPyApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo4MzkyOjI6ICggKCAoKSBvdGhlcmx2XzE9ICdyZXR1cm4nICggKCAnZXh0ZW5kcycgfCAnc3RhdGljJyB8ICdpbXBvcnQnIHwgJ2V4dGVuc2lvbicgfCAnIScgfCAnLScgfCAnKycgfCAnbmV3JyB8ICd7JyB8ICdzd2l0Y2gnIHwgJ3N5bmNocm9uaXplZCcgfCAnPCcgfCAnc3VwZXInIHwgJyMnIHwgJ1snIHwgJ2ZhbHNlJyB8ICd0cnVlJyB8ICdudWxsJyB8ICd0eXBlb2YnIHwgJ2lmJyB8ICdmb3InIHwgJ3doaWxlJyB8ICdkbycgfCAndGhyb3cnIHwgJ3JldHVybicgfCAndHJ5JyB8ICcoJyB8IFJVTEVfSUQgfCBSVUxFX0hFWCB8IFJVTEVfSU5UIHwgUlVMRV9ERUNJTUFMIHwgUlVMRV9TVFJJTkcgKT0+IChsdl9leHByZXNzaW9uXzJfMD0gcnVsZVhFeHByZXNzaW9uICkgKT8gKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo4MzkzOjI6ICggKCkgb3RoZXJsdl8xPSAncmV0dXJuJyAoICggJ2V4dGVuZHMnIHwgJ3N0YXRpYycgfCAnaW1wb3J0JyB8ICdleHRlbnNpb24nIHwgJyEnIHwgJy0nIHwgJysnIHwgJ25ldycgfCAneycgfCAnc3dpdGNoJyB8ICdzeW5jaHJvbml6ZWQnIHwgJzwnIHwgJ3N1cGVyJyB8ICcjJyB8ICdbJyB8ICdmYWxzZScgfCAndHJ1ZScgfCAnbnVsbCcgfCAndHlwZW9mJyB8ICdpZicgfCAnZm9yJyB8ICd3aGlsZScgfCAnZG8nIHwgJ3Rocm93JyB8ICdyZXR1cm4nIHwgJ3RyeScgfCAnKCcgfCBSVUxFX0lEIHwgUlVMRV9IRVggfCBSVUxFX0lOVCB8IFJVTEVfREVDSU1BTCB8IFJVTEVfU1RSSU5HICk9PiAobHZfZXhwcmVzc2lvbl8yXzA9IHJ1bGVYRXhwcmVzc2lvbiApICk/ICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjc5NTQ6MjogKCAoKSBvdGhlcmx2XzE9ICdyZXR1cm4nICggKCAnZXh0ZW5kcycgfCAnc3RhdGljJyB8ICdpbXBvcnQnIHwgJ2V4dGVuc2lvbicgfCAnIScgfCAnLScgfCAnKycgfCAnbmV3JyB8ICd7JyB8ICdzd2l0Y2gnIHwgJ3N5bmNocm9uaXplZCcgfCAnPCcgfCAnc3VwZXInIHwgJyMnIHwgJ1snIHwgJ2ZhbHNlJyB8ICd0cnVlJyB8ICdudWxsJyB8ICd0eXBlb2YnIHwgJ2lmJyB8ICdmb3InIHwgJ3doaWxlJyB8ICdkbycgfCAndGhyb3cnIHwgJ3JldHVybicgfCAndHJ5JyB8ICcoJyB8IFJVTEVfSUQgfCBSVUxFX0hFWCB8IFJVTEVfSU5UIHwgUlVMRV9ERUNJTUFMIHwgUlVMRV9TVFJJTkcgKT0+IChsdl9leHByZXNzaW9uXzJfMD0gcnVsZVhFeHByZXNzaW9uICkgKT8gKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6Nzk1NTozOiAoKSBvdGhlcmx2XzE9ICdyZXR1cm4nICggKCAnZXh0ZW5kcycgfCAnc3RhdGljJyB8ICdpbXBvcnQnIHwgJ2V4dGVuc2lvbicgfCAnIScgfCAnLScgfCAnKycgfCAnbmV3JyB8ICd7JyB8ICdzd2l0Y2gnIHwgJ3N5bmNocm9uaXplZCcgfCAnPCcgfCAnc3VwZXInIHwgJyMnIHwgJ1snIHwgJ2ZhbHNlJyB8ICd0cnVlJyB8ICdudWxsJyB8ICd0eXBlb2YnIHwgJ2lmJyB8ICdmb3InIHwgJ3doaWxlJyB8ICdkbycgfCAndGhyb3cnIHwgJ3JldHVybicgfCAndHJ5JyB8ICcoJyB8IFJVTEVfSUQgfCBSVUxFX0hFWCB8IFJVTEVfSU5UIHwgUlVMRV9ERUNJTUFMIHwgUlVMRV9TVFJJTkcgKT0+IChsdl9leHByZXNzaW9uXzJfMD0gcnVsZVhFeHByZXNzaW9uICkgKT8KKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjgzOTM6MjogKCAoKSBvdGhlcmx2XzE9ICdyZXR1cm4nICggKCAnZXh0ZW5kcycgfCAnc3RhdGljJyB8ICdpbXBvcnQnIHwgJ2V4dGVuc2lvbicgfCAnIScgfCAnLScgfCAnKycgfCAnbmV3JyB8ICd7JyB8ICdzd2l0Y2gnIHwgJ3N5bmNocm9uaXplZCcgfCAnPCcgfCAnc3VwZXInIHwgJyMnIHwgJ1snIHwgJ2ZhbHNlJyB8ICd0cnVlJyB8ICdudWxsJyB8ICd0eXBlb2YnIHwgJ2lmJyB8ICdmb3InIHwgJ3doaWxlJyB8ICdkbycgfCAndGhyb3cnIHwgJ3JldHVybicgfCAndHJ5JyB8ICcoJyB8IFJVTEVfSUQgfCBSVUxFX0hFWCB8IFJVTEVfSU5UIHwgUlVMRV9ERUNJTUFMIHwgUlVMRV9TVFJJTkcgKT0+IChsdl9leHByZXNzaW9uXzJfMD0gcnVsZVhFeHByZXNzaW9uICkgKT8gKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6ODM5NDozOiAoKSBvdGhlcmx2XzE9ICdyZXR1cm4nICggKCAnZXh0ZW5kcycgfCAnc3RhdGljJyB8ICdpbXBvcnQnIHwgJ2V4dGVuc2lvbicgfCAnIScgfCAnLScgfCAnKycgfCAnbmV3JyB8ICd7JyB8ICdzd2l0Y2gnIHwgJ3N5bmNocm9uaXplZCcgfCAnPCcgfCAnc3VwZXInIHwgJyMnIHwgJ1snIHwgJ2ZhbHNlJyB8ICd0cnVlJyB8ICdudWxsJyB8ICd0eXBlb2YnIHwgJ2lmJyB8ICdmb3InIHwgJ3doaWxlJyB8ICdkbycgfCAndGhyb3cnIHwgJ3JldHVybicgfCAndHJ5JyB8ICcoJyB8IFJVTEVfSUQgfCBSVUxFX0hFWCB8IFJVTEVfSU5UIHwgUlVMRV9ERUNJTUFMIHwgUlVMRV9TVFJJTkcgKT0+IChsdl9leHByZXNzaW9uXzJfMD0gcnVsZVhFeHByZXNzaW9uICkgKT8KICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjc5NTU6MzogKCkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjc5NTY6NDogCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo4Mzk0OjM6ICgpCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo4Mzk1OjQ6IAogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAKQEAgLTIxNTc5LDIxICsyMjc3MywyMSBAQAogCiAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgIG90aGVybHZfMT0oVG9rZW4pbWF0Y2goaW5wdXQsMTMxLEZPTExPV18xMjMpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gY3VycmVudDsKKyAgICAgICAgICAgIG90aGVybHZfMT0oVG9rZW4pbWF0Y2goaW5wdXQsMTM4LEZPTExPV18xMzYpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gY3VycmVudDsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogCiAgICAgICAgICAgICAgIAkJCW5ld0xlYWZOb2RlKG90aGVybHZfMSwgZ3JhbW1hckFjY2Vzcy5nZXRYUmV0dXJuRXhwcmVzc2lvbkFjY2VzcygpLmdldFJldHVybktleXdvcmRfMSgpKTsKICAgICAgICAgICAgICAgCQkKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjc5NjY6MzogKCAoICdleHRlbmRzJyB8ICdzdGF0aWMnIHwgJ2ltcG9ydCcgfCAnZXh0ZW5zaW9uJyB8ICchJyB8ICctJyB8ICcrJyB8ICduZXcnIHwgJ3snIHwgJ3N3aXRjaCcgfCAnc3luY2hyb25pemVkJyB8ICc8JyB8ICdzdXBlcicgfCAnIycgfCAnWycgfCAnZmFsc2UnIHwgJ3RydWUnIHwgJ251bGwnIHwgJ3R5cGVvZicgfCAnaWYnIHwgJ2ZvcicgfCAnd2hpbGUnIHwgJ2RvJyB8ICd0aHJvdycgfCAncmV0dXJuJyB8ICd0cnknIHwgJygnIHwgUlVMRV9JRCB8IFJVTEVfSEVYIHwgUlVMRV9JTlQgfCBSVUxFX0RFQ0lNQUwgfCBSVUxFX1NUUklORyApPT4gKGx2X2V4cHJlc3Npb25fMl8wPSBydWxlWEV4cHJlc3Npb24gKSApPwotICAgICAgICAgICAgaW50IGFsdDEzNz0yOwotICAgICAgICAgICAgYWx0MTM3ID0gZGZhMTM3LnByZWRpY3QoaW5wdXQpOwotICAgICAgICAgICAgc3dpdGNoIChhbHQxMzcpIHsKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjg0MDU6MzogKCAoICdleHRlbmRzJyB8ICdzdGF0aWMnIHwgJ2ltcG9ydCcgfCAnZXh0ZW5zaW9uJyB8ICchJyB8ICctJyB8ICcrJyB8ICduZXcnIHwgJ3snIHwgJ3N3aXRjaCcgfCAnc3luY2hyb25pemVkJyB8ICc8JyB8ICdzdXBlcicgfCAnIycgfCAnWycgfCAnZmFsc2UnIHwgJ3RydWUnIHwgJ251bGwnIHwgJ3R5cGVvZicgfCAnaWYnIHwgJ2ZvcicgfCAnd2hpbGUnIHwgJ2RvJyB8ICd0aHJvdycgfCAncmV0dXJuJyB8ICd0cnknIHwgJygnIHwgUlVMRV9JRCB8IFJVTEVfSEVYIHwgUlVMRV9JTlQgfCBSVUxFX0RFQ0lNQUwgfCBSVUxFX1NUUklORyApPT4gKGx2X2V4cHJlc3Npb25fMl8wPSBydWxlWEV4cHJlc3Npb24gKSApPworICAgICAgICAgICAgaW50IGFsdDE0OD0yOworICAgICAgICAgICAgYWx0MTQ4ID0gZGZhMTQ4LnByZWRpY3QoaW5wdXQpOworICAgICAgICAgICAgc3dpdGNoIChhbHQxNDgpIHsKICAgICAgICAgICAgICAgICBjYXNlIDEgOgotICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo3OTY3OjQ6ICggJ2V4dGVuZHMnIHwgJ3N0YXRpYycgfCAnaW1wb3J0JyB8ICdleHRlbnNpb24nIHwgJyEnIHwgJy0nIHwgJysnIHwgJ25ldycgfCAneycgfCAnc3dpdGNoJyB8ICdzeW5jaHJvbml6ZWQnIHwgJzwnIHwgJ3N1cGVyJyB8ICcjJyB8ICdbJyB8ICdmYWxzZScgfCAndHJ1ZScgfCAnbnVsbCcgfCAndHlwZW9mJyB8ICdpZicgfCAnZm9yJyB8ICd3aGlsZScgfCAnZG8nIHwgJ3Rocm93JyB8ICdyZXR1cm4nIHwgJ3RyeScgfCAnKCcgfCBSVUxFX0lEIHwgUlVMRV9IRVggfCBSVUxFX0lOVCB8IFJVTEVfREVDSU1BTCB8IFJVTEVfU1RSSU5HICk9PiAobHZfZXhwcmVzc2lvbl8yXzA9IHJ1bGVYRXhwcmVzc2lvbiApCisgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjg0MDY6NDogKCAnZXh0ZW5kcycgfCAnc3RhdGljJyB8ICdpbXBvcnQnIHwgJ2V4dGVuc2lvbicgfCAnIScgfCAnLScgfCAnKycgfCAnbmV3JyB8ICd7JyB8ICdzd2l0Y2gnIHwgJ3N5bmNocm9uaXplZCcgfCAnPCcgfCAnc3VwZXInIHwgJyMnIHwgJ1snIHwgJ2ZhbHNlJyB8ICd0cnVlJyB8ICdudWxsJyB8ICd0eXBlb2YnIHwgJ2lmJyB8ICdmb3InIHwgJ3doaWxlJyB8ICdkbycgfCAndGhyb3cnIHwgJ3JldHVybicgfCAndHJ5JyB8ICcoJyB8IFJVTEVfSUQgfCBSVUxFX0hFWCB8IFJVTEVfSU5UIHwgUlVMRV9ERUNJTUFMIHwgUlVMRV9TVFJJTkcgKT0+IChsdl9leHByZXNzaW9uXzJfMD0gcnVsZVhFeHByZXNzaW9uICkKICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo3OTY4OjQ6IChsdl9leHByZXNzaW9uXzJfMD0gcnVsZVhFeHByZXNzaW9uICkKLSAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6Nzk2OTo1OiBsdl9leHByZXNzaW9uXzJfMD0gcnVsZVhFeHByZXNzaW9uCisgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjg0MDc6NDogKGx2X2V4cHJlc3Npb25fMl8wPSBydWxlWEV4cHJlc3Npb24gKQorICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo4NDA4OjU6IGx2X2V4cHJlc3Npb25fMl8wPSBydWxlWEV4cHJlc3Npb24KICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKIApAQCAtMjE2NTIsNyArMjI4NDYsNyBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgImVudHJ5UnVsZVhUcnlDYXRjaEZpbmFsbHlFeHByZXNzaW9uIgotICAgIC8vIEludGVybmFsRGF0YURTTC5nOjc5OTA6MTogZW50cnlSdWxlWFRyeUNhdGNoRmluYWxseUV4cHJlc3Npb24gcmV0dXJucyBbRU9iamVjdCBjdXJyZW50PW51bGxdIDogaXZfcnVsZVhUcnlDYXRjaEZpbmFsbHlFeHByZXNzaW9uPSBydWxlWFRyeUNhdGNoRmluYWxseUV4cHJlc3Npb24gRU9GIDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo4NDI5OjE6IGVudHJ5UnVsZVhUcnlDYXRjaEZpbmFsbHlFeHByZXNzaW9uIHJldHVybnMgW0VPYmplY3QgY3VycmVudD1udWxsXSA6IGl2X3J1bGVYVHJ5Q2F0Y2hGaW5hbGx5RXhwcmVzc2lvbj0gcnVsZVhUcnlDYXRjaEZpbmFsbHlFeHByZXNzaW9uIEVPRiA7CiAgICAgcHVibGljIGZpbmFsIEVPYmplY3QgZW50cnlSdWxlWFRyeUNhdGNoRmluYWxseUV4cHJlc3Npb24oKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogICAgICAgICBFT2JqZWN0IGN1cnJlbnQgPSBudWxsOwogCkBAIC0yMTY2MCw4ICsyMjg1NCw4IEBACiAKIAogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6Nzk5MDo2NzogKGl2X3J1bGVYVHJ5Q2F0Y2hGaW5hbGx5RXhwcmVzc2lvbj0gcnVsZVhUcnlDYXRjaEZpbmFsbHlFeHByZXNzaW9uIEVPRiApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo3OTkxOjI6IGl2X3J1bGVYVHJ5Q2F0Y2hGaW5hbGx5RXhwcmVzc2lvbj0gcnVsZVhUcnlDYXRjaEZpbmFsbHlFeHByZXNzaW9uIEVPRgorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6ODQyOTo2NzogKGl2X3J1bGVYVHJ5Q2F0Y2hGaW5hbGx5RXhwcmVzc2lvbj0gcnVsZVhUcnlDYXRjaEZpbmFsbHlFeHByZXNzaW9uIEVPRiApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo4NDMwOjI6IGl2X3J1bGVYVHJ5Q2F0Y2hGaW5hbGx5RXhwcmVzc2lvbj0gcnVsZVhUcnlDYXRjaEZpbmFsbHlFeHByZXNzaW9uIEVPRgogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBuZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0WFRyeUNhdGNoRmluYWxseUV4cHJlc3Npb25SdWxlKCkpOyAKQEAgLTIxNjkyLDcgKzIyODg2LDcgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlWFRyeUNhdGNoRmluYWxseUV4cHJlc3Npb24iCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6Nzk5NzoxOiBydWxlWFRyeUNhdGNoRmluYWxseUV4cHJlc3Npb24gcmV0dXJucyBbRU9iamVjdCBjdXJyZW50PW51bGxdIDogKCAoKSBvdGhlcmx2XzE9ICd0cnknICggKGx2X2V4cHJlc3Npb25fMl8wPSBydWxlWEV4cHJlc3Npb24gKSApICggKCAoICggJ2NhdGNoJyApPT4gKGx2X2NhdGNoQ2xhdXNlc18zXzA9IHJ1bGVYQ2F0Y2hDbGF1c2UgKSApKyAoICggKCAnZmluYWxseScgKT0+b3RoZXJsdl80PSAnZmluYWxseScgKSAoIChsdl9maW5hbGx5RXhwcmVzc2lvbl81XzA9IHJ1bGVYRXhwcmVzc2lvbiApICkgKT8gKSB8IChvdGhlcmx2XzY9ICdmaW5hbGx5JyAoIChsdl9maW5hbGx5RXhwcmVzc2lvbl83XzA9IHJ1bGVYRXhwcmVzc2lvbiApICkgKSApICkgOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjg0MzY6MTogcnVsZVhUcnlDYXRjaEZpbmFsbHlFeHByZXNzaW9uIHJldHVybnMgW0VPYmplY3QgY3VycmVudD1udWxsXSA6ICggKCkgb3RoZXJsdl8xPSAndHJ5JyAoIChsdl9leHByZXNzaW9uXzJfMD0gcnVsZVhFeHByZXNzaW9uICkgKSAoICggKCAoICdjYXRjaCcgKT0+IChsdl9jYXRjaENsYXVzZXNfM18wPSBydWxlWENhdGNoQ2xhdXNlICkgKSsgKCAoICggJ2ZpbmFsbHknICk9Pm90aGVybHZfND0gJ2ZpbmFsbHknICkgKCAobHZfZmluYWxseUV4cHJlc3Npb25fNV8wPSBydWxlWEV4cHJlc3Npb24gKSApICk/ICkgfCAob3RoZXJsdl82PSAnZmluYWxseScgKCAobHZfZmluYWxseUV4cHJlc3Npb25fN18wPSBydWxlWEV4cHJlc3Npb24gKSApICkgKSApIDsKICAgICBwdWJsaWMgZmluYWwgRU9iamVjdCBydWxlWFRyeUNhdGNoRmluYWxseUV4cHJlc3Npb24oKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogICAgICAgICBFT2JqZWN0IGN1cnJlbnQgPSBudWxsOwogCkBAIC0yMTcxMiwxNCArMjI5MDYsMTQgQEAKICAgICAgICAgCWVudGVyUnVsZSgpOwogCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo4MDAzOjI6ICggKCAoKSBvdGhlcmx2XzE9ICd0cnknICggKGx2X2V4cHJlc3Npb25fMl8wPSBydWxlWEV4cHJlc3Npb24gKSApICggKCAoICggJ2NhdGNoJyApPT4gKGx2X2NhdGNoQ2xhdXNlc18zXzA9IHJ1bGVYQ2F0Y2hDbGF1c2UgKSApKyAoICggKCAnZmluYWxseScgKT0+b3RoZXJsdl80PSAnZmluYWxseScgKSAoIChsdl9maW5hbGx5RXhwcmVzc2lvbl81XzA9IHJ1bGVYRXhwcmVzc2lvbiApICkgKT8gKSB8IChvdGhlcmx2XzY9ICdmaW5hbGx5JyAoIChsdl9maW5hbGx5RXhwcmVzc2lvbl83XzA9IHJ1bGVYRXhwcmVzc2lvbiApICkgKSApICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6ODAwNDoyOiAoICgpIG90aGVybHZfMT0gJ3RyeScgKCAobHZfZXhwcmVzc2lvbl8yXzA9IHJ1bGVYRXhwcmVzc2lvbiApICkgKCAoICggKCAnY2F0Y2gnICk9PiAobHZfY2F0Y2hDbGF1c2VzXzNfMD0gcnVsZVhDYXRjaENsYXVzZSApICkrICggKCAoICdmaW5hbGx5JyApPT5vdGhlcmx2XzQ9ICdmaW5hbGx5JyApICggKGx2X2ZpbmFsbHlFeHByZXNzaW9uXzVfMD0gcnVsZVhFeHByZXNzaW9uICkgKSApPyApIHwgKG90aGVybHZfNj0gJ2ZpbmFsbHknICggKGx2X2ZpbmFsbHlFeHByZXNzaW9uXzdfMD0gcnVsZVhFeHByZXNzaW9uICkgKSApICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6ODQ0MjoyOiAoICggKCkgb3RoZXJsdl8xPSAndHJ5JyAoIChsdl9leHByZXNzaW9uXzJfMD0gcnVsZVhFeHByZXNzaW9uICkgKSAoICggKCAoICdjYXRjaCcgKT0+IChsdl9jYXRjaENsYXVzZXNfM18wPSBydWxlWENhdGNoQ2xhdXNlICkgKSsgKCAoICggJ2ZpbmFsbHknICk9Pm90aGVybHZfND0gJ2ZpbmFsbHknICkgKCAobHZfZmluYWxseUV4cHJlc3Npb25fNV8wPSBydWxlWEV4cHJlc3Npb24gKSApICk/ICkgfCAob3RoZXJsdl82PSAnZmluYWxseScgKCAobHZfZmluYWxseUV4cHJlc3Npb25fN18wPSBydWxlWEV4cHJlc3Npb24gKSApICkgKSApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjg0NDM6MjogKCAoKSBvdGhlcmx2XzE9ICd0cnknICggKGx2X2V4cHJlc3Npb25fMl8wPSBydWxlWEV4cHJlc3Npb24gKSApICggKCAoICggJ2NhdGNoJyApPT4gKGx2X2NhdGNoQ2xhdXNlc18zXzA9IHJ1bGVYQ2F0Y2hDbGF1c2UgKSApKyAoICggKCAnZmluYWxseScgKT0+b3RoZXJsdl80PSAnZmluYWxseScgKSAoIChsdl9maW5hbGx5RXhwcmVzc2lvbl81XzA9IHJ1bGVYRXhwcmVzc2lvbiApICkgKT8gKSB8IChvdGhlcmx2XzY9ICdmaW5hbGx5JyAoIChsdl9maW5hbGx5RXhwcmVzc2lvbl83XzA9IHJ1bGVYRXhwcmVzc2lvbiApICkgKSApICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjgwMDQ6MjogKCAoKSBvdGhlcmx2XzE9ICd0cnknICggKGx2X2V4cHJlc3Npb25fMl8wPSBydWxlWEV4cHJlc3Npb24gKSApICggKCAoICggJ2NhdGNoJyApPT4gKGx2X2NhdGNoQ2xhdXNlc18zXzA9IHJ1bGVYQ2F0Y2hDbGF1c2UgKSApKyAoICggKCAnZmluYWxseScgKT0+b3RoZXJsdl80PSAnZmluYWxseScgKSAoIChsdl9maW5hbGx5RXhwcmVzc2lvbl81XzA9IHJ1bGVYRXhwcmVzc2lvbiApICkgKT8gKSB8IChvdGhlcmx2XzY9ICdmaW5hbGx5JyAoIChsdl9maW5hbGx5RXhwcmVzc2lvbl83XzA9IHJ1bGVYRXhwcmVzc2lvbiApICkgKSApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjgwMDU6MzogKCkgb3RoZXJsdl8xPSAndHJ5JyAoIChsdl9leHByZXNzaW9uXzJfMD0gcnVsZVhFeHByZXNzaW9uICkgKSAoICggKCAoICdjYXRjaCcgKT0+IChsdl9jYXRjaENsYXVzZXNfM18wPSBydWxlWENhdGNoQ2xhdXNlICkgKSsgKCAoICggJ2ZpbmFsbHknICk9Pm90aGVybHZfND0gJ2ZpbmFsbHknICkgKCAobHZfZmluYWxseUV4cHJlc3Npb25fNV8wPSBydWxlWEV4cHJlc3Npb24gKSApICk/ICkgfCAob3RoZXJsdl82PSAnZmluYWxseScgKCAobHZfZmluYWxseUV4cHJlc3Npb25fN18wPSBydWxlWEV4cHJlc3Npb24gKSApICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6ODQ0MzoyOiAoICgpIG90aGVybHZfMT0gJ3RyeScgKCAobHZfZXhwcmVzc2lvbl8yXzA9IHJ1bGVYRXhwcmVzc2lvbiApICkgKCAoICggKCAnY2F0Y2gnICk9PiAobHZfY2F0Y2hDbGF1c2VzXzNfMD0gcnVsZVhDYXRjaENsYXVzZSApICkrICggKCAoICdmaW5hbGx5JyApPT5vdGhlcmx2XzQ9ICdmaW5hbGx5JyApICggKGx2X2ZpbmFsbHlFeHByZXNzaW9uXzVfMD0gcnVsZVhFeHByZXNzaW9uICkgKSApPyApIHwgKG90aGVybHZfNj0gJ2ZpbmFsbHknICggKGx2X2ZpbmFsbHlFeHByZXNzaW9uXzdfMD0gcnVsZVhFeHByZXNzaW9uICkgKSApICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6ODQ0NDozOiAoKSBvdGhlcmx2XzE9ICd0cnknICggKGx2X2V4cHJlc3Npb25fMl8wPSBydWxlWEV4cHJlc3Npb24gKSApICggKCAoICggJ2NhdGNoJyApPT4gKGx2X2NhdGNoQ2xhdXNlc18zXzA9IHJ1bGVYQ2F0Y2hDbGF1c2UgKSApKyAoICggKCAnZmluYWxseScgKT0+b3RoZXJsdl80PSAnZmluYWxseScgKSAoIChsdl9maW5hbGx5RXhwcmVzc2lvbl81XzA9IHJ1bGVYRXhwcmVzc2lvbiApICkgKT8gKSB8IChvdGhlcmx2XzY9ICdmaW5hbGx5JyAoIChsdl9maW5hbGx5RXhwcmVzc2lvbl83XzA9IHJ1bGVYRXhwcmVzc2lvbiApICkgKSApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo4MDA1OjM6ICgpCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo4MDA2OjQ6IAorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6ODQ0NDozOiAoKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6ODQ0NTo0OiAKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogCkBAIC0yMTczMSwyNCArMjI5MjUsMjQgQEAKIAogICAgICAgICAgICAgfQogCi0gICAgICAgICAgICBvdGhlcmx2XzE9KFRva2VuKW1hdGNoKGlucHV0LDEzMixGT0xMT1dfNjQpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gY3VycmVudDsKKyAgICAgICAgICAgIG90aGVybHZfMT0oVG9rZW4pbWF0Y2goaW5wdXQsMTM5LEZPTExPV183OCk7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OwogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAKICAgICAgICAgICAgICAgCQkJbmV3TGVhZk5vZGUob3RoZXJsdl8xLCBncmFtbWFyQWNjZXNzLmdldFhUcnlDYXRjaEZpbmFsbHlFeHByZXNzaW9uQWNjZXNzKCkuZ2V0VHJ5S2V5d29yZF8xKCkpOwogICAgICAgICAgICAgICAJCQogICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6ODAxNjozOiAoIChsdl9leHByZXNzaW9uXzJfMD0gcnVsZVhFeHByZXNzaW9uICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6ODAxNzo0OiAobHZfZXhwcmVzc2lvbl8yXzA9IHJ1bGVYRXhwcmVzc2lvbiApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo4NDU1OjM6ICggKGx2X2V4cHJlc3Npb25fMl8wPSBydWxlWEV4cHJlc3Npb24gKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo4NDU2OjQ6IChsdl9leHByZXNzaW9uXzJfMD0gcnVsZVhFeHByZXNzaW9uICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjgwMTc6NDogKGx2X2V4cHJlc3Npb25fMl8wPSBydWxlWEV4cHJlc3Npb24gKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6ODAxODo1OiBsdl9leHByZXNzaW9uXzJfMD0gcnVsZVhFeHByZXNzaW9uCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo4NDU2OjQ6IChsdl9leHByZXNzaW9uXzJfMD0gcnVsZVhFeHByZXNzaW9uICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjg0NTc6NTogbHZfZXhwcmVzc2lvbl8yXzA9IHJ1bGVYRXhwcmVzc2lvbgogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAKICAgICAgICAgICAgICAgCQkJCQluZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0WFRyeUNhdGNoRmluYWxseUV4cHJlc3Npb25BY2Nlc3MoKS5nZXRFeHByZXNzaW9uWEV4cHJlc3Npb25QYXJzZXJSdWxlQ2FsbF8yXzAoKSk7CiAgICAgICAgICAgICAgIAkJCQkKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzEyNCk7CisgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV18xMzcpOwogICAgICAgICAgICAgbHZfZXhwcmVzc2lvbl8yXzA9cnVsZVhFeHByZXNzaW9uKCk7CiAKICAgICAgICAgICAgIHN0YXRlLl9mc3AtLTsKQEAgLTIxNzcyLDYxICsyMjk2Niw2MSBAQAogCiAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjgwMzU6MzogKCAoICggKCAnY2F0Y2gnICk9PiAobHZfY2F0Y2hDbGF1c2VzXzNfMD0gcnVsZVhDYXRjaENsYXVzZSApICkrICggKCAoICdmaW5hbGx5JyApPT5vdGhlcmx2XzQ9ICdmaW5hbGx5JyApICggKGx2X2ZpbmFsbHlFeHByZXNzaW9uXzVfMD0gcnVsZVhFeHByZXNzaW9uICkgKSApPyApIHwgKG90aGVybHZfNj0gJ2ZpbmFsbHknICggKGx2X2ZpbmFsbHlFeHByZXNzaW9uXzdfMD0gcnVsZVhFeHByZXNzaW9uICkgKSApICkKLSAgICAgICAgICAgIGludCBhbHQxNDA9MjsKLSAgICAgICAgICAgIGludCBMQTE0MF8wID0gaW5wdXQuTEEoMSk7CisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo4NDc0OjM6ICggKCAoICggJ2NhdGNoJyApPT4gKGx2X2NhdGNoQ2xhdXNlc18zXzA9IHJ1bGVYQ2F0Y2hDbGF1c2UgKSApKyAoICggKCAnZmluYWxseScgKT0+b3RoZXJsdl80PSAnZmluYWxseScgKSAoIChsdl9maW5hbGx5RXhwcmVzc2lvbl81XzA9IHJ1bGVYRXhwcmVzc2lvbiApICkgKT8gKSB8IChvdGhlcmx2XzY9ICdmaW5hbGx5JyAoIChsdl9maW5hbGx5RXhwcmVzc2lvbl83XzA9IHJ1bGVYRXhwcmVzc2lvbiApICkgKSApCisgICAgICAgICAgICBpbnQgYWx0MTUxPTI7CisgICAgICAgICAgICBpbnQgTEExNTFfMCA9IGlucHV0LkxBKDEpOwogCi0gICAgICAgICAgICBpZiAoIChMQTE0MF8wPT0xMzUpICkgewotICAgICAgICAgICAgICAgIGFsdDE0MD0xOworICAgICAgICAgICAgaWYgKCAoTEExNTFfMD09MTQyKSApIHsKKyAgICAgICAgICAgICAgICBhbHQxNTE9MTsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgaWYgKCAoTEExNDBfMD09MTMzKSApIHsKLSAgICAgICAgICAgICAgICBhbHQxNDA9MjsKKyAgICAgICAgICAgIGVsc2UgaWYgKCAoTEExNTFfMD09MTQwKSApIHsKKyAgICAgICAgICAgICAgICBhbHQxNTE9MjsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgIGlmIChzdGF0ZS5iYWNrdHJhY2tpbmc+MCkge3N0YXRlLmZhaWxlZD10cnVlOyByZXR1cm4gY3VycmVudDt9CiAgICAgICAgICAgICAgICAgTm9WaWFibGVBbHRFeGNlcHRpb24gbnZhZSA9Ci0gICAgICAgICAgICAgICAgICAgIG5ldyBOb1ZpYWJsZUFsdEV4Y2VwdGlvbigiIiwgMTQwLCAwLCBpbnB1dCk7CisgICAgICAgICAgICAgICAgICAgIG5ldyBOb1ZpYWJsZUFsdEV4Y2VwdGlvbigiIiwgMTUxLCAwLCBpbnB1dCk7CiAKICAgICAgICAgICAgICAgICB0aHJvdyBudmFlOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgc3dpdGNoIChhbHQxNDApIHsKKyAgICAgICAgICAgIHN3aXRjaCAoYWx0MTUxKSB7CiAgICAgICAgICAgICAgICAgY2FzZSAxIDoKLSAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6ODAzNjo0OiAoICggKCAnY2F0Y2gnICk9PiAobHZfY2F0Y2hDbGF1c2VzXzNfMD0gcnVsZVhDYXRjaENsYXVzZSApICkrICggKCAoICdmaW5hbGx5JyApPT5vdGhlcmx2XzQ9ICdmaW5hbGx5JyApICggKGx2X2ZpbmFsbHlFeHByZXNzaW9uXzVfMD0gcnVsZVhFeHByZXNzaW9uICkgKSApPyApCisgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjg0NzU6NDogKCAoICggJ2NhdGNoJyApPT4gKGx2X2NhdGNoQ2xhdXNlc18zXzA9IHJ1bGVYQ2F0Y2hDbGF1c2UgKSApKyAoICggKCAnZmluYWxseScgKT0+b3RoZXJsdl80PSAnZmluYWxseScgKSAoIChsdl9maW5hbGx5RXhwcmVzc2lvbl81XzA9IHJ1bGVYRXhwcmVzc2lvbiApICkgKT8gKQogICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjgwMzY6NDogKCAoICggJ2NhdGNoJyApPT4gKGx2X2NhdGNoQ2xhdXNlc18zXzA9IHJ1bGVYQ2F0Y2hDbGF1c2UgKSApKyAoICggKCAnZmluYWxseScgKT0+b3RoZXJsdl80PSAnZmluYWxseScgKSAoIChsdl9maW5hbGx5RXhwcmVzc2lvbl81XzA9IHJ1bGVYRXhwcmVzc2lvbiApICkgKT8gKQotICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo4MDM3OjU6ICggKCAnY2F0Y2gnICk9PiAobHZfY2F0Y2hDbGF1c2VzXzNfMD0gcnVsZVhDYXRjaENsYXVzZSApICkrICggKCAoICdmaW5hbGx5JyApPT5vdGhlcmx2XzQ9ICdmaW5hbGx5JyApICggKGx2X2ZpbmFsbHlFeHByZXNzaW9uXzVfMD0gcnVsZVhFeHByZXNzaW9uICkgKSApPworICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo4NDc1OjQ6ICggKCAoICdjYXRjaCcgKT0+IChsdl9jYXRjaENsYXVzZXNfM18wPSBydWxlWENhdGNoQ2xhdXNlICkgKSsgKCAoICggJ2ZpbmFsbHknICk9Pm90aGVybHZfND0gJ2ZpbmFsbHknICkgKCAobHZfZmluYWxseUV4cHJlc3Npb25fNV8wPSBydWxlWEV4cHJlc3Npb24gKSApICk/ICkKKyAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6ODQ3Njo1OiAoICggJ2NhdGNoJyApPT4gKGx2X2NhdGNoQ2xhdXNlc18zXzA9IHJ1bGVYQ2F0Y2hDbGF1c2UgKSApKyAoICggKCAnZmluYWxseScgKT0+b3RoZXJsdl80PSAnZmluYWxseScgKSAoIChsdl9maW5hbGx5RXhwcmVzc2lvbl81XzA9IHJ1bGVYRXhwcmVzc2lvbiApICkgKT8KICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo4MDM3OjU6ICggKCAnY2F0Y2gnICk9PiAobHZfY2F0Y2hDbGF1c2VzXzNfMD0gcnVsZVhDYXRjaENsYXVzZSApICkrCi0gICAgICAgICAgICAgICAgICAgIGludCBjbnQxMzg9MDsKLSAgICAgICAgICAgICAgICAgICAgbG9vcDEzODoKKyAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6ODQ3Njo1OiAoICggJ2NhdGNoJyApPT4gKGx2X2NhdGNoQ2xhdXNlc18zXzA9IHJ1bGVYQ2F0Y2hDbGF1c2UgKSApKworICAgICAgICAgICAgICAgICAgICBpbnQgY250MTQ5PTA7CisgICAgICAgICAgICAgICAgICAgIGxvb3AxNDk6CiAgICAgICAgICAgICAgICAgICAgIGRvIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGludCBhbHQxMzg9MjsKLSAgICAgICAgICAgICAgICAgICAgICAgIGludCBMQTEzOF8wID0gaW5wdXQuTEEoMSk7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYWx0MTQ5PTI7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgTEExNDlfMCA9IGlucHV0LkxBKDEpOwogCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIChMQTEzOF8wPT0xMzUpICkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBMQTEzOF8yID0gaW5wdXQuTEEoMik7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIChMQTE0OV8wPT0xNDIpICkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBMQTE0OV8yID0gaW5wdXQuTEEoMik7CiAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIChzeW5wcmVkNDRfSW50ZXJuYWxEYXRhRFNMKCkpICkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbHQxMzg9MTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWx0MTQ5PTE7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogCiAKICAgICAgICAgICAgICAgICAgICAgICAgIH0KIAogCi0gICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKGFsdDEzOCkgeworICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChhbHQxNDkpIHsKICAgICAgICAgICAgICAgICAgICAgCWNhc2UgMSA6Ci0gICAgICAgICAgICAgICAgICAgIAkgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6ODAzODo2OiAoICdjYXRjaCcgKT0+IChsdl9jYXRjaENsYXVzZXNfM18wPSBydWxlWENhdGNoQ2xhdXNlICkKKyAgICAgICAgICAgICAgICAgICAgCSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo4NDc3OjY6ICggJ2NhdGNoJyApPT4gKGx2X2NhdGNoQ2xhdXNlc18zXzA9IHJ1bGVYQ2F0Y2hDbGF1c2UgKQogICAgICAgICAgICAgICAgICAgICAJICAgIHsKLSAgICAgICAgICAgICAgICAgICAgCSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo4MDM5OjY6IChsdl9jYXRjaENsYXVzZXNfM18wPSBydWxlWENhdGNoQ2xhdXNlICkKLSAgICAgICAgICAgICAgICAgICAgCSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo4MDQwOjc6IGx2X2NhdGNoQ2xhdXNlc18zXzA9IHJ1bGVYQ2F0Y2hDbGF1c2UKKyAgICAgICAgICAgICAgICAgICAgCSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo4NDc4OjY6IChsdl9jYXRjaENsYXVzZXNfM18wPSBydWxlWENhdGNoQ2xhdXNlICkKKyAgICAgICAgICAgICAgICAgICAgCSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo4NDc5Ojc6IGx2X2NhdGNoQ2xhdXNlc18zXzA9IHJ1bGVYQ2F0Y2hDbGF1c2UKICAgICAgICAgICAgICAgICAgICAgCSAgICB7CiAgICAgICAgICAgICAgICAgICAgIAkgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAKICAgICAgICAgICAgICAgICAgICAgCSAgICAgIAkJCQkJCQluZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0WFRyeUNhdGNoRmluYWxseUV4cHJlc3Npb25BY2Nlc3MoKS5nZXRDYXRjaENsYXVzZXNYQ2F0Y2hDbGF1c2VQYXJzZXJSdWxlQ2FsbF8zXzBfMF8wKCkpOwogICAgICAgICAgICAgICAgICAgICAJICAgICAgCQkJCQkJCiAgICAgICAgICAgICAgICAgICAgIAkgICAgfQotICAgICAgICAgICAgICAgICAgICAJICAgIHB1c2hGb2xsb3coRk9MTE9XXzEyNSk7CisgICAgICAgICAgICAgICAgICAgIAkgICAgcHVzaEZvbGxvdyhGT0xMT1dfMTM4KTsKICAgICAgICAgICAgICAgICAgICAgCSAgICBsdl9jYXRjaENsYXVzZXNfM18wPXJ1bGVYQ2F0Y2hDbGF1c2UoKTsKIAogICAgICAgICAgICAgICAgICAgICAJICAgIHN0YXRlLl9mc3AtLTsKQEAgLTIxODUyLDM0ICsyMzA0NiwzNCBAQAogICAgICAgICAgICAgICAgICAgICAJICAgIGJyZWFrOwogCiAgICAgICAgICAgICAgICAgICAgIAlkZWZhdWx0IDoKLSAgICAgICAgICAgICAgICAgICAgCSAgICBpZiAoIGNudDEzOCA+PSAxICkgYnJlYWsgbG9vcDEzODsKKyAgICAgICAgICAgICAgICAgICAgCSAgICBpZiAoIGNudDE0OSA+PSAxICkgYnJlYWsgbG9vcDE0OTsKICAgICAgICAgICAgICAgICAgICAgCSAgICBpZiAoc3RhdGUuYmFja3RyYWNraW5nPjApIHtzdGF0ZS5mYWlsZWQ9dHJ1ZTsgcmV0dXJuIGN1cnJlbnQ7fQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFYXJseUV4aXRFeGNlcHRpb24gZWVlID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBFYXJseUV4aXRFeGNlcHRpb24oMTM4LCBpbnB1dCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgRWFybHlFeGl0RXhjZXB0aW9uKDE0OSwgaW5wdXQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBlZWU7CiAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBjbnQxMzgrKzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNudDE0OSsrOwogICAgICAgICAgICAgICAgICAgICB9IHdoaWxlICh0cnVlKTsKIAotICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo4MDU3OjU6ICggKCAoICdmaW5hbGx5JyApPT5vdGhlcmx2XzQ9ICdmaW5hbGx5JyApICggKGx2X2ZpbmFsbHlFeHByZXNzaW9uXzVfMD0gcnVsZVhFeHByZXNzaW9uICkgKSApPwotICAgICAgICAgICAgICAgICAgICBpbnQgYWx0MTM5PTI7Ci0gICAgICAgICAgICAgICAgICAgIGludCBMQTEzOV8wID0gaW5wdXQuTEEoMSk7CisgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjg0OTY6NTogKCAoICggJ2ZpbmFsbHknICk9Pm90aGVybHZfND0gJ2ZpbmFsbHknICkgKCAobHZfZmluYWxseUV4cHJlc3Npb25fNV8wPSBydWxlWEV4cHJlc3Npb24gKSApICk/CisgICAgICAgICAgICAgICAgICAgIGludCBhbHQxNTA9MjsKKyAgICAgICAgICAgICAgICAgICAgaW50IExBMTUwXzAgPSBpbnB1dC5MQSgxKTsKIAotICAgICAgICAgICAgICAgICAgICBpZiAoIChMQTEzOV8wPT0xMzMpICkgewotICAgICAgICAgICAgICAgICAgICAgICAgaW50IExBMTM5XzEgPSBpbnB1dC5MQSgyKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCAoTEExNTBfMD09MTQwKSApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBMQTE1MF8xID0gaW5wdXQuTEEoMik7CiAKICAgICAgICAgICAgICAgICAgICAgICAgIGlmICggKHN5bnByZWQ0NV9JbnRlcm5hbERhdGFEU0woKSkgKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYWx0MTM5PTE7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWx0MTUwPTE7CiAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChhbHQxMzkpIHsKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChhbHQxNTApIHsKICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMSA6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6ODA1ODo2OiAoICggJ2ZpbmFsbHknICk9Pm90aGVybHZfND0gJ2ZpbmFsbHknICkgKCAobHZfZmluYWxseUV4cHJlc3Npb25fNV8wPSBydWxlWEV4cHJlc3Npb24gKSApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6ODQ5Nzo2OiAoICggJ2ZpbmFsbHknICk9Pm90aGVybHZfND0gJ2ZpbmFsbHknICkgKCAobHZfZmluYWxseUV4cHJlc3Npb25fNV8wPSBydWxlWEV4cHJlc3Npb24gKSApCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjgwNTg6NjogKCAoICdmaW5hbGx5JyApPT5vdGhlcmx2XzQ9ICdmaW5hbGx5JyApCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6ODA1OTo3OiAoICdmaW5hbGx5JyApPT5vdGhlcmx2XzQ9ICdmaW5hbGx5JworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjg0OTc6NjogKCAoICdmaW5hbGx5JyApPT5vdGhlcmx2XzQ9ICdmaW5hbGx5JyApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6ODQ5ODo3OiAoICdmaW5hbGx5JyApPT5vdGhlcmx2XzQ9ICdmaW5hbGx5JwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdGhlcmx2XzQ9KFRva2VuKW1hdGNoKGlucHV0LDEzMyxGT0xMT1dfNjQpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gY3VycmVudDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdGhlcmx2XzQ9KFRva2VuKW1hdGNoKGlucHV0LDE0MCxGT0xMT1dfNzgpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gY3VycmVudDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCQkJCQkJCW5ld0xlYWZOb2RlKG90aGVybHZfNCwgZ3JhbW1hckFjY2Vzcy5nZXRYVHJ5Q2F0Y2hGaW5hbGx5RXhwcmVzc2lvbkFjY2VzcygpLmdldEZpbmFsbHlLZXl3b3JkXzNfMF8xXzAoKSk7CkBAIC0yMTg4OCwxMSArMjMwODIsMTEgQEAKIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjgwNjU6NjogKCAobHZfZmluYWxseUV4cHJlc3Npb25fNV8wPSBydWxlWEV4cHJlc3Npb24gKSApCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6ODA2Njo3OiAobHZfZmluYWxseUV4cHJlc3Npb25fNV8wPSBydWxlWEV4cHJlc3Npb24gKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjg1MDQ6NjogKCAobHZfZmluYWxseUV4cHJlc3Npb25fNV8wPSBydWxlWEV4cHJlc3Npb24gKSApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6ODUwNTo3OiAobHZfZmluYWxseUV4cHJlc3Npb25fNV8wPSBydWxlWEV4cHJlc3Npb24gKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo4MDY2Ojc6IChsdl9maW5hbGx5RXhwcmVzc2lvbl81XzA9IHJ1bGVYRXhwcmVzc2lvbiApCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6ODA2Nzo4OiBsdl9maW5hbGx5RXhwcmVzc2lvbl81XzA9IHJ1bGVYRXhwcmVzc2lvbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjg1MDU6NzogKGx2X2ZpbmFsbHlFeHByZXNzaW9uXzVfMD0gcnVsZVhFeHByZXNzaW9uICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo4NTA2Ojg6IGx2X2ZpbmFsbHlFeHByZXNzaW9uXzVfMD0gcnVsZVhFeHByZXNzaW9uCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogCkBAIC0yMTkzNiwyMiArMjMxMzAsMjIgQEAKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICBjYXNlIDIgOgotICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo4MDg3OjQ6IChvdGhlcmx2XzY9ICdmaW5hbGx5JyAoIChsdl9maW5hbGx5RXhwcmVzc2lvbl83XzA9IHJ1bGVYRXhwcmVzc2lvbiApICkgKQorICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo4NTI2OjQ6IChvdGhlcmx2XzY9ICdmaW5hbGx5JyAoIChsdl9maW5hbGx5RXhwcmVzc2lvbl83XzA9IHJ1bGVYRXhwcmVzc2lvbiApICkgKQogICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjgwODc6NDogKG90aGVybHZfNj0gJ2ZpbmFsbHknICggKGx2X2ZpbmFsbHlFeHByZXNzaW9uXzdfMD0gcnVsZVhFeHByZXNzaW9uICkgKSApCi0gICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjgwODg6NTogb3RoZXJsdl82PSAnZmluYWxseScgKCAobHZfZmluYWxseUV4cHJlc3Npb25fN18wPSBydWxlWEV4cHJlc3Npb24gKSApCisgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjg1MjY6NDogKG90aGVybHZfNj0gJ2ZpbmFsbHknICggKGx2X2ZpbmFsbHlFeHByZXNzaW9uXzdfMD0gcnVsZVhFeHByZXNzaW9uICkgKSApCisgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjg1Mjc6NTogb3RoZXJsdl82PSAnZmluYWxseScgKCAobHZfZmluYWxseUV4cHJlc3Npb25fN18wPSBydWxlWEV4cHJlc3Npb24gKSApCiAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgb3RoZXJsdl82PShUb2tlbiltYXRjaChpbnB1dCwxMzMsRk9MTE9XXzY0KTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7CisgICAgICAgICAgICAgICAgICAgIG90aGVybHZfNj0oVG9rZW4pbWF0Y2goaW5wdXQsMTQwLEZPTExPV183OCk7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OwogICAgICAgICAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKIAogICAgICAgICAgICAgICAgICAgICAgIAkJCQkJbmV3TGVhZk5vZGUob3RoZXJsdl82LCBncmFtbWFyQWNjZXNzLmdldFhUcnlDYXRjaEZpbmFsbHlFeHByZXNzaW9uQWNjZXNzKCkuZ2V0RmluYWxseUtleXdvcmRfM18xXzAoKSk7CiAgICAgICAgICAgICAgICAgICAgICAgCQkJCQogICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjgwOTI6NTogKCAobHZfZmluYWxseUV4cHJlc3Npb25fN18wPSBydWxlWEV4cHJlc3Npb24gKSApCi0gICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjgwOTM6NjogKGx2X2ZpbmFsbHlFeHByZXNzaW9uXzdfMD0gcnVsZVhFeHByZXNzaW9uICkKKyAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6ODUzMTo1OiAoIChsdl9maW5hbGx5RXhwcmVzc2lvbl83XzA9IHJ1bGVYRXhwcmVzc2lvbiApICkKKyAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6ODUzMjo2OiAobHZfZmluYWxseUV4cHJlc3Npb25fN18wPSBydWxlWEV4cHJlc3Npb24gKQogICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjgwOTM6NjogKGx2X2ZpbmFsbHlFeHByZXNzaW9uXzdfMD0gcnVsZVhFeHByZXNzaW9uICkKLSAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6ODA5NDo3OiBsdl9maW5hbGx5RXhwcmVzc2lvbl83XzA9IHJ1bGVYRXhwcmVzc2lvbgorICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo4NTMyOjY6IChsdl9maW5hbGx5RXhwcmVzc2lvbl83XzA9IHJ1bGVYRXhwcmVzc2lvbiApCisgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjg1MzM6NzogbHZfZmluYWxseUV4cHJlc3Npb25fN18wPSBydWxlWEV4cHJlc3Npb24KICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKIApAQCAtMjIwMTYsNyArMjMyMTAsNyBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgImVudHJ5UnVsZVhTeW5jaHJvbml6ZWRFeHByZXNzaW9uIgotICAgIC8vIEludGVybmFsRGF0YURTTC5nOjgxMTc6MTogZW50cnlSdWxlWFN5bmNocm9uaXplZEV4cHJlc3Npb24gcmV0dXJucyBbRU9iamVjdCBjdXJyZW50PW51bGxdIDogaXZfcnVsZVhTeW5jaHJvbml6ZWRFeHByZXNzaW9uPSBydWxlWFN5bmNocm9uaXplZEV4cHJlc3Npb24gRU9GIDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo4NTU2OjE6IGVudHJ5UnVsZVhTeW5jaHJvbml6ZWRFeHByZXNzaW9uIHJldHVybnMgW0VPYmplY3QgY3VycmVudD1udWxsXSA6IGl2X3J1bGVYU3luY2hyb25pemVkRXhwcmVzc2lvbj0gcnVsZVhTeW5jaHJvbml6ZWRFeHByZXNzaW9uIEVPRiA7CiAgICAgcHVibGljIGZpbmFsIEVPYmplY3QgZW50cnlSdWxlWFN5bmNocm9uaXplZEV4cHJlc3Npb24oKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogICAgICAgICBFT2JqZWN0IGN1cnJlbnQgPSBudWxsOwogCkBAIC0yMjAyNCw4ICsyMzIxOCw4IEBACiAKIAogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6ODExNzo2NDogKGl2X3J1bGVYU3luY2hyb25pemVkRXhwcmVzc2lvbj0gcnVsZVhTeW5jaHJvbml6ZWRFeHByZXNzaW9uIEVPRiApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo4MTE4OjI6IGl2X3J1bGVYU3luY2hyb25pemVkRXhwcmVzc2lvbj0gcnVsZVhTeW5jaHJvbml6ZWRFeHByZXNzaW9uIEVPRgorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6ODU1Njo2NDogKGl2X3J1bGVYU3luY2hyb25pemVkRXhwcmVzc2lvbj0gcnVsZVhTeW5jaHJvbml6ZWRFeHByZXNzaW9uIEVPRiApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo4NTU3OjI6IGl2X3J1bGVYU3luY2hyb25pemVkRXhwcmVzc2lvbj0gcnVsZVhTeW5jaHJvbml6ZWRFeHByZXNzaW9uIEVPRgogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBuZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0WFN5bmNocm9uaXplZEV4cHJlc3Npb25SdWxlKCkpOyAKQEAgLTIyMDU2LDcgKzIzMjUwLDcgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlWFN5bmNocm9uaXplZEV4cHJlc3Npb24iCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6ODEyNDoxOiBydWxlWFN5bmNocm9uaXplZEV4cHJlc3Npb24gcmV0dXJucyBbRU9iamVjdCBjdXJyZW50PW51bGxdIDogKCAoICggKCAoKSAnc3luY2hyb25pemVkJyAnKCcgKSApPT4gKCAoKSBvdGhlcmx2XzE9ICdzeW5jaHJvbml6ZWQnIG90aGVybHZfMj0gJygnICkgKSAoIChsdl9wYXJhbV8zXzA9IHJ1bGVYRXhwcmVzc2lvbiApICkgb3RoZXJsdl80PSAnKScgKCAobHZfZXhwcmVzc2lvbl81XzA9IHJ1bGVYRXhwcmVzc2lvbiApICkgKSA7CisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6ODU2MzoxOiBydWxlWFN5bmNocm9uaXplZEV4cHJlc3Npb24gcmV0dXJucyBbRU9iamVjdCBjdXJyZW50PW51bGxdIDogKCAoICggKCAoKSAnc3luY2hyb25pemVkJyAnKCcgKSApPT4gKCAoKSBvdGhlcmx2XzE9ICdzeW5jaHJvbml6ZWQnIG90aGVybHZfMj0gJygnICkgKSAoIChsdl9wYXJhbV8zXzA9IHJ1bGVYRXhwcmVzc2lvbiApICkgb3RoZXJsdl80PSAnKScgKCAobHZfZXhwcmVzc2lvbl81XzA9IHJ1bGVYRXhwcmVzc2lvbiApICkgKSA7CiAgICAgcHVibGljIGZpbmFsIEVPYmplY3QgcnVsZVhTeW5jaHJvbml6ZWRFeHByZXNzaW9uKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKICAgICAgICAgRU9iamVjdCBjdXJyZW50ID0gbnVsbDsKIApAQCAtMjIwNzIsMjAgKzIzMjY2LDIwIEBACiAgICAgICAgIAllbnRlclJ1bGUoKTsKIAogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6ODEzMDoyOiAoICggKCAoICggKCkgJ3N5bmNocm9uaXplZCcgJygnICkgKT0+ICggKCkgb3RoZXJsdl8xPSAnc3luY2hyb25pemVkJyBvdGhlcmx2XzI9ICcoJyApICkgKCAobHZfcGFyYW1fM18wPSBydWxlWEV4cHJlc3Npb24gKSApIG90aGVybHZfND0gJyknICggKGx2X2V4cHJlc3Npb25fNV8wPSBydWxlWEV4cHJlc3Npb24gKSApICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6ODEzMToyOiAoICggKCAoICgpICdzeW5jaHJvbml6ZWQnICcoJyApICk9PiAoICgpIG90aGVybHZfMT0gJ3N5bmNocm9uaXplZCcgb3RoZXJsdl8yPSAnKCcgKSApICggKGx2X3BhcmFtXzNfMD0gcnVsZVhFeHByZXNzaW9uICkgKSBvdGhlcmx2XzQ9ICcpJyAoIChsdl9leHByZXNzaW9uXzVfMD0gcnVsZVhFeHByZXNzaW9uICkgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo4NTY5OjI6ICggKCAoICggKCAoKSAnc3luY2hyb25pemVkJyAnKCcgKSApPT4gKCAoKSBvdGhlcmx2XzE9ICdzeW5jaHJvbml6ZWQnIG90aGVybHZfMj0gJygnICkgKSAoIChsdl9wYXJhbV8zXzA9IHJ1bGVYRXhwcmVzc2lvbiApICkgb3RoZXJsdl80PSAnKScgKCAobHZfZXhwcmVzc2lvbl81XzA9IHJ1bGVYRXhwcmVzc2lvbiApICkgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo4NTcwOjI6ICggKCAoICggKCkgJ3N5bmNocm9uaXplZCcgJygnICkgKT0+ICggKCkgb3RoZXJsdl8xPSAnc3luY2hyb25pemVkJyBvdGhlcmx2XzI9ICcoJyApICkgKCAobHZfcGFyYW1fM18wPSBydWxlWEV4cHJlc3Npb24gKSApIG90aGVybHZfND0gJyknICggKGx2X2V4cHJlc3Npb25fNV8wPSBydWxlWEV4cHJlc3Npb24gKSApICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjgxMzE6MjogKCAoICggKCAoKSAnc3luY2hyb25pemVkJyAnKCcgKSApPT4gKCAoKSBvdGhlcmx2XzE9ICdzeW5jaHJvbml6ZWQnIG90aGVybHZfMj0gJygnICkgKSAoIChsdl9wYXJhbV8zXzA9IHJ1bGVYRXhwcmVzc2lvbiApICkgb3RoZXJsdl80PSAnKScgKCAobHZfZXhwcmVzc2lvbl81XzA9IHJ1bGVYRXhwcmVzc2lvbiApICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6ODEzMjozOiAoICggKCAoKSAnc3luY2hyb25pemVkJyAnKCcgKSApPT4gKCAoKSBvdGhlcmx2XzE9ICdzeW5jaHJvbml6ZWQnIG90aGVybHZfMj0gJygnICkgKSAoIChsdl9wYXJhbV8zXzA9IHJ1bGVYRXhwcmVzc2lvbiApICkgb3RoZXJsdl80PSAnKScgKCAobHZfZXhwcmVzc2lvbl81XzA9IHJ1bGVYRXhwcmVzc2lvbiApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjg1NzA6MjogKCAoICggKCAoKSAnc3luY2hyb25pemVkJyAnKCcgKSApPT4gKCAoKSBvdGhlcmx2XzE9ICdzeW5jaHJvbml6ZWQnIG90aGVybHZfMj0gJygnICkgKSAoIChsdl9wYXJhbV8zXzA9IHJ1bGVYRXhwcmVzc2lvbiApICkgb3RoZXJsdl80PSAnKScgKCAobHZfZXhwcmVzc2lvbl81XzA9IHJ1bGVYRXhwcmVzc2lvbiApICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6ODU3MTozOiAoICggKCAoKSAnc3luY2hyb25pemVkJyAnKCcgKSApPT4gKCAoKSBvdGhlcmx2XzE9ICdzeW5jaHJvbml6ZWQnIG90aGVybHZfMj0gJygnICkgKSAoIChsdl9wYXJhbV8zXzA9IHJ1bGVYRXhwcmVzc2lvbiApICkgb3RoZXJsdl80PSAnKScgKCAobHZfZXhwcmVzc2lvbl81XzA9IHJ1bGVYRXhwcmVzc2lvbiApICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjgxMzI6MzogKCAoICggKCkgJ3N5bmNocm9uaXplZCcgJygnICkgKT0+ICggKCkgb3RoZXJsdl8xPSAnc3luY2hyb25pemVkJyBvdGhlcmx2XzI9ICcoJyApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjgxMzM6NDogKCAoICgpICdzeW5jaHJvbml6ZWQnICcoJyApICk9PiAoICgpIG90aGVybHZfMT0gJ3N5bmNocm9uaXplZCcgb3RoZXJsdl8yPSAnKCcgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6ODU3MTozOiAoICggKCAoKSAnc3luY2hyb25pemVkJyAnKCcgKSApPT4gKCAoKSBvdGhlcmx2XzE9ICdzeW5jaHJvbml6ZWQnIG90aGVybHZfMj0gJygnICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6ODU3Mjo0OiAoICggKCkgJ3N5bmNocm9uaXplZCcgJygnICkgKT0+ICggKCkgb3RoZXJsdl8xPSAnc3luY2hyb25pemVkJyBvdGhlcmx2XzI9ICcoJyApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo4MTQwOjQ6ICggKCkgb3RoZXJsdl8xPSAnc3luY2hyb25pemVkJyBvdGhlcmx2XzI9ICcoJyApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo4MTQxOjU6ICgpIG90aGVybHZfMT0gJ3N5bmNocm9uaXplZCcgb3RoZXJsdl8yPSAnKCcKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjg1Nzk6NDogKCAoKSBvdGhlcmx2XzE9ICdzeW5jaHJvbml6ZWQnIG90aGVybHZfMj0gJygnICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjg1ODA6NTogKCkgb3RoZXJsdl8xPSAnc3luY2hyb25pemVkJyBvdGhlcmx2XzI9ICcoJwogICAgICAgICAgICAgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6ODE0MTo1OiAoKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6ODE0Mjo2OiAKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjg1ODA6NTogKCkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjg1ODE6NjogCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKIApAQCAtMjIwOTcsMTMgKzIzMjkxLDEzIEBACiAKICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgb3RoZXJsdl8xPShUb2tlbiltYXRjaChpbnB1dCwxMzQsRk9MTE9XXzEwMik7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OworICAgICAgICAgICAgb3RoZXJsdl8xPShUb2tlbiltYXRjaChpbnB1dCwxNDEsRk9MTE9XXzExNik7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OwogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAKICAgICAgICAgICAgICAgCQkJCQluZXdMZWFmTm9kZShvdGhlcmx2XzEsIGdyYW1tYXJBY2Nlc3MuZ2V0WFN5bmNocm9uaXplZEV4cHJlc3Npb25BY2Nlc3MoKS5nZXRTeW5jaHJvbml6ZWRLZXl3b3JkXzBfMF8xKCkpOwogICAgICAgICAgICAgICAJCQkJCiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBvdGhlcmx2XzI9KFRva2VuKW1hdGNoKGlucHV0LDc0LEZPTExPV182NCk7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OworICAgICAgICAgICAgb3RoZXJsdl8yPShUb2tlbiltYXRjaChpbnB1dCw4MSxGT0xMT1dfNzgpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gY3VycmVudDsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogCiAgICAgICAgICAgICAgIAkJCQkJbmV3TGVhZk5vZGUob3RoZXJsdl8yLCBncmFtbWFyQWNjZXNzLmdldFhTeW5jaHJvbml6ZWRFeHByZXNzaW9uQWNjZXNzKCkuZ2V0TGVmdFBhcmVudGhlc2lzS2V5d29yZF8wXzBfMigpKTsKQEAgLTIyMTE1LDE4ICsyMzMwOSwxOCBAQAogCiAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjgxNTg6MzogKCAobHZfcGFyYW1fM18wPSBydWxlWEV4cHJlc3Npb24gKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo4MTU5OjQ6IChsdl9wYXJhbV8zXzA9IHJ1bGVYRXhwcmVzc2lvbiApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo4NTk3OjM6ICggKGx2X3BhcmFtXzNfMD0gcnVsZVhFeHByZXNzaW9uICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6ODU5ODo0OiAobHZfcGFyYW1fM18wPSBydWxlWEV4cHJlc3Npb24gKQogICAgICAgICAgICAgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6ODE1OTo0OiAobHZfcGFyYW1fM18wPSBydWxlWEV4cHJlc3Npb24gKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6ODE2MDo1OiBsdl9wYXJhbV8zXzA9IHJ1bGVYRXhwcmVzc2lvbgorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6ODU5ODo0OiAobHZfcGFyYW1fM18wPSBydWxlWEV4cHJlc3Npb24gKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6ODU5OTo1OiBsdl9wYXJhbV8zXzA9IHJ1bGVYRXhwcmVzc2lvbgogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAKICAgICAgICAgICAgICAgCQkJCQluZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0WFN5bmNocm9uaXplZEV4cHJlc3Npb25BY2Nlc3MoKS5nZXRQYXJhbVhFeHByZXNzaW9uUGFyc2VyUnVsZUNhbGxfMV8wKCkpOwogICAgICAgICAgICAgICAJCQkJCiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV182Mik7CisgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV183Nik7CiAgICAgICAgICAgICBsdl9wYXJhbV8zXzA9cnVsZVhFeHByZXNzaW9uKCk7CiAKICAgICAgICAgICAgIHN0YXRlLl9mc3AtLTsKQEAgLTIyMTUwLDE3ICsyMzM0NCwxNyBAQAogCiAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgIG90aGVybHZfND0oVG9rZW4pbWF0Y2goaW5wdXQsNzYsRk9MTE9XXzY0KTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7CisgICAgICAgICAgICBvdGhlcmx2XzQ9KFRva2VuKW1hdGNoKGlucHV0LDgzLEZPTExPV183OCk7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OwogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAKICAgICAgICAgICAgICAgCQkJbmV3TGVhZk5vZGUob3RoZXJsdl80LCBncmFtbWFyQWNjZXNzLmdldFhTeW5jaHJvbml6ZWRFeHByZXNzaW9uQWNjZXNzKCkuZ2V0UmlnaHRQYXJlbnRoZXNpc0tleXdvcmRfMigpKTsKICAgICAgICAgICAgICAgCQkKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjgxODE6MzogKCAobHZfZXhwcmVzc2lvbl81XzA9IHJ1bGVYRXhwcmVzc2lvbiApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjgxODI6NDogKGx2X2V4cHJlc3Npb25fNV8wPSBydWxlWEV4cHJlc3Npb24gKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6ODYyMDozOiAoIChsdl9leHByZXNzaW9uXzVfMD0gcnVsZVhFeHByZXNzaW9uICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6ODYyMTo0OiAobHZfZXhwcmVzc2lvbl81XzA9IHJ1bGVYRXhwcmVzc2lvbiApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo4MTgyOjQ6IChsdl9leHByZXNzaW9uXzVfMD0gcnVsZVhFeHByZXNzaW9uICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjgxODM6NTogbHZfZXhwcmVzc2lvbl81XzA9IHJ1bGVYRXhwcmVzc2lvbgorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6ODYyMTo0OiAobHZfZXhwcmVzc2lvbl81XzA9IHJ1bGVYRXhwcmVzc2lvbiApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo4NjIyOjU6IGx2X2V4cHJlc3Npb25fNV8wPSBydWxlWEV4cHJlc3Npb24KICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogCkBAIC0yMjIxNiw3ICsyMzQxMCw3IEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAiZW50cnlSdWxlWENhdGNoQ2xhdXNlIgotICAgIC8vIEludGVybmFsRGF0YURTTC5nOjgyMDQ6MTogZW50cnlSdWxlWENhdGNoQ2xhdXNlIHJldHVybnMgW0VPYmplY3QgY3VycmVudD1udWxsXSA6IGl2X3J1bGVYQ2F0Y2hDbGF1c2U9IHJ1bGVYQ2F0Y2hDbGF1c2UgRU9GIDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo4NjQzOjE6IGVudHJ5UnVsZVhDYXRjaENsYXVzZSByZXR1cm5zIFtFT2JqZWN0IGN1cnJlbnQ9bnVsbF0gOiBpdl9ydWxlWENhdGNoQ2xhdXNlPSBydWxlWENhdGNoQ2xhdXNlIEVPRiA7CiAgICAgcHVibGljIGZpbmFsIEVPYmplY3QgZW50cnlSdWxlWENhdGNoQ2xhdXNlKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKICAgICAgICAgRU9iamVjdCBjdXJyZW50ID0gbnVsbDsKIApAQCAtMjIyMjQsOCArMjM0MTgsOCBAQAogCiAKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjgyMDQ6NTM6IChpdl9ydWxlWENhdGNoQ2xhdXNlPSBydWxlWENhdGNoQ2xhdXNlIEVPRiApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo4MjA1OjI6IGl2X3J1bGVYQ2F0Y2hDbGF1c2U9IHJ1bGVYQ2F0Y2hDbGF1c2UgRU9GCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo4NjQzOjUzOiAoaXZfcnVsZVhDYXRjaENsYXVzZT0gcnVsZVhDYXRjaENsYXVzZSBFT0YgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6ODY0NDoyOiBpdl9ydWxlWENhdGNoQ2xhdXNlPSBydWxlWENhdGNoQ2xhdXNlIEVPRgogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBuZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0WENhdGNoQ2xhdXNlUnVsZSgpKTsgCkBAIC0yMjI1Niw3ICsyMzQ1MCw3IEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZVhDYXRjaENsYXVzZSIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo4MjExOjE6IHJ1bGVYQ2F0Y2hDbGF1c2UgcmV0dXJucyBbRU9iamVjdCBjdXJyZW50PW51bGxdIDogKCAoICggJ2NhdGNoJyApPT5vdGhlcmx2XzA9ICdjYXRjaCcgKSBvdGhlcmx2XzE9ICcoJyAoIChsdl9kZWNsYXJlZFBhcmFtXzJfMD0gcnVsZUZ1bGxKdm1Gb3JtYWxQYXJhbWV0ZXIgKSApIG90aGVybHZfMz0gJyknICggKGx2X2V4cHJlc3Npb25fNF8wPSBydWxlWEV4cHJlc3Npb24gKSApICkgOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjg2NTA6MTogcnVsZVhDYXRjaENsYXVzZSByZXR1cm5zIFtFT2JqZWN0IGN1cnJlbnQ9bnVsbF0gOiAoICggKCAnY2F0Y2gnICk9Pm90aGVybHZfMD0gJ2NhdGNoJyApIG90aGVybHZfMT0gJygnICggKGx2X2RlY2xhcmVkUGFyYW1fMl8wPSBydWxlRnVsbEp2bUZvcm1hbFBhcmFtZXRlciApICkgb3RoZXJsdl8zPSAnKScgKCAobHZfZXhwcmVzc2lvbl80XzA9IHJ1bGVYRXhwcmVzc2lvbiApICkgKSA7CiAgICAgcHVibGljIGZpbmFsIEVPYmplY3QgcnVsZVhDYXRjaENsYXVzZSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAgICAgICAgIEVPYmplY3QgY3VycmVudCA9IG51bGw7CiAKQEAgLTIyMjcyLDE2ICsyMzQ2NiwxNiBAQAogICAgICAgICAJZW50ZXJSdWxlKCk7CiAKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjgyMTc6MjogKCAoICggKCAnY2F0Y2gnICk9Pm90aGVybHZfMD0gJ2NhdGNoJyApIG90aGVybHZfMT0gJygnICggKGx2X2RlY2xhcmVkUGFyYW1fMl8wPSBydWxlRnVsbEp2bUZvcm1hbFBhcmFtZXRlciApICkgb3RoZXJsdl8zPSAnKScgKCAobHZfZXhwcmVzc2lvbl80XzA9IHJ1bGVYRXhwcmVzc2lvbiApICkgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo4MjE4OjI6ICggKCAoICdjYXRjaCcgKT0+b3RoZXJsdl8wPSAnY2F0Y2gnICkgb3RoZXJsdl8xPSAnKCcgKCAobHZfZGVjbGFyZWRQYXJhbV8yXzA9IHJ1bGVGdWxsSnZtRm9ybWFsUGFyYW1ldGVyICkgKSBvdGhlcmx2XzM9ICcpJyAoIChsdl9leHByZXNzaW9uXzRfMD0gcnVsZVhFeHByZXNzaW9uICkgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo4NjU2OjI6ICggKCAoICggJ2NhdGNoJyApPT5vdGhlcmx2XzA9ICdjYXRjaCcgKSBvdGhlcmx2XzE9ICcoJyAoIChsdl9kZWNsYXJlZFBhcmFtXzJfMD0gcnVsZUZ1bGxKdm1Gb3JtYWxQYXJhbWV0ZXIgKSApIG90aGVybHZfMz0gJyknICggKGx2X2V4cHJlc3Npb25fNF8wPSBydWxlWEV4cHJlc3Npb24gKSApICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6ODY1NzoyOiAoICggKCAnY2F0Y2gnICk9Pm90aGVybHZfMD0gJ2NhdGNoJyApIG90aGVybHZfMT0gJygnICggKGx2X2RlY2xhcmVkUGFyYW1fMl8wPSBydWxlRnVsbEp2bUZvcm1hbFBhcmFtZXRlciApICkgb3RoZXJsdl8zPSAnKScgKCAobHZfZXhwcmVzc2lvbl80XzA9IHJ1bGVYRXhwcmVzc2lvbiApICkgKQogICAgICAgICAgICAgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6ODIxODoyOiAoICggKCAnY2F0Y2gnICk9Pm90aGVybHZfMD0gJ2NhdGNoJyApIG90aGVybHZfMT0gJygnICggKGx2X2RlY2xhcmVkUGFyYW1fMl8wPSBydWxlRnVsbEp2bUZvcm1hbFBhcmFtZXRlciApICkgb3RoZXJsdl8zPSAnKScgKCAobHZfZXhwcmVzc2lvbl80XzA9IHJ1bGVYRXhwcmVzc2lvbiApICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6ODIxOTozOiAoICggJ2NhdGNoJyApPT5vdGhlcmx2XzA9ICdjYXRjaCcgKSBvdGhlcmx2XzE9ICcoJyAoIChsdl9kZWNsYXJlZFBhcmFtXzJfMD0gcnVsZUZ1bGxKdm1Gb3JtYWxQYXJhbWV0ZXIgKSApIG90aGVybHZfMz0gJyknICggKGx2X2V4cHJlc3Npb25fNF8wPSBydWxlWEV4cHJlc3Npb24gKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo4NjU3OjI6ICggKCAoICdjYXRjaCcgKT0+b3RoZXJsdl8wPSAnY2F0Y2gnICkgb3RoZXJsdl8xPSAnKCcgKCAobHZfZGVjbGFyZWRQYXJhbV8yXzA9IHJ1bGVGdWxsSnZtRm9ybWFsUGFyYW1ldGVyICkgKSBvdGhlcmx2XzM9ICcpJyAoIChsdl9leHByZXNzaW9uXzRfMD0gcnVsZVhFeHByZXNzaW9uICkgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo4NjU4OjM6ICggKCAnY2F0Y2gnICk9Pm90aGVybHZfMD0gJ2NhdGNoJyApIG90aGVybHZfMT0gJygnICggKGx2X2RlY2xhcmVkUGFyYW1fMl8wPSBydWxlRnVsbEp2bUZvcm1hbFBhcmFtZXRlciApICkgb3RoZXJsdl8zPSAnKScgKCAobHZfZXhwcmVzc2lvbl80XzA9IHJ1bGVYRXhwcmVzc2lvbiApICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjgyMTk6MzogKCAoICdjYXRjaCcgKT0+b3RoZXJsdl8wPSAnY2F0Y2gnICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjgyMjA6NDogKCAnY2F0Y2gnICk9Pm90aGVybHZfMD0gJ2NhdGNoJworICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6ODY1ODozOiAoICggJ2NhdGNoJyApPT5vdGhlcmx2XzA9ICdjYXRjaCcgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6ODY1OTo0OiAoICdjYXRjaCcgKT0+b3RoZXJsdl8wPSAnY2F0Y2gnCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICBvdGhlcmx2XzA9KFRva2VuKW1hdGNoKGlucHV0LDEzNSxGT0xMT1dfMTAyKTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7CisgICAgICAgICAgICBvdGhlcmx2XzA9KFRva2VuKW1hdGNoKGlucHV0LDE0MixGT0xMT1dfMTE2KTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKIAogICAgICAgICAgICAgICAJCQkJbmV3TGVhZk5vZGUob3RoZXJsdl8wLCBncmFtbWFyQWNjZXNzLmdldFhDYXRjaENsYXVzZUFjY2VzcygpLmdldENhdGNoS2V5d29yZF8wKCkpOwpAQCAtMjIyOTAsMjQgKzIzNDg0LDI0IEBACiAKICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgb3RoZXJsdl8xPShUb2tlbiltYXRjaChpbnB1dCw3NCxGT0xMT1dfNzcpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gY3VycmVudDsKKyAgICAgICAgICAgIG90aGVybHZfMT0oVG9rZW4pbWF0Y2goaW5wdXQsODEsRk9MTE9XXzkxKTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKIAogICAgICAgICAgICAgICAJCQluZXdMZWFmTm9kZShvdGhlcmx2XzEsIGdyYW1tYXJBY2Nlc3MuZ2V0WENhdGNoQ2xhdXNlQWNjZXNzKCkuZ2V0TGVmdFBhcmVudGhlc2lzS2V5d29yZF8xKCkpOwogICAgICAgICAgICAgICAJCQogICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6ODIzMDozOiAoIChsdl9kZWNsYXJlZFBhcmFtXzJfMD0gcnVsZUZ1bGxKdm1Gb3JtYWxQYXJhbWV0ZXIgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo4MjMxOjQ6IChsdl9kZWNsYXJlZFBhcmFtXzJfMD0gcnVsZUZ1bGxKdm1Gb3JtYWxQYXJhbWV0ZXIgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6ODY2OTozOiAoIChsdl9kZWNsYXJlZFBhcmFtXzJfMD0gcnVsZUZ1bGxKdm1Gb3JtYWxQYXJhbWV0ZXIgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo4NjcwOjQ6IChsdl9kZWNsYXJlZFBhcmFtXzJfMD0gcnVsZUZ1bGxKdm1Gb3JtYWxQYXJhbWV0ZXIgKQogICAgICAgICAgICAgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6ODIzMTo0OiAobHZfZGVjbGFyZWRQYXJhbV8yXzA9IHJ1bGVGdWxsSnZtRm9ybWFsUGFyYW1ldGVyICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjgyMzI6NTogbHZfZGVjbGFyZWRQYXJhbV8yXzA9IHJ1bGVGdWxsSnZtRm9ybWFsUGFyYW1ldGVyCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo4NjcwOjQ6IChsdl9kZWNsYXJlZFBhcmFtXzJfMD0gcnVsZUZ1bGxKdm1Gb3JtYWxQYXJhbWV0ZXIgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6ODY3MTo1OiBsdl9kZWNsYXJlZFBhcmFtXzJfMD0gcnVsZUZ1bGxKdm1Gb3JtYWxQYXJhbWV0ZXIKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogCiAgICAgICAgICAgICAgIAkJCQkJbmV3Q29tcG9zaXRlTm9kZShncmFtbWFyQWNjZXNzLmdldFhDYXRjaENsYXVzZUFjY2VzcygpLmdldERlY2xhcmVkUGFyYW1GdWxsSnZtRm9ybWFsUGFyYW1ldGVyUGFyc2VyUnVsZUNhbGxfMl8wKCkpOwogICAgICAgICAgICAgICAJCQkJCiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV182Mik7CisgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV183Nik7CiAgICAgICAgICAgICBsdl9kZWNsYXJlZFBhcmFtXzJfMD1ydWxlRnVsbEp2bUZvcm1hbFBhcmFtZXRlcigpOwogCiAgICAgICAgICAgICBzdGF0ZS5fZnNwLS07CkBAIC0yMjMzMSwxNyArMjM1MjUsMTcgQEAKIAogICAgICAgICAgICAgfQogCi0gICAgICAgICAgICBvdGhlcmx2XzM9KFRva2VuKW1hdGNoKGlucHV0LDc2LEZPTExPV182NCk7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OworICAgICAgICAgICAgb3RoZXJsdl8zPShUb2tlbiltYXRjaChpbnB1dCw4MyxGT0xMT1dfNzgpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gY3VycmVudDsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogCiAgICAgICAgICAgICAgIAkJCW5ld0xlYWZOb2RlKG90aGVybHZfMywgZ3JhbW1hckFjY2Vzcy5nZXRYQ2F0Y2hDbGF1c2VBY2Nlc3MoKS5nZXRSaWdodFBhcmVudGhlc2lzS2V5d29yZF8zKCkpOwogICAgICAgICAgICAgICAJCQogICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6ODI1MzozOiAoIChsdl9leHByZXNzaW9uXzRfMD0gcnVsZVhFeHByZXNzaW9uICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6ODI1NDo0OiAobHZfZXhwcmVzc2lvbl80XzA9IHJ1bGVYRXhwcmVzc2lvbiApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo4NjkyOjM6ICggKGx2X2V4cHJlc3Npb25fNF8wPSBydWxlWEV4cHJlc3Npb24gKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo4NjkzOjQ6IChsdl9leHByZXNzaW9uXzRfMD0gcnVsZVhFeHByZXNzaW9uICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjgyNTQ6NDogKGx2X2V4cHJlc3Npb25fNF8wPSBydWxlWEV4cHJlc3Npb24gKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6ODI1NTo1OiBsdl9leHByZXNzaW9uXzRfMD0gcnVsZVhFeHByZXNzaW9uCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo4NjkzOjQ6IChsdl9leHByZXNzaW9uXzRfMD0gcnVsZVhFeHByZXNzaW9uICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjg2OTQ6NTogbHZfZXhwcmVzc2lvbl80XzA9IHJ1bGVYRXhwcmVzc2lvbgogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAKQEAgLTIyMzk3LDcgKzIzNTkxLDcgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJlbnRyeVJ1bGVRdWFsaWZpZWROYW1lIgotICAgIC8vIEludGVybmFsRGF0YURTTC5nOjgyNzY6MTogZW50cnlSdWxlUXVhbGlmaWVkTmFtZSByZXR1cm5zIFtTdHJpbmcgY3VycmVudD1udWxsXSA6IGl2X3J1bGVRdWFsaWZpZWROYW1lPSBydWxlUXVhbGlmaWVkTmFtZSBFT0YgOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjg3MTU6MTogZW50cnlSdWxlUXVhbGlmaWVkTmFtZSByZXR1cm5zIFtTdHJpbmcgY3VycmVudD1udWxsXSA6IGl2X3J1bGVRdWFsaWZpZWROYW1lPSBydWxlUXVhbGlmaWVkTmFtZSBFT0YgOwogICAgIHB1YmxpYyBmaW5hbCBTdHJpbmcgZW50cnlSdWxlUXVhbGlmaWVkTmFtZSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAgICAgICAgIFN0cmluZyBjdXJyZW50ID0gbnVsbDsKIApAQCAtMjI0MDUsOCArMjM1OTksOCBAQAogCiAKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjgyNzY6NTM6IChpdl9ydWxlUXVhbGlmaWVkTmFtZT0gcnVsZVF1YWxpZmllZE5hbWUgRU9GICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjgyNzc6MjogaXZfcnVsZVF1YWxpZmllZE5hbWU9IHJ1bGVRdWFsaWZpZWROYW1lIEVPRgorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6ODcxNTo1MzogKGl2X3J1bGVRdWFsaWZpZWROYW1lPSBydWxlUXVhbGlmaWVkTmFtZSBFT0YgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6ODcxNjoyOiBpdl9ydWxlUXVhbGlmaWVkTmFtZT0gcnVsZVF1YWxpZmllZE5hbWUgRU9GCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIG5ld0NvbXBvc2l0ZU5vZGUoZ3JhbW1hckFjY2Vzcy5nZXRRdWFsaWZpZWROYW1lUnVsZSgpKTsgCkBAIC0yMjQzNyw3ICsyMzYzMSw3IEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZVF1YWxpZmllZE5hbWUiCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6ODI4MzoxOiBydWxlUXVhbGlmaWVkTmFtZSByZXR1cm5zIFtBbnRsckRhdGF0eXBlUnVsZVRva2VuIGN1cnJlbnQ9bmV3IEFudGxyRGF0YXR5cGVSdWxlVG9rZW4oKV0gOiAodGhpc19WYWxpZElEXzA9IHJ1bGVWYWxpZElEICggKCAoICcuJyApPT5rdz0gJy4nICkgdGhpc19WYWxpZElEXzI9IHJ1bGVWYWxpZElEICkqICkgOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjg3MjI6MTogcnVsZVF1YWxpZmllZE5hbWUgcmV0dXJucyBbQW50bHJEYXRhdHlwZVJ1bGVUb2tlbiBjdXJyZW50PW5ldyBBbnRsckRhdGF0eXBlUnVsZVRva2VuKCldIDogKHRoaXNfVmFsaWRJRF8wPSBydWxlVmFsaWRJRCAoICggKCAnLicgKT0+a3c9ICcuJyApIHRoaXNfVmFsaWRJRF8yPSBydWxlVmFsaWRJRCApKiApIDsKICAgICBwdWJsaWMgZmluYWwgQW50bHJEYXRhdHlwZVJ1bGVUb2tlbiBydWxlUXVhbGlmaWVkTmFtZSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAgICAgICAgIEFudGxyRGF0YXR5cGVSdWxlVG9rZW4gY3VycmVudCA9IG5ldyBBbnRsckRhdGF0eXBlUnVsZVRva2VuKCk7CiAKQEAgLTIyNDUxLDE4ICsyMzY0NSwxOCBAQAogICAgICAgICAJZW50ZXJSdWxlKCk7CiAKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjgyODk6MjogKCAodGhpc19WYWxpZElEXzA9IHJ1bGVWYWxpZElEICggKCAoICcuJyApPT5rdz0gJy4nICkgdGhpc19WYWxpZElEXzI9IHJ1bGVWYWxpZElEICkqICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6ODI5MDoyOiAodGhpc19WYWxpZElEXzA9IHJ1bGVWYWxpZElEICggKCAoICcuJyApPT5rdz0gJy4nICkgdGhpc19WYWxpZElEXzI9IHJ1bGVWYWxpZElEICkqICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjg3Mjg6MjogKCAodGhpc19WYWxpZElEXzA9IHJ1bGVWYWxpZElEICggKCAoICcuJyApPT5rdz0gJy4nICkgdGhpc19WYWxpZElEXzI9IHJ1bGVWYWxpZElEICkqICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6ODcyOToyOiAodGhpc19WYWxpZElEXzA9IHJ1bGVWYWxpZElEICggKCAoICcuJyApPT5rdz0gJy4nICkgdGhpc19WYWxpZElEXzI9IHJ1bGVWYWxpZElEICkqICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjgyOTA6MjogKHRoaXNfVmFsaWRJRF8wPSBydWxlVmFsaWRJRCAoICggKCAnLicgKT0+a3c9ICcuJyApIHRoaXNfVmFsaWRJRF8yPSBydWxlVmFsaWRJRCApKiApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo4MjkxOjM6IHRoaXNfVmFsaWRJRF8wPSBydWxlVmFsaWRJRCAoICggKCAnLicgKT0+a3c9ICcuJyApIHRoaXNfVmFsaWRJRF8yPSBydWxlVmFsaWRJRCApKgorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6ODcyOToyOiAodGhpc19WYWxpZElEXzA9IHJ1bGVWYWxpZElEICggKCAoICcuJyApPT5rdz0gJy4nICkgdGhpc19WYWxpZElEXzI9IHJ1bGVWYWxpZElEICkqICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjg3MzA6MzogdGhpc19WYWxpZElEXzA9IHJ1bGVWYWxpZElEICggKCAoICcuJyApPT5rdz0gJy4nICkgdGhpc19WYWxpZElEXzI9IHJ1bGVWYWxpZElEICkqCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKIAogICAgICAgICAgICAgICAJCQluZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0UXVhbGlmaWVkTmFtZUFjY2VzcygpLmdldFZhbGlkSURQYXJzZXJSdWxlQ2FsbF8wKCkpOwogICAgICAgICAgICAgICAJCQogICAgICAgICAgICAgfQotICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfNTQpOworICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfNjgpOwogICAgICAgICAgICAgdGhpc19WYWxpZElEXzA9cnVsZVZhbGlkSUQoKTsKIAogICAgICAgICAgICAgc3RhdGUuX2ZzcC0tOwpAQCAtMjI0NzcsMjAgKzIzNjcxLDIwIEBACiAgICAgICAgICAgICAgIAkJCWFmdGVyUGFyc2VyT3JFbnVtUnVsZUNhbGwoKTsKICAgICAgICAgICAgICAgCQkKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjgzMDE6MzogKCAoICggJy4nICk9Pmt3PSAnLicgKSB0aGlzX1ZhbGlkSURfMj0gcnVsZVZhbGlkSUQgKSoKLSAgICAgICAgICAgIGxvb3AxNDE6CisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo4NzQwOjM6ICggKCAoICcuJyApPT5rdz0gJy4nICkgdGhpc19WYWxpZElEXzI9IHJ1bGVWYWxpZElEICkqCisgICAgICAgICAgICBsb29wMTUyOgogICAgICAgICAgICAgZG8gewotICAgICAgICAgICAgICAgIGludCBhbHQxNDE9MjsKLSAgICAgICAgICAgICAgICBpbnQgTEExNDFfMCA9IGlucHV0LkxBKDEpOworICAgICAgICAgICAgICAgIGludCBhbHQxNTI9MjsKKyAgICAgICAgICAgICAgICBpbnQgTEExNTJfMCA9IGlucHV0LkxBKDEpOwogCi0gICAgICAgICAgICAgICAgaWYgKCAoTEExNDFfMD09NjcpICkgewotICAgICAgICAgICAgICAgICAgICBpbnQgTEExNDFfMiA9IGlucHV0LkxBKDIpOworICAgICAgICAgICAgICAgIGlmICggKExBMTUyXzA9PTc0KSApIHsKKyAgICAgICAgICAgICAgICAgICAgaW50IExBMTUyXzIgPSBpbnB1dC5MQSgyKTsKIAotICAgICAgICAgICAgICAgICAgICBpZiAoIChMQTE0MV8yPT1SVUxFX0lEKSApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGludCBMQTE0MV8zID0gaW5wdXQuTEEoMyk7CisgICAgICAgICAgICAgICAgICAgIGlmICggKExBMTUyXzI9PVJVTEVfSUQpICkgeworICAgICAgICAgICAgICAgICAgICAgICAgaW50IExBMTUyXzMgPSBpbnB1dC5MQSgzKTsKIAogICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCAoc3lucHJlZDQ4X0ludGVybmFsRGF0YURTTCgpKSApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbHQxNDE9MTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbHQxNTI9MTsKICAgICAgICAgICAgICAgICAgICAgICAgIH0KIAogCkBAIC0yMjUwMCwxNCArMjM2OTQsMTQgQEAKICAgICAgICAgICAgICAgICB9CiAKIAotICAgICAgICAgICAgICAgIHN3aXRjaCAoYWx0MTQxKSB7CisgICAgICAgICAgICAgICAgc3dpdGNoIChhbHQxNTIpIHsKICAgICAgICAgICAgIAljYXNlIDEgOgotICAgICAgICAgICAgCSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo4MzAyOjQ6ICggKCAnLicgKT0+a3c9ICcuJyApIHRoaXNfVmFsaWRJRF8yPSBydWxlVmFsaWRJRAorICAgICAgICAgICAgCSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo4NzQxOjQ6ICggKCAnLicgKT0+a3c9ICcuJyApIHRoaXNfVmFsaWRJRF8yPSBydWxlVmFsaWRJRAogICAgICAgICAgICAgCSAgICB7Ci0gICAgICAgICAgICAJICAgIC8vIEludGVybmFsRGF0YURTTC5nOjgzMDI6NDogKCAoICcuJyApPT5rdz0gJy4nICkKLSAgICAgICAgICAgIAkgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6ODMwMzo1OiAoICcuJyApPT5rdz0gJy4nCisgICAgICAgICAgICAJICAgIC8vIEludGVybmFsRGF0YURTTC5nOjg3NDE6NDogKCAoICcuJyApPT5rdz0gJy4nICkKKyAgICAgICAgICAgIAkgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6ODc0Mjo1OiAoICcuJyApPT5rdz0gJy4nCiAgICAgICAgICAgICAJICAgIHsKLSAgICAgICAgICAgIAkgICAga3c9KFRva2VuKW1hdGNoKGlucHV0LDY3LEZPTExPV180KTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7CisgICAgICAgICAgICAJICAgIGt3PShUb2tlbiltYXRjaChpbnB1dCw3NCxGT0xMT1dfNCk7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OwogICAgICAgICAgICAgCSAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKIAogICAgICAgICAgICAgCSAgICAgIAkJCQkJY3VycmVudC5tZXJnZShrdyk7CkBAIC0yMjUyMiw3ICsyMzcxNiw3IEBACiAgICAgICAgICAgICAJICAgICAgCQkJCW5ld0NvbXBvc2l0ZU5vZGUoZ3JhbW1hckFjY2Vzcy5nZXRRdWFsaWZpZWROYW1lQWNjZXNzKCkuZ2V0VmFsaWRJRFBhcnNlclJ1bGVDYWxsXzFfMSgpKTsKICAgICAgICAgICAgIAkgICAgICAJCQkKICAgICAgICAgICAgIAkgICAgfQotICAgICAgICAgICAgCSAgICBwdXNoRm9sbG93KEZPTExPV181NCk7CisgICAgICAgICAgICAJICAgIHB1c2hGb2xsb3coRk9MTE9XXzY4KTsKICAgICAgICAgICAgIAkgICAgdGhpc19WYWxpZElEXzI9cnVsZVZhbGlkSUQoKTsKIAogICAgICAgICAgICAgCSAgICBzdGF0ZS5fZnNwLS07CkBAIC0yMjU0Miw3ICsyMzczNiw3IEBACiAgICAgICAgICAgICAJICAgIGJyZWFrOwogCiAgICAgICAgICAgICAJZGVmYXVsdCA6Ci0gICAgICAgICAgICAJICAgIGJyZWFrIGxvb3AxNDE7CisgICAgICAgICAgICAJICAgIGJyZWFrIGxvb3AxNTI7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfSB3aGlsZSAodHJ1ZSk7CiAKQEAgLTIyNTcxLDcgKzIzNzY1LDcgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJlbnRyeVJ1bGVOdW1iZXIiCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6ODMyNToxOiBlbnRyeVJ1bGVOdW1iZXIgcmV0dXJucyBbU3RyaW5nIGN1cnJlbnQ9bnVsbF0gOiBpdl9ydWxlTnVtYmVyPSBydWxlTnVtYmVyIEVPRiA7CisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6ODc2NDoxOiBlbnRyeVJ1bGVOdW1iZXIgcmV0dXJucyBbU3RyaW5nIGN1cnJlbnQ9bnVsbF0gOiBpdl9ydWxlTnVtYmVyPSBydWxlTnVtYmVyIEVPRiA7CiAgICAgcHVibGljIGZpbmFsIFN0cmluZyBlbnRyeVJ1bGVOdW1iZXIoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogICAgICAgICBTdHJpbmcgY3VycmVudCA9IG51bGw7CiAKQEAgLTIyNTgyLDggKzIzNzc2LDggQEAKICAgICAgICAgCUhpZGRlblRva2VucyBteUhpZGRlblRva2VuU3RhdGUgPSAoKFh0ZXh0VG9rZW5TdHJlYW0paW5wdXQpLnNldEhpZGRlblRva2VucygpOwogCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo4MzI3OjI6IChpdl9ydWxlTnVtYmVyPSBydWxlTnVtYmVyIEVPRiApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo4MzI4OjI6IGl2X3J1bGVOdW1iZXI9IHJ1bGVOdW1iZXIgRU9GCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo4NzY2OjI6IChpdl9ydWxlTnVtYmVyPSBydWxlTnVtYmVyIEVPRiApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo4NzY3OjI6IGl2X3J1bGVOdW1iZXI9IHJ1bGVOdW1iZXIgRU9GCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIG5ld0NvbXBvc2l0ZU5vZGUoZ3JhbW1hckFjY2Vzcy5nZXROdW1iZXJSdWxlKCkpOyAKQEAgLTIyNjE3LDcgKzIzODExLDcgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlTnVtYmVyIgotICAgIC8vIEludGVybmFsRGF0YURTTC5nOjgzMzc6MTogcnVsZU51bWJlciByZXR1cm5zIFtBbnRsckRhdGF0eXBlUnVsZVRva2VuIGN1cnJlbnQ9bmV3IEFudGxyRGF0YXR5cGVSdWxlVG9rZW4oKV0gOiAodGhpc19IRVhfMD0gUlVMRV9IRVggfCAoICh0aGlzX0lOVF8xPSBSVUxFX0lOVCB8IHRoaXNfREVDSU1BTF8yPSBSVUxFX0RFQ0lNQUwgKSAoa3c9ICcuJyAodGhpc19JTlRfND0gUlVMRV9JTlQgfCB0aGlzX0RFQ0lNQUxfNT0gUlVMRV9ERUNJTUFMICkgKT8gKSApIDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo4Nzc2OjE6IHJ1bGVOdW1iZXIgcmV0dXJucyBbQW50bHJEYXRhdHlwZVJ1bGVUb2tlbiBjdXJyZW50PW5ldyBBbnRsckRhdGF0eXBlUnVsZVRva2VuKCldIDogKHRoaXNfSEVYXzA9IFJVTEVfSEVYIHwgKCAodGhpc19JTlRfMT0gUlVMRV9JTlQgfCB0aGlzX0RFQ0lNQUxfMj0gUlVMRV9ERUNJTUFMICkgKGt3PSAnLicgKHRoaXNfSU5UXzQ9IFJVTEVfSU5UIHwgdGhpc19ERUNJTUFMXzU9IFJVTEVfREVDSU1BTCApICk/ICkgKSA7CiAgICAgcHVibGljIGZpbmFsIEFudGxyRGF0YXR5cGVSdWxlVG9rZW4gcnVsZU51bWJlcigpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAgICAgICAgIEFudGxyRGF0YXR5cGVSdWxlVG9rZW4gY3VycmVudCA9IG5ldyBBbnRsckRhdGF0eXBlUnVsZVRva2VuKCk7CiAKQEAgLTIyNjMzLDI5ICsyMzgyNywyOSBAQAogICAgICAgICAJSGlkZGVuVG9rZW5zIG15SGlkZGVuVG9rZW5TdGF0ZSA9ICgoWHRleHRUb2tlblN0cmVhbSlpbnB1dCkuc2V0SGlkZGVuVG9rZW5zKCk7CiAKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjgzNDQ6MjogKCAodGhpc19IRVhfMD0gUlVMRV9IRVggfCAoICh0aGlzX0lOVF8xPSBSVUxFX0lOVCB8IHRoaXNfREVDSU1BTF8yPSBSVUxFX0RFQ0lNQUwgKSAoa3c9ICcuJyAodGhpc19JTlRfND0gUlVMRV9JTlQgfCB0aGlzX0RFQ0lNQUxfNT0gUlVMRV9ERUNJTUFMICkgKT8gKSApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjgzNDU6MjogKHRoaXNfSEVYXzA9IFJVTEVfSEVYIHwgKCAodGhpc19JTlRfMT0gUlVMRV9JTlQgfCB0aGlzX0RFQ0lNQUxfMj0gUlVMRV9ERUNJTUFMICkgKGt3PSAnLicgKHRoaXNfSU5UXzQ9IFJVTEVfSU5UIHwgdGhpc19ERUNJTUFMXzU9IFJVTEVfREVDSU1BTCApICk/ICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6ODc4MzoyOiAoICh0aGlzX0hFWF8wPSBSVUxFX0hFWCB8ICggKHRoaXNfSU5UXzE9IFJVTEVfSU5UIHwgdGhpc19ERUNJTUFMXzI9IFJVTEVfREVDSU1BTCApIChrdz0gJy4nICh0aGlzX0lOVF80PSBSVUxFX0lOVCB8IHRoaXNfREVDSU1BTF81PSBSVUxFX0RFQ0lNQUwgKSApPyApICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6ODc4NDoyOiAodGhpc19IRVhfMD0gUlVMRV9IRVggfCAoICh0aGlzX0lOVF8xPSBSVUxFX0lOVCB8IHRoaXNfREVDSU1BTF8yPSBSVUxFX0RFQ0lNQUwgKSAoa3c9ICcuJyAodGhpc19JTlRfND0gUlVMRV9JTlQgfCB0aGlzX0RFQ0lNQUxfNT0gUlVMRV9ERUNJTUFMICkgKT8gKSApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo4MzQ1OjI6ICh0aGlzX0hFWF8wPSBSVUxFX0hFWCB8ICggKHRoaXNfSU5UXzE9IFJVTEVfSU5UIHwgdGhpc19ERUNJTUFMXzI9IFJVTEVfREVDSU1BTCApIChrdz0gJy4nICh0aGlzX0lOVF80PSBSVUxFX0lOVCB8IHRoaXNfREVDSU1BTF81PSBSVUxFX0RFQ0lNQUwgKSApPyApICkKLSAgICAgICAgICAgIGludCBhbHQxNDU9MjsKLSAgICAgICAgICAgIGludCBMQTE0NV8wID0gaW5wdXQuTEEoMSk7CisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo4Nzg0OjI6ICh0aGlzX0hFWF8wPSBSVUxFX0hFWCB8ICggKHRoaXNfSU5UXzE9IFJVTEVfSU5UIHwgdGhpc19ERUNJTUFMXzI9IFJVTEVfREVDSU1BTCApIChrdz0gJy4nICh0aGlzX0lOVF80PSBSVUxFX0lOVCB8IHRoaXNfREVDSU1BTF81PSBSVUxFX0RFQ0lNQUwgKSApPyApICkKKyAgICAgICAgICAgIGludCBhbHQxNTY9MjsKKyAgICAgICAgICAgIGludCBMQTE1Nl8wID0gaW5wdXQuTEEoMSk7CiAKLSAgICAgICAgICAgIGlmICggKExBMTQ1XzA9PVJVTEVfSEVYKSApIHsKLSAgICAgICAgICAgICAgICBhbHQxNDU9MTsKKyAgICAgICAgICAgIGlmICggKExBMTU2XzA9PVJVTEVfSEVYKSApIHsKKyAgICAgICAgICAgICAgICBhbHQxNTY9MTsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgaWYgKCAoTEExNDVfMD09UlVMRV9JTlR8fExBMTQ1XzA9PVJVTEVfREVDSU1BTCkgKSB7Ci0gICAgICAgICAgICAgICAgYWx0MTQ1PTI7CisgICAgICAgICAgICBlbHNlIGlmICggKExBMTU2XzA9PVJVTEVfSU5UfHxMQTE1Nl8wPT1SVUxFX0RFQ0lNQUwpICkgeworICAgICAgICAgICAgICAgIGFsdDE1Nj0yOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgaWYgKHN0YXRlLmJhY2t0cmFja2luZz4wKSB7c3RhdGUuZmFpbGVkPXRydWU7IHJldHVybiBjdXJyZW50O30KICAgICAgICAgICAgICAgICBOb1ZpYWJsZUFsdEV4Y2VwdGlvbiBudmFlID0KLSAgICAgICAgICAgICAgICAgICAgbmV3IE5vVmlhYmxlQWx0RXhjZXB0aW9uKCIiLCAxNDUsIDAsIGlucHV0KTsKKyAgICAgICAgICAgICAgICAgICAgbmV3IE5vVmlhYmxlQWx0RXhjZXB0aW9uKCIiLCAxNTYsIDAsIGlucHV0KTsKIAogICAgICAgICAgICAgICAgIHRocm93IG52YWU7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBzd2l0Y2ggKGFsdDE0NSkgeworICAgICAgICAgICAgc3dpdGNoIChhbHQxNTYpIHsKICAgICAgICAgICAgICAgICBjYXNlIDEgOgotICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo4MzQ2OjM6IHRoaXNfSEVYXzA9IFJVTEVfSEVYCisgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjg3ODU6MzogdGhpc19IRVhfMD0gUlVMRV9IRVgKICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICB0aGlzX0hFWF8wPShUb2tlbiltYXRjaChpbnB1dCxSVUxFX0hFWCxGT0xMT1dfMik7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OwogICAgICAgICAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKQEAgLTIyNjcyLDMzICsyMzg2NiwzMyBAQAogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgIGNhc2UgMiA6Ci0gICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjgzNTQ6MzogKCAodGhpc19JTlRfMT0gUlVMRV9JTlQgfCB0aGlzX0RFQ0lNQUxfMj0gUlVMRV9ERUNJTUFMICkgKGt3PSAnLicgKHRoaXNfSU5UXzQ9IFJVTEVfSU5UIHwgdGhpc19ERUNJTUFMXzU9IFJVTEVfREVDSU1BTCApICk/ICkKKyAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6ODc5MzozOiAoICh0aGlzX0lOVF8xPSBSVUxFX0lOVCB8IHRoaXNfREVDSU1BTF8yPSBSVUxFX0RFQ0lNQUwgKSAoa3c9ICcuJyAodGhpc19JTlRfND0gUlVMRV9JTlQgfCB0aGlzX0RFQ0lNQUxfNT0gUlVMRV9ERUNJTUFMICkgKT8gKQogICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjgzNTQ6MzogKCAodGhpc19JTlRfMT0gUlVMRV9JTlQgfCB0aGlzX0RFQ0lNQUxfMj0gUlVMRV9ERUNJTUFMICkgKGt3PSAnLicgKHRoaXNfSU5UXzQ9IFJVTEVfSU5UIHwgdGhpc19ERUNJTUFMXzU9IFJVTEVfREVDSU1BTCApICk/ICkKLSAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6ODM1NTo0OiAodGhpc19JTlRfMT0gUlVMRV9JTlQgfCB0aGlzX0RFQ0lNQUxfMj0gUlVMRV9ERUNJTUFMICkgKGt3PSAnLicgKHRoaXNfSU5UXzQ9IFJVTEVfSU5UIHwgdGhpc19ERUNJTUFMXzU9IFJVTEVfREVDSU1BTCApICk/CisgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjg3OTM6MzogKCAodGhpc19JTlRfMT0gUlVMRV9JTlQgfCB0aGlzX0RFQ0lNQUxfMj0gUlVMRV9ERUNJTUFMICkgKGt3PSAnLicgKHRoaXNfSU5UXzQ9IFJVTEVfSU5UIHwgdGhpc19ERUNJTUFMXzU9IFJVTEVfREVDSU1BTCApICk/ICkKKyAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6ODc5NDo0OiAodGhpc19JTlRfMT0gUlVMRV9JTlQgfCB0aGlzX0RFQ0lNQUxfMj0gUlVMRV9ERUNJTUFMICkgKGt3PSAnLicgKHRoaXNfSU5UXzQ9IFJVTEVfSU5UIHwgdGhpc19ERUNJTUFMXzU9IFJVTEVfREVDSU1BTCApICk/CiAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6ODM1NTo0OiAodGhpc19JTlRfMT0gUlVMRV9JTlQgfCB0aGlzX0RFQ0lNQUxfMj0gUlVMRV9ERUNJTUFMICkKLSAgICAgICAgICAgICAgICAgICAgaW50IGFsdDE0Mj0yOwotICAgICAgICAgICAgICAgICAgICBpbnQgTEExNDJfMCA9IGlucHV0LkxBKDEpOworICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo4Nzk0OjQ6ICh0aGlzX0lOVF8xPSBSVUxFX0lOVCB8IHRoaXNfREVDSU1BTF8yPSBSVUxFX0RFQ0lNQUwgKQorICAgICAgICAgICAgICAgICAgICBpbnQgYWx0MTUzPTI7CisgICAgICAgICAgICAgICAgICAgIGludCBMQTE1M18wID0gaW5wdXQuTEEoMSk7CiAKLSAgICAgICAgICAgICAgICAgICAgaWYgKCAoTEExNDJfMD09UlVMRV9JTlQpICkgewotICAgICAgICAgICAgICAgICAgICAgICAgYWx0MTQyPTE7CisgICAgICAgICAgICAgICAgICAgIGlmICggKExBMTUzXzA9PVJVTEVfSU5UKSApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFsdDE1Mz0xOwogICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKCAoTEExNDJfMD09UlVMRV9ERUNJTUFMKSApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGFsdDE0Mj0yOworICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICggKExBMTUzXzA9PVJVTEVfREVDSU1BTCkgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBhbHQxNTM9MjsKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdGF0ZS5iYWNrdHJhY2tpbmc+MCkge3N0YXRlLmZhaWxlZD10cnVlOyByZXR1cm4gY3VycmVudDt9CiAgICAgICAgICAgICAgICAgICAgICAgICBOb1ZpYWJsZUFsdEV4Y2VwdGlvbiBudmFlID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgTm9WaWFibGVBbHRFeGNlcHRpb24oIiIsIDE0MiwgMCwgaW5wdXQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBOb1ZpYWJsZUFsdEV4Y2VwdGlvbigiIiwgMTUzLCAwLCBpbnB1dCk7CiAKICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG52YWU7CiAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChhbHQxNDIpIHsKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChhbHQxNTMpIHsKICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMSA6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6ODM1Njo1OiB0aGlzX0lOVF8xPSBSVUxFX0lOVAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjg3OTU6NTogdGhpc19JTlRfMT0gUlVMRV9JTlQKICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpc19JTlRfMT0oVG9rZW4pbWF0Y2goaW5wdXQsUlVMRV9JTlQsRk9MTE9XXzU0KTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpc19JTlRfMT0oVG9rZW4pbWF0Y2goaW5wdXQsUlVMRV9JTlQsRk9MTE9XXzY4KTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAkJCQkJY3VycmVudC5tZXJnZSh0aGlzX0lOVF8xKTsKQEAgLTIyNzEzLDkgKzIzOTA3LDkgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDIgOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjgzNjQ6NTogdGhpc19ERUNJTUFMXzI9IFJVTEVfREVDSU1BTAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjg4MDM6NTogdGhpc19ERUNJTUFMXzI9IFJVTEVfREVDSU1BTAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzX0RFQ0lNQUxfMj0oVG9rZW4pbWF0Y2goaW5wdXQsUlVMRV9ERUNJTUFMLEZPTExPV181NCk7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXNfREVDSU1BTF8yPShUb2tlbiltYXRjaChpbnB1dCxSVUxFX0RFQ0lNQUwsRk9MTE9XXzY4KTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAkJCQkJY3VycmVudC5tZXJnZSh0aGlzX0RFQ0lNQUxfMik7CkBAIC0yMjczMiw0OCArMjM5MjYsNDggQEAKIAogICAgICAgICAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6ODM3Mjo0OiAoa3c9ICcuJyAodGhpc19JTlRfND0gUlVMRV9JTlQgfCB0aGlzX0RFQ0lNQUxfNT0gUlVMRV9ERUNJTUFMICkgKT8KLSAgICAgICAgICAgICAgICAgICAgaW50IGFsdDE0ND0yOwotICAgICAgICAgICAgICAgICAgICBpbnQgTEExNDRfMCA9IGlucHV0LkxBKDEpOworICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo4ODExOjQ6IChrdz0gJy4nICh0aGlzX0lOVF80PSBSVUxFX0lOVCB8IHRoaXNfREVDSU1BTF81PSBSVUxFX0RFQ0lNQUwgKSApPworICAgICAgICAgICAgICAgICAgICBpbnQgYWx0MTU1PTI7CisgICAgICAgICAgICAgICAgICAgIGludCBMQTE1NV8wID0gaW5wdXQuTEEoMSk7CiAKLSAgICAgICAgICAgICAgICAgICAgaWYgKCAoTEExNDRfMD09NjcpICkgewotICAgICAgICAgICAgICAgICAgICAgICAgaW50IExBMTQ0XzEgPSBpbnB1dC5MQSgyKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCAoTEExNTVfMD09NzQpICkgeworICAgICAgICAgICAgICAgICAgICAgICAgaW50IExBMTU1XzEgPSBpbnB1dC5MQSgyKTsKIAotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCAoTEExNDRfMT09UlVMRV9JTlR8fExBMTQ0XzE9PVJVTEVfREVDSU1BTCkgKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYWx0MTQ0PTE7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIChMQTE1NV8xPT1SVUxFX0lOVHx8TEExNTVfMT09UlVMRV9ERUNJTUFMKSApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbHQxNTU9MTsKICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKGFsdDE0NCkgeworICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKGFsdDE1NSkgewogICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxIDoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo4MzczOjU6IGt3PSAnLicgKHRoaXNfSU5UXzQ9IFJVTEVfSU5UIHwgdGhpc19ERUNJTUFMXzU9IFJVTEVfREVDSU1BTCApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6ODgxMjo1OiBrdz0gJy4nICh0aGlzX0lOVF80PSBSVUxFX0lOVCB8IHRoaXNfREVDSU1BTF81PSBSVUxFX0RFQ0lNQUwgKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBrdz0oVG9rZW4pbWF0Y2goaW5wdXQsNjcsRk9MTE9XXzEyNik7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGt3PShUb2tlbiltYXRjaChpbnB1dCw3NCxGT0xMT1dfMTM5KTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAkJCQkJY3VycmVudC5tZXJnZShrdyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAJCQkJCW5ld0xlYWZOb2RlKGt3LCBncmFtbWFyQWNjZXNzLmdldE51bWJlckFjY2VzcygpLmdldEZ1bGxTdG9wS2V5d29yZF8xXzFfMCgpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAkJCQkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6ODM3ODo1OiAodGhpc19JTlRfND0gUlVMRV9JTlQgfCB0aGlzX0RFQ0lNQUxfNT0gUlVMRV9ERUNJTUFMICkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYWx0MTQzPTI7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IExBMTQzXzAgPSBpbnB1dC5MQSgxKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo4ODE3OjU6ICh0aGlzX0lOVF80PSBSVUxFX0lOVCB8IHRoaXNfREVDSU1BTF81PSBSVUxFX0RFQ0lNQUwgKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBhbHQxNTQ9MjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgTEExNTRfMCA9IGlucHV0LkxBKDEpOwogCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCAoTEExNDNfMD09UlVMRV9JTlQpICkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbHQxNDM9MTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIChMQTE1NF8wPT1SVUxFX0lOVCkgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsdDE1ND0xOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICggKExBMTQzXzA9PVJVTEVfREVDSU1BTCkgKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsdDE0Mz0yOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKCAoTEExNTRfMD09UlVMRV9ERUNJTUFMKSApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWx0MTU0PTI7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3RhdGUuYmFja3RyYWNraW5nPjApIHtzdGF0ZS5mYWlsZWQ9dHJ1ZTsgcmV0dXJuIGN1cnJlbnQ7fQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOb1ZpYWJsZUFsdEV4Y2VwdGlvbiBudmFlID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBOb1ZpYWJsZUFsdEV4Y2VwdGlvbigiIiwgMTQzLCAwLCBpbnB1dCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgTm9WaWFibGVBbHRFeGNlcHRpb24oIiIsIDE1NCwgMCwgaW5wdXQpOwogCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG52YWU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoYWx0MTQzKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChhbHQxNTQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxIDoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjgzNzk6NjogdGhpc19JTlRfND0gUlVMRV9JTlQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjg4MTg6NjogdGhpc19JTlRfND0gUlVMRV9JTlQKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXNfSU5UXzQ9KFRva2VuKW1hdGNoKGlucHV0LFJVTEVfSU5ULEZPTExPV18yKTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKQEAgLTIyNzkwLDcgKzIzOTg0LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDIgOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6ODM4Nzo2OiB0aGlzX0RFQ0lNQUxfNT0gUlVMRV9ERUNJTUFMCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo4ODI2OjY6IHRoaXNfREVDSU1BTF81PSBSVUxFX0RFQ0lNQUwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXNfREVDSU1BTF81PShUb2tlbiltYXRjaChpbnB1dCxSVUxFX0RFQ0lNQUwsRk9MTE9XXzIpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gY3VycmVudDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewpAQCAtMjI4NDksNyArMjQwNDMsNyBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgImVudHJ5UnVsZUp2bVR5cGVSZWZlcmVuY2UiCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6ODQwNDoxOiBlbnRyeVJ1bGVKdm1UeXBlUmVmZXJlbmNlIHJldHVybnMgW0VPYmplY3QgY3VycmVudD1udWxsXSA6IGl2X3J1bGVKdm1UeXBlUmVmZXJlbmNlPSBydWxlSnZtVHlwZVJlZmVyZW5jZSBFT0YgOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjg4NDM6MTogZW50cnlSdWxlSnZtVHlwZVJlZmVyZW5jZSByZXR1cm5zIFtFT2JqZWN0IGN1cnJlbnQ9bnVsbF0gOiBpdl9ydWxlSnZtVHlwZVJlZmVyZW5jZT0gcnVsZUp2bVR5cGVSZWZlcmVuY2UgRU9GIDsKICAgICBwdWJsaWMgZmluYWwgRU9iamVjdCBlbnRyeVJ1bGVKdm1UeXBlUmVmZXJlbmNlKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKICAgICAgICAgRU9iamVjdCBjdXJyZW50ID0gbnVsbDsKIApAQCAtMjI4NTcsOCArMjQwNTEsOCBAQAogCiAKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjg0MDQ6NTc6IChpdl9ydWxlSnZtVHlwZVJlZmVyZW5jZT0gcnVsZUp2bVR5cGVSZWZlcmVuY2UgRU9GICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjg0MDU6MjogaXZfcnVsZUp2bVR5cGVSZWZlcmVuY2U9IHJ1bGVKdm1UeXBlUmVmZXJlbmNlIEVPRgorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6ODg0Mzo1NzogKGl2X3J1bGVKdm1UeXBlUmVmZXJlbmNlPSBydWxlSnZtVHlwZVJlZmVyZW5jZSBFT0YgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6ODg0NDoyOiBpdl9ydWxlSnZtVHlwZVJlZmVyZW5jZT0gcnVsZUp2bVR5cGVSZWZlcmVuY2UgRU9GCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIG5ld0NvbXBvc2l0ZU5vZGUoZ3JhbW1hckFjY2Vzcy5nZXRKdm1UeXBlUmVmZXJlbmNlUnVsZSgpKTsgCkBAIC0yMjg4OSw3ICsyNDA4Myw3IEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZUp2bVR5cGVSZWZlcmVuY2UiCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6ODQxMToxOiBydWxlSnZtVHlwZVJlZmVyZW5jZSByZXR1cm5zIFtFT2JqZWN0IGN1cnJlbnQ9bnVsbF0gOiAoICh0aGlzX0p2bVBhcmFtZXRlcml6ZWRUeXBlUmVmZXJlbmNlXzA9IHJ1bGVKdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZSAoICggKCAoKSBydWxlQXJyYXlCcmFja2V0cyApICk9PiAoICgpIHJ1bGVBcnJheUJyYWNrZXRzICkgKSogKSB8IHRoaXNfWEZ1bmN0aW9uVHlwZVJlZl8zPSBydWxlWEZ1bmN0aW9uVHlwZVJlZiApIDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo4ODUwOjE6IHJ1bGVKdm1UeXBlUmVmZXJlbmNlIHJldHVybnMgW0VPYmplY3QgY3VycmVudD1udWxsXSA6ICggKHRoaXNfSnZtUGFyYW1ldGVyaXplZFR5cGVSZWZlcmVuY2VfMD0gcnVsZUp2bVBhcmFtZXRlcml6ZWRUeXBlUmVmZXJlbmNlICggKCAoICgpIHJ1bGVBcnJheUJyYWNrZXRzICkgKT0+ICggKCkgcnVsZUFycmF5QnJhY2tldHMgKSApKiApIHwgdGhpc19YRnVuY3Rpb25UeXBlUmVmXzM9IHJ1bGVYRnVuY3Rpb25UeXBlUmVmICkgOwogICAgIHB1YmxpYyBmaW5hbCBFT2JqZWN0IHJ1bGVKdm1UeXBlUmVmZXJlbmNlKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKICAgICAgICAgRU9iamVjdCBjdXJyZW50ID0gbnVsbDsKIApAQCAtMjI5MDIsMzkgKzI0MDk2LDM5IEBACiAgICAgICAgIAllbnRlclJ1bGUoKTsKIAogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6ODQxNzoyOiAoICggKHRoaXNfSnZtUGFyYW1ldGVyaXplZFR5cGVSZWZlcmVuY2VfMD0gcnVsZUp2bVBhcmFtZXRlcml6ZWRUeXBlUmVmZXJlbmNlICggKCAoICgpIHJ1bGVBcnJheUJyYWNrZXRzICkgKT0+ICggKCkgcnVsZUFycmF5QnJhY2tldHMgKSApKiApIHwgdGhpc19YRnVuY3Rpb25UeXBlUmVmXzM9IHJ1bGVYRnVuY3Rpb25UeXBlUmVmICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6ODQxODoyOiAoICh0aGlzX0p2bVBhcmFtZXRlcml6ZWRUeXBlUmVmZXJlbmNlXzA9IHJ1bGVKdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZSAoICggKCAoKSBydWxlQXJyYXlCcmFja2V0cyApICk9PiAoICgpIHJ1bGVBcnJheUJyYWNrZXRzICkgKSogKSB8IHRoaXNfWEZ1bmN0aW9uVHlwZVJlZl8zPSBydWxlWEZ1bmN0aW9uVHlwZVJlZiApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo4ODU2OjI6ICggKCAodGhpc19Kdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZV8wPSBydWxlSnZtUGFyYW1ldGVyaXplZFR5cGVSZWZlcmVuY2UgKCAoICggKCkgcnVsZUFycmF5QnJhY2tldHMgKSApPT4gKCAoKSBydWxlQXJyYXlCcmFja2V0cyApICkqICkgfCB0aGlzX1hGdW5jdGlvblR5cGVSZWZfMz0gcnVsZVhGdW5jdGlvblR5cGVSZWYgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo4ODU3OjI6ICggKHRoaXNfSnZtUGFyYW1ldGVyaXplZFR5cGVSZWZlcmVuY2VfMD0gcnVsZUp2bVBhcmFtZXRlcml6ZWRUeXBlUmVmZXJlbmNlICggKCAoICgpIHJ1bGVBcnJheUJyYWNrZXRzICkgKT0+ICggKCkgcnVsZUFycmF5QnJhY2tldHMgKSApKiApIHwgdGhpc19YRnVuY3Rpb25UeXBlUmVmXzM9IHJ1bGVYRnVuY3Rpb25UeXBlUmVmICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjg0MTg6MjogKCAodGhpc19Kdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZV8wPSBydWxlSnZtUGFyYW1ldGVyaXplZFR5cGVSZWZlcmVuY2UgKCAoICggKCkgcnVsZUFycmF5QnJhY2tldHMgKSApPT4gKCAoKSBydWxlQXJyYXlCcmFja2V0cyApICkqICkgfCB0aGlzX1hGdW5jdGlvblR5cGVSZWZfMz0gcnVsZVhGdW5jdGlvblR5cGVSZWYgKQotICAgICAgICAgICAgaW50IGFsdDE0Nz0yOwotICAgICAgICAgICAgaW50IExBMTQ3XzAgPSBpbnB1dC5MQSgxKTsKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjg4NTc6MjogKCAodGhpc19Kdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZV8wPSBydWxlSnZtUGFyYW1ldGVyaXplZFR5cGVSZWZlcmVuY2UgKCAoICggKCkgcnVsZUFycmF5QnJhY2tldHMgKSApPT4gKCAoKSBydWxlQXJyYXlCcmFja2V0cyApICkqICkgfCB0aGlzX1hGdW5jdGlvblR5cGVSZWZfMz0gcnVsZVhGdW5jdGlvblR5cGVSZWYgKQorICAgICAgICAgICAgaW50IGFsdDE1OD0yOworICAgICAgICAgICAgaW50IExBMTU4XzAgPSBpbnB1dC5MQSgxKTsKIAotICAgICAgICAgICAgaWYgKCAoTEExNDdfMD09UlVMRV9JRCkgKSB7Ci0gICAgICAgICAgICAgICAgYWx0MTQ3PTE7CisgICAgICAgICAgICBpZiAoIChMQTE1OF8wPT1SVUxFX0lEKSApIHsKKyAgICAgICAgICAgICAgICBhbHQxNTg9MTsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgaWYgKCAoTEExNDdfMD09NzR8fExBMTQ3XzA9PTk5KSApIHsKLSAgICAgICAgICAgICAgICBhbHQxNDc9MjsKKyAgICAgICAgICAgIGVsc2UgaWYgKCAoTEExNThfMD09ODF8fExBMTU4XzA9PTEwNikgKSB7CisgICAgICAgICAgICAgICAgYWx0MTU4PTI7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICBpZiAoc3RhdGUuYmFja3RyYWNraW5nPjApIHtzdGF0ZS5mYWlsZWQ9dHJ1ZTsgcmV0dXJuIGN1cnJlbnQ7fQogICAgICAgICAgICAgICAgIE5vVmlhYmxlQWx0RXhjZXB0aW9uIG52YWUgPQotICAgICAgICAgICAgICAgICAgICBuZXcgTm9WaWFibGVBbHRFeGNlcHRpb24oIiIsIDE0NywgMCwgaW5wdXQpOworICAgICAgICAgICAgICAgICAgICBuZXcgTm9WaWFibGVBbHRFeGNlcHRpb24oIiIsIDE1OCwgMCwgaW5wdXQpOwogCiAgICAgICAgICAgICAgICAgdGhyb3cgbnZhZTsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHN3aXRjaCAoYWx0MTQ3KSB7CisgICAgICAgICAgICBzd2l0Y2ggKGFsdDE1OCkgewogICAgICAgICAgICAgICAgIGNhc2UgMSA6Ci0gICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjg0MTk6MzogKHRoaXNfSnZtUGFyYW1ldGVyaXplZFR5cGVSZWZlcmVuY2VfMD0gcnVsZUp2bVBhcmFtZXRlcml6ZWRUeXBlUmVmZXJlbmNlICggKCAoICgpIHJ1bGVBcnJheUJyYWNrZXRzICkgKT0+ICggKCkgcnVsZUFycmF5QnJhY2tldHMgKSApKiApCisgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjg4NTg6MzogKHRoaXNfSnZtUGFyYW1ldGVyaXplZFR5cGVSZWZlcmVuY2VfMD0gcnVsZUp2bVBhcmFtZXRlcml6ZWRUeXBlUmVmZXJlbmNlICggKCAoICgpIHJ1bGVBcnJheUJyYWNrZXRzICkgKT0+ICggKCkgcnVsZUFycmF5QnJhY2tldHMgKSApKiApCiAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6ODQxOTozOiAodGhpc19Kdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZV8wPSBydWxlSnZtUGFyYW1ldGVyaXplZFR5cGVSZWZlcmVuY2UgKCAoICggKCkgcnVsZUFycmF5QnJhY2tldHMgKSApPT4gKCAoKSBydWxlQXJyYXlCcmFja2V0cyApICkqICkKLSAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6ODQyMDo0OiB0aGlzX0p2bVBhcmFtZXRlcml6ZWRUeXBlUmVmZXJlbmNlXzA9IHJ1bGVKdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZSAoICggKCAoKSBydWxlQXJyYXlCcmFja2V0cyApICk9PiAoICgpIHJ1bGVBcnJheUJyYWNrZXRzICkgKSoKKyAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6ODg1ODozOiAodGhpc19Kdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZV8wPSBydWxlSnZtUGFyYW1ldGVyaXplZFR5cGVSZWZlcmVuY2UgKCAoICggKCkgcnVsZUFycmF5QnJhY2tldHMgKSApPT4gKCAoKSBydWxlQXJyYXlCcmFja2V0cyApICkqICkKKyAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6ODg1OTo0OiB0aGlzX0p2bVBhcmFtZXRlcml6ZWRUeXBlUmVmZXJlbmNlXzA9IHJ1bGVKdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZSAoICggKCAoKSBydWxlQXJyYXlCcmFja2V0cyApICk9PiAoICgpIHJ1bGVBcnJheUJyYWNrZXRzICkgKSoKICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKIAogICAgICAgICAgICAgICAgICAgICAgIAkJCQluZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0SnZtVHlwZVJlZmVyZW5jZUFjY2VzcygpLmdldEp2bVBhcmFtZXRlcml6ZWRUeXBlUmVmZXJlbmNlUGFyc2VyUnVsZUNhbGxfMF8wKCkpOwogICAgICAgICAgICAgICAgICAgICAgIAkJCQogICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzEyMCk7CisgICAgICAgICAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzEzMyk7CiAgICAgICAgICAgICAgICAgICAgIHRoaXNfSnZtUGFyYW1ldGVyaXplZFR5cGVSZWZlcmVuY2VfMD1ydWxlSnZtUGFyYW1ldGVyaXplZFR5cGVSZWZlcmVuY2UoKTsKIAogICAgICAgICAgICAgICAgICAgICBzdGF0ZS5fZnNwLS07CkBAIC0yMjk0NSwyMCArMjQxMzksMjAgQEAKICAgICAgICAgICAgICAgICAgICAgICAJCQkJYWZ0ZXJQYXJzZXJPckVudW1SdWxlQ2FsbCgpOwogICAgICAgICAgICAgICAgICAgICAgIAkJCQogICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjg0Mjg6NDogKCAoICggKCkgcnVsZUFycmF5QnJhY2tldHMgKSApPT4gKCAoKSBydWxlQXJyYXlCcmFja2V0cyApICkqCi0gICAgICAgICAgICAgICAgICAgIGxvb3AxNDY6CisgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjg4Njc6NDogKCAoICggKCkgcnVsZUFycmF5QnJhY2tldHMgKSApPT4gKCAoKSBydWxlQXJyYXlCcmFja2V0cyApICkqCisgICAgICAgICAgICAgICAgICAgIGxvb3AxNTc6CiAgICAgICAgICAgICAgICAgICAgIGRvIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGludCBhbHQxNDY9MjsKLSAgICAgICAgICAgICAgICAgICAgICAgIGludCBMQTE0Nl8wID0gaW5wdXQuTEEoMSk7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYWx0MTU3PTI7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgTEExNTdfMCA9IGlucHV0LkxBKDEpOwogCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIChMQTE0Nl8wPT03OSkgKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IExBMTQ2XzIgPSBpbnB1dC5MQSgyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICggKExBMTU3XzA9PTg2KSApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgTEExNTdfMiA9IGlucHV0LkxBKDIpOwogCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCAoTEExNDZfMj09ODApICkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgTEExNDZfMyA9IGlucHV0LkxBKDMpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICggKExBMTU3XzI9PTg3KSApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IExBMTU3XzMgPSBpbnB1dC5MQSgzKTsKIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIChzeW5wcmVkNDlfSW50ZXJuYWxEYXRhRFNMKCkpICkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWx0MTQ2PTE7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbHQxNTc9MTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogCiAKQEAgLTIyOTY4LDE1ICsyNDE2MiwxNSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgfQogCiAKLSAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoYWx0MTQ2KSB7CisgICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKGFsdDE1NykgewogICAgICAgICAgICAgICAgICAgICAJY2FzZSAxIDoKLSAgICAgICAgICAgICAgICAgICAgCSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo4NDI5OjU6ICggKCAoKSBydWxlQXJyYXlCcmFja2V0cyApICk9PiAoICgpIHJ1bGVBcnJheUJyYWNrZXRzICkKKyAgICAgICAgICAgICAgICAgICAgCSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo4ODY4OjU6ICggKCAoKSBydWxlQXJyYXlCcmFja2V0cyApICk9PiAoICgpIHJ1bGVBcnJheUJyYWNrZXRzICkKICAgICAgICAgICAgICAgICAgICAgCSAgICB7Ci0gICAgICAgICAgICAgICAgICAgIAkgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6ODQzNTo1OiAoICgpIHJ1bGVBcnJheUJyYWNrZXRzICkKLSAgICAgICAgICAgICAgICAgICAgCSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo4NDM2OjY6ICgpIHJ1bGVBcnJheUJyYWNrZXRzCisgICAgICAgICAgICAgICAgICAgIAkgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6ODg3NDo1OiAoICgpIHJ1bGVBcnJheUJyYWNrZXRzICkKKyAgICAgICAgICAgICAgICAgICAgCSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo4ODc1OjY6ICgpIHJ1bGVBcnJheUJyYWNrZXRzCiAgICAgICAgICAgICAgICAgICAgIAkgICAgewotICAgICAgICAgICAgICAgICAgICAJICAgIC8vIEludGVybmFsRGF0YURTTC5nOjg0MzY6NjogKCkKLSAgICAgICAgICAgICAgICAgICAgCSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo4NDM3Ojc6IAorICAgICAgICAgICAgICAgICAgICAJICAgIC8vIEludGVybmFsRGF0YURTTC5nOjg4NzU6NjogKCkKKyAgICAgICAgICAgICAgICAgICAgCSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo4ODc2Ojc6IAogICAgICAgICAgICAgICAgICAgICAJICAgIHsKICAgICAgICAgICAgICAgICAgICAgCSAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKIApAQCAtMjI5OTMsNyArMjQxODcsNyBAQAogICAgICAgICAgICAgICAgICAgICAJICAgICAgCQkJCQkJbmV3Q29tcG9zaXRlTm9kZShncmFtbWFyQWNjZXNzLmdldEp2bVR5cGVSZWZlcmVuY2VBY2Nlc3MoKS5nZXRBcnJheUJyYWNrZXRzUGFyc2VyUnVsZUNhbGxfMF8xXzBfMSgpKTsKICAgICAgICAgICAgICAgICAgICAgCSAgICAgIAkJCQkJCiAgICAgICAgICAgICAgICAgICAgIAkgICAgfQotICAgICAgICAgICAgICAgICAgICAJICAgIHB1c2hGb2xsb3coRk9MTE9XXzEyMCk7CisgICAgICAgICAgICAgICAgICAgIAkgICAgcHVzaEZvbGxvdyhGT0xMT1dfMTMzKTsKICAgICAgICAgICAgICAgICAgICAgCSAgICBydWxlQXJyYXlCcmFja2V0cygpOwogCiAgICAgICAgICAgICAgICAgICAgIAkgICAgc3RhdGUuX2ZzcC0tOwpAQCAtMjMwMTEsNyArMjQyMDUsNyBAQAogICAgICAgICAgICAgICAgICAgICAJICAgIGJyZWFrOwogCiAgICAgICAgICAgICAgICAgICAgIAlkZWZhdWx0IDoKLSAgICAgICAgICAgICAgICAgICAgCSAgICBicmVhayBsb29wMTQ2OworICAgICAgICAgICAgICAgICAgICAJICAgIGJyZWFrIGxvb3AxNTc7CiAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIH0gd2hpbGUgKHRydWUpOwogCkBAIC0yMzAyMiw3ICsyNDIxNiw3IEBACiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgY2FzZSAyIDoKLSAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6ODQ1NDozOiB0aGlzX1hGdW5jdGlvblR5cGVSZWZfMz0gcnVsZVhGdW5jdGlvblR5cGVSZWYKKyAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6ODg5MzozOiB0aGlzX1hGdW5jdGlvblR5cGVSZWZfMz0gcnVsZVhGdW5jdGlvblR5cGVSZWYKICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKIApAQCAtMjMwNjgsNyArMjQyNjIsNyBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgImVudHJ5UnVsZUFycmF5QnJhY2tldHMiCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6ODQ2NjoxOiBlbnRyeVJ1bGVBcnJheUJyYWNrZXRzIHJldHVybnMgW1N0cmluZyBjdXJyZW50PW51bGxdIDogaXZfcnVsZUFycmF5QnJhY2tldHM9IHJ1bGVBcnJheUJyYWNrZXRzIEVPRiA7CisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6ODkwNToxOiBlbnRyeVJ1bGVBcnJheUJyYWNrZXRzIHJldHVybnMgW1N0cmluZyBjdXJyZW50PW51bGxdIDogaXZfcnVsZUFycmF5QnJhY2tldHM9IHJ1bGVBcnJheUJyYWNrZXRzIEVPRiA7CiAgICAgcHVibGljIGZpbmFsIFN0cmluZyBlbnRyeVJ1bGVBcnJheUJyYWNrZXRzKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKICAgICAgICAgU3RyaW5nIGN1cnJlbnQgPSBudWxsOwogCkBAIC0yMzA3Niw4ICsyNDI3MCw4IEBACiAKIAogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6ODQ2Njo1MzogKGl2X3J1bGVBcnJheUJyYWNrZXRzPSBydWxlQXJyYXlCcmFja2V0cyBFT0YgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6ODQ2NzoyOiBpdl9ydWxlQXJyYXlCcmFja2V0cz0gcnVsZUFycmF5QnJhY2tldHMgRU9GCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo4OTA1OjUzOiAoaXZfcnVsZUFycmF5QnJhY2tldHM9IHJ1bGVBcnJheUJyYWNrZXRzIEVPRiApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo4OTA2OjI6IGl2X3J1bGVBcnJheUJyYWNrZXRzPSBydWxlQXJyYXlCcmFja2V0cyBFT0YKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgbmV3Q29tcG9zaXRlTm9kZShncmFtbWFyQWNjZXNzLmdldEFycmF5QnJhY2tldHNSdWxlKCkpOyAKQEAgLTIzMTA4LDcgKzI0MzAyLDcgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlQXJyYXlCcmFja2V0cyIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo4NDczOjE6IHJ1bGVBcnJheUJyYWNrZXRzIHJldHVybnMgW0FudGxyRGF0YXR5cGVSdWxlVG9rZW4gY3VycmVudD1uZXcgQW50bHJEYXRhdHlwZVJ1bGVUb2tlbigpXSA6IChrdz0gJ1snIGt3PSAnXScgKSA7CisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6ODkxMjoxOiBydWxlQXJyYXlCcmFja2V0cyByZXR1cm5zIFtBbnRsckRhdGF0eXBlUnVsZVRva2VuIGN1cnJlbnQ9bmV3IEFudGxyRGF0YXR5cGVSdWxlVG9rZW4oKV0gOiAoa3c9ICdbJyBrdz0gJ10nICkgOwogICAgIHB1YmxpYyBmaW5hbCBBbnRsckRhdGF0eXBlUnVsZVRva2VuIHJ1bGVBcnJheUJyYWNrZXRzKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKICAgICAgICAgQW50bHJEYXRhdHlwZVJ1bGVUb2tlbiBjdXJyZW50ID0gbmV3IEFudGxyRGF0YXR5cGVSdWxlVG9rZW4oKTsKIApAQCAtMjMxMTgsMjAgKzI0MzEyLDIwIEBACiAgICAgICAgIAllbnRlclJ1bGUoKTsKIAogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6ODQ3OToyOiAoIChrdz0gJ1snIGt3PSAnXScgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo4NDgwOjI6IChrdz0gJ1snIGt3PSAnXScgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6ODkxODoyOiAoIChrdz0gJ1snIGt3PSAnXScgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo4OTE5OjI6IChrdz0gJ1snIGt3PSAnXScgKQogICAgICAgICAgICAgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6ODQ4MDoyOiAoa3c9ICdbJyBrdz0gJ10nICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjg0ODE6Mzoga3c9ICdbJyBrdz0gJ10nCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo4OTE5OjI6IChrdz0gJ1snIGt3PSAnXScgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6ODkyMDozOiBrdz0gJ1snIGt3PSAnXScKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIGt3PShUb2tlbiltYXRjaChpbnB1dCw3OSxGT0xMT1dfOTkpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gY3VycmVudDsKKyAgICAgICAgICAgIGt3PShUb2tlbiltYXRjaChpbnB1dCw4NixGT0xMT1dfMTEzKTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKIAogICAgICAgICAgICAgICAJCQljdXJyZW50Lm1lcmdlKGt3KTsKICAgICAgICAgICAgICAgCQkJbmV3TGVhZk5vZGUoa3csIGdyYW1tYXJBY2Nlc3MuZ2V0QXJyYXlCcmFja2V0c0FjY2VzcygpLmdldExlZnRTcXVhcmVCcmFja2V0S2V5d29yZF8wKCkpOwogICAgICAgICAgICAgICAJCQogICAgICAgICAgICAgfQotICAgICAgICAgICAga3c9KFRva2VuKW1hdGNoKGlucHV0LDgwLEZPTExPV18yKTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7CisgICAgICAgICAgICBrdz0oVG9rZW4pbWF0Y2goaW5wdXQsODcsRk9MTE9XXzIpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gY3VycmVudDsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogCiAgICAgICAgICAgICAgIAkJCWN1cnJlbnQubWVyZ2Uoa3cpOwpAQCAtMjMxNjMsNyArMjQzNTcsNyBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgImVudHJ5UnVsZVhGdW5jdGlvblR5cGVSZWYiCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6ODQ5NToxOiBlbnRyeVJ1bGVYRnVuY3Rpb25UeXBlUmVmIHJldHVybnMgW0VPYmplY3QgY3VycmVudD1udWxsXSA6IGl2X3J1bGVYRnVuY3Rpb25UeXBlUmVmPSBydWxlWEZ1bmN0aW9uVHlwZVJlZiBFT0YgOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjg5MzQ6MTogZW50cnlSdWxlWEZ1bmN0aW9uVHlwZVJlZiByZXR1cm5zIFtFT2JqZWN0IGN1cnJlbnQ9bnVsbF0gOiBpdl9ydWxlWEZ1bmN0aW9uVHlwZVJlZj0gcnVsZVhGdW5jdGlvblR5cGVSZWYgRU9GIDsKICAgICBwdWJsaWMgZmluYWwgRU9iamVjdCBlbnRyeVJ1bGVYRnVuY3Rpb25UeXBlUmVmKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKICAgICAgICAgRU9iamVjdCBjdXJyZW50ID0gbnVsbDsKIApAQCAtMjMxNzEsOCArMjQzNjUsOCBAQAogCiAKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjg0OTU6NTc6IChpdl9ydWxlWEZ1bmN0aW9uVHlwZVJlZj0gcnVsZVhGdW5jdGlvblR5cGVSZWYgRU9GICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjg0OTY6MjogaXZfcnVsZVhGdW5jdGlvblR5cGVSZWY9IHJ1bGVYRnVuY3Rpb25UeXBlUmVmIEVPRgorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6ODkzNDo1NzogKGl2X3J1bGVYRnVuY3Rpb25UeXBlUmVmPSBydWxlWEZ1bmN0aW9uVHlwZVJlZiBFT0YgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6ODkzNToyOiBpdl9ydWxlWEZ1bmN0aW9uVHlwZVJlZj0gcnVsZVhGdW5jdGlvblR5cGVSZWYgRU9GCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIG5ld0NvbXBvc2l0ZU5vZGUoZ3JhbW1hckFjY2Vzcy5nZXRYRnVuY3Rpb25UeXBlUmVmUnVsZSgpKTsgCkBAIC0yMzIwMyw3ICsyNDM5Nyw3IEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZVhGdW5jdGlvblR5cGVSZWYiCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6ODUwMjoxOiBydWxlWEZ1bmN0aW9uVHlwZVJlZiByZXR1cm5zIFtFT2JqZWN0IGN1cnJlbnQ9bnVsbF0gOiAoIChvdGhlcmx2XzA9ICcoJyAoICggKGx2X3BhcmFtVHlwZXNfMV8wPSBydWxlSnZtVHlwZVJlZmVyZW5jZSApICkgKG90aGVybHZfMj0gJywnICggKGx2X3BhcmFtVHlwZXNfM18wPSBydWxlSnZtVHlwZVJlZmVyZW5jZSApICkgKSogKT8gb3RoZXJsdl80PSAnKScgKT8gb3RoZXJsdl81PSAnPT4nICggKGx2X3JldHVyblR5cGVfNl8wPSBydWxlSnZtVHlwZVJlZmVyZW5jZSApICkgKSA7CisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6ODk0MToxOiBydWxlWEZ1bmN0aW9uVHlwZVJlZiByZXR1cm5zIFtFT2JqZWN0IGN1cnJlbnQ9bnVsbF0gOiAoIChvdGhlcmx2XzA9ICcoJyAoICggKGx2X3BhcmFtVHlwZXNfMV8wPSBydWxlSnZtVHlwZVJlZmVyZW5jZSApICkgKG90aGVybHZfMj0gJywnICggKGx2X3BhcmFtVHlwZXNfM18wPSBydWxlSnZtVHlwZVJlZmVyZW5jZSApICkgKSogKT8gb3RoZXJsdl80PSAnKScgKT8gb3RoZXJsdl81PSAnPT4nICggKGx2X3JldHVyblR5cGVfNl8wPSBydWxlSnZtVHlwZVJlZmVyZW5jZSApICkgKSA7CiAgICAgcHVibGljIGZpbmFsIEVPYmplY3QgcnVsZVhGdW5jdGlvblR5cGVSZWYoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogICAgICAgICBFT2JqZWN0IGN1cnJlbnQgPSBudWxsOwogCkBAIC0yMzIyMiw1MiArMjQ0MTYsNTIgQEAKICAgICAgICAgCWVudGVyUnVsZSgpOwogCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo4NTA4OjI6ICggKCAob3RoZXJsdl8wPSAnKCcgKCAoIChsdl9wYXJhbVR5cGVzXzFfMD0gcnVsZUp2bVR5cGVSZWZlcmVuY2UgKSApIChvdGhlcmx2XzI9ICcsJyAoIChsdl9wYXJhbVR5cGVzXzNfMD0gcnVsZUp2bVR5cGVSZWZlcmVuY2UgKSApICkqICk/IG90aGVybHZfND0gJyknICk/IG90aGVybHZfNT0gJz0+JyAoIChsdl9yZXR1cm5UeXBlXzZfMD0gcnVsZUp2bVR5cGVSZWZlcmVuY2UgKSApICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6ODUwOToyOiAoIChvdGhlcmx2XzA9ICcoJyAoICggKGx2X3BhcmFtVHlwZXNfMV8wPSBydWxlSnZtVHlwZVJlZmVyZW5jZSApICkgKG90aGVybHZfMj0gJywnICggKGx2X3BhcmFtVHlwZXNfM18wPSBydWxlSnZtVHlwZVJlZmVyZW5jZSApICkgKSogKT8gb3RoZXJsdl80PSAnKScgKT8gb3RoZXJsdl81PSAnPT4nICggKGx2X3JldHVyblR5cGVfNl8wPSBydWxlSnZtVHlwZVJlZmVyZW5jZSApICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6ODk0NzoyOiAoICggKG90aGVybHZfMD0gJygnICggKCAobHZfcGFyYW1UeXBlc18xXzA9IHJ1bGVKdm1UeXBlUmVmZXJlbmNlICkgKSAob3RoZXJsdl8yPSAnLCcgKCAobHZfcGFyYW1UeXBlc18zXzA9IHJ1bGVKdm1UeXBlUmVmZXJlbmNlICkgKSApKiApPyBvdGhlcmx2XzQ9ICcpJyApPyBvdGhlcmx2XzU9ICc9PicgKCAobHZfcmV0dXJuVHlwZV82XzA9IHJ1bGVKdm1UeXBlUmVmZXJlbmNlICkgKSApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjg5NDg6MjogKCAob3RoZXJsdl8wPSAnKCcgKCAoIChsdl9wYXJhbVR5cGVzXzFfMD0gcnVsZUp2bVR5cGVSZWZlcmVuY2UgKSApIChvdGhlcmx2XzI9ICcsJyAoIChsdl9wYXJhbVR5cGVzXzNfMD0gcnVsZUp2bVR5cGVSZWZlcmVuY2UgKSApICkqICk/IG90aGVybHZfND0gJyknICk/IG90aGVybHZfNT0gJz0+JyAoIChsdl9yZXR1cm5UeXBlXzZfMD0gcnVsZUp2bVR5cGVSZWZlcmVuY2UgKSApICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjg1MDk6MjogKCAob3RoZXJsdl8wPSAnKCcgKCAoIChsdl9wYXJhbVR5cGVzXzFfMD0gcnVsZUp2bVR5cGVSZWZlcmVuY2UgKSApIChvdGhlcmx2XzI9ICcsJyAoIChsdl9wYXJhbVR5cGVzXzNfMD0gcnVsZUp2bVR5cGVSZWZlcmVuY2UgKSApICkqICk/IG90aGVybHZfND0gJyknICk/IG90aGVybHZfNT0gJz0+JyAoIChsdl9yZXR1cm5UeXBlXzZfMD0gcnVsZUp2bVR5cGVSZWZlcmVuY2UgKSApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjg1MTA6MzogKG90aGVybHZfMD0gJygnICggKCAobHZfcGFyYW1UeXBlc18xXzA9IHJ1bGVKdm1UeXBlUmVmZXJlbmNlICkgKSAob3RoZXJsdl8yPSAnLCcgKCAobHZfcGFyYW1UeXBlc18zXzA9IHJ1bGVKdm1UeXBlUmVmZXJlbmNlICkgKSApKiApPyBvdGhlcmx2XzQ9ICcpJyApPyBvdGhlcmx2XzU9ICc9PicgKCAobHZfcmV0dXJuVHlwZV82XzA9IHJ1bGVKdm1UeXBlUmVmZXJlbmNlICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6ODk0ODoyOiAoIChvdGhlcmx2XzA9ICcoJyAoICggKGx2X3BhcmFtVHlwZXNfMV8wPSBydWxlSnZtVHlwZVJlZmVyZW5jZSApICkgKG90aGVybHZfMj0gJywnICggKGx2X3BhcmFtVHlwZXNfM18wPSBydWxlSnZtVHlwZVJlZmVyZW5jZSApICkgKSogKT8gb3RoZXJsdl80PSAnKScgKT8gb3RoZXJsdl81PSAnPT4nICggKGx2X3JldHVyblR5cGVfNl8wPSBydWxlSnZtVHlwZVJlZmVyZW5jZSApICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6ODk0OTozOiAob3RoZXJsdl8wPSAnKCcgKCAoIChsdl9wYXJhbVR5cGVzXzFfMD0gcnVsZUp2bVR5cGVSZWZlcmVuY2UgKSApIChvdGhlcmx2XzI9ICcsJyAoIChsdl9wYXJhbVR5cGVzXzNfMD0gcnVsZUp2bVR5cGVSZWZlcmVuY2UgKSApICkqICk/IG90aGVybHZfND0gJyknICk/IG90aGVybHZfNT0gJz0+JyAoIChsdl9yZXR1cm5UeXBlXzZfMD0gcnVsZUp2bVR5cGVSZWZlcmVuY2UgKSApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo4NTEwOjM6IChvdGhlcmx2XzA9ICcoJyAoICggKGx2X3BhcmFtVHlwZXNfMV8wPSBydWxlSnZtVHlwZVJlZmVyZW5jZSApICkgKG90aGVybHZfMj0gJywnICggKGx2X3BhcmFtVHlwZXNfM18wPSBydWxlSnZtVHlwZVJlZmVyZW5jZSApICkgKSogKT8gb3RoZXJsdl80PSAnKScgKT8KLSAgICAgICAgICAgIGludCBhbHQxNTA9MjsKLSAgICAgICAgICAgIGludCBMQTE1MF8wID0gaW5wdXQuTEEoMSk7CisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo4OTQ5OjM6IChvdGhlcmx2XzA9ICcoJyAoICggKGx2X3BhcmFtVHlwZXNfMV8wPSBydWxlSnZtVHlwZVJlZmVyZW5jZSApICkgKG90aGVybHZfMj0gJywnICggKGx2X3BhcmFtVHlwZXNfM18wPSBydWxlSnZtVHlwZVJlZmVyZW5jZSApICkgKSogKT8gb3RoZXJsdl80PSAnKScgKT8KKyAgICAgICAgICAgIGludCBhbHQxNjE9MjsKKyAgICAgICAgICAgIGludCBMQTE2MV8wID0gaW5wdXQuTEEoMSk7CiAKLSAgICAgICAgICAgIGlmICggKExBMTUwXzA9PTc0KSApIHsKLSAgICAgICAgICAgICAgICBhbHQxNTA9MTsKKyAgICAgICAgICAgIGlmICggKExBMTYxXzA9PTgxKSApIHsKKyAgICAgICAgICAgICAgICBhbHQxNjE9MTsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHN3aXRjaCAoYWx0MTUwKSB7CisgICAgICAgICAgICBzd2l0Y2ggKGFsdDE2MSkgewogICAgICAgICAgICAgICAgIGNhc2UgMSA6Ci0gICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjg1MTE6NDogb3RoZXJsdl8wPSAnKCcgKCAoIChsdl9wYXJhbVR5cGVzXzFfMD0gcnVsZUp2bVR5cGVSZWZlcmVuY2UgKSApIChvdGhlcmx2XzI9ICcsJyAoIChsdl9wYXJhbVR5cGVzXzNfMD0gcnVsZUp2bVR5cGVSZWZlcmVuY2UgKSApICkqICk/IG90aGVybHZfND0gJyknCisgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjg5NTA6NDogb3RoZXJsdl8wPSAnKCcgKCAoIChsdl9wYXJhbVR5cGVzXzFfMD0gcnVsZUp2bVR5cGVSZWZlcmVuY2UgKSApIChvdGhlcmx2XzI9ICcsJyAoIChsdl9wYXJhbVR5cGVzXzNfMD0gcnVsZUp2bVR5cGVSZWZlcmVuY2UgKSApICkqICk/IG90aGVybHZfND0gJyknCiAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgb3RoZXJsdl8wPShUb2tlbiltYXRjaChpbnB1dCw3NCxGT0xMT1dfMTI3KTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7CisgICAgICAgICAgICAgICAgICAgIG90aGVybHZfMD0oVG9rZW4pbWF0Y2goaW5wdXQsODEsRk9MTE9XXzE0MCk7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OwogICAgICAgICAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKIAogICAgICAgICAgICAgICAgICAgICAgIAkJCQluZXdMZWFmTm9kZShvdGhlcmx2XzAsIGdyYW1tYXJBY2Nlc3MuZ2V0WEZ1bmN0aW9uVHlwZVJlZkFjY2VzcygpLmdldExlZnRQYXJlbnRoZXNpc0tleXdvcmRfMF8wKCkpOwogICAgICAgICAgICAgICAgICAgICAgIAkJCQogICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjg1MTU6NDogKCAoIChsdl9wYXJhbVR5cGVzXzFfMD0gcnVsZUp2bVR5cGVSZWZlcmVuY2UgKSApIChvdGhlcmx2XzI9ICcsJyAoIChsdl9wYXJhbVR5cGVzXzNfMD0gcnVsZUp2bVR5cGVSZWZlcmVuY2UgKSApICkqICk/Ci0gICAgICAgICAgICAgICAgICAgIGludCBhbHQxNDk9MjsKLSAgICAgICAgICAgICAgICAgICAgaW50IExBMTQ5XzAgPSBpbnB1dC5MQSgxKTsKKyAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6ODk1NDo0OiAoICggKGx2X3BhcmFtVHlwZXNfMV8wPSBydWxlSnZtVHlwZVJlZmVyZW5jZSApICkgKG90aGVybHZfMj0gJywnICggKGx2X3BhcmFtVHlwZXNfM18wPSBydWxlSnZtVHlwZVJlZmVyZW5jZSApICkgKSogKT8KKyAgICAgICAgICAgICAgICAgICAgaW50IGFsdDE2MD0yOworICAgICAgICAgICAgICAgICAgICBpbnQgTEExNjBfMCA9IGlucHV0LkxBKDEpOwogCi0gICAgICAgICAgICAgICAgICAgIGlmICggKExBMTQ5XzA9PVJVTEVfSUR8fExBMTQ5XzA9PTc0fHxMQTE0OV8wPT05OSkgKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBhbHQxNDk9MTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCAoTEExNjBfMD09UlVMRV9JRHx8TEExNjBfMD09ODF8fExBMTYwXzA9PTEwNikgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBhbHQxNjA9MTsKICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKGFsdDE0OSkgeworICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKGFsdDE2MCkgewogICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxIDoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo4NTE2OjU6ICggKGx2X3BhcmFtVHlwZXNfMV8wPSBydWxlSnZtVHlwZVJlZmVyZW5jZSApICkgKG90aGVybHZfMj0gJywnICggKGx2X3BhcmFtVHlwZXNfM18wPSBydWxlSnZtVHlwZVJlZmVyZW5jZSApICkgKSoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo4OTU1OjU6ICggKGx2X3BhcmFtVHlwZXNfMV8wPSBydWxlSnZtVHlwZVJlZmVyZW5jZSApICkgKG90aGVybHZfMj0gJywnICggKGx2X3BhcmFtVHlwZXNfM18wPSBydWxlSnZtVHlwZVJlZmVyZW5jZSApICkgKSoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6ODUxNjo1OiAoIChsdl9wYXJhbVR5cGVzXzFfMD0gcnVsZUp2bVR5cGVSZWZlcmVuY2UgKSApCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6ODUxNzo2OiAobHZfcGFyYW1UeXBlc18xXzA9IHJ1bGVKdm1UeXBlUmVmZXJlbmNlICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo4OTU1OjU6ICggKGx2X3BhcmFtVHlwZXNfMV8wPSBydWxlSnZtVHlwZVJlZmVyZW5jZSApICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo4OTU2OjY6IChsdl9wYXJhbVR5cGVzXzFfMD0gcnVsZUp2bVR5cGVSZWZlcmVuY2UgKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo4NTE3OjY6IChsdl9wYXJhbVR5cGVzXzFfMD0gcnVsZUp2bVR5cGVSZWZlcmVuY2UgKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjg1MTg6NzogbHZfcGFyYW1UeXBlc18xXzA9IHJ1bGVKdm1UeXBlUmVmZXJlbmNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6ODk1Njo2OiAobHZfcGFyYW1UeXBlc18xXzA9IHJ1bGVKdm1UeXBlUmVmZXJlbmNlICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo4OTU3Ojc6IGx2X3BhcmFtVHlwZXNfMV8wPSBydWxlSnZtVHlwZVJlZmVyZW5jZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCQkJCQkJCW5ld0NvbXBvc2l0ZU5vZGUoZ3JhbW1hckFjY2Vzcy5nZXRYRnVuY3Rpb25UeXBlUmVmQWNjZXNzKCkuZ2V0UGFyYW1UeXBlc0p2bVR5cGVSZWZlcmVuY2VQYXJzZXJSdWxlQ2FsbF8wXzFfMF8wKCkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCQkJCQkJCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzYxKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV183NSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbHZfcGFyYW1UeXBlc18xXzA9cnVsZUp2bVR5cGVSZWZlcmVuY2UoKTsKIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlLl9mc3AtLTsKQEAgLTIzMjkxLDM5ICsyNDQ4NSwzOSBAQAogCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6ODUzNTo1OiAob3RoZXJsdl8yPSAnLCcgKCAobHZfcGFyYW1UeXBlc18zXzA9IHJ1bGVKdm1UeXBlUmVmZXJlbmNlICkgKSApKgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvb3AxNDg6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6ODk3NDo1OiAob3RoZXJsdl8yPSAnLCcgKCAobHZfcGFyYW1UeXBlc18zXzA9IHJ1bGVKdm1UeXBlUmVmZXJlbmNlICkgKSApKgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvb3AxNTk6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG8gewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYWx0MTQ4PTI7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBMQTE0OF8wID0gaW5wdXQuTEEoMSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBhbHQxNTk9MjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IExBMTU5XzAgPSBpbnB1dC5MQSgxKTsKIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIChMQTE0OF8wPT03NSkgKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbHQxNDg9MTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCAoTEExNTlfMD09ODIpICkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWx0MTU5PTE7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KIAogCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoYWx0MTQ4KSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoYWx0MTU5KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCWNhc2UgMSA6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgCSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo4NTM2OjY6IG90aGVybHZfMj0gJywnICggKGx2X3BhcmFtVHlwZXNfM18wPSBydWxlSnZtVHlwZVJlZmVyZW5jZSApICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAJICAgIC8vIEludGVybmFsRGF0YURTTC5nOjg5NzU6Njogb3RoZXJsdl8yPSAnLCcgKCAobHZfcGFyYW1UeXBlc18zXzA9IHJ1bGVKdm1UeXBlUmVmZXJlbmNlICkgKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIAkgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIAkgICAgb3RoZXJsdl8yPShUb2tlbiltYXRjaChpbnB1dCw3NSxGT0xMT1dfNzcpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gY3VycmVudDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAJICAgIG90aGVybHZfMj0oVG9rZW4pbWF0Y2goaW5wdXQsODIsRk9MTE9XXzkxKTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCSAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIAkgICAgICAJCQkJCQluZXdMZWFmTm9kZShvdGhlcmx2XzIsIGdyYW1tYXJBY2Nlc3MuZ2V0WEZ1bmN0aW9uVHlwZVJlZkFjY2VzcygpLmdldENvbW1hS2V5d29yZF8wXzFfMV8wKCkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIAkgICAgICAJCQkJCQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIAkgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIAkgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6ODU0MDo2OiAoIChsdl9wYXJhbVR5cGVzXzNfMD0gcnVsZUp2bVR5cGVSZWZlcmVuY2UgKSApCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgCSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo4NTQxOjc6IChsdl9wYXJhbVR5cGVzXzNfMD0gcnVsZUp2bVR5cGVSZWZlcmVuY2UgKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIAkgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6ODk3OTo2OiAoIChsdl9wYXJhbVR5cGVzXzNfMD0gcnVsZUp2bVR5cGVSZWZlcmVuY2UgKSApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgCSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo4OTgwOjc6IChsdl9wYXJhbVR5cGVzXzNfMD0gcnVsZUp2bVR5cGVSZWZlcmVuY2UgKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIAkgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIAkgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6ODU0MTo3OiAobHZfcGFyYW1UeXBlc18zXzA9IHJ1bGVKdm1UeXBlUmVmZXJlbmNlICkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAJICAgIC8vIEludGVybmFsRGF0YURTTC5nOjg1NDI6ODogbHZfcGFyYW1UeXBlc18zXzA9IHJ1bGVKdm1UeXBlUmVmZXJlbmNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgCSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo4OTgwOjc6IChsdl9wYXJhbVR5cGVzXzNfMD0gcnVsZUp2bVR5cGVSZWZlcmVuY2UgKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIAkgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6ODk4MTo4OiBsdl9wYXJhbVR5cGVzXzNfMD0gcnVsZUp2bVR5cGVSZWZlcmVuY2UKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAJICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAJICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCSAgICAgIAkJCQkJCQkJbmV3Q29tcG9zaXRlTm9kZShncmFtbWFyQWNjZXNzLmdldFhGdW5jdGlvblR5cGVSZWZBY2Nlc3MoKS5nZXRQYXJhbVR5cGVzSnZtVHlwZVJlZmVyZW5jZVBhcnNlclJ1bGVDYWxsXzBfMV8xXzFfMCgpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAJICAgICAgCQkJCQkJCQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIAkgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIAkgICAgcHVzaEZvbGxvdyhGT0xMT1dfNjEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIAkgICAgcHVzaEZvbGxvdyhGT0xMT1dfNzUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIAkgICAgbHZfcGFyYW1UeXBlc18zXzA9cnVsZUp2bVR5cGVSZWZlcmVuY2UoKTsKIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIAkgICAgc3RhdGUuX2ZzcC0tOwpAQCAtMjMzNTIsNyArMjQ1NDYsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIAkgICAgYnJlYWs7CiAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAJZGVmYXVsdCA6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgCSAgICBicmVhayBsb29wMTQ4OworICAgICAgICAgICAgICAgICAgICAgICAgICAgIAkgICAgYnJlYWsgbG9vcDE1OTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gd2hpbGUgKHRydWUpOwogCkBAIC0yMzM2Miw3ICsyNDU1Niw3IEBACiAKICAgICAgICAgICAgICAgICAgICAgfQogCi0gICAgICAgICAgICAgICAgICAgIG90aGVybHZfND0oVG9rZW4pbWF0Y2goaW5wdXQsNzYsRk9MTE9XXzEyOCk7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OworICAgICAgICAgICAgICAgICAgICBvdGhlcmx2XzQ9KFRva2VuKW1hdGNoKGlucHV0LDgzLEZPTExPV18xNDEpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gY3VycmVudDsKICAgICAgICAgICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAKICAgICAgICAgICAgICAgICAgICAgICAJCQkJbmV3TGVhZk5vZGUob3RoZXJsdl80LCBncmFtbWFyQWNjZXNzLmdldFhGdW5jdGlvblR5cGVSZWZBY2Nlc3MoKS5nZXRSaWdodFBhcmVudGhlc2lzS2V5d29yZF8wXzIoKSk7CkBAIC0yMzM3NCwxNyArMjQ1NjgsMTcgQEAKIAogICAgICAgICAgICAgfQogCi0gICAgICAgICAgICBvdGhlcmx2XzU9KFRva2VuKW1hdGNoKGlucHV0LDk5LEZPTExPV183Nyk7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OworICAgICAgICAgICAgb3RoZXJsdl81PShUb2tlbiltYXRjaChpbnB1dCwxMDYsRk9MTE9XXzkxKTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKIAogICAgICAgICAgICAgICAJCQluZXdMZWFmTm9kZShvdGhlcmx2XzUsIGdyYW1tYXJBY2Nlc3MuZ2V0WEZ1bmN0aW9uVHlwZVJlZkFjY2VzcygpLmdldEVxdWFsc1NpZ25HcmVhdGVyVGhhblNpZ25LZXl3b3JkXzEoKSk7CiAgICAgICAgICAgICAgIAkJCiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo4NTcwOjM6ICggKGx2X3JldHVyblR5cGVfNl8wPSBydWxlSnZtVHlwZVJlZmVyZW5jZSApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjg1NzE6NDogKGx2X3JldHVyblR5cGVfNl8wPSBydWxlSnZtVHlwZVJlZmVyZW5jZSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo5MDA5OjM6ICggKGx2X3JldHVyblR5cGVfNl8wPSBydWxlSnZtVHlwZVJlZmVyZW5jZSApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjkwMTA6NDogKGx2X3JldHVyblR5cGVfNl8wPSBydWxlSnZtVHlwZVJlZmVyZW5jZSApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo4NTcxOjQ6IChsdl9yZXR1cm5UeXBlXzZfMD0gcnVsZUp2bVR5cGVSZWZlcmVuY2UgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6ODU3Mjo1OiBsdl9yZXR1cm5UeXBlXzZfMD0gcnVsZUp2bVR5cGVSZWZlcmVuY2UKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjkwMTA6NDogKGx2X3JldHVyblR5cGVfNl8wPSBydWxlSnZtVHlwZVJlZmVyZW5jZSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo5MDExOjU6IGx2X3JldHVyblR5cGVfNl8wPSBydWxlSnZtVHlwZVJlZmVyZW5jZQogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAKQEAgLTIzNDQwLDcgKzI0NjM0LDcgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJlbnRyeVJ1bGVKdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZSIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo4NTkzOjE6IGVudHJ5UnVsZUp2bVBhcmFtZXRlcml6ZWRUeXBlUmVmZXJlbmNlIHJldHVybnMgW0VPYmplY3QgY3VycmVudD1udWxsXSA6IGl2X3J1bGVKdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZT0gcnVsZUp2bVBhcmFtZXRlcml6ZWRUeXBlUmVmZXJlbmNlIEVPRiA7CisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6OTAzMjoxOiBlbnRyeVJ1bGVKdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZSByZXR1cm5zIFtFT2JqZWN0IGN1cnJlbnQ9bnVsbF0gOiBpdl9ydWxlSnZtUGFyYW1ldGVyaXplZFR5cGVSZWZlcmVuY2U9IHJ1bGVKdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZSBFT0YgOwogICAgIHB1YmxpYyBmaW5hbCBFT2JqZWN0IGVudHJ5UnVsZUp2bVBhcmFtZXRlcml6ZWRUeXBlUmVmZXJlbmNlKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKICAgICAgICAgRU9iamVjdCBjdXJyZW50ID0gbnVsbDsKIApAQCAtMjM0NDgsOCArMjQ2NDIsOCBAQAogCiAKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjg1OTM6NzA6IChpdl9ydWxlSnZtUGFyYW1ldGVyaXplZFR5cGVSZWZlcmVuY2U9IHJ1bGVKdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZSBFT0YgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6ODU5NDoyOiBpdl9ydWxlSnZtUGFyYW1ldGVyaXplZFR5cGVSZWZlcmVuY2U9IHJ1bGVKdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZSBFT0YKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjkwMzI6NzA6IChpdl9ydWxlSnZtUGFyYW1ldGVyaXplZFR5cGVSZWZlcmVuY2U9IHJ1bGVKdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZSBFT0YgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6OTAzMzoyOiBpdl9ydWxlSnZtUGFyYW1ldGVyaXplZFR5cGVSZWZlcmVuY2U9IHJ1bGVKdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZSBFT0YKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgbmV3Q29tcG9zaXRlTm9kZShncmFtbWFyQWNjZXNzLmdldEp2bVBhcmFtZXRlcml6ZWRUeXBlUmVmZXJlbmNlUnVsZSgpKTsgCkBAIC0yMzQ4MCw3ICsyNDY3NCw3IEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZUp2bVBhcmFtZXRlcml6ZWRUeXBlUmVmZXJlbmNlIgotICAgIC8vIEludGVybmFsRGF0YURTTC5nOjg2MDA6MTogcnVsZUp2bVBhcmFtZXRlcml6ZWRUeXBlUmVmZXJlbmNlIHJldHVybnMgW0VPYmplY3QgY3VycmVudD1udWxsXSA6ICggKCAoIHJ1bGVRdWFsaWZpZWROYW1lICkgKSAoICggKCAnPCcgKT0+b3RoZXJsdl8xPSAnPCcgKSAoIChsdl9hcmd1bWVudHNfMl8wPSBydWxlSnZtQXJndW1lbnRUeXBlUmVmZXJlbmNlICkgKSAob3RoZXJsdl8zPSAnLCcgKCAobHZfYXJndW1lbnRzXzRfMD0gcnVsZUp2bUFyZ3VtZW50VHlwZVJlZmVyZW5jZSApICkgKSogb3RoZXJsdl81PSAnPicgKCAoICggKCAoKSAnLicgKSApPT4gKCAoKSBvdGhlcmx2Xzc9ICcuJyApICkgKCAoIHJ1bGVWYWxpZElEICkgKSAoICggKCAnPCcgKT0+b3RoZXJsdl85PSAnPCcgKSAoIChsdl9hcmd1bWVudHNfMTBfMD0gcnVsZUp2bUFyZ3VtZW50VHlwZVJlZmVyZW5jZSApICkgKG90aGVybHZfMTE9ICcsJyAoIChsdl9hcmd1bWVudHNfMTJfMD0gcnVsZUp2bUFyZ3VtZW50VHlwZVJlZmVyZW5jZSApICkgKSogb3RoZXJsdl8xMz0gJz4nICk/ICkqICk/ICkgOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjkwMzk6MTogcnVsZUp2bVBhcmFtZXRlcml6ZWRUeXBlUmVmZXJlbmNlIHJldHVybnMgW0VPYmplY3QgY3VycmVudD1udWxsXSA6ICggKCAoIHJ1bGVRdWFsaWZpZWROYW1lICkgKSAoICggKCAnPCcgKT0+b3RoZXJsdl8xPSAnPCcgKSAoIChsdl9hcmd1bWVudHNfMl8wPSBydWxlSnZtQXJndW1lbnRUeXBlUmVmZXJlbmNlICkgKSAob3RoZXJsdl8zPSAnLCcgKCAobHZfYXJndW1lbnRzXzRfMD0gcnVsZUp2bUFyZ3VtZW50VHlwZVJlZmVyZW5jZSApICkgKSogb3RoZXJsdl81PSAnPicgKCAoICggKCAoKSAnLicgKSApPT4gKCAoKSBvdGhlcmx2Xzc9ICcuJyApICkgKCAoIHJ1bGVWYWxpZElEICkgKSAoICggKCAnPCcgKT0+b3RoZXJsdl85PSAnPCcgKSAoIChsdl9hcmd1bWVudHNfMTBfMD0gcnVsZUp2bUFyZ3VtZW50VHlwZVJlZmVyZW5jZSApICkgKG90aGVybHZfMTE9ICcsJyAoIChsdl9hcmd1bWVudHNfMTJfMD0gcnVsZUp2bUFyZ3VtZW50VHlwZVJlZmVyZW5jZSApICkgKSogb3RoZXJsdl8xMz0gJz4nICk/ICkqICk/ICkgOwogICAgIHB1YmxpYyBmaW5hbCBFT2JqZWN0IHJ1bGVKdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAgICAgICAgIEVPYmplY3QgY3VycmVudCA9IG51bGw7CiAKQEAgLTIzNTA0LDE3ICsyNDY5OCwxNyBAQAogICAgICAgICAJZW50ZXJSdWxlKCk7CiAKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjg2MDY6MjogKCAoICggKCBydWxlUXVhbGlmaWVkTmFtZSApICkgKCAoICggJzwnICk9Pm90aGVybHZfMT0gJzwnICkgKCAobHZfYXJndW1lbnRzXzJfMD0gcnVsZUp2bUFyZ3VtZW50VHlwZVJlZmVyZW5jZSApICkgKG90aGVybHZfMz0gJywnICggKGx2X2FyZ3VtZW50c180XzA9IHJ1bGVKdm1Bcmd1bWVudFR5cGVSZWZlcmVuY2UgKSApICkqIG90aGVybHZfNT0gJz4nICggKCAoICggKCkgJy4nICkgKT0+ICggKCkgb3RoZXJsdl83PSAnLicgKSApICggKCBydWxlVmFsaWRJRCApICkgKCAoICggJzwnICk9Pm90aGVybHZfOT0gJzwnICkgKCAobHZfYXJndW1lbnRzXzEwXzA9IHJ1bGVKdm1Bcmd1bWVudFR5cGVSZWZlcmVuY2UgKSApIChvdGhlcmx2XzExPSAnLCcgKCAobHZfYXJndW1lbnRzXzEyXzA9IHJ1bGVKdm1Bcmd1bWVudFR5cGVSZWZlcmVuY2UgKSApICkqIG90aGVybHZfMTM9ICc+JyApPyApKiApPyApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjg2MDc6MjogKCAoICggcnVsZVF1YWxpZmllZE5hbWUgKSApICggKCAoICc8JyApPT5vdGhlcmx2XzE9ICc8JyApICggKGx2X2FyZ3VtZW50c18yXzA9IHJ1bGVKdm1Bcmd1bWVudFR5cGVSZWZlcmVuY2UgKSApIChvdGhlcmx2XzM9ICcsJyAoIChsdl9hcmd1bWVudHNfNF8wPSBydWxlSnZtQXJndW1lbnRUeXBlUmVmZXJlbmNlICkgKSApKiBvdGhlcmx2XzU9ICc+JyAoICggKCAoICgpICcuJyApICk9PiAoICgpIG90aGVybHZfNz0gJy4nICkgKSAoICggcnVsZVZhbGlkSUQgKSApICggKCAoICc8JyApPT5vdGhlcmx2Xzk9ICc8JyApICggKGx2X2FyZ3VtZW50c18xMF8wPSBydWxlSnZtQXJndW1lbnRUeXBlUmVmZXJlbmNlICkgKSAob3RoZXJsdl8xMT0gJywnICggKGx2X2FyZ3VtZW50c18xMl8wPSBydWxlSnZtQXJndW1lbnRUeXBlUmVmZXJlbmNlICkgKSApKiBvdGhlcmx2XzEzPSAnPicgKT8gKSogKT8gKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6OTA0NToyOiAoICggKCAoIHJ1bGVRdWFsaWZpZWROYW1lICkgKSAoICggKCAnPCcgKT0+b3RoZXJsdl8xPSAnPCcgKSAoIChsdl9hcmd1bWVudHNfMl8wPSBydWxlSnZtQXJndW1lbnRUeXBlUmVmZXJlbmNlICkgKSAob3RoZXJsdl8zPSAnLCcgKCAobHZfYXJndW1lbnRzXzRfMD0gcnVsZUp2bUFyZ3VtZW50VHlwZVJlZmVyZW5jZSApICkgKSogb3RoZXJsdl81PSAnPicgKCAoICggKCAoKSAnLicgKSApPT4gKCAoKSBvdGhlcmx2Xzc9ICcuJyApICkgKCAoIHJ1bGVWYWxpZElEICkgKSAoICggKCAnPCcgKT0+b3RoZXJsdl85PSAnPCcgKSAoIChsdl9hcmd1bWVudHNfMTBfMD0gcnVsZUp2bUFyZ3VtZW50VHlwZVJlZmVyZW5jZSApICkgKG90aGVybHZfMTE9ICcsJyAoIChsdl9hcmd1bWVudHNfMTJfMD0gcnVsZUp2bUFyZ3VtZW50VHlwZVJlZmVyZW5jZSApICkgKSogb3RoZXJsdl8xMz0gJz4nICk/ICkqICk/ICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6OTA0NjoyOiAoICggKCBydWxlUXVhbGlmaWVkTmFtZSApICkgKCAoICggJzwnICk9Pm90aGVybHZfMT0gJzwnICkgKCAobHZfYXJndW1lbnRzXzJfMD0gcnVsZUp2bUFyZ3VtZW50VHlwZVJlZmVyZW5jZSApICkgKG90aGVybHZfMz0gJywnICggKGx2X2FyZ3VtZW50c180XzA9IHJ1bGVKdm1Bcmd1bWVudFR5cGVSZWZlcmVuY2UgKSApICkqIG90aGVybHZfNT0gJz4nICggKCAoICggKCkgJy4nICkgKT0+ICggKCkgb3RoZXJsdl83PSAnLicgKSApICggKCBydWxlVmFsaWRJRCApICkgKCAoICggJzwnICk9Pm90aGVybHZfOT0gJzwnICkgKCAobHZfYXJndW1lbnRzXzEwXzA9IHJ1bGVKdm1Bcmd1bWVudFR5cGVSZWZlcmVuY2UgKSApIChvdGhlcmx2XzExPSAnLCcgKCAobHZfYXJndW1lbnRzXzEyXzA9IHJ1bGVKdm1Bcmd1bWVudFR5cGVSZWZlcmVuY2UgKSApICkqIG90aGVybHZfMTM9ICc+JyApPyApKiApPyApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo4NjA3OjI6ICggKCAoIHJ1bGVRdWFsaWZpZWROYW1lICkgKSAoICggKCAnPCcgKT0+b3RoZXJsdl8xPSAnPCcgKSAoIChsdl9hcmd1bWVudHNfMl8wPSBydWxlSnZtQXJndW1lbnRUeXBlUmVmZXJlbmNlICkgKSAob3RoZXJsdl8zPSAnLCcgKCAobHZfYXJndW1lbnRzXzRfMD0gcnVsZUp2bUFyZ3VtZW50VHlwZVJlZmVyZW5jZSApICkgKSogb3RoZXJsdl81PSAnPicgKCAoICggKCAoKSAnLicgKSApPT4gKCAoKSBvdGhlcmx2Xzc9ICcuJyApICkgKCAoIHJ1bGVWYWxpZElEICkgKSAoICggKCAnPCcgKT0+b3RoZXJsdl85PSAnPCcgKSAoIChsdl9hcmd1bWVudHNfMTBfMD0gcnVsZUp2bUFyZ3VtZW50VHlwZVJlZmVyZW5jZSApICkgKG90aGVybHZfMTE9ICcsJyAoIChsdl9hcmd1bWVudHNfMTJfMD0gcnVsZUp2bUFyZ3VtZW50VHlwZVJlZmVyZW5jZSApICkgKSogb3RoZXJsdl8xMz0gJz4nICk/ICkqICk/ICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjg2MDg6MzogKCAoIHJ1bGVRdWFsaWZpZWROYW1lICkgKSAoICggKCAnPCcgKT0+b3RoZXJsdl8xPSAnPCcgKSAoIChsdl9hcmd1bWVudHNfMl8wPSBydWxlSnZtQXJndW1lbnRUeXBlUmVmZXJlbmNlICkgKSAob3RoZXJsdl8zPSAnLCcgKCAobHZfYXJndW1lbnRzXzRfMD0gcnVsZUp2bUFyZ3VtZW50VHlwZVJlZmVyZW5jZSApICkgKSogb3RoZXJsdl81PSAnPicgKCAoICggKCAoKSAnLicgKSApPT4gKCAoKSBvdGhlcmx2Xzc9ICcuJyApICkgKCAoIHJ1bGVWYWxpZElEICkgKSAoICggKCAnPCcgKT0+b3RoZXJsdl85PSAnPCcgKSAoIChsdl9hcmd1bWVudHNfMTBfMD0gcnVsZUp2bUFyZ3VtZW50VHlwZVJlZmVyZW5jZSApICkgKG90aGVybHZfMTE9ICcsJyAoIChsdl9hcmd1bWVudHNfMTJfMD0gcnVsZUp2bUFyZ3VtZW50VHlwZVJlZmVyZW5jZSApICkgKSogb3RoZXJsdl8xMz0gJz4nICk/ICkqICk/CisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo5MDQ2OjI6ICggKCAoIHJ1bGVRdWFsaWZpZWROYW1lICkgKSAoICggKCAnPCcgKT0+b3RoZXJsdl8xPSAnPCcgKSAoIChsdl9hcmd1bWVudHNfMl8wPSBydWxlSnZtQXJndW1lbnRUeXBlUmVmZXJlbmNlICkgKSAob3RoZXJsdl8zPSAnLCcgKCAobHZfYXJndW1lbnRzXzRfMD0gcnVsZUp2bUFyZ3VtZW50VHlwZVJlZmVyZW5jZSApICkgKSogb3RoZXJsdl81PSAnPicgKCAoICggKCAoKSAnLicgKSApPT4gKCAoKSBvdGhlcmx2Xzc9ICcuJyApICkgKCAoIHJ1bGVWYWxpZElEICkgKSAoICggKCAnPCcgKT0+b3RoZXJsdl85PSAnPCcgKSAoIChsdl9hcmd1bWVudHNfMTBfMD0gcnVsZUp2bUFyZ3VtZW50VHlwZVJlZmVyZW5jZSApICkgKG90aGVybHZfMTE9ICcsJyAoIChsdl9hcmd1bWVudHNfMTJfMD0gcnVsZUp2bUFyZ3VtZW50VHlwZVJlZmVyZW5jZSApICkgKSogb3RoZXJsdl8xMz0gJz4nICk/ICkqICk/ICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjkwNDc6MzogKCAoIHJ1bGVRdWFsaWZpZWROYW1lICkgKSAoICggKCAnPCcgKT0+b3RoZXJsdl8xPSAnPCcgKSAoIChsdl9hcmd1bWVudHNfMl8wPSBydWxlSnZtQXJndW1lbnRUeXBlUmVmZXJlbmNlICkgKSAob3RoZXJsdl8zPSAnLCcgKCAobHZfYXJndW1lbnRzXzRfMD0gcnVsZUp2bUFyZ3VtZW50VHlwZVJlZmVyZW5jZSApICkgKSogb3RoZXJsdl81PSAnPicgKCAoICggKCAoKSAnLicgKSApPT4gKCAoKSBvdGhlcmx2Xzc9ICcuJyApICkgKCAoIHJ1bGVWYWxpZElEICkgKSAoICggKCAnPCcgKT0+b3RoZXJsdl85PSAnPCcgKSAoIChsdl9hcmd1bWVudHNfMTBfMD0gcnVsZUp2bUFyZ3VtZW50VHlwZVJlZmVyZW5jZSApICkgKG90aGVybHZfMTE9ICcsJyAoIChsdl9hcmd1bWVudHNfMTJfMD0gcnVsZUp2bUFyZ3VtZW50VHlwZVJlZmVyZW5jZSApICkgKSogb3RoZXJsdl8xMz0gJz4nICk/ICkqICk/CiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo4NjA4OjM6ICggKCBydWxlUXVhbGlmaWVkTmFtZSApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjg2MDk6NDogKCBydWxlUXVhbGlmaWVkTmFtZSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo5MDQ3OjM6ICggKCBydWxlUXVhbGlmaWVkTmFtZSApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjkwNDg6NDogKCBydWxlUXVhbGlmaWVkTmFtZSApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo4NjA5OjQ6ICggcnVsZVF1YWxpZmllZE5hbWUgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6ODYxMDo1OiBydWxlUXVhbGlmaWVkTmFtZQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6OTA0ODo0OiAoIHJ1bGVRdWFsaWZpZWROYW1lICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjkwNDk6NTogcnVsZVF1YWxpZmllZE5hbWUKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogCkBAIC0yMzUyOCw3ICsyNDcyMiw3IEBACiAgICAgICAgICAgICAgIAkJCQkJbmV3Q29tcG9zaXRlTm9kZShncmFtbWFyQWNjZXNzLmdldEp2bVBhcmFtZXRlcml6ZWRUeXBlUmVmZXJlbmNlQWNjZXNzKCkuZ2V0VHlwZUp2bVR5cGVDcm9zc1JlZmVyZW5jZV8wXzAoKSk7CiAgICAgICAgICAgICAgIAkJCQkKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzEyOSk7CisgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV18xNDIpOwogICAgICAgICAgICAgcnVsZVF1YWxpZmllZE5hbWUoKTsKIAogICAgICAgICAgICAgc3RhdGUuX2ZzcC0tOwpAQCAtMjM1NDQsMTcgKzI0NzM4LDE3IEBACiAKICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6ODYyNDozOiAoICggKCAnPCcgKT0+b3RoZXJsdl8xPSAnPCcgKSAoIChsdl9hcmd1bWVudHNfMl8wPSBydWxlSnZtQXJndW1lbnRUeXBlUmVmZXJlbmNlICkgKSAob3RoZXJsdl8zPSAnLCcgKCAobHZfYXJndW1lbnRzXzRfMD0gcnVsZUp2bUFyZ3VtZW50VHlwZVJlZmVyZW5jZSApICkgKSogb3RoZXJsdl81PSAnPicgKCAoICggKCAoKSAnLicgKSApPT4gKCAoKSBvdGhlcmx2Xzc9ICcuJyApICkgKCAoIHJ1bGVWYWxpZElEICkgKSAoICggKCAnPCcgKT0+b3RoZXJsdl85PSAnPCcgKSAoIChsdl9hcmd1bWVudHNfMTBfMD0gcnVsZUp2bUFyZ3VtZW50VHlwZVJlZmVyZW5jZSApICkgKG90aGVybHZfMTE9ICcsJyAoIChsdl9hcmd1bWVudHNfMTJfMD0gcnVsZUp2bUFyZ3VtZW50VHlwZVJlZmVyZW5jZSApICkgKSogb3RoZXJsdl8xMz0gJz4nICk/ICkqICk/Ci0gICAgICAgICAgICBpbnQgYWx0MTU1PTI7Ci0gICAgICAgICAgICBhbHQxNTUgPSBkZmExNTUucHJlZGljdChpbnB1dCk7Ci0gICAgICAgICAgICBzd2l0Y2ggKGFsdDE1NSkgeworICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6OTA2MzozOiAoICggKCAnPCcgKT0+b3RoZXJsdl8xPSAnPCcgKSAoIChsdl9hcmd1bWVudHNfMl8wPSBydWxlSnZtQXJndW1lbnRUeXBlUmVmZXJlbmNlICkgKSAob3RoZXJsdl8zPSAnLCcgKCAobHZfYXJndW1lbnRzXzRfMD0gcnVsZUp2bUFyZ3VtZW50VHlwZVJlZmVyZW5jZSApICkgKSogb3RoZXJsdl81PSAnPicgKCAoICggKCAoKSAnLicgKSApPT4gKCAoKSBvdGhlcmx2Xzc9ICcuJyApICkgKCAoIHJ1bGVWYWxpZElEICkgKSAoICggKCAnPCcgKT0+b3RoZXJsdl85PSAnPCcgKSAoIChsdl9hcmd1bWVudHNfMTBfMD0gcnVsZUp2bUFyZ3VtZW50VHlwZVJlZmVyZW5jZSApICkgKG90aGVybHZfMTE9ICcsJyAoIChsdl9hcmd1bWVudHNfMTJfMD0gcnVsZUp2bUFyZ3VtZW50VHlwZVJlZmVyZW5jZSApICkgKSogb3RoZXJsdl8xMz0gJz4nICk/ICkqICk/CisgICAgICAgICAgICBpbnQgYWx0MTY2PTI7CisgICAgICAgICAgICBhbHQxNjYgPSBkZmExNjYucHJlZGljdChpbnB1dCk7CisgICAgICAgICAgICBzd2l0Y2ggKGFsdDE2NikgewogICAgICAgICAgICAgICAgIGNhc2UgMSA6Ci0gICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjg2MjU6NDogKCAoICc8JyApPT5vdGhlcmx2XzE9ICc8JyApICggKGx2X2FyZ3VtZW50c18yXzA9IHJ1bGVKdm1Bcmd1bWVudFR5cGVSZWZlcmVuY2UgKSApIChvdGhlcmx2XzM9ICcsJyAoIChsdl9hcmd1bWVudHNfNF8wPSBydWxlSnZtQXJndW1lbnRUeXBlUmVmZXJlbmNlICkgKSApKiBvdGhlcmx2XzU9ICc+JyAoICggKCAoICgpICcuJyApICk9PiAoICgpIG90aGVybHZfNz0gJy4nICkgKSAoICggcnVsZVZhbGlkSUQgKSApICggKCAoICc8JyApPT5vdGhlcmx2Xzk9ICc8JyApICggKGx2X2FyZ3VtZW50c18xMF8wPSBydWxlSnZtQXJndW1lbnRUeXBlUmVmZXJlbmNlICkgKSAob3RoZXJsdl8xMT0gJywnICggKGx2X2FyZ3VtZW50c18xMl8wPSBydWxlSnZtQXJndW1lbnRUeXBlUmVmZXJlbmNlICkgKSApKiBvdGhlcmx2XzEzPSAnPicgKT8gKSoKKyAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6OTA2NDo0OiAoICggJzwnICk9Pm90aGVybHZfMT0gJzwnICkgKCAobHZfYXJndW1lbnRzXzJfMD0gcnVsZUp2bUFyZ3VtZW50VHlwZVJlZmVyZW5jZSApICkgKG90aGVybHZfMz0gJywnICggKGx2X2FyZ3VtZW50c180XzA9IHJ1bGVKdm1Bcmd1bWVudFR5cGVSZWZlcmVuY2UgKSApICkqIG90aGVybHZfNT0gJz4nICggKCAoICggKCkgJy4nICkgKT0+ICggKCkgb3RoZXJsdl83PSAnLicgKSApICggKCBydWxlVmFsaWRJRCApICkgKCAoICggJzwnICk9Pm90aGVybHZfOT0gJzwnICkgKCAobHZfYXJndW1lbnRzXzEwXzA9IHJ1bGVKdm1Bcmd1bWVudFR5cGVSZWZlcmVuY2UgKSApIChvdGhlcmx2XzExPSAnLCcgKCAobHZfYXJndW1lbnRzXzEyXzA9IHJ1bGVKdm1Bcmd1bWVudFR5cGVSZWZlcmVuY2UgKSApICkqIG90aGVybHZfMTM9ICc+JyApPyApKgogICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjg2MjU6NDogKCAoICc8JyApPT5vdGhlcmx2XzE9ICc8JyApCi0gICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjg2MjY6NTogKCAnPCcgKT0+b3RoZXJsdl8xPSAnPCcKKyAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6OTA2NDo0OiAoICggJzwnICk9Pm90aGVybHZfMT0gJzwnICkKKyAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6OTA2NTo1OiAoICc8JyApPT5vdGhlcmx2XzE9ICc8JwogICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIG90aGVybHZfMT0oVG9rZW4pbWF0Y2goaW5wdXQsODYsRk9MTE9XXzg5KTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7CisgICAgICAgICAgICAgICAgICAgIG90aGVybHZfMT0oVG9rZW4pbWF0Y2goaW5wdXQsOTMsRk9MTE9XXzEwMyk7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OwogICAgICAgICAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKIAogICAgICAgICAgICAgICAgICAgICAgIAkJCQkJbmV3TGVhZk5vZGUob3RoZXJsdl8xLCBncmFtbWFyQWNjZXNzLmdldEp2bVBhcmFtZXRlcml6ZWRUeXBlUmVmZXJlbmNlQWNjZXNzKCkuZ2V0TGVzc1RoYW5TaWduS2V5d29yZF8xXzAoKSk7CkBAIC0yMzU2MywxOCArMjQ3NTcsMTggQEAKIAogICAgICAgICAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6ODYzMjo0OiAoIChsdl9hcmd1bWVudHNfMl8wPSBydWxlSnZtQXJndW1lbnRUeXBlUmVmZXJlbmNlICkgKQotICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo4NjMzOjU6IChsdl9hcmd1bWVudHNfMl8wPSBydWxlSnZtQXJndW1lbnRUeXBlUmVmZXJlbmNlICkKKyAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6OTA3MTo0OiAoIChsdl9hcmd1bWVudHNfMl8wPSBydWxlSnZtQXJndW1lbnRUeXBlUmVmZXJlbmNlICkgKQorICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo5MDcyOjU6IChsdl9hcmd1bWVudHNfMl8wPSBydWxlSnZtQXJndW1lbnRUeXBlUmVmZXJlbmNlICkKICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo4NjMzOjU6IChsdl9hcmd1bWVudHNfMl8wPSBydWxlSnZtQXJndW1lbnRUeXBlUmVmZXJlbmNlICkKLSAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6ODYzNDo2OiBsdl9hcmd1bWVudHNfMl8wPSBydWxlSnZtQXJndW1lbnRUeXBlUmVmZXJlbmNlCisgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjkwNzI6NTogKGx2X2FyZ3VtZW50c18yXzA9IHJ1bGVKdm1Bcmd1bWVudFR5cGVSZWZlcmVuY2UgKQorICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo5MDczOjY6IGx2X2FyZ3VtZW50c18yXzA9IHJ1bGVKdm1Bcmd1bWVudFR5cGVSZWZlcmVuY2UKICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKIAogICAgICAgICAgICAgICAgICAgICAgIAkJCQkJCW5ld0NvbXBvc2l0ZU5vZGUoZ3JhbW1hckFjY2Vzcy5nZXRKdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZUFjY2VzcygpLmdldEFyZ3VtZW50c0p2bUFyZ3VtZW50VHlwZVJlZmVyZW5jZVBhcnNlclJ1bGVDYWxsXzFfMV8wKCkpOwogICAgICAgICAgICAgICAgICAgICAgIAkJCQkJCiAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfOTApOworICAgICAgICAgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV18xMDQpOwogICAgICAgICAgICAgICAgICAgICBsdl9hcmd1bWVudHNfMl8wPXJ1bGVKdm1Bcmd1bWVudFR5cGVSZWZlcmVuY2UoKTsKIAogICAgICAgICAgICAgICAgICAgICBzdGF0ZS5fZnNwLS07CkBAIC0yMzU5OCwzOSArMjQ3OTIsMzkgQEAKIAogICAgICAgICAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6ODY1MTo0OiAob3RoZXJsdl8zPSAnLCcgKCAobHZfYXJndW1lbnRzXzRfMD0gcnVsZUp2bUFyZ3VtZW50VHlwZVJlZmVyZW5jZSApICkgKSoKLSAgICAgICAgICAgICAgICAgICAgbG9vcDE1MToKKyAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6OTA5MDo0OiAob3RoZXJsdl8zPSAnLCcgKCAobHZfYXJndW1lbnRzXzRfMD0gcnVsZUp2bUFyZ3VtZW50VHlwZVJlZmVyZW5jZSApICkgKSoKKyAgICAgICAgICAgICAgICAgICAgbG9vcDE2MjoKICAgICAgICAgICAgICAgICAgICAgZG8gewotICAgICAgICAgICAgICAgICAgICAgICAgaW50IGFsdDE1MT0yOwotICAgICAgICAgICAgICAgICAgICAgICAgaW50IExBMTUxXzAgPSBpbnB1dC5MQSgxKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBhbHQxNjI9MjsKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBMQTE2Ml8wID0gaW5wdXQuTEEoMSk7CiAKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICggKExBMTUxXzA9PTc1KSApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbHQxNTE9MTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICggKExBMTYyXzA9PTgyKSApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbHQxNjI9MTsKICAgICAgICAgICAgICAgICAgICAgICAgIH0KIAogCi0gICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKGFsdDE1MSkgeworICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChhbHQxNjIpIHsKICAgICAgICAgICAgICAgICAgICAgCWNhc2UgMSA6Ci0gICAgICAgICAgICAgICAgICAgIAkgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6ODY1Mjo1OiBvdGhlcmx2XzM9ICcsJyAoIChsdl9hcmd1bWVudHNfNF8wPSBydWxlSnZtQXJndW1lbnRUeXBlUmVmZXJlbmNlICkgKQorICAgICAgICAgICAgICAgICAgICAJICAgIC8vIEludGVybmFsRGF0YURTTC5nOjkwOTE6NTogb3RoZXJsdl8zPSAnLCcgKCAobHZfYXJndW1lbnRzXzRfMD0gcnVsZUp2bUFyZ3VtZW50VHlwZVJlZmVyZW5jZSApICkKICAgICAgICAgICAgICAgICAgICAgCSAgICB7Ci0gICAgICAgICAgICAgICAgICAgIAkgICAgb3RoZXJsdl8zPShUb2tlbiltYXRjaChpbnB1dCw3NSxGT0xMT1dfODkpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gY3VycmVudDsKKyAgICAgICAgICAgICAgICAgICAgCSAgICBvdGhlcmx2XzM9KFRva2VuKW1hdGNoKGlucHV0LDgyLEZPTExPV18xMDMpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gY3VycmVudDsKICAgICAgICAgICAgICAgICAgICAgCSAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKIAogICAgICAgICAgICAgICAgICAgICAJICAgICAgCQkJCQluZXdMZWFmTm9kZShvdGhlcmx2XzMsIGdyYW1tYXJBY2Nlc3MuZ2V0SnZtUGFyYW1ldGVyaXplZFR5cGVSZWZlcmVuY2VBY2Nlc3MoKS5nZXRDb21tYUtleXdvcmRfMV8yXzAoKSk7CiAgICAgICAgICAgICAgICAgICAgIAkgICAgICAJCQkJCiAgICAgICAgICAgICAgICAgICAgIAkgICAgfQotICAgICAgICAgICAgICAgICAgICAJICAgIC8vIEludGVybmFsRGF0YURTTC5nOjg2NTY6NTogKCAobHZfYXJndW1lbnRzXzRfMD0gcnVsZUp2bUFyZ3VtZW50VHlwZVJlZmVyZW5jZSApICkKLSAgICAgICAgICAgICAgICAgICAgCSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo4NjU3OjY6IChsdl9hcmd1bWVudHNfNF8wPSBydWxlSnZtQXJndW1lbnRUeXBlUmVmZXJlbmNlICkKKyAgICAgICAgICAgICAgICAgICAgCSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo5MDk1OjU6ICggKGx2X2FyZ3VtZW50c180XzA9IHJ1bGVKdm1Bcmd1bWVudFR5cGVSZWZlcmVuY2UgKSApCisgICAgICAgICAgICAgICAgICAgIAkgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6OTA5Njo2OiAobHZfYXJndW1lbnRzXzRfMD0gcnVsZUp2bUFyZ3VtZW50VHlwZVJlZmVyZW5jZSApCiAgICAgICAgICAgICAgICAgICAgIAkgICAgewotICAgICAgICAgICAgICAgICAgICAJICAgIC8vIEludGVybmFsRGF0YURTTC5nOjg2NTc6NjogKGx2X2FyZ3VtZW50c180XzA9IHJ1bGVKdm1Bcmd1bWVudFR5cGVSZWZlcmVuY2UgKQotICAgICAgICAgICAgICAgICAgICAJICAgIC8vIEludGVybmFsRGF0YURTTC5nOjg2NTg6NzogbHZfYXJndW1lbnRzXzRfMD0gcnVsZUp2bUFyZ3VtZW50VHlwZVJlZmVyZW5jZQorICAgICAgICAgICAgICAgICAgICAJICAgIC8vIEludGVybmFsRGF0YURTTC5nOjkwOTY6NjogKGx2X2FyZ3VtZW50c180XzA9IHJ1bGVKdm1Bcmd1bWVudFR5cGVSZWZlcmVuY2UgKQorICAgICAgICAgICAgICAgICAgICAJICAgIC8vIEludGVybmFsRGF0YURTTC5nOjkwOTc6NzogbHZfYXJndW1lbnRzXzRfMD0gcnVsZUp2bUFyZ3VtZW50VHlwZVJlZmVyZW5jZQogICAgICAgICAgICAgICAgICAgICAJICAgIHsKICAgICAgICAgICAgICAgICAgICAgCSAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKIAogICAgICAgICAgICAgICAgICAgICAJICAgICAgCQkJCQkJCW5ld0NvbXBvc2l0ZU5vZGUoZ3JhbW1hckFjY2Vzcy5nZXRKdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZUFjY2VzcygpLmdldEFyZ3VtZW50c0p2bUFyZ3VtZW50VHlwZVJlZmVyZW5jZVBhcnNlclJ1bGVDYWxsXzFfMl8xXzAoKSk7CiAgICAgICAgICAgICAgICAgICAgIAkgICAgICAJCQkJCQkKICAgICAgICAgICAgICAgICAgICAgCSAgICB9Ci0gICAgICAgICAgICAgICAgICAgIAkgICAgcHVzaEZvbGxvdyhGT0xMT1dfOTApOworICAgICAgICAgICAgICAgICAgICAJICAgIHB1c2hGb2xsb3coRk9MTE9XXzEwNCk7CiAgICAgICAgICAgICAgICAgICAgIAkgICAgbHZfYXJndW1lbnRzXzRfMD1ydWxlSnZtQXJndW1lbnRUeXBlUmVmZXJlbmNlKCk7CiAKICAgICAgICAgICAgICAgICAgICAgCSAgICBzdGF0ZS5fZnNwLS07CkBAIC0yMzY1OSwzMCArMjQ4NTMsMzAgQEAKICAgICAgICAgICAgICAgICAgICAgCSAgICBicmVhazsKIAogICAgICAgICAgICAgICAgICAgICAJZGVmYXVsdCA6Ci0gICAgICAgICAgICAgICAgICAgIAkgICAgYnJlYWsgbG9vcDE1MTsKKyAgICAgICAgICAgICAgICAgICAgCSAgICBicmVhayBsb29wMTYyOwogICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICB9IHdoaWxlICh0cnVlKTsKIAotICAgICAgICAgICAgICAgICAgICBvdGhlcmx2XzU9KFRva2VuKW1hdGNoKGlucHV0LDg3LEZPTExPV181NCk7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OworICAgICAgICAgICAgICAgICAgICBvdGhlcmx2XzU9KFRva2VuKW1hdGNoKGlucHV0LDk0LEZPTExPV182OCk7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OwogICAgICAgICAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKIAogICAgICAgICAgICAgICAgICAgICAgIAkJCQluZXdMZWFmTm9kZShvdGhlcmx2XzUsIGdyYW1tYXJBY2Nlc3MuZ2V0SnZtUGFyYW1ldGVyaXplZFR5cGVSZWZlcmVuY2VBY2Nlc3MoKS5nZXRHcmVhdGVyVGhhblNpZ25LZXl3b3JkXzFfMygpKTsKICAgICAgICAgICAgICAgICAgICAgICAJCQkKICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo4NjgwOjQ6ICggKCAoICggKCkgJy4nICkgKT0+ICggKCkgb3RoZXJsdl83PSAnLicgKSApICggKCBydWxlVmFsaWRJRCApICkgKCAoICggJzwnICk9Pm90aGVybHZfOT0gJzwnICkgKCAobHZfYXJndW1lbnRzXzEwXzA9IHJ1bGVKdm1Bcmd1bWVudFR5cGVSZWZlcmVuY2UgKSApIChvdGhlcmx2XzExPSAnLCcgKCAobHZfYXJndW1lbnRzXzEyXzA9IHJ1bGVKdm1Bcmd1bWVudFR5cGVSZWZlcmVuY2UgKSApICkqIG90aGVybHZfMTM9ICc+JyApPyApKgotICAgICAgICAgICAgICAgICAgICBsb29wMTU0OgorICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo5MTE5OjQ6ICggKCAoICggKCkgJy4nICkgKT0+ICggKCkgb3RoZXJsdl83PSAnLicgKSApICggKCBydWxlVmFsaWRJRCApICkgKCAoICggJzwnICk9Pm90aGVybHZfOT0gJzwnICkgKCAobHZfYXJndW1lbnRzXzEwXzA9IHJ1bGVKdm1Bcmd1bWVudFR5cGVSZWZlcmVuY2UgKSApIChvdGhlcmx2XzExPSAnLCcgKCAobHZfYXJndW1lbnRzXzEyXzA9IHJ1bGVKdm1Bcmd1bWVudFR5cGVSZWZlcmVuY2UgKSApICkqIG90aGVybHZfMTM9ICc+JyApPyApKgorICAgICAgICAgICAgICAgICAgICBsb29wMTY1OgogICAgICAgICAgICAgICAgICAgICBkbyB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpbnQgYWx0MTU0PTI7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpbnQgTEExNTRfMCA9IGlucHV0LkxBKDEpOworICAgICAgICAgICAgICAgICAgICAgICAgaW50IGFsdDE2NT0yOworICAgICAgICAgICAgICAgICAgICAgICAgaW50IExBMTY1XzAgPSBpbnB1dC5MQSgxKTsKIAotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCAoTEExNTRfMD09NjcpICkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBMQTE1NF8yID0gaW5wdXQuTEEoMik7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIChMQTE2NV8wPT03NCkgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IExBMTY1XzIgPSBpbnB1dC5MQSgyKTsKIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICggKExBMTU0XzI9PVJVTEVfSUQpICkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgTEExNTRfMyA9IGlucHV0LkxBKDMpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICggKExBMTY1XzI9PVJVTEVfSUQpICkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgTEExNjVfMyA9IGlucHV0LkxBKDMpOwogCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICggKHN5bnByZWQ1MV9JbnRlcm5hbERhdGFEU0woKSkgKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbHQxNTQ9MTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsdDE2NT0xOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAKIApAQCAtMjM2OTIsMTggKzI0ODg2LDE4IEBACiAgICAgICAgICAgICAgICAgICAgICAgICB9CiAKIAotICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChhbHQxNTQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoYWx0MTY1KSB7CiAgICAgICAgICAgICAgICAgICAgIAljYXNlIDEgOgotICAgICAgICAgICAgICAgICAgICAJICAgIC8vIEludGVybmFsRGF0YURTTC5nOjg2ODE6NTogKCAoICggKCkgJy4nICkgKT0+ICggKCkgb3RoZXJsdl83PSAnLicgKSApICggKCBydWxlVmFsaWRJRCApICkgKCAoICggJzwnICk9Pm90aGVybHZfOT0gJzwnICkgKCAobHZfYXJndW1lbnRzXzEwXzA9IHJ1bGVKdm1Bcmd1bWVudFR5cGVSZWZlcmVuY2UgKSApIChvdGhlcmx2XzExPSAnLCcgKCAobHZfYXJndW1lbnRzXzEyXzA9IHJ1bGVKdm1Bcmd1bWVudFR5cGVSZWZlcmVuY2UgKSApICkqIG90aGVybHZfMTM9ICc+JyApPworICAgICAgICAgICAgICAgICAgICAJICAgIC8vIEludGVybmFsRGF0YURTTC5nOjkxMjA6NTogKCAoICggKCkgJy4nICkgKT0+ICggKCkgb3RoZXJsdl83PSAnLicgKSApICggKCBydWxlVmFsaWRJRCApICkgKCAoICggJzwnICk9Pm90aGVybHZfOT0gJzwnICkgKCAobHZfYXJndW1lbnRzXzEwXzA9IHJ1bGVKdm1Bcmd1bWVudFR5cGVSZWZlcmVuY2UgKSApIChvdGhlcmx2XzExPSAnLCcgKCAobHZfYXJndW1lbnRzXzEyXzA9IHJ1bGVKdm1Bcmd1bWVudFR5cGVSZWZlcmVuY2UgKSApICkqIG90aGVybHZfMTM9ICc+JyApPwogICAgICAgICAgICAgICAgICAgICAJICAgIHsKLSAgICAgICAgICAgICAgICAgICAgCSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo4NjgxOjU6ICggKCAoICgpICcuJyApICk9PiAoICgpIG90aGVybHZfNz0gJy4nICkgKQotICAgICAgICAgICAgICAgICAgICAJICAgIC8vIEludGVybmFsRGF0YURTTC5nOjg2ODI6NjogKCAoICgpICcuJyApICk9PiAoICgpIG90aGVybHZfNz0gJy4nICkKKyAgICAgICAgICAgICAgICAgICAgCSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo5MTIwOjU6ICggKCAoICgpICcuJyApICk9PiAoICgpIG90aGVybHZfNz0gJy4nICkgKQorICAgICAgICAgICAgICAgICAgICAJICAgIC8vIEludGVybmFsRGF0YURTTC5nOjkxMjE6NjogKCAoICgpICcuJyApICk9PiAoICgpIG90aGVybHZfNz0gJy4nICkKICAgICAgICAgICAgICAgICAgICAgCSAgICB7Ci0gICAgICAgICAgICAgICAgICAgIAkgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6ODY4ODo2OiAoICgpIG90aGVybHZfNz0gJy4nICkKLSAgICAgICAgICAgICAgICAgICAgCSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo4Njg5Ojc6ICgpIG90aGVybHZfNz0gJy4nCisgICAgICAgICAgICAgICAgICAgIAkgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6OTEyNzo2OiAoICgpIG90aGVybHZfNz0gJy4nICkKKyAgICAgICAgICAgICAgICAgICAgCSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo5MTI4Ojc6ICgpIG90aGVybHZfNz0gJy4nCiAgICAgICAgICAgICAgICAgICAgIAkgICAgewotICAgICAgICAgICAgICAgICAgICAJICAgIC8vIEludGVybmFsRGF0YURTTC5nOjg2ODk6NzogKCkKLSAgICAgICAgICAgICAgICAgICAgCSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo4NjkwOjg6IAorICAgICAgICAgICAgICAgICAgICAJICAgIC8vIEludGVybmFsRGF0YURTTC5nOjkxMjg6NzogKCkKKyAgICAgICAgICAgICAgICAgICAgCSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo5MTI5Ojg6IAogICAgICAgICAgICAgICAgICAgICAJICAgIHsKICAgICAgICAgICAgICAgICAgICAgCSAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKIApAQCAtMjM3MTUsNyArMjQ5MDksNyBAQAogCiAgICAgICAgICAgICAgICAgICAgIAkgICAgfQogCi0gICAgICAgICAgICAgICAgICAgIAkgICAgb3RoZXJsdl83PShUb2tlbiltYXRjaChpbnB1dCw2NyxGT0xMT1dfNCk7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OworICAgICAgICAgICAgICAgICAgICAJICAgIG90aGVybHZfNz0oVG9rZW4pbWF0Y2goaW5wdXQsNzQsRk9MTE9XXzQpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gY3VycmVudDsKICAgICAgICAgICAgICAgICAgICAgCSAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKIAogICAgICAgICAgICAgICAgICAgICAJICAgICAgCQkJCQkJCW5ld0xlYWZOb2RlKG90aGVybHZfNywgZ3JhbW1hckFjY2Vzcy5nZXRKdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZUFjY2VzcygpLmdldEZ1bGxTdG9wS2V5d29yZF8xXzRfMF8wXzEoKSk7CkBAIC0yMzcyNywxMSArMjQ5MjEsMTEgQEAKIAogICAgICAgICAgICAgICAgICAgICAJICAgIH0KIAotICAgICAgICAgICAgICAgICAgICAJICAgIC8vIEludGVybmFsRGF0YURTTC5nOjg3MDI6NTogKCAoIHJ1bGVWYWxpZElEICkgKQotICAgICAgICAgICAgICAgICAgICAJICAgIC8vIEludGVybmFsRGF0YURTTC5nOjg3MDM6NjogKCBydWxlVmFsaWRJRCApCisgICAgICAgICAgICAgICAgICAgIAkgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6OTE0MTo1OiAoICggcnVsZVZhbGlkSUQgKSApCisgICAgICAgICAgICAgICAgICAgIAkgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6OTE0Mjo2OiAoIHJ1bGVWYWxpZElEICkKICAgICAgICAgICAgICAgICAgICAgCSAgICB7Ci0gICAgICAgICAgICAgICAgICAgIAkgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6ODcwMzo2OiAoIHJ1bGVWYWxpZElEICkKLSAgICAgICAgICAgICAgICAgICAgCSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo4NzA0Ojc6IHJ1bGVWYWxpZElECisgICAgICAgICAgICAgICAgICAgIAkgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6OTE0Mjo2OiAoIHJ1bGVWYWxpZElEICkKKyAgICAgICAgICAgICAgICAgICAgCSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo5MTQzOjc6IHJ1bGVWYWxpZElECiAgICAgICAgICAgICAgICAgICAgIAkgICAgewogICAgICAgICAgICAgICAgICAgICAJICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogCkBAIC0yMzc0NSw3ICsyNDkzOSw3IEBACiAgICAgICAgICAgICAgICAgICAgIAkgICAgICAJCQkJCQkJbmV3Q29tcG9zaXRlTm9kZShncmFtbWFyQWNjZXNzLmdldEp2bVBhcmFtZXRlcml6ZWRUeXBlUmVmZXJlbmNlQWNjZXNzKCkuZ2V0VHlwZUp2bVR5cGVDcm9zc1JlZmVyZW5jZV8xXzRfMV8wKCkpOwogICAgICAgICAgICAgICAgICAgICAJICAgICAgCQkJCQkJCiAgICAgICAgICAgICAgICAgICAgIAkgICAgfQotICAgICAgICAgICAgICAgICAgICAJICAgIHB1c2hGb2xsb3coRk9MTE9XXzEzMCk7CisgICAgICAgICAgICAgICAgICAgIAkgICAgcHVzaEZvbGxvdyhGT0xMT1dfMTQzKTsKICAgICAgICAgICAgICAgICAgICAgCSAgICBydWxlVmFsaWRJRCgpOwogCiAgICAgICAgICAgICAgICAgICAgIAkgICAgc3RhdGUuX2ZzcC0tOwpAQCAtMjM3NjEsMTcgKzI0OTU1LDE3IEBACiAKICAgICAgICAgICAgICAgICAgICAgCSAgICB9CiAKLSAgICAgICAgICAgICAgICAgICAgCSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo4NzE4OjU6ICggKCAoICc8JyApPT5vdGhlcmx2Xzk9ICc8JyApICggKGx2X2FyZ3VtZW50c18xMF8wPSBydWxlSnZtQXJndW1lbnRUeXBlUmVmZXJlbmNlICkgKSAob3RoZXJsdl8xMT0gJywnICggKGx2X2FyZ3VtZW50c18xMl8wPSBydWxlSnZtQXJndW1lbnRUeXBlUmVmZXJlbmNlICkgKSApKiBvdGhlcmx2XzEzPSAnPicgKT8KLSAgICAgICAgICAgICAgICAgICAgCSAgICBpbnQgYWx0MTUzPTI7Ci0gICAgICAgICAgICAgICAgICAgIAkgICAgYWx0MTUzID0gZGZhMTUzLnByZWRpY3QoaW5wdXQpOwotICAgICAgICAgICAgICAgICAgICAJICAgIHN3aXRjaCAoYWx0MTUzKSB7CisgICAgICAgICAgICAgICAgICAgIAkgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6OTE1Nzo1OiAoICggKCAnPCcgKT0+b3RoZXJsdl85PSAnPCcgKSAoIChsdl9hcmd1bWVudHNfMTBfMD0gcnVsZUp2bUFyZ3VtZW50VHlwZVJlZmVyZW5jZSApICkgKG90aGVybHZfMTE9ICcsJyAoIChsdl9hcmd1bWVudHNfMTJfMD0gcnVsZUp2bUFyZ3VtZW50VHlwZVJlZmVyZW5jZSApICkgKSogb3RoZXJsdl8xMz0gJz4nICk/CisgICAgICAgICAgICAgICAgICAgIAkgICAgaW50IGFsdDE2ND0yOworICAgICAgICAgICAgICAgICAgICAJICAgIGFsdDE2NCA9IGRmYTE2NC5wcmVkaWN0KGlucHV0KTsKKyAgICAgICAgICAgICAgICAgICAgCSAgICBzd2l0Y2ggKGFsdDE2NCkgewogICAgICAgICAgICAgICAgICAgICAJICAgICAgICBjYXNlIDEgOgotICAgICAgICAgICAgICAgICAgICAJICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6ODcxOTo2OiAoICggJzwnICk9Pm90aGVybHZfOT0gJzwnICkgKCAobHZfYXJndW1lbnRzXzEwXzA9IHJ1bGVKdm1Bcmd1bWVudFR5cGVSZWZlcmVuY2UgKSApIChvdGhlcmx2XzExPSAnLCcgKCAobHZfYXJndW1lbnRzXzEyXzA9IHJ1bGVKdm1Bcmd1bWVudFR5cGVSZWZlcmVuY2UgKSApICkqIG90aGVybHZfMTM9ICc+JworICAgICAgICAgICAgICAgICAgICAJICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6OTE1ODo2OiAoICggJzwnICk9Pm90aGVybHZfOT0gJzwnICkgKCAobHZfYXJndW1lbnRzXzEwXzA9IHJ1bGVKdm1Bcmd1bWVudFR5cGVSZWZlcmVuY2UgKSApIChvdGhlcmx2XzExPSAnLCcgKCAobHZfYXJndW1lbnRzXzEyXzA9IHJ1bGVKdm1Bcmd1bWVudFR5cGVSZWZlcmVuY2UgKSApICkqIG90aGVybHZfMTM9ICc+JwogICAgICAgICAgICAgICAgICAgICAJICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAJICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6ODcxOTo2OiAoICggJzwnICk9Pm90aGVybHZfOT0gJzwnICkKLSAgICAgICAgICAgICAgICAgICAgCSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjg3MjA6NzogKCAnPCcgKT0+b3RoZXJsdl85PSAnPCcKKyAgICAgICAgICAgICAgICAgICAgCSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjkxNTg6NjogKCAoICc8JyApPT5vdGhlcmx2Xzk9ICc8JyApCisgICAgICAgICAgICAgICAgICAgIAkgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo5MTU5Ojc6ICggJzwnICk9Pm90aGVybHZfOT0gJzwnCiAgICAgICAgICAgICAgICAgICAgIAkgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIAkgICAgICAgICAgICBvdGhlcmx2Xzk9KFRva2VuKW1hdGNoKGlucHV0LDg2LEZPTExPV184OSk7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OworICAgICAgICAgICAgICAgICAgICAJICAgICAgICAgICAgb3RoZXJsdl85PShUb2tlbiltYXRjaChpbnB1dCw5MyxGT0xMT1dfMTAzKTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7CiAgICAgICAgICAgICAgICAgICAgIAkgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKIAogICAgICAgICAgICAgICAgICAgICAJICAgICAgICAgICAgICAJCQkJCQkJbmV3TGVhZk5vZGUob3RoZXJsdl85LCBncmFtbWFyQWNjZXNzLmdldEp2bVBhcmFtZXRlcml6ZWRUeXBlUmVmZXJlbmNlQWNjZXNzKCkuZ2V0TGVzc1RoYW5TaWduS2V5d29yZF8xXzRfMl8wKCkpOwpAQCAtMjM3ODAsMTggKzI0OTc0LDE4IEBACiAKICAgICAgICAgICAgICAgICAgICAgCSAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgICAgICAgICAJICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6ODcyNjo2OiAoIChsdl9hcmd1bWVudHNfMTBfMD0gcnVsZUp2bUFyZ3VtZW50VHlwZVJlZmVyZW5jZSApICkKLSAgICAgICAgICAgICAgICAgICAgCSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjg3Mjc6NzogKGx2X2FyZ3VtZW50c18xMF8wPSBydWxlSnZtQXJndW1lbnRUeXBlUmVmZXJlbmNlICkKKyAgICAgICAgICAgICAgICAgICAgCSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjkxNjU6NjogKCAobHZfYXJndW1lbnRzXzEwXzA9IHJ1bGVKdm1Bcmd1bWVudFR5cGVSZWZlcmVuY2UgKSApCisgICAgICAgICAgICAgICAgICAgIAkgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo5MTY2Ojc6IChsdl9hcmd1bWVudHNfMTBfMD0gcnVsZUp2bUFyZ3VtZW50VHlwZVJlZmVyZW5jZSApCiAgICAgICAgICAgICAgICAgICAgIAkgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIAkgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo4NzI3Ojc6IChsdl9hcmd1bWVudHNfMTBfMD0gcnVsZUp2bUFyZ3VtZW50VHlwZVJlZmVyZW5jZSApCi0gICAgICAgICAgICAgICAgICAgIAkgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo4NzI4Ojg6IGx2X2FyZ3VtZW50c18xMF8wPSBydWxlSnZtQXJndW1lbnRUeXBlUmVmZXJlbmNlCisgICAgICAgICAgICAgICAgICAgIAkgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo5MTY2Ojc6IChsdl9hcmd1bWVudHNfMTBfMD0gcnVsZUp2bUFyZ3VtZW50VHlwZVJlZmVyZW5jZSApCisgICAgICAgICAgICAgICAgICAgIAkgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo5MTY3Ojg6IGx2X2FyZ3VtZW50c18xMF8wPSBydWxlSnZtQXJndW1lbnRUeXBlUmVmZXJlbmNlCiAgICAgICAgICAgICAgICAgICAgIAkgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgIAkgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKIAogICAgICAgICAgICAgICAgICAgICAJICAgICAgICAgICAgICAJCQkJCQkJCW5ld0NvbXBvc2l0ZU5vZGUoZ3JhbW1hckFjY2Vzcy5nZXRKdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZUFjY2VzcygpLmdldEFyZ3VtZW50c0p2bUFyZ3VtZW50VHlwZVJlZmVyZW5jZVBhcnNlclJ1bGVDYWxsXzFfNF8yXzFfMCgpKTsKICAgICAgICAgICAgICAgICAgICAgCSAgICAgICAgICAgICAgCQkJCQkJCQogICAgICAgICAgICAgICAgICAgICAJICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAJICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfOTApOworICAgICAgICAgICAgICAgICAgICAJICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMTA0KTsKICAgICAgICAgICAgICAgICAgICAgCSAgICAgICAgICAgIGx2X2FyZ3VtZW50c18xMF8wPXJ1bGVKdm1Bcmd1bWVudFR5cGVSZWZlcmVuY2UoKTsKIAogICAgICAgICAgICAgICAgICAgICAJICAgICAgICAgICAgc3RhdGUuX2ZzcC0tOwpAQCAtMjM4MTUsMzkgKzI1MDA5LDM5IEBACiAKICAgICAgICAgICAgICAgICAgICAgCSAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgICAgICAgICAJICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6ODc0NTo2OiAob3RoZXJsdl8xMT0gJywnICggKGx2X2FyZ3VtZW50c18xMl8wPSBydWxlSnZtQXJndW1lbnRUeXBlUmVmZXJlbmNlICkgKSApKgotICAgICAgICAgICAgICAgICAgICAJICAgICAgICAgICAgbG9vcDE1MjoKKyAgICAgICAgICAgICAgICAgICAgCSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjkxODQ6NjogKG90aGVybHZfMTE9ICcsJyAoIChsdl9hcmd1bWVudHNfMTJfMD0gcnVsZUp2bUFyZ3VtZW50VHlwZVJlZmVyZW5jZSApICkgKSoKKyAgICAgICAgICAgICAgICAgICAgCSAgICAgICAgICAgIGxvb3AxNjM6CiAgICAgICAgICAgICAgICAgICAgIAkgICAgICAgICAgICBkbyB7Ci0gICAgICAgICAgICAgICAgICAgIAkgICAgICAgICAgICAgICAgaW50IGFsdDE1Mj0yOwotICAgICAgICAgICAgICAgICAgICAJICAgICAgICAgICAgICAgIGludCBMQTE1Ml8wID0gaW5wdXQuTEEoMSk7CisgICAgICAgICAgICAgICAgICAgIAkgICAgICAgICAgICAgICAgaW50IGFsdDE2Mz0yOworICAgICAgICAgICAgICAgICAgICAJICAgICAgICAgICAgICAgIGludCBMQTE2M18wID0gaW5wdXQuTEEoMSk7CiAKLSAgICAgICAgICAgICAgICAgICAgCSAgICAgICAgICAgICAgICBpZiAoIChMQTE1Ml8wPT03NSkgKSB7Ci0gICAgICAgICAgICAgICAgICAgIAkgICAgICAgICAgICAgICAgICAgIGFsdDE1Mj0xOworICAgICAgICAgICAgICAgICAgICAJICAgICAgICAgICAgICAgIGlmICggKExBMTYzXzA9PTgyKSApIHsKKyAgICAgICAgICAgICAgICAgICAgCSAgICAgICAgICAgICAgICAgICAgYWx0MTYzPTE7CiAgICAgICAgICAgICAgICAgICAgIAkgICAgICAgICAgICAgICAgfQogCiAKLSAgICAgICAgICAgICAgICAgICAgCSAgICAgICAgICAgICAgICBzd2l0Y2ggKGFsdDE1MikgeworICAgICAgICAgICAgICAgICAgICAJICAgICAgICAgICAgICAgIHN3aXRjaCAoYWx0MTYzKSB7CiAgICAgICAgICAgICAgICAgICAgIAkgICAgICAgICAgICAJY2FzZSAxIDoKLSAgICAgICAgICAgICAgICAgICAgCSAgICAgICAgICAgIAkgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6ODc0Njo3OiBvdGhlcmx2XzExPSAnLCcgKCAobHZfYXJndW1lbnRzXzEyXzA9IHJ1bGVKdm1Bcmd1bWVudFR5cGVSZWZlcmVuY2UgKSApCisgICAgICAgICAgICAgICAgICAgIAkgICAgICAgICAgICAJICAgIC8vIEludGVybmFsRGF0YURTTC5nOjkxODU6Nzogb3RoZXJsdl8xMT0gJywnICggKGx2X2FyZ3VtZW50c18xMl8wPSBydWxlSnZtQXJndW1lbnRUeXBlUmVmZXJlbmNlICkgKQogICAgICAgICAgICAgICAgICAgICAJICAgICAgICAgICAgCSAgICB7Ci0gICAgICAgICAgICAgICAgICAgIAkgICAgICAgICAgICAJICAgIG90aGVybHZfMTE9KFRva2VuKW1hdGNoKGlucHV0LDc1LEZPTExPV184OSk7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OworICAgICAgICAgICAgICAgICAgICAJICAgICAgICAgICAgCSAgICBvdGhlcmx2XzExPShUb2tlbiltYXRjaChpbnB1dCw4MixGT0xMT1dfMTAzKTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7CiAgICAgICAgICAgICAgICAgICAgIAkgICAgICAgICAgICAJICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogCiAgICAgICAgICAgICAgICAgICAgIAkgICAgICAgICAgICAJICAgICAgCQkJCQkJCW5ld0xlYWZOb2RlKG90aGVybHZfMTEsIGdyYW1tYXJBY2Nlc3MuZ2V0SnZtUGFyYW1ldGVyaXplZFR5cGVSZWZlcmVuY2VBY2Nlc3MoKS5nZXRDb21tYUtleXdvcmRfMV80XzJfMl8wKCkpOwogICAgICAgICAgICAgICAgICAgICAJICAgICAgICAgICAgCSAgICAgIAkJCQkJCQogICAgICAgICAgICAgICAgICAgICAJICAgICAgICAgICAgCSAgICB9Ci0gICAgICAgICAgICAgICAgICAgIAkgICAgICAgICAgICAJICAgIC8vIEludGVybmFsRGF0YURTTC5nOjg3NTA6NzogKCAobHZfYXJndW1lbnRzXzEyXzA9IHJ1bGVKdm1Bcmd1bWVudFR5cGVSZWZlcmVuY2UgKSApCi0gICAgICAgICAgICAgICAgICAgIAkgICAgICAgICAgICAJICAgIC8vIEludGVybmFsRGF0YURTTC5nOjg3NTE6ODogKGx2X2FyZ3VtZW50c18xMl8wPSBydWxlSnZtQXJndW1lbnRUeXBlUmVmZXJlbmNlICkKKyAgICAgICAgICAgICAgICAgICAgCSAgICAgICAgICAgIAkgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6OTE4OTo3OiAoIChsdl9hcmd1bWVudHNfMTJfMD0gcnVsZUp2bUFyZ3VtZW50VHlwZVJlZmVyZW5jZSApICkKKyAgICAgICAgICAgICAgICAgICAgCSAgICAgICAgICAgIAkgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6OTE5MDo4OiAobHZfYXJndW1lbnRzXzEyXzA9IHJ1bGVKdm1Bcmd1bWVudFR5cGVSZWZlcmVuY2UgKQogICAgICAgICAgICAgICAgICAgICAJICAgICAgICAgICAgCSAgICB7Ci0gICAgICAgICAgICAgICAgICAgIAkgICAgICAgICAgICAJICAgIC8vIEludGVybmFsRGF0YURTTC5nOjg3NTE6ODogKGx2X2FyZ3VtZW50c18xMl8wPSBydWxlSnZtQXJndW1lbnRUeXBlUmVmZXJlbmNlICkKLSAgICAgICAgICAgICAgICAgICAgCSAgICAgICAgICAgIAkgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6ODc1Mjo5OiBsdl9hcmd1bWVudHNfMTJfMD0gcnVsZUp2bUFyZ3VtZW50VHlwZVJlZmVyZW5jZQorICAgICAgICAgICAgICAgICAgICAJICAgICAgICAgICAgCSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo5MTkwOjg6IChsdl9hcmd1bWVudHNfMTJfMD0gcnVsZUp2bUFyZ3VtZW50VHlwZVJlZmVyZW5jZSApCisgICAgICAgICAgICAgICAgICAgIAkgICAgICAgICAgICAJICAgIC8vIEludGVybmFsRGF0YURTTC5nOjkxOTE6OTogbHZfYXJndW1lbnRzXzEyXzA9IHJ1bGVKdm1Bcmd1bWVudFR5cGVSZWZlcmVuY2UKICAgICAgICAgICAgICAgICAgICAgCSAgICAgICAgICAgIAkgICAgewogICAgICAgICAgICAgICAgICAgICAJICAgICAgICAgICAgCSAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKIAogICAgICAgICAgICAgICAgICAgICAJICAgICAgICAgICAgCSAgICAgIAkJCQkJCQkJCW5ld0NvbXBvc2l0ZU5vZGUoZ3JhbW1hckFjY2Vzcy5nZXRKdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZUFjY2VzcygpLmdldEFyZ3VtZW50c0p2bUFyZ3VtZW50VHlwZVJlZmVyZW5jZVBhcnNlclJ1bGVDYWxsXzFfNF8yXzJfMV8wKCkpOwogICAgICAgICAgICAgICAgICAgICAJICAgICAgICAgICAgCSAgICAgIAkJCQkJCQkJCiAgICAgICAgICAgICAgICAgICAgIAkgICAgICAgICAgICAJICAgIH0KLSAgICAgICAgICAgICAgICAgICAgCSAgICAgICAgICAgIAkgICAgcHVzaEZvbGxvdyhGT0xMT1dfOTApOworICAgICAgICAgICAgICAgICAgICAJICAgICAgICAgICAgCSAgICBwdXNoRm9sbG93KEZPTExPV18xMDQpOwogICAgICAgICAgICAgICAgICAgICAJICAgICAgICAgICAgCSAgICBsdl9hcmd1bWVudHNfMTJfMD1ydWxlSnZtQXJndW1lbnRUeXBlUmVmZXJlbmNlKCk7CiAKICAgICAgICAgICAgICAgICAgICAgCSAgICAgICAgICAgIAkgICAgc3RhdGUuX2ZzcC0tOwpAQCAtMjM4NzYsMTEgKzI1MDcwLDExIEBACiAgICAgICAgICAgICAgICAgICAgIAkgICAgICAgICAgICAJICAgIGJyZWFrOwogCiAgICAgICAgICAgICAgICAgICAgIAkgICAgICAgICAgICAJZGVmYXVsdCA6Ci0gICAgICAgICAgICAgICAgICAgIAkgICAgICAgICAgICAJICAgIGJyZWFrIGxvb3AxNTI7CisgICAgICAgICAgICAgICAgICAgIAkgICAgICAgICAgICAJICAgIGJyZWFrIGxvb3AxNjM7CiAgICAgICAgICAgICAgICAgICAgIAkgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAJICAgICAgICAgICAgfSB3aGlsZSAodHJ1ZSk7CiAKLSAgICAgICAgICAgICAgICAgICAgCSAgICAgICAgICAgIG90aGVybHZfMTM9KFRva2VuKW1hdGNoKGlucHV0LDg3LEZPTExPV181NCk7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OworICAgICAgICAgICAgICAgICAgICAJICAgICAgICAgICAgb3RoZXJsdl8xMz0oVG9rZW4pbWF0Y2goaW5wdXQsOTQsRk9MTE9XXzY4KTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7CiAgICAgICAgICAgICAgICAgICAgIAkgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKIAogICAgICAgICAgICAgICAgICAgICAJICAgICAgICAgICAgICAJCQkJCQluZXdMZWFmTm9kZShvdGhlcmx2XzEzLCBncmFtbWFyQWNjZXNzLmdldEp2bVBhcmFtZXRlcml6ZWRUeXBlUmVmZXJlbmNlQWNjZXNzKCkuZ2V0R3JlYXRlclRoYW5TaWduS2V5d29yZF8xXzRfMl8zKCkpOwpAQCAtMjM4OTcsNyArMjUwOTEsNyBAQAogICAgICAgICAgICAgICAgICAgICAJICAgIGJyZWFrOwogCiAgICAgICAgICAgICAgICAgICAgIAlkZWZhdWx0IDoKLSAgICAgICAgICAgICAgICAgICAgCSAgICBicmVhayBsb29wMTU0OworICAgICAgICAgICAgICAgICAgICAJICAgIGJyZWFrIGxvb3AxNjU7CiAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIH0gd2hpbGUgKHRydWUpOwogCkBAIC0yMzkzMiw3ICsyNTEyNiw3IEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAiZW50cnlSdWxlSnZtQXJndW1lbnRUeXBlUmVmZXJlbmNlIgotICAgIC8vIEludGVybmFsRGF0YURTTC5nOjg3ODE6MTogZW50cnlSdWxlSnZtQXJndW1lbnRUeXBlUmVmZXJlbmNlIHJldHVybnMgW0VPYmplY3QgY3VycmVudD1udWxsXSA6IGl2X3J1bGVKdm1Bcmd1bWVudFR5cGVSZWZlcmVuY2U9IHJ1bGVKdm1Bcmd1bWVudFR5cGVSZWZlcmVuY2UgRU9GIDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo5MjIwOjE6IGVudHJ5UnVsZUp2bUFyZ3VtZW50VHlwZVJlZmVyZW5jZSByZXR1cm5zIFtFT2JqZWN0IGN1cnJlbnQ9bnVsbF0gOiBpdl9ydWxlSnZtQXJndW1lbnRUeXBlUmVmZXJlbmNlPSBydWxlSnZtQXJndW1lbnRUeXBlUmVmZXJlbmNlIEVPRiA7CiAgICAgcHVibGljIGZpbmFsIEVPYmplY3QgZW50cnlSdWxlSnZtQXJndW1lbnRUeXBlUmVmZXJlbmNlKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKICAgICAgICAgRU9iamVjdCBjdXJyZW50ID0gbnVsbDsKIApAQCAtMjM5NDAsOCArMjUxMzQsOCBAQAogCiAKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjg3ODE6NjU6IChpdl9ydWxlSnZtQXJndW1lbnRUeXBlUmVmZXJlbmNlPSBydWxlSnZtQXJndW1lbnRUeXBlUmVmZXJlbmNlIEVPRiApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo4NzgyOjI6IGl2X3J1bGVKdm1Bcmd1bWVudFR5cGVSZWZlcmVuY2U9IHJ1bGVKdm1Bcmd1bWVudFR5cGVSZWZlcmVuY2UgRU9GCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo5MjIwOjY1OiAoaXZfcnVsZUp2bUFyZ3VtZW50VHlwZVJlZmVyZW5jZT0gcnVsZUp2bUFyZ3VtZW50VHlwZVJlZmVyZW5jZSBFT0YgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6OTIyMToyOiBpdl9ydWxlSnZtQXJndW1lbnRUeXBlUmVmZXJlbmNlPSBydWxlSnZtQXJndW1lbnRUeXBlUmVmZXJlbmNlIEVPRgogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBuZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0SnZtQXJndW1lbnRUeXBlUmVmZXJlbmNlUnVsZSgpKTsgCkBAIC0yMzk3Miw3ICsyNTE2Niw3IEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZUp2bUFyZ3VtZW50VHlwZVJlZmVyZW5jZSIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo4Nzg4OjE6IHJ1bGVKdm1Bcmd1bWVudFR5cGVSZWZlcmVuY2UgcmV0dXJucyBbRU9iamVjdCBjdXJyZW50PW51bGxdIDogKHRoaXNfSnZtVHlwZVJlZmVyZW5jZV8wPSBydWxlSnZtVHlwZVJlZmVyZW5jZSB8IHRoaXNfSnZtV2lsZGNhcmRUeXBlUmVmZXJlbmNlXzE9IHJ1bGVKdm1XaWxkY2FyZFR5cGVSZWZlcmVuY2UgKSA7CisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6OTIyNzoxOiBydWxlSnZtQXJndW1lbnRUeXBlUmVmZXJlbmNlIHJldHVybnMgW0VPYmplY3QgY3VycmVudD1udWxsXSA6ICh0aGlzX0p2bVR5cGVSZWZlcmVuY2VfMD0gcnVsZUp2bVR5cGVSZWZlcmVuY2UgfCB0aGlzX0p2bVdpbGRjYXJkVHlwZVJlZmVyZW5jZV8xPSBydWxlSnZtV2lsZGNhcmRUeXBlUmVmZXJlbmNlICkgOwogICAgIHB1YmxpYyBmaW5hbCBFT2JqZWN0IHJ1bGVKdm1Bcmd1bWVudFR5cGVSZWZlcmVuY2UoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogICAgICAgICBFT2JqZWN0IGN1cnJlbnQgPSBudWxsOwogCkBAIC0yMzk4NSwyOSArMjUxNzksMjkgQEAKICAgICAgICAgCWVudGVyUnVsZSgpOwogCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo4Nzk0OjI6ICggKHRoaXNfSnZtVHlwZVJlZmVyZW5jZV8wPSBydWxlSnZtVHlwZVJlZmVyZW5jZSB8IHRoaXNfSnZtV2lsZGNhcmRUeXBlUmVmZXJlbmNlXzE9IHJ1bGVKdm1XaWxkY2FyZFR5cGVSZWZlcmVuY2UgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo4Nzk1OjI6ICh0aGlzX0p2bVR5cGVSZWZlcmVuY2VfMD0gcnVsZUp2bVR5cGVSZWZlcmVuY2UgfCB0aGlzX0p2bVdpbGRjYXJkVHlwZVJlZmVyZW5jZV8xPSBydWxlSnZtV2lsZGNhcmRUeXBlUmVmZXJlbmNlICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjkyMzM6MjogKCAodGhpc19Kdm1UeXBlUmVmZXJlbmNlXzA9IHJ1bGVKdm1UeXBlUmVmZXJlbmNlIHwgdGhpc19Kdm1XaWxkY2FyZFR5cGVSZWZlcmVuY2VfMT0gcnVsZUp2bVdpbGRjYXJkVHlwZVJlZmVyZW5jZSApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjkyMzQ6MjogKHRoaXNfSnZtVHlwZVJlZmVyZW5jZV8wPSBydWxlSnZtVHlwZVJlZmVyZW5jZSB8IHRoaXNfSnZtV2lsZGNhcmRUeXBlUmVmZXJlbmNlXzE9IHJ1bGVKdm1XaWxkY2FyZFR5cGVSZWZlcmVuY2UgKQogICAgICAgICAgICAgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6ODc5NToyOiAodGhpc19Kdm1UeXBlUmVmZXJlbmNlXzA9IHJ1bGVKdm1UeXBlUmVmZXJlbmNlIHwgdGhpc19Kdm1XaWxkY2FyZFR5cGVSZWZlcmVuY2VfMT0gcnVsZUp2bVdpbGRjYXJkVHlwZVJlZmVyZW5jZSApCi0gICAgICAgICAgICBpbnQgYWx0MTU2PTI7Ci0gICAgICAgICAgICBpbnQgTEExNTZfMCA9IGlucHV0LkxBKDEpOworICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6OTIzNDoyOiAodGhpc19Kdm1UeXBlUmVmZXJlbmNlXzA9IHJ1bGVKdm1UeXBlUmVmZXJlbmNlIHwgdGhpc19Kdm1XaWxkY2FyZFR5cGVSZWZlcmVuY2VfMT0gcnVsZUp2bVdpbGRjYXJkVHlwZVJlZmVyZW5jZSApCisgICAgICAgICAgICBpbnQgYWx0MTY3PTI7CisgICAgICAgICAgICBpbnQgTEExNjdfMCA9IGlucHV0LkxBKDEpOwogCi0gICAgICAgICAgICBpZiAoIChMQTE1Nl8wPT1SVUxFX0lEfHxMQTE1Nl8wPT03NHx8TEExNTZfMD09OTkpICkgewotICAgICAgICAgICAgICAgIGFsdDE1Nj0xOworICAgICAgICAgICAgaWYgKCAoTEExNjdfMD09UlVMRV9JRHx8TEExNjdfMD09ODF8fExBMTY3XzA9PTEwNikgKSB7CisgICAgICAgICAgICAgICAgYWx0MTY3PTE7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIGlmICggKExBMTU2XzA9PTEzNikgKSB7Ci0gICAgICAgICAgICAgICAgYWx0MTU2PTI7CisgICAgICAgICAgICBlbHNlIGlmICggKExBMTY3XzA9PTE0MykgKSB7CisgICAgICAgICAgICAgICAgYWx0MTY3PTI7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICBpZiAoc3RhdGUuYmFja3RyYWNraW5nPjApIHtzdGF0ZS5mYWlsZWQ9dHJ1ZTsgcmV0dXJuIGN1cnJlbnQ7fQogICAgICAgICAgICAgICAgIE5vVmlhYmxlQWx0RXhjZXB0aW9uIG52YWUgPQotICAgICAgICAgICAgICAgICAgICBuZXcgTm9WaWFibGVBbHRFeGNlcHRpb24oIiIsIDE1NiwgMCwgaW5wdXQpOworICAgICAgICAgICAgICAgICAgICBuZXcgTm9WaWFibGVBbHRFeGNlcHRpb24oIiIsIDE2NywgMCwgaW5wdXQpOwogCiAgICAgICAgICAgICAgICAgdGhyb3cgbnZhZTsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHN3aXRjaCAoYWx0MTU2KSB7CisgICAgICAgICAgICBzd2l0Y2ggKGFsdDE2NykgewogICAgICAgICAgICAgICAgIGNhc2UgMSA6Ci0gICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjg3OTY6MzogdGhpc19Kdm1UeXBlUmVmZXJlbmNlXzA9IHJ1bGVKdm1UeXBlUmVmZXJlbmNlCisgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjkyMzU6MzogdGhpc19Kdm1UeXBlUmVmZXJlbmNlXzA9IHJ1bGVKdm1UeXBlUmVmZXJlbmNlCiAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAKQEAgLTI0MDI5LDcgKzI1MjIzLDcgQEAKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICBjYXNlIDIgOgotICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo4ODA1OjM6IHRoaXNfSnZtV2lsZGNhcmRUeXBlUmVmZXJlbmNlXzE9IHJ1bGVKdm1XaWxkY2FyZFR5cGVSZWZlcmVuY2UKKyAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6OTI0NDozOiB0aGlzX0p2bVdpbGRjYXJkVHlwZVJlZmVyZW5jZV8xPSBydWxlSnZtV2lsZGNhcmRUeXBlUmVmZXJlbmNlCiAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAKQEAgLTI0MDc1LDcgKzI1MjY5LDcgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJlbnRyeVJ1bGVKdm1XaWxkY2FyZFR5cGVSZWZlcmVuY2UiCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6ODgxNzoxOiBlbnRyeVJ1bGVKdm1XaWxkY2FyZFR5cGVSZWZlcmVuY2UgcmV0dXJucyBbRU9iamVjdCBjdXJyZW50PW51bGxdIDogaXZfcnVsZUp2bVdpbGRjYXJkVHlwZVJlZmVyZW5jZT0gcnVsZUp2bVdpbGRjYXJkVHlwZVJlZmVyZW5jZSBFT0YgOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjkyNTY6MTogZW50cnlSdWxlSnZtV2lsZGNhcmRUeXBlUmVmZXJlbmNlIHJldHVybnMgW0VPYmplY3QgY3VycmVudD1udWxsXSA6IGl2X3J1bGVKdm1XaWxkY2FyZFR5cGVSZWZlcmVuY2U9IHJ1bGVKdm1XaWxkY2FyZFR5cGVSZWZlcmVuY2UgRU9GIDsKICAgICBwdWJsaWMgZmluYWwgRU9iamVjdCBlbnRyeVJ1bGVKdm1XaWxkY2FyZFR5cGVSZWZlcmVuY2UoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogICAgICAgICBFT2JqZWN0IGN1cnJlbnQgPSBudWxsOwogCkBAIC0yNDA4Myw4ICsyNTI3Nyw4IEBACiAKIAogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6ODgxNzo2NTogKGl2X3J1bGVKdm1XaWxkY2FyZFR5cGVSZWZlcmVuY2U9IHJ1bGVKdm1XaWxkY2FyZFR5cGVSZWZlcmVuY2UgRU9GICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjg4MTg6MjogaXZfcnVsZUp2bVdpbGRjYXJkVHlwZVJlZmVyZW5jZT0gcnVsZUp2bVdpbGRjYXJkVHlwZVJlZmVyZW5jZSBFT0YKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjkyNTY6NjU6IChpdl9ydWxlSnZtV2lsZGNhcmRUeXBlUmVmZXJlbmNlPSBydWxlSnZtV2lsZGNhcmRUeXBlUmVmZXJlbmNlIEVPRiApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo5MjU3OjI6IGl2X3J1bGVKdm1XaWxkY2FyZFR5cGVSZWZlcmVuY2U9IHJ1bGVKdm1XaWxkY2FyZFR5cGVSZWZlcmVuY2UgRU9GCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIG5ld0NvbXBvc2l0ZU5vZGUoZ3JhbW1hckFjY2Vzcy5nZXRKdm1XaWxkY2FyZFR5cGVSZWZlcmVuY2VSdWxlKCkpOyAKQEAgLTI0MTE1LDcgKzI1MzA5LDcgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlSnZtV2lsZGNhcmRUeXBlUmVmZXJlbmNlIgotICAgIC8vIEludGVybmFsRGF0YURTTC5nOjg4MjQ6MTogcnVsZUp2bVdpbGRjYXJkVHlwZVJlZmVyZW5jZSByZXR1cm5zIFtFT2JqZWN0IGN1cnJlbnQ9bnVsbF0gOiAoICgpIG90aGVybHZfMT0gJz8nICggKCAoIChsdl9jb25zdHJhaW50c18yXzA9IHJ1bGVKdm1VcHBlckJvdW5kICkgKSAoIChsdl9jb25zdHJhaW50c18zXzA9IHJ1bGVKdm1VcHBlckJvdW5kQW5kZWQgKSApKiApIHwgKCAoIChsdl9jb25zdHJhaW50c180XzA9IHJ1bGVKdm1Mb3dlckJvdW5kICkgKSAoIChsdl9jb25zdHJhaW50c181XzA9IHJ1bGVKdm1Mb3dlckJvdW5kQW5kZWQgKSApKiApICk/ICkgOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjkyNjM6MTogcnVsZUp2bVdpbGRjYXJkVHlwZVJlZmVyZW5jZSByZXR1cm5zIFtFT2JqZWN0IGN1cnJlbnQ9bnVsbF0gOiAoICgpIG90aGVybHZfMT0gJz8nICggKCAoIChsdl9jb25zdHJhaW50c18yXzA9IHJ1bGVKdm1VcHBlckJvdW5kICkgKSAoIChsdl9jb25zdHJhaW50c18zXzA9IHJ1bGVKdm1VcHBlckJvdW5kQW5kZWQgKSApKiApIHwgKCAoIChsdl9jb25zdHJhaW50c180XzA9IHJ1bGVKdm1Mb3dlckJvdW5kICkgKSAoIChsdl9jb25zdHJhaW50c181XzA9IHJ1bGVKdm1Mb3dlckJvdW5kQW5kZWQgKSApKiApICk/ICkgOwogICAgIHB1YmxpYyBmaW5hbCBFT2JqZWN0IHJ1bGVKdm1XaWxkY2FyZFR5cGVSZWZlcmVuY2UoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogICAgICAgICBFT2JqZWN0IGN1cnJlbnQgPSBudWxsOwogCkBAIC0yNDEzMywxNCArMjUzMjcsMTQgQEAKICAgICAgICAgCWVudGVyUnVsZSgpOwogCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo4ODMwOjI6ICggKCAoKSBvdGhlcmx2XzE9ICc/JyAoICggKCAobHZfY29uc3RyYWludHNfMl8wPSBydWxlSnZtVXBwZXJCb3VuZCApICkgKCAobHZfY29uc3RyYWludHNfM18wPSBydWxlSnZtVXBwZXJCb3VuZEFuZGVkICkgKSogKSB8ICggKCAobHZfY29uc3RyYWludHNfNF8wPSBydWxlSnZtTG93ZXJCb3VuZCApICkgKCAobHZfY29uc3RyYWludHNfNV8wPSBydWxlSnZtTG93ZXJCb3VuZEFuZGVkICkgKSogKSApPyApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjg4MzE6MjogKCAoKSBvdGhlcmx2XzE9ICc/JyAoICggKCAobHZfY29uc3RyYWludHNfMl8wPSBydWxlSnZtVXBwZXJCb3VuZCApICkgKCAobHZfY29uc3RyYWludHNfM18wPSBydWxlSnZtVXBwZXJCb3VuZEFuZGVkICkgKSogKSB8ICggKCAobHZfY29uc3RyYWludHNfNF8wPSBydWxlSnZtTG93ZXJCb3VuZCApICkgKCAobHZfY29uc3RyYWludHNfNV8wPSBydWxlSnZtTG93ZXJCb3VuZEFuZGVkICkgKSogKSApPyApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo5MjY5OjI6ICggKCAoKSBvdGhlcmx2XzE9ICc/JyAoICggKCAobHZfY29uc3RyYWludHNfMl8wPSBydWxlSnZtVXBwZXJCb3VuZCApICkgKCAobHZfY29uc3RyYWludHNfM18wPSBydWxlSnZtVXBwZXJCb3VuZEFuZGVkICkgKSogKSB8ICggKCAobHZfY29uc3RyYWludHNfNF8wPSBydWxlSnZtTG93ZXJCb3VuZCApICkgKCAobHZfY29uc3RyYWludHNfNV8wPSBydWxlSnZtTG93ZXJCb3VuZEFuZGVkICkgKSogKSApPyApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjkyNzA6MjogKCAoKSBvdGhlcmx2XzE9ICc/JyAoICggKCAobHZfY29uc3RyYWludHNfMl8wPSBydWxlSnZtVXBwZXJCb3VuZCApICkgKCAobHZfY29uc3RyYWludHNfM18wPSBydWxlSnZtVXBwZXJCb3VuZEFuZGVkICkgKSogKSB8ICggKCAobHZfY29uc3RyYWludHNfNF8wPSBydWxlSnZtTG93ZXJCb3VuZCApICkgKCAobHZfY29uc3RyYWludHNfNV8wPSBydWxlSnZtTG93ZXJCb3VuZEFuZGVkICkgKSogKSApPyApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo4ODMxOjI6ICggKCkgb3RoZXJsdl8xPSAnPycgKCAoICggKGx2X2NvbnN0cmFpbnRzXzJfMD0gcnVsZUp2bVVwcGVyQm91bmQgKSApICggKGx2X2NvbnN0cmFpbnRzXzNfMD0gcnVsZUp2bVVwcGVyQm91bmRBbmRlZCApICkqICkgfCAoICggKGx2X2NvbnN0cmFpbnRzXzRfMD0gcnVsZUp2bUxvd2VyQm91bmQgKSApICggKGx2X2NvbnN0cmFpbnRzXzVfMD0gcnVsZUp2bUxvd2VyQm91bmRBbmRlZCApICkqICkgKT8gKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6ODgzMjozOiAoKSBvdGhlcmx2XzE9ICc/JyAoICggKCAobHZfY29uc3RyYWludHNfMl8wPSBydWxlSnZtVXBwZXJCb3VuZCApICkgKCAobHZfY29uc3RyYWludHNfM18wPSBydWxlSnZtVXBwZXJCb3VuZEFuZGVkICkgKSogKSB8ICggKCAobHZfY29uc3RyYWludHNfNF8wPSBydWxlSnZtTG93ZXJCb3VuZCApICkgKCAobHZfY29uc3RyYWludHNfNV8wPSBydWxlSnZtTG93ZXJCb3VuZEFuZGVkICkgKSogKSApPworICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6OTI3MDoyOiAoICgpIG90aGVybHZfMT0gJz8nICggKCAoIChsdl9jb25zdHJhaW50c18yXzA9IHJ1bGVKdm1VcHBlckJvdW5kICkgKSAoIChsdl9jb25zdHJhaW50c18zXzA9IHJ1bGVKdm1VcHBlckJvdW5kQW5kZWQgKSApKiApIHwgKCAoIChsdl9jb25zdHJhaW50c180XzA9IHJ1bGVKdm1Mb3dlckJvdW5kICkgKSAoIChsdl9jb25zdHJhaW50c181XzA9IHJ1bGVKdm1Mb3dlckJvdW5kQW5kZWQgKSApKiApICk/ICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjkyNzE6MzogKCkgb3RoZXJsdl8xPSAnPycgKCAoICggKGx2X2NvbnN0cmFpbnRzXzJfMD0gcnVsZUp2bVVwcGVyQm91bmQgKSApICggKGx2X2NvbnN0cmFpbnRzXzNfMD0gcnVsZUp2bVVwcGVyQm91bmRBbmRlZCApICkqICkgfCAoICggKGx2X2NvbnN0cmFpbnRzXzRfMD0gcnVsZUp2bUxvd2VyQm91bmQgKSApICggKGx2X2NvbnN0cmFpbnRzXzVfMD0gcnVsZUp2bUxvd2VyQm91bmRBbmRlZCApICkqICkgKT8KICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjg4MzI6MzogKCkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjg4MzM6NDogCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo5MjcxOjM6ICgpCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo5MjcyOjQ6IAogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAKQEAgLTI0MTUyLDQxICsyNTM0Niw0MSBAQAogCiAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgIG90aGVybHZfMT0oVG9rZW4pbWF0Y2goaW5wdXQsMTM2LEZPTExPV18xMzEpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gY3VycmVudDsKKyAgICAgICAgICAgIG90aGVybHZfMT0oVG9rZW4pbWF0Y2goaW5wdXQsMTQzLEZPTExPV18xNDQpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gY3VycmVudDsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogCiAgICAgICAgICAgICAgIAkJCW5ld0xlYWZOb2RlKG90aGVybHZfMSwgZ3JhbW1hckFjY2Vzcy5nZXRKdm1XaWxkY2FyZFR5cGVSZWZlcmVuY2VBY2Nlc3MoKS5nZXRRdWVzdGlvbk1hcmtLZXl3b3JkXzEoKSk7CiAgICAgICAgICAgICAgIAkJCiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo4ODQzOjM6ICggKCAoIChsdl9jb25zdHJhaW50c18yXzA9IHJ1bGVKdm1VcHBlckJvdW5kICkgKSAoIChsdl9jb25zdHJhaW50c18zXzA9IHJ1bGVKdm1VcHBlckJvdW5kQW5kZWQgKSApKiApIHwgKCAoIChsdl9jb25zdHJhaW50c180XzA9IHJ1bGVKdm1Mb3dlckJvdW5kICkgKSAoIChsdl9jb25zdHJhaW50c181XzA9IHJ1bGVKdm1Mb3dlckJvdW5kQW5kZWQgKSApKiApICk/Ci0gICAgICAgICAgICBpbnQgYWx0MTU5PTM7Ci0gICAgICAgICAgICBpbnQgTEExNTlfMCA9IGlucHV0LkxBKDEpOworICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6OTI4MjozOiAoICggKCAobHZfY29uc3RyYWludHNfMl8wPSBydWxlSnZtVXBwZXJCb3VuZCApICkgKCAobHZfY29uc3RyYWludHNfM18wPSBydWxlSnZtVXBwZXJCb3VuZEFuZGVkICkgKSogKSB8ICggKCAobHZfY29uc3RyYWludHNfNF8wPSBydWxlSnZtTG93ZXJCb3VuZCApICkgKCAobHZfY29uc3RyYWludHNfNV8wPSBydWxlSnZtTG93ZXJCb3VuZEFuZGVkICkgKSogKSApPworICAgICAgICAgICAgaW50IGFsdDE3MD0zOworICAgICAgICAgICAgaW50IExBMTcwXzAgPSBpbnB1dC5MQSgxKTsKIAotICAgICAgICAgICAgaWYgKCAoTEExNTlfMD09MTIzKSApIHsKLSAgICAgICAgICAgICAgICBhbHQxNTk9MTsKKyAgICAgICAgICAgIGlmICggKExBMTcwXzA9PTEzMCkgKSB7CisgICAgICAgICAgICAgICAgYWx0MTcwPTE7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIGlmICggKExBMTU5XzA9PTEyNCkgKSB7Ci0gICAgICAgICAgICAgICAgYWx0MTU5PTI7CisgICAgICAgICAgICBlbHNlIGlmICggKExBMTcwXzA9PTEzMSkgKSB7CisgICAgICAgICAgICAgICAgYWx0MTcwPTI7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBzd2l0Y2ggKGFsdDE1OSkgeworICAgICAgICAgICAgc3dpdGNoIChhbHQxNzApIHsKICAgICAgICAgICAgICAgICBjYXNlIDEgOgotICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo4ODQ0OjQ6ICggKCAobHZfY29uc3RyYWludHNfMl8wPSBydWxlSnZtVXBwZXJCb3VuZCApICkgKCAobHZfY29uc3RyYWludHNfM18wPSBydWxlSnZtVXBwZXJCb3VuZEFuZGVkICkgKSogKQorICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo5MjgzOjQ6ICggKCAobHZfY29uc3RyYWludHNfMl8wPSBydWxlSnZtVXBwZXJCb3VuZCApICkgKCAobHZfY29uc3RyYWludHNfM18wPSBydWxlSnZtVXBwZXJCb3VuZEFuZGVkICkgKSogKQogICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjg4NDQ6NDogKCAoIChsdl9jb25zdHJhaW50c18yXzA9IHJ1bGVKdm1VcHBlckJvdW5kICkgKSAoIChsdl9jb25zdHJhaW50c18zXzA9IHJ1bGVKdm1VcHBlckJvdW5kQW5kZWQgKSApKiApCi0gICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjg4NDU6NTogKCAobHZfY29uc3RyYWludHNfMl8wPSBydWxlSnZtVXBwZXJCb3VuZCApICkgKCAobHZfY29uc3RyYWludHNfM18wPSBydWxlSnZtVXBwZXJCb3VuZEFuZGVkICkgKSoKKyAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6OTI4Mzo0OiAoICggKGx2X2NvbnN0cmFpbnRzXzJfMD0gcnVsZUp2bVVwcGVyQm91bmQgKSApICggKGx2X2NvbnN0cmFpbnRzXzNfMD0gcnVsZUp2bVVwcGVyQm91bmRBbmRlZCApICkqICkKKyAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6OTI4NDo1OiAoIChsdl9jb25zdHJhaW50c18yXzA9IHJ1bGVKdm1VcHBlckJvdW5kICkgKSAoIChsdl9jb25zdHJhaW50c18zXzA9IHJ1bGVKdm1VcHBlckJvdW5kQW5kZWQgKSApKgogICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjg4NDU6NTogKCAobHZfY29uc3RyYWludHNfMl8wPSBydWxlSnZtVXBwZXJCb3VuZCApICkKLSAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6ODg0Njo2OiAobHZfY29uc3RyYWludHNfMl8wPSBydWxlSnZtVXBwZXJCb3VuZCApCisgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjkyODQ6NTogKCAobHZfY29uc3RyYWludHNfMl8wPSBydWxlSnZtVXBwZXJCb3VuZCApICkKKyAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6OTI4NTo2OiAobHZfY29uc3RyYWludHNfMl8wPSBydWxlSnZtVXBwZXJCb3VuZCApCiAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6ODg0Njo2OiAobHZfY29uc3RyYWludHNfMl8wPSBydWxlSnZtVXBwZXJCb3VuZCApCi0gICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjg4NDc6NzogbHZfY29uc3RyYWludHNfMl8wPSBydWxlSnZtVXBwZXJCb3VuZAorICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo5Mjg1OjY6IChsdl9jb25zdHJhaW50c18yXzA9IHJ1bGVKdm1VcHBlckJvdW5kICkKKyAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6OTI4Njo3OiBsdl9jb25zdHJhaW50c18yXzA9IHJ1bGVKdm1VcHBlckJvdW5kCiAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAKICAgICAgICAgICAgICAgICAgICAgICAJCQkJCQkJbmV3Q29tcG9zaXRlTm9kZShncmFtbWFyQWNjZXNzLmdldEp2bVdpbGRjYXJkVHlwZVJlZmVyZW5jZUFjY2VzcygpLmdldENvbnN0cmFpbnRzSnZtVXBwZXJCb3VuZFBhcnNlclJ1bGVDYWxsXzJfMF8wXzAoKSk7CiAgICAgICAgICAgICAgICAgICAgICAgCQkJCQkJCiAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMTMyKTsKKyAgICAgICAgICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMTQ1KTsKICAgICAgICAgICAgICAgICAgICAgbHZfY29uc3RyYWludHNfMl8wPXJ1bGVKdm1VcHBlckJvdW5kKCk7CiAKICAgICAgICAgICAgICAgICAgICAgc3RhdGUuX2ZzcC0tOwpAQCAtMjQyMTAsMzAgKzI1NDA0LDMwIEBACiAKICAgICAgICAgICAgICAgICAgICAgfQogCi0gICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjg4NjQ6NTogKCAobHZfY29uc3RyYWludHNfM18wPSBydWxlSnZtVXBwZXJCb3VuZEFuZGVkICkgKSoKLSAgICAgICAgICAgICAgICAgICAgbG9vcDE1NzoKKyAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6OTMwMzo1OiAoIChsdl9jb25zdHJhaW50c18zXzA9IHJ1bGVKdm1VcHBlckJvdW5kQW5kZWQgKSApKgorICAgICAgICAgICAgICAgICAgICBsb29wMTY4OgogICAgICAgICAgICAgICAgICAgICBkbyB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpbnQgYWx0MTU3PTI7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpbnQgTEExNTdfMCA9IGlucHV0LkxBKDEpOworICAgICAgICAgICAgICAgICAgICAgICAgaW50IGFsdDE2OD0yOworICAgICAgICAgICAgICAgICAgICAgICAgaW50IExBMTY4XzAgPSBpbnB1dC5MQSgxKTsKIAotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCAoTEExNTdfMD09MTM3KSApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbHQxNTc9MTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICggKExBMTY4XzA9PTE0NCkgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWx0MTY4PTE7CiAgICAgICAgICAgICAgICAgICAgICAgICB9CiAKIAotICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChhbHQxNTcpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoYWx0MTY4KSB7CiAgICAgICAgICAgICAgICAgICAgIAljYXNlIDEgOgotICAgICAgICAgICAgICAgICAgICAJICAgIC8vIEludGVybmFsRGF0YURTTC5nOjg4NjU6NjogKGx2X2NvbnN0cmFpbnRzXzNfMD0gcnVsZUp2bVVwcGVyQm91bmRBbmRlZCApCisgICAgICAgICAgICAgICAgICAgIAkgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6OTMwNDo2OiAobHZfY29uc3RyYWludHNfM18wPSBydWxlSnZtVXBwZXJCb3VuZEFuZGVkICkKICAgICAgICAgICAgICAgICAgICAgCSAgICB7Ci0gICAgICAgICAgICAgICAgICAgIAkgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6ODg2NTo2OiAobHZfY29uc3RyYWludHNfM18wPSBydWxlSnZtVXBwZXJCb3VuZEFuZGVkICkKLSAgICAgICAgICAgICAgICAgICAgCSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo4ODY2Ojc6IGx2X2NvbnN0cmFpbnRzXzNfMD0gcnVsZUp2bVVwcGVyQm91bmRBbmRlZAorICAgICAgICAgICAgICAgICAgICAJICAgIC8vIEludGVybmFsRGF0YURTTC5nOjkzMDQ6NjogKGx2X2NvbnN0cmFpbnRzXzNfMD0gcnVsZUp2bVVwcGVyQm91bmRBbmRlZCApCisgICAgICAgICAgICAgICAgICAgIAkgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6OTMwNTo3OiBsdl9jb25zdHJhaW50c18zXzA9IHJ1bGVKdm1VcHBlckJvdW5kQW5kZWQKICAgICAgICAgICAgICAgICAgICAgCSAgICB7CiAgICAgICAgICAgICAgICAgICAgIAkgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAKICAgICAgICAgICAgICAgICAgICAgCSAgICAgIAkJCQkJCQluZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0SnZtV2lsZGNhcmRUeXBlUmVmZXJlbmNlQWNjZXNzKCkuZ2V0Q29uc3RyYWludHNKdm1VcHBlckJvdW5kQW5kZWRQYXJzZXJSdWxlQ2FsbF8yXzBfMV8wKCkpOwogICAgICAgICAgICAgICAgICAgICAJICAgICAgCQkJCQkJCiAgICAgICAgICAgICAgICAgICAgIAkgICAgfQotICAgICAgICAgICAgICAgICAgICAJICAgIHB1c2hGb2xsb3coRk9MTE9XXzEzMik7CisgICAgICAgICAgICAgICAgICAgIAkgICAgcHVzaEZvbGxvdyhGT0xMT1dfMTQ1KTsKICAgICAgICAgICAgICAgICAgICAgCSAgICBsdl9jb25zdHJhaW50c18zXzA9cnVsZUp2bVVwcGVyQm91bmRBbmRlZCgpOwogCiAgICAgICAgICAgICAgICAgICAgIAkgICAgc3RhdGUuX2ZzcC0tOwpAQCAtMjQyNTksNyArMjU0NTMsNyBAQAogICAgICAgICAgICAgICAgICAgICAJICAgIGJyZWFrOwogCiAgICAgICAgICAgICAgICAgICAgIAlkZWZhdWx0IDoKLSAgICAgICAgICAgICAgICAgICAgCSAgICBicmVhayBsb29wMTU3OworICAgICAgICAgICAgICAgICAgICAJICAgIGJyZWFrIGxvb3AxNjg7CiAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIH0gd2hpbGUgKHRydWUpOwogCkBAIC0yNDI3MCwyMyArMjU0NjQsMjMgQEAKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICBjYXNlIDIgOgotICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo4ODg1OjQ6ICggKCAobHZfY29uc3RyYWludHNfNF8wPSBydWxlSnZtTG93ZXJCb3VuZCApICkgKCAobHZfY29uc3RyYWludHNfNV8wPSBydWxlSnZtTG93ZXJCb3VuZEFuZGVkICkgKSogKQorICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo5MzI0OjQ6ICggKCAobHZfY29uc3RyYWludHNfNF8wPSBydWxlSnZtTG93ZXJCb3VuZCApICkgKCAobHZfY29uc3RyYWludHNfNV8wPSBydWxlSnZtTG93ZXJCb3VuZEFuZGVkICkgKSogKQogICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjg4ODU6NDogKCAoIChsdl9jb25zdHJhaW50c180XzA9IHJ1bGVKdm1Mb3dlckJvdW5kICkgKSAoIChsdl9jb25zdHJhaW50c181XzA9IHJ1bGVKdm1Mb3dlckJvdW5kQW5kZWQgKSApKiApCi0gICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjg4ODY6NTogKCAobHZfY29uc3RyYWludHNfNF8wPSBydWxlSnZtTG93ZXJCb3VuZCApICkgKCAobHZfY29uc3RyYWludHNfNV8wPSBydWxlSnZtTG93ZXJCb3VuZEFuZGVkICkgKSoKKyAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6OTMyNDo0OiAoICggKGx2X2NvbnN0cmFpbnRzXzRfMD0gcnVsZUp2bUxvd2VyQm91bmQgKSApICggKGx2X2NvbnN0cmFpbnRzXzVfMD0gcnVsZUp2bUxvd2VyQm91bmRBbmRlZCApICkqICkKKyAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6OTMyNTo1OiAoIChsdl9jb25zdHJhaW50c180XzA9IHJ1bGVKdm1Mb3dlckJvdW5kICkgKSAoIChsdl9jb25zdHJhaW50c181XzA9IHJ1bGVKdm1Mb3dlckJvdW5kQW5kZWQgKSApKgogICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjg4ODY6NTogKCAobHZfY29uc3RyYWludHNfNF8wPSBydWxlSnZtTG93ZXJCb3VuZCApICkKLSAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6ODg4Nzo2OiAobHZfY29uc3RyYWludHNfNF8wPSBydWxlSnZtTG93ZXJCb3VuZCApCisgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjkzMjU6NTogKCAobHZfY29uc3RyYWludHNfNF8wPSBydWxlSnZtTG93ZXJCb3VuZCApICkKKyAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6OTMyNjo2OiAobHZfY29uc3RyYWludHNfNF8wPSBydWxlSnZtTG93ZXJCb3VuZCApCiAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6ODg4Nzo2OiAobHZfY29uc3RyYWludHNfNF8wPSBydWxlSnZtTG93ZXJCb3VuZCApCi0gICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjg4ODg6NzogbHZfY29uc3RyYWludHNfNF8wPSBydWxlSnZtTG93ZXJCb3VuZAorICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo5MzI2OjY6IChsdl9jb25zdHJhaW50c180XzA9IHJ1bGVKdm1Mb3dlckJvdW5kICkKKyAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6OTMyNzo3OiBsdl9jb25zdHJhaW50c180XzA9IHJ1bGVKdm1Mb3dlckJvdW5kCiAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAKICAgICAgICAgICAgICAgICAgICAgICAJCQkJCQkJbmV3Q29tcG9zaXRlTm9kZShncmFtbWFyQWNjZXNzLmdldEp2bVdpbGRjYXJkVHlwZVJlZmVyZW5jZUFjY2VzcygpLmdldENvbnN0cmFpbnRzSnZtTG93ZXJCb3VuZFBhcnNlclJ1bGVDYWxsXzJfMV8wXzAoKSk7CiAgICAgICAgICAgICAgICAgICAgICAgCQkJCQkJCiAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMTMyKTsKKyAgICAgICAgICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMTQ1KTsKICAgICAgICAgICAgICAgICAgICAgbHZfY29uc3RyYWludHNfNF8wPXJ1bGVKdm1Mb3dlckJvdW5kKCk7CiAKICAgICAgICAgICAgICAgICAgICAgc3RhdGUuX2ZzcC0tOwpAQCAtMjQzMTAsMzAgKzI1NTA0LDMwIEBACiAKICAgICAgICAgICAgICAgICAgICAgfQogCi0gICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjg5MDU6NTogKCAobHZfY29uc3RyYWludHNfNV8wPSBydWxlSnZtTG93ZXJCb3VuZEFuZGVkICkgKSoKLSAgICAgICAgICAgICAgICAgICAgbG9vcDE1ODoKKyAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6OTM0NDo1OiAoIChsdl9jb25zdHJhaW50c181XzA9IHJ1bGVKdm1Mb3dlckJvdW5kQW5kZWQgKSApKgorICAgICAgICAgICAgICAgICAgICBsb29wMTY5OgogICAgICAgICAgICAgICAgICAgICBkbyB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpbnQgYWx0MTU4PTI7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpbnQgTEExNThfMCA9IGlucHV0LkxBKDEpOworICAgICAgICAgICAgICAgICAgICAgICAgaW50IGFsdDE2OT0yOworICAgICAgICAgICAgICAgICAgICAgICAgaW50IExBMTY5XzAgPSBpbnB1dC5MQSgxKTsKIAotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCAoTEExNThfMD09MTM3KSApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbHQxNTg9MTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICggKExBMTY5XzA9PTE0NCkgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWx0MTY5PTE7CiAgICAgICAgICAgICAgICAgICAgICAgICB9CiAKIAotICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChhbHQxNTgpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoYWx0MTY5KSB7CiAgICAgICAgICAgICAgICAgICAgIAljYXNlIDEgOgotICAgICAgICAgICAgICAgICAgICAJICAgIC8vIEludGVybmFsRGF0YURTTC5nOjg5MDY6NjogKGx2X2NvbnN0cmFpbnRzXzVfMD0gcnVsZUp2bUxvd2VyQm91bmRBbmRlZCApCisgICAgICAgICAgICAgICAgICAgIAkgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6OTM0NTo2OiAobHZfY29uc3RyYWludHNfNV8wPSBydWxlSnZtTG93ZXJCb3VuZEFuZGVkICkKICAgICAgICAgICAgICAgICAgICAgCSAgICB7Ci0gICAgICAgICAgICAgICAgICAgIAkgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6ODkwNjo2OiAobHZfY29uc3RyYWludHNfNV8wPSBydWxlSnZtTG93ZXJCb3VuZEFuZGVkICkKLSAgICAgICAgICAgICAgICAgICAgCSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo4OTA3Ojc6IGx2X2NvbnN0cmFpbnRzXzVfMD0gcnVsZUp2bUxvd2VyQm91bmRBbmRlZAorICAgICAgICAgICAgICAgICAgICAJICAgIC8vIEludGVybmFsRGF0YURTTC5nOjkzNDU6NjogKGx2X2NvbnN0cmFpbnRzXzVfMD0gcnVsZUp2bUxvd2VyQm91bmRBbmRlZCApCisgICAgICAgICAgICAgICAgICAgIAkgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6OTM0Njo3OiBsdl9jb25zdHJhaW50c181XzA9IHJ1bGVKdm1Mb3dlckJvdW5kQW5kZWQKICAgICAgICAgICAgICAgICAgICAgCSAgICB7CiAgICAgICAgICAgICAgICAgICAgIAkgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAKICAgICAgICAgICAgICAgICAgICAgCSAgICAgIAkJCQkJCQluZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0SnZtV2lsZGNhcmRUeXBlUmVmZXJlbmNlQWNjZXNzKCkuZ2V0Q29uc3RyYWludHNKdm1Mb3dlckJvdW5kQW5kZWRQYXJzZXJSdWxlQ2FsbF8yXzFfMV8wKCkpOwogICAgICAgICAgICAgICAgICAgICAJICAgICAgCQkJCQkJCiAgICAgICAgICAgICAgICAgICAgIAkgICAgfQotICAgICAgICAgICAgICAgICAgICAJICAgIHB1c2hGb2xsb3coRk9MTE9XXzEzMik7CisgICAgICAgICAgICAgICAgICAgIAkgICAgcHVzaEZvbGxvdyhGT0xMT1dfMTQ1KTsKICAgICAgICAgICAgICAgICAgICAgCSAgICBsdl9jb25zdHJhaW50c181XzA9cnVsZUp2bUxvd2VyQm91bmRBbmRlZCgpOwogCiAgICAgICAgICAgICAgICAgICAgIAkgICAgc3RhdGUuX2ZzcC0tOwpAQCAtMjQzNTksNyArMjU1NTMsNyBAQAogICAgICAgICAgICAgICAgICAgICAJICAgIGJyZWFrOwogCiAgICAgICAgICAgICAgICAgICAgIAlkZWZhdWx0IDoKLSAgICAgICAgICAgICAgICAgICAgCSAgICBicmVhayBsb29wMTU4OworICAgICAgICAgICAgICAgICAgICAJICAgIGJyZWFrIGxvb3AxNjk7CiAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIH0gd2hpbGUgKHRydWUpOwogCkBAIC0yNDM5Nyw3ICsyNTU5MSw3IEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAiZW50cnlSdWxlSnZtVXBwZXJCb3VuZCIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo4OTMwOjE6IGVudHJ5UnVsZUp2bVVwcGVyQm91bmQgcmV0dXJucyBbRU9iamVjdCBjdXJyZW50PW51bGxdIDogaXZfcnVsZUp2bVVwcGVyQm91bmQ9IHJ1bGVKdm1VcHBlckJvdW5kIEVPRiA7CisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6OTM2OToxOiBlbnRyeVJ1bGVKdm1VcHBlckJvdW5kIHJldHVybnMgW0VPYmplY3QgY3VycmVudD1udWxsXSA6IGl2X3J1bGVKdm1VcHBlckJvdW5kPSBydWxlSnZtVXBwZXJCb3VuZCBFT0YgOwogICAgIHB1YmxpYyBmaW5hbCBFT2JqZWN0IGVudHJ5UnVsZUp2bVVwcGVyQm91bmQoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogICAgICAgICBFT2JqZWN0IGN1cnJlbnQgPSBudWxsOwogCkBAIC0yNDQwNSw4ICsyNTU5OSw4IEBACiAKIAogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6ODkzMDo1NDogKGl2X3J1bGVKdm1VcHBlckJvdW5kPSBydWxlSnZtVXBwZXJCb3VuZCBFT0YgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6ODkzMToyOiBpdl9ydWxlSnZtVXBwZXJCb3VuZD0gcnVsZUp2bVVwcGVyQm91bmQgRU9GCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo5MzY5OjU0OiAoaXZfcnVsZUp2bVVwcGVyQm91bmQ9IHJ1bGVKdm1VcHBlckJvdW5kIEVPRiApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo5MzcwOjI6IGl2X3J1bGVKdm1VcHBlckJvdW5kPSBydWxlSnZtVXBwZXJCb3VuZCBFT0YKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgbmV3Q29tcG9zaXRlTm9kZShncmFtbWFyQWNjZXNzLmdldEp2bVVwcGVyQm91bmRSdWxlKCkpOyAKQEAgLTI0NDM3LDcgKzI1NjMxLDcgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlSnZtVXBwZXJCb3VuZCIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo4OTM3OjE6IHJ1bGVKdm1VcHBlckJvdW5kIHJldHVybnMgW0VPYmplY3QgY3VycmVudD1udWxsXSA6IChvdGhlcmx2XzA9ICdleHRlbmRzJyAoIChsdl90eXBlUmVmZXJlbmNlXzFfMD0gcnVsZUp2bVR5cGVSZWZlcmVuY2UgKSApICkgOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjkzNzY6MTogcnVsZUp2bVVwcGVyQm91bmQgcmV0dXJucyBbRU9iamVjdCBjdXJyZW50PW51bGxdIDogKG90aGVybHZfMD0gJ2V4dGVuZHMnICggKGx2X3R5cGVSZWZlcmVuY2VfMV8wPSBydWxlSnZtVHlwZVJlZmVyZW5jZSApICkgKSA7CiAgICAgcHVibGljIGZpbmFsIEVPYmplY3QgcnVsZUp2bVVwcGVyQm91bmQoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogICAgICAgICBFT2JqZWN0IGN1cnJlbnQgPSBudWxsOwogCkBAIC0yNDQ0OSwyMyArMjU2NDMsMjMgQEAKICAgICAgICAgCWVudGVyUnVsZSgpOwogCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo4OTQzOjI6ICggKG90aGVybHZfMD0gJ2V4dGVuZHMnICggKGx2X3R5cGVSZWZlcmVuY2VfMV8wPSBydWxlSnZtVHlwZVJlZmVyZW5jZSApICkgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo4OTQ0OjI6IChvdGhlcmx2XzA9ICdleHRlbmRzJyAoIChsdl90eXBlUmVmZXJlbmNlXzFfMD0gcnVsZUp2bVR5cGVSZWZlcmVuY2UgKSApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjkzODI6MjogKCAob3RoZXJsdl8wPSAnZXh0ZW5kcycgKCAobHZfdHlwZVJlZmVyZW5jZV8xXzA9IHJ1bGVKdm1UeXBlUmVmZXJlbmNlICkgKSApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjkzODM6MjogKG90aGVybHZfMD0gJ2V4dGVuZHMnICggKGx2X3R5cGVSZWZlcmVuY2VfMV8wPSBydWxlSnZtVHlwZVJlZmVyZW5jZSApICkgKQogICAgICAgICAgICAgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6ODk0NDoyOiAob3RoZXJsdl8wPSAnZXh0ZW5kcycgKCAobHZfdHlwZVJlZmVyZW5jZV8xXzA9IHJ1bGVKdm1UeXBlUmVmZXJlbmNlICkgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo4OTQ1OjM6IG90aGVybHZfMD0gJ2V4dGVuZHMnICggKGx2X3R5cGVSZWZlcmVuY2VfMV8wPSBydWxlSnZtVHlwZVJlZmVyZW5jZSApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjkzODM6MjogKG90aGVybHZfMD0gJ2V4dGVuZHMnICggKGx2X3R5cGVSZWZlcmVuY2VfMV8wPSBydWxlSnZtVHlwZVJlZmVyZW5jZSApICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6OTM4NDozOiBvdGhlcmx2XzA9ICdleHRlbmRzJyAoIChsdl90eXBlUmVmZXJlbmNlXzFfMD0gcnVsZUp2bVR5cGVSZWZlcmVuY2UgKSApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICBvdGhlcmx2XzA9KFRva2VuKW1hdGNoKGlucHV0LDEyMyxGT0xMT1dfNzcpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gY3VycmVudDsKKyAgICAgICAgICAgIG90aGVybHZfMD0oVG9rZW4pbWF0Y2goaW5wdXQsMTMwLEZPTExPV185MSk7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OwogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAKICAgICAgICAgICAgICAgCQkJbmV3TGVhZk5vZGUob3RoZXJsdl8wLCBncmFtbWFyQWNjZXNzLmdldEp2bVVwcGVyQm91bmRBY2Nlc3MoKS5nZXRFeHRlbmRzS2V5d29yZF8wKCkpOwogICAgICAgICAgICAgICAJCQogICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6ODk0OTozOiAoIChsdl90eXBlUmVmZXJlbmNlXzFfMD0gcnVsZUp2bVR5cGVSZWZlcmVuY2UgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo4OTUwOjQ6IChsdl90eXBlUmVmZXJlbmNlXzFfMD0gcnVsZUp2bVR5cGVSZWZlcmVuY2UgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6OTM4ODozOiAoIChsdl90eXBlUmVmZXJlbmNlXzFfMD0gcnVsZUp2bVR5cGVSZWZlcmVuY2UgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo5Mzg5OjQ6IChsdl90eXBlUmVmZXJlbmNlXzFfMD0gcnVsZUp2bVR5cGVSZWZlcmVuY2UgKQogICAgICAgICAgICAgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6ODk1MDo0OiAobHZfdHlwZVJlZmVyZW5jZV8xXzA9IHJ1bGVKdm1UeXBlUmVmZXJlbmNlICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjg5NTE6NTogbHZfdHlwZVJlZmVyZW5jZV8xXzA9IHJ1bGVKdm1UeXBlUmVmZXJlbmNlCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo5Mzg5OjQ6IChsdl90eXBlUmVmZXJlbmNlXzFfMD0gcnVsZUp2bVR5cGVSZWZlcmVuY2UgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6OTM5MDo1OiBsdl90eXBlUmVmZXJlbmNlXzFfMD0gcnVsZUp2bVR5cGVSZWZlcmVuY2UKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogCkBAIC0yNDUyMSw3ICsyNTcxNSw3IEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAiZW50cnlSdWxlSnZtVXBwZXJCb3VuZEFuZGVkIgotICAgIC8vIEludGVybmFsRGF0YURTTC5nOjg5NzI6MTogZW50cnlSdWxlSnZtVXBwZXJCb3VuZEFuZGVkIHJldHVybnMgW0VPYmplY3QgY3VycmVudD1udWxsXSA6IGl2X3J1bGVKdm1VcHBlckJvdW5kQW5kZWQ9IHJ1bGVKdm1VcHBlckJvdW5kQW5kZWQgRU9GIDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo5NDExOjE6IGVudHJ5UnVsZUp2bVVwcGVyQm91bmRBbmRlZCByZXR1cm5zIFtFT2JqZWN0IGN1cnJlbnQ9bnVsbF0gOiBpdl9ydWxlSnZtVXBwZXJCb3VuZEFuZGVkPSBydWxlSnZtVXBwZXJCb3VuZEFuZGVkIEVPRiA7CiAgICAgcHVibGljIGZpbmFsIEVPYmplY3QgZW50cnlSdWxlSnZtVXBwZXJCb3VuZEFuZGVkKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKICAgICAgICAgRU9iamVjdCBjdXJyZW50ID0gbnVsbDsKIApAQCAtMjQ1MjksOCArMjU3MjMsOCBAQAogCiAKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjg5NzI6NTk6IChpdl9ydWxlSnZtVXBwZXJCb3VuZEFuZGVkPSBydWxlSnZtVXBwZXJCb3VuZEFuZGVkIEVPRiApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo4OTczOjI6IGl2X3J1bGVKdm1VcHBlckJvdW5kQW5kZWQ9IHJ1bGVKdm1VcHBlckJvdW5kQW5kZWQgRU9GCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo5NDExOjU5OiAoaXZfcnVsZUp2bVVwcGVyQm91bmRBbmRlZD0gcnVsZUp2bVVwcGVyQm91bmRBbmRlZCBFT0YgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6OTQxMjoyOiBpdl9ydWxlSnZtVXBwZXJCb3VuZEFuZGVkPSBydWxlSnZtVXBwZXJCb3VuZEFuZGVkIEVPRgogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBuZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0SnZtVXBwZXJCb3VuZEFuZGVkUnVsZSgpKTsgCkBAIC0yNDU2MSw3ICsyNTc1NSw3IEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZUp2bVVwcGVyQm91bmRBbmRlZCIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo4OTc5OjE6IHJ1bGVKdm1VcHBlckJvdW5kQW5kZWQgcmV0dXJucyBbRU9iamVjdCBjdXJyZW50PW51bGxdIDogKG90aGVybHZfMD0gJyYnICggKGx2X3R5cGVSZWZlcmVuY2VfMV8wPSBydWxlSnZtVHlwZVJlZmVyZW5jZSApICkgKSA7CisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6OTQxODoxOiBydWxlSnZtVXBwZXJCb3VuZEFuZGVkIHJldHVybnMgW0VPYmplY3QgY3VycmVudD1udWxsXSA6IChvdGhlcmx2XzA9ICcmJyAoIChsdl90eXBlUmVmZXJlbmNlXzFfMD0gcnVsZUp2bVR5cGVSZWZlcmVuY2UgKSApICkgOwogICAgIHB1YmxpYyBmaW5hbCBFT2JqZWN0IHJ1bGVKdm1VcHBlckJvdW5kQW5kZWQoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogICAgICAgICBFT2JqZWN0IGN1cnJlbnQgPSBudWxsOwogCkBAIC0yNDU3MywyMyArMjU3NjcsMjMgQEAKICAgICAgICAgCWVudGVyUnVsZSgpOwogCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo4OTg1OjI6ICggKG90aGVybHZfMD0gJyYnICggKGx2X3R5cGVSZWZlcmVuY2VfMV8wPSBydWxlSnZtVHlwZVJlZmVyZW5jZSApICkgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo4OTg2OjI6IChvdGhlcmx2XzA9ICcmJyAoIChsdl90eXBlUmVmZXJlbmNlXzFfMD0gcnVsZUp2bVR5cGVSZWZlcmVuY2UgKSApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjk0MjQ6MjogKCAob3RoZXJsdl8wPSAnJicgKCAobHZfdHlwZVJlZmVyZW5jZV8xXzA9IHJ1bGVKdm1UeXBlUmVmZXJlbmNlICkgKSApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjk0MjU6MjogKG90aGVybHZfMD0gJyYnICggKGx2X3R5cGVSZWZlcmVuY2VfMV8wPSBydWxlSnZtVHlwZVJlZmVyZW5jZSApICkgKQogICAgICAgICAgICAgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6ODk4NjoyOiAob3RoZXJsdl8wPSAnJicgKCAobHZfdHlwZVJlZmVyZW5jZV8xXzA9IHJ1bGVKdm1UeXBlUmVmZXJlbmNlICkgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo4OTg3OjM6IG90aGVybHZfMD0gJyYnICggKGx2X3R5cGVSZWZlcmVuY2VfMV8wPSBydWxlSnZtVHlwZVJlZmVyZW5jZSApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjk0MjU6MjogKG90aGVybHZfMD0gJyYnICggKGx2X3R5cGVSZWZlcmVuY2VfMV8wPSBydWxlSnZtVHlwZVJlZmVyZW5jZSApICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6OTQyNjozOiBvdGhlcmx2XzA9ICcmJyAoIChsdl90eXBlUmVmZXJlbmNlXzFfMD0gcnVsZUp2bVR5cGVSZWZlcmVuY2UgKSApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICBvdGhlcmx2XzA9KFRva2VuKW1hdGNoKGlucHV0LDEzNyxGT0xMT1dfNzcpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gY3VycmVudDsKKyAgICAgICAgICAgIG90aGVybHZfMD0oVG9rZW4pbWF0Y2goaW5wdXQsMTQ0LEZPTExPV185MSk7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OwogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAKICAgICAgICAgICAgICAgCQkJbmV3TGVhZk5vZGUob3RoZXJsdl8wLCBncmFtbWFyQWNjZXNzLmdldEp2bVVwcGVyQm91bmRBbmRlZEFjY2VzcygpLmdldEFtcGVyc2FuZEtleXdvcmRfMCgpKTsKICAgICAgICAgICAgICAgCQkKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjg5OTE6MzogKCAobHZfdHlwZVJlZmVyZW5jZV8xXzA9IHJ1bGVKdm1UeXBlUmVmZXJlbmNlICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6ODk5Mjo0OiAobHZfdHlwZVJlZmVyZW5jZV8xXzA9IHJ1bGVKdm1UeXBlUmVmZXJlbmNlICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjk0MzA6MzogKCAobHZfdHlwZVJlZmVyZW5jZV8xXzA9IHJ1bGVKdm1UeXBlUmVmZXJlbmNlICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6OTQzMTo0OiAobHZfdHlwZVJlZmVyZW5jZV8xXzA9IHJ1bGVKdm1UeXBlUmVmZXJlbmNlICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjg5OTI6NDogKGx2X3R5cGVSZWZlcmVuY2VfMV8wPSBydWxlSnZtVHlwZVJlZmVyZW5jZSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo4OTkzOjU6IGx2X3R5cGVSZWZlcmVuY2VfMV8wPSBydWxlSnZtVHlwZVJlZmVyZW5jZQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6OTQzMTo0OiAobHZfdHlwZVJlZmVyZW5jZV8xXzA9IHJ1bGVKdm1UeXBlUmVmZXJlbmNlICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjk0MzI6NTogbHZfdHlwZVJlZmVyZW5jZV8xXzA9IHJ1bGVKdm1UeXBlUmVmZXJlbmNlCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKIApAQCAtMjQ2NDUsNyArMjU4MzksNyBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgImVudHJ5UnVsZUp2bUxvd2VyQm91bmQiCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6OTAxNDoxOiBlbnRyeVJ1bGVKdm1Mb3dlckJvdW5kIHJldHVybnMgW0VPYmplY3QgY3VycmVudD1udWxsXSA6IGl2X3J1bGVKdm1Mb3dlckJvdW5kPSBydWxlSnZtTG93ZXJCb3VuZCBFT0YgOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjk0NTM6MTogZW50cnlSdWxlSnZtTG93ZXJCb3VuZCByZXR1cm5zIFtFT2JqZWN0IGN1cnJlbnQ9bnVsbF0gOiBpdl9ydWxlSnZtTG93ZXJCb3VuZD0gcnVsZUp2bUxvd2VyQm91bmQgRU9GIDsKICAgICBwdWJsaWMgZmluYWwgRU9iamVjdCBlbnRyeVJ1bGVKdm1Mb3dlckJvdW5kKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKICAgICAgICAgRU9iamVjdCBjdXJyZW50ID0gbnVsbDsKIApAQCAtMjQ2NTMsOCArMjU4NDcsOCBAQAogCiAKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjkwMTQ6NTQ6IChpdl9ydWxlSnZtTG93ZXJCb3VuZD0gcnVsZUp2bUxvd2VyQm91bmQgRU9GICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjkwMTU6MjogaXZfcnVsZUp2bUxvd2VyQm91bmQ9IHJ1bGVKdm1Mb3dlckJvdW5kIEVPRgorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6OTQ1Mzo1NDogKGl2X3J1bGVKdm1Mb3dlckJvdW5kPSBydWxlSnZtTG93ZXJCb3VuZCBFT0YgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6OTQ1NDoyOiBpdl9ydWxlSnZtTG93ZXJCb3VuZD0gcnVsZUp2bUxvd2VyQm91bmQgRU9GCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIG5ld0NvbXBvc2l0ZU5vZGUoZ3JhbW1hckFjY2Vzcy5nZXRKdm1Mb3dlckJvdW5kUnVsZSgpKTsgCkBAIC0yNDY4NSw3ICsyNTg3OSw3IEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZUp2bUxvd2VyQm91bmQiCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6OTAyMToxOiBydWxlSnZtTG93ZXJCb3VuZCByZXR1cm5zIFtFT2JqZWN0IGN1cnJlbnQ9bnVsbF0gOiAob3RoZXJsdl8wPSAnc3VwZXInICggKGx2X3R5cGVSZWZlcmVuY2VfMV8wPSBydWxlSnZtVHlwZVJlZmVyZW5jZSApICkgKSA7CisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6OTQ2MDoxOiBydWxlSnZtTG93ZXJCb3VuZCByZXR1cm5zIFtFT2JqZWN0IGN1cnJlbnQ9bnVsbF0gOiAob3RoZXJsdl8wPSAnc3VwZXInICggKGx2X3R5cGVSZWZlcmVuY2VfMV8wPSBydWxlSnZtVHlwZVJlZmVyZW5jZSApICkgKSA7CiAgICAgcHVibGljIGZpbmFsIEVPYmplY3QgcnVsZUp2bUxvd2VyQm91bmQoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogICAgICAgICBFT2JqZWN0IGN1cnJlbnQgPSBudWxsOwogCkBAIC0yNDY5NywyMyArMjU4OTEsMjMgQEAKICAgICAgICAgCWVudGVyUnVsZSgpOwogCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo5MDI3OjI6ICggKG90aGVybHZfMD0gJ3N1cGVyJyAoIChsdl90eXBlUmVmZXJlbmNlXzFfMD0gcnVsZUp2bVR5cGVSZWZlcmVuY2UgKSApICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6OTAyODoyOiAob3RoZXJsdl8wPSAnc3VwZXInICggKGx2X3R5cGVSZWZlcmVuY2VfMV8wPSBydWxlSnZtVHlwZVJlZmVyZW5jZSApICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6OTQ2NjoyOiAoIChvdGhlcmx2XzA9ICdzdXBlcicgKCAobHZfdHlwZVJlZmVyZW5jZV8xXzA9IHJ1bGVKdm1UeXBlUmVmZXJlbmNlICkgKSApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjk0Njc6MjogKG90aGVybHZfMD0gJ3N1cGVyJyAoIChsdl90eXBlUmVmZXJlbmNlXzFfMD0gcnVsZUp2bVR5cGVSZWZlcmVuY2UgKSApICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjkwMjg6MjogKG90aGVybHZfMD0gJ3N1cGVyJyAoIChsdl90eXBlUmVmZXJlbmNlXzFfMD0gcnVsZUp2bVR5cGVSZWZlcmVuY2UgKSApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjkwMjk6Mzogb3RoZXJsdl8wPSAnc3VwZXInICggKGx2X3R5cGVSZWZlcmVuY2VfMV8wPSBydWxlSnZtVHlwZVJlZmVyZW5jZSApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjk0Njc6MjogKG90aGVybHZfMD0gJ3N1cGVyJyAoIChsdl90eXBlUmVmZXJlbmNlXzFfMD0gcnVsZUp2bVR5cGVSZWZlcmVuY2UgKSApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjk0Njg6Mzogb3RoZXJsdl8wPSAnc3VwZXInICggKGx2X3R5cGVSZWZlcmVuY2VfMV8wPSBydWxlSnZtVHlwZVJlZmVyZW5jZSApICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIG90aGVybHZfMD0oVG9rZW4pbWF0Y2goaW5wdXQsMTI0LEZPTExPV183Nyk7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OworICAgICAgICAgICAgb3RoZXJsdl8wPShUb2tlbiltYXRjaChpbnB1dCwxMzEsRk9MTE9XXzkxKTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKIAogICAgICAgICAgICAgICAJCQluZXdMZWFmTm9kZShvdGhlcmx2XzAsIGdyYW1tYXJBY2Nlc3MuZ2V0SnZtTG93ZXJCb3VuZEFjY2VzcygpLmdldFN1cGVyS2V5d29yZF8wKCkpOwogICAgICAgICAgICAgICAJCQogICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6OTAzMzozOiAoIChsdl90eXBlUmVmZXJlbmNlXzFfMD0gcnVsZUp2bVR5cGVSZWZlcmVuY2UgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo5MDM0OjQ6IChsdl90eXBlUmVmZXJlbmNlXzFfMD0gcnVsZUp2bVR5cGVSZWZlcmVuY2UgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6OTQ3MjozOiAoIChsdl90eXBlUmVmZXJlbmNlXzFfMD0gcnVsZUp2bVR5cGVSZWZlcmVuY2UgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo5NDczOjQ6IChsdl90eXBlUmVmZXJlbmNlXzFfMD0gcnVsZUp2bVR5cGVSZWZlcmVuY2UgKQogICAgICAgICAgICAgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6OTAzNDo0OiAobHZfdHlwZVJlZmVyZW5jZV8xXzA9IHJ1bGVKdm1UeXBlUmVmZXJlbmNlICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjkwMzU6NTogbHZfdHlwZVJlZmVyZW5jZV8xXzA9IHJ1bGVKdm1UeXBlUmVmZXJlbmNlCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo5NDczOjQ6IChsdl90eXBlUmVmZXJlbmNlXzFfMD0gcnVsZUp2bVR5cGVSZWZlcmVuY2UgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6OTQ3NDo1OiBsdl90eXBlUmVmZXJlbmNlXzFfMD0gcnVsZUp2bVR5cGVSZWZlcmVuY2UKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogCkBAIC0yNDc2OSw3ICsyNTk2Myw3IEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAiZW50cnlSdWxlSnZtTG93ZXJCb3VuZEFuZGVkIgotICAgIC8vIEludGVybmFsRGF0YURTTC5nOjkwNTY6MTogZW50cnlSdWxlSnZtTG93ZXJCb3VuZEFuZGVkIHJldHVybnMgW0VPYmplY3QgY3VycmVudD1udWxsXSA6IGl2X3J1bGVKdm1Mb3dlckJvdW5kQW5kZWQ9IHJ1bGVKdm1Mb3dlckJvdW5kQW5kZWQgRU9GIDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo5NDk1OjE6IGVudHJ5UnVsZUp2bUxvd2VyQm91bmRBbmRlZCByZXR1cm5zIFtFT2JqZWN0IGN1cnJlbnQ9bnVsbF0gOiBpdl9ydWxlSnZtTG93ZXJCb3VuZEFuZGVkPSBydWxlSnZtTG93ZXJCb3VuZEFuZGVkIEVPRiA7CiAgICAgcHVibGljIGZpbmFsIEVPYmplY3QgZW50cnlSdWxlSnZtTG93ZXJCb3VuZEFuZGVkKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKICAgICAgICAgRU9iamVjdCBjdXJyZW50ID0gbnVsbDsKIApAQCAtMjQ3NzcsOCArMjU5NzEsOCBAQAogCiAKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjkwNTY6NTk6IChpdl9ydWxlSnZtTG93ZXJCb3VuZEFuZGVkPSBydWxlSnZtTG93ZXJCb3VuZEFuZGVkIEVPRiApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo5MDU3OjI6IGl2X3J1bGVKdm1Mb3dlckJvdW5kQW5kZWQ9IHJ1bGVKdm1Mb3dlckJvdW5kQW5kZWQgRU9GCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo5NDk1OjU5OiAoaXZfcnVsZUp2bUxvd2VyQm91bmRBbmRlZD0gcnVsZUp2bUxvd2VyQm91bmRBbmRlZCBFT0YgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6OTQ5NjoyOiBpdl9ydWxlSnZtTG93ZXJCb3VuZEFuZGVkPSBydWxlSnZtTG93ZXJCb3VuZEFuZGVkIEVPRgogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBuZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0SnZtTG93ZXJCb3VuZEFuZGVkUnVsZSgpKTsgCkBAIC0yNDgwOSw3ICsyNjAwMyw3IEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZUp2bUxvd2VyQm91bmRBbmRlZCIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo5MDYzOjE6IHJ1bGVKdm1Mb3dlckJvdW5kQW5kZWQgcmV0dXJucyBbRU9iamVjdCBjdXJyZW50PW51bGxdIDogKG90aGVybHZfMD0gJyYnICggKGx2X3R5cGVSZWZlcmVuY2VfMV8wPSBydWxlSnZtVHlwZVJlZmVyZW5jZSApICkgKSA7CisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6OTUwMjoxOiBydWxlSnZtTG93ZXJCb3VuZEFuZGVkIHJldHVybnMgW0VPYmplY3QgY3VycmVudD1udWxsXSA6IChvdGhlcmx2XzA9ICcmJyAoIChsdl90eXBlUmVmZXJlbmNlXzFfMD0gcnVsZUp2bVR5cGVSZWZlcmVuY2UgKSApICkgOwogICAgIHB1YmxpYyBmaW5hbCBFT2JqZWN0IHJ1bGVKdm1Mb3dlckJvdW5kQW5kZWQoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogICAgICAgICBFT2JqZWN0IGN1cnJlbnQgPSBudWxsOwogCkBAIC0yNDgyMSwyMyArMjYwMTUsMjMgQEAKICAgICAgICAgCWVudGVyUnVsZSgpOwogCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo5MDY5OjI6ICggKG90aGVybHZfMD0gJyYnICggKGx2X3R5cGVSZWZlcmVuY2VfMV8wPSBydWxlSnZtVHlwZVJlZmVyZW5jZSApICkgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo5MDcwOjI6IChvdGhlcmx2XzA9ICcmJyAoIChsdl90eXBlUmVmZXJlbmNlXzFfMD0gcnVsZUp2bVR5cGVSZWZlcmVuY2UgKSApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjk1MDg6MjogKCAob3RoZXJsdl8wPSAnJicgKCAobHZfdHlwZVJlZmVyZW5jZV8xXzA9IHJ1bGVKdm1UeXBlUmVmZXJlbmNlICkgKSApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjk1MDk6MjogKG90aGVybHZfMD0gJyYnICggKGx2X3R5cGVSZWZlcmVuY2VfMV8wPSBydWxlSnZtVHlwZVJlZmVyZW5jZSApICkgKQogICAgICAgICAgICAgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6OTA3MDoyOiAob3RoZXJsdl8wPSAnJicgKCAobHZfdHlwZVJlZmVyZW5jZV8xXzA9IHJ1bGVKdm1UeXBlUmVmZXJlbmNlICkgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo5MDcxOjM6IG90aGVybHZfMD0gJyYnICggKGx2X3R5cGVSZWZlcmVuY2VfMV8wPSBydWxlSnZtVHlwZVJlZmVyZW5jZSApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjk1MDk6MjogKG90aGVybHZfMD0gJyYnICggKGx2X3R5cGVSZWZlcmVuY2VfMV8wPSBydWxlSnZtVHlwZVJlZmVyZW5jZSApICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6OTUxMDozOiBvdGhlcmx2XzA9ICcmJyAoIChsdl90eXBlUmVmZXJlbmNlXzFfMD0gcnVsZUp2bVR5cGVSZWZlcmVuY2UgKSApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICBvdGhlcmx2XzA9KFRva2VuKW1hdGNoKGlucHV0LDEzNyxGT0xMT1dfNzcpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gY3VycmVudDsKKyAgICAgICAgICAgIG90aGVybHZfMD0oVG9rZW4pbWF0Y2goaW5wdXQsMTQ0LEZPTExPV185MSk7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OwogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAKICAgICAgICAgICAgICAgCQkJbmV3TGVhZk5vZGUob3RoZXJsdl8wLCBncmFtbWFyQWNjZXNzLmdldEp2bUxvd2VyQm91bmRBbmRlZEFjY2VzcygpLmdldEFtcGVyc2FuZEtleXdvcmRfMCgpKTsKICAgICAgICAgICAgICAgCQkKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjkwNzU6MzogKCAobHZfdHlwZVJlZmVyZW5jZV8xXzA9IHJ1bGVKdm1UeXBlUmVmZXJlbmNlICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6OTA3Njo0OiAobHZfdHlwZVJlZmVyZW5jZV8xXzA9IHJ1bGVKdm1UeXBlUmVmZXJlbmNlICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjk1MTQ6MzogKCAobHZfdHlwZVJlZmVyZW5jZV8xXzA9IHJ1bGVKdm1UeXBlUmVmZXJlbmNlICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6OTUxNTo0OiAobHZfdHlwZVJlZmVyZW5jZV8xXzA9IHJ1bGVKdm1UeXBlUmVmZXJlbmNlICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjkwNzY6NDogKGx2X3R5cGVSZWZlcmVuY2VfMV8wPSBydWxlSnZtVHlwZVJlZmVyZW5jZSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo5MDc3OjU6IGx2X3R5cGVSZWZlcmVuY2VfMV8wPSBydWxlSnZtVHlwZVJlZmVyZW5jZQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6OTUxNTo0OiAobHZfdHlwZVJlZmVyZW5jZV8xXzA9IHJ1bGVKdm1UeXBlUmVmZXJlbmNlICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjk1MTY6NTogbHZfdHlwZVJlZmVyZW5jZV8xXzA9IHJ1bGVKdm1UeXBlUmVmZXJlbmNlCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKIApAQCAtMjQ4OTMsNyArMjYwODcsNyBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgImVudHJ5UnVsZVF1YWxpZmllZE5hbWVXaXRoV2lsZGNhcmQiCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6OTA5ODoxOiBlbnRyeVJ1bGVRdWFsaWZpZWROYW1lV2l0aFdpbGRjYXJkIHJldHVybnMgW1N0cmluZyBjdXJyZW50PW51bGxdIDogaXZfcnVsZVF1YWxpZmllZE5hbWVXaXRoV2lsZGNhcmQ9IHJ1bGVRdWFsaWZpZWROYW1lV2l0aFdpbGRjYXJkIEVPRiA7CisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6OTUzNzoxOiBlbnRyeVJ1bGVRdWFsaWZpZWROYW1lV2l0aFdpbGRjYXJkIHJldHVybnMgW1N0cmluZyBjdXJyZW50PW51bGxdIDogaXZfcnVsZVF1YWxpZmllZE5hbWVXaXRoV2lsZGNhcmQ9IHJ1bGVRdWFsaWZpZWROYW1lV2l0aFdpbGRjYXJkIEVPRiA7CiAgICAgcHVibGljIGZpbmFsIFN0cmluZyBlbnRyeVJ1bGVRdWFsaWZpZWROYW1lV2l0aFdpbGRjYXJkKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKICAgICAgICAgU3RyaW5nIGN1cnJlbnQgPSBudWxsOwogCkBAIC0yNDkwMSw4ICsyNjA5NSw4IEBACiAKIAogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6OTA5ODo2NTogKGl2X3J1bGVRdWFsaWZpZWROYW1lV2l0aFdpbGRjYXJkPSBydWxlUXVhbGlmaWVkTmFtZVdpdGhXaWxkY2FyZCBFT0YgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6OTA5OToyOiBpdl9ydWxlUXVhbGlmaWVkTmFtZVdpdGhXaWxkY2FyZD0gcnVsZVF1YWxpZmllZE5hbWVXaXRoV2lsZGNhcmQgRU9GCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo5NTM3OjY1OiAoaXZfcnVsZVF1YWxpZmllZE5hbWVXaXRoV2lsZGNhcmQ9IHJ1bGVRdWFsaWZpZWROYW1lV2l0aFdpbGRjYXJkIEVPRiApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo5NTM4OjI6IGl2X3J1bGVRdWFsaWZpZWROYW1lV2l0aFdpbGRjYXJkPSBydWxlUXVhbGlmaWVkTmFtZVdpdGhXaWxkY2FyZCBFT0YKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgbmV3Q29tcG9zaXRlTm9kZShncmFtbWFyQWNjZXNzLmdldFF1YWxpZmllZE5hbWVXaXRoV2lsZGNhcmRSdWxlKCkpOyAKQEAgLTI0OTMzLDcgKzI2MTI3LDcgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlUXVhbGlmaWVkTmFtZVdpdGhXaWxkY2FyZCIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo5MTA1OjE6IHJ1bGVRdWFsaWZpZWROYW1lV2l0aFdpbGRjYXJkIHJldHVybnMgW0FudGxyRGF0YXR5cGVSdWxlVG9rZW4gY3VycmVudD1uZXcgQW50bHJEYXRhdHlwZVJ1bGVUb2tlbigpXSA6ICh0aGlzX1F1YWxpZmllZE5hbWVfMD0gcnVsZVF1YWxpZmllZE5hbWUga3c9ICcuJyBrdz0gJyonICkgOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjk1NDQ6MTogcnVsZVF1YWxpZmllZE5hbWVXaXRoV2lsZGNhcmQgcmV0dXJucyBbQW50bHJEYXRhdHlwZVJ1bGVUb2tlbiBjdXJyZW50PW5ldyBBbnRsckRhdGF0eXBlUnVsZVRva2VuKCldIDogKHRoaXNfUXVhbGlmaWVkTmFtZV8wPSBydWxlUXVhbGlmaWVkTmFtZSBrdz0gJy4nIGt3PSAnKicgKSA7CiAgICAgcHVibGljIGZpbmFsIEFudGxyRGF0YXR5cGVSdWxlVG9rZW4gcnVsZVF1YWxpZmllZE5hbWVXaXRoV2lsZGNhcmQoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogICAgICAgICBBbnRsckRhdGF0eXBlUnVsZVRva2VuIGN1cnJlbnQgPSBuZXcgQW50bHJEYXRhdHlwZVJ1bGVUb2tlbigpOwogCkBAIC0yNDk0NSwxOCArMjYxMzksMTggQEAKICAgICAgICAgCWVudGVyUnVsZSgpOwogCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo5MTExOjI6ICggKHRoaXNfUXVhbGlmaWVkTmFtZV8wPSBydWxlUXVhbGlmaWVkTmFtZSBrdz0gJy4nIGt3PSAnKicgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo5MTEyOjI6ICh0aGlzX1F1YWxpZmllZE5hbWVfMD0gcnVsZVF1YWxpZmllZE5hbWUga3c9ICcuJyBrdz0gJyonICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjk1NTA6MjogKCAodGhpc19RdWFsaWZpZWROYW1lXzA9IHJ1bGVRdWFsaWZpZWROYW1lIGt3PSAnLicga3c9ICcqJyApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjk1NTE6MjogKHRoaXNfUXVhbGlmaWVkTmFtZV8wPSBydWxlUXVhbGlmaWVkTmFtZSBrdz0gJy4nIGt3PSAnKicgKQogICAgICAgICAgICAgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6OTExMjoyOiAodGhpc19RdWFsaWZpZWROYW1lXzA9IHJ1bGVRdWFsaWZpZWROYW1lIGt3PSAnLicga3c9ICcqJyApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo5MTEzOjM6IHRoaXNfUXVhbGlmaWVkTmFtZV8wPSBydWxlUXVhbGlmaWVkTmFtZSBrdz0gJy4nIGt3PSAnKicKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjk1NTE6MjogKHRoaXNfUXVhbGlmaWVkTmFtZV8wPSBydWxlUXVhbGlmaWVkTmFtZSBrdz0gJy4nIGt3PSAnKicgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6OTU1MjozOiB0aGlzX1F1YWxpZmllZE5hbWVfMD0gcnVsZVF1YWxpZmllZE5hbWUga3c9ICcuJyBrdz0gJyonCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKIAogICAgICAgICAgICAgICAJCQluZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0UXVhbGlmaWVkTmFtZVdpdGhXaWxkY2FyZEFjY2VzcygpLmdldFF1YWxpZmllZE5hbWVQYXJzZXJSdWxlQ2FsbF8wKCkpOwogICAgICAgICAgICAgICAJCQogICAgICAgICAgICAgfQotICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMTMzKTsKKyAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzE0Nik7CiAgICAgICAgICAgICB0aGlzX1F1YWxpZmllZE5hbWVfMD1ydWxlUXVhbGlmaWVkTmFtZSgpOwogCiAgICAgICAgICAgICBzdGF0ZS5fZnNwLS07CkBAIC0yNDk3MSwxNCArMjYxNjUsMTQgQEAKICAgICAgICAgICAgICAgCQkJYWZ0ZXJQYXJzZXJPckVudW1SdWxlQ2FsbCgpOwogICAgICAgICAgICAgICAJCQogICAgICAgICAgICAgfQotICAgICAgICAgICAga3c9KFRva2VuKW1hdGNoKGlucHV0LDY3LEZPTExPV18xMzQpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gY3VycmVudDsKKyAgICAgICAgICAgIGt3PShUb2tlbiltYXRjaChpbnB1dCw3NCxGT0xMT1dfMTQ3KTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKIAogICAgICAgICAgICAgICAJCQljdXJyZW50Lm1lcmdlKGt3KTsKICAgICAgICAgICAgICAgCQkJbmV3TGVhZk5vZGUoa3csIGdyYW1tYXJBY2Nlc3MuZ2V0UXVhbGlmaWVkTmFtZVdpdGhXaWxkY2FyZEFjY2VzcygpLmdldEZ1bGxTdG9wS2V5d29yZF8xKCkpOwogICAgICAgICAgICAgICAJCQogICAgICAgICAgICAgfQotICAgICAgICAgICAga3c9KFRva2VuKW1hdGNoKGlucHV0LDcwLEZPTExPV18yKTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7CisgICAgICAgICAgICBrdz0oVG9rZW4pbWF0Y2goaW5wdXQsNzcsRk9MTE9XXzIpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gY3VycmVudDsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogCiAgICAgICAgICAgICAgIAkJCWN1cnJlbnQubWVyZ2Uoa3cpOwpAQCAtMjUwMTAsNyArMjYyMDQsNyBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgImVudHJ5UnVsZVZhbGlkSUQiCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6OTEzNzoxOiBlbnRyeVJ1bGVWYWxpZElEIHJldHVybnMgW1N0cmluZyBjdXJyZW50PW51bGxdIDogaXZfcnVsZVZhbGlkSUQ9IHJ1bGVWYWxpZElEIEVPRiA7CisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6OTU3NjoxOiBlbnRyeVJ1bGVWYWxpZElEIHJldHVybnMgW1N0cmluZyBjdXJyZW50PW51bGxdIDogaXZfcnVsZVZhbGlkSUQ9IHJ1bGVWYWxpZElEIEVPRiA7CiAgICAgcHVibGljIGZpbmFsIFN0cmluZyBlbnRyeVJ1bGVWYWxpZElEKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKICAgICAgICAgU3RyaW5nIGN1cnJlbnQgPSBudWxsOwogCkBAIC0yNTAxOCw4ICsyNjIxMiw4IEBACiAKIAogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6OTEzNzo0NzogKGl2X3J1bGVWYWxpZElEPSBydWxlVmFsaWRJRCBFT0YgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6OTEzODoyOiBpdl9ydWxlVmFsaWRJRD0gcnVsZVZhbGlkSUQgRU9GCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo5NTc2OjQ3OiAoaXZfcnVsZVZhbGlkSUQ9IHJ1bGVWYWxpZElEIEVPRiApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo5NTc3OjI6IGl2X3J1bGVWYWxpZElEPSBydWxlVmFsaWRJRCBFT0YKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgbmV3Q29tcG9zaXRlTm9kZShncmFtbWFyQWNjZXNzLmdldFZhbGlkSURSdWxlKCkpOyAKQEAgLTI1MDUwLDcgKzI2MjQ0LDcgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlVmFsaWRJRCIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo5MTQ0OjE6IHJ1bGVWYWxpZElEIHJldHVybnMgW0FudGxyRGF0YXR5cGVSdWxlVG9rZW4gY3VycmVudD1uZXcgQW50bHJEYXRhdHlwZVJ1bGVUb2tlbigpXSA6IHRoaXNfSURfMD0gUlVMRV9JRCA7CisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6OTU4MzoxOiBydWxlVmFsaWRJRCByZXR1cm5zIFtBbnRsckRhdGF0eXBlUnVsZVRva2VuIGN1cnJlbnQ9bmV3IEFudGxyRGF0YXR5cGVSdWxlVG9rZW4oKV0gOiB0aGlzX0lEXzA9IFJVTEVfSUQgOwogICAgIHB1YmxpYyBmaW5hbCBBbnRsckRhdGF0eXBlUnVsZVRva2VuIHJ1bGVWYWxpZElEKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKICAgICAgICAgQW50bHJEYXRhdHlwZVJ1bGVUb2tlbiBjdXJyZW50ID0gbmV3IEFudGxyRGF0YXR5cGVSdWxlVG9rZW4oKTsKIApAQCAtMjUwNjAsOCArMjYyNTQsOCBAQAogICAgICAgICAJZW50ZXJSdWxlKCk7CiAKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjkxNTA6MjogKHRoaXNfSURfMD0gUlVMRV9JRCApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo5MTUxOjI6IHRoaXNfSURfMD0gUlVMRV9JRAorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6OTU4OToyOiAodGhpc19JRF8wPSBSVUxFX0lEICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjk1OTA6MjogdGhpc19JRF8wPSBSVUxFX0lECiAgICAgICAgICAgICB7CiAgICAgICAgICAgICB0aGlzX0lEXzA9KFRva2VuKW1hdGNoKGlucHV0LFJVTEVfSUQsRk9MTE9XXzIpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gY3VycmVudDsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewpAQCAtMjUwOTYsNyArMjYyOTAsNyBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgImVudHJ5UnVsZVhJbXBvcnRTZWN0aW9uIgotICAgIC8vIEludGVybmFsRGF0YURTTC5nOjkxNjE6MTogZW50cnlSdWxlWEltcG9ydFNlY3Rpb24gcmV0dXJucyBbRU9iamVjdCBjdXJyZW50PW51bGxdIDogaXZfcnVsZVhJbXBvcnRTZWN0aW9uPSBydWxlWEltcG9ydFNlY3Rpb24gRU9GIDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo5NjAwOjE6IGVudHJ5UnVsZVhJbXBvcnRTZWN0aW9uIHJldHVybnMgW0VPYmplY3QgY3VycmVudD1udWxsXSA6IGl2X3J1bGVYSW1wb3J0U2VjdGlvbj0gcnVsZVhJbXBvcnRTZWN0aW9uIEVPRiA7CiAgICAgcHVibGljIGZpbmFsIEVPYmplY3QgZW50cnlSdWxlWEltcG9ydFNlY3Rpb24oKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogICAgICAgICBFT2JqZWN0IGN1cnJlbnQgPSBudWxsOwogCkBAIC0yNTEwNCw4ICsyNjI5OCw4IEBACiAKIAogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6OTE2MTo1NTogKGl2X3J1bGVYSW1wb3J0U2VjdGlvbj0gcnVsZVhJbXBvcnRTZWN0aW9uIEVPRiApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo5MTYyOjI6IGl2X3J1bGVYSW1wb3J0U2VjdGlvbj0gcnVsZVhJbXBvcnRTZWN0aW9uIEVPRgorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6OTYwMDo1NTogKGl2X3J1bGVYSW1wb3J0U2VjdGlvbj0gcnVsZVhJbXBvcnRTZWN0aW9uIEVPRiApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo5NjAxOjI6IGl2X3J1bGVYSW1wb3J0U2VjdGlvbj0gcnVsZVhJbXBvcnRTZWN0aW9uIEVPRgogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBuZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0WEltcG9ydFNlY3Rpb25SdWxlKCkpOyAKQEAgLTI1MTM2LDcgKzI2MzMwLDcgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlWEltcG9ydFNlY3Rpb24iCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6OTE2ODoxOiBydWxlWEltcG9ydFNlY3Rpb24gcmV0dXJucyBbRU9iamVjdCBjdXJyZW50PW51bGxdIDogKCAobHZfaW1wb3J0RGVjbGFyYXRpb25zXzBfMD0gcnVsZVhJbXBvcnREZWNsYXJhdGlvbiApICkrIDsKKyAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo5NjA3OjE6IHJ1bGVYSW1wb3J0U2VjdGlvbiByZXR1cm5zIFtFT2JqZWN0IGN1cnJlbnQ9bnVsbF0gOiAoIChsdl9pbXBvcnREZWNsYXJhdGlvbnNfMF8wPSBydWxlWEltcG9ydERlY2xhcmF0aW9uICkgKSsgOwogICAgIHB1YmxpYyBmaW5hbCBFT2JqZWN0IHJ1bGVYSW1wb3J0U2VjdGlvbigpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAgICAgICAgIEVPYmplY3QgY3VycmVudCA9IG51bGw7CiAKQEAgLTI1MTQ3LDM0ICsyNjM0MSwzNCBAQAogICAgICAgICAJZW50ZXJSdWxlKCk7CiAKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjkxNzQ6MjogKCAoIChsdl9pbXBvcnREZWNsYXJhdGlvbnNfMF8wPSBydWxlWEltcG9ydERlY2xhcmF0aW9uICkgKSsgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6OTE3NToyOiAoIChsdl9pbXBvcnREZWNsYXJhdGlvbnNfMF8wPSBydWxlWEltcG9ydERlY2xhcmF0aW9uICkgKSsKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjk2MTM6MjogKCAoIChsdl9pbXBvcnREZWNsYXJhdGlvbnNfMF8wPSBydWxlWEltcG9ydERlY2xhcmF0aW9uICkgKSsgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6OTYxNDoyOiAoIChsdl9pbXBvcnREZWNsYXJhdGlvbnNfMF8wPSBydWxlWEltcG9ydERlY2xhcmF0aW9uICkgKSsKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjkxNzU6MjogKCAobHZfaW1wb3J0RGVjbGFyYXRpb25zXzBfMD0gcnVsZVhJbXBvcnREZWNsYXJhdGlvbiApICkrCi0gICAgICAgICAgICBpbnQgY250MTYwPTA7Ci0gICAgICAgICAgICBsb29wMTYwOgorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6OTYxNDoyOiAoIChsdl9pbXBvcnREZWNsYXJhdGlvbnNfMF8wPSBydWxlWEltcG9ydERlY2xhcmF0aW9uICkgKSsKKyAgICAgICAgICAgIGludCBjbnQxNzE9MDsKKyAgICAgICAgICAgIGxvb3AxNzE6CiAgICAgICAgICAgICBkbyB7Ci0gICAgICAgICAgICAgICAgaW50IGFsdDE2MD0yOwotICAgICAgICAgICAgICAgIGludCBMQTE2MF8wID0gaW5wdXQuTEEoMSk7CisgICAgICAgICAgICAgICAgaW50IGFsdDE3MT0yOworICAgICAgICAgICAgICAgIGludCBMQTE3MV8wID0gaW5wdXQuTEEoMSk7CiAKLSAgICAgICAgICAgICAgICBpZiAoIChMQTE2MF8wPT02OCkgKSB7Ci0gICAgICAgICAgICAgICAgICAgIGFsdDE2MD0xOworICAgICAgICAgICAgICAgIGlmICggKExBMTcxXzA9PTc1KSApIHsKKyAgICAgICAgICAgICAgICAgICAgYWx0MTcxPTE7CiAgICAgICAgICAgICAgICAgfQogCiAKLSAgICAgICAgICAgICAgICBzd2l0Y2ggKGFsdDE2MCkgeworICAgICAgICAgICAgICAgIHN3aXRjaCAoYWx0MTcxKSB7CiAgICAgICAgICAgICAJY2FzZSAxIDoKLSAgICAgICAgICAgIAkgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6OTE3NjozOiAobHZfaW1wb3J0RGVjbGFyYXRpb25zXzBfMD0gcnVsZVhJbXBvcnREZWNsYXJhdGlvbiApCisgICAgICAgICAgICAJICAgIC8vIEludGVybmFsRGF0YURTTC5nOjk2MTU6MzogKGx2X2ltcG9ydERlY2xhcmF0aW9uc18wXzA9IHJ1bGVYSW1wb3J0RGVjbGFyYXRpb24gKQogICAgICAgICAgICAgCSAgICB7Ci0gICAgICAgICAgICAJICAgIC8vIEludGVybmFsRGF0YURTTC5nOjkxNzY6MzogKGx2X2ltcG9ydERlY2xhcmF0aW9uc18wXzA9IHJ1bGVYSW1wb3J0RGVjbGFyYXRpb24gKQotICAgICAgICAgICAgCSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo5MTc3OjQ6IGx2X2ltcG9ydERlY2xhcmF0aW9uc18wXzA9IHJ1bGVYSW1wb3J0RGVjbGFyYXRpb24KKyAgICAgICAgICAgIAkgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6OTYxNTozOiAobHZfaW1wb3J0RGVjbGFyYXRpb25zXzBfMD0gcnVsZVhJbXBvcnREZWNsYXJhdGlvbiApCisgICAgICAgICAgICAJICAgIC8vIEludGVybmFsRGF0YURTTC5nOjk2MTY6NDogbHZfaW1wb3J0RGVjbGFyYXRpb25zXzBfMD0gcnVsZVhJbXBvcnREZWNsYXJhdGlvbgogICAgICAgICAgICAgCSAgICB7CiAgICAgICAgICAgICAJICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogCiAgICAgICAgICAgICAJICAgICAgCQkJCW5ld0NvbXBvc2l0ZU5vZGUoZ3JhbW1hckFjY2Vzcy5nZXRYSW1wb3J0U2VjdGlvbkFjY2VzcygpLmdldEltcG9ydERlY2xhcmF0aW9uc1hJbXBvcnREZWNsYXJhdGlvblBhcnNlclJ1bGVDYWxsXzAoKSk7CiAgICAgICAgICAgICAJICAgICAgCQkJCiAgICAgICAgICAgICAJICAgIH0KLSAgICAgICAgICAgIAkgICAgcHVzaEZvbGxvdyhGT0xMT1dfMTM1KTsKKyAgICAgICAgICAgIAkgICAgcHVzaEZvbGxvdyhGT0xMT1dfMTQ4KTsKICAgICAgICAgICAgIAkgICAgbHZfaW1wb3J0RGVjbGFyYXRpb25zXzBfMD1ydWxlWEltcG9ydERlY2xhcmF0aW9uKCk7CiAKICAgICAgICAgICAgIAkgICAgc3RhdGUuX2ZzcC0tOwpAQCAtMjUyMDAsMTMgKzI2Mzk0LDEzIEBACiAgICAgICAgICAgICAJICAgIGJyZWFrOwogCiAgICAgICAgICAgICAJZGVmYXVsdCA6Ci0gICAgICAgICAgICAJICAgIGlmICggY250MTYwID49IDEgKSBicmVhayBsb29wMTYwOworICAgICAgICAgICAgCSAgICBpZiAoIGNudDE3MSA+PSAxICkgYnJlYWsgbG9vcDE3MTsKICAgICAgICAgICAgIAkgICAgaWYgKHN0YXRlLmJhY2t0cmFja2luZz4wKSB7c3RhdGUuZmFpbGVkPXRydWU7IHJldHVybiBjdXJyZW50O30KICAgICAgICAgICAgICAgICAgICAgICAgIEVhcmx5RXhpdEV4Y2VwdGlvbiBlZWUgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBFYXJseUV4aXRFeGNlcHRpb24oMTYwLCBpbnB1dCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEVhcmx5RXhpdEV4Y2VwdGlvbigxNzEsIGlucHV0KTsKICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IGVlZTsKICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgY250MTYwKys7CisgICAgICAgICAgICAgICAgY250MTcxKys7CiAgICAgICAgICAgICB9IHdoaWxlICh0cnVlKTsKIAogCkBAIC0yNTIzMSw3ICsyNjQyNSw3IEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAiZW50cnlSdWxlUXVhbGlmaWVkTmFtZUluU3RhdGljSW1wb3J0IgotICAgIC8vIEludGVybmFsRGF0YURTTC5nOjkxOTc6MTogZW50cnlSdWxlUXVhbGlmaWVkTmFtZUluU3RhdGljSW1wb3J0IHJldHVybnMgW1N0cmluZyBjdXJyZW50PW51bGxdIDogaXZfcnVsZVF1YWxpZmllZE5hbWVJblN0YXRpY0ltcG9ydD0gcnVsZVF1YWxpZmllZE5hbWVJblN0YXRpY0ltcG9ydCBFT0YgOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjk2MzY6MTogZW50cnlSdWxlUXVhbGlmaWVkTmFtZUluU3RhdGljSW1wb3J0IHJldHVybnMgW1N0cmluZyBjdXJyZW50PW51bGxdIDogaXZfcnVsZVF1YWxpZmllZE5hbWVJblN0YXRpY0ltcG9ydD0gcnVsZVF1YWxpZmllZE5hbWVJblN0YXRpY0ltcG9ydCBFT0YgOwogICAgIHB1YmxpYyBmaW5hbCBTdHJpbmcgZW50cnlSdWxlUXVhbGlmaWVkTmFtZUluU3RhdGljSW1wb3J0KCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKICAgICAgICAgU3RyaW5nIGN1cnJlbnQgPSBudWxsOwogCkBAIC0yNTIzOSw4ICsyNjQzMyw4IEBACiAKIAogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6OTE5Nzo2NzogKGl2X3J1bGVRdWFsaWZpZWROYW1lSW5TdGF0aWNJbXBvcnQ9IHJ1bGVRdWFsaWZpZWROYW1lSW5TdGF0aWNJbXBvcnQgRU9GICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjkxOTg6MjogaXZfcnVsZVF1YWxpZmllZE5hbWVJblN0YXRpY0ltcG9ydD0gcnVsZVF1YWxpZmllZE5hbWVJblN0YXRpY0ltcG9ydCBFT0YKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjk2MzY6Njc6IChpdl9ydWxlUXVhbGlmaWVkTmFtZUluU3RhdGljSW1wb3J0PSBydWxlUXVhbGlmaWVkTmFtZUluU3RhdGljSW1wb3J0IEVPRiApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo5NjM3OjI6IGl2X3J1bGVRdWFsaWZpZWROYW1lSW5TdGF0aWNJbXBvcnQ9IHJ1bGVRdWFsaWZpZWROYW1lSW5TdGF0aWNJbXBvcnQgRU9GCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIG5ld0NvbXBvc2l0ZU5vZGUoZ3JhbW1hckFjY2Vzcy5nZXRRdWFsaWZpZWROYW1lSW5TdGF0aWNJbXBvcnRSdWxlKCkpOyAKQEAgLTI1MjcxLDcgKzI2NDY1LDcgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlUXVhbGlmaWVkTmFtZUluU3RhdGljSW1wb3J0IgotICAgIC8vIEludGVybmFsRGF0YURTTC5nOjkyMDQ6MTogcnVsZVF1YWxpZmllZE5hbWVJblN0YXRpY0ltcG9ydCByZXR1cm5zIFtBbnRsckRhdGF0eXBlUnVsZVRva2VuIGN1cnJlbnQ9bmV3IEFudGxyRGF0YXR5cGVSdWxlVG9rZW4oKV0gOiAodGhpc19WYWxpZElEXzA9IHJ1bGVWYWxpZElEIGt3PSAnLicgKSsgOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjk2NDM6MTogcnVsZVF1YWxpZmllZE5hbWVJblN0YXRpY0ltcG9ydCByZXR1cm5zIFtBbnRsckRhdGF0eXBlUnVsZVRva2VuIGN1cnJlbnQ9bmV3IEFudGxyRGF0YXR5cGVSdWxlVG9rZW4oKV0gOiAodGhpc19WYWxpZElEXzA9IHJ1bGVWYWxpZElEIGt3PSAnLicgKSsgOwogICAgIHB1YmxpYyBmaW5hbCBBbnRsckRhdGF0eXBlUnVsZVRva2VuIHJ1bGVRdWFsaWZpZWROYW1lSW5TdGF0aWNJbXBvcnQoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogICAgICAgICBBbnRsckRhdGF0eXBlUnVsZVRva2VuIGN1cnJlbnQgPSBuZXcgQW50bHJEYXRhdHlwZVJ1bGVUb2tlbigpOwogCkBAIC0yNTI4MywzNyArMjY0NzcsMzcgQEAKICAgICAgICAgCWVudGVyUnVsZSgpOwogCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo5MjEwOjI6ICggKHRoaXNfVmFsaWRJRF8wPSBydWxlVmFsaWRJRCBrdz0gJy4nICkrICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjkyMTE6MjogKHRoaXNfVmFsaWRJRF8wPSBydWxlVmFsaWRJRCBrdz0gJy4nICkrCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo5NjQ5OjI6ICggKHRoaXNfVmFsaWRJRF8wPSBydWxlVmFsaWRJRCBrdz0gJy4nICkrICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjk2NTA6MjogKHRoaXNfVmFsaWRJRF8wPSBydWxlVmFsaWRJRCBrdz0gJy4nICkrCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo5MjExOjI6ICh0aGlzX1ZhbGlkSURfMD0gcnVsZVZhbGlkSUQga3c9ICcuJyApKwotICAgICAgICAgICAgaW50IGNudDE2MT0wOwotICAgICAgICAgICAgbG9vcDE2MToKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjk2NTA6MjogKHRoaXNfVmFsaWRJRF8wPSBydWxlVmFsaWRJRCBrdz0gJy4nICkrCisgICAgICAgICAgICBpbnQgY250MTcyPTA7CisgICAgICAgICAgICBsb29wMTcyOgogICAgICAgICAgICAgZG8gewotICAgICAgICAgICAgICAgIGludCBhbHQxNjE9MjsKLSAgICAgICAgICAgICAgICBpbnQgTEExNjFfMCA9IGlucHV0LkxBKDEpOworICAgICAgICAgICAgICAgIGludCBhbHQxNzI9MjsKKyAgICAgICAgICAgICAgICBpbnQgTEExNzJfMCA9IGlucHV0LkxBKDEpOwogCi0gICAgICAgICAgICAgICAgaWYgKCAoTEExNjFfMD09UlVMRV9JRCkgKSB7Ci0gICAgICAgICAgICAgICAgICAgIGludCBMQTE2MV8yID0gaW5wdXQuTEEoMik7CisgICAgICAgICAgICAgICAgaWYgKCAoTEExNzJfMD09UlVMRV9JRCkgKSB7CisgICAgICAgICAgICAgICAgICAgIGludCBMQTE3Ml8yID0gaW5wdXQuTEEoMik7CiAKLSAgICAgICAgICAgICAgICAgICAgaWYgKCAoTEExNjFfMj09NjcpICkgewotICAgICAgICAgICAgICAgICAgICAgICAgYWx0MTYxPTE7CisgICAgICAgICAgICAgICAgICAgIGlmICggKExBMTcyXzI9PTc0KSApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFsdDE3Mj0xOwogICAgICAgICAgICAgICAgICAgICB9CiAKIAogICAgICAgICAgICAgICAgIH0KIAogCi0gICAgICAgICAgICAgICAgc3dpdGNoIChhbHQxNjEpIHsKKyAgICAgICAgICAgICAgICBzd2l0Y2ggKGFsdDE3MikgewogICAgICAgICAgICAgCWNhc2UgMSA6Ci0gICAgICAgICAgICAJICAgIC8vIEludGVybmFsRGF0YURTTC5nOjkyMTI6MzogdGhpc19WYWxpZElEXzA9IHJ1bGVWYWxpZElEIGt3PSAnLicKKyAgICAgICAgICAgIAkgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6OTY1MTozOiB0aGlzX1ZhbGlkSURfMD0gcnVsZVZhbGlkSUQga3c9ICcuJwogICAgICAgICAgICAgCSAgICB7CiAgICAgICAgICAgICAJICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogCiAgICAgICAgICAgICAJICAgICAgCQkJbmV3Q29tcG9zaXRlTm9kZShncmFtbWFyQWNjZXNzLmdldFF1YWxpZmllZE5hbWVJblN0YXRpY0ltcG9ydEFjY2VzcygpLmdldFZhbGlkSURQYXJzZXJSdWxlQ2FsbF8wKCkpOwogICAgICAgICAgICAgCSAgICAgIAkJCiAgICAgICAgICAgICAJICAgIH0KLSAgICAgICAgICAgIAkgICAgcHVzaEZvbGxvdyhGT0xMT1dfMTMzKTsKKyAgICAgICAgICAgIAkgICAgcHVzaEZvbGxvdyhGT0xMT1dfMTQ2KTsKICAgICAgICAgICAgIAkgICAgdGhpc19WYWxpZElEXzA9cnVsZVZhbGlkSUQoKTsKIAogICAgICAgICAgICAgCSAgICBzdGF0ZS5fZnNwLS07CkBAIC0yNTMyOCw3ICsyNjUyMiw3IEBACiAgICAgICAgICAgICAJICAgICAgCQkJYWZ0ZXJQYXJzZXJPckVudW1SdWxlQ2FsbCgpOwogICAgICAgICAgICAgCSAgICAgIAkJCiAgICAgICAgICAgICAJICAgIH0KLSAgICAgICAgICAgIAkgICAga3c9KFRva2VuKW1hdGNoKGlucHV0LDY3LEZPTExPV18xMzYpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gY3VycmVudDsKKyAgICAgICAgICAgIAkgICAga3c9KFRva2VuKW1hdGNoKGlucHV0LDc0LEZPTExPV181Nik7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OwogICAgICAgICAgICAgCSAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKIAogICAgICAgICAgICAgCSAgICAgIAkJCWN1cnJlbnQubWVyZ2Uoa3cpOwpAQCAtMjUzNDAsMTMgKzI2NTM0LDEzIEBACiAgICAgICAgICAgICAJICAgIGJyZWFrOwogCiAgICAgICAgICAgICAJZGVmYXVsdCA6Ci0gICAgICAgICAgICAJICAgIGlmICggY250MTYxID49IDEgKSBicmVhayBsb29wMTYxOworICAgICAgICAgICAgCSAgICBpZiAoIGNudDE3MiA+PSAxICkgYnJlYWsgbG9vcDE3MjsKICAgICAgICAgICAgIAkgICAgaWYgKHN0YXRlLmJhY2t0cmFja2luZz4wKSB7c3RhdGUuZmFpbGVkPXRydWU7IHJldHVybiBjdXJyZW50O30KICAgICAgICAgICAgICAgICAgICAgICAgIEVhcmx5RXhpdEV4Y2VwdGlvbiBlZWUgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBFYXJseUV4aXRFeGNlcHRpb24oMTYxLCBpbnB1dCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEVhcmx5RXhpdEV4Y2VwdGlvbigxNzIsIGlucHV0KTsKICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IGVlZTsKICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgY250MTYxKys7CisgICAgICAgICAgICAgICAgY250MTcyKys7CiAgICAgICAgICAgICB9IHdoaWxlICh0cnVlKTsKIAogCkBAIC0yNTM3MSw3ICsyNjU2NSw3IEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZVByZWRlZmluZWRCbG9iTWltZVR5cGVFbnVtIgotICAgIC8vIEludGVybmFsRGF0YURTTC5nOjkyMzE6MTogcnVsZVByZWRlZmluZWRCbG9iTWltZVR5cGVFbnVtIHJldHVybnMgW0VudW1lcmF0b3IgY3VycmVudD1udWxsXSA6ICggKGVudW1MaXRlcmFsXzA9ICdwbGFpbicgKSB8IChlbnVtTGl0ZXJhbF8xPSAnanBnJyApIHwgKGVudW1MaXRlcmFsXzI9ICdwbmcnICkgfCAoZW51bUxpdGVyYWxfMz0gJ21wZWcnICkgfCAoZW51bUxpdGVyYWxfND0gJ29jdGV0LXN0cmVhbScgKSB8IChlbnVtTGl0ZXJhbF81PSAncGRmJyApICkgOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjk2NzA6MTogcnVsZVByZWRlZmluZWRCbG9iTWltZVR5cGVFbnVtIHJldHVybnMgW0VudW1lcmF0b3IgY3VycmVudD1udWxsXSA6ICggKGVudW1MaXRlcmFsXzA9ICdwbGFpbicgKSB8IChlbnVtTGl0ZXJhbF8xPSAnanBnJyApIHwgKGVudW1MaXRlcmFsXzI9ICdwbmcnICkgfCAoZW51bUxpdGVyYWxfMz0gJ21wZWcnICkgfCAoZW51bUxpdGVyYWxfND0gJ29jdGV0LXN0cmVhbScgKSB8IChlbnVtTGl0ZXJhbF81PSAncGRmJyApICkgOwogICAgIHB1YmxpYyBmaW5hbCBFbnVtZXJhdG9yIHJ1bGVQcmVkZWZpbmVkQmxvYk1pbWVUeXBlRW51bSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAgICAgICAgIEVudW1lcmF0b3IgY3VycmVudCA9IG51bGw7CiAKQEAgLTI1Mzg2LDU4ICsyNjU4MCw1OCBAQAogICAgICAgICAJZW50ZXJSdWxlKCk7CiAKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjkyMzc6MjogKCAoIChlbnVtTGl0ZXJhbF8wPSAncGxhaW4nICkgfCAoZW51bUxpdGVyYWxfMT0gJ2pwZycgKSB8IChlbnVtTGl0ZXJhbF8yPSAncG5nJyApIHwgKGVudW1MaXRlcmFsXzM9ICdtcGVnJyApIHwgKGVudW1MaXRlcmFsXzQ9ICdvY3RldC1zdHJlYW0nICkgfCAoZW51bUxpdGVyYWxfNT0gJ3BkZicgKSApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjkyMzg6MjogKCAoZW51bUxpdGVyYWxfMD0gJ3BsYWluJyApIHwgKGVudW1MaXRlcmFsXzE9ICdqcGcnICkgfCAoZW51bUxpdGVyYWxfMj0gJ3BuZycgKSB8IChlbnVtTGl0ZXJhbF8zPSAnbXBlZycgKSB8IChlbnVtTGl0ZXJhbF80PSAnb2N0ZXQtc3RyZWFtJyApIHwgKGVudW1MaXRlcmFsXzU9ICdwZGYnICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6OTY3NjoyOiAoICggKGVudW1MaXRlcmFsXzA9ICdwbGFpbicgKSB8IChlbnVtTGl0ZXJhbF8xPSAnanBnJyApIHwgKGVudW1MaXRlcmFsXzI9ICdwbmcnICkgfCAoZW51bUxpdGVyYWxfMz0gJ21wZWcnICkgfCAoZW51bUxpdGVyYWxfND0gJ29jdGV0LXN0cmVhbScgKSB8IChlbnVtTGl0ZXJhbF81PSAncGRmJyApICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6OTY3NzoyOiAoIChlbnVtTGl0ZXJhbF8wPSAncGxhaW4nICkgfCAoZW51bUxpdGVyYWxfMT0gJ2pwZycgKSB8IChlbnVtTGl0ZXJhbF8yPSAncG5nJyApIHwgKGVudW1MaXRlcmFsXzM9ICdtcGVnJyApIHwgKGVudW1MaXRlcmFsXzQ9ICdvY3RldC1zdHJlYW0nICkgfCAoZW51bUxpdGVyYWxfNT0gJ3BkZicgKSApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo5MjM4OjI6ICggKGVudW1MaXRlcmFsXzA9ICdwbGFpbicgKSB8IChlbnVtTGl0ZXJhbF8xPSAnanBnJyApIHwgKGVudW1MaXRlcmFsXzI9ICdwbmcnICkgfCAoZW51bUxpdGVyYWxfMz0gJ21wZWcnICkgfCAoZW51bUxpdGVyYWxfND0gJ29jdGV0LXN0cmVhbScgKSB8IChlbnVtTGl0ZXJhbF81PSAncGRmJyApICkKLSAgICAgICAgICAgIGludCBhbHQxNjI9NjsKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjk2Nzc6MjogKCAoZW51bUxpdGVyYWxfMD0gJ3BsYWluJyApIHwgKGVudW1MaXRlcmFsXzE9ICdqcGcnICkgfCAoZW51bUxpdGVyYWxfMj0gJ3BuZycgKSB8IChlbnVtTGl0ZXJhbF8zPSAnbXBlZycgKSB8IChlbnVtTGl0ZXJhbF80PSAnb2N0ZXQtc3RyZWFtJyApIHwgKGVudW1MaXRlcmFsXzU9ICdwZGYnICkgKQorICAgICAgICAgICAgaW50IGFsdDE3Mz02OwogICAgICAgICAgICAgc3dpdGNoICggaW5wdXQuTEEoMSkgKSB7Ci0gICAgICAgICAgICBjYXNlIDEzODoKKyAgICAgICAgICAgIGNhc2UgMTQ1OgogICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBhbHQxNjI9MTsKKyAgICAgICAgICAgICAgICBhbHQxNzM9MTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIDEzOToKKyAgICAgICAgICAgIGNhc2UgMTQ2OgogICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBhbHQxNjI9MjsKKyAgICAgICAgICAgICAgICBhbHQxNzM9MjsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIDE0MDoKKyAgICAgICAgICAgIGNhc2UgMTQ3OgogICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBhbHQxNjI9MzsKKyAgICAgICAgICAgICAgICBhbHQxNzM9MzsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIDE0MToKKyAgICAgICAgICAgIGNhc2UgMTQ4OgogICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBhbHQxNjI9NDsKKyAgICAgICAgICAgICAgICBhbHQxNzM9NDsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIDE0MjoKKyAgICAgICAgICAgIGNhc2UgMTQ5OgogICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBhbHQxNjI9NTsKKyAgICAgICAgICAgICAgICBhbHQxNzM9NTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIDE0MzoKKyAgICAgICAgICAgIGNhc2UgMTUwOgogICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBhbHQxNjI9NjsKKyAgICAgICAgICAgICAgICBhbHQxNzM9NjsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgICAgIGlmIChzdGF0ZS5iYWNrdHJhY2tpbmc+MCkge3N0YXRlLmZhaWxlZD10cnVlOyByZXR1cm4gY3VycmVudDt9CiAgICAgICAgICAgICAgICAgTm9WaWFibGVBbHRFeGNlcHRpb24gbnZhZSA9Ci0gICAgICAgICAgICAgICAgICAgIG5ldyBOb1ZpYWJsZUFsdEV4Y2VwdGlvbigiIiwgMTYyLCAwLCBpbnB1dCk7CisgICAgICAgICAgICAgICAgICAgIG5ldyBOb1ZpYWJsZUFsdEV4Y2VwdGlvbigiIiwgMTczLCAwLCBpbnB1dCk7CiAKICAgICAgICAgICAgICAgICB0aHJvdyBudmFlOwogICAgICAgICAgICAgfQogCi0gICAgICAgICAgICBzd2l0Y2ggKGFsdDE2MikgeworICAgICAgICAgICAgc3dpdGNoIChhbHQxNzMpIHsKICAgICAgICAgICAgICAgICBjYXNlIDEgOgotICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo5MjM5OjM6IChlbnVtTGl0ZXJhbF8wPSAncGxhaW4nICkKKyAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6OTY3ODozOiAoZW51bUxpdGVyYWxfMD0gJ3BsYWluJyApCiAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6OTIzOTozOiAoZW51bUxpdGVyYWxfMD0gJ3BsYWluJyApCi0gICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjkyNDA6NDogZW51bUxpdGVyYWxfMD0gJ3BsYWluJworICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo5Njc4OjM6IChlbnVtTGl0ZXJhbF8wPSAncGxhaW4nICkKKyAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6OTY3OTo0OiBlbnVtTGl0ZXJhbF8wPSAncGxhaW4nCiAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgZW51bUxpdGVyYWxfMD0oVG9rZW4pbWF0Y2goaW5wdXQsMTM4LEZPTExPV18yKTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7CisgICAgICAgICAgICAgICAgICAgIGVudW1MaXRlcmFsXzA9KFRva2VuKW1hdGNoKGlucHV0LDE0NSxGT0xMT1dfMik7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OwogICAgICAgICAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKIAogICAgICAgICAgICAgICAgICAgICAgIAkJCQljdXJyZW50ID0gZ3JhbW1hckFjY2Vzcy5nZXRQcmVkZWZpbmVkQmxvYk1pbWVUeXBlRW51bUFjY2VzcygpLmdldFBsYWluRW51bUxpdGVyYWxEZWNsYXJhdGlvbl8wKCkuZ2V0RW51bUxpdGVyYWwoKS5nZXRJbnN0YW5jZSgpOwpAQCAtMjU0NTEsMTIgKzI2NjQ1LDEyIEBACiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgY2FzZSAyIDoKLSAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6OTI0NzozOiAoZW51bUxpdGVyYWxfMT0gJ2pwZycgKQorICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo5Njg2OjM6IChlbnVtTGl0ZXJhbF8xPSAnanBnJyApCiAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6OTI0NzozOiAoZW51bUxpdGVyYWxfMT0gJ2pwZycgKQotICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo5MjQ4OjQ6IGVudW1MaXRlcmFsXzE9ICdqcGcnCisgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjk2ODY6MzogKGVudW1MaXRlcmFsXzE9ICdqcGcnICkKKyAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6OTY4Nzo0OiBlbnVtTGl0ZXJhbF8xPSAnanBnJwogICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGVudW1MaXRlcmFsXzE9KFRva2VuKW1hdGNoKGlucHV0LDEzOSxGT0xMT1dfMik7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OworICAgICAgICAgICAgICAgICAgICBlbnVtTGl0ZXJhbF8xPShUb2tlbiltYXRjaChpbnB1dCwxNDYsRk9MTE9XXzIpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gY3VycmVudDsKICAgICAgICAgICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAKICAgICAgICAgICAgICAgICAgICAgICAJCQkJY3VycmVudCA9IGdyYW1tYXJBY2Nlc3MuZ2V0UHJlZGVmaW5lZEJsb2JNaW1lVHlwZUVudW1BY2Nlc3MoKS5nZXRKcGdFbnVtTGl0ZXJhbERlY2xhcmF0aW9uXzEoKS5nZXRFbnVtTGl0ZXJhbCgpLmdldEluc3RhbmNlKCk7CkBAIC0yNTQ3MCwxMiArMjY2NjQsMTIgQEAKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICBjYXNlIDMgOgotICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo5MjU1OjM6IChlbnVtTGl0ZXJhbF8yPSAncG5nJyApCisgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjk2OTQ6MzogKGVudW1MaXRlcmFsXzI9ICdwbmcnICkKICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo5MjU1OjM6IChlbnVtTGl0ZXJhbF8yPSAncG5nJyApCi0gICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjkyNTY6NDogZW51bUxpdGVyYWxfMj0gJ3BuZycKKyAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6OTY5NDozOiAoZW51bUxpdGVyYWxfMj0gJ3BuZycgKQorICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo5Njk1OjQ6IGVudW1MaXRlcmFsXzI9ICdwbmcnCiAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgZW51bUxpdGVyYWxfMj0oVG9rZW4pbWF0Y2goaW5wdXQsMTQwLEZPTExPV18yKTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7CisgICAgICAgICAgICAgICAgICAgIGVudW1MaXRlcmFsXzI9KFRva2VuKW1hdGNoKGlucHV0LDE0NyxGT0xMT1dfMik7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OwogICAgICAgICAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKIAogICAgICAgICAgICAgICAgICAgICAgIAkJCQljdXJyZW50ID0gZ3JhbW1hckFjY2Vzcy5nZXRQcmVkZWZpbmVkQmxvYk1pbWVUeXBlRW51bUFjY2VzcygpLmdldFBuZ0VudW1MaXRlcmFsRGVjbGFyYXRpb25fMigpLmdldEVudW1MaXRlcmFsKCkuZ2V0SW5zdGFuY2UoKTsKQEAgLTI1NDg5LDEyICsyNjY4MywxMiBAQAogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgIGNhc2UgNCA6Ci0gICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjkyNjM6MzogKGVudW1MaXRlcmFsXzM9ICdtcGVnJyApCisgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjk3MDI6MzogKGVudW1MaXRlcmFsXzM9ICdtcGVnJyApCiAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6OTI2MzozOiAoZW51bUxpdGVyYWxfMz0gJ21wZWcnICkKLSAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6OTI2NDo0OiBlbnVtTGl0ZXJhbF8zPSAnbXBlZycKKyAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6OTcwMjozOiAoZW51bUxpdGVyYWxfMz0gJ21wZWcnICkKKyAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6OTcwMzo0OiBlbnVtTGl0ZXJhbF8zPSAnbXBlZycKICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBlbnVtTGl0ZXJhbF8zPShUb2tlbiltYXRjaChpbnB1dCwxNDEsRk9MTE9XXzIpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gY3VycmVudDsKKyAgICAgICAgICAgICAgICAgICAgZW51bUxpdGVyYWxfMz0oVG9rZW4pbWF0Y2goaW5wdXQsMTQ4LEZPTExPV18yKTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7CiAgICAgICAgICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogCiAgICAgICAgICAgICAgICAgICAgICAgCQkJCWN1cnJlbnQgPSBncmFtbWFyQWNjZXNzLmdldFByZWRlZmluZWRCbG9iTWltZVR5cGVFbnVtQWNjZXNzKCkuZ2V0TXBlZ0VudW1MaXRlcmFsRGVjbGFyYXRpb25fMygpLmdldEVudW1MaXRlcmFsKCkuZ2V0SW5zdGFuY2UoKTsKQEAgLTI1NTA4LDEyICsyNjcwMiwxMiBAQAogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgIGNhc2UgNSA6Ci0gICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjkyNzE6MzogKGVudW1MaXRlcmFsXzQ9ICdvY3RldC1zdHJlYW0nICkKKyAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6OTcxMDozOiAoZW51bUxpdGVyYWxfND0gJ29jdGV0LXN0cmVhbScgKQogICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjkyNzE6MzogKGVudW1MaXRlcmFsXzQ9ICdvY3RldC1zdHJlYW0nICkKLSAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6OTI3Mjo0OiBlbnVtTGl0ZXJhbF80PSAnb2N0ZXQtc3RyZWFtJworICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo5NzEwOjM6IChlbnVtTGl0ZXJhbF80PSAnb2N0ZXQtc3RyZWFtJyApCisgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjk3MTE6NDogZW51bUxpdGVyYWxfND0gJ29jdGV0LXN0cmVhbScKICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBlbnVtTGl0ZXJhbF80PShUb2tlbiltYXRjaChpbnB1dCwxNDIsRk9MTE9XXzIpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gY3VycmVudDsKKyAgICAgICAgICAgICAgICAgICAgZW51bUxpdGVyYWxfND0oVG9rZW4pbWF0Y2goaW5wdXQsMTQ5LEZPTExPV18yKTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7CiAgICAgICAgICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogCiAgICAgICAgICAgICAgICAgICAgICAgCQkJCWN1cnJlbnQgPSBncmFtbWFyQWNjZXNzLmdldFByZWRlZmluZWRCbG9iTWltZVR5cGVFbnVtQWNjZXNzKCkuZ2V0T2N0ZXRzdHJlYW1FbnVtTGl0ZXJhbERlY2xhcmF0aW9uXzQoKS5nZXRFbnVtTGl0ZXJhbCgpLmdldEluc3RhbmNlKCk7CkBAIC0yNTUyNywxMiArMjY3MjEsMTIgQEAKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICBjYXNlIDYgOgotICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo5Mjc5OjM6IChlbnVtTGl0ZXJhbF81PSAncGRmJyApCisgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjk3MTg6MzogKGVudW1MaXRlcmFsXzU9ICdwZGYnICkKICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo5Mjc5OjM6IChlbnVtTGl0ZXJhbF81PSAncGRmJyApCi0gICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjkyODA6NDogZW51bUxpdGVyYWxfNT0gJ3BkZicKKyAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6OTcxODozOiAoZW51bUxpdGVyYWxfNT0gJ3BkZicgKQorICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo5NzE5OjQ6IGVudW1MaXRlcmFsXzU9ICdwZGYnCiAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgZW51bUxpdGVyYWxfNT0oVG9rZW4pbWF0Y2goaW5wdXQsMTQzLEZPTExPV18yKTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7CisgICAgICAgICAgICAgICAgICAgIGVudW1MaXRlcmFsXzU9KFRva2VuKW1hdGNoKGlucHV0LDE1MCxGT0xMT1dfMik7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OwogICAgICAgICAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKIAogICAgICAgICAgICAgICAgICAgICAgIAkJCQljdXJyZW50ID0gZ3JhbW1hckFjY2Vzcy5nZXRQcmVkZWZpbmVkQmxvYk1pbWVUeXBlRW51bUFjY2VzcygpLmdldFBkZkVudW1MaXRlcmFsRGVjbGFyYXRpb25fNSgpLmdldEVudW1MaXRlcmFsKCkuZ2V0SW5zdGFuY2UoKTsKQEAgLTI1NTcwLDcgKzI2NzY0LDcgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlUHJlZGVmaW5lZEJlYW5FbnVtIgotICAgIC8vIEludGVybmFsRGF0YURTTC5nOjkyOTA6MTogcnVsZVByZWRlZmluZWRCZWFuRW51bSByZXR1cm5zIFtFbnVtZXJhdG9yIGN1cnJlbnQ9bnVsbF0gOiAoIChlbnVtTGl0ZXJhbF8wPSAnTm93RGF0ZScgKSB8IChlbnVtTGl0ZXJhbF8xPSAnU3RhcnREYXRlJyApIHwgKGVudW1MaXRlcmFsXzI9ICdVbml2ZXJzYWxseVVuaXF1ZUlkZW50aWZpZXInICkgKSA7CisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6OTcyOToxOiBydWxlUHJlZGVmaW5lZEJlYW5FbnVtIHJldHVybnMgW0VudW1lcmF0b3IgY3VycmVudD1udWxsXSA6ICggKGVudW1MaXRlcmFsXzA9ICdOb3dEYXRlJyApIHwgKGVudW1MaXRlcmFsXzE9ICdTdGFydERhdGUnICkgfCAoZW51bUxpdGVyYWxfMj0gJ1VuaXZlcnNhbGx5VW5pcXVlSWRlbnRpZmllcicgKSApIDsKICAgICBwdWJsaWMgZmluYWwgRW51bWVyYXRvciBydWxlUHJlZGVmaW5lZEJlYW5FbnVtKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKICAgICAgICAgRW51bWVyYXRvciBjdXJyZW50ID0gbnVsbDsKIApAQCAtMjU1ODIsNDMgKzI2Nzc2LDQzIEBACiAgICAgICAgIAllbnRlclJ1bGUoKTsKIAogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6OTI5NjoyOiAoICggKGVudW1MaXRlcmFsXzA9ICdOb3dEYXRlJyApIHwgKGVudW1MaXRlcmFsXzE9ICdTdGFydERhdGUnICkgfCAoZW51bUxpdGVyYWxfMj0gJ1VuaXZlcnNhbGx5VW5pcXVlSWRlbnRpZmllcicgKSApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjkyOTc6MjogKCAoZW51bUxpdGVyYWxfMD0gJ05vd0RhdGUnICkgfCAoZW51bUxpdGVyYWxfMT0gJ1N0YXJ0RGF0ZScgKSB8IChlbnVtTGl0ZXJhbF8yPSAnVW5pdmVyc2FsbHlVbmlxdWVJZGVudGlmaWVyJyApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjk3MzU6MjogKCAoIChlbnVtTGl0ZXJhbF8wPSAnTm93RGF0ZScgKSB8IChlbnVtTGl0ZXJhbF8xPSAnU3RhcnREYXRlJyApIHwgKGVudW1MaXRlcmFsXzI9ICdVbml2ZXJzYWxseVVuaXF1ZUlkZW50aWZpZXInICkgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo5NzM2OjI6ICggKGVudW1MaXRlcmFsXzA9ICdOb3dEYXRlJyApIHwgKGVudW1MaXRlcmFsXzE9ICdTdGFydERhdGUnICkgfCAoZW51bUxpdGVyYWxfMj0gJ1VuaXZlcnNhbGx5VW5pcXVlSWRlbnRpZmllcicgKSApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo5Mjk3OjI6ICggKGVudW1MaXRlcmFsXzA9ICdOb3dEYXRlJyApIHwgKGVudW1MaXRlcmFsXzE9ICdTdGFydERhdGUnICkgfCAoZW51bUxpdGVyYWxfMj0gJ1VuaXZlcnNhbGx5VW5pcXVlSWRlbnRpZmllcicgKSApCi0gICAgICAgICAgICBpbnQgYWx0MTYzPTM7CisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo5NzM2OjI6ICggKGVudW1MaXRlcmFsXzA9ICdOb3dEYXRlJyApIHwgKGVudW1MaXRlcmFsXzE9ICdTdGFydERhdGUnICkgfCAoZW51bUxpdGVyYWxfMj0gJ1VuaXZlcnNhbGx5VW5pcXVlSWRlbnRpZmllcicgKSApCisgICAgICAgICAgICBpbnQgYWx0MTc0PTM7CiAgICAgICAgICAgICBzd2l0Y2ggKCBpbnB1dC5MQSgxKSApIHsKLSAgICAgICAgICAgIGNhc2UgMTQ0OgorICAgICAgICAgICAgY2FzZSAxNTE6CiAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGFsdDE2Mz0xOworICAgICAgICAgICAgICAgIGFsdDE3ND0xOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgMTQ1OgorICAgICAgICAgICAgY2FzZSAxNTI6CiAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGFsdDE2Mz0yOworICAgICAgICAgICAgICAgIGFsdDE3ND0yOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgMTQ2OgorICAgICAgICAgICAgY2FzZSAxNTM6CiAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGFsdDE2Mz0zOworICAgICAgICAgICAgICAgIGFsdDE3ND0zOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICAgICAgaWYgKHN0YXRlLmJhY2t0cmFja2luZz4wKSB7c3RhdGUuZmFpbGVkPXRydWU7IHJldHVybiBjdXJyZW50O30KICAgICAgICAgICAgICAgICBOb1ZpYWJsZUFsdEV4Y2VwdGlvbiBudmFlID0KLSAgICAgICAgICAgICAgICAgICAgbmV3IE5vVmlhYmxlQWx0RXhjZXB0aW9uKCIiLCAxNjMsIDAsIGlucHV0KTsKKyAgICAgICAgICAgICAgICAgICAgbmV3IE5vVmlhYmxlQWx0RXhjZXB0aW9uKCIiLCAxNzQsIDAsIGlucHV0KTsKIAogICAgICAgICAgICAgICAgIHRocm93IG52YWU7CiAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgIHN3aXRjaCAoYWx0MTYzKSB7CisgICAgICAgICAgICBzd2l0Y2ggKGFsdDE3NCkgewogICAgICAgICAgICAgICAgIGNhc2UgMSA6Ci0gICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjkyOTg6MzogKGVudW1MaXRlcmFsXzA9ICdOb3dEYXRlJyApCisgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjk3Mzc6MzogKGVudW1MaXRlcmFsXzA9ICdOb3dEYXRlJyApCiAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6OTI5ODozOiAoZW51bUxpdGVyYWxfMD0gJ05vd0RhdGUnICkKLSAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6OTI5OTo0OiBlbnVtTGl0ZXJhbF8wPSAnTm93RGF0ZScKKyAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6OTczNzozOiAoZW51bUxpdGVyYWxfMD0gJ05vd0RhdGUnICkKKyAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6OTczODo0OiBlbnVtTGl0ZXJhbF8wPSAnTm93RGF0ZScKICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBlbnVtTGl0ZXJhbF8wPShUb2tlbiltYXRjaChpbnB1dCwxNDQsRk9MTE9XXzIpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gY3VycmVudDsKKyAgICAgICAgICAgICAgICAgICAgZW51bUxpdGVyYWxfMD0oVG9rZW4pbWF0Y2goaW5wdXQsMTUxLEZPTExPV18yKTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7CiAgICAgICAgICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogCiAgICAgICAgICAgICAgICAgICAgICAgCQkJCWN1cnJlbnQgPSBncmFtbWFyQWNjZXNzLmdldFByZWRlZmluZWRCZWFuRW51bUFjY2VzcygpLmdldE5vd0VudW1MaXRlcmFsRGVjbGFyYXRpb25fMCgpLmdldEVudW1MaXRlcmFsKCkuZ2V0SW5zdGFuY2UoKTsKQEAgLTI1NjMyLDEyICsyNjgyNiwxMiBAQAogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgIGNhc2UgMiA6Ci0gICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjkzMDY6MzogKGVudW1MaXRlcmFsXzE9ICdTdGFydERhdGUnICkKKyAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6OTc0NTozOiAoZW51bUxpdGVyYWxfMT0gJ1N0YXJ0RGF0ZScgKQogICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjkzMDY6MzogKGVudW1MaXRlcmFsXzE9ICdTdGFydERhdGUnICkKLSAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6OTMwNzo0OiBlbnVtTGl0ZXJhbF8xPSAnU3RhcnREYXRlJworICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo5NzQ1OjM6IChlbnVtTGl0ZXJhbF8xPSAnU3RhcnREYXRlJyApCisgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjk3NDY6NDogZW51bUxpdGVyYWxfMT0gJ1N0YXJ0RGF0ZScKICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBlbnVtTGl0ZXJhbF8xPShUb2tlbiltYXRjaChpbnB1dCwxNDUsRk9MTE9XXzIpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gY3VycmVudDsKKyAgICAgICAgICAgICAgICAgICAgZW51bUxpdGVyYWxfMT0oVG9rZW4pbWF0Y2goaW5wdXQsMTUyLEZPTExPV18yKTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7CiAgICAgICAgICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogCiAgICAgICAgICAgICAgICAgICAgICAgCQkJCWN1cnJlbnQgPSBncmFtbWFyQWNjZXNzLmdldFByZWRlZmluZWRCZWFuRW51bUFjY2VzcygpLmdldFN0YXJ0RW51bUxpdGVyYWxEZWNsYXJhdGlvbl8xKCkuZ2V0RW51bUxpdGVyYWwoKS5nZXRJbnN0YW5jZSgpOwpAQCAtMjU2NTEsMTIgKzI2ODQ1LDEyIEBACiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgY2FzZSAzIDoKLSAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6OTMxNDozOiAoZW51bUxpdGVyYWxfMj0gJ1VuaXZlcnNhbGx5VW5pcXVlSWRlbnRpZmllcicgKQorICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo5NzUzOjM6IChlbnVtTGl0ZXJhbF8yPSAnVW5pdmVyc2FsbHlVbmlxdWVJZGVudGlmaWVyJyApCiAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6OTMxNDozOiAoZW51bUxpdGVyYWxfMj0gJ1VuaXZlcnNhbGx5VW5pcXVlSWRlbnRpZmllcicgKQotICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo5MzE1OjQ6IGVudW1MaXRlcmFsXzI9ICdVbml2ZXJzYWxseVVuaXF1ZUlkZW50aWZpZXInCisgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjk3NTM6MzogKGVudW1MaXRlcmFsXzI9ICdVbml2ZXJzYWxseVVuaXF1ZUlkZW50aWZpZXInICkKKyAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6OTc1NDo0OiBlbnVtTGl0ZXJhbF8yPSAnVW5pdmVyc2FsbHlVbmlxdWVJZGVudGlmaWVyJwogICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGVudW1MaXRlcmFsXzI9KFRva2VuKW1hdGNoKGlucHV0LDE0NixGT0xMT1dfMik7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OworICAgICAgICAgICAgICAgICAgICBlbnVtTGl0ZXJhbF8yPShUb2tlbiltYXRjaChpbnB1dCwxNTMsRk9MTE9XXzIpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gY3VycmVudDsKICAgICAgICAgICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAKICAgICAgICAgICAgICAgICAgICAgICAJCQkJY3VycmVudCA9IGdyYW1tYXJBY2Nlc3MuZ2V0UHJlZGVmaW5lZEJlYW5FbnVtQWNjZXNzKCkuZ2V0VVVJREVudW1MaXRlcmFsRGVjbGFyYXRpb25fMigpLmdldEVudW1MaXRlcmFsKCkuZ2V0SW5zdGFuY2UoKTsKQEAgLTI1Njk0LDcgKzI2ODg4LDcgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlUHJlZGVmaW5lZEJlYW5UeXBlRW51bSIKLSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo5MzI1OjE6IHJ1bGVQcmVkZWZpbmVkQmVhblR5cGVFbnVtIHJldHVybnMgW0VudW1lcmF0b3IgY3VycmVudD1udWxsXSA6ICggKGVudW1MaXRlcmFsXzA9ICdEYXRlJyApIHwgKGVudW1MaXRlcmFsXzE9ICdNaWxsaXNlY29uZHMnICkgfCAoZW51bUxpdGVyYWxfMj0gJ05hbm9zZWNvbmRzJyApIHwgKGVudW1MaXRlcmFsXzM9ICdSYW5kb20nICkgfCAoZW51bUxpdGVyYWxfND0gJ0V4ZWN1dGVDb250ZXh0JyApICkgOworICAgIC8vIEludGVybmFsRGF0YURTTC5nOjk3NjQ6MTogcnVsZVByZWRlZmluZWRCZWFuVHlwZUVudW0gcmV0dXJucyBbRW51bWVyYXRvciBjdXJyZW50PW51bGxdIDogKCAoZW51bUxpdGVyYWxfMD0gJ0RhdGUnICkgfCAoZW51bUxpdGVyYWxfMT0gJ01pbGxpc2Vjb25kcycgKSB8IChlbnVtTGl0ZXJhbF8yPSAnTmFub3NlY29uZHMnICkgfCAoZW51bUxpdGVyYWxfMz0gJ1JhbmRvbScgKSB8IChlbnVtTGl0ZXJhbF80PSAnRXhlY3V0ZUNvbnRleHQnICkgKSA7CiAgICAgcHVibGljIGZpbmFsIEVudW1lcmF0b3IgcnVsZVByZWRlZmluZWRCZWFuVHlwZUVudW0oKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogICAgICAgICBFbnVtZXJhdG9yIGN1cnJlbnQgPSBudWxsOwogCkBAIC0yNTcwOCw1MyArMjY5MDIsNTMgQEAKICAgICAgICAgCWVudGVyUnVsZSgpOwogCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo5MzMxOjI6ICggKCAoZW51bUxpdGVyYWxfMD0gJ0RhdGUnICkgfCAoZW51bUxpdGVyYWxfMT0gJ01pbGxpc2Vjb25kcycgKSB8IChlbnVtTGl0ZXJhbF8yPSAnTmFub3NlY29uZHMnICkgfCAoZW51bUxpdGVyYWxfMz0gJ1JhbmRvbScgKSB8IChlbnVtTGl0ZXJhbF80PSAnRXhlY3V0ZUNvbnRleHQnICkgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo5MzMyOjI6ICggKGVudW1MaXRlcmFsXzA9ICdEYXRlJyApIHwgKGVudW1MaXRlcmFsXzE9ICdNaWxsaXNlY29uZHMnICkgfCAoZW51bUxpdGVyYWxfMj0gJ05hbm9zZWNvbmRzJyApIHwgKGVudW1MaXRlcmFsXzM9ICdSYW5kb20nICkgfCAoZW51bUxpdGVyYWxfND0gJ0V4ZWN1dGVDb250ZXh0JyApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjk3NzA6MjogKCAoIChlbnVtTGl0ZXJhbF8wPSAnRGF0ZScgKSB8IChlbnVtTGl0ZXJhbF8xPSAnTWlsbGlzZWNvbmRzJyApIHwgKGVudW1MaXRlcmFsXzI9ICdOYW5vc2Vjb25kcycgKSB8IChlbnVtTGl0ZXJhbF8zPSAnUmFuZG9tJyApIHwgKGVudW1MaXRlcmFsXzQ9ICdFeGVjdXRlQ29udGV4dCcgKSApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjk3NzE6MjogKCAoZW51bUxpdGVyYWxfMD0gJ0RhdGUnICkgfCAoZW51bUxpdGVyYWxfMT0gJ01pbGxpc2Vjb25kcycgKSB8IChlbnVtTGl0ZXJhbF8yPSAnTmFub3NlY29uZHMnICkgfCAoZW51bUxpdGVyYWxfMz0gJ1JhbmRvbScgKSB8IChlbnVtTGl0ZXJhbF80PSAnRXhlY3V0ZUNvbnRleHQnICkgKQogICAgICAgICAgICAgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6OTMzMjoyOiAoIChlbnVtTGl0ZXJhbF8wPSAnRGF0ZScgKSB8IChlbnVtTGl0ZXJhbF8xPSAnTWlsbGlzZWNvbmRzJyApIHwgKGVudW1MaXRlcmFsXzI9ICdOYW5vc2Vjb25kcycgKSB8IChlbnVtTGl0ZXJhbF8zPSAnUmFuZG9tJyApIHwgKGVudW1MaXRlcmFsXzQ9ICdFeGVjdXRlQ29udGV4dCcgKSApCi0gICAgICAgICAgICBpbnQgYWx0MTY0PTU7CisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo5NzcxOjI6ICggKGVudW1MaXRlcmFsXzA9ICdEYXRlJyApIHwgKGVudW1MaXRlcmFsXzE9ICdNaWxsaXNlY29uZHMnICkgfCAoZW51bUxpdGVyYWxfMj0gJ05hbm9zZWNvbmRzJyApIHwgKGVudW1MaXRlcmFsXzM9ICdSYW5kb20nICkgfCAoZW51bUxpdGVyYWxfND0gJ0V4ZWN1dGVDb250ZXh0JyApICkKKyAgICAgICAgICAgIGludCBhbHQxNzU9NTsKICAgICAgICAgICAgIHN3aXRjaCAoIGlucHV0LkxBKDEpICkgewotICAgICAgICAgICAgY2FzZSAxNDc6CisgICAgICAgICAgICBjYXNlIDE1NDoKICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgYWx0MTY0PTE7CisgICAgICAgICAgICAgICAgYWx0MTc1PTE7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSAxNDg6CisgICAgICAgICAgICBjYXNlIDE1NToKICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgYWx0MTY0PTI7CisgICAgICAgICAgICAgICAgYWx0MTc1PTI7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSAxNDk6CisgICAgICAgICAgICBjYXNlIDE1NjoKICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgYWx0MTY0PTM7CisgICAgICAgICAgICAgICAgYWx0MTc1PTM7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSAxNTA6CisgICAgICAgICAgICBjYXNlIDE1NzoKICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgYWx0MTY0PTQ7CisgICAgICAgICAgICAgICAgYWx0MTc1PTQ7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSAxNTE6CisgICAgICAgICAgICBjYXNlIDE1ODoKICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgYWx0MTY0PTU7CisgICAgICAgICAgICAgICAgYWx0MTc1PTU7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgICAgICBpZiAoc3RhdGUuYmFja3RyYWNraW5nPjApIHtzdGF0ZS5mYWlsZWQ9dHJ1ZTsgcmV0dXJuIGN1cnJlbnQ7fQogICAgICAgICAgICAgICAgIE5vVmlhYmxlQWx0RXhjZXB0aW9uIG52YWUgPQotICAgICAgICAgICAgICAgICAgICBuZXcgTm9WaWFibGVBbHRFeGNlcHRpb24oIiIsIDE2NCwgMCwgaW5wdXQpOworICAgICAgICAgICAgICAgICAgICBuZXcgTm9WaWFibGVBbHRFeGNlcHRpb24oIiIsIDE3NSwgMCwgaW5wdXQpOwogCiAgICAgICAgICAgICAgICAgdGhyb3cgbnZhZTsKICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgc3dpdGNoIChhbHQxNjQpIHsKKyAgICAgICAgICAgIHN3aXRjaCAoYWx0MTc1KSB7CiAgICAgICAgICAgICAgICAgY2FzZSAxIDoKLSAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6OTMzMzozOiAoZW51bUxpdGVyYWxfMD0gJ0RhdGUnICkKKyAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6OTc3MjozOiAoZW51bUxpdGVyYWxfMD0gJ0RhdGUnICkKICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo5MzMzOjM6IChlbnVtTGl0ZXJhbF8wPSAnRGF0ZScgKQotICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo5MzM0OjQ6IGVudW1MaXRlcmFsXzA9ICdEYXRlJworICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo5NzcyOjM6IChlbnVtTGl0ZXJhbF8wPSAnRGF0ZScgKQorICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo5NzczOjQ6IGVudW1MaXRlcmFsXzA9ICdEYXRlJwogICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGVudW1MaXRlcmFsXzA9KFRva2VuKW1hdGNoKGlucHV0LDE0NyxGT0xMT1dfMik7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OworICAgICAgICAgICAgICAgICAgICBlbnVtTGl0ZXJhbF8wPShUb2tlbiltYXRjaChpbnB1dCwxNTQsRk9MTE9XXzIpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gY3VycmVudDsKICAgICAgICAgICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAKICAgICAgICAgICAgICAgICAgICAgICAJCQkJY3VycmVudCA9IGdyYW1tYXJBY2Nlc3MuZ2V0UHJlZGVmaW5lZEJlYW5UeXBlRW51bUFjY2VzcygpLmdldERhdGVFbnVtTGl0ZXJhbERlY2xhcmF0aW9uXzAoKS5nZXRFbnVtTGl0ZXJhbCgpLmdldEluc3RhbmNlKCk7CkBAIC0yNTc2OCwxMiArMjY5NjIsMTIgQEAKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICBjYXNlIDIgOgotICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo5MzQxOjM6IChlbnVtTGl0ZXJhbF8xPSAnTWlsbGlzZWNvbmRzJyApCisgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjk3ODA6MzogKGVudW1MaXRlcmFsXzE9ICdNaWxsaXNlY29uZHMnICkKICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo5MzQxOjM6IChlbnVtTGl0ZXJhbF8xPSAnTWlsbGlzZWNvbmRzJyApCi0gICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjkzNDI6NDogZW51bUxpdGVyYWxfMT0gJ01pbGxpc2Vjb25kcycKKyAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6OTc4MDozOiAoZW51bUxpdGVyYWxfMT0gJ01pbGxpc2Vjb25kcycgKQorICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo5NzgxOjQ6IGVudW1MaXRlcmFsXzE9ICdNaWxsaXNlY29uZHMnCiAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgZW51bUxpdGVyYWxfMT0oVG9rZW4pbWF0Y2goaW5wdXQsMTQ4LEZPTExPV18yKTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7CisgICAgICAgICAgICAgICAgICAgIGVudW1MaXRlcmFsXzE9KFRva2VuKW1hdGNoKGlucHV0LDE1NSxGT0xMT1dfMik7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OwogICAgICAgICAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKIAogICAgICAgICAgICAgICAgICAgICAgIAkJCQljdXJyZW50ID0gZ3JhbW1hckFjY2Vzcy5nZXRQcmVkZWZpbmVkQmVhblR5cGVFbnVtQWNjZXNzKCkuZ2V0TWlsbGlzRW51bUxpdGVyYWxEZWNsYXJhdGlvbl8xKCkuZ2V0RW51bUxpdGVyYWwoKS5nZXRJbnN0YW5jZSgpOwpAQCAtMjU3ODcsMTIgKzI2OTgxLDEyIEBACiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgY2FzZSAzIDoKLSAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6OTM0OTozOiAoZW51bUxpdGVyYWxfMj0gJ05hbm9zZWNvbmRzJyApCisgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjk3ODg6MzogKGVudW1MaXRlcmFsXzI9ICdOYW5vc2Vjb25kcycgKQogICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjkzNDk6MzogKGVudW1MaXRlcmFsXzI9ICdOYW5vc2Vjb25kcycgKQotICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo5MzUwOjQ6IGVudW1MaXRlcmFsXzI9ICdOYW5vc2Vjb25kcycKKyAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6OTc4ODozOiAoZW51bUxpdGVyYWxfMj0gJ05hbm9zZWNvbmRzJyApCisgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjk3ODk6NDogZW51bUxpdGVyYWxfMj0gJ05hbm9zZWNvbmRzJwogICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGVudW1MaXRlcmFsXzI9KFRva2VuKW1hdGNoKGlucHV0LDE0OSxGT0xMT1dfMik7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OworICAgICAgICAgICAgICAgICAgICBlbnVtTGl0ZXJhbF8yPShUb2tlbiltYXRjaChpbnB1dCwxNTYsRk9MTE9XXzIpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gY3VycmVudDsKICAgICAgICAgICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAKICAgICAgICAgICAgICAgICAgICAgICAJCQkJY3VycmVudCA9IGdyYW1tYXJBY2Nlc3MuZ2V0UHJlZGVmaW5lZEJlYW5UeXBlRW51bUFjY2VzcygpLmdldE5hbm9zRW51bUxpdGVyYWxEZWNsYXJhdGlvbl8yKCkuZ2V0RW51bUxpdGVyYWwoKS5nZXRJbnN0YW5jZSgpOwpAQCAtMjU4MDYsMTIgKzI3MDAwLDEyIEBACiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgY2FzZSA0IDoKLSAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6OTM1NzozOiAoZW51bUxpdGVyYWxfMz0gJ1JhbmRvbScgKQorICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo5Nzk2OjM6IChlbnVtTGl0ZXJhbF8zPSAnUmFuZG9tJyApCiAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6OTM1NzozOiAoZW51bUxpdGVyYWxfMz0gJ1JhbmRvbScgKQotICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo5MzU4OjQ6IGVudW1MaXRlcmFsXzM9ICdSYW5kb20nCisgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjk3OTY6MzogKGVudW1MaXRlcmFsXzM9ICdSYW5kb20nICkKKyAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6OTc5Nzo0OiBlbnVtTGl0ZXJhbF8zPSAnUmFuZG9tJwogICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGVudW1MaXRlcmFsXzM9KFRva2VuKW1hdGNoKGlucHV0LDE1MCxGT0xMT1dfMik7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OworICAgICAgICAgICAgICAgICAgICBlbnVtTGl0ZXJhbF8zPShUb2tlbiltYXRjaChpbnB1dCwxNTcsRk9MTE9XXzIpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gY3VycmVudDsKICAgICAgICAgICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAKICAgICAgICAgICAgICAgICAgICAgICAJCQkJY3VycmVudCA9IGdyYW1tYXJBY2Nlc3MuZ2V0UHJlZGVmaW5lZEJlYW5UeXBlRW51bUFjY2VzcygpLmdldFJhbmRvbUVudW1MaXRlcmFsRGVjbGFyYXRpb25fMygpLmdldEVudW1MaXRlcmFsKCkuZ2V0SW5zdGFuY2UoKTsKQEAgLTI1ODI1LDEyICsyNzAxOSwxMiBAQAogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgIGNhc2UgNSA6Ci0gICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjkzNjU6MzogKGVudW1MaXRlcmFsXzQ9ICdFeGVjdXRlQ29udGV4dCcgKQorICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo5ODA0OjM6IChlbnVtTGl0ZXJhbF80PSAnRXhlY3V0ZUNvbnRleHQnICkKICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo5MzY1OjM6IChlbnVtTGl0ZXJhbF80PSAnRXhlY3V0ZUNvbnRleHQnICkKLSAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6OTM2Njo0OiBlbnVtTGl0ZXJhbF80PSAnRXhlY3V0ZUNvbnRleHQnCisgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjk4MDQ6MzogKGVudW1MaXRlcmFsXzQ9ICdFeGVjdXRlQ29udGV4dCcgKQorICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo5ODA1OjQ6IGVudW1MaXRlcmFsXzQ9ICdFeGVjdXRlQ29udGV4dCcKICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBlbnVtTGl0ZXJhbF80PShUb2tlbiltYXRjaChpbnB1dCwxNTEsRk9MTE9XXzIpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gY3VycmVudDsKKyAgICAgICAgICAgICAgICAgICAgZW51bUxpdGVyYWxfND0oVG9rZW4pbWF0Y2goaW5wdXQsMTU4LEZPTExPV18yKTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7CiAgICAgICAgICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogCiAgICAgICAgICAgICAgICAgICAgICAgCQkJCWN1cnJlbnQgPSBncmFtbWFyQWNjZXNzLmdldFByZWRlZmluZWRCZWFuVHlwZUVudW1BY2Nlc3MoKS5nZXRFeGVjQ29udGV4dEVudW1MaXRlcmFsRGVjbGFyYXRpb25fNCgpLmdldEVudW1MaXRlcmFsKCkuZ2V0SW5zdGFuY2UoKTsKQEAgLTI1ODY4LDcgKzI3MDYyLDcgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlRW50aXR5TWFuYWdlck1vZGUiCi0gICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6OTM3NjoxOiBydWxlRW50aXR5TWFuYWdlck1vZGUgcmV0dXJucyBbRW51bWVyYXRvciBjdXJyZW50PW51bGxdIDogKCAoZW51bUxpdGVyYWxfMD0gJ3BlcnNpc3QnICkgfCAoZW51bUxpdGVyYWxfMT0gJ21lcmdlJyApIHwgKGVudW1MaXRlcmFsXzI9ICdyZW1vdmUnICkgKSA7CisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6OTgxNToxOiBydWxlRW50aXR5TWFuYWdlck1vZGUgcmV0dXJucyBbRW51bWVyYXRvciBjdXJyZW50PW51bGxdIDogKCAoZW51bUxpdGVyYWxfMD0gJ3BlcnNpc3QnICkgfCAoZW51bUxpdGVyYWxfMT0gJ21lcmdlJyApIHwgKGVudW1MaXRlcmFsXzI9ICdyZW1vdmUnICkgKSA7CiAgICAgcHVibGljIGZpbmFsIEVudW1lcmF0b3IgcnVsZUVudGl0eU1hbmFnZXJNb2RlKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKICAgICAgICAgRW51bWVyYXRvciBjdXJyZW50ID0gbnVsbDsKIApAQCAtMjU4ODAsNDMgKzI3MDc0LDQzIEBACiAgICAgICAgIAllbnRlclJ1bGUoKTsKIAogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6OTM4MjoyOiAoICggKGVudW1MaXRlcmFsXzA9ICdwZXJzaXN0JyApIHwgKGVudW1MaXRlcmFsXzE9ICdtZXJnZScgKSB8IChlbnVtTGl0ZXJhbF8yPSAncmVtb3ZlJyApICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6OTM4MzoyOiAoIChlbnVtTGl0ZXJhbF8wPSAncGVyc2lzdCcgKSB8IChlbnVtTGl0ZXJhbF8xPSAnbWVyZ2UnICkgfCAoZW51bUxpdGVyYWxfMj0gJ3JlbW92ZScgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo5ODIxOjI6ICggKCAoZW51bUxpdGVyYWxfMD0gJ3BlcnNpc3QnICkgfCAoZW51bUxpdGVyYWxfMT0gJ21lcmdlJyApIHwgKGVudW1MaXRlcmFsXzI9ICdyZW1vdmUnICkgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo5ODIyOjI6ICggKGVudW1MaXRlcmFsXzA9ICdwZXJzaXN0JyApIHwgKGVudW1MaXRlcmFsXzE9ICdtZXJnZScgKSB8IChlbnVtTGl0ZXJhbF8yPSAncmVtb3ZlJyApICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjkzODM6MjogKCAoZW51bUxpdGVyYWxfMD0gJ3BlcnNpc3QnICkgfCAoZW51bUxpdGVyYWxfMT0gJ21lcmdlJyApIHwgKGVudW1MaXRlcmFsXzI9ICdyZW1vdmUnICkgKQotICAgICAgICAgICAgaW50IGFsdDE2NT0zOworICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6OTgyMjoyOiAoIChlbnVtTGl0ZXJhbF8wPSAncGVyc2lzdCcgKSB8IChlbnVtTGl0ZXJhbF8xPSAnbWVyZ2UnICkgfCAoZW51bUxpdGVyYWxfMj0gJ3JlbW92ZScgKSApCisgICAgICAgICAgICBpbnQgYWx0MTc2PTM7CiAgICAgICAgICAgICBzd2l0Y2ggKCBpbnB1dC5MQSgxKSApIHsKLSAgICAgICAgICAgIGNhc2UgMTUyOgorICAgICAgICAgICAgY2FzZSAxNTk6CiAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGFsdDE2NT0xOworICAgICAgICAgICAgICAgIGFsdDE3Nj0xOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgMTUzOgorICAgICAgICAgICAgY2FzZSAxNjA6CiAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGFsdDE2NT0yOworICAgICAgICAgICAgICAgIGFsdDE3Nj0yOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgMTU0OgorICAgICAgICAgICAgY2FzZSAxNjE6CiAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGFsdDE2NT0zOworICAgICAgICAgICAgICAgIGFsdDE3Nj0zOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICAgICAgaWYgKHN0YXRlLmJhY2t0cmFja2luZz4wKSB7c3RhdGUuZmFpbGVkPXRydWU7IHJldHVybiBjdXJyZW50O30KICAgICAgICAgICAgICAgICBOb1ZpYWJsZUFsdEV4Y2VwdGlvbiBudmFlID0KLSAgICAgICAgICAgICAgICAgICAgbmV3IE5vVmlhYmxlQWx0RXhjZXB0aW9uKCIiLCAxNjUsIDAsIGlucHV0KTsKKyAgICAgICAgICAgICAgICAgICAgbmV3IE5vVmlhYmxlQWx0RXhjZXB0aW9uKCIiLCAxNzYsIDAsIGlucHV0KTsKIAogICAgICAgICAgICAgICAgIHRocm93IG52YWU7CiAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgIHN3aXRjaCAoYWx0MTY1KSB7CisgICAgICAgICAgICBzd2l0Y2ggKGFsdDE3NikgewogICAgICAgICAgICAgICAgIGNhc2UgMSA6Ci0gICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjkzODQ6MzogKGVudW1MaXRlcmFsXzA9ICdwZXJzaXN0JyApCisgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjk4MjM6MzogKGVudW1MaXRlcmFsXzA9ICdwZXJzaXN0JyApCiAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6OTM4NDozOiAoZW51bUxpdGVyYWxfMD0gJ3BlcnNpc3QnICkKLSAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6OTM4NTo0OiBlbnVtTGl0ZXJhbF8wPSAncGVyc2lzdCcKKyAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6OTgyMzozOiAoZW51bUxpdGVyYWxfMD0gJ3BlcnNpc3QnICkKKyAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6OTgyNDo0OiBlbnVtTGl0ZXJhbF8wPSAncGVyc2lzdCcKICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBlbnVtTGl0ZXJhbF8wPShUb2tlbiltYXRjaChpbnB1dCwxNTIsRk9MTE9XXzIpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gY3VycmVudDsKKyAgICAgICAgICAgICAgICAgICAgZW51bUxpdGVyYWxfMD0oVG9rZW4pbWF0Y2goaW5wdXQsMTU5LEZPTExPV18yKTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7CiAgICAgICAgICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogCiAgICAgICAgICAgICAgICAgICAgICAgCQkJCWN1cnJlbnQgPSBncmFtbWFyQWNjZXNzLmdldEVudGl0eU1hbmFnZXJNb2RlQWNjZXNzKCkuZ2V0UGVyc2lzdEVudW1MaXRlcmFsRGVjbGFyYXRpb25fMCgpLmdldEVudW1MaXRlcmFsKCkuZ2V0SW5zdGFuY2UoKTsKQEAgLTI1OTMwLDEyICsyNzEyNCwxMiBAQAogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgIGNhc2UgMiA6Ci0gICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjkzOTI6MzogKGVudW1MaXRlcmFsXzE9ICdtZXJnZScgKQorICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo5ODMxOjM6IChlbnVtTGl0ZXJhbF8xPSAnbWVyZ2UnICkKICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo5MzkyOjM6IChlbnVtTGl0ZXJhbF8xPSAnbWVyZ2UnICkKLSAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6OTM5Mzo0OiBlbnVtTGl0ZXJhbF8xPSAnbWVyZ2UnCisgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjk4MzE6MzogKGVudW1MaXRlcmFsXzE9ICdtZXJnZScgKQorICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo5ODMyOjQ6IGVudW1MaXRlcmFsXzE9ICdtZXJnZScKICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBlbnVtTGl0ZXJhbF8xPShUb2tlbiltYXRjaChpbnB1dCwxNTMsRk9MTE9XXzIpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gY3VycmVudDsKKyAgICAgICAgICAgICAgICAgICAgZW51bUxpdGVyYWxfMT0oVG9rZW4pbWF0Y2goaW5wdXQsMTYwLEZPTExPV18yKTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7CiAgICAgICAgICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogCiAgICAgICAgICAgICAgICAgICAgICAgCQkJCWN1cnJlbnQgPSBncmFtbWFyQWNjZXNzLmdldEVudGl0eU1hbmFnZXJNb2RlQWNjZXNzKCkuZ2V0TWVyZ2VFbnVtTGl0ZXJhbERlY2xhcmF0aW9uXzEoKS5nZXRFbnVtTGl0ZXJhbCgpLmdldEluc3RhbmNlKCk7CkBAIC0yNTk0OSwxMiArMjcxNDMsMTIgQEAKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICBjYXNlIDMgOgotICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo5NDAwOjM6IChlbnVtTGl0ZXJhbF8yPSAncmVtb3ZlJyApCisgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjk4Mzk6MzogKGVudW1MaXRlcmFsXzI9ICdyZW1vdmUnICkKICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo5NDAwOjM6IChlbnVtTGl0ZXJhbF8yPSAncmVtb3ZlJyApCi0gICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjk0MDE6NDogZW51bUxpdGVyYWxfMj0gJ3JlbW92ZScKKyAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6OTgzOTozOiAoZW51bUxpdGVyYWxfMj0gJ3JlbW92ZScgKQorICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo5ODQwOjQ6IGVudW1MaXRlcmFsXzI9ICdyZW1vdmUnCiAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgZW51bUxpdGVyYWxfMj0oVG9rZW4pbWF0Y2goaW5wdXQsMTU0LEZPTExPV18yKTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7CisgICAgICAgICAgICAgICAgICAgIGVudW1MaXRlcmFsXzI9KFRva2VuKW1hdGNoKGlucHV0LDE2MSxGT0xMT1dfMik7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OwogICAgICAgICAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKIAogICAgICAgICAgICAgICAgICAgICAgIAkJCQljdXJyZW50ID0gZ3JhbW1hckFjY2Vzcy5nZXRFbnRpdHlNYW5hZ2VyTW9kZUFjY2VzcygpLmdldFJlbW92ZUVudW1MaXRlcmFsRGVjbGFyYXRpb25fMigpLmdldEVudW1MaXRlcmFsKCkuZ2V0SW5zdGFuY2UoKTsKQEAgLTI1OTkwLDEyICsyNzE4NCwzNTYgQEAKICAgICB9CiAgICAgLy8gJEFOVExSIGVuZCAicnVsZUVudGl0eU1hbmFnZXJNb2RlIgogCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVDb25kaXRpb25BbmRPcGVyYXRvcjEiCisgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6OTg1MDoxOiBydWxlQ29uZGl0aW9uQW5kT3BlcmF0b3IxIHJldHVybnMgW0VudW1lcmF0b3IgY3VycmVudD1udWxsXSA6ICggKGVudW1MaXRlcmFsXzA9ICc9JyApIHwgKGVudW1MaXRlcmFsXzE9ICchPScgKSB8IChlbnVtTGl0ZXJhbF8yPSAnPicgKSB8IChlbnVtTGl0ZXJhbF8zPSAnPj0nICkgfCAoZW51bUxpdGVyYWxfND0gJzwnICkgfCAoZW51bUxpdGVyYWxfNT0gJzw9JyApIHwgKGVudW1MaXRlcmFsXzY9ICdpc251bGwnICkgfCAoZW51bUxpdGVyYWxfNz0gJ2lzbm90bnVsbCcgKSApIDsKKyAgICBwdWJsaWMgZmluYWwgRW51bWVyYXRvciBydWxlQ29uZGl0aW9uQW5kT3BlcmF0b3IxKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgRW51bWVyYXRvciBjdXJyZW50ID0gbnVsbDsKKworICAgICAgICBUb2tlbiBlbnVtTGl0ZXJhbF8wPW51bGw7CisgICAgICAgIFRva2VuIGVudW1MaXRlcmFsXzE9bnVsbDsKKyAgICAgICAgVG9rZW4gZW51bUxpdGVyYWxfMj1udWxsOworICAgICAgICBUb2tlbiBlbnVtTGl0ZXJhbF8zPW51bGw7CisgICAgICAgIFRva2VuIGVudW1MaXRlcmFsXzQ9bnVsbDsKKyAgICAgICAgVG9rZW4gZW51bUxpdGVyYWxfNT1udWxsOworICAgICAgICBUb2tlbiBlbnVtTGl0ZXJhbF82PW51bGw7CisgICAgICAgIFRva2VuIGVudW1MaXRlcmFsXzc9bnVsbDsKKworCisgICAgICAgIAllbnRlclJ1bGUoKTsKKworICAgICAgICB0cnkgeworICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6OTg1NjoyOiAoICggKGVudW1MaXRlcmFsXzA9ICc9JyApIHwgKGVudW1MaXRlcmFsXzE9ICchPScgKSB8IChlbnVtTGl0ZXJhbF8yPSAnPicgKSB8IChlbnVtTGl0ZXJhbF8zPSAnPj0nICkgfCAoZW51bUxpdGVyYWxfND0gJzwnICkgfCAoZW51bUxpdGVyYWxfNT0gJzw9JyApIHwgKGVudW1MaXRlcmFsXzY9ICdpc251bGwnICkgfCAoZW51bUxpdGVyYWxfNz0gJ2lzbm90bnVsbCcgKSApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjk4NTc6MjogKCAoZW51bUxpdGVyYWxfMD0gJz0nICkgfCAoZW51bUxpdGVyYWxfMT0gJyE9JyApIHwgKGVudW1MaXRlcmFsXzI9ICc+JyApIHwgKGVudW1MaXRlcmFsXzM9ICc+PScgKSB8IChlbnVtTGl0ZXJhbF80PSAnPCcgKSB8IChlbnVtTGl0ZXJhbF81PSAnPD0nICkgfCAoZW51bUxpdGVyYWxfNj0gJ2lzbnVsbCcgKSB8IChlbnVtTGl0ZXJhbF83PSAnaXNub3RudWxsJyApICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjk4NTc6MjogKCAoZW51bUxpdGVyYWxfMD0gJz0nICkgfCAoZW51bUxpdGVyYWxfMT0gJyE9JyApIHwgKGVudW1MaXRlcmFsXzI9ICc+JyApIHwgKGVudW1MaXRlcmFsXzM9ICc+PScgKSB8IChlbnVtTGl0ZXJhbF80PSAnPCcgKSB8IChlbnVtTGl0ZXJhbF81PSAnPD0nICkgfCAoZW51bUxpdGVyYWxfNj0gJ2lzbnVsbCcgKSB8IChlbnVtTGl0ZXJhbF83PSAnaXNub3RudWxsJyApICkKKyAgICAgICAgICAgIGludCBhbHQxNzc9ODsKKyAgICAgICAgICAgIHN3aXRjaCAoIGlucHV0LkxBKDEpICkgeworICAgICAgICAgICAgY2FzZSA4NDoKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYWx0MTc3PTE7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSA5OToKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYWx0MTc3PTI7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSA5NDoKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYWx0MTc3PTM7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSA5NToKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYWx0MTc3PTQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSA5MzoKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYWx0MTc3PTU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAxNjI6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGFsdDE3Nz02OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMTYzOgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBhbHQxNzc9NzsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDE2NDoKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYWx0MTc3PTg7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICBpZiAoc3RhdGUuYmFja3RyYWNraW5nPjApIHtzdGF0ZS5mYWlsZWQ9dHJ1ZTsgcmV0dXJuIGN1cnJlbnQ7fQorICAgICAgICAgICAgICAgIE5vVmlhYmxlQWx0RXhjZXB0aW9uIG52YWUgPQorICAgICAgICAgICAgICAgICAgICBuZXcgTm9WaWFibGVBbHRFeGNlcHRpb24oIiIsIDE3NywgMCwgaW5wdXQpOworCisgICAgICAgICAgICAgICAgdGhyb3cgbnZhZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3dpdGNoIChhbHQxNzcpIHsKKyAgICAgICAgICAgICAgICBjYXNlIDEgOgorICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo5ODU4OjM6IChlbnVtTGl0ZXJhbF8wPSAnPScgKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjk4NTg6MzogKGVudW1MaXRlcmFsXzA9ICc9JyApCisgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjk4NTk6NDogZW51bUxpdGVyYWxfMD0gJz0nCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgZW51bUxpdGVyYWxfMD0oVG9rZW4pbWF0Y2goaW5wdXQsODQsRk9MTE9XXzIpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gY3VycmVudDsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisKKyAgICAgICAgICAgICAgICAgICAgICAJCQkJY3VycmVudCA9IGdyYW1tYXJBY2Nlc3MuZ2V0Q29uZGl0aW9uQW5kT3BlcmF0b3IxQWNjZXNzKCkuZ2V0RXF1YWxzRW51bUxpdGVyYWxEZWNsYXJhdGlvbl8wKCkuZ2V0RW51bUxpdGVyYWwoKS5nZXRJbnN0YW5jZSgpOworICAgICAgICAgICAgICAgICAgICAgIAkJCQluZXdMZWFmTm9kZShlbnVtTGl0ZXJhbF8wLCBncmFtbWFyQWNjZXNzLmdldENvbmRpdGlvbkFuZE9wZXJhdG9yMUFjY2VzcygpLmdldEVxdWFsc0VudW1MaXRlcmFsRGVjbGFyYXRpb25fMCgpKTsKKyAgICAgICAgICAgICAgICAgICAgICAJCQkKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSAyIDoKKyAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6OTg2NjozOiAoZW51bUxpdGVyYWxfMT0gJyE9JyApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6OTg2NjozOiAoZW51bUxpdGVyYWxfMT0gJyE9JyApCisgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjk4Njc6NDogZW51bUxpdGVyYWxfMT0gJyE9JworICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGVudW1MaXRlcmFsXzE9KFRva2VuKW1hdGNoKGlucHV0LDk5LEZPTExPV18yKTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7CisgICAgICAgICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworCisgICAgICAgICAgICAgICAgICAgICAgCQkJCWN1cnJlbnQgPSBncmFtbWFyQWNjZXNzLmdldENvbmRpdGlvbkFuZE9wZXJhdG9yMUFjY2VzcygpLmdldE5vdGVxdWFsc0VudW1MaXRlcmFsRGVjbGFyYXRpb25fMSgpLmdldEVudW1MaXRlcmFsKCkuZ2V0SW5zdGFuY2UoKTsKKyAgICAgICAgICAgICAgICAgICAgICAJCQkJbmV3TGVhZk5vZGUoZW51bUxpdGVyYWxfMSwgZ3JhbW1hckFjY2Vzcy5nZXRDb25kaXRpb25BbmRPcGVyYXRvcjFBY2Nlc3MoKS5nZXROb3RlcXVhbHNFbnVtTGl0ZXJhbERlY2xhcmF0aW9uXzEoKSk7CisgICAgICAgICAgICAgICAgICAgICAgCQkJCisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgMyA6CisgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjk4NzQ6MzogKGVudW1MaXRlcmFsXzI9ICc+JyApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6OTg3NDozOiAoZW51bUxpdGVyYWxfMj0gJz4nICkKKyAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6OTg3NTo0OiBlbnVtTGl0ZXJhbF8yPSAnPicKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBlbnVtTGl0ZXJhbF8yPShUb2tlbiltYXRjaChpbnB1dCw5NCxGT0xMT1dfMik7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OworICAgICAgICAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKworICAgICAgICAgICAgICAgICAgICAgIAkJCQljdXJyZW50ID0gZ3JhbW1hckFjY2Vzcy5nZXRDb25kaXRpb25BbmRPcGVyYXRvcjFBY2Nlc3MoKS5nZXRHcmVhdGVydGhlbkVudW1MaXRlcmFsRGVjbGFyYXRpb25fMigpLmdldEVudW1MaXRlcmFsKCkuZ2V0SW5zdGFuY2UoKTsKKyAgICAgICAgICAgICAgICAgICAgICAJCQkJbmV3TGVhZk5vZGUoZW51bUxpdGVyYWxfMiwgZ3JhbW1hckFjY2Vzcy5nZXRDb25kaXRpb25BbmRPcGVyYXRvcjFBY2Nlc3MoKS5nZXRHcmVhdGVydGhlbkVudW1MaXRlcmFsRGVjbGFyYXRpb25fMigpKTsKKyAgICAgICAgICAgICAgICAgICAgICAJCQkKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSA0IDoKKyAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6OTg4MjozOiAoZW51bUxpdGVyYWxfMz0gJz49JyApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6OTg4MjozOiAoZW51bUxpdGVyYWxfMz0gJz49JyApCisgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjk4ODM6NDogZW51bUxpdGVyYWxfMz0gJz49JworICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGVudW1MaXRlcmFsXzM9KFRva2VuKW1hdGNoKGlucHV0LDk1LEZPTExPV18yKTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7CisgICAgICAgICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworCisgICAgICAgICAgICAgICAgICAgICAgCQkJCWN1cnJlbnQgPSBncmFtbWFyQWNjZXNzLmdldENvbmRpdGlvbkFuZE9wZXJhdG9yMUFjY2VzcygpLmdldEdyZWF0ZXJ0aGVub3JlcXVhbHRvRW51bUxpdGVyYWxEZWNsYXJhdGlvbl8zKCkuZ2V0RW51bUxpdGVyYWwoKS5nZXRJbnN0YW5jZSgpOworICAgICAgICAgICAgICAgICAgICAgIAkJCQluZXdMZWFmTm9kZShlbnVtTGl0ZXJhbF8zLCBncmFtbWFyQWNjZXNzLmdldENvbmRpdGlvbkFuZE9wZXJhdG9yMUFjY2VzcygpLmdldEdyZWF0ZXJ0aGVub3JlcXVhbHRvRW51bUxpdGVyYWxEZWNsYXJhdGlvbl8zKCkpOworICAgICAgICAgICAgICAgICAgICAgIAkJCQorICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIDUgOgorICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo5ODkwOjM6IChlbnVtTGl0ZXJhbF80PSAnPCcgKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjk4OTA6MzogKGVudW1MaXRlcmFsXzQ9ICc8JyApCisgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjk4OTE6NDogZW51bUxpdGVyYWxfND0gJzwnCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgZW51bUxpdGVyYWxfND0oVG9rZW4pbWF0Y2goaW5wdXQsOTMsRk9MTE9XXzIpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gY3VycmVudDsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisKKyAgICAgICAgICAgICAgICAgICAgICAJCQkJY3VycmVudCA9IGdyYW1tYXJBY2Nlc3MuZ2V0Q29uZGl0aW9uQW5kT3BlcmF0b3IxQWNjZXNzKCkuZ2V0TGVzc3RoZW5FbnVtTGl0ZXJhbERlY2xhcmF0aW9uXzQoKS5nZXRFbnVtTGl0ZXJhbCgpLmdldEluc3RhbmNlKCk7CisgICAgICAgICAgICAgICAgICAgICAgCQkJCW5ld0xlYWZOb2RlKGVudW1MaXRlcmFsXzQsIGdyYW1tYXJBY2Nlc3MuZ2V0Q29uZGl0aW9uQW5kT3BlcmF0b3IxQWNjZXNzKCkuZ2V0TGVzc3RoZW5FbnVtTGl0ZXJhbERlY2xhcmF0aW9uXzQoKSk7CisgICAgICAgICAgICAgICAgICAgICAgCQkJCisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgNiA6CisgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjk4OTg6MzogKGVudW1MaXRlcmFsXzU9ICc8PScgKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjk4OTg6MzogKGVudW1MaXRlcmFsXzU9ICc8PScgKQorICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo5ODk5OjQ6IGVudW1MaXRlcmFsXzU9ICc8PScKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBlbnVtTGl0ZXJhbF81PShUb2tlbiltYXRjaChpbnB1dCwxNjIsRk9MTE9XXzIpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gY3VycmVudDsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisKKyAgICAgICAgICAgICAgICAgICAgICAJCQkJY3VycmVudCA9IGdyYW1tYXJBY2Nlc3MuZ2V0Q29uZGl0aW9uQW5kT3BlcmF0b3IxQWNjZXNzKCkuZ2V0TGVzc3RoZW5vcmVxdWFsdG9FbnVtTGl0ZXJhbERlY2xhcmF0aW9uXzUoKS5nZXRFbnVtTGl0ZXJhbCgpLmdldEluc3RhbmNlKCk7CisgICAgICAgICAgICAgICAgICAgICAgCQkJCW5ld0xlYWZOb2RlKGVudW1MaXRlcmFsXzUsIGdyYW1tYXJBY2Nlc3MuZ2V0Q29uZGl0aW9uQW5kT3BlcmF0b3IxQWNjZXNzKCkuZ2V0TGVzc3RoZW5vcmVxdWFsdG9FbnVtTGl0ZXJhbERlY2xhcmF0aW9uXzUoKSk7CisgICAgICAgICAgICAgICAgICAgICAgCQkJCisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgNyA6CisgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjk5MDY6MzogKGVudW1MaXRlcmFsXzY9ICdpc251bGwnICkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo5OTA2OjM6IChlbnVtTGl0ZXJhbF82PSAnaXNudWxsJyApCisgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjk5MDc6NDogZW51bUxpdGVyYWxfNj0gJ2lzbnVsbCcKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBlbnVtTGl0ZXJhbF82PShUb2tlbiltYXRjaChpbnB1dCwxNjMsRk9MTE9XXzIpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gY3VycmVudDsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisKKyAgICAgICAgICAgICAgICAgICAgICAJCQkJY3VycmVudCA9IGdyYW1tYXJBY2Nlc3MuZ2V0Q29uZGl0aW9uQW5kT3BlcmF0b3IxQWNjZXNzKCkuZ2V0SXNudWxsRW51bUxpdGVyYWxEZWNsYXJhdGlvbl82KCkuZ2V0RW51bUxpdGVyYWwoKS5nZXRJbnN0YW5jZSgpOworICAgICAgICAgICAgICAgICAgICAgIAkJCQluZXdMZWFmTm9kZShlbnVtTGl0ZXJhbF82LCBncmFtbWFyQWNjZXNzLmdldENvbmRpdGlvbkFuZE9wZXJhdG9yMUFjY2VzcygpLmdldElzbnVsbEVudW1MaXRlcmFsRGVjbGFyYXRpb25fNigpKTsKKyAgICAgICAgICAgICAgICAgICAgICAJCQkKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSA4IDoKKyAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6OTkxNDozOiAoZW51bUxpdGVyYWxfNz0gJ2lzbm90bnVsbCcgKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjk5MTQ6MzogKGVudW1MaXRlcmFsXzc9ICdpc25vdG51bGwnICkKKyAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6OTkxNTo0OiBlbnVtTGl0ZXJhbF83PSAnaXNub3RudWxsJworICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGVudW1MaXRlcmFsXzc9KFRva2VuKW1hdGNoKGlucHV0LDE2NCxGT0xMT1dfMik7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OworICAgICAgICAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKworICAgICAgICAgICAgICAgICAgICAgIAkJCQljdXJyZW50ID0gZ3JhbW1hckFjY2Vzcy5nZXRDb25kaXRpb25BbmRPcGVyYXRvcjFBY2Nlc3MoKS5nZXRJc25vdG51bGxFbnVtTGl0ZXJhbERlY2xhcmF0aW9uXzcoKS5nZXRFbnVtTGl0ZXJhbCgpLmdldEluc3RhbmNlKCk7CisgICAgICAgICAgICAgICAgICAgICAgCQkJCW5ld0xlYWZOb2RlKGVudW1MaXRlcmFsXzcsIGdyYW1tYXJBY2Nlc3MuZ2V0Q29uZGl0aW9uQW5kT3BlcmF0b3IxQWNjZXNzKCkuZ2V0SXNub3RudWxsRW51bUxpdGVyYWxEZWNsYXJhdGlvbl83KCkpOworICAgICAgICAgICAgICAgICAgICAgIAkJCQorICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisKKyAgICAgICAgICAgICAgCWxlYXZlUnVsZSgpOworCisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAgICAgY2F0Y2ggKFJlY29nbml0aW9uRXhjZXB0aW9uIHJlKSB7CisgICAgICAgICAgICAgICAgcmVjb3ZlcihpbnB1dCxyZSk7CisgICAgICAgICAgICAgICAgYXBwZW5kU2tpcHBlZFRva2VucygpOworICAgICAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gY3VycmVudDsKKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAicnVsZUNvbmRpdGlvbkFuZE9wZXJhdG9yMSIKKworCisgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlQ29uZGl0aW9uQW5kT3BlcmF0b3IyIgorICAgIC8vIEludGVybmFsRGF0YURTTC5nOjk5MjU6MTogcnVsZUNvbmRpdGlvbkFuZE9wZXJhdG9yMiByZXR1cm5zIFtFbnVtZXJhdG9yIGN1cnJlbnQ9bnVsbF0gOiAoIChlbnVtTGl0ZXJhbF8wPSAnYW5kJyApIHwgKGVudW1MaXRlcmFsXzE9ICdvcicgKSApIDsKKyAgICBwdWJsaWMgZmluYWwgRW51bWVyYXRvciBydWxlQ29uZGl0aW9uQW5kT3BlcmF0b3IyKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgRW51bWVyYXRvciBjdXJyZW50ID0gbnVsbDsKKworICAgICAgICBUb2tlbiBlbnVtTGl0ZXJhbF8wPW51bGw7CisgICAgICAgIFRva2VuIGVudW1MaXRlcmFsXzE9bnVsbDsKKworCisgICAgICAgIAllbnRlclJ1bGUoKTsKKworICAgICAgICB0cnkgeworICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6OTkzMToyOiAoICggKGVudW1MaXRlcmFsXzA9ICdhbmQnICkgfCAoZW51bUxpdGVyYWxfMT0gJ29yJyApICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6OTkzMjoyOiAoIChlbnVtTGl0ZXJhbF8wPSAnYW5kJyApIHwgKGVudW1MaXRlcmFsXzE9ICdvcicgKSApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo5OTMyOjI6ICggKGVudW1MaXRlcmFsXzA9ICdhbmQnICkgfCAoZW51bUxpdGVyYWxfMT0gJ29yJyApICkKKyAgICAgICAgICAgIGludCBhbHQxNzg9MjsKKyAgICAgICAgICAgIGludCBMQTE3OF8wID0gaW5wdXQuTEEoMSk7CisKKyAgICAgICAgICAgIGlmICggKExBMTc4XzA9PTE2NSkgKSB7CisgICAgICAgICAgICAgICAgYWx0MTc4PTE7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmICggKExBMTc4XzA9PTE2NikgKSB7CisgICAgICAgICAgICAgICAgYWx0MTc4PTI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICBpZiAoc3RhdGUuYmFja3RyYWNraW5nPjApIHtzdGF0ZS5mYWlsZWQ9dHJ1ZTsgcmV0dXJuIGN1cnJlbnQ7fQorICAgICAgICAgICAgICAgIE5vVmlhYmxlQWx0RXhjZXB0aW9uIG52YWUgPQorICAgICAgICAgICAgICAgICAgICBuZXcgTm9WaWFibGVBbHRFeGNlcHRpb24oIiIsIDE3OCwgMCwgaW5wdXQpOworCisgICAgICAgICAgICAgICAgdGhyb3cgbnZhZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHN3aXRjaCAoYWx0MTc4KSB7CisgICAgICAgICAgICAgICAgY2FzZSAxIDoKKyAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6OTkzMzozOiAoZW51bUxpdGVyYWxfMD0gJ2FuZCcgKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjk5MzM6MzogKGVudW1MaXRlcmFsXzA9ICdhbmQnICkKKyAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6OTkzNDo0OiBlbnVtTGl0ZXJhbF8wPSAnYW5kJworICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGVudW1MaXRlcmFsXzA9KFRva2VuKW1hdGNoKGlucHV0LDE2NSxGT0xMT1dfMik7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OworICAgICAgICAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKworICAgICAgICAgICAgICAgICAgICAgIAkJCQljdXJyZW50ID0gZ3JhbW1hckFjY2Vzcy5nZXRDb25kaXRpb25BbmRPcGVyYXRvcjJBY2Nlc3MoKS5nZXRBbmRFbnVtTGl0ZXJhbERlY2xhcmF0aW9uXzAoKS5nZXRFbnVtTGl0ZXJhbCgpLmdldEluc3RhbmNlKCk7CisgICAgICAgICAgICAgICAgICAgICAgCQkJCW5ld0xlYWZOb2RlKGVudW1MaXRlcmFsXzAsIGdyYW1tYXJBY2Nlc3MuZ2V0Q29uZGl0aW9uQW5kT3BlcmF0b3IyQWNjZXNzKCkuZ2V0QW5kRW51bUxpdGVyYWxEZWNsYXJhdGlvbl8wKCkpOworICAgICAgICAgICAgICAgICAgICAgIAkJCQorICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIDIgOgorICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo5OTQxOjM6IChlbnVtTGl0ZXJhbF8xPSAnb3InICkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo5OTQxOjM6IChlbnVtTGl0ZXJhbF8xPSAnb3InICkKKyAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6OTk0Mjo0OiBlbnVtTGl0ZXJhbF8xPSAnb3InCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgZW51bUxpdGVyYWxfMT0oVG9rZW4pbWF0Y2goaW5wdXQsMTY2LEZPTExPV18yKTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7CisgICAgICAgICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworCisgICAgICAgICAgICAgICAgICAgICAgCQkJCWN1cnJlbnQgPSBncmFtbWFyQWNjZXNzLmdldENvbmRpdGlvbkFuZE9wZXJhdG9yMkFjY2VzcygpLmdldE9yRW51bUxpdGVyYWxEZWNsYXJhdGlvbl8xKCkuZ2V0RW51bUxpdGVyYWwoKS5nZXRJbnN0YW5jZSgpOworICAgICAgICAgICAgICAgICAgICAgIAkJCQluZXdMZWFmTm9kZShlbnVtTGl0ZXJhbF8xLCBncmFtbWFyQWNjZXNzLmdldENvbmRpdGlvbkFuZE9wZXJhdG9yMkFjY2VzcygpLmdldE9yRW51bUxpdGVyYWxEZWNsYXJhdGlvbl8xKCkpOworICAgICAgICAgICAgICAgICAgICAgIAkJCQorICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisKKyAgICAgICAgICAgICAgCWxlYXZlUnVsZSgpOworCisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAgICAgY2F0Y2ggKFJlY29nbml0aW9uRXhjZXB0aW9uIHJlKSB7CisgICAgICAgICAgICAgICAgcmVjb3ZlcihpbnB1dCxyZSk7CisgICAgICAgICAgICAgICAgYXBwZW5kU2tpcHBlZFRva2VucygpOworICAgICAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gY3VycmVudDsKKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAicnVsZUNvbmRpdGlvbkFuZE9wZXJhdG9yMiIKKwogICAgIC8vICRBTlRMUiBzdGFydCBzeW5wcmVkMV9JbnRlcm5hbERhdGFEU0wKICAgICBwdWJsaWMgZmluYWwgdm9pZCBzeW5wcmVkMV9JbnRlcm5hbERhdGFEU0xfZnJhZ21lbnQoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geyAgIAotICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNjA3OjU6ICggJygnICkKLSAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjYwNzo2OiAnKCcKKyAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MzA0Njo1OiAoICcoJyApCisgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjMwNDY6NjogJygnCiAgICAgICAgIHsKLSAgICAgICAgbWF0Y2goaW5wdXQsNzQsRk9MTE9XXzIpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOworICAgICAgICBtYXRjaChpbnB1dCw4MSxGT0xMT1dfMik7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CiAKICAgICAgICAgfQogICAgIH0KQEAgLTI2MDAzLDE5ICsyNzU0MSwxOSBAQAogCiAgICAgLy8gJEFOVExSIHN0YXJ0IHN5bnByZWQyX0ludGVybmFsRGF0YURTTAogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHN5bnByZWQyX0ludGVybmFsRGF0YURTTF9mcmFnbWVudCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7ICAgCi0gICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI2MTY6NzogKCAoICggKCBydWxlVmFsaWRJRCApICkgJz0nICkgKQotICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNjE2Ojg6ICggKCAoIHJ1bGVWYWxpZElEICkgKSAnPScgKQorICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzozMDU1Ojc6ICggKCAoICggcnVsZVZhbGlkSUQgKSApICc9JyApICkKKyAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MzA1NTo4OiAoICggKCBydWxlVmFsaWRJRCApICkgJz0nICkKICAgICAgICAgewotICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNjE2Ojg6ICggKCAoIHJ1bGVWYWxpZElEICkgKSAnPScgKQotICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNjE3Ojg6ICggKCBydWxlVmFsaWRJRCApICkgJz0nCisgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjMwNTU6ODogKCAoICggcnVsZVZhbGlkSUQgKSApICc9JyApCisgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjMwNTY6ODogKCAoIHJ1bGVWYWxpZElEICkgKSAnPScKICAgICAgICAgewotICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNjE3Ojg6ICggKCBydWxlVmFsaWRJRCApICkKLSAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjYxODo5OiAoIHJ1bGVWYWxpZElEICkKKyAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MzA1Njo4OiAoICggcnVsZVZhbGlkSUQgKSApCisgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjMwNTc6OTogKCBydWxlVmFsaWRJRCApCiAgICAgICAgIHsKLSAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjYxODo5OiAoIHJ1bGVWYWxpZElEICkKLSAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MjYxOToxMDogcnVsZVZhbGlkSUQKKyAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MzA1Nzo5OiAoIHJ1bGVWYWxpZElEICkKKyAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MzA1ODoxMDogcnVsZVZhbGlkSUQKICAgICAgICAgewotICAgICAgICBwdXNoRm9sbG93KEZPTExPV182Myk7CisgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzc3KTsKICAgICAgICAgcnVsZVZhbGlkSUQoKTsKIAogICAgICAgICBzdGF0ZS5fZnNwLS07CkBAIC0yNjAyNiw3ICsyNzU2NCw3IEBACiAKICAgICAgICAgfQogCi0gICAgICAgIG1hdGNoKGlucHV0LDc3LEZPTExPV18yKTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKKyAgICAgICAgbWF0Y2goaW5wdXQsODQsRk9MTE9XXzIpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOwogCiAgICAgICAgIH0KIApAQCAtMjYwMzcsMTkgKzI3NTc1LDE5IEBACiAKICAgICAvLyAkQU5UTFIgc3RhcnQgc3lucHJlZDVfSW50ZXJuYWxEYXRhRFNMCiAgICAgcHVibGljIGZpbmFsIHZvaWQgc3lucHJlZDVfSW50ZXJuYWxEYXRhRFNMX2ZyYWdtZW50KCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsgICAKLSAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6Mjc5Njo1OiAoICggKCkgJyMnICdbJyApICkKLSAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6Mjc5Njo2OiAoICgpICcjJyAnWycgKQorICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzozMjM1OjU6ICggKCAoKSAnIycgJ1snICkgKQorICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzozMjM1OjY6ICggKCkgJyMnICdbJyApCiAgICAgICAgIHsKLSAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6Mjc5Njo2OiAoICgpICcjJyAnWycgKQotICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNzk3OjY6ICgpICcjJyAnWycKKyAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MzIzNTo2OiAoICgpICcjJyAnWycgKQorICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzozMjM2OjY6ICgpICcjJyAnWycKICAgICAgICAgewotICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyNzk3OjY6ICgpCi0gICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI3OTg6NjogCisgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjMyMzY6NjogKCkKKyAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MzIzNzo2OiAKICAgICAgICAgewogICAgICAgICB9CiAKLSAgICAgICAgbWF0Y2goaW5wdXQsNzgsRk9MTE9XXzY1KTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKLSAgICAgICAgbWF0Y2goaW5wdXQsNzksRk9MTE9XXzIpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOworICAgICAgICBtYXRjaChpbnB1dCw4NSxGT0xMT1dfNzkpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOworICAgICAgICBtYXRjaChpbnB1dCw4NixGT0xMT1dfMik7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CiAKICAgICAgICAgfQogCkBAIC0yNjA2MCwxOSArMjc1OTgsMTkgQEAKIAogICAgIC8vICRBTlRMUiBzdGFydCBzeW5wcmVkNl9JbnRlcm5hbERhdGFEU0wKICAgICBwdWJsaWMgZmluYWwgdm9pZCBzeW5wcmVkNl9JbnRlcm5hbERhdGFEU0xfZnJhZ21lbnQoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geyAgIAotICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyOTM4OjU6ICggKCAoKSAnIycgJ1snICkgKQotICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyOTM4OjY6ICggKCkgJyMnICdbJyApCisgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjMzNzc6NTogKCAoICgpICcjJyAnWycgKSApCisgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjMzNzc6NjogKCAoKSAnIycgJ1snICkKICAgICAgICAgewotICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzoyOTM4OjY6ICggKCkgJyMnICdbJyApCi0gICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI5Mzk6NjogKCkgJyMnICdbJworICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzozMzc3OjY6ICggKCkgJyMnICdbJyApCisgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjMzNzg6NjogKCkgJyMnICdbJwogICAgICAgICB7Ci0gICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjI5Mzk6NjogKCkKLSAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6Mjk0MDo2OiAKKyAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MzM3ODo2OiAoKQorICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzozMzc5OjY6IAogICAgICAgICB7CiAgICAgICAgIH0KIAotICAgICAgICBtYXRjaChpbnB1dCw3OCxGT0xMT1dfNjUpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOwotICAgICAgICBtYXRjaChpbnB1dCw3OSxGT0xMT1dfMik7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CisgICAgICAgIG1hdGNoKGlucHV0LDg1LEZPTExPV183OSk7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CisgICAgICAgIG1hdGNoKGlucHV0LDg2LEZPTExPV18yKTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKIAogICAgICAgICB9CiAKQEAgLTI2MDgzLDIyICsyNzYyMSwyMiBAQAogCiAgICAgLy8gJEFOVExSIHN0YXJ0IHN5bnByZWQ3X0ludGVybmFsRGF0YURTTAogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHN5bnByZWQ3X0ludGVybmFsRGF0YURTTF9mcmFnbWVudCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7ICAgCi0gICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjMxNjY6NjogKCAoICgpICggKCBydWxlT3BNdWx0aUFzc2lnbiApICkgKSApCi0gICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjMxNjY6NzogKCAoKSAoICggcnVsZU9wTXVsdGlBc3NpZ24gKSApICkKKyAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MzYwNTo2OiAoICggKCkgKCAoIHJ1bGVPcE11bHRpQXNzaWduICkgKSApICkKKyAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MzYwNTo3OiAoICgpICggKCBydWxlT3BNdWx0aUFzc2lnbiApICkgKQogICAgICAgICB7Ci0gICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjMxNjY6NzogKCAoKSAoICggcnVsZU9wTXVsdGlBc3NpZ24gKSApICkKLSAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MzE2Nzo3OiAoKSAoICggcnVsZU9wTXVsdGlBc3NpZ24gKSApCisgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjM2MDU6NzogKCAoKSAoICggcnVsZU9wTXVsdGlBc3NpZ24gKSApICkKKyAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MzYwNjo3OiAoKSAoICggcnVsZU9wTXVsdGlBc3NpZ24gKSApCiAgICAgICAgIHsKLSAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MzE2Nzo3OiAoKQotICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzozMTY4Ojc6IAorICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzozNjA2Ojc6ICgpCisgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjM2MDc6NzogCiAgICAgICAgIHsKICAgICAgICAgfQogCi0gICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjMxNjk6NzogKCAoIHJ1bGVPcE11bHRpQXNzaWduICkgKQotICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzozMTcwOjg6ICggcnVsZU9wTXVsdGlBc3NpZ24gKQorICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzozNjA4Ojc6ICggKCBydWxlT3BNdWx0aUFzc2lnbiApICkKKyAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MzYwOTo4OiAoIHJ1bGVPcE11bHRpQXNzaWduICkKICAgICAgICAgewotICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzozMTcwOjg6ICggcnVsZU9wTXVsdGlBc3NpZ24gKQotICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzozMTcxOjk6IHJ1bGVPcE11bHRpQXNzaWduCisgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjM2MDk6ODogKCBydWxlT3BNdWx0aUFzc2lnbiApCisgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjM2MTA6OTogcnVsZU9wTXVsdGlBc3NpZ24KICAgICAgICAgewogICAgICAgICBwdXNoRm9sbG93KEZPTExPV18yKTsKICAgICAgICAgcnVsZU9wTXVsdGlBc3NpZ24oKTsKQEAgLTI2MTIxLDIyICsyNzY1OSwyMiBAQAogCiAgICAgLy8gJEFOVExSIHN0YXJ0IHN5bnByZWQ4X0ludGVybmFsRGF0YURTTAogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHN5bnByZWQ4X0ludGVybmFsRGF0YURTTF9mcmFnbWVudCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7ICAgCi0gICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjMzNjA6NTogKCAoICgpICggKCBydWxlT3BPciApICkgKSApCi0gICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjMzNjA6NjogKCAoKSAoICggcnVsZU9wT3IgKSApICkKKyAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6Mzc5OTo1OiAoICggKCkgKCAoIHJ1bGVPcE9yICkgKSApICkKKyAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6Mzc5OTo2OiAoICgpICggKCBydWxlT3BPciApICkgKQogICAgICAgICB7Ci0gICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjMzNjA6NjogKCAoKSAoICggcnVsZU9wT3IgKSApICkKLSAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MzM2MTo2OiAoKSAoICggcnVsZU9wT3IgKSApCisgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjM3OTk6NjogKCAoKSAoICggcnVsZU9wT3IgKSApICkKKyAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MzgwMDo2OiAoKSAoICggcnVsZU9wT3IgKSApCiAgICAgICAgIHsKLSAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MzM2MTo2OiAoKQotICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzozMzYyOjY6IAorICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzozODAwOjY6ICgpCisgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjM4MDE6NjogCiAgICAgICAgIHsKICAgICAgICAgfQogCi0gICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjMzNjM6NjogKCAoIHJ1bGVPcE9yICkgKQotICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzozMzY0Ojc6ICggcnVsZU9wT3IgKQorICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzozODAyOjY6ICggKCBydWxlT3BPciApICkKKyAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MzgwMzo3OiAoIHJ1bGVPcE9yICkKICAgICAgICAgewotICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzozMzY0Ojc6ICggcnVsZU9wT3IgKQotICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzozMzY1Ojg6IHJ1bGVPcE9yCisgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjM4MDM6NzogKCBydWxlT3BPciApCisgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjM4MDQ6ODogcnVsZU9wT3IKICAgICAgICAgewogICAgICAgICBwdXNoRm9sbG93KEZPTExPV18yKTsKICAgICAgICAgcnVsZU9wT3IoKTsKQEAgLTI2MTU5LDIyICsyNzY5NywyMiBAQAogCiAgICAgLy8gJEFOVExSIHN0YXJ0IHN5bnByZWQ5X0ludGVybmFsRGF0YURTTAogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHN5bnByZWQ5X0ludGVybmFsRGF0YURTTF9mcmFnbWVudCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7ICAgCi0gICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjM0Njc6NTogKCAoICgpICggKCBydWxlT3BBbmQgKSApICkgKQotICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzozNDY3OjY6ICggKCkgKCAoIHJ1bGVPcEFuZCApICkgKQorICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzozOTA2OjU6ICggKCAoKSAoICggcnVsZU9wQW5kICkgKSApICkKKyAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MzkwNjo2OiAoICgpICggKCBydWxlT3BBbmQgKSApICkKICAgICAgICAgewotICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzozNDY3OjY6ICggKCkgKCAoIHJ1bGVPcEFuZCApICkgKQotICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzozNDY4OjY6ICgpICggKCBydWxlT3BBbmQgKSApCisgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjM5MDY6NjogKCAoKSAoICggcnVsZU9wQW5kICkgKSApCisgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjM5MDc6NjogKCkgKCAoIHJ1bGVPcEFuZCApICkKICAgICAgICAgewotICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzozNDY4OjY6ICgpCi0gICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjM0Njk6NjogCisgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjM5MDc6NjogKCkKKyAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MzkwODo2OiAKICAgICAgICAgewogICAgICAgICB9CiAKLSAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MzQ3MDo2OiAoICggcnVsZU9wQW5kICkgKQotICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzozNDcxOjc6ICggcnVsZU9wQW5kICkKKyAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MzkwOTo2OiAoICggcnVsZU9wQW5kICkgKQorICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzozOTEwOjc6ICggcnVsZU9wQW5kICkKICAgICAgICAgewotICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzozNDcxOjc6ICggcnVsZU9wQW5kICkKLSAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MzQ3Mjo4OiBydWxlT3BBbmQKKyAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MzkxMDo3OiAoIHJ1bGVPcEFuZCApCisgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjM5MTE6ODogcnVsZU9wQW5kCiAgICAgICAgIHsKICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMik7CiAgICAgICAgIHJ1bGVPcEFuZCgpOwpAQCAtMjYxOTcsMjIgKzI3NzM1LDIyIEBACiAKICAgICAvLyAkQU5UTFIgc3RhcnQgc3lucHJlZDEwX0ludGVybmFsRGF0YURTTAogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHN5bnByZWQxMF9JbnRlcm5hbERhdGFEU0xfZnJhZ21lbnQoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geyAgIAotICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzozNTc0OjU6ICggKCAoKSAoICggcnVsZU9wRXF1YWxpdHkgKSApICkgKQotICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzozNTc0OjY6ICggKCkgKCAoIHJ1bGVPcEVxdWFsaXR5ICkgKSApCisgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjQwMTM6NTogKCAoICgpICggKCBydWxlT3BFcXVhbGl0eSApICkgKSApCisgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjQwMTM6NjogKCAoKSAoICggcnVsZU9wRXF1YWxpdHkgKSApICkKICAgICAgICAgewotICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzozNTc0OjY6ICggKCkgKCAoIHJ1bGVPcEVxdWFsaXR5ICkgKSApCi0gICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjM1NzU6NjogKCkgKCAoIHJ1bGVPcEVxdWFsaXR5ICkgKQorICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo0MDEzOjY6ICggKCkgKCAoIHJ1bGVPcEVxdWFsaXR5ICkgKSApCisgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjQwMTQ6NjogKCkgKCAoIHJ1bGVPcEVxdWFsaXR5ICkgKQogICAgICAgICB7Ci0gICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjM1NzU6NjogKCkKLSAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MzU3Njo2OiAKKyAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NDAxNDo2OiAoKQorICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo0MDE1OjY6IAogICAgICAgICB7CiAgICAgICAgIH0KIAotICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzozNTc3OjY6ICggKCBydWxlT3BFcXVhbGl0eSApICkKLSAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MzU3ODo3OiAoIHJ1bGVPcEVxdWFsaXR5ICkKKyAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NDAxNjo2OiAoICggcnVsZU9wRXF1YWxpdHkgKSApCisgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjQwMTc6NzogKCBydWxlT3BFcXVhbGl0eSApCiAgICAgICAgIHsKLSAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MzU3ODo3OiAoIHJ1bGVPcEVxdWFsaXR5ICkKLSAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MzU3OTo4OiBydWxlT3BFcXVhbGl0eQorICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo0MDE3Ojc6ICggcnVsZU9wRXF1YWxpdHkgKQorICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo0MDE4Ojg6IHJ1bGVPcEVxdWFsaXR5CiAgICAgICAgIHsKICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMik7CiAgICAgICAgIHJ1bGVPcEVxdWFsaXR5KCk7CkBAIC0yNjIzNSwxOCArMjc3NzMsMTggQEAKIAogICAgIC8vICRBTlRMUiBzdGFydCBzeW5wcmVkMTFfSW50ZXJuYWxEYXRhRFNMCiAgICAgcHVibGljIGZpbmFsIHZvaWQgc3lucHJlZDExX0ludGVybmFsRGF0YURTTF9mcmFnbWVudCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7ICAgCi0gICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjM3MDI6NjogKCAoICgpICdpbnN0YW5jZW9mJyApICkKLSAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MzcwMjo3OiAoICgpICdpbnN0YW5jZW9mJyApCisgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjQxNDE6NjogKCAoICgpICdpbnN0YW5jZW9mJyApICkKKyAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NDE0MTo3OiAoICgpICdpbnN0YW5jZW9mJyApCiAgICAgICAgIHsKLSAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MzcwMjo3OiAoICgpICdpbnN0YW5jZW9mJyApCi0gICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjM3MDM6NzogKCkgJ2luc3RhbmNlb2YnCisgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjQxNDE6NzogKCAoKSAnaW5zdGFuY2VvZicgKQorICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo0MTQyOjc6ICgpICdpbnN0YW5jZW9mJwogICAgICAgICB7Ci0gICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjM3MDM6NzogKCkKLSAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6MzcwNDo3OiAKKyAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NDE0Mjo3OiAoKQorICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo0MTQzOjc6IAogICAgICAgICB7CiAgICAgICAgIH0KIAotICAgICAgICBtYXRjaChpbnB1dCw5NSxGT0xMT1dfMik7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CisgICAgICAgIG1hdGNoKGlucHV0LDEwMixGT0xMT1dfMik7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CiAKICAgICAgICAgfQogCkBAIC0yNjI1NywyMiArMjc3OTUsMjIgQEAKIAogICAgIC8vICRBTlRMUiBzdGFydCBzeW5wcmVkMTJfSW50ZXJuYWxEYXRhRFNMCiAgICAgcHVibGljIGZpbmFsIHZvaWQgc3lucHJlZDEyX0ludGVybmFsRGF0YURTTF9mcmFnbWVudCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7ICAgCi0gICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjM3NDU6NjogKCAoICgpICggKCBydWxlT3BDb21wYXJlICkgKSApICkKLSAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6Mzc0NTo3OiAoICgpICggKCBydWxlT3BDb21wYXJlICkgKSApCisgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjQxODQ6NjogKCAoICgpICggKCBydWxlT3BDb21wYXJlICkgKSApICkKKyAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NDE4NDo3OiAoICgpICggKCBydWxlT3BDb21wYXJlICkgKSApCiAgICAgICAgIHsKLSAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6Mzc0NTo3OiAoICgpICggKCBydWxlT3BDb21wYXJlICkgKSApCi0gICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjM3NDY6NzogKCkgKCAoIHJ1bGVPcENvbXBhcmUgKSApCisgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjQxODQ6NzogKCAoKSAoICggcnVsZU9wQ29tcGFyZSApICkgKQorICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo0MTg1Ojc6ICgpICggKCBydWxlT3BDb21wYXJlICkgKQogICAgICAgICB7Ci0gICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjM3NDY6NzogKCkKLSAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6Mzc0Nzo3OiAKKyAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NDE4NTo3OiAoKQorICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo0MTg2Ojc6IAogICAgICAgICB7CiAgICAgICAgIH0KIAotICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzozNzQ4Ojc6ICggKCBydWxlT3BDb21wYXJlICkgKQotICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzozNzQ5Ojg6ICggcnVsZU9wQ29tcGFyZSApCisgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjQxODc6NzogKCAoIHJ1bGVPcENvbXBhcmUgKSApCisgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjQxODg6ODogKCBydWxlT3BDb21wYXJlICkKICAgICAgICAgewotICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzozNzQ5Ojg6ICggcnVsZU9wQ29tcGFyZSApCi0gICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjM3NTA6OTogcnVsZU9wQ29tcGFyZQorICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo0MTg4Ojg6ICggcnVsZU9wQ29tcGFyZSApCisgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjQxODk6OTogcnVsZU9wQ29tcGFyZQogICAgICAgICB7CiAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzIpOwogICAgICAgICBydWxlT3BDb21wYXJlKCk7CkBAIC0yNjI5NSwyMiArMjc4MzMsMjIgQEAKIAogICAgIC8vICRBTlRMUiBzdGFydCBzeW5wcmVkMTNfSW50ZXJuYWxEYXRhRFNMCiAgICAgcHVibGljIGZpbmFsIHZvaWQgc3lucHJlZDEzX0ludGVybmFsRGF0YURTTF9mcmFnbWVudCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7ICAgCi0gICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjM4ODA6NTogKCAoICgpICggKCBydWxlT3BPdGhlciApICkgKSApCi0gICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjM4ODA6NjogKCAoKSAoICggcnVsZU9wT3RoZXIgKSApICkKKyAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NDMxOTo1OiAoICggKCkgKCAoIHJ1bGVPcE90aGVyICkgKSApICkKKyAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NDMxOTo2OiAoICgpICggKCBydWxlT3BPdGhlciApICkgKQogICAgICAgICB7Ci0gICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjM4ODA6NjogKCAoKSAoICggcnVsZU9wT3RoZXIgKSApICkKLSAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6Mzg4MTo2OiAoKSAoICggcnVsZU9wT3RoZXIgKSApCisgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjQzMTk6NjogKCAoKSAoICggcnVsZU9wT3RoZXIgKSApICkKKyAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NDMyMDo2OiAoKSAoICggcnVsZU9wT3RoZXIgKSApCiAgICAgICAgIHsKLSAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6Mzg4MTo2OiAoKQotICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzozODgyOjY6IAorICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo0MzIwOjY6ICgpCisgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjQzMjE6NjogCiAgICAgICAgIHsKICAgICAgICAgfQogCi0gICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjM4ODM6NjogKCAoIHJ1bGVPcE90aGVyICkgKQotICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzozODg0Ojc6ICggcnVsZU9wT3RoZXIgKQorICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo0MzIyOjY6ICggKCBydWxlT3BPdGhlciApICkKKyAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NDMyMzo3OiAoIHJ1bGVPcE90aGVyICkKICAgICAgICAgewotICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzozODg0Ojc6ICggcnVsZU9wT3RoZXIgKQotICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzozODg1Ojg6IHJ1bGVPcE90aGVyCisgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjQzMjM6NzogKCBydWxlT3BPdGhlciApCisgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjQzMjQ6ODogcnVsZU9wT3RoZXIKICAgICAgICAgewogICAgICAgICBwdXNoRm9sbG93KEZPTExPV18yKTsKICAgICAgICAgcnVsZU9wT3RoZXIoKTsKQEAgLTI2MzMzLDE0ICsyNzg3MSwxNCBAQAogCiAgICAgLy8gJEFOVExSIHN0YXJ0IHN5bnByZWQxNF9JbnRlcm5hbERhdGFEU0wKICAgICBwdWJsaWMgZmluYWwgdm9pZCBzeW5wcmVkMTRfSW50ZXJuYWxEYXRhRFNMX2ZyYWdtZW50KCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsgICAKLSAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NDAwMDo2OiAoICggJz4nICc+JyApICkKLSAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NDAwMDo3OiAoICc+JyAnPicgKQorICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo0NDM5OjY6ICggKCAnPicgJz4nICkgKQorICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo0NDM5Ojc6ICggJz4nICc+JyApCiAgICAgICAgIHsKLSAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NDAwMDo3OiAoICc+JyAnPicgKQotICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo0MDAxOjc6ICc+JyAnPicKKyAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NDQzOTo3OiAoICc+JyAnPicgKQorICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo0NDQwOjc6ICc+JyAnPicKICAgICAgICAgewotICAgICAgICBtYXRjaChpbnB1dCw4NyxGT0xMT1dfODApOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOwotICAgICAgICBtYXRjaChpbnB1dCw4NyxGT0xMT1dfMik7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CisgICAgICAgIG1hdGNoKGlucHV0LDk0LEZPTExPV185NCk7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CisgICAgICAgIG1hdGNoKGlucHV0LDk0LEZPTExPV18yKTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKIAogICAgICAgICB9CiAKQEAgLTI2MzUxLDE0ICsyNzg4OSwxNCBAQAogCiAgICAgLy8gJEFOVExSIHN0YXJ0IHN5bnByZWQxNV9JbnRlcm5hbERhdGFEU0wKICAgICBwdWJsaWMgZmluYWwgdm9pZCBzeW5wcmVkMTVfSW50ZXJuYWxEYXRhRFNMX2ZyYWdtZW50KCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsgICAKLSAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NDAzNTo2OiAoICggJzwnICc8JyApICkKLSAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NDAzNTo3OiAoICc8JyAnPCcgKQorICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo0NDc0OjY6ICggKCAnPCcgJzwnICkgKQorICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo0NDc0Ojc6ICggJzwnICc8JyApCiAgICAgICAgIHsKLSAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NDAzNTo3OiAoICc8JyAnPCcgKQotICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo0MDM2Ojc6ICc8JyAnPCcKKyAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NDQ3NDo3OiAoICc8JyAnPCcgKQorICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo0NDc1Ojc6ICc8JyAnPCcKICAgICAgICAgewotICAgICAgICBtYXRjaChpbnB1dCw4NixGT0xMT1dfNzApOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOwotICAgICAgICBtYXRjaChpbnB1dCw4NixGT0xMT1dfMik7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CisgICAgICAgIG1hdGNoKGlucHV0LDkzLEZPTExPV184NCk7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CisgICAgICAgIG1hdGNoKGlucHV0LDkzLEZPTExPV18yKTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKIAogICAgICAgICB9CiAKQEAgLTI2MzY5LDIyICsyNzkwNywyMiBAQAogCiAgICAgLy8gJEFOVExSIHN0YXJ0IHN5bnByZWQxNl9JbnRlcm5hbERhdGFEU0wKICAgICBwdWJsaWMgZmluYWwgdm9pZCBzeW5wcmVkMTZfSW50ZXJuYWxEYXRhRFNMX2ZyYWdtZW50KCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsgICAKLSAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NDEwODo1OiAoICggKCkgKCAoIHJ1bGVPcEFkZCApICkgKSApCi0gICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjQxMDg6NjogKCAoKSAoICggcnVsZU9wQWRkICkgKSApCisgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjQ1NDc6NTogKCAoICgpICggKCBydWxlT3BBZGQgKSApICkgKQorICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo0NTQ3OjY6ICggKCkgKCAoIHJ1bGVPcEFkZCApICkgKQogICAgICAgICB7Ci0gICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjQxMDg6NjogKCAoKSAoICggcnVsZU9wQWRkICkgKSApCi0gICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjQxMDk6NjogKCkgKCAoIHJ1bGVPcEFkZCApICkKKyAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NDU0Nzo2OiAoICgpICggKCBydWxlT3BBZGQgKSApICkKKyAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NDU0ODo2OiAoKSAoICggcnVsZU9wQWRkICkgKQogICAgICAgICB7Ci0gICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjQxMDk6NjogKCkKLSAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NDExMDo2OiAKKyAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NDU0ODo2OiAoKQorICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo0NTQ5OjY6IAogICAgICAgICB7CiAgICAgICAgIH0KIAotICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo0MTExOjY6ICggKCBydWxlT3BBZGQgKSApCi0gICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjQxMTI6NzogKCBydWxlT3BBZGQgKQorICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo0NTUwOjY6ICggKCBydWxlT3BBZGQgKSApCisgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjQ1NTE6NzogKCBydWxlT3BBZGQgKQogICAgICAgICB7Ci0gICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjQxMTI6NzogKCBydWxlT3BBZGQgKQotICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo0MTEzOjg6IHJ1bGVPcEFkZAorICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo0NTUxOjc6ICggcnVsZU9wQWRkICkKKyAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NDU1Mjo4OiBydWxlT3BBZGQKICAgICAgICAgewogICAgICAgICBwdXNoRm9sbG93KEZPTExPV18yKTsKICAgICAgICAgcnVsZU9wQWRkKCk7CkBAIC0yNjQwNywyMiArMjc5NDUsMjIgQEAKIAogICAgIC8vICRBTlRMUiBzdGFydCBzeW5wcmVkMTdfSW50ZXJuYWxEYXRhRFNMCiAgICAgcHVibGljIGZpbmFsIHZvaWQgc3lucHJlZDE3X0ludGVybmFsRGF0YURTTF9mcmFnbWVudCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7ICAgCi0gICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjQyMjM6NTogKCAoICgpICggKCBydWxlT3BNdWx0aSApICkgKSApCi0gICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjQyMjM6NjogKCAoKSAoICggcnVsZU9wTXVsdGkgKSApICkKKyAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NDY2Mjo1OiAoICggKCkgKCAoIHJ1bGVPcE11bHRpICkgKSApICkKKyAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NDY2Mjo2OiAoICgpICggKCBydWxlT3BNdWx0aSApICkgKQogICAgICAgICB7Ci0gICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjQyMjM6NjogKCAoKSAoICggcnVsZU9wTXVsdGkgKSApICkKLSAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NDIyNDo2OiAoKSAoICggcnVsZU9wTXVsdGkgKSApCisgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjQ2NjI6NjogKCAoKSAoICggcnVsZU9wTXVsdGkgKSApICkKKyAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NDY2Mzo2OiAoKSAoICggcnVsZU9wTXVsdGkgKSApCiAgICAgICAgIHsKLSAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NDIyNDo2OiAoKQotICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo0MjI1OjY6IAorICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo0NjYzOjY6ICgpCisgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjQ2NjQ6NjogCiAgICAgICAgIHsKICAgICAgICAgfQogCi0gICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjQyMjY6NjogKCAoIHJ1bGVPcE11bHRpICkgKQotICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo0MjI3Ojc6ICggcnVsZU9wTXVsdGkgKQorICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo0NjY1OjY6ICggKCBydWxlT3BNdWx0aSApICkKKyAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NDY2Njo3OiAoIHJ1bGVPcE11bHRpICkKICAgICAgICAgewotICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo0MjI3Ojc6ICggcnVsZU9wTXVsdGkgKQotICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo0MjI4Ojg6IHJ1bGVPcE11bHRpCisgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjQ2NjY6NzogKCBydWxlT3BNdWx0aSApCisgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjQ2Njc6ODogcnVsZU9wTXVsdGkKICAgICAgICAgewogICAgICAgICBwdXNoRm9sbG93KEZPTExPV18yKTsKICAgICAgICAgcnVsZU9wTXVsdGkoKTsKQEAgLTI2NDQ1LDE4ICsyNzk4MywxOCBAQAogCiAgICAgLy8gJEFOVExSIHN0YXJ0IHN5bnByZWQxOF9JbnRlcm5hbERhdGFEU0wKICAgICBwdWJsaWMgZmluYWwgdm9pZCBzeW5wcmVkMThfSW50ZXJuYWxEYXRhRFNMX2ZyYWdtZW50KCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsgICAKLSAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NDQ1ODo1OiAoICggKCkgJ2FzJyApICkKLSAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NDQ1ODo2OiAoICgpICdhcycgKQorICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo0ODk3OjU6ICggKCAoKSAnYXMnICkgKQorICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo0ODk3OjY6ICggKCkgJ2FzJyApCiAgICAgICAgIHsKLSAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NDQ1ODo2OiAoICgpICdhcycgKQotICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo0NDU5OjY6ICgpICdhcycKKyAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NDg5Nzo2OiAoICgpICdhcycgKQorICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo0ODk4OjY6ICgpICdhcycKICAgICAgICAgewotICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo0NDU5OjY6ICgpCi0gICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjQ0NjA6NjogCisgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjQ4OTg6NjogKCkKKyAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NDg5OTo2OiAKICAgICAgICAgewogICAgICAgICB9CiAKLSAgICAgICAgbWF0Y2goaW5wdXQsNjEsRk9MTE9XXzIpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOworICAgICAgICBtYXRjaChpbnB1dCw2OCxGT0xMT1dfMik7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CiAKICAgICAgICAgfQogCkBAIC0yNjQ2NywyMiArMjgwMDUsMjIgQEAKIAogICAgIC8vICRBTlRMUiBzdGFydCBzeW5wcmVkMTlfSW50ZXJuYWxEYXRhRFNMCiAgICAgcHVibGljIGZpbmFsIHZvaWQgc3lucHJlZDE5X0ludGVybmFsRGF0YURTTF9mcmFnbWVudCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7ICAgCi0gICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjQ1MjY6NDogKCAoICgpICggKCBydWxlT3BQb3N0Zml4ICkgKSApICkKLSAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NDUyNjo1OiAoICgpICggKCBydWxlT3BQb3N0Zml4ICkgKSApCisgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjQ5NjU6NDogKCAoICgpICggKCBydWxlT3BQb3N0Zml4ICkgKSApICkKKyAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NDk2NTo1OiAoICgpICggKCBydWxlT3BQb3N0Zml4ICkgKSApCiAgICAgICAgIHsKLSAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NDUyNjo1OiAoICgpICggKCBydWxlT3BQb3N0Zml4ICkgKSApCi0gICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjQ1Mjc6NTogKCkgKCAoIHJ1bGVPcFBvc3RmaXggKSApCisgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjQ5NjU6NTogKCAoKSAoICggcnVsZU9wUG9zdGZpeCApICkgKQorICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo0OTY2OjU6ICgpICggKCBydWxlT3BQb3N0Zml4ICkgKQogICAgICAgICB7Ci0gICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjQ1Mjc6NTogKCkKLSAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NDUyODo1OiAKKyAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NDk2Njo1OiAoKQorICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo0OTY3OjU6IAogICAgICAgICB7CiAgICAgICAgIH0KIAotICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo0NTI5OjU6ICggKCBydWxlT3BQb3N0Zml4ICkgKQotICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo0NTMwOjY6ICggcnVsZU9wUG9zdGZpeCApCisgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjQ5Njg6NTogKCAoIHJ1bGVPcFBvc3RmaXggKSApCisgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjQ5Njk6NjogKCBydWxlT3BQb3N0Zml4ICkKICAgICAgICAgewotICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo0NTMwOjY6ICggcnVsZU9wUG9zdGZpeCApCi0gICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjQ1MzE6NzogcnVsZU9wUG9zdGZpeAorICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo0OTY5OjY6ICggcnVsZU9wUG9zdGZpeCApCisgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjQ5NzA6NzogcnVsZU9wUG9zdGZpeAogICAgICAgICB7CiAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzIpOwogICAgICAgICBydWxlT3BQb3N0Zml4KCk7CkBAIC0yNjUwNSw1MiArMjgwNDMsNTIgQEAKIAogICAgIC8vICRBTlRMUiBzdGFydCBzeW5wcmVkMjBfSW50ZXJuYWxEYXRhRFNMCiAgICAgcHVibGljIGZpbmFsIHZvaWQgc3lucHJlZDIwX0ludGVybmFsRGF0YURTTF9mcmFnbWVudCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7ICAgCi0gICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjQ2MjI6NjogKCAoICgpICggJy4nIHwgKCAoICc6OicgKSApICkgKCAoIHJ1bGVGZWF0dXJlQ2FsbElEICkgKSBydWxlT3BTaW5nbGVBc3NpZ24gKSApCi0gICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjQ2MjI6NzogKCAoKSAoICcuJyB8ICggKCAnOjonICkgKSApICggKCBydWxlRmVhdHVyZUNhbGxJRCApICkgcnVsZU9wU2luZ2xlQXNzaWduICkKKyAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NTA2MTo2OiAoICggKCkgKCAnLicgfCAoICggJzo6JyApICkgKSAoICggcnVsZUZlYXR1cmVDYWxsSUQgKSApIHJ1bGVPcFNpbmdsZUFzc2lnbiApICkKKyAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NTA2MTo3OiAoICgpICggJy4nIHwgKCAoICc6OicgKSApICkgKCAoIHJ1bGVGZWF0dXJlQ2FsbElEICkgKSBydWxlT3BTaW5nbGVBc3NpZ24gKQogICAgICAgICB7Ci0gICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjQ2MjI6NzogKCAoKSAoICcuJyB8ICggKCAnOjonICkgKSApICggKCBydWxlRmVhdHVyZUNhbGxJRCApICkgcnVsZU9wU2luZ2xlQXNzaWduICkKLSAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NDYyMzo3OiAoKSAoICcuJyB8ICggKCAnOjonICkgKSApICggKCBydWxlRmVhdHVyZUNhbGxJRCApICkgcnVsZU9wU2luZ2xlQXNzaWduCisgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjUwNjE6NzogKCAoKSAoICcuJyB8ICggKCAnOjonICkgKSApICggKCBydWxlRmVhdHVyZUNhbGxJRCApICkgcnVsZU9wU2luZ2xlQXNzaWduICkKKyAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NTA2Mjo3OiAoKSAoICcuJyB8ICggKCAnOjonICkgKSApICggKCBydWxlRmVhdHVyZUNhbGxJRCApICkgcnVsZU9wU2luZ2xlQXNzaWduCiAgICAgICAgIHsKLSAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NDYyMzo3OiAoKQotICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo0NjI0Ojc6IAorICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo1MDYyOjc6ICgpCisgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjUwNjM6NzogCiAgICAgICAgIHsKICAgICAgICAgfQogCi0gICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjQ2MjU6NzogKCAnLicgfCAoICggJzo6JyApICkgKQotICAgICAgICBpbnQgYWx0MTY2PTI7Ci0gICAgICAgIGludCBMQTE2Nl8wID0gaW5wdXQuTEEoMSk7CisgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjUwNjQ6NzogKCAnLicgfCAoICggJzo6JyApICkgKQorICAgICAgICBpbnQgYWx0MTc5PTI7CisgICAgICAgIGludCBMQTE3OV8wID0gaW5wdXQuTEEoMSk7CiAKLSAgICAgICAgaWYgKCAoTEExNjZfMD09NjcpICkgewotICAgICAgICAgICAgYWx0MTY2PTE7CisgICAgICAgIGlmICggKExBMTc5XzA9PTc0KSApIHsKKyAgICAgICAgICAgIGFsdDE3OT0xOwogICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKCAoTEExNjZfMD09MTEwKSApIHsKLSAgICAgICAgICAgIGFsdDE2Nj0yOworICAgICAgICBlbHNlIGlmICggKExBMTc5XzA9PTExNykgKSB7CisgICAgICAgICAgICBhbHQxNzk9MjsKICAgICAgICAgfQogICAgICAgICBlbHNlIHsKICAgICAgICAgICAgIGlmIChzdGF0ZS5iYWNrdHJhY2tpbmc+MCkge3N0YXRlLmZhaWxlZD10cnVlOyByZXR1cm4gO30KICAgICAgICAgICAgIE5vVmlhYmxlQWx0RXhjZXB0aW9uIG52YWUgPQotICAgICAgICAgICAgICAgIG5ldyBOb1ZpYWJsZUFsdEV4Y2VwdGlvbigiIiwgMTY2LCAwLCBpbnB1dCk7CisgICAgICAgICAgICAgICAgbmV3IE5vVmlhYmxlQWx0RXhjZXB0aW9uKCIiLCAxNzksIDAsIGlucHV0KTsKIAogICAgICAgICAgICAgdGhyb3cgbnZhZTsKICAgICAgICAgfQotICAgICAgICBzd2l0Y2ggKGFsdDE2NikgeworICAgICAgICBzd2l0Y2ggKGFsdDE3OSkgewogICAgICAgICAgICAgY2FzZSAxIDoKLSAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo0NjI2Ojg6ICcuJworICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjUwNjU6ODogJy4nCiAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIG1hdGNoKGlucHV0LDY3LEZPTExPV184Nyk7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CisgICAgICAgICAgICAgICAgbWF0Y2goaW5wdXQsNzQsRk9MTE9XXzEwMSk7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CiAKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICBjYXNlIDIgOgotICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjQ2Mjg6ODogKCAoICc6OicgKSApCisgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NTA2Nzo4OiAoICggJzo6JyApICkKICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NDYyODo4OiAoICggJzo6JyApICkKLSAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo0NjI5Ojk6ICggJzo6JyApCisgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NTA2Nzo4OiAoICggJzo6JyApICkKKyAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo1MDY4Ojk6ICggJzo6JyApCiAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjQ2Mjk6OTogKCAnOjonICkKLSAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo0NjMwOjEwOiAnOjonCisgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NTA2ODo5OiAoICc6OicgKQorICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjUwNjk6MTA6ICc6OicKICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgbWF0Y2goaW5wdXQsMTEwLEZPTExPV184Nyk7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CisgICAgICAgICAgICAgICAgbWF0Y2goaW5wdXQsMTE3LEZPTExPV18xMDEpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOwogCiAgICAgICAgICAgICAgICAgfQogCkBAIC0yNjU2MywxMyArMjgxMDEsMTMgQEAKIAogICAgICAgICB9CiAKLSAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NDYzNDo3OiAoICggcnVsZUZlYXR1cmVDYWxsSUQgKSApCi0gICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjQ2MzU6ODogKCBydWxlRmVhdHVyZUNhbGxJRCApCisgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjUwNzM6NzogKCAoIHJ1bGVGZWF0dXJlQ2FsbElEICkgKQorICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo1MDc0Ojg6ICggcnVsZUZlYXR1cmVDYWxsSUQgKQogICAgICAgICB7Ci0gICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjQ2MzU6ODogKCBydWxlRmVhdHVyZUNhbGxJRCApCi0gICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjQ2MzY6OTogcnVsZUZlYXR1cmVDYWxsSUQKKyAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NTA3NDo4OiAoIHJ1bGVGZWF0dXJlQ2FsbElEICkKKyAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NTA3NTo5OiBydWxlRmVhdHVyZUNhbGxJRAogICAgICAgICB7Ci0gICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzYzKTsKKyAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfNzcpOwogICAgICAgICBydWxlRmVhdHVyZUNhbGxJRCgpOwogCiAgICAgICAgIHN0YXRlLl9mc3AtLTsKQEAgLTI2NTk1LDYxICsyODEzMyw2MSBAQAogCiAgICAgLy8gJEFOVExSIHN0YXJ0IHN5bnByZWQyMV9JbnRlcm5hbERhdGFEU0wKICAgICBwdWJsaWMgZmluYWwgdm9pZCBzeW5wcmVkMjFfSW50ZXJuYWxEYXRhRFNMX2ZyYWdtZW50KCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsgICAKLSAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NDcxOTo2OiAoICggKCkgKCAnLicgfCAoICggJz8uJyApICkgfCAoICggJzo6JyApICkgKSApICkKLSAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NDcxOTo3OiAoICgpICggJy4nIHwgKCAoICc/LicgKSApIHwgKCAoICc6OicgKSApICkgKQorICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo1MTU4OjY6ICggKCAoKSAoICcuJyB8ICggKCAnPy4nICkgKSB8ICggKCAnOjonICkgKSApICkgKQorICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo1MTU4Ojc6ICggKCkgKCAnLicgfCAoICggJz8uJyApICkgfCAoICggJzo6JyApICkgKSApCiAgICAgICAgIHsKLSAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NDcxOTo3OiAoICgpICggJy4nIHwgKCAoICc/LicgKSApIHwgKCAoICc6OicgKSApICkgKQotICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo0NzIwOjc6ICgpICggJy4nIHwgKCAoICc/LicgKSApIHwgKCAoICc6OicgKSApICkKKyAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NTE1ODo3OiAoICgpICggJy4nIHwgKCAoICc/LicgKSApIHwgKCAoICc6OicgKSApICkgKQorICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo1MTU5Ojc6ICgpICggJy4nIHwgKCAoICc/LicgKSApIHwgKCAoICc6OicgKSApICkKICAgICAgICAgewotICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo0NzIwOjc6ICgpCi0gICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjQ3MjE6NzogCisgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjUxNTk6NzogKCkKKyAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NTE2MDo3OiAKICAgICAgICAgewogICAgICAgICB9CiAKLSAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NDcyMjo3OiAoICcuJyB8ICggKCAnPy4nICkgKSB8ICggKCAnOjonICkgKSApCi0gICAgICAgIGludCBhbHQxNjc9MzsKKyAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NTE2MTo3OiAoICcuJyB8ICggKCAnPy4nICkgKSB8ICggKCAnOjonICkgKSApCisgICAgICAgIGludCBhbHQxODA9MzsKICAgICAgICAgc3dpdGNoICggaW5wdXQuTEEoMSkgKSB7Ci0gICAgICAgIGNhc2UgNjc6CisgICAgICAgIGNhc2UgNzQ6CiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICBhbHQxNjc9MTsKKyAgICAgICAgICAgIGFsdDE4MD0xOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgMTExOgorICAgICAgICBjYXNlIDExODoKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIGFsdDE2Nz0yOworICAgICAgICAgICAgYWx0MTgwPTI7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSAxMTA6CisgICAgICAgIGNhc2UgMTE3OgogICAgICAgICAgICAgewotICAgICAgICAgICAgYWx0MTY3PTM7CisgICAgICAgICAgICBhbHQxODA9MzsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgaWYgKHN0YXRlLmJhY2t0cmFja2luZz4wKSB7c3RhdGUuZmFpbGVkPXRydWU7IHJldHVybiA7fQogICAgICAgICAgICAgTm9WaWFibGVBbHRFeGNlcHRpb24gbnZhZSA9Ci0gICAgICAgICAgICAgICAgbmV3IE5vVmlhYmxlQWx0RXhjZXB0aW9uKCIiLCAxNjcsIDAsIGlucHV0KTsKKyAgICAgICAgICAgICAgICBuZXcgTm9WaWFibGVBbHRFeGNlcHRpb24oIiIsIDE4MCwgMCwgaW5wdXQpOwogCiAgICAgICAgICAgICB0aHJvdyBudmFlOwogICAgICAgICB9CiAKLSAgICAgICAgc3dpdGNoIChhbHQxNjcpIHsKKyAgICAgICAgc3dpdGNoIChhbHQxODApIHsKICAgICAgICAgICAgIGNhc2UgMSA6Ci0gICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NDcyMzo4OiAnLicKKyAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo1MTYyOjg6ICcuJwogICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBtYXRjaChpbnB1dCw2NyxGT0xMT1dfMik7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CisgICAgICAgICAgICAgICAgbWF0Y2goaW5wdXQsNzQsRk9MTE9XXzIpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOwogCiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgY2FzZSAyIDoKLSAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo0NzI1Ojg6ICggKCAnPy4nICkgKQorICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjUxNjQ6ODogKCAoICc/LicgKSApCiAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjQ3MjU6ODogKCAoICc/LicgKSApCi0gICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NDcyNjo5OiAoICc/LicgKQorICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjUxNjQ6ODogKCAoICc/LicgKSApCisgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NTE2NTo5OiAoICc/LicgKQogICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo0NzI2Ojk6ICggJz8uJyApCi0gICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NDcyNzoxMDogJz8uJworICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjUxNjU6OTogKCAnPy4nICkKKyAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo1MTY2OjEwOiAnPy4nCiAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIG1hdGNoKGlucHV0LDExMSxGT0xMT1dfMik7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CisgICAgICAgICAgICAgICAgbWF0Y2goaW5wdXQsMTE4LEZPTExPV18yKTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKIAogICAgICAgICAgICAgICAgIH0KIApAQCAtMjY2NjAsMTUgKzI4MTk4LDE1IEBACiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgY2FzZSAzIDoKLSAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo0NzMxOjg6ICggKCAnOjonICkgKQorICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjUxNzA6ODogKCAoICc6OicgKSApCiAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjQ3MzE6ODogKCAoICc6OicgKSApCi0gICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NDczMjo5OiAoICc6OicgKQorICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjUxNzA6ODogKCAoICc6OicgKSApCisgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NTE3MTo5OiAoICc6OicgKQogICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo0NzMyOjk6ICggJzo6JyApCi0gICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NDczMzoxMDogJzo6JworICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjUxNzE6OTogKCAnOjonICkKKyAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo1MTcyOjEwOiAnOjonCiAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIG1hdGNoKGlucHV0LDExMCxGT0xMT1dfMik7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CisgICAgICAgICAgICAgICAgbWF0Y2goaW5wdXQsMTE3LEZPTExPV18yKTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKIAogICAgICAgICAgICAgICAgIH0KIApAQCAtMjY2OTEsMTMgKzI4MjI5LDEzIEBACiAKICAgICAvLyAkQU5UTFIgc3RhcnQgc3lucHJlZDIyX0ludGVybmFsRGF0YURTTAogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHN5bnByZWQyMl9JbnRlcm5hbERhdGFEU0xfZnJhZ21lbnQoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geyAgIAotICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo0ODU3Ojc6ICggKCAnKCcgKSApCi0gICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjQ4NTc6ODogKCAnKCcgKQorICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo1Mjk2Ojc6ICggKCAnKCcgKSApCisgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjUyOTY6ODogKCAnKCcgKQogICAgICAgICB7Ci0gICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjQ4NTc6ODogKCAnKCcgKQotICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo0ODU4Ojg6ICcoJworICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo1Mjk2Ojg6ICggJygnICkKKyAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NTI5Nzo4OiAnKCcKICAgICAgICAgewotICAgICAgICBtYXRjaChpbnB1dCw3NCxGT0xMT1dfMik7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CisgICAgICAgIG1hdGNoKGlucHV0LDgxLEZPTExPV18yKTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKIAogICAgICAgICB9CiAKQEAgLTI2NzA4LDM1ICsyODI0NiwzNSBAQAogCiAgICAgLy8gJEFOVExSIHN0YXJ0IHN5bnByZWQyM19JbnRlcm5hbERhdGFEU0wKICAgICBwdWJsaWMgZmluYWwgdm9pZCBzeW5wcmVkMjNfSW50ZXJuYWxEYXRhRFNMX2ZyYWdtZW50KCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsgICAKLSAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NDg3Njo4OiAoICggKCkgKCAoICggcnVsZUp2bUZvcm1hbFBhcmFtZXRlciApICkgKCAnLCcgKCAoIHJ1bGVKdm1Gb3JtYWxQYXJhbWV0ZXIgKSApICkqICk/ICggKCAnfCcgKSApICkgKQotICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo0ODc2Ojk6ICggKCkgKCAoICggcnVsZUp2bUZvcm1hbFBhcmFtZXRlciApICkgKCAnLCcgKCAoIHJ1bGVKdm1Gb3JtYWxQYXJhbWV0ZXIgKSApICkqICk/ICggKCAnfCcgKSApICkKKyAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NTMxNTo4OiAoICggKCkgKCAoICggcnVsZUp2bUZvcm1hbFBhcmFtZXRlciApICkgKCAnLCcgKCAoIHJ1bGVKdm1Gb3JtYWxQYXJhbWV0ZXIgKSApICkqICk/ICggKCAnfCcgKSApICkgKQorICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo1MzE1Ojk6ICggKCkgKCAoICggcnVsZUp2bUZvcm1hbFBhcmFtZXRlciApICkgKCAnLCcgKCAoIHJ1bGVKdm1Gb3JtYWxQYXJhbWV0ZXIgKSApICkqICk/ICggKCAnfCcgKSApICkKICAgICAgICAgewotICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo0ODc2Ojk6ICggKCkgKCAoICggcnVsZUp2bUZvcm1hbFBhcmFtZXRlciApICkgKCAnLCcgKCAoIHJ1bGVKdm1Gb3JtYWxQYXJhbWV0ZXIgKSApICkqICk/ICggKCAnfCcgKSApICkKLSAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NDg3Nzo5OiAoKSAoICggKCBydWxlSnZtRm9ybWFsUGFyYW1ldGVyICkgKSAoICcsJyAoICggcnVsZUp2bUZvcm1hbFBhcmFtZXRlciApICkgKSogKT8gKCAoICd8JyApICkKKyAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NTMxNTo5OiAoICgpICggKCAoIHJ1bGVKdm1Gb3JtYWxQYXJhbWV0ZXIgKSApICggJywnICggKCBydWxlSnZtRm9ybWFsUGFyYW1ldGVyICkgKSApKiApPyAoICggJ3wnICkgKSApCisgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjUzMTY6OTogKCkgKCAoICggcnVsZUp2bUZvcm1hbFBhcmFtZXRlciApICkgKCAnLCcgKCAoIHJ1bGVKdm1Gb3JtYWxQYXJhbWV0ZXIgKSApICkqICk/ICggKCAnfCcgKSApCiAgICAgICAgIHsKLSAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NDg3Nzo5OiAoKQotICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo0ODc4Ojk6IAorICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo1MzE2Ojk6ICgpCisgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjUzMTc6OTogCiAgICAgICAgIHsKICAgICAgICAgfQogCi0gICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjQ4Nzk6OTogKCAoICggcnVsZUp2bUZvcm1hbFBhcmFtZXRlciApICkgKCAnLCcgKCAoIHJ1bGVKdm1Gb3JtYWxQYXJhbWV0ZXIgKSApICkqICk/Ci0gICAgICAgIGludCBhbHQxNjk9MjsKLSAgICAgICAgaW50IExBMTY5XzAgPSBpbnB1dC5MQSgxKTsKKyAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NTMxODo5OiAoICggKCBydWxlSnZtRm9ybWFsUGFyYW1ldGVyICkgKSAoICcsJyAoICggcnVsZUp2bUZvcm1hbFBhcmFtZXRlciApICkgKSogKT8KKyAgICAgICAgaW50IGFsdDE4Mj0yOworICAgICAgICBpbnQgTEExODJfMCA9IGlucHV0LkxBKDEpOwogCi0gICAgICAgIGlmICggKExBMTY5XzA9PVJVTEVfSUR8fExBMTY5XzA9PTc0fHxMQTE2OV8wPT05OSkgKSB7Ci0gICAgICAgICAgICBhbHQxNjk9MTsKKyAgICAgICAgaWYgKCAoTEExODJfMD09UlVMRV9JRHx8TEExODJfMD09ODF8fExBMTgyXzA9PTEwNikgKSB7CisgICAgICAgICAgICBhbHQxODI9MTsKICAgICAgICAgfQotICAgICAgICBzd2l0Y2ggKGFsdDE2OSkgeworICAgICAgICBzd2l0Y2ggKGFsdDE4MikgewogICAgICAgICAgICAgY2FzZSAxIDoKLSAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo0ODgwOjEwOiAoICggcnVsZUp2bUZvcm1hbFBhcmFtZXRlciApICkgKCAnLCcgKCAoIHJ1bGVKdm1Gb3JtYWxQYXJhbWV0ZXIgKSApICkqCisgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NTMxOToxMDogKCAoIHJ1bGVKdm1Gb3JtYWxQYXJhbWV0ZXIgKSApICggJywnICggKCBydWxlSnZtRm9ybWFsUGFyYW1ldGVyICkgKSApKgogICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo0ODgwOjEwOiAoICggcnVsZUp2bUZvcm1hbFBhcmFtZXRlciApICkKLSAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo0ODgxOjExOiAoIHJ1bGVKdm1Gb3JtYWxQYXJhbWV0ZXIgKQorICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjUzMTk6MTA6ICggKCBydWxlSnZtRm9ybWFsUGFyYW1ldGVyICkgKQorICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjUzMjA6MTE6ICggcnVsZUp2bUZvcm1hbFBhcmFtZXRlciApCiAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjQ4ODE6MTE6ICggcnVsZUp2bUZvcm1hbFBhcmFtZXRlciApCi0gICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NDg4MjoxMjogcnVsZUp2bUZvcm1hbFBhcmFtZXRlcgorICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjUzMjA6MTE6ICggcnVsZUp2bUZvcm1hbFBhcmFtZXRlciApCisgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NTMyMToxMjogcnVsZUp2bUZvcm1hbFBhcmFtZXRlcgogICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV185Nyk7CisgICAgICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMTExKTsKICAgICAgICAgICAgICAgICBydWxlSnZtRm9ybWFsUGFyYW1ldGVyKCk7CiAKICAgICAgICAgICAgICAgICBzdGF0ZS5fZnNwLS07CkBAIC0yNjc0NywyOSArMjgyODUsMjkgQEAKIAogICAgICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjQ4ODU6MTA6ICggJywnICggKCBydWxlSnZtRm9ybWFsUGFyYW1ldGVyICkgKSApKgotICAgICAgICAgICAgICAgIGxvb3AxNjg6CisgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NTMyNDoxMDogKCAnLCcgKCAoIHJ1bGVKdm1Gb3JtYWxQYXJhbWV0ZXIgKSApICkqCisgICAgICAgICAgICAgICAgbG9vcDE4MToKICAgICAgICAgICAgICAgICBkbyB7Ci0gICAgICAgICAgICAgICAgICAgIGludCBhbHQxNjg9MjsKLSAgICAgICAgICAgICAgICAgICAgaW50IExBMTY4XzAgPSBpbnB1dC5MQSgxKTsKKyAgICAgICAgICAgICAgICAgICAgaW50IGFsdDE4MT0yOworICAgICAgICAgICAgICAgICAgICBpbnQgTEExODFfMCA9IGlucHV0LkxBKDEpOwogCi0gICAgICAgICAgICAgICAgICAgIGlmICggKExBMTY4XzA9PTc1KSApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGFsdDE2OD0xOworICAgICAgICAgICAgICAgICAgICBpZiAoIChMQTE4MV8wPT04MikgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBhbHQxODE9MTsKICAgICAgICAgICAgICAgICAgICAgfQogCiAKLSAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChhbHQxNjgpIHsKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChhbHQxODEpIHsKICAgICAgICAgICAgICAgICAJY2FzZSAxIDoKLSAgICAgICAgICAgICAgICAJICAgIC8vIEludGVybmFsRGF0YURTTC5nOjQ4ODY6MTE6ICcsJyAoICggcnVsZUp2bUZvcm1hbFBhcmFtZXRlciApICkKKyAgICAgICAgICAgICAgICAJICAgIC8vIEludGVybmFsRGF0YURTTC5nOjUzMjU6MTE6ICcsJyAoICggcnVsZUp2bUZvcm1hbFBhcmFtZXRlciApICkKICAgICAgICAgICAgICAgICAJICAgIHsKLSAgICAgICAgICAgICAgICAJICAgIG1hdGNoKGlucHV0LDc1LEZPTExPV183Nyk7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7Ci0gICAgICAgICAgICAgICAgCSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo0ODg3OjExOiAoICggcnVsZUp2bUZvcm1hbFBhcmFtZXRlciApICkKLSAgICAgICAgICAgICAgICAJICAgIC8vIEludGVybmFsRGF0YURTTC5nOjQ4ODg6MTI6ICggcnVsZUp2bUZvcm1hbFBhcmFtZXRlciApCisgICAgICAgICAgICAgICAgCSAgICBtYXRjaChpbnB1dCw4MixGT0xMT1dfOTEpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOworICAgICAgICAgICAgICAgIAkgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NTMyNjoxMTogKCAoIHJ1bGVKdm1Gb3JtYWxQYXJhbWV0ZXIgKSApCisgICAgICAgICAgICAgICAgCSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo1MzI3OjEyOiAoIHJ1bGVKdm1Gb3JtYWxQYXJhbWV0ZXIgKQogICAgICAgICAgICAgICAgIAkgICAgewotICAgICAgICAgICAgICAgIAkgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NDg4ODoxMjogKCBydWxlSnZtRm9ybWFsUGFyYW1ldGVyICkKLSAgICAgICAgICAgICAgICAJICAgIC8vIEludGVybmFsRGF0YURTTC5nOjQ4ODk6MTM6IHJ1bGVKdm1Gb3JtYWxQYXJhbWV0ZXIKKyAgICAgICAgICAgICAgICAJICAgIC8vIEludGVybmFsRGF0YURTTC5nOjUzMjc6MTI6ICggcnVsZUp2bUZvcm1hbFBhcmFtZXRlciApCisgICAgICAgICAgICAgICAgCSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo1MzI4OjEzOiBydWxlSnZtRm9ybWFsUGFyYW1ldGVyCiAgICAgICAgICAgICAgICAgCSAgICB7Ci0gICAgICAgICAgICAgICAgCSAgICBwdXNoRm9sbG93KEZPTExPV185Nyk7CisgICAgICAgICAgICAgICAgCSAgICBwdXNoRm9sbG93KEZPTExPV18xMTEpOwogICAgICAgICAgICAgICAgIAkgICAgcnVsZUp2bUZvcm1hbFBhcmFtZXRlcigpOwogCiAgICAgICAgICAgICAgICAgCSAgICBzdGF0ZS5fZnNwLS07CkBAIC0yNjc4NSw3ICsyODMyMyw3IEBACiAgICAgICAgICAgICAgICAgCSAgICBicmVhazsKIAogICAgICAgICAgICAgICAgIAlkZWZhdWx0IDoKLSAgICAgICAgICAgICAgICAJICAgIGJyZWFrIGxvb3AxNjg7CisgICAgICAgICAgICAgICAgCSAgICBicmVhayBsb29wMTgxOwogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfSB3aGlsZSAodHJ1ZSk7CiAKQEAgLTI2Nzk1LDEzICsyODMzMywxMyBAQAogCiAgICAgICAgIH0KIAotICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo0ODk0Ojk6ICggKCAnfCcgKSApCi0gICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjQ4OTU6MTA6ICggJ3wnICkKKyAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NTMzMzo5OiAoICggJ3wnICkgKQorICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo1MzM0OjEwOiAoICd8JyApCiAgICAgICAgIHsKLSAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NDg5NToxMDogKCAnfCcgKQotICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo0ODk2OjExOiAnfCcKKyAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NTMzNDoxMDogKCAnfCcgKQorICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo1MzM1OjExOiAnfCcKICAgICAgICAgewotICAgICAgICBtYXRjaChpbnB1dCwxMTIsRk9MTE9XXzIpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOworICAgICAgICBtYXRjaChpbnB1dCwxMTksRk9MTE9XXzIpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOwogCiAgICAgICAgIH0KIApAQCAtMjY4MTgsMTggKzI4MzU2LDE4IEBACiAKICAgICAvLyAkQU5UTFIgc3RhcnQgc3lucHJlZDI0X0ludGVybmFsRGF0YURTTAogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHN5bnByZWQyNF9JbnRlcm5hbERhdGFEU0xfZnJhZ21lbnQoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geyAgIAotICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo0OTczOjY6ICggKCAoKSAnWycgKSApCi0gICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjQ5NzM6NzogKCAoKSAnWycgKQorICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo1NDEyOjY6ICggKCAoKSAnWycgKSApCisgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjU0MTI6NzogKCAoKSAnWycgKQogICAgICAgICB7Ci0gICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjQ5NzM6NzogKCAoKSAnWycgKQotICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo0OTc0Ojc6ICgpICdbJworICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo1NDEyOjc6ICggKCkgJ1snICkKKyAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NTQxMzo3OiAoKSAnWycKICAgICAgICAgewotICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo0OTc0Ojc6ICgpCi0gICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjQ5NzU6NzogCisgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjU0MTM6NzogKCkKKyAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NTQxNDo3OiAKICAgICAgICAgewogICAgICAgICB9CiAKLSAgICAgICAgbWF0Y2goaW5wdXQsNzksRk9MTE9XXzIpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOworICAgICAgICBtYXRjaChpbnB1dCw4NixGT0xMT1dfMik7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CiAKICAgICAgICAgfQogCkBAIC0yNjg0MCwxOSArMjgzNzgsMTkgQEAKIAogICAgIC8vICRBTlRMUiBzdGFydCBzeW5wcmVkMjVfSW50ZXJuYWxEYXRhRFNMCiAgICAgcHVibGljIGZpbmFsIHZvaWQgc3lucHJlZDI1X0ludGVybmFsRGF0YURTTF9mcmFnbWVudCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7ICAgCi0gICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjUwNDY6NDogKCAoICgpICdzeW5jaHJvbml6ZWQnICcoJyApICkKLSAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NTA0Njo1OiAoICgpICdzeW5jaHJvbml6ZWQnICcoJyApCisgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjU0ODU6NDogKCAoICgpICdzeW5jaHJvbml6ZWQnICcoJyApICkKKyAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NTQ4NTo1OiAoICgpICdzeW5jaHJvbml6ZWQnICcoJyApCiAgICAgICAgIHsKLSAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NTA0Njo1OiAoICgpICdzeW5jaHJvbml6ZWQnICcoJyApCi0gICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjUwNDc6NTogKCkgJ3N5bmNocm9uaXplZCcgJygnCisgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjU0ODU6NTogKCAoKSAnc3luY2hyb25pemVkJyAnKCcgKQorICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo1NDg2OjU6ICgpICdzeW5jaHJvbml6ZWQnICcoJwogICAgICAgICB7Ci0gICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjUwNDc6NTogKCkKLSAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NTA0ODo1OiAKKyAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NTQ4Njo1OiAoKQorICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo1NDg3OjU6IAogICAgICAgICB7CiAgICAgICAgIH0KIAotICAgICAgICBtYXRjaChpbnB1dCwxMzQsRk9MTE9XXzEwMik7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7Ci0gICAgICAgIG1hdGNoKGlucHV0LDc0LEZPTExPV18yKTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKKyAgICAgICAgbWF0Y2goaW5wdXQsMTQxLEZPTExPV18xMTYpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOworICAgICAgICBtYXRjaChpbnB1dCw4MSxGT0xMT1dfMik7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CiAKICAgICAgICAgfQogCkBAIC0yNjg2MywyNiArMjg0MDEsMjYgQEAKIAogICAgIC8vICRBTlRMUiBzdGFydCBzeW5wcmVkMjZfSW50ZXJuYWxEYXRhRFNMCiAgICAgcHVibGljIGZpbmFsIHZvaWQgc3lucHJlZDI2X0ludGVybmFsRGF0YURTTF9mcmFnbWVudCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7ICAgCi0gICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjUwOTE6NDogKCAoICgpICdmb3InICcoJyAoICggcnVsZUp2bUZvcm1hbFBhcmFtZXRlciApICkgJzonICkgKQotICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo1MDkxOjU6ICggKCkgJ2ZvcicgJygnICggKCBydWxlSnZtRm9ybWFsUGFyYW1ldGVyICkgKSAnOicgKQorICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo1NTMwOjQ6ICggKCAoKSAnZm9yJyAnKCcgKCAoIHJ1bGVKdm1Gb3JtYWxQYXJhbWV0ZXIgKSApICc6JyApICkKKyAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NTUzMDo1OiAoICgpICdmb3InICcoJyAoICggcnVsZUp2bUZvcm1hbFBhcmFtZXRlciApICkgJzonICkKICAgICAgICAgewotICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo1MDkxOjU6ICggKCkgJ2ZvcicgJygnICggKCBydWxlSnZtRm9ybWFsUGFyYW1ldGVyICkgKSAnOicgKQotICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo1MDkyOjU6ICgpICdmb3InICcoJyAoICggcnVsZUp2bUZvcm1hbFBhcmFtZXRlciApICkgJzonCisgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjU1MzA6NTogKCAoKSAnZm9yJyAnKCcgKCAoIHJ1bGVKdm1Gb3JtYWxQYXJhbWV0ZXIgKSApICc6JyApCisgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjU1MzE6NTogKCkgJ2ZvcicgJygnICggKCBydWxlSnZtRm9ybWFsUGFyYW1ldGVyICkgKSAnOicKICAgICAgICAgewotICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo1MDkyOjU6ICgpCi0gICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjUwOTM6NTogCisgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjU1MzE6NTogKCkKKyAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NTUzMjo1OiAKICAgICAgICAgewogICAgICAgICB9CiAKLSAgICAgICAgbWF0Y2goaW5wdXQsNDYsRk9MTE9XXzEwMik7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7Ci0gICAgICAgIG1hdGNoKGlucHV0LDc0LEZPTExPV183Nyk7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7Ci0gICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjUwOTY6NTogKCAoIHJ1bGVKdm1Gb3JtYWxQYXJhbWV0ZXIgKSApCi0gICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjUwOTc6NjogKCBydWxlSnZtRm9ybWFsUGFyYW1ldGVyICkKKyAgICAgICAgbWF0Y2goaW5wdXQsNTAsRk9MTE9XXzExNik7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CisgICAgICAgIG1hdGNoKGlucHV0LDgxLEZPTExPV185MSk7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CisgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjU1MzU6NTogKCAoIHJ1bGVKdm1Gb3JtYWxQYXJhbWV0ZXIgKSApCisgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjU1MzY6NjogKCBydWxlSnZtRm9ybWFsUGFyYW1ldGVyICkKICAgICAgICAgewotICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo1MDk3OjY6ICggcnVsZUp2bUZvcm1hbFBhcmFtZXRlciApCi0gICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjUwOTg6NzogcnVsZUp2bUZvcm1hbFBhcmFtZXRlcgorICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo1NTM2OjY6ICggcnVsZUp2bUZvcm1hbFBhcmFtZXRlciApCisgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjU1Mzc6NzogcnVsZUp2bUZvcm1hbFBhcmFtZXRlcgogICAgICAgICB7Ci0gICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzEwNSk7CisgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzExOSk7CiAgICAgICAgIHJ1bGVKdm1Gb3JtYWxQYXJhbWV0ZXIoKTsKIAogICAgICAgICBzdGF0ZS5fZnNwLS07CkBAIC0yNjg5Myw3ICsyODQzMSw3IEBACiAKICAgICAgICAgfQogCi0gICAgICAgIG1hdGNoKGlucHV0LDExNixGT0xMT1dfMik7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CisgICAgICAgIG1hdGNoKGlucHV0LDEyMyxGT0xMT1dfMik7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CiAKICAgICAgICAgfQogCkBAIC0yNjkwNCwxOCArMjg0NDIsMTggQEAKIAogICAgIC8vICRBTlRMUiBzdGFydCBzeW5wcmVkMjdfSW50ZXJuYWxEYXRhRFNMCiAgICAgcHVibGljIGZpbmFsIHZvaWQgc3lucHJlZDI3X0ludGVybmFsRGF0YURTTF9mcmFnbWVudCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7ICAgCi0gICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjUyMDU6NDogKCAoICgpICdbJyApICkKLSAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NTIwNTo1OiAoICgpICdbJyApCisgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjU2NDQ6NDogKCAoICgpICdbJyApICkKKyAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NTY0NDo1OiAoICgpICdbJyApCiAgICAgICAgIHsKLSAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NTIwNTo1OiAoICgpICdbJyApCi0gICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjUyMDY6NTogKCkgJ1snCisgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjU2NDQ6NTogKCAoKSAnWycgKQorICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo1NjQ1OjU6ICgpICdbJwogICAgICAgICB7Ci0gICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjUyMDY6NTogKCkKLSAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NTIwNzo1OiAKKyAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NTY0NTo1OiAoKQorICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo1NjQ2OjU6IAogICAgICAgICB7CiAgICAgICAgIH0KIAotICAgICAgICBtYXRjaChpbnB1dCw3OSxGT0xMT1dfMik7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CisgICAgICAgIG1hdGNoKGlucHV0LDg2LEZPTExPV18yKTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKIAogICAgICAgICB9CiAKQEAgLTI2OTI2LDMwICsyODQ2NCwzMCBAQAogCiAgICAgLy8gJEFOVExSIHN0YXJ0IHN5bnByZWQyOV9JbnRlcm5hbERhdGFEU0wKICAgICBwdWJsaWMgZmluYWwgdm9pZCBzeW5wcmVkMjlfSW50ZXJuYWxEYXRhRFNMX2ZyYWdtZW50KCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsgICAKLSAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NTUxMDo0OiAoICggKCAoICggcnVsZUp2bUZvcm1hbFBhcmFtZXRlciApICkgKCAnLCcgKCAoIHJ1bGVKdm1Gb3JtYWxQYXJhbWV0ZXIgKSApICkqICk/ICggKCAnfCcgKSApICkgKQotICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo1NTEwOjU6ICggKCAoICggcnVsZUp2bUZvcm1hbFBhcmFtZXRlciApICkgKCAnLCcgKCAoIHJ1bGVKdm1Gb3JtYWxQYXJhbWV0ZXIgKSApICkqICk/ICggKCAnfCcgKSApICkKKyAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NTk0OTo0OiAoICggKCAoICggcnVsZUp2bUZvcm1hbFBhcmFtZXRlciApICkgKCAnLCcgKCAoIHJ1bGVKdm1Gb3JtYWxQYXJhbWV0ZXIgKSApICkqICk/ICggKCAnfCcgKSApICkgKQorICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo1OTQ5OjU6ICggKCAoICggcnVsZUp2bUZvcm1hbFBhcmFtZXRlciApICkgKCAnLCcgKCAoIHJ1bGVKdm1Gb3JtYWxQYXJhbWV0ZXIgKSApICkqICk/ICggKCAnfCcgKSApICkKICAgICAgICAgewotICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo1NTEwOjU6ICggKCAoICggcnVsZUp2bUZvcm1hbFBhcmFtZXRlciApICkgKCAnLCcgKCAoIHJ1bGVKdm1Gb3JtYWxQYXJhbWV0ZXIgKSApICkqICk/ICggKCAnfCcgKSApICkKLSAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NTUxMTo1OiAoICggKCBydWxlSnZtRm9ybWFsUGFyYW1ldGVyICkgKSAoICcsJyAoICggcnVsZUp2bUZvcm1hbFBhcmFtZXRlciApICkgKSogKT8gKCAoICd8JyApICkKKyAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NTk0OTo1OiAoICggKCAoIHJ1bGVKdm1Gb3JtYWxQYXJhbWV0ZXIgKSApICggJywnICggKCBydWxlSnZtRm9ybWFsUGFyYW1ldGVyICkgKSApKiApPyAoICggJ3wnICkgKSApCisgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjU5NTA6NTogKCAoICggcnVsZUp2bUZvcm1hbFBhcmFtZXRlciApICkgKCAnLCcgKCAoIHJ1bGVKdm1Gb3JtYWxQYXJhbWV0ZXIgKSApICkqICk/ICggKCAnfCcgKSApCiAgICAgICAgIHsKLSAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NTUxMTo1OiAoICggKCBydWxlSnZtRm9ybWFsUGFyYW1ldGVyICkgKSAoICcsJyAoICggcnVsZUp2bUZvcm1hbFBhcmFtZXRlciApICkgKSogKT8KLSAgICAgICAgaW50IGFsdDE3MT0yOwotICAgICAgICBpbnQgTEExNzFfMCA9IGlucHV0LkxBKDEpOworICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo1OTUwOjU6ICggKCAoIHJ1bGVKdm1Gb3JtYWxQYXJhbWV0ZXIgKSApICggJywnICggKCBydWxlSnZtRm9ybWFsUGFyYW1ldGVyICkgKSApKiApPworICAgICAgICBpbnQgYWx0MTg0PTI7CisgICAgICAgIGludCBMQTE4NF8wID0gaW5wdXQuTEEoMSk7CiAKLSAgICAgICAgaWYgKCAoTEExNzFfMD09UlVMRV9JRHx8TEExNzFfMD09NzR8fExBMTcxXzA9PTk5KSApIHsKLSAgICAgICAgICAgIGFsdDE3MT0xOworICAgICAgICBpZiAoIChMQTE4NF8wPT1SVUxFX0lEfHxMQTE4NF8wPT04MXx8TEExODRfMD09MTA2KSApIHsKKyAgICAgICAgICAgIGFsdDE4ND0xOwogICAgICAgICB9Ci0gICAgICAgIHN3aXRjaCAoYWx0MTcxKSB7CisgICAgICAgIHN3aXRjaCAoYWx0MTg0KSB7CiAgICAgICAgICAgICBjYXNlIDEgOgotICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjU1MTI6NjogKCAoIHJ1bGVKdm1Gb3JtYWxQYXJhbWV0ZXIgKSApICggJywnICggKCBydWxlSnZtRm9ybWFsUGFyYW1ldGVyICkgKSApKgorICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjU5NTE6NjogKCAoIHJ1bGVKdm1Gb3JtYWxQYXJhbWV0ZXIgKSApICggJywnICggKCBydWxlSnZtRm9ybWFsUGFyYW1ldGVyICkgKSApKgogICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo1NTEyOjY6ICggKCBydWxlSnZtRm9ybWFsUGFyYW1ldGVyICkgKQotICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjU1MTM6NzogKCBydWxlSnZtRm9ybWFsUGFyYW1ldGVyICkKKyAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo1OTUxOjY6ICggKCBydWxlSnZtRm9ybWFsUGFyYW1ldGVyICkgKQorICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjU5NTI6NzogKCBydWxlSnZtRm9ybWFsUGFyYW1ldGVyICkKICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NTUxMzo3OiAoIHJ1bGVKdm1Gb3JtYWxQYXJhbWV0ZXIgKQotICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjU1MTQ6ODogcnVsZUp2bUZvcm1hbFBhcmFtZXRlcgorICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjU5NTI6NzogKCBydWxlSnZtRm9ybWFsUGFyYW1ldGVyICkKKyAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo1OTUzOjg6IHJ1bGVKdm1Gb3JtYWxQYXJhbWV0ZXIKICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfOTcpOworICAgICAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzExMSk7CiAgICAgICAgICAgICAgICAgcnVsZUp2bUZvcm1hbFBhcmFtZXRlcigpOwogCiAgICAgICAgICAgICAgICAgc3RhdGUuX2ZzcC0tOwpAQCAtMjY5NjAsMjkgKzI4NDk4LDI5IEBACiAKICAgICAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo1NTE3OjY6ICggJywnICggKCBydWxlSnZtRm9ybWFsUGFyYW1ldGVyICkgKSApKgotICAgICAgICAgICAgICAgIGxvb3AxNzA6CisgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NTk1Njo2OiAoICcsJyAoICggcnVsZUp2bUZvcm1hbFBhcmFtZXRlciApICkgKSoKKyAgICAgICAgICAgICAgICBsb29wMTgzOgogICAgICAgICAgICAgICAgIGRvIHsKLSAgICAgICAgICAgICAgICAgICAgaW50IGFsdDE3MD0yOwotICAgICAgICAgICAgICAgICAgICBpbnQgTEExNzBfMCA9IGlucHV0LkxBKDEpOworICAgICAgICAgICAgICAgICAgICBpbnQgYWx0MTgzPTI7CisgICAgICAgICAgICAgICAgICAgIGludCBMQTE4M18wID0gaW5wdXQuTEEoMSk7CiAKLSAgICAgICAgICAgICAgICAgICAgaWYgKCAoTEExNzBfMD09NzUpICkgewotICAgICAgICAgICAgICAgICAgICAgICAgYWx0MTcwPTE7CisgICAgICAgICAgICAgICAgICAgIGlmICggKExBMTgzXzA9PTgyKSApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFsdDE4Mz0xOwogICAgICAgICAgICAgICAgICAgICB9CiAKIAotICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKGFsdDE3MCkgeworICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKGFsdDE4MykgewogICAgICAgICAgICAgICAgIAljYXNlIDEgOgotICAgICAgICAgICAgICAgIAkgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NTUxODo3OiAnLCcgKCAoIHJ1bGVKdm1Gb3JtYWxQYXJhbWV0ZXIgKSApCisgICAgICAgICAgICAgICAgCSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo1OTU3Ojc6ICcsJyAoICggcnVsZUp2bUZvcm1hbFBhcmFtZXRlciApICkKICAgICAgICAgICAgICAgICAJICAgIHsKLSAgICAgICAgICAgICAgICAJICAgIG1hdGNoKGlucHV0LDc1LEZPTExPV183Nyk7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7Ci0gICAgICAgICAgICAgICAgCSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo1NTE5Ojc6ICggKCBydWxlSnZtRm9ybWFsUGFyYW1ldGVyICkgKQotICAgICAgICAgICAgICAgIAkgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NTUyMDo4OiAoIHJ1bGVKdm1Gb3JtYWxQYXJhbWV0ZXIgKQorICAgICAgICAgICAgICAgIAkgICAgbWF0Y2goaW5wdXQsODIsRk9MTE9XXzkxKTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKKyAgICAgICAgICAgICAgICAJICAgIC8vIEludGVybmFsRGF0YURTTC5nOjU5NTg6NzogKCAoIHJ1bGVKdm1Gb3JtYWxQYXJhbWV0ZXIgKSApCisgICAgICAgICAgICAgICAgCSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo1OTU5Ojg6ICggcnVsZUp2bUZvcm1hbFBhcmFtZXRlciApCiAgICAgICAgICAgICAgICAgCSAgICB7Ci0gICAgICAgICAgICAgICAgCSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo1NTIwOjg6ICggcnVsZUp2bUZvcm1hbFBhcmFtZXRlciApCi0gICAgICAgICAgICAgICAgCSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo1NTIxOjk6IHJ1bGVKdm1Gb3JtYWxQYXJhbWV0ZXIKKyAgICAgICAgICAgICAgICAJICAgIC8vIEludGVybmFsRGF0YURTTC5nOjU5NTk6ODogKCBydWxlSnZtRm9ybWFsUGFyYW1ldGVyICkKKyAgICAgICAgICAgICAgICAJICAgIC8vIEludGVybmFsRGF0YURTTC5nOjU5NjA6OTogcnVsZUp2bUZvcm1hbFBhcmFtZXRlcgogICAgICAgICAgICAgICAgIAkgICAgewotICAgICAgICAgICAgICAgIAkgICAgcHVzaEZvbGxvdyhGT0xMT1dfOTcpOworICAgICAgICAgICAgICAgIAkgICAgcHVzaEZvbGxvdyhGT0xMT1dfMTExKTsKICAgICAgICAgICAgICAgICAJICAgIHJ1bGVKdm1Gb3JtYWxQYXJhbWV0ZXIoKTsKIAogICAgICAgICAgICAgICAgIAkgICAgc3RhdGUuX2ZzcC0tOwpAQCAtMjY5OTgsNyArMjg1MzYsNyBAQAogICAgICAgICAgICAgICAgIAkgICAgYnJlYWs7CiAKICAgICAgICAgICAgICAgICAJZGVmYXVsdCA6Ci0gICAgICAgICAgICAgICAgCSAgICBicmVhayBsb29wMTcwOworICAgICAgICAgICAgICAgIAkgICAgYnJlYWsgbG9vcDE4MzsKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIH0gd2hpbGUgKHRydWUpOwogCkBAIC0yNzAwOCwxMyArMjg1NDYsMTMgQEAKIAogICAgICAgICB9CiAKLSAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NTUyNjo1OiAoICggJ3wnICkgKQotICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo1NTI3OjY6ICggJ3wnICkKKyAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NTk2NTo1OiAoICggJ3wnICkgKQorICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo1OTY2OjY6ICggJ3wnICkKICAgICAgICAgewotICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo1NTI3OjY6ICggJ3wnICkKLSAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NTUyODo3OiAnfCcKKyAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NTk2Njo2OiAoICd8JyApCisgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjU5Njc6NzogJ3wnCiAgICAgICAgIHsKLSAgICAgICAgbWF0Y2goaW5wdXQsMTEyLEZPTExPV18yKTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKKyAgICAgICAgbWF0Y2goaW5wdXQsMTE5LEZPTExPV18yKTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKIAogICAgICAgICB9CiAKQEAgLTI3MDMxLDEwICsyODU2OSwxMCBAQAogCiAgICAgLy8gJEFOVExSIHN0YXJ0IHN5bnByZWQzMV9JbnRlcm5hbERhdGFEU0wKICAgICBwdWJsaWMgZmluYWwgdm9pZCBzeW5wcmVkMzFfSW50ZXJuYWxEYXRhRFNMX2ZyYWdtZW50KCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsgICAKLSAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NTkxOTo1OiAoICdlbHNlJyApCi0gICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjU5MTk6NjogJ2Vsc2UnCisgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjYzNTg6NTogKCAnZWxzZScgKQorICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo2MzU4OjY6ICdlbHNlJwogICAgICAgICB7Ci0gICAgICAgIG1hdGNoKGlucHV0LDExNCxGT0xMT1dfMik7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CisgICAgICAgIG1hdGNoKGlucHV0LDEyMSxGT0xMT1dfMik7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CiAKICAgICAgICAgfQogICAgIH0KQEAgLTI3MDQyLDIwICsyODU4MCwyMCBAQAogCiAgICAgLy8gJEFOVExSIHN0YXJ0IHN5bnByZWQzMl9JbnRlcm5hbERhdGFEU0wKICAgICBwdWJsaWMgZmluYWwgdm9pZCBzeW5wcmVkMzJfSW50ZXJuYWxEYXRhRFNMX2ZyYWdtZW50KCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsgICAKLSAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NTk3ODo2OiAoICggJygnICggKCBydWxlSnZtRm9ybWFsUGFyYW1ldGVyICkgKSAnOicgKSApCi0gICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjU5Nzg6NzogKCAnKCcgKCAoIHJ1bGVKdm1Gb3JtYWxQYXJhbWV0ZXIgKSApICc6JyApCisgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjY0MTc6NjogKCAoICcoJyAoICggcnVsZUp2bUZvcm1hbFBhcmFtZXRlciApICkgJzonICkgKQorICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo2NDE3Ojc6ICggJygnICggKCBydWxlSnZtRm9ybWFsUGFyYW1ldGVyICkgKSAnOicgKQogICAgICAgICB7Ci0gICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjU5Nzg6NzogKCAnKCcgKCAoIHJ1bGVKdm1Gb3JtYWxQYXJhbWV0ZXIgKSApICc6JyApCi0gICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjU5Nzk6NzogJygnICggKCBydWxlSnZtRm9ybWFsUGFyYW1ldGVyICkgKSAnOicKKyAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NjQxNzo3OiAoICcoJyAoICggcnVsZUp2bUZvcm1hbFBhcmFtZXRlciApICkgJzonICkKKyAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NjQxODo3OiAnKCcgKCAoIHJ1bGVKdm1Gb3JtYWxQYXJhbWV0ZXIgKSApICc6JwogICAgICAgICB7Ci0gICAgICAgIG1hdGNoKGlucHV0LDc0LEZPTExPV183Nyk7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7Ci0gICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjU5ODA6NzogKCAoIHJ1bGVKdm1Gb3JtYWxQYXJhbWV0ZXIgKSApCi0gICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjU5ODE6ODogKCBydWxlSnZtRm9ybWFsUGFyYW1ldGVyICkKKyAgICAgICAgbWF0Y2goaW5wdXQsODEsRk9MTE9XXzkxKTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKKyAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NjQxOTo3OiAoICggcnVsZUp2bUZvcm1hbFBhcmFtZXRlciApICkKKyAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NjQyMDo4OiAoIHJ1bGVKdm1Gb3JtYWxQYXJhbWV0ZXIgKQogICAgICAgICB7Ci0gICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjU5ODE6ODogKCBydWxlSnZtRm9ybWFsUGFyYW1ldGVyICkKLSAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NTk4Mjo5OiBydWxlSnZtRm9ybWFsUGFyYW1ldGVyCisgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjY0MjA6ODogKCBydWxlSnZtRm9ybWFsUGFyYW1ldGVyICkKKyAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NjQyMTo5OiBydWxlSnZtRm9ybWFsUGFyYW1ldGVyCiAgICAgICAgIHsKLSAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMTA1KTsKKyAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMTE5KTsKICAgICAgICAgcnVsZUp2bUZvcm1hbFBhcmFtZXRlcigpOwogCiAgICAgICAgIHN0YXRlLl9mc3AtLTsKQEAgLTI3MDY2LDcgKzI4NjA0LDcgQEAKIAogICAgICAgICB9CiAKLSAgICAgICAgbWF0Y2goaW5wdXQsMTE2LEZPTExPV18yKTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKKyAgICAgICAgbWF0Y2goaW5wdXQsMTIzLEZPTExPV18yKTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKIAogICAgICAgICB9CiAKQEAgLTI3MDc3LDE5ICsyODYxNSwxOSBAQAogCiAgICAgLy8gJEFOVExSIHN0YXJ0IHN5bnByZWQzM19JbnRlcm5hbERhdGFEU0wKICAgICBwdWJsaWMgZmluYWwgdm9pZCBzeW5wcmVkMzNfSW50ZXJuYWxEYXRhRFNMX2ZyYWdtZW50KCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsgICAKLSAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NjA0NTo2OiAoICggKCAoIHJ1bGVKdm1Gb3JtYWxQYXJhbWV0ZXIgKSApICc6JyApICkKLSAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NjA0NTo3OiAoICggKCBydWxlSnZtRm9ybWFsUGFyYW1ldGVyICkgKSAnOicgKQorICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo2NDg0OjY6ICggKCAoICggcnVsZUp2bUZvcm1hbFBhcmFtZXRlciApICkgJzonICkgKQorICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo2NDg0Ojc6ICggKCAoIHJ1bGVKdm1Gb3JtYWxQYXJhbWV0ZXIgKSApICc6JyApCiAgICAgICAgIHsKLSAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NjA0NTo3OiAoICggKCBydWxlSnZtRm9ybWFsUGFyYW1ldGVyICkgKSAnOicgKQotICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo2MDQ2Ojc6ICggKCBydWxlSnZtRm9ybWFsUGFyYW1ldGVyICkgKSAnOicKKyAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NjQ4NDo3OiAoICggKCBydWxlSnZtRm9ybWFsUGFyYW1ldGVyICkgKSAnOicgKQorICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo2NDg1Ojc6ICggKCBydWxlSnZtRm9ybWFsUGFyYW1ldGVyICkgKSAnOicKICAgICAgICAgewotICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo2MDQ2Ojc6ICggKCBydWxlSnZtRm9ybWFsUGFyYW1ldGVyICkgKQotICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo2MDQ3Ojg6ICggcnVsZUp2bUZvcm1hbFBhcmFtZXRlciApCisgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjY0ODU6NzogKCAoIHJ1bGVKdm1Gb3JtYWxQYXJhbWV0ZXIgKSApCisgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjY0ODY6ODogKCBydWxlSnZtRm9ybWFsUGFyYW1ldGVyICkKICAgICAgICAgewotICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo2MDQ3Ojg6ICggcnVsZUp2bUZvcm1hbFBhcmFtZXRlciApCi0gICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjYwNDg6OTogcnVsZUp2bUZvcm1hbFBhcmFtZXRlcgorICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo2NDg2Ojg6ICggcnVsZUp2bUZvcm1hbFBhcmFtZXRlciApCisgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjY0ODc6OTogcnVsZUp2bUZvcm1hbFBhcmFtZXRlcgogICAgICAgICB7Ci0gICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzEwNSk7CisgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzExOSk7CiAgICAgICAgIHJ1bGVKdm1Gb3JtYWxQYXJhbWV0ZXIoKTsKIAogICAgICAgICBzdGF0ZS5fZnNwLS07CkBAIC0yNzEwMCw3ICsyODYzOCw3IEBACiAKICAgICAgICAgfQogCi0gICAgICAgIG1hdGNoKGlucHV0LDExNixGT0xMT1dfMik7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CisgICAgICAgIG1hdGNoKGlucHV0LDEyMyxGT0xMT1dfMik7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CiAKICAgICAgICAgfQogCkBAIC0yNzExMSwxNyArMjg2NDksMTcgQEAKIAogICAgIC8vICRBTlRMUiBzdGFydCBzeW5wcmVkMzVfSW50ZXJuYWxEYXRhRFNMCiAgICAgcHVibGljIGZpbmFsIHZvaWQgc3lucHJlZDM1X0ludGVybmFsRGF0YURTTF9mcmFnbWVudCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7ICAgCi0gICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjY4NjM6NTogKCAoICggKCBydWxlSnZtVHlwZVJlZmVyZW5jZSApICkgKCAoIHJ1bGVWYWxpZElEICkgKSApICkKLSAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6Njg2Mzo2OiAoICggKCBydWxlSnZtVHlwZVJlZmVyZW5jZSApICkgKCAoIHJ1bGVWYWxpZElEICkgKSApCisgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjczMDI6NTogKCAoICggKCBydWxlSnZtVHlwZVJlZmVyZW5jZSApICkgKCAoIHJ1bGVWYWxpZElEICkgKSApICkKKyAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NzMwMjo2OiAoICggKCBydWxlSnZtVHlwZVJlZmVyZW5jZSApICkgKCAoIHJ1bGVWYWxpZElEICkgKSApCiAgICAgICAgIHsKLSAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6Njg2Mzo2OiAoICggKCBydWxlSnZtVHlwZVJlZmVyZW5jZSApICkgKCAoIHJ1bGVWYWxpZElEICkgKSApCi0gICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjY4NjQ6NjogKCAoIHJ1bGVKdm1UeXBlUmVmZXJlbmNlICkgKSAoICggcnVsZVZhbGlkSUQgKSApCisgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjczMDI6NjogKCAoICggcnVsZUp2bVR5cGVSZWZlcmVuY2UgKSApICggKCBydWxlVmFsaWRJRCApICkgKQorICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo3MzAzOjY6ICggKCBydWxlSnZtVHlwZVJlZmVyZW5jZSApICkgKCAoIHJ1bGVWYWxpZElEICkgKQogICAgICAgICB7Ci0gICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjY4NjQ6NjogKCAoIHJ1bGVKdm1UeXBlUmVmZXJlbmNlICkgKQotICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo2ODY1Ojc6ICggcnVsZUp2bVR5cGVSZWZlcmVuY2UgKQorICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo3MzAzOjY6ICggKCBydWxlSnZtVHlwZVJlZmVyZW5jZSApICkKKyAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NzMwNDo3OiAoIHJ1bGVKdm1UeXBlUmVmZXJlbmNlICkKICAgICAgICAgewotICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo2ODY1Ojc6ICggcnVsZUp2bVR5cGVSZWZlcmVuY2UgKQotICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo2ODY2Ojg6IHJ1bGVKdm1UeXBlUmVmZXJlbmNlCisgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjczMDQ6NzogKCBydWxlSnZtVHlwZVJlZmVyZW5jZSApCisgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjczMDU6ODogcnVsZUp2bVR5cGVSZWZlcmVuY2UKICAgICAgICAgewogICAgICAgICBwdXNoRm9sbG93KEZPTExPV180KTsKICAgICAgICAgcnVsZUp2bVR5cGVSZWZlcmVuY2UoKTsKQEAgLTI3MTM0LDExICsyODY3MiwxMSBAQAogCiAgICAgICAgIH0KIAotICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo2ODY5OjY6ICggKCBydWxlVmFsaWRJRCApICkKLSAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6Njg3MDo3OiAoIHJ1bGVWYWxpZElEICkKKyAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NzMwODo2OiAoICggcnVsZVZhbGlkSUQgKSApCisgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjczMDk6NzogKCBydWxlVmFsaWRJRCApCiAgICAgICAgIHsKLSAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6Njg3MDo3OiAoIHJ1bGVWYWxpZElEICkKLSAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6Njg3MTo4OiBydWxlVmFsaWRJRAorICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo3MzA5Ojc6ICggcnVsZVZhbGlkSUQgKQorICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo3MzEwOjg6IHJ1bGVWYWxpZElECiAgICAgICAgIHsKICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMik7CiAgICAgICAgIHJ1bGVWYWxpZElEKCk7CkBAIC0yNzE2MSwxMyArMjg2OTksMTMgQEAKIAogICAgIC8vICRBTlRMUiBzdGFydCBzeW5wcmVkMzZfSW50ZXJuYWxEYXRhRFNMCiAgICAgcHVibGljIGZpbmFsIHZvaWQgc3lucHJlZDM2X0ludGVybmFsRGF0YURTTF9mcmFnbWVudCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7ICAgCi0gICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjcxNzU6NTogKCAoICcoJyApICkKLSAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NzE3NTo2OiAoICcoJyApCisgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjc2MTQ6NTogKCAoICcoJyApICkKKyAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NzYxNDo2OiAoICcoJyApCiAgICAgICAgIHsKLSAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NzE3NTo2OiAoICcoJyApCi0gICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjcxNzY6NjogJygnCisgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjc2MTQ6NjogKCAnKCcgKQorICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo3NjE1OjY6ICcoJwogICAgICAgICB7Ci0gICAgICAgIG1hdGNoKGlucHV0LDc0LEZPTExPV18yKTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKKyAgICAgICAgbWF0Y2goaW5wdXQsODEsRk9MTE9XXzIpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOwogCiAgICAgICAgIH0KIApAQCAtMjcxNzgsMzUgKzI4NzE2LDM1IEBACiAKICAgICAvLyAkQU5UTFIgc3RhcnQgc3lucHJlZDM3X0ludGVybmFsRGF0YURTTAogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHN5bnByZWQzN19JbnRlcm5hbERhdGFEU0xfZnJhZ21lbnQoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geyAgIAotICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo3MTk0OjY6ICggKCAoKSAoICggKCBydWxlSnZtRm9ybWFsUGFyYW1ldGVyICkgKSAoICcsJyAoICggcnVsZUp2bUZvcm1hbFBhcmFtZXRlciApICkgKSogKT8gKCAoICd8JyApICkgKSApCi0gICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjcxOTQ6NzogKCAoKSAoICggKCBydWxlSnZtRm9ybWFsUGFyYW1ldGVyICkgKSAoICcsJyAoICggcnVsZUp2bUZvcm1hbFBhcmFtZXRlciApICkgKSogKT8gKCAoICd8JyApICkgKQorICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo3NjMzOjY6ICggKCAoKSAoICggKCBydWxlSnZtRm9ybWFsUGFyYW1ldGVyICkgKSAoICcsJyAoICggcnVsZUp2bUZvcm1hbFBhcmFtZXRlciApICkgKSogKT8gKCAoICd8JyApICkgKSApCisgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjc2MzM6NzogKCAoKSAoICggKCBydWxlSnZtRm9ybWFsUGFyYW1ldGVyICkgKSAoICcsJyAoICggcnVsZUp2bUZvcm1hbFBhcmFtZXRlciApICkgKSogKT8gKCAoICd8JyApICkgKQogICAgICAgICB7Ci0gICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjcxOTQ6NzogKCAoKSAoICggKCBydWxlSnZtRm9ybWFsUGFyYW1ldGVyICkgKSAoICcsJyAoICggcnVsZUp2bUZvcm1hbFBhcmFtZXRlciApICkgKSogKT8gKCAoICd8JyApICkgKQotICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo3MTk1Ojc6ICgpICggKCAoIHJ1bGVKdm1Gb3JtYWxQYXJhbWV0ZXIgKSApICggJywnICggKCBydWxlSnZtRm9ybWFsUGFyYW1ldGVyICkgKSApKiApPyAoICggJ3wnICkgKQorICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo3NjMzOjc6ICggKCkgKCAoICggcnVsZUp2bUZvcm1hbFBhcmFtZXRlciApICkgKCAnLCcgKCAoIHJ1bGVKdm1Gb3JtYWxQYXJhbWV0ZXIgKSApICkqICk/ICggKCAnfCcgKSApICkKKyAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NzYzNDo3OiAoKSAoICggKCBydWxlSnZtRm9ybWFsUGFyYW1ldGVyICkgKSAoICcsJyAoICggcnVsZUp2bUZvcm1hbFBhcmFtZXRlciApICkgKSogKT8gKCAoICd8JyApICkKICAgICAgICAgewotICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo3MTk1Ojc6ICgpCi0gICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjcxOTY6NzogCisgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjc2MzQ6NzogKCkKKyAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NzYzNTo3OiAKICAgICAgICAgewogICAgICAgICB9CiAKLSAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NzE5Nzo3OiAoICggKCBydWxlSnZtRm9ybWFsUGFyYW1ldGVyICkgKSAoICcsJyAoICggcnVsZUp2bUZvcm1hbFBhcmFtZXRlciApICkgKSogKT8KLSAgICAgICAgaW50IGFsdDE3NT0yOwotICAgICAgICBpbnQgTEExNzVfMCA9IGlucHV0LkxBKDEpOworICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo3NjM2Ojc6ICggKCAoIHJ1bGVKdm1Gb3JtYWxQYXJhbWV0ZXIgKSApICggJywnICggKCBydWxlSnZtRm9ybWFsUGFyYW1ldGVyICkgKSApKiApPworICAgICAgICBpbnQgYWx0MTg4PTI7CisgICAgICAgIGludCBMQTE4OF8wID0gaW5wdXQuTEEoMSk7CiAKLSAgICAgICAgaWYgKCAoTEExNzVfMD09UlVMRV9JRHx8TEExNzVfMD09NzR8fExBMTc1XzA9PTk5KSApIHsKLSAgICAgICAgICAgIGFsdDE3NT0xOworICAgICAgICBpZiAoIChMQTE4OF8wPT1SVUxFX0lEfHxMQTE4OF8wPT04MXx8TEExODhfMD09MTA2KSApIHsKKyAgICAgICAgICAgIGFsdDE4OD0xOwogICAgICAgICB9Ci0gICAgICAgIHN3aXRjaCAoYWx0MTc1KSB7CisgICAgICAgIHN3aXRjaCAoYWx0MTg4KSB7CiAgICAgICAgICAgICBjYXNlIDEgOgotICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjcxOTg6ODogKCAoIHJ1bGVKdm1Gb3JtYWxQYXJhbWV0ZXIgKSApICggJywnICggKCBydWxlSnZtRm9ybWFsUGFyYW1ldGVyICkgKSApKgorICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjc2Mzc6ODogKCAoIHJ1bGVKdm1Gb3JtYWxQYXJhbWV0ZXIgKSApICggJywnICggKCBydWxlSnZtRm9ybWFsUGFyYW1ldGVyICkgKSApKgogICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo3MTk4Ojg6ICggKCBydWxlSnZtRm9ybWFsUGFyYW1ldGVyICkgKQotICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjcxOTk6OTogKCBydWxlSnZtRm9ybWFsUGFyYW1ldGVyICkKKyAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo3NjM3Ojg6ICggKCBydWxlSnZtRm9ybWFsUGFyYW1ldGVyICkgKQorICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjc2Mzg6OTogKCBydWxlSnZtRm9ybWFsUGFyYW1ldGVyICkKICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NzE5OTo5OiAoIHJ1bGVKdm1Gb3JtYWxQYXJhbWV0ZXIgKQotICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjcyMDA6MTA6IHJ1bGVKdm1Gb3JtYWxQYXJhbWV0ZXIKKyAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo3NjM4Ojk6ICggcnVsZUp2bUZvcm1hbFBhcmFtZXRlciApCisgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NzYzOToxMDogcnVsZUp2bUZvcm1hbFBhcmFtZXRlcgogICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV185Nyk7CisgICAgICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMTExKTsKICAgICAgICAgICAgICAgICBydWxlSnZtRm9ybWFsUGFyYW1ldGVyKCk7CiAKICAgICAgICAgICAgICAgICBzdGF0ZS5fZnNwLS07CkBAIC0yNzIxNywyOSArMjg3NTUsMjkgQEAKIAogICAgICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjcyMDM6ODogKCAnLCcgKCAoIHJ1bGVKdm1Gb3JtYWxQYXJhbWV0ZXIgKSApICkqCi0gICAgICAgICAgICAgICAgbG9vcDE3NDoKKyAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo3NjQyOjg6ICggJywnICggKCBydWxlSnZtRm9ybWFsUGFyYW1ldGVyICkgKSApKgorICAgICAgICAgICAgICAgIGxvb3AxODc6CiAgICAgICAgICAgICAgICAgZG8gewotICAgICAgICAgICAgICAgICAgICBpbnQgYWx0MTc0PTI7Ci0gICAgICAgICAgICAgICAgICAgIGludCBMQTE3NF8wID0gaW5wdXQuTEEoMSk7CisgICAgICAgICAgICAgICAgICAgIGludCBhbHQxODc9MjsKKyAgICAgICAgICAgICAgICAgICAgaW50IExBMTg3XzAgPSBpbnB1dC5MQSgxKTsKIAotICAgICAgICAgICAgICAgICAgICBpZiAoIChMQTE3NF8wPT03NSkgKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBhbHQxNzQ9MTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCAoTEExODdfMD09ODIpICkgeworICAgICAgICAgICAgICAgICAgICAgICAgYWx0MTg3PTE7CiAgICAgICAgICAgICAgICAgICAgIH0KIAogCi0gICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoYWx0MTc0KSB7CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoYWx0MTg3KSB7CiAgICAgICAgICAgICAgICAgCWNhc2UgMSA6Ci0gICAgICAgICAgICAgICAgCSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo3MjA0Ojk6ICcsJyAoICggcnVsZUp2bUZvcm1hbFBhcmFtZXRlciApICkKKyAgICAgICAgICAgICAgICAJICAgIC8vIEludGVybmFsRGF0YURTTC5nOjc2NDM6OTogJywnICggKCBydWxlSnZtRm9ybWFsUGFyYW1ldGVyICkgKQogICAgICAgICAgICAgICAgIAkgICAgewotICAgICAgICAgICAgICAgIAkgICAgbWF0Y2goaW5wdXQsNzUsRk9MTE9XXzc3KTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKLSAgICAgICAgICAgICAgICAJICAgIC8vIEludGVybmFsRGF0YURTTC5nOjcyMDU6OTogKCAoIHJ1bGVKdm1Gb3JtYWxQYXJhbWV0ZXIgKSApCi0gICAgICAgICAgICAgICAgCSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo3MjA2OjEwOiAoIHJ1bGVKdm1Gb3JtYWxQYXJhbWV0ZXIgKQorICAgICAgICAgICAgICAgIAkgICAgbWF0Y2goaW5wdXQsODIsRk9MTE9XXzkxKTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKKyAgICAgICAgICAgICAgICAJICAgIC8vIEludGVybmFsRGF0YURTTC5nOjc2NDQ6OTogKCAoIHJ1bGVKdm1Gb3JtYWxQYXJhbWV0ZXIgKSApCisgICAgICAgICAgICAgICAgCSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo3NjQ1OjEwOiAoIHJ1bGVKdm1Gb3JtYWxQYXJhbWV0ZXIgKQogICAgICAgICAgICAgICAgIAkgICAgewotICAgICAgICAgICAgICAgIAkgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NzIwNjoxMDogKCBydWxlSnZtRm9ybWFsUGFyYW1ldGVyICkKLSAgICAgICAgICAgICAgICAJICAgIC8vIEludGVybmFsRGF0YURTTC5nOjcyMDc6MTE6IHJ1bGVKdm1Gb3JtYWxQYXJhbWV0ZXIKKyAgICAgICAgICAgICAgICAJICAgIC8vIEludGVybmFsRGF0YURTTC5nOjc2NDU6MTA6ICggcnVsZUp2bUZvcm1hbFBhcmFtZXRlciApCisgICAgICAgICAgICAgICAgCSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo3NjQ2OjExOiBydWxlSnZtRm9ybWFsUGFyYW1ldGVyCiAgICAgICAgICAgICAgICAgCSAgICB7Ci0gICAgICAgICAgICAgICAgCSAgICBwdXNoRm9sbG93KEZPTExPV185Nyk7CisgICAgICAgICAgICAgICAgCSAgICBwdXNoRm9sbG93KEZPTExPV18xMTEpOwogICAgICAgICAgICAgICAgIAkgICAgcnVsZUp2bUZvcm1hbFBhcmFtZXRlcigpOwogCiAgICAgICAgICAgICAgICAgCSAgICBzdGF0ZS5fZnNwLS07CkBAIC0yNzI1NSw3ICsyODc5Myw3IEBACiAgICAgICAgICAgICAgICAgCSAgICBicmVhazsKIAogICAgICAgICAgICAgICAgIAlkZWZhdWx0IDoKLSAgICAgICAgICAgICAgICAJICAgIGJyZWFrIGxvb3AxNzQ7CisgICAgICAgICAgICAgICAgCSAgICBicmVhayBsb29wMTg3OwogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfSB3aGlsZSAodHJ1ZSk7CiAKQEAgLTI3MjY1LDEzICsyODgwMywxMyBAQAogCiAgICAgICAgIH0KIAotICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo3MjEyOjc6ICggKCAnfCcgKSApCi0gICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjcyMTM6ODogKCAnfCcgKQorICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo3NjUxOjc6ICggKCAnfCcgKSApCisgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjc2NTI6ODogKCAnfCcgKQogICAgICAgICB7Ci0gICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjcyMTM6ODogKCAnfCcgKQotICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo3MjE0Ojk6ICd8JworICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo3NjUyOjg6ICggJ3wnICkKKyAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NzY1Mzo5OiAnfCcKICAgICAgICAgewotICAgICAgICBtYXRjaChpbnB1dCwxMTIsRk9MTE9XXzIpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOworICAgICAgICBtYXRjaChpbnB1dCwxMTksRk9MTE9XXzIpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOwogCiAgICAgICAgIH0KIApAQCAtMjcyODgsMTggKzI4ODI2LDE4IEBACiAKICAgICAvLyAkQU5UTFIgc3RhcnQgc3lucHJlZDM4X0ludGVybmFsRGF0YURTTAogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHN5bnByZWQzOF9JbnRlcm5hbERhdGFEU0xfZnJhZ21lbnQoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geyAgIAotICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo3MjkxOjQ6ICggKCAoKSAnWycgKSApCi0gICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjcyOTE6NTogKCAoKSAnWycgKQorICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo3NzMwOjQ6ICggKCAoKSAnWycgKSApCisgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjc3MzA6NTogKCAoKSAnWycgKQogICAgICAgICB7Ci0gICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjcyOTE6NTogKCAoKSAnWycgKQotICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo3MjkyOjU6ICgpICdbJworICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo3NzMwOjU6ICggKCkgJ1snICkKKyAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NzczMTo1OiAoKSAnWycKICAgICAgICAgewotICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo3MjkyOjU6ICgpCi0gICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjcyOTM6NTogCisgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjc3MzE6NTogKCkKKyAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NzczMjo1OiAKICAgICAgICAgewogICAgICAgICB9CiAKLSAgICAgICAgbWF0Y2goaW5wdXQsNzksRk9MTE9XXzIpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOworICAgICAgICBtYXRjaChpbnB1dCw4NixGT0xMT1dfMik7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CiAKICAgICAgICAgfQogCkBAIC0yNzMxMCwxMCArMjg4NDgsMTAgQEAKIAogICAgIC8vICRBTlRMUiBzdGFydCBzeW5wcmVkMzlfSW50ZXJuYWxEYXRhRFNMCiAgICAgcHVibGljIGZpbmFsIHZvaWQgc3lucHJlZDM5X0ludGVybmFsRGF0YURTTF9mcmFnbWVudCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7ICAgCi0gICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjc0NTE6NTogKCAnPCcgKQotICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo3NDUxOjY6ICc8JworICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo3ODkwOjU6ICggJzwnICkKKyAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6Nzg5MDo2OiAnPCcKICAgICAgICAgewotICAgICAgICBtYXRjaChpbnB1dCw4NixGT0xMT1dfMik7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CisgICAgICAgIG1hdGNoKGlucHV0LDkzLEZPTExPV18yKTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKIAogICAgICAgICB9CiAgICAgfQpAQCAtMjczMjEsMTMgKzI4ODU5LDEzIEBACiAKICAgICAvLyAkQU5UTFIgc3RhcnQgc3lucHJlZDQwX0ludGVybmFsRGF0YURTTAogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHN5bnByZWQ0MF9JbnRlcm5hbERhdGFEU0xfZnJhZ21lbnQoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geyAgIAotICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo3NTA4OjU6ICggKCAnKCcgKSApCi0gICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjc1MDg6NjogKCAnKCcgKQorICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo3OTQ3OjU6ICggKCAnKCcgKSApCisgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjc5NDc6NjogKCAnKCcgKQogICAgICAgICB7Ci0gICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjc1MDg6NjogKCAnKCcgKQotICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo3NTA5OjY6ICcoJworICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo3OTQ3OjY6ICggJygnICkKKyAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6Nzk0ODo2OiAnKCcKICAgICAgICAgewotICAgICAgICBtYXRjaChpbnB1dCw3NCxGT0xMT1dfMik7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CisgICAgICAgIG1hdGNoKGlucHV0LDgxLEZPTExPV18yKTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKIAogICAgICAgICB9CiAKQEAgLTI3MzM4LDM1ICsyODg3NiwzNSBAQAogCiAgICAgLy8gJEFOVExSIHN0YXJ0IHN5bnByZWQ0MV9JbnRlcm5hbERhdGFEU0wKICAgICBwdWJsaWMgZmluYWwgdm9pZCBzeW5wcmVkNDFfSW50ZXJuYWxEYXRhRFNMX2ZyYWdtZW50KCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsgICAKLSAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NzUyNzo2OiAoICggKCkgKCAoICggcnVsZUp2bUZvcm1hbFBhcmFtZXRlciApICkgKCAnLCcgKCAoIHJ1bGVKdm1Gb3JtYWxQYXJhbWV0ZXIgKSApICkqICk/ICggKCAnfCcgKSApICkgKQotICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo3NTI3Ojc6ICggKCkgKCAoICggcnVsZUp2bUZvcm1hbFBhcmFtZXRlciApICkgKCAnLCcgKCAoIHJ1bGVKdm1Gb3JtYWxQYXJhbWV0ZXIgKSApICkqICk/ICggKCAnfCcgKSApICkKKyAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6Nzk2Njo2OiAoICggKCkgKCAoICggcnVsZUp2bUZvcm1hbFBhcmFtZXRlciApICkgKCAnLCcgKCAoIHJ1bGVKdm1Gb3JtYWxQYXJhbWV0ZXIgKSApICkqICk/ICggKCAnfCcgKSApICkgKQorICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo3OTY2Ojc6ICggKCkgKCAoICggcnVsZUp2bUZvcm1hbFBhcmFtZXRlciApICkgKCAnLCcgKCAoIHJ1bGVKdm1Gb3JtYWxQYXJhbWV0ZXIgKSApICkqICk/ICggKCAnfCcgKSApICkKICAgICAgICAgewotICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo3NTI3Ojc6ICggKCkgKCAoICggcnVsZUp2bUZvcm1hbFBhcmFtZXRlciApICkgKCAnLCcgKCAoIHJ1bGVKdm1Gb3JtYWxQYXJhbWV0ZXIgKSApICkqICk/ICggKCAnfCcgKSApICkKLSAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NzUyODo3OiAoKSAoICggKCBydWxlSnZtRm9ybWFsUGFyYW1ldGVyICkgKSAoICcsJyAoICggcnVsZUp2bUZvcm1hbFBhcmFtZXRlciApICkgKSogKT8gKCAoICd8JyApICkKKyAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6Nzk2Njo3OiAoICgpICggKCAoIHJ1bGVKdm1Gb3JtYWxQYXJhbWV0ZXIgKSApICggJywnICggKCBydWxlSnZtRm9ybWFsUGFyYW1ldGVyICkgKSApKiApPyAoICggJ3wnICkgKSApCisgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjc5Njc6NzogKCkgKCAoICggcnVsZUp2bUZvcm1hbFBhcmFtZXRlciApICkgKCAnLCcgKCAoIHJ1bGVKdm1Gb3JtYWxQYXJhbWV0ZXIgKSApICkqICk/ICggKCAnfCcgKSApCiAgICAgICAgIHsKLSAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NzUyODo3OiAoKQotICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo3NTI5Ojc6IAorICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo3OTY3Ojc6ICgpCisgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjc5Njg6NzogCiAgICAgICAgIHsKICAgICAgICAgfQogCi0gICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjc1MzA6NzogKCAoICggcnVsZUp2bUZvcm1hbFBhcmFtZXRlciApICkgKCAnLCcgKCAoIHJ1bGVKdm1Gb3JtYWxQYXJhbWV0ZXIgKSApICkqICk/Ci0gICAgICAgIGludCBhbHQxNzc9MjsKLSAgICAgICAgaW50IExBMTc3XzAgPSBpbnB1dC5MQSgxKTsKKyAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6Nzk2OTo3OiAoICggKCBydWxlSnZtRm9ybWFsUGFyYW1ldGVyICkgKSAoICcsJyAoICggcnVsZUp2bUZvcm1hbFBhcmFtZXRlciApICkgKSogKT8KKyAgICAgICAgaW50IGFsdDE5MD0yOworICAgICAgICBpbnQgTEExOTBfMCA9IGlucHV0LkxBKDEpOwogCi0gICAgICAgIGlmICggKExBMTc3XzA9PVJVTEVfSUR8fExBMTc3XzA9PTc0fHxMQTE3N18wPT05OSkgKSB7Ci0gICAgICAgICAgICBhbHQxNzc9MTsKKyAgICAgICAgaWYgKCAoTEExOTBfMD09UlVMRV9JRHx8TEExOTBfMD09ODF8fExBMTkwXzA9PTEwNikgKSB7CisgICAgICAgICAgICBhbHQxOTA9MTsKICAgICAgICAgfQotICAgICAgICBzd2l0Y2ggKGFsdDE3NykgeworICAgICAgICBzd2l0Y2ggKGFsdDE5MCkgewogICAgICAgICAgICAgY2FzZSAxIDoKLSAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo3NTMxOjg6ICggKCBydWxlSnZtRm9ybWFsUGFyYW1ldGVyICkgKSAoICcsJyAoICggcnVsZUp2bUZvcm1hbFBhcmFtZXRlciApICkgKSoKKyAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo3OTcwOjg6ICggKCBydWxlSnZtRm9ybWFsUGFyYW1ldGVyICkgKSAoICcsJyAoICggcnVsZUp2bUZvcm1hbFBhcmFtZXRlciApICkgKSoKICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NzUzMTo4OiAoICggcnVsZUp2bUZvcm1hbFBhcmFtZXRlciApICkKLSAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo3NTMyOjk6ICggcnVsZUp2bUZvcm1hbFBhcmFtZXRlciApCisgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6Nzk3MDo4OiAoICggcnVsZUp2bUZvcm1hbFBhcmFtZXRlciApICkKKyAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo3OTcxOjk6ICggcnVsZUp2bUZvcm1hbFBhcmFtZXRlciApCiAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjc1MzI6OTogKCBydWxlSnZtRm9ybWFsUGFyYW1ldGVyICkKLSAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo3NTMzOjEwOiBydWxlSnZtRm9ybWFsUGFyYW1ldGVyCisgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6Nzk3MTo5OiAoIHJ1bGVKdm1Gb3JtYWxQYXJhbWV0ZXIgKQorICAgICAgICAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjc5NzI6MTA6IHJ1bGVKdm1Gb3JtYWxQYXJhbWV0ZXIKICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfOTcpOworICAgICAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzExMSk7CiAgICAgICAgICAgICAgICAgcnVsZUp2bUZvcm1hbFBhcmFtZXRlcigpOwogCiAgICAgICAgICAgICAgICAgc3RhdGUuX2ZzcC0tOwpAQCAtMjczNzcsMjkgKzI4OTE1LDI5IEBACiAKICAgICAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo3NTM2Ojg6ICggJywnICggKCBydWxlSnZtRm9ybWFsUGFyYW1ldGVyICkgKSApKgotICAgICAgICAgICAgICAgIGxvb3AxNzY6CisgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6Nzk3NTo4OiAoICcsJyAoICggcnVsZUp2bUZvcm1hbFBhcmFtZXRlciApICkgKSoKKyAgICAgICAgICAgICAgICBsb29wMTg5OgogICAgICAgICAgICAgICAgIGRvIHsKLSAgICAgICAgICAgICAgICAgICAgaW50IGFsdDE3Nj0yOwotICAgICAgICAgICAgICAgICAgICBpbnQgTEExNzZfMCA9IGlucHV0LkxBKDEpOworICAgICAgICAgICAgICAgICAgICBpbnQgYWx0MTg5PTI7CisgICAgICAgICAgICAgICAgICAgIGludCBMQTE4OV8wID0gaW5wdXQuTEEoMSk7CiAKLSAgICAgICAgICAgICAgICAgICAgaWYgKCAoTEExNzZfMD09NzUpICkgewotICAgICAgICAgICAgICAgICAgICAgICAgYWx0MTc2PTE7CisgICAgICAgICAgICAgICAgICAgIGlmICggKExBMTg5XzA9PTgyKSApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFsdDE4OT0xOwogICAgICAgICAgICAgICAgICAgICB9CiAKIAotICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKGFsdDE3NikgeworICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKGFsdDE4OSkgewogICAgICAgICAgICAgICAgIAljYXNlIDEgOgotICAgICAgICAgICAgICAgIAkgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NzUzNzo5OiAnLCcgKCAoIHJ1bGVKdm1Gb3JtYWxQYXJhbWV0ZXIgKSApCisgICAgICAgICAgICAgICAgCSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo3OTc2Ojk6ICcsJyAoICggcnVsZUp2bUZvcm1hbFBhcmFtZXRlciApICkKICAgICAgICAgICAgICAgICAJICAgIHsKLSAgICAgICAgICAgICAgICAJICAgIG1hdGNoKGlucHV0LDc1LEZPTExPV183Nyk7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7Ci0gICAgICAgICAgICAgICAgCSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo3NTM4Ojk6ICggKCBydWxlSnZtRm9ybWFsUGFyYW1ldGVyICkgKQotICAgICAgICAgICAgICAgIAkgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NzUzOToxMDogKCBydWxlSnZtRm9ybWFsUGFyYW1ldGVyICkKKyAgICAgICAgICAgICAgICAJICAgIG1hdGNoKGlucHV0LDgyLEZPTExPV185MSk7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CisgICAgICAgICAgICAgICAgCSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo3OTc3Ojk6ICggKCBydWxlSnZtRm9ybWFsUGFyYW1ldGVyICkgKQorICAgICAgICAgICAgICAgIAkgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6Nzk3ODoxMDogKCBydWxlSnZtRm9ybWFsUGFyYW1ldGVyICkKICAgICAgICAgICAgICAgICAJICAgIHsKLSAgICAgICAgICAgICAgICAJICAgIC8vIEludGVybmFsRGF0YURTTC5nOjc1Mzk6MTA6ICggcnVsZUp2bUZvcm1hbFBhcmFtZXRlciApCi0gICAgICAgICAgICAgICAgCSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo3NTQwOjExOiBydWxlSnZtRm9ybWFsUGFyYW1ldGVyCisgICAgICAgICAgICAgICAgCSAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo3OTc4OjEwOiAoIHJ1bGVKdm1Gb3JtYWxQYXJhbWV0ZXIgKQorICAgICAgICAgICAgICAgIAkgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6Nzk3OToxMTogcnVsZUp2bUZvcm1hbFBhcmFtZXRlcgogICAgICAgICAgICAgICAgIAkgICAgewotICAgICAgICAgICAgICAgIAkgICAgcHVzaEZvbGxvdyhGT0xMT1dfOTcpOworICAgICAgICAgICAgICAgIAkgICAgcHVzaEZvbGxvdyhGT0xMT1dfMTExKTsKICAgICAgICAgICAgICAgICAJICAgIHJ1bGVKdm1Gb3JtYWxQYXJhbWV0ZXIoKTsKIAogICAgICAgICAgICAgICAgIAkgICAgc3RhdGUuX2ZzcC0tOwpAQCAtMjc0MTUsNyArMjg5NTMsNyBAQAogICAgICAgICAgICAgICAgIAkgICAgYnJlYWs7CiAKICAgICAgICAgICAgICAgICAJZGVmYXVsdCA6Ci0gICAgICAgICAgICAgICAgCSAgICBicmVhayBsb29wMTc2OworICAgICAgICAgICAgICAgIAkgICAgYnJlYWsgbG9vcDE4OTsKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIH0gd2hpbGUgKHRydWUpOwogCkBAIC0yNzQyNSwxMyArMjg5NjMsMTMgQEAKIAogICAgICAgICB9CiAKLSAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NzU0NTo3OiAoICggJ3wnICkgKQotICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo3NTQ2Ojg6ICggJ3wnICkKKyAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6Nzk4NDo3OiAoICggJ3wnICkgKQorICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo3OTg1Ojg6ICggJ3wnICkKICAgICAgICAgewotICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo3NTQ2Ojg6ICggJ3wnICkKLSAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NzU0Nzo5OiAnfCcKKyAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6Nzk4NTo4OiAoICd8JyApCisgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjc5ODY6OTogJ3wnCiAgICAgICAgIHsKLSAgICAgICAgbWF0Y2goaW5wdXQsMTEyLEZPTExPV18yKTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKKyAgICAgICAgbWF0Y2goaW5wdXQsMTE5LEZPTExPV18yKTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKIAogICAgICAgICB9CiAKQEAgLTI3NDQ4LDE4ICsyODk4NiwxOCBAQAogCiAgICAgLy8gJEFOVExSIHN0YXJ0IHN5bnByZWQ0Ml9JbnRlcm5hbERhdGFEU0wKICAgICBwdWJsaWMgZmluYWwgdm9pZCBzeW5wcmVkNDJfSW50ZXJuYWxEYXRhRFNMX2ZyYWdtZW50KCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsgICAKLSAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NzYyNDo0OiAoICggKCkgJ1snICkgKQotICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo3NjI0OjU6ICggKCkgJ1snICkKKyAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6ODA2Mzo0OiAoICggKCkgJ1snICkgKQorICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo4MDYzOjU6ICggKCkgJ1snICkKICAgICAgICAgewotICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo3NjI0OjU6ICggKCkgJ1snICkKLSAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NzYyNTo1OiAoKSAnWycKKyAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6ODA2Mzo1OiAoICgpICdbJyApCisgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjgwNjQ6NTogKCkgJ1snCiAgICAgICAgIHsKLSAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6NzYyNTo1OiAoKQotICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo3NjI2OjU6IAorICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo4MDY0OjU6ICgpCisgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjgwNjU6NTogCiAgICAgICAgIHsKICAgICAgICAgfQogCi0gICAgICAgIG1hdGNoKGlucHV0LDc5LEZPTExPV18yKTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKKyAgICAgICAgbWF0Y2goaW5wdXQsODYsRk9MTE9XXzIpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOwogCiAgICAgICAgIH0KIApAQCAtMjc0NzAsMTAgKzI5MDA4LDEwIEBACiAKICAgICAvLyAkQU5UTFIgc3RhcnQgc3lucHJlZDQzX0ludGVybmFsRGF0YURTTAogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHN5bnByZWQ0M19JbnRlcm5hbERhdGFEU0xfZnJhZ21lbnQoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geyAgIAotICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo3OTY3OjQ6ICggJ2V4dGVuZHMnIHwgJ3N0YXRpYycgfCAnaW1wb3J0JyB8ICdleHRlbnNpb24nIHwgJyEnIHwgJy0nIHwgJysnIHwgJ25ldycgfCAneycgfCAnc3dpdGNoJyB8ICdzeW5jaHJvbml6ZWQnIHwgJzwnIHwgJ3N1cGVyJyB8ICcjJyB8ICdbJyB8ICdmYWxzZScgfCAndHJ1ZScgfCAnbnVsbCcgfCAndHlwZW9mJyB8ICdpZicgfCAnZm9yJyB8ICd3aGlsZScgfCAnZG8nIHwgJ3Rocm93JyB8ICdyZXR1cm4nIHwgJ3RyeScgfCAnKCcgfCBSVUxFX0lEIHwgUlVMRV9IRVggfCBSVUxFX0lOVCB8IFJVTEVfREVDSU1BTCB8IFJVTEVfU1RSSU5HICkKKyAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6ODQwNjo0OiAoICdleHRlbmRzJyB8ICdzdGF0aWMnIHwgJ2ltcG9ydCcgfCAnZXh0ZW5zaW9uJyB8ICchJyB8ICctJyB8ICcrJyB8ICduZXcnIHwgJ3snIHwgJ3N3aXRjaCcgfCAnc3luY2hyb25pemVkJyB8ICc8JyB8ICdzdXBlcicgfCAnIycgfCAnWycgfCAnZmFsc2UnIHwgJ3RydWUnIHwgJ251bGwnIHwgJ3R5cGVvZicgfCAnaWYnIHwgJ2ZvcicgfCAnd2hpbGUnIHwgJ2RvJyB8ICd0aHJvdycgfCAncmV0dXJuJyB8ICd0cnknIHwgJygnIHwgUlVMRV9JRCB8IFJVTEVfSEVYIHwgUlVMRV9JTlQgfCBSVUxFX0RFQ0lNQUwgfCBSVUxFX1NUUklORyApCiAgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOgogICAgICAgICB7Ci0gICAgICAgIGlmICggKGlucHV0LkxBKDEpPj1SVUxFX1NUUklORyAmJiBpbnB1dC5MQSgxKTw9UlVMRV9ERUNJTUFMKXx8aW5wdXQuTEEoMSk9PTE1fHxpbnB1dC5MQSgxKT09NDZ8fGlucHV0LkxBKDEpPT02NXx8KGlucHV0LkxBKDEpPj02OCAmJiBpbnB1dC5MQSgxKTw9NjkpfHxpbnB1dC5MQSgxKT09NzR8fChpbnB1dC5MQSgxKT49NzggJiYgaW5wdXQuTEEoMSk8PTc5KXx8aW5wdXQuTEEoMSk9PTg2fHwoaW5wdXQuTEEoMSk+PTEwMiAmJiBpbnB1dC5MQSgxKTw9MTAzKXx8aW5wdXQuTEEoMSk9PTEwN3x8aW5wdXQuTEEoMSk9PTExM3x8aW5wdXQuTEEoMSk9PTExNXx8KGlucHV0LkxBKDEpPj0xMTkgJiYgaW5wdXQuTEEoMSk8PTEyMCl8fChpbnB1dC5MQSgxKT49MTIzICYmIGlucHV0LkxBKDEpPD0xMzIpfHxpbnB1dC5MQSgxKT09MTM0ICkgeworICAgICAgICBpZiAoIChpbnB1dC5MQSgxKT49UlVMRV9TVFJJTkcgJiYgaW5wdXQuTEEoMSk8PVJVTEVfREVDSU1BTCl8fGlucHV0LkxBKDEpPT0xNXx8aW5wdXQuTEEoMSk9PTUwfHxpbnB1dC5MQSgxKT09NzJ8fChpbnB1dC5MQSgxKT49NzUgJiYgaW5wdXQuTEEoMSk8PTc2KXx8aW5wdXQuTEEoMSk9PTgxfHwoaW5wdXQuTEEoMSk+PTg1ICYmIGlucHV0LkxBKDEpPD04Nil8fGlucHV0LkxBKDEpPT05M3x8KGlucHV0LkxBKDEpPj0xMDkgJiYgaW5wdXQuTEEoMSk8PTExMCl8fGlucHV0LkxBKDEpPT0xMTR8fGlucHV0LkxBKDEpPT0xMjB8fGlucHV0LkxBKDEpPT0xMjJ8fChpbnB1dC5MQSgxKT49MTI2ICYmIGlucHV0LkxBKDEpPD0xMjcpfHwoaW5wdXQuTEEoMSk+PTEzMCAmJiBpbnB1dC5MQSgxKTw9MTM5KXx8aW5wdXQuTEEoMSk9PTE0MSApIHsKICAgICAgICAgICAgIGlucHV0LmNvbnN1bWUoKTsKICAgICAgICAgICAgIHN0YXRlLmVycm9yUmVjb3Zlcnk9ZmFsc2U7c3RhdGUuZmFpbGVkPWZhbHNlOwogICAgICAgICB9CkBAIC0yNzQ5MCwxMCArMjkwMjgsMTAgQEAKIAogICAgIC8vICRBTlRMUiBzdGFydCBzeW5wcmVkNDRfSW50ZXJuYWxEYXRhRFNMCiAgICAgcHVibGljIGZpbmFsIHZvaWQgc3lucHJlZDQ0X0ludGVybmFsRGF0YURTTF9mcmFnbWVudCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7ICAgCi0gICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjgwMzg6NjogKCAnY2F0Y2gnICkKLSAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6ODAzODo3OiAnY2F0Y2gnCisgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjg0Nzc6NjogKCAnY2F0Y2gnICkKKyAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6ODQ3Nzo3OiAnY2F0Y2gnCiAgICAgICAgIHsKLSAgICAgICAgbWF0Y2goaW5wdXQsMTM1LEZPTExPV18yKTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKKyAgICAgICAgbWF0Y2goaW5wdXQsMTQyLEZPTExPV18yKTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKIAogICAgICAgICB9CiAgICAgfQpAQCAtMjc1MDEsMTAgKzI5MDM5LDEwIEBACiAKICAgICAvLyAkQU5UTFIgc3RhcnQgc3lucHJlZDQ1X0ludGVybmFsRGF0YURTTAogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHN5bnByZWQ0NV9JbnRlcm5hbERhdGFEU0xfZnJhZ21lbnQoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geyAgIAotICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo4MDU5Ojc6ICggJ2ZpbmFsbHknICkKLSAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6ODA1OTo4OiAnZmluYWxseScKKyAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6ODQ5ODo3OiAoICdmaW5hbGx5JyApCisgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjg0OTg6ODogJ2ZpbmFsbHknCiAgICAgICAgIHsKLSAgICAgICAgbWF0Y2goaW5wdXQsMTMzLEZPTExPV18yKTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKKyAgICAgICAgbWF0Y2goaW5wdXQsMTQwLEZPTExPV18yKTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKIAogICAgICAgICB9CiAgICAgfQpAQCAtMjc1MTIsMTAgKzI5MDUwLDEwIEBACiAKICAgICAvLyAkQU5UTFIgc3RhcnQgc3lucHJlZDQ4X0ludGVybmFsRGF0YURTTAogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHN5bnByZWQ0OF9JbnRlcm5hbERhdGFEU0xfZnJhZ21lbnQoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geyAgIAotICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo4MzAzOjU6ICggJy4nICkKLSAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6ODMwMzo2OiAnLicKKyAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6ODc0Mjo1OiAoICcuJyApCisgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjg3NDI6NjogJy4nCiAgICAgICAgIHsKLSAgICAgICAgbWF0Y2goaW5wdXQsNjcsRk9MTE9XXzIpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOworICAgICAgICBtYXRjaChpbnB1dCw3NCxGT0xMT1dfMik7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CiAKICAgICAgICAgfQogICAgIH0KQEAgLTI3NTIzLDE0ICsyOTA2MSwxNCBAQAogCiAgICAgLy8gJEFOVExSIHN0YXJ0IHN5bnByZWQ0OV9JbnRlcm5hbERhdGFEU0wKICAgICBwdWJsaWMgZmluYWwgdm9pZCBzeW5wcmVkNDlfSW50ZXJuYWxEYXRhRFNMX2ZyYWdtZW50KCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsgICAKLSAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6ODQyOTo1OiAoICggKCkgcnVsZUFycmF5QnJhY2tldHMgKSApCi0gICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjg0Mjk6NjogKCAoKSBydWxlQXJyYXlCcmFja2V0cyApCisgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjg4Njg6NTogKCAoICgpIHJ1bGVBcnJheUJyYWNrZXRzICkgKQorICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo4ODY4OjY6ICggKCkgcnVsZUFycmF5QnJhY2tldHMgKQogICAgICAgICB7Ci0gICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjg0Mjk6NjogKCAoKSBydWxlQXJyYXlCcmFja2V0cyApCi0gICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjg0MzA6NjogKCkgcnVsZUFycmF5QnJhY2tldHMKKyAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6ODg2ODo2OiAoICgpIHJ1bGVBcnJheUJyYWNrZXRzICkKKyAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6ODg2OTo2OiAoKSBydWxlQXJyYXlCcmFja2V0cwogICAgICAgICB7Ci0gICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjg0MzA6NjogKCkKLSAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6ODQzMTo2OiAKKyAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6ODg2OTo2OiAoKQorICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo4ODcwOjY6IAogICAgICAgICB7CiAgICAgICAgIH0KIApAQCAtMjc1NDksMTAgKzI5MDg3LDEwIEBACiAKICAgICAvLyAkQU5UTFIgc3RhcnQgc3lucHJlZDUwX0ludGVybmFsRGF0YURTTAogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHN5bnByZWQ1MF9JbnRlcm5hbERhdGFEU0xfZnJhZ21lbnQoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geyAgIAotICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo4NjI2OjU6ICggJzwnICkKLSAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6ODYyNjo2OiAnPCcKKyAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6OTA2NTo1OiAoICc8JyApCisgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjkwNjU6NjogJzwnCiAgICAgICAgIHsKLSAgICAgICAgbWF0Y2goaW5wdXQsODYsRk9MTE9XXzIpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOworICAgICAgICBtYXRjaChpbnB1dCw5MyxGT0xMT1dfMik7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CiAKICAgICAgICAgfQogICAgIH0KQEAgLTI3NTYwLDE4ICsyOTA5OCwxOCBAQAogCiAgICAgLy8gJEFOVExSIHN0YXJ0IHN5bnByZWQ1MV9JbnRlcm5hbERhdGFEU0wKICAgICBwdWJsaWMgZmluYWwgdm9pZCBzeW5wcmVkNTFfSW50ZXJuYWxEYXRhRFNMX2ZyYWdtZW50KCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsgICAKLSAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6ODY4Mjo2OiAoICggKCkgJy4nICkgKQotICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo4NjgyOjc6ICggKCkgJy4nICkKKyAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6OTEyMTo2OiAoICggKCkgJy4nICkgKQorICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo5MTIxOjc6ICggKCkgJy4nICkKICAgICAgICAgewotICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo4NjgyOjc6ICggKCkgJy4nICkKLSAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6ODY4Mzo3OiAoKSAnLicKKyAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6OTEyMTo3OiAoICgpICcuJyApCisgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjkxMjI6NzogKCkgJy4nCiAgICAgICAgIHsKLSAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6ODY4Mzo3OiAoKQotICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo4Njg0Ojc6IAorICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo5MTIyOjc6ICgpCisgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjkxMjM6NzogCiAgICAgICAgIHsKICAgICAgICAgfQogCi0gICAgICAgIG1hdGNoKGlucHV0LDY3LEZPTExPV18yKTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKKyAgICAgICAgbWF0Y2goaW5wdXQsNzQsRk9MTE9XXzIpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOwogCiAgICAgICAgIH0KIApAQCAtMjc1ODIsMTAgKzI5MTIwLDEwIEBACiAKICAgICAvLyAkQU5UTFIgc3RhcnQgc3lucHJlZDUyX0ludGVybmFsRGF0YURTTAogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHN5bnByZWQ1Ml9JbnRlcm5hbERhdGFEU0xfZnJhZ21lbnQoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geyAgIAotICAgICAgICAvLyBJbnRlcm5hbERhdGFEU0wuZzo4NzIwOjc6ICggJzwnICkKLSAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6ODcyMDo4OiAnPCcKKyAgICAgICAgLy8gSW50ZXJuYWxEYXRhRFNMLmc6OTE1OTo3OiAoICc8JyApCisgICAgICAgIC8vIEludGVybmFsRGF0YURTTC5nOjkxNTk6ODogJzwnCiAgICAgICAgIHsKLSAgICAgICAgbWF0Y2goaW5wdXQsODYsRk9MTE9XXzIpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOworICAgICAgICBtYXRjaChpbnB1dCw5MyxGT0xMT1dfMik7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CiAKICAgICAgICAgfQogICAgIH0KQEAgLTI4MjI1LDQ1ICsyOTc2Myw0NSBAQAogICAgIH0KIAogCi0gICAgcHJvdGVjdGVkIERGQTQxIGRmYTQxID0gbmV3IERGQTQxKHRoaXMpOwotICAgIHByb3RlY3RlZCBERkE0NCBkZmE0NCA9IG5ldyBERkE0NCh0aGlzKTsKLSAgICBwcm90ZWN0ZWQgREZBNTAgZGZhNTAgPSBuZXcgREZBNTAodGhpcyk7Ci0gICAgcHJvdGVjdGVkIERGQTUzIGRmYTUzID0gbmV3IERGQTUzKHRoaXMpOworICAgIHByb3RlY3RlZCBERkE1MiBkZmE1MiA9IG5ldyBERkE1Mih0aGlzKTsKICAgICBwcm90ZWN0ZWQgREZBNTUgZGZhNTUgPSBuZXcgREZBNTUodGhpcyk7Ci0gICAgcHJvdGVjdGVkIERGQTY1IGRmYTY1ID0gbmV3IERGQTY1KHRoaXMpOwotICAgIHByb3RlY3RlZCBERkE2OCBkZmE2OCA9IG5ldyBERkE2OCh0aGlzKTsKLSAgICBwcm90ZWN0ZWQgREZBODQgZGZhODQgPSBuZXcgREZBODQodGhpcyk7Ci0gICAgcHJvdGVjdGVkIERGQTgzIGRmYTgzID0gbmV3IERGQTgzKHRoaXMpOwotICAgIHByb3RlY3RlZCBERkE4NSBkZmE4NSA9IG5ldyBERkE4NSh0aGlzKTsKLSAgICBwcm90ZWN0ZWQgREZBODcgZGZhODcgPSBuZXcgREZBODcodGhpcyk7CisgICAgcHJvdGVjdGVkIERGQTYxIGRmYTYxID0gbmV3IERGQTYxKHRoaXMpOworICAgIHByb3RlY3RlZCBERkE2NCBkZmE2NCA9IG5ldyBERkE2NCh0aGlzKTsKKyAgICBwcm90ZWN0ZWQgREZBNjYgZGZhNjYgPSBuZXcgREZBNjYodGhpcyk7CisgICAgcHJvdGVjdGVkIERGQTc2IGRmYTc2ID0gbmV3IERGQTc2KHRoaXMpOworICAgIHByb3RlY3RlZCBERkE3OSBkZmE3OSA9IG5ldyBERkE3OSh0aGlzKTsKKyAgICBwcm90ZWN0ZWQgREZBOTUgZGZhOTUgPSBuZXcgREZBOTUodGhpcyk7CisgICAgcHJvdGVjdGVkIERGQTk0IGRmYTk0ID0gbmV3IERGQTk0KHRoaXMpOwogICAgIHByb3RlY3RlZCBERkE5NiBkZmE5NiA9IG5ldyBERkE5Nih0aGlzKTsKLSAgICBwcm90ZWN0ZWQgREZBMTAzIGRmYTEwMyA9IG5ldyBERkExMDModGhpcyk7Ci0gICAgcHJvdGVjdGVkIERGQTEwMiBkZmExMDIgPSBuZXcgREZBMTAyKHRoaXMpOwotICAgIHByb3RlY3RlZCBERkExMjUgZGZhMTI1ID0gbmV3IERGQTEyNSh0aGlzKTsKLSAgICBwcm90ZWN0ZWQgREZBMTI0IGRmYTEyNCA9IG5ldyBERkExMjQodGhpcyk7Ci0gICAgcHJvdGVjdGVkIERGQTEyNiBkZmExMjYgPSBuZXcgREZBMTI2KHRoaXMpOwotICAgIHByb3RlY3RlZCBERkExMzAgZGZhMTMwID0gbmV3IERGQTEzMCh0aGlzKTsKLSAgICBwcm90ZWN0ZWQgREZBMTMzIGRmYTEzMyA9IG5ldyBERkExMzModGhpcyk7Ci0gICAgcHJvdGVjdGVkIERGQTEzMiBkZmExMzIgPSBuZXcgREZBMTMyKHRoaXMpOwotICAgIHByb3RlY3RlZCBERkExMzQgZGZhMTM0ID0gbmV3IERGQTEzNCh0aGlzKTsKKyAgICBwcm90ZWN0ZWQgREZBOTggZGZhOTggPSBuZXcgREZBOTgodGhpcyk7CisgICAgcHJvdGVjdGVkIERGQTEwNyBkZmExMDcgPSBuZXcgREZBMTA3KHRoaXMpOworICAgIHByb3RlY3RlZCBERkExMTQgZGZhMTE0ID0gbmV3IERGQTExNCh0aGlzKTsKKyAgICBwcm90ZWN0ZWQgREZBMTEzIGRmYTExMyA9IG5ldyBERkExMTModGhpcyk7CisgICAgcHJvdGVjdGVkIERGQTEzNiBkZmExMzYgPSBuZXcgREZBMTM2KHRoaXMpOworICAgIHByb3RlY3RlZCBERkExMzUgZGZhMTM1ID0gbmV3IERGQTEzNSh0aGlzKTsKICAgICBwcm90ZWN0ZWQgREZBMTM3IGRmYTEzNyA9IG5ldyBERkExMzcodGhpcyk7Ci0gICAgcHJvdGVjdGVkIERGQTE1NSBkZmExNTUgPSBuZXcgREZBMTU1KHRoaXMpOwotICAgIHByb3RlY3RlZCBERkExNTMgZGZhMTUzID0gbmV3IERGQTE1Myh0aGlzKTsKKyAgICBwcm90ZWN0ZWQgREZBMTQxIGRmYTE0MSA9IG5ldyBERkExNDEodGhpcyk7CisgICAgcHJvdGVjdGVkIERGQTE0NCBkZmExNDQgPSBuZXcgREZBMTQ0KHRoaXMpOworICAgIHByb3RlY3RlZCBERkExNDMgZGZhMTQzID0gbmV3IERGQTE0Myh0aGlzKTsKKyAgICBwcm90ZWN0ZWQgREZBMTQ1IGRmYTE0NSA9IG5ldyBERkExNDUodGhpcyk7CisgICAgcHJvdGVjdGVkIERGQTE0OCBkZmExNDggPSBuZXcgREZBMTQ4KHRoaXMpOworICAgIHByb3RlY3RlZCBERkExNjYgZGZhMTY2ID0gbmV3IERGQTE2Nih0aGlzKTsKKyAgICBwcm90ZWN0ZWQgREZBMTY0IGRmYTE2NCA9IG5ldyBERkExNjQodGhpcyk7CiAgICAgc3RhdGljIGZpbmFsIFN0cmluZyBkZmFfMXMgPSAiXDEwXHVmZmZmIjsKLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIGRmYV8ycyA9ICJcMlx1ZmZmZlwxXDVcM1x1ZmZmZlwxXDVcMVx1ZmZmZiI7Ci0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBkZmFfM3MgPSAiXDFcNlwxXHVmZmZmXDFcMTVcMVx1ZmZmZlwxXDZcMVx1ZmZmZlwxXDE1XDFcdWZmZmYiOwotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgZGZhXzRzID0gIlwxXDEwN1wxXHVmZmZmXDFcMTEwXDFcdWZmZmZcMVwxMDZcMVx1ZmZmZlwxXDExMFwxXHVmZmZmIjsKLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIGRmYV81cyA9ICJcMVx1ZmZmZlwxXDFcMVx1ZmZmZlwxXDRcMVx1ZmZmZlwxXDJcMVx1ZmZmZlwxXDMiOworICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgZGZhXzJzID0gIlwyXHVmZmZmXDFcNVw0XHVmZmZmXDFcNSI7CisgICAgc3RhdGljIGZpbmFsIFN0cmluZyBkZmFfM3MgPSAiXDFcNlwxXHVmZmZmXDFcMTVcMVx1ZmZmZlwxXDZcMlx1ZmZmZlwxXDE1IjsKKyAgICBzdGF0aWMgZmluYWwgU3RyaW5nIGRmYV80cyA9ICJcMVwxMTZcMVx1ZmZmZlwxXDExN1wxXHVmZmZmXDFcMTE1XDJcdWZmZmZcMVwxMTciOworICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgZGZhXzVzID0gIlwxXHVmZmZmXDFcMVwxXHVmZmZmXDFcNFwxXHVmZmZmXDFcMlwxXDNcMVx1ZmZmZiI7CiAgICAgc3RhdGljIGZpbmFsIFN0cmluZyBkZmFfNnMgPSAiXDEwXHVmZmZmfT4iOwogICAgIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBkZmFfN3MgPSB7Ci0gICAgICAgICAgICAiXDFcMlw3Nlx1ZmZmZlwxXDFcMVx1ZmZmZlwxXDMiLAorICAgICAgICAgICAgIlwxXDJcMTA1XHVmZmZmXDFcMVwxXHVmZmZmXDFcMyIsCiAgICAgICAgICAgICAiIiwKLSAgICAgICAgICAgICJcMVw1XDY1XHVmZmZmXDFcNFwxXDVcM1x1ZmZmZlwxXDUiLAorICAgICAgICAgICAgIlwxXDVcNzRcdWZmZmZcMVw0XDFcNVwzXHVmZmZmXDFcNSIsCiAgICAgICAgICAgICAiIiwKLSAgICAgICAgICAgICJcMVw2XDc3XHVmZmZmXDFcNyIsCisgICAgICAgICAgICAiXDFcN1wxMDZcdWZmZmZcMVw2IiwKICAgICAgICAgICAgICIiLAotICAgICAgICAgICAgIlwxXDVcNjVcdWZmZmZcMVw0XDFcNVwzXHVmZmZmXDFcNSIsCi0gICAgICAgICAgICAiIgorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiXDFcNVw3NFx1ZmZmZlwxXDRcMVw1XDNcdWZmZmZcMVw1IgogICAgIH07CiAKICAgICBzdGF0aWMgZmluYWwgc2hvcnRbXSBkZmFfMSA9IERGQS51bnBhY2tFbmNvZGVkU3RyaW5nKGRmYV8xcyk7CkBAIC0yODI3NCwxMSArMjk4MTIsMTEgQEAKICAgICBzdGF0aWMgZmluYWwgc2hvcnRbXSBkZmFfNiA9IERGQS51bnBhY2tFbmNvZGVkU3RyaW5nKGRmYV82cyk7CiAgICAgc3RhdGljIGZpbmFsIHNob3J0W11bXSBkZmFfNyA9IHVucGFja0VuY29kZWRTdHJpbmdBcnJheShkZmFfN3MpOwogCi0gICAgY2xhc3MgREZBNDEgZXh0ZW5kcyBERkEgeworICAgIGNsYXNzIERGQTUyIGV4dGVuZHMgREZBIHsKIAotICAgICAgICBwdWJsaWMgREZBNDEoQmFzZVJlY29nbml6ZXIgcmVjb2duaXplcikgeworICAgICAgICBwdWJsaWMgREZBNTIoQmFzZVJlY29nbml6ZXIgcmVjb2duaXplcikgewogICAgICAgICAgICAgdGhpcy5yZWNvZ25pemVyID0gcmVjb2duaXplcjsKLSAgICAgICAgICAgIHRoaXMuZGVjaXNpb25OdW1iZXIgPSA0MTsKKyAgICAgICAgICAgIHRoaXMuZGVjaXNpb25OdW1iZXIgPSA1MjsKICAgICAgICAgICAgIHRoaXMuZW90ID0gZGZhXzE7CiAgICAgICAgICAgICB0aGlzLmVvZiA9IGRmYV8yOwogICAgICAgICAgICAgdGhpcy5taW4gPSBkZmFfMzsKQEAgLTI4Mjg4LDE2ICsyOTgyNiwxNiBAQAogICAgICAgICAgICAgdGhpcy50cmFuc2l0aW9uID0gZGZhXzc7CiAgICAgICAgIH0KICAgICAgICAgcHVibGljIFN0cmluZyBnZXREZXNjcmlwdGlvbigpIHsKLSAgICAgICAgICAgIHJldHVybiAiMjM5NjozOiAoICggKCAobHZfc3RhdGljXzJfMD0gJ3N0YXRpYycgKSApICggKGx2X2V4dGVuc2lvbl8zXzA9ICdleHRlbnNpb24nICkgKT8gKCAoIHJ1bGVRdWFsaWZpZWROYW1lSW5TdGF0aWNJbXBvcnQgKSApICggKCAobHZfd2lsZGNhcmRfNV8wPSAnKicgKSApIHwgKCAobHZfbWVtYmVyTmFtZV82XzA9IHJ1bGVWYWxpZElEICkgKSApICkgfCAoICggcnVsZVF1YWxpZmllZE5hbWUgKSApIHwgKCAobHZfaW1wb3J0ZWROYW1lc3BhY2VfOF8wPSBydWxlUXVhbGlmaWVkTmFtZVdpdGhXaWxkY2FyZCApICkgfCAoICggKGx2X2ZxbkltcG9ydF85XzA9ICducycgKSApICggKGx2X2ltcG9ydGVkRnVsbHlRdWFsaWZpZWROYW1lXzEwXzA9IHJ1bGVRdWFsaWZpZWROYW1lICkgKSApICkiOworICAgICAgICAgICAgcmV0dXJuICIyODM1OjM6ICggKCAoIChsdl9zdGF0aWNfMl8wPSAnc3RhdGljJyApICkgKCAobHZfZXh0ZW5zaW9uXzNfMD0gJ2V4dGVuc2lvbicgKSApPyAoICggcnVsZVF1YWxpZmllZE5hbWVJblN0YXRpY0ltcG9ydCApICkgKCAoIChsdl93aWxkY2FyZF81XzA9ICcqJyApICkgfCAoIChsdl9tZW1iZXJOYW1lXzZfMD0gcnVsZVZhbGlkSUQgKSApICkgKSB8ICggKCBydWxlUXVhbGlmaWVkTmFtZSApICkgfCAoIChsdl9pbXBvcnRlZE5hbWVzcGFjZV84XzA9IHJ1bGVRdWFsaWZpZWROYW1lV2l0aFdpbGRjYXJkICkgKSB8ICggKCAobHZfZnFuSW1wb3J0XzlfMD0gJ25zJyApICkgKCAobHZfaW1wb3J0ZWRGdWxseVF1YWxpZmllZE5hbWVfMTBfMD0gcnVsZVF1YWxpZmllZE5hbWUgKSApICkgKSI7CiAgICAgICAgIH0KICAgICB9CiAgICAgc3RhdGljIGZpbmFsIFN0cmluZyBkZmFfOHMgPSAiXDQ0XHVmZmZmIjsKICAgICBzdGF0aWMgZmluYWwgU3RyaW5nIGRmYV85cyA9ICJcMVw0XDFcMFw0Mlx1ZmZmZiI7Ci0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBkZmFfMTBzID0gIlwxXHUwMDg2XDFcMFw0Mlx1ZmZmZiI7CisgICAgc3RhdGljIGZpbmFsIFN0cmluZyBkZmFfMTBzID0gIlwxXHUwMDhkXDFcMFw0Mlx1ZmZmZiI7CiAgICAgc3RhdGljIGZpbmFsIFN0cmluZyBkZmFfMTFzID0gIlwyXHVmZmZmXDFcMlwzN1x1ZmZmZlwxXDNcMVwxIjsKICAgICBzdGF0aWMgZmluYWwgU3RyaW5nIGRmYV8xMnMgPSAiXDFcdWZmZmZcMVwwXDQyXHVmZmZmfT4iOwogICAgIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBkZmFfMTNzID0gewotICAgICAgICAgICAgIlwyXDJcMVwxXDJcMlw2XHVmZmZmXDFcMlwzNlx1ZmZmZlwxXDJcMjJcdWZmZmZcMVwyXDJcdWZmZmZcMlwyXDNcdWZmZmZcMlwyXDFcdWZmZmZcMVw0MlwxXHVmZmZmXDJcMlw2XHVmZmZmXDFcMlwxN1x1ZmZmZlwyXDJcM1x1ZmZmZlwxXDJcNVx1ZmZmZlwxXDJcMVx1ZmZmZlwxXDJcM1x1ZmZmZlwyXDJcMlx1ZmZmZlwxMlwyXDFcdWZmZmZcMVwyIiwKKyAgICAgICAgICAgICJcMlwyXDFcMVwyXDJcNlx1ZmZmZlwxXDJcNDJcdWZmZmZcMVwyXDI1XHVmZmZmXDFcMlwyXHVmZmZmXDJcMlwzXHVmZmZmXDJcMlwxXHVmZmZmXDFcNDJcMVx1ZmZmZlwyXDJcNlx1ZmZmZlwxXDJcMTdcdWZmZmZcMlwyXDNcdWZmZmZcMVwyXDVcdWZmZmZcMVwyXDFcdWZmZmZcMVwyXDNcdWZmZmZcMlwyXDJcdWZmZmZcMTJcMlwxXHVmZmZmXDFcMiIsCiAgICAgICAgICAgICAiXDFcdWZmZmYiLAogICAgICAgICAgICAgIiIsCiAgICAgICAgICAgICAiIiwKQEAgLTI4MzQyLDExICsyOTg4MCwxMSBAQAogICAgIHN0YXRpYyBmaW5hbCBzaG9ydFtdIGRmYV8xMiA9IERGQS51bnBhY2tFbmNvZGVkU3RyaW5nKGRmYV8xMnMpOwogICAgIHN0YXRpYyBmaW5hbCBzaG9ydFtdW10gZGZhXzEzID0gdW5wYWNrRW5jb2RlZFN0cmluZ0FycmF5KGRmYV8xM3MpOwogCi0gICAgY2xhc3MgREZBNDQgZXh0ZW5kcyBERkEgeworICAgIGNsYXNzIERGQTU1IGV4dGVuZHMgREZBIHsKIAotICAgICAgICBwdWJsaWMgREZBNDQoQmFzZVJlY29nbml6ZXIgcmVjb2duaXplcikgeworICAgICAgICBwdWJsaWMgREZBNTUoQmFzZVJlY29nbml6ZXIgcmVjb2duaXplcikgewogICAgICAgICAgICAgdGhpcy5yZWNvZ25pemVyID0gcmVjb2duaXplcjsKLSAgICAgICAgICAgIHRoaXMuZGVjaXNpb25OdW1iZXIgPSA0NDsKKyAgICAgICAgICAgIHRoaXMuZGVjaXNpb25OdW1iZXIgPSA1NTsKICAgICAgICAgICAgIHRoaXMuZW90ID0gZGZhXzg7CiAgICAgICAgICAgICB0aGlzLmVvZiA9IGRmYV84OwogICAgICAgICAgICAgdGhpcy5taW4gPSBkZmFfOTsKQEAgLTI4MzU2LDE3ICsyOTg5NCwxNyBAQAogICAgICAgICAgICAgdGhpcy50cmFuc2l0aW9uID0gZGZhXzEzOwogICAgICAgICB9CiAgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0RGVzY3JpcHRpb24oKSB7Ci0gICAgICAgICAgICByZXR1cm4gIjI2MTM6NDogKCAoICggKCAoICggKCBydWxlVmFsaWRJRCApICkgJz0nICkgKT0+IChsdl9lbGVtZW50VmFsdWVQYWlyc180XzA9IHJ1bGVYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZVBhaXIgKSApIChvdGhlcmx2XzU9ICcsJyAoICggKCAoICggcnVsZVZhbGlkSUQgKSApICc9JyApICk9PiAobHZfZWxlbWVudFZhbHVlUGFpcnNfNl8wPSBydWxlWEFubm90YXRpb25FbGVtZW50VmFsdWVQYWlyICkgKSApKiApIHwgKCAobHZfdmFsdWVfN18wPSBydWxlWEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdCApICkgKT8iOworICAgICAgICAgICAgcmV0dXJuICIzMDUyOjQ6ICggKCAoICggKCAoICggcnVsZVZhbGlkSUQgKSApICc9JyApICk9PiAobHZfZWxlbWVudFZhbHVlUGFpcnNfNF8wPSBydWxlWEFubm90YXRpb25FbGVtZW50VmFsdWVQYWlyICkgKSAob3RoZXJsdl81PSAnLCcgKCAoICggKCAoIHJ1bGVWYWxpZElEICkgKSAnPScgKSApPT4gKGx2X2VsZW1lbnRWYWx1ZVBhaXJzXzZfMD0gcnVsZVhBbm5vdGF0aW9uRWxlbWVudFZhbHVlUGFpciApICkgKSogKSB8ICggKGx2X3ZhbHVlXzdfMD0gcnVsZVhBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3QgKSApICk/IjsKICAgICAgICAgfQogICAgICAgICBwdWJsaWMgaW50IHNwZWNpYWxTdGF0ZVRyYW5zaXRpb24oaW50IHMsIEludFN0cmVhbSBfaW5wdXQpIHRocm93cyBOb1ZpYWJsZUFsdEV4Y2VwdGlvbiB7CiAgICAgICAgICAgICBUb2tlblN0cmVhbSBpbnB1dCA9IChUb2tlblN0cmVhbSlfaW5wdXQ7CiAgICAgICAgIAlpbnQgX3MgPSBzOwogICAgICAgICAgICAgc3dpdGNoICggcyApIHsKICAgICAgICAgICAgICAgICAgICAgY2FzZSAwIDogCi0gICAgICAgICAgICAgICAgICAgICAgICBpbnQgTEE0NF8xID0gaW5wdXQuTEEoMSk7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgTEE1NV8xID0gaW5wdXQuTEEoMSk7CiAKICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbmRleDQ0XzEgPSBpbnB1dC5pbmRleCgpOworICAgICAgICAgICAgICAgICAgICAgICAgaW50IGluZGV4NTVfMSA9IGlucHV0LmluZGV4KCk7CiAgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dC5yZXdpbmQoKTsKICAgICAgICAgICAgICAgICAgICAgICAgIHMgPSAtMTsKICAgICAgICAgICAgICAgICAgICAgICAgIGlmICggKHN5bnByZWQyX0ludGVybmFsRGF0YURTTCgpKSApIHtzID0gMzU7fQpAQCAtMjgzNzQsMjQgKzI5OTEyLDI0IEBACiAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICggKHRydWUpICkge3MgPSAyO30KIAogICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXQuc2VlayhpbmRleDQ0XzEpOworICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXQuc2VlayhpbmRleDU1XzEpOwogICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCBzPj0wICkgcmV0dXJuIHM7CiAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGlmIChzdGF0ZS5iYWNrdHJhY2tpbmc+MCkge3N0YXRlLmZhaWxlZD10cnVlOyByZXR1cm4gLTE7fQogICAgICAgICAgICAgTm9WaWFibGVBbHRFeGNlcHRpb24gbnZhZSA9Ci0gICAgICAgICAgICAgICAgbmV3IE5vVmlhYmxlQWx0RXhjZXB0aW9uKGdldERlc2NyaXB0aW9uKCksIDQ0LCBfcywgaW5wdXQpOworICAgICAgICAgICAgICAgIG5ldyBOb1ZpYWJsZUFsdEV4Y2VwdGlvbihnZXREZXNjcmlwdGlvbigpLCA1NSwgX3MsIGlucHV0KTsKICAgICAgICAgICAgIGVycm9yKG52YWUpOwogICAgICAgICAgICAgdGhyb3cgbnZhZTsKICAgICAgICAgfQogICAgIH0KICAgICBzdGF0aWMgZmluYWwgU3RyaW5nIGRmYV8xNHMgPSAiXDQzXHVmZmZmIjsKICAgICBzdGF0aWMgZmluYWwgU3RyaW5nIGRmYV8xNXMgPSAiXDFcNFwxXDBcNDFcdWZmZmYiOwotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgZGZhXzE2cyA9ICJcMVx1MDA4NlwxXDBcNDFcdWZmZmYiOworICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgZGZhXzE2cyA9ICJcMVx1MDA4ZFwxXDBcNDFcdWZmZmYiOwogICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgZGZhXzE3cyA9ICJcMlx1ZmZmZlwxXDJcMzdcdWZmZmZcMVwxIjsKICAgICBzdGF0aWMgZmluYWwgU3RyaW5nIGRmYV8xOHMgPSAiXDFcdWZmZmZcMVwwXDQxXHVmZmZmfT4iOwogICAgIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBkZmFfMTlzID0gewotICAgICAgICAgICAgIlw1XDJcNlx1ZmZmZlwxXDJcMzZcdWZmZmZcMVwyXDIyXHVmZmZmXDFcMlwyXHVmZmZmXDJcMlwzXHVmZmZmXDJcMlwzXHVmZmZmXDFcMVwxXDJcNlx1ZmZmZlwxXDJcMTdcdWZmZmZcMlwyXDNcdWZmZmZcMVwyXDVcdWZmZmZcMVwyXDFcdWZmZmZcMVwyXDNcdWZmZmZcMlwyXDJcdWZmZmZcMTJcMlwxXHVmZmZmXDFcMiIsCisgICAgICAgICAgICAiXDVcMlw2XHVmZmZmXDFcMlw0Mlx1ZmZmZlwxXDJcMjVcdWZmZmZcMVwyXDJcdWZmZmZcMlwyXDNcdWZmZmZcMlwyXDNcdWZmZmZcMVwxXDFcMlw2XHVmZmZmXDFcMlwxN1x1ZmZmZlwyXDJcM1x1ZmZmZlwxXDJcNVx1ZmZmZlwxXDJcMVx1ZmZmZlwxXDJcM1x1ZmZmZlwyXDJcMlx1ZmZmZlwxMlwyXDFcdWZmZmZcMVwyIiwKICAgICAgICAgICAgICJcMVx1ZmZmZiIsCiAgICAgICAgICAgICAiIiwKICAgICAgICAgICAgICIiLApAQCAtMjg0MzUsMTEgKzI5OTczLDExIEBACiAgICAgc3RhdGljIGZpbmFsIHNob3J0W10gZGZhXzE4ID0gREZBLnVucGFja0VuY29kZWRTdHJpbmcoZGZhXzE4cyk7CiAgICAgc3RhdGljIGZpbmFsIHNob3J0W11bXSBkZmFfMTkgPSB1bnBhY2tFbmNvZGVkU3RyaW5nQXJyYXkoZGZhXzE5cyk7CiAKLSAgICBjbGFzcyBERkE1MCBleHRlbmRzIERGQSB7CisgICAgY2xhc3MgREZBNjEgZXh0ZW5kcyBERkEgewogCi0gICAgICAgIHB1YmxpYyBERkE1MChCYXNlUmVjb2duaXplciByZWNvZ25pemVyKSB7CisgICAgICAgIHB1YmxpYyBERkE2MShCYXNlUmVjb2duaXplciByZWNvZ25pemVyKSB7CiAgICAgICAgICAgICB0aGlzLnJlY29nbml6ZXIgPSByZWNvZ25pemVyOwotICAgICAgICAgICAgdGhpcy5kZWNpc2lvbk51bWJlciA9IDUwOworICAgICAgICAgICAgdGhpcy5kZWNpc2lvbk51bWJlciA9IDYxOwogICAgICAgICAgICAgdGhpcy5lb3QgPSBkZmFfMTQ7CiAgICAgICAgICAgICB0aGlzLmVvZiA9IGRmYV8xNDsKICAgICAgICAgICAgIHRoaXMubWluID0gZGZhXzE1OwpAQCAtMjg0NDksMTcgKzI5OTg3LDE3IEBACiAgICAgICAgICAgICB0aGlzLnRyYW5zaXRpb24gPSBkZmFfMTk7CiAgICAgICAgIH0KICAgICAgICAgcHVibGljIFN0cmluZyBnZXREZXNjcmlwdGlvbigpIHsKLSAgICAgICAgICAgIHJldHVybiAiMjc5MzoyOiAoICggKCAoICggKCkgJyMnICdbJyApICk9PiAoICgpIG90aGVybHZfMT0gJyMnIG90aGVybHZfMj0gJ1snICkgKSAoICggKGx2X2VsZW1lbnRzXzNfMD0gcnVsZVhBbm5vdGF0aW9uT3JFeHByZXNzaW9uICkgKSAob3RoZXJsdl80PSAnLCcgKCAobHZfZWxlbWVudHNfNV8wPSBydWxlWEFubm90YXRpb25PckV4cHJlc3Npb24gKSApICkqICk/IG90aGVybHZfNj0gJ10nICkgfCAodGhpc19YQW5ub3RhdGlvbk9yRXhwcmVzc2lvbl83PSBydWxlWEFubm90YXRpb25PckV4cHJlc3Npb24gKCAoKSAob3RoZXJsdl85PSAnLCcgKCAobHZfZWxlbWVudHNfMTBfMD0gcnVsZVhBbm5vdGF0aW9uT3JFeHByZXNzaW9uICkgKSApKyApPyApICkiOworICAgICAgICAgICAgcmV0dXJuICIzMjMyOjI6ICggKCAoICggKCAoKSAnIycgJ1snICkgKT0+ICggKCkgb3RoZXJsdl8xPSAnIycgb3RoZXJsdl8yPSAnWycgKSApICggKCAobHZfZWxlbWVudHNfM18wPSBydWxlWEFubm90YXRpb25PckV4cHJlc3Npb24gKSApIChvdGhlcmx2XzQ9ICcsJyAoIChsdl9lbGVtZW50c181XzA9IHJ1bGVYQW5ub3RhdGlvbk9yRXhwcmVzc2lvbiApICkgKSogKT8gb3RoZXJsdl82PSAnXScgKSB8ICh0aGlzX1hBbm5vdGF0aW9uT3JFeHByZXNzaW9uXzc9IHJ1bGVYQW5ub3RhdGlvbk9yRXhwcmVzc2lvbiAoICgpIChvdGhlcmx2Xzk9ICcsJyAoIChsdl9lbGVtZW50c18xMF8wPSBydWxlWEFubm90YXRpb25PckV4cHJlc3Npb24gKSApICkrICk/ICkgKSI7CiAgICAgICAgIH0KICAgICAgICAgcHVibGljIGludCBzcGVjaWFsU3RhdGVUcmFuc2l0aW9uKGludCBzLCBJbnRTdHJlYW0gX2lucHV0KSB0aHJvd3MgTm9WaWFibGVBbHRFeGNlcHRpb24gewogICAgICAgICAgICAgVG9rZW5TdHJlYW0gaW5wdXQgPSAoVG9rZW5TdHJlYW0pX2lucHV0OwogICAgICAgICAJaW50IF9zID0gczsKICAgICAgICAgICAgIHN3aXRjaCAoIHMgKSB7CiAgICAgICAgICAgICAgICAgICAgIGNhc2UgMCA6IAotICAgICAgICAgICAgICAgICAgICAgICAgaW50IExBNTBfMSA9IGlucHV0LkxBKDEpOworICAgICAgICAgICAgICAgICAgICAgICAgaW50IExBNjFfMSA9IGlucHV0LkxBKDEpOwogCiAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW5kZXg1MF8xID0gaW5wdXQuaW5kZXgoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbmRleDYxXzEgPSBpbnB1dC5pbmRleCgpOwogICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXQucmV3aW5kKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICBzID0gLTE7CiAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIChzeW5wcmVkNV9JbnRlcm5hbERhdGFEU0woKSkgKSB7cyA9IDM0O30KQEAgLTI4NDY3LDIzICszMDAwNSwyMyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoICh0cnVlKSApIHtzID0gMjt9CiAKICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0LnNlZWsoaW5kZXg1MF8xKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0LnNlZWsoaW5kZXg2MV8xKTsKICAgICAgICAgICAgICAgICAgICAgICAgIGlmICggcz49MCApIHJldHVybiBzOwogICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBpZiAoc3RhdGUuYmFja3RyYWNraW5nPjApIHtzdGF0ZS5mYWlsZWQ9dHJ1ZTsgcmV0dXJuIC0xO30KICAgICAgICAgICAgIE5vVmlhYmxlQWx0RXhjZXB0aW9uIG52YWUgPQotICAgICAgICAgICAgICAgIG5ldyBOb1ZpYWJsZUFsdEV4Y2VwdGlvbihnZXREZXNjcmlwdGlvbigpLCA1MCwgX3MsIGlucHV0KTsKKyAgICAgICAgICAgICAgICBuZXcgTm9WaWFibGVBbHRFeGNlcHRpb24oZ2V0RGVzY3JpcHRpb24oKSwgNjEsIF9zLCBpbnB1dCk7CiAgICAgICAgICAgICBlcnJvcihudmFlKTsKICAgICAgICAgICAgIHRocm93IG52YWU7CiAgICAgICAgIH0KICAgICB9CiAKLSAgICBjbGFzcyBERkE1MyBleHRlbmRzIERGQSB7CisgICAgY2xhc3MgREZBNjQgZXh0ZW5kcyBERkEgewogCi0gICAgICAgIHB1YmxpYyBERkE1MyhCYXNlUmVjb2duaXplciByZWNvZ25pemVyKSB7CisgICAgICAgIHB1YmxpYyBERkE2NChCYXNlUmVjb2duaXplciByZWNvZ25pemVyKSB7CiAgICAgICAgICAgICB0aGlzLnJlY29nbml6ZXIgPSByZWNvZ25pemVyOwotICAgICAgICAgICAgdGhpcy5kZWNpc2lvbk51bWJlciA9IDUzOworICAgICAgICAgICAgdGhpcy5kZWNpc2lvbk51bWJlciA9IDY0OwogICAgICAgICAgICAgdGhpcy5lb3QgPSBkZmFfMTQ7CiAgICAgICAgICAgICB0aGlzLmVvZiA9IGRmYV8xNDsKICAgICAgICAgICAgIHRoaXMubWluID0gZGZhXzE1OwpAQCAtMjg0OTMsMTcgKzMwMDMxLDE3IEBACiAgICAgICAgICAgICB0aGlzLnRyYW5zaXRpb24gPSBkZmFfMTk7CiAgICAgICAgIH0KICAgICAgICAgcHVibGljIFN0cmluZyBnZXREZXNjcmlwdGlvbigpIHsKLSAgICAgICAgICAgIHJldHVybiAiMjkzNToyOiAoICggKCAoICggKCkgJyMnICdbJyApICk9PiAoICgpIG90aGVybHZfMT0gJyMnIG90aGVybHZfMj0gJ1snICkgKSAoICggKGx2X2VsZW1lbnRzXzNfMD0gcnVsZVhBbm5vdGF0aW9uT3JFeHByZXNzaW9uICkgKSAob3RoZXJsdl80PSAnLCcgKCAobHZfZWxlbWVudHNfNV8wPSBydWxlWEFubm90YXRpb25PckV4cHJlc3Npb24gKSApICkqICk/IG90aGVybHZfNj0gJ10nICkgfCB0aGlzX1hBbm5vdGF0aW9uT3JFeHByZXNzaW9uXzc9IHJ1bGVYQW5ub3RhdGlvbk9yRXhwcmVzc2lvbiApIjsKKyAgICAgICAgICAgIHJldHVybiAiMzM3NDoyOiAoICggKCAoICggKCkgJyMnICdbJyApICk9PiAoICgpIG90aGVybHZfMT0gJyMnIG90aGVybHZfMj0gJ1snICkgKSAoICggKGx2X2VsZW1lbnRzXzNfMD0gcnVsZVhBbm5vdGF0aW9uT3JFeHByZXNzaW9uICkgKSAob3RoZXJsdl80PSAnLCcgKCAobHZfZWxlbWVudHNfNV8wPSBydWxlWEFubm90YXRpb25PckV4cHJlc3Npb24gKSApICkqICk/IG90aGVybHZfNj0gJ10nICkgfCB0aGlzX1hBbm5vdGF0aW9uT3JFeHByZXNzaW9uXzc9IHJ1bGVYQW5ub3RhdGlvbk9yRXhwcmVzc2lvbiApIjsKICAgICAgICAgfQogICAgICAgICBwdWJsaWMgaW50IHNwZWNpYWxTdGF0ZVRyYW5zaXRpb24oaW50IHMsIEludFN0cmVhbSBfaW5wdXQpIHRocm93cyBOb1ZpYWJsZUFsdEV4Y2VwdGlvbiB7CiAgICAgICAgICAgICBUb2tlblN0cmVhbSBpbnB1dCA9IChUb2tlblN0cmVhbSlfaW5wdXQ7CiAgICAgICAgIAlpbnQgX3MgPSBzOwogICAgICAgICAgICAgc3dpdGNoICggcyApIHsKICAgICAgICAgICAgICAgICAgICAgY2FzZSAwIDogCi0gICAgICAgICAgICAgICAgICAgICAgICBpbnQgTEE1M18xID0gaW5wdXQuTEEoMSk7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgTEE2NF8xID0gaW5wdXQuTEEoMSk7CiAKICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbmRleDUzXzEgPSBpbnB1dC5pbmRleCgpOworICAgICAgICAgICAgICAgICAgICAgICAgaW50IGluZGV4NjRfMSA9IGlucHV0LmluZGV4KCk7CiAgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dC5yZXdpbmQoKTsKICAgICAgICAgICAgICAgICAgICAgICAgIHMgPSAtMTsKICAgICAgICAgICAgICAgICAgICAgICAgIGlmICggKHN5bnByZWQ2X0ludGVybmFsRGF0YURTTCgpKSApIHtzID0gMzQ7fQpAQCAtMjg1MTEsMTMgKzMwMDQ5LDEzIEBACiAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICggKHRydWUpICkge3MgPSAyO30KIAogICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXQuc2VlayhpbmRleDUzXzEpOworICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXQuc2VlayhpbmRleDY0XzEpOwogICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCBzPj0wICkgcmV0dXJuIHM7CiAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGlmIChzdGF0ZS5iYWNrdHJhY2tpbmc+MCkge3N0YXRlLmZhaWxlZD10cnVlOyByZXR1cm4gLTE7fQogICAgICAgICAgICAgTm9WaWFibGVBbHRFeGNlcHRpb24gbnZhZSA9Ci0gICAgICAgICAgICAgICAgbmV3IE5vVmlhYmxlQWx0RXhjZXB0aW9uKGdldERlc2NyaXB0aW9uKCksIDUzLCBfcywgaW5wdXQpOworICAgICAgICAgICAgICAgIG5ldyBOb1ZpYWJsZUFsdEV4Y2VwdGlvbihnZXREZXNjcmlwdGlvbigpLCA2NCwgX3MsIGlucHV0KTsKICAgICAgICAgICAgIGVycm9yKG52YWUpOwogICAgICAgICAgICAgdGhyb3cgbnZhZTsKICAgICAgICAgfQpAQCAtMjg1MjUsMTEgKzMwMDYzLDExIEBACiAgICAgc3RhdGljIGZpbmFsIFN0cmluZyBkZmFfMjBzID0gIlwxMlx1ZmZmZiI7CiAgICAgc3RhdGljIGZpbmFsIFN0cmluZyBkZmFfMjFzID0gIlwxXDEwXDExXHVmZmZmIjsKICAgICBzdGF0aWMgZmluYWwgU3RyaW5nIGRmYV8yMnMgPSAiXDFcNFw3XDBcMlx1ZmZmZiI7Ci0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBkZmFfMjNzID0gIlwxXHUwMDg3XDdcMFwyXHVmZmZmIjsKKyAgICBzdGF0aWMgZmluYWwgU3RyaW5nIGRmYV8yM3MgPSAiXDFcdTAwOGVcN1wwXDJcdWZmZmYiOwogICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgZGZhXzI0cyA9ICJcMTBcdWZmZmZcMVwyXDFcMSI7CiAgICAgc3RhdGljIGZpbmFsIFN0cmluZyBkZmFfMjVzID0gIlwxXHVmZmZmXDFcMFwxXDFcMVwyXDFcM1wxXDRcMVw1XDFcNlwyXHVmZmZmfT4iOwogICAgIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBkZmFfMjZzID0gewotICAgICAgICAgICAgIlw1XDEwXDZcdWZmZmZcMlwxMFwzNVx1ZmZmZlwxXDEwXDE2XHVmZmZmXDFcMTBcM1x1ZmZmZlwxXDEwXDFcdWZmZmZcNFwxMFwxXHVmZmZmXDFcMTBcMVx1ZmZmZlwzXDEwXDFcdWZmZmZcM1wxMFwxXDFcMVwyXDFcM1wxXDRcMVw1XDFcNlwxXDdcMzBcMTBcMVx1ZmZmZlwyN1wxMCIsCisgICAgICAgICAgICAiXDVcMTBcNlx1ZmZmZlwyXDEwXDQxXHVmZmZmXDFcMTBcMjFcdWZmZmZcMVwxMFwzXHVmZmZmXDFcMTBcMVx1ZmZmZlw0XDEwXDFcdWZmZmZcMVwxMFwxXHVmZmZmXDNcMTBcMVx1ZmZmZlwzXDEwXDFcMVwxXDJcMVwzXDFcNFwxXDVcMVw2XDFcN1wzMFwxMFwxXHVmZmZmXDI3XDEwIiwKICAgICAgICAgICAgICJcMVx1ZmZmZiIsCiAgICAgICAgICAgICAiXDFcdWZmZmYiLAogICAgICAgICAgICAgIlwxXHVmZmZmIiwKQEAgLTI4NTQ5LDExICszMDA4NywxMSBAQAogICAgIHN0YXRpYyBmaW5hbCBzaG9ydFtdIGRmYV8yNSA9IERGQS51bnBhY2tFbmNvZGVkU3RyaW5nKGRmYV8yNXMpOwogICAgIHN0YXRpYyBmaW5hbCBzaG9ydFtdW10gZGZhXzI2ID0gdW5wYWNrRW5jb2RlZFN0cmluZ0FycmF5KGRmYV8yNnMpOwogCi0gICAgY2xhc3MgREZBNTUgZXh0ZW5kcyBERkEgeworICAgIGNsYXNzIERGQTY2IGV4dGVuZHMgREZBIHsKIAotICAgICAgICBwdWJsaWMgREZBNTUoQmFzZVJlY29nbml6ZXIgcmVjb2duaXplcikgeworICAgICAgICBwdWJsaWMgREZBNjYoQmFzZVJlY29nbml6ZXIgcmVjb2duaXplcikgewogICAgICAgICAgICAgdGhpcy5yZWNvZ25pemVyID0gcmVjb2duaXplcjsKLSAgICAgICAgICAgIHRoaXMuZGVjaXNpb25OdW1iZXIgPSA1NTsKKyAgICAgICAgICAgIHRoaXMuZGVjaXNpb25OdW1iZXIgPSA2NjsKICAgICAgICAgICAgIHRoaXMuZW90ID0gZGZhXzIwOwogICAgICAgICAgICAgdGhpcy5lb2YgPSBkZmFfMjE7CiAgICAgICAgICAgICB0aGlzLm1pbiA9IGRmYV8yMjsKQEAgLTI4NTYzLDE3ICszMDEwMSwxNyBAQAogICAgICAgICAgICAgdGhpcy50cmFuc2l0aW9uID0gZGZhXzI2OwogICAgICAgICB9CiAgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0RGVzY3JpcHRpb24oKSB7Ci0gICAgICAgICAgICByZXR1cm4gIjMxNjQ6NDogKCAoICggKCAoKSAoICggcnVsZU9wTXVsdGlBc3NpZ24gKSApICkgKT0+ICggKCkgKCAoIHJ1bGVPcE11bHRpQXNzaWduICkgKSApICkgKCAobHZfcmlnaHRPcGVyYW5kXzdfMD0gcnVsZVhBc3NpZ25tZW50ICkgKSApPyI7CisgICAgICAgICAgICByZXR1cm4gIjM2MDM6NDogKCAoICggKCAoKSAoICggcnVsZU9wTXVsdGlBc3NpZ24gKSApICkgKT0+ICggKCkgKCAoIHJ1bGVPcE11bHRpQXNzaWduICkgKSApICkgKCAobHZfcmlnaHRPcGVyYW5kXzdfMD0gcnVsZVhBc3NpZ25tZW50ICkgKSApPyI7CiAgICAgICAgIH0KICAgICAgICAgcHVibGljIGludCBzcGVjaWFsU3RhdGVUcmFuc2l0aW9uKGludCBzLCBJbnRTdHJlYW0gX2lucHV0KSB0aHJvd3MgTm9WaWFibGVBbHRFeGNlcHRpb24gewogICAgICAgICAgICAgVG9rZW5TdHJlYW0gaW5wdXQgPSAoVG9rZW5TdHJlYW0pX2lucHV0OwogICAgICAgICAJaW50IF9zID0gczsKICAgICAgICAgICAgIHN3aXRjaCAoIHMgKSB7CiAgICAgICAgICAgICAgICAgICAgIGNhc2UgMCA6IAotICAgICAgICAgICAgICAgICAgICAgICAgaW50IExBNTVfMSA9IGlucHV0LkxBKDEpOworICAgICAgICAgICAgICAgICAgICAgICAgaW50IExBNjZfMSA9IGlucHV0LkxBKDEpOwogCiAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW5kZXg1NV8xID0gaW5wdXQuaW5kZXgoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbmRleDY2XzEgPSBpbnB1dC5pbmRleCgpOwogICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXQucmV3aW5kKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICBzID0gLTE7CiAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIChzeW5wcmVkN19JbnRlcm5hbERhdGFEU0woKSkgKSB7cyA9IDk7fQpAQCAtMjg1ODEsMTQgKzMwMTE5LDE0IEBACiAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICggKHRydWUpICkge3MgPSA4O30KIAogICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXQuc2VlayhpbmRleDU1XzEpOworICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXQuc2VlayhpbmRleDY2XzEpOwogICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCBzPj0wICkgcmV0dXJuIHM7CiAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgY2FzZSAxIDogCi0gICAgICAgICAgICAgICAgICAgICAgICBpbnQgTEE1NV8yID0gaW5wdXQuTEEoMSk7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgTEE2Nl8yID0gaW5wdXQuTEEoMSk7CiAKICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbmRleDU1XzIgPSBpbnB1dC5pbmRleCgpOworICAgICAgICAgICAgICAgICAgICAgICAgaW50IGluZGV4NjZfMiA9IGlucHV0LmluZGV4KCk7CiAgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dC5yZXdpbmQoKTsKICAgICAgICAgICAgICAgICAgICAgICAgIHMgPSAtMTsKICAgICAgICAgICAgICAgICAgICAgICAgIGlmICggKHN5bnByZWQ3X0ludGVybmFsRGF0YURTTCgpKSApIHtzID0gOTt9CkBAIC0yODU5NiwxNCArMzAxMzQsMTQgQEAKICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKCAodHJ1ZSkgKSB7cyA9IDg7fQogCiAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICBpbnB1dC5zZWVrKGluZGV4NTVfMik7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dC5zZWVrKGluZGV4NjZfMik7CiAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIHM+PTAgKSByZXR1cm4gczsKICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICBjYXNlIDIgOiAKLSAgICAgICAgICAgICAgICAgICAgICAgIGludCBMQTU1XzMgPSBpbnB1dC5MQSgxKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBMQTY2XzMgPSBpbnB1dC5MQSgxKTsKIAogICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgaW50IGluZGV4NTVfMyA9IGlucHV0LmluZGV4KCk7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW5kZXg2Nl8zID0gaW5wdXQuaW5kZXgoKTsKICAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0LnJld2luZCgpOwogICAgICAgICAgICAgICAgICAgICAgICAgcyA9IC0xOwogICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCAoc3lucHJlZDdfSW50ZXJuYWxEYXRhRFNMKCkpICkge3MgPSA5O30KQEAgLTI4NjExLDE0ICszMDE0OSwxNCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoICh0cnVlKSApIHtzID0gODt9CiAKICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0LnNlZWsoaW5kZXg1NV8zKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0LnNlZWsoaW5kZXg2Nl8zKTsKICAgICAgICAgICAgICAgICAgICAgICAgIGlmICggcz49MCApIHJldHVybiBzOwogICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgIGNhc2UgMyA6IAotICAgICAgICAgICAgICAgICAgICAgICAgaW50IExBNTVfNCA9IGlucHV0LkxBKDEpOworICAgICAgICAgICAgICAgICAgICAgICAgaW50IExBNjZfNCA9IGlucHV0LkxBKDEpOwogCiAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW5kZXg1NV80ID0gaW5wdXQuaW5kZXgoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbmRleDY2XzQgPSBpbnB1dC5pbmRleCgpOwogICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXQucmV3aW5kKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICBzID0gLTE7CiAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIChzeW5wcmVkN19JbnRlcm5hbERhdGFEU0woKSkgKSB7cyA9IDk7fQpAQCAtMjg2MjYsMTQgKzMwMTY0LDE0IEBACiAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICggKHRydWUpICkge3MgPSA4O30KIAogICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXQuc2VlayhpbmRleDU1XzQpOworICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXQuc2VlayhpbmRleDY2XzQpOwogICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCBzPj0wICkgcmV0dXJuIHM7CiAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgY2FzZSA0IDogCi0gICAgICAgICAgICAgICAgICAgICAgICBpbnQgTEE1NV81ID0gaW5wdXQuTEEoMSk7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgTEE2Nl81ID0gaW5wdXQuTEEoMSk7CiAKICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbmRleDU1XzUgPSBpbnB1dC5pbmRleCgpOworICAgICAgICAgICAgICAgICAgICAgICAgaW50IGluZGV4NjZfNSA9IGlucHV0LmluZGV4KCk7CiAgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dC5yZXdpbmQoKTsKICAgICAgICAgICAgICAgICAgICAgICAgIHMgPSAtMTsKICAgICAgICAgICAgICAgICAgICAgICAgIGlmICggKHN5bnByZWQ3X0ludGVybmFsRGF0YURTTCgpKSApIHtzID0gOTt9CkBAIC0yODY0MSwxNCArMzAxNzksMTQgQEAKICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKCAodHJ1ZSkgKSB7cyA9IDg7fQogCiAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICBpbnB1dC5zZWVrKGluZGV4NTVfNSk7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dC5zZWVrKGluZGV4NjZfNSk7CiAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIHM+PTAgKSByZXR1cm4gczsKICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICBjYXNlIDUgOiAKLSAgICAgICAgICAgICAgICAgICAgICAgIGludCBMQTU1XzYgPSBpbnB1dC5MQSgxKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBMQTY2XzYgPSBpbnB1dC5MQSgxKTsKIAogICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgaW50IGluZGV4NTVfNiA9IGlucHV0LmluZGV4KCk7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW5kZXg2Nl82ID0gaW5wdXQuaW5kZXgoKTsKICAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0LnJld2luZCgpOwogICAgICAgICAgICAgICAgICAgICAgICAgcyA9IC0xOwogICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCAoc3lucHJlZDdfSW50ZXJuYWxEYXRhRFNMKCkpICkge3MgPSA5O30KQEAgLTI4NjU2LDE0ICszMDE5NCwxNCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoICh0cnVlKSApIHtzID0gODt9CiAKICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0LnNlZWsoaW5kZXg1NV82KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0LnNlZWsoaW5kZXg2Nl82KTsKICAgICAgICAgICAgICAgICAgICAgICAgIGlmICggcz49MCApIHJldHVybiBzOwogICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgIGNhc2UgNiA6IAotICAgICAgICAgICAgICAgICAgICAgICAgaW50IExBNTVfNyA9IGlucHV0LkxBKDEpOworICAgICAgICAgICAgICAgICAgICAgICAgaW50IExBNjZfNyA9IGlucHV0LkxBKDEpOwogCiAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW5kZXg1NV83ID0gaW5wdXQuaW5kZXgoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbmRleDY2XzcgPSBpbnB1dC5pbmRleCgpOwogICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXQucmV3aW5kKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICBzID0gLTE7CiAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIChzeW5wcmVkN19JbnRlcm5hbERhdGFEU0woKSkgKSB7cyA9IDk7fQpAQCAtMjg2NzEsMTMgKzMwMjA5LDEzIEBACiAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICggKHRydWUpICkge3MgPSA4O30KIAogICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXQuc2VlayhpbmRleDU1XzcpOworICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXQuc2VlayhpbmRleDY2XzcpOwogICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCBzPj0wICkgcmV0dXJuIHM7CiAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGlmIChzdGF0ZS5iYWNrdHJhY2tpbmc+MCkge3N0YXRlLmZhaWxlZD10cnVlOyByZXR1cm4gLTE7fQogICAgICAgICAgICAgTm9WaWFibGVBbHRFeGNlcHRpb24gbnZhZSA9Ci0gICAgICAgICAgICAgICAgbmV3IE5vVmlhYmxlQWx0RXhjZXB0aW9uKGdldERlc2NyaXB0aW9uKCksIDU1LCBfcywgaW5wdXQpOworICAgICAgICAgICAgICAgIG5ldyBOb1ZpYWJsZUFsdEV4Y2VwdGlvbihnZXREZXNjcmlwdGlvbigpLCA2NiwgX3MsIGlucHV0KTsKICAgICAgICAgICAgIGVycm9yKG52YWUpOwogICAgICAgICAgICAgdGhyb3cgbnZhZTsKICAgICAgICAgfQpAQCAtMjg2ODUsMTEgKzMwMjIzLDExIEBACiAgICAgc3RhdGljIGZpbmFsIFN0cmluZyBkZmFfMjdzID0gIlwxM1x1ZmZmZiI7CiAgICAgc3RhdGljIGZpbmFsIFN0cmluZyBkZmFfMjhzID0gIlwxXDFcMTJcdWZmZmYiOwogICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgZGZhXzI5cyA9ICJcMVw0XDFcdWZmZmZcMTBcMFwxXHVmZmZmIjsKLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIGRmYV8zMHMgPSAiXDFcdTAwODdcMVx1ZmZmZlwxMFwwXDFcdWZmZmYiOworICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgZGZhXzMwcyA9ICJcMVx1MDA4ZVwxXHVmZmZmXDEwXDBcMVx1ZmZmZiI7CiAgICAgc3RhdGljIGZpbmFsIFN0cmluZyBkZmFfMzFzID0gIlwxXHVmZmZmXDFcMlwxMFx1ZmZmZlwxXDEiOwotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgZGZhXzMycyA9ICJcMlx1ZmZmZlwxXDVcMVwzXDFcNlwxXDdcMVw0XDFcMFwxXDFcMVwyXDFcdWZmZmZ9PiI7CisgICAgc3RhdGljIGZpbmFsIFN0cmluZyBkZmFfMzJzID0gIlwyXHVmZmZmXDFcNVwxXDFcMVw2XDFcN1wxXDRcMVwwXDFcMlwxXDNcMVx1ZmZmZn0+IjsKICAgICBzdGF0aWMgZmluYWwgU3RyaW5nW10gZGZhXzMzcyA9IHsKLSAgICAgICAgICAgICJcNVwxXDZcdWZmZmZcMlwxXDM1XHVmZmZmXDFcMVwxNlx1ZmZmZlwxXDFcM1x1ZmZmZlwxXDFcMVx1ZmZmZlw0XDFcMVx1ZmZmZlwxXDFcMVx1ZmZmZlwzXDFcMVx1ZmZmZlwxMFwxXDFcMlwxXDNcMTBcMVwxXDRcMVw1XDFcNlwxXDdcMVwxMFwxXDExXDEyXDFcMVx1ZmZmZlwyN1wxIiwKKyAgICAgICAgICAgICJcNVwxXDZcdWZmZmZcMlwxXDQxXHVmZmZmXDFcMVwyMVx1ZmZmZlwxXDFcM1x1ZmZmZlwxXDFcMVx1ZmZmZlw0XDFcMVx1ZmZmZlwxXDFcMVx1ZmZmZlwzXDFcMVx1ZmZmZlwxMFwxXDFcMlwxXDNcMTBcMVwxXDRcMVw1XDFcNlwxXDdcMVwxMFwxXDExXDEyXDFcMVx1ZmZmZlwyN1wxIiwKICAgICAgICAgICAgICIiLAogICAgICAgICAgICAgIlwxXHVmZmZmIiwKICAgICAgICAgICAgICJcMVx1ZmZmZiIsCkBAIC0yODcxMCwxMSArMzAyNDgsMTEgQEAKICAgICBzdGF0aWMgZmluYWwgc2hvcnRbXSBkZmFfMzIgPSBERkEudW5wYWNrRW5jb2RlZFN0cmluZyhkZmFfMzJzKTsKICAgICBzdGF0aWMgZmluYWwgc2hvcnRbXVtdIGRmYV8zMyA9IHVucGFja0VuY29kZWRTdHJpbmdBcnJheShkZmFfMzNzKTsKIAotICAgIGNsYXNzIERGQTY1IGV4dGVuZHMgREZBIHsKKyAgICBjbGFzcyBERkE3NiBleHRlbmRzIERGQSB7CiAKLSAgICAgICAgcHVibGljIERGQTY1KEJhc2VSZWNvZ25pemVyIHJlY29nbml6ZXIpIHsKKyAgICAgICAgcHVibGljIERGQTc2KEJhc2VSZWNvZ25pemVyIHJlY29nbml6ZXIpIHsKICAgICAgICAgICAgIHRoaXMucmVjb2duaXplciA9IHJlY29nbml6ZXI7Ci0gICAgICAgICAgICB0aGlzLmRlY2lzaW9uTnVtYmVyID0gNjU7CisgICAgICAgICAgICB0aGlzLmRlY2lzaW9uTnVtYmVyID0gNzY7CiAgICAgICAgICAgICB0aGlzLmVvdCA9IGRmYV8yNzsKICAgICAgICAgICAgIHRoaXMuZW9mID0gZGZhXzI4OwogICAgICAgICAgICAgdGhpcy5taW4gPSBkZmFfMjk7CkBAIC0yODcyNCwxNyArMzAyNjIsMTcgQEAKICAgICAgICAgICAgIHRoaXMudHJhbnNpdGlvbiA9IGRmYV8zMzsKICAgICAgICAgfQogICAgICAgICBwdWJsaWMgU3RyaW5nIGdldERlc2NyaXB0aW9uKCkgewotICAgICAgICAgICAgcmV0dXJuICIoKSogbG9vcGJhY2sgb2YgMzg3ODozOiAoICggKCAoICgpICggKCBydWxlT3BPdGhlciApICkgKSApPT4gKCAoKSAoICggcnVsZU9wT3RoZXIgKSApICkgKSAoIChsdl9yaWdodE9wZXJhbmRfM18wPSBydWxlWEFkZGl0aXZlRXhwcmVzc2lvbiApICkgKSoiOworICAgICAgICAgICAgcmV0dXJuICIoKSogbG9vcGJhY2sgb2YgNDMxNzozOiAoICggKCAoICgpICggKCBydWxlT3BPdGhlciApICkgKSApPT4gKCAoKSAoICggcnVsZU9wT3RoZXIgKSApICkgKSAoIChsdl9yaWdodE9wZXJhbmRfM18wPSBydWxlWEFkZGl0aXZlRXhwcmVzc2lvbiApICkgKSoiOwogICAgICAgICB9CiAgICAgICAgIHB1YmxpYyBpbnQgc3BlY2lhbFN0YXRlVHJhbnNpdGlvbihpbnQgcywgSW50U3RyZWFtIF9pbnB1dCkgdGhyb3dzIE5vVmlhYmxlQWx0RXhjZXB0aW9uIHsKICAgICAgICAgICAgIFRva2VuU3RyZWFtIGlucHV0ID0gKFRva2VuU3RyZWFtKV9pbnB1dDsKICAgICAgICAgCWludCBfcyA9IHM7CiAgICAgICAgICAgICBzd2l0Y2ggKCBzICkgewogICAgICAgICAgICAgICAgICAgICBjYXNlIDAgOiAKLSAgICAgICAgICAgICAgICAgICAgICAgIGludCBMQTY1XzcgPSBpbnB1dC5MQSgxKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBMQTc2XzcgPSBpbnB1dC5MQSgxKTsKIAogICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgaW50IGluZGV4NjVfNyA9IGlucHV0LmluZGV4KCk7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW5kZXg3Nl83ID0gaW5wdXQuaW5kZXgoKTsKICAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0LnJld2luZCgpOwogICAgICAgICAgICAgICAgICAgICAgICAgcyA9IC0xOwogICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCAoc3lucHJlZDEzX0ludGVybmFsRGF0YURTTCgpKSApIHtzID0gMTA7fQpAQCAtMjg3NDIsMTQgKzMwMjgwLDE0IEBACiAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICggKHRydWUpICkge3MgPSAxO30KIAogICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXQuc2VlayhpbmRleDY1XzcpOworICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXQuc2VlayhpbmRleDc2XzcpOwogICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCBzPj0wICkgcmV0dXJuIHM7CiAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgY2FzZSAxIDogCi0gICAgICAgICAgICAgICAgICAgICAgICBpbnQgTEE2NV84ID0gaW5wdXQuTEEoMSk7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgTEE3Nl8zID0gaW5wdXQuTEEoMSk7CiAKICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbmRleDY1XzggPSBpbnB1dC5pbmRleCgpOworICAgICAgICAgICAgICAgICAgICAgICAgaW50IGluZGV4NzZfMyA9IGlucHV0LmluZGV4KCk7CiAgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dC5yZXdpbmQoKTsKICAgICAgICAgICAgICAgICAgICAgICAgIHMgPSAtMTsKICAgICAgICAgICAgICAgICAgICAgICAgIGlmICggKHN5bnByZWQxM19JbnRlcm5hbERhdGFEU0woKSkgKSB7cyA9IDEwO30KQEAgLTI4NzU3LDE0ICszMDI5NSwxNCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoICh0cnVlKSApIHtzID0gMTt9CiAKICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0LnNlZWsoaW5kZXg2NV84KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0LnNlZWsoaW5kZXg3Nl8zKTsKICAgICAgICAgICAgICAgICAgICAgICAgIGlmICggcz49MCApIHJldHVybiBzOwogICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgIGNhc2UgMiA6IAotICAgICAgICAgICAgICAgICAgICAgICAgaW50IExBNjVfOSA9IGlucHV0LkxBKDEpOworICAgICAgICAgICAgICAgICAgICAgICAgaW50IExBNzZfOCA9IGlucHV0LkxBKDEpOwogCiAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW5kZXg2NV85ID0gaW5wdXQuaW5kZXgoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbmRleDc2XzggPSBpbnB1dC5pbmRleCgpOwogICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXQucmV3aW5kKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICBzID0gLTE7CiAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIChzeW5wcmVkMTNfSW50ZXJuYWxEYXRhRFNMKCkpICkge3MgPSAxMDt9CkBAIC0yODc3MiwxNCArMzAzMTAsMTQgQEAKICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKCAodHJ1ZSkgKSB7cyA9IDE7fQogCiAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICBpbnB1dC5zZWVrKGluZGV4NjVfOSk7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dC5zZWVrKGluZGV4NzZfOCk7CiAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIHM+PTAgKSByZXR1cm4gczsKICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICBjYXNlIDMgOiAKLSAgICAgICAgICAgICAgICAgICAgICAgIGludCBMQTY1XzMgPSBpbnB1dC5MQSgxKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBMQTc2XzkgPSBpbnB1dC5MQSgxKTsKIAogICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgaW50IGluZGV4NjVfMyA9IGlucHV0LmluZGV4KCk7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW5kZXg3Nl85ID0gaW5wdXQuaW5kZXgoKTsKICAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0LnJld2luZCgpOwogICAgICAgICAgICAgICAgICAgICAgICAgcyA9IC0xOwogICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCAoc3lucHJlZDEzX0ludGVybmFsRGF0YURTTCgpKSApIHtzID0gMTA7fQpAQCAtMjg3ODcsMTQgKzMwMzI1LDE0IEBACiAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICggKHRydWUpICkge3MgPSAxO30KIAogICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXQuc2VlayhpbmRleDY1XzMpOworICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXQuc2VlayhpbmRleDc2XzkpOwogICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCBzPj0wICkgcmV0dXJuIHM7CiAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgY2FzZSA0IDogCi0gICAgICAgICAgICAgICAgICAgICAgICBpbnQgTEE2NV82ID0gaW5wdXQuTEEoMSk7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgTEE3Nl82ID0gaW5wdXQuTEEoMSk7CiAKICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbmRleDY1XzYgPSBpbnB1dC5pbmRleCgpOworICAgICAgICAgICAgICAgICAgICAgICAgaW50IGluZGV4NzZfNiA9IGlucHV0LmluZGV4KCk7CiAgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dC5yZXdpbmQoKTsKICAgICAgICAgICAgICAgICAgICAgICAgIHMgPSAtMTsKICAgICAgICAgICAgICAgICAgICAgICAgIGlmICggKHN5bnByZWQxM19JbnRlcm5hbERhdGFEU0woKSkgKSB7cyA9IDEwO30KQEAgLTI4ODAyLDE0ICszMDM0MCwxNCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoICh0cnVlKSApIHtzID0gMTt9CiAKICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0LnNlZWsoaW5kZXg2NV82KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0LnNlZWsoaW5kZXg3Nl82KTsKICAgICAgICAgICAgICAgICAgICAgICAgIGlmICggcz49MCApIHJldHVybiBzOwogICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgIGNhc2UgNSA6IAotICAgICAgICAgICAgICAgICAgICAgICAgaW50IExBNjVfMiA9IGlucHV0LkxBKDEpOworICAgICAgICAgICAgICAgICAgICAgICAgaW50IExBNzZfMiA9IGlucHV0LkxBKDEpOwogCiAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW5kZXg2NV8yID0gaW5wdXQuaW5kZXgoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbmRleDc2XzIgPSBpbnB1dC5pbmRleCgpOwogICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXQucmV3aW5kKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICBzID0gLTE7CiAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIChzeW5wcmVkMTNfSW50ZXJuYWxEYXRhRFNMKCkpICkge3MgPSAxMDt9CkBAIC0yODgxNywxNCArMzAzNTUsMTQgQEAKICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKCAodHJ1ZSkgKSB7cyA9IDE7fQogCiAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICBpbnB1dC5zZWVrKGluZGV4NjVfMik7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dC5zZWVrKGluZGV4NzZfMik7CiAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIHM+PTAgKSByZXR1cm4gczsKICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICBjYXNlIDYgOiAKLSAgICAgICAgICAgICAgICAgICAgICAgIGludCBMQTY1XzQgPSBpbnB1dC5MQSgxKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBMQTc2XzQgPSBpbnB1dC5MQSgxKTsKIAogICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgaW50IGluZGV4NjVfNCA9IGlucHV0LmluZGV4KCk7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW5kZXg3Nl80ID0gaW5wdXQuaW5kZXgoKTsKICAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0LnJld2luZCgpOwogICAgICAgICAgICAgICAgICAgICAgICAgcyA9IC0xOwogICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCAoc3lucHJlZDEzX0ludGVybmFsRGF0YURTTCgpKSApIHtzID0gMTA7fQpAQCAtMjg4MzIsMTQgKzMwMzcwLDE0IEBACiAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICggKHRydWUpICkge3MgPSAxO30KIAogICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXQuc2VlayhpbmRleDY1XzQpOworICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXQuc2VlayhpbmRleDc2XzQpOwogICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCBzPj0wICkgcmV0dXJuIHM7CiAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgY2FzZSA3IDogCi0gICAgICAgICAgICAgICAgICAgICAgICBpbnQgTEE2NV81ID0gaW5wdXQuTEEoMSk7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgTEE3Nl81ID0gaW5wdXQuTEEoMSk7CiAKICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbmRleDY1XzUgPSBpbnB1dC5pbmRleCgpOworICAgICAgICAgICAgICAgICAgICAgICAgaW50IGluZGV4NzZfNSA9IGlucHV0LmluZGV4KCk7CiAgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dC5yZXdpbmQoKTsKICAgICAgICAgICAgICAgICAgICAgICAgIHMgPSAtMTsKICAgICAgICAgICAgICAgICAgICAgICAgIGlmICggKHN5bnByZWQxM19JbnRlcm5hbERhdGFEU0woKSkgKSB7cyA9IDEwO30KQEAgLTI4ODQ3LDE5ICszMDM4NSwxOSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoICh0cnVlKSApIHtzID0gMTt9CiAKICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0LnNlZWsoaW5kZXg2NV81KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0LnNlZWsoaW5kZXg3Nl81KTsKICAgICAgICAgICAgICAgICAgICAgICAgIGlmICggcz49MCApIHJldHVybiBzOwogICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBpZiAoc3RhdGUuYmFja3RyYWNraW5nPjApIHtzdGF0ZS5mYWlsZWQ9dHJ1ZTsgcmV0dXJuIC0xO30KICAgICAgICAgICAgIE5vVmlhYmxlQWx0RXhjZXB0aW9uIG52YWUgPQotICAgICAgICAgICAgICAgIG5ldyBOb1ZpYWJsZUFsdEV4Y2VwdGlvbihnZXREZXNjcmlwdGlvbigpLCA2NSwgX3MsIGlucHV0KTsKKyAgICAgICAgICAgICAgICBuZXcgTm9WaWFibGVBbHRFeGNlcHRpb24oZ2V0RGVzY3JpcHRpb24oKSwgNzYsIF9zLCBpbnB1dCk7CiAgICAgICAgICAgICBlcnJvcihudmFlKTsKICAgICAgICAgICAgIHRocm93IG52YWU7CiAgICAgICAgIH0KICAgICB9Ci0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBkZmFfMzRzID0gIlwxXDEyNlwyXHVmZmZmXDFcMTI3XDdcdWZmZmYiOwotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgZGZhXzM1cyA9ICJcMVwxNDVcMlx1ZmZmZlwxXDE0Mlw3XHVmZmZmIjsKKyAgICBzdGF0aWMgZmluYWwgU3RyaW5nIGRmYV8zNHMgPSAiXDFcMTM1XDJcdWZmZmZcMVwxMzZcN1x1ZmZmZiI7CisgICAgc3RhdGljIGZpbmFsIFN0cmluZyBkZmFfMzVzID0gIlwxXDE1NFwyXHVmZmZmXDFcMTUxXDdcdWZmZmYiOwogICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgZGZhXzM2cyA9ICJcMVx1ZmZmZlwxXDFcMVwyXDFcdWZmZmZcMVw0XDFcNVwxXDdcMVwxMFwxXDExXDFcM1wxXDYiOwogICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgZGZhXzM3cyA9ICJcMTNcdWZmZmZ9PiI7CiAgICAgc3RhdGljIGZpbmFsIFN0cmluZ1tdIGRmYV8zOHMgPSB7CkBAIC0yODg4MSwxMSArMzA0MTksMTEgQEAKICAgICBzdGF0aWMgZmluYWwgc2hvcnRbXSBkZmFfMzcgPSBERkEudW5wYWNrRW5jb2RlZFN0cmluZyhkZmFfMzdzKTsKICAgICBzdGF0aWMgZmluYWwgc2hvcnRbXVtdIGRmYV8zOCA9IHVucGFja0VuY29kZWRTdHJpbmdBcnJheShkZmFfMzhzKTsKIAotICAgIGNsYXNzIERGQTY4IGV4dGVuZHMgREZBIHsKKyAgICBjbGFzcyBERkE3OSBleHRlbmRzIERGQSB7CiAKLSAgICAgICAgcHVibGljIERGQTY4KEJhc2VSZWNvZ25pemVyIHJlY29nbml6ZXIpIHsKKyAgICAgICAgcHVibGljIERGQTc5KEJhc2VSZWNvZ25pemVyIHJlY29nbml6ZXIpIHsKICAgICAgICAgICAgIHRoaXMucmVjb2duaXplciA9IHJlY29nbml6ZXI7Ci0gICAgICAgICAgICB0aGlzLmRlY2lzaW9uTnVtYmVyID0gNjg7CisgICAgICAgICAgICB0aGlzLmRlY2lzaW9uTnVtYmVyID0gNzk7CiAgICAgICAgICAgICB0aGlzLmVvdCA9IGRmYV8yNzsKICAgICAgICAgICAgIHRoaXMuZW9mID0gZGZhXzI3OwogICAgICAgICAgICAgdGhpcy5taW4gPSBkZmFfMzQ7CkBAIC0yODg5NSwxNyArMzA0MzMsMTcgQEAKICAgICAgICAgICAgIHRoaXMudHJhbnNpdGlvbiA9IGRmYV8zODsKICAgICAgICAgfQogICAgICAgICBwdWJsaWMgU3RyaW5nIGdldERlc2NyaXB0aW9uKCkgewotICAgICAgICAgICAgcmV0dXJuICIzOTU0OjI6IChrdz0gJy0+JyB8IGt3PSAnLi48JyB8IChrdz0gJz4nIGt3PSAnLi4nICkgfCBrdz0gJy4uJyB8IGt3PSAnPT4nIHwgKGt3PSAnPicgKCAoICggKCAnPicgJz4nICkgKT0+IChrdz0gJz4nIGt3PSAnPicgKSApIHwga3c9ICc+JyApICkgfCAoa3c9ICc8JyAoICggKCAoICc8JyAnPCcgKSApPT4gKGt3PSAnPCcga3c9ICc8JyApICkgfCBrdz0gJzwnIHwga3c9ICc9PicgKSApIHwga3c9ICc8PicgfCBrdz0gJz86JyApIjsKKyAgICAgICAgICAgIHJldHVybiAiNDM5MzoyOiAoa3c9ICctPicgfCBrdz0gJy4uPCcgfCAoa3c9ICc+JyBrdz0gJy4uJyApIHwga3c9ICcuLicgfCBrdz0gJz0+JyB8IChrdz0gJz4nICggKCAoICggJz4nICc+JyApICk9PiAoa3c9ICc+JyBrdz0gJz4nICkgKSB8IGt3PSAnPicgKSApIHwgKGt3PSAnPCcgKCAoICggKCAnPCcgJzwnICkgKT0+IChrdz0gJzwnIGt3PSAnPCcgKSApIHwga3c9ICc8JyB8IGt3PSAnPT4nICkgKSB8IGt3PSAnPD4nIHwga3c9ICc/OicgKSI7CiAgICAgICAgIH0KICAgICB9CiAgICAgc3RhdGljIGZpbmFsIFN0cmluZyBkZmFfMzlzID0gIlwxMTZcdWZmZmYiOwogICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgZGZhXzQwcyA9ICJcMVwyXDExNVx1ZmZmZiI7CiAgICAgc3RhdGljIGZpbmFsIFN0cmluZyBkZmFfNDFzID0gIlwxXDRcMVwwXDExNFx1ZmZmZiI7Ci0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBkZmFfNDJzID0gIlwxXHUwMDg3XDFcMFwxMTRcdWZmZmYiOworICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgZGZhXzQycyA9ICJcMVx1MDA4ZVwxXDBcMTE0XHVmZmZmIjsKICAgICBzdGF0aWMgZmluYWwgU3RyaW5nIGRmYV80M3MgPSAiXDJcdWZmZmZcMVwyXDExMlx1ZmZmZlwxXDEiOwogICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgZGZhXzQ0cyA9ICJcMVx1ZmZmZlwxXDBcMTE0XHVmZmZmfT4iOwogICAgIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBkZmFfNDVzID0gewotICAgICAgICAgICAgIlw1XDJcNlx1ZmZmZlwyXDJcMzVcdWZmZmZcMVwyXDE2XHVmZmZmXDFcMlwzXHVmZmZmXDFcMlwxXHVmZmZmXDRcMlwxXHVmZmZmXDFcMlwxXHVmZmZmXDFcMVwyXDJcMVx1ZmZmZlw0MlwyXDFcdWZmZmZcMjdcMiIsCisgICAgICAgICAgICAiXDVcMlw2XHVmZmZmXDJcMlw0MVx1ZmZmZlwxXDJcMjFcdWZmZmZcMVwyXDNcdWZmZmZcMVwyXDFcdWZmZmZcNFwyXDFcdWZmZmZcMVwyXDFcdWZmZmZcMVwxXDJcMlwxXHVmZmZmXDQyXDJcMVx1ZmZmZlwyN1wyIiwKICAgICAgICAgICAgICJcMVx1ZmZmZiIsCiAgICAgICAgICAgICAiIiwKICAgICAgICAgICAgICIiLApAQCAtMjg5OTMsMTEgKzMwNTMxLDExIEBACiAgICAgc3RhdGljIGZpbmFsIHNob3J0W10gZGZhXzQ0ID0gREZBLnVucGFja0VuY29kZWRTdHJpbmcoZGZhXzQ0cyk7CiAgICAgc3RhdGljIGZpbmFsIHNob3J0W11bXSBkZmFfNDUgPSB1bnBhY2tFbmNvZGVkU3RyaW5nQXJyYXkoZGZhXzQ1cyk7CiAKLSAgICBjbGFzcyBERkE4NCBleHRlbmRzIERGQSB7CisgICAgY2xhc3MgREZBOTUgZXh0ZW5kcyBERkEgewogCi0gICAgICAgIHB1YmxpYyBERkE4NChCYXNlUmVjb2duaXplciByZWNvZ25pemVyKSB7CisgICAgICAgIHB1YmxpYyBERkE5NShCYXNlUmVjb2duaXplciByZWNvZ25pemVyKSB7CiAgICAgICAgICAgICB0aGlzLnJlY29nbml6ZXIgPSByZWNvZ25pemVyOwotICAgICAgICAgICAgdGhpcy5kZWNpc2lvbk51bWJlciA9IDg0OworICAgICAgICAgICAgdGhpcy5kZWNpc2lvbk51bWJlciA9IDk1OwogICAgICAgICAgICAgdGhpcy5lb3QgPSBkZmFfMzk7CiAgICAgICAgICAgICB0aGlzLmVvZiA9IGRmYV80MDsKICAgICAgICAgICAgIHRoaXMubWluID0gZGZhXzQxOwpAQCAtMjkwMDcsMTcgKzMwNTQ1LDE3IEBACiAgICAgICAgICAgICB0aGlzLnRyYW5zaXRpb24gPSBkZmFfNDU7CiAgICAgICAgIH0KICAgICAgICAgcHVibGljIFN0cmluZyBnZXREZXNjcmlwdGlvbigpIHsKLSAgICAgICAgICAgIHJldHVybiAiNDg1NTo1OiAoICggKCAoICcoJyApICk9PiAobHZfZXhwbGljaXRPcGVyYXRpb25DYWxsXzE3XzA9ICcoJyApICkgKCAoICggKCAoKSAoICggKCBydWxlSnZtRm9ybWFsUGFyYW1ldGVyICkgKSAoICcsJyAoICggcnVsZUp2bUZvcm1hbFBhcmFtZXRlciApICkgKSogKT8gKCAoICd8JyApICkgKSApPT4gKGx2X21lbWJlckNhbGxBcmd1bWVudHNfMThfMD0gcnVsZVhTaG9ydENsb3N1cmUgKSApIHwgKCAoIChsdl9tZW1iZXJDYWxsQXJndW1lbnRzXzE5XzA9IHJ1bGVYRXhwcmVzc2lvbiApICkgKG90aGVybHZfMjA9ICcsJyAoIChsdl9tZW1iZXJDYWxsQXJndW1lbnRzXzIxXzA9IHJ1bGVYRXhwcmVzc2lvbiApICkgKSogKSApPyBvdGhlcmx2XzIyPSAnKScgKT8iOworICAgICAgICAgICAgcmV0dXJuICI1Mjk0OjU6ICggKCAoICggJygnICkgKT0+IChsdl9leHBsaWNpdE9wZXJhdGlvbkNhbGxfMTdfMD0gJygnICkgKSAoICggKCAoICgpICggKCAoIHJ1bGVKdm1Gb3JtYWxQYXJhbWV0ZXIgKSApICggJywnICggKCBydWxlSnZtRm9ybWFsUGFyYW1ldGVyICkgKSApKiApPyAoICggJ3wnICkgKSApICk9PiAobHZfbWVtYmVyQ2FsbEFyZ3VtZW50c18xOF8wPSBydWxlWFNob3J0Q2xvc3VyZSApICkgfCAoICggKGx2X21lbWJlckNhbGxBcmd1bWVudHNfMTlfMD0gcnVsZVhFeHByZXNzaW9uICkgKSAob3RoZXJsdl8yMD0gJywnICggKGx2X21lbWJlckNhbGxBcmd1bWVudHNfMjFfMD0gcnVsZVhFeHByZXNzaW9uICkgKSApKiApICk/IG90aGVybHZfMjI9ICcpJyApPyI7CiAgICAgICAgIH0KICAgICAgICAgcHVibGljIGludCBzcGVjaWFsU3RhdGVUcmFuc2l0aW9uKGludCBzLCBJbnRTdHJlYW0gX2lucHV0KSB0aHJvd3MgTm9WaWFibGVBbHRFeGNlcHRpb24gewogICAgICAgICAgICAgVG9rZW5TdHJlYW0gaW5wdXQgPSAoVG9rZW5TdHJlYW0pX2lucHV0OwogICAgICAgICAJaW50IF9zID0gczsKICAgICAgICAgICAgIHN3aXRjaCAoIHMgKSB7CiAgICAgICAgICAgICAgICAgICAgIGNhc2UgMCA6IAotICAgICAgICAgICAgICAgICAgICAgICAgaW50IExBODRfMSA9IGlucHV0LkxBKDEpOworICAgICAgICAgICAgICAgICAgICAgICAgaW50IExBOTVfMSA9IGlucHV0LkxBKDEpOwogCiAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW5kZXg4NF8xID0gaW5wdXQuaW5kZXgoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbmRleDk1XzEgPSBpbnB1dC5pbmRleCgpOwogICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXQucmV3aW5kKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICBzID0gLTE7CiAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIChzeW5wcmVkMjJfSW50ZXJuYWxEYXRhRFNMKCkpICkge3MgPSA3Nzt9CkBAIC0yOTAyNSwyMyArMzA1NjMsMjMgQEAKICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKCAodHJ1ZSkgKSB7cyA9IDI7fQogCiAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICBpbnB1dC5zZWVrKGluZGV4ODRfMSk7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dC5zZWVrKGluZGV4OTVfMSk7CiAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIHM+PTAgKSByZXR1cm4gczsKICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgaWYgKHN0YXRlLmJhY2t0cmFja2luZz4wKSB7c3RhdGUuZmFpbGVkPXRydWU7IHJldHVybiAtMTt9CiAgICAgICAgICAgICBOb1ZpYWJsZUFsdEV4Y2VwdGlvbiBudmFlID0KLSAgICAgICAgICAgICAgICBuZXcgTm9WaWFibGVBbHRFeGNlcHRpb24oZ2V0RGVzY3JpcHRpb24oKSwgODQsIF9zLCBpbnB1dCk7CisgICAgICAgICAgICAgICAgbmV3IE5vVmlhYmxlQWx0RXhjZXB0aW9uKGdldERlc2NyaXB0aW9uKCksIDk1LCBfcywgaW5wdXQpOwogICAgICAgICAgICAgZXJyb3IobnZhZSk7CiAgICAgICAgICAgICB0aHJvdyBudmFlOwogICAgICAgICB9CiAgICAgfQogICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgZGZhXzQ2cyA9ICJcMVw0XDJcMFw0MVx1ZmZmZiI7Ci0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBkZmFfNDdzID0gIlwxXHUwMDg2XDJcMFw0MVx1ZmZmZiI7CisgICAgc3RhdGljIGZpbmFsIFN0cmluZyBkZmFfNDdzID0gIlwxXHUwMDhkXDJcMFw0MVx1ZmZmZiI7CiAgICAgc3RhdGljIGZpbmFsIFN0cmluZyBkZmFfNDhzID0gIlwzXHVmZmZmXDJcMVwxXDJcMzVcdWZmZmZcMVwzIjsKICAgICBzdGF0aWMgZmluYWwgU3RyaW5nIGRmYV80OXMgPSAiXDFcMFwxXDFcMVwyXDQxXHVmZmZmfT4iOwogICAgIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBkZmFfNTBzID0gewotICAgICAgICAgICAgIlwyXDVcMVwxXDJcNVw2XHVmZmZmXDFcNVwzNlx1ZmZmZlwxXDVcMjJcdWZmZmZcMVw1XDJcdWZmZmZcMlw1XDRcdWZmZmZcMVwyXDFcdWZmZmZcMVw0M1wxXHVmZmZmXDJcNVw2XHVmZmZmXDFcNVwxNFx1ZmZmZlwxXDNcMlx1ZmZmZlwyXDVcM1x1ZmZmZlwxXDVcNFx1ZmZmZlwxXDRcMVw1XDFcdWZmZmZcMVw1XDNcdWZmZmZcMlw1XDJcdWZmZmZcMTJcNVwxXHVmZmZmXDFcNSIsCisgICAgICAgICAgICAiXDJcNVwxXDFcMlw1XDZcdWZmZmZcMVw1XDQyXHVmZmZmXDFcNVwyNVx1ZmZmZlwxXDVcMlx1ZmZmZlwyXDVcNFx1ZmZmZlwxXDJcMVx1ZmZmZlwxXDQzXDFcdWZmZmZcMlw1XDZcdWZmZmZcMVw1XDE0XHVmZmZmXDFcM1wyXHVmZmZmXDJcNVwzXHVmZmZmXDFcNVw0XHVmZmZmXDFcNFwxXDVcMVx1ZmZmZlwxXDVcM1x1ZmZmZlwyXDVcMlx1ZmZmZlwxMlw1XDFcdWZmZmZcMVw1IiwKICAgICAgICAgICAgICJcMVx1ZmZmZiIsCiAgICAgICAgICAgICAiXDFcdWZmZmYiLAogICAgICAgICAgICAgIiIsCkBAIC0yOTA4NCwxMSArMzA2MjIsMTEgQEAKICAgICBzdGF0aWMgZmluYWwgc2hvcnRbXSBkZmFfNDkgPSBERkEudW5wYWNrRW5jb2RlZFN0cmluZyhkZmFfNDlzKTsKICAgICBzdGF0aWMgZmluYWwgc2hvcnRbXVtdIGRmYV81MCA9IHVucGFja0VuY29kZWRTdHJpbmdBcnJheShkZmFfNTBzKTsKIAotICAgIGNsYXNzIERGQTgzIGV4dGVuZHMgREZBIHsKKyAgICBjbGFzcyBERkE5NCBleHRlbmRzIERGQSB7CiAKLSAgICAgICAgcHVibGljIERGQTgzKEJhc2VSZWNvZ25pemVyIHJlY29nbml6ZXIpIHsKKyAgICAgICAgcHVibGljIERGQTk0KEJhc2VSZWNvZ25pemVyIHJlY29nbml6ZXIpIHsKICAgICAgICAgICAgIHRoaXMucmVjb2duaXplciA9IHJlY29nbml6ZXI7Ci0gICAgICAgICAgICB0aGlzLmRlY2lzaW9uTnVtYmVyID0gODM7CisgICAgICAgICAgICB0aGlzLmRlY2lzaW9uTnVtYmVyID0gOTQ7CiAgICAgICAgICAgICB0aGlzLmVvdCA9IGRmYV84OwogICAgICAgICAgICAgdGhpcy5lb2YgPSBkZmFfODsKICAgICAgICAgICAgIHRoaXMubWluID0gZGZhXzQ2OwpAQCAtMjkwOTgsNDAgKzMwNjM2LDQwIEBACiAgICAgICAgICAgICB0aGlzLnRyYW5zaXRpb24gPSBkZmFfNTA7CiAgICAgICAgIH0KICAgICAgICAgcHVibGljIFN0cmluZyBnZXREZXNjcmlwdGlvbigpIHsKLSAgICAgICAgICAgIHJldHVybiAiNDg3NDo2OiAoICggKCAoICgpICggKCAoIHJ1bGVKdm1Gb3JtYWxQYXJhbWV0ZXIgKSApICggJywnICggKCBydWxlSnZtRm9ybWFsUGFyYW1ldGVyICkgKSApKiApPyAoICggJ3wnICkgKSApICk9PiAobHZfbWVtYmVyQ2FsbEFyZ3VtZW50c18xOF8wPSBydWxlWFNob3J0Q2xvc3VyZSApICkgfCAoICggKGx2X21lbWJlckNhbGxBcmd1bWVudHNfMTlfMD0gcnVsZVhFeHByZXNzaW9uICkgKSAob3RoZXJsdl8yMD0gJywnICggKGx2X21lbWJlckNhbGxBcmd1bWVudHNfMjFfMD0gcnVsZVhFeHByZXNzaW9uICkgKSApKiApICk/IjsKKyAgICAgICAgICAgIHJldHVybiAiNTMxMzo2OiAoICggKCAoICgpICggKCAoIHJ1bGVKdm1Gb3JtYWxQYXJhbWV0ZXIgKSApICggJywnICggKCBydWxlSnZtRm9ybWFsUGFyYW1ldGVyICkgKSApKiApPyAoICggJ3wnICkgKSApICk9PiAobHZfbWVtYmVyQ2FsbEFyZ3VtZW50c18xOF8wPSBydWxlWFNob3J0Q2xvc3VyZSApICkgfCAoICggKGx2X21lbWJlckNhbGxBcmd1bWVudHNfMTlfMD0gcnVsZVhFeHByZXNzaW9uICkgKSAob3RoZXJsdl8yMD0gJywnICggKGx2X21lbWJlckNhbGxBcmd1bWVudHNfMjFfMD0gcnVsZVhFeHByZXNzaW9uICkgKSApKiApICk/IjsKICAgICAgICAgfQogICAgICAgICBwdWJsaWMgaW50IHNwZWNpYWxTdGF0ZVRyYW5zaXRpb24oaW50IHMsIEludFN0cmVhbSBfaW5wdXQpIHRocm93cyBOb1ZpYWJsZUFsdEV4Y2VwdGlvbiB7CiAgICAgICAgICAgICBUb2tlblN0cmVhbSBpbnB1dCA9IChUb2tlblN0cmVhbSlfaW5wdXQ7CiAgICAgICAgIAlpbnQgX3MgPSBzOwogICAgICAgICAgICAgc3dpdGNoICggcyApIHsKICAgICAgICAgICAgICAgICAgICAgY2FzZSAwIDogCi0gICAgICAgICAgICAgICAgICAgICAgICBpbnQgTEE4M18wID0gaW5wdXQuTEEoMSk7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgTEE5NF8wID0gaW5wdXQuTEEoMSk7CiAKICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbmRleDgzXzAgPSBpbnB1dC5pbmRleCgpOworICAgICAgICAgICAgICAgICAgICAgICAgaW50IGluZGV4OTRfMCA9IGlucHV0LmluZGV4KCk7CiAgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dC5yZXdpbmQoKTsKICAgICAgICAgICAgICAgICAgICAgICAgIHMgPSAtMTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICggKExBODNfMD09UlVMRV9JRCkgKSB7cyA9IDE7fQorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCAoTEE5NF8wPT1SVUxFX0lEKSApIHtzID0gMTt9CiAKLSAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKCAoTEE4M18wPT03NCkgKSB7cyA9IDI7fQorICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoIChMQTk0XzA9PTgxKSApIHtzID0gMjt9CiAKLSAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKCAoTEE4M18wPT05OSkgJiYgKHN5bnByZWQyM19JbnRlcm5hbERhdGFEU0woKSkpIHtzID0gMzt9CisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICggKExBOTRfMD09MTA2KSAmJiAoc3lucHJlZDIzX0ludGVybmFsRGF0YURTTCgpKSkge3MgPSAzO30KIAotICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoIChMQTgzXzA9PTExMikgJiYgKHN5bnByZWQyM19JbnRlcm5hbERhdGFEU0woKSkpIHtzID0gNDt9CisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICggKExBOTRfMD09MTE5KSAmJiAoc3lucHJlZDIzX0ludGVybmFsRGF0YURTTCgpKSkge3MgPSA0O30KIAotICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoICgoTEE4M18wPj1SVUxFX1NUUklORyAmJiBMQTgzXzA8PVJVTEVfSU5UKXx8KExBODNfMD49UlVMRV9IRVggJiYgTEE4M18wPD1SVUxFX0RFQ0lNQUwpfHxMQTgzXzA9PTE1fHxMQTgzXzA9PTQ2fHxMQTgzXzA9PTY1fHwoTEE4M18wPj02OCAmJiBMQTgzXzA8PTY5KXx8KExBODNfMD49NzggJiYgTEE4M18wPD03OSl8fExBODNfMD09ODZ8fChMQTgzXzA+PTEwMiAmJiBMQTgzXzA8PTEwMyl8fExBODNfMD09MTA3fHxMQTgzXzA9PTExM3x8TEE4M18wPT0xMTV8fChMQTgzXzA+PTExOSAmJiBMQTgzXzA8PTEyMCl8fChMQTgzXzA+PTEyMyAmJiBMQTgzXzA8PTEzMil8fExBODNfMD09MTM0KSApIHtzID0gNTt9CisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICggKChMQTk0XzA+PVJVTEVfU1RSSU5HICYmIExBOTRfMDw9UlVMRV9JTlQpfHwoTEE5NF8wPj1SVUxFX0hFWCAmJiBMQTk0XzA8PVJVTEVfREVDSU1BTCl8fExBOTRfMD09MTV8fExBOTRfMD09NTB8fExBOTRfMD09NzJ8fChMQTk0XzA+PTc1ICYmIExBOTRfMDw9NzYpfHwoTEE5NF8wPj04NSAmJiBMQTk0XzA8PTg2KXx8TEE5NF8wPT05M3x8KExBOTRfMD49MTA5ICYmIExBOTRfMDw9MTEwKXx8TEE5NF8wPT0xMTR8fExBOTRfMD09MTIwfHxMQTk0XzA9PTEyMnx8KExBOTRfMD49MTI2ICYmIExBOTRfMDw9MTI3KXx8KExBOTRfMD49MTMwICYmIExBOTRfMDw9MTM5KXx8TEE5NF8wPT0xNDEpICkge3MgPSA1O30KIAotICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoIChMQTgzXzA9PTc2KSApIHtzID0gMzU7fQorICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoIChMQTk0XzA9PTgzKSApIHtzID0gMzU7fQogCiAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICBpbnB1dC5zZWVrKGluZGV4ODNfMCk7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dC5zZWVrKGluZGV4OTRfMCk7CiAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIHM+PTAgKSByZXR1cm4gczsKICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICBjYXNlIDEgOiAKLSAgICAgICAgICAgICAgICAgICAgICAgIGludCBMQTgzXzEgPSBpbnB1dC5MQSgxKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBMQTk0XzEgPSBpbnB1dC5MQSgxKTsKIAogICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgaW50IGluZGV4ODNfMSA9IGlucHV0LmluZGV4KCk7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW5kZXg5NF8xID0gaW5wdXQuaW5kZXgoKTsKICAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0LnJld2luZCgpOwogICAgICAgICAgICAgICAgICAgICAgICAgcyA9IC0xOwogICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCAoc3lucHJlZDIzX0ludGVybmFsRGF0YURTTCgpKSApIHtzID0gNDt9CkBAIC0yOTEzOSwxNCArMzA2NzcsMTQgQEAKICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKCAodHJ1ZSkgKSB7cyA9IDU7fQogCiAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICBpbnB1dC5zZWVrKGluZGV4ODNfMSk7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dC5zZWVrKGluZGV4OTRfMSk7CiAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIHM+PTAgKSByZXR1cm4gczsKICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICBjYXNlIDIgOiAKLSAgICAgICAgICAgICAgICAgICAgICAgIGludCBMQTgzXzIgPSBpbnB1dC5MQSgxKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBMQTk0XzIgPSBpbnB1dC5MQSgxKTsKIAogICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgaW50IGluZGV4ODNfMiA9IGlucHV0LmluZGV4KCk7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW5kZXg5NF8yID0gaW5wdXQuaW5kZXgoKTsKICAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0LnJld2luZCgpOwogICAgICAgICAgICAgICAgICAgICAgICAgcyA9IC0xOwogICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCAoc3lucHJlZDIzX0ludGVybmFsRGF0YURTTCgpKSApIHtzID0gNDt9CkBAIC0yOTE1NCwxOSArMzA2OTIsMTkgQEAKICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKCAodHJ1ZSkgKSB7cyA9IDU7fQogCiAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICBpbnB1dC5zZWVrKGluZGV4ODNfMik7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dC5zZWVrKGluZGV4OTRfMik7CiAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIHM+PTAgKSByZXR1cm4gczsKICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgaWYgKHN0YXRlLmJhY2t0cmFja2luZz4wKSB7c3RhdGUuZmFpbGVkPXRydWU7IHJldHVybiAtMTt9CiAgICAgICAgICAgICBOb1ZpYWJsZUFsdEV4Y2VwdGlvbiBudmFlID0KLSAgICAgICAgICAgICAgICBuZXcgTm9WaWFibGVBbHRFeGNlcHRpb24oZ2V0RGVzY3JpcHRpb24oKSwgODMsIF9zLCBpbnB1dCk7CisgICAgICAgICAgICAgICAgbmV3IE5vVmlhYmxlQWx0RXhjZXB0aW9uKGdldERlc2NyaXB0aW9uKCksIDk0LCBfcywgaW5wdXQpOwogICAgICAgICAgICAgZXJyb3IobnZhZSk7CiAgICAgICAgICAgICB0aHJvdyBudmFlOwogICAgICAgICB9CiAgICAgfQogICAgIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBkZmFfNTFzID0gewotICAgICAgICAgICAgIlw1XDJcNlx1ZmZmZlwyXDJcMzVcdWZmZmZcMVwyXDE2XHVmZmZmXDFcMlwzXHVmZmZmXDFcMlwxXHVmZmZmXDRcMlwxXHVmZmZmXDFcMlwxXHVmZmZmXDNcMlwxXHVmZmZmXDFcMlwxXDFcNDBcMlwxXHVmZmZmXDI3XDIiLAorICAgICAgICAgICAgIlw1XDJcNlx1ZmZmZlwyXDJcNDFcdWZmZmZcMVwyXDIxXHVmZmZmXDFcMlwzXHVmZmZmXDFcMlwxXHVmZmZmXDRcMlwxXHVmZmZmXDFcMlwxXHVmZmZmXDNcMlwxXHVmZmZmXDFcMlwxXDFcNDBcMlwxXHVmZmZmXDI3XDIiLAogICAgICAgICAgICAgIlwxXHVmZmZmIiwKICAgICAgICAgICAgICIiLAogICAgICAgICAgICAgIiIsCkBAIC0yOTI0NywxMSArMzA3ODUsMTEgQEAKICAgICB9OwogICAgIHN0YXRpYyBmaW5hbCBzaG9ydFtdW10gZGZhXzUxID0gdW5wYWNrRW5jb2RlZFN0cmluZ0FycmF5KGRmYV81MXMpOwogCi0gICAgY2xhc3MgREZBODUgZXh0ZW5kcyBERkEgeworICAgIGNsYXNzIERGQTk2IGV4dGVuZHMgREZBIHsKIAotICAgICAgICBwdWJsaWMgREZBODUoQmFzZVJlY29nbml6ZXIgcmVjb2duaXplcikgeworICAgICAgICBwdWJsaWMgREZBOTYoQmFzZVJlY29nbml6ZXIgcmVjb2duaXplcikgewogICAgICAgICAgICAgdGhpcy5yZWNvZ25pemVyID0gcmVjb2duaXplcjsKLSAgICAgICAgICAgIHRoaXMuZGVjaXNpb25OdW1iZXIgPSA4NTsKKyAgICAgICAgICAgIHRoaXMuZGVjaXNpb25OdW1iZXIgPSA5NjsKICAgICAgICAgICAgIHRoaXMuZW90ID0gZGZhXzM5OwogICAgICAgICAgICAgdGhpcy5lb2YgPSBkZmFfNDA7CiAgICAgICAgICAgICB0aGlzLm1pbiA9IGRmYV80MTsKQEAgLTI5MjYxLDE3ICszMDc5OSwxNyBAQAogICAgICAgICAgICAgdGhpcy50cmFuc2l0aW9uID0gZGZhXzUxOwogICAgICAgICB9CiAgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0RGVzY3JpcHRpb24oKSB7Ci0gICAgICAgICAgICByZXR1cm4gIjQ5NzI6NTogKCAoICggKCkgJ1snICkgKT0+IChsdl9tZW1iZXJDYWxsQXJndW1lbnRzXzIzXzA9IHJ1bGVYQ2xvc3VyZSApICk/IjsKKyAgICAgICAgICAgIHJldHVybiAiNTQxMTo1OiAoICggKCAoKSAnWycgKSApPT4gKGx2X21lbWJlckNhbGxBcmd1bWVudHNfMjNfMD0gcnVsZVhDbG9zdXJlICkgKT8iOwogICAgICAgICB9CiAgICAgICAgIHB1YmxpYyBpbnQgc3BlY2lhbFN0YXRlVHJhbnNpdGlvbihpbnQgcywgSW50U3RyZWFtIF9pbnB1dCkgdGhyb3dzIE5vVmlhYmxlQWx0RXhjZXB0aW9uIHsKICAgICAgICAgICAgIFRva2VuU3RyZWFtIGlucHV0ID0gKFRva2VuU3RyZWFtKV9pbnB1dDsKICAgICAgICAgCWludCBfcyA9IHM7CiAgICAgICAgICAgICBzd2l0Y2ggKCBzICkgewogICAgICAgICAgICAgICAgICAgICBjYXNlIDAgOiAKLSAgICAgICAgICAgICAgICAgICAgICAgIGludCBMQTg1XzEgPSBpbnB1dC5MQSgxKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBMQTk2XzEgPSBpbnB1dC5MQSgxKTsKIAogICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgaW50IGluZGV4ODVfMSA9IGlucHV0LmluZGV4KCk7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW5kZXg5Nl8xID0gaW5wdXQuaW5kZXgoKTsKICAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0LnJld2luZCgpOwogICAgICAgICAgICAgICAgICAgICAgICAgcyA9IC0xOwogICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCAoc3lucHJlZDI0X0ludGVybmFsRGF0YURTTCgpKSApIHtzID0gNzc7fQpAQCAtMjkyNzksMjQgKzMwODE3LDI0IEBACiAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICggKHRydWUpICkge3MgPSAyO30KIAogICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXQuc2VlayhpbmRleDg1XzEpOworICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXQuc2VlayhpbmRleDk2XzEpOwogICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCBzPj0wICkgcmV0dXJuIHM7CiAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGlmIChzdGF0ZS5iYWNrdHJhY2tpbmc+MCkge3N0YXRlLmZhaWxlZD10cnVlOyByZXR1cm4gLTE7fQogICAgICAgICAgICAgTm9WaWFibGVBbHRFeGNlcHRpb24gbnZhZSA9Ci0gICAgICAgICAgICAgICAgbmV3IE5vVmlhYmxlQWx0RXhjZXB0aW9uKGdldERlc2NyaXB0aW9uKCksIDg1LCBfcywgaW5wdXQpOworICAgICAgICAgICAgICAgIG5ldyBOb1ZpYWJsZUFsdEV4Y2VwdGlvbihnZXREZXNjcmlwdGlvbigpLCA5NiwgX3MsIGlucHV0KTsKICAgICAgICAgICAgIGVycm9yKG52YWUpOwogICAgICAgICAgICAgdGhyb3cgbnZhZTsKICAgICAgICAgfQogICAgIH0KICAgICBzdGF0aWMgZmluYWwgU3RyaW5nIGRmYV81MnMgPSAiXDQwXHVmZmZmIjsKICAgICBzdGF0aWMgZmluYWwgU3RyaW5nIGRmYV81M3MgPSAiXDFcNFwyNlx1ZmZmZlwxXDBcMTBcdWZmZmYiOwotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgZGZhXzU0cyA9ICJcMVx1MDA4NlwyNlx1ZmZmZlwxXDBcMTBcdWZmZmYiOworICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgZGZhXzU0cyA9ICJcMVx1MDA4ZFwyNlx1ZmZmZlwxXDBcMTBcdWZmZmYiOwogICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgZGZhXzU1cyA9ICJcMVx1ZmZmZlwxXDFcMVwyXDFcM1wxXDRcMVw1XDZcdWZmZmZcMVw2XDExXHVmZmZmXDFcN1wxXHVmZmZmXDFcMTJcMVwxM1wxXDE0XDFcMTVcMVwxNlwxXDE3XDFcMTBcMVwxMSI7CiAgICAgc3RhdGljIGZpbmFsIFN0cmluZyBkZmFfNTZzID0gIlwxXDBcMjZcdWZmZmZcMVwxXDEwXHVmZmZmfT4iOwogICAgIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBkZmFfNTdzID0gewotICAgICAgICAgICAgIlwyXDE0XDFcNVwyXDE0XDZcdWZmZmZcMVwyXDM2XHVmZmZmXDFcMjdcMjJcdWZmZmZcMVw1XDJcdWZmZmZcMlw1XDRcdWZmZmZcMVwzNVwzXHVmZmZmXDJcMTRcNlx1ZmZmZlwxXDVcMzJcdWZmZmZcMVwyNlwxXHVmZmZmXDFcM1wzXHVmZmZmXDFcMzBcMVwzMVwyXHVmZmZmXDJcNVwxXDFcNFwxNFwxXDMyXDFcMzNcMVwzNFwxXHVmZmZmXDFcNCIsCisgICAgICAgICAgICAiXDJcMTRcMVw1XDJcMTRcNlx1ZmZmZlwxXDJcNDJcdWZmZmZcMVwyN1wyNVx1ZmZmZlwxXDVcMlx1ZmZmZlwyXDVcNFx1ZmZmZlwxXDM1XDNcdWZmZmZcMlwxNFw2XHVmZmZmXDFcNVwzMlx1ZmZmZlwxXDI2XDFcdWZmZmZcMVwzXDNcdWZmZmZcMVwzMFwxXDMxXDJcdWZmZmZcMlw1XDFcMVw0XDE0XDFcMzJcMVwzM1wxXDM0XDFcdWZmZmZcMVw0IiwKICAgICAgICAgICAgICIiLAogICAgICAgICAgICAgIiIsCiAgICAgICAgICAgICAiIiwKQEAgLTI5MzM3LDExICszMDg3NSwxMSBAQAogICAgIHN0YXRpYyBmaW5hbCBzaG9ydFtdIGRmYV81NiA9IERGQS51bnBhY2tFbmNvZGVkU3RyaW5nKGRmYV81NnMpOwogICAgIHN0YXRpYyBmaW5hbCBzaG9ydFtdW10gZGZhXzU3ID0gdW5wYWNrRW5jb2RlZFN0cmluZ0FycmF5KGRmYV81N3MpOwogCi0gICAgY2xhc3MgREZBODcgZXh0ZW5kcyBERkEgeworICAgIGNsYXNzIERGQTk4IGV4dGVuZHMgREZBIHsKIAotICAgICAgICBwdWJsaWMgREZBODcoQmFzZVJlY29nbml6ZXIgcmVjb2duaXplcikgeworICAgICAgICBwdWJsaWMgREZBOTgoQmFzZVJlY29nbml6ZXIgcmVjb2duaXplcikgewogICAgICAgICAgICAgdGhpcy5yZWNvZ25pemVyID0gcmVjb2duaXplcjsKLSAgICAgICAgICAgIHRoaXMuZGVjaXNpb25OdW1iZXIgPSA4NzsKKyAgICAgICAgICAgIHRoaXMuZGVjaXNpb25OdW1iZXIgPSA5ODsKICAgICAgICAgICAgIHRoaXMuZW90ID0gZGZhXzUyOwogICAgICAgICAgICAgdGhpcy5lb2YgPSBkZmFfNTI7CiAgICAgICAgICAgICB0aGlzLm1pbiA9IGRmYV81MzsKQEAgLTI5MzUxLDU2ICszMDg4OSw1NiBAQAogICAgICAgICAgICAgdGhpcy50cmFuc2l0aW9uID0gZGZhXzU3OwogICAgICAgICB9CiAgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0RGVzY3JpcHRpb24oKSB7Ci0gICAgICAgICAgICByZXR1cm4gIjUwMTc6MjogKHRoaXNfWENvbnN0cnVjdG9yQ2FsbF8wPSBydWxlWENvbnN0cnVjdG9yQ2FsbCB8IHRoaXNfWEJsb2NrRXhwcmVzc2lvbl8xPSBydWxlWEJsb2NrRXhwcmVzc2lvbiB8IHRoaXNfWFN3aXRjaEV4cHJlc3Npb25fMj0gcnVsZVhTd2l0Y2hFeHByZXNzaW9uIHwgKCAoICggKCkgJ3N5bmNocm9uaXplZCcgJygnICkgKT0+dGhpc19YU3luY2hyb25pemVkRXhwcmVzc2lvbl8zPSBydWxlWFN5bmNocm9uaXplZEV4cHJlc3Npb24gKSB8IHRoaXNfWEZlYXR1cmVDYWxsXzQ9IHJ1bGVYRmVhdHVyZUNhbGwgfCB0aGlzX1hMaXRlcmFsXzU9IHJ1bGVYTGl0ZXJhbCB8IHRoaXNfWElmRXhwcmVzc2lvbl82PSBydWxlWElmRXhwcmVzc2lvbiB8ICggKCAoICgpICdmb3InICcoJyAoICggcnVsZUp2bUZvcm1hbFBhcmFtZXRlciApICkgJzonICkgKT0+dGhpc19YRm9yTG9vcEV4cHJlc3Npb25fNz0gcnVsZVhGb3JMb29wRXhwcmVzc2lvbiApIHwgdGhpc19YQmFzaWNGb3JMb29wRXhwcmVzc2lvbl84PSBydWxlWEJhc2ljRm9yTG9vcEV4cHJlc3Npb24gfCB0aGlzX1hXaGlsZUV4cHJlc3Npb25fOT0gcnVsZVhXaGlsZUV4cHJlc3Npb24gfCB0aGlzX1hEb1doaWxlRXhwcmVzc2lvbl8xMD0gcnVsZVhEb1doaWxlRXhwcmVzc2lvbiB8IHRoaXNfWFRocm93RXhwcmVzc2lvbl8xMT0gcnVsZVhUaHJvd0V4cHJlc3Npb24gfCB0aGlzX1hSZXR1cm5FeHByZXNzaW9uXzEyPSBydWxlWFJldHVybkV4cHJlc3Npb24gfCB0aGlzX1hUcnlDYXRjaEZpbmFsbHlFeHByZXNzaW9uXzEzPSBydWxlWFRyeUNhdGNoRmluYWxseUV4cHJlc3Npb24gfCB0aGlzX1hQYXJlbnRoZXNpemVkRXhwcmVzc2lvbl8xND0gcnVsZVhQYXJlbnRoZXNpemVkRXhwcmVzc2lvbiApIjsKKyAgICAgICAgICAgIHJldHVybiAiNTQ1NjoyOiAodGhpc19YQ29uc3RydWN0b3JDYWxsXzA9IHJ1bGVYQ29uc3RydWN0b3JDYWxsIHwgdGhpc19YQmxvY2tFeHByZXNzaW9uXzE9IHJ1bGVYQmxvY2tFeHByZXNzaW9uIHwgdGhpc19YU3dpdGNoRXhwcmVzc2lvbl8yPSBydWxlWFN3aXRjaEV4cHJlc3Npb24gfCAoICggKCAoKSAnc3luY2hyb25pemVkJyAnKCcgKSApPT50aGlzX1hTeW5jaHJvbml6ZWRFeHByZXNzaW9uXzM9IHJ1bGVYU3luY2hyb25pemVkRXhwcmVzc2lvbiApIHwgdGhpc19YRmVhdHVyZUNhbGxfND0gcnVsZVhGZWF0dXJlQ2FsbCB8IHRoaXNfWExpdGVyYWxfNT0gcnVsZVhMaXRlcmFsIHwgdGhpc19YSWZFeHByZXNzaW9uXzY9IHJ1bGVYSWZFeHByZXNzaW9uIHwgKCAoICggKCkgJ2ZvcicgJygnICggKCBydWxlSnZtRm9ybWFsUGFyYW1ldGVyICkgKSAnOicgKSApPT50aGlzX1hGb3JMb29wRXhwcmVzc2lvbl83PSBydWxlWEZvckxvb3BFeHByZXNzaW9uICkgfCB0aGlzX1hCYXNpY0Zvckxvb3BFeHByZXNzaW9uXzg9IHJ1bGVYQmFzaWNGb3JMb29wRXhwcmVzc2lvbiB8IHRoaXNfWFdoaWxlRXhwcmVzc2lvbl85PSBydWxlWFdoaWxlRXhwcmVzc2lvbiB8IHRoaXNfWERvV2hpbGVFeHByZXNzaW9uXzEwPSBydWxlWERvV2hpbGVFeHByZXNzaW9uIHwgdGhpc19YVGhyb3dFeHByZXNzaW9uXzExPSBydWxlWFRocm93RXhwcmVzc2lvbiB8IHRoaXNfWFJldHVybkV4cHJlc3Npb25fMTI9IHJ1bGVYUmV0dXJuRXhwcmVzc2lvbiB8IHRoaXNfWFRyeUNhdGNoRmluYWxseUV4cHJlc3Npb25fMTM9IHJ1bGVYVHJ5Q2F0Y2hGaW5hbGx5RXhwcmVzc2lvbiB8IHRoaXNfWFBhcmVudGhlc2l6ZWRFeHByZXNzaW9uXzE0PSBydWxlWFBhcmVudGhlc2l6ZWRFeHByZXNzaW9uICkiOwogICAgICAgICB9CiAgICAgICAgIHB1YmxpYyBpbnQgc3BlY2lhbFN0YXRlVHJhbnNpdGlvbihpbnQgcywgSW50U3RyZWFtIF9pbnB1dCkgdGhyb3dzIE5vVmlhYmxlQWx0RXhjZXB0aW9uIHsKICAgICAgICAgICAgIFRva2VuU3RyZWFtIGlucHV0ID0gKFRva2VuU3RyZWFtKV9pbnB1dDsKICAgICAgICAgCWludCBfcyA9IHM7CiAgICAgICAgICAgICBzd2l0Y2ggKCBzICkgewogICAgICAgICAgICAgICAgICAgICBjYXNlIDAgOiAKLSAgICAgICAgICAgICAgICAgICAgICAgIGludCBMQTg3XzAgPSBpbnB1dC5MQSgxKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBMQTk4XzAgPSBpbnB1dC5MQSgxKTsKIAogICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgaW50IGluZGV4ODdfMCA9IGlucHV0LmluZGV4KCk7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW5kZXg5OF8wID0gaW5wdXQuaW5kZXgoKTsKICAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0LnJld2luZCgpOwogICAgICAgICAgICAgICAgICAgICAgICAgcyA9IC0xOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCAoTEE4N18wPT0xMjUpICkge3MgPSAxO30KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICggKExBOThfMD09MTMyKSApIHtzID0gMTt9CiAKLSAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKCAoTEE4N18wPT0xNSkgKSB7cyA9IDI7fQorICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoIChMQTk4XzA9PTE1KSApIHtzID0gMjt9CiAKLSAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKCAoTEE4N18wPT0xMTUpICkge3MgPSAzO30KKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKCAoTEE5OF8wPT0xMjIpICkge3MgPSAzO30KIAotICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoIChMQTg3XzA9PTEzNCkgJiYgKHN5bnByZWQyNV9JbnRlcm5hbERhdGFEU0woKSkpIHtzID0gNDt9CisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICggKExBOThfMD09MTQxKSAmJiAoc3lucHJlZDI1X0ludGVybmFsRGF0YURTTCgpKSkge3MgPSA0O30KIAotICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoIChMQTg3XzA9PVJVTEVfSUR8fExBODdfMD09NjV8fChMQTg3XzA+PTY4ICYmIExBODdfMDw9NjkpfHxMQTg3XzA9PTg2fHwoTEE4N18wPj0xMjMgJiYgTEE4N18wPD0xMjQpKSApIHtzID0gNTt9CisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICggKExBOThfMD09UlVMRV9JRHx8TEE5OF8wPT03Mnx8KExBOThfMD49NzUgJiYgTEE5OF8wPD03Nil8fExBOThfMD09OTN8fChMQTk4XzA+PTEzMCAmJiBMQTk4XzA8PTEzMSkpICkge3MgPSA1O30KIAotICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoICgoTEE4N18wPj1SVUxFX1NUUklORyAmJiBMQTg3XzA8PVJVTEVfSU5UKXx8KExBODdfMD49UlVMRV9IRVggJiYgTEE4N18wPD1SVUxFX0RFQ0lNQUwpfHwoTEE4N18wPj03OCAmJiBMQTg3XzA8PTc5KXx8KExBODdfMD49MTI2ICYmIExBODdfMDw9MTI5KSkgKSB7cyA9IDEyO30KKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKCAoKExBOThfMD49UlVMRV9TVFJJTkcgJiYgTEE5OF8wPD1SVUxFX0lOVCl8fChMQTk4XzA+PVJVTEVfSEVYICYmIExBOThfMDw9UlVMRV9ERUNJTUFMKXx8KExBOThfMD49ODUgJiYgTEE5OF8wPD04Nil8fChMQTk4XzA+PTEzMyAmJiBMQTk4XzA8PTEzNikpICkge3MgPSAxMjt9CiAKLSAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKCAoTEE4N18wPT0xMTMpICkge3MgPSAyMjt9CisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICggKExBOThfMD09MTIwKSApIHtzID0gMjI7fQogCi0gICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICggKExBODdfMD09NDYpICkge3MgPSAyMzt9CisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICggKExBOThfMD09NTApICkge3MgPSAyMzt9CiAKLSAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKCAoTEE4N18wPT0xMTkpICkge3MgPSAyNDt9CisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICggKExBOThfMD09MTI2KSApIHtzID0gMjQ7fQogCi0gICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICggKExBODdfMD09MTIwKSApIHtzID0gMjU7fQorICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoIChMQTk4XzA9PTEyNykgKSB7cyA9IDI1O30KIAotICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoIChMQTg3XzA9PTEzMCkgKSB7cyA9IDI2O30KKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKCAoTEE5OF8wPT0xMzcpICkge3MgPSAyNjt9CiAKLSAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKCAoTEE4N18wPT0xMzEpICkge3MgPSAyNzt9CisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICggKExBOThfMD09MTM4KSApIHtzID0gMjc7fQogCi0gICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICggKExBODdfMD09MTMyKSApIHtzID0gMjg7fQorICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoIChMQTk4XzA9PTEzOSkgKSB7cyA9IDI4O30KIAotICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoIChMQTg3XzA9PTc0KSApIHtzID0gMjk7fQorICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoIChMQTk4XzA9PTgxKSApIHtzID0gMjk7fQogCiAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICBpbnB1dC5zZWVrKGluZGV4ODdfMCk7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dC5zZWVrKGluZGV4OThfMCk7CiAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIHM+PTAgKSByZXR1cm4gczsKICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICBjYXNlIDEgOiAKLSAgICAgICAgICAgICAgICAgICAgICAgIGludCBMQTg3XzIzID0gaW5wdXQuTEEoMSk7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgTEE5OF8yMyA9IGlucHV0LkxBKDEpOwogCiAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW5kZXg4N18yMyA9IGlucHV0LmluZGV4KCk7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW5kZXg5OF8yMyA9IGlucHV0LmluZGV4KCk7CiAgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dC5yZXdpbmQoKTsKICAgICAgICAgICAgICAgICAgICAgICAgIHMgPSAtMTsKICAgICAgICAgICAgICAgICAgICAgICAgIGlmICggKHN5bnByZWQyNl9JbnRlcm5hbERhdGFEU0woKSkgKSB7cyA9IDMwO30KQEAgLTI5NDA4LDI0ICszMDk0NiwyNCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoICh0cnVlKSApIHtzID0gMzE7fQogCiAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICBpbnB1dC5zZWVrKGluZGV4ODdfMjMpOworICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXQuc2VlayhpbmRleDk4XzIzKTsKICAgICAgICAgICAgICAgICAgICAgICAgIGlmICggcz49MCApIHJldHVybiBzOwogICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBpZiAoc3RhdGUuYmFja3RyYWNraW5nPjApIHtzdGF0ZS5mYWlsZWQ9dHJ1ZTsgcmV0dXJuIC0xO30KICAgICAgICAgICAgIE5vVmlhYmxlQWx0RXhjZXB0aW9uIG52YWUgPQotICAgICAgICAgICAgICAgIG5ldyBOb1ZpYWJsZUFsdEV4Y2VwdGlvbihnZXREZXNjcmlwdGlvbigpLCA4NywgX3MsIGlucHV0KTsKKyAgICAgICAgICAgICAgICBuZXcgTm9WaWFibGVBbHRFeGNlcHRpb24oZ2V0RGVzY3JpcHRpb24oKSwgOTgsIF9zLCBpbnB1dCk7CiAgICAgICAgICAgICBlcnJvcihudmFlKTsKICAgICAgICAgICAgIHRocm93IG52YWU7CiAgICAgICAgIH0KICAgICB9CiAgICAgc3RhdGljIGZpbmFsIFN0cmluZyBkZmFfNThzID0gIlw0Nlx1ZmZmZiI7CiAgICAgc3RhdGljIGZpbmFsIFN0cmluZyBkZmFfNTlzID0gIlwxXDRcMlwwXDQzXHVmZmZmIjsKLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIGRmYV82MHMgPSAiXDFcdTAwODZcMlwwXDQzXHVmZmZmIjsKKyAgICBzdGF0aWMgZmluYWwgU3RyaW5nIGRmYV82MHMgPSAiXDFcdTAwOGRcMlwwXDQzXHVmZmZmIjsKICAgICBzdGF0aWMgZmluYWwgU3RyaW5nIGRmYV82MXMgPSAiXDNcdWZmZmZcMlwxXDFcMlw0MFx1ZmZmZiI7CiAgICAgc3RhdGljIGZpbmFsIFN0cmluZyBkZmFfNjJzID0gIlwxXDBcMVwxXDFcMlw0M1x1ZmZmZn0+IjsKICAgICBzdGF0aWMgZmluYWwgU3RyaW5nW10gZGZhXzYzcyA9IHsKLSAgICAgICAgICAgICJcMlw1XDFcMVwyXDVcNlx1ZmZmZlwxXDVcMzZcdWZmZmZcMVw1XDIyXHVmZmZmXDFcNVwyXHVmZmZmXDJcNVw0XHVmZmZmXDFcMlwzXHVmZmZmXDNcNVw1XHVmZmZmXDFcNVwxNFx1ZmZmZlwxXDNcMlx1ZmZmZlwyXDVcM1x1ZmZmZlwxXDVcNFx1ZmZmZlwxXDRcMVw1XDFcdWZmZmZcMVw1XDNcdWZmZmZcMTZcNVwxXHVmZmZmXDFcNSIsCisgICAgICAgICAgICAiXDJcNVwxXDFcMlw1XDZcdWZmZmZcMVw1XDQyXHVmZmZmXDFcNVwyNVx1ZmZmZlwxXDVcMlx1ZmZmZlwyXDVcNFx1ZmZmZlwxXDJcM1x1ZmZmZlwzXDVcNVx1ZmZmZlwxXDVcMTRcdWZmZmZcMVwzXDJcdWZmZmZcMlw1XDNcdWZmZmZcMVw1XDRcdWZmZmZcMVw0XDFcNVwxXHVmZmZmXDFcNVwzXHVmZmZmXDE2XDVcMVx1ZmZmZlwxXDUiLAogICAgICAgICAgICAgIlwxXHVmZmZmIiwKICAgICAgICAgICAgICJcMVx1ZmZmZiIsCiAgICAgICAgICAgICAiIiwKQEAgLTI5NDcyLDExICszMTAxMCwxMSBAQAogICAgIHN0YXRpYyBmaW5hbCBzaG9ydFtdIGRmYV82MiA9IERGQS51bnBhY2tFbmNvZGVkU3RyaW5nKGRmYV82MnMpOwogICAgIHN0YXRpYyBmaW5hbCBzaG9ydFtdW10gZGZhXzYzID0gdW5wYWNrRW5jb2RlZFN0cmluZ0FycmF5KGRmYV82M3MpOwogCi0gICAgY2xhc3MgREZBOTYgZXh0ZW5kcyBERkEgeworICAgIGNsYXNzIERGQTEwNyBleHRlbmRzIERGQSB7CiAKLSAgICAgICAgcHVibGljIERGQTk2KEJhc2VSZWNvZ25pemVyIHJlY29nbml6ZXIpIHsKKyAgICAgICAgcHVibGljIERGQTEwNyhCYXNlUmVjb2duaXplciByZWNvZ25pemVyKSB7CiAgICAgICAgICAgICB0aGlzLnJlY29nbml6ZXIgPSByZWNvZ25pemVyOwotICAgICAgICAgICAgdGhpcy5kZWNpc2lvbk51bWJlciA9IDk2OworICAgICAgICAgICAgdGhpcy5kZWNpc2lvbk51bWJlciA9IDEwNzsKICAgICAgICAgICAgIHRoaXMuZW90ID0gZGZhXzU4OwogICAgICAgICAgICAgdGhpcy5lb2YgPSBkZmFfNTg7CiAgICAgICAgICAgICB0aGlzLm1pbiA9IGRmYV81OTsKQEAgLTI5NDg2LDM4ICszMTAyNCwzOCBAQAogICAgICAgICAgICAgdGhpcy50cmFuc2l0aW9uID0gZGZhXzYzOwogICAgICAgICB9CiAgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0RGVzY3JpcHRpb24oKSB7Ci0gICAgICAgICAgICByZXR1cm4gIjU1MDk6MzogKCAoICggKCAoICggcnVsZUp2bUZvcm1hbFBhcmFtZXRlciApICkgKCAnLCcgKCAoIHJ1bGVKdm1Gb3JtYWxQYXJhbWV0ZXIgKSApICkqICk/ICggKCAnfCcgKSApICkgKT0+ICggKCAoIChsdl9kZWNsYXJlZEZvcm1hbFBhcmFtZXRlcnNfMl8wPSBydWxlSnZtRm9ybWFsUGFyYW1ldGVyICkgKSAob3RoZXJsdl8zPSAnLCcgKCAobHZfZGVjbGFyZWRGb3JtYWxQYXJhbWV0ZXJzXzRfMD0gcnVsZUp2bUZvcm1hbFBhcmFtZXRlciApICkgKSogKT8gKCAobHZfZXhwbGljaXRTeW50YXhfNV8wPSAnfCcgKSApICkgKT8iOworICAgICAgICAgICAgcmV0dXJuICI1OTQ4OjM6ICggKCAoICggKCAoIHJ1bGVKdm1Gb3JtYWxQYXJhbWV0ZXIgKSApICggJywnICggKCBydWxlSnZtRm9ybWFsUGFyYW1ldGVyICkgKSApKiApPyAoICggJ3wnICkgKSApICk9PiAoICggKCAobHZfZGVjbGFyZWRGb3JtYWxQYXJhbWV0ZXJzXzJfMD0gcnVsZUp2bUZvcm1hbFBhcmFtZXRlciApICkgKG90aGVybHZfMz0gJywnICggKGx2X2RlY2xhcmVkRm9ybWFsUGFyYW1ldGVyc180XzA9IHJ1bGVKdm1Gb3JtYWxQYXJhbWV0ZXIgKSApICkqICk/ICggKGx2X2V4cGxpY2l0U3ludGF4XzVfMD0gJ3wnICkgKSApICk/IjsKICAgICAgICAgfQogICAgICAgICBwdWJsaWMgaW50IHNwZWNpYWxTdGF0ZVRyYW5zaXRpb24oaW50IHMsIEludFN0cmVhbSBfaW5wdXQpIHRocm93cyBOb1ZpYWJsZUFsdEV4Y2VwdGlvbiB7CiAgICAgICAgICAgICBUb2tlblN0cmVhbSBpbnB1dCA9IChUb2tlblN0cmVhbSlfaW5wdXQ7CiAgICAgICAgIAlpbnQgX3MgPSBzOwogICAgICAgICAgICAgc3dpdGNoICggcyApIHsKICAgICAgICAgICAgICAgICAgICAgY2FzZSAwIDogCi0gICAgICAgICAgICAgICAgICAgICAgICBpbnQgTEE5Nl8wID0gaW5wdXQuTEEoMSk7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgTEExMDdfMCA9IGlucHV0LkxBKDEpOwogCiAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW5kZXg5Nl8wID0gaW5wdXQuaW5kZXgoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbmRleDEwN18wID0gaW5wdXQuaW5kZXgoKTsKICAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0LnJld2luZCgpOwogICAgICAgICAgICAgICAgICAgICAgICAgcyA9IC0xOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCAoTEE5Nl8wPT1SVUxFX0lEKSApIHtzID0gMTt9CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIChMQTEwN18wPT1SVUxFX0lEKSApIHtzID0gMTt9CiAKLSAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKCAoTEE5Nl8wPT03NCkgKSB7cyA9IDI7fQorICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoIChMQTEwN18wPT04MSkgKSB7cyA9IDI7fQogCi0gICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICggKExBOTZfMD09OTkpICYmIChzeW5wcmVkMjlfSW50ZXJuYWxEYXRhRFNMKCkpKSB7cyA9IDM7fQorICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoIChMQTEwN18wPT0xMDYpICYmIChzeW5wcmVkMjlfSW50ZXJuYWxEYXRhRFNMKCkpKSB7cyA9IDM7fQogCi0gICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICggKExBOTZfMD09MTEyKSAmJiAoc3lucHJlZDI5X0ludGVybmFsRGF0YURTTCgpKSkge3MgPSA0O30KKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKCAoTEExMDdfMD09MTE5KSAmJiAoc3lucHJlZDI5X0ludGVybmFsRGF0YURTTCgpKSkge3MgPSA0O30KIAotICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoICgoTEE5Nl8wPj1SVUxFX1NUUklORyAmJiBMQTk2XzA8PVJVTEVfSU5UKXx8KExBOTZfMD49UlVMRV9IRVggJiYgTEE5Nl8wPD1SVUxFX0RFQ0lNQUwpfHxMQTk2XzA9PTE1fHxMQTk2XzA9PTQ2fHxMQTk2XzA9PTY1fHwoTEE5Nl8wPj02OCAmJiBMQTk2XzA8PTY5KXx8KExBOTZfMD49NzggJiYgTEE5Nl8wPD04MCl8fExBOTZfMD09ODZ8fChMQTk2XzA+PTEwMiAmJiBMQTk2XzA8PTEwMyl8fExBOTZfMD09MTA3fHxMQTk2XzA9PTExM3x8TEE5Nl8wPT0xMTV8fChMQTk2XzA+PTExOSAmJiBMQTk2XzA8PTEzMil8fExBOTZfMD09MTM0KSApIHtzID0gNTt9CisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICggKChMQTEwN18wPj1SVUxFX1NUUklORyAmJiBMQTEwN18wPD1SVUxFX0lOVCl8fChMQTEwN18wPj1SVUxFX0hFWCAmJiBMQTEwN18wPD1SVUxFX0RFQ0lNQUwpfHxMQTEwN18wPT0xNXx8TEExMDdfMD09NTB8fExBMTA3XzA9PTcyfHwoTEExMDdfMD49NzUgJiYgTEExMDdfMDw9NzYpfHwoTEExMDdfMD49ODUgJiYgTEExMDdfMDw9ODcpfHxMQTEwN18wPT05M3x8KExBMTA3XzA+PTEwOSAmJiBMQTEwN18wPD0xMTApfHxMQTEwN18wPT0xMTR8fExBMTA3XzA9PTEyMHx8TEExMDdfMD09MTIyfHwoTEExMDdfMD49MTI2ICYmIExBMTA3XzA8PTEzOSl8fExBMTA3XzA9PTE0MSkgKSB7cyA9IDU7fQogCiAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICBpbnB1dC5zZWVrKGluZGV4OTZfMCk7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dC5zZWVrKGluZGV4MTA3XzApOwogICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCBzPj0wICkgcmV0dXJuIHM7CiAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgY2FzZSAxIDogCi0gICAgICAgICAgICAgICAgICAgICAgICBpbnQgTEE5Nl8xID0gaW5wdXQuTEEoMSk7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgTEExMDdfMSA9IGlucHV0LkxBKDEpOwogCiAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW5kZXg5Nl8xID0gaW5wdXQuaW5kZXgoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbmRleDEwN18xID0gaW5wdXQuaW5kZXgoKTsKICAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0LnJld2luZCgpOwogICAgICAgICAgICAgICAgICAgICAgICAgcyA9IC0xOwogICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCAoc3lucHJlZDI5X0ludGVybmFsRGF0YURTTCgpKSApIHtzID0gNDt9CkBAIC0yOTUyNSwxNCArMzEwNjMsMTQgQEAKICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKCAodHJ1ZSkgKSB7cyA9IDU7fQogCiAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICBpbnB1dC5zZWVrKGluZGV4OTZfMSk7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dC5zZWVrKGluZGV4MTA3XzEpOwogICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCBzPj0wICkgcmV0dXJuIHM7CiAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgY2FzZSAyIDogCi0gICAgICAgICAgICAgICAgICAgICAgICBpbnQgTEE5Nl8yID0gaW5wdXQuTEEoMSk7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgTEExMDdfMiA9IGlucHV0LkxBKDEpOwogCiAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW5kZXg5Nl8yID0gaW5wdXQuaW5kZXgoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbmRleDEwN18yID0gaW5wdXQuaW5kZXgoKTsKICAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0LnJld2luZCgpOwogICAgICAgICAgICAgICAgICAgICAgICAgcyA9IC0xOwogICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCAoc3lucHJlZDI5X0ludGVybmFsRGF0YURTTCgpKSApIHtzID0gNDt9CkBAIC0yOTU0MCwxOSArMzEwNzgsMTkgQEAKICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKCAodHJ1ZSkgKSB7cyA9IDU7fQogCiAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICBpbnB1dC5zZWVrKGluZGV4OTZfMik7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dC5zZWVrKGluZGV4MTA3XzIpOwogICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCBzPj0wICkgcmV0dXJuIHM7CiAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGlmIChzdGF0ZS5iYWNrdHJhY2tpbmc+MCkge3N0YXRlLmZhaWxlZD10cnVlOyByZXR1cm4gLTE7fQogICAgICAgICAgICAgTm9WaWFibGVBbHRFeGNlcHRpb24gbnZhZSA9Ci0gICAgICAgICAgICAgICAgbmV3IE5vVmlhYmxlQWx0RXhjZXB0aW9uKGdldERlc2NyaXB0aW9uKCksIDk2LCBfcywgaW5wdXQpOworICAgICAgICAgICAgICAgIG5ldyBOb1ZpYWJsZUFsdEV4Y2VwdGlvbihnZXREZXNjcmlwdGlvbigpLCAxMDcsIF9zLCBpbnB1dCk7CiAgICAgICAgICAgICBlcnJvcihudmFlKTsKICAgICAgICAgICAgIHRocm93IG52YWU7CiAgICAgICAgIH0KICAgICB9CiAgICAgc3RhdGljIGZpbmFsIFN0cmluZ1tdIGRmYV82NHMgPSB7Ci0gICAgICAgICAgICAiXDVcMlw2XHVmZmZmXDFcMlwzNlx1ZmZmZlwxXDJcMjJcdWZmZmZcMVwyXDJcdWZmZmZcMlwyXDRcdWZmZmZcMVwxXDNcdWZmZmZcMlwyXDZcdWZmZmZcMVwyXDE0XHVmZmZmXDFcMlwyXHVmZmZmXDJcMlwzXHVmZmZmXDFcMlw1XHVmZmZmXDFcMlwxXHVmZmZmXDFcMlwzXHVmZmZmXDJcMlwyXHVmZmZmXDEyXDJcMVx1ZmZmZlwxXDIiLAorICAgICAgICAgICAgIlw1XDJcNlx1ZmZmZlwxXDJcNDJcdWZmZmZcMVwyXDI1XHVmZmZmXDFcMlwyXHVmZmZmXDJcMlw0XHVmZmZmXDFcMVwzXHVmZmZmXDJcMlw2XHVmZmZmXDFcMlwxNFx1ZmZmZlwxXDJcMlx1ZmZmZlwyXDJcM1x1ZmZmZlwxXDJcNVx1ZmZmZlwxXDJcMVx1ZmZmZlwxXDJcM1x1ZmZmZlwyXDJcMlx1ZmZmZlwxMlwyXDFcdWZmZmZcMVwyIiwKICAgICAgICAgICAgICJcMVx1ZmZmZiIsCiAgICAgICAgICAgICAiIiwKICAgICAgICAgICAgICIiLApAQCAtMjk1OTAsMTEgKzMxMTI4LDExIEBACiAgICAgfTsKICAgICBzdGF0aWMgZmluYWwgc2hvcnRbXVtdIGRmYV82NCA9IHVucGFja0VuY29kZWRTdHJpbmdBcnJheShkZmFfNjRzKTsKIAotICAgIGNsYXNzIERGQTEwMyBleHRlbmRzIERGQSB7CisgICAgY2xhc3MgREZBMTE0IGV4dGVuZHMgREZBIHsKIAotICAgICAgICBwdWJsaWMgREZBMTAzKEJhc2VSZWNvZ25pemVyIHJlY29nbml6ZXIpIHsKKyAgICAgICAgcHVibGljIERGQTExNChCYXNlUmVjb2duaXplciByZWNvZ25pemVyKSB7CiAgICAgICAgICAgICB0aGlzLnJlY29nbml6ZXIgPSByZWNvZ25pemVyOwotICAgICAgICAgICAgdGhpcy5kZWNpc2lvbk51bWJlciA9IDEwMzsKKyAgICAgICAgICAgIHRoaXMuZGVjaXNpb25OdW1iZXIgPSAxMTQ7CiAgICAgICAgICAgICB0aGlzLmVvdCA9IGRmYV8xNDsKICAgICAgICAgICAgIHRoaXMuZW9mID0gZGZhXzE0OwogICAgICAgICAgICAgdGhpcy5taW4gPSBkZmFfMTU7CkBAIC0yOTYwNCwxNyArMzExNDIsMTcgQEAKICAgICAgICAgICAgIHRoaXMudHJhbnNpdGlvbiA9IGRmYV82NDsKICAgICAgICAgfQogICAgICAgICBwdWJsaWMgU3RyaW5nIGdldERlc2NyaXB0aW9uKCkgewotICAgICAgICAgICAgcmV0dXJuICI1OTc1OjM6ICggKCAoICggKCAnKCcgKCAoIHJ1bGVKdm1Gb3JtYWxQYXJhbWV0ZXIgKSApICc6JyApICk9PiAob3RoZXJsdl8yPSAnKCcgKCAobHZfZGVjbGFyZWRQYXJhbV8zXzA9IHJ1bGVKdm1Gb3JtYWxQYXJhbWV0ZXIgKSApIG90aGVybHZfND0gJzonICkgKSAoIChsdl9zd2l0Y2hfNV8wPSBydWxlWEV4cHJlc3Npb24gKSApIG90aGVybHZfNj0gJyknICkgfCAoICggKCAoICggKCBydWxlSnZtRm9ybWFsUGFyYW1ldGVyICkgKSAnOicgKSApPT4gKCAoIChsdl9kZWNsYXJlZFBhcmFtXzdfMD0gcnVsZUp2bUZvcm1hbFBhcmFtZXRlciApICkgb3RoZXJsdl84PSAnOicgKSApPyAoIChsdl9zd2l0Y2hfOV8wPSBydWxlWEV4cHJlc3Npb24gKSApICkgKSI7CisgICAgICAgICAgICByZXR1cm4gIjY0MTQ6MzogKCAoICggKCAoICcoJyAoICggcnVsZUp2bUZvcm1hbFBhcmFtZXRlciApICkgJzonICkgKT0+IChvdGhlcmx2XzI9ICcoJyAoIChsdl9kZWNsYXJlZFBhcmFtXzNfMD0gcnVsZUp2bUZvcm1hbFBhcmFtZXRlciApICkgb3RoZXJsdl80PSAnOicgKSApICggKGx2X3N3aXRjaF81XzA9IHJ1bGVYRXhwcmVzc2lvbiApICkgb3RoZXJsdl82PSAnKScgKSB8ICggKCAoICggKCAoIHJ1bGVKdm1Gb3JtYWxQYXJhbWV0ZXIgKSApICc6JyApICk9PiAoICggKGx2X2RlY2xhcmVkUGFyYW1fN18wPSBydWxlSnZtRm9ybWFsUGFyYW1ldGVyICkgKSBvdGhlcmx2Xzg9ICc6JyApICk/ICggKGx2X3N3aXRjaF85XzA9IHJ1bGVYRXhwcmVzc2lvbiApICkgKSApIjsKICAgICAgICAgfQogICAgICAgICBwdWJsaWMgaW50IHNwZWNpYWxTdGF0ZVRyYW5zaXRpb24oaW50IHMsIEludFN0cmVhbSBfaW5wdXQpIHRocm93cyBOb1ZpYWJsZUFsdEV4Y2VwdGlvbiB7CiAgICAgICAgICAgICBUb2tlblN0cmVhbSBpbnB1dCA9IChUb2tlblN0cmVhbSlfaW5wdXQ7CiAgICAgICAgIAlpbnQgX3MgPSBzOwogICAgICAgICAgICAgc3dpdGNoICggcyApIHsKICAgICAgICAgICAgICAgICAgICAgY2FzZSAwIDogCi0gICAgICAgICAgICAgICAgICAgICAgICBpbnQgTEExMDNfMSA9IGlucHV0LkxBKDEpOworICAgICAgICAgICAgICAgICAgICAgICAgaW50IExBMTE0XzEgPSBpbnB1dC5MQSgxKTsKIAogICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgaW50IGluZGV4MTAzXzEgPSBpbnB1dC5pbmRleCgpOworICAgICAgICAgICAgICAgICAgICAgICAgaW50IGluZGV4MTE0XzEgPSBpbnB1dC5pbmRleCgpOwogICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXQucmV3aW5kKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICBzID0gLTE7CiAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIChzeW5wcmVkMzJfSW50ZXJuYWxEYXRhRFNMKCkpICkge3MgPSAzNDt9CkBAIC0yOTYyMiwyNCArMzExNjAsMjQgQEAKICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKCAodHJ1ZSkgKSB7cyA9IDI7fQogCiAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICBpbnB1dC5zZWVrKGluZGV4MTAzXzEpOworICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXQuc2VlayhpbmRleDExNF8xKTsKICAgICAgICAgICAgICAgICAgICAgICAgIGlmICggcz49MCApIHJldHVybiBzOwogICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBpZiAoc3RhdGUuYmFja3RyYWNraW5nPjApIHtzdGF0ZS5mYWlsZWQ9dHJ1ZTsgcmV0dXJuIC0xO30KICAgICAgICAgICAgIE5vVmlhYmxlQWx0RXhjZXB0aW9uIG52YWUgPQotICAgICAgICAgICAgICAgIG5ldyBOb1ZpYWJsZUFsdEV4Y2VwdGlvbihnZXREZXNjcmlwdGlvbigpLCAxMDMsIF9zLCBpbnB1dCk7CisgICAgICAgICAgICAgICAgbmV3IE5vVmlhYmxlQWx0RXhjZXB0aW9uKGdldERlc2NyaXB0aW9uKCksIDExNCwgX3MsIGlucHV0KTsKICAgICAgICAgICAgIGVycm9yKG52YWUpOwogICAgICAgICAgICAgdGhyb3cgbnZhZTsKICAgICAgICAgfQogICAgIH0KICAgICBzdGF0aWMgZmluYWwgU3RyaW5nIGRmYV82NXMgPSAiXDQyXHVmZmZmIjsKICAgICBzdGF0aWMgZmluYWwgU3RyaW5nIGRmYV82NnMgPSAiXDFcNFwyXDBcMzdcdWZmZmYiOwotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgZGZhXzY3cyA9ICJcMVx1MDA4NlwyXDBcMzdcdWZmZmYiOworICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgZGZhXzY3cyA9ICJcMVx1MDA4ZFwyXDBcMzdcdWZmZmYiOwogICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgZGZhXzY4cyA9ICJcM1x1ZmZmZlwxXDFcMVwyXDM1XHVmZmZmIjsKICAgICBzdGF0aWMgZmluYWwgU3RyaW5nIGRmYV82OXMgPSAiXDFcMFwxXDFcMVwyXDM3XHVmZmZmfT4iOwogICAgIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBkZmFfNzBzID0gewotICAgICAgICAgICAgIlwyXDRcMVwxXDJcNFw2XHVmZmZmXDFcNFwzNlx1ZmZmZlwxXDRcMjJcdWZmZmZcMVw0XDJcdWZmZmZcMlw0XDRcdWZmZmZcMVwyXDNcdWZmZmZcMlw0XDZcdWZmZmZcMVw0XDE0XHVmZmZmXDFcM1wyXHVmZmZmXDJcNFwzXHVmZmZmXDFcNFw1XHVmZmZmXDFcNFwxXHVmZmZmXDFcNFwzXHVmZmZmXDJcNFwyXHVmZmZmXDEyXDRcMVx1ZmZmZlwxXDQiLAorICAgICAgICAgICAgIlwyXDRcMVwxXDJcNFw2XHVmZmZmXDFcNFw0Mlx1ZmZmZlwxXDRcMjVcdWZmZmZcMVw0XDJcdWZmZmZcMlw0XDRcdWZmZmZcMVwyXDNcdWZmZmZcMlw0XDZcdWZmZmZcMVw0XDE0XHVmZmZmXDFcM1wyXHVmZmZmXDJcNFwzXHVmZmZmXDFcNFw1XHVmZmZmXDFcNFwxXHVmZmZmXDFcNFwzXHVmZmZmXDJcNFwyXHVmZmZmXDEyXDRcMVx1ZmZmZlwxXDQiLAogICAgICAgICAgICAgIlwxXHVmZmZmIiwKICAgICAgICAgICAgICJcMVx1ZmZmZiIsCiAgICAgICAgICAgICAiIiwKQEAgLTI5NjgyLDExICszMTIyMCwxMSBAQAogICAgIHN0YXRpYyBmaW5hbCBzaG9ydFtdIGRmYV82OSA9IERGQS51bnBhY2tFbmNvZGVkU3RyaW5nKGRmYV82OXMpOwogICAgIHN0YXRpYyBmaW5hbCBzaG9ydFtdW10gZGZhXzcwID0gdW5wYWNrRW5jb2RlZFN0cmluZ0FycmF5KGRmYV83MHMpOwogCi0gICAgY2xhc3MgREZBMTAyIGV4dGVuZHMgREZBIHsKKyAgICBjbGFzcyBERkExMTMgZXh0ZW5kcyBERkEgewogCi0gICAgICAgIHB1YmxpYyBERkExMDIoQmFzZVJlY29nbml6ZXIgcmVjb2duaXplcikgeworICAgICAgICBwdWJsaWMgREZBMTEzKEJhc2VSZWNvZ25pemVyIHJlY29nbml6ZXIpIHsKICAgICAgICAgICAgIHRoaXMucmVjb2duaXplciA9IHJlY29nbml6ZXI7Ci0gICAgICAgICAgICB0aGlzLmRlY2lzaW9uTnVtYmVyID0gMTAyOworICAgICAgICAgICAgdGhpcy5kZWNpc2lvbk51bWJlciA9IDExMzsKICAgICAgICAgICAgIHRoaXMuZW90ID0gZGZhXzY1OwogICAgICAgICAgICAgdGhpcy5lb2YgPSBkZmFfNjU7CiAgICAgICAgICAgICB0aGlzLm1pbiA9IGRmYV82NjsKQEAgLTI5Njk2LDM2ICszMTIzNCwzNiBAQAogICAgICAgICAgICAgdGhpcy50cmFuc2l0aW9uID0gZGZhXzcwOwogICAgICAgICB9CiAgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0RGVzY3JpcHRpb24oKSB7Ci0gICAgICAgICAgICByZXR1cm4gIjYwNDQ6NTogKCAoICggKCAoIHJ1bGVKdm1Gb3JtYWxQYXJhbWV0ZXIgKSApICc6JyApICk9PiAoICggKGx2X2RlY2xhcmVkUGFyYW1fN18wPSBydWxlSnZtRm9ybWFsUGFyYW1ldGVyICkgKSBvdGhlcmx2Xzg9ICc6JyApICk/IjsKKyAgICAgICAgICAgIHJldHVybiAiNjQ4Mzo1OiAoICggKCAoICggcnVsZUp2bUZvcm1hbFBhcmFtZXRlciApICkgJzonICkgKT0+ICggKCAobHZfZGVjbGFyZWRQYXJhbV83XzA9IHJ1bGVKdm1Gb3JtYWxQYXJhbWV0ZXIgKSApIG90aGVybHZfOD0gJzonICkgKT8iOwogICAgICAgICB9CiAgICAgICAgIHB1YmxpYyBpbnQgc3BlY2lhbFN0YXRlVHJhbnNpdGlvbihpbnQgcywgSW50U3RyZWFtIF9pbnB1dCkgdGhyb3dzIE5vVmlhYmxlQWx0RXhjZXB0aW9uIHsKICAgICAgICAgICAgIFRva2VuU3RyZWFtIGlucHV0ID0gKFRva2VuU3RyZWFtKV9pbnB1dDsKICAgICAgICAgCWludCBfcyA9IHM7CiAgICAgICAgICAgICBzd2l0Y2ggKCBzICkgewogICAgICAgICAgICAgICAgICAgICBjYXNlIDAgOiAKLSAgICAgICAgICAgICAgICAgICAgICAgIGludCBMQTEwMl8wID0gaW5wdXQuTEEoMSk7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgTEExMTNfMCA9IGlucHV0LkxBKDEpOwogCiAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW5kZXgxMDJfMCA9IGlucHV0LmluZGV4KCk7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW5kZXgxMTNfMCA9IGlucHV0LmluZGV4KCk7CiAgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dC5yZXdpbmQoKTsKICAgICAgICAgICAgICAgICAgICAgICAgIHMgPSAtMTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICggKExBMTAyXzA9PVJVTEVfSUQpICkge3MgPSAxO30KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICggKExBMTEzXzA9PVJVTEVfSUQpICkge3MgPSAxO30KIAotICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoIChMQTEwMl8wPT03NCkgKSB7cyA9IDI7fQorICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoIChMQTExM18wPT04MSkgKSB7cyA9IDI7fQogCi0gICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICggKExBMTAyXzA9PTk5KSAmJiAoc3lucHJlZDMzX0ludGVybmFsRGF0YURTTCgpKSkge3MgPSAzO30KKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKCAoTEExMTNfMD09MTA2KSAmJiAoc3lucHJlZDMzX0ludGVybmFsRGF0YURTTCgpKSkge3MgPSAzO30KIAotICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoICgoTEExMDJfMD49UlVMRV9TVFJJTkcgJiYgTEExMDJfMDw9UlVMRV9JTlQpfHwoTEExMDJfMD49UlVMRV9IRVggJiYgTEExMDJfMDw9UlVMRV9ERUNJTUFMKXx8TEExMDJfMD09MTV8fExBMTAyXzA9PTQ2fHxMQTEwMl8wPT02NXx8KExBMTAyXzA+PTY4ICYmIExBMTAyXzA8PTY5KXx8KExBMTAyXzA+PTc4ICYmIExBMTAyXzA8PTc5KXx8TEExMDJfMD09ODZ8fChMQTEwMl8wPj0xMDIgJiYgTEExMDJfMDw9MTAzKXx8TEExMDJfMD09MTA3fHxMQTEwMl8wPT0xMTN8fExBMTAyXzA9PTExNXx8KExBMTAyXzA+PTExOSAmJiBMQTEwMl8wPD0xMjApfHwoTEExMDJfMD49MTIzICYmIExBMTAyXzA8PTEzMil8fExBMTAyXzA9PTEzNCkgKSB7cyA9IDQ7fQorICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoICgoTEExMTNfMD49UlVMRV9TVFJJTkcgJiYgTEExMTNfMDw9UlVMRV9JTlQpfHwoTEExMTNfMD49UlVMRV9IRVggJiYgTEExMTNfMDw9UlVMRV9ERUNJTUFMKXx8TEExMTNfMD09MTV8fExBMTEzXzA9PTUwfHxMQTExM18wPT03Mnx8KExBMTEzXzA+PTc1ICYmIExBMTEzXzA8PTc2KXx8KExBMTEzXzA+PTg1ICYmIExBMTEzXzA8PTg2KXx8TEExMTNfMD09OTN8fChMQTExM18wPj0xMDkgJiYgTEExMTNfMDw9MTEwKXx8TEExMTNfMD09MTE0fHxMQTExM18wPT0xMjB8fExBMTEzXzA9PTEyMnx8KExBMTEzXzA+PTEyNiAmJiBMQTExM18wPD0xMjcpfHwoTEExMTNfMD49MTMwICYmIExBMTEzXzA8PTEzOSl8fExBMTEzXzA9PTE0MSkgKSB7cyA9IDQ7fQogCiAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICBpbnB1dC5zZWVrKGluZGV4MTAyXzApOworICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXQuc2VlayhpbmRleDExM18wKTsKICAgICAgICAgICAgICAgICAgICAgICAgIGlmICggcz49MCApIHJldHVybiBzOwogICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgIGNhc2UgMSA6IAotICAgICAgICAgICAgICAgICAgICAgICAgaW50IExBMTAyXzEgPSBpbnB1dC5MQSgxKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBMQTExM18xID0gaW5wdXQuTEEoMSk7CiAKICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbmRleDEwMl8xID0gaW5wdXQuaW5kZXgoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbmRleDExM18xID0gaW5wdXQuaW5kZXgoKTsKICAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0LnJld2luZCgpOwogICAgICAgICAgICAgICAgICAgICAgICAgcyA9IC0xOwogICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCAoc3lucHJlZDMzX0ludGVybmFsRGF0YURTTCgpKSApIHtzID0gMzt9CkBAIC0yOTczMywxNCArMzEyNzEsMTQgQEAKICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKCAodHJ1ZSkgKSB7cyA9IDQ7fQogCiAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICBpbnB1dC5zZWVrKGluZGV4MTAyXzEpOworICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXQuc2VlayhpbmRleDExM18xKTsKICAgICAgICAgICAgICAgICAgICAgICAgIGlmICggcz49MCApIHJldHVybiBzOwogICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgIGNhc2UgMiA6IAotICAgICAgICAgICAgICAgICAgICAgICAgaW50IExBMTAyXzIgPSBpbnB1dC5MQSgxKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBMQTExM18yID0gaW5wdXQuTEEoMSk7CiAKICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbmRleDEwMl8yID0gaW5wdXQuaW5kZXgoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbmRleDExM18yID0gaW5wdXQuaW5kZXgoKTsKICAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0LnJld2luZCgpOwogICAgICAgICAgICAgICAgICAgICAgICAgcyA9IC0xOwogICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCAoc3lucHJlZDMzX0ludGVybmFsRGF0YURTTCgpKSApIHtzID0gMzt9CkBAIC0yOTc0OCwyMyArMzEyODYsMjMgQEAKICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKCAodHJ1ZSkgKSB7cyA9IDQ7fQogCiAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICBpbnB1dC5zZWVrKGluZGV4MTAyXzIpOworICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXQuc2VlayhpbmRleDExM18yKTsKICAgICAgICAgICAgICAgICAgICAgICAgIGlmICggcz49MCApIHJldHVybiBzOwogICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBpZiAoc3RhdGUuYmFja3RyYWNraW5nPjApIHtzdGF0ZS5mYWlsZWQ9dHJ1ZTsgcmV0dXJuIC0xO30KICAgICAgICAgICAgIE5vVmlhYmxlQWx0RXhjZXB0aW9uIG52YWUgPQotICAgICAgICAgICAgICAgIG5ldyBOb1ZpYWJsZUFsdEV4Y2VwdGlvbihnZXREZXNjcmlwdGlvbigpLCAxMDIsIF9zLCBpbnB1dCk7CisgICAgICAgICAgICAgICAgbmV3IE5vVmlhYmxlQWx0RXhjZXB0aW9uKGdldERlc2NyaXB0aW9uKCksIDExMywgX3MsIGlucHV0KTsKICAgICAgICAgICAgIGVycm9yKG52YWUpOwogICAgICAgICAgICAgdGhyb3cgbnZhZTsKICAgICAgICAgfQogICAgIH0KIAotICAgIGNsYXNzIERGQTEyNSBleHRlbmRzIERGQSB7CisgICAgY2xhc3MgREZBMTM2IGV4dGVuZHMgREZBIHsKIAotICAgICAgICBwdWJsaWMgREZBMTI1KEJhc2VSZWNvZ25pemVyIHJlY29nbml6ZXIpIHsKKyAgICAgICAgcHVibGljIERGQTEzNihCYXNlUmVjb2duaXplciByZWNvZ25pemVyKSB7CiAgICAgICAgICAgICB0aGlzLnJlY29nbml6ZXIgPSByZWNvZ25pemVyOwotICAgICAgICAgICAgdGhpcy5kZWNpc2lvbk51bWJlciA9IDEyNTsKKyAgICAgICAgICAgIHRoaXMuZGVjaXNpb25OdW1iZXIgPSAxMzY7CiAgICAgICAgICAgICB0aGlzLmVvdCA9IGRmYV8zOTsKICAgICAgICAgICAgIHRoaXMuZW9mID0gZGZhXzQwOwogICAgICAgICAgICAgdGhpcy5taW4gPSBkZmFfNDE7CkBAIC0yOTc3NCwxNyArMzEzMTIsMTcgQEAKICAgICAgICAgICAgIHRoaXMudHJhbnNpdGlvbiA9IGRmYV80NTsKICAgICAgICAgfQogICAgICAgICBwdWJsaWMgU3RyaW5nIGdldERlc2NyaXB0aW9uKCkgewotICAgICAgICAgICAgcmV0dXJuICI3MTczOjM6ICggKCAoICggJygnICkgKT0+IChsdl9leHBsaWNpdE9wZXJhdGlvbkNhbGxfN18wPSAnKCcgKSApICggKCAoICggKCkgKCAoICggcnVsZUp2bUZvcm1hbFBhcmFtZXRlciApICkgKCAnLCcgKCAoIHJ1bGVKdm1Gb3JtYWxQYXJhbWV0ZXIgKSApICkqICk/ICggKCAnfCcgKSApICkgKT0+IChsdl9mZWF0dXJlQ2FsbEFyZ3VtZW50c184XzA9IHJ1bGVYU2hvcnRDbG9zdXJlICkgKSB8ICggKCAobHZfZmVhdHVyZUNhbGxBcmd1bWVudHNfOV8wPSBydWxlWEV4cHJlc3Npb24gKSApIChvdGhlcmx2XzEwPSAnLCcgKCAobHZfZmVhdHVyZUNhbGxBcmd1bWVudHNfMTFfMD0gcnVsZVhFeHByZXNzaW9uICkgKSApKiApICk/IG90aGVybHZfMTI9ICcpJyApPyI7CisgICAgICAgICAgICByZXR1cm4gIjc2MTI6MzogKCAoICggKCAnKCcgKSApPT4gKGx2X2V4cGxpY2l0T3BlcmF0aW9uQ2FsbF83XzA9ICcoJyApICkgKCAoICggKCAoKSAoICggKCBydWxlSnZtRm9ybWFsUGFyYW1ldGVyICkgKSAoICcsJyAoICggcnVsZUp2bUZvcm1hbFBhcmFtZXRlciApICkgKSogKT8gKCAoICd8JyApICkgKSApPT4gKGx2X2ZlYXR1cmVDYWxsQXJndW1lbnRzXzhfMD0gcnVsZVhTaG9ydENsb3N1cmUgKSApIHwgKCAoIChsdl9mZWF0dXJlQ2FsbEFyZ3VtZW50c185XzA9IHJ1bGVYRXhwcmVzc2lvbiApICkgKG90aGVybHZfMTA9ICcsJyAoIChsdl9mZWF0dXJlQ2FsbEFyZ3VtZW50c18xMV8wPSBydWxlWEV4cHJlc3Npb24gKSApICkqICkgKT8gb3RoZXJsdl8xMj0gJyknICk/IjsKICAgICAgICAgfQogICAgICAgICBwdWJsaWMgaW50IHNwZWNpYWxTdGF0ZVRyYW5zaXRpb24oaW50IHMsIEludFN0cmVhbSBfaW5wdXQpIHRocm93cyBOb1ZpYWJsZUFsdEV4Y2VwdGlvbiB7CiAgICAgICAgICAgICBUb2tlblN0cmVhbSBpbnB1dCA9IChUb2tlblN0cmVhbSlfaW5wdXQ7CiAgICAgICAgIAlpbnQgX3MgPSBzOwogICAgICAgICAgICAgc3dpdGNoICggcyApIHsKICAgICAgICAgICAgICAgICAgICAgY2FzZSAwIDogCi0gICAgICAgICAgICAgICAgICAgICAgICBpbnQgTEExMjVfMSA9IGlucHV0LkxBKDEpOworICAgICAgICAgICAgICAgICAgICAgICAgaW50IExBMTM2XzEgPSBpbnB1dC5MQSgxKTsKIAogICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgaW50IGluZGV4MTI1XzEgPSBpbnB1dC5pbmRleCgpOworICAgICAgICAgICAgICAgICAgICAgICAgaW50IGluZGV4MTM2XzEgPSBpbnB1dC5pbmRleCgpOwogICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXQucmV3aW5kKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICBzID0gLTE7CiAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIChzeW5wcmVkMzZfSW50ZXJuYWxEYXRhRFNMKCkpICkge3MgPSA3Nzt9CkBAIC0yOTc5MiwyMyArMzEzMzAsMjMgQEAKICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKCAodHJ1ZSkgKSB7cyA9IDI7fQogCiAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICBpbnB1dC5zZWVrKGluZGV4MTI1XzEpOworICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXQuc2VlayhpbmRleDEzNl8xKTsKICAgICAgICAgICAgICAgICAgICAgICAgIGlmICggcz49MCApIHJldHVybiBzOwogICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBpZiAoc3RhdGUuYmFja3RyYWNraW5nPjApIHtzdGF0ZS5mYWlsZWQ9dHJ1ZTsgcmV0dXJuIC0xO30KICAgICAgICAgICAgIE5vVmlhYmxlQWx0RXhjZXB0aW9uIG52YWUgPQotICAgICAgICAgICAgICAgIG5ldyBOb1ZpYWJsZUFsdEV4Y2VwdGlvbihnZXREZXNjcmlwdGlvbigpLCAxMjUsIF9zLCBpbnB1dCk7CisgICAgICAgICAgICAgICAgbmV3IE5vVmlhYmxlQWx0RXhjZXB0aW9uKGdldERlc2NyaXB0aW9uKCksIDEzNiwgX3MsIGlucHV0KTsKICAgICAgICAgICAgIGVycm9yKG52YWUpOwogICAgICAgICAgICAgdGhyb3cgbnZhZTsKICAgICAgICAgfQogICAgIH0KIAotICAgIGNsYXNzIERGQTEyNCBleHRlbmRzIERGQSB7CisgICAgY2xhc3MgREZBMTM1IGV4dGVuZHMgREZBIHsKIAotICAgICAgICBwdWJsaWMgREZBMTI0KEJhc2VSZWNvZ25pemVyIHJlY29nbml6ZXIpIHsKKyAgICAgICAgcHVibGljIERGQTEzNShCYXNlUmVjb2duaXplciByZWNvZ25pemVyKSB7CiAgICAgICAgICAgICB0aGlzLnJlY29nbml6ZXIgPSByZWNvZ25pemVyOwotICAgICAgICAgICAgdGhpcy5kZWNpc2lvbk51bWJlciA9IDEyNDsKKyAgICAgICAgICAgIHRoaXMuZGVjaXNpb25OdW1iZXIgPSAxMzU7CiAgICAgICAgICAgICB0aGlzLmVvdCA9IGRmYV84OwogICAgICAgICAgICAgdGhpcy5lb2YgPSBkZmFfODsKICAgICAgICAgICAgIHRoaXMubWluID0gZGZhXzQ2OwpAQCAtMjk4MTgsNDAgKzMxMzU2LDQwIEBACiAgICAgICAgICAgICB0aGlzLnRyYW5zaXRpb24gPSBkZmFfNTA7CiAgICAgICAgIH0KICAgICAgICAgcHVibGljIFN0cmluZyBnZXREZXNjcmlwdGlvbigpIHsKLSAgICAgICAgICAgIHJldHVybiAiNzE5Mjo0OiAoICggKCAoICgpICggKCAoIHJ1bGVKdm1Gb3JtYWxQYXJhbWV0ZXIgKSApICggJywnICggKCBydWxlSnZtRm9ybWFsUGFyYW1ldGVyICkgKSApKiApPyAoICggJ3wnICkgKSApICk9PiAobHZfZmVhdHVyZUNhbGxBcmd1bWVudHNfOF8wPSBydWxlWFNob3J0Q2xvc3VyZSApICkgfCAoICggKGx2X2ZlYXR1cmVDYWxsQXJndW1lbnRzXzlfMD0gcnVsZVhFeHByZXNzaW9uICkgKSAob3RoZXJsdl8xMD0gJywnICggKGx2X2ZlYXR1cmVDYWxsQXJndW1lbnRzXzExXzA9IHJ1bGVYRXhwcmVzc2lvbiApICkgKSogKSApPyI7CisgICAgICAgICAgICByZXR1cm4gIjc2MzE6NDogKCAoICggKCAoKSAoICggKCBydWxlSnZtRm9ybWFsUGFyYW1ldGVyICkgKSAoICcsJyAoICggcnVsZUp2bUZvcm1hbFBhcmFtZXRlciApICkgKSogKT8gKCAoICd8JyApICkgKSApPT4gKGx2X2ZlYXR1cmVDYWxsQXJndW1lbnRzXzhfMD0gcnVsZVhTaG9ydENsb3N1cmUgKSApIHwgKCAoIChsdl9mZWF0dXJlQ2FsbEFyZ3VtZW50c185XzA9IHJ1bGVYRXhwcmVzc2lvbiApICkgKG90aGVybHZfMTA9ICcsJyAoIChsdl9mZWF0dXJlQ2FsbEFyZ3VtZW50c18xMV8wPSBydWxlWEV4cHJlc3Npb24gKSApICkqICkgKT8iOwogICAgICAgICB9CiAgICAgICAgIHB1YmxpYyBpbnQgc3BlY2lhbFN0YXRlVHJhbnNpdGlvbihpbnQgcywgSW50U3RyZWFtIF9pbnB1dCkgdGhyb3dzIE5vVmlhYmxlQWx0RXhjZXB0aW9uIHsKICAgICAgICAgICAgIFRva2VuU3RyZWFtIGlucHV0ID0gKFRva2VuU3RyZWFtKV9pbnB1dDsKICAgICAgICAgCWludCBfcyA9IHM7CiAgICAgICAgICAgICBzd2l0Y2ggKCBzICkgewogICAgICAgICAgICAgICAgICAgICBjYXNlIDAgOiAKLSAgICAgICAgICAgICAgICAgICAgICAgIGludCBMQTEyNF8wID0gaW5wdXQuTEEoMSk7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgTEExMzVfMCA9IGlucHV0LkxBKDEpOwogCiAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW5kZXgxMjRfMCA9IGlucHV0LmluZGV4KCk7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW5kZXgxMzVfMCA9IGlucHV0LmluZGV4KCk7CiAgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dC5yZXdpbmQoKTsKICAgICAgICAgICAgICAgICAgICAgICAgIHMgPSAtMTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICggKExBMTI0XzA9PVJVTEVfSUQpICkge3MgPSAxO30KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICggKExBMTM1XzA9PVJVTEVfSUQpICkge3MgPSAxO30KIAotICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoIChMQTEyNF8wPT03NCkgKSB7cyA9IDI7fQorICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoIChMQTEzNV8wPT04MSkgKSB7cyA9IDI7fQogCi0gICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICggKExBMTI0XzA9PTk5KSAmJiAoc3lucHJlZDM3X0ludGVybmFsRGF0YURTTCgpKSkge3MgPSAzO30KKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKCAoTEExMzVfMD09MTA2KSAmJiAoc3lucHJlZDM3X0ludGVybmFsRGF0YURTTCgpKSkge3MgPSAzO30KIAotICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoIChMQTEyNF8wPT0xMTIpICYmIChzeW5wcmVkMzdfSW50ZXJuYWxEYXRhRFNMKCkpKSB7cyA9IDQ7fQorICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoIChMQTEzNV8wPT0xMTkpICYmIChzeW5wcmVkMzdfSW50ZXJuYWxEYXRhRFNMKCkpKSB7cyA9IDQ7fQogCi0gICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICggKChMQTEyNF8wPj1SVUxFX1NUUklORyAmJiBMQTEyNF8wPD1SVUxFX0lOVCl8fChMQTEyNF8wPj1SVUxFX0hFWCAmJiBMQTEyNF8wPD1SVUxFX0RFQ0lNQUwpfHxMQTEyNF8wPT0xNXx8TEExMjRfMD09NDZ8fExBMTI0XzA9PTY1fHwoTEExMjRfMD49NjggJiYgTEExMjRfMDw9NjkpfHwoTEExMjRfMD49NzggJiYgTEExMjRfMDw9NzkpfHxMQTEyNF8wPT04Nnx8KExBMTI0XzA+PTEwMiAmJiBMQTEyNF8wPD0xMDMpfHxMQTEyNF8wPT0xMDd8fExBMTI0XzA9PTExM3x8TEExMjRfMD09MTE1fHwoTEExMjRfMD49MTE5ICYmIExBMTI0XzA8PTEyMCl8fChMQTEyNF8wPj0xMjMgJiYgTEExMjRfMDw9MTMyKXx8TEExMjRfMD09MTM0KSApIHtzID0gNTt9CisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICggKChMQTEzNV8wPj1SVUxFX1NUUklORyAmJiBMQTEzNV8wPD1SVUxFX0lOVCl8fChMQTEzNV8wPj1SVUxFX0hFWCAmJiBMQTEzNV8wPD1SVUxFX0RFQ0lNQUwpfHxMQTEzNV8wPT0xNXx8TEExMzVfMD09NTB8fExBMTM1XzA9PTcyfHwoTEExMzVfMD49NzUgJiYgTEExMzVfMDw9NzYpfHwoTEExMzVfMD49ODUgJiYgTEExMzVfMDw9ODYpfHxMQTEzNV8wPT05M3x8KExBMTM1XzA+PTEwOSAmJiBMQTEzNV8wPD0xMTApfHxMQTEzNV8wPT0xMTR8fExBMTM1XzA9PTEyMHx8TEExMzVfMD09MTIyfHwoTEExMzVfMD49MTI2ICYmIExBMTM1XzA8PTEyNyl8fChMQTEzNV8wPj0xMzAgJiYgTEExMzVfMDw9MTM5KXx8TEExMzVfMD09MTQxKSApIHtzID0gNTt9CiAKLSAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKCAoTEExMjRfMD09NzYpICkge3MgPSAzNTt9CisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICggKExBMTM1XzA9PTgzKSApIHtzID0gMzU7fQogCiAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICBpbnB1dC5zZWVrKGluZGV4MTI0XzApOworICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXQuc2VlayhpbmRleDEzNV8wKTsKICAgICAgICAgICAgICAgICAgICAgICAgIGlmICggcz49MCApIHJldHVybiBzOwogICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgIGNhc2UgMSA6IAotICAgICAgICAgICAgICAgICAgICAgICAgaW50IExBMTI0XzEgPSBpbnB1dC5MQSgxKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBMQTEzNV8xID0gaW5wdXQuTEEoMSk7CiAKICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbmRleDEyNF8xID0gaW5wdXQuaW5kZXgoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbmRleDEzNV8xID0gaW5wdXQuaW5kZXgoKTsKICAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0LnJld2luZCgpOwogICAgICAgICAgICAgICAgICAgICAgICAgcyA9IC0xOwogICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCAoc3lucHJlZDM3X0ludGVybmFsRGF0YURTTCgpKSApIHtzID0gNDt9CkBAIC0yOTg1OSwxNCArMzEzOTcsMTQgQEAKICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKCAodHJ1ZSkgKSB7cyA9IDU7fQogCiAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICBpbnB1dC5zZWVrKGluZGV4MTI0XzEpOworICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXQuc2VlayhpbmRleDEzNV8xKTsKICAgICAgICAgICAgICAgICAgICAgICAgIGlmICggcz49MCApIHJldHVybiBzOwogICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgIGNhc2UgMiA6IAotICAgICAgICAgICAgICAgICAgICAgICAgaW50IExBMTI0XzIgPSBpbnB1dC5MQSgxKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBMQTEzNV8yID0gaW5wdXQuTEEoMSk7CiAKICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbmRleDEyNF8yID0gaW5wdXQuaW5kZXgoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbmRleDEzNV8yID0gaW5wdXQuaW5kZXgoKTsKICAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0LnJld2luZCgpOwogICAgICAgICAgICAgICAgICAgICAgICAgcyA9IC0xOwogICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCAoc3lucHJlZDM3X0ludGVybmFsRGF0YURTTCgpKSApIHtzID0gNDt9CkBAIC0yOTg3NCwyMyArMzE0MTIsMjMgQEAKICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKCAodHJ1ZSkgKSB7cyA9IDU7fQogCiAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICBpbnB1dC5zZWVrKGluZGV4MTI0XzIpOworICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXQuc2VlayhpbmRleDEzNV8yKTsKICAgICAgICAgICAgICAgICAgICAgICAgIGlmICggcz49MCApIHJldHVybiBzOwogICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBpZiAoc3RhdGUuYmFja3RyYWNraW5nPjApIHtzdGF0ZS5mYWlsZWQ9dHJ1ZTsgcmV0dXJuIC0xO30KICAgICAgICAgICAgIE5vVmlhYmxlQWx0RXhjZXB0aW9uIG52YWUgPQotICAgICAgICAgICAgICAgIG5ldyBOb1ZpYWJsZUFsdEV4Y2VwdGlvbihnZXREZXNjcmlwdGlvbigpLCAxMjQsIF9zLCBpbnB1dCk7CisgICAgICAgICAgICAgICAgbmV3IE5vVmlhYmxlQWx0RXhjZXB0aW9uKGdldERlc2NyaXB0aW9uKCksIDEzNSwgX3MsIGlucHV0KTsKICAgICAgICAgICAgIGVycm9yKG52YWUpOwogICAgICAgICAgICAgdGhyb3cgbnZhZTsKICAgICAgICAgfQogICAgIH0KIAotICAgIGNsYXNzIERGQTEyNiBleHRlbmRzIERGQSB7CisgICAgY2xhc3MgREZBMTM3IGV4dGVuZHMgREZBIHsKIAotICAgICAgICBwdWJsaWMgREZBMTI2KEJhc2VSZWNvZ25pemVyIHJlY29nbml6ZXIpIHsKKyAgICAgICAgcHVibGljIERGQTEzNyhCYXNlUmVjb2duaXplciByZWNvZ25pemVyKSB7CiAgICAgICAgICAgICB0aGlzLnJlY29nbml6ZXIgPSByZWNvZ25pemVyOwotICAgICAgICAgICAgdGhpcy5kZWNpc2lvbk51bWJlciA9IDEyNjsKKyAgICAgICAgICAgIHRoaXMuZGVjaXNpb25OdW1iZXIgPSAxMzc7CiAgICAgICAgICAgICB0aGlzLmVvdCA9IGRmYV8zOTsKICAgICAgICAgICAgIHRoaXMuZW9mID0gZGZhXzQwOwogICAgICAgICAgICAgdGhpcy5taW4gPSBkZmFfNDE7CkBAIC0yOTkwMCwxNyArMzE0MzgsMTcgQEAKICAgICAgICAgICAgIHRoaXMudHJhbnNpdGlvbiA9IGRmYV81MTsKICAgICAgICAgfQogICAgICAgICBwdWJsaWMgU3RyaW5nIGdldERlc2NyaXB0aW9uKCkgewotICAgICAgICAgICAgcmV0dXJuICI3MjkwOjM6ICggKCAoICgpICdbJyApICk9PiAobHZfZmVhdHVyZUNhbGxBcmd1bWVudHNfMTNfMD0gcnVsZVhDbG9zdXJlICkgKT8iOworICAgICAgICAgICAgcmV0dXJuICI3NzI5OjM6ICggKCAoICgpICdbJyApICk9PiAobHZfZmVhdHVyZUNhbGxBcmd1bWVudHNfMTNfMD0gcnVsZVhDbG9zdXJlICkgKT8iOwogICAgICAgICB9CiAgICAgICAgIHB1YmxpYyBpbnQgc3BlY2lhbFN0YXRlVHJhbnNpdGlvbihpbnQgcywgSW50U3RyZWFtIF9pbnB1dCkgdGhyb3dzIE5vVmlhYmxlQWx0RXhjZXB0aW9uIHsKICAgICAgICAgICAgIFRva2VuU3RyZWFtIGlucHV0ID0gKFRva2VuU3RyZWFtKV9pbnB1dDsKICAgICAgICAgCWludCBfcyA9IHM7CiAgICAgICAgICAgICBzd2l0Y2ggKCBzICkgewogICAgICAgICAgICAgICAgICAgICBjYXNlIDAgOiAKLSAgICAgICAgICAgICAgICAgICAgICAgIGludCBMQTEyNl8xID0gaW5wdXQuTEEoMSk7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgTEExMzdfMSA9IGlucHV0LkxBKDEpOwogCiAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW5kZXgxMjZfMSA9IGlucHV0LmluZGV4KCk7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW5kZXgxMzdfMSA9IGlucHV0LmluZGV4KCk7CiAgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dC5yZXdpbmQoKTsKICAgICAgICAgICAgICAgICAgICAgICAgIHMgPSAtMTsKICAgICAgICAgICAgICAgICAgICAgICAgIGlmICggKHN5bnByZWQzOF9JbnRlcm5hbERhdGFEU0woKSkgKSB7cyA9IDc3O30KQEAgLTI5OTE4LDE5ICszMTQ1NiwxOSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoICh0cnVlKSApIHtzID0gMjt9CiAKICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0LnNlZWsoaW5kZXgxMjZfMSk7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dC5zZWVrKGluZGV4MTM3XzEpOwogICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCBzPj0wICkgcmV0dXJuIHM7CiAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGlmIChzdGF0ZS5iYWNrdHJhY2tpbmc+MCkge3N0YXRlLmZhaWxlZD10cnVlOyByZXR1cm4gLTE7fQogICAgICAgICAgICAgTm9WaWFibGVBbHRFeGNlcHRpb24gbnZhZSA9Ci0gICAgICAgICAgICAgICAgbmV3IE5vVmlhYmxlQWx0RXhjZXB0aW9uKGdldERlc2NyaXB0aW9uKCksIDEyNiwgX3MsIGlucHV0KTsKKyAgICAgICAgICAgICAgICBuZXcgTm9WaWFibGVBbHRFeGNlcHRpb24oZ2V0RGVzY3JpcHRpb24oKSwgMTM3LCBfcywgaW5wdXQpOwogICAgICAgICAgICAgZXJyb3IobnZhZSk7CiAgICAgICAgICAgICB0aHJvdyBudmFlOwogICAgICAgICB9CiAgICAgfQogICAgIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBkZmFfNzFzID0gewotICAgICAgICAgICAgIlw1XDJcNlx1ZmZmZlwyXDJcMzVcdWZmZmZcMVwyXDE2XHVmZmZmXDFcMlwzXHVmZmZmXDFcMlwxXHVmZmZmXDRcMlwxXHVmZmZmXDFcMlwxXHVmZmZmXDNcMlwxXHVmZmZmXDEwXDJcMVwxXDMxXDJcMVx1ZmZmZlwyN1wyIiwKKyAgICAgICAgICAgICJcNVwyXDZcdWZmZmZcMlwyXDQxXHVmZmZmXDFcMlwyMVx1ZmZmZlwxXDJcM1x1ZmZmZlwxXDJcMVx1ZmZmZlw0XDJcMVx1ZmZmZlwxXDJcMVx1ZmZmZlwzXDJcMVx1ZmZmZlwxMFwyXDFcMVwzMVwyXDFcdWZmZmZcMjdcMiIsCiAgICAgICAgICAgICAiXDFcdWZmZmYiLAogICAgICAgICAgICAgIiIsCiAgICAgICAgICAgICAiIiwKQEAgLTMwMDExLDExICszMTU0OSwxMSBAQAogICAgIH07CiAgICAgc3RhdGljIGZpbmFsIHNob3J0W11bXSBkZmFfNzEgPSB1bnBhY2tFbmNvZGVkU3RyaW5nQXJyYXkoZGZhXzcxcyk7CiAKLSAgICBjbGFzcyBERkExMzAgZXh0ZW5kcyBERkEgeworICAgIGNsYXNzIERGQTE0MSBleHRlbmRzIERGQSB7CiAKLSAgICAgICAgcHVibGljIERGQTEzMChCYXNlUmVjb2duaXplciByZWNvZ25pemVyKSB7CisgICAgICAgIHB1YmxpYyBERkExNDEoQmFzZVJlY29nbml6ZXIgcmVjb2duaXplcikgewogICAgICAgICAgICAgdGhpcy5yZWNvZ25pemVyID0gcmVjb2duaXplcjsKLSAgICAgICAgICAgIHRoaXMuZGVjaXNpb25OdW1iZXIgPSAxMzA7CisgICAgICAgICAgICB0aGlzLmRlY2lzaW9uTnVtYmVyID0gMTQxOwogICAgICAgICAgICAgdGhpcy5lb3QgPSBkZmFfMzk7CiAgICAgICAgICAgICB0aGlzLmVvZiA9IGRmYV80MDsKICAgICAgICAgICAgIHRoaXMubWluID0gZGZhXzQxOwpAQCAtMzAwMjUsMTcgKzMxNTYzLDE3IEBACiAgICAgICAgICAgICB0aGlzLnRyYW5zaXRpb24gPSBkZmFfNzE7CiAgICAgICAgIH0KICAgICAgICAgcHVibGljIFN0cmluZyBnZXREZXNjcmlwdGlvbigpIHsKLSAgICAgICAgICAgIHJldHVybiAiNzQ0OTozOiAoICggKCAnPCcgKT0+b3RoZXJsdl8zPSAnPCcgKSAoIChsdl90eXBlQXJndW1lbnRzXzRfMD0gcnVsZUp2bUFyZ3VtZW50VHlwZVJlZmVyZW5jZSApICkgKG90aGVybHZfNT0gJywnICggKGx2X3R5cGVBcmd1bWVudHNfNl8wPSBydWxlSnZtQXJndW1lbnRUeXBlUmVmZXJlbmNlICkgKSApKiBvdGhlcmx2Xzc9ICc+JyApPyI7CisgICAgICAgICAgICByZXR1cm4gIjc4ODg6MzogKCAoICggJzwnICk9Pm90aGVybHZfMz0gJzwnICkgKCAobHZfdHlwZUFyZ3VtZW50c180XzA9IHJ1bGVKdm1Bcmd1bWVudFR5cGVSZWZlcmVuY2UgKSApIChvdGhlcmx2XzU9ICcsJyAoIChsdl90eXBlQXJndW1lbnRzXzZfMD0gcnVsZUp2bUFyZ3VtZW50VHlwZVJlZmVyZW5jZSApICkgKSogb3RoZXJsdl83PSAnPicgKT8iOwogICAgICAgICB9CiAgICAgICAgIHB1YmxpYyBpbnQgc3BlY2lhbFN0YXRlVHJhbnNpdGlvbihpbnQgcywgSW50U3RyZWFtIF9pbnB1dCkgdGhyb3dzIE5vVmlhYmxlQWx0RXhjZXB0aW9uIHsKICAgICAgICAgICAgIFRva2VuU3RyZWFtIGlucHV0ID0gKFRva2VuU3RyZWFtKV9pbnB1dDsKICAgICAgICAgCWludCBfcyA9IHM7CiAgICAgICAgICAgICBzd2l0Y2ggKCBzICkgewogICAgICAgICAgICAgICAgICAgICBjYXNlIDAgOiAKLSAgICAgICAgICAgICAgICAgICAgICAgIGludCBMQTEzMF8xID0gaW5wdXQuTEEoMSk7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgTEExNDFfMSA9IGlucHV0LkxBKDEpOwogCiAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW5kZXgxMzBfMSA9IGlucHV0LmluZGV4KCk7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW5kZXgxNDFfMSA9IGlucHV0LmluZGV4KCk7CiAgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dC5yZXdpbmQoKTsKICAgICAgICAgICAgICAgICAgICAgICAgIHMgPSAtMTsKICAgICAgICAgICAgICAgICAgICAgICAgIGlmICggKHN5bnByZWQzOV9JbnRlcm5hbERhdGFEU0woKSkgKSB7cyA9IDc3O30KQEAgLTMwMDQzLDIzICszMTU4MSwyMyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoICh0cnVlKSApIHtzID0gMjt9CiAKICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0LnNlZWsoaW5kZXgxMzBfMSk7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dC5zZWVrKGluZGV4MTQxXzEpOwogICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCBzPj0wICkgcmV0dXJuIHM7CiAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGlmIChzdGF0ZS5iYWNrdHJhY2tpbmc+MCkge3N0YXRlLmZhaWxlZD10cnVlOyByZXR1cm4gLTE7fQogICAgICAgICAgICAgTm9WaWFibGVBbHRFeGNlcHRpb24gbnZhZSA9Ci0gICAgICAgICAgICAgICAgbmV3IE5vVmlhYmxlQWx0RXhjZXB0aW9uKGdldERlc2NyaXB0aW9uKCksIDEzMCwgX3MsIGlucHV0KTsKKyAgICAgICAgICAgICAgICBuZXcgTm9WaWFibGVBbHRFeGNlcHRpb24oZ2V0RGVzY3JpcHRpb24oKSwgMTQxLCBfcywgaW5wdXQpOwogICAgICAgICAgICAgZXJyb3IobnZhZSk7CiAgICAgICAgICAgICB0aHJvdyBudmFlOwogICAgICAgICB9CiAgICAgfQogCi0gICAgY2xhc3MgREZBMTMzIGV4dGVuZHMgREZBIHsKKyAgICBjbGFzcyBERkExNDQgZXh0ZW5kcyBERkEgewogCi0gICAgICAgIHB1YmxpYyBERkExMzMoQmFzZVJlY29nbml6ZXIgcmVjb2duaXplcikgeworICAgICAgICBwdWJsaWMgREZBMTQ0KEJhc2VSZWNvZ25pemVyIHJlY29nbml6ZXIpIHsKICAgICAgICAgICAgIHRoaXMucmVjb2duaXplciA9IHJlY29nbml6ZXI7Ci0gICAgICAgICAgICB0aGlzLmRlY2lzaW9uTnVtYmVyID0gMTMzOworICAgICAgICAgICAgdGhpcy5kZWNpc2lvbk51bWJlciA9IDE0NDsKICAgICAgICAgICAgIHRoaXMuZW90ID0gZGZhXzM5OwogICAgICAgICAgICAgdGhpcy5lb2YgPSBkZmFfNDA7CiAgICAgICAgICAgICB0aGlzLm1pbiA9IGRmYV80MTsKQEAgLTMwMDY5LDE3ICszMTYwNywxNyBAQAogICAgICAgICAgICAgdGhpcy50cmFuc2l0aW9uID0gZGZhXzQ1OwogICAgICAgICB9CiAgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0RGVzY3JpcHRpb24oKSB7Ci0gICAgICAgICAgICByZXR1cm4gIjc1MDY6MzogKCAoICggKCAnKCcgKSApPT4gKGx2X2V4cGxpY2l0Q29uc3RydWN0b3JDYWxsXzhfMD0gJygnICkgKSAoICggKCAoICgpICggKCAoIHJ1bGVKdm1Gb3JtYWxQYXJhbWV0ZXIgKSApICggJywnICggKCBydWxlSnZtRm9ybWFsUGFyYW1ldGVyICkgKSApKiApPyAoICggJ3wnICkgKSApICk9PiAobHZfYXJndW1lbnRzXzlfMD0gcnVsZVhTaG9ydENsb3N1cmUgKSApIHwgKCAoIChsdl9hcmd1bWVudHNfMTBfMD0gcnVsZVhFeHByZXNzaW9uICkgKSAob3RoZXJsdl8xMT0gJywnICggKGx2X2FyZ3VtZW50c18xMl8wPSBydWxlWEV4cHJlc3Npb24gKSApICkqICkgKT8gb3RoZXJsdl8xMz0gJyknICk/IjsKKyAgICAgICAgICAgIHJldHVybiAiNzk0NTozOiAoICggKCAoICcoJyApICk9PiAobHZfZXhwbGljaXRDb25zdHJ1Y3RvckNhbGxfOF8wPSAnKCcgKSApICggKCAoICggKCkgKCAoICggcnVsZUp2bUZvcm1hbFBhcmFtZXRlciApICkgKCAnLCcgKCAoIHJ1bGVKdm1Gb3JtYWxQYXJhbWV0ZXIgKSApICkqICk/ICggKCAnfCcgKSApICkgKT0+IChsdl9hcmd1bWVudHNfOV8wPSBydWxlWFNob3J0Q2xvc3VyZSApICkgfCAoICggKGx2X2FyZ3VtZW50c18xMF8wPSBydWxlWEV4cHJlc3Npb24gKSApIChvdGhlcmx2XzExPSAnLCcgKCAobHZfYXJndW1lbnRzXzEyXzA9IHJ1bGVYRXhwcmVzc2lvbiApICkgKSogKSApPyBvdGhlcmx2XzEzPSAnKScgKT8iOwogICAgICAgICB9CiAgICAgICAgIHB1YmxpYyBpbnQgc3BlY2lhbFN0YXRlVHJhbnNpdGlvbihpbnQgcywgSW50U3RyZWFtIF9pbnB1dCkgdGhyb3dzIE5vVmlhYmxlQWx0RXhjZXB0aW9uIHsKICAgICAgICAgICAgIFRva2VuU3RyZWFtIGlucHV0ID0gKFRva2VuU3RyZWFtKV9pbnB1dDsKICAgICAgICAgCWludCBfcyA9IHM7CiAgICAgICAgICAgICBzd2l0Y2ggKCBzICkgewogICAgICAgICAgICAgICAgICAgICBjYXNlIDAgOiAKLSAgICAgICAgICAgICAgICAgICAgICAgIGludCBMQTEzM18xID0gaW5wdXQuTEEoMSk7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgTEExNDRfMSA9IGlucHV0LkxBKDEpOwogCiAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW5kZXgxMzNfMSA9IGlucHV0LmluZGV4KCk7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW5kZXgxNDRfMSA9IGlucHV0LmluZGV4KCk7CiAgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dC5yZXdpbmQoKTsKICAgICAgICAgICAgICAgICAgICAgICAgIHMgPSAtMTsKICAgICAgICAgICAgICAgICAgICAgICAgIGlmICggKHN5bnByZWQ0MF9JbnRlcm5hbERhdGFEU0woKSkgKSB7cyA9IDc3O30KQEAgLTMwMDg3LDIzICszMTYyNSwyMyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoICh0cnVlKSApIHtzID0gMjt9CiAKICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0LnNlZWsoaW5kZXgxMzNfMSk7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dC5zZWVrKGluZGV4MTQ0XzEpOwogICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCBzPj0wICkgcmV0dXJuIHM7CiAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGlmIChzdGF0ZS5iYWNrdHJhY2tpbmc+MCkge3N0YXRlLmZhaWxlZD10cnVlOyByZXR1cm4gLTE7fQogICAgICAgICAgICAgTm9WaWFibGVBbHRFeGNlcHRpb24gbnZhZSA9Ci0gICAgICAgICAgICAgICAgbmV3IE5vVmlhYmxlQWx0RXhjZXB0aW9uKGdldERlc2NyaXB0aW9uKCksIDEzMywgX3MsIGlucHV0KTsKKyAgICAgICAgICAgICAgICBuZXcgTm9WaWFibGVBbHRFeGNlcHRpb24oZ2V0RGVzY3JpcHRpb24oKSwgMTQ0LCBfcywgaW5wdXQpOwogICAgICAgICAgICAgZXJyb3IobnZhZSk7CiAgICAgICAgICAgICB0aHJvdyBudmFlOwogICAgICAgICB9CiAgICAgfQogCi0gICAgY2xhc3MgREZBMTMyIGV4dGVuZHMgREZBIHsKKyAgICBjbGFzcyBERkExNDMgZXh0ZW5kcyBERkEgewogCi0gICAgICAgIHB1YmxpYyBERkExMzIoQmFzZVJlY29nbml6ZXIgcmVjb2duaXplcikgeworICAgICAgICBwdWJsaWMgREZBMTQzKEJhc2VSZWNvZ25pemVyIHJlY29nbml6ZXIpIHsKICAgICAgICAgICAgIHRoaXMucmVjb2duaXplciA9IHJlY29nbml6ZXI7Ci0gICAgICAgICAgICB0aGlzLmRlY2lzaW9uTnVtYmVyID0gMTMyOworICAgICAgICAgICAgdGhpcy5kZWNpc2lvbk51bWJlciA9IDE0MzsKICAgICAgICAgICAgIHRoaXMuZW90ID0gZGZhXzg7CiAgICAgICAgICAgICB0aGlzLmVvZiA9IGRmYV84OwogICAgICAgICAgICAgdGhpcy5taW4gPSBkZmFfNDY7CkBAIC0zMDExMyw0MCArMzE2NTEsNDAgQEAKICAgICAgICAgICAgIHRoaXMudHJhbnNpdGlvbiA9IGRmYV81MDsKICAgICAgICAgfQogICAgICAgICBwdWJsaWMgU3RyaW5nIGdldERlc2NyaXB0aW9uKCkgewotICAgICAgICAgICAgcmV0dXJuICI3NTI1OjQ6ICggKCAoICggKCkgKCAoICggcnVsZUp2bUZvcm1hbFBhcmFtZXRlciApICkgKCAnLCcgKCAoIHJ1bGVKdm1Gb3JtYWxQYXJhbWV0ZXIgKSApICkqICk/ICggKCAnfCcgKSApICkgKT0+IChsdl9hcmd1bWVudHNfOV8wPSBydWxlWFNob3J0Q2xvc3VyZSApICkgfCAoICggKGx2X2FyZ3VtZW50c18xMF8wPSBydWxlWEV4cHJlc3Npb24gKSApIChvdGhlcmx2XzExPSAnLCcgKCAobHZfYXJndW1lbnRzXzEyXzA9IHJ1bGVYRXhwcmVzc2lvbiApICkgKSogKSApPyI7CisgICAgICAgICAgICByZXR1cm4gIjc5NjQ6NDogKCAoICggKCAoKSAoICggKCBydWxlSnZtRm9ybWFsUGFyYW1ldGVyICkgKSAoICcsJyAoICggcnVsZUp2bUZvcm1hbFBhcmFtZXRlciApICkgKSogKT8gKCAoICd8JyApICkgKSApPT4gKGx2X2FyZ3VtZW50c185XzA9IHJ1bGVYU2hvcnRDbG9zdXJlICkgKSB8ICggKCAobHZfYXJndW1lbnRzXzEwXzA9IHJ1bGVYRXhwcmVzc2lvbiApICkgKG90aGVybHZfMTE9ICcsJyAoIChsdl9hcmd1bWVudHNfMTJfMD0gcnVsZVhFeHByZXNzaW9uICkgKSApKiApICk/IjsKICAgICAgICAgfQogICAgICAgICBwdWJsaWMgaW50IHNwZWNpYWxTdGF0ZVRyYW5zaXRpb24oaW50IHMsIEludFN0cmVhbSBfaW5wdXQpIHRocm93cyBOb1ZpYWJsZUFsdEV4Y2VwdGlvbiB7CiAgICAgICAgICAgICBUb2tlblN0cmVhbSBpbnB1dCA9IChUb2tlblN0cmVhbSlfaW5wdXQ7CiAgICAgICAgIAlpbnQgX3MgPSBzOwogICAgICAgICAgICAgc3dpdGNoICggcyApIHsKICAgICAgICAgICAgICAgICAgICAgY2FzZSAwIDogCi0gICAgICAgICAgICAgICAgICAgICAgICBpbnQgTEExMzJfMCA9IGlucHV0LkxBKDEpOworICAgICAgICAgICAgICAgICAgICAgICAgaW50IExBMTQzXzAgPSBpbnB1dC5MQSgxKTsKIAogICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgaW50IGluZGV4MTMyXzAgPSBpbnB1dC5pbmRleCgpOworICAgICAgICAgICAgICAgICAgICAgICAgaW50IGluZGV4MTQzXzAgPSBpbnB1dC5pbmRleCgpOwogICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXQucmV3aW5kKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICBzID0gLTE7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIChMQTEzMl8wPT1SVUxFX0lEKSApIHtzID0gMTt9CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIChMQTE0M18wPT1SVUxFX0lEKSApIHtzID0gMTt9CiAKLSAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKCAoTEExMzJfMD09NzQpICkge3MgPSAyO30KKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKCAoTEExNDNfMD09ODEpICkge3MgPSAyO30KIAotICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoIChMQTEzMl8wPT05OSkgJiYgKHN5bnByZWQ0MV9JbnRlcm5hbERhdGFEU0woKSkpIHtzID0gMzt9CisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICggKExBMTQzXzA9PTEwNikgJiYgKHN5bnByZWQ0MV9JbnRlcm5hbERhdGFEU0woKSkpIHtzID0gMzt9CiAKLSAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKCAoTEExMzJfMD09MTEyKSAmJiAoc3lucHJlZDQxX0ludGVybmFsRGF0YURTTCgpKSkge3MgPSA0O30KKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKCAoTEExNDNfMD09MTE5KSAmJiAoc3lucHJlZDQxX0ludGVybmFsRGF0YURTTCgpKSkge3MgPSA0O30KIAotICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoICgoTEExMzJfMD49UlVMRV9TVFJJTkcgJiYgTEExMzJfMDw9UlVMRV9JTlQpfHwoTEExMzJfMD49UlVMRV9IRVggJiYgTEExMzJfMDw9UlVMRV9ERUNJTUFMKXx8TEExMzJfMD09MTV8fExBMTMyXzA9PTQ2fHxMQTEzMl8wPT02NXx8KExBMTMyXzA+PTY4ICYmIExBMTMyXzA8PTY5KXx8KExBMTMyXzA+PTc4ICYmIExBMTMyXzA8PTc5KXx8TEExMzJfMD09ODZ8fChMQTEzMl8wPj0xMDIgJiYgTEExMzJfMDw9MTAzKXx8TEExMzJfMD09MTA3fHxMQTEzMl8wPT0xMTN8fExBMTMyXzA9PTExNXx8KExBMTMyXzA+PTExOSAmJiBMQTEzMl8wPD0xMjApfHwoTEExMzJfMD49MTIzICYmIExBMTMyXzA8PTEzMil8fExBMTMyXzA9PTEzNCkgKSB7cyA9IDU7fQorICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoICgoTEExNDNfMD49UlVMRV9TVFJJTkcgJiYgTEExNDNfMDw9UlVMRV9JTlQpfHwoTEExNDNfMD49UlVMRV9IRVggJiYgTEExNDNfMDw9UlVMRV9ERUNJTUFMKXx8TEExNDNfMD09MTV8fExBMTQzXzA9PTUwfHxMQTE0M18wPT03Mnx8KExBMTQzXzA+PTc1ICYmIExBMTQzXzA8PTc2KXx8KExBMTQzXzA+PTg1ICYmIExBMTQzXzA8PTg2KXx8TEExNDNfMD09OTN8fChMQTE0M18wPj0xMDkgJiYgTEExNDNfMDw9MTEwKXx8TEExNDNfMD09MTE0fHxMQTE0M18wPT0xMjB8fExBMTQzXzA9PTEyMnx8KExBMTQzXzA+PTEyNiAmJiBMQTE0M18wPD0xMjcpfHwoTEExNDNfMD49MTMwICYmIExBMTQzXzA8PTEzOSl8fExBMTQzXzA9PTE0MSkgKSB7cyA9IDU7fQogCi0gICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICggKExBMTMyXzA9PTc2KSApIHtzID0gMzU7fQorICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoIChMQTE0M18wPT04MykgKSB7cyA9IDM1O30KIAogICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXQuc2VlayhpbmRleDEzMl8wKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0LnNlZWsoaW5kZXgxNDNfMCk7CiAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIHM+PTAgKSByZXR1cm4gczsKICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICBjYXNlIDEgOiAKLSAgICAgICAgICAgICAgICAgICAgICAgIGludCBMQTEzMl8xID0gaW5wdXQuTEEoMSk7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgTEExNDNfMSA9IGlucHV0LkxBKDEpOwogCiAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW5kZXgxMzJfMSA9IGlucHV0LmluZGV4KCk7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW5kZXgxNDNfMSA9IGlucHV0LmluZGV4KCk7CiAgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dC5yZXdpbmQoKTsKICAgICAgICAgICAgICAgICAgICAgICAgIHMgPSAtMTsKICAgICAgICAgICAgICAgICAgICAgICAgIGlmICggKHN5bnByZWQ0MV9JbnRlcm5hbERhdGFEU0woKSkgKSB7cyA9IDQ7fQpAQCAtMzAxNTQsMTQgKzMxNjkyLDE0IEBACiAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICggKHRydWUpICkge3MgPSA1O30KIAogICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXQuc2VlayhpbmRleDEzMl8xKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0LnNlZWsoaW5kZXgxNDNfMSk7CiAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIHM+PTAgKSByZXR1cm4gczsKICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICBjYXNlIDIgOiAKLSAgICAgICAgICAgICAgICAgICAgICAgIGludCBMQTEzMl8yID0gaW5wdXQuTEEoMSk7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgTEExNDNfMiA9IGlucHV0LkxBKDEpOwogCiAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW5kZXgxMzJfMiA9IGlucHV0LmluZGV4KCk7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW5kZXgxNDNfMiA9IGlucHV0LmluZGV4KCk7CiAgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dC5yZXdpbmQoKTsKICAgICAgICAgICAgICAgICAgICAgICAgIHMgPSAtMTsKICAgICAgICAgICAgICAgICAgICAgICAgIGlmICggKHN5bnByZWQ0MV9JbnRlcm5hbERhdGFEU0woKSkgKSB7cyA9IDQ7fQpAQCAtMzAxNjksMjMgKzMxNzA3LDIzIEBACiAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICggKHRydWUpICkge3MgPSA1O30KIAogICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXQuc2VlayhpbmRleDEzMl8yKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0LnNlZWsoaW5kZXgxNDNfMik7CiAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIHM+PTAgKSByZXR1cm4gczsKICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgaWYgKHN0YXRlLmJhY2t0cmFja2luZz4wKSB7c3RhdGUuZmFpbGVkPXRydWU7IHJldHVybiAtMTt9CiAgICAgICAgICAgICBOb1ZpYWJsZUFsdEV4Y2VwdGlvbiBudmFlID0KLSAgICAgICAgICAgICAgICBuZXcgTm9WaWFibGVBbHRFeGNlcHRpb24oZ2V0RGVzY3JpcHRpb24oKSwgMTMyLCBfcywgaW5wdXQpOworICAgICAgICAgICAgICAgIG5ldyBOb1ZpYWJsZUFsdEV4Y2VwdGlvbihnZXREZXNjcmlwdGlvbigpLCAxNDMsIF9zLCBpbnB1dCk7CiAgICAgICAgICAgICBlcnJvcihudmFlKTsKICAgICAgICAgICAgIHRocm93IG52YWU7CiAgICAgICAgIH0KICAgICB9CiAKLSAgICBjbGFzcyBERkExMzQgZXh0ZW5kcyBERkEgeworICAgIGNsYXNzIERGQTE0NSBleHRlbmRzIERGQSB7CiAKLSAgICAgICAgcHVibGljIERGQTEzNChCYXNlUmVjb2duaXplciByZWNvZ25pemVyKSB7CisgICAgICAgIHB1YmxpYyBERkExNDUoQmFzZVJlY29nbml6ZXIgcmVjb2duaXplcikgewogICAgICAgICAgICAgdGhpcy5yZWNvZ25pemVyID0gcmVjb2duaXplcjsKLSAgICAgICAgICAgIHRoaXMuZGVjaXNpb25OdW1iZXIgPSAxMzQ7CisgICAgICAgICAgICB0aGlzLmRlY2lzaW9uTnVtYmVyID0gMTQ1OwogICAgICAgICAgICAgdGhpcy5lb3QgPSBkZmFfMzk7CiAgICAgICAgICAgICB0aGlzLmVvZiA9IGRmYV80MDsKICAgICAgICAgICAgIHRoaXMubWluID0gZGZhXzQxOwpAQCAtMzAxOTUsMTcgKzMxNzMzLDE3IEBACiAgICAgICAgICAgICB0aGlzLnRyYW5zaXRpb24gPSBkZmFfNTE7CiAgICAgICAgIH0KICAgICAgICAgcHVibGljIFN0cmluZyBnZXREZXNjcmlwdGlvbigpIHsKLSAgICAgICAgICAgIHJldHVybiAiNzYyMzozOiAoICggKCAoKSAnWycgKSApPT4gKGx2X2FyZ3VtZW50c18xNF8wPSBydWxlWENsb3N1cmUgKSApPyI7CisgICAgICAgICAgICByZXR1cm4gIjgwNjI6MzogKCAoICggKCkgJ1snICkgKT0+IChsdl9hcmd1bWVudHNfMTRfMD0gcnVsZVhDbG9zdXJlICkgKT8iOwogICAgICAgICB9CiAgICAgICAgIHB1YmxpYyBpbnQgc3BlY2lhbFN0YXRlVHJhbnNpdGlvbihpbnQgcywgSW50U3RyZWFtIF9pbnB1dCkgdGhyb3dzIE5vVmlhYmxlQWx0RXhjZXB0aW9uIHsKICAgICAgICAgICAgIFRva2VuU3RyZWFtIGlucHV0ID0gKFRva2VuU3RyZWFtKV9pbnB1dDsKICAgICAgICAgCWludCBfcyA9IHM7CiAgICAgICAgICAgICBzd2l0Y2ggKCBzICkgewogICAgICAgICAgICAgICAgICAgICBjYXNlIDAgOiAKLSAgICAgICAgICAgICAgICAgICAgICAgIGludCBMQTEzNF8xID0gaW5wdXQuTEEoMSk7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgTEExNDVfMSA9IGlucHV0LkxBKDEpOwogCiAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW5kZXgxMzRfMSA9IGlucHV0LmluZGV4KCk7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW5kZXgxNDVfMSA9IGlucHV0LmluZGV4KCk7CiAgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dC5yZXdpbmQoKTsKICAgICAgICAgICAgICAgICAgICAgICAgIHMgPSAtMTsKICAgICAgICAgICAgICAgICAgICAgICAgIGlmICggKHN5bnByZWQ0Ml9JbnRlcm5hbERhdGFEU0woKSkgKSB7cyA9IDc3O30KQEAgLTMwMjEzLDI0ICszMTc1MSwyNCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoICh0cnVlKSApIHtzID0gMjt9CiAKICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0LnNlZWsoaW5kZXgxMzRfMSk7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dC5zZWVrKGluZGV4MTQ1XzEpOwogICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCBzPj0wICkgcmV0dXJuIHM7CiAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGlmIChzdGF0ZS5iYWNrdHJhY2tpbmc+MCkge3N0YXRlLmZhaWxlZD10cnVlOyByZXR1cm4gLTE7fQogICAgICAgICAgICAgTm9WaWFibGVBbHRFeGNlcHRpb24gbnZhZSA9Ci0gICAgICAgICAgICAgICAgbmV3IE5vVmlhYmxlQWx0RXhjZXB0aW9uKGdldERlc2NyaXB0aW9uKCksIDEzNCwgX3MsIGlucHV0KTsKKyAgICAgICAgICAgICAgICBuZXcgTm9WaWFibGVBbHRFeGNlcHRpb24oZ2V0RGVzY3JpcHRpb24oKSwgMTQ1LCBfcywgaW5wdXQpOwogICAgICAgICAgICAgZXJyb3IobnZhZSk7CiAgICAgICAgICAgICB0aHJvdyBudmFlOwogICAgICAgICB9CiAgICAgfQogICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgZGZhXzcycyA9ICJcMVw0MVwxMTVcdWZmZmYiOwogICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgZGZhXzczcyA9ICJcMVw0XDQwXDBcNTVcdWZmZmYiOwotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgZGZhXzc0cyA9ICJcMVx1MDA4N1w0MFwwXDU1XHVmZmZmIjsKKyAgICBzdGF0aWMgZmluYWwgU3RyaW5nIGRmYV83NHMgPSAiXDFcdTAwOGVcNDBcMFw1NVx1ZmZmZiI7CiAgICAgc3RhdGljIGZpbmFsIFN0cmluZyBkZmFfNzVzID0gIlw0MVx1ZmZmZlwxXDJcNTNcdWZmZmZcMVwxIjsKICAgICBzdGF0aWMgZmluYWwgU3RyaW5nIGRmYV83NnMgPSAiXDFcdWZmZmZcMVwwXDFcMVwxXDJcMVwzXDFcNFwxXDVcMVw2XDFcN1wxXDEwXDFcMTFcMVwxMlwxXDEzXDFcMTRcMVwxNVwxXDE2XDFcMTdcMVwyMFwxXDIxXDFcMjJcMVwyM1wxXDI0XDFcMjVcMVwyNlwxXDI3XDFcMzBcMVwzMVwxXDMyXDFcMzNcMVwzNFwxXDM1XDFcMzZcMVwzN1w1NVx1ZmZmZn0+IjsKICAgICBzdGF0aWMgZmluYWwgU3RyaW5nW10gZGZhXzc3cyA9IHsKLSAgICAgICAgICAgICJcMVwyN1wxXDI0XDFcMVwxXDIzXDFcMjVcNlx1ZmZmZlwxXDEyXDFcNDFcMzVcdWZmZmZcMVwzMlwxNlx1ZmZmZlwxXDQxXDNcdWZmZmZcMVw1XDFcdWZmZmZcMVw0MVwxXDRcMVwzXDFcNDFcMVx1ZmZmZlwxXDQxXDFcdWZmZmZcMVw0MFwyXDQxXDFcdWZmZmZcMVwxN1wxXDIwXDZcNDFcMVwxNVwxN1w0MVwxXDEwXDFcN1wzXDQxXDFcNlw0XDQxXDFcdWZmZmZcMVwzMVwxXDQxXDFcMTNcM1w0MVwxXDMzXDFcMzRcMlw0MVwxXDJcMVwxNlwxXDExXDFcMjFcMVwyMlwxXDI2XDFcMzBcMVwzNVwxXDM2XDFcMzdcMVw0MVwxXDE0XDFcNDEiLAorICAgICAgICAgICAgIlwxXDI3XDFcMjRcMVwxXDFcMjNcMVwyNVw2XHVmZmZmXDFcMTJcMVw0MVw0MVx1ZmZmZlwxXDMyXDIxXHVmZmZmXDFcNDFcM1x1ZmZmZlwxXDVcMVx1ZmZmZlwxXDQxXDFcNFwxXDNcMVw0MVwxXHVmZmZmXDFcNDFcMVx1ZmZmZlwxXDQwXDJcNDFcMVx1ZmZmZlwxXDE3XDFcMjBcNlw0MVwxXDE1XDE3XDQxXDFcMTBcMVw3XDNcNDFcMVw2XDRcNDFcMVx1ZmZmZlwxXDMxXDFcNDFcMVwxM1wzXDQxXDFcMzNcMVwzNFwyXDQxXDFcMlwxXDE2XDFcMTFcMVwyMVwxXDIyXDFcMjZcMVwzMFwxXDM1XDFcMzZcMVwzN1wxXDQxXDFcMTRcMVw0MSIsCiAgICAgICAgICAgICAiXDFcdWZmZmYiLAogICAgICAgICAgICAgIlwxXHVmZmZmIiwKICAgICAgICAgICAgICJcMVx1ZmZmZiIsCkBAIC0zMDMxNiwxMSArMzE4NTQsMTEgQEAKICAgICBzdGF0aWMgZmluYWwgc2hvcnRbXSBkZmFfNzYgPSBERkEudW5wYWNrRW5jb2RlZFN0cmluZyhkZmFfNzZzKTsKICAgICBzdGF0aWMgZmluYWwgc2hvcnRbXVtdIGRmYV83NyA9IHVucGFja0VuY29kZWRTdHJpbmdBcnJheShkZmFfNzdzKTsKIAotICAgIGNsYXNzIERGQTEzNyBleHRlbmRzIERGQSB7CisgICAgY2xhc3MgREZBMTQ4IGV4dGVuZHMgREZBIHsKIAotICAgICAgICBwdWJsaWMgREZBMTM3KEJhc2VSZWNvZ25pemVyIHJlY29nbml6ZXIpIHsKKyAgICAgICAgcHVibGljIERGQTE0OChCYXNlUmVjb2duaXplciByZWNvZ25pemVyKSB7CiAgICAgICAgICAgICB0aGlzLnJlY29nbml6ZXIgPSByZWNvZ25pemVyOwotICAgICAgICAgICAgdGhpcy5kZWNpc2lvbk51bWJlciA9IDEzNzsKKyAgICAgICAgICAgIHRoaXMuZGVjaXNpb25OdW1iZXIgPSAxNDg7CiAgICAgICAgICAgICB0aGlzLmVvdCA9IGRmYV8zOTsKICAgICAgICAgICAgIHRoaXMuZW9mID0gZGZhXzcyOwogICAgICAgICAgICAgdGhpcy5taW4gPSBkZmFfNzM7CkBAIC0zMDMzMCwxNyArMzE4NjgsMTcgQEAKICAgICAgICAgICAgIHRoaXMudHJhbnNpdGlvbiA9IGRmYV83NzsKICAgICAgICAgfQogICAgICAgICBwdWJsaWMgU3RyaW5nIGdldERlc2NyaXB0aW9uKCkgewotICAgICAgICAgICAgcmV0dXJuICI3OTY2OjM6ICggKCAnZXh0ZW5kcycgfCAnc3RhdGljJyB8ICdpbXBvcnQnIHwgJ2V4dGVuc2lvbicgfCAnIScgfCAnLScgfCAnKycgfCAnbmV3JyB8ICd7JyB8ICdzd2l0Y2gnIHwgJ3N5bmNocm9uaXplZCcgfCAnPCcgfCAnc3VwZXInIHwgJyMnIHwgJ1snIHwgJ2ZhbHNlJyB8ICd0cnVlJyB8ICdudWxsJyB8ICd0eXBlb2YnIHwgJ2lmJyB8ICdmb3InIHwgJ3doaWxlJyB8ICdkbycgfCAndGhyb3cnIHwgJ3JldHVybicgfCAndHJ5JyB8ICcoJyB8IFJVTEVfSUQgfCBSVUxFX0hFWCB8IFJVTEVfSU5UIHwgUlVMRV9ERUNJTUFMIHwgUlVMRV9TVFJJTkcgKT0+IChsdl9leHByZXNzaW9uXzJfMD0gcnVsZVhFeHByZXNzaW9uICkgKT8iOworICAgICAgICAgICAgcmV0dXJuICI4NDA1OjM6ICggKCAnZXh0ZW5kcycgfCAnc3RhdGljJyB8ICdpbXBvcnQnIHwgJ2V4dGVuc2lvbicgfCAnIScgfCAnLScgfCAnKycgfCAnbmV3JyB8ICd7JyB8ICdzd2l0Y2gnIHwgJ3N5bmNocm9uaXplZCcgfCAnPCcgfCAnc3VwZXInIHwgJyMnIHwgJ1snIHwgJ2ZhbHNlJyB8ICd0cnVlJyB8ICdudWxsJyB8ICd0eXBlb2YnIHwgJ2lmJyB8ICdmb3InIHwgJ3doaWxlJyB8ICdkbycgfCAndGhyb3cnIHwgJ3JldHVybicgfCAndHJ5JyB8ICcoJyB8IFJVTEVfSUQgfCBSVUxFX0hFWCB8IFJVTEVfSU5UIHwgUlVMRV9ERUNJTUFMIHwgUlVMRV9TVFJJTkcgKT0+IChsdl9leHByZXNzaW9uXzJfMD0gcnVsZVhFeHByZXNzaW9uICkgKT8iOwogICAgICAgICB9CiAgICAgICAgIHB1YmxpYyBpbnQgc3BlY2lhbFN0YXRlVHJhbnNpdGlvbihpbnQgcywgSW50U3RyZWFtIF9pbnB1dCkgdGhyb3dzIE5vVmlhYmxlQWx0RXhjZXB0aW9uIHsKICAgICAgICAgICAgIFRva2VuU3RyZWFtIGlucHV0ID0gKFRva2VuU3RyZWFtKV9pbnB1dDsKICAgICAgICAgCWludCBfcyA9IHM7CiAgICAgICAgICAgICBzd2l0Y2ggKCBzICkgewogICAgICAgICAgICAgICAgICAgICBjYXNlIDAgOiAKLSAgICAgICAgICAgICAgICAgICAgICAgIGludCBMQTEzN18xID0gaW5wdXQuTEEoMSk7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgTEExNDhfMSA9IGlucHV0LkxBKDEpOwogCiAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW5kZXgxMzdfMSA9IGlucHV0LmluZGV4KCk7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW5kZXgxNDhfMSA9IGlucHV0LmluZGV4KCk7CiAgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dC5yZXdpbmQoKTsKICAgICAgICAgICAgICAgICAgICAgICAgIHMgPSAtMTsKICAgICAgICAgICAgICAgICAgICAgICAgIGlmICggKHN5bnByZWQ0M19JbnRlcm5hbERhdGFEU0woKSkgKSB7cyA9IDc3O30KQEAgLTMwMzQ4LDE0ICszMTg4NiwxNCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoICh0cnVlKSApIHtzID0gMzM7fQogCiAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICBpbnB1dC5zZWVrKGluZGV4MTM3XzEpOworICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXQuc2VlayhpbmRleDE0OF8xKTsKICAgICAgICAgICAgICAgICAgICAgICAgIGlmICggcz49MCApIHJldHVybiBzOwogICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgIGNhc2UgMSA6IAotICAgICAgICAgICAgICAgICAgICAgICAgaW50IExBMTM3XzIgPSBpbnB1dC5MQSgxKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBMQTE0OF8yID0gaW5wdXQuTEEoMSk7CiAKICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbmRleDEzN18yID0gaW5wdXQuaW5kZXgoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbmRleDE0OF8yID0gaW5wdXQuaW5kZXgoKTsKICAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0LnJld2luZCgpOwogICAgICAgICAgICAgICAgICAgICAgICAgcyA9IC0xOwogICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCAoc3lucHJlZDQzX0ludGVybmFsRGF0YURTTCgpKSApIHtzID0gNzc7fQpAQCAtMzAzNjMsMTQgKzMxOTAxLDE0IEBACiAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICggKHRydWUpICkge3MgPSAzMzt9CiAKICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0LnNlZWsoaW5kZXgxMzdfMik7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dC5zZWVrKGluZGV4MTQ4XzIpOwogICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCBzPj0wICkgcmV0dXJuIHM7CiAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgY2FzZSAyIDogCi0gICAgICAgICAgICAgICAgICAgICAgICBpbnQgTEExMzdfMyA9IGlucHV0LkxBKDEpOworICAgICAgICAgICAgICAgICAgICAgICAgaW50IExBMTQ4XzMgPSBpbnB1dC5MQSgxKTsKIAogICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgaW50IGluZGV4MTM3XzMgPSBpbnB1dC5pbmRleCgpOworICAgICAgICAgICAgICAgICAgICAgICAgaW50IGluZGV4MTQ4XzMgPSBpbnB1dC5pbmRleCgpOwogICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXQucmV3aW5kKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICBzID0gLTE7CiAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIChzeW5wcmVkNDNfSW50ZXJuYWxEYXRhRFNMKCkpICkge3MgPSA3Nzt9CkBAIC0zMDM3OCwxNCArMzE5MTYsMTQgQEAKICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKCAodHJ1ZSkgKSB7cyA9IDMzO30KIAogICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXQuc2VlayhpbmRleDEzN18zKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0LnNlZWsoaW5kZXgxNDhfMyk7CiAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIHM+PTAgKSByZXR1cm4gczsKICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICBjYXNlIDMgOiAKLSAgICAgICAgICAgICAgICAgICAgICAgIGludCBMQTEzN180ID0gaW5wdXQuTEEoMSk7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgTEExNDhfNCA9IGlucHV0LkxBKDEpOwogCiAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW5kZXgxMzdfNCA9IGlucHV0LmluZGV4KCk7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW5kZXgxNDhfNCA9IGlucHV0LmluZGV4KCk7CiAgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dC5yZXdpbmQoKTsKICAgICAgICAgICAgICAgICAgICAgICAgIHMgPSAtMTsKICAgICAgICAgICAgICAgICAgICAgICAgIGlmICggKHN5bnByZWQ0M19JbnRlcm5hbERhdGFEU0woKSkgKSB7cyA9IDc3O30KQEAgLTMwMzkzLDE0ICszMTkzMSwxNCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoICh0cnVlKSApIHtzID0gMzM7fQogCiAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICBpbnB1dC5zZWVrKGluZGV4MTM3XzQpOworICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXQuc2VlayhpbmRleDE0OF80KTsKICAgICAgICAgICAgICAgICAgICAgICAgIGlmICggcz49MCApIHJldHVybiBzOwogICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgIGNhc2UgNCA6IAotICAgICAgICAgICAgICAgICAgICAgICAgaW50IExBMTM3XzUgPSBpbnB1dC5MQSgxKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBMQTE0OF81ID0gaW5wdXQuTEEoMSk7CiAKICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbmRleDEzN181ID0gaW5wdXQuaW5kZXgoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbmRleDE0OF81ID0gaW5wdXQuaW5kZXgoKTsKICAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0LnJld2luZCgpOwogICAgICAgICAgICAgICAgICAgICAgICAgcyA9IC0xOwogICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCAoc3lucHJlZDQzX0ludGVybmFsRGF0YURTTCgpKSApIHtzID0gNzc7fQpAQCAtMzA0MDgsMTQgKzMxOTQ2LDE0IEBACiAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICggKHRydWUpICkge3MgPSAzMzt9CiAKICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0LnNlZWsoaW5kZXgxMzdfNSk7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dC5zZWVrKGluZGV4MTQ4XzUpOwogICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCBzPj0wICkgcmV0dXJuIHM7CiAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgY2FzZSA1IDogCi0gICAgICAgICAgICAgICAgICAgICAgICBpbnQgTEExMzdfNiA9IGlucHV0LkxBKDEpOworICAgICAgICAgICAgICAgICAgICAgICAgaW50IExBMTQ4XzYgPSBpbnB1dC5MQSgxKTsKIAogICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgaW50IGluZGV4MTM3XzYgPSBpbnB1dC5pbmRleCgpOworICAgICAgICAgICAgICAgICAgICAgICAgaW50IGluZGV4MTQ4XzYgPSBpbnB1dC5pbmRleCgpOwogICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXQucmV3aW5kKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICBzID0gLTE7CiAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIChzeW5wcmVkNDNfSW50ZXJuYWxEYXRhRFNMKCkpICkge3MgPSA3Nzt9CkBAIC0zMDQyMywxNCArMzE5NjEsMTQgQEAKICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKCAodHJ1ZSkgKSB7cyA9IDMzO30KIAogICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXQuc2VlayhpbmRleDEzN182KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0LnNlZWsoaW5kZXgxNDhfNik7CiAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIHM+PTAgKSByZXR1cm4gczsKICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICBjYXNlIDYgOiAKLSAgICAgICAgICAgICAgICAgICAgICAgIGludCBMQTEzN183ID0gaW5wdXQuTEEoMSk7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgTEExNDhfNyA9IGlucHV0LkxBKDEpOwogCiAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW5kZXgxMzdfNyA9IGlucHV0LmluZGV4KCk7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW5kZXgxNDhfNyA9IGlucHV0LmluZGV4KCk7CiAgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dC5yZXdpbmQoKTsKICAgICAgICAgICAgICAgICAgICAgICAgIHMgPSAtMTsKICAgICAgICAgICAgICAgICAgICAgICAgIGlmICggKHN5bnByZWQ0M19JbnRlcm5hbERhdGFEU0woKSkgKSB7cyA9IDc3O30KQEAgLTMwNDM4LDE0ICszMTk3NiwxNCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoICh0cnVlKSApIHtzID0gMzM7fQogCiAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICBpbnB1dC5zZWVrKGluZGV4MTM3XzcpOworICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXQuc2VlayhpbmRleDE0OF83KTsKICAgICAgICAgICAgICAgICAgICAgICAgIGlmICggcz49MCApIHJldHVybiBzOwogICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgIGNhc2UgNyA6IAotICAgICAgICAgICAgICAgICAgICAgICAgaW50IExBMTM3XzggPSBpbnB1dC5MQSgxKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBMQTE0OF84ID0gaW5wdXQuTEEoMSk7CiAKICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbmRleDEzN184ID0gaW5wdXQuaW5kZXgoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbmRleDE0OF84ID0gaW5wdXQuaW5kZXgoKTsKICAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0LnJld2luZCgpOwogICAgICAgICAgICAgICAgICAgICAgICAgcyA9IC0xOwogICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCAoc3lucHJlZDQzX0ludGVybmFsRGF0YURTTCgpKSApIHtzID0gNzc7fQpAQCAtMzA0NTMsMTQgKzMxOTkxLDE0IEBACiAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICggKHRydWUpICkge3MgPSAzMzt9CiAKICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0LnNlZWsoaW5kZXgxMzdfOCk7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dC5zZWVrKGluZGV4MTQ4XzgpOwogICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCBzPj0wICkgcmV0dXJuIHM7CiAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgY2FzZSA4IDogCi0gICAgICAgICAgICAgICAgICAgICAgICBpbnQgTEExMzdfOSA9IGlucHV0LkxBKDEpOworICAgICAgICAgICAgICAgICAgICAgICAgaW50IExBMTQ4XzkgPSBpbnB1dC5MQSgxKTsKIAogICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgaW50IGluZGV4MTM3XzkgPSBpbnB1dC5pbmRleCgpOworICAgICAgICAgICAgICAgICAgICAgICAgaW50IGluZGV4MTQ4XzkgPSBpbnB1dC5pbmRleCgpOwogICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXQucmV3aW5kKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICBzID0gLTE7CiAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIChzeW5wcmVkNDNfSW50ZXJuYWxEYXRhRFNMKCkpICkge3MgPSA3Nzt9CkBAIC0zMDQ2OCwxNCArMzIwMDYsMTQgQEAKICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKCAodHJ1ZSkgKSB7cyA9IDMzO30KIAogICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXQuc2VlayhpbmRleDEzN185KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0LnNlZWsoaW5kZXgxNDhfOSk7CiAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIHM+PTAgKSByZXR1cm4gczsKICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICBjYXNlIDkgOiAKLSAgICAgICAgICAgICAgICAgICAgICAgIGludCBMQTEzN18xMCA9IGlucHV0LkxBKDEpOworICAgICAgICAgICAgICAgICAgICAgICAgaW50IExBMTQ4XzEwID0gaW5wdXQuTEEoMSk7CiAKICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbmRleDEzN18xMCA9IGlucHV0LmluZGV4KCk7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW5kZXgxNDhfMTAgPSBpbnB1dC5pbmRleCgpOwogICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXQucmV3aW5kKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICBzID0gLTE7CiAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIChzeW5wcmVkNDNfSW50ZXJuYWxEYXRhRFNMKCkpICkge3MgPSA3Nzt9CkBAIC0zMDQ4MywxNCArMzIwMjEsMTQgQEAKICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKCAodHJ1ZSkgKSB7cyA9IDMzO30KIAogICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXQuc2VlayhpbmRleDEzN18xMCk7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dC5zZWVrKGluZGV4MTQ4XzEwKTsKICAgICAgICAgICAgICAgICAgICAgICAgIGlmICggcz49MCApIHJldHVybiBzOwogICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTAgOiAKLSAgICAgICAgICAgICAgICAgICAgICAgIGludCBMQTEzN18xMSA9IGlucHV0LkxBKDEpOworICAgICAgICAgICAgICAgICAgICAgICAgaW50IExBMTQ4XzExID0gaW5wdXQuTEEoMSk7CiAKICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbmRleDEzN18xMSA9IGlucHV0LmluZGV4KCk7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW5kZXgxNDhfMTEgPSBpbnB1dC5pbmRleCgpOwogICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXQucmV3aW5kKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICBzID0gLTE7CiAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIChzeW5wcmVkNDNfSW50ZXJuYWxEYXRhRFNMKCkpICkge3MgPSA3Nzt9CkBAIC0zMDQ5OCwxNCArMzIwMzYsMTQgQEAKICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKCAodHJ1ZSkgKSB7cyA9IDMzO30KIAogICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXQuc2VlayhpbmRleDEzN18xMSk7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dC5zZWVrKGluZGV4MTQ4XzExKTsKICAgICAgICAgICAgICAgICAgICAgICAgIGlmICggcz49MCApIHJldHVybiBzOwogICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTEgOiAKLSAgICAgICAgICAgICAgICAgICAgICAgIGludCBMQTEzN18xMiA9IGlucHV0LkxBKDEpOworICAgICAgICAgICAgICAgICAgICAgICAgaW50IExBMTQ4XzEyID0gaW5wdXQuTEEoMSk7CiAKICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbmRleDEzN18xMiA9IGlucHV0LmluZGV4KCk7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW5kZXgxNDhfMTIgPSBpbnB1dC5pbmRleCgpOwogICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXQucmV3aW5kKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICBzID0gLTE7CiAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIChzeW5wcmVkNDNfSW50ZXJuYWxEYXRhRFNMKCkpICkge3MgPSA3Nzt9CkBAIC0zMDUxMywxNCArMzIwNTEsMTQgQEAKICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKCAodHJ1ZSkgKSB7cyA9IDMzO30KIAogICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXQuc2VlayhpbmRleDEzN18xMik7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dC5zZWVrKGluZGV4MTQ4XzEyKTsKICAgICAgICAgICAgICAgICAgICAgICAgIGlmICggcz49MCApIHJldHVybiBzOwogICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTIgOiAKLSAgICAgICAgICAgICAgICAgICAgICAgIGludCBMQTEzN18xMyA9IGlucHV0LkxBKDEpOworICAgICAgICAgICAgICAgICAgICAgICAgaW50IExBMTQ4XzEzID0gaW5wdXQuTEEoMSk7CiAKICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbmRleDEzN18xMyA9IGlucHV0LmluZGV4KCk7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW5kZXgxNDhfMTMgPSBpbnB1dC5pbmRleCgpOwogICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXQucmV3aW5kKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICBzID0gLTE7CiAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIChzeW5wcmVkNDNfSW50ZXJuYWxEYXRhRFNMKCkpICkge3MgPSA3Nzt9CkBAIC0zMDUyOCwxNCArMzIwNjYsMTQgQEAKICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKCAodHJ1ZSkgKSB7cyA9IDMzO30KIAogICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXQuc2VlayhpbmRleDEzN18xMyk7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dC5zZWVrKGluZGV4MTQ4XzEzKTsKICAgICAgICAgICAgICAgICAgICAgICAgIGlmICggcz49MCApIHJldHVybiBzOwogICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTMgOiAKLSAgICAgICAgICAgICAgICAgICAgICAgIGludCBMQTEzN18xNCA9IGlucHV0LkxBKDEpOworICAgICAgICAgICAgICAgICAgICAgICAgaW50IExBMTQ4XzE0ID0gaW5wdXQuTEEoMSk7CiAKICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbmRleDEzN18xNCA9IGlucHV0LmluZGV4KCk7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW5kZXgxNDhfMTQgPSBpbnB1dC5pbmRleCgpOwogICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXQucmV3aW5kKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICBzID0gLTE7CiAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIChzeW5wcmVkNDNfSW50ZXJuYWxEYXRhRFNMKCkpICkge3MgPSA3Nzt9CkBAIC0zMDU0MywxNCArMzIwODEsMTQgQEAKICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKCAodHJ1ZSkgKSB7cyA9IDMzO30KIAogICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXQuc2VlayhpbmRleDEzN18xNCk7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dC5zZWVrKGluZGV4MTQ4XzE0KTsKICAgICAgICAgICAgICAgICAgICAgICAgIGlmICggcz49MCApIHJldHVybiBzOwogICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTQgOiAKLSAgICAgICAgICAgICAgICAgICAgICAgIGludCBMQTEzN18xNSA9IGlucHV0LkxBKDEpOworICAgICAgICAgICAgICAgICAgICAgICAgaW50IExBMTQ4XzE1ID0gaW5wdXQuTEEoMSk7CiAKICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbmRleDEzN18xNSA9IGlucHV0LmluZGV4KCk7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW5kZXgxNDhfMTUgPSBpbnB1dC5pbmRleCgpOwogICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXQucmV3aW5kKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICBzID0gLTE7CiAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIChzeW5wcmVkNDNfSW50ZXJuYWxEYXRhRFNMKCkpICkge3MgPSA3Nzt9CkBAIC0zMDU1OCwxNCArMzIwOTYsMTQgQEAKICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKCAodHJ1ZSkgKSB7cyA9IDMzO30KIAogICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXQuc2VlayhpbmRleDEzN18xNSk7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dC5zZWVrKGluZGV4MTQ4XzE1KTsKICAgICAgICAgICAgICAgICAgICAgICAgIGlmICggcz49MCApIHJldHVybiBzOwogICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTUgOiAKLSAgICAgICAgICAgICAgICAgICAgICAgIGludCBMQTEzN18xNiA9IGlucHV0LkxBKDEpOworICAgICAgICAgICAgICAgICAgICAgICAgaW50IExBMTQ4XzE2ID0gaW5wdXQuTEEoMSk7CiAKICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbmRleDEzN18xNiA9IGlucHV0LmluZGV4KCk7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW5kZXgxNDhfMTYgPSBpbnB1dC5pbmRleCgpOwogICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXQucmV3aW5kKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICBzID0gLTE7CiAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIChzeW5wcmVkNDNfSW50ZXJuYWxEYXRhRFNMKCkpICkge3MgPSA3Nzt9CkBAIC0zMDU3MywxNCArMzIxMTEsMTQgQEAKICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKCAodHJ1ZSkgKSB7cyA9IDMzO30KIAogICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXQuc2VlayhpbmRleDEzN18xNik7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dC5zZWVrKGluZGV4MTQ4XzE2KTsKICAgICAgICAgICAgICAgICAgICAgICAgIGlmICggcz49MCApIHJldHVybiBzOwogICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTYgOiAKLSAgICAgICAgICAgICAgICAgICAgICAgIGludCBMQTEzN18xNyA9IGlucHV0LkxBKDEpOworICAgICAgICAgICAgICAgICAgICAgICAgaW50IExBMTQ4XzE3ID0gaW5wdXQuTEEoMSk7CiAKICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbmRleDEzN18xNyA9IGlucHV0LmluZGV4KCk7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW5kZXgxNDhfMTcgPSBpbnB1dC5pbmRleCgpOwogICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXQucmV3aW5kKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICBzID0gLTE7CiAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIChzeW5wcmVkNDNfSW50ZXJuYWxEYXRhRFNMKCkpICkge3MgPSA3Nzt9CkBAIC0zMDU4OCwxNCArMzIxMjYsMTQgQEAKICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKCAodHJ1ZSkgKSB7cyA9IDMzO30KIAogICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXQuc2VlayhpbmRleDEzN18xNyk7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dC5zZWVrKGluZGV4MTQ4XzE3KTsKICAgICAgICAgICAgICAgICAgICAgICAgIGlmICggcz49MCApIHJldHVybiBzOwogICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTcgOiAKLSAgICAgICAgICAgICAgICAgICAgICAgIGludCBMQTEzN18xOCA9IGlucHV0LkxBKDEpOworICAgICAgICAgICAgICAgICAgICAgICAgaW50IExBMTQ4XzE4ID0gaW5wdXQuTEEoMSk7CiAKICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbmRleDEzN18xOCA9IGlucHV0LmluZGV4KCk7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW5kZXgxNDhfMTggPSBpbnB1dC5pbmRleCgpOwogICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXQucmV3aW5kKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICBzID0gLTE7CiAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIChzeW5wcmVkNDNfSW50ZXJuYWxEYXRhRFNMKCkpICkge3MgPSA3Nzt9CkBAIC0zMDYwMywxNCArMzIxNDEsMTQgQEAKICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKCAodHJ1ZSkgKSB7cyA9IDMzO30KIAogICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXQuc2VlayhpbmRleDEzN18xOCk7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dC5zZWVrKGluZGV4MTQ4XzE4KTsKICAgICAgICAgICAgICAgICAgICAgICAgIGlmICggcz49MCApIHJldHVybiBzOwogICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTggOiAKLSAgICAgICAgICAgICAgICAgICAgICAgIGludCBMQTEzN18xOSA9IGlucHV0LkxBKDEpOworICAgICAgICAgICAgICAgICAgICAgICAgaW50IExBMTQ4XzE5ID0gaW5wdXQuTEEoMSk7CiAKICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbmRleDEzN18xOSA9IGlucHV0LmluZGV4KCk7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW5kZXgxNDhfMTkgPSBpbnB1dC5pbmRleCgpOwogICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXQucmV3aW5kKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICBzID0gLTE7CiAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIChzeW5wcmVkNDNfSW50ZXJuYWxEYXRhRFNMKCkpICkge3MgPSA3Nzt9CkBAIC0zMDYxOCwxNCArMzIxNTYsMTQgQEAKICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKCAodHJ1ZSkgKSB7cyA9IDMzO30KIAogICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXQuc2VlayhpbmRleDEzN18xOSk7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dC5zZWVrKGluZGV4MTQ4XzE5KTsKICAgICAgICAgICAgICAgICAgICAgICAgIGlmICggcz49MCApIHJldHVybiBzOwogICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTkgOiAKLSAgICAgICAgICAgICAgICAgICAgICAgIGludCBMQTEzN18yMCA9IGlucHV0LkxBKDEpOworICAgICAgICAgICAgICAgICAgICAgICAgaW50IExBMTQ4XzIwID0gaW5wdXQuTEEoMSk7CiAKICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbmRleDEzN18yMCA9IGlucHV0LmluZGV4KCk7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW5kZXgxNDhfMjAgPSBpbnB1dC5pbmRleCgpOwogICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXQucmV3aW5kKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICBzID0gLTE7CiAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIChzeW5wcmVkNDNfSW50ZXJuYWxEYXRhRFNMKCkpICkge3MgPSA3Nzt9CkBAIC0zMDYzMywxNCArMzIxNzEsMTQgQEAKICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKCAodHJ1ZSkgKSB7cyA9IDMzO30KIAogICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXQuc2VlayhpbmRleDEzN18yMCk7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dC5zZWVrKGluZGV4MTQ4XzIwKTsKICAgICAgICAgICAgICAgICAgICAgICAgIGlmICggcz49MCApIHJldHVybiBzOwogICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgIGNhc2UgMjAgOiAKLSAgICAgICAgICAgICAgICAgICAgICAgIGludCBMQTEzN18yMSA9IGlucHV0LkxBKDEpOworICAgICAgICAgICAgICAgICAgICAgICAgaW50IExBMTQ4XzIxID0gaW5wdXQuTEEoMSk7CiAKICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbmRleDEzN18yMSA9IGlucHV0LmluZGV4KCk7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW5kZXgxNDhfMjEgPSBpbnB1dC5pbmRleCgpOwogICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXQucmV3aW5kKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICBzID0gLTE7CiAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIChzeW5wcmVkNDNfSW50ZXJuYWxEYXRhRFNMKCkpICkge3MgPSA3Nzt9CkBAIC0zMDY0OCwxNCArMzIxODYsMTQgQEAKICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKCAodHJ1ZSkgKSB7cyA9IDMzO30KIAogICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXQuc2VlayhpbmRleDEzN18yMSk7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dC5zZWVrKGluZGV4MTQ4XzIxKTsKICAgICAgICAgICAgICAgICAgICAgICAgIGlmICggcz49MCApIHJldHVybiBzOwogICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgIGNhc2UgMjEgOiAKLSAgICAgICAgICAgICAgICAgICAgICAgIGludCBMQTEzN18yMiA9IGlucHV0LkxBKDEpOworICAgICAgICAgICAgICAgICAgICAgICAgaW50IExBMTQ4XzIyID0gaW5wdXQuTEEoMSk7CiAKICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbmRleDEzN18yMiA9IGlucHV0LmluZGV4KCk7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW5kZXgxNDhfMjIgPSBpbnB1dC5pbmRleCgpOwogICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXQucmV3aW5kKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICBzID0gLTE7CiAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIChzeW5wcmVkNDNfSW50ZXJuYWxEYXRhRFNMKCkpICkge3MgPSA3Nzt9CkBAIC0zMDY2MywxNCArMzIyMDEsMTQgQEAKICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKCAodHJ1ZSkgKSB7cyA9IDMzO30KIAogICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXQuc2VlayhpbmRleDEzN18yMik7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dC5zZWVrKGluZGV4MTQ4XzIyKTsKICAgICAgICAgICAgICAgICAgICAgICAgIGlmICggcz49MCApIHJldHVybiBzOwogICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgIGNhc2UgMjIgOiAKLSAgICAgICAgICAgICAgICAgICAgICAgIGludCBMQTEzN18yMyA9IGlucHV0LkxBKDEpOworICAgICAgICAgICAgICAgICAgICAgICAgaW50IExBMTQ4XzIzID0gaW5wdXQuTEEoMSk7CiAKICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbmRleDEzN18yMyA9IGlucHV0LmluZGV4KCk7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW5kZXgxNDhfMjMgPSBpbnB1dC5pbmRleCgpOwogICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXQucmV3aW5kKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICBzID0gLTE7CiAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIChzeW5wcmVkNDNfSW50ZXJuYWxEYXRhRFNMKCkpICkge3MgPSA3Nzt9CkBAIC0zMDY3OCwxNCArMzIyMTYsMTQgQEAKICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKCAodHJ1ZSkgKSB7cyA9IDMzO30KIAogICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXQuc2VlayhpbmRleDEzN18yMyk7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dC5zZWVrKGluZGV4MTQ4XzIzKTsKICAgICAgICAgICAgICAgICAgICAgICAgIGlmICggcz49MCApIHJldHVybiBzOwogICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgIGNhc2UgMjMgOiAKLSAgICAgICAgICAgICAgICAgICAgICAgIGludCBMQTEzN18yNCA9IGlucHV0LkxBKDEpOworICAgICAgICAgICAgICAgICAgICAgICAgaW50IExBMTQ4XzI0ID0gaW5wdXQuTEEoMSk7CiAKICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbmRleDEzN18yNCA9IGlucHV0LmluZGV4KCk7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW5kZXgxNDhfMjQgPSBpbnB1dC5pbmRleCgpOwogICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXQucmV3aW5kKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICBzID0gLTE7CiAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIChzeW5wcmVkNDNfSW50ZXJuYWxEYXRhRFNMKCkpICkge3MgPSA3Nzt9CkBAIC0zMDY5MywxNCArMzIyMzEsMTQgQEAKICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKCAodHJ1ZSkgKSB7cyA9IDMzO30KIAogICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXQuc2VlayhpbmRleDEzN18yNCk7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dC5zZWVrKGluZGV4MTQ4XzI0KTsKICAgICAgICAgICAgICAgICAgICAgICAgIGlmICggcz49MCApIHJldHVybiBzOwogICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgIGNhc2UgMjQgOiAKLSAgICAgICAgICAgICAgICAgICAgICAgIGludCBMQTEzN18yNSA9IGlucHV0LkxBKDEpOworICAgICAgICAgICAgICAgICAgICAgICAgaW50IExBMTQ4XzI1ID0gaW5wdXQuTEEoMSk7CiAKICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbmRleDEzN18yNSA9IGlucHV0LmluZGV4KCk7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW5kZXgxNDhfMjUgPSBpbnB1dC5pbmRleCgpOwogICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXQucmV3aW5kKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICBzID0gLTE7CiAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIChzeW5wcmVkNDNfSW50ZXJuYWxEYXRhRFNMKCkpICkge3MgPSA3Nzt9CkBAIC0zMDcwOCwxNCArMzIyNDYsMTQgQEAKICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKCAodHJ1ZSkgKSB7cyA9IDMzO30KIAogICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXQuc2VlayhpbmRleDEzN18yNSk7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dC5zZWVrKGluZGV4MTQ4XzI1KTsKICAgICAgICAgICAgICAgICAgICAgICAgIGlmICggcz49MCApIHJldHVybiBzOwogICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgIGNhc2UgMjUgOiAKLSAgICAgICAgICAgICAgICAgICAgICAgIGludCBMQTEzN18yNiA9IGlucHV0LkxBKDEpOworICAgICAgICAgICAgICAgICAgICAgICAgaW50IExBMTQ4XzI2ID0gaW5wdXQuTEEoMSk7CiAKICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbmRleDEzN18yNiA9IGlucHV0LmluZGV4KCk7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW5kZXgxNDhfMjYgPSBpbnB1dC5pbmRleCgpOwogICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXQucmV3aW5kKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICBzID0gLTE7CiAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIChzeW5wcmVkNDNfSW50ZXJuYWxEYXRhRFNMKCkpICkge3MgPSA3Nzt9CkBAIC0zMDcyMywxNCArMzIyNjEsMTQgQEAKICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKCAodHJ1ZSkgKSB7cyA9IDMzO30KIAogICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXQuc2VlayhpbmRleDEzN18yNik7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dC5zZWVrKGluZGV4MTQ4XzI2KTsKICAgICAgICAgICAgICAgICAgICAgICAgIGlmICggcz49MCApIHJldHVybiBzOwogICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgIGNhc2UgMjYgOiAKLSAgICAgICAgICAgICAgICAgICAgICAgIGludCBMQTEzN18yNyA9IGlucHV0LkxBKDEpOworICAgICAgICAgICAgICAgICAgICAgICAgaW50IExBMTQ4XzI3ID0gaW5wdXQuTEEoMSk7CiAKICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbmRleDEzN18yNyA9IGlucHV0LmluZGV4KCk7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW5kZXgxNDhfMjcgPSBpbnB1dC5pbmRleCgpOwogICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXQucmV3aW5kKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICBzID0gLTE7CiAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIChzeW5wcmVkNDNfSW50ZXJuYWxEYXRhRFNMKCkpICkge3MgPSA3Nzt9CkBAIC0zMDczOCwxNCArMzIyNzYsMTQgQEAKICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKCAodHJ1ZSkgKSB7cyA9IDMzO30KIAogICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXQuc2VlayhpbmRleDEzN18yNyk7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dC5zZWVrKGluZGV4MTQ4XzI3KTsKICAgICAgICAgICAgICAgICAgICAgICAgIGlmICggcz49MCApIHJldHVybiBzOwogICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgIGNhc2UgMjcgOiAKLSAgICAgICAgICAgICAgICAgICAgICAgIGludCBMQTEzN18yOCA9IGlucHV0LkxBKDEpOworICAgICAgICAgICAgICAgICAgICAgICAgaW50IExBMTQ4XzI4ID0gaW5wdXQuTEEoMSk7CiAKICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbmRleDEzN18yOCA9IGlucHV0LmluZGV4KCk7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW5kZXgxNDhfMjggPSBpbnB1dC5pbmRleCgpOwogICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXQucmV3aW5kKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICBzID0gLTE7CiAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIChzeW5wcmVkNDNfSW50ZXJuYWxEYXRhRFNMKCkpICkge3MgPSA3Nzt9CkBAIC0zMDc1MywxNCArMzIyOTEsMTQgQEAKICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKCAodHJ1ZSkgKSB7cyA9IDMzO30KIAogICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXQuc2VlayhpbmRleDEzN18yOCk7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dC5zZWVrKGluZGV4MTQ4XzI4KTsKICAgICAgICAgICAgICAgICAgICAgICAgIGlmICggcz49MCApIHJldHVybiBzOwogICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgIGNhc2UgMjggOiAKLSAgICAgICAgICAgICAgICAgICAgICAgIGludCBMQTEzN18yOSA9IGlucHV0LkxBKDEpOworICAgICAgICAgICAgICAgICAgICAgICAgaW50IExBMTQ4XzI5ID0gaW5wdXQuTEEoMSk7CiAKICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbmRleDEzN18yOSA9IGlucHV0LmluZGV4KCk7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW5kZXgxNDhfMjkgPSBpbnB1dC5pbmRleCgpOwogICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXQucmV3aW5kKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICBzID0gLTE7CiAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIChzeW5wcmVkNDNfSW50ZXJuYWxEYXRhRFNMKCkpICkge3MgPSA3Nzt9CkBAIC0zMDc2OCwxNCArMzIzMDYsMTQgQEAKICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKCAodHJ1ZSkgKSB7cyA9IDMzO30KIAogICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXQuc2VlayhpbmRleDEzN18yOSk7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dC5zZWVrKGluZGV4MTQ4XzI5KTsKICAgICAgICAgICAgICAgICAgICAgICAgIGlmICggcz49MCApIHJldHVybiBzOwogICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgIGNhc2UgMjkgOiAKLSAgICAgICAgICAgICAgICAgICAgICAgIGludCBMQTEzN18zMCA9IGlucHV0LkxBKDEpOworICAgICAgICAgICAgICAgICAgICAgICAgaW50IExBMTQ4XzMwID0gaW5wdXQuTEEoMSk7CiAKICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbmRleDEzN18zMCA9IGlucHV0LmluZGV4KCk7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW5kZXgxNDhfMzAgPSBpbnB1dC5pbmRleCgpOwogICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXQucmV3aW5kKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICBzID0gLTE7CiAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIChzeW5wcmVkNDNfSW50ZXJuYWxEYXRhRFNMKCkpICkge3MgPSA3Nzt9CkBAIC0zMDc4MywxNCArMzIzMjEsMTQgQEAKICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKCAodHJ1ZSkgKSB7cyA9IDMzO30KIAogICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXQuc2VlayhpbmRleDEzN18zMCk7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dC5zZWVrKGluZGV4MTQ4XzMwKTsKICAgICAgICAgICAgICAgICAgICAgICAgIGlmICggcz49MCApIHJldHVybiBzOwogICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgIGNhc2UgMzAgOiAKLSAgICAgICAgICAgICAgICAgICAgICAgIGludCBMQTEzN18zMSA9IGlucHV0LkxBKDEpOworICAgICAgICAgICAgICAgICAgICAgICAgaW50IExBMTQ4XzMxID0gaW5wdXQuTEEoMSk7CiAKICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbmRleDEzN18zMSA9IGlucHV0LmluZGV4KCk7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW5kZXgxNDhfMzEgPSBpbnB1dC5pbmRleCgpOwogICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXQucmV3aW5kKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICBzID0gLTE7CiAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIChzeW5wcmVkNDNfSW50ZXJuYWxEYXRhRFNMKCkpICkge3MgPSA3Nzt9CkBAIC0zMDc5OCwxNCArMzIzMzYsMTQgQEAKICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKCAodHJ1ZSkgKSB7cyA9IDMzO30KIAogICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXQuc2VlayhpbmRleDEzN18zMSk7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dC5zZWVrKGluZGV4MTQ4XzMxKTsKICAgICAgICAgICAgICAgICAgICAgICAgIGlmICggcz49MCApIHJldHVybiBzOwogICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgIGNhc2UgMzEgOiAKLSAgICAgICAgICAgICAgICAgICAgICAgIGludCBMQTEzN18zMiA9IGlucHV0LkxBKDEpOworICAgICAgICAgICAgICAgICAgICAgICAgaW50IExBMTQ4XzMyID0gaW5wdXQuTEEoMSk7CiAKICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbmRleDEzN18zMiA9IGlucHV0LmluZGV4KCk7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW5kZXgxNDhfMzIgPSBpbnB1dC5pbmRleCgpOwogICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXQucmV3aW5kKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICBzID0gLTE7CiAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIChzeW5wcmVkNDNfSW50ZXJuYWxEYXRhRFNMKCkpICkge3MgPSA3Nzt9CkBAIC0zMDgxMywxMyArMzIzNTEsMTMgQEAKICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKCAodHJ1ZSkgKSB7cyA9IDMzO30KIAogICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXQuc2VlayhpbmRleDEzN18zMik7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dC5zZWVrKGluZGV4MTQ4XzMyKTsKICAgICAgICAgICAgICAgICAgICAgICAgIGlmICggcz49MCApIHJldHVybiBzOwogICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBpZiAoc3RhdGUuYmFja3RyYWNraW5nPjApIHtzdGF0ZS5mYWlsZWQ9dHJ1ZTsgcmV0dXJuIC0xO30KICAgICAgICAgICAgIE5vVmlhYmxlQWx0RXhjZXB0aW9uIG52YWUgPQotICAgICAgICAgICAgICAgIG5ldyBOb1ZpYWJsZUFsdEV4Y2VwdGlvbihnZXREZXNjcmlwdGlvbigpLCAxMzcsIF9zLCBpbnB1dCk7CisgICAgICAgICAgICAgICAgbmV3IE5vVmlhYmxlQWx0RXhjZXB0aW9uKGdldERlc2NyaXB0aW9uKCksIDE0OCwgX3MsIGlucHV0KTsKICAgICAgICAgICAgIGVycm9yKG52YWUpOwogICAgICAgICAgICAgdGhyb3cgbnZhZTsKICAgICAgICAgfQpAQCAtMzA4MjcsMTEgKzMyMzY1LDExIEBACiAgICAgc3RhdGljIGZpbmFsIFN0cmluZyBkZmFfNzhzID0gIlwxMTdcdWZmZmYiOwogICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgZGZhXzc5cyA9ICJcMVwyXDExNlx1ZmZmZiI7CiAgICAgc3RhdGljIGZpbmFsIFN0cmluZyBkZmFfODBzID0gIlwxXDRcMVwwXDExNVx1ZmZmZiI7Ci0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBkZmFfODFzID0gIlwxXHUwMDg5XDFcMFwxMTVcdWZmZmYiOworICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgZGZhXzgxcyA9ICJcMVx1MDA5MFwxXDBcMTE1XHVmZmZmIjsKICAgICBzdGF0aWMgZmluYWwgU3RyaW5nIGRmYV84MnMgPSAiXDJcdWZmZmZcMVwyXDExM1x1ZmZmZlwxXDEiOwogICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgZGZhXzgzcyA9ICJcMVx1ZmZmZlwxXDBcMTE1XHVmZmZmfT4iOwogICAgIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBkZmFfODRzID0gewotICAgICAgICAgICAgIlw1XDJcNlx1ZmZmZlwyXDJcMzVcdWZmZmZcMVwyXDE2XHVmZmZmXDFcMlwzXHVmZmZmXDFcMlwxXHVmZmZmXDRcMlwxXHVmZmZmXDFcMlwxXHVmZmZmXDNcMlwxXHVmZmZmXDEwXDJcMVwxXDMxXDJcMVx1ZmZmZlwyN1wyXDFcdWZmZmZcMVwyIiwKKyAgICAgICAgICAgICJcNVwyXDZcdWZmZmZcMlwyXDQxXHVmZmZmXDFcMlwyMVx1ZmZmZlwxXDJcM1x1ZmZmZlwxXDJcMVx1ZmZmZlw0XDJcMVx1ZmZmZlwxXDJcMVx1ZmZmZlwzXDJcMVx1ZmZmZlwxMFwyXDFcMVwzMVwyXDFcdWZmZmZcMjdcMlwxXHVmZmZmXDFcMiIsCiAgICAgICAgICAgICAiXDFcdWZmZmYiLAogICAgICAgICAgICAgIiIsCiAgICAgICAgICAgICAiIiwKQEAgLTMwOTIwLDExICszMjQ1OCwxMSBAQAogICAgIHN0YXRpYyBmaW5hbCBzaG9ydFtdIGRmYV84MyA9IERGQS51bnBhY2tFbmNvZGVkU3RyaW5nKGRmYV84M3MpOwogICAgIHN0YXRpYyBmaW5hbCBzaG9ydFtdW10gZGZhXzg0ID0gdW5wYWNrRW5jb2RlZFN0cmluZ0FycmF5KGRmYV84NHMpOwogCi0gICAgY2xhc3MgREZBMTU1IGV4dGVuZHMgREZBIHsKKyAgICBjbGFzcyBERkExNjYgZXh0ZW5kcyBERkEgewogCi0gICAgICAgIHB1YmxpYyBERkExNTUoQmFzZVJlY29nbml6ZXIgcmVjb2duaXplcikgeworICAgICAgICBwdWJsaWMgREZBMTY2KEJhc2VSZWNvZ25pemVyIHJlY29nbml6ZXIpIHsKICAgICAgICAgICAgIHRoaXMucmVjb2duaXplciA9IHJlY29nbml6ZXI7Ci0gICAgICAgICAgICB0aGlzLmRlY2lzaW9uTnVtYmVyID0gMTU1OworICAgICAgICAgICAgdGhpcy5kZWNpc2lvbk51bWJlciA9IDE2NjsKICAgICAgICAgICAgIHRoaXMuZW90ID0gZGZhXzc4OwogICAgICAgICAgICAgdGhpcy5lb2YgPSBkZmFfNzk7CiAgICAgICAgICAgICB0aGlzLm1pbiA9IGRmYV84MDsKQEAgLTMwOTM0LDE3ICszMjQ3MiwxNyBAQAogICAgICAgICAgICAgdGhpcy50cmFuc2l0aW9uID0gZGZhXzg0OwogICAgICAgICB9CiAgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0RGVzY3JpcHRpb24oKSB7Ci0gICAgICAgICAgICByZXR1cm4gIjg2MjQ6MzogKCAoICggJzwnICk9Pm90aGVybHZfMT0gJzwnICkgKCAobHZfYXJndW1lbnRzXzJfMD0gcnVsZUp2bUFyZ3VtZW50VHlwZVJlZmVyZW5jZSApICkgKG90aGVybHZfMz0gJywnICggKGx2X2FyZ3VtZW50c180XzA9IHJ1bGVKdm1Bcmd1bWVudFR5cGVSZWZlcmVuY2UgKSApICkqIG90aGVybHZfNT0gJz4nICggKCAoICggKCkgJy4nICkgKT0+ICggKCkgb3RoZXJsdl83PSAnLicgKSApICggKCBydWxlVmFsaWRJRCApICkgKCAoICggJzwnICk9Pm90aGVybHZfOT0gJzwnICkgKCAobHZfYXJndW1lbnRzXzEwXzA9IHJ1bGVKdm1Bcmd1bWVudFR5cGVSZWZlcmVuY2UgKSApIChvdGhlcmx2XzExPSAnLCcgKCAobHZfYXJndW1lbnRzXzEyXzA9IHJ1bGVKdm1Bcmd1bWVudFR5cGVSZWZlcmVuY2UgKSApICkqIG90aGVybHZfMTM9ICc+JyApPyApKiApPyI7CisgICAgICAgICAgICByZXR1cm4gIjkwNjM6MzogKCAoICggJzwnICk9Pm90aGVybHZfMT0gJzwnICkgKCAobHZfYXJndW1lbnRzXzJfMD0gcnVsZUp2bUFyZ3VtZW50VHlwZVJlZmVyZW5jZSApICkgKG90aGVybHZfMz0gJywnICggKGx2X2FyZ3VtZW50c180XzA9IHJ1bGVKdm1Bcmd1bWVudFR5cGVSZWZlcmVuY2UgKSApICkqIG90aGVybHZfNT0gJz4nICggKCAoICggKCkgJy4nICkgKT0+ICggKCkgb3RoZXJsdl83PSAnLicgKSApICggKCBydWxlVmFsaWRJRCApICkgKCAoICggJzwnICk9Pm90aGVybHZfOT0gJzwnICkgKCAobHZfYXJndW1lbnRzXzEwXzA9IHJ1bGVKdm1Bcmd1bWVudFR5cGVSZWZlcmVuY2UgKSApIChvdGhlcmx2XzExPSAnLCcgKCAobHZfYXJndW1lbnRzXzEyXzA9IHJ1bGVKdm1Bcmd1bWVudFR5cGVSZWZlcmVuY2UgKSApICkqIG90aGVybHZfMTM9ICc+JyApPyApKiApPyI7CiAgICAgICAgIH0KICAgICAgICAgcHVibGljIGludCBzcGVjaWFsU3RhdGVUcmFuc2l0aW9uKGludCBzLCBJbnRTdHJlYW0gX2lucHV0KSB0aHJvd3MgTm9WaWFibGVBbHRFeGNlcHRpb24gewogICAgICAgICAgICAgVG9rZW5TdHJlYW0gaW5wdXQgPSAoVG9rZW5TdHJlYW0pX2lucHV0OwogICAgICAgICAJaW50IF9zID0gczsKICAgICAgICAgICAgIHN3aXRjaCAoIHMgKSB7CiAgICAgICAgICAgICAgICAgICAgIGNhc2UgMCA6IAotICAgICAgICAgICAgICAgICAgICAgICAgaW50IExBMTU1XzEgPSBpbnB1dC5MQSgxKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBMQTE2Nl8xID0gaW5wdXQuTEEoMSk7CiAKICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbmRleDE1NV8xID0gaW5wdXQuaW5kZXgoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbmRleDE2Nl8xID0gaW5wdXQuaW5kZXgoKTsKICAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0LnJld2luZCgpOwogICAgICAgICAgICAgICAgICAgICAgICAgcyA9IC0xOwogICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCAoc3lucHJlZDUwX0ludGVybmFsRGF0YURTTCgpKSApIHtzID0gNzg7fQpAQCAtMzA5NTIsMjMgKzMyNDkwLDIzIEBACiAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICggKHRydWUpICkge3MgPSAyO30KIAogICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXQuc2VlayhpbmRleDE1NV8xKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0LnNlZWsoaW5kZXgxNjZfMSk7CiAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIHM+PTAgKSByZXR1cm4gczsKICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgaWYgKHN0YXRlLmJhY2t0cmFja2luZz4wKSB7c3RhdGUuZmFpbGVkPXRydWU7IHJldHVybiAtMTt9CiAgICAgICAgICAgICBOb1ZpYWJsZUFsdEV4Y2VwdGlvbiBudmFlID0KLSAgICAgICAgICAgICAgICBuZXcgTm9WaWFibGVBbHRFeGNlcHRpb24oZ2V0RGVzY3JpcHRpb24oKSwgMTU1LCBfcywgaW5wdXQpOworICAgICAgICAgICAgICAgIG5ldyBOb1ZpYWJsZUFsdEV4Y2VwdGlvbihnZXREZXNjcmlwdGlvbigpLCAxNjYsIF9zLCBpbnB1dCk7CiAgICAgICAgICAgICBlcnJvcihudmFlKTsKICAgICAgICAgICAgIHRocm93IG52YWU7CiAgICAgICAgIH0KICAgICB9CiAKLSAgICBjbGFzcyBERkExNTMgZXh0ZW5kcyBERkEgeworICAgIGNsYXNzIERGQTE2NCBleHRlbmRzIERGQSB7CiAKLSAgICAgICAgcHVibGljIERGQTE1MyhCYXNlUmVjb2duaXplciByZWNvZ25pemVyKSB7CisgICAgICAgIHB1YmxpYyBERkExNjQoQmFzZVJlY29nbml6ZXIgcmVjb2duaXplcikgewogICAgICAgICAgICAgdGhpcy5yZWNvZ25pemVyID0gcmVjb2duaXplcjsKLSAgICAgICAgICAgIHRoaXMuZGVjaXNpb25OdW1iZXIgPSAxNTM7CisgICAgICAgICAgICB0aGlzLmRlY2lzaW9uTnVtYmVyID0gMTY0OwogICAgICAgICAgICAgdGhpcy5lb3QgPSBkZmFfNzg7CiAgICAgICAgICAgICB0aGlzLmVvZiA9IGRmYV83OTsKICAgICAgICAgICAgIHRoaXMubWluID0gZGZhXzgwOwpAQCAtMzA5NzgsMTcgKzMyNTE2LDE3IEBACiAgICAgICAgICAgICB0aGlzLnRyYW5zaXRpb24gPSBkZmFfODQ7CiAgICAgICAgIH0KICAgICAgICAgcHVibGljIFN0cmluZyBnZXREZXNjcmlwdGlvbigpIHsKLSAgICAgICAgICAgIHJldHVybiAiODcxODo1OiAoICggKCAnPCcgKT0+b3RoZXJsdl85PSAnPCcgKSAoIChsdl9hcmd1bWVudHNfMTBfMD0gcnVsZUp2bUFyZ3VtZW50VHlwZVJlZmVyZW5jZSApICkgKG90aGVybHZfMTE9ICcsJyAoIChsdl9hcmd1bWVudHNfMTJfMD0gcnVsZUp2bUFyZ3VtZW50VHlwZVJlZmVyZW5jZSApICkgKSogb3RoZXJsdl8xMz0gJz4nICk/IjsKKyAgICAgICAgICAgIHJldHVybiAiOTE1Nzo1OiAoICggKCAnPCcgKT0+b3RoZXJsdl85PSAnPCcgKSAoIChsdl9hcmd1bWVudHNfMTBfMD0gcnVsZUp2bUFyZ3VtZW50VHlwZVJlZmVyZW5jZSApICkgKG90aGVybHZfMTE9ICcsJyAoIChsdl9hcmd1bWVudHNfMTJfMD0gcnVsZUp2bUFyZ3VtZW50VHlwZVJlZmVyZW5jZSApICkgKSogb3RoZXJsdl8xMz0gJz4nICk/IjsKICAgICAgICAgfQogICAgICAgICBwdWJsaWMgaW50IHNwZWNpYWxTdGF0ZVRyYW5zaXRpb24oaW50IHMsIEludFN0cmVhbSBfaW5wdXQpIHRocm93cyBOb1ZpYWJsZUFsdEV4Y2VwdGlvbiB7CiAgICAgICAgICAgICBUb2tlblN0cmVhbSBpbnB1dCA9IChUb2tlblN0cmVhbSlfaW5wdXQ7CiAgICAgICAgIAlpbnQgX3MgPSBzOwogICAgICAgICAgICAgc3dpdGNoICggcyApIHsKICAgICAgICAgICAgICAgICAgICAgY2FzZSAwIDogCi0gICAgICAgICAgICAgICAgICAgICAgICBpbnQgTEExNTNfMSA9IGlucHV0LkxBKDEpOworICAgICAgICAgICAgICAgICAgICAgICAgaW50IExBMTY0XzEgPSBpbnB1dC5MQSgxKTsKIAogICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgaW50IGluZGV4MTUzXzEgPSBpbnB1dC5pbmRleCgpOworICAgICAgICAgICAgICAgICAgICAgICAgaW50IGluZGV4MTY0XzEgPSBpbnB1dC5pbmRleCgpOwogICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXQucmV3aW5kKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICBzID0gLTE7CiAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIChzeW5wcmVkNTJfSW50ZXJuYWxEYXRhRFNMKCkpICkge3MgPSA3ODt9CkBAIC0zMDk5NiwxMyArMzI1MzQsMTMgQEAKICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKCAodHJ1ZSkgKSB7cyA9IDI7fQogCiAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICBpbnB1dC5zZWVrKGluZGV4MTUzXzEpOworICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXQuc2VlayhpbmRleDE2NF8xKTsKICAgICAgICAgICAgICAgICAgICAgICAgIGlmICggcz49MCApIHJldHVybiBzOwogICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBpZiAoc3RhdGUuYmFja3RyYWNraW5nPjApIHtzdGF0ZS5mYWlsZWQ9dHJ1ZTsgcmV0dXJuIC0xO30KICAgICAgICAgICAgIE5vVmlhYmxlQWx0RXhjZXB0aW9uIG52YWUgPQotICAgICAgICAgICAgICAgIG5ldyBOb1ZpYWJsZUFsdEV4Y2VwdGlvbihnZXREZXNjcmlwdGlvbigpLCAxNTMsIF9zLCBpbnB1dCk7CisgICAgICAgICAgICAgICAgbmV3IE5vVmlhYmxlQWx0RXhjZXB0aW9uKGdldERlc2NyaXB0aW9uKCksIDE2NCwgX3MsIGlucHV0KTsKICAgICAgICAgICAgIGVycm9yKG52YWUpOwogICAgICAgICAgICAgdGhyb3cgbnZhZTsKICAgICAgICAgfQpAQCAtMzEwMTcsMTMzICszMjU1NSwxNDUgQEAKICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEJpdFNldCBGT0xMT1dfNiA9IG5ldyBCaXRTZXQobmV3IGxvbmdbXXsweDAwMDAwMDAwMDAwMDAwMTBMfSk7CiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBCaXRTZXQgRk9MTE9XXzcgPSBuZXcgQml0U2V0KG5ldyBsb25nW117MHgwMDAwMDAwMDAwMDA4MDAyTH0pOwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgQml0U2V0IEZPTExPV184ID0gbmV3IEJpdFNldChuZXcgbG9uZ1tdezB4MDAwMDAwMDAwMDAzMDAwMEx9KTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEJpdFNldCBGT0xMT1dfOSA9IG5ldyBCaXRTZXQobmV3IGxvbmdbXXsweDAwMDAwMDAwMDAwNDAwMDBMLDB4MDAwMDAwMDAwMDAwMDAwMEwsMHgwMDAwMDAwMDA3MDAwMDAwTH0pOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgQml0U2V0IEZPTExPV18xMCA9IG5ldyBCaXRTZXQobmV3IGxvbmdbXXsweDAwMDAwMDAwMDA3ODAwMDBMfSk7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBCaXRTZXQgRk9MTE9XXzExID0gbmV3IEJpdFNldChuZXcgbG9uZ1tdezB4MDAwMDAwMDAwMDcwMDAwMEx9KTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEJpdFNldCBGT0xMT1dfMTIgPSBuZXcgQml0U2V0KG5ldyBsb25nW117MHgwMDAwMDAwMDAwNjAwMDAwTH0pOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgQml0U2V0IEZPTExPV185ID0gbmV3IEJpdFNldChuZXcgbG9uZ1tdezB4MDAwMDAwMDAwMDA0MDAwMEwsMHgwMDAwMDAwMDAwMDAwMDAwTCwweDAwMDAwMDAzODAwMDAwMDBMfSk7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBCaXRTZXQgRk9MTE9XXzEwID0gbmV3IEJpdFNldChuZXcgbG9uZ1tdezB4MDAwMDAwMDAwMEY4MDAwMEx9KTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEJpdFNldCBGT0xMT1dfMTEgPSBuZXcgQml0U2V0KG5ldyBsb25nW117MHgwMDAwMDAwMDAwRjAwMDAwTH0pOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgQml0U2V0IEZPTExPV18xMiA9IG5ldyBCaXRTZXQobmV3IGxvbmdbXXsweDAwMDAwMDAwMDBFMDAwMDBMfSk7CiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBCaXRTZXQgRk9MTE9XXzEzID0gbmV3IEJpdFNldChuZXcgbG9uZ1tdezB4MDAwMDAwMDAwMDAwMDAyMEx9KTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEJpdFNldCBGT0xMT1dfMTQgPSBuZXcgQml0U2V0KG5ldyBsb25nW117MHgwMDAwMDAwMDAwNDAwMDAwTH0pOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgQml0U2V0IEZPTExPV18xNSA9IG5ldyBCaXRTZXQobmV3IGxvbmdbXXsweDAwMDAwMDAyMTEwMDAwMDBMfSk7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBCaXRTZXQgRk9MTE9XXzE2ID0gbmV3IEJpdFNldChuZXcgbG9uZ1tdezB4MDAwMDAwMDAwMDgwMDAwMEx9KTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEJpdFNldCBGT0xMT1dfMTcgPSBuZXcgQml0U2V0KG5ldyBsb25nW117MHgwMDAwMDAwMDAwMDA4MDAwTH0pOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgQml0U2V0IEZPTExPV18xOCA9IG5ldyBCaXRTZXQobmV3IGxvbmdbXXsweDAwMDAwMDEwMDAwMTAwMDBMfSk7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBCaXRTZXQgRk9MTE9XXzE5ID0gbmV3IEJpdFNldChuZXcgbG9uZ1tdezB4MDAwMDAwMDAwRTAwMDAwMkx9KTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEJpdFNldCBGT0xMT1dfMjAgPSBuZXcgQml0U2V0KG5ldyBsb25nW117MHgwMDAwMDAwMUVDMDAwMDAyTH0pOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgQml0U2V0IEZPTExPV18yMSA9IG5ldyBCaXRTZXQobmV3IGxvbmdbXXsweDAwMDAwMDA0MEMwMDAwMDBMfSk7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBCaXRTZXQgRk9MTE9XXzIyID0gbmV3IEJpdFNldChuZXcgbG9uZ1tdezB4MDAwMDAwMDgwMDAwMDAwMkx9KTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEJpdFNldCBGT0xMT1dfMjMgPSBuZXcgQml0U2V0KG5ldyBsb25nW117MHgwMDAwMUZFMDAwMDAwMDAyTH0pOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgQml0U2V0IEZPTExPV18yNCA9IG5ldyBCaXRTZXQobmV3IGxvbmdbXXsweDAwMDAxRkMwMDAwMDAwMDJMfSk7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBCaXRTZXQgRk9MTE9XXzI1ID0gbmV3IEJpdFNldChuZXcgbG9uZ1tdezB4MDAwMDFGODAwMDAwMDAwMkx9KTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEJpdFNldCBGT0xMT1dfMjYgPSBuZXcgQml0U2V0KG5ldyBsb25nW117MHgwMDAwMUYwMDAwMDAwMDAyTH0pOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgQml0U2V0IEZPTExPV18yNyA9IG5ldyBCaXRTZXQobmV3IGxvbmdbXXsweDEyMDAwMDAwMDAwMTAwMDBMfSk7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBCaXRTZXQgRk9MTE9XXzI4ID0gbmV3IEJpdFNldChuZXcgbG9uZ1tdezB4MDAwMDFFMDAwMDAwMDAwMkx9KTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEJpdFNldCBGT0xMT1dfMjkgPSBuZXcgQml0U2V0KG5ldyBsb25nW117MHgwMDAwNDAwMDAwMDEwMDAwTH0pOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgQml0U2V0IEZPTExPV18zMCA9IG5ldyBCaXRTZXQobmV3IGxvbmdbXXsweDAwMDAxQzAwMDAwMDAwMDJMfSk7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBCaXRTZXQgRk9MTE9XXzMxID0gbmV3IEJpdFNldChuZXcgbG9uZ1tdezB4MDAwMDE4MDAwMDAwMDAwMkx9KTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEJpdFNldCBGT0xMT1dfMzIgPSBuZXcgQml0U2V0KG5ldyBsb25nW117MHg0MDAwMDAwMDAwMDEwMDAwTCwweDAwMDAwMDAwMDAwMDAwMDFMfSk7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBCaXRTZXQgRk9MTE9XXzMzID0gbmV3IEJpdFNldChuZXcgbG9uZ1tdezB4MDAwMDEwMDAwMDAwMDAwMkx9KTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEJpdFNldCBGT0xMT1dfMzQgPSBuZXcgQml0U2V0KG5ldyBsb25nW117MHgwMDAwMjAwMDAwMDEwMDAwTH0pOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgQml0U2V0IEZPTExPV18zNSA9IG5ldyBCaXRTZXQobmV3IGxvbmdbXXsweDAwMDA4MDAwMDAwMDAwMDBMfSk7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBCaXRTZXQgRk9MTE9XXzM2ID0gbmV3IEJpdFNldChuZXcgbG9uZ1tdezB4MDAwMTAwNDAwMDAwMDAwMEx9KTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEJpdFNldCBGT0xMT1dfMzcgPSBuZXcgQml0U2V0KG5ldyBsb25nW117MHgwMDAxMDAwMDAwMDAwMDAwTH0pOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgQml0U2V0IEZPTExPV18zOCA9IG5ldyBCaXRTZXQobmV3IGxvbmdbXXsweDAwM0UwMDAwMDAwMDAwMDJMfSk7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBCaXRTZXQgRk9MTE9XXzM5ID0gbmV3IEJpdFNldChuZXcgbG9uZ1tdezB4MDAzQzAwMDAwMDAwMDAwMkx9KTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEJpdFNldCBGT0xMT1dfNDAgPSBuZXcgQml0U2V0KG5ldyBsb25nW117MHgwMDM4MDAwMDAwMDAwMDAyTH0pOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgQml0U2V0IEZPTExPV180MSA9IG5ldyBCaXRTZXQobmV3IGxvbmdbXXsweDAwNDAwMDAwMDAwMTAwMDBMfSk7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBCaXRTZXQgRk9MTE9XXzQyID0gbmV3IEJpdFNldChuZXcgbG9uZ1tdezB4MDA4MDAwMDAwMDAwMDAwMkx9KTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEJpdFNldCBGT0xMT1dfNDMgPSBuZXcgQml0U2V0KG5ldyBsb25nW117MHgwMTAwMDAwMDAwMDAwMDAwTH0pOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgQml0U2V0IEZPTExPV180NCA9IG5ldyBCaXRTZXQobmV3IGxvbmdbXXsweDA0MDAwMDAwMDAwMDAwMDBMfSk7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBCaXRTZXQgRk9MTE9XXzQ1ID0gbmV3IEJpdFNldChuZXcgbG9uZ1tdezB4MDgwMDAwMDAwMDAwMDAwMEx9KTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEJpdFNldCBGT0xMT1dfNDYgPSBuZXcgQml0U2V0KG5ldyBsb25nW117MHgwMDAwMDAwMDAwMDAwMDAwTCwweDAwMDAwMDAwMDAwMDAwMDBMLDB4MDAwMDAwMDAwMDA3MDAwMEx9KTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEJpdFNldCBGT0xMT1dfNDcgPSBuZXcgQml0U2V0KG5ldyBsb25nW117MHgyMDAwMDAwMDAwMDAwMDAwTH0pOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgQml0U2V0IEZPTExPV180OCA9IG5ldyBCaXRTZXQobmV3IGxvbmdbXXsweDAwMDAwMDAwMDAwMDAwMDBMLDB4MDAwMDAwMDAwMDAwMDAwMEwsMHgwMDAwMDAwMDAwRjgwMDAwTH0pOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgQml0U2V0IEZPTExPV180OSA9IG5ldyBCaXRTZXQobmV3IGxvbmdbXXsweDgwMDAwMDAwMDAwMDAwMDBMfSk7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBCaXRTZXQgRk9MTE9XXzUwID0gbmV3IEJpdFNldChuZXcgbG9uZ1tdezB4MDAwMDAwMDAwMDgwMDAwMEwsMHgwMDAwMDAwMDAwMDAwMDA2TH0pOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgQml0U2V0IEZPTExPV181MSA9IG5ldyBCaXRTZXQobmV3IGxvbmdbXXsweDAwMDAwMDAwMDA4MDAwMDBMLDB4MDAwMDAwMDAwMDAwMDAwNEx9KTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEJpdFNldCBGT0xMT1dfNTIgPSBuZXcgQml0U2V0KG5ldyBsb25nW117MHgwMDAwMDAwMDAwMDAwMDAwTCwweDAwMDAwMDAwMDAwMDAwMDRMfSk7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBCaXRTZXQgRk9MTE9XXzUzID0gbmV3IEJpdFNldChuZXcgbG9uZ1tdezB4MDAwMDAwMDAwMDAwMDAwMEwsMHgwMDAwMDAwMDAwMDAwMDAwTCwweDAwMDAwMDAwMDAwMEZDMDBMfSk7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBCaXRTZXQgRk9MTE9XXzU0ID0gbmV3IEJpdFNldChuZXcgbG9uZ1tdezB4MDAwMDAwMDAwMDAwMDAwMkwsMHgwMDAwMDAwMDAwMDAwMDA4TH0pOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgQml0U2V0IEZPTExPV181NSA9IG5ldyBCaXRTZXQobmV3IGxvbmdbXXsweDAwMDAwMDAwMDAwMDAwNDBMLDB4MDAwMDAwMDAwMDAwMDBBMEx9KTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEJpdFNldCBGT0xMT1dfNTYgPSBuZXcgQml0U2V0KG5ldyBsb25nW117MHgwMDAwMDAwMDAwMDAwMDQwTCwweDAwMDAwMDAwMDAwMDAwMDJMfSk7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBCaXRTZXQgRk9MTE9XXzU3ID0gbmV3IEJpdFNldChuZXcgbG9uZ1tdezB4MDAwMDAwMDAwMDAwMDA0MEwsMHgwMDAwMDAwMDAwMDAwMDQwTH0pOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgQml0U2V0IEZPTExPV181OCA9IG5ldyBCaXRTZXQobmV3IGxvbmdbXXsweDAwMDAwMDAwMDAwMDAwMDJMLDB4MDAwMDAwMDAwMDAwMDEwMEx9KTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEJpdFNldCBGT0xMT1dfNTkgPSBuZXcgQml0U2V0KG5ldyBsb25nW117MHgwMDAwMDAwMDAwMDAwMDAyTCwweDAwMDAwMDAwMDAwMDA0MDBMfSk7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBCaXRTZXQgRk9MTE9XXzYwID0gbmV3IEJpdFNldChuZXcgbG9uZ1tdezB4MDAwMDQwMDAwMDAwODFGMEwsMHhGOThBMDhDMDAwNDBENjMyTCwweDAwMDAwMDAwMDAwMDAwNUZMfSk7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBCaXRTZXQgRk9MTE9XXzYxID0gbmV3IEJpdFNldChuZXcgbG9uZ1tdezB4MDAwMDAwMDAwMDAwMDAwMEwsMHgwMDAwMDAwMDAwMDAxODAwTH0pOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgQml0U2V0IEZPTExPV182MiA9IG5ldyBCaXRTZXQobmV3IGxvbmdbXXsweDAwMDAwMDAwMDAwMDAwMDBMLDB4MDAwMDAwMDAwMDAwMTAwMEx9KTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEJpdFNldCBGT0xMT1dfNjMgPSBuZXcgQml0U2V0KG5ldyBsb25nW117MHgwMDAwMDAwMDAwMDAwMDAwTCwweDAwMDAwMDAwMDAwMDIwMDBMfSk7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBCaXRTZXQgRk9MTE9XXzY0ID0gbmV3IEJpdFNldChuZXcgbG9uZ1tdezB4MDAwMDQwMDAwMDAwODFGMEwsMHhGOThBMDhDMDAwNDBDNjMyTCwweDAwMDAwMDAwMDAwMDAwNUZMfSk7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBCaXRTZXQgRk9MTE9XXzY1ID0gbmV3IEJpdFNldChuZXcgbG9uZ1tdezB4MDAwMDAwMDAwMDAwMDAwMEwsMHgwMDAwMDAwMDAwMDA4MDAwTH0pOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgQml0U2V0IEZPTExPV182NiA9IG5ldyBCaXRTZXQobmV3IGxvbmdbXXsweDAwMDA0MDAwMDAwMDgxRjBMLDB4Rjk4QTA4QzAwMDQxQzYzMkwsMHgwMDAwMDAwMDAwMDAwMDVGTH0pOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgQml0U2V0IEZPTExPV182NyA9IG5ldyBCaXRTZXQobmV3IGxvbmdbXXsweDAwMDAwMDAwMDAwMDAwMDBMLDB4MDAwMDAwMDAwMDAxMDgwMEx9KTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEJpdFNldCBGT0xMT1dfNjggPSBuZXcgQml0U2V0KG5ldyBsb25nW117MHgwMDAwMDAwMDAwMDAwMDAyTCwweDAwMDAwMDAwMDAwMDA4MDBMfSk7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBCaXRTZXQgRk9MTE9XXzY5ID0gbmV3IEJpdFNldChuZXcgbG9uZ1tdezB4MDAwMDAwMDAwMDAwMDAwMkwsMHgwMDAwMDAwMDAwRkUwMDAwTH0pOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgQml0U2V0IEZPTExPV183MCA9IG5ldyBCaXRTZXQobmV3IGxvbmdbXXsweDAwMDAwMDAwMDAwMDAwMDBMLDB4MDAwMDAwMDAwMDQwMDAwMEx9KTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEJpdFNldCBGT0xMT1dfNzEgPSBuZXcgQml0U2V0KG5ldyBsb25nW117MHgwMDAwMDAwMDAwMDAwMDAwTCwweDAwMDAwMDAwMDE4MDAwMDBMfSk7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBCaXRTZXQgRk9MTE9XXzcyID0gbmV3IEJpdFNldChuZXcgbG9uZ1tdezB4MDAwMDAwMDAwMDAwMDAwMEwsMHgwMDAwMDAwMDAxMDAwMDAwTH0pOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgQml0U2V0IEZPTExPV183MyA9IG5ldyBCaXRTZXQobmV3IGxvbmdbXXsweDAwMDAwMDAwMDAwMDAwMDJMLDB4MDAwMDAwMDAwMjAwMDAwMEx9KTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEJpdFNldCBGT0xMT1dfNzQgPSBuZXcgQml0U2V0KG5ldyBsb25nW117MHgwMDAwMDAwMDAwMDAwMDAyTCwweDAwMDAwMDAwMDQwMDAwMDBMfSk7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBCaXRTZXQgRk9MTE9XXzc1ID0gbmV3IEJpdFNldChuZXcgbG9uZ1tdezB4MDAwMDAwMDAwMDAwMDAwMkwsMHgwMDAwMDAwMDc4MDAwMDAwTH0pOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgQml0U2V0IEZPTExPV183NiA9IG5ldyBCaXRTZXQobmV3IGxvbmdbXXsweDAwMDAwMDAwMDAwMDAwMDJMLDB4MDAwMDAwMDA4MUMwMDAwMEx9KTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEJpdFNldCBGT0xMT1dfNzcgPSBuZXcgQml0U2V0KG5ldyBsb25nW117MHgwMDAwMDAwMDAwMDAwMDQwTCwweDAwMDAwMDA4MDAwMDA0MDBMfSk7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBCaXRTZXQgRk9MTE9XXzc4ID0gbmV3IEJpdFNldChuZXcgbG9uZ1tdezB4MDAwMDAwMDAwMDAwMDAwMkwsMHgwMDAwMDAzRjAwQzAwMDAwTH0pOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgQml0U2V0IEZPTExPV183OSA9IG5ldyBCaXRTZXQobmV3IGxvbmdbXXsweDAwMDAwMDAwMDAwMDAwMDBMLDB4MDAwMDAwMDQwMDAwMDAwMEx9KTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEJpdFNldCBGT0xMT1dfODAgPSBuZXcgQml0U2V0KG5ldyBsb25nW117MHgwMDAwMDAwMDAwMDAwMDAwTCwweDAwMDAwMDAwMDA4MDAwMDBMfSk7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBCaXRTZXQgRk9MTE9XXzgxID0gbmV3IEJpdFNldChuZXcgbG9uZ1tdezB4MDAwMDAwMDAwMDAwMDAwMEwsMHgwMDAwMDAwODAwNDAwMDAwTH0pOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgQml0U2V0IEZPTExPV184MiA9IG5ldyBCaXRTZXQobmV3IGxvbmdbXXsweDAwMDAwMDAwMDAwMDAwMDJMLDB4MDAwMDAwQzAwMDAwMDAwMEx9KTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEJpdFNldCBGT0xMT1dfODMgPSBuZXcgQml0U2V0KG5ldyBsb25nW117MHgwMDAwMDAwMDAwMDAwMDAyTCwweDAwMDAwNzAwMDAwMDAwNDBMfSk7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBCaXRTZXQgRk9MTE9XXzg0ID0gbmV3IEJpdFNldChuZXcgbG9uZ1tdezB4MjAwMDAwMDAwMDAwMDAwMkx9KTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEJpdFNldCBGT0xMT1dfODUgPSBuZXcgQml0U2V0KG5ldyBsb25nW117MHgwMDAwMDAwMDAwMDAwMDAyTCwweDAwMDAzMDAwMDAwMDAwMDBMfSk7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBCaXRTZXQgRk9MTE9XXzg2ID0gbmV3IEJpdFNldChuZXcgbG9uZ1tdezB4MDAwMDAwMDAwMDAwMDAwMkwsMHgwMDAwQzAwMDAwMDAwMDA4TH0pOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgQml0U2V0IEZPTExPV184NyA9IG5ldyBCaXRTZXQobmV3IGxvbmdbXXsweDAwMDAwMDAwMDAwMDAwNDBMLDB4MDgwMDAwMDAwMDAwMDAzMkx9KTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEJpdFNldCBGT0xMT1dfODggPSBuZXcgQml0U2V0KG5ldyBsb25nW117MHgwMDAwMDAwMDAwMDAwMDQwTCwweDE4MDAwMDAwMDA0MDAwMzJMfSk7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBCaXRTZXQgRk9MTE9XXzg5ID0gbmV3IEJpdFNldChuZXcgbG9uZ1tdezB4MDAwMDAwMDAwMDAwMDA0MEwsMHgwMDAwMDAwODAwMDAwNDAwTCwweDAwMDAwMDAwMDAwMDAxMDBMfSk7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBCaXRTZXQgRk9MTE9XXzkwID0gbmV3IEJpdFNldChuZXcgbG9uZ1tdezB4MDAwMDAwMDAwMDAwMDAwMEwsMHgwMDAwMDAwMDAwODAwODAwTH0pOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgQml0U2V0IEZPTExPV185MSA9IG5ldyBCaXRTZXQobmV3IGxvbmdbXXsweDAwMDAwMDAwMDAwMDAwMDJMLDB4MDAwMEMwMDAwMDAwODQwOEx9KTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEJpdFNldCBGT0xMT1dfOTIgPSBuZXcgQml0U2V0KG5ldyBsb25nW117MHgwMDAwNDAwMDAwMDA4MUYwTCwweEY5OEIwOEM4MDA0MEQ2MzJMLDB4MDAwMDAwMDAwMDAwMDA1Rkx9KTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEJpdFNldCBGT0xMT1dfOTMgPSBuZXcgQml0U2V0KG5ldyBsb25nW117MHgwMDAwMDAwMDAwMDAwMDAyTCwweDAwMDBDMDAwMDAwMDgwMDhMfSk7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBCaXRTZXQgRk9MTE9XXzk0ID0gbmV3IEJpdFNldChuZXcgbG9uZ1tdezB4MDAwMDQwMDAwMDAxODFGMEwsMHhGOThBMDhDMDAwNDBDNjMyTCwweDAwMDAwMDAwMDAwMDAwNUZMfSk7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBCaXRTZXQgRk9MTE9XXzk1ID0gbmV3IEJpdFNldChuZXcgbG9uZ1tdezB4MDAwMDAwMDAwMDAxMDAwMEwsMHgwMDAwMDAwMDAwMDAwODAwTH0pOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgQml0U2V0IEZPTExPV185NiA9IG5ldyBCaXRTZXQobmV3IGxvbmdbXXsweDAwMDA0MDAwMDAwMDgxRjBMLDB4RkY4QjA4QzgwMDQxQzYzMkwsMHgwMDAwMDAwMDAwMDAwMDVGTH0pOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgQml0U2V0IEZPTExPV185NyA9IG5ldyBCaXRTZXQobmV3IGxvbmdbXXsweDAwMDAwMDAwMDAwMDAwMDBMLDB4MDAwMTAwMDAwMDAwMDgwMEx9KTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEJpdFNldCBGT0xMT1dfOTggPSBuZXcgQml0U2V0KG5ldyBsb25nW117MHgwMDAwNDAwMDAwMDA4MUYwTCwweEZGOEEwOEMwMDA0MUM2MzJMLDB4MDAwMDAwMDAwMDAwMDA1Rkx9KTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEJpdFNldCBGT0xMT1dfOTkgPSBuZXcgQml0U2V0KG5ldyBsb25nW117MHgwMDAwMDAwMDAwMDAwMDAwTCwweDAwMDAwMDAwMDAwMTAwMDBMfSk7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBCaXRTZXQgRk9MTE9XXzEwMCA9IG5ldyBCaXRTZXQobmV3IGxvbmdbXXsweDAwMDA0MDAwMDAwMDgxRjJMLDB4RkY4QTA4QzAwMDQwQzczMkwsMHgwMDAwMDAwMDAwMDAwMDVGTH0pOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgQml0U2V0IEZPTExPV18xMDEgPSBuZXcgQml0U2V0KG5ldyBsb25nW117MHgwMDAwNDAwMDAwMDA4MUYyTCwweEZGOEEwOEMwMDA0MEM2MzJMLDB4MDAwMDAwMDAwMDAwMDA1Rkx9KTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEJpdFNldCBGT0xMT1dfMTAyID0gbmV3IEJpdFNldChuZXcgbG9uZ1tdezB4MDAwMDAwMDAwMDAwMDAwMEwsMHgwMDAwMDAwMDAwMDAwNDAwTH0pOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgQml0U2V0IEZPTExPV18xMDMgPSBuZXcgQml0U2V0KG5ldyBsb25nW117MHgwMDAwMDAwMDAwMDAwMDAyTCwweDAwMDQwMDAwMDAwMDAwMDBMfSk7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBCaXRTZXQgRk9MTE9XXzEwNCA9IG5ldyBCaXRTZXQobmV3IGxvbmdbXXsweDAwMDA0MDAwMDAwMDgxRjBMLDB4Rjk4QTA4QzgwMDQwQzYzMkwsMHgwMDAwMDAwMDAwMDAwMDVGTH0pOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgQml0U2V0IEZPTExPV18xMDUgPSBuZXcgQml0U2V0KG5ldyBsb25nW117MHgwMDAwMDAwMDAwMDAwMDAwTCwweDAwMTAwMDAwMDAwMDAwMDBMfSk7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBCaXRTZXQgRk9MTE9XXzEwNiA9IG5ldyBCaXRTZXQobmV3IGxvbmdbXXsweDAwMDAwMDAwMDAwMTAwNDBMLDB4MDA3MDAwMDgwMDAwMEMwMEx9KTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEJpdFNldCBGT0xMT1dfMTA3ID0gbmV3IEJpdFNldChuZXcgbG9uZ1tdezB4MDAwMDAwMDAwMDAxMDAwMEx9KTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEJpdFNldCBGT0xMT1dfMTA4ID0gbmV3IEJpdFNldChuZXcgbG9uZ1tdezB4MDAwMDAwMDAwMDAwMDAwMEwsMHgwMDUwMDAwMDAwMDAwODAwTH0pOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgQml0U2V0IEZPTExPV18xMDkgPSBuZXcgQml0U2V0KG5ldyBsb25nW117MHgwMDAwMDAwMDAwMDAwMDAwTCwweDAwMTAwMDAwMDAwMDA4MDBMfSk7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBCaXRTZXQgRk9MTE9XXzExMCA9IG5ldyBCaXRTZXQobmV3IGxvbmdbXXsweDAwMDA0MDAwMDAwMDgxRjBMLDB4RkY4QTA4QzAwMDQwQzczMkwsMHgwMDAwMDAwMDAwMDAwMDVGTH0pOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgQml0U2V0IEZPTExPV18xMTEgPSBuZXcgQml0U2V0KG5ldyBsb25nW117MHgwMDAwMDAwMDAwMDAwMDAwTCwweDAwMDAwMDAwMDAwMDA5MDBMfSk7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBCaXRTZXQgRk9MTE9XXzExMiA9IG5ldyBCaXRTZXQobmV3IGxvbmdbXXsweDAwMDA0MDAwMDAwMDgxRjBMLDB4RkY4QTA4QzAwMDQwQzYzMkwsMHgwMDAwMDAwMDAwMDAwMDVGTH0pOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgQml0U2V0IEZPTExPV18xMTMgPSBuZXcgQml0U2V0KG5ldyBsb25nW117MHgwMDAwNDAwMDAwMDA4MUYwTCwweEY5OEEwOEMwMDA0MEM3MzJMLDB4MDAwMDAwMDAwMDAwMDA1Rkx9KTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEJpdFNldCBGT0xMT1dfMTE0ID0gbmV3IEJpdFNldChuZXcgbG9uZ1tdezB4MDAwMDAwMDAwMDAwMDAwMEwsMHgwMDAwMDAwMDAwMDAwMTAwTH0pOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgQml0U2V0IEZPTExPV18xMTUgPSBuZXcgQml0U2V0KG5ldyBsb25nW117MHgwMDAwMDAwMDAwMDAwMDAwTCwweDAwODAwMDAwMDAwMDAwMDBMfSk7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBCaXRTZXQgRk9MTE9XXzExNiA9IG5ldyBCaXRTZXQobmV3IGxvbmdbXXsweDAwMDA0MDAwMDAwMTgxRjBMLDB4RkY4QTA4QzAwMDQwQzYzMkwsMHgwMDAwMDAwMDAwMDAwMDVGTH0pOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgQml0U2V0IEZPTExPV18xMTcgPSBuZXcgQml0U2V0KG5ldyBsb25nW117MHgwMDAwNDAwMDAwMDE4MUYwTCwweEZGOEEwOEMwMDA0MEM3MzJMLDB4MDAwMDAwMDAwMDAwMDA1Rkx9KTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEJpdFNldCBGT0xMT1dfMTE4ID0gbmV3IEJpdFNldChuZXcgbG9uZ1tdezB4MDAwMDAwMDAwMDAwMDAwMkwsMHgwMDAwMDAwMDAwMDAyMDAwTH0pOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgQml0U2V0IEZPTExPV18xMTkgPSBuZXcgQml0U2V0KG5ldyBsb25nW117MHgwMDAwMDAwMDAwMDAwMDAyTCwweDAwMDAwMDAwMDAwMDg0MDBMfSk7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBCaXRTZXQgRk9MTE9XXzEyMCA9IG5ldyBCaXRTZXQobmV3IGxvbmdbXXsweDAwMDAwMDAwMDAwMDAwMDJMLDB4MDAwMDAwMDAwMDAwODAwMEx9KTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEJpdFNldCBGT0xMT1dfMTIxID0gbmV3IEJpdFNldChuZXcgbG9uZ1tdezB4MDAwMDAwMDAwMDAwMDAwMkwsMHgwMDAwMDAwMDAwNDA4NDAwTH0pOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgQml0U2V0IEZPTExPV18xMjIgPSBuZXcgQml0U2V0KG5ldyBsb25nW117MHgwMDAwMDAwMDAwMDAwMDAwTCwweDAwMDAwMDAwMDAwMDkwMDBMfSk7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBCaXRTZXQgRk9MTE9XXzEyMyA9IG5ldyBCaXRTZXQobmV3IGxvbmdbXXsweDAwMDA0MDAwMDAwMDgxRjJMLDB4Rjk4QTA4QzAwMDQwQzYzMkwsMHgwMDAwMDAwMDAwMDAwMDVGTH0pOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgQml0U2V0IEZPTExPV18xMjQgPSBuZXcgQml0U2V0KG5ldyBsb25nW117MHgwMDAwMDAwMDAwMDAwMDAwTCwweDAwMDAwMDAwMDAwMDAwMDBMLDB4MDAwMDAwMDAwMDAwMDBBMEx9KTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEJpdFNldCBGT0xMT1dfMTI1ID0gbmV3IEJpdFNldChuZXcgbG9uZ1tdezB4MDAwMDAwMDAwMDAwMDAwMkwsMHgwMDAwMDAwMDAwMDAwMDAwTCwweDAwMDAwMDAwMDAwMDAwQTBMfSk7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBCaXRTZXQgRk9MTE9XXzEyNiA9IG5ldyBCaXRTZXQobmV3IGxvbmdbXXsweDAwMDAwMDAwMDAwMDAxMjBMfSk7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBCaXRTZXQgRk9MTE9XXzEyNyA9IG5ldyBCaXRTZXQobmV3IGxvbmdbXXsweDAwMDAwMDAwMDAwMDAwNDBMLDB4MDAwMDAwMDgwMDAwMTQwMEx9KTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEJpdFNldCBGT0xMT1dfMTI4ID0gbmV3IEJpdFNldChuZXcgbG9uZ1tdezB4MDAwMDAwMDAwMDAwMDAwMEwsMHgwMDAwMDAwODAwMDAwMDAwTH0pOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgQml0U2V0IEZPTExPV18xMjkgPSBuZXcgQml0U2V0KG5ldyBsb25nW117MHgwMDAwMDAwMDAwMDAwMDAyTCwweDAwMDAwMDAwMDA0MDAwMDBMfSk7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBCaXRTZXQgRk9MTE9XXzEzMCA9IG5ldyBCaXRTZXQobmV3IGxvbmdbXXsweDAwMDAwMDAwMDAwMDAwMDJMLDB4MDAwMDAwMDAwMDQwMDAwOEx9KTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEJpdFNldCBGT0xMT1dfMTMxID0gbmV3IEJpdFNldChuZXcgbG9uZ1tdezB4MDAwMDAwMDAwMDAwMDAwMkwsMHgxODAwMDAwMDAwMDAwMDAwTH0pOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgQml0U2V0IEZPTExPV18xMzIgPSBuZXcgQml0U2V0KG5ldyBsb25nW117MHgwMDAwMDAwMDAwMDAwMDAyTCwweDAwMDAwMDAwMDAwMDAwMDBMLDB4MDAwMDAwMDAwMDAwMDIwMEx9KTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEJpdFNldCBGT0xMT1dfMTMzID0gbmV3IEJpdFNldChuZXcgbG9uZ1tdezB4MDAwMDAwMDAwMDAwMDAwMEwsMHgwMDAwMDAwMDAwMDAwMDA4TH0pOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgQml0U2V0IEZPTExPV18xMzQgPSBuZXcgQml0U2V0KG5ldyBsb25nW117MHgwMDAwMDAwMDAwMDAwMDAwTCwweDAwMDAwMDAwMDAwMDAwNDBMfSk7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBCaXRTZXQgRk9MTE9XXzEzNSA9IG5ldyBCaXRTZXQobmV3IGxvbmdbXXsweDAwMDAwMDAwMDAwMDAwMDJMLDB4MDAwMDAwMDAwMDAwMDAxMEx9KTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEJpdFNldCBGT0xMT1dfMTM2ID0gbmV3IEJpdFNldChuZXcgbG9uZ1tdezB4MDAwMDAwMDAwMDAwMDA0Mkx9KTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEJpdFNldCBGT0xMT1dfMTQgPSBuZXcgQml0U2V0KG5ldyBsb25nW117MHgwMDAwMDAwMDAwQzAwMDAwTH0pOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgQml0U2V0IEZPTExPV18xNSA9IG5ldyBCaXRTZXQobmV3IGxvbmdbXXsweDAwMDAwMDAwMDA4MDAwMDBMfSk7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBCaXRTZXQgRk9MTE9XXzE2ID0gbmV3IEJpdFNldChuZXcgbG9uZ1tdezB4MDAwMDAwMDQyMjAwMDAwMEx9KTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEJpdFNldCBGT0xMT1dfMTcgPSBuZXcgQml0U2V0KG5ldyBsb25nW117MHgwMDAwMDAwMDAxMDAwMDAwTH0pOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgQml0U2V0IEZPTExPV18xOCA9IG5ldyBCaXRTZXQobmV3IGxvbmdbXXsweDAwMDAwMDAwMDAwMDgwMDBMfSk7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBCaXRTZXQgRk9MTE9XXzE5ID0gbmV3IEJpdFNldChuZXcgbG9uZ1tdezB4MDAwMDAwMjAwMDAxMDAwMEx9KTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEJpdFNldCBGT0xMT1dfMjAgPSBuZXcgQml0U2V0KG5ldyBsb25nW117MHgwMDAwMDAwMDFDMDAwMDAyTH0pOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgQml0U2V0IEZPTExPV18yMSA9IG5ldyBCaXRTZXQobmV3IGxvbmdbXXsweDAwMDAwMDAzRDgwMDAwMDJMfSk7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBCaXRTZXQgRk9MTE9XXzIyID0gbmV3IEJpdFNldChuZXcgbG9uZ1tdezB4MDAwMDAwMDgxODAwMDAwMEx9KTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEJpdFNldCBGT0xMT1dfMjMgPSBuZXcgQml0U2V0KG5ldyBsb25nW117MHgwMDAwMDAxMDAwMDAwMDAyTH0pOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgQml0U2V0IEZPTExPV18yNCA9IG5ldyBCaXRTZXQobmV3IGxvbmdbXXsweDAwMDFGRkMwMDAwMDAwMDJMfSk7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBCaXRTZXQgRk9MTE9XXzI1ID0gbmV3IEJpdFNldChuZXcgbG9uZ1tdezB4MDAwMUZGODAwMDAwMDAwMkx9KTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEJpdFNldCBGT0xMT1dfMjYgPSBuZXcgQml0U2V0KG5ldyBsb25nW117MHgwMDAxRkYwMDAwMDAwMDAyTH0pOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgQml0U2V0IEZPTExPV18yNyA9IG5ldyBCaXRTZXQobmV3IGxvbmdbXXsweDAwMDFGRTAwMDAwMDAwMDJMfSk7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBCaXRTZXQgRk9MTE9XXzI4ID0gbmV3IEJpdFNldChuZXcgbG9uZ1tdezB4MDAwMUZDMDAwMDAwMDAwMkx9KTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEJpdFNldCBGT0xMT1dfMjkgPSBuZXcgQml0U2V0KG5ldyBsb25nW117MHgyMDAwMDAwMDAwMDEwMDAwTCwweDAwMDAwMDAwMDAwMDAwMDhMfSk7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBCaXRTZXQgRk9MTE9XXzMwID0gbmV3IEJpdFNldChuZXcgbG9uZ1tdezB4MDAwMUY4MDAwMDAwMDAwMkx9KTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEJpdFNldCBGT0xMT1dfMzEgPSBuZXcgQml0U2V0KG5ldyBsb25nW117MHgwMDA0MDAwMDAwMDEwMDAwTH0pOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgQml0U2V0IEZPTExPV18zMiA9IG5ldyBCaXRTZXQobmV3IGxvbmdbXXsweDAwMDFGMDAwMDAwMDAwMDJMfSk7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBCaXRTZXQgRk9MTE9XXzMzID0gbmV3IEJpdFNldChuZXcgbG9uZ1tdezB4MDAwMUUwMDAwMDAwMDAwMkx9KTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEJpdFNldCBGT0xMT1dfMzQgPSBuZXcgQml0U2V0KG5ldyBsb25nW117MHgwMDAwMDAwMDAwMDEwMDAwTCwweDAwMDAwMDAwMDAwMDAwMDFMfSk7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBCaXRTZXQgRk9MTE9XXzM1ID0gbmV3IEJpdFNldChuZXcgbG9uZ1tdezB4MDAwMUMwMDAwMDAwMDAwMkx9KTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEJpdFNldCBGT0xMT1dfMzYgPSBuZXcgQml0U2V0KG5ldyBsb25nW117MHgwMDAwMDAwMDAwMDEwMDAwTCwweDAwMDAwMDAwMDAwMDAwQTBMfSk7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBCaXRTZXQgRk9MTE9XXzM3ID0gbmV3IEJpdFNldChuZXcgbG9uZ1tdezB4MDAwMTgwMDAwMDAwMDAwMkx9KTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEJpdFNldCBGT0xMT1dfMzggPSBuZXcgQml0U2V0KG5ldyBsb25nW117MHgwMDAyMDAwMDAwMDEwMDAwTH0pOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgQml0U2V0IEZPTExPV18zOSA9IG5ldyBCaXRTZXQobmV3IGxvbmdbXXsweDAwMDEwMDAwMDAwMDAwMDJMfSk7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBCaXRTZXQgRk9MTE9XXzQwID0gbmV3IEJpdFNldChuZXcgbG9uZ1tdezB4MDAwMDAwMDAwMDAxMDAwMEwsMHgwMDAwMDAwMDAwMDAwMDA2TH0pOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgQml0U2V0IEZPTExPV180MSA9IG5ldyBCaXRTZXQobmV3IGxvbmdbXXsweDAwMDAwMDAwMDAwMTAwMDBMfSk7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBCaXRTZXQgRk9MTE9XXzQyID0gbmV3IEJpdFNldChuZXcgbG9uZ1tdezB4MDAwODAwMDAwMDAwMDAwMEx9KTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEJpdFNldCBGT0xMT1dfNDMgPSBuZXcgQml0U2V0KG5ldyBsb25nW117MHgwMDEwMDA4MDAwMDAwMDAwTH0pOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgQml0U2V0IEZPTExPV180NCA9IG5ldyBCaXRTZXQobmV3IGxvbmdbXXsweDAwMTAwMDAwMDAwMDAwMDBMfSk7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBCaXRTZXQgRk9MTE9XXzQ1ID0gbmV3IEJpdFNldChuZXcgbG9uZ1tdezB4MDNFMDAwMDAwMDAwMDAwMkx9KTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEJpdFNldCBGT0xMT1dfNDYgPSBuZXcgQml0U2V0KG5ldyBsb25nW117MHgwM0MwMDAwMDAwMDAwMDAyTH0pOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgQml0U2V0IEZPTExPV180NyA9IG5ldyBCaXRTZXQobmV3IGxvbmdbXXsweDAzODAwMDAwMDAwMDAwMDJMfSk7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBCaXRTZXQgRk9MTE9XXzQ4ID0gbmV3IEJpdFNldChuZXcgbG9uZ1tdezB4MDQwMDAwMDAwMDAxMDAwMEx9KTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEJpdFNldCBGT0xMT1dfNDkgPSBuZXcgQml0U2V0KG5ldyBsb25nW117MHgwODAwMDAwMDAwMDAwMDAyTH0pOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgQml0U2V0IEZPTExPV181MCA9IG5ldyBCaXRTZXQobmV3IGxvbmdbXXsweDEwMDAwMDAwMDAwMDAwMDBMfSk7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBCaXRTZXQgRk9MTE9XXzUxID0gbmV3IEJpdFNldChuZXcgbG9uZ1tdezB4NDAwMDAwMDAwMDAwMDAwMEx9KTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEJpdFNldCBGT0xMT1dfNTIgPSBuZXcgQml0U2V0KG5ldyBsb25nW117MHg4MDAwMDAwMDAwMDAwMDAwTH0pOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgQml0U2V0IEZPTExPV181MyA9IG5ldyBCaXRTZXQobmV3IGxvbmdbXXsweDAwMDgyMDAwMDAwMDAwMDBMfSk7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBCaXRTZXQgRk9MTE9XXzU0ID0gbmV3IEJpdFNldChuZXcgbG9uZ1tdezB4MDAwMDAwMDAwMDAwMDAwMEwsMHgwMDAwMDAwMDAwMDAwMDAxTH0pOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgQml0U2V0IEZPTExPV181NSA9IG5ldyBCaXRTZXQobmV3IGxvbmdbXXsweDAwMDAwMDAwMDAwMDAwMDJMLDB4MDAwMDAwMDAwMDAwMDAwNEx9KTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEJpdFNldCBGT0xMT1dfNTYgPSBuZXcgQml0U2V0KG5ldyBsb25nW117MHgwMDAwMDAwMDAwMDAwMDQyTH0pOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgQml0U2V0IEZPTExPV181NyA9IG5ldyBCaXRTZXQobmV3IGxvbmdbXXsweDAwMDAwMDAwMDAwMDAwMDBMLDB4MDAwMDAwMDhFMDEwMDAwMEwsMHgwMDAwMDAxQzAwMDAwMDAwTH0pOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgQml0U2V0IEZPTExPV181OCA9IG5ldyBCaXRTZXQobmV3IGxvbmdbXXsweDAwMDAwMDAwMDAwMDAwMTJMLDB4MDAwMDAwMDAwMDAwMDAwMEwsMHgwMDAwMDA2MDAwMDAwMDAwTH0pOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgQml0U2V0IEZPTExPV181OSA9IG5ldyBCaXRTZXQobmV3IGxvbmdbXXsweDAwMDAwMDAwMDAwMDAwMDJMLDB4MDAwMDAwMDAwMDAwMDAwMEwsMHgwMDAwMDA2MDAwMDAwMDAwTH0pOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgQml0U2V0IEZPTExPV182MCA9IG5ldyBCaXRTZXQobmV3IGxvbmdbXXsweDAwMDAwMDAwMDAwMDAwMDBMLDB4MDAwMDAwMDAwMDAwMDAwMEwsMHgwMDAwMDAwMDAzODAwMDAwTH0pOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgQml0U2V0IEZPTExPV182MSA9IG5ldyBCaXRTZXQobmV3IGxvbmdbXXsweDAwMDAwMDAwMDAwMDAwMDBMLDB4MDAwMDAwMDAwMDAwMDAxMEx9KTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEJpdFNldCBGT0xMT1dfNjIgPSBuZXcgQml0U2V0KG5ldyBsb25nW117MHgwMDAwMDAwMDAwMDAwMDAwTCwweDAwMDAwMDAwMDAwMDAwMDBMLDB4MDAwMDAwMDA3QzAwMDAwMEx9KTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEJpdFNldCBGT0xMT1dfNjMgPSBuZXcgQml0U2V0KG5ldyBsb25nW117MHgwMDAwMDAwMDAwMDAwMDAwTCwweDAwMDAwMDAwMDAwMDAwNDBMfSk7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBCaXRTZXQgRk9MTE9XXzY0ID0gbmV3IEJpdFNldChuZXcgbG9uZ1tdezB4MDAwMDAwMDAwMTAwMDAwMEwsMHgwMDAwMDAwMDAwMDAwMzAwTH0pOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgQml0U2V0IEZPTExPV182NSA9IG5ldyBCaXRTZXQobmV3IGxvbmdbXXsweDAwMDAwMDAwMDEwMDAwMDBMLDB4MDAwMDAwMDAwMDAwMDIwMEx9KTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEJpdFNldCBGT0xMT1dfNjYgPSBuZXcgQml0U2V0KG5ldyBsb25nW117MHgwMDAwMDAwMDAwMDAwMDAwTCwweDAwMDAwMDAwMDAwMDAyMDBMfSk7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBCaXRTZXQgRk9MTE9XXzY3ID0gbmV3IEJpdFNldChuZXcgbG9uZ1tdezB4MDAwMDAwMDAwMDAwMDAwMEwsMHgwMDAwMDAwMDAwMDAwMDAwTCwweDAwMDAwMDAwMDA3RTAwMDBMfSk7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBCaXRTZXQgRk9MTE9XXzY4ID0gbmV3IEJpdFNldChuZXcgbG9uZ1tdezB4MDAwMDAwMDAwMDAwMDAwMkwsMHgwMDAwMDAwMDAwMDAwNDAwTH0pOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgQml0U2V0IEZPTExPV182OSA9IG5ldyBCaXRTZXQobmV3IGxvbmdbXXsweDAwMDAwMDAwMDAwMDAwNDBMLDB4MDAwMDAwMDAwMDAwNTAwMEx9KTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEJpdFNldCBGT0xMT1dfNzAgPSBuZXcgQml0U2V0KG5ldyBsb25nW117MHgwMDAwMDAwMDAwMDAwMDQwTCwweDAwMDAwMDAwMDAwMDAxMDBMfSk7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBCaXRTZXQgRk9MTE9XXzcxID0gbmV3IEJpdFNldChuZXcgbG9uZ1tdezB4MDAwMDAwMDAwMDAwMDA0MEwsMHgwMDAwMDAwMDAwMDAyMDAwTH0pOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgQml0U2V0IEZPTExPV183MiA9IG5ldyBCaXRTZXQobmV3IGxvbmdbXXsweDAwMDAwMDAwMDAwMDAwMDJMLDB4MDAwMDAwMDAwMDAwODAwMEx9KTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEJpdFNldCBGT0xMT1dfNzMgPSBuZXcgQml0U2V0KG5ldyBsb25nW117MHgwMDAwMDAwMDAwMDAwMDAyTCwweDAwMDAwMDAwMDAwMjAwMDBMfSk7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBCaXRTZXQgRk9MTE9XXzc0ID0gbmV3IEJpdFNldChuZXcgbG9uZ1tdezB4MDAwNDAwMDAwMDAwODFGMEwsMHhDNTA0NjAwMDIwNkIxOTAwTCwweDAwMDAwMDAwMDAwMDJGRkNMfSk7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBCaXRTZXQgRk9MTE9XXzc1ID0gbmV3IEJpdFNldChuZXcgbG9uZ1tdezB4MDAwMDAwMDAwMDAwMDAwMEwsMHgwMDAwMDAwMDAwMEMwMDAwTH0pOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgQml0U2V0IEZPTExPV183NiA9IG5ldyBCaXRTZXQobmV3IGxvbmdbXXsweDAwMDAwMDAwMDAwMDAwMDBMLDB4MDAwMDAwMDAwMDA4MDAwMEx9KTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEJpdFNldCBGT0xMT1dfNzcgPSBuZXcgQml0U2V0KG5ldyBsb25nW117MHgwMDAwMDAwMDAwMDAwMDAwTCwweDAwMDAwMDAwMDAxMDAwMDBMfSk7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBCaXRTZXQgRk9MTE9XXzc4ID0gbmV3IEJpdFNldChuZXcgbG9uZ1tdezB4MDAwNDAwMDAwMDAwODFGMEwsMHhDNTA0NjAwMDIwNjMxOTAwTCwweDAwMDAwMDAwMDAwMDJGRkNMfSk7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBCaXRTZXQgRk9MTE9XXzc5ID0gbmV3IEJpdFNldChuZXcgbG9uZ1tdezB4MDAwMDAwMDAwMDAwMDAwMEwsMHgwMDAwMDAwMDAwNDAwMDAwTH0pOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgQml0U2V0IEZPTExPV184MCA9IG5ldyBCaXRTZXQobmV3IGxvbmdbXXsweDAwMDQwMDAwMDAwMDgxRjBMLDB4QzUwNDYwMDAyMEUzMTkwMEwsMHgwMDAwMDAwMDAwMDAyRkZDTH0pOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgQml0U2V0IEZPTExPV184MSA9IG5ldyBCaXRTZXQobmV3IGxvbmdbXXsweDAwMDAwMDAwMDAwMDAwMDBMLDB4MDAwMDAwMDAwMDg0MDAwMEx9KTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEJpdFNldCBGT0xMT1dfODIgPSBuZXcgQml0U2V0KG5ldyBsb25nW117MHgwMDAwMDAwMDAwMDAwMDAyTCwweDAwMDAwMDAwMDAwNDAwMDBMfSk7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBCaXRTZXQgRk9MTE9XXzgzID0gbmV3IEJpdFNldChuZXcgbG9uZ1tdezB4MDAwMDAwMDAwMDAwMDAwMkwsMHgwMDAwMDAwMDdGMDAwMDAwTH0pOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgQml0U2V0IEZPTExPV184NCA9IG5ldyBCaXRTZXQobmV3IGxvbmdbXXsweDAwMDAwMDAwMDAwMDAwMDBMLDB4MDAwMDAwMDAyMDAwMDAwMEx9KTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEJpdFNldCBGT0xMT1dfODUgPSBuZXcgQml0U2V0KG5ldyBsb25nW117MHgwMDAwMDAwMDAwMDAwMDAwTCwweDAwMDAwMDAwQzAwMDAwMDBMfSk7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBCaXRTZXQgRk9MTE9XXzg2ID0gbmV3IEJpdFNldChuZXcgbG9uZ1tdezB4MDAwMDAwMDAwMDAwMDAwMEwsMHgwMDAwMDAwMDgwMDAwMDAwTH0pOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgQml0U2V0IEZPTExPV184NyA9IG5ldyBCaXRTZXQobmV3IGxvbmdbXXsweDAwMDAwMDAwMDAwMDAwMDJMLDB4MDAwMDAwMDEwMDAwMDAwMEx9KTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEJpdFNldCBGT0xMT1dfODggPSBuZXcgQml0U2V0KG5ldyBsb25nW117MHgwMDAwMDAwMDAwMDAwMDAyTCwweDAwMDAwMDAyMDAwMDAwMDBMfSk7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBCaXRTZXQgRk9MTE9XXzg5ID0gbmV3IEJpdFNldChuZXcgbG9uZ1tdezB4MDAwMDAwMDAwMDAwMDAwMkwsMHgwMDAwMDAzQzAwMDAwMDAwTH0pOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgQml0U2V0IEZPTExPV185MCA9IG5ldyBCaXRTZXQobmV3IGxvbmdbXXsweDAwMDAwMDAwMDAwMDAwMDJMLDB4MDAwMDAwNDBFMDAwMDAwMEx9KTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEJpdFNldCBGT0xMT1dfOTEgPSBuZXcgQml0U2V0KG5ldyBsb25nW117MHgwMDAwMDAwMDAwMDAwMDQwTCwweDAwMDAwNDAwMDAwMjAwMDBMfSk7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBCaXRTZXQgRk9MTE9XXzkyID0gbmV3IEJpdFNldChuZXcgbG9uZ1tdezB4MDAwMDAwMDAwMDAwMDAwMkwsMHgwMDAwMUY4MDYwMDAwMDAwTH0pOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgQml0U2V0IEZPTExPV185MyA9IG5ldyBCaXRTZXQobmV3IGxvbmdbXXsweDAwMDAwMDAwMDAwMDAwMDBMLDB4MDAwMDAyMDAwMDAwMDAwMEx9KTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEJpdFNldCBGT0xMT1dfOTQgPSBuZXcgQml0U2V0KG5ldyBsb25nW117MHgwMDAwMDAwMDAwMDAwMDAwTCwweDAwMDAwMDAwNDAwMDAwMDBMfSk7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBCaXRTZXQgRk9MTE9XXzk1ID0gbmV3IEJpdFNldChuZXcgbG9uZ1tdezB4MDAwMDAwMDAwMDAwMDAwMEwsMHgwMDAwMDQwMDIwMDAwMDAwTH0pOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgQml0U2V0IEZPTExPV185NiA9IG5ldyBCaXRTZXQobmV3IGxvbmdbXXsweDAwMDAwMDAwMDAwMDAwMDJMLDB4MDAwMDYwMDAwMDAwMDAwMEx9KTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEJpdFNldCBGT0xMT1dfOTcgPSBuZXcgQml0U2V0KG5ldyBsb25nW117MHgwMDAwMDAwMDAwMDAwMDAyTCwweDAwMDM4MDAwMDAwMDIwMDBMfSk7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBCaXRTZXQgRk9MTE9XXzk4ID0gbmV3IEJpdFNldChuZXcgbG9uZ1tdezB4MDAwMDAwMDAwMDAwMDAwMkwsMHgwMDAwMDAwMDAwMDAwMDEwTH0pOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgQml0U2V0IEZPTExPV185OSA9IG5ldyBCaXRTZXQobmV3IGxvbmdbXXsweDAwMDAwMDAwMDAwMDAwMDJMLDB4MDAxODAwMDAwMDAwMDAwMEx9KTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEJpdFNldCBGT0xMT1dfMTAwID0gbmV3IEJpdFNldChuZXcgbG9uZ1tdezB4MDAwMDAwMDAwMDAwMDAwMkwsMHgwMDYwMDAwMDAwMDAwNDAwTH0pOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgQml0U2V0IEZPTExPV18xMDEgPSBuZXcgQml0U2V0KG5ldyBsb25nW117MHgwMDAwMDAwMDAwMDAwMDQwTCwweDAwMDAwMDAwMDAwMDE5MDBMLDB4MDAwMDAwMDAwMDAwMDAwNEx9KTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEJpdFNldCBGT0xMT1dfMTAyID0gbmV3IEJpdFNldChuZXcgbG9uZ1tdezB4MDAwMDAwMDAwMDAwMDA0MEwsMHgwMDAwMDAwMDIwMDAxOTAwTCwweDAwMDAwMDAwMDAwMDAwMENMfSk7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBCaXRTZXQgRk9MTE9XXzEwMyA9IG5ldyBCaXRTZXQobmV3IGxvbmdbXXsweDAwMDAwMDAwMDAwMDAwNDBMLDB4MDAwMDA0MDAwMDAyMDAwMEwsMHgwMDAwMDAwMDAwMDA4MDAwTH0pOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgQml0U2V0IEZPTExPV18xMDQgPSBuZXcgQml0U2V0KG5ldyBsb25nW117MHgwMDAwMDAwMDAwMDAwMDAwTCwweDAwMDAwMDAwNDAwNDAwMDBMfSk7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBCaXRTZXQgRk9MTE9XXzEwNSA9IG5ldyBCaXRTZXQobmV3IGxvbmdbXXsweDAwMDAwMDAwMDAwMDAwMDJMLDB4MDA2MDAwMDAwMDQyMDQwMEx9KTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEJpdFNldCBGT0xMT1dfMTA2ID0gbmV3IEJpdFNldChuZXcgbG9uZ1tdezB4MDAwNDAwMDAwMDAwODFGMEwsMHhDNTg0NjQwMDIwNkIxOTAwTCwweDAwMDAwMDAwMDAwMDJGRkNMfSk7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBCaXRTZXQgRk9MTE9XXzEwNyA9IG5ldyBCaXRTZXQobmV3IGxvbmdbXXsweDAwMDAwMDAwMDAwMDAwMDJMLDB4MDA2MDAwMDAwMDQwMDQwMEx9KTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEJpdFNldCBGT0xMT1dfMTA4ID0gbmV3IEJpdFNldChuZXcgbG9uZ1tdezB4MDAwNDAwMDAwMDAxODFGMEwsMHhDNTA0NjAwMDIwNjMxOTAwTCwweDAwMDAwMDAwMDAwMDJGRkNMfSk7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBCaXRTZXQgRk9MTE9XXzEwOSA9IG5ldyBCaXRTZXQobmV3IGxvbmdbXXsweDAwMDAwMDAwMDAwMTAwMDBMLDB4MDAwMDAwMDAwMDA0MDAwMEx9KTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEJpdFNldCBGT0xMT1dfMTEwID0gbmV3IEJpdFNldChuZXcgbG9uZ1tdezB4MDAwNDAwMDAwMDAwODFGMEwsMHhDNTg0NjQwMDIwRTMxOTAwTCwweDAwMDAwMDAwMDAwMDJGRkZMfSk7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBCaXRTZXQgRk9MTE9XXzExMSA9IG5ldyBCaXRTZXQobmV3IGxvbmdbXXsweDAwMDAwMDAwMDAwMDAwMDBMLDB4MDA4MDAwMDAwMDA0MDAwMEx9KTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEJpdFNldCBGT0xMT1dfMTEyID0gbmV3IEJpdFNldChuZXcgbG9uZ1tdezB4MDAwNDAwMDAwMDAwODFGMEwsMHhDNTA0NjAwMDIwRTMxOTAwTCwweDAwMDAwMDAwMDAwMDJGRkZMfSk7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBCaXRTZXQgRk9MTE9XXzExMyA9IG5ldyBCaXRTZXQobmV3IGxvbmdbXXsweDAwMDAwMDAwMDAwMDAwMDBMLDB4MDAwMDAwMDAwMDgwMDAwMEx9KTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEJpdFNldCBGT0xMT1dfMTE0ID0gbmV3IEJpdFNldChuZXcgbG9uZ1tdezB4MDAwNDAwMDAwMDAwODFGMkwsMHhDNTA0NjAwMDIwNjM5OTAwTCwweDAwMDAwMDAwMDAwMDJGRkZMfSk7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBCaXRTZXQgRk9MTE9XXzExNSA9IG5ldyBCaXRTZXQobmV3IGxvbmdbXXsweDAwMDQwMDAwMDAwMDgxRjJMLDB4QzUwNDYwMDAyMDYzMTkwMEwsMHgwMDAwMDAwMDAwMDAyRkZGTH0pOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgQml0U2V0IEZPTExPV18xMTYgPSBuZXcgQml0U2V0KG5ldyBsb25nW117MHgwMDAwMDAwMDAwMDAwMDAwTCwweDAwMDAwMDAwMDAwMjAwMDBMfSk7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBCaXRTZXQgRk9MTE9XXzExNyA9IG5ldyBCaXRTZXQobmV3IGxvbmdbXXsweDAwMDAwMDAwMDAwMDAwMDJMLDB4MDIwMDAwMDAwMDAwMDAwMEx9KTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEJpdFNldCBGT0xMT1dfMTE4ID0gbmV3IEJpdFNldChuZXcgbG9uZ1tdezB4MDAwNDAwMDAwMDAwODFGMEwsMHhDNTA0NjQwMDIwNjMxOTAwTCwweDAwMDAwMDAwMDAwMDJGRkNMfSk7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBCaXRTZXQgRk9MTE9XXzExOSA9IG5ldyBCaXRTZXQobmV3IGxvbmdbXXsweDAwMDAwMDAwMDAwMDAwMDBMLDB4MDgwMDAwMDAwMDAwMDAwMEx9KTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEJpdFNldCBGT0xMT1dfMTIwID0gbmV3IEJpdFNldChuZXcgbG9uZ1tdezB4MDAwMDAwMDAwMDAxMDA0MEwsMHgzODAwMDQwMDAwMDYwMDAwTH0pOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgQml0U2V0IEZPTExPV18xMjEgPSBuZXcgQml0U2V0KG5ldyBsb25nW117MHgwMDAwMDAwMDAwMDAwMDAwTCwweDI4MDAwMDAwMDAwNDAwMDBMfSk7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBCaXRTZXQgRk9MTE9XXzEyMiA9IG5ldyBCaXRTZXQobmV3IGxvbmdbXXsweDAwMDAwMDAwMDAwMDAwMDBMLDB4MDgwMDAwMDAwMDA0MDAwMEx9KTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEJpdFNldCBGT0xMT1dfMTIzID0gbmV3IEJpdFNldChuZXcgbG9uZ1tdezB4MDAwNDAwMDAwMDAwODFGMEwsMHhDNTA0NjAwMDIwNjM5OTAwTCwweDAwMDAwMDAwMDAwMDJGRkZMfSk7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBCaXRTZXQgRk9MTE9XXzEyNCA9IG5ldyBCaXRTZXQobmV3IGxvbmdbXXsweDAwMDAwMDAwMDAwMDAwMDBMLDB4MDAwMDAwMDAwMDA0ODAwMEx9KTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEJpdFNldCBGT0xMT1dfMTI1ID0gbmV3IEJpdFNldChuZXcgbG9uZ1tdezB4MDAwNDAwMDAwMDAwODFGMEwsMHhDNTA0NjAwMDIwNjMxOTAwTCwweDAwMDAwMDAwMDAwMDJGRkZMfSk7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBCaXRTZXQgRk9MTE9XXzEyNiA9IG5ldyBCaXRTZXQobmV3IGxvbmdbXXsweDAwMDQwMDAwMDAwMDgxRjBMLDB4QzUwNDYwMDAyMDYzOTkwMEwsMHgwMDAwMDAwMDAwMDAyRkZDTH0pOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgQml0U2V0IEZPTExPV18xMjcgPSBuZXcgQml0U2V0KG5ldyBsb25nW117MHgwMDAwMDAwMDAwMDAwMDAwTCwweDAwMDAwMDAwMDAwMDgwMDBMfSk7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBCaXRTZXQgRk9MTE9XXzEyOCA9IG5ldyBCaXRTZXQobmV3IGxvbmdbXXsweDAwMDAwMDAwMDAwMDAwMDBMLDB4NDAwMDAwMDAwMDAwMDAwMEx9KTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEJpdFNldCBGT0xMT1dfMTI5ID0gbmV3IEJpdFNldChuZXcgbG9uZ1tdezB4MDAwNDAwMDAwMDAxODFGMEwsMHhDNTA0NjAwMDIwNjMxOTAwTCwweDAwMDAwMDAwMDAwMDJGRkZMfSk7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBCaXRTZXQgRk9MTE9XXzEzMCA9IG5ldyBCaXRTZXQobmV3IGxvbmdbXXsweDAwMDQwMDAwMDAwMTgxRjBMLDB4QzUwNDYwMDAyMDYzOTkwMEwsMHgwMDAwMDAwMDAwMDAyRkZGTH0pOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgQml0U2V0IEZPTExPV18xMzEgPSBuZXcgQml0U2V0KG5ldyBsb25nW117MHgwMDAwMDAwMDAwMDAwMDAyTCwweDAwMDAwMDAwMDAxMDAwMDBMfSk7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBCaXRTZXQgRk9MTE9XXzEzMiA9IG5ldyBCaXRTZXQobmV3IGxvbmdbXXsweDAwMDAwMDAwMDAwMDAwMDJMLDB4MDAwMDAwMDAwMDQyMDAwMEx9KTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEJpdFNldCBGT0xMT1dfMTMzID0gbmV3IEJpdFNldChuZXcgbG9uZ1tdezB4MDAwMDAwMDAwMDAwMDAwMkwsMHgwMDAwMDAwMDAwNDAwMDAwTH0pOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgQml0U2V0IEZPTExPV18xMzQgPSBuZXcgQml0U2V0KG5ldyBsb25nW117MHgwMDAwMDAwMDAwMDAwMDAyTCwweDAwMDAwMDAwMjA0MjAwMDBMfSk7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBCaXRTZXQgRk9MTE9XXzEzNSA9IG5ldyBCaXRTZXQobmV3IGxvbmdbXXsweDAwMDAwMDAwMDAwMDAwMDBMLDB4MDAwMDAwMDAwMDQ4MDAwMEx9KTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEJpdFNldCBGT0xMT1dfMTM2ID0gbmV3IEJpdFNldChuZXcgbG9uZ1tdezB4MDAwNDAwMDAwMDAwODFGMkwsMHhDNTA0NjAwMDIwNjMxOTAwTCwweDAwMDAwMDAwMDAwMDJGRkNMfSk7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBCaXRTZXQgRk9MTE9XXzEzNyA9IG5ldyBCaXRTZXQobmV3IGxvbmdbXXsweDAwMDAwMDAwMDAwMDAwMDBMLDB4MDAwMDAwMDAwMDAwMDAwMEwsMHgwMDAwMDAwMDAwMDA1MDAwTH0pOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgQml0U2V0IEZPTExPV18xMzggPSBuZXcgQml0U2V0KG5ldyBsb25nW117MHgwMDAwMDAwMDAwMDAwMDAyTCwweDAwMDAwMDAwMDAwMDAwMDBMLDB4MDAwMDAwMDAwMDAwNTAwMEx9KTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEJpdFNldCBGT0xMT1dfMTM5ID0gbmV3IEJpdFNldChuZXcgbG9uZ1tdezB4MDAwMDAwMDAwMDAwMDEyMEx9KTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEJpdFNldCBGT0xMT1dfMTQwID0gbmV3IEJpdFNldChuZXcgbG9uZ1tdezB4MDAwMDAwMDAwMDAwMDA0MEwsMHgwMDAwMDQwMDAwMEEwMDAwTH0pOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgQml0U2V0IEZPTExPV18xNDEgPSBuZXcgQml0U2V0KG5ldyBsb25nW117MHgwMDAwMDAwMDAwMDAwMDAwTCwweDAwMDAwNDAwMDAwMDAwMDBMfSk7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBCaXRTZXQgRk9MTE9XXzE0MiA9IG5ldyBCaXRTZXQobmV3IGxvbmdbXXsweDAwMDAwMDAwMDAwMDAwMDJMLDB4MDAwMDAwMDAyMDAwMDAwMEx9KTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEJpdFNldCBGT0xMT1dfMTQzID0gbmV3IEJpdFNldChuZXcgbG9uZ1tdezB4MDAwMDAwMDAwMDAwMDAwMkwsMHgwMDAwMDAwMDIwMDAwNDAwTH0pOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgQml0U2V0IEZPTExPV18xNDQgPSBuZXcgQml0U2V0KG5ldyBsb25nW117MHgwMDAwMDAwMDAwMDAwMDAyTCwweDAwMDAwMDAwMDAwMDAwMDBMLDB4MDAwMDAwMDAwMDAwMDAwQ0x9KTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEJpdFNldCBGT0xMT1dfMTQ1ID0gbmV3IEJpdFNldChuZXcgbG9uZ1tdezB4MDAwMDAwMDAwMDAwMDAwMkwsMHgwMDAwMDAwMDAwMDAwMDAwTCwweDAwMDAwMDAwMDAwMTAwMDBMfSk7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBCaXRTZXQgRk9MTE9XXzE0NiA9IG5ldyBCaXRTZXQobmV3IGxvbmdbXXsweDAwMDAwMDAwMDAwMDAwMDBMLDB4MDAwMDAwMDAwMDAwMDQwMEx9KTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEJpdFNldCBGT0xMT1dfMTQ3ID0gbmV3IEJpdFNldChuZXcgbG9uZ1tdezB4MDAwMDAwMDAwMDAwMDAwMEwsMHgwMDAwMDAwMDAwMDAyMDAwTH0pOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgQml0U2V0IEZPTExPV18xNDggPSBuZXcgQml0U2V0KG5ldyBsb25nW117MHgwMDAwMDAwMDAwMDAwMDAyTCwweDAwMDAwMDAwMDAwMDA4MDBMfSk7CiAKIH0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLm9zYnAueHRleHQuZGF0YWludGVyY2hhbmdlL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9kYXRhaW50ZXJjaGFuZ2Uvc2NvcGluZy9BYnN0cmFjdERhdGFEU0xTY29wZVByb3ZpZGVyLmphdmEgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmRhdGFpbnRlcmNoYW5nZS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvZGF0YWludGVyY2hhbmdlL3Njb3BpbmcvQWJzdHJhY3REYXRhRFNMU2NvcGVQcm92aWRlci5qYXZhCmluZGV4IGZlN2M2MDIuLjQzMTRhNjYgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLm9zYnAueHRleHQuZGF0YWludGVyY2hhbmdlL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9kYXRhaW50ZXJjaGFuZ2Uvc2NvcGluZy9BYnN0cmFjdERhdGFEU0xTY29wZVByb3ZpZGVyLmphdmEKKysrIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5kYXRhaW50ZXJjaGFuZ2Uvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2RhdGFpbnRlcmNoYW5nZS9zY29waW5nL0Fic3RyYWN0RGF0YURTTFNjb3BlUHJvdmlkZXIuamF2YQpAQCAtMyw5ICszLDExIEBACiAgKiAgQ29weXJpZ2h0IChjKSAyMDExLCAyMDE2IC0gTG9ldHogR21iSCZDby5LRyAoNjkxMTUgSGVpZGVsYmVyZywgR2VybWFueSkgCiAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAqICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzICAgICAgICAgICAKLSAqICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgICAgICAgCisgKiAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSAyLjAgICAgICAgIAogICogIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0ICAgICAgICAgICAgICAgICAgCi0gKiAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAqICBodHRwczovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAqICBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgKiAgQ29udHJpYnV0b3JzOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICogCSAgIENocmlzdG9waGUgTG9ldHogKExvZXR6IEdtYkgmQ28uS0cpIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5kYXRhaW50ZXJjaGFuZ2Uvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2RhdGFpbnRlcmNoYW5nZS9zZXJpYWxpemVyL0RhdGFEU0xTZW1hbnRpY1NlcXVlbmNlci5qYXZhIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5kYXRhaW50ZXJjaGFuZ2Uvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2RhdGFpbnRlcmNoYW5nZS9zZXJpYWxpemVyL0RhdGFEU0xTZW1hbnRpY1NlcXVlbmNlci5qYXZhCmluZGV4IDFkYTMyZTIuLmNjYTBkYTggMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLm9zYnAueHRleHQuZGF0YWludGVyY2hhbmdlL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9kYXRhaW50ZXJjaGFuZ2Uvc2VyaWFsaXplci9EYXRhRFNMU2VtYW50aWNTZXF1ZW5jZXIuamF2YQorKysgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmRhdGFpbnRlcmNoYW5nZS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvZGF0YWludGVyY2hhbmdlL3NlcmlhbGl6ZXIvRGF0YURTTFNlbWFudGljU2VxdWVuY2VyLmphdmEKQEAgLTMsOSArMywxMSBAQAogICogIENvcHlyaWdodCAoYykgMjAxMSwgMjAxNiAtIExvZXR6IEdtYkgmQ28uS0cgKDY5MTE1IEhlaWRlbGJlcmcsIEdlcm1hbnkpIAogICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgKiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAgICAgICAgICAgCi0gKiAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wICAgICAgIAorICogIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgMi4wICAgICAgICAKICAqICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAgICAgICAgICAgICAgICAgIAotICogIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKiAgaHR0cHM6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKiAgU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICogIENvbnRyaWJ1dG9yczogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAqIAkgICBDaHJpc3RvcGhlIExvZXR6IChMb2V0eiBHbWJIJkNvLktHKSAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KQEAgLTI1LDkgKzI3LDEzIEBACiBpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5kYXRhaW50ZXJjaGFuZ2UuRGF0YUludGVyY2hhbmdlQmVhbjsKIGltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmRhdGFpbnRlcmNoYW5nZS5EYXRhSW50ZXJjaGFuZ2VCbG9iTWFwcGluZzsKIGltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmRhdGFpbnRlcmNoYW5nZS5EYXRhSW50ZXJjaGFuZ2VFbnRpdHlFeHByZXNzaW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAueHRleHQuZGF0YWludGVyY2hhbmdlLkRhdGFJbnRlcmNoYW5nZUV4cG9ydEZpbHRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmRhdGFpbnRlcmNoYW5nZS5EYXRhSW50ZXJjaGFuZ2VFeHBvcnRIaWRlOworaW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAueHRleHQuZGF0YWludGVyY2hhbmdlLkRhdGFJbnRlcmNoYW5nZUV4cG9zZTsKIGltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmRhdGFpbnRlcmNoYW5nZS5EYXRhSW50ZXJjaGFuZ2VGaWxlQ1NWOwogaW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAueHRleHQuZGF0YWludGVyY2hhbmdlLkRhdGFJbnRlcmNoYW5nZUZpbGVFREk7CiBpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5kYXRhaW50ZXJjaGFuZ2UuRGF0YUludGVyY2hhbmdlRmlsZVhNTDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmRhdGFpbnRlcmNoYW5nZS5EYXRhSW50ZXJjaGFuZ2VGaWx0ZXJDb25kaXRpb247CiBpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5kYXRhaW50ZXJjaGFuZ2UuRGF0YUludGVyY2hhbmdlRm9ybWF0OwogaW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAueHRleHQuZGF0YWludGVyY2hhbmdlLkRhdGFJbnRlcmNoYW5nZUtleTsKIGltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmRhdGFpbnRlcmNoYW5nZS5EYXRhSW50ZXJjaGFuZ2VMb29rdXA7CkBAIC0xMjEsNiArMTI3LDE1IEBACiAJCQljYXNlIERhdGFEU0xQYWNrYWdlLkRBVEFfSU5URVJDSEFOR0VfRU5USVRZX0VYUFJFU1NJT046CiAJCQkJc2VxdWVuY2VfRGF0YUludGVyY2hhbmdlRW50aXR5RXhwcmVzc2lvbihjb250ZXh0LCAoRGF0YUludGVyY2hhbmdlRW50aXR5RXhwcmVzc2lvbikgc2VtYW50aWNPYmplY3QpOyAKIAkJCQlyZXR1cm47IAorCQkJY2FzZSBEYXRhRFNMUGFja2FnZS5EQVRBX0lOVEVSQ0hBTkdFX0VYUE9SVF9GSUxURVI6CisJCQkJc2VxdWVuY2VfRGF0YUludGVyY2hhbmdlRXhwb3J0RmlsdGVyKGNvbnRleHQsIChEYXRhSW50ZXJjaGFuZ2VFeHBvcnRGaWx0ZXIpIHNlbWFudGljT2JqZWN0KTsgCisJCQkJcmV0dXJuOyAKKwkJCWNhc2UgRGF0YURTTFBhY2thZ2UuREFUQV9JTlRFUkNIQU5HRV9FWFBPUlRfSElERToKKwkJCQlzZXF1ZW5jZV9EYXRhSW50ZXJjaGFuZ2VFeHBvcnRIaWRlKGNvbnRleHQsIChEYXRhSW50ZXJjaGFuZ2VFeHBvcnRIaWRlKSBzZW1hbnRpY09iamVjdCk7IAorCQkJCXJldHVybjsgCisJCQljYXNlIERhdGFEU0xQYWNrYWdlLkRBVEFfSU5URVJDSEFOR0VfRVhQT1NFOgorCQkJCXNlcXVlbmNlX0RhdGFJbnRlcmNoYW5nZUV4cG9zZShjb250ZXh0LCAoRGF0YUludGVyY2hhbmdlRXhwb3NlKSBzZW1hbnRpY09iamVjdCk7IAorCQkJCXJldHVybjsgCiAJCQljYXNlIERhdGFEU0xQYWNrYWdlLkRBVEFfSU5URVJDSEFOR0VfRklMRV9DU1Y6CiAJCQkJc2VxdWVuY2VfRGF0YUludGVyY2hhbmdlRmlsZUNTVihjb250ZXh0LCAoRGF0YUludGVyY2hhbmdlRmlsZUNTVikgc2VtYW50aWNPYmplY3QpOyAKIAkJCQlyZXR1cm47IApAQCAtMTMwLDYgKzE0NSw5IEBACiAJCQljYXNlIERhdGFEU0xQYWNrYWdlLkRBVEFfSU5URVJDSEFOR0VfRklMRV9YTUw6CiAJCQkJc2VxdWVuY2VfRGF0YUludGVyY2hhbmdlRmlsZVhNTChjb250ZXh0LCAoRGF0YUludGVyY2hhbmdlRmlsZVhNTCkgc2VtYW50aWNPYmplY3QpOyAKIAkJCQlyZXR1cm47IAorCQkJY2FzZSBEYXRhRFNMUGFja2FnZS5EQVRBX0lOVEVSQ0hBTkdFX0ZJTFRFUl9DT05ESVRJT046CisJCQkJc2VxdWVuY2VfRGF0YUludGVyY2hhbmdlRmlsdGVyQ29uZGl0aW9uKGNvbnRleHQsIChEYXRhSW50ZXJjaGFuZ2VGaWx0ZXJDb25kaXRpb24pIHNlbWFudGljT2JqZWN0KTsgCisJCQkJcmV0dXJuOyAKIAkJCWNhc2UgRGF0YURTTFBhY2thZ2UuREFUQV9JTlRFUkNIQU5HRV9GT1JNQVQ6CiAJCQkJc2VxdWVuY2VfRGF0YUludGVyY2hhbmdlRm9ybWF0KGNvbnRleHQsIChEYXRhSW50ZXJjaGFuZ2VGb3JtYXQpIHNlbWFudGljT2JqZWN0KTsgCiAJCQkJcmV0dXJuOyAKQEAgLTQ3NCwxMiArNDkyLDE1IEBACiAJICogICAgICAgICBlbnRpdHk9W0xFbnRpdHl8TEZRTl0gCiAJICogICAgICAgICBub2RlTmFtZT1TVFJJTkc/IAogCSAqICAgICAgICAgZWxlbWVudE1hcD1TVFJJTkc/IAotCSAqICAgICAgICAgKG1hcmtMYXRlc3Q/PSdtYXJrZXInIGxhdGVzdFByb3BlcnR5PVtMRW50aXR5QXR0cmlidXRlfElEXSk/IAorCSAqICAgICAgICAgKG1hcmtMYXRlc3RJbXBvcnQ/PSdsYXRlc3RJbXBvcnQnIGxhdGVzdFByb3BlcnR5PVtMRW50aXR5QXR0cmlidXRlfElEXSk/IAorCSAqICAgICAgICAgKG1hcmtMYXRlc3RFeHBvcnQ/PSdsYXRlc3RFeHBvcnQnIGxhdGVzdEV4cFByb3BlcnR5PVtMRW50aXR5QXR0cmlidXRlfElEXSk/IAogCSAqICAgICAgICAgZXhwcmVzc2lvbis9RGF0YUludGVyY2hhbmdlRXhwcmVzc2lvbiogCiAJICogICAgICAgICBsb29rdXArPURhdGFJbnRlcmNoYW5nZUxvb2t1cCogCiAJICogICAgICAgICBmb3JtYXQrPURhdGFJbnRlcmNoYW5nZUZvcm1hdCogCisJICogICAgICAgICBleHBvcnRFeHBvc2VzKz1EYXRhSW50ZXJjaGFuZ2VFeHBvc2UqIAogCSAqICAgICAgICAgbWFwcGluZ3MrPURhdGFJbnRlcmNoYW5nZU1hcHBpbmcqIAotCSAqICAgICAgICAgbG9va3VwS2V5cys9RGF0YUludGVyY2hhbmdlS2V5KgorCSAqICAgICAgICAgbG9va3VwS2V5cys9RGF0YUludGVyY2hhbmdlS2V5KiAKKwkgKiAgICAgICAgIGV4cG9ydEZpbHRlcj1EYXRhSW50ZXJjaGFuZ2VFeHBvcnRGaWx0ZXI/CiAJICogICAgICkKIAkgKi8KIAlwcm90ZWN0ZWQgdm9pZCBzZXF1ZW5jZV9EYXRhSW50ZXJjaGFuZ2VCZWFuKElTZXJpYWxpemF0aW9uQ29udGV4dCBjb250ZXh0LCBEYXRhSW50ZXJjaGFuZ2VCZWFuIHNlbWFudGljT2JqZWN0KSB7CkBAIC01MjcsNiArNTQ4LDQ4IEBACiAJCiAJLyoqCiAJICogQ29udGV4dHM6CisJICogICAgIERhdGFJbnRlcmNoYW5nZUV4cG9ydEZpbHRlciByZXR1cm5zIERhdGFJbnRlcmNoYW5nZUV4cG9ydEZpbHRlcgorCSAqCisJICogQ29uc3RyYWludDoKKwkgKiAgICAgKGNvbmRpdGlvbj1EYXRhSW50ZXJjaGFuZ2VGaWx0ZXJDb25kaXRpb24/IGhpZGRlbnByb3BlcnRpZXMrPURhdGFJbnRlcmNoYW5nZUV4cG9ydEhpZGUqKQorCSAqLworCXByb3RlY3RlZCB2b2lkIHNlcXVlbmNlX0RhdGFJbnRlcmNoYW5nZUV4cG9ydEZpbHRlcihJU2VyaWFsaXphdGlvbkNvbnRleHQgY29udGV4dCwgRGF0YUludGVyY2hhbmdlRXhwb3J0RmlsdGVyIHNlbWFudGljT2JqZWN0KSB7CisJCWdlbmVyaWNTZXF1ZW5jZXIuY3JlYXRlU2VxdWVuY2UoY29udGV4dCwgc2VtYW50aWNPYmplY3QpOworCX0KKwkKKwkKKwkvKioKKwkgKiBDb250ZXh0czoKKwkgKiAgICAgRGF0YUludGVyY2hhbmdlRXhwb3J0SGlkZSByZXR1cm5zIERhdGFJbnRlcmNoYW5nZUV4cG9ydEhpZGUKKwkgKgorCSAqIENvbnN0cmFpbnQ6CisJICogICAgIHByb3BlcnR5PVtMRW50aXR5RmVhdHVyZXxJRF0KKwkgKi8KKwlwcm90ZWN0ZWQgdm9pZCBzZXF1ZW5jZV9EYXRhSW50ZXJjaGFuZ2VFeHBvcnRIaWRlKElTZXJpYWxpemF0aW9uQ29udGV4dCBjb250ZXh0LCBEYXRhSW50ZXJjaGFuZ2VFeHBvcnRIaWRlIHNlbWFudGljT2JqZWN0KSB7CisJCWlmIChlcnJvckFjY2VwdG9yICE9IG51bGwpIHsKKwkJCWlmICh0cmFuc2llbnRWYWx1ZXMuaXNWYWx1ZVRyYW5zaWVudChzZW1hbnRpY09iamVjdCwgRGF0YURTTFBhY2thZ2UuTGl0ZXJhbHMuREFUQV9JTlRFUkNIQU5HRV9FWFBPUlRfSElERV9fUFJPUEVSVFkpID09IFZhbHVlVHJhbnNpZW50LllFUykKKwkJCQllcnJvckFjY2VwdG9yLmFjY2VwdChkaWFnbm9zdGljUHJvdmlkZXIuY3JlYXRlRmVhdHVyZVZhbHVlTWlzc2luZyhzZW1hbnRpY09iamVjdCwgRGF0YURTTFBhY2thZ2UuTGl0ZXJhbHMuREFUQV9JTlRFUkNIQU5HRV9FWFBPUlRfSElERV9fUFJPUEVSVFkpKTsKKwkJfQorCQlTZXF1ZW5jZUZlZWRlciBmZWVkZXIgPSBjcmVhdGVTZXF1ZW5jZXJGZWVkZXIoY29udGV4dCwgc2VtYW50aWNPYmplY3QpOworCQlmZWVkZXIuYWNjZXB0KGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YUludGVyY2hhbmdlRXhwb3J0SGlkZUFjY2VzcygpLmdldFByb3BlcnR5TEVudGl0eUZlYXR1cmVJRFRlcm1pbmFsUnVsZUNhbGxfMV8wXzEoKSwgc2VtYW50aWNPYmplY3QuZUdldChEYXRhRFNMUGFja2FnZS5MaXRlcmFscy5EQVRBX0lOVEVSQ0hBTkdFX0VYUE9SVF9ISURFX19QUk9QRVJUWSwgZmFsc2UpKTsKKwkJZmVlZGVyLmZpbmlzaCgpOworCX0KKwkKKwkKKwkvKioKKwkgKiBDb250ZXh0czoKKwkgKiAgICAgRGF0YUludGVyY2hhbmdlRXhwb3NlIHJldHVybnMgRGF0YUludGVyY2hhbmdlRXhwb3NlCisJICoKKwkgKiBDb25zdHJhaW50OgorCSAqICAgICAocmVmRW50aXR5PVtMRW50aXR5UmVmZXJlbmNlfElEXSAocmVmUHJvcGVydHk9W0xFbnRpdHlBdHRyaWJ1dGV8SURdIHwgc3ViRXhwb3NlPURhdGFJbnRlcmNoYW5nZUV4cG9zZSkpCisJICovCisJcHJvdGVjdGVkIHZvaWQgc2VxdWVuY2VfRGF0YUludGVyY2hhbmdlRXhwb3NlKElTZXJpYWxpemF0aW9uQ29udGV4dCBjb250ZXh0LCBEYXRhSW50ZXJjaGFuZ2VFeHBvc2Ugc2VtYW50aWNPYmplY3QpIHsKKwkJZ2VuZXJpY1NlcXVlbmNlci5jcmVhdGVTZXF1ZW5jZShjb250ZXh0LCBzZW1hbnRpY09iamVjdCk7CisJfQorCQorCQorCS8qKgorCSAqIENvbnRleHRzOgogCSAqICAgICBEYXRhSW50ZXJjaGFuZ2VGaWxlIHJldHVybnMgRGF0YUludGVyY2hhbmdlRmlsZUNTVgogCSAqICAgICBEYXRhSW50ZXJjaGFuZ2VGaWxlQ1NWIHJldHVybnMgRGF0YUludGVyY2hhbmdlRmlsZUNTVgogCSAqCkBAIC01NzYsNiArNjM5LDIzIEBACiAJCiAJLyoqCiAJICogQ29udGV4dHM6CisJICogICAgIERhdGFJbnRlcmNoYW5nZUZpbHRlckNvbmRpdGlvbiByZXR1cm5zIERhdGFJbnRlcmNoYW5nZUZpbHRlckNvbmRpdGlvbgorCSAqCisJICogQ29uc3RyYWludDoKKwkgKiAgICAgKAorCSAqICAgICAgICAgcmVmUHJvcGVydHk9W0xFbnRpdHlGZWF0dXJlfElEXSAKKwkgKiAgICAgICAgIG9wZXJhdG9yPUNvbmRpdGlvbkFuZE9wZXJhdG9yMSAKKwkgKiAgICAgICAgIHZhbHVlPVNUUklORz8gCisJICogICAgICAgICAob3BlcmF0b3IyPUNvbmRpdGlvbkFuZE9wZXJhdG9yMiBzdWJjb25kaXRpb249RGF0YUludGVyY2hhbmdlRmlsdGVyQ29uZGl0aW9uKT8KKwkgKiAgICAgKQorCSAqLworCXByb3RlY3RlZCB2b2lkIHNlcXVlbmNlX0RhdGFJbnRlcmNoYW5nZUZpbHRlckNvbmRpdGlvbihJU2VyaWFsaXphdGlvbkNvbnRleHQgY29udGV4dCwgRGF0YUludGVyY2hhbmdlRmlsdGVyQ29uZGl0aW9uIHNlbWFudGljT2JqZWN0KSB7CisJCWdlbmVyaWNTZXF1ZW5jZXIuY3JlYXRlU2VxdWVuY2UoY29udGV4dCwgc2VtYW50aWNPYmplY3QpOworCX0KKwkKKwkKKwkvKioKKwkgKiBDb250ZXh0czoKIAkgKiAgICAgRGF0YUludGVyY2hhbmdlRm9ybWF0IHJldHVybnMgRGF0YUludGVyY2hhbmdlRm9ybWF0CiAJICoKIAkgKiBDb25zdHJhaW50OgpAQCAtNzQwLDYgKzgyMCw3IEBACiAJICogICAgICAgICB2ZWN0b3JOYW1lPVNUUklORz8gCiAJICogICAgICAgICBjcmVhdGVSZXBvcnQ/PSdyZXBvcnQnPyAKIAkgKiAgICAgICAgIGVsZW1lbnRTaXplPUlOVD8gCisJICogICAgICAgICBkZWxldGVGaWxlQWZ0ZXJJbXBvcnQ/PSdkZWxldGVGaWxlQWZ0ZXJJbXBvcnQnPyAKIAkgKiAgICAgICAgIGZpbGVFbmRwb2ludD1EYXRhSW50ZXJjaGFuZ2VGaWxlIAogCSAqICAgICAgICAgcGF0aCs9RGF0YUludGVyY2hhbmdlQmVhbioKIAkgKiAgICAgKQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5kYXRhaW50ZXJjaGFuZ2Uvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2RhdGFpbnRlcmNoYW5nZS9zZXJpYWxpemVyL0RhdGFEU0xTeW50YWN0aWNTZXF1ZW5jZXIuamF2YSBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQuZGF0YWludGVyY2hhbmdlL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9kYXRhaW50ZXJjaGFuZ2Uvc2VyaWFsaXplci9EYXRhRFNMU3ludGFjdGljU2VxdWVuY2VyLmphdmEKaW5kZXggNzIzYWM1Yy4uNGVjM2ZlMyAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5kYXRhaW50ZXJjaGFuZ2Uvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2RhdGFpbnRlcmNoYW5nZS9zZXJpYWxpemVyL0RhdGFEU0xTeW50YWN0aWNTZXF1ZW5jZXIuamF2YQorKysgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmRhdGFpbnRlcmNoYW5nZS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvZGF0YWludGVyY2hhbmdlL3NlcmlhbGl6ZXIvRGF0YURTTFN5bnRhY3RpY1NlcXVlbmNlci5qYXZhCkBAIC0zLDkgKzMsMTEgQEAKICAqICBDb3B5cmlnaHQgKGMpIDIwMTEsIDIwMTYgLSBMb2V0eiBHbWJIJkNvLktHICg2OTExNSBIZWlkZWxiZXJnLCBHZXJtYW55KSAKICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICogIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgICAgICAgICAgIAotICogIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCAgICAgICAKKyAqICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIDIuMCAgICAgICAgCiAgKiAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgICAgICAgICAgICAgICAgICAKLSAqICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICogIGh0dHBzOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAvICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICogIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAqICBDb250cmlidXRvcnM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgKiAJICAgQ2hyaXN0b3BoZSBMb2V0eiAoTG9ldHogR21iSCZDby5LRykgLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCkBAIC0zNCwxMSArMzYsMTMgQEAKIHB1YmxpYyBjbGFzcyBEYXRhRFNMU3ludGFjdGljU2VxdWVuY2VyIGV4dGVuZHMgQWJzdHJhY3RTeW50YWN0aWNTZXF1ZW5jZXIgewogCiAJcHJvdGVjdGVkIERhdGFEU0xHcmFtbWFyQWNjZXNzIGdyYW1tYXJBY2Nlc3M7Ci0JcHJvdGVjdGVkIEFic3RyYWN0RWxlbWVudEFsaWFzIG1hdGNoX0RhdGFJbnRlcmNoYW5nZUJlYW5fX19FeHByZXNzaW9uS2V5d29yZF82XzBfTGVmdEN1cmx5QnJhY2tldEtleXdvcmRfNl8xX1JpZ2h0Q3VybHlCcmFja2V0S2V5d29yZF82XzNfX3E7Ci0JcHJvdGVjdGVkIEFic3RyYWN0RWxlbWVudEFsaWFzIG1hdGNoX0RhdGFJbnRlcmNoYW5nZUJlYW5fX19Gb3JtYXRLZXl3b3JkXzhfMF9MZWZ0Q3VybHlCcmFja2V0S2V5d29yZF84XzFfUmlnaHRDdXJseUJyYWNrZXRLZXl3b3JkXzhfM19fcTsKLQlwcm90ZWN0ZWQgQWJzdHJhY3RFbGVtZW50QWxpYXMgbWF0Y2hfRGF0YUludGVyY2hhbmdlQmVhbl9fX0tleXNLZXl3b3JkXzEwXzBfTGVmdEN1cmx5QnJhY2tldEtleXdvcmRfMTBfMV9SaWdodEN1cmx5QnJhY2tldEtleXdvcmRfMTBfM19fcTsKLQlwcm90ZWN0ZWQgQWJzdHJhY3RFbGVtZW50QWxpYXMgbWF0Y2hfRGF0YUludGVyY2hhbmdlQmVhbl9fX0xvb2t1cEtleXdvcmRfN18wX0xlZnRDdXJseUJyYWNrZXRLZXl3b3JkXzdfMV9SaWdodEN1cmx5QnJhY2tldEtleXdvcmRfN18zX19xOwotCXByb3RlY3RlZCBBYnN0cmFjdEVsZW1lbnRBbGlhcyBtYXRjaF9EYXRhSW50ZXJjaGFuZ2VCZWFuX19fTWFwcGluZ0tleXdvcmRfOV8wX0xlZnRDdXJseUJyYWNrZXRLZXl3b3JkXzlfMV9SaWdodEN1cmx5QnJhY2tldEtleXdvcmRfOV8zX19xOworCXByb3RlY3RlZCBBYnN0cmFjdEVsZW1lbnRBbGlhcyBtYXRjaF9EYXRhSW50ZXJjaGFuZ2VCZWFuX19fRXhwb3NlS2V5d29yZF8xMF8wX0xlZnRDdXJseUJyYWNrZXRLZXl3b3JkXzEwXzFfUmlnaHRDdXJseUJyYWNrZXRLZXl3b3JkXzEwXzNfX3E7CisJcHJvdGVjdGVkIEFic3RyYWN0RWxlbWVudEFsaWFzIG1hdGNoX0RhdGFJbnRlcmNoYW5nZUJlYW5fX19FeHByZXNzaW9uS2V5d29yZF83XzBfTGVmdEN1cmx5QnJhY2tldEtleXdvcmRfN18xX1JpZ2h0Q3VybHlCcmFja2V0S2V5d29yZF83XzNfX3E7CisJcHJvdGVjdGVkIEFic3RyYWN0RWxlbWVudEFsaWFzIG1hdGNoX0RhdGFJbnRlcmNoYW5nZUJlYW5fX19Gb3JtYXRLZXl3b3JkXzlfMF9MZWZ0Q3VybHlCcmFja2V0S2V5d29yZF85XzFfUmlnaHRDdXJseUJyYWNrZXRLZXl3b3JkXzlfM19fcTsKKwlwcm90ZWN0ZWQgQWJzdHJhY3RFbGVtZW50QWxpYXMgbWF0Y2hfRGF0YUludGVyY2hhbmdlQmVhbl9fX0tleXNLZXl3b3JkXzEyXzBfTGVmdEN1cmx5QnJhY2tldEtleXdvcmRfMTJfMV9SaWdodEN1cmx5QnJhY2tldEtleXdvcmRfMTJfM19fcTsKKwlwcm90ZWN0ZWQgQWJzdHJhY3RFbGVtZW50QWxpYXMgbWF0Y2hfRGF0YUludGVyY2hhbmdlQmVhbl9fX0xvb2t1cEtleXdvcmRfOF8wX0xlZnRDdXJseUJyYWNrZXRLZXl3b3JkXzhfMV9SaWdodEN1cmx5QnJhY2tldEtleXdvcmRfOF8zX19xOworCXByb3RlY3RlZCBBYnN0cmFjdEVsZW1lbnRBbGlhcyBtYXRjaF9EYXRhSW50ZXJjaGFuZ2VCZWFuX19fTWFwcGluZ0tleXdvcmRfMTFfMF9MZWZ0Q3VybHlCcmFja2V0S2V5d29yZF8xMV8xX1JpZ2h0Q3VybHlCcmFja2V0S2V5d29yZF8xMV8zX19xOworCXByb3RlY3RlZCBBYnN0cmFjdEVsZW1lbnRBbGlhcyBtYXRjaF9EYXRhSW50ZXJjaGFuZ2VFeHBvcnRGaWx0ZXJfSGlkZUtleXdvcmRfMl8wX3E7CiAJcHJvdGVjdGVkIEFic3RyYWN0RWxlbWVudEFsaWFzIG1hdGNoX0RhdGFJbnRlcmNoYW5nZVBhY2thZ2VfX19MZWZ0Q3VybHlCcmFja2V0S2V5d29yZF81XzBfUmlnaHRDdXJseUJyYWNrZXRLZXl3b3JkXzVfMl9fcTsKIAlwcm90ZWN0ZWQgQWJzdHJhY3RFbGVtZW50QWxpYXMgbWF0Y2hfWEFubm90YXRpb25fX19MZWZ0UGFyZW50aGVzaXNLZXl3b3JkXzNfMF9SaWdodFBhcmVudGhlc2lzS2V5d29yZF8zXzJfX3E7CiAJcHJvdGVjdGVkIEFic3RyYWN0RWxlbWVudEFsaWFzIG1hdGNoX1hCbG9ja0V4cHJlc3Npb25fU2VtaWNvbG9uS2V5d29yZF8yXzFfcTsKQEAgLTUxLDExICs1NSwxMyBAQAogCUBJbmplY3QKIAlwcm90ZWN0ZWQgdm9pZCBpbml0KElHcmFtbWFyQWNjZXNzIGFjY2VzcykgewogCQlncmFtbWFyQWNjZXNzID0gKERhdGFEU0xHcmFtbWFyQWNjZXNzKSBhY2Nlc3M7Ci0JCW1hdGNoX0RhdGFJbnRlcmNoYW5nZUJlYW5fX19FeHByZXNzaW9uS2V5d29yZF82XzBfTGVmdEN1cmx5QnJhY2tldEtleXdvcmRfNl8xX1JpZ2h0Q3VybHlCcmFja2V0S2V5d29yZF82XzNfX3EgPSBuZXcgR3JvdXBBbGlhcyhmYWxzZSwgdHJ1ZSwgbmV3IFRva2VuQWxpYXMoZmFsc2UsIGZhbHNlLCBncmFtbWFyQWNjZXNzLmdldERhdGFJbnRlcmNoYW5nZUJlYW5BY2Nlc3MoKS5nZXRFeHByZXNzaW9uS2V5d29yZF82XzAoKSksIG5ldyBUb2tlbkFsaWFzKGZhbHNlLCBmYWxzZSwgZ3JhbW1hckFjY2Vzcy5nZXREYXRhSW50ZXJjaGFuZ2VCZWFuQWNjZXNzKCkuZ2V0TGVmdEN1cmx5QnJhY2tldEtleXdvcmRfNl8xKCkpLCBuZXcgVG9rZW5BbGlhcyhmYWxzZSwgZmFsc2UsIGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YUludGVyY2hhbmdlQmVhbkFjY2VzcygpLmdldFJpZ2h0Q3VybHlCcmFja2V0S2V5d29yZF82XzMoKSkpOwotCQltYXRjaF9EYXRhSW50ZXJjaGFuZ2VCZWFuX19fRm9ybWF0S2V5d29yZF84XzBfTGVmdEN1cmx5QnJhY2tldEtleXdvcmRfOF8xX1JpZ2h0Q3VybHlCcmFja2V0S2V5d29yZF84XzNfX3EgPSBuZXcgR3JvdXBBbGlhcyhmYWxzZSwgdHJ1ZSwgbmV3IFRva2VuQWxpYXMoZmFsc2UsIGZhbHNlLCBncmFtbWFyQWNjZXNzLmdldERhdGFJbnRlcmNoYW5nZUJlYW5BY2Nlc3MoKS5nZXRGb3JtYXRLZXl3b3JkXzhfMCgpKSwgbmV3IFRva2VuQWxpYXMoZmFsc2UsIGZhbHNlLCBncmFtbWFyQWNjZXNzLmdldERhdGFJbnRlcmNoYW5nZUJlYW5BY2Nlc3MoKS5nZXRMZWZ0Q3VybHlCcmFja2V0S2V5d29yZF84XzEoKSksIG5ldyBUb2tlbkFsaWFzKGZhbHNlLCBmYWxzZSwgZ3JhbW1hckFjY2Vzcy5nZXREYXRhSW50ZXJjaGFuZ2VCZWFuQWNjZXNzKCkuZ2V0UmlnaHRDdXJseUJyYWNrZXRLZXl3b3JkXzhfMygpKSk7Ci0JCW1hdGNoX0RhdGFJbnRlcmNoYW5nZUJlYW5fX19LZXlzS2V5d29yZF8xMF8wX0xlZnRDdXJseUJyYWNrZXRLZXl3b3JkXzEwXzFfUmlnaHRDdXJseUJyYWNrZXRLZXl3b3JkXzEwXzNfX3EgPSBuZXcgR3JvdXBBbGlhcyhmYWxzZSwgdHJ1ZSwgbmV3IFRva2VuQWxpYXMoZmFsc2UsIGZhbHNlLCBncmFtbWFyQWNjZXNzLmdldERhdGFJbnRlcmNoYW5nZUJlYW5BY2Nlc3MoKS5nZXRLZXlzS2V5d29yZF8xMF8wKCkpLCBuZXcgVG9rZW5BbGlhcyhmYWxzZSwgZmFsc2UsIGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YUludGVyY2hhbmdlQmVhbkFjY2VzcygpLmdldExlZnRDdXJseUJyYWNrZXRLZXl3b3JkXzEwXzEoKSksIG5ldyBUb2tlbkFsaWFzKGZhbHNlLCBmYWxzZSwgZ3JhbW1hckFjY2Vzcy5nZXREYXRhSW50ZXJjaGFuZ2VCZWFuQWNjZXNzKCkuZ2V0UmlnaHRDdXJseUJyYWNrZXRLZXl3b3JkXzEwXzMoKSkpOwotCQltYXRjaF9EYXRhSW50ZXJjaGFuZ2VCZWFuX19fTG9va3VwS2V5d29yZF83XzBfTGVmdEN1cmx5QnJhY2tldEtleXdvcmRfN18xX1JpZ2h0Q3VybHlCcmFja2V0S2V5d29yZF83XzNfX3EgPSBuZXcgR3JvdXBBbGlhcyhmYWxzZSwgdHJ1ZSwgbmV3IFRva2VuQWxpYXMoZmFsc2UsIGZhbHNlLCBncmFtbWFyQWNjZXNzLmdldERhdGFJbnRlcmNoYW5nZUJlYW5BY2Nlc3MoKS5nZXRMb29rdXBLZXl3b3JkXzdfMCgpKSwgbmV3IFRva2VuQWxpYXMoZmFsc2UsIGZhbHNlLCBncmFtbWFyQWNjZXNzLmdldERhdGFJbnRlcmNoYW5nZUJlYW5BY2Nlc3MoKS5nZXRMZWZ0Q3VybHlCcmFja2V0S2V5d29yZF83XzEoKSksIG5ldyBUb2tlbkFsaWFzKGZhbHNlLCBmYWxzZSwgZ3JhbW1hckFjY2Vzcy5nZXREYXRhSW50ZXJjaGFuZ2VCZWFuQWNjZXNzKCkuZ2V0UmlnaHRDdXJseUJyYWNrZXRLZXl3b3JkXzdfMygpKSk7Ci0JCW1hdGNoX0RhdGFJbnRlcmNoYW5nZUJlYW5fX19NYXBwaW5nS2V5d29yZF85XzBfTGVmdEN1cmx5QnJhY2tldEtleXdvcmRfOV8xX1JpZ2h0Q3VybHlCcmFja2V0S2V5d29yZF85XzNfX3EgPSBuZXcgR3JvdXBBbGlhcyhmYWxzZSwgdHJ1ZSwgbmV3IFRva2VuQWxpYXMoZmFsc2UsIGZhbHNlLCBncmFtbWFyQWNjZXNzLmdldERhdGFJbnRlcmNoYW5nZUJlYW5BY2Nlc3MoKS5nZXRNYXBwaW5nS2V5d29yZF85XzAoKSksIG5ldyBUb2tlbkFsaWFzKGZhbHNlLCBmYWxzZSwgZ3JhbW1hckFjY2Vzcy5nZXREYXRhSW50ZXJjaGFuZ2VCZWFuQWNjZXNzKCkuZ2V0TGVmdEN1cmx5QnJhY2tldEtleXdvcmRfOV8xKCkpLCBuZXcgVG9rZW5BbGlhcyhmYWxzZSwgZmFsc2UsIGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YUludGVyY2hhbmdlQmVhbkFjY2VzcygpLmdldFJpZ2h0Q3VybHlCcmFja2V0S2V5d29yZF85XzMoKSkpOworCQltYXRjaF9EYXRhSW50ZXJjaGFuZ2VCZWFuX19fRXhwb3NlS2V5d29yZF8xMF8wX0xlZnRDdXJseUJyYWNrZXRLZXl3b3JkXzEwXzFfUmlnaHRDdXJseUJyYWNrZXRLZXl3b3JkXzEwXzNfX3EgPSBuZXcgR3JvdXBBbGlhcyhmYWxzZSwgdHJ1ZSwgbmV3IFRva2VuQWxpYXMoZmFsc2UsIGZhbHNlLCBncmFtbWFyQWNjZXNzLmdldERhdGFJbnRlcmNoYW5nZUJlYW5BY2Nlc3MoKS5nZXRFeHBvc2VLZXl3b3JkXzEwXzAoKSksIG5ldyBUb2tlbkFsaWFzKGZhbHNlLCBmYWxzZSwgZ3JhbW1hckFjY2Vzcy5nZXREYXRhSW50ZXJjaGFuZ2VCZWFuQWNjZXNzKCkuZ2V0TGVmdEN1cmx5QnJhY2tldEtleXdvcmRfMTBfMSgpKSwgbmV3IFRva2VuQWxpYXMoZmFsc2UsIGZhbHNlLCBncmFtbWFyQWNjZXNzLmdldERhdGFJbnRlcmNoYW5nZUJlYW5BY2Nlc3MoKS5nZXRSaWdodEN1cmx5QnJhY2tldEtleXdvcmRfMTBfMygpKSk7CisJCW1hdGNoX0RhdGFJbnRlcmNoYW5nZUJlYW5fX19FeHByZXNzaW9uS2V5d29yZF83XzBfTGVmdEN1cmx5QnJhY2tldEtleXdvcmRfN18xX1JpZ2h0Q3VybHlCcmFja2V0S2V5d29yZF83XzNfX3EgPSBuZXcgR3JvdXBBbGlhcyhmYWxzZSwgdHJ1ZSwgbmV3IFRva2VuQWxpYXMoZmFsc2UsIGZhbHNlLCBncmFtbWFyQWNjZXNzLmdldERhdGFJbnRlcmNoYW5nZUJlYW5BY2Nlc3MoKS5nZXRFeHByZXNzaW9uS2V5d29yZF83XzAoKSksIG5ldyBUb2tlbkFsaWFzKGZhbHNlLCBmYWxzZSwgZ3JhbW1hckFjY2Vzcy5nZXREYXRhSW50ZXJjaGFuZ2VCZWFuQWNjZXNzKCkuZ2V0TGVmdEN1cmx5QnJhY2tldEtleXdvcmRfN18xKCkpLCBuZXcgVG9rZW5BbGlhcyhmYWxzZSwgZmFsc2UsIGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YUludGVyY2hhbmdlQmVhbkFjY2VzcygpLmdldFJpZ2h0Q3VybHlCcmFja2V0S2V5d29yZF83XzMoKSkpOworCQltYXRjaF9EYXRhSW50ZXJjaGFuZ2VCZWFuX19fRm9ybWF0S2V5d29yZF85XzBfTGVmdEN1cmx5QnJhY2tldEtleXdvcmRfOV8xX1JpZ2h0Q3VybHlCcmFja2V0S2V5d29yZF85XzNfX3EgPSBuZXcgR3JvdXBBbGlhcyhmYWxzZSwgdHJ1ZSwgbmV3IFRva2VuQWxpYXMoZmFsc2UsIGZhbHNlLCBncmFtbWFyQWNjZXNzLmdldERhdGFJbnRlcmNoYW5nZUJlYW5BY2Nlc3MoKS5nZXRGb3JtYXRLZXl3b3JkXzlfMCgpKSwgbmV3IFRva2VuQWxpYXMoZmFsc2UsIGZhbHNlLCBncmFtbWFyQWNjZXNzLmdldERhdGFJbnRlcmNoYW5nZUJlYW5BY2Nlc3MoKS5nZXRMZWZ0Q3VybHlCcmFja2V0S2V5d29yZF85XzEoKSksIG5ldyBUb2tlbkFsaWFzKGZhbHNlLCBmYWxzZSwgZ3JhbW1hckFjY2Vzcy5nZXREYXRhSW50ZXJjaGFuZ2VCZWFuQWNjZXNzKCkuZ2V0UmlnaHRDdXJseUJyYWNrZXRLZXl3b3JkXzlfMygpKSk7CisJCW1hdGNoX0RhdGFJbnRlcmNoYW5nZUJlYW5fX19LZXlzS2V5d29yZF8xMl8wX0xlZnRDdXJseUJyYWNrZXRLZXl3b3JkXzEyXzFfUmlnaHRDdXJseUJyYWNrZXRLZXl3b3JkXzEyXzNfX3EgPSBuZXcgR3JvdXBBbGlhcyhmYWxzZSwgdHJ1ZSwgbmV3IFRva2VuQWxpYXMoZmFsc2UsIGZhbHNlLCBncmFtbWFyQWNjZXNzLmdldERhdGFJbnRlcmNoYW5nZUJlYW5BY2Nlc3MoKS5nZXRLZXlzS2V5d29yZF8xMl8wKCkpLCBuZXcgVG9rZW5BbGlhcyhmYWxzZSwgZmFsc2UsIGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YUludGVyY2hhbmdlQmVhbkFjY2VzcygpLmdldExlZnRDdXJseUJyYWNrZXRLZXl3b3JkXzEyXzEoKSksIG5ldyBUb2tlbkFsaWFzKGZhbHNlLCBmYWxzZSwgZ3JhbW1hckFjY2Vzcy5nZXREYXRhSW50ZXJjaGFuZ2VCZWFuQWNjZXNzKCkuZ2V0UmlnaHRDdXJseUJyYWNrZXRLZXl3b3JkXzEyXzMoKSkpOworCQltYXRjaF9EYXRhSW50ZXJjaGFuZ2VCZWFuX19fTG9va3VwS2V5d29yZF84XzBfTGVmdEN1cmx5QnJhY2tldEtleXdvcmRfOF8xX1JpZ2h0Q3VybHlCcmFja2V0S2V5d29yZF84XzNfX3EgPSBuZXcgR3JvdXBBbGlhcyhmYWxzZSwgdHJ1ZSwgbmV3IFRva2VuQWxpYXMoZmFsc2UsIGZhbHNlLCBncmFtbWFyQWNjZXNzLmdldERhdGFJbnRlcmNoYW5nZUJlYW5BY2Nlc3MoKS5nZXRMb29rdXBLZXl3b3JkXzhfMCgpKSwgbmV3IFRva2VuQWxpYXMoZmFsc2UsIGZhbHNlLCBncmFtbWFyQWNjZXNzLmdldERhdGFJbnRlcmNoYW5nZUJlYW5BY2Nlc3MoKS5nZXRMZWZ0Q3VybHlCcmFja2V0S2V5d29yZF84XzEoKSksIG5ldyBUb2tlbkFsaWFzKGZhbHNlLCBmYWxzZSwgZ3JhbW1hckFjY2Vzcy5nZXREYXRhSW50ZXJjaGFuZ2VCZWFuQWNjZXNzKCkuZ2V0UmlnaHRDdXJseUJyYWNrZXRLZXl3b3JkXzhfMygpKSk7CisJCW1hdGNoX0RhdGFJbnRlcmNoYW5nZUJlYW5fX19NYXBwaW5nS2V5d29yZF8xMV8wX0xlZnRDdXJseUJyYWNrZXRLZXl3b3JkXzExXzFfUmlnaHRDdXJseUJyYWNrZXRLZXl3b3JkXzExXzNfX3EgPSBuZXcgR3JvdXBBbGlhcyhmYWxzZSwgdHJ1ZSwgbmV3IFRva2VuQWxpYXMoZmFsc2UsIGZhbHNlLCBncmFtbWFyQWNjZXNzLmdldERhdGFJbnRlcmNoYW5nZUJlYW5BY2Nlc3MoKS5nZXRNYXBwaW5nS2V5d29yZF8xMV8wKCkpLCBuZXcgVG9rZW5BbGlhcyhmYWxzZSwgZmFsc2UsIGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YUludGVyY2hhbmdlQmVhbkFjY2VzcygpLmdldExlZnRDdXJseUJyYWNrZXRLZXl3b3JkXzExXzEoKSksIG5ldyBUb2tlbkFsaWFzKGZhbHNlLCBmYWxzZSwgZ3JhbW1hckFjY2Vzcy5nZXREYXRhSW50ZXJjaGFuZ2VCZWFuQWNjZXNzKCkuZ2V0UmlnaHRDdXJseUJyYWNrZXRLZXl3b3JkXzExXzMoKSkpOworCQltYXRjaF9EYXRhSW50ZXJjaGFuZ2VFeHBvcnRGaWx0ZXJfSGlkZUtleXdvcmRfMl8wX3EgPSBuZXcgVG9rZW5BbGlhcyhmYWxzZSwgdHJ1ZSwgZ3JhbW1hckFjY2Vzcy5nZXREYXRhSW50ZXJjaGFuZ2VFeHBvcnRGaWx0ZXJBY2Nlc3MoKS5nZXRIaWRlS2V5d29yZF8yXzAoKSk7CiAJCW1hdGNoX0RhdGFJbnRlcmNoYW5nZVBhY2thZ2VfX19MZWZ0Q3VybHlCcmFja2V0S2V5d29yZF81XzBfUmlnaHRDdXJseUJyYWNrZXRLZXl3b3JkXzVfMl9fcSA9IG5ldyBHcm91cEFsaWFzKGZhbHNlLCB0cnVlLCBuZXcgVG9rZW5BbGlhcyhmYWxzZSwgZmFsc2UsIGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YUludGVyY2hhbmdlUGFja2FnZUFjY2VzcygpLmdldExlZnRDdXJseUJyYWNrZXRLZXl3b3JkXzVfMCgpKSwgbmV3IFRva2VuQWxpYXMoZmFsc2UsIGZhbHNlLCBncmFtbWFyQWNjZXNzLmdldERhdGFJbnRlcmNoYW5nZVBhY2thZ2VBY2Nlc3MoKS5nZXRSaWdodEN1cmx5QnJhY2tldEtleXdvcmRfNV8yKCkpKTsKIAkJbWF0Y2hfWEFubm90YXRpb25fX19MZWZ0UGFyZW50aGVzaXNLZXl3b3JkXzNfMF9SaWdodFBhcmVudGhlc2lzS2V5d29yZF8zXzJfX3EgPSBuZXcgR3JvdXBBbGlhcyhmYWxzZSwgdHJ1ZSwgbmV3IFRva2VuQWxpYXMoZmFsc2UsIGZhbHNlLCBncmFtbWFyQWNjZXNzLmdldFhBbm5vdGF0aW9uQWNjZXNzKCkuZ2V0TGVmdFBhcmVudGhlc2lzS2V5d29yZF8zXzAoKSksIG5ldyBUb2tlbkFsaWFzKGZhbHNlLCBmYWxzZSwgZ3JhbW1hckFjY2Vzcy5nZXRYQW5ub3RhdGlvbkFjY2VzcygpLmdldFJpZ2h0UGFyZW50aGVzaXNLZXl3b3JkXzNfMigpKSk7CiAJCW1hdGNoX1hCbG9ja0V4cHJlc3Npb25fU2VtaWNvbG9uS2V5d29yZF8yXzFfcSA9IG5ldyBUb2tlbkFsaWFzKGZhbHNlLCB0cnVlLCBncmFtbWFyQWNjZXNzLmdldFhCbG9ja0V4cHJlc3Npb25BY2Nlc3MoKS5nZXRTZW1pY29sb25LZXl3b3JkXzJfMSgpKTsKQEAgLTEwMywxNiArMTA5LDIwIEBACiAJCUxpc3Q8SU5vZGU+IHRyYW5zaXRpb25Ob2RlcyA9IGNvbGxlY3ROb2Rlcyhmcm9tTm9kZSwgdG9Ob2RlKTsKIAkJZm9yIChBYnN0cmFjdEVsZW1lbnRBbGlhcyBzeW50YXggOiB0cmFuc2l0aW9uLmdldEFtYmlndW91c1N5bnRheGVzKCkpIHsKIAkJCUxpc3Q8SU5vZGU+IHN5bnRheE5vZGVzID0gZ2V0Tm9kZXNGb3IodHJhbnNpdGlvbk5vZGVzLCBzeW50YXgpOwotCQkJaWYgKG1hdGNoX0RhdGFJbnRlcmNoYW5nZUJlYW5fX19FeHByZXNzaW9uS2V5d29yZF82XzBfTGVmdEN1cmx5QnJhY2tldEtleXdvcmRfNl8xX1JpZ2h0Q3VybHlCcmFja2V0S2V5d29yZF82XzNfX3EuZXF1YWxzKHN5bnRheCkpCi0JCQkJZW1pdF9EYXRhSW50ZXJjaGFuZ2VCZWFuX19fRXhwcmVzc2lvbktleXdvcmRfNl8wX0xlZnRDdXJseUJyYWNrZXRLZXl3b3JkXzZfMV9SaWdodEN1cmx5QnJhY2tldEtleXdvcmRfNl8zX19xKHNlbWFudGljT2JqZWN0LCBnZXRMYXN0TmF2aWdhYmxlU3RhdGUoKSwgc3ludGF4Tm9kZXMpOwotCQkJZWxzZSBpZiAobWF0Y2hfRGF0YUludGVyY2hhbmdlQmVhbl9fX0Zvcm1hdEtleXdvcmRfOF8wX0xlZnRDdXJseUJyYWNrZXRLZXl3b3JkXzhfMV9SaWdodEN1cmx5QnJhY2tldEtleXdvcmRfOF8zX19xLmVxdWFscyhzeW50YXgpKQotCQkJCWVtaXRfRGF0YUludGVyY2hhbmdlQmVhbl9fX0Zvcm1hdEtleXdvcmRfOF8wX0xlZnRDdXJseUJyYWNrZXRLZXl3b3JkXzhfMV9SaWdodEN1cmx5QnJhY2tldEtleXdvcmRfOF8zX19xKHNlbWFudGljT2JqZWN0LCBnZXRMYXN0TmF2aWdhYmxlU3RhdGUoKSwgc3ludGF4Tm9kZXMpOwotCQkJZWxzZSBpZiAobWF0Y2hfRGF0YUludGVyY2hhbmdlQmVhbl9fX0tleXNLZXl3b3JkXzEwXzBfTGVmdEN1cmx5QnJhY2tldEtleXdvcmRfMTBfMV9SaWdodEN1cmx5QnJhY2tldEtleXdvcmRfMTBfM19fcS5lcXVhbHMoc3ludGF4KSkKLQkJCQllbWl0X0RhdGFJbnRlcmNoYW5nZUJlYW5fX19LZXlzS2V5d29yZF8xMF8wX0xlZnRDdXJseUJyYWNrZXRLZXl3b3JkXzEwXzFfUmlnaHRDdXJseUJyYWNrZXRLZXl3b3JkXzEwXzNfX3Eoc2VtYW50aWNPYmplY3QsIGdldExhc3ROYXZpZ2FibGVTdGF0ZSgpLCBzeW50YXhOb2Rlcyk7Ci0JCQllbHNlIGlmIChtYXRjaF9EYXRhSW50ZXJjaGFuZ2VCZWFuX19fTG9va3VwS2V5d29yZF83XzBfTGVmdEN1cmx5QnJhY2tldEtleXdvcmRfN18xX1JpZ2h0Q3VybHlCcmFja2V0S2V5d29yZF83XzNfX3EuZXF1YWxzKHN5bnRheCkpCi0JCQkJZW1pdF9EYXRhSW50ZXJjaGFuZ2VCZWFuX19fTG9va3VwS2V5d29yZF83XzBfTGVmdEN1cmx5QnJhY2tldEtleXdvcmRfN18xX1JpZ2h0Q3VybHlCcmFja2V0S2V5d29yZF83XzNfX3Eoc2VtYW50aWNPYmplY3QsIGdldExhc3ROYXZpZ2FibGVTdGF0ZSgpLCBzeW50YXhOb2Rlcyk7Ci0JCQllbHNlIGlmIChtYXRjaF9EYXRhSW50ZXJjaGFuZ2VCZWFuX19fTWFwcGluZ0tleXdvcmRfOV8wX0xlZnRDdXJseUJyYWNrZXRLZXl3b3JkXzlfMV9SaWdodEN1cmx5QnJhY2tldEtleXdvcmRfOV8zX19xLmVxdWFscyhzeW50YXgpKQotCQkJCWVtaXRfRGF0YUludGVyY2hhbmdlQmVhbl9fX01hcHBpbmdLZXl3b3JkXzlfMF9MZWZ0Q3VybHlCcmFja2V0S2V5d29yZF85XzFfUmlnaHRDdXJseUJyYWNrZXRLZXl3b3JkXzlfM19fcShzZW1hbnRpY09iamVjdCwgZ2V0TGFzdE5hdmlnYWJsZVN0YXRlKCksIHN5bnRheE5vZGVzKTsKKwkJCWlmIChtYXRjaF9EYXRhSW50ZXJjaGFuZ2VCZWFuX19fRXhwb3NlS2V5d29yZF8xMF8wX0xlZnRDdXJseUJyYWNrZXRLZXl3b3JkXzEwXzFfUmlnaHRDdXJseUJyYWNrZXRLZXl3b3JkXzEwXzNfX3EuZXF1YWxzKHN5bnRheCkpCisJCQkJZW1pdF9EYXRhSW50ZXJjaGFuZ2VCZWFuX19fRXhwb3NlS2V5d29yZF8xMF8wX0xlZnRDdXJseUJyYWNrZXRLZXl3b3JkXzEwXzFfUmlnaHRDdXJseUJyYWNrZXRLZXl3b3JkXzEwXzNfX3Eoc2VtYW50aWNPYmplY3QsIGdldExhc3ROYXZpZ2FibGVTdGF0ZSgpLCBzeW50YXhOb2Rlcyk7CisJCQllbHNlIGlmIChtYXRjaF9EYXRhSW50ZXJjaGFuZ2VCZWFuX19fRXhwcmVzc2lvbktleXdvcmRfN18wX0xlZnRDdXJseUJyYWNrZXRLZXl3b3JkXzdfMV9SaWdodEN1cmx5QnJhY2tldEtleXdvcmRfN18zX19xLmVxdWFscyhzeW50YXgpKQorCQkJCWVtaXRfRGF0YUludGVyY2hhbmdlQmVhbl9fX0V4cHJlc3Npb25LZXl3b3JkXzdfMF9MZWZ0Q3VybHlCcmFja2V0S2V5d29yZF83XzFfUmlnaHRDdXJseUJyYWNrZXRLZXl3b3JkXzdfM19fcShzZW1hbnRpY09iamVjdCwgZ2V0TGFzdE5hdmlnYWJsZVN0YXRlKCksIHN5bnRheE5vZGVzKTsKKwkJCWVsc2UgaWYgKG1hdGNoX0RhdGFJbnRlcmNoYW5nZUJlYW5fX19Gb3JtYXRLZXl3b3JkXzlfMF9MZWZ0Q3VybHlCcmFja2V0S2V5d29yZF85XzFfUmlnaHRDdXJseUJyYWNrZXRLZXl3b3JkXzlfM19fcS5lcXVhbHMoc3ludGF4KSkKKwkJCQllbWl0X0RhdGFJbnRlcmNoYW5nZUJlYW5fX19Gb3JtYXRLZXl3b3JkXzlfMF9MZWZ0Q3VybHlCcmFja2V0S2V5d29yZF85XzFfUmlnaHRDdXJseUJyYWNrZXRLZXl3b3JkXzlfM19fcShzZW1hbnRpY09iamVjdCwgZ2V0TGFzdE5hdmlnYWJsZVN0YXRlKCksIHN5bnRheE5vZGVzKTsKKwkJCWVsc2UgaWYgKG1hdGNoX0RhdGFJbnRlcmNoYW5nZUJlYW5fX19LZXlzS2V5d29yZF8xMl8wX0xlZnRDdXJseUJyYWNrZXRLZXl3b3JkXzEyXzFfUmlnaHRDdXJseUJyYWNrZXRLZXl3b3JkXzEyXzNfX3EuZXF1YWxzKHN5bnRheCkpCisJCQkJZW1pdF9EYXRhSW50ZXJjaGFuZ2VCZWFuX19fS2V5c0tleXdvcmRfMTJfMF9MZWZ0Q3VybHlCcmFja2V0S2V5d29yZF8xMl8xX1JpZ2h0Q3VybHlCcmFja2V0S2V5d29yZF8xMl8zX19xKHNlbWFudGljT2JqZWN0LCBnZXRMYXN0TmF2aWdhYmxlU3RhdGUoKSwgc3ludGF4Tm9kZXMpOworCQkJZWxzZSBpZiAobWF0Y2hfRGF0YUludGVyY2hhbmdlQmVhbl9fX0xvb2t1cEtleXdvcmRfOF8wX0xlZnRDdXJseUJyYWNrZXRLZXl3b3JkXzhfMV9SaWdodEN1cmx5QnJhY2tldEtleXdvcmRfOF8zX19xLmVxdWFscyhzeW50YXgpKQorCQkJCWVtaXRfRGF0YUludGVyY2hhbmdlQmVhbl9fX0xvb2t1cEtleXdvcmRfOF8wX0xlZnRDdXJseUJyYWNrZXRLZXl3b3JkXzhfMV9SaWdodEN1cmx5QnJhY2tldEtleXdvcmRfOF8zX19xKHNlbWFudGljT2JqZWN0LCBnZXRMYXN0TmF2aWdhYmxlU3RhdGUoKSwgc3ludGF4Tm9kZXMpOworCQkJZWxzZSBpZiAobWF0Y2hfRGF0YUludGVyY2hhbmdlQmVhbl9fX01hcHBpbmdLZXl3b3JkXzExXzBfTGVmdEN1cmx5QnJhY2tldEtleXdvcmRfMTFfMV9SaWdodEN1cmx5QnJhY2tldEtleXdvcmRfMTFfM19fcS5lcXVhbHMoc3ludGF4KSkKKwkJCQllbWl0X0RhdGFJbnRlcmNoYW5nZUJlYW5fX19NYXBwaW5nS2V5d29yZF8xMV8wX0xlZnRDdXJseUJyYWNrZXRLZXl3b3JkXzExXzFfUmlnaHRDdXJseUJyYWNrZXRLZXl3b3JkXzExXzNfX3Eoc2VtYW50aWNPYmplY3QsIGdldExhc3ROYXZpZ2FibGVTdGF0ZSgpLCBzeW50YXhOb2Rlcyk7CisJCQllbHNlIGlmIChtYXRjaF9EYXRhSW50ZXJjaGFuZ2VFeHBvcnRGaWx0ZXJfSGlkZUtleXdvcmRfMl8wX3EuZXF1YWxzKHN5bnRheCkpCisJCQkJZW1pdF9EYXRhSW50ZXJjaGFuZ2VFeHBvcnRGaWx0ZXJfSGlkZUtleXdvcmRfMl8wX3Eoc2VtYW50aWNPYmplY3QsIGdldExhc3ROYXZpZ2FibGVTdGF0ZSgpLCBzeW50YXhOb2Rlcyk7CiAJCQllbHNlIGlmIChtYXRjaF9EYXRhSW50ZXJjaGFuZ2VQYWNrYWdlX19fTGVmdEN1cmx5QnJhY2tldEtleXdvcmRfNV8wX1JpZ2h0Q3VybHlCcmFja2V0S2V5d29yZF81XzJfX3EuZXF1YWxzKHN5bnRheCkpCiAJCQkJZW1pdF9EYXRhSW50ZXJjaGFuZ2VQYWNrYWdlX19fTGVmdEN1cmx5QnJhY2tldEtleXdvcmRfNV8wX1JpZ2h0Q3VybHlCcmFja2V0S2V5d29yZF81XzJfX3Eoc2VtYW50aWNPYmplY3QsIGdldExhc3ROYXZpZ2FibGVTdGF0ZSgpLCBzeW50YXhOb2Rlcyk7CiAJCQllbHNlIGlmIChtYXRjaF9YQW5ub3RhdGlvbl9fX0xlZnRQYXJlbnRoZXNpc0tleXdvcmRfM18wX1JpZ2h0UGFyZW50aGVzaXNLZXl3b3JkXzNfMl9fcS5lcXVhbHMoc3ludGF4KSkKQEAgLTEzNSwzMSArMTQ1LDEyMSBAQAogCiAJLyoqCiAJICogQW1iaWd1b3VzIHN5bnRheDoKKwkgKiAgICAgKCdleHBvc2UnICd7JyAnfScpPworCSAqCisJICogVGhpcyBhbWJpZ3VvdXMgc3ludGF4IG9jY3VycyBhdDoKKwkgKiAgICAgKAorCSAqICAgICAgICAgbGF0ZXN0RXhwUHJvcGVydHk9W0xFbnRpdHlBdHRyaWJ1dGV8SURdIAorCSAqICAgICAgICAgKCdleHByZXNzaW9uJyAneycgJ30nKT8gCisJICogICAgICAgICAoJ2xvb2t1cCcgJ3snICd9Jyk/IAorCSAqICAgICAgICAgKCdmb3JtYXQnICd7JyAnfScpPyAKKwkgKiAgICAgICAgIChhbWJpZ3VpdHkpIAorCSAqICAgICAgICAgKCdtYXBwaW5nJyAneycgJ30nKT8gCisJICogICAgICAgICAoJ2tleXMnICd7JyAnfScpPyAKKwkgKiAgICAgICAgICdleHBvcnRGaWx0ZXInIAorCSAqICAgICAgICAgJ3snIAorCSAqICAgICAgICAgZXhwb3J0RmlsdGVyPURhdGFJbnRlcmNoYW5nZUV4cG9ydEZpbHRlcgorCSAqICAgICApCisJICogICAgICgKKwkgKiAgICAgICAgIGxhdGVzdFByb3BlcnR5PVtMRW50aXR5QXR0cmlidXRlfElEXSAKKwkgKiAgICAgICAgICgnZXhwcmVzc2lvbicgJ3snICd9Jyk/IAorCSAqICAgICAgICAgKCdsb29rdXAnICd7JyAnfScpPyAKKwkgKiAgICAgICAgICgnZm9ybWF0JyAneycgJ30nKT8gCisJICogICAgICAgICAoYW1iaWd1aXR5KSAKKwkgKiAgICAgICAgICgnbWFwcGluZycgJ3snICd9Jyk/IAorCSAqICAgICAgICAgKCdrZXlzJyAneycgJ30nKT8gCisJICogICAgICAgICAnZXhwb3J0RmlsdGVyJyAKKwkgKiAgICAgICAgICd7JyAKKwkgKiAgICAgICAgIGV4cG9ydEZpbHRlcj1EYXRhSW50ZXJjaGFuZ2VFeHBvcnRGaWx0ZXIKKwkgKiAgICAgKQorCSAqICAgICBlbGVtZW50TWFwPVNUUklORyAoJ2V4cHJlc3Npb24nICd7JyAnfScpPyAoJ2xvb2t1cCcgJ3snICd9Jyk/ICgnZm9ybWF0JyAneycgJ30nKT8gKGFtYmlndWl0eSkgJ21hcHBpbmcnICd7JyBtYXBwaW5ncys9RGF0YUludGVyY2hhbmdlTWFwcGluZworCSAqICAgICBlbGVtZW50TWFwPVNUUklORyAoJ2V4cHJlc3Npb24nICd7JyAnfScpPyAoJ2xvb2t1cCcgJ3snICd9Jyk/ICgnZm9ybWF0JyAneycgJ30nKT8gKGFtYmlndWl0eSkgKCdtYXBwaW5nJyAneycgJ30nKT8gJ2tleXMnICd7JyBsb29rdXBLZXlzKz1EYXRhSW50ZXJjaGFuZ2VLZXkKKwkgKiAgICAgZWxlbWVudE1hcD1TVFJJTkcgKCdleHByZXNzaW9uJyAneycgJ30nKT8gKCdsb29rdXAnICd7JyAnfScpPyAoJ2Zvcm1hdCcgJ3snICd9Jyk/IChhbWJpZ3VpdHkpICgnbWFwcGluZycgJ3snICd9Jyk/ICgna2V5cycgJ3snICd9Jyk/ICdleHBvcnRGaWx0ZXInICd7JyBleHBvcnRGaWx0ZXI9RGF0YUludGVyY2hhbmdlRXhwb3J0RmlsdGVyCisJICogICAgIGVsZW1lbnRNYXA9U1RSSU5HICgnZXhwcmVzc2lvbicgJ3snICd9Jyk/ICgnbG9va3VwJyAneycgJ30nKT8gKCdmb3JtYXQnICd7JyAnfScpPyAoYW1iaWd1aXR5KSAoJ21hcHBpbmcnICd7JyAnfScpPyAoJ2tleXMnICd7JyAnfScpPyAocnVsZSBlbmQpCisJICogICAgIGVudGl0eT1bTEVudGl0eXxMRlFOXSAoJ2V4cHJlc3Npb24nICd7JyAnfScpPyAoJ2xvb2t1cCcgJ3snICd9Jyk/ICgnZm9ybWF0JyAneycgJ30nKT8gKGFtYmlndWl0eSkgJ21hcHBpbmcnICd7JyBtYXBwaW5ncys9RGF0YUludGVyY2hhbmdlTWFwcGluZworCSAqICAgICBlbnRpdHk9W0xFbnRpdHl8TEZRTl0gKCdleHByZXNzaW9uJyAneycgJ30nKT8gKCdsb29rdXAnICd7JyAnfScpPyAoJ2Zvcm1hdCcgJ3snICd9Jyk/IChhbWJpZ3VpdHkpICgnbWFwcGluZycgJ3snICd9Jyk/ICdrZXlzJyAneycgbG9va3VwS2V5cys9RGF0YUludGVyY2hhbmdlS2V5CisJICogICAgIGVudGl0eT1bTEVudGl0eXxMRlFOXSAoJ2V4cHJlc3Npb24nICd7JyAnfScpPyAoJ2xvb2t1cCcgJ3snICd9Jyk/ICgnZm9ybWF0JyAneycgJ30nKT8gKGFtYmlndWl0eSkgKCdtYXBwaW5nJyAneycgJ30nKT8gKCdrZXlzJyAneycgJ30nKT8gJ2V4cG9ydEZpbHRlcicgJ3snIGV4cG9ydEZpbHRlcj1EYXRhSW50ZXJjaGFuZ2VFeHBvcnRGaWx0ZXIKKwkgKiAgICAgZW50aXR5PVtMRW50aXR5fExGUU5dICgnZXhwcmVzc2lvbicgJ3snICd9Jyk/ICgnbG9va3VwJyAneycgJ30nKT8gKCdmb3JtYXQnICd7JyAnfScpPyAoYW1iaWd1aXR5KSAoJ21hcHBpbmcnICd7JyAnfScpPyAoJ2tleXMnICd7JyAnfScpPyAocnVsZSBlbmQpCisJICogICAgIGV4cHJlc3Npb24rPURhdGFJbnRlcmNoYW5nZUV4cHJlc3Npb24gJ30nICgnbG9va3VwJyAneycgJ30nKT8gKCdmb3JtYXQnICd7JyAnfScpPyAoYW1iaWd1aXR5KSAnbWFwcGluZycgJ3snIG1hcHBpbmdzKz1EYXRhSW50ZXJjaGFuZ2VNYXBwaW5nCisJICogICAgIGV4cHJlc3Npb24rPURhdGFJbnRlcmNoYW5nZUV4cHJlc3Npb24gJ30nICgnbG9va3VwJyAneycgJ30nKT8gKCdmb3JtYXQnICd7JyAnfScpPyAoYW1iaWd1aXR5KSAoJ21hcHBpbmcnICd7JyAnfScpPyAna2V5cycgJ3snIGxvb2t1cEtleXMrPURhdGFJbnRlcmNoYW5nZUtleQorCSAqICAgICBleHByZXNzaW9uKz1EYXRhSW50ZXJjaGFuZ2VFeHByZXNzaW9uICd9JyAoJ2xvb2t1cCcgJ3snICd9Jyk/ICgnZm9ybWF0JyAneycgJ30nKT8gKGFtYmlndWl0eSkgKCdtYXBwaW5nJyAneycgJ30nKT8gKCdrZXlzJyAneycgJ30nKT8gJ2V4cG9ydEZpbHRlcicgJ3snIGV4cG9ydEZpbHRlcj1EYXRhSW50ZXJjaGFuZ2VFeHBvcnRGaWx0ZXIKKwkgKiAgICAgZXhwcmVzc2lvbis9RGF0YUludGVyY2hhbmdlRXhwcmVzc2lvbiAnfScgKCdsb29rdXAnICd7JyAnfScpPyAoJ2Zvcm1hdCcgJ3snICd9Jyk/IChhbWJpZ3VpdHkpICgnbWFwcGluZycgJ3snICd9Jyk/ICgna2V5cycgJ3snICd9Jyk/IChydWxlIGVuZCkKKwkgKiAgICAgZm9ybWF0Kz1EYXRhSW50ZXJjaGFuZ2VGb3JtYXQgJ30nIChhbWJpZ3VpdHkpICdtYXBwaW5nJyAneycgbWFwcGluZ3MrPURhdGFJbnRlcmNoYW5nZU1hcHBpbmcKKwkgKiAgICAgZm9ybWF0Kz1EYXRhSW50ZXJjaGFuZ2VGb3JtYXQgJ30nIChhbWJpZ3VpdHkpICgnbWFwcGluZycgJ3snICd9Jyk/ICdrZXlzJyAneycgbG9va3VwS2V5cys9RGF0YUludGVyY2hhbmdlS2V5CisJICogICAgIGZvcm1hdCs9RGF0YUludGVyY2hhbmdlRm9ybWF0ICd9JyAoYW1iaWd1aXR5KSAoJ21hcHBpbmcnICd7JyAnfScpPyAoJ2tleXMnICd7JyAnfScpPyAnZXhwb3J0RmlsdGVyJyAneycgZXhwb3J0RmlsdGVyPURhdGFJbnRlcmNoYW5nZUV4cG9ydEZpbHRlcgorCSAqICAgICBmb3JtYXQrPURhdGFJbnRlcmNoYW5nZUZvcm1hdCAnfScgKGFtYmlndWl0eSkgKCdtYXBwaW5nJyAneycgJ30nKT8gKCdrZXlzJyAneycgJ30nKT8gKHJ1bGUgZW5kKQorCSAqICAgICBsYXRlc3RFeHBQcm9wZXJ0eT1bTEVudGl0eUF0dHJpYnV0ZXxJRF0gKCdleHByZXNzaW9uJyAneycgJ30nKT8gKCdsb29rdXAnICd7JyAnfScpPyAoJ2Zvcm1hdCcgJ3snICd9Jyk/IChhbWJpZ3VpdHkpICdtYXBwaW5nJyAneycgbWFwcGluZ3MrPURhdGFJbnRlcmNoYW5nZU1hcHBpbmcKKwkgKiAgICAgbGF0ZXN0RXhwUHJvcGVydHk9W0xFbnRpdHlBdHRyaWJ1dGV8SURdICgnZXhwcmVzc2lvbicgJ3snICd9Jyk/ICgnbG9va3VwJyAneycgJ30nKT8gKCdmb3JtYXQnICd7JyAnfScpPyAoYW1iaWd1aXR5KSAoJ21hcHBpbmcnICd7JyAnfScpPyAna2V5cycgJ3snIGxvb2t1cEtleXMrPURhdGFJbnRlcmNoYW5nZUtleQorCSAqICAgICBsYXRlc3RFeHBQcm9wZXJ0eT1bTEVudGl0eUF0dHJpYnV0ZXxJRF0gKCdleHByZXNzaW9uJyAneycgJ30nKT8gKCdsb29rdXAnICd7JyAnfScpPyAoJ2Zvcm1hdCcgJ3snICd9Jyk/IChhbWJpZ3VpdHkpICgnbWFwcGluZycgJ3snICd9Jyk/ICgna2V5cycgJ3snICd9Jyk/IChydWxlIGVuZCkKKwkgKiAgICAgbGF0ZXN0UHJvcGVydHk9W0xFbnRpdHlBdHRyaWJ1dGV8SURdICgnZXhwcmVzc2lvbicgJ3snICd9Jyk/ICgnbG9va3VwJyAneycgJ30nKT8gKCdmb3JtYXQnICd7JyAnfScpPyAoYW1iaWd1aXR5KSAnbWFwcGluZycgJ3snIG1hcHBpbmdzKz1EYXRhSW50ZXJjaGFuZ2VNYXBwaW5nCisJICogICAgIGxhdGVzdFByb3BlcnR5PVtMRW50aXR5QXR0cmlidXRlfElEXSAoJ2V4cHJlc3Npb24nICd7JyAnfScpPyAoJ2xvb2t1cCcgJ3snICd9Jyk/ICgnZm9ybWF0JyAneycgJ30nKT8gKGFtYmlndWl0eSkgKCdtYXBwaW5nJyAneycgJ30nKT8gJ2tleXMnICd7JyBsb29rdXBLZXlzKz1EYXRhSW50ZXJjaGFuZ2VLZXkKKwkgKiAgICAgbGF0ZXN0UHJvcGVydHk9W0xFbnRpdHlBdHRyaWJ1dGV8SURdICgnZXhwcmVzc2lvbicgJ3snICd9Jyk/ICgnbG9va3VwJyAneycgJ30nKT8gKCdmb3JtYXQnICd7JyAnfScpPyAoYW1iaWd1aXR5KSAoJ21hcHBpbmcnICd7JyAnfScpPyAoJ2tleXMnICd7JyAnfScpPyAocnVsZSBlbmQpCisJICogICAgIGxvb2t1cCs9RGF0YUludGVyY2hhbmdlTG9va3VwICd9JyAoJ2Zvcm1hdCcgJ3snICd9Jyk/IChhbWJpZ3VpdHkpICdtYXBwaW5nJyAneycgbWFwcGluZ3MrPURhdGFJbnRlcmNoYW5nZU1hcHBpbmcKKwkgKiAgICAgbG9va3VwKz1EYXRhSW50ZXJjaGFuZ2VMb29rdXAgJ30nICgnZm9ybWF0JyAneycgJ30nKT8gKGFtYmlndWl0eSkgKCdtYXBwaW5nJyAneycgJ30nKT8gJ2tleXMnICd7JyBsb29rdXBLZXlzKz1EYXRhSW50ZXJjaGFuZ2VLZXkKKwkgKiAgICAgbG9va3VwKz1EYXRhSW50ZXJjaGFuZ2VMb29rdXAgJ30nICgnZm9ybWF0JyAneycgJ30nKT8gKGFtYmlndWl0eSkgKCdtYXBwaW5nJyAneycgJ30nKT8gKCdrZXlzJyAneycgJ30nKT8gJ2V4cG9ydEZpbHRlcicgJ3snIGV4cG9ydEZpbHRlcj1EYXRhSW50ZXJjaGFuZ2VFeHBvcnRGaWx0ZXIKKwkgKiAgICAgbG9va3VwKz1EYXRhSW50ZXJjaGFuZ2VMb29rdXAgJ30nICgnZm9ybWF0JyAneycgJ30nKT8gKGFtYmlndWl0eSkgKCdtYXBwaW5nJyAneycgJ30nKT8gKCdrZXlzJyAneycgJ30nKT8gKHJ1bGUgZW5kKQorCSAqICAgICBub2RlTmFtZT1TVFJJTkcgKCdleHByZXNzaW9uJyAneycgJ30nKT8gKCdsb29rdXAnICd7JyAnfScpPyAoJ2Zvcm1hdCcgJ3snICd9Jyk/IChhbWJpZ3VpdHkpICdtYXBwaW5nJyAneycgbWFwcGluZ3MrPURhdGFJbnRlcmNoYW5nZU1hcHBpbmcKKwkgKiAgICAgbm9kZU5hbWU9U1RSSU5HICgnZXhwcmVzc2lvbicgJ3snICd9Jyk/ICgnbG9va3VwJyAneycgJ30nKT8gKCdmb3JtYXQnICd7JyAnfScpPyAoYW1iaWd1aXR5KSAoJ21hcHBpbmcnICd7JyAnfScpPyAna2V5cycgJ3snIGxvb2t1cEtleXMrPURhdGFJbnRlcmNoYW5nZUtleQorCSAqICAgICBub2RlTmFtZT1TVFJJTkcgKCdleHByZXNzaW9uJyAneycgJ30nKT8gKCdsb29rdXAnICd7JyAnfScpPyAoJ2Zvcm1hdCcgJ3snICd9Jyk/IChhbWJpZ3VpdHkpICgnbWFwcGluZycgJ3snICd9Jyk/ICgna2V5cycgJ3snICd9Jyk/ICdleHBvcnRGaWx0ZXInICd7JyBleHBvcnRGaWx0ZXI9RGF0YUludGVyY2hhbmdlRXhwb3J0RmlsdGVyCisJICogICAgIG5vZGVOYW1lPVNUUklORyAoJ2V4cHJlc3Npb24nICd7JyAnfScpPyAoJ2xvb2t1cCcgJ3snICd9Jyk/ICgnZm9ybWF0JyAneycgJ30nKT8gKGFtYmlndWl0eSkgKCdtYXBwaW5nJyAneycgJ30nKT8gKCdrZXlzJyAneycgJ30nKT8gKHJ1bGUgZW5kKQorCSAqLworCXByb3RlY3RlZCB2b2lkIGVtaXRfRGF0YUludGVyY2hhbmdlQmVhbl9fX0V4cG9zZUtleXdvcmRfMTBfMF9MZWZ0Q3VybHlCcmFja2V0S2V5d29yZF8xMF8xX1JpZ2h0Q3VybHlCcmFja2V0S2V5d29yZF8xMF8zX19xKEVPYmplY3Qgc2VtYW50aWNPYmplY3QsIElTeW5OYXZpZ2FibGUgdHJhbnNpdGlvbiwgTGlzdDxJTm9kZT4gbm9kZXMpIHsKKwkJYWNjZXB0Tm9kZXModHJhbnNpdGlvbiwgbm9kZXMpOworCX0KKwkKKwkvKioKKwkgKiBBbWJpZ3VvdXMgc3ludGF4OgogCSAqICAgICAoJ2V4cHJlc3Npb24nICd7JyAnfScpPwogCSAqCiAJICogVGhpcyBhbWJpZ3VvdXMgc3ludGF4IG9jY3VycyBhdDoKKwkgKiAgICAgKAorCSAqICAgICAgICAgbGF0ZXN0RXhwUHJvcGVydHk9W0xFbnRpdHlBdHRyaWJ1dGV8SURdIAorCSAqICAgICAgICAgKGFtYmlndWl0eSkgCisJICogICAgICAgICAoJ2xvb2t1cCcgJ3snICd9Jyk/IAorCSAqICAgICAgICAgKCdmb3JtYXQnICd7JyAnfScpPyAKKwkgKiAgICAgICAgICgnZXhwb3NlJyAneycgJ30nKT8gCisJICogICAgICAgICAoJ21hcHBpbmcnICd7JyAnfScpPyAKKwkgKiAgICAgICAgICgna2V5cycgJ3snICd9Jyk/IAorCSAqICAgICAgICAgJ2V4cG9ydEZpbHRlcicgCisJICogICAgICAgICAneycgCisJICogICAgICAgICBleHBvcnRGaWx0ZXI9RGF0YUludGVyY2hhbmdlRXhwb3J0RmlsdGVyCisJICogICAgICkKIAkgKiAgICAgZWxlbWVudE1hcD1TVFJJTkcgKGFtYmlndWl0eSkgJ2xvb2t1cCcgJ3snIGxvb2t1cCs9RGF0YUludGVyY2hhbmdlTG9va3VwCiAJICogICAgIGVsZW1lbnRNYXA9U1RSSU5HIChhbWJpZ3VpdHkpICgnbG9va3VwJyAneycgJ30nKT8gJ2Zvcm1hdCcgJ3snIGZvcm1hdCs9RGF0YUludGVyY2hhbmdlRm9ybWF0Ci0JICogICAgIGVsZW1lbnRNYXA9U1RSSU5HIChhbWJpZ3VpdHkpICgnbG9va3VwJyAneycgJ30nKT8gKCdmb3JtYXQnICd7JyAnfScpPyAnbWFwcGluZycgJ3snIG1hcHBpbmdzKz1EYXRhSW50ZXJjaGFuZ2VNYXBwaW5nCi0JICogICAgIGVsZW1lbnRNYXA9U1RSSU5HIChhbWJpZ3VpdHkpICgnbG9va3VwJyAneycgJ30nKT8gKCdmb3JtYXQnICd7JyAnfScpPyAoJ21hcHBpbmcnICd7JyAnfScpPyAna2V5cycgJ3snIGxvb2t1cEtleXMrPURhdGFJbnRlcmNoYW5nZUtleQotCSAqICAgICBlbGVtZW50TWFwPVNUUklORyAoYW1iaWd1aXR5KSAoJ2xvb2t1cCcgJ3snICd9Jyk/ICgnZm9ybWF0JyAneycgJ30nKT8gKCdtYXBwaW5nJyAneycgJ30nKT8gKCdrZXlzJyAneycgJ30nKT8gKHJ1bGUgZW5kKQorCSAqICAgICBlbGVtZW50TWFwPVNUUklORyAoYW1iaWd1aXR5KSAoJ2xvb2t1cCcgJ3snICd9Jyk/ICgnZm9ybWF0JyAneycgJ30nKT8gJ2V4cG9zZScgJ3snIGV4cG9ydEV4cG9zZXMrPURhdGFJbnRlcmNoYW5nZUV4cG9zZQorCSAqICAgICBlbGVtZW50TWFwPVNUUklORyAoYW1iaWd1aXR5KSAoJ2xvb2t1cCcgJ3snICd9Jyk/ICgnZm9ybWF0JyAneycgJ30nKT8gKCdleHBvc2UnICd7JyAnfScpPyAnbWFwcGluZycgJ3snIG1hcHBpbmdzKz1EYXRhSW50ZXJjaGFuZ2VNYXBwaW5nCisJICogICAgIGVsZW1lbnRNYXA9U1RSSU5HIChhbWJpZ3VpdHkpICgnbG9va3VwJyAneycgJ30nKT8gKCdmb3JtYXQnICd7JyAnfScpPyAoJ2V4cG9zZScgJ3snICd9Jyk/ICgnbWFwcGluZycgJ3snICd9Jyk/ICdrZXlzJyAneycgbG9va3VwS2V5cys9RGF0YUludGVyY2hhbmdlS2V5CisJICogICAgIGVsZW1lbnRNYXA9U1RSSU5HIChhbWJpZ3VpdHkpICgnbG9va3VwJyAneycgJ30nKT8gKCdmb3JtYXQnICd7JyAnfScpPyAoJ2V4cG9zZScgJ3snICd9Jyk/ICgnbWFwcGluZycgJ3snICd9Jyk/ICgna2V5cycgJ3snICd9Jyk/ICdleHBvcnRGaWx0ZXInICd7JyBleHBvcnRGaWx0ZXI9RGF0YUludGVyY2hhbmdlRXhwb3J0RmlsdGVyCisJICogICAgIGVsZW1lbnRNYXA9U1RSSU5HIChhbWJpZ3VpdHkpICgnbG9va3VwJyAneycgJ30nKT8gKCdmb3JtYXQnICd7JyAnfScpPyAoJ2V4cG9zZScgJ3snICd9Jyk/ICgnbWFwcGluZycgJ3snICd9Jyk/ICgna2V5cycgJ3snICd9Jyk/IChydWxlIGVuZCkKIAkgKiAgICAgZW50aXR5PVtMRW50aXR5fExGUU5dIChhbWJpZ3VpdHkpICdsb29rdXAnICd7JyBsb29rdXArPURhdGFJbnRlcmNoYW5nZUxvb2t1cAogCSAqICAgICBlbnRpdHk9W0xFbnRpdHl8TEZRTl0gKGFtYmlndWl0eSkgKCdsb29rdXAnICd7JyAnfScpPyAnZm9ybWF0JyAneycgZm9ybWF0Kz1EYXRhSW50ZXJjaGFuZ2VGb3JtYXQKLQkgKiAgICAgZW50aXR5PVtMRW50aXR5fExGUU5dIChhbWJpZ3VpdHkpICgnbG9va3VwJyAneycgJ30nKT8gKCdmb3JtYXQnICd7JyAnfScpPyAnbWFwcGluZycgJ3snIG1hcHBpbmdzKz1EYXRhSW50ZXJjaGFuZ2VNYXBwaW5nCi0JICogICAgIGVudGl0eT1bTEVudGl0eXxMRlFOXSAoYW1iaWd1aXR5KSAoJ2xvb2t1cCcgJ3snICd9Jyk/ICgnZm9ybWF0JyAneycgJ30nKT8gKCdtYXBwaW5nJyAneycgJ30nKT8gJ2tleXMnICd7JyBsb29rdXBLZXlzKz1EYXRhSW50ZXJjaGFuZ2VLZXkKLQkgKiAgICAgZW50aXR5PVtMRW50aXR5fExGUU5dIChhbWJpZ3VpdHkpICgnbG9va3VwJyAneycgJ30nKT8gKCdmb3JtYXQnICd7JyAnfScpPyAoJ21hcHBpbmcnICd7JyAnfScpPyAoJ2tleXMnICd7JyAnfScpPyAocnVsZSBlbmQpCisJICogICAgIGVudGl0eT1bTEVudGl0eXxMRlFOXSAoYW1iaWd1aXR5KSAoJ2xvb2t1cCcgJ3snICd9Jyk/ICgnZm9ybWF0JyAneycgJ30nKT8gJ2V4cG9zZScgJ3snIGV4cG9ydEV4cG9zZXMrPURhdGFJbnRlcmNoYW5nZUV4cG9zZQorCSAqICAgICBlbnRpdHk9W0xFbnRpdHl8TEZRTl0gKGFtYmlndWl0eSkgKCdsb29rdXAnICd7JyAnfScpPyAoJ2Zvcm1hdCcgJ3snICd9Jyk/ICgnZXhwb3NlJyAneycgJ30nKT8gJ21hcHBpbmcnICd7JyBtYXBwaW5ncys9RGF0YUludGVyY2hhbmdlTWFwcGluZworCSAqICAgICBlbnRpdHk9W0xFbnRpdHl8TEZRTl0gKGFtYmlndWl0eSkgKCdsb29rdXAnICd7JyAnfScpPyAoJ2Zvcm1hdCcgJ3snICd9Jyk/ICgnZXhwb3NlJyAneycgJ30nKT8gKCdtYXBwaW5nJyAneycgJ30nKT8gJ2tleXMnICd7JyBsb29rdXBLZXlzKz1EYXRhSW50ZXJjaGFuZ2VLZXkKKwkgKiAgICAgZW50aXR5PVtMRW50aXR5fExGUU5dIChhbWJpZ3VpdHkpICgnbG9va3VwJyAneycgJ30nKT8gKCdmb3JtYXQnICd7JyAnfScpPyAoJ2V4cG9zZScgJ3snICd9Jyk/ICgnbWFwcGluZycgJ3snICd9Jyk/ICgna2V5cycgJ3snICd9Jyk/ICdleHBvcnRGaWx0ZXInICd7JyBleHBvcnRGaWx0ZXI9RGF0YUludGVyY2hhbmdlRXhwb3J0RmlsdGVyCisJICogICAgIGVudGl0eT1bTEVudGl0eXxMRlFOXSAoYW1iaWd1aXR5KSAoJ2xvb2t1cCcgJ3snICd9Jyk/ICgnZm9ybWF0JyAneycgJ30nKT8gKCdleHBvc2UnICd7JyAnfScpPyAoJ21hcHBpbmcnICd7JyAnfScpPyAoJ2tleXMnICd7JyAnfScpPyAocnVsZSBlbmQpCisJICogICAgIGxhdGVzdEV4cFByb3BlcnR5PVtMRW50aXR5QXR0cmlidXRlfElEXSAoYW1iaWd1aXR5KSAnbG9va3VwJyAneycgbG9va3VwKz1EYXRhSW50ZXJjaGFuZ2VMb29rdXAKKwkgKiAgICAgbGF0ZXN0RXhwUHJvcGVydHk9W0xFbnRpdHlBdHRyaWJ1dGV8SURdIChhbWJpZ3VpdHkpICgnbG9va3VwJyAneycgJ30nKT8gJ2Zvcm1hdCcgJ3snIGZvcm1hdCs9RGF0YUludGVyY2hhbmdlRm9ybWF0CisJICogICAgIGxhdGVzdEV4cFByb3BlcnR5PVtMRW50aXR5QXR0cmlidXRlfElEXSAoYW1iaWd1aXR5KSAoJ2xvb2t1cCcgJ3snICd9Jyk/ICgnZm9ybWF0JyAneycgJ30nKT8gJ2V4cG9zZScgJ3snIGV4cG9ydEV4cG9zZXMrPURhdGFJbnRlcmNoYW5nZUV4cG9zZQorCSAqICAgICBsYXRlc3RFeHBQcm9wZXJ0eT1bTEVudGl0eUF0dHJpYnV0ZXxJRF0gKGFtYmlndWl0eSkgKCdsb29rdXAnICd7JyAnfScpPyAoJ2Zvcm1hdCcgJ3snICd9Jyk/ICgnZXhwb3NlJyAneycgJ30nKT8gJ21hcHBpbmcnICd7JyBtYXBwaW5ncys9RGF0YUludGVyY2hhbmdlTWFwcGluZworCSAqICAgICBsYXRlc3RFeHBQcm9wZXJ0eT1bTEVudGl0eUF0dHJpYnV0ZXxJRF0gKGFtYmlndWl0eSkgKCdsb29rdXAnICd7JyAnfScpPyAoJ2Zvcm1hdCcgJ3snICd9Jyk/ICgnZXhwb3NlJyAneycgJ30nKT8gKCdtYXBwaW5nJyAneycgJ30nKT8gJ2tleXMnICd7JyBsb29rdXBLZXlzKz1EYXRhSW50ZXJjaGFuZ2VLZXkKKwkgKiAgICAgbGF0ZXN0RXhwUHJvcGVydHk9W0xFbnRpdHlBdHRyaWJ1dGV8SURdIChhbWJpZ3VpdHkpICgnbG9va3VwJyAneycgJ30nKT8gKCdmb3JtYXQnICd7JyAnfScpPyAoJ2V4cG9zZScgJ3snICd9Jyk/ICgnbWFwcGluZycgJ3snICd9Jyk/ICgna2V5cycgJ3snICd9Jyk/IChydWxlIGVuZCkKIAkgKiAgICAgbGF0ZXN0UHJvcGVydHk9W0xFbnRpdHlBdHRyaWJ1dGV8SURdIChhbWJpZ3VpdHkpICdsb29rdXAnICd7JyBsb29rdXArPURhdGFJbnRlcmNoYW5nZUxvb2t1cAogCSAqICAgICBsYXRlc3RQcm9wZXJ0eT1bTEVudGl0eUF0dHJpYnV0ZXxJRF0gKGFtYmlndWl0eSkgKCdsb29rdXAnICd7JyAnfScpPyAnZm9ybWF0JyAneycgZm9ybWF0Kz1EYXRhSW50ZXJjaGFuZ2VGb3JtYXQKLQkgKiAgICAgbGF0ZXN0UHJvcGVydHk9W0xFbnRpdHlBdHRyaWJ1dGV8SURdIChhbWJpZ3VpdHkpICgnbG9va3VwJyAneycgJ30nKT8gKCdmb3JtYXQnICd7JyAnfScpPyAnbWFwcGluZycgJ3snIG1hcHBpbmdzKz1EYXRhSW50ZXJjaGFuZ2VNYXBwaW5nCi0JICogICAgIGxhdGVzdFByb3BlcnR5PVtMRW50aXR5QXR0cmlidXRlfElEXSAoYW1iaWd1aXR5KSAoJ2xvb2t1cCcgJ3snICd9Jyk/ICgnZm9ybWF0JyAneycgJ30nKT8gKCdtYXBwaW5nJyAneycgJ30nKT8gJ2tleXMnICd7JyBsb29rdXBLZXlzKz1EYXRhSW50ZXJjaGFuZ2VLZXkKLQkgKiAgICAgbGF0ZXN0UHJvcGVydHk9W0xFbnRpdHlBdHRyaWJ1dGV8SURdIChhbWJpZ3VpdHkpICgnbG9va3VwJyAneycgJ30nKT8gKCdmb3JtYXQnICd7JyAnfScpPyAoJ21hcHBpbmcnICd7JyAnfScpPyAoJ2tleXMnICd7JyAnfScpPyAocnVsZSBlbmQpCisJICogICAgIGxhdGVzdFByb3BlcnR5PVtMRW50aXR5QXR0cmlidXRlfElEXSAoYW1iaWd1aXR5KSAoJ2xvb2t1cCcgJ3snICd9Jyk/ICgnZm9ybWF0JyAneycgJ30nKT8gJ2V4cG9zZScgJ3snIGV4cG9ydEV4cG9zZXMrPURhdGFJbnRlcmNoYW5nZUV4cG9zZQorCSAqICAgICBsYXRlc3RQcm9wZXJ0eT1bTEVudGl0eUF0dHJpYnV0ZXxJRF0gKGFtYmlndWl0eSkgKCdsb29rdXAnICd7JyAnfScpPyAoJ2Zvcm1hdCcgJ3snICd9Jyk/ICgnZXhwb3NlJyAneycgJ30nKT8gJ21hcHBpbmcnICd7JyBtYXBwaW5ncys9RGF0YUludGVyY2hhbmdlTWFwcGluZworCSAqICAgICBsYXRlc3RQcm9wZXJ0eT1bTEVudGl0eUF0dHJpYnV0ZXxJRF0gKGFtYmlndWl0eSkgKCdsb29rdXAnICd7JyAnfScpPyAoJ2Zvcm1hdCcgJ3snICd9Jyk/ICgnZXhwb3NlJyAneycgJ30nKT8gKCdtYXBwaW5nJyAneycgJ30nKT8gJ2tleXMnICd7JyBsb29rdXBLZXlzKz1EYXRhSW50ZXJjaGFuZ2VLZXkKKwkgKiAgICAgbGF0ZXN0UHJvcGVydHk9W0xFbnRpdHlBdHRyaWJ1dGV8SURdIChhbWJpZ3VpdHkpICgnbG9va3VwJyAneycgJ30nKT8gKCdmb3JtYXQnICd7JyAnfScpPyAoJ2V4cG9zZScgJ3snICd9Jyk/ICgnbWFwcGluZycgJ3snICd9Jyk/ICgna2V5cycgJ3snICd9Jyk/ICdleHBvcnRGaWx0ZXInICd7JyBleHBvcnRGaWx0ZXI9RGF0YUludGVyY2hhbmdlRXhwb3J0RmlsdGVyCisJICogICAgIGxhdGVzdFByb3BlcnR5PVtMRW50aXR5QXR0cmlidXRlfElEXSAoYW1iaWd1aXR5KSAoJ2xvb2t1cCcgJ3snICd9Jyk/ICgnZm9ybWF0JyAneycgJ30nKT8gKCdleHBvc2UnICd7JyAnfScpPyAoJ21hcHBpbmcnICd7JyAnfScpPyAoJ2tleXMnICd7JyAnfScpPyAocnVsZSBlbmQpCiAJICogICAgIG5vZGVOYW1lPVNUUklORyAoYW1iaWd1aXR5KSAnbG9va3VwJyAneycgbG9va3VwKz1EYXRhSW50ZXJjaGFuZ2VMb29rdXAKIAkgKiAgICAgbm9kZU5hbWU9U1RSSU5HIChhbWJpZ3VpdHkpICgnbG9va3VwJyAneycgJ30nKT8gJ2Zvcm1hdCcgJ3snIGZvcm1hdCs9RGF0YUludGVyY2hhbmdlRm9ybWF0Ci0JICogICAgIG5vZGVOYW1lPVNUUklORyAoYW1iaWd1aXR5KSAoJ2xvb2t1cCcgJ3snICd9Jyk/ICgnZm9ybWF0JyAneycgJ30nKT8gJ21hcHBpbmcnICd7JyBtYXBwaW5ncys9RGF0YUludGVyY2hhbmdlTWFwcGluZwotCSAqICAgICBub2RlTmFtZT1TVFJJTkcgKGFtYmlndWl0eSkgKCdsb29rdXAnICd7JyAnfScpPyAoJ2Zvcm1hdCcgJ3snICd9Jyk/ICgnbWFwcGluZycgJ3snICd9Jyk/ICdrZXlzJyAneycgbG9va3VwS2V5cys9RGF0YUludGVyY2hhbmdlS2V5Ci0JICogICAgIG5vZGVOYW1lPVNUUklORyAoYW1iaWd1aXR5KSAoJ2xvb2t1cCcgJ3snICd9Jyk/ICgnZm9ybWF0JyAneycgJ30nKT8gKCdtYXBwaW5nJyAneycgJ30nKT8gKCdrZXlzJyAneycgJ30nKT8gKHJ1bGUgZW5kKQorCSAqICAgICBub2RlTmFtZT1TVFJJTkcgKGFtYmlndWl0eSkgKCdsb29rdXAnICd7JyAnfScpPyAoJ2Zvcm1hdCcgJ3snICd9Jyk/ICdleHBvc2UnICd7JyBleHBvcnRFeHBvc2VzKz1EYXRhSW50ZXJjaGFuZ2VFeHBvc2UKKwkgKiAgICAgbm9kZU5hbWU9U1RSSU5HIChhbWJpZ3VpdHkpICgnbG9va3VwJyAneycgJ30nKT8gKCdmb3JtYXQnICd7JyAnfScpPyAoJ2V4cG9zZScgJ3snICd9Jyk/ICdtYXBwaW5nJyAneycgbWFwcGluZ3MrPURhdGFJbnRlcmNoYW5nZU1hcHBpbmcKKwkgKiAgICAgbm9kZU5hbWU9U1RSSU5HIChhbWJpZ3VpdHkpICgnbG9va3VwJyAneycgJ30nKT8gKCdmb3JtYXQnICd7JyAnfScpPyAoJ2V4cG9zZScgJ3snICd9Jyk/ICgnbWFwcGluZycgJ3snICd9Jyk/ICdrZXlzJyAneycgbG9va3VwS2V5cys9RGF0YUludGVyY2hhbmdlS2V5CisJICogICAgIG5vZGVOYW1lPVNUUklORyAoYW1iaWd1aXR5KSAoJ2xvb2t1cCcgJ3snICd9Jyk/ICgnZm9ybWF0JyAneycgJ30nKT8gKCdleHBvc2UnICd7JyAnfScpPyAoJ21hcHBpbmcnICd7JyAnfScpPyAoJ2tleXMnICd7JyAnfScpPyAnZXhwb3J0RmlsdGVyJyAneycgZXhwb3J0RmlsdGVyPURhdGFJbnRlcmNoYW5nZUV4cG9ydEZpbHRlcgorCSAqICAgICBub2RlTmFtZT1TVFJJTkcgKGFtYmlndWl0eSkgKCdsb29rdXAnICd7JyAnfScpPyAoJ2Zvcm1hdCcgJ3snICd9Jyk/ICgnZXhwb3NlJyAneycgJ30nKT8gKCdtYXBwaW5nJyAneycgJ30nKT8gKCdrZXlzJyAneycgJ30nKT8gKHJ1bGUgZW5kKQogCSAqLwotCXByb3RlY3RlZCB2b2lkIGVtaXRfRGF0YUludGVyY2hhbmdlQmVhbl9fX0V4cHJlc3Npb25LZXl3b3JkXzZfMF9MZWZ0Q3VybHlCcmFja2V0S2V5d29yZF82XzFfUmlnaHRDdXJseUJyYWNrZXRLZXl3b3JkXzZfM19fcShFT2JqZWN0IHNlbWFudGljT2JqZWN0LCBJU3luTmF2aWdhYmxlIHRyYW5zaXRpb24sIExpc3Q8SU5vZGU+IG5vZGVzKSB7CisJcHJvdGVjdGVkIHZvaWQgZW1pdF9EYXRhSW50ZXJjaGFuZ2VCZWFuX19fRXhwcmVzc2lvbktleXdvcmRfN18wX0xlZnRDdXJseUJyYWNrZXRLZXl3b3JkXzdfMV9SaWdodEN1cmx5QnJhY2tldEtleXdvcmRfN18zX19xKEVPYmplY3Qgc2VtYW50aWNPYmplY3QsIElTeW5OYXZpZ2FibGUgdHJhbnNpdGlvbiwgTGlzdDxJTm9kZT4gbm9kZXMpIHsKIAkJYWNjZXB0Tm9kZXModHJhbnNpdGlvbiwgbm9kZXMpOwogCX0KIAkKQEAgLTE2OCwyNiArMjY4LDY1IEBACiAJICogICAgICgnZm9ybWF0JyAneycgJ30nKT8KIAkgKgogCSAqIFRoaXMgYW1iaWd1b3VzIHN5bnRheCBvY2N1cnMgYXQ6Ci0JICogICAgIGVsZW1lbnRNYXA9U1RSSU5HICgnZXhwcmVzc2lvbicgJ3snICd9Jyk/ICgnbG9va3VwJyAneycgJ30nKT8gKGFtYmlndWl0eSkgJ21hcHBpbmcnICd7JyBtYXBwaW5ncys9RGF0YUludGVyY2hhbmdlTWFwcGluZwotCSAqICAgICBlbGVtZW50TWFwPVNUUklORyAoJ2V4cHJlc3Npb24nICd7JyAnfScpPyAoJ2xvb2t1cCcgJ3snICd9Jyk/IChhbWJpZ3VpdHkpICgnbWFwcGluZycgJ3snICd9Jyk/ICdrZXlzJyAneycgbG9va3VwS2V5cys9RGF0YUludGVyY2hhbmdlS2V5Ci0JICogICAgIGVsZW1lbnRNYXA9U1RSSU5HICgnZXhwcmVzc2lvbicgJ3snICd9Jyk/ICgnbG9va3VwJyAneycgJ30nKT8gKGFtYmlndWl0eSkgKCdtYXBwaW5nJyAneycgJ30nKT8gKCdrZXlzJyAneycgJ30nKT8gKHJ1bGUgZW5kKQotCSAqICAgICBlbnRpdHk9W0xFbnRpdHl8TEZRTl0gKCdleHByZXNzaW9uJyAneycgJ30nKT8gKCdsb29rdXAnICd7JyAnfScpPyAoYW1iaWd1aXR5KSAnbWFwcGluZycgJ3snIG1hcHBpbmdzKz1EYXRhSW50ZXJjaGFuZ2VNYXBwaW5nCi0JICogICAgIGVudGl0eT1bTEVudGl0eXxMRlFOXSAoJ2V4cHJlc3Npb24nICd7JyAnfScpPyAoJ2xvb2t1cCcgJ3snICd9Jyk/IChhbWJpZ3VpdHkpICgnbWFwcGluZycgJ3snICd9Jyk/ICdrZXlzJyAneycgbG9va3VwS2V5cys9RGF0YUludGVyY2hhbmdlS2V5Ci0JICogICAgIGVudGl0eT1bTEVudGl0eXxMRlFOXSAoJ2V4cHJlc3Npb24nICd7JyAnfScpPyAoJ2xvb2t1cCcgJ3snICd9Jyk/IChhbWJpZ3VpdHkpICgnbWFwcGluZycgJ3snICd9Jyk/ICgna2V5cycgJ3snICd9Jyk/IChydWxlIGVuZCkKLQkgKiAgICAgZXhwcmVzc2lvbis9RGF0YUludGVyY2hhbmdlRXhwcmVzc2lvbiAnfScgKCdsb29rdXAnICd7JyAnfScpPyAoYW1iaWd1aXR5KSAnbWFwcGluZycgJ3snIG1hcHBpbmdzKz1EYXRhSW50ZXJjaGFuZ2VNYXBwaW5nCi0JICogICAgIGV4cHJlc3Npb24rPURhdGFJbnRlcmNoYW5nZUV4cHJlc3Npb24gJ30nICgnbG9va3VwJyAneycgJ30nKT8gKGFtYmlndWl0eSkgKCdtYXBwaW5nJyAneycgJ30nKT8gJ2tleXMnICd7JyBsb29rdXBLZXlzKz1EYXRhSW50ZXJjaGFuZ2VLZXkKLQkgKiAgICAgZXhwcmVzc2lvbis9RGF0YUludGVyY2hhbmdlRXhwcmVzc2lvbiAnfScgKCdsb29rdXAnICd7JyAnfScpPyAoYW1iaWd1aXR5KSAoJ21hcHBpbmcnICd7JyAnfScpPyAoJ2tleXMnICd7JyAnfScpPyAocnVsZSBlbmQpCi0JICogICAgIGxhdGVzdFByb3BlcnR5PVtMRW50aXR5QXR0cmlidXRlfElEXSAoJ2V4cHJlc3Npb24nICd7JyAnfScpPyAoJ2xvb2t1cCcgJ3snICd9Jyk/IChhbWJpZ3VpdHkpICdtYXBwaW5nJyAneycgbWFwcGluZ3MrPURhdGFJbnRlcmNoYW5nZU1hcHBpbmcKLQkgKiAgICAgbGF0ZXN0UHJvcGVydHk9W0xFbnRpdHlBdHRyaWJ1dGV8SURdICgnZXhwcmVzc2lvbicgJ3snICd9Jyk/ICgnbG9va3VwJyAneycgJ30nKT8gKGFtYmlndWl0eSkgKCdtYXBwaW5nJyAneycgJ30nKT8gJ2tleXMnICd7JyBsb29rdXBLZXlzKz1EYXRhSW50ZXJjaGFuZ2VLZXkKLQkgKiAgICAgbGF0ZXN0UHJvcGVydHk9W0xFbnRpdHlBdHRyaWJ1dGV8SURdICgnZXhwcmVzc2lvbicgJ3snICd9Jyk/ICgnbG9va3VwJyAneycgJ30nKT8gKGFtYmlndWl0eSkgKCdtYXBwaW5nJyAneycgJ30nKT8gKCdrZXlzJyAneycgJ30nKT8gKHJ1bGUgZW5kKQotCSAqICAgICBsb29rdXArPURhdGFJbnRlcmNoYW5nZUxvb2t1cCAnfScgKGFtYmlndWl0eSkgJ21hcHBpbmcnICd7JyBtYXBwaW5ncys9RGF0YUludGVyY2hhbmdlTWFwcGluZwotCSAqICAgICBsb29rdXArPURhdGFJbnRlcmNoYW5nZUxvb2t1cCAnfScgKGFtYmlndWl0eSkgKCdtYXBwaW5nJyAneycgJ30nKT8gJ2tleXMnICd7JyBsb29rdXBLZXlzKz1EYXRhSW50ZXJjaGFuZ2VLZXkKLQkgKiAgICAgbG9va3VwKz1EYXRhSW50ZXJjaGFuZ2VMb29rdXAgJ30nIChhbWJpZ3VpdHkpICgnbWFwcGluZycgJ3snICd9Jyk/ICgna2V5cycgJ3snICd9Jyk/IChydWxlIGVuZCkKLQkgKiAgICAgbm9kZU5hbWU9U1RSSU5HICgnZXhwcmVzc2lvbicgJ3snICd9Jyk/ICgnbG9va3VwJyAneycgJ30nKT8gKGFtYmlndWl0eSkgJ21hcHBpbmcnICd7JyBtYXBwaW5ncys9RGF0YUludGVyY2hhbmdlTWFwcGluZwotCSAqICAgICBub2RlTmFtZT1TVFJJTkcgKCdleHByZXNzaW9uJyAneycgJ30nKT8gKCdsb29rdXAnICd7JyAnfScpPyAoYW1iaWd1aXR5KSAoJ21hcHBpbmcnICd7JyAnfScpPyAna2V5cycgJ3snIGxvb2t1cEtleXMrPURhdGFJbnRlcmNoYW5nZUtleQotCSAqICAgICBub2RlTmFtZT1TVFJJTkcgKCdleHByZXNzaW9uJyAneycgJ30nKT8gKCdsb29rdXAnICd7JyAnfScpPyAoYW1iaWd1aXR5KSAoJ21hcHBpbmcnICd7JyAnfScpPyAoJ2tleXMnICd7JyAnfScpPyAocnVsZSBlbmQpCisJICogICAgICgKKwkgKiAgICAgICAgIGxhdGVzdEV4cFByb3BlcnR5PVtMRW50aXR5QXR0cmlidXRlfElEXSAKKwkgKiAgICAgICAgICgnZXhwcmVzc2lvbicgJ3snICd9Jyk/IAorCSAqICAgICAgICAgKCdsb29rdXAnICd7JyAnfScpPyAKKwkgKiAgICAgICAgIChhbWJpZ3VpdHkpIAorCSAqICAgICAgICAgKCdleHBvc2UnICd7JyAnfScpPyAKKwkgKiAgICAgICAgICgnbWFwcGluZycgJ3snICd9Jyk/IAorCSAqICAgICAgICAgKCdrZXlzJyAneycgJ30nKT8gCisJICogICAgICAgICAnZXhwb3J0RmlsdGVyJyAKKwkgKiAgICAgICAgICd7JyAKKwkgKiAgICAgICAgIGV4cG9ydEZpbHRlcj1EYXRhSW50ZXJjaGFuZ2VFeHBvcnRGaWx0ZXIKKwkgKiAgICAgKQorCSAqICAgICAoCisJICogICAgICAgICBsYXRlc3RQcm9wZXJ0eT1bTEVudGl0eUF0dHJpYnV0ZXxJRF0gCisJICogICAgICAgICAoJ2V4cHJlc3Npb24nICd7JyAnfScpPyAKKwkgKiAgICAgICAgICgnbG9va3VwJyAneycgJ30nKT8gCisJICogICAgICAgICAoYW1iaWd1aXR5KSAKKwkgKiAgICAgICAgICgnZXhwb3NlJyAneycgJ30nKT8gCisJICogICAgICAgICAoJ21hcHBpbmcnICd7JyAnfScpPyAKKwkgKiAgICAgICAgICgna2V5cycgJ3snICd9Jyk/IAorCSAqICAgICAgICAgJ2V4cG9ydEZpbHRlcicgCisJICogICAgICAgICAneycgCisJICogICAgICAgICBleHBvcnRGaWx0ZXI9RGF0YUludGVyY2hhbmdlRXhwb3J0RmlsdGVyCisJICogICAgICkKKwkgKiAgICAgZWxlbWVudE1hcD1TVFJJTkcgKCdleHByZXNzaW9uJyAneycgJ30nKT8gKCdsb29rdXAnICd7JyAnfScpPyAoYW1iaWd1aXR5KSAnZXhwb3NlJyAneycgZXhwb3J0RXhwb3Nlcys9RGF0YUludGVyY2hhbmdlRXhwb3NlCisJICogICAgIGVsZW1lbnRNYXA9U1RSSU5HICgnZXhwcmVzc2lvbicgJ3snICd9Jyk/ICgnbG9va3VwJyAneycgJ30nKT8gKGFtYmlndWl0eSkgKCdleHBvc2UnICd7JyAnfScpPyAnbWFwcGluZycgJ3snIG1hcHBpbmdzKz1EYXRhSW50ZXJjaGFuZ2VNYXBwaW5nCisJICogICAgIGVsZW1lbnRNYXA9U1RSSU5HICgnZXhwcmVzc2lvbicgJ3snICd9Jyk/ICgnbG9va3VwJyAneycgJ30nKT8gKGFtYmlndWl0eSkgKCdleHBvc2UnICd7JyAnfScpPyAoJ21hcHBpbmcnICd7JyAnfScpPyAna2V5cycgJ3snIGxvb2t1cEtleXMrPURhdGFJbnRlcmNoYW5nZUtleQorCSAqICAgICBlbGVtZW50TWFwPVNUUklORyAoJ2V4cHJlc3Npb24nICd7JyAnfScpPyAoJ2xvb2t1cCcgJ3snICd9Jyk/IChhbWJpZ3VpdHkpICgnZXhwb3NlJyAneycgJ30nKT8gKCdtYXBwaW5nJyAneycgJ30nKT8gKCdrZXlzJyAneycgJ30nKT8gJ2V4cG9ydEZpbHRlcicgJ3snIGV4cG9ydEZpbHRlcj1EYXRhSW50ZXJjaGFuZ2VFeHBvcnRGaWx0ZXIKKwkgKiAgICAgZWxlbWVudE1hcD1TVFJJTkcgKCdleHByZXNzaW9uJyAneycgJ30nKT8gKCdsb29rdXAnICd7JyAnfScpPyAoYW1iaWd1aXR5KSAoJ2V4cG9zZScgJ3snICd9Jyk/ICgnbWFwcGluZycgJ3snICd9Jyk/ICgna2V5cycgJ3snICd9Jyk/IChydWxlIGVuZCkKKwkgKiAgICAgZW50aXR5PVtMRW50aXR5fExGUU5dICgnZXhwcmVzc2lvbicgJ3snICd9Jyk/ICgnbG9va3VwJyAneycgJ30nKT8gKGFtYmlndWl0eSkgJ2V4cG9zZScgJ3snIGV4cG9ydEV4cG9zZXMrPURhdGFJbnRlcmNoYW5nZUV4cG9zZQorCSAqICAgICBlbnRpdHk9W0xFbnRpdHl8TEZRTl0gKCdleHByZXNzaW9uJyAneycgJ30nKT8gKCdsb29rdXAnICd7JyAnfScpPyAoYW1iaWd1aXR5KSAoJ2V4cG9zZScgJ3snICd9Jyk/ICdtYXBwaW5nJyAneycgbWFwcGluZ3MrPURhdGFJbnRlcmNoYW5nZU1hcHBpbmcKKwkgKiAgICAgZW50aXR5PVtMRW50aXR5fExGUU5dICgnZXhwcmVzc2lvbicgJ3snICd9Jyk/ICgnbG9va3VwJyAneycgJ30nKT8gKGFtYmlndWl0eSkgKCdleHBvc2UnICd7JyAnfScpPyAoJ21hcHBpbmcnICd7JyAnfScpPyAna2V5cycgJ3snIGxvb2t1cEtleXMrPURhdGFJbnRlcmNoYW5nZUtleQorCSAqICAgICBlbnRpdHk9W0xFbnRpdHl8TEZRTl0gKCdleHByZXNzaW9uJyAneycgJ30nKT8gKCdsb29rdXAnICd7JyAnfScpPyAoYW1iaWd1aXR5KSAoJ2V4cG9zZScgJ3snICd9Jyk/ICgnbWFwcGluZycgJ3snICd9Jyk/ICgna2V5cycgJ3snICd9Jyk/ICdleHBvcnRGaWx0ZXInICd7JyBleHBvcnRGaWx0ZXI9RGF0YUludGVyY2hhbmdlRXhwb3J0RmlsdGVyCisJICogICAgIGVudGl0eT1bTEVudGl0eXxMRlFOXSAoJ2V4cHJlc3Npb24nICd7JyAnfScpPyAoJ2xvb2t1cCcgJ3snICd9Jyk/IChhbWJpZ3VpdHkpICgnZXhwb3NlJyAneycgJ30nKT8gKCdtYXBwaW5nJyAneycgJ30nKT8gKCdrZXlzJyAneycgJ30nKT8gKHJ1bGUgZW5kKQorCSAqICAgICBleHByZXNzaW9uKz1EYXRhSW50ZXJjaGFuZ2VFeHByZXNzaW9uICd9JyAoJ2xvb2t1cCcgJ3snICd9Jyk/IChhbWJpZ3VpdHkpICdleHBvc2UnICd7JyBleHBvcnRFeHBvc2VzKz1EYXRhSW50ZXJjaGFuZ2VFeHBvc2UKKwkgKiAgICAgZXhwcmVzc2lvbis9RGF0YUludGVyY2hhbmdlRXhwcmVzc2lvbiAnfScgKCdsb29rdXAnICd7JyAnfScpPyAoYW1iaWd1aXR5KSAoJ2V4cG9zZScgJ3snICd9Jyk/ICdtYXBwaW5nJyAneycgbWFwcGluZ3MrPURhdGFJbnRlcmNoYW5nZU1hcHBpbmcKKwkgKiAgICAgZXhwcmVzc2lvbis9RGF0YUludGVyY2hhbmdlRXhwcmVzc2lvbiAnfScgKCdsb29rdXAnICd7JyAnfScpPyAoYW1iaWd1aXR5KSAoJ2V4cG9zZScgJ3snICd9Jyk/ICgnbWFwcGluZycgJ3snICd9Jyk/ICdrZXlzJyAneycgbG9va3VwS2V5cys9RGF0YUludGVyY2hhbmdlS2V5CisJICogICAgIGV4cHJlc3Npb24rPURhdGFJbnRlcmNoYW5nZUV4cHJlc3Npb24gJ30nICgnbG9va3VwJyAneycgJ30nKT8gKGFtYmlndWl0eSkgKCdleHBvc2UnICd7JyAnfScpPyAoJ21hcHBpbmcnICd7JyAnfScpPyAoJ2tleXMnICd7JyAnfScpPyAnZXhwb3J0RmlsdGVyJyAneycgZXhwb3J0RmlsdGVyPURhdGFJbnRlcmNoYW5nZUV4cG9ydEZpbHRlcgorCSAqICAgICBleHByZXNzaW9uKz1EYXRhSW50ZXJjaGFuZ2VFeHByZXNzaW9uICd9JyAoJ2xvb2t1cCcgJ3snICd9Jyk/IChhbWJpZ3VpdHkpICgnZXhwb3NlJyAneycgJ30nKT8gKCdtYXBwaW5nJyAneycgJ30nKT8gKCdrZXlzJyAneycgJ30nKT8gKHJ1bGUgZW5kKQorCSAqICAgICBsYXRlc3RFeHBQcm9wZXJ0eT1bTEVudGl0eUF0dHJpYnV0ZXxJRF0gKCdleHByZXNzaW9uJyAneycgJ30nKT8gKCdsb29rdXAnICd7JyAnfScpPyAoYW1iaWd1aXR5KSAnZXhwb3NlJyAneycgZXhwb3J0RXhwb3Nlcys9RGF0YUludGVyY2hhbmdlRXhwb3NlCisJICogICAgIGxhdGVzdEV4cFByb3BlcnR5PVtMRW50aXR5QXR0cmlidXRlfElEXSAoJ2V4cHJlc3Npb24nICd7JyAnfScpPyAoJ2xvb2t1cCcgJ3snICd9Jyk/IChhbWJpZ3VpdHkpICgnZXhwb3NlJyAneycgJ30nKT8gJ21hcHBpbmcnICd7JyBtYXBwaW5ncys9RGF0YUludGVyY2hhbmdlTWFwcGluZworCSAqICAgICBsYXRlc3RFeHBQcm9wZXJ0eT1bTEVudGl0eUF0dHJpYnV0ZXxJRF0gKCdleHByZXNzaW9uJyAneycgJ30nKT8gKCdsb29rdXAnICd7JyAnfScpPyAoYW1iaWd1aXR5KSAoJ2V4cG9zZScgJ3snICd9Jyk/ICgnbWFwcGluZycgJ3snICd9Jyk/ICdrZXlzJyAneycgbG9va3VwS2V5cys9RGF0YUludGVyY2hhbmdlS2V5CisJICogICAgIGxhdGVzdEV4cFByb3BlcnR5PVtMRW50aXR5QXR0cmlidXRlfElEXSAoJ2V4cHJlc3Npb24nICd7JyAnfScpPyAoJ2xvb2t1cCcgJ3snICd9Jyk/IChhbWJpZ3VpdHkpICgnZXhwb3NlJyAneycgJ30nKT8gKCdtYXBwaW5nJyAneycgJ30nKT8gKCdrZXlzJyAneycgJ30nKT8gKHJ1bGUgZW5kKQorCSAqICAgICBsYXRlc3RQcm9wZXJ0eT1bTEVudGl0eUF0dHJpYnV0ZXxJRF0gKCdleHByZXNzaW9uJyAneycgJ30nKT8gKCdsb29rdXAnICd7JyAnfScpPyAoYW1iaWd1aXR5KSAnZXhwb3NlJyAneycgZXhwb3J0RXhwb3Nlcys9RGF0YUludGVyY2hhbmdlRXhwb3NlCisJICogICAgIGxhdGVzdFByb3BlcnR5PVtMRW50aXR5QXR0cmlidXRlfElEXSAoJ2V4cHJlc3Npb24nICd7JyAnfScpPyAoJ2xvb2t1cCcgJ3snICd9Jyk/IChhbWJpZ3VpdHkpICgnZXhwb3NlJyAneycgJ30nKT8gJ21hcHBpbmcnICd7JyBtYXBwaW5ncys9RGF0YUludGVyY2hhbmdlTWFwcGluZworCSAqICAgICBsYXRlc3RQcm9wZXJ0eT1bTEVudGl0eUF0dHJpYnV0ZXxJRF0gKCdleHByZXNzaW9uJyAneycgJ30nKT8gKCdsb29rdXAnICd7JyAnfScpPyAoYW1iaWd1aXR5KSAoJ2V4cG9zZScgJ3snICd9Jyk/ICgnbWFwcGluZycgJ3snICd9Jyk/ICdrZXlzJyAneycgbG9va3VwS2V5cys9RGF0YUludGVyY2hhbmdlS2V5CisJICogICAgIGxhdGVzdFByb3BlcnR5PVtMRW50aXR5QXR0cmlidXRlfElEXSAoJ2V4cHJlc3Npb24nICd7JyAnfScpPyAoJ2xvb2t1cCcgJ3snICd9Jyk/IChhbWJpZ3VpdHkpICgnZXhwb3NlJyAneycgJ30nKT8gKCdtYXBwaW5nJyAneycgJ30nKT8gKCdrZXlzJyAneycgJ30nKT8gKHJ1bGUgZW5kKQorCSAqICAgICBsb29rdXArPURhdGFJbnRlcmNoYW5nZUxvb2t1cCAnfScgKGFtYmlndWl0eSkgJ2V4cG9zZScgJ3snIGV4cG9ydEV4cG9zZXMrPURhdGFJbnRlcmNoYW5nZUV4cG9zZQorCSAqICAgICBsb29rdXArPURhdGFJbnRlcmNoYW5nZUxvb2t1cCAnfScgKGFtYmlndWl0eSkgKCdleHBvc2UnICd7JyAnfScpPyAnbWFwcGluZycgJ3snIG1hcHBpbmdzKz1EYXRhSW50ZXJjaGFuZ2VNYXBwaW5nCisJICogICAgIGxvb2t1cCs9RGF0YUludGVyY2hhbmdlTG9va3VwICd9JyAoYW1iaWd1aXR5KSAoJ2V4cG9zZScgJ3snICd9Jyk/ICgnbWFwcGluZycgJ3snICd9Jyk/ICdrZXlzJyAneycgbG9va3VwS2V5cys9RGF0YUludGVyY2hhbmdlS2V5CisJICogICAgIGxvb2t1cCs9RGF0YUludGVyY2hhbmdlTG9va3VwICd9JyAoYW1iaWd1aXR5KSAoJ2V4cG9zZScgJ3snICd9Jyk/ICgnbWFwcGluZycgJ3snICd9Jyk/ICgna2V5cycgJ3snICd9Jyk/ICdleHBvcnRGaWx0ZXInICd7JyBleHBvcnRGaWx0ZXI9RGF0YUludGVyY2hhbmdlRXhwb3J0RmlsdGVyCisJICogICAgIGxvb2t1cCs9RGF0YUludGVyY2hhbmdlTG9va3VwICd9JyAoYW1iaWd1aXR5KSAoJ2V4cG9zZScgJ3snICd9Jyk/ICgnbWFwcGluZycgJ3snICd9Jyk/ICgna2V5cycgJ3snICd9Jyk/IChydWxlIGVuZCkKKwkgKiAgICAgbm9kZU5hbWU9U1RSSU5HICgnZXhwcmVzc2lvbicgJ3snICd9Jyk/ICgnbG9va3VwJyAneycgJ30nKT8gKGFtYmlndWl0eSkgJ2V4cG9zZScgJ3snIGV4cG9ydEV4cG9zZXMrPURhdGFJbnRlcmNoYW5nZUV4cG9zZQorCSAqICAgICBub2RlTmFtZT1TVFJJTkcgKCdleHByZXNzaW9uJyAneycgJ30nKT8gKCdsb29rdXAnICd7JyAnfScpPyAoYW1iaWd1aXR5KSAoJ2V4cG9zZScgJ3snICd9Jyk/ICdtYXBwaW5nJyAneycgbWFwcGluZ3MrPURhdGFJbnRlcmNoYW5nZU1hcHBpbmcKKwkgKiAgICAgbm9kZU5hbWU9U1RSSU5HICgnZXhwcmVzc2lvbicgJ3snICd9Jyk/ICgnbG9va3VwJyAneycgJ30nKT8gKGFtYmlndWl0eSkgKCdleHBvc2UnICd7JyAnfScpPyAoJ21hcHBpbmcnICd7JyAnfScpPyAna2V5cycgJ3snIGxvb2t1cEtleXMrPURhdGFJbnRlcmNoYW5nZUtleQorCSAqICAgICBub2RlTmFtZT1TVFJJTkcgKCdleHByZXNzaW9uJyAneycgJ30nKT8gKCdsb29rdXAnICd7JyAnfScpPyAoYW1iaWd1aXR5KSAoJ2V4cG9zZScgJ3snICd9Jyk/ICgnbWFwcGluZycgJ3snICd9Jyk/ICgna2V5cycgJ3snICd9Jyk/ICdleHBvcnRGaWx0ZXInICd7JyBleHBvcnRGaWx0ZXI9RGF0YUludGVyY2hhbmdlRXhwb3J0RmlsdGVyCisJICogICAgIG5vZGVOYW1lPVNUUklORyAoJ2V4cHJlc3Npb24nICd7JyAnfScpPyAoJ2xvb2t1cCcgJ3snICd9Jyk/IChhbWJpZ3VpdHkpICgnZXhwb3NlJyAneycgJ30nKT8gKCdtYXBwaW5nJyAneycgJ30nKT8gKCdrZXlzJyAneycgJ30nKT8gKHJ1bGUgZW5kKQogCSAqLwotCXByb3RlY3RlZCB2b2lkIGVtaXRfRGF0YUludGVyY2hhbmdlQmVhbl9fX0Zvcm1hdEtleXdvcmRfOF8wX0xlZnRDdXJseUJyYWNrZXRLZXl3b3JkXzhfMV9SaWdodEN1cmx5QnJhY2tldEtleXdvcmRfOF8zX19xKEVPYmplY3Qgc2VtYW50aWNPYmplY3QsIElTeW5OYXZpZ2FibGUgdHJhbnNpdGlvbiwgTGlzdDxJTm9kZT4gbm9kZXMpIHsKKwlwcm90ZWN0ZWQgdm9pZCBlbWl0X0RhdGFJbnRlcmNoYW5nZUJlYW5fX19Gb3JtYXRLZXl3b3JkXzlfMF9MZWZ0Q3VybHlCcmFja2V0S2V5d29yZF85XzFfUmlnaHRDdXJseUJyYWNrZXRLZXl3b3JkXzlfM19fcShFT2JqZWN0IHNlbWFudGljT2JqZWN0LCBJU3luTmF2aWdhYmxlIHRyYW5zaXRpb24sIExpc3Q8SU5vZGU+IG5vZGVzKSB7CiAJCWFjY2VwdE5vZGVzKHRyYW5zaXRpb24sIG5vZGVzKTsKIAl9CiAJCkBAIC0xOTYsMTYgKzMzNSw1MCBAQAogCSAqICAgICAoJ2tleXMnICd7JyAnfScpPwogCSAqCiAJICogVGhpcyBhbWJpZ3VvdXMgc3ludGF4IG9jY3VycyBhdDoKLQkgKiAgICAgZWxlbWVudE1hcD1TVFJJTkcgKCdleHByZXNzaW9uJyAneycgJ30nKT8gKCdsb29rdXAnICd7JyAnfScpPyAoJ2Zvcm1hdCcgJ3snICd9Jyk/ICgnbWFwcGluZycgJ3snICd9Jyk/IChhbWJpZ3VpdHkpIChydWxlIGVuZCkKLQkgKiAgICAgZW50aXR5PVtMRW50aXR5fExGUU5dICgnZXhwcmVzc2lvbicgJ3snICd9Jyk/ICgnbG9va3VwJyAneycgJ30nKT8gKCdmb3JtYXQnICd7JyAnfScpPyAoJ21hcHBpbmcnICd7JyAnfScpPyAoYW1iaWd1aXR5KSAocnVsZSBlbmQpCi0JICogICAgIGV4cHJlc3Npb24rPURhdGFJbnRlcmNoYW5nZUV4cHJlc3Npb24gJ30nICgnbG9va3VwJyAneycgJ30nKT8gKCdmb3JtYXQnICd7JyAnfScpPyAoJ21hcHBpbmcnICd7JyAnfScpPyAoYW1iaWd1aXR5KSAocnVsZSBlbmQpCi0JICogICAgIGZvcm1hdCs9RGF0YUludGVyY2hhbmdlRm9ybWF0ICd9JyAoJ21hcHBpbmcnICd7JyAnfScpPyAoYW1iaWd1aXR5KSAocnVsZSBlbmQpCi0JICogICAgIGxhdGVzdFByb3BlcnR5PVtMRW50aXR5QXR0cmlidXRlfElEXSAoJ2V4cHJlc3Npb24nICd7JyAnfScpPyAoJ2xvb2t1cCcgJ3snICd9Jyk/ICgnZm9ybWF0JyAneycgJ30nKT8gKCdtYXBwaW5nJyAneycgJ30nKT8gKGFtYmlndWl0eSkgKHJ1bGUgZW5kKQotCSAqICAgICBsb29rdXArPURhdGFJbnRlcmNoYW5nZUxvb2t1cCAnfScgKCdmb3JtYXQnICd7JyAnfScpPyAoJ21hcHBpbmcnICd7JyAnfScpPyAoYW1iaWd1aXR5KSAocnVsZSBlbmQpCisJICogICAgICgKKwkgKiAgICAgICAgIGxhdGVzdEV4cFByb3BlcnR5PVtMRW50aXR5QXR0cmlidXRlfElEXSAKKwkgKiAgICAgICAgICgnZXhwcmVzc2lvbicgJ3snICd9Jyk/IAorCSAqICAgICAgICAgKCdsb29rdXAnICd7JyAnfScpPyAKKwkgKiAgICAgICAgICgnZm9ybWF0JyAneycgJ30nKT8gCisJICogICAgICAgICAoJ2V4cG9zZScgJ3snICd9Jyk/IAorCSAqICAgICAgICAgKCdtYXBwaW5nJyAneycgJ30nKT8gCisJICogICAgICAgICAoYW1iaWd1aXR5KSAKKwkgKiAgICAgICAgICdleHBvcnRGaWx0ZXInIAorCSAqICAgICAgICAgJ3snIAorCSAqICAgICAgICAgZXhwb3J0RmlsdGVyPURhdGFJbnRlcmNoYW5nZUV4cG9ydEZpbHRlcgorCSAqICAgICApCisJICogICAgICgKKwkgKiAgICAgICAgIGxhdGVzdFByb3BlcnR5PVtMRW50aXR5QXR0cmlidXRlfElEXSAKKwkgKiAgICAgICAgICgnZXhwcmVzc2lvbicgJ3snICd9Jyk/IAorCSAqICAgICAgICAgKCdsb29rdXAnICd7JyAnfScpPyAKKwkgKiAgICAgICAgICgnZm9ybWF0JyAneycgJ30nKT8gCisJICogICAgICAgICAoJ2V4cG9zZScgJ3snICd9Jyk/IAorCSAqICAgICAgICAgKCdtYXBwaW5nJyAneycgJ30nKT8gCisJICogICAgICAgICAoYW1iaWd1aXR5KSAKKwkgKiAgICAgICAgICdleHBvcnRGaWx0ZXInIAorCSAqICAgICAgICAgJ3snIAorCSAqICAgICAgICAgZXhwb3J0RmlsdGVyPURhdGFJbnRlcmNoYW5nZUV4cG9ydEZpbHRlcgorCSAqICAgICApCisJICogICAgIGVsZW1lbnRNYXA9U1RSSU5HICgnZXhwcmVzc2lvbicgJ3snICd9Jyk/ICgnbG9va3VwJyAneycgJ30nKT8gKCdmb3JtYXQnICd7JyAnfScpPyAoJ2V4cG9zZScgJ3snICd9Jyk/ICgnbWFwcGluZycgJ3snICd9Jyk/IChhbWJpZ3VpdHkpICdleHBvcnRGaWx0ZXInICd7JyBleHBvcnRGaWx0ZXI9RGF0YUludGVyY2hhbmdlRXhwb3J0RmlsdGVyCisJICogICAgIGVsZW1lbnRNYXA9U1RSSU5HICgnZXhwcmVzc2lvbicgJ3snICd9Jyk/ICgnbG9va3VwJyAneycgJ30nKT8gKCdmb3JtYXQnICd7JyAnfScpPyAoJ2V4cG9zZScgJ3snICd9Jyk/ICgnbWFwcGluZycgJ3snICd9Jyk/IChhbWJpZ3VpdHkpIChydWxlIGVuZCkKKwkgKiAgICAgZW50aXR5PVtMRW50aXR5fExGUU5dICgnZXhwcmVzc2lvbicgJ3snICd9Jyk/ICgnbG9va3VwJyAneycgJ30nKT8gKCdmb3JtYXQnICd7JyAnfScpPyAoJ2V4cG9zZScgJ3snICd9Jyk/ICgnbWFwcGluZycgJ3snICd9Jyk/IChhbWJpZ3VpdHkpICdleHBvcnRGaWx0ZXInICd7JyBleHBvcnRGaWx0ZXI9RGF0YUludGVyY2hhbmdlRXhwb3J0RmlsdGVyCisJICogICAgIGVudGl0eT1bTEVudGl0eXxMRlFOXSAoJ2V4cHJlc3Npb24nICd7JyAnfScpPyAoJ2xvb2t1cCcgJ3snICd9Jyk/ICgnZm9ybWF0JyAneycgJ30nKT8gKCdleHBvc2UnICd7JyAnfScpPyAoJ21hcHBpbmcnICd7JyAnfScpPyAoYW1iaWd1aXR5KSAocnVsZSBlbmQpCisJICogICAgIGV4cG9ydEV4cG9zZXMrPURhdGFJbnRlcmNoYW5nZUV4cG9zZSAnfScgKCdtYXBwaW5nJyAneycgJ30nKT8gKGFtYmlndWl0eSkgJ2V4cG9ydEZpbHRlcicgJ3snIGV4cG9ydEZpbHRlcj1EYXRhSW50ZXJjaGFuZ2VFeHBvcnRGaWx0ZXIKKwkgKiAgICAgZXhwb3J0RXhwb3Nlcys9RGF0YUludGVyY2hhbmdlRXhwb3NlICd9JyAoJ21hcHBpbmcnICd7JyAnfScpPyAoYW1iaWd1aXR5KSAocnVsZSBlbmQpCisJICogICAgIGV4cHJlc3Npb24rPURhdGFJbnRlcmNoYW5nZUV4cHJlc3Npb24gJ30nICgnbG9va3VwJyAneycgJ30nKT8gKCdmb3JtYXQnICd7JyAnfScpPyAoJ2V4cG9zZScgJ3snICd9Jyk/ICgnbWFwcGluZycgJ3snICd9Jyk/IChhbWJpZ3VpdHkpICdleHBvcnRGaWx0ZXInICd7JyBleHBvcnRGaWx0ZXI9RGF0YUludGVyY2hhbmdlRXhwb3J0RmlsdGVyCisJICogICAgIGV4cHJlc3Npb24rPURhdGFJbnRlcmNoYW5nZUV4cHJlc3Npb24gJ30nICgnbG9va3VwJyAneycgJ30nKT8gKCdmb3JtYXQnICd7JyAnfScpPyAoJ2V4cG9zZScgJ3snICd9Jyk/ICgnbWFwcGluZycgJ3snICd9Jyk/IChhbWJpZ3VpdHkpIChydWxlIGVuZCkKKwkgKiAgICAgZm9ybWF0Kz1EYXRhSW50ZXJjaGFuZ2VGb3JtYXQgJ30nICgnZXhwb3NlJyAneycgJ30nKT8gKCdtYXBwaW5nJyAneycgJ30nKT8gKGFtYmlndWl0eSkgJ2V4cG9ydEZpbHRlcicgJ3snIGV4cG9ydEZpbHRlcj1EYXRhSW50ZXJjaGFuZ2VFeHBvcnRGaWx0ZXIKKwkgKiAgICAgZm9ybWF0Kz1EYXRhSW50ZXJjaGFuZ2VGb3JtYXQgJ30nICgnZXhwb3NlJyAneycgJ30nKT8gKCdtYXBwaW5nJyAneycgJ30nKT8gKGFtYmlndWl0eSkgKHJ1bGUgZW5kKQorCSAqICAgICBsYXRlc3RFeHBQcm9wZXJ0eT1bTEVudGl0eUF0dHJpYnV0ZXxJRF0gKCdleHByZXNzaW9uJyAneycgJ30nKT8gKCdsb29rdXAnICd7JyAnfScpPyAoJ2Zvcm1hdCcgJ3snICd9Jyk/ICgnZXhwb3NlJyAneycgJ30nKT8gKCdtYXBwaW5nJyAneycgJ30nKT8gKGFtYmlndWl0eSkgKHJ1bGUgZW5kKQorCSAqICAgICBsYXRlc3RQcm9wZXJ0eT1bTEVudGl0eUF0dHJpYnV0ZXxJRF0gKCdleHByZXNzaW9uJyAneycgJ30nKT8gKCdsb29rdXAnICd7JyAnfScpPyAoJ2Zvcm1hdCcgJ3snICd9Jyk/ICgnZXhwb3NlJyAneycgJ30nKT8gKCdtYXBwaW5nJyAneycgJ30nKT8gKGFtYmlndWl0eSkgKHJ1bGUgZW5kKQorCSAqICAgICBsb29rdXArPURhdGFJbnRlcmNoYW5nZUxvb2t1cCAnfScgKCdmb3JtYXQnICd7JyAnfScpPyAoJ2V4cG9zZScgJ3snICd9Jyk/ICgnbWFwcGluZycgJ3snICd9Jyk/IChhbWJpZ3VpdHkpICdleHBvcnRGaWx0ZXInICd7JyBleHBvcnRGaWx0ZXI9RGF0YUludGVyY2hhbmdlRXhwb3J0RmlsdGVyCisJICogICAgIGxvb2t1cCs9RGF0YUludGVyY2hhbmdlTG9va3VwICd9JyAoJ2Zvcm1hdCcgJ3snICd9Jyk/ICgnZXhwb3NlJyAneycgJ30nKT8gKCdtYXBwaW5nJyAneycgJ30nKT8gKGFtYmlndWl0eSkgKHJ1bGUgZW5kKQorCSAqICAgICBtYXBwaW5ncys9RGF0YUludGVyY2hhbmdlTWFwcGluZyAnfScgKGFtYmlndWl0eSkgJ2V4cG9ydEZpbHRlcicgJ3snIGV4cG9ydEZpbHRlcj1EYXRhSW50ZXJjaGFuZ2VFeHBvcnRGaWx0ZXIKIAkgKiAgICAgbWFwcGluZ3MrPURhdGFJbnRlcmNoYW5nZU1hcHBpbmcgJ30nIChhbWJpZ3VpdHkpIChydWxlIGVuZCkKLQkgKiAgICAgbm9kZU5hbWU9U1RSSU5HICgnZXhwcmVzc2lvbicgJ3snICd9Jyk/ICgnbG9va3VwJyAneycgJ30nKT8gKCdmb3JtYXQnICd7JyAnfScpPyAoJ21hcHBpbmcnICd7JyAnfScpPyAoYW1iaWd1aXR5KSAocnVsZSBlbmQpCisJICogICAgIG5vZGVOYW1lPVNUUklORyAoJ2V4cHJlc3Npb24nICd7JyAnfScpPyAoJ2xvb2t1cCcgJ3snICd9Jyk/ICgnZm9ybWF0JyAneycgJ30nKT8gKCdleHBvc2UnICd7JyAnfScpPyAoJ21hcHBpbmcnICd7JyAnfScpPyAoYW1iaWd1aXR5KSAnZXhwb3J0RmlsdGVyJyAneycgZXhwb3J0RmlsdGVyPURhdGFJbnRlcmNoYW5nZUV4cG9ydEZpbHRlcgorCSAqICAgICBub2RlTmFtZT1TVFJJTkcgKCdleHByZXNzaW9uJyAneycgJ30nKT8gKCdsb29rdXAnICd7JyAnfScpPyAoJ2Zvcm1hdCcgJ3snICd9Jyk/ICgnZXhwb3NlJyAneycgJ30nKT8gKCdtYXBwaW5nJyAneycgJ30nKT8gKGFtYmlndWl0eSkgKHJ1bGUgZW5kKQogCSAqLwotCXByb3RlY3RlZCB2b2lkIGVtaXRfRGF0YUludGVyY2hhbmdlQmVhbl9fX0tleXNLZXl3b3JkXzEwXzBfTGVmdEN1cmx5QnJhY2tldEtleXdvcmRfMTBfMV9SaWdodEN1cmx5QnJhY2tldEtleXdvcmRfMTBfM19fcShFT2JqZWN0IHNlbWFudGljT2JqZWN0LCBJU3luTmF2aWdhYmxlIHRyYW5zaXRpb24sIExpc3Q8SU5vZGU+IG5vZGVzKSB7CisJcHJvdGVjdGVkIHZvaWQgZW1pdF9EYXRhSW50ZXJjaGFuZ2VCZWFuX19fS2V5c0tleXdvcmRfMTJfMF9MZWZ0Q3VybHlCcmFja2V0S2V5d29yZF8xMl8xX1JpZ2h0Q3VybHlCcmFja2V0S2V5d29yZF8xMl8zX19xKEVPYmplY3Qgc2VtYW50aWNPYmplY3QsIElTeW5OYXZpZ2FibGUgdHJhbnNpdGlvbiwgTGlzdDxJTm9kZT4gbm9kZXMpIHsKIAkJYWNjZXB0Tm9kZXModHJhbnNpdGlvbiwgbm9kZXMpOwogCX0KIAkKQEAgLTIxNCwyOCArMzg3LDY2IEBACiAJICogICAgICgnbG9va3VwJyAneycgJ30nKT8KIAkgKgogCSAqIFRoaXMgYW1iaWd1b3VzIHN5bnRheCBvY2N1cnMgYXQ6CisJICogICAgICgKKwkgKiAgICAgICAgIGxhdGVzdEV4cFByb3BlcnR5PVtMRW50aXR5QXR0cmlidXRlfElEXSAKKwkgKiAgICAgICAgICgnZXhwcmVzc2lvbicgJ3snICd9Jyk/IAorCSAqICAgICAgICAgKGFtYmlndWl0eSkgCisJICogICAgICAgICAoJ2Zvcm1hdCcgJ3snICd9Jyk/IAorCSAqICAgICAgICAgKCdleHBvc2UnICd7JyAnfScpPyAKKwkgKiAgICAgICAgICgnbWFwcGluZycgJ3snICd9Jyk/IAorCSAqICAgICAgICAgKCdrZXlzJyAneycgJ30nKT8gCisJICogICAgICAgICAnZXhwb3J0RmlsdGVyJyAKKwkgKiAgICAgICAgICd7JyAKKwkgKiAgICAgICAgIGV4cG9ydEZpbHRlcj1EYXRhSW50ZXJjaGFuZ2VFeHBvcnRGaWx0ZXIKKwkgKiAgICAgKQorCSAqICAgICAoCisJICogICAgICAgICBsYXRlc3RQcm9wZXJ0eT1bTEVudGl0eUF0dHJpYnV0ZXxJRF0gCisJICogICAgICAgICAoJ2V4cHJlc3Npb24nICd7JyAnfScpPyAKKwkgKiAgICAgICAgIChhbWJpZ3VpdHkpIAorCSAqICAgICAgICAgKCdmb3JtYXQnICd7JyAnfScpPyAKKwkgKiAgICAgICAgICgnZXhwb3NlJyAneycgJ30nKT8gCisJICogICAgICAgICAoJ21hcHBpbmcnICd7JyAnfScpPyAKKwkgKiAgICAgICAgICgna2V5cycgJ3snICd9Jyk/IAorCSAqICAgICAgICAgJ2V4cG9ydEZpbHRlcicgCisJICogICAgICAgICAneycgCisJICogICAgICAgICBleHBvcnRGaWx0ZXI9RGF0YUludGVyY2hhbmdlRXhwb3J0RmlsdGVyCisJICogICAgICkKIAkgKiAgICAgZWxlbWVudE1hcD1TVFJJTkcgKCdleHByZXNzaW9uJyAneycgJ30nKT8gKGFtYmlndWl0eSkgJ2Zvcm1hdCcgJ3snIGZvcm1hdCs9RGF0YUludGVyY2hhbmdlRm9ybWF0Ci0JICogICAgIGVsZW1lbnRNYXA9U1RSSU5HICgnZXhwcmVzc2lvbicgJ3snICd9Jyk/IChhbWJpZ3VpdHkpICgnZm9ybWF0JyAneycgJ30nKT8gJ21hcHBpbmcnICd7JyBtYXBwaW5ncys9RGF0YUludGVyY2hhbmdlTWFwcGluZwotCSAqICAgICBlbGVtZW50TWFwPVNUUklORyAoJ2V4cHJlc3Npb24nICd7JyAnfScpPyAoYW1iaWd1aXR5KSAoJ2Zvcm1hdCcgJ3snICd9Jyk/ICgnbWFwcGluZycgJ3snICd9Jyk/ICdrZXlzJyAneycgbG9va3VwS2V5cys9RGF0YUludGVyY2hhbmdlS2V5Ci0JICogICAgIGVsZW1lbnRNYXA9U1RSSU5HICgnZXhwcmVzc2lvbicgJ3snICd9Jyk/IChhbWJpZ3VpdHkpICgnZm9ybWF0JyAneycgJ30nKT8gKCdtYXBwaW5nJyAneycgJ30nKT8gKCdrZXlzJyAneycgJ30nKT8gKHJ1bGUgZW5kKQorCSAqICAgICBlbGVtZW50TWFwPVNUUklORyAoJ2V4cHJlc3Npb24nICd7JyAnfScpPyAoYW1iaWd1aXR5KSAoJ2Zvcm1hdCcgJ3snICd9Jyk/ICdleHBvc2UnICd7JyBleHBvcnRFeHBvc2VzKz1EYXRhSW50ZXJjaGFuZ2VFeHBvc2UKKwkgKiAgICAgZWxlbWVudE1hcD1TVFJJTkcgKCdleHByZXNzaW9uJyAneycgJ30nKT8gKGFtYmlndWl0eSkgKCdmb3JtYXQnICd7JyAnfScpPyAoJ2V4cG9zZScgJ3snICd9Jyk/ICdtYXBwaW5nJyAneycgbWFwcGluZ3MrPURhdGFJbnRlcmNoYW5nZU1hcHBpbmcKKwkgKiAgICAgZWxlbWVudE1hcD1TVFJJTkcgKCdleHByZXNzaW9uJyAneycgJ30nKT8gKGFtYmlndWl0eSkgKCdmb3JtYXQnICd7JyAnfScpPyAoJ2V4cG9zZScgJ3snICd9Jyk/ICgnbWFwcGluZycgJ3snICd9Jyk/ICdrZXlzJyAneycgbG9va3VwS2V5cys9RGF0YUludGVyY2hhbmdlS2V5CisJICogICAgIGVsZW1lbnRNYXA9U1RSSU5HICgnZXhwcmVzc2lvbicgJ3snICd9Jyk/IChhbWJpZ3VpdHkpICgnZm9ybWF0JyAneycgJ30nKT8gKCdleHBvc2UnICd7JyAnfScpPyAoJ21hcHBpbmcnICd7JyAnfScpPyAoJ2tleXMnICd7JyAnfScpPyAnZXhwb3J0RmlsdGVyJyAneycgZXhwb3J0RmlsdGVyPURhdGFJbnRlcmNoYW5nZUV4cG9ydEZpbHRlcgorCSAqICAgICBlbGVtZW50TWFwPVNUUklORyAoJ2V4cHJlc3Npb24nICd7JyAnfScpPyAoYW1iaWd1aXR5KSAoJ2Zvcm1hdCcgJ3snICd9Jyk/ICgnZXhwb3NlJyAneycgJ30nKT8gKCdtYXBwaW5nJyAneycgJ30nKT8gKCdrZXlzJyAneycgJ30nKT8gKHJ1bGUgZW5kKQogCSAqICAgICBlbnRpdHk9W0xFbnRpdHl8TEZRTl0gKCdleHByZXNzaW9uJyAneycgJ30nKT8gKGFtYmlndWl0eSkgJ2Zvcm1hdCcgJ3snIGZvcm1hdCs9RGF0YUludGVyY2hhbmdlRm9ybWF0Ci0JICogICAgIGVudGl0eT1bTEVudGl0eXxMRlFOXSAoJ2V4cHJlc3Npb24nICd7JyAnfScpPyAoYW1iaWd1aXR5KSAoJ2Zvcm1hdCcgJ3snICd9Jyk/ICdtYXBwaW5nJyAneycgbWFwcGluZ3MrPURhdGFJbnRlcmNoYW5nZU1hcHBpbmcKLQkgKiAgICAgZW50aXR5PVtMRW50aXR5fExGUU5dICgnZXhwcmVzc2lvbicgJ3snICd9Jyk/IChhbWJpZ3VpdHkpICgnZm9ybWF0JyAneycgJ30nKT8gKCdtYXBwaW5nJyAneycgJ30nKT8gJ2tleXMnICd7JyBsb29rdXBLZXlzKz1EYXRhSW50ZXJjaGFuZ2VLZXkKLQkgKiAgICAgZW50aXR5PVtMRW50aXR5fExGUU5dICgnZXhwcmVzc2lvbicgJ3snICd9Jyk/IChhbWJpZ3VpdHkpICgnZm9ybWF0JyAneycgJ30nKT8gKCdtYXBwaW5nJyAneycgJ30nKT8gKCdrZXlzJyAneycgJ30nKT8gKHJ1bGUgZW5kKQorCSAqICAgICBlbnRpdHk9W0xFbnRpdHl8TEZRTl0gKCdleHByZXNzaW9uJyAneycgJ30nKT8gKGFtYmlndWl0eSkgKCdmb3JtYXQnICd7JyAnfScpPyAnZXhwb3NlJyAneycgZXhwb3J0RXhwb3Nlcys9RGF0YUludGVyY2hhbmdlRXhwb3NlCisJICogICAgIGVudGl0eT1bTEVudGl0eXxMRlFOXSAoJ2V4cHJlc3Npb24nICd7JyAnfScpPyAoYW1iaWd1aXR5KSAoJ2Zvcm1hdCcgJ3snICd9Jyk/ICgnZXhwb3NlJyAneycgJ30nKT8gJ21hcHBpbmcnICd7JyBtYXBwaW5ncys9RGF0YUludGVyY2hhbmdlTWFwcGluZworCSAqICAgICBlbnRpdHk9W0xFbnRpdHl8TEZRTl0gKCdleHByZXNzaW9uJyAneycgJ30nKT8gKGFtYmlndWl0eSkgKCdmb3JtYXQnICd7JyAnfScpPyAoJ2V4cG9zZScgJ3snICd9Jyk/ICgnbWFwcGluZycgJ3snICd9Jyk/ICdrZXlzJyAneycgbG9va3VwS2V5cys9RGF0YUludGVyY2hhbmdlS2V5CisJICogICAgIGVudGl0eT1bTEVudGl0eXxMRlFOXSAoJ2V4cHJlc3Npb24nICd7JyAnfScpPyAoYW1iaWd1aXR5KSAoJ2Zvcm1hdCcgJ3snICd9Jyk/ICgnZXhwb3NlJyAneycgJ30nKT8gKCdtYXBwaW5nJyAneycgJ30nKT8gKCdrZXlzJyAneycgJ30nKT8gJ2V4cG9ydEZpbHRlcicgJ3snIGV4cG9ydEZpbHRlcj1EYXRhSW50ZXJjaGFuZ2VFeHBvcnRGaWx0ZXIKKwkgKiAgICAgZW50aXR5PVtMRW50aXR5fExGUU5dICgnZXhwcmVzc2lvbicgJ3snICd9Jyk/IChhbWJpZ3VpdHkpICgnZm9ybWF0JyAneycgJ30nKT8gKCdleHBvc2UnICd7JyAnfScpPyAoJ21hcHBpbmcnICd7JyAnfScpPyAoJ2tleXMnICd7JyAnfScpPyAocnVsZSBlbmQpCiAJICogICAgIGV4cHJlc3Npb24rPURhdGFJbnRlcmNoYW5nZUV4cHJlc3Npb24gJ30nIChhbWJpZ3VpdHkpICdmb3JtYXQnICd7JyBmb3JtYXQrPURhdGFJbnRlcmNoYW5nZUZvcm1hdAotCSAqICAgICBleHByZXNzaW9uKz1EYXRhSW50ZXJjaGFuZ2VFeHByZXNzaW9uICd9JyAoYW1iaWd1aXR5KSAoJ2Zvcm1hdCcgJ3snICd9Jyk/ICdtYXBwaW5nJyAneycgbWFwcGluZ3MrPURhdGFJbnRlcmNoYW5nZU1hcHBpbmcKLQkgKiAgICAgZXhwcmVzc2lvbis9RGF0YUludGVyY2hhbmdlRXhwcmVzc2lvbiAnfScgKGFtYmlndWl0eSkgKCdmb3JtYXQnICd7JyAnfScpPyAoJ21hcHBpbmcnICd7JyAnfScpPyAna2V5cycgJ3snIGxvb2t1cEtleXMrPURhdGFJbnRlcmNoYW5nZUtleQotCSAqICAgICBleHByZXNzaW9uKz1EYXRhSW50ZXJjaGFuZ2VFeHByZXNzaW9uICd9JyAoYW1iaWd1aXR5KSAoJ2Zvcm1hdCcgJ3snICd9Jyk/ICgnbWFwcGluZycgJ3snICd9Jyk/ICgna2V5cycgJ3snICd9Jyk/IChydWxlIGVuZCkKKwkgKiAgICAgZXhwcmVzc2lvbis9RGF0YUludGVyY2hhbmdlRXhwcmVzc2lvbiAnfScgKGFtYmlndWl0eSkgKCdmb3JtYXQnICd7JyAnfScpPyAnZXhwb3NlJyAneycgZXhwb3J0RXhwb3Nlcys9RGF0YUludGVyY2hhbmdlRXhwb3NlCisJICogICAgIGV4cHJlc3Npb24rPURhdGFJbnRlcmNoYW5nZUV4cHJlc3Npb24gJ30nIChhbWJpZ3VpdHkpICgnZm9ybWF0JyAneycgJ30nKT8gKCdleHBvc2UnICd7JyAnfScpPyAnbWFwcGluZycgJ3snIG1hcHBpbmdzKz1EYXRhSW50ZXJjaGFuZ2VNYXBwaW5nCisJICogICAgIGV4cHJlc3Npb24rPURhdGFJbnRlcmNoYW5nZUV4cHJlc3Npb24gJ30nIChhbWJpZ3VpdHkpICgnZm9ybWF0JyAneycgJ30nKT8gKCdleHBvc2UnICd7JyAnfScpPyAoJ21hcHBpbmcnICd7JyAnfScpPyAna2V5cycgJ3snIGxvb2t1cEtleXMrPURhdGFJbnRlcmNoYW5nZUtleQorCSAqICAgICBleHByZXNzaW9uKz1EYXRhSW50ZXJjaGFuZ2VFeHByZXNzaW9uICd9JyAoYW1iaWd1aXR5KSAoJ2Zvcm1hdCcgJ3snICd9Jyk/ICgnZXhwb3NlJyAneycgJ30nKT8gKCdtYXBwaW5nJyAneycgJ30nKT8gKCdrZXlzJyAneycgJ30nKT8gJ2V4cG9ydEZpbHRlcicgJ3snIGV4cG9ydEZpbHRlcj1EYXRhSW50ZXJjaGFuZ2VFeHBvcnRGaWx0ZXIKKwkgKiAgICAgZXhwcmVzc2lvbis9RGF0YUludGVyY2hhbmdlRXhwcmVzc2lvbiAnfScgKGFtYmlndWl0eSkgKCdmb3JtYXQnICd7JyAnfScpPyAoJ2V4cG9zZScgJ3snICd9Jyk/ICgnbWFwcGluZycgJ3snICd9Jyk/ICgna2V5cycgJ3snICd9Jyk/IChydWxlIGVuZCkKKwkgKiAgICAgbGF0ZXN0RXhwUHJvcGVydHk9W0xFbnRpdHlBdHRyaWJ1dGV8SURdICgnZXhwcmVzc2lvbicgJ3snICd9Jyk/IChhbWJpZ3VpdHkpICdmb3JtYXQnICd7JyBmb3JtYXQrPURhdGFJbnRlcmNoYW5nZUZvcm1hdAorCSAqICAgICBsYXRlc3RFeHBQcm9wZXJ0eT1bTEVudGl0eUF0dHJpYnV0ZXxJRF0gKCdleHByZXNzaW9uJyAneycgJ30nKT8gKGFtYmlndWl0eSkgKCdmb3JtYXQnICd7JyAnfScpPyAnZXhwb3NlJyAneycgZXhwb3J0RXhwb3Nlcys9RGF0YUludGVyY2hhbmdlRXhwb3NlCisJICogICAgIGxhdGVzdEV4cFByb3BlcnR5PVtMRW50aXR5QXR0cmlidXRlfElEXSAoJ2V4cHJlc3Npb24nICd7JyAnfScpPyAoYW1iaWd1aXR5KSAoJ2Zvcm1hdCcgJ3snICd9Jyk/ICgnZXhwb3NlJyAneycgJ30nKT8gJ21hcHBpbmcnICd7JyBtYXBwaW5ncys9RGF0YUludGVyY2hhbmdlTWFwcGluZworCSAqICAgICBsYXRlc3RFeHBQcm9wZXJ0eT1bTEVudGl0eUF0dHJpYnV0ZXxJRF0gKCdleHByZXNzaW9uJyAneycgJ30nKT8gKGFtYmlndWl0eSkgKCdmb3JtYXQnICd7JyAnfScpPyAoJ2V4cG9zZScgJ3snICd9Jyk/ICgnbWFwcGluZycgJ3snICd9Jyk/ICdrZXlzJyAneycgbG9va3VwS2V5cys9RGF0YUludGVyY2hhbmdlS2V5CisJICogICAgIGxhdGVzdEV4cFByb3BlcnR5PVtMRW50aXR5QXR0cmlidXRlfElEXSAoJ2V4cHJlc3Npb24nICd7JyAnfScpPyAoYW1iaWd1aXR5KSAoJ2Zvcm1hdCcgJ3snICd9Jyk/ICgnZXhwb3NlJyAneycgJ30nKT8gKCdtYXBwaW5nJyAneycgJ30nKT8gKCdrZXlzJyAneycgJ30nKT8gKHJ1bGUgZW5kKQogCSAqICAgICBsYXRlc3RQcm9wZXJ0eT1bTEVudGl0eUF0dHJpYnV0ZXxJRF0gKCdleHByZXNzaW9uJyAneycgJ30nKT8gKGFtYmlndWl0eSkgJ2Zvcm1hdCcgJ3snIGZvcm1hdCs9RGF0YUludGVyY2hhbmdlRm9ybWF0Ci0JICogICAgIGxhdGVzdFByb3BlcnR5PVtMRW50aXR5QXR0cmlidXRlfElEXSAoJ2V4cHJlc3Npb24nICd7JyAnfScpPyAoYW1iaWd1aXR5KSAoJ2Zvcm1hdCcgJ3snICd9Jyk/ICdtYXBwaW5nJyAneycgbWFwcGluZ3MrPURhdGFJbnRlcmNoYW5nZU1hcHBpbmcKLQkgKiAgICAgbGF0ZXN0UHJvcGVydHk9W0xFbnRpdHlBdHRyaWJ1dGV8SURdICgnZXhwcmVzc2lvbicgJ3snICd9Jyk/IChhbWJpZ3VpdHkpICgnZm9ybWF0JyAneycgJ30nKT8gKCdtYXBwaW5nJyAneycgJ30nKT8gJ2tleXMnICd7JyBsb29rdXBLZXlzKz1EYXRhSW50ZXJjaGFuZ2VLZXkKLQkgKiAgICAgbGF0ZXN0UHJvcGVydHk9W0xFbnRpdHlBdHRyaWJ1dGV8SURdICgnZXhwcmVzc2lvbicgJ3snICd9Jyk/IChhbWJpZ3VpdHkpICgnZm9ybWF0JyAneycgJ30nKT8gKCdtYXBwaW5nJyAneycgJ30nKT8gKCdrZXlzJyAneycgJ30nKT8gKHJ1bGUgZW5kKQorCSAqICAgICBsYXRlc3RQcm9wZXJ0eT1bTEVudGl0eUF0dHJpYnV0ZXxJRF0gKCdleHByZXNzaW9uJyAneycgJ30nKT8gKGFtYmlndWl0eSkgKCdmb3JtYXQnICd7JyAnfScpPyAnZXhwb3NlJyAneycgZXhwb3J0RXhwb3Nlcys9RGF0YUludGVyY2hhbmdlRXhwb3NlCisJICogICAgIGxhdGVzdFByb3BlcnR5PVtMRW50aXR5QXR0cmlidXRlfElEXSAoJ2V4cHJlc3Npb24nICd7JyAnfScpPyAoYW1iaWd1aXR5KSAoJ2Zvcm1hdCcgJ3snICd9Jyk/ICgnZXhwb3NlJyAneycgJ30nKT8gJ21hcHBpbmcnICd7JyBtYXBwaW5ncys9RGF0YUludGVyY2hhbmdlTWFwcGluZworCSAqICAgICBsYXRlc3RQcm9wZXJ0eT1bTEVudGl0eUF0dHJpYnV0ZXxJRF0gKCdleHByZXNzaW9uJyAneycgJ30nKT8gKGFtYmlndWl0eSkgKCdmb3JtYXQnICd7JyAnfScpPyAoJ2V4cG9zZScgJ3snICd9Jyk/ICgnbWFwcGluZycgJ3snICd9Jyk/ICdrZXlzJyAneycgbG9va3VwS2V5cys9RGF0YUludGVyY2hhbmdlS2V5CisJICogICAgIGxhdGVzdFByb3BlcnR5PVtMRW50aXR5QXR0cmlidXRlfElEXSAoJ2V4cHJlc3Npb24nICd7JyAnfScpPyAoYW1iaWd1aXR5KSAoJ2Zvcm1hdCcgJ3snICd9Jyk/ICgnZXhwb3NlJyAneycgJ30nKT8gKCdtYXBwaW5nJyAneycgJ30nKT8gKCdrZXlzJyAneycgJ30nKT8gKHJ1bGUgZW5kKQogCSAqICAgICBub2RlTmFtZT1TVFJJTkcgKCdleHByZXNzaW9uJyAneycgJ30nKT8gKGFtYmlndWl0eSkgJ2Zvcm1hdCcgJ3snIGZvcm1hdCs9RGF0YUludGVyY2hhbmdlRm9ybWF0Ci0JICogICAgIG5vZGVOYW1lPVNUUklORyAoJ2V4cHJlc3Npb24nICd7JyAnfScpPyAoYW1iaWd1aXR5KSAoJ2Zvcm1hdCcgJ3snICd9Jyk/ICdtYXBwaW5nJyAneycgbWFwcGluZ3MrPURhdGFJbnRlcmNoYW5nZU1hcHBpbmcKLQkgKiAgICAgbm9kZU5hbWU9U1RSSU5HICgnZXhwcmVzc2lvbicgJ3snICd9Jyk/IChhbWJpZ3VpdHkpICgnZm9ybWF0JyAneycgJ30nKT8gKCdtYXBwaW5nJyAneycgJ30nKT8gJ2tleXMnICd7JyBsb29rdXBLZXlzKz1EYXRhSW50ZXJjaGFuZ2VLZXkKLQkgKiAgICAgbm9kZU5hbWU9U1RSSU5HICgnZXhwcmVzc2lvbicgJ3snICd9Jyk/IChhbWJpZ3VpdHkpICgnZm9ybWF0JyAneycgJ30nKT8gKCdtYXBwaW5nJyAneycgJ30nKT8gKCdrZXlzJyAneycgJ30nKT8gKHJ1bGUgZW5kKQorCSAqICAgICBub2RlTmFtZT1TVFJJTkcgKCdleHByZXNzaW9uJyAneycgJ30nKT8gKGFtYmlndWl0eSkgKCdmb3JtYXQnICd7JyAnfScpPyAnZXhwb3NlJyAneycgZXhwb3J0RXhwb3Nlcys9RGF0YUludGVyY2hhbmdlRXhwb3NlCisJICogICAgIG5vZGVOYW1lPVNUUklORyAoJ2V4cHJlc3Npb24nICd7JyAnfScpPyAoYW1iaWd1aXR5KSAoJ2Zvcm1hdCcgJ3snICd9Jyk/ICgnZXhwb3NlJyAneycgJ30nKT8gJ21hcHBpbmcnICd7JyBtYXBwaW5ncys9RGF0YUludGVyY2hhbmdlTWFwcGluZworCSAqICAgICBub2RlTmFtZT1TVFJJTkcgKCdleHByZXNzaW9uJyAneycgJ30nKT8gKGFtYmlndWl0eSkgKCdmb3JtYXQnICd7JyAnfScpPyAoJ2V4cG9zZScgJ3snICd9Jyk/ICgnbWFwcGluZycgJ3snICd9Jyk/ICdrZXlzJyAneycgbG9va3VwS2V5cys9RGF0YUludGVyY2hhbmdlS2V5CisJICogICAgIG5vZGVOYW1lPVNUUklORyAoJ2V4cHJlc3Npb24nICd7JyAnfScpPyAoYW1iaWd1aXR5KSAoJ2Zvcm1hdCcgJ3snICd9Jyk/ICgnZXhwb3NlJyAneycgJ30nKT8gKCdtYXBwaW5nJyAneycgJ30nKT8gKCdrZXlzJyAneycgJ30nKT8gJ2V4cG9ydEZpbHRlcicgJ3snIGV4cG9ydEZpbHRlcj1EYXRhSW50ZXJjaGFuZ2VFeHBvcnRGaWx0ZXIKKwkgKiAgICAgbm9kZU5hbWU9U1RSSU5HICgnZXhwcmVzc2lvbicgJ3snICd9Jyk/IChhbWJpZ3VpdHkpICgnZm9ybWF0JyAneycgJ30nKT8gKCdleHBvc2UnICd7JyAnfScpPyAoJ21hcHBpbmcnICd7JyAnfScpPyAoJ2tleXMnICd7JyAnfScpPyAocnVsZSBlbmQpCiAJICovCi0JcHJvdGVjdGVkIHZvaWQgZW1pdF9EYXRhSW50ZXJjaGFuZ2VCZWFuX19fTG9va3VwS2V5d29yZF83XzBfTGVmdEN1cmx5QnJhY2tldEtleXdvcmRfN18xX1JpZ2h0Q3VybHlCcmFja2V0S2V5d29yZF83XzNfX3EoRU9iamVjdCBzZW1hbnRpY09iamVjdCwgSVN5bk5hdmlnYWJsZSB0cmFuc2l0aW9uLCBMaXN0PElOb2RlPiBub2RlcykgeworCXByb3RlY3RlZCB2b2lkIGVtaXRfRGF0YUludGVyY2hhbmdlQmVhbl9fX0xvb2t1cEtleXdvcmRfOF8wX0xlZnRDdXJseUJyYWNrZXRLZXl3b3JkXzhfMV9SaWdodEN1cmx5QnJhY2tldEtleXdvcmRfOF8zX19xKEVPYmplY3Qgc2VtYW50aWNPYmplY3QsIElTeW5OYXZpZ2FibGUgdHJhbnNpdGlvbiwgTGlzdDxJTm9kZT4gbm9kZXMpIHsKIAkJYWNjZXB0Tm9kZXModHJhbnNpdGlvbiwgbm9kZXMpOwogCX0KIAkKQEAgLTI0NCwyMiArNDU1LDY5IEBACiAJICogICAgICgnbWFwcGluZycgJ3snICd9Jyk/CiAJICoKIAkgKiBUaGlzIGFtYmlndW91cyBzeW50YXggb2NjdXJzIGF0OgotCSAqICAgICBlbGVtZW50TWFwPVNUUklORyAoJ2V4cHJlc3Npb24nICd7JyAnfScpPyAoJ2xvb2t1cCcgJ3snICd9Jyk/ICgnZm9ybWF0JyAneycgJ30nKT8gKGFtYmlndWl0eSkgJ2tleXMnICd7JyBsb29rdXBLZXlzKz1EYXRhSW50ZXJjaGFuZ2VLZXkKLQkgKiAgICAgZWxlbWVudE1hcD1TVFJJTkcgKCdleHByZXNzaW9uJyAneycgJ30nKT8gKCdsb29rdXAnICd7JyAnfScpPyAoJ2Zvcm1hdCcgJ3snICd9Jyk/IChhbWJpZ3VpdHkpICgna2V5cycgJ3snICd9Jyk/IChydWxlIGVuZCkKLQkgKiAgICAgZW50aXR5PVtMRW50aXR5fExGUU5dICgnZXhwcmVzc2lvbicgJ3snICd9Jyk/ICgnbG9va3VwJyAneycgJ30nKT8gKCdmb3JtYXQnICd7JyAnfScpPyAoYW1iaWd1aXR5KSAna2V5cycgJ3snIGxvb2t1cEtleXMrPURhdGFJbnRlcmNoYW5nZUtleQotCSAqICAgICBlbnRpdHk9W0xFbnRpdHl8TEZRTl0gKCdleHByZXNzaW9uJyAneycgJ30nKT8gKCdsb29rdXAnICd7JyAnfScpPyAoJ2Zvcm1hdCcgJ3snICd9Jyk/IChhbWJpZ3VpdHkpICgna2V5cycgJ3snICd9Jyk/IChydWxlIGVuZCkKLQkgKiAgICAgZXhwcmVzc2lvbis9RGF0YUludGVyY2hhbmdlRXhwcmVzc2lvbiAnfScgKCdsb29rdXAnICd7JyAnfScpPyAoJ2Zvcm1hdCcgJ3snICd9Jyk/IChhbWJpZ3VpdHkpICdrZXlzJyAneycgbG9va3VwS2V5cys9RGF0YUludGVyY2hhbmdlS2V5Ci0JICogICAgIGV4cHJlc3Npb24rPURhdGFJbnRlcmNoYW5nZUV4cHJlc3Npb24gJ30nICgnbG9va3VwJyAneycgJ30nKT8gKCdmb3JtYXQnICd7JyAnfScpPyAoYW1iaWd1aXR5KSAoJ2tleXMnICd7JyAnfScpPyAocnVsZSBlbmQpCi0JICogICAgIGZvcm1hdCs9RGF0YUludGVyY2hhbmdlRm9ybWF0ICd9JyAoYW1iaWd1aXR5KSAna2V5cycgJ3snIGxvb2t1cEtleXMrPURhdGFJbnRlcmNoYW5nZUtleQotCSAqICAgICBmb3JtYXQrPURhdGFJbnRlcmNoYW5nZUZvcm1hdCAnfScgKGFtYmlndWl0eSkgKCdrZXlzJyAneycgJ30nKT8gKHJ1bGUgZW5kKQotCSAqICAgICBsYXRlc3RQcm9wZXJ0eT1bTEVudGl0eUF0dHJpYnV0ZXxJRF0gKCdleHByZXNzaW9uJyAneycgJ30nKT8gKCdsb29rdXAnICd7JyAnfScpPyAoJ2Zvcm1hdCcgJ3snICd9Jyk/IChhbWJpZ3VpdHkpICdrZXlzJyAneycgbG9va3VwS2V5cys9RGF0YUludGVyY2hhbmdlS2V5Ci0JICogICAgIGxhdGVzdFByb3BlcnR5PVtMRW50aXR5QXR0cmlidXRlfElEXSAoJ2V4cHJlc3Npb24nICd7JyAnfScpPyAoJ2xvb2t1cCcgJ3snICd9Jyk/ICgnZm9ybWF0JyAneycgJ30nKT8gKGFtYmlndWl0eSkgKCdrZXlzJyAneycgJ30nKT8gKHJ1bGUgZW5kKQotCSAqICAgICBsb29rdXArPURhdGFJbnRlcmNoYW5nZUxvb2t1cCAnfScgKCdmb3JtYXQnICd7JyAnfScpPyAoYW1iaWd1aXR5KSAna2V5cycgJ3snIGxvb2t1cEtleXMrPURhdGFJbnRlcmNoYW5nZUtleQotCSAqICAgICBsb29rdXArPURhdGFJbnRlcmNoYW5nZUxvb2t1cCAnfScgKCdmb3JtYXQnICd7JyAnfScpPyAoYW1iaWd1aXR5KSAoJ2tleXMnICd7JyAnfScpPyAocnVsZSBlbmQpCi0JICogICAgIG5vZGVOYW1lPVNUUklORyAoJ2V4cHJlc3Npb24nICd7JyAnfScpPyAoJ2xvb2t1cCcgJ3snICd9Jyk/ICgnZm9ybWF0JyAneycgJ30nKT8gKGFtYmlndWl0eSkgJ2tleXMnICd7JyBsb29rdXBLZXlzKz1EYXRhSW50ZXJjaGFuZ2VLZXkKLQkgKiAgICAgbm9kZU5hbWU9U1RSSU5HICgnZXhwcmVzc2lvbicgJ3snICd9Jyk/ICgnbG9va3VwJyAneycgJ30nKT8gKCdmb3JtYXQnICd7JyAnfScpPyAoYW1iaWd1aXR5KSAoJ2tleXMnICd7JyAnfScpPyAocnVsZSBlbmQpCisJICogICAgICgKKwkgKiAgICAgICAgIGxhdGVzdEV4cFByb3BlcnR5PVtMRW50aXR5QXR0cmlidXRlfElEXSAKKwkgKiAgICAgICAgICgnZXhwcmVzc2lvbicgJ3snICd9Jyk/IAorCSAqICAgICAgICAgKCdsb29rdXAnICd7JyAnfScpPyAKKwkgKiAgICAgICAgICgnZm9ybWF0JyAneycgJ30nKT8gCisJICogICAgICAgICAoJ2V4cG9zZScgJ3snICd9Jyk/IAorCSAqICAgICAgICAgKGFtYmlndWl0eSkgCisJICogICAgICAgICAoJ2tleXMnICd7JyAnfScpPyAKKwkgKiAgICAgICAgICdleHBvcnRGaWx0ZXInIAorCSAqICAgICAgICAgJ3snIAorCSAqICAgICAgICAgZXhwb3J0RmlsdGVyPURhdGFJbnRlcmNoYW5nZUV4cG9ydEZpbHRlcgorCSAqICAgICApCisJICogICAgICgKKwkgKiAgICAgICAgIGxhdGVzdFByb3BlcnR5PVtMRW50aXR5QXR0cmlidXRlfElEXSAKKwkgKiAgICAgICAgICgnZXhwcmVzc2lvbicgJ3snICd9Jyk/IAorCSAqICAgICAgICAgKCdsb29rdXAnICd7JyAnfScpPyAKKwkgKiAgICAgICAgICgnZm9ybWF0JyAneycgJ30nKT8gCisJICogICAgICAgICAoJ2V4cG9zZScgJ3snICd9Jyk/IAorCSAqICAgICAgICAgKGFtYmlndWl0eSkgCisJICogICAgICAgICAoJ2tleXMnICd7JyAnfScpPyAKKwkgKiAgICAgICAgICdleHBvcnRGaWx0ZXInIAorCSAqICAgICAgICAgJ3snIAorCSAqICAgICAgICAgZXhwb3J0RmlsdGVyPURhdGFJbnRlcmNoYW5nZUV4cG9ydEZpbHRlcgorCSAqICAgICApCisJICogICAgIGVsZW1lbnRNYXA9U1RSSU5HICgnZXhwcmVzc2lvbicgJ3snICd9Jyk/ICgnbG9va3VwJyAneycgJ30nKT8gKCdmb3JtYXQnICd7JyAnfScpPyAoJ2V4cG9zZScgJ3snICd9Jyk/IChhbWJpZ3VpdHkpICdrZXlzJyAneycgbG9va3VwS2V5cys9RGF0YUludGVyY2hhbmdlS2V5CisJICogICAgIGVsZW1lbnRNYXA9U1RSSU5HICgnZXhwcmVzc2lvbicgJ3snICd9Jyk/ICgnbG9va3VwJyAneycgJ30nKT8gKCdmb3JtYXQnICd7JyAnfScpPyAoJ2V4cG9zZScgJ3snICd9Jyk/IChhbWJpZ3VpdHkpICgna2V5cycgJ3snICd9Jyk/ICdleHBvcnRGaWx0ZXInICd7JyBleHBvcnRGaWx0ZXI9RGF0YUludGVyY2hhbmdlRXhwb3J0RmlsdGVyCisJICogICAgIGVsZW1lbnRNYXA9U1RSSU5HICgnZXhwcmVzc2lvbicgJ3snICd9Jyk/ICgnbG9va3VwJyAneycgJ30nKT8gKCdmb3JtYXQnICd7JyAnfScpPyAoJ2V4cG9zZScgJ3snICd9Jyk/IChhbWJpZ3VpdHkpICgna2V5cycgJ3snICd9Jyk/IChydWxlIGVuZCkKKwkgKiAgICAgZW50aXR5PVtMRW50aXR5fExGUU5dICgnZXhwcmVzc2lvbicgJ3snICd9Jyk/ICgnbG9va3VwJyAneycgJ30nKT8gKCdmb3JtYXQnICd7JyAnfScpPyAoJ2V4cG9zZScgJ3snICd9Jyk/IChhbWJpZ3VpdHkpICdrZXlzJyAneycgbG9va3VwS2V5cys9RGF0YUludGVyY2hhbmdlS2V5CisJICogICAgIGVudGl0eT1bTEVudGl0eXxMRlFOXSAoJ2V4cHJlc3Npb24nICd7JyAnfScpPyAoJ2xvb2t1cCcgJ3snICd9Jyk/ICgnZm9ybWF0JyAneycgJ30nKT8gKCdleHBvc2UnICd7JyAnfScpPyAoYW1iaWd1aXR5KSAoJ2tleXMnICd7JyAnfScpPyAnZXhwb3J0RmlsdGVyJyAneycgZXhwb3J0RmlsdGVyPURhdGFJbnRlcmNoYW5nZUV4cG9ydEZpbHRlcgorCSAqICAgICBlbnRpdHk9W0xFbnRpdHl8TEZRTl0gKCdleHByZXNzaW9uJyAneycgJ30nKT8gKCdsb29rdXAnICd7JyAnfScpPyAoJ2Zvcm1hdCcgJ3snICd9Jyk/ICgnZXhwb3NlJyAneycgJ30nKT8gKGFtYmlndWl0eSkgKCdrZXlzJyAneycgJ30nKT8gKHJ1bGUgZW5kKQorCSAqICAgICBleHBvcnRFeHBvc2VzKz1EYXRhSW50ZXJjaGFuZ2VFeHBvc2UgJ30nIChhbWJpZ3VpdHkpICdrZXlzJyAneycgbG9va3VwS2V5cys9RGF0YUludGVyY2hhbmdlS2V5CisJICogICAgIGV4cG9ydEV4cG9zZXMrPURhdGFJbnRlcmNoYW5nZUV4cG9zZSAnfScgKGFtYmlndWl0eSkgKCdrZXlzJyAneycgJ30nKT8gJ2V4cG9ydEZpbHRlcicgJ3snIGV4cG9ydEZpbHRlcj1EYXRhSW50ZXJjaGFuZ2VFeHBvcnRGaWx0ZXIKKwkgKiAgICAgZXhwb3J0RXhwb3Nlcys9RGF0YUludGVyY2hhbmdlRXhwb3NlICd9JyAoYW1iaWd1aXR5KSAoJ2tleXMnICd7JyAnfScpPyAocnVsZSBlbmQpCisJICogICAgIGV4cHJlc3Npb24rPURhdGFJbnRlcmNoYW5nZUV4cHJlc3Npb24gJ30nICgnbG9va3VwJyAneycgJ30nKT8gKCdmb3JtYXQnICd7JyAnfScpPyAoJ2V4cG9zZScgJ3snICd9Jyk/IChhbWJpZ3VpdHkpICdrZXlzJyAneycgbG9va3VwS2V5cys9RGF0YUludGVyY2hhbmdlS2V5CisJICogICAgIGV4cHJlc3Npb24rPURhdGFJbnRlcmNoYW5nZUV4cHJlc3Npb24gJ30nICgnbG9va3VwJyAneycgJ30nKT8gKCdmb3JtYXQnICd7JyAnfScpPyAoJ2V4cG9zZScgJ3snICd9Jyk/IChhbWJpZ3VpdHkpICgna2V5cycgJ3snICd9Jyk/ICdleHBvcnRGaWx0ZXInICd7JyBleHBvcnRGaWx0ZXI9RGF0YUludGVyY2hhbmdlRXhwb3J0RmlsdGVyCisJICogICAgIGV4cHJlc3Npb24rPURhdGFJbnRlcmNoYW5nZUV4cHJlc3Npb24gJ30nICgnbG9va3VwJyAneycgJ30nKT8gKCdmb3JtYXQnICd7JyAnfScpPyAoJ2V4cG9zZScgJ3snICd9Jyk/IChhbWJpZ3VpdHkpICgna2V5cycgJ3snICd9Jyk/IChydWxlIGVuZCkKKwkgKiAgICAgZm9ybWF0Kz1EYXRhSW50ZXJjaGFuZ2VGb3JtYXQgJ30nICgnZXhwb3NlJyAneycgJ30nKT8gKGFtYmlndWl0eSkgJ2tleXMnICd7JyBsb29rdXBLZXlzKz1EYXRhSW50ZXJjaGFuZ2VLZXkKKwkgKiAgICAgZm9ybWF0Kz1EYXRhSW50ZXJjaGFuZ2VGb3JtYXQgJ30nICgnZXhwb3NlJyAneycgJ30nKT8gKGFtYmlndWl0eSkgKCdrZXlzJyAneycgJ30nKT8gJ2V4cG9ydEZpbHRlcicgJ3snIGV4cG9ydEZpbHRlcj1EYXRhSW50ZXJjaGFuZ2VFeHBvcnRGaWx0ZXIKKwkgKiAgICAgZm9ybWF0Kz1EYXRhSW50ZXJjaGFuZ2VGb3JtYXQgJ30nICgnZXhwb3NlJyAneycgJ30nKT8gKGFtYmlndWl0eSkgKCdrZXlzJyAneycgJ30nKT8gKHJ1bGUgZW5kKQorCSAqICAgICBsYXRlc3RFeHBQcm9wZXJ0eT1bTEVudGl0eUF0dHJpYnV0ZXxJRF0gKCdleHByZXNzaW9uJyAneycgJ30nKT8gKCdsb29rdXAnICd7JyAnfScpPyAoJ2Zvcm1hdCcgJ3snICd9Jyk/ICgnZXhwb3NlJyAneycgJ30nKT8gKGFtYmlndWl0eSkgJ2tleXMnICd7JyBsb29rdXBLZXlzKz1EYXRhSW50ZXJjaGFuZ2VLZXkKKwkgKiAgICAgbGF0ZXN0RXhwUHJvcGVydHk9W0xFbnRpdHlBdHRyaWJ1dGV8SURdICgnZXhwcmVzc2lvbicgJ3snICd9Jyk/ICgnbG9va3VwJyAneycgJ30nKT8gKCdmb3JtYXQnICd7JyAnfScpPyAoJ2V4cG9zZScgJ3snICd9Jyk/IChhbWJpZ3VpdHkpICgna2V5cycgJ3snICd9Jyk/IChydWxlIGVuZCkKKwkgKiAgICAgbGF0ZXN0UHJvcGVydHk9W0xFbnRpdHlBdHRyaWJ1dGV8SURdICgnZXhwcmVzc2lvbicgJ3snICd9Jyk/ICgnbG9va3VwJyAneycgJ30nKT8gKCdmb3JtYXQnICd7JyAnfScpPyAoJ2V4cG9zZScgJ3snICd9Jyk/IChhbWJpZ3VpdHkpICdrZXlzJyAneycgbG9va3VwS2V5cys9RGF0YUludGVyY2hhbmdlS2V5CisJICogICAgIGxhdGVzdFByb3BlcnR5PVtMRW50aXR5QXR0cmlidXRlfElEXSAoJ2V4cHJlc3Npb24nICd7JyAnfScpPyAoJ2xvb2t1cCcgJ3snICd9Jyk/ICgnZm9ybWF0JyAneycgJ30nKT8gKCdleHBvc2UnICd7JyAnfScpPyAoYW1iaWd1aXR5KSAoJ2tleXMnICd7JyAnfScpPyAocnVsZSBlbmQpCisJICogICAgIGxvb2t1cCs9RGF0YUludGVyY2hhbmdlTG9va3VwICd9JyAoJ2Zvcm1hdCcgJ3snICd9Jyk/ICgnZXhwb3NlJyAneycgJ30nKT8gKGFtYmlndWl0eSkgJ2tleXMnICd7JyBsb29rdXBLZXlzKz1EYXRhSW50ZXJjaGFuZ2VLZXkKKwkgKiAgICAgbG9va3VwKz1EYXRhSW50ZXJjaGFuZ2VMb29rdXAgJ30nICgnZm9ybWF0JyAneycgJ30nKT8gKCdleHBvc2UnICd7JyAnfScpPyAoYW1iaWd1aXR5KSAoJ2tleXMnICd7JyAnfScpPyAnZXhwb3J0RmlsdGVyJyAneycgZXhwb3J0RmlsdGVyPURhdGFJbnRlcmNoYW5nZUV4cG9ydEZpbHRlcgorCSAqICAgICBsb29rdXArPURhdGFJbnRlcmNoYW5nZUxvb2t1cCAnfScgKCdmb3JtYXQnICd7JyAnfScpPyAoJ2V4cG9zZScgJ3snICd9Jyk/IChhbWJpZ3VpdHkpICgna2V5cycgJ3snICd9Jyk/IChydWxlIGVuZCkKKwkgKiAgICAgbm9kZU5hbWU9U1RSSU5HICgnZXhwcmVzc2lvbicgJ3snICd9Jyk/ICgnbG9va3VwJyAneycgJ30nKT8gKCdmb3JtYXQnICd7JyAnfScpPyAoJ2V4cG9zZScgJ3snICd9Jyk/IChhbWJpZ3VpdHkpICdrZXlzJyAneycgbG9va3VwS2V5cys9RGF0YUludGVyY2hhbmdlS2V5CisJICogICAgIG5vZGVOYW1lPVNUUklORyAoJ2V4cHJlc3Npb24nICd7JyAnfScpPyAoJ2xvb2t1cCcgJ3snICd9Jyk/ICgnZm9ybWF0JyAneycgJ30nKT8gKCdleHBvc2UnICd7JyAnfScpPyAoYW1iaWd1aXR5KSAoJ2tleXMnICd7JyAnfScpPyAnZXhwb3J0RmlsdGVyJyAneycgZXhwb3J0RmlsdGVyPURhdGFJbnRlcmNoYW5nZUV4cG9ydEZpbHRlcgorCSAqICAgICBub2RlTmFtZT1TVFJJTkcgKCdleHByZXNzaW9uJyAneycgJ30nKT8gKCdsb29rdXAnICd7JyAnfScpPyAoJ2Zvcm1hdCcgJ3snICd9Jyk/ICgnZXhwb3NlJyAneycgJ30nKT8gKGFtYmlndWl0eSkgKCdrZXlzJyAneycgJ30nKT8gKHJ1bGUgZW5kKQogCSAqLwotCXByb3RlY3RlZCB2b2lkIGVtaXRfRGF0YUludGVyY2hhbmdlQmVhbl9fX01hcHBpbmdLZXl3b3JkXzlfMF9MZWZ0Q3VybHlCcmFja2V0S2V5d29yZF85XzFfUmlnaHRDdXJseUJyYWNrZXRLZXl3b3JkXzlfM19fcShFT2JqZWN0IHNlbWFudGljT2JqZWN0LCBJU3luTmF2aWdhYmxlIHRyYW5zaXRpb24sIExpc3Q8SU5vZGU+IG5vZGVzKSB7CisJcHJvdGVjdGVkIHZvaWQgZW1pdF9EYXRhSW50ZXJjaGFuZ2VCZWFuX19fTWFwcGluZ0tleXdvcmRfMTFfMF9MZWZ0Q3VybHlCcmFja2V0S2V5d29yZF8xMV8xX1JpZ2h0Q3VybHlCcmFja2V0S2V5d29yZF8xMV8zX19xKEVPYmplY3Qgc2VtYW50aWNPYmplY3QsIElTeW5OYXZpZ2FibGUgdHJhbnNpdGlvbiwgTGlzdDxJTm9kZT4gbm9kZXMpIHsKKwkJYWNjZXB0Tm9kZXModHJhbnNpdGlvbiwgbm9kZXMpOworCX0KKwkKKwkvKioKKwkgKiBBbWJpZ3VvdXMgc3ludGF4OgorCSAqICAgICAnaGlkZSc/CisJICoKKwkgKiBUaGlzIGFtYmlndW91cyBzeW50YXggb2NjdXJzIGF0OgorCSAqICAgICAocnVsZSBzdGFydCkgKGFtYmlndWl0eSkgKHJ1bGUgc3RhcnQpCisJICogICAgIGNvbmRpdGlvbj1EYXRhSW50ZXJjaGFuZ2VGaWx0ZXJDb25kaXRpb24gJ30nIChhbWJpZ3VpdHkpIChydWxlIGVuZCkKKwkgKi8KKwlwcm90ZWN0ZWQgdm9pZCBlbWl0X0RhdGFJbnRlcmNoYW5nZUV4cG9ydEZpbHRlcl9IaWRlS2V5d29yZF8yXzBfcShFT2JqZWN0IHNlbWFudGljT2JqZWN0LCBJU3luTmF2aWdhYmxlIHRyYW5zaXRpb24sIExpc3Q8SU5vZGU+IG5vZGVzKSB7CiAJCWFjY2VwdE5vZGVzKHRyYW5zaXRpb24sIG5vZGVzKTsKIAl9CiAJCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmRhdGFpbnRlcmNoYW5nZS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvZGF0YWludGVyY2hhbmdlL3NlcnZpY2VzL0RhdGFEU0xHcmFtbWFyQWNjZXNzLmphdmEgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmRhdGFpbnRlcmNoYW5nZS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvZGF0YWludGVyY2hhbmdlL3NlcnZpY2VzL0RhdGFEU0xHcmFtbWFyQWNjZXNzLmphdmEKaW5kZXggYTNiZjlkOC4uNmFkZjJhMCAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5kYXRhaW50ZXJjaGFuZ2Uvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2RhdGFpbnRlcmNoYW5nZS9zZXJ2aWNlcy9EYXRhRFNMR3JhbW1hckFjY2Vzcy5qYXZhCisrKyBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQuZGF0YWludGVyY2hhbmdlL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9kYXRhaW50ZXJjaGFuZ2Uvc2VydmljZXMvRGF0YURTTEdyYW1tYXJBY2Nlc3MuamF2YQpAQCAtMyw5ICszLDExIEBACiAgKiAgQ29weXJpZ2h0IChjKSAyMDExLCAyMDE2IC0gTG9ldHogR21iSCZDby5LRyAoNjkxMTUgSGVpZGVsYmVyZywgR2VybWFueSkgCiAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAqICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzICAgICAgICAgICAKLSAqICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgICAgICAgCisgKiAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSAyLjAgICAgICAgIAogICogIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0ICAgICAgICAgICAgICAgICAgCi0gKiAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAqICBodHRwczovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAqICBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgKiAgQ29udHJpYnV0b3JzOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICogCSAgIENocmlzdG9waGUgTG9ldHogKExvZXR6IEdtYkgmQ28uS0cpIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgpAQCAtMTU3LDI1ICsxNTksMjkgQEAKIAkJcHJpdmF0ZSBmaW5hbCBLZXl3b3JkIGNFbGVtZW50U2l6ZUtleXdvcmRfN18wID0gKEtleXdvcmQpY0dyb3VwXzcuZUNvbnRlbnRzKCkuZ2V0KDApOwogCQlwcml2YXRlIGZpbmFsIEFzc2lnbm1lbnQgY0VsZW1lbnRTaXplQXNzaWdubWVudF83XzEgPSAoQXNzaWdubWVudCljR3JvdXBfNy5lQ29udGVudHMoKS5nZXQoMSk7CiAJCXByaXZhdGUgZmluYWwgUnVsZUNhbGwgY0VsZW1lbnRTaXplSU5UVGVybWluYWxSdWxlQ2FsbF83XzFfMCA9IChSdWxlQ2FsbCljRWxlbWVudFNpemVBc3NpZ25tZW50XzdfMS5lQ29udGVudHMoKS5nZXQoMCk7Ci0JCXByaXZhdGUgZmluYWwgS2V5d29yZCBjRmlsZUtleXdvcmRfOCA9IChLZXl3b3JkKWNHcm91cC5lQ29udGVudHMoKS5nZXQoOCk7Ci0JCXByaXZhdGUgZmluYWwgQXNzaWdubWVudCBjRmlsZUVuZHBvaW50QXNzaWdubWVudF85ID0gKEFzc2lnbm1lbnQpY0dyb3VwLmVDb250ZW50cygpLmdldCg5KTsKLQkJcHJpdmF0ZSBmaW5hbCBSdWxlQ2FsbCBjRmlsZUVuZHBvaW50RGF0YUludGVyY2hhbmdlRmlsZVBhcnNlclJ1bGVDYWxsXzlfMCA9IChSdWxlQ2FsbCljRmlsZUVuZHBvaW50QXNzaWdubWVudF85LmVDb250ZW50cygpLmdldCgwKTsKLQkJcHJpdmF0ZSBmaW5hbCBLZXl3b3JkIGNQYXRoS2V5d29yZF8xMCA9IChLZXl3b3JkKWNHcm91cC5lQ29udGVudHMoKS5nZXQoMTApOwotCQlwcml2YXRlIGZpbmFsIEtleXdvcmQgY0xlZnRDdXJseUJyYWNrZXRLZXl3b3JkXzExID0gKEtleXdvcmQpY0dyb3VwLmVDb250ZW50cygpLmdldCgxMSk7Ci0JCXByaXZhdGUgZmluYWwgQXNzaWdubWVudCBjUGF0aEFzc2lnbm1lbnRfMTIgPSAoQXNzaWdubWVudCljR3JvdXAuZUNvbnRlbnRzKCkuZ2V0KDEyKTsKLQkJcHJpdmF0ZSBmaW5hbCBSdWxlQ2FsbCBjUGF0aERhdGFJbnRlcmNoYW5nZUJlYW5QYXJzZXJSdWxlQ2FsbF8xMl8wID0gKFJ1bGVDYWxsKWNQYXRoQXNzaWdubWVudF8xMi5lQ29udGVudHMoKS5nZXQoMCk7Ci0JCXByaXZhdGUgZmluYWwgS2V5d29yZCBjUmlnaHRDdXJseUJyYWNrZXRLZXl3b3JkXzEzID0gKEtleXdvcmQpY0dyb3VwLmVDb250ZW50cygpLmdldCgxMyk7CisJCXByaXZhdGUgZmluYWwgQXNzaWdubWVudCBjRGVsZXRlRmlsZUFmdGVySW1wb3J0QXNzaWdubWVudF84ID0gKEFzc2lnbm1lbnQpY0dyb3VwLmVDb250ZW50cygpLmdldCg4KTsKKwkJcHJpdmF0ZSBmaW5hbCBLZXl3b3JkIGNEZWxldGVGaWxlQWZ0ZXJJbXBvcnREZWxldGVGaWxlQWZ0ZXJJbXBvcnRLZXl3b3JkXzhfMCA9IChLZXl3b3JkKWNEZWxldGVGaWxlQWZ0ZXJJbXBvcnRBc3NpZ25tZW50XzguZUNvbnRlbnRzKCkuZ2V0KDApOworCQlwcml2YXRlIGZpbmFsIEtleXdvcmQgY0ZpbGVLZXl3b3JkXzkgPSAoS2V5d29yZCljR3JvdXAuZUNvbnRlbnRzKCkuZ2V0KDkpOworCQlwcml2YXRlIGZpbmFsIEFzc2lnbm1lbnQgY0ZpbGVFbmRwb2ludEFzc2lnbm1lbnRfMTAgPSAoQXNzaWdubWVudCljR3JvdXAuZUNvbnRlbnRzKCkuZ2V0KDEwKTsKKwkJcHJpdmF0ZSBmaW5hbCBSdWxlQ2FsbCBjRmlsZUVuZHBvaW50RGF0YUludGVyY2hhbmdlRmlsZVBhcnNlclJ1bGVDYWxsXzEwXzAgPSAoUnVsZUNhbGwpY0ZpbGVFbmRwb2ludEFzc2lnbm1lbnRfMTAuZUNvbnRlbnRzKCkuZ2V0KDApOworCQlwcml2YXRlIGZpbmFsIEtleXdvcmQgY1BhdGhLZXl3b3JkXzExID0gKEtleXdvcmQpY0dyb3VwLmVDb250ZW50cygpLmdldCgxMSk7CisJCXByaXZhdGUgZmluYWwgS2V5d29yZCBjTGVmdEN1cmx5QnJhY2tldEtleXdvcmRfMTIgPSAoS2V5d29yZCljR3JvdXAuZUNvbnRlbnRzKCkuZ2V0KDEyKTsKKwkJcHJpdmF0ZSBmaW5hbCBBc3NpZ25tZW50IGNQYXRoQXNzaWdubWVudF8xMyA9IChBc3NpZ25tZW50KWNHcm91cC5lQ29udGVudHMoKS5nZXQoMTMpOworCQlwcml2YXRlIGZpbmFsIFJ1bGVDYWxsIGNQYXRoRGF0YUludGVyY2hhbmdlQmVhblBhcnNlclJ1bGVDYWxsXzEzXzAgPSAoUnVsZUNhbGwpY1BhdGhBc3NpZ25tZW50XzEzLmVDb250ZW50cygpLmdldCgwKTsKKwkJcHJpdmF0ZSBmaW5hbCBLZXl3b3JkIGNSaWdodEN1cmx5QnJhY2tldEtleXdvcmRfMTQgPSAoS2V5d29yZCljR3JvdXAuZUNvbnRlbnRzKCkuZ2V0KDE0KTsKIAkJCiAJCS8vRGF0YUludGVyY2hhbmdlOgogCQkvLwl7RGF0YUludGVyY2hhbmdlfSAnaW50ZXJjaGFuZ2UnIG5hbWU9VFJBTlNMQVRBQkxFSUQgKGRlc2NyaXB0aW9uPz0nZGVzY3JpYmVkQnknIGRlc2NyaXB0aW9uVmFsdWU9VFJBTlNMQVRBQkxFU1RSSU5HKT8KIAkJLy8JbW9kZT1FbnRpdHlNYW5hZ2VyTW9kZSAoJ3ZlY3Rvck5hbWUnIHZlY3Rvck5hbWU9U1RSSU5HKT8KIAkJLy8JY3JlYXRlUmVwb3J0Pz0ncmVwb3J0Jz8gKCdlbGVtZW50U2l6ZScgZWxlbWVudFNpemU9SU5UKT8KKwkJLy8JZGVsZXRlRmlsZUFmdGVySW1wb3J0Pz0nZGVsZXRlRmlsZUFmdGVySW1wb3J0Jz8KIAkJLy8JJ2ZpbGUnIGZpbGVFbmRwb2ludD1EYXRhSW50ZXJjaGFuZ2VGaWxlICdwYXRoJyAneycgcGF0aCs9RGF0YUludGVyY2hhbmdlQmVhbiogJ30nOwogCQlAT3ZlcnJpZGUgcHVibGljIFBhcnNlclJ1bGUgZ2V0UnVsZSgpIHsgcmV0dXJuIHJ1bGU7IH0KIAkJCiAJCS8ve0RhdGFJbnRlcmNoYW5nZX0gJ2ludGVyY2hhbmdlJyBuYW1lPVRSQU5TTEFUQUJMRUlEIChkZXNjcmlwdGlvbj89J2Rlc2NyaWJlZEJ5JyBkZXNjcmlwdGlvblZhbHVlPVRSQU5TTEFUQUJMRVNUUklORyk/CiAJCS8vbW9kZT1FbnRpdHlNYW5hZ2VyTW9kZSAoJ3ZlY3Rvck5hbWUnIHZlY3Rvck5hbWU9U1RSSU5HKT8gY3JlYXRlUmVwb3J0Pz0ncmVwb3J0Jz8gKCdlbGVtZW50U2l6ZScgZWxlbWVudFNpemU9SU5UKT8KLQkJLy8nZmlsZScgZmlsZUVuZHBvaW50PURhdGFJbnRlcmNoYW5nZUZpbGUgJ3BhdGgnICd7JyBwYXRoKz1EYXRhSW50ZXJjaGFuZ2VCZWFuKiAnfScKKwkJLy9kZWxldGVGaWxlQWZ0ZXJJbXBvcnQ/PSdkZWxldGVGaWxlQWZ0ZXJJbXBvcnQnPyAnZmlsZScgZmlsZUVuZHBvaW50PURhdGFJbnRlcmNoYW5nZUZpbGUgJ3BhdGgnICd7JworCQkvL3BhdGgrPURhdGFJbnRlcmNoYW5nZUJlYW4qICd9JwogCQlwdWJsaWMgR3JvdXAgZ2V0R3JvdXAoKSB7IHJldHVybiBjR3JvdXA7IH0KIAkJCiAJCS8ve0RhdGFJbnRlcmNoYW5nZX0KQEAgLTI0MSwyOSArMjQ3LDM1IEBACiAJCS8vSU5UCiAJCXB1YmxpYyBSdWxlQ2FsbCBnZXRFbGVtZW50U2l6ZUlOVFRlcm1pbmFsUnVsZUNhbGxfN18xXzAoKSB7IHJldHVybiBjRWxlbWVudFNpemVJTlRUZXJtaW5hbFJ1bGVDYWxsXzdfMV8wOyB9CiAJCQorCQkvL2RlbGV0ZUZpbGVBZnRlckltcG9ydD89J2RlbGV0ZUZpbGVBZnRlckltcG9ydCc/CisJCXB1YmxpYyBBc3NpZ25tZW50IGdldERlbGV0ZUZpbGVBZnRlckltcG9ydEFzc2lnbm1lbnRfOCgpIHsgcmV0dXJuIGNEZWxldGVGaWxlQWZ0ZXJJbXBvcnRBc3NpZ25tZW50Xzg7IH0KKwkJCisJCS8vJ2RlbGV0ZUZpbGVBZnRlckltcG9ydCcKKwkJcHVibGljIEtleXdvcmQgZ2V0RGVsZXRlRmlsZUFmdGVySW1wb3J0RGVsZXRlRmlsZUFmdGVySW1wb3J0S2V5d29yZF84XzAoKSB7IHJldHVybiBjRGVsZXRlRmlsZUFmdGVySW1wb3J0RGVsZXRlRmlsZUFmdGVySW1wb3J0S2V5d29yZF84XzA7IH0KKwkJCiAJCS8vJ2ZpbGUnCi0JCXB1YmxpYyBLZXl3b3JkIGdldEZpbGVLZXl3b3JkXzgoKSB7IHJldHVybiBjRmlsZUtleXdvcmRfODsgfQorCQlwdWJsaWMgS2V5d29yZCBnZXRGaWxlS2V5d29yZF85KCkgeyByZXR1cm4gY0ZpbGVLZXl3b3JkXzk7IH0KIAkJCiAJCS8vZmlsZUVuZHBvaW50PURhdGFJbnRlcmNoYW5nZUZpbGUKLQkJcHVibGljIEFzc2lnbm1lbnQgZ2V0RmlsZUVuZHBvaW50QXNzaWdubWVudF85KCkgeyByZXR1cm4gY0ZpbGVFbmRwb2ludEFzc2lnbm1lbnRfOTsgfQorCQlwdWJsaWMgQXNzaWdubWVudCBnZXRGaWxlRW5kcG9pbnRBc3NpZ25tZW50XzEwKCkgeyByZXR1cm4gY0ZpbGVFbmRwb2ludEFzc2lnbm1lbnRfMTA7IH0KIAkJCiAJCS8vRGF0YUludGVyY2hhbmdlRmlsZQotCQlwdWJsaWMgUnVsZUNhbGwgZ2V0RmlsZUVuZHBvaW50RGF0YUludGVyY2hhbmdlRmlsZVBhcnNlclJ1bGVDYWxsXzlfMCgpIHsgcmV0dXJuIGNGaWxlRW5kcG9pbnREYXRhSW50ZXJjaGFuZ2VGaWxlUGFyc2VyUnVsZUNhbGxfOV8wOyB9CisJCXB1YmxpYyBSdWxlQ2FsbCBnZXRGaWxlRW5kcG9pbnREYXRhSW50ZXJjaGFuZ2VGaWxlUGFyc2VyUnVsZUNhbGxfMTBfMCgpIHsgcmV0dXJuIGNGaWxlRW5kcG9pbnREYXRhSW50ZXJjaGFuZ2VGaWxlUGFyc2VyUnVsZUNhbGxfMTBfMDsgfQogCQkKIAkJLy8ncGF0aCcKLQkJcHVibGljIEtleXdvcmQgZ2V0UGF0aEtleXdvcmRfMTAoKSB7IHJldHVybiBjUGF0aEtleXdvcmRfMTA7IH0KKwkJcHVibGljIEtleXdvcmQgZ2V0UGF0aEtleXdvcmRfMTEoKSB7IHJldHVybiBjUGF0aEtleXdvcmRfMTE7IH0KIAkJCiAJCS8vJ3snCi0JCXB1YmxpYyBLZXl3b3JkIGdldExlZnRDdXJseUJyYWNrZXRLZXl3b3JkXzExKCkgeyByZXR1cm4gY0xlZnRDdXJseUJyYWNrZXRLZXl3b3JkXzExOyB9CisJCXB1YmxpYyBLZXl3b3JkIGdldExlZnRDdXJseUJyYWNrZXRLZXl3b3JkXzEyKCkgeyByZXR1cm4gY0xlZnRDdXJseUJyYWNrZXRLZXl3b3JkXzEyOyB9CiAJCQogCQkvL3BhdGgrPURhdGFJbnRlcmNoYW5nZUJlYW4qCi0JCXB1YmxpYyBBc3NpZ25tZW50IGdldFBhdGhBc3NpZ25tZW50XzEyKCkgeyByZXR1cm4gY1BhdGhBc3NpZ25tZW50XzEyOyB9CisJCXB1YmxpYyBBc3NpZ25tZW50IGdldFBhdGhBc3NpZ25tZW50XzEzKCkgeyByZXR1cm4gY1BhdGhBc3NpZ25tZW50XzEzOyB9CiAJCQogCQkvL0RhdGFJbnRlcmNoYW5nZUJlYW4KLQkJcHVibGljIFJ1bGVDYWxsIGdldFBhdGhEYXRhSW50ZXJjaGFuZ2VCZWFuUGFyc2VyUnVsZUNhbGxfMTJfMCgpIHsgcmV0dXJuIGNQYXRoRGF0YUludGVyY2hhbmdlQmVhblBhcnNlclJ1bGVDYWxsXzEyXzA7IH0KKwkJcHVibGljIFJ1bGVDYWxsIGdldFBhdGhEYXRhSW50ZXJjaGFuZ2VCZWFuUGFyc2VyUnVsZUNhbGxfMTNfMCgpIHsgcmV0dXJuIGNQYXRoRGF0YUludGVyY2hhbmdlQmVhblBhcnNlclJ1bGVDYWxsXzEzXzA7IH0KIAkJCiAJCS8vJ30nCi0JCXB1YmxpYyBLZXl3b3JkIGdldFJpZ2h0Q3VybHlCcmFja2V0S2V5d29yZF8xMygpIHsgcmV0dXJuIGNSaWdodEN1cmx5QnJhY2tldEtleXdvcmRfMTM7IH0KKwkJcHVibGljIEtleXdvcmQgZ2V0UmlnaHRDdXJseUJyYWNrZXRLZXl3b3JkXzE0KCkgeyByZXR1cm4gY1JpZ2h0Q3VybHlCcmFja2V0S2V5d29yZF8xNDsgfQogCX0KIAlwdWJsaWMgY2xhc3MgRGF0YUludGVyY2hhbmdlRmlsZUVsZW1lbnRzIGV4dGVuZHMgQWJzdHJhY3RQYXJzZXJSdWxlRWxlbWVudEZpbmRlciB7CiAJCXByaXZhdGUgZmluYWwgUGFyc2VyUnVsZSBydWxlID0gKFBhcnNlclJ1bGUpIEdyYW1tYXJVdGlsLmZpbmRSdWxlRm9yTmFtZShnZXRHcmFtbWFyKCksICJvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmRhdGFpbnRlcmNoYW5nZS5EYXRhRFNMLkRhdGFJbnRlcmNoYW5nZUZpbGUiKTsKQEAgLTU4Nyw1NiArNTk5LDc3IEBACiAJCXByaXZhdGUgZmluYWwgQXNzaWdubWVudCBjRWxlbWVudE1hcEFzc2lnbm1lbnRfNF8xID0gKEFzc2lnbm1lbnQpY0dyb3VwXzQuZUNvbnRlbnRzKCkuZ2V0KDEpOwogCQlwcml2YXRlIGZpbmFsIFJ1bGVDYWxsIGNFbGVtZW50TWFwU1RSSU5HVGVybWluYWxSdWxlQ2FsbF80XzFfMCA9IChSdWxlQ2FsbCljRWxlbWVudE1hcEFzc2lnbm1lbnRfNF8xLmVDb250ZW50cygpLmdldCgwKTsKIAkJcHJpdmF0ZSBmaW5hbCBHcm91cCBjR3JvdXBfNSA9IChHcm91cCljR3JvdXAuZUNvbnRlbnRzKCkuZ2V0KDUpOwotCQlwcml2YXRlIGZpbmFsIEFzc2lnbm1lbnQgY01hcmtMYXRlc3RBc3NpZ25tZW50XzVfMCA9IChBc3NpZ25tZW50KWNHcm91cF81LmVDb250ZW50cygpLmdldCgwKTsKLQkJcHJpdmF0ZSBmaW5hbCBLZXl3b3JkIGNNYXJrTGF0ZXN0TWFya2VyS2V5d29yZF81XzBfMCA9IChLZXl3b3JkKWNNYXJrTGF0ZXN0QXNzaWdubWVudF81XzAuZUNvbnRlbnRzKCkuZ2V0KDApOworCQlwcml2YXRlIGZpbmFsIEFzc2lnbm1lbnQgY01hcmtMYXRlc3RJbXBvcnRBc3NpZ25tZW50XzVfMCA9IChBc3NpZ25tZW50KWNHcm91cF81LmVDb250ZW50cygpLmdldCgwKTsKKwkJcHJpdmF0ZSBmaW5hbCBLZXl3b3JkIGNNYXJrTGF0ZXN0SW1wb3J0TGF0ZXN0SW1wb3J0S2V5d29yZF81XzBfMCA9IChLZXl3b3JkKWNNYXJrTGF0ZXN0SW1wb3J0QXNzaWdubWVudF81XzAuZUNvbnRlbnRzKCkuZ2V0KDApOwogCQlwcml2YXRlIGZpbmFsIEFzc2lnbm1lbnQgY0xhdGVzdFByb3BlcnR5QXNzaWdubWVudF81XzEgPSAoQXNzaWdubWVudCljR3JvdXBfNS5lQ29udGVudHMoKS5nZXQoMSk7CiAJCXByaXZhdGUgZmluYWwgQ3Jvc3NSZWZlcmVuY2UgY0xhdGVzdFByb3BlcnR5TEVudGl0eUF0dHJpYnV0ZUNyb3NzUmVmZXJlbmNlXzVfMV8wID0gKENyb3NzUmVmZXJlbmNlKWNMYXRlc3RQcm9wZXJ0eUFzc2lnbm1lbnRfNV8xLmVDb250ZW50cygpLmdldCgwKTsKIAkJcHJpdmF0ZSBmaW5hbCBSdWxlQ2FsbCBjTGF0ZXN0UHJvcGVydHlMRW50aXR5QXR0cmlidXRlSURUZXJtaW5hbFJ1bGVDYWxsXzVfMV8wXzEgPSAoUnVsZUNhbGwpY0xhdGVzdFByb3BlcnR5TEVudGl0eUF0dHJpYnV0ZUNyb3NzUmVmZXJlbmNlXzVfMV8wLmVDb250ZW50cygpLmdldCgxKTsKIAkJcHJpdmF0ZSBmaW5hbCBHcm91cCBjR3JvdXBfNiA9IChHcm91cCljR3JvdXAuZUNvbnRlbnRzKCkuZ2V0KDYpOwotCQlwcml2YXRlIGZpbmFsIEtleXdvcmQgY0V4cHJlc3Npb25LZXl3b3JkXzZfMCA9IChLZXl3b3JkKWNHcm91cF82LmVDb250ZW50cygpLmdldCgwKTsKLQkJcHJpdmF0ZSBmaW5hbCBLZXl3b3JkIGNMZWZ0Q3VybHlCcmFja2V0S2V5d29yZF82XzEgPSAoS2V5d29yZCljR3JvdXBfNi5lQ29udGVudHMoKS5nZXQoMSk7Ci0JCXByaXZhdGUgZmluYWwgQXNzaWdubWVudCBjRXhwcmVzc2lvbkFzc2lnbm1lbnRfNl8yID0gKEFzc2lnbm1lbnQpY0dyb3VwXzYuZUNvbnRlbnRzKCkuZ2V0KDIpOwotCQlwcml2YXRlIGZpbmFsIFJ1bGVDYWxsIGNFeHByZXNzaW9uRGF0YUludGVyY2hhbmdlRXhwcmVzc2lvblBhcnNlclJ1bGVDYWxsXzZfMl8wID0gKFJ1bGVDYWxsKWNFeHByZXNzaW9uQXNzaWdubWVudF82XzIuZUNvbnRlbnRzKCkuZ2V0KDApOwotCQlwcml2YXRlIGZpbmFsIEtleXdvcmQgY1JpZ2h0Q3VybHlCcmFja2V0S2V5d29yZF82XzMgPSAoS2V5d29yZCljR3JvdXBfNi5lQ29udGVudHMoKS5nZXQoMyk7CisJCXByaXZhdGUgZmluYWwgQXNzaWdubWVudCBjTWFya0xhdGVzdEV4cG9ydEFzc2lnbm1lbnRfNl8wID0gKEFzc2lnbm1lbnQpY0dyb3VwXzYuZUNvbnRlbnRzKCkuZ2V0KDApOworCQlwcml2YXRlIGZpbmFsIEtleXdvcmQgY01hcmtMYXRlc3RFeHBvcnRMYXRlc3RFeHBvcnRLZXl3b3JkXzZfMF8wID0gKEtleXdvcmQpY01hcmtMYXRlc3RFeHBvcnRBc3NpZ25tZW50XzZfMC5lQ29udGVudHMoKS5nZXQoMCk7CisJCXByaXZhdGUgZmluYWwgQXNzaWdubWVudCBjTGF0ZXN0RXhwUHJvcGVydHlBc3NpZ25tZW50XzZfMSA9IChBc3NpZ25tZW50KWNHcm91cF82LmVDb250ZW50cygpLmdldCgxKTsKKwkJcHJpdmF0ZSBmaW5hbCBDcm9zc1JlZmVyZW5jZSBjTGF0ZXN0RXhwUHJvcGVydHlMRW50aXR5QXR0cmlidXRlQ3Jvc3NSZWZlcmVuY2VfNl8xXzAgPSAoQ3Jvc3NSZWZlcmVuY2UpY0xhdGVzdEV4cFByb3BlcnR5QXNzaWdubWVudF82XzEuZUNvbnRlbnRzKCkuZ2V0KDApOworCQlwcml2YXRlIGZpbmFsIFJ1bGVDYWxsIGNMYXRlc3RFeHBQcm9wZXJ0eUxFbnRpdHlBdHRyaWJ1dGVJRFRlcm1pbmFsUnVsZUNhbGxfNl8xXzBfMSA9IChSdWxlQ2FsbCljTGF0ZXN0RXhwUHJvcGVydHlMRW50aXR5QXR0cmlidXRlQ3Jvc3NSZWZlcmVuY2VfNl8xXzAuZUNvbnRlbnRzKCkuZ2V0KDEpOwogCQlwcml2YXRlIGZpbmFsIEdyb3VwIGNHcm91cF83ID0gKEdyb3VwKWNHcm91cC5lQ29udGVudHMoKS5nZXQoNyk7Ci0JCXByaXZhdGUgZmluYWwgS2V5d29yZCBjTG9va3VwS2V5d29yZF83XzAgPSAoS2V5d29yZCljR3JvdXBfNy5lQ29udGVudHMoKS5nZXQoMCk7CisJCXByaXZhdGUgZmluYWwgS2V5d29yZCBjRXhwcmVzc2lvbktleXdvcmRfN18wID0gKEtleXdvcmQpY0dyb3VwXzcuZUNvbnRlbnRzKCkuZ2V0KDApOwogCQlwcml2YXRlIGZpbmFsIEtleXdvcmQgY0xlZnRDdXJseUJyYWNrZXRLZXl3b3JkXzdfMSA9IChLZXl3b3JkKWNHcm91cF83LmVDb250ZW50cygpLmdldCgxKTsKLQkJcHJpdmF0ZSBmaW5hbCBBc3NpZ25tZW50IGNMb29rdXBBc3NpZ25tZW50XzdfMiA9IChBc3NpZ25tZW50KWNHcm91cF83LmVDb250ZW50cygpLmdldCgyKTsKLQkJcHJpdmF0ZSBmaW5hbCBSdWxlQ2FsbCBjTG9va3VwRGF0YUludGVyY2hhbmdlTG9va3VwUGFyc2VyUnVsZUNhbGxfN18yXzAgPSAoUnVsZUNhbGwpY0xvb2t1cEFzc2lnbm1lbnRfN18yLmVDb250ZW50cygpLmdldCgwKTsKKwkJcHJpdmF0ZSBmaW5hbCBBc3NpZ25tZW50IGNFeHByZXNzaW9uQXNzaWdubWVudF83XzIgPSAoQXNzaWdubWVudCljR3JvdXBfNy5lQ29udGVudHMoKS5nZXQoMik7CisJCXByaXZhdGUgZmluYWwgUnVsZUNhbGwgY0V4cHJlc3Npb25EYXRhSW50ZXJjaGFuZ2VFeHByZXNzaW9uUGFyc2VyUnVsZUNhbGxfN18yXzAgPSAoUnVsZUNhbGwpY0V4cHJlc3Npb25Bc3NpZ25tZW50XzdfMi5lQ29udGVudHMoKS5nZXQoMCk7CiAJCXByaXZhdGUgZmluYWwgS2V5d29yZCBjUmlnaHRDdXJseUJyYWNrZXRLZXl3b3JkXzdfMyA9IChLZXl3b3JkKWNHcm91cF83LmVDb250ZW50cygpLmdldCgzKTsKIAkJcHJpdmF0ZSBmaW5hbCBHcm91cCBjR3JvdXBfOCA9IChHcm91cCljR3JvdXAuZUNvbnRlbnRzKCkuZ2V0KDgpOwotCQlwcml2YXRlIGZpbmFsIEtleXdvcmQgY0Zvcm1hdEtleXdvcmRfOF8wID0gKEtleXdvcmQpY0dyb3VwXzguZUNvbnRlbnRzKCkuZ2V0KDApOworCQlwcml2YXRlIGZpbmFsIEtleXdvcmQgY0xvb2t1cEtleXdvcmRfOF8wID0gKEtleXdvcmQpY0dyb3VwXzguZUNvbnRlbnRzKCkuZ2V0KDApOwogCQlwcml2YXRlIGZpbmFsIEtleXdvcmQgY0xlZnRDdXJseUJyYWNrZXRLZXl3b3JkXzhfMSA9IChLZXl3b3JkKWNHcm91cF84LmVDb250ZW50cygpLmdldCgxKTsKLQkJcHJpdmF0ZSBmaW5hbCBBc3NpZ25tZW50IGNGb3JtYXRBc3NpZ25tZW50XzhfMiA9IChBc3NpZ25tZW50KWNHcm91cF84LmVDb250ZW50cygpLmdldCgyKTsKLQkJcHJpdmF0ZSBmaW5hbCBSdWxlQ2FsbCBjRm9ybWF0RGF0YUludGVyY2hhbmdlRm9ybWF0UGFyc2VyUnVsZUNhbGxfOF8yXzAgPSAoUnVsZUNhbGwpY0Zvcm1hdEFzc2lnbm1lbnRfOF8yLmVDb250ZW50cygpLmdldCgwKTsKKwkJcHJpdmF0ZSBmaW5hbCBBc3NpZ25tZW50IGNMb29rdXBBc3NpZ25tZW50XzhfMiA9IChBc3NpZ25tZW50KWNHcm91cF84LmVDb250ZW50cygpLmdldCgyKTsKKwkJcHJpdmF0ZSBmaW5hbCBSdWxlQ2FsbCBjTG9va3VwRGF0YUludGVyY2hhbmdlTG9va3VwUGFyc2VyUnVsZUNhbGxfOF8yXzAgPSAoUnVsZUNhbGwpY0xvb2t1cEFzc2lnbm1lbnRfOF8yLmVDb250ZW50cygpLmdldCgwKTsKIAkJcHJpdmF0ZSBmaW5hbCBLZXl3b3JkIGNSaWdodEN1cmx5QnJhY2tldEtleXdvcmRfOF8zID0gKEtleXdvcmQpY0dyb3VwXzguZUNvbnRlbnRzKCkuZ2V0KDMpOwogCQlwcml2YXRlIGZpbmFsIEdyb3VwIGNHcm91cF85ID0gKEdyb3VwKWNHcm91cC5lQ29udGVudHMoKS5nZXQoOSk7Ci0JCXByaXZhdGUgZmluYWwgS2V5d29yZCBjTWFwcGluZ0tleXdvcmRfOV8wID0gKEtleXdvcmQpY0dyb3VwXzkuZUNvbnRlbnRzKCkuZ2V0KDApOworCQlwcml2YXRlIGZpbmFsIEtleXdvcmQgY0Zvcm1hdEtleXdvcmRfOV8wID0gKEtleXdvcmQpY0dyb3VwXzkuZUNvbnRlbnRzKCkuZ2V0KDApOwogCQlwcml2YXRlIGZpbmFsIEtleXdvcmQgY0xlZnRDdXJseUJyYWNrZXRLZXl3b3JkXzlfMSA9IChLZXl3b3JkKWNHcm91cF85LmVDb250ZW50cygpLmdldCgxKTsKLQkJcHJpdmF0ZSBmaW5hbCBBc3NpZ25tZW50IGNNYXBwaW5nc0Fzc2lnbm1lbnRfOV8yID0gKEFzc2lnbm1lbnQpY0dyb3VwXzkuZUNvbnRlbnRzKCkuZ2V0KDIpOwotCQlwcml2YXRlIGZpbmFsIFJ1bGVDYWxsIGNNYXBwaW5nc0RhdGFJbnRlcmNoYW5nZU1hcHBpbmdQYXJzZXJSdWxlQ2FsbF85XzJfMCA9IChSdWxlQ2FsbCljTWFwcGluZ3NBc3NpZ25tZW50XzlfMi5lQ29udGVudHMoKS5nZXQoMCk7CisJCXByaXZhdGUgZmluYWwgQXNzaWdubWVudCBjRm9ybWF0QXNzaWdubWVudF85XzIgPSAoQXNzaWdubWVudCljR3JvdXBfOS5lQ29udGVudHMoKS5nZXQoMik7CisJCXByaXZhdGUgZmluYWwgUnVsZUNhbGwgY0Zvcm1hdERhdGFJbnRlcmNoYW5nZUZvcm1hdFBhcnNlclJ1bGVDYWxsXzlfMl8wID0gKFJ1bGVDYWxsKWNGb3JtYXRBc3NpZ25tZW50XzlfMi5lQ29udGVudHMoKS5nZXQoMCk7CiAJCXByaXZhdGUgZmluYWwgS2V5d29yZCBjUmlnaHRDdXJseUJyYWNrZXRLZXl3b3JkXzlfMyA9IChLZXl3b3JkKWNHcm91cF85LmVDb250ZW50cygpLmdldCgzKTsKIAkJcHJpdmF0ZSBmaW5hbCBHcm91cCBjR3JvdXBfMTAgPSAoR3JvdXApY0dyb3VwLmVDb250ZW50cygpLmdldCgxMCk7Ci0JCXByaXZhdGUgZmluYWwgS2V5d29yZCBjS2V5c0tleXdvcmRfMTBfMCA9IChLZXl3b3JkKWNHcm91cF8xMC5lQ29udGVudHMoKS5nZXQoMCk7CisJCXByaXZhdGUgZmluYWwgS2V5d29yZCBjRXhwb3NlS2V5d29yZF8xMF8wID0gKEtleXdvcmQpY0dyb3VwXzEwLmVDb250ZW50cygpLmdldCgwKTsKIAkJcHJpdmF0ZSBmaW5hbCBLZXl3b3JkIGNMZWZ0Q3VybHlCcmFja2V0S2V5d29yZF8xMF8xID0gKEtleXdvcmQpY0dyb3VwXzEwLmVDb250ZW50cygpLmdldCgxKTsKLQkJcHJpdmF0ZSBmaW5hbCBBc3NpZ25tZW50IGNMb29rdXBLZXlzQXNzaWdubWVudF8xMF8yID0gKEFzc2lnbm1lbnQpY0dyb3VwXzEwLmVDb250ZW50cygpLmdldCgyKTsKLQkJcHJpdmF0ZSBmaW5hbCBSdWxlQ2FsbCBjTG9va3VwS2V5c0RhdGFJbnRlcmNoYW5nZUtleVBhcnNlclJ1bGVDYWxsXzEwXzJfMCA9IChSdWxlQ2FsbCljTG9va3VwS2V5c0Fzc2lnbm1lbnRfMTBfMi5lQ29udGVudHMoKS5nZXQoMCk7CisJCXByaXZhdGUgZmluYWwgQXNzaWdubWVudCBjRXhwb3J0RXhwb3Nlc0Fzc2lnbm1lbnRfMTBfMiA9IChBc3NpZ25tZW50KWNHcm91cF8xMC5lQ29udGVudHMoKS5nZXQoMik7CisJCXByaXZhdGUgZmluYWwgUnVsZUNhbGwgY0V4cG9ydEV4cG9zZXNEYXRhSW50ZXJjaGFuZ2VFeHBvc2VQYXJzZXJSdWxlQ2FsbF8xMF8yXzAgPSAoUnVsZUNhbGwpY0V4cG9ydEV4cG9zZXNBc3NpZ25tZW50XzEwXzIuZUNvbnRlbnRzKCkuZ2V0KDApOwogCQlwcml2YXRlIGZpbmFsIEtleXdvcmQgY1JpZ2h0Q3VybHlCcmFja2V0S2V5d29yZF8xMF8zID0gKEtleXdvcmQpY0dyb3VwXzEwLmVDb250ZW50cygpLmdldCgzKTsKKwkJcHJpdmF0ZSBmaW5hbCBHcm91cCBjR3JvdXBfMTEgPSAoR3JvdXApY0dyb3VwLmVDb250ZW50cygpLmdldCgxMSk7CisJCXByaXZhdGUgZmluYWwgS2V5d29yZCBjTWFwcGluZ0tleXdvcmRfMTFfMCA9IChLZXl3b3JkKWNHcm91cF8xMS5lQ29udGVudHMoKS5nZXQoMCk7CisJCXByaXZhdGUgZmluYWwgS2V5d29yZCBjTGVmdEN1cmx5QnJhY2tldEtleXdvcmRfMTFfMSA9IChLZXl3b3JkKWNHcm91cF8xMS5lQ29udGVudHMoKS5nZXQoMSk7CisJCXByaXZhdGUgZmluYWwgQXNzaWdubWVudCBjTWFwcGluZ3NBc3NpZ25tZW50XzExXzIgPSAoQXNzaWdubWVudCljR3JvdXBfMTEuZUNvbnRlbnRzKCkuZ2V0KDIpOworCQlwcml2YXRlIGZpbmFsIFJ1bGVDYWxsIGNNYXBwaW5nc0RhdGFJbnRlcmNoYW5nZU1hcHBpbmdQYXJzZXJSdWxlQ2FsbF8xMV8yXzAgPSAoUnVsZUNhbGwpY01hcHBpbmdzQXNzaWdubWVudF8xMV8yLmVDb250ZW50cygpLmdldCgwKTsKKwkJcHJpdmF0ZSBmaW5hbCBLZXl3b3JkIGNSaWdodEN1cmx5QnJhY2tldEtleXdvcmRfMTFfMyA9IChLZXl3b3JkKWNHcm91cF8xMS5lQ29udGVudHMoKS5nZXQoMyk7CisJCXByaXZhdGUgZmluYWwgR3JvdXAgY0dyb3VwXzEyID0gKEdyb3VwKWNHcm91cC5lQ29udGVudHMoKS5nZXQoMTIpOworCQlwcml2YXRlIGZpbmFsIEtleXdvcmQgY0tleXNLZXl3b3JkXzEyXzAgPSAoS2V5d29yZCljR3JvdXBfMTIuZUNvbnRlbnRzKCkuZ2V0KDApOworCQlwcml2YXRlIGZpbmFsIEtleXdvcmQgY0xlZnRDdXJseUJyYWNrZXRLZXl3b3JkXzEyXzEgPSAoS2V5d29yZCljR3JvdXBfMTIuZUNvbnRlbnRzKCkuZ2V0KDEpOworCQlwcml2YXRlIGZpbmFsIEFzc2lnbm1lbnQgY0xvb2t1cEtleXNBc3NpZ25tZW50XzEyXzIgPSAoQXNzaWdubWVudCljR3JvdXBfMTIuZUNvbnRlbnRzKCkuZ2V0KDIpOworCQlwcml2YXRlIGZpbmFsIFJ1bGVDYWxsIGNMb29rdXBLZXlzRGF0YUludGVyY2hhbmdlS2V5UGFyc2VyUnVsZUNhbGxfMTJfMl8wID0gKFJ1bGVDYWxsKWNMb29rdXBLZXlzQXNzaWdubWVudF8xMl8yLmVDb250ZW50cygpLmdldCgwKTsKKwkJcHJpdmF0ZSBmaW5hbCBLZXl3b3JkIGNSaWdodEN1cmx5QnJhY2tldEtleXdvcmRfMTJfMyA9IChLZXl3b3JkKWNHcm91cF8xMi5lQ29udGVudHMoKS5nZXQoMyk7CisJCXByaXZhdGUgZmluYWwgR3JvdXAgY0dyb3VwXzEzID0gKEdyb3VwKWNHcm91cC5lQ29udGVudHMoKS5nZXQoMTMpOworCQlwcml2YXRlIGZpbmFsIEtleXdvcmQgY0V4cG9ydEZpbHRlcktleXdvcmRfMTNfMCA9IChLZXl3b3JkKWNHcm91cF8xMy5lQ29udGVudHMoKS5nZXQoMCk7CisJCXByaXZhdGUgZmluYWwgS2V5d29yZCBjTGVmdEN1cmx5QnJhY2tldEtleXdvcmRfMTNfMSA9IChLZXl3b3JkKWNHcm91cF8xMy5lQ29udGVudHMoKS5nZXQoMSk7CisJCXByaXZhdGUgZmluYWwgQXNzaWdubWVudCBjRXhwb3J0RmlsdGVyQXNzaWdubWVudF8xM18yID0gKEFzc2lnbm1lbnQpY0dyb3VwXzEzLmVDb250ZW50cygpLmdldCgyKTsKKwkJcHJpdmF0ZSBmaW5hbCBSdWxlQ2FsbCBjRXhwb3J0RmlsdGVyRGF0YUludGVyY2hhbmdlRXhwb3J0RmlsdGVyUGFyc2VyUnVsZUNhbGxfMTNfMl8wID0gKFJ1bGVDYWxsKWNFeHBvcnRGaWx0ZXJBc3NpZ25tZW50XzEzXzIuZUNvbnRlbnRzKCkuZ2V0KDApOworCQlwcml2YXRlIGZpbmFsIEtleXdvcmQgY1JpZ2h0Q3VybHlCcmFja2V0S2V5d29yZF8xM18zID0gKEtleXdvcmQpY0dyb3VwXzEzLmVDb250ZW50cygpLmdldCgzKTsKIAkJCiAJCS8vRGF0YUludGVyY2hhbmdlQmVhbjoKIAkJLy8Je0RhdGFJbnRlcmNoYW5nZUJlYW59CiAJCS8vCSdlbnRpdHknIGVudGl0eT1bZW50aXR5OjpMRW50aXR5fExGUU5dICgnbm9kZU5hbWUnIG5vZGVOYW1lPVNUUklORyk/ICgnY3JlYXRlT24nIGVsZW1lbnRNYXA9U1RSSU5HKT8KLQkJLy8JKG1hcmtMYXRlc3Q/PSdtYXJrZXInIGxhdGVzdFByb3BlcnR5PVtlbnRpdHk6OkxFbnRpdHlBdHRyaWJ1dGVdKT8gKCdleHByZXNzaW9uJyAneycKLQkJLy8JZXhwcmVzc2lvbis9RGF0YUludGVyY2hhbmdlRXhwcmVzc2lvbiogJ30nKT8gKCdsb29rdXAnICd7JyBsb29rdXArPURhdGFJbnRlcmNoYW5nZUxvb2t1cCogJ30nKT8gKCdmb3JtYXQnICd7JwotCQkvLwlmb3JtYXQrPURhdGFJbnRlcmNoYW5nZUZvcm1hdCogJ30nKT8gKCdtYXBwaW5nJyAneycgbWFwcGluZ3MrPURhdGFJbnRlcmNoYW5nZU1hcHBpbmcqICd9Jyk/ICgna2V5cycgJ3snCi0JCS8vCWxvb2t1cEtleXMrPURhdGFJbnRlcmNoYW5nZUtleSogJ30nKT87CisJCS8vCShtYXJrTGF0ZXN0SW1wb3J0Pz0nbGF0ZXN0SW1wb3J0JyBsYXRlc3RQcm9wZXJ0eT1bZW50aXR5OjpMRW50aXR5QXR0cmlidXRlXSk/IChtYXJrTGF0ZXN0RXhwb3J0Pz0nbGF0ZXN0RXhwb3J0JworCQkvLwlsYXRlc3RFeHBQcm9wZXJ0eT1bZW50aXR5OjpMRW50aXR5QXR0cmlidXRlXSk/ICgnZXhwcmVzc2lvbicgJ3snIGV4cHJlc3Npb24rPURhdGFJbnRlcmNoYW5nZUV4cHJlc3Npb24qICd9Jyk/CisJCS8vCSgnbG9va3VwJyAneycgbG9va3VwKz1EYXRhSW50ZXJjaGFuZ2VMb29rdXAqICd9Jyk/ICgnZm9ybWF0JyAneycgZm9ybWF0Kz1EYXRhSW50ZXJjaGFuZ2VGb3JtYXQqICd9Jyk/ICgnZXhwb3NlJyAneycKKwkJLy8JZXhwb3J0RXhwb3Nlcys9RGF0YUludGVyY2hhbmdlRXhwb3NlKiAnfScpPyAoJ21hcHBpbmcnICd7JyBtYXBwaW5ncys9RGF0YUludGVyY2hhbmdlTWFwcGluZyogJ30nKT8gKCdrZXlzJyAneycKKwkJLy8JbG9va3VwS2V5cys9RGF0YUludGVyY2hhbmdlS2V5KiAnfScpPyAoJ2V4cG9ydEZpbHRlcicgJ3snIGV4cG9ydEZpbHRlcj1EYXRhSW50ZXJjaGFuZ2VFeHBvcnRGaWx0ZXIgJ30nKT87CiAJCUBPdmVycmlkZSBwdWJsaWMgUGFyc2VyUnVsZSBnZXRSdWxlKCkgeyByZXR1cm4gcnVsZTsgfQogCQkKIAkJLy97RGF0YUludGVyY2hhbmdlQmVhbn0gJ2VudGl0eScgZW50aXR5PVtlbnRpdHk6OkxFbnRpdHl8TEZRTl0gKCdub2RlTmFtZScgbm9kZU5hbWU9U1RSSU5HKT8gKCdjcmVhdGVPbicKLQkJLy9lbGVtZW50TWFwPVNUUklORyk/IChtYXJrTGF0ZXN0Pz0nbWFya2VyJyBsYXRlc3RQcm9wZXJ0eT1bZW50aXR5OjpMRW50aXR5QXR0cmlidXRlXSk/ICgnZXhwcmVzc2lvbicgJ3snCisJCS8vZWxlbWVudE1hcD1TVFJJTkcpPyAobWFya0xhdGVzdEltcG9ydD89J2xhdGVzdEltcG9ydCcgbGF0ZXN0UHJvcGVydHk9W2VudGl0eTo6TEVudGl0eUF0dHJpYnV0ZV0pPworCQkvLyhtYXJrTGF0ZXN0RXhwb3J0Pz0nbGF0ZXN0RXhwb3J0JyBsYXRlc3RFeHBQcm9wZXJ0eT1bZW50aXR5OjpMRW50aXR5QXR0cmlidXRlXSk/ICgnZXhwcmVzc2lvbicgJ3snCiAJCS8vZXhwcmVzc2lvbis9RGF0YUludGVyY2hhbmdlRXhwcmVzc2lvbiogJ30nKT8gKCdsb29rdXAnICd7JyBsb29rdXArPURhdGFJbnRlcmNoYW5nZUxvb2t1cCogJ30nKT8gKCdmb3JtYXQnICd7JwotCQkvL2Zvcm1hdCs9RGF0YUludGVyY2hhbmdlRm9ybWF0KiAnfScpPyAoJ21hcHBpbmcnICd7JyBtYXBwaW5ncys9RGF0YUludGVyY2hhbmdlTWFwcGluZyogJ30nKT8gKCdrZXlzJyAneycKLQkJLy9sb29rdXBLZXlzKz1EYXRhSW50ZXJjaGFuZ2VLZXkqICd9Jyk/CisJCS8vZm9ybWF0Kz1EYXRhSW50ZXJjaGFuZ2VGb3JtYXQqICd9Jyk/ICgnZXhwb3NlJyAneycgZXhwb3J0RXhwb3Nlcys9RGF0YUludGVyY2hhbmdlRXhwb3NlKiAnfScpPyAoJ21hcHBpbmcnICd7JworCQkvL21hcHBpbmdzKz1EYXRhSW50ZXJjaGFuZ2VNYXBwaW5nKiAnfScpPyAoJ2tleXMnICd7JyBsb29rdXBLZXlzKz1EYXRhSW50ZXJjaGFuZ2VLZXkqICd9Jyk/ICgnZXhwb3J0RmlsdGVyJyAneycKKwkJLy9leHBvcnRGaWx0ZXI9RGF0YUludGVyY2hhbmdlRXhwb3J0RmlsdGVyICd9Jyk/CiAJCXB1YmxpYyBHcm91cCBnZXRHcm91cCgpIHsgcmV0dXJuIGNHcm91cDsgfQogCQkKIAkJLy97RGF0YUludGVyY2hhbmdlQmVhbn0KQEAgLTY3OCwxNCArNzExLDE0IEBACiAJCS8vU1RSSU5HCiAJCXB1YmxpYyBSdWxlQ2FsbCBnZXRFbGVtZW50TWFwU1RSSU5HVGVybWluYWxSdWxlQ2FsbF80XzFfMCgpIHsgcmV0dXJuIGNFbGVtZW50TWFwU1RSSU5HVGVybWluYWxSdWxlQ2FsbF80XzFfMDsgfQogCQkKLQkJLy8obWFya0xhdGVzdD89J21hcmtlcicgbGF0ZXN0UHJvcGVydHk9W2VudGl0eTo6TEVudGl0eUF0dHJpYnV0ZV0pPworCQkvLyhtYXJrTGF0ZXN0SW1wb3J0Pz0nbGF0ZXN0SW1wb3J0JyBsYXRlc3RQcm9wZXJ0eT1bZW50aXR5OjpMRW50aXR5QXR0cmlidXRlXSk/CiAJCXB1YmxpYyBHcm91cCBnZXRHcm91cF81KCkgeyByZXR1cm4gY0dyb3VwXzU7IH0KIAkJCi0JCS8vbWFya0xhdGVzdD89J21hcmtlcicKLQkJcHVibGljIEFzc2lnbm1lbnQgZ2V0TWFya0xhdGVzdEFzc2lnbm1lbnRfNV8wKCkgeyByZXR1cm4gY01hcmtMYXRlc3RBc3NpZ25tZW50XzVfMDsgfQorCQkvL21hcmtMYXRlc3RJbXBvcnQ/PSdsYXRlc3RJbXBvcnQnCisJCXB1YmxpYyBBc3NpZ25tZW50IGdldE1hcmtMYXRlc3RJbXBvcnRBc3NpZ25tZW50XzVfMCgpIHsgcmV0dXJuIGNNYXJrTGF0ZXN0SW1wb3J0QXNzaWdubWVudF81XzA7IH0KIAkJCi0JCS8vJ21hcmtlcicKLQkJcHVibGljIEtleXdvcmQgZ2V0TWFya0xhdGVzdE1hcmtlcktleXdvcmRfNV8wXzAoKSB7IHJldHVybiBjTWFya0xhdGVzdE1hcmtlcktleXdvcmRfNV8wXzA7IH0KKwkJLy8nbGF0ZXN0SW1wb3J0JworCQlwdWJsaWMgS2V5d29yZCBnZXRNYXJrTGF0ZXN0SW1wb3J0TGF0ZXN0SW1wb3J0S2V5d29yZF81XzBfMCgpIHsgcmV0dXJuIGNNYXJrTGF0ZXN0SW1wb3J0TGF0ZXN0SW1wb3J0S2V5d29yZF81XzBfMDsgfQogCQkKIAkJLy9sYXRlc3RQcm9wZXJ0eT1bZW50aXR5OjpMRW50aXR5QXR0cmlidXRlXQogCQlwdWJsaWMgQXNzaWdubWVudCBnZXRMYXRlc3RQcm9wZXJ0eUFzc2lnbm1lbnRfNV8xKCkgeyByZXR1cm4gY0xhdGVzdFByb3BlcnR5QXNzaWdubWVudF81XzE7IH0KQEAgLTY5Niw5NSArNzI5LDE0OSBAQAogCQkvL0lECiAJCXB1YmxpYyBSdWxlQ2FsbCBnZXRMYXRlc3RQcm9wZXJ0eUxFbnRpdHlBdHRyaWJ1dGVJRFRlcm1pbmFsUnVsZUNhbGxfNV8xXzBfMSgpIHsgcmV0dXJuIGNMYXRlc3RQcm9wZXJ0eUxFbnRpdHlBdHRyaWJ1dGVJRFRlcm1pbmFsUnVsZUNhbGxfNV8xXzBfMTsgfQogCQkKLQkJLy8oJ2V4cHJlc3Npb24nICd7JyBleHByZXNzaW9uKz1EYXRhSW50ZXJjaGFuZ2VFeHByZXNzaW9uKiAnfScpPworCQkvLyhtYXJrTGF0ZXN0RXhwb3J0Pz0nbGF0ZXN0RXhwb3J0JyBsYXRlc3RFeHBQcm9wZXJ0eT1bZW50aXR5OjpMRW50aXR5QXR0cmlidXRlXSk/CiAJCXB1YmxpYyBHcm91cCBnZXRHcm91cF82KCkgeyByZXR1cm4gY0dyb3VwXzY7IH0KIAkJCi0JCS8vJ2V4cHJlc3Npb24nCi0JCXB1YmxpYyBLZXl3b3JkIGdldEV4cHJlc3Npb25LZXl3b3JkXzZfMCgpIHsgcmV0dXJuIGNFeHByZXNzaW9uS2V5d29yZF82XzA7IH0KKwkJLy9tYXJrTGF0ZXN0RXhwb3J0Pz0nbGF0ZXN0RXhwb3J0JworCQlwdWJsaWMgQXNzaWdubWVudCBnZXRNYXJrTGF0ZXN0RXhwb3J0QXNzaWdubWVudF82XzAoKSB7IHJldHVybiBjTWFya0xhdGVzdEV4cG9ydEFzc2lnbm1lbnRfNl8wOyB9CiAJCQotCQkvLyd7JwotCQlwdWJsaWMgS2V5d29yZCBnZXRMZWZ0Q3VybHlCcmFja2V0S2V5d29yZF82XzEoKSB7IHJldHVybiBjTGVmdEN1cmx5QnJhY2tldEtleXdvcmRfNl8xOyB9CisJCS8vJ2xhdGVzdEV4cG9ydCcKKwkJcHVibGljIEtleXdvcmQgZ2V0TWFya0xhdGVzdEV4cG9ydExhdGVzdEV4cG9ydEtleXdvcmRfNl8wXzAoKSB7IHJldHVybiBjTWFya0xhdGVzdEV4cG9ydExhdGVzdEV4cG9ydEtleXdvcmRfNl8wXzA7IH0KIAkJCi0JCS8vZXhwcmVzc2lvbis9RGF0YUludGVyY2hhbmdlRXhwcmVzc2lvbioKLQkJcHVibGljIEFzc2lnbm1lbnQgZ2V0RXhwcmVzc2lvbkFzc2lnbm1lbnRfNl8yKCkgeyByZXR1cm4gY0V4cHJlc3Npb25Bc3NpZ25tZW50XzZfMjsgfQorCQkvL2xhdGVzdEV4cFByb3BlcnR5PVtlbnRpdHk6OkxFbnRpdHlBdHRyaWJ1dGVdCisJCXB1YmxpYyBBc3NpZ25tZW50IGdldExhdGVzdEV4cFByb3BlcnR5QXNzaWdubWVudF82XzEoKSB7IHJldHVybiBjTGF0ZXN0RXhwUHJvcGVydHlBc3NpZ25tZW50XzZfMTsgfQogCQkKLQkJLy9EYXRhSW50ZXJjaGFuZ2VFeHByZXNzaW9uCi0JCXB1YmxpYyBSdWxlQ2FsbCBnZXRFeHByZXNzaW9uRGF0YUludGVyY2hhbmdlRXhwcmVzc2lvblBhcnNlclJ1bGVDYWxsXzZfMl8wKCkgeyByZXR1cm4gY0V4cHJlc3Npb25EYXRhSW50ZXJjaGFuZ2VFeHByZXNzaW9uUGFyc2VyUnVsZUNhbGxfNl8yXzA7IH0KKwkJLy9bZW50aXR5OjpMRW50aXR5QXR0cmlidXRlXQorCQlwdWJsaWMgQ3Jvc3NSZWZlcmVuY2UgZ2V0TGF0ZXN0RXhwUHJvcGVydHlMRW50aXR5QXR0cmlidXRlQ3Jvc3NSZWZlcmVuY2VfNl8xXzAoKSB7IHJldHVybiBjTGF0ZXN0RXhwUHJvcGVydHlMRW50aXR5QXR0cmlidXRlQ3Jvc3NSZWZlcmVuY2VfNl8xXzA7IH0KIAkJCi0JCS8vJ30nCi0JCXB1YmxpYyBLZXl3b3JkIGdldFJpZ2h0Q3VybHlCcmFja2V0S2V5d29yZF82XzMoKSB7IHJldHVybiBjUmlnaHRDdXJseUJyYWNrZXRLZXl3b3JkXzZfMzsgfQorCQkvL0lECisJCXB1YmxpYyBSdWxlQ2FsbCBnZXRMYXRlc3RFeHBQcm9wZXJ0eUxFbnRpdHlBdHRyaWJ1dGVJRFRlcm1pbmFsUnVsZUNhbGxfNl8xXzBfMSgpIHsgcmV0dXJuIGNMYXRlc3RFeHBQcm9wZXJ0eUxFbnRpdHlBdHRyaWJ1dGVJRFRlcm1pbmFsUnVsZUNhbGxfNl8xXzBfMTsgfQogCQkKLQkJLy8oJ2xvb2t1cCcgJ3snIGxvb2t1cCs9RGF0YUludGVyY2hhbmdlTG9va3VwKiAnfScpPworCQkvLygnZXhwcmVzc2lvbicgJ3snIGV4cHJlc3Npb24rPURhdGFJbnRlcmNoYW5nZUV4cHJlc3Npb24qICd9Jyk/CiAJCXB1YmxpYyBHcm91cCBnZXRHcm91cF83KCkgeyByZXR1cm4gY0dyb3VwXzc7IH0KIAkJCi0JCS8vJ2xvb2t1cCcKLQkJcHVibGljIEtleXdvcmQgZ2V0TG9va3VwS2V5d29yZF83XzAoKSB7IHJldHVybiBjTG9va3VwS2V5d29yZF83XzA7IH0KKwkJLy8nZXhwcmVzc2lvbicKKwkJcHVibGljIEtleXdvcmQgZ2V0RXhwcmVzc2lvbktleXdvcmRfN18wKCkgeyByZXR1cm4gY0V4cHJlc3Npb25LZXl3b3JkXzdfMDsgfQogCQkKIAkJLy8neycKIAkJcHVibGljIEtleXdvcmQgZ2V0TGVmdEN1cmx5QnJhY2tldEtleXdvcmRfN18xKCkgeyByZXR1cm4gY0xlZnRDdXJseUJyYWNrZXRLZXl3b3JkXzdfMTsgfQogCQkKLQkJLy9sb29rdXArPURhdGFJbnRlcmNoYW5nZUxvb2t1cCoKLQkJcHVibGljIEFzc2lnbm1lbnQgZ2V0TG9va3VwQXNzaWdubWVudF83XzIoKSB7IHJldHVybiBjTG9va3VwQXNzaWdubWVudF83XzI7IH0KKwkJLy9leHByZXNzaW9uKz1EYXRhSW50ZXJjaGFuZ2VFeHByZXNzaW9uKgorCQlwdWJsaWMgQXNzaWdubWVudCBnZXRFeHByZXNzaW9uQXNzaWdubWVudF83XzIoKSB7IHJldHVybiBjRXhwcmVzc2lvbkFzc2lnbm1lbnRfN18yOyB9CiAJCQotCQkvL0RhdGFJbnRlcmNoYW5nZUxvb2t1cAotCQlwdWJsaWMgUnVsZUNhbGwgZ2V0TG9va3VwRGF0YUludGVyY2hhbmdlTG9va3VwUGFyc2VyUnVsZUNhbGxfN18yXzAoKSB7IHJldHVybiBjTG9va3VwRGF0YUludGVyY2hhbmdlTG9va3VwUGFyc2VyUnVsZUNhbGxfN18yXzA7IH0KKwkJLy9EYXRhSW50ZXJjaGFuZ2VFeHByZXNzaW9uCisJCXB1YmxpYyBSdWxlQ2FsbCBnZXRFeHByZXNzaW9uRGF0YUludGVyY2hhbmdlRXhwcmVzc2lvblBhcnNlclJ1bGVDYWxsXzdfMl8wKCkgeyByZXR1cm4gY0V4cHJlc3Npb25EYXRhSW50ZXJjaGFuZ2VFeHByZXNzaW9uUGFyc2VyUnVsZUNhbGxfN18yXzA7IH0KIAkJCiAJCS8vJ30nCiAJCXB1YmxpYyBLZXl3b3JkIGdldFJpZ2h0Q3VybHlCcmFja2V0S2V5d29yZF83XzMoKSB7IHJldHVybiBjUmlnaHRDdXJseUJyYWNrZXRLZXl3b3JkXzdfMzsgfQogCQkKLQkJLy8oJ2Zvcm1hdCcgJ3snIGZvcm1hdCs9RGF0YUludGVyY2hhbmdlRm9ybWF0KiAnfScpPworCQkvLygnbG9va3VwJyAneycgbG9va3VwKz1EYXRhSW50ZXJjaGFuZ2VMb29rdXAqICd9Jyk/CiAJCXB1YmxpYyBHcm91cCBnZXRHcm91cF84KCkgeyByZXR1cm4gY0dyb3VwXzg7IH0KIAkJCi0JCS8vJ2Zvcm1hdCcKLQkJcHVibGljIEtleXdvcmQgZ2V0Rm9ybWF0S2V5d29yZF84XzAoKSB7IHJldHVybiBjRm9ybWF0S2V5d29yZF84XzA7IH0KKwkJLy8nbG9va3VwJworCQlwdWJsaWMgS2V5d29yZCBnZXRMb29rdXBLZXl3b3JkXzhfMCgpIHsgcmV0dXJuIGNMb29rdXBLZXl3b3JkXzhfMDsgfQogCQkKIAkJLy8neycKIAkJcHVibGljIEtleXdvcmQgZ2V0TGVmdEN1cmx5QnJhY2tldEtleXdvcmRfOF8xKCkgeyByZXR1cm4gY0xlZnRDdXJseUJyYWNrZXRLZXl3b3JkXzhfMTsgfQogCQkKLQkJLy9mb3JtYXQrPURhdGFJbnRlcmNoYW5nZUZvcm1hdCoKLQkJcHVibGljIEFzc2lnbm1lbnQgZ2V0Rm9ybWF0QXNzaWdubWVudF84XzIoKSB7IHJldHVybiBjRm9ybWF0QXNzaWdubWVudF84XzI7IH0KKwkJLy9sb29rdXArPURhdGFJbnRlcmNoYW5nZUxvb2t1cCoKKwkJcHVibGljIEFzc2lnbm1lbnQgZ2V0TG9va3VwQXNzaWdubWVudF84XzIoKSB7IHJldHVybiBjTG9va3VwQXNzaWdubWVudF84XzI7IH0KIAkJCi0JCS8vRGF0YUludGVyY2hhbmdlRm9ybWF0Ci0JCXB1YmxpYyBSdWxlQ2FsbCBnZXRGb3JtYXREYXRhSW50ZXJjaGFuZ2VGb3JtYXRQYXJzZXJSdWxlQ2FsbF84XzJfMCgpIHsgcmV0dXJuIGNGb3JtYXREYXRhSW50ZXJjaGFuZ2VGb3JtYXRQYXJzZXJSdWxlQ2FsbF84XzJfMDsgfQorCQkvL0RhdGFJbnRlcmNoYW5nZUxvb2t1cAorCQlwdWJsaWMgUnVsZUNhbGwgZ2V0TG9va3VwRGF0YUludGVyY2hhbmdlTG9va3VwUGFyc2VyUnVsZUNhbGxfOF8yXzAoKSB7IHJldHVybiBjTG9va3VwRGF0YUludGVyY2hhbmdlTG9va3VwUGFyc2VyUnVsZUNhbGxfOF8yXzA7IH0KIAkJCiAJCS8vJ30nCiAJCXB1YmxpYyBLZXl3b3JkIGdldFJpZ2h0Q3VybHlCcmFja2V0S2V5d29yZF84XzMoKSB7IHJldHVybiBjUmlnaHRDdXJseUJyYWNrZXRLZXl3b3JkXzhfMzsgfQogCQkKLQkJLy8oJ21hcHBpbmcnICd7JyBtYXBwaW5ncys9RGF0YUludGVyY2hhbmdlTWFwcGluZyogJ30nKT8KKwkJLy8oJ2Zvcm1hdCcgJ3snIGZvcm1hdCs9RGF0YUludGVyY2hhbmdlRm9ybWF0KiAnfScpPwogCQlwdWJsaWMgR3JvdXAgZ2V0R3JvdXBfOSgpIHsgcmV0dXJuIGNHcm91cF85OyB9CiAJCQotCQkvLydtYXBwaW5nJwotCQlwdWJsaWMgS2V5d29yZCBnZXRNYXBwaW5nS2V5d29yZF85XzAoKSB7IHJldHVybiBjTWFwcGluZ0tleXdvcmRfOV8wOyB9CisJCS8vJ2Zvcm1hdCcKKwkJcHVibGljIEtleXdvcmQgZ2V0Rm9ybWF0S2V5d29yZF85XzAoKSB7IHJldHVybiBjRm9ybWF0S2V5d29yZF85XzA7IH0KIAkJCiAJCS8vJ3snCiAJCXB1YmxpYyBLZXl3b3JkIGdldExlZnRDdXJseUJyYWNrZXRLZXl3b3JkXzlfMSgpIHsgcmV0dXJuIGNMZWZ0Q3VybHlCcmFja2V0S2V5d29yZF85XzE7IH0KIAkJCi0JCS8vbWFwcGluZ3MrPURhdGFJbnRlcmNoYW5nZU1hcHBpbmcqCi0JCXB1YmxpYyBBc3NpZ25tZW50IGdldE1hcHBpbmdzQXNzaWdubWVudF85XzIoKSB7IHJldHVybiBjTWFwcGluZ3NBc3NpZ25tZW50XzlfMjsgfQorCQkvL2Zvcm1hdCs9RGF0YUludGVyY2hhbmdlRm9ybWF0KgorCQlwdWJsaWMgQXNzaWdubWVudCBnZXRGb3JtYXRBc3NpZ25tZW50XzlfMigpIHsgcmV0dXJuIGNGb3JtYXRBc3NpZ25tZW50XzlfMjsgfQogCQkKLQkJLy9EYXRhSW50ZXJjaGFuZ2VNYXBwaW5nCi0JCXB1YmxpYyBSdWxlQ2FsbCBnZXRNYXBwaW5nc0RhdGFJbnRlcmNoYW5nZU1hcHBpbmdQYXJzZXJSdWxlQ2FsbF85XzJfMCgpIHsgcmV0dXJuIGNNYXBwaW5nc0RhdGFJbnRlcmNoYW5nZU1hcHBpbmdQYXJzZXJSdWxlQ2FsbF85XzJfMDsgfQorCQkvL0RhdGFJbnRlcmNoYW5nZUZvcm1hdAorCQlwdWJsaWMgUnVsZUNhbGwgZ2V0Rm9ybWF0RGF0YUludGVyY2hhbmdlRm9ybWF0UGFyc2VyUnVsZUNhbGxfOV8yXzAoKSB7IHJldHVybiBjRm9ybWF0RGF0YUludGVyY2hhbmdlRm9ybWF0UGFyc2VyUnVsZUNhbGxfOV8yXzA7IH0KIAkJCiAJCS8vJ30nCiAJCXB1YmxpYyBLZXl3b3JkIGdldFJpZ2h0Q3VybHlCcmFja2V0S2V5d29yZF85XzMoKSB7IHJldHVybiBjUmlnaHRDdXJseUJyYWNrZXRLZXl3b3JkXzlfMzsgfQogCQkKLQkJLy8oJ2tleXMnICd7JyBsb29rdXBLZXlzKz1EYXRhSW50ZXJjaGFuZ2VLZXkqICd9Jyk/CisJCS8vKCdleHBvc2UnICd7JyBleHBvcnRFeHBvc2VzKz1EYXRhSW50ZXJjaGFuZ2VFeHBvc2UqICd9Jyk/CiAJCXB1YmxpYyBHcm91cCBnZXRHcm91cF8xMCgpIHsgcmV0dXJuIGNHcm91cF8xMDsgfQogCQkKLQkJLy8na2V5cycKLQkJcHVibGljIEtleXdvcmQgZ2V0S2V5c0tleXdvcmRfMTBfMCgpIHsgcmV0dXJuIGNLZXlzS2V5d29yZF8xMF8wOyB9CisJCS8vJ2V4cG9zZScKKwkJcHVibGljIEtleXdvcmQgZ2V0RXhwb3NlS2V5d29yZF8xMF8wKCkgeyByZXR1cm4gY0V4cG9zZUtleXdvcmRfMTBfMDsgfQogCQkKIAkJLy8neycKIAkJcHVibGljIEtleXdvcmQgZ2V0TGVmdEN1cmx5QnJhY2tldEtleXdvcmRfMTBfMSgpIHsgcmV0dXJuIGNMZWZ0Q3VybHlCcmFja2V0S2V5d29yZF8xMF8xOyB9CiAJCQotCQkvL2xvb2t1cEtleXMrPURhdGFJbnRlcmNoYW5nZUtleSoKLQkJcHVibGljIEFzc2lnbm1lbnQgZ2V0TG9va3VwS2V5c0Fzc2lnbm1lbnRfMTBfMigpIHsgcmV0dXJuIGNMb29rdXBLZXlzQXNzaWdubWVudF8xMF8yOyB9CisJCS8vZXhwb3J0RXhwb3Nlcys9RGF0YUludGVyY2hhbmdlRXhwb3NlKgorCQlwdWJsaWMgQXNzaWdubWVudCBnZXRFeHBvcnRFeHBvc2VzQXNzaWdubWVudF8xMF8yKCkgeyByZXR1cm4gY0V4cG9ydEV4cG9zZXNBc3NpZ25tZW50XzEwXzI7IH0KIAkJCi0JCS8vRGF0YUludGVyY2hhbmdlS2V5Ci0JCXB1YmxpYyBSdWxlQ2FsbCBnZXRMb29rdXBLZXlzRGF0YUludGVyY2hhbmdlS2V5UGFyc2VyUnVsZUNhbGxfMTBfMl8wKCkgeyByZXR1cm4gY0xvb2t1cEtleXNEYXRhSW50ZXJjaGFuZ2VLZXlQYXJzZXJSdWxlQ2FsbF8xMF8yXzA7IH0KKwkJLy9EYXRhSW50ZXJjaGFuZ2VFeHBvc2UKKwkJcHVibGljIFJ1bGVDYWxsIGdldEV4cG9ydEV4cG9zZXNEYXRhSW50ZXJjaGFuZ2VFeHBvc2VQYXJzZXJSdWxlQ2FsbF8xMF8yXzAoKSB7IHJldHVybiBjRXhwb3J0RXhwb3Nlc0RhdGFJbnRlcmNoYW5nZUV4cG9zZVBhcnNlclJ1bGVDYWxsXzEwXzJfMDsgfQogCQkKIAkJLy8nfScKIAkJcHVibGljIEtleXdvcmQgZ2V0UmlnaHRDdXJseUJyYWNrZXRLZXl3b3JkXzEwXzMoKSB7IHJldHVybiBjUmlnaHRDdXJseUJyYWNrZXRLZXl3b3JkXzEwXzM7IH0KKwkJCisJCS8vKCdtYXBwaW5nJyAneycgbWFwcGluZ3MrPURhdGFJbnRlcmNoYW5nZU1hcHBpbmcqICd9Jyk/CisJCXB1YmxpYyBHcm91cCBnZXRHcm91cF8xMSgpIHsgcmV0dXJuIGNHcm91cF8xMTsgfQorCQkKKwkJLy8nbWFwcGluZycKKwkJcHVibGljIEtleXdvcmQgZ2V0TWFwcGluZ0tleXdvcmRfMTFfMCgpIHsgcmV0dXJuIGNNYXBwaW5nS2V5d29yZF8xMV8wOyB9CisJCQorCQkvLyd7JworCQlwdWJsaWMgS2V5d29yZCBnZXRMZWZ0Q3VybHlCcmFja2V0S2V5d29yZF8xMV8xKCkgeyByZXR1cm4gY0xlZnRDdXJseUJyYWNrZXRLZXl3b3JkXzExXzE7IH0KKwkJCisJCS8vbWFwcGluZ3MrPURhdGFJbnRlcmNoYW5nZU1hcHBpbmcqCisJCXB1YmxpYyBBc3NpZ25tZW50IGdldE1hcHBpbmdzQXNzaWdubWVudF8xMV8yKCkgeyByZXR1cm4gY01hcHBpbmdzQXNzaWdubWVudF8xMV8yOyB9CisJCQorCQkvL0RhdGFJbnRlcmNoYW5nZU1hcHBpbmcKKwkJcHVibGljIFJ1bGVDYWxsIGdldE1hcHBpbmdzRGF0YUludGVyY2hhbmdlTWFwcGluZ1BhcnNlclJ1bGVDYWxsXzExXzJfMCgpIHsgcmV0dXJuIGNNYXBwaW5nc0RhdGFJbnRlcmNoYW5nZU1hcHBpbmdQYXJzZXJSdWxlQ2FsbF8xMV8yXzA7IH0KKwkJCisJCS8vJ30nCisJCXB1YmxpYyBLZXl3b3JkIGdldFJpZ2h0Q3VybHlCcmFja2V0S2V5d29yZF8xMV8zKCkgeyByZXR1cm4gY1JpZ2h0Q3VybHlCcmFja2V0S2V5d29yZF8xMV8zOyB9CisJCQorCQkvLygna2V5cycgJ3snIGxvb2t1cEtleXMrPURhdGFJbnRlcmNoYW5nZUtleSogJ30nKT8KKwkJcHVibGljIEdyb3VwIGdldEdyb3VwXzEyKCkgeyByZXR1cm4gY0dyb3VwXzEyOyB9CisJCQorCQkvLydrZXlzJworCQlwdWJsaWMgS2V5d29yZCBnZXRLZXlzS2V5d29yZF8xMl8wKCkgeyByZXR1cm4gY0tleXNLZXl3b3JkXzEyXzA7IH0KKwkJCisJCS8vJ3snCisJCXB1YmxpYyBLZXl3b3JkIGdldExlZnRDdXJseUJyYWNrZXRLZXl3b3JkXzEyXzEoKSB7IHJldHVybiBjTGVmdEN1cmx5QnJhY2tldEtleXdvcmRfMTJfMTsgfQorCQkKKwkJLy9sb29rdXBLZXlzKz1EYXRhSW50ZXJjaGFuZ2VLZXkqCisJCXB1YmxpYyBBc3NpZ25tZW50IGdldExvb2t1cEtleXNBc3NpZ25tZW50XzEyXzIoKSB7IHJldHVybiBjTG9va3VwS2V5c0Fzc2lnbm1lbnRfMTJfMjsgfQorCQkKKwkJLy9EYXRhSW50ZXJjaGFuZ2VLZXkKKwkJcHVibGljIFJ1bGVDYWxsIGdldExvb2t1cEtleXNEYXRhSW50ZXJjaGFuZ2VLZXlQYXJzZXJSdWxlQ2FsbF8xMl8yXzAoKSB7IHJldHVybiBjTG9va3VwS2V5c0RhdGFJbnRlcmNoYW5nZUtleVBhcnNlclJ1bGVDYWxsXzEyXzJfMDsgfQorCQkKKwkJLy8nfScKKwkJcHVibGljIEtleXdvcmQgZ2V0UmlnaHRDdXJseUJyYWNrZXRLZXl3b3JkXzEyXzMoKSB7IHJldHVybiBjUmlnaHRDdXJseUJyYWNrZXRLZXl3b3JkXzEyXzM7IH0KKwkJCisJCS8vKCdleHBvcnRGaWx0ZXInICd7JyBleHBvcnRGaWx0ZXI9RGF0YUludGVyY2hhbmdlRXhwb3J0RmlsdGVyICd9Jyk/CisJCXB1YmxpYyBHcm91cCBnZXRHcm91cF8xMygpIHsgcmV0dXJuIGNHcm91cF8xMzsgfQorCQkKKwkJLy8nZXhwb3J0RmlsdGVyJworCQlwdWJsaWMgS2V5d29yZCBnZXRFeHBvcnRGaWx0ZXJLZXl3b3JkXzEzXzAoKSB7IHJldHVybiBjRXhwb3J0RmlsdGVyS2V5d29yZF8xM18wOyB9CisJCQorCQkvLyd7JworCQlwdWJsaWMgS2V5d29yZCBnZXRMZWZ0Q3VybHlCcmFja2V0S2V5d29yZF8xM18xKCkgeyByZXR1cm4gY0xlZnRDdXJseUJyYWNrZXRLZXl3b3JkXzEzXzE7IH0KKwkJCisJCS8vZXhwb3J0RmlsdGVyPURhdGFJbnRlcmNoYW5nZUV4cG9ydEZpbHRlcgorCQlwdWJsaWMgQXNzaWdubWVudCBnZXRFeHBvcnRGaWx0ZXJBc3NpZ25tZW50XzEzXzIoKSB7IHJldHVybiBjRXhwb3J0RmlsdGVyQXNzaWdubWVudF8xM18yOyB9CisJCQorCQkvL0RhdGFJbnRlcmNoYW5nZUV4cG9ydEZpbHRlcgorCQlwdWJsaWMgUnVsZUNhbGwgZ2V0RXhwb3J0RmlsdGVyRGF0YUludGVyY2hhbmdlRXhwb3J0RmlsdGVyUGFyc2VyUnVsZUNhbGxfMTNfMl8wKCkgeyByZXR1cm4gY0V4cG9ydEZpbHRlckRhdGFJbnRlcmNoYW5nZUV4cG9ydEZpbHRlclBhcnNlclJ1bGVDYWxsXzEzXzJfMDsgfQorCQkKKwkJLy8nfScKKwkJcHVibGljIEtleXdvcmQgZ2V0UmlnaHRDdXJseUJyYWNrZXRLZXl3b3JkXzEzXzMoKSB7IHJldHVybiBjUmlnaHRDdXJseUJyYWNrZXRLZXl3b3JkXzEzXzM7IH0KIAl9CiAJcHVibGljIGNsYXNzIERhdGFJbnRlcmNoYW5nZUtleUVsZW1lbnRzIGV4dGVuZHMgQWJzdHJhY3RQYXJzZXJSdWxlRWxlbWVudEZpbmRlciB7CiAJCXByaXZhdGUgZmluYWwgUGFyc2VyUnVsZSBydWxlID0gKFBhcnNlclJ1bGUpIEdyYW1tYXJVdGlsLmZpbmRSdWxlRm9yTmFtZShnZXRHcmFtbWFyKCksICJvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmRhdGFpbnRlcmNoYW5nZS5EYXRhRFNMLkRhdGFJbnRlcmNoYW5nZUtleSIpOwpAQCAtMTE4OSw2ICsxMjc2LDIzMyBAQAogCQkvL0lECiAJCXB1YmxpYyBSdWxlQ2FsbCBnZXRQcm9wZXJ0eUxFbnRpdHlBdHRyaWJ1dGVJRFRlcm1pbmFsUnVsZUNhbGxfNl8wXzEoKSB7IHJldHVybiBjUHJvcGVydHlMRW50aXR5QXR0cmlidXRlSURUZXJtaW5hbFJ1bGVDYWxsXzZfMF8xOyB9CiAJfQorCXB1YmxpYyBjbGFzcyBEYXRhSW50ZXJjaGFuZ2VFeHBvc2VFbGVtZW50cyBleHRlbmRzIEFic3RyYWN0UGFyc2VyUnVsZUVsZW1lbnRGaW5kZXIgeworCQlwcml2YXRlIGZpbmFsIFBhcnNlclJ1bGUgcnVsZSA9IChQYXJzZXJSdWxlKSBHcmFtbWFyVXRpbC5maW5kUnVsZUZvck5hbWUoZ2V0R3JhbW1hcigpLCAib3JnLmVjbGlwc2Uub3NicC54dGV4dC5kYXRhaW50ZXJjaGFuZ2UuRGF0YURTTC5EYXRhSW50ZXJjaGFuZ2VFeHBvc2UiKTsKKwkJcHJpdmF0ZSBmaW5hbCBHcm91cCBjR3JvdXAgPSAoR3JvdXApcnVsZS5lQ29udGVudHMoKS5nZXQoMSk7CisJCXByaXZhdGUgZmluYWwgQWN0aW9uIGNEYXRhSW50ZXJjaGFuZ2VFeHBvc2VBY3Rpb25fMCA9IChBY3Rpb24pY0dyb3VwLmVDb250ZW50cygpLmdldCgwKTsKKwkJcHJpdmF0ZSBmaW5hbCBLZXl3b3JkIGNSZWZLZXl3b3JkXzEgPSAoS2V5d29yZCljR3JvdXAuZUNvbnRlbnRzKCkuZ2V0KDEpOworCQlwcml2YXRlIGZpbmFsIEFzc2lnbm1lbnQgY1JlZkVudGl0eUFzc2lnbm1lbnRfMiA9IChBc3NpZ25tZW50KWNHcm91cC5lQ29udGVudHMoKS5nZXQoMik7CisJCXByaXZhdGUgZmluYWwgQ3Jvc3NSZWZlcmVuY2UgY1JlZkVudGl0eUxFbnRpdHlSZWZlcmVuY2VDcm9zc1JlZmVyZW5jZV8yXzAgPSAoQ3Jvc3NSZWZlcmVuY2UpY1JlZkVudGl0eUFzc2lnbm1lbnRfMi5lQ29udGVudHMoKS5nZXQoMCk7CisJCXByaXZhdGUgZmluYWwgUnVsZUNhbGwgY1JlZkVudGl0eUxFbnRpdHlSZWZlcmVuY2VJRFRlcm1pbmFsUnVsZUNhbGxfMl8wXzEgPSAoUnVsZUNhbGwpY1JlZkVudGl0eUxFbnRpdHlSZWZlcmVuY2VDcm9zc1JlZmVyZW5jZV8yXzAuZUNvbnRlbnRzKCkuZ2V0KDEpOworCQlwcml2YXRlIGZpbmFsIEFsdGVybmF0aXZlcyBjQWx0ZXJuYXRpdmVzXzMgPSAoQWx0ZXJuYXRpdmVzKWNHcm91cC5lQ29udGVudHMoKS5nZXQoMyk7CisJCXByaXZhdGUgZmluYWwgR3JvdXAgY0dyb3VwXzNfMCA9IChHcm91cCljQWx0ZXJuYXRpdmVzXzMuZUNvbnRlbnRzKCkuZ2V0KDApOworCQlwcml2YXRlIGZpbmFsIEtleXdvcmQgY09uS2V5d29yZF8zXzBfMCA9IChLZXl3b3JkKWNHcm91cF8zXzAuZUNvbnRlbnRzKCkuZ2V0KDApOworCQlwcml2YXRlIGZpbmFsIEFzc2lnbm1lbnQgY1JlZlByb3BlcnR5QXNzaWdubWVudF8zXzBfMSA9IChBc3NpZ25tZW50KWNHcm91cF8zXzAuZUNvbnRlbnRzKCkuZ2V0KDEpOworCQlwcml2YXRlIGZpbmFsIENyb3NzUmVmZXJlbmNlIGNSZWZQcm9wZXJ0eUxFbnRpdHlBdHRyaWJ1dGVDcm9zc1JlZmVyZW5jZV8zXzBfMV8wID0gKENyb3NzUmVmZXJlbmNlKWNSZWZQcm9wZXJ0eUFzc2lnbm1lbnRfM18wXzEuZUNvbnRlbnRzKCkuZ2V0KDApOworCQlwcml2YXRlIGZpbmFsIFJ1bGVDYWxsIGNSZWZQcm9wZXJ0eUxFbnRpdHlBdHRyaWJ1dGVJRFRlcm1pbmFsUnVsZUNhbGxfM18wXzFfMF8xID0gKFJ1bGVDYWxsKWNSZWZQcm9wZXJ0eUxFbnRpdHlBdHRyaWJ1dGVDcm9zc1JlZmVyZW5jZV8zXzBfMV8wLmVDb250ZW50cygpLmdldCgxKTsKKwkJcHJpdmF0ZSBmaW5hbCBHcm91cCBjR3JvdXBfM18xID0gKEdyb3VwKWNBbHRlcm5hdGl2ZXNfMy5lQ29udGVudHMoKS5nZXQoMSk7CisJCXByaXZhdGUgZmluYWwgS2V5d29yZCBjRXhwb3NlS2V5d29yZF8zXzFfMCA9IChLZXl3b3JkKWNHcm91cF8zXzEuZUNvbnRlbnRzKCkuZ2V0KDApOworCQlwcml2YXRlIGZpbmFsIEtleXdvcmQgY0xlZnRDdXJseUJyYWNrZXRLZXl3b3JkXzNfMV8xID0gKEtleXdvcmQpY0dyb3VwXzNfMS5lQ29udGVudHMoKS5nZXQoMSk7CisJCXByaXZhdGUgZmluYWwgQXNzaWdubWVudCBjU3ViRXhwb3NlQXNzaWdubWVudF8zXzFfMiA9IChBc3NpZ25tZW50KWNHcm91cF8zXzEuZUNvbnRlbnRzKCkuZ2V0KDIpOworCQlwcml2YXRlIGZpbmFsIFJ1bGVDYWxsIGNTdWJFeHBvc2VEYXRhSW50ZXJjaGFuZ2VFeHBvc2VQYXJzZXJSdWxlQ2FsbF8zXzFfMl8wID0gKFJ1bGVDYWxsKWNTdWJFeHBvc2VBc3NpZ25tZW50XzNfMV8yLmVDb250ZW50cygpLmdldCgwKTsKKwkJcHJpdmF0ZSBmaW5hbCBLZXl3b3JkIGNSaWdodEN1cmx5QnJhY2tldEtleXdvcmRfM18xXzMgPSAoS2V5d29yZCljR3JvdXBfM18xLmVDb250ZW50cygpLmdldCgzKTsKKwkJCisJCS8vRGF0YUludGVyY2hhbmdlRXhwb3NlOgorCQkvLwl7RGF0YUludGVyY2hhbmdlRXhwb3NlfQorCQkvLwkncmVmJyByZWZFbnRpdHk9W2VudGl0eTo6TEVudGl0eVJlZmVyZW5jZV0gKCdvbicgcmVmUHJvcGVydHk9W2VudGl0eTo6TEVudGl0eUF0dHJpYnV0ZV0gfCAnZXhwb3NlJyAneycKKwkJLy8Jc3ViRXhwb3NlPURhdGFJbnRlcmNoYW5nZUV4cG9zZSAnfScpOworCQlAT3ZlcnJpZGUgcHVibGljIFBhcnNlclJ1bGUgZ2V0UnVsZSgpIHsgcmV0dXJuIHJ1bGU7IH0KKwkJCisJCS8ve0RhdGFJbnRlcmNoYW5nZUV4cG9zZX0gJ3JlZicgcmVmRW50aXR5PVtlbnRpdHk6OkxFbnRpdHlSZWZlcmVuY2VdICgnb24nIHJlZlByb3BlcnR5PVtlbnRpdHk6OkxFbnRpdHlBdHRyaWJ1dGVdIHwKKwkJLy8nZXhwb3NlJyAneycgc3ViRXhwb3NlPURhdGFJbnRlcmNoYW5nZUV4cG9zZSAnfScpCisJCXB1YmxpYyBHcm91cCBnZXRHcm91cCgpIHsgcmV0dXJuIGNHcm91cDsgfQorCQkKKwkJLy97RGF0YUludGVyY2hhbmdlRXhwb3NlfQorCQlwdWJsaWMgQWN0aW9uIGdldERhdGFJbnRlcmNoYW5nZUV4cG9zZUFjdGlvbl8wKCkgeyByZXR1cm4gY0RhdGFJbnRlcmNoYW5nZUV4cG9zZUFjdGlvbl8wOyB9CisJCQorCQkvLydyZWYnCisJCXB1YmxpYyBLZXl3b3JkIGdldFJlZktleXdvcmRfMSgpIHsgcmV0dXJuIGNSZWZLZXl3b3JkXzE7IH0KKwkJCisJCS8vcmVmRW50aXR5PVtlbnRpdHk6OkxFbnRpdHlSZWZlcmVuY2VdCisJCXB1YmxpYyBBc3NpZ25tZW50IGdldFJlZkVudGl0eUFzc2lnbm1lbnRfMigpIHsgcmV0dXJuIGNSZWZFbnRpdHlBc3NpZ25tZW50XzI7IH0KKwkJCisJCS8vW2VudGl0eTo6TEVudGl0eVJlZmVyZW5jZV0KKwkJcHVibGljIENyb3NzUmVmZXJlbmNlIGdldFJlZkVudGl0eUxFbnRpdHlSZWZlcmVuY2VDcm9zc1JlZmVyZW5jZV8yXzAoKSB7IHJldHVybiBjUmVmRW50aXR5TEVudGl0eVJlZmVyZW5jZUNyb3NzUmVmZXJlbmNlXzJfMDsgfQorCQkKKwkJLy9JRAorCQlwdWJsaWMgUnVsZUNhbGwgZ2V0UmVmRW50aXR5TEVudGl0eVJlZmVyZW5jZUlEVGVybWluYWxSdWxlQ2FsbF8yXzBfMSgpIHsgcmV0dXJuIGNSZWZFbnRpdHlMRW50aXR5UmVmZXJlbmNlSURUZXJtaW5hbFJ1bGVDYWxsXzJfMF8xOyB9CisJCQorCQkvLydvbicgcmVmUHJvcGVydHk9W2VudGl0eTo6TEVudGl0eUF0dHJpYnV0ZV0gfCAnZXhwb3NlJyAneycgc3ViRXhwb3NlPURhdGFJbnRlcmNoYW5nZUV4cG9zZSAnfScKKwkJcHVibGljIEFsdGVybmF0aXZlcyBnZXRBbHRlcm5hdGl2ZXNfMygpIHsgcmV0dXJuIGNBbHRlcm5hdGl2ZXNfMzsgfQorCQkKKwkJLy8nb24nIHJlZlByb3BlcnR5PVtlbnRpdHk6OkxFbnRpdHlBdHRyaWJ1dGVdCisJCXB1YmxpYyBHcm91cCBnZXRHcm91cF8zXzAoKSB7IHJldHVybiBjR3JvdXBfM18wOyB9CisJCQorCQkvLydvbicKKwkJcHVibGljIEtleXdvcmQgZ2V0T25LZXl3b3JkXzNfMF8wKCkgeyByZXR1cm4gY09uS2V5d29yZF8zXzBfMDsgfQorCQkKKwkJLy9yZWZQcm9wZXJ0eT1bZW50aXR5OjpMRW50aXR5QXR0cmlidXRlXQorCQlwdWJsaWMgQXNzaWdubWVudCBnZXRSZWZQcm9wZXJ0eUFzc2lnbm1lbnRfM18wXzEoKSB7IHJldHVybiBjUmVmUHJvcGVydHlBc3NpZ25tZW50XzNfMF8xOyB9CisJCQorCQkvL1tlbnRpdHk6OkxFbnRpdHlBdHRyaWJ1dGVdCisJCXB1YmxpYyBDcm9zc1JlZmVyZW5jZSBnZXRSZWZQcm9wZXJ0eUxFbnRpdHlBdHRyaWJ1dGVDcm9zc1JlZmVyZW5jZV8zXzBfMV8wKCkgeyByZXR1cm4gY1JlZlByb3BlcnR5TEVudGl0eUF0dHJpYnV0ZUNyb3NzUmVmZXJlbmNlXzNfMF8xXzA7IH0KKwkJCisJCS8vSUQKKwkJcHVibGljIFJ1bGVDYWxsIGdldFJlZlByb3BlcnR5TEVudGl0eUF0dHJpYnV0ZUlEVGVybWluYWxSdWxlQ2FsbF8zXzBfMV8wXzEoKSB7IHJldHVybiBjUmVmUHJvcGVydHlMRW50aXR5QXR0cmlidXRlSURUZXJtaW5hbFJ1bGVDYWxsXzNfMF8xXzBfMTsgfQorCQkKKwkJLy8nZXhwb3NlJyAneycgc3ViRXhwb3NlPURhdGFJbnRlcmNoYW5nZUV4cG9zZSAnfScKKwkJcHVibGljIEdyb3VwIGdldEdyb3VwXzNfMSgpIHsgcmV0dXJuIGNHcm91cF8zXzE7IH0KKwkJCisJCS8vJ2V4cG9zZScKKwkJcHVibGljIEtleXdvcmQgZ2V0RXhwb3NlS2V5d29yZF8zXzFfMCgpIHsgcmV0dXJuIGNFeHBvc2VLZXl3b3JkXzNfMV8wOyB9CisJCQorCQkvLyd7JworCQlwdWJsaWMgS2V5d29yZCBnZXRMZWZ0Q3VybHlCcmFja2V0S2V5d29yZF8zXzFfMSgpIHsgcmV0dXJuIGNMZWZ0Q3VybHlCcmFja2V0S2V5d29yZF8zXzFfMTsgfQorCQkKKwkJLy9zdWJFeHBvc2U9RGF0YUludGVyY2hhbmdlRXhwb3NlCisJCXB1YmxpYyBBc3NpZ25tZW50IGdldFN1YkV4cG9zZUFzc2lnbm1lbnRfM18xXzIoKSB7IHJldHVybiBjU3ViRXhwb3NlQXNzaWdubWVudF8zXzFfMjsgfQorCQkKKwkJLy9EYXRhSW50ZXJjaGFuZ2VFeHBvc2UKKwkJcHVibGljIFJ1bGVDYWxsIGdldFN1YkV4cG9zZURhdGFJbnRlcmNoYW5nZUV4cG9zZVBhcnNlclJ1bGVDYWxsXzNfMV8yXzAoKSB7IHJldHVybiBjU3ViRXhwb3NlRGF0YUludGVyY2hhbmdlRXhwb3NlUGFyc2VyUnVsZUNhbGxfM18xXzJfMDsgfQorCQkKKwkJLy8nfScKKwkJcHVibGljIEtleXdvcmQgZ2V0UmlnaHRDdXJseUJyYWNrZXRLZXl3b3JkXzNfMV8zKCkgeyByZXR1cm4gY1JpZ2h0Q3VybHlCcmFja2V0S2V5d29yZF8zXzFfMzsgfQorCX0KKwlwdWJsaWMgY2xhc3MgRGF0YUludGVyY2hhbmdlRXhwb3J0RmlsdGVyRWxlbWVudHMgZXh0ZW5kcyBBYnN0cmFjdFBhcnNlclJ1bGVFbGVtZW50RmluZGVyIHsKKwkJcHJpdmF0ZSBmaW5hbCBQYXJzZXJSdWxlIHJ1bGUgPSAoUGFyc2VyUnVsZSkgR3JhbW1hclV0aWwuZmluZFJ1bGVGb3JOYW1lKGdldEdyYW1tYXIoKSwgIm9yZy5lY2xpcHNlLm9zYnAueHRleHQuZGF0YWludGVyY2hhbmdlLkRhdGFEU0wuRGF0YUludGVyY2hhbmdlRXhwb3J0RmlsdGVyIik7CisJCXByaXZhdGUgZmluYWwgR3JvdXAgY0dyb3VwID0gKEdyb3VwKXJ1bGUuZUNvbnRlbnRzKCkuZ2V0KDEpOworCQlwcml2YXRlIGZpbmFsIEFjdGlvbiBjRGF0YUludGVyY2hhbmdlRXhwb3J0RmlsdGVyQWN0aW9uXzAgPSAoQWN0aW9uKWNHcm91cC5lQ29udGVudHMoKS5nZXQoMCk7CisJCXByaXZhdGUgZmluYWwgR3JvdXAgY0dyb3VwXzEgPSAoR3JvdXApY0dyb3VwLmVDb250ZW50cygpLmdldCgxKTsKKwkJcHJpdmF0ZSBmaW5hbCBLZXl3b3JkIGNXaGVyZUtleXdvcmRfMV8wID0gKEtleXdvcmQpY0dyb3VwXzEuZUNvbnRlbnRzKCkuZ2V0KDApOworCQlwcml2YXRlIGZpbmFsIEtleXdvcmQgY0xlZnRDdXJseUJyYWNrZXRLZXl3b3JkXzFfMSA9IChLZXl3b3JkKWNHcm91cF8xLmVDb250ZW50cygpLmdldCgxKTsKKwkJcHJpdmF0ZSBmaW5hbCBBc3NpZ25tZW50IGNDb25kaXRpb25Bc3NpZ25tZW50XzFfMiA9IChBc3NpZ25tZW50KWNHcm91cF8xLmVDb250ZW50cygpLmdldCgyKTsKKwkJcHJpdmF0ZSBmaW5hbCBSdWxlQ2FsbCBjQ29uZGl0aW9uRGF0YUludGVyY2hhbmdlRmlsdGVyQ29uZGl0aW9uUGFyc2VyUnVsZUNhbGxfMV8yXzAgPSAoUnVsZUNhbGwpY0NvbmRpdGlvbkFzc2lnbm1lbnRfMV8yLmVDb250ZW50cygpLmdldCgwKTsKKwkJcHJpdmF0ZSBmaW5hbCBLZXl3b3JkIGNSaWdodEN1cmx5QnJhY2tldEtleXdvcmRfMV8zID0gKEtleXdvcmQpY0dyb3VwXzEuZUNvbnRlbnRzKCkuZ2V0KDMpOworCQlwcml2YXRlIGZpbmFsIEdyb3VwIGNHcm91cF8yID0gKEdyb3VwKWNHcm91cC5lQ29udGVudHMoKS5nZXQoMik7CisJCXByaXZhdGUgZmluYWwgS2V5d29yZCBjSGlkZUtleXdvcmRfMl8wID0gKEtleXdvcmQpY0dyb3VwXzIuZUNvbnRlbnRzKCkuZ2V0KDApOworCQlwcml2YXRlIGZpbmFsIEFzc2lnbm1lbnQgY0hpZGRlbnByb3BlcnRpZXNBc3NpZ25tZW50XzJfMSA9IChBc3NpZ25tZW50KWNHcm91cF8yLmVDb250ZW50cygpLmdldCgxKTsKKwkJcHJpdmF0ZSBmaW5hbCBSdWxlQ2FsbCBjSGlkZGVucHJvcGVydGllc0RhdGFJbnRlcmNoYW5nZUV4cG9ydEhpZGVQYXJzZXJSdWxlQ2FsbF8yXzFfMCA9IChSdWxlQ2FsbCljSGlkZGVucHJvcGVydGllc0Fzc2lnbm1lbnRfMl8xLmVDb250ZW50cygpLmdldCgwKTsKKwkJCisJCS8vRGF0YUludGVyY2hhbmdlRXhwb3J0RmlsdGVyOgorCQkvLwl7RGF0YUludGVyY2hhbmdlRXhwb3J0RmlsdGVyfSAoJ3doZXJlJyAneycgY29uZGl0aW9uPURhdGFJbnRlcmNoYW5nZUZpbHRlckNvbmRpdGlvbiAnfScpPyAoJ2hpZGUnCisJCS8vCWhpZGRlbnByb3BlcnRpZXMrPURhdGFJbnRlcmNoYW5nZUV4cG9ydEhpZGUqKT87CisJCUBPdmVycmlkZSBwdWJsaWMgUGFyc2VyUnVsZSBnZXRSdWxlKCkgeyByZXR1cm4gcnVsZTsgfQorCQkKKwkJLy97RGF0YUludGVyY2hhbmdlRXhwb3J0RmlsdGVyfSAoJ3doZXJlJyAneycgY29uZGl0aW9uPURhdGFJbnRlcmNoYW5nZUZpbHRlckNvbmRpdGlvbiAnfScpPyAoJ2hpZGUnCisJCS8vaGlkZGVucHJvcGVydGllcys9RGF0YUludGVyY2hhbmdlRXhwb3J0SGlkZSopPworCQlwdWJsaWMgR3JvdXAgZ2V0R3JvdXAoKSB7IHJldHVybiBjR3JvdXA7IH0KKwkJCisJCS8ve0RhdGFJbnRlcmNoYW5nZUV4cG9ydEZpbHRlcn0KKwkJcHVibGljIEFjdGlvbiBnZXREYXRhSW50ZXJjaGFuZ2VFeHBvcnRGaWx0ZXJBY3Rpb25fMCgpIHsgcmV0dXJuIGNEYXRhSW50ZXJjaGFuZ2VFeHBvcnRGaWx0ZXJBY3Rpb25fMDsgfQorCQkKKwkJLy8oJ3doZXJlJyAneycgY29uZGl0aW9uPURhdGFJbnRlcmNoYW5nZUZpbHRlckNvbmRpdGlvbiAnfScpPworCQlwdWJsaWMgR3JvdXAgZ2V0R3JvdXBfMSgpIHsgcmV0dXJuIGNHcm91cF8xOyB9CisJCQorCQkvLyd3aGVyZScKKwkJcHVibGljIEtleXdvcmQgZ2V0V2hlcmVLZXl3b3JkXzFfMCgpIHsgcmV0dXJuIGNXaGVyZUtleXdvcmRfMV8wOyB9CisJCQorCQkvLyd7JworCQlwdWJsaWMgS2V5d29yZCBnZXRMZWZ0Q3VybHlCcmFja2V0S2V5d29yZF8xXzEoKSB7IHJldHVybiBjTGVmdEN1cmx5QnJhY2tldEtleXdvcmRfMV8xOyB9CisJCQorCQkvL2NvbmRpdGlvbj1EYXRhSW50ZXJjaGFuZ2VGaWx0ZXJDb25kaXRpb24KKwkJcHVibGljIEFzc2lnbm1lbnQgZ2V0Q29uZGl0aW9uQXNzaWdubWVudF8xXzIoKSB7IHJldHVybiBjQ29uZGl0aW9uQXNzaWdubWVudF8xXzI7IH0KKwkJCisJCS8vRGF0YUludGVyY2hhbmdlRmlsdGVyQ29uZGl0aW9uCisJCXB1YmxpYyBSdWxlQ2FsbCBnZXRDb25kaXRpb25EYXRhSW50ZXJjaGFuZ2VGaWx0ZXJDb25kaXRpb25QYXJzZXJSdWxlQ2FsbF8xXzJfMCgpIHsgcmV0dXJuIGNDb25kaXRpb25EYXRhSW50ZXJjaGFuZ2VGaWx0ZXJDb25kaXRpb25QYXJzZXJSdWxlQ2FsbF8xXzJfMDsgfQorCQkKKwkJLy8nfScKKwkJcHVibGljIEtleXdvcmQgZ2V0UmlnaHRDdXJseUJyYWNrZXRLZXl3b3JkXzFfMygpIHsgcmV0dXJuIGNSaWdodEN1cmx5QnJhY2tldEtleXdvcmRfMV8zOyB9CisJCQorCQkvLygnaGlkZScgaGlkZGVucHJvcGVydGllcys9RGF0YUludGVyY2hhbmdlRXhwb3J0SGlkZSopPworCQlwdWJsaWMgR3JvdXAgZ2V0R3JvdXBfMigpIHsgcmV0dXJuIGNHcm91cF8yOyB9CisJCQorCQkvLydoaWRlJworCQlwdWJsaWMgS2V5d29yZCBnZXRIaWRlS2V5d29yZF8yXzAoKSB7IHJldHVybiBjSGlkZUtleXdvcmRfMl8wOyB9CisJCQorCQkvL2hpZGRlbnByb3BlcnRpZXMrPURhdGFJbnRlcmNoYW5nZUV4cG9ydEhpZGUqCisJCXB1YmxpYyBBc3NpZ25tZW50IGdldEhpZGRlbnByb3BlcnRpZXNBc3NpZ25tZW50XzJfMSgpIHsgcmV0dXJuIGNIaWRkZW5wcm9wZXJ0aWVzQXNzaWdubWVudF8yXzE7IH0KKwkJCisJCS8vRGF0YUludGVyY2hhbmdlRXhwb3J0SGlkZQorCQlwdWJsaWMgUnVsZUNhbGwgZ2V0SGlkZGVucHJvcGVydGllc0RhdGFJbnRlcmNoYW5nZUV4cG9ydEhpZGVQYXJzZXJSdWxlQ2FsbF8yXzFfMCgpIHsgcmV0dXJuIGNIaWRkZW5wcm9wZXJ0aWVzRGF0YUludGVyY2hhbmdlRXhwb3J0SGlkZVBhcnNlclJ1bGVDYWxsXzJfMV8wOyB9CisJfQorCXB1YmxpYyBjbGFzcyBEYXRhSW50ZXJjaGFuZ2VGaWx0ZXJDb25kaXRpb25FbGVtZW50cyBleHRlbmRzIEFic3RyYWN0UGFyc2VyUnVsZUVsZW1lbnRGaW5kZXIgeworCQlwcml2YXRlIGZpbmFsIFBhcnNlclJ1bGUgcnVsZSA9IChQYXJzZXJSdWxlKSBHcmFtbWFyVXRpbC5maW5kUnVsZUZvck5hbWUoZ2V0R3JhbW1hcigpLCAib3JnLmVjbGlwc2Uub3NicC54dGV4dC5kYXRhaW50ZXJjaGFuZ2UuRGF0YURTTC5EYXRhSW50ZXJjaGFuZ2VGaWx0ZXJDb25kaXRpb24iKTsKKwkJcHJpdmF0ZSBmaW5hbCBHcm91cCBjR3JvdXAgPSAoR3JvdXApcnVsZS5lQ29udGVudHMoKS5nZXQoMSk7CisJCXByaXZhdGUgZmluYWwgQXNzaWdubWVudCBjUmVmUHJvcGVydHlBc3NpZ25tZW50XzAgPSAoQXNzaWdubWVudCljR3JvdXAuZUNvbnRlbnRzKCkuZ2V0KDApOworCQlwcml2YXRlIGZpbmFsIENyb3NzUmVmZXJlbmNlIGNSZWZQcm9wZXJ0eUxFbnRpdHlGZWF0dXJlQ3Jvc3NSZWZlcmVuY2VfMF8wID0gKENyb3NzUmVmZXJlbmNlKWNSZWZQcm9wZXJ0eUFzc2lnbm1lbnRfMC5lQ29udGVudHMoKS5nZXQoMCk7CisJCXByaXZhdGUgZmluYWwgUnVsZUNhbGwgY1JlZlByb3BlcnR5TEVudGl0eUZlYXR1cmVJRFRlcm1pbmFsUnVsZUNhbGxfMF8wXzEgPSAoUnVsZUNhbGwpY1JlZlByb3BlcnR5TEVudGl0eUZlYXR1cmVDcm9zc1JlZmVyZW5jZV8wXzAuZUNvbnRlbnRzKCkuZ2V0KDEpOworCQlwcml2YXRlIGZpbmFsIEFzc2lnbm1lbnQgY09wZXJhdG9yQXNzaWdubWVudF8xID0gKEFzc2lnbm1lbnQpY0dyb3VwLmVDb250ZW50cygpLmdldCgxKTsKKwkJcHJpdmF0ZSBmaW5hbCBSdWxlQ2FsbCBjT3BlcmF0b3JDb25kaXRpb25BbmRPcGVyYXRvcjFFbnVtUnVsZUNhbGxfMV8wID0gKFJ1bGVDYWxsKWNPcGVyYXRvckFzc2lnbm1lbnRfMS5lQ29udGVudHMoKS5nZXQoMCk7CisJCXByaXZhdGUgZmluYWwgQXNzaWdubWVudCBjVmFsdWVBc3NpZ25tZW50XzIgPSAoQXNzaWdubWVudCljR3JvdXAuZUNvbnRlbnRzKCkuZ2V0KDIpOworCQlwcml2YXRlIGZpbmFsIFJ1bGVDYWxsIGNWYWx1ZVNUUklOR1Rlcm1pbmFsUnVsZUNhbGxfMl8wID0gKFJ1bGVDYWxsKWNWYWx1ZUFzc2lnbm1lbnRfMi5lQ29udGVudHMoKS5nZXQoMCk7CisJCXByaXZhdGUgZmluYWwgR3JvdXAgY0dyb3VwXzMgPSAoR3JvdXApY0dyb3VwLmVDb250ZW50cygpLmdldCgzKTsKKwkJcHJpdmF0ZSBmaW5hbCBBc3NpZ25tZW50IGNPcGVyYXRvcjJBc3NpZ25tZW50XzNfMCA9IChBc3NpZ25tZW50KWNHcm91cF8zLmVDb250ZW50cygpLmdldCgwKTsKKwkJcHJpdmF0ZSBmaW5hbCBSdWxlQ2FsbCBjT3BlcmF0b3IyQ29uZGl0aW9uQW5kT3BlcmF0b3IyRW51bVJ1bGVDYWxsXzNfMF8wID0gKFJ1bGVDYWxsKWNPcGVyYXRvcjJBc3NpZ25tZW50XzNfMC5lQ29udGVudHMoKS5nZXQoMCk7CisJCXByaXZhdGUgZmluYWwgQXNzaWdubWVudCBjU3ViY29uZGl0aW9uQXNzaWdubWVudF8zXzEgPSAoQXNzaWdubWVudCljR3JvdXBfMy5lQ29udGVudHMoKS5nZXQoMSk7CisJCXByaXZhdGUgZmluYWwgUnVsZUNhbGwgY1N1YmNvbmRpdGlvbkRhdGFJbnRlcmNoYW5nZUZpbHRlckNvbmRpdGlvblBhcnNlclJ1bGVDYWxsXzNfMV8wID0gKFJ1bGVDYWxsKWNTdWJjb25kaXRpb25Bc3NpZ25tZW50XzNfMS5lQ29udGVudHMoKS5nZXQoMCk7CisJCQorCQkvL0RhdGFJbnRlcmNoYW5nZUZpbHRlckNvbmRpdGlvbjoKKwkJLy8JcmVmUHJvcGVydHk9W2VudGl0eTo6TEVudGl0eUZlYXR1cmVdIG9wZXJhdG9yPUNvbmRpdGlvbkFuZE9wZXJhdG9yMQorCQkvLwl2YWx1ZT1TVFJJTkc/IChvcGVyYXRvcjI9Q29uZGl0aW9uQW5kT3BlcmF0b3IyIHN1YmNvbmRpdGlvbj1EYXRhSW50ZXJjaGFuZ2VGaWx0ZXJDb25kaXRpb24pPzsKKwkJQE92ZXJyaWRlIHB1YmxpYyBQYXJzZXJSdWxlIGdldFJ1bGUoKSB7IHJldHVybiBydWxlOyB9CisJCQorCQkvL3JlZlByb3BlcnR5PVtlbnRpdHk6OkxFbnRpdHlGZWF0dXJlXSBvcGVyYXRvcj1Db25kaXRpb25BbmRPcGVyYXRvcjEgdmFsdWU9U1RSSU5HPyAob3BlcmF0b3IyPUNvbmRpdGlvbkFuZE9wZXJhdG9yMgorCQkvL3N1YmNvbmRpdGlvbj1EYXRhSW50ZXJjaGFuZ2VGaWx0ZXJDb25kaXRpb24pPworCQlwdWJsaWMgR3JvdXAgZ2V0R3JvdXAoKSB7IHJldHVybiBjR3JvdXA7IH0KKwkJCisJCS8vcmVmUHJvcGVydHk9W2VudGl0eTo6TEVudGl0eUZlYXR1cmVdCisJCXB1YmxpYyBBc3NpZ25tZW50IGdldFJlZlByb3BlcnR5QXNzaWdubWVudF8wKCkgeyByZXR1cm4gY1JlZlByb3BlcnR5QXNzaWdubWVudF8wOyB9CisJCQorCQkvL1tlbnRpdHk6OkxFbnRpdHlGZWF0dXJlXQorCQlwdWJsaWMgQ3Jvc3NSZWZlcmVuY2UgZ2V0UmVmUHJvcGVydHlMRW50aXR5RmVhdHVyZUNyb3NzUmVmZXJlbmNlXzBfMCgpIHsgcmV0dXJuIGNSZWZQcm9wZXJ0eUxFbnRpdHlGZWF0dXJlQ3Jvc3NSZWZlcmVuY2VfMF8wOyB9CisJCQorCQkvL0lECisJCXB1YmxpYyBSdWxlQ2FsbCBnZXRSZWZQcm9wZXJ0eUxFbnRpdHlGZWF0dXJlSURUZXJtaW5hbFJ1bGVDYWxsXzBfMF8xKCkgeyByZXR1cm4gY1JlZlByb3BlcnR5TEVudGl0eUZlYXR1cmVJRFRlcm1pbmFsUnVsZUNhbGxfMF8wXzE7IH0KKwkJCisJCS8vb3BlcmF0b3I9Q29uZGl0aW9uQW5kT3BlcmF0b3IxCisJCXB1YmxpYyBBc3NpZ25tZW50IGdldE9wZXJhdG9yQXNzaWdubWVudF8xKCkgeyByZXR1cm4gY09wZXJhdG9yQXNzaWdubWVudF8xOyB9CisJCQorCQkvL0NvbmRpdGlvbkFuZE9wZXJhdG9yMQorCQlwdWJsaWMgUnVsZUNhbGwgZ2V0T3BlcmF0b3JDb25kaXRpb25BbmRPcGVyYXRvcjFFbnVtUnVsZUNhbGxfMV8wKCkgeyByZXR1cm4gY09wZXJhdG9yQ29uZGl0aW9uQW5kT3BlcmF0b3IxRW51bVJ1bGVDYWxsXzFfMDsgfQorCQkKKwkJLy92YWx1ZT1TVFJJTkc/CisJCXB1YmxpYyBBc3NpZ25tZW50IGdldFZhbHVlQXNzaWdubWVudF8yKCkgeyByZXR1cm4gY1ZhbHVlQXNzaWdubWVudF8yOyB9CisJCQorCQkvL1NUUklORworCQlwdWJsaWMgUnVsZUNhbGwgZ2V0VmFsdWVTVFJJTkdUZXJtaW5hbFJ1bGVDYWxsXzJfMCgpIHsgcmV0dXJuIGNWYWx1ZVNUUklOR1Rlcm1pbmFsUnVsZUNhbGxfMl8wOyB9CisJCQorCQkvLyhvcGVyYXRvcjI9Q29uZGl0aW9uQW5kT3BlcmF0b3IyIHN1YmNvbmRpdGlvbj1EYXRhSW50ZXJjaGFuZ2VGaWx0ZXJDb25kaXRpb24pPworCQlwdWJsaWMgR3JvdXAgZ2V0R3JvdXBfMygpIHsgcmV0dXJuIGNHcm91cF8zOyB9CisJCQorCQkvL29wZXJhdG9yMj1Db25kaXRpb25BbmRPcGVyYXRvcjIKKwkJcHVibGljIEFzc2lnbm1lbnQgZ2V0T3BlcmF0b3IyQXNzaWdubWVudF8zXzAoKSB7IHJldHVybiBjT3BlcmF0b3IyQXNzaWdubWVudF8zXzA7IH0KKwkJCisJCS8vQ29uZGl0aW9uQW5kT3BlcmF0b3IyCisJCXB1YmxpYyBSdWxlQ2FsbCBnZXRPcGVyYXRvcjJDb25kaXRpb25BbmRPcGVyYXRvcjJFbnVtUnVsZUNhbGxfM18wXzAoKSB7IHJldHVybiBjT3BlcmF0b3IyQ29uZGl0aW9uQW5kT3BlcmF0b3IyRW51bVJ1bGVDYWxsXzNfMF8wOyB9CisJCQorCQkvL3N1YmNvbmRpdGlvbj1EYXRhSW50ZXJjaGFuZ2VGaWx0ZXJDb25kaXRpb24KKwkJcHVibGljIEFzc2lnbm1lbnQgZ2V0U3ViY29uZGl0aW9uQXNzaWdubWVudF8zXzEoKSB7IHJldHVybiBjU3ViY29uZGl0aW9uQXNzaWdubWVudF8zXzE7IH0KKwkJCisJCS8vRGF0YUludGVyY2hhbmdlRmlsdGVyQ29uZGl0aW9uCisJCXB1YmxpYyBSdWxlQ2FsbCBnZXRTdWJjb25kaXRpb25EYXRhSW50ZXJjaGFuZ2VGaWx0ZXJDb25kaXRpb25QYXJzZXJSdWxlQ2FsbF8zXzFfMCgpIHsgcmV0dXJuIGNTdWJjb25kaXRpb25EYXRhSW50ZXJjaGFuZ2VGaWx0ZXJDb25kaXRpb25QYXJzZXJSdWxlQ2FsbF8zXzFfMDsgfQorCX0KKwlwdWJsaWMgY2xhc3MgRGF0YUludGVyY2hhbmdlRXhwb3J0SGlkZUVsZW1lbnRzIGV4dGVuZHMgQWJzdHJhY3RQYXJzZXJSdWxlRWxlbWVudEZpbmRlciB7CisJCXByaXZhdGUgZmluYWwgUGFyc2VyUnVsZSBydWxlID0gKFBhcnNlclJ1bGUpIEdyYW1tYXJVdGlsLmZpbmRSdWxlRm9yTmFtZShnZXRHcmFtbWFyKCksICJvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmRhdGFpbnRlcmNoYW5nZS5EYXRhRFNMLkRhdGFJbnRlcmNoYW5nZUV4cG9ydEhpZGUiKTsKKwkJcHJpdmF0ZSBmaW5hbCBHcm91cCBjR3JvdXAgPSAoR3JvdXApcnVsZS5lQ29udGVudHMoKS5nZXQoMSk7CisJCXByaXZhdGUgZmluYWwgQWN0aW9uIGNEYXRhSW50ZXJjaGFuZ2VFeHBvcnRIaWRlQWN0aW9uXzAgPSAoQWN0aW9uKWNHcm91cC5lQ29udGVudHMoKS5nZXQoMCk7CisJCXByaXZhdGUgZmluYWwgQXNzaWdubWVudCBjUHJvcGVydHlBc3NpZ25tZW50XzEgPSAoQXNzaWdubWVudCljR3JvdXAuZUNvbnRlbnRzKCkuZ2V0KDEpOworCQlwcml2YXRlIGZpbmFsIENyb3NzUmVmZXJlbmNlIGNQcm9wZXJ0eUxFbnRpdHlGZWF0dXJlQ3Jvc3NSZWZlcmVuY2VfMV8wID0gKENyb3NzUmVmZXJlbmNlKWNQcm9wZXJ0eUFzc2lnbm1lbnRfMS5lQ29udGVudHMoKS5nZXQoMCk7CisJCXByaXZhdGUgZmluYWwgUnVsZUNhbGwgY1Byb3BlcnR5TEVudGl0eUZlYXR1cmVJRFRlcm1pbmFsUnVsZUNhbGxfMV8wXzEgPSAoUnVsZUNhbGwpY1Byb3BlcnR5TEVudGl0eUZlYXR1cmVDcm9zc1JlZmVyZW5jZV8xXzAuZUNvbnRlbnRzKCkuZ2V0KDEpOworCQkKKwkJLy9EYXRhSW50ZXJjaGFuZ2VFeHBvcnRIaWRlOgorCQkvLwl7RGF0YUludGVyY2hhbmdlRXhwb3J0SGlkZX0gcHJvcGVydHk9W2VudGl0eTo6TEVudGl0eUZlYXR1cmVdOworCQlAT3ZlcnJpZGUgcHVibGljIFBhcnNlclJ1bGUgZ2V0UnVsZSgpIHsgcmV0dXJuIHJ1bGU7IH0KKwkJCisJCS8ve0RhdGFJbnRlcmNoYW5nZUV4cG9ydEhpZGV9IHByb3BlcnR5PVtlbnRpdHk6OkxFbnRpdHlGZWF0dXJlXQorCQlwdWJsaWMgR3JvdXAgZ2V0R3JvdXAoKSB7IHJldHVybiBjR3JvdXA7IH0KKwkJCisJCS8ve0RhdGFJbnRlcmNoYW5nZUV4cG9ydEhpZGV9CisJCXB1YmxpYyBBY3Rpb24gZ2V0RGF0YUludGVyY2hhbmdlRXhwb3J0SGlkZUFjdGlvbl8wKCkgeyByZXR1cm4gY0RhdGFJbnRlcmNoYW5nZUV4cG9ydEhpZGVBY3Rpb25fMDsgfQorCQkKKwkJLy9wcm9wZXJ0eT1bZW50aXR5OjpMRW50aXR5RmVhdHVyZV0KKwkJcHVibGljIEFzc2lnbm1lbnQgZ2V0UHJvcGVydHlBc3NpZ25tZW50XzEoKSB7IHJldHVybiBjUHJvcGVydHlBc3NpZ25tZW50XzE7IH0KKwkJCisJCS8vW2VudGl0eTo6TEVudGl0eUZlYXR1cmVdCisJCXB1YmxpYyBDcm9zc1JlZmVyZW5jZSBnZXRQcm9wZXJ0eUxFbnRpdHlGZWF0dXJlQ3Jvc3NSZWZlcmVuY2VfMV8wKCkgeyByZXR1cm4gY1Byb3BlcnR5TEVudGl0eUZlYXR1cmVDcm9zc1JlZmVyZW5jZV8xXzA7IH0KKwkJCisJCS8vSUQKKwkJcHVibGljIFJ1bGVDYWxsIGdldFByb3BlcnR5TEVudGl0eUZlYXR1cmVJRFRlcm1pbmFsUnVsZUNhbGxfMV8wXzEoKSB7IHJldHVybiBjUHJvcGVydHlMRW50aXR5RmVhdHVyZUlEVGVybWluYWxSdWxlQ2FsbF8xXzBfMTsgfQorCX0KIAlwdWJsaWMgY2xhc3MgRGF0YUludGVyY2hhbmdlUHJlZGVmaW5lZEV4cHJlc3Npb25FbGVtZW50cyBleHRlbmRzIEFic3RyYWN0UGFyc2VyUnVsZUVsZW1lbnRGaW5kZXIgewogCQlwcml2YXRlIGZpbmFsIFBhcnNlclJ1bGUgcnVsZSA9IChQYXJzZXJSdWxlKSBHcmFtbWFyVXRpbC5maW5kUnVsZUZvck5hbWUoZ2V0R3JhbW1hcigpLCAib3JnLmVjbGlwc2Uub3NicC54dGV4dC5kYXRhaW50ZXJjaGFuZ2UuRGF0YURTTC5EYXRhSW50ZXJjaGFuZ2VQcmVkZWZpbmVkRXhwcmVzc2lvbiIpOwogCQlwcml2YXRlIGZpbmFsIEdyb3VwIGNHcm91cCA9IChHcm91cClydWxlLmVDb250ZW50cygpLmdldCgxKTsKQEAgLTE2NDIsNiArMTk1NiwxMTcgQEAKIAkJLy8ncmVtb3ZlJwogCQlwdWJsaWMgS2V5d29yZCBnZXRSZW1vdmVSZW1vdmVLZXl3b3JkXzJfMCgpIHsgcmV0dXJuIGNSZW1vdmVSZW1vdmVLZXl3b3JkXzJfMDsgfQogCX0KKwlwdWJsaWMgY2xhc3MgQ29uZGl0aW9uQW5kT3BlcmF0b3IxRWxlbWVudHMgZXh0ZW5kcyBBYnN0cmFjdEVudW1SdWxlRWxlbWVudEZpbmRlciB7CisJCXByaXZhdGUgZmluYWwgRW51bVJ1bGUgcnVsZSA9IChFbnVtUnVsZSkgR3JhbW1hclV0aWwuZmluZFJ1bGVGb3JOYW1lKGdldEdyYW1tYXIoKSwgIm9yZy5lY2xpcHNlLm9zYnAueHRleHQuZGF0YWludGVyY2hhbmdlLkRhdGFEU0wuQ29uZGl0aW9uQW5kT3BlcmF0b3IxIik7CisJCXByaXZhdGUgZmluYWwgQWx0ZXJuYXRpdmVzIGNBbHRlcm5hdGl2ZXMgPSAoQWx0ZXJuYXRpdmVzKXJ1bGUuZUNvbnRlbnRzKCkuZ2V0KDEpOworCQlwcml2YXRlIGZpbmFsIEVudW1MaXRlcmFsRGVjbGFyYXRpb24gY0VxdWFsc0VudW1MaXRlcmFsRGVjbGFyYXRpb25fMCA9IChFbnVtTGl0ZXJhbERlY2xhcmF0aW9uKWNBbHRlcm5hdGl2ZXMuZUNvbnRlbnRzKCkuZ2V0KDApOworCQlwcml2YXRlIGZpbmFsIEtleXdvcmQgY0VxdWFsc0VxdWFsc1NpZ25LZXl3b3JkXzBfMCA9IChLZXl3b3JkKWNFcXVhbHNFbnVtTGl0ZXJhbERlY2xhcmF0aW9uXzAuZUNvbnRlbnRzKCkuZ2V0KDApOworCQlwcml2YXRlIGZpbmFsIEVudW1MaXRlcmFsRGVjbGFyYXRpb24gY05vdGVxdWFsc0VudW1MaXRlcmFsRGVjbGFyYXRpb25fMSA9IChFbnVtTGl0ZXJhbERlY2xhcmF0aW9uKWNBbHRlcm5hdGl2ZXMuZUNvbnRlbnRzKCkuZ2V0KDEpOworCQlwcml2YXRlIGZpbmFsIEtleXdvcmQgY05vdGVxdWFsc0V4Y2xhbWF0aW9uTWFya0VxdWFsc1NpZ25LZXl3b3JkXzFfMCA9IChLZXl3b3JkKWNOb3RlcXVhbHNFbnVtTGl0ZXJhbERlY2xhcmF0aW9uXzEuZUNvbnRlbnRzKCkuZ2V0KDApOworCQlwcml2YXRlIGZpbmFsIEVudW1MaXRlcmFsRGVjbGFyYXRpb24gY0dyZWF0ZXJ0aGVuRW51bUxpdGVyYWxEZWNsYXJhdGlvbl8yID0gKEVudW1MaXRlcmFsRGVjbGFyYXRpb24pY0FsdGVybmF0aXZlcy5lQ29udGVudHMoKS5nZXQoMik7CisJCXByaXZhdGUgZmluYWwgS2V5d29yZCBjR3JlYXRlcnRoZW5HcmVhdGVyVGhhblNpZ25LZXl3b3JkXzJfMCA9IChLZXl3b3JkKWNHcmVhdGVydGhlbkVudW1MaXRlcmFsRGVjbGFyYXRpb25fMi5lQ29udGVudHMoKS5nZXQoMCk7CisJCXByaXZhdGUgZmluYWwgRW51bUxpdGVyYWxEZWNsYXJhdGlvbiBjR3JlYXRlcnRoZW5vcmVxdWFsdG9FbnVtTGl0ZXJhbERlY2xhcmF0aW9uXzMgPSAoRW51bUxpdGVyYWxEZWNsYXJhdGlvbiljQWx0ZXJuYXRpdmVzLmVDb250ZW50cygpLmdldCgzKTsKKwkJcHJpdmF0ZSBmaW5hbCBLZXl3b3JkIGNHcmVhdGVydGhlbm9yZXF1YWx0b0dyZWF0ZXJUaGFuU2lnbkVxdWFsc1NpZ25LZXl3b3JkXzNfMCA9IChLZXl3b3JkKWNHcmVhdGVydGhlbm9yZXF1YWx0b0VudW1MaXRlcmFsRGVjbGFyYXRpb25fMy5lQ29udGVudHMoKS5nZXQoMCk7CisJCXByaXZhdGUgZmluYWwgRW51bUxpdGVyYWxEZWNsYXJhdGlvbiBjTGVzc3RoZW5FbnVtTGl0ZXJhbERlY2xhcmF0aW9uXzQgPSAoRW51bUxpdGVyYWxEZWNsYXJhdGlvbiljQWx0ZXJuYXRpdmVzLmVDb250ZW50cygpLmdldCg0KTsKKwkJcHJpdmF0ZSBmaW5hbCBLZXl3b3JkIGNMZXNzdGhlbkxlc3NUaGFuU2lnbktleXdvcmRfNF8wID0gKEtleXdvcmQpY0xlc3N0aGVuRW51bUxpdGVyYWxEZWNsYXJhdGlvbl80LmVDb250ZW50cygpLmdldCgwKTsKKwkJcHJpdmF0ZSBmaW5hbCBFbnVtTGl0ZXJhbERlY2xhcmF0aW9uIGNMZXNzdGhlbm9yZXF1YWx0b0VudW1MaXRlcmFsRGVjbGFyYXRpb25fNSA9IChFbnVtTGl0ZXJhbERlY2xhcmF0aW9uKWNBbHRlcm5hdGl2ZXMuZUNvbnRlbnRzKCkuZ2V0KDUpOworCQlwcml2YXRlIGZpbmFsIEtleXdvcmQgY0xlc3N0aGVub3JlcXVhbHRvTGVzc1RoYW5TaWduRXF1YWxzU2lnbktleXdvcmRfNV8wID0gKEtleXdvcmQpY0xlc3N0aGVub3JlcXVhbHRvRW51bUxpdGVyYWxEZWNsYXJhdGlvbl81LmVDb250ZW50cygpLmdldCgwKTsKKwkJcHJpdmF0ZSBmaW5hbCBFbnVtTGl0ZXJhbERlY2xhcmF0aW9uIGNJc251bGxFbnVtTGl0ZXJhbERlY2xhcmF0aW9uXzYgPSAoRW51bUxpdGVyYWxEZWNsYXJhdGlvbiljQWx0ZXJuYXRpdmVzLmVDb250ZW50cygpLmdldCg2KTsKKwkJcHJpdmF0ZSBmaW5hbCBLZXl3b3JkIGNJc251bGxJc251bGxLZXl3b3JkXzZfMCA9IChLZXl3b3JkKWNJc251bGxFbnVtTGl0ZXJhbERlY2xhcmF0aW9uXzYuZUNvbnRlbnRzKCkuZ2V0KDApOworCQlwcml2YXRlIGZpbmFsIEVudW1MaXRlcmFsRGVjbGFyYXRpb24gY0lzbm90bnVsbEVudW1MaXRlcmFsRGVjbGFyYXRpb25fNyA9IChFbnVtTGl0ZXJhbERlY2xhcmF0aW9uKWNBbHRlcm5hdGl2ZXMuZUNvbnRlbnRzKCkuZ2V0KDcpOworCQlwcml2YXRlIGZpbmFsIEtleXdvcmQgY0lzbm90bnVsbElzbm90bnVsbEtleXdvcmRfN18wID0gKEtleXdvcmQpY0lzbm90bnVsbEVudW1MaXRlcmFsRGVjbGFyYXRpb25fNy5lQ29udGVudHMoKS5nZXQoMCk7CisJCQorCQkvL2VudW0gQ29uZGl0aW9uQW5kT3BlcmF0b3IxOgorCQkvLwllcXVhbHM9Jz0nIHwKKwkJLy8Jbm90ZXF1YWxzPSchPScgfAorCQkvLwlncmVhdGVydGhlbj0nPicgfAorCQkvLwlncmVhdGVydGhlbm9yZXF1YWx0bz0nPj0nIHwKKwkJLy8JbGVzc3RoZW49JzwnIHwKKwkJLy8JbGVzc3RoZW5vcmVxdWFsdG89Jzw9JyB8CisJCS8vCWlzbnVsbCB8CisJCS8vCWlzbm90bnVsbDsKKwkJcHVibGljIEVudW1SdWxlIGdldFJ1bGUoKSB7IHJldHVybiBydWxlOyB9CisJCQorCQkvL2VxdWFscz0nPScgfCBub3RlcXVhbHM9JyE9JyB8IGdyZWF0ZXJ0aGVuPSc+JyB8IGdyZWF0ZXJ0aGVub3JlcXVhbHRvPSc+PScgfCBsZXNzdGhlbj0nPCcgfCBsZXNzdGhlbm9yZXF1YWx0bz0nPD0nIHwKKwkJLy9pc251bGwgfCBpc25vdG51bGwKKwkJcHVibGljIEFsdGVybmF0aXZlcyBnZXRBbHRlcm5hdGl2ZXMoKSB7IHJldHVybiBjQWx0ZXJuYXRpdmVzOyB9CisJCQorCQkvL2VxdWFscz0nPScKKwkJcHVibGljIEVudW1MaXRlcmFsRGVjbGFyYXRpb24gZ2V0RXF1YWxzRW51bUxpdGVyYWxEZWNsYXJhdGlvbl8wKCkgeyByZXR1cm4gY0VxdWFsc0VudW1MaXRlcmFsRGVjbGFyYXRpb25fMDsgfQorCQkKKwkJLy8nPScKKwkJcHVibGljIEtleXdvcmQgZ2V0RXF1YWxzRXF1YWxzU2lnbktleXdvcmRfMF8wKCkgeyByZXR1cm4gY0VxdWFsc0VxdWFsc1NpZ25LZXl3b3JkXzBfMDsgfQorCQkKKwkJLy9ub3RlcXVhbHM9JyE9JworCQlwdWJsaWMgRW51bUxpdGVyYWxEZWNsYXJhdGlvbiBnZXROb3RlcXVhbHNFbnVtTGl0ZXJhbERlY2xhcmF0aW9uXzEoKSB7IHJldHVybiBjTm90ZXF1YWxzRW51bUxpdGVyYWxEZWNsYXJhdGlvbl8xOyB9CisJCQorCQkvLychPScKKwkJcHVibGljIEtleXdvcmQgZ2V0Tm90ZXF1YWxzRXhjbGFtYXRpb25NYXJrRXF1YWxzU2lnbktleXdvcmRfMV8wKCkgeyByZXR1cm4gY05vdGVxdWFsc0V4Y2xhbWF0aW9uTWFya0VxdWFsc1NpZ25LZXl3b3JkXzFfMDsgfQorCQkKKwkJLy9ncmVhdGVydGhlbj0nPicKKwkJcHVibGljIEVudW1MaXRlcmFsRGVjbGFyYXRpb24gZ2V0R3JlYXRlcnRoZW5FbnVtTGl0ZXJhbERlY2xhcmF0aW9uXzIoKSB7IHJldHVybiBjR3JlYXRlcnRoZW5FbnVtTGl0ZXJhbERlY2xhcmF0aW9uXzI7IH0KKwkJCisJCS8vJz4nCisJCXB1YmxpYyBLZXl3b3JkIGdldEdyZWF0ZXJ0aGVuR3JlYXRlclRoYW5TaWduS2V5d29yZF8yXzAoKSB7IHJldHVybiBjR3JlYXRlcnRoZW5HcmVhdGVyVGhhblNpZ25LZXl3b3JkXzJfMDsgfQorCQkKKwkJLy9ncmVhdGVydGhlbm9yZXF1YWx0bz0nPj0nCisJCXB1YmxpYyBFbnVtTGl0ZXJhbERlY2xhcmF0aW9uIGdldEdyZWF0ZXJ0aGVub3JlcXVhbHRvRW51bUxpdGVyYWxEZWNsYXJhdGlvbl8zKCkgeyByZXR1cm4gY0dyZWF0ZXJ0aGVub3JlcXVhbHRvRW51bUxpdGVyYWxEZWNsYXJhdGlvbl8zOyB9CisJCQorCQkvLyc+PScKKwkJcHVibGljIEtleXdvcmQgZ2V0R3JlYXRlcnRoZW5vcmVxdWFsdG9HcmVhdGVyVGhhblNpZ25FcXVhbHNTaWduS2V5d29yZF8zXzAoKSB7IHJldHVybiBjR3JlYXRlcnRoZW5vcmVxdWFsdG9HcmVhdGVyVGhhblNpZ25FcXVhbHNTaWduS2V5d29yZF8zXzA7IH0KKwkJCisJCS8vbGVzc3RoZW49JzwnCisJCXB1YmxpYyBFbnVtTGl0ZXJhbERlY2xhcmF0aW9uIGdldExlc3N0aGVuRW51bUxpdGVyYWxEZWNsYXJhdGlvbl80KCkgeyByZXR1cm4gY0xlc3N0aGVuRW51bUxpdGVyYWxEZWNsYXJhdGlvbl80OyB9CisJCQorCQkvLyc8JworCQlwdWJsaWMgS2V5d29yZCBnZXRMZXNzdGhlbkxlc3NUaGFuU2lnbktleXdvcmRfNF8wKCkgeyByZXR1cm4gY0xlc3N0aGVuTGVzc1RoYW5TaWduS2V5d29yZF80XzA7IH0KKwkJCisJCS8vbGVzc3RoZW5vcmVxdWFsdG89Jzw9JworCQlwdWJsaWMgRW51bUxpdGVyYWxEZWNsYXJhdGlvbiBnZXRMZXNzdGhlbm9yZXF1YWx0b0VudW1MaXRlcmFsRGVjbGFyYXRpb25fNSgpIHsgcmV0dXJuIGNMZXNzdGhlbm9yZXF1YWx0b0VudW1MaXRlcmFsRGVjbGFyYXRpb25fNTsgfQorCQkKKwkJLy8nPD0nCisJCXB1YmxpYyBLZXl3b3JkIGdldExlc3N0aGVub3JlcXVhbHRvTGVzc1RoYW5TaWduRXF1YWxzU2lnbktleXdvcmRfNV8wKCkgeyByZXR1cm4gY0xlc3N0aGVub3JlcXVhbHRvTGVzc1RoYW5TaWduRXF1YWxzU2lnbktleXdvcmRfNV8wOyB9CisJCQorCQkvL2lzbnVsbAorCQlwdWJsaWMgRW51bUxpdGVyYWxEZWNsYXJhdGlvbiBnZXRJc251bGxFbnVtTGl0ZXJhbERlY2xhcmF0aW9uXzYoKSB7IHJldHVybiBjSXNudWxsRW51bUxpdGVyYWxEZWNsYXJhdGlvbl82OyB9CisJCQorCQkvLydpc251bGwnCisJCXB1YmxpYyBLZXl3b3JkIGdldElzbnVsbElzbnVsbEtleXdvcmRfNl8wKCkgeyByZXR1cm4gY0lzbnVsbElzbnVsbEtleXdvcmRfNl8wOyB9CisJCQorCQkvL2lzbm90bnVsbAorCQlwdWJsaWMgRW51bUxpdGVyYWxEZWNsYXJhdGlvbiBnZXRJc25vdG51bGxFbnVtTGl0ZXJhbERlY2xhcmF0aW9uXzcoKSB7IHJldHVybiBjSXNub3RudWxsRW51bUxpdGVyYWxEZWNsYXJhdGlvbl83OyB9CisJCQorCQkvLydpc25vdG51bGwnCisJCXB1YmxpYyBLZXl3b3JkIGdldElzbm90bnVsbElzbm90bnVsbEtleXdvcmRfN18wKCkgeyByZXR1cm4gY0lzbm90bnVsbElzbm90bnVsbEtleXdvcmRfN18wOyB9CisJfQorCXB1YmxpYyBjbGFzcyBDb25kaXRpb25BbmRPcGVyYXRvcjJFbGVtZW50cyBleHRlbmRzIEFic3RyYWN0RW51bVJ1bGVFbGVtZW50RmluZGVyIHsKKwkJcHJpdmF0ZSBmaW5hbCBFbnVtUnVsZSBydWxlID0gKEVudW1SdWxlKSBHcmFtbWFyVXRpbC5maW5kUnVsZUZvck5hbWUoZ2V0R3JhbW1hcigpLCAib3JnLmVjbGlwc2Uub3NicC54dGV4dC5kYXRhaW50ZXJjaGFuZ2UuRGF0YURTTC5Db25kaXRpb25BbmRPcGVyYXRvcjIiKTsKKwkJcHJpdmF0ZSBmaW5hbCBBbHRlcm5hdGl2ZXMgY0FsdGVybmF0aXZlcyA9IChBbHRlcm5hdGl2ZXMpcnVsZS5lQ29udGVudHMoKS5nZXQoMSk7CisJCXByaXZhdGUgZmluYWwgRW51bUxpdGVyYWxEZWNsYXJhdGlvbiBjQW5kRW51bUxpdGVyYWxEZWNsYXJhdGlvbl8wID0gKEVudW1MaXRlcmFsRGVjbGFyYXRpb24pY0FsdGVybmF0aXZlcy5lQ29udGVudHMoKS5nZXQoMCk7CisJCXByaXZhdGUgZmluYWwgS2V5d29yZCBjQW5kQW5kS2V5d29yZF8wXzAgPSAoS2V5d29yZCljQW5kRW51bUxpdGVyYWxEZWNsYXJhdGlvbl8wLmVDb250ZW50cygpLmdldCgwKTsKKwkJcHJpdmF0ZSBmaW5hbCBFbnVtTGl0ZXJhbERlY2xhcmF0aW9uIGNPckVudW1MaXRlcmFsRGVjbGFyYXRpb25fMSA9IChFbnVtTGl0ZXJhbERlY2xhcmF0aW9uKWNBbHRlcm5hdGl2ZXMuZUNvbnRlbnRzKCkuZ2V0KDEpOworCQlwcml2YXRlIGZpbmFsIEtleXdvcmQgY09yT3JLZXl3b3JkXzFfMCA9IChLZXl3b3JkKWNPckVudW1MaXRlcmFsRGVjbGFyYXRpb25fMS5lQ29udGVudHMoKS5nZXQoMCk7CisJCQorCQkvL2VudW0gQ29uZGl0aW9uQW5kT3BlcmF0b3IyOgorCQkvLwlhbmQgfAorCQkvLwlvcjsKKwkJcHVibGljIEVudW1SdWxlIGdldFJ1bGUoKSB7IHJldHVybiBydWxlOyB9CisJCQorCQkvL2FuZCB8IG9yCisJCXB1YmxpYyBBbHRlcm5hdGl2ZXMgZ2V0QWx0ZXJuYXRpdmVzKCkgeyByZXR1cm4gY0FsdGVybmF0aXZlczsgfQorCQkKKwkJLy9hbmQKKwkJcHVibGljIEVudW1MaXRlcmFsRGVjbGFyYXRpb24gZ2V0QW5kRW51bUxpdGVyYWxEZWNsYXJhdGlvbl8wKCkgeyByZXR1cm4gY0FuZEVudW1MaXRlcmFsRGVjbGFyYXRpb25fMDsgfQorCQkKKwkJLy8nYW5kJworCQlwdWJsaWMgS2V5d29yZCBnZXRBbmRBbmRLZXl3b3JkXzBfMCgpIHsgcmV0dXJuIGNBbmRBbmRLZXl3b3JkXzBfMDsgfQorCQkKKwkJLy9vcgorCQlwdWJsaWMgRW51bUxpdGVyYWxEZWNsYXJhdGlvbiBnZXRPckVudW1MaXRlcmFsRGVjbGFyYXRpb25fMSgpIHsgcmV0dXJuIGNPckVudW1MaXRlcmFsRGVjbGFyYXRpb25fMTsgfQorCQkKKwkJLy8nb3InCisJCXB1YmxpYyBLZXl3b3JkIGdldE9yT3JLZXl3b3JkXzFfMCgpIHsgcmV0dXJuIGNPck9yS2V5d29yZF8xXzA7IH0KKwl9CiAJCiAJcHJpdmF0ZSBmaW5hbCBEYXRhSW50ZXJjaGFuZ2VNb2RlbEVsZW1lbnRzIHBEYXRhSW50ZXJjaGFuZ2VNb2RlbDsKIAlwcml2YXRlIGZpbmFsIERhdGFJbnRlcmNoYW5nZVBhY2thZ2VFbGVtZW50cyBwRGF0YUludGVyY2hhbmdlUGFja2FnZTsKQEAgLTE2NTgsNiArMjA4MywxMCBAQAogCXByaXZhdGUgZmluYWwgRGF0YUludGVyY2hhbmdlRm9ybWF0RWxlbWVudHMgcERhdGFJbnRlcmNoYW5nZUZvcm1hdDsKIAlwcml2YXRlIGZpbmFsIERhdGFJbnRlcmNoYW5nZUV4cHJlc3Npb25FbGVtZW50cyBwRGF0YUludGVyY2hhbmdlRXhwcmVzc2lvbjsKIAlwcml2YXRlIGZpbmFsIERhdGFJbnRlcmNoYW5nZUVudGl0eUV4cHJlc3Npb25FbGVtZW50cyBwRGF0YUludGVyY2hhbmdlRW50aXR5RXhwcmVzc2lvbjsKKwlwcml2YXRlIGZpbmFsIERhdGFJbnRlcmNoYW5nZUV4cG9zZUVsZW1lbnRzIHBEYXRhSW50ZXJjaGFuZ2VFeHBvc2U7CisJcHJpdmF0ZSBmaW5hbCBEYXRhSW50ZXJjaGFuZ2VFeHBvcnRGaWx0ZXJFbGVtZW50cyBwRGF0YUludGVyY2hhbmdlRXhwb3J0RmlsdGVyOworCXByaXZhdGUgZmluYWwgRGF0YUludGVyY2hhbmdlRmlsdGVyQ29uZGl0aW9uRWxlbWVudHMgcERhdGFJbnRlcmNoYW5nZUZpbHRlckNvbmRpdGlvbjsKKwlwcml2YXRlIGZpbmFsIERhdGFJbnRlcmNoYW5nZUV4cG9ydEhpZGVFbGVtZW50cyBwRGF0YUludGVyY2hhbmdlRXhwb3J0SGlkZTsKIAlwcml2YXRlIGZpbmFsIERhdGFJbnRlcmNoYW5nZVByZWRlZmluZWRFeHByZXNzaW9uRWxlbWVudHMgcERhdGFJbnRlcmNoYW5nZVByZWRlZmluZWRFeHByZXNzaW9uOwogCXByaXZhdGUgZmluYWwgRGF0YUludGVyY2hhbmdlTWFwcGluZ0VsZW1lbnRzIHBEYXRhSW50ZXJjaGFuZ2VNYXBwaW5nOwogCXByaXZhdGUgZmluYWwgRGF0YUludGVyY2hhbmdlVmFsdWVNYXBwaW5nRWxlbWVudHMgcERhdGFJbnRlcmNoYW5nZVZhbHVlTWFwcGluZzsKQEAgLTE2NjksNiArMjA5OCw4IEBACiAJcHJpdmF0ZSBmaW5hbCBQcmVkZWZpbmVkQmVhbkVudW1FbGVtZW50cyBlUHJlZGVmaW5lZEJlYW5FbnVtOwogCXByaXZhdGUgZmluYWwgUHJlZGVmaW5lZEJlYW5UeXBlRW51bUVsZW1lbnRzIGVQcmVkZWZpbmVkQmVhblR5cGVFbnVtOwogCXByaXZhdGUgZmluYWwgRW50aXR5TWFuYWdlck1vZGVFbGVtZW50cyBlRW50aXR5TWFuYWdlck1vZGU7CisJcHJpdmF0ZSBmaW5hbCBDb25kaXRpb25BbmRPcGVyYXRvcjFFbGVtZW50cyBlQ29uZGl0aW9uQW5kT3BlcmF0b3IxOworCXByaXZhdGUgZmluYWwgQ29uZGl0aW9uQW5kT3BlcmF0b3IyRWxlbWVudHMgZUNvbmRpdGlvbkFuZE9wZXJhdG9yMjsKIAkKIAlwcml2YXRlIGZpbmFsIEdyYW1tYXIgZ3JhbW1hcjsKIAkKQEAgLTE3MDYsNiArMjEzNywxMCBAQAogCQl0aGlzLnBEYXRhSW50ZXJjaGFuZ2VGb3JtYXQgPSBuZXcgRGF0YUludGVyY2hhbmdlRm9ybWF0RWxlbWVudHMoKTsKIAkJdGhpcy5wRGF0YUludGVyY2hhbmdlRXhwcmVzc2lvbiA9IG5ldyBEYXRhSW50ZXJjaGFuZ2VFeHByZXNzaW9uRWxlbWVudHMoKTsKIAkJdGhpcy5wRGF0YUludGVyY2hhbmdlRW50aXR5RXhwcmVzc2lvbiA9IG5ldyBEYXRhSW50ZXJjaGFuZ2VFbnRpdHlFeHByZXNzaW9uRWxlbWVudHMoKTsKKwkJdGhpcy5wRGF0YUludGVyY2hhbmdlRXhwb3NlID0gbmV3IERhdGFJbnRlcmNoYW5nZUV4cG9zZUVsZW1lbnRzKCk7CisJCXRoaXMucERhdGFJbnRlcmNoYW5nZUV4cG9ydEZpbHRlciA9IG5ldyBEYXRhSW50ZXJjaGFuZ2VFeHBvcnRGaWx0ZXJFbGVtZW50cygpOworCQl0aGlzLnBEYXRhSW50ZXJjaGFuZ2VGaWx0ZXJDb25kaXRpb24gPSBuZXcgRGF0YUludGVyY2hhbmdlRmlsdGVyQ29uZGl0aW9uRWxlbWVudHMoKTsKKwkJdGhpcy5wRGF0YUludGVyY2hhbmdlRXhwb3J0SGlkZSA9IG5ldyBEYXRhSW50ZXJjaGFuZ2VFeHBvcnRIaWRlRWxlbWVudHMoKTsKIAkJdGhpcy5wRGF0YUludGVyY2hhbmdlUHJlZGVmaW5lZEV4cHJlc3Npb24gPSBuZXcgRGF0YUludGVyY2hhbmdlUHJlZGVmaW5lZEV4cHJlc3Npb25FbGVtZW50cygpOwogCQl0aGlzLnBEYXRhSW50ZXJjaGFuZ2VNYXBwaW5nID0gbmV3IERhdGFJbnRlcmNoYW5nZU1hcHBpbmdFbGVtZW50cygpOwogCQl0aGlzLnBEYXRhSW50ZXJjaGFuZ2VWYWx1ZU1hcHBpbmcgPSBuZXcgRGF0YUludGVyY2hhbmdlVmFsdWVNYXBwaW5nRWxlbWVudHMoKTsKQEAgLTE3MTcsNiArMjE1Miw4IEBACiAJCXRoaXMuZVByZWRlZmluZWRCZWFuRW51bSA9IG5ldyBQcmVkZWZpbmVkQmVhbkVudW1FbGVtZW50cygpOwogCQl0aGlzLmVQcmVkZWZpbmVkQmVhblR5cGVFbnVtID0gbmV3IFByZWRlZmluZWRCZWFuVHlwZUVudW1FbGVtZW50cygpOwogCQl0aGlzLmVFbnRpdHlNYW5hZ2VyTW9kZSA9IG5ldyBFbnRpdHlNYW5hZ2VyTW9kZUVsZW1lbnRzKCk7CisJCXRoaXMuZUNvbmRpdGlvbkFuZE9wZXJhdG9yMSA9IG5ldyBDb25kaXRpb25BbmRPcGVyYXRvcjFFbGVtZW50cygpOworCQl0aGlzLmVDb25kaXRpb25BbmRPcGVyYXRvcjIgPSBuZXcgQ29uZGl0aW9uQW5kT3BlcmF0b3IyRWxlbWVudHMoKTsKIAl9CiAJCiAJcHJvdGVjdGVkIEdyYW1tYXIgaW50ZXJuYWxGaW5kR3JhbW1hcihHcmFtbWFyUHJvdmlkZXIgZ3JhbW1hclByb3ZpZGVyKSB7CkBAIC0xNzg0LDYgKzIyMjEsNyBAQAogCS8vCXtEYXRhSW50ZXJjaGFuZ2V9ICdpbnRlcmNoYW5nZScgbmFtZT1UUkFOU0xBVEFCTEVJRCAoZGVzY3JpcHRpb24/PSdkZXNjcmliZWRCeScgZGVzY3JpcHRpb25WYWx1ZT1UUkFOU0xBVEFCTEVTVFJJTkcpPwogCS8vCW1vZGU9RW50aXR5TWFuYWdlck1vZGUgKCd2ZWN0b3JOYW1lJyB2ZWN0b3JOYW1lPVNUUklORyk/CiAJLy8JY3JlYXRlUmVwb3J0Pz0ncmVwb3J0Jz8gKCdlbGVtZW50U2l6ZScgZWxlbWVudFNpemU9SU5UKT8KKwkvLwlkZWxldGVGaWxlQWZ0ZXJJbXBvcnQ/PSdkZWxldGVGaWxlQWZ0ZXJJbXBvcnQnPwogCS8vCSdmaWxlJyBmaWxlRW5kcG9pbnQ9RGF0YUludGVyY2hhbmdlRmlsZSAncGF0aCcgJ3snIHBhdGgrPURhdGFJbnRlcmNoYW5nZUJlYW4qICd9JzsKIAlwdWJsaWMgRGF0YUludGVyY2hhbmdlRWxlbWVudHMgZ2V0RGF0YUludGVyY2hhbmdlQWNjZXNzKCkgewogCQlyZXR1cm4gcERhdGFJbnRlcmNoYW5nZTsKQEAgLTE4NDAsMTAgKzIyNzgsMTEgQEAKIAkvL0RhdGFJbnRlcmNoYW5nZUJlYW46CiAJLy8Je0RhdGFJbnRlcmNoYW5nZUJlYW59CiAJLy8JJ2VudGl0eScgZW50aXR5PVtlbnRpdHk6OkxFbnRpdHl8TEZRTl0gKCdub2RlTmFtZScgbm9kZU5hbWU9U1RSSU5HKT8gKCdjcmVhdGVPbicgZWxlbWVudE1hcD1TVFJJTkcpPwotCS8vCShtYXJrTGF0ZXN0Pz0nbWFya2VyJyBsYXRlc3RQcm9wZXJ0eT1bZW50aXR5OjpMRW50aXR5QXR0cmlidXRlXSk/ICgnZXhwcmVzc2lvbicgJ3snCi0JLy8JZXhwcmVzc2lvbis9RGF0YUludGVyY2hhbmdlRXhwcmVzc2lvbiogJ30nKT8gKCdsb29rdXAnICd7JyBsb29rdXArPURhdGFJbnRlcmNoYW5nZUxvb2t1cCogJ30nKT8gKCdmb3JtYXQnICd7JwotCS8vCWZvcm1hdCs9RGF0YUludGVyY2hhbmdlRm9ybWF0KiAnfScpPyAoJ21hcHBpbmcnICd7JyBtYXBwaW5ncys9RGF0YUludGVyY2hhbmdlTWFwcGluZyogJ30nKT8gKCdrZXlzJyAneycKLQkvLwlsb29rdXBLZXlzKz1EYXRhSW50ZXJjaGFuZ2VLZXkqICd9Jyk/OworCS8vCShtYXJrTGF0ZXN0SW1wb3J0Pz0nbGF0ZXN0SW1wb3J0JyBsYXRlc3RQcm9wZXJ0eT1bZW50aXR5OjpMRW50aXR5QXR0cmlidXRlXSk/IChtYXJrTGF0ZXN0RXhwb3J0Pz0nbGF0ZXN0RXhwb3J0JworCS8vCWxhdGVzdEV4cFByb3BlcnR5PVtlbnRpdHk6OkxFbnRpdHlBdHRyaWJ1dGVdKT8gKCdleHByZXNzaW9uJyAneycgZXhwcmVzc2lvbis9RGF0YUludGVyY2hhbmdlRXhwcmVzc2lvbiogJ30nKT8KKwkvLwkoJ2xvb2t1cCcgJ3snIGxvb2t1cCs9RGF0YUludGVyY2hhbmdlTG9va3VwKiAnfScpPyAoJ2Zvcm1hdCcgJ3snIGZvcm1hdCs9RGF0YUludGVyY2hhbmdlRm9ybWF0KiAnfScpPyAoJ2V4cG9zZScgJ3snCisJLy8JZXhwb3J0RXhwb3Nlcys9RGF0YUludGVyY2hhbmdlRXhwb3NlKiAnfScpPyAoJ21hcHBpbmcnICd7JyBtYXBwaW5ncys9RGF0YUludGVyY2hhbmdlTWFwcGluZyogJ30nKT8gKCdrZXlzJyAneycKKwkvLwlsb29rdXBLZXlzKz1EYXRhSW50ZXJjaGFuZ2VLZXkqICd9Jyk/ICgnZXhwb3J0RmlsdGVyJyAneycgZXhwb3J0RmlsdGVyPURhdGFJbnRlcmNoYW5nZUV4cG9ydEZpbHRlciAnfScpPzsKIAlwdWJsaWMgRGF0YUludGVyY2hhbmdlQmVhbkVsZW1lbnRzIGdldERhdGFJbnRlcmNoYW5nZUJlYW5BY2Nlc3MoKSB7CiAJCXJldHVybiBwRGF0YUludGVyY2hhbmdlQmVhbjsKIAl9CkBAIC0xOTMxLDYgKzIzNzAsNTAgQEAKIAkJcmV0dXJuIGdldERhdGFJbnRlcmNoYW5nZUVudGl0eUV4cHJlc3Npb25BY2Nlc3MoKS5nZXRSdWxlKCk7CiAJfQogCQorCS8vRGF0YUludGVyY2hhbmdlRXhwb3NlOgorCS8vCXtEYXRhSW50ZXJjaGFuZ2VFeHBvc2V9CisJLy8JJ3JlZicgcmVmRW50aXR5PVtlbnRpdHk6OkxFbnRpdHlSZWZlcmVuY2VdICgnb24nIHJlZlByb3BlcnR5PVtlbnRpdHk6OkxFbnRpdHlBdHRyaWJ1dGVdIHwgJ2V4cG9zZScgJ3snCisJLy8Jc3ViRXhwb3NlPURhdGFJbnRlcmNoYW5nZUV4cG9zZSAnfScpOworCXB1YmxpYyBEYXRhSW50ZXJjaGFuZ2VFeHBvc2VFbGVtZW50cyBnZXREYXRhSW50ZXJjaGFuZ2VFeHBvc2VBY2Nlc3MoKSB7CisJCXJldHVybiBwRGF0YUludGVyY2hhbmdlRXhwb3NlOworCX0KKwkKKwlwdWJsaWMgUGFyc2VyUnVsZSBnZXREYXRhSW50ZXJjaGFuZ2VFeHBvc2VSdWxlKCkgeworCQlyZXR1cm4gZ2V0RGF0YUludGVyY2hhbmdlRXhwb3NlQWNjZXNzKCkuZ2V0UnVsZSgpOworCX0KKwkKKwkvL0RhdGFJbnRlcmNoYW5nZUV4cG9ydEZpbHRlcjoKKwkvLwl7RGF0YUludGVyY2hhbmdlRXhwb3J0RmlsdGVyfSAoJ3doZXJlJyAneycgY29uZGl0aW9uPURhdGFJbnRlcmNoYW5nZUZpbHRlckNvbmRpdGlvbiAnfScpPyAoJ2hpZGUnCisJLy8JaGlkZGVucHJvcGVydGllcys9RGF0YUludGVyY2hhbmdlRXhwb3J0SGlkZSopPzsKKwlwdWJsaWMgRGF0YUludGVyY2hhbmdlRXhwb3J0RmlsdGVyRWxlbWVudHMgZ2V0RGF0YUludGVyY2hhbmdlRXhwb3J0RmlsdGVyQWNjZXNzKCkgeworCQlyZXR1cm4gcERhdGFJbnRlcmNoYW5nZUV4cG9ydEZpbHRlcjsKKwl9CisJCisJcHVibGljIFBhcnNlclJ1bGUgZ2V0RGF0YUludGVyY2hhbmdlRXhwb3J0RmlsdGVyUnVsZSgpIHsKKwkJcmV0dXJuIGdldERhdGFJbnRlcmNoYW5nZUV4cG9ydEZpbHRlckFjY2VzcygpLmdldFJ1bGUoKTsKKwl9CisJCisJLy9EYXRhSW50ZXJjaGFuZ2VGaWx0ZXJDb25kaXRpb246CisJLy8JcmVmUHJvcGVydHk9W2VudGl0eTo6TEVudGl0eUZlYXR1cmVdIG9wZXJhdG9yPUNvbmRpdGlvbkFuZE9wZXJhdG9yMQorCS8vCXZhbHVlPVNUUklORz8gKG9wZXJhdG9yMj1Db25kaXRpb25BbmRPcGVyYXRvcjIgc3ViY29uZGl0aW9uPURhdGFJbnRlcmNoYW5nZUZpbHRlckNvbmRpdGlvbik/OworCXB1YmxpYyBEYXRhSW50ZXJjaGFuZ2VGaWx0ZXJDb25kaXRpb25FbGVtZW50cyBnZXREYXRhSW50ZXJjaGFuZ2VGaWx0ZXJDb25kaXRpb25BY2Nlc3MoKSB7CisJCXJldHVybiBwRGF0YUludGVyY2hhbmdlRmlsdGVyQ29uZGl0aW9uOworCX0KKwkKKwlwdWJsaWMgUGFyc2VyUnVsZSBnZXREYXRhSW50ZXJjaGFuZ2VGaWx0ZXJDb25kaXRpb25SdWxlKCkgeworCQlyZXR1cm4gZ2V0RGF0YUludGVyY2hhbmdlRmlsdGVyQ29uZGl0aW9uQWNjZXNzKCkuZ2V0UnVsZSgpOworCX0KKwkKKwkvL0RhdGFJbnRlcmNoYW5nZUV4cG9ydEhpZGU6CisJLy8Je0RhdGFJbnRlcmNoYW5nZUV4cG9ydEhpZGV9IHByb3BlcnR5PVtlbnRpdHk6OkxFbnRpdHlGZWF0dXJlXTsKKwlwdWJsaWMgRGF0YUludGVyY2hhbmdlRXhwb3J0SGlkZUVsZW1lbnRzIGdldERhdGFJbnRlcmNoYW5nZUV4cG9ydEhpZGVBY2Nlc3MoKSB7CisJCXJldHVybiBwRGF0YUludGVyY2hhbmdlRXhwb3J0SGlkZTsKKwl9CisJCisJcHVibGljIFBhcnNlclJ1bGUgZ2V0RGF0YUludGVyY2hhbmdlRXhwb3J0SGlkZVJ1bGUoKSB7CisJCXJldHVybiBnZXREYXRhSW50ZXJjaGFuZ2VFeHBvcnRIaWRlQWNjZXNzKCkuZ2V0UnVsZSgpOworCX0KKwkKIAkvL0RhdGFJbnRlcmNoYW5nZVByZWRlZmluZWRFeHByZXNzaW9uOgogCS8vCXtEYXRhSW50ZXJjaGFuZ2VQcmVkZWZpbmVkRXhwcmVzc2lvbn0gJ2Fzc2lnbicgdGFyZ2V0UHJvcGVydHk9W2VudGl0eTo6TEVudGl0eUF0dHJpYnV0ZV0gJ3dpdGgnCiAJLy8JYmVhbj1QcmVkZWZpbmVkQmVhbkVudW0gJ2FzJyBiZWFuVHlwZT1QcmVkZWZpbmVkQmVhblR5cGVFbnVtOwpAQCAtMjA1OCw2ICsyNTQxLDM0IEBACiAJCXJldHVybiBnZXRFbnRpdHlNYW5hZ2VyTW9kZUFjY2VzcygpLmdldFJ1bGUoKTsKIAl9CiAJCisJLy9lbnVtIENvbmRpdGlvbkFuZE9wZXJhdG9yMToKKwkvLwllcXVhbHM9Jz0nIHwKKwkvLwlub3RlcXVhbHM9JyE9JyB8CisJLy8JZ3JlYXRlcnRoZW49Jz4nIHwKKwkvLwlncmVhdGVydGhlbm9yZXF1YWx0bz0nPj0nIHwKKwkvLwlsZXNzdGhlbj0nPCcgfAorCS8vCWxlc3N0aGVub3JlcXVhbHRvPSc8PScgfAorCS8vCWlzbnVsbCB8CisJLy8JaXNub3RudWxsOworCXB1YmxpYyBDb25kaXRpb25BbmRPcGVyYXRvcjFFbGVtZW50cyBnZXRDb25kaXRpb25BbmRPcGVyYXRvcjFBY2Nlc3MoKSB7CisJCXJldHVybiBlQ29uZGl0aW9uQW5kT3BlcmF0b3IxOworCX0KKwkKKwlwdWJsaWMgRW51bVJ1bGUgZ2V0Q29uZGl0aW9uQW5kT3BlcmF0b3IxUnVsZSgpIHsKKwkJcmV0dXJuIGdldENvbmRpdGlvbkFuZE9wZXJhdG9yMUFjY2VzcygpLmdldFJ1bGUoKTsKKwl9CisJCisJLy9lbnVtIENvbmRpdGlvbkFuZE9wZXJhdG9yMjoKKwkvLwlhbmQgfAorCS8vCW9yOworCXB1YmxpYyBDb25kaXRpb25BbmRPcGVyYXRvcjJFbGVtZW50cyBnZXRDb25kaXRpb25BbmRPcGVyYXRvcjJBY2Nlc3MoKSB7CisJCXJldHVybiBlQ29uZGl0aW9uQW5kT3BlcmF0b3IyOworCX0KKwkKKwlwdWJsaWMgRW51bVJ1bGUgZ2V0Q29uZGl0aW9uQW5kT3BlcmF0b3IyUnVsZSgpIHsKKwkJcmV0dXJuIGdldENvbmRpdGlvbkFuZE9wZXJhdG9yMkFjY2VzcygpLmdldFJ1bGUoKTsKKwl9CisJCiAJLy9AIE92ZXJyaWRlIFhJbXBvcnREZWNsYXJhdGlvbiBPWEltcG9ydERlY2xhcmF0aW9uOgogCS8vCXtPWEltcG9ydERlY2xhcmF0aW9ufQogCS8vCSdpbXBvcnQnIChzdGF0aWM/PSdzdGF0aWMnIGV4dGVuc2lvbj89J2V4dGVuc2lvbic/IGltcG9ydGVkVHlwZT1bSnZtRGVjbGFyZWRUeXBlfFF1YWxpZmllZE5hbWVJblN0YXRpY0ltcG9ydF0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLm9zYnAueHRleHQuZGF0YWludGVyY2hhbmdlL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9kYXRhaW50ZXJjaGFuZ2UvdmFsaWRhdGlvbi9BYnN0cmFjdERhdGFEU0xWYWxpZGF0b3IuamF2YSBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQuZGF0YWludGVyY2hhbmdlL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9kYXRhaW50ZXJjaGFuZ2UvdmFsaWRhdGlvbi9BYnN0cmFjdERhdGFEU0xWYWxpZGF0b3IuamF2YQppbmRleCAzODQ0ZGQ0Li5hZWI1MDkwIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmRhdGFpbnRlcmNoYW5nZS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvZGF0YWludGVyY2hhbmdlL3ZhbGlkYXRpb24vQWJzdHJhY3REYXRhRFNMVmFsaWRhdG9yLmphdmEKKysrIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5kYXRhaW50ZXJjaGFuZ2Uvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2RhdGFpbnRlcmNoYW5nZS92YWxpZGF0aW9uL0Fic3RyYWN0RGF0YURTTFZhbGlkYXRvci5qYXZhCkBAIC0zLDkgKzMsMTEgQEAKICAqICBDb3B5cmlnaHQgKGMpIDIwMTEsIDIwMTYgLSBMb2V0eiBHbWJIJkNvLktHICg2OTExNSBIZWlkZWxiZXJnLCBHZXJtYW55KSAKICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICogIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgICAgICAgICAgIAotICogIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCAgICAgICAKKyAqICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIDIuMCAgICAgICAgCiAgKiAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgICAgICAgICAgICAgICAgICAKLSAqICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICogIGh0dHBzOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAvICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICogIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAqICBDb250cmlidXRvcnM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgKiAJICAgQ2hyaXN0b3BoZSBMb2V0eiAoTG9ldHogR21iSCZDby5LRykgLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmRhdGFpbnRlcmNoYW5nZS9zcmMvb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9kYXRhaW50ZXJjaGFuZ2UvQWN0aXZhdG9yLmphdmEgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmRhdGFpbnRlcmNoYW5nZS9zcmMvb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9kYXRhaW50ZXJjaGFuZ2UvQWN0aXZhdG9yLmphdmEKaW5kZXggOWU5MTc0OS4uZWVkOGE2MCAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5kYXRhaW50ZXJjaGFuZ2Uvc3JjL29yZy9lY2xpcHNlL29zYnAveHRleHQvZGF0YWludGVyY2hhbmdlL0FjdGl2YXRvci5qYXZhCisrKyBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQuZGF0YWludGVyY2hhbmdlL3NyYy9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2RhdGFpbnRlcmNoYW5nZS9BY3RpdmF0b3IuamF2YQpAQCAtMyw5ICszLDExIEBACiAgKiAgQ29weXJpZ2h0IChjKSAyMDExLCAyMDE2IC0gTG9ldHogR21iSCZDby5LRyAoNjkxMTUgSGVpZGVsYmVyZywgR2VybWFueSkgCiAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAqICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzICAgICAgICAgICAKLSAqICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgICAgICAgCisgKiAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSAyLjAgICAgICAgIAogICogIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0ICAgICAgICAgICAgICAgICAgCi0gKiAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAqICBodHRwczovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAqICBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgKiAgQ29udHJpYnV0b3JzOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICogCSAgIENocmlzdG9waGUgTG9ldHogKExvZXR6IEdtYkgmQ28uS0cpIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5kYXRhaW50ZXJjaGFuZ2Uvc3JjL29yZy9lY2xpcHNlL29zYnAveHRleHQvZGF0YWludGVyY2hhbmdlL0RhdGFEU0wueHRleHQgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmRhdGFpbnRlcmNoYW5nZS9zcmMvb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9kYXRhaW50ZXJjaGFuZ2UvRGF0YURTTC54dGV4dAppbmRleCBiZDU4ZjViLi4xODc2OTk3IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmRhdGFpbnRlcmNoYW5nZS9zcmMvb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9kYXRhaW50ZXJjaGFuZ2UvRGF0YURTTC54dGV4dAorKysgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmRhdGFpbnRlcmNoYW5nZS9zcmMvb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9kYXRhaW50ZXJjaGFuZ2UvRGF0YURTTC54dGV4dApAQCAtMyw5ICszLDExIEBACiAgKiAgQ29weXJpZ2h0IChjKSAyMDExLCAyMDE2IC0gTG9ldHogR21iSCZDby5LRyAoNjkxMTUgSGVpZGVsYmVyZywgR2VybWFueSkgCiAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAqICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzICAgICAgICAgICAKLSAqICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgICAgICAgCisgKiAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSAyLjAgICAgICAgIAogICogIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0ICAgICAgICAgICAgICAgICAgCi0gKiAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAqICBodHRwczovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAqICBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgKiAgQ29udHJpYnV0b3JzOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICogCSAgIENocmlzdG9waGUgTG9ldHogKExvZXR6IEdtYkgmQ28uS0cpIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgpAQCAtMzUsNiArMzcsNyBAQAogCSgndmVjdG9yTmFtZScgdmVjdG9yTmFtZT1TVFJJTkcpPyAKIAkoY3JlYXRlUmVwb3J0Pz0ncmVwb3J0Jyk/IAogCSgnZWxlbWVudFNpemUnIGVsZW1lbnRTaXplPUlOVCk/IAorCShkZWxldGVGaWxlQWZ0ZXJJbXBvcnQ/PSdkZWxldGVGaWxlQWZ0ZXJJbXBvcnQnKT8KIAknZmlsZScgZmlsZUVuZHBvaW50PURhdGFJbnRlcmNoYW5nZUZpbGUgJ3BhdGgnICd7JyAocGF0aCs9RGF0YUludGVyY2hhbmdlQmVhbikqICd9JzsKIAogRGF0YUludGVyY2hhbmdlRmlsZToKQEAgLTU4LDIwICs2MSwyNCBAQAogCSdlbnRpdHknIGVudGl0eT1bZW50aXR5OjpMRW50aXR5fExGUU5dCiAJKCdub2RlTmFtZScgbm9kZU5hbWU9U1RSSU5HKT8KIAkoJ2NyZWF0ZU9uJyBlbGVtZW50TWFwPVNUUklORyk/IAotCShtYXJrTGF0ZXN0Pz0nbWFya2VyJyBsYXRlc3RQcm9wZXJ0eT1bZW50aXR5OjpMRW50aXR5QXR0cmlidXRlXSk/CisJKG1hcmtMYXRlc3RJbXBvcnQ/PSdsYXRlc3RJbXBvcnQnIGxhdGVzdFByb3BlcnR5PVtlbnRpdHk6OkxFbnRpdHlBdHRyaWJ1dGVdKT8KKwkobWFya0xhdGVzdEV4cG9ydD89J2xhdGVzdEV4cG9ydCcgbGF0ZXN0RXhwUHJvcGVydHk9W2VudGl0eTo6TEVudGl0eUF0dHJpYnV0ZV0pPwogCSgnZXhwcmVzc2lvbicgJ3snIChleHByZXNzaW9uKz1EYXRhSW50ZXJjaGFuZ2VFeHByZXNzaW9uKSogJ30nKT8KIAkoJ2xvb2t1cCcgJ3snIChsb29rdXArPURhdGFJbnRlcmNoYW5nZUxvb2t1cCkqICd9Jyk/CiAJKCdmb3JtYXQnICd7JyAoZm9ybWF0Kz1EYXRhSW50ZXJjaGFuZ2VGb3JtYXQpKiAnfScpPworCSgnZXhwb3NlJyAneycgKGV4cG9ydEV4cG9zZXMrPURhdGFJbnRlcmNoYW5nZUV4cG9zZSkqICd9Jyk/CiAJKCdtYXBwaW5nJyAneycgKG1hcHBpbmdzKz1EYXRhSW50ZXJjaGFuZ2VNYXBwaW5nKSogJ30nKT8KLQkoJ2tleXMnICd7JyAobG9va3VwS2V5cys9RGF0YUludGVyY2hhbmdlS2V5KSogJ30nKT87Ci0JCisJKCdrZXlzJyAneycgKGxvb2t1cEtleXMrPURhdGFJbnRlcmNoYW5nZUtleSkqICd9Jyk/CisJKCdleHBvcnRGaWx0ZXInICd7JyBleHBvcnRGaWx0ZXI9RGF0YUludGVyY2hhbmdlRXhwb3J0RmlsdGVyICd9Jyk/CQorOworCiBEYXRhSW50ZXJjaGFuZ2VLZXk6CiAJe0RhdGFJbnRlcmNoYW5nZUtleX0gJ2tleScgcHJvcGVydHk9W2VudGl0eTo6TEVudGl0eUF0dHJpYnV0ZV07CiAJCiBEYXRhSW50ZXJjaGFuZ2VMb29rdXA6Ci0Je0RhdGFJbnRlcmNoYW5nZUxvb2t1cH0gCisJe0RhdGFJbnRlcmNoYW5nZUxvb2t1cH0KIAknZm9yJyB0YXJnZXRQcm9wZXJ0eT1bZW50aXR5OjpMRW50aXR5UmVmZXJlbmNlXSAKLQknb24nIGVudGl0eT1bZW50aXR5OjpMRW50aXR5XSAKKwknb24nIGVudGl0eT1bZW50aXR5OjpMRW50aXR5XQogCSgnY3JlYXRlT24nIGVsZW1lbnRNYXA9U1RSSU5HKT8KIAknd2l0aCcgcXVlcnlQcm9wZXJ0eT1bZW50aXR5OjpMRW50aXR5QXR0cmlidXRlXSAKIAkoY2FjaGVkPz0nY2FjaGVTaXplJyBjYWNoZVNpemU9SU5UKT8gCkBAIC05OSw3ICsxMDYsMjggQEAKIAkKIERhdGFJbnRlcmNoYW5nZUVudGl0eUV4cHJlc3Npb246CiAJe0RhdGFJbnRlcmNoYW5nZUVudGl0eUV4cHJlc3Npb259ICdjb3B5JyB0YXJnZXRQcm9wZXJ0eT1bZW50aXR5OjpMRW50aXR5QXR0cmlidXRlXSAnZnJvbScgZW50aXR5PVtlbnRpdHk6OkxFbnRpdHl8TEZRTl0gJ3Byb3BlcnR5JyBwcm9wZXJ0eT1bZW50aXR5OjpMRW50aXR5QXR0cmlidXRlXTsKLQkKKworCitEYXRhSW50ZXJjaGFuZ2VFeHBvc2U6CisJe0RhdGFJbnRlcmNoYW5nZUV4cG9zZX0KKwkncmVmJyByZWZFbnRpdHk9W2VudGl0eTo6TEVudGl0eVJlZmVyZW5jZV0gKCdvbicgcmVmUHJvcGVydHk9W2VudGl0eTo6TEVudGl0eUF0dHJpYnV0ZV0gfCAnZXhwb3NlJyAneycgc3ViRXhwb3NlPURhdGFJbnRlcmNoYW5nZUV4cG9zZSAnfScpCis7CisKK0RhdGFJbnRlcmNoYW5nZUV4cG9ydEZpbHRlcjogCisJe0RhdGFJbnRlcmNoYW5nZUV4cG9ydEZpbHRlcn0KKwkoJ3doZXJlJyAneycgY29uZGl0aW9uPURhdGFJbnRlcmNoYW5nZUZpbHRlckNvbmRpdGlvbid9Jyk/CisJKCdoaWRlJyBoaWRkZW5wcm9wZXJ0aWVzKz1EYXRhSW50ZXJjaGFuZ2VFeHBvcnRIaWRlKik/Cis7CitEYXRhSW50ZXJjaGFuZ2VGaWx0ZXJDb25kaXRpb246ICAKKwlyZWZQcm9wZXJ0eT1bZW50aXR5OjpMRW50aXR5RmVhdHVyZV0gb3BlcmF0b3I9Q29uZGl0aW9uQW5kT3BlcmF0b3IxIAorCSh2YWx1ZT1TVFJJTkcpPworCShvcGVyYXRvcjI9Q29uZGl0aW9uQW5kT3BlcmF0b3IyIHN1YmNvbmRpdGlvbj1EYXRhSW50ZXJjaGFuZ2VGaWx0ZXJDb25kaXRpb24gKT8KKzsKKworRGF0YUludGVyY2hhbmdlRXhwb3J0SGlkZToKK3tEYXRhSW50ZXJjaGFuZ2VFeHBvcnRIaWRlfSBwcm9wZXJ0eT1bZW50aXR5OjpMRW50aXR5RmVhdHVyZV0KKzsKKwogRGF0YUludGVyY2hhbmdlUHJlZGVmaW5lZEV4cHJlc3Npb246CiAJe0RhdGFJbnRlcmNoYW5nZVByZWRlZmluZWRFeHByZXNzaW9ufSAnYXNzaWduJyB0YXJnZXRQcm9wZXJ0eT1bZW50aXR5OjpMRW50aXR5QXR0cmlidXRlXSAnd2l0aCcgYmVhbj1QcmVkZWZpbmVkQmVhbkVudW0gJ2FzJyBiZWFuVHlwZT1QcmVkZWZpbmVkQmVhblR5cGVFbnVtOwogCkBAIC0xNDgsMyArMTc2LDI0IEBACiAJcGVyc2lzdAkJPSAncGVyc2lzdCd8CiAJbWVyZ2UJCT0gJ21lcmdlJ3wKIAlyZW1vdmUJCT0gJ3JlbW92ZSc7CisKKworZW51bSBDb25kaXRpb25BbmRPcGVyYXRvcjE6CisJZXF1YWxzID0gJz0nIHwKKwlub3RlcXVhbHMgPSAnIT0nIHwKKwlncmVhdGVydGhlbiA9ICc+JyB8CisJZ3JlYXRlcnRoZW5vcmVxdWFsdG8gPSAnPj0nIHwKKwlsZXNzdGhlbiA9ICc8JyB8CisJbGVzc3RoZW5vcmVxdWFsdG8gPSAnPD0nIHwKKwlpc251bGwgPSAnaXNudWxsJyB8CisJaXNub3RudWxsID0gJ2lzbm90bnVsbCcgCisvLwlpbiA9ICdpbicgfAorLy8JYmV0d2VlbiA9ICdiZXR3ZWVuJ3wgCisvLwlleGlzdHMgPSAnZXhpc3RzJyB8CisvLwlub3QgPSAnbm90IAorLy8JbGlrZSA9ICdsaWtlJworCTsKKwkKK2VudW0gQ29uZGl0aW9uQW5kT3BlcmF0b3IyOgorCWFuZCA9ICdhbmQnfAorCW9yID0gJ29yJzsKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmRhdGFpbnRlcmNoYW5nZS9zcmMvb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9kYXRhaW50ZXJjaGFuZ2UvRGF0YURTTEJ1bmRsZVNwYWNlUnVudGltZU1vZHVsZS5qYXZhIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5kYXRhaW50ZXJjaGFuZ2Uvc3JjL29yZy9lY2xpcHNlL29zYnAveHRleHQvZGF0YWludGVyY2hhbmdlL0RhdGFEU0xCdW5kbGVTcGFjZVJ1bnRpbWVNb2R1bGUuamF2YQppbmRleCA0ZWZhYmY5Li43YjYwMDA2IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmRhdGFpbnRlcmNoYW5nZS9zcmMvb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9kYXRhaW50ZXJjaGFuZ2UvRGF0YURTTEJ1bmRsZVNwYWNlUnVudGltZU1vZHVsZS5qYXZhCisrKyBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQuZGF0YWludGVyY2hhbmdlL3NyYy9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2RhdGFpbnRlcmNoYW5nZS9EYXRhRFNMQnVuZGxlU3BhY2VSdW50aW1lTW9kdWxlLmphdmEKQEAgLTMsOSArMywxMSBAQAogICogIENvcHlyaWdodCAoYykgMjAxMSwgMjAxNiAtIExvZXR6IEdtYkgmQ28uS0cgKDY5MTE1IEhlaWRlbGJlcmcsIEdlcm1hbnkpIAogICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgKiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAgICAgICAgICAgCi0gKiAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wICAgICAgIAorICogIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgMi4wICAgICAgICAKICAqICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAgICAgICAgICAgICAgICAgIAotICogIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKiAgaHR0cHM6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKiAgU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICogIENvbnRyaWJ1dG9yczogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAqIAkgICBDaHJpc3RvcGhlIExvZXR6IChMb2V0eiBHbWJIJkNvLktHKSAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLm9zYnAueHRleHQuZGF0YWludGVyY2hhbmdlL3NyYy9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2RhdGFpbnRlcmNoYW5nZS9EYXRhRFNMQnVuZGxlU3BhY2VTdGFuZGFsb25lU2V0dXAuamF2YSBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQuZGF0YWludGVyY2hhbmdlL3NyYy9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2RhdGFpbnRlcmNoYW5nZS9EYXRhRFNMQnVuZGxlU3BhY2VTdGFuZGFsb25lU2V0dXAuamF2YQppbmRleCAwOTA4ZmE2Li40M2Y3ZjM2IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmRhdGFpbnRlcmNoYW5nZS9zcmMvb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9kYXRhaW50ZXJjaGFuZ2UvRGF0YURTTEJ1bmRsZVNwYWNlU3RhbmRhbG9uZVNldHVwLmphdmEKKysrIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5kYXRhaW50ZXJjaGFuZ2Uvc3JjL29yZy9lY2xpcHNlL29zYnAveHRleHQvZGF0YWludGVyY2hhbmdlL0RhdGFEU0xCdW5kbGVTcGFjZVN0YW5kYWxvbmVTZXR1cC5qYXZhCkBAIC0zLDkgKzMsMTEgQEAKICAqICBDb3B5cmlnaHQgKGMpIDIwMTEsIDIwMTYgLSBMb2V0eiBHbWJIJkNvLktHICg2OTExNSBIZWlkZWxiZXJnLCBHZXJtYW55KSAKICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICogIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgICAgICAgICAgIAotICogIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCAgICAgICAKKyAqICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIDIuMCAgICAgICAgCiAgKiAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgICAgICAgICAgICAgICAgICAKLSAqICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICogIGh0dHBzOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAvICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICogIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAqICBDb250cmlidXRvcnM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgKiAJICAgQ2hyaXN0b3BoZSBMb2V0eiAoTG9ldHogR21iSCZDby5LRykgLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmRhdGFpbnRlcmNoYW5nZS9zcmMvb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9kYXRhaW50ZXJjaGFuZ2UvRGF0YURTTFJ1bnRpbWVNb2R1bGUuamF2YSBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQuZGF0YWludGVyY2hhbmdlL3NyYy9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2RhdGFpbnRlcmNoYW5nZS9EYXRhRFNMUnVudGltZU1vZHVsZS5qYXZhCmluZGV4IGNjYjljMjYuLjI4MmRjMmUgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLm9zYnAueHRleHQuZGF0YWludGVyY2hhbmdlL3NyYy9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2RhdGFpbnRlcmNoYW5nZS9EYXRhRFNMUnVudGltZU1vZHVsZS5qYXZhCisrKyBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQuZGF0YWludGVyY2hhbmdlL3NyYy9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2RhdGFpbnRlcmNoYW5nZS9EYXRhRFNMUnVudGltZU1vZHVsZS5qYXZhCkBAIC0zLDkgKzMsMTEgQEAKICAqICBDb3B5cmlnaHQgKGMpIDIwMTEsIDIwMTYgLSBMb2V0eiBHbWJIJkNvLktHICg2OTExNSBIZWlkZWxiZXJnLCBHZXJtYW55KSAKICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICogIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgICAgICAgICAgIAotICogIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCAgICAgICAKKyAqICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIDIuMCAgICAgICAgCiAgKiAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgICAgICAgICAgICAgICAgICAKLSAqICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICogIGh0dHBzOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAvICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICogIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAqICBDb250cmlidXRvcnM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgKiAJICAgQ2hyaXN0b3BoZSBMb2V0eiAoTG9ldHogR21iSCZDby5LRykgLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmRhdGFpbnRlcmNoYW5nZS9zcmMvb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9kYXRhaW50ZXJjaGFuZ2UvRGF0YURTTFN0YW5kYWxvbmVTZXR1cC5qYXZhIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5kYXRhaW50ZXJjaGFuZ2Uvc3JjL29yZy9lY2xpcHNlL29zYnAveHRleHQvZGF0YWludGVyY2hhbmdlL0RhdGFEU0xTdGFuZGFsb25lU2V0dXAuamF2YQppbmRleCAzODVhMTliLi45ODI2NTFkIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmRhdGFpbnRlcmNoYW5nZS9zcmMvb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9kYXRhaW50ZXJjaGFuZ2UvRGF0YURTTFN0YW5kYWxvbmVTZXR1cC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQuZGF0YWludGVyY2hhbmdlL3NyYy9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2RhdGFpbnRlcmNoYW5nZS9EYXRhRFNMU3RhbmRhbG9uZVNldHVwLmphdmEKQEAgLTMsOSArMywxMSBAQAogICogIENvcHlyaWdodCAoYykgMjAxMSwgMjAxNiAtIExvZXR6IEdtYkgmQ28uS0cgKDY5MTE1IEhlaWRlbGJlcmcsIEdlcm1hbnkpIAogICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgKiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAgICAgICAgICAgCi0gKiAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wICAgICAgIAorICogIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgMi4wICAgICAgICAKICAqICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAgICAgICAgICAgICAgICAgIAotICogIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKiAgaHR0cHM6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKiAgU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICogIENvbnRyaWJ1dG9yczogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAqIAkgICBDaHJpc3RvcGhlIExvZXR6IChMb2V0eiBHbWJIJkNvLktHKSAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLm9zYnAueHRleHQuZGF0YWludGVyY2hhbmdlL3NyYy9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2RhdGFpbnRlcmNoYW5nZS9HZW5lcmF0ZURhdGFEU0wubXdlMiBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQuZGF0YWludGVyY2hhbmdlL3NyYy9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2RhdGFpbnRlcmNoYW5nZS9HZW5lcmF0ZURhdGFEU0wubXdlMgppbmRleCA5MzlhMDc2Li5kZmUwOTc0IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmRhdGFpbnRlcmNoYW5nZS9zcmMvb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9kYXRhaW50ZXJjaGFuZ2UvR2VuZXJhdGVEYXRhRFNMLm13ZTIKKysrIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5kYXRhaW50ZXJjaGFuZ2Uvc3JjL29yZy9lY2xpcHNlL29zYnAveHRleHQvZGF0YWludGVyY2hhbmdlL0dlbmVyYXRlRGF0YURTTC5td2UyCkBAIC0zLDkgKzMsMTEgQEAKICAqICBDb3B5cmlnaHQgKGMpIDIwMTEsIDIwMTYgLSBMb2V0eiBHbWJIJkNvLktHICg2OTExNSBIZWlkZWxiZXJnLCBHZXJtYW55KSAKICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICogIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgICAgICAgICAgIAotICogIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCAgICAgICAKKyAqICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIDIuMCAgICAgICAgCiAgKiAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgICAgICAgICAgICAgICAgICAKLSAqICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICogIGh0dHBzOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAvICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICogIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAqICBDb250cmlidXRvcnM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgKiAJICAgQ2hyaXN0b3BoZSBMb2V0eiAoTG9ldHogR21iSCZDby5LRykgLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCkBAIC0yNCw5ICsyNiwxMSBAQAogICogIENvcHlyaWdodCAoYykgMjAxMSwgMjAxNiAtIExvZXR6IEdtYkgmQ28uS0cgKDY5MTE1IEhlaWRlbGJlcmcsIEdlcm1hbnkpIAogICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgKiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAgICAgICAgICAgCi0gKiAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wICAgICAgIAorICogIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgMi4wICAgICAgICAKICAqICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAgICAgICAgICAgICAgICAgIAotICogIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKiAgaHR0cHM6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKiAgU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICogIENvbnRyaWJ1dG9yczogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAqIAkgICBDaHJpc3RvcGhlIExvZXR6IChMb2V0eiBHbWJIJkNvLktHKSAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLm9zYnAueHRleHQuZGF0YWludGVyY2hhbmdlL3NyYy9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2RhdGFpbnRlcmNoYW5nZS9YY29yZVJlc291cmNlRmFjdG9yeS5qYXZhIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5kYXRhaW50ZXJjaGFuZ2Uvc3JjL29yZy9lY2xpcHNlL29zYnAveHRleHQvZGF0YWludGVyY2hhbmdlL1hjb3JlUmVzb3VyY2VGYWN0b3J5LmphdmEKaW5kZXggODliYTQ3Yi4uZWE1Njk4OSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5kYXRhaW50ZXJjaGFuZ2Uvc3JjL29yZy9lY2xpcHNlL29zYnAveHRleHQvZGF0YWludGVyY2hhbmdlL1hjb3JlUmVzb3VyY2VGYWN0b3J5LmphdmEKKysrIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5kYXRhaW50ZXJjaGFuZ2Uvc3JjL29yZy9lY2xpcHNlL29zYnAveHRleHQvZGF0YWludGVyY2hhbmdlL1hjb3JlUmVzb3VyY2VGYWN0b3J5LmphdmEKQEAgLTMsOSArMywxMSBAQAogICogIENvcHlyaWdodCAoYykgMjAxMSwgMjAxNiAtIExvZXR6IEdtYkgmQ28uS0cgKDY5MTE1IEhlaWRlbGJlcmcsIEdlcm1hbnkpIAogICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgKiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAgICAgICAgICAgCi0gKiAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wICAgICAgIAorICogIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgMi4wICAgICAgICAKICAqICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAgICAgICAgICAgICAgICAgIAotICogIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKiAgaHR0cHM6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKiAgU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICogIENvbnRyaWJ1dG9yczogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAqIAkgICBDaHJpc3RvcGhlIExvZXR6IChMb2V0eiBHbWJIJkNvLktHKSAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLm9zYnAueHRleHQuZGF0YWludGVyY2hhbmdlL3NyYy9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2RhdGFpbnRlcmNoYW5nZS9mb3JtYXR0aW5nL0RhdGFEU0xGb3JtYXR0ZXIueHRlbmQgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmRhdGFpbnRlcmNoYW5nZS9zcmMvb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9kYXRhaW50ZXJjaGFuZ2UvZm9ybWF0dGluZy9EYXRhRFNMRm9ybWF0dGVyLnh0ZW5kCmluZGV4IGYzMzI5NDQuLmEwMmQ5NzUgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLm9zYnAueHRleHQuZGF0YWludGVyY2hhbmdlL3NyYy9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2RhdGFpbnRlcmNoYW5nZS9mb3JtYXR0aW5nL0RhdGFEU0xGb3JtYXR0ZXIueHRlbmQKKysrIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5kYXRhaW50ZXJjaGFuZ2Uvc3JjL29yZy9lY2xpcHNlL29zYnAveHRleHQvZGF0YWludGVyY2hhbmdlL2Zvcm1hdHRpbmcvRGF0YURTTEZvcm1hdHRlci54dGVuZApAQCAtMyw5ICszLDExIEBACiAgKiAgQ29weXJpZ2h0IChjKSAyMDExLCAyMDE2IC0gTG9ldHogR21iSCZDby5LRyAoNjkxMTUgSGVpZGVsYmVyZywgR2VybWFueSkgCiAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAqICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzICAgICAgICAgICAKLSAqICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgICAgICAgCisgKiAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSAyLjAgICAgICAgIAogICogIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0ICAgICAgICAgICAgICAgICAgCi0gKiAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAqICBodHRwczovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAqICBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgKiAgQ29udHJpYnV0b3JzOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICogCSAgIENocmlzdG9waGUgTG9ldHogKExvZXR6IEdtYkgmQ28uS0cpIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5kYXRhaW50ZXJjaGFuZ2Uvc3JjL29yZy9lY2xpcHNlL29zYnAveHRleHQvZGF0YWludGVyY2hhbmdlL2p2bW1vZGVsL0RhdGFEU0xKdm1Nb2RlbEluZmVycmVyLnh0ZW5kIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5kYXRhaW50ZXJjaGFuZ2Uvc3JjL29yZy9lY2xpcHNlL29zYnAveHRleHQvZGF0YWludGVyY2hhbmdlL2p2bW1vZGVsL0RhdGFEU0xKdm1Nb2RlbEluZmVycmVyLnh0ZW5kCmluZGV4IGYxMGQ5ZDYuLmQzOTcyZGEgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLm9zYnAueHRleHQuZGF0YWludGVyY2hhbmdlL3NyYy9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2RhdGFpbnRlcmNoYW5nZS9qdm1tb2RlbC9EYXRhRFNMSnZtTW9kZWxJbmZlcnJlci54dGVuZAorKysgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmRhdGFpbnRlcmNoYW5nZS9zcmMvb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9kYXRhaW50ZXJjaGFuZ2UvanZtbW9kZWwvRGF0YURTTEp2bU1vZGVsSW5mZXJyZXIueHRlbmQKQEAgLTMsOSArMywxMSBAQAogICogQ29weXJpZ2h0IChjKSAyMDExLCAyMDE2IC0gTG9ldHogR21iSCZDby5LRyAoNjkxMTUgSGVpZGVsYmVyZywgR2VybWFueSkKICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAgICAgICAgICAgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgICAgICAgCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIDIuMCAgICAgICAgCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAgICAgICAgICAgICAgICAgIAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAqIGh0dHBzOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAvICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICogQ29udHJpYnV0b3JzOiAgIAogICogQ2hyaXN0b3BoZSBMb2V0eiAoTG9ldHogR21iSCZDby5LRykgLSBpbml0aWFsIGltcGxlbWVudGF0aW9uIApAQCAtMjUsNiArMjcsNyBAQAogaW1wb3J0IGphdmEubmV0LlVSTAogaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3QKIGltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcAoraW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcgogaW1wb3J0IGphdmEudXRpbC5Mb2NhbGUKIGltcG9ydCBqYXZhLnV0aWwuTWFwCiBpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuRXhlY3V0b3JTZXJ2aWNlCkBAIC0zOSw2ICs0Miw4IEBACiBpbXBvcnQgb3JnLmVjbGlwc2UuZTQudWkubW9kZWwuYXBwbGljYXRpb24uTUFwcGxpY2F0aW9uCiBpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC5jb3JlLmFwaS5wZXJzaXN0ZW5jZS5JUGVyc2lzdGVuY2VTZXJ2aWNlCiBpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC5kYXRhaW50ZXJjaGFuZ2UuYXBpLklEYXRhSW50ZXJjaGFuZ2UKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLmRzbC5zZW1hbnRpYy5jb21tb24udHlwZXMuTFJlZmVyZW5jZQoraW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAuZHNsLnNlbWFudGljLmVudGl0eS5MRW50aXR5CiBpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC5vc2dpLmh5YnJpZC5hcGkuQWJzdHJhY3RIeWJyaWRWYWFjbGlwc2VWaWV3CiBpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC5ydW50aW1lLmNvbW1vbi5ldmVudC5FdmVudERpc3BhdGNoZXJFdmVudAogaW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAucnVudGltZS5jb21tb24uZXZlbnQuSUV2ZW50RGlzcGF0Y2hlcgpAQCAtNTUsNiArNjAsNyBAQAogaW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAueHRleHQuZGF0YWludGVyY2hhbmdlLkRhdGFJbnRlcmNoYW5nZVBhY2thZ2UKIGltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmRhdGFpbnRlcmNoYW5nZS5FbnRpdHlNYW5hZ2VyTW9kZQogaW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAueHRleHQuZGF0YWludGVyY2hhbmdlLmNvbW1vbi5Xb3JrZXJUaHJlYWRSdW5uYWJsZQoraW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAueHRleHQuZGF0YWludGVyY2hhbmdlLmNvbW1vbi5Xb3JrZXJUaHJlYWRSdW5uYWJsZS5EaXJlY3Rpb24KIGltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmVudGl0eW1vY2suY29tbW9uLklFbnRpdHlJbXBvcnRJbml0aWFsaXphdGlvbkxpc3RlbmVyCiBpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5pMThuLkRTTE91dHB1dENvbmZpZ3VyYXRpb25Qcm92aWRlcgogaW1wb3J0IG9yZy5lY2xpcHNlLnh0ZXh0LmNvbW1vbi50eXBlcy5Kdm1EZWNsYXJlZFR5cGUKQEAgLTY4LDYgKzc0LDkgQEAKIGltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlRXZlbnQKIGltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlTGlzdGVuZXIKIGltcG9ydCBvcmcuc2xmNGouTG9nZ2VyCitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC5kc2wuZW50aXR5Lnh0ZXh0LmV4dGVuc2lvbnMuTW9kZWxFeHRlbnNpb25zCitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5kYXRhaW50ZXJjaGFuZ2UuRGF0YUludGVyY2hhbmdlRXhwb3J0RmlsdGVyCitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5kYXRhaW50ZXJjaGFuZ2UuRGF0YUludGVyY2hhbmdlRmlsdGVyQ29uZGl0aW9uCiAKIC8qKgogICogPHA+CkBAIC04NCw2ICs5Myw3IEBACiAJQEluamVjdCBleHRlbnNpb24gSnZtVHlwZXNCdWlsZGVyCiAJQEluamVjdCBleHRlbnNpb24gSVF1YWxpZmllZE5hbWVQcm92aWRlcgogCUBJbmplY3QgZXh0ZW5zaW9uIERhdGFEU0xNb2RlbEdlbmVyYXRvciBkZworCUBJbmplY3QgZXh0ZW5zaW9uIE1vZGVsRXh0ZW5zaW9ucwogCiAJLyogcmFtcCB1cCBOVEhSRUFEUyBhbmQgdGhyZWFkcyBhcmUgZmluaXNoZWQgc3RhcnQgbW9yZSBidXQgdXAgdG8gdGhpcyBsaW1pdCAqLwogCXZhciBOVEhSRUFEUyA9IDEwOwpAQCAtNTI3LDYgKzUzNyw5IEBACiAJCQnCq2RhdGFJbnRlcmNoYW5nZS5nZXREZWZhdWx0VmFyaWFibGVOYW1lwrsuc2V0RGF0YUludGVyY2hhbmdlKGRhdGFJbnRlcmNoYW5nZSk7CiAJCQnCq2RhdGFJbnRlcmNoYW5nZS5nZXREZWZhdWx0VmFyaWFibGVOYW1lwrsuc2V0RXZlbnREaXNwYXRjaGVyKGV2ZW50RGlzcGF0Y2hlcik7CiAJCQnCq2RhdGFJbnRlcmNoYW5nZS5nZXREZWZhdWx0VmFyaWFibGVOYW1lwrsuc2V0QmxvYlNlcnZpY2UoYmxvYlNlcnZpY2UpOworCQkJCcKraWYoZGlyZWN0aW9uLmVxdWFscyhEaXJlY3Rpb24uSU1QT1JULm5hbWUpKXsKKwkJCQknJyfCq2RhdGFJbnRlcmNoYW5nZS5nZXREZWZhdWx0VmFyaWFibGVOYW1lwrsuc2V0RGVsZXRlRmlsZUFmdGVySW1wb3J0KMKrZGF0YUludGVyY2hhbmdlLmlzRGVsZXRlRmlsZUFmdGVySW1wb3J0wrspOycnJwkJCQkKKwkJCX3CuwogICAgICAgICAnJycKICAgICB9CiAKQEAgLTYxNCw2ICs2MjcsMTYgQEAKICAgIAkJCXBhcmFtZXRlcnMgKz0gZGF0YUludGVyY2hhbmdlLnRvUGFyYW1ldGVyKCJmaWxlUGF0aCIsIF90eXBlUmVmZXJlbmNlQnVpbGRlci50eXBlUmVmKFN0cmluZykpCiAgICAJCQlib2R5ID0gWyBhcHBlbmQoJycnwqtkYXRhSW50ZXJjaGFuZ2UuZmlsZVVybMK7JycnKV0KICAgIAkJXSkKKyAgIAkJdHlwZS5tZW1iZXJzICs9IGRhdGFJbnRlcmNoYW5nZS50b01ldGhvZCgiZ2V0RmlsZVVSTCIsIF90eXBlUmVmZXJlbmNlQnVpbGRlci50eXBlUmVmKFVSTCksIFsKKyAgIAkJCWJvZHkgPSBbIGFwcGVuZCgnJyfCq2RhdGFJbnRlcmNoYW5nZS5nZXRmaWxlVXJswrsnJycpXQorICAgCQldKQorCX0KKwkKKwkvKioKKwkgKiBHaXZlIHRoZSBmaWxlVVJMIGJhY2sKKwkgKi8KKwlkZWYgZ2V0ZmlsZVVybChEYXRhSW50ZXJjaGFuZ2UgaW50ZXJjaGFuZ2UpeworCQknJydyZXR1cm4gdGhpcy5maWxlVVJMOycnJwogCX0KIAogCS8qKgpAQCAtNzYyLDYgKzc4NSw3IEBACiAJCQlyZXR1cm47CiAJCX0KIAkJdHJ5IHsKKwkJCWxvZy5pbmZvKGdldERpcmVjdGlvbigpLm5hbWUoKSsiIC0gU3RhcnQgb2YgwqtkYXRhSW50ZXJjaGFuZ2UubmFtZcK7LiIpOwogCQkJaWYoZ2V0RGlyZWN0aW9uKCk9PVdvcmtlclRocmVhZFJ1bm5hYmxlLkRpcmVjdGlvbi5JTVBPUlQpIHsKIAkJJycnCiAJCWJvZHkgPSAnJycKQEAgLTc5MSwxMSArODE1LDExIEBACiAJCQkJSW5wdXRTdHJlYW0gY29udGVudHMgPSBkYXRhSW50ZXJjaGFuZ2Uub3BlblN0cmVhbShmaWxlVVJMKTsKIAkJCQlzZXRMZW5ndGgoY29udGVudHMuYXZhaWxhYmxlKCkpOwogCQkJCXNldEF2Z0VsZW1lbnRTaXplKMKrSUYgZGF0YUludGVyY2hhbmdlLmVsZW1lbnRTaXplPT0wwrsxMMKrRUxTRcK7wqtkYXRhSW50ZXJjaGFuZ2UuZWxlbWVudFNpemXCu8KrRU5ESUbCuyk7Ci0JCQkJcmVzdWx0ID0gZGF0YUludGVyY2hhbmdlLmltcG9ydFNvdXJjZShjb250ZW50cywgIsKrZmlyc3RFbnRpdHlCZWFuLmVudGl0eS5uYW1lwrvCq0lGICFmaXJzdEVudGl0eUJlYW4ubWFya0xhdGVzdMK7TGlzdMKrRU5ESUbCuyLCq0lGIGRhdGFJbnRlcmNoYW5nZS5maWxlRW5kcG9pbnQuZW5jb2RpbmcgIT09IG51bGzCuywgIsKrZGF0YUludGVyY2hhbmdlLmZpbGVFbmRwb2ludC5lbmNvZGluZ8K7IsKrRU5ESUbCuyk7CisJCQkJcmVzdWx0ID0gZGF0YUludGVyY2hhbmdlLmltcG9ydFNvdXJjZShjb250ZW50cywgIsKrZmlyc3RFbnRpdHlCZWFuLmVudGl0eS5uYW1lwrvCq0lGICFmaXJzdEVudGl0eUJlYW4uaXNNYXJrTGF0ZXN0SW1wb3J0wrtMaXN0wqtFTkRJRsK7IsKrSUYgZGF0YUludGVyY2hhbmdlLmZpbGVFbmRwb2ludC5lbmNvZGluZyAhPT0gbnVsbMK7LCAiwqtkYXRhSW50ZXJjaGFuZ2UuZmlsZUVuZHBvaW50LmVuY29kaW5nwrsiwqtFTkRJRsK7KTsKIAkJCQlpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIGxvZy5kZWJ1ZygiZmlsdGVyaW5nIGZpbmlzaGVkIik7CiAJCScnJwogCi0JCWlmICghZmlyc3RFbnRpdHlCZWFuLm1hcmtMYXRlc3QpIHsKKwkJaWYgKCFmaXJzdEVudGl0eUJlYW4uaXNNYXJrTGF0ZXN0SW1wb3J0KSB7CiAJCQlib2R5ID0gJycnCiAJCcKrYm9kecK7CiAJCQkJaWYocmVzdWx0ICE9IG51bGwpIHsKQEAgLTg3Niw2ICs5MDAsNyBAQAogCQkJwqtib2R5wrsKIAkJCQkJaWYocmVzdWx0ICE9IG51bGwpIHsKIAkJCQkJCcKrZmlyc3RFbnRpdHlCZWFuLmVudGl0eS5mdWxseVF1YWxpZmllZE5hbWXCuyDCq2ZpcnN0RW50aXR5QmVhbi5lbnRpdHkubmFtZS50b0ZpcnN0TG93ZXLCuyA9ICjCq2ZpcnN0RW50aXR5QmVhbi5lbnRpdHkuZnVsbHlRdWFsaWZpZWROYW1lwrspIHJlc3VsdDsKKwkJCQkJCcKrZmlyc3RFbnRpdHlCZWFuLmVudGl0eS5uYW1lLnRvRmlyc3RMb3dlcsK7LnNldMKrZmlyc3RFbnRpdHlCZWFuLmxhdGVzdFByb3BlcnR5Lm5hbWUudG9GaXJzdFVwcGVywrsodHJ1ZSk7CiAJCQknJycKIAkJCWlmKGZpcnN0RW50aXR5QmVhbi5oYXNCbG9iTWFwcGluZyAmJiBkYXRhSW50ZXJjaGFuZ2UubW9kZSE9RW50aXR5TWFuYWdlck1vZGUuUkVNT1ZFKXsKIAkJCQlmb3IobWFwcGluZzpmaXJzdEVudGl0eUJlYW4ubWFwcGluZ3MpewpAQCAtOTE1LDc3ICs5NDAsOTggQEAKIAkJCQkJCWVtLmdldFRyYW5zYWN0aW9uKCkuY29tbWl0KCk7CiAJCQknJycKIAkJfQotCQlpZiAoZmlyc3RFbnRpdHlCZWFuLm1hcmtMYXRlc3QpIHsKKwkJaWYgKGZpcnN0RW50aXR5QmVhbi5pc01hcmtMYXRlc3RJbXBvcnQpIHsKIAkJCWJvZHkgPSAnJycKIAkJCcKrYm9kecK7CiAJCQkJCQlpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIGxvZy5kZWJ1ZygibWFyayByZXN1bHRzIGFzIGxhdGVzdCBpbXBvcnQiKTsKIAkJCQkJCWVtLnNldFByb3BlcnR5KFF1ZXJ5SGludHMuUEVTU0lNSVNUSUNfTE9DSywgUGVzc2ltaXN0aWNMb2NrLkxvY2spOwogCQkJCQkJZW0uZ2V0VHJhbnNhY3Rpb24oKS5iZWdpbigpOwogCQkJCQkJZW0uY3JlYXRlUXVlcnkoInVwZGF0ZSDCq2ZpcnN0RW50aXR5QmVhbi5lbnRpdHkubmFtZcK7IHNldCDCq2ZpcnN0RW50aXR5QmVhbi5sYXRlc3RQcm9wZXJ0eS5uYW1lwrsgPSAwIikuZXhlY3V0ZVVwZGF0ZSgpOwotCQkJCQkJZW0uY3JlYXRlUXVlcnkoInVwZGF0ZSDCq2ZpcnN0RW50aXR5QmVhbi5lbnRpdHkubmFtZcK7IHNldCDCq2ZpcnN0RW50aXR5QmVhbi5sYXRlc3RQcm9wZXJ0eS5uYW1lwrsgPSAxIHdoZXJlIMKrwrtpZD0gOmlkIikuc2V0UGFyYW1ldGVyKCJpZCIsIMKrZmlyc3RFbnRpdHlCZWFuLmVudGl0eS5uYW1lLnRvRmlyc3RMb3dlcsK7LmdldElkKCkpLmV4ZWN1dGVVcGRhdGUoKTsKKwkJCQkJCWVtLmNyZWF0ZVF1ZXJ5KCJ1cGRhdGUgwqtmaXJzdEVudGl0eUJlYW4uZW50aXR5Lm5hbWXCuyBzZXQgwqtmaXJzdEVudGl0eUJlYW4ubGF0ZXN0UHJvcGVydHkubmFtZcK7ID0gMSB3aGVyZSBpZD0gOmlkIikuc2V0UGFyYW1ldGVyKCJpZCIsIMKrZmlyc3RFbnRpdHlCZWFuLmVudGl0eS5uYW1lLnRvRmlyc3RMb3dlcsK7LmdldElkKCkpLmV4ZWN1dGVVcGRhdGUoKTsKIAkJCQkJCWlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgbG9nLmRlYnVnKCJjb21taXR0aW5nIG1hcmsiKTsKIAkJCQkJCWVtLmdldFRyYW5zYWN0aW9uKCkuY29tbWl0KCk7CQkJCiAJCQknJycKIAkJfQkJCi0JCWZvciAocGF0aDpkYXRhSW50ZXJjaGFuZ2UucGF0aCkgewotCQkJdmFyIGVudGl0eSA9IHBhdGguZW50aXR5Ci0JCQlib2R5ID0gJycnCi0JCQnCq2JvZHnCuwotCQkJCQkJaWYoZ2V0RXZlbnREaXNwYXRjaGVyKCkgIT0gbnVsbCkgewotCQkJCQkJCUV2ZW50RGlzcGF0Y2hlckV2ZW50IMKrZW50aXR5Lm5hbWUudG9Mb3dlckNhc2XCu0V2ZW50ID0gbmV3IEV2ZW50RGlzcGF0Y2hlckV2ZW50KEV2ZW50RGlzcGF0Y2hlckNvbW1hbmQuUkVGUkVTSCwgIsKrZW50aXR5LmZ1bGx5UXVhbGlmaWVkTmFtZcK7IiwgIsKrZGF0YUludGVyY2hhbmdlLmZ1bGx5UXVhbGlmaWVkTmFtZcK7Iik7Ci0JCQkJCQkJZ2V0RXZlbnREaXNwYXRjaGVyKCkuc2VuZEV2ZW50KMKrZW50aXR5Lm5hbWUudG9Mb3dlckNhc2XCu0V2ZW50KTsKLQkJCQkJCX0KLQkJCScnJwotCQl9CiAJCWJvZHkgPSAnJycKIAkJwqtib2R5wrsKIAkJCQkJaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSBsb2cuZGVidWcoInJlc3VsdHMgcGVyc2lzdGVkIik7CiAJCQkJfSBlbHNlIHsKIAkJCQkJaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSBsb2cuZGVidWcoIm5vIHJlc3VsdHMgZm91bmQiKTsKIAkJCQl9CisJCQkJaWYoaXNEZWxldGVGaWxlQWZ0ZXJJbXBvcnQoKSl7CisJCQkJCWRlbGV0ZUZpbGUoUGF0aHMuZ2V0KGdldEZpbGVVUkwoKS5nZXRQYXRoKCkuc3Vic3RyaW5nKDEpKSk7IC8vIGludGVyY2hhbmdlIGZpbGUKKwkJCQl9CiAJCScnJwotCQl2YXIgcm9vdCA9IGRhdGFJbnRlcmNoYW5nZS5wYXRoLmZpbmRGaXJzdFtpdHwhaXQubWFya0xhdGVzdF0KKworCQl2YXIgcm9vdCA9IGRhdGFJbnRlcmNoYW5nZS5wYXRoLmZpbmRGaXJzdFshaXQuaXNNYXJrTGF0ZXN0SW1wb3J0XQogCQlpZihyb290ICE9PSBudWxsKSB7CiAJCQlib2R5ID0gJycnCiAJCQnCq2JvZHnCuwogCQkJCX0gZWxzZSB7CiAJCQkJCWlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgbG9nLmRlYnVnKCJwcmVwYXJlIGV4cG9ydCIpOwogCQkJCQlDcml0ZXJpYUJ1aWxkZXIgY3JpdGVyaWFCdWlsZGVyID0gZW0uZ2V0Q3JpdGVyaWFCdWlsZGVyKCk7Ci0JCQkJCSAKLQkJCQkJaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSBsb2cuZGVidWcoImV2YWx1YXRlIHJvb3QgZW50aXR5IGNvdW50Iik7CiAJCQkJCUNyaXRlcmlhUXVlcnk8TG9uZz4gY291bnRRdWVyeSA9IGNyaXRlcmlhQnVpbGRlci5jcmVhdGVRdWVyeShMb25nLmNsYXNzKTsKLQkJCQkJY291bnRRdWVyeS5zZWxlY3QoY3JpdGVyaWFCdWlsZGVyLmNvdW50KGNvdW50UXVlcnkuZnJvbSjCq3Jvb3QuZW50aXR5LmZ1bGx5UXVhbGlmaWVkTmFtZcK7LmNsYXNzKSkpOworCQkJCQlSb290PMKrcm9vdC5lbnRpdHkuZnVsbHlRdWFsaWZpZWROYW1lwrs+IGZyID0gY291bnRRdWVyeS5mcm9tKMKrcm9vdC5lbnRpdHkuZnVsbHlRdWFsaWZpZWROYW1lwrsuY2xhc3MpOworCQkJCQljb3VudFF1ZXJ5wqtJRiByb290LmV4cG9ydEZpbHRlciAhPT0gbnVsbMK7wqtyb290LmV4cG9ydEZpbHRlci5idWlsZEV4cG9ydEZpbHRlcldoZXJlQ2xhdXNlKCJmciIpwrvCq0VORElGwrsuc2VsZWN0KGNyaXRlcmlhQnVpbGRlci5jb3VudChmcikpOwogCQkJCQlMb25nIGNvdW50ID0gZW0uY3JlYXRlUXVlcnkoY291bnRRdWVyeSkuZ2V0U2luZ2xlUmVzdWx0KCk7Ci0JCQkJCWlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgbG9nLmRlYnVnKCJyb290IGVudGl0eSBjb3VudCBpcyAiK2NvdW50LnRvU3RyaW5nKCkpOwotCQkJCQlzZXRMZW5ndGgoY291bnQqwqtJRiBkYXRhSW50ZXJjaGFuZ2UuZWxlbWVudFNpemU9PTDCuzEwwqtFTFNFwrvCq2RhdGFJbnRlcmNoYW5nZS5lbGVtZW50U2l6ZcK7wqtFTkRJRsK7KTsKLQkJCQkJc2V0QXZnRWxlbWVudFNpemUoMSk7Ci0JCQkJCQogCQkJCQlDcml0ZXJpYVF1ZXJ5PMKrcm9vdC5lbnRpdHkuZnVsbHlRdWFsaWZpZWROYW1lwrs+IGNyaXRlcmlhUXVlcnkgPSBjcml0ZXJpYUJ1aWxkZXIuY3JlYXRlUXVlcnkowqtyb290LmVudGl0eS5mdWxseVF1YWxpZmllZE5hbWXCuy5jbGFzcyk7CiAJCQkJCVJvb3Q8wqtyb290LmVudGl0eS5mdWxseVF1YWxpZmllZE5hbWXCuz4gZnJvbSA9IGNyaXRlcmlhUXVlcnkuZnJvbSjCq3Jvb3QuZW50aXR5LmZ1bGx5UXVhbGlmaWVkTmFtZcK7LmNsYXNzKTsKKwkJCQkJwqtkYXRhSW50ZXJjaGFuZ2UuYnVpbGRKb2luc8K7CiAJCQkJCUNyaXRlcmlhUXVlcnk8wqtyb290LmVudGl0eS5mdWxseVF1YWxpZmllZE5hbWXCuz4gc2VsZWN0ID0gY3JpdGVyaWFRdWVyeS5tdWx0aXNlbGVjdChmcm9tKTsKLQkJCQkJIAorCQkJCQnCq0lGIHJvb3QuZXhwb3J0RmlsdGVyICE9PSBudWxswrsKKwkJCQkJc2VsZWN0wqtyb290LmV4cG9ydEZpbHRlci5idWlsZEV4cG9ydEZpbHRlcldoZXJlQ2xhdXNlKCJmcm9tIinCuzsKKwkJCQkJwqtFTkRJRsK7CiAJCQkJCVR5cGVkUXVlcnk8wqtyb290LmVudGl0eS5mdWxseVF1YWxpZmllZE5hbWXCuz4gdHlwZWRRdWVyeSA9IGVtLmNyZWF0ZVF1ZXJ5KHNlbGVjdCk7CiAJCQkJCXNldFByb2dyZXNzSW5kZXRlcm1pbmF0ZWQoZmFsc2UpOwogCQkJCQlMaXN0PMKrcm9vdC5lbnRpdHkuZnVsbHlRdWFsaWZpZWROYW1lwrs+IGFsbFJlc3VsdHMgPSB0eXBlZFF1ZXJ5LmdldFJlc3VsdExpc3QoKTsKKwkJCQkJaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSBsb2cuZGVidWcoImV2YWx1YXRlIHJvb3QgZW50aXR5IGNvdW50Iik7CisJCQkJCXNldExlbmd0aChjb3VudCrCq0lGIGRhdGFJbnRlcmNoYW5nZS5lbGVtZW50U2l6ZT09MMK7MTDCq0VMU0XCu8KrZGF0YUludGVyY2hhbmdlLmVsZW1lbnRTaXplwrvCq0VORElGwrspOworCQkJCQlzZXRBdmdFbGVtZW50U2l6ZSgxKTsKKwkJCQkJaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSBsb2cuZGVidWcoInJvb3QgZW50aXR5IGNvdW50IGlzICIrY291bnQudG9TdHJpbmcoKSk7CiAJCQkJCVN0cmluZ1dyaXRlciB3cml0ZXIgPSBuZXcgU3RyaW5nV3JpdGVyKCk7CiAJCQkJCWlmKGRhdGFJbnRlcmNoYW5nZSAhPSBudWxsKSB7CiAJCQkJCQlkYXRhSW50ZXJjaGFuZ2UuZXhwb3J0U291cmNlKGFsbFJlc3VsdHMsIHdyaXRlcik7CiAJCQkJCX0KIAkJCQkJb3V0LndyaXRlKHdyaXRlci50b1N0cmluZygpLmdldEJ5dGVzKMKrSUYgZGF0YUludGVyY2hhbmdlLmZpbGVFbmRwb2ludC5lbmNvZGluZyAhPT0gbnVsbMK7IsKrZGF0YUludGVyY2hhbmdlLmZpbGVFbmRwb2ludC5lbmNvZGluZ8K7IsKrRU5ESUbCuykpOworCQkJCQnCq0lGIGZpcnN0RW50aXR5QmVhbi5tYXJrTGF0ZXN0RXhwb3J0wrsKKwkJCQkJaWYoYWxsUmVzdWx0cyAhPSBudWxsICYmICFhbGxSZXN1bHRzLmlzRW1wdHkoKSl7IAorCQkJCQkJQ3JpdGVyaWFRdWVyeSBjcSA9IGNyaXRlcmlhQnVpbGRlci5jcmVhdGVRdWVyeSgpOworCQkJCQkJUm9vdDzCq3Jvb3QuZW50aXR5LmZ1bGx5UXVhbGlmaWVkTmFtZcK7PiBmcjEgPSBjcS5mcm9tKMKrcm9vdC5lbnRpdHkuZnVsbHlRdWFsaWZpZWROYW1lwrsuY2xhc3MpOworCQkJCQkJTGlzdDxTdHJpbmc+IGlkcyA9IGVtLmNyZWF0ZVF1ZXJ5KGNxLnNlbGVjdChmcjEuZ2V0KCLCq3Jvb3QuZW50aXR5LmlkQXR0cmlidXRlTmFtZcK7IikpwqtJRiByb290LmV4cG9ydEZpbHRlciAhPT0gbnVsbMK7wqtyb290LmV4cG9ydEZpbHRlci5idWlsZEV4cG9ydEZpbHRlcldoZXJlQ2xhdXNlKCJmcjEiKcK7wqtFTkRJRsK7KS5nZXRSZXN1bHRMaXN0KCk7CisJCQkJCQlpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIGxvZy5kZWJ1ZygibWFyayByZXN1bHRzIGFzIGxhdGVzdCBleHBvcnQiKTsKKwkJCQkJCWVtLnNldFByb3BlcnR5KFF1ZXJ5SGludHMuUEVTU0lNSVNUSUNfTE9DSywgUGVzc2ltaXN0aWNMb2NrLkxvY2spOworCQkJCQkJZW0uZ2V0VHJhbnNhY3Rpb24oKS5iZWdpbigpOwkKKwkJCQkJCWVtLmNyZWF0ZVF1ZXJ5KCJ1cGRhdGUgwqtmaXJzdEVudGl0eUJlYW4uZW50aXR5Lm5hbWXCuyBzZXQgwqtmaXJzdEVudGl0eUJlYW4ubGF0ZXN0RXhwUHJvcGVydHkubmFtZcK7ID0gMSB3aGVyZSDCq3Jvb3QuZW50aXR5LmlkQXR0cmlidXRlTmFtZcK7IGluIDppZHMiKS5zZXRQYXJhbWV0ZXIoImlkcyIsIGlkcykuZXhlY3V0ZVVwZGF0ZSgpOworCQkJCQkJaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSBsb2cuZGVidWcoImNvbW1pdHRpbmcgbWFyayBleHBvcnQiKTsKKwkJCQkJCWVtLmdldFRyYW5zYWN0aW9uKCkuY29tbWl0KCk7CisJCQkJCX0KKwkJCQkJwqtFTkRJRsK7CiAJCQkJCWlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgbG9nLmRlYnVnKCJleHBvcnQgZmluaXNoZWQiKTsKIAkJCQl9CisJCQkJbG9nLmluZm8oZ2V0RGlyZWN0aW9uKCkubmFtZSgpKyIgb2YgwqtkYXRhSW50ZXJjaGFuZ2UubmFtZcK7IHN1Y2Nlc3NmdWxseSBlbmRlZCEiKTsKIAkJCScnJwogCQl9IGVsc2UgewogCQkJYm9keSA9ICcnJwogCQkJwqtib2R5wrsKIAkJCQl9JycnCiAJCX0KKwkJZm9yIChwYXRoOmRhdGFJbnRlcmNoYW5nZS5wYXRoKSB7CisJCQl2YXIgZW50aXR5ID0gcGF0aC5lbnRpdHkKKwkJCWJvZHkgPSAnJycKKwkJCcKrYm9kecK7CisJCQkJaWYoZ2V0RXZlbnREaXNwYXRjaGVyKCkgIT0gbnVsbCkgeworCQkJCQlFdmVudERpc3BhdGNoZXJFdmVudCDCq2VudGl0eS5uYW1lLnRvTG93ZXJDYXNlwrtFdmVudCA9IG5ldyBFdmVudERpc3BhdGNoZXJFdmVudChFdmVudERpc3BhdGNoZXJDb21tYW5kLlJFRlJFU0gsICLCq2VudGl0eS5mdWxseVF1YWxpZmllZE5hbWXCuyIsICLCq2RhdGFJbnRlcmNoYW5nZS5mdWxseVF1YWxpZmllZE5hbWXCuyIpOworCQkJCQlnZXRFdmVudERpc3BhdGNoZXIoKS5zZW5kRXZlbnQowqtlbnRpdHkubmFtZS50b0xvd2VyQ2FzZcK7RXZlbnQpOworCQkJCX0KKwkJCScnJworCQl9CiAJCWJvZHkgPSAnJycKIAkJwqtib2R5wrsKLQkJfSBjYXRjaCAoRGF0YUludGVyY2hhbmdlRXhjZXB0aW9uIHwgSU9FeGNlcHRpb24gZSkgeworCQl9IGNhdGNoIChEYXRhSW50ZXJjaGFuZ2VFeGNlcHRpb24gfCBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gfCBJT0V4Y2VwdGlvbiBlKSB7CiAJCQlTdHJpbmdXcml0ZXIgc3cgPSBuZXcgU3RyaW5nV3JpdGVyKCk7CiAJCQllLnByaW50U3RhY2tUcmFjZShuZXcgUHJpbnRXcml0ZXIoc3cpKTsKLQkJCWxvZy5lcnJvcigiwqtkYXRhSW50ZXJjaGFuZ2UubmFtZcK7Ont9Iiwgc3cudG9TdHJpbmcoKSk7CisJCQlsb2cuZXJyb3IoZ2V0RGlyZWN0aW9uKCkubmFtZSgpKyIgRXhlY3V0aW9uIG9mIMKrZGF0YUludGVyY2hhbmdlLm5hbWXCuzogZmFpbGVkIGR1ZSB0bzoge30iLCBzdy50b1N0cmluZygpKTsKKwkJCXNldEV4ZWN1dGlvbkZhaWxlZCh0cnVlKTsKIAkJfSBmaW5hbGx5IHsKIAkJCWlmKGZpbGUgIT0gbnVsbCkgewogCQkJCXRyeSB7CkBAIC0xMDYzLDQgKzExMDksMTA2IEBACiAJCXJldHVybiBib2R5CiAJfQogCQorCisJZGVmIFN0cmluZyBidWlsZEV4cG9ydEZpbHRlcldoZXJlQ2xhdXNlKERhdGFJbnRlcmNoYW5nZUV4cG9ydEZpbHRlciBleGNsdWRlcywgU3RyaW5nIHJvb3RuYW1lKXsKKwkJdmFyIGJvZHkgPSAiIgorCQlpZihleGNsdWRlcyE9PW51bGwpeworCQkJdmFyIHdoZXJlID0gZXhjbHVkZXMuZ2V0Q29uZGl0aW9uLmJ1aWxkU3ViQ29uZGl0aW9uKHJvb3RuYW1lKQorCQkJaWYod2hlcmUgIT09IG51bGwgJiYgIXdoZXJlLmVtcHR5KXsKKwkJCQlib2R5ID0gJycnLndoZXJlKMKrd2hlcmXCuyknJycKKwkJCX0KKwkJfQorCQlyZXR1cm4gYm9keQorCX0KKwkKKwlkZWYgU3RyaW5nIGJ1aWxkU3ViQ29uZGl0aW9uKERhdGFJbnRlcmNoYW5nZUZpbHRlckNvbmRpdGlvbiBjb25kaXRpb24sIFN0cmluZyByb290bmFtZSl7CisJCXZhciBwYXJ0MSA9ICIiCisJCQorCQlpZihjb25kaXRpb24gIT09IG51bGwgJiYgY29uZGl0aW9uLmdldE9wZXJhdG9yICE9PSBudWxsKXsKKwkJCXN3aXRjaChjb25kaXRpb24uZ2V0T3BlcmF0b3IpeworCQkJCWNhc2UgSVNOT1ROVUxMOiAJCisJCQkJCXBhcnQxID0gJycnwqtyb290bmFtZcK7LmdldCgiwqtjb25kaXRpb24uZ2V0UmVmUHJvcGVydHkubmFtZcK7IikuaXNOb3ROdWxsKCknJycgIAorCQkJCWNhc2UgSVNOVUxMOiAJCQorCQkJCQlwYXJ0MSA9ICcnJ8Krcm9vdG5hbWXCuy5nZXQoIsKrY29uZGl0aW9uLmdldFJlZlByb3BlcnR5Lm5hbWXCuyIpLmlzTnVsbCgpJycnCisJCQkJY2FzZSBFUVVBTFM6IAkJCisJCQkJCWlmKGNvbmRpdGlvbi5nZXRWYWx1ZSAhPT0gbnVsbCAmJiAhY29uZGl0aW9uLmdldFZhbHVlLmVtcHR5KXsKKwkJCQkJCXBhcnQxID0gJycnY3JpdGVyaWFCdWlsZGVyLmVxdWFsKMKrcm9vdG5hbWXCuy5nZXQoIsKrY29uZGl0aW9uLmdldFJlZlByb3BlcnR5Lm5hbWXCuyIpLCAiwqtjb25kaXRpb24uZ2V0VmFsdWXCuyIpJycnCisJCQkJCX0KKwkJCQkJZWxzZXsgcGFydDEgPSBudWxsfQorCQkJCWNhc2UgTk9URVFVQUxTOgkJCisJCQkJCWlmKGNvbmRpdGlvbi5nZXRWYWx1ZSAhPT0gbnVsbCAmJiAhY29uZGl0aW9uLmdldFZhbHVlLmVtcHR5KXsKKwkJCQkJCXBhcnQxID0gJycnY3JpdGVyaWFCdWlsZGVyLm5vdEVxdWFsKMKrcm9vdG5hbWXCuy5nZXQoIsKrY29uZGl0aW9uLmdldFJlZlByb3BlcnR5Lm5hbWXCuyIpLCAiwqtjb25kaXRpb24uZ2V0VmFsdWXCuyIpJycnCisJCQkJCX0KKwkJCQkJZWxzZXsgcGFydDEgPSBudWxsfQorCQkJCWNhc2UgR1JFQVRFUlRIRU46IAkKKwkJCQkJaWYoY29uZGl0aW9uLmdldFZhbHVlICE9PSBudWxsICYmICFjb25kaXRpb24uZ2V0VmFsdWUuZW1wdHkpeworCQkJCQkJcGFydDEgPSAnJydjcml0ZXJpYUJ1aWxkZXIuZ3JlYXRlclRoYW4owqtyb290bmFtZcK7LmdldCgiwqtjb25kaXRpb24uZ2V0UmVmUHJvcGVydHkubmFtZcK7IiksICLCq2NvbmRpdGlvbi5nZXRWYWx1ZcK7IiknJycKKwkJCQkJfQorCQkJCQllbHNleyBwYXJ0MSA9IG51bGx9CisJCQkJY2FzZSBHUkVBVEVSVEhFTk9SRVFVQUxUTzogCisJCQkJCWlmKGNvbmRpdGlvbi5nZXRWYWx1ZSAhPT0gbnVsbCAmJiAhY29uZGl0aW9uLmdldFZhbHVlLmVtcHR5KXsKKwkJCQkJCXBhcnQxID0gJycnY3JpdGVyaWFCdWlsZGVyLmdyZWF0ZXJUaGFuT3JFcXVhbFRvKMKrcm9vdG5hbWXCuy5nZXQoIsKrY29uZGl0aW9uLmdldFJlZlByb3BlcnR5Lm5hbWXCuyIpLCAiwqtjb25kaXRpb24uZ2V0VmFsdWXCuyIpJycnCisJCQkJCX0KKwkJCQkJZWxzZXsgcGFydDEgPSBudWxsfQorCQkJCWNhc2UgTEVTU1RIRU46IAkKKwkJCQkJaWYoY29uZGl0aW9uLmdldFZhbHVlICE9PSBudWxsICYmICFjb25kaXRpb24uZ2V0VmFsdWUuZW1wdHkpeworCQkJCQkJcGFydDEgPSAnJydjcml0ZXJpYUJ1aWxkZXIubGVzc1RoYW4owqtyb290bmFtZcK7LmdldCgiwqtjb25kaXRpb24uZ2V0UmVmUHJvcGVydHkubmFtZcK7IiksICLCq2NvbmRpdGlvbi5nZXRWYWx1ZcK7IiknJycKKwkJCQkJfQorCQkJCQllbHNleyBwYXJ0MSA9IG51bGx9CisJCQkJY2FzZSBMRVNTVEhFTk9SRVFVQUxUTzogCisJCQkJCWlmKGNvbmRpdGlvbi5nZXRWYWx1ZSAhPT0gbnVsbCAmJiAhY29uZGl0aW9uLmdldFZhbHVlLmVtcHR5KXsKKwkJCQkJCXBhcnQxID0gJycnY3JpdGVyaWFCdWlsZGVyLmxlc3NUaGFuT3JFcXVhbFRvKMKrcm9vdG5hbWXCuy5nZXQoIsKrY29uZGl0aW9uLmdldFJlZlByb3BlcnR5Lm5hbWXCuyIpLCAiwqtjb25kaXRpb24uZ2V0VmFsdWXCuyIpJycnCisJCQkJCX0KKwkJCQkJZWxzZXsgcGFydDEgPSBudWxsfQorCQkJCWRlZmF1bHQ6IHsgcGFydDEgPSBudWxsIH0KKwkJCX0KKwkJCQorCQkJaWYocGFydDEgIT09IG51bGwgJiYgY29uZGl0aW9uLmdldE9wZXJhdG9yMiAhPT0gbnVsbCAmJiBjb25kaXRpb24uZ2V0U3ViY29uZGl0aW9uICE9PSBudWxsICl7CisJCQkJc3dpdGNoKGNvbmRpdGlvbi5nZXRPcGVyYXRvcjIpeworCQkJCQljYXNlIEFORDogcmV0dXJuICcnJ2NyaXRlcmlhQnVpbGRlci5hbmQowqtwYXJ0McK7ICwgwqtjb25kaXRpb24uZ2V0U3ViY29uZGl0aW9uLmJ1aWxkU3ViQ29uZGl0aW9uKHJvb3RuYW1lKcK7ICknJycKKwkJCQkJY2FzZSBPUiA6IHJldHVybiAnJydjcml0ZXJpYUJ1aWxkZXIub3Iowqtjb25kaXRpb24uZ2V0U3ViY29uZGl0aW9uLmJ1aWxkU3ViQ29uZGl0aW9uKHJvb3RuYW1lKcK7ICwgwqtwYXJ0McK7KScnJworCQkJCQlkZWZhdWx0OiB7cmV0dXJuIHBhcnQxIH0KKwkJCQl9CisJCQl9CisJCX0KKwkJcmV0dXJuIHBhcnQxCisJCQorCX0KKworCS8qKgorCSAqIGJ1aWxkIGEgZ3JhcGggZm9yIGFsbCBlbnRpdGllcyBpbiBwYXRoIAorCSAqLworCWRlZiBidWlsZEpvaW5zKERhdGFJbnRlcmNoYW5nZSBpbnRlcmNoYW5nZSkgeworCQl2YWwgam9pbkdyYXBoID0gbmV3IEpvaW5HcmFwaDxMRW50aXR5PgorCQkvLyBhZGQgYWxsIGVudGl0aWVzIGFzIG5vZGVzIHRoYXQgYXJlIG5vdCBpbmRpY2F0b3JzIGZvciBsYXN0IGltcG9ydGVkCisJCWludGVyY2hhbmdlLnBhdGguZmlsdGVyWyFpdC5pc01hcmtMYXRlc3RJbXBvcnRdLmZvckVhY2hbam9pbkdyYXBoLmFkZE5vZGUoaXQuZW50aXR5KV0KKwkJLy8gYWRkIGFsbCBwb3NzaWJsZSBvbmVUb01hbnkgcmVsYXRpb25zIGJldHdlZW4gdGhlIGdpdmVuIGVudGl0aWVzCisJCWludGVyY2hhbmdlLnBhdGguZmlsdGVyWyFpdC5pc01hcmtMYXRlc3RJbXBvcnRdLmZvckVhY2hbCisJCQl2YWwgc291cmNlID0gaXQuZW50aXR5CisJCQkvLyBkbyBub3QgdGVzdCByZWxhdGlvbnMgd2l0aCBpdHNlbGYKKwkJCWludGVyY2hhbmdlLnBhdGguZmlsdGVyWyFpdC5lbnRpdHkuZXF1YWxzKHNvdXJjZSldLmZvckVhY2hbCisJCQkJdmFsIGRlc3QgPSBpdC5lbnRpdHkKKwkJCQkvLyBnZXQgb25seSByZWZlcmVuY2VzIG9mIHR5cGUgb25lVG9NYW55IHdoZXJlIHNvdXJjZSBhbmQgZGVzdGluYXRpb24gbWF0Y2gKKwkJCQlzb3VyY2UuZmVhdHVyZXMuZmlsdGVyWworCQkJCQlyZWZ8cmVmIGluc3RhbmNlb2YgTFJlZmVyZW5jZSAmJiByZWYudG9NYW55ICYmIHJlZi50eXBlIGluc3RhbmNlb2YgTEVudGl0eSAmJiByZWYudHlwZS50b05hbWUuZXF1YWxzKGRlc3QudG9OYW1lKQorCQkJCV0uZm9yRWFjaFtyZWZ8CisJCQkJCS8vIGFkZCB0aGUgam9pbiB3aXRoIG5hbWUgdGhhdCB3YXMgZm91bmQKKwkJCQkJam9pbkdyYXBoLmFkZEpvaW4oc291cmNlLCBkZXN0LCByZWYubmFtZSkKKwkJCQldCisJCQldCisJCV0KKwkJLy8gY2FsY3VsYXRlIGFsbCBwb3NzaWJsZSBwYXRocyBvZiB0aGUgZ2l2ZW4gcGF0aAorCQl2YXIgam9pbk1hbmFnZXIgPSBuZXcgTWFuYWdlSm9pbnM8TEVudGl0eT4oam9pbkdyYXBoKTsKKwkJdmFyIGpvaW5zID0gam9pbk1hbmFnZXIuZ2V0QWxsSm9pbnMoaW50ZXJjaGFuZ2UucGF0aC5maW5kRmlyc3RbIWl0LmlzTWFya0xhdGVzdEltcG9ydF0uZW50aXR5KQorCQkvLyBjcmVhdGUgam9pbiBjb21tYW5kcyBmb3IgY3JpdGVyYWJ1aWxkZXIgaWYgcGF0aCBub3QgZW1wdHkgICAKKwkJdmFsIG91dHB1dCA9IG5ldyBTdHJpbmdCdWlsZGVyCisJCWpvaW5zLmZpbHRlclshaXQuZW1wdHldLmZvckVhY2hbcGF0aHwKKwkJCW91dHB1dC5hcHBlbmQoImZyb20iKQorCQkJcGF0aC5mb3JFYWNoW2pvaW58CisJCQkJb3V0cHV0LmFwcGVuZCgnJycuZmV0Y2goIsKram9pbsK7IiwgSm9pblR5cGUuTEVGVCknJycpCisJCQldCisJCQlvdXRwdXQuYXBwZW5kKCI7XG4iKQorCQldCisJCXJldHVybiBvdXRwdXQudG9TdHJpbmcKKwl9CiB9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmRhdGFpbnRlcmNoYW5nZS9zcmMvb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9kYXRhaW50ZXJjaGFuZ2UvanZtbW9kZWwvRGF0YURTTE1vZGVsR2VuZXJhdG9yLnh0ZW5kIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5kYXRhaW50ZXJjaGFuZ2Uvc3JjL29yZy9lY2xpcHNlL29zYnAveHRleHQvZGF0YWludGVyY2hhbmdlL2p2bW1vZGVsL0RhdGFEU0xNb2RlbEdlbmVyYXRvci54dGVuZAppbmRleCAwZTJiMzE0Li5kODUzMWI5IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmRhdGFpbnRlcmNoYW5nZS9zcmMvb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9kYXRhaW50ZXJjaGFuZ2UvanZtbW9kZWwvRGF0YURTTE1vZGVsR2VuZXJhdG9yLnh0ZW5kCisrKyBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQuZGF0YWludGVyY2hhbmdlL3NyYy9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2RhdGFpbnRlcmNoYW5nZS9qdm1tb2RlbC9EYXRhRFNMTW9kZWxHZW5lcmF0b3IueHRlbmQKQEAgLTMsOSArMywxMSBAQAogICogQ29weXJpZ2h0IChjKSAyMDExLCAyMDE2IC0gTG9ldHogR21iSCZDby5LRyAoNjkxMTUgSGVpZGVsYmVyZywgR2VybWFueSkKICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAgICAgICAgICAgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgICAgICAgCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIDIuMCAgICAgICAgCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAgICAgICAgICAgICAgICAgIAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAqIGh0dHBzOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAvICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICogQ29udHJpYnV0b3JzOiAgIAogICogQ2hyaXN0b3BoZSBMb2V0eiAoTG9ldHogR21iSCZDby5LRykgLSBpbml0aWFsIGltcGxlbWVudGF0aW9uIApAQCAtNDgsNyArNTAsOSBAQAogaW1wb3J0IGphdmEubmlvLmZpbGUuUGF0aHMKIGltcG9ydCBqYXZhLm5pby5maWxlLlN0YW5kYXJkT3Blbk9wdGlvbgogaW1wb3J0IGphdmEudGV4dC5NZXNzYWdlRm9ybWF0CitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdAogaW1wb3J0IGphdmEudXRpbC5BcnJheXMKK2ltcG9ydCBqYXZhLnV0aWwuRGF0ZQogaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwCiBpbXBvcnQgamF2YS51dGlsLkxpc3QKIGltcG9ydCBqYXZhLnV0aWwuTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uCkBAIC04OCw2ICs5Miw3IEBACiBpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC5kYXRhaW50ZXJjaGFuZ2UuYXBpLklEYXRhSW50ZXJjaGFuZ2UKIGltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLmRzbC5lbnRpdHkueHRleHQuZXh0ZW5zaW9ucy5FbnRpdHlUeXBlc0J1aWxkZXIKIGltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLmRzbC5lbnRpdHkueHRleHQuZXh0ZW5zaW9ucy5Nb2RlbEV4dGVuc2lvbnMKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLmRzbC5zZW1hbnRpYy5jb21tb24udHlwZXMuTEFubm90YXRpb25UYXJnZXQKIGltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLmRzbC5zZW1hbnRpYy5jb21tb24udHlwZXMuTEF0dHJpYnV0ZQogaW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAuZHNsLnNlbWFudGljLmNvbW1vbi50eXBlcy5MRGF0YVR5cGUKIGltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLmRzbC5zZW1hbnRpYy5jb21tb24udHlwZXMuTEZlYXR1cmUKQEAgLTEyNiw3ICsxMzEsNiBAQAogaW1wb3J0IG9yZy5lY2xpcHNlLnBlcnNpc3RlbmNlLmNvbmZpZy5QZXJzaXN0ZW5jZVVuaXRQcm9wZXJ0aWVzCiBpbXBvcnQgb3JnLmVjbGlwc2UucGVyc2lzdGVuY2UuY29uZmlnLlBlc3NpbWlzdGljTG9jawogaW1wb3J0IG9yZy5lY2xpcHNlLnBlcnNpc3RlbmNlLmNvbmZpZy5RdWVyeUhpbnRzCi1pbXBvcnQgb3JnLmVjbGlwc2UueHRleHQuY29tbW9uLnR5cGVzLkp2bUVudW1lcmF0aW9uTGl0ZXJhbAogaW1wb3J0IG9yZy5lY2xpcHNlLnh0ZXh0LmdlbmVyYXRvci5JRmlsZVN5c3RlbUFjY2VzcwogaW1wb3J0IG9yZy5lY2xpcHNlLnh0ZXh0LmdlbmVyYXRvci5JT3V0cHV0Q29uZmlndXJhdGlvblByb3ZpZGVyCiBpbXBvcnQgb3JnLmVjbGlwc2UueHRleHQubmFtaW5nLklRdWFsaWZpZWROYW1lUHJvdmlkZXIKQEAgLTE0NCw4ICsxNDgsOCBAQAogaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50CiBpbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudAogaW1wb3J0IG9yZy54bWwuc2F4LlNBWEV4Y2VwdGlvbgotaW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAuZHNsLnNlbWFudGljLmNvbW1vbi50eXBlcy5MRW51bUxpdGVyYWwKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLmRzbC5zZW1hbnRpYy5jb21tb24udHlwZXMuTEVudW0KK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmRhdGFpbnRlcmNoYW5nZS5EYXRhSW50ZXJjaGFuZ2VFeHBvcnRIaWRlCitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5kYXRhaW50ZXJjaGFuZ2UuRGF0YUludGVyY2hhbmdlRXhwb3J0RmlsdGVyCiAKIGNsYXNzIFBhcmFtZXRlclZhbHVlIHsKIAl2YXIgcHVibGljIEhhc2hNYXA8U3RyaW5nLFN0cmluZz4gbW9kaWZpZXJzID0gPFN0cmluZyxTdHJpbmc+bmV3SGFzaE1hcCgpIApAQCAtNjM4LDcgKzY0MiwxMSBAQAogCQlwYXJhbS50ZXh0Q29udGVudCA9IHBhcmFtTmFtZQogCQlkYW9WYWx1ZS5hdHRyaWJ1dGVOb2RlID0gcGFyYW0KIAkJdmFyIGRlY29kZXIgPSBkb2MuY3JlYXRlQXR0cmlidXRlKCJkZWNvZGVyIikKLQkJZGVjb2Rlci50ZXh0Q29udGVudCA9IHBhcmFtVmFsdWUKKwkJdmFyIHBhcmFtQ29udGVudCA9IHBhcmFtVmFsdWUKKwkJaWYocGFyYW1WYWx1ZS5lcXVhbHNJZ25vcmVDYXNlKCJpbnQiKSl7CisJCQlwYXJhbUNvbnRlbnQgPSAiSW50ZWdlciIKKwkJfQorCQlkZWNvZGVyLnRleHRDb250ZW50ID0gcGFyYW1Db250ZW50CiAJCWRhb1ZhbHVlLmF0dHJpYnV0ZU5vZGUgPSBkZWNvZGVyCiAJCS8vIG1hcHBpbmcgZ2l2ZW4/CiAJCWlmKGRhdGFNYXAgIT09IG51bGwpIHsKQEAgLTY2MCwxMyArNjY4LDE0IEBACiAJCXZhciBFbGVtZW50IG9sZFBhcmVudCA9IG51bGwKIAkJdmFyIHZlY3RvciA9ICJ2ZWN0b3IiCiAJCXZhciBkZXB0aCA9IDAKKwkJdmFyIExFbnRpdHkgcHJldmlvdXNFbnRpdHkgPSBudWxsCiAJCS8vIGl0ZXJhdGUgdGhyb3VnaCBhbGwgcGF0aCAoYmVhbikgbGlzdGVkIHVuZGVyIGBwYXRoYCBrZXl3b3JkIAogCQlmb3IocGF0aCA6IGRhdGFJbnRlcmNoYW5nZS5wYXRoKSB7CiAJCQkvLyBhcmUgdGhlcmUgYW55IG1hcHBpbmdzPwogCQkJdmFyIG1hcHBpbmdGb3VuZCA9IGhhc0F0dHJpYnV0ZU1hcHBpbmcocGF0aCkKLQkJCQotCQkJaWYgKHJvb3RFbnRpdHlOYW1lID09PSBudWxsICYmICFwYXRoLm1hcmtMYXRlc3QpIHsKLQkJCQlyb290RW50aXR5TmFtZSA9IHBhdGguZW50aXR5LnRvTmFtZS50b1N0cmluZworCisJCQlpZiAocm9vdEVudGl0eU5hbWUgPT09IG51bGwgJiYgIXBhdGguaXNNYXJrTGF0ZXN0SW1wb3J0KSB7CisJCQkJcm9vdEVudGl0eU5hbWUgPSAocGF0aC5lbnRpdHkgYXMgTEFubm90YXRpb25UYXJnZXQpLnRvTmFtZS50b1N0cmluZwogCQkJfQogCQkJaWYgKGRhdGFJbnRlcmNoYW5nZS5maWxlRW5kcG9pbnQgaW5zdGFuY2VvZiBEYXRhSW50ZXJjaGFuZ2VGaWxlWE1MKSB7CiAJCQkJdmFyIGN1cnJlbnRLZXkgPSAnJydsaXN0wqtzdWJzdGl0dXRpb25Db3VudMK7JycnCkBAIC02NzYsNyArNjg1LDcgQEAKIAkJCQl2ZWN0b3IgPSB2ZWN0b3JNYXAuZ2V0KHBhdGguZW50aXR5LnRvTmFtZSkgPzogdmVjdG9yCiAKIAkJCQlzdWJzdGl0dXRpb25NYXAucHV0KGN1cnJlbnRLZXksICcnJ8KrdmVjdG9ywrsgYXMgwqtwYXRoLmVudGl0eS50b05hbWXCuycnJykKLQkJCQlpZihkZXB0aCA+IDEpeworCQkJCWlmKHByZXZpb3VzRW50aXR5ICE9PSBudWxsICYmICFwcmV2aW91c0VudGl0eS5oYXNSZWxhdGlvbihwYXRoLmVudGl0eSkpewogCQkJCQliZWFuID0gY3JlYXRlWG1sQmVhbihmdGxEb2N1bWVudCwgb2xkUGFyZW50LCBwYXRoLmVudGl0eSwgcGF0aC5mb3JtYXQsIGN1cnJlbnRLZXksIHBhdGgsIGRhdGFJbnRlcmNoYW5nZSkKIAkJCQl9ZWxzZXsKIAkJCQkJb2xkUGFyZW50ID0gYmVhbgpAQCAtNjg0LDEzICs2OTMsMTggQEAKIAkJCQkJZGVwdGggPSBkZXB0aCArIDEKIAkJCQl9CiAJCQkJc3Vic3RpdHV0aW9uQ291bnQgPSBzdWJzdGl0dXRpb25Db3VudCArIDEKKwkJCQlwcmV2aW91c0VudGl0eSA9IHBhdGguZW50aXR5CiAJCQl9CiAKIAkJCWZvciAoZiA6IHBhdGguZW50aXR5LmFsbEZlYXR1cmVzKSB7Ci0JCQkJaWYoZiBpbnN0YW5jZW9mIExBdHRyaWJ1dGUgJiYgIWYudG9NYW55KSB7Ci0JCQkJCWlmICghImRpc3Bvc2VkIi5lcXVhbHMoZi50b05hbWUpICYmIAorCQkJCWlmKGYgaW5zdGFuY2VvZiBMQXR0cmlidXRlICYmICFmLnRvTWFueSAmJiAKKwkJCQkJcGF0aC5nZXRFeHBvcnRGaWx0ZXIgIT09IG51bGwgJiYgCisJCQkJCXBhdGguZ2V0RXhwb3J0RmlsdGVyLmhpZGRlbnByb3BlcnRpZXMgIT09IG51bGwgJiYgCisJCQkJCSFwYXRoLmdldEV4cG9ydEZpbHRlci5oaWRkZW5wcm9wZXJ0aWVzLmVtcHR5ICYmCisJCQkJCSFwYXRoLmdldEV4cG9ydEZpbHRlci5oaWRkZW5wcm9wZXJ0aWVzLnRvTGlzdC5jb250YWluc0ZlYXR1cmUoZikpIHsKKwkJCQkJaWYgKCJkaXNwb3NlZCIgIT0gZi50b05hbWUgJiYgCiAJCQkJCQkhKGYgYXMgTEVudGl0eUF0dHJpYnV0ZSkudmVyc2lvbiAmJgkJCQkvLyBkb24ndCBleHBvcnQgdmVyc2lvbgotCQkJCQkJIXBhdGgubWFya0xhdGVzdCAmJgorCQkJCQkJIXBhdGguaXNNYXJrTGF0ZXN0SW1wb3J0ICYmCiAJCQkJCQkoKCEoZiBhcyBMRW50aXR5QXR0cmlidXRlKS5pZCAmJiAhKGYgYXMgTEVudGl0eUF0dHJpYnV0ZSkudXVpZCkgfHwgKHBhdGgubG9va3VwS2V5cy5lbXB0eSAmJiBkYXRhSW50ZXJjaGFuZ2UubW9kZSAhPSBFbnRpdHlNYW5hZ2VyTW9kZS5QRVJTSVNUKSkgJiYKIAkJCQkJCSghbWFwcGluZ0ZvdW5kIHx8IHBhdGgubWFwcGluZ3MuaXNNYXBwZWQoZikpKSB7CiAJCQkJCQlmaWVsZExpc3QuYWRkKGYgYXMgTEVudGl0eUF0dHJpYnV0ZSkKQEAgLTcwMCwxNyArNzE0LDE3IEBACiAJCQkJCWZpZWxkTGlzdC5hZGQoZiBhcyBMRW50aXR5UmVmZXJlbmNlKQogCQkJCX0KIAkJCQkvLyBpZiBhIGZlYXR1cmUgaXMgYSAxLSogcmVmZXJlbmNlLCBmaW5kIGlmIHRoZSByZWZlcmVuY2VkIGVudGl0eSBpcyBhbHNvIHVuZGVyIHRoaXMgcGF0aC4KLQkJCQlpZihmIGluc3RhbmNlb2YgTFJlZmVyZW5jZSAmJiBmLnRvTWFueSAmJiAhcGF0aC5tYXJrTGF0ZXN0KSB7CisJCQkJaWYoZiBpbnN0YW5jZW9mIExSZWZlcmVuY2UgJiYgZi50b01hbnkgJiYgIXBhdGguaXNNYXJrTGF0ZXN0SW1wb3J0KSB7CiAJCQkJCXZhciBpdGVyID0gZGF0YUludGVyY2hhbmdlLnBhdGguaXRlcmF0b3IKIAkJCQkJdmFyIG5leHQgPSBpdGVyLm5leHQKIAkJCQkJLy8gZmluZCBjdXJyZW50IGVudGl0eQotCQkJCQl3aGlsZSAoaXRlci5oYXNOZXh0ICYmICFuZXh0LmVudGl0eS50b05hbWUuZXF1YWxzKHBhdGguZW50aXR5LnRvTmFtZSkpIHsKKwkJCQkJd2hpbGUgKGl0ZXIuaGFzTmV4dCAmJiBuZXh0LmVudGl0eS50b05hbWUgIT0gcGF0aC5lbnRpdHkudG9OYW1lKSB7CiAJCQkJCQluZXh0ID0gaXRlci5uZXh0CiAJCQkJCX0gCiAJCQkJCXdoaWxlIChpdGVyLmhhc05leHQpIHsKIAkJCQkJCS8vIG1vdmUgdG8gbmV4dCBlbnRpdHkKIAkJCQkJCW5leHQgPSBpdGVyLm5leHQKLQkJCQkJCWlmIChuZXh0ICE9PSBudWxsICYmIG5leHQuZW50aXR5LnRvTmFtZS5lcXVhbHMoKGYudHlwZSBhcyBMRW50aXR5KS50b05hbWUpKSB7CisJCQkJCQlpZiAobmV4dCAhPT0gbnVsbCAmJiBuZXh0LmVudGl0eS50b05hbWUgPT0gKGYudHlwZSBhcyBMRW50aXR5KS50b05hbWUpIHsKIAkJCQkJCQl2ZWN0b3JNYXAucHV0KG5leHQuZW50aXR5LnRvTmFtZSwgJycnwqtwYXRoLmVudGl0eS50b05hbWXCuy7Cq2YubmFtZcK7JycnKQogCQkJCQkJfQogCQkJCQl9CkBAIC03MjEsMTAgKzczNSwxNSBAQAogCQkJY3JlYXRlRnJlZW1hcmtlcihkb2MsIGNyZWF0ZUNzdlRlbXBsYXRlKHJvb3RFbnRpdHlOYW1lLCBmaWVsZExpc3QsIGRlbGltaXRlciwgcXVvdGUsIGRhdGFJbnRlcmNoYW5nZS5wYXRoKSwgZW5kUG9pbnQpCiAJCX0KIAkJaWYoZW5kUG9pbnQgaW5zdGFuY2VvZiBEYXRhSW50ZXJjaGFuZ2VGaWxlWE1MKSB7Ci0JCQljcmVhdGVGcmVlbWFya2VyKGRvYywgY3JlYXRlWG1sVGVtcGxhdGUoZnRsRG9jdW1lbnQsIHN1YnN0aXR1dGlvbk1hcCksIGVuZFBvaW50KQorCQkJY3JlYXRlRnJlZW1hcmtlcihkb2MsIGNyZWF0ZVhtbFRlbXBsYXRlKGZ0bERvY3VtZW50LCBzdWJzdGl0dXRpb25NYXAsIGRhdGFJbnRlcmNoYW5nZS5wYXRoKSwgZW5kUG9pbnQpCiAJCX0KIAl9CiAJCisJZGVmIGJvb2xlYW4gaGFzUmVsYXRpb24oTEVudGl0eSByb290LCBMRW50aXR5IGVudGl0eSkgeworCQl2YXIgcmVzdWx0ID0gcm9vdC5mZWF0dXJlcy5maWx0ZXJbaXQgaW5zdGFuY2VvZiBMUmVmZXJlbmNlICYmIChpdCBhcyBMUmVmZXJlbmNlKS50eXBlLmVxdWFscyhlbnRpdHkpXQorCQlyZXR1cm4gIXJlc3VsdC5lbXB0eQorCX0KKwkKIAlkZWYgZ2VuZXJhdGVJbXBvcnRDb25maWcoRGF0YUludGVyY2hhbmdlIGRhdGFJbnRlcmNoYW5nZSwgTGlzdDxMRW50aXR5RmVhdHVyZT4gZmllbGRMaXN0LCBEb2N1bWVudCBkb2MsIERhdGFJbnRlcmNoYW5nZUZpbGUgZW5kUG9pbnQpIHsKIAkJdmFyIGlzRmlyc3QgPSB0cnVlCiAJCXZhciBoYXNNYXJrZXIgPSBmYWxzZQpAQCAtNzQ1LDE2ICs3NjQsMTYgQEAKIAkJCX0gZWxzZSB7CiAJCQkJbWFwID0gcGF0aC5lbGVtZW50TWFwCiAJCQl9Ci0JCQlpZihwYXRoLm1hcmtMYXRlc3QpIHsKKwkJCWlmKHBhdGguaXNNYXJrTGF0ZXN0SW1wb3J0KSB7CiAJCQkJaGFzTWFya2VyID0gdHJ1ZQogCQkJfQogCQkJdmFyIEVsZW1lbnQgYmVhbiA9IG51bGwKLQkJCWlmKCFwYXRoLm1hcmtMYXRlc3QgJiYgIWhhc01hcmtlciAmJiBpc0ZpcnN0KSB7CisJCQlpZighcGF0aC5pc01hcmtMYXRlc3RJbXBvcnQgJiYgIWhhc01hcmtlciAmJiBpc0ZpcnN0KSB7CiAJCQkJdmFyIHJvb3RCZWFuID0gY3JlYXRlQmVhbihkb2MsIHBhdGguZW50aXR5LnRvTmFtZSsiTGlzdCIsIHBhdGguZW50aXR5LmZ1bGx5UXVhbGlmaWVkTmFtZS50b1N0cmluZywgbWFwLCB0cnVlKQogCQkJCWNyZWF0ZVdpcmluZyhkb2MsIHJvb3RCZWFuLCBwYXRoLmVudGl0eS50b05hbWUsIG51bGwsIG51bGwpCiAJCQkJaXNGaXJzdCA9IGZhbHNlCiAJCQl9Ci0JCQlpZighcGF0aC5tYXJrTGF0ZXN0ICYmIGVuZFBvaW50IGluc3RhbmNlb2YgRGF0YUludGVyY2hhbmdlRmlsZUNTVikgeworCQkJaWYoIXBhdGguaXNNYXJrTGF0ZXN0SW1wb3J0ICYmIGVuZFBvaW50IGluc3RhbmNlb2YgRGF0YUludGVyY2hhbmdlRmlsZUNTVikgewogCQkJCWF1dG9NYXBwaW5nID0gYXV0b01hcHBpbmcgKyAiL2Nzdi1yZWNvcmQiCiAJCQl9CiAKQEAgLTgwOSwxMCArODI4LDEwIEBACiAJCQkJCQkJCSAgICAgIHx8CiAJCQkJCQkJCQkgIChwYXRoLmxvb2t1cEtleXMuZW1wdHkgJiYgZGF0YUludGVyY2hhbmdlLm1vZGUgIT0gRW50aXR5TWFuYWdlck1vZGUuUEVSU0lTVCkpCiAJCQkJCQkJCQkmJiAKLQkJCQkJCQkJCSghcGF0aC5tYXJrTGF0ZXN0ICB8fCAhcGF0aC5sYXRlc3RQcm9wZXJ0eS50b05hbWUuZXF1YWxzKGYudG9OYW1lKSkKKwkJCQkJCQkJCSghcGF0aC5pc01hcmtMYXRlc3RJbXBvcnQgIHx8ICFwYXRoLmxhdGVzdFByb3BlcnR5LnRvTmFtZS5lcXVhbHMoZi50b05hbWUpKQogCQkJCQkJCQkpIHsKIAkJCQkJCQkJLy8gYWRkIHRvIHRoZSBsZXZlbCdzIGZpZWxkIGxpc3QKLQkJCQkJCQkJaWYgKCFwYXRoLm1hcmtMYXRlc3QpIHsKKwkJCQkJCQkJaWYgKCFwYXRoLmlzTWFya0xhdGVzdEltcG9ydCkgewogCQkJCQkJCQkJZmllbGRMaXN0LmFkZChmIGFzIExFbnRpdHlBdHRyaWJ1dGUpCiAJCQkJCQkJCX0KIAkJCQkJCQkJdmFyIGV4cHJlc3Npb25Gb3VuZCA9IGZhbHNlCkBAIC04NjIsNyArODgxLDcgQEAKIAkJCQkJCQkJLy8gZGVmYXVsdCBmb3IgbWFwcGluZyBwdXJwb3NlcwogCQkJCQkJCQlpZiAoIWV4cHJlc3Npb25Gb3VuZCAmJiAhZm9ybWF0Rm91bmQpIHsKIAkJCQkJCQkJCS8vIGNyZWF0ZSBubyBwcm9wZXJ0eSBmb3IgdW5tYXBwZWQgbWFya2VyIGVudGl0aWVzCi0JCQkJCQkJCQlpZiAoIShlbmRQb2ludCBpbnN0YW5jZW9mIERhdGFJbnRlcmNoYW5nZUZpbGVDU1YpIHx8ICFwYXRoLm1hcmtMYXRlc3QpIHsKKwkJCQkJCQkJCWlmICghKGVuZFBvaW50IGluc3RhbmNlb2YgRGF0YUludGVyY2hhbmdlRmlsZUNTVikgfHwgIXBhdGguaXNNYXJrTGF0ZXN0SW1wb3J0KSB7CiAJCQkJCQkJCQkJLy8gY3JlYXRlIG5vIHByb3BlcnR5IGlmIG1hcHBpbmcgaXMgdXNlZCBhbmQgdGhpcyBhdHRyaWJ1dGUgaXMgdW5tYXBwZWQKIAkJCQkJCQkJCQlpZighbWFwcGluZ0ZvdW5kIHx8IHBhdGgubWFwcGluZ3MuaXNNYXBwZWQoZikpIHsKIAkJCQkJCQkJCQkJdmFyIGV0eXBlID0gZHRUeXBlLmdldEJhc2ljVHlwZShmIGFzIExFbnRpdHlBdHRyaWJ1dGUpCkBAIC05MDIsNyArOTIxLDcgQEAKIAkJCQkJCQkJCX0KIAkJCQkJCQkJfQogCQkJCQkJCQkvLyBkZWZhdWx0IG1hcHBpbmcgZm9yIHhtbAotCQkJCQkJCQlpZiAoIW1hcHBpbmdGb3VuZCAmJiAhcGF0aC5tYXJrTGF0ZXN0ICYmIGVuZFBvaW50IGluc3RhbmNlb2YgRGF0YUludGVyY2hhbmdlRmlsZVhNTCkgeworCQkJCQkJCQlpZiAoIW1hcHBpbmdGb3VuZCAmJiAhcGF0aC5pc01hcmtMYXRlc3RJbXBvcnQgJiYgZW5kUG9pbnQgaW5zdGFuY2VvZiBEYXRhSW50ZXJjaGFuZ2VGaWxlWE1MKSB7CiAJCQkJCQkJCQlhZGRNYXBwaW5nKGRvYywgYmVhbiwgZi50b05hbWUsIGYudG9OYW1lLCBieUF0dHJpYnV0ZSkKIAkJCQkJCQkJfQogCQkJCQkJCX0KQEAgLTk2Miw3ICs5ODEsNyBAQAogCQkJCX0KIAkJCX0KIAkJCS8vZm9yIENTViBmaWxlLCBpZiBubyBtYXBwaW5nIHdlcmUgZm91bmQsIHNpbXBseSBtYXAgYWxsIGF0dHJpYnV0ZXMKLQkJCWlmICghbWFwcGluZ0ZvdW5kICYmICFwYXRoLm1hcmtMYXRlc3QgJiYgZW5kUG9pbnQgaW5zdGFuY2VvZiBEYXRhSW50ZXJjaGFuZ2VGaWxlQ1NWKSB7CisJCQlpZiAoIW1hcHBpbmdGb3VuZCAmJiAhcGF0aC5pc01hcmtMYXRlc3RJbXBvcnQgJiYgZW5kUG9pbnQgaW5zdGFuY2VvZiBEYXRhSW50ZXJjaGFuZ2VGaWxlQ1NWKSB7CiAJCQkJZm9yKGZsZCA6IGZpZWxkTGlzdCkgewogCQkJCQlpZihmbGQgaW5zdGFuY2VvZiBMRW50aXR5QXR0cmlidXRlKXsKIAkJCQkJCWFkZE1hcHBpbmcoZG9jLCBiZWFuLCBmbGQudG9OYW1lLCBmbGQudG9OYW1lLCBieUF0dHJpYnV0ZSkKQEAgLTk4NCw4ICsxMDAzLDggQEAKIAl9CiAKIAlwcm90ZWN0ZWQgZGVmIGJvb2xlYW4gaGFzUmVmZXJlbmNlTG9va3VwKERhdGFJbnRlcmNoYW5nZUJlYW4gcGF0aCl7Ci0JCWZvcihsdTpwYXRoLmxvb2t1cCkgewotCQkJZm9yKGE6cGF0aC5lbnRpdHkuZ2V0QWxsUmVmZXJlbmNlcykgeworCQlmb3IobHUgOiBwYXRoLmxvb2t1cCkgeworCQkJZm9yKGEgOiBwYXRoLmVudGl0eS5nZXRBbGxSZWZlcmVuY2VzKSB7CiAJCQkJaWYoYS5uYW1lLmVxdWFscyhsdS5kYXRhTWFwKSl7CiAJCQkJCXJldHVybiB0cnVlCiAJCQkJfQpAQCAtOTkzLDYgKzEwMTIsMTcgQEAKIAkJfQogCQlyZXR1cm4gZmFsc2UKIAl9CisJCisJcHJvdGVjdGVkIGRlZiBib29sZWFuIGhhc1JlZmVyZW5jZUV4cG9ydChEYXRhSW50ZXJjaGFuZ2VCZWFuIHBhdGgpeworCQlmb3IoZXhwb3NlIDogcGF0aC5leHBvcnRFeHBvc2VzKSB7CisJCQlmb3IoYSA6IHBhdGguZW50aXR5LmdldEFsbFJlZmVyZW5jZXMpIHsKKwkJCQlpZihhLm5hbWUuZXF1YWxzKGV4cG9zZS5yZWZFbnRpdHkubmFtZSkpeworCQkJCQlyZXR1cm4gdHJ1ZQorCQkJCX0KKwkJCX0KKwkJfQorCQlyZXR1cm4gZmFsc2UKKwl9CiAKIAlkZWYgYm9vbGVhbiBpc01hcHBlZChFTGlzdDxEYXRhSW50ZXJjaGFuZ2VNYXBwaW5nPiBsaXN0LCBMRmVhdHVyZSBhdHRyaWJ1dGUpIHsKIAkJaWYoYXR0cmlidXRlIGluc3RhbmNlb2YgTEVudGl0eUF0dHJpYnV0ZSkgewpAQCAtMTAyMyw3ICsxMDUzLDcgQEAKIAkJCXBhcmVudC5hcHBlbmRDaGlsZChiZWFuKQogCQl9CiAJCWZvcihwOmVudGl0eS5hbGxBdHRyaWJ1dGVzKSB7Ci0JCQlpZighcC52ZXJzaW9uICYmCQkJCS8vIGRvbid0IGV4cG9ydCB2ZXJzaW9uCisJCQlpZighcC52ZXJzaW9uICYmIC8vIGRvbid0IGV4cG9ydCB2ZXJzaW9uCiAJCQkJKCghcC5pZCAmJiAhcC51dWlkKSB8fCAocGF0aC5sb29rdXBLZXlzLmVtcHR5ICYmIGRhdGFJbnRlcmNoYW5nZS5tb2RlICE9IEVudGl0eU1hbmFnZXJNb2RlLlBFUlNJU1QpKSAmJiAKIAkJCQkoIW1hcHBpbmdGb3VuZCB8fCBwYXRoLm1hcHBpbmdzLmlzTWFwcGVkKHApKSkgeyAKIAkJCQl2YXIgZm9ybWF0ID0gbnVsbCBhcyBEYXRhSW50ZXJjaGFuZ2VGb3JtYXQKQEAgLTEwNDAsNiArMTA3MCwyMSBAQAogCQkJCWJlYW4uYXBwZW5kQ2hpbGQocHJvcGVydHkpCiAJCQl9CiAJCX0KKwkJZm9yKGUgOiBwYXRoLmV4cG9ydEV4cG9zZXMpeworCQkJdmFyIGV4cG9zZSA9IGUKKwkJCXZhciBzZWdtZW50cyA9IDxTdHJpbmc+bmV3QXJyYXlMaXN0KCkKKwkJCXNlZ21lbnRzLmFkZChleHBvc2UucmVmRW50aXR5Lm5hbWUpCisJCQl3aGlsZShleHBvc2UucmVmUHJvcGVydHkgPT09IG51bGwpeworCQkJCWV4cG9zZSA9IGV4cG9zZS5zdWJFeHBvc2UKKwkJCQlzZWdtZW50cy5hZGQoZXhwb3NlLnJlZkVudGl0eS5uYW1lKQorCQkJfQorCisJCQl2YXIgcHJvcGVydHkgPSBkb2MuY3JlYXRlRWxlbWVudChleHBvc2UucmVmUHJvcGVydHkudG9OYW1lKQorCQkJdmFyIHBhdGhUb1Byb3BlcnR5ID0gc2VnbWVudHMuam9pbigiLiIpCisKKwkJCXByb3BlcnR5LnRleHRDb250ZW50ID0gZW5jb2RlRnJlZW1hcmtlcignJyfCq2VudGl0eS50b05hbWXCuy7Cq3BhdGhUb1Byb3BlcnR5wrsnJycsIGV4cG9zZS5yZWZQcm9wZXJ0eSwgbnVsbCBhcyBEYXRhSW50ZXJjaGFuZ2VGb3JtYXQsICIiLCB0cnVlKTsKKwkJCWJlYW4uYXBwZW5kQ2hpbGQocHJvcGVydHkpCisJCX0KIAkJdmFyIHBhID0gZG9jLmNyZWF0ZVByb2Nlc3NpbmdJbnN0cnVjdGlvbihjdXJyZW50S2V5LCAiIikKIAkJaWYocGFyZW50ID09PSBudWxsKSB7CiAJCQlkb2MuZG9jdW1lbnRFbGVtZW50LmFwcGVuZENoaWxkKHBhKQpAQCAtMTA4OSwyMCArMTEzNCw0MCBAQAogLy8gIAk8L2Z0bDp0ZW1wbGF0ZT4KIC8vCTwvZnRsOmZyZWVtYXJrZXI+CiAJCQkJCi0JZGVmIFN0cmluZyBjcmVhdGVYbWxUZW1wbGF0ZShEb2N1bWVudCBkb2MsIEhhc2hNYXA8U3RyaW5nLFN0cmluZz4gc3Vic3RpdHV0aW9uTWFwKQl7CisJZGVmIFN0cmluZyBjcmVhdGVYbWxUZW1wbGF0ZShEb2N1bWVudCBkb2MsIEhhc2hNYXA8U3RyaW5nLFN0cmluZz4gc3Vic3RpdHV0aW9uTWFwLCBFTGlzdDxEYXRhSW50ZXJjaGFuZ2VCZWFuPiBwYXRoKQl7CiAgICAgICAgIHZhciBzb3VyY2UgPSBuZXcgRE9NU291cmNlKGRvYykKICAgICAgICAgdmFyIHJlcyA9IG5ldyBEYXRhUmVzdWx0KCkKIAkJdHJhbnNmb3JtZXIuc2V0T3V0cHV0UHJvcGVydHkoT3V0cHV0S2V5cy5PTUlUX1hNTF9ERUNMQVJBVElPTiwgInllcyIpOwogICAgICAgICB0cmFuc2Zvcm1lci50cmFuc2Zvcm0oc291cmNlLCByZXMpCiAgICAgICAgIHZhciBvdXRwdXQgPSByZXMucmVzdWx0CisgICAgICAgIAorICAgICAgICAvLyBwcm9jZXNzaW5nIHRoZSB0ZW1wbGF0ZSBzdHJpbmcgZm9yIGZpbHRlcmVkIGluZm9ybWF0aW9uCisgICAgICAgIGZvcihmOiBwYXRoKXsgLy8gZm9yIGV4Y2x1c2lvbgorICAgICAgICAJaWYoZi5nZXRFeHBvcnRGaWx0ZXIgIT09IG51bGwgJiYgZi5nZXRFeHBvcnRGaWx0ZXIuaGlkZGVucHJvcGVydGllcyAhPT0gbnVsbCAmJiAhZi5nZXRFeHBvcnRGaWx0ZXIuaGlkZGVucHJvcGVydGllcy5lbXB0eSl7CisgICAgICAgIAkJZm9yKGhpZGRlbnByb3AgOiBmLmdldEV4cG9ydEZpbHRlci5oaWRkZW5wcm9wZXJ0aWVzKXsgCisgICAgICAgIAkJCXZhciBhdHRybmFtZSA9IGhpZGRlbnByb3AucHJvcGVydHkubmFtZQorICAgICAgICAJCQlpZihvdXRwdXQuY29udGFpbnMoYXR0cm5hbWUpKXsKKwkgICAgICAgIAkJCXZhciB0YXJnZXRzdGF0ZW1lbnQgPSBvdXRwdXQuc3Vic3RyaW5nKG91dHB1dC5pbmRleE9mKCI8IithdHRybmFtZSsiPiR7KCIrZi5lbnRpdHkubmFtZSksb3V0cHV0LmluZGV4T2YoIjwvIithdHRybmFtZSsiPiIpICsgKCI8LyIrYXR0cm5hbWUrIj4iKS5sZW5ndGgpCisJICAgICAgICAJCQlvdXRwdXQgPSBvdXRwdXQucmVwbGFjZSh0YXJnZXRzdGF0ZW1lbnQsICIiKQorICAgICAgICAJCQl9CisgICAgICAgIAkJfQorICAgICAgICAJfQorICAgICAgICB9CisgICAgICAgIC8vIGNsZWFuaW5nIHdoaXRlc3BhY2VzCisgICAgICAgIHZhciByZXN1bHQgPSAiIiAKKyAgICAgICAgZm9yKGYgOiBvdXRwdXQuc3BsaXQoIlxyIikpeworICAgICAgICAJaWYoIWYudHJpbS5pc0VtcHR5KXsKKyAgICAgICAgCQlyZXN1bHQgPSByZXN1bHQuY29uY2F0KGYpCisgICAgICAgIAl9CisgICAgICAgIH0KICAgICAgICAgLy8gcHJvY2Vzc2luZyBpbnN0cnVjdGlvbnMgYXJlIGVtYmVkZGVkIGluIHF1ZXN0aW9uIG1hcmtzIC0gdGhleSBtdXN0IGJlIHJlcGxhY2VkCiAgICAgICAgIGZvcihrOnN1YnN0aXR1dGlvbk1hcC5rZXlTZXQpIHsKLSAgICAgICAgCW91dHB1dCA9IG91dHB1dC5yZXBsYWNlRmlyc3QoaywgJycnI2xpc3QgwqtzdWJzdGl0dXRpb25NYXAuZ2V0KGspwrsnJycpCisgICAgICAgIAlyZXN1bHQgPSByZXN1bHQucmVwbGFjZUZpcnN0KGssICcnJyNsaXN0IMKrc3Vic3RpdHV0aW9uTWFwLmdldChrKcK7JycnKQogICAgICAgICB9CiAgICAgICAgIGZvcihsOnN1YnN0aXR1dGlvbk1hcC5rZXlTZXQpIHsKLSAgICAgICAgCW91dHB1dCA9IG91dHB1dC5yZXBsYWNlRmlyc3QobCwgJycnLyNsaXN0JycnKQorICAgICAgICAJcmVzdWx0ID0gcmVzdWx0LnJlcGxhY2VGaXJzdChsLCAnJycvI2xpc3QnJycpCiAgICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG91dHB1dC5yZXBsYWNlKCImbHQ7IiwiPCIpLnJlcGxhY2UoIiZndDsiLCI+IikucmVwbGFjZSgiPD8iLCI8IikucmVwbGFjZSgiPz4iLCI+IikvLy5yZXBsYWNlKCI8LyMiLCJcbjwvIyIpIAorICAgICAgICByZXR1cm4gcmVzdWx0LnJlcGxhY2UoIiZsdDsiLCI8IikucmVwbGFjZSgiJmd0OyIsIj4iKS5yZXBsYWNlKCI8PyIsIjwiKS5yZXBsYWNlKCI/PiIsIj4iKS8vLnJlcGxhY2UoIjwvIyIsIlxuPC8jIikgCiAJfQogCQogCWRlZiBTdHJpbmcgY3JlYXRlQ3N2VGVtcGxhdGUoU3RyaW5nIHJvb3RFbnRpdHlOYW1lLCBMaXN0PExFbnRpdHlGZWF0dXJlPiBmaWVsZExpc3QsIFN0cmluZyBkZWxpbWl0ZXIsIFN0cmluZyBxdW90ZSwgRUxpc3Q8RGF0YUludGVyY2hhbmdlQmVhbj4gcGF0aHMpCXsKQEAgLTEyMTAsNiArMTI3NSwxNSBAQAogCQl2YXIgcXN0ciA9ICcnJ3guwqtiZWFuLmVudGl0eS5pZEF0dHJpYnV0ZU5hbWXCuyA9IDpwYXJhbScnJwogCQlyZXR1cm4gJycnZnJvbSDCq3NlbGVjdMK7IHdoZXJlIMKrcXN0csK7JycnCiAJfQorCQorCWRlZiBib29sZWFuIGNvbnRhaW5zRmVhdHVyZShMaXN0PERhdGFJbnRlcmNoYW5nZUV4cG9ydEhpZGU+IGxpc3QsIExFbnRpdHlGZWF0dXJlIGYpeworCQlmb3IoZXhjbHVkZSA6IGxpc3QpeworCQkJaWYoZXhjbHVkZS5wcm9wZXJ0eS5lcXVhbHMoZikpeworCQkJCXJldHVybiB0cnVlCisJCQl9IAkKKwkJfQorCQlyZXR1cm4gZmFsc2UKKwl9CiAKIAlvdmVycmlkZSBjcmVhdGVBcHBlbmRhYmxlKEVPYmplY3QgY29udGV4dCwgSW1wb3J0TWFuYWdlciBpbXBvcnRNYW5hZ2VyLCBHZW5lcmF0b3JDb25maWcgY29uZmlnKSB7CiAJCS8vIHJlcXVpcmVkIHRvIGluaXRpYWxpemUgdGhlIG5lZWRlZCBidWlsZGVyIHRvIGF2b2lkIGRlcHJlY2F0ZWQgbWV0aG9kcwpAQCAtMTI5Myw2ICsxMzY3LDggQEAKIAkJCSwgQmxvYlR5cGluZ0FQSQogCQkJLCBDb21wb25lbnQKIAkJCSwgUGFuZWwKKwkJCSwgUGF0aHMKKwkJCSwgRGF0ZQogCQkpCiAJCXN1cGVyLmNyZWF0ZUFwcGVuZGFibGUoY29udGV4dCwgaW1wb3J0TWFuYWdlciwgY29uZmlnKQogCX0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLm9zYnAueHRleHQuZGF0YWludGVyY2hhbmdlL3NyYy9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2RhdGFpbnRlcmNoYW5nZS9qdm1tb2RlbC9Kb2luR3JhcGguamF2YSBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQuZGF0YWludGVyY2hhbmdlL3NyYy9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2RhdGFpbnRlcmNoYW5nZS9qdm1tb2RlbC9Kb2luR3JhcGguamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40OTc0ZjgxCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5kYXRhaW50ZXJjaGFuZ2Uvc3JjL29yZy9lY2xpcHNlL29zYnAveHRleHQvZGF0YWludGVyY2hhbmdlL2p2bW1vZGVsL0pvaW5HcmFwaC5qYXZhCkBAIC0wLDAgKzEsMTA3IEBACisvKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKiAgQ29weXJpZ2h0IChjKSAyMDExIC0gMjAxOCAtIExvZXR6IEdtYkggJiBDbyBLRywgNjkxMTUgSGVpZGVsYmVyZywgR2VybWFueSAKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICogIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgICAgICAgICAgIAorICogIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgMi4wICAgICAgICAKKyAqICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAgICAgICAgICAgICAgICAgIAorICogIGh0dHBzOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAvICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICogIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAqICBJbml0aWFsIGNvbnRyaWJ1dGlvbjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAqICAgICBMb2V0eiBHbWJIICYgQ28uIEtHICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKiAKKyAqLworcGFja2FnZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmRhdGFpbnRlcmNoYW5nZS5qdm1tb2RlbDsKKworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuTm9TdWNoRWxlbWVudEV4Y2VwdGlvbjsKKworLyoqCisgKiBUaGUgQ2xhc3MgSm9pbkdyYXBoCisgKgorICogQHBhcmFtIDxKPiB0aGUgZ2VuZXJpYyB0eXBlCisgKi8KK3B1YmxpYyBjbGFzcyBKb2luR3JhcGg8Sj4gaW1wbGVtZW50cyBJdGVyYWJsZTxKPiB7CisJCisgICAgLyoqIFRoZSBncmFwaCB0aGF0IG1hcHMgbm9kZXMgYW5kIHRoZWlyIGVkZ2VzLiAqLworICAgIHByaXZhdGUgZmluYWwgTWFwPEosIE1hcDxKLCBTdHJpbmc+PiBncmFwaCA9IG5ldyBIYXNoTWFwPD4oKTsKKworICAgIC8qKgorICAgICAqIEFkZHMgYSBub2RlLgorICAgICAqCisgICAgICogQHBhcmFtIG5vZGUgdGhlIG5vZGUKKyAgICAgKiBAcmV0dXJuIHRydWUsIGlmIHN1Y2Nlc3NmdWwKKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBhZGROb2RlKEogbm9kZSkgeworICAgICAgICBpZiAobm9kZSA9PSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oIm5vZGUgbXVzdCBub3QgYmUgbnVsbC4iKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoZ3JhcGguY29udGFpbnNLZXkobm9kZSkpIHsKKyAgICAgICAgCXJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICBncmFwaC5wdXQobm9kZSwgbmV3IEhhc2hNYXA8SiwgU3RyaW5nPigpKTsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgLyoqCisgICAgICogQWRkcyBhIGpvaW4uCisgICAgICoKKyAgICAgKiBAcGFyYW0gc291cmNlIHRoZSBzb3VyY2UKKyAgICAgKiBAcGFyYW0gZGVzdGluYXRpb24gdGhlIGRlc3RpbmF0aW9uCisgICAgICogQHBhcmFtIGpvaW5OYW1lIHRoZSBqb2luIG5hbWUKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBhZGRKb2luIChKIHNvdXJjZSwgSiBkZXN0aW5hdGlvbiwgU3RyaW5nIGpvaW5OYW1lKSB7CisgICAgICAgIGlmIChzb3VyY2UgPT0gbnVsbCB8fCBkZXN0aW5hdGlvbiA9PSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oInNvdXJjZSBvciBkZXN0aW5hdGlvbiBtdXN0IG5vdCBiZSBudWxsLiIpOworICAgICAgICB9CisgICAgICAgIGlmICghZ3JhcGguY29udGFpbnNLZXkoc291cmNlKSB8fCAhZ3JhcGguY29udGFpbnNLZXkoZGVzdGluYXRpb24pKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgTm9TdWNoRWxlbWVudEV4Y2VwdGlvbigic291cmNlIGFuZCBkZXN0aW5hdGlvbiBtdXN0IGJlIHBhcnQgb2YgZ3JhcGguIik7CisgICAgICAgIH0KKyAgICAgICAgZ3JhcGguZ2V0KHNvdXJjZSkucHV0KGRlc3RpbmF0aW9uLCBqb2luTmFtZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmVtb3ZlcyBhIGpvaW4uCisgICAgICoKKyAgICAgKiBAcGFyYW0gc291cmNlIHRoZSBzb3VyY2UKKyAgICAgKiBAcGFyYW0gZGVzdGluYXRpb24gdGhlIGRlc3RpbmF0aW9uCisgICAgICovCisgICAgcHVibGljIHZvaWQgcmVtb3ZlSm9pbiAoSiBzb3VyY2UsIEogZGVzdGluYXRpb24pIHsKKyAgICAgICAgaWYgKHNvdXJjZSA9PSBudWxsIHx8IGRlc3RpbmF0aW9uID09IG51bGwpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigic291cmNlIG9yIGRlc3RpbmF0aW9uIG11c3Qgbm90IGJlIG51bGwuIik7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCFncmFwaC5jb250YWluc0tleShzb3VyY2UpIHx8ICFncmFwaC5jb250YWluc0tleShkZXN0aW5hdGlvbikpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBOb1N1Y2hFbGVtZW50RXhjZXB0aW9uKCJzb3VyY2UgYW5kIGRlc3RpbmF0aW9uIG11c3QgYmUgcGFydCBvZiBncmFwaC4iKTsKKyAgICAgICAgfQorICAgICAgICBncmFwaC5nZXQoc291cmNlKS5yZW1vdmUoZGVzdGluYXRpb24pOworICAgIH0KKworICAgIC8qKgorICAgICAqIGdldCBhbGwgam9pbnMgb3V0Z29pbmcgZnJvbSBhIG5vZGUuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbm9kZSB0aGUgbm9kZQorICAgICAqIEByZXR1cm4gdGhlIGxpc3QKKyAgICAgKi8KKyAgICBwdWJsaWMgTWFwPEosIFN0cmluZz4gam9pbnNGcm9tKEogbm9kZSkgeworICAgICAgICBpZiAobm9kZSA9PSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oIm5vZGUgbXVzdCBub3QgYmUgbnVsbC4iKTsKKyAgICAgICAgfQorICAgICAgICBNYXA8SiwgU3RyaW5nPiBqb2lucyA9IGdyYXBoLmdldChub2RlKTsKKyAgICAgICAgaWYgKGpvaW5zID09IG51bGwpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBOb1N1Y2hFbGVtZW50RXhjZXB0aW9uKCJzb3VyY2Ugbm9kZSBkb2Vzbid0IGV4aXN0LiIpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBDb2xsZWN0aW9ucy51bm1vZGlmaWFibGVNYXAoam9pbnMpOworICAgIH0KKworICAgIC8qIChub24tSmF2YWRvYykKKyAgICAgKiBAc2VlIGphdmEubGFuZy5JdGVyYWJsZSNpdGVyYXRvcigpCisgICAgICovCisgICAgQE92ZXJyaWRlIHB1YmxpYyBJdGVyYXRvcjxKPiBpdGVyYXRvcigpIHsKKyAgICAgICAgcmV0dXJuIGdyYXBoLmtleVNldCgpLml0ZXJhdG9yKCk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5kYXRhaW50ZXJjaGFuZ2Uvc3JjL29yZy9lY2xpcHNlL29zYnAveHRleHQvZGF0YWludGVyY2hhbmdlL2p2bW1vZGVsL01hbmFnZUpvaW5zLmphdmEgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmRhdGFpbnRlcmNoYW5nZS9zcmMvb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9kYXRhaW50ZXJjaGFuZ2UvanZtbW9kZWwvTWFuYWdlSm9pbnMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NGIzNmMwCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5kYXRhaW50ZXJjaGFuZ2Uvc3JjL29yZy9lY2xpcHNlL29zYnAveHRleHQvZGF0YWludGVyY2hhbmdlL2p2bW1vZGVsL01hbmFnZUpvaW5zLmphdmEKQEAgLTAsMCArMSwxNTEgQEAKKy8qCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAqICBDb3B5cmlnaHQgKGMpIDIwMTEgLSAyMDE4IC0gTG9ldHogR21iSCAmIENvIEtHLCA2OTExNSBIZWlkZWxiZXJnLCBHZXJtYW55IAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAgICAgICAgICAgCisgKiAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSAyLjAgICAgICAgIAorICogIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0ICAgICAgICAgICAgICAgICAgCisgKiAgaHR0cHM6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKiAgU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICogIEluaXRpYWwgY29udHJpYnV0aW9uOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICogICAgIExvZXR6IEdtYkggJiBDby4gS0cgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAqIAorICovCitwYWNrYWdlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQuZGF0YWludGVyY2hhbmdlLmp2bW1vZGVsOworCitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlua2VkSGFzaFNldDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworaW1wb3J0IGphdmEudXRpbC5TZXQ7CisKKy8qKgorICogVGhlIENsYXNzIE1hbmFnZUpvaW5zIGZpbmRzIGFsbCBwYXRocyBvZiBhIGRpcmVjdGVkIGdyYXBoLgorICoKKyAqIEBwYXJhbSA8VD4gdGhlIGdlbmVyaWMgdHlwZQorICovCitwdWJsaWMgY2xhc3MgTWFuYWdlSm9pbnM8VD4geworCQorCS8qKiBUaGUgZ3JhcGguICovCisJcHJpdmF0ZSBmaW5hbCBKb2luR3JhcGg8VD4gZ3JhcGg7CisKKyAgICAvKioKKyAgICAgKiBJbnN0YW50aWF0ZXMgYSBuZXcgbWFuYWdlIGpvaW5zLgorICAgICAqCisgICAgICogQHBhcmFtIGdyYXBoRmluZEFsbFBhdGhzIHRoZSBncmFwaCBmaW5kIGFsbCBwYXRocworICAgICAqLworICAgIHB1YmxpYyBNYW5hZ2VKb2lucyhKb2luR3JhcGg8VD4gZ3JhcGhGaW5kQWxsUGF0aHMpIHsKKyAgICAgICAgaWYgKGdyYXBoRmluZEFsbFBhdGhzID09IG51bGwpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigiaW5wdXQgZ3JhcGggbXVzdCBub3QgYmUgbnVsbC4iKTsKKyAgICAgICAgfQorICAgICAgICBncmFwaCA9IGdyYXBoRmluZEFsbFBhdGhzOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldHMgdGhlIGFsbCBwYXRocyB0byBkZXN0aW5hdGlvbiBub2RlLgorICAgICAqCisgICAgICogQHBhcmFtIHNvdXJjZSB0aGUgc291cmNlCisgICAgICogQHBhcmFtIGRlc3RpbmF0aW9uIHRoZSBkZXN0aW5hdGlvbgorICAgICAqIEByZXR1cm4gdGhlIGFsbCBwYXRocworICAgICAqLworICAgIHB1YmxpYyBMaXN0PExpc3Q8VD4+IGdldEFsbFBhdGhzVG9EZXN0aW5hdGlvbihUIHNvdXJjZSwgVCBkZXN0aW5hdGlvbikgeworICAgICAgICBMaXN0PExpc3Q8VD4+IHBhdGhzID0gbmV3IEFycmF5TGlzdDw+KCk7CisgICAgICAgIHJlY3Vyc2l2ZShzb3VyY2UsIGRlc3RpbmF0aW9uLCBwYXRocywgbmV3IExpbmtlZEhhc2hTZXQ8VD4oKSk7CisgICAgICAgIHJldHVybiBwYXRoczsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXRzIHRoZSBhbGwgam9pbiBuYW1lcy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBzb3VyY2UgdGhlIHNvdXJjZQorICAgICAqIEBwYXJhbSBkZXN0aW5hdGlvbiB0aGUgZGVzdGluYXRpb24KKyAgICAgKiBAcmV0dXJuIGFsbCBqb2lucworICAgICAqLworICAgIHB1YmxpYyBMaXN0PExpc3Q8U3RyaW5nPj4gZ2V0QWxsSm9pbnNUb0Rlc3RpbmF0aW9uKFQgc291cmNlLCBUIGRlc3RpbmF0aW9uKSB7CisgICAgCUxpc3Q8TGlzdDxUPj4gcGF0aHMgPSBnZXRBbGxQYXRoc1RvRGVzdGluYXRpb24oc291cmNlLCBkZXN0aW5hdGlvbik7CisgICAgICAgIExpc3Q8TGlzdDxTdHJpbmc+PiBqb2lucyA9IG5ldyBBcnJheUxpc3Q8PigpOworICAgICAgICBmb3IoTGlzdDxUPiBvdXRlcjpwYXRocykgeworICAgICAgICAJTGlzdDxTdHJpbmc+IGxpc3QgPSBuZXcgQXJyYXlMaXN0PD4oKTsKKyAgICAgICAgCWpvaW5zLmFkZChsaXN0KTsKKyAgICAgICAgCVQgcHJldmlvdXMgPSBudWxsOworICAgICAgICAJZm9yKFQgaW5uZXI6b3V0ZXIpIHsKKyAgICAgICAgCQlpZihwcmV2aW91cyAhPSBudWxsKSB7CisgICAgICAgIAkJCWxpc3QuYWRkKGdyYXBoLmpvaW5zRnJvbShwcmV2aW91cykuZ2V0KGlubmVyKSk7CisgICAgICAgIAkJfQorICAgICAgIAkJCXByZXZpb3VzID0gaW5uZXI7CisgICAgICAgIAl9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGpvaW5zOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldHMgdGhlIGFsbCBqb2luIG5hbWVzLgorICAgICAqCisgICAgICogQHBhcmFtIHNvdXJjZSB0aGUgc291cmNlCisgICAgICogQHJldHVybiBhbGwgam9pbnMKKyAgICAgKi8KKyAgICBwdWJsaWMgTGlzdDxMaXN0PFN0cmluZz4+IGdldEFsbEpvaW5zKFQgc291cmNlKSB7CisgICAgCUxpc3Q8TGlzdDxUPj4gcGF0aHMgPSBnZXRBbGxQYXRoc1RvRGVzdGluYXRpb24oc291cmNlLCBudWxsKTsKKyAgICAJTGlzdDxMaXN0PFN0cmluZz4+IGpvaW5zID0gbmV3IEFycmF5TGlzdDw+KCk7CisgICAgCWZvcihMaXN0PFQ+IG91dGVyOnBhdGhzKSB7CisgICAgCQlMaXN0PFN0cmluZz4gbGlzdCA9IG5ldyBBcnJheUxpc3Q8PigpOworICAgIAkJam9pbnMuYWRkKGxpc3QpOworICAgIAkJVCBwcmV2aW91cyA9IG51bGw7CisgICAgCQlmb3IoVCBpbm5lcjpvdXRlcikgeworICAgIAkJCWlmKHByZXZpb3VzICE9IG51bGwpIHsKKyAgICAJCQkJbGlzdC5hZGQoZ3JhcGguam9pbnNGcm9tKHByZXZpb3VzKS5nZXQoaW5uZXIpKTsKKyAgICAJCQl9CisgICAgCQkJcHJldmlvdXMgPSBpbm5lcjsKKyAgICAJCX0KKyAgICAJfQorICAgIAlyZXR1cm4gam9pbnM7CisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIEdldHMgdGhlIGFsbCBwYXRocy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBzb3VyY2UgdGhlIHNvdXJjZQorICAgICAqIEByZXR1cm4gdGhlIGFsbCBwYXRocyB1bnRpbCB0aGUgZW5kCisgICAgICovCisgICAgcHVibGljIExpc3Q8TGlzdDxUPj4gZ2V0QWxsUGF0aHMoVCBzb3VyY2UpIHsKKyAgICAJTGlzdDxMaXN0PFQ+PiBwYXRocyA9IG5ldyBBcnJheUxpc3Q8PigpOworICAgIAlyZWN1cnNpdmUoc291cmNlLCBudWxsLCBwYXRocywgbmV3IExpbmtlZEhhc2hTZXQ8VD4oKSk7CisgICAgCXJldHVybiBwYXRoczsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZWN1cnNpdmUuCisgICAgICoKKyAgICAgKiBAcGFyYW0gY3VycmVudCB0aGUgY3VycmVudAorICAgICAqIEBwYXJhbSBwYXRocyB0aGUgcGF0aHMKKyAgICAgKiBAcGFyYW0gcGF0aCB0aGUgcGF0aAorICAgICAqLworICAgIC8vIGN5Y2xlcyBhcmUgaWdub3JlZAorICAgIHByaXZhdGUgdm9pZCByZWN1cnNpdmUgKFQgY3VycmVudCwgVCBkZXN0aW5hdGlvbiwgTGlzdDxMaXN0PFQ+PiBwYXRocywgTGlua2VkSGFzaFNldDxUPiBwYXRoKSB7CisgICAgICAgIHBhdGguYWRkKGN1cnJlbnQpOworCisgICAgICAgIC8vIGN1dCBwYXRoIGlmIGRlc3RpbmF0aW9uIGlzIHJlYWNoZWQKKyAgICAgICAgaWYgKGRlc3RpbmF0aW9uICE9IG51bGwgJiYgY3VycmVudCA9PSBkZXN0aW5hdGlvbikgeworICAgICAgICAgICAgcGF0aHMuYWRkKG5ldyBBcnJheUxpc3Q8VD4ocGF0aCkpOworICAgICAgICAgICAgcGF0aC5yZW1vdmUoY3VycmVudCk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIFNldDxUPiBqb2lucyA9IGdyYXBoLmpvaW5zRnJvbShjdXJyZW50KS5rZXlTZXQoKTsKKworICAgICAgICBib29sZWFuIGhhZFJlY3Vyc2lvbiA9IGZhbHNlOworICAgICAgICBmb3IgKFQgdCA6IGpvaW5zKSB7CisgICAgICAgICAgICBpZiAoIXBhdGguY29udGFpbnModCkpIHsKKyAgICAgICAgICAgICAgICByZWN1cnNpdmUgKHQsIGRlc3RpbmF0aW9uLCBwYXRocywgcGF0aCk7CisgICAgICAgICAgICAgICAgaGFkUmVjdXJzaW9uID0gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAvLyBwcmVmZXIgbG9uZ2VzdCBwYXRocworICAgICAgICBpZihkZXN0aW5hdGlvbiA9PSBudWxsICYmICFoYWRSZWN1cnNpb24pIHsKKyAgICAgICAgCXBhdGhzLmFkZChuZXcgQXJyYXlMaXN0PFQ+KHBhdGgpKTsKKyAgICAgICAgfQorICAgICAgICBwYXRoLnJlbW92ZShjdXJyZW50KTsKKyAgICB9ICAgIAorfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5kYXRhaW50ZXJjaGFuZ2Uvc3JjL29yZy9lY2xpcHNlL29zYnAveHRleHQvZGF0YWludGVyY2hhbmdlL2p2bW1vZGVsL1Rlc3RNYW5hZ2VKb2lucy5qYXZhIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5kYXRhaW50ZXJjaGFuZ2Uvc3JjL29yZy9lY2xpcHNlL29zYnAveHRleHQvZGF0YWludGVyY2hhbmdlL2p2bW1vZGVsL1Rlc3RNYW5hZ2VKb2lucy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE1OTViNTgKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmRhdGFpbnRlcmNoYW5nZS9zcmMvb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9kYXRhaW50ZXJjaGFuZ2UvanZtbW9kZWwvVGVzdE1hbmFnZUpvaW5zLmphdmEKQEAgLTAsMCArMSw5MSBAQAorLyoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICogIENvcHlyaWdodCAoYykgMjAxMSAtIDIwMTggLSBMb2V0eiBHbWJIICYgQ28gS0csIDY5MTE1IEhlaWRlbGJlcmcsIEdlcm1hbnkgCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAqICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzICAgICAgICAgICAKKyAqICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIDIuMCAgICAgICAgCisgKiAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgICAgICAgICAgICAgICAgICAKKyAqICBodHRwczovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAqICBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKiAgSW5pdGlhbCBjb250cmlidXRpb246ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKiAgICAgTG9ldHogR21iSCAmIENvLiBLRyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICogCisgKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2Uub3NicC54dGV4dC5kYXRhaW50ZXJjaGFuZ2UuanZtbW9kZWw7CisKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CitpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlcjsKK2ltcG9ydCBvcmcuc2xmNGouTG9nZ2VyRmFjdG9yeTsKKworLyoqCisgKiBUaGUgQ2xhc3MgVGVzdE1hbmFnZUpvaW5zLgorICovCitwdWJsaWMgY2xhc3MgVGVzdE1hbmFnZUpvaW5zIHsKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2dnZXIgTE9HR0VSID0gTG9nZ2VyRmFjdG9yeS5nZXRMb2dnZXIoVGVzdE1hbmFnZUpvaW5zLmNsYXNzKTsKKwkKKwkvKioKKwkgKiBUZXN0LgorCSAqLworCUBUZXN0CisJcHVibGljIHZvaWQgdGVzdCgpIHsKKwkJSm9pbkdyYXBoPFN0cmluZz4gam9pbkdyYXBoID0gbmV3IEpvaW5HcmFwaDw+KCk7CisJCWpvaW5HcmFwaC5hZGROb2RlKCJBIik7CisJCWpvaW5HcmFwaC5hZGROb2RlKCJCIik7CisJCWpvaW5HcmFwaC5hZGROb2RlKCJDIik7CisJCWpvaW5HcmFwaC5hZGROb2RlKCJEIik7CisKKwkJam9pbkdyYXBoLmFkZEpvaW4oIkEiLCAiQiIsICJhYiIpOworCQlqb2luR3JhcGguYWRkSm9pbigiQSIsICJDIiwgImFjIik7CisJCWpvaW5HcmFwaC5hZGRKb2luKCJCIiwgIkQiLCAiYmQiKTsKKwkJam9pbkdyYXBoLmFkZEpvaW4oIkMiLCAiRCIsICJjZCIpOworCisJCWpvaW5HcmFwaC5hZGRKb2luKCJCIiwgIkMiLCAiYmMiKTsKKwkJam9pbkdyYXBoLmFkZEpvaW4oIkMiLCAiQiIsICJjYiIpOworCisJCU1hbmFnZUpvaW5zPFN0cmluZz4gZmluZEFsbFBhdGhzID0gbmV3IE1hbmFnZUpvaW5zPD4oam9pbkdyYXBoKTsKKwkJTGlzdDxMaXN0PFN0cmluZz4+IHBhdGhzID0gbmV3IEFycmF5TGlzdDw+KCk7CisKKwkJTGlzdDxTdHJpbmc+IHBhdGgxID0gbmV3IEFycmF5TGlzdDw+KCk7CisJCXBhdGgxLmFkZCgiQSIpOworCQlwYXRoMS5hZGQoIkIiKTsKKwkJcGF0aDEuYWRkKCJEIik7CisKKwkJTGlzdDxTdHJpbmc+IHBhdGgyID0gbmV3IEFycmF5TGlzdDw+KCk7CisJCXBhdGgyLmFkZCgiQSIpOworCQlwYXRoMi5hZGQoIkIiKTsKKwkJcGF0aDIuYWRkKCJDIik7CisJCXBhdGgyLmFkZCgiRCIpOworCisJCUxpc3Q8U3RyaW5nPiBwYXRoMyA9IG5ldyBBcnJheUxpc3Q8PigpOworCQlwYXRoMy5hZGQoIkEiKTsKKwkJcGF0aDMuYWRkKCJDIik7CisJCXBhdGgzLmFkZCgiRCIpOworCisJCUxpc3Q8U3RyaW5nPiBwYXRoNCA9IG5ldyBBcnJheUxpc3Q8PigpOworCQlwYXRoNC5hZGQoIkEiKTsKKwkJcGF0aDQuYWRkKCJDIik7CisJCXBhdGg0LmFkZCgiQiIpOworCQlwYXRoNC5hZGQoIkQiKTsKKworCQlwYXRocy5hZGQocGF0aDIpOworCQlwYXRocy5hZGQocGF0aDEpOworCQlwYXRocy5hZGQocGF0aDQpOworCQlwYXRocy5hZGQocGF0aDMpOworCisJCUxPR0dFUi5lcnJvcigiYWxsIHBhdGhzIGZyb20gQSB0byBELS0tLS0tLS0tLS0tLS0tLS0tLS0tLSIpOworCQlmaW5kQWxsUGF0aHMuZ2V0QWxsUGF0aHNUb0Rlc3RpbmF0aW9uKCJBIiwgIkQiKS5zdHJlYW0oKS5mb3JFYWNoKHItPkxPR0dFUi5lcnJvcihyLnRvU3RyaW5nKCkpKTsKKwkJYXNzZXJ0RXF1YWxzKHBhdGhzLCBmaW5kQWxsUGF0aHMuZ2V0QWxsUGF0aHMoIkEiKSk7CisJCUxPR0dFUi5lcnJvcigiYWxsIHBhdGhzIGZyb20gQSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tIik7CisJCWZpbmRBbGxQYXRocy5nZXRBbGxQYXRocygiQSIpLnN0cmVhbSgpLmZvckVhY2goci0+TE9HR0VSLmVycm9yKHIudG9TdHJpbmcoKSkpOworCQlhc3NlcnRFcXVhbHMocGF0aHMsIGZpbmRBbGxQYXRocy5nZXRBbGxQYXRocygiQSIpKTsKKwkJTE9HR0VSLmVycm9yKCJhbGwgam9pbnMgZnJvbSBBIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0iKTsKKwkJZmluZEFsbFBhdGhzLmdldEFsbEpvaW5zKCJBIikuc3RyZWFtKCkuZm9yRWFjaChyLT5MT0dHRVIuZXJyb3Ioci50b1N0cmluZygpKSk7CisJfQorfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5kYXRhaW50ZXJjaGFuZ2Uvc3JjL29yZy9lY2xpcHNlL29zYnAveHRleHQvZGF0YWludGVyY2hhbmdlL3Njb3BpbmcvRGF0YURTTFNjb3BlUHJvdmlkZXIueHRlbmQgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmRhdGFpbnRlcmNoYW5nZS9zcmMvb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9kYXRhaW50ZXJjaGFuZ2Uvc2NvcGluZy9EYXRhRFNMU2NvcGVQcm92aWRlci54dGVuZAppbmRleCBlNGMyMWJkLi5jOGIzOTk3IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmRhdGFpbnRlcmNoYW5nZS9zcmMvb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9kYXRhaW50ZXJjaGFuZ2Uvc2NvcGluZy9EYXRhRFNMU2NvcGVQcm92aWRlci54dGVuZAorKysgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmRhdGFpbnRlcmNoYW5nZS9zcmMvb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9kYXRhaW50ZXJjaGFuZ2Uvc2NvcGluZy9EYXRhRFNMU2NvcGVQcm92aWRlci54dGVuZApAQCAtMyw5ICszLDExIEBACiAgKiAgQ29weXJpZ2h0IChjKSAyMDExLCAyMDE2IC0gTG9ldHogR21iSCZDby5LRyAoNjkxMTUgSGVpZGVsYmVyZywgR2VybWFueSkgCiAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAqICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzICAgICAgICAgICAKLSAqICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgICAgICAgCisgKiAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSAyLjAgICAgICAgIAogICogIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0ICAgICAgICAgICAgICAgICAgCi0gKiAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAqICBodHRwczovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAqICBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgKiAgQ29udHJpYnV0b3JzOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICogCSAgIENocmlzdG9waGUgTG9ldHogKExvZXR6IEdtYkgmQ28uS0cpIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgpAQCAtMjQsNDcgKzI2LDk5IEBACiBpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC5kc2wuc2VtYW50aWMuY29tbW9uLnR5cGVzLkxBdHRyaWJ1dGUKIGltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLmRzbC5zZW1hbnRpYy5jb21tb24udHlwZXMuTFJlZmVyZW5jZQogaW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAuZHNsLnNlbWFudGljLmVudGl0eS5MRW50aXR5CitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC5kc2wuc2VtYW50aWMuZW50aXR5LkxFbnRpdHlBdHRyaWJ1dGUKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLmRzbC5zZW1hbnRpYy5lbnRpdHkuTEVudGl0eUZlYXR1cmUKIGltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLmRzbC5zZW1hbnRpYy5lbnRpdHkuTEVudGl0eVJlZmVyZW5jZQogaW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAueHRleHQuZGF0YWludGVyY2hhbmdlLkRhdGFEU0xQYWNrYWdlCiBpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5kYXRhaW50ZXJjaGFuZ2UuRGF0YUludGVyY2hhbmdlCiBpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5kYXRhaW50ZXJjaGFuZ2UuRGF0YUludGVyY2hhbmdlQmVhbgogaW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAueHRleHQuZGF0YWludGVyY2hhbmdlLkRhdGFJbnRlcmNoYW5nZUVudGl0eUV4cHJlc3Npb24KK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmRhdGFpbnRlcmNoYW5nZS5EYXRhSW50ZXJjaGFuZ2VFeHBvc2UKIGltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmRhdGFpbnRlcmNoYW5nZS5EYXRhSW50ZXJjaGFuZ2VMb29rdXAKIGltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmRhdGFpbnRlcmNoYW5nZS5EYXRhSW50ZXJjaGFuZ2VNYXJrZXJFbnRpdHkKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmRhdGFpbnRlcmNoYW5nZS5FbnRpdHlNYW5hZ2VyTW9kZQogaW1wb3J0IG9yZy5lY2xpcHNlLnh0ZXh0LnJlc291cmNlLkVPYmplY3REZXNjcmlwdGlvbgogaW1wb3J0IG9yZy5lY2xpcHNlLnh0ZXh0LnJlc291cmNlLklFT2JqZWN0RGVzY3JpcHRpb24KIGltcG9ydCBvcmcuZWNsaXBzZS54dGV4dC5zY29waW5nLklTY29wZQogaW1wb3J0IG9yZy5lY2xpcHNlLnh0ZXh0LnNjb3BpbmcuaW1wbC5NYXBCYXNlZFNjb3BlCitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC5kc2wuZW50aXR5Lnh0ZXh0LnNlcnZpY2VzLkVudGl0eUdyYW1tYXJHcmFtbWFyQWNjZXNzLkVudGl0eU1vZGVsRWxlbWVudHMKIAogY2xhc3MgRGF0YURTTFNjb3BlUHJvdmlkZXIgZXh0ZW5kcyBBYnN0cmFjdERhdGFEU0xTY29wZVByb3ZpZGVyIHsKIAlASW5qZWN0IGV4dGVuc2lvbiBNb2RlbEV4dGVuc2lvbnMKIAogCW92ZXJyaWRlIGdldFNjb3BlKEVPYmplY3QgY29udGV4dCwgRVJlZmVyZW5jZSByZWZlcmVuY2UpIHsKIAkJaWYgKHJlZmVyZW5jZSA9PSBEYXRhRFNMUGFja2FnZS5MaXRlcmFscy5EQVRBX0lOVEVSQ0hBTkdFX0JFQU5fX0xBVEVTVF9QUk9QRVJUWSkgeworCQkJCiAJCQlyZXR1cm4gZ2V0U2NvcGVfRGF0YV9FbnRpdHlfbGF0ZXN0KGNvbnRleHQsIHJlZmVyZW5jZSkKLQkJfSBlbHNlIGlmIChyZWZlcmVuY2UgPT0gRGF0YURTTFBhY2thZ2UuTGl0ZXJhbHMuREFUQV9JTlRFUkNIQU5HRV9FWFBSRVNTSU9OX19UQVJHRVRfUFJPUEVSVFkpIHsKKwkJCQorCQl9IGVsc2UgaWYgKHJlZmVyZW5jZSA9PSBEYXRhRFNMUGFja2FnZS5MaXRlcmFscy5EQVRBX0lOVEVSQ0hBTkdFX0JFQU5fX0xBVEVTVF9FWFBfUFJPUEVSVFkpIHsKKwkJCQorCQkJcmV0dXJuIGdldFNjb3BlX0RhdGFfRW50aXR5X2xhdGVzdChjb250ZXh0LCByZWZlcmVuY2UpCisJCQkKKwkJfQorCQllbHNlIGlmIChyZWZlcmVuY2UgPT0gRGF0YURTTFBhY2thZ2UuTGl0ZXJhbHMuREFUQV9JTlRFUkNIQU5HRV9GSUxURVJfQ09ORElUSU9OX19SRUZfUFJPUEVSVFkpewkJCQkKKwkJCXJldHVybiBnZXRTY29wZV9EYXRhX0V4cG9ydEZpbHRlckF0dHJpYnV0ZXNfZW50aXR5KGNvbnRleHQsIHJlZmVyZW5jZSkJCQkKKwkJfQorCQllbHNlIGlmIChyZWZlcmVuY2UgPT0gRGF0YURTTFBhY2thZ2UuTGl0ZXJhbHMuREFUQV9JTlRFUkNIQU5HRV9FWFBPUlRfSElERV9fUFJPUEVSVFkpICB7CisJCQlyZXR1cm4gZ2V0U2NvcGVfRGF0YV9FeHBvcnRGaWx0ZXJBdHRyaWJ1dGVzX2hpZGUoY29udGV4dCwgcmVmZXJlbmNlKQorCQl9CisJCWVsc2UgaWYgKHJlZmVyZW5jZSA9PSBEYXRhRFNMUGFja2FnZS5MaXRlcmFscy5EQVRBX0lOVEVSQ0hBTkdFX0ZJTFRFUl9DT05ESVRJT05fX09QRVJBVE9SMikgIHsKKwkJCXJldHVybiBnZXRTY29wZV9EYXRhX0V4cG9ydEZpbHRlckF0dHJpYnV0ZXNfZW50aXR5KGNvbnRleHQsIHJlZmVyZW5jZSkKKwkJfQorCQllbHNlIGlmIChyZWZlcmVuY2UgPT0gRGF0YURTTFBhY2thZ2UuTGl0ZXJhbHMuREFUQV9JTlRFUkNIQU5HRV9FWFBSRVNTSU9OX19UQVJHRVRfUFJPUEVSVFkpIHsKKwkJCQogCQkJcmV0dXJuIGdldFNjb3BlX0RhdGFfVGFyZ2V0X3Byb3BlcnR5KGNvbnRleHQsIHJlZmVyZW5jZSwgdHJ1ZSkKKwkJCQogCQl9IGVsc2UgaWYgKHJlZmVyZW5jZSA9PSBEYXRhRFNMUGFja2FnZS5MaXRlcmFscy5EQVRBX0lOVEVSQ0hBTkdFX0ZPUk1BVF9fVEFSR0VUX1BST1BFUlRZKSB7CisJCQkKIAkJCXJldHVybiBnZXRTY29wZV9EYXRhX1RhcmdldF9wcm9wZXJ0eShjb250ZXh0LCByZWZlcmVuY2UsIHRydWUpCisJCQkKIAkJfSBlbHNlIGlmIChyZWZlcmVuY2UgPT0gRGF0YURTTFBhY2thZ2UuTGl0ZXJhbHMuREFUQV9JTlRFUkNIQU5HRV9FTlRJVFlfRVhQUkVTU0lPTl9fUFJPUEVSVFkpIHsKKwkJCQogCQkJcmV0dXJuIGdldFNjb3BlX0RhdGFfRXhwcmVzc2lvbl9lbnRpdHkoY29udGV4dCwgcmVmZXJlbmNlLCBmYWxzZSkKKwkJCQogCQl9IGVsc2UgaWYgKHJlZmVyZW5jZSA9PSBEYXRhRFNMUGFja2FnZS5MaXRlcmFscy5EQVRBX0lOVEVSQ0hBTkdFX0xPT0tVUF9fVEFSR0VUX1BST1BFUlRZKSB7CisJCQkKIAkJCXJldHVybiBnZXRTY29wZV9EYXRhX1RhcmdldF9wcm9wZXJ0eShjb250ZXh0LCByZWZlcmVuY2UsIGZhbHNlKQorCQkJCiAJCX0gZWxzZSBpZiAocmVmZXJlbmNlID09IERhdGFEU0xQYWNrYWdlLkxpdGVyYWxzLkRBVEFfSU5URVJDSEFOR0VfTE9PS1VQX19RVUVSWV9QUk9QRVJUWSkgeworCQkJCiAJCQlyZXR1cm4gZ2V0U2NvcGVfRGF0YV9Mb29rdXBfcXVlcnlQcm9wZXJ0eShjb250ZXh0LCByZWZlcmVuY2UpCisJCQkKIAkJfSBlbHNlIGlmIChyZWZlcmVuY2UgPT0gRGF0YURTTFBhY2thZ2UuTGl0ZXJhbHMuREFUQV9JTlRFUkNIQU5HRV9MT09LVVBfX0VOVElUWSkgeworCQkJCiAJCQlyZXR1cm4gZ2V0U2NvcGVfRGF0YV9Mb29rdXBfbG9va3VwRW50aXR5KGNvbnRleHQsIHJlZmVyZW5jZSkKKwkJCQorCQl9IGVsc2UgaWYgKHJlZmVyZW5jZSA9PSBEYXRhRFNMUGFja2FnZS5MaXRlcmFscy5EQVRBX0lOVEVSQ0hBTkdFX0VYUE9TRV9fUkVGX0VOVElUWSl7CisJCQkKKwkJCXJldHVybiBnZXRTY29wZV9EYXRhX0V4cG9zZV9lbnRpdHkoY29udGV4dCwgcmVmZXJlbmNlKQorCQkJCisJCX0gZWxzZSBpZiAocmVmZXJlbmNlID09IERhdGFEU0xQYWNrYWdlLkxpdGVyYWxzLkRBVEFfSU5URVJDSEFOR0VfRVhQT1NFX19SRUZfUFJPUEVSVFkpIHsKKwkJCQorCQkJcmV0dXJuIGdldFNjb3BlX0RhdGFfRXhwb3NlX3F1ZXJ5UHJvcGVydHkoY29udGV4dCwgcmVmZXJlbmNlKQorCiAJCX0gZWxzZSBpZiAocmVmZXJlbmNlID09IERhdGFEU0xQYWNrYWdlLkxpdGVyYWxzLkRBVEFfSU5URVJDSEFOR0VfTUFQUElOR19fUFJPUEVSVFkpIHsKKwkJCQogCQkJcmV0dXJuIGdldFNjb3BlX0RhdGFfVGFyZ2V0X3Byb3BlcnR5KGNvbnRleHQsIHJlZmVyZW5jZSwgdHJ1ZSkKKwkJCQogCQl9IGVsc2UgaWYgKHJlZmVyZW5jZSA9PSBEYXRhRFNMUGFja2FnZS5MaXRlcmFscy5EQVRBX0lOVEVSQ0hBTkdFX01BUktFUl9FTlRJVFlfX01BUktFUl9FTlRJVFkpIHsKKwkJCQogCQkJcmV0dXJuIGdldFNjb3BlX0RhdGFfTWFya2VycGF0aF9lbnRpdHkoY29udGV4dCwgcmVmZXJlbmNlKQorCQkJCiAJCX0gZWxzZSBpZiAocmVmZXJlbmNlID09IERhdGFEU0xQYWNrYWdlLkxpdGVyYWxzLkRBVEFfSU5URVJDSEFOR0VfTUFSS0VSX0VOVElUWV9fTUFSS0VSX1BST1BFUlRZKSB7CisJCQkKIAkJCXJldHVybiBnZXRTY29wZV9EYXRhX0VudGl0eV9sYXRlc3QoY29udGV4dCwgcmVmZXJlbmNlKQorCQkJCiAJCX0gZWxzZSBpZiAocmVmZXJlbmNlID09IERhdGFEU0xQYWNrYWdlLkxpdGVyYWxzLkRBVEFfSU5URVJDSEFOR0VfQkVBTl9fRU5USVRZKSB7CisJCQkKIAkJCXJldHVybiBnZXRTY29wZV9EYXRhX0VudGl0eV9uZXh0KGNvbnRleHQsIHJlZmVyZW5jZSkKKwkJCQogCQl9IGVsc2UgaWYgKHJlZmVyZW5jZSA9PSBEYXRhRFNMUGFja2FnZS5MaXRlcmFscy5EQVRBX0lOVEVSQ0hBTkdFX0tFWV9fUFJPUEVSVFkpIHsKKwkJCQogCQkJcmV0dXJuIGdldFNjb3BlX2tleVByb3BlcnR5KGNvbnRleHQsIHJlZmVyZW5jZSkKKwkJCQogCQl9IGVsc2UgeworCQkJCiAJCQlzdXBlci5nZXRTY29wZShjb250ZXh0LCByZWZlcmVuY2UpCiAJCX0KIAl9CkBAIC05Myw3ICsxNDcsNyBAQAogCQkJCQkvLyBzY29waW5nIHJlZmVycyB0byB0aGUgcHJldmlvdXMgb3duZXIKIAkJCQkJZm9yIChmIDogcHJldmlvdXNFbnRpdHkuZW50aXR5LmZlYXR1cmVzKSB7CiAJCQkJCQlpZiAoZiBpbnN0YW5jZW9mIExSZWZlcmVuY2UpIHsKLQkJCQkJCQlpZiAoZi5jYXNjYWRpbmcgJiYgZi50b01hbnkpIHsKKwkJCQkJCQlpZiAoZi50b01hbnkpIHsKIAkJCQkJCQkJdmFyIHJlZiA9IChmIGFzIExFbnRpdHlSZWZlcmVuY2UpCiAJCQkJCQkJCXJlc3VsdC5hZGQoRU9iamVjdERlc2NyaXB0aW9uLmNyZWF0ZShyZWYudHlwZS50b05hbWUsIHJlZi50eXBlKSkKIAkJCQkJCQl9CkBAIC0xNTAsNiArMjA0LDggQEAKIAkJfQogCQlyZXR1cm4gTWFwQmFzZWRTY29wZS5jcmVhdGVTY29wZShJU2NvcGUuTlVMTFNDT1BFLCByZXN1bHQpCiAJfQorCQorCiAKIAlkZWYgZ2V0U2NvcGVfRGF0YV9FeHByZXNzaW9uX2VudGl0eShFT2JqZWN0IGNvbnRleHQsIEVSZWZlcmVuY2UgcmVmZXJlbmNlLCBib29sZWFuIGZpbHRlckVudGl0eSkgewogCQl2YXIgcmVzdWx0ID0gPElFT2JqZWN0RGVzY3JpcHRpb24+bmV3QXJyYXlMaXN0CkBAIC0yMDEsNiArMjU3LDM2IEBACiAJCX0KIAkJcmV0dXJuIE1hcEJhc2VkU2NvcGUuY3JlYXRlU2NvcGUoSVNjb3BlLk5VTExTQ09QRSwgcmVzdWx0KQogCX0KKwkKKwlkZWYgZ2V0U2NvcGVfRGF0YV9FeHBvc2VfZW50aXR5KEVPYmplY3QgY29udGV4dCwgRVJlZmVyZW5jZSByZWZlcmVuY2UpIHsKKwkJdmFyIHJlc3VsdCA9IDxJRU9iamVjdERlc2NyaXB0aW9uPm5ld0FycmF5TGlzdAorCQl2YXIgZU9iaiA9IGNvbnRleHQuZUNvbnRhaW5lcgorCQl2YXIgTEVudGl0eSBlbnRpdHkKKwkJaWYoZU9iaiBpbnN0YW5jZW9mIERhdGFJbnRlcmNoYW5nZUJlYW4peworCQkJZW50aXR5ID0gZU9iai5lbnRpdHkKKwkJfWVsc2UgaWYoZU9iaiBpbnN0YW5jZW9mIERhdGFJbnRlcmNoYW5nZUV4cG9zZSl7CisJCQllbnRpdHkgPSAoZU9iaiBhcyBEYXRhSW50ZXJjaGFuZ2VFeHBvc2UpLnJlZkVudGl0eS50eXBlCisJCX0KKwkJaWYgKGVudGl0eSAhPT0gbnVsbCkgeworCQkJZm9yIChwcm9wIDogZW50aXR5LmFsbFJlZmVyZW5jZXMpIHsKKwkJCQlpZiAoIXByb3AudG9NYW55KSB7CisJCQkJCXJlc3VsdC5hZGQoRU9iamVjdERlc2NyaXB0aW9uLmNyZWF0ZSgocHJvcCBhcyBMUmVmZXJlbmNlKS5uYW1lLCAocHJvcCBhcyBMUmVmZXJlbmNlKSkpCisJCQkJfQorCQkJfQorCQl9CisJCXJldHVybiBNYXBCYXNlZFNjb3BlLmNyZWF0ZVNjb3BlKElTY29wZS5OVUxMU0NPUEUsIHJlc3VsdCkKKwl9CisJCisJZGVmIGdldFNjb3BlX0RhdGFfRXhwb3NlX3F1ZXJ5UHJvcGVydHkoRU9iamVjdCBjb250ZXh0LCBFUmVmZXJlbmNlIHJlZmVyZW5jZSkgeworCQl2YWwgcmVzdWx0ID0gPElFT2JqZWN0RGVzY3JpcHRpb24+bmV3QXJyYXlMaXN0CisJCWlmIChjb250ZXh0ICE9PSBudWxsICYmIGNvbnRleHQgaW5zdGFuY2VvZiBEYXRhSW50ZXJjaGFuZ2VFeHBvc2UpIHsKKwkJCXZhciBlbnRpdHkgPSAoY29udGV4dCBhcyBEYXRhSW50ZXJjaGFuZ2VFeHBvc2UpLnJlZkVudGl0eS5nZXRUeXBlCisJCQlpZihlbnRpdHkgIT09IG51bGwpeworCQkJCWVudGl0eS5hbGxBdHRyaWJ1dGVzLmZvckVhY2hbcmVzdWx0LmFkZChFT2JqZWN0RGVzY3JpcHRpb24uY3JlYXRlKGl0Lm5hbWUsIGl0KSldCisJCQl9CisJCX0KKwkJcmV0dXJuIE1hcEJhc2VkU2NvcGUuY3JlYXRlU2NvcGUoSVNjb3BlLk5VTExTQ09QRSwgcmVzdWx0KQorCX0KIAogCWRlZiBnZXRTY29wZV9EYXRhX0VudGl0eV9sYXRlc3QoRU9iamVjdCBjb250ZXh0LCBFUmVmZXJlbmNlIHJlZmVyZW5jZSkgewogCQl2YXIgcmVzdWx0ID0gPElFT2JqZWN0RGVzY3JpcHRpb24+bmV3QXJyYXlMaXN0CkBAIC0yNDEsNyArMzI3LDcgQEAKIAkJCXJldHVybiBzdXBlci5nZXRTY29wZShjb250ZXh0LCByZWZlcmVuY2UpCiAJCX0KIAkJcm9vdE9iamVjdHMuZm9yRWFjaFsKLQkJCWl0LmFsbFJlZmVyZW5jZXMuZmlsdGVyKGl0fGl0LnRvTWFueSAmJiBpdC5jYXNjYWRpbmcgJiYgIXJvb3RPYmplY3RzLmNvbnRhaW5zKGl0LnR5cGUpKS5mb3JFYWNoWworCQkJaXQuYWxsUmVmZXJlbmNlcy5maWx0ZXIoaXR8aXQudG9NYW55ICYmICFyb290T2JqZWN0cy5jb250YWlucyhpdC50eXBlKSkuZm9yRWFjaFsKIAkJCQlyZXN1bHQuYWRkKEVPYmplY3REZXNjcmlwdGlvbi5jcmVhdGUoaXQudHlwZS5uYW1lLCBpdC50eXBlKSkKIAkJCV0KIAkJXQpAQCAtMjY0LDQgKzM1MCw1NSBAQAogCQl9CiAJCXJldHVybiBNYXBCYXNlZFNjb3BlLmNyZWF0ZVNjb3BlKElTY29wZS5OVUxMU0NPUEUsIHJlc3VsdCkKIAl9CisJCisJZGVmIGdldFNjb3BlX0RhdGFfRXhwb3J0RmlsdGVyQXR0cmlidXRlc19lbnRpdHkoRU9iamVjdCBjb250ZXh0LCBFUmVmZXJlbmNlIHJlZmVyZW5jZSkgeworCQl2YXIgcmVzdWx0ID0gPElFT2JqZWN0RGVzY3JpcHRpb24+bmV3QXJyYXlMaXN0CisJCXZhciBlT2JqID0gY29udGV4dC5lQ29udGFpbmVyCisJCXdoaWxlICghKGVPYmogaW5zdGFuY2VvZiBEYXRhSW50ZXJjaGFuZ2VCZWFuKSkgeworCQkJZU9iaiA9IGVPYmouZUNvbnRhaW5lcgorCQl9CisJCWlmIChlT2JqICE9PSBudWxsKSB7CisJCQl2YXIgZW50aXR5ID0gKGVPYmogYXMgRGF0YUludGVyY2hhbmdlQmVhbikuZW50aXR5CisJCQl2YXIgbWFya2VyID0gKGVPYmogYXMgRGF0YUludGVyY2hhbmdlQmVhbikubGF0ZXN0UHJvcGVydHkKKwkJCQorCQkJZm9yIChwcm9wIDogZW50aXR5LmFsbEZlYXR1cmVzKSB7CisJCQkJaWYocHJvcCBpbnN0YW5jZW9mIExFbnRpdHlBdHRyaWJ1dGUgJiYgKG1hcmtlciA9PT0gbnVsbCB8fCAhcHJvcC50b05hbWUuZXF1YWxzKG1hcmtlci50b05hbWUpKSkgeworCQkJCQlyZXN1bHQuYWRkKEVPYmplY3REZXNjcmlwdGlvbi5jcmVhdGUoKHByb3AgYXMgTEVudGl0eUZlYXR1cmUpLm5hbWUsIChwcm9wIGFzIExBdHRyaWJ1dGUpKSkKKwkJCQl9CisJCQkJZWxzZSBpZihwcm9wIGluc3RhbmNlb2YgTEVudGl0eVJlZmVyZW5jZSAmJiAhcHJvcC50b01hbnkpIHsKKwkJCQkJcmVzdWx0LmFkZChFT2JqZWN0RGVzY3JpcHRpb24uY3JlYXRlKChwcm9wIGFzIExFbnRpdHlGZWF0dXJlKS5uYW1lLCAocHJvcCBhcyBMUmVmZXJlbmNlKSkpCisJCQkJfQorCQkJfQorCQl9CisJCXJldHVybiBNYXBCYXNlZFNjb3BlLmNyZWF0ZVNjb3BlKElTY29wZS5OVUxMU0NPUEUsIHJlc3VsdCkKKwl9CisJZGVmIGdldFNjb3BlX0RhdGFfRXhwb3J0RmlsdGVyQXR0cmlidXRlc19oaWRlKEVPYmplY3QgY29udGV4dCwgRVJlZmVyZW5jZSByZWZlcmVuY2UpIHsKKwkJdmFyIHJlc3VsdCA9IDxJRU9iamVjdERlc2NyaXB0aW9uPm5ld0FycmF5TGlzdAorCQl2YXIgZU9iaiA9IGNvbnRleHQuZUNvbnRhaW5lcgorCQl3aGlsZSAoIShlT2JqIGluc3RhbmNlb2YgRGF0YUludGVyY2hhbmdlQmVhbikpIHsKKwkJCWVPYmogPSBlT2JqLmVDb250YWluZXIKKwkJfQorCQlpZiAoZU9iaiAhPT0gbnVsbCkgeworCQkJdmFyIGVudGl0eSA9IChlT2JqIGFzIERhdGFJbnRlcmNoYW5nZUJlYW4pLmVudGl0eQorCQkJdmFyIG1hcmtlciA9IChlT2JqIGFzIERhdGFJbnRlcmNoYW5nZUJlYW4pLmxhdGVzdFByb3BlcnR5CisJCQl2YXIgRW50aXR5TWFuYWdlck1vZGUgbW9kZTsKKwkJCWlmKGVPYmouZUNvbnRhaW5lciBpbnN0YW5jZW9mIERhdGFJbnRlcmNoYW5nZSl7CisJCQkJbW9kZSA9IChlT2JqLmVDb250YWluZXIgYXMgRGF0YUludGVyY2hhbmdlKS5tb2RlCisJCQl9CisJCQlmb3IgKHByb3AgOiBlbnRpdHkuYWxsRmVhdHVyZXMpIHsKKwkJCQlpZihwcm9wIGluc3RhbmNlb2YgTEVudGl0eUF0dHJpYnV0ZSAmJiAobWFya2VyID09PSBudWxsIHx8ICFwcm9wLnRvTmFtZS5lcXVhbHMobWFya2VyLnRvTmFtZSkpKSB7CisJCQkJCWlmKG1vZGUuZXF1YWxzKEVudGl0eU1hbmFnZXJNb2RlLlBFUlNJU1QpICYmIHByb3AuaXNVVUlEIHx8IChwcm9wIGFzIExFbnRpdHlBdHRyaWJ1dGUpLmlzSWQpeworCQkJCQkJLy8gZG8gbm90aGluZworCQkJCQl9ZWxzZXsKKwkJCQkJCXJlc3VsdC5hZGQoRU9iamVjdERlc2NyaXB0aW9uLmNyZWF0ZSgocHJvcCBhcyBMRW50aXR5RmVhdHVyZSkubmFtZSwgKHByb3AgYXMgTEF0dHJpYnV0ZSkpKQorCQkJCQl9CisJCQkJfQorCQkJCWVsc2UgaWYocHJvcCBpbnN0YW5jZW9mIExFbnRpdHlSZWZlcmVuY2UgJiYgIXByb3AudG9NYW55KSB7CisJCQkJCXJlc3VsdC5hZGQoRU9iamVjdERlc2NyaXB0aW9uLmNyZWF0ZSgocHJvcCBhcyBMRW50aXR5RmVhdHVyZSkubmFtZSwgKHByb3AgYXMgTFJlZmVyZW5jZSkpKQorCQkJCX0KKwkJCX0KKwkJfQorCQlyZXR1cm4gTWFwQmFzZWRTY29wZS5jcmVhdGVTY29wZShJU2NvcGUuTlVMTFNDT1BFLCByZXN1bHQpCisJfQorCiB9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmRhdGFpbnRlcmNoYW5nZS9zcmMvb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9kYXRhaW50ZXJjaGFuZ2UvdmFsaWRhdGlvbi9EYXRhRFNMVmFsaWRhdG9yLnh0ZW5kIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5kYXRhaW50ZXJjaGFuZ2Uvc3JjL29yZy9lY2xpcHNlL29zYnAveHRleHQvZGF0YWludGVyY2hhbmdlL3ZhbGlkYXRpb24vRGF0YURTTFZhbGlkYXRvci54dGVuZAppbmRleCA4MTE5NGI0Li5jYjhiNDhlIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmRhdGFpbnRlcmNoYW5nZS9zcmMvb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9kYXRhaW50ZXJjaGFuZ2UvdmFsaWRhdGlvbi9EYXRhRFNMVmFsaWRhdG9yLnh0ZW5kCisrKyBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQuZGF0YWludGVyY2hhbmdlL3NyYy9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2RhdGFpbnRlcmNoYW5nZS92YWxpZGF0aW9uL0RhdGFEU0xWYWxpZGF0b3IueHRlbmQKQEAgLTMsNiArMywxMCBAQAogICovCiBwYWNrYWdlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQuZGF0YWludGVyY2hhbmdlLnZhbGlkYXRpb24KIAoraW1wb3J0IG9yZy5lY2xpcHNlLnh0ZXh0LnZhbGlkYXRpb24uQ2hlY2sKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmRhdGFpbnRlcmNoYW5nZS5Db25kaXRpb25BbmRPcGVyYXRvcjEKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmRhdGFpbnRlcmNoYW5nZS5EYXRhRFNMUGFja2FnZQoraW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAueHRleHQuZGF0YWludGVyY2hhbmdlLkRhdGFJbnRlcmNoYW5nZUZpbHRlckNvbmRpdGlvbgogCiAvKioKICAqIFRoaXMgY2xhc3MgY29udGFpbnMgY3VzdG9tIHZhbGlkYXRpb24gcnVsZXMuIApAQCAtMjIsNCArMjYsMjEgQEAKIC8vCQl9CiAvLwl9CiAJCisJQENoZWNrCisJZGVmIGNoZWNrRmlsdGVyQ29uZGl0aW9uVmFsaWRpdHkoRGF0YUludGVyY2hhbmdlRmlsdGVyQ29uZGl0aW9uIGNvbmRpdGlvbil7CisJCWlmKGNvbmRpdGlvbiAhPT0gbnVsbCAmJiBjb25kaXRpb24uZ2V0UmVmUHJvcGVydHkgIT09IG51bGwgJiYgY29uZGl0aW9uLmdldE9wZXJhdG9yICE9PSBudWxsKXsKKwkJCQorCQkJaWYoY29uZGl0aW9uLmdldE9wZXJhdG9yLmVxdWFscyhDb25kaXRpb25BbmRPcGVyYXRvcjEuSVNOT1ROVUxMKSAKKwkJCXx8IGNvbmRpdGlvbi5nZXRPcGVyYXRvci5lcXVhbHMoQ29uZGl0aW9uQW5kT3BlcmF0b3IxLklTTlVMTCkpeworCQkJCWlmKGNvbmRpdGlvbi5nZXRWYWx1ZSAhPT0gbnVsbCAmJiAhY29uZGl0aW9uLmdldFZhbHVlLmVtcHR5KXsKKwkJCQkJZXJyb3IoIm5vIHZhbHVlIG9wdGlvbiBleHBlY3RlZC9hbGxvd2VkIGZvciB0aGlzIGNvbmRpdGlvbi4iLCBEYXRhRFNMUGFja2FnZS5MaXRlcmFscy5EQVRBX0lOVEVSQ0hBTkdFX0ZJTFRFUl9DT05ESVRJT05fX1ZBTFVFLCBjb25kaXRpb24uZ2V0VmFsdWUpCisJCQkJfQorCQkJfQorCQkJZWxzZSBpZihjb25kaXRpb24uZ2V0VmFsdWUgPT09IG51bGwgJiYgIShjb25kaXRpb24uZ2V0T3BlcmF0b3IuZXF1YWxzKENvbmRpdGlvbkFuZE9wZXJhdG9yMS5JU05PVE5VTEwpIAorCQkJfHwgY29uZGl0aW9uLmdldE9wZXJhdG9yLmVxdWFscyhDb25kaXRpb25BbmRPcGVyYXRvcjEuSVNOVUxMKSkpeworCQkJCWVycm9yKCJ2YWx1ZSBvcHRpb24gbWlzc2luZyBmb3IgdGhpcyBjb25kaXRpb24uIiwgRGF0YURTTFBhY2thZ2UuTGl0ZXJhbHMuREFUQV9JTlRFUkNIQU5HRV9GSUxURVJfQ09ORElUSU9OX19WQUxVRSwgY29uZGl0aW9uLmdldFZhbHVlKQorCQkJfQorCQkJLy9ubyB2YWx1ZSBuZWVkZWQKKwkJfQorCX0KIH0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLm9zYnAueHRleHQuZGF0YWludGVyY2hhbmdlL3NyYy9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2RhdGFpbnRlcmNoYW5nZS92YWx1ZWNvbnZlcnRlci9EYXRhRFNMUXVhbGlmaWVkTmFtZVByb3ZpZGVyLmphdmEgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmRhdGFpbnRlcmNoYW5nZS9zcmMvb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9kYXRhaW50ZXJjaGFuZ2UvdmFsdWVjb252ZXJ0ZXIvRGF0YURTTFF1YWxpZmllZE5hbWVQcm92aWRlci5qYXZhCmluZGV4IDYwZjIyYzIuLjc1MzljNWUgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLm9zYnAueHRleHQuZGF0YWludGVyY2hhbmdlL3NyYy9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2RhdGFpbnRlcmNoYW5nZS92YWx1ZWNvbnZlcnRlci9EYXRhRFNMUXVhbGlmaWVkTmFtZVByb3ZpZGVyLmphdmEKKysrIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5kYXRhaW50ZXJjaGFuZ2Uvc3JjL29yZy9lY2xpcHNlL29zYnAveHRleHQvZGF0YWludGVyY2hhbmdlL3ZhbHVlY29udmVydGVyL0RhdGFEU0xRdWFsaWZpZWROYW1lUHJvdmlkZXIuamF2YQpAQCAtMyw5ICszLDExIEBACiAgKiAgQ29weXJpZ2h0IChjKSAyMDExLCAyMDE2IC0gTG9ldHogR21iSCZDby5LRyAoNjkxMTUgSGVpZGVsYmVyZywgR2VybWFueSkgCiAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAqICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzICAgICAgICAgICAKLSAqICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgICAgICAgCisgKiAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSAyLjAgICAgICAgIAogICogIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0ICAgICAgICAgICAgICAgICAgCi0gKiAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAqICBodHRwczovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAqICBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgKiAgQ29udHJpYnV0b3JzOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICogCSAgIENocmlzdG9waGUgTG9ldHogKExvZXR6IEdtYkgmQ28uS0cpIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5kYXRhaW50ZXJjaGFuZ2Uvc3JjL29yZy9lY2xpcHNlL29zYnAveHRleHQvZGF0YWludGVyY2hhbmdlL3ZhbHVlY29udmVydGVyL0RhdGFEU0xWYWx1ZUNvbnZlcnRlclNlcnZpY2UuamF2YSBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQuZGF0YWludGVyY2hhbmdlL3NyYy9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2RhdGFpbnRlcmNoYW5nZS92YWx1ZWNvbnZlcnRlci9EYXRhRFNMVmFsdWVDb252ZXJ0ZXJTZXJ2aWNlLmphdmEKaW5kZXggNDAyMGMzMC4uODVmOTk1YiAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5kYXRhaW50ZXJjaGFuZ2Uvc3JjL29yZy9lY2xpcHNlL29zYnAveHRleHQvZGF0YWludGVyY2hhbmdlL3ZhbHVlY29udmVydGVyL0RhdGFEU0xWYWx1ZUNvbnZlcnRlclNlcnZpY2UuamF2YQorKysgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmRhdGFpbnRlcmNoYW5nZS9zcmMvb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9kYXRhaW50ZXJjaGFuZ2UvdmFsdWVjb252ZXJ0ZXIvRGF0YURTTFZhbHVlQ29udmVydGVyU2VydmljZS5qYXZhCkBAIC0xLDkgKzEsMTEgQEAKIC8qKgogICogQ29weXJpZ2h0IChjKSAyMDExLCAyMDE2IC0gTG9ldHogR21iSCZDby5LRyAoNjkxMTUgSGVpZGVsYmVyZywgR2VybWFueSkKICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSAyLjAgCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqIGh0dHBzOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAvCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAKICAqIAogICogQ29udHJpYnV0b3JzOgogICogCQlDaHJpc3RvcGhlIExvZXR6IC0gSW5pdGlhbCBpbXBsZW1lbnRhdGlvbgpkaWZmIC0tZ2l0IGEvcG9tLnhtbCBiL3BvbS54bWwKaW5kZXggYWFhMThlOS4uMTJiNTdiNCAxMDA2NDQKLS0tIGEvcG9tLnhtbAorKysgYi9wb20ueG1sCkBAIC0yLDkgKzIsMTEgQEAKIDwhLS0jPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+CiA8IS0tIyBDb3B5cmlnaHQgKGMpIDIwMTEsIDIwMTYgLSBMb2V0eiBHbWJIJkNvLktHICg2OTExNSBIZWlkZWxiZXJnLCBHZXJtYW55KS4gLS0+CiA8IS0tIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIC0tPgotPCEtLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIC0tPgorPCEtLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSAyLjAgIC0tPgogPCEtLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgLS0+Ci08IS0tIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCAtLT4KKzwhLS0jIGh0dHBzOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAvICAgIC0tPgorPCEtLSMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+Cis8IS0tIyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCAgICAgICAgICAtLT4KIDwhLS0jIC0tPgogPCEtLSMgQ29udHJpYnV0b3JzOiAtLT4KIDwhLS0jIENocmlzdG9waGUgTG9ldHogIChMb2V0eiBHbWJIJkNvLktHKSAtIEluaXRpYWwgaW1wbGVtZW50YXRpb24gQVBJIGFuZCBpbXBsZW1lbnRhdGlvbiAtLT4K