Ly89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLy8KLy8gU3BsYXNoQml0bWFwLmgKLy8KLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCi8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci8vCi8vIE1vZGlmaWVkIHVuZGVyIHRoZSBQb3BwbGVyIHByb2plY3QgLSBodHRwOi8vcG9wcGxlci5mcmVlZGVza3RvcC5vcmcKLy8KLy8gQWxsIGNoYW5nZXMgbWFkZSB1bmRlciB0aGUgUG9wcGxlciBwcm9qZWN0IHRvIHRoaXMgZmlsZSBhcmUgbGljZW5zZWQKLy8gdW5kZXIgR1BMIHZlcnNpb24gMiBvciBsYXRlcgovLwovLyBDb3B5cmlnaHQgKEMpIDIwMDcgSWxtYXJpIEhlaWtraW5lbiA8aWxtYXJpLmhlaWtraW5lbkBnbWFpbC5jb20+Ci8vIENvcHlyaWdodCAoQykgMjAwOSBTaGVuIExpYW5nIDxzaGVuemh1eGlAZ21haWwuY29tPgovLyBDb3B5cmlnaHQgKEMpIDIwMDkgQWxiZXJ0IEFzdGFscyBDaWQgPGFhY2lkQGtkZS5vcmc+Ci8vIENvcHlyaWdodCAoQykgMjAwOSBTdGVmYW4gVGhvbWFzIDx0aG9tYXNAZWxvYWQyNC5jb20+Ci8vIENvcHlyaWdodCAoQykgMjAxMCBBZHJpYW4gSm9obnNvbiA8YWpvaG5zb25AcmVkbmVvbi5jb20+Ci8vIENvcHlyaWdodCAoQykgMjAxMCBIYXJyeSBSb2JlcnRzIDxoYXJyeS5yb2JlcnRzQG1pZG5pZ2h0LWxhYnMub3JnPgovLyBDb3B5cmlnaHQgKEMpIDIwMTAgQ2hyaXN0aWFuIEZldWVyc+RuZ2VyIDxjZmV1ZXJzYWVuZ2VyQGdvb2dsZW1haWwuY29tPgovLwovLyBUbyBzZWUgYSBkZXNjcmlwdGlvbiBvZiB0aGUgY2hhbmdlcyBwbGVhc2Ugc2VlIHRoZSBDaGFuZ2Vsb2cgZmlsZSB0aGF0Ci8vIGNhbWUgd2l0aCB5b3VyIHRhcmJhbGwgb3IgdHlwZSBtYWtlIENoYW5nZUxvZyBpZiB5b3UgYXJlIGJ1aWxkaW5nIGZyb20gZ2l0Ci8vCi8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgojaWZuZGVmIFNQTEFTSEJJVE1BUF9ICiNkZWZpbmUgU1BMQVNIQklUTUFQX0gKCiNpZmRlZiBVU0VfR0NDX1BSQUdNQVMKI3ByYWdtYSBpbnRlcmZhY2UKI2VuZGlmCgojaW5jbHVkZSAiU3BsYXNoVHlwZXMuaCIKI2luY2x1ZGUgPHN0ZGlvLmg+CgpjbGFzcyBJbWdXcml0ZXI7CgovLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovLyBTcGxhc2hCaXRtYXAKLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCmNsYXNzIFNwbGFzaEJpdG1hcCB7CnB1YmxpYzoKCiAgLy8gQ3JlYXRlIGEgbmV3IGJpdG1hcC4gIEl0IHdpbGwgaGF2ZSA8d2lkdGhBPiB4IDxoZWlnaHRBPiBwaXhlbHMgaW4KICAvLyBjb2xvciBtb2RlIDxtb2RlQT4uICBSb3dzIHdpbGwgYmUgcGFkZGVkIG91dCB0byBhIG11bHRpcGxlIG9mCiAgLy8gPHJvd1BhZD4gYnl0ZXMuICBJZiA8dG9wRG93bj4gaXMgZmFsc2UsIHRoZSBiaXRtYXAgd2lsbCBiZSBzdG9yZWQKICAvLyB1cHNpZGUtZG93biwgaS5lLiwgd2l0aCB0aGUgbGFzdCByb3cgZmlyc3QgaW4gbWVtb3J5LgogIFNwbGFzaEJpdG1hcChpbnQgd2lkdGhBLCBpbnQgaGVpZ2h0QSwgaW50IHJvd1BhZCwKCSAgICAgICBTcGxhc2hDb2xvck1vZGUgbW9kZUEsIEdCb29sIGFscGhhQSwKCSAgICAgICBHQm9vbCB0b3BEb3duID0gZ1RydWUpOwoKICB+U3BsYXNoQml0bWFwKCk7CgogIGludCBnZXRXaWR0aCgpIHsgcmV0dXJuIHdpZHRoOyB9CiAgaW50IGdldEhlaWdodCgpIHsgcmV0dXJuIGhlaWdodDsgfQogIGludCBnZXRSb3dTaXplKCkgeyByZXR1cm4gcm93U2l6ZTsgfQogIGludCBnZXRBbHBoYVJvd1NpemUoKSB7IHJldHVybiB3aWR0aDsgfQogIGludCBnZXRSb3dQYWQoKSB7IHJldHVybiByb3dQYWQ7IH0KICBTcGxhc2hDb2xvck1vZGUgZ2V0TW9kZSgpIHsgcmV0dXJuIG1vZGU7IH0KICBTcGxhc2hDb2xvclB0ciBnZXREYXRhUHRyKCkgeyByZXR1cm4gZGF0YTsgfQogIEd1Y2hhciAqZ2V0QWxwaGFQdHIoKSB7IHJldHVybiBhbHBoYTsgfQoKICBTcGxhc2hFcnJvciB3cml0ZVBOTUZpbGUoY2hhciAqZmlsZU5hbWUpOwogIFNwbGFzaEVycm9yIHdyaXRlUE5NRmlsZShGSUxFICpmKTsKICAKICBTcGxhc2hFcnJvciB3cml0ZUltZ0ZpbGUoU3BsYXNoSW1hZ2VGaWxlRm9ybWF0IGZvcm1hdCwgY2hhciAqZmlsZU5hbWUsIGludCBoRFBJLCBpbnQgdkRQSSk7CiAgU3BsYXNoRXJyb3Igd3JpdGVJbWdGaWxlKFNwbGFzaEltYWdlRmlsZUZvcm1hdCBmb3JtYXQsIEZJTEUgKmYsIGludCBoRFBJLCBpbnQgdkRQSSk7CiAgU3BsYXNoRXJyb3Igd3JpdGVJbWdGaWxlKEltZ1dyaXRlciAqd3JpdGVyLCBGSUxFICpmLCBpbnQgaERQSSwgaW50IHZEUEkpOwoKICB2b2lkIGdldFBpeGVsKGludCB4LCBpbnQgeSwgU3BsYXNoQ29sb3JQdHIgcGl4ZWwpOwogIEd1Y2hhciBnZXRBbHBoYShpbnQgeCwgaW50IHkpOwoKcHJpdmF0ZToKCiAgaW50IHdpZHRoLCBoZWlnaHQ7CQkvLyBzaXplIG9mIGJpdG1hcAogIGludCByb3dQYWQ7CiAgaW50IHJvd1NpemU7CQkJLy8gc2l6ZSBvZiBvbmUgcm93IG9mIGRhdGEsIGluIGJ5dGVzCgkJCQkvLyAgIC0gbmVnYXRpdmUgZm9yIGJvdHRvbS11cCBiaXRtYXBzCiAgU3BsYXNoQ29sb3JNb2RlIG1vZGU7CQkvLyBjb2xvciBtb2RlCiAgU3BsYXNoQ29sb3JQdHIgZGF0YTsJCS8vIHBvaW50ZXIgdG8gcm93IHplcm8gb2YgdGhlIGNvbG9yIGRhdGEKICBHdWNoYXIgKmFscGhhOwkJLy8gcG9pbnRlciB0byByb3cgemVybyBvZiB0aGUgYWxwaGEgZGF0YQoJCQkJLy8gICAoYWx3YXlzIHRvcC1kb3duKQoKICBmcmllbmQgY2xhc3MgU3BsYXNoOwp9OwoKI2VuZGlmCg==