Ly8KLy8gqSBDb3B5cmlnaHQgSGVucmlrIFJhdm4gMjAwNAovLwovLyBVc2UsIG1vZGlmaWNhdGlvbiBhbmQgZGlzdHJpYnV0aW9uIGFyZSBzdWJqZWN0IHRvIHRoZSBCb29zdCBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMC4gCi8vIChTZWUgYWNjb21wYW55aW5nIGZpbGUgTElDRU5TRV8xXzAudHh0IG9yIGNvcHkgYXQgaHR0cDovL3d3dy5ib29zdC5vcmcvTElDRU5TRV8xXzAudHh0KQovLwoKdXNpbmcgU3lzdGVtOwp1c2luZyBTeXN0ZW0uSU87CnVzaW5nIFN5c3RlbS5SdW50aW1lLkludGVyb3BTZXJ2aWNlczsKdXNpbmcgU3lzdGVtLlRleHQ7CgoKbmFtZXNwYWNlIERvdFpMaWIKewoKICAgICNyZWdpb24gSW50ZXJuYWwgdHlwZXMKCiAgICAvLy8gPHN1bW1hcnk+CiAgICAvLy8gRGVmaW5lcyBjb25zdGFudHMgZm9yIHRoZSB2YXJpb3VzIGZsdXNoIHR5cGVzIHVzZWQgd2l0aCB6bGliCiAgICAvLy8gPC9zdW1tYXJ5PgogICAgaW50ZXJuYWwgZW51bSBGbHVzaFR5cGVzIAogICAgewogICAgICAgIE5vbmUsICBQYXJ0aWFsLCAgU3luYywgIEZ1bGwsICBGaW5pc2gsICBCbG9jawogICAgfQoKICAgICNyZWdpb24gWlN0cmVhbSBzdHJ1Y3R1cmUKICAgIC8vIGludGVybmFsIG1hcHBpbmcgb2YgdGhlIHpsaWIgenN0cmVhbSBzdHJ1Y3R1cmUgZm9yIG1hcnNoYWxsaW5nCiAgICBbU3RydWN0TGF5b3V0QXR0cmlidXRlKExheW91dEtpbmQuU2VxdWVudGlhbCwgUGFjaz00LCBTaXplPTAsIENoYXJTZXQ9Q2hhclNldC5BbnNpKV0KICAgIGludGVybmFsIHN0cnVjdCBaU3RyZWFtCiAgICB7CiAgICAgICAgcHVibGljIEludFB0ciBuZXh0X2luOwogICAgICAgIHB1YmxpYyB1aW50IGF2YWlsX2luOwogICAgICAgIHB1YmxpYyB1aW50IHRvdGFsX2luOwoKICAgICAgICBwdWJsaWMgSW50UHRyIG5leHRfb3V0OwogICAgICAgIHB1YmxpYyB1aW50IGF2YWlsX291dDsKICAgICAgICBwdWJsaWMgdWludCB0b3RhbF9vdXQ7CgogICAgICAgIFtNYXJzaGFsQXMoVW5tYW5hZ2VkVHlwZS5MUFN0cildCiAgICAgICAgc3RyaW5nIG1zZzsgCiAgICAgICAgdWludCBzdGF0ZTsKCiAgICAgICAgdWludCB6YWxsb2M7CiAgICAgICAgdWludCB6ZnJlZTsKICAgICAgICB1aW50IG9wYXF1ZTsKCiAgICAgICAgaW50IGRhdGFfdHlwZTsKICAgICAgICBwdWJsaWMgdWludCBhZGxlcjsKICAgICAgICB1aW50IHJlc2VydmVkOwogICAgfQoKICAgICNlbmRyZWdpb24KICAgIAogICAgI2VuZHJlZ2lvbgoKICAgICNyZWdpb24gUHVibGljIGVudW1zCiAgICAvLy8gPHN1bW1hcnk+CiAgICAvLy8gRGVmaW5lcyBjb25zdGFudHMgZm9yIHRoZSBhdmFpbGFibGUgY29tcHJlc3Npb24gbGV2ZWxzIGluIHpsaWIKICAgIC8vLyA8L3N1bW1hcnk+CiAgICBwdWJsaWMgZW51bSBDb21wcmVzc0xldmVsIDogaW50CiAgICB7CiAgICAgICAgLy8vIDxzdW1tYXJ5PgogICAgICAgIC8vLyBUaGUgZGVmYXVsdCBjb21wcmVzc2lvbiBsZXZlbCB3aXRoIGEgcmVhc29uYWJsZSBjb21wcm9taXNlIGJldHdlZW4gY29tcHJlc3Npb24gYW5kIHNwZWVkCiAgICAgICAgLy8vIDwvc3VtbWFyeT4KICAgICAgICBEZWZhdWx0ID0gLTEsICAgCiAgICAgICAgLy8vIDxzdW1tYXJ5PgogICAgICAgIC8vLyBObyBjb21wcmVzc2lvbiBhdCBhbGwuIFRoZSBkYXRhIGFyZSBwYXNzZWQgc3RyYWlnaHQgdGhyb3VnaC4KICAgICAgICAvLy8gPC9zdW1tYXJ5PgogICAgICAgIE5vbmUgPSAwLAogICAgICAgIC8vLyA8c3VtbWFyeT4KICAgICAgICAvLy8gVGhlIG1heGltdW0gY29tcHJlc3Npb24gcmF0ZSBhdmFpbGFibGUuCiAgICAgICAgLy8vIDwvc3VtbWFyeT4KICAgICAgICBCZXN0ID0gOSwgICAKICAgICAgICAvLy8gPHN1bW1hcnk+CiAgICAgICAgLy8vIFRoZSBmYXN0ZXN0IGF2YWlsYWJsZSBjb21wcmVzc2lvbiBsZXZlbC4KICAgICAgICAvLy8gPC9zdW1tYXJ5PgogICAgICAgIEZhc3Rlc3QgPSAxCiAgICB9CiAgICAjZW5kcmVnaW9uCgogICAgI3JlZ2lvbiBFeGNlcHRpb24gY2xhc3NlcwogICAgLy8vIDxzdW1tYXJ5PgogICAgLy8vIFRoZSBleGNlcHRpb24gdGhhdCBpcyB0aHJvd24gd2hlbiBhbiBlcnJvciBvY2N1cnMgb24gdGhlIHpsaWIgZGxsCiAgICAvLy8gPC9zdW1tYXJ5PgogICAgcHVibGljIGNsYXNzIFpMaWJFeGNlcHRpb24gOiBBcHBsaWNhdGlvbkV4Y2VwdGlvbgogICAgewogICAgICAgIC8vLyA8c3VtbWFyeT4KICAgICAgICAvLy8gSW5pdGlhbGl6ZXMgYSBuZXcgaW5zdGFuY2Ugb2YgdGhlIDxzZWUgY3JlZj0iWkxpYkV4Y2VwdGlvbiIvPiBjbGFzcyB3aXRoIGEgc3BlY2lmaWVkIAogICAgICAgIC8vLyBlcnJvciBtZXNzYWdlIGFuZCBlcnJvciBjb2RlCiAgICAgICAgLy8vIDwvc3VtbWFyeT4KICAgICAgICAvLy8gPHBhcmFtIG5hbWU9ImVycm9yQ29kZSI+VGhlIHpsaWIgZXJyb3IgY29kZSB0aGF0IGNhdXNlZCB0aGUgZXhjZXB0aW9uPC9wYXJhbT4KICAgICAgICAvLy8gPHBhcmFtIG5hbWU9Im1zZyI+QSBtZXNzYWdlIHRoYXQgKGhvcGVmdWxseSkgZGVzY3JpYmVzIHRoZSBlcnJvcjwvcGFyYW0+CiAgICAgICAgcHVibGljIFpMaWJFeGNlcHRpb24oaW50IGVycm9yQ29kZSwgc3RyaW5nIG1zZykgOiBiYXNlKFN0cmluZy5Gb3JtYXQoIlpMaWIgZXJyb3IgezB9IHsxfSIsIGVycm9yQ29kZSwgbXNnKSkKICAgICAgICB7CiAgICAgICAgfQoKICAgICAgICAvLy8gPHN1bW1hcnk+CiAgICAgICAgLy8vIEluaXRpYWxpemVzIGEgbmV3IGluc3RhbmNlIG9mIHRoZSA8c2VlIGNyZWY9IlpMaWJFeGNlcHRpb24iLz4gY2xhc3Mgd2l0aCBhIHNwZWNpZmllZCAKICAgICAgICAvLy8gZXJyb3IgY29kZQogICAgICAgIC8vLyA8L3N1bW1hcnk+CiAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJlcnJvckNvZGUiPlRoZSB6bGliIGVycm9yIGNvZGUgdGhhdCBjYXVzZWQgdGhlIGV4Y2VwdGlvbjwvcGFyYW0+CiAgICAgICAgcHVibGljIFpMaWJFeGNlcHRpb24oaW50IGVycm9yQ29kZSkgOiBiYXNlKFN0cmluZy5Gb3JtYXQoIlpMaWIgZXJyb3IgezB9IiwgZXJyb3JDb2RlKSkKICAgICAgICB7CiAgICAgICAgfQogICAgfQogICAgI2VuZHJlZ2lvbgoKICAgICNyZWdpb24gSW50ZXJmYWNlcwoKICAgIC8vLyA8c3VtbWFyeT4KICAgIC8vLyBEZWNsYXJlcyBtZXRob2RzIGFuZCBwcm9wZXJ0aWVzIHRoYXQgZW5hYmxlcyBhIHJ1bm5pbmcgY2hlY2tzdW0gdG8gYmUgY2FsY3VsYXRlZCAKICAgIC8vLyA8L3N1bW1hcnk+CiAgICBwdWJsaWMgaW50ZXJmYWNlIENoZWNrc3VtR2VuZXJhdG9yCiAgICB7CiAgICAgICAgLy8vIDxzdW1tYXJ5PgogICAgICAgIC8vLyBHZXRzIHRoZSBjdXJyZW50IHZhbHVlIG9mIHRoZSBjaGVja3N1bQogICAgICAgIC8vLyA8L3N1bW1hcnk+CiAgICAgICAgdWludCBWYWx1ZSB7IGdldDsgfQoKICAgICAgICAvLy8gPHN1bW1hcnk+CiAgICAgICAgLy8vIENsZWFycyB0aGUgY3VycmVudCBjaGVja3N1bSB0byAwCiAgICAgICAgLy8vIDwvc3VtbWFyeT4KICAgICAgICB2b2lkIFJlc2V0KCk7CgogICAgICAgIC8vLyA8c3VtbWFyeT4KICAgICAgICAvLy8gVXBkYXRlcyB0aGUgY3VycmVudCBjaGVja3N1bSB3aXRoIGFuIGFycmF5IG9mIGJ5dGVzCiAgICAgICAgLy8vIDwvc3VtbWFyeT4KICAgICAgICAvLy8gPHBhcmFtIG5hbWU9ImRhdGEiPlRoZSBkYXRhIHRvIHVwZGF0ZSB0aGUgY2hlY2tzdW0gd2l0aDwvcGFyYW0+CiAgICAgICAgdm9pZCBVcGRhdGUoYnl0ZVtdIGRhdGEpOwoKICAgICAgICAvLy8gPHN1bW1hcnk+CiAgICAgICAgLy8vIFVwZGF0ZXMgdGhlIGN1cnJlbnQgY2hlY2tzdW0gd2l0aCBwYXJ0IG9mIGFuIGFycmF5IG9mIGJ5dGVzCiAgICAgICAgLy8vIDwvc3VtbWFyeT4KICAgICAgICAvLy8gPHBhcmFtIG5hbWU9ImRhdGEiPlRoZSBkYXRhIHRvIHVwZGF0ZSB0aGUgY2hlY2tzdW0gd2l0aDwvcGFyYW0+CiAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJvZmZzZXQiPldoZXJlIGluIDxjPmRhdGE8L2M+IHRvIHN0YXJ0IHVwZGF0aW5nPC9wYXJhbT4KICAgICAgICAvLy8gPHBhcmFtIG5hbWU9ImNvdW50Ij5UaGUgbnVtYmVyIG9mIGJ5dGVzIGZyb20gPGM+ZGF0YTwvYz4gdG8gdXNlPC9wYXJhbT4KICAgICAgICAvLy8gPGV4Y2VwdGlvbiBjcmVmPSJBcmd1bWVudEV4Y2VwdGlvbiI+VGhlIHN1bSBvZiBvZmZzZXQgYW5kIGNvdW50IGlzIGxhcmdlciB0aGFuIHRoZSBsZW5ndGggb2YgPGM+ZGF0YTwvYz48L2V4Y2VwdGlvbj4KICAgICAgICAvLy8gPGV4Y2VwdGlvbiBjcmVmPSJBcmd1bWVudE51bGxFeGNlcHRpb24iPjxjPmRhdGE8L2M+IGlzIGEgbnVsbCByZWZlcmVuY2U8L2V4Y2VwdGlvbj4KICAgICAgICAvLy8gPGV4Y2VwdGlvbiBjcmVmPSJBcmd1bWVudE91dE9mUmFuZ2VFeGNlcHRpb24iPk9mZnNldCBvciBjb3VudCBpcyBuZWdhdGl2ZS48L2V4Y2VwdGlvbj4KICAgICAgICB2b2lkIFVwZGF0ZShieXRlW10gZGF0YSwgaW50IG9mZnNldCwgaW50IGNvdW50KTsKCiAgICAgICAgLy8vIDxzdW1tYXJ5PgogICAgICAgIC8vLyBVcGRhdGVzIHRoZSBjdXJyZW50IGNoZWNrc3VtIHdpdGggdGhlIGRhdGEgZnJvbSBhIHN0cmluZwogICAgICAgIC8vLyA8L3N1bW1hcnk+CiAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJkYXRhIj5UaGUgc3RyaW5nIHRvIHVwZGF0ZSB0aGUgY2hlY2tzdW0gd2l0aDwvcGFyYW0+CiAgICAgICAgLy8vIDxyZW1hcmtzPlRoZSBjaGFyYWN0ZXJzIGluIHRoZSBzdHJpbmcgYXJlIGNvbnZlcnRlZCBieSB0aGUgVVRGLTggZW5jb2Rpbmc8L3JlbWFya3M+CiAgICAgICAgdm9pZCBVcGRhdGUoc3RyaW5nIGRhdGEpOwoKICAgICAgICAvLy8gPHN1bW1hcnk+CiAgICAgICAgLy8vIFVwZGF0ZXMgdGhlIGN1cnJlbnQgY2hlY2tzdW0gd2l0aCB0aGUgZGF0YSBmcm9tIGEgc3RyaW5nLCB1c2luZyBhIHNwZWNpZmljIGVuY29kaW5nCiAgICAgICAgLy8vIDwvc3VtbWFyeT4KICAgICAgICAvLy8gPHBhcmFtIG5hbWU9ImRhdGEiPlRoZSBzdHJpbmcgdG8gdXBkYXRlIHRoZSBjaGVja3N1bSB3aXRoPC9wYXJhbT4KICAgICAgICAvLy8gPHBhcmFtIG5hbWU9ImVuY29kaW5nIj5UaGUgZW5jb2RpbmcgdG8gdXNlPC9wYXJhbT4KICAgICAgICB2b2lkIFVwZGF0ZShzdHJpbmcgZGF0YSwgRW5jb2RpbmcgZW5jb2RpbmcpOwogICAgfQoKCiAgICAvLy8gPHN1bW1hcnk+CiAgICAvLy8gUmVwcmVzZW50cyB0aGUgbWV0aG9kIHRoYXQgd2lsbCBiZSBjYWxsZWQgZnJvbSBhIGNvZGVjIHdoZW4gbmV3IGRhdGEKICAgIC8vLyBhcmUgYXZhaWxhYmxlLgogICAgLy8vIDwvc3VtbWFyeT4KICAgIC8vLyA8cGFyYW1yZWYgbmFtZT0iZGF0YSI+VGhlIGJ5dGUgYXJyYXkgY29udGFpbmluZyB0aGUgcHJvY2Vzc2VkIGRhdGE8L3BhcmFtcmVmPgogICAgLy8vIDxwYXJhbXJlZiBuYW1lPSJzdGFydEluZGV4Ij5UaGUgaW5kZXggb2YgdGhlIGZpcnN0IHByb2Nlc3NlZCBieXRlIGluIDxjPmRhdGE8L2M+PC9wYXJhbXJlZj4KICAgIC8vLyA8cGFyYW1yZWYgbmFtZT0iY291bnQiPlRoZSBudW1iZXIgb2YgcHJvY2Vzc2VkIGJ5dGVzIGF2YWlsYWJsZTwvcGFyYW1yZWY+CiAgICAvLy8gPHJlbWFya3M+T24gcmV0dXJuIGZyb20gdGhpcyBtZXRob2QsIHRoZSBkYXRhIG1heSBiZSBvdmVyd3JpdHRlbiwgc28gZ3JhYiBpdCB3aGlsZSB5b3UgY2FuLiAKICAgIC8vLyBZb3UgY2Fubm90IGFzc3VtZSB0aGF0IHN0YXJ0SW5kZXggd2lsbCBiZSB6ZXJvLgogICAgLy8vIDwvcmVtYXJrcz4KICAgIHB1YmxpYyBkZWxlZ2F0ZSB2b2lkIERhdGFBdmFpbGFibGVIYW5kbGVyKGJ5dGVbXSBkYXRhLCBpbnQgc3RhcnRJbmRleCwgaW50IGNvdW50KTsKCiAgICAvLy8gPHN1bW1hcnk+CiAgICAvLy8gRGVjbGFyZXMgbWV0aG9kcyBhbmQgZXZlbnRzIGZvciBpbXBsZW1lbnRpbmcgY29tcHJlc3NvcnMvZGVjb21wcmVzc29ycwogICAgLy8vIDwvc3VtbWFyeT4KICAgIHB1YmxpYyBpbnRlcmZhY2UgQ29kZWMKICAgIHsKICAgICAgICAvLy8gPHN1bW1hcnk+CiAgICAgICAgLy8vIE9jY3VycyB3aGVuIG1vcmUgcHJvY2Vzc2VkIGRhdGEgYXJlIGF2YWlsYWJsZS4KICAgICAgICAvLy8gPC9zdW1tYXJ5PgogICAgICAgIGV2ZW50IERhdGFBdmFpbGFibGVIYW5kbGVyIERhdGFBdmFpbGFibGU7CgogICAgICAgIC8vLyA8c3VtbWFyeT4KICAgICAgICAvLy8gQWRkcyBtb3JlIGRhdGEgdG8gdGhlIGNvZGVjIHRvIGJlIHByb2Nlc3NlZC4KICAgICAgICAvLy8gPC9zdW1tYXJ5PgogICAgICAgIC8vLyA8cGFyYW0gbmFtZT0iZGF0YSI+Qnl0ZSBhcnJheSBjb250YWluaW5nIHRoZSBkYXRhIHRvIGJlIGFkZGVkIHRvIHRoZSBjb2RlYzwvcGFyYW0+CiAgICAgICAgLy8vIDxyZW1hcmtzPkFkZGluZyBkYXRhIG1heSwgb3IgbWF5IG5vdCwgcmFpc2UgdGhlIDxjPkRhdGFBdmFpbGFibGU8L2M+IGV2ZW50PC9yZW1hcmtzPgogICAgICAgIHZvaWQgQWRkKGJ5dGVbXSBkYXRhKTsKCiAgICAgICAgLy8vIDxzdW1tYXJ5PgogICAgICAgIC8vLyBBZGRzIG1vcmUgZGF0YSB0byB0aGUgY29kZWMgdG8gYmUgcHJvY2Vzc2VkLgogICAgICAgIC8vLyA8L3N1bW1hcnk+CiAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJkYXRhIj5CeXRlIGFycmF5IGNvbnRhaW5pbmcgdGhlIGRhdGEgdG8gYmUgYWRkZWQgdG8gdGhlIGNvZGVjPC9wYXJhbT4KICAgICAgICAvLy8gPHBhcmFtIG5hbWU9Im9mZnNldCI+VGhlIGluZGV4IG9mIHRoZSBmaXJzdCBieXRlIHRvIGFkZCBmcm9tIDxjPmRhdGE8L2M+PC9wYXJhbT4KICAgICAgICAvLy8gPHBhcmFtIG5hbWU9ImNvdW50Ij5UaGUgbnVtYmVyIG9mIGJ5dGVzIHRvIGFkZDwvcGFyYW0+CiAgICAgICAgLy8vIDxyZW1hcmtzPkFkZGluZyBkYXRhIG1heSwgb3IgbWF5IG5vdCwgcmFpc2UgdGhlIDxjPkRhdGFBdmFpbGFibGU8L2M+IGV2ZW50PC9yZW1hcmtzPgogICAgICAgIHZvaWQgQWRkKGJ5dGVbXSBkYXRhLCBpbnQgb2Zmc2V0LCBpbnQgY291bnQpOwoKICAgICAgICAvLy8gPHN1bW1hcnk+CiAgICAgICAgLy8vIEZpbmlzaGVzIHVwIGFueSBwZW5kaW5nIGRhdGEgdGhhdCBuZWVkcyB0byBiZSBwcm9jZXNzZWQgYW5kIGhhbmRsZWQuCiAgICAgICAgLy8vIDwvc3VtbWFyeT4KICAgICAgICB2b2lkIEZpbmlzaCgpOwoKICAgICAgICAvLy8gPHN1bW1hcnk+CiAgICAgICAgLy8vIEdldHMgdGhlIGNoZWNrc3VtIG9mIHRoZSBkYXRhIHRoYXQgaGFzIGJlZW4gYWRkZWQgc28gZmFyCiAgICAgICAgLy8vIDwvc3VtbWFyeT4KICAgICAgICB1aW50IENoZWNrc3VtIHsgZ2V0OyB9CgoKICAgIH0KCiAgICAjZW5kcmVnaW9uCgogICAgI3JlZ2lvbiBDbGFzc2VzCiAgICAvLy8gPHN1bW1hcnk+CiAgICAvLy8gRW5jYXBzdWxhdGVzIGdlbmVyYWwgaW5mb3JtYXRpb24gYWJvdXQgdGhlIFpMaWIgbGlicmFyeQogICAgLy8vIDwvc3VtbWFyeT4KICAgIHB1YmxpYyBjbGFzcyBJbmZvCiAgICB7CiAgICAgICAgI3JlZ2lvbiBETEwgaW1wb3J0cwogICAgICAgIFtEbGxJbXBvcnQoIlpMSUIxLmRsbCIsIENhbGxpbmdDb252ZW50aW9uPUNhbGxpbmdDb252ZW50aW9uLkNkZWNsKV0KICAgICAgICBwcml2YXRlIHN0YXRpYyBleHRlcm4gdWludCB6bGliQ29tcGlsZUZsYWdzKCk7CgogICAgICAgIFtEbGxJbXBvcnQoIlpMSUIxLmRsbCIsIENhbGxpbmdDb252ZW50aW9uPUNhbGxpbmdDb252ZW50aW9uLkNkZWNsKV0KICAgICAgICBwcml2YXRlIHN0YXRpYyBleHRlcm4gc3RyaW5nIHpsaWJWZXJzaW9uKCk7CiAgICAgICAgI2VuZHJlZ2lvbgoKICAgICAgICAjcmVnaW9uIFByaXZhdGUgc3R1ZmYKICAgICAgICBwcml2YXRlIHVpbnQgX2ZsYWdzOwoKICAgICAgICAvLyBoZWxwZXIgZnVuY3Rpb24gdGhhdCB1bnBhY2tzIGEgYml0c2l6ZSBtYXNrCiAgICAgICAgcHJpdmF0ZSBzdGF0aWMgaW50IGJpdFNpemUodWludCBiaXRzKQogICAgICAgIHsKICAgICAgICAgICAgc3dpdGNoIChiaXRzKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBjYXNlIDA6IHJldHVybiAxNjsKICAgICAgICAgICAgICAgIGNhc2UgMTogcmV0dXJuIDMyOwogICAgICAgICAgICAgICAgY2FzZSAyOiByZXR1cm4gNjQ7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIC0xOwogICAgICAgIH0KICAgICAgICAjZW5kcmVnaW9uCgogICAgICAgIC8vLyA8c3VtbWFyeT4KICAgICAgICAvLy8gQ29uc3RydWN0cyBhbiBpbnN0YW5jZSBvZiB0aGUgPGM+SW5mbzwvYz4gY2xhc3MuCiAgICAgICAgLy8vIDwvc3VtbWFyeT4KICAgICAgICBwdWJsaWMgSW5mbygpCiAgICAgICAgewogICAgICAgICAgICBfZmxhZ3MgPSB6bGliQ29tcGlsZUZsYWdzKCk7CiAgICAgICAgfQoKICAgICAgICAvLy8gPHN1bW1hcnk+CiAgICAgICAgLy8vIFRydWUgaWYgdGhlIGxpYnJhcnkgaXMgY29tcGlsZWQgd2l0aCBkZWJ1ZyBpbmZvCiAgICAgICAgLy8vIDwvc3VtbWFyeT4KICAgICAgICBwdWJsaWMgYm9vbCBIYXNEZWJ1Z0luZm8geyBnZXQgeyByZXR1cm4gMCAhPSAoX2ZsYWdzICYgMHgxMDApOyB9IH0KCiAgICAgICAgLy8vIDxzdW1tYXJ5PgogICAgICAgIC8vLyBUcnVlIGlmIHRoZSBsaWJyYXJ5IGlzIGNvbXBpbGVkIHdpdGggYXNzZW1ibHkgb3B0aW1pemF0aW9ucwogICAgICAgIC8vLyA8L3N1bW1hcnk+CiAgICAgICAgcHVibGljIGJvb2wgVXNlc0Fzc2VtYmx5Q29kZSB7IGdldCB7IHJldHVybiAwICE9IChfZmxhZ3MgJiAweDIwMCk7IH0gfQoKICAgICAgICAvLy8gPHN1bW1hcnk+CiAgICAgICAgLy8vIEdldHMgdGhlIHNpemUgb2YgdGhlIHVuc2lnbmVkIGludCB0aGF0IHdhcyBjb21waWxlZCBpbnRvIFpsaWIKICAgICAgICAvLy8gPC9zdW1tYXJ5PgogICAgICAgIHB1YmxpYyBpbnQgU2l6ZU9mVUludCB7IGdldCB7IHJldHVybiBiaXRTaXplKF9mbGFncyAmIDMpOyB9IH0KCiAgICAgICAgLy8vIDxzdW1tYXJ5PgogICAgICAgIC8vLyBHZXRzIHRoZSBzaXplIG9mIHRoZSB1bnNpZ25lZCBsb25nIHRoYXQgd2FzIGNvbXBpbGVkIGludG8gWmxpYgogICAgICAgIC8vLyA8L3N1bW1hcnk+CiAgICAgICAgcHVibGljIGludCBTaXplT2ZVTG9uZyB7IGdldCB7IHJldHVybiBiaXRTaXplKChfZmxhZ3MgPj4gMikgJiAzKTsgfSB9CgogICAgICAgIC8vLyA8c3VtbWFyeT4KICAgICAgICAvLy8gR2V0cyB0aGUgc2l6ZSBvZiB0aGUgcG9pbnRlcnMgdGhhdCB3ZXJlIGNvbXBpbGVkIGludG8gWmxpYgogICAgICAgIC8vLyA8L3N1bW1hcnk+CiAgICAgICAgcHVibGljIGludCBTaXplT2ZQb2ludGVyIHsgZ2V0IHsgcmV0dXJuIGJpdFNpemUoKF9mbGFncyA+PiA0KSAmIDMpOyB9IH0KCiAgICAgICAgLy8vIDxzdW1tYXJ5PgogICAgICAgIC8vLyBHZXRzIHRoZSBzaXplIG9mIHRoZSB6X29mZl90IHR5cGUgdGhhdCB3YXMgY29tcGlsZWQgaW50byBabGliCiAgICAgICAgLy8vIDwvc3VtbWFyeT4KICAgICAgICBwdWJsaWMgaW50IFNpemVPZk9mZnNldCB7IGdldCB7IHJldHVybiBiaXRTaXplKChfZmxhZ3MgPj4gNikgJiAzKTsgfSB9CgogICAgICAgIC8vLyA8c3VtbWFyeT4KICAgICAgICAvLy8gR2V0cyB0aGUgdmVyc2lvbiBvZiBaTGliIGFzIGEgc3RyaW5nLCBlLmcuICIxLjIuMSIKICAgICAgICAvLy8gPC9zdW1tYXJ5PgogICAgICAgIHB1YmxpYyBzdGF0aWMgc3RyaW5nIFZlcnNpb24geyBnZXQgeyByZXR1cm4gemxpYlZlcnNpb24oKTsgfSB9CiAgICB9CgogICAgI2VuZHJlZ2lvbgoKfQo=