Ly8NCi8vIKkgQ29weXJpZ2h0IEhlbnJpayBSYXZuIDIwMDQNCi8vDQovLyBVc2UsIG1vZGlmaWNhdGlvbiBhbmQgZGlzdHJpYnV0aW9uIGFyZSBzdWJqZWN0IHRvIHRoZSBCb29zdCBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMC4NCi8vIChTZWUgYWNjb21wYW55aW5nIGZpbGUgTElDRU5TRV8xXzAudHh0IG9yIGNvcHkgYXQgaHR0cDovL3d3dy5ib29zdC5vcmcvTElDRU5TRV8xXzAudHh0KQ0KLy8NCg0KdXNpbmcgU3lzdGVtOw0KdXNpbmcgU3lzdGVtLkRpYWdub3N0aWNzOw0KdXNpbmcgU3lzdGVtLlJ1bnRpbWUuSW50ZXJvcFNlcnZpY2VzOw0KDQpuYW1lc3BhY2UgRG90WkxpYg0Kew0KDQogICAgLy8vIDxzdW1tYXJ5Pg0KICAgIC8vLyBJbXBsZW1lbnRzIGEgZGF0YSBjb21wcmVzc29yLCB1c2luZyB0aGUgZGVmbGF0ZSBhbGdvcml0aG0gaW4gdGhlIFpMaWIgZGxsDQogICAgLy8vIDwvc3VtbWFyeT4NCglwdWJsaWMgc2VhbGVkIGNsYXNzIERlZmxhdGVyIDogQ29kZWNCYXNlDQoJew0KICAgICAgICAjcmVnaW9uIERsbCBpbXBvcnRzDQogICAgICAgIFtEbGxJbXBvcnQoIlpMSUIxLmRsbCIsIENhbGxpbmdDb252ZW50aW9uPUNhbGxpbmdDb252ZW50aW9uLkNkZWNsLCBDaGFyU2V0PUNoYXJTZXQuQW5zaSldDQogICAgICAgIHByaXZhdGUgc3RhdGljIGV4dGVybiBpbnQgZGVmbGF0ZUluaXRfKHJlZiBaU3RyZWFtIHN6LCBpbnQgbGV2ZWwsIHN0cmluZyB2cywgaW50IHNpemUpOw0KDQogICAgICAgIFtEbGxJbXBvcnQoIlpMSUIxLmRsbCIsIENhbGxpbmdDb252ZW50aW9uPUNhbGxpbmdDb252ZW50aW9uLkNkZWNsKV0NCiAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZXh0ZXJuIGludCBkZWZsYXRlKHJlZiBaU3RyZWFtIHN6LCBpbnQgZmx1c2gpOw0KDQogICAgICAgIFtEbGxJbXBvcnQoIlpMSUIxLmRsbCIsIENhbGxpbmdDb252ZW50aW9uPUNhbGxpbmdDb252ZW50aW9uLkNkZWNsKV0NCiAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZXh0ZXJuIGludCBkZWZsYXRlUmVzZXQocmVmIFpTdHJlYW0gc3opOw0KDQogICAgICAgIFtEbGxJbXBvcnQoIlpMSUIxLmRsbCIsIENhbGxpbmdDb252ZW50aW9uPUNhbGxpbmdDb252ZW50aW9uLkNkZWNsKV0NCiAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZXh0ZXJuIGludCBkZWZsYXRlRW5kKHJlZiBaU3RyZWFtIHN6KTsNCiAgICAgICAgI2VuZHJlZ2lvbg0KDQogICAgICAgIC8vLyA8c3VtbWFyeT4NCiAgICAgICAgLy8vIENvbnN0cnVjdHMgYW4gbmV3IGluc3RhbmNlIG9mIHRoZSA8Yz5EZWZsYXRlcjwvYz4NCiAgICAgICAgLy8vIDwvc3VtbWFyeT4NCiAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJsZXZlbCI+VGhlIGNvbXByZXNzaW9uIGxldmVsIHRvIHVzZSBmb3IgdGhpcyA8Yz5EZWZsYXRlcjwvYz48L3BhcmFtPg0KCQlwdWJsaWMgRGVmbGF0ZXIoQ29tcHJlc3NMZXZlbCBsZXZlbCkgOiBiYXNlKCkNCgkJew0KICAgICAgICAgICAgaW50IHJldHZhbCA9IGRlZmxhdGVJbml0XyhyZWYgX3p0cmVhbSwgKGludClsZXZlbCwgSW5mby5WZXJzaW9uLCBNYXJzaGFsLlNpemVPZihfenRyZWFtKSk7DQogICAgICAgICAgICBpZiAocmV0dmFsICE9IDApDQogICAgICAgICAgICAgICAgdGhyb3cgbmV3IFpMaWJFeGNlcHRpb24ocmV0dmFsLCAiQ291bGQgbm90IGluaXRpYWxpemUgZGVmbGF0ZXIiKTsNCg0KICAgICAgICAgICAgcmVzZXRPdXRwdXQoKTsNCgkJfQ0KDQogICAgICAgIC8vLyA8c3VtbWFyeT4NCiAgICAgICAgLy8vIEFkZHMgbW9yZSBkYXRhIHRvIHRoZSBjb2RlYyB0byBiZSBwcm9jZXNzZWQuDQogICAgICAgIC8vLyA8L3N1bW1hcnk+DQogICAgICAgIC8vLyA8cGFyYW0gbmFtZT0iZGF0YSI+Qnl0ZSBhcnJheSBjb250YWluaW5nIHRoZSBkYXRhIHRvIGJlIGFkZGVkIHRvIHRoZSBjb2RlYzwvcGFyYW0+DQogICAgICAgIC8vLyA8cGFyYW0gbmFtZT0ib2Zmc2V0Ij5UaGUgaW5kZXggb2YgdGhlIGZpcnN0IGJ5dGUgdG8gYWRkIGZyb20gPGM+ZGF0YTwvYz48L3BhcmFtPg0KICAgICAgICAvLy8gPHBhcmFtIG5hbWU9ImNvdW50Ij5UaGUgbnVtYmVyIG9mIGJ5dGVzIHRvIGFkZDwvcGFyYW0+DQogICAgICAgIC8vLyA8cmVtYXJrcz5BZGRpbmcgZGF0YSBtYXksIG9yIG1heSBub3QsIHJhaXNlIHRoZSA8Yz5EYXRhQXZhaWxhYmxlPC9jPiBldmVudDwvcmVtYXJrcz4NCiAgICAgICAgcHVibGljIG92ZXJyaWRlIHZvaWQgQWRkKGJ5dGVbXSBkYXRhLCBpbnQgb2Zmc2V0LCBpbnQgY291bnQpDQogICAgICAgIHsNCiAgICAgICAgICAgIGlmIChkYXRhID09IG51bGwpIHRocm93IG5ldyBBcmd1bWVudE51bGxFeGNlcHRpb24oKTsNCiAgICAgICAgICAgIGlmIChvZmZzZXQgPCAwIHx8IGNvdW50IDwgMCkgdGhyb3cgbmV3IEFyZ3VtZW50T3V0T2ZSYW5nZUV4Y2VwdGlvbigpOw0KICAgICAgICAgICAgaWYgKChvZmZzZXQrY291bnQpID4gZGF0YS5MZW5ndGgpIHRocm93IG5ldyBBcmd1bWVudEV4Y2VwdGlvbigpOw0KDQogICAgICAgICAgICBpbnQgdG90YWwgPSBjb3VudDsNCiAgICAgICAgICAgIGludCBpbnB1dEluZGV4ID0gb2Zmc2V0Ow0KICAgICAgICAgICAgaW50IGVyciA9IDA7DQoNCiAgICAgICAgICAgIHdoaWxlIChlcnIgPj0gMCAmJiBpbnB1dEluZGV4IDwgdG90YWwpDQogICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgY29weUlucHV0KGRhdGEsIGlucHV0SW5kZXgsIE1hdGguTWluKHRvdGFsIC0gaW5wdXRJbmRleCwga0J1ZmZlclNpemUpKTsNCiAgICAgICAgICAgICAgICB3aGlsZSAoZXJyID49IDAgJiYgX3p0cmVhbS5hdmFpbF9pbiA+IDApDQogICAgICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICAgICBlcnIgPSBkZWZsYXRlKHJlZiBfenRyZWFtLCAoaW50KUZsdXNoVHlwZXMuTm9uZSk7DQogICAgICAgICAgICAgICAgICAgIGlmIChlcnIgPT0gMCkNCiAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlIChfenRyZWFtLmF2YWlsX291dCA9PSAwKQ0KICAgICAgICAgICAgICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9uRGF0YUF2YWlsYWJsZSgpOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVyciA9IGRlZmxhdGUocmVmIF96dHJlYW0sIChpbnQpRmx1c2hUeXBlcy5Ob25lKTsNCiAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgaW5wdXRJbmRleCArPSAoaW50KV96dHJlYW0udG90YWxfaW47DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgc2V0Q2hlY2tzdW0oIF96dHJlYW0uYWRsZXIgKTsNCiAgICAgICAgfQ0KDQoNCiAgICAgICAgLy8vIDxzdW1tYXJ5Pg0KICAgICAgICAvLy8gRmluaXNoZXMgdXAgYW55IHBlbmRpbmcgZGF0YSB0aGF0IG5lZWRzIHRvIGJlIHByb2Nlc3NlZCBhbmQgaGFuZGxlZC4NCiAgICAgICAgLy8vIDwvc3VtbWFyeT4NCiAgICAgICAgcHVibGljIG92ZXJyaWRlIHZvaWQgRmluaXNoKCkNCiAgICAgICAgew0KICAgICAgICAgICAgaW50IGVycjsNCiAgICAgICAgICAgIGRvDQogICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgZXJyID0gZGVmbGF0ZShyZWYgX3p0cmVhbSwgKGludClGbHVzaFR5cGVzLkZpbmlzaCk7DQogICAgICAgICAgICAgICAgT25EYXRhQXZhaWxhYmxlKCk7DQogICAgICAgICAgICB9DQogICAgICAgICAgICB3aGlsZSAoZXJyID09IDApOw0KICAgICAgICAgICAgc2V0Q2hlY2tzdW0oIF96dHJlYW0uYWRsZXIgKTsNCiAgICAgICAgICAgIGRlZmxhdGVSZXNldChyZWYgX3p0cmVhbSk7DQogICAgICAgICAgICByZXNldE91dHB1dCgpOw0KICAgICAgICB9DQoNCiAgICAgICAgLy8vIDxzdW1tYXJ5Pg0KICAgICAgICAvLy8gQ2xvc2VzIHRoZSBpbnRlcm5hbCB6bGliIGRlZmxhdGUgc3RyZWFtDQogICAgICAgIC8vLyA8L3N1bW1hcnk+DQogICAgICAgIHByb3RlY3RlZCBvdmVycmlkZSB2b2lkIENsZWFuVXAoKSB7IGRlZmxhdGVFbmQocmVmIF96dHJlYW0pOyB9DQoNCiAgICB9DQp9DQo=