Ly8NCi8vIKkgQ29weXJpZ2h0IEhlbnJpayBSYXZuIDIwMDQNCi8vDQovLyBVc2UsIG1vZGlmaWNhdGlvbiBhbmQgZGlzdHJpYnV0aW9uIGFyZSBzdWJqZWN0IHRvIHRoZSBCb29zdCBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMC4NCi8vIChTZWUgYWNjb21wYW55aW5nIGZpbGUgTElDRU5TRV8xXzAudHh0IG9yIGNvcHkgYXQgaHR0cDovL3d3dy5ib29zdC5vcmcvTElDRU5TRV8xXzAudHh0KQ0KLy8NCg0KdXNpbmcgU3lzdGVtOw0KdXNpbmcgU3lzdGVtLkRpYWdub3N0aWNzOw0KDQpuYW1lc3BhY2UgRG90WkxpYg0Kew0KDQoJLy8vIDxzdW1tYXJ5Pg0KCS8vLyBUaGlzIGNsYXNzIGltcGxlbWVudHMgYSBjaXJjdWxhciBidWZmZXINCgkvLy8gPC9zdW1tYXJ5Pg0KCWludGVybmFsIGNsYXNzIENpcmN1bGFyQnVmZmVyDQoJew0KICAgICAgICAjcmVnaW9uIFByaXZhdGUgZGF0YQ0KICAgICAgICBwcml2YXRlIGludCBfY2FwYWNpdHk7DQogICAgICAgIHByaXZhdGUgaW50IF9oZWFkOw0KICAgICAgICBwcml2YXRlIGludCBfdGFpbDsNCiAgICAgICAgcHJpdmF0ZSBpbnQgX3NpemU7DQogICAgICAgIHByaXZhdGUgYnl0ZVtdIF9idWZmZXI7DQogICAgICAgICNlbmRyZWdpb24NCg0KICAgICAgICBwdWJsaWMgQ2lyY3VsYXJCdWZmZXIoaW50IGNhcGFjaXR5KQ0KICAgICAgICB7DQogICAgICAgICAgICBEZWJ1Zy5Bc3NlcnQoIGNhcGFjaXR5ID4gMCApOw0KICAgICAgICAgICAgX2J1ZmZlciA9IG5ldyBieXRlW2NhcGFjaXR5XTsNCiAgICAgICAgICAgIF9jYXBhY2l0eSA9IGNhcGFjaXR5Ow0KICAgICAgICAgICAgX2hlYWQgPSAwOw0KICAgICAgICAgICAgX3RhaWwgPSAwOw0KICAgICAgICAgICAgX3NpemUgPSAwOw0KICAgICAgICB9DQoNCiAgICAgICAgcHVibGljIGludCBTaXplIHsgZ2V0IHsgcmV0dXJuIF9zaXplOyB9IH0NCg0KICAgICAgICBwdWJsaWMgaW50IFB1dChieXRlW10gc291cmNlLCBpbnQgb2Zmc2V0LCBpbnQgY291bnQpDQogICAgICAgIHsNCiAgICAgICAgICAgIERlYnVnLkFzc2VydCggY291bnQgPiAwICk7DQogICAgICAgICAgICBpbnQgdHJ1ZUNvdW50ID0gTWF0aC5NaW4oY291bnQsIF9jYXBhY2l0eSAtIFNpemUpOw0KICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB0cnVlQ291bnQ7ICsraSkNCiAgICAgICAgICAgICAgICBfYnVmZmVyWyhfdGFpbCtpKSAlIF9jYXBhY2l0eV0gPSBzb3VyY2Vbb2Zmc2V0K2ldOw0KICAgICAgICAgICAgX3RhaWwgKz0gdHJ1ZUNvdW50Ow0KICAgICAgICAgICAgX3RhaWwgJT0gX2NhcGFjaXR5Ow0KICAgICAgICAgICAgX3NpemUgKz0gdHJ1ZUNvdW50Ow0KICAgICAgICAgICAgcmV0dXJuIHRydWVDb3VudDsNCiAgICAgICAgfQ0KDQogICAgICAgIHB1YmxpYyBib29sIFB1dChieXRlIGIpDQogICAgICAgIHsNCiAgICAgICAgICAgIGlmIChTaXplID09IF9jYXBhY2l0eSkgLy8gbm8gcm9vbQ0KICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsNCiAgICAgICAgICAgIF9idWZmZXJbX3RhaWwrK10gPSBiOw0KICAgICAgICAgICAgX3RhaWwgJT0gX2NhcGFjaXR5Ow0KICAgICAgICAgICAgKytfc2l6ZTsNCiAgICAgICAgICAgIHJldHVybiB0cnVlOw0KICAgICAgICB9DQoNCiAgICAgICAgcHVibGljIGludCBHZXQoYnl0ZVtdIGRlc3RpbmF0aW9uLCBpbnQgb2Zmc2V0LCBpbnQgY291bnQpDQogICAgICAgIHsNCiAgICAgICAgICAgIGludCB0cnVlQ291bnQgPSBNYXRoLk1pbihjb3VudCxTaXplKTsNCiAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgdHJ1ZUNvdW50OyArK2kpDQogICAgICAgICAgICAgICAgZGVzdGluYXRpb25bb2Zmc2V0ICsgaV0gPSBfYnVmZmVyWyhfaGVhZCtpKSAlIF9jYXBhY2l0eV07DQogICAgICAgICAgICBfaGVhZCArPSB0cnVlQ291bnQ7DQogICAgICAgICAgICBfaGVhZCAlPSBfY2FwYWNpdHk7DQogICAgICAgICAgICBfc2l6ZSAtPSB0cnVlQ291bnQ7DQogICAgICAgICAgICByZXR1cm4gdHJ1ZUNvdW50Ow0KICAgICAgICB9DQoNCiAgICAgICAgcHVibGljIGludCBHZXQoKQ0KICAgICAgICB7DQogICAgICAgICAgICBpZiAoU2l6ZSA9PSAwKQ0KICAgICAgICAgICAgICAgIHJldHVybiAtMTsNCg0KICAgICAgICAgICAgaW50IHJlc3VsdCA9IChpbnQpX2J1ZmZlcltfaGVhZCsrICUgX2NhcGFjaXR5XTsNCiAgICAgICAgICAgIC0tX3NpemU7DQogICAgICAgICAgICByZXR1cm4gcmVzdWx0Ow0KICAgICAgICB9DQoNCiAgICB9DQp9DQo=