LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIAogKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCiAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQogKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgogKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCiAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQogKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAqIAogKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogKiAKICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAogKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgogKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCiAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKICogdW5kZXIgdGhlIExpY2Vuc2UuCiAqIAogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KCgoKI2lmbmRlZiBfX0ZSQU1FV09SS19VSUNPTkZJR1VSQVRJT05fSU1BR0VNQU5BR0VSSU1QTF9IWFhfCiNkZWZpbmUgX19GUkFNRVdPUktfVUlDT05GSUdVUkFUSU9OX0lNQUdFTUFOQUdFUklNUExfSFhYXwoKCi8qKiBBdHRlbnRpb246IHN0bCBoZWFkZXJzIG11c3QoISkgYmUgaW5jbHVkZWQgYXQgZmlyc3QuIE90aGVyd2hpc2UgaXQgY2FuIG1ha2UgdHJvdWJsZQogICAgICAgICAgICAgICB3aXRoIHNvbGFyaXMgaGVhZGVycyAuLi4KKi8KI2luY2x1ZGUgPHZlY3Rvcj4KI2luY2x1ZGUgPGxpc3Q+CiNpbmNsdWRlIDxoYXNoX21hcD4KCi8vX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KLy8JbXkgb3duIGluY2x1ZGVzCi8vX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KI2luY2x1ZGUgPHRocmVhZGhlbHAvdGhyZWFkaGVscGJhc2UuaHh4PgojaW5jbHVkZSA8bWFjcm9zL2dlbmVyaWMuaHh4PgojaW5jbHVkZSA8bWFjcm9zL3hpbnRlcmZhY2UuaHh4PgojaW5jbHVkZSA8bWFjcm9zL3h0eXBlcHJvdmlkZXIuaHh4PgojaW5jbHVkZSA8bWFjcm9zL3hzZXJ2aWNlaW5mby5oeHg+CiNpbmNsdWRlIDxzdGR0eXBlcy5oPgojaW5jbHVkZSA8dWljb25maWd1cmF0aW9uL2ltYWdldHlwZS5oeHg+CgovL19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCi8vCWludGVyZmFjZSBpbmNsdWRlcwovL19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCiNpbmNsdWRlIDxjb20vc3VuL3N0YXIvbGFuZy9YU2VydmljZUluZm8uaHBwPgojaW5jbHVkZSA8Y29tL3N1bi9zdGFyL2xhbmcvWFR5cGVQcm92aWRlci5ocHA+CiNpbmNsdWRlIDxjb20vc3VuL3N0YXIvbGFuZy9YQ29tcG9uZW50LmhwcD4KI2luY2x1ZGUgPGNvbS9zdW4vc3Rhci91aS9YVUlDb25maWd1cmF0aW9uUGVyc2lzdGVuY2UuaHBwPgojaW5jbHVkZSA8Y29tL3N1bi9zdGFyL3VpL1hVSUNvbmZpZ3VyYXRpb25TdG9yYWdlLmhwcD4KI2luY2x1ZGUgPGNvbS9zdW4vc3Rhci91aS9YVUlDb25maWd1cmF0aW9uLmhwcD4KI2luY2x1ZGUgPGNvbS9zdW4vc3Rhci91aS9YSW1hZ2VNYW5hZ2VyLmhwcD4KI2luY2x1ZGUgPGNvbS9zdW4vc3Rhci9sYW5nL1hJbml0aWFsaXphdGlvbi5ocHA+CiNpbmNsdWRlIDxjb20vc3VuL3N0YXIvdWkvQ29uZmlndXJhdGlvbkV2ZW50LmhwcD4KI2luY2x1ZGUgPGNvbS9zdW4vc3Rhci9lbWJlZC9YVHJhbnNhY3RlZE9iamVjdC5ocHA+CiNpbmNsdWRlIDxjb20vc3VuL3N0YXIvdWkvWEltYWdlTWFuYWdlci5ocHA+CgovL19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCi8vCW90aGVyIGluY2x1ZGVzCi8vX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KI2luY2x1ZGUgPGNwcHVoZWxwZXIvd2Vhay5oeHg+CiNpbmNsdWRlIDxjcHB1aGVscGVyL2ludGVyZmFjZWNvbnRhaW5lci5oeHg+CiNpbmNsdWRlIDxydGwvdXN0cmluZy5oeHg+CgojaW5jbHVkZSA8dmNsL2ltYWdlLmh4eD4KI2luY2x1ZGUgPHRvb2xzL2NvbG9yLmh4eD4KI2luY2x1ZGUgPHJ0bC9yZWYuaHh4PgoKI2luY2x1ZGUgPHZlY3Rvcj4KCm5hbWVzcGFjZSBmcmFtZXdvcmsKewogICAgY2xhc3MgQ21kSW1hZ2VMaXN0CiAgICB7CiAgICAgICAgcHVibGljOgogICAgICAgICAgICBDbWRJbWFnZUxpc3QoIGNvbnN0IDo6Y29tOjpzdW46OnN0YXI6OnVubzo6UmVmZXJlbmNlPCA6OmNvbTo6c3VuOjpzdGFyOjpsYW5nOjpYTXVsdGlTZXJ2aWNlRmFjdG9yeSA+JiByU2VydmljZU1hbmFnZXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgOjpydGw6Ok9VU3RyaW5nJiBhTW9kdWxlSWRlbnRpZmllciApOwoJCSAgICB2aXJ0dWFsIH5DbWRJbWFnZUxpc3QoKTsKICAgICAgICAgICAgCiAgICAgICAgICAgIHZpcnR1YWwgSW1hZ2UgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRJbWFnZUZyb21Db21tYW5kVVJMKCBzYWxfSW50MTYgbkltYWdlVHlwZSwgY29uc3QgcnRsOjpPVVN0cmluZyYgckNvbW1hbmRVUkwgKTsKICAgICAgICAgICAgdmlydHVhbCBib29sICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhc0ltYWdlKCBzYWxfSW50MTYgbkltYWdlVHlwZSwgY29uc3QgcnRsOjpPVVN0cmluZyYgckNvbW1hbmRVUkwgKTsKICAgICAgICAgICAgdmlydHVhbCA6OnN0ZDo6dmVjdG9yPCBydGw6Ok9VU3RyaW5nID4mIGdldEltYWdlTmFtZXMoKTsKICAgICAgICAgICAgdmlydHVhbCA6OnN0ZDo6dmVjdG9yPCBydGw6Ok9VU3RyaW5nID4mIGdldEltYWdlQ29tbWFuZE5hbWVzKCk7CgogICAgICAgIHByb3RlY3RlZDoKICAgICAgICAgICAgdm9pZCAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbXBsX2ZpbGxDb21tYW5kVG9JbWFnZU5hbWVNYXAoKTsKICAgICAgICAgICAgSW1hZ2VMaXN0KiAgICAgICAgICAgICAgICAgICAgICBpbXBsX2dldEltYWdlTGlzdCggc2FsX0ludDE2IG5JbWFnZVR5cGUgKTsKICAgICAgICAgICAgc3RkOjp2ZWN0b3I8IDo6cnRsOjpPVVN0cmluZyA+JiBpbXBsX2dldEltYWdlTmFtZVZlY3RvcigpOwogICAgICAgICAgICBzdGQ6OnZlY3RvcjwgOjpydGw6Ok9VU3RyaW5nID4mIGltcGxfZ2V0SW1hZ2VDb21tYW5kTmFtZVZlY3RvcigpOwoKICAgICAgICBwcml2YXRlOgogICAgICAgICAgICBzYWxfQm9vbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX2JWZWN0b3JJbml0OwogICAgICAgICAgICBydGw6Ok9VU3RyaW5nICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX2FNb2R1bGVJZGVudGlmaWVyOwogICAgICAgICAgICBJbWFnZUxpc3QqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3BJbWFnZUxpc3RbSW1hZ2VUeXBlX0NPVU5UXTsKICAgICAgICAgICAgQ29tbWFuZFRvSW1hZ2VOYW1lTWFwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9hQ29tbWFuZFRvSW1hZ2VOYW1lTWFwOwogICAgICAgICAgICA6OmNvbTo6c3VuOjpzdGFyOjp1bm86OlJlZmVyZW5jZTwgOjpjb206OnN1bjo6c3Rhcjo6bGFuZzo6WE11bHRpU2VydmljZUZhY3RvcnkgPiBtX3hTZXJ2aWNlTWFuYWdlcjsKICAgICAgICAgICAgOjpzdGQ6OnZlY3RvcjwgcnRsOjpPVVN0cmluZyA+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9hSW1hZ2VOYW1lVmVjdG9yOwogICAgICAgICAgICA6OnN0ZDo6dmVjdG9yPCBydGw6Ok9VU3RyaW5nID4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX2FJbWFnZUNvbW1hbmROYW1lVmVjdG9yOwogICAgICAgICAgICBzYWxfSW50MTYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX25TeW1ib2xzU3R5bGU7CiAgICB9OwoKICAgIGNsYXNzIEdsb2JhbEltYWdlTGlzdCA6IHB1YmxpYyBDbWRJbWFnZUxpc3QsIHB1YmxpYyBydGw6OklSZWZlcmVuY2UKICAgIHsKICAgICAgICBwdWJsaWM6CiAgICAgICAgICAgIEdsb2JhbEltYWdlTGlzdCggY29uc3QgOjpjb206OnN1bjo6c3Rhcjo6dW5vOjpSZWZlcmVuY2U8IDo6Y29tOjpzdW46OnN0YXI6Omxhbmc6OlhNdWx0aVNlcnZpY2VGYWN0b3J5ID4mIHJTZXJ2aWNlTWFuYWdlciApOwogICAgICAgICAgICB2aXJ0dWFsIH5HbG9iYWxJbWFnZUxpc3QoKTsKCiAgICAgICAgICAgIHZpcnR1YWwgSW1hZ2UgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRJbWFnZUZyb21Db21tYW5kVVJMKCBzYWxfSW50MTYgbkltYWdlVHlwZSwgY29uc3QgcnRsOjpPVVN0cmluZyYgckNvbW1hbmRVUkwgKTsKICAgICAgICAgICAgdmlydHVhbCBib29sICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhc0ltYWdlKCBzYWxfSW50MTYgbkltYWdlVHlwZSwgY29uc3QgcnRsOjpPVVN0cmluZyYgckNvbW1hbmRVUkwgKTsKICAgICAgICAgICAgdmlydHVhbCA6OnN0ZDo6dmVjdG9yPCBydGw6Ok9VU3RyaW5nID4mIGdldEltYWdlTmFtZXMoKTsKICAgICAgICAgICAgdmlydHVhbCA6OnN0ZDo6dmVjdG9yPCBydGw6Ok9VU3RyaW5nID4mIGdldEltYWdlQ29tbWFuZE5hbWVzKCk7CiAgICAgICAgICAgIAogICAgICAgICAgICAvLyDNUmVmZXJlbmNlCiAgICAgICAgICAgIHZpcnR1YWwgb3NsSW50ZXJsb2NrZWRDb3VudCBTQUxfQ0FMTCBhY3F1aXJlKCk7CgkgICAgICAgIHZpcnR1YWwgb3NsSW50ZXJsb2NrZWRDb3VudCBTQUxfQ0FMTCByZWxlYXNlKCk7CgogICAgICAgIHByaXZhdGU6CiAgICAgICAgICAgIG9zbEludGVybG9ja2VkQ291bnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fblJlZkNvdW50OwogICAgfTsKCiAgICBjbGFzcyBJbWFnZU1hbmFnZXJJbXBsIDogcHVibGljIFRocmVhZEhlbHBCYXNlCS8vIFN0cnVjdCBmb3IgcmlnaHQgaW5pdGFsaXphdGlvbiBvZiBtdXRleCBtZW1iZXIhIE11c3QgYmUgZmlyc3Qgb2YgYmFzZWNsYXNzZXMuCiAgICB7CiAgICAgICAgcHVibGljOgoKICAgICAgICAgICAgSW1hZ2VNYW5hZ2VySW1wbChjb25zdCBjb206OnN1bjo6c3Rhcjo6dW5vOjpSZWZlcmVuY2U8IGNvbTo6c3VuOjpzdGFyOjpsYW5nOjpYTXVsdGlTZXJ2aWNlRmFjdG9yeSA+JiB4U2VydmljZU1hbmFnZXIKICAgICAgICAgICAgICAgICxjb25zdCAgY29tOjpzdW46OnN0YXI6OnVubzo6UmVmZXJlbmNlPCBjb206OnN1bjo6c3Rhcjo6dW5vOjpYSW50ZXJmYWNlID4mIF94T3duZXIKICAgICAgICAgICAgICAgICxib29sIF9iVXNlR2xvYmFsKTsKICAgICAgICAgICAgfkltYWdlTWFuYWdlckltcGwoKTsKCiAgICAgICAgICAgIHZvaWQgZGlzcG9zZSgpOwogICAgICAgICAgICB2b2lkIGluaXRpYWxpemUoIGNvbnN0IDo6Y29tOjpzdW46OnN0YXI6OnVubzo6U2VxdWVuY2U8IDo6Y29tOjpzdW46OnN0YXI6OnVubzo6QW55ID4mIGFBcmd1bWVudHMgKTsKICAgICAgICAgICAgdm9pZCBhZGRFdmVudExpc3RlbmVyKCBjb25zdCA6OmNvbTo6c3VuOjpzdGFyOjp1bm86OlJlZmVyZW5jZTwgOjpjb206OnN1bjo6c3Rhcjo6bGFuZzo6WEV2ZW50TGlzdGVuZXIgPiYgeExpc3RlbmVyICkgdGhyb3cgKDo6Y29tOjpzdW46OnN0YXI6OnVubzo6UnVudGltZUV4Y2VwdGlvbik7CiAgICAgICAgICAgIHZvaWQgcmVtb3ZlRXZlbnRMaXN0ZW5lciggY29uc3QgOjpjb206OnN1bjo6c3Rhcjo6dW5vOjpSZWZlcmVuY2U8IDo6Y29tOjpzdW46OnN0YXI6Omxhbmc6OlhFdmVudExpc3RlbmVyID4mIGFMaXN0ZW5lciApIHRocm93ICg6OmNvbTo6c3VuOjpzdGFyOjp1bm86OlJ1bnRpbWVFeGNlcHRpb24pOwoKICAgICAgICAgICAgLy8gWEltYWdlTWFuYWdlcgogICAgICAgICAgICB2b2lkIHJlc2V0KCkgdGhyb3cgKDo6Y29tOjpzdW46OnN0YXI6OnVubzo6UnVudGltZUV4Y2VwdGlvbik7CiAgICAgICAgICAgIDo6Y29tOjpzdW46OnN0YXI6OnVubzo6U2VxdWVuY2U8IDo6cnRsOjpPVVN0cmluZyA+IGdldEFsbEltYWdlTmFtZXMoIDo6c2FsX0ludDE2IG5JbWFnZVR5cGUgKSB0aHJvdyAoOjpjb206OnN1bjo6c3Rhcjo6dW5vOjpSdW50aW1lRXhjZXB0aW9uKTsKICAgICAgICAgICAgOjpzYWxfQm9vbCBoYXNJbWFnZSggOjpzYWxfSW50MTYgbkltYWdlVHlwZSwgY29uc3QgOjpydGw6Ok9VU3RyaW5nJiBhQ29tbWFuZFVSTCApIHRocm93ICg6OmNvbTo6c3VuOjpzdGFyOjpsYW5nOjpJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24sIDo6Y29tOjpzdW46OnN0YXI6OnVubzo6UnVudGltZUV4Y2VwdGlvbik7CiAgICAgICAgICAgIDo6Y29tOjpzdW46OnN0YXI6OnVubzo6U2VxdWVuY2U8IDo6Y29tOjpzdW46OnN0YXI6OnVubzo6UmVmZXJlbmNlPCA6OmNvbTo6c3VuOjpzdGFyOjpncmFwaGljOjpYR3JhcGhpYyA+ID4gZ2V0SW1hZ2VzKCA6OnNhbF9JbnQxNiBuSW1hZ2VUeXBlLCBjb25zdCA6OmNvbTo6c3VuOjpzdGFyOjp1bm86OlNlcXVlbmNlPCA6OnJ0bDo6T1VTdHJpbmcgPiYgYUNvbW1hbmRVUkxTZXF1ZW5jZSApIHRocm93ICg6OmNvbTo6c3VuOjpzdGFyOjpsYW5nOjpJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24sIDo6Y29tOjpzdW46OnN0YXI6OnVubzo6UnVudGltZUV4Y2VwdGlvbik7CiAgICAgICAgICAgIHZvaWQgcmVwbGFjZUltYWdlcyggOjpzYWxfSW50MTYgbkltYWdlVHlwZSwgY29uc3QgOjpjb206OnN1bjo6c3Rhcjo6dW5vOjpTZXF1ZW5jZTwgOjpydGw6Ok9VU3RyaW5nID4mIGFDb21tYW5kVVJMU2VxdWVuY2UsIGNvbnN0IDo6Y29tOjpzdW46OnN0YXI6OnVubzo6U2VxdWVuY2U8IDo6Y29tOjpzdW46OnN0YXI6OnVubzo6UmVmZXJlbmNlPCA6OmNvbTo6c3VuOjpzdGFyOjpncmFwaGljOjpYR3JhcGhpYyA+ID4mIGFHcmFwaGljc1NlcXVlbmNlICkgdGhyb3cgKDo6Y29tOjpzdW46OnN0YXI6Omxhbmc6OklsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiwgOjpjb206OnN1bjo6c3Rhcjo6bGFuZzo6SWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiwgOjpjb206OnN1bjo6c3Rhcjo6dW5vOjpSdW50aW1lRXhjZXB0aW9uKTsKICAgICAgICAgICAgdm9pZCByZW1vdmVJbWFnZXMoIDo6c2FsX0ludDE2IG5JbWFnZVR5cGUsIGNvbnN0IDo6Y29tOjpzdW46OnN0YXI6OnVubzo6U2VxdWVuY2U8IDo6cnRsOjpPVVN0cmluZyA+JiBhUmVzb3VyY2VVUkxTZXF1ZW5jZSApIHRocm93ICg6OmNvbTo6c3VuOjpzdGFyOjpsYW5nOjpJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24sIDo6Y29tOjpzdW46OnN0YXI6Omxhbmc6OklsbGVnYWxBY2Nlc3NFeGNlcHRpb24sIDo6Y29tOjpzdW46OnN0YXI6OnVubzo6UnVudGltZUV4Y2VwdGlvbik7CiAgICAgICAgICAgIHZvaWQgaW5zZXJ0SW1hZ2VzKCA6OnNhbF9JbnQxNiBuSW1hZ2VUeXBlLCBjb25zdCA6OmNvbTo6c3VuOjpzdGFyOjp1bm86OlNlcXVlbmNlPCA6OnJ0bDo6T1VTdHJpbmcgPiYgYUNvbW1hbmRVUkxTZXF1ZW5jZSwgY29uc3QgOjpjb206OnN1bjo6c3Rhcjo6dW5vOjpTZXF1ZW5jZTwgOjpjb206OnN1bjo6c3Rhcjo6dW5vOjpSZWZlcmVuY2U8IDo6Y29tOjpzdW46OnN0YXI6OmdyYXBoaWM6OlhHcmFwaGljID4gPiYgYUdyYXBoaWNTZXF1ZW5jZSApIHRocm93ICg6OmNvbTo6c3VuOjpzdGFyOjpjb250YWluZXI6OkVsZW1lbnRFeGlzdEV4Y2VwdGlvbiwgOjpjb206OnN1bjo6c3Rhcjo6bGFuZzo6SWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uLCA6OmNvbTo6c3VuOjpzdGFyOjpsYW5nOjpJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uLCA6OmNvbTo6c3VuOjpzdGFyOjp1bm86OlJ1bnRpbWVFeGNlcHRpb24pOwoKICAgICAgICAgICAgLy8gWFVJQ29uZmlndXJhdGlvbgogICAgICAgICAgICB2b2lkIGFkZENvbmZpZ3VyYXRpb25MaXN0ZW5lciggY29uc3QgOjpjb206OnN1bjo6c3Rhcjo6dW5vOjpSZWZlcmVuY2U8IDo6Y29tOjpzdW46OnN0YXI6OnVpOjpYVUlDb25maWd1cmF0aW9uTGlzdGVuZXIgPiYgTGlzdGVuZXIgKSB0aHJvdyAoOjpjb206OnN1bjo6c3Rhcjo6dW5vOjpSdW50aW1lRXhjZXB0aW9uKTsKICAgICAgICAgICAgdm9pZCByZW1vdmVDb25maWd1cmF0aW9uTGlzdGVuZXIoIGNvbnN0IDo6Y29tOjpzdW46OnN0YXI6OnVubzo6UmVmZXJlbmNlPCA6OmNvbTo6c3VuOjpzdGFyOjp1aTo6WFVJQ29uZmlndXJhdGlvbkxpc3RlbmVyID4mIExpc3RlbmVyICkgdGhyb3cgKDo6Y29tOjpzdW46OnN0YXI6OnVubzo6UnVudGltZUV4Y2VwdGlvbik7CgogICAgICAgICAgICAvLyBYVUlDb25maWd1cmF0aW9uUGVyc2lzdGVuY2UKICAgICAgICAgICAgdm9pZCByZWxvYWQoKSB0aHJvdyAoOjpjb206OnN1bjo6c3Rhcjo6dW5vOjpFeGNlcHRpb24sIDo6Y29tOjpzdW46OnN0YXI6OnVubzo6UnVudGltZUV4Y2VwdGlvbik7CiAgICAgICAgICAgIHZvaWQgc3RvcmUoKSB0aHJvdyAoOjpjb206OnN1bjo6c3Rhcjo6dW5vOjpFeGNlcHRpb24sIDo6Y29tOjpzdW46OnN0YXI6OnVubzo6UnVudGltZUV4Y2VwdGlvbik7CiAgICAgICAgICAgIHZvaWQgc3RvcmVUb1N0b3JhZ2UoIGNvbnN0IDo6Y29tOjpzdW46OnN0YXI6OnVubzo6UmVmZXJlbmNlPCA6OmNvbTo6c3VuOjpzdGFyOjplbWJlZDo6WFN0b3JhZ2UgPiYgU3RvcmFnZSApIHRocm93ICg6OmNvbTo6c3VuOjpzdGFyOjp1bm86OkV4Y2VwdGlvbiwgOjpjb206OnN1bjo6c3Rhcjo6dW5vOjpSdW50aW1lRXhjZXB0aW9uKTsKICAgICAgICAgICAgc2FsX0Jvb2wgaXNNb2RpZmllZCgpIHRocm93ICg6OmNvbTo6c3VuOjpzdGFyOjp1bm86OlJ1bnRpbWVFeGNlcHRpb24pOwogICAgICAgICAgICBzYWxfQm9vbCBpc1JlYWRPbmx5KCkgdGhyb3cgKDo6Y29tOjpzdW46OnN0YXI6OnVubzo6UnVudGltZUV4Y2VwdGlvbik7CgogICAgICAgICAgICB2b2lkIGNsZWFyKCk7CgogICAgICAgICAgICB0eXBlZGVmIHN0ZDo6aGFzaF9tYXA8IHJ0bDo6T1VTdHJpbmcsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNhbF9Cb29sLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBydGw6Ok9VU3RyaW5nSGFzaCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6OnN0ZDo6ZXF1YWxfdG88IDo6cnRsOjpPVVN0cmluZyA+ID4gSW1hZ2VOYW1lTWFwOwogICAgICAgICAgICAKICAgICAgICAgICAgZW51bSBMYXllcgogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBMQVlFUl9ERUZBVUxULAogICAgICAgICAgICAgICAgTEFZRVJfVVNFUkRFRklORUQsCiAgICAgICAgICAgICAgICBMQVlFUl9DT1VOVAogICAgICAgICAgICB9OwogICAgICAgICAgICAKICAgICAgICAgICAgZW51bSBOb3RpZnlPcAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBOb3RpZnlPcF9SZW1vdmUsCiAgICAgICAgICAgICAgICBOb3RpZnlPcF9JbnNlcnQsCiAgICAgICAgICAgICAgICBOb3RpZnlPcF9SZXBsYWNlCiAgICAgICAgICAgIH07CgogICAgICAgICAgICB0eXBlZGVmIDo6c3RkOjp2ZWN0b3I8IDo6Y29tOjpzdW46OnN0YXI6OnVpOjpDb25maWd1cmF0aW9uRXZlbnQgPiBDb25maWdFdmVudE5vdGlmeUNvbnRhaW5lcjsKCiAgICAgICAgICAgIC8vIHByaXZhdGUgbWV0aG9kcwogICAgICAgICAgICB2b2lkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbXBsdHNfaW5pdGlhbGl6ZSgpOwogICAgICAgICAgICB2b2lkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbXBsdHNfbm90aWZ5Q29udGFpbmVyTGlzdGVuZXIoIGNvbnN0IDo6Y29tOjpzdW46OnN0YXI6OnVpOjpDb25maWd1cmF0aW9uRXZlbnQmIGFFdmVudCwgTm90aWZ5T3AgZU9wICk7CiAgICAgICAgICAgIEltYWdlTGlzdCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltcGx0c19nZXRVc2VySW1hZ2VMaXN0KCBJbWFnZVR5cGUgbkltYWdlVHlwZSApOwogICAgICAgICAgICBzYWxfQm9vbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbXBsdHNfbG9hZFVzZXJJbWFnZXMoIEltYWdlVHlwZSBuSW1hZ2VUeXBlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNvbTo6c3VuOjpzdGFyOjp1bm86OlJlZmVyZW5jZTwgY29tOjpzdW46OnN0YXI6OmVtYmVkOjpYU3RvcmFnZSA+JiB4VXNlckltYWdlU3RvcmFnZSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY29tOjpzdW46OnN0YXI6OnVubzo6UmVmZXJlbmNlPCBjb206OnN1bjo6c3Rhcjo6ZW1iZWQ6OlhTdG9yYWdlID4mIHhVc2VyQml0bWFwc1N0b3JhZ2UgKTsKICAgICAgICAgICAgc2FsX0Jvb2wgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW1wbHRzX3N0b3JlVXNlckltYWdlcyggSW1hZ2VUeXBlIG5JbWFnZVR5cGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNvbTo6c3VuOjpzdGFyOjp1bm86OlJlZmVyZW5jZTwgY29tOjpzdW46OnN0YXI6OmVtYmVkOjpYU3RvcmFnZSA+JiB4VXNlckltYWdlU3RvcmFnZSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNvbTo6c3VuOjpzdGFyOjp1bm86OlJlZmVyZW5jZTwgY29tOjpzdW46OnN0YXI6OmVtYmVkOjpYU3RvcmFnZSA+JiB4VXNlckJpdG1hcHNTdG9yYWdlICk7CiAgICAgICAgICAgIGNvbnN0IHJ0bDo6UmVmZXJlbmNlPCBHbG9iYWxJbWFnZUxpc3QgPiYgIGltcGx0c19nZXRHbG9iYWxJbWFnZUxpc3QoKTsKICAgICAgICAgICAgQ21kSW1hZ2VMaXN0KiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW1wbHRzX2dldERlZmF1bHRJbWFnZUxpc3QoKTsKCgogICAgICAgICAgICBjb206OnN1bjo6c3Rhcjo6dW5vOjpSZWZlcmVuY2U8IGNvbTo6c3VuOjpzdGFyOjplbWJlZDo6WFN0b3JhZ2UgPiAgICAgICAgICAgICAgIG1feFVzZXJDb25maWdTdG9yYWdlOwogICAgICAgICAgICBjb206OnN1bjo6c3Rhcjo6dW5vOjpSZWZlcmVuY2U8IGNvbTo6c3VuOjpzdGFyOjplbWJlZDo6WFN0b3JhZ2UgPiAgICAgICAgICAgICAgIG1feFVzZXJJbWFnZVN0b3JhZ2U7CiAgICAgICAgICAgIGNvbTo6c3VuOjpzdGFyOjp1bm86OlJlZmVyZW5jZTwgY29tOjpzdW46OnN0YXI6OmVtYmVkOjpYU3RvcmFnZSA+ICAgICAgICAgICAgICAgbV94VXNlckJpdG1hcHNTdG9yYWdlOwogICAgICAgICAgICBjb206OnN1bjo6c3Rhcjo6dW5vOjpSZWZlcmVuY2U8IGNvbTo6c3VuOjpzdGFyOjplbWJlZDo6WFRyYW5zYWN0ZWRPYmplY3QgPiAgICAgIG1feFVzZXJSb290Q29tbWl0OwogICAgICAgICAgICBjb206OnN1bjo6c3Rhcjo6dW5vOjpSZWZlcmVuY2U8IGNvbTo6c3VuOjpzdGFyOjpsYW5nOjpYTXVsdGlTZXJ2aWNlRmFjdG9yeSA+ICAgIG1feFNlcnZpY2VNYW5hZ2VyOwogICAgICAgICAgICBjb206OnN1bjo6c3Rhcjo6dW5vOjpSZWZlcmVuY2U8IGNvbTo6c3VuOjpzdGFyOjp1bm86OlhJbnRlcmZhY2UgPiAgICAgICAgICAgICAgIG1feE93bmVyOwogICAgICAgICAgICBydGw6OlJlZmVyZW5jZTwgR2xvYmFsSW1hZ2VMaXN0ID4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fcEdsb2JhbEltYWdlTGlzdDsKICAgICAgICAgICAgQ21kSW1hZ2VMaXN0KiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3BEZWZhdWx0SW1hZ2VMaXN0OwogICAgICAgICAgICBydGw6Ok9VU3RyaW5nICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fYVhNTFBvc3RmaXg7CiAgICAgICAgICAgIHJ0bDo6T1VTdHJpbmcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9hTW9kdWxlSWRlbnRpZmllcjsKICAgICAgICAgICAgcnRsOjpPVVN0cmluZyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX2FSZXNvdXJjZVN0cmluZzsgICAgICAgICAgICAKICAgICAgICAgICAgOjpjcHB1OjpPTXVsdGlUeXBlSW50ZXJmYWNlQ29udGFpbmVySGVscGVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX2FMaXN0ZW5lckNvbnRhaW5lcjsgICAvLy8gY29udGFpbmVyIGZvciBBTEwgTGlzdGVuZXIKICAgICAgICAgICAgSW1hZ2VMaXN0KiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3BVc2VySW1hZ2VMaXN0W0ltYWdlVHlwZV9DT1VOVF07CiAgICAgICAgICAgIGJvb2wgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9iVXNlckltYWdlTGlzdE1vZGlmaWVkW0ltYWdlVHlwZV9DT1VOVF07CiAgICAgICAgICAgIGJvb2wgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9iVXNlR2xvYmFsOwogICAgICAgICAgICBib29sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fYlJlYWRPbmx5OwogICAgICAgICAgICBib29sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fYkluaXRpYWxpemVkOwogICAgICAgICAgICBib29sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fYk1vZGlmaWVkOwogICAgICAgICAgICBib29sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fYkNvbmZpZ1JlYWQ7CiAgICAgICAgICAgIGJvb2wgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9iRGlzcG9zZWQ7ICAgICAgICAgICAgCiAgIH07Cn0KCiNlbmRpZiAvLyBfX0ZSQU1FV09SS19VSUNPTkZJR1VSQVRJT05fSU1BR0VNQU5BR0VSSU1QTF9IWFhfCg==