Ly8KLy8gqSBDb3B5cmlnaHQgSGVucmlrIFJhdm4gMjAwNAovLwovLyBVc2UsIG1vZGlmaWNhdGlvbiBhbmQgZGlzdHJpYnV0aW9uIGFyZSBzdWJqZWN0IHRvIHRoZSBCb29zdCBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMC4KLy8gKFNlZSBhY2NvbXBhbnlpbmcgZmlsZSBMSUNFTlNFXzFfMC50eHQgb3IgY29weSBhdCBodHRwOi8vd3d3LmJvb3N0Lm9yZy9MSUNFTlNFXzFfMC50eHQpCi8vCgp1c2luZyBTeXN0ZW07CnVzaW5nIFN5c3RlbS5JTzsKdXNpbmcgU3lzdGVtLlJ1bnRpbWUuSW50ZXJvcFNlcnZpY2VzOwp1c2luZyBTeXN0ZW0uVGV4dDsKCgpuYW1lc3BhY2UgRG90WkxpYgp7CgogICAgI3JlZ2lvbiBJbnRlcm5hbCB0eXBlcwoKICAgIC8vLyA8c3VtbWFyeT4KICAgIC8vLyBEZWZpbmVzIGNvbnN0YW50cyBmb3IgdGhlIHZhcmlvdXMgZmx1c2ggdHlwZXMgdXNlZCB3aXRoIHpsaWIKICAgIC8vLyA8L3N1bW1hcnk+CiAgICBpbnRlcm5hbCBlbnVtIEZsdXNoVHlwZXMKICAgIHsKICAgICAgICBOb25lLCAgUGFydGlhbCwgIFN5bmMsICBGdWxsLCAgRmluaXNoLCAgQmxvY2sKICAgIH0KCiAgICAjcmVnaW9uIFpTdHJlYW0gc3RydWN0dXJlCiAgICAvLyBpbnRlcm5hbCBtYXBwaW5nIG9mIHRoZSB6bGliIHpzdHJlYW0gc3RydWN0dXJlIGZvciBtYXJzaGFsbGluZwogICAgW1N0cnVjdExheW91dEF0dHJpYnV0ZShMYXlvdXRLaW5kLlNlcXVlbnRpYWwsIFBhY2s9NCwgU2l6ZT0wLCBDaGFyU2V0PUNoYXJTZXQuQW5zaSldCiAgICBpbnRlcm5hbCBzdHJ1Y3QgWlN0cmVhbQogICAgewogICAgICAgIHB1YmxpYyBJbnRQdHIgbmV4dF9pbjsKICAgICAgICBwdWJsaWMgdWludCBhdmFpbF9pbjsKICAgICAgICBwdWJsaWMgdWludCB0b3RhbF9pbjsKCiAgICAgICAgcHVibGljIEludFB0ciBuZXh0X291dDsKICAgICAgICBwdWJsaWMgdWludCBhdmFpbF9vdXQ7CiAgICAgICAgcHVibGljIHVpbnQgdG90YWxfb3V0OwoKICAgICAgICBbTWFyc2hhbEFzKFVubWFuYWdlZFR5cGUuTFBTdHIpXQogICAgICAgIHN0cmluZyBtc2c7CiAgICAgICAgdWludCBzdGF0ZTsKCiAgICAgICAgdWludCB6YWxsb2M7CiAgICAgICAgdWludCB6ZnJlZTsKICAgICAgICB1aW50IG9wYXF1ZTsKCiAgICAgICAgaW50IGRhdGFfdHlwZTsKICAgICAgICBwdWJsaWMgdWludCBhZGxlcjsKICAgICAgICB1aW50IHJlc2VydmVkOwogICAgfQoKICAgICNlbmRyZWdpb24KCiAgICAjZW5kcmVnaW9uCgogICAgI3JlZ2lvbiBQdWJsaWMgZW51bXMKICAgIC8vLyA8c3VtbWFyeT4KICAgIC8vLyBEZWZpbmVzIGNvbnN0YW50cyBmb3IgdGhlIGF2YWlsYWJsZSBjb21wcmVzc2lvbiBsZXZlbHMgaW4gemxpYgogICAgLy8vIDwvc3VtbWFyeT4KICAgIHB1YmxpYyBlbnVtIENvbXByZXNzTGV2ZWwgOiBpbnQKICAgIHsKICAgICAgICAvLy8gPHN1bW1hcnk+CiAgICAgICAgLy8vIFRoZSBkZWZhdWx0IGNvbXByZXNzaW9uIGxldmVsIHdpdGggYSByZWFzb25hYmxlIGNvbXByb21pc2UgYmV0d2VlbiBjb21wcmVzc2lvbiBhbmQgc3BlZWQKICAgICAgICAvLy8gPC9zdW1tYXJ5PgogICAgICAgIERlZmF1bHQgPSAtMSwKICAgICAgICAvLy8gPHN1bW1hcnk+CiAgICAgICAgLy8vIE5vIGNvbXByZXNzaW9uIGF0IGFsbC4gVGhlIGRhdGEgYXJlIHBhc3NlZCBzdHJhaWdodCB0aHJvdWdoLgogICAgICAgIC8vLyA8L3N1bW1hcnk+CiAgICAgICAgTm9uZSA9IDAsCiAgICAgICAgLy8vIDxzdW1tYXJ5PgogICAgICAgIC8vLyBUaGUgbWF4aW11bSBjb21wcmVzc2lvbiByYXRlIGF2YWlsYWJsZS4KICAgICAgICAvLy8gPC9zdW1tYXJ5PgogICAgICAgIEJlc3QgPSA5LAogICAgICAgIC8vLyA8c3VtbWFyeT4KICAgICAgICAvLy8gVGhlIGZhc3Rlc3QgYXZhaWxhYmxlIGNvbXByZXNzaW9uIGxldmVsLgogICAgICAgIC8vLyA8L3N1bW1hcnk+CiAgICAgICAgRmFzdGVzdCA9IDEKICAgIH0KICAgICNlbmRyZWdpb24KCiAgICAjcmVnaW9uIEV4Y2VwdGlvbiBjbGFzc2VzCiAgICAvLy8gPHN1bW1hcnk+CiAgICAvLy8gVGhlIGV4Y2VwdGlvbiB0aGF0IGlzIHRocm93biB3aGVuIGFuIGVycm9yIG9jY3VycyBvbiB0aGUgemxpYiBkbGwKICAgIC8vLyA8L3N1bW1hcnk+CiAgICBwdWJsaWMgY2xhc3MgWkxpYkV4Y2VwdGlvbiA6IEFwcGxpY2F0aW9uRXhjZXB0aW9uCiAgICB7CiAgICAgICAgLy8vIDxzdW1tYXJ5PgogICAgICAgIC8vLyBJbml0aWFsaXplcyBhIG5ldyBpbnN0YW5jZSBvZiB0aGUgPHNlZSBjcmVmPSJaTGliRXhjZXB0aW9uIi8+IGNsYXNzIHdpdGggYSBzcGVjaWZpZWQKICAgICAgICAvLy8gZXJyb3IgbWVzc2FnZSBhbmQgZXJyb3IgY29kZQogICAgICAgIC8vLyA8L3N1bW1hcnk+CiAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJlcnJvckNvZGUiPlRoZSB6bGliIGVycm9yIGNvZGUgdGhhdCBjYXVzZWQgdGhlIGV4Y2VwdGlvbjwvcGFyYW0+CiAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJtc2ciPkEgbWVzc2FnZSB0aGF0IChob3BlZnVsbHkpIGRlc2NyaWJlcyB0aGUgZXJyb3I8L3BhcmFtPgogICAgICAgIHB1YmxpYyBaTGliRXhjZXB0aW9uKGludCBlcnJvckNvZGUsIHN0cmluZyBtc2cpIDogYmFzZShTdHJpbmcuRm9ybWF0KCJaTGliIGVycm9yIHswfSB7MX0iLCBlcnJvckNvZGUsIG1zZykpCiAgICAgICAgewogICAgICAgIH0KCiAgICAgICAgLy8vIDxzdW1tYXJ5PgogICAgICAgIC8vLyBJbml0aWFsaXplcyBhIG5ldyBpbnN0YW5jZSBvZiB0aGUgPHNlZSBjcmVmPSJaTGliRXhjZXB0aW9uIi8+IGNsYXNzIHdpdGggYSBzcGVjaWZpZWQKICAgICAgICAvLy8gZXJyb3IgY29kZQogICAgICAgIC8vLyA8L3N1bW1hcnk+CiAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJlcnJvckNvZGUiPlRoZSB6bGliIGVycm9yIGNvZGUgdGhhdCBjYXVzZWQgdGhlIGV4Y2VwdGlvbjwvcGFyYW0+CiAgICAgICAgcHVibGljIFpMaWJFeGNlcHRpb24oaW50IGVycm9yQ29kZSkgOiBiYXNlKFN0cmluZy5Gb3JtYXQoIlpMaWIgZXJyb3IgezB9IiwgZXJyb3JDb2RlKSkKICAgICAgICB7CiAgICAgICAgfQogICAgfQogICAgI2VuZHJlZ2lvbgoKICAgICNyZWdpb24gSW50ZXJmYWNlcwoKICAgIC8vLyA8c3VtbWFyeT4KICAgIC8vLyBEZWNsYXJlcyBtZXRob2RzIGFuZCBwcm9wZXJ0aWVzIHRoYXQgZW5hYmxlcyBhIHJ1bm5pbmcgY2hlY2tzdW0gdG8gYmUgY2FsY3VsYXRlZAogICAgLy8vIDwvc3VtbWFyeT4KICAgIHB1YmxpYyBpbnRlcmZhY2UgQ2hlY2tzdW1HZW5lcmF0b3IKICAgIHsKICAgICAgICAvLy8gPHN1bW1hcnk+CiAgICAgICAgLy8vIEdldHMgdGhlIGN1cnJlbnQgdmFsdWUgb2YgdGhlIGNoZWNrc3VtCiAgICAgICAgLy8vIDwvc3VtbWFyeT4KICAgICAgICB1aW50IFZhbHVlIHsgZ2V0OyB9CgogICAgICAgIC8vLyA8c3VtbWFyeT4KICAgICAgICAvLy8gQ2xlYXJzIHRoZSBjdXJyZW50IGNoZWNrc3VtIHRvIDAKICAgICAgICAvLy8gPC9zdW1tYXJ5PgogICAgICAgIHZvaWQgUmVzZXQoKTsKCiAgICAgICAgLy8vIDxzdW1tYXJ5PgogICAgICAgIC8vLyBVcGRhdGVzIHRoZSBjdXJyZW50IGNoZWNrc3VtIHdpdGggYW4gYXJyYXkgb2YgYnl0ZXMKICAgICAgICAvLy8gPC9zdW1tYXJ5PgogICAgICAgIC8vLyA8cGFyYW0gbmFtZT0iZGF0YSI+VGhlIGRhdGEgdG8gdXBkYXRlIHRoZSBjaGVja3N1bSB3aXRoPC9wYXJhbT4KICAgICAgICB2b2lkIFVwZGF0ZShieXRlW10gZGF0YSk7CgogICAgICAgIC8vLyA8c3VtbWFyeT4KICAgICAgICAvLy8gVXBkYXRlcyB0aGUgY3VycmVudCBjaGVja3N1bSB3aXRoIHBhcnQgb2YgYW4gYXJyYXkgb2YgYnl0ZXMKICAgICAgICAvLy8gPC9zdW1tYXJ5PgogICAgICAgIC8vLyA8cGFyYW0gbmFtZT0iZGF0YSI+VGhlIGRhdGEgdG8gdXBkYXRlIHRoZSBjaGVja3N1bSB3aXRoPC9wYXJhbT4KICAgICAgICAvLy8gPHBhcmFtIG5hbWU9Im9mZnNldCI+V2hlcmUgaW4gPGM+ZGF0YTwvYz4gdG8gc3RhcnQgdXBkYXRpbmc8L3BhcmFtPgogICAgICAgIC8vLyA8cGFyYW0gbmFtZT0iY291bnQiPlRoZSBudW1iZXIgb2YgYnl0ZXMgZnJvbSA8Yz5kYXRhPC9jPiB0byB1c2U8L3BhcmFtPgogICAgICAgIC8vLyA8ZXhjZXB0aW9uIGNyZWY9IkFyZ3VtZW50RXhjZXB0aW9uIj5UaGUgc3VtIG9mIG9mZnNldCBhbmQgY291bnQgaXMgbGFyZ2VyIHRoYW4gdGhlIGxlbmd0aCBvZiA8Yz5kYXRhPC9jPjwvZXhjZXB0aW9uPgogICAgICAgIC8vLyA8ZXhjZXB0aW9uIGNyZWY9IkFyZ3VtZW50TnVsbEV4Y2VwdGlvbiI+PGM+ZGF0YTwvYz4gaXMgYSBudWxsIHJlZmVyZW5jZTwvZXhjZXB0aW9uPgogICAgICAgIC8vLyA8ZXhjZXB0aW9uIGNyZWY9IkFyZ3VtZW50T3V0T2ZSYW5nZUV4Y2VwdGlvbiI+T2Zmc2V0IG9yIGNvdW50IGlzIG5lZ2F0aXZlLjwvZXhjZXB0aW9uPgogICAgICAgIHZvaWQgVXBkYXRlKGJ5dGVbXSBkYXRhLCBpbnQgb2Zmc2V0LCBpbnQgY291bnQpOwoKICAgICAgICAvLy8gPHN1bW1hcnk+CiAgICAgICAgLy8vIFVwZGF0ZXMgdGhlIGN1cnJlbnQgY2hlY2tzdW0gd2l0aCB0aGUgZGF0YSBmcm9tIGEgc3RyaW5nCiAgICAgICAgLy8vIDwvc3VtbWFyeT4KICAgICAgICAvLy8gPHBhcmFtIG5hbWU9ImRhdGEiPlRoZSBzdHJpbmcgdG8gdXBkYXRlIHRoZSBjaGVja3N1bSB3aXRoPC9wYXJhbT4KICAgICAgICAvLy8gPHJlbWFya3M+VGhlIGNoYXJhY3RlcnMgaW4gdGhlIHN0cmluZyBhcmUgY29udmVydGVkIGJ5IHRoZSBVVEYtOCBlbmNvZGluZzwvcmVtYXJrcz4KICAgICAgICB2b2lkIFVwZGF0ZShzdHJpbmcgZGF0YSk7CgogICAgICAgIC8vLyA8c3VtbWFyeT4KICAgICAgICAvLy8gVXBkYXRlcyB0aGUgY3VycmVudCBjaGVja3N1bSB3aXRoIHRoZSBkYXRhIGZyb20gYSBzdHJpbmcsIHVzaW5nIGEgc3BlY2lmaWMgZW5jb2RpbmcKICAgICAgICAvLy8gPC9zdW1tYXJ5PgogICAgICAgIC8vLyA8cGFyYW0gbmFtZT0iZGF0YSI+VGhlIHN0cmluZyB0byB1cGRhdGUgdGhlIGNoZWNrc3VtIHdpdGg8L3BhcmFtPgogICAgICAgIC8vLyA8cGFyYW0gbmFtZT0iZW5jb2RpbmciPlRoZSBlbmNvZGluZyB0byB1c2U8L3BhcmFtPgogICAgICAgIHZvaWQgVXBkYXRlKHN0cmluZyBkYXRhLCBFbmNvZGluZyBlbmNvZGluZyk7CiAgICB9CgoKICAgIC8vLyA8c3VtbWFyeT4KICAgIC8vLyBSZXByZXNlbnRzIHRoZSBtZXRob2QgdGhhdCB3aWxsIGJlIGNhbGxlZCBmcm9tIGEgY29kZWMgd2hlbiBuZXcgZGF0YQogICAgLy8vIGFyZSBhdmFpbGFibGUuCiAgICAvLy8gPC9zdW1tYXJ5PgogICAgLy8vIDxwYXJhbXJlZiBuYW1lPSJkYXRhIj5UaGUgYnl0ZSBhcnJheSBjb250YWluaW5nIHRoZSBwcm9jZXNzZWQgZGF0YTwvcGFyYW1yZWY+CiAgICAvLy8gPHBhcmFtcmVmIG5hbWU9InN0YXJ0SW5kZXgiPlRoZSBpbmRleCBvZiB0aGUgZmlyc3QgcHJvY2Vzc2VkIGJ5dGUgaW4gPGM+ZGF0YTwvYz48L3BhcmFtcmVmPgogICAgLy8vIDxwYXJhbXJlZiBuYW1lPSJjb3VudCI+VGhlIG51bWJlciBvZiBwcm9jZXNzZWQgYnl0ZXMgYXZhaWxhYmxlPC9wYXJhbXJlZj4KICAgIC8vLyA8cmVtYXJrcz5PbiByZXR1cm4gZnJvbSB0aGlzIG1ldGhvZCwgdGhlIGRhdGEgbWF5IGJlIG92ZXJ3cml0dGVuLCBzbyBncmFiIGl0IHdoaWxlIHlvdSBjYW4uCiAgICAvLy8gWW91IGNhbm5vdCBhc3N1bWUgdGhhdCBzdGFydEluZGV4IHdpbGwgYmUgemVyby4KICAgIC8vLyA8L3JlbWFya3M+CiAgICBwdWJsaWMgZGVsZWdhdGUgdm9pZCBEYXRhQXZhaWxhYmxlSGFuZGxlcihieXRlW10gZGF0YSwgaW50IHN0YXJ0SW5kZXgsIGludCBjb3VudCk7CgogICAgLy8vIDxzdW1tYXJ5PgogICAgLy8vIERlY2xhcmVzIG1ldGhvZHMgYW5kIGV2ZW50cyBmb3IgaW1wbGVtZW50aW5nIGNvbXByZXNzb3JzL2RlY29tcHJlc3NvcnMKICAgIC8vLyA8L3N1bW1hcnk+CiAgICBwdWJsaWMgaW50ZXJmYWNlIENvZGVjCiAgICB7CiAgICAgICAgLy8vIDxzdW1tYXJ5PgogICAgICAgIC8vLyBPY2N1cnMgd2hlbiBtb3JlIHByb2Nlc3NlZCBkYXRhIGFyZSBhdmFpbGFibGUuCiAgICAgICAgLy8vIDwvc3VtbWFyeT4KICAgICAgICBldmVudCBEYXRhQXZhaWxhYmxlSGFuZGxlciBEYXRhQXZhaWxhYmxlOwoKICAgICAgICAvLy8gPHN1bW1hcnk+CiAgICAgICAgLy8vIEFkZHMgbW9yZSBkYXRhIHRvIHRoZSBjb2RlYyB0byBiZSBwcm9jZXNzZWQuCiAgICAgICAgLy8vIDwvc3VtbWFyeT4KICAgICAgICAvLy8gPHBhcmFtIG5hbWU9ImRhdGEiPkJ5dGUgYXJyYXkgY29udGFpbmluZyB0aGUgZGF0YSB0byBiZSBhZGRlZCB0byB0aGUgY29kZWM8L3BhcmFtPgogICAgICAgIC8vLyA8cmVtYXJrcz5BZGRpbmcgZGF0YSBtYXksIG9yIG1heSBub3QsIHJhaXNlIHRoZSA8Yz5EYXRhQXZhaWxhYmxlPC9jPiBldmVudDwvcmVtYXJrcz4KICAgICAgICB2b2lkIEFkZChieXRlW10gZGF0YSk7CgogICAgICAgIC8vLyA8c3VtbWFyeT4KICAgICAgICAvLy8gQWRkcyBtb3JlIGRhdGEgdG8gdGhlIGNvZGVjIHRvIGJlIHByb2Nlc3NlZC4KICAgICAgICAvLy8gPC9zdW1tYXJ5PgogICAgICAgIC8vLyA8cGFyYW0gbmFtZT0iZGF0YSI+Qnl0ZSBhcnJheSBjb250YWluaW5nIHRoZSBkYXRhIHRvIGJlIGFkZGVkIHRvIHRoZSBjb2RlYzwvcGFyYW0+CiAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJvZmZzZXQiPlRoZSBpbmRleCBvZiB0aGUgZmlyc3QgYnl0ZSB0byBhZGQgZnJvbSA8Yz5kYXRhPC9jPjwvcGFyYW0+CiAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJjb3VudCI+VGhlIG51bWJlciBvZiBieXRlcyB0byBhZGQ8L3BhcmFtPgogICAgICAgIC8vLyA8cmVtYXJrcz5BZGRpbmcgZGF0YSBtYXksIG9yIG1heSBub3QsIHJhaXNlIHRoZSA8Yz5EYXRhQXZhaWxhYmxlPC9jPiBldmVudDwvcmVtYXJrcz4KICAgICAgICB2b2lkIEFkZChieXRlW10gZGF0YSwgaW50IG9mZnNldCwgaW50IGNvdW50KTsKCiAgICAgICAgLy8vIDxzdW1tYXJ5PgogICAgICAgIC8vLyBGaW5pc2hlcyB1cCBhbnkgcGVuZGluZyBkYXRhIHRoYXQgbmVlZHMgdG8gYmUgcHJvY2Vzc2VkIGFuZCBoYW5kbGVkLgogICAgICAgIC8vLyA8L3N1bW1hcnk+CiAgICAgICAgdm9pZCBGaW5pc2goKTsKCiAgICAgICAgLy8vIDxzdW1tYXJ5PgogICAgICAgIC8vLyBHZXRzIHRoZSBjaGVja3N1bSBvZiB0aGUgZGF0YSB0aGF0IGhhcyBiZWVuIGFkZGVkIHNvIGZhcgogICAgICAgIC8vLyA8L3N1bW1hcnk+CiAgICAgICAgdWludCBDaGVja3N1bSB7IGdldDsgfQoKCiAgICB9CgogICAgI2VuZHJlZ2lvbgoKICAgICNyZWdpb24gQ2xhc3NlcwogICAgLy8vIDxzdW1tYXJ5PgogICAgLy8vIEVuY2Fwc3VsYXRlcyBnZW5lcmFsIGluZm9ybWF0aW9uIGFib3V0IHRoZSBaTGliIGxpYnJhcnkKICAgIC8vLyA8L3N1bW1hcnk+CiAgICBwdWJsaWMgY2xhc3MgSW5mbwogICAgewogICAgICAgICNyZWdpb24gRExMIGltcG9ydHMKICAgICAgICBbRGxsSW1wb3J0KCJaTElCMS5kbGwiLCBDYWxsaW5nQ29udmVudGlvbj1DYWxsaW5nQ29udmVudGlvbi5DZGVjbCldCiAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZXh0ZXJuIHVpbnQgemxpYkNvbXBpbGVGbGFncygpOwoKICAgICAgICBbRGxsSW1wb3J0KCJaTElCMS5kbGwiLCBDYWxsaW5nQ29udmVudGlvbj1DYWxsaW5nQ29udmVudGlvbi5DZGVjbCldCiAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZXh0ZXJuIHN0cmluZyB6bGliVmVyc2lvbigpOwogICAgICAgICNlbmRyZWdpb24KCiAgICAgICAgI3JlZ2lvbiBQcml2YXRlIHN0dWZmCiAgICAgICAgcHJpdmF0ZSB1aW50IF9mbGFnczsKCiAgICAgICAgLy8gaGVscGVyIGZ1bmN0aW9uIHRoYXQgdW5wYWNrcyBhIGJpdHNpemUgbWFzawogICAgICAgIHByaXZhdGUgc3RhdGljIGludCBiaXRTaXplKHVpbnQgYml0cykKICAgICAgICB7CiAgICAgICAgICAgIHN3aXRjaCAoYml0cykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgY2FzZSAwOiByZXR1cm4gMTY7CiAgICAgICAgICAgICAgICBjYXNlIDE6IHJldHVybiAzMjsKICAgICAgICAgICAgICAgIGNhc2UgMjogcmV0dXJuIDY0OwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiAtMTsKICAgICAgICB9CiAgICAgICAgI2VuZHJlZ2lvbgoKICAgICAgICAvLy8gPHN1bW1hcnk+CiAgICAgICAgLy8vIENvbnN0cnVjdHMgYW4gaW5zdGFuY2Ugb2YgdGhlIDxjPkluZm88L2M+IGNsYXNzLgogICAgICAgIC8vLyA8L3N1bW1hcnk+CiAgICAgICAgcHVibGljIEluZm8oKQogICAgICAgIHsKICAgICAgICAgICAgX2ZsYWdzID0gemxpYkNvbXBpbGVGbGFncygpOwogICAgICAgIH0KCiAgICAgICAgLy8vIDxzdW1tYXJ5PgogICAgICAgIC8vLyBUcnVlIGlmIHRoZSBsaWJyYXJ5IGlzIGNvbXBpbGVkIHdpdGggZGVidWcgaW5mbwogICAgICAgIC8vLyA8L3N1bW1hcnk+CiAgICAgICAgcHVibGljIGJvb2wgSGFzRGVidWdJbmZvIHsgZ2V0IHsgcmV0dXJuIDAgIT0gKF9mbGFncyAmIDB4MTAwKTsgfSB9CgogICAgICAgIC8vLyA8c3VtbWFyeT4KICAgICAgICAvLy8gVHJ1ZSBpZiB0aGUgbGlicmFyeSBpcyBjb21waWxlZCB3aXRoIGFzc2VtYmx5IG9wdGltaXphdGlvbnMKICAgICAgICAvLy8gPC9zdW1tYXJ5PgogICAgICAgIHB1YmxpYyBib29sIFVzZXNBc3NlbWJseUNvZGUgeyBnZXQgeyByZXR1cm4gMCAhPSAoX2ZsYWdzICYgMHgyMDApOyB9IH0KCiAgICAgICAgLy8vIDxzdW1tYXJ5PgogICAgICAgIC8vLyBHZXRzIHRoZSBzaXplIG9mIHRoZSB1bnNpZ25lZCBpbnQgdGhhdCB3YXMgY29tcGlsZWQgaW50byBabGliCiAgICAgICAgLy8vIDwvc3VtbWFyeT4KICAgICAgICBwdWJsaWMgaW50IFNpemVPZlVJbnQgeyBnZXQgeyByZXR1cm4gYml0U2l6ZShfZmxhZ3MgJiAzKTsgfSB9CgogICAgICAgIC8vLyA8c3VtbWFyeT4KICAgICAgICAvLy8gR2V0cyB0aGUgc2l6ZSBvZiB0aGUgdW5zaWduZWQgbG9uZyB0aGF0IHdhcyBjb21waWxlZCBpbnRvIFpsaWIKICAgICAgICAvLy8gPC9zdW1tYXJ5PgogICAgICAgIHB1YmxpYyBpbnQgU2l6ZU9mVUxvbmcgeyBnZXQgeyByZXR1cm4gYml0U2l6ZSgoX2ZsYWdzID4+IDIpICYgMyk7IH0gfQoKICAgICAgICAvLy8gPHN1bW1hcnk+CiAgICAgICAgLy8vIEdldHMgdGhlIHNpemUgb2YgdGhlIHBvaW50ZXJzIHRoYXQgd2VyZSBjb21waWxlZCBpbnRvIFpsaWIKICAgICAgICAvLy8gPC9zdW1tYXJ5PgogICAgICAgIHB1YmxpYyBpbnQgU2l6ZU9mUG9pbnRlciB7IGdldCB7IHJldHVybiBiaXRTaXplKChfZmxhZ3MgPj4gNCkgJiAzKTsgfSB9CgogICAgICAgIC8vLyA8c3VtbWFyeT4KICAgICAgICAvLy8gR2V0cyB0aGUgc2l6ZSBvZiB0aGUgel9vZmZfdCB0eXBlIHRoYXQgd2FzIGNvbXBpbGVkIGludG8gWmxpYgogICAgICAgIC8vLyA8L3N1bW1hcnk+CiAgICAgICAgcHVibGljIGludCBTaXplT2ZPZmZzZXQgeyBnZXQgeyByZXR1cm4gYml0U2l6ZSgoX2ZsYWdzID4+IDYpICYgMyk7IH0gfQoKICAgICAgICAvLy8gPHN1bW1hcnk+CiAgICAgICAgLy8vIEdldHMgdGhlIHZlcnNpb24gb2YgWkxpYiBhcyBhIHN0cmluZywgZS5nLiAiMS4yLjEiCiAgICAgICAgLy8vIDwvc3VtbWFyeT4KICAgICAgICBwdWJsaWMgc3RhdGljIHN0cmluZyBWZXJzaW9uIHsgZ2V0IHsgcmV0dXJuIHpsaWJWZXJzaW9uKCk7IH0gfQogICAgfQoKICAgICNlbmRyZWdpb24KCn0K