I2luY2x1ZGUgJmx0O2lvc3RyZWFtJmd0OwojaW5jbHVkZSAmbHQ7Y3N0ZGxpYiZndDsgLy8gcmFuZCgpLCBzcmFuZCgpIOOBruOBn+OCgQojaW5jbHVkZSAmbHQ7Y3RpbWUmZ3Q7ICAgLy8gdGltZSgpIOOBruOBn+OCgQojaW5jbHVkZSAmbHQ7c3RyaW5nJmd0OwojaW5jbHVkZSAmbHQ7dmVjdG9yJmd0OyAgLy8g4piF44GT44KM44GM5b+F6KaB44Gr44Gq44KK44G+44GZ77yBCiNpbmNsdWRlICZsdDtsaW1pdHMmZ3Q7ICAvLyBzdGQ6Om51bWVyaWNfbGltaXRzIOOBruOBn+OCgSAoZ2V0bGluZeOBruWJjeWHpueQhikKI2luY2x1ZGUgJmx0O2FsZ29yaXRobSZndDsgLy8gc3RkOjptYXgsIHN0ZDo6bWluIOOBruOBn+OCgQoKI2lmZGVmIF9XSU4zMgojaW5jbHVkZSAmbHQ7d2luZG93cy5oJmd0OwojZGVmaW5lIHNsZWVwX21zKG1zKSBTbGVlcChtcykKI2Vsc2UKI2luY2x1ZGUgJmx0O3VuaXN0ZC5oJmd0OwojZGVmaW5lIHNsZWVwX21zKG1zKSB1c2xlZXAobXMgKiAxMDAwKQojZW5kaWYKCnVzaW5nIG5hbWVzcGFjZSBzdGQ7CgpjbGFzcyBPbWlrdWppCnsKcHJpdmF0ZToKICAgIGludCBraW51biA9IDA7CiAgICBpbnQgZ291a2VpID0gMDsKICAgIHN0cmluZyBwbGF5ZXJfbmFtZTsKCiAgICB2b2lkIGRyYXdPbWlrdWppUmVzdWx0KGludCZhbXA7IHNjb3JlX3RhcmdldCk7CgpwdWJsaWM6CiAgICBPbWlrdWppKCk7CiAgICB2b2lkIGhpa3UoKTsKICAgIHZvaWQgdW5uc2VpKCk7CiAgICB2b2lkIGthbmFrYW5hKCk7CiAgICB2b2lkIHNldF9wbGF5ZXJfbmFtZShjb25zdCBzdHJpbmcmYW1wOyBuYW1lKTsKCiAgICAvLyDjgrLjg4Pjgr/jg7zplqLmlbAKICAgIGludCBnZXRfZ291a2VpKCkgY29uc3QgewogICAgICAgIHJldHVybiBnb3VrZWk7CiAgICB9CiAgICBpbnQgZ2V0X2tpbnVuKCkgY29uc3QgewogICAgICAgIHJldHVybiBraW51bjsKICAgIH0KICAgIHN0cmluZyBnZXRfcGxheWVyX25hbWUoKSBjb25zdCB7CiAgICAgICAgcmV0dXJuIHBsYXllcl9uYW1lOwogICAgfQogICAgaW50IGdldF90b3RhbF9zY29yZSgpIGNvbnN0IHsgLy8g5paw44GX44GP57eP5ZCI54K544KS6L+U44GZ44Ky44OD44K/44O844KC6L+95YqgCiAgICAgICAgcmV0dXJuIGdvdWtlaSArIGtpbnVuOwogICAgfQp9OwoKT21pa3VqaTo6T21pa3VqaSgpCnsKfQoKdm9pZCBPbWlrdWppOjpzZXRfcGxheWVyX25hbWUoY29uc3Qgc3RyaW5nJmFtcDsgbmFtZSkgewogICAgcGxheWVyX25hbWUgPSBuYW1lOwp9Cgp2b2lkIE9taWt1amk6OmRyYXdPbWlrdWppUmVzdWx0KGludCZhbXA7IHNjb3JlX3RhcmdldCl7CiAgICBpbnQgeCA9IHJhbmQoKSAlIDQzICsgMTsKCiAgICBzd2l0Y2ggKHgpIHsKICAgICAgICBjYXNlIDE6IGNvdXQgJmx0OyZsdDsgJnF1b3Q75bCP5Ye2JnF1b3Q7ICZsdDsmbHQ7IGVuZGw7IHNjb3JlX3RhcmdldCArPSAzOyBicmVhazsKICAgICAgICBjYXNlIDI6IGNvdXQgJmx0OyZsdDsgJnF1b3Q75pyr5bCP5ZCJJnF1b3Q7ICZsdDsmbHQ7IGVuZGw7IHNjb3JlX3RhcmdldCArPSA2OyBicmVhazsKICAgICAgICBjYXNlIDM6IGNvdXQgJmx0OyZsdDsgJnF1b3Q75pyr5Ye2JnF1b3Q7ICZsdDsmbHQ7IGVuZGw7IHNjb3JlX3RhcmdldCArPSA1OyBicmVhazsKICAgICAgICBjYXNlIDQ6IGNvdXQgJmx0OyZsdDsgJnF1b3Q75pyr5ZCJJnF1b3Q7ICZsdDsmbHQ7IGVuZGw7IHNjb3JlX3RhcmdldCArPSA3OyBicmVhazsKICAgICAgICBjYXNlIDU6IGNvdXQgJmx0OyZsdDsgJnF1b3Q75Y2K5Ye2JnF1b3Q7ICZsdDsmbHQ7IGVuZGw7IHNjb3JlX3RhcmdldCArPSA0OyBicmVhazsKICAgICAgICBjYXNlIDY6IGNvdXQgJmx0OyZsdDsgJnF1b3Q75pyr5bCP5ZCJJnF1b3Q7ICZsdDsmbHQ7IGVuZGw7IHNjb3JlX3RhcmdldCArPSA2OyBicmVhazsKICAgICAgICBjYXNlIDc6IGNvdXQgJmx0OyZsdDsgJnF1b3Q75Y2K5ZCJJnF1b3Q7ICZsdDsmbHQ7IGVuZGw7IHNjb3JlX3RhcmdldCArPSA4OyBicmVhazsKICAgICAgICBjYXNlIDg6IGNvdXQgJmx0OyZsdDsgJnF1b3Q75Lit5ZCJJnF1b3Q7ICZsdDsmbHQ7IGVuZGw7IHNjb3JlX3RhcmdldCArPSAxMTsgYnJlYWs7CiAgICAgICAgY2FzZSA5OiBjb3V0ICZsdDsmbHQ7ICZxdW90O+Wwj+WQiSZxdW90OyAmbHQ7Jmx0OyBlbmRsOyBzY29yZV90YXJnZXQgKz0gOTsgYnJlYWs7CiAgICAgICAgY2FzZSAxMDogY291dCAmbHQ7Jmx0OyAmcXVvdDvlsI/lh7YmcXVvdDsgJmx0OyZsdDsgZW5kbDsgc2NvcmVfdGFyZ2V0ICs9IDM7IGJyZWFrOwogICAgICAgIGNhc2UgMTE6IGNvdXQgJmx0OyZsdDsgJnF1b3Q75pyr5ZCJJnF1b3Q7ICZsdDsmbHQ7IGVuZGw7IHNjb3JlX3RhcmdldCArPSA3OyBicmVhazsKICAgICAgICBjYXNlIDEyOiBjb3V0ICZsdDsmbHQ7ICZxdW90O+WHtiZxdW90OyAmbHQ7Jmx0OyBlbmRsOyBzY29yZV90YXJnZXQgKz0gMjsgYnJlYWs7CiAgICAgICAgY2FzZSAxMzogY291dCAmbHQ7Jmx0OyAmcXVvdDvmnKvlsI/lkIkmcXVvdDsgJmx0OyZsdDsgZW5kbDsgc2NvcmVfdGFyZ2V0ICs9IDY7IGJyZWFrOwogICAgICAgIGNhc2UgMTQ6CiAgICAgICAgICAgIGNvdXQgJmx0OyZsdDsgJnF1b3Q75aSn5ZCJ8J+OiSZxdW90OyAmbHQ7Jmx0OyBlbmRsOwogICAgICAgICAgICBjb3V0ICZsdDsmbHQ7ICZxdW90O+OBguOBquOBn+Wkp+WQieOCkuW8leOBj+OBquOCk+OBpuOAgeOBmeOBlOOBj+mBi+OBjOOBhOOBhOOBp+OBmeOBre+8gSZxdW90OyAmbHQ7Jmx0OyBlbmRsOwogICAgICAgICAgICBjb3V0ICZsdDsmbHQ7ICZxdW90O+OBoOOBkeOBqeOAgeOBk+OBruaXpeOBr+WwkeOBl+awl+OCkuOBpOOBkeOBpuOBj+OBoOOBleOBhOOAgiZxdW90OyAmbHQ7Jmx0OyBlbmRsOwogICAgICAgICAgICBjb3V0ICZsdDsmbHQ7ICZxdW90O+OBquOBnOOBquOCieOAgeOBiuOBv+OBj+OBmOOBr+mAhuOBrumBi+WLouOBr+OBquOCiuOChOOBmeOBhOOBqOiogOOCj+OCjOOBpuOBhOOCi+OBi+OCieOBp+OBmeOAgiZxdW90OyAmbHQ7Jmx0OyBlbmRsOwogICAgICAgICAgICBjb3V0ICZsdDsmbHQ7ICZxdW90O+OBl+OBi+OBl+OAgeWkp+WQieOCkuW8leOBhOOBn+OBruOBr+S6i+Wun+OBquOBruOBp+OAgeiHquS/oeaMgeOBo+OBpuOBj+OBoOOBleOBhOOBre+8gSZxdW90OyAmbHQ7Jmx0OyBlbmRsOwogICAgICAgICAgICBzY29yZV90YXJnZXQgKz0gMTI7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgMTU6IGNvdXQgJmx0OyZsdDsgJnF1b3Q75pyr5Ye2JnF1b3Q7ICZsdDsmbHQ7IGVuZGw7IHNjb3JlX3RhcmdldCArPSA1OyBicmVhazsKICAgICAgICBjYXNlIDE2OiBjb3V0ICZsdDsmbHQ7ICZxdW90O+WQiSZxdW90OyAmbHQ7Jmx0OyBlbmRsOyBzY29yZV90YXJnZXQgKz0gMTA7IGJyZWFrOwogICAgICAgIGNhc2UgMTc6IGNvdXQgJmx0OyZsdDsgJnF1b3Q75Y2K5ZCJJnF1b3Q7ICZsdDsmbHQ7IGVuZGw7IHNjb3JlX3RhcmdldCArPSA4OyBicmVhazsKICAgICAgICBjYXNlIDE4OiBjb3V0ICZsdDsmbHQ7ICZxdW90O+WNiuWHtiZxdW90OyAmbHQ7Jmx0OyBlbmRsOyBzY29yZV90YXJnZXQgKz0gNDsgYnJlYWs7CiAgICAgICAgY2FzZSAxOTogY291dCAmbHQ7Jmx0OyAmcXVvdDvmnKvlkIkmcXVvdDsgJmx0OyZsdDsgZW5kbDsgc2NvcmVfdGFyZ2V0ICs9IDc7IGJyZWFrOwogICAgICAgIGNhc2UgMjA6IGNvdXQgJmx0OyZsdDsgJnF1b3Q75ZCJJnF1b3Q7ICZsdDsmbHQ7IGVuZGw7IHNjb3JlX3RhcmdldCArPSAxMDsgYnJlYWs7CiAgICAgICAgY2FzZSAyMTogY291dCAmbHQ7Jmx0OyAmcXVvdDvmnKvlsI/lkIkmcXVvdDsgJmx0OyZsdDtlbmRsOyBzY29yZV90YXJnZXQgKz0gNjsgYnJlYWs7CiAgICAgICAgY2FzZSAyMjogY291dCAmbHQ7Jmx0OyAmcXVvdDvmnKvlh7YmcXVvdDsgJmx0OyZsdDsgZW5kbDsgc2NvcmVfdGFyZ2V0ICs9IDU7IGJyZWFrOwogICAgICAgIGNhc2UgMjM6IGNvdXQgJmx0OyZsdDsgJnF1b3Q75bCP5ZCJJnF1b3Q7ICZsdDsmbHQ7IGVuZGw7IHNjb3JlX3RhcmdldCArPSA5OyBicmVhazsKICAgICAgICBjYXNlIDI0OiBjb3V0ICZsdDsmbHQ7ICZxdW90O+WNiuWQiSZxdW90OyAmbHQ7Jmx0OyBlbmRsOyBzY29yZV90YXJnZXQgKz0gODsgYnJlYWs7CiAgICAgICAgY2FzZSAyNTogY291dCAmbHQ7Jmx0OyAmcXVvdDvljYrlh7YmcXVvdDsgJmx0OyZsdDsgZW5kbDsgc2NvcmVfdGFyZ2V0ICs9IDQ7IGJyZWFrOwogICAgICAgIGNhc2UgMjY6IGNvdXQgJmx0OyZsdDsgJnF1b3Q75pyr5ZCJJnF1b3Q7ICZsdDsmbHQ7IGVuZGw7IHNjb3JlX3RhcmdldCArPSA3OyBicmVhazsKICAgICAgICBjYXNlIDI3OiBjb3V0ICZsdDsmbHQ7ICZxdW90O+Wwj+WHtiZxdW90OyAmbHQ7Jmx0OyBlbmRsOyBzY29yZV90YXJnZXQgKz0gMzsgYnJlYWs7CiAgICAgICAgY2FzZSAyODogY291dCAmbHQ7Jmx0OyAmcXVvdDvmnKvlsI/lkIkmcXVvdDsgJmx0OyZsdDsgZW5kbDsgc2NvcmVfdGFyZ2V0ICs9IDY7IGJyZWFrOwogICAgICAgIGNhc2UgMjk6IGNvdXQgJmx0OyZsdDsgJnF1b3Q75pyr5Ye2JnF1b3Q7ICZsdDsmbHQ7IGVuZGw7IHNjb3JlX3RhcmdldCArPSA1OyBicmVhazsKICAgICAgICBjYXNlIDMwOiBjb3V0ICZsdDsmbHQ7ICZxdW90O+Wwj+WQiSZxdW90OyAmbHQ7Jmx0OyBlbmRsOyBzY29yZV90YXJnZXQgKz0gOTsgYnJlYWs7CiAgICAgICAgY2FzZSAzMTogY291dCAmbHQ7Jmx0OyAmcXVvdDvljYrlkIkmcXVvdDsgJmx0OyZsdDsgZW5kbDsgc2NvcmVfdGFyZ2V0ICs9IDg7IGJyZWFrOwogICAgICAgIGNhc2UgMzI6IGNvdXQgJmx0OyZsdDsgJnF1b3Q75ZCJJnF1b3Q7ICZsdDsmbHQ7IGVuZGw7IHNjb3JlX3RhcmdldCArPSAxMDsgYnJlYWs7CiAgICAgICAgY2FzZSAzMzogY291dCAmbHQ7Jmx0OyAmcXVvdDvmnKvlkIkmcXVvdDsgJmx0OyZsdDsgZW5kbDsgc2NvcmVfdGFyZ2V0ICs9IDc7IGJyZWFrOwogICAgICAgIGNhc2UgMzQ6IGNvdXQgJmx0OyZsdDsgJnF1b3Q75Ye2JnF1b3Q7ICZsdDsmbHQ7IGVuZGw7IHNjb3JlX3RhcmdldCArPSAyOyBicmVhazsKICAgICAgICBjYXNlIDM1OiBjb3V0ICZsdDsmbHQ7ICZxdW90O+acq+Wwj+WQiSZxdW90OyAmbHQ7Jmx0OyBlbmRsOyBzY29yZV90YXJnZXQgKz0gNjsgYnJlYWs7CiAgICAgICAgY2FzZSAzNjogY291dCAmbHQ7Jmx0OyAmcXVvdDvkuK3lkIkmcXVvdDsgJmx0OyZsdDsgZW5kbDsgc2NvcmVfdGFyZ2V0ICs9IDExOyBicmVhazsKICAgICAgICBjYXNlIDM3OiBjb3V0ICZsdDsmbHQ7ICZxdW90O+WNiuWHtiZxdW90OyAmbHQ7Jmx0OyBlbmRsOyBzY29yZV90YXJnZXQgKz0gNDsgYnJlYWs7CiAgICAgICAgY2FzZSAzODogY291dCAmbHQ7Jmx0OyAmcXVvdDvmnKvlh7YmcXVvdDsgJmx0OyZsdDsgZW5kbDsgc2NvcmVfdGFyZ2V0ICs9IDU7IGJyZWFrOwogICAgICAgIGNhc2UgMzk6CiAgICAgICAgICAgIGNvdXQgJmx0OyZsdDsgJnF1b3Q75aSn5Ye28J+YsSZxdW90OyAmbHQ7Jmx0OyBlbmRsOwogICAgICAgICAgICBjb3V0ICZsdDsmbHQ7ICZxdW90O+OBguOBquOBn+Wkp+WHtuOCkuW8leOBj+OBquOCk+OBpuOAgeOBi+OBquOCiumBi+OBjOaCquOBhOOBp+OBmeOBreOAgiZxdW90OyAmbHQ7Jmx0OyBlbmRsOwogICAgICAgICAgICBjb3V0ICZsdDsmbHQ7ICZxdW90O+OBp+OCguWkp+S4iOWkq+OAguOBquOBnOOBquOCieOAgeOBiuOBv+OBj+OBmOOBr+mAhuOBrumBi+WLouOBq+OBquOCiuOChOOBmeOBhOOBqOiogOOCj+OCjOOBpuOBhOOCi+OBi+OCieOBp+OBmeOAgiZxdW90OyAmbHQ7Jmx0OyBlbmRsOwogICAgICAgICAgICBjb3V0ICZsdDsmbHQ7ICZxdW90O+OBquOBruOBp+OBmeOBlOOBj+W/g+mFjeOBmeOCi+W/heimgeOBr+OBguOCiuOBvuOBm+OCk++8ge+8gSZxdW90OyAmbHQ7Jmx0OyBlbmRsOwogICAgICAgICAgICBjb3V0ICZsdDsmbHQ7ICZxdW90O+OBl+OBi+OBl+OAgeWkp+WHtuOCkuW8leOBhOOBn+OBruOBr+S6i+Wun+OBquOBruOBp+OAgeitpuaIkuOCkuaAoOOCieOBquOBhOOBp+OBj+OBoOOBleOBhOOAgiZxdW90OyAmbHQ7Jmx0OyBlbmRsOwogICAgICAgICAgICBzY29yZV90YXJnZXQgKz0gMTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSA0MDogY291dCAmbHQ7Jmx0OyAmcXVvdDvljYrlkIkmcXVvdDsgJmx0OyZsdDsgZW5kbDsgc2NvcmVfdGFyZ2V0ICs9IDg7IGJyZWFrOwogICAgICAgIGNhc2UgNDE6IGNvdXQgJmx0OyZsdDsgJnF1b3Q75pyr5ZCJJnF1b3Q7ICZsdDsmbHQ7IGVuZGw7IHNjb3JlX3RhcmdldCArPSA3OyBicmVhazsKICAgICAgICBjYXNlIDQyOiBjb3V0ICZsdDsmbHQ7ICZxdW90O+Wwj+WQiSZxdW90OyAmbHQ7Jmx0OyBlbmRsOyBzY29yZV90YXJnZXQgKz0gOTsgYnJlYWs7CiAgICAgICAgY2FzZSA0MzogY291dCAmbHQ7Jmx0OyAmcXVvdDvmnKvlsI/lkIkmcXVvdDsgJmx0OyZsdDsgZW5kbDsgc2NvcmVfdGFyZ2V0ICs9IDY7IGJyZWFrOwogICAgICAgIGRlZmF1bHQ6IGNvdXQgJmx0OyZsdDsgJnF1b3Q744Ko44Op44O877ya5LiN5piO44Gq6YGL5Yui55Wq5Y+344Gn44GZ44CCJnF1b3Q7ICZsdDsmbHQ7IGVuZGw7IGJyZWFrOwogICAgfQp9Cgp2b2lkIE9taWt1amk6Omhpa3UoKXsKICAgIGRyYXdPbWlrdWppUmVzdWx0KGdvdWtlaSk7Cn0KCnZvaWQgT21pa3VqaTo6a2FuYWthbmEoKXsKICAgIGRyYXdPbWlrdWppUmVzdWx0KGtpbnVuKTsKfQoKdm9pZCBPbWlrdWppOjp1bm5zZWkoKXsKICAgIGNvdXQgJmx0OyZsdDsgcGxheWVyX25hbWUgJmx0OyZsdDsgJnF1b3Q744GV44KT44Gu5LiA6YCx6ZaT44Gu6YGL5Yui44Gv44CBJnF1b3Q7OwogICAgYm9vbCBpc19lcnJvcl9nb3VrZWkgPSBmYWxzZTsKICAgIGJvb2wgaXNfZXJyb3Jfa2ludW4gPSBmYWxzZTsKCiAgICBpZihnb3VrZWkgPT0gODQpewogICAgICAgIGNvdXQgJmx0OyZsdDsgJnF1b3Q76LaF6LaF54m55aSn5ZCJ44Gn44GZ44CC44CA44CA44Gv77yfJnF1b3Q7ICZsdDsmbHQ7IGVuZGw7CiAgICAgICAgY291dCAmbHQ7Jmx0OyAmcXVvdDvntbblr77jgavjgYLjgorlvpfjgb7jgZvjgpMhISZxdW90OyAmbHQ7Jmx0OyBlbmRsOwogICAgICAgIGNvdXQgJmx0OyZsdDsgJnF1b3Q7N+OBpOOBqOOCguWkp+WQieOBjOWHuuOCi+OBquOCk+OBpu+8geOBk+OCjOOBr+ODkOOCsOOBp+OBmeOAgiZxdW90OyAmbHQ7Jmx0OyBlbmRsOwogICAgICAgIGNvdXQgJmx0OyZsdDsgJnF1b3Q744GZ44GQ44GK44G/44GP44GY5Lya56S+44Gr6YCj57Wh44GX44Gm44GP44Gg44GV44GE77yB77yBJnF1b3Q7ICZsdDsmbHQ7IGVuZGw7CiAgICAgICAgaXNfZXJyb3JfZ291a2VpID0gdHJ1ZTsKICAgIH0KICAgIGVsc2UgaWYoZ291a2VpICZndDs9IDg1KXsKICAgICAgICBjb3V0ICZsdDsmbHQ7ICZxdW90O+OBmeOBv+OBvuOBm+OCk+OAgua4rOWumuS4jeiDveOBp+OBmeOAgiZxdW90OyAmbHQ7Jmx0OyBlbmRsOwogICAgICAgIGNvdXQgJmx0OyZsdDsgJnF1b3Q744GK44G/44GP44GY5Lya56S+44Gr5aCx5ZGK44GX44Gm44KC44KJ44GI44KL44Go5Yqp44GL44KK44G+44GZ44CCJnF1b3Q7ICZsdDsmbHQ7IGVuZGw7CiAgICAgICAgY291dCAmbHQ7Jmx0OyAmcXVvdDvjgb7jgYHvvJHjgaToqIDjgYjjgovjgZPjgajjgajjgZfjgabjga/jgIEmcXVvdDsgJmx0OyZsdDsgZW5kbDsKICAgICAgICBjb3V0ICZsdDsmbHQ7ICZxdW90O+OCs+ODvOODieOAguabuOOBjeaPm+OBiOOBn+OBoOOCjfCfkqImcXVvdDsgJmx0OyZsdDsgZW5kbDsKICAgICAgICBjb3V0ICZsdDsmbHQ7ICZxdW90O+OBiuWJjeOBr+S6uuOBruS9nOWTgeOCkuWjiuOBl+OBpuOAgeS9leOBjOOBl+OBn+OBhOOCk+OBoOOCiCZxdW90OyAmbHQ7Jmx0OyBlbmRsOwogICAgICAgIGNvdXQgJmx0OyZsdDsgJnF1b3Q75ZGq44Gj44Gm44KE44KL772l772l772l772l772l772l772l772l772l772lJnF1b3Q7OwogICAgICAgIGZvcihpbnQgbz0wOyBvICZsdDsgNTA7IG8rKyl7CiAgICAgICAgICAgIGNvdXQgJmx0OyZsdDsgJnF1b3Q75ZGq44Gj44Gm44KE44KLJnF1b3Q7OwogICAgICAgIH0KICAgICAgICBjb3V0ICZsdDsmbHQ7IGVuZGw7CiAgICAgICAgaXNfZXJyb3JfZ291a2VpID0gdHJ1ZTsKICAgIH0KICAgIGVsc2UgaWYoZ291a2VpICZndDs9IDgzKXsKICAgICAgICBjb3V0ICZsdDsmbHQ7ICZxdW90O+eJueWkp+WQieOBp+OBme+8ge+8geOAgOOAgOOCk++8nyZxdW90OyAmbHQ7Jmx0OyBlbmRsOwogICAgICAgIGNvdXQgJmx0OyZsdDsgJnF1b3Q744Gd44GX44Gm6YGL5Yui44KS6KGo44GZ5pWw5a2X44Gv44CBJnF1b3Q7ICZsdDsmbHQ7IGdvdWtlaSAmbHQ7Jmx0OyAmcXVvdDvjgafjgZnvvaXvvaUgJm5ic3A7IOOBr++8nyZxdW90OyAmbHQ7Jmx0OyBlbmRsOwogICAgICAgIGNvdXQgJmx0OyZsdDsgJnF1b3Q75pWw5a2X44GM6auY44GZ44GO44G+44GZ77yB44CA44GT44KM44Gv44OQ44Kw44Gn44GZ44CCJnF1b3Q7ICZsdDsmbHQ7IGVuZGw7CiAgICAgICAgY291dCAmbHQ7Jmx0OyAmcXVvdDvku4rjgZnjgZDjgYrjgb/jgY/jgZjkvJrnpL7jgavpgKPntaHjgZfjgabkuIvjgZXjgYTvvIEmcXVvdDsgJmx0OyZsdDsgZW5kbDsKICAgICAgICBpc19lcnJvcl9nb3VrZWkgPSB0cnVlOwogICAgfQogICAgaWYgKCFpc19lcnJvcl9nb3VrZWkpIHsKICAgICAgICBpZihnb3VrZWkgJmd0Oz0gNTkpeyBjb3V0ICZsdDsmbHQ7ICZxdW90O+OBiuOCgeOBp+OBqOOBhu+8ge+8geWkp+WQieOBp+OBmeOAgiZxdW90OyAmbHQ7Jmx0OyBlbmRsOyBjb3V0ICZsdDsmbHQ7ICZxdW90O+OBneOBl+OBpumBi+WLouOCkuihqOOBmeaVsOWtl+OBr+OAgSZxdW90OyAmbHQ7Jmx0OyBnb3VrZWkgJmx0OyZsdDsgJnF1b3Q744Gn44GZ44CCJnF1b3Q7ICZsdDsmbHQ7IGVuZGw7IGNvdXQgJmx0OyZsdDsgJnF1b3Q744GT44Gu5LiA6YCx6ZaT44Gv6Ieq5L+h5oyB44Gj44Gm44CB6KGM5YuV44GX44Gm44G/44G+44GX44KH44GG77yBJnF1b3Q7ICZsdDsmbHQ7IGVuZGw7IGNvdXQgJmx0OyZsdDsgJnF1b3Q744G+44GC44CC44GK44G/44GP44GY44Gv6YCG44Gu6YGL5Yui44Gr44Gq44KK44KE44GZ44GE44Go6KiA44KP44KM44Gm44GE44KL44Gu44Gn44GZ44GM772l772lJnF1b3Q7ICZsdDsmbHQ7IGVuZGw7IH0KICAgICAgICBlbHNlIGlmKGdvdWtlaSAmZ3Q7PSA1NSl7IGNvdXQgJmx0OyZsdDsgJnF1b3Q75Lit5ZCJ44Gn44GZ44CCJnF1b3Q7ICZsdDsmbHQ7IGVuZGw7IGNvdXQgJmx0OyZsdDsgJnF1b3Q744Gd44GX44Gm6YGL5Yui44KS6KGo44GZ5pWw5a2X44Gv44CBJnF1b3Q7ICZsdDsmbHQ7IGdvdWtlaSAmbHQ7Jmx0OyAmcXVvdDvjgafjgZnjgIImcXVvdDsgJmx0OyZsdDsgZW5kbDsgY291dCAmbHQ7Jmx0OyAmcXVvdDvlpKflkInjga/mg4Xnt5LkuI3lronlrprjgarjgZPjgajjgYzlpJrjgYTjga7jgafjgIHlrp/os6rkuIDnlarjgYTjgYTpgYvli6LjgYvjgoLjgZfjgozjgb7jgZvjgpPvvIHvvIEmcXVvdDsgJmx0OyZsdDsgZW5kbDsgY291dCAmbHQ7Jmx0OyAmcXVvdDvjgZfjgYvjgZfjgIHlpKflkInjgojjgorpgYvli6LjgYzmgqrjgYTjga7jga/kuovlrp/jgarjga7jgafjgIHlpKflkInnm67mjIfjgZfjgabjgIHpoJHlvLXjgaPjgabkuIvjgZXjgYTvvIEmcXVvdDsgJmx0OyZsdDsgZW5kbDsgfQogICAgICAgIGVsc2UgaWYoZ291a2VpICZndDs9IDUyKXsgY291dCAmbHQ7Jmx0OyAmcXVvdDvlkInjgafjgZnjgIImcXVvdDsgJmx0OyZsdDsgZW5kbDsgY291dCAmbHQ7Jmx0OyAmcXVvdDvjgZ3jgZfjgabpgYvli6LjgpLooajjgZnmlbDlrZfjga/jgIEmcXVvdDsgJmx0OyZsdDsgZ291a2VpICZsdDsmbHQ7ICZxdW90O+OBp+OBmeOAgiZxdW90OyAmbHQ7Jmx0OyBlbmRsOyBjb3V0ICZsdDsmbHQ7ICZxdW90O+S7peWkluOBqOe1kOani+OBhOOBhOOCk+OBp+OBmeOBre+8gSZxdW90OyAmbHQ7Jmx0OyBlbmRsOyB9CiAgICAgICAgZWxzZSBpZihnb3VrZWkgJmd0Oz0gNDgpeyBjb3V0ICZsdDsmbHQ7ICZxdW90O+Wwj+WQieOBp+OBmSZxdW90OyAmbHQ7Jmx0OyBlbmRsOyBjb3V0ICZsdDsmbHQ7ICZxdW90O+OBneOBl+OBpumBi+WLouOCkuihqOOBmeaVsOWtl+OBr+OAgSZxdW90OyAmbHQ7Jmx0OyBnb3VrZWkgJmx0OyZsdDsgJnF1b3Q744Gn44GZ44CCJnF1b3Q7ICZsdDsmbHQ7IGVuZGw7IGNvdXQgJmx0OyZsdDsgJnF1b3Q744GE44Gk44KC44KI44KK5bCR44GX5bCP44GV44GP6KGM5YuV44GZ44KL44GT44Go44KS44GK5Yun44KB44GX44G+44GZ44CC44CA44CA5bCP5ZCJ44Gg44GR44GrJnF1b3Q7ICZsdDsmbHQ7IGVuZGw7IH0KICAgICAgICBlbHNlIGlmKGdvdWtlaSAmZ3Q7PSA0Myl7IGNvdXQgJmx0OyZsdDsgJnF1b3Q75Y2K5ZCJ44Gn44GZ44CCJnF1b3Q7ICZsdDsmbHQ7IGVuZGw7IGNvdXQgJmx0OyZsdDsgJnF1b3Q744Gd44GX44Gm6YGL5Yui44KS6KGo44GZ5pWw5a2X44Gv44CBJnF1b3Q7ICZsdDsmbHQ7IGdvdWtlaSAmbHQ7Jmx0OyAmcXVvdDvjgafjgZnjgIImcXVvdDsgJmx0OyZsdDsgZW5kbDsgY291dCAmbHQ7Jmx0OyAmcXVvdDvjgZPjga7ovrrjgorjgYvjgonjgIHlsJHjgZfjgZrjgaTpgYvjgYzkuIvjgYzjgaPjgabjgYTjgY3jgb7jgZnjga3igKUmcXVvdDsgJmx0OyZsdDsgZW5kbDsgfQogICAgICAgIGVsc2UgaWYoZ291a2VpICZndDs9IDM3KXsgY291dCAmbHQ7Jmx0OyAmcXVvdDvmnKvlkInjgafjgZnjgIImcXVvdDsgJmx0OyZsdDsgZW5kbDsgY291dCAmbHQ7Jmx0OyAmcXVvdDvjgZ3jgZfjgabpgYvli6LjgpLooajjgZnmlbDlrZfjga/jgIEmcXVvdDsgJmx0OyZsdDsgZ291a2VpICZsdDsmbHQ7ICZxdW90O+OBp+OBmeOAgiZxdW90OyAmbHQ7Jmx0OyBlbmRsOyBjb3V0ICZsdDsmbHQ7ICZxdW90O+Wwj+OBleOBquW5uOmBi+OBl+OBi+OBquOBhOOBi+OCgu+8nyZxdW90OyAmbHQ7Jmx0OyBlbmRsOyB9CiAgICAgICAgZWxzZSBpZihnb3VrZWkgJmd0Oz0gMzEpeyBjb3V0ICZsdDsmbHQ7ICZxdW90O+acq+Wwj+WQieOBp+OBmeOAgiZxdW90OyAmbHQ7Jmx0OyBlbmRsOyBjb3V0ICZsdDsmbHQ7ICZxdW90O+OBneOBl+OBpumBi+WLouOCkuihqOOBmeaVsOWtl+OBr+OAgSZxdW90OyAmbHQ7Jmx0OyBnb3VrZWkgJmx0OyZsdDsgJnF1b3Q744Gn44GZ44CCJnF1b3Q7ICZsdDsmbHQ7IGVuZGw7IGNvdXQgJmx0OyZsdDsgJnF1b3Q75Ye244Ku44Oq44Ku44Oq77yBJnF1b3Q7ICZsdDsmbHQ7IGVuZGw7IH0KICAgICAgICBlbHNlIGlmKGdvdWtlaSAmZ3Q7PSAyNyl7IGNvdXQgJmx0OyZsdDsgJnF1b3Q75pyr5Ye244Gn44GZ44CCJnF1b3Q7ICZsdDsmbHQ7IGVuZGw7IGNvdXQgJmx0OyZsdDsgJnF1b3Q744Gd44GX44Gm6YGL5Yui44KS6KGo44GZ5pWw5a2X44Gv44CBJnF1b3Q7ICZsdDsmbHQ7IGdvdWtlaSAmbHQ7Jmx0OyAmcXVvdDvjgafjgZnjgIImcXVvdDsgJmx0OyZsdDsgZW5kbDsgY291dCAmbHQ7Jmx0OyAmcXVvdDvjgajjgYbjgajjgYblh7bjga7poJjln5/jgafjgZnjgojigKUmcXVvdDsgJmx0OyZsdDsgZW5kbDsgfQogICAgICAgIGVsc2UgaWYoZ291a2VpICZndDs9IDI0KXsgY291dCAmbHQ7Jmx0OyAmcXVvdDvljYrlh7bjgafjgZkmcXVvdDsgJmx0OyZsdDsgZW5kbDsgY291dCAmbHQ7Jmx0OyAmcXVvdDvjgZ3jgZfjgabpgYvli6LjgpLooajjgZnmlbDlrZfjga/jgIEmcXVvdDsgJmx0OyZsdDsgZ291a2VpICZsdDsmbHQ7ICZxdW90O+OBp+OBmeOAgiZxdW90OyAmbHQ7Jmx0OyBlbmRsOyBjb3V0ICZsdDsmbHQ7ICZxdW90O+acrOagvOeahOOBq+WHtuOBrumgmOWfn+OBq+OBhOOBvuOBmeOCiO+9pe+9pSZxdW90OyAmbHQ7Jmx0OyBlbmRsOyB9CiAgICAgICAgZWxzZSBpZihnb3VrZWkgJmd0Oz0gMjIpeyBjb3V0ICZsdDsmbHQ7ICZxdW90O+Wwj+WHtuOBp+OBmeOAgiZxdW90OyAmbHQ7Jmx0OyBlbmRsOyBjb3V0ICZsdDsmbHQ7ICZxdW90O+OBneOBl+OBpumBi+WLouOCkuihqOOBmeaVsOWtl+OBr+OAgSZxdW90OyAmbHQ7Jmx0OyBnb3VrZWkgJmx0OyZsdDsgJnF1b3Q744Gn44GZ44CCJnF1b3Q7ICZsdDsmbHQ7IGVuZGw7IGNvdXQgJmx0OyZsdDsgJnF1b3Q744Gh44KH44Gj44Go44O75Lit6YCU5Y2K56uv77yfJnF1b3Q7ICZsdDsmbHQ7IGVuZGw7IH0KICAgICAgICBlbHNlIGlmKGdvdWtlaSAmZ3Q7PSAyMSl7IGNvdXQgJmx0OyZsdDsgJnF1b3Q75Ye244Gn44GZ44CCJnF1b3Q7ICZsdDsmbHQ7IGVuZGw7IGNvdXQgJmx0OyZsdDsgJnF1b3Q744Gd44GX44Gm6YGL5Yui44KS6KGo44GZ5pWw5a2X44Gv44CBJnF1b3Q7ICZsdDsmbHQ7IGdvdWtlaSAmbHQ7Jmx0OyAmcXVvdDvjgafjgZnjgIImcXVvdDsgJmx0OyZsdDsgZW5kbDsgY291dCAmbHQ7Jmx0OyAmcXVvdDvlh7blh7rjgovjgarjgonlpKflh7bjgYzoia/jgYvjgaPjgZ/vvaXvvaXjgarjgpPjgabjgYTjgYZT44Gu5pa544Gv44GE44G+44GZ44GL77yfJnF1b3Q7ICZsdDsmbHQ7IGVuZGw7IH0KICAgICAgICBlbHNlIGlmKGdvdWtlaSAmZ3Q7PSAxOCl7IGNvdXQgJmx0OyZsdDsgJnF1b3Q75q6L5b+144CC5aSn5Ye244Gn44GZ44CCJnF1b3Q7ICZsdDsmbHQ7IGVuZGw7IGNvdXQgJmx0OyZsdDsgJnF1b3Q744Gd44GX44Gm6YGL5Yui44KS6KGo44GZ5pWw5a2X44Gv44CBJnF1b3Q7ICZsdDsmbHQ7IGdvdWtlaSAmbHQ7Jmx0OyAmcXVvdDvjgafjgZnvvaXvvaUmcXVvdDsgJmx0OyZsdDsgZW5kbDsgY291dCAmbHQ7Jmx0OyAmcXVvdDvjgZPjga7kuIDpgLHplpPjga/jgIHjgYvjgarjgormhY7ph43jgavooYzli5XjgZfjgabkuIvjgZXjgYQmcXVvdDsgJmx0OyZsdDsgZW5kbDsgY291dCAmbHQ7Jmx0OyAmcXVvdDvku4rjgZnjgZDjgYrjgb/jgY/jgZjkvJrnpL7jgavpgKPntaHjgZfjgabkuIvjgZXjgYTvvIEmcXVvdDsgJmx0OyZsdDsgZW5kbDsgfQogICAgICAgIGVsc2UgaWYoZ291a2VpICZndDsgOCl7IGNvdXQgJmx0OyZsdDsgJnF1b3Q75aSn5aSn5Ye244Gn44GZ77yB77yB44CA44CA44KT77yfJnF1b3Q7ICZsdDsmbHQ7IGVuZGw7IGNvdXQgJmx0OyZsdDsgJnF1b3Q744Gd44GX44Gm6YGL5Yui44KS6KGo44GZ5pWw5a2X44Gv44CBJnF1b3Q7ICZsdDsmbHQ7IGdvdWtlaSAmbHQ7Jmx0OyAmcXVvdDvjgafjgZnvvaXvvaUgJm5ic3A7IOOBr++8nyZxdW90OyAmbHQ7Jmx0OyBlbmRsOyBjb3V0ICZsdDsmbHQ7ICZxdW90O+aVsOWtl+OBjOS9juOBmeOBjuOBvuOBme+8geOAgOOBk+OCjOOBr+ODkOOCsOOBp+OBmeOAgiZxdW90OyAmbHQ7Jmx0OyBlbmRsOyBjb3V0ICZsdDsmbHQ7ICZxdW90O+S7iuOBmeOBkOOBiuOBv+OBj+OBmOS8muekvuOBq+mAo+e1oeOBl+OBpuS4i+OBleOBhO+8gSZxdW90OyAmbHQ7Jmx0OyBlbmRsOyB9CiAgICAgICAgZWxzZSBpZihnb3VrZWkgPT0gNyl7IGNvdXQgJmx0OyZsdDsgJnF1b3Q744Gp44KT5bqV44Gu5aSn5Ye244Gn44GZ44CC44CA44CA44Gv77yfJnF1b3Q7ICZsdDsmbHQ7IGVuZGw7IGNvdXQgJmx0OyZsdDsgJnF1b3Q757W25a++44Gr44GC44KK5b6X44G+44Gb44KTISEmcXVvdDsgJmx0OyZsdDsgZW5kbDsgY291dCAmbHQ7Jmx0OyAmcXVvdDs344Gk44Go44KC5aSn5Ye244GM5Ye644KL44Gq44KT44Gm77yB44GT44KM44Gv44OQ44Kw44Gn44GZ44CCJnF1b3Q7ICZsdDsmbHQ7IGVuZGw7IGNvdXQgJmx0OyZsdDsgJnF1b3Q744GZ44GQ44GK44G/44GP44GY5Lya56S+44Gr6YCj57Wh44GX44Gm44GP44Gg44GV44GE77yB77yBJnF1b3Q7ICZsdDsmbHQ7IGVuZGw7IH0KICAgICAgICBlbHNleyBjb3V0ICZsdDsmbHQ7ICZxdW90O+OBmeOBv+OBvuOBm+OCk+OAgua4rOWumuS4jeiDveOBp+OBmeOAgiZxdW90OyAmbHQ7Jmx0OyBlbmRsOyBjb3V0ICZsdDsmbHQ7ICZxdW90O+OBiuOBv+OBj+OBmOS8muekvuOBq+WgseWRiuOBl+OBpuOCguOCieOBiOOCi+OBqOWKqeOBi+OCiuOBvuOBmeOAgiZxdW90OyAmbHQ7Jmx0OyBlbmRsOyBjb3V0ICZsdDsmbHQ7ICZxdW90O+OBvuOBge+8keOBpOiogOOBiOOCi+OBk+OBqOOBqOOBl+OBpuOBr+OAgSZxdW90OyAmbHQ7Jmx0OyBlbmRsOyBjb3V0ICZsdDsmbHQ7ICZxdW90O+OCs+ODvOODieOAguabuOOBjeaPm+OBiOOBn+OBoOOCjfCfkqImcXVvdDsgJmx0OyZsdDsgZW5kbDsgY291dCAmbHQ7Jmx0OyAmcXVvdDvjgYrliY3jga/kurrjga7kvZzlk4HjgpLlo4rjgZfjgabjgIHkvZXjgYzjgZfjgZ/jgYTjgpPjgaDjgogmcXVvdDsgJmx0OyZsdDsgZW5kbDsgY291dCAmbHQ7Jmx0OyAmcXVvdDvlkarjgaPjgabjgoTjgovvvaXvvaXvvaXvvaXvvaXvvaXvvaXvvaXvvaXvvaUmcXVvdDs7IGZvcihpbnQgbz0wOyBvICZsdDsgNTA7IG8rKyl7IGNvdXQgJmx0OyZsdDsgJnF1b3Q75ZGq44Gj44Gm44KE44KLJnF1b3Q7OyB9IGNvdXQgJmx0OyZsdDsgZW5kbDsgfQogICAgfQogICAgY291dCAmbHQ7Jmx0OyBlbmRsOwoKICAgIGNvdXQgJmx0OyZsdDsgJnF1b3Q744Gd44GX44Gm5LiA6YCx6ZaT44Gu6YeR6YGL44Gv44CBJnF1b3Q7OwogICAgaWYoa2ludW4gPT0gODQpewogICAgICAgIGNvdXQgJmx0OyZsdDsgJnF1b3Q76LaF6LaF54m55aSn5ZCJ44Gn44GZ44CC44CA44CA44Gv77yfJnF1b3Q7ICZsdDsmbHQ7IGVuZGw7CiAgICAgICAgY291dCAmbHQ7Jmx0OyAmcXVvdDvntbblr77jgavjgYLjgorlvpfjgb7jgZvjgpMhISZxdW90OyAmbHQ7Jmx0OyBlbmRsOwogICAgICAgIGNvdXQgJmx0OyZsdDsgJnF1b3Q7N+OBpOOBqOOCguWkp+WQieOBjOWHuuOCi+OBquOCk+OBpu+8geOBk+OCjOOBr+ODkOOCsOOBp+OBmeOAgiZxdW90OyAmbHQ7Jmx0OyBlbmRsOwogICAgICAgIGNvdXQgJmx0OyZsdDsgJnF1b3Q744GZ44GQ44GK44G/44GP44GY5Lya56S+44Gr6YCj57Wh44GX44Gm44GP44Gg44GV44GE77yB77yBJnF1b3Q7ICZsdDsmbHQ7IGVuZGw7CiAgICAgICAgaXNfZXJyb3Jfa2ludW4gPSB0cnVlOwogICAgfQogICAgZWxzZSBpZihraW51biAmZ3Q7PSA4NSl7CiAgICAgICAgY291dCAmbHQ7Jmx0OyAmcXVvdDvjgZnjgb/jgb7jgZvjgpPjgILmuKzlrprkuI3og73jgafjgZnjgIImcXVvdDsgJmx0OyZsdDsgZW5kbDsKICAgICAgICBjb3V0ICZsdDsmbHQ7ICZxdW90O+OBiuOBv+OBj+OBmOS8muekvuOBq+WgseWRiuOBl+OBpuOCguOCieOBiOOCi+OBqOWKqeOBi+OCiuOBvuOBmeOAgiZxdW90OyAmbHQ7Jmx0OyBlbmRsOwogICAgICAgIGNvdXQgJmx0OyZsdDsgJnF1b3Q744G+44GB77yR44Gk6KiA44GI44KL44GT44Go44Go44GX44Gm44Gv44CBJnF1b3Q7ICZsdDsmbHQ7IGVuZGw7CiAgICAgICAgY291dCAmbHQ7Jmx0OyAmcXVvdDvjgrPjg7zjg4njgILmm7jjgY3mj5vjgYjjgZ/jgaDjgo3wn5KiJnF1b3Q7ICZsdDsmbHQ7IGVuZGw7CiAgICAgICAgY291dCAmbHQ7Jmx0OyAmcXVvdDvjgYrliY3jga/kurrjga7kvZzlk4HjgpLlo4rjgZfjgabjgIHkvZXjgYzjgZfjgZ/jgYTjgpPjgaDjgogmcXVvdDsgJmx0OyZsdDsgZW5kbDsKICAgICAgICBjb3V0ICZsdDsmbHQ7ICZxdW90O+WRquOBo+OBpuOChOOCi++9pe+9pe+9pe+9pe+9pe+9pe+9pe+9pe+9pe+9pSZxdW90OzsKICAgICAgICBmb3IoaW50IG89MDsgbyAmbHQ7IDUwOyBvKyspewogICAgICAgICAgICBjb3V0ICZsdDsmbHQ7ICZxdW90O+WRquOBo+OBpuOChOOCiyZxdW90OzsKICAgICAgICB9CiAgICAgICAgY291dCAmbHQ7Jmx0OyBlbmRsOwogICAgICAgIGlzX2Vycm9yX2tpbnVuID0gdHJ1ZTsKICAgIH0KICAgIGVsc2UgaWYoa2ludW4gJmd0Oz0gODMpewogICAgICAgIGNvdXQgJmx0OyZsdDsgJnF1b3Q754m55aSn5ZCJ44Gn44GZ77yB77yB44CA44CA44KT77yfJnF1b3Q7ICZsdDsmbHQ7IGVuZGw7CiAgICAgICAgY291dCAmbHQ7Jmx0OyAmcXVvdDvjgZ3jgZfjgabpgYvli6LjgpLooajjgZnmlbDlrZfjga/jgIEmcXVvdDsgJmx0OyZsdDsga2ludW4gJmx0OyZsdDsgJnF1b3Q744Gn44GZ772l772lICZuYnNwOyDjga/vvJ8mcXVvdDsgJmx0OyZsdDsgZW5kbDsKICAgICAgICBjb3V0ICZsdDsmbHQ7ICZxdW90O+aVsOWtl+OBjOmrmOOBmeOBjuOBvuOBme+8geOAgOOBk+OCjOOBr+ODkOOCsOOBp+OBmeOAgiZxdW90OyAmbHQ7Jmx0OyBlbmRsOwogICAgICAgIGNvdXQgJmx0OyZsdDsgJnF1b3Q75LuK44GZ44GQ44GK44G/44GP44GY5Lya56S+44Gr6YCj57Wh44GX44Gm5LiL44GV44GE77yBJnF1b3Q7ICZsdDsmbHQ7IGVuZGw7CiAgICAgICAgaXNfZXJyb3Jfa2ludW4gPSB0cnVlOwogICAgfQogICAgaWYgKCFpc19lcnJvcl9raW51bikgewogICAgICAgIGlmKGtpbnVuICZndDs9IDU3KXsgY291dCAmbHQ7Jmx0OyAmcXVvdDvjgYrjgoHjgafjgajjgYbvvIHvvIHlpKflkInjgafjgZnjgIImcXVvdDsgJmx0OyZsdDsgZW5kbDsgY291dCAmbHQ7Jmx0OyAmcXVvdDvjgZ3jgZfjgabpgYvli6LjgpLooajjgZnmlbDlrZfjga/jgIEmcXVvdDsgJmx0OyZsdDsga2ludW4gJmx0OyZsdDsgJnF1b3Q744Gn44GZ44CCJnF1b3Q7ICZsdDsmbHQ7IGVuZGw7IGNvdXQgJmx0OyZsdDsgJnF1b3Q744GT44Gu5LiA6YCx6ZaT44Gv44CB6Ieo5pmC5Y+O5YWl44GM5pyf5b6F44Gn44GN44G+44GZ77yB77yBJnF1b3Q7ICZsdDsmbHQ7IGVuZGw7IGNvdXQgJmx0OyZsdDsgJnF1b3Q744G+44GC44CC44GK44G/44GP44GY44Gv6YCG44Gu6YGL5Yui44Gr44Gq44KK44KE44GZ44GE44Go6KiA44KP44KM44Gm44GE44KL44Gu44Gn44GZ44GM772l772lJnF1b3Q7ICZsdDsmbHQ7IGVuZGw7IH0KICAgICAgICBlbHNlIGlmKGtpbnVuICZndDs9IDU1KXsgY291dCAmbHQ7Jmx0OyAmcXVvdDvkuK3lkInjgafjgZnjgIImcXVvdDsgJmx0OyZsdDsgZW5kbDsgY291dCAmbHQ7Jmx0OyAmcXVvdDvjgZ3jgZfjgabpgYvli6LjgpLooajjgZnmlbDlrZfjga/jgIEmcXVvdDsgJmx0OyZsdDsga2ludW4gJmx0OyZsdDsgJnF1b3Q744Gn44GZ44CCJnF1b3Q7ICZsdDsmbHQ7IGVuZGw7IGNvdXQgJmx0OyZsdDsgJnF1b3Q75aSn5ZCJ44Gv5oOF57eS5LiN5a6J5a6a44Gq44GT44Go44GM5aSa44GE44Gu44Gn44CB5a6f6LOq5LiA55Wq44GE44GE6YGL5Yui44GL44KC44GX44KM44G+44Gb44KT77yB77yBJnF1b3Q7ICZsdDsmbHQ7IGVuZGw7IGNvdXQgJmx0OyZsdDsgJnF1b3Q75aSn44GN44Gq5Ye66LK744GM44CB5a6J44GP44Gq44KL44GL44KC77yfJnF1b3Q7ICZsdDsmbHQ7IGVuZGw7IH0KICAgICAgICBlbHNlIGlmKGtpbnVuICZndDs9IDUyKXsgY291dCAmbHQ7Jmx0OyAmcXVvdDvlkInjgafjgZnjgIImcXVvdDsgJmx0OyZsdDsgZW5kbDsgY291dCAmbHQ7Jmx0OyAmcXVvdDvjgZ3jgZfjgabpgYvli6LjgpLooajjgZnmlbDlrZfjga/jgIEmcXVvdDsgJmx0OyZsdDsga2ludW4gJmx0OyZsdDsgJnF1b3Q744Gn44GZ44CCJnF1b3Q7ICZsdDsmbHQ7IGVuZGw7IGNvdXQgJmx0OyZsdDsgJnF1b3Q744Gh44KH44Gj44Go44GX44Gf44Oc44O844OK44K544GM44GC44KL44GL44KC77yfJnF1b3Q7ICZsdDsmbHQ7IGVuZGw7IH0KICAgICAgICBlbHNlIGlmKGtpbnVuICZndDs9IDQ4KXsgY291dCAmbHQ7Jmx0OyAmcXVvdDvlsI/lkInjgafjgZkmcXVvdDsgJmx0OyZsdDsgZW5kbDsgY291dCAmbHQ7Jmx0OyAmcXVvdDvjgZ3jgZfjgabpgYvli6LjgpLooajjgZnmlbDlrZfjga/jgIEmcXVvdDsgJmx0OyZsdDsga2ludW4gJmx0OyZsdDsgJnF1b3Q744Gn44GZ44CCJnF1b3Q7ICZsdDsmbHQ7IGVuZGw7IGNvdXQgJmx0OyZsdDsgJnF1b3Q75aSn44GN44Gq5Ye66LK744Gu5aWR57SE44GM44CB5bCR44GX44Gg44GR44GG44G+44GP44GE44GP44GL44KC77yfJnF1b3Q7ICZsdDsmbHQ7IGVuZGw7IH0KICAgICAgICBlbHNlIGlmKGtpbnVuICZndDs9IDQzKXsgY291dCAmbHQ7Jmx0OyAmcXVvdDvljYrlkInjgafjgZnjgIImcXVvdDsgJmx0OyZsdDsgZW5kbDsgY291dCAmbHQ7Jmx0OyAmcXVvdDvpgYvli6LjgpLooajjgZnmlbDlrZfjga/jgIEmcXVvdDsgJmx0OyZsdDsga2ludW4gJmx0OyZsdDsgJnF1b3Q744Gn44GZ44CCJnF1b3Q7ICZsdDsmbHQ7IGVuZGw7IGNvdXQgJmx0OyZsdDsgJnF1b3Q76Ieq5YiG44GM5rCX44Gr44Gq44Gj44Gm44GE44Gf44GK6I+T5a2Q44GM44CB44GK44G/44KE44GS44Go44GX44Gm5bGK44GP44GL44KC77yfJnF1b3Q7ICZsdDsmbHQ7IGVuZGw7IH0KICAgICAgICBlbHNlIGlmKGtpbnVuICZndDs9IDM3KXsgY291dCAmbHQ7Jmx0OyAmcXVvdDvmnKvlkInjgafjgZnjgIImcXVvdDsgJmx0OyZsdDsgZW5kbDsgY291dCAmbHQ7Jmx0OyAmcXVvdDvjgZ3jgZfjgabpgYvli6LjgpLooajjgZnmlbDlrZfjga/jgIEmcXVvdDsgJmx0OyZsdDsga2ludW4gJmx0OyZsdDsgJnF1b3Q744Gn44GZ44CCJnF1b3Q7ICZsdDsmbHQ7IGVuZGw7IGNvdXQgJmx0OyZsdDsgJnF1b3Q744GK5bCP6YGj44GE44GM5bCR44GX5LiK44GM44KL44GL44KC77yfJnF1b3Q7ICZsdDsmbHQ7IGVuZGw7IH0KICAgICAgICBlbHNlIGlmKGtpbnVuICZndDs9IDMxKXsgY291dCAmbHQ7Jmx0OyAmcXVvdDvmnKvlsI/lkInjgafjgZnjgIImcXVvdDsgJmx0OyZsdDsgZW5kbDsgY291dCAmbHQ7Jmx0OyAmcXVvdDvjgZ3jgZfjgabpgYvli6LjgpLooajjgZnmlbDlrZfjga/jgIEmcXVvdDsgJmx0OyZsdDsga2ludW4gJmx0OyZsdDsgJnF1b3Q744Gn44GZ44CCJnF1b3Q7ICZsdDsmbHQ7IGVuZGw7IGNvdXQgJmx0OyZsdDsgJnF1b3Q75bCR44GX44Gg44GR44K144O844OT44K544GX44Gm44GP44KM44KL44GL44KC77yfJnF1b3Q7ICZsdDsmbHQ7IGVuZGw7IH0KICAgICAgICBlbHNlIGlmKGtpbnVuICZndDs9IDI3KXsgY291dCAmbHQ7Jmx0OyAmcXVvdDvmnKvlh7bjgafjgZnjgIImcXVvdDsgJmx0OyZsdDsgZW5kbDsgY291dCAmbHQ7Jmx0OyAmcXVvdDvjgZ3jgZfjgabpgYvli6LjgpLooajjgZnmlbDlrZfjga/jgIEmcXVvdDsgJmx0OyZsdDsga2ludW4gJmx0OyZsdDsgJnF1b3Q744Gn44GZ44CCJnF1b3Q7ICZsdDsmbHQ7IGVuZGw7IGNvdXQgJmx0OyZsdDsgJnF1b3Q75aWR57SE44GM5bCR44GX5LiN5Yip44Gr44Gq44KL44GL44KC77yfJnF1b3Q7ICZsdDsmbHQ7IGVuZGw7IH0KICAgICAgICBlbHNlIGlmKGtpbnVuICZndDs9IDI0KXsgY291dCAmbHQ7Jmx0OyAmcXVvdDvljYrlh7bjgafjgZkmcXVvdDsgJmx0OyZsdDsgZW5kbDsgY291dCAmbHQ7Jmx0OyAmcXVvdDvjgZ3jgZfjgabpgYvli6LjgpLooajjgZnmlbDlrZfjga/jgIEmcXVvdDsgJmx0OyZsdDsga2ludW4gJmx0OyZsdDsgJnF1b3Q744Gn44GZ44CCJnF1b3Q7ICZsdDsmbHQ7IGVuZGw7IGNvdXQgJmx0OyZsdDsgJnF1b3Q75aWR57SE44GM6Zuj44GX44GP44Gq44KL44GL44KC77yfJnF1b3Q7ICZsdDsmbHQ7IGVuZGw7IH0KICAgICAgICBlbHNlIGlmKGtpbnVuICZndDs9IDIyKXsgY291dCAmbHQ7Jmx0OyAmcXVvdDvlsI/lh7bjgafjgZnjgIImcXVvdDsgJmx0OyZsdDsgZW5kbDsgY291dCAmbHQ7Jmx0OyAmcXVvdDvjgZ3jgZfjgabpgYvli6LjgpLooajjgZnmlbDlrZfjga/jgIEmcXVvdDsgJmx0OyZsdDsga2ludW4gJmx0OyZsdDsgJnF1b3Q744Gn44GZ44CCJnF1b3Q7ICZsdDsmbHQ7IGVuZGw7IGNvdXQgJmx0OyZsdDsgJnF1b3Q75oCd44Gj44Gf5Lul5LiK44Gr5YCk44GM44Gv44KL44GL44KC77yfJnF1b3Q7ICZsdDsmbHQ7IGVuZGw7IH0KICAgICAgICBlbHNlIGlmKGtpbnVuICZndDs9IDIxKXsgY291dCAmbHQ7Jmx0OyAmcXVvdDvlh7bjgafjgZnjgIImcXVvdDsgJmx0OyZsdDsgZW5kbDsgY291dCAmbHQ7Jmx0OyAmcXVvdDvjgZ3jgZfjgabpgYvli6LjgpLooajjgZnmlbDlrZfjga/jgIEmcXVvdDsgJmx0OyZsdDsga2ludW4gJmx0OyZsdDsgJnF1b3Q744Gn44GZ44CCJnF1b3Q7ICZsdDsmbHQ7IGVuZGw7IGNvdXQgJmx0OyZsdDsgJnF1b3Q75aWR57SE44GM5Y+W44KM44Gq44GP44Gq44KL44GL44KC77yfJnF1b3Q7ICZsdDsmbHQ7IGVuZGw7IH0KICAgICAgICBlbHNlIGlmKGtpbnVuICZndDs9IDE4KXsgY291dCAmbHQ7Jmx0OyAmcXVvdDvmrovlv7XjgILlpKflh7bjgafjgZnjgIImcXVvdDsgJmx0OyZsdDsgZW5kbDsgY291dCAmbHQ7Jmx0OyAmcXVvdDvjgZ3jgZfjgabpgYvli6LjgpLooajjgZnmlbDlrZfjga/jgIEmcXVvdDsgJmx0OyZsdDsga2ludW4gJmx0OyZsdDsgJnF1b3Q744Gn44GZ772l772lJnF1b3Q7ICZsdDsmbHQ7IGVuZGw7IGNvdXQgJmx0OyZsdDsgJnF1b3Q744GT44Gu5LiA6YCx6ZaT44Gv44CB44GL44Gq44KK5oWO6YeN44Gr6KGM5YuV44GX44Gm5LiL44GV44GEJnF1b3Q7ICZsdDsmbHQ7IGVuZGw7IGNvdXQgJmx0OyZsdDsgJnF1b3Q744G+44Gf44CB44GL44Gq44KK44Gu5Ye66LK744GM44Gn44KL5LqI5oSf44GM44GX44G+44GZ772l772lJnF1b3Q7ICZsdDsmbHQ7IGVuZGw7IH0KICAgICAgICBlbHNlIGlmKGtpbnVuICZndDsgOCl7IGNvdXQgJmx0OyZsdDsgJnF1b3Q75aSn5aSn5Ye244Gn44GZ77yB77yB44CA44CA44KT77yfJnF1b3Q7ICZsdDsmbHQ7IGVuZGw7IGNvdXQgJmx0OyZsdDsgJnF1b3Q744Gd44GX44Gm6YGL5Yui44KS6KGo44GZ5pWw5a2X44Gv44CBJnF1b3Q7ICZsdDsmbHQ7IGtpbnVuICZsdDsmbHQ7ICZxdW90O+OBp+OBme+9pe+9pSAmbmJzcDsg44Gv77yfJnF1b3Q7ICZsdDsmbHQ7IGVuZGw7IGNvdXQgJmx0OyZsdDsgJnF1b3Q75pWw5a2X44GM5L2O44GZ44GO44G+44GZ77yB44CA44GT44KM44Gv44OQ44Kw44Gn44GZ44CCJnF1b3Q7ICZsdDsmbHQ7IGVuZGw7IGNvdXQgJmx0OyZsdDsgJnF1b3Q75LuK44GZ44GQ44GK44G/44GP44GY5Lya56S+44Gr6YCj57Wh44GX44Gm5LiL44GV44GE77yBJnF1b3Q7ICZsdDsmbHQ7IGVuZGw7IH0KICAgICAgICBlbHNlIGlmKGtpbnVuID09IDcpeyBjb3V0ICZsdDsmbHQ7ICZxdW90O+OBqeOCk+W6leOBruWkp+WHtuOBp+OBmeOAguOAgOOAgOOBr++8nyZxdW90OyAmbHQ7Jmx0OyBlbmRsOyBjb3V0ICZsdDsmbHQ7ICZxdW90O+e1tuWvvuOBq+OBguOCiuW+l+OBvuOBm+OCkyEhJnF1b3Q7ICZsdDsmbHQ7IGVuZGw7IGNvdXQgJmx0OyZsdDsgJnF1b3Q7N+OBpOOBqOOCguWkp+WHtuOBjOWHuuOCi+OBquOCk+OBpu+8geOBk+OCjOOBr+ODkOOCsOOBp+OBmeOAgiZxdW90OyAmbHQ7Jmx0OyBlbmRsOyBjb3V0ICZsdDsmbHQ7ICZxdW90O+OBmeOBkOOBiuOBv+OBj+OBmOS8muekvuOBq+mAo+e1oeOBl+OBpuOBj+OBoOOBleOBhO+8ge+8gSZxdW90OyAmbHQ7Jmx0OyBlbmRsOyB9CiAgICAgICAgZWxzZXsgY291dCAmbHQ7Jmx0OyAmcXVvdDvjgZnjgb/jgb7jgZvjgpPjgILmuKzlrprkuI3og73jgafjgZnjgIImcXVvdDsgJmx0OyZsdDsgZW5kbDsgY291dCAmbHQ7Jmx0OyAmcXVvdDvjgYrjgb/jgY/jgZjkvJrnpL7jgavloLHlkYrjgZfjgabjgoLjgonjgYjjgovjgajliqnjgYvjgorjgb7jgZnjgIImcXVvdDsgJmx0OyZsdDsgZW5kbDsgY291dCAmbHQ7Jmx0OyAmcXVvdDvjgb7jgYHvvJHjgaToqIDjgYjjgovjgZPjgajjgajjgZfjgabjga/jgIEmcXVvdDsgJmx0OyZsdDsgZW5kbDsgY291dCAmbHQ7Jmx0OyAmcXVvdDvjgrPjg7zjg4njgILmm7jjgY3mj5vjgYjjgZ/jgaDjgo3wn5KiJnF1b3Q7ICZsdDsmbHQ7IGVuZGw7IGNvdXQgJmx0OyZsdDsgJnF1b3Q744GK5YmN44Gv5Lq644Gu5L2c5ZOB44KS5aOK44GX44Gm44CB5L2V44GM44GX44Gf44GE44KT44Gg44KIJnF1b3Q7ICZsdDsmbHQ7IGVuZGw7IGNvdXQgJmx0OyZsdDsgJnF1b3Q75ZGq44Gj44Gm44KE44KL772l772l772l772l772l772l772l772l772l772lJnF1b3Q7OyBmb3IoaW50IG89MDsgbyAmbHQ7IDUwOyBvKyspeyBjb3V0ICZsdDsmbHQ7ICZxdW90O+WRquOBo+OBpuOChOOCiyZxdW90OzsgfSBjb3V0ICZsdDsmbHQ7IGVuZGw7IH0KICAgIH0KCiAgICBjb3V0ICZsdDsmbHQ7IGVuZGw7CgogICAgaWYoIWlzX2Vycm9yX2dvdWtlaSAmYW1wOyZhbXA7ICFpc19lcnJvcl9raW51bikgewogICAgICAgIGlmKGdvdWtlaSAmbHQ7IDE4IHx8IGdvdWtlaSAmZ3Q7IDYxIHx8IGtpbnVuICZsdDsgMTggfHwga2ludW4gJmd0OyA1OSl7CiAgICAgICAgICAgIGNvdXQgJmx0OyZsdDsgJnF1b3Q744GT44GT44G+44Gn6KaL44Gr5p2l44Gf44KT44Gn44GZ44Gt772l772l772l772lJnF1b3Q7ICZsdDsmbHQ7IGVuZGw7CiAgICAgICAgICAgIGNvdXQgJmx0OyZsdDsgJnF1b3Q744GC44Gq44Gf44Gv5Ye656aB44Gn44GZ77yB44CA44Go6KiA44GE44Gf44GE44Go44GT44KN44Gn44GZ44GM44CBJnF1b3Q7ICZsdDsmbHQ7IGVuZGw7CiAgICAgICAgICAgIGNvdXQgJmx0OyZsdDsgJnF1b3Q7MeWbnuOBoOOBkeioseOBl+OBpuOBguOBkuOBvuOBl+OCh+OBhuOAgiZxdW90OyAmbHQ7Jmx0OyBlbmRsOwogICAgICAgICAgICBjb3V0ICZsdDsmbHQ7ICZxdW90O+OBoOOBkeOBqeOAgeasoeOBr+OBguOCiuOBvuOBm+OCk++8gSZxdW90OyAmbHQ7Jmx0OyBlbmRsOwogICAgICAgICAgICBjb3V0ICZsdDsmbHQ7ICZxdW90O+WPjeecgeOBp+OBjeOBn+OBquOCieOAgeOCs+ODvOODieOCkuebtOOBl+OBpuOAgeWun+ihjOODnOOCv+ODs+OCkuaKvOOBl+OBpuS4i+OBleOBhOOAgiZxdW90OyAmbHQ7Jmx0OyBlbmRsOwogICAgICAgICAgICBjb3V0ICZsdDsmbHQ7ICZxdW90O+S7iumAseOBrumBi+WLouOBjOWHuuOBvuOBmeOAgiZxdW90OyAmbHQ7Jmx0OyBlbmRsOwogICAgICAgICAgICBjb3V0ICZsdDsmbHQ7ICZxdW90O+WIpeOBq+aAluOBjOOCieOBquOBj+OBpuOBhOOBhOOCk+OBp+OBmeOCiO+8gSZxdW90OyAmbHQ7Jmx0OyBlbmRsOwogICAgICAgICAgICBjb3V0ICZsdDsmbHQ7ICZxdW90O+iHquWIhuOBjOefpeOBo+OBpuOBhOOCi+evhOWbsuOBp+OCguOAgUMrK+aVmeOBiOOBvuOBl+OCh+OBhuOBi++8nyZxdW90OyAmbHQ7Jmx0OyBlbmRsOwogICAgICAgICAgICBjb3V0ICZsdDsmbHQ7ICZxdW90O+WrjOOBquOCieaXqeOBj+aKvOOBl+OBpuS4i+OBleOBhO+8gSZxdW90OyAmbHQ7Jmx0OyBlbmRsOwogICAgICAgICAgICBjb3V0ICZsdDsmbHQ7ICZxdW90O+aXqeOBj++8ge+8ge+8ge+8ge+8ge+8ge+8gSZxdW90OyAmbHQ7Jmx0OyBlbmRsOwogICAgICAgIH0KICAgIH0KICAgIGludCBzb3V1bm5zZWkgPSBnb3VrZWkgKyBraW51bjsKICAgIGNvdXQgJmx0OyZsdDsgJnF1b3Q757eP5ZCI55qE44Gq6YGL5Yui44Gu5ZCI6KiI44Gv44CBJnF1b3Q7ICZsdDsmbHQ7IHNvdXVubnNlaSAmbHQ7Jmx0OyAmcXVvdDvjgafjgZnjgIImcXVvdDsgJmx0OyZsdDsgZW5kbDsKfQoKaW50IG1haW4oKXsKICAgIHNyYW5kKCAodW5zaWduZWQpdGltZSggTlVMTCApICk7CgogICAgY291dCAmbHQ7Jmx0OyAmcXVvdDvku4rjgYvjgonjgYrjgb/jgY/jgZjjgpLjgZfjgb7jgZnjgIImcXVvdDsgJmx0OyZsdDsgZW5kbDsKICAgIGNvdXQgJmx0OyZsdDsgJnF1b3Q76YGL5Yui44Gv44CBJnF1b3Q7ICZsdDsmbHQ7IGVuZGw7CiAgICBjb3V0ICZsdDsmbHQ7ICZxdW90O+Wkp+WQie+8nOS4reWQie+8nOWQie+8nOWwj+WQie+8nOWNiuWQie+8nOacq+WQie+8nOacq+Wwj+WQie+8nOacq+WHtu+8nOWNiuWHtu+8nOWwj+WHtu+8nOWHtu+8nOWkp+WHtuOBp+OAgSZxdW90OyAmbHQ7Jmx0OyBlbmRsOwogICAgY291dCAmbHQ7Jmx0OyAmcXVvdDvlt6bjga7mlrnjgYzpgYvli6LjgYzjgojjgY/jgIHlj7Pjga7mlrnjgYzmgqrjgYTjgafjgZnjgIImcXVvdDsgJmx0OyZsdDsgZW5kbDsKICAgIGNvdXQgJmx0OyZsdDsgJnF1b3Q76YGL5Yui44GM77yR55Wq6Imv44GE5aSn5ZCJ44GvNDPliIbjga7vvJHjga7norrnjofjgaflh7rjgb7jgZnjgIImcXVvdDsgJmx0OyZsdDsgZW5kbDsKICAgIGNvdXQgJmx0OyZsdDsgJnF1b3Q75pyA5b6M44Gr44CB44GC44Gq44Gf44Gu5LiA6YCx6ZaT44G+44Go44KB44Gm44Gu6YGL5Yui44GM5Ye644G+44GZ44CCJnF1b3Q7ICZsdDsmbHQ7IGVuZGw7CiAgICBjb3V0ICZsdDsmbHQ7ICZxdW90O+OBvuOBqOOCgeOBpuOBrumBi+WLouOBr+OAgeaVsOWtl+OBqOaWh+Wtl+OBp+WHuuOBvuOBmeOAgiZxdW90OyAmbHQ7Jmx0OyBlbmRsOwogICAgY291dCAmbHQ7Jmx0OyAmcXVvdDvmlbDlrZfjga/pq5jjgYTjgbvjganpgYvli6LjgYzjgojjgY/jgIHkvY7jgYTjgbvjganpgYvli6LjgYzmgqrjgYTjgafjgZnjgIImcXVvdDsgJmx0OyZsdDsgZW5kbDsKICAgIGNvdXQgJmx0OyZsdDsgJnF1b3Q744Gq44GE44Go5oCd44GE44G+44GZ44GM44CB5YWo44Gm5aSn5ZCJ44Gg44Gj44Gf44KJ44CBODTngrnjgavjgarjgorjgb7jgZnvvIh3d3fwn5iG77yJJnF1b3Q7ICZsdDsmbHQ7IGVuZGw7CiAgICBjb3V0ICZsdDsmbHQ7ICZxdW90O+OBk+OBoeOCieOCguOCguOBhOOBqOaAneOBhOOBvuOBmeOBjOOAgeWFqOOBpuWkp+WHtuOBoOOBo+OBn+OCieOAgTfngrnjgavjgarjgorjgb7jgZnjgILvvIh3d3fwn6Sj77yJJnF1b3Q7ICZsdDsmbHQ7IGVuZGw7CiAgICBjb3V0ICZsdDsmbHQ7ICZxdW90O+aCquOBhOmBi+WLouOBjOWHuuOBpuOCguOAgeiyrOS7u+OBr+WPluOCjOOBvuOBm+OCk+OBruOBp+OAgeiHquW3seiyrOS7u+OBp+OBiumhmOOBhOOBl+OBvuOBmeOAgvCfmYcmcXVvdDsgJmx0OyZsdDsgZW5kbDsKICAgIGNvdXQgJmx0OyZsdDsgJnF1b3Q744Gd44KM44Gn44Gv5pep6YCf44CC44GK44G/44GP44GY44KS5byV44GE44Gm44G/44Gm44GP44Gg44GV44GE77yBJnF1b3Q7ICZsdDsmbHQ7IGVuZGw7CiAgICBjb3V0ICZsdDsmbHQ7IGVuZGw7CgogICAgaW50IG51bV9wbGF5ZXJzOwogICAgd2hpbGUgKHRydWUpIHsKICAgICAgICBjb3V0ICZsdDsmbHQ7ICZxdW90O+S9leS6uuOBp+OBiuOBv+OBj+OBmOOCkuW8leOBjeOBvuOBmeOBi++8nyAoMuS6uuS7peS4iuOAgTXkurrjgb7jgafmjqjlpagpOiAmcXVvdDs7CiAgICAgICAgY2luICZndDsmZ3Q7IG51bV9wbGF5ZXJzOwoKICAgICAgICAvLyDmlbDlgKTku6XlpJbjga7lhaXlipvjgYzjgZXjgozjgZ/loLTlkIjjga7lh6bnkIYKICAgICAgICBpZiAoY2luLmZhaWwoKSkgewogICAgICAgICAgICBjb3V0ICZsdDsmbHQ7ICZxdW90O+eEoeWKueOBquWFpeWKm+OBp+OBmeOAguaVsOWtl+OCkuWFpeWKm+OBl+OBpuOBj+OBoOOBleOBhOOAgiZxdW90OyAmbHQ7Jmx0OyBlbmRsOwogICAgICAgICAgICBjaW4uY2xlYXIoKTsgLy8g44Ko44Op44O844OV44Op44Kw44KS44Kv44Oq44KiCiAgICAgICAgICAgIC8vIOWFpeWKm+ODkOODg+ODleOCoeOBq+aui+OBo+OBpuOBhOOCi+S4jeimgeOBquaWh+Wtl+OCkuOBmeOBueOBpuiqreOBv+mjm+OBsOOBmQogICAgICAgICAgICBjaW4uaWdub3JlKG51bWVyaWNfbGltaXRzJmx0O3N0cmVhbXNpemUmZ3Q7OjptYXgoKSwgJ1xuJyk7CiAgICAgICAgICAgIGNvbnRpbnVlOyAvLyDjg6vjg7zjg5fjga7mnIDliJ3jgavmiLvjgosKICAgICAgICB9CgogICAgICAgIC8vIOevhOWbsuWkluOBruWFpeWKm+ODgeOCp+ODg+OCrwogICAgICAgIGlmIChudW1fcGxheWVycyAmZ3Q7PSAyICZhbXA7JmFtcDsgbnVtX3BsYXllcnMgJmx0Oz0gNSkgeyAvLyAy5Lq644GL44KJNeS6uuOBvuOBp+aOqOWlqAogICAgICAgICAgICBicmVhazsgLy8g5q2j44GX44GE5YWl5Yqb44Gq44Gu44Gn44Or44O844OX44KS5oqc44GR44KLCiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgY291dCAmbHQ7Jmx0OyAmcXVvdDvnlLPjgZfoqLPjgYLjgorjgb7jgZvjgpPjgYzjgIEy5Lq65Lul5LiKNeS6uuOBvuOBp+OBp+OBiumhmOOBhOOBl+OBvuOBmeOAgiZxdW90OyAmbHQ7Jmx0OyBlbmRsOwogICAgICAgIH0KICAgIH0KICAgIC8vIGNpbuOBp+aVsOWApOOCkuiqreOCk+OBoOW+jOOBq2dldGxpbmXjgpLkvb/jgYbjgZ/jgoHjga7jg5Djg4Pjg5XjgqHjgq/jg6rjgqIKICAgIGNpbi5pZ25vcmUobnVtZXJpY19saW1pdHMmbHQ7c3RyZWFtc2l6ZSZndDs6Om1heCgpLCAnXG4nKTsKCiAgICB2ZWN0b3ImbHQ7T21pa3VqaSZndDsgcGxheWVyczsgLy8gT21pa3VqaeOCquODluOCuOOCp+OCr+ODiOOCkuikh+aVsOOBl+OBvuOBo+OBpuOBiuOBj+eusSAodmVjdG9yKQogICAgcGxheWVycy5yZXNlcnZlKG51bV9wbGF5ZXJzKTsgLy8g5pyA5Yid44Gr5b+F6KaB44Gq5YiG44Gu44Oh44Oi44Oq44KS56K65L+d44GX44Gm44GK44GP44Go5bCR44GX5Yq5546H55qECgogICAgLy8g5ZCE44OX44Os44Kk44Ok44O844Gu44GK44G/44GP44GY44KS5byV44GPCiAgICBmb3IgKGludCBwX2lkeCA9IDA7IHBfaWR4ICZsdDsgbnVtX3BsYXllcnM7ICsrcF9pZHgpIHsKICAgICAgICBPbWlrdWppIGN1cnJlbnRfcGxheWVyX29taWt1amk7IC8vIOaWsOOBl+OBhE9taWt1amnjgqrjg5bjgrjjgqfjgq/jg4jjgpLkvZzmiJAKCiAgICAgICAgc3RyaW5nIHBsYXllcl9uYW1lX2lucHV0OwogICAgICAgIGNvdXQgJmx0OyZsdDsgZW5kbCAmbHQ7Jmx0OyAmcXVvdDstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0mcXVvdDsgJmx0OyZsdDsgZW5kbDsKICAgICAgICBjb3V0ICZsdDsmbHQ7IChwX2lkeCArIDEpICZsdDsmbHQ7ICZxdW90O+S6uuebruOBruWQjeWJjeOCkuWFpeWKm+OBl+OBpuS4i+OBleOBhDogJnF1b3Q7OwogICAgICAgIGdldGxpbmUoY2luLCBwbGF5ZXJfbmFtZV9pbnB1dCk7CiAgICAgICAgY3VycmVudF9wbGF5ZXJfb21pa3VqaS5zZXRfcGxheWVyX25hbWUocGxheWVyX25hbWVfaW5wdXQpOwoKICAgICAgICBjb3V0ICZsdDsmbHQ7IGN1cnJlbnRfcGxheWVyX29taWt1amkuZ2V0X3BsYXllcl9uYW1lKCkgJmx0OyZsdDsgJnF1b3Q744GV44KT44GuMemAsemWk+WIhuOBruWNoOOBhOOBp+OBmeOAgiZxdW90OyAmbHQ7Jmx0OyBlbmRsOwogICAgICAgIGNvdXQgJmx0OyZsdDsgJnF1b3Q744G+44Ga44Gv57eP5ZCI6YGL44KS5Y2g44GE44G+44GZ44CCJnF1b3Q7ICZsdDsmbHQ7IGVuZGw7CiAgICAgICAgZm9yKGludCBpID0gMDsgaSAmbHQ7IDc7ICsraSl7CiAgICAgICAgICAgIGlmIChpID09IDApIHsKICAgICAgICAgICAgICAgIGNvdXQgJmx0OyZsdDsgJnF1b3Q75LuK5pel77yaJnF1b3Q7OwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgY291dCAmbHQ7Jmx0OyAmcXVvdDvku4rml6XjgYvjgokmcXVvdDsgJmx0OyZsdDsgaSAmbHQ7Jmx0OyAmcXVvdDvml6XlvozvvJomcXVvdDsgOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGN1cnJlbnRfcGxheWVyX29taWt1amkuaGlrdSgpOwogICAgICAgIH0KICAgICAgICBjb3V0ICZsdDsmbHQ7IGVuZGw7CiAgICAgICAgY291dCAmbHQ7Jmx0OyAmcXVvdDvmrKHjgavph5HpgYvjgafjgZnjgIImcXVvdDsgJmx0OyZsdDsgZW5kbDsKICAgICAgICBmb3IoaW50IHcgPSAwOyB3ICZsdDsgNzsgKyt3KXsKICAgICAgICAgICAgaWYgKHcgPT0gMCkgewogICAgICAgICAgICAgICAgY291dCAmbHQ7Jmx0OyAmcXVvdDvku4rml6XvvJomcXVvdDs7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICBjb3V0ICZsdDsmbHQ7ICZxdW90O+S7iuaXpeOBi+OCiSZxdW90OyAmbHQ7Jmx0OyB3ICZsdDsmbHQ7ICZxdW90O+aXpeW+jO+8miZxdW90OzsKICAgICAgICAgICAgfQogICAgICAgICAgICBjdXJyZW50X3BsYXllcl9vbWlrdWppLmthbmFrYW5hKCk7CiAgICAgICAgfQogICAgICAgIGNvdXQgJmx0OyZsdDsgZW5kbDsKICAgICAgICBjdXJyZW50X3BsYXllcl9vbWlrdWppLnVubnNlaSgpOyAvLyDpgYvli6Ljga7mnIDntYLooajnpLrjgahzb3V1bm5zZWnoqIjnrpcKCiAgICAgICAgcGxheWVycy5wdXNoX2JhY2soY3VycmVudF9wbGF5ZXJfb21pa3VqaSk7IC8vIOWujOaIkOOBl+OBn+OCquODluOCuOOCp+OCr+ODiOOCknZlY3RvcuOBq+i/veWKoAogICAgfQoKICAgIC8vIOWFqOWToeOBrue3j+WQiOmBi+OCkuavlOi8g+OBmeOCiwogICAgY291dCAmbHQ7Jmx0OyBlbmRsICZsdDsmbHQ7ICZxdW90Oy0tLS0tLS0tLS0g5YWo5ZOh44Gu44GK44G/44GP44GY57WQ5p6c5q+U6LyDIC0tLS0tLS0tLS0mcXVvdDsgJmx0OyZsdDsgZW5kbDsKCiAgICBpZiAobnVtX3BsYXllcnMgJmd0OyAxKSB7IC8vIOikh+aVsOS6uuOBhOOCi+WgtOWQiOOBruOBv+avlOi8gwogICAgICAgIGludCBtYXhfc2NvcmUgPSAtMTsgLy8g5pyA44KC6auY44GE54K55pWw44KS6KaL44Gk44GR44KL44Gf44KB44Gu5aSJ5pWwCiAgICAgICAgaW50IG1pbl9zY29yZSA9IDk5OTsgLy8g5pyA44KC5L2O44GE54K55pWw44KS6KaL44Gk44GR44KL44Gf44KB44Gu5aSJ5pWwICjjgYLjgorjgYjjgarjgYTpq5jjgYTlgKTjgafliJ3mnJ/ljJYpCiAgICAgICAgc3RyaW5nIGJlc3RfcGxheWVyX25hbWUgPSAmcXVvdDsmcXVvdDs7CiAgICAgICAgc3RyaW5nIHdvcnN0X3BsYXllcl9uYW1lID0gJnF1b3Q7JnF1b3Q7OwoKICAgICAgICBmb3IgKGNvbnN0IGF1dG8mYW1wOyBwIDogcGxheWVycykgeyAvLyBwbGF5ZXJzIOOBruS4rei6q+OCkuS4gOOBpOOBmuOBpOWPluOCiuWHuuOBl+OBpiBwIOOBqOWQjeS7mOOBkeOCiyAoY29uc3QgYXV0byZhbXA7IOOBr+OAjOWkieabtOOBl+OBquOBhOOAjeOBqOOBhOOBhuaEj+WRsykKICAgICAgICAgICAgY291dCAmbHQ7Jmx0OyBwLmdldF9wbGF5ZXJfbmFtZSgpICZsdDsmbHQ7ICZxdW90O+OBleOCk+OBruWQiOioiOeCuTogJnF1b3Q7ICZsdDsmbHQ7IHAuZ2V0X3RvdGFsX3Njb3JlKCkgJmx0OyZsdDsgZW5kbDsKCiAgICAgICAgICAgIC8vIOacgOOCgumrmOOBhOeCueaVsOOCkuabtOaWsAogICAgICAgICAgICBpZiAocC5nZXRfdG90YWxfc2NvcmUoKSAmZ3Q7IG1heF9zY29yZSkgewogICAgICAgICAgICAgICAgbWF4X3Njb3JlID0gcC5nZXRfdG90YWxfc2NvcmUoKTsKICAgICAgICAgICAgICAgIGJlc3RfcGxheWVyX25hbWUgPSBwLmdldF9wbGF5ZXJfbmFtZSgpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIC8vIOacgOOCguS9juOBhOeCueaVsOOCkuabtOaWsAogICAgICAgICAgICBpZiAocC5nZXRfdG90YWxfc2NvcmUoKSAmbHQ7IG1pbl9zY29yZSkgewogICAgICAgICAgICAgICAgbWluX3Njb3JlID0gcC5nZXRfdG90YWxfc2NvcmUoKTsKICAgICAgICAgICAgICAgIHdvcnN0X3BsYXllcl9uYW1lID0gcC5nZXRfcGxheWVyX25hbWUoKTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgY291dCAmbHQ7Jmx0OyBlbmRsOwogICAgICAgIGlmIChiZXN0X3BsYXllcl9uYW1lID09IHdvcnN0X3BsYXllcl9uYW1lKSB7CiAgICAgICAgICAgICBjb3V0ICZsdDsmbHQ7ICZxdW90O+WFqOWToeOBrumBi+WLouOBruWQiOioiOeCueOBr+WQjOOBmOOBp+OBl+OBn++8gSAoJnF1b3Q7ICZsdDsmbHQ7IGJlc3RfcGxheWVyX25hbWUgJmx0OyZsdDsgJnF1b3Q744GV44KTOiAmcXVvdDsgJmx0OyZsdDsgbWF4X3Njb3JlICZsdDsmbHQ7ICZxdW90O+eCuSkmcXVvdDsgJmx0OyZsdDsgZW5kbDsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBjb3V0ICZsdDsmbHQ7ICZxdW90O+acgOOCgumBi+WLouOBjOiJr+OBi+OBo+OBn+OBruOBr+OAgSZxdW90OyAmbHQ7Jmx0OyBiZXN0X3BsYXllcl9uYW1lICZsdDsmbHQ7ICZxdW90O+OBleOCk+OBp+OAgSZxdW90OyAmbHQ7Jmx0OyBtYXhfc2NvcmUgJmx0OyZsdDsgJnF1b3Q754K544Gn44GX44Gf77yB44GK44KB44Gn44Go44GG77yBJnF1b3Q7ICZsdDsmbHQ7IGVuZGw7CiAgICAgICAgICAgIGNvdXQgJmx0OyZsdDsgJnF1b3Q75pyA44KC6YGL5Yui44GM5L2O44GL44Gj44Gf44Gu44Gv44CBJnF1b3Q7ICZsdDsmbHQ7IHdvcnN0X3BsYXllcl9uYW1lICZsdDsmbHQ7ICZxdW90O+OBleOCk+OBp+OAgSZxdW90OyAmbHQ7Jmx0OyBtaW5fc2NvcmUgJmx0OyZsdDsgJnF1b3Q754K544Gn44GX44Gf77yB44OJ44Oz44Oe44Kk77yBJnF1b3Q7ICZsdDsmbHQ7IGVuZGw7CiAgICAgICAgfQogICAgfSBlbHNlIHsKICAgICAgICBjb3V0ICZsdDsmbHQ7ICZxdW90O+S4gOS6uuOBoOOBkeOBquOBruOBp+avlOi8g+OBr+OBguOCiuOBvuOBm+OCk+OAgiZxdW90OyAmbHQ7Jmx0OyBlbmRsOwogICAgfQoKICAgIGNvdXQgJmx0OyZsdDsgZW5kbDsKICAgIGNvdXQgJmx0OyZsdDsgJnF1b3Q744GT44KM44Gn44GK44G/44GP44GY44Gv57WC44KP44KK44Gn44GZ44CC44GK55ay44KM5qeY44Gn44GX44Gf77yBJnF1b3Q7ICZsdDsmbHQ7IGVuZGw7CgogICAgcmV0dXJuIDA7Cn0=
#include <iostream>
#include <cstdlib> // rand(), srand() のため
#include <ctime> // time() のため
#include <string>
#include <vector> // ★これが必要になります!
#include <limits> // std::numeric_limits のため (getlineの前処理)
#include <algorithm> // std::max, std::min のため
#ifdef _WIN32
#include <windows.h>
#define sleep_ms(ms) Sleep(ms)
#else
#include <unistd.h>
#define sleep_ms(ms) usleep(ms * 1000)
#endif
using namespace std;
class Omikuji
{
private:
int kinun = 0;
int goukei = 0;
string player_name;
void drawOmikujiResult(int& score_target);
public:
Omikuji();
void hiku();
void unnsei();
void kanakana();
void set_player_name(const string& name);
// ゲッター関数
int get_goukei() const {
return goukei;
}
int get_kinun() const {
return kinun;
}
string get_player_name() const {
return player_name;
}
int get_total_score() const { // 新しく総合点を返すゲッターも追加
return goukei + kinun;
}
};
Omikuji::Omikuji()
{
}
void Omikuji::set_player_name(const string& name) {
player_name = name;
}
void Omikuji::drawOmikujiResult(int& score_target){
int x = rand() % 43 + 1;
switch (x) {
case 1: cout << "小凶" << endl; score_target += 3; break;
case 2: cout << "末小吉" << endl; score_target += 6; break;
case 3: cout << "末凶" << endl; score_target += 5; break;
case 4: cout << "末吉" << endl; score_target += 7; break;
case 5: cout << "半凶" << endl; score_target += 4; break;
case 6: cout << "末小吉" << endl; score_target += 6; break;
case 7: cout << "半吉" << endl; score_target += 8; break;
case 8: cout << "中吉" << endl; score_target += 11; break;
case 9: cout << "小吉" << endl; score_target += 9; break;
case 10: cout << "小凶" << endl; score_target += 3; break;
case 11: cout << "末吉" << endl; score_target += 7; break;
case 12: cout << "凶" << endl; score_target += 2; break;
case 13: cout << "末小吉" << endl; score_target += 6; break;
case 14:
cout << "大吉🎉" << endl;
cout << "あなた大吉を引くなんて、すごく運がいいですね!" << endl;
cout << "だけど、この日は少し気をつけてください。" << endl;
cout << "なぜなら、おみくじは逆の運勢はなりやすいと言われているからです。" << endl;
cout << "しかし、大吉を引いたのは事実なので、自信持ってくださいね!" << endl;
score_target += 12;
break;
case 15: cout << "末凶" << endl; score_target += 5; break;
case 16: cout << "吉" << endl; score_target += 10; break;
case 17: cout << "半吉" << endl; score_target += 8; break;
case 18: cout << "半凶" << endl; score_target += 4; break;
case 19: cout << "末吉" << endl; score_target += 7; break;
case 20: cout << "吉" << endl; score_target += 10; break;
case 21: cout << "末小吉" <<endl; score_target += 6; break;
case 22: cout << "末凶" << endl; score_target += 5; break;
case 23: cout << "小吉" << endl; score_target += 9; break;
case 24: cout << "半吉" << endl; score_target += 8; break;
case 25: cout << "半凶" << endl; score_target += 4; break;
case 26: cout << "末吉" << endl; score_target += 7; break;
case 27: cout << "小凶" << endl; score_target += 3; break;
case 28: cout << "末小吉" << endl; score_target += 6; break;
case 29: cout << "末凶" << endl; score_target += 5; break;
case 30: cout << "小吉" << endl; score_target += 9; break;
case 31: cout << "半吉" << endl; score_target += 8; break;
case 32: cout << "吉" << endl; score_target += 10; break;
case 33: cout << "末吉" << endl; score_target += 7; break;
case 34: cout << "凶" << endl; score_target += 2; break;
case 35: cout << "末小吉" << endl; score_target += 6; break;
case 36: cout << "中吉" << endl; score_target += 11; break;
case 37: cout << "半凶" << endl; score_target += 4; break;
case 38: cout << "末凶" << endl; score_target += 5; break;
case 39:
cout << "大凶😱" << endl;
cout << "あなた大凶を引くなんて、かなり運が悪いですね。" << endl;
cout << "でも大丈夫。なぜなら、おみくじは逆の運勢になりやすいと言われているからです。" << endl;
cout << "なのですごく心配する必要はありません!!" << endl;
cout << "しかし、大凶を引いたのは事実なので、警戒を怠らないでください。" << endl;
score_target += 1;
break;
case 40: cout << "半吉" << endl; score_target += 8; break;
case 41: cout << "末吉" << endl; score_target += 7; break;
case 42: cout << "小吉" << endl; score_target += 9; break;
case 43: cout << "末小吉" << endl; score_target += 6; break;
default: cout << "エラー:不明な運勢番号です。" << endl; break;
}
}
void Omikuji::hiku(){
drawOmikujiResult(goukei);
}
void Omikuji::kanakana(){
drawOmikujiResult(kinun);
}
void Omikuji::unnsei(){
cout << player_name << "さんの一週間の運勢は、";
bool is_error_goukei = false;
bool is_error_kinun = false;
if(goukei == 84){
cout << "超超特大吉です。 は?" << endl;
cout << "絶対にあり得ません!!" << endl;
cout << "7つとも大吉が出るなんて!これはバグです。" << endl;
cout << "すぐおみくじ会社に連絡してください!!" << endl;
is_error_goukei = true;
}
else if(goukei >= 85){
cout << "すみません。測定不能です。" << endl;
cout << "おみくじ会社に報告してもらえると助かります。" << endl;
cout << "まぁ1つ言えることとしては、" << endl;
cout << "コード。書き換えただろ💢" << endl;
cout << "お前は人の作品を壊して、何がしたいんだよ" << endl;
cout << "呪ってやる・・・・・・・・・・";
for(int o=0; o < 50; o++){
cout << "呪ってやる";
}
cout << endl;
is_error_goukei = true;
}
else if(goukei >= 83){
cout << "特大吉です!! ん?" << endl;
cout << "そして運勢を表す数字は、" << goukei << "です・・ は?" << endl;
cout << "数字が高すぎます! これはバグです。" << endl;
cout << "今すぐおみくじ会社に連絡して下さい!" << endl;
is_error_goukei = true;
}
if (!is_error_goukei) {
if(goukei >= 59){ cout << "おめでとう!!大吉です。" << endl; cout << "そして運勢を表す数字は、" << goukei << "です。" << endl; cout << "この一週間は自信持って、行動してみましょう!" << endl; cout << "まあ。おみくじは逆の運勢になりやすいと言われているのですが・・" << endl; }
else if(goukei >= 55){ cout << "中吉です。" << endl; cout << "そして運勢を表す数字は、" << goukei << "です。" << endl; cout << "大吉は情緒不安定なことが多いので、実質一番いい運勢かもしれません!!" << endl; cout << "しかし、大吉より運勢が悪いのは事実なので、大吉目指して、頑張って下さい!" << endl; }
else if(goukei >= 52){ cout << "吉です。" << endl; cout << "そして運勢を表す数字は、" << goukei << "です。" << endl; cout << "以外と結構いいんですね!" << endl; }
else if(goukei >= 48){ cout << "小吉です" << endl; cout << "そして運勢を表す数字は、" << goukei << "です。" << endl; cout << "いつもより少し小さく行動することをお勧めします。 小吉だけに" << endl; }
else if(goukei >= 43){ cout << "半吉です。" << endl; cout << "そして運勢を表す数字は、" << goukei << "です。" << endl; cout << "この辺りから、少しずつ運が下がっていきますね‥" << endl; }
else if(goukei >= 37){ cout << "末吉です。" << endl; cout << "そして運勢を表す数字は、" << goukei << "です。" << endl; cout << "小さな幸運しかないかも?" << endl; }
else if(goukei >= 31){ cout << "末小吉です。" << endl; cout << "そして運勢を表す数字は、" << goukei << "です。" << endl; cout << "凶ギリギリ!" << endl; }
else if(goukei >= 27){ cout << "末凶です。" << endl; cout << "そして運勢を表す数字は、" << goukei << "です。" << endl; cout << "とうとう凶の領域ですよ‥" << endl; }
else if(goukei >= 24){ cout << "半凶です" << endl; cout << "そして運勢を表す数字は、" << goukei << "です。" << endl; cout << "本格的に凶の領域にいますよ・・" << endl; }
else if(goukei >= 22){ cout << "小凶です。" << endl; cout << "そして運勢を表す数字は、" << goukei << "です。" << endl; cout << "ちょっと・中途半端?" << endl; }
else if(goukei >= 21){ cout << "凶です。" << endl; cout << "そして運勢を表す数字は、" << goukei << "です。" << endl; cout << "凶出るなら大凶が良かった・・なんていうSの方はいますか?" << endl; }
else if(goukei >= 18){ cout << "残念。大凶です。" << endl; cout << "そして運勢を表す数字は、" << goukei << "です・・" << endl; cout << "この一週間は、かなり慎重に行動して下さい" << endl; cout << "今すぐおみくじ会社に連絡して下さい!" << endl; }
else if(goukei > 8){ cout << "大大凶です!! ん?" << endl; cout << "そして運勢を表す数字は、" << goukei << "です・・ は?" << endl; cout << "数字が低すぎます! これはバグです。" << endl; cout << "今すぐおみくじ会社に連絡して下さい!" << endl; }
else if(goukei == 7){ cout << "どん底の大凶です。 は?" << endl; cout << "絶対にあり得ません!!" << endl; cout << "7つとも大凶が出るなんて!これはバグです。" << endl; cout << "すぐおみくじ会社に連絡してください!!" << endl; }
else{ cout << "すみません。測定不能です。" << endl; cout << "おみくじ会社に報告してもらえると助かります。" << endl; cout << "まぁ1つ言えることとしては、" << endl; cout << "コード。書き換えただろ💢" << endl; cout << "お前は人の作品を壊して、何がしたいんだよ" << endl; cout << "呪ってやる・・・・・・・・・・"; for(int o=0; o < 50; o++){ cout << "呪ってやる"; } cout << endl; }
}
cout << endl;
cout << "そして一週間の金運は、";
if(kinun == 84){
cout << "超超特大吉です。 は?" << endl;
cout << "絶対にあり得ません!!" << endl;
cout << "7つとも大吉が出るなんて!これはバグです。" << endl;
cout << "すぐおみくじ会社に連絡してください!!" << endl;
is_error_kinun = true;
}
else if(kinun >= 85){
cout << "すみません。測定不能です。" << endl;
cout << "おみくじ会社に報告してもらえると助かります。" << endl;
cout << "まぁ1つ言えることとしては、" << endl;
cout << "コード。書き換えただろ💢" << endl;
cout << "お前は人の作品を壊して、何がしたいんだよ" << endl;
cout << "呪ってやる・・・・・・・・・・";
for(int o=0; o < 50; o++){
cout << "呪ってやる";
}
cout << endl;
is_error_kinun = true;
}
else if(kinun >= 83){
cout << "特大吉です!! ん?" << endl;
cout << "そして運勢を表す数字は、" << kinun << "です・・ は?" << endl;
cout << "数字が高すぎます! これはバグです。" << endl;
cout << "今すぐおみくじ会社に連絡して下さい!" << endl;
is_error_kinun = true;
}
if (!is_error_kinun) {
if(kinun >= 57){ cout << "おめでとう!!大吉です。" << endl; cout << "そして運勢を表す数字は、" << kinun << "です。" << endl; cout << "この一週間は、臨時収入が期待できます!!" << endl; cout << "まあ。おみくじは逆の運勢になりやすいと言われているのですが・・" << endl; }
else if(kinun >= 55){ cout << "中吉です。" << endl; cout << "そして運勢を表す数字は、" << kinun << "です。" << endl; cout << "大吉は情緒不安定なことが多いので、実質一番いい運勢かもしれません!!" << endl; cout << "大きな出費が、安くなるかも?" << endl; }
else if(kinun >= 52){ cout << "吉です。" << endl; cout << "そして運勢を表す数字は、" << kinun << "です。" << endl; cout << "ちょっとしたボーナスがあるかも?" << endl; }
else if(kinun >= 48){ cout << "小吉です" << endl; cout << "そして運勢を表す数字は、" << kinun << "です。" << endl; cout << "大きな出費の契約が、少しだけうまくいくかも?" << endl; }
else if(kinun >= 43){ cout << "半吉です。" << endl; cout << "運勢を表す数字は、" << kinun << "です。" << endl; cout << "自分が気になっていたお菓子が、おみやげとして届くかも?" << endl; }
else if(kinun >= 37){ cout << "末吉です。" << endl; cout << "そして運勢を表す数字は、" << kinun << "です。" << endl; cout << "お小遣いが少し上がるかも?" << endl; }
else if(kinun >= 31){ cout << "末小吉です。" << endl; cout << "そして運勢を表す数字は、" << kinun << "です。" << endl; cout << "少しだけサービスしてくれるかも?" << endl; }
else if(kinun >= 27){ cout << "末凶です。" << endl; cout << "そして運勢を表す数字は、" << kinun << "です。" << endl; cout << "契約が少し不利になるかも?" << endl; }
else if(kinun >= 24){ cout << "半凶です" << endl; cout << "そして運勢を表す数字は、" << kinun << "です。" << endl; cout << "契約が難しくなるかも?" << endl; }
else if(kinun >= 22){ cout << "小凶です。" << endl; cout << "そして運勢を表す数字は、" << kinun << "です。" << endl; cout << "思った以上に値がはるかも?" << endl; }
else if(kinun >= 21){ cout << "凶です。" << endl; cout << "そして運勢を表す数字は、" << kinun << "です。" << endl; cout << "契約が取れなくなるかも?" << endl; }
else if(kinun >= 18){ cout << "残念。大凶です。" << endl; cout << "そして運勢を表す数字は、" << kinun << "です・・" << endl; cout << "この一週間は、かなり慎重に行動して下さい" << endl; cout << "また、かなりの出費がでる予感がします・・" << endl; }
else if(kinun > 8){ cout << "大大凶です!! ん?" << endl; cout << "そして運勢を表す数字は、" << kinun << "です・・ は?" << endl; cout << "数字が低すぎます! これはバグです。" << endl; cout << "今すぐおみくじ会社に連絡して下さい!" << endl; }
else if(kinun == 7){ cout << "どん底の大凶です。 は?" << endl; cout << "絶対にあり得ません!!" << endl; cout << "7つとも大凶が出るなんて!これはバグです。" << endl; cout << "すぐおみくじ会社に連絡してください!!" << endl; }
else{ cout << "すみません。測定不能です。" << endl; cout << "おみくじ会社に報告してもらえると助かります。" << endl; cout << "まぁ1つ言えることとしては、" << endl; cout << "コード。書き換えただろ💢" << endl; cout << "お前は人の作品を壊して、何がしたいんだよ" << endl; cout << "呪ってやる・・・・・・・・・・"; for(int o=0; o < 50; o++){ cout << "呪ってやる"; } cout << endl; }
}
cout << endl;
if(!is_error_goukei && !is_error_kinun) {
if(goukei < 18 || goukei > 61 || kinun < 18 || kinun > 59){
cout << "ここまで見に来たんですね・・・・" << endl;
cout << "あなたは出禁です! と言いたいところですが、" << endl;
cout << "1回だけ許してあげましょう。" << endl;
cout << "だけど、次はありません!" << endl;
cout << "反省できたなら、コードを直して、実行ボタンを押して下さい。" << endl;
cout << "今週の運勢が出ます。" << endl;
cout << "別に怖がらなくていいんですよ!" << endl;
cout << "自分が知っている範囲でも、C++教えましょうか?" << endl;
cout << "嫌なら早く押して下さい!" << endl;
cout << "早く!!!!!!!" << endl;
}
}
int souunnsei = goukei + kinun;
cout << "総合的な運勢の合計は、" << souunnsei << "です。" << endl;
}
int main(){
srand( (unsigned)time( NULL ) );
cout << "今からおみくじをします。" << endl;
cout << "運勢は、" << endl;
cout << "大吉<中吉<吉<小吉<半吉<末吉<末小吉<末凶<半凶<小凶<凶<大凶で、" << endl;
cout << "左の方が運勢がよく、右の方が悪いです。" << endl;
cout << "運勢が1番良い大吉は43分の1の確率で出ます。" << endl;
cout << "最後に、あなたの一週間まとめての運勢が出ます。" << endl;
cout << "まとめての運勢は、数字と文字で出ます。" << endl;
cout << "数字は高いほど運勢がよく、低いほど運勢が悪いです。" << endl;
cout << "ないと思いますが、全て大吉だったら、84点になります(www😆)" << endl;
cout << "こちらももいと思いますが、全て大凶だったら、7点になります。(www🤣)" << endl;
cout << "悪い運勢が出ても、責任は取れませんので、自己責任でお願いします。🙇" << endl;
cout << "それでは早速。おみくじを引いてみてください!" << endl;
cout << endl;
int num_players;
while (true) {
cout << "何人でおみくじを引きますか? (2人以上、5人まで推奨): ";
cin >> num_players;
// 数値以外の入力がされた場合の処理
if (cin.fail()) {
cout << "無効な入力です。数字を入力してください。" << endl;
cin.clear(); // エラーフラグをクリア
// 入力バッファに残っている不要な文字をすべて読み飛ばす
cin.ignore(numeric_limits<streamsize>::max(), '\n');
continue; // ループの最初に戻る
}
// 範囲外の入力チェック
if (num_players >= 2 && num_players <= 5) { // 2人から5人まで推奨
break; // 正しい入力なのでループを抜ける
} else {
cout << "申し訳ありませんが、2人以上5人まででお願いします。" << endl;
}
}
// cinで数値を読んだ後にgetlineを使うためのバッファクリア
cin.ignore(numeric_limits<streamsize>::max(), '\n');
vector<Omikuji> players; // Omikujiオブジェクトを複数しまっておく箱 (vector)
players.reserve(num_players); // 最初に必要な分のメモリを確保しておくと少し効率的
// 各プレイヤーのおみくじを引く
for (int p_idx = 0; p_idx < num_players; ++p_idx) {
Omikuji current_player_omikuji; // 新しいOmikujiオブジェクトを作成
string player_name_input;
cout << endl << "---------------------------------------" << endl;
cout << (p_idx + 1) << "人目の名前を入力して下さい: ";
getline(cin, player_name_input);
current_player_omikuji.set_player_name(player_name_input);
cout << current_player_omikuji.get_player_name() << "さんの1週間分の占いです。" << endl;
cout << "まずは総合運を占います。" << endl;
for(int i = 0; i < 7; ++i){
if (i == 0) {
cout << "今日:";
} else {
cout << "今日から" << i << "日後:" ;
}
current_player_omikuji.hiku();
}
cout << endl;
cout << "次に金運です。" << endl;
for(int w = 0; w < 7; ++w){
if (w == 0) {
cout << "今日:";
} else {
cout << "今日から" << w << "日後:";
}
current_player_omikuji.kanakana();
}
cout << endl;
current_player_omikuji.unnsei(); // 運勢の最終表示とsouunnsei計算
players.push_back(current_player_omikuji); // 完成したオブジェクトをvectorに追加
}
// 全員の総合運を比較する
cout << endl << "---------- 全員のおみくじ結果比較 ----------" << endl;
if (num_players > 1) { // 複数人いる場合のみ比較
int max_score = -1; // 最も高い点数を見つけるための変数
int min_score = 999; // 最も低い点数を見つけるための変数 (ありえない高い値で初期化)
string best_player_name = "";
string worst_player_name = "";
for (const auto& p : players) { // players の中身を一つずつ取り出して p と名付ける (const auto& は「変更しない」という意味)
cout << p.get_player_name() << "さんの合計点: " << p.get_total_score() << endl;
// 最も高い点数を更新
if (p.get_total_score() > max_score) {
max_score = p.get_total_score();
best_player_name = p.get_player_name();
}
// 最も低い点数を更新
if (p.get_total_score() < min_score) {
min_score = p.get_total_score();
worst_player_name = p.get_player_name();
}
}
cout << endl;
if (best_player_name == worst_player_name) {
cout << "全員の運勢の合計点は同じでした! (" << best_player_name << "さん: " << max_score << "点)" << endl;
} else {
cout << "最も運勢が良かったのは、" << best_player_name << "さんで、" << max_score << "点でした!おめでとう!" << endl;
cout << "最も運勢が低かったのは、" << worst_player_name << "さんで、" << min_score << "点でした!ドンマイ!" << endl;
}
} else {
cout << "一人だけなので比較はありません。" << endl;
}
cout << endl;
cout << "これでおみくじは終わりです。お疲れ様でした!" << endl;
return 0;
}