LyoKICogVmVydGV4IHBvc2l0aW9uIGRhdGEgZGVzY3JpYmluZyB0aGUgbGV0dGVyICdzJwogKgogKiAoYykgQ29weXJpZ2h0IDE5OTMsIFNpbGljb24gR3JhcGhpY3MsIEluYy4KICogQ29weXJpZ2h0IKkgMjAxMiBMaW5hcm8gTGltaXRlZAogKgogKiBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgZ2xtYXJrMiBPcGVuR0wgKEVTKSAyLjAgYmVuY2htYXJrLgogKgogKiBnbG1hcmsyIGlzIGZyZWUgc29mdHdhcmU6IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlCiAqIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKICogRm91bmRhdGlvbiwgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIKICogdmVyc2lvbi4KICoKICogZ2xtYXJrMiBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVCBBTlkKICogV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUwogKiBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlCiAqIGRldGFpbHMuCiAqCiAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGgKICogZ2xtYXJrMi4gIElmIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KICoKICogQXV0aG9yczoKICogIEplc3NlIEJhcmtlcgogKi8KI2luY2x1ZGUgImNoYXJhY3RlcnMuaCIKCnVzaW5nIExpYk1hdHJpeDo6dmVjMjsKCkxldHRlclM6OkxldHRlclMoKQp7CiAgICAvLyBWZXJ0ZXggZGF0YS4uLgogICAgdmVydGV4RGF0YV8ucHVzaF9iYWNrKHZlYzIoMC44NjAzOTMsIDUuMjgzNzk4KSk7CiAgICB2ZXJ0ZXhEYXRhXy5wdXNoX2JhY2sodmVjMigwLjUyOTQ3MywgMy41NTAwNTIpKTsKICAgIHZlcnRleERhdGFfLnB1c2hfYmFjayh2ZWMyKDAuOTkyNzYxLCA0LjQ5MTIyOCkpOwogICAgdmVydGV4RGF0YV8ucHVzaF9iYWNrKHZlYzIoMC45MTAwMzEsIDMuMzY4NDIxKSk7CiAgICB2ZXJ0ZXhEYXRhXy5wdXNoX2JhY2sodmVjMigxLjI0MDk1MSwgMy44MzA3NTMpKTsKICAgIHZlcnRleERhdGFfLnB1c2hfYmFjayh2ZWMyKDEuNDU2MDUwLCAzLjEwNDIzMSkpOwogICAgdmVydGV4RGF0YV8ucHVzaF9iYWNrKHZlYzIoMS45MzU4ODQsIDMuNTE3MDI4KSk7CiAgICB2ZXJ0ZXhEYXRhXy5wdXNoX2JhY2sodmVjMigyLjAwMjA2OCwgMi45ODg2NDgpKTsKICAgIHZlcnRleERhdGFfLnB1c2hfYmFjayh2ZWMyKDIuNzYzMTg1LCAzLjUzMzU0MCkpOwogICAgdmVydGV4RGF0YV8ucHVzaF9iYWNrKHZlYzIoMy4wNjEwMTMsIDMuMTIwNzQzKSk7CiAgICB2ZXJ0ZXhEYXRhXy5wdXNoX2JhY2sodmVjMigzLjM5MTkzNCwgMy43NDgxOTQpKTsKICAgIHZlcnRleERhdGFfLnB1c2hfYmFjayh2ZWMyKDQuMDUzNzc0LCAzLjYzMjYxMSkpOwogICAgdmVydGV4RGF0YV8ucHVzaF9iYWNrKHZlYzIoMy44MjIxMzAsIDQuNTQwNzY0KSk7CiAgICB2ZXJ0ZXhEYXRhXy5wdXNoX2JhY2sodmVjMig0LjU1MDE1NSwgNC41OTAyOTkpKTsKICAgIHZlcnRleERhdGFfLnB1c2hfYmFjayh2ZWMyKDMuNjU2NjcwLCA1LjQ2NTQyOCkpOwogICAgdmVydGV4RGF0YV8ucHVzaF9iYWNrKHZlYzIoNC41MTcwNjMsIDUuNzEzMTA2KSk7CiAgICB2ZXJ0ZXhEYXRhXy5wdXNoX2JhY2sodmVjMigzLjI3NjExMiwgNS44OTQ3MzcpKTsKICAgIHZlcnRleERhdGFfLnB1c2hfYmFjayh2ZWMyKDMuOTIxNDA3LCA2LjUzODcwMCkpOwogICAgdmVydGV4RGF0YV8ucHVzaF9iYWNrKHZlYzIoMi4yOTk4OTYsIDYuNzM2ODQyKSk7CiAgICB2ZXJ0ZXhEYXRhXy5wdXNoX2JhY2sodmVjMigzLjA0NDQ2NywgNy40MzAzNDEpKTsKICAgIHZlcnRleERhdGFfLnB1c2hfYmFjayh2ZWMyKDEuODg2MjQ2LCA3LjQ5NjM4OCkpOwogICAgdmVydGV4RGF0YV8ucHVzaF9iYWNrKHZlYzIoMi41ODExNzksIDguMjIyOTEwKSk7CiAgICB2ZXJ0ZXhEYXRhXy5wdXNoX2JhY2sodmVjMigxLjkwMjc5MiwgOC43NTEyOTApKTsKICAgIHZlcnRleERhdGFfLnB1c2hfYmFjayh2ZWMyKDIuNjgwNDU1LCA4Ljg4MzM4NSkpOwogICAgdmVydGV4RGF0YV8ucHVzaF9iYWNrKHZlYzIoMi4yODMzNTAsIDkuMzEyNjk0KSk7CiAgICB2ZXJ0ZXhEYXRhXy5wdXNoX2JhY2sodmVjMigzLjM1ODg0MiwgOS42MDk5MDcpKTsKICAgIHZlcnRleERhdGFfLnB1c2hfYmFjayh2ZWMyKDMuNTA3NzU2LCA5LjkwNzEyMSkpOwogICAgdmVydGV4RGF0YV8ucHVzaF9iYWNrKHZlYzIoNC4yODU0MTksIDkuNzU4NTE0KSk7CiAgICB2ZXJ0ZXhEYXRhXy5wdXNoX2JhY2sodmVjMig1LjExMjcyMCwgOS45NzMxNjgpKTsKICAgIHZlcnRleERhdGFfLnB1c2hfYmFjayh2ZWMyKDQuNzQ4NzA3LCA5LjU5MzM5NSkpOwoKICAgIC8vIEluZGV4IGRhdGEuLi4KICAgIGluZGV4RGF0YV8ucHVzaF9iYWNrKDApOwogICAgaW5kZXhEYXRhXy5wdXNoX2JhY2soMSk7CiAgICBpbmRleERhdGFfLnB1c2hfYmFjaygyKTsKICAgIGluZGV4RGF0YV8ucHVzaF9iYWNrKDMpOwogICAgaW5kZXhEYXRhXy5wdXNoX2JhY2soNCk7CiAgICBpbmRleERhdGFfLnB1c2hfYmFjayg1KTsKICAgIGluZGV4RGF0YV8ucHVzaF9iYWNrKDYpOwogICAgaW5kZXhEYXRhXy5wdXNoX2JhY2soNyk7CiAgICBpbmRleERhdGFfLnB1c2hfYmFjayg4KTsKICAgIGluZGV4RGF0YV8ucHVzaF9iYWNrKDkpOwogICAgaW5kZXhEYXRhXy5wdXNoX2JhY2soMTApOwogICAgaW5kZXhEYXRhXy5wdXNoX2JhY2soMTEpOwogICAgaW5kZXhEYXRhXy5wdXNoX2JhY2soMTIpOwogICAgaW5kZXhEYXRhXy5wdXNoX2JhY2soMTMpOwogICAgaW5kZXhEYXRhXy5wdXNoX2JhY2soMTQpOwogICAgaW5kZXhEYXRhXy5wdXNoX2JhY2soMTUpOwogICAgaW5kZXhEYXRhXy5wdXNoX2JhY2soMTYpOwogICAgaW5kZXhEYXRhXy5wdXNoX2JhY2soMTcpOwogICAgaW5kZXhEYXRhXy5wdXNoX2JhY2soMTgpOwogICAgaW5kZXhEYXRhXy5wdXNoX2JhY2soMTkpOwogICAgaW5kZXhEYXRhXy5wdXNoX2JhY2soMjApOwogICAgaW5kZXhEYXRhXy5wdXNoX2JhY2soMjEpOwogICAgaW5kZXhEYXRhXy5wdXNoX2JhY2soMjIpOwogICAgaW5kZXhEYXRhXy5wdXNoX2JhY2soMjMpOwogICAgaW5kZXhEYXRhXy5wdXNoX2JhY2soMjQpOwogICAgaW5kZXhEYXRhXy5wdXNoX2JhY2soMjUpOwogICAgaW5kZXhEYXRhXy5wdXNoX2JhY2soMjYpOwogICAgaW5kZXhEYXRhXy5wdXNoX2JhY2soMjcpOwogICAgaW5kZXhEYXRhXy5wdXNoX2JhY2soMjgpOwogICAgaW5kZXhEYXRhXy5wdXNoX2JhY2soMjkpOwogICAgaW5kZXhEYXRhXy5wdXNoX2JhY2soMCk7CiAgICBpbmRleERhdGFfLnB1c2hfYmFjaygyKTsKICAgIGluZGV4RGF0YV8ucHVzaF9iYWNrKDQpOwogICAgaW5kZXhEYXRhXy5wdXNoX2JhY2soNik7CiAgICBpbmRleERhdGFfLnB1c2hfYmFjayg4KTsKICAgIGluZGV4RGF0YV8ucHVzaF9iYWNrKDEwKTsKICAgIGluZGV4RGF0YV8ucHVzaF9iYWNrKDEyKTsKICAgIGluZGV4RGF0YV8ucHVzaF9iYWNrKDE0KTsKICAgIGluZGV4RGF0YV8ucHVzaF9iYWNrKDE2KTsKICAgIGluZGV4RGF0YV8ucHVzaF9iYWNrKDE4KTsKICAgIGluZGV4RGF0YV8ucHVzaF9iYWNrKDIwKTsKICAgIGluZGV4RGF0YV8ucHVzaF9iYWNrKDIyKTsKICAgIGluZGV4RGF0YV8ucHVzaF9iYWNrKDI0KTsKICAgIGluZGV4RGF0YV8ucHVzaF9iYWNrKDI2KTsKICAgIGluZGV4RGF0YV8ucHVzaF9iYWNrKDI4KTsKICAgIGluZGV4RGF0YV8ucHVzaF9iYWNrKDI5KTsKICAgIGluZGV4RGF0YV8ucHVzaF9iYWNrKDI3KTsKICAgIGluZGV4RGF0YV8ucHVzaF9iYWNrKDI1KTsKICAgIGluZGV4RGF0YV8ucHVzaF9iYWNrKDIzKTsKICAgIGluZGV4RGF0YV8ucHVzaF9iYWNrKDIxKTsKICAgIGluZGV4RGF0YV8ucHVzaF9iYWNrKDE5KTsKICAgIGluZGV4RGF0YV8ucHVzaF9iYWNrKDE3KTsKICAgIGluZGV4RGF0YV8ucHVzaF9iYWNrKDE1KTsKICAgIGluZGV4RGF0YV8ucHVzaF9iYWNrKDEzKTsKICAgIGluZGV4RGF0YV8ucHVzaF9iYWNrKDExKTsKICAgIGluZGV4RGF0YV8ucHVzaF9iYWNrKDkpOwogICAgaW5kZXhEYXRhXy5wdXNoX2JhY2soNyk7CiAgICBpbmRleERhdGFfLnB1c2hfYmFjayg1KTsKICAgIGluZGV4RGF0YV8ucHVzaF9iYWNrKDMpOwogICAgaW5kZXhEYXRhXy5wdXNoX2JhY2soMSk7CgogICAgLy8gUHJpbWl0aXZlIHN0YXRlIHNvIHRoYXQgdGhlIGRyYXcgY2FsbCBjYW4gaXNzdWUgdGhlIHByaW1pdGl2ZXMgd2Ugd2FudC4KICAgIHVuc2lnbmVkIGludCBjdXJPZmZzZXQoMCk7CiAgICBwcmltVmVjXy5wdXNoX2JhY2soUHJpbWl0aXZlU3RhdGUoR0xfVFJJQU5HTEVfU1RSSVAsIDMwLCBjdXJPZmZzZXQpKTsKICAgIGN1ck9mZnNldCArPSAoMzAgKiBzaXplb2YodW5zaWduZWQgc2hvcnQpKTsKICAgIHByaW1WZWNfLnB1c2hfYmFjayhQcmltaXRpdmVTdGF0ZShHTF9MSU5FX1NUUklQLCAzMCwgY3VyT2Zmc2V0KSk7Cn0K