LyoKICogTUlETCBwcm94eS9zdHViIHN0dWZmCiAqCiAqIENvcHlyaWdodCAyMDAyIE92ZSBL5XZlbiwgVHJhbnNHYW1pbmcgVGVjaG5vbG9naWVzCiAqCiAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwogKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiAqCiAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAogKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgogKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQogKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgogKgogKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCiAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQogKgogKiBUT0RPOgogKiAgLSBmaWd1cmUgb3V0IHdoZXRoZXIgd2UgKnJlYWxseSogZ290IHRoaXMgcmlnaHQKICogIC0gY2hlY2sgZm9yIGVycm9ycyBhbmQgdGhyb3cgZXhjZXB0aW9ucwogKi8KCiNpbmNsdWRlIDxzdGRpby5oPgojaW5jbHVkZSA8c3RyaW5nLmg+CgojaW5jbHVkZSAid2luZGVmLmgiCiNpbmNsdWRlICJ3aW5iYXNlLmgiCiNpbmNsdWRlICJ3aW5lcnJvci5oIgojaW5jbHVkZSAid2lucmVnLmgiCgojaW5jbHVkZSAid2luZS9vYmpfYmFzZS5oIgojaW5jbHVkZSAid2luZS9vYmpfY2hhbm5lbC5oIgoKI2luY2x1ZGUgInJwY3Byb3h5LmgiCgojaW5jbHVkZSAid2luZS9kZWJ1Zy5oIgoKI2luY2x1ZGUgImNwc2YuaCIKI2luY2x1ZGUgIm5kcl9taXNjLmgiCgpXSU5FX0RFRkFVTFRfREVCVUdfQ0hBTk5FTChvbGUpOwoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqICAgICAgICAgICBOZHJQcm94eUluaXRpYWxpemUgW1JQQ1JUNC5AXQogKi8Kdm9pZCBXSU5BUEkgTmRyUHJveHlJbml0aWFsaXplKHZvaWQgKlRoaXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBSUENfTUVTU0FHRSBwUnBjTXNnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQTUlETF9TVFVCX01FU1NBR0UgcFN0dWJNc2csCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBNSURMX1NUVUJfREVTQyBwU3R1YkRlc2NyaXB0b3IsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBQcm9jTnVtKQp7CiAgSFJFU1VMVCBocjsKCiAgVFJBQ0UoIiglcCwlcCwlcCwlcCwlZClcbiIsIFRoaXMsIHBScGNNc2csIHBTdHViTXNnLCBwU3R1YkRlc2NyaXB0b3IsIFByb2NOdW0pOwogIG1lbXNldChwUnBjTXNnLCAwLCBzaXplb2YoUlBDX01FU1NBR0UpKTsKICBtZW1zZXQocFN0dWJNc2csIDAsIHNpemVvZihNSURMX1NUVUJfTUVTU0FHRSkpOwogIHBScGNNc2ctPlByb2NOdW0gPSBQcm9jTnVtOwogIHBScGNNc2ctPlJwY0ludGVyZmFjZUluZm9ybWF0aW9uID0gcFN0dWJEZXNjcmlwdG9yLT5ScGNJbnRlcmZhY2VJbmZvcm1hdGlvbjsKICBwU3R1Yk1zZy0+UnBjTXNnID0gcFJwY01zZzsKICBwU3R1Yk1zZy0+SXNDbGllbnQgPSAxOwogIHBTdHViTXNnLT5SZXVzZUJ1ZmZlciA9IDE7CiAgcFN0dWJNc2ctPnBmbkFsbG9jYXRlID0gcFN0dWJEZXNjcmlwdG9yLT5wZm5BbGxvY2F0ZTsKICBwU3R1Yk1zZy0+cGZuRnJlZSA9IHBTdHViRGVzY3JpcHRvci0+cGZuRnJlZTsKICBwU3R1Yk1zZy0+U3R1YkRlc2MgPSBwU3R1YkRlc2NyaXB0b3I7CiAgaWYgKFRoaXMpIFN0ZFByb3h5X0dldENoYW5uZWwoVGhpcywgJnBTdHViTXNnLT5wUnBjQ2hhbm5lbEJ1ZmZlcik7CiAgaWYgKHBTdHViTXNnLT5wUnBjQ2hhbm5lbEJ1ZmZlcikgewogICAgaHIgPSBJUnBjQ2hhbm5lbEJ1ZmZlcl9HZXREZXN0Q3R4KHBTdHViTXNnLT5wUnBjQ2hhbm5lbEJ1ZmZlciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwU3R1Yk1zZy0+ZHdEZXN0Q29udGV4dCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwU3R1Yk1zZy0+cHZEZXN0Q29udGV4dCk7CiAgfQogIFRSQUNFKCJjaGFubmVsPSVwXG4iLCBwU3R1Yk1zZy0+cFJwY0NoYW5uZWxCdWZmZXIpOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogICAgICAgICAgIE5kclByb3h5R2V0QnVmZmVyIFtSUENSVDQuQF0KICovCnZvaWQgV0lOQVBJIE5kclByb3h5R2V0QnVmZmVyKHZvaWQgKlRoaXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUE1JRExfU1RVQl9NRVNTQUdFIHBTdHViTXNnKQp7CiAgSFJFU1VMVCBocjsKICBjb25zdCBJSUQgKnJpaWQgPSBOVUxMOwoKICBUUkFDRSgiKCVwLCVwKVxuIiwgVGhpcywgcFN0dWJNc2cpOwogIHBTdHViTXNnLT5ScGNNc2ctPkJ1ZmZlckxlbmd0aCA9IHBTdHViTXNnLT5CdWZmZXJMZW5ndGg7CiAgcFN0dWJNc2ctPmR3U3R1YlBoYXNlID0gUFJPWFlfR0VUQlVGRkVSOwogIGhyID0gU3RkUHJveHlfR2V0SUlEKFRoaXMsICZyaWlkKTsKICBociA9IElScGNDaGFubmVsQnVmZmVyX0dldEJ1ZmZlcihwU3R1Yk1zZy0+cFJwY0NoYW5uZWxCdWZmZXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoUlBDT0xFTUVTU0FHRSopcFN0dWJNc2ctPlJwY01zZywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJpaWQpOwogIHBTdHViTXNnLT5CdWZmZXJTdGFydCA9IHBTdHViTXNnLT5ScGNNc2ctPkJ1ZmZlcjsKICBwU3R1Yk1zZy0+QnVmZmVyRW5kID0gcFN0dWJNc2ctPkJ1ZmZlclN0YXJ0ICsgcFN0dWJNc2ctPkJ1ZmZlckxlbmd0aDsKICBwU3R1Yk1zZy0+QnVmZmVyID0gcFN0dWJNc2ctPkJ1ZmZlclN0YXJ0OwogIHBTdHViTXNnLT5kd1N0dWJQaGFzZSA9IFBST1hZX01BUlNIQUw7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAgICAgICAgICAgTmRyUHJveHlTZW5kUmVjZWl2ZSBbUlBDUlQ0LkBdCiAqLwp2b2lkIFdJTkFQSSBOZHJQcm94eVNlbmRSZWNlaXZlKHZvaWQgKlRoaXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQTUlETF9TVFVCX01FU1NBR0UgcFN0dWJNc2cpCnsKICBVTE9ORyBTdGF0dXMgPSAwOwogIEhSRVNVTFQgaHI7CgogIFRSQUNFKCIoJXAsJXApXG4iLCBUaGlzLCBwU3R1Yk1zZyk7CiAgcFN0dWJNc2ctPmR3U3R1YlBoYXNlID0gUFJPWFlfU0VORFJFQ0VJVkU7CiAgaHIgPSBJUnBjQ2hhbm5lbEJ1ZmZlcl9TZW5kUmVjZWl2ZShwU3R1Yk1zZy0+cFJwY0NoYW5uZWxCdWZmZXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChSUENPTEVNRVNTQUdFKilwU3R1Yk1zZy0+UnBjTXNnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmU3RhdHVzKTsKICBwU3R1Yk1zZy0+ZHdTdHViUGhhc2UgPSBQUk9YWV9VTk1BUlNIQUw7CiAgcFN0dWJNc2ctPkJ1ZmZlckxlbmd0aCA9IHBTdHViTXNnLT5ScGNNc2ctPkJ1ZmZlckxlbmd0aDsKICBwU3R1Yk1zZy0+QnVmZmVyU3RhcnQgPSBwU3R1Yk1zZy0+UnBjTXNnLT5CdWZmZXI7CiAgcFN0dWJNc2ctPkJ1ZmZlckVuZCA9IHBTdHViTXNnLT5CdWZmZXJTdGFydCArIHBTdHViTXNnLT5CdWZmZXJMZW5ndGg7CiAgcFN0dWJNc2ctPkJ1ZmZlciA9IHBTdHViTXNnLT5CdWZmZXJTdGFydDsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqICAgICAgICAgICBOZHJQcm94eUZyZWVCdWZmZXIgW1JQQ1JUNC5AXQogKi8Kdm9pZCBXSU5BUEkgTmRyUHJveHlGcmVlQnVmZmVyKHZvaWQgKlRoaXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBNSURMX1NUVUJfTUVTU0FHRSBwU3R1Yk1zZykKewogIEhSRVNVTFQgaHI7CgogIFRSQUNFKCIoJXAsJXApXG4iLCBUaGlzLCBwU3R1Yk1zZyk7CiAgaHIgPSBJUnBjQ2hhbm5lbEJ1ZmZlcl9GcmVlQnVmZmVyKHBTdHViTXNnLT5wUnBjQ2hhbm5lbEJ1ZmZlciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoUlBDT0xFTUVTU0FHRSopcFN0dWJNc2ctPlJwY01zZyk7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAgICAgICAgICAgTmRyU3R1YkluaXRpYWxpemUgW1JQQ1JUNC5AXQogKi8Kdm9pZCBXSU5BUEkgTmRyU3R1YkluaXRpYWxpemUoUFJQQ19NRVNTQUdFIHBScGNNc2csCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUE1JRExfU1RVQl9NRVNTQUdFIHBTdHViTXNnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBNSURMX1NUVUJfREVTQyBwU3R1YkRlc2NyaXB0b3IsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFBSUENDSEFOTkVMQlVGRkVSIHBScGNDaGFubmVsQnVmZmVyKQp7CiAgVFJBQ0UoIiglcCwlcCwlcCwlcClcbiIsIHBScGNNc2csIHBTdHViTXNnLCBwU3R1YkRlc2NyaXB0b3IsIHBScGNDaGFubmVsQnVmZmVyKTsKICBtZW1zZXQocFN0dWJNc2csIDAsIHNpemVvZihNSURMX1NUVUJfTUVTU0FHRSkpOwogIHBTdHViTXNnLT5ScGNNc2cgPSBwUnBjTXNnOwogIHBTdHViTXNnLT5Jc0NsaWVudCA9IDA7CiAgcFN0dWJNc2ctPlJldXNlQnVmZmVyID0gMTsKICBwU3R1Yk1zZy0+cGZuQWxsb2NhdGUgPSBwU3R1YkRlc2NyaXB0b3ItPnBmbkFsbG9jYXRlOwogIHBTdHViTXNnLT5wZm5GcmVlID0gcFN0dWJEZXNjcmlwdG9yLT5wZm5GcmVlOwogIHBTdHViTXNnLT5TdHViRGVzYyA9IHBTdHViRGVzY3JpcHRvcjsKICBwU3R1Yk1zZy0+cFJwY0NoYW5uZWxCdWZmZXIgPSBwUnBjQ2hhbm5lbEJ1ZmZlcjsKICBwU3R1Yk1zZy0+QnVmZmVyTGVuZ3RoID0gcFN0dWJNc2ctPlJwY01zZy0+QnVmZmVyTGVuZ3RoOwogIHBTdHViTXNnLT5CdWZmZXJTdGFydCA9IHBTdHViTXNnLT5ScGNNc2ctPkJ1ZmZlcjsKICBwU3R1Yk1zZy0+QnVmZmVyRW5kID0gcFN0dWJNc2ctPkJ1ZmZlclN0YXJ0ICsgcFN0dWJNc2ctPkJ1ZmZlckxlbmd0aDsKICBwU3R1Yk1zZy0+QnVmZmVyID0gcFN0dWJNc2ctPkJ1ZmZlclN0YXJ0Owp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogICAgICAgICAgIE5kclN0dWJHZXRCdWZmZXIgW1JQQ1JUNC5AXQogKi8Kdm9pZCBXSU5BUEkgTmRyU3R1YkdldEJ1ZmZlcihMUFJQQ1NUVUJCVUZGRVIgVGhpcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIExQUlBDQ0hBTk5FTEJVRkZFUiBwUnBjQ2hhbm5lbEJ1ZmZlciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBNSURMX1NUVUJfTUVTU0FHRSBwU3R1Yk1zZykKewogIFRSQUNFKCIoJXAsJXApXG4iLCBUaGlzLCBwU3R1Yk1zZyk7CiAgcFN0dWJNc2ctPnBScGNDaGFubmVsQnVmZmVyID0gcFJwY0NoYW5uZWxCdWZmZXI7CiAgcFN0dWJNc2ctPlJwY01zZy0+QnVmZmVyTGVuZ3RoID0gcFN0dWJNc2ctPkJ1ZmZlckxlbmd0aDsKICBJX1JwY0dldEJ1ZmZlcihwU3R1Yk1zZy0+UnBjTXNnKTsgLyogPyAqLwogIHBTdHViTXNnLT5CdWZmZXJTdGFydCA9IHBTdHViTXNnLT5ScGNNc2ctPkJ1ZmZlcjsKICBwU3R1Yk1zZy0+QnVmZmVyRW5kID0gcFN0dWJNc2ctPkJ1ZmZlclN0YXJ0ICsgcFN0dWJNc2ctPkJ1ZmZlckxlbmd0aDsKICBwU3R1Yk1zZy0+QnVmZmVyID0gcFN0dWJNc2ctPkJ1ZmZlclN0YXJ0Owp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqICAgICAgICAgICAgIE5kckNsaWVudEluaXRpYWxpemVOZXcgW1JQQ1JUNC5AXQogKi8Kdm9pZCBXSU5BUEkgTmRyQ2xpZW50SW5pdGlhbGl6ZU5ldyggUFJQQ19NRVNTQUdFIHBScGNNZXNzYWdlLCBQTUlETF9TVFVCX01FU1NBR0UgcFN0dWJNc2csIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQTUlETF9TVFVCX0RFU0MgcFN0dWJEZXNjLCBpbnQgdW5rbm93biApCnsKICBGSVhNRSgic3R1YlxuIik7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAgICAgICAgICAgTmRyR2V0QnVmZmVyIFtSUENSVDQuQF0KICovCnVuc2lnbmVkIGNoYXIgKldJTkFQSSBOZHJHZXRCdWZmZXIoTUlETF9TVFVCX01FU1NBR0UgKnN0dWJtc2csIHVuc2lnbmVkIGxvbmcgYnVmbGVuLCBSUENfQklORElOR19IQU5ETEUgaGFuZGxlKQp7CiAgRklYTUUoInN0dWJcbiIpOwogIHJldHVybiBOVUxMOwp9Ci8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAgICAgICAgICAgTmRyRnJlZUJ1ZmZlciBbUlBDUlQ0LkBdCiAqLwp2b2lkIFdJTkFQSSBOZHJGcmVlQnVmZmVyKE1JRExfU1RVQl9NRVNTQUdFICpwU3R1Yk1zZykKewogIEZJWE1FKCJzdHViXG4iKTsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAgICAgICAgICAgTmRyU2VuZFJlY2VpdmUgW1JQQ1JUNC5AXQogKi8KdW5zaWduZWQgY2hhciAqV0lOQVBJIE5kclNlbmRSZWNlaXZlKCBNSURMX1NUVUJfTUVTU0FHRSAqc3R1Ym1zZywgdW5zaWduZWQgY2hhciAqYnVmZmVyICApCnsKICBGSVhNRSgic3R1YlxuIik7CiAgcmV0dXJuIE5VTEw7Cn0K