LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIAogKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCiAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQogKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgogKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCiAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQogKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAqIAogKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogKiAKICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAogKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgogKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCiAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKICogdW5kZXIgdGhlIExpY2Vuc2UuCiAqIAogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KCgoKLy8gTUFSS0VSKHVwZGF0ZV9wcmVjb21wLnB5KTogYXV0b2dlbiBpbmNsdWRlIHN0YXRlbWVudCwgZG8gbm90IHJlbW92ZQojaW5jbHVkZSAicHJlY29tcGlsZWRfdmNsLmh4eCIKCiNpbmNsdWRlIDxzdGRsaWIuaD4KCiNpbmNsdWRlIDx2Y2wvYm1wYWNjLmh4eD4KI2luY2x1ZGUgPHZjbC9vY3RyZWUuaHh4PgojaW5jbHVkZSA8dmNsL2JpdG1hcGV4Lmh4eD4KI2luY2x1ZGUgPHZjbC9iaXRtYXAuaHh4PgoKI2luY2x1ZGUgPGltcG9jdC5oeHg+CiNpbmNsdWRlIDxpbXB2ZWN0Lmh4eD4KCi8vIC0tLS0tLS0tLS0tCi8vIC0gRGVmaW5lcyAtCi8vIC0tLS0tLS0tLS0tCgojZGVmaW5lIFJHQjE1KCBfZGVmX2NSLCBfZGVmX2NHLCBfZGVmX2NCICkJKCgoc2FsX3VMb25nKShfZGVmX2NSKTw8MTBVTCl8KChzYWxfdUxvbmcpKF9kZWZfY0cpPDw1VUwpfChzYWxfdUxvbmcpKF9kZWZfY0IpKQojZGVmaW5lIEdBTU1BKCBfZGVmX2NWYWwsIF9kZWZfSW52R2FtbWEgKQkoKHNhbF91SW50OClNaW5NYXgoRlJvdW5kKHBvdyggX2RlZl9jVmFsLzI1NS4wLF9kZWZfSW52R2FtbWEpKjI1NS4wKSwwTCwyNTVMKSkKI2RlZmluZSBNQVAoIGNWYWwwLCBjVmFsMSwgbkZyYWMgKQkoKHNhbF91SW50OCkoKCgobG9uZykoY1ZhbDApPDw3TCkrbkZyYWMqKChsb25nKShjVmFsMSktKGNWYWwwKSkpPj43TCkpCgojZGVmaW5lIENBTENfRVJST1JTCQkJCQkJCQkJCQkJCQkJCVwKCQkJCQkJblRlbXAgICA9IHAxVFtuWCsrXSA+PiAxMjsJCQkJCQkJCVwKCQkJCQkJbkJFcnIgPSBNaW5NYXgoIG5UZW1wLCAwLCAyNTUgKTsJCQkJCQlcCgkJCQkJCW5CRXJyID0gbkJFcnIgLSBGbG95ZEluZGV4TWFwWyBuQkMgPSBGbG95ZE1hcFtuQkVycl0gXTsJXAoJCQkJCQluVGVtcCAgID0gcDFUW25YKytdID4+IDEyOwkJCQkJCQkJXAoJCQkJCQluR0VyciA9IE1pbk1heCggblRlbXAsIDAsIDI1NSApOwkJCQkJCVwKCQkJCQkJbkdFcnIgPSBuR0VyciAtIEZsb3lkSW5kZXhNYXBbIG5HQyA9IEZsb3lkTWFwW25HRXJyXSBdOwlcCgkJCQkJCW5UZW1wICAgPSBwMVRbblhdID4+IDEyOwkJCQkJCQkJXAoJCQkJCQluUkVyciA9IE1pbk1heCggblRlbXAsIDAsIDI1NSApOwkJCQkJCVwKCQkJCQkJblJFcnIgPSBuUkVyciAtIEZsb3lkSW5kZXhNYXBbIG5SQyA9IEZsb3lkTWFwW25SRXJyXSBdOwoKI2RlZmluZSBDQUxDX1RBQkxFUzMJCQkJCQkJCQkJXAoJCQkJCQlwMlRbblgrK10gKz0gRmxveWRFcnJvcjNbbkJFcnJdOwlcCgkJCQkJCXAyVFtuWCsrXSArPSBGbG95ZEVycm9yM1tuR0Vycl07CVwKCQkJCQkJcDJUW25YKytdICs9IEZsb3lkRXJyb3IzW25SRXJyXTsKCiNkZWZpbmUgQ0FMQ19UQUJMRVM1CQkJCQkJCQkJCVwKCQkJCQkJcDJUW25YKytdICs9IEZsb3lkRXJyb3I1W25CRXJyXTsJXAoJCQkJCQlwMlRbblgrK10gKz0gRmxveWRFcnJvcjVbbkdFcnJdOwlcCgkJCQkJCXAyVFtuWCsrXSArPSBGbG95ZEVycm9yNVtuUkVycl07CgojZGVmaW5lIENBTENfVEFCTEVTNwkJCQkJCQkJCQlcCgkJCQkJCXAxVFsrK25YXSArPSBGbG95ZEVycm9yN1tuQkVycl07CVwKCQkJCQkJcDJUW25YKytdICs9IEZsb3lkRXJyb3IxW25CRXJyXTsJXAoJCQkJCQlwMVRbblhdICs9IEZsb3lkRXJyb3I3W25HRXJyXTsJCVwKCQkJCQkJcDJUW25YKytdICs9IEZsb3lkRXJyb3IxW25HRXJyXTsJXAoJCQkJCQlwMVRbblhdICs9IEZsb3lkRXJyb3I3W25SRXJyXTsJCVwKCQkJCQkJcDJUW25YXSArPSBGbG95ZEVycm9yMVtuUkVycl07CgovLyAtLS0tLS0tLS0tLQovLyAtIFN0YXRpY3MgLQovLyAtLS0tLS0tLS0tLQoKc2FsX3VMb25nIG5WQ0xSTHV0WyA2IF0gPSB7IDE2LCAxNywgMTgsIDE5LCAyMCwgMjEgfTsKc2FsX3VMb25nIG5WQ0xHTHV0WyA2IF0gPSB7IDAsIDYsIDEyLCAxOCwgMjQsIDMwIH07CnNhbF91TG9uZyBuVkNMQkx1dFsgNiBdID0geyAwLCAzNiwgNzIsIDEwOCwgMTQ0LCAxODAgfTsKCi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKc2FsX3VMb25nIG5WQ0xEaXRoZXJMdXRbIDI1NiBdID0KewogICAgICAgMCwgNDkxNTIsIDEyMjg4LCA2MTQ0MCwgIDMwNzIsIDUyMjI0LCAxNTM2MCwgNjQ1MTIsICAgNzY4LCA0OTkyMCwgMTMwNTYsCiAgIDYyMjA4LCAgMzg0MCwgNTI5OTIsIDE2MTI4LCA2NTI4MCwgMzI3NjgsIDE2Mzg0LCA0NTA1NiwgMjg2NzIsIDM1ODQwLCAxOTQ1NiwKICAgNDgxMjgsIDMxNzQ0LCAzMzUzNiwgMTcxNTIsIDQ1ODI0LCAyOTQ0MCwgMzY2MDgsIDIwMjI0LCA0ODg5NiwgMzI1MTIsIDgxOTIsCiAgIDU3MzQ0LCAgNDA5NiwgNTMyNDgsIDExMjY0LCA2MDQxNiwgIDcxNjgsIDU2MzIwLCAgODk2MCwgNTgxMTIsICA0ODY0LCA1NDAxNiwKICAgMTIwMzIsIDYxMTg0LCAgNzkzNiwgNTcwODgsIDQwOTYwLCAyNDU3NiwgMzY4NjQsIDIwNDgwLCA0NDAzMiwgMjc2NDgsIDM5OTM2LAogICAyMzU1MiwgNDE3MjgsIDI1MzQ0LCAzNzYzMiwgMjEyNDgsIDQ0ODAwLCAyODQxNiwgNDA3MDQsIDI0MzIwLCAyMDQ4LCA1MTIwMCwKICAgMTQzMzYsIDYzNDg4LCAgMTAyNCwgNTAxNzYsIDEzMzEyLCA2MjQ2NCwgIDI4MTYsIDUxOTY4LCAxNTEwNCwgNjQyNTYsICAxNzkyLAogICA1MDk0NCwgMTQwODAsIDYzMjMyLCAzNDgxNiwgMTg0MzIsIDQ3MTA0LCAzMDcyMCwgMzM3OTIsIDE3NDA4LCA0NjA4MCwgMjk2OTYsCiAgIDM1NTg0LCAxOTIwMCwgNDc4NzIsIDMxNDg4LCAzNDU2MCwgMTgxNzYsIDQ2ODQ4LCAzMDQ2NCwgMTAyNDAsIDU5MzkyLCAgNjE0NCwKICAgNTUyOTYsICA5MjE2LCA1ODM2OCwgIDUxMjAsIDU0MjcyLCAxMTAwOCwgNjAxNjAsICA2OTEyLCA1NjA2NCwgIDk5ODQsIDU5MTM2LAogICAgNTg4OCwgNTUwNDAsIDQzMDA4LCAyNjYyNCwgMzg5MTIsIDIyNTI4LCA0MTk4NCwgMjU2MDAsIDM3ODg4LCAyMTUwNCwgNDM3NzYsCiAgIDI3MzkyLCAzOTY4MCwgMjMyOTYsIDQyNzUyLCAyNjM2OCwgMzg2NTYsIDIyMjcyLCAgIDUxMiwgNDk2NjQsIDEyODAwLCA2MTk1MiwKICAgIDM1ODQsIDUyNzM2LCAxNTg3MiwgNjUwMjQsICAgMjU2LCA0OTQwOCwgMTI1NDQsIDYxNjk2LCAgMzMyOCwgNTI0ODAsIDE1NjE2LAogICA2NDc2OCwgMzMyODAsIDE2ODk2LCA0NTU2OCwgMjkxODQsIDM2MzUyLCAxOTk2OCwgNDg2NDAsIDMyMjU2LCAzMzAyNCwgMTY2NDAsCiAgIDQ1MzEyLCAyODkyOCwgMzYwOTYsIDE5NzEyLCA0ODM4NCwgMzIwMDAsICA4NzA0LCA1Nzg1NiwgIDQ2MDgsIDUzNzYwLCAxMTc3NiwKICAgNjA5MjgsICA3NjgwLCA1NjgzMiwgIDg0NDgsIDU3NjAwLCAgNDM1MiwgNTM1MDQsIDExNTIwLCA2MDY3MiwgIDc0MjQsIDU2NTc2LAogICA0MTQ3MiwgMjUwODgsIDM3Mzc2LCAyMDk5MiwgNDQ1NDQsIDI4MTYwLCA0MDQ0OCwgMjQwNjQsIDQxMjE2LCAyNDgzMiwgMzcxMjAsCiAgIDIwNzM2LCA0NDI4OCwgMjc5MDQsIDQwMTkyLCAyMzgwOCwgIDI1NjAsIDUxNzEyLCAxNDg0OCwgNjQwMDAsICAxNTM2LCA1MDY4OCwKICAgMTM4MjQsIDYyOTc2LCAgMjMwNCwgNTE0NTYsIDE0NTkyLCA2Mzc0NCwgIDEyODAsIDUwNDMyLCAxMzU2OCwgNjI3MjAsIDM1MzI4LAogICAxODk0NCwgNDc2MTYsIDMxMjMyLCAzNDMwNCwgMTc5MjAsIDQ2NTkyLCAzMDIwOCwgMzUwNzIsIDE4Njg4LCA0NzM2MCwgMzA5NzYsCiAgIDM0MDQ4LCAxNzY2NCwgNDYzMzYsIDI5OTUyLCAxMDc1MiwgNTk5MDQsICA2NjU2LCA1NTgwOCwgIDk3MjgsIDU4ODgwLCAgNTYzMiwKICAgNTQ3ODQsIDEwNDk2LCA1OTY0OCwgIDY0MDAsIDU1NTUyLCAgOTQ3MiwgNTg2MjQsICA1Mzc2LCA1NDUyOCwgNDM1MjAsIDI3MTM2LAogICAzOTQyNCwgMjMwNDAsIDQyNDk2LCAyNjExMiwgMzg0MDAsIDIyMDE2LCA0MzI2NCwgMjY4ODAsIDM5MTY4LCAyMjc4NCwgNDIyNDAsCiAgIDI1ODU2LCAzODE0NCwgMjE3NjAKfTsKCi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKc2FsX3VMb25nIG5WQ0xMdXRbIDI1NiBdID0KewogICAgICAgICAwLCAgMTI4NiwgIDI1NzIsICAzODU4LCAgNTE0NCwgIDY0MzAsICA3NzE2LCAgOTAwMiwKICAgICAxMDI4OCwgMTE1NzQsIDEyODYwLCAxNDE0NiwgMTU0MzIsIDE2NzE4LCAxODAwNCwgMTkyOTAsCiAgICAgMjA1NzYsIDIxODYyLCAyMzE0OCwgMjQ0MzQsIDI1NzIwLCAyNzAwNiwgMjgyOTIsIDI5NTc4LAogICAgIDMwODY0LCAzMjE1MCwgMzM0MzYsIDM0NzIyLCAzNjAwOCwgMzcyOTQsIDM4NTgwLCAzOTg2NiwKICAgICA0MTE1MiwgNDI0MzgsIDQzNzI0LCA0NTAxMCwgNDYyOTYsIDQ3NTgyLCA0ODg2OCwgNTAxNTQsCiAgICAgNTE0NDAsIDUyNzI2LCA1NDAxMiwgNTUyOTgsIDU2NTg0LCA1Nzg3MCwgNTkxNTYsIDYwNDQyLAogICAgIDYxNzI4LCA2MzAxNCwgNjQzMDAsIDY1NTg2LCA2Njg3MiwgNjgxNTgsIDY5NDQ0LCA3MDczMCwKICAgICA3MjAxNiwgNzMzMDIsIDc0NTg4LCA3NTg3NCwgNzcxNjAsIDc4NDQ2LCA3OTczMiwgODEwMTgsCiAgICAgODIzMDQsIDgzNTkwLCA4NDg3NiwgODYxNjIsIDg3NDQ4LCA4ODczNCwgOTAwMjAsIDkxMzA2LAogICAgIDkyNTkyLCA5Mzg3OCwgOTUxNjQsIDk2NDUwLCA5NzczNiwgOTkwMjIsMTAwMzA4LDEwMTU5NCwKICAgIDEwMjg4MCwxMDQxNjYsMTA1NDUyLDEwNjczOCwxMDgwMjQsMTA5MzEwLDExMDU5NiwxMTE4ODIsCiAgICAxMTMxNjgsMTE0NDU0LDExNTc0MCwxMTcwMjYsMTE4MzEyLDExOTU5OCwxMjA4ODQsMTIyMTcwLAogICAgMTIzNDU2LDEyNDc0MiwxMjYwMjgsMTI3MzE0LDEyODYwMCwxMjk4ODYsMTMxMTcyLDEzMjQ1OCwKICAgIDEzMzc0NCwxMzUwMzAsMTM2MzE2LDEzNzYwMiwxMzg4ODgsMTQwMTc0LDE0MTQ2MCwxNDI3NDYsCiAgICAxNDQwMzIsMTQ1MzE4LDE0NjYwNCwxNDc4OTAsMTQ5MTc2LDE1MDQ2MiwxNTE3NDgsMTUzMDM0LAogICAgMTU0MzIwLDE1NTYwNiwxNTY4OTIsMTU4MTc4LDE1OTQ2NCwxNjA3NTAsMTYyMDM2LDE2MzMyMiwKICAgIDE2NDYwOCwxNjU4OTQsMTY3MTgwLDE2ODQ2NiwxNjk3NTIsMTcxMDM4LDE3MjMyNCwxNzM2MTAsCiAgICAxNzQ4OTYsMTc2MTgyLDE3NzQ2OCwxNzg3NTQsMTgwMDQwLDE4MTMyNiwxODI2MTIsMTgzODk4LAogICAgMTg1MTg0LDE4NjQ3MCwxODc3NTYsMTg5MDQyLDE5MDMyOCwxOTE2MTQsMTkyOTAwLDE5NDE4NiwKICAgIDE5NTQ3MiwxOTY3NTgsMTk4MDQ0LDE5OTMzMCwyMDA2MTYsMjAxOTAyLDIwMzE4OCwyMDQ0NzQsCiAgICAyMDU3NjAsMjA3MDQ2LDIwODMzMiwyMDk2MTgsMjEwOTA0LDIxMjE5MCwyMTM0NzYsMjE0NzYyLAogICAgMjE2MDQ4LDIxNzMzNCwyMTg2MjAsMjE5OTA2LDIyMTE5MiwyMjI0NzgsMjIzNzY0LDIyNTA1MCwKICAgIDIyNjMzNiwyMjc2MjIsMjI4OTA4LDIzMDE5NCwyMzE0ODAsMjMyNzY2LDIzNDA1MiwyMzUzMzgsCiAgICAyMzY2MjQsMjM3OTEwLDIzOTE5NiwyNDA0ODIsMjQxNzY4LDI0MzA1NCwyNDQzNDAsMjQ1NjI2LAogICAgMjQ2OTEyLDI0ODE5OCwyNDk0ODQsMjUwNzcwLDI1MjA1NiwyNTMzNDIsMjU0NjI4LDI1NTkxNCwKICAgIDI1NzIwMCwyNTg0ODYsMjU5NzcyLDI2MTA1OCwyNjIzNDQsMjYzNjMwLDI2NDkxNiwyNjYyMDIsCiAgICAyNjc0ODgsMjY4Nzc0LDI3MDA2MCwyNzEzNDYsMjcyNjMyLDI3MzkxOCwyNzUyMDQsMjc2NDkwLAogICAgMjc3Nzc2LDI3OTA2MiwyODAzNDgsMjgxNjM0LDI4MjkyMCwyODQyMDYsMjg1NDkyLDI4Njc3OCwKICAgIDI4ODA2NCwyODkzNTAsMjkwNjM2LDI5MTkyMiwyOTMyMDgsMjk0NDk0LDI5NTc4MCwyOTcwNjYsCiAgICAyOTgzNTIsMjk5NjM4LDMwMDkyNCwzMDIyMTAsMzAzNDk2LDMwNDc4MiwzMDYwNjgsMzA3MzU0LAogICAgMzA4NjQwLDMwOTkyNiwzMTEyMTIsMzEyNDk4LDMxMzc4NCwzMTUwNzAsMzE2MzU2LDMxNzY0MiwKICAgIDMxODkyOCwzMjAyMTQsMzIxNTAwLDMyMjc4NiwzMjQwNzIsMzI1MzU4LDMyNjY0NCwzMjc5MzAKfTsKCi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKbG9uZyBGbG95ZE1hcFsyNTZdID0KewogICAgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwKICAgIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDEsIDEsIDEsIDEsIDEsIDEsCiAgICAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLAogICAgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwKICAgIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDIsIDIsIDIsCiAgICAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLAogICAgMiwgMiwgMiwgMiwgMiwgMiwgMiwgMiwgMiwgMiwgMiwgMiwgMiwgMiwgMiwgMiwKICAgIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsCiAgICAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLAogICAgMywgMywgMywgMywgMywgMywgMywgMywgMywgMywgMywgMywgMywgMywgMywgMywKICAgIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsCiAgICAzLCAzLCAzLCA0LCA0LCA0LCA0LCA0LCA0LCA0LCA0LCA0LCA0LCA0LCA0LCA0LAogICAgNCwgNCwgNCwgNCwgNCwgNCwgNCwgNCwgNCwgNCwgNCwgNCwgNCwgNCwgNCwgNCwKICAgIDQsIDQsIDQsIDQsIDQsIDQsIDQsIDQsIDQsIDQsIDQsIDQsIDQsIDQsIDQsIDQsCiAgICA0LCA0LCA0LCA0LCA0LCA0LCA1LCA1LCA1LCA1LCA1LCA1LCA1LCA1LCA1LCA1LAogICAgNSwgNSwgNSwgNSwgNSwgNSwgNSwgNSwgNSwgNSwgNSwgNSwgNSwgNSwgNSwgNQp9OwoKLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgpsb25nIEZsb3lkRXJyb3IxWzYxXSA9CnsKICAgIC03NjgwLCAtNzQyNCwgLTcxNjgsIC02OTEyLCAtNjY1NiwgLTY0MDAsIC02MTQ0LAogICAgLTU4ODgsIC01NjMyLCAtNTM3NiwgLTUxMjAsIC00ODY0LCAtNDYwOCwgLTQzNTIsCiAgICAtNDA5NiwgLTM4NDAsIC0zNTg0LCAtMzMyOCwgLTMwNzIsIC0yODE2LCAtMjU2MCwKICAgIC0yMzA0LCAtMjA0OCwgLTE3OTIsIC0xNTM2LCAtMTI4MCwgLTEwMjQsIC03NjgsCiAgICAtNTEyLCAtMjU2LCAwLCAyNTYsIDUxMiwgNzY4LCAxMDI0LCAxMjgwLCAxNTM2LAogICAgMTc5MiwgMjA0OCwgMjMwNCwgMjU2MCwgMjgxNiwgMzA3MiwgMzMyOCwgMzU4NCwKICAgIDM4NDAsIDQwOTYsIDQzNTIsIDQ2MDgsIDQ4NjQsIDUxMjAsIDUzNzYsIDU2MzIsCiAgICA1ODg4LCA2MTQ0LCA2NDAwLCA2NjU2LCA2OTEyLCA3MTY4LCA3NDI0LCA3NjgwCn07CgovLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCmxvbmcgRmxveWRFcnJvcjNbNjFdID0KewogICAgLTIzMDQwLCAtMjIyNzIsIC0yMTUwNCwgLTIwNzM2LCAtMTk5NjgsIC0xOTIwMCwKICAgIC0xODQzMiwgLTE3NjY0LCAtMTY4OTYsIC0xNjEyOCwgLTE1MzYwLCAtMTQ1OTIsCiAgICAtMTM4MjQsIC0xMzA1NiwgLTEyMjg4LCAtMTE1MjAsIC0xMDc1MiwgLTk5ODQsCiAgICAtOTIxNiwgLTg0NDgsIC03NjgwLCAtNjkxMiwgLTYxNDQsIC01Mzc2LCAtNDYwOCwKICAgIC0zODQwLCAtMzA3MiwgLTIzMDQsIC0xNTM2LCAtNzY4LCAwLCA3NjgsIDE1MzYsCiAgICAyMzA0LCAzMDcyLCAzODQwLCA0NjA4LCA1Mzc2LCA2MTQ0LCA2OTEyLCA3NjgwLAogICAgODQ0OCwgOTIxNiwgOTk4NCwgMTA3NTIsIDExNTIwLCAxMjI4OCwgMTMwNTYsCiAgICAxMzgyNCwgMTQ1OTIsIDE1MzYwLCAxNjEyOCwgMTY4OTYsIDE3NjY0LCAxODQzMiwKICAgIDE5MjAwLCAxOTk2OCwgMjA3MzYsIDIxNTA0LCAyMjI3MiwgMjMwNDAKfTsKCi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKbG9uZyBGbG95ZEVycm9yNVs2MV0gPQp7CiAgICAtMzg0MDAsIC0zNzEyMCwgLTM1ODQwLCAtMzQ1NjAsIC0zMzI4MCwgLTMyMDAwLAogICAgLTMwNzIwLCAtMjk0NDAsIC0yODE2MCwgLTI2ODgwLCAtMjU2MDAsIC0yNDMyMCwKICAgIC0yMzA0MCwgLTIxNzYwLCAtMjA0ODAsIC0xOTIwMCwgLTE3OTIwLCAtMTY2NDAsCiAgICAtMTUzNjAsIC0xNDA4MCwgLTEyODAwLCAtMTE1MjAsIC0xMDI0MCwgLTg5NjAsCiAgICAtNzY4MCwgLTY0MDAsIC01MTIwLCAtMzg0MCwgLTI1NjAsIC0xMjgwLCAgIDAsCiAgICAxMjgwLCAyNTYwLCAzODQwLCA1MTIwLCA2NDAwLCA3NjgwLCA4OTYwLCAxMDI0MCwKICAgIDExNTIwLCAxMjgwMCwgMTQwODAsIDE1MzYwLCAxNjY0MCwgMTc5MjAsIDE5MjAwLAogICAgMjA0ODAsIDIxNzYwLCAyMzA0MCwgMjQzMjAsIDI1NjAwLCAyNjg4MCwgMjgxNjAsCiAgICAyOTQ0MCwgMzA3MjAsIDMyMDAwLCAzMzI4MCwgMzQ1NjAsIDM1ODQwLCAzNzEyMCwKICAgIDM4NDAwCn07CgovLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCmxvbmcgRmxveWRFcnJvcjdbNjFdID0KewogICAgLTUzNzYwLCAtNTE5NjgsIC01MDE3NiwgLTQ4Mzg0LCAtNDY1OTIsIC00NDgwMCwKICAgIC00MzAwOCwgLTQxMjE2LCAtMzk0MjQsIC0zNzYzMiwgLTM1ODQwLCAtMzQwNDgsCiAgICAtMzIyNTYsIC0zMDQ2NCwgLTI4NjcyLCAtMjY4ODAsIC0yNTA4OCwgLTIzMjk2LAogICAgLTIxNTA0LCAtMTk3MTIsIC0xNzkyMCwgLTE2MTI4LCAtMTQzMzYsIC0xMjU0NCwKICAgIC0xMDc1MiwgLTg5NjAsIC03MTY4LCAtNTM3NiwgLTM1ODQsIC0xNzkyLCAgMCwKICAgIDE3OTIsIDM1ODQsIDUzNzYsIDcxNjgsIDg5NjAsIDEwNzUyLCAxMjU0NCwgMTQzMzYsCiAgICAxNjEyOCwgMTc5MjAsIDE5NzEyLCAyMTUwNCwgMjMyOTYsIDI1MDg4LCAyNjg4MCwKICAgIDI4NjcyLCAzMDQ2NCwgMzIyNTYsIDM0MDQ4LCAzNTg0MCwgMzc2MzIsIDM5NDI0LAogICAgNDEyMTYsIDQzMDA4LCA0NDgwMCwgNDY1OTIsIDQ4Mzg0LCA1MDE3NiwgNTE5NjgsCiAgICA1Mzc2MAp9OwoKLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgpsb25nIEZsb3lkSW5kZXhNYXBbNl0gPQp7CiAgICAtMzAsICAyMSwgNzIsIDEyMywgMTc0LCAyMjUKfTsKCi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vIC0gSW1wbENyZWF0ZURpdGhlck1hdHJpeCAtCi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgp2b2lkIEltcGxDcmVhdGVEaXRoZXJNYXRyaXgoIHNhbF91SW50OCAoKnBEaXRoZXJNYXRyaXgpWzE2XVsxNl0gKQp7Cglkb3VibGUJCQlmVmFsID0gMy4xMjU7Cgljb25zdCBkb3VibGUJZlZhbDE2ID0gZlZhbCAvIDE2LjsKCWxvbmcJCQlpLCBqLCBrLCBsOwoJc2FsX3VJbnQxNgkJCXBNdHhbIDE2IF1bIDE2IF07CglzYWxfdUludDE2CQkJbk1heCA9IDA7CglzdGF0aWMgc2FsX3VJbnQ4IAlwTWFnaWNbNF1bNF0gPSB7IHsgMCwgMTQsICAzLCAxMywgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsxMSwgIDUsICA4LCAgNiwgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsxMiwgIDIsIDE1LCAgMSwgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHs3LCAgIDksICA0LCAxMCB9IH07CgoJLy8gTWFnaWNTcXVhcmUgYXVmYmF1ZW4KCWZvciAoIGkgPSAwOyBpIDwgNDsgaSsrICkKCSAgIGZvciAoIGogPSAwOyBqIDwgNDsgaisrICkKCQkgICBmb3IgKCBrID0gMDsgayA8IDQ7IGsrKyApCgkJCQlmb3IgKCBsID0gMDsgbCA8IDQ7IGwrKyApCgkJCQkJbk1heCA9IE1heCAoIHBNdHhbIChrPDwyKSArIGldWyhsPDwyICkgKyBqXSA9CgkJCQkJKHNhbF91SW50MTYpICggMC41ICsgcE1hZ2ljW2ldW2pdKmZWYWwgKyBwTWFnaWNba11bbF0qZlZhbDE2ICksIG5NYXggKTsKCgkvLyBhdWYgSW50ZXJ2YWxsIFswOzI1NF0gc2thbGllcmVuCglmb3IgKCBpID0gMCwgZlZhbCA9IDI1NC4gLyBuTWF4OyBpIDwgMTY7IGkrKyApCgkJZm9yKCBqID0gMDsgaiA8IDE2OyBqKysgKQoJCQkoKnBEaXRoZXJNYXRyaXgpW2ldW2pdID0gKHNhbF91SW50OCkgKCBmVmFsICogcE10eFtpXVtqXSApOwp9CgovLyAtLS0tLS0tLS0tCi8vIC0gQml0bWFwIC0KLy8gLS0tLS0tLS0tLQoKc2FsX0Jvb2wgQml0bWFwOjpDb252ZXJ0KCBCbXBDb252ZXJzaW9uIGVDb252ZXJzaW9uICkKewoJY29uc3Qgc2FsX3VJbnQxNgluQml0Q291bnQgPSBHZXRCaXRDb3VudCgpOwoJc2FsX0Jvb2wJCQliUmV0ID0gc2FsX0ZhbHNlOwoKCXN3aXRjaCggZUNvbnZlcnNpb24gKQoJewoJCWNhc2UoIEJNUF9DT05WRVJTSU9OXzFCSVRfVEhSRVNIT0xEICk6CgkJCWJSZXQgPSBJbXBsTWFrZU1vbm8oIDEyOCApOwoJCWJyZWFrOwoKCQljYXNlKCBCTVBfQ09OVkVSU0lPTl8xQklUX01BVFJJWCApOgoJCQliUmV0ID0gSW1wbE1ha2VNb25vRGl0aGVyKCk7CgkJYnJlYWs7CgoJCWNhc2UoIEJNUF9DT05WRVJTSU9OXzRCSVRfR1JFWVMgKToKCQkJYlJldCA9IEltcGxNYWtlR3JleXNjYWxlcyggMTYgKTsKCQlicmVhazsKCgkJY2FzZSggQk1QX0NPTlZFUlNJT05fNEJJVF9DT0xPUlMgKToKCQl7CgkJCWlmKCBuQml0Q291bnQgPCA0ICkKCQkJCWJSZXQgPSBJbXBsQ29udmVydFVwKCA0LCBOVUxMICk7CgkJCWVsc2UgaWYoIG5CaXRDb3VudCA+IDQgKQoJCQkJYlJldCA9IEltcGxDb252ZXJ0RG93biggNCwgTlVMTCApOwoJCQllbHNlCgkJCQliUmV0ID0gc2FsX1RydWU7CgkJfQoJCWJyZWFrOwoKCQljYXNlKCBCTVBfQ09OVkVSU0lPTl80QklUX1RSQU5TICk6CgkJewoJCQlDb2xvciBhVHJhbnMoIEJNUF9DT0xfVFJBTlMgKTsKCgkJCWlmKCBuQml0Q291bnQgPCA0ICkKCQkJCWJSZXQgPSBJbXBsQ29udmVydFVwKCA0LCAmYVRyYW5zICk7CgkJCWVsc2UKCQkJCWJSZXQgPSBJbXBsQ29udmVydERvd24oIDQsICZhVHJhbnMgKTsKCQl9CgkJYnJlYWs7CgoJCWNhc2UoIEJNUF9DT05WRVJTSU9OXzhCSVRfR1JFWVMgKToKCQkJYlJldCA9IEltcGxNYWtlR3JleXNjYWxlcyggMjU2ICk7CgkJYnJlYWs7CgoJCWNhc2UoIEJNUF9DT05WRVJTSU9OXzhCSVRfQ09MT1JTICk6CgkJewoJCQlpZiggbkJpdENvdW50IDwgOCApCgkJCQliUmV0ID0gSW1wbENvbnZlcnRVcCggOCApOwoJCQllbHNlIGlmKCBuQml0Q291bnQgPiA4ICkKCQkJCWJSZXQgPSBJbXBsQ29udmVydERvd24oIDggKTsKCQkJZWxzZQoJCQkJYlJldCA9IHNhbF9UcnVlOwoJCX0KCQlicmVhazsKCgkJY2FzZSggQk1QX0NPTlZFUlNJT05fOEJJVF9UUkFOUyApOgoJCXsKCQkJQ29sb3IgYVRyYW5zKCBCTVBfQ09MX1RSQU5TICk7CgoJCQlpZiggbkJpdENvdW50IDwgOCApCgkJCQliUmV0ID0gSW1wbENvbnZlcnRVcCggOCwgJmFUcmFucyApOwoJCQllbHNlCgkJCQliUmV0ID0gSW1wbENvbnZlcnREb3duKCA4LCAmYVRyYW5zICk7CgkJfQoJCWJyZWFrOwoKCQljYXNlKCBCTVBfQ09OVkVSU0lPTl8yNEJJVCApOgoJCXsKCQkJaWYoIG5CaXRDb3VudCA8IDI0ICkKCQkJCWJSZXQgPSBJbXBsQ29udmVydFVwKCAyNCwgTlVMTCApOwoJCQllbHNlCgkJCQliUmV0ID0gc2FsX1RydWU7CgkJfQoJCWJyZWFrOwoKCQljYXNlKCBCTVBfQ09OVkVSU0lPTl9HSE9TVEVEICk6CgkJCWJSZXQgPSBJbXBsQ29udmVydEdob3N0ZWQoKTsKCQlicmVhazsKCgkJZGVmYXVsdDoKCQkJREJHX0VSUk9SKCAiQml0bWFwOjpDb252ZXJ0KCk6IFVuc3VwcG9ydGVkIGNvbnZlcnNpb24iICk7CgkJYnJlYWs7Cgl9CgoJcmV0dXJuIGJSZXQ7Cn0KCi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKc2FsX0Jvb2wgQml0bWFwOjpJbXBsTWFrZU1vbm8oIHNhbF91SW50OCBjVGhyZXNob2xkICkKewoJQml0bWFwUmVhZEFjY2VzcyoJcFJlYWRBY2MgPSBBY3F1aXJlUmVhZEFjY2VzcygpOwoJc2FsX0Jvb2wJCQkJYlJldCA9IHNhbF9GYWxzZTsKCglpZiggcFJlYWRBY2MgKQoJewoJCUJpdG1hcAkJCQlhTmV3Qm1wKCBHZXRTaXplUGl4ZWwoKSwgMSApOwoJCUJpdG1hcFdyaXRlQWNjZXNzKglwV3JpdGVBY2MgPSBhTmV3Qm1wLkFjcXVpcmVXcml0ZUFjY2VzcygpOwoKCQlpZiggcFdyaXRlQWNjICkKCQl7CgkJCWNvbnN0IEJpdG1hcENvbG9yCWFCbGFjayggcFdyaXRlQWNjLT5HZXRCZXN0TWF0Y2hpbmdDb2xvciggQ29sb3IoIENPTF9CTEFDSyApICkgKTsKCQkJY29uc3QgQml0bWFwQ29sb3IJYVdoaXRlKCBwV3JpdGVBY2MtPkdldEJlc3RNYXRjaGluZ0NvbG9yKCBDb2xvciggQ09MX1dISVRFICkgKSApOwoJCQljb25zdCBsb25nCQkJbldpZHRoID0gcFdyaXRlQWNjLT5XaWR0aCgpOwoJCQljb25zdCBsb25nCQkJbkhlaWdodCA9IHBXcml0ZUFjYy0+SGVpZ2h0KCk7CgoJCQlpZiggcFJlYWRBY2MtPkhhc1BhbGV0dGUoKSApCgkJCXsKCQkJCWZvciggbG9uZyBuWSA9IDBMOyBuWSA8IG5IZWlnaHQ7IG5ZKysgKQoJCQkJewoJCQkJCWZvciggbG9uZyBuWCA9IDBMOyBuWCA8IG5XaWR0aDsgblgrKyApCgkJCQkJewoJCQkJCQljb25zdCBzYWxfdUludDggY0luZGV4ID0gcFJlYWRBY2MtPkdldFBpeGVsSW5kZXgoIG5ZLCBuWCApOwoJCQkJCQlpZiggcFJlYWRBY2MtPkdldFBhbGV0dGVDb2xvciggY0luZGV4ICkuR2V0THVtaW5hbmNlKCkgPj0KCQkJCQkJCWNUaHJlc2hvbGQgKQoJCQkJCQl7CgkJCQkJCQlwV3JpdGVBY2MtPlNldFBpeGVsKCBuWSwgblgsIGFXaGl0ZSApOwoJCQkJCQl9CgkJCQkJCWVsc2UKCQkJCQkJCXBXcml0ZUFjYy0+U2V0UGl4ZWwoIG5ZLCBuWCwgYUJsYWNrICk7CgkJCQkJfQoJCQkJfQoJCQl9CgkJCWVsc2UKCQkJewoJCQkJZm9yKCBsb25nIG5ZID0gMEw7IG5ZIDwgbkhlaWdodDsgblkrKyApCgkJCQl7CgkJCQkJZm9yKCBsb25nIG5YID0gMEw7IG5YIDwgbldpZHRoOyBuWCsrICkKCQkJCQl7CgkJCQkJCWlmKCBwUmVhZEFjYy0+R2V0UGl4ZWwoIG5ZLCBuWCApLkdldEx1bWluYW5jZSgpID49CgkJCQkJCQljVGhyZXNob2xkICkKCQkJCQkJewoJCQkJCQkJcFdyaXRlQWNjLT5TZXRQaXhlbCggblksIG5YLCBhV2hpdGUgKTsKCQkJCQkJfQoJCQkJCQllbHNlCgkJCQkJCQlwV3JpdGVBY2MtPlNldFBpeGVsKCBuWSwgblgsIGFCbGFjayApOwoJCQkJCX0KCQkJCX0KCQkJfQoKCQkJYU5ld0JtcC5SZWxlYXNlQWNjZXNzKCBwV3JpdGVBY2MgKTsKCQkJYlJldCA9IHNhbF9UcnVlOwoJCX0KCgkJUmVsZWFzZUFjY2VzcyggcFJlYWRBY2MgKTsKCgkJaWYoIGJSZXQgKQoJCXsKCQkJY29uc3QgTWFwTW9kZQlhTWFwKCBtYVByZWZNYXBNb2RlICk7CgkJCWNvbnN0IFNpemUJCWFTaXplKCBtYVByZWZTaXplICk7CgoJCQkqdGhpcyA9IGFOZXdCbXA7CgoJCQltYVByZWZNYXBNb2RlID0gYU1hcDsKCQkJbWFQcmVmU2l6ZSA9IGFTaXplOwoJCX0KCX0KCglyZXR1cm4gYlJldDsKfQoKLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgpzYWxfQm9vbCBCaXRtYXA6OkltcGxNYWtlTW9ub0RpdGhlcigpCnsKCUJpdG1hcFJlYWRBY2Nlc3MqCXBSZWFkQWNjID0gQWNxdWlyZVJlYWRBY2Nlc3MoKTsKCXNhbF9Cb29sCQkJCWJSZXQgPSBzYWxfRmFsc2U7CgoJaWYoIHBSZWFkQWNjICkKCXsKCQlCaXRtYXAJCQkJYU5ld0JtcCggR2V0U2l6ZVBpeGVsKCksIDEgKTsKCQlCaXRtYXBXcml0ZUFjY2VzcyoJcFdyaXRlQWNjID0gYU5ld0JtcC5BY3F1aXJlV3JpdGVBY2Nlc3MoKTsKCgkJaWYoIHBXcml0ZUFjYyApCgkJewoJCQljb25zdCBCaXRtYXBDb2xvcglhQmxhY2soIHBXcml0ZUFjYy0+R2V0QmVzdE1hdGNoaW5nQ29sb3IoIENvbG9yKCBDT0xfQkxBQ0sgKSApICk7CgkJCWNvbnN0IEJpdG1hcENvbG9yCWFXaGl0ZSggcFdyaXRlQWNjLT5HZXRCZXN0TWF0Y2hpbmdDb2xvciggQ29sb3IoIENPTF9XSElURSApICkgKTsKCQkJY29uc3QgbG9uZwkJCW5XaWR0aCA9IHBXcml0ZUFjYy0+V2lkdGgoKTsKCQkJY29uc3QgbG9uZwkJCW5IZWlnaHQgPSBwV3JpdGVBY2MtPkhlaWdodCgpOwoJCQlzYWxfdUludDgJCQkJcERpdGhlck1hdHJpeFsgMTYgXVsgMTYgXTsKCgkJCUltcGxDcmVhdGVEaXRoZXJNYXRyaXgoICZwRGl0aGVyTWF0cml4ICk7CgoJCQlpZiggcFJlYWRBY2MtPkhhc1BhbGV0dGUoKSApCgkJCXsKCQkJCWZvciggbG9uZyBuWSA9IDBMOyBuWSA8IG5IZWlnaHQ7IG5ZKysgKQoJCQkJewoJCQkJCWZvciggbG9uZyBuWCA9IDBMLCBuTW9kWSA9IG5ZICUgMTY7IG5YIDwgbldpZHRoOyBuWCsrICkKCQkJCQl7CgkJCQkJCWNvbnN0IHNhbF91SW50OCBjSW5kZXggPSBwUmVhZEFjYy0+R2V0UGl4ZWxJbmRleCggblksIG5YICk7CgkJCQkJCWlmKCBwUmVhZEFjYy0+R2V0UGFsZXR0ZUNvbG9yKCBjSW5kZXggKS5HZXRMdW1pbmFuY2UoKSA+CgkJCQkJCQlwRGl0aGVyTWF0cml4WyBuTW9kWSBdWyBuWCAlIDE2IF0gKQoJCQkJCQl7CgkJCQkJCQlwV3JpdGVBY2MtPlNldFBpeGVsKCBuWSwgblgsIGFXaGl0ZSApOwoJCQkJCQl9CgkJCQkJCWVsc2UKCQkJCQkJCXBXcml0ZUFjYy0+U2V0UGl4ZWwoIG5ZLCBuWCwgYUJsYWNrICk7CgkJCQkJfQoJCQkJfQoJCQl9CgkJCWVsc2UKCQkJewoJCQkJZm9yKCBsb25nIG5ZID0gMEw7IG5ZIDwgbkhlaWdodDsgblkrKyApCgkJCQl7CgkJCQkJZm9yKCBsb25nIG5YID0gMEwsIG5Nb2RZID0gblkgJSAxNjsgblggPCBuV2lkdGg7IG5YKysgKQoJCQkJCXsKCQkJCQkJaWYoIHBSZWFkQWNjLT5HZXRQaXhlbCggblksIG5YICkuR2V0THVtaW5hbmNlKCkgPgoJCQkJCQkJcERpdGhlck1hdHJpeFsgbk1vZFkgXVsgblggJSAxNiBdICApCgkJCQkJCXsKCQkJCQkJCXBXcml0ZUFjYy0+U2V0UGl4ZWwoIG5ZLCBuWCwgYVdoaXRlICk7CgkJCQkJCX0KCQkJCQkJZWxzZQoJCQkJCQkJcFdyaXRlQWNjLT5TZXRQaXhlbCggblksIG5YLCBhQmxhY2sgKTsKCQkJCQl9CgkJCQl9CgkJCX0KCgkJCWFOZXdCbXAuUmVsZWFzZUFjY2VzcyggcFdyaXRlQWNjICk7CgkJCWJSZXQgPSBzYWxfVHJ1ZTsKCQl9CgoJCVJlbGVhc2VBY2Nlc3MoIHBSZWFkQWNjICk7CgoJCWlmKCBiUmV0ICkKCQl7CgkJCWNvbnN0IE1hcE1vZGUJYU1hcCggbWFQcmVmTWFwTW9kZSApOwoJCQljb25zdCBTaXplCQlhU2l6ZSggbWFQcmVmU2l6ZSApOwoKCQkJKnRoaXMgPSBhTmV3Qm1wOwoKCQkJbWFQcmVmTWFwTW9kZSA9IGFNYXA7CgkJCW1hUHJlZlNpemUgPSBhU2l6ZTsKCQl9Cgl9CgoJcmV0dXJuIGJSZXQ7Cn0KCi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKc2FsX0Jvb2wgQml0bWFwOjpJbXBsTWFrZUdyZXlzY2FsZXMoIHNhbF91SW50MTYgbkdyZXlzICkKewoJREJHX0FTU0VSVCggbkdyZXlzID09IDE2IHx8IG5HcmV5cyA9PSAyNTYsICJPbmx5IDE2IG9yIDI1NiBncmV5c2NhbGVzIGFyZSBzdXBwb3J0ZWQhIiApOwoKCUJpdG1hcFJlYWRBY2Nlc3MqCXBSZWFkQWNjID0gQWNxdWlyZVJlYWRBY2Nlc3MoKTsKCXNhbF9Cb29sCQkJCWJSZXQgPSBzYWxfRmFsc2U7CgoJaWYoIHBSZWFkQWNjICkKCXsKCQljb25zdCBCaXRtYXBQYWxldHRlJglyUGFsID0gR2V0R3JleVBhbGV0dGUoIG5HcmV5cyApOwoJCXNhbF91TG9uZyAJCQkJCW5TaGlmdCA9ICggKCBuR3JleXMgPT0gMTYgKSA/IDRVTCA6IDBVTCApOwoJCXNhbF9Cb29sCQkJCQliUGFsRGlmZmVycyA9ICFwUmVhZEFjYy0+SGFzUGFsZXR0ZSgpIHx8ICggclBhbC5HZXRFbnRyeUNvdW50KCkgIT0gcFJlYWRBY2MtPkdldFBhbGV0dGVFbnRyeUNvdW50KCkgKTsKCgkJaWYoICFiUGFsRGlmZmVycyApCgkJCWJQYWxEaWZmZXJzID0gKCAoQml0bWFwUGFsZXR0ZSYpIHJQYWwgIT0gcFJlYWRBY2MtPkdldFBhbGV0dGUoKSApOwoKCQlpZiggYlBhbERpZmZlcnMgKQoJCXsKCQkJQml0bWFwCQkJCWFOZXdCbXAoIEdldFNpemVQaXhlbCgpLCAoIG5HcmV5cyA9PSAxNiApID8gNCA6IDgsICZyUGFsICk7CgkJCUJpdG1hcFdyaXRlQWNjZXNzKglwV3JpdGVBY2MgPSBhTmV3Qm1wLkFjcXVpcmVXcml0ZUFjY2VzcygpOwoKCQkJaWYoIHBXcml0ZUFjYyApCgkJCXsKCQkJCWNvbnN0IGxvbmcJbldpZHRoID0gcFdyaXRlQWNjLT5XaWR0aCgpOwoJCQkJY29uc3QgbG9uZwluSGVpZ2h0ID0gcFdyaXRlQWNjLT5IZWlnaHQoKTsKCgkJCQlpZiggcFJlYWRBY2MtPkhhc1BhbGV0dGUoKSApCgkJCQl7CgkJCQkJZm9yKCBsb25nIG5ZID0gMEw7IG5ZIDwgbkhlaWdodDsgblkrKyApCgkJCQkJewoJCQkJCQlmb3IoIGxvbmcgblggPSAwTDsgblggPCBuV2lkdGg7IG5YKysgKQoJCQkJCQl7CgkJCQkJCQljb25zdCBzYWxfdUludDggY0luZGV4ID0gcFJlYWRBY2MtPkdldFBpeGVsSW5kZXgoIG5ZLCBuWCApOwoJCQkJCQkJcFdyaXRlQWNjLT5TZXRQaXhlbEluZGV4KCBuWSwgblgsCgkJCQkJCQkJKHBSZWFkQWNjLT5HZXRQYWxldHRlQ29sb3IoIGNJbmRleCApLkdldEx1bWluYW5jZSgpID4+IG5TaGlmdCkgKTsKCQkJCQkJfQoJCQkJCX0KCQkJCX0KCQkJCWVsc2UgaWYoIHBSZWFkQWNjLT5HZXRTY2FubGluZUZvcm1hdCgpID09IEJNUF9GT1JNQVRfMjRCSVRfVENfQkdSICYmCgkJCQkJCSBwV3JpdGVBY2MtPkdldFNjYW5saW5lRm9ybWF0KCkgPT0gQk1QX0ZPUk1BVF84QklUX1BBTCApCgkJCQl7CgkJCQkJblNoaWZ0ICs9IDg7CgoJCQkJCWZvciggbG9uZyBuWSA9IDBMOyBuWSA8IG5IZWlnaHQ7IG5ZKysgKQoJCQkJCXsKCQkJCQkJU2NhbmxpbmUgcFJlYWRTY2FuID0gcFJlYWRBY2MtPkdldFNjYW5saW5lKCBuWSApOwoJCQkJCQlTY2FubGluZSBwV3JpdGVTY2FuID0gcFdyaXRlQWNjLT5HZXRTY2FubGluZSggblkgKTsKCgkJCQkJCWZvciggbG9uZyBuWCA9IDBMOyBuWCA8IG5XaWR0aDsgblgrKyApCgkJCQkJCXsKCQkJCQkJCWNvbnN0IHNhbF91TG9uZyBuQiA9ICpwUmVhZFNjYW4rKzsKCQkJCQkJCWNvbnN0IHNhbF91TG9uZyBuRyA9ICpwUmVhZFNjYW4rKzsKCQkJCQkJCWNvbnN0IHNhbF91TG9uZyBuUiA9ICpwUmVhZFNjYW4rKzsKCQkJCQkJCQoJCQkJCQkJKnBXcml0ZVNjYW4rKyA9IChzYWxfdUludDgpICggKCBuQiAqIDI4VUwgKyBuRyAqIDE1MVVMICsgblIgKiA3N1VMICkgPj4gblNoaWZ0ICk7CgkJCQkJCX0KCQkJCQl9CgkJCQl9CgkJCQllbHNlIGlmKCBwUmVhZEFjYy0+R2V0U2NhbmxpbmVGb3JtYXQoKSA9PSBCTVBfRk9STUFUXzI0QklUX1RDX1JHQiAmJgoJCQkJCQkgcFdyaXRlQWNjLT5HZXRTY2FubGluZUZvcm1hdCgpID09IEJNUF9GT1JNQVRfOEJJVF9QQUwgKQoJCQkJewoJCQkJCW5TaGlmdCArPSA4OwoKCQkJCQlmb3IoIGxvbmcgblkgPSAwTDsgblkgPCBuSGVpZ2h0OyBuWSsrICkKCQkJCQl7CgkJCQkJCVNjYW5saW5lIHBSZWFkU2NhbiA9IHBSZWFkQWNjLT5HZXRTY2FubGluZSggblkgKTsKCQkJCQkJU2NhbmxpbmUgcFdyaXRlU2NhbiA9IHBXcml0ZUFjYy0+R2V0U2NhbmxpbmUoIG5ZICk7CgoJCQkJCQlmb3IoIGxvbmcgblggPSAwTDsgblggPCBuV2lkdGg7IG5YKysgKQoJCQkJCQl7CgkJCQkJCQljb25zdCBzYWxfdUxvbmcgblIgPSAqcFJlYWRTY2FuKys7CgkJCQkJCQljb25zdCBzYWxfdUxvbmcgbkcgPSAqcFJlYWRTY2FuKys7CgkJCQkJCQljb25zdCBzYWxfdUxvbmcgbkIgPSAqcFJlYWRTY2FuKys7CgkJCQkJCQkKCQkJCQkJCSpwV3JpdGVTY2FuKysgPSAoc2FsX3VJbnQ4KSAoICggbkIgKiAyOFVMICsgbkcgKiAxNTFVTCArIG5SICogNzdVTCApID4+IG5TaGlmdCApOwoJCQkJCQl9CgkJCQkJfQoJCQkJfQoJCQkJZWxzZQoJCQkJewoJCQkJCWZvciggbG9uZyBuWSA9IDBMOyBuWSA8IG5IZWlnaHQ7IG5ZKysgKQoJCQkJCQlmb3IoIGxvbmcgblggPSAwTDsgblggPCBuV2lkdGg7IG5YKysgKQoJCQkJCQkJcFdyaXRlQWNjLT5TZXRQaXhlbEluZGV4KCBuWSwgblgsIChwUmVhZEFjYy0+R2V0UGl4ZWwoIG5ZLCBuWCApICkuR2V0THVtaW5hbmNlKCkgPj4gblNoaWZ0ICk7CgkJCQl9CgoJCQkJYU5ld0JtcC5SZWxlYXNlQWNjZXNzKCBwV3JpdGVBY2MgKTsKCQkJCWJSZXQgPSBzYWxfVHJ1ZTsKCQkJfQoKCQkJUmVsZWFzZUFjY2VzcyggcFJlYWRBY2MgKTsKCgkJCWlmKCBiUmV0ICkKCQkJewoJCQkJY29uc3QgTWFwTW9kZQlhTWFwKCBtYVByZWZNYXBNb2RlICk7CgkJCQljb25zdCBTaXplCQlhU2l6ZSggbWFQcmVmU2l6ZSApOwoKCQkJCSp0aGlzID0gYU5ld0JtcDsKCgkJCQltYVByZWZNYXBNb2RlID0gYU1hcDsKCQkJCW1hUHJlZlNpemUgPSBhU2l6ZTsKCQkJfQoJCX0KCQllbHNlCgkJewoJCQlSZWxlYXNlQWNjZXNzKCBwUmVhZEFjYyApOwoJCQliUmV0ID0gc2FsX1RydWU7CgkJfQoJfQoKCXJldHVybiBiUmV0Owp9CgovLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCnNhbF9Cb29sIEJpdG1hcDo6SW1wbENvbnZlcnRVcCggc2FsX3VJbnQxNiBuQml0Q291bnQsIENvbG9yKiBwRXh0Q29sb3IgKQp7CglEQkdfQVNTRVJUKCBuQml0Q291bnQgPiBHZXRCaXRDb3VudCgpLCAiTmV3IEJpdENvdW50IG11c3QgYmUgZ3JlYXRlciEiICk7CgoJQml0bWFwUmVhZEFjY2VzcyoJcFJlYWRBY2MgPSBBY3F1aXJlUmVhZEFjY2VzcygpOwoJc2FsX0Jvb2wJCQkJYlJldCA9IHNhbF9GYWxzZTsKCglpZiggcFJlYWRBY2MgKQoJewoJCUJpdG1hcFBhbGV0dGUJCWFQYWw7CgkJQml0bWFwCQkJCWFOZXdCbXAoIEdldFNpemVQaXhlbCgpLCBuQml0Q291bnQsIHBSZWFkQWNjLT5IYXNQYWxldHRlKCkgPyAmcFJlYWRBY2MtPkdldFBhbGV0dGUoKSA6ICZhUGFsICk7CgkJQml0bWFwV3JpdGVBY2Nlc3MqCXBXcml0ZUFjYyA9IGFOZXdCbXAuQWNxdWlyZVdyaXRlQWNjZXNzKCk7CgoJCWlmKCBwV3JpdGVBY2MgKQoJCXsKCQkJY29uc3QgbG9uZwluV2lkdGggPSBwV3JpdGVBY2MtPldpZHRoKCk7CgkJCWNvbnN0IGxvbmcJbkhlaWdodCA9IHBXcml0ZUFjYy0+SGVpZ2h0KCk7CgoJCQlpZiggcFdyaXRlQWNjLT5IYXNQYWxldHRlKCkgKQoJCQl7CgkJCQljb25zdCBzYWxfdUludDE2CQkJbk9sZENvdW50ID0gMSA8PCBHZXRCaXRDb3VudCgpOwoJCQkJY29uc3QgQml0bWFwUGFsZXR0ZSYJck9sZFBhbCA9IHBSZWFkQWNjLT5HZXRQYWxldHRlKCk7CgoJCQkJYVBhbC5TZXRFbnRyeUNvdW50KCAxIDw8IG5CaXRDb3VudCApOwoKCQkJCWZvciggc2FsX3VJbnQxNiBpID0gMDsgaSA8IG5PbGRDb3VudDsgaSsrICkKCQkJCQlhUGFsWyBpIF0gPSByT2xkUGFsWyBpIF07CgoJCQkJaWYoIHBFeHRDb2xvciApCgkJCQkJYVBhbFsgYVBhbC5HZXRFbnRyeUNvdW50KCkgLSAxIF0gPSAqcEV4dENvbG9yOwoKCQkJCXBXcml0ZUFjYy0+U2V0UGFsZXR0ZSggYVBhbCApOwoKCQkJCWZvciggbG9uZyBuWSA9IDBMOyBuWSA8IG5IZWlnaHQ7IG5ZKysgKQoJCQkJCWZvciggbG9uZyBuWCA9IDBMOyBuWCA8IG5XaWR0aDsgblgrKyApCgkJCQkJCXBXcml0ZUFjYy0+U2V0UGl4ZWwoIG5ZLCBuWCwgcFJlYWRBY2MtPkdldFBpeGVsKCBuWSwgblggKSApOwoJCQl9CgkJCWVsc2UKCQkJewoJCQkJaWYoIHBSZWFkQWNjLT5IYXNQYWxldHRlKCkgKQoJCQkJewoJCQkJCWZvciggbG9uZyBuWSA9IDBMOyBuWSA8IG5IZWlnaHQ7IG5ZKysgKQoJCQkJCQlmb3IoIGxvbmcgblggPSAwTDsgblggPCBuV2lkdGg7IG5YKysgKQoJCQkJCQkJcFdyaXRlQWNjLT5TZXRQaXhlbCggblksIG5YLCBwUmVhZEFjYy0+R2V0UGFsZXR0ZUNvbG9yKCBwUmVhZEFjYy0+R2V0UGl4ZWxJbmRleCggblksIG5YICkgKSApOwoJCQkJfQoJCQkJZWxzZQoJCQkJewoJCQkJCWZvciggbG9uZyBuWSA9IDBMOyBuWSA8IG5IZWlnaHQ7IG5ZKysgKQoJCQkJCQlmb3IoIGxvbmcgblggPSAwTDsgblggPCBuV2lkdGg7IG5YKysgKQoJCQkJCQkJcFdyaXRlQWNjLT5TZXRQaXhlbCggblksIG5YLCBwUmVhZEFjYy0+R2V0UGl4ZWwoIG5ZLCBuWCApICk7CgkJCQl9CgkJCX0KCgkJCWFOZXdCbXAuUmVsZWFzZUFjY2VzcyggcFdyaXRlQWNjICk7CgkJCWJSZXQgPSBzYWxfVHJ1ZTsKCQl9CgoJCVJlbGVhc2VBY2Nlc3MoIHBSZWFkQWNjICk7CgoJCWlmKCBiUmV0ICkKCQl7CgkJCWNvbnN0IE1hcE1vZGUJYU1hcCggbWFQcmVmTWFwTW9kZSApOwoJCQljb25zdCBTaXplCQlhU2l6ZSggbWFQcmVmU2l6ZSApOwoKCQkJKnRoaXMgPSBhTmV3Qm1wOwoKCQkJbWFQcmVmTWFwTW9kZSA9IGFNYXA7CgkJCW1hUHJlZlNpemUgPSBhU2l6ZTsKCQl9Cgl9CgoJcmV0dXJuIGJSZXQ7Cn0KCi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKc2FsX0Jvb2wgQml0bWFwOjpJbXBsQ29udmVydERvd24oIHNhbF91SW50MTYgbkJpdENvdW50LCBDb2xvciogcEV4dENvbG9yICkKewoJREJHX0FTU0VSVCggbkJpdENvdW50IDw9IEdldEJpdENvdW50KCksICJOZXcgQml0Q291bnQgbXVzdCBiZSBsb3dlciAoIG9yIGVxdWFsIHdoZW4gcEV4dENvbG9yIGlzIHNldCApISIgKTsKCglCaXRtYXBSZWFkQWNjZXNzKglwUmVhZEFjYyA9IEFjcXVpcmVSZWFkQWNjZXNzKCk7CglzYWxfQm9vbAkJCQliUmV0ID0gc2FsX0ZhbHNlOwoKCWlmKCBwUmVhZEFjYyApCgl7CgkJQml0bWFwUGFsZXR0ZQkJYVBhbDsKCQlCaXRtYXAJCQkJYU5ld0JtcCggR2V0U2l6ZVBpeGVsKCksIG5CaXRDb3VudCwgJmFQYWwgKTsKCQlCaXRtYXBXcml0ZUFjY2VzcyoJcFdyaXRlQWNjID0gYU5ld0JtcC5BY3F1aXJlV3JpdGVBY2Nlc3MoKTsKCgkJaWYoIHBXcml0ZUFjYyApCgkJewoJCQljb25zdCBzYWxfdUludDE2CW5Db3VudCA9IDEgPDwgbkJpdENvdW50OwoJCQljb25zdCBsb25nCQluV2lkdGggPSBwV3JpdGVBY2MtPldpZHRoKCk7CgkJCWNvbnN0IGxvbmcJCW5XaWR0aDEgPSBuV2lkdGggLSAxTDsKCQkJY29uc3QgbG9uZwkJbkhlaWdodCA9IHBXcml0ZUFjYy0+SGVpZ2h0KCk7CgkJCU9jdHJlZQkJCWFPY3RyZWUoICpwUmVhZEFjYywgcEV4dENvbG9yID8gKCBuQ291bnQgLSAxICkgOiBuQ291bnQgKTsKCQkJSW52ZXJzZUNvbG9yTWFwIGFDb2xvck1hcCggYVBhbCA9IGFPY3RyZWUuR2V0UGFsZXR0ZSgpICk7CgkJCUJpdG1hcENvbG9yIAlhQ29sb3I7CgkJCUltcEVycm9yUXVhZAlhRXJyUXVhZDsKCQkJSW1wRXJyb3JRdWFkKglwRXJyUXVhZDEgPSBuZXcgSW1wRXJyb3JRdWFkWyBuV2lkdGggXTsKCQkJSW1wRXJyb3JRdWFkKglwRXJyUXVhZDIgPSBuZXcgSW1wRXJyb3JRdWFkWyBuV2lkdGggXTsKCQkJSW1wRXJyb3JRdWFkKglwUUxpbmUxID0gcEVyclF1YWQxOwoJCQlJbXBFcnJvclF1YWQqCXBRTGluZTIgPSAwOwoJCQlsb25nCQkJblgsIG5ZOwoJCQlsb25nCQkJbllUbXAgPSAwTDsKCQkJc2FsX3VJbnQ4CQkJY0luZGV4OwoJCQlzYWxfQm9vbAkJCWJRMSA9IHNhbF9UcnVlOwoKCQkJaWYoIHBFeHRDb2xvciApCgkJCXsKCQkJCWFQYWwuU2V0RW50cnlDb3VudCggYVBhbC5HZXRFbnRyeUNvdW50KCkgKyAxICk7CgkJCQlhUGFsWyBhUGFsLkdldEVudHJ5Q291bnQoKSAtIDEgXSA9ICpwRXh0Q29sb3I7CgkJCX0KCgkJCS8vIHNldCBCbGFjay9XaGl0ZSBhbHdheXMsIGlmIHdlIGhhdmUgZW5vdWdoIHNwYWNlCgkJCWlmKCBhUGFsLkdldEVudHJ5Q291bnQoKSA8ICggbkNvdW50IC0gMSApICkKCQkJewoJCQkJYVBhbC5TZXRFbnRyeUNvdW50KCBhUGFsLkdldEVudHJ5Q291bnQoKSArIDIgKTsKCQkJCWFQYWxbIGFQYWwuR2V0RW50cnlDb3VudCgpIC0gMiBdID0gQ29sb3IoIENPTF9CTEFDSyApOwoJCQkJYVBhbFsgYVBhbC5HZXRFbnRyeUNvdW50KCkgLSAxIF0gPSBDb2xvciggQ09MX1dISVRFICk7CgkJCX0KCgkJCXBXcml0ZUFjYy0+U2V0UGFsZXR0ZSggYVBhbCApOwoKCQkJZm9yKCBuWSA9IDBMOyBuWSA8IE1pbiggbkhlaWdodCwgMkwgKTsgblkrKywgbllUbXArKyApCgkJCXsKCQkJCWZvciggblggPSAwTCwgcFFMaW5lMiA9ICFuWSA/IHBFcnJRdWFkMSA6IHBFcnJRdWFkMjsgblggPCBuV2lkdGg7IG5YKysgKQoJCQkJewoJCQkJCWlmKCBwUmVhZEFjYy0+SGFzUGFsZXR0ZSgpICkKCQkJCQkJcFFMaW5lMlsgblggXSA9IHBSZWFkQWNjLT5HZXRQYWxldHRlQ29sb3IoIHBSZWFkQWNjLT5HZXRQaXhlbEluZGV4KCBuWVRtcCwgblggKSApOwoJCQkJCWVsc2UKCQkJCQkJcFFMaW5lMlsgblggXSA9IHBSZWFkQWNjLT5HZXRQaXhlbCggbllUbXAsIG5YICk7CgkJCQl9CgkJCX0KCgkJCWZvciggblkgPSAwTDsgblkgPCBuSGVpZ2h0OyBuWSsrLCBuWVRtcCsrICkKCQkJewoJCQkJLy8gZmlyc3QgcGl4ZWwgaW4gdGhlIGxpbmUKCQkJCWNJbmRleCA9IChzYWxfdUludDgpIGFDb2xvck1hcC5HZXRCZXN0UGFsZXR0ZUluZGV4KCBwUUxpbmUxWyAwIF0uSW1wbEdldENvbG9yKCkgKTsKCQkJCXBXcml0ZUFjYy0+U2V0UGl4ZWxJbmRleCggblksIDAsIGNJbmRleCApOwoKCQkJCWZvciggblggPSAxTDsgblggPCBuV2lkdGgxOyBuWCsrICkKCQkJCXsKCQkJCQljSW5kZXggPSAoc2FsX3VJbnQ4KSBhQ29sb3JNYXAuR2V0QmVzdFBhbGV0dGVJbmRleCggYUNvbG9yID0gcFFMaW5lMVsgblggXS5JbXBsR2V0Q29sb3IoKSApOwoJCQkJCWFFcnJRdWFkID0gKCBJbXBFcnJvclF1YWQoIGFDb2xvciApIC09IHBXcml0ZUFjYy0+R2V0UGFsZXR0ZUNvbG9yKCBjSW5kZXggKSApOwoJCQkJCXBRTGluZTFbICsrblggXS5JbXBsQWRkQ29sb3JFcnJvcjcoIGFFcnJRdWFkICk7CgkJCQkJcFFMaW5lMlsgblgtLSBdLkltcGxBZGRDb2xvckVycm9yMSggYUVyclF1YWQgKTsKCQkJCQlwUUxpbmUyWyBuWC0tIF0uSW1wbEFkZENvbG9yRXJyb3I1KCBhRXJyUXVhZCApOwoJCQkJCXBRTGluZTJbIG5YKysgXS5JbXBsQWRkQ29sb3JFcnJvcjMoIGFFcnJRdWFkICk7CgkJCQkJcFdyaXRlQWNjLT5TZXRQaXhlbEluZGV4KCBuWSwgblgsIGNJbmRleCApOwoJCQkJfQoKCQkJCS8vIGxldHp0ZXMgWmVpbGVuUGl4ZWwKICAgICAgICAgICAgICAgIGlmKCBuWCA8IG5XaWR0aCApCiAgICAgICAgICAgICAgICB7CgkJCQkgICAgY0luZGV4ID0gKHNhbF91SW50OCkgYUNvbG9yTWFwLkdldEJlc3RQYWxldHRlSW5kZXgoIHBRTGluZTFbIG5XaWR0aDEgXS5JbXBsR2V0Q29sb3IoKSApOwoJCQkJICAgIHBXcml0ZUFjYy0+U2V0UGl4ZWxJbmRleCggblksIG5YLCBjSW5kZXggKTsKICAgICAgICAgICAgICAgIH0KCgkJCQkvLyBaZWlsZW5wdWZmZXIgbmV1IGZ1ZWxsZW4va29waWVyZW4KCQkJCXBRTGluZTEgPSBwUUxpbmUyOwoJCQkJcFFMaW5lMiA9ICggYlExID0gIWJRMSApICE9IHNhbF9GYWxzZSA/IHBFcnJRdWFkMiA6IHBFcnJRdWFkMTsKCgkJCQlpZiggbllUbXAgPCBuSGVpZ2h0ICkKCQkJCXsKCQkJCQlmb3IoIG5YID0gMEw7IG5YIDwgbldpZHRoOyBuWCsrICkKCQkJCQl7CgkJCQkJCWlmKCBwUmVhZEFjYy0+SGFzUGFsZXR0ZSgpICkKCQkJCQkJCXBRTGluZTJbIG5YIF0gPSBwUmVhZEFjYy0+R2V0UGFsZXR0ZUNvbG9yKCBwUmVhZEFjYy0+R2V0UGl4ZWxJbmRleCggbllUbXAsIG5YICkgKTsKCQkJCQkJZWxzZQoJCQkJCQkJcFFMaW5lMlsgblggXSA9IHBSZWFkQWNjLT5HZXRQaXhlbCggbllUbXAsIG5YICk7CgkJCQkJfQoJCQkJfQoJCQl9CgoJCQkvLyBaZWlsZW5wdWZmZXIgemVyc3RvZXJlbgoJCQlkZWxldGVbXSBwRXJyUXVhZDE7CgkJCWRlbGV0ZVtdIHBFcnJRdWFkMjsKCgkJCWFOZXdCbXAuUmVsZWFzZUFjY2VzcyggcFdyaXRlQWNjICk7CgkJCWJSZXQgPSBzYWxfVHJ1ZTsKCQl9CgoJCVJlbGVhc2VBY2Nlc3MoIHBSZWFkQWNjICk7CgoJCWlmKCBiUmV0ICkKCQl7CgkJCWNvbnN0IE1hcE1vZGUJYU1hcCggbWFQcmVmTWFwTW9kZSApOwoJCQljb25zdCBTaXplCQlhU2l6ZSggbWFQcmVmU2l6ZSApOwoKCQkJKnRoaXMgPSBhTmV3Qm1wOwoKCQkJbWFQcmVmTWFwTW9kZSA9IGFNYXA7CgkJCW1hUHJlZlNpemUgPSBhU2l6ZTsKCQl9Cgl9CgoJcmV0dXJuIGJSZXQ7Cn0KCi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKc2FsX0Jvb2wgQml0bWFwOjpJbXBsQ29udmVydEdob3N0ZWQoKQp7CglCaXRtYXAJCQkJYU5ld0JtcDsKCUJpdG1hcFJlYWRBY2Nlc3MqCXBSID0gQWNxdWlyZVJlYWRBY2Nlc3MoKTsKCXNhbF9Cb29sCQkJCWJSZXQgPSBzYWxfRmFsc2U7CgoJaWYoIHBSICkKCXsKCQlpZiggcFItPkhhc1BhbGV0dGUoKSApCgkJewoJCQlCaXRtYXBQYWxldHRlIGFOZXdQYWwoIHBSLT5HZXRQYWxldHRlRW50cnlDb3VudCgpICk7CgoJCQlmb3IoIGxvbmcgaSA9IDAsIG5Db3VudCA9IGFOZXdQYWwuR2V0RW50cnlDb3VudCgpOyBpIDwgbkNvdW50OyBpKysgKQoJCQl7CgkJCQljb25zdCBCaXRtYXBDb2xvciYgck9sZCA9IHBSLT5HZXRQYWxldHRlQ29sb3IoIChzYWxfdUludDE2KSBpICk7CgkJCQlhTmV3UGFsWyAoc2FsX3VJbnQxNikgaSBdID0gQml0bWFwQ29sb3IoICggck9sZC5HZXRSZWQoKSA+PiAxICkgfCAweDgwLAoJCQkJCQkJCQkJCQkJICggck9sZC5HZXRHcmVlbigpID4+IDEgKSB8IDB4ODAsCgkJCQkJCQkJCQkJCQkgKCByT2xkLkdldEJsdWUoKSA+PiAxICkgfCAweDgwICk7CgkJCX0KCgkJCWFOZXdCbXAgPSBCaXRtYXAoIEdldFNpemVQaXhlbCgpLCBHZXRCaXRDb3VudCgpLCAmYU5ld1BhbCApOwoJCQlCaXRtYXBXcml0ZUFjY2VzcyogcFcgPSBhTmV3Qm1wLkFjcXVpcmVXcml0ZUFjY2VzcygpOwoKCQkJaWYoIHBXICkKCQkJewoJCQkJcFctPkNvcHlCdWZmZXIoICpwUiApOwoJCQkJYU5ld0JtcC5SZWxlYXNlQWNjZXNzKCBwVyApOwoJCQkJYlJldCA9IHNhbF9UcnVlOwoJCQl9CgkJfQoJCWVsc2UKCQl7CgkJCWFOZXdCbXAgPSBCaXRtYXAoIEdldFNpemVQaXhlbCgpLCAyNCApOwoKCQkJQml0bWFwV3JpdGVBY2Nlc3MqIHBXID0gYU5ld0JtcC5BY3F1aXJlV3JpdGVBY2Nlc3MoKTsKCgkJCWlmKCBwVyApCgkJCXsKCQkJCWNvbnN0IGxvbmcgbldpZHRoID0gcFItPldpZHRoKCksIG5IZWlnaHQgPSBwUi0+SGVpZ2h0KCk7CgoJCQkJZm9yKCBsb25nIG5ZID0gMDsgblkgPCBuSGVpZ2h0OyBuWSsrICkKCQkJCXsKCQkJCQlmb3IoIGxvbmcgblggPSAwOyBuWCA8IG5XaWR0aDsgblgrKyApCgkJCQkJewoJCQkJCQljb25zdCBCaXRtYXBDb2xvciBhT2xkKCBwUi0+R2V0UGl4ZWwoIG5ZLCBuWCApICk7CgkJCQkJCXBXLT5TZXRQaXhlbCggblksIG5YLCBCaXRtYXBDb2xvciggKCBhT2xkLkdldFJlZCgpID4+IDEgKSB8IDB4ODAsIAoJCQkJCQkJCQkJCQkJCSAgICggYU9sZC5HZXRHcmVlbigpID4+IDEgKSB8IDB4ODAsCgkJCQkJCQkJCQkJCQkJICAgKCBhT2xkLkdldEJsdWUoKSA+PiAxICkgfCAweDgwICkgKTsKCgkJCQkJfQoJCQkJfQoKCQkJCWFOZXdCbXAuUmVsZWFzZUFjY2VzcyggcFcgKTsKCQkJCWJSZXQgPSBzYWxfVHJ1ZTsKCQkJfQoJCX0KCgkJUmVsZWFzZUFjY2VzcyggcFIgKTsKCX0KCglpZiggYlJldCApCgl7CgkJY29uc3QgTWFwTW9kZQlhTWFwKCBtYVByZWZNYXBNb2RlICk7CgkJY29uc3QgU2l6ZQkJYVNpemUoIG1hUHJlZlNpemUgKTsKCgkJKnRoaXMgPSBhTmV3Qm1wOwoKCQltYVByZWZNYXBNb2RlID0gYU1hcDsKCQltYVByZWZTaXplID0gYVNpemU7Cgl9CgoJcmV0dXJuIGJSZXQ7Cn0KCi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKc2FsX0Jvb2wgQml0bWFwOjpTY2FsZSggY29uc3QgZG91YmxlJiByU2NhbGVYLCBjb25zdCBkb3VibGUmIHJTY2FsZVksIHNhbF91SW50MzIgblNjYWxlRmxhZyApCnsKICAgIGlmKGJhc2VnZng6OmZUb29sczo6ZXF1YWxaZXJvKHJTY2FsZVgpIHx8IGJhc2VnZng6OmZUb29sczo6ZXF1YWxaZXJvKHJTY2FsZVkpKQogICAgewogICAgICAgIC8vIG5vIHNjYWxlCiAgICAgICAgcmV0dXJuIHRydWU7CiAgICB9CgogICAgaWYoYmFzZWdmeDo6ZlRvb2xzOjplcXVhbChyU2NhbGVYLCAxLjApICYmIGJhc2VnZng6OmZUb29sczo6ZXF1YWwoclNjYWxlWSwgMS4wKSkKICAgIHsKICAgICAgICAvLyBubyBzY2FsZQogICAgICAgIHJldHVybiB0cnVlOwogICAgfQoKI2lmZGVmIERCR19VVElMCiAgICAvLyAjMTIxMjMzIyBhbGxvdyB0byB0ZXN0IHRoZSBkaWZmZXJlbnQgc2NhbGVycyBpbiBkZWJ1ZyBidWlsZCB3aXRoIHNvdXJjZQogICAgLy8gbGV2ZWwgZGVidWdnZXIgKGNoYW5nZSBuTnVtYmVyIHRvIGRlc2lyZWQgYWN0aW9uKQogICAgc3RhdGljIHNhbF91SW50MTYgbk51bWJlcigwKTsKICAgIGNvbnN0IHNhbF91SW50MTYgblN0YXJ0Q291bnQoR2V0Qml0Q291bnQoKSk7CgogICAgc3dpdGNoKG5OdW1iZXIpCiAgICB7CiAgICAgICAgY2FzZSAwIDogYnJlYWs7CiAgICAgICAgY2FzZSAxOiBuU2NhbGVGbGFnID0gQk1QX1NDQUxFX0ZBU1Q7IGJyZWFrOwogICAgICAgIGNhc2UgMjogblNjYWxlRmxhZyA9IEJNUF9TQ0FMRV9JTlRFUlBPTEFURTsgYnJlYWs7CiAgICAgICAgY2FzZSAzOiBuU2NhbGVGbGFnID0gQk1QX1NDQUxFX1NVUEVSOyBicmVhazsKICAgICAgICBjYXNlIDQ6IG5TY2FsZUZsYWcgPSBCTVBfU0NBTEVfTEFOQ1pPUzsgYnJlYWs7CiAgICAgICAgY2FzZSA1OiBuU2NhbGVGbGFnID0gQk1QX1NDQUxFX0JJQ1VCSUM7IGJyZWFrOwogICAgICAgIGNhc2UgNjogblNjYWxlRmxhZyA9IEJNUF9TQ0FMRV9CSUxJTkVBUjsgYnJlYWs7CiAgICAgICAgY2FzZSA3OiBuU2NhbGVGbGFnID0gQk1QX1NDQUxFX0JPWDsgYnJlYWs7CiAgICAgICAgY2FzZSA4OiBuU2NhbGVGbGFnID0gQk1QX1NDQUxFX0JFU1RRVUFMSVRZOyBicmVhazsKICAgICAgICBjYXNlIDk6IG5TY2FsZUZsYWcgPSBCTVBfU0NBTEVfRkFTVEVTVElOVEVSUE9MQVRFOyBicmVhazsKICAgIH0KI2VuZGlmIC8vIERCR19VVElMCgogICAgYm9vbCBiUmV0dmFsKGZhbHNlKTsKCiAgICBpZihCTVBfU0NBTEVfQkVTVFFVQUxJVFkgPT0gblNjYWxlRmxhZykKICAgIHsKICAgICAgICAvLyBVc2UgTEFOQ1pPUyB3aGVuIGJlc3QgcXVhbGl0eSBpcyByZXF1ZXN0ZWQKICAgICAgICBuU2NhbGVGbGFnID0gQk1QX1NDQUxFX0xBTkNaT1M7CiAgICB9CiAgICBlbHNlIGlmKEJNUF9TQ0FMRV9GQVNURVNUSU5URVJQT0xBVEUgPT0gblNjYWxlRmxhZykKICAgIHsKICAgICAgICAvLyBVc2UgQk1QX1NDQUxFX1NVUEVSIHdoZW4gc3BlZWQgaXMgcmVxdWVzdGVkLCBidXQgbm90IHdvcnN0IHF1YWxpdHkKICAgICAgICBuU2NhbGVGbGFnID0gQk1QX1NDQUxFX1NVUEVSOwogICAgfQoKICAgIHN3aXRjaChuU2NhbGVGbGFnKQogICAgewogICAgICAgIGRlZmF1bHQ6CiAgICAgICAgY2FzZSBCTVBfU0NBTEVfTk9ORSA6CiAgICAgICAgewogICAgICAgICAgICBiUmV0dmFsID0gZmFsc2U7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KICAgICAgICBjYXNlIEJNUF9TQ0FMRV9GQVNUIDoKICAgICAgICB7CiAgICAgICAgICAgIGJSZXR2YWwgPSBJbXBsU2NhbGVGYXN0KCByU2NhbGVYLCByU2NhbGVZICk7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KICAgICAgICBjYXNlIEJNUF9TQ0FMRV9JTlRFUlBPTEFURSA6CiAgICAgICAgewogICAgICAgICAgICBiUmV0dmFsID0gSW1wbFNjYWxlSW50ZXJwb2xhdGUoIHJTY2FsZVgsIHJTY2FsZVkgKTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgfQogICAgICAgIGNhc2UgQk1QX1NDQUxFX1NVUEVSIDoKICAgICAgICB7CiAgICAgICAgICAgIGlmKEdldFNpemVQaXhlbCgpLldpZHRoKCkgPCAyIHx8IEdldFNpemVQaXhlbCgpLkhlaWdodCgpIDwgMikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLy8gZmFsbGJhY2sgdG8gSW1wbFNjYWxlRmFzdAogICAgICAgICAgICAgICAgYlJldHZhbCA9IEltcGxTY2FsZUZhc3QoIHJTY2FsZVgsIHJTY2FsZVkgKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIC8vICMxMjEyMzMjIHVzZSBtZXRob2QgZnJvbSBzeW1waG9ueQogICAgICAgICAgICAgICAgYlJldHZhbCA9IEltcGxTY2FsZVN1cGVyKCByU2NhbGVYLCByU2NhbGVZICk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgfQogICAgICAgIGNhc2UgQk1QX1NDQUxFX0xBTkNaT1MgOgogICAgICAgIHsKICAgICAgICAgICAgY29uc3QgTGFuY3pvczNLZXJuZWwga2VybmVsOwoKICAgICAgICAgICAgYlJldHZhbCA9IEltcGxTY2FsZUNvbnZvbHV0aW9uKCByU2NhbGVYLCByU2NhbGVZLCBrZXJuZWwpOwogICAgICAgICAgICBicmVhazsKICAgICAgICB9CiAgICAgICAgY2FzZSBCTVBfU0NBTEVfQklDVUJJQyA6CiAgICAgICAgewogICAgICAgICAgICBjb25zdCBCaWN1YmljS2VybmVsIGtlcm5lbDsKCiAgICAgICAgICAgIGJSZXR2YWwgPSBJbXBsU2NhbGVDb252b2x1dGlvbiggclNjYWxlWCwgclNjYWxlWSwga2VybmVsICk7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KICAgICAgICBjYXNlIEJNUF9TQ0FMRV9CSUxJTkVBUiA6CiAgICAgICAgewogICAgICAgICAgICBjb25zdCBCaWxpbmVhcktlcm5lbCBrZXJuZWw7CgogICAgICAgICAgICBiUmV0dmFsID0gSW1wbFNjYWxlQ29udm9sdXRpb24oIHJTY2FsZVgsIHJTY2FsZVksIGtlcm5lbCApOwogICAgICAgICAgICBicmVhazsKICAgICAgICB9CiAgICAgICAgY2FzZSBCTVBfU0NBTEVfQk9YIDoKICAgICAgICB7CiAgICAgICAgICAgIGNvbnN0IEJveEtlcm5lbCBrZXJuZWw7CgogICAgICAgICAgICBiUmV0dmFsID0gSW1wbFNjYWxlQ29udm9sdXRpb24oIHJTY2FsZVgsIHJTY2FsZVksIGtlcm5lbCApOwogICAgICAgICAgICBicmVhazsKICAgICAgICB9CiAgICB9CgojaWZkZWYgREJHX1VUSUwKICAgIGlmKGJSZXR2YWwgJiYgblN0YXJ0Q291bnQgIT0gR2V0Qml0Q291bnQoKSkKICAgIHsKICAgICAgICBPU0xfRU5TVVJFKGZhbHNlLCAiQml0bWFwOjpTY2FsZSBoYXMgY2hhbmdlZCB0aGUgQ29sb3JEZXB0aCwgdGhpcyBzaG91bGQgKm5vdCogaGFwcGVuICghKSIpOwogICAgfQojZW5kaWYKCiAgICByZXR1cm4gYlJldHZhbDsKfQoKLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgpzYWxfQm9vbCBCaXRtYXA6OlNjYWxlKCBjb25zdCBTaXplJiByTmV3U2l6ZSwgc2FsX3VJbnQzMiBuU2NhbGVGbGFnICkKewoJY29uc3QgU2l6ZQlhU2l6ZSggR2V0U2l6ZVBpeGVsKCkgKTsKCXNhbF9Cb29sCQliUmV0OwoKCWlmKCBhU2l6ZS5XaWR0aCgpICYmIGFTaXplLkhlaWdodCgpICkKCXsKCQliUmV0ID0gU2NhbGUoIChkb3VibGUpIHJOZXdTaXplLldpZHRoKCkgLyBhU2l6ZS5XaWR0aCgpLAoJCQkJCSAgKGRvdWJsZSkgck5ld1NpemUuSGVpZ2h0KCkgLyBhU2l6ZS5IZWlnaHQoKSwKCQkJCQkgIG5TY2FsZUZsYWcgKTsKCX0KCWVsc2UKCQliUmV0ID0gc2FsX1RydWU7CgoJcmV0dXJuIGJSZXQ7Cn0KCi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKdm9pZCBCaXRtYXA6OkFkYXB0Qml0Q291bnQoQml0bWFwJiByTmV3KSBjb25zdAp7CiAgICBJbXBsQWRhcHRCaXRDb3VudChyTmV3KTsKfQoKLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgp2b2lkIEJpdG1hcDo6SW1wbEFkYXB0Qml0Q291bnQoQml0bWFwJiByTmV3KSBjb25zdAp7CiAgICAvLyBhTmV3IGlzIHRoZSByZXN1bHQgb2Ygc29tZSBvcGVyYXRpb247IGFkYXB0IGl0J3MgQml0Q291bnQgdG8gdGhlIG9yaWdpbmFsICh0aGlzKQogICAgaWYoR2V0Qml0Q291bnQoKSAhPSByTmV3LkdldEJpdENvdW50KCkpCiAgICB7CiAgICAgICAgc3dpdGNoKEdldEJpdENvdW50KCkpCiAgICAgICAgewogICAgICAgICAgICBjYXNlIDE6CiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHJOZXcuQ29udmVydChCTVBfQ09OVkVSU0lPTl8xQklUX1RIUkVTSE9MRCk7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgfQogICAgICAgICAgICBjYXNlIDQ6CiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGlmKEhhc0dyZXlQYWxldHRlKCkpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgck5ldy5Db252ZXJ0KEJNUF9DT05WRVJTSU9OXzRCSVRfR1JFWVMpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHJOZXcuQ29udmVydChCTVBfQ09OVkVSU0lPTl80QklUX0NPTE9SUyk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgfQogICAgICAgICAgICBjYXNlIDg6CiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGlmKEhhc0dyZXlQYWxldHRlKCkpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgck5ldy5Db252ZXJ0KEJNUF9DT05WRVJTSU9OXzhCSVRfR1JFWVMpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHJOZXcuQ29udmVydChCTVBfQ09OVkVSU0lPTl84QklUX0NPTE9SUyk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgfQogICAgICAgICAgICBjYXNlIDI0OgogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICByTmV3LkNvbnZlcnQoQk1QX0NPTlZFUlNJT05fMjRCSVQpOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgT1NMX0VOU1VSRShmYWxzZSwgIkJpdERlcHRoIGFkYXB0aW9uIGZhaWxlZCAoISkiKTsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQp9CgovLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCnNhbF9Cb29sIEJpdG1hcDo6SW1wbFNjYWxlRmFzdCggY29uc3QgZG91YmxlJiByU2NhbGVYLCBjb25zdCBkb3VibGUmIHJTY2FsZVkgKQp7Cgljb25zdCBTaXplCWFTaXplUGl4KCBHZXRTaXplUGl4ZWwoKSApOwoJY29uc3QgbG9uZwluTmV3V2lkdGggPSBGUm91bmQoIGFTaXplUGl4LldpZHRoKCkgKiByU2NhbGVYICk7Cgljb25zdCBsb25nCW5OZXdIZWlnaHQgPSBGUm91bmQoIGFTaXplUGl4LkhlaWdodCgpICogclNjYWxlWSApOwoJc2FsX0Jvb2wJCWJSZXQgPSBzYWxfRmFsc2U7CgoJaWYoIG5OZXdXaWR0aCAmJiBuTmV3SGVpZ2h0ICkKCXsKCQlCaXRtYXBSZWFkQWNjZXNzKglwUmVhZEFjYyA9IEFjcXVpcmVSZWFkQWNjZXNzKCk7CiAgICAgICAgaWYgKCAhcFJlYWRBY2MgKQogICAgICAgICAgICByZXR1cm4gc2FsX0ZhbHNlOwoKCQlCaXRtYXAJCQkJYU5ld0JtcCggU2l6ZSggbk5ld1dpZHRoLCBuTmV3SGVpZ2h0ICksIEdldEJpdENvdW50KCksICZwUmVhZEFjYy0+R2V0UGFsZXR0ZSgpICk7CgkJQml0bWFwV3JpdGVBY2Nlc3MqCXBXcml0ZUFjYyA9IGFOZXdCbXAuQWNxdWlyZVdyaXRlQWNjZXNzKCk7CgoJCWlmKCBwV3JpdGVBY2MgKQoJCXsKCQkJY29uc3QgbG9uZwluU2NhbmxpbmVTaXplID0gcFdyaXRlQWNjLT5HZXRTY2FubGluZVNpemUoKTsKCQkJY29uc3QgbG9uZwluTmV3V2lkdGgxID0gbk5ld1dpZHRoIC0gMUw7CgkJCWNvbnN0IGxvbmcJbk5ld0hlaWdodDEgPSBuTmV3SGVpZ2h0IC0gMUw7CgkJCWNvbnN0IGxvbmcJbldpZHRoID0gcFJlYWRBY2MtPldpZHRoKCk7CgkJCWNvbnN0IGxvbmcJbkhlaWdodCA9IHBSZWFkQWNjLT5IZWlnaHQoKTsKCQkJbG9uZyoJCXBMdXRYID0gbmV3IGxvbmdbIG5OZXdXaWR0aCBdOwoJCQlsb25nKgkJcEx1dFkgPSBuZXcgbG9uZ1sgbk5ld0hlaWdodCBdOwoJCQlsb25nCQluWCwgblksIG5NYXBZLCBuQWN0WSA9IDBMOwoKCQkJaWYoIG5OZXdXaWR0aDEgJiYgbk5ld0hlaWdodDEgKQoJCQl7CgkJCQlmb3IoIG5YID0gMEw7IG5YIDwgbk5ld1dpZHRoOyBuWCsrICkKCQkJCQlwTHV0WFsgblggXSA9IG5YICogbldpZHRoIC8gbk5ld1dpZHRoOwoKCQkJCWZvciggblkgPSAwTDsgblkgPCBuTmV3SGVpZ2h0OyBuWSsrICkKCQkJCQlwTHV0WVsgblkgXSA9IG5ZICogbkhlaWdodCAvIG5OZXdIZWlnaHQ7CgoJCQkJd2hpbGUoIG5BY3RZIDwgbk5ld0hlaWdodCApCgkJCQl7CgkJCQkJbk1hcFkgPSBwTHV0WVsgbkFjdFkgXTsKCgkJCQkJZm9yKCBuWCA9IDBMOyBuWCA8IG5OZXdXaWR0aDsgblgrKyApCgkJCQkJCXBXcml0ZUFjYy0+U2V0UGl4ZWwoIG5BY3RZLCBuWCwgcFJlYWRBY2MtPkdldFBpeGVsKCBuTWFwWSAsIHBMdXRYWyBuWCBdICkgKTsKCgkJCQkJd2hpbGUoICggbkFjdFkgPCBuTmV3SGVpZ2h0MSApICYmICggcEx1dFlbIG5BY3RZICsgMSBdID09IG5NYXBZICkgKQoJCQkJCXsKCQkJCQkJbWVtY3B5KCBwV3JpdGVBY2MtPkdldFNjYW5saW5lKCBuQWN0WSArIDFMICksCgkJCQkJCQkJIHBXcml0ZUFjYy0+R2V0U2NhbmxpbmUoIG5BY3RZICksIG5TY2FubGluZVNpemUgKTsKCQkJCQkJbkFjdFkrKzsKCQkJCQl9CgoJCQkJCW5BY3RZKys7CgkJCQl9CgoJCQkJYlJldCA9IHNhbF9UcnVlOwoJCQl9CgoJCQlkZWxldGVbXSBwTHV0WDsKCQkJZGVsZXRlW10gcEx1dFk7CgkJfQoKCQlSZWxlYXNlQWNjZXNzKCBwUmVhZEFjYyApOwoJCWFOZXdCbXAuUmVsZWFzZUFjY2VzcyggcFdyaXRlQWNjICk7CgoJCWlmKCBiUmV0ICkKCQkJSW1wbEFzc2lnbldpdGhTaXplKCBhTmV3Qm1wICk7Cgl9CgoJcmV0dXJuIGJSZXQ7Cn0KCi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKc2FsX0Jvb2wgQml0bWFwOjpJbXBsU2NhbGVJbnRlcnBvbGF0ZSggY29uc3QgZG91YmxlJiByU2NhbGVYLCBjb25zdCBkb3VibGUmIHJTY2FsZVkgKQp7Cgljb25zdCBTaXplCWFTaXplUGl4KCBHZXRTaXplUGl4ZWwoKSApOwoJY29uc3QgbG9uZwluTmV3V2lkdGggPSBGUm91bmQoIGFTaXplUGl4LldpZHRoKCkgKiByU2NhbGVYICk7Cgljb25zdCBsb25nCW5OZXdIZWlnaHQgPSBGUm91bmQoIGFTaXplUGl4LkhlaWdodCgpICogclNjYWxlWSApOwoJc2FsX0Jvb2wJCWJSZXQgPSBzYWxfRmFsc2U7CgoJaWYoICggbk5ld1dpZHRoID4gMUwgKSAmJiAoIG5OZXdIZWlnaHQgPiAxTCApICkKCXsKCQlCaXRtYXBDb2xvciAJCWFDb2wwOwoJCUJpdG1hcENvbG9yIAkJYUNvbDE7CgkJQml0bWFwUmVhZEFjY2VzcyoJcFJlYWRBY2MgPSBBY3F1aXJlUmVhZEFjY2VzcygpOwoJCWxvbmcJCQkJbldpZHRoID0gcFJlYWRBY2MtPldpZHRoKCk7CgkJbG9uZwkJCQluSGVpZ2h0ID0gcFJlYWRBY2MtPkhlaWdodCgpOwoJCUJpdG1hcAkJCQlhTmV3Qm1wKCBTaXplKCBuTmV3V2lkdGgsIG5IZWlnaHQgKSwgMjQgKTsKCQlCaXRtYXBXcml0ZUFjY2VzcyoJcFdyaXRlQWNjID0gYU5ld0JtcC5BY3F1aXJlV3JpdGVBY2Nlc3MoKTsKCQlsb25nKgkJCQlwTHV0SW50OwoJCWxvbmcqCQkJCXBMdXRGcmFjOwoJCWxvbmcJCQkJblgsIG5ZOwoJCWxvbmcJCQkJbFhCMCwgbFhCMSwgbFhHMCwgbFhHMSwgbFhSMCwgbFhSMTsKCQlkb3VibGUJCQkJZlRlbXA7CgkJbG9uZwkJCQluVGVtcDsKCgkJaWYoIHBSZWFkQWNjICYmIHBXcml0ZUFjYyApCgkJewoJCQljb25zdCBsb25nCQluTmV3V2lkdGgxID0gbk5ld1dpZHRoIC0gMUw7CgkJCWNvbnN0IGxvbmcJCW5XaWR0aDEgPSBwUmVhZEFjYy0+V2lkdGgoKSAtIDFMOwoJCQljb25zdCBkb3VibGUJZlJldlNjYWxlWCA9IChkb3VibGUpIG5XaWR0aDEgLyBuTmV3V2lkdGgxOwoKCQkJcEx1dEludCA9IG5ldyBsb25nWyBuTmV3V2lkdGggXTsKCQkJcEx1dEZyYWMgPSBuZXcgbG9uZ1sgbk5ld1dpZHRoIF07CgoJCQlmb3IoIG5YID0gMEwsIG5UZW1wID0gbldpZHRoIC0gMkw7IG5YIDwgbk5ld1dpZHRoOyBuWCsrICkKCQkJewoJCQkJZlRlbXAgPSBuWCAqIGZSZXZTY2FsZVg7CgkJCQlwTHV0SW50WyBuWCBdID0gTWluTWF4KCAobG9uZykgZlRlbXAsIDAsIG5UZW1wICk7CgkJCQlmVGVtcCAtPSBwTHV0SW50WyBuWCBdOwoJCQkJcEx1dEZyYWNbIG5YIF0gPSAobG9uZykgKCBmVGVtcCAqIDEwMjQuICk7CgkJCX0KCgkJCWZvciggblkgPSAwTDsgblkgPCBuSGVpZ2h0OyBuWSsrICkKCQkJewoJCQkJaWYoIDEgPT0gbldpZHRoICkKCQkJCXsKCQkJICAgICAgICBpZiggcFJlYWRBY2MtPkhhc1BhbGV0dGUoKSApCgkJCSAgICAgICAgewogICAgCQkJCQlhQ29sMCA9IHBSZWFkQWNjLT5HZXRQYWxldHRlQ29sb3IoIHBSZWFkQWNjLT5HZXRQaXhlbEluZGV4KCBuWSwgMCApICk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICAgICB7CiAgICAJCQkJCWFDb2wwID0gcFJlYWRBY2MtPkdldFBpeGVsKCBuWSwgMCApOwogICAgICAgICAgICAgICAgICAgIH0KCgkJCQkJZm9yKCBuWCA9IDBMOyBuWCA8IG5OZXdXaWR0aDsgblgrKyApCiAgICAgICAgICAgICAgICAgICAgewoJCQkJCQlwV3JpdGVBY2MtPlNldFBpeGVsKCBuWSwgblgsIGFDb2wwICk7CiAgICAgICAgICAgICAgICAgICAgfQoJCQkJfQoJCQkJZWxzZQoJCQkJewoJCQkJCWZvciggblggPSAwTDsgblggPCBuTmV3V2lkdGg7IG5YKysgKQoJCQkJCXsKCQkJCQkJblRlbXAgPSBwTHV0SW50WyBuWCBdOwoKCQkJICAgICAgICAgICAgaWYoIHBSZWFkQWNjLT5IYXNQYWxldHRlKCkgKQoJCQkgICAgICAgICAgICB7CgkJCQkJCQlhQ29sMCA9IHBSZWFkQWNjLT5HZXRQYWxldHRlQ29sb3IoIHBSZWFkQWNjLT5HZXRQaXhlbEluZGV4KCBuWSwgblRlbXArKyApICk7CgkJCQkJCQlhQ29sMSA9IHBSZWFkQWNjLT5HZXRQYWxldHRlQ29sb3IoIHBSZWFkQWNjLT5HZXRQaXhlbEluZGV4KCBuWSwgblRlbXAgKSApOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICAgICAgICAgewoJCQkJCQkJYUNvbDAgPSBwUmVhZEFjYy0+R2V0UGl4ZWwoIG5ZLCBuVGVtcCsrICk7CgkJCQkJCQlhQ29sMSA9IHBSZWFkQWNjLT5HZXRQaXhlbCggblksIG5UZW1wICk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KCgkJCQkJCW5UZW1wID0gcEx1dEZyYWNbIG5YIF07CgoJCQkJCQlsWFIxID0gYUNvbDEuR2V0UmVkKCkgLSAoIGxYUjAgPSBhQ29sMC5HZXRSZWQoKSApOwoJCQkJCQlsWEcxID0gYUNvbDEuR2V0R3JlZW4oKSAtICggbFhHMCA9IGFDb2wwLkdldEdyZWVuKCkgKTsKCQkJCQkJbFhCMSA9IGFDb2wxLkdldEJsdWUoKSAtICggbFhCMCA9IGFDb2wwLkdldEJsdWUoKSApOwoKCQkJCQkJYUNvbDAuU2V0UmVkKCAoc2FsX3VJbnQ4KSAoICggbFhSMSAqIG5UZW1wICsgKCBsWFIwIDw8IDEwICkgKSA+PiAxMCApICk7CgkJCQkJCWFDb2wwLlNldEdyZWVuKCAoc2FsX3VJbnQ4KSAoICggbFhHMSAqIG5UZW1wICsgKCBsWEcwIDw8IDEwICkgKSA+PiAxMCApICk7CgkJCQkJCWFDb2wwLlNldEJsdWUoIChzYWxfdUludDgpICggKCBsWEIxICogblRlbXAgKyAoIGxYQjAgPDwgMTAgKSApID4+IDEwICkgKTsKCgkJCQkJCXBXcml0ZUFjYy0+U2V0UGl4ZWwoIG5ZLCBuWCwgYUNvbDAgKTsKCQkJCQl9CgkJCQl9CgkJCX0KCgkJCWRlbGV0ZVtdIHBMdXRJbnQ7CgkJCWRlbGV0ZVtdIHBMdXRGcmFjOwoJCQliUmV0ID0gc2FsX1RydWU7CgkJfQoKCQlSZWxlYXNlQWNjZXNzKCBwUmVhZEFjYyApOwoJCWFOZXdCbXAuUmVsZWFzZUFjY2VzcyggcFdyaXRlQWNjICk7CgoJCWlmKCBiUmV0ICkKCQl7CgkJCWJSZXQgPSBzYWxfRmFsc2U7CiAgICAgICAgICAgIGNvbnN0IEJpdG1hcCBhT3JpZ2luYWwoKnRoaXMpOwogICAgICAgICAgICAqdGhpcyA9IGFOZXdCbXA7CgkJCWFOZXdCbXAgPSBCaXRtYXAoIFNpemUoIG5OZXdXaWR0aCwgbk5ld0hlaWdodCApLCAyNCApOwoJCQlwUmVhZEFjYyA9IEFjcXVpcmVSZWFkQWNjZXNzKCk7CgkJCXBXcml0ZUFjYyA9IGFOZXdCbXAuQWNxdWlyZVdyaXRlQWNjZXNzKCk7CgoJCQlpZiggcFJlYWRBY2MgJiYgcFdyaXRlQWNjICkKCQkJewoJCQkJY29uc3QgbG9uZwkJbk5ld0hlaWdodDEgPSBuTmV3SGVpZ2h0IC0gMUw7CgkJCQljb25zdCBsb25nCQluSGVpZ2h0MSA9IHBSZWFkQWNjLT5IZWlnaHQoKSAtIDFMOwoJCQkJY29uc3QgZG91YmxlCWZSZXZTY2FsZVkgPSAoZG91YmxlKSBuSGVpZ2h0MSAvIG5OZXdIZWlnaHQxOwoKCQkJCXBMdXRJbnQgPSBuZXcgbG9uZ1sgbk5ld0hlaWdodCBdOwoJCQkJcEx1dEZyYWMgPSBuZXcgbG9uZ1sgbk5ld0hlaWdodCBdOwoKCQkJCWZvciggblkgPSAwTCwgblRlbXAgPSBuSGVpZ2h0IC0gMkw7IG5ZIDwgbk5ld0hlaWdodDsgblkrKyApCgkJCQl7CgkJCQkJZlRlbXAgPSBuWSAqIGZSZXZTY2FsZVk7CgkJCQkJcEx1dEludFsgblkgXSA9IE1pbk1heCggKGxvbmcpIGZUZW1wLCAwLCBuVGVtcCApOwoJCQkJCWZUZW1wIC09IHBMdXRJbnRbIG5ZIF07CgkJCQkJcEx1dEZyYWNbIG5ZIF0gPSAobG9uZykgKCBmVGVtcCAqIDEwMjQuICk7CgkJCQl9CgogICAgICAgICAgICAgICAgLy8gYWZ0ZXIgMXN0IHN0ZXAsIGJpdG1hcCAqaXMqIDI0Yml0IGZvcm1hdCAoc2VlIGFib3ZlKQoJCQkJT1NMX0VOU1VSRSghcFJlYWRBY2MtPkhhc1BhbGV0dGUoKSwgIk9PcHMsIHNvbWVob3cgSW1wbFNjYWxlSW50ZXJwb2xhdGUgaW4tYmV0d2VlbiBmb3JtYXQgaGFzIHBhbGV0dGUsIHNob3VsZCBub3QgaGFwcGVuICghKSIpOwoKCQkJCWZvciggblggPSAwTDsgblggPCBuTmV3V2lkdGg7IG5YKysgKQoJCQkJewoJCQkJCWlmKCAxID09IG5IZWlnaHQgKQoJCQkJCXsKCQkJCQkJYUNvbDAgPSBwUmVhZEFjYy0+R2V0UGl4ZWwoIDAsIG5YICk7CgoJCQkJCQlmb3IoIG5ZID0gMEw7IG5ZIDwgbk5ld0hlaWdodDsgblkrKyApCiAgICAgICAgICAgICAgICAgICAgICAgIHsKCQkJCQkJCXBXcml0ZUFjYy0+U2V0UGl4ZWwoIG5ZLCBuWCwgYUNvbDAgKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQoJCQkJCX0KCQkJCQllbHNlCgkJCQkJewoJCQkJCQlmb3IoIG5ZID0gMEw7IG5ZIDwgbk5ld0hlaWdodDsgblkrKyApCgkJCQkJCXsKCQkJCQkJCW5UZW1wID0gcEx1dEludFsgblkgXTsKCgkJCQkJCQlhQ29sMCA9IHBSZWFkQWNjLT5HZXRQaXhlbCggblRlbXArKywgblggKTsKCQkJCQkJCWFDb2wxID0gcFJlYWRBY2MtPkdldFBpeGVsKCBuVGVtcCwgblggKTsKCgkJCQkJCQluVGVtcCA9IHBMdXRGcmFjWyBuWSBdOwoKCQkJCQkJCWxYUjEgPSBhQ29sMS5HZXRSZWQoKSAtICggbFhSMCA9IGFDb2wwLkdldFJlZCgpICk7CgkJCQkJCQlsWEcxID0gYUNvbDEuR2V0R3JlZW4oKSAtICggbFhHMCA9IGFDb2wwLkdldEdyZWVuKCkgKTsKCQkJCQkJCWxYQjEgPSBhQ29sMS5HZXRCbHVlKCkgLSAoIGxYQjAgPSBhQ29sMC5HZXRCbHVlKCkgKTsKCgkJCQkJCQlhQ29sMC5TZXRSZWQoIChzYWxfdUludDgpICggKCBsWFIxICogblRlbXAgKyAoIGxYUjAgPDwgMTAgKSApID4+IDEwICkgKTsKCQkJCQkJCWFDb2wwLlNldEdyZWVuKCAoc2FsX3VJbnQ4KSAoICggbFhHMSAqIG5UZW1wICsgKCBsWEcwIDw8IDEwICkgKSA+PiAxMCApICk7CgkJCQkJCQlhQ29sMC5TZXRCbHVlKCAoc2FsX3VJbnQ4KSAoICggbFhCMSAqIG5UZW1wICsgKCBsWEIwIDw8IDEwICkgKSA+PiAxMCApICk7CgoJCQkJCQkJcFdyaXRlQWNjLT5TZXRQaXhlbCggblksIG5YLCBhQ29sMCApOwoJCQkJCQl9CgkJCQkJfQoJCQkJfQoKCQkJCWRlbGV0ZVtdIHBMdXRJbnQ7CgkJCQlkZWxldGVbXSBwTHV0RnJhYzsKCQkJCWJSZXQgPSBzYWxfVHJ1ZTsKCQkJfQoKCQkJUmVsZWFzZUFjY2VzcyggcFJlYWRBY2MgKTsKCQkJYU5ld0JtcC5SZWxlYXNlQWNjZXNzKCBwV3JpdGVBY2MgKTsKCgkJCWlmKCBiUmV0ICkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgYU9yaWdpbmFsLkltcGxBZGFwdEJpdENvdW50KGFOZXdCbXApOwoJCQkJKnRoaXMgPSBhTmV3Qm1wOwogICAgICAgICAgICB9CgkJfQoJfQoKCWlmKCAhYlJldCApCiAgICB7CgkJYlJldCA9IEltcGxTY2FsZUZhc3QoIHJTY2FsZVgsIHJTY2FsZVkgKTsKICAgIH0KCglyZXR1cm4gYlJldDsKfQoKLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vICMxMjEyMzMjIEFkZGVkIEJNUF9TQ0FMRV9TVVBFUiBmcm9tIHN5bXBob255IGNvZGUKCnNhbF9Cb29sIEJpdG1hcDo6SW1wbFNjYWxlU3VwZXIoIAogICAgY29uc3QgZG91YmxlJiByU2NhbGVYLCAKICAgIGNvbnN0IGRvdWJsZSYgclNjYWxlWSApCnsKCWNvbnN0IFNpemUJYVNpemVQaXgoIEdldFNpemVQaXhlbCgpICk7Cglib29sICAgYkhNaXJyID0gKCByU2NhbGVYIDwgMCApOwogICAgYm9vbCAgIGJWTWlyciA9ICggclNjYWxlWSA8IDAgKTsKICAgIGRvdWJsZSBzY2FsZVggPSBiSE1pcnIgPyAtclNjYWxlWCA6IHJTY2FsZVg7CiAgICBkb3VibGUgc2NhbGVZID0gYlZNaXJyID8gLXJTY2FsZVkgOiByU2NhbGVZOwoJY29uc3QgbG9uZwluRHN0VyA9IEZSb3VuZCggYVNpemVQaXguV2lkdGgoKSAqIHNjYWxlWCApOwoJY29uc3QgbG9uZwluRHN0SCA9IEZSb3VuZCggYVNpemVQaXguSGVpZ2h0KCkgKiBzY2FsZVkgKTsKCWNvbnN0IGRvdWJsZSBmU2NhbGVUaHJlc2ggPSAwLjY7Cglib29sIGJSZXQgPSBmYWxzZTsKCQoJaWYoICggbkRzdFcgPiAxTCApICYmICggbkRzdEggPiAxTCApICkKCXsKCQlCaXRtYXBDb2xvcgkJCWFDb2wwLCBhQ29sMSwgYUNvbFJlczsKCQlCaXRtYXBSZWFkQWNjZXNzKglwQWNjID0gQWNxdWlyZVJlYWRBY2Nlc3MoKTsKCQlsb25nCQkJCW5XID0gcEFjYy0+V2lkdGgoKSA7CgkJbG9uZwkJCQluSCA9IHBBY2MtPkhlaWdodCgpIDsKCQlCaXRtYXAJCQkJYU91dEJtcCggU2l6ZSggbkRzdFcsIG5Ec3RIICksIDI0ICk7CgkJQml0bWFwV3JpdGVBY2Nlc3MqCXBXQWNjID0gYU91dEJtcC5BY3F1aXJlV3JpdGVBY2Nlc3MoKTsKCQlsb25nKgkJCSAgICBwTWFwSVggPSBuZXcgbG9uZ1sgbkRzdFcgXTsKCQlsb25nKgkJCSAgICBwTWFwSVkgPSBuZXcgbG9uZ1sgbkRzdEggXTsKCQlsb25nKgkJCSAgICBwTWFwRlggPSBuZXcgbG9uZ1sgbkRzdFcgXTsKCQlsb25nKgkJCSAgICBwTWFwRlkgPSBuZXcgbG9uZ1sgbkRzdEggXTsKCQlsb25nCQkJCW5YLCBuWSwgblhEc3QsIG5ZRHN0OzsKCQlkb3VibGUJCQkJZlRlbXA7CgkJbG9uZwkJCQluVGVtcCAsIG5UZW1wWCwgblRlbXBZLCBuVGVtcEZYLCBuVGVtcEZZOwoJCXNhbF91SW50OCAgICAgICAgICAgY1IwLCBjRzAsIGNCMCwgY1IxLCBjRzEsIGNCMTsKCQlsb25nICAgICAgICAgICAgICAgIG5TdGFydFggPSAwICwgblN0YXJ0WSA9IDA7CgkJbG9uZyAgICAgICAgICAgICAgICBuRW5kWCA9IG5Ec3RXIC0gMUw7CgkJbG9uZyAgICAgICAgICAgICAgICBuRW5kWSA9IG5Ec3RIIC0gMUw7CgkJbG9uZwkJICAgICAgICBuTWF4ID0gMSA8PCA3TDsKCQkKCQlpZiggcEFjYyAmJiBwV0FjYyApCgkJewogICAgICAgICAgICBjb25zdCBkb3VibGUJZlJldlNjYWxlWCA9ICggbkRzdFcgPiAxTCApID8gKCAoZG91YmxlKSAoIG5XIC0gMSApIC8gKCBuRHN0VyAtIDEgKSApIDogMC4wOwogICAgICAgICAgICBjb25zdCBkb3VibGUJZlJldlNjYWxlWSA9ICggbkRzdEggPiAxTCApID8gKCAoZG91YmxlKSAoIG5IIC0gMSApIC8gKCBuRHN0SCAtIDEgKSApIDogMC4wOwoJCQkKICAgICAgICAgICAgLy8gY3JlYXRlIGhvcml6b250YWwgbWFwcGluZyB0YWJsZQogICAgICAgICAgICBmb3IoIG5YID0gMEwsIG5UZW1wWCA9IG5XIC0gMUwsIG5UZW1wID0gblcgLSAyTDsgblggPCBuRHN0VzsgblgrKyApCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGZUZW1wID0gblggKiBmUmV2U2NhbGVYOwoJCQkJCiAgICAgICAgICAgICAgICBpZiggYkhNaXJyICkKICAgICAgICAgICAgICAgICAgICBmVGVtcCA9IG5UZW1wWCAtIGZUZW1wOwoJCQkJCiAgICAgICAgICAgICAgICBwTWFwRlhbIG5YIF0gPSAobG9uZykgKCAoIGZUZW1wIC0gKCBwTWFwSVhbIG5YIF0gPSBNaW5NYXgoIChsb25nKSBmVGVtcCwgMCwgblRlbXAgKSApICkgKiAxMjguICk7CiAgICAgICAgICAgIH0KCQkJCiAgICAgICAgICAgIC8vIGNyZWF0ZSB2ZXJ0aWNhbCBtYXBwaW5nIHRhYmxlCiAgICAgICAgICAgIGZvciggblkgPSAwTCwgblRlbXBZID0gbkggLSAxTCwgblRlbXAgPSBuSCAtIDJMOyBuWSA8IG5Ec3RIOyBuWSsrICkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgZlRlbXAgPSBuWSAqIGZSZXZTY2FsZVk7CgkJCQkKICAgICAgICAgICAgICAgIGlmKCBiVk1pcnIgKQogICAgICAgICAgICAgICAgICAgIGZUZW1wID0gblRlbXBZIC0gZlRlbXA7CgkJCQkKICAgICAgICAgICAgICAgIHBNYXBGWVsgblkgXSA9IChsb25nKSAoICggZlRlbXAgLSAoIHBNYXBJWVsgblkgXSA9IE1pbk1heCggKGxvbmcpIGZUZW1wLCAwLCBuVGVtcCApICkgKSAqIDEyOC4gKTsKICAgICAgICAgICAgfQoJCQkKCQkJaWYoIHBBY2MtPkhhc1BhbGV0dGUoKSApCgkJCXsKCQkJCWlmKCBwQWNjLT5HZXRTY2FubGluZUZvcm1hdCgpID09IEJNUF9GT1JNQVRfOEJJVF9QQUwgKQoJCQkJewoJCQkJCWlmKCBzY2FsZVggPj0gZlNjYWxlVGhyZXNoICYmIHNjYWxlWSA+PSBmU2NhbGVUaHJlc2ggKQoJCQkJCXsKCQkJCQkJU2NhbmxpbmUgcExpbmUwLCBwTGluZTE7CgkJCQkJCQoJCQkJCQlmb3IoIG5ZID0gblN0YXJ0WSwgbllEc3QgPSAwTDsgblkgPD0gbkVuZFk7IG5ZKyssIG5ZRHN0KysgKQoJCQkJCQl7CgkJCQkJCQluVGVtcFkgPSBwTWFwSVlbIG5ZIF07IG5UZW1wRlkgPSBwTWFwRllbIG5ZIF07CgkJCQkJCQlwTGluZTAgPSBwQWNjLT5HZXRTY2FubGluZSggblRlbXBZICk7CgkJCQkJCQlwTGluZTEgPSBwQWNjLT5HZXRTY2FubGluZSggKytuVGVtcFkgKTsKCQkJCQkJCQoJCQkJCQkJZm9yKCBuWCA9IG5TdGFydFgsIG5YRHN0ID0gMEw7IG5YIDw9IG5FbmRYOyBuWCsrICkKCQkJCQkJCXsKCQkJCQkJCQluVGVtcFggPSBwTWFwSVhbIG5YIF07IG5UZW1wRlggPSBwTWFwRlhbIG5YIF07CgkJCQkJCQkJCgkJCQkJCQkJY29uc3QgQml0bWFwQ29sb3ImIHJDb2wwID0gcEFjYy0+R2V0UGFsZXR0ZUNvbG9yKCBwTGluZTBbIG5UZW1wWCBdICk7CgkJCQkJCQkJY29uc3QgQml0bWFwQ29sb3ImIHJDb2wyID0gcEFjYy0+R2V0UGFsZXR0ZUNvbG9yKCBwTGluZTFbIG5UZW1wWCBdICk7CgkJCQkJCQkJY29uc3QgQml0bWFwQ29sb3ImIHJDb2wxID0gcEFjYy0+R2V0UGFsZXR0ZUNvbG9yKCBwTGluZTBbICsrblRlbXBYIF0gKTsKCQkJCQkJCQljb25zdCBCaXRtYXBDb2xvciYgckNvbDMgPSBwQWNjLT5HZXRQYWxldHRlQ29sb3IoIHBMaW5lMVsgblRlbXBYIF0gKTsKCQkJCQkJCQkKCQkJCQkJCQljUjAgPSBNQVAoIHJDb2wwLkdldFJlZCgpLCByQ29sMS5HZXRSZWQoKSwgblRlbXBGWCApOwoJCQkJCQkJCWNHMCA9IE1BUCggckNvbDAuR2V0R3JlZW4oKSwgckNvbDEuR2V0R3JlZW4oKSwgblRlbXBGWCApOwoJCQkJCQkJCWNCMCA9IE1BUCggckNvbDAuR2V0Qmx1ZSgpLCByQ29sMS5HZXRCbHVlKCksIG5UZW1wRlggKTsKCQkJCQkJCQkKCQkJCQkJCQljUjEgPSBNQVAoIHJDb2wyLkdldFJlZCgpLCByQ29sMy5HZXRSZWQoKSwgblRlbXBGWCApOwoJCQkJCQkJCWNHMSA9IE1BUCggckNvbDIuR2V0R3JlZW4oKSwgckNvbDMuR2V0R3JlZW4oKSwgblRlbXBGWCApOwoJCQkJCQkJCWNCMSA9IE1BUCggckNvbDIuR2V0Qmx1ZSgpLCByQ29sMy5HZXRCbHVlKCksIG5UZW1wRlggKTsKCQkJCQkJCQkKCQkJCQkJCQlhQ29sUmVzLlNldFJlZCggTUFQKCBjUjAsIGNSMSwgblRlbXBGWSApICk7CgkJCQkJCQkJYUNvbFJlcy5TZXRHcmVlbiggTUFQKCBjRzAsIGNHMSwgblRlbXBGWSApICk7CgkJCQkJCQkJYUNvbFJlcy5TZXRCbHVlKCBNQVAoIGNCMCwgY0IxLCBuVGVtcEZZICkgKTsKCQkJCQkJCQlwV0FjYy0+U2V0UGl4ZWwoIG5ZRHN0LCBuWERzdCsrLCBhQ29sUmVzICk7CgkJCQkJCQl9CgkJCQkJCX0KCQkJCQl9CgkJCQkJZWxzZQoJCQkJCXsKCQkJCQkJU2NhbmxpbmUJcFRtcFk7CgkJCQkJCWxvbmcJCW5TdW1SLCBuU3VtRywgblN1bUIsbkxpbmVTdGFydCAsIG5MaW5lUmFuZ2UsIG5Sb3dTdGFydCAsIG5Sb3dSYW5nZSA7CgkJCQkJCWxvbmcJCW5MZWZ0LCBuUmlnaHQsIG5Ub3AsIG5Cb3R0b20sIG5XZWlnaHRYLCBuV2VpZ2h0WSA7CgkJCQkJCWxvbmcJCW5TdW1Sb3dSICxuU3VtUm93RyxuU3VtUm93QiwgblRvdGFsV2VpZ2h0WCwgblRvdGFsV2VpZ2h0WTsKCQkJCQkJCgkJCQkJCWZvciggblkgPSBuU3RhcnRZICwgbllEc3QgPSAwTDsgblkgPD0gbkVuZFk7IG5ZKyssIG5ZRHN0KysgKQoJCQkJCQl7CgkJCQkJCQluVG9wID0gYlZNaXJyID8gKCBuWSArIDEgKSA6IG5ZOwoJCQkJCQkJbkJvdHRvbSA9IGJWTWlyciA/IG5ZIDogKCBuWSArIDEgKSA7CgkJCQkJCQkKCQkJCQkJCWlmKCBuWSA9PW5FbmRZICkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKCQkJCQkJCQluTGluZVN0YXJ0ID0gcE1hcElZWyBuWSBdOwoJCQkJCQkJCW5MaW5lUmFuZ2UgPSAwOwoJCQkJCQkJfQoJCQkJCQkJZWxzZQoJCQkJCQkJewoJCQkJCQkJCW5MaW5lU3RhcnQgPSBwTWFwSVlbIG5Ub3AgXSA7CgkJCQkJCQkJbkxpbmVSYW5nZSA9ICggcE1hcElZWyBuQm90dG9tIF0gPT0gcE1hcElZWyBuVG9wIF0gKSA/IDEgOiggcE1hcElZWyBuQm90dG9tIF0gLSBwTWFwSVlbIG5Ub3AgXSApOwoJCQkJCQkJfQoJCQkJCQkJCgkJCQkJCQlmb3IoIG5YID0gblN0YXJ0WCAsIG5YRHN0ID0gMEw7IG5YIDw9IG5FbmRYOyBuWCsrICkKCQkJCQkJCXsKCQkJCQkJCQluTGVmdCA9IGJITWlyciA/ICggblggKyAxICkgOiBuWDsKCQkJCQkJCQluUmlnaHQgPSBiSE1pcnIgPyBuWCA6ICggblggKyAxICkgOwoJCQkJCQkJCQoJCQkJCQkJCWlmKCBuWCA9PSBuRW5kWCApCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewoJCQkJCQkJCQluUm93U3RhcnQgPSBwTWFwSVhbIG5YIF07CgkJCQkJCQkJCW5Sb3dSYW5nZSA9IDA7CgkJCQkJCQkJfQoJCQkJCQkJCWVsc2UKCQkJCQkJCQl7CgkJCQkJCQkJCW5Sb3dTdGFydCA9IHBNYXBJWFsgbkxlZnQgXTsKCQkJCQkJCQkJblJvd1JhbmdlID0gKCBwTWFwSVhbIG5SaWdodCBdID09IHBNYXBJWFsgbkxlZnQgXSApPyAxIDogKCBwTWFwSVhbIG5SaWdodCBdIC0gcE1hcElYWyBuTGVmdCBdICk7CgkJCQkJCQkJfQoJCQkJCQkJCQoJCQkJCQkJCW5TdW1SID0gblN1bUcgPSBuU3VtQiA9IDA7CgkJCQkJCQkJblRvdGFsV2VpZ2h0WSA9IDA7CgkJCQkJCQkJCgkJCQkJCQkJZm9yKGludCBpID0gMDsgaTw9IG5MaW5lUmFuZ2U7IGkrKykKCQkJCQkJCQl7CgkJCQkJCQkJCXBUbXBZID0gcEFjYy0+R2V0U2NhbmxpbmUoIG5MaW5lU3RhcnQgKyBpICk7CgkJCQkJCQkJCW5TdW1Sb3dSID0gblN1bVJvd0cgPSBuU3VtUm93QiA9IDA7CgkJCQkJCQkJCW5Ub3RhbFdlaWdodFggPSAwOwoJCQkJCQkJCQkKCQkJCQkJCQkJZm9yKGludCBqID0gMDsgaiA8PSBuUm93UmFuZ2U7IGorKykKCQkJCQkJCQkJewoJCQkJCQkJCQkJY29uc3QgQml0bWFwQ29sb3ImIHJDb2wgPSBwQWNjLT5HZXRQYWxldHRlQ29sb3IoIHBUbXBZWyBuUm93U3RhcnQgKyBqIF0gKTsKCQkJCQkJCQkJCQoJCQkJCQkJCQkJaWYoblggPT0gbkVuZFggKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewoJCQkJCQkJCQkJCW5TdW1Sb3dCICs9IHJDb2wuR2V0Qmx1ZSgpIDw8IDdMOwoJCQkJCQkJCQkJCW5TdW1Sb3dHICs9IHJDb2wuR2V0R3JlZW4oKSA8PCA3TDsKCQkJCQkJCQkJCQluU3VtUm93UiArPSByQ29sLkdldFJlZCgpIDw8IDdMOwoJCQkJCQkJCQkJCW5Ub3RhbFdlaWdodFggKz0gMSA8PCA3TDsKCQkJCQkJCQkJCX0KCQkJCQkJCQkJCWVsc2UgaWYoIGogPT0gMCApCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CgkJCQkJCQkJCQkJbldlaWdodFggPSAobk1heC0gcE1hcEZYWyBuTGVmdCBdKSA7CgkJCQkJCQkJCQkJblN1bVJvd0IgKz0gKCBuV2VpZ2h0WCAqckNvbC5HZXRCbHVlKCkpIDsKCQkJCQkJCQkJCQluU3VtUm93RyArPSAoIG5XZWlnaHRYICpyQ29sLkdldEdyZWVuKCkpIDsKCQkJCQkJCQkJCQluU3VtUm93UiArPSAoIG5XZWlnaHRYICpyQ29sLkdldFJlZCgpKSA7CgkJCQkJCQkJCQkJblRvdGFsV2VpZ2h0WCArPSBuV2VpZ2h0WDsKCQkJCQkJCQkJCX0KCQkJCQkJCQkJCWVsc2UgaWYgKCBuUm93UmFuZ2UgPT0gaiApCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CgkJCQkJCQkJCQkJbldlaWdodFggPSBwTWFwRlhbIG5SaWdodCBdIDsKCQkJCQkJCQkJCQluU3VtUm93QiArPSAoIG5XZWlnaHRYICpyQ29sLkdldEJsdWUoKSApOwoJCQkJCQkJCQkJCW5TdW1Sb3dHICs9ICggbldlaWdodFggKnJDb2wuR2V0R3JlZW4oKSApOwoJCQkJCQkJCQkJCW5TdW1Sb3dSICs9ICggbldlaWdodFggKnJDb2wuR2V0UmVkKCkgKTsKCQkJCQkJCQkJCQluVG90YWxXZWlnaHRYICs9IG5XZWlnaHRYOwoJCQkJCQkJCQkJfQoJCQkJCQkJCQkJZWxzZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewoJCQkJCQkJCQkJCW5TdW1Sb3dCICs9IHJDb2wuR2V0Qmx1ZSgpIDw8IDdMOwoJCQkJCQkJCQkJCW5TdW1Sb3dHICs9IHJDb2wuR2V0R3JlZW4oKSA8PCA3TDsKCQkJCQkJCQkJCQluU3VtUm93UiArPSByQ29sLkdldFJlZCgpIDw8IDdMOwoJCQkJCQkJCQkJCW5Ub3RhbFdlaWdodFggKz0gMSA8PCA3TDsKCQkJCQkJCQkJCX0KCQkJCQkJCQkJfQoJCQkJCQkJCQkKCQkJCQkJCQkJaWYoIG5ZID09IG5FbmRZICkKCQkJCQkJCQkJCW5XZWlnaHRZID0gbk1heDsKCQkJCQkJCQkJZWxzZSBpZiggaSA9PSAwICkKCQkJCQkJCQkJCW5XZWlnaHRZID0gbk1heCAtIHBNYXBGWVsgblRvcCBdOwoJCQkJCQkJCQllbHNlIGlmKCBuTGluZVJhbmdlID09IDEgKQoJCQkJCQkJCQkJbldlaWdodFkgPSBwTWFwRllbIG5Ub3AgXTsKCQkJCQkJCQkJZWxzZSBpZiAoIG5MaW5lUmFuZ2UgPT0gaSApCgkJCQkJCQkJCQluV2VpZ2h0WSA9IHBNYXBGWVsgbkJvdHRvbSBdOwoJCQkJCQkJCQllbHNlCgkJCQkJCQkJCQluV2VpZ2h0WSA9IG5NYXg7CgkJCQkJCQkJCQoJCQkJCQkJCQluU3VtQiArPSBuV2VpZ2h0WSAqICggblN1bVJvd0IgLyBuVG90YWxXZWlnaHRYICk7CgkJCQkJCQkJCW5TdW1HICs9IG5XZWlnaHRZICogKCBuU3VtUm93RyAvIG5Ub3RhbFdlaWdodFggKTsKCQkJCQkJCQkJblN1bVIgKz0gbldlaWdodFkgKiAoIG5TdW1Sb3dSIC8gblRvdGFsV2VpZ2h0WCApOwoJCQkJCQkJCQluVG90YWxXZWlnaHRZICs9IG5XZWlnaHRZOwoJCQkJCQkJCX0KCQkJCQkJCQkKCQkJCQkJCQlhQ29sUmVzLlNldFJlZCggKCBzYWxfdUludDggKSAoKCBuU3VtUiAvIG5Ub3RhbFdlaWdodFkgKSApKTsKCQkJCQkJCQlhQ29sUmVzLlNldEdyZWVuKCAoIHNhbF91SW50OCApICgoIG5TdW1HIC8gblRvdGFsV2VpZ2h0WSkgKSk7CgkJCQkJCQkJYUNvbFJlcy5TZXRCbHVlKCAoIHNhbF91SW50OCApICgoIG5TdW1CIC8gblRvdGFsV2VpZ2h0WSApICkpOwoJCQkJCQkJCXBXQWNjLT5TZXRQaXhlbCggbllEc3QsIG5YRHN0KyssIGFDb2xSZXMgKTsKCQkJCQkJCQkKCQkJCQkJCX0KICAgIAkJCQkJfQoJCQkJCX0KfQoJCQkJZWxzZQoJCQkJewoJCQkJCWlmKCBzY2FsZVggPj0gZlNjYWxlVGhyZXNoICYmIHNjYWxlWSA+PSBmU2NhbGVUaHJlc2ggKQoJCQkJCXsKCQkJCQkJZm9yKCBuWSA9IG5TdGFydFksIG5ZRHN0ID0gMEw7IG5ZIDw9IG5FbmRZOyBuWSsrLCBuWURzdCsrICkKCQkJCQkJewoJCQkJCQkJblRlbXBZID0gcE1hcElZWyBuWSBdLCBuVGVtcEZZID0gcE1hcEZZWyBuWSBdOwoJCQkJCQkJCgkJCQkJCQlmb3IoIG5YID0gblN0YXJ0WCwgblhEc3QgPSAwTDsgblggPD0gbkVuZFg7IG5YKysgKQoJCQkJCQkJewoJCQkJCQkJCW5UZW1wWCA9IHBNYXBJWFsgblggXTsgblRlbXBGWCA9IHBNYXBGWFsgblggXTsKCQkJCQkJCQkKCQkJCQkJCQlhQ29sMCA9IHBBY2MtPkdldFBhbGV0dGVDb2xvciggcEFjYy0+R2V0UGl4ZWxJbmRleCggblRlbXBZLCBuVGVtcFggKSApOwoJCQkJCQkJCWFDb2wxID0gcEFjYy0+R2V0UGFsZXR0ZUNvbG9yKCBwQWNjLT5HZXRQaXhlbEluZGV4KCBuVGVtcFksICsrblRlbXBYICkgKTsKCQkJCQkJCQljUjAgPSBNQVAoIGFDb2wwLkdldFJlZCgpLCBhQ29sMS5HZXRSZWQoKSwgblRlbXBGWCApOwoJCQkJCQkJCWNHMCA9IE1BUCggYUNvbDAuR2V0R3JlZW4oKSwgYUNvbDEuR2V0R3JlZW4oKSwgblRlbXBGWCApOwoJCQkJCQkJCWNCMCA9IE1BUCggYUNvbDAuR2V0Qmx1ZSgpLCBhQ29sMS5HZXRCbHVlKCksIG5UZW1wRlggKTsKCQkJCQkJCQkKCQkJCQkJCQlhQ29sMSA9IHBBY2MtPkdldFBhbGV0dGVDb2xvciggcEFjYy0+R2V0UGl4ZWxJbmRleCggKytuVGVtcFksIG5UZW1wWCApICk7CgkJCQkJCQkJYUNvbDAgPSBwQWNjLT5HZXRQYWxldHRlQ29sb3IoIHBBY2MtPkdldFBpeGVsSW5kZXgoIG5UZW1wWS0tLCAtLW5UZW1wWCApICk7CgkJCQkJCQkJY1IxID0gTUFQKCBhQ29sMC5HZXRSZWQoKSwgYUNvbDEuR2V0UmVkKCksIG5UZW1wRlggKTsKCQkJCQkJCQljRzEgPSBNQVAoIGFDb2wwLkdldEdyZWVuKCksIGFDb2wxLkdldEdyZWVuKCksIG5UZW1wRlggKTsKCQkJCQkJCQljQjEgPSBNQVAoIGFDb2wwLkdldEJsdWUoKSwgYUNvbDEuR2V0Qmx1ZSgpLCBuVGVtcEZYICk7CgkJCQkJCQkJCgkJCQkJCQkJYUNvbFJlcy5TZXRSZWQoIE1BUCggY1IwLCBjUjEsIG5UZW1wRlkgKSApOwoJCQkJCQkJCWFDb2xSZXMuU2V0R3JlZW4oIE1BUCggY0cwLCBjRzEsIG5UZW1wRlkgKSApOwoJCQkJCQkJCWFDb2xSZXMuU2V0Qmx1ZSggTUFQKCBjQjAsIGNCMSwgblRlbXBGWSApICk7CgkJCQkJCQkJcFdBY2MtPlNldFBpeGVsKCBuWURzdCwgblhEc3QrKywgYUNvbFJlcyApOwoJCQkJCQkJfQoJCQkJCQl9CgkJCQkJCQoJCQkJCX0KCQkJCQllbHNlCgkJCQkJewoJCQkJCQlsb25nCQluU3VtUiwgblN1bUcsIG5TdW1CLG5MaW5lU3RhcnQgLCBuTGluZVJhbmdlLCBuUm93U3RhcnQgLCBuUm93UmFuZ2UgOwoJCQkJCQlsb25nCQluTGVmdCwgblJpZ2h0LCBuVG9wLCBuQm90dG9tLCBuV2VpZ2h0WCwgbldlaWdodFkgOwoJCQkJCQlsb25nCQluU3VtUm93UiAsblN1bVJvd0csblN1bVJvd0IsIG5Ub3RhbFdlaWdodFgsIG5Ub3RhbFdlaWdodFk7CgkJCQkJCQoJCQkJCQlmb3IoIG5ZID0gblN0YXJ0WSAsIG5ZRHN0ID0gMEw7IG5ZIDw9IG5FbmRZOyBuWSsrLCBuWURzdCsrICkKCQkJCQkJewoJCQkJCQkJblRvcCA9IGJWTWlyciA/ICggblkgKyAxICkgOiBuWTsKCQkJCQkJCW5Cb3R0b20gPSBiVk1pcnIgPyBuWSA6ICggblkgKyAxICkgOwoJCQkJCQkJCgkJCQkJCQlpZiggblkgPT1uRW5kWSApCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CgkJCQkJCQkJbkxpbmVTdGFydCA9IHBNYXBJWVsgblkgXTsKCQkJCQkJCQluTGluZVJhbmdlID0gMDsKCQkJCQkJCX0KCQkJCQkJCWVsc2UKCQkJCQkJCXsKCQkJCQkJCQluTGluZVN0YXJ0ID0gcE1hcElZWyBuVG9wIF0gOwoJCQkJCQkJCW5MaW5lUmFuZ2UgPSAoIHBNYXBJWVsgbkJvdHRvbSBdID09IHBNYXBJWVsgblRvcCBdICkgPyAxIDooIHBNYXBJWVsgbkJvdHRvbSBdIC0gcE1hcElZWyBuVG9wIF0gKTsKCQkJCQkJCX0KCQkJCQkJCQoJCQkJCQkJZm9yKCBuWCA9IG5TdGFydFggLCBuWERzdCA9IDBMOyBuWCA8PSBuRW5kWDsgblgrKyApCgkJCQkJCQl7CgkJCQkJCQkJbkxlZnQgPSBiSE1pcnIgPyAoIG5YICsgMSApIDogblg7CgkJCQkJCQkJblJpZ2h0ID0gYkhNaXJyID8gblggOiAoIG5YICsgMSApIDsKCQkJCQkJCQkKCQkJCQkJCQlpZiggblggPT0gbkVuZFggKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKCQkJCQkJCQkJblJvd1N0YXJ0ID0gcE1hcElYWyBuWCBdOwoJCQkJCQkJCQluUm93UmFuZ2UgPSAwOwoJCQkJCQkJCX0KCQkJCQkJCQllbHNlCgkJCQkJCQkJewoJCQkJCQkJCQluUm93U3RhcnQgPSBwTWFwSVhbIG5MZWZ0IF07CgkJCQkJCQkJCW5Sb3dSYW5nZSA9ICggcE1hcElYWyBuUmlnaHQgXSA9PSBwTWFwSVhbIG5MZWZ0IF0gKT8gMSA6ICggcE1hcElYWyBuUmlnaHQgXSAtIHBNYXBJWFsgbkxlZnQgXSApOwoJCQkJCQkJCX0KCQkJCQkJCQkKCQkJCQkJCQluU3VtUiA9IG5TdW1HID0gblN1bUIgPSAwOwoJCQkJCQkJCW5Ub3RhbFdlaWdodFkgPSAwOwoJCQkJCQkJCQoJCQkJCQkJCWZvcihpbnQgaSA9IDA7IGk8PSBuTGluZVJhbmdlOyBpKyspCgkJCQkJCQkJewoJCQkJCQkJCQluU3VtUm93UiA9IG5TdW1Sb3dHID0gblN1bVJvd0IgPSAwOwoJCQkJCQkJCQluVG90YWxXZWlnaHRYID0gMDsKCQkJCQkJCQkJCgkJCQkJCQkJCWZvcihpbnQgaiA9IDA7IGogPD0gblJvd1JhbmdlOyBqKyspCgkJCQkJCQkJCXsKCQkJCQkJCQkJCWFDb2wwID0gcEFjYy0+R2V0UGFsZXR0ZUNvbG9yICggcEFjYy0+R2V0UGl4ZWxJbmRleCggbkxpbmVTdGFydCArIGksIG5Sb3dTdGFydCArIGogKSApOwoJCQkJCQkJCQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoblggPT0gbkVuZFggKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewoJCQkJCQkJCQkJCQoJCQkJCQkJCQkJCW5TdW1Sb3dCICs9IGFDb2wwLkdldEJsdWUoKSA8PCA3TDsKCQkJCQkJCQkJCQluU3VtUm93RyArPSBhQ29sMC5HZXRHcmVlbigpIDw8IDdMOwoJCQkJCQkJCQkJCW5TdW1Sb3dSICs9IGFDb2wwLkdldFJlZCgpIDw8IDdMOwoJCQkJCQkJCQkJCW5Ub3RhbFdlaWdodFggKz0gMSA8PCA3TDsKCQkJCQkJCQkJCX0KCQkJCQkJCQkJCWVsc2UgaWYoIGogPT0gMCApCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CgkJCQkJCQkJCQkJCgkJCQkJCQkJCQkJbldlaWdodFggPSAobk1heC0gcE1hcEZYWyBuTGVmdCBdKSA7CgkJCQkJCQkJCQkJblN1bVJvd0IgKz0gKCBuV2VpZ2h0WCAqYUNvbDAuR2V0Qmx1ZSgpKSA7CgkJCQkJCQkJCQkJblN1bVJvd0cgKz0gKCBuV2VpZ2h0WCAqYUNvbDAuR2V0R3JlZW4oKSkgOwoJCQkJCQkJCQkJCW5TdW1Sb3dSICs9ICggbldlaWdodFggKmFDb2wwLkdldFJlZCgpKSA7CgkJCQkJCQkJCQkJblRvdGFsV2VpZ2h0WCArPSBuV2VpZ2h0WDsKCQkJCQkJCQkJCX0KCQkJCQkJCQkJCWVsc2UgaWYgKCBuUm93UmFuZ2UgPT0gaiApCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CgkJCQkJCQkJCQkJCgkJCQkJCQkJCQkJbldlaWdodFggPSBwTWFwRlhbIG5SaWdodCBdIDsKCQkJCQkJCQkJCQluU3VtUm93QiArPSAoIG5XZWlnaHRYICphQ29sMC5HZXRCbHVlKCkgKTsKCQkJCQkJCQkJCQluU3VtUm93RyArPSAoIG5XZWlnaHRYICphQ29sMC5HZXRHcmVlbigpICk7CgkJCQkJCQkJCQkJblN1bVJvd1IgKz0gKCBuV2VpZ2h0WCAqYUNvbDAuR2V0UmVkKCkgKTsKCQkJCQkJCQkJCQluVG90YWxXZWlnaHRYICs9IG5XZWlnaHRYOwoJCQkJCQkJCQkJfQoJCQkJCQkJCQkJZWxzZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewoJCQkJCQkJCQkJCQoJCQkJCQkJCQkJCW5TdW1Sb3dCICs9IGFDb2wwLkdldEJsdWUoKSA8PCA3TDsKCQkJCQkJCQkJCQluU3VtUm93RyArPSBhQ29sMC5HZXRHcmVlbigpIDw8IDdMOwoJCQkJCQkJCQkJCW5TdW1Sb3dSICs9IGFDb2wwLkdldFJlZCgpIDw8IDdMOwoJCQkJCQkJCQkJCW5Ub3RhbFdlaWdodFggKz0gMSA8PCA3TDsKCQkJCQkJCQkJCX0KCQkJCQkJCQkJfQoJCQkJCQkJCQkKCQkJCQkJCQkJaWYoIG5ZID09IG5FbmRZICkKCQkJCQkJCQkJCW5XZWlnaHRZID0gbk1heDsKCQkJCQkJCQkJZWxzZSBpZiggaSA9PSAwICkKCQkJCQkJCQkJCW5XZWlnaHRZID0gbk1heCAtIHBNYXBGWVsgblRvcCBdOwoJCQkJCQkJCQllbHNlIGlmKCBuTGluZVJhbmdlID09IDEgKQoJCQkJCQkJCQkJbldlaWdodFkgPSBwTWFwRllbIG5Ub3AgXTsKCQkJCQkJCQkJZWxzZSBpZiAoIG5MaW5lUmFuZ2UgPT0gaSApCgkJCQkJCQkJCQluV2VpZ2h0WSA9IHBNYXBGWVsgbkJvdHRvbSBdOwoJCQkJCQkJCQllbHNlCgkJCQkJCQkJCQluV2VpZ2h0WSA9IG5NYXg7CgkJCQkJCQkJCQoJCQkJCQkJCQluU3VtQiArPSBuV2VpZ2h0WSAqICggblN1bVJvd0IgLyBuVG90YWxXZWlnaHRYICk7CgkJCQkJCQkJCW5TdW1HICs9IG5XZWlnaHRZICogKCBuU3VtUm93RyAvIG5Ub3RhbFdlaWdodFggKTsKCQkJCQkJCQkJblN1bVIgKz0gbldlaWdodFkgKiAoIG5TdW1Sb3dSIC8gblRvdGFsV2VpZ2h0WCApOwoJCQkJCQkJCQluVG90YWxXZWlnaHRZICs9IG5XZWlnaHRZOwoJCQkJCQkJCX0KCQkJCQkJCQkKCQkJCQkJCQlhQ29sUmVzLlNldFJlZCggKCBzYWxfdUludDggKSAoKCBuU3VtUiAvIG5Ub3RhbFdlaWdodFkgKSApKTsKCQkJCQkJCQlhQ29sUmVzLlNldEdyZWVuKCAoIHNhbF91SW50OCApICgoIG5TdW1HIC8gblRvdGFsV2VpZ2h0WSkgKSk7CgkJCQkJCQkJYUNvbFJlcy5TZXRCbHVlKCAoIHNhbF91SW50OCApICgoIG5TdW1CIC8gblRvdGFsV2VpZ2h0WSApICkpOwoJCQkJCQkJCXBXQWNjLT5TZXRQaXhlbCggbllEc3QsIG5YRHN0KyssIGFDb2xSZXMgKTsKCQkJCQkJCX0KICAgICAgICAgICAgICAgICAgICAgICAgfQoJCQkJCX0KCQkJCX0KCQkJfQoJCQllbHNlCgkJCXsKCQkJCWlmKCBwQWNjLT5HZXRTY2FubGluZUZvcm1hdCgpID09IEJNUF9GT1JNQVRfMjRCSVRfVENfQkdSICkKCQkJCXsKCQkJCQlpZiggc2NhbGVYID49IGZTY2FsZVRocmVzaCAmJiBzY2FsZVkgPj0gZlNjYWxlVGhyZXNoICkKCQkJCQl7CgkJCQkJCVNjYW5saW5lCXBMaW5lMCwgcExpbmUxLCBwVG1wMCwgcFRtcDE7CgkJCQkJCWxvbmcJCW5PZmY7CgkJCQkJCQoJCQkJCQlmb3IoIG5ZID0gblN0YXJ0WSwgbllEc3QgPSAwTDsgblkgPD0gbkVuZFk7IG5ZKyssIG5ZRHN0KysgKQoJCQkJCQl7CgkJCQkJCQluVGVtcFkgPSBwTWFwSVlbIG5ZIF07IG5UZW1wRlkgPSBwTWFwRllbIG5ZIF07CgkJCQkJCQlwTGluZTAgPSBwQWNjLT5HZXRTY2FubGluZSggblRlbXBZICk7CgkJCQkJCQlwTGluZTEgPSBwQWNjLT5HZXRTY2FubGluZSggKytuVGVtcFkgKTsKCQogICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yKCBuWCA9IG5TdGFydFgsIG5YRHN0ID0gMEw7IG5YIDw9IG5FbmRYOyBuWCsrICkKCQkJCQkJCXsKCQkJCQkJCQluT2ZmID0gM0wgKiAoIG5UZW1wWCA9IHBNYXBJWFsgblggXSApOwoJCQkJCQkJCW5UZW1wRlggPSBwTWFwRlhbIG5YIF07CgkJCQkJCQkJCgkJCQkJCQkJcFRtcDEgPSAoIHBUbXAwID0gcExpbmUwICsgbk9mZiApICsgM0w7CgkJCQkJCQkJY0IwID0gTUFQKCAqcFRtcDAsICpwVG1wMSwgblRlbXBGWCApOyBwVG1wMCsrOyBwVG1wMSsrOwoJCQkJCQkJCWNHMCA9IE1BUCggKnBUbXAwLCAqcFRtcDEsIG5UZW1wRlggKTsgcFRtcDArKzsgcFRtcDErKzsKCQkJCQkJCQljUjAgPSBNQVAoICpwVG1wMCwgKnBUbXAxLCBuVGVtcEZYICk7CgkJCQkJCQkJCgkJCQkJCQkJcFRtcDEgPSAoIHBUbXAwID0gcExpbmUxICsgbk9mZiApICsgM0w7CgkJCQkJCQkJY0IxID0gTUFQKCAqcFRtcDAsICpwVG1wMSwgblRlbXBGWCApOyBwVG1wMCsrOyBwVG1wMSsrOwoJCQkJCQkJCWNHMSA9IE1BUCggKnBUbXAwLCAqcFRtcDEsIG5UZW1wRlggKTsgcFRtcDArKzsgcFRtcDErKzsKCQkJCQkJCQljUjEgPSBNQVAoICpwVG1wMCwgKnBUbXAxLCBuVGVtcEZYICk7CgkJCQkJCQkJCgkJCQkJCQkJYUNvbFJlcy5TZXRSZWQoIE1BUCggY1IwLCBjUjEsIG5UZW1wRlkgKSApOwoJCQkJCQkJCWFDb2xSZXMuU2V0R3JlZW4oIE1BUCggY0cwLCBjRzEsIG5UZW1wRlkgKSApOwoJCQkJCQkJCWFDb2xSZXMuU2V0Qmx1ZSggTUFQKCBjQjAsIGNCMSwgblRlbXBGWSApICk7CgkJCQkJCQkJcFdBY2MtPlNldFBpeGVsKCBuWURzdCwgblhEc3QrKywgYUNvbFJlcyApOwoJCQkJCQkJfQoJCQkJCQl9CgkJCQkJfQoJCQkJCWVsc2UKCQkJCQl7CgkJCQkJCVNjYW5saW5lCXBUbXBZLCBwVG1wWDsKCQkJCQkJbG9uZwkJblN1bVIsIG5TdW1HLCBuU3VtQixuTGluZVN0YXJ0ICwgbkxpbmVSYW5nZSwgblJvd1N0YXJ0ICwgblJvd1JhbmdlIDsKCQkJCQkJbG9uZwkJbkxlZnQsIG5SaWdodCwgblRvcCwgbkJvdHRvbSwgbldlaWdodFgsIG5XZWlnaHRZIDsKCQkJCQkJbG9uZwkJblN1bVJvd1IgLG5TdW1Sb3dHLG5TdW1Sb3dCLCBuVG90YWxXZWlnaHRYLCBuVG90YWxXZWlnaHRZOwoJCQkJCQkKCQkJCQkJZm9yKCBuWSA9IG5TdGFydFkgLCBuWURzdCA9IDBMOyBuWSA8PSBuRW5kWTsgblkrKywgbllEc3QrKyApCgkJCQkJCXsKCQkJCQkJCW5Ub3AgPSBiVk1pcnIgPyAoIG5ZICsgMSApIDogblk7CgkJCQkJCQluQm90dG9tID0gYlZNaXJyID8gblkgOiAoIG5ZICsgMSApIDsKCQkJCQkJCQoJCQkJCQkJaWYoIG5ZID09bkVuZFkgKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgewoJCQkJCQkJCW5MaW5lU3RhcnQgPSBwTWFwSVlbIG5ZIF07CgkJCQkJCQkJbkxpbmVSYW5nZSA9IDA7CgkJCQkJCQl9CgkJCQkJCQllbHNlCgkJCQkJCQl7CgkJCQkJCQkJbkxpbmVTdGFydCA9IHBNYXBJWVsgblRvcCBdIDsKCQkJCQkJCQluTGluZVJhbmdlID0gKCBwTWFwSVlbIG5Cb3R0b20gXSA9PSBwTWFwSVlbIG5Ub3AgXSApID8gMSA6KCBwTWFwSVlbIG5Cb3R0b20gXSAtIHBNYXBJWVsgblRvcCBdICk7CgkJCQkJCQl9CgkJCQkJCQkKCQkJCQkJCWZvciggblggPSBuU3RhcnRYICwgblhEc3QgPSAwTDsgblggPD0gbkVuZFg7IG5YKysgKQoJCQkJCQkJewoJCQkJCQkJCW5MZWZ0ID0gYkhNaXJyID8gKCBuWCArIDEgKSA6IG5YOwoJCQkJCQkJCW5SaWdodCA9IGJITWlyciA/IG5YIDogKCBuWCArIDEgKSA7CgkJCQkJCQkJCgkJCQkJCQkJaWYoIG5YID09IG5FbmRYICApCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewoJCQkJCQkJCQluUm93U3RhcnQgPSBwTWFwSVhbIG5YIF07CgkJCQkJCQkJCW5Sb3dSYW5nZSA9IDA7CgkJCQkJCQkJfQoJCQkJCQkJCWVsc2UKCQkJCQkJCQl7CgkJCQkJCQkJCW5Sb3dTdGFydCA9IHBNYXBJWFsgbkxlZnQgXTsKCQkJCQkJCQkJblJvd1JhbmdlID0gKCBwTWFwSVhbIG5SaWdodCBdID09IHBNYXBJWFsgbkxlZnQgXSApPyAxIDogKCBwTWFwSVhbIG5SaWdodCBdIC0gcE1hcElYWyBuTGVmdCBdICk7CgkJCQkJCQkJfQoJCQkJCQkJCQoJCQkJCQkJCW5TdW1SID0gblN1bUcgPSBuU3VtQiA9IDA7CgkJCQkJCQkJblRvdGFsV2VpZ2h0WSA9IDA7CgkJCQkJCQkJCgkJCQkJCQkJZm9yKGludCBpID0gMDsgaTw9IG5MaW5lUmFuZ2U7IGkrKykKCQkJCQkJCQl7CgkJCQkJCQkJCXBUbXBZID0gcEFjYy0+R2V0U2NhbmxpbmUoIG5MaW5lU3RhcnQgKyBpICk7CgkJCQkJCQkJCXBUbXBYID0gcFRtcFkgKyAzTCAqIG5Sb3dTdGFydDsKCQkJCQkJCQkJblN1bVJvd1IgPSBuU3VtUm93RyA9IG5TdW1Sb3dCID0gMDsKCQkJCQkJCQkJblRvdGFsV2VpZ2h0WCA9IDA7CgkJCQkJCQkJCQoJCQkJCQkJCQlmb3IoaW50IGogPSAwOyBqIDw9IG5Sb3dSYW5nZTsgaisrKQoJCQkJCQkJCQl7CgkJCQkJCQkJCQlpZihuWCA9PSBuRW5kWCApCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CgkJCQkJCQkJCQkJblN1bVJvd0IgKz0gKCAqcFRtcFggKSA8PCA3TDtwVG1wWCsrOwkKCQkJCQkJCQkJCQluU3VtUm93RyArPSAoICpwVG1wWCApIDw8IDdMO3BUbXBYKys7CQoJCQkJCQkJCQkJCW5TdW1Sb3dSICs9ICggKnBUbXBYICkgPDwgN0w7cFRtcFgrKzsJCgkJCQkJCQkJCQkJblRvdGFsV2VpZ2h0WCArPSAxIDw8IDdMOwoJCQkJCQkJCQkJfQoJCQkJCQkJCQkJZWxzZSBpZiggaiA9PSAwICkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKCQkJCQkJCQkJCQluV2VpZ2h0WCA9IChuTWF4LSBwTWFwRlhbIG5MZWZ0IF0pIDsKCQkJCQkJCQkJCQluU3VtUm93QiArPSAoIG5XZWlnaHRYICooICpwVG1wWCApKSA7cFRtcFgrKzsKCQkJCQkJCQkJCQluU3VtUm93RyArPSAoIG5XZWlnaHRYICooICpwVG1wWCApKSA7cFRtcFgrKzsKCQkJCQkJCQkJCQluU3VtUm93UiArPSAoIG5XZWlnaHRYICooICpwVG1wWCApKSA7cFRtcFgrKzsKCQkJCQkJCQkJCQluVG90YWxXZWlnaHRYICs9IG5XZWlnaHRYOwoJCQkJCQkJCQkJfQoJCQkJCQkJCQkJZWxzZSBpZiAoIG5Sb3dSYW5nZSA9PSBqICkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKCQkJCQkJCQkJCQluV2VpZ2h0WCA9IHBNYXBGWFsgblJpZ2h0IF0gOwoJCQkJCQkJCQkJCW5TdW1Sb3dCICs9ICggbldlaWdodFggKiggKnBUbXBYICkgKTtwVG1wWCsrOwoJCQkJCQkJCQkJCW5TdW1Sb3dHICs9ICggbldlaWdodFggKiggKnBUbXBYICkgKTtwVG1wWCsrOwoJCQkJCQkJCQkJCW5TdW1Sb3dSICs9ICggbldlaWdodFggKiggKnBUbXBYICkgKTtwVG1wWCsrOwoJCQkJCQkJCQkJCW5Ub3RhbFdlaWdodFggKz0gbldlaWdodFg7CgkJCQkJCQkJCQl9CgkJCQkJCQkJCQllbHNlCgkJCQkJCQkJCQl7CgkJCQkJCQkJCQkJblN1bVJvd0IgKz0gKCAqcFRtcFggKSA8PCA3TDtwVG1wWCsrOwkKCQkJCQkJCQkJCQluU3VtUm93RyArPSAoICpwVG1wWCApIDw8IDdMO3BUbXBYKys7CgkJCQkJCQkJCQkJblN1bVJvd1IgKz0gKCAqcFRtcFggKSA8PCA3TDtwVG1wWCsrOwoJCQkJCQkJCQkJCW5Ub3RhbFdlaWdodFggKz0gMSA8PCA3TDsKCQkJCQkJCQkJCX0KCQkJCQkJCQkJfQoJCQkJCQkJCQkKCQkJCQkJCQkJaWYoIG5ZID09IG5FbmRZICkKCQkJCQkJCQkJCW5XZWlnaHRZID0gbk1heDsKCQkJCQkJCQkJZWxzZSBpZiggaSA9PSAwICkKCQkJCQkJCQkJCW5XZWlnaHRZID0gbk1heCAtIHBNYXBGWVsgblRvcCBdOwoJCQkJCQkJCQllbHNlIGlmKCBuTGluZVJhbmdlID09IDEgKQoJCQkJCQkJCQkJbldlaWdodFkgPSBwTWFwRllbIG5Ub3AgXTsKCQkJCQkJCQkJZWxzZSBpZiAoIG5MaW5lUmFuZ2UgPT0gaSApCgkJCQkJCQkJCQluV2VpZ2h0WSA9IHBNYXBGWVsgbkJvdHRvbSBdOwoJCQkJCQkJCQllbHNlCgkJCQkJCQkJCQluV2VpZ2h0WSA9IG5NYXg7CgkJCQkJCQkJCQoJCQkJCQkJCQluU3VtQiArPSBuV2VpZ2h0WSAqICggblN1bVJvd0IgLyBuVG90YWxXZWlnaHRYICk7CgkJCQkJCQkJCW5TdW1HICs9IG5XZWlnaHRZICogKCBuU3VtUm93RyAvIG5Ub3RhbFdlaWdodFggKTsKCQkJCQkJCQkJblN1bVIgKz0gbldlaWdodFkgKiAoIG5TdW1Sb3dSIC8gblRvdGFsV2VpZ2h0WCApOwoJCQkJCQkJCQluVG90YWxXZWlnaHRZICs9IG5XZWlnaHRZOwoJCQkJCQkJCX0KCQkJCQkJCQkKCQkJCQkJCQlhQ29sUmVzLlNldFJlZCggKCBzYWxfdUludDggKSAoKCBuU3VtUiAvIG5Ub3RhbFdlaWdodFkgKSApKTsKCQkJCQkJCQlhQ29sUmVzLlNldEdyZWVuKCAoIHNhbF91SW50OCApICgoIG5TdW1HIC8gblRvdGFsV2VpZ2h0WSkgKSk7CgkJCQkJCQkJYUNvbFJlcy5TZXRCbHVlKCAoIHNhbF91SW50OCApICgoIG5TdW1CIC8gblRvdGFsV2VpZ2h0WSApICkpOwoJCQkJCQkJCXBXQWNjLT5TZXRQaXhlbCggbllEc3QsIG5YRHN0KyssIGFDb2xSZXMgKTsKCQkJCQkJCQkKCQkJCQkJCX0KICAgICAgICAgICAgICAgICAgICAgICAgfQoJCQkJCX0KCQkJCX0KCQkJCWVsc2UgaWYoIHBBY2MtPkdldFNjYW5saW5lRm9ybWF0KCkgPT0gQk1QX0ZPUk1BVF8yNEJJVF9UQ19SR0IgKQoJCQkJewoJCQkJCWlmKCBzY2FsZVggPj0gZlNjYWxlVGhyZXNoICYmIHNjYWxlWSA+PSBmU2NhbGVUaHJlc2ggKQoJCQkJCXsKCQkJCQkJU2NhbmxpbmUJcExpbmUwLCBwTGluZTEsIHBUbXAwLCBwVG1wMTsKCQkJCQkJbG9uZwkJbk9mZjsKCQkJCQkJCgkJCQkJCWZvciggblkgPSBuU3RhcnRZLCBuWURzdCA9IDBMOyBuWSA8PSBuRW5kWTsgblkrKywgbllEc3QrKyApCgkJCQkJCXsKCQkJCQkJCW5UZW1wWSA9IHBNYXBJWVsgblkgXTsgblRlbXBGWSA9IHBNYXBGWVsgblkgXTsKCQkJCQkJCXBMaW5lMCA9IHBBY2MtPkdldFNjYW5saW5lKCBuVGVtcFkgKTsKCQkJCQkJCXBMaW5lMSA9IHBBY2MtPkdldFNjYW5saW5lKCArK25UZW1wWSApOwoJCQkJCQkJCgkJCQkJCQlmb3IoIG5YID0gblN0YXJ0WCwgblhEc3QgPSAwTDsgblggPD0gbkVuZFg7IG5YKysgKQoJCQkJCQkJewoJCQkJCQkJCW5PZmYgPSAzTCAqICggblRlbXBYID0gcE1hcElYWyBuWCBdICk7CgkJCQkJCQkJblRlbXBGWCA9IHBNYXBGWFsgblggXTsKCQkJCQkJCQkKCQkJCQkJCQlwVG1wMSA9ICggcFRtcDAgPSBwTGluZTAgKyBuT2ZmICkgKyAzTDsKCQkJCQkJCQljUjAgPSBNQVAoICpwVG1wMCwgKnBUbXAxLCBuVGVtcEZYICk7IHBUbXAwKys7IHBUbXAxKys7CgkJCQkJCQkJY0cwID0gTUFQKCAqcFRtcDAsICpwVG1wMSwgblRlbXBGWCApOyBwVG1wMCsrOyBwVG1wMSsrOwoJCQkJCQkJCWNCMCA9IE1BUCggKnBUbXAwLCAqcFRtcDEsIG5UZW1wRlggKTsKCQkJCQkJCQkKCQkJCQkJCQlwVG1wMSA9ICggcFRtcDAgPSBwTGluZTEgKyBuT2ZmICkgKyAzTDsKCQkJCQkJCQljUjEgPSBNQVAoICpwVG1wMCwgKnBUbXAxLCBuVGVtcEZYICk7IHBUbXAwKys7IHBUbXAxKys7CgkJCQkJCQkJY0cxID0gTUFQKCAqcFRtcDAsICpwVG1wMSwgblRlbXBGWCApOyBwVG1wMCsrOyBwVG1wMSsrOwoJCQkJCQkJCWNCMSA9IE1BUCggKnBUbXAwLCAqcFRtcDEsIG5UZW1wRlggKTsKCQkJCQkJCQkKCQkJCQkJCQlhQ29sUmVzLlNldFJlZCggTUFQKCBjUjAsIGNSMSwgblRlbXBGWSApICk7CgkJCQkJCQkJYUNvbFJlcy5TZXRHcmVlbiggTUFQKCBjRzAsIGNHMSwgblRlbXBGWSApICk7CgkJCQkJCQkJYUNvbFJlcy5TZXRCbHVlKCBNQVAoIGNCMCwgY0IxLCBuVGVtcEZZICkgKTsKCQkJCQkJCQlwV0FjYy0+U2V0UGl4ZWwoIG5ZRHN0LCBuWERzdCsrLCBhQ29sUmVzICk7CgkJCQkJCQl9CgkJCQkJCX0KCQkJCQl9CgkJCQkJZWxzZQoJCQkJCXsKCQkJCQkJU2NhbmxpbmUJcFRtcFksIHBUbXBYOwoJCQkJCQlsb25nCQluU3VtUiwgblN1bUcsIG5TdW1CLG5MaW5lU3RhcnQgLCBuTGluZVJhbmdlLCBuUm93U3RhcnQgLCBuUm93UmFuZ2UgOwoJCQkJCQlsb25nCQluTGVmdCwgblJpZ2h0LCBuVG9wLCBuQm90dG9tLCBuV2VpZ2h0WCwgbldlaWdodFkgOwoJCQkJCQlsb25nCQluU3VtUm93UiAsblN1bVJvd0csblN1bVJvd0IsIG5Ub3RhbFdlaWdodFgsIG5Ub3RhbFdlaWdodFk7CgkJCQkJCQoJCQkJCQlmb3IoIG5ZID0gblN0YXJ0WSAsIG5ZRHN0ID0gMEw7IG5ZIDw9IG5FbmRZOyBuWSsrLCBuWURzdCsrICkKCQkJCQkJewoJCQkJCQkJblRvcCA9IGJWTWlyciA/ICggblkgKyAxICkgOiBuWTsKCQkJCQkJCW5Cb3R0b20gPSBiVk1pcnIgPyBuWSA6ICggblkgKyAxICkgOwoJCQkJCQkJCgkJCQkJCQlpZiggblkgPT1uRW5kWSApCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CgkJCQkJCQkJbkxpbmVTdGFydCA9IHBNYXBJWVsgblkgXTsKCQkJCQkJCQluTGluZVJhbmdlID0gMDsKCQkJCQkJCX0KCQkJCQkJCWVsc2UKCQkJCQkJCXsKCQkJCQkJCQluTGluZVN0YXJ0ID0gcE1hcElZWyBuVG9wIF0gOwoJCQkJCQkJCW5MaW5lUmFuZ2UgPSAoIHBNYXBJWVsgbkJvdHRvbSBdID09IHBNYXBJWVsgblRvcCBdICkgPyAxIDooIHBNYXBJWVsgbkJvdHRvbSBdIC0gcE1hcElZWyBuVG9wIF0gKTsKCQkJCQkJCX0KCQkJCQkJCQoJCQkJCQkJZm9yKCBuWCA9IG5TdGFydFggLCBuWERzdCA9IDBMOyBuWCA8PSBuRW5kWDsgblgrKyApCgkJCQkJCQl7CgkJCQkJCQkJbkxlZnQgPSBiSE1pcnIgPyAoIG5YICsgMSApIDogblg7CgkJCQkJCQkJblJpZ2h0ID0gYkhNaXJyID8gblggOiAoIG5YICsgMSApIDsKCQkJCQkJCQkKCQkJCQkJCQlpZiggblggPT0gbkVuZFggKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKCQkJCQkJCQkJblJvd1N0YXJ0ID0gcE1hcElYWyBuWCBdOwoJCQkJCQkJCQluUm93UmFuZ2UgPSAwOwoJCQkJCQkJCX0KCQkJCQkJCQllbHNlCgkJCQkJCQkJewoJCQkJCQkJCQluUm93U3RhcnQgPSBwTWFwSVhbIG5MZWZ0IF07CgkJCQkJCQkJCW5Sb3dSYW5nZSA9ICggcE1hcElYWyBuUmlnaHQgXSA9PSBwTWFwSVhbIG5MZWZ0IF0gKT8gMSA6ICggcE1hcElYWyBuUmlnaHQgXSAtIHBNYXBJWFsgbkxlZnQgXSApOwoJCQkJCQkJCX0KCQkJCQkJCQkKCQkJCQkJCQluU3VtUiA9IG5TdW1HID0gblN1bUIgPSAwOwoJCQkJCQkJCW5Ub3RhbFdlaWdodFkgPSAwOwoJCQkJCQkJCQoJCQkJCQkJCWZvcihpbnQgaSA9IDA7IGk8PSBuTGluZVJhbmdlOyBpKyspCgkJCQkJCQkJewoJCQkJCQkJCQlwVG1wWSA9IHBBY2MtPkdldFNjYW5saW5lKCBuTGluZVN0YXJ0ICsgaSApOwoJCQkJCQkJCQlwVG1wWCA9IHBUbXBZICsgM0wgKiBuUm93U3RhcnQ7CgkJCQkJCQkJCW5TdW1Sb3dSID0gblN1bVJvd0cgPSBuU3VtUm93QiA9IDA7CgkJCQkJCQkJCW5Ub3RhbFdlaWdodFggPSAwOwoJCQkJCQkJCQkKCQkJCQkJCQkJZm9yKGludCBqID0gMDsgaiA8PSBuUm93UmFuZ2U7IGorKykKCQkJCQkJCQkJewoJCQkJCQkJCQkJaWYoblggPT0gbkVuZFggKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewoJCQkJCQkJCQkJCW5TdW1Sb3dSICs9ICggKnBUbXBYICkgPDwgN0w7cFRtcFgrKzsJCgkJCQkJCQkJCQkJblN1bVJvd0cgKz0gKCAqcFRtcFggKSA8PCA3TDtwVG1wWCsrOwkKCQkJCQkJCQkJCQluU3VtUm93QiArPSAoICpwVG1wWCApIDw8IDdMO3BUbXBYKys7CQoJCQkJCQkJCQkJCW5Ub3RhbFdlaWdodFggKz0gMSA8PCA3TDsKCQkJCQkJCQkJCX0KCQkJCQkJCQkJCWVsc2UgaWYoIGogPT0gMCApCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CgkJCQkJCQkJCQkJbldlaWdodFggPSAobk1heC0gcE1hcEZYWyBuTGVmdCBdKSA7CgkJCQkJCQkJCQkJblN1bVJvd1IgKz0gKCBuV2VpZ2h0WCAqKCAqcFRtcFggKSkgO3BUbXBYKys7CgkJCQkJCQkJCQkJblN1bVJvd0cgKz0gKCBuV2VpZ2h0WCAqKCAqcFRtcFggKSkgO3BUbXBYKys7CgkJCQkJCQkJCQkJblN1bVJvd0IgKz0gKCBuV2VpZ2h0WCAqKCAqcFRtcFggKSkgO3BUbXBYKys7CgkJCQkJCQkJCQkJblRvdGFsV2VpZ2h0WCArPSBuV2VpZ2h0WDsKCQkJCQkJCQkJCX0KCQkJCQkJCQkJCWVsc2UgaWYgKCBuUm93UmFuZ2UgPT0gaiApCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CgkJCQkJCQkJCQkJbldlaWdodFggPSBwTWFwRlhbIG5SaWdodCBdIDsKCQkJCQkJCQkJCQluU3VtUm93UiArPSAoIG5XZWlnaHRYICooICpwVG1wWCApICk7cFRtcFgrKzsKCQkJCQkJCQkJCQluU3VtUm93RyArPSAoIG5XZWlnaHRYICooICpwVG1wWCApICk7cFRtcFgrKzsKCQkJCQkJCQkJCQluU3VtUm93QiArPSAoIG5XZWlnaHRYICooICpwVG1wWCApICk7cFRtcFgrKzsKCQkJCQkJCQkJCQluVG90YWxXZWlnaHRYICs9IG5XZWlnaHRYOwoJCQkJCQkJCQkJfQoJCQkJCQkJCQkJZWxzZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewoJCQkJCQkJCQkJCW5TdW1Sb3dSICs9ICggKnBUbXBYICkgPDwgN0w7cFRtcFgrKzsJCgkJCQkJCQkJCQkJblN1bVJvd0cgKz0gKCAqcFRtcFggKSA8PCA3TDtwVG1wWCsrOwoJCQkJCQkJCQkJCW5TdW1Sb3dCICs9ICggKnBUbXBYICkgPDwgN0w7cFRtcFgrKzsKCQkJCQkJCQkJCQluVG90YWxXZWlnaHRYICs9IDEgPDwgN0w7CgkJCQkJCQkJCQl9CgkJCQkJCQkJCX0KCQkJCQkJCQkJCgkJCQkJCQkJCWlmKCBuWSA9PSBuRW5kWSApCgkJCQkJCQkJCQluV2VpZ2h0WSA9IG5NYXg7CgkJCQkJCQkJCWVsc2UgaWYoIGkgPT0gMCApCgkJCQkJCQkJCQluV2VpZ2h0WSA9IG5NYXggLSBwTWFwRllbIG5Ub3AgXTsKCQkJCQkJCQkJZWxzZSBpZiggbkxpbmVSYW5nZSA9PSAxICkKCQkJCQkJCQkJCW5XZWlnaHRZID0gcE1hcEZZWyBuVG9wIF07CgkJCQkJCQkJCWVsc2UgaWYgKCBuTGluZVJhbmdlID09IGkgKQoJCQkJCQkJCQkJbldlaWdodFkgPSBwTWFwRllbIG5Cb3R0b20gXTsKCQkJCQkJCQkJZWxzZQoJCQkJCQkJCQkJbldlaWdodFkgPSBuTWF4OwoJCQkJCQkJCQkKCQkJCQkJCQkJblN1bUIgKz0gbldlaWdodFkgKiAoIG5TdW1Sb3dCIC8gblRvdGFsV2VpZ2h0WCApOwoJCQkJCQkJCQluU3VtRyArPSBuV2VpZ2h0WSAqICggblN1bVJvd0cgLyBuVG90YWxXZWlnaHRYICk7CgkJCQkJCQkJCW5TdW1SICs9IG5XZWlnaHRZICogKCBuU3VtUm93UiAvIG5Ub3RhbFdlaWdodFggKTsKCQkJCQkJCQkJblRvdGFsV2VpZ2h0WSArPSBuV2VpZ2h0WTsKCQkJCQkJCQl9CgkJCQkJCQkJCgkJCQkJCQkJYUNvbFJlcy5TZXRSZWQoICggc2FsX3VJbnQ4ICkgKCggblN1bVIgLyBuVG90YWxXZWlnaHRZICkgKSk7CgkJCQkJCQkJYUNvbFJlcy5TZXRHcmVlbiggKCBzYWxfdUludDggKSAoKCBuU3VtRyAvIG5Ub3RhbFdlaWdodFkpICkpOwoJCQkJCQkJCWFDb2xSZXMuU2V0Qmx1ZSggKCBzYWxfdUludDggKSAoKCBuU3VtQiAvIG5Ub3RhbFdlaWdodFkgKSApKTsKCQkJCQkJCQlwV0FjYy0+U2V0UGl4ZWwoIG5ZRHN0LCBuWERzdCsrLCBhQ29sUmVzICk7CgkJCQkJCQkJCgkJCQkJCQl9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KCQkJCQl9CgkJCQl9CgkJCQllbHNlCgkJCQl7CgkJCQkJaWYoIHNjYWxlWCA+PSBmU2NhbGVUaHJlc2ggJiYgc2NhbGVZID49IGZTY2FsZVRocmVzaCApCgkJCQkJewoJCQkJCQlmb3IoIG5ZID0gblN0YXJ0WSwgbllEc3QgPSAwTDsgblkgPD0gbkVuZFk7IG5ZKyssIG5ZRHN0KysgKQoJCQkJCQl7CgkJCQkJCQluVGVtcFkgPSBwTWFwSVlbIG5ZIF07IG5UZW1wRlkgPSBwTWFwRllbIG5ZIF07CgkJCQkJCQkKCQkJCQkJCWZvciggblggPSBuU3RhcnRYLCBuWERzdCA9IDBMOyBuWCA8PSBuRW5kWDsgblgrKyApCgkJCQkJCQl7CgkJCQkJCQkJblRlbXBYID0gcE1hcElYWyBuWCBdOyBuVGVtcEZYID0gcE1hcEZYWyBuWCBdOwoJCQkJCQkJCQoJCQkJCQkJCWFDb2wwID0gcEFjYy0+R2V0UGl4ZWwoIG5UZW1wWSwgblRlbXBYICk7CgkJCQkJCQkJYUNvbDEgPSBwQWNjLT5HZXRQaXhlbCggblRlbXBZLCArK25UZW1wWCApOwoJCQkJCQkJCWNSMCA9IE1BUCggYUNvbDAuR2V0UmVkKCksIGFDb2wxLkdldFJlZCgpLCBuVGVtcEZYICk7CgkJCQkJCQkJY0cwID0gTUFQKCBhQ29sMC5HZXRHcmVlbigpLCBhQ29sMS5HZXRHcmVlbigpLCBuVGVtcEZYICk7CgkJCQkJCQkJY0IwID0gTUFQKCBhQ29sMC5HZXRCbHVlKCksIGFDb2wxLkdldEJsdWUoKSwgblRlbXBGWCApOwoJCQkJCQkJCQoJCQkJCQkJCWFDb2wxID0gcEFjYy0+R2V0UGl4ZWwoICsrblRlbXBZLCBuVGVtcFggKTsKCQkJCQkJCQlhQ29sMCA9IHBBY2MtPkdldFBpeGVsKCBuVGVtcFktLSwgLS1uVGVtcFggKTsKCQkJCQkJCQljUjEgPSBNQVAoIGFDb2wwLkdldFJlZCgpLCBhQ29sMS5HZXRSZWQoKSwgblRlbXBGWCApOwoJCQkJCQkJCWNHMSA9IE1BUCggYUNvbDAuR2V0R3JlZW4oKSwgYUNvbDEuR2V0R3JlZW4oKSwgblRlbXBGWCApOwoJCQkJCQkJCWNCMSA9IE1BUCggYUNvbDAuR2V0Qmx1ZSgpLCBhQ29sMS5HZXRCbHVlKCksIG5UZW1wRlggKTsKCQkJCQkJCQkKCQkJCQkJCQlhQ29sUmVzLlNldFJlZCggTUFQKCBjUjAsIGNSMSwgblRlbXBGWSApICk7CgkJCQkJCQkJYUNvbFJlcy5TZXRHcmVlbiggTUFQKCBjRzAsIGNHMSwgblRlbXBGWSApICk7CgkJCQkJCQkJYUNvbFJlcy5TZXRCbHVlKCBNQVAoIGNCMCwgY0IxLCBuVGVtcEZZICkgKTsKCQkJCQkJCQlwV0FjYy0+U2V0UGl4ZWwoIG5ZRHN0LCBuWERzdCsrLCBhQ29sUmVzICk7CgkJCQkJCQl9CgkJCQkJCX0KCQkJCQl9CgkJCQkJZWxzZQoJCQkJCXsKCQkJCQkJbG9uZwkJblN1bVIsIG5TdW1HLCBuU3VtQixuTGluZVN0YXJ0ICwgbkxpbmVSYW5nZSwgblJvd1N0YXJ0ICwgblJvd1JhbmdlIDsKCQkJCQkJbG9uZwkJbkxlZnQsIG5SaWdodCwgblRvcCwgbkJvdHRvbSwgbldlaWdodFgsIG5XZWlnaHRZIDsKCQkJCQkJbG9uZwkJblN1bVJvd1IgLG5TdW1Sb3dHLG5TdW1Sb3dCLCBuVG90YWxXZWlnaHRYLCBuVG90YWxXZWlnaHRZOwoJCQkJCQkKCQkJCQkJZm9yKCBuWSA9IG5TdGFydFkgLCBuWURzdCA9IDBMOyBuWSA8PSBuRW5kWTsgblkrKywgbllEc3QrKyApCgkJCQkJCXsKCQkJCQkJCW5Ub3AgPSBiVk1pcnIgPyAoIG5ZICsgMSApIDogblk7CgkJCQkJCQluQm90dG9tID0gYlZNaXJyID8gblkgOiAoIG5ZICsgMSApIDsKCQkJCQkJCQoJCQkJCQkJaWYoIG5ZID09bkVuZFkgKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgewoJCQkJCQkJCW5MaW5lU3RhcnQgPSBwTWFwSVlbIG5ZIF07CgkJCQkJCQkJbkxpbmVSYW5nZSA9IDA7CgkJCQkJCQl9CgkJCQkJCQllbHNlCgkJCQkJCQl7CgkJCQkJCQkJbkxpbmVTdGFydCA9IHBNYXBJWVsgblRvcCBdIDsKCQkJCQkJCQluTGluZVJhbmdlID0gKCBwTWFwSVlbIG5Cb3R0b20gXSA9PSBwTWFwSVlbIG5Ub3AgXSApID8gMSA6KCBwTWFwSVlbIG5Cb3R0b20gXSAtIHBNYXBJWVsgblRvcCBdICk7CgkJCQkJCQl9CgkJCQkJCQkKCQkJCQkJCWZvciggblggPSBuU3RhcnRYICwgblhEc3QgPSAwTDsgblggPD0gbkVuZFg7IG5YKysgKQoJCQkJCQkJewoJCQkJCQkJCW5MZWZ0ID0gYkhNaXJyID8gKCBuWCArIDEgKSA6IG5YOwoJCQkJCQkJCW5SaWdodCA9IGJITWlyciA/IG5YIDogKCBuWCArIDEgKSA7CgkJCQkJCQkJCgkJCQkJCQkJaWYoIG5YID09IG5FbmRYICkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CgkJCQkJCQkJCW5Sb3dTdGFydCA9IHBNYXBJWFsgblggXTsKCQkJCQkJCQkJblJvd1JhbmdlID0gMDsKCQkJCQkJCQl9CgkJCQkJCQkJZWxzZQoJCQkJCQkJCXsKCQkJCQkJCQkJblJvd1N0YXJ0ID0gcE1hcElYWyBuTGVmdCBdOwoJCQkJCQkJCQluUm93UmFuZ2UgPSAoIHBNYXBJWFsgblJpZ2h0IF0gPT0gcE1hcElYWyBuTGVmdCBdICk/IDEgOiAoIHBNYXBJWFsgblJpZ2h0IF0gLSBwTWFwSVhbIG5MZWZ0IF0gKTsKCQkJCQkJCQl9CgkJCQkJCQkJCgkJCQkJCQkJblN1bVIgPSBuU3VtRyA9IG5TdW1CID0gMDsKCQkJCQkJCQluVG90YWxXZWlnaHRZID0gMDsKCQkJCQkJCQkKCQkJCQkJCQlmb3IoaW50IGkgPSAwOyBpPD0gbkxpbmVSYW5nZTsgaSsrKQoJCQkJCQkJCXsKCQkJCQkJCQkJblN1bVJvd1IgPSBuU3VtUm93RyA9IG5TdW1Sb3dCID0gMDsKCQkJCQkJCQkJblRvdGFsV2VpZ2h0WCA9IDA7CgkJCQkJCQkJCQoJCQkJCQkJCQlmb3IoaW50IGogPSAwOyBqIDw9IG5Sb3dSYW5nZTsgaisrKQoJCQkJCQkJCQl7CgkJCQkJCQkJCQlhQ29sMCA9IHBBY2MtPkdldFBpeGVsKCBuTGluZVN0YXJ0ICsgaSwgblJvd1N0YXJ0ICsgaiApOwoJCQkJCQkJCQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoblggPT0gbkVuZFggKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewoJCQkJCQkJCQkJCQoJCQkJCQkJCQkJCW5TdW1Sb3dCICs9IGFDb2wwLkdldEJsdWUoKSA8PCA3TDsKCQkJCQkJCQkJCQluU3VtUm93RyArPSBhQ29sMC5HZXRHcmVlbigpIDw8IDdMOwoJCQkJCQkJCQkJCW5TdW1Sb3dSICs9IGFDb2wwLkdldFJlZCgpIDw8IDdMOwoJCQkJCQkJCQkJCW5Ub3RhbFdlaWdodFggKz0gMSA8PCA3TDsKCQkJCQkJCQkJCX0KCQkJCQkJCQkJCWVsc2UgaWYoIGogPT0gMCApCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CgkJCQkJCQkJCQkJCgkJCQkJCQkJCQkJbldlaWdodFggPSAobk1heC0gcE1hcEZYWyBuTGVmdCBdKSA7CgkJCQkJCQkJCQkJblN1bVJvd0IgKz0gKCBuV2VpZ2h0WCAqYUNvbDAuR2V0Qmx1ZSgpKSA7CgkJCQkJCQkJCQkJblN1bVJvd0cgKz0gKCBuV2VpZ2h0WCAqYUNvbDAuR2V0R3JlZW4oKSkgOwoJCQkJCQkJCQkJCW5TdW1Sb3dSICs9ICggbldlaWdodFggKmFDb2wwLkdldFJlZCgpKSA7CgkJCQkJCQkJCQkJblRvdGFsV2VpZ2h0WCArPSBuV2VpZ2h0WDsKCQkJCQkJCQkJCX0KCQkJCQkJCQkJCWVsc2UgaWYgKCBuUm93UmFuZ2UgPT0gaiApCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CgkJCQkJCQkJCQkJCgkJCQkJCQkJCQkJbldlaWdodFggPSBwTWFwRlhbIG5SaWdodCBdIDsKCQkJCQkJCQkJCQluU3VtUm93QiArPSAoIG5XZWlnaHRYICphQ29sMC5HZXRCbHVlKCkgKTsKCQkJCQkJCQkJCQluU3VtUm93RyArPSAoIG5XZWlnaHRYICphQ29sMC5HZXRHcmVlbigpICk7CgkJCQkJCQkJCQkJblN1bVJvd1IgKz0gKCBuV2VpZ2h0WCAqYUNvbDAuR2V0UmVkKCkgKTsKCQkJCQkJCQkJCQluVG90YWxXZWlnaHRYICs9IG5XZWlnaHRYOwoJCQkJCQkJCQkJfQoJCQkJCQkJCQkJZWxzZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewoJCQkJCQkJCQkJCW5TdW1Sb3dCICs9IGFDb2wwLkdldEJsdWUoKSA8PCA3TDsKCQkJCQkJCQkJCQluU3VtUm93RyArPSBhQ29sMC5HZXRHcmVlbigpIDw8IDdMOwoJCQkJCQkJCQkJCW5TdW1Sb3dSICs9IGFDb2wwLkdldFJlZCgpIDw8IDdMOwoJCQkJCQkJCQkJCW5Ub3RhbFdlaWdodFggKz0gMSA8PCA3TDsKCQkJCQkJCQkJCX0KCQkJCQkJCQkJfQoJCQkJCQkJCQkKCQkJCQkJCQkJaWYoIG5ZID09IG5FbmRZICkKCQkJCQkJCQkJCW5XZWlnaHRZID0gbk1heDsKCQkJCQkJCQkJZWxzZSBpZiggaSA9PSAwICkKCQkJCQkJCQkJCW5XZWlnaHRZID0gbk1heCAtIHBNYXBGWVsgblRvcCBdOwoJCQkJCQkJCQllbHNlIGlmKCBuTGluZVJhbmdlID09IDEgKQoJCQkJCQkJCQkJbldlaWdodFkgPSBwTWFwRllbIG5Ub3AgXTsKCQkJCQkJCQkJZWxzZSBpZiAoIG5MaW5lUmFuZ2UgPT0gaSApCgkJCQkJCQkJCQluV2VpZ2h0WSA9IHBNYXBGWVsgbkJvdHRvbSBdOwoJCQkJCQkJCQllbHNlCgkJCQkJCQkJCQluV2VpZ2h0WSA9IG5NYXg7CgkJCQkJCQkJCQoJCQkJCQkJCQluU3VtQiArPSBuV2VpZ2h0WSAqICggblN1bVJvd0IgLyBuVG90YWxXZWlnaHRYICk7CgkJCQkJCQkJCW5TdW1HICs9IG5XZWlnaHRZICogKCBuU3VtUm93RyAvIG5Ub3RhbFdlaWdodFggKTsKCQkJCQkJCQkJblN1bVIgKz0gbldlaWdodFkgKiAoIG5TdW1Sb3dSIC8gblRvdGFsV2VpZ2h0WCApOwoJCQkJCQkJCQluVG90YWxXZWlnaHRZICs9IG5XZWlnaHRZOwoJCQkJCQkJCX0KCQkJCQkJCQkKCQkJCQkJCQlhQ29sUmVzLlNldFJlZCggKCBzYWxfdUludDggKSAoKCBuU3VtUiAvIG5Ub3RhbFdlaWdodFkgKSApKTsKCQkJCQkJCQlhQ29sUmVzLlNldEdyZWVuKCAoIHNhbF91SW50OCApICgoIG5TdW1HIC8gblRvdGFsV2VpZ2h0WSkgKSk7CgkJCQkJCQkJYUNvbFJlcy5TZXRCbHVlKCAoIHNhbF91SW50OCApICgoIG5TdW1CIC8gblRvdGFsV2VpZ2h0WSApICkpOwoJCQkJCQkJCXBXQWNjLT5TZXRQaXhlbCggbllEc3QsIG5YRHN0KyssIGFDb2xSZXMgKTsKCQkJCQkJCQkKCQkJCQkJCX0KICAgICAgICAgICAgICAgICAgICAgICAgfQoJCQkJCX0KCQkJCX0KICAgICAgICAgICAgfQoJCiAgICAgICAgICAgIGJSZXQgPSB0cnVlOwoJCX0KCQkKCQlkZWxldGVbXSBwTWFwSVg7CgkJZGVsZXRlW10gcE1hcElZOwoJCWRlbGV0ZVtdIHBNYXBGWDsKCQlkZWxldGVbXSBwTWFwRlk7CgkJCgkJUmVsZWFzZUFjY2VzcyggcEFjYyApOwoJCWFPdXRCbXAuUmVsZWFzZUFjY2VzcyggcFdBY2MgKTsKCQkKCQlpZiggYlJldCApCiAgICAgICAgewogICAgICAgICAgICBJbXBsQWRhcHRCaXRDb3VudChhT3V0Qm1wKTsKCQkJSW1wbEFzc2lnbldpdGhTaXplKGFPdXRCbXApOwogICAgICAgIH0KCQkKCQlpZiggIWJSZXQgKQoJCQliUmV0ID0gSW1wbFNjYWxlRmFzdCggc2NhbGVYLCBzY2FsZVkgKTsJCQkKCX0KCglyZXR1cm4gYlJldDsKfQoKLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKbmFtZXNwYWNlCnsKICAgIHZvaWQgSW1wbENhbGN1bGF0ZUNvbnRyaWJ1dGlvbnMoCiAgICAgICAgY29uc3Qgc2FsX3VJbnQzMiBhU291cmNlU2l6ZSwgCiAgICAgICAgY29uc3Qgc2FsX3VJbnQzMiBhRGVzdGluYXRpb25TaXplLCAKICAgICAgICBzYWxfdUludDMyJiBhTnVtYmVyT2ZDb250cmlidXRpb25zLAogICAgICAgIGRvdWJsZSomIHBXZWlnaHRzLCAKICAgICAgICBzYWxfdUludDMyKiYgcFBpeGVscywgCiAgICAgICAgc2FsX3VJbnQzMiomIHBDb3VudCwgCiAgICAgICAgY29uc3QgS2VybmVsJiBhS2VybmVsKQogICAgewogICAgICAgIGNvbnN0IGRvdWJsZSBmU2FtcGxpbmdSYWRpdXMoYUtlcm5lbC5HZXRXaWR0aCgpKTsKICAgICAgICBjb25zdCBkb3VibGUgZlNjYWxlKGFEZXN0aW5hdGlvblNpemUgLyBzdGF0aWNfY2FzdDwgZG91YmxlID4oYVNvdXJjZVNpemUpKTsKICAgICAgICBjb25zdCBkb3VibGUgZlNjYWxlZFJhZGl1cygoZlNjYWxlIDwgMS4wKSA/IGZTYW1wbGluZ1JhZGl1cyAvIGZTY2FsZSA6IGZTYW1wbGluZ1JhZGl1cyk7CiAgICAgICAgY29uc3QgZG91YmxlIGZGaWx0ZXJGYWN0b3IoKGZTY2FsZSA8IDEuMCkgPyBmU2NhbGUgOiAxLjApOwoKICAgICAgICBhTnVtYmVyT2ZDb250cmlidXRpb25zID0gKHN0YXRpY19jYXN0PCBzYWxfdUludDMyID4oZmFicyhjZWlsKGZTY2FsZWRSYWRpdXMpKSkgKiAyKSArIDE7CiAgICAgICAgY29uc3Qgc2FsX3VJbnQzMiBuQWxsb2NTaXplKGFEZXN0aW5hdGlvblNpemUgKiBhTnVtYmVyT2ZDb250cmlidXRpb25zKTsKICAgICAgICBwV2VpZ2h0cyA9IG5ldyBkb3VibGVbbkFsbG9jU2l6ZV07CiAgICAgICAgcFBpeGVscyA9IG5ldyBzYWxfdUludDMyW25BbGxvY1NpemVdOwogICAgICAgIHBDb3VudCA9IG5ldyBzYWxfdUludDMyW2FEZXN0aW5hdGlvblNpemVdOwoKICAgICAgICBmb3Ioc2FsX3VJbnQzMiBpKDApOyBpIDwgYURlc3RpbmF0aW9uU2l6ZTsgaSsrKQogICAgICAgIHsKICAgICAgICAgICAgY29uc3Qgc2FsX3VJbnQzMiBhSW5kZXgoaSAqIGFOdW1iZXJPZkNvbnRyaWJ1dGlvbnMpOwogICAgICAgICAgICBjb25zdCBkb3VibGUgYUNlbnRlcihpIC8gZlNjYWxlKTsKICAgICAgICAgICAgY29uc3Qgc2FsX0ludDMyIGFMZWZ0KHN0YXRpY19jYXN0PCBzYWxfSW50MzIgPihmbG9vcihhQ2VudGVyIC0gZlNjYWxlZFJhZGl1cykpKTsKICAgICAgICAgICAgY29uc3Qgc2FsX0ludDMyIGFSaWdodChzdGF0aWNfY2FzdDwgc2FsX0ludDMyID4oY2VpbChhQ2VudGVyICsgZlNjYWxlZFJhZGl1cykpKTsKICAgICAgICAgICAgc2FsX3VJbnQzMiBhQ3VycmVudENvdW50KDApOwoKICAgICAgICAgICAgZm9yKHNhbF9JbnQzMiBqKGFMZWZ0KTsgaiA8PSBhUmlnaHQ7IGorKykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgY29uc3QgZG91YmxlIGFXZWlnaHQoYUtlcm5lbC5DYWxjdWxhdGUoZkZpbHRlckZhY3RvciAqIChhQ2VudGVyIC0gc3RhdGljX2Nhc3Q8IGRvdWJsZT4oaikpKSk7CgogICAgICAgICAgICAgICAgLy8gUmVkdWNlIGNhbGN1bGF0aW9ucyB3aXRoIGlnbm9yaW5nIHdlaWdodHMgb2YgMC4wCiAgICAgICAgICAgICAgICBpZihmYWJzKGFXZWlnaHQpIDwgMC4wMDAxKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIC8vIEhhbmRsaW5nIG9uIGVkZ2VzCiAgICAgICAgICAgICAgICBjb25zdCBzYWxfdUludDMyIGFQaXhlbEluZGV4KE1pbk1heChqLCAwLCBhU291cmNlU2l6ZSAtIDEpKTsKICAgICAgICAgICAgICAgIGNvbnN0IHNhbF91SW50MzIgbkluZGV4KGFJbmRleCArIGFDdXJyZW50Q291bnQpOwoKICAgICAgICAgICAgICAgIHBXZWlnaHRzW25JbmRleF0gPSBhV2VpZ2h0OwogICAgICAgICAgICAgICAgcFBpeGVsc1tuSW5kZXhdID0gYVBpeGVsSW5kZXg7CgogICAgICAgICAgICAgICAgYUN1cnJlbnRDb3VudCsrOwogICAgICAgICAgICB9CgogICAgICAgICAgICBwQ291bnRbaV0gPSBhQ3VycmVudENvdW50OwogICAgICAgIH0KICAgIH0KCiAgICBzYWxfQm9vbCBJbXBsU2NhbGVDb252b2x1dGlvbkhvciggCiAgICAgICAgQml0bWFwJiByU291cmNlLAogICAgICAgIEJpdG1hcCYgclRhcmdldCwKICAgICAgICBjb25zdCBkb3VibGUmIHJTY2FsZVgsIAogICAgICAgIGNvbnN0IEtlcm5lbCYgYUtlcm5lbCkKICAgIHsKICAgICAgICAvLyBEbyBob3Jpem9udGFsIGZpbHRlcmluZwogICAgICAgIE9TTF9FTlNVUkUoclNjYWxlWCA+IDAuMCwgIkVycm9yIGluIHNjYWxpbmc6IE1pcnJvciBnaXZlbiBpbiBub24tbWlycm9yLWNhcGFibGUgbWV0aG9kICghKSIpOwogICAgICAgIGNvbnN0IHNhbF91SW50MzIgbldpZHRoKHJTb3VyY2UuR2V0U2l6ZVBpeGVsKCkuV2lkdGgoKSk7CiAgICAgICAgY29uc3Qgc2FsX3VJbnQzMiBuTmV3V2lkdGgoRlJvdW5kKG5XaWR0aCAqIHJTY2FsZVgpKTsKCiAgICAgICAgaWYobldpZHRoID09IG5OZXdXaWR0aCkKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgIH0KCiAgICAgICAgQml0bWFwUmVhZEFjY2VzcyogcFJlYWRBY2MgPSByU291cmNlLkFjcXVpcmVSZWFkQWNjZXNzKCk7CgogICAgICAgIGlmKHBSZWFkQWNjKQogICAgICAgIHsKICAgICAgICAgICAgZG91YmxlKiBwV2VpZ2h0cyA9IDA7CiAgICAgICAgICAgIHNhbF91SW50MzIqIHBQaXhlbHMgPSAwOwogICAgICAgICAgICBzYWxfdUludDMyKiBwQ291bnQgPSAwOwogICAgICAgICAgICBzYWxfdUludDMyIGFOdW1iZXJPZkNvbnRyaWJ1dGlvbnMoMCk7CgogICAgICAgICAgICBjb25zdCBzYWxfdUludDMyIG5IZWlnaHQoclNvdXJjZS5HZXRTaXplUGl4ZWwoKS5IZWlnaHQoKSk7CiAgICAgICAgICAgIEltcGxDYWxjdWxhdGVDb250cmlidXRpb25zKG5XaWR0aCwgbk5ld1dpZHRoLCBhTnVtYmVyT2ZDb250cmlidXRpb25zLCBwV2VpZ2h0cywgcFBpeGVscywgcENvdW50LCBhS2VybmVsKTsKICAgICAgICAgICAgclRhcmdldCA9IEJpdG1hcChTaXplKG5OZXdXaWR0aCwgbkhlaWdodCksIDI0KTsKICAgICAgICAgICAgQml0bWFwV3JpdGVBY2Nlc3MqIHBXcml0ZUFjYyA9IHJUYXJnZXQuQWNxdWlyZVdyaXRlQWNjZXNzKCk7CiAgICAgICAgICAgIGJvb2wgYlJlc3VsdCgwICE9IHBXcml0ZUFjYyk7CgogICAgICAgICAgICBpZihiUmVzdWx0KQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBmb3Ioc2FsX3VJbnQzMiB5KDApOyB5IDwgbkhlaWdodDsgeSsrKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGZvcihzYWxfdUludDMyIHgoMCk7IHggPCBuTmV3V2lkdGg7IHgrKykKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNhbF91SW50MzIgYUJhc2VJbmRleCh4ICogYU51bWJlck9mQ29udHJpYnV0aW9ucyk7CiAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSBhU3VtKDAuMCk7CiAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSBhVmFsdWVSZWQoMC4wKTsKICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlIGFWYWx1ZUdyZWVuKDAuMCk7CiAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSBhVmFsdWVCbHVlKDAuMCk7CgogICAgICAgICAgICAgICAgICAgICAgICBmb3Ioc2FsX3VJbnQzMiBqKDApOyBqIDwgcENvdW50W3hdOyBqKyspCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNhbF91SW50MzIgYUluZGV4KGFCYXNlSW5kZXggKyBqKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGRvdWJsZSBhV2VpZ2h0KHBXZWlnaHRzW2FJbmRleF0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgQml0bWFwQ29sb3IgYUNvbG9yOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFTdW0gKz0gYVdlaWdodDsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihwUmVhZEFjYy0+SGFzUGFsZXR0ZSgpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFDb2xvciA9IHBSZWFkQWNjLT5HZXRQYWxldHRlQ29sb3IocFJlYWRBY2MtPkdldFBpeGVsSW5kZXgoeSwgcFBpeGVsc1thSW5kZXhdKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYUNvbG9yID0gcFJlYWRBY2MtPkdldFBpeGVsKHksIHBQaXhlbHNbYUluZGV4XSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgYVZhbHVlUmVkICs9IGFXZWlnaHQgKiBhQ29sb3IuR2V0UmVkKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhVmFsdWVHcmVlbiArPSBhV2VpZ2h0ICogYUNvbG9yLkdldEdyZWVuKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhVmFsdWVCbHVlICs9IGFXZWlnaHQgKiBhQ29sb3IuR2V0Qmx1ZSgpOwogICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBCaXRtYXBDb2xvciBhUmVzdWx0Q29sb3IoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDwgc2FsX3VJbnQ4ID4oTWluTWF4KHN0YXRpY19jYXN0PCBzYWxfSW50MzIgPihhVmFsdWVSZWQgLyBhU3VtKSwgMCwgMjU1KSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDwgc2FsX3VJbnQ4ID4oTWluTWF4KHN0YXRpY19jYXN0PCBzYWxfSW50MzIgPihhVmFsdWVHcmVlbiAvIGFTdW0pLCAwLCAyNTUpKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PCBzYWxfdUludDggPihNaW5NYXgoc3RhdGljX2Nhc3Q8IHNhbF9JbnQzMiA+KGFWYWx1ZUJsdWUgLyBhU3VtKSwgMCwgMjU1KSkpOwoKICAgICAgICAgICAgICAgICAgICAgICAgcFdyaXRlQWNjLT5TZXRQaXhlbCh5LCB4LCBhUmVzdWx0Q29sb3IpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICByVGFyZ2V0LlJlbGVhc2VBY2Nlc3MocFdyaXRlQWNjKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgclNvdXJjZS5SZWxlYXNlQWNjZXNzKHBSZWFkQWNjKTsKICAgICAgICAgICAgZGVsZXRlW10gcFdlaWdodHM7CiAgICAgICAgICAgIGRlbGV0ZVtdIHBDb3VudDsKICAgICAgICAgICAgZGVsZXRlW10gcFBpeGVsczsKCiAgICAgICAgICAgIGlmKGJSZXN1bHQpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gZmFsc2U7CiAgICB9CgogICAgYm9vbCBJbXBsU2NhbGVDb252b2x1dGlvblZlciggCiAgICAgICAgQml0bWFwJiByU291cmNlLAogICAgICAgIEJpdG1hcCYgclRhcmdldCwKICAgICAgICBjb25zdCBkb3VibGUmIHJTY2FsZVksIAogICAgICAgIGNvbnN0IEtlcm5lbCYgYUtlcm5lbCkKICAgIHsKICAgICAgICAvLyBEbyB2ZXJ0aWNhbCBmaWx0ZXJpbmcKICAgICAgICBPU0xfRU5TVVJFKHJTY2FsZVkgPiAwLjAsICJFcnJvciBpbiBzY2FsaW5nOiBNaXJyb3IgZ2l2ZW4gaW4gbm9uLW1pcnJvci1jYXBhYmxlIG1ldGhvZCAoISkiKTsKICAgICAgICBjb25zdCBzYWxfdUludDMyIG5IZWlnaHQoclNvdXJjZS5HZXRTaXplUGl4ZWwoKS5IZWlnaHQoKSk7CiAgICAgICAgY29uc3Qgc2FsX3VJbnQzMiBuTmV3SGVpZ2h0KEZSb3VuZChuSGVpZ2h0ICogclNjYWxlWSkpOwoKICAgICAgICBpZihuSGVpZ2h0ID09IG5OZXdIZWlnaHQpCiAgICAgICAgewogICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICB9CgogICAgICAgIEJpdG1hcFJlYWRBY2Nlc3MqIHBSZWFkQWNjID0gclNvdXJjZS5BY3F1aXJlUmVhZEFjY2VzcygpOwoKICAgICAgICBpZihwUmVhZEFjYykKICAgICAgICB7CiAgICAgICAgICAgIGRvdWJsZSogcFdlaWdodHMgPSAwOwogICAgICAgICAgICBzYWxfdUludDMyKiBwUGl4ZWxzID0gMDsKICAgICAgICAgICAgc2FsX3VJbnQzMiogcENvdW50ID0gMDsKICAgICAgICAgICAgc2FsX3VJbnQzMiBhTnVtYmVyT2ZDb250cmlidXRpb25zKDApOwoKICAgICAgICAgICAgY29uc3Qgc2FsX3VJbnQzMiBuV2lkdGgoclNvdXJjZS5HZXRTaXplUGl4ZWwoKS5XaWR0aCgpKTsKICAgICAgICAgICAgSW1wbENhbGN1bGF0ZUNvbnRyaWJ1dGlvbnMobkhlaWdodCwgbk5ld0hlaWdodCwgYU51bWJlck9mQ29udHJpYnV0aW9ucywgcFdlaWdodHMsIHBQaXhlbHMsIHBDb3VudCwgYUtlcm5lbCk7CiAgICAgICAgICAgIHJUYXJnZXQgPSBCaXRtYXAoU2l6ZShuV2lkdGgsIG5OZXdIZWlnaHQpLCAyNCk7CiAgICAgICAgICAgIEJpdG1hcFdyaXRlQWNjZXNzKiBwV3JpdGVBY2MgPSByVGFyZ2V0LkFjcXVpcmVXcml0ZUFjY2VzcygpOwogICAgICAgICAgICBib29sIGJSZXN1bHQoMCAhPSBwV3JpdGVBY2MpOwoKICAgICAgICAgICAgaWYocFdyaXRlQWNjKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBmb3Ioc2FsX3VJbnQzMiB4KDApOyB4IDwgbldpZHRoOyB4KyspCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgZm9yKHNhbF91SW50MzIgeSgwKTsgeSA8IG5OZXdIZWlnaHQ7IHkrKykKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNhbF91SW50MzIgYUJhc2VJbmRleCh5ICogYU51bWJlck9mQ29udHJpYnV0aW9ucyk7CiAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSBhU3VtKDAuMCk7CiAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSBhVmFsdWVSZWQoMC4wKTsKICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlIGFWYWx1ZUdyZWVuKDAuMCk7CiAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSBhVmFsdWVCbHVlKDAuMCk7CgogICAgICAgICAgICAgICAgICAgICAgICBmb3Ioc2FsX3VJbnQzMiBqKDApOyBqIDwgcENvdW50W3ldOyBqKyspCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNhbF91SW50MzIgYUluZGV4KGFCYXNlSW5kZXggKyBqKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGRvdWJsZSBhV2VpZ2h0KHBXZWlnaHRzW2FJbmRleF0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgQml0bWFwQ29sb3IgYUNvbG9yOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFTdW0gKz0gYVdlaWdodDsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihwUmVhZEFjYy0+SGFzUGFsZXR0ZSgpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFDb2xvciA9IHBSZWFkQWNjLT5HZXRQYWxldHRlQ29sb3IocFJlYWRBY2MtPkdldFBpeGVsSW5kZXgocFBpeGVsc1thSW5kZXhdLCB4KSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYUNvbG9yID0gcFJlYWRBY2MtPkdldFBpeGVsKHBQaXhlbHNbYUluZGV4XSwgeCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgYVZhbHVlUmVkICs9IGFXZWlnaHQgKiBhQ29sb3IuR2V0UmVkKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhVmFsdWVHcmVlbiArPSBhV2VpZ2h0ICogYUNvbG9yLkdldEdyZWVuKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhVmFsdWVCbHVlICs9IGFXZWlnaHQgKiBhQ29sb3IuR2V0Qmx1ZSgpOwogICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBCaXRtYXBDb2xvciBhUmVzdWx0Q29sb3IoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDwgc2FsX3VJbnQ4ID4oTWluTWF4KHN0YXRpY19jYXN0PCBzYWxfSW50MzIgPihhVmFsdWVSZWQgLyBhU3VtKSwgMCwgMjU1KSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDwgc2FsX3VJbnQ4ID4oTWluTWF4KHN0YXRpY19jYXN0PCBzYWxfSW50MzIgPihhVmFsdWVHcmVlbiAvIGFTdW0pLCAwLCAyNTUpKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PCBzYWxfdUludDggPihNaW5NYXgoc3RhdGljX2Nhc3Q8IHNhbF9JbnQzMiA+KGFWYWx1ZUJsdWUgLyBhU3VtKSwgMCwgMjU1KSkpOwoKICAgICAgICAgICAgICAgICAgICAgICAgaWYocFdyaXRlQWNjLT5IYXNQYWxldHRlKCkpCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBXcml0ZUFjYy0+U2V0UGl4ZWxJbmRleCh5LCB4LCBzdGF0aWNfY2FzdDwgc2FsX3VJbnQ4ID4ocFdyaXRlQWNjLT5HZXRCZXN0UGFsZXR0ZUluZGV4KGFSZXN1bHRDb2xvcikpKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBXcml0ZUFjYy0+U2V0UGl4ZWwoeSwgeCwgYVJlc3VsdENvbG9yKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgclRhcmdldC5SZWxlYXNlQWNjZXNzKHBXcml0ZUFjYyk7CiAgICAgICAgICAgIHJTb3VyY2UuUmVsZWFzZUFjY2VzcyhwUmVhZEFjYyk7CgogICAgICAgICAgICBkZWxldGVbXSBwV2VpZ2h0czsKICAgICAgICAgICAgZGVsZXRlW10gcENvdW50OwogICAgICAgICAgICBkZWxldGVbXSBwUGl4ZWxzOwoKICAgICAgICAgICAgaWYoYlJlc3VsdCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KfQoKLy8gIzEyMTIzMyMgQWRkZWQgQk1QX1NDQUxFX0xBTkNaT1MsIEJNUF9TQ0FMRV9CSUNVQklDLCBCTVBfU0NBTEVfQklMSU5FQVIgYW5kCi8vIEJNUF9TQ0FMRV9CT1ggZGVyaXZlZCBmcm9tIHRoZSBvcmlnaW5hbCBjb21taXQgZnJvbSBUb21hniBWYWpuZ2VybCAoc2VlCi8vIGJ1Z3ppbGxhIHRhc2sgZm9yIGRlaXRhaWxzKSBUaGFua3MhCnNhbF9Cb29sIEJpdG1hcDo6SW1wbFNjYWxlQ29udm9sdXRpb24oIAogICAgY29uc3QgZG91YmxlJiByU2NhbGVYLCAKICAgIGNvbnN0IGRvdWJsZSYgclNjYWxlWSwgCiAgICBjb25zdCBLZXJuZWwmIGFLZXJuZWwpCnsKICAgIGNvbnN0IGJvb2wgYk1pcnJvckhvcihyU2NhbGVYIDwgMC4wKTsKICAgIGNvbnN0IGJvb2wgYk1pcnJvclZlcihyU2NhbGVZIDwgMC4wKTsKICAgIGNvbnN0IGRvdWJsZSBmU2NhbGVYKGJNaXJyb3JIb3IgPyAtclNjYWxlWCA6IHJTY2FsZVgpOwogICAgY29uc3QgZG91YmxlIGZTY2FsZVkoYk1pcnJvclZlciA/IC1yU2NhbGVZIDogclNjYWxlWSk7CiAgICBjb25zdCBzYWxfdUludDMyIG5XaWR0aChHZXRTaXplUGl4ZWwoKS5XaWR0aCgpKTsKICAgIGNvbnN0IHNhbF91SW50MzIgbkhlaWdodChHZXRTaXplUGl4ZWwoKS5IZWlnaHQoKSk7CiAgICBjb25zdCBzYWxfdUludDMyIG5OZXdXaWR0aChGUm91bmQobldpZHRoICogZlNjYWxlWCkpOwogICAgY29uc3Qgc2FsX3VJbnQzMiBuTmV3SGVpZ2h0KEZSb3VuZChuSGVpZ2h0ICogZlNjYWxlWSkpOwogICAgY29uc3QgYm9vbCBiU2NhbGVIb3IobldpZHRoICE9IG5OZXdXaWR0aCk7CiAgICBjb25zdCBib29sIGJTY2FsZVZlcihuSGVpZ2h0ICE9IG5OZXdIZWlnaHQpOwogICAgY29uc3QgYm9vbCBiTWlycm9yKGJNaXJyb3JIb3IgfHwgYk1pcnJvclZlcik7CgogICAgaWYoIWJNaXJyb3IgJiYgIWJTY2FsZUhvciAmJiAhYlNjYWxlVmVyKQogICAgewogICAgICAgIHJldHVybiB0cnVlOwogICAgfQoKICAgIGJvb2wgYlJlc3VsdCh0cnVlKTsKICAgIHNhbF91SW50MzIgbk1pcnJvckZsYWdzKEJNUF9NSVJST1JfTk9ORSk7CiAgICBib29sIGJNaXJyb3JBZnRlcihmYWxzZSk7CgogICAgaWYoYk1pcnJvcikKICAgIHsKICAgICAgICBpZihiTWlycm9ySG9yKQogICAgICAgIHsKICAgICAgICAgICAgbk1pcnJvckZsYWdzIHw9IEJNUF9NSVJST1JfSE9SWjsKICAgICAgICB9CgogICAgICAgIGlmKGJNaXJyb3JWZXIpCiAgICAgICAgewogICAgICAgICAgICBuTWlycm9yRmxhZ3MgfD0gQk1QX01JUlJPUl9WRVJUOwogICAgICAgIH0KCiAgICAgICAgY29uc3Qgc2FsX3VJbnQzMiBuU3RhcnRTaXplKG5XaWR0aCAqIG5IZWlnaHQpOwogICAgICAgIGNvbnN0IHNhbF91SW50MzIgbkVuZFNpemUobk5ld1dpZHRoICogbk5ld0hlaWdodCk7CgogICAgICAgIGJNaXJyb3JBZnRlciA9IG5TdGFydFNpemUgPiBuRW5kU2l6ZTsKCiAgICAgICAgaWYoIWJNaXJyb3JBZnRlcikKICAgICAgICB7CiAgICAgICAgICAgIGJSZXN1bHQgPSBNaXJyb3Iobk1pcnJvckZsYWdzKTsKICAgICAgICB9CiAgICB9CgogICAgQml0bWFwIGFSZXN1bHQ7CgogICAgaWYoYlJlc3VsdCkKICAgIHsKICAgICAgICBjb25zdCBzYWxfdUludDMyIG5JbkJldHdlZW5TaXplSG9yRmlyc3QobkhlaWdodCAqIG5OZXdXaWR0aCk7CiAgICAgICAgY29uc3Qgc2FsX3VJbnQzMiBuSW5CZXR3ZWVuU2l6ZVZlckZpcnN0KG5OZXdIZWlnaHQgKiBuV2lkdGgpOwogICAgICAgIEJpdG1hcCBhU291cmNlKCp0aGlzKTsKCiAgICAgICAgaWYobkluQmV0d2VlblNpemVIb3JGaXJzdCA8IG5JbkJldHdlZW5TaXplVmVyRmlyc3QpCiAgICAgICAgewogICAgICAgICAgICBpZihiU2NhbGVIb3IpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGJSZXN1bHQgPSBJbXBsU2NhbGVDb252b2x1dGlvbkhvcihhU291cmNlLCBhUmVzdWx0LCBmU2NhbGVYLCBhS2VybmVsKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYoYlJlc3VsdCAmJiBiU2NhbGVWZXIpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGlmKGJTY2FsZUhvcikKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAvLyBjb3B5IHBhcnRpYWwgcmVzdWx0LCBpbmRlcGVuZGVudCBvZiBjb2xvciBkZXB0aAogICAgICAgICAgICAgICAgICAgIGFTb3VyY2UgPSBhUmVzdWx0OwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGJSZXN1bHQgPSBJbXBsU2NhbGVDb252b2x1dGlvblZlcihhU291cmNlLCBhUmVzdWx0LCBmU2NhbGVZLCBhS2VybmVsKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBlbHNlCiAgICAgICAgewogICAgICAgICAgICBpZihiU2NhbGVWZXIpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGJSZXN1bHQgPSBJbXBsU2NhbGVDb252b2x1dGlvblZlcihhU291cmNlLCBhUmVzdWx0LCBmU2NhbGVZLCBhS2VybmVsKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYoYlJlc3VsdCAmJiBiU2NhbGVIb3IpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGlmKGJTY2FsZVZlcikKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAvLyBjb3B5IHBhcnRpYWwgcmVzdWx0LCBpbmRlcGVuZGVudCBvZiBjb2xvciBkZXB0aAogICAgICAgICAgICAgICAgICAgIGFTb3VyY2UgPSBhUmVzdWx0OwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGJSZXN1bHQgPSBJbXBsU2NhbGVDb252b2x1dGlvbkhvcihhU291cmNlLCBhUmVzdWx0LCBmU2NhbGVYLCBhS2VybmVsKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCiAgICBpZihiUmVzdWx0ICYmIGJNaXJyb3JBZnRlcikKICAgIHsKICAgICAgICBiUmVzdWx0ID0gYVJlc3VsdC5NaXJyb3Iobk1pcnJvckZsYWdzKTsKICAgIH0KCiAgICBpZihiUmVzdWx0KQogICAgewogICAgICAgIEltcGxBZGFwdEJpdENvdW50KGFSZXN1bHQpOwogICAgICAgICp0aGlzID0gYVJlc3VsdDsKICAgIH0KCiAgICByZXR1cm4gYlJlc3VsdDsKfQoKLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgpzYWxfQm9vbCBCaXRtYXA6OkRpdGhlciggc2FsX3VMb25nIG5EaXRoZXJGbGFncyApCnsKCXNhbF9Cb29sIGJSZXQgPSBzYWxfRmFsc2U7CgoJY29uc3QgU2l6ZSBhU2l6ZVBpeCggR2V0U2l6ZVBpeGVsKCkgKTsKCglpZiggYVNpemVQaXguV2lkdGgoKSA9PSAxIHx8IGFTaXplUGl4LkhlaWdodCgpID09IDEgKQoJCWJSZXQgPSBzYWxfVHJ1ZTsKCWVsc2UgaWYoIG5EaXRoZXJGbGFncyAmIEJNUF9ESVRIRVJfTUFUUklYICkKCQliUmV0ID0gSW1wbERpdGhlck1hdHJpeCgpOwoJZWxzZSBpZiggbkRpdGhlckZsYWdzICYgQk1QX0RJVEhFUl9GTE9ZRCApCgkJYlJldCA9IEltcGxEaXRoZXJGbG95ZCgpOwoJZWxzZSBpZiggKCBuRGl0aGVyRmxhZ3MgJiBCTVBfRElUSEVSX0ZMT1lEXzE2ICkgJiYgKCBHZXRCaXRDb3VudCgpID09IDI0ICkgKQoJCWJSZXQgPSBJbXBsRGl0aGVyRmxveWQxNigpOwoKCXJldHVybiBiUmV0Owp9CgovLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCnNhbF9Cb29sIEJpdG1hcDo6SW1wbERpdGhlck1hdHJpeCgpCnsKCUJpdG1hcFJlYWRBY2Nlc3MqCXBSZWFkQWNjID0gQWNxdWlyZVJlYWRBY2Nlc3MoKTsKCUJpdG1hcAkJCQlhTmV3Qm1wKCBHZXRTaXplUGl4ZWwoKSwgOCApOwoJQml0bWFwV3JpdGVBY2Nlc3MqCXBXcml0ZUFjYyA9IGFOZXdCbXAuQWNxdWlyZVdyaXRlQWNjZXNzKCk7CglzYWxfQm9vbAkJCQliUmV0ID0gc2FsX0ZhbHNlOwoKCWlmKCBwUmVhZEFjYyAmJiBwV3JpdGVBY2MgKQoJewoJCWNvbnN0IHNhbF91TG9uZwluV2lkdGggPSBwUmVhZEFjYy0+V2lkdGgoKTsKCQljb25zdCBzYWxfdUxvbmcJbkhlaWdodCA9IHBSZWFkQWNjLT5IZWlnaHQoKTsKCQlCaXRtYXBDb2xvcglhSW5kZXgoIChzYWxfdUludDgpIDAgKTsKCgkJaWYoIHBSZWFkQWNjLT5IYXNQYWxldHRlKCkgKQoJCXsKCQkJZm9yKCBzYWxfdUxvbmcgblkgPSAwVUw7IG5ZIDwgbkhlaWdodDsgblkrKyApCgkJCXsKCQkJCWZvciggc2FsX3VMb25nIG5YID0gMFVMLCBuTW9kWSA9ICggblkgJiAweDBGVUwgKSA8PCA0VUw7IG5YIDwgbldpZHRoOyBuWCsrICkKCQkJCXsKCQkJCQljb25zdCBCaXRtYXBDb2xvcglhQ29sKCBwUmVhZEFjYy0+R2V0UGFsZXR0ZUNvbG9yKCBwUmVhZEFjYy0+R2V0UGl4ZWxJbmRleCggblksIG5YICkgKSApOwoJCQkJCWNvbnN0IHNhbF91TG9uZwkJCW5EID0gblZDTERpdGhlckx1dFsgbk1vZFkgKyAoIG5YICYgMHgwRlVMICkgXTsKCQkJCQljb25zdCBzYWxfdUxvbmcJCQluUiA9ICggblZDTEx1dFsgYUNvbC5HZXRSZWQoKSBdICsgbkQgKSA+PiAxNlVMOwoJCQkJCWNvbnN0IHNhbF91TG9uZwkJCW5HID0gKCBuVkNMTHV0WyBhQ29sLkdldEdyZWVuKCkgXSArIG5EICkgPj4gMTZVTDsKCQkJCQljb25zdCBzYWxfdUxvbmcJCQluQiA9ICggblZDTEx1dFsgYUNvbC5HZXRCbHVlKCkgXSArIG5EICkgPj4gMTZVTDsKCgkJCQkJYUluZGV4LlNldEluZGV4KCAoc2FsX3VJbnQ4KSAoIG5WQ0xSTHV0WyBuUiBdICsgblZDTEdMdXRbIG5HIF0gKyBuVkNMQkx1dFsgbkIgXSApICk7CgkJCQkJcFdyaXRlQWNjLT5TZXRQaXhlbCggblksIG5YLCBhSW5kZXggKTsKCQkJCX0KCQkJfQoJCX0KCQllbHNlCgkJewoJCQlmb3IoIHNhbF91TG9uZyBuWSA9IDBVTDsgblkgPCBuSGVpZ2h0OyBuWSsrICkKCQkJewoJCQkJZm9yKCBzYWxfdUxvbmcgblggPSAwVUwsIG5Nb2RZID0gKCBuWSAmIDB4MEZVTCApIDw8IDRVTDsgblggPCBuV2lkdGg7IG5YKysgKQoJCQkJewoJCQkJCWNvbnN0IEJpdG1hcENvbG9yCWFDb2woIHBSZWFkQWNjLT5HZXRQaXhlbCggblksIG5YICkgKTsKCQkJCQljb25zdCBzYWxfdUxvbmcJCQluRCA9IG5WQ0xEaXRoZXJMdXRbIG5Nb2RZICsgKCBuWCAmIDB4MEZVTCApIF07CgkJCQkJY29uc3Qgc2FsX3VMb25nCQkJblIgPSAoIG5WQ0xMdXRbIGFDb2wuR2V0UmVkKCkgXSArIG5EICkgPj4gMTZVTDsKCQkJCQljb25zdCBzYWxfdUxvbmcJCQluRyA9ICggblZDTEx1dFsgYUNvbC5HZXRHcmVlbigpIF0gKyBuRCApID4+IDE2VUw7CgkJCQkJY29uc3Qgc2FsX3VMb25nCQkJbkIgPSAoIG5WQ0xMdXRbIGFDb2wuR2V0Qmx1ZSgpIF0gKyBuRCApID4+IDE2VUw7CgoJCQkJCWFJbmRleC5TZXRJbmRleCggKHNhbF91SW50OCkgKCBuVkNMUkx1dFsgblIgXSArIG5WQ0xHTHV0WyBuRyBdICsgblZDTEJMdXRbIG5CIF0gKSApOwoJCQkJCXBXcml0ZUFjYy0+U2V0UGl4ZWwoIG5ZLCBuWCwgYUluZGV4ICk7CgkJCQl9CgkJCX0KCQl9CgoJCWJSZXQgPSBzYWxfVHJ1ZTsKCX0KCglSZWxlYXNlQWNjZXNzKCBwUmVhZEFjYyApOwoJYU5ld0JtcC5SZWxlYXNlQWNjZXNzKCBwV3JpdGVBY2MgKTsKCglpZiggYlJldCApCgl7CgkJY29uc3QgTWFwTW9kZQlhTWFwKCBtYVByZWZNYXBNb2RlICk7CgkJY29uc3QgU2l6ZQkJYVNpemUoIG1hUHJlZlNpemUgKTsKCgkJKnRoaXMgPSBhTmV3Qm1wOwoKCQltYVByZWZNYXBNb2RlID0gYU1hcDsKCQltYVByZWZTaXplID0gYVNpemU7Cgl9CgoJcmV0dXJuIGJSZXQ7Cn0KCi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKc2FsX0Jvb2wgQml0bWFwOjpJbXBsRGl0aGVyRmxveWQoKQp7Cgljb25zdCBTaXplCWFTaXplKCBHZXRTaXplUGl4ZWwoKSApOwoJc2FsX0Jvb2wJCWJSZXQgPSBzYWxfRmFsc2U7CgoJaWYoICggYVNpemUuV2lkdGgoKSA+IDMgKSAmJiAoIGFTaXplLkhlaWdodCgpID4gMiApICkKCXsKCQlCaXRtYXBSZWFkQWNjZXNzKglwUmVhZEFjYyA9IEFjcXVpcmVSZWFkQWNjZXNzKCk7CgkJQml0bWFwCQkJCWFOZXdCbXAoIEdldFNpemVQaXhlbCgpLCA4ICk7CgkJQml0bWFwV3JpdGVBY2Nlc3MqCXBXcml0ZUFjYyA9IGFOZXdCbXAuQWNxdWlyZVdyaXRlQWNjZXNzKCk7CgoJCWlmKCBwUmVhZEFjYyAmJiBwV3JpdGVBY2MgKQoJCXsKCQkJQml0bWFwQ29sb3IJYUNvbG9yOwoJCQlsb25nCQluV2lkdGggPSBwUmVhZEFjYy0+V2lkdGgoKTsKCQkJbG9uZwkJbldpZHRoMSA9IG5XaWR0aCAtIDFMOwoJCQlsb25nCQluSGVpZ2h0ID0gcFJlYWRBY2MtPkhlaWdodCgpOwoJCQlsb25nCQluWDsKCQkJbG9uZwkJblcgPSBuV2lkdGggKiAzTDsKCQkJbG9uZwkJblcyID0gblcgLSAzTDsKCQkJbG9uZwkJblJFcnIsIG5HRXJyLCBuQkVycjsKCQkJbG9uZwkJblJDLCBuR0MsIG5CQzsKCQkJbG9uZwkJblRlbXA7CgkJCWxvbmcJCW5aOwoJCQlsb25nKgkJcDEgPSBuZXcgbG9uZ1sgblcgXTsKCQkJbG9uZyoJCXAyID0gbmV3IGxvbmdbIG5XIF07CgkJCWxvbmcqCQlwMVQgPSBwMTsKCQkJbG9uZyoJCXAyVCA9IHAyOwoJCQlsb25nKgkJcFRtcDsKCQkJc2FsX0Jvb2wJCWJQYWwgPSBwUmVhZEFjYy0+SGFzUGFsZXR0ZSgpOwoKCQkJcFRtcCA9IHAyVDsKCgkJCWlmKCBiUGFsICkKCQkJewoJCQkJZm9yKCBuWiA9IDA7IG5aIDwgbldpZHRoOyBuWisrICkKCQkJCXsKCQkJCQlhQ29sb3IgPSBwUmVhZEFjYy0+R2V0UGFsZXR0ZUNvbG9yKCBwUmVhZEFjYy0+R2V0UGl4ZWxJbmRleCggMCwgblogKSApOwoKCQkJCQkqcFRtcCsrID0gKGxvbmcpIGFDb2xvci5HZXRCbHVlKCkgPDwgMTI7CgkJCQkJKnBUbXArKyA9IChsb25nKSBhQ29sb3IuR2V0R3JlZW4oKSA8PCAxMjsKCQkJCQkqcFRtcCsrID0gKGxvbmcpIGFDb2xvci5HZXRSZWQoKSA8PCAxMjsKCQkJCX0KCQkJfQoJCQllbHNlCgkJCXsKCQkJCWZvciggblogPSAwOyBuWiA8IG5XaWR0aDsgblorKyApCgkJCQl7CgkJCQkJYUNvbG9yID0gcFJlYWRBY2MtPkdldFBpeGVsKCAwLCBuWiApOwoKCQkJCQkqcFRtcCsrID0gKGxvbmcpIGFDb2xvci5HZXRCbHVlKCkgPDwgMTI7CgkJCQkJKnBUbXArKyA9IChsb25nKSBhQ29sb3IuR2V0R3JlZW4oKSA8PCAxMjsKCQkJCQkqcFRtcCsrID0gKGxvbmcpIGFDb2xvci5HZXRSZWQoKSA8PCAxMjsKCQkJCX0KCQkJfQoKCQkJZm9yKCBsb25nIG5ZID0gMSwgbllBY2MgPSAwTDsgblkgPD0gbkhlaWdodDsgblkrKywgbllBY2MrKyApCgkJCXsKCQkJCXBUbXAgPSBwMVQ7CgkJCQlwMVQgPSBwMlQ7CgkJCQlwMlQgPSBwVG1wOwoKCQkJCWlmKCBuWSA8IG5IZWlnaHQgKQoJCQkJewoJCQkJCWlmKCBiUGFsICkKCQkJCQl7CgkJCQkJCWZvciggblogPSAwOyBuWiA8IG5XaWR0aDsgblorKyApCgkJCQkJCXsKCQkJCQkJCWFDb2xvciA9IHBSZWFkQWNjLT5HZXRQYWxldHRlQ29sb3IoIHBSZWFkQWNjLT5HZXRQaXhlbEluZGV4KCBuWSwgblogKSApOwoKCQkJCQkJCSpwVG1wKysgPSAobG9uZykgYUNvbG9yLkdldEJsdWUoKSA8PCAxMjsKCQkJCQkJCSpwVG1wKysgPSAobG9uZykgYUNvbG9yLkdldEdyZWVuKCkgPDwgMTI7CgkJCQkJCQkqcFRtcCsrID0gKGxvbmcpIGFDb2xvci5HZXRSZWQoKSA8PCAxMjsKCQkJCQkJfQoJCQkJCX0KCQkJCQllbHNlCgkJCQkJewoJCQkJCQlmb3IoIG5aID0gMDsgblogPCBuV2lkdGg7IG5aKysgKQoJCQkJCQl7CgkJCQkJCQlhQ29sb3IgPSBwUmVhZEFjYy0+R2V0UGl4ZWwoIG5ZLCBuWiApOwoKCQkJCQkJCSpwVG1wKysgPSAobG9uZykgYUNvbG9yLkdldEJsdWUoKSA8PCAxMjsKCQkJCQkJCSpwVG1wKysgPSAobG9uZykgYUNvbG9yLkdldEdyZWVuKCkgPDwgMTI7CgkJCQkJCQkqcFRtcCsrID0gKGxvbmcpIGFDb2xvci5HZXRSZWQoKSA8PCAxMjsKCQkJCQkJfQoJCQkJCX0KCQkJCX0KCgkJCQkvLyBlcnN0ZXMgUGl4ZWwgZ2Vzb25kZXJ0IGJldHJhY2h0ZW4KCQkJCW5YID0gMDsKCQkJCUNBTENfRVJST1JTOwoJCQkJQ0FMQ19UQUJMRVM3OwoJCQkJblggLT0gNTsKCQkJCUNBTENfVEFCTEVTNTsKCQkJCXBXcml0ZUFjYy0+U2V0UGl4ZWxJbmRleCggbllBY2MsIDAsIHN0YXRpY19jYXN0PHNhbF91SW50OD4oblZDTEJMdXRbIG5CQyBdICsgblZDTEdMdXRbbkdDIF0gKyBuVkNMUkx1dFtuUkMgXSkgKTsKCgkJCQkvLyBtaXR0bGVyZSBQaXhlbCB1ZWJlciBTY2hsZWlmZQoJCQkJbG9uZyBuWEFjYzsKCQkJCWZvciAoIG5YID0gM0wsIG5YQWNjID0gMUw7IG5YIDwgblcyOyBuWEFjYysrICkKCQkJCXsKCQkJCQlDQUxDX0VSUk9SUzsKCQkJCQlDQUxDX1RBQkxFUzc7CgkJCQkJblggLT0gODsKCQkJCQlDQUxDX1RBQkxFUzM7CgkJCQkJQ0FMQ19UQUJMRVM1OwoJCQkJCXBXcml0ZUFjYy0+U2V0UGl4ZWxJbmRleCggbllBY2MsIG5YQWNjLCBzdGF0aWNfY2FzdDxzYWxfdUludDg+KG5WQ0xCTHV0WyBuQkMgXSArIG5WQ0xHTHV0W25HQyBdICsgblZDTFJMdXRbblJDIF0pICk7CgkJCQl9CgoJCQkJLy8gbGV0enRlcyBQaXhlbCBnZXNvbmRlcnQgYmV0cmFjaHRlbgoJCQkJQ0FMQ19FUlJPUlM7CgkJCQluWCAtPSA1OwoJCQkJQ0FMQ19UQUJMRVMzOwoJCQkJQ0FMQ19UQUJMRVM1OwoJCQkJcFdyaXRlQWNjLT5TZXRQaXhlbEluZGV4KCBuWUFjYywgbldpZHRoMSwgc3RhdGljX2Nhc3Q8c2FsX3VJbnQ4PihuVkNMQkx1dFsgbkJDIF0gKyBuVkNMR0x1dFtuR0MgXSArIG5WQ0xSTHV0W25SQyBdKSApOwoJCQl9CgoJCQlkZWxldGVbXSBwMTsKCQkJZGVsZXRlW10gcDI7CgkJCWJSZXQgPSBzYWxfVHJ1ZTsKCQl9CgoJCVJlbGVhc2VBY2Nlc3MoIHBSZWFkQWNjICk7CgkJYU5ld0JtcC5SZWxlYXNlQWNjZXNzKCBwV3JpdGVBY2MgKTsKCgkJaWYoIGJSZXQgKQoJCXsKCQkJY29uc3QgTWFwTW9kZQlhTWFwKCBtYVByZWZNYXBNb2RlICk7CgkJCWNvbnN0IFNpemUJCWFQcmVmU2l6ZSggbWFQcmVmU2l6ZSApOwoKCQkJKnRoaXMgPSBhTmV3Qm1wOwoKCQkJbWFQcmVmTWFwTW9kZSA9IGFNYXA7CgkJCW1hUHJlZlNpemUgPSBhUHJlZlNpemU7CgkJfQoJfQoKCXJldHVybiBiUmV0Owp9CgovLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCnNhbF9Cb29sIEJpdG1hcDo6SW1wbERpdGhlckZsb3lkMTYoKQp7CglCaXRtYXBSZWFkQWNjZXNzKglwUmVhZEFjYyA9IEFjcXVpcmVSZWFkQWNjZXNzKCk7CglCaXRtYXAJCQkJYU5ld0JtcCggR2V0U2l6ZVBpeGVsKCksIDI0ICk7CglCaXRtYXBXcml0ZUFjY2VzcyoJcFdyaXRlQWNjID0gYU5ld0JtcC5BY3F1aXJlV3JpdGVBY2Nlc3MoKTsKCXNhbF9Cb29sCQkJCWJSZXQgPSBzYWxfRmFsc2U7CgoJaWYoIHBSZWFkQWNjICYmIHBXcml0ZUFjYyApCgl7CgkJY29uc3QgbG9uZwkJbldpZHRoID0gcFdyaXRlQWNjLT5XaWR0aCgpOwoJCWNvbnN0IGxvbmcJCW5XaWR0aDEgPSBuV2lkdGggLSAxTDsKCQljb25zdCBsb25nCQluSGVpZ2h0ID0gcFdyaXRlQWNjLT5IZWlnaHQoKTsKCQlCaXRtYXBDb2xvciAJYUNvbG9yOwoJCUJpdG1hcENvbG9yCQlhQmVzdENvbDsKCQlJbXBFcnJvclF1YWQJYUVyclF1YWQ7CgkJSW1wRXJyb3JRdWFkKglwRXJyUXVhZDEgPSBuZXcgSW1wRXJyb3JRdWFkWyBuV2lkdGggXTsKCQlJbXBFcnJvclF1YWQqCXBFcnJRdWFkMiA9IG5ldyBJbXBFcnJvclF1YWRbIG5XaWR0aCBdOwoJCUltcEVycm9yUXVhZCoJcFFMaW5lMSA9IHBFcnJRdWFkMTsKCQlJbXBFcnJvclF1YWQqCXBRTGluZTIgPSAwOwoJCWxvbmcJCQluWCwgblk7CgkJbG9uZwkJCW5ZVG1wID0gMEw7CgkJc2FsX0Jvb2wJCQliUTEgPSBzYWxfVHJ1ZTsKCgkJZm9yKCBuWSA9IDBMOyBuWSA8IE1pbiggbkhlaWdodCwgMkwgKTsgblkrKywgbllUbXArKyApCgkJCWZvciggblggPSAwTCwgcFFMaW5lMiA9ICFuWSA/IHBFcnJRdWFkMSA6IHBFcnJRdWFkMjsgblggPCBuV2lkdGg7IG5YKysgKQoJCQkJcFFMaW5lMlsgblggXSA9IHBSZWFkQWNjLT5HZXRQaXhlbCggbllUbXAsIG5YICk7CgoJCWZvciggblkgPSAwTDsgblkgPCBuSGVpZ2h0OyBuWSsrLCBuWVRtcCsrICkKCQl7CgkJCS8vIGVyc3RlcyBaZWlsZW5QaXhlbAoJCQlhQmVzdENvbCA9IHBRTGluZTFbIDAgXS5JbXBsR2V0Q29sb3IoKTsKCQkJYUJlc3RDb2wuU2V0UmVkKCAoIGFCZXN0Q29sLkdldFJlZCgpICYgMjQ4ICkgfCA3ICk7CgkJCWFCZXN0Q29sLlNldEdyZWVuKCAoIGFCZXN0Q29sLkdldEdyZWVuKCkgJiAyNDggKSB8IDcgKTsKCQkJYUJlc3RDb2wuU2V0Qmx1ZSggKCBhQmVzdENvbC5HZXRCbHVlKCkgJiAyNDggKSB8IDcgKTsKCQkJcFdyaXRlQWNjLT5TZXRQaXhlbCggblksIDAsIGFCZXN0Q29sICk7CgoJCQlmb3IoIG5YID0gMUw7IG5YIDwgbldpZHRoMTsgblgrKyApCgkJCXsKCQkJCWFDb2xvciA9IHBRTGluZTFbIG5YIF0uSW1wbEdldENvbG9yKCk7CgkJCQlhQmVzdENvbC5TZXRSZWQoICggYUNvbG9yLkdldFJlZCgpICYgMjQ4ICkgfCA3ICk7CgkJCQlhQmVzdENvbC5TZXRHcmVlbiggKCBhQ29sb3IuR2V0R3JlZW4oKSAmIDI0OCApIHwgNyApOwoJCQkJYUJlc3RDb2wuU2V0Qmx1ZSggKCBhQ29sb3IuR2V0Qmx1ZSgpICYgMjQ4ICkgfCA3ICk7CgkJCQlhRXJyUXVhZCA9ICggSW1wRXJyb3JRdWFkKCBhQ29sb3IgKSAtPSBhQmVzdENvbCApOwoJCQkJcFFMaW5lMVsgKytuWCBdLkltcGxBZGRDb2xvckVycm9yNyggYUVyclF1YWQgKTsKCQkJCXBRTGluZTJbIG5YLS0gXS5JbXBsQWRkQ29sb3JFcnJvcjEoIGFFcnJRdWFkICk7CgkJCQlwUUxpbmUyWyBuWC0tIF0uSW1wbEFkZENvbG9yRXJyb3I1KCBhRXJyUXVhZCApOwoJCQkJcFFMaW5lMlsgblgrKyBdLkltcGxBZGRDb2xvckVycm9yMyggYUVyclF1YWQgKTsKCQkJCXBXcml0ZUFjYy0+U2V0UGl4ZWwoIG5ZLCBuWCwgYUJlc3RDb2wgKTsKCQkJfQoKCQkJLy8gbGV0enRlcyBaZWlsZW5QaXhlbAoJCQlhQmVzdENvbCA9IHBRTGluZTFbIG5XaWR0aDEgXS5JbXBsR2V0Q29sb3IoKTsKCQkJYUJlc3RDb2wuU2V0UmVkKCAoIGFCZXN0Q29sLkdldFJlZCgpICYgMjQ4ICkgfCA3ICk7CgkJCWFCZXN0Q29sLlNldEdyZWVuKCAoIGFCZXN0Q29sLkdldEdyZWVuKCkgJiAyNDggKSB8IDcgKTsKCQkJYUJlc3RDb2wuU2V0Qmx1ZSggKCBhQmVzdENvbC5HZXRCbHVlKCkgJiAyNDggKSB8IDcgKTsKCQkJcFdyaXRlQWNjLT5TZXRQaXhlbCggblksIG5YLCBhQmVzdENvbCApOwoKCQkJLy8gWmVpbGVucHVmZmVyIG5ldSBmdWVsbGVuL2tvcGllcmVuCgkJCXBRTGluZTEgPSBwUUxpbmUyOwoJCQlwUUxpbmUyID0gKCBiUTEgPSAhYlExICkgIT0gc2FsX0ZhbHNlID8gcEVyclF1YWQyIDogcEVyclF1YWQxOwoKCQkJaWYoIG5ZVG1wIDwgbkhlaWdodCApCgkJCQlmb3IoIG5YID0gMEw7IG5YIDwgbldpZHRoOyBuWCsrICkKCQkJCQlwUUxpbmUyWyBuWCBdID0gcFJlYWRBY2MtPkdldFBpeGVsKCBuWVRtcCwgblggKTsKCQl9CgoJCS8vIFplaWxlbnB1ZmZlciB6ZXJzdG9lcmVuCgkJZGVsZXRlW10gcEVyclF1YWQxOwoJCWRlbGV0ZVtdIHBFcnJRdWFkMjsKCQliUmV0ID0gc2FsX1RydWU7Cgl9CgoJUmVsZWFzZUFjY2VzcyggcFJlYWRBY2MgKTsKCWFOZXdCbXAuUmVsZWFzZUFjY2VzcyggcFdyaXRlQWNjICk7CgoJaWYoIGJSZXQgKQoJewoJCWNvbnN0IE1hcE1vZGUJYU1hcCggbWFQcmVmTWFwTW9kZSApOwoJCWNvbnN0IFNpemUJCWFTaXplKCBtYVByZWZTaXplICk7CgoJCSp0aGlzID0gYU5ld0JtcDsKCgkJbWFQcmVmTWFwTW9kZSA9IGFNYXA7CgkJbWFQcmVmU2l6ZSA9IGFTaXplOwoJfQoKCXJldHVybiBiUmV0Owp9CgovLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCnNhbF9Cb29sIEJpdG1hcDo6UmVkdWNlQ29sb3JzKCBzYWxfdUludDE2IG5Db2xvckNvdW50LCBCbXBSZWR1Y2UgZVJlZHVjZSApCnsKCXNhbF9Cb29sIGJSZXQ7CgoJaWYoIEdldENvbG9yQ291bnQoKSA8PSAoc2FsX3VMb25nKSBuQ29sb3JDb3VudCApCgkJYlJldCA9IHNhbF9UcnVlOwoJZWxzZSBpZiggbkNvbG9yQ291bnQgKQoJewoJCWlmKCBCTVBfUkVEVUNFX1NJTVBMRSA9PSBlUmVkdWNlICkKCQkJYlJldCA9IEltcGxSZWR1Y2VTaW1wbGUoIG5Db2xvckNvdW50ICk7CgkJZWxzZSBpZiggQk1QX1JFRFVDRV9QT1BVTEFSID09IGVSZWR1Y2UgKQoJCQliUmV0ID0gSW1wbFJlZHVjZVBvcHVsYXIoIG5Db2xvckNvdW50ICk7CgkJZWxzZQoJCQliUmV0ID0gSW1wbFJlZHVjZU1lZGlhbiggbkNvbG9yQ291bnQgKTsKCX0KCWVsc2UKCQliUmV0ID0gc2FsX0ZhbHNlOwoKCXJldHVybiBiUmV0Owp9CgovLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCnNhbF9Cb29sIEJpdG1hcDo6SW1wbFJlZHVjZVNpbXBsZSggc2FsX3VJbnQxNiBuQ29sb3JDb3VudCApCnsKCUJpdG1hcAkJCQlhTmV3Qm1wOwoJQml0bWFwUmVhZEFjY2VzcyoJcFJBY2MgPSBBY3F1aXJlUmVhZEFjY2VzcygpOwoJY29uc3Qgc2FsX3VJbnQxNgkJbkNvbENvdW50ID0gTWluKCBuQ29sb3JDb3VudCwgKHNhbF91SW50MTYpIDI1NiApOwoJc2FsX3VJbnQxNgkJCQluQml0Q291bnQ7CglzYWxfQm9vbAkJCQliUmV0ID0gc2FsX0ZhbHNlOwoKCWlmKCBuQ29sQ291bnQgPD0gMiApCgkJbkJpdENvdW50ID0gMTsKCWVsc2UgaWYoIG5Db2xDb3VudCA8PSAxNiApCgkJbkJpdENvdW50ID0gNDsKCWVsc2UKCQluQml0Q291bnQgPSA4OwoKCWlmKCBwUkFjYyApCgl7CgkJT2N0cmVlCQkJCQlhT2N0KCAqcFJBY2MsIG5Db2xDb3VudCApOwoJCWNvbnN0IEJpdG1hcFBhbGV0dGUmCXJQYWwgPSBhT2N0LkdldFBhbGV0dGUoKTsKCQlCaXRtYXBXcml0ZUFjY2VzcyoJCXBXQWNjOwoKCQlhTmV3Qm1wID0gQml0bWFwKCBHZXRTaXplUGl4ZWwoKSwgbkJpdENvdW50LCAmclBhbCApOwoJCXBXQWNjID0gYU5ld0JtcC5BY3F1aXJlV3JpdGVBY2Nlc3MoKTsKCgkJaWYoIHBXQWNjICkKCQl7CgkJCWNvbnN0IGxvbmcgbldpZHRoID0gcFJBY2MtPldpZHRoKCk7CgkJCWNvbnN0IGxvbmcgbkhlaWdodCA9IHBSQWNjLT5IZWlnaHQoKTsKCgkJCWlmKCBwUkFjYy0+SGFzUGFsZXR0ZSgpICkKCQkJewoJCQkJZm9yKCBsb25nIG5ZID0gMEw7IG5ZIDwgbkhlaWdodDsgblkrKyApCgkJCQkJZm9yKCBsb25nIG5YID0wTDsgblggPCBuV2lkdGg7IG5YKysgKQoJCQkJCQlwV0FjYy0+U2V0UGl4ZWxJbmRleCggblksIG5YLCBzdGF0aWNfY2FzdDxzYWxfdUludDg+KGFPY3QuR2V0QmVzdFBhbGV0dGVJbmRleCggcFJBY2MtPkdldFBhbGV0dGVDb2xvciggcFJBY2MtPkdldFBpeGVsSW5kZXgoIG5ZLCBuWCApICkpKSApOwoJCQl9CgkJCWVsc2UKCQkJewoJCQkJZm9yKCBsb25nIG5ZID0gMEw7IG5ZIDwgbkhlaWdodDsgblkrKyApCgkJCQkJZm9yKCBsb25nIG5YID0wTDsgblggPCBuV2lkdGg7IG5YKysgKQoJCQkJCQlwV0FjYy0+U2V0UGl4ZWxJbmRleCggblksIG5YLCBzdGF0aWNfY2FzdDxzYWxfdUludDg+KGFPY3QuR2V0QmVzdFBhbGV0dGVJbmRleCggcFJBY2MtPkdldFBpeGVsKCBuWSwgblggKSApKSApOwoJCQl9CgoJCQlhTmV3Qm1wLlJlbGVhc2VBY2Nlc3MoIHBXQWNjICk7CgkJCWJSZXQgPSBzYWxfVHJ1ZTsKCQl9CgoJCVJlbGVhc2VBY2Nlc3MoIHBSQWNjICk7Cgl9CgoJaWYoIGJSZXQgKQoJewoJCWNvbnN0IE1hcE1vZGUJYU1hcCggbWFQcmVmTWFwTW9kZSApOwoJCWNvbnN0IFNpemUJCWFTaXplKCBtYVByZWZTaXplICk7CgoJCSp0aGlzID0gYU5ld0JtcDsKCQltYVByZWZNYXBNb2RlID0gYU1hcDsKCQltYVByZWZTaXplID0gYVNpemU7Cgl9CgoJcmV0dXJuIGJSZXQ7Cn0KCi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKc3RydWN0IFBvcHVsYXJDb2xvckNvdW50CnsKCXNhbF91SW50MzIJbW5JbmRleDsKCXNhbF91SW50MzIJbW5Db3VudDsKfTsKCi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKZXh0ZXJuICJDIiBpbnQgX19MT0FET05DQUxMQVBJIEltcGxQb3B1bGFyQ21wRm5jKCBjb25zdCB2b2lkKiBwMSwgY29uc3Qgdm9pZCogcDIgKQp7CglpbnQgblJldDsKCglpZiggKCAoUG9wdWxhckNvbG9yQ291bnQqKSBwMSApLT5tbkNvdW50IDwgKCAoUG9wdWxhckNvbG9yQ291bnQqKSBwMiApLT5tbkNvdW50ICkKCQluUmV0ID0gMTsKCWVsc2UgaWYoICggKFBvcHVsYXJDb2xvckNvdW50KikgcDEgKS0+bW5Db3VudCA9PSAoIChQb3B1bGFyQ29sb3JDb3VudCopIHAyICktPm1uQ291bnQgKSAKCQluUmV0ID0gMDsKCWVsc2UKCQluUmV0ID0gLTE7CgkKCXJldHVybiBuUmV0Owp9CgovLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCnNhbF9Cb29sIEJpdG1hcDo6SW1wbFJlZHVjZVBvcHVsYXIoIHNhbF91SW50MTYgbkNvbENvdW50ICkKewoJQml0bWFwUmVhZEFjY2VzcyoJcFJBY2MgPSBBY3F1aXJlUmVhZEFjY2VzcygpOwoJc2FsX3VJbnQxNgkJCQluQml0Q291bnQ7CglzYWxfQm9vbAkJCQliUmV0ID0gc2FsX0ZhbHNlOwoKCWlmKCBuQ29sQ291bnQgPiAyNTYgKQoJCW5Db2xDb3VudCA9IDI1NjsKCglpZiggbkNvbENvdW50IDwgMTcgKQoJCW5CaXRDb3VudCA9IDQ7CgllbHNlCgkJbkJpdENvdW50ID0gODsKCglpZiggcFJBY2MgKQoJewoJCWNvbnN0IHNhbF91SW50MzIJblZhbGlkQml0cyA9IDQ7CgkJY29uc3Qgc2FsX3VJbnQzMgluUmlnaHRTaGlmdEJpdHMgPSA4IC0gblZhbGlkQml0czsKCQljb25zdCBzYWxfdUludDMyCW5MZWZ0U2hpZnRCaXRzMSA9IG5WYWxpZEJpdHM7CgkJY29uc3Qgc2FsX3VJbnQzMgluTGVmdFNoaWZ0Qml0czIgPSBuVmFsaWRCaXRzIDw8IDE7CgkJY29uc3Qgc2FsX3VJbnQzMgluQ29sb3JzUGVyQ29tcG9uZW50ID0gMSA8PCBuVmFsaWRCaXRzOwoJCWNvbnN0IHNhbF91SW50MzIJbkNvbG9yT2Zmc2V0ID0gMjU2IC8gbkNvbG9yc1BlckNvbXBvbmVudDsKCQljb25zdCBzYWxfdUludDMyCW5Ub3RhbENvbG9ycyA9IG5Db2xvcnNQZXJDb21wb25lbnQgKiBuQ29sb3JzUGVyQ29tcG9uZW50ICogbkNvbG9yc1BlckNvbXBvbmVudDsKCQljb25zdCBsb25nCQkJbldpZHRoID0gcFJBY2MtPldpZHRoKCk7CgkJY29uc3QgbG9uZwkJCW5IZWlnaHQgPSBwUkFjYy0+SGVpZ2h0KCk7CgkJUG9wdWxhckNvbG9yQ291bnQqCXBDb3VudFRhYmxlID0gbmV3IFBvcHVsYXJDb2xvckNvdW50WyBuVG90YWxDb2xvcnMgXTsKCQlsb25nCQkJCW5YLCBuWSwgblIsIG5HLCBuQiwgbkluZGV4OwoKCQlydGxfemVyb01lbW9yeSggcENvdW50VGFibGUsIG5Ub3RhbENvbG9ycyAqIHNpemVvZiggUG9wdWxhckNvbG9yQ291bnQgKSApOwoKCQlmb3IoIG5SID0gMCwgbkluZGV4ID0gMDsgblIgPCAyNTY7IG5SICs9IG5Db2xvck9mZnNldCApCiAgICAgICAgewoJCQlmb3IoIG5HID0gMDsgbkcgPCAyNTY7IG5HICs9IG5Db2xvck9mZnNldCApCiAgICAgICAgICAgIHsKCQkJCWZvciggbkIgPSAwOyBuQiA8IDI1NjsgbkIgKz0gbkNvbG9yT2Zmc2V0ICkKICAgICAgICAgICAgICAgIHsKCQkJCQlwQ291bnRUYWJsZVsgbkluZGV4IF0ubW5JbmRleCA9IG5JbmRleDsKICAgICAgICAgICAgICAgICAgICBuSW5kZXgrKzsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KCgkJaWYoIHBSQWNjLT5IYXNQYWxldHRlKCkgKQoJCXsKCQkJZm9yKCBuWSA9IDBMOyBuWSA8IG5IZWlnaHQ7IG5ZKysgKQoJCQl7CgkJCQlmb3IoIG5YID0gMEw7IG5YIDwgbldpZHRoOyBuWCsrICkKCQkJCXsKCQkJCQljb25zdCBCaXRtYXBDb2xvciYgckNvbCA9IHBSQWNjLT5HZXRQYWxldHRlQ29sb3IoIHBSQWNjLT5HZXRQaXhlbEluZGV4KCBuWSwgblggKSApOwoJCQkJCXBDb3VudFRhYmxlWyAoICggKCAoc2FsX3VJbnQzMikgckNvbC5HZXRSZWQoKSApID4+IG5SaWdodFNoaWZ0Qml0cyApIDw8IG5MZWZ0U2hpZnRCaXRzMiApIHwKCQkJCQkJCQkgKCAoICggKHNhbF91SW50MzIpIHJDb2wuR2V0R3JlZW4oKSApID4+IG5SaWdodFNoaWZ0Qml0cyApIDw8IG5MZWZ0U2hpZnRCaXRzMSApIHwgCgkJCQkJCQkJICggKCAoc2FsX3VJbnQzMikgckNvbC5HZXRCbHVlKCkgKSA+PiBuUmlnaHRTaGlmdEJpdHMgKSBdLm1uQ291bnQrKzsKCQkJCX0KCQkJfQoJCX0KCQllbHNlCgkJewoJCQlmb3IoIG5ZID0gMEw7IG5ZIDwgbkhlaWdodDsgblkrKyApCgkJCXsKCQkJCWZvciggblggPSAwTDsgblggPCBuV2lkdGg7IG5YKysgKQoJCQkJewoJCQkJCWNvbnN0IEJpdG1hcENvbG9yIGFDb2woIHBSQWNjLT5HZXRQaXhlbCggblksIG5YICkgKTsKCQkJCQlwQ291bnRUYWJsZVsgKCAoICggKHNhbF91SW50MzIpIGFDb2wuR2V0UmVkKCkgKSA+PiBuUmlnaHRTaGlmdEJpdHMgKSA8PCBuTGVmdFNoaWZ0Qml0czIgKSB8CgkJCQkJCQkJICggKCAoIChzYWxfdUludDMyKSBhQ29sLkdldEdyZWVuKCkgKSA+PiBuUmlnaHRTaGlmdEJpdHMgKSA8PCBuTGVmdFNoaWZ0Qml0czEgKSB8IAoJCQkJCQkJCSAoICggKHNhbF91SW50MzIpIGFDb2wuR2V0Qmx1ZSgpICkgPj4gblJpZ2h0U2hpZnRCaXRzICkgXS5tbkNvdW50Kys7CQkJCQoJCQkJfQoJCQl9CgkJfQoKCQlCaXRtYXBQYWxldHRlIGFOZXdQYWwoIG5Db2xDb3VudCApOwoKCQlxc29ydCggcENvdW50VGFibGUsIG5Ub3RhbENvbG9ycywgc2l6ZW9mKCBQb3B1bGFyQ29sb3JDb3VudCApLCBJbXBsUG9wdWxhckNtcEZuYyApOwoJCQoJCWZvciggc2FsX3VJbnQxNiBuID0gMDsgbiA8IG5Db2xDb3VudDsgbisrICkKCQl7CgkJCWNvbnN0IFBvcHVsYXJDb2xvckNvdW50JiByUG9wID0gcENvdW50VGFibGVbIG4gXTsKCQkJYU5ld1BhbFsgbiBdID0gQml0bWFwQ29sb3IoIChzYWxfdUludDgpICggKCByUG9wLm1uSW5kZXggPj4gbkxlZnRTaGlmdEJpdHMyICkgPDwgblJpZ2h0U2hpZnRCaXRzICksIAoJCQkJCQkJCQkJKHNhbF91SW50OCkgKCAoICggclBvcC5tbkluZGV4ID4+IG5MZWZ0U2hpZnRCaXRzMSApICYgKCBuQ29sb3JzUGVyQ29tcG9uZW50IC0gMSApICkgPDwgblJpZ2h0U2hpZnRCaXRzICksCgkJCQkJCQkJCQkoc2FsX3VJbnQ4KSAoICggclBvcC5tbkluZGV4ICYgKCBuQ29sb3JzUGVyQ29tcG9uZW50IC0gMSApICkgPDwgblJpZ2h0U2hpZnRCaXRzICkgKTsKCQl9CgoJCUJpdG1hcAkJCQlhTmV3Qm1wKCBHZXRTaXplUGl4ZWwoKSwgbkJpdENvdW50LCAmYU5ld1BhbCApOwoJCUJpdG1hcFdyaXRlQWNjZXNzKglwV0FjYyA9IGFOZXdCbXAuQWNxdWlyZVdyaXRlQWNjZXNzKCk7CgoJCWlmKCBwV0FjYyApCgkJewoJCQlCaXRtYXBDb2xvcglhRHN0Q29sKCAoc2FsX3VJbnQ4KSAwICk7CgkJCXNhbF91SW50OCoJCXBJbmRleE1hcCA9IG5ldyBzYWxfdUludDhbIG5Ub3RhbENvbG9ycyBdOwoKCQkJZm9yKCBuUiA9IDAsIG5JbmRleCA9IDA7IG5SIDwgMjU2OyBuUiArPSBuQ29sb3JPZmZzZXQgKQoJCQkJZm9yKCBuRyA9IDA7IG5HIDwgMjU2OyBuRyArPSBuQ29sb3JPZmZzZXQgKQoJCQkJCWZvciggbkIgPSAwOyBuQiA8IDI1NjsgbkIgKz0gbkNvbG9yT2Zmc2V0ICkKCQkJCQkJcEluZGV4TWFwWyBuSW5kZXgrKyBdID0gKHNhbF91SW50OCkgYU5ld1BhbC5HZXRCZXN0SW5kZXgoIEJpdG1hcENvbG9yKCAoc2FsX3VJbnQ4KSBuUiwgKHNhbF91SW50OCkgbkcsIChzYWxfdUludDgpIG5CICkgKTsKCgkJCWlmKCBwUkFjYy0+SGFzUGFsZXR0ZSgpICkKCQkJewoJCQkJZm9yKCBuWSA9IDBMOyBuWSA8IG5IZWlnaHQ7IG5ZKysgKQoJCQkJewoJCQkJCWZvciggblggPSAwTDsgblggPCBuV2lkdGg7IG5YKysgKQoJCQkJCXsKCQkJCQkJY29uc3QgQml0bWFwQ29sb3ImIHJDb2wgPSBwUkFjYy0+R2V0UGFsZXR0ZUNvbG9yKCBwUkFjYy0+R2V0UGl4ZWxJbmRleCggblksIG5YICkgKTsKCQkJCQkJYURzdENvbC5TZXRJbmRleCggcEluZGV4TWFwWyAoICggKCAoc2FsX3VJbnQzMikgckNvbC5HZXRSZWQoKSApID4+IG5SaWdodFNoaWZ0Qml0cyApIDw8IG5MZWZ0U2hpZnRCaXRzMiApIHwKCQkJCQkJCQkJCQkJCSAoICggKCAoc2FsX3VJbnQzMikgckNvbC5HZXRHcmVlbigpICkgPj4gblJpZ2h0U2hpZnRCaXRzICkgPDwgbkxlZnRTaGlmdEJpdHMxICkgfCAKCQkJCQkJCQkJCQkJCSAoICggKHNhbF91SW50MzIpIHJDb2wuR2V0Qmx1ZSgpICkgPj4gblJpZ2h0U2hpZnRCaXRzICkgXSApOwoJCQkJCQlwV0FjYy0+U2V0UGl4ZWwoIG5ZLCBuWCwgYURzdENvbCApOwoJCQkJCX0KCQkJCX0KCQkJfQoJCQllbHNlCgkJCXsKCQkJCWZvciggblkgPSAwTDsgblkgPCBuSGVpZ2h0OyBuWSsrICkKCQkJCXsKCQkJCQlmb3IoIG5YID0gMEw7IG5YIDwgbldpZHRoOyBuWCsrICkKCQkJCQl7CgkJCQkJCWNvbnN0IEJpdG1hcENvbG9yIGFDb2woIHBSQWNjLT5HZXRQaXhlbCggblksIG5YICkgKTsKCQkJCQkJYURzdENvbC5TZXRJbmRleCggcEluZGV4TWFwWyAoICggKCAoc2FsX3VJbnQzMikgYUNvbC5HZXRSZWQoKSApID4+IG5SaWdodFNoaWZ0Qml0cyApIDw8IG5MZWZ0U2hpZnRCaXRzMiApIHwKCQkJCQkJCQkJCQkJCSAoICggKCAoc2FsX3VJbnQzMikgYUNvbC5HZXRHcmVlbigpICkgPj4gblJpZ2h0U2hpZnRCaXRzICkgPDwgbkxlZnRTaGlmdEJpdHMxICkgfCAKCQkJCQkJCQkJCQkJCSAoICggKHNhbF91SW50MzIpIGFDb2wuR2V0Qmx1ZSgpICkgPj4gblJpZ2h0U2hpZnRCaXRzICkgXSApOwoJCQkJCQlwV0FjYy0+U2V0UGl4ZWwoIG5ZLCBuWCwgYURzdENvbCApOwoJCQkJCX0KCQkJCX0KCQkJfQoKCQkJZGVsZXRlW10gcEluZGV4TWFwOwoJCQlhTmV3Qm1wLlJlbGVhc2VBY2Nlc3MoIHBXQWNjICk7CgkJCWJSZXQgPSBzYWxfVHJ1ZTsKCQl9CgoJCWRlbGV0ZVtdIHBDb3VudFRhYmxlOwoJCVJlbGVhc2VBY2Nlc3MoIHBSQWNjICk7CgoJCWlmKCBiUmV0ICkKCQl7CgkJCWNvbnN0IE1hcE1vZGUJYU1hcCggbWFQcmVmTWFwTW9kZSApOwoJCQljb25zdCBTaXplCQlhU2l6ZSggbWFQcmVmU2l6ZSApOwoKCQkJKnRoaXMgPSBhTmV3Qm1wOwoJCQltYVByZWZNYXBNb2RlID0gYU1hcDsKCQkJbWFQcmVmU2l6ZSA9IGFTaXplOwoJCX0KCX0KCglyZXR1cm4gYlJldDsKfQoKLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgpzYWxfQm9vbCBCaXRtYXA6OkltcGxSZWR1Y2VNZWRpYW4oIHNhbF91SW50MTYgbkNvbENvdW50ICkKewoJQml0bWFwUmVhZEFjY2VzcyoJcFJBY2MgPSBBY3F1aXJlUmVhZEFjY2VzcygpOwoJc2FsX3VJbnQxNgkJCQluQml0Q291bnQ7CglzYWxfQm9vbAkJCQliUmV0ID0gc2FsX0ZhbHNlOwoKCWlmKCBuQ29sQ291bnQgPCAxNyApCgkJbkJpdENvdW50ID0gNDsKCWVsc2UgaWYoIG5Db2xDb3VudCA8IDI1NyApCgkJbkJpdENvdW50ID0gODsKCWVsc2UKCXsKCQlEQkdfRVJST1IoICJCaXRtYXA6OkltcGxSZWR1Y2VNZWRpYW4oKTogaW52YWxpZCBjb2xvciBjb3VudCEiICk7CgkJbkJpdENvdW50ID0gODsKCQluQ29sQ291bnQgPSAyNTY7Cgl9CgoJaWYoIHBSQWNjICkKCXsKCQlCaXRtYXAJCQkJYU5ld0JtcCggR2V0U2l6ZVBpeGVsKCksIG5CaXRDb3VudCApOwoJCUJpdG1hcFdyaXRlQWNjZXNzKglwV0FjYyA9IGFOZXdCbXAuQWNxdWlyZVdyaXRlQWNjZXNzKCk7CgoJCWlmKCBwV0FjYyApCgkJewoJCQljb25zdCBzYWxfdUxvbmcJblNpemUgPSAzMjc2OFVMICogc2l6ZW9mKCBzYWxfdUxvbmcgKTsKCQkJc2FsX3VMb25nKgkJcENvbEJ1ZiA9IChzYWxfdUxvbmcqKSBydGxfYWxsb2NhdGVNZW1vcnkoIG5TaXplICk7CgkJCWNvbnN0IGxvbmcJbldpZHRoID0gcFdBY2MtPldpZHRoKCk7CgkJCWNvbnN0IGxvbmcJbkhlaWdodCA9IHBXQWNjLT5IZWlnaHQoKTsKCQkJbG9uZwkJbkluZGV4ID0gMEw7CgoJCQltZW1zZXQoIChIUEJZVEUpIHBDb2xCdWYsIDAsIG5TaXplICk7CgoJCQkvLyBjcmVhdGUgQnVmZmVyCgkJCWlmKCBwUkFjYy0+SGFzUGFsZXR0ZSgpICkKCQkJewoJCQkJZm9yKCBsb25nIG5ZID0gMEw7IG5ZIDwgbkhlaWdodDsgblkrKyApCgkJCQl7CgkJCQkJZm9yKCBsb25nIG5YID0gMEw7IG5YIDwgbldpZHRoOyBuWCsrICkKCQkJCQl7CgkJCQkJCWNvbnN0IEJpdG1hcENvbG9yJiByQ29sID0gcFJBY2MtPkdldFBhbGV0dGVDb2xvciggcFJBY2MtPkdldFBpeGVsSW5kZXgoIG5ZLCBuWCApICk7CgkJCQkJCXBDb2xCdWZbIFJHQjE1KCByQ29sLkdldFJlZCgpID4+IDMsIHJDb2wuR2V0R3JlZW4oKSA+PiAzLCByQ29sLkdldEJsdWUoKSA+PiAzICkgXSsrOwoJCQkJCX0KCQkJCX0KCQkJfQoJCQllbHNlCgkJCXsKCQkJCWZvciggbG9uZyBuWSA9IDBMOyBuWSA8IG5IZWlnaHQ7IG5ZKysgKQoJCQkJewoJCQkJCWZvciggbG9uZyBuWCA9IDBMOyBuWCA8IG5XaWR0aDsgblgrKyApCgkJCQkJewoJCQkJCQljb25zdCBCaXRtYXBDb2xvciBhQ29sKCBwUkFjYy0+R2V0UGl4ZWwoIG5ZLCBuWCApICk7CgkJCQkJCXBDb2xCdWZbIFJHQjE1KCBhQ29sLkdldFJlZCgpID4+IDMsIGFDb2wuR2V0R3JlZW4oKSA+PiAzLCBhQ29sLkdldEJsdWUoKSA+PiAzICkgXSsrOwoJCQkJCX0KCQkJCX0KCQkJfQoKCQkJLy8gY3JlYXRlIHBhbGV0dGUgdmlhIG1lZGlhbiBjdXQKCQkJQml0bWFwUGFsZXR0ZSBhUGFsKCBwV0FjYy0+R2V0UGFsZXR0ZUVudHJ5Q291bnQoKSApOwoJCQlJbXBsTWVkaWFuQ3V0KCBwQ29sQnVmLCBhUGFsLCAwLCAzMSwgMCwgMzEsIDAsIDMxLCAKCQkJCQkJICAgbkNvbENvdW50LCBuV2lkdGggKiBuSGVpZ2h0LCBuSW5kZXggKTsKCgkJCS8vIGRvIG1hcHBpbmcgb2YgY29sb3JzIHRvIHBhbGV0dGUKCQkJSW52ZXJzZUNvbG9yTWFwIGFNYXAoIGFQYWwgKTsKCQkJcFdBY2MtPlNldFBhbGV0dGUoIGFQYWwgKTsKCQkJZm9yKCBsb25nIG5ZID0gMEw7IG5ZIDwgbkhlaWdodDsgblkrKyApCgkJCQlmb3IoIGxvbmcgblggPSAwTDsgblggPCBuV2lkdGg7IG5YKysgKQoJCQkJCXBXQWNjLT5TZXRQaXhlbEluZGV4KCBuWSwgblgsIHN0YXRpY19jYXN0PHNhbF91SW50OD4oIGFNYXAuR2V0QmVzdFBhbGV0dGVJbmRleCggcFJBY2MtPkdldENvbG9yKCBuWSwgblggKSApKSApOwoKCQkJcnRsX2ZyZWVNZW1vcnkoIHBDb2xCdWYgKTsKCQkJYU5ld0JtcC5SZWxlYXNlQWNjZXNzKCBwV0FjYyApOwoJCQliUmV0ID0gc2FsX1RydWU7CgkJfQoKCQlSZWxlYXNlQWNjZXNzKCBwUkFjYyApOwoKCQlpZiggYlJldCApCgkJewoJCQljb25zdCBNYXBNb2RlCWFNYXAoIG1hUHJlZk1hcE1vZGUgKTsKCQkJY29uc3QgU2l6ZQkJYVNpemUoIG1hUHJlZlNpemUgKTsKCgkJCSp0aGlzID0gYU5ld0JtcDsKCQkJbWFQcmVmTWFwTW9kZSA9IGFNYXA7CgkJCW1hUHJlZlNpemUgPSBhU2l6ZTsKCQl9Cgl9CgoJcmV0dXJuIGJSZXQ7Cn0KCi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKdm9pZCBCaXRtYXA6OkltcGxNZWRpYW5DdXQoIHNhbF91TG9uZyogcENvbEJ1ZiwgQml0bWFwUGFsZXR0ZSYgclBhbCwgCgkJCQkJCQlsb25nIG5SMSwgbG9uZyBuUjIsIGxvbmcgbkcxLCBsb25nIG5HMiwgbG9uZyBuQjEsIGxvbmcgbkIyLAoJCQkJCQkJbG9uZyBuQ29sb3JzLCBsb25nIG5QaXhlbHMsIGxvbmcmIHJJbmRleCApCnsKCWlmKCAhblBpeGVscyApCgkJcmV0dXJuOwoKCUJpdG1hcENvbG9yCWFDb2w7Cgljb25zdCBsb25nCW5STGVuID0gblIyIC0gblIxOwoJY29uc3QgbG9uZwluR0xlbiA9IG5HMiAtIG5HMTsgCgljb25zdCBsb25nCW5CTGVuID0gbkIyIC0gbkIxOwoJbG9uZyAJCW5SLCBuRywgbkI7CglzYWxfdUxvbmcqCQlwQnVmID0gcENvbEJ1ZjsKCglpZiggIW5STGVuICYmICFuR0xlbiAmJiAhbkJMZW4gKQoJewoJCWlmKCBwQnVmWyBSR0IxNSggblIxLCBuRzEsIG5CMSApIF0gKQoJCXsKCQkJYUNvbC5TZXRSZWQoIChzYWxfdUludDgpICggblIxIDw8IDMgKSApOwoJCQlhQ29sLlNldEdyZWVuKCAoc2FsX3VJbnQ4KSAoIG5HMSA8PCAzICkgKTsKCQkJYUNvbC5TZXRCbHVlKCAoc2FsX3VJbnQ4KSAoIG5CMSA8PCAzICkgKTsKCQkJclBhbFsgKHNhbF91SW50MTYpIHJJbmRleCsrIF0gPSBhQ29sOwoJCX0KCX0KCWVsc2UKCXsKCQlpZiggMSA9PSBuQ29sb3JzIHx8IDEgPT0gblBpeGVscyApCgkJewoJCQlsb25nIG5QaXhTdW0gPSAwLCBuUlN1bSA9IDAsIG5HU3VtID0gMCwgbkJTdW0gPSAwOwoKCQkJZm9yKCBuUiA9IG5SMTsgblIgPD0gblIyOyBuUisrICkKCQkJewoJCQkJZm9yKCBuRyA9IG5HMTsgbkcgPD0gbkcyOyBuRysrICkKCQkJCXsKCQkJCQlmb3IoIG5CID0gbkIxOyBuQiA8PSBuQjI7IG5CKysgKQoJCQkJCXsKCQkJCQkJblBpeFN1bSA9IHBCdWZbIFJHQjE1KCBuUiwgbkcsIG5CICkgXTsKCgkJCQkJCWlmKCBuUGl4U3VtICkKCQkJCQkJewoJCQkJCQkJblJTdW0gKz0gblIgKiBuUGl4U3VtOwoJCQkJCQkJbkdTdW0gKz0gbkcgKiBuUGl4U3VtOwoJCQkJCQkJbkJTdW0gKz0gbkIgKiBuUGl4U3VtOwoJCQkJCQl9CgkJCQkJfQoJCQkJfQoJCQl9CgoJCQlhQ29sLlNldFJlZCggKHNhbF91SW50OCkgKCAoIG5SU3VtIC8gblBpeGVscyApIDw8IDMgKSApOwoJCQlhQ29sLlNldEdyZWVuKCAoc2FsX3VJbnQ4KSAoICggbkdTdW0gLyBuUGl4ZWxzICkgPDwgMyApICk7CgkJCWFDb2wuU2V0Qmx1ZSggKHNhbF91SW50OCkgKCAoIG5CU3VtIC8gblBpeGVscyApIDw8IDMgKSApOwoJCQlyUGFsWyAoc2FsX3VJbnQxNikgckluZGV4KysgXSA9IGFDb2w7CgkJfQoJCWVsc2UKCQl7CgkJCWNvbnN0IGxvbmcJblRlc3QgPSAoIG5QaXhlbHMgPj4gMSApOwoJCQlsb25nCQluUGl4T2xkID0gMDsKCQkJbG9uZwkJblBpeE5ldyA9IDA7CgoJCQlpZiggbkJMZW4gPiBuR0xlbiAmJiBuQkxlbiA+IG5STGVuICkKCQkJewoJCQkJbkIgPSBuQjEgLSAxOwoKCQkJCXdoaWxlKCBuUGl4TmV3IDwgblRlc3QgKQoJCQkJewoJCQkJCW5CKyssIG5QaXhPbGQgPSBuUGl4TmV3OwoJCQkJCWZvciggblIgPSBuUjE7IG5SIDw9IG5SMjsgblIrKyApCgkJCQkJCWZvciggbkcgPSBuRzE7IG5HIDw9IG5HMjsgbkcrKyApCgkJCQkJCQluUGl4TmV3ICs9IHBCdWZbIFJHQjE1KCBuUiwgbkcsIG5CICkgXTsKCQkJCX0KCgkJCQlpZiggbkIgPCBuQjIgKQoJCQkJewoJCQkJCUltcGxNZWRpYW5DdXQoIHBCdWYsIHJQYWwsIG5SMSwgblIyLCBuRzEsIG5HMiwgbkIxLCBuQiwgbkNvbG9ycyA+PiAxLCBuUGl4TmV3LCBySW5kZXggKTsKCQkJCQlJbXBsTWVkaWFuQ3V0KCBwQnVmLCByUGFsLCBuUjEsIG5SMiwgbkcxLCBuRzIsIG5CICsgMSwgbkIyLCBuQ29sb3JzID4+IDEsIG5QaXhlbHMgLSBuUGl4TmV3LCBySW5kZXggKTsKCQkJCX0KCQkJCWVsc2UKCQkJCXsKCQkJCQlJbXBsTWVkaWFuQ3V0KCBwQnVmLCByUGFsLCBuUjEsIG5SMiwgbkcxLCBuRzIsIG5CMSwgbkIgLSAxLCBuQ29sb3JzID4+IDEsIG5QaXhPbGQsIHJJbmRleCApOwoJCQkJCUltcGxNZWRpYW5DdXQoIHBCdWYsIHJQYWwsIG5SMSwgblIyLCBuRzEsIG5HMiwgbkIsIG5CMiwgbkNvbG9ycyA+PiAxLCBuUGl4ZWxzIC0gblBpeE9sZCwgckluZGV4ICk7CgkJCQl9CgkJCX0KCQkJZWxzZSBpZiggbkdMZW4gPiBuUkxlbiApCgkJCXsKCQkJCW5HID0gbkcxIC0gMTsKCgkJCQl3aGlsZSggblBpeE5ldyA8IG5UZXN0ICkKCQkJCXsKCQkJCQluRysrLCBuUGl4T2xkID0gblBpeE5ldzsKCQkJCQlmb3IoIG5SID0gblIxOyBuUiA8PSBuUjI7IG5SKysgKQoJCQkJCQlmb3IoIG5CID0gbkIxOyBuQiA8PSBuQjI7IG5CKysgKQoJCQkJCQkJblBpeE5ldyArPSBwQnVmWyBSR0IxNSggblIsIG5HLCBuQiApIF07CgkJCQl9CgoJCQkJaWYoIG5HIDwgbkcyICkKCQkJCXsKCQkJCQlJbXBsTWVkaWFuQ3V0KCBwQnVmLCByUGFsLCBuUjEsIG5SMiwgbkcxLCBuRywgbkIxLCBuQjIsIG5Db2xvcnMgPj4gMSwgblBpeE5ldywgckluZGV4ICk7CgkJCQkJSW1wbE1lZGlhbkN1dCggcEJ1ZiwgclBhbCwgblIxLCBuUjIsIG5HICsgMSwgbkcyLCBuQjEsIG5CMiwgbkNvbG9ycyA+PiAxLCBuUGl4ZWxzIC0gblBpeE5ldywgckluZGV4ICk7CgkJCQl9CgkJCQllbHNlCgkJCQl7CgkJCQkJSW1wbE1lZGlhbkN1dCggcEJ1ZiwgclBhbCwgblIxLCBuUjIsIG5HMSwgbkcgLSAxLCBuQjEsIG5CMiwgbkNvbG9ycyA+PiAxLCBuUGl4T2xkLCBySW5kZXggKTsKCQkJCQlJbXBsTWVkaWFuQ3V0KCBwQnVmLCByUGFsLCBuUjEsIG5SMiwgbkcsIG5HMiwgbkIxLCBuQjIsIG5Db2xvcnMgPj4gMSwgblBpeGVscyAtIG5QaXhPbGQsIHJJbmRleCApOwoJCQkJfQoJCQl9CgkJCWVsc2UKCQkJewoJCQkJblIgPSBuUjEgLSAxOwoKCQkJCXdoaWxlKCBuUGl4TmV3IDwgblRlc3QgKQoJCQkJewoJCQkJCW5SKyssIG5QaXhPbGQgPSBuUGl4TmV3OwoJCQkJCWZvciggbkcgPSBuRzE7IG5HIDw9IG5HMjsgbkcrKyApCgkJCQkJCWZvciggbkIgPSBuQjE7IG5CIDw9IG5CMjsgbkIrKyApCgkJCQkJCQluUGl4TmV3ICs9IHBCdWZbIFJHQjE1KCBuUiwgbkcsIG5CICkgXTsKCQkJCX0KCgkJCQlpZiggblIgPCBuUjIgKQoJCQkJewoJCQkJCUltcGxNZWRpYW5DdXQoIHBCdWYsIHJQYWwsIG5SMSwgblIsIG5HMSwgbkcyLCBuQjEsIG5CMiwgbkNvbG9ycyA+PiAxLCBuUGl4TmV3LCBySW5kZXggKTsKCQkJCQlJbXBsTWVkaWFuQ3V0KCBwQnVmLCByUGFsLCBuUjEgKyAxLCBuUjIsIG5HMSwgbkcyLCBuQjEsIG5CMiwgbkNvbG9ycyA+PiAxLCBuUGl4ZWxzIC0gblBpeE5ldywgckluZGV4ICk7CgkJCQl9CgkJCQllbHNlCgkJCQl7CgkJCQkJSW1wbE1lZGlhbkN1dCggcEJ1ZiwgclBhbCwgblIxLCBuUiAtIDEsIG5HMSwgbkcyLCBuQjEsIG5CMiwgbkNvbG9ycyA+PiAxLCBuUGl4T2xkLCBySW5kZXggKTsKCQkJCQlJbXBsTWVkaWFuQ3V0KCBwQnVmLCByUGFsLCBuUiwgblIyLCBuRzEsIG5HMiwgbkIxLCBuQjIsIG5Db2xvcnMgPj4gMSwgblBpeGVscyAtIG5QaXhPbGQsIHJJbmRleCApOwoJCQkJfQoJCQl9CgkJfQoJfQp9CgovLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCnNhbF9Cb29sIEJpdG1hcDo6VmVjdG9yaXplKCBQb2x5UG9seWdvbiYgclBvbHlQb2x5LCBzYWxfdUxvbmcgbkZsYWdzLCBjb25zdCBMaW5rKiBwUHJvZ3Jlc3MgKQp7CglyZXR1cm4gSW1wbFZlY3Rvcml6ZXIoKS5JbXBsVmVjdG9yaXplKCAqdGhpcywgclBvbHlQb2x5LCBuRmxhZ3MsIHBQcm9ncmVzcyApOwp9CgovLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCnNhbF9Cb29sIEJpdG1hcDo6VmVjdG9yaXplKCBHRElNZXRhRmlsZSYgck10Ziwgc2FsX3VJbnQ4IGNSZWR1Y2UsIHNhbF91TG9uZyBuRmxhZ3MsIGNvbnN0IExpbmsqIHBQcm9ncmVzcyApCnsKCXJldHVybiBJbXBsVmVjdG9yaXplcigpLkltcGxWZWN0b3JpemUoICp0aGlzLCByTXRmLCBjUmVkdWNlLCBuRmxhZ3MsIHBQcm9ncmVzcyApOwp9CgovLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCnNhbF9Cb29sIEJpdG1hcDo6QWRqdXN0KCBzaG9ydCBuTHVtaW5hbmNlUGVyY2VudCwgc2hvcnQgbkNvbnRyYXN0UGVyY2VudCwKCQkJCQkgc2hvcnQgbkNoYW5uZWxSUGVyY2VudCwgc2hvcnQgbkNoYW5uZWxHUGVyY2VudCwgc2hvcnQgbkNoYW5uZWxCUGVyY2VudCwKCQkJCQkgZG91YmxlIGZHYW1tYSwgc2FsX0Jvb2wgYkludmVydCApCnsKCXNhbF9Cb29sIGJSZXQgPSBzYWxfRmFsc2U7CgoJLy8gbm90aGluZyB0byBkbyA9PiByZXR1cm4gcXVpY2tseQoJaWYoICFuTHVtaW5hbmNlUGVyY2VudCAmJiAhbkNvbnRyYXN0UGVyY2VudCAmJiAKCQkhbkNoYW5uZWxSUGVyY2VudCAmJiAhbkNoYW5uZWxHUGVyY2VudCAmJiAhbkNoYW5uZWxCUGVyY2VudCAmJgoJCSggZkdhbW1hID09IDEuMCApICYmICFiSW52ZXJ0ICkKCXsKCQliUmV0ID0gc2FsX1RydWU7Cgl9CgllbHNlCgl7CgkJQml0bWFwV3JpdGVBY2Nlc3MqIHBBY2MgPSBBY3F1aXJlV3JpdGVBY2Nlc3MoKTsKCgkJaWYoIHBBY2MgKQoJCXsKCQkJQml0bWFwQ29sb3IJCWFDb2w7CgkJCWNvbnN0IGxvbmcJCW5XID0gcEFjYy0+V2lkdGgoKTsKCQkJY29uc3QgbG9uZwkJbkggPSBwQWNjLT5IZWlnaHQoKTsKCQkJc2FsX3VJbnQ4KgkJCWNNYXBSID0gbmV3IHNhbF91SW50OFsgMjU2IF07CgkJCXNhbF91SW50OCoJCQljTWFwRyA9IG5ldyBzYWxfdUludDhbIDI1NiBdOwoJCQlzYWxfdUludDgqCQkJY01hcEIgPSBuZXcgc2FsX3VJbnQ4WyAyNTYgXTsKCQkJbG9uZwkJCW5YLCBuWTsKCQkJZG91YmxlCQkJZk0sIGZST2ZmLCBmR09mZiwgZkJPZmYsIGZPZmY7CgkJCQoJCQkvLyBjYWxjdWxhdGUgc2xvcGUKCQkJaWYoIG5Db250cmFzdFBlcmNlbnQgPj0gMCApCgkJCQlmTSA9IDEyOC4wIC8gKCAxMjguMCAtIDEuMjcgKiBNaW5NYXgoIG5Db250cmFzdFBlcmNlbnQsIDBMLCAxMDBMICkgKTsKCQkJZWxzZQoJCQkJZk0gPSAoIDEyOC4wICsgMS4yNyAqIE1pbk1heCggbkNvbnRyYXN0UGVyY2VudCwgLTEwMEwsIDBMICkgKSAvIDEyOC4wOwoKCQkJLy8gdG90YWwgb2Zmc2V0ID0gbHVtaW5hbmNlIG9mZnNldCArIGNvbnRyYXN0IG9mZnNldAoJCQlmT2ZmID0gTWluTWF4KCBuTHVtaW5hbmNlUGVyY2VudCwgLTEwMEwsIDEwMEwgKSAqIDIuNTUgKyAxMjguMCAtIGZNICogMTI4LjA7CgoJCQkvLyBjaGFubmVsIG9mZnNldCA9IGNoYW5uZWwgb2Zmc2V0ICArIHRvdGFsIG9mZnNldAoJCQlmUk9mZiA9IG5DaGFubmVsUlBlcmNlbnQgKiAyLjU1ICsgZk9mZjsKCQkJZkdPZmYgPSBuQ2hhbm5lbEdQZXJjZW50ICogMi41NSArIGZPZmY7CgkJCWZCT2ZmID0gbkNoYW5uZWxCUGVyY2VudCAqIDIuNTUgKyBmT2ZmOwoKCQkJLy8gY2FsY3VsYXRlIGdhbW1hIHZhbHVlCgkJCWZHYW1tYSA9ICggZkdhbW1hIDw9IDAuMCB8fCBmR2FtbWEgPiAxMC4wICkgPyAxLjAgOiAoIDEuMCAvIGZHYW1tYSApOwoJCQljb25zdCBzYWxfQm9vbCBiR2FtbWEgPSAoIGZHYW1tYSAhPSAxLjAgKTsKCgkJCS8vIGNyZWF0ZSBtYXBwaW5nIHRhYmxlCgkJCWZvciggblggPSAwTDsgblggPCAyNTZMOyBuWCsrICkKCQkJewoJCQkJY01hcFJbIG5YIF0gPSAoc2FsX3VJbnQ4KSBNaW5NYXgoIEZSb3VuZCggblggKiBmTSArIGZST2ZmICksIDBMLCAyNTVMICk7CgkJCQljTWFwR1sgblggXSA9IChzYWxfdUludDgpIE1pbk1heCggRlJvdW5kKCBuWCAqIGZNICsgZkdPZmYgKSwgMEwsIDI1NUwgKTsKCQkJCWNNYXBCWyBuWCBdID0gKHNhbF91SW50OCkgTWluTWF4KCBGUm91bmQoIG5YICogZk0gKyBmQk9mZiApLCAwTCwgMjU1TCApOwoKCQkJCWlmKCBiR2FtbWEgKQoJCQkJewoJCQkJCWNNYXBSWyBuWCBdID0gR0FNTUEoIGNNYXBSWyBuWCBdLCBmR2FtbWEgKTsKCQkJCQljTWFwR1sgblggXSA9IEdBTU1BKCBjTWFwR1sgblggXSwgZkdhbW1hICk7CgkJCQkJY01hcEJbIG5YIF0gPSBHQU1NQSggY01hcEJbIG5YIF0sIGZHYW1tYSApOwoJCQkJfQoKCQkJCWlmKCBiSW52ZXJ0ICkKCQkJCXsKCQkJCQljTWFwUlsgblggXSA9IH5jTWFwUlsgblggXTsKCQkJCQljTWFwR1sgblggXSA9IH5jTWFwR1sgblggXTsKCQkJCQljTWFwQlsgblggXSA9IH5jTWFwQlsgblggXTsKCQkJCX0KCQkJfQoKCQkJLy8gZG8gbW9kaWZ5aW5nCgkJCWlmKCBwQWNjLT5IYXNQYWxldHRlKCkgKQoJCQl7CgkJCQlCaXRtYXBDb2xvciBhTmV3Q29sOwoKCQkJCWZvciggc2FsX3VJbnQxNiBpID0gMCwgbkNvdW50ID0gcEFjYy0+R2V0UGFsZXR0ZUVudHJ5Q291bnQoKTsgaSA8IG5Db3VudDsgaSsrICkKCQkJCXsKCQkJCQljb25zdCBCaXRtYXBDb2xvciYgckNvbCA9IHBBY2MtPkdldFBhbGV0dGVDb2xvciggaSApOyAKCQkJCQlhTmV3Q29sLlNldFJlZCggY01hcFJbIHJDb2wuR2V0UmVkKCkgXSApOwoJCQkJCWFOZXdDb2wuU2V0R3JlZW4oIGNNYXBHWyByQ29sLkdldEdyZWVuKCkgXSApOwoJCQkJCWFOZXdDb2wuU2V0Qmx1ZSggY01hcEJbIHJDb2wuR2V0Qmx1ZSgpIF0gKTsKCQkJCQlwQWNjLT5TZXRQYWxldHRlQ29sb3IoIGksIGFOZXdDb2wgKTsKCQkJCX0KCQkJfQoJCQllbHNlIGlmKCBwQWNjLT5HZXRTY2FubGluZUZvcm1hdCgpID09IEJNUF9GT1JNQVRfMjRCSVRfVENfQkdSICkKCQkJewoJCQkJZm9yKCBuWSA9IDBMOyBuWSA8IG5IOyBuWSsrICkKCQkJCXsKCQkJCQlTY2FubGluZSBwU2NhbiA9IHBBY2MtPkdldFNjYW5saW5lKCBuWSApOwoKCQkJCQlmb3IoIG5YID0gMEw7IG5YIDwgblc7IG5YKysgKQoJCQkJCXsKCQkJCQkJKnBTY2FuID0gY01hcEJbICpwU2NhbiBdOyBwU2NhbisrOwoJCQkJCQkqcFNjYW4gPSBjTWFwR1sgKnBTY2FuIF07IHBTY2FuKys7CgkJCQkJCSpwU2NhbiA9IGNNYXBSWyAqcFNjYW4gXTsgcFNjYW4rKzsKCQkJCQl9CgkJCQl9CgkJCX0KCQkJZWxzZSBpZiggcEFjYy0+R2V0U2NhbmxpbmVGb3JtYXQoKSA9PSBCTVBfRk9STUFUXzI0QklUX1RDX1JHQiApCgkJCXsKCQkJCWZvciggblkgPSAwTDsgblkgPCBuSDsgblkrKyApCgkJCQl7CgkJCQkJU2NhbmxpbmUgcFNjYW4gPSBwQWNjLT5HZXRTY2FubGluZSggblkgKTsKCgkJCQkJZm9yKCBuWCA9IDBMOyBuWCA8IG5XOyBuWCsrICkKCQkJCQl7CgkJCQkJCSpwU2NhbiA9IGNNYXBSWyAqcFNjYW4gXTsgcFNjYW4rKzsKCQkJCQkJKnBTY2FuID0gY01hcEdbICpwU2NhbiBdOyBwU2NhbisrOwoJCQkJCQkqcFNjYW4gPSBjTWFwQlsgKnBTY2FuIF07IHBTY2FuKys7CgkJCQkJfQoJCQkJfQoJCQl9CgkJCWVsc2UKCQkJewoJCQkJZm9yKCBuWSA9IDBMOyBuWSA8IG5IOyBuWSsrICkKCQkJCXsKCQkJCQlmb3IoIG5YID0gMEw7IG5YIDwgblc7IG5YKysgKQoJCQkJCXsKCQkJCQkJYUNvbCA9IHBBY2MtPkdldFBpeGVsKCBuWSwgblggKTsKCQkJCQkJYUNvbC5TZXRSZWQoIGNNYXBSWyBhQ29sLkdldFJlZCgpIF0gKTsKCQkJCQkJYUNvbC5TZXRHcmVlbiggY01hcEdbIGFDb2wuR2V0R3JlZW4oKSBdICk7CgkJCQkJCWFDb2wuU2V0Qmx1ZSggY01hcEJbIGFDb2wuR2V0Qmx1ZSgpIF0gKTsKCQkJCQkJcEFjYy0+U2V0UGl4ZWwoIG5ZLCBuWCwgYUNvbCApOwoJCQkJCX0KCQkJCX0KCQkJfQoKCQkJZGVsZXRlW10gY01hcFI7CgkJCWRlbGV0ZVtdIGNNYXBHOwoJCQlkZWxldGVbXSBjTWFwQjsKCQkJUmVsZWFzZUFjY2VzcyggcEFjYyApOwoJCQliUmV0ID0gc2FsX1RydWU7CgkJfQoJfQoKCXJldHVybiBiUmV0Owp9Cg==