Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vIENvcHlyaWdodCAoQykgTWljcm9zb2Z0LiBBbGwgcmlnaHRzIHJlc2VydmVkLgovLyBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIGxpY2Vuc2UuIFNlZSBMSUNFTlNFLnR4dCBmaWxlIGluIHRoZSBwcm9qZWN0IHJvb3QgZm9yIGZ1bGwgbGljZW5zZSBpbmZvcm1hdGlvbi4KLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgp2YXIgR2lhbnRQcmludEFycmF5ID0gW107CnZhciByZXVzZU9iamVjdHMgPSBmYWxzZTsKdmFyIFBvbHltb3JwaGljRnVuY09iakFyciA9IFtdOwp2YXIgUG9seUZ1bmNBcnIgPSBbXTsKZnVuY3Rpb24gR2V0UG9seW1vcnBoaWNGdW5jdGlvbigpIHsKICAgIGlmIChQb2x5RnVuY0Fyci5sZW5ndGggPiAxKSB7CiAgICAgICAgdmFyIG15RnVuYyA9IFBvbHlGdW5jQXJyLnNoaWZ0KCk7CiAgICAgICAgUG9seUZ1bmNBcnIucHVzaChteUZ1bmMpOwogICAgICAgIHJldHVybiBteUZ1bmM7CiAgICB9CiAgICBlbHNlIHsKICAgICAgICByZXR1cm4gUG9seUZ1bmNBcnJbMF07CiAgICB9Cn0KZnVuY3Rpb24gR2V0T2JqZWN0d2l0aFBvbHltb3JwaGljRnVuY3Rpb24oKSB7CiAgICBpZiAocmV1c2VPYmplY3RzKSB7CiAgICAgICAgaWYgKFBvbHltb3JwaGljRnVuY09iakFyci5sZW5ndGggPiAxKSB7CiAgICAgICAgICAgIHZhciBteUZ1bmMgPSBQb2x5bW9ycGhpY0Z1bmNPYmpBcnIuc2hpZnQoKTsKICAgICAgICAgICAgUG9seW1vcnBoaWNGdW5jT2JqQXJyLnB1c2gobXlGdW5jKTsKICAgICAgICAgICAgcmV0dXJuIG15RnVuYwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgcmV0dXJuIFBvbHltb3JwaGljRnVuY09iakFyclswXTsKICAgICAgICB9CiAgICB9CiAgICBlbHNlIHsKICAgICAgICB2YXIgb2JqID0ge307CiAgICAgICAgb2JqLnBvbHlmdW5jID0gR2V0UG9seW1vcnBoaWNGdW5jdGlvbigpOwogICAgICAgIFBvbHltb3JwaGljRnVuY09iakFyci5wdXNoKG9iaikKICAgICAgICByZXR1cm4gb2JqCiAgICB9Cn07CmZ1bmN0aW9uIEluaXRQb2x5bW9ycGhpY0Z1bmN0aW9uQXJyYXkoYXJncykgewogICAgUG9seUZ1bmNBcnIgPSBbXTsKICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYXJncy5sZW5ndGg7IGkrKykgewogICAgICAgIFBvbHlGdW5jQXJyLnB1c2goYXJnc1tpXSkKICAgIH0KfQo7CmZ1bmN0aW9uIHRlc3QwKCkgewogICAgdmFyIG9iajAgPSB7fTsKICAgIHZhciBvYmoxID0ge307CiAgICB2YXIgYXJyT2JqMCA9IHt9OwogICAgdmFyIGZ1bmMwID0gZnVuY3Rpb24gKGFyZ01hdGgwKSB7CiAgICAgICAgZnVuY3Rpb24gZnVuYzMoYXJnQXJyMSkgewogICAgICAgIH0KICAgICAgICB0aGlzLnByb3AxOwogICAgfQogICAgdmFyIGZ1bmMxID0gZnVuY3Rpb24gKGFyZ09iajIsIGFyZ0Z1bmMzLCBhcmdBcnI0LCBhcmdBcnI1KSB7CiAgICAgICAgZXZhbCgiJ3VzZSBzdHJpY3QnOyIpOwogICAgICAgIGZ1bmMwKDEpOwogICAgfQogICAgdmFyIGZ1bmMyID0gZnVuY3Rpb24gKCkgewogICAgfQogICAgdmFyIGFyeSA9IG5ldyBBcnJheSgxMCk7CiAgICB2YXIgZjMyID0gbmV3IEZsb2F0MzJBcnJheSgyNTYpOwogICAgdmFyIGY2NCA9IG5ldyBGbG9hdDY0QXJyYXkoMjU2KTsKICAgIHZhciBJbnRBcnIwID0gWzEzMSwgMTQ4LCA2NjI2NTAwMTg3OTYzODk2ODMyLCAxNDk2Mjg0OTk2XTsKICAgIHZhciBzdHJ2YXI1ID0gMTsKICAgIGZ1bmN0aW9uIGJhcjAoKSB7CiAgICAgICAgZnVuYzEuY2FsbChvYmowLCAxLCAxLCAxLCAxKTsKICAgIH0KICAgIEluaXRQb2x5bW9ycGhpY0Z1bmN0aW9uQXJyYXkobmV3IEFycmF5KGJhcjApKTs7CiAgICB2YXIgX19wb2x5b2JqID0gR2V0T2JqZWN0d2l0aFBvbHltb3JwaGljRnVuY3Rpb24oKTs7CiAgICB2YXIgX19sb29wdmFyMSA9IDA7CiAgICBkbyB7CiAgICAgICAgX19sb29wdmFyMSsrOwogICAgICAgIGZ1bmMwLmNhbGwob2JqMSwgMSk7CiAgICB9IHdoaWxlICgoMSkgJiYgX19sb29wdmFyMSA8IDMpCiAgICBvYmoxLnByb3AwID0gewogICAgICAgIHByb3A0OiAxLCBwcm9wMzogMSwgcHJvcDI6IChJbnRBcnIwLnB1c2goKGZ1bmMyLmNhbGwob2JqMCkgPiAoKG9iajEubGVuZ3RoID49IGFyck9iajAucHJvcDEpIHx8IChhcnJPYmowLnByb3AxIDw9IG9iajAucHJvcDEpKSksICgodHJ1ZSBpbnN0YW5jZW9mICgodHlwZW9mIE51bWJlciA9PSAnZnVuY3Rpb24nKSA/IE51bWJlciA6IE9iamVjdCkpICE9PSB0cnVlKSwgODAsICh0eXBlb2YgKG9iajAucHJvcDApID09ICdvYmplY3QnKSwgKGY2NFsoX19wb2x5b2JqLnBvbHlmdW5jLmNhbGwoYXJyT2JqMCkpICYgMjU1XSAqIChmMzJbKCgnQiGyRbQnICsgJyhDcdRjPVbMJy5pbmRleE9mKHN0cnZhcjUpKSkgJiAyNTVdICsgYXJ5WygoKCh0cnVlIGluc3RhbmNlb2YgKCh0eXBlb2YgRXZhbEVycm9yID09ICdmdW5jdGlvbicpID8gRXZhbEVycm9yIDogT2JqZWN0KSkgPj0gMCA/ICh0cnVlIGluc3RhbmNlb2YgKCh0eXBlb2YgRXZhbEVycm9yID09ICdmdW5jdGlvbicpID8gRXZhbEVycm9yIDogT2JqZWN0KSkgOiAwKSkgJiAwWEYpXSkpLCAodHlwZW9mICgnJCcpICE9IG51bGwpKSkKICAsIHByb3AxOiAxLCBwcm9wMDogMQogICAgfTsKfTsKCi8vIGdlbmVyYXRlIHByb2ZpbGUKdGVzdDAoKTsKLy8gUnVuIFNpbXBsZSBKSVQKdGVzdDAoKTsKCi8vIHJ1biBKSVR0ZWQgY29kZQpydW5uaW5nSklUdGVkQ29kZSA9IHRydWU7CnRlc3QwKCk7CgpXU2NyaXB0LkVjaG8oJ3Bhc3MnKTs=