LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwovKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCi8qICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KLyogKiAgICAgICAgICAgICAgIFNQTElUVElORyBPRiBDTEFVU0VTICAgICAgICAgICAgICAgICAgICAgKiAqLwovKiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCi8qICogICRNb2R1bGU6ICAgU1BMSVQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8gCi8qICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KLyogKiAgQ29weXJpZ2h0IChDKSAxOTk2LCAxOTk3LCAxOTk4LCAyMDAwICAgICAgICAgICAgICAgICAgKiAqLwovKiAqICBNUEkgZnVlciBJbmZvcm1hdGlrICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCi8qICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KLyogKiAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlICAgKiAqLwovKiAqICBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VICAgICAgICAqICovCi8qICogIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlICAgICAgICogKi8KLyogKiAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgKiAqLwovKiAqICBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLiAgICAgICAgICAgICAgICAqICovCi8qICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KLyogKiAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCAgKiAqLwovKiAqICBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuICAgICAqICovCi8qICogIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTICAgICogKi8KLyogKiAgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgKiAqLwovKiAqICBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCi8qICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KLyogKiAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgICAgKiAqLwovKiAqICBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSAqICovCi8qICogIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSAgICAgICogKi8KLyogKiAgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBICAgICAgICAgKiAqLwovKiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCi8qICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KLyogJFJldmlzaW9uJCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCi8qICRTdGF0ZSQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KLyogJERhdGUkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCi8qICRBdXRob3IkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLwovKiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCi8qICogICAgICAgICAgICAgQ29udGFjdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KLyogKiAgICAgICAgICAgICBDaHJpc3RvcGggV2VpZGVuYmFjaCAgICAgICAgICAgICAgICAgICAgICAgKiAqLwovKiAqICAgICAgICAgICAgIE1QSSBmdWVyIEluZm9ybWF0aWsgICAgICAgICAgICAgICAgICAgICAgICAqICovCi8qICogICAgICAgICAgICAgU3R1aGxzYXR6ZW5oYXVzd2VnIDg1ICAgICAgICAgICAgICAgICAgICAgICogKi8KLyogKiAgICAgICAgICAgICA2NjEyMyBTYWFyYnJ1ZWNrZW4gICAgICAgICAgICAgICAgICAgICAgICAgKiAqLwovKiAqICAgICAgICAgICAgIEVtYWlsOiB3ZWlkZW5iQG1waS1zYi5tcGcuZGUgICAgICAgICAgICAgICAqICovCi8qICogICAgICAgICAgICAgR2VybWFueSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KLyogKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLwovKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KCgovKiAkUkNTZmlsZSQgKi8KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLyogSW5jbHVkZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCgojaW5jbHVkZSAicnVsZXMtc3BsaXQuaCIKCnN0YXRpYyBMSVNUICBzcGxpdF9EZWxldGVDbGF1c2VzRGVwZW5kaW5nT25MZXZlbEZyb21MaXN0KFBST09GU0VBUkNILExJU1QsIGludCwgTElTVCopOwpzdGF0aWMgTElTVCAgc3BsaXRfRGVsZXRlSW52YWxpZENsYXVzZXNGcm9tTGlzdChQUk9PRlNFQVJDSCwgaW50LCBMSVNUKTsKc3RhdGljIHZvaWQgIHNwbGl0X0RlbGV0ZUludmFsaWRDbGF1c2VzRnJvbVN0YWNrKFBST09GU0VBUkNIKTsKc3RhdGljIExJU1QgIHNwbGl0X1JlbW92ZVVubmVjZXNzYXJ5U3BsaXRzKFBST09GU0VBUkNILCBDTEFVU0UpOwoKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLyogRnVuY3Rpb25zICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCgoKTElTVCBzcGxpdF9CYWNrdHJhY2soUFJPT0ZTRUFSQ0ggUFMsIENMQVVTRSBFbXB0eUNsYXVzZSwgQ0xBVVNFKiBTcGxpdENsYXVzZSkgCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogIElOUFVUOiAgIEEgcHJvb2ZzZWFyY2ggb2JqZWN0LCBhbiBlbXB0eSBjbGF1c2UgYW5kIGEgcG9pbnRlciB0byBhIGNsYXVzZQogICAgICAgICAgIHVzZWQgYXMgcmV0dXJuIHZhbHVlLgogIFJFVFVSTlM6IEEgbGlzdCBvZiBjbGF1c2VzIGRlbGV0ZWQgaW4gdGhlIGJhY2t0cmFja2VkIHNwbGl0IGxldmVscy4KICAgICAgICAgICA8KlNwbGl0Q2xhdXNlPiBpcyBzZXQgdG8gdGhlIHNwbGl0IGNsYXVzZSBmb3IgdGhlIHJpZ2h0IGJyYW5jaAoJICAgb2YgdGhlIHNwbGl0dGluZyBzdGVwLCBvciBOVUxMLCBpZiB0aGUgdGFibGVhdSBpcyBmaW5pc2hlZC4KICBFRkZFQ1Q6ICBCYWNrdHJhY2tzIHRoZSB0b3Agb2YgdGhlIHNwbGl0IHN0YWNrIHdydCB0aGUgZW1wdHkgY2xhdXNlJ3MgbGV2ZWwKKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwp7CiAgU1BMSVQgQWN0QmFja3RyYWNrU3BsaXQ7CiAgTElTVCAgUmVjb3Zlckxpc3QsIFNjYW47CiAgaW50ICAgQmFja3RyYWNrbGV2ZWw7CgogIEFjdEJhY2t0cmFja1NwbGl0ID0gKFNQTElUKU5VTEw7CiAgUmVjb3Zlckxpc3QgICAgICAgPSBzcGxpdF9SZW1vdmVVbm5lY2Vzc2FyeVNwbGl0cyhQUywgRW1wdHlDbGF1c2UpOwogIEJhY2t0cmFja2xldmVsICAgID0gY2xhdXNlX1NwbGl0TGV2ZWwoRW1wdHlDbGF1c2UpOwogICpTcGxpdENsYXVzZSAgICAgID0gTlVMTDsKCiAgLyogQmFja3RyYWNrIGFsbCBzcGxpdCBsZXZlbHMgYmlnZ2VyIHRoYW4gdGhlIGxldmVsIG9mIHRoZSBlbXB0eSBjbGF1c2UgKi8KICB3aGlsZSAoIXByZnNfU3BsaXRTdGFja0VtcHR5KFBTKSAmJiAocHJmc19WYWxpZExldmVsKFBTKSA+IEJhY2t0cmFja2xldmVsKSkgewogICAgQWN0QmFja3RyYWNrU3BsaXQgPSBwcmZzX1NwbGl0U3RhY2tUb3AoUFMpOwogICAgcHJmc19TcGxpdFN0YWNrUG9wKFBTKTsKICAgIGlmIChwcmZzX1NwbGl0RmF0aGVyQ2xhdXNlKEFjdEJhY2t0cmFja1NwbGl0KSAhPSAoQ0xBVVNFKU5VTEwpIHsKICAgICAgUmVjb3Zlckxpc3QgPSBsaXN0X0NvbnMocHJmc19TcGxpdEZhdGhlckNsYXVzZShBY3RCYWNrdHJhY2tTcGxpdCksCgkJCSAgICAgIFJlY292ZXJMaXN0KTsKICAgICAgcHJmc19TcGxpdFNldEZhdGhlckNsYXVzZShBY3RCYWNrdHJhY2tTcGxpdCwgTlVMTCk7CiAgICB9CiAgICBSZWNvdmVyTGlzdCA9IGxpc3RfTmNvbmMocHJmc19TcGxpdERlbGV0ZWRDbGF1c2VzKEFjdEJhY2t0cmFja1NwbGl0KSwKCQkJICAgICBSZWNvdmVyTGlzdCk7CiAgICBjbGF1c2VfRGVsZXRlQ2xhdXNlTGlzdChwcmZzX1NwbGl0QmxvY2tlZENsYXVzZXMoQWN0QmFja3RyYWNrU3BsaXQpKTsKICAgIHByZnNfU3BsaXRGcmVlKEFjdEJhY2t0cmFja1NwbGl0KTsKICAgIHByZnNfRGVjVmFsaWRMZXZlbChQUyk7CiAgfQogIAogIC8qIEJhY2t0cmFjayBmdXJ0aGVyIGZvciBhbGwgcmlnaHQgYnJhbmNoZXMgb24gdG9wIG9mIHRoZSBzdGFjayAqLwogIHdoaWxlICghcHJmc19TcGxpdFN0YWNrRW1wdHkoUFMpICYmCgkgbGlzdF9FbXB0eShwcmZzX1NwbGl0QmxvY2tlZENsYXVzZXMocHJmc19TcGxpdFN0YWNrVG9wKFBTKSkpKSB7CiAgICBBY3RCYWNrdHJhY2tTcGxpdCA9IHByZnNfU3BsaXRTdGFja1RvcChQUyk7CiAgICBwcmZzX1NwbGl0U3RhY2tQb3AoUFMpOwogICAgaWYgKHByZnNfU3BsaXRGYXRoZXJDbGF1c2UoQWN0QmFja3RyYWNrU3BsaXQpICE9IChDTEFVU0UpTlVMTCkKICAgICAgUmVjb3Zlckxpc3QgPSBsaXN0X0NvbnMocHJmc19TcGxpdEZhdGhlckNsYXVzZShBY3RCYWNrdHJhY2tTcGxpdCksCgkJCSAgICAgIFJlY292ZXJMaXN0KTsKICAgIFJlY292ZXJMaXN0ID0gbGlzdF9OY29uYyhwcmZzX1NwbGl0RGVsZXRlZENsYXVzZXMoQWN0QmFja3RyYWNrU3BsaXQpLAoJCQkgICAgIFJlY292ZXJMaXN0KTsKICAgIHByZnNfU3BsaXRGcmVlKEFjdEJhY2t0cmFja1NwbGl0KTsKICAgIHByZnNfRGVjVmFsaWRMZXZlbChQUyk7CiAgfQogIAogIGlmICghcHJmc19TcGxpdFN0YWNrRW1wdHkoUFMpKSB7CiAgICAvKiBFbnRlciB0aGUgcmlnaHQgYnJhbmNoIG9mIHRoZSBzcGxpdHRpbmcgc3RlcCAqLwogICAgaW50IFNwbGl0TWludXMxOwogICAgTElTVCBSaWdodENsYXVzZXM7CgogICAgU3BsaXRNaW51czEgICAgICAgPSBwcmZzX1ZhbGlkTGV2ZWwoUFMpIC0gMTsKICAgIEFjdEJhY2t0cmFja1NwbGl0ID0gcHJmc19TcGxpdFN0YWNrVG9wKFBTKTsKCiAgICBSZWNvdmVyTGlzdCAgICAgICA9IGxpc3RfTmNvbmMocHJmc19TcGxpdERlbGV0ZWRDbGF1c2VzKEFjdEJhY2t0cmFja1NwbGl0KSwKCQkJCSAgIFJlY292ZXJMaXN0KTsKICAgIHByZnNfU3BsaXRTZXREZWxldGVkQ2xhdXNlcyhBY3RCYWNrdHJhY2tTcGxpdCwgbGlzdF9OaWwoKSk7ICAgIAogICAgUmVjb3Zlckxpc3QgICAgICAgPSBzcGxpdF9EZWxldGVJbnZhbGlkQ2xhdXNlc0Zyb21MaXN0KFBTLCBTcGxpdE1pbnVzMSwKCQkJCQkJCSAgIFJlY292ZXJMaXN0KTsKCiAgICBSaWdodENsYXVzZXMgPSBwcmZzX1NwbGl0QmxvY2tlZENsYXVzZXMoQWN0QmFja3RyYWNrU3BsaXQpOwogICAgcHJmc19TcGxpdFNldEJsb2NrZWRDbGF1c2VzKEFjdEJhY2t0cmFja1NwbGl0LCBsaXN0X05pbCgpKTsgICAgCiAgICBmb3IgKFNjYW4gPSBSaWdodENsYXVzZXM7ICFsaXN0X0VtcHR5KFNjYW4pOyBTY2FuID0gbGlzdF9DZHIoU2NhbikpIHsKICAgICAgaWYgKGNsYXVzZV9OdW1iZXIobGlzdF9DYXIoU2NhbikpID09IDApIHsKCS8qIEZvdW5kIHRoZSByaWdodCBjbGF1c2UsIHRoZSBuZWdhdGlvbiBjbGF1c2VzIGhhdmUgbnVtYmVyIC0xLiAqLwojaWZkZWYgQ0hFQ0sKCWlmICgqU3BsaXRDbGF1c2UgIT0gTlVMTCkgewoJICBtaXNjX1N0YXJ0RXJyb3JSZXBvcnQoKTsKCSAgbWlzY19FcnJvclJlcG9ydCgiXG4gSW4gc3BsaXRfQmFja3RyYWNrOiIpOwoJICBtaXNjX0Vycm9yUmVwb3J0KCIgRm91bmQgdHdvIGJsb2NrZWQgY2xhdXNlcyAiKTsKCSAgbWlzY19FcnJvclJlcG9ydCgiXG4gd2l0aCBjbGF1c2UgbnVtYmVyIDAgKHRoaXMgbWFya3MgdGhlIGNsYXVzZSAiKTsKCSAgbWlzY19FcnJvclJlcG9ydCgiXG4gZm9yIHRoZSByaWdodCBicmFuY2ggb2YgdGhlIHRhYmxlYXUpLiIpOwoJICBtaXNjX0ZpbmlzaEVycm9yUmVwb3J0KCk7Cgl9CiNlbmRpZgoJKlNwbGl0Q2xhdXNlID0gbGlzdF9DYXIoU2Nhbik7CiAgICAgIH0KICAgICAgCiAgICAgIGNsYXVzZV9OZXdOdW1iZXIoKENMQVVTRSkgbGlzdF9DYXIoU2NhbikpOwogICAgICBjbGF1c2VfQWRkUGFyZW50Q2xhdXNlKChDTEFVU0UpIGxpc3RfQ2FyKFNjYW4pLCBjbGF1c2VfTnVtYmVyKEVtcHR5Q2xhdXNlKSk7CiAgICAgIGNsYXVzZV9BZGRQYXJlbnRMaXRlcmFsKChDTEFVU0UpIGxpc3RfQ2FyKFNjYW4pLCAwKTsgIC8qIGR1bW15IGxpdGVyYWwgKi8KICAgIH0KCiNpZmRlZiBDSEVDSwogICAgaWYgKCpTcGxpdENsYXVzZSA9PSBOVUxMKSB7CiAgICAgIG1pc2NfU3RhcnRFcnJvclJlcG9ydCgpOwogICAgICBtaXNjX0Vycm9yUmVwb3J0KCJcbiBJbiBzcGxpdF9CYWNrdHJhY2s6IERpZG60dCBmaW5kIGEgYmxvY2tlZCBjbGF1c2UiKTsKICAgICAgbWlzY19FcnJvclJlcG9ydCgiXG4gd2l0aCBjbGF1c2UgbnVtYmVyIDAuICh0aGlzIG1hcmtzIHRoZSBjbGF1c2UgIik7CiAgICAgIG1pc2NfRXJyb3JSZXBvcnQoIlxuIGZvciB0aGUgcmlnaHQgYnJhbmNoIG9mIHRoZSB0YWJsZWF1KS4iKTsKICAgICAgbWlzY19GaW5pc2hFcnJvclJlcG9ydCgpOwogICAgfQojZW5kaWYKICAgIAogICAgUmVjb3Zlckxpc3QgPSBsaXN0X05jb25jKFJpZ2h0Q2xhdXNlcywgUmVjb3Zlckxpc3QpOwoKICAgIC8qIFRoZW4sIGRlbGV0ZSBjbGF1c2VzIGZyb20gY3VycmVudCBsZXZlbCAoSGFjaykgKi8KICAgIHByZnNfRGVjVmFsaWRMZXZlbChQUyk7CiAgICBwcmZzX01vdmVJbnZhbGlkQ2xhdXNlc0RvY1Byb29mKFBTKTsKICAgIHNwbGl0X0RlbGV0ZUludmFsaWRDbGF1c2VzRnJvbVN0YWNrKFBTKTsKICAgIHByZnNfSW5jVmFsaWRMZXZlbChQUyk7CiAgfSBlbHNlIHsKICAgIC8qIERvbid0IGRlbGV0ZSBjbGF1c2VzIGZyb20gY3VycmVudCBsZXZlbCAoc3BsaXQgaXMgdG9wIGxldmVsKSAqLwogICAgcHJmc19Nb3ZlSW52YWxpZENsYXVzZXNEb2NQcm9vZihQUyk7CiAgICBmb3IgKFNjYW4gPSBSZWNvdmVyTGlzdDsgIWxpc3RfRW1wdHkoU2Nhbik7IFNjYW4gPSBsaXN0X0NkcihTY2FuKSkKICAgICAgcHJmc19JbnNlcnREb2NQcm9vZkNsYXVzZShQUywgbGlzdF9DYXIoU2NhbikpOwogICAgbGlzdF9EZWxldGUoUmVjb3Zlckxpc3QpOwogICAgUmVjb3Zlckxpc3QgPSBsaXN0X05pbCgpOwogIH0KICBwcmZzX1NldExhc3RCYWNrdHJhY2tMZXZlbChQUywgcHJmc19WYWxpZExldmVsKFBTKSk7CgogIHJldHVybiBSZWNvdmVyTGlzdDsKfQoKCnN0YXRpYyBMSVNUIHNwbGl0X0RlbGV0ZUNsYXVzZXNEZXBlbmRpbmdPbkxldmVsRnJvbUxpc3QoUFJPT0ZTRUFSQ0ggU2VhcmNoLAoJCQkJCQkJTElTVCBDbGF1c2VMaXN0LAoJCQkJCQkJaW50IExldmVsLCBMSVNUKiBOZXcpCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogIElOUFVUOiAgIEEgcHJvb2Ygc2VhcmNoIG9iamVjdCwgYSBsaXN0IG9mIHVuc2hhcmVkIGNsYXVzZXMKICAgICAgICAgICBhbmQgYSBzcGxpdCBsZXZlbC4KICBFRkZFQ1Q6ICBEZWxldGVzIGFsbCBjbGF1c2VzIGRlcGVuZGluZyBvbiBzcGxpdCBsZXZlbCBmcm9tCiAgICAgICAgICAgPENsYXVzZUxpc3Q+LgogICAgICAgICAgIEFsbCBzcGxpdCBzdG9yZWQgZGVsZXRlZCBjbGF1c2VzIGZyb20gdGhlIGxldmVsIG9mCiAgICAgICAgICAgdGhlIGRlbGV0ZWQgY2xhdXNlcyBmcm9tIDxDbGF1c2VMaXN0PiBhcmUgc3RvcmVkIGluCiAgICAgICAgICAgPCpOZXc+LgogIFJFVFVSTlM6IFRoZSB1cGRhdGVkIGxpc3QgYW5kIHRoZSByZWNvdmVyIGNsYXVzZXMgaW4gPCpOZXc+LgoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCnsKICBMSVNUICAgU2NhbjsKICBDTEFVU0UgQ2xhdXNlOwogIFNQTElUICBSZWluc2VydDsKCiAgZm9yIChTY2FuID0gQ2xhdXNlTGlzdDsgIWxpc3RfRW1wdHkoU2Nhbik7IFNjYW4gPSBsaXN0X0NkcihTY2FuKSkgewogICAgQ2xhdXNlID0gbGlzdF9DYXIoU2Nhbik7ICAgCiAgICBpZiAoY2xhdXNlX0RlcGVuZHNPblNwbGl0TGV2ZWwoQ2xhdXNlLCBMZXZlbCkpIHsKICAgICAgUmVpbnNlcnQgPSBwcmZzX0dldFNwbGl0T2ZMZXZlbChjbGF1c2VfU3BsaXRMZXZlbChDbGF1c2UpLCBTZWFyY2gpOwogICAgICBpZiAocHJmc19TcGxpdERlbGV0ZWRDbGF1c2VzKFJlaW5zZXJ0KSAhPSBsaXN0X05pbCgpKSB7CgkqTmV3ID0gbGlzdF9OY29uYyhwcmZzX1NwbGl0RGVsZXRlZENsYXVzZXMoUmVpbnNlcnQpLCAqTmV3KTsKCXByZnNfU3BsaXRTZXREZWxldGVkQ2xhdXNlcyhSZWluc2VydCwgbGlzdF9OaWwoKSk7CiAgICAgIH0KICAgICAgcHJmc19JbnNlcnREb2NQcm9vZkNsYXVzZShTZWFyY2gsQ2xhdXNlKTsKICAgICAgbGlzdF9ScGxhY2EoU2NhbiwgTlVMTCk7CiAgICB9CiAgfQogIHJldHVybiBsaXN0X1BvaW50ZXJEZWxldGVFbGVtZW50KENsYXVzZUxpc3QsIE5VTEwpOwp9CiAKCnN0YXRpYyBMSVNUIHNwbGl0X0RlbGV0ZUNsYXVzZXNEZXBlbmRpbmdPbkxldmVsRnJvbVNldChQUk9PRlNFQVJDSCBQUywKCQkJCQkJICAgICAgIExJU1QgQ2xhdXNlTGlzdCwKCQkJCQkJICAgICAgIGludCBTcGxpdExldmVsKQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICBJTlBVVDogICBBIFBST09GU0VBUkNIIG9iamVjdCwgYSBsaXN0IG9mIHNoYXJlZCBjbGF1c2VzCiAgICAgICAgICAgYW5kIGEgc3BsaXQgbGV2ZWwuCiAgUkVUVVJOUzogQSBsaXN0IG9mIGNsYXVzZXMgdGhhdCBoYXZlIHRvIGJlIHJlY292ZXJlZCBwb3NzaWJseS4KICBFRkZFQ1Q6ICBDbGF1c2VzIGZyb20gdGhlIGNsYXVzZSBsaXN0IGRlcGVuZGluZyBvbiA8U3BsaXRMZXZlbD4KICAgICAgICAgICBhcmUgbW92ZWQgdG8gdGhlIGRvYyBwcm9vZiBpbmRleCBvZiA8UFM+LgogICAgICAgICAgIEFsbCBmb3JtZXJseSByZWR1bmRhbnQgY2xhdXNlcyB0aGF0IHdlcmUgcmVkdWNlZCBieSBhIGNsYXVzZQogICAgICAgICAgIG9mIHRoZSBzYW1lIHNwbGl0IGxldmVsIGFzIGEgY2xhdXNlIGZyb20gdGhlIGxpc3QgZGVwZW5kaW5nCiAgICAgICAgICAgb24gPFNwbGl0TGV2ZWw+IGFyZSByZXR1cm5lZC4KKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwp7CiAgTElTVCAgIHNjYW4sIGRlbExpc3QsIHJlY292ZXI7CiAgQ0xBVVNFIGNsYXVzZTsKICBTUExJVCAgcmVpbnNlcnQ7CgogIGRlbExpc3QgPSByZWNvdmVyID0gbGlzdF9OaWwoKTsKCiAgZm9yIChzY2FuID0gQ2xhdXNlTGlzdDsgIWxpc3RfRW1wdHkoc2Nhbik7IHNjYW4gPSBsaXN0X0NkcihzY2FuKSl7CiAgICBjbGF1c2UgPSBsaXN0X0NhcihzY2FuKTsKICAgIGlmIChjbGF1c2VfRGVwZW5kc09uU3BsaXRMZXZlbChjbGF1c2UsIFNwbGl0TGV2ZWwpKSB7CiAgICAgIHJlaW5zZXJ0ID0gcHJmc19HZXRTcGxpdE9mTGV2ZWwoY2xhdXNlX1NwbGl0TGV2ZWwoY2xhdXNlKSwgUFMpOwogICAgICByZWNvdmVyID0gbGlzdF9OY29uYyhwcmZzX1NwbGl0RGVsZXRlZENsYXVzZXMocmVpbnNlcnQpLCByZWNvdmVyKTsKICAgICAgcHJmc19TcGxpdFNldERlbGV0ZWRDbGF1c2VzKHJlaW5zZXJ0LCBsaXN0X05pbCgpKTsKICAgICAgZGVsTGlzdCA9IGxpc3RfQ29ucyhjbGF1c2UsIGRlbExpc3QpOwogICAgfQogIH0KCiAgLyogV0FSTklORzogVGhlIGZvbGxvd2luZyBtb3ZlIG9wZXJhdGlvbnMgY2hhbmdlIHRoZSB3b3JrZWQgb2ZmICovCiAgLyogYW5kIHVzYWJsZSBzZXRzIG9mIHRoZSBwcm9vZiBzZWFyY2ggb2JqZWN0IGRlc3RydWN0aXZlbHkuICAgICovCiAgLyogU28gaXQncyBpbXBvc3NpYmxlIHRvIG1vdmUgdGhvc2UgZnVuY3Rpb24gY2FsbHMgaW50byB0aGUgICAgICovCiAgLyogbG9vcCBhYm92ZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAgZm9yICggOyAhbGlzdF9FbXB0eShkZWxMaXN0KTsgZGVsTGlzdCA9IGxpc3RfUG9wKGRlbExpc3QpKSB7CiAgICBjbGF1c2UgPSBsaXN0X0NhcihkZWxMaXN0KTsKICAgIGlmIChjbGF1c2VfR2V0RmxhZyhjbGF1c2UsIFdPUktFRE9GRikpCiAgICAgIHByZnNfTW92ZVdvcmtlZE9mZkRvY1Byb29mKFBTLCBjbGF1c2UpOwogICAgZWxzZQogICAgICBwcmZzX01vdmVVc2FibGVEb2NQcm9vZihQUywgY2xhdXNlKTsKICB9CiAgcmV0dXJuIHJlY292ZXI7Cn0KCgoKc3RhdGljIExJU1Qgc3BsaXRfRGVsZXRlSW52YWxpZENsYXVzZXNGcm9tTGlzdChQUk9PRlNFQVJDSCBTZWFyY2gsIGludCBMZXZlbCwKCQkJCQkgICAgICAgTElTVCBDbGF1c2VMaXN0KQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICBJTlBVVDogICBBIHByb29mIHNlYXJjaCBvYmplY3QsIGEgc3BsaXQgbGV2ZWwgYW5kIGEgbGlzdCBvZiBjbGF1c2VzLgogIFJFVFVSTlM6IFRoZSBsaXN0IHdoZXJlIGludmFsaWQgY2xhdXNlcyB3cnQgJ0xldmVsJyBhcmUgZGVsZXRlZC4KICBFRkZFQ1Q6ICBUaGUgaW52YWxpZCBjbGF1c2VzIGFyZSBzdG9yZWQgaW4gdGhlIGRvYyBwcm9vZiBpbmRleAogICAgICAgICAgIG9mIHRoZSBwcm9vZiBzZWFyY2ggb2JqZWN0IGlmIG5lY2Vzc2FyeS4KKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwp7CiAgTElTVCAgIFNjYW47CiAgQ0xBVVNFIENsYXVzZTsKCiAgLypwcmludGYoIlxuRGllc2UgTGlzdGUgc29sbCB2b24gdW5ndWVsdGlnZW4gKExldmVsID4gJWQpICIKICAgICJiZWZyZWl0IHdlcmRlbjogXG4iLExldmVsKTtmZmx1c2goc3Rkb3V0KTsKICAgIGNsYXVzZV9MaXN0UHJpbnQoQ2xhdXNlTGlzdCk7Ki8KCiAgZm9yIChTY2FuID0gQ2xhdXNlTGlzdDsgIWxpc3RfRW1wdHkoU2Nhbik7IFNjYW4gPSBsaXN0X0NkcihTY2FuKSkgewogICAgQ2xhdXNlID0gbGlzdF9DYXIoU2Nhbik7CiAgICBpZiAoIXByZnNfSXNDbGF1c2VWYWxpZChDbGF1c2UsTGV2ZWwpKSB7CiAgICAgIHByZnNfSW5zZXJ0RG9jUHJvb2ZDbGF1c2UoU2VhcmNoLENsYXVzZSk7CiAgICAgIGxpc3RfUnBsYWNhKFNjYW4sIE5VTEwpOwogICAgfQogIH0KICByZXR1cm4gbGlzdF9Qb2ludGVyRGVsZXRlRWxlbWVudChDbGF1c2VMaXN0LCBOVUxMKTsKfQoKc3RhdGljIHZvaWQgc3BsaXRfRGVsZXRlSW52YWxpZENsYXVzZXNGcm9tU3RhY2soUFJPT0ZTRUFSQ0ggU2VhcmNoKQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICBJTlBVVDogICBBIHByb29mIHNlYXJjaCBvYmplY3QuICAgICAgICAgICAgCiAgRUZGRUNUOiAgQWxsIGNsYXVzZXMgaW4gdGhlIHNwbGl0IHN0YWNrIG9mIDxTZWFyY2g+IHRoYXQgaGF2ZSBhIGhpZ2hlcgogICAgICAgICAgIHNwbGl0IGxldmVsIHRoYW4gdGhlIGN1cnJlbnQgPFNlYXJjaD4gc3BsaXQgbGV2ZWwgYXJlIGRlbGV0ZWQuCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KewogIExJU1QgICBTY2FuMSxTY2FuMixDbGF1c2VMaXN0OwogIGludCAgICBMZXZlbDsKICBDTEFVU0UgQ2xhdXNlOwoKICBMZXZlbCA9IHByZnNfVmFsaWRMZXZlbChTZWFyY2gpOwoKICBmb3IgKFNjYW4xPXByZnNfU3BsaXRTdGFjayhTZWFyY2gpOyFsaXN0X0VtcHR5KFNjYW4xKTtTY2FuMT1saXN0X0NkcihTY2FuMSkpIHsKICAgIENsYXVzZUxpc3QgPSBwcmZzX1NwbGl0RGVsZXRlZENsYXVzZXMobGlzdF9DYXIoU2NhbjEpKTsKICAgIGZvciAoU2NhbjIgPSBDbGF1c2VMaXN0OyAhbGlzdF9FbXB0eShTY2FuMik7IFNjYW4yID0gbGlzdF9DZHIoU2NhbjIpKSB7CiAgICAgIENsYXVzZSA9IChDTEFVU0UpbGlzdF9DYXIoU2NhbjIpOwogICAgICBpZiAoIXByZnNfSXNDbGF1c2VWYWxpZChDbGF1c2UsTGV2ZWwpKSB7CglwcmZzX0luc2VydERvY1Byb29mQ2xhdXNlKFNlYXJjaCxDbGF1c2UpOwoJbGlzdF9ScGxhY2EoU2NhbjIsIE5VTEwpOwogICAgICB9CiAgICB9CiAgICBwcmZzX1NwbGl0U2V0RGVsZXRlZENsYXVzZXMobGlzdF9DYXIoU2NhbjEpLGxpc3RfUG9pbnRlckRlbGV0ZUVsZW1lbnQoQ2xhdXNlTGlzdCwgTlVMTCkpOwogIH0KfQoKCnN0YXRpYyBMSVNUIHNwbGl0X1JlbW92ZVVubmVjZXNzYXJ5U3BsaXRzKFBST09GU0VBUkNIIFBTLCBDTEFVU0UgRW1wdHlDbGF1c2UpCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogIElOUFVUOiAgIEFuIGVtcHR5IGNsYXVzZSBhbmQgYSBwcm9vZiBzZWFyY2ggb2JqZWN0CiAgRUZGRUNUOiAgUmVtb3ZlcyBhbGwgc3BsaXRzIHVwIHRvIHRoZSBsYXN0IGJhY2t0cmFjayBsZXZlbAogICAgICAgICAgIHRoYXQgd2VyZSBub3QgbmVjZXNzYXJ5IHRvIGRlcml2ZSB0aGUgZW1wdHkgY2xhdXNlLgogIFJFVFVSTlM6IEEgbGlzdCBvZiByZWNvdmVyZWQgY2xhdXNlcy4KKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwp7CiAgTElTVCBTY2FuOwogIExJU1QgUmVjb3ZlciwgTmV3OwogIExJU1QgRGVsZXRlZDsKICBMSVNUIFNjYW5TdGFjazsKCiAgaW50IFNwbGl0TGV2ZWw7CiAgaW50IExhc3RCYWNrdHJhY2tMZXZlbDsKICBTUExJVCBTcGxpdCxTY2FuU3BsaXQ7CgogIFNjYW4gICAgICAgICAgICAgICA9IHByZnNfU3BsaXRTdGFjayhQUyk7CiAgU3BsaXRMZXZlbCAgICAgICAgID0gcHJmc19WYWxpZExldmVsKFBTKTsKICBMYXN0QmFja3RyYWNrTGV2ZWwgPSBwcmZzX0xhc3RCYWNrdHJhY2tMZXZlbChQUyk7CiAgUmVjb3ZlciAgICAgICAgICAgID0gbGlzdF9OaWwoKTsKCiAgd2hpbGUgKFNwbGl0TGV2ZWwgPiBMYXN0QmFja3RyYWNrTGV2ZWwpIHsKICAgIGlmIChwcmZzX1NwbGl0SXNVbnVzZWQobGlzdF9DYXIoU2NhbikpICYmCgkhY2xhdXNlX0RlcGVuZHNPblNwbGl0TGV2ZWwoRW1wdHlDbGF1c2UsIFNwbGl0TGV2ZWwpKSB7CiAgICAgIE5ldyAgID0gbGlzdF9OaWwoKTsKICAgICAgU3BsaXQgPSBsaXN0X0NhcihTY2FuKTsKCiAgICAgIC8qcHJpbnRmKCJcblx0IFJlbW92ZWQ6ICVkIixwcmZzX1NwbGl0U3BsaXRMZXZlbChTcGxpdCkpOyovCiAgICAgIAogICAgICBjbGF1c2VfRGVsZXRlQ2xhdXNlTGlzdChwcmZzX1NwbGl0QmxvY2tlZENsYXVzZXMoU3BsaXQpKTsKICAgICAgcHJmc19TcGxpdFNldEJsb2NrZWRDbGF1c2VzKFNwbGl0LCBsaXN0X05pbCgpKTsKICAgICAgCiAgICAgIFJlY292ZXIgPSBsaXN0X05jb25jKHByZnNfU3BsaXREZWxldGVkQ2xhdXNlcyhTcGxpdCksIFJlY292ZXIpOwogICAgICBwcmZzX1NwbGl0U2V0RGVsZXRlZENsYXVzZXMoU3BsaXQsIGxpc3RfTmlsKCkpOwogICAgICAKICAgICAgaWYgKHByZnNfU3BsaXRGYXRoZXJDbGF1c2UoU3BsaXQpICE9IChDTEFVU0UpTlVMTCkgewoJUmVjb3ZlciA9IGxpc3RfQ29ucyhwcmZzX1NwbGl0RmF0aGVyQ2xhdXNlKFNwbGl0KSxSZWNvdmVyKTsKCXByZnNfU3BsaXRTZXRGYXRoZXJDbGF1c2UoU3BsaXQsTlVMTCk7CiAgICAgIH0KICAgICAgUmVjb3ZlciA9IHNwbGl0X0RlbGV0ZUNsYXVzZXNEZXBlbmRpbmdPbkxldmVsRnJvbUxpc3QoUFMsIFJlY292ZXIsIFNwbGl0TGV2ZWwsICZOZXcpOwogICAgICAKICAgICAgU2NhblN0YWNrID0gcHJmc19TcGxpdFN0YWNrKFBTKTsKICAgICAgd2hpbGUgKCFsaXN0X1N0YWNrRW1wdHkoU2NhblN0YWNrKSAmJiAgCgkgICAgIHByZnNfU3BsaXRTcGxpdExldmVsKChTY2FuU3BsaXQgPSAoU1BMSVQpbGlzdF9DYXIoU2NhblN0YWNrKSkpID4gTGFzdEJhY2t0cmFja0xldmVsKSB7CglEZWxldGVkID0gcHJmc19TcGxpdERlbGV0ZWRDbGF1c2VzKFNjYW5TcGxpdCk7CglwcmZzX1NwbGl0U2V0RGVsZXRlZENsYXVzZXMoU2NhblNwbGl0LCBsaXN0X05pbCgpKTsgLyogSU1QT1JUQU5UISwgc2VlIG5leHQgbGluZSAqLwoJRGVsZXRlZCA9IHNwbGl0X0RlbGV0ZUNsYXVzZXNEZXBlbmRpbmdPbkxldmVsRnJvbUxpc3QoUFMsIERlbGV0ZWQsIFNwbGl0TGV2ZWwsICZOZXcpOwoJcHJmc19TcGxpdFNldERlbGV0ZWRDbGF1c2VzKFNjYW5TcGxpdCwgRGVsZXRlZCk7CglTY2FuU3RhY2sgPSBsaXN0X0NkcihTY2FuU3RhY2spOwogICAgICB9CiAgICAgIAogICAgICB3aGlsZSAoIWxpc3RfRW1wdHkoTmV3KSkgewoJRGVsZXRlZCA9IGxpc3RfTmlsKCk7CglSZWNvdmVyID0gbGlzdF9OY29uYyhzcGxpdF9EZWxldGVDbGF1c2VzRGVwZW5kaW5nT25MZXZlbEZyb21MaXN0KFBTLCBOZXcsIFNwbGl0TGV2ZWwsICZEZWxldGVkKSwKCQkJICAgICBSZWNvdmVyKTsKCU5ldyAgICAgPSBEZWxldGVkOwogICAgICB9CiAgICAgIFJlY292ZXIgPSBsaXN0X05jb25jKFJlY292ZXIsIAoJCSAgICBzcGxpdF9EZWxldGVDbGF1c2VzRGVwZW5kaW5nT25MZXZlbEZyb21TZXQoUFMsIHByZnNfVXNhYmxlQ2xhdXNlcyhQUyksIFNwbGl0TGV2ZWwpKTsKICAgICAgUmVjb3ZlciA9IGxpc3RfTmNvbmMoUmVjb3ZlciwKCQkJICAgc3BsaXRfRGVsZXRlQ2xhdXNlc0RlcGVuZGluZ09uTGV2ZWxGcm9tU2V0KFBTLCBwcmZzX1dvcmtlZE9mZkNsYXVzZXMoUFMpLCBTcGxpdExldmVsKSk7CiAgICAgIAogICAgICBwcmZzX1NwbGl0U2V0VXNlZChTcGxpdCk7CiAgICB9CiAgICAKICAgIFNwbGl0TGV2ZWwtLTsKICAgIFNjYW4gPSBsaXN0X0NkcihTY2FuKTsKICB9CiAgcmV0dXJuIFJlY292ZXI7Cn0KCgp2b2lkIHNwbGl0X0RlbGV0ZUNsYXVzZUF0TGV2ZWwoUFJPT0ZTRUFSQ0ggUFMsIENMQVVTRSBDbGF1c2UsIGludCBMZXZlbCkKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgSU5QVVQ6ICAgQSBjbGF1c2UsIGEgbGV2ZWwgYW5kIGEgcHJvb2ZzZWFyY2ggb2JqZWN0CiAgUkVUVVJOUzogTm90aGluZy4KICBFRkZFQ1Q6ICA8Q2xhdXNlPiBpcyBkZWxldGVkIGZyb20gdGhlIHVzYWJsZSBvciB3b3JrZWQgb2ZmIHNldAogICAgICAgICAgIGFuZCBtYWRlIHVuc2hhcmVkLgoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCnsKICBpZiAoY2xhdXNlX0dldEZsYWcoQ2xhdXNlLFdPUktFRE9GRikpIAogICAgcHJmc19FeHRyYWN0V29ya2VkT2ZmKFBTLCBDbGF1c2UpOwogIGVsc2UgCiAgICBwcmZzX0V4dHJhY3RVc2FibGUoUFMsIENsYXVzZSk7CgogIHNwbGl0X0tlZXBDbGF1c2VBdExldmVsKFBTLCBDbGF1c2UsIExldmVsKTsKfQoKCnZvaWQgc3BsaXRfS2VlcENsYXVzZUF0TGV2ZWwoUFJPT0ZTRUFSQ0ggUFMsIENMQVVTRSBDbGF1c2UsIGludCBMZXZlbCkKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgSU5QVVQ6ICAgQSBjbGF1c2UgYW5kIGEgbGV2ZWwgYXMgaW50LgogIFJFVFVSTlM6IE5vbmUuCiAgTUVNT1JZOiAgQSBjb3B5IG9mIGNsYXVzZSBpcyBtYWRlIGFuZCBrZXB0IHdpdGhpbiB0aGUgc3BsaXQgc3RhY2suCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KewogIFNQTElUICBTcGxpdDsKCiAgU3BsaXQgPSBwcmZzX0dldFNwbGl0T2ZMZXZlbChMZXZlbCwgUFMpOwogIHByZnNfU3BsaXRTZXREZWxldGVkQ2xhdXNlcyhTcGxpdCxsaXN0X0NvbnMoQ2xhdXNlLCBwcmZzX1NwbGl0RGVsZXRlZENsYXVzZXMoU3BsaXQpKSk7Cn0KCgpMSVNUIHNwbGl0X0V4dHJhY3RFbXB0eUNsYXVzZXMoTElTVCBDbGF1c2VzLCBMSVNUKiBFbXB0eUNsYXVzZXMpCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogIElOUFVUOiAgIEEgbGlzdCBvZiBjbGF1c2VzIGFuZCBhIHBvaW50ZXIgdG8gYSBsaXN0IG9mIGVtcHR5IGNsYXVzZXMuCiAgUkVUVVJOUzogPENsYXVzZXM+IHdpdGhvdXQgYWxsIGVtcHR5IGNsYXVzZXMgd2hlcmUgdGhlIGVtcHR5IGNsYXVzZXMKICAgICAgICAgICBhcmUgbW92ZWQgdG8gPEVtcHR5Q2xhdXNlcz4KICBNRU1PUlk6ICBEZXN0cnVjdGl2ZSBvbiA8Q2xhdXNlcz4uCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KewogIExJU1QgICBTY2FuOwogIENMQVVTRSBDbGF1c2U7CgogIGZvciAoU2Nhbj1DbGF1c2VzOyFsaXN0X0VtcHR5KFNjYW4pO1NjYW49bGlzdF9DZHIoU2NhbikpIHsKICAgIENsYXVzZSA9IChDTEFVU0UpbGlzdF9DYXIoU2Nhbik7CiAgICBpZiAoY2xhdXNlX0lzRW1wdHlDbGF1c2UoQ2xhdXNlKSkgewogICAgICAqRW1wdHlDbGF1c2VzID0gbGlzdF9Db25zKENsYXVzZSwqRW1wdHlDbGF1c2VzKTsKICAgICAgbGlzdF9ScGxhY2EoU2NhbixOVUxMKTsKICAgIH0KICB9CiAgQ2xhdXNlcyA9IGxpc3RfUG9pbnRlckRlbGV0ZUVsZW1lbnQoQ2xhdXNlcyxOVUxMKTsKCiAgcmV0dXJuIENsYXVzZXM7Cn0KCkNMQVVTRSBzcGxpdF9TbWFsbGVzdFNwbGl0TGV2ZWxDbGF1c2UoTElTVCBDbGF1c2VzKQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICBJTlBVVDogICBBIG5vbi1lbXB0eSBsaXN0IG9mIGNsYXVzZXMuCiAgUkVUVVJOUzogVGhlIGNsYXVzZSB3aXRoIHRoZSBzbWFsbGVzdCBzcGxpdCBsZXZlbC4KKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwp7CiAgQ0xBVVNFIFJlc3VsdDsKCiAgUmVzdWx0ICA9IChDTEFVU0UpbGlzdF9DYXIoQ2xhdXNlcyk7CiAgQ2xhdXNlcyA9IGxpc3RfQ2RyKENsYXVzZXMpOwogIAogIHdoaWxlICghbGlzdF9FbXB0eShDbGF1c2VzKSkgewogICAgaWYgKGNsYXVzZV9TcGxpdExldmVsKFJlc3VsdCkgPiBjbGF1c2VfU3BsaXRMZXZlbChsaXN0X0NhcihDbGF1c2VzKSkpCiAgICAgIFJlc3VsdCAgPSBsaXN0X0NhcihDbGF1c2VzKTsKICAgIENsYXVzZXMgPSBsaXN0X0NkcihDbGF1c2VzKTsKICB9CgogIHJldHVybiBSZXN1bHQ7Cn0K