Ci8qIQogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBcZmlsZSBsb29wRmlsdGVyLmMKICoKICogXGJyaWVmCiAqICAgIEZpbHRlciB0byByZWR1Y2UgYmxvY2tpbmcgYXJ0aWZhY3RzIG9uIGEgbWFjcm9ibG9jayBsZXZlbC4KICogICAgVGhlIGZpbHRlciBzdHJlbmd0aCBpcyBRUCBkZXBlbmRlbnQuCiAqCiAqIFxhdXRob3IKICogICAgQ29udHJpYnV0b3JzOgogKiAgICAtIFBldGVyIExpc3QgICAgICAgUGV0ZXIuTGlzdEB0LXN5c3RlbXMuZGU6ICBPcmlnaW5hbCBjb2RlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDEzLUF1Zy0yMDAxKQogKiAgICAtIEphbmkgTGFpbmVtYSAgICAgSmFuaS5MYWluZW1hQG5va2lhLmNvbTogICBTb21lIGJ1ZyBmaXhpbmcsIHJlbW92YWwgb2YgcmVjdXNpdmVuZXNzICAgICAgKDE2LUF1Zy0yMDAxKQogKiAgICAtIFBldGVyIExpc3QgICAgICAgUGV0ZXIuTGlzdEB0LXN5c3RlbXMuZGU6ICBpbnBsYWNlIGZpbHRlcmluZyBhbmQgdmFyaW91cyBzaW1wbGlmaWNhdGlvbnMgKDEwLUphbi0yMDAyKQogKiAgICAtIEFudGhvbnkgSm9jaCAgICAgYW50aG9ueUB1YnZpZGVvLmNvbTogICAgICBTaW1wbGlmaWVkIHN3aXRjaGluZyBiZXR3ZWVuIGZpbHRlcnMgYW5kCiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vbi1yZWN1cnNpdmUgZGVmYXVsdCBmaWx0ZXIuICAgICAgICAgICAgICAgICAoMDgtSnVsLTIwMDIpCiAqICAgIC0gQ3Jpc3RpbmEgR29taWxhICBjcmlzdGluYS5nb21pbGFAdGhvbXNvbi5uZXQ6IFNpbXBsaWZpY2F0aW9uIG9mIHRoZSBjaHJvbWEgZGVibG9ja2luZwogKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcm9tIEpWVC1FMDg5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDIxLU5vdi0yMDAyKQogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKi8KI2luY2x1ZGUgPHN0ZGxpYi5oPgojaW5jbHVkZSA8c3RyaW5nLmg+CiNpbmNsdWRlIDxhc3NlcnQuaD4KCiNpbmNsdWRlICJnbG9iYWwuaCIKI2luY2x1ZGUgImltYWdlLmgiCiNpbmNsdWRlICJtYl9hY2Nlc3MuaCIKCmJ5dGUgbWl4ZWRNb2RlRWRnZUZsYWcsIGZpZWxkTW9kZUZpbHRlcmluZ0ZsYWc7CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwoKLy8gTk9URTogSW4gcHJpbmNpcGxlLCB0aGUgYWxwaGEgYW5kIGJldGEgdGFibGVzIGFyZSBjYWxjdWxhdGVkIHdpdGggdGhlIGZvcm11bGFzIGJlbG93Ci8vICAgICAgIEFscGhhKCBxcCApID0gMC44ICogKDJeKHFwLzYpICAtICAxKQovLyAgICAgICBCZXRhICggcXAgKSA9IDAuNSAqIHFwICAtICA3CgovLyBUaGUgdGFibGVzIGFjdHVhbGx5IHVzZWQgaGF2ZSBiZWVuICJoYW5kIG9wdGltaXplZCIgdGhvdWdoIChieSBBbnRob255IEpvY2gpLiBTbywgdGhlCi8vIHRhYmxlIHZhbHVlcyBtaWdodCBiZSBhIGxpdHRsZSBkaWZmZXJlbnQgdG8gZm9ybXVsYS1nZW5lcmF0ZWQgdmFsdWVzLiBBbHNvLCB0aGUgZmlyc3QKLy8gZmV3IHZhbHVlcyBvZiBib3RoIHRhYmxlcyBpcyBzZXQgdG8gemVybyB0byBmb3JjZSB0aGUgZmlsdGVyIG9mZiBhdCBsb3cgcXCScwoKc3RhdGljIGNvbnN0IGJ5dGUgQUxQSEFfVEFCTEVbNTJdICA9IHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwgMCwwLDAsMCw0LDQsNSw2LCAgNyw4LDksMTAsMTIsMTMsMTUsMTcsICAyMCwyMiwyNSwyOCwzMiwzNiw0MCw0NSwgIDUwLDU2LDYzLDcxLDgwLDkwLDEwMSwxMTMsICAxMjcsMTQ0LDE2MiwxODIsMjAzLDIyNiwyNTUsMjU1fSA7CnN0YXRpYyBjb25zdCBieXRlICBCRVRBX1RBQkxFWzUyXSAgPSB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsIDAsMCwwLDAsMiwyLDIsMywgIDMsMywzLCA0LCA0LCA0LCA2LCA2LCAgIDcsIDcsIDgsIDgsIDksIDksMTAsMTAsICAxMSwxMSwxMiwxMiwxMywxMywgMTQsIDE0LCAgIDE1LCAxNSwgMTYsIDE2LCAxNywgMTcsIDE4LCAxOH0gOwpzdGF0aWMgY29uc3QgYnl0ZSBDTElQX1RBQls1Ml1bNV0gID0KewogIHsgMCwgMCwgMCwgMCwgMH0seyAwLCAwLCAwLCAwLCAwfSx7IDAsIDAsIDAsIDAsIDB9LHsgMCwgMCwgMCwgMCwgMH0seyAwLCAwLCAwLCAwLCAwfSx7IDAsIDAsIDAsIDAsIDB9LHsgMCwgMCwgMCwgMCwgMH0seyAwLCAwLCAwLCAwLCAwfSwKICB7IDAsIDAsIDAsIDAsIDB9LHsgMCwgMCwgMCwgMCwgMH0seyAwLCAwLCAwLCAwLCAwfSx7IDAsIDAsIDAsIDAsIDB9LHsgMCwgMCwgMCwgMCwgMH0seyAwLCAwLCAwLCAwLCAwfSx7IDAsIDAsIDAsIDAsIDB9LHsgMCwgMCwgMCwgMCwgMH0sCiAgeyAwLCAwLCAwLCAwLCAwfSx7IDAsIDAsIDAsIDEsIDF9LHsgMCwgMCwgMCwgMSwgMX0seyAwLCAwLCAwLCAxLCAxfSx7IDAsIDAsIDAsIDEsIDF9LHsgMCwgMCwgMSwgMSwgMX0seyAwLCAwLCAxLCAxLCAxfSx7IDAsIDEsIDEsIDEsIDF9LAogIHsgMCwgMSwgMSwgMSwgMX0seyAwLCAxLCAxLCAxLCAxfSx7IDAsIDEsIDEsIDEsIDF9LHsgMCwgMSwgMSwgMiwgMn0seyAwLCAxLCAxLCAyLCAyfSx7IDAsIDEsIDEsIDIsIDJ9LHsgMCwgMSwgMSwgMiwgMn0seyAwLCAxLCAyLCAzLCAzfSwKICB7IDAsIDEsIDIsIDMsIDN9LHsgMCwgMiwgMiwgMywgM30seyAwLCAyLCAyLCA0LCA0fSx7IDAsIDIsIDMsIDQsIDR9LHsgMCwgMiwgMywgNCwgNH0seyAwLCAzLCAzLCA1LCA1fSx7IDAsIDMsIDQsIDYsIDZ9LHsgMCwgMywgNCwgNiwgNn0sCiAgeyAwLCA0LCA1LCA3LCA3fSx7IDAsIDQsIDUsIDgsIDh9LHsgMCwgNCwgNiwgOSwgOX0seyAwLCA1LCA3LDEwLDEwfSx7IDAsIDYsIDgsMTEsMTF9LHsgMCwgNiwgOCwxMywxM30seyAwLCA3LDEwLDE0LDE0fSx7IDAsIDgsMTEsMTYsMTZ9LAogIHsgMCwgOSwxMiwxOCwxOH0seyAwLDEwLDEzLDIwLDIwfSx7IDAsMTEsMTUsMjMsMjN9LHsgMCwxMywxNywyNSwyNX0KfSA7CgpzdGF0aWMgY29uc3Qgc2lnbmVkIGNoYXIgY2hyb21hX2VkZ2VbMl1bNF1bNF0gPSAvL1tkaXJdW2VkZ2VdW3l1dl9mb3JtYXRdCnsgeyB7LTEsIDAsIDAsIDB9LAogICAgey0xLC0xLC0xLCAxfSwKICAgIHstMSwgMSwgMSwgMn0sCiAgICB7LTEsLTEsLTEsIDN9fSwKCiAgeyB7LTEsIDAsIDAsIDB9LAogICAgey0xLC0xLCAxLCAxfSwKICAgIHstMSwgMSwgMiwgMn0sCiAgICB7LTEsLTEsIDMsIDN9fX07Cgp2b2lkIEdldFN0cmVuZ3RoKGJ5dGUgU3RyZW5ndGhbMTZdLEltYWdlUGFyYW1ldGVycyAqaW1nLGludCBNYlFBZGRyLGludCBkaXIsaW50IGVkZ2UsIGludCBtdmxpbWl0KTsKdm9pZCBFZGdlTG9vcChpbWdwZWwqKiBJbWcsIGJ5dGUgU3RyZW5ndGhbMTZdLEltYWdlUGFyYW1ldGVycyAqaW1nLCBpbnQgTWJRQWRkciwgaW50IEFscGhhQzBPZmZzZXQsIGludCBCZXRhT2Zmc2V0LCBpbnQgZGlyLCBpbnQgZWRnZSwgaW50IHdpZHRoLCBpbnQgeXV2LCBpbnQgdXYpOwp2b2lkIERlYmxvY2tNYihJbWFnZVBhcmFtZXRlcnMgKmltZywgaW1ncGVsICoqaW1nWSwgaW1ncGVsICoqKmltZ1VWLCBpbnQgTWJRQWRkcikgOwoKLyohCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBcYnJpZWYKICogICAgRmlsdGVyIGFsbCBtYWNyb2Jsb2NrcyBpbiBvcmRlciBvZiBpbmNyZWFzaW5nIG1hY3JvYmxvY2sgYWRkcmVzcy4KICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqLwp2b2lkIERlYmxvY2tGcmFtZShJbWFnZVBhcmFtZXRlcnMgKmltZywgaW1ncGVsICoqaW1nWSwgaW1ncGVsICoqKmltZ1VWKQp7CiAgdW5zaWduZWQgaTsKCiAgZm9yIChpPTA7IGk8aW1nLT5QaWNTaXplSW5NYnM7IGkrKykKICB7CiAgICBpZiAoaW1nLT5tYl9kYXRhW2ldLm1iX3R5cGU9PUlQQ00pCiAgICB7CiAgICAgIGltZy0+bWJfZGF0YVtpXS5xcCA9IDA7CiAgICB9CiAgfQoKICBmb3IgKGk9MDsgaTxpbWctPlBpY1NpemVJbk1iczsgaSsrKQogIHsKICAgIERlYmxvY2tNYiggaW1nLCBpbWdZLCBpbWdVViwgaSApIDsKICB9Cn0KCgovKiEKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIFxicmllZgogKiAgICBEZWJsb2NraW5nIGZpbHRlciBmb3Igb25lIG1hY3JvYmxvY2suCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKi8KCnZvaWQgRGVibG9ja01iKEltYWdlUGFyYW1ldGVycyAqaW1nLCBpbWdwZWwgKippbWdZLCBpbWdwZWwgKioqaW1nVVYsIGludCBNYlFBZGRyKQp7CiAgaW50ICAgICAgICAgICBFZGdlQ29uZGl0aW9uOwogIGludCAgICAgICAgICAgZGlyLGVkZ2U7CiAgYnl0ZSAgICAgICAgICBTdHJlbmd0aFsxNl07CiAgaW50ICAgICAgICAgICBtYl94LCBtYl95OwoKICBpbnQgICAgICAgICAgIGZpbHRlck5vbjh4OEx1bWFFZGdlc0ZsYWdbNF0gPSB7MSwxLDEsMX07CiAgaW50ICAgICAgICAgICBmaWx0ZXJMZWZ0TWJFZGdlRmxhZzsKICBpbnQgICAgICAgICAgIGZpbHRlclRvcE1iRWRnZUZsYWc7CiAgaW50ICAgICAgICAgICBmaWVsZE1vZGVNYkZsYWc7CiAgaW50ICAgICAgICAgICBtdmxpbWl0PTQ7CiAgaW50ICAgICAgICAgICBpLCBTdHJlbmd0aFN1bTsKICBNYWNyb2Jsb2NrICAgICpNYlE7CgogIGludCAgICAgICAgICAgZWRnZV9jcjsKCiAgaW1nLT5EZWJsb2NrQ2FsbCA9IDE7CiAgZ2V0X21iX3BvcyAoTWJRQWRkciwgJm1iX3gsICZtYl95LCBJU19MVU1BKTsKCiAgZmlsdGVyTGVmdE1iRWRnZUZsYWcgID0gKG1iX3ggIT0gMCk7CiAgZmlsdGVyVG9wTWJFZGdlRmxhZyAgID0gKG1iX3kgIT0gMCk7CgogIE1iUSAgPSAmKGltZy0+bWJfZGF0YVtNYlFBZGRyXSkgOyAvLyBjdXJyZW50IE1iCgogIGlmIChNYlEtPm1iX3R5cGUgPT0gSThNQikKICAgIGFzc2VydChNYlEtPmx1bWFfdHJhbnNmb3JtX3NpemVfOHg4X2ZsYWcpOwoKICBmaWx0ZXJOb244eDhMdW1hRWRnZXNGbGFnWzFdID0KICBmaWx0ZXJOb244eDhMdW1hRWRnZXNGbGFnWzNdID0gIShNYlEtPmx1bWFfdHJhbnNmb3JtX3NpemVfOHg4X2ZsYWcpOwoKICBpZiAoaW1nLT5NYmFmZkZyYW1lRmxhZyAmJiBtYl95PT0xNiAmJiBNYlEtPm1iX2ZpZWxkKQogICAgZmlsdGVyVG9wTWJFZGdlRmxhZyA9IDA7CgogIGZpZWxkTW9kZU1iRmxhZyA9IChpbWctPnN0cnVjdHVyZSE9RlJBTUUpIHx8IChpbWctPk1iYWZmRnJhbWVGbGFnICYmIE1iUS0+bWJfZmllbGQpOwogIGlmIChmaWVsZE1vZGVNYkZsYWcpCiAgICBtdmxpbWl0ID0gMjsKCiAgLy8gcmV0dXJuLCBpZiBmaWx0ZXIgaXMgZGlzYWJsZWQKICBpZiAoTWJRLT5MRkRpc2FibGVJZGM9PTEpIHsKICAgIGltZy0+RGVibG9ja0NhbGwgPSAwOwogICAgcmV0dXJuOwogIH0KCiAgaWYgKE1iUS0+TEZEaXNhYmxlSWRjPT0yKQogIHsKICAgIC8vIGRvbid0IGZpbHRlciBhdCBzbGljZSBib3VuZGFyaWVzCiAgICBmaWx0ZXJMZWZ0TWJFZGdlRmxhZyA9IE1iUS0+bWJBdmFpbEE7CiAgICAvLyBpZiB0aGlzIHRoZSBib3R0b20gb2YgYSBmcmFtZSBtYWNyb2Jsb2NrIHBhaXIgdGhlbiBhbHdheXMgZmlsdGVyIHRoZSB0b3AgZWRnZQogICAgaWYgKGltZy0+TWJhZmZGcmFtZUZsYWcgJiYgIU1iUS0+bWJfZmllbGQgJiYgKE1iUUFkZHIgJiAweDAxKSkKICAgICAgZmlsdGVyVG9wTWJFZGdlRmxhZyAgPSAxOwogICAgZWxzZQogICAgICBmaWx0ZXJUb3BNYkVkZ2VGbGFnICA9IE1iUS0+bWJBdmFpbEI7CiAgfQoKICBpbWctPmN1cnJlbnRfbWJfbnIgPSBNYlFBZGRyOwogIENoZWNrQXZhaWxhYmlsaXR5T2ZOZWlnaGJvcnMoKTsKCiAgZm9yKCBkaXI9MCA7IGRpcjwyIDsgZGlyKysgKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHZlcnRpY2FsIGVkZ2VzLCB0aGFuIGhvcmljb250YWwgZWRnZXMKICB7CiAgICBFZGdlQ29uZGl0aW9uID0gKGRpciAmJiBmaWx0ZXJUb3BNYkVkZ2VGbGFnKSB8fCAoIWRpciAmJiBmaWx0ZXJMZWZ0TWJFZGdlRmxhZyk7IC8vIGNhbiBub3QgZmlsdGVyIGJleW9uZCBwaWN0dXJlIGJvdW5kYXJpZXMKICAgIGZvciggZWRnZT0wIDsgZWRnZTw0IDsgZWRnZSsrICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGZpcnN0IDQgdmVydGljYWwgc3RyaXBzIG9mIDE2IHBlbAogICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhlbiAgNCBob3JpY29udGFsCiAgICAgIGlmKCBlZGdlIHx8IEVkZ2VDb25kaXRpb24gKQogICAgICB7CiAgICAgICAgZWRnZV9jciA9IGNocm9tYV9lZGdlW2Rpcl1bZWRnZV1baW1nLT55dXZfZm9ybWF0XTsKCiAgICAgICAgR2V0U3RyZW5ndGgoU3RyZW5ndGgsaW1nLE1iUUFkZHIsZGlyLGVkZ2UsIG12bGltaXQpOyAvLyBTdHJlbmd0aCBmb3IgNCBibGtzIGluIDEgc3RyaXBlCiAgICAgICAgU3RyZW5ndGhTdW0gPSBTdHJlbmd0aFswXTsKICAgICAgICBmb3IgKGkgPSAxOyBpIDwgMTY7IGkrKykKICAgICAgICB7CiAgICAgICAgICBpZiAoU3RyZW5ndGhTdW0pIGJyZWFrOwogICAgICAgICAgU3RyZW5ndGhTdW0gKz0gU3RyZW5ndGhbaV07CiAgICAgICAgfQogICAgICAgIGlmKCBTdHJlbmd0aFN1bSApICAgICAgICAgICAgICAgICAgICAgIC8vIG9ubHkgaWYgb25lIG9mIHRoZSAxNiBTdHJlbmd0aCBieXRlcyBpcyAhPSAwCiAgICAgICAgewogICAgICAgICAgaWYgKGZpbHRlck5vbjh4OEx1bWFFZGdlc0ZsYWdbZWRnZV0pCiAgICAgICAgICAgIEVkZ2VMb29wKCBpbWdZLCBTdHJlbmd0aCwgaW1nLCBNYlFBZGRyLCBNYlEtPkxGQWxwaGFDME9mZnNldCwgTWJRLT5MRkJldGFPZmZzZXQsIGRpciwgZWRnZSwgaW1nLT53aWR0aCwgMCwgMCkgOwogICAgICAgICAgaWYoIChpbWdVViAhPSBOVUxMKSAmJiAoZWRnZV9jciA+PSAwKSkKICAgICAgICAgIHsKICAgICAgICAgICAgRWRnZUxvb3AoIGltZ1VWWzBdLCBTdHJlbmd0aCwgaW1nLCBNYlFBZGRyLCBNYlEtPkxGQWxwaGFDME9mZnNldCwgTWJRLT5MRkJldGFPZmZzZXQsIGRpciwgZWRnZV9jciwgaW1nLT53aWR0aF9jciwgMSAsIDApIDsKICAgICAgICAgICAgRWRnZUxvb3AoIGltZ1VWWzFdLCBTdHJlbmd0aCwgaW1nLCBNYlFBZGRyLCBNYlEtPkxGQWxwaGFDME9mZnNldCwgTWJRLT5MRkJldGFPZmZzZXQsIGRpciwgZWRnZV9jciwgaW1nLT53aWR0aF9jciwgMSAsIDEpIDsKICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIGlmIChkaXIgJiYgIWVkZ2UgJiYgIU1iUS0+bWJfZmllbGQgJiYgbWl4ZWRNb2RlRWRnZUZsYWcpIHsKICAgICAgICAgIC8vIHRoaXMgaXMgdGhlIGV4dHJhIGhvcml6b250YWwgZWRnZSBiZXR3ZWVuIGEgZnJhbWUgbWFjcm9ibG9jayBwYWlyIGFuZCBhIGZpZWxkIGFib3ZlIGl0CiAgICAgICAgICBpbWctPkRlYmxvY2tDYWxsID0gMjsKICAgICAgICAgIEdldFN0cmVuZ3RoKFN0cmVuZ3RoLGltZyxNYlFBZGRyLGRpciw0LCBtdmxpbWl0KTsgLy8gU3RyZW5ndGggZm9yIDQgYmxrcyBpbiAxIHN0cmlwZQogICAgICAgICAgLy9pZiggKigoaW50KilTdHJlbmd0aCkgKSAgICAgICAgICAgICAgICAgICAgICAvLyBvbmx5IGlmIG9uZSBvZiB0aGUgNCBTdHJlbmd0aCBieXRlcyBpcyAhPSAwCiAgICAgICAgICB7CiAgICAgICAgICAgIGlmIChmaWx0ZXJOb244eDhMdW1hRWRnZXNGbGFnW2VkZ2VdKQogICAgICAgICAgICAgIEVkZ2VMb29wKCBpbWdZLCBTdHJlbmd0aCwgaW1nLCBNYlFBZGRyLCBNYlEtPkxGQWxwaGFDME9mZnNldCwgTWJRLT5MRkJldGFPZmZzZXQsIGRpciwgNCwgaW1nLT53aWR0aCwgMCwgMCkgOwogICAgICAgICAgICBpZiggKGltZ1VWICE9IE5VTEwpICYmIChlZGdlX2NyID49IDApKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgRWRnZUxvb3AoIGltZ1VWWzBdLCBTdHJlbmd0aCwgaW1nLCBNYlFBZGRyLCBNYlEtPkxGQWxwaGFDME9mZnNldCwgTWJRLT5MRkJldGFPZmZzZXQsIGRpciwgNCwgaW1nLT53aWR0aF9jciwgMSwgMCkgOwogICAgICAgICAgICAgIEVkZ2VMb29wKCBpbWdVVlsxXSwgU3RyZW5ndGgsIGltZywgTWJRQWRkciwgTWJRLT5MRkFscGhhQzBPZmZzZXQsIE1iUS0+TEZCZXRhT2Zmc2V0LCBkaXIsIDQsIGltZy0+d2lkdGhfY3IsIDEsIDEpIDsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgICAgaW1nLT5EZWJsb2NrQ2FsbCA9IDE7CiAgICAgICAgfQogICAgICB9CiAgICB9Ly9lbmQgZWRnZQogIH0vL2VuZCBsb29wIGRpcgogIGltZy0+RGVibG9ja0NhbGwgPSAwOwoKfQoKICAvKiEKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBcYnJpZWYKICogICAgcmV0dXJucyBhIGJ1ZmZlciBvZiAxNiBTdHJlbmd0aCB2YWx1ZXMgZm9yIG9uZSBzdHJpcGUgaW4gYSBtYiAoZm9yIGRpZmZlcmVudCBGcmFtZSB0eXBlcykKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKi8KCiNkZWZpbmUgQU5ZX0lOVFJBIChNYlAtPm1iX3R5cGU9PUk0TUJ8fE1iUC0+bWJfdHlwZT09STE2TUJ8fE1iUC0+bWJfdHlwZT09SVBDTXx8TWJRLT5tYl90eXBlPT1JNE1CfHxNYlEtPm1iX3R5cGU9PUkxNk1CfHxNYlEtPm1iX3R5cGU9PUlQQ00pCgp2b2lkIEdldFN0cmVuZ3RoKGJ5dGUgU3RyZW5ndGhbMTZdLEltYWdlUGFyYW1ldGVycyAqaW1nLGludCBNYlFBZGRyLGludCBkaXIsaW50IGVkZ2UsIGludCBtdmxpbWl0KQp7CiAgaW50ICAgIGJsa1AsIGJsa1EsIGlkeDsKICBpbnQgICAgYmxrX3gsIGJsa194MiwgYmxrX3ksIGJsa195MiA7CiAgc2hvcnQgICoqKmxpc3QwX212ID0gZW5jX3BpY3R1cmUtPm12W0xJU1RfMF07CiAgc2hvcnQgICoqKmxpc3QxX212ID0gZW5jX3BpY3R1cmUtPm12W0xJU1RfMV07CiAgc2lnbmVkIGNoYXIgKipsaXN0MF9yZWZJZHhBcnIgPSBlbmNfcGljdHVyZS0+cmVmX2lkeFtMSVNUXzBdOwogIHNpZ25lZCBjaGFyICoqbGlzdDFfcmVmSWR4QXJyID0gZW5jX3BpY3R1cmUtPnJlZl9pZHhbTElTVF8xXTsKICBpbnQ2NCAgKipsaXN0MF9yZWZQaWNJZEFyciA9IGVuY19waWN0dXJlLT5yZWZfcGljX2lkW0xJU1RfMF07CiAgaW50NjQgICoqbGlzdDFfcmVmUGljSWRBcnIgPSBlbmNfcGljdHVyZS0+cmVmX3BpY19pZFtMSVNUXzFdOwogIGludDY0ICAgIHJlZl9wMCxyZWZfcDEscmVmX3EwLHJlZl9xMTsKICBpbnQgICAgeFEsIHhQLCB5USwgeVA7CiAgaW50ICAgIG1iX3gsIG1iX3k7CiAgTWFjcm9ibG9jayAgICAqTWJRLCAqTWJQOwogIFBpeGVsUG9zIHBpeFA7CiAgaW50IGRpcl9tMSA9ICgxIC0gZGlyKTsKCiAgTWJRID0gJihpbWctPm1iX2RhdGFbTWJRQWRkcl0pOwoKICBmb3IoIGlkeD0wIDsgaWR4PDE2IDsgaWR4KysgKQogIHsKICAgIHhRID0gZGlyID8gaWR4IDogZWRnZSA8PCAyOwogICAgeVEgPSBkaXIgPyAoZWRnZSA8IDQgPyBlZGdlIDw8IDIgOiAxKSA6IGlkeDsKICAgIGdldE5laWdoYm91cihNYlFBZGRyLCB4USAtIGRpcl9tMSwgeVEgLSBkaXIsIElTX0xVTUEsICZwaXhQKTsKICAgIHhQID0gcGl4UC54OwogICAgeVAgPSBwaXhQLnk7CiAgICBNYlAgPSAmKGltZy0+bWJfZGF0YVtwaXhQLm1iX2FkZHJdKTsKICAgIG1peGVkTW9kZUVkZ2VGbGFnID0gTWJRLT5tYl9maWVsZCAhPSBNYlAtPm1iX2ZpZWxkOwoKICAgIGJsa1EgPSAoKHlRPj4yKTw8MikgKyAoeFE+PjIpOwogICAgYmxrUCA9ICgoeVA+PjIpPDwyKSArICh4UD4+Mik7CgogICAgaWYgKChpbWctPnR5cGU9PVNQX1NMSUNFKXx8KGltZy0+dHlwZT09U0lfU0xJQ0UpICkKICAgIHsKICAgICAgU3RyZW5ndGhbaWR4XSA9IChlZGdlID09IDAgJiYgKCgoIWltZy0+TWJhZmZGcmFtZUZsYWcgJiYgKGltZy0+c3RydWN0dXJlPT1GUkFNRSkpIHx8CiAgICAgIChpbWctPk1iYWZmRnJhbWVGbGFnICYmICFNYlAtPm1iX2ZpZWxkICYmICFNYlEtPm1iX2ZpZWxkKSkgfHwKICAgICAgKChpbWctPk1iYWZmRnJhbWVGbGFnIHx8IChpbWctPnN0cnVjdHVyZSAhPSBGUkFNRSkpICYmICFkaXIpKSkgPyA0IDogMzsKICAgIH0KICAgIGVsc2UKICAgIHsKICAgICAgLy8gU3RhcnQgd2l0aCBTdHJlbmd0aD0zLiBvciBTdHJlbmd0aD00IGZvciBNYi1lZGdlCiAgICAgIFN0cmVuZ3RoW2lkeF0gPSAoZWRnZSA9PSAwICYmICgoKCFpbWctPk1iYWZmRnJhbWVGbGFnICYmIChpbWctPnN0cnVjdHVyZT09RlJBTUUpKSB8fAogICAgICAgIChpbWctPk1iYWZmRnJhbWVGbGFnICYmICFNYlAtPm1iX2ZpZWxkICYmICFNYlEtPm1iX2ZpZWxkKSkgfHwKICAgICAgICAoKGltZy0+TWJhZmZGcmFtZUZsYWcgfHwgKGltZy0+c3RydWN0dXJlIT1GUkFNRSkpICYmICFkaXIpKSkgPyA0IDogMzsKCiAgICAgIGlmKCAgIShNYlAtPm1iX3R5cGU9PUk0TUIgfHwgTWJQLT5tYl90eXBlPT1JMTZNQiB8fCBNYlAtPm1iX3R5cGU9PUk4TUIgfHwgTWJQLT5tYl90eXBlPT1JUENNKQogICAgICAgICYmICEoTWJRLT5tYl90eXBlPT1JNE1CIHx8IE1iUS0+bWJfdHlwZT09STE2TUIgfHwgTWJRLT5tYl90eXBlPT1JOE1CIHx8IE1iUS0+bWJfdHlwZT09SVBDTSkgKQogICAgICB7CiAgICAgICAgaWYoICgoTWJRLT5jYnBfYmxrICYgICgoaW50NjQpMSA8PCBibGtRICkpICE9IDApIHx8ICgoTWJQLT5jYnBfYmxrICYgICgoaW50NjQpMSA8PCBibGtQKSkgIT0gMCkgKQogICAgICAgICAgU3RyZW5ndGhbaWR4XSA9IDIgOwogICAgICAgIGVsc2UKICAgICAgICB7CiAgICAgICAgICAvLyBpZiBubyBjb2VmcywgYnV0IHZlY3RvciBkaWZmZXJlbmNlID49IDEgc2V0IFN0cmVuZ3RoPTEKICAgICAgICAgIC8vIGlmIHRoaXMgaXMgYSBtaXhlZCBtb2RlIGVkZ2UgdGhlbiBvbmUgc2V0IG9mIHJlZmVyZW5jZSBwaWN0dXJlcyB3aWxsIGJlIGZyYW1lIGFuZCB0aGUKICAgICAgICAgIC8vIG90aGVyIHdpbGwgYmUgZmllbGQKICAgICAgICAgIGlmIChtaXhlZE1vZGVFZGdlRmxhZykKICAgICAgICAgIHsKICAgICAgICAgICAgKFN0cmVuZ3RoW2lkeF0gPSAxKTsKICAgICAgICAgIH0KICAgICAgICAgIGVsc2UKICAgICAgICAgIHsKICAgICAgICAgICAgZ2V0X21iX2Jsb2NrX3BvcyAoTWJRQWRkciwgJm1iX3gsICZtYl95KTsKICAgICAgICAgICAgYmxrX3kgID0gKG1iX3k8PDIpICsgKGJsa1EgPj4gMikgOwogICAgICAgICAgICBibGtfeCAgPSAobWJfeDw8MikgKyAoYmxrUSAgJiAzKSA7CiAgICAgICAgICAgIGJsa195MiA9IHBpeFAucG9zX3kgPj4gMjsKICAgICAgICAgICAgYmxrX3gyID0gcGl4UC5wb3NfeCA+PiAyOwogICAgICAgICAgICB7CiAgICAgICAgICAgICAgcmVmX3AwID0gbGlzdDBfcmVmSWR4QXJyW2Jsa195XSBbYmxrX3hdIDwwID8gSU5UNjRfTUlOIDogbGlzdDBfcmVmUGljSWRBcnJbYmxrX3kgXVtibGtfeF07CiAgICAgICAgICAgICAgcmVmX3EwID0gbGlzdDBfcmVmSWR4QXJyW2Jsa195Ml1bYmxrX3gyXTwwID8gSU5UNjRfTUlOIDogbGlzdDBfcmVmUGljSWRBcnJbYmxrX3kyXVtibGtfeDJdOwogICAgICAgICAgICAgIHJlZl9wMSA9IGxpc3QxX3JlZklkeEFycltibGtfeSBdW2Jsa194XSA8MCA/IElOVDY0X01JTiA6IGxpc3QxX3JlZlBpY0lkQXJyW2Jsa195IF1bYmxrX3hdOwogICAgICAgICAgICAgIHJlZl9xMSA9IGxpc3QxX3JlZklkeEFycltibGtfeTJdW2Jsa194Ml08MCA/IElOVDY0X01JTiA6IGxpc3QxX3JlZlBpY0lkQXJyW2Jsa195Ml1bYmxrX3gyXTsKICAgICAgICAgICAgICBpZiAoICgocmVmX3AwPT1yZWZfcTApICYmIChyZWZfcDE9PXJlZl9xMSkpIHx8CiAgICAgICAgICAgICAgICAoKHJlZl9wMD09cmVmX3ExKSAmJiAocmVmX3AxPT1yZWZfcTApKSkKICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBTdHJlbmd0aFtpZHhdPTA7CiAgICAgICAgICAgICAgICAvLyBMMCBhbmQgTDEgcmVmZXJlbmNlIHBpY3R1cmVzIG9mIHAwIGFyZSBkaWZmZXJlbnQ7IHEwIGFzIHdlbGwKICAgICAgICAgICAgICAgIGlmIChyZWZfcDAgIT0gcmVmX3AxKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAvLyBjb21wYXJlIE1WIGZvciB0aGUgc2FtZSByZWZlcmVuY2UgcGljdHVyZQogICAgICAgICAgICAgICAgICBpZiAocmVmX3AwPT1yZWZfcTApCiAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBTdHJlbmd0aFtpZHhdID0KICAgICAgICAgICAgICAgICAgICAgICggKGlhYnMoIGxpc3QwX212W2Jsa195XVtibGtfeF1bMF0gLSBsaXN0MF9tdltibGtfeTJdW2Jsa194Ml1bMF0pID49IDQpCiAgICAgICAgICAgICAgICAgICAgICB8IChpYWJzKCBsaXN0MF9tdltibGtfeV1bYmxrX3hdWzFdIC0gbGlzdDBfbXZbYmxrX3kyXVtibGtfeDJdWzFdKSA+PSBtdmxpbWl0KQogICAgICAgICAgICAgICAgICAgICAgfCAoaWFicyggbGlzdDFfbXZbYmxrX3ldW2Jsa194XVswXSAtIGxpc3QxX212W2Jsa195Ml1bYmxrX3gyXVswXSkgPj0gNCkKICAgICAgICAgICAgICAgICAgICAgIHwgKGlhYnMoIGxpc3QxX212W2Jsa195XVtibGtfeF1bMV0gLSBsaXN0MV9tdltibGtfeTJdW2Jsa194Ml1bMV0pID49IG12bGltaXQpKTsKICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBTdHJlbmd0aFtpZHhdID0KICAgICAgICAgICAgICAgICAgICAgICggKGlhYnMoIGxpc3QwX212W2Jsa195XVtibGtfeF1bMF0gLSBsaXN0MV9tdltibGtfeTJdW2Jsa194Ml1bMF0pID49IDQpCiAgICAgICAgICAgICAgICAgICAgICB8IChpYWJzKCBsaXN0MF9tdltibGtfeV1bYmxrX3hdWzFdIC0gbGlzdDFfbXZbYmxrX3kyXVtibGtfeDJdWzFdKSA+PSBtdmxpbWl0KQogICAgICAgICAgICAgICAgICAgICAgfCAoaWFicyggbGlzdDFfbXZbYmxrX3ldW2Jsa194XVswXSAtIGxpc3QwX212W2Jsa195Ml1bYmxrX3gyXVswXSkgPj0gNCkKICAgICAgICAgICAgICAgICAgICAgIHwgKGlhYnMoIGxpc3QxX212W2Jsa195XVtibGtfeF1bMV0gLSBsaXN0MF9tdltibGtfeTJdW2Jsa194Ml1bMV0pID49IG12bGltaXQpKTsKICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgeyAvLyBMMCBhbmQgTDEgcmVmZXJlbmNlIHBpY3R1cmVzIG9mIHAwIGFyZSB0aGUgc2FtZTsgcTAgYXMgd2VsbAoKICAgICAgICAgICAgICAgICAgU3RyZW5ndGhbaWR4XSA9CiAgICAgICAgICAgICAgICAgICAgKCAoaWFicyggbGlzdDBfbXZbYmxrX3ldW2Jsa194XVswXSAtIGxpc3QwX212W2Jsa195Ml1bYmxrX3gyXVswXSkgPj0gNCkKICAgICAgICAgICAgICAgICAgICB8IChpYWJzKCBsaXN0MF9tdltibGtfeV1bYmxrX3hdWzFdIC0gbGlzdDBfbXZbYmxrX3kyXVtibGtfeDJdWzFdKSA+PSBtdmxpbWl0ICkKICAgICAgICAgICAgICAgICAgICB8IChpYWJzKCBsaXN0MV9tdltibGtfeV1bYmxrX3hdWzBdIC0gbGlzdDFfbXZbYmxrX3kyXVtibGtfeDJdWzBdKSA+PSA0KQogICAgICAgICAgICAgICAgICAgIHwgKGlhYnMoIGxpc3QxX212W2Jsa195XVtibGtfeF1bMV0gLSBsaXN0MV9tdltibGtfeTJdW2Jsa194Ml1bMV0pID49IG12bGltaXQpKQogICAgICAgICAgICAgICAgICAgICYmCiAgICAgICAgICAgICAgICAgICAgKCAoaWFicyggbGlzdDBfbXZbYmxrX3ldW2Jsa194XVswXSAtIGxpc3QxX212W2Jsa195Ml1bYmxrX3gyXVswXSkgPj0gNCkKICAgICAgICAgICAgICAgICAgICB8IChpYWJzKCBsaXN0MF9tdltibGtfeV1bYmxrX3hdWzFdIC0gbGlzdDFfbXZbYmxrX3kyXVtibGtfeDJdWzFdKSA+PSBtdmxpbWl0KQogICAgICAgICAgICAgICAgICAgIHwgKGlhYnMoIGxpc3QxX212W2Jsa195XVtibGtfeF1bMF0gLSBsaXN0MF9tdltibGtfeTJdW2Jsa194Ml1bMF0pID49IDQpCiAgICAgICAgICAgICAgICAgICAgfCAoaWFicyggbGlzdDFfbXZbYmxrX3ldW2Jsa194XVsxXSAtIGxpc3QwX212W2Jsa195Ml1bYmxrX3gyXVsxXSkgPj0gbXZsaW1pdCkpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgU3RyZW5ndGhbaWR4XSA9IDE7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgfQp9CgovKiEKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIFxicmllZgogKiAgICBGaWx0ZXJzIG9uZSBlZGdlIG9mIDE2IChsdW1hKSBvciA4IChjaHJvbWEpIHBlbAogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICovCnZvaWQgRWRnZUxvb3AoaW1ncGVsKiogSW1nLCBieXRlIFN0cmVuZ3RoWzE2XSxJbWFnZVBhcmFtZXRlcnMgKmltZywgaW50IE1iUUFkZHIsIGludCBBbHBoYUMwT2Zmc2V0LCBpbnQgQmV0YU9mZnNldCwKICAgICAgICAgICAgICBpbnQgZGlyLCBpbnQgZWRnZSwgaW50IHdpZHRoLCBpbnQgeXV2LCBpbnQgdXYpCnsKICBpbnQgICAgICBwZWwsIGFwID0gMCwgYXEgPSAwLCBTdHJuZyA7CiAgaW50ICAgICAgaW5jUCwgaW5jUTsKICBpbnQgICAgICBDMCwgYzAsIERlbHRhLCBkaWYsIEFic0RlbHRhIDsKICBpbnQgICAgICBMMiA9IDAsIEwxLCBMMCwgUjAsIFIxLCBSMiA9IDAsIFJMMCwgTDMsIFIzIDsKICBpbnQgICAgICBBbHBoYSA9IDAsIEJldGEgPSAwIDsKICBjb25zdCBieXRlKiBDbGlwVGFiID0gTlVMTDsKICBpbnQgICAgICBzbWFsbF9nYXA7CiAgaW50ICAgICAgaW5kZXhBLCBpbmRleEI7CiAgaW50ICAgICAgUGVsTnVtOwogIGludCAgICAgIFN0cmVuZ3RoSWR4OwogIGltZ3BlbCAgICpTcmNQdHJQLCAqU3JjUHRyUTsKICBpbnQgICAgICBRUDsKICBpbnQgICAgICB4UCwgeFEsIHlQLCB5UTsKICBNYWNyb2Jsb2NrICpNYlEsICpNYlA7CiAgUGl4ZWxQb3MgcGl4UCwgcGl4UTsKICBpbnQgICAgICBiaXRkZXB0aF9zY2FsZTsKICBzdGF0aWMgaW50ICAgICAgcGVsbnVtX2NyWzJdWzRdID0gIHt7MCw4LDE2LDE2fSwgezAsOCwgOCwxNn19OyAgLy9bZGlyOjA9dmVydCwgMT1ob3IuXVt5dXZfZm9ybWF0XQoKICBpZiAoIXl1dikKICAgIGJpdGRlcHRoX3NjYWxlID0gMTw8KGltZy0+Yml0ZGVwdGhfbHVtYSAtIDgpOwogIGVsc2UKICAgIGJpdGRlcHRoX3NjYWxlID0gMTw8KGltZy0+Yml0ZGVwdGhfY2hyb21hIC0gOCk7CgogIFBlbE51bSA9IHl1diA/IHBlbG51bV9jcltkaXJdW2ltZy0+eXV2X2Zvcm1hdF0gOiAxNiA7CgogIGZvciggcGVsPTAgOyBwZWw8UGVsTnVtIDsgcGVsKysgKQogIHsKICAgIHhRID0gZGlyID8gcGVsIDogZWRnZSA8PCAyOwogICAgeVEgPSBkaXIgPyAoZWRnZSA8IDQgPyBlZGdlIDw8IDIgOiAxKSA6IHBlbDsKICAgIGdldE5laWdoYm91cihNYlFBZGRyLCB4USwgeVEsIHl1diwgJnBpeFEpOwogICAgZ2V0TmVpZ2hib3VyKE1iUUFkZHIsIHhRIC0gKDEgLSBkaXIpLCB5USAtIGRpciwgeXV2LCAmcGl4UCk7CiAgICB4UCA9IHBpeFAueDsKICAgIHlQID0gcGl4UC55OwogICAgTWJRID0gJihpbWctPm1iX2RhdGFbTWJRQWRkcl0pOwogICAgTWJQID0gJihpbWctPm1iX2RhdGFbcGl4UC5tYl9hZGRyXSk7CiAgICBmaWVsZE1vZGVGaWx0ZXJpbmdGbGFnID0gTWJRLT5tYl9maWVsZCB8fCBNYlAtPm1iX2ZpZWxkOwogICAgU3RyZW5ndGhJZHggPSAoeXV2JiYoUGVsTnVtPT04KSkgPyAoKE1iUS0+bWJfZmllbGQgJiYgIU1iUC0+bWJfZmllbGQpID8gcGVsPDwxIDooKHBlbD4+MSk8PDIpKyhwZWwmMHgwMSkpIDogcGVsOwoKICAgIGlmIChwaXhQLmF2YWlsYWJsZSB8fCAoTWJRLT5MRkRpc2FibGVJZGM9PSAwKSkKICAgIHsKICAgICAgaW5jUSA9IGRpciA/ICgoZmllbGRNb2RlRmlsdGVyaW5nRmxhZyAmJiAhTWJRLT5tYl9maWVsZCkgPyAyICogd2lkdGggOiB3aWR0aCkgOiAxOwogICAgICBpbmNQID0gZGlyID8gKChmaWVsZE1vZGVGaWx0ZXJpbmdGbGFnICYmICFNYlAtPm1iX2ZpZWxkKSA/IDIgKiB3aWR0aCA6IHdpZHRoKSA6IDE7CiAgICAgIFNyY1B0clEgPSAmKEltZ1twaXhRLnBvc195XVtwaXhRLnBvc194XSk7CiAgICAgIFNyY1B0clAgPSAmKEltZ1twaXhQLnBvc195XVtwaXhQLnBvc194XSk7CgogICAgICAvLyBBdmVyYWdlIFFQIG9mIHRoZSB0d28gYmxvY2tzCiAgICAgIFFQID0geXV2ID8gKE1iUC0+cXBjW3V2XSArIE1iUS0+cXBjW3V2XSArIDEpID4+IDEgOiAoTWJQLT5xcCArIE1iUS0+cXAgKyAxKSA+PiAxOwoKICAgICAgaW5kZXhBID0gaUNsaXAzKDAsIE1BWF9RUCwgUVAgKyBBbHBoYUMwT2Zmc2V0KTsKICAgICAgaW5kZXhCID0gaUNsaXAzKDAsIE1BWF9RUCwgUVAgKyBCZXRhT2Zmc2V0KTsKCiAgICAgIEFscGhhICA9QUxQSEFfVEFCTEVbaW5kZXhBXSAqIGJpdGRlcHRoX3NjYWxlOwogICAgICBCZXRhICAgPUJFVEFfVEFCTEVbaW5kZXhCXSAgKiBiaXRkZXB0aF9zY2FsZTsKICAgICAgQ2xpcFRhYj1DTElQX1RBQltpbmRleEFdOwoKICAgICAgTDAgID0gU3JjUHRyUFswXSA7CiAgICAgIFIwICA9IFNyY1B0clFbMF0gOwogICAgICBMMSAgPSBTcmNQdHJQWy1pbmNQXSA7CiAgICAgIFIxICA9IFNyY1B0clFbIGluY1FdIDsKICAgICAgTDIgID0gU3JjUHRyUFstaW5jUCoyXSA7CiAgICAgIFIyICA9IFNyY1B0clFbIGluY1EqMl0gOwogICAgICBMMyAgPSBTcmNQdHJQWy1pbmNQKjNdIDsKICAgICAgUjMgID0gU3JjUHRyUVsgaW5jUSozXSA7CgogICAgICBpZiggKFN0cm5nID0gU3RyZW5ndGhbU3RyZW5ndGhJZHhdKSApCiAgICAgIHsKICAgICAgICBBYnNEZWx0YSAgPSBpYWJzKCBEZWx0YSA9IFIwIC0gTDAgKSAgOwoKICAgICAgICBpZiggQWJzRGVsdGEgPCBBbHBoYSApCiAgICAgICAgewogICAgICAgICAgQzAgID0gQ2xpcFRhYlsgU3RybmcgXSAqIGJpdGRlcHRoX3NjYWxlOwogICAgICAgICAgaWYoICgoaWFicyggUjAgLSBSMSkgLSBCZXRhICkgICYgKGlhYnMoTDAgLSBMMSkgLSBCZXRhICkpIDwgMCAgKQogICAgICAgICAgewogICAgICAgICAgICBpZiggIXl1dikKICAgICAgICAgICAgewogICAgICAgICAgICAgIGFxICA9IChpYWJzKCBSMCAtIFIyKSAtIEJldGEgKSA8IDAgIDsKICAgICAgICAgICAgICBhcCAgPSAoaWFicyggTDAgLSBMMikgLSBCZXRhICkgPCAwICA7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIFJMMCAgICAgICAgICAgICA9IEwwICsgUjAgOwoKICAgICAgICAgICAgaWYoU3RybmcgPT0gNCApICAgIC8vIElOVFJBIHN0cm9uZyBmaWx0ZXJpbmcKICAgICAgICAgICAgewogICAgICAgICAgICAgIGlmKCB5dXYpICAvLyBDaHJvbWEKICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBTcmNQdHJRWzBdID0gKGltZ3BlbCkoKChSMSA8PCAxKSArIFIwICsgTDEgKyAyKSA+PiAyKTsKICAgICAgICAgICAgICAgIFNyY1B0clBbMF0gPSAoaW1ncGVsKSgoKEwxIDw8IDEpICsgTDAgKyBSMSArIDIpID4+IDIpOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICBlbHNlICAvLyBMdW1hCiAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgc21hbGxfZ2FwID0gKEFic0RlbHRhIDwgKChBbHBoYSA+PiAyKSArIDIpKTsKCiAgICAgICAgICAgICAgICBhcSAmPSBzbWFsbF9nYXA7CiAgICAgICAgICAgICAgICBhcCAmPSBzbWFsbF9nYXA7CgogICAgICAgICAgICAgICAgU3JjUHRyUVswXSAgID0gKGltZ3BlbCkgKGFxID8gKCBMMSArICgoUjEgKyBSTDApIDw8IDEpICsgIFIyICsgNCkgPj4gMyA6ICgoUjEgPDwgMSkgKyBSMCArIEwxICsgMikgPj4gMik7CiAgICAgICAgICAgICAgICBTcmNQdHJQWzBdICAgPSAoaW1ncGVsKSAoYXAgPyAoIFIxICsgKChMMSArIFJMMCkgPDwgMSkgKyAgTDIgKyA0KSA+PiAzIDogKChMMSA8PCAxKSArIEwwICsgUjEgKyAyKSA+PiAyKTsKCiAgICAgICAgICAgICAgICBTcmNQdHJRWyBpbmNRXSA9ICAgKGltZ3BlbCkgKGFxICA/ICggUjIgKyBSMCArIFIxICsgTDAgKyAyKSA+PiAyIDogUjEpOwogICAgICAgICAgICAgICAgU3JjUHRyUFstaW5jUF0gPSAgIChpbWdwZWwpIChhcCAgPyAoIEwyICsgTDEgKyBMMCArIFIwICsgMikgPj4gMiA6IEwxKTsKCiAgICAgICAgICAgICAgICBTcmNQdHJRWyBpbmNRKjJdID0gKGltZ3BlbCkgKGFxID8gKCgoUjMgKyBSMikgPDwxKSArIFIyICsgUjEgKyBSTDAgKyA0KSA+PiAzIDogUjIpOwogICAgICAgICAgICAgICAgU3JjUHRyUFstaW5jUCoyXSA9IChpbWdwZWwpIChhcCA/ICgoKEwzICsgTDIpIDw8MSkgKyBMMiArIEwxICsgUkwwICsgNCkgPj4gMyA6IEwyKTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbm9ybWFsIGZpbHRlcmluZwogICAgICAgICAgICB7CiAgICAgICAgICAgICAgYzAgID0geXV2PyAoQzArMSk6KEMwICsgYXAgKyBhcSkgOwogICAgICAgICAgICAgIGRpZiA9IGlDbGlwMyggLWMwLCBjMCwgKCAoRGVsdGEgPDwgMikgKyAoTDEgLSBSMSkgKyA0KSA+PiAzICkgOwogICAgICAgICAgICAgIGlmKCF5dXYpCiAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgU3JjUHRyUFswXSAgPSBpQ2xpcDMoMCwgaW1nLT5tYXhfaW1ncGVsX3ZhbHVlLCBMMCArIGRpZikgOwogICAgICAgICAgICAgICAgU3JjUHRyUVswXSAgPSBpQ2xpcDMoMCwgaW1nLT5tYXhfaW1ncGVsX3ZhbHVlLCBSMCAtIGRpZikgOwogICAgICAgICAgICAgICAgaWYoIGFwICkKICAgICAgICAgICAgICAgICAgU3JjUHRyUFstaW5jUF0gKz0gaUNsaXAzKCAtQzAsICBDMCwgKCBMMiArICgoUkwwICsgMSkgPj4gMSkgLSAoTDE8PDEpKSA+PiAxICkgOwogICAgICAgICAgICAgICAgaWYoIGFxICApCiAgICAgICAgICAgICAgICAgIFNyY1B0clFbIGluY1FdICs9IGlDbGlwMyggLUMwLCAgQzAsICggUjIgKyAoKFJMMCArIDEpID4+IDEpIC0gKFIxPDwxKSkgPj4gMSApIDsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIFNyY1B0clBbMF0gID0gaUNsaXAzKDAsIGltZy0+bWF4X2ltZ3BlbF92YWx1ZV91diwgTDAgKyBkaWYpIDsKICAgICAgICAgICAgICAgIFNyY1B0clFbMF0gID0gaUNsaXAzKDAsIGltZy0+bWF4X2ltZ3BlbF92YWx1ZV91diwgUjAgLSBkaWYpIDsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0gOwogICAgICAgICAgfSA7CiAgICAgICAgfSA7CiAgICAgIH0gOwogICAgfSA7CiAgfQp9Cgo=