LyoKICogTVNXU09DSyBzcGVjaWZpYyBmdW5jdGlvbnMKICoKICogQ29weXJpZ2h0IChDKSAyMDAzIEFuZHLpIEpvaGFuc2VuCiAqCiAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwogKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiAqCiAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAogKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgogKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQogKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgogKgogKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCiAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQQogKi8KCiNpbmNsdWRlICJjb25maWcuaCIKCiNpbmNsdWRlIDxzdGRhcmcuaD4KCiNpbmNsdWRlICJ3aW5kZWYuaCIKI2luY2x1ZGUgIndpbmJhc2UuaCIKI2luY2x1ZGUgIndpbnNvY2syLmgiCiNpbmNsdWRlICJtc3dzb2NrLmgiCgojaW5jbHVkZSAid2luZS9kZWJ1Zy5oIgoKV0lORV9ERUZBVUxUX0RFQlVHX0NIQU5ORUwobXN3c29jayk7CgpzdGF0aWMgTFBGTl9BQ0NFUFRFWCBhY2NlcHRleF9mbjsKc3RhdGljIExQRk5fR0VUQUNDRVBURVhTT0NLQUREUlMgYWNjZXB0ZXhzb2NrYWRkcnNfZm47CnN0YXRpYyBMUEZOX1RSQU5TTUlURklMRSB0cmFuc21pdGZpbGVfZm47CnN0YXRpYyBCT09MIGluaXRpYWxpc2VkOwoKLyogR2V0IHBvaW50ZXJzIHRvIHRoZSB3czJfMzIgaW1wbGVtZW50YXRpb25zLgogKiBOT1RFOiBUaGlzIGFzc3VtZXMgdGhhdCB3czJfMzIgY29udGFpbnMgb25seSBvbmUgaW1wbGVtZW50YXRpb24KICogb2YgdGhlc2UgZnVuY3Rpb25zLCBpLmUuIHRoYXQgeW91IGNhbm5vdCBnZXQgZGlmZmVyZW50IGZ1bmN0aW9ucwogKiBiYWNrIGJ5IHBhc3NpbmcgYW5vdGhlciBzb2NrZXQgaW4uIElmIHRoYXQgZXZlciBjaGFuZ2VzLCB3ZSdsbCBuZWVkCiAqIHRvIHRoaW5rIGFib3V0IGFzc29jaWF0aW5nIHRoZSBmdW5jdGlvbnMgd2l0aCB0aGUgc29ja2V0IGFuZAogKiBleHBvc2luZyB0aGF0IGluZm9ybWF0aW9uIHRvIHRoaXMgZGxsIHNvbWVob3cuCiAqLwpzdGF0aWMgdm9pZCBnZXRfZm4oU09DS0VUIHMsIEdVSUQqIGd1aWQsIEZBUlBST0MqIGZuKQp7CiAgICBGQVJQUk9DIGZ1bmM7CiAgICBEV09SRCBsZW47CiAgICBpZiAoIVdTQUlvY3RsKHMsIFNJT19HRVRfRVhURU5TSU9OX0ZVTkNUSU9OX1BPSU5URVIsIGd1aWQsIHNpemVvZigqZ3VpZCksCiAgICAgICAgICAgICAgICAgICZmdW5jLCBzaXplb2YoZnVuYyksICZsZW4sIE5VTEwsIE5VTEwpKQogICAgICAgICpmbiA9IGZ1bmM7Cn0KCnN0YXRpYyB2b2lkIGdldF9mbl9wb2ludGVycyhTT0NLRVQgcykKewogICAgR1VJRCBhY2NlcHRleF9ndWlkID0gV1NBSURfQUNDRVBURVg7CiAgICBHVUlEIGFjY2VwdGV4c29ja2FkZHJzX2d1aWQgPSBXU0FJRF9HRVRBQ0NFUFRFWFNPQ0tBRERSUzsKICAgIEdVSUQgdHJhbnNtaXRmaWxlX2d1aWQgPSBXU0FJRF9UUkFOU01JVEZJTEU7CgogICAgZ2V0X2ZuKHMsICZhY2NlcHRleF9ndWlkLCAoRkFSUFJPQyopJmFjY2VwdGV4X2ZuKTsKICAgIGdldF9mbihzLCAmYWNjZXB0ZXhzb2NrYWRkcnNfZ3VpZCwgKEZBUlBST0MqKSZhY2NlcHRleHNvY2thZGRyc19mbik7CiAgICBnZXRfZm4ocywgJnRyYW5zbWl0ZmlsZV9ndWlkLCAoRkFSUFJPQyopJnRyYW5zbWl0ZmlsZV9mbik7CiAgICBpbml0aWFsaXNlZCA9IFRSVUU7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgkJQWNjZXB0RXggKE1TV1NPQ0suQCkKICoKICogQWNjZXB0IGEgbmV3IGNvbm5lY3Rpb24sIHJldHJpZXZpbmcgdGhlIGNvbm5lY3RlZCBhZGRyZXNzZXMgYW5kIGluaXRpYWwgZGF0YS4KICoKICogbGlzdGVuZXIgICAgICAgW0ldIExpc3RlbmluZyBzb2NrZXQKICogYWNjZXB0b3IgICAgICAgW0ldIFNvY2tldCB0byBhY2NlcHQgb24KICogZGVzdCAgICAgICAgICAgW09dIERlc3RpbmF0aW9uIGZvciBpbml0YWwgZGF0YQogKiBkZXN0X2xlbiAgICAgICBbSV0gU2l6ZSBvZiBkZXN0IGluIGJ5dGVzCiAqIGxvY2FsX2FkZHJfbGVuIFtJXSBOdW1iZXIgb2YgYnl0ZXMgcmVzZXJ2ZWQgaW4gZGVzdCBmb3IgbG9jYWwgYWRkcnJlc3MKICogcmVtX2FkZHJfbGVuICAgW0ldIE51bWJlciBvZiBieXRlcyByZXNlcnZlZCBpbiBkZXN0IGZvciByZW1vdGUgYWRkcnJlc3MKICogcmVjZWl2ZWQgICAgICAgW09dIERlc3RpbmF0aW9uIGZvciBudW1iZXIgb2YgYnl0ZXMgb2YgaW5pdGlhbCBkYXRhCiAqIG92ZXJsYXBwZWQgICAgIFtJXSBGb3IgYXN5bmNocm9ub3VzIGV4ZWN1dGlvbgogKgogKiBSRVRVUk5TCiAqIFN1Y2Nlc3M6IFRSVUUKICogRmFpbHVyZTogRkFMU0UuIFVzZSBXU0FHZXRMYXN0RXJyb3IoKSBmb3IgZGV0YWlscyBvZiB0aGUgZXJyb3IuCiAqLwpCT09MIFdJTkFQSSBBY2NlcHRFeChTT0NLRVQgbGlzdGVuZXIsIFNPQ0tFVCBhY2NlcHRvciwgUFZPSUQgZGVzdCwgRFdPUkQgZGVzdF9sZW4sCiAgICAgICAgICAgICAgICAgICAgIERXT1JEIGxvY2FsX2FkZHJfbGVuLCBEV09SRCByZW1fYWRkcl9sZW4sIExQRFdPUkQgcmVjZWl2ZWQsCiAgICAgICAgICAgICAgICAgICAgIExQT1ZFUkxBUFBFRCBvdmVybGFwcGVkKQp7CiAgICBpZiAoIWluaXRpYWxpc2VkKQogICAgICAgIGdldF9mbl9wb2ludGVycyhhY2NlcHRvcik7CgogICAgaWYgKCFhY2NlcHRleF9mbikKICAgICAgICByZXR1cm4gRkFMU0U7CgogICAgcmV0dXJuIGFjY2VwdGV4X2ZuKGxpc3RlbmVyLCBhY2NlcHRvciwgZGVzdCwgZGVzdF9sZW4sIGxvY2FsX2FkZHJfbGVuLAogICAgICAgICAgICAgICAgICAgICAgIHJlbV9hZGRyX2xlbiwgcmVjZWl2ZWQsIG92ZXJsYXBwZWQpOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoJCUdldEFjY2VwdEV4U29ja2FkZHJzIChNU1dTT0NLLkApCiAqCiAqIEdldCBpbmZvbWF0aW9uIGFib3V0IGFuIGFjY2VwdGVkIHNvY2tldC4KICoKICogZGF0YSAgICAgICAgICAgW09dIERlc3RpbmF0aW9uIGZvciB0aGUgZmlyc3QgYmxvY2sgb2YgZGF0YSBmcm9tIEFjY2VwdEV4KCkKICogZGF0YV9sZW4gICAgICAgW0ldIGxlbmd0aCBvZiBkYXRhIGluIGJ5dGVzCiAqIGxvY2FsX2xlbiAgICAgIFtJXSBCeXRlcyByZXNlcnZlZCBmb3IgbG9jYWwgYWRkcmluZm8KICogcmVtX2xlbiAgICAgICAgW0ldIEJ5dGVzIHJlc2VydmVkIGZvciByZW1vdGUgYWRkcmluZm8KICogbG9jYWxfYWRkciAgICAgW09dIERlc3RpbmF0aW9uIGZvciBsb2NhbCBzb2NrYWRkcgogKiBsb2NhbF9hZGRyX2xlbiBbSV0gU2l6ZSBvZiBsb2NhbF9hZGRyCiAqIHJlbV9hZGRyICAgICAgIFtPXSBEZXN0aW5hdGlvbiBmb3IgcmVtb3RlIHNvY2thZGRyCiAqIHJlbV9hZGRyX2xlbiAgIFtJXSBTaXplIG9mIHJlbV9hZGRyCiAqCiAqIFJFVFVSTlMKICogIE5vdGhpbmcuCiAqLwpWT0lEIFdJTkFQSSBHZXRBY2NlcHRFeFNvY2thZGRycyhQVk9JRCBkYXRhLCBEV09SRCBkYXRhX2xlbiwgRFdPUkQgbG9jYWxfbGVuLCBEV09SRCByZW1fbGVuLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3Qgc29ja2FkZHIgKipsb2NhbF9hZGRyLCBMUElOVCBsb2NhbF9hZGRyX2xlbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IHNvY2thZGRyICoqcmVtX2FkZHIsIExQSU5UIHJlbV9hZGRyX2xlbikKewogICAgaWYgKGFjY2VwdGV4c29ja2FkZHJzX2ZuKQogICAgICAgIGFjY2VwdGV4c29ja2FkZHJzX2ZuKGRhdGEsIGRhdGFfbGVuLCBsb2NhbF9sZW4sIHJlbV9sZW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9jYWxfYWRkciwgbG9jYWxfYWRkcl9sZW4sIHJlbV9hZGRyLCByZW1fYWRkcl9sZW4pOwp9CgoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCQlUcmFuc21pdEZpbGUgKE1TV1NPQ0suQCkKICoKICogVHJhbnNtaXQgYSBmaWxlIG92ZXIgYSBzb2NrZXQuCiAqCiAqIFBBUkFNUwogKiBzICAgICAgICAgIFtJXSBIYW5kbGUgdG8gYSBjb25uZWN0ZWQgc29ja2V0CiAqIGZpbGUgICAgICAgW0ldIE9wZW5lZCBmaWxlIGhhbmRsZSBmb3IgZmlsZSB0byBzZW5kCiAqIHRvdGFsX2xlbiAgW0ldIFRvdGFsIG51bWJlciBvZiBmaWxlIGJ5dGVzIHRvIHNlbmQKICogY2h1bmtfbGVuICBbSV0gQ2h1bmsgc2l6ZSB0byBzZW5kIGZpbGUgaW4gKDA9ZGVmYXVsdCkKICogb3ZlcmxhcHBlZCBbSV0gRm9yIGFzeW5jaHJvbm91cyBvcGVyYXRpb24KICogYnVmZmVycyAgICBbSV0gSGVhZC90YWlsIGRhdGEsIG9yIE5VTEwgaWYgbm9uZQogKiBmbGFncyAgICAgIFtJXSBURl8gRmxhZ3MgZnJvbSBtc3dzb2NrLmgKICoKICogUkVUVVJOUwogKiBTdWNjZXNzOiBUUlVFCiAqIEZhaWx1cmU6IEZBTFNFLiBVc2UgV1NBR2V0TGFzdEVycm9yKCkgZm9yIGRldGFpbHMgb2YgdGhlIGVycm9yLgogKi8KQk9PTCBXSU5BUEkgVHJhbnNtaXRGaWxlKFNPQ0tFVCBzLCBIQU5ETEUgZmlsZSwgRFdPUkQgdG90YWxfbGVuLAogICAgICAgICAgICAgICAgICAgICAgICAgRFdPUkQgY2h1bmtfbGVuLCBMUE9WRVJMQVBQRUQgb3ZlcmxhcHBlZCwKICAgICAgICAgICAgICAgICAgICAgICAgIExQVFJBTlNNSVRfRklMRV9CVUZGRVJTIGJ1ZmZlcnMsIERXT1JEIGZsYWdzKQp7CiAgICBpZiAoIWluaXRpYWxpc2VkKQogICAgICAgIGdldF9mbl9wb2ludGVycyhzKTsKCiAgICBpZiAoIXRyYW5zbWl0ZmlsZV9mbikKICAgICAgICByZXR1cm4gRkFMU0U7CgogICAgcmV0dXJuIHRyYW5zbWl0ZmlsZV9mbihzLCBmaWxlLCB0b3RhbF9sZW4sIGNodW5rX2xlbiwgb3ZlcmxhcHBlZCwgYnVmZmVycywgZmxhZ3MpOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoJCVdTQVJlY3ZFeCAoTVNXU09DSy5AKQogKi8KSU5UIFdJTkFQSSBXU0FSZWN2RXgoCglTT0NLRVQgcywgICAvKiBbaW5dIERlc2NyaXB0b3IgaWRlbnRpZnlpbmcgYSBjb25uZWN0ZWQgc29ja2V0ICovCgljaGFyICpidWYsICAvKiBbb3V0XSBCdWZmZXIgZm9yIHRoZSBpbmNvbWluZyBkYXRhICovCglJTlQgbGVuLCAgICAvKiBbaW5dIExlbmd0aCBvZiBidWYsIGluIGJ5dGVzICovCiAgICAgICAgSU5UICpmbGFncykgLyogW2luL291dF0gSW5kaWNhdG9yIHNwZWNpZnlpbmcgd2hldGhlciB0aGUgbWVzc2FnZSBpcwoJICAgICAgICAgICAgICAgZnVsbHkgb3IgcGFydGlhbGx5IHJlY2VpdmVkIGZvciBkYXRhZ3JhbSBzb2NrZXRzICovCnsKICAgIEZJWE1FKCJub3QgaW1wbGVtZW50ZWRcbiIpOwogICAgCiAgICByZXR1cm4gU09DS0VUX0VSUk9SOwp9Cg==