ZGlmZiAtLWdpdCBhL2xpYi9UYXJnZXQvQWxwaGEvQWxwaGFJU2VsUGF0dGVybi5jcHAgYi9saWIvVGFyZ2V0L0FscGhhL0FscGhhSVNlbFBhdHRlcm4uY3BwCmluZGV4IGM1MjIwYmMuLmJlZmNjM2YgMTAwNjQ0Ci0tLSBhL2xpYi9UYXJnZXQvQWxwaGEvQWxwaGFJU2VsUGF0dGVybi5jcHAKKysrIGIvbGliL1RhcmdldC9BbHBoYS9BbHBoYUlTZWxQYXR0ZXJuLmNwcApAQCAtNTMsNiArNTMsMTQgQEAKICAgICAgIHNldE9wZXJhdGlvbkFjdGlvbihJU0Q6OlpFUk9fRVhURU5EX0lOUkVHLCBNVlQ6OmkxLCBFeHBhbmQpOwogICAgICAgc2V0T3BlcmF0aW9uQWN0aW9uKElTRDo6U0lHTl9FWFRFTkRfSU5SRUcsIE1WVDo6aTEsIEV4cGFuZCk7CiAKKyAgICAgIC8vICAgICAgc2V0T3BlcmF0aW9uQWN0aW9uKElTRDo6VUlOVF9UT19GUCAgICAgICAsIE1WVDo6aTY0ICAsIEV4cGFuZCk7CisgICAgICAvLyAgICAgIHNldE9wZXJhdGlvbkFjdGlvbihJU0Q6OlVJTlRfVE9fRlAgICAgICAgLCBNVlQ6Omk2NCAgLCBFeHBhbmQpOworICAgICAgc2V0T3BlcmF0aW9uQWN0aW9uKElTRDo6U0lOVF9UT19GUCAgICAgICAsIE1WVDo6aTEgICAsIFByb21vdGUpOworICAgICAgc2V0T3BlcmF0aW9uQWN0aW9uKElTRDo6U0lOVF9UT19GUCAgICAgICAsIE1WVDo6aTggICAsIFByb21vdGUpOworICAgICAgc2V0T3BlcmF0aW9uQWN0aW9uKElTRDo6U0lOVF9UT19GUCAgICAgICAsIE1WVDo6aTE2ICAsIFByb21vdGUpOworICAgICAgc2V0T3BlcmF0aW9uQWN0aW9uKElTRDo6U0lOVF9UT19GUCAgICAgICAsIE1WVDo6aTMyICAsIFByb21vdGUpOworCisgICAgICBzZXRPcGVyYXRpb25BY3Rpb24oSVNEOjpGUF9UT19TSU5UICAgICAgICwgTVZUOjpmMzIgICwgUHJvbW90ZSk7CiAKICAgICAgIGNvbXB1dGVSZWdpc3RlclByb3BlcnRpZXMoKTsKICAgICAgIApAQCAtMTI0LDE4ICsxMzIsMzUgQEAKICAgLy9IYW5kbGUgdGhlIHJldHVybiBhZGRyZXNzCiAgIC8vQnVpbGRNSSgmQkIsIEFscGhhOjpJREVGLCAwLCBBbHBoYTo6UjI2KTsKIAotICB1bnNpZ25lZCBhcmdzW10gPSB7QWxwaGE6OlIxNiwgQWxwaGE6OlIxNywgQWxwaGE6OlIxOCwgCi0JCSAgICAgQWxwaGE6OlIxOSwgQWxwaGE6OlIyMCwgQWxwaGE6OlIyMX07CisgIHVuc2lnbmVkIGFyZ3NfaW50W10gPSB7QWxwaGE6OlIxNiwgQWxwaGE6OlIxNywgQWxwaGE6OlIxOCwgCisJCQkgQWxwaGE6OlIxOSwgQWxwaGE6OlIyMCwgQWxwaGE6OlIyMX07CisgIHVuc2lnbmVkIGFyZ3NfZmxvYXRbXSA9IHtBbHBoYTo6RjE2LCBBbHBoYTo6RjE3LCBBbHBoYTo6RjE4LCAKKwkJCSAgIEFscGhhOjpGMTksIEFscGhhOjpGMjAsIEFscGhhOjpGMjF9OwogICBzdGQ6OnZlY3Rvcjx1bnNpZ25lZD4gYXJnVnJlZzsKLQorICBzdGQ6OnZlY3Rvcjx1bnNpZ25lZD4gYXJnUHJlZzsKICAgaW50IGNvdW50ID0gMDsKICAgZm9yIChGdW5jdGlvbjo6YWl0ZXJhdG9yIEkgPSBGLmFiZWdpbigpLCBFID0gRi5hZW5kKCk7IEkgIT0gRTsgKytJKQogICAgIHsKICAgICAgICsrY291bnQ7CiAgICAgICBhc3NlcnQoY291bnQgPD0gNiAmJiAiTW9yZSB0aGFuIDYgYXJncyBub3Qgc3VwcG9ydGVkIik7Ci0gICAgICBhc3NlcnQoZ2V0VmFsdWVUeXBlKEktPmdldFR5cGUoKSkgIT0gTVZUOjpmNjQgJiYgIk5vIGZsb2F0cyB5ZXQiKTsKLSAgICAgIEJ1aWxkTUkoJkJCLCBBbHBoYTo6SURFRiwgMCwgYXJnc1tjb3VudCAtIDFdKTsKLSAgICAgIGFyZ1ZyZWcucHVzaF9iYWNrKE1GLmdldFNTQVJlZ01hcCgpLT5jcmVhdGVWaXJ0dWFsUmVnaXN0ZXIoZ2V0UmVnQ2xhc3NGb3IoTVZUOjppNjQpKSk7CisgICAgICBzd2l0Y2ggKGdldFZhbHVlVHlwZShJLT5nZXRUeXBlKCkpKSB7CisgICAgICBkZWZhdWx0OiBzdGQ6OmNlcnIgPDwgIlVua25vd24gVHlwZSAiIDw8IGdldFZhbHVlVHlwZShJLT5nZXRUeXBlKCkpIDw8ICJcbiI7IGFib3J0KCk7CisgICAgICBjYXNlIE1WVDo6ZjY0OgorICAgICAgY2FzZSBNVlQ6OmYzMjoKKwlCdWlsZE1JKCZCQiwgQWxwaGE6OklERUYsIDAsIGFyZ3NfZmxvYXRbY291bnQgLSAxXSk7CisJYXJnVnJlZy5wdXNoX2JhY2soTUYuZ2V0U1NBUmVnTWFwKCktPmNyZWF0ZVZpcnR1YWxSZWdpc3RlcihnZXRSZWdDbGFzc0ZvcihnZXRWYWx1ZVR5cGUoSS0+Z2V0VHlwZSgpKSkpKTsKKwlhcmdQcmVnLnB1c2hfYmFjayhhcmdzX2Zsb2F0W2NvdW50IC0gMV0pOworCWJyZWFrOworICAgICAgY2FzZSBNVlQ6OmkxOgorICAgICAgY2FzZSBNVlQ6Omk4OgorICAgICAgY2FzZSBNVlQ6OmkxNjoKKyAgICAgIGNhc2UgTVZUOjppMzI6CisgICAgICBjYXNlIE1WVDo6aTY0OgorCUJ1aWxkTUkoJkJCLCBBbHBoYTo6SURFRiwgMCwgYXJnc19pbnRbY291bnQgLSAxXSk7CisJYXJnVnJlZy5wdXNoX2JhY2soTUYuZ2V0U1NBUmVnTWFwKCktPmNyZWF0ZVZpcnR1YWxSZWdpc3RlcihnZXRSZWdDbGFzc0ZvcihnZXRWYWx1ZVR5cGUoSS0+Z2V0VHlwZSgpKSkpKTsKKwlhcmdQcmVnLnB1c2hfYmFjayhhcmdzX2ludFtjb3VudCAtIDFdKTsKKwlicmVhazsKKwl9CiAgICAgfQogCiAgIEJ1aWxkTUkoJkJCLCBBbHBoYTo6SURFRiwgMCwgQWxwaGE6OlIyOSk7CkBAIC0xNDMsMjUgKzE2OCwzMCBAQAogICBjb3VudCA9IDA7CiAgIGZvciAoRnVuY3Rpb246OmFpdGVyYXRvciBJID0gRi5hYmVnaW4oKSwgRSA9IEYuYWVuZCgpOyBJICE9IEU7ICsrSSkKICAgICB7Ci0gICAgICBCdWlsZE1JKCZCQiwgQWxwaGE6OkJJUywgMiwgYXJnVnJlZ1tjb3VudF0pLmFkZFJlZyhhcmdzW2NvdW50XSkuYWRkUmVnKGFyZ3NbY291bnRdKTsKLSAgICAgIAotICAgICAgU0RPcGVyYW5kIGFyZ3QsIG5ld3Jvb3Q7CisgICAgICBTRE9wZXJhbmQgbmV3cm9vdDsKKyAgICAgIHVuc2lnbmVkIE9wYzsKICAgICAgIHN3aXRjaCAoZ2V0VmFsdWVUeXBlKEktPmdldFR5cGUoKSkpCiAJeworCWRlZmF1bHQ6IGFzc2VydCgwICYmICJVbmhhbmRsZWQgdHlwZSIpOwogCWNhc2UgTVZUOjppNjQ6Ci0JICBhcmd0ID0gbmV3cm9vdCA9IERBRy5nZXRDb3B5RnJvbVJlZyhhcmdWcmVnW2NvdW50XSwgTVZUOjppNjQsIERBRy5nZXRSb290KCkpOwotCSAgYnJlYWs7CiAJY2FzZSBNVlQ6OmkzMjoKLQkgIGFyZ3QgPSBuZXdyb290ID0gREFHLmdldENvcHlGcm9tUmVnKGFyZ1ZyZWdbY291bnRdLCBNVlQ6OmkzMiwgREFHLmdldFJvb3QoKSk7CisJY2FzZSBNVlQ6OmkxNjoKKwljYXNlIE1WVDo6aTg6CisJY2FzZSBNVlQ6OmkxOgorCSAgT3BjID0gQWxwaGE6OkJJUzsKIAkgIGJyZWFrOwotCWRlZmF1bHQ6Ci0JICBuZXdyb290ID0gREFHLmdldENvcHlGcm9tUmVnKGFyZ1ZyZWdbY291bnRdLCBNVlQ6Omk2NCwgREFHLmdldFJvb3QoKSk7Ci0JICBhcmd0ID0gIERBRy5nZXROb2RlKElTRDo6VFJVTkNBVEUsIGdldFZhbHVlVHlwZShJLT5nZXRUeXBlKCkpLCBuZXdyb290KTsKKwljYXNlIE1WVDo6ZjMyOgorCWNhc2UgTVZUOjpmNjQ6CisJICBPcGMgPSBBbHBoYTo6Q1BZUzsKKwkgIGJyZWFrOwogCX0KKyAgICAgIEJ1aWxkTUkoJkJCLCBPcGMsIDIsIGFyZ1ZyZWdbY291bnRdKS5hZGRSZWcoYXJnUHJlZ1tjb3VudF0pLmFkZFJlZyhhcmdQcmVnW2NvdW50XSk7CisgICAgICBuZXdyb290ID0gREFHLmdldENvcHlGcm9tUmVnKGFyZ1ZyZWdbY291bnRdLCBnZXRWYWx1ZVR5cGUoSS0+Z2V0VHlwZSgpKSwgREFHLmdldFJvb3QoKSk7CiAgICAgICBEQUcuc2V0Um9vdChuZXdyb290LmdldFZhbHVlKDEpKTsKLSAgICAgIEFyZ1ZhbHVlcy5wdXNoX2JhY2soYXJndCk7CisgICAgICBBcmdWYWx1ZXMucHVzaF9iYWNrKG5ld3Jvb3QpOwogICAgICAgKytjb3VudDsKICAgICB9CisKICAgcmV0dXJuIEFyZ1ZhbHVlczsKIH0KIApAQCAtMTg0LDkgKzIxNCw5IEBACiAJLy8gUHJvbW90ZSB0aGUgaW50ZWdlciB0byA2NCBiaXRzLiAgSWYgdGhlIGlucHV0IHR5cGUgaXMgc2lnbmVkIHVzZSBhCiAJLy8gc2lnbiBleHRlbmQsIG90aGVyd2lzZSB1c2UgYSB6ZXJvIGV4dGVuZC4KIAlpZiAoQXJnc1tpXS5zZWNvbmQtPmlzU2lnbmVkKCkpCi0JICBBcmdzW2ldLmZpcnN0ID0gREFHLmdldE5vZGUoSVNEOjpTSUdOX0VYVEVORCwgTVZUOjppNjQsIEFyZ3NbaV0uZmlyc3QpOworCSAgQXJnc1tpXS5maXJzdCA9IERBRy5nZXROb2RlKElTRDo6U0lHTl9FWFRFTkRfSU5SRUcsIE1WVDo6aTY0LCBBcmdzW2ldLmZpcnN0KTsKIAllbHNlCi0JICBBcmdzW2ldLmZpcnN0ID0gREFHLmdldE5vZGUoSVNEOjpaRVJPX0VYVEVORCwgTVZUOjppNjQsIEFyZ3NbaV0uZmlyc3QpOworCSAgQXJnc1tpXS5maXJzdCA9IERBRy5nZXROb2RlKElTRDo6WkVST19FWFRFTkRfSU5SRUcsIE1WVDo6aTY0LCBBcmdzW2ldLmZpcnN0KTsKIAlicmVhazsKICAgICAgIGNhc2UgTVZUOjppNjQ6CiAJYnJlYWs7CkBAIC0zMTcsMTggKzM0NywxMiBAQAogICAgIFRtcDEgPSBTZWxlY3RFeHByKE5vZGUtPmdldE9wZXJhbmQoMSkpOwogICAgIAogICAgIHN3aXRjaChOb2RlLT5nZXRWYWx1ZVR5cGUoMCkpIHsKLSAgICBkZWZhdWx0OiBhc3NlcnQoMCAmJiAiVW5rbm93biB0eXBlIHRvIHNpZ24gZXh0ZW5kIHRvLiIpOworICAgIGRlZmF1bHQ6IE5vZGUtPmR1bXAoKTsgYXNzZXJ0KDAgJiYgIlVua25vd24gdHlwZSB0byBzaWduIGV4dGVuZCB0by4iKTsKICAgICBjYXNlIE1WVDo6aTY0OgogICAgICAgc3dpdGNoIChjYXN0PE1WVFNETm9kZT4oTm9kZSktPmdldEV4dHJhVmFsdWVUeXBlKCkpIHsKICAgICAgIGRlZmF1bHQ6Ci0Jc3RkOjpjZXJyIDw8IGNhc3Q8TVZUU0ROb2RlPihOb2RlKS0+Z2V0RXh0cmFWYWx1ZVR5cGUoKSAKLQkJICA8PCAiKGkxIGlzICIgPDwgTVZUOjppMSAKLQkJICA8PCAiIGk4IGlzICIgPDwgTVZUOjppOAotCQkgIDw8ICIgaTE2IGlzICIgPDwgTVZUOjppMTYKLQkJICA8PCAiIGkzMiBpcyAiIDw8IE1WVDo6aTMyCi0JCSAgPDwgIiBpNjQgaXMgIiA8PCBNVlQ6Omk2NAotCQkgIDw8ICIpXG4iOwotICAgICAgICBhc3NlcnQoMCAmJiAiQmFkIGV4dGVuZCBsb2FkISIpOworCU5vZGUtPmR1bXAoKTsKKwlhc3NlcnQoMCAmJiAiQmFkIGV4dGVuZCBsb2FkISIpOwogICAgICAgY2FzZSBNVlQ6Omk2NDoKIAlCdWlsZE1JKEJCLCBBbHBoYTo6TERRLCAyLCBSZXN1bHQpLmFkZEltbSgwKS5hZGRSZWcoVG1wMSk7CiAJYnJlYWs7CkBAIC0zNTcsMTEgKzM4MSwxMiBAQAogICAgIFNlbGVjdChOb2RlLT5nZXRPcGVyYW5kKDApKTsgLy8gY2hhaW4KICAgICBUbXAxID0gU2VsZWN0RXhwcihOb2RlLT5nZXRPcGVyYW5kKDEpKTsKICAgICBzd2l0Y2goTm9kZS0+Z2V0VmFsdWVUeXBlKDApKSB7Ci0gICAgZGVmYXVsdDogYXNzZXJ0KDAgJiYgIlVua25vd24gdHlwZSB0byBzaWduIGV4dGVuZCB0by4iKTsKKyAgICBkZWZhdWx0OiBOb2RlLT5kdW1wKCk7IGFzc2VydCgwICYmICJVbmtub3duIHR5cGUgdG8gc2lnbiBleHRlbmQgdG8uIik7CiAgICAgY2FzZSBNVlQ6Omk2NDoKICAgICAgIHN3aXRjaCAoY2FzdDxNVlRTRE5vZGU+KE5vZGUpLT5nZXRFeHRyYVZhbHVlVHlwZSgpKSB7CiAgICAgICBkZWZhdWx0OgotICAgICAgICBhc3NlcnQoMCAmJiAiQmFkIHNpZ24gZXh0ZW5kISIpOworCU5vZGUtPmR1bXAoKTsKKwlhc3NlcnQoMCAmJiAiQmFkIHNpZ24gZXh0ZW5kISIpOwogICAgICAgY2FzZSBNVlQ6OmkzMjoKIAlCdWlsZE1JKEJCLCBBbHBoYTo6TERMLCAyLCBSZXN1bHQpLmFkZEltbSgwKS5hZGRSZWcoVG1wMSk7CiAgICAgICAgIGJyZWFrOwpAQCAtMzg2LDExICs0MTEsMTIgQEAKICAgICBTZWxlY3QoTm9kZS0+Z2V0T3BlcmFuZCgwKSk7IC8vIGNoYWluCiAgICAgVG1wMSA9IFNlbGVjdEV4cHIoTm9kZS0+Z2V0T3BlcmFuZCgxKSk7CiAgICAgc3dpdGNoKE5vZGUtPmdldFZhbHVlVHlwZSgwKSkgewotICAgIGRlZmF1bHQ6IGFzc2VydCgwICYmICJVbmtub3duIHR5cGUgdG8gemVybyBleHRlbmQgdG8uIik7CisgICAgZGVmYXVsdDogTm9kZS0+ZHVtcCgpOyBhc3NlcnQoMCAmJiAiVW5rbm93biB0eXBlIHRvIHplcm8gZXh0ZW5kIHRvLiIpOwogICAgIGNhc2UgTVZUOjppNjQ6CiAgICAgICBzd2l0Y2ggKGNhc3Q8TVZUU0ROb2RlPihOb2RlKS0+Z2V0RXh0cmFWYWx1ZVR5cGUoKSkgewogICAgICAgZGVmYXVsdDoKLSAgICAgICAgYXNzZXJ0KDAgJiYgIkJhZCBzaWduIGV4dGVuZCEiKTsKKwlOb2RlLT5kdW1wKCk7CisJYXNzZXJ0KDAgJiYgIkJhZCBzaWduIGV4dGVuZCEiKTsKICAgICAgIGNhc2UgTVZUOjppMTY6CiAJQnVpbGRNSShCQiwgQWxwaGE6OkxEV1UsIDIsIFJlc3VsdCkuYWRkSW1tKDApLmFkZFJlZyhUbXAxKTsKICAgICAgICAgYnJlYWs7CkBAIC00MTIsNyArNDM4LDcgQEAKICAgY2FzZSBJU0Q6OkNBTEw6CiAgICAgewogICAgICAgU2VsZWN0KE4uZ2V0T3BlcmFuZCgwKSk7Ci0KKyAgICAgIAogICAgICAgLy8gVGhlIGNoYWluIGZvciB0aGlzIGNhbGwgaXMgbm93IGxvd2VyZWQuCiAgICAgICBFeHByTWFwLmluc2VydChzdGQ6Om1ha2VfcGFpcihOLmdldFZhbHVlKE5vZGUtPmdldE51bVZhbHVlcygpLTEpLCAxKSk7CiAgICAgICAKQEAgLTQyMCw2NyArNDQ2LDg2IEBACiAgICAgICBzdGQ6OnZlY3Rvcjx1bnNpZ25lZD4gYXJndnJlZ3M7CiAgICAgICBhc3NlcnQoTm9kZS0+Z2V0TnVtT3BlcmFuZHMoKSA8IDggJiYgIk9ubHkgNiBhcmdzIHN1cHBvcnRlZCIpOwogICAgICAgZm9yKGludCBpID0gMiwgZSA9IE5vZGUtPmdldE51bU9wZXJhbmRzKCk7IGkgPCBlOyArK2kpCi0gICAgICB7Ci0JYXJndnJlZ3MucHVzaF9iYWNrKFNlbGVjdEV4cHIoTi5nZXRPcGVyYW5kKGkpKSk7Ci0gICAgICB9CisJICBhcmd2cmVncy5wdXNoX2JhY2soU2VsZWN0RXhwcihOLmdldE9wZXJhbmQoaSkpKTsKKyAgICAgIAogICAgICAgZm9yKGludCBpID0gMCwgZSA9IGFyZ3ZyZWdzLnNpemUoKTsgaSA8IGU7ICsraSkKLSAgICAgIHsKLQl1bnNpZ25lZCBhcmdzW10gPSB7QWxwaGE6OlIxNiwgQWxwaGE6OlIxNywgQWxwaGE6OlIxOCwgCi0JCQkgICBBbHBoYTo6UjE5LCBBbHBoYTo6UjIwLCBBbHBoYTo6UjIxfTsKLQkKLQlCdWlsZE1JKEJCLCBBbHBoYTo6QklTLCAyLCBhcmdzW2ldKS5hZGRSZWcoYXJndnJlZ3NbaV0pLmFkZFJlZyhhcmd2cmVnc1tpXSk7CisJeworCSAgdW5zaWduZWQgYXJnc19pbnRbXSA9IHtBbHBoYTo6UjE2LCBBbHBoYTo6UjE3LCBBbHBoYTo6UjE4LCAKKwkJCQkgQWxwaGE6OlIxOSwgQWxwaGE6OlIyMCwgQWxwaGE6OlIyMX07CisJICB1bnNpZ25lZCBhcmdzX2Zsb2F0W10gPSB7QWxwaGE6OkYxNiwgQWxwaGE6OkYxNywgQWxwaGE6OkYxOCwgCisJCQkJICAgQWxwaGE6OkYxOSwgQWxwaGE6OkYyMCwgQWxwaGE6OkYyMX07CisJICBzd2l0Y2goTi5nZXRPcGVyYW5kKGkpLmdldFZhbHVlVHlwZSgpKSB7CisJICBkZWZhdWx0OiBOb2RlLT5kdW1wKCk7IGFzc2VydCgwICYmICJVbmtub3duIHZhbHVlIHR5cGUgZm9yIGNhbGwiKTsKKwkgIGNhc2UgTVZUOjppMToKKwkgIGNhc2UgTVZUOjppODoKKwkgIGNhc2UgTVZUOjppMTY6CisJICBjYXNlIE1WVDo6aTMyOgorCSAgY2FzZSBNVlQ6Omk2NDoKKwkgICAgQnVpbGRNSShCQiwgQWxwaGE6OkJJUywgMiwgYXJnc19pbnRbaV0pLmFkZFJlZyhhcmd2cmVnc1tpXSkuYWRkUmVnKGFyZ3ZyZWdzW2ldKTsKKwkgICAgYnJlYWs7CisJICBjYXNlIE1WVDo6ZjMyOgorCSAgY2FzZSBNVlQ6OmY2NDoKKwkgICAgQnVpbGRNSShCQiwgQWxwaGE6OkNQWVMsIDIsIGFyZ3NfZmxvYXRbaV0pLmFkZFJlZyhhcmd2cmVnc1tpXSkuYWRkUmVnKGFyZ3ZyZWdzW2ldKTsKKwkgICAgYnJlYWs7CisJICB9CisJICAKKwl9CisgICAgICAvL2J1aWxkIHRoZSByaWdodCBraW5kIG9mIGNhbGwKKyAgICAgIGlmIChHbG9iYWxBZGRyZXNzU0ROb2RlICpHQVNEID0KKwkgIGR5bl9jYXN0PEdsb2JhbEFkZHJlc3NTRE5vZGU+KE4uZ2V0T3BlcmFuZCgxKSkpIAorCXsKKwkgIFNlbGVjdChOLmdldE9wZXJhbmQoMCkpOworCSAgQWxwaGFMb3dlcmluZy5yZXN0b3JlR1AoQkIpOworCSAgQnVpbGRNSShCQiwgQWxwaGE6OkNBTEwsIDEpLmFkZEdsb2JhbEFkZHJlc3MoR0FTRC0+Z2V0R2xvYmFsKCksdHJ1ZSk7CisJfSAKKyAgICAgIGVsc2UgaWYgKEV4dGVybmFsU3ltYm9sU0ROb2RlICpFU1NETiA9CisJICAgICAgIGR5bl9jYXN0PEV4dGVybmFsU3ltYm9sU0ROb2RlPihOLmdldE9wZXJhbmQoMSkpKSAKKwl7CisJICBTZWxlY3QoTi5nZXRPcGVyYW5kKDApKTsKKwkgIEFscGhhTG93ZXJpbmcucmVzdG9yZUdQKEJCKTsKKwkgIEJ1aWxkTUkoQkIsIEFscGhhOjpDQUxMLCAwKS5hZGRFeHRlcm5hbFN5bWJvbChFU1NETi0+Z2V0U3ltYm9sKCksIHRydWUpOworCX0gCisgICAgICBlbHNlIAorCXsKKwkgIFNlbGVjdChOLmdldE9wZXJhbmQoMCkpOworCSAgVG1wMSA9IFNlbGVjdEV4cHIoTi5nZXRPcGVyYW5kKDEpKTsKKwkgIEJ1aWxkTUkoQkIsIEFscGhhOjpDQUxMLCAxKS5hZGRSZWcoVG1wMSk7CisJICBBbHBoYUxvd2VyaW5nLnJlc3RvcmVHUChCQik7CisJfQorICAgICAgCisgICAgICAvL3B1c2ggdGhlIHJlc3VsdCBpbnRvIGEgdmlydHVhbCByZWdpc3RlcgorICAgICAgLy8gICAgaWYgKFJlc3VsdCAhPSAxKQorICAgICAgLy8gICAgICBCdWlsZE1JKEJCLCBBbHBoYTo6QklTLCAyLCBSZXN1bHQpLmFkZFJlZyhBbHBoYTo6UjApLmFkZFJlZyhBbHBoYTo6UjApOworICAgICAgCisgICAgICBzd2l0Y2ggKE5vZGUtPmdldFZhbHVlVHlwZSgwKSkgeworICAgICAgZGVmYXVsdDogTm9kZS0+ZHVtcCgpOyBhc3NlcnQoMCAmJiAiVW5rbm93biB2YWx1ZSB0eXBlIGZvciBjYWxsIHJlc3VsdCEiKTsKKyAgICAgIGNhc2UgTVZUOjpPdGhlcjogcmV0dXJuIDE7CisgICAgICBjYXNlIE1WVDo6aTE6CisgICAgICBjYXNlIE1WVDo6aTg6CisgICAgICBjYXNlIE1WVDo6aTE2OgorICAgICAgY2FzZSBNVlQ6OmkzMjoKKyAgICAgIGNhc2UgTVZUOjppNjQ6CisJQnVpbGRNSShCQiwgQWxwaGE6OkJJUywgMiwgUmVzdWx0KS5hZGRSZWcoQWxwaGE6OlIwKS5hZGRSZWcoQWxwaGE6OlIwKTsKKwlicmVhazsKKyAgICAgIGNhc2UgTVZUOjpmMzI6CisgICAgICBjYXNlIE1WVDo6ZjY0OgorCUJ1aWxkTUkoQkIsIEFscGhhOjpDUFlTLCAyLCBSZXN1bHQpLmFkZFJlZyhBbHBoYTo6RjApLmFkZFJlZyhBbHBoYTo6RjApOworCWJyZWFrOwogICAgICAgfQotCi0gICAgLy9idWlsZCB0aGUgcmlnaHQga2luZCBvZiBjYWxsCi0gICAgaWYgKEdsb2JhbEFkZHJlc3NTRE5vZGUgKkdBU0QgPQotICAgICAgICAgICAgICAgZHluX2Nhc3Q8R2xvYmFsQWRkcmVzc1NETm9kZT4oTi5nZXRPcGVyYW5kKDEpKSkgCi0gICAgICB7Ci0JU2VsZWN0KE4uZ2V0T3BlcmFuZCgwKSk7Ci0JQWxwaGFMb3dlcmluZy5yZXN0b3JlR1AoQkIpOwotCUJ1aWxkTUkoQkIsIEFscGhhOjpDQUxMLCAxKS5hZGRHbG9iYWxBZGRyZXNzKEdBU0QtPmdldEdsb2JhbCgpLHRydWUpOwotICAgICAgfQotICAgIGVsc2UgaWYgKEV4dGVybmFsU3ltYm9sU0ROb2RlICpFU1NETiA9Ci0JICAgICBkeW5fY2FzdDxFeHRlcm5hbFN5bWJvbFNETm9kZT4oTi5nZXRPcGVyYW5kKDEpKSkgCi0gICAgICB7Ci0JU2VsZWN0KE4uZ2V0T3BlcmFuZCgwKSk7Ci0JQWxwaGFMb3dlcmluZy5yZXN0b3JlR1AoQkIpOwotCUJ1aWxkTUkoQkIsIEFscGhhOjpDQUxMLCAwKS5hZGRFeHRlcm5hbFN5bWJvbChFU1NETi0+Z2V0U3ltYm9sKCksIHRydWUpOwotICAgICAgfSAKLSAgICBlbHNlIHsKLSAgICAgIFNlbGVjdChOLmdldE9wZXJhbmQoMCkpOwotICAgICAgVG1wMSA9IFNlbGVjdEV4cHIoTi5nZXRPcGVyYW5kKDEpKTsKLSAgICAgIEJ1aWxkTUkoQkIsIEFscGhhOjpDQUxMLCAxKS5hZGRSZWcoVG1wMSk7Ci0gICAgICBBbHBoYUxvd2VyaW5nLnJlc3RvcmVHUChCQik7Ci0gICAgfQotCi0gICAgLy9wdXNoIHRoZSByZXN1bHQgaW50byBhIHZpcnR1YWwgcmVnaXN0ZXIKLSAgICAvLyAgICBpZiAoUmVzdWx0ICE9IDEpCi0gICAgLy8gICAgICBCdWlsZE1JKEJCLCBBbHBoYTo6QklTLCAyLCBSZXN1bHQpLmFkZFJlZyhBbHBoYTo6UjApLmFkZFJlZyhBbHBoYTo6UjApOwotCi0gICAgc3dpdGNoIChOb2RlLT5nZXRWYWx1ZVR5cGUoMCkpIHsKLSAgICBkZWZhdWx0OiBhc3NlcnQoMCAmJiAiVW5rbm93biB2YWx1ZSB0eXBlIGZvciBjYWxsIHJlc3VsdCEiKTsKLSAgICBjYXNlIE1WVDo6T3RoZXI6IHJldHVybiAxOwotICAgIGNhc2UgTVZUOjppMToKLSAgICBjYXNlIE1WVDo6aTg6Ci0gICAgY2FzZSBNVlQ6OmkxNjoKLSAgICBjYXNlIE1WVDo6aTMyOgotICAgIGNhc2UgTVZUOjppNjQ6Ci0gICAgICBCdWlsZE1JKEJCLCBBbHBoYTo6QklTLCAyLCBSZXN1bHQpLmFkZFJlZyhBbHBoYTo6UjApLmFkZFJlZyhBbHBoYTo6UjApOwotICAgIGJyZWFrOwotICAgIH0KLSAgICByZXR1cm4gUmVzdWx0K04uUmVzTm87CisgICAgICByZXR1cm4gUmVzdWx0K04uUmVzTm87CiAgICAgfSAgICAKLSAgCisgICAgCiAgIGNhc2UgSVNEOjpTSUdOX0VYVEVORDoKICAgY2FzZSBJU0Q6OlNJR05fRVhURU5EX0lOUkVHOgogICAgIHsKICAgICAgIFRtcDEgPSBTZWxlY3RFeHByKE4uZ2V0T3BlcmFuZCgwKSk7CiAgICAgICBNVlRTRE5vZGUqIE1WTiA9IGR5bl9jYXN0PE1WVFNETm9kZT4oTm9kZSk7Ci0gICAgICBzdGQ6OmNlcnIgPDwgIlNyY1Q6ICIgPDwgTVZOLT5nZXRFeHRyYVZhbHVlVHlwZSgpIDw8ICJcbiI7CisgICAgICAvL3N0ZDo6Y2VyciA8PCAiU3JjVDogIiA8PCBNVk4tPmdldEV4dHJhVmFsdWVUeXBlKCkgPDwgIlxuIjsKICAgICAgIHN3aXRjaChNVk4tPmdldEV4dHJhVmFsdWVUeXBlKCkpCiAJewogCWRlZmF1bHQ6Ci0JICBhc3NlcnQoMCAmJiAiU2lnbiBFeHRlbmQgSW5SZWcgbm90IHRoZXJlIHlldCIpOworCSAgTm9kZS0+ZHVtcCgpOworIAkgIGFzc2VydCgwICYmICJTaWduIEV4dGVuZCBJblJlZyBub3QgdGhlcmUgeWV0Iik7CiAJICBicmVhazsKIAljYXNlIE1WVDo6aTMyOgogCSAgewpAQCAtNTAwLDExICs1NDUsMTIgQEAKICAgICB7CiAgICAgICBUbXAxID0gU2VsZWN0RXhwcihOLmdldE9wZXJhbmQoMCkpOwogICAgICAgTVZUU0ROb2RlKiBNVk4gPSBkeW5fY2FzdDxNVlRTRE5vZGU+KE5vZGUpOwotICAgICAgc3RkOjpjZXJyIDw8ICJTcmNUOiAiIDw8IE1WTi0+Z2V0RXh0cmFWYWx1ZVR5cGUoKSA8PCAiXG4iOworICAgICAgLy9zdGQ6OmNlcnIgPDwgIlNyY1Q6ICIgPDwgTVZOLT5nZXRFeHRyYVZhbHVlVHlwZSgpIDw8ICJcbiI7CiAgICAgICBzd2l0Y2goTVZOLT5nZXRFeHRyYVZhbHVlVHlwZSgpKQogCXsKIAlkZWZhdWx0OgotCSAgYXNzZXJ0KDAgJiYgIlplcm8gRXh0ZW5kIEluUmVnIG5vdCB0aGVyZSB5ZXQiKTsKKwkgIE5vZGUtPmR1bXAoKTsKKyAJICBhc3NlcnQoMCAmJiAiWmVybyBFeHRlbmQgSW5SZWcgbm90IHRoZXJlIHlldCIpOwogCSAgYnJlYWs7CiAJY2FzZSBNVlQ6OmkzMjogVG1wMiA9IDB4ZjA7IGJyZWFrOwogCWNhc2UgTVZUOjppMTY6IFRtcDIgPSAweGZjOyBicmVhazsKQEAgLTUyMCw3ICs1NjYsNyBAQAogICAgIGlmIChTZXRDQ1NETm9kZSAqU2V0Q0MgPSBkeW5fY2FzdDxTZXRDQ1NETm9kZT4oTm9kZSkpIHsKICAgICAgIGlmIChNVlQ6OmlzSW50ZWdlcihTZXRDQy0+Z2V0T3BlcmFuZCgwKS5nZXRWYWx1ZVR5cGUoKSkpIHsKIAlzd2l0Y2ggKFNldENDLT5nZXRDb25kaXRpb24oKSkgewotCWRlZmF1bHQ6IGFzc2VydCgwICYmICJVbmtub3duIGludGVnZXIgY29tcGFyaXNvbiEiKTsKKwlkZWZhdWx0OiBOb2RlLT5kdW1wKCk7IGFzc2VydCgwICYmICJVbmtub3duIGludGVnZXIgY29tcGFyaXNvbiEiKTsKIAljYXNlIElTRDo6U0VURVE6CiAJICBCdWlsZE1JKEJCLCBBbHBoYTo6Q01QRVEsIDIsIFJlc3VsdCkuYWRkUmVnKFRtcDEpLmFkZFJlZyhUbXAyKTsKIAkgIGJyZWFrOwpAQCAtNTU4LDExICs2MDQsMTYgQEAKIAl9CiAgICAgICB9CiAgICAgICBlbHNlCi0JYXNzZXJ0KDAgJiYgIm9ubHkgaW50ZWdlciIpOworCXsKKwkgIE5vZGUtPmR1bXAoKTsKKwkgIGFzc2VydCgwICYmICJvbmx5IGludGVnZXIiKTsKKwl9CiAgICAgfQogICAgIGVsc2UKLSAgICAgIGFzc2VydCgwICYmICJOb3QgYSBzZXRjYyBpbiBzZXRjYyIpOwotCisgICAgICB7CisJTm9kZS0+ZHVtcCgpOworIAlhc3NlcnQoMCAmJiAiTm90IGEgc2V0Y2MgaW4gc2V0Y2MiKTsKKyAgICAgIH0KICAgICByZXR1cm4gUmVzdWx0OwogCiAgIGNhc2UgSVNEOjpDb3B5RnJvbVJlZzoKQEAgLTU4Nyw5NCArNjM4LDE1OSBAQAogICBjYXNlIElTRDo6U0hMOgogICBjYXNlIElTRDo6U1JMOgogICBjYXNlIElTRDo6TVVMOgotICAgIGlmKE4uZ2V0T3BlcmFuZCgxKS5nZXRPcGNvZGUoKSA9PSBJU0Q6OkNvbnN0YW50ICYmCi0gICAgICAgY2FzdDxDb25zdGFudFNETm9kZT4oTi5nZXRPcGVyYW5kKDEpKS0+Z2V0VmFsdWUoKSA+PSAwICYmCi0gICAgICAgY2FzdDxDb25zdGFudFNETm9kZT4oTi5nZXRPcGVyYW5kKDEpKS0+Z2V0VmFsdWUoKSA8PSAyNTUpCi0gICAgICB7Ci0Jc3dpdGNoKE4uZ2V0T3Bjb2RlKCkpIHsKLQljYXNlIElTRDo6QU5EOiBPcGMgPSBBbHBoYTo6QU5EaTsgYnJlYWs7Ci0JY2FzZSBJU0Q6Ok9SOiAgT3BjID0gQWxwaGE6OkJJU2k7IGJyZWFrOwotCWNhc2UgSVNEOjpYT1I6IE9wYyA9IEFscGhhOjpYT1JpOyBicmVhazsKLQljYXNlIElTRDo6U0hMOiBPcGMgPSBBbHBoYTo6U0xpOyBicmVhazsKLQljYXNlIElTRDo6U1JMOiBPcGMgPSBBbHBoYTo6U1JMaTsgYnJlYWs7Ci0JY2FzZSBJU0Q6OlNSQTogT3BjID0gQWxwaGE6OlNSQWk7IGJyZWFrOwotCWNhc2UgSVNEOjpNVUw6IE9wYyA9IEFscGhhOjpNVUxRaTsgYnJlYWs7Ci0JfTsKLQlUbXAxID0gU2VsZWN0RXhwcihOLmdldE9wZXJhbmQoMCkpOwotCVRtcDIgPSBjYXN0PENvbnN0YW50U0ROb2RlPihOLmdldE9wZXJhbmQoMSkpLT5nZXRWYWx1ZSgpOwotCUJ1aWxkTUkoQkIsIE9wYywgMiwgUmVzdWx0KS5hZGRSZWcoVG1wMSkuYWRkSW1tKFRtcDIpOwotICAgICAgfQotICAgIGVsc2UKLSAgICAgIHsKLQlzd2l0Y2goTi5nZXRPcGNvZGUoKSkgewotCWNhc2UgSVNEOjpBTkQ6IE9wYyA9IEFscGhhOjpBTkQ7IGJyZWFrOwotCWNhc2UgSVNEOjpPUjogIE9wYyA9IEFscGhhOjpCSVM7IGJyZWFrOwotCWNhc2UgSVNEOjpYT1I6IE9wYyA9IEFscGhhOjpYT1I7IGJyZWFrOwotCWNhc2UgSVNEOjpTSEw6IE9wYyA9IEFscGhhOjpTTDsgYnJlYWs7Ci0JY2FzZSBJU0Q6OlNSTDogT3BjID0gQWxwaGE6OlNSTDsgYnJlYWs7Ci0JY2FzZSBJU0Q6OlNSQTogT3BjID0gQWxwaGE6OlNSQTsgYnJlYWs7Ci0JY2FzZSBJU0Q6Ok1VTDogT3BjID0gQWxwaGE6Ok1VTFE7IGJyZWFrOwotCX07Ci0JVG1wMSA9IFNlbGVjdEV4cHIoTi5nZXRPcGVyYW5kKDApKTsKLQlUbXAyID0gU2VsZWN0RXhwcihOLmdldE9wZXJhbmQoMSkpOwotCUJ1aWxkTUkoQkIsIE9wYywgMiwgUmVzdWx0KS5hZGRSZWcoVG1wMSkuYWRkUmVnKFRtcDIpOwotICAgICAgfQorICAgIHN3aXRjaCAoTi5nZXRWYWx1ZVR5cGUoKSkgeworICAgIGRlZmF1bHQ6IE5vZGUtPmR1bXAoKTsgYXNzZXJ0ICgwICYmICJ1bmhhbmRsZWQgdHlwZSIpOworICAgIGNhc2UgTVZUOjpmNjQ6CisgICAgICBhc3NlcnQoTi5nZXRPcGNvZGUoKSA9PSBJU0Q6Ok1VTCAmJiAib25seSBtdWwgaGVyZSBwbGVhc2UiKTsKKyAgICAgIFRtcDEgPSBTZWxlY3RFeHByKE4uZ2V0T3BlcmFuZCgwKSk7CisgICAgICBUbXAyID0gU2VsZWN0RXhwcihOLmdldE9wZXJhbmQoMSkpOworICAgICAgQnVpbGRNSShCQiwgQWxwaGE6Ok1VTFQsIDIsIFJlc3VsdCkuYWRkUmVnKFRtcDEpLmFkZFJlZyhUbXAyKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgTVZUOjpmMzI6CisgICAgICBhc3NlcnQoTi5nZXRPcGNvZGUoKSA9PSBJU0Q6Ok1VTCAmJiAib25seSBtdWwgaGVyZSBwbGVhc2UiKTsKKyAgICAgIFRtcDEgPSBTZWxlY3RFeHByKE4uZ2V0T3BlcmFuZCgwKSk7CisgICAgICBUbXAyID0gU2VsZWN0RXhwcihOLmdldE9wZXJhbmQoMSkpOworICAgICAgQnVpbGRNSShCQiwgQWxwaGE6Ok1VTFMsIDIsIFJlc3VsdCkuYWRkUmVnKFRtcDEpLmFkZFJlZyhUbXAyKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgTVZUOjppNjQ6CisgICAgICBpZihOLmdldE9wZXJhbmQoMSkuZ2V0T3Bjb2RlKCkgPT0gSVNEOjpDb25zdGFudCAmJgorCSBjYXN0PENvbnN0YW50U0ROb2RlPihOLmdldE9wZXJhbmQoMSkpLT5nZXRWYWx1ZSgpID49IDAgJiYKKwkgY2FzdDxDb25zdGFudFNETm9kZT4oTi5nZXRPcGVyYW5kKDEpKS0+Z2V0VmFsdWUoKSA8PSAyNTUpCisJeworCSAgc3dpdGNoKE4uZ2V0T3Bjb2RlKCkpIHsKKwkgIGNhc2UgSVNEOjpBTkQ6IE9wYyA9IEFscGhhOjpBTkRpOyBicmVhazsKKwkgIGNhc2UgSVNEOjpPUjogIE9wYyA9IEFscGhhOjpCSVNpOyBicmVhazsKKwkgIGNhc2UgSVNEOjpYT1I6IE9wYyA9IEFscGhhOjpYT1JpOyBicmVhazsKKwkgIGNhc2UgSVNEOjpTSEw6IE9wYyA9IEFscGhhOjpTTGk7IGJyZWFrOworCSAgY2FzZSBJU0Q6OlNSTDogT3BjID0gQWxwaGE6OlNSTGk7IGJyZWFrOworCSAgY2FzZSBJU0Q6OlNSQTogT3BjID0gQWxwaGE6OlNSQWk7IGJyZWFrOworCSAgY2FzZSBJU0Q6Ok1VTDogT3BjID0gQWxwaGE6Ok1VTFFpOyBicmVhazsKKwkgIH07CisJICBUbXAxID0gU2VsZWN0RXhwcihOLmdldE9wZXJhbmQoMCkpOworCSAgVG1wMiA9IGNhc3Q8Q29uc3RhbnRTRE5vZGU+KE4uZ2V0T3BlcmFuZCgxKSktPmdldFZhbHVlKCk7CisJICBCdWlsZE1JKEJCLCBPcGMsIDIsIFJlc3VsdCkuYWRkUmVnKFRtcDEpLmFkZEltbShUbXAyKTsKKwl9CisgICAgICBlbHNlCisJeworCSAgc3dpdGNoKE4uZ2V0T3Bjb2RlKCkpIHsKKwkgIGNhc2UgSVNEOjpBTkQ6IE9wYyA9IEFscGhhOjpBTkQ7IGJyZWFrOworCSAgY2FzZSBJU0Q6Ok9SOiAgT3BjID0gQWxwaGE6OkJJUzsgYnJlYWs7CisJICBjYXNlIElTRDo6WE9SOiBPcGMgPSBBbHBoYTo6WE9SOyBicmVhazsKKwkgIGNhc2UgSVNEOjpTSEw6IE9wYyA9IEFscGhhOjpTTDsgYnJlYWs7CisJICBjYXNlIElTRDo6U1JMOiBPcGMgPSBBbHBoYTo6U1JMOyBicmVhazsKKwkgIGNhc2UgSVNEOjpTUkE6IE9wYyA9IEFscGhhOjpTUkE7IGJyZWFrOworCSAgY2FzZSBJU0Q6Ok1VTDogT3BjID0gQWxwaGE6Ok1VTFE7IGJyZWFrOworCSAgfTsKKwkgIFRtcDEgPSBTZWxlY3RFeHByKE4uZ2V0T3BlcmFuZCgwKSk7CisJICBUbXAyID0gU2VsZWN0RXhwcihOLmdldE9wZXJhbmQoMSkpOworCSAgQnVpbGRNSShCQiwgT3BjLCAyLCBSZXN1bHQpLmFkZFJlZyhUbXAxKS5hZGRSZWcoVG1wMik7CisJfQorICAgICAgYnJlYWs7CisgICAgfQogICAgIHJldHVybiBSZXN1bHQ7CiAKICAgY2FzZSBJU0Q6OkFERDoKICAgY2FzZSBJU0Q6OlNVQjoKICAgICB7CiAgICAgICBib29sIGlzQWRkID0gTi5nZXRPcGNvZGUoKSA9PSBJU0Q6OkFERDsKLQotICAgICAgLy9GSVhNRTogZmlyc3QgY2hlY2sgZm9yIFNjYWxlZCBBZGRzIGFuZCBTdWJzIQotICAgICAgaWYoTi5nZXRPcGVyYW5kKDEpLmdldE9wY29kZSgpID09IElTRDo6Q29uc3RhbnQgJiYKLQkgY2FzdDxDb25zdGFudFNETm9kZT4oTi5nZXRPcGVyYW5kKDEpKS0+Z2V0VmFsdWUoKSA+PSAwICYmCi0JIGNhc3Q8Q29uc3RhbnRTRE5vZGU+KE4uZ2V0T3BlcmFuZCgxKSktPmdldFZhbHVlKCkgPD0gMjU1KQotCXsgLy9Ob3JtYWwgaW1tIGFkZC9zdWIKLQkgIE9wYyA9IGlzQWRkID8gQWxwaGE6OkFERFFpIDogQWxwaGE6OlNVQlFpOwotCSAgVG1wMSA9IFNlbGVjdEV4cHIoTi5nZXRPcGVyYW5kKDApKTsKLQkgIFRtcDIgPSBjYXN0PENvbnN0YW50U0ROb2RlPihOLmdldE9wZXJhbmQoMSkpLT5nZXRWYWx1ZSgpOwotCSAgQnVpbGRNSShCQiwgT3BjLCAyLCBSZXN1bHQpLmFkZFJlZyhUbXAxKS5hZGRJbW0oVG1wMik7Ci0JfQotICAgICAgZWxzZSBpZihOLmdldE9wZXJhbmQoMSkuZ2V0T3Bjb2RlKCkgPT0gSVNEOjpDb25zdGFudCAmJgotCSAgICAgIGNhc3Q8Q29uc3RhbnRTRE5vZGU+KE4uZ2V0T3BlcmFuZCgxKSktPmdldFZhbHVlKCkgPj0gMCAmJgotCSBjYXN0PENvbnN0YW50U0ROb2RlPihOLmdldE9wZXJhbmQoMSkpLT5nZXRWYWx1ZSgpIDw9IDMyNzY3KQotCXsgLy9MREEgIC8vRklYTUU6IGV4cGFuZCB0aGUgYWJvdmUgY29uZGl0aW9uIGEgYml0Ci0JICBUbXAxID0gU2VsZWN0RXhwcihOLmdldE9wZXJhbmQoMCkpOwotCSAgVG1wMiA9IGNhc3Q8Q29uc3RhbnRTRE5vZGU+KE4uZ2V0T3BlcmFuZCgxKSktPmdldFZhbHVlKCk7Ci0JICBpZiAoIWlzQWRkKQotCSAgICBUbXAyID0gLVRtcDI7Ci0JICBCdWlsZE1JKEJCLCBBbHBoYTo6TERBLCAyLCBSZXN1bHQpLmFkZEltbShUbXAyKS5hZGRSZWcoVG1wMSk7Ci0JfQotICAgICAgZWxzZQotCXsgLy9Ob3JtYWwgYWRkL3N1YgotCSAgT3BjID0gaXNBZGQgPyBBbHBoYTo6QUREUSA6IEFscGhhOjpTVUJROwotCSAgVG1wMSA9IFNlbGVjdEV4cHIoTi5nZXRPcGVyYW5kKDApKTsKLQkgIFRtcDIgPSBTZWxlY3RFeHByKE4uZ2V0T3BlcmFuZCgxKSk7Ci0JICBCdWlsZE1JKEJCLCBPcGMsIDIsIFJlc3VsdCkuYWRkUmVnKFRtcDEpLmFkZFJlZyhUbXAyKTsKLQotCX0KLQkgIHJldHVybiBSZXN1bHQ7CisgICAgICAKKyAgICAgIHN3aXRjaCAoTi5nZXRWYWx1ZVR5cGUoKSkgeworICAgICAgZGVmYXVsdDogTm9kZS0+ZHVtcCgpOyBhc3NlcnQoMCAmJiAiVW5oYW5kbGVkIHR5cGUiKTsKKyAgICAgIGNhc2UgTVZUOjppNjQ6IHsKKwkvL0ZJWE1FOiBmaXJzdCBjaGVjayBmb3IgU2NhbGVkIEFkZHMgYW5kIFN1YnMhCisJaWYoTi5nZXRPcGVyYW5kKDEpLmdldE9wY29kZSgpID09IElTRDo6Q29uc3RhbnQgJiYKKwkgICBjYXN0PENvbnN0YW50U0ROb2RlPihOLmdldE9wZXJhbmQoMSkpLT5nZXRWYWx1ZSgpID49IDAgJiYKKwkgICBjYXN0PENvbnN0YW50U0ROb2RlPihOLmdldE9wZXJhbmQoMSkpLT5nZXRWYWx1ZSgpIDw9IDI1NSkKKwkgIHsgLy9Ob3JtYWwgaW1tIGFkZC9zdWIKKwkgICAgT3BjID0gaXNBZGQgPyBBbHBoYTo6QUREUWkgOiBBbHBoYTo6U1VCUWk7CisJICAgIFRtcDEgPSBTZWxlY3RFeHByKE4uZ2V0T3BlcmFuZCgwKSk7CisJICAgIFRtcDIgPSBjYXN0PENvbnN0YW50U0ROb2RlPihOLmdldE9wZXJhbmQoMSkpLT5nZXRWYWx1ZSgpOworCSAgICBCdWlsZE1JKEJCLCBPcGMsIDIsIFJlc3VsdCkuYWRkUmVnKFRtcDEpLmFkZEltbShUbXAyKTsKKwkgIH0KKwllbHNlIGlmKE4uZ2V0T3BlcmFuZCgxKS5nZXRPcGNvZGUoKSA9PSBJU0Q6OkNvbnN0YW50ICYmCisJCWNhc3Q8Q29uc3RhbnRTRE5vZGU+KE4uZ2V0T3BlcmFuZCgxKSktPmdldFZhbHVlKCkgPj0gMCAmJgorCQljYXN0PENvbnN0YW50U0ROb2RlPihOLmdldE9wZXJhbmQoMSkpLT5nZXRWYWx1ZSgpIDw9IDMyNzY3KQorCSAgeyAvL0xEQSAgLy9GSVhNRTogZXhwYW5kIHRoZSBhYm92ZSBjb25kaXRpb24gYSBiaXQKKwkgICAgVG1wMSA9IFNlbGVjdEV4cHIoTi5nZXRPcGVyYW5kKDApKTsKKwkgICAgVG1wMiA9IGNhc3Q8Q29uc3RhbnRTRE5vZGU+KE4uZ2V0T3BlcmFuZCgxKSktPmdldFZhbHVlKCk7CisJICAgIGlmICghaXNBZGQpCisJICAgICAgVG1wMiA9IC1UbXAyOworCSAgICBCdWlsZE1JKEJCLCBBbHBoYTo6TERBLCAyLCBSZXN1bHQpLmFkZEltbShUbXAyKS5hZGRSZWcoVG1wMSk7CisJICB9CisJZWxzZQorCSAgeyAvL05vcm1hbCBhZGQvc3ViCisJICAgIE9wYyA9IGlzQWRkID8gQWxwaGE6OkFERFEgOiBBbHBoYTo6U1VCUTsKKwkgICAgVG1wMSA9IFNlbGVjdEV4cHIoTi5nZXRPcGVyYW5kKDApKTsKKwkgICAgVG1wMiA9IFNlbGVjdEV4cHIoTi5nZXRPcGVyYW5kKDEpKTsKKwkgICAgQnVpbGRNSShCQiwgT3BjLCAyLCBSZXN1bHQpLmFkZFJlZyhUbXAxKS5hZGRSZWcoVG1wMik7CisJICB9CisgICAgICB9IGJyZWFrOworICAgICAgY2FzZSBNVlQ6OmY2NDoKKyAgICAgIGNhc2UgTVZUOjpmMzI6CisJaWYgKE4uZ2V0VmFsdWVUeXBlKCkgPT0gTVZUOjpmNjQpCisJICBPcGMgPSBpc0FkZCA/IEFscGhhOjpBRERUIDogQWxwaGE6OlNVQlQ7CisJZWxzZQorCSAgT3BjID0gaXNBZGQgPyBBbHBoYTo6QUREUyA6IEFscGhhOjpTVUJTOworCS8vCisgICAgICAgIFRtcDEgPSBTZWxlY3RFeHByKE4uZ2V0T3BlcmFuZCgwKSk7CisJVG1wMiA9IFNlbGVjdEV4cHIoTi5nZXRPcGVyYW5kKDEpKTsKKwlCdWlsZE1JKEJCLCBPcGMsIDIsIFJlc3VsdCkuYWRkUmVnKFRtcDEpLmFkZFJlZyhUbXAyKTsKKwlicmVhazsKICAgICAgIH0KKyAgICAgIHJldHVybiBSZXN1bHQ7CisgICAgfQogCiAgIGNhc2UgSVNEOjpVUkVNOgogICBjYXNlIElTRDo6U1JFTToKICAgY2FzZSBJU0Q6OlNESVY6CiAgIGNhc2UgSVNEOjpVRElWOgotICAgIC8vRklYTUU6IGFscGhhIHJlYWxseSBkb2Vzbid0IHN1cHBvcnQgYW55IG9mIHRoZXNlIG9wZXJhdGlvbnMsIAotICAgIC8vIHRoZSBvcHMgYXJlIGV4cGFuZGVkIGludG8gc3BlY2lhbCBsaWJyYXJ5IGNhbGxzIHdpdGgKLSAgICAvLyBzcGVjaWFsIGNhbGxpbmcgY29udmVudGlvbnMKLSAgICBzd2l0Y2goTi5nZXRPcGNvZGUoKSkgewotICAgIGNhc2UgSVNEOjpVUkVNOiBPcGMgPSBBbHBoYTo6UkVNUVU7IGJyZWFrOwotICAgIGNhc2UgSVNEOjpTUkVNOiBPcGMgPSBBbHBoYTo6UkVNUTsgYnJlYWs7Ci0gICAgY2FzZSBJU0Q6OlVESVY6IE9wYyA9IEFscGhhOjpESVZRVTsgYnJlYWs7Ci0gICAgY2FzZSBJU0Q6OlNESVY6IE9wYyA9IEFscGhhOjpESVZROyBicmVhazsKLSAgICB9OworICAgIHN3aXRjaCAoTi5nZXRWYWx1ZVR5cGUoKSkgeworICAgIGRlZmF1bHQ6IE5vZGUtPmR1bXAoKTsgYXNzZXJ0ICgwICYmICJ1bmhhbmRsZWQgdHlwZSIpOworICAgIGNhc2UgTVZUOjpmNjQ6CisgICAgICBhc3NlcnQoTi5nZXRPcGNvZGUoKSA9PSBJU0Q6OlNESVYgJiYgIm9ubHkgZGl2IGhlcmUgcGxlYXNlIik7CisgICAgICBPcGMgPSBBbHBoYTo6RElWVDsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgTVZUOjpmMzI6CisgICAgICBhc3NlcnQoTi5nZXRPcGNvZGUoKSA9PSBJU0Q6OlNESVYgJiYgIm9ubHkgZGl2IGhlcmUgcGxlYXNlIik7CisgICAgICBPcGMgPSBBbHBoYTo6RElWUzsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgTVZUOjppNjQ6CisgICAgICAvL0ZJWE1FOiBhbHBoYSByZWFsbHkgZG9lc24ndCBzdXBwb3J0IGFueSBvZiB0aGVzZSBvcGVyYXRpb25zLCAKKyAgICAgIC8vIHRoZSBvcHMgYXJlIGV4cGFuZGVkIGludG8gc3BlY2lhbCBsaWJyYXJ5IGNhbGxzIHdpdGgKKyAgICAgIC8vIHNwZWNpYWwgY2FsbGluZyBjb252ZW50aW9ucworICAgICAgc3dpdGNoKE4uZ2V0T3Bjb2RlKCkpIHsKKyAgICAgIGNhc2UgSVNEOjpVUkVNOiBPcGMgPSBBbHBoYTo6UkVNUVU7IGJyZWFrOworICAgICAgY2FzZSBJU0Q6OlNSRU06IE9wYyA9IEFscGhhOjpSRU1ROyBicmVhazsKKyAgICAgIGNhc2UgSVNEOjpVRElWOiBPcGMgPSBBbHBoYTo6RElWUVU7IGJyZWFrOworICAgICAgY2FzZSBJU0Q6OlNESVY6IE9wYyA9IEFscGhhOjpESVZROyBicmVhazsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIH0KICAgICBUbXAxID0gU2VsZWN0RXhwcihOLmdldE9wZXJhbmQoMCkpOwogICAgIFRtcDIgPSBTZWxlY3RFeHByKE4uZ2V0T3BlcmFuZCgxKSk7CiAgICAgQnVpbGRNSShCQiwgT3BjLCAyLCBSZXN1bHQpLmFkZFJlZyhUbXAxKS5hZGRSZWcoVG1wMik7CiAgICAgcmV0dXJuIFJlc3VsdDsKIAorLy8gICBjYXNlIElTRDo6U0lOVF9UT19GUDoKKy8vICAgICBNVlQ6OlZhbHVlVHlwZSBEZXN0VHkgPSBOLmdldFZhbHVlVHlwZSgpOworLy8gICAgIFRtcDEgPSBTZWxlY3RFeHByKE4uZ2V0T3BlcmFuZCgwKSk7ICAvLyBHZXQgdGhlIG9wZXJhbmQgcmVnaXN0ZXIKKy8vICAgICBUbXAyID0gTWFrZVJlZyhEZXN0VHkpOworLy8gICAgIE9wYyA9IERlc3RUeSA9PSBNVlQ6OmY2NCA/IElUT0ZUIDogSVRPRlM7CisvLyAgICAgQnVpbGRNSShCQiwgIE9wYywgMSwgVG1wMikuYWRkUmVnKFRtcDEpOworLy8gICAgIE9wYyA9IERlc3RUeSA9PSBNVlQ6OmY2NCA/IENWVFFUIDogQ1ZUUVM7CisvLyAgICAgQnVpbGRNSShCQiwgT3BjLCAxLCBSZXN1bHQpLmFkZFJlZyhUbXAxKTsKKy8vICAgICAvLyAgY2FzZSBJU0Q6OlVJTlRfVE9fRlA6CisKKy8vICAgY2FzZSBJU0Q6OkZQX1RPX1NJTlQ6CisvLyAgICAgYXNzZXJ0IChOLmdldFZhbHVlVHlwZSgpID09IE1WVDo6ZjY0ICYmICJPbmx5IGNhbiBjb252ZXJ0IGZvciBkb3VibGVzIik7CisvLyAgICAgVG1wMSA9IFNlbGVjdEV4cHIoTi5nZXRPcGVyYW5kKDApKTsgIC8vIEdldCB0aGUgb3BlcmFuZCByZWdpc3RlcgorLy8gICAgIFRtcDIgPSBNYWtlUmVnKFNyY1R5KTsKKy8vICAgICBCdWlsZE1JKEJCLCBDVlRUUSwgMSwgVG1wMikuYWRkUmVnKFRtcDEpOworLy8gICAgIEJ1aWxkTUkoQkIsIEZUT0lULCAxLCBSZXN1bHQpLmFkZFJlZyhUbXAyKTsKKy8vICAgICByZXR1cm4gcmVzdWx0OworCisvLyAgICAgLy8gIGNhc2UgSVNEOjpGUF9UT19VSU5UOiAKKyAKICAgY2FzZSBJU0Q6OlNFTEVDVDoKICAgICB7CiAgICAgICBUbXAyID0gU2VsZWN0RXhwcihOLmdldE9wZXJhbmQoMSkpOyAvL1VzZSBpZiBUUlVFCkBAIC03OTAsMTIgKzkwNiwxNyBAQAogICAgICAgIHN0ZDo6Y2VyciA8PCBOLmdldE51bU9wZXJhbmRzKCkgPDwgIlxuIjsKICAgICAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgTi5nZXROdW1PcGVyYW5kcygpOyArK2kpCiAJIHN0ZDo6Y2VyciA8PCBOLmdldE9wZXJhbmQoaSkuZ2V0VmFsdWVUeXBlKCkgPDwgIlxuIjsKKyAgICAgICBOb2RlLT5kdW1wKCk7CiAgICAgICAgYXNzZXJ0KDAgJiYgIlVua25vd24gcmV0dXJuIGluc3RydWN0aW9uISIpOwogICAgICBjYXNlIDI6CiAgICAgICAgU2VsZWN0KE4uZ2V0T3BlcmFuZCgwKSk7CiAgICAgICAgVG1wMSA9IFNlbGVjdEV4cHIoTi5nZXRPcGVyYW5kKDEpKTsKICAgICAgICBzd2l0Y2ggKE4uZ2V0T3BlcmFuZCgxKS5nZXRWYWx1ZVR5cGUoKSkgewotICAgICAgIGRlZmF1bHQ6IGFzc2VydCgwICYmICJBbGwgb3RoZXIgdHlwZXMgc2hvdWxkIGhhdmUgYmVlbiBwcm9tb3RlZCEhIik7CisgICAgICAgZGVmYXVsdDogTm9kZS0+ZHVtcCgpOyBhc3NlcnQoMCAmJiAiQWxsIG90aGVyIHR5cGVzIHNob3VsZCBoYXZlIGJlZW4gcHJvbW90ZWQhISIpOworICAgICAgIGNhc2UgTVZUOjpmNjQ6CisgICAgICAgY2FzZSBNVlQ6OmYzMjoKKwkgQnVpbGRNSShCQiwgQWxwaGE6OkNQWVMsIDIsIEFscGhhOjpGMCkuYWRkUmVnKFRtcDEpLmFkZFJlZyhUbXAxKTsKKwkgYnJlYWs7CiAgICAgICAgY2FzZSBNVlQ6OmkzMjoKICAgICAgICBjYXNlIE1WVDo6aTY0OgogCSBCdWlsZE1JKEJCLCBBbHBoYTo6QklTLCAyLCBBbHBoYTo6UjApLmFkZFJlZyhUbXAxKS5hZGRSZWcoVG1wMSk7CkBAIC04MzksMTQgKzk2MCwxNyBAQAogCiAgIGNhc2UgSVNEOjpUUlVOQ1NUT1JFOiB7ICAvLyB0cnVuY3N0b3JlIGNoYWluLCB2YWwsIHB0ciA6c3RvcmV0eQogICAgIE1WVDo6VmFsdWVUeXBlIFN0b3JlZFR5ID0gY2FzdDxNVlRTRE5vZGU+KE5vZGUpLT5nZXRFeHRyYVZhbHVlVHlwZSgpOwotICAgIGFzc2VydChTdG9yZWRUeSAhPSBNVlQ6Omk2NCAmJiAiVW5zdXBwb3J0ZWQgVFJVTkNTVE9SRSBmb3IgdGhpcyB0YXJnZXQhIik7CisgICAgaWYgKFN0b3JlZFR5ID09IE1WVDo6aTY0KSB7CisgICAgICBOb2RlLT5kdW1wKCk7CisgICAgICBhc3NlcnQoU3RvcmVkVHkgIT0gTVZUOjppNjQgJiYgIlVuc3VwcG9ydGVkIFRSVU5DU1RPUkUgZm9yIHRoaXMgdGFyZ2V0ISIpOworICAgIH0KIAogICAgIFNlbGVjdChOLmdldE9wZXJhbmQoMCkpOwogICAgIFRtcDEgPSBTZWxlY3RFeHByKE4uZ2V0T3BlcmFuZCgxKSk7CiAgICAgVG1wMiA9IFNlbGVjdEV4cHIoTi5nZXRPcGVyYW5kKDIpKTsKIAogICAgIHN3aXRjaCAoU3RvcmVkVHkpIHsKLSAgICBkZWZhdWx0OiBhc3NlcnQoMCAmJiAiVW5oYW5kbGVkIFR5cGUiKTsgYnJlYWs7CisgICAgZGVmYXVsdDogTm9kZS0+ZHVtcCgpOyBhc3NlcnQoMCAmJiAiVW5oYW5kbGVkIFR5cGUiKTsgYnJlYWs7CiAgICAgY2FzZSBNVlQ6OmkxOiAvL0ZJWE1FOiBEQUcgZG9lcyBub3QgcHJvbW90ZSB0aGlzIGxvYWQKICAgICBjYXNlIE1WVDo6aTg6IE9wYyA9IEFscGhhOjpTVEI7IGJyZWFrOwogICAgIGNhc2UgTVZUOjppMTY6IE9wYyA9IEFscGhhOjpTVFc7IGJyZWFrOwpkaWZmIC0tZ2l0IGEvbGliL1RhcmdldC9BbHBoYS9BbHBoYUluc3RyRm9ybWF0cy50ZCBiL2xpYi9UYXJnZXQvQWxwaGEvQWxwaGFJbnN0ckZvcm1hdHMudGQKaW5kZXggMzlhMmIwNC4uNDQ5NzBiMiAxMDA2NDQKLS0tIGEvbGliL1RhcmdldC9BbHBoYS9BbHBoYUluc3RyRm9ybWF0cy50ZAorKysgYi9saWIvVGFyZ2V0L0FscGhhL0FscGhhSW5zdHJGb3JtYXRzLnRkCkBAIC04MywxMCArODMsMTAgQEAKIH0KIAogLy8zLjMuNAotY2xhc3MgRlBGb3JtPGJpdHM8Nj4gb3Bjb2RlLCBkYWcgT0wsIHN0cmluZyBhc21zdHI+IDogSW5zdEFscGhhPG9wY29kZSwgT0wsIGFzbXN0cj4geworY2xhc3MgRlBGb3JtPGJpdHM8Nj4gb3Bjb2RlLCBiaXRzPDExPiBmdW4sIGRhZyBPTCwgc3RyaW5nIGFzbXN0cj4gOiBJbnN0QWxwaGE8b3Bjb2RlLCBPTCwgYXNtc3RyPiB7CiAgIGJpdHM8NT4gRmE7CiAgIGJpdHM8NT4gRmI7Ci0gIGJpdHM8MTE+IEZ1bmN0aW9uOworICBiaXRzPDExPiBGdW5jdGlvbiA9IGZ1bjsKICAgYml0czw1PiBGYzsKIAogICBsZXQgSW5zdHsyNS0yMX0gPSBGYTsKZGlmZiAtLWdpdCBhL2xpYi9UYXJnZXQvQWxwaGEvQWxwaGFJbnN0ckluZm8uY3BwIGIvbGliL1RhcmdldC9BbHBoYS9BbHBoYUluc3RySW5mby5jcHAKaW5kZXggOWJiOWFjYy4uMWE3MzBiMyAxMDA2NDQKLS0tIGEvbGliL1RhcmdldC9BbHBoYS9BbHBoYUluc3RySW5mby5jcHAKKysrIGIvbGliL1RhcmdldC9BbHBoYS9BbHBoYUluc3RySW5mby5jcHAKQEAgLTI2LDcgKzI2LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkJiBzb3VyY2VSZWcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCYgZGVzdFJlZykgY29uc3QgewogICBNYWNoaW5lT3BDb2RlIG9jID0gTUkuZ2V0T3Bjb2RlKCk7Ci0gIGlmIChvYyA9PSBBbHBoYTo6QklTKSB7ICAvLyBvciByMSwgcjIsIHIyCisgIGlmIChvYyA9PSBBbHBoYTo6QklTIHx8IG9jID09IEFscGhhOjpDUFlTKSB7ICAvLyBvciByMSwgcjIsIHIyIC8vIGNweXMgcjEgcjIgcjIKICAgICBhc3NlcnQoTUkuZ2V0TnVtT3BlcmFuZHMoKSA9PSAzICYmCiAgICAgICAgICAgIE1JLmdldE9wZXJhbmQoMCkuaXNSZWdpc3RlcigpICYmCiAgICAgICAgICAgIE1JLmdldE9wZXJhbmQoMSkuaXNSZWdpc3RlcigpICYmCmRpZmYgLS1naXQgYS9saWIvVGFyZ2V0L0FscGhhL0FscGhhSW5zdHJJbmZvLnRkIGIvbGliL1RhcmdldC9BbHBoYS9BbHBoYUluc3RySW5mby50ZAppbmRleCAxZDU4MjBmLi42MWQ2MTVkIDEwMDY0NAotLS0gYS9saWIvVGFyZ2V0L0FscGhhL0FscGhhSW5zdHJJbmZvLnRkCisrKyBiL2xpYi9UYXJnZXQvQWxwaGEvQWxwaGFJbnN0ckluZm8udGQKQEAgLTQzLDcgKzQzLDEwIEBACiAKIGxldCBpc0NhbGwgPSAxLAogICAgIERlZnMgPSBbUjAsIFIxLCBSMiwgUjMsIFI0LCBSNSwgUjYsIFI3LCBSOCwgUjE2LCBSMTcsIFIxOCwgUjE5LAotICAgICAgICAgICAgUjIwLCBSMjEsIFIyMiwgUjIzLCBSMjQsIFIyNSwgUjI2LCBSMjcsIFIyOV0sCisgICAgICAgICAgICBSMjAsIFIyMSwgUjIyLCBSMjMsIFIyNCwgUjI1LCBSMjYsIFIyNywgUjI5LAorICAgICAgICAgICAgRjAsIEYxLAorICAgICAgICAgICAgRjEwLCBGMTEsIEYxMiwgRjEzLCBGMTQsIEYxNSwgRjE2LCBGMTcsIEYxOCwgRjE5LAorICAgICAgICAgICAgRjIwLCBGMjEsIEYyMiwgRjIzLCBGMjQsIEYyNSwgRjI2LCBGMjcsIEYyOCwgRjI5LCBGMzBdLAogICAgIFVzZXMgPSBbUjI3LCBSMjldIGluCiAgICAgICBkZWYgQ0FMTCA6IFBzZXVkb0luc3RBbHBoYTwgKG9wcyBzNjRpbW06JFRBUkdFVCksICJqc3IgJFRBUkdFVCI+OyAvL0p1bXAgdG8gc3Vicm91dGluZQogCkBAIC0yNTAsMTkgKzI1MywzMiBAQAogICBsZXQgRGVmcyA9IFtSMCwgUjEsIFIyLCBSMywgUjQsIFI1LCBSNiwgUjcsIFI4LCBSMTYsIFIxNywgUjE4LCBSMTksIFIyMCwgUjIxLCBSMjIsIFIyMywgUjI0LCBSMjUsIFIyNywgUjI5XSBpbiAKICAgICBkZWYgQlNSIDogQkZvcm08MHgzNCwgKG9wcyBHUFJDOiRSRCwgczIxaW1tOiRESVNQKSwgImJzciAkUkQsJERJU1AiPjsgLy9CcmFuY2ggdG8gc3Vicm91dGluZQogCisvL1N0b3JlcywgaW50CiBkZWYgU1RCIDogTUZvcm08MHgwRSwgKG9wcyBHUFJDOiRSQSwgczE2aW1tOiRESVNQLCBHUFJDOiRSQiksICJzdGIgJFJBLCRESVNQKCRSQikiPjsgLy8gU3RvcmUgYnl0ZQogZGVmIFNUVyA6IE1Gb3JtPDB4MEQsIChvcHMgR1BSQzokUkEsIHMxNmltbTokRElTUCwgR1BSQzokUkIpLCAic3R3ICRSQSwkRElTUCgkUkIpIj47IC8vIFN0b3JlIHdvcmQKIGRlZiBTVEwgOiBNRm9ybTwweDJDLCAob3BzIEdQUkM6JFJBLCBzMTZpbW06JERJU1AsIEdQUkM6JFJCKSwgInN0bCAkUkEsJERJU1AoJFJCKSI+OyAvLyBTdG9yZSBsb25nd29yZAogZGVmIFNUUSA6IE1Gb3JtPDB4MkQsIChvcHMgR1BSQzokUkEsIHMxNmltbTokRElTUCwgR1BSQzokUkIpLCAic3RxICRSQSwkRElTUCgkUkIpIj47IC8vU3RvcmUgcXVhZHdvcmQKIAorLy9Mb2FkIGFkZHJlc3MKIGRlZiBMREEgOiBNRm9ybTwweDA4LCAob3BzIEdQUkM6JFJBLCBzMTZpbW06JERJU1AsIEdQUkM6JFJCKSwgImxkYSAkUkEsJERJU1AoJFJCKSI+OyAgLy9Mb2FkIGFkZHJlc3MKK2RlZiBMREFIIDogTUZvcm08MHgwOCwgKG9wcyBHUFJDOiRSQSwgczE2aW1tOiRESVNQLCBHUFJDOiRSQiksICJsZGFoICRSQSwkRElTUCgkUkIpIj47ICAvL0xvYWQgYWRkcmVzcyBoaWdoCiAKKy8vTG9hZHMsIGludAogZGVmIExETCA6IE1Gb3JtPDB4MjgsIChvcHMgR1BSQzokUkEsIHMxNmltbTokRElTUCwgR1BSQzokUkIpLCAibGRxICRSQSwkRElTUCgkUkIpIj47IC8vIExvYWQgc2lnbi1leHRlbmRlZCBsb25nd29yZAogZGVmIExEUSA6IE1Gb3JtPDB4MjksIChvcHMgR1BSQzokUkEsIHMxNmltbTokRElTUCwgR1BSQzokUkIpLCAibGRxICRSQSwkRElTUCgkUkIpIj47IC8vTG9hZCBxdWFkd29yZAogZGVmIExEQlUgOiBNRm9ybTwweDBBLCAob3BzIEdQUkM6JFJBLCBzMTZpbW06JERJU1AsIEdQUkM6JFJCKSwgImxkYnUgJFJBLCRESVNQKCRSQikiPjsgLy9Mb2FkIHplcm8tZXh0ZW5kZWQgYnl0ZQogZGVmIExEV1UgOiBNRm9ybTwweDBDLCAob3BzIEdQUkM6JFJBLCBzMTZpbW06JERJU1AsIEdQUkM6JFJCKSwgImxkd3UgJFJBLCRESVNQKCRSQikiPjsgLy9Mb2FkIHplcm8tZXh0ZW5kZWQgd29yZAogCisvL1N0b3JlcywgZmxvYXQKK2RlZiBTVFMgOiBNRm9ybTwweDI2LCAob3BzIEZQUkM6JFJBLCBzMTZpbW06JERJU1AsIEdQUkM6JFJCKSwgInN0cyAkUkEsJERJU1AoJFJCKSI+OyAvL1N0b3JlIFNfZmxvYXRpbmcKK2RlZiBTVFQgOiBNRm9ybTwweDI3LCAob3BzIEZQUkM6JFJBLCBzMTZpbW06JERJU1AsIEdQUkM6JFJCKSwgInN0dCAkUkEsJERJU1AoJFJCKSI+OyAvL1N0b3JlIFRfZmxvYXRpbmcKIAorLy9Mb2FkcywgZmxvYXQKK2RlZiBMRFMgOiBNRm9ybTwweDIyLCAob3BzIEZQUkM6JFJBLCBzMTZpbW06JERJU1AsIEdQUkM6JFJCKSwgImxkcyAkUkEsJERJU1AoJFJCKSI+OyAvL0xvYWQgU19mbG9hdGluZworZGVmIExEVCA6IE1Gb3JtPDB4MjMsIChvcHMgRlBSQzokUkEsIHMxNmltbTokRElTUCwgR1BSQzokUkIpLCAibGR0ICRSQSwkRElTUCgkUkIpIj47IC8vTG9hZCBUX2Zsb2F0aW5nCisKKworLy9CcmFuY2hlcywgaW50CiBkZWYgQkVRIDogQkZvcm08MHgzOSwgKG9wcyBHUFJDOiRSQSwgczIxaW1tOiRESVNQKSwgImJlcSAkUkEsJERJU1AiPjsgLy9CcmFuY2ggaWYgPSB6ZXJvCiBkZWYgQkdFIDogQkZvcm08MHgzRSwgKG9wcyBHUFJDOiRSQSwgczIxaW1tOiRESVNQKSwgImJnZSAkUkEsJERJU1AiPjsgLy9CcmFuY2ggaWYgPj0gemVybwogZGVmIEJHVCA6IEJGb3JtPDB4M0YsIChvcHMgR1BSQzokUkEsIHMyMWltbTokRElTUCksICJiZ3QgJFJBLCRESVNQIj47IC8vQnJhbmNoIGlmID4gemVybwpAQCAtMjcyLDE5ICsyODgsNDIgQEAKIGRlZiBCTFQgOiBCRm9ybTwweDNBLCAob3BzIEdQUkM6JFJBLCBzMjFpbW06JERJU1ApLCAiYmx0ICRSQSwkRElTUCI+OyAvL0JyYW5jaCBpZiA8IHplcm8KIGRlZiBCTkUgOiBCRm9ybTwweDNELCAob3BzIEdQUkM6JFJBLCBzMjFpbW06JERJU1ApLCAiYm5lICRSQSwkRElTUCI+OyAvL0JyYW5jaCBpZiAhPSB6ZXJvCiAKKy8vQnJhbmNoZXMsIGZsb2F0CitkZWYgRkJFUSA6IEJGb3JtPDB4MzEsIChvcHMgRlBSQzokUkEsIHMyMWltbTokRElTUCksICJiZXEgJFJBLCRESVNQIj47IC8vRmxvYXRpbmcgYnJhbmNoIGlmID0gIHplcm8KK2RlZiBGQkdFIDogQkZvcm08MHgzNiwgKG9wcyBGUFJDOiRSQSwgczIxaW1tOiRESVNQKSwgImJlcSAkUkEsJERJU1AiPjsgLy9GbG9hdGluZyBicmFuY2ggaWYgPj0gemVybworZGVmIEZCR1QgOiBCRm9ybTwweDM3LCAob3BzIEZQUkM6JFJBLCBzMjFpbW06JERJU1ApLCAiYmVxICRSQSwkRElTUCI+OyAvL0Zsb2F0aW5nIGJyYW5jaCBpZiA+IHplcm8KK2RlZiBGQkxFIDogQkZvcm08MHgzMywgKG9wcyBGUFJDOiRSQSwgczIxaW1tOiRESVNQKSwgImJlcSAkUkEsJERJU1AiPjsgLy9GbG9hdGluZyBicmFuY2ggaWYgPD0gemVybworZGVmIEZCTFQgOiBCRm9ybTwweDMyLCAob3BzIEZQUkM6JFJBLCBzMjFpbW06JERJU1ApLCAiYmVxICRSQSwkRElTUCI+OyAvL0Zsb2F0aW5nIGJyYW5jaCBpZiA8IHplcm8KK2RlZiBGQk5FIDogQkZvcm08MHgzNSwgKG9wcyBGUFJDOiRSQSwgczIxaW1tOiRESVNQKSwgImJlcSAkUkEsJERJU1AiPjsgLy9GbG9hdGluZyBicmFuY2ggaWYgIT0gemVybworCisvL0Z1bmt5IEZsb2F0aW5nIHBvaW50IG9wcworZGVmIENQWVMgIDogRlBGb3JtPDB4MTcsIDB4MDIwLCAob3BzIEZQUkM6JFJDLCBGUFJDOiRSQSwgRlBSQzokUkIpLCAiY3B5cyAkUkEsJFJCLCRSQyI+OyAgLy9Db3B5IHNpZ24KK2RlZiBDUFlTRSA6IEZQRm9ybTwweDE3LCAweDAyMiwgKG9wcyBGUFJDOiRSQywgRlBSQzokUkEsIEZQUkM6JFJCKSwgImNweXNlICRSQSwkUkIsJFJDIj47IC8vQ29weSBzaWduIGFuZCBleHBvbmVudAorZGVmIENQWVNOIDogRlBGb3JtPDB4MTcsIDB4MDIxLCAob3BzIEZQUkM6JFJDLCBGUFJDOiRSQSwgRlBSQzokUkIpLCAiY3B5c24gJFJBLCRSQiwkUkMiPjsgLy9Db3B5IHNpZ24gbmVnYXRlCisKKy8vQmFzaWMgRmxvYXRpbmcgcG9pbnQgb3BzCitkZWYgQUREUyAgOiBGUEZvcm08MHgxNiwgMHgwODAsIChvcHMgRlBSQzokUkMsIEZQUkM6JFJBLCBGUFJDOiRSQiksICJhZGRzICRSQSwkUkIsJFJDIj47ICAvL0FkZCBTX2Zsb2F0aW5nCitkZWYgQUREVCAgOiBGUEZvcm08MHgxNiwgMHgwQTAsIChvcHMgRlBSQzokUkMsIEZQUkM6JFJBLCBGUFJDOiRSQiksICJhZGR0ICRSQSwkUkIsJFJDIj47ICAvL0FkZCBUX2Zsb2F0aW5nCitkZWYgU1VCUyAgOiBGUEZvcm08MHgxNiwgMHgwODEsIChvcHMgRlBSQzokUkMsIEZQUkM6JFJBLCBGUFJDOiRSQiksICJzdWJzICRSQSwkUkIsJFJDIj47ICAvL1N1YnRyYWN0IFNfZmxvYXRpbmcKK2RlZiBTVUJUICA6IEZQRm9ybTwweDE2LCAweDBBMSwgKG9wcyBGUFJDOiRSQywgRlBSQzokUkEsIEZQUkM6JFJCKSwgInN1YnQgJFJBLCRSQiwkUkMiPjsgIC8vU3VidHJhY3QgVF9mbG9hdGluZworZGVmIERJVlMgIDogRlBGb3JtPDB4MTYsIDB4MDgzLCAob3BzIEZQUkM6JFJDLCBGUFJDOiRSQSwgRlBSQzokUkIpLCAiZGl2cyAkUkEsJFJCLCRSQyI+OyAgLy9EaXZpZGUgU19mbG9hdGluZworZGVmIERJVlQgIDogRlBGb3JtPDB4MTYsIDB4MEEzLCAob3BzIEZQUkM6JFJDLCBGUFJDOiRSQSwgRlBSQzokUkIpLCAiZGl2dCAkUkEsJFJCLCRSQyI+OyAgLy9EaXZpZGUgVF9mbG9hdGluZworZGVmIE1VTFMgIDogRlBGb3JtPDB4MTYsIDB4MDgyLCAob3BzIEZQUkM6JFJDLCBGUFJDOiRSQSwgRlBSQzokUkIpLCAibXVscyAkUkEsJFJCLCRSQyI+OyAgLy9NdWx0aXBseSBTX2Zsb2F0aW5nCitkZWYgTVVMVCAgOiBGUEZvcm08MHgxNiwgMHgwQTIsIChvcHMgRlBSQzokUkMsIEZQUkM6JFJBLCBGUFJDOiRSQiksICJtdWx0ICRSQSwkUkIsJFJDIj47ICAvL011bHRpcGx5IFRfZmxvYXRpbmcKK2RlZiBTUVJUUyA6IEZQRm9ybTwweDE0LCAweDA4QiwgKG9wcyBGUFJDOiRSQywgRlBSQzokUkEsIEZQUkM6JFJCKSwgInNxcnRzICRSQSwkUkIsJFJDIj47ICAvL1NxdWFyZSByb290IFNfZmxvYXRpbmcKK2RlZiBTUVJUVCA6IEZQRm9ybTwweDE0LCAweDBBQiwgKG9wcyBGUFJDOiRSQywgRlBSQzokUkEsIEZQUkM6JFJCKSwgInNxcnR0ICRSQSwkUkIsJFJDIj47ICAvL1NxdWFyZSByb290IFRfZmxvYXRpbmcKKworLy9TX2Zsb2F0aW5nIDogSUVFRSBTaW5nbGUKKy8vVF9mbG9hdGluZyA6IElFRUUgRG91YmxlCisKIC8vTW5lbW9uaWMgRm9ybWF0IE9wY29kZSBEZXNjcmlwdGlvbgotLy9BRERGIEYtUCAxNS4wODAgQWRkIEZfZmxvYXRpbmcKLS8vQURERyBGLVAgMTUuMEEwIEFkZCBHX2Zsb2F0aW5nCi0vL0FERFMgRi1QIDE2LjA4MCBBZGQgU19mbG9hdGluZwotLy9BRERUIEYtUCAxNi4wQTAgQWRkIFRfZmxvYXRpbmcKKwogLy9DQUxMX1BBTCBQY2QgMDAgVHJhcCB0byBQQUxjb2RlCiAvL0VDQiBNZmMgMTguRTgwMCBFdmljdCBjYWNoZSBibG9jawogLy9FWENCIE1mYyAxOC4wNDAwIEV4Y2VwdGlvbiBiYXJyaWVyCiAvL0ZFVENIIE1mYyAxOC44MDAwIFByZWZldGNoIGRhdGEKIC8vRkVUQ0hfTSBNZmMgMTguQTAwMCBQcmVmZXRjaCBkYXRhLCBtb2RpZnkgaW50ZW50Ci0vL0xEQUggTWVtIDA5IExvYWQgYWRkcmVzcyBoaWdoCi0vL0xEQlUgTWVtIDBBIExvYWQgemVyby1leHRlbmRlZCBieXRlCi0vL0xEV1UgTWVtIDBDIExvYWQgemVyby1leHRlbmRlZCB3b3JkCisKIC8vTERMX0wgTWVtIDJBIExvYWQgc2lnbi1leHRlbmRlZCBsb25nd29yZCBsb2NrZWQKIC8vTERRX0wgTWVtIDJCIExvYWQgcXVhZHdvcmQgbG9ja2VkCiAvL0xEUV9VIE1lbSAwQiBMb2FkIHVuYWxpZ25lZCBxdWFkd29yZApAQCAtMjkyLDc3ICszMzEsMzkgQEAKIC8vUkMgTWZjIDE4LkUwMDAgUmVhZCBhbmQgY2xlYXIKIC8vUlBDQyBNZmMgMTguQzAwMCBSZWFkIHByb2Nlc3MgY3ljbGUgY291bnRlcgogLy9SUyBNZmMgMTguRjAwMCBSZWFkIGFuZCBzZXQKKwogLy9TVExfQyBNZW0gMkUgU3RvcmUgbG9uZ3dvcmQgY29uZGl0aW9uYWwKIC8vU1RRX0MgTWVtIDJGIFN0b3JlIHF1YWR3b3JkIGNvbmRpdGlvbmFsCiAvL1NUUV9VIE1lbSAwRiBTdG9yZSB1bmFsaWduZWQgcXVhZHdvcmQKKwogLy9UUkFQQiBNZmMgMTguMDAwMCBUcmFwIGJhcnJpZXIKIC8vV0g2NCBNZmMgMTguRjgwMCBXcml0ZSBoaW50IBQgNjQgYnl0ZXMKIC8vV01CIE1mYyAxOC40NDAwIFdyaXRlIG1lbW9yeSBiYXJyaWVyCiAKLQotLy9DTVBHRVEgRi1QIDE1LjBBNSBDb21wYXJlIEdfZmxvYXRpbmcgZXF1YWwKLS8vQ01QR0xFIEYtUCAxNS4wQTcgQ29tcGFyZSBHX2Zsb2F0aW5nIGxlc3MgdGhhbiBvciBlcXVhbAotLy9DTVBHTFQgRi1QIDE1LjBBNiBDb21wYXJlIEdfZmxvYXRpbmcgbGVzcyB0aGFuCiAvL0NNUFRFUSBGLVAgMTYuMEE1IENvbXBhcmUgVF9mbG9hdGluZyBlcXVhbAogLy9DTVBUTEUgRi1QIDE2LjBBNyBDb21wYXJlIFRfZmxvYXRpbmcgbGVzcyB0aGFuIG9yIGVxdWFsCiAvL0NNUFRMVCBGLVAgMTYuMEE2IENvbXBhcmUgVF9mbG9hdGluZyBsZXNzIHRoYW4KIC8vQ01QVFVOIEYtUCAxNi4wQTQgQ29tcGFyZSBUX2Zsb2F0aW5nIHVub3JkZXJlZAotLy9DUFlTIEYtUCAxNy4wMjAgQ29weSBzaWduCi0vL0NQWVNFIEYtUCAxNy4wMjIgQ29weSBzaWduIGFuZCBleHBvbmVudAotLy9DUFlTTiBGLVAgMTcuMDIxIENvcHkgc2lnbiBuZWdhdGUKLS8vQ1ZUREcgRi1QIDE1LjA5RSBDb252ZXJ0IERfZmxvYXRpbmcgdG8gR19mbG9hdGluZwotLy9DVlRHRCBGLVAgMTUuMEFEIENvbnZlcnQgR19mbG9hdGluZyB0byBEX2Zsb2F0aW5nCi0vL0NWVEdGIEYtUCAxNS4wQUMgQ29udmVydCBHX2Zsb2F0aW5nIHRvIEZfZmxvYXRpbmcKLS8vQ1ZUR1EgRi1QIDE1LjBBRiBDb252ZXJ0IEdfZmxvYXRpbmcgdG8gcXVhZHdvcmQKKwogLy9DVlRMUSBGLVAgMTcuMDEwIENvbnZlcnQgbG9uZ3dvcmQgdG8gcXVhZHdvcmQKLS8vQ1ZUUUYgRi1QIDE1LjBCQyBDb252ZXJ0IHF1YWR3b3JkIHRvIEZfZmxvYXRpbmcKLS8vQ1ZUUUcgRi1QIDE1LjBCRSBDb252ZXJ0IHF1YWR3b3JkIHRvIEdfZmxvYXRpbmcKIC8vQ1ZUUUwgRi1QIDE3LjAzMCBDb252ZXJ0IHF1YWR3b3JkIHRvIGxvbmd3b3JkCiAvL0NWVFFTIEYtUCAxNi4wQkMgQ29udmVydCBxdWFkd29yZCB0byBTX2Zsb2F0aW5nCiAvL0NWVFFUIEYtUCAxNi4wQkUgQ29udmVydCBxdWFkd29yZCB0byBUX2Zsb2F0aW5nCiAvL0NWVFNUIEYtUCAxNi4yQUMgQ29udmVydCBTX2Zsb2F0aW5nIHRvIFRfZmxvYXRpbmcKIC8vQ1ZUVFEgRi1QIDE2LjBBRiBDb252ZXJ0IFRfZmxvYXRpbmcgdG8gcXVhZHdvcmQKIC8vQ1ZUVFMgRi1QIDE2LjBBQyBDb252ZXJ0IFRfZmxvYXRpbmcgdG8gU19mbG9hdGluZwotLy9ESVZGIEYtUCAxNS4wODMgRGl2aWRlIEZfZmxvYXRpbmcKLS8vRElWRyBGLVAgMTUuMEEzIERpdmlkZSBHX2Zsb2F0aW5nCi0vL0RJVlMgRi1QIDE2LjA4MyBEaXZpZGUgU19mbG9hdGluZwotLy9ESVZUIEYtUCAxNi4wQTMgRGl2aWRlIFRfZmxvYXRpbmcKLS8vRkJFUSBCcmEgMzEgRmxvYXRpbmcgYnJhbmNoIGlmID0gIHplcm8KLS8vRkJHRSBCcmEgMzYgRmxvYXRpbmcgYnJhbmNoIGlmILMgemVybwotLy9GQkdUIEJyYSAzNyBGbG9hdGluZyBicmFuY2ggaWYgPiB6ZXJvCi0vL0ZCTEUgQnJhIDMzIEZsb2F0aW5nIGJyYW5jaCBpZiCjIHplcm8KLS8vRkJMVCBCcmEgMzIgRmxvYXRpbmcgYnJhbmNoIGlmIDwgemVybwotLy9GQk5FIEJyYSAzNSBGbG9hdGluZyBicmFuY2ggaWYguSB6ZXJvCisKIC8vRkNNT1ZFUSBGLVAgMTcuMDJBIEZDTU9WRSBpZiA9IHplcm8KLS8vRkNNT1ZHRSBGLVAgMTcuMDJEIEZDTU9WRSBpZiCzIHplcm8KKy8vRkNNT1ZHRSBGLVAgMTcuMDJEIEZDTU9WRSBpZiA+PSB6ZXJvCiAvL0ZDTU9WR1QgRi1QIDE3LjAyRiBGQ01PVkUgaWYgPiB6ZXJvCi0vL0ZDTU9WTEUgRi1QIDE3LjAyRSBGQ01PVkUgaWYgoyB6ZXJvCisvL0ZDTU9WTEUgRi1QIDE3LjAyRSBGQ01PVkUgaWYgPD0gemVybwogLy9GQ01PVkxUIEYtUCAxNy4wMkMgRkNNT1ZFIGlmIDwgemVybwotLy9GQ01PVk5FIEYtUCAxNy4wMkIgRkNNT1ZFIGlmILkgemVybworLy9GQ01PVk5FIEYtUCAxNy4wMkIgRkNNT1ZFIGlmICE9IHplcm8KKwogLy9GVE9JUyBGLVAgMUMuNzggRmxvYXRpbmcgdG8gaW50ZWdlciBtb3ZlLCBTX2Zsb2F0aW5nCiAvL0ZUT0lUIEYtUCAxQy43MCBGbG9hdGluZyB0byBpbnRlZ2VyIG1vdmUsIFRfZmxvYXRpbmcKLS8vSVRPRkYgRi1QIDE0LjAxNCBJbnRlZ2VyIHRvIGZsb2F0aW5nIG1vdmUsIEZfZmxvYXRpbmcKIC8vSVRPRlMgRi1QIDE0LjAwNCBJbnRlZ2VyIHRvIGZsb2F0aW5nIG1vdmUsIFNfZmxvYXRpbmcKIC8vSVRPRlQgRi1QIDE0LjAyNCBJbnRlZ2VyIHRvIGZsb2F0aW5nIG1vdmUsIFRfZmxvYXRpbmcKLS8vTERGIE1lbSAyMCBMb2FkIEZfZmxvYXRpbmcKLS8vTERHIE1lbSAyMSBMb2FkIEdfZmxvYXRpbmcKLS8vTERTIE1lbSAyMiBMb2FkIFNfZmxvYXRpbmcKLS8vTERUIE1lbSAyMyBMb2FkIFRfZmxvYXRpbmcKKwogLy9NRl9GUENSIEYtUCAxNy4wMjUgTW92ZSBmcm9tIEZQQ1IKIC8vTVRfRlBDUiBGLVAgMTcuMDI0IE1vdmUgdG8gRlBDUgotLy9NVUxGIEYtUCAxNS4wODIgTXVsdGlwbHkgRl9mbG9hdGluZwotLy9NVUxHIEYtUCAxNS4wQTIgTXVsdGlwbHkgR19mbG9hdGluZwotLy9NVUxTIEYtUCAxNi4wODIgTXVsdGlwbHkgU19mbG9hdGluZwotLy9NVUxUIEYtUCAxNi4wQTIgTXVsdGlwbHkgVF9mbG9hdGluZwotLy9TUVJURiBGLVAgMTQuMDhBIFNxdWFyZSByb290IEZfZmxvYXRpbmcKLS8vU1FSVEcgRi1QIDE0LjBBQSBTcXVhcmUgcm9vdCBHX2Zsb2F0aW5nCi0vL1NRUlRTIEYtUCAxNC4wOEIgU3F1YXJlIHJvb3QgU19mbG9hdGluZwotLy9TUVJUVCBGLVAgMTQuMEFCIFNxdWFyZSByb290IFRfZmxvYXRpbmcKLS8vU1RGIE1lbSAyNCBTdG9yZSBGX2Zsb2F0aW5nCi0vL1NURyBNZW0gMjUgU3RvcmUgR19mbG9hdGluZwotLy9TVFMgTWVtIDI2IFN0b3JlIFNfZmxvYXRpbmcKLS8vU1RUIE1lbSAyNyBTdG9yZSBUX2Zsb2F0aW5nCi0vL1NVQkYgRi1QIDE1LjA4MSBTdWJ0cmFjdCBGX2Zsb2F0aW5nCi0vL1NVQkcgRi1QIDE1LjBBMSBTdWJ0cmFjdCBHX2Zsb2F0aW5nCi0vL1NVQlMgRi1QIDE2LjA4MSBTdWJ0cmFjdCBTX2Zsb2F0aW5nCi0vL1NVQlQgRi1QIDE2LjBBMSBTdWJ0cmFjdCBUX2Zsb2F0aW5nCmRpZmYgLS1naXQgYS9saWIvVGFyZ2V0L0FscGhhL0FscGhhUmVnaXN0ZXJJbmZvLmNwcCBiL2xpYi9UYXJnZXQvQWxwaGEvQWxwaGFSZWdpc3RlckluZm8uY3BwCmluZGV4IDgwNzE5M2EuLjBjNWNhMzUgMTAwNjQ0Ci0tLSBhL2xpYi9UYXJnZXQvQWxwaGEvQWxwaGFSZWdpc3RlckluZm8uY3BwCisrKyBiL2xpYi9UYXJnZXQvQWxwaGEvQWxwaGFSZWdpc3RlckluZm8uY3BwCkBAIC00OCw3ICs0OCw3IEBACiBBbHBoYVJlZ2lzdGVySW5mbzo6c3RvcmVSZWdUb1N0YWNrU2xvdChNYWNoaW5lQmFzaWNCbG9jayAmTUJCLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFjaGluZUJhc2ljQmxvY2s6Oml0ZXJhdG9yIE1JLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgU3JjUmVnLCBpbnQgRnJhbWVJZHgpIGNvbnN0IHsKLSAgc3RkOjpjZXJyIDw8ICJUcnlpbmcgdG8gc3RvcmUgIiA8PCBnZXRQcmV0dHlOYW1lKFNyY1JlZykgPDwgIiB0byAiIDw8IEZyYW1lSWR4IDw8ICJcbiI7CisgIC8vc3RkOjpjZXJyIDw8ICJUcnlpbmcgdG8gc3RvcmUgIiA8PCBnZXRQcmV0dHlOYW1lKFNyY1JlZykgPDwgIiB0byAiIDw8IEZyYW1lSWR4IDw8ICJcbiI7CiAgIC8vQnVpbGRNSShNQkIsIE1JLCBBbHBoYTo6V1RGLCAwKS5hZGRSZWcoU3JjUmVnKTsKICAgQnVpbGRNSShNQkIsIE1JLCBBbHBoYTo6U1RRLCAzKS5hZGRSZWcoU3JjUmVnKS5hZGRJbW0oRnJhbWVJZHggKiA4KS5hZGRSZWcoQWxwaGE6OlIzMCk7CiAgIC8vICBhc3NlcnQoMCAmJiAiVE9ETyIpOwpAQCAtNTgsNyArNTgsNyBAQAogQWxwaGFSZWdpc3RlckluZm86OmxvYWRSZWdGcm9tU3RhY2tTbG90KE1hY2hpbmVCYXNpY0Jsb2NrICZNQkIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFjaGluZUJhc2ljQmxvY2s6Oml0ZXJhdG9yIE1JLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIERlc3RSZWcsIGludCBGcmFtZUlkeCkgY29uc3R7Ci0gIHN0ZDo6Y2VyciA8PCAiVHJ5aW5nIHRvIGxvYWQgIiA8PCBnZXRQcmV0dHlOYW1lKERlc3RSZWcpIDw8ICIgdG8gIiA8PCBGcmFtZUlkeCA8PCAiXG4iOworICAvL3N0ZDo6Y2VyciA8PCAiVHJ5aW5nIHRvIGxvYWQgIiA8PCBnZXRQcmV0dHlOYW1lKERlc3RSZWcpIDw8ICIgdG8gIiA8PCBGcmFtZUlkeCA8PCAiXG4iOwogICAvL0J1aWxkTUkoTUJCLCBNSSwgQWxwaGE6OldURiwgMCwgRGVzdFJlZyk7CiAgIEJ1aWxkTUkoTUJCLCBNSSwgQWxwaGE6OkxEUSwgMiwgRGVzdFJlZykuYWRkSW1tKEZyYW1lSWR4ICogOCkuYWRkUmVnKEFscGhhOjpSMzApOwogICAvLyAgYXNzZXJ0KDAgJiYgIlRPRE8iKTsKQEAgLTcxLDggKzcxLDggQEAKICAgLy8gIHN0ZDo6Y2VyciA8PCAiY29weVJlZ1RvUmVnICIgPDwgRGVzdFJlZyA8PCAiIDwtICIgPDwgU3JjUmVnIDw8ICJcbiI7CiAgIGlmIChSQyA9PSBBbHBoYTo6R1BSQ1JlZ2lzdGVyQ2xhc3MpIHsKICAgICBCdWlsZE1JKE1CQiwgTUksIEFscGhhOjpCSVMsIDIsIERlc3RSZWcpLmFkZFJlZyhTcmNSZWcpLmFkZFJlZyhTcmNSZWcpOwotLy8gICB9IGVsc2UgaWYgKFJDID09IEFscGhhOjpGUFJDUmVnaXN0ZXJDbGFzcykgewotLy8gICAgIEJ1aWxkTUkoTUJCLCBNSSwgUFBDOjpGTVIsIDEsIERlc3RSZWcpLmFkZFJlZyhTcmNSZWcpOworICB9IGVsc2UgaWYgKFJDID09IEFscGhhOjpGUFJDUmVnaXN0ZXJDbGFzcykgeworICAgIEJ1aWxkTUkoTUJCLCBNSSwgQWxwaGE6OkNQWVMsIDIsIERlc3RSZWcpLmFkZFJlZyhTcmNSZWcpLmFkZFJlZyhTcmNSZWcpOwogICB9IGVsc2UgeyAKICAgICBzdGQ6OmNlcnIgPDwgIkF0dGVtcHQgdG8gY29weSByZWdpc3RlciB0aGF0IGlzIG5vdCBHUFIgb3IgRlBSIjsKICAgICAgYWJvcnQoKTsKQEAgLTIwNSwxNCArMjA1LDIxIEBACiAgIAogICAvLyBhZGp1c3Qgc3RhY2sgcG9pbnRlcjogcjMwIC09IG51bWJ5dGVzCiAgIAotICBpZiAoTnVtQnl0ZXMgPD0gMzIwMDApIC8vRklYTUU6IGRvIHRoaXMgYmV0dGVyIAotICAgIHsKLSAgICAgIE1JPUJ1aWxkTUkoQWxwaGE6OkxEQSwgMiwgQWxwaGE6OlIzMCkuYWRkSW1tKC1OdW1CeXRlcykuYWRkUmVnKEFscGhhOjpSMzApOwotICAgICAgTUJCLmluc2VydChNQkJJLCBNSSk7Ci0gICAgfSBlbHNlIHsKLSAgICAgIHN0ZDo6Y2VyciA8PCAiVG9vIGJpZyBhIHN0YWNrIGZyYW1lXG4iOwotICAgICAgYWJvcnQoKTsKLSAgICB9CisgIGlmIChOdW1CeXRlcyA8PSAzMjc2NykgeworICAgIE1JPUJ1aWxkTUkoQWxwaGE6OkxEQSwgMiwgQWxwaGE6OlIzMCkuYWRkSW1tKC1OdW1CeXRlcykuYWRkUmVnKEFscGhhOjpSMzApOworICAgIE1CQi5pbnNlcnQoTUJCSSwgTUkpOworICB9IGVsc2UgaWYgKE51bUJ5dGVzIDw9IDMyNzY3ICogNjU1MzYpIHsKKyAgICBsb25nIHkgPSBOdW1CeXRlcyAvIDY1NTM2OworICAgIGlmIChOdW1CeXRlcyAlIDY1NTM2ID4gMzI3NjcpCisgICAgICArK3k7CisgICAgTUk9QnVpbGRNSShBbHBoYTo6TERBSCwgMiwgQWxwaGE6OlIzMCkuYWRkSW1tKC15KS5hZGRSZWcoQWxwaGE6OlIzMCk7CisgICAgTUJCLmluc2VydChNQkJJLCBNSSk7CisgICAgTUk9QnVpbGRNSShBbHBoYTo6TERBLCAyLCBBbHBoYTo6UjMwKS5hZGRJbW0oLShOdW1CeXRlcyAtIHkgKiA2NTUzNikpLmFkZFJlZyhBbHBoYTo6UjMwKTsKKyAgICBNQkIuaW5zZXJ0KE1CQkksIE1JKTsKKyAgfSBlbHNlIHsKKyAgICBzdGQ6OmNlcnIgPDwgIlRvbyBiaWcgYSBzdGFjayBmcmFtZVxuIjsKKyAgICBhYm9ydCgpOworICB9CiB9CiAKIHZvaWQgQWxwaGFSZWdpc3RlckluZm86OmVtaXRFcGlsb2d1ZShNYWNoaW5lRnVuY3Rpb24gJk1GLAo=