LyoKICogTUlETCBwcm94eS9zdHViIHN0dWZmCiAqCiAqIENvcHlyaWdodCAyMDAyIE92ZSBL5XZlbiwgVHJhbnNHYW1pbmcgVGVjaG5vbG9naWVzCiAqCiAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwogKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiAqCiAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAogKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgogKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQogKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgogKgogKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCiAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQogKgogKiBUT0RPOgogKiAgLSBmaWd1cmUgb3V0IHdoZXRoZXIgd2UgKnJlYWxseSogZ290IHRoaXMgcmlnaHQKICogIC0gY2hlY2sgZm9yIGVycm9ycyBhbmQgdGhyb3cgZXhjZXB0aW9ucwogKi8KCiNpbmNsdWRlIDxzdGRhcmcuaD4KI2luY2x1ZGUgPHN0ZGlvLmg+CiNpbmNsdWRlIDxzdHJpbmcuaD4KI2luY2x1ZGUgPGFzc2VydC5oPgoKI2RlZmluZSBDT0JKTUFDUk9TCgojaW5jbHVkZSAid2luZGVmLmgiCiNpbmNsdWRlICJ3aW5iYXNlLmgiCiNpbmNsdWRlICJ3aW5lcnJvci5oIgojaW5jbHVkZSAid2lucmVnLmgiCgojaW5jbHVkZSAib2JqYmFzZS5oIgoKI2luY2x1ZGUgInJwY3Byb3h5LmgiCgojaW5jbHVkZSAid2luZS9kZWJ1Zy5oIgoKI2luY2x1ZGUgImNwc2YuaCIKI2luY2x1ZGUgIm5kcl9taXNjLmgiCiNpbmNsdWRlICJycGNuZHIuaCIKCldJTkVfREVGQVVMVF9ERUJVR19DSEFOTkVMKHJwYyk7CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogICAgICAgICAgIE5kclByb3h5SW5pdGlhbGl6ZSBbUlBDUlQ0LkBdCiAqLwp2b2lkIFdJTkFQSSBOZHJQcm94eUluaXRpYWxpemUodm9pZCAqVGhpcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUFJQQ19NRVNTQUdFIHBScGNNc2csCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBNSURMX1NUVUJfTUVTU0FHRSBwU3R1Yk1zZywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUE1JRExfU1RVQl9ERVNDIHBTdHViRGVzY3JpcHRvciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IFByb2NOdW0pCnsKICBIUkVTVUxUIGhyOwoKICBUUkFDRSgiKCVwLCVwLCVwLCVwLCVkKVxuIiwgVGhpcywgcFJwY01zZywgcFN0dWJNc2csIHBTdHViRGVzY3JpcHRvciwgUHJvY051bSk7CiAgTmRyQ2xpZW50SW5pdGlhbGl6ZU5ldyhwUnBjTXNnLCBwU3R1Yk1zZywgcFN0dWJEZXNjcmlwdG9yLCBQcm9jTnVtKTsKICBpZiAoVGhpcykgU3RkUHJveHlfR2V0Q2hhbm5lbChUaGlzLCAmcFN0dWJNc2ctPnBScGNDaGFubmVsQnVmZmVyKTsKICBpZiAocFN0dWJNc2ctPnBScGNDaGFubmVsQnVmZmVyKSB7CiAgICBociA9IElScGNDaGFubmVsQnVmZmVyX0dldERlc3RDdHgocFN0dWJNc2ctPnBScGNDaGFubmVsQnVmZmVyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBTdHViTXNnLT5kd0Rlc3RDb250ZXh0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBTdHViTXNnLT5wdkRlc3RDb250ZXh0KTsKICB9CiAgVFJBQ0UoImNoYW5uZWw9JXBcbiIsIHBTdHViTXNnLT5wUnBjQ2hhbm5lbEJ1ZmZlcik7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAgICAgICAgICAgTmRyUHJveHlHZXRCdWZmZXIgW1JQQ1JUNC5AXQogKi8Kdm9pZCBXSU5BUEkgTmRyUHJveHlHZXRCdWZmZXIodm9pZCAqVGhpcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQTUlETF9TVFVCX01FU1NBR0UgcFN0dWJNc2cpCnsKICBIUkVTVUxUIGhyOwogIGNvbnN0IElJRCAqcmlpZCA9IE5VTEw7CgogIFRSQUNFKCIoJXAsJXApXG4iLCBUaGlzLCBwU3R1Yk1zZyk7CiAgcFN0dWJNc2ctPlJwY01zZy0+QnVmZmVyTGVuZ3RoID0gcFN0dWJNc2ctPkJ1ZmZlckxlbmd0aDsKICBwU3R1Yk1zZy0+ZHdTdHViUGhhc2UgPSBQUk9YWV9HRVRCVUZGRVI7CiAgaHIgPSBTdGRQcm94eV9HZXRJSUQoVGhpcywgJnJpaWQpOwogIGhyID0gSVJwY0NoYW5uZWxCdWZmZXJfR2V0QnVmZmVyKHBTdHViTXNnLT5wUnBjQ2hhbm5lbEJ1ZmZlciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChSUENPTEVNRVNTQUdFKilwU3R1Yk1zZy0+UnBjTXNnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmlpZCk7CiAgcFN0dWJNc2ctPkJ1ZmZlclN0YXJ0ID0gcFN0dWJNc2ctPlJwY01zZy0+QnVmZmVyOwogIHBTdHViTXNnLT5CdWZmZXJFbmQgPSBwU3R1Yk1zZy0+QnVmZmVyU3RhcnQgKyBwU3R1Yk1zZy0+QnVmZmVyTGVuZ3RoOwogIHBTdHViTXNnLT5CdWZmZXIgPSBwU3R1Yk1zZy0+QnVmZmVyU3RhcnQ7CiAgcFN0dWJNc2ctPmR3U3R1YlBoYXNlID0gUFJPWFlfTUFSU0hBTDsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqICAgICAgICAgICBOZHJQcm94eVNlbmRSZWNlaXZlIFtSUENSVDQuQF0KICovCnZvaWQgV0lOQVBJIE5kclByb3h5U2VuZFJlY2VpdmUodm9pZCAqVGhpcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBNSURMX1NUVUJfTUVTU0FHRSBwU3R1Yk1zZykKewogIFVMT05HIFN0YXR1cyA9IDA7CiAgSFJFU1VMVCBocjsKCiAgVFJBQ0UoIiglcCwlcClcbiIsIFRoaXMsIHBTdHViTXNnKTsKCiAgaWYgKCFwU3R1Yk1zZy0+cFJwY0NoYW5uZWxCdWZmZXIpCiAgewogICAgV0FSTigiVHJ5aW5nIHRvIHVzZSBkaXNjb25uZWN0ZWQgcHJveHkgJXBcbiIsIFRoaXMpOwogICAgUnBjUmFpc2VFeGNlcHRpb24oUlBDX0VfRElTQ09OTkVDVEVEKTsKICB9CgogIHBTdHViTXNnLT5kd1N0dWJQaGFzZSA9IFBST1hZX1NFTkRSRUNFSVZFOwogIGhyID0gSVJwY0NoYW5uZWxCdWZmZXJfU2VuZFJlY2VpdmUocFN0dWJNc2ctPnBScGNDaGFubmVsQnVmZmVyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoUlBDT0xFTUVTU0FHRSopcFN0dWJNc2ctPlJwY01zZywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJlN0YXR1cyk7CiAgcFN0dWJNc2ctPmR3U3R1YlBoYXNlID0gUFJPWFlfVU5NQVJTSEFMOwogIHBTdHViTXNnLT5CdWZmZXJMZW5ndGggPSBwU3R1Yk1zZy0+UnBjTXNnLT5CdWZmZXJMZW5ndGg7CiAgcFN0dWJNc2ctPkJ1ZmZlclN0YXJ0ID0gcFN0dWJNc2ctPlJwY01zZy0+QnVmZmVyOwogIHBTdHViTXNnLT5CdWZmZXJFbmQgPSBwU3R1Yk1zZy0+QnVmZmVyU3RhcnQgKyBwU3R1Yk1zZy0+QnVmZmVyTGVuZ3RoOwogIHBTdHViTXNnLT5CdWZmZXIgPSBwU3R1Yk1zZy0+QnVmZmVyU3RhcnQ7CgogIC8qIHJhaXNlIGV4Y2VwdGlvbiBpZiBjYWxsIGZhaWxlZCAqLwogIGlmIChociA9PSBSUENfU19DQUxMX0ZBSUxFRCkgUnBjUmFpc2VFeGNlcHRpb24oKihEV09SRCopcFN0dWJNc2ctPkJ1ZmZlcik7CiAgZWxzZSBpZiAoRkFJTEVEKGhyKSkgUnBjUmFpc2VFeGNlcHRpb24oaHIpOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogICAgICAgICAgIE5kclByb3h5RnJlZUJ1ZmZlciBbUlBDUlQ0LkBdCiAqLwp2b2lkIFdJTkFQSSBOZHJQcm94eUZyZWVCdWZmZXIodm9pZCAqVGhpcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUE1JRExfU1RVQl9NRVNTQUdFIHBTdHViTXNnKQp7CiAgSFJFU1VMVCBocjsKCiAgVFJBQ0UoIiglcCwlcClcbiIsIFRoaXMsIHBTdHViTXNnKTsKICBociA9IElScGNDaGFubmVsQnVmZmVyX0ZyZWVCdWZmZXIocFN0dWJNc2ctPnBScGNDaGFubmVsQnVmZmVyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChSUENPTEVNRVNTQUdFKilwU3R1Yk1zZy0+UnBjTXNnKTsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqICAgICAgICAgICBOZHJQcm94eUVycm9ySGFuZGxlciBbUlBDUlQ0LkBdCiAqLwpIUkVTVUxUIFdJTkFQSSBOZHJQcm94eUVycm9ySGFuZGxlcihEV09SRCBkd0V4Y2VwdGlvbkNvZGUpCnsKICBXQVJOKCIoMHglMDhseCk6IGEgcHJveHkgY2FsbCBmYWlsZWRcbiIsIGR3RXhjZXB0aW9uQ29kZSk7CgogIGlmIChGQUlMRUQoZHdFeGNlcHRpb25Db2RlKSkKICAgIHJldHVybiBkd0V4Y2VwdGlvbkNvZGU7CiAgZWxzZQogICAgcmV0dXJuIEhSRVNVTFRfRlJPTV9XSU4zMihkd0V4Y2VwdGlvbkNvZGUpOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogICAgICAgICAgIE5kclN0dWJJbml0aWFsaXplIFtSUENSVDQuQF0KICovCnZvaWQgV0lOQVBJIE5kclN0dWJJbml0aWFsaXplKFBSUENfTUVTU0FHRSBwUnBjTXNnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBNSURMX1NUVUJfTUVTU0FHRSBwU3R1Yk1zZywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQTUlETF9TVFVCX0RFU0MgcFN0dWJEZXNjcmlwdG9yLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIExQUlBDQ0hBTk5FTEJVRkZFUiBwUnBjQ2hhbm5lbEJ1ZmZlcikKewogIFRSQUNFKCIoJXAsJXAsJXAsJXApXG4iLCBwUnBjTXNnLCBwU3R1Yk1zZywgcFN0dWJEZXNjcmlwdG9yLCBwUnBjQ2hhbm5lbEJ1ZmZlcik7CiAgTmRyU2VydmVySW5pdGlhbGl6ZU5ldyhwUnBjTXNnLCBwU3R1Yk1zZywgcFN0dWJEZXNjcmlwdG9yKTsKICBwU3R1Yk1zZy0+cFJwY0NoYW5uZWxCdWZmZXIgPSBwUnBjQ2hhbm5lbEJ1ZmZlcjsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqICAgICAgICAgICBOZHJTdHViR2V0QnVmZmVyIFtSUENSVDQuQF0KICovCnZvaWQgV0lOQVBJIE5kclN0dWJHZXRCdWZmZXIoTFBSUENTVFVCQlVGRkVSIFRoaXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBMUFJQQ0NIQU5ORUxCVUZGRVIgcFJwY0NoYW5uZWxCdWZmZXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBQTUlETF9TVFVCX01FU1NBR0UgcFN0dWJNc2cpCnsKICBUUkFDRSgiKCVwLCVwKVxuIiwgVGhpcywgcFN0dWJNc2cpOwogIHBTdHViTXNnLT5wUnBjQ2hhbm5lbEJ1ZmZlciA9IHBScGNDaGFubmVsQnVmZmVyOwogIHBTdHViTXNnLT5ScGNNc2ctPkJ1ZmZlckxlbmd0aCA9IHBTdHViTXNnLT5CdWZmZXJMZW5ndGg7CiAgSV9ScGNHZXRCdWZmZXIocFN0dWJNc2ctPlJwY01zZyk7IC8qID8gKi8KICBwU3R1Yk1zZy0+QnVmZmVyU3RhcnQgPSBwU3R1Yk1zZy0+UnBjTXNnLT5CdWZmZXI7CiAgcFN0dWJNc2ctPkJ1ZmZlckVuZCA9IHBTdHViTXNnLT5CdWZmZXJTdGFydCArIHBTdHViTXNnLT5CdWZmZXJMZW5ndGg7CiAgcFN0dWJNc2ctPkJ1ZmZlciA9IHBTdHViTXNnLT5CdWZmZXJTdGFydDsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAgICAgICAgICAgICBOZHJDbGllbnRJbml0aWFsaXplTmV3IFtSUENSVDQuQF0KICovCnZvaWQgV0lOQVBJIE5kckNsaWVudEluaXRpYWxpemVOZXcoIFBSUENfTUVTU0FHRSBwUnBjTWVzc2FnZSwgUE1JRExfU1RVQl9NRVNTQUdFIHBTdHViTXNnLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUE1JRExfU1RVQl9ERVNDIHBTdHViRGVzYywgdW5zaWduZWQgaW50IFByb2NOdW0gKQp7CiAgVFJBQ0UoIihwUnBjTWVzc2FnZSA9PSBeJXAsIHBTdHViTXNnID09IF4lcCwgcFN0dWJEZXNjID09IF4lcCwgUHJvY051bSA9PSAlZClcbiIsCiAgICBwUnBjTWVzc2FnZSwgcFN0dWJNc2csIHBTdHViRGVzYywgUHJvY051bSk7CgogIGFzc2VydCggcFJwY01lc3NhZ2UgJiYgcFN0dWJNc2cgJiYgcFN0dWJEZXNjICk7CgogIG1lbXNldChwUnBjTWVzc2FnZSwgMCwgc2l6ZW9mKFJQQ19NRVNTQUdFKSk7CiAgcFJwY01lc3NhZ2UtPkRhdGFSZXByZXNlbnRhdGlvbiA9IE5EUl9MT0NBTF9EQVRBX1JFUFJFU0VOVEFUSU9OOwoKICAvKiBub3QgZXZlcnlvbmUgYWxsb2NhdGVzIHN0YWNrIHNwYWNlIGZvciB3MmtSZXNlcnZlZCAqLwogIG1lbXNldChwU3R1Yk1zZywgMCwgRklFTERfT0ZGU0VUKE1JRExfU1RVQl9NRVNTQUdFLHBDU0luZm8pKTsKCiAgcFN0dWJNc2ctPlJldXNlQnVmZmVyID0gRkFMU0U7CiAgcFN0dWJNc2ctPklzQ2xpZW50ID0gVFJVRTsKICBwU3R1Yk1zZy0+U3R1YkRlc2MgPSBwU3R1YkRlc2M7CiAgcFN0dWJNc2ctPnBmbkFsbG9jYXRlID0gcFN0dWJEZXNjLT5wZm5BbGxvY2F0ZTsKICBwU3R1Yk1zZy0+cGZuRnJlZSA9IHBTdHViRGVzYy0+cGZuRnJlZTsKICBwU3R1Yk1zZy0+UnBjTXNnID0gcFJwY01lc3NhZ2U7CgogIHBScGNNZXNzYWdlLT5Qcm9jTnVtID0gUHJvY051bTsKICBwUnBjTWVzc2FnZS0+UnBjSW50ZXJmYWNlSW5mb3JtYXRpb24gPSBwU3R1YkRlc2MtPlJwY0ludGVyZmFjZUluZm9ybWF0aW9uOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogICAgICAgICAgICAgTmRyU2VydmVySW5pdGlhbGl6ZU5ldyBbUlBDUlQ0LkBdCiAqLwp1bnNpZ25lZCBjaGFyKiBXSU5BUEkgTmRyU2VydmVySW5pdGlhbGl6ZU5ldyggUFJQQ19NRVNTQUdFIHBScGNNc2csIFBNSURMX1NUVUJfTUVTU0FHRSBwU3R1Yk1zZywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBNSURMX1NUVUJfREVTQyBwU3R1YkRlc2MgKQp7CiAgVFJBQ0UoIihwUnBjTXNnID09IF4lcCwgcFN0dWJNc2cgPT0gXiVwLCBwU3R1YkRlc2MgPT0gXiVwKVxuIiwgcFJwY01zZywgcFN0dWJNc2csIHBTdHViRGVzYyk7CgogIGFzc2VydCggcFJwY01zZyAmJiBwU3R1Yk1zZyAmJiBwU3R1YkRlc2MgKTsKCiAgLyogbm90IGV2ZXJ5b25lIGFsbG9jYXRlcyBzdGFjayBzcGFjZSBmb3IgdzJrUmVzZXJ2ZWQgKi8KICBtZW1zZXQocFN0dWJNc2csIDAsIEZJRUxEX09GRlNFVChNSURMX1NUVUJfTUVTU0FHRSxwQ1NJbmZvKSk7CgogIHBTdHViTXNnLT5SZXVzZUJ1ZmZlciA9IFRSVUU7CiAgcFN0dWJNc2ctPklzQ2xpZW50ID0gRkFMU0U7CiAgcFN0dWJNc2ctPlN0dWJEZXNjID0gcFN0dWJEZXNjOwogIHBTdHViTXNnLT5wZm5BbGxvY2F0ZSA9IHBTdHViRGVzYy0+cGZuQWxsb2NhdGU7CiAgcFN0dWJNc2ctPnBmbkZyZWUgPSBwU3R1YkRlc2MtPnBmbkZyZWU7CiAgcFN0dWJNc2ctPlJwY01zZyA9IHBScGNNc2c7CiAgcFN0dWJNc2ctPkJ1ZmZlciA9IHBTdHViTXNnLT5CdWZmZXJTdGFydCA9IHBScGNNc2ctPkJ1ZmZlcjsKICBwU3R1Yk1zZy0+QnVmZmVyTGVuZ3RoID0gcFJwY01zZy0+QnVmZmVyTGVuZ3RoOwogIHBTdHViTXNnLT5CdWZmZXJFbmQgPSBwU3R1Yk1zZy0+QnVmZmVyICsgcFN0dWJNc2ctPkJ1ZmZlckxlbmd0aDsKCiAgLyogRklYTUU6IGRldGVybWluZSB0aGUgcHJvcGVyIHJldHVybiB2YWx1ZSAqLwogIHJldHVybiBOVUxMOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogICAgICAgICAgIE5kckdldEJ1ZmZlciBbUlBDUlQ0LkBdCiAqLwp1bnNpZ25lZCBjaGFyICpXSU5BUEkgTmRyR2V0QnVmZmVyKE1JRExfU1RVQl9NRVNTQUdFICpzdHVibXNnLCB1bnNpZ25lZCBsb25nIGJ1ZmxlbiwgUlBDX0JJTkRJTkdfSEFORExFIGhhbmRsZSkKewogIFRSQUNFKCIoc3R1Ym1zZyA9PSBeJXAsIGJ1ZmxlbiA9PSAlbHUsIGhhbmRsZSA9PSAlcCk6IHdpbGQgZ3Vlc3MuXG4iLCBzdHVibXNnLCBidWZsZW4sIGhhbmRsZSk7CiAgCiAgYXNzZXJ0KCBzdHVibXNnICYmIHN0dWJtc2ctPlJwY01zZyApOwoKICAvKiBJIGd1ZXNzIHRoaXMgaXMgb3VyIGNoYW5jZSB0byBwdXQgdGhlIGJpbmRpbmcgaGFuZGxlIGludG8gdGhlIFJQQ19NRVNTQUdFICovCiAgc3R1Ym1zZy0+UnBjTXNnLT5IYW5kbGUgPSBoYW5kbGU7CiAgCiAgc3R1Ym1zZy0+UnBjTXNnLT5CdWZmZXJMZW5ndGggPSBidWZsZW47CiAgaWYgKElfUnBjR2V0QnVmZmVyKHN0dWJtc2ctPlJwY01zZykgIT0gU19PSykKICAgIHJldHVybiBOVUxMOwoKICBzdHVibXNnLT5CdWZmZXIgPSBzdHVibXNnLT5CdWZmZXJTdGFydCA9IHN0dWJtc2ctPlJwY01zZy0+QnVmZmVyOwogIHN0dWJtc2ctPkJ1ZmZlckxlbmd0aCA9IHN0dWJtc2ctPlJwY01zZy0+QnVmZmVyTGVuZ3RoOwogIHN0dWJtc2ctPkJ1ZmZlckVuZCA9IHN0dWJtc2ctPkJ1ZmZlciArIHN0dWJtc2ctPkJ1ZmZlckxlbmd0aDsKICByZXR1cm4gKHN0dWJtc2ctPkJ1ZmZlciA9ICh1bnNpZ25lZCBjaGFyICopc3R1Ym1zZy0+UnBjTXNnLT5CdWZmZXIpOwp9Ci8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAgICAgICAgICAgTmRyRnJlZUJ1ZmZlciBbUlBDUlQ0LkBdCiAqLwp2b2lkIFdJTkFQSSBOZHJGcmVlQnVmZmVyKE1JRExfU1RVQl9NRVNTQUdFICpwU3R1Yk1zZykKewogIFRSQUNFKCIocFN0dWJNc2cgPT0gXiVwKTogd2lsZCBndWVzcy5cbiIsIHBTdHViTXNnKTsKICBJX1JwY0ZyZWVCdWZmZXIocFN0dWJNc2ctPlJwY01zZyk7CiAgcFN0dWJNc2ctPkJ1ZmZlckxlbmd0aCA9IDA7CiAgcFN0dWJNc2ctPkJ1ZmZlciA9IHBTdHViTXNnLT5CdWZmZXJFbmQgPSAodW5zaWduZWQgY2hhciAqKShwU3R1Yk1zZy0+UnBjTXNnLT5CdWZmZXIgPSBOVUxMKTsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAgICAgICAgICAgTmRyU2VuZFJlY2VpdmUgW1JQQ1JUNC5AXQogKi8KdW5zaWduZWQgY2hhciAqV0lOQVBJIE5kclNlbmRSZWNlaXZlKCBNSURMX1NUVUJfTUVTU0FHRSAqc3R1Ym1zZywgdW5zaWduZWQgY2hhciAqYnVmZmVyICApCnsKICBUUkFDRSgiKHN0dWJtc2cgPT0gXiVwLCBidWZmZXIgPT0gXiVwKVxuIiwgc3R1Ym1zZywgYnVmZmVyKTsKCiAgLyogRklYTUU6IGhvdyB0byBoYW5kbGUgZXJyb3JzPyAocmFpc2UgZXhjZXB0aW9uPykgKi8KICBpZiAoIXN0dWJtc2cpIHsKICAgIEVSUigiTlVMTCBzdHViIG1lc3NhZ2UuICBObyBhY3Rpb24gdGFrZW4uXG4iKTsKICAgIHJldHVybiBOVUxMOwogIH0KICBpZiAoIXN0dWJtc2ctPlJwY01zZykgewogICAgRVJSKCJSUEMgTWVzc2FnZSBub3QgcHJlc2VudCBpbiBzdHViIG1lc3NhZ2UuICBObyBhY3Rpb24gdGFrZW4uXG4iKTsKICAgIHJldHVybiBOVUxMOwogIH0KCiAgaWYgKElfUnBjU2VuZFJlY2VpdmUoc3R1Ym1zZy0+UnBjTXNnKSAhPSBSUENfU19PSykgewogICAgV0FSTigiSV9ScGNTZW5kUmVjZWl2ZSBkaWQgbm90IHJldHVybiBzdWNjZXNzLlxuIik7CiAgICAvKiBGSVhNRTogcmFpc2UgZXhjZXB0aW9uPyAqLwogIH0KCiAgc3R1Ym1zZy0+QnVmZmVyTGVuZ3RoID0gc3R1Ym1zZy0+UnBjTXNnLT5CdWZmZXJMZW5ndGg7CiAgc3R1Ym1zZy0+QnVmZmVyU3RhcnQgPSBzdHVibXNnLT5ScGNNc2ctPkJ1ZmZlcjsKICBzdHVibXNnLT5CdWZmZXJFbmQgPSBzdHVibXNnLT5CdWZmZXJTdGFydCArIHN0dWJtc2ctPkJ1ZmZlckxlbmd0aDsKICBzdHVibXNnLT5CdWZmZXIgPSBzdHVibXNnLT5CdWZmZXJTdGFydDsKCiAgLyogRklYTUU6IGlzIHRoaXMgdGhlIHJpZ2h0IHJldHVybiB2YWx1ZT8gKi8KICByZXR1cm4gTlVMTDsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAgICAgICAgICAgTmRyTWFwQ29tbUFuZEZhdWx0U3RhdHVzIFtSUENSVDQuQF0KICovClJQQ19TVEFUVVMgUlBDX0VOVFJZIE5kck1hcENvbW1BbmRGYXVsdFN0YXR1cyggUE1JRExfU1RVQl9NRVNTQUdFIHBTdHViTXNnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGxvbmcgKnBDb21tU3RhdHVzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGxvbmcgKnBGYXVsdFN0YXR1cywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSUENfU1RBVFVTIFN0YXR1cyApCnsKICAgIEZJWE1FKCIoJXAsICVwLCAlcCwgJWxkKTogc3R1YlxuIiwgcFN0dWJNc2csIHBDb21tU3RhdHVzLCBwRmF1bHRTdGF0dXMsIFN0YXR1cyk7CgogICAgKnBDb21tU3RhdHVzID0gMDsKICAgICpwRmF1bHRTdGF0dXMgPSAwOwoKICAgIHJldHVybiBSUENfU19PSzsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAgICAgICAgICAgTmRyU3R1YkZvcndhcmRpbmdGdW5jdGlvbiBbUlBDUlQ0LkBdCiAqLwp2b2lkIF9fUlBDX1NUVUIgTmRyU3R1YkZvcndhcmRpbmdGdW5jdGlvbiggSVJwY1N0dWJCdWZmZXIgKlRoaXMsIElScGNDaGFubmVsQnVmZmVyICpwQ2hhbm5lbCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBSUENfTUVTU0FHRSBwTXNnLCBEV09SRCAqcGR3U3R1YlBoYXNlICkKewogICAgRklYTUUoIk5vdCBpbXBsZW1lbnRlZFxuIik7CiAgICByZXR1cm47Cn0K