LyoKICogKEMpIENvcHlyaWdodCAyMDAyCiAqIERhbmllbCBFbmdzdHL2bSwgT21pY3JvbiBDZXRpIEFCLCBkYW5pZWxAb21pY3Jvbi5zZS4KICoKICogU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMKICogcHJvamVjdC4KICoKICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgogKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcwogKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgogKiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KICoKICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KICoKICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKICogTUEgMDIxMTEtMTMwNyBVU0EKICovCgpPVVRQVVRfRk9STUFUKCJlbGYzMi1pMzg2IiwgImVsZjMyLWkzODYiLCAiZWxmMzItaTM4NiIpCk9VVFBVVF9BUkNIKGkzODYpCkVOVFJZKF9zdGFydCkKClNFQ1RJT05TCnsKCS4gPSAweDM4N2MwMDAwOyAgICAgICAgICAgICAgICAgICAgIC8qIFdoZXJlIGJvb3Rjb2RlIGluIHRoZSBmbGFzaCBpcyBtYXBwZWQgKi8KCS50ZXh0ICA6IHsgKigudGV4dCk7IH0KCgkuID0gQUxJR04oNCk7Cgkucm9kYXRhIDogeyAqKC5yb2RhdGEpICooLnJvZGF0YS5zdHIxLjEpICooLnJvZGF0YS5zdHIxLjMyKSB9CgoJLiA9IDB4NDAwMDAwOyAJICAgICAgICAgICAgICAgICAgICAvKiBSYW0gZGF0YSBzZWdtZW50IHRvIHVzZSAqLwoJX2kzODZib290X3JvbWRhdGFfZGVzdCA9IEFCU09MVVRFKC4pOwoJLmRhdGEgOiBBVCAoIExPQURBRERSKC5yb2RhdGEpICsgU0laRU9GKC5yb2RhdGEpICkgeyAqKC5kYXRhKSB9CglfaTM4NmJvb3Rfcm9tZGF0YV9zdGFydCA9IExPQURBRERSKC5kYXRhKTsKCgkuID0gQUxJR04oNCk7CgkuZ290IDogQVQgKCBMT0FEQUREUiguZGF0YSkgKyBTSVpFT0YoLmRhdGEpICkgeyAqKC5nb3QpIH0KCV9pMzg2Ym9vdF9yb21kYXRhX3NpemUgPSBTSVpFT0YoLmRhdGEpICsgU0laRU9GKC5nb3QpOwoKCgkuID0gQUxJR04oNCk7CglfaTM4NmJvb3RfYnNzX3N0YXJ0ID0gQUJTT0xVVEUoLik7CgkuYnNzIDogeyAqKC5ic3MpIH0KCV9pMzg2Ym9vdF9ic3Nfc2l6ZSA9IFNJWkVPRiguYnNzKTsKCgoJLyogMTZiaXQgcmVhbG1vZGUgdHJhbXBvbGluZSBjb2RlICovCgkucmVhbG1vZGUgMHg3YzAgOiBBVCAoIExPQURBRERSKC5nb3QpICsgU0laRU9GKC5nb3QpICkgeyAqKC5yZWFsbW9kZSkgfQoKCV9pMzg2Ym9vdF9yZWFsbW9kZSA9IExPQURBRERSKC5yZWFsbW9kZSk7CglfaTM4NmJvb3RfcmVhbG1vZGVfc2l6ZSA9IFNJWkVPRigucmVhbG1vZGUpOwoKCS8qIDE2Yml0IEJJT1MgZW11bGF0aW9uIGNvZGUgKGp1c3QgZW5vdWdoIHRvIGJvb3QgTGludXgpICovCgkuYmlvcyAwIDogQVQgKCBMT0FEQUREUigucmVhbG1vZGUpICsgU0laRU9GKC5yZWFsbW9kZSkgKSB7ICooLmJpb3MpIH0KCglfaTM4NmJvb3RfYmlvcyA9IExPQURBRERSKC5iaW9zKTsKCV9pMzg2Ym9vdF9iaW9zX3NpemUgPSBTSVpFT0YoLmJpb3MpOwoKCiAgLiA9IC47CiAgX191X2Jvb3RfY21kX3N0YXJ0ID0gLjsKICAudV9ib290X2NtZCA6IHsgKigudV9ib290X2NtZCkgfQogIF9fdV9ib290X2NtZF9lbmQgPSAuOwoKCgkvKiBUaGUgbG9hZCBhZGRyZXNzZXMgYmVsb3cgYXNzdW1lcyB0aGF0IHRoZSBmbGFzaAoJICogd2lsbCBiZSBtYXBwZWQgc28gdGhhdCAweDM4N2YwMDAwID09IDB4ZmZmZjAwMDAKCSAqIGF0IHJlc2V0IHRpbWUKCSAqCgkgKiBUaGUgZmUwMCBhbmQgZmYwMCBvZmZzZXRzIG9mIHRoZSBzdGFydDMyIGFuZCBzdGFydDE2CgkgKiBzZWdtZW50cyBhcmUgYXJiaXRyYXJ5LCB0aGUganVzdCBoYXZlIHRvIGJlIG1hcHBlZAoJICogYXQgcmVzZXQgYW5kIHRoZSBjb2RlIGhhdmUgdG8gZml0LgoJICogVGhlIGZmZjAgb2Zmc2V0IG9mIHJlc2V0IGlzIGltcG9ydGFudCwgaG93ZXZlci4KCSAqLwoKCgkuID0gMHhmZmZmZmUwMDsKCS5zdGFydDMyIDogQVQgKDB4Mzg3ZmZlMDApIHsgKiguc3RhcnQzMik7IH0KCgkuID0gMHhmZjAwOwoJLnN0YXJ0MTYgOiBBVCAoMHgzODdmZmYwMCkgeyAqKC5zdGFydDE2KTsgfQoKCS4gPSAweGZmZjA7CgkucmVzZXQgOiBBVCAoMHgzODdmZmZmMCkgeyAqKC5yZXNldCk7IH0KCV9pMzg2Ym9vdF9lbmQgPSAoTE9BREFERFIoLnJlc2V0KSArIFNJWkVPRigucmVzZXQpICk7Cn0K