ZGlmZiAtLWdpdCBhLy5naXRpZ25vcmUgYi8uZ2l0aWdub3JlCmluZGV4IGJiZjMxM2IuLjY0MTU5MjcgMTAwNjQ0Ci0tLSBhLy5naXRpZ25vcmUKKysrIGIvLmdpdGlnbm9yZQpAQCAtMzAsMyArMzAsNyBAQAogCiAjIERlYnVnIGZpbGVzCiAqLmRTWU0vCisKKyp+CitEZWJ1ZworUmVsZWFzZQpkaWZmIC0tZ2l0IGEvc3JjL0Nvc2UuYyBiL3NyYy9Db3NlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWI2NzFlMQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9Db3NlLmMKQEAgLTAsMCArMSwxNTIgQEAKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxtZW1vcnkuaD4KKworI2luY2x1ZGUgImNvc2UuaCIKKyNpbmNsdWRlICJjb3NlX2ludC5oIgorI2luY2x1ZGUgImNvbmZpZ3VyZS5oIgorI2luY2x1ZGUgImNyeXB0by5oIgorCitib29sIElzVmFsaWRDT1NFSGFuZGxlKEhDT1NFIGgpCit7CisJQ09TRV9FbmNyeXB0ICogcCA9IChDT1NFX0VuY3J5cHQgKiloOworCWlmIChwID09IE5VTEwpIHJldHVybiBmYWxzZTsKKwlyZXR1cm4gdHJ1ZTsKK30KKworCitib29sIF9DT1NFX0luaXQoQ09TRSogcG9iaiwgQ0JPUl9DT05URVhUX0NPTU1BIGNvc2VfZXJyYmFjayAqIHBlcnJvcikKK3sKKwljbl9jYm9yX2VycmJhY2sgZXJyU3RhdGUgPSB7IDAgfTsKKworI2lmZGVmIFVTRV9DQk9SX0NPTlRFWFQKKwlpZiAoY29udGV4dCAhPSBOVUxMKSBwb2JqLT5tX2FsbG9jQ29udGV4dCA9ICpjb250ZXh0OworI2VuZGlmCisKKwlwb2JqLT5tX3Byb3RlY3RlZE1hcCA9IGNuX2Nib3JfbWFwX2NyZWF0ZShDQk9SX0NPTlRFWFRfUEFSQU1fQ09NTUEgJmVyclN0YXRlKTsKKwlpZiAocG9iai0+bV9wcm90ZWN0ZWRNYXAgPT0gTlVMTCkgeworCWVycm9yX3NldHVwOgorCQlfQ09TRV9SZWxlYXNlKCBwb2JqKTsKKwkJaWYgKHBlcnJvciAhPSBOVUxMKSBwZXJyb3ItPmVyciA9IENPU0VfRVJSX09VVF9PRl9NRU1PUlk7CisJCXJldHVybiBmYWxzZTsKKwl9CisKKwlwb2JqLT5tX3VucHJvdGVjdE1hcCA9IGNuX2Nib3JfbWFwX2NyZWF0ZShDQk9SX0NPTlRFWFRfUEFSQU1fQ09NTUEgJmVyclN0YXRlKTsKKwlpZiAocG9iai0+bV91bnByb3RlY3RNYXAgPT0gTlVMTCkgZ290byBlcnJvcl9zZXR1cDsKKwlwb2JqLT5tX293blVucHJvdGVjdGVkTWFwID0gdHJ1ZTsKKworCXBvYmotPm1fY2JvciA9IGNuX2Nib3JfbWFwX2NyZWF0ZShDQk9SX0NPTlRFWFRfUEFSQU1fQ09NTUEgJmVyclN0YXRlKTsKKwlpZiAocG9iai0+bV9jYm9yID09IE5VTEwpIGdvdG8gZXJyb3Jfc2V0dXA7CisJcG9iai0+bV9vd25Nc2cgPSB0cnVlOworCisJcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wgX0NPU0VfSW5pdF9Gcm9tX09iamVjdChDT1NFKiBwb2JqLCBjbl9jYm9yICogcGNib3IsIENCT1JfQ09OVEVYVF9DT01NQSBjb3NlX2VycmJhY2sgKiBwZXJyb3IpCit7CisJY29uc3QgY25fY2JvciAqIHBtYXAgPSBOVUxMOworCWNuX2Nib3JfZXJyYmFjayBlcnJTdGF0ZSA9IHsgMCB9OworCisjaWZkZWYgVVNFX0NCT1JfQ09OVEVYVAorCWlmIChjb250ZXh0ICE9IE5VTEwpIHBvYmotPm1fYWxsb2NDb250ZXh0ID0gKmNvbnRleHQ7CisjZW5kaWYKKworCXBtYXAgPSBjbl9jYm9yX21hcGdldF9pbnQocGNib3IsIENPU0VfSGVhZGVyX1Byb3RlY3RlZCk7CisJaWYgKHBtYXAgIT0gTlVMTCkgeworCQlpZiAocG1hcC0+dHlwZSAhPSBDTl9DQk9SX0JZVEVTKSB7CisJCQlpZiAocGVycm9yICE9IE5VTEwpIHBlcnJvci0+ZXJyID0gQ09TRV9FUlJfSU5WQUxJRF9QQVJBTUVURVI7CisJCXNldHVwX2Vycm9yOgorCQkJX0NPU0VfUmVsZWFzZShwb2JqKTsKKwkJCXJldHVybiBmYWxzZTsKKwkJfQorCQlwb2JqLT5tX3Byb3RlY3RlZE1hcCA9IChjbl9jYm9yICopIGNuX2Nib3JfZGVjb2RlKChjb25zdCBieXRlICopIHBtYXAtPnYuc3RyLCBwbWFwLT5sZW5ndGgsIGNvbnRleHQsICZlcnJTdGF0ZSk7CisJCWlmIChwb2JqLT5tX3Byb3RlY3RlZE1hcCA9PSBOVUxMKSB7CisJCQlpZiAocGVycm9yICE9IE5VTEwpIHBlcnJvci0+ZXJyID0gQ09TRV9FUlJfSU5WQUxJRF9QQVJBTUVURVI7IC8vIE0wMEJVRyAtIGdldCBlcnJvciBzdGF0ZSBmcm9tIGVyclN0YXRlCisJCQlnb3RvIHNldHVwX2Vycm9yOworCQl9CisJfQorCisJcG9iai0+bV91bnByb3RlY3RNYXAgPSAoY25fY2JvciAqKSBjbl9jYm9yX21hcGdldF9pbnQocGNib3IsIENPU0VfSGVhZGVyX1VucHJvdGVjdGVkKTsKKwlwb2JqLT5tX293blVucHJvdGVjdGVkTWFwID0gZmFsc2U7CisKKwlwb2JqLT5tX2Nib3IgPSBwY2JvcjsKKwlwb2JqLT5tX293bk1zZyA9IHRydWU7CisKKwlyZXR1cm4gdHJ1ZTsKK30KKwordm9pZCBfQ09TRV9SZWxlYXNlKENPU0UgKiBwb2JqKQoreworCWNuX2Nib3JfY29udGV4dCAqIGNvbnRleHQgPSAmcG9iai0+bV9hbGxvY0NvbnRleHQ7CisKKwlpZiAocG9iai0+bV9wcm90ZWN0ZWRNYXAgIT0gTlVMTCkgQ05fQ0JPUl9GUkVFKHBvYmotPm1fcHJvdGVjdGVkTWFwLCBjb250ZXh0KTsKKwlpZiAocG9iai0+bV9vd25VbnByb3RlY3RlZE1hcCAmJiAocG9iai0+bV91bnByb3RlY3RNYXAgIT0gTlVMTCkpIENOX0NCT1JfRlJFRShwb2JqLT5tX3VucHJvdGVjdE1hcCwgY29udGV4dCk7CisJaWYgKHBvYmotPm1fb3duTXNnICYmIChwb2JqLT5tX2Nib3IgIT0gTlVMTCkpIENOX0NCT1JfRlJFRShwb2JqLT5tX2Nib3IsIGNvbnRleHQpOworfQorCitjbl9jYm9yICogQ09TRV9nZXRfY2JvcihIQ09TRSBoKQoreworCUNPU0UgKiBtc2cgPSAoQ09TRSAqKWg7CisJaWYgKCFJc1ZhbGlkQ09TRUhhbmRsZShoKSkgcmV0dXJuIE5VTEw7CisKKwlyZXR1cm4gbXNnLT5tX2Nib3I7Cit9CisKK2NvbnN0IGNuX2Nib3IgKiBfQ09TRV9tYXBfZ2V0X2ludChDT1NFICogcGNvc2UsIGludCBrZXksIGludCBmbGFncywgY29zZV9lcnJiYWNrICogcGVycm9yKQoreworCWNvbnN0IGNuX2Nib3IgKiBwID0gTlVMTDsKKworCWlmIChwZXJyb3IgIT0gTlVMTCkgcGVycm9yLT5lcnIgPSBDT1NFX0VSUl9OT05FOworCisJaWYgKChwY29zZS0+bV9wcm90ZWN0ZWRNYXAgIT0gTlVMTCkgJiYgKChmbGFncyAmIENPU0VfUFJPVEVDVF9PTkxZKSAhPSAwKSkgeworCQlwID0gY25fY2Jvcl9tYXBnZXRfaW50KHBjb3NlLT5tX3Byb3RlY3RlZE1hcCwga2V5KTsKKwkJaWYgKHAgIT0gTlVMTCkgcmV0dXJuIHA7CisJfQorCisJaWYgKChwY29zZS0+bV91bnByb3RlY3RNYXAgIT0gTlVMTCkgJiYgKChmbGFncyAmIENPU0VfVU5QUk9URUNUX09OTFkpICE9IDApKSB7CisJCXAgPSBjbl9jYm9yX21hcGdldF9pbnQocGNvc2UtPm1fdW5wcm90ZWN0TWFwLCBrZXkpOworCX0KKworCXJldHVybiBwOworfQorCitjb25zdCBjbl9jYm9yICogX0NPU0VfbWFwX2dldF9zdHIoQ09TRSAqIHBjb3NlLCBjb25zdCBjaGFyICoga2V5LCBpbnQgZmxhZ3MsIGNvc2VfZXJyYmFjayAqIHBlcnJvcikKK3sKKwljb25zdCBjbl9jYm9yICogcCA9IE5VTEw7CisKKwlpZiAocGVycm9yICE9IE5VTEwpIHBlcnJvci0+ZXJyID0gQ09TRV9FUlJfTk9ORTsKKworCWlmICgocGNvc2UtPm1fcHJvdGVjdGVkTWFwICE9IE5VTEwpICYmICgoZmxhZ3MgJiBDT1NFX1BST1RFQ1RfT05MWSkgIT0gMCkpIHsKKwkJcCA9IGNuX2Nib3JfbWFwZ2V0X3N0cmluZyhwY29zZS0+bV9wcm90ZWN0ZWRNYXAsIGtleSk7CisJCWlmIChwICE9IE5VTEwpIHJldHVybiBwOworCX0KKworCWlmICgocGNvc2UtPm1fdW5wcm90ZWN0TWFwICE9IE5VTEwpICYmICgoZmxhZ3MgJiBDT1NFX1VOUFJPVEVDVF9PTkxZKSAhPSAwKSkgeworCQlwID0gY25fY2Jvcl9tYXBnZXRfc3RyaW5nKHBjb3NlLT5tX3VucHJvdGVjdE1hcCwga2V5KTsKKwl9CisKKwlyZXR1cm4gcDsKK30KKworYm9vbCBfQ09TRV9tYXBfcHV0KENPU0UgKiBwQ29zZSwgaW50IGtleSwgY25fY2JvciAqIHZhbHVlLCBpbnQgZmxhZ3MsIGNvc2VfZXJyYmFjayAqIHBlcnJvcikKK3sKKwljbl9jYm9yX2NvbnRleHQgKiBjb250ZXh0ID0gJnBDb3NlLT5tX2FsbG9jQ29udGV4dDsKKwljbl9jYm9yX2VycmJhY2sgZXJyb3I7CisJYm9vbCBmOworCisJaWYgKChmbGFncyAmIENPU0VfQk9USCkgPT0gQ09TRV9CT1RIKSB7CisJCWlmIChwZXJyb3IgIT0gTlVMTCkgcGVycm9yLT5lcnIgPSBDT1NFX0VSUl9JTlZBTElEX1BBUkFNRVRFUjsKKwkJcmV0dXJuIGZhbHNlOworCX0KKworCWlmIChwZXJyb3IgIT0gTlVMTCkgcGVycm9yLT5lcnIgPSBDT1NFX0VSUl9OT05FOworCWlmIChmbGFncyAmIENPU0VfUFJPVEVDVF9PTkxZKSB7CisJCWYgPSBjbl9jYm9yX21hcHB1dF9pbnQocENvc2UtPm1fcHJvdGVjdGVkTWFwLCBrZXksIHZhbHVlLCBDQk9SX0NPTlRFWFRfUEFSQU1fQ09NTUEgJmVycm9yKTsKKwl9CisJZWxzZSB7CisJCWYgPSBjbl9jYm9yX21hcHB1dF9pbnQocENvc2UtPm1fdW5wcm90ZWN0TWFwLCBrZXksIHZhbHVlLCBDQk9SX0NPTlRFWFRfUEFSQU1fQ09NTUEgJmVycm9yKTsKKwl9CisJaWYgKCFmICYmIHBlcnJvciAhPSBOVUxMKSB7CisJCXBlcnJvci0+ZXJyID0gZXJyb3IuZXJyOyAvLyBNMDBCVUcKKwl9CisJcmV0dXJuIGY7Cit9CmRpZmYgLS1naXQgYS9zcmMvRW5jcnlwdC5jIGIvc3JjL0VuY3J5cHQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45Zjk4ZDJjCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL0VuY3J5cHQuYwpAQCAtMCwwICsxLDQ5NCBAQAorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPG1lbW9yeS5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisKKyNpbmNsdWRlICJjb3NlLmgiCisjaW5jbHVkZSAiY29zZV9pbnQuaCIKKyNpbmNsdWRlICJjb25maWd1cmUuaCIKKyNpbmNsdWRlICJjcnlwdG8uaCIKKworYnl0ZSBSZ2JEb250VXNlWzggKiAxMDI0XTsgICAvLyAgUmVtb3ZlIHRoaXMgYXJyYXkgd2hlbiB3ZSBjYW4gY29tcHV0ZSB0aGUgc2l6ZSBvZiBhIGNib3Igc2VyaWFsaXphdGlvbiB3aXRob3V0IHRoaXMgaGFjay4KKworCitib29sIElzVmFsaWRFbmNyeXB0SGFuZGxlKEhDT1NFX0VOQ1JZUFQgaCkKK3sKKwlDT1NFX0VuY3J5cHQgKiBwID0gKENPU0VfRW5jcnlwdCAqKWg7CisJaWYgKHAgPT0gTlVMTCkgcmV0dXJuIGZhbHNlOworCXJldHVybiB0cnVlOworfQorCisKK3NpemVfdCBDT1NFX0VuY29kZShIQ09TRSBtc2csIGJ5dGUgKiByZ2IsIGludCBpYiwgc2l6ZV90IGNiKQoreworCWlmIChyZ2IgPT0gTlVMTCkgcmV0dXJuIGNib3JfZW5jb2Rlcl93cml0ZShSZ2JEb250VXNlLCAwLCBzaXplb2YoUmdiRG9udFVzZSksICgoQ09TRSAqKW1zZyktPm1fY2JvcikgKyBpYjsKKwlyZXR1cm4gY2Jvcl9lbmNvZGVyX3dyaXRlKHJnYiwgaWIsIGNiLCAoKENPU0UqKW1zZyktPm1fY2Jvcik7Cit9CisKK0hDT1NFX0VOQ1JZUFQgQ09TRV9FbmNyeXB0X0luaXQoQ0JPUl9DT05URVhUX0NPTU1BIGNvc2VfZXJyYmFjayAqIHBlcnJvcikKK3sKKwlDT1NFX0VuY3J5cHQgKiBwb2JqID0gKENPU0VfRW5jcnlwdCAqKUNPU0VfQ0FMTE9DKDEsIHNpemVvZihDT1NFX0VuY3J5cHQpLCBjb250ZXh0KTsKKwlpZiAocG9iaiA9PSBOVUxMKSB7CisJCWlmIChwZXJyb3IgIT0gTlVMTCkgcGVycm9yLT5lcnIgPSBDT1NFX0VSUl9PVVRfT0ZfTUVNT1JZOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwlpZiAoIV9DT1NFX0luaXQoJnBvYmotPm1fbWVzc2FnZSwgQ0JPUl9DT05URVhUX1BBUkFNX0NPTU1BIHBlcnJvcikpIHsKKwllcnJvcl9zZXR1cDoKKwkJQ09TRV9FbmNyeXB0X0ZyZWUoKEhDT1NFX0VOQ1JZUFQpcG9iaik7CisJCXJldHVybiBOVUxMOworCX0KKworCWlmICghY25fY2Jvcl9tYXBwdXRfaW50KHBvYmotPm1fbWVzc2FnZS5tX2Nib3IsIENPU0VfSGVhZGVyX1R5cGUsIGNuX2Nib3JfaW50X2NyZWF0ZSgxLCBDQk9SX0NPTlRFWFRfUEFSQU1fQ09NTUEgTlVMTCksIENCT1JfQ09OVEVYVF9QQVJBTV9DT01NQSBOVUxMKSkgeworCQlpZiAocGVycm9yICE9IE5VTEwpIHBlcnJvci0+ZXJyID0gQ09TRV9FUlJfT1VUX09GX01FTU9SWTsKKwkJZ290byBlcnJvcl9zZXR1cDsKKwl9CisKKwlyZXR1cm4gKEhDT1NFX0VOQ1JZUFQpIHBvYmo7Cit9CisKK0hDT1NFX0VOQ1JZUFQgX0NPU0VfRW5jcnlwdF9Jbml0X0Zyb21fT2JqZWN0KGNuX2Nib3IgKiBjYm9yLCBDT1NFX0VuY3J5cHQgKiBwSW4sIENCT1JfQ09OVEVYVF9DT01NQSBjb3NlX2VycmJhY2sgKiBlcnJwKQoreworCUNPU0VfRW5jcnlwdCAqIHBvYmogPSBwSW47CisJY25fY2JvciAqIHBSZWNpcGllbnRzID0gTlVMTDsKKworCWlmIChwb2JqID09IE5VTEwpIHBvYmogPSAoQ09TRV9FbmNyeXB0ICopQ09TRV9DQUxMT0MoMSwgc2l6ZW9mKENPU0VfRW5jcnlwdCksIGNvbnRleHQpOworCWlmIChwb2JqID09IE5VTEwpIHsKKwkJaWYgKGVycnAgIT0gTlVMTCkgZXJycC0+ZXJyID0gQ09TRV9FUlJfT1VUX09GX01FTU9SWTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJaWYgKCFfQ09TRV9Jbml0X0Zyb21fT2JqZWN0KCZwb2JqLT5tX21lc3NhZ2UsIGNib3IsIENCT1JfQ09OVEVYVF9QQVJBTV9DT01NQSBlcnJwKSkgeworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwlwUmVjaXBpZW50cyA9IChjbl9jYm9yICopIGNuX2Nib3JfbWFwZ2V0X2ludChjYm9yLCBDT1NFX0hlYWRlcl9SZWNpcGllbnRzKTsKKwl3aGlsZSAocFJlY2lwaWVudHMgIT0gTlVMTCkgeworCQlDT1NFX1JlY2lwaWVudEluZm8gKiBwSW5mbyA9IF9DT1NFX1JlY2lwaWVudF9Jbml0X0Zyb21fT2JqZWN0KHBSZWNpcGllbnRzLCBDQk9SX0NPTlRFWFRfUEFSQU1fQ09NTUEgZXJycCk7CisJCWlmIChwSW5mbyA9PSBOVUxMKSB7CisJCQlpZiAocEluID09IE5VTEwpIENPU0VfRW5jcnlwdF9GcmVlKChIQ09TRV9FTkNSWVBUKSBwb2JqKTsKKwkJCXJldHVybiBOVUxMOworCQl9CisKKwkJcEluZm8tPm1fcmVjaXBpZW50TmV4dCA9IHBvYmotPm1fcmVjaXBpZW50Rmlyc3Q7CisJCXBvYmotPm1fcmVjaXBpZW50Rmlyc3QgPSBwSW5mbzsKKwkJcFJlY2lwaWVudHMgPSBwUmVjaXBpZW50cy0+bmV4dDsKKwl9CisKKwlyZXR1cm4oSENPU0VfRU5DUllQVCkgcG9iajsKK30KKworYm9vbCBDT1NFX0VuY3J5cHRfRnJlZShIQ09TRV9FTkNSWVBUIGgpCit7CisjaWZkZWYgVVNFX0NCT1JfQ09OVEVYVAorCWNuX2Nib3JfY29udGV4dCBjb250ZXh0OworI2VuZGlmCisKKwlpZiAoIUlzVmFsaWRFbmNyeXB0SGFuZGxlKGgpKSByZXR1cm4gZmFsc2U7CisKKyNpZmRlZiBVU0VfQ0JPUl9DT05URVhUCisJY29udGV4dCA9ICgoQ09TRV9FbmNyeXB0ICopaCktPm1fbWVzc2FnZS5tX2FsbG9jQ29udGV4dDsKKyNlbmRpZgorCisJX0NPU0VfRW5jcnlwdF9SZWxlYXNlKChDT1NFX0VuY3J5cHQgKiloKTsKKworCUNPU0VfRlJFRSgoQ09TRV9FbmNyeXB0ICopaCwgJmNvbnRleHQpOworCisJcmV0dXJuIHRydWU7Cit9CisKK3ZvaWQgX0NPU0VfRW5jcnlwdF9SZWxlYXNlKENPU0VfRW5jcnlwdCAqIHApCit7CisJaWYgKHAtPnBiQ29udGVudCAhPSBOVUxMKSBDT1NFX0ZSRUUocC0+cGJDb250ZW50LCAmcC0+bV9tZXNzYWdlLm1fYWxsb2NDb250ZXh0KTsKKwkvLwlpZiAocC0+cGJJViAhPSBOVUxMKSBDT1NFX0ZSRUUocC0+cGJJViwgJnAtPm1fbWVzc2FnZS5tX2FsbG9jQ29udGV4dCk7CisJaWYgKHAtPnBiS2V5ICE9IE5VTEwpIENPU0VfRlJFRShwIC0+cGJLZXksICZwLT5tX21lc3NhZ2UubV9hbGxvY0NvbnRleHQpOworCisJX0NPU0VfUmVsZWFzZSgmcC0+bV9tZXNzYWdlKTsKK30KKworSENPU0VfUkVDSVBJRU5UIENPU0VfRW5jcnlwdF9hZGRfc2hhcmVkX3NlY3JldChIQ09TRV9FTkNSWVBUIGhjb3NlLCBDT1NFX0FsZ29yaXRobXMgYWxnLCBieXRlICogcmdiS2V5LCBpbnQgY2JLZXksIGJ5dGUgKiByZ2JLaWQsIGludCBjYktpZCwgY29zZV9lcnJiYWNrICogcGVycm9yKQoreworI2lmZGVmIFVTRV9DQk9SX0NPTlRFWFQKKwljbl9jYm9yX2NvbnRleHQgKiBjb250ZXh0OworI2VuZGlmIC8vIFVTRV9DQk9SX0NPTlRFWFQKKwlDT1NFX1JlY2lwaWVudEluZm8gKiBwb2JqOworCUNPU0VfRW5jcnlwdCAqIHBjb3NlID0gKENPU0VfRW5jcnlwdCAqKWhjb3NlOworCisJaWYgKCFJc1ZhbGlkRW5jcnlwdEhhbmRsZShoY29zZSkgfHwgKHJnYktleSA9PSBOVUxMKSkgeworCQlpZiAocGVycm9yICE9IE5VTEwpIHBlcnJvci0+ZXJyID0gQ09TRV9FUlJfSU5WQUxJRF9QQVJBTUVURVI7CisJCXJldHVybiBOVUxMOworCX0KKworCXN3aXRjaCAoYWxnKSB7CisJY2FzZSBDT1NFX0FsZ29yaXRobV9EaXJlY3Q6CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJaWYgKHBlcnJvciAhPSBOVUxMKSBwZXJyb3ItPmVyciA9IENPU0VfRVJSX0lOVkFMSURfUEFSQU1FVEVSOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKworI2lmZGVmIFVTRV9DQk9SX0NPTlRFWFQKKwljb250ZXh0ID0gJnBjb3NlLT5tX21lc3NhZ2UubV9hbGxvY0NvbnRleHQ7CisjZW5kaWYgLy8gVVNFX0NCT1JfQ09OVEVYVAorCisJcG9iaiA9IChDT1NFX1JlY2lwaWVudEluZm8gKikgQ09TRV9DQUxMT0MoMSwgc2l6ZW9mKENPU0VfUmVjaXBpZW50SW5mbykgLCBjb250ZXh0KTsKKwlpZiAocG9iaiA9PSBOVUxMKSB7CisJCW9vbV9lcnJvcjoKKwkJaWYgKHBlcnJvciAhPSBOVUxMKSBwZXJyb3ItPmVyciA9IENPU0VfRVJSX09VVF9PRl9NRU1PUlk7CisJZXJyb3I6CisJCS8vIE0wMEJVRyBDT1NFX1JlY2lwaWVudF9GcmVlKHBvYmopOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwlpZiAoIV9DT1NFX0luaXQoJnBvYmotPm1fZW5jcnlwdC5tX21lc3NhZ2UsIENCT1JfQ09OVEVYVF9QQVJBTV9DT01NQSBwZXJyb3IpKSB7CisJCWdvdG8gZXJyb3I7CisJfQorCisJaWYgKCFjbl9jYm9yX21hcHB1dF9pbnQocG9iai0+bV9lbmNyeXB0Lm1fbWVzc2FnZS5tX3VucHJvdGVjdE1hcCwgQ09TRV9IZWFkZXJfQWxnb3JpdGhtLCBjbl9jYm9yX2ludF9jcmVhdGUoYWxnLCBDQk9SX0NPTlRFWFRfUEFSQU1fQ09NTUEgTlVMTCksIENCT1JfQ09OVEVYVF9QQVJBTV9DT01NQSBOVUxMKSkgZ290byBlcnJvcjsKKworCWlmIChjYktpZCA+IDApIHsKKwkJYnl0ZSAqIHBiID0gKGJ5dGUgKilDT1NFX0NBTExPQyhjYktpZCwgMSwgY29udGV4dCk7CisJCWlmIChwYiA9PSBOVUxMKSBnb3RvIG9vbV9lcnJvcjsKKwkJbWVtY3B5KHBiLCByZ2JLaWQsIGNiS2lkKTsKKwkJaWYgKCFjbl9jYm9yX21hcHB1dF9pbnQocG9iai0+bV9lbmNyeXB0Lm1fbWVzc2FnZS5tX3VucHJvdGVjdE1hcCwgQ09TRV9IZWFkZXJfS0lELCBjbl9jYm9yX2RhdGFfY3JlYXRlKHBiLCBjYktpZCwgQ0JPUl9DT05URVhUX1BBUkFNX0NPTU1BIE5VTEwpLCBDQk9SX0NPTlRFWFRfUEFSQU1fQ09NTUEgTlVMTCkpIHsKKwkJCUNPU0VfRlJFRShwYiwgY29udGV4dCk7CisJCQlnb3RvIG9vbV9lcnJvcjsgLy8gTTAwQlVHIC0gZ2V0IGVycm9yIGZyb20gQ0JPUgorCQl9CisJfQorCisKKwlwb2JqLT5tX2VuY3J5cHQucGJLZXkgPSAoYnl0ZSAqKSBDT1NFX0NBTExPQyhjYktleSwgMSwgY29udGV4dCk7CisJaWYgKHBvYmotPm1fZW5jcnlwdC5wYktleSA9PSBOVUxMKSBnb3RvIGVycm9yOworCW1lbWNweShwb2JqLT5tX2VuY3J5cHQucGJLZXksIHJnYktleSwgY2JLZXkpOworCXBvYmotPm1fZW5jcnlwdC5jYktleSA9IGNiS2V5OworCisJcG9iai0+bV9yZWNpcGllbnROZXh0ID0gcGNvc2UtPm1fcmVjaXBpZW50Rmlyc3Q7CisJcGNvc2UtPm1fcmVjaXBpZW50Rmlyc3QgPSBwb2JqOworCisJY25fY2JvciAqIHBSZWNpcGllbnRzID0gKGNuX2Nib3IgKikgY25fY2Jvcl9tYXBnZXRfaW50KHBjb3NlLT5tX21lc3NhZ2UubV9jYm9yLCBDT1NFX0hlYWRlcl9SZWNpcGllbnRzKTsKKwlpZiAocFJlY2lwaWVudHMgPT0gTlVMTCkgeworCQlwUmVjaXBpZW50cyA9IGNuX2Nib3JfYXJyYXlfY3JlYXRlKENCT1JfQ09OVEVYVF9QQVJBTV9DT01NQSBOVUxMKTsKKwkJaWYgKHBSZWNpcGllbnRzID09IE5VTEwpIGdvdG8gZXJyb3I7CisJCWlmICghY25fY2Jvcl9tYXBwdXRfaW50KHBjb3NlLT5tX21lc3NhZ2UubV9jYm9yLCBDT1NFX0hlYWRlcl9SZWNpcGllbnRzLCBwUmVjaXBpZW50cywgQ0JPUl9DT05URVhUX1BBUkFNX0NPTU1BIE5VTEwpKSB7CisJCQljbl9jYm9yX2ZyZWUocFJlY2lwaWVudHMsIGNvbnRleHQpOworCQkJZ290byBlcnJvcjsKKwkJfQorCX0KKworCWNuX2Nib3JfYXJyYXlfYXBwZW5kKHBSZWNpcGllbnRzLCBwb2JqLT5tX2VuY3J5cHQubV9tZXNzYWdlLm1fY2JvciwgTlVMTCk7CisKKwlwb2JqLT5tX2VuY3J5cHQubV9tZXNzYWdlLm1fZmxhZ3MgfD0gMTsKKwlyZXR1cm4gKEhDT1NFX1JFQ0lQSUVOVCkgcG9iajsKK30KKworYm9vbCBDT1NFX0VuY3J5cHRfZGVjcnlwdChIQ09TRV9FTkNSWVBUIGgsIEhDT1NFX1JFQ0lQSUVOVCBoUmVjaXAsIGNvc2VfZXJyYmFjayAqIHBlcnIpCit7CisJQ09TRV9FbmNyeXB0ICogcGNvc2UgPSAoQ09TRV9FbmNyeXB0ICopaDsKKwlDT1NFX1JlY2lwaWVudEluZm8gKiBwUmVjaXAgPSAoQ09TRV9SZWNpcGllbnRJbmZvICopaFJlY2lwOworCisJaWYgKCFJc1ZhbGlkRW5jcnlwdEhhbmRsZShoKSB8fCAoIUlzVmFsaWRSZWNpcGllbnRIYW5kbGUoaFJlY2lwKSkpIHsKKwkJaWYgKHBlcnIgIT0gTlVMTCkgcGVyci0+ZXJyID0gQ09TRV9FUlJfSU5WQUxJRF9QQVJBTUVURVI7CisJCXJldHVybiBmYWxzZTsKKwl9CisKKwlyZXR1cm4gX0NPU0VfRW5jcnlwdF9kZWNyeXB0KHBjb3NlLCBwUmVjaXAsIHBlcnIpOworfQorCitib29sIF9DT1NFX0VuY3J5cHRfZGVjcnlwdChDT1NFX0VuY3J5cHQgKiBwY29zZSwgQ09TRV9SZWNpcGllbnRJbmZvICogcFJlY2lwLCBjb3NlX2VycmJhY2sgKiBwZXJyKQoreworCWludCBhbGc7CisJaW50IGNiaXRLZXk7CisJY29uc3QgY25fY2JvciAqIGNuID0gTlVMTDsKKwljb3NlX2VycmJhY2sgZXJyb3IgPSB7IDAgfTsKKworCWJ5dGUgKiBwYktleSA9IE5VTEw7CisJY25fY2Jvcl9jb250ZXh0ICogY29udGV4dDsKKwlieXRlICogcGJBdXRoRGF0YSA9IE5VTEw7CisJc3NpemVfdCBjYkF1dGhEYXRhOworCWNuX2Nib3IgKiBwQXV0aERhdGEgPSBOVUxMOworCWJ5dGUgKiBwYlByb3RlY3RlZCA9IE5VTEw7CisJc3NpemVfdCBjYlByb3RlY3RlZDsKKwljbl9jYm9yICogcHRtcCA9IE5VTEw7CisKKyNpZmRlZiBVU0VfQ0JPUl9DT05URVhUCisJY29udGV4dCA9ICZwY29zZS0+bV9tZXNzYWdlLm1fYWxsb2NDb250ZXh0OworI2VuZGlmCisKKwljbiA9IF9DT1NFX21hcF9nZXRfaW50KCZwY29zZS0+bV9tZXNzYWdlLCBDT1NFX0hlYWRlcl9BbGdvcml0aG0sIENPU0VfQk9USCwgJmVycm9yKTsKKworCWlmIChjbiA9PSBOVUxMKSB7CisJZXJyb3I6CisJCWlmIChwYlByb3RlY3RlZCAhPSBOVUxMKSBDT1NFX0ZSRUUocGJQcm90ZWN0ZWQsIGNvbnRleHQpOworCQlpZiAocGJBdXRoRGF0YSAhPSBOVUxMKSBDT1NFX0ZSRUUocGJBdXRoRGF0YSwgY29udGV4dCk7CisJCWlmIChwQXV0aERhdGEgIT0gTlVMTCkgY25fY2Jvcl9mcmVlKHBBdXRoRGF0YSBDQk9SX0NPTlRFWFRfUEFSQU0pOworCQlpZiAocGJLZXkgIT0gTlVMTCkgQ09TRV9GUkVFKHBiS2V5LCBjb250ZXh0KTsKKwkJaWYgKHBlcnIgIT0gTlVMTCkgKnBlcnIgPSBlcnJvcjsKKwkJcmV0dXJuIGZhbHNlOworCX0KKwlpZiAoY24tPnR5cGUgIT0gQ05fQ0JPUl9VSU5UKSBnb3RvIGVycm9yOworCWFsZyA9IGNuLT52LnVpbnQ7CisKKwlzd2l0Y2ggKGFsZykgeworCWNhc2UgQ09TRV9BbGdvcml0aG1fQUVTX0NDTV82NDoKKwkJY2JpdEtleSA9IDEyODsKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQllcnJvci5lcnIgPSBDT1NFX0VSUl9VTktOT1dOX0FMR09SSVRITTsKKwkJZ290byBlcnJvcjsKKwl9CisKKwlwYktleSA9IENPU0VfQ0FMTE9DKGNiaXRLZXkgLyA4LCAxLCBjb250ZXh0KTsKKworCWZvciAocFJlY2lwID0gcGNvc2UtPm1fcmVjaXBpZW50Rmlyc3Q7IHBSZWNpcCAhPSBOVUxMOyBwUmVjaXAgPSBwUmVjaXAtPm1fcmVjaXBpZW50TmV4dCkgeworCQlpZiAoX0NPU0VfUmVjaXBpZW50X2RlY3J5cHQocFJlY2lwLCBjYml0S2V5LCBwYktleSwgJmVycm9yKSkgYnJlYWs7CisJfQorCisJaWYgKHBSZWNpcCA9PSBOVUxMKSB7CisJCWVycm9yLmVyciA9IENPU0VfRVJSX05PX1JFQ0lQSUVOVF9GT1VORDsKKwkJZ290byBlcnJvcjsKKwl9CisKKwkvLyAgQnVpbGQgcHJvdGVjdGVkIGhlYWRlcnMKKworCWlmIChwY29zZS0+bV9tZXNzYWdlLm1fcHJvdGVjdGVkTWFwLT5maXJzdF9jaGlsZCAhPSBOVUxMKSB7CisJCWNiUHJvdGVjdGVkID0gY2Jvcl9lbmNvZGVyX3dyaXRlKFJnYkRvbnRVc2UsIDAsIHNpemVvZihSZ2JEb250VXNlKSwgcGNvc2UtPm1fbWVzc2FnZS5tX3Byb3RlY3RlZE1hcCk7CisJCXBiUHJvdGVjdGVkID0gKGJ5dGUgKilDT1NFX0NBTExPQyhjYlByb3RlY3RlZCwgMSwgY29udGV4dCk7CisJCWlmIChwYlByb3RlY3RlZCA9PSBOVUxMKSBnb3RvIGVycm9yOworCQlpZiAoY2Jvcl9lbmNvZGVyX3dyaXRlKHBiUHJvdGVjdGVkLCAwLCBjYlByb3RlY3RlZCwgcGNvc2UtPm1fbWVzc2FnZS5tX3Byb3RlY3RlZE1hcCkgIT0gY2JQcm90ZWN0ZWQpIGdvdG8gZXJyb3I7CisJCWlmICghY25fY2Jvcl9tYXBwdXRfaW50KHBjb3NlLT5tX21lc3NhZ2UubV9jYm9yLCBDT1NFX0hlYWRlcl9Qcm90ZWN0ZWQsIGNuX2Nib3JfZGF0YV9jcmVhdGUocGJQcm90ZWN0ZWQsIGNiUHJvdGVjdGVkLCBDQk9SX0NPTlRFWFRfUEFSQU1fQ09NTUEgTlVMTCksIENCT1JfQ09OVEVYVF9QQVJBTV9DT01NQSBOVUxMKSkgZ290byBlcnJvcjsKKwl9CisJZWxzZSB7CisJCXBiUHJvdGVjdGVkID0gTlVMTDsKKwkJY2JQcm90ZWN0ZWQgPSAwOworCX0KKworCS8vICBCdWlsZCBhdXRoZW50aWNhdGVkIGRhdGEKKwlwYkF1dGhEYXRhID0gTlVMTDsKKwlwQXV0aERhdGEgPSBjbl9jYm9yX2FycmF5X2NyZWF0ZShDQk9SX0NPTlRFWFRfUEFSQU1fQ09NTUEgTlVMTCk7CisKKwlwdG1wID0gY25fY2Jvcl9kYXRhX2NyZWF0ZShwYlByb3RlY3RlZCwgY2JQcm90ZWN0ZWQsIENCT1JfQ09OVEVYVF9QQVJBTV9DT01NQSBOVUxMKTsKKwlpZiAocHRtcCA9PSBOVUxMKSBnb3RvIGVycm9yOworCWNuX2Nib3JfYXJyYXlfYXBwZW5kKHBBdXRoRGF0YSwgcHRtcCwgTlVMTCk7CisJcGJQcm90ZWN0ZWQgPSBOVUxMOworCisJcHRtcCA9IGNuX2Nib3JfZGF0YV9jcmVhdGUoTlVMTCwgMCwgQ0JPUl9DT05URVhUX1BBUkFNX0NPTU1BIE5VTEwpOworCWlmIChwdG1wID09IE5VTEwpIGdvdG8gZXJyb3I7CisJY25fY2Jvcl9hcnJheV9hcHBlbmQocEF1dGhEYXRhLCBwdG1wLCBOVUxMKTsKKworCWNiQXV0aERhdGEgPSBjYm9yX2VuY29kZXJfd3JpdGUoUmdiRG9udFVzZSwgMCwgc2l6ZW9mKFJnYkRvbnRVc2UpLCBwQXV0aERhdGEpOworCXBiQXV0aERhdGEgPSAoYnl0ZSAqKUNPU0VfQ0FMTE9DKGNiQXV0aERhdGEsIDEsIGNvbnRleHQpOworCWlmIChwYkF1dGhEYXRhID09IE5VTEwpIGdvdG8gZXJyb3I7CisJaWYgKGNib3JfZW5jb2Rlcl93cml0ZShwYkF1dGhEYXRhLCAwLCBjYkF1dGhEYXRhLCBwQXV0aERhdGEpICE9IGNiQXV0aERhdGEpIGdvdG8gZXJyb3I7CisKKwlzd2l0Y2ggKGFsZykgeworCWNhc2UgQ09TRV9BbGdvcml0aG1fQUVTX0NDTV82NDoKKwkJaWYgKCFBRVNfQ0NNX0RlY3J5cHQocGNvc2UsIDgsIDgsIHBiQXV0aERhdGEsIGNiQXV0aERhdGEpKSB7CisJCQllcnJvci5lcnIgPSBDT1NFX0VSUl9ERUNSWVBUX0ZBSUxFRDsKKwkJCWdvdG8gZXJyb3I7CisJCX0KKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQllcnJvci5lcnIgPSBDT1NFX0VSUl9VTktOT1dOX0FMR09SSVRITTsKKwkJZ290byBlcnJvcjsKKwl9CisKKwlyZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBDT1NFX0VuY3J5cHRfZW5jcnlwdChIQ09TRV9FTkNSWVBUIGgsIGNvc2VfZXJyYmFjayAqIHBlcnJvcikKK3sKKwlpbnQgYWxnOworCWludCB0OworCUNPU0VfUmVjaXBpZW50SW5mbyAqIHByaTsKKwljb25zdCBjbl9jYm9yICogY25fQWxnID0gTlVMTDsKKwlieXRlICogcGJBdXRoRGF0YSA9IE5VTEw7CisJY25fY2JvciAqIHBBdXRoRGF0YSA9IE5VTEw7CisJY25fY2JvciAqIHB0bXAgPSBOVUxMOworCWJ5dGUgKiBwYlByb3RlY3RlZCA9IE5VTEw7CisJc3NpemVfdCBjYlByb3RlY3RlZCA9IDA7CisJc2l6ZV90IGNiaXRLZXk7CisJY25fY2Jvcl9jb250ZXh0ICogY29udGV4dDsKKwlDT1NFX0VuY3J5cHQgKiBwY29zZSA9IChDT1NFX0VuY3J5cHQgKikgaDsKKwljb3NlX2VycmJhY2sgZXJyb3I7CisKKwlpZiAoIUlzVmFsaWRFbmNyeXB0SGFuZGxlKGgpKSB7CisJCWlmIChwZXJyb3IgIT0gTlVMTCkgcGVycm9yLT5lcnIgPSBDT1NFX0VSUl9JTlZBTElEX1BBUkFNRVRFUjsKKwkJcmV0dXJuIGZhbHNlOworCX0KKyNpZmRlZiBVU0VfQ0JPUl9DT05URVhUCisJY29udGV4dCA9ICZwY29zZS0+bV9tZXNzYWdlLm1fYWxsb2NDb250ZXh0OworI2VuZGlmIC8vIFVTRV9DQk9SX0NPTlRFWFQKKworCWNuX0FsZyA9IF9DT1NFX21hcF9nZXRfaW50KCZwY29zZS0+bV9tZXNzYWdlLCBDT1NFX0hlYWRlcl9BbGdvcml0aG0sIENPU0VfQk9USCwgJmVycm9yKTsKKworCWlmIChjbl9BbGcgPT0gTlVMTCkgeworCWVycm9yOgorCQlpZiAocGJQcm90ZWN0ZWQgIT0gTlVMTCkgQ09TRV9GUkVFKHBiUHJvdGVjdGVkLCBjb250ZXh0KTsKKwkJaWYgKHBiQXV0aERhdGEgIT0gTlVMTCkgQ09TRV9GUkVFKHBiQXV0aERhdGEsIGNvbnRleHQpOworCQlpZiAocEF1dGhEYXRhICE9IE5VTEwpIGNuX2Nib3JfZnJlZShwQXV0aERhdGEgQ0JPUl9DT05URVhUX1BBUkFNKTsKKwkJaWYgKHB0bXAgIT0gTlVMTCkgY25fY2Jvcl9mcmVlKHB0bXAgQ0JPUl9DT05URVhUX1BBUkFNKTsKKwkJaWYgKHBlcnJvciAhPSBOVUxMKSAqcGVycm9yID0gZXJyb3I7CisJCXJldHVybiBmYWxzZTsKKwl9CisJaWYgKGNuX0FsZy0+dHlwZSAhPSBDTl9DQk9SX1VJTlQpIGdvdG8gZXJyb3I7CisJYWxnID0gY25fQWxnLT52LnVpbnQ7CisKKwkvLyAgR2V0IHRoZSBrZXkgc2l6ZQorCisJc3dpdGNoIChhbGcpIHsKKwljYXNlIENPU0VfQWxnb3JpdGhtX0FFU19DQ01fNjQ6CisJCWNiaXRLZXkgPSAxMjg7CisJCWJyZWFrOworCisJY2FzZSBDT1NFX0FsZ29yaXRobV9EaXJlY3Q6CisJCWNiaXRLZXkgPSAwOworCQlicmVhazsKKworCWRlZmF1bHQ6CisJCWdvdG8gZXJyb3I7CisJfQorCisJLy8gIElmIHdlIGFyZSBkb2luZyBkaXJlY3QgZW5jcnlwdGlvbiAtIHRoZW4gcmVjaXBpZW50IGdlbmVyYXRlcyB0aGUga2V5CisKKwlpZiAocGNvc2UtPnBiS2V5ID09IE5VTEwpIHsKKwkJdCA9IDA7CisJCWZvciAocHJpID0gcGNvc2UtPm1fcmVjaXBpZW50Rmlyc3Q7IHByaSAhPSBOVUxMOyBwcmkgPSBwcmktPm1fcmVjaXBpZW50TmV4dCkgeworCQkJaWYgKHByaS0+bV9lbmNyeXB0Lm1fbWVzc2FnZS5tX2ZsYWdzICYgMSkgeworCQkJCXQgfD0gMTsKKwkJCQlwY29zZS0+cGJLZXkgPSBfQ09TRV9SZWNpcGllbnRJbmZvX2dlbmVyYXRlS2V5KHByaSwgY2JpdEtleSk7CisJCQkJaWYgKHBjb3NlLT5wYktleSA9PSBOVUxMKSBnb3RvIGVycm9yOworCQkJCXBjb3NlLT5jYktleSA9IGNiaXRLZXkgLyA4OworCQkJfQorCQkJZWxzZSB7CisJCQkJdCB8PSAyOworCQkJfQorCQl9CisJCWlmICh0ID09IDMpIHsKKwkJCWVycm9yLmVyciA9IENOX0NCT1JfRVJSX0lOVkFMSURfUEFSQU1FVEVSOworCQkJZ290byBlcnJvcjsKKwkJfQorCX0KKworCWlmIChwY29zZS0+cGJLZXkgPT0gTlVMTCkgeworCQlwY29zZS0+cGJLZXkgPSAoYnl0ZSAqKSBDT1NFX0NBTExPQyhjYml0S2V5LzgsIDEsIGNvbnRleHQpOworCQlpZiAocGNvc2UtPnBiS2V5ID09IE5VTEwpIGdvdG8gZXJyb3I7CisJCXBjb3NlLT5jYktleSA9IGNiaXRLZXkgLyA4OworCQlyYW5kX2J5dGVzKHBjb3NlLT5wYktleSwgcGNvc2UtPmNiS2V5KTsKKwl9CisKKwkvLyAgQnVpbGQgcHJvdGVjdGVkIGhlYWRlcnMKKworCWlmIChwY29zZS0+bV9tZXNzYWdlLm1fcHJvdGVjdGVkTWFwLT5maXJzdF9jaGlsZCAhPSBOVUxMKSB7CisJCWNiUHJvdGVjdGVkID0gY2Jvcl9lbmNvZGVyX3dyaXRlKFJnYkRvbnRVc2UsIDAsIHNpemVvZihSZ2JEb250VXNlKSwgcGNvc2UtPm1fbWVzc2FnZS5tX3Byb3RlY3RlZE1hcCk7CisJCXBiUHJvdGVjdGVkID0gKGJ5dGUgKikgQ09TRV9DQUxMT0MoY2JQcm90ZWN0ZWQsIDEsIGNvbnRleHQpOworCQlpZiAocGJQcm90ZWN0ZWQgPT0gTlVMTCkgZ290byBlcnJvcjsKKwkJaWYgKGNib3JfZW5jb2Rlcl93cml0ZShwYlByb3RlY3RlZCwgMCwgY2JQcm90ZWN0ZWQsIHBjb3NlLT5tX21lc3NhZ2UubV9wcm90ZWN0ZWRNYXApICE9IGNiUHJvdGVjdGVkKSBnb3RvIGVycm9yOworCQlpZiAoIWNuX2Nib3JfbWFwcHV0X2ludChwY29zZS0+bV9tZXNzYWdlLm1fY2JvciwgQ09TRV9IZWFkZXJfUHJvdGVjdGVkLCBjbl9jYm9yX2RhdGFfY3JlYXRlKHBiUHJvdGVjdGVkLCBjYlByb3RlY3RlZCwgQ0JPUl9DT05URVhUX1BBUkFNX0NPTU1BIE5VTEwpLCBDQk9SX0NPTlRFWFRfUEFSQU1fQ09NTUEgTlVMTCkpIGdvdG8gZXJyb3I7CisJfQorCWVsc2UgeworCQlwYlByb3RlY3RlZCA9IE5VTEw7CisJCWNiUHJvdGVjdGVkID0gMDsKKwl9CisKKwkvLyAgQWRkIFVucHJvdGVjdGVkIGhlYWRlcnMKKwlpZiAocGNvc2UtPm1fbWVzc2FnZS5tX3VucHJvdGVjdE1hcC0+Zmlyc3RfY2hpbGQgIT0gTlVMTCkgeworCQlpZiAoIWNuX2Nib3JfbWFwcHV0X2ludChwY29zZS0+bV9tZXNzYWdlLm1fY2JvciwgQ09TRV9IZWFkZXJfVW5wcm90ZWN0ZWQsIHBjb3NlLT5tX21lc3NhZ2UubV91bnByb3RlY3RNYXAsIENCT1JfQ09OVEVYVF9QQVJBTV9DT01NQSBOVUxMKSkgZ290byBlcnJvcjsKKwkJcGNvc2UtPm1fbWVzc2FnZS5tX293blVucHJvdGVjdGVkTWFwID0gZmFsc2U7CisJfQorCisJLy8gIEJ1aWxkIGF1dGhlbnRpY2F0ZWQgZGF0YQorCXNzaXplX3QgY2JBdXRoRGF0YSA9IDA7CisJcGJBdXRoRGF0YSA9IE5VTEw7CisJcEF1dGhEYXRhID0gY25fY2Jvcl9hcnJheV9jcmVhdGUoQ0JPUl9DT05URVhUX1BBUkFNX0NPTU1BIE5VTEwpOworCisJcHRtcCA9IGNuX2Nib3JfZGF0YV9jcmVhdGUocGJQcm90ZWN0ZWQsIGNiUHJvdGVjdGVkLCBDQk9SX0NPTlRFWFRfUEFSQU1fQ09NTUEgTlVMTCk7CisJaWYgKHB0bXAgPT0gTlVMTCkgZ290byBlcnJvcjsKKwljbl9jYm9yX2FycmF5X2FwcGVuZChwQXV0aERhdGEsIHB0bXAsIE5VTEwpOworCXBiUHJvdGVjdGVkID0gTlVMTDsKKwlwdG1wID0gTlVMTDsKKworCXB0bXAgPSBjbl9jYm9yX2RhdGFfY3JlYXRlKE5VTEwsIDAsIENCT1JfQ09OVEVYVF9QQVJBTV9DT01NQSBOVUxMKTsKKwlpZiAocHRtcCA9PSBOVUxMKSBnb3RvIGVycm9yOworCWNuX2Nib3JfYXJyYXlfYXBwZW5kKHBBdXRoRGF0YSwgcHRtcCwgTlVMTCk7CisJcHRtcCA9IE5VTEw7CisKKwljYkF1dGhEYXRhID0gY2Jvcl9lbmNvZGVyX3dyaXRlKFJnYkRvbnRVc2UsIDAsIHNpemVvZihSZ2JEb250VXNlKSwgcEF1dGhEYXRhKTsKKwlwYkF1dGhEYXRhID0gKGJ5dGUgKikgQ09TRV9DQUxMT0MoY2JBdXRoRGF0YSwgMSwgY29udGV4dCk7CisJaWYgKHBiQXV0aERhdGEgPT0gTlVMTCkgZ290byBlcnJvcjsKKwlpZiAoY2Jvcl9lbmNvZGVyX3dyaXRlKHBiQXV0aERhdGEsIDAsIGNiQXV0aERhdGEsIHBBdXRoRGF0YSkgIT0gY2JBdXRoRGF0YSkgZ290byBlcnJvcjsKKworCXN3aXRjaCAoYWxnKSB7CisjaWZkZWYgSU5DTFVERV9BRVNfQ0NNXzY0CisJY2FzZSBDT1NFX0FsZ29yaXRobV9BRVNfQ0NNXzY0OgorCQlpZiAoIUFFU19DQ01fRW5jcnlwdChwY29zZSwgNjQsIDgsIHBiQXV0aERhdGEsIGNiQXV0aERhdGEpKSBnb3RvIGVycm9yOworCQlicmVhazsKKyNlbmRpZgorCisJY2FzZSBDT1NFX0FsZ29yaXRobV9EaXJlY3Q6CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJcmV0dXJuIGZhbHNlOworCX0KKworCWZvciAocHJpID0gcGNvc2UtPm1fcmVjaXBpZW50Rmlyc3Q7IHByaSAhPSBOVUxMOyBwcmkgPSBwcmktPm1fcmVjaXBpZW50TmV4dCkgeworCQlfQ09TRV9FbmNyeXB0X1NldENvbnRlbnQoJnByaS0+bV9lbmNyeXB0LCBwY29zZS0+cGJLZXksIHBjb3NlLT5jYktleSwgJmVycm9yKTsKKwkJaWYgKGVycm9yLmVyciAhPSBDT1NFX0VSUl9OT05FKSBnb3RvIGVycm9yOworCisJCWlmICghQ09TRV9FbmNyeXB0X2VuY3J5cHQoKEhDT1NFX0VOQ1JZUFQpICZwcmktPm1fZW5jcnlwdCwgJmVycm9yKSkgZ290byBlcnJvcjsKKwl9CisKKwkvLyAgRmlndXJlIG91dCB0aGUgY2xlYW4gdXAKKworCWlmIChwYkF1dGhEYXRhICE9IE5VTEwpIENPU0VfRlJFRShwYkF1dGhEYXRhLCBjb250ZXh0KTsKKwlpZiAocEF1dGhEYXRhICE9IE5VTEwpIGNuX2Nib3JfZnJlZShwQXV0aERhdGEgQ0JPUl9DT05URVhUX1BBUkFNKTsKKworCXJldHVybiB0cnVlOworfQorCit2b2lkIENPU0VfRW5jcnlwdF9TZXRDb250ZW50KEhDT1NFX0VOQ1JZUFQgaCwgY29uc3QgYnl0ZSAqIHJnYiwgc2l6ZV90IGNiLCBjb3NlX2VycmJhY2sgKiBwZXJyb3IpCit7CisJaWYgKCFJc1ZhbGlkRW5jcnlwdEhhbmRsZShoKSB8fCAocmdiID09IE5VTEwpKSB7CisJCWlmIChwZXJyb3IgIT0gTlVMTCkgcGVycm9yLT5lcnIgPSBDT1NFX0VSUl9JTlZBTElEX1BBUkFNRVRFUjsKKwl9CisKKwlfQ09TRV9FbmNyeXB0X1NldENvbnRlbnQoKENPU0VfRW5jcnlwdCAqKWgsIHJnYiwgY2IsIHBlcnJvcik7Cit9CisKK3ZvaWQgX0NPU0VfRW5jcnlwdF9TZXRDb250ZW50KENPU0VfRW5jcnlwdCAqIGNvc2UsIGNvbnN0IGJ5dGUgKiByZ2IsIHNpemVfdCBjYiwgY29zZV9lcnJiYWNrICogcGVycm9yKQoreworCWNvc2UtPnBiQ29udGVudCA9IChieXRlICopQ09TRV9DQUxMT0MoY2IsIDEsICZjb3NlLT5tX21lc3NhZ2UubV9hbGxvY0NvbnRleHQpOworCWlmIChjb3NlLT5wYkNvbnRlbnQgPT0gTlVMTCkgeworCQlpZiAocGVycm9yICE9IE5VTEwpIHBlcnJvci0+ZXJyID0gQ09TRV9FUlJfSU5WQUxJRF9QQVJBTUVURVI7CisJCXJldHVybjsKKwl9CisJbWVtY3B5KGNvc2UtPnBiQ29udGVudCwgcmdiLCBjYik7CisJY29zZS0+Y2JDb250ZW50ID0gY2I7CisKKwlpZiAocGVycm9yICE9IE5VTEwpIHBlcnJvci0+ZXJyID0gQ09TRV9FUlJfTk9ORTsKKwlyZXR1cm47Cit9CisKK2NvbnN0IGNuX2Nib3IgKiBDT1NFX0VuY3J5cHRfbWFwX2dldF9pbnQoSENPU0VfRU5DUllQVCBoLCBpbnQga2V5LCBpbnQgZmxhZ3MsIGNvc2VfZXJyYmFjayAqIHBlcnJvcikKK3sKKwlpZiAoIUlzVmFsaWRFbmNyeXB0SGFuZGxlKGgpKSB7CisJCWlmIChwZXJyb3IgIT0gTlVMTCkgcGVycm9yLT5lcnIgPSBDT1NFX0VSUl9JTlZBTElEX1BBUkFNRVRFUjsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJcmV0dXJuIF9DT1NFX21hcF9nZXRfaW50KCYoKENPU0VfRW5jcnlwdCAqKWgpLT5tX21lc3NhZ2UsIGtleSwgZmxhZ3MsIHBlcnJvcik7Cit9CisKKworYm9vbCBDT1NFX0VuY3J5cHRfbWFwX3B1dChIQ09TRV9FTkNSWVBUIGgsIGludCBrZXksIGNuX2Nib3IgKiB2YWx1ZSwgaW50IGZsYWdzLCBjb3NlX2VycmJhY2sgKiBwZXJyb3IpCit7CisJaWYgKCFJc1ZhbGlkRW5jcnlwdEhhbmRsZShoKSB8fCAodmFsdWUgPT0gTlVMTCkpIHsKKwkJaWYgKHBlcnJvciAhPSBOVUxMKSBwZXJyb3ItPmVyciA9IENPU0VfRVJSX0lOVkFMSURfUEFSQU1FVEVSOworCQlyZXR1cm4gZmFsc2U7CisJfQorCisJcmV0dXJuIF9DT1NFX21hcF9wdXQoJigoQ09TRV9FbmNyeXB0ICopaCktPm1fbWVzc2FnZSwga2V5LCB2YWx1ZSwgZmxhZ3MsIHBlcnJvcik7Cit9CmRpZmYgLS1naXQgYS9zcmMvTWVzc2FnZS5jIGIvc3JjL01lc3NhZ2UuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNjJmYzI4Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL01lc3NhZ2UuYwpAQCAtMCwwICsxLDEzIEBACisjaW5jbHVkZSA8c3RkbGliLmg+CisKKyNpbmNsdWRlICJjb3NlLmgiCisjaW5jbHVkZSAiY29zZV9pbnQuaCIKKyNpbmNsdWRlICJjb25maWd1cmUuaCIKKyNpbmNsdWRlICJjcnlwdG8uaCIKKworYm9vbCBfQ09TRV9GcmVlKENPU0UgKiBwKQoreworCUNPU0VfRlJFRShwLCAmcC0+bV9hbGxvY0NvbnRleHQpOworCXJldHVybiB0cnVlOworfQorCmRpZmYgLS1naXQgYS9zcmMvUmVhZE1lLnR4dCBiL3NyYy9SZWFkTWUudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk2NDU3NTUKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvUmVhZE1lLnR4dApAQCAtMCwwICsxLDI5IEBACis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICBTVEFUSUMgTElCUkFSWSA6IEMgUHJvamVjdCBPdmVydmlldworPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK0FwcFdpemFyZCBoYXMgY3JlYXRlZCB0aGlzIEMgbGlicmFyeSBwcm9qZWN0IGZvciB5b3UuCisKK05vIHNvdXJjZSBmaWxlcyB3ZXJlIGNyZWF0ZWQgYXMgcGFydCBvZiB5b3VyIHByb2plY3QuCisKKworQy52Y3hwcm9qCisgICAgVGhpcyBpcyB0aGUgbWFpbiBwcm9qZWN0IGZpbGUgZm9yIFZDKysgcHJvamVjdHMgZ2VuZXJhdGVkIHVzaW5nIGFuIEFwcGxpY2F0aW9uIFdpemFyZC4KKyAgICBJdCBjb250YWlucyBpbmZvcm1hdGlvbiBhYm91dCB0aGUgdmVyc2lvbiBvZiBWaXN1YWwgQysrIHRoYXQgZ2VuZXJhdGVkIHRoZSBmaWxlLCBhbmQKKyAgICBpbmZvcm1hdGlvbiBhYm91dCB0aGUgcGxhdGZvcm1zLCBjb25maWd1cmF0aW9ucywgYW5kIHByb2plY3QgZmVhdHVyZXMgc2VsZWN0ZWQgd2l0aCB0aGUKKyAgICBBcHBsaWNhdGlvbiBXaXphcmQuCisKK0MudmN4cHJvai5maWx0ZXJzCisgICAgVGhpcyBpcyB0aGUgZmlsdGVycyBmaWxlIGZvciBWQysrIHByb2plY3RzIGdlbmVyYXRlZCB1c2luZyBhbiBBcHBsaWNhdGlvbiBXaXphcmQuIAorICAgIEl0IGNvbnRhaW5zIGluZm9ybWF0aW9uIGFib3V0IHRoZSBhc3NvY2lhdGlvbiBiZXR3ZWVuIHRoZSBmaWxlcyBpbiB5b3VyIHByb2plY3QgCisgICAgYW5kIHRoZSBmaWx0ZXJzLiBUaGlzIGFzc29jaWF0aW9uIGlzIHVzZWQgaW4gdGhlIElERSB0byBzaG93IGdyb3VwaW5nIG9mIGZpbGVzIHdpdGgKKyAgICBzaW1pbGFyIGV4dGVuc2lvbnMgdW5kZXIgYSBzcGVjaWZpYyBub2RlIChmb3IgZS5nLiAiLmNwcCIgZmlsZXMgYXJlIGFzc29jaWF0ZWQgd2l0aCB0aGUKKyAgICAiU291cmNlIEZpbGVzIiBmaWx0ZXIpLgorCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworT3RoZXIgbm90ZXM6CisKK0FwcFdpemFyZCB1c2VzICJUT0RPOiIgY29tbWVudHMgdG8gaW5kaWNhdGUgcGFydHMgb2YgdGhlIHNvdXJjZSBjb2RlIHlvdQorc2hvdWxkIGFkZCB0byBvciBjdXN0b21pemUuCisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCmRpZmYgLS1naXQgYS9zcmMvUmVjaXBpZW50LmMgYi9zcmMvUmVjaXBpZW50LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGY2Y2IxZgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9SZWNpcGllbnQuYwpAQCAtMCwwICsxLDExMiBAQAorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPG1lbW9yeS5oPgorCisjaW5jbHVkZSAiY29zZS5oIgorI2luY2x1ZGUgImNvc2VfaW50LmgiCisjaW5jbHVkZSAiY29uZmlndXJlLmgiCisjaW5jbHVkZSAiY3J5cHRvLmgiCisKK2Jvb2wgSXNWYWxpZFJlY2lwaWVudEhhbmRsZShIQ09TRV9SRUNJUElFTlQgaCkKK3sKKwlpZiAoaCA9PSBOVUxMKSByZXR1cm4gZmFsc2U7CisJcmV0dXJuIHRydWU7Cit9CisKK0hDT1NFX1JFQ0lQSUVOVCBDT1NFX0VuY3J5cHRfR2V0UmVjaXBpZW50KEhDT1NFX0VOQ1JZUFQgY29zZSwgaW50IGlSZWNpcGllbnQsIGNvc2VfZXJyYmFjayAqIHBlcnIpCit7CisJaW50IGk7CisJQ09TRV9SZWNpcGllbnRJbmZvICogcDsKKworCWlmICghSXNWYWxpZEVuY3J5cHRIYW5kbGUoY29zZSkpIHsKKwkJaWYgKHBlcnIgIT0gTlVMTCkgcGVyci0+ZXJyID0gQ09TRV9FUlJfSU5WQUxJRF9QQVJBTUVURVI7CisJCXJldHVybiBOVUxMOworCX0KKworCXAgPSAoKENPU0VfRW5jcnlwdCAqKWNvc2UpLT5tX3JlY2lwaWVudEZpcnN0OworCWZvciAoaSA9IDA7IGkgPCBpUmVjaXBpZW50OyBpKyspIHsKKwkJaWYgKHAgPT0gTlVMTCkgeworCQkJaWYgKHBlcnIgIT0gTlVMTCkgcGVyci0+ZXJyID0gQ09TRV9FUlJfSU5WQUxJRF9QQVJBTUVURVI7CisJCQlyZXR1cm4gTlVMTDsKKwkJfQorCX0KKwlyZXR1cm4gKEhDT1NFX1JFQ0lQSUVOVClwOworfQorCitDT1NFX1JlY2lwaWVudEluZm8gKiBfQ09TRV9SZWNpcGllbnRfSW5pdF9Gcm9tX09iamVjdChjbl9jYm9yICogY2JvciwgQ0JPUl9DT05URVhUX0NPTU1BIGNvc2VfZXJyYmFjayAqIGVycnApCit7CisJQ09TRV9SZWNpcGllbnRJbmZvICogcFJlY2lwaWVudCA9IE5VTEw7CisKKwlwUmVjaXBpZW50ID0gKENPU0VfUmVjaXBpZW50SW5mbyAqKUNPU0VfQ0FMTE9DKDEsIHNpemVvZihDT1NFX1JlY2lwaWVudEluZm8pLCBjb250ZXh0KTsKKwlpZiAocFJlY2lwaWVudCA9PSBOVUxMKSB7CisJCWlmIChlcnJwICE9IE5VTEwpIGVycnAtPmVyciA9IENPU0VfRVJSX09VVF9PRl9NRU1PUlk7CisJCXJldHVybiBOVUxMOworCX0KKworCWlmIChfQ09TRV9FbmNyeXB0X0luaXRfRnJvbV9PYmplY3QoY2JvciwgJnBSZWNpcGllbnQtPm1fZW5jcnlwdCwgQ0JPUl9DT05URVhUX1BBUkFNX0NPTU1BIGVycnApID09IE5VTEwpIHsKKwkJX0NPU0VfUmVjaXBpZW50X0ZyZWUocFJlY2lwaWVudCk7CisJCXJldHVybiBOVUxMOworCX0KKworCXJldHVybiBwUmVjaXBpZW50OworfQorCit2b2lkIF9DT1NFX1JlY2lwaWVudF9GcmVlKENPU0VfUmVjaXBpZW50SW5mbyAqIHBSZWNpcGllbnQpCit7CisJQ09TRV9GUkVFKHBSZWNpcGllbnQsICZwUmVjaXBpZW50LT5tX2VuY3J5cHQubV9tZXNzYWdlLm1fYWxsb2NDb250ZXh0KTsKKworCXJldHVybjsKK30KKworYm9vbCBfQ09TRV9SZWNpcGllbnRfZGVjcnlwdChDT1NFX1JlY2lwaWVudEluZm8gKiBwUmVjaXAsIGludCBjYml0S2V5LCBieXRlICogcGJLZXksIGNvc2VfZXJyYmFjayAqIHBlcnIpCit7CisJcmV0dXJuIF9DT1NFX0VuY3J5cHRfZGVjcnlwdCgmcFJlY2lwLT5tX2VuY3J5cHQsIE5VTEwsIHBlcnIpOworfQorCisKK2J5dGUgKiBfQ09TRV9SZWNpcGllbnRJbmZvX2dlbmVyYXRlS2V5KENPU0VfUmVjaXBpZW50SW5mbyAqIHBSZWNpcGllbnQsIHNpemVfdCBjYml0S2V5U2l6ZSkKK3sKKwlpbnQgYWxnOworCWNvbnN0IGNuX2Nib3IgKiBjbl9BbGcgPSBfQ09TRV9tYXBfZ2V0X2ludCgmcFJlY2lwaWVudC0+bV9lbmNyeXB0Lm1fbWVzc2FnZSwgQ09TRV9IZWFkZXJfQWxnb3JpdGhtLCBDT1NFX0JPVEgsIE5VTEwpOworCisJaWYgKGNuX0FsZyA9PSBOVUxMKSByZXR1cm4gZmFsc2U7CisJaWYgKGNuX0FsZy0+dHlwZSAhPSBDTl9DQk9SX1VJTlQpIHJldHVybiBmYWxzZTsKKwlhbGcgPSBjbl9BbGctPnYudWludDsKKworCXN3aXRjaCAoYWxnKSB7CisJY2FzZSBDT1NFX0FsZ29yaXRobV9EaXJlY3Q6CisJeworCQlpZiAocFJlY2lwaWVudC0+bV9lbmNyeXB0LmNiS2V5ICE9IGNiaXRLZXlTaXplIC8gOCkgcmV0dXJuIE5VTEw7CisJCWJ5dGUgKiBwYiA9IChieXRlICopbWFsbG9jKGNiaXRLZXlTaXplIC8gOCk7CisJCWlmIChwYiA9PSBOVUxMKSByZXR1cm4gTlVMTDsKKwkJbWVtY3B5KHBiLCBwUmVjaXBpZW50LT5tX2VuY3J5cHQucGJLZXksIGNiaXRLZXlTaXplIC8gOCk7CisJCXJldHVybiBwYjsKKwl9CisJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlyZXR1cm4gTlVMTDsKKwl9Cit9CisKK2Jvb2wgQ09TRV9SZWNpcGllbnRfU2V0S2V5KEhDT1NFX1JFQ0lQSUVOVCBoLCBjb25zdCBieXRlICogcGJLZXksIGludCBjYktleSwgY29zZV9lcnJiYWNrICogcGVycm9yKQoreworCUNPU0VfUmVjaXBpZW50SW5mbyAqIHA7CisKKwlpZiAoIUlzVmFsaWRSZWNpcGllbnRIYW5kbGUoaCkgfHwgKHBiS2V5ID09IE5VTEwpKSB7CisJCWlmIChwZXJyb3IgIT0gTlVMTCkgcGVycm9yLT5lcnIgPSBDT1NFX0VSUl9DQk9SOworCQlyZXR1cm4gZmFsc2U7CisJfQorCisJcCA9IChDT1NFX1JlY2lwaWVudEluZm8gKiloOworCisJcC0+bV9lbmNyeXB0LnBiS2V5ID0gKGJ5dGUgKilDT1NFX0NBTExPQyhjYktleSwgMSwgJnAtPm1fZW5jcnlwdC5tX21lc3NhZ2UubV9hbGxvY0NvbnRleHQpOworCWlmIChwLT5tX2VuY3J5cHQucGJLZXkgPT0gTlVMTCkgeworCQlpZiAocGVycm9yICE9IE5VTEwpIHBlcnJvci0+ZXJyID0gQ09TRV9FUlJfT1VUX09GX01FTU9SWTsKKwkJcmV0dXJuIGZhbHNlOworCX0KKworCW1lbWNweShwLT5tX2VuY3J5cHQucGJLZXksIHBiS2V5LCBjYktleSk7CisJcC0+bV9lbmNyeXB0LmNiS2V5ID0gY2JLZXk7CisKKwlyZXR1cm4gdHJ1ZTsKK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9zcmMvU2lnbi5jIGIvc3JjL1NpZ24uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNjQ4NDM3Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL1NpZ24uYwpAQCAtMCwwICsxLDY2IEBACisjaW5jbHVkZSA8c3RkbGliLmg+CisKKyNpbmNsdWRlICJjb3NlLmgiCisjaW5jbHVkZSAiY29zZV9pbnQuaCIKKworCitIQ09TRSBDT1NFX0RlY29kZShjb25zdCBieXRlICogcmdiRGF0YSwgaW50IGNiRGF0YSwgaW50ICogcHR5cGUsIENCT1JfQ09OVEVYVF9DT01NQSBjb3NlX2VycmJhY2sgKiBlcnJwKQoreworCWNuX2Nib3IgKiBjYm9yOworCWNvbnN0IGNuX2Nib3IgKiBwVHlwZSA9IE5VTEw7CisJSENPU0UgaDsKKworCWlmICgocmdiRGF0YSA9PSBOVUxMKSB8fCAocHR5cGUgPT0gTlVMTCkpIHsKKwkJaWYgKGVycnAgIT0gTlVMTCkgZXJycC0+ZXJyID0gQ09TRV9FUlJfSU5WQUxJRF9QQVJBTUVURVI7CisJCXJldHVybiBOVUxMOworCX0KKworCWNib3IgPSAoY25fY2JvciAqKSBjbl9jYm9yX2RlY29kZShyZ2JEYXRhLCBjYkRhdGEsIENCT1JfQ09OVEVYVF9QQVJBTV9DT01NQSBOVUxMKTsKKwlpZiAoY2JvciA9PSBOVUxMKSB7CisJCWlmIChlcnJwICE9IE5VTEwpIGVycnAtPmVyciA9IENPU0VfRVJSX0NCT1I7CisJCXJldHVybiBOVUxMOworCX0KKworCWlmIChjYm9yLT50eXBlICE9IENOX0NCT1JfTUFQKSB7CisJZXJyb3I6CisJCUNPU0VfRlJFRShjYm9yLCBjb250ZXh0KTsKKwkJaWYgKGVycnAgIT0gTlVMTCkgZXJycC0+ZXJyID0gQ09TRV9FUlJfSU5WQUxJRF9QQVJBTUVURVI7CisJCXJldHVybiBOVUxMOworCX0KKworCXBUeXBlID0gY25fY2Jvcl9tYXBnZXRfaW50KGNib3IsIENPU0VfSGVhZGVyX1R5cGUpOworCWlmICgocFR5cGUgPT0gTlVMTCkgfHwgKHBUeXBlLT50eXBlICE9IENOX0NCT1JfVUlOVCkpIGdvdG8gZXJyb3I7CisKKwlzd2l0Y2ggKHBUeXBlLT52LnNpbnQpIHsKKwljYXNlIDE6CisJCWggPSAoSENPU0UpIF9DT1NFX0VuY3J5cHRfSW5pdF9Gcm9tX09iamVjdChjYm9yLCBOVUxMLCBDQk9SX0NPTlRFWFRfUEFSQU1fQ09NTUEgZXJycCk7CisJCWlmIChoID09IE5VTEwpIHsKKwkJCUNPU0VfRlJFRShjYm9yLCBjb250ZXh0KTsKKwkJCXJldHVybiBOVUxMOworCQl9CisJCXJldHVybiBoOworCisvLwljYXNlIDI6CisvLwkJcmV0dXJuIChDT1NFICopQ09TRV9TaWduX0luaXQoY2JvciBDQk9SX0NPTlRFWFRfUEFSQU0pOworCX0KKworCWdvdG8gZXJyb3I7Cit9CisKKyNpZiAwCitDT1NFX1NpZ25NZXNzYWdlICogQ09TRV9TaWduX0luaXQoY29uc3QgY25fY2JvciAqIENCT1JfQ09OVEVYVCkKK3sKKwlDT1NFX1NpZ25NZXNzYWdlICogbXNnOworCisjaWZkZWYgVVNFX0NCT1JfQ09OVEVYVAorCW1zZyA9IChDT1NFX1NpZ25NZXNzYWdlICopIGNvbnRleHQtPmNhbGxvY19mdW5jKDEsIHNpemVvZihDT1NFX1NpZ25NZXNzYWdlKSwgY29udGV4dC0+Y29udGV4dCk7CisjZWxzZQorCW1zZyA9IChDT1NFX1NpZ25NZXNzYWdlICopIGNhbGxvYygxLCBzaXplb2YoQ09TRV9TaWduTWVzc2FnZSkpOworI2VuZGlmCisKKwltc2ctPm1fbWVzc2FnZS5tX2ZsYWdzID0gMTsKKwltc2ctPm1fbWVzc2FnZS5tX2Nib3IgPSAoY25fY2JvciAqKSBtc2c7CisKKwlyZXR1cm4gbXNnOworfQorI2VuZGlmCmRpZmYgLS1naXQgYS9zcmMvYmNyeXB0LmMgYi9zcmMvYmNyeXB0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDQ5MDdlOAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9iY3J5cHQuYwpAQCAtMCwwICsxLDY0IEBACisjaW5jbHVkZSAiY29zZS5oIgorI2luY2x1ZGUgImNvbmZpZ3VyZS5oIgorI2luY2x1ZGUgImNvc2VfaW50LmgiCisjaW5jbHVkZSAiY3J5cHRvLmgiCisKKyNpZiBVU0VfQkNSWVBUCisKKyNpbmNsdWRlIDxXaW5kb3dzLmg+CisKK2Jvb2wgQUVTX0NDTV9FbmNyeXB0KENPU0VfRW5jcnlwdCAqIHBjb3NlLCBpbnQgVFNpemUsIGludCBMU2l6ZSwgaW50IEtTaXplLCBieXRlICogcGJBdXRoRGF0YSwgaW50IGNiQXV0aERhdGEpCit7CisJTlRTVEFUVVMgZXJyOworCUJDUllQVF9BTEdfSEFORExFIGhBbGcgPSBOVUxMOworCUJDUllQVF9LRVlfREFUQV9CTE9CX0hFQURFUiAqIHBIZHIgPSBOVUxMOworCUJDUllQVF9LRVlfSEFORExFIGhLZXkgPSBOVUxMOworCUJDUllQVF9BVVRIRU5USUNBVEVEX0NJUEhFUl9NT0RFX0lORk8gYXV0aEluZm8gPSB7IDAgfTsKKwlieXRlIHJnYlRhZ1sxNl07CisJaW50IGNiT3V0OworCWJ5dGUgKiBwYk91dCA9IE5VTEw7CisKKwllcnIgPSBCQ3J5cHRPcGVuQWxnb3JpdGhtUHJvdmlkZXIoJmhBbGcsICJBRVNfQ0NNIiwgTlVMTCwgMCk7CisJaWYgKGVyciAhPSAwKSB7CisJZXJyb3I6CisJCWlmIChwYk91dCAhPSBOVUxMKSBmcmVlKHBiT3V0KTsKKwkJaWYgKHBIZHIgIT0gTlVMTCkgZnJlZShwSGRyKTsKKwkJaWYgKGhLZXkgIT0gTlVMTCkgQkNyeXB0RGVzdHJveUtleShoS2V5KTsKKwkJaWYgKGhBbGcgIT0gTlVMTCkgQkNyeXB0Q2xvc2VBbGdvcml0aG1Qcm92aWRlcihoQWxnLCAwKTsKKwkJcmV0dXJuIGZhbHNlOworCX0KKworCXBIZHIgPSAoQkNSWVBUX0tFWV9EQVRBX0JMT0JfSEVBREVSICopbWFsbG9jKHNpemVvZigqcEhkcikgKyBLU2l6ZSAvIDgpOworCWlmIChwSGRyID09IE5VTEwpIGdvdG8gZXJyb3I7CisJcEhkci0+ZHdNYWdpYyA9IEJDUllQVF9LRVlfREFUQV9CTE9CX01BR0lDOworCXBIZHItPmR3VmVyc2lvbiA9IEJDUllQVF9LRVlfREFUQV9CTE9CX1ZFUlNJT04xOworCXBIZHItPmNiS2V5RGF0YSA9IEtTaXplIC8gODsKKwltZW1jcHkoJnBIZHJbMV0sIHBjb3NlLT5wYktleSwgcGNvc2UtPmNiS2V5KTsKKworCWVyciA9IEJDcnlwdEltcG9ydEtleShoQWxnLCBOVUxMLCBCQ1JZUFRfS0VZX0RBVEFfQkxPQiwgJmhLZXksIE5VTEwsIDAsIHBIZHIsIChzaXplb2YoKnBIZHIpICsgS1NpemUgLyA4KSwgMCk7CisJaWYgKGVyciAhPSAwKSBnb3RvIGVycm9yOworCisJQkNSWVBUX0lOSVRfQVVUSF9NT0RFX0lORk8oYXV0aEluZm8pOworCWF1dGhJbmZvLnBiTm9uY2UgPSBwY29zZS0+cGJJVjsKKwlhdXRoSW5mby5jYk5vbmNlID0gcGNvc2UtPmNiSVY7CisJYXV0aEluZm8ucGJBdXRoRGF0YSA9IHBiQXV0aERhdGE7CisJYXV0aEluZm8uY2JBdXRoRGF0YSA9IGNiQXV0aERhdGE7CisJYXV0aEluZm8ucGJUYWcgPSByZ2JUYWc7CisJYXV0aEluZm8uY2JUYWcgPSBUU2l6ZSAvIDg7CisJYXV0aEluZm8ucGJNYWNDb250ZXh0ID0gTlVMTDsKKworCWNiT3V0ID0gcGNvc2UtPmNiQ29udGVudCArIFRTaXplIC8gODsKKwlwYk91dCA9IChieXRlICopbWFsbG9jKGNiT3V0KTsKKwlpZiAocGJPdXQgPT0gTlVMTCkgZ290byBlcnJvcjsKKworCWVyciA9IEJDcnlwdEVuY3J5cHQoaEtleSwgcGNvc2UtPnBiQ29udGVudCwgcGNvc2UtPmNiQ29udGVudCwgJmF1dGhJbmZvLCBOVUxMLCAwLCBwYk91dCwgY2JPdXQsIDAsIDApOworCWlmIChlcnIgIT0gMCkgZ290byBlcnJvcjsKKworCW1lbWNweSgmcGJPdXRbcGNvc2UtPmNiQ29udGVudF0sIHJnYlRhZywgVFNpemUgLyA4KTsKKworCWNuX2Nib3JfbWFwcHV0X2ludChwY29zZS0+bV9tZXNzYWdlLm1fY2JvciwgQ09TRV9IZWFkZXJfQ2lwaGVydGV4dCwgY25fY2Jvcl9kYXRhX2NyZWF0ZShwYk91dCwgY2JPdXQsIE5VTEwpLCBOVUxMKTsKKworCXJldHVybiB0cnVlOworfQorCisjZW5kaWYgLy8gVVNFX0JDUllQVApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3NyYy9jb25maWd1cmUuaCBiL3NyYy9jb25maWd1cmUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YjhlZjIzCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2NvbmZpZ3VyZS5oCkBAIC0wLDAgKzEsNSBAQAorI2RlZmluZSBJTkNMVURFX0FFU19DQ01fNjQgMQorCisKKyNkZWZpbmUgVVNFX09QRU5fU1NMIDEKKyNkZWZpbmUgVVNFX0JDUllQVCAwCmRpZmYgLS1naXQgYS9zcmMvY29zZS5oIGIvc3JjL2Nvc2UuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMDgxMWMxCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2Nvc2UuaApAQCAtMCwwICsxLDk1IEBACisjZGVmaW5lIFVTRV9DQk9SX0NPTlRFWFQgMQorCisjaW5jbHVkZSA8Y24tY2Jvclxjbi1jYm9yLmg+CisjaW5jbHVkZSAiY29uZmlndXJlLmgiCit0eXBlZGVmIHVuc2lnbmVkIGNoYXIgYnl0ZTsKKwordHlwZWRlZiBzdHJ1Y3QgX2Nvc2UgKiBIQ09TRTsKK3R5cGVkZWYgc3RydWN0IF9jb3NlX3NpZ24gKiBIQ09TRV9TSUdOOwordHlwZWRlZiBzdHJ1Y3QgX2Nvc2VfZW5jcnlwdCAqIEhDT1NFX0VOQ1JZUFQ7Cit0eXBlZGVmIHN0cnVjdCBfY29zZV9yZWNpcGllbnQgKiBIQ09TRV9SRUNJUElFTlQ7CisKKworLyoqCisqIEFsbCBvZiB0aGUgZGlmZmVyZW50IGtpbmRzIG9mIGVycm9ycworKi8KK3R5cGVkZWYgZW51bSBjb3NlX2Vycm9yIHsKKwkvKiogTm8gZXJyb3IgaGFzIG9jY3VycmVkICovCisJQ09TRV9FUlJfTk9ORSwKKwkvKiogQW4gaW52YWxpZCBwYXJhbWV0ZXIgd2FzIHBhc3NlZCB0byBhIGZ1bmN0aW9uICovCisJQ09TRV9FUlJfSU5WQUxJRF9QQVJBTUVURVIsCisJLyoqIEFsbG9jYXRpb24gZmFpbGVkICovCisJQ09TRV9FUlJfT1VUX09GX01FTU9SWSwKKwkvKiogRXJyb3IgaW4gcHJvY2Vzc2luZyBDQk9SICovCisJQ09TRV9FUlJfQ0JPUiwKKwkvKiogVW5rbm93biBhbGdvcml0aG0gZm91bmQgKi8KKwlDT1NFX0VSUl9VTktOT1dOX0FMR09SSVRITSwKKwkvKiogTm8gdXNhYmxlIHJlY2lwaWVudCBmb3VuZCAqLworCUNPU0VfRVJSX05PX1JFQ0lQSUVOVF9GT1VORCwKKwkvKiogRGVjcnlwdGlvbiBvcGVyYXRpb24gZmFpbGVkICovCisJQ09TRV9FUlJfREVDUllQVF9GQUlMRUQKK30gY29zZV9lcnJvcjsKKworLyoqCisqIEVycm9ycworKi8KK3R5cGVkZWYgc3RydWN0IGNvc2VfZXJyYmFjayB7CisJLyoqIFRoZSBlcnJvciwgb3IgQ05fQ0JPUl9OT19FUlJPUiBpZiBub25lICovCisJY29zZV9lcnJvciBlcnI7Cit9IGNvc2VfZXJyYmFjazsKKworLy8gIEdlbmVyaWMgZnVuY3Rpb25zIGZvciB0aGUgQ09TRSBsaWJyYXJ5CisKK0hDT1NFIENPU0VfRGVjb2RlKGNvbnN0IGJ5dGUgKiByZ2JEYXRhLCBpbnQgY2JEYXRhLCBpbnQgKiB0eXBlLCBDQk9SX0NPTlRFWFRfQ09NTUEgY29zZV9lcnJiYWNrICogcGVycik7ICAvLyAgRGVjb2RlIHRoZSBvYmplY3QKK3NpemVfdCBDT1NFX0VuY29kZShIQ09TRSBtc2csIGJ5dGUgKiByZ2IsIGludCBpYiwgc2l6ZV90IGNiKTsKKworY25fY2JvciAqIENPU0VfZ2V0X2Nib3IoSENPU0UgaG1zZyk7CisKKy8vICBGdW5jdGlvbnMgZm9yIHRoZSBzaWduaW5nIG9iamVjdAorCitIQ09TRV9TSUdOICogQ09TRV9TaWduX0luaXQoQ0JPUl9DT05URVhUX0NPTU1BIGNvc2VfZXJyYmFjayAqIHBlcnIpOworLy8gQ09TRV9TaWduTWVzc2FnZSAqIENPU0VfU2lnbl9Jbml0KGNvbnN0IGNuX2Nib3IgKiBDT01NQV9DQk9SX0NPTlRFWFQpOworCisKK0hDT1NFX0VOQ1JZUFQgIENPU0VfRW5jcnlwdF9Jbml0KENCT1JfQ09OVEVYVF9DT01NQSBjb3NlX2VycmJhY2sgKiBwZXJyKTsKK2Jvb2wgQ09TRV9FbmNyeXB0X0ZyZWUoSENPU0VfRU5DUllQVCBjb3NlKTsKKwordHlwZWRlZiBlbnVtIHsKKwlDT1NFX1BST1RFQ1RfT05MWSA9IDEsCisJQ09TRV9VTlBST1RFQ1RfT05MWSA9IDIsCisJQ09TRV9CT1RIID0gMworfSBjb3NlX3Byb3RlY3Rfc3RhdGU7CisKK3R5cGVkZWYgZW51bSB7CisJQ09TRV9BbGdvcml0aG1fQUVTX0NDTV82NCA9IDEsCisJQ09TRV9BbGdvcml0aG1fRGlyZWN0LAorCUNPU0VfQWxnb3JpdGhtX0VDREhfRVNfRGlyZWN0Cit9IENPU0VfQWxnb3JpdGhtczsKKwordHlwZWRlZiBlbnVtIHsKKwlDT1NFX0hlYWRlcl9BbGdvcml0aG0gPSAxLAorCUNPU0VfSGVhZGVyX0tJRCwKKwlDT1NFX0hlYWRlcl9Qcm90ZWN0ZWQsCisJQ09TRV9IZWFkZXJfVW5wcm90ZWN0ZWQsCisJQ09TRV9IZWFkZXJfSVYsCisJQ09TRV9IZWFkZXJfQ2lwaGVydGV4dCwKKwlDT1NFX0hlYWRlcl9SZWNpcGllbnRzLAorCUNPU0VfSGVhZGVyX1R5cGUKK30gQ09TRV9IZWFkZXI7CisKKwordm9pZCBDT1NFX0VuY3J5cHRfU2V0Q29udGVudChIQ09TRV9FTkNSWVBUIGNvc2UsIGNvbnN0IGJ5dGUgKiByZ2JDb250ZW50LCBzaXplX3QgY2JDb250ZW50LCBjb3NlX2VycmJhY2sgKiBlcnJwKTsKK3ZvaWQgQ09TRV9FbmNyeXB0X1NldE5vbmNlKEhDT1NFX0VOQ1JZUFQgY29zZSwgYnl0ZSAqIHJnYklWLCBzaXplX3QgY2JJVik7CisKK2NvbnN0IGNuX2Nib3IgKiBDT1NFX0VuY3J5cHRfbWFwX2dldF9zdHJpbmcoSENPU0VfRU5DUllQVCBjb3NlLCBjb25zdCBjaGFyICoga2V5LCBpbnQgZmxhZ3MsIGNvc2VfZXJyYmFjayAqIGVycnApOworY29uc3QgY25fY2JvciAqIENPU0VfRW5jcnlwdF9tYXBfZ2V0X2ludChIQ09TRV9FTkNSWVBUIGNvc2UsIGludCBrZXksIGludCBmbGFncywgY29zZV9lcnJiYWNrICogZXJycCk7CisKK2Jvb2wgQ09TRV9FbmNyeXB0X21hcF9wdXQoSENPU0VfRU5DUllQVCBjb3NlLCBpbnQga2V5LCBjbl9jYm9yICogdmFsdWUsIGludCBmbGFncywgY29zZV9lcnJiYWNrICogZXJycCk7CisKK2Jvb2wgQ09TRV9FbmNyeXB0X2VuY3J5cHQoSENPU0VfRU5DUllQVCBjb3NlLCBjb3NlX2VycmJhY2sgKiBwZXJyb3IpOworYm9vbCBDT1NFX0VuY3J5cHRfZGVjcnlwdChIQ09TRV9FTkNSWVBULCBIQ09TRV9SRUNJUElFTlQsIGNvc2VfZXJyYmFjayAqIHBlcnIpOworCitIQ09TRV9SRUNJUElFTlQgQ09TRV9FbmNyeXB0X2FkZF9zaGFyZWRfc2VjcmV0KEhDT1NFX0VOQ1JZUFQgY29zZSwgQ09TRV9BbGdvcml0aG1zIGFsZ0lkLCBieXRlICogcmdiS2V5LCBpbnQgY2JLZXksIGJ5dGUgKiByZ2JLaWQsIGludCBjYktpZCwgY29zZV9lcnJiYWNrICogcGVycik7CisKK0hDT1NFX1JFQ0lQSUVOVCBDT1NFX0VuY3J5cHRfR2V0UmVjaXBpZW50KEhDT1NFX0VOQ1JZUFQgY29zZSwgaW50IGlSZWNpcGllbnQsIGNvc2VfZXJyYmFjayAqIHBlcnIpOworYm9vbCBDT1NFX1JlY2lwaWVudF9TZXRLZXkoSENPU0VfUkVDSVBJRU5UIGgsIGNvbnN0IGJ5dGUgKiByZ2IsIGludCBjYiwgY29zZV9lcnJiYWNrICogcGVycik7CmRpZmYgLS1naXQgYS9zcmMvY29zZV9pbnQuaCBiL3NyYy9jb3NlX2ludC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY5YWZlNmEKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvY29zZV9pbnQuaApAQCAtMCwwICsxLDExMyBAQAorLy8gVGhlc2UgZGVmaW5pdGlvbnMgYXJlIGhlcmUgYmVjYXVzZSB0aGV5IGFyZW4ndCByZXF1aXJlZCBmb3IgdGhlIHB1YmxpYworLy8gaW50ZXJmYWNlLCBhbmQgdGhleSB3ZXJlIHF1aXRlIGNvbmZ1c2luZyBpbiBjbi1jYm9yLmgKKwordHlwZWRlZiBzdHJ1Y3QgeworCWludCBtX2ZsYWdzOyAgICAgICAgLy8gIE5vdCBzdXJlIHdoYXQgZ29lcyBoZXJlIHlldAorCWludCBtX293bk1zZyA6IDE7CS8vICBEbyBJIG93biB0aGUgcG9pbnRlciBAIG1fY2Jvcj8KKwlpbnQgbV9vd25VbnByb3RlY3RlZE1hcCA6IDE7IC8vICBEbyBJIG93biB0aGUgcG9pbnRlciBAIG1fdW5wb3J0ZWN0ZWRNYXA/CisJaW50IG1fbXNnVHlwZSA6IDQ7CS8vICBXaGF0IG1lc3NhZ2UgdHlwZSBpcyB0aGlzPworCWNuX2Nib3IgKiBtX2Nib3I7CisJY25fY2JvciAqIG1fcHJvdGVjdGVkTWFwOworCWNuX2Nib3IgKiBtX3VucHJvdGVjdE1hcDsKKyNpZmRlZiBVU0VfQ0JPUl9DT05URVhUCisJY25fY2Jvcl9jb250ZXh0IG1fYWxsb2NDb250ZXh0OworI2VuZGlmCit9IENPU0U7CisKK3R5cGVkZWYgc3RydWN0IHsKKwlDT1NFIG1fbWVzc2FnZTsJICAgIC8vIFRoZSBtZXNzYWdlIG9iamVjdAorfSBDT1NFX1NpZ25NZXNzYWdlOworCisKK3N0cnVjdCBfUmVjaXBpZW50SW5mbzsKK3R5cGVkZWYgc3RydWN0IF9SZWNpcGllbnRJbmZvIENPU0VfUmVjaXBpZW50SW5mbzsKKwordHlwZWRlZiBzdHJ1Y3QgeworCUNPU0UgbV9tZXNzYWdlOwkJLy8gVGhlIG1lc3NhZ2Ugb2JqZWN0CisJQ09TRV9SZWNpcGllbnRJbmZvICogbV9yZWNpcGllbnRGaXJzdDsKKwlieXRlICogcGJDb250ZW50OworCXNpemVfdCBjYkNvbnRlbnQ7CisJYnl0ZSAqIHBiS2V5OworCXNpemVfdCBjYktleTsKKy8vCWJ5dGUgKiBwYklWOworLy8Jc2l6ZV90IGNiSVY7Cit9IENPU0VfRW5jcnlwdDsKKwordHlwZWRlZiBzdHJ1Y3QgX1JlY2lwaWVudEluZm8geworCUNPU0VfRW5jcnlwdCBtX2VuY3J5cHQ7CisJQ09TRV9SZWNpcGllbnRJbmZvICogbV9yZWNpcGllbnROZXh0OworfSBDT1NFX1JlY2lwaWVudEluZm87CisKKworI2lmZGVmIFVTRV9DQk9SX0NPTlRFWFQKKy8qKgorKiBBbGxvY2F0ZSBlbm91Z2ggc3BhY2UgZm9yIDEgYGNuX2Nib3JgIHN0cnVjdHVyZS4KKyoKKyogQHBhcmFtW2luXSAgY3R4ICBUaGUgYWxsb2NhdGlvbiBjb250ZXh0LCBvciBOVUxMIGZvciBjYWxsb2MuCisqIEByZXR1cm4gICAgICAgICAgQSBwb2ludGVyIHRvIGEgYGNuX2Nib3JgIG9yIE5VTEwgb24gZmFpbHVyZQorKi8KKyNkZWZpbmUgQ05fQ0FMTE9DKGN0eCkgKChjdHgpICYmIChjdHgpLT5jYWxsb2NfZnVuYykgPyBcCisgICAgKGN0eCktPmNhbGxvY19mdW5jKDEsIHNpemVvZihjbl9jYm9yKSwgKGN0eCktPmNvbnRleHQpIDogXAorICAgIGNhbGxvYygxLCBzaXplb2YoY25fY2JvcikpOworCisvKioKKyogIEFsbG9jYXRlIHNwYWNlIHJlcXVpcmVkCisqCisqIEBwYXJhbVtpbl0JY3R4ICBUaGUgYWxsb2NhdGlvbiBjb250ZXh0LCBvciBOVUxMIGZvciBub3JtYWwgY2FsbG9jLgorKiBAcGFyYW1baW5dCWNvdW50CU51bWJlciBvZiBpdGVtcyB0byBhbGxvY2F0ZQorKiBAcGFyYW1baW5dCXNpemUJU2l6ZSBvZiBpdGVtIHRvIGFsbG9jYXRlCisqIEByZXR1cm4JCQkJQSBwb2ludGVyIHRvIHRoZSBvYmplY3QgbmVlZGVkCisqLworI2RlZmluZSBDT1NFX0NBTExPQyhjb3VudCwgc2l6ZSwgY3R4KSAoKCgoY3R4KSkgJiYgKChjdHgpLT5jYWxsb2NfZnVuYykpID8gXAorCSgoY3R4KS0+Y2FsbG9jX2Z1bmMoY291bnQsIHNpemUsIChjdHgpLT5jb250ZXh0KSkgOiBcCisJY2FsbG9jKGNvdW50LCBzaXplKSkKKworLyoqCisqIEZyZWUgYQorKiBAcGFyYW0gIGZyZWVfZnVuYyBbZGVzY3JpcHRpb25dCisqIEByZXR1cm4gICAgICAgICAgIFtkZXNjcmlwdGlvbl0KKyovCisjZGVmaW5lIENPU0VfRlJFRShwdHIsIGN0eCkgKCgoY3R4KSAmJiAoY3R4KS0+ZnJlZV9mdW5jKSA/IFwKKyAgICAoKGN0eCktPmZyZWVfZnVuYygocHRyKSwgKGN0eCktPmNvbnRleHQpKSA6IFwKKyAgICBmcmVlKChwdHIpKSkKKworI2RlZmluZSBDQk9SX0NPTlRFWFRfUEFSQU0gLCBjb250ZXh0CisjZGVmaW5lIENCT1JfQ09OVEVYVF9QQVJBTV9DT01NQSBjb250ZXh0ICwKKy8vI2RlZmluZSBDTl9DQUxMT0NfQ09OVEVYVCgpIENOX0NBTExPQyhjb250ZXh0KQorI2RlZmluZSBDTl9DQk9SX0ZSRUUocCwgY29udGV4dCkgY25fY2Jvcl9mcmVlKHAsIGNvbnRleHQpCisKKyNlbHNlCisKKyNkZWZpbmUgQ0JPUl9DT05URVhUX1BBUkFNCisjZGVmaW5lIENOX0NBTExPQ19DT05URVhUKCkgQ05fQ0FMTE9DCisjZGVmaW5lIENPU0VfQ0FMTE9DKGN0eCwgY291bnQsIHNpemUpIGNhbGxvYyhjb3VudCwgc2l6ZSkKKyNkZWZpbmUgQ05fQ0JPUl9GUkVFKHAsIGNvbnRleHQpIGNuX2Nib3JfZnJlZShwKQorCisjZGVmaW5lIENPU0VfRlJFRShwdHIsIGN0eCkgZnJlZShwdHIpCisKKyNlbmRpZiAvLyBVU0VfQ0JPUl9DT05URVhUCisKKyNpZm5kZWYgVU5VU0VEX1BBUkFNCisjZGVmaW5lIFVOVVNFRF9QQVJBTShwKSAoKHZvaWQpJihwKSkKKyNlbmRpZgorCitleHRlcm4gYm9vbCBJc1ZhbGlkRW5jcnlwdEhhbmRsZShIQ09TRV9FTkNSWVBUIGgpOworZXh0ZXJuIGJvb2wgSXNWYWxpZFJlY2lwaWVudEhhbmRsZShIQ09TRV9SRUNJUElFTlQgaCk7CisKK2V4dGVybiBib29sIF9DT1NFX0luaXQoQ09TRSAqIHBjb3NlLCBDQk9SX0NPTlRFWFRfQ09NTUEgY29zZV9lcnJiYWNrICogZXJycCk7CitleHRlcm4gYm9vbCBfQ09TRV9Jbml0X0Zyb21fT2JqZWN0KENPU0UqIHBvYmosIGNuX2Nib3IgKiBwY2JvciwgQ0JPUl9DT05URVhUX0NPTU1BIGNvc2VfZXJyYmFjayAqIHBlcnJvcik7CitleHRlcm4gdm9pZCBfQ09TRV9SZWxlYXNlKENPU0UgKiBwY29zZSk7CisKK2V4dGVybiBjb25zdCBjbl9jYm9yICogX0NPU0VfbWFwX2dldF9zdHJpbmcoQ09TRSAqIGNvc2UsIGNvbnN0IGNoYXIgKiBrZXksIGludCBmbGFncywgY29zZV9lcnJiYWNrICogZXJycCk7CitleHRlcm4gY29uc3QgY25fY2JvciAqIF9DT1NFX21hcF9nZXRfaW50KENPU0UgKiBjb3NlLCBpbnQga2V5LCBpbnQgZmxhZ3MsIGNvc2VfZXJyYmFjayAqIGVycnApOworZXh0ZXJuIGJvb2wgX0NPU0VfbWFwX3B1dChDT1NFICogY29zZSwgaW50IGtleSwgY25fY2JvciAqIHZhbHVlLCBpbnQgZmxhZ3MsIGNvc2VfZXJyYmFjayAqIGVycnApOworCitleHRlcm4gSENPU0VfRU5DUllQVCBfQ09TRV9FbmNyeXB0X0luaXRfRnJvbV9PYmplY3QoY25fY2JvciAqLCBDT1NFX0VuY3J5cHQgKiBwSW4sIENCT1JfQ09OVEVYVF9DT01NQSBjb3NlX2VycmJhY2sgKiBlcnJwKTsKK2V4dGVybiB2b2lkIF9DT1NFX0VuY3J5cHRfUmVsZWFzZShDT1NFX0VuY3J5cHQgKiBwKTsKK2V4dGVybiBib29sIF9DT1NFX0VuY3J5cHRfZGVjcnlwdChDT1NFX0VuY3J5cHQgKiBwYm9keSwgQ09TRV9SZWNpcGllbnRJbmZvICogcFJlY2lwLCBjb3NlX2VycmJhY2sgKiBwZXJyKTsKK2V4dGVybiB2b2lkIF9DT1NFX0VuY3J5cHRfU2V0Q29udGVudChDT1NFX0VuY3J5cHQgKiBjb3NlLCBjb25zdCBieXRlICogcmdiQ29udGVudCwgc2l6ZV90IGNiQ29udGVudCwgY29zZV9lcnJiYWNrICogZXJycCk7CisKK2V4dGVybiBDT1NFX1JlY2lwaWVudEluZm8gKiBfQ09TRV9SZWNpcGllbnRfSW5pdF9Gcm9tX09iamVjdChjbl9jYm9yICosIENCT1JfQ09OVEVYVF9DT01NQSBjb3NlX2VycmJhY2sgKiBlcnJwKTsKK2V4dGVybiB2b2lkIF9DT1NFX1JlY2lwaWVudF9GcmVlKENPU0VfUmVjaXBpZW50SW5mbyAqKTsKK2V4dGVybiBib29sIF9DT1NFX1JlY2lwaWVudF9kZWNyeXB0KENPU0VfUmVjaXBpZW50SW5mbyAqIHBSZWNpcCwgaW50IGNiaXRLZXksIGJ5dGUgKiBwYktleSwgY29zZV9lcnJiYWNrICogZXJycCk7CitleHRlcm4gYnl0ZSAqIF9DT1NFX1JlY2lwaWVudEluZm9fZ2VuZXJhdGVLZXkoQ09TRV9SZWNpcGllbnRJbmZvICogcFJlY2lwaWVudCwgc2l6ZV90IGNiaXRLZXlTaXplKTsKZGlmZiAtLWdpdCBhL3NyYy9jcnlwdG8uaCBiL3NyYy9jcnlwdG8uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYTc0ZmI4Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL2NyeXB0by5oCkBAIC0wLDAgKzEsMzIgQEAKKy8qKgorKiBQZXJmb3JtIGFuIEFFUy1DQ00gRGVjcnlwdGlvbiBvcGVyYXRpb24KKyoKKyogQHBhcmFtW2luXSAgIENPU0VfRW5jcnlwdCBQb2ludGVyIHRvIENPU0UgRW5jcnlwdGlvbiBjb250ZXh0IG9iamVjdAorKiBAcGFyYW1baW5dICAgaW50ICAgICAgICAgIFNpemUgb2YgdGhlIFRhZyB2YWx1ZSB0byBiZSBjcmVhdGUKKyogQHBhcmFtW2luXSAgIGludCAgICAgICAgICBTaXplIG9mIHRoZSBNZXNzYWdlIExlbmd0aCBmaWVsZAorKiBAcGFyYW1baW5dICAgYnl0ZSAqICAgICAgIFBvaW50ZXIgdG8gYXV0aGVudGljYXRlZCBkYXRhIHN0cnVjdHVyZQorKiBAcGFyYW1baW5dICAgaW50ICAgICAgICAgIFNpemUgb2YgYXV0aGVudGljYXRlZCBkYXRhIHN0cnVjdHVyZQorKiBAcmV0dXJuICAgICAgICAgICAgICAgICAgIERpZCB0aGUgZnVuY3Rpb24gc3VjY2VlZD8KKyovCitib29sIEFFU19DQ01fRGVjcnlwdChDT1NFX0VuY3J5cHQgKiBwY29zZSwgaW50IFRTaXplLCBpbnQgTFNpemUsIGNvbnN0IGJ5dGUgKiBwYkF1dGhEYXRhLCBpbnQgY2JBdXRoRGF0YSk7CisKKy8qKgorKiBQZXJmb3JtIGFuIEFFUy1DQ00gRW5jcnlwdGlvbiBvcGVyYXRpb24KKyoKKyogQHBhcmFtW2luXSAgIENPU0VfRW5jcnlwdCBQb2ludGVyIHRvIENPU0UgRW5jcnlwdGlvbiBjb250ZXh0IG9iamVjdAorKiBAcGFyYW1baW5dICAgaW50ICAgICAgICAgIFNpemUgb2YgdGhlIFRhZyB2YWx1ZSB0byBiZSBjcmVhdGUKKyogQHBhcmFtW2luXSAgIGludCAgICAgICAgICBTaXplIG9mIHRoZSBNZXNzYWdlIExlbmd0aCBmaWVsZAorKiBAcGFyYW1baW5dICAgYnl0ZSAqICAgICAgIFBvaW50ZXIgdG8gYXV0aGVudGljYXRlZCBkYXRhIHN0cnVjdHVyZQorKiBAcGFyYW1baW5dICAgaW50ICAgICAgICAgIFNpemUgb2YgYXV0aGVudGljYXRlZCBkYXRhIHN0cnVjdHVyZQorKiBAcmV0dXJuICAgICAgICAgICAgICAgICAgIERpZCB0aGUgZnVuY3Rpb24gc3VjY2VlZD8KKyovCitib29sIEFFU19DQ01fRW5jcnlwdChDT1NFX0VuY3J5cHQgKiBwY29zZSwgaW50IFRTaXplLCBpbnQgTFNpemUsIGNvbnN0IGJ5dGUgKiBwYkF1dGhEYXRhLCBpbnQgY2JBdXRoRGF0YSk7CisKKy8qKgorKiAgR2VuZXJhdGUgcmFuZG9tIGJ5dGVzIGluIGEgYnVmZmVyCisqCisqIEBwYXJhbVtpbl0gICBieXRlICogICAgICBQb2ludGVyIHRvIGJ1ZmZlciB0byBiZSBmaWxsZWQKKyogQHBhcmFtW2luXSAgIHNpemVfdCAgICAgIFNpemUgb2YgYnVmZmVyIHRvIGJlIGZpbGxlZAorKiBAcmV0dXJuICAgICAgICAgICAgICAgICAgbm9uZQorKi8KK3ZvaWQgcmFuZF9ieXRlcyhieXRlICogcGIsIHNpemVfdCBjYik7CmRpZmYgLS1naXQgYS9zcmMvb3BlbnNzbC5jIGIvc3JjL29wZW5zc2wuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYzNmYWI1Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL29wZW5zc2wuYwpAQCAtMCwwICsxLDEzNCBAQAorI2luY2x1ZGUgImNvc2UuaCIKKyNpbmNsdWRlICJjb25maWd1cmUuaCIKKyNpbmNsdWRlICJjb3NlX2ludC5oIgorI2luY2x1ZGUgImNyeXB0by5oIgorCisjaWZkZWYgVVNFX09QRU5fU1NMCisKKyNpbmNsdWRlIDxvcGVuc3NsXGV2cC5oPgorI2luY2x1ZGUgPG9wZW5zc2xccmFuZC5oPgorCisKK2Jvb2wgQUVTX0NDTV9EZWNyeXB0KENPU0VfRW5jcnlwdCAqIHBjb3NlLCBpbnQgVFNpemUsIGludCBMU2l6ZSwgY29uc3QgYnl0ZSAqIHBiQXV0aERhdGEsIGludCBjYkF1dGhEYXRhKQoreworCUVWUF9DSVBIRVJfQ1RYIGN0eDsKKwlpbnQgY2JPdXQ7CisJYnl0ZSAqIHJnYk91dCA9IE5VTEw7CisJc3NpemVfdCBOU2l6ZSA9IDE1IC0gTFNpemU7CisJaW50IG91dGwgPSAwOworCWJ5dGUgcmdiSVZbMTVdID0geyAwIH07CisJY29uc3QgY25fY2JvciAqIHBJViA9IE5VTEw7CisjaWZkZWYgVVNFX0NCT1JfQ09OVEVYVAorCWNuX2Nib3JfY29udGV4dCAqIGNvbnRleHQgPSAmcGNvc2UtPm1fbWVzc2FnZS5tX2FsbG9jQ29udGV4dDsKKyNlbmRpZgorCisJLy8gIFNldHVwIHRoZSBJVi9Ob25jZSBhbmQgcHV0IGl0IGludG8gdGhlIG1lc3NhZ2UKKworCXBJViA9IF9DT1NFX21hcF9nZXRfaW50KCZwY29zZS0+bV9tZXNzYWdlLCBDT1NFX0hlYWRlcl9JViwgQ09TRV9CT1RILCBOVUxMKTsKKwlpZiAoKHBJViA9PSBOVUxMKSB8fCAocElWLT50eXBlIT0gQ05fQ0JPUl9CWVRFUykpIHsKKwllcnJvcjoKKwkJaWYgKHJnYk91dCAhPSBOVUxMKSBDT1NFX0ZSRUUocmdiT3V0LCBjb250ZXh0KTsKKwkJcmV0dXJuIGZhbHNlOworCX0KKworCWlmIChwSVYtPmxlbmd0aCA+IE5TaXplKSBnb3RvIGVycm9yOworCW1lbWNweSgmcmdiSVZbTlNpemUgLSBwSVYtPmxlbmd0aF0sIHBJVi0+di5zdHIsIHBJVi0+bGVuZ3RoKTsKKworCS8vICBTZXR1cCBhbmQgcnVuIHRoZSBPcGVuU1NMIGNvZGUKKworCUVWUF9DSVBIRVJfQ1RYX2luaXQoJmN0eCk7CisJRVZQX0VuY3J5cHRJbml0X2V4KCZjdHgsIEVWUF9hZXNfMTI4X2NjbSgpLCBOVUxMLCBOVUxMLCBOVUxMKTsKKworCUVWUF9DSVBIRVJfQ1RYX2N0cmwoJmN0eCwgRVZQX0NUUkxfQ0NNX1NFVF9MLCBMU2l6ZSwgMCk7CisJRVZQX0NJUEhFUl9DVFhfY3RybCgmY3R4LCBFVlBfQ1RSTF9DQ01fU0VUX0lWTEVOLCBOU2l6ZSwgMCk7CisJRVZQX0NJUEhFUl9DVFhfY3RybCgmY3R4LCBFVlBfQ1RSTF9DQ01fU0VUX1RBRywgVFNpemUsIE5VTEwpOwkvLyBTYXkgd2UgYXJlIGRvaW5nIGFuIDggYnl0ZSB0YWcKKworCUVWUF9FbmNyeXB0SW5pdCgmY3R4LCAwLCBwY29zZS0+cGJLZXksIHJnYklWKTsKKworCUVWUF9FbmNyeXB0VXBkYXRlKCZjdHgsIDAsICZjYk91dCwgMCwgcGNvc2UtPmNiQ29udGVudCk7CisKKwlFVlBfRW5jcnlwdFVwZGF0ZSgmY3R4LCBOVUxMLCAmb3V0bCwgcGJBdXRoRGF0YSwgY2JBdXRoRGF0YSk7CisKKwlyZ2JPdXQgPSAoYnl0ZSAqKUNPU0VfQ0FMTE9DKGNiT3V0ICsgVFNpemUsIDEsIGNvbnRleHQpOworCWlmIChyZ2JPdXQgPT0gTlVMTCkgZ290byBlcnJvcjsKKworCUVWUF9FbmNyeXB0VXBkYXRlKCZjdHgsIHJnYk91dCwgJmNiT3V0LCBwY29zZS0+cGJDb250ZW50LCBwY29zZS0+Y2JDb250ZW50KTsKKworCUVWUF9FbmNyeXB0RmluYWxfZXgoJmN0eCwgJnJnYk91dFtjYk91dF0sICZjYk91dCk7CisKKwlFVlBfQ0lQSEVSX0NUWF9jdHJsKCZjdHgsIEVWUF9DVFJMX0NDTV9HRVRfVEFHLCBUU2l6ZSwgJnJnYk91dFtwY29zZS0+Y2JDb250ZW50XSk7CisKKwljbl9jYm9yX21hcHB1dF9pbnQocGNvc2UtPm1fbWVzc2FnZS5tX2Nib3IsIENPU0VfSGVhZGVyX0NpcGhlcnRleHQsIGNuX2Nib3JfZGF0YV9jcmVhdGUocmdiT3V0LCBwY29zZS0+Y2JDb250ZW50ICsgVFNpemUsIENCT1JfQ09OVEVYVF9QQVJBTV9DT01NQSBOVUxMKSwgQ0JPUl9DT05URVhUX1BBUkFNX0NPTU1BIE5VTEwpOworCisJcmV0dXJuIHRydWU7Cit9CisKKworYm9vbCBBRVNfQ0NNX0VuY3J5cHQoQ09TRV9FbmNyeXB0ICogcGNvc2UsIGludCBUU2l6ZSwgaW50IExTaXplLCBjb25zdCBieXRlICogcGJBdXRoRGF0YSwgaW50IGNiQXV0aERhdGEpCit7CisJRVZQX0NJUEhFUl9DVFggY3R4OworCWludCBjYk91dDsKKwlieXRlICogcmdiT3V0ID0gTlVMTDsKKwlzc2l6ZV90IE5TaXplID0gMTUgLSBMU2l6ZTsKKwlpbnQgb3V0bCA9IDA7CisJYnl0ZSByZ2JJVlsxNV0gPSB7IDAgfTsKKwljb25zdCBjbl9jYm9yICogY2Jvcl9pdiA9IE5VTEw7CisjaWZkZWYgVVNFX0NCT1JfQ09OVEVYVAorCWNuX2Nib3JfY29udGV4dCAqIGNvbnRleHQgPSAmcGNvc2UtPm1fbWVzc2FnZS5tX2FsbG9jQ29udGV4dDsKKyNlbmRpZgorCisJLy8gIFNldHVwIHRoZSBJVi9Ob25jZSBhbmQgcHV0IGl0IGludG8gdGhlIG1lc3NhZ2UKKworCWNib3JfaXYgPSBfQ09TRV9tYXBfZ2V0X2ludCgmcGNvc2UtPm1fbWVzc2FnZSwgQ09TRV9IZWFkZXJfSVYsIENPU0VfQk9USCwgTlVMTCk7CisJaWYgKChjYm9yX2l2ID09IE5VTEwpIHx8IChjYm9yX2l2LT50eXBlICE9IENOX0NCT1JfQllURVMpKSB7CisJCWVycm9yOgorCQlpZiAocmdiT3V0ICE9IE5VTEwpIENPU0VfRlJFRShyZ2JPdXQsIGNvbnRleHQpOworCQlyZXR1cm4gZmFsc2U7CisJfQorCisJaWYgKGNib3JfaXYtPmxlbmd0aCA+IE5TaXplKSBnb3RvIGVycm9yOworCW1lbWNweSgmcmdiSVZbTlNpemUtY2Jvcl9pdi0+bGVuZ3RoXSwgY2Jvcl9pdi0+di5zdHIsIGNib3JfaXYtPmxlbmd0aCk7CisKKyNpZiAwCisJaWYgKCFjbl9jYm9yX21hcHB1dF9pbnQocGNvc2UtPm1fbWVzc2FnZS5tX2Nib3IsIENPU0VfSGVhZGVyX0lWLCBjbl9jYm9yX2RhdGFfY3JlYXRlKHJnYklWLCBOU2l6ZSwgQ0JPUl9DT05URVhUX1BBUkFNX0NPTU1BIE5VTEwpLCBDQk9SX0NPTlRFWFRfUEFSQU1fQ09NTUEgTlVMTCkpIHsKKwkJZ290byBlcnJvcjsKKwl9CisjZW5kaWYKKworCS8vICBTZXR1cCBhbmQgcnVuIHRoZSBPcGVuU1NMIGNvZGUKKworCUVWUF9DSVBIRVJfQ1RYX2luaXQoJmN0eCk7CisJRVZQX0VuY3J5cHRJbml0X2V4KCZjdHgsIEVWUF9hZXNfMTI4X2NjbSgpLCBOVUxMLCBOVUxMLCBOVUxMKTsKKworCVRTaXplIC89IDg7IC8vIENvbWVzIGluIGluIGJpdHMgbm90IGJ5dGVzLgorCUVWUF9DSVBIRVJfQ1RYX2N0cmwoJmN0eCwgRVZQX0NUUkxfQ0NNX1NFVF9MLCBMU2l6ZSwgMCk7CisJRVZQX0NJUEhFUl9DVFhfY3RybCgmY3R4LCBFVlBfQ1RSTF9DQ01fU0VUX0lWTEVOLCBOU2l6ZSwgMCk7CisJRVZQX0NJUEhFUl9DVFhfY3RybCgmY3R4LCBFVlBfQ1RSTF9DQ01fU0VUX1RBRywgVFNpemUsIE5VTEwpOwkvLyBTYXkgd2UgYXJlIGRvaW5nIGFuIDggYnl0ZSB0YWcKKworCUVWUF9FbmNyeXB0SW5pdCgmY3R4LCAwLCBwY29zZS0+cGJLZXksIHJnYklWKTsKKworCUVWUF9FbmNyeXB0VXBkYXRlKCZjdHgsIDAsICZjYk91dCwgMCwgcGNvc2UtPmNiQ29udGVudCk7CisKKwlFVlBfRW5jcnlwdFVwZGF0ZSgmY3R4LCBOVUxMLCAmb3V0bCwgcGJBdXRoRGF0YSwgY2JBdXRoRGF0YSk7CisKKwlyZ2JPdXQgPSAoYnl0ZSAqKUNPU0VfQ0FMTE9DKGNiT3V0ICsgVFNpemUsIDEsIGNvbnRleHQpOworCWlmIChyZ2JPdXQgPT0gTlVMTCkgZ290byBlcnJvcjsKKworCUVWUF9FbmNyeXB0VXBkYXRlKCZjdHgsIHJnYk91dCwgJmNiT3V0LCBwY29zZS0+cGJDb250ZW50LCBwY29zZS0+Y2JDb250ZW50KTsKKworCUVWUF9FbmNyeXB0RmluYWxfZXgoJmN0eCwgJnJnYk91dFtjYk91dF0sICZjYk91dCk7CisKKwlFVlBfQ0lQSEVSX0NUWF9jdHJsKCZjdHgsIEVWUF9DVFJMX0NDTV9HRVRfVEFHLCBUU2l6ZSwgJnJnYk91dFtwY29zZS0+Y2JDb250ZW50XSk7CisKKwljbl9jYm9yX21hcHB1dF9pbnQocGNvc2UtPm1fbWVzc2FnZS5tX2Nib3IsIENPU0VfSGVhZGVyX0NpcGhlcnRleHQsIGNuX2Nib3JfZGF0YV9jcmVhdGUocmdiT3V0LCAgcGNvc2UtPmNiQ29udGVudCArIFRTaXplLCBDQk9SX0NPTlRFWFRfUEFSQU1fQ09NTUEgTlVMTCksIENCT1JfQ09OVEVYVF9QQVJBTV9DT01NQSBOVUxMKTsKKworCXJldHVybiB0cnVlOworfQorCisKK3ZvaWQgcmFuZF9ieXRlcyhieXRlICogcGIsIHNpemVfdCBjYikKK3sKKwlSQU5EX2J5dGVzKHBiLCBjYik7Cit9CisKKyNlbmRpZiAvLyBVU0VfT1BFTl9TU0wKZGlmZiAtLWdpdCBhL3Rlc3QvUmVhZE1lLnR4dCBiL3Rlc3QvUmVhZE1lLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNjU3NDczCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9SZWFkTWUudHh0CkBAIC0wLDAgKzEsNDAgQEAKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgIENPTlNPTEUgQVBQTElDQVRJT04gOiB0ZXN0IFByb2plY3QgT3ZlcnZpZXcKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitBcHBXaXphcmQgaGFzIGNyZWF0ZWQgdGhpcyB0ZXN0IGFwcGxpY2F0aW9uIGZvciB5b3UuCisKK1RoaXMgZmlsZSBjb250YWlucyBhIHN1bW1hcnkgb2Ygd2hhdCB5b3Ugd2lsbCBmaW5kIGluIGVhY2ggb2YgdGhlIGZpbGVzIHRoYXQKK21ha2UgdXAgeW91ciB0ZXN0IGFwcGxpY2F0aW9uLgorCisKK3Rlc3QudmN4cHJvagorICAgIFRoaXMgaXMgdGhlIG1haW4gcHJvamVjdCBmaWxlIGZvciBWQysrIHByb2plY3RzIGdlbmVyYXRlZCB1c2luZyBhbiBBcHBsaWNhdGlvbiBXaXphcmQuCisgICAgSXQgY29udGFpbnMgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHZlcnNpb24gb2YgVmlzdWFsIEMrKyB0aGF0IGdlbmVyYXRlZCB0aGUgZmlsZSwgYW5kCisgICAgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHBsYXRmb3JtcywgY29uZmlndXJhdGlvbnMsIGFuZCBwcm9qZWN0IGZlYXR1cmVzIHNlbGVjdGVkIHdpdGggdGhlCisgICAgQXBwbGljYXRpb24gV2l6YXJkLgorCit0ZXN0LnZjeHByb2ouZmlsdGVycworICAgIFRoaXMgaXMgdGhlIGZpbHRlcnMgZmlsZSBmb3IgVkMrKyBwcm9qZWN0cyBnZW5lcmF0ZWQgdXNpbmcgYW4gQXBwbGljYXRpb24gV2l6YXJkLiAKKyAgICBJdCBjb250YWlucyBpbmZvcm1hdGlvbiBhYm91dCB0aGUgYXNzb2NpYXRpb24gYmV0d2VlbiB0aGUgZmlsZXMgaW4geW91ciBwcm9qZWN0IAorICAgIGFuZCB0aGUgZmlsdGVycy4gVGhpcyBhc3NvY2lhdGlvbiBpcyB1c2VkIGluIHRoZSBJREUgdG8gc2hvdyBncm91cGluZyBvZiBmaWxlcyB3aXRoCisgICAgc2ltaWxhciBleHRlbnNpb25zIHVuZGVyIGEgc3BlY2lmaWMgbm9kZSAoZm9yIGUuZy4gIi5jcHAiIGZpbGVzIGFyZSBhc3NvY2lhdGVkIHdpdGggdGhlCisgICAgIlNvdXJjZSBGaWxlcyIgZmlsdGVyKS4KKwordGVzdC5jcHAKKyAgICBUaGlzIGlzIHRoZSBtYWluIGFwcGxpY2F0aW9uIHNvdXJjZSBmaWxlLgorCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworT3RoZXIgc3RhbmRhcmQgZmlsZXM6CisKK1N0ZEFmeC5oLCBTdGRBZnguY3BwCisgICAgVGhlc2UgZmlsZXMgYXJlIHVzZWQgdG8gYnVpbGQgYSBwcmVjb21waWxlZCBoZWFkZXIgKFBDSCkgZmlsZQorICAgIG5hbWVkIHRlc3QucGNoIGFuZCBhIHByZWNvbXBpbGVkIHR5cGVzIGZpbGUgbmFtZWQgU3RkQWZ4Lm9iai4KKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KK090aGVyIG5vdGVzOgorCitBcHBXaXphcmQgdXNlcyAiVE9ETzoiIGNvbW1lbnRzIHRvIGluZGljYXRlIHBhcnRzIG9mIHRoZSBzb3VyY2UgY29kZSB5b3UKK3Nob3VsZCBhZGQgdG8gb3IgY3VzdG9taXplLgorCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwpkaWZmIC0tZ2l0IGEvdGVzdC9zdGRhZnguY3BwIGIvdGVzdC9zdGRhZnguY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFiNmNmNzEKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L3N0ZGFmeC5jcHAKQEAgLTAsMCArMSw4IEBACisvLyBzdGRhZnguY3BwIDogc291cmNlIGZpbGUgdGhhdCBpbmNsdWRlcyBqdXN0IHRoZSBzdGFuZGFyZCBpbmNsdWRlcworLy8gdGVzdC5wY2ggd2lsbCBiZSB0aGUgcHJlLWNvbXBpbGVkIGhlYWRlcgorLy8gc3RkYWZ4Lm9iaiB3aWxsIGNvbnRhaW4gdGhlIHByZS1jb21waWxlZCB0eXBlIGluZm9ybWF0aW9uCisKKyNpbmNsdWRlICJzdGRhZnguaCIKKworLy8gVE9ETzogcmVmZXJlbmNlIGFueSBhZGRpdGlvbmFsIGhlYWRlcnMgeW91IG5lZWQgaW4gU1REQUZYLkgKKy8vIGFuZCBub3QgaW4gdGhpcyBmaWxlCmRpZmYgLS1naXQgYS90ZXN0L3N0ZGFmeC5oIGIvdGVzdC9zdGRhZnguaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMDA1YTgzCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9zdGRhZnguaApAQCAtMCwwICsxLDE1IEBACisvLyBzdGRhZnguaCA6IGluY2x1ZGUgZmlsZSBmb3Igc3RhbmRhcmQgc3lzdGVtIGluY2x1ZGUgZmlsZXMsCisvLyBvciBwcm9qZWN0IHNwZWNpZmljIGluY2x1ZGUgZmlsZXMgdGhhdCBhcmUgdXNlZCBmcmVxdWVudGx5LCBidXQKKy8vIGFyZSBjaGFuZ2VkIGluZnJlcXVlbnRseQorLy8KKworI3ByYWdtYSBvbmNlCisKKyNpbmNsdWRlICJ0YXJnZXR2ZXIuaCIKKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8dGNoYXIuaD4KKworCisKKy8vIFRPRE86IHJlZmVyZW5jZSBhZGRpdGlvbmFsIGhlYWRlcnMgeW91ciBwcm9ncmFtIHJlcXVpcmVzIGhlcmUKZGlmZiAtLWdpdCBhL3Rlc3QvdGFyZ2V0dmVyLmggYi90ZXN0L3RhcmdldHZlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg3YzAwODYKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L3RhcmdldHZlci5oCkBAIC0wLDAgKzEsOCBAQAorI3ByYWdtYSBvbmNlCisKKy8vIEluY2x1ZGluZyBTREtEREtWZXIuaCBkZWZpbmVzIHRoZSBoaWdoZXN0IGF2YWlsYWJsZSBXaW5kb3dzIHBsYXRmb3JtLgorCisvLyBJZiB5b3Ugd2lzaCB0byBidWlsZCB5b3VyIGFwcGxpY2F0aW9uIGZvciBhIHByZXZpb3VzIFdpbmRvd3MgcGxhdGZvcm0sIGluY2x1ZGUgV2luU0RLVmVyLmggYW5kCisvLyBzZXQgdGhlIF9XSU4zMl9XSU5OVCBtYWNybyB0byB0aGUgcGxhdGZvcm0geW91IHdpc2ggdG8gc3VwcG9ydCBiZWZvcmUgaW5jbHVkaW5nIFNES0RES1Zlci5oLgorCisjaW5jbHVkZSA8U0RLRERLVmVyLmg+CmRpZmYgLS1naXQgYS90ZXN0L3Rlc3QuYyBiL3Rlc3QvdGVzdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk1NjM5NDEKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L3Rlc3QuYwpAQCAtMCwwICsxLDc5IEBACisvLyB0ZXN0LmNwcCA6IERlZmluZXMgdGhlIGVudHJ5IHBvaW50IGZvciB0aGUgY29uc29sZSBhcHBsaWNhdGlvbi4KKy8vCisKKyNkZWZpbmUgX0NSVF9TRUNVUkVfTk9fV0FSTklOR1MKKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8Y29zZS5oPgorI2luY2x1ZGUgPGNuLWNib3JcY24tY2Jvci5oPgorCitleHRlcm4gaW50IEVuY3J5cHRNZXNzYWdlKCk7CisKK2ludCBtYWluKGludCBhcmdjLCBjaGFyICogYXJndltdKQoreworCUVuY3J5cHRNZXNzYWdlKCk7CisJcmV0dXJuIDA7Cit9CisKK2ludCBFbmNyeXB0TWVzc2FnZSgpCit7CisJSENPU0VfRU5DUllQVCBoRW5jT2JqID0gQ09TRV9FbmNyeXB0X0luaXQoTlVMTCwgTlVMTCk7CisJYnl0ZSByZ2JTZWNyZXRbMTI4IC8gOF0gPSB7ICdhJywgJ2InLCAnYycgfTsKKwlpbnQgY2JTZWNyZXQgPSAxMjgvODsKKwlieXRlICByZ2JLaWRbNl0gPSB7ICdhJywgJ2InLCAnYycsICdkJywgJ2UnLCAnZicgfTsKKwlpbnQgY2JLaWQgPSA2OworCWludCBjYjsKKwlieXRlICogcmdiOworCWNoYXIgKiBzeiA9ICJUaGlzIGlzIHRoZSBjb250ZW50IHRvIGJlIHVzZWQiOworCisKKwlDT1NFX0VuY3J5cHRfbWFwX3B1dChoRW5jT2JqLCBDT1NFX0hlYWRlcl9BbGdvcml0aG0sIGNuX2Nib3JfaW50X2NyZWF0ZShDT1NFX0FsZ29yaXRobV9BRVNfQ0NNXzY0LCBOVUxMLCBOVUxMKSwgQ09TRV9QUk9URUNUX09OTFksIE5VTEwpOworCUNPU0VfRW5jcnlwdF9TZXRDb250ZW50KGhFbmNPYmosIHN6LCBzdHJsZW4oc3opLCBOVUxMKTsKKwlDT1NFX0VuY3J5cHRfbWFwX3B1dChoRW5jT2JqLCBDT1NFX0hlYWRlcl9JViwgY25fY2Jvcl9kYXRhX2NyZWF0ZShyZ2JLaWQsIGNiS2lkLCBOVUxMLCBOVUxMKSwgQ09TRV9VTlBST1RFQ1RfT05MWSwgTlVMTCk7CisKKwlDT1NFX0VuY3J5cHRfYWRkX3NoYXJlZF9zZWNyZXQoaEVuY09iaiwgQ09TRV9BbGdvcml0aG1fRGlyZWN0LCByZ2JTZWNyZXQsIGNiU2VjcmV0LCByZ2JLaWQsIGNiS2lkLCBOVUxMKTsKKworCUNPU0VfRW5jcnlwdF9lbmNyeXB0KGhFbmNPYmosIE5VTEwpOworCisJY2IgPSBDT1NFX0VuY29kZSgoSENPU0UpaEVuY09iaiwgTlVMTCwgMCwgMCkgKzE7CisJcmdiID0gKGJ5dGUgKiltYWxsb2MoY2IpOworCWNiID0gQ09TRV9FbmNvZGUoKEhDT1NFKWhFbmNPYmosIHJnYiwgMCwgY2IpOworCisKKwlGSUxFICogZnAgPSBmb3BlbigidGVzdC5jYm9yIiwgIndiIik7CisJZndyaXRlKHJnYiwgY2IsIDEsIGZwKTsKKwlmY2xvc2UoZnApOworCisJY2hhciAqIHN6WDsKKwlpbnQgY2JQcmludDsKKwljbl9jYm9yICogY2JvciA9IENPU0VfZ2V0X2Nib3IoKEhDT1NFKSBoRW5jT2JqKTsKKwljYlByaW50ID0gY25fY2Jvcl9wcmludGVyX3dyaXRlKE5VTEwsIDAsIGNib3IsICIgICIsICJcclxuIik7CisJc3pYID0gbWFsbG9jKGNiUHJpbnQpOworCWNuX2Nib3JfcHJpbnRlcl93cml0ZShzelgsIGNiUHJpbnQsIGNib3IsICIgICIsICJcclxuIik7CisJZnByaW50ZihzdGRvdXQsIHN6WCk7CisJZnByaW50ZihzdGRvdXQsICJcclxuIik7CisKKwlDT1NFX0VuY3J5cHRfRnJlZShoRW5jT2JqKTsKKworCS8qICovCisKKwlpbnQgdHlwOworCWhFbmNPYmogPSAoSENPU0VfRU5DUllQVCkgQ09TRV9EZWNvZGUocmdiLCBjYiwgJnR5cCwgTlVMTCwgTlVMTCk7CisJCisJaW50IGlSZWNpcGllbnQgPSAwOworCWRvIHsKKwkJSENPU0VfUkVDSVBJRU5UIGhSZWNpcDsKKworCQloUmVjaXAgPSBDT1NFX0VuY3J5cHRfR2V0UmVjaXBpZW50KGhFbmNPYmosIGlSZWNpcGllbnQsIE5VTEwpOworCQlpZiAoaFJlY2lwID09IE5VTEwpIGJyZWFrOworCisJCUNPU0VfUmVjaXBpZW50X1NldEtleShoUmVjaXAsIHJnYlNlY3JldCwgY2JTZWNyZXQsIE5VTEwpOworCisJCUNPU0VfRW5jcnlwdF9kZWNyeXB0KGhFbmNPYmosIGhSZWNpcCwgTlVMTCk7CisKKwl9IHdoaWxlICh0cnVlKTsKKworCXJldHVybiAxOworfQpkaWZmIC0tZ2l0IGEvdGVzdC90ZXN0LmNib3IgYi90ZXN0L3Rlc3QuY2JvcgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NTJlZmJjCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC90ZXN0LmNib3IKQEAgLTAsMCArMSBAQAorpQgBB4GhBKIBAgJGYWJjZGVmA0OhAQEEoQVGYWJjZGVmBlgmvmdONXucn9BsCTtBI4EO5UWJzh36BbwW1wjoYjzzrPTYA/ECuvIKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0L3Rlc3Quc2RmIGIvdGVzdC90ZXN0LnNkZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNTc4Y2QyCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC90ZXN0LnNkZgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90ZXN0L3Rlc3Quc2xuIGIvdGVzdC90ZXN0LnNsbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNTE0NzQxCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC90ZXN0LnNsbgpAQCAtMCwwICsxLDU4IEBACivvu78KK01pY3Jvc29mdCBWaXN1YWwgU3R1ZGlvIFNvbHV0aW9uIEZpbGUsIEZvcm1hdCBWZXJzaW9uIDEyLjAwCisjIFZpc3VhbCBTdHVkaW8gMjAxMworVmlzdWFsU3R1ZGlvVmVyc2lvbiA9IDEyLjAuMzExMDEuMAorTWluaW11bVZpc3VhbFN0dWRpb1ZlcnNpb24gPSAxMC4wLjQwMjE5LjEKK1Byb2plY3QoIns4QkM5Q0VCOC04QjRBLTExRDAtOEQxMS0wMEEwQzkxQkM5NDJ9IikgPSAidGVzdCIsICJ0ZXN0LnZjeHByb2oiLCAiezc1NERFMTg0LTQzRTktNDhEOC1BMzQ4LTI2N0EwQUU2OTE0RH0iCisJUHJvamVjdFNlY3Rpb24oUHJvamVjdERlcGVuZGVuY2llcykgPSBwb3N0UHJvamVjdAorCQl7ODEyRjBFQzQtMjdFNC00QUM3LTkyMDEtREIwOTk3OTAwMDRCfSA9IHs4MTJGMEVDNC0yN0U0LTRBQzctOTIwMS1EQjA5OTc5MDAwNEJ9CisJCXtBNDU2NjFFMi01MkNBLTQ1MzEtOUNDMC05OEVDOEY4OEQ1MER9ID0ge0E0NTY2MUUyLTUyQ0EtNDUzMS05Q0MwLTk4RUM4Rjg4RDUwRH0KKwlFbmRQcm9qZWN0U2VjdGlvbgorRW5kUHJvamVjdAorUHJvamVjdCgiezhCQzlDRUI4LThCNEEtMTFEMC04RDExLTAwQTBDOTFCQzk0Mn0iKSA9ICJDIiwgIi4uXHNyY1xDLnZjeHByb2oiLCAie0E0NTY2MUUyLTUyQ0EtNDUzMS05Q0MwLTk4RUM4Rjg4RDUwRH0iCitFbmRQcm9qZWN0CitQcm9qZWN0KCJ7OEJDOUNFQjgtOEI0QS0xMUQwLThEMTEtMDBBMEM5MUJDOTQyfSIpID0gImNuLWNib3IiLCAiLi5cLi5cY24tY2JvclxpbXBsZW1lbnRcY24tY2Jvclxjbi1jYm9yLnZjeHByb2oiLCAiezgxMkYwRUM0LTI3RTQtNEFDNy05MjAxLURCMDk5NzkwMDA0Qn0iCitFbmRQcm9qZWN0CitHbG9iYWwKKwlHbG9iYWxTZWN0aW9uKFNvbHV0aW9uQ29uZmlndXJhdGlvblBsYXRmb3JtcykgPSBwcmVTb2x1dGlvbgorCQlEZWJ1Z3xBUk0gPSBEZWJ1Z3xBUk0KKwkJRGVidWd8V2luMzIgPSBEZWJ1Z3xXaW4zMgorCQlEZWJ1Z3x4NjQgPSBEZWJ1Z3x4NjQKKwkJUmVsZWFzZXxBUk0gPSBSZWxlYXNlfEFSTQorCQlSZWxlYXNlfFdpbjMyID0gUmVsZWFzZXxXaW4zMgorCQlSZWxlYXNlfHg2NCA9IFJlbGVhc2V8eDY0CisJRW5kR2xvYmFsU2VjdGlvbgorCUdsb2JhbFNlY3Rpb24oUHJvamVjdENvbmZpZ3VyYXRpb25QbGF0Zm9ybXMpID0gcG9zdFNvbHV0aW9uCisJCXs3NTRERTE4NC00M0U5LTQ4RDgtQTM0OC0yNjdBMEFFNjkxNER9LkRlYnVnfEFSTS5BY3RpdmVDZmcgPSBEZWJ1Z3xXaW4zMgorCQl7NzU0REUxODQtNDNFOS00OEQ4LUEzNDgtMjY3QTBBRTY5MTREfS5EZWJ1Z3xXaW4zMi5BY3RpdmVDZmcgPSBEZWJ1Z3xXaW4zMgorCQl7NzU0REUxODQtNDNFOS00OEQ4LUEzNDgtMjY3QTBBRTY5MTREfS5EZWJ1Z3xXaW4zMi5CdWlsZC4wID0gRGVidWd8V2luMzIKKwkJezc1NERFMTg0LTQzRTktNDhEOC1BMzQ4LTI2N0EwQUU2OTE0RH0uRGVidWd8eDY0LkFjdGl2ZUNmZyA9IERlYnVnfFdpbjMyCisJCXs3NTRERTE4NC00M0U5LTQ4RDgtQTM0OC0yNjdBMEFFNjkxNER9LlJlbGVhc2V8QVJNLkFjdGl2ZUNmZyA9IFJlbGVhc2V8V2luMzIKKwkJezc1NERFMTg0LTQzRTktNDhEOC1BMzQ4LTI2N0EwQUU2OTE0RH0uUmVsZWFzZXxXaW4zMi5BY3RpdmVDZmcgPSBSZWxlYXNlfFdpbjMyCisJCXs3NTRERTE4NC00M0U5LTQ4RDgtQTM0OC0yNjdBMEFFNjkxNER9LlJlbGVhc2V8V2luMzIuQnVpbGQuMCA9IFJlbGVhc2V8V2luMzIKKwkJezc1NERFMTg0LTQzRTktNDhEOC1BMzQ4LTI2N0EwQUU2OTE0RH0uUmVsZWFzZXx4NjQuQWN0aXZlQ2ZnID0gUmVsZWFzZXxXaW4zMgorCQl7QTQ1NjYxRTItNTJDQS00NTMxLTlDQzAtOThFQzhGODhENTBEfS5EZWJ1Z3xBUk0uQWN0aXZlQ2ZnID0gRGVidWd8V2luMzIKKwkJe0E0NTY2MUUyLTUyQ0EtNDUzMS05Q0MwLTk4RUM4Rjg4RDUwRH0uRGVidWd8V2luMzIuQWN0aXZlQ2ZnID0gRGVidWd8V2luMzIKKwkJe0E0NTY2MUUyLTUyQ0EtNDUzMS05Q0MwLTk4RUM4Rjg4RDUwRH0uRGVidWd8V2luMzIuQnVpbGQuMCA9IERlYnVnfFdpbjMyCisJCXtBNDU2NjFFMi01MkNBLTQ1MzEtOUNDMC05OEVDOEY4OEQ1MER9LkRlYnVnfHg2NC5BY3RpdmVDZmcgPSBEZWJ1Z3xXaW4zMgorCQl7QTQ1NjYxRTItNTJDQS00NTMxLTlDQzAtOThFQzhGODhENTBEfS5SZWxlYXNlfEFSTS5BY3RpdmVDZmcgPSBSZWxlYXNlfFdpbjMyCisJCXtBNDU2NjFFMi01MkNBLTQ1MzEtOUNDMC05OEVDOEY4OEQ1MER9LlJlbGVhc2V8V2luMzIuQWN0aXZlQ2ZnID0gUmVsZWFzZXxXaW4zMgorCQl7QTQ1NjYxRTItNTJDQS00NTMxLTlDQzAtOThFQzhGODhENTBEfS5SZWxlYXNlfFdpbjMyLkJ1aWxkLjAgPSBSZWxlYXNlfFdpbjMyCisJCXtBNDU2NjFFMi01MkNBLTQ1MzEtOUNDMC05OEVDOEY4OEQ1MER9LlJlbGVhc2V8eDY0LkFjdGl2ZUNmZyA9IFJlbGVhc2V8V2luMzIKKwkJezgxMkYwRUM0LTI3RTQtNEFDNy05MjAxLURCMDk5NzkwMDA0Qn0uRGVidWd8QVJNLkFjdGl2ZUNmZyA9IERlYnVnfEFSTQorCQl7ODEyRjBFQzQtMjdFNC00QUM3LTkyMDEtREIwOTk3OTAwMDRCfS5EZWJ1Z3xBUk0uQnVpbGQuMCA9IERlYnVnfEFSTQorCQl7ODEyRjBFQzQtMjdFNC00QUM3LTkyMDEtREIwOTk3OTAwMDRCfS5EZWJ1Z3xXaW4zMi5BY3RpdmVDZmcgPSBEZWJ1Z3xXaW4zMgorCQl7ODEyRjBFQzQtMjdFNC00QUM3LTkyMDEtREIwOTk3OTAwMDRCfS5EZWJ1Z3xXaW4zMi5CdWlsZC4wID0gRGVidWd8V2luMzIKKwkJezgxMkYwRUM0LTI3RTQtNEFDNy05MjAxLURCMDk5NzkwMDA0Qn0uRGVidWd8eDY0LkFjdGl2ZUNmZyA9IERlYnVnfHg2NAorCQl7ODEyRjBFQzQtMjdFNC00QUM3LTkyMDEtREIwOTk3OTAwMDRCfS5EZWJ1Z3x4NjQuQnVpbGQuMCA9IERlYnVnfHg2NAorCQl7ODEyRjBFQzQtMjdFNC00QUM3LTkyMDEtREIwOTk3OTAwMDRCfS5SZWxlYXNlfEFSTS5BY3RpdmVDZmcgPSBSZWxlYXNlfEFSTQorCQl7ODEyRjBFQzQtMjdFNC00QUM3LTkyMDEtREIwOTk3OTAwMDRCfS5SZWxlYXNlfEFSTS5CdWlsZC4wID0gUmVsZWFzZXxBUk0KKwkJezgxMkYwRUM0LTI3RTQtNEFDNy05MjAxLURCMDk5NzkwMDA0Qn0uUmVsZWFzZXxXaW4zMi5BY3RpdmVDZmcgPSBSZWxlYXNlfFdpbjMyCisJCXs4MTJGMEVDNC0yN0U0LTRBQzctOTIwMS1EQjA5OTc5MDAwNEJ9LlJlbGVhc2V8V2luMzIuQnVpbGQuMCA9IFJlbGVhc2V8V2luMzIKKwkJezgxMkYwRUM0LTI3RTQtNEFDNy05MjAxLURCMDk5NzkwMDA0Qn0uUmVsZWFzZXx4NjQuQWN0aXZlQ2ZnID0gUmVsZWFzZXx4NjQKKwkJezgxMkYwRUM0LTI3RTQtNEFDNy05MjAxLURCMDk5NzkwMDA0Qn0uUmVsZWFzZXx4NjQuQnVpbGQuMCA9IFJlbGVhc2V8eDY0CisJRW5kR2xvYmFsU2VjdGlvbgorCUdsb2JhbFNlY3Rpb24oU29sdXRpb25Qcm9wZXJ0aWVzKSA9IHByZVNvbHV0aW9uCisJCUhpZGVTb2x1dGlvbk5vZGUgPSBGQUxTRQorCUVuZEdsb2JhbFNlY3Rpb24KK0VuZEdsb2JhbApkaWZmIC0tZ2l0IGEvdGVzdC90ZXN0LnYxMi5zdW8gYi90ZXN0L3Rlc3QudjEyLnN1bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YTEzNzI1Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdC90ZXN0LnYxMi5zdW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGVzdC90ZXN0LnZjeHByb2ogYi90ZXN0L3Rlc3QudmN4cHJvagpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNjc3MjZjCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC90ZXN0LnZjeHByb2oKQEAgLTAsMCArMSwxMDUgQEAKK++7vzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8UHJvamVjdCBEZWZhdWx0VGFyZ2V0cz0iQnVpbGQiIFRvb2xzVmVyc2lvbj0iMTIuMCIgeG1sbnM9Imh0dHA6Ly9zY2hlbWFzLm1pY3Jvc29mdC5jb20vZGV2ZWxvcGVyL21zYnVpbGQvMjAwMyI+CisgIDxJdGVtR3JvdXAgTGFiZWw9IlByb2plY3RDb25maWd1cmF0aW9ucyI+CisgICAgPFByb2plY3RDb25maWd1cmF0aW9uIEluY2x1ZGU9IkRlYnVnfFdpbjMyIj4KKyAgICAgIDxDb25maWd1cmF0aW9uPkRlYnVnPC9Db25maWd1cmF0aW9uPgorICAgICAgPFBsYXRmb3JtPldpbjMyPC9QbGF0Zm9ybT4KKyAgICA8L1Byb2plY3RDb25maWd1cmF0aW9uPgorICAgIDxQcm9qZWN0Q29uZmlndXJhdGlvbiBJbmNsdWRlPSJSZWxlYXNlfFdpbjMyIj4KKyAgICAgIDxDb25maWd1cmF0aW9uPlJlbGVhc2U8L0NvbmZpZ3VyYXRpb24+CisgICAgICA8UGxhdGZvcm0+V2luMzI8L1BsYXRmb3JtPgorICAgIDwvUHJvamVjdENvbmZpZ3VyYXRpb24+CisgIDwvSXRlbUdyb3VwPgorICA8UHJvcGVydHlHcm91cCBMYWJlbD0iR2xvYmFscyI+CisgICAgPFByb2plY3RHdWlkPns3NTRERTE4NC00M0U5LTQ4RDgtQTM0OC0yNjdBMEFFNjkxNER9PC9Qcm9qZWN0R3VpZD4KKyAgICA8S2V5d29yZD5XaW4zMlByb2o8L0tleXdvcmQ+CisgICAgPFJvb3ROYW1lc3BhY2U+dGVzdDwvUm9vdE5hbWVzcGFjZT4KKyAgPC9Qcm9wZXJ0eUdyb3VwPgorICA8SW1wb3J0IFByb2plY3Q9IiQoVkNUYXJnZXRzUGF0aClcTWljcm9zb2Z0LkNwcC5EZWZhdWx0LnByb3BzIiAvPgorICA8UHJvcGVydHlHcm91cCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnfFdpbjMyJyIgTGFiZWw9IkNvbmZpZ3VyYXRpb24iPgorICAgIDxDb25maWd1cmF0aW9uVHlwZT5BcHBsaWNhdGlvbjwvQ29uZmlndXJhdGlvblR5cGU+CisgICAgPFVzZURlYnVnTGlicmFyaWVzPnRydWU8L1VzZURlYnVnTGlicmFyaWVzPgorICAgIDxQbGF0Zm9ybVRvb2xzZXQ+djEyMDwvUGxhdGZvcm1Ub29sc2V0PgorICAgIDxDaGFyYWN0ZXJTZXQ+VW5pY29kZTwvQ2hhcmFjdGVyU2V0PgorICA8L1Byb3BlcnR5R3JvdXA+CisgIDxQcm9wZXJ0eUdyb3VwIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZXxXaW4zMiciIExhYmVsPSJDb25maWd1cmF0aW9uIj4KKyAgICA8Q29uZmlndXJhdGlvblR5cGU+QXBwbGljYXRpb248L0NvbmZpZ3VyYXRpb25UeXBlPgorICAgIDxVc2VEZWJ1Z0xpYnJhcmllcz5mYWxzZTwvVXNlRGVidWdMaWJyYXJpZXM+CisgICAgPFBsYXRmb3JtVG9vbHNldD52MTIwPC9QbGF0Zm9ybVRvb2xzZXQ+CisgICAgPFdob2xlUHJvZ3JhbU9wdGltaXphdGlvbj50cnVlPC9XaG9sZVByb2dyYW1PcHRpbWl6YXRpb24+CisgICAgPENoYXJhY3RlclNldD5Vbmljb2RlPC9DaGFyYWN0ZXJTZXQ+CisgIDwvUHJvcGVydHlHcm91cD4KKyAgPEltcG9ydCBQcm9qZWN0PSIkKFZDVGFyZ2V0c1BhdGgpXE1pY3Jvc29mdC5DcHAucHJvcHMiIC8+CisgIDxJbXBvcnRHcm91cCBMYWJlbD0iRXh0ZW5zaW9uU2V0dGluZ3MiPgorICA8L0ltcG9ydEdyb3VwPgorICA8SW1wb3J0R3JvdXAgTGFiZWw9IlByb3BlcnR5U2hlZXRzIiBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnfFdpbjMyJyI+CisgICAgPEltcG9ydCBQcm9qZWN0PSIkKFVzZXJSb290RGlyKVxNaWNyb3NvZnQuQ3BwLiQoUGxhdGZvcm0pLnVzZXIucHJvcHMiIENvbmRpdGlvbj0iZXhpc3RzKCckKFVzZXJSb290RGlyKVxNaWNyb3NvZnQuQ3BwLiQoUGxhdGZvcm0pLnVzZXIucHJvcHMnKSIgTGFiZWw9IkxvY2FsQXBwRGF0YVBsYXRmb3JtIiAvPgorICA8L0ltcG9ydEdyb3VwPgorICA8SW1wb3J0R3JvdXAgTGFiZWw9IlByb3BlcnR5U2hlZXRzIiBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2V8V2luMzInIj4KKyAgICA8SW1wb3J0IFByb2plY3Q9IiQoVXNlclJvb3REaXIpXE1pY3Jvc29mdC5DcHAuJChQbGF0Zm9ybSkudXNlci5wcm9wcyIgQ29uZGl0aW9uPSJleGlzdHMoJyQoVXNlclJvb3REaXIpXE1pY3Jvc29mdC5DcHAuJChQbGF0Zm9ybSkudXNlci5wcm9wcycpIiBMYWJlbD0iTG9jYWxBcHBEYXRhUGxhdGZvcm0iIC8+CisgIDwvSW1wb3J0R3JvdXA+CisgIDxQcm9wZXJ0eUdyb3VwIExhYmVsPSJVc2VyTWFjcm9zIiAvPgorICA8UHJvcGVydHlHcm91cCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnfFdpbjMyJyI+CisgICAgPExpbmtJbmNyZW1lbnRhbD50cnVlPC9MaW5rSW5jcmVtZW50YWw+CisgIDwvUHJvcGVydHlHcm91cD4KKyAgPFByb3BlcnR5R3JvdXAgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlfFdpbjMyJyI+CisgICAgPExpbmtJbmNyZW1lbnRhbD5mYWxzZTwvTGlua0luY3JlbWVudGFsPgorICA8L1Byb3BlcnR5R3JvdXA+CisgIDxJdGVtRGVmaW5pdGlvbkdyb3VwIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nRGVidWd8V2luMzInIj4KKyAgICA8Q2xDb21waWxlPgorICAgICAgPFByZWNvbXBpbGVkSGVhZGVyPgorICAgICAgPC9QcmVjb21waWxlZEhlYWRlcj4KKyAgICAgIDxXYXJuaW5nTGV2ZWw+TGV2ZWwzPC9XYXJuaW5nTGV2ZWw+CisgICAgICA8T3B0aW1pemF0aW9uPkRpc2FibGVkPC9PcHRpbWl6YXRpb24+CisgICAgICA8UHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM+V0lOMzI7X0RFQlVHO19DT05TT0xFO19MSUI7JShQcmVwcm9jZXNzb3JEZWZpbml0aW9ucyk8L1ByZXByb2Nlc3NvckRlZmluaXRpb25zPgorICAgICAgPFNETENoZWNrPnRydWU8L1NETENoZWNrPgorICAgICAgPEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM+QzpcUHJvamVjdHNcQ09TRVxDT1NFLUNcc3JjO0M6XFByb2plY3RzXENPU0VcY24tY2JvclxpbXBsZW1lbnRcY24tY2JvclxpbmNsdWRlOyUoQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcyk8L0FkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM+CisgICAgICA8Q29tcGlsZUFzPkRlZmF1bHQ8L0NvbXBpbGVBcz4KKyAgICAgIDxDYWxsaW5nQ29udmVudGlvbj5DZGVjbDwvQ2FsbGluZ0NvbnZlbnRpb24+CisgICAgPC9DbENvbXBpbGU+CisgICAgPExpbms+CisgICAgICA8U3ViU3lzdGVtPkNvbnNvbGU8L1N1YlN5c3RlbT4KKyAgICAgIDxHZW5lcmF0ZURlYnVnSW5mb3JtYXRpb24+dHJ1ZTwvR2VuZXJhdGVEZWJ1Z0luZm9ybWF0aW9uPgorICAgICAgPEFkZGl0aW9uYWxEZXBlbmRlbmNpZXM+YzpccHJvamVjdHNcb3BlbnNzbFxiaW5cbGliXHNzbGVheTMyLmxpYjtjOlxwcm9qZWN0c1xvcGVuc3NsXGJpblxsaWJcbGliZWF5MzIubGliO1dzMl8zMi5saWI7JShBZGRpdGlvbmFsRGVwZW5kZW5jaWVzKTwvQWRkaXRpb25hbERlcGVuZGVuY2llcz4KKyAgICA8L0xpbms+CisgIDwvSXRlbURlZmluaXRpb25Hcm91cD4KKyAgPEl0ZW1EZWZpbml0aW9uR3JvdXAgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlfFdpbjMyJyI+CisgICAgPENsQ29tcGlsZT4KKyAgICAgIDxXYXJuaW5nTGV2ZWw+TGV2ZWwzPC9XYXJuaW5nTGV2ZWw+CisgICAgICA8UHJlY29tcGlsZWRIZWFkZXI+CisgICAgICA8L1ByZWNvbXBpbGVkSGVhZGVyPgorICAgICAgPE9wdGltaXphdGlvbj5NYXhTcGVlZDwvT3B0aW1pemF0aW9uPgorICAgICAgPEZ1bmN0aW9uTGV2ZWxMaW5raW5nPnRydWU8L0Z1bmN0aW9uTGV2ZWxMaW5raW5nPgorICAgICAgPEludHJpbnNpY0Z1bmN0aW9ucz50cnVlPC9JbnRyaW5zaWNGdW5jdGlvbnM+CisgICAgICA8UHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM+V0lOMzI7TkRFQlVHO19DT05TT0xFO19MSUI7JShQcmVwcm9jZXNzb3JEZWZpbml0aW9ucyk8L1ByZXByb2Nlc3NvckRlZmluaXRpb25zPgorICAgICAgPFNETENoZWNrPnRydWU8L1NETENoZWNrPgorICAgIDwvQ2xDb21waWxlPgorICAgIDxMaW5rPgorICAgICAgPFN1YlN5c3RlbT5Db25zb2xlPC9TdWJTeXN0ZW0+CisgICAgICA8R2VuZXJhdGVEZWJ1Z0luZm9ybWF0aW9uPnRydWU8L0dlbmVyYXRlRGVidWdJbmZvcm1hdGlvbj4KKyAgICAgIDxFbmFibGVDT01EQVRGb2xkaW5nPnRydWU8L0VuYWJsZUNPTURBVEZvbGRpbmc+CisgICAgICA8T3B0aW1pemVSZWZlcmVuY2VzPnRydWU8L09wdGltaXplUmVmZXJlbmNlcz4KKyAgICA8L0xpbms+CisgIDwvSXRlbURlZmluaXRpb25Hcm91cD4KKyAgPEl0ZW1Hcm91cD4KKyAgICA8VGV4dCBJbmNsdWRlPSJSZWFkTWUudHh0IiAvPgorICA8L0l0ZW1Hcm91cD4KKyAgPEl0ZW1Hcm91cD4KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9InN0ZGFmeC5oIiAvPgorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0idGFyZ2V0dmVyLmgiIC8+CisgIDwvSXRlbUdyb3VwPgorICA8SXRlbUdyb3VwPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0idGVzdC5jIiAvPgorICA8L0l0ZW1Hcm91cD4KKyAgPEl0ZW1Hcm91cD4KKyAgICA8UHJvamVjdFJlZmVyZW5jZSBJbmNsdWRlPSIuLlwuLlxjbi1jYm9yXGltcGxlbWVudFxjbi1jYm9yXGNuLWNib3IudmN4cHJvaiI+CisgICAgICA8UHJvamVjdD57ODEyZjBlYzQtMjdlNC00YWM3LTkyMDEtZGIwOTk3OTAwMDRifTwvUHJvamVjdD4KKyAgICA8L1Byb2plY3RSZWZlcmVuY2U+CisgICAgPFByb2plY3RSZWZlcmVuY2UgSW5jbHVkZT0iLi5cc3JjXEMudmN4cHJvaiI+CisgICAgICA8UHJvamVjdD57YTQ1NjYxZTItNTJjYS00NTMxLTljYzAtOThlYzhmODhkNTBkfTwvUHJvamVjdD4KKyAgICA8L1Byb2plY3RSZWZlcmVuY2U+CisgIDwvSXRlbUdyb3VwPgorICA8SW1wb3J0IFByb2plY3Q9IiQoVkNUYXJnZXRzUGF0aClcTWljcm9zb2Z0LkNwcC50YXJnZXRzIiAvPgorICA8SW1wb3J0R3JvdXAgTGFiZWw9IkV4dGVuc2lvblRhcmdldHMiPgorICA8L0ltcG9ydEdyb3VwPgorPC9Qcm9qZWN0PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3QvdGVzdC52Y3hwcm9qLmZpbHRlcnMgYi90ZXN0L3Rlc3QudmN4cHJvai5maWx0ZXJzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFkNmM3MGMKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L3Rlc3QudmN4cHJvai5maWx0ZXJzCkBAIC0wLDAgKzEsMzMgQEAKK++7vzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8UHJvamVjdCBUb29sc1ZlcnNpb249IjQuMCIgeG1sbnM9Imh0dHA6Ly9zY2hlbWFzLm1pY3Jvc29mdC5jb20vZGV2ZWxvcGVyL21zYnVpbGQvMjAwMyI+CisgIDxJdGVtR3JvdXA+CisgICAgPEZpbHRlciBJbmNsdWRlPSJTb3VyY2UgRmlsZXMiPgorICAgICAgPFVuaXF1ZUlkZW50aWZpZXI+ezRGQzczN0YxLUM3QTUtNDM3Ni1BMDY2LTJBMzJENzUyQTJGRn08L1VuaXF1ZUlkZW50aWZpZXI+CisgICAgICA8RXh0ZW5zaW9ucz5jcHA7YztjYztjeHg7ZGVmO29kbDtpZGw7aHBqO2JhdDthc207YXNteDwvRXh0ZW5zaW9ucz4KKyAgICA8L0ZpbHRlcj4KKyAgICA8RmlsdGVyIEluY2x1ZGU9IkhlYWRlciBGaWxlcyI+CisgICAgICA8VW5pcXVlSWRlbnRpZmllcj57OTM5OTUzODAtODlCRC00YjA0LTg4RUItNjI1RkJFNTJFQkZCfTwvVW5pcXVlSWRlbnRpZmllcj4KKyAgICAgIDxFeHRlbnNpb25zPmg7aGg7aHBwO2h4eDtobTtpbmw7aW5jO3hzZDwvRXh0ZW5zaW9ucz4KKyAgICA8L0ZpbHRlcj4KKyAgICA8RmlsdGVyIEluY2x1ZGU9IlJlc291cmNlIEZpbGVzIj4KKyAgICAgIDxVbmlxdWVJZGVudGlmaWVyPns2N0RBNkFCNi1GODAwLTRjMDgtOEI3QS04M0JCMTIxQUFEMDF9PC9VbmlxdWVJZGVudGlmaWVyPgorICAgICAgPEV4dGVuc2lvbnM+cmM7aWNvO2N1cjtibXA7ZGxnO3JjMjtyY3Q7YmluO3JncztnaWY7anBnO2pwZWc7anBlO3Jlc3g7dGlmZjt0aWY7cG5nO3dhdjttZmNyaWJib24tbXM8L0V4dGVuc2lvbnM+CisgICAgPC9GaWx0ZXI+CisgIDwvSXRlbUdyb3VwPgorICA8SXRlbUdyb3VwPgorICAgIDxUZXh0IEluY2x1ZGU9IlJlYWRNZS50eHQiIC8+CisgIDwvSXRlbUdyb3VwPgorICA8SXRlbUdyb3VwPgorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0ic3RkYWZ4LmgiPgorICAgICAgPEZpbHRlcj5IZWFkZXIgRmlsZXM8L0ZpbHRlcj4KKyAgICA8L0NsSW5jbHVkZT4KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9InRhcmdldHZlci5oIj4KKyAgICAgIDxGaWx0ZXI+SGVhZGVyIEZpbGVzPC9GaWx0ZXI+CisgICAgPC9DbEluY2x1ZGU+CisgIDwvSXRlbUdyb3VwPgorICA8SXRlbUdyb3VwPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0idGVzdC5jIj4KKyAgICAgIDxGaWx0ZXI+U291cmNlIEZpbGVzPC9GaWx0ZXI+CisgICAgPC9DbENvbXBpbGU+CisgIDwvSXRlbUdyb3VwPgorPC9Qcm9qZWN0PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3QvdGVzdC52Y3hwcm9qLnVzZXIgYi90ZXN0L3Rlc3QudmN4cHJvai51c2VyCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVmNWZmMmEKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L3Rlc3QudmN4cHJvai51c2VyCkBAIC0wLDAgKzEsNCBAQAor77u/PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzxQcm9qZWN0IFRvb2xzVmVyc2lvbj0iMTIuMCIgeG1sbnM9Imh0dHA6Ly9zY2hlbWFzLm1pY3Jvc29mdC5jb20vZGV2ZWxvcGVyL21zYnVpbGQvMjAwMyI+CisgIDxQcm9wZXJ0eUdyb3VwIC8+Cis8L1Byb2plY3Q+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQo=