LyoKCUZpbGU6CQlMb2dpbkl0ZW1zQUVUZXN0LmMKCglDb250YWluczoJVGVzdCBwcm9ncmFtIGZvciBMb2dpbkl0ZW1zQUUgbW9kdWxlLgoKCUNvcHlyaWdodDoJQ29weXJpZ2h0IKkgMjAwNSBieSBBcHBsZSBDb21wdXRlciwgSW5jLiwgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KCglEaXNjbGFpbWVyOglJTVBPUlRBTlQ6ICBUaGlzIEFwcGxlIHNvZnR3YXJlIGlzIHN1cHBsaWVkIHRvIHlvdSBieSBBcHBsZSBDb21wdXRlciwgSW5jLgoJCQkJKCJBcHBsZSIpIGluIGNvbnNpZGVyYXRpb24gb2YgeW91ciBhZ3JlZW1lbnQgdG8gdGhlIGZvbGxvd2luZyB0ZXJtcywgYW5kIHlvdXIKCQkJCXVzZSwgaW5zdGFsbGF0aW9uLCBtb2RpZmljYXRpb24gb3IgcmVkaXN0cmlidXRpb24gb2YgdGhpcyBBcHBsZSBzb2Z0d2FyZQoJCQkJY29uc3RpdHV0ZXMgYWNjZXB0YW5jZSBvZiB0aGVzZSB0ZXJtcy4gIElmIHlvdSBkbyBub3QgYWdyZWUgd2l0aCB0aGVzZSB0ZXJtcywKCQkJCXBsZWFzZSBkbyBub3QgdXNlLCBpbnN0YWxsLCBtb2RpZnkgb3IgcmVkaXN0cmlidXRlIHRoaXMgQXBwbGUgc29mdHdhcmUuCgoJCQkJSW4gY29uc2lkZXJhdGlvbiBvZiB5b3VyIGFncmVlbWVudCB0byBhYmlkZSBieSB0aGUgZm9sbG93aW5nIHRlcm1zLCBhbmQgc3ViamVjdAoJCQkJdG8gdGhlc2UgdGVybXMsIEFwcGxlIGdyYW50cyB5b3UgYSBwZXJzb25hbCwgbm9uLWV4Y2x1c2l2ZSBsaWNlbnNlLCB1bmRlciBBcHBsZdVzCgkJCQljb3B5cmlnaHRzIGluIHRoaXMgb3JpZ2luYWwgQXBwbGUgc29mdHdhcmUgKHRoZSAiQXBwbGUgU29mdHdhcmUiKSwgdG8gdXNlLAoJCQkJcmVwcm9kdWNlLCBtb2RpZnkgYW5kIHJlZGlzdHJpYnV0ZSB0aGUgQXBwbGUgU29mdHdhcmUsIHdpdGggb3Igd2l0aG91dAoJCQkJbW9kaWZpY2F0aW9ucywgaW4gc291cmNlIGFuZC9vciBiaW5hcnkgZm9ybXM7IHByb3ZpZGVkIHRoYXQgaWYgeW91IHJlZGlzdHJpYnV0ZQoJCQkJdGhlIEFwcGxlIFNvZnR3YXJlIGluIGl0cyBlbnRpcmV0eSBhbmQgd2l0aG91dCBtb2RpZmljYXRpb25zLCB5b3UgbXVzdCByZXRhaW4KCQkJCXRoaXMgbm90aWNlIGFuZCB0aGUgZm9sbG93aW5nIHRleHQgYW5kIGRpc2NsYWltZXJzIGluIGFsbCBzdWNoIHJlZGlzdHJpYnV0aW9ucyBvZgoJCQkJdGhlIEFwcGxlIFNvZnR3YXJlLiAgTmVpdGhlciB0aGUgbmFtZSwgdHJhZGVtYXJrcywgc2VydmljZSBtYXJrcyBvciBsb2dvcyBvZgoJCQkJQXBwbGUgQ29tcHV0ZXIsIEluYy4gbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGUKCQkJCUFwcGxlIFNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uIGZyb20gQXBwbGUuICBFeGNlcHQgYXMKCQkJCWV4cHJlc3NseSBzdGF0ZWQgaW4gdGhpcyBub3RpY2UsIG5vIG90aGVyIHJpZ2h0cyBvciBsaWNlbnNlcywgZXhwcmVzcyBvciBpbXBsaWVkLAoJCQkJYXJlIGdyYW50ZWQgYnkgQXBwbGUgaGVyZWluLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIGFueSBwYXRlbnQgcmlnaHRzIHRoYXQKCQkJCW1heSBiZSBpbmZyaW5nZWQgYnkgeW91ciBkZXJpdmF0aXZlIHdvcmtzIG9yIGJ5IG90aGVyIHdvcmtzIGluIHdoaWNoIHRoZSBBcHBsZQoJCQkJU29mdHdhcmUgbWF5IGJlIGluY29ycG9yYXRlZC4KCgkJCQlUaGUgQXBwbGUgU29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgQXBwbGUgb24gYW4gIkFTIElTIiBiYXNpcy4gIEFQUExFIE1BS0VTIE5PCgkJCQlXQVJSQU5USUVTLCBFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBXSVRIT1VUIExJTUlUQVRJT04gVEhFIElNUExJRUQKCQkJCVdBUlJBTlRJRVMgT0YgTk9OLUlORlJJTkdFTUVOVCwgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKCQkJCVBVUlBPU0UsIFJFR0FSRElORyBUSEUgQVBQTEUgU09GVFdBUkUgT1IgSVRTIFVTRSBBTkQgT1BFUkFUSU9OIEFMT05FIE9SIElOCgkJCQlDT01CSU5BVElPTiBXSVRIIFlPVVIgUFJPRFVDVFMuCgoJCQkJSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgQkUgTElBQkxFIEZPUiBBTlkgU1BFQ0lBTCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwgT1IKCQkJCUNPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUKCQkJCUdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQoJCQkJQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFLCBSRVBST0RVQ1RJT04sIE1PRElGSUNBVElPTiBBTkQvT1IgRElTVFJJQlVUSU9OCgkJCQlPRiBUSEUgQVBQTEUgU09GVFdBUkUsIEhPV0VWRVIgQ0FVU0VEIEFORCBXSEVUSEVSIFVOREVSIFRIRU9SWSBPRiBDT05UUkFDVCwgVE9SVAoJCQkJKElOQ0xVRElORyBORUdMSUdFTkNFKSwgU1RSSUNUIExJQUJJTElUWSBPUiBPVEhFUldJU0UsIEVWRU4gSUYgQVBQTEUgSEFTIEJFRU4KCQkJCUFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgoKCUNoYW5nZSBIaXN0b3J5IChtb3N0IHJlY2VudCBmaXJzdCk6CgokTG9nOiBMb2dpbkl0ZW1zQUVUZXN0LmMsdiAkClJldmlzaW9uIDEuMSAgMjAwNS8wOS8yNyAxMjoyOTozMiAgICAgICAgIApGaXJzdCBjaGVja2VkIGluLgoKCiovCgovLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwoKLy8gU3lzdGVtIGludGVyZmFjZXMKCiNpbmNsdWRlIDxDYXJib24vQ2FyYm9uLmg+CgojaW5jbHVkZSA8YXNzZXJ0Lmg+CiNpbmNsdWRlIDxzdGRpby5oPgoKLy8gUHJvamVjdCBpbnRlcmZhY2VzCgojaW5jbHVkZSAiTG9naW5JdGVtc0FFLmgiCgovLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwoKc3RhdGljIHZvaWQgQ0ZRUmVsZWFzZShDRlR5cGVSZWYgY2YpCnsKICAgIGlmIChjZiAhPSBOVUxMKSB7CiAgICAgICAgQ0ZSZWxlYXNlKGNmKTsKICAgIH0KfQoKc3RhdGljIHZvaWQgRG9BYm91dCh2b2lkKQoJLy8gRGlzcGxheXMgdGhlIGFib3V0IGJveC4KewoJU0ludDE2IGp1bmtIaXQ7CgoJKHZvaWQpIFN0YW5kYXJkQWxlcnQoCgkJa0FsZXJ0UGxhaW5BbGVydCwgCgkJIlxwTG9naW5JdGVtc1Rlc3RBRSIsIAoJCSJccEEgc2ltcGxlIHByb2dyYW0gdG8gdGVzdCBMb2dpbkl0ZW1zQUUuXHJcckRUU1xyXHKpIDIwMDUgQXBwbGUgQ29tcHV0ZXIsIEluYy4iLCAKCQlOVUxMLCAKCQkmanVua0hpdAoJKTsKfQoKc3RhdGljIHZvaWQgRGlzcGxheUVycm9yKE9TU3RhdHVzIGVycikKCS8vIERpc3BsYXlzIGEgdHJpdmlhbCBlcnJvciBkaWFsb2cgaWYgZXJyIHJlcHJlc2VudHMgYW4gZXJyb3IuCnsKCWlmICggKGVyciAhPSBub0VycikgJiYgKGVyciAhPSB1c2VyQ2FuY2VsZWRFcnIpICkgewogICAgICAgIEFsZXJ0U3RkQ0ZTdHJpbmdBbGVydFBhcmFtUmVjICAgcGFyYW1zOwogICAgICAgIERpYWxvZ1JlZiAgICAgICAgICAgICAgICAgICAgICAgZGxnOwogICAgICAgIERpYWxvZ0l0ZW1JbmRleCAgICAgICAgICAgICAgICAganVua0l0ZW07CiAgICAgICAgCiAgICAgICAgcGFyYW1zLnZlcnNpb24gICAgICAgPSBrU3RkQ0ZTdHJpbmdBbGVydFZlcnNpb25PbmU7CiAgICAgICAgcGFyYW1zLm1vdmFibGUgICAgICAgPSB0cnVlOwogICAgICAgIHBhcmFtcy5oZWxwQnV0dG9uICAgID0gZmFsc2U7CiAgICAgICAgcGFyYW1zLmRlZmF1bHRUZXh0ICAgPSAoQ0ZTdHJpbmdSZWYpIGtBbGVydERlZmF1bHRPS1RleHQ7CiAgICAgICAgcGFyYW1zLmNhbmNlbFRleHQgICAgPSBOVUxMOwogICAgICAgIHBhcmFtcy5vdGhlclRleHQgICAgID0gTlVMTDsKICAgICAgICBwYXJhbXMuZGVmYXVsdEJ1dHRvbiA9IGtBbGVydFN0ZEFsZXJ0T0tCdXR0b247CiAgICAgICAgcGFyYW1zLmNhbmNlbEJ1dHRvbiAgPSAwOwogICAgICAgIHBhcmFtcy5wb3NpdGlvbiAgICAgID0ga1dpbmRvd0NlbnRlck1haW5TY3JlZW47CiAgICAgICAgcGFyYW1zLmZsYWdzICAgICAgICAgPSAwOwogICAgICAgIAogICAgICAgIGVyciA9IENyZWF0ZVN0YW5kYXJkQWxlcnQoCiAgICAgICAgICAgIGtBbGVydFN0b3BBbGVydCwgCiAgICAgICAgICAgIENGU1RSKCJMb2dpbkl0ZW1zQUUgZ290IGFuIGVycm9yLiIpLCAKICAgICAgICAgICAgQ0ZTdHJpbmdDcmVhdGVXaXRoRm9ybWF0KE5VTEwsIE5VTEwsIENGU1RSKCIlbGQiKSwgZXJyKSwKICAgICAgICAgICAgJnBhcmFtcywgCiAgICAgICAgICAgICZkbGcKICAgICAgICApOwogICAgICAgIGlmIChlcnIgPT0gbm9FcnIpIHsKICAgICAgICAgICAgZXJyID0gUnVuU3RhbmRhcmRBbGVydChkbGcsIE5VTEwsICZqdW5rSXRlbSk7CiAgICAgICAgfQogICAgICAgIGFzc2VydChlcnIgPT0gbm9FcnIpOwoJfQp9CgpzdGF0aWMgQ29udHJvbFJlZglnRGF0YUNvbnRyb2w7CQkvLyBhIGRhdGEgYnJvd3NlciBjb250cm9sCnN0YXRpYyBDb250cm9sUmVmCWdBZGRIaWRkZW5Db250cm9sOwkvLyB0aGUgIkFkZCBIaWRkZW4iIGNoZWNrYm94CnN0YXRpYyBXaW5kb3dSZWYgCWdNYWluV2luZG93OwoKc3RhdGljIENGQXJyYXlSZWYJZ0l0ZW1zOwoKc3RhdGljIHBhc2NhbCBPU1N0YXR1cyBEYXRhQnJvd3NlckRhdGFDYWxsYmFjaygKCUNvbnRyb2xSZWYgCQkJCWJyb3dzZXIsIAoJRGF0YUJyb3dzZXJJdGVtSUQgCQlpdGVtLCAKCURhdGFCcm93c2VyUHJvcGVydHlJRCAJcHJvcGVydHksIAoJRGF0YUJyb3dzZXJJdGVtRGF0YVJlZglpdGVtRGF0YSwgCglCb29sZWFuIAkJCQlzZXRWYWx1ZQopCgkvLyBDYWxsZWQgYnkgdGhlIGRhdGEgYnJvd3NlciBjb250cm9sIHRvIGdldCBpbmZvcm1hdGlvbiBhYm91dCB0aGUgCgkvLyBkYXRhIHRoYXQgaXQncyBkaXNwbGF5aW5nLiAgaXRlbSBpcyB0aGUgcm93IGluIHRoZSBsaXN0LCB3aGljaCBpbiB0aGlzIAoJLy8gY2FzZSBpcyB0aGUgaW5kZXggKHBsdXMgb25lKSBpbnRvIHRoZSBnSXRlbXMgQ0ZBcnJheSB0aGF0IHJlcHJlc2VudHMgCgkvLyB0aGUgbG9naW4gaXRlbXMgbGlzdC4gIHByb3BlcnR5IGlzIHRoZSBjb2x1bW4gaW4gdGhlIGxpc3Q7IHRoZXNlIHZhbHVlcyAKCS8vIGFyZSBzZXQgaW4gdGhlIC5uaWIgZmlsZS4gIFdoZW4gYXNrZWQgZm9yIGRhdGEsIHRoZSByb3V0aW5lIGxvb2tzIHVwIAoJLy8gdGhlIGl0ZW0ndGggZWxlbWVudCBvZiBnSXRlbXMgYW5kIHRoZW4gZXh0cmFjdHMgdGhlIGFwcHJvcHJpYXRlIGtleSAKCS8vIGZyb20gdGhhdCBkaWN0aW9uYXJ5Lgp7CglPU1N0YXR1cwkJZXJyOwoJQ0ZEaWN0aW9uYXJ5UmVmCWRpY3Q7CglDRkJvb2xlYW5SZWYJaGlkZGVuOwoJQ0ZVUkxSZWYJCXVybDsKCUNGU3RyaW5nUmVmCQlzdHI7CgkKCWFzc2VydChicm93c2VyID09IGdEYXRhQ29udHJvbCk7Cglhc3NlcnQoIChpdGVtICE9IGtEYXRhQnJvd3Nlck5vSXRlbSkgJiYgKGl0ZW0gPD0gQ0ZBcnJheUdldENvdW50KGdJdGVtcykpICk7Cglhc3NlcnQoIChwcm9wZXJ0eSA8IDEwMjQpIHx8IChwcm9wZXJ0eSA9PSAnaGlkbicpIHx8IChwcm9wZXJ0eSA9PSAnVVJMICcpICk7Cglhc3NlcnQoICEgc2V0VmFsdWUgKTsKCQoJLy8gZ0l0ZW1zIGNhbiBvbmx5IGJlIE5VTEwgYmVmb3JlIHRoZSBmaXJzdCBjYWxsIHRvIERvUmVmcmVzaCBhcyB0aGUgCgkvLyBhcHBsaWNhdGlvbiBzdGFydHMgdXAuICBEYXRhIGJyb3dzZXIgc2hvdWxkIG5ldmVyIGJlIGNhbGxpbmcgdXMgdG8gCgkvLyBnZXQgaW5mb3JtYXRpb24gYWJvdXQgaXRlbXMgZHVyaW5nIHRoYXQgdGltZSwgYmVjYXVzZSB3ZSBoYXZlbid0IAoJLy8gYWRkZWQgYW55IGl0ZW1zIHRvIHRoZSBkYXRhIGJyb3dzZXIuICBUaHVzLCB3ZSBzaG91bGRuJ3QgYmUgY2FsbGVkIAoJLy8gd2hlbiBnSXRlbXMgaXMgTlVMTC4KCglhc3NlcnQoIGdJdGVtcyAhPSBOVUxMICk7CgkKCXN3aXRjaCAocHJvcGVydHkpIHsKCQljYXNlICdoaWRuJzoKCQkJZGljdCA9IChDRkRpY3Rpb25hcnlSZWYpIENGQXJyYXlHZXRWYWx1ZUF0SW5kZXgoZ0l0ZW1zLCAoQ0ZJbmRleCkgKGl0ZW0gLSAxKSk7CgkJCWFzc2VydCggKGRpY3QgIT0gTlVMTCkgJiYgKENGR2V0VHlwZUlEKGRpY3QpID09IENGRGljdGlvbmFyeUdldFR5cGVJRCgpKSApOwoJCQkKCQkJaGlkZGVuID0gKENGQm9vbGVhblJlZikgQ0ZEaWN0aW9uYXJ5R2V0VmFsdWUoZGljdCwga0xJQUVIaWRkZW4pOwoJCQlhc3NlcnQoIChoaWRkZW4gIT0gTlVMTCkgJiYgKENGR2V0VHlwZUlEKGhpZGRlbikgPT0gQ0ZCb29sZWFuR2V0VHlwZUlEKCkpICk7CgoJCQllcnIgPSBTZXREYXRhQnJvd3Nlckl0ZW1EYXRhVGV4dCgKCQkJCWl0ZW1EYXRhLCAKCQkJCShDRkJvb2xlYW5HZXRWYWx1ZShoaWRkZW4pID8gQ0ZTVFIoInllcyIpIDogQ0ZTVFIoIm5vIikpCgkJCSk7CgkJCWJyZWFrOwoJCWNhc2UgJ1VSTCAnOgoJCQlkaWN0ID0gKENGRGljdGlvbmFyeVJlZikgQ0ZBcnJheUdldFZhbHVlQXRJbmRleChnSXRlbXMsIChDRkluZGV4KSAoaXRlbSAtIDEpKTsKCQkJYXNzZXJ0KCAoZGljdCAhPSBOVUxMKSAmJiAoQ0ZHZXRUeXBlSUQoZGljdCkgPT0gQ0ZEaWN0aW9uYXJ5R2V0VHlwZUlEKCkpICk7CgoJCQl1cmwgPSAoQ0ZVUkxSZWYpIENGRGljdGlvbmFyeUdldFZhbHVlKGRpY3QsIGtMSUFFVVJMKTsKCQkJYXNzZXJ0KCAodXJsICE9IE5VTEwpICYmIChDRkdldFR5cGVJRCh1cmwpID09IENGVVJMR2V0VHlwZUlEKCkpICk7CgoJCQlzdHIgPSBDRlVSTEdldFN0cmluZyh1cmwpOwoJCQkKCQkJZXJyID0gU2V0RGF0YUJyb3dzZXJJdGVtRGF0YVRleHQoaXRlbURhdGEsIHN0cik7CgkJCWJyZWFrOwoJCWRlZmF1bHQ6CgkJCWVyciA9IG5vRXJyOwoJCQlicmVhazsKCX0KCglhc3NlcnQoZXJyID09IG5vRXJyKTsKCglyZXR1cm4gZXJyOwp9CgpzdGF0aWMgdm9pZCBEb1JlZnJlc2godm9pZCkKCS8vIENhbGxlZCBpbiByZXNwb25zZSB0byBhIGNsaWNrIG9mIHRoZSAiUmVmcmVzaCIgYnV0dG9uLiAgCgkvLyBBbHNvIGNhbGxlZCB0byByZWZyZXNoIHRoZSBsaXN0IGFmdGVyIG90aGVyIGFjdGlvbnMgaGF2ZSAKCS8vIGNoYW5nZWQgaXQuICBBbHNvIGNhbGxlZCBhdCBhcHBsaWNhdGlvbiBzdGFydHVwIHRvIAoJLy8gZXN0YWJsaXNoIGFuIGluaXRpYWwgdmFsdWUgZm9yIHRoZSBsaXN0Lgp7CglPU1N0YXR1cyAJCQllcnI7CglDRkFycmF5UmVmCQkJaXRlbXM7CglDRkluZGV4CQkJCWl0ZW1Db3VudDsKCUNGSW5kZXgJCQkJaXRlbUluZGV4OwoJRGF0YUJyb3dzZXJJdGVtSUQgKglpdGVtc0lEQXJyYXk7CgkKCWl0ZW1zSURBcnJheSA9IE5VTEw7CglpdGVtcyA9IE5VTEw7CgkKCS8vIEdldCB0aGUgYXJyYXkgZnJvbSBMb2dpbkl0ZW1zQUUuCgkKCWVyciA9IExJQUVDb3B5TG9naW5JdGVtcygmaXRlbXMpOwoJaWYgKGVyciA9PSBub0VycikgewoJCgkJLy8gU3dhcCBpdCBpbnRvIGdJdGVtcy4KCQkKCQlDRlFSZWxlYXNlKGdJdGVtcyk7CgkJZ0l0ZW1zID0gaXRlbXM7CgkJaXRlbXMgPSBOVUxMOwkJLy8gdG8gcHJldmVudCB0aGUgcmVsZWFzZSBhdCB0aGUgZW5kIG9mIHRoaXMgZnVuY3Rpb24KCQoJCS8vIFJlbW92ZSBhbnkgZXhpc3RpbmcgaXRlbXMuCgkJCQoJCWlmIChlcnIgPT0gbm9FcnIpIHsKCQkJZXJyID0gUmVtb3ZlRGF0YUJyb3dzZXJJdGVtcygKCQkJCWdEYXRhQ29udHJvbCwKCQkJCWtEYXRhQnJvd3Nlck5vSXRlbSwJCQkJCS8vIGZyb20gcm9vdAoJCQkJMCwJCQkJCQkJCQkvLyBhbGwgaXRlbXMKCQkJCU5VTEwsCQkJCQkJCQkvLyAgIiAgICAiCgkJCQlrRGF0YUJyb3dzZXJJdGVtTm9Qcm9wZXJ0eQoJCQkpOwoJCX0JCgkJCgkJLy8gQWRkIHRoZSBuZXcgaXRlbXMuCgkJCgkJaWYgKGVyciA9PSBub0VycikgewoJCQlpdGVtQ291bnQgPSBDRkFycmF5R2V0Q291bnQoZ0l0ZW1zKTsKCQkKCQkJaXRlbXNJREFycmF5ID0gY2FsbG9jKGl0ZW1Db3VudCwgc2l6ZW9mKERhdGFCcm93c2VySXRlbUlEKSk7CgkJCWlmIChpdGVtc0lEQXJyYXkgPT0gTlVMTCkgewoJCQkJZXJyID0gbWVtRnVsbEVycjsKCQkJfQoJCX0KCQlpZiAoZXJyID09IG5vRXJyKSB7CgkJCgkJCS8vIEVhY2ggaXRlbSBJRCBpcyB0aGUgaXRlbSdzIGluZGV4IGludG8gdGhlIGdJdGVtcyBhcnJheSwgCgkJCS8vIHBsdXMgb25lIGJlY2F1c2UgYSB2YWx1ZSBvZiAwIGlzIGludmFsaWQgKGl0J3Mga0RhdGFCcm93c2VyTm9JdGVtKS4KCQkJCgkJCWZvciAoaXRlbUluZGV4ID0gMDsgaXRlbUluZGV4IDwgaXRlbUNvdW50OyBpdGVtSW5kZXgrKykgewoJCQkJaXRlbXNJREFycmF5W2l0ZW1JbmRleF0gPSAoRGF0YUJyb3dzZXJJdGVtSUQpIChpdGVtSW5kZXggKyAxKTsKCQkJfQoJCQoJCQllcnIgPSBBZGREYXRhQnJvd3Nlckl0ZW1zKAoJCQkJZ0RhdGFDb250cm9sLAoJCQkJa0RhdGFCcm93c2VyTm9JdGVtLAkJCQkJLy8gdG8gcm9vdAoJCQkJKFVJbnQzMikgaXRlbUNvdW50LAoJCQkJaXRlbXNJREFycmF5LAoJCQkJa0RhdGFCcm93c2VySXRlbU5vUHJvcGVydHkKCQkJKTsKCQl9Cgl9CgkKCS8vIENsZWFuIHVwLgoJCglDRlFSZWxlYXNlKGl0ZW1zKTsKCWZyZWUoaXRlbXNJREFycmF5KTsKCglEaXNwbGF5RXJyb3IoZXJyKTsKfQoKc3RhdGljIE5hdkV2ZW50VVBQIGdBZGROYXZFdmVudFVQUDsJCQkvLyBBZGROYXZFdmVudAoKc3RhdGljIHBhc2NhbCB2b2lkIEFkZE5hdkV2ZW50KAoJTmF2RXZlbnRDYWxsYmFja01lc3NhZ2UgY2FsbEJhY2tTZWxlY3RvciwgCglOYXZDQlJlY1B0ciAJCQljYWxsQmFja1Bhcm1zLCAKCXZvaWQgKgkJCQkJY2FsbEJhY2tVRAopCgkvLyBDYWxsZWQgYnkgTmF2aWdhdGlvbiBTZXJ2aWNlcyB3aGVuIGludGVyZXN0aW5nIHRoaW5ncyBoYXBwZW4gCgkvLyBpbiBvdXIgTmF2IGRpYWxvZyAod2hpY2ggaXMgZGlzcGxheWVkIHdoZW4gdGhlIHVzZXIgY2xpY2tzIAoJLy8gdGhlICJBZGQiIGJ1dHRvbikuICBJbiB0aGlzIGNhc2Ugd2UncmUgcHJpbWFyaWx5IGludGVyZXN0ZWQgCgkvLyBpbiB0d28gZXZlbnRzOiB0aGUgdXNlciBhY3Rpb24gb2YgdGhlIHVzZXIgY2xpY2tpbmcgdGhlIENob29zZSAKCS8vIGJ1dHRvbiBvZiB0aGUgTmF2IGRpYWxvZywgYW5kIHRoZSBkaWFsb2cgYmVpbmcgdG9ybiBkb3duLgp7CgkjcHJhZ21hIHVudXNlZChjYWxsQmFja1VEKQoJT1NTdGF0dXMJCWVycjsKCU9TU3RhdHVzCQlqdW5rOwoJTmF2RGlhbG9nUmVmIAluYXZEaWFsb2c7CgkKCW5hdkRpYWxvZyA9IGNhbGxCYWNrUGFybXMtPmNvbnRleHQ7Cglhc3NlcnQobmF2RGlhbG9nICE9IE5VTEwpOwoJCglzd2l0Y2ggKGNhbGxCYWNrU2VsZWN0b3IpIHsKCQljYXNlIGtOYXZDQlVzZXJBY3Rpb246CgkJCXN3aXRjaCAoIE5hdkRpYWxvZ0dldFVzZXJBY3Rpb24obmF2RGlhbG9nKSApIHsKCQkJCWNhc2Uga05hdlVzZXJBY3Rpb25DaG9vc2U6CgkJCQkJewoJCQkJCQlOYXZSZXBseVJlY29yZCAJcmVwbHk7CgkJCQkJCUFFS2V5d29yZCAJCWp1bmtLZXl3b3JkOwoJCQkJCQlEZXNjVHlwZQkJanVua1R5cGU7CgkJCQkJCVNpemUJCQlqdW5rU2l6ZTsKCQkJCQkJCgkJCQkJCWVyciA9IE5hdkRpYWxvZ0dldFJlcGx5KG5hdkRpYWxvZywgJnJlcGx5KTsKCQkJCQkJaWYgKGVyciA9PSBub0VycikgewoJCQkJCQkJRlNSZWYJY2hvc2VuSXRlbTsKCQkJCQkJCQoJCQkJCQkJLy8gSW4gdGhlIGRlYnVnIGJ1aWxkLCB2ZXJpZnkgdGhhdCBvbmx5IG9uZSBpdGVtcyBpcyAKCQkJCQkJCS8vIHNlbGVjdGVkLgoJCQkJCQkJCgkJCQkJCQkjaWYgISBkZWZpbmVkKE5ERUJVRykKCQkJCQkJCQl7CgkJCQkJCQkJCWxvbmcgc2VsZWN0aW9uQ291bnQ7CgkJCQkJCQkJCQoJCQkJCQkJCQlhc3NlcnQoIAoJCQkJCQkJCQkJICAgKEFFQ291bnRJdGVtcyggJnJlcGx5LnNlbGVjdGlvbiwgJnNlbGVjdGlvbkNvdW50KSA9PSBub0VycikKCQkJCQkJCQkJCSYmIChzZWxlY3Rpb25Db3VudCA9PSAxKQoJCQkJCQkJCQkpOwoJCQkJCQkJCX0KCQkJCQkJCSNlbmRpZgoKCQkJCQkJCS8vIEdldCB0aGUgc2VsZWN0ZWQgaXRlbS4KCQkJCQkJCQoJCQkJCQkJZXJyID0gQUVHZXROdGhQdHIoCgkJCQkJCQkJJnJlcGx5LnNlbGVjdGlvbiwgCgkJCQkJCQkJMSwgCgkJCQkJCQkJdHlwZUZTUmVmLCAKCQkJCQkJCQkmanVua0tleXdvcmQsIAoJCQkJCQkJCSZqdW5rVHlwZSwgCgkJCQkJCQkJJmNob3Nlbkl0ZW0sIAoJCQkJCQkJCXNpemVvZihjaG9zZW5JdGVtKSwgCgkJCQkJCQkJJmp1bmtTaXplCgkJCQkJCQkpOwoJCQkJCQkJCgkJCQkJCQkvLyBVc2UgTG9naW5JdGVtc0FFIHRvIGFkZCBpdCB0byB0aGUgbGlzdC4KCQkJCQkJCQoJCQkJCQkJaWYgKGVyciA9PSBub0VycikgewoJCQkJCQkJCWVyciA9IExJQUVBZGRSZWZBdEVuZCgKCQkJCQkJCQkJJmNob3Nlbkl0ZW0sIAoJCQkJCQkJCQlHZXRDb250cm9sVmFsdWUoZ0FkZEhpZGRlbkNvbnRyb2wpICE9IDAKCQkJCQkJCQkpOwoJCQkJCQkJfQoJCQkJCQkKCQkJCQkJCWp1bmsgPSBOYXZEaXNwb3NlUmVwbHkoJnJlcGx5KTsKCQkJCQkJCWFzc2VydChqdW5rID09IG5vRXJyKTsKCQkJCQkJCQoJCQkJCQkJaWYgKGVyciA9PSBub0VycikgewoJCQkJCQkJCURvUmVmcmVzaCgpOwoJCQkJCQkJfSBlbHNlIHsKCQkJCQkJCQlEaXNwbGF5RXJyb3IoZXJyKTsKCQkJCQkJCX0JCQkJCQkKCQkJCQkJfQoJCQkJCX0KCQkJCQlicmVhazsKCQkJCWRlZmF1bHQ6CgkJCQkJLy8gZG8gbm90aGluZwoJCQkJCWJyZWFrOwoJCQl9CgkJCWJyZWFrOwoJCWNhc2Uga05hdkNCVGVybWluYXRlOgoJCQlOYXZEaWFsb2dEaXNwb3NlKG5hdkRpYWxvZyk7CgkJCWJyZWFrOwoJCWRlZmF1bHQ6CgkJCS8vIGRvIG5vdGhpbmcKCQkJYnJlYWs7Cgl9Cn0KCnN0YXRpYyB2b2lkIERvQWRkVGVzdCh2b2lkKQoJLy8gQ2FsbGVkIGluIHJlc3BvbnNlIHRvIGEgY2xpY2sgb2YgdGhlICJBZGQiIGJ1dHRvbi4gCnsKCU9TU3RhdHVzIAkJCQkJZXJyOwoJTmF2RGlhbG9nQ3JlYXRpb25PcHRpb25zCW5hdk9wdGlvbnM7CglOYXZEaWFsb2dSZWYJCQkJbmF2RGlhbG9nOwoKCW5hdkRpYWxvZyA9IE5VTEw7CgkKCWlmIChnQWRkTmF2RXZlbnRVUFAgPT0gTlVMTCkgewoJCWdBZGROYXZFdmVudFVQUCA9IE5ld05hdkV2ZW50VVBQKEFkZE5hdkV2ZW50KTsKCQlhc3NlcnQoZ0FkZE5hdkV2ZW50VVBQICE9IE5VTEwpOwoJfQoKCS8vIENyZWF0ZSBhbmQgcnVuIGEgTmF2IGNob29zZSBvYmplY3QgZGlhbG9nICh3aGljaCBsZXRzIHlvdSAKCS8vIGNob29zZSBhIGZpbGUsIGZvbGRlciBvciB2b2x1bWUpLgoJCgllcnIgPSBOYXZHZXREZWZhdWx0RGlhbG9nQ3JlYXRpb25PcHRpb25zKCZuYXZPcHRpb25zKTsKCWlmIChlcnIgPT0gbm9FcnIpIHsKCQluYXZPcHRpb25zLm9wdGlvbkZsYWdzICB8PSBrTmF2U3VwcG9ydFBhY2thZ2VzOwoJCW5hdk9wdGlvbnMubW9kYWxpdHkgICAgICA9IGtXaW5kb3dNb2RhbGl0eVdpbmRvd01vZGFsOwoJCW5hdk9wdGlvbnMucGFyZW50V2luZG93ICA9IGdNYWluV2luZG93OwoJCQoJCWVyciA9IE5hdkNyZWF0ZUNob29zZU9iamVjdERpYWxvZygKCQkJJm5hdk9wdGlvbnMsCQkJCQkvLyBpbk9wdGlvbnMKCQkJZ0FkZE5hdkV2ZW50VVBQLAoJCQlOVUxMLAkJCQkJCQkvLyBpblByZXZpZXdQcm9jCgkJCU5VTEwsCQkJCQkJCS8vIGluRmlsdGVyUHJvYwoJCQlOVUxMLAkJCQkJCQkvLyBpbkNsaWVudERhdGEKCQkJJm5hdkRpYWxvZwoJCSk7Cgl9CglpZiAoZXJyID09IG5vRXJyKSB7CgkJZXJyID0gTmF2RGlhbG9nUnVuKG5hdkRpYWxvZyk7CgkJCgkJLy8gVGhlIHByb2Nlc3Mgb2YgYWRkaW5nIHRoZSBpdGVtIGNvbnRpbnVlcyBpbiBBZGROYXZFdmVudCAKCQkvLyB3aGVuIHRoZSB1c2VyIGhhcyBjaG9zZW4gYW4gaXRlbSB0byBhZGQuCgl9CgoJLy8gQ2xlYW4gdXAuCgoJLy8gRGlzcG9zZSB0aGUgTmF2IGRpYWxvZyBpZiB3ZSBkaWRuJ3QgbWFuYWdlIHRvIHN0YXJ0IGl0IHJ1bm5pbmcuCgkKCWlmIChlcnIgIT0gbm9FcnIpIHsKCQlpZiAobmF2RGlhbG9nICE9IE5VTEwpIHsKCQkJTmF2RGlhbG9nRGlzcG9zZShuYXZEaWFsb2cpOwoJCX0KCX0KCglEaXNwbGF5RXJyb3IoZXJyKTsKfQoKc3RhdGljIHZvaWQgRG9SZW1vdmVUZXN0KHZvaWQpCgkvLyBDYWxsZWQgaW4gcmVzcG9uc2UgdG8gYSBjbGljayBvZiB0aGUgIlJlbW92ZSIgYnV0dG9uLiAKewoJT1NTdGF0dXMJZXJyOwoJQ0ZJbmRleCAJaXRlbUNvdW50OwoJQ0ZJbmRleCAJaXRlbUluZGV4OwoJQm9vbGVhbgkJZm91bmQ7CgkKCS8vIEZpbmQgdGhlIGluZGV4IG9mIHRoZSBzZWxlY3RlZCBpdGVtIGluIHRoZSBkYXRhIGJyb3dzZXIgCgkvLyBjb250cm9sLgoJCglpdGVtQ291bnQgPSBDRkFycmF5R2V0Q291bnQoZ0l0ZW1zKTsKCWl0ZW1JbmRleCA9IDA7Cglmb3VuZCA9IGZhbHNlOwoJd2hpbGUgKCAoaXRlbUluZGV4IDwgaXRlbUNvdW50KSAmJiAhIGZvdW5kICkgewoJCWZvdW5kID0gSXNEYXRhQnJvd3Nlckl0ZW1TZWxlY3RlZChnRGF0YUNvbnRyb2wsIChEYXRhQnJvd3Nlckl0ZW1JRCkgaXRlbUluZGV4ICsgMSk7OwoJCQoJCWlmICggISBmb3VuZCApIHsKCQkJaXRlbUluZGV4ICs9IDE7CgkJfQoJfQoJCgkvLyBVc2UgTElBRSB0byByZW1vdmUgaXQuCgkKCWlmIChmb3VuZCkgewoJCWVyciA9IExJQUVSZW1vdmUoaXRlbUluZGV4KTsKCX0gZWxzZSB7CgkJLy8gSXQncyBub3QgYW4gZXJyb3IgdG8gaGF2ZSBubyBzZWxlY3Rpb24gYmVjYXVzZSB3ZSBkb24ndCBkeW5hbWljYWxseSAKCQkvLyBlbmFibGUvZGlzYWJsZSB0aGUgUmVtb3ZlIGJ1dHRvbi4KCQllcnIgPSBub0VycjsKCX0KCQoJaWYgKGVyciA9PSBub0VycikgewoJCURvUmVmcmVzaCgpOwoJfSBlbHNlIHsKCQlEaXNwbGF5RXJyb3IoZXJyKTsKCX0JCn0KCnN0YXRpYyBFdmVudEhhbmRsZXJVUFAgZ0FwcGxpY2F0aW9uRXZlbnRIYW5kbGVyVVBQOwkJLy8gLT4gQXBwbGljYXRpb25FdmVudEhhbmRsZXIKCnN0YXRpYyBjb25zdCBFdmVudFR5cGVTcGVjIGtBcHBsaWNhdGlvbkV2ZW50c1tdID0geyB7a0V2ZW50Q2xhc3NDb21tYW5kLCBrRXZlbnRDb21tYW5kUHJvY2Vzc30gfTsKCnN0YXRpYyBwYXNjYWwgT1NTdGF0dXMgQXBwbGljYXRpb25FdmVudEhhbmRsZXIoRXZlbnRIYW5kbGVyQ2FsbFJlZiBpbkhhbmRsZXJDYWxsUmVmLCAKCQkJCQkJCQkJCQkgICBFdmVudFJlZiBpbkV2ZW50LCB2b2lkICppblVzZXJEYXRhKQoJLy8gRGlzcGF0Y2hlcyBISUNvbW1hbmRzIHRvIHRoZWlyIGltcGxlbWVudGF0aW9ucy4KewoJT1NTdGF0dXMgCWVycjsKCUhJQ29tbWFuZCAJY29tbWFuZDsKCSNwcmFnbWEgdW51c2VkKGluSGFuZGxlckNhbGxSZWYpCgkjcHJhZ21hIHVudXNlZChpblVzZXJEYXRhKQoJCglhc3NlcnQoIEdldEV2ZW50Q2xhc3MoaW5FdmVudCkgPT0ga0V2ZW50Q2xhc3NDb21tYW5kICApOwoJYXNzZXJ0KCBHZXRFdmVudEtpbmQoaW5FdmVudCkgID09IGtFdmVudENvbW1hbmRQcm9jZXNzKTsKCQoJZXJyID0gR2V0RXZlbnRQYXJhbWV0ZXIoaW5FdmVudCwga0V2ZW50UGFyYW1EaXJlY3RPYmplY3QsIHR5cGVISUNvbW1hbmQsIE5VTEwsIHNpemVvZihjb21tYW5kKSwgTlVMTCwgJmNvbW1hbmQpOwoJaWYgKGVyciA9PSBub0VycikgewoJCXN3aXRjaCAoY29tbWFuZC5jb21tYW5kSUQpIHsKCQkJY2FzZSBrSElDb21tYW5kQWJvdXQ6CgkJCQlEb0Fib3V0KCk7CgkJCQlicmVhazsKCQkJY2FzZSAnRFNodyc6CgkJCQlEb1JlZnJlc2goKTsKCQkJCWJyZWFrOwoJCQljYXNlICdEQWRkJzoKCQkJCURvQWRkVGVzdCgpOwoJCQkJYnJlYWs7CgkJCWNhc2UgJ0RSZW0nOgoJCQkJRG9SZW1vdmVUZXN0KCk7CgkJCQlicmVhazsKCQkJZGVmYXVsdDoKCQkJCWVyciA9IGV2ZW50Tm90SGFuZGxlZEVycjsKCQkJCWJyZWFrOwoJCX0KCX0KCQoJcmV0dXJuIGVycjsKfQoKc3RhdGljIE9TU3RhdHVzIFNldHVwVXNlckludGVyZmFjZSh2b2lkKQoJLy8gQ3JlYXRlIGEgdXNlciBpbnRlcmZhY2UgZnJvbSBvdXIgTklCLgp7CglPU1N0YXR1cyAJZXJyOwoJSUJOaWJSZWYgCW5pYlJlZjsKCUhhbmRsZQkJbWVudUJhcjsKCgluaWJSZWYgID0gTlVMTDsKCW1lbnVCYXIgPSBOVUxMOwoJCQoJZXJyID0gQ3JlYXRlTmliUmVmZXJlbmNlKENGU1RSKCJMb2dpbkl0ZW1zQUVUZXN0IiksICZuaWJSZWYpOwoJaWYgKGVyciA9PSBub0VycikgewoJCWVyciA9IENyZWF0ZU1lbnVCYXJGcm9tTmliKG5pYlJlZiwgQ0ZTVFIoIk1lbnVCYXIiKSwgJm1lbnVCYXIpOwoJfQoJaWYgKGVyciA9PSBub0VycikgewoJCVNldE1lbnVCYXIobWVudUJhcik7Cgl9CglpZiAoZXJyID09IG5vRXJyKSB7CgkJZXJyID0gQ3JlYXRlV2luZG93RnJvbU5pYihuaWJSZWYsIENGU1RSKCJNYWluV2luZG93IiksICZnTWFpbldpbmRvdyk7Cgl9CglpZiAoZXJyID09IG5vRXJyKSB7CgkJQ29udHJvbElEIHRoZUlEOwoKCQl0aGVJRC5zaWduYXR1cmUgPSAnSERDQic7CgkJdGhlSUQuaWQgPSAwOwkKCgkJZXJyID0gR2V0Q29udHJvbEJ5SUQoZ01haW5XaW5kb3csICZ0aGVJRCwgJmdBZGRIaWRkZW5Db250cm9sKTsKCX0KCgkvLyBGaW5kIGFuZCBzZXQgdXAgdGhlIGRhdGEgYnJvd3NlciBjb250cm9sLgoJCglpZiAoZXJyID09IG5vRXJyKSB7CgkJQ29udHJvbElEIHRoZUlEOwoKCQl0aGVJRC5zaWduYXR1cmUgPSAnREFUQSc7CgkJdGhlSUQuaWQgPSAwOwkKCgkJZXJyID0gR2V0Q29udHJvbEJ5SUQoZ01haW5XaW5kb3csICZ0aGVJRCwgJmdEYXRhQ29udHJvbCk7Cgl9CglpZiAoZXJyID09IG5vRXJyKSB7CgkJRGF0YUJyb3dzZXJDYWxsYmFja3MgY2FsbGJhY2tzOwoJCQoJCWNhbGxiYWNrcy52ZXJzaW9uID0ga0RhdGFCcm93c2VyTGF0ZXN0Q2FsbGJhY2tzOwoJCWVyciA9IEluaXREYXRhQnJvd3NlckNhbGxiYWNrcygmY2FsbGJhY2tzKTsKCgkJaWYgKGVyciA9PSBub0VycikgewoJCQljYWxsYmFja3MudS52MS5pdGVtRGF0YUNhbGxiYWNrID0gTmV3RGF0YUJyb3dzZXJJdGVtRGF0YVVQUChEYXRhQnJvd3NlckRhdGFDYWxsYmFjayk7CgoJCQllcnIgPSBTZXREYXRhQnJvd3NlckNhbGxiYWNrcyhnRGF0YUNvbnRyb2wsICZjYWxsYmFja3MpOwoJCX0KCX0KCWlmIChlcnIgPT0gbm9FcnIpIHsKCQlEb1JlZnJlc2goKTsKCX0KCQoJaWYgKGVyciA9PSBub0VycikgewoJCVNob3dXaW5kb3coZ01haW5XaW5kb3cpOwoJfQogIAkKCWlmIChuaWJSZWYgIT0gTlVMTCkgewoJCURpc3Bvc2VOaWJSZWZlcmVuY2UobmliUmVmKTsKCX0KCWlmIChtZW51QmFyICE9IE5VTEwpIHsKCQlEaXNwb3NlSGFuZGxlKG1lbnVCYXIpOwoJfQoJcmV0dXJuIGVycjsKfQoKaW50IG1haW4odm9pZCkKewoJT1NTdGF0dXMgICAgZXJyOwogICAgVUludDMyICAgICAgcmVzcG9uc2U7CiAgICAgICAgCiAgICBlcnIgPSBHZXN0YWx0KGdlc3RhbHRTeXN0ZW1WZXJzaW9uLCAobG9uZyAqKSAmcmVzcG9uc2UpOwogICAgaWYgKGVyciA9PSBub0VycikgewogICAgICAgIGlmICggcmVzcG9uc2UgPCAweDEwMjAgKSB7CiAgICAgICAgICAgIFNJbnQxNiBqdW5rSGl0OwogICAgICAgICAgICAKICAgICAgICAgICAgKHZvaWQpIFN0YW5kYXJkQWxlcnQoCiAgICAgICAgICAgICAgICBrQWxlcnRTdG9wQWxlcnQsIAogICAgICAgICAgICAgICAgIlxwTG9naW5JdGVtc0FFVGVzdCByZXF1aXJlcyBNYWMgT1MgWCAxMC4yIG9yIGxhdGVyLiIsIAogICAgICAgICAgICAgICAgIlxwIiwKICAgICAgICAgICAgICAgIE5VTEwsIAogICAgICAgICAgICAgICAgJmp1bmtIaXQKICAgICAgICAgICAgKTsKICAgICAgICAgICAgCiAgICAgICAgICAgIGVyciA9IHVzZXJDYW5jZWxlZEVycjsKICAgICAgICB9CiAgICB9CiAgICAKCS8vIFN0YXJ0IHVwIHRoZSBVSS4KCQogICAgaWYgKGVyciA9PSBub0VycikgewogICAgICAgIGVyciA9IFNldHVwVXNlckludGVyZmFjZSgpOwogICAgfQoJCgkvLyBJbnN0YWxsIG91ciBISUNvbW1hbmQgaGFuZGxlci4KCQoJaWYgKGVyciA9PSBub0VycikgewoJCWdBcHBsaWNhdGlvbkV2ZW50SGFuZGxlclVQUCA9IE5ld0V2ZW50SGFuZGxlclVQUChBcHBsaWNhdGlvbkV2ZW50SGFuZGxlcik7CgkJYXNzZXJ0KGdBcHBsaWNhdGlvbkV2ZW50SGFuZGxlclVQUCAhPSBOVUxMKTsKCgkJZXJyID0gSW5zdGFsbEFwcGxpY2F0aW9uRXZlbnRIYW5kbGVyKGdBcHBsaWNhdGlvbkV2ZW50SGFuZGxlclVQUCwgCgkJCQkJCQkJCQkJIEdldEV2ZW50VHlwZUNvdW50KGtBcHBsaWNhdGlvbkV2ZW50cyksIAoJCQkJCQkJCQkJCSBrQXBwbGljYXRpb25FdmVudHMsIE5VTEwsIE5VTEwpOwoJfQoJCgkvLyBSdW4gdGhlIGFwcGxpY2F0aW9uLgoJCglpZiAoZXJyID09IG5vRXJyKSB7CgkJUnVuQXBwbGljYXRpb25FdmVudExvb3AoKTsKCX0KCglEaXNwbGF5RXJyb3IoZXJyKTsKCglyZXR1cm4gMDsKfQo=